PageSourceSearch

https://kyn-care.com/src/lib/LanguageContext.tsx

js kyn-care.com collected 2026-10-08 11:36:25 UTC 20,648 bytes, 170 lines download raw bytes

1import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/src/lib/LanguageContext.tsx");import __vite__cjsImport0_react_jsxDevRuntime from "/@fs/home/runner/workspace/node_modules/.vite/deps/react_jsx-dev-runtime.js?v=9ce4103e"; const jsxDEV = __vite__cjsImport0_react_jsxDevRuntime["jsxDEV"];
2import RefreshRuntime from "/@react-refresh";
3const inWebWorker = typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope;
4let prevRefreshReg;
5let prevRefreshSig;
6if (import.meta.hot && !inWebWorker) {
7  if (!window.__vite_plugin_react_preamble_installed__) {
8    throw new Error("@vitejs/plugin-react can't detect preamble. Something is wrong. See https://github.com/vitejs/vite-plugin-react/pull/11#discussion_r430879201");
9  }
10  prevRefreshReg = window.$RefreshReg$;
11  prevRefreshSig = window.$RefreshSig$;
12  window.$RefreshReg$ = (type, id) => {
13    RefreshRuntime.register(type, "/home/runner/workspace/client/src/lib/LanguageContext.tsx " + id);
14  };
15  window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;
16}
17var _s = $RefreshSig$(), _s2 = $RefreshSig$();
18import __vite__cjsImport3_react from "/@fs/home/runner/workspace/node_modules/.vite/deps/react.js?v=9ce4103e"; const createContext = __vite__cjsImport3_react["createContext"]; const useState = __vite__cjsImport3_react["useState"]; const useContext = __vite__cjsImport3_react["useContext"]; const useEffect = __vite__cjsImport3_react["useEffect"];
19import { translations, getTranslation } from "/src/lib/translations.ts";
20const LanguageContext = createContext(void 0);
21export function LanguageProvider({ children }) {
22  _s();
23  const getInitialLanguage = () => {
24    if (typeof window !== "undefined") {
25      const params = new URLSearchParams(window.location.search);
26      const urlLang = params.get("lang");
27      if (urlLang && (urlLang === "en" || urlLang === "fr")) {
28        return urlLang;
29      }
30      const savedLanguage = localStorage.getItem("kyn-language");
31      if (savedLanguage && (savedLanguage === "en" || savedLanguage === "fr")) {
32        return savedLanguage;
33      }
34      const browserLang = navigator.language.toLowerCase();
35      const frenchLanguageCodes = [
36        "fr",
37        // French (generic)
38        "fr-fr",
39        // France
40        "fr-ca",
41        // Canada (Quebec)
42        "fr-be",
43        // Belgium
44        "fr-ch",
45        // Switzerland
46        "fr-lu",
47        // Luxembourg
48        "fr-mc",
49        // Monaco
50        "fr-sn",
51        // Senegal
52        "fr-ci",
53        // Côte d'Ivoire
54        "fr-ml",
55        // Mali
56        "fr-ma",
57        // Morocco
58        "fr-dz",
59        // Algeria
60        "fr-tn"
61        // Tunisia
62      ];
63      if (frenchLanguageCodes.some((code) => browserLang.startsWith(code))) {
64        return "fr";
65      }
66    }
67    return "en";
68  };
69  const [language, setLanguageState] = useState(getInitialLanguage);
70  const [selectedCountry, setSelectedCountryState] = useState(() => {
71    if (typeof window !== "undefined") {
72      return localStorage.getItem("kyn-country") || "US";
73    }
74    return "US";
75  });
76  const setSelectedCountry = (country) => {
77    setSelectedCountryState(country);
78    if (typeof window !== "undefined") {
79      localStorage.setItem("kyn-country", country);
80    }
81  };
82  const setLanguage = (lang) => {
83    const scrollPosition = typeof window !== "undefined" ? window.scrollY : 0;
84    setLanguageState(lang);
85    if (typeof window !== "undefined") {
86      localStorage.setItem("kyn-language", lang);
87      const url = new URL(window.location.href);
88      url.searchParams.set("lang", lang);
89      window.history.pushState({}, "", url);
90      document.documentElement.lang = lang;
91      const metaDescription = document.querySelector('meta[name="description"]');
92      if (metaDescription) {
93        metaDescription.setAttribute("content", translations[lang].metaDescription);
94      }
95      document.title = translations[lang].pageTitle;
96      requestAnimationFrame(() => {
97        window.scrollTo(0, scrollPosition);
98      });
99    }
100  };
101  const toggleLanguage = () => {
102    setLanguage(language === "en" ? "fr" : "en");
103  };
104  const t = (key) => {
105    return getTranslation(language, key);
106  };
107  useEffect(() => {
108    if (typeof window !== "undefined") {
109      document.documentElement.lang = language;
110      const metaDescription = document.querySelector('meta[name="description"]');
111      if (metaDescription) {
112        metaDescription.setAttribute("content", translations[language].metaDescription);
113      } else {
114        const meta = document.createElement("meta");
115        meta.name = "description";
116        meta.content = translations[language].metaDescription;
117        document.head.appendChild(meta);
118      }
119      const addHreflangLink = (lang) => {
120        const existingLink = document.querySelector(`link[hreflang="${lang}"]`);
121        if (!existingLink) {
122          const link = document.createElement("link");
123          link.rel = "alternate";
124          link.hreflang = lang;
125          const url = new URL(window.location.href);
126          url.searchParams.set("lang", lang);
127          link.href = url.toString();
128          document.head.appendChild(link);
129        }
130      };
131      addHreflangLink("en");
132      addHreflangLink("fr");
133      document.title = translations[language].pageTitle;
134    }
135  }, [language]);
136  return /* @__PURE__ */ jsxDEV(LanguageContext.Provider, { value: { language, setLanguage, t, toggleLanguage, selectedCountry, setSelectedCountry }, children }, void 0, false, {
137    fileName: "/home/runner/workspace/client/src/lib/LanguageContext.tsx",
138    lineNumber: 164,
139    columnNumber: 5
140  }, this);
141}
142_s(LanguageProvider, "CObipuuTvS/GH7z0KKyWJ0EaZI0=");
143_c = LanguageProvider;
144export function useLanguage() {
145  _s2();
146  const context = useContext(LanguageContext);
147  if (context === void 0) {
148    throw new Error("useLanguage must be used within a LanguageProvider");
149  }
150  return context;
151}
152_s2(useLanguage, "b9L3QQ+jgeyIrH0NfHrJ8nn7VMU=");
153var _c;
154$RefreshReg$(_c, "LanguageProvider");
155if (import.meta.hot && !inWebWorker) {
156  window.$RefreshReg$ = prevRefreshReg;
157  window.$RefreshSig$ = prevRefreshSig;
158}
159if (import.meta.hot && !inWebWorker) {
160  RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => {
161    RefreshRuntime.registerExportsForReactRefresh("/home/runner/workspace/client/src/lib/LanguageContext.tsx", currentExports);
162    import.meta.hot.accept((nextExports) => {
163      if (!nextExports) return;
164      const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate("/home/runner/workspace/client/src/lib/LanguageContext.tsx", currentExports, nextExports);
165      if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage);
166    });
167  });
168}
169
170//# sourceMappingURL=data:application/json;base64,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ZQURIO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FFQTtBQUVKO0FBQUNDLEdBekplRixrQkFBZ0I7QUFBQStELEtBQWhCL0Q7QUEySlQsZ0JBQVNnRSxjQUFtQztBQUFBQyxNQUFBO0FBQ2pELFFBQU1DLFVBQVVDLFdBQVdyRSxlQUFlO0FBQzFDLE1BQUlvRSxZQUFZbkUsUUFBVztBQUN6QixVQUFNLElBQUlxRSxNQUFNLG9EQUFvRDtBQUFBLEVBQ3RFO0FBQ0EsU0FBT0Y7QUFDVDtBQUFDRCxJQU5lRCxhQUFXO0FBQUEsSUFBQUQ7QUFBQU0sYUFBQU4sSUFBQSIsIm5hbWVzIjpbImNyZWF0ZUNvbnRleHQiLCJ1c2VTdGF0ZSIsInVzZUVmZmVjdCIsIlJlYWN0Tm9kZSIsInRyYW5zbGF0aW9ucyIsImdldFRyYW5zbGF0aW9uIiwiTGFuZ3VhZ2VDb250ZXh0IiwidW5kZWZpbmVkIiwiTGFuZ3VhZ2VQcm92aWRlciIsImNoaWxkcmVuIiwiX3MiLCJnZXRJbml0aWFsTGFuZ3VhZ2UiLCJ3aW5kb3ciLCJwYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJsb2NhdGlvbiIsInNlYXJjaCIsInVybExhbmciLCJnZXQiLCJzYXZlZExhbmd1YWdlIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsImJyb3dzZXJMYW5nIiwibmF2aWdhdG9yIiwibGFuZ3VhZ2UiLCJ0b0xvd2VyQ2FzZSIsImZyZW5jaExhbmd1YWdlQ29kZXMiLCJzb21lIiwiY29kZSIsInN0YXJ0c1dpdGgiLCJzZXRMYW5ndWFnZVN0YXRlIiwic2VsZWN0ZWRDb3VudHJ5Iiwic2V0U2VsZWN0ZWRDb3VudHJ5U3RhdGUiLCJzZXRTZWxlY3RlZENvdW50cnkiLCJjb3VudHJ5Iiwic2V0SXRlbSIsInNldExhbmd1YWdlIiwibGFuZyIsInNjcm9sbFBvc2l0aW9uIiwic2Nyb2xsWSIsInVybCIsIlVSTCIsImhyZWYiLCJzZWFyY2hQYXJhbXMiLCJzZXQiLCJoaXN0b3J5IiwicHVzaFN0YXRlIiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJtZXRhRGVzY3JpcHRpb24iLCJxdWVyeVNlbGVjdG9yIiwic2V0QXR0cmlidXRlIiwidGl0bGUiLCJwYWdlVGl0bGUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJzY3JvbGxUbyIsInRvZ2dsZUxhbmd1YWdlIiwidCIsImtleSIsIm1ldGEiLCJjcmVhdGVFbGVtZW50IiwibmFtZSIsImNvbnRlbnQiLCJoZWFkIiwiYXBwZW5kQ2hpbGQiLCJhZGRIcmVmbGFuZ0xpbmsiLCJleGlzdGluZ0xpbmsiLCJsaW5rIiwicmVsIiwiaHJlZmxhbmciLCJ0b1N0cmluZyIsIl9jIiwidXNlTGFuZ3VhZ2UiLCJfczIiLCJjb250ZXh0IiwidXNlQ29udGV4dCIsIkVycm9yIiwiJFJlZnJlc2hSZWckIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIkxhbmd1YWdlQ29udGV4dC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlU3RhdGUsIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTGFuZ3VhZ2UsIHRyYW5zbGF0aW9ucywgZ2V0VHJhbnNsYXRpb24sIFRyYW5zbGF0aW9uS2V5IH0gZnJvbSAnLi90cmFuc2xhdGlvbnMnO1xuXG50eXBlIExhbmd1YWdlQ29udGV4dFR5cGUgPSB7XG4gIGxhbmd1YWdlOiBMYW5ndWFnZTtcbiAgc2V0TGFuZ3VhZ2U6IChsYW5nOiBMYW5ndWFnZSkgPT4gdm9pZDtcbiAgdDogKGtleTogVHJhbnNsYXRpb25LZXkpID0+IHN0cmluZztcbiAgdG9nZ2xlTGFuZ3VhZ2U6ICgpID0+IHZvaWQ7XG4gIHNlbGVjdGVkQ291bnRyeTogc3RyaW5nO1xuICBzZXRTZWxlY3RlZENvdW50cnk6IChjb3VudHJ5OiBzdHJpbmcpID0+IHZvaWQ7XG59O1xuXG5jb25zdCBMYW5ndWFnZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PExhbmd1YWdlQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBMYW5ndWFnZVByb3ZpZGVyKHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3ROb2RlIH0pIHtcbiAgLy8gVHJ5IHRvIGdldCBsYW5ndWFnZSBmcm9tIFVSTCBwYXJhbXMsIGxvY2FsU3RvcmFnZSwgb3IgYnJvd3NlciBsYW5ndWFnZS9sb2NhdGlvbiwgZGVmYXVsdCB0byAnZW4nXG4gIGNvbnN0IGdldEluaXRpYWxMYW5ndWFnZSA9ICgpOiBMYW5ndWFnZSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyAxLiBGaXJzdCBjaGVjayBVUkwgcGFyYW1ldGVyIChleHBsaWNpdCB1c2VyIGNob2ljZSlcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICBjb25zdCB1cmxMYW5nI
170D0gcGFyYW1zLmdldCgnbGFuZycpIGFzIExhbmd1YWdlO1xuICAgICAgaWYgKHVybExhbmcgJiYgKHVybExhbmcgPT09ICdlbicgfHwgdXJsTGFuZyA9PT0gJ2ZyJykpIHtcbiAgICAgICAgcmV0dXJuIHVybExhbmc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIDIuIFRoZW4gY2hlY2sgbG9jYWxTdG9yYWdlIChwcmV2aW91cyB1c2VyIHByZWZlcmVuY2UpXG4gICAgICBjb25zdCBzYXZlZExhbmd1YWdlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2t5bi1sYW5ndWFnZScpIGFzIExhbmd1YWdlO1xuICAgICAgaWYgKHNhdmVkTGFuZ3VhZ2UgJiYgKHNhdmVkTGFuZ3VhZ2UgPT09ICdlbicgfHwgc2F2ZWRMYW5ndWFnZSA9PT0gJ2ZyJykpIHtcbiAgICAgICAgcmV0dXJuIHNhdmVkTGFuZ3VhZ2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIDMuIENoZWNrIGJyb3dzZXIgbGFuZ3VhZ2UgZm9yIEZyZW5jaC1zcGVha2luZyBjb3VudHJpZXMvcmVnaW9uc1xuICAgICAgY29uc3QgYnJvd3NlckxhbmcgPSBuYXZpZ2F0b3IubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKTtcbiAgICAgIFxuICAgICAgLy8gRnJlbmNoLXNwZWFraW5nIHJlZ2lvbnNcbiAgICAgIGNvbnN0IGZyZW5jaExhbmd1YWdlQ29kZXMgPSBbXG4gICAgICAgICdmcicsICAgICAgLy8gRnJlbmNoIChnZW5lcmljKVxuICAgICAgICAnZnItZnInLCAgIC8vIEZyYW5jZVxuICAgICAgICAnZnItY2EnLCAgIC8vIENhbmFkYSAoUXVlYmVjKVxuICAgICAgICAnZnItYmUnLCAgIC8vIEJlbGdpdW1cbiAgICAgICAgJ2ZyLWNoJywgICAvLyBTd2l0emVybGFuZFxuICAgICAgICAnZnItbHUnLCAgIC8vIEx1eGVtYm91cmdcbiAgICAgICAgJ2ZyLW1jJywgICAvLyBNb25hY29cbiAgICAgICAgJ2ZyLXNuJywgICAvLyBTZW5lZ2FsXG4gICAgICAgICdmci1jaScsICAgLy8gQ8O0dGUgZCdJdm9pcmVcbiAgICAgICAgJ2ZyLW1sJywgICAvLyBNYWxpXG4gICAgICAgICdmci1tYScsICAgLy8gTW9yb2Njb1xuICAgICAgICAnZnItZHonLCAgIC8vIEFsZ2VyaWFcbiAgICAgICAgJ2ZyLXRuJywgICAvLyBUdW5pc2lhXG4gICAgICBdO1xuICAgICAgXG4gICAgICBpZiAoZnJlbmNoTGFuZ3VhZ2VDb2Rlcy5zb21lKGNvZGUgPT4gYnJvd3Nlckxhbmcuc3RhcnRzV2l0aChjb2RlKSkpIHtcbiAgICAgICAgcmV0dXJuICdmcic7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnZW4nO1xuICB9O1xuXG4gIGNvbnN0IFtsYW5ndWFnZSwgc2V0TGFuZ3VhZ2VTdGF0ZV0gPSB1c2VTdGF0ZTxMYW5ndWFnZT4oZ2V0SW5pdGlhbExhbmd1YWdlKTtcbiAgY29uc3QgW3NlbGVjdGVkQ291bnRyeSwgc2V0U2VsZWN0ZWRDb3VudHJ5U3RhdGVdID0gdXNlU3RhdGU8c3RyaW5nPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2t5bi1jb3VudHJ5JykgfHwgJ1VTJztcbiAgICB9XG4gICAgcmV0dXJuICdVUyc7XG4gIH0pO1xuXG4gIC8vIFVwZGF0ZSBjb3VudHJ5IHNlbGVjdGlvblxuICBjb25zdCBzZXRTZWxlY3RlZENvdW50cnkgPSAoY291bnRyeTogc3RyaW5nKSA9PiB7XG4gICAgc2V0U2VsZWN0ZWRDb3VudHJ5U3RhdGUoY291bnRyeSk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgna3luLWNvdW50cnknLCBjb3VudHJ5KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gVXBkYXRlIGxhbmd1YWdlIHdpdGggYWxsIG5lY2Vzc2FyeSBzaWRlIGVmZmVjdHNcbiAgY29uc3Qgc2V0TGFuZ3VhZ2UgPSAobGFuZzogTGFuZ3VhZ2UpID0+IHtcbiAgICAvLyBDYXB0dXJlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIGJlZm9yZSBsYW5ndWFnZSBjaGFuZ2VcbiAgICBjb25zdCBzY3JvbGxQb3NpdGlvbiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LnNjcm9sbFkgOiAwO1xuICAgIFxuICAgIHNldExhbmd1YWdlU3RhdGUobGFuZyk7XG4gICAgXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyAxLiBTYXZlIHRvIGxvY2FsU3RvcmFnZVxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2t5bi1sYW5ndWFnZScsIGxhbmcpO1xuICAgICAgXG4gICAgICAvLyAyLiBVcGRhdGUgVVJMIHBhcmFtZXRlciB3aXRob3V0IHJlbG9hZGluZyBwYWdlXG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdsYW5nJywgbGFuZyk7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoe30sICcnLCB1cmwpO1xuICAgICAgXG4gICAgICAvLyAzLiBVcGRhdGUgaHRtbCBsYW5nIGF0dHJpYnV0ZVxuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmxhbmcgPSBsYW5nO1xuICAgICAgXG4gICAgICAvLyA0LiBVcGRhdGUgbWV0YSB0YWdzXG4gICAgICBjb25zdCBtZXRhRGVzY3JpcHRpb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJkZXNjcmlwdGlvblwiXScpO1xuICAgICAgaWYgKG1ldGFEZXNjcmlwdGlvbikge1xuICAgICAgICBtZXRhRGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCdjb250ZW50JywgdHJhbnNsYXRpb25zW2xhbmddLm1ldGFEZXNjcmlwdGlvbik7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIDUuIFVwZGF0ZSBkb2N1bWVudCB0aXRsZVxuICAgICAgZG9jdW1lbnQudGl0bGUgPSB0cmFuc2xhdGlvbnNbbGFuZ10ucGFnZVRpdGxlO1xuICAgICAgXG4gICAgICAvLyA2LiBSZXN0b3JlIHNjcm9sbCBwb3NpdGlvbiBhZnRlciBSZWFjdCByZS1yZW5kZXJzXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgc2Nyb2xsUG9zaXRpb24pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIFRvZ2dsZSBiZXR3ZWVuIEVuZ2xpc2ggYW5kIEZyZW5jaFxuICBjb25zdCB0b2dnbGVMYW5ndWFnZSA9ICgpID0+IHtcbiAgICBzZXRMYW5ndWFnZShsYW5ndWFnZSA9PT0gJ2VuJyA/ICdmcicgOiAnZW4nKTtcbiAgfTtcblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRyYW5zbGF0aW9uXG4gIGNvbnN0IHQgPSAoa2V5OiBUcmFuc2xhdGlvbktleSk6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIGdldFRyYW5zbGF0aW9uKGxhbmd1YWdlLCBrZXkpO1xuICB9O1xuXG4gIC8vIFNldCBpbml0aWFsIEhUTUwgbGFuZyBhdHRyaWJ1dGUgYW5kIG1ldGEgaW5mb3JtYXRpb25cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFNldCBIVE1MIGxhbmcgYXR0cmlidXRlXG4gICAgICBkb2
170N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZyA9IGxhbmd1YWdlO1xuICAgICAgXG4gICAgICAvLyBVcGRhdGUgbWV0YSBkZXNjcmlwdGlvblxuICAgICAgY29uc3QgbWV0YURlc2NyaXB0aW9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiZGVzY3JpcHRpb25cIl0nKTtcbiAgICAgIGlmIChtZXRhRGVzY3JpcHRpb24pIHtcbiAgICAgICAgbWV0YURlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgnY29udGVudCcsIHRyYW5zbGF0aW9uc1tsYW5ndWFnZV0ubWV0YURlc2NyaXB0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENyZWF0ZSBtZXRhIGRlc2NyaXB0aW9uIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgY29uc3QgbWV0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21ldGEnKTtcbiAgICAgICAgbWV0YS5uYW1lID0gJ2Rlc2NyaXB0aW9uJztcbiAgICAgICAgbWV0YS5jb250ZW50ID0gdHJhbnNsYXRpb25zW2xhbmd1YWdlXS5tZXRhRGVzY3JpcHRpb247XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobWV0YSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEFkZCBocmVmbGFuZyBsaW5rcyBmb3IgU0VPXG4gICAgICBjb25zdCBhZGRIcmVmbGFuZ0xpbmsgPSAobGFuZzogTGFuZ3VhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdMaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgbGlua1tocmVmbGFuZz1cIiR7bGFuZ31cIl1gKTtcbiAgICAgICAgaWYgKCFleGlzdGluZ0xpbmspIHtcbiAgICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgIGxpbmsucmVsID0gJ2FsdGVybmF0ZSc7XG4gICAgICAgICAgbGluay5ocmVmbGFuZyA9IGxhbmc7XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2xhbmcnLCBsYW5nKTtcbiAgICAgICAgICBsaW5rLmhyZWYgPSB1cmwudG9TdHJpbmcoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBkb2
170N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBBZGQgbGlua3MgZm9yIGJvdGggbGFuZ3VhZ2VzXG4gICAgICBhZGRIcmVmbGFuZ0xpbmsoJ2VuJyk7XG4gICAgICBhZGRIcmVmbGFuZ0xpbmsoJ2ZyJyk7XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBkb2N1bWVudCB0aXRsZVxuICAgICAgZG9jdW1lbnQudGl0bGUgPSB0cmFuc2xhdGlvbnNbbGFuZ3VhZ2VdLnBhZ2VUaXRsZTtcbiAgICB9XG4gIH0sIFtsYW5ndWFnZV0pO1xuXG4gIHJldHVybiAoXG4gICAgPExhbmd1YWdlQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17eyBsYW5ndWFnZSwgc2V0TGFuZ3VhZ2UsIHQsIHRvZ2dsZUxhbmd1YWdlLCBzZWxlY3RlZENvdW50cnksIHNldFNlbGVjdGVkQ291bnRyeSB9fT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0xhbmd1YWdlQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUxhbmd1YWdlKCk6IExhbmd1YWdlQ29udGV4dFR5cGUge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChMYW5ndWFnZUNvbnRleHQpO1xuICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VMYW5ndWFnZSBtdXN0IGJlIHVzZWQgd2l0aGluIGEgTGFuZ3VhZ2VQcm92aWRlcicpO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufSJdLCJmaWxlIjoiL2hvbWUvcnVubmVyL3dvcmtzcGFjZS9jbGllbnQvc3JjL2xpYi9MYW5ndWFnZUNvbnRleHQudHN4In0=

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.