PageSourceSearch

https://kyn-care.com/src/components/WaitlistPopup.tsx

js kyn-care.com collected 2026-10-08 11:36:24 UTC 52,784 bytes, 505 lines download raw bytes

1import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/src/components/WaitlistPopup.tsx");import __vite__cjsImport0_react_jsxDevRuntime from "/@fs/home/runner/workspace/node_modules/.vite/deps/react_jsx-dev-runtime.js?v=9ce4103e"; const Fragment = __vite__cjsImport0_react_jsxDevRuntime["Fragment"]; 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/components/WaitlistPopup.tsx " + id);
14  };
15  window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;
16}
17var _s = $RefreshSig$();
18import __vite__cjsImport3_react from "/@fs/home/runner/workspace/node_modules/.vite/deps/react.js?v=9ce4103e"; const useState = __vite__cjsImport3_react["useState"]; const useEffect = __vite__cjsImport3_react["useEffect"];
19import { X } from "/@fs/home/runner/workspace/node_modules/.vite/deps/lucide-react.js?v=9ce4103e";
20import { useLocation } from "/@fs/home/runner/workspace/node_modules/.vite/deps/wouter.js?v=9ce4103e";
21import { useLanguage } from "/src/lib/LanguageContext.tsx";
22import { useToast } from "/src/hooks/use-toast.ts";
23import { apiRequest } from "/src/lib/queryClient.ts";
24import { trackWaitlistSignup } from "/src/lib/analytics.ts";
25import { useModalLock } from "/src/hooks/useModalLock.ts";
26import popupImage from "/@fs/home/runner/workspace/attached_assets/kyn-popup-coming-soon.png?import";
27export function WaitlistPopup() {
28  _s();
29  const [isVisible, setIsVisible] = useState(false);
30  useModalLock(isVisible);
31  const [isClosing, setIsClosing] = useState(false);
32  const [isSubmitting, setIsSubmitting] = useState(false);
33  const [formData, setFormData] = useState({ firstName: "", email: "" });
34  const { language } = useLanguage();
35  const { toast } = useToast();
36  const [location] = useLocation();
37  useEffect(() => {
38    if (location === "/playbook" || location === "/skincare-guide") return;
39    const hasSignedUp = sessionStorage.getItem("kyn-waitlist-signed-up");
40    if (hasSignedUp) return;
41    const hasClosedPopup = sessionStorage.getItem("kyn-waitlist-popup-closed");
42    if (hasClosedPopup) return;
43    const handleScroll = () => {
44      if (sessionStorage.getItem("kyn-waitlist-popup-closed")) return;
45      const cookieConsent = localStorage.getItem("kyn_cookie_consent");
46      if (!cookieConsent) return;
47      const subscribeSection = document.getElementById("subscribe-section");
48      if (subscribeSection) {
49        const rect = subscribeSection.getBoundingClientRect();
50        const isNearSubscribeSection = rect.top < window.innerHeight && rect.bottom > 0;
51        if (isNearSubscribeSection) {
52          if (isVisible) {
53            setIsClosing(true);
54            setTimeout(() => {
55              setIsVisible(false);
56              setIsClosing(false);
57            }, 300);
58          }
59          return;
60        }
61      }
62      const scrollPercent = window.scrollY / (document.documentElement.scrollHeight - window.innerHeight) * 100;
63      if (scrollPercent >= 50 && !isVisible) {
64        setIsVisible(true);
65      }
66    };
67    window.addEventListener("scroll", handleScroll);
68    return () => window.removeEventListener("scroll", handleScroll);
69  }, [isVisible]);
70  const handleClose = () => {
71    sessionStorage.setItem("kyn-waitlist-popup-closed", "true");
72    setIsClosing(true);
73    setTimeout(() => {
74      setIsVisible(false);
75      setIsClosing(false);
76    }, 300);
77  };
78  useEffect(() => {
79    if (!isVisible) return;
80    const handleEsc = (e) => {
81      if (e.key === "Escape") {
82        handleClose();
83      }
84    };
85    window.addEventListener("keydown", handleEsc);
86    return () => window.removeEventListener("keydown", handleEsc);
87  }, [isVisible]);
88  const handleInputChange = (e) => {
89    setFormData((prev) => ({
90      ...prev,
91      [e.target.name]: e.target.value
92    }));
93  };
94  const handleSubmit = async (e) => {
95    e.preventDefault();
96    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
97    if (!formData.email || !emailRegex.test(formData.email)) {
98      toast({
99        title: language === "fr" ? "Erreur" : "Error",
100        description: language === "fr" ? "Veuillez entrer une adresse email valide." : "Please enter a valid email address.",
101        variant: "destructive"
102      });
103      return;
104    }
105    setIsSubmitting(true);
106    try {
107      await apiRequest("/api/waitlist", {
108        method: "POST",
109        data: {
110          firstName: formData.firstName,
111          email: formData.email,
112          source: "popup",
113          language
114        }
115      });
116      trackWaitlistSignup("popup");
117      sessionStorage.setItem("kyn-waitlist-signed-up", "true");
118      localStorage.setItem("kyn-playbook-access", "true");
119      localStorage.setItem("kyn-user-name", formData.firstName);
120      toast({
121        title: language === "fr" ? "Vous êtes sur la liste ! ;)" : "You're on the list! ;)",
122        description: language === "fr" ? "Le KYN Skincare Playbook est dans votre boîte mail. Bienvenue chez KYN !" : "The KYN Skincare Playbook is in your inbox. Welcome to KYN!"
123      });
124      setFormData({ firstName: "", email: "" });
125      setIsClosing(true);
126      setTimeout(() => {
127        setIsVisible(false);
128        setIsClosing(false);
129      }, 300);
130    } catch (error) {
131      if (error.message?.includes("already")) {
132        toast({
133          title: language === "fr" ? "Déjà avec nous" : "Already with us",
134          description: language === "fr" ? "Cet email fait déjà partie de notre c
134ommunauté." : "This email is already part of our community.",
135          variant: "elegant"
136        });
137      } else {
138        toast({
139          title: language === "fr" ? "Erreur" : "Error",
140          description: language === "fr" ? "Une erreur est survenue." : "Something went wrong.",
141          variant: "elegant"
142        });
143      }
144    } finally {
145      setIsSubmitting(false);
146    }
147  };
148  if (!isVisible) return null;
149  const t = {
150    heading: language === "fr" ? "REJOIGNEZ LA LISTE" : "JOIN THE WAITLIST",
151    description: language === "fr" ? "Soyez parmi les premiers à découvrir nos formulations et recevez notre <strong>Guide Skincare</strong> exclusif." : "Be among the first to discover our formulations and receive our exclusive <strong>Skincare Playbook</strong>.",
152    joinCount: language === "fr" ? "200+ DÉJÀ SUR LA LISTE" : "200+ ALREADY ON THE LIST",
153    firstName: language === "fr" ? "Prénom" : "First name",
154    email: language === "fr" ? "Email" : "Email",
155    button: language === "fr" ? "REJOINDRE LA LISTE" : "JOIN THE WAITLIST"
156  };
157  return /* @__PURE__ */ jsxDEV(Fragment, { children: [
158    /* @__PURE__ */ jsxDEV("style", { children: `
159        @keyframes popupFadeIn {
160          from { opacity: 0; }
161          to { opacity: 1; }
162        }
163        @keyframes popupSlideUp {
164          from { opacity: 0; transform: translateY(20px) scale(0.95); }
165          to { opacity: 1; transform: translateY(0) scale(1); }
166        }
167        @keyframes popupFadeOut {
168          from { opacity: 1; }
169          to { opacity: 0; }
170        }
171        @keyframes popupSlideDown {
172          from { opacity: 1; transform: translateY(0) scale(1); }
173          to { opacity: 0; transform: translateY(20px) scale(0.95); }
174        }
175        .popup-backdrop { animation: popupFadeIn 0.3s ease-out forwards; }
176        .popup-backdrop.closing { animation: popupFadeOut 0.3s ease-in forwards; }
177        .popup-card { animation: popupSlideUp 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards; }
178        .popup-card.closing { animation: popupSlideDown 0.3s ease-in forwards; }
179      ` }, void 0, false, {
180      fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
181      lineNumber: 181,
182      columnNumber: 7
183    }, this),
184    /* @__PURE__ */ jsxDEV(
185      "div",
186      {
187        className: `fixed inset-0 z-[200] flex items-center justify-center p-4 popup-backdrop ${isClosing ? "closing" : ""}`,
188        style: {
189          backgroundColor: "rgba(0, 0, 0, 0.6)",
190          backdropFilter: "blur(4px)",
191          WebkitBackdropFilter: "blur(4px)"
192        },
193        onClick: handleClose,
194        "data-testid": "popup-backdrop",
195        "data-modal-container": true,
196        children: /* @__PURE__ */ jsxDEV(
197          "div",
198          {
199            className: `relative z-[201] popup-card ${isClosing ? "closing" : ""}`,
200            style: {
201              width: "min(92vw, 680px)",
202              maxHeight: "min(90vh, 100%)"
203            },
204            onClick: (e) => e.stopPropagation(),
205            "data-testid": "popup-waitlist-card",
206            children: /* @__PURE__ */ jsxDEV(
207              "div",
208              {
209                className: "bg-white overflow-hidden flex flex-col md:flex-row max-h-[inherit] relative",
210                style: { boxShadow: "0 25px 50px -12px rgba(0, 0, 0, 0.25)" },
211                children: [
212                  /* @__PURE__ */ jsxDEV(
213                    "button",
214                    {
215                      type: "button",
216                      onClick: (e) => {
217                        e.preventDefault();
218                        e.stopPropagation();
219                        handleClose();
220                      },
221                      onTouchEnd: (e) => {
222                        e.preventDefault();
223                        e.stopPropagation();
224                        handleClose();
225                      },
226                      className: "absolute top-3 right-3 md:top-4 md:right-4 w-10 h-10 flex items-center justify-center rounded-full transition-all duration-200 hover:bg-gray-100 focus:outline-none",
227                      style: {
228                        zIndex: 99999,
229                        backgroundColor: "rgba(255,255,255,0.9)",
230                        pointerEvents: "auto",
231                        touchAction: "manipulation"
232                      },
233                      "aria-label": "Close popup",
234                      "data-testid": "button-close-popup",
235                      children: /* @__PURE__ */ jsxDEV(X, { size: 18, strokeWidth: 2, color: "#333333" }, void 0, false, {
236                        fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
237                        lineNumber: 253,
238                        columnNumber: 15
239                      }, this)
240                    },
241                    void 0,
242                    false,
243                    {
244                      fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
245                      lineNumber: 231,
246                      columnNumber: 13
247                    },
248                    this
249                  ),
250                  /* @__PURE__ */ jsxDEV(
251                    "div",
252                    {
253                      className: "hidden md:block md:w-2/5 relative overflow-hidden",
254                      style: { minHeight: "420px" },
255                      children: /* @__PURE__ */ jsxDEV(
256                        "img",
257                        {
258                          src: popupImage,
259                          alt: "KYN Skincare - African botanical beauty coming soon",
260                          loading: "lazy",
261                          decoding: "async",
262                          className: "absolute inset-0 w-full h-full object-cover",
263                          style: { objectPosition: "center center" }
264                        },
265                        void 0,
266                        false,
267                        {
268                          fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
269                          lineNumber: 261,
270                          columnNumber: 13
271                        },
272                        this
273                      )
274                    },
275                    void 0,
276                    false,
277                    {
278                      fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
279                      lineNumber: 257,
280                      columnNumber: 11
281                    },
282                    this
283                  ),
284                  /* @__PURE__ */ jsxDEV("div", { className: "flex-1 p-6 md:p-10 relative overflow-y-auto", "data-modal-scrollable": true, children: /* @__PURE__ */ jsxDEV("div", { className: "pt-6 md:pt-2 text-center", children: [
285                    /* @__PURE__ */ jsxDEV(
286                      "h3",
287                      {
288                        className: "text-[16px] md:text-[18px] uppercase tracking-[1.5px] mb-3",
289                        style: {
290                          color: "#1A1A1A",
291                          fontFamily: "Helvetica, Arial, sans-serif",
292                          fontWeight: 500,
293                          lineHeight: 1.3
294                        },
295                        children: t.heading
296                      },
297                      void 0,
298                      false,
299                      {
300                        fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
301                        lineNumber: 277,
302                        columnNumber: 15
303                      },
304                      this
305                    ),
306                    /* @__PURE__ */ jsxDEV(
307                      "p",
308                      {
309                        className: "text-[10px] uppercase tracking-[2px] mb-4",
310                        style: {
311                          color: "#888888",
312                          fontFamily: "Helvetica, Arial, sans-serif",
313                          fontWeight: 400
314                        },
315                        children: t.joinCount
316                      },
317                      void 0,
318                      false,
319                      {
320                        fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
321                        lineNumber: 290,
322                        columnNumber: 15
323                      },
324                      this
325                    ),
326                    /* @__PURE__ */ jsxDEV(
327                      "p",
328                      {
329                        className: "text-[13px] mb-6",
330                        style: {
331                          color: "#666666",
332                          fontFamily: "Helvetica, Arial, sans-serif",
333                          fontWeight: 300,
334                          lineHeight: 1.7
335                        },
336                        dangerouslySetInnerHTML: { __html: t.description }
337                      },
338                      void 0,
339                      false,
340                      {
341                        fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
342                        lineNumber: 302,
343                        columnNumber: 15
344                      },
345                      this
346                    ),
347                    /* @__PURE__ */ jsxDEV("form", { onSubmit: handleSubmit, className: "space-y-3", children: [
348                      /* @__PURE__ */ jsxDEV(
349                        "input",
350                        {
351                          type: "text",
352                          name: "firstName",
353                          value: formData.firstName,
354                          onChange: handleInputChange,
355                          placeholder: t.firstName,
356                          className: "w-full px-4 py-3 border transition-colors focus:outline-none focus:border-[#1A1A1A]",
357                          style: {
358                            fontFamily: "Helvetica, Arial, sans-serif",
359                            fontSize: "13px",
360                            fontWeight: 300,
361                            borderColor: "#E0E0E0",
362                            backgroundColor: "#FAFAFA",
363                            borderRadius: 0
364                          },
365                          "data-testid": "popup-input-first-name"
366                        },
367                        void 0,
368                        false,
369                        {
370                          fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
371                          lineNumber: 315,
372                          columnNumber: 17
373                        },
374                        this
375                      ),
376                      /* @__PURE__ */ jsxDEV(
377                        "input",
378                        {
379                          type: "email",
380                          name: "email",
381                          value: formData.email,
382                          onChange: handleInputChange,
383                          placeholder: `${t.email}*`,
384                          required: true,
385                          className: "w-full px-4 py-3 border transition-colors focus:outline-none focus:border-[#1A1A1A]",
386                          style: {
387                            fontFamily: "Helvetica, Arial, sans-serif",
388                            fontSize: "13px",
389                            fontWeight: 300,
390                            borderColor: "#E0E0E0",
391                            backgroundColor: "#FAFAFA",
392                            borderRadius: 0
393                          },
394                          "data-testid": "popup-input-email"
395                        },
396                        void 0,
397                        false,
398                        {
399                          fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
400                          lineNumber: 332,
401                          columnNumber: 17
402                        },
403                        this
404                      ),
405                      /* @__PURE__ */ jsxDEV(
406                        "button",
407                        {
408                          type: "submit",
409                          disabled: isSubmitting,
410                          className: "w-full py-3.5 uppercase transition-all duration-300 hover:bg-transparent hover:text-[#1A1A1A] disabled:opacity-50",
411                          style: {
412                            backgroundColor: "#1A1A1A",
413                            color: "#FFFFFF",
414                            fontFamily: "Helvetica, Arial, sans-serif",
415                            fontWeight: 400,
416                            letterSpacing: "2px",
417                            border: "1px solid #1A1A1A",
418                            fontSize: "11px",
419                            borderRadius: 0
420                          },
421                          "data-testid": "button-popup-submit",
422                          children: isSubmitting ? "..." : t.button
423                        },
424                        void 0,
425                        false,
426                        {
427                          fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
428                          lineNumber: 350,
429                          columnNumber: 17
430                        },
431                        this
432                      )
433                    ] }, void 0, true, {
434                      fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
435                      lineNumber: 314,
436                      columnNumber: 15
437                    }, this)
438                  ] }, void 0, true, {
439                    fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
440                    lineNumber: 275,
441                    columnNumber: 13
442                  }, this) }, void 0, false, {
443                    fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
444                    lineNumber: 272,
445                    columnNumber: 11
446                  }, this)
447                ]
448              },
449              void 0,
450              true,
451              {
452                fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
453                lineNumber: 226,
454                columnNumber: 11
455              },
456              this
457            )
458          },
459          void 0,
460          false,
461          {
462            fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
463            lineNumber: 217,
464            columnNumber: 9
465          },
466          this
467        )
468      },
469      void 0,
470      false,
471      {
472        fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
473        lineNumber: 205,
474        columnNumber: 7
475      },
476      this
477    )
478  ] }, void 0, true, {
479    fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx",
480    lineNumber: 180,
481    columnNumber: 5
482  }, this);
483}
484_s(WaitlistPopup, "w5LZo/WIFeZ1yh3WQsoI0ye7/EY=", false, function() {
485  return [useModalLock, useLanguage, useToast, useLocation];
486});
487_c = WaitlistPopup;
488var _c;
489$RefreshReg$(_c, "WaitlistPopup");
490if (import.meta.hot && !inWebWorker) {
491  window.$RefreshReg$ = prevRefreshReg;
492  window.$RefreshSig$ = prevRefreshSig;
493}
494if (import.meta.hot && !inWebWorker) {
495  RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => {
496    RefreshRuntime.registerExportsForReactRefresh("/home/runner/workspace/client/src/components/WaitlistPopup.tsx", currentExports);
497    import.meta.hot.accept((nextExports) => {
498      if (!nextExports) return;
499      const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate("/home/runner/workspace/client/src/components/WaitlistPopup.tsx", currentExports, nextExports);
500      if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage);
501    });
502  });
503}
504
505//# sourceMappingURL=data:application/json;base64,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WN0IiwiWCIsInVzZUxvY2F0aW9uIiwidXNlTGFuZ3VhZ2UiLCJ1c2VUb2FzdCIsImFwaVJlcXVlc3QiLCJ0cmFja1dhaXRsaXN0U2lnbnVwIiwidXNlTW9kYWxMb2NrIiwicG9wdXBJbWFnZSIsIldhaXRsaXN0UG9wdXAiLCJfcyIsImlzVmlzaWJsZSIsInNldElzVmlzaWJsZSIsInVzZVN0YXRlIiwiaXNDbG9zaW5nIiwic2V0SXNDbG9zaW5nIiwiaXNTdWJtaXR0aW5nIiwic2V0SXNTdWJtaXR0aW5nIiwiZm9ybURhdGEiLCJzZXRGb3JtRGF0YSIsImZpcnN0TmFtZSIsImVtYWlsIiwibGFuZ3VhZ2UiLCJ0b2FzdCIsImxvY2F0aW9uIiwiaGFzU2lnbmVkVXAiLCJzZXNzaW9uU3RvcmFnZSIsImdldEl0ZW0iLCJoYXNDbG9zZWRQb3B1cCIsImhhbmRsZVNjcm9sbCIsImNvb2tpZUNvbnNlbnQiLCJsb2NhbFN0b3JhZ2UiLCJzdWJzY3JpYmVTZWN0aW9uIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJpc05lYXJTdWJzY3JpYmVTZWN0aW9uIiwidG9wIiwid2luZG93IiwiaW5uZXJIZWlnaHQiLCJib3R0b20iLCJzZXRUaW1lb3V0Iiwic2Nyb2xsUGVyY2VudCIsInNjcm9sbFkiLCJkb2N1bWVudEVsZW1lbnQiLCJzY3JvbGxIZWlnaHQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImhhbmRsZUNsb3NlIiwic2V0SXRlbSIsImhhbmRsZUVzYyIsImUiLCJrZXkiLCJoYW5kbGVJbnB1dENoYW5nZSIsInByZXYiLCJ0YXJnZXQiLCJuYW1lIiwidmFsdWUiLCJoYW5kbGVTdWJtaXQiLCJwcmV2ZW50RGVmYXVsdCIsImVtYWlsUmVnZXgiLCJ0ZXN0IiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsInZhcmlhbnQiLCJtZXRob2QiLCJkYXRhIiwic291cmNlIiwiZXJyb3IiLCJtZXNzYWdlIiwiaW5jbHVkZXMiLCJ0IiwiaGVhZGluZyIsImpvaW5Db3VudCIsImJ1dHRvbiIsImJhY2tncm91bmRDb2xvciIsImJhY2tkcm9wRmlsdGVyIiwiV2Via2l0QmFja2Ryb3BGaWx0ZXIiLCJ3aWR0aCIsIm1heEhlaWdodCIsInN0b3BQcm9wYWdhdGlvbiIsImJveFNoYWRvdyIsInpJbmRleCIsInBvaW50ZXJFdmVudHMiLCJ0b3VjaEFjdGlvbiIsIm1pbkhlaWdodCIsIm9iamVjdFBvc2l0aW9uIiwiY29sb3IiLCJmb250RmFtaWx5IiwiZm9udFdlaWdodCIsImxpbmVIZWlnaHQiLCJfX2h0bWwiLCJmb250U2l6ZSIsImJvcmRlckNvbG9yIiwiYm9yZGVyUmFkaXVzIiwibGV0dGVyU3BhY2luZyIsImJvcmRlciIsIl9jIiwiJFJlZnJlc2hSZWckIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIldhaXRsaXN0UG9wdXAudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBYIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7IHVzZUxvY2F0aW9uIH0gZnJvbSAnd291dGVyJztcbmltcG9ydCB7IHVzZUxhbmd1YWdlIH0gZnJvbSAnQC9saWIvTGFuZ3VhZ2VDb250ZXh0JztcbmltcG9ydCB7IHVzZVRvYXN0IH0gZnJvbSAnQC9ob29rcy91c2UtdG9hc3QnO1xuaW1wb3J0IHsgYXBpUmVxdWVzdCB9IGZyb20gJ0AvbGliL3F1ZXJ5Q2xpZW50JztcbmltcG9ydCB7IHRyYWNrV2FpdGxpc3RTaWdudXAgfSBmcm9tICdAL2xpYi9hbmFseXRpY3MnO1xuaW1wb3J0IHsgdXNlTW9kYWxMb2NrIH0gZnJvbSAnQC9ob29rcy91c2VNb2RhbExvY2snO1xuaW1wb3J0IHBvcHVwSW1hZ2UgZnJvbSAnQGFzc2V0cy9reW4tcG9wdXAtY29taW5nLXNvb24ucG5nJztcblxuZXhwb3J0IGZ1bmN0aW9uIFdhaXRsaXN0UG9wdXAoKSB7XG4gIGNvbnN0IFtpc1Zpc2libGUsIHNldElzVmlzaWJsZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIHVzZU1vZGFsTG9jayhpc1Zpc2libGUpO1xuICBjb25zdCBbaXNDbG9zaW5nLCBzZXRJc0Nsb3NpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXNTdWJtaXR0aW5nLCBzZXRJc1N1Ym1pdHRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbZm9ybURhdGEsIHNldEZvcm1EYXRhXSA9IHVzZVN0YXRlKHsgZmlyc3ROYW1lOiAnJywgZW1haWw6ICcnIH0pO1xuICBjb25zdCB7IGxhbmd1YWdlIH0gPSB1c2VMYW5ndWFnZSgpO1xuICBjb25zdCB7IHRvYXN0IH0gPSB1c2VUb2FzdCgpO1xuICBjb25zdCBbbG9jYXRpb25dID0gdXNlTG9jYXRpb24oKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIERvbid0IHNob3cgcG9wdXAgb24gcGxheWJvb2svc2tpbmNhcmUtZ3VpZGUgcGFnZXNcbiAgICBpZiAobG9jYXRpb24gPT09ICcvcGxheWJvb2snIHx8IGxvY2F0aW9uID09PSAnL3NraW5jYXJlLWd1aWRlJykgcmV0dXJuO1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHVzZXIgaGFzIGFscmVhZHkgc2lnbmVkIHVwIChwZXJtYW5lbnQgYmxvY2spXG4gICAgY29uc3QgaGFzU2lnbmVkVXAgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdreW4td2FpdGxpc3Qtc2lnbmVkLXVwJyk7XG4gICAgaWYgKGhhc1NpZ25lZFVwKSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiB1c2VyIG1hbnVhbGx5IGNsb3NlZCB0aGUgcG9wdXBcbiAgICBjb25zdCBoYXNDbG9zZWRQb3B1cCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2t5bi13YWl0bGlzdC1wb3B1cC1jbG9zZWQnKTtcbiAgICBpZiAoaGFzQ2xvc2VkUG9wdXApIHJldHVybjtcblxuICAgIGNvbnN0IGhhbmRsZVNjcm9sbCA9ICgpID0+IHtcbiAgICAgIC8vIFJlLWNoZWNrIGNsb3NlZCBzdGF0dXMgb24gZXZlcnkgc2Nyb2xsXG4gICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgna3luLXdhaXRsaXN0LXBvcHVwLWNsb3NlZCcpKSByZXR1cm47XG4gICAgICBcbiAgICAgIC8vIERvbid0IHNob3cgcG9wdXAgaWYgY29va2llIGNvbnNlbnQgaGFzbid0IGJlZW4gaGFuZGxlZCB5ZXRcbiAgICAgIGNvbnN0IGNvb2tpZUNvbnNlbnQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgna3luX2Nvb2tpZV9jb25zZW50Jyk7XG4gICAgICBpZiAoIWNvb2tpZUNvbnNlbnQpIHJldHVybjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdXNlciBpcyBuZWFyIHRoZSBzdWJzY3JpYmUgc2VjdGlvbiAtIGRvbid0IHNob3cgcG9wdXAgdGhlcmVcbiAgICAgIGNvbnN0IHN1YnNjcmliZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3Vic2NyaWJlLXNlY3Rpb24nKTtcbiAgICAgIGlmIChzdWJzY3JpYmVTZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBzdWJzY3JpYmVTZWN0aW9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBpc05lYXJTdWJzY3JpYmVTZWN0aW9uID0gcmVjdC50b3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgcmVjdC5ib3R0b20gPiAwO1xuICAgICAgICBpZiAoaXNOZWFyU3Vic2NyaWJlU2VjdGlvbikge1xuICAgICAgICAgIC8vIElmIHBvcHVwIGlzIHZpc2libGUgYW5kIHVzZXIgc2Nyb2xsZWQgdG8gc3Vic2NyaWJlIHNlY3Rpb24sIGhpZGUgaXRcbiAgICAgICAgICBpZiAoaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICBzZXRJc0Nsb3NpbmcodHJ1ZSk7XG4gICAgICAgICAgICBzZXRUaW
5051lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgc2V0SXNWaXNpYmxlKGZhbHNlKTtcbiAgICAgICAgICAgICAgc2V0SXNDbG9zaW5nKGZhbHNlKTtcbiAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzY3JvbGxQZXJjZW50ID0gKHdpbmRvdy5zY3JvbGxZIC8gKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQgLSB3aW5kb3cuaW5uZXJIZWlnaHQpKSAqIDEwMDtcbiAgICAgIFxuICAgICAgLy8gU2hvdyBwb3B1cCBhdCA1MCUgc2Nyb2xsIGlmIG5vdCBhbHJlYWR5IHZpc2libGVcbiAgICAgIGlmIChzY3JvbGxQZXJjZW50ID49IDUwICYmICFpc1Zpc2libGUpIHtcbiAgICAgICAgc2V0SXNWaXNpYmxlKHRydWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaGFuZGxlU2Nyb2xsKTtcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGhhbmRsZVNjcm9sbCk7XG4gIH0sIFtpc1Zpc2libGVdKTtcblxuICBjb25zdCBoYW5kbGVDbG9zZSA9ICgpID0+IHtcbiAgICAvLyBNYXJrIGFzIGNsb3NlZCBzbyBwb3B1cCB3b24ndCBzaG93IGFnYWluIHRoaXMgc2Vzc2lvblxuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2t5bi13YWl0bGlzdC1wb3B1cC1jbG9zZWQnLCAndHJ1ZScpO1xuICAgIHNldElzQ2xvc2luZyh0cnVlKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNldElzVmlzaWJsZShmYWxzZSk7XG4gICAgICBzZXRJc0Nsb3NpbmcoZmFsc2UpO1xuICAgIH0sIDMwMCk7XG4gIH07XG5cbiAgLy8gRVNDIGtleSB0byBjbG9zZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaXNWaXNpYmxlKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgaGFuZGxlRXNjID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgaGFuZGxlQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlRXNjKTtcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVFc2MpO1xuICB9LCBbaXNWaXNpYmxlXSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRDaGFuZ2UgPSAoZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICBzZXRGb3JtRGF0YShwcmV2ID0+ICh7XG4gICAgICAuLi5wcmV2LFxuICAgICAgW2UudGFyZ2V0Lm5hbWVdOiBlLnRhcmdldC52YWx1ZVxuICAgIH0pKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdWJtaXQgPSBhc3luYyAoZTogUmVhY3QuRm9ybUV2ZW50KSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIFxuICAgIGNvbnN0IGVtYWlsUmVnZXggPSAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLztcbiAgICBpZiAoIWZvcm1EYXRhLmVtYWlsIHx8ICFlbWFpbFJlZ2V4LnRlc3QoZm9ybURhdGEuZW1haWwpKSB7XG4gICAgICB0b2FzdCh7XG4gICAgICAgIHRpdGxlOiBsYW5ndWFnZSA9PT0gJ2ZyJyA/ICdFcnJldXInIDogJ0Vycm9yJyxcbiAgICAgICAgZGVzY3JpcHRpb246IGxhbmd1YWdlID09PSAnZnInID8gJ1ZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlbWFpbCB2YWxpZGUuJyA6ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLicsXG4gICAgICAgIHZhcmlhbnQ6ICdkZXN0cnVjdGl2ZScsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRJc1N1Ym1pdHRpbmcodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaVJlcXVlc3QoJy9hcGkvd2FpdGxpc3QnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBkYXRhOiB7IFxuICAgICAgICAgIGZpcnN0TmFtZTogZm9ybURhdGEuZmlyc3ROYW1lLFxuICAgICAgICAgIGVtYWlsOiBmb3JtRGF0YS5lbWFpbCwgXG4gICAgICAgICAgc291cmNlOiAncG9wdXAnLFxuICAgICAgICAgIGxhbmd1YWdlXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdHJhY2tXYWl0bGlzdFNpZ251cCgncG9wdXAnKTtcbiAgICAgIC8vIE1hcmsgYXMgc2lnbmVkIHVwIHRvIHByZXZlbnQgcG9wdXAgZnJvbSBzaG93aW5nIGFnYWluXG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdreW4td2FpdGxpc3Qtc2lnbmVkLXVwJywgJ3RydWUnKTtcbiAgICAgIC8vIEdyYW50IHBsYXlib29rIGFjY2VzcyAocGVyc2lzdHMgYWNyb3NzIHNlc3Npb25zKVxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2t5bi1wbGF5Ym9vay1hY2Nlc3MnLCAndHJ1ZScpO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2t5bi11c2VyLW5hbWUnLCBmb3JtRGF0YS5maXJzdE5hbWUpO1xuICAgICAgdG9hc3Qoe1xuICAgICAgICB0aXRsZTogbGFuZ3VhZ2UgPT09ICdmcicgPyBcIlZvdXMgw6p0ZXMgc3VyIGxhIGxpc3RlICEgOylcIiA6IFwiWW91J3JlIG9uIHRoZSBsaXN0ISA7KVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogbGFuZ3VhZ2UgPT09ICdmcicgXG4gICAgICAgICAgPyBcIkxlIEtZTiBTa2luY2FyZSBQbGF5Ym9vayBlc3QgZGFucyB2b3RyZSBib8OudGUgbWFpbC4gQmllbnZlbnVlIGNoZXogS1lOICFcIiBcbiAgICAgICAgICA6IFwiVGhlIEtZTiBTa2luY2FyZSBQbGF5Ym9vayBpcyBpbiB5b3VyIGluYm94LiBXZWxjb21lIHRvIEtZTiFcIixcbiAgICAgIH0pO1xuXG4gICAgICBzZXRGb3JtRGF0YSh7IGZpcnN0TmFtZTogJycsIGVtYWlsOiAnJyB9KTtcbiAgICAgIC8vIENsb3NlIHdpdGhvdXQgbWFya2luZyBhcyBtYW51YWxseSBjbG9zZWRcbiAgICAgIHNldElzQ2xvc2luZyh0cnVlKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZXRJc1Zpc2libGUoZmFsc2UpO1xuICAgICAgICBzZXRJc0Nsb3NpbmcoZmFsc2UpO1xuICAgICAgfSwgMzAwKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHknKSkge1xuICAgICAgICB0b2FzdCh7XG4gICAgICAgICAgdGl0bGU6IGxhbmd1YWdlID09PSAnZnInID8gJ0TDqWrDoCBhdmVjIG5vdXMnIDogJ0FscmVhZHkgd2l0aCB1cycsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGxhbmd1YWdlID09PSAnZnInID8gJ0NldCBlbWFpbCBmYWl0IGTDqWrDoCBwYXJ0aWUgZGUgbm90cmUgY29tbXVuYXV0w6kuJyA6ICdUaGlzIGVtYWlsIGlzIGFscmVhZHkgcGFydCBvZiBvdXIgY29tbXVuaXR5LicsXG4gICAgICAgICAgdmFyaWFudDogJ2VsZWdhbnQnIGFzIGFueSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b2FzdCh7XG4gICAgICAgICAgdGl0bGU6IGxhbmd1YWdlID09PSAnZnInID8gJ0VycmV1cicgOiAnRXJyb3InLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBsYW5ndWFnZSA9PT0gJ2ZyJyA/ICdVbmUgZXJyZXVyIGVzdCBzdXJ2ZW51ZS4nIDogJ1NvbWV0aGluZyB3ZW50IHdyb25nLicsXG4gICAgICAgICAgdmFyaWFudDogJ2VsZWdhbnQnIGFzIGFueSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzU3VibWl0dGluZyhmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIGlmICghaXNWaXNpYmxlKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCB0ID0ge1xuICAgIGhlYWRpbmc6IGxhbmd1YWdlID09PSAnZnInID8gJ1JFSk9JR05FWiBMQSBMSVNURScgOiAnSk9JTiBUSEUgV0FJVExJU1QnLFxuICAgIGRlc2NyaXB0aW9uOiBsYW5ndWFnZSA9PT0gJ2ZyJyBcbiAgICAgID8gJ1NveWV6IHBhcm1pIGxlcyBwcmVtaWVycyDDoCBkw6ljb3V2cmlyIG5vcyBmb3JtdWxhdGlvbnMgZXQgcmVjZXZleiBub3RyZSA8c3Ryb25nPkd1aWRlIFNraW5jYXJlPC9zdHJvbmc+IGV4Y2x1c2lmLidcbiAgICAgIDogJ0JlIGFtb25nIHRoZSBmaXJzdCB0byBkaXNjb3ZlciBvdXIgZm9ybXVsYXRpb25zIGFuZCByZWNlaXZlIG91ciBleGNsdXNpdmUgPHN0cm9uZz5Ta2luY2FyZSBQbGF5Ym9vazwvc3Ryb25nPi4nLFxuICAgIGpvaW5Db3VudDogbGFuZ3VhZ2UgPT09ICdmcicgPyAnMjAwKyBEw4lKw4AgU1VSIExBIExJU1RFJyA6ICcyMDArIEFMUkVBRFkgT04gVEhFIExJU1QnLFxuICAgIGZpcnN0TmFtZTogbGFuZ3VhZ2UgPT09ICdmcicgPyAnUHLDqW5vbScgOiAnRmlyc3QgbmFtZScsXG4gICAgZW1haWw6IGxhbmd1YWdlID09PSAnZnInID8gJ0VtYWlsJyA6ICdFbWFpbCcsXG4gICAgYnV0dG9uOiBsYW5ndWFnZSA9PT0gJ2ZyJyA/ICdSRUpPSU5EUkUgTEEgTElTVEUnIDogJ0pPSU4gVEhFIFdBSVRMSVNUJyxcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8c3R5bGU+e2BcbiAgICAgICAgQGtleWZyYW1lcyBwb3B1cEZhZGVJbiB7XG4gICAgICAgICAgZnJvbSB7IG9wYWNpdHk6IDA7IH1cbiAgICAgICAgICB0byB7IG9wYWNpdHk6IDE7IH1cbiAgICAgICAgfVxuICAgICAgICBAa2V5ZnJhbWVzIHBvcHVwU2xpZGVVcCB7XG4gICAgICAgICAgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyMHB4KSBzY2FsZSgwLjk1KTsgfVxuICAgICAgICAgI
505HRvIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHNjYWxlKDEpOyB9XG4gICAgICAgIH1cbiAgICAgICAgQGtleWZyYW1lcyBwb3B1cEZhZGVPdXQge1xuICAgICAgICAgIGZyb20geyBvcGFjaXR5OiAxOyB9XG4gICAgICAgICAgdG8geyBvcGFjaXR5OiAwOyB9XG4gICAgICAgIH1cbiAgICAgICAgQGtleWZyYW1lcyBwb3B1cFNsaWRlRG93biB7XG4gICAgICAgICAgZnJvbSB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSBzY2FsZSgxKTsgfVxuICAgICAgICAgIHRvIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDIwcHgpIHNjYWxlKDAuOTUpOyB9XG4gICAgICAgIH1cbiAgICAgICAgLnBvcHVwLWJhY2tkcm9wIHsgYW5pbWF0aW9uOiBwb3B1cEZhZGVJbiAwLjNzIGVhc2Utb3V0IGZvcndhcmRzOyB9XG4gICAgICAgIC5wb3B1cC1iYWNrZHJvcC5jbG9zaW5nIHsgYW5pbWF0aW9uOiBwb3B1cEZhZGVPdXQgMC4zcyBlYXNlLWluIGZvcndhcmRzOyB9XG4gICAgICAgIC5wb3B1cC1jYXJkIHsgYW5pbWF0aW9uOiBwb3B1cFNsaWRlVXAgMC40cyBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKSBmb3J3YXJkczsgfVxuICAgICAgICAucG9wdXAtY2FyZC5jbG9zaW5nIHsgYW5pbWF0aW9uOiBwb3B1cFNsaWRlRG93biAwLjNzIGVhc2UtaW4gZm9yd2FyZHM7IH1cbiAgICAgIGB9PC9zdHlsZT5cblxuICAgICAgey8qIE1vZGFsIENvbnRhaW5lciAtIGhhbmRsZXMga2V5Ym9hcmQgcmVzaXplICovfVxuICAgICAgPGRpdiBcbiAgICAgICAgY2xhc3NOYW1lPXtgZml4ZWQgaW5zZXQtMCB6LVsyMDBdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHAtNCBwb3B1cC1iYWNrZHJvcCAke2lzQ2xvc2luZyA/ICdjbG9zaW5nJyA6ICcnfWB9XG4gICAgICAgIHN0eWxlPXt7IFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMC42KScsXG4gICAgICAgICAgYmFja2Ryb3BGaWx0ZXI6ICdibHVyKDRweCknLFxuICAgICAgICAgIFdlYmtpdEJhY2tkcm9wRmlsdGVyOiAnYmx1cig0cHgpJyxcbiAgICAgICAgfX1cbiAgICAgICAgb25DbGljaz17aGFuZGxlQ2xvc2V9XG4gICAgICAgIGRhdGEtdGVzdGlkPVwicG9wdXAtYmFja2Ryb3BcIlxuICAgICAgICBkYXRhLW1vZGFsLWNvbnRhaW5lclxuICAgICAgPlxuICAgICAgICB7LyogUG9wdXAgQ2FyZCAqL31cbiAgICAgICAgPGRpdiBcbiAgICAgICAgICBjbGFzc05hbWU9e2ByZWxhdGl2ZSB6LVsyMDFdIHBvcHVwLWNhcmQgJHtpc0Nsb3NpbmcgPyAnY2xvc2luZycgOiAnJ31gfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICB3aWR0aDogJ21pbig5MnZ3LCA2ODBweCknLFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiAnbWluKDkwdmgsIDEwMCUpJyxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwicG9wdXAtd2FpdGxpc3QtY2FyZFwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctd2h
505pdGUgb3ZlcmZsb3ctaGlkZGVuIGZsZXggZmxleC1jb2wgbWQ6ZmxleC1yb3cgbWF4LWgtW2luaGVyaXRdIHJlbGF0aXZlXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGJveFNoYWRvdzogJzAgMjVweCA1MHB4IC0xMnB4IHJnYmEoMCwgMCwgMCwgMC4yNSknIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgey8qIENsb3NlIEJ1dHRvbiAqL31cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMyByaWdodC0zIG1kOnRvcC00IG1kOnJpZ2h0LTQgdy0xMCBoLTEwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtZnVsbCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgaG92ZXI6YmctZ3JheS0xMDAgZm9jdXM6b3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgXG4gICAgICAgICAgICAgICAgekluZGV4OiA5OTk5OSxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuOSknLFxuICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICB0b3VjaEFjdGlvbjogJ21hbmlwdWxhdGlvbicsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZSBwb3B1cFwiXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYnV0dG9uLWNsb3NlLXBvcHVwXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFggc2l6ZT17MTh9IHN0cm9rZVdpZHRoP
505XsyfSBjb2xvcj1cIiMzMzMzMzNcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICB7LyogSW1hZ2UgU2lkZSAqL31cbiAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmJsb2NrIG1kOnctMi81IHJlbGF0aXZlIG92ZXJmbG93LWhpZGRlblwiXG4gICAgICAgICAgICBzdHlsZT17eyBtaW5IZWlnaHQ6ICc0MjBweCcgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIHNyYz17cG9wdXBJbWFnZX1cbiAgICAgICAgICAgICAgYWx0PVwiS1lOIFNraW5jYXJlIC0gQWZyaWNhbiBib3RhbmljYWwgYmVhdXR5IGNvbWluZyBzb29uXCJcbiAgICAgICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAgICAgICBkZWNvZGluZz1cImFzeW5jXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCB3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlclwiXG4gICAgICAgICAgICAgIHN0eWxlPXt7IG9iamVjdFBvc2l0aW9uOiAnY2VudGVyIGNlbnRlcicgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICB7LyogQ29udGVudCBTaWRlICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIHAtNiBtZDpwLTEwIHJlbGF0aXZlIG92ZXJmbG93LXktYXV0b1wiIGRhdGEtbW9kYWwtc2Nyb2xsYWJsZT5cblxuICAgICAgICAgICAgey8qIENvbnRlbnQgKi99XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB0LTYgbWQ6cHQtMiB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICB7LyogSGVhZGluZyAqL31cbiAgICAgICAgICAgICAgPGgzIFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtWzE2cHhdIG1kOnRleHQtWzE4cHhdIHVwcGVyY2FzZSB0cmFja2luZy1bMS41cHhdIG1iLTNcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IFxuICAgICAgICAgICAgICAgICAgY29sb3I6ICcjMUExQTFBJywgXG4gICAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBcIkhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWZcIixcbiAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDUwMCxcbiAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IDEuMyxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3QuaGVhZGluZ31cbiAgICAgICAgICAgICAgPC9oMz5cblxuICAgICAgICAgICAgICB7LyogSm9pbiBjb3VudCBiYWRnZSAtIGFmdGVyIGhlYWRpbmcgKi99XG4gICAgICAgICAgICAgIDxwIFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtWzEwcHhdIHVwcGVyY2FzZSB0cmFja2luZy1bMnB4XSBtYi00XCJcbiAgICAgICAgICAgICAgICBzdHlsZT17eyBcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzg4ODg4OCcsIFxuICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiA0MDAsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt0LmpvaW5Db3VudH1cbiAgICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICAgIHsvKiBEZXNjcmlwdGlvbiAqL31cbiAgICAgICAgICAgICAgPHAgXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gbWItNlwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3sgXG4gICAgICAgICAgICAgICAgICBjb2xvcjogJyM2NjY2NjYnLCBcbiAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZlwiLFxuICAgICAgICAgICAgICAgICAgZm9udFdlaWdodDogMzAwLFxuICAgICAgICAgICAgICAgICAgbGluZUhlaWdodDogMS43LFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiB0LmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgey8qIEZvcm0gKi99XG4gICAgICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cImZpcnN0TmFtZVwiXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17Zm9ybURhdGEuZmlyc3ROYW1lfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3QuZmlyc3ROYW1lfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIHB4LTQgcHktMyBib3JkZXIgdHJhbnNpdGlvbi1jb2xvcnMgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1bIzFBMUExQV1cIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMTNweCcsXG4gICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDMwMCxcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICcjRTBFMEUwJyxcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI0ZBRkFGQScsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogMCxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cInBvcHVwLWlucHV0LWZpcnN0LW5hbWVcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cImVtYWlsXCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPXtmb3JtRGF0YS5lbWFpbH1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgICAgICAgICAgICAgI
505HBsYWNlaG9sZGVyPXtgJHt0LmVtYWlsfSpgfVxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBweC00IHB5LTMgYm9yZGVyIHRyYW5zaXRpb24tY29sb3JzIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItWyMxQTFBMUFdXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZlwiLFxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogJzEzcHgnLFxuICAgICAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiAzMDAsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAnI0UwRTBFMCcsXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNGQUZBRkEnLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDAsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJwb3B1cC1pbnB1dC1lbWFpbFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc1N1Ym1pdHRpbmd9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcHktMy41IHVwcGVyY2FzZSB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAgaG92ZXI6YmctdHJhbnNwYXJlbnQgaG92ZXI6dGV4dC1bIzFBMUExQV0gZGlzYWJsZWQ6b3BhY2l0eS01MFwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjMUExQTFBJyxcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjRkZGRkZGJyxcbiAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDQwMCxcbiAgICAgICAgICAgICAgICAgICAgbGV0dGVyU3BhY2luZzogJzJweCcsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAjMUExQTFBJyxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6ICcxMXB4JyxcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYnV0dG9uLXBvcHVwLXN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge2lzU3VibWl0dGluZyA/ICcuLi4nIDogdC5idXR0b259XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvPlxuICApO1xufVxuIl0sImZpbGUiOiIvaG9tZS9ydW5uZXIvd29ya3NwYWNlL2NsaWVudC9zcmMvY29tcG9uZW50cy9XYWl0bGlzdFBvcHVwLnRzeCJ9

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.