PageSourceSearch

https://www.ibf.com.kh/assets/OTPComponent.16555051.js

js ibf.com.kh collected 2026-10-09 21:45:07 UTC 53,276 bytes, 536 lines download raw bytes

1import { d as defineComponent, r as ref, w as watch, o as onMounted, m as openBlock, n as createElementBlock, j as createVNode, x as withCtx, q as normalizeClass, u as unref, D as renderSlot, F as Fragment, y as renderList, p as createBaseVNode, a0 as normalizeStyle, t as toDisplayString, v as createCommentVNode, _ as _export_sfc, a8 as useRouter, c as computed, ad as onBeforeUnmount, A as createBlock, aN as QCard, aM as QCardSection, B as createTextVNode, a5 as QBtn, bv as QDialog, bO as authAPI } from "./index.6f7a794b.js";
2import { Q as QInnerLoading } from "./QInnerLoading.2dd01826.js";
3import { u as useQuasar } from "./use-quasar.1ed7d5ca.js";
4import { Q as QField } from "./QField.83adcbce.js";
5var QOtp_vue_vue_type_style_index_0_lang = "";
6var QOtp_vue_vue_type_style_index_1_scoped_true_lang = "";
7const _hoisted_1$1 = ["disabled", "placeholder", "autofocus"];
8const _sfc_main$1 = defineComponent({
9  __name: "QOtp",
10  props: {
11    ...QField.props,
12    num: {
13      type: Number,
14      default: 6
15    },
16    separator: {
17      type: String,
18      default: ""
19    },
20    inputStyles: {
21      type: [String, Object]
22    },
23    fieldClasses: {
24      type: [String, Array]
25    },
26    inputClasses: {
27      type: [String, Array]
28    },
29    conditionalClass: {
30      type: Array,
31      default: []
32    },
33    autofocus: {
34      type: Boolean,
35      default: false
36    },
37    placeholder: {
38      type: String,
39      default: " "
40    }
41  },
42  emits: ["complete", "change"],
43  setup(__props, { expose: __expose, emit: __emit }) {
44    const emit = __emit;
45    const props = __props;
46    const input = ref(null);
47    const activeInput = ref(0);
48    const disabled = ref([...Array(props.num).keys()].map(() => true));
49    const pin = ref("");
50    const digits = Array.from({ length: 10 }, (_, i) => i.toString());
51    function focusAndSelectInput(input2) {
52      input2.focus();
53      input2.setSelectionRange(0, 0);
54      input2.select();
55    }
56    function handleOnPaste(event) {
57      var _a;
58      (_a = getInputValueAt(activeInput.value)) == null ? void 0 : _a.blur();
59      pin.value = event.clipboardData.getData("text/plain").slice(0, props.num - activeInput.value).split("").map((elem) => Number(elem)).filter((elem) => Number.isInteger(elem)).map((value, i) => inputValue(String(value), i)).join("");
60      return event.preventDefault();
61    }
62    function inputValue(value, index = activeInput.value) {
63      var _a;
64      return getInputValueAt(index).value = (_a = value[0]) != null ? _a : "";
65    }
66    function getInputValueAt(key) {
67      return input.value.at(key);
68    }
69    function handleOnChange() {
70      pin.value = getPin();
71    }
72    function getPin() {
73      let str = "";
74      for (const { value } of input.value) {
75        str += value;
76      }
77      return str;
78    }
79    function handleOnKeyDown(event) {
80      if (props.loading) {
81        return event.preventDefault();
82      }
83      const { key, code } = event;
84      if (code === "KeyV") {
85        return;
86      }
87      switch (key) {
88        case "Backspace": {
89          if (activeInput.value === props.num - 1 && getInputValueAt(props.num - 1).value) {
90            return;
91          }
92          inputValue("");
93          if (activeInput.value > 0) {
94            inputValue("", activeInput.value - 1);
95          }
96          pin.value = getPin();
97          break;
98        }
99        default: {
100          if ((code.startsWith("Digit") || code.startsWith("Numpad")) && digits.includes(key)) {
101            inputValue(key);
102            pin.value = getPin();
103          }
104          break;
105        }
106      }
107      event.preventDefault();
108    }
109    watch(
110      () => pin.value,
111      (newVal, oldVal) => {
112        if (newVal === oldVal) {
113          return;
114        }
115        emit("change", newVal);
116        if (props.num === newVal.length) {
117          emit("complete", newVal);
118        }
119        const value = Math.min(newVal.length, props.num - 1);
120        for (let i = 0; i < disabled.value.length - 1; i++) {
121          disabled.value.splice(i, 1, i !== value);
122        }
123        setTimeout(() => {
124          activeInput.value = value;
125        });
126      }
127    );
128    watch(
129      () => activeInput.value,
130      (newVal, oldVal) => {
131        if (oldVal !== newVal && newVal <= props.num - 1) {
132          const elem = getInputValueAt(newVal);
133          if (!elem.disabled) {
134            focusAndSelectInput(elem);
135          }
136        }
137      }
138    );
139    onMounted(() => {
140      if (props.autofocus) {
141        focusAndSelectInput(getInputValueAt(0));
142      }
143      disabled.value.splice(disabled.value, 0, false);
144      if (props.modelValue) {
145        for (let i = 0; i < props.modelValue.length; i++) {
146          inputValue(props.modelValue[i], i);
147        }
148      }
149    });
150    __expose({
151      blur() {
152        for (let i = 0; i < props.num; i++) {
153          getInputValueAt(i).blur();
154        }
155      },
156      focus() {
157        focusAndSelectInput(getInputValueAt(activeInput.value = 0));
158      },
159      clear() {
160        for (let i = 0; i < props.num; i++) {
161          inputValue("", i);
162        }
163        pin.value = "";
164      },
165      getPin
166    });
167    return (_ctx, _cache) => {
168      return openBlock(), createElementBlock("div", {
169        onClick: _cache[0] || (_cache[0] = ($event) => focusAndSelectInput(getInputValueAt(activeInput.value)))
170      }, [
171        createVNode(unref(QField), {
172          class: normalizeClass(["main-field", {
173            "complete": pin.value.length === __props.num
174          }]),
175          "bg-color": "transparent",
176          "model-value": pin.value,
177          disable: props.loading,
178          rules: props.rules,
179          error: props.error,
180          "reactive-rules": props.reactiveRules,
181          "lazy-rules": props.lazyRules,
182          loading: props.loading,
183          "error-message": props.errorMessage,
184          label: props.label,
185          "stack-label": props.stackLabel,
186          "bottom-slots": props.bottomSlots,
187          hint: props.hint,
188          "hide-hint": props.hideHint,
189          prefix: props.prefix,
190          suffix: props.suffix,
191          borderless: true,
192          clearable: false,
193          counter: false,
194          "no-error-icon": true,
195          dense: true
196        }, {
197          default: withCtx(() => [
198            (openBlock(true), createElementBlock(Fragment, null, renderList(__props.num, (_, i) => {
199              var _a;
200              return openBlock(), createElementBlock(Fragment, { key: i }, [
201                createVNode(unref(QField), {
202                  class: normalizeClass(["otp-field", __props.fieldClasses]),
203                  autofocus: __props.autofocus,
204                  disable: disabled.value[i],
205                  readonly: props.readonly,
206                  "label-color": props.labelColor,
207                  color: props.color,
208                  "bg-color": props.bgColor,
209                  dark: props.dark,
210                  filled: props.filled,
211                  outlined: props.outlined,
212                  borderless: props.borderless,
213                  standout: props.standout,
214                  rounded: props.rounded,
215                  square: props.square,
216                  dense: props.dense,
217                  "item-aligned": props.itemAligned
218                }, {
219                  default: withCtx(() => [
220                    createBaseVNode("input", {
221                      ref_for: true,
222                      ref_key: "input",
223                      ref: input,
224                      type: "number",
225                      inputmode: "tel",
226                      min: "0",
227                      max: "9",
228                      maxlength: "1",
229                      pattern: "[0-9]",
230                      required: "",
231                      title: "",
232                      disabled: disabled.value[i],
233                      style: normalizeStyle(__props.inputStyles),
234                      class: normalizeClass(["otp-input", __props.inputClasses, __props.conditionalClass[i]]),
235                      placeholder: __props.placeholder,
236                      autofocus: activeInput.value === i,
237                      onInput: handleOnChange,
238                      onKeydown: handleOnKeyDown,
239                      onPaste: handleOnPaste
240                    }, null, 46, _hoisted_1$1)
241                  ]),
242                  _: 2
243                }, 1032, ["class", "autofocus", "disable", "readonly", "label-color", "color", "bg-color", "dark", "filled", "outlined", "borderless", "standout", "rounded", "square", "dense", "item-aligned"]),
244                __props.separator.length && i !== __props.num - 1 ? (openBlock(), createElementBlock("span", {
245                  key: 0,
246                  class: normalizeClass(["q-mt-auto q-mb-auto non-selectable", "text-" + ((_a = props.color) != null ? _a : "secondary")])
247                }, toDisplayString(__props.separator), 3)) : createCommentVNode("", true)
248              ], 64);
249            }), 128)),
250            renderSlot(_ctx.$slots, "control", {}, void 0, true)
251          ]),
252          _: 3
253        }, 8, ["class", "model-value", "disable", "rules", "error", "reactive-rules", "lazy-rules", "loading", "error-message", "label", "stack-label", "bottom-slots", "hint", "hide-hint", "prefix", "suffix"]),
254        renderSlot(_ctx.$slots, "footer", {}, void 0, true)
255      ]);
256    };
257  }
258});
259var QOtp = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-07759faa"], ["__file", "QOtp.vue"]]);
260var OTPComponent_vue_vue_type_style_index_0_lang = "";
261const _hoisted_1 = { class: "ibf-h10 q-mt-sm text-grey-6" };
262const _hoisted_2 = { class: "text-primary" };
263const _hoisted_3 = { id: "message" };
264const _hoisted_4 = { key: 0 };
265const _hoisted_5 = {
266  key: 0,
267  class: "ibf-h10 text-weight-medium text-negative"
268};
269const _hoisted_6 = {
270  key: 0,
271  class: "text-center"
272};
273const _hoisted_7 = {
274  key: 1,
275  class: "text-caption text-grey q-mt-md"
276};
277const _hoisted_8 = { key: 0 };
278const _sfc_main = {
279  __name: "OTPComponent",
280  props: {
281    verifyId: {
282      type: String,
283      default: ""
284    },
285    sendingMethod: {
286      type: Object,
287      default: () => ({
288        value: "sms",
289        label: "Phone",
290        icon: "mdi-phone-outline",
291        subtitle: "Verify with signup phone number"
292      })
293    },
294    sending_type: {
295      type: String,
296      default: "email"
297    },
298    redirect: {
299      type: String,
300      default: "login-page"
301    }
302  },
303  setup(__props, { expose: __expose }) {
304    const router = useRouter();
305    const props = __props;
306    const $q = useQuasar();
307    const show = ref(false);
308    const otpSuccess = ref(false);
309    const otpFail = ref(false);
310    const timer = ref(59);
311    let countdown = null;
312    const visible = ref(false);
313    const toggleOTP = () => {
314      show.value = !show.value;
315      if (show.value)
316        startCountdown();
317    };
318    const otpInputRef = ref(null);
319    function maskText(value, keepStart = 2, keepEnd = 2, maskChar = "\u2022") {
320      const s = String(value || "");
321      if (!s)
322        return "";
323      if (s.length <= keepStart + keepEnd)
324        return s;
325      const midLen = s.length - keepStart - keepEnd;
326      return s.slice(0, keepStart) + maskChar.repeat(midLen) + s.slice(-keepEnd);
327    }
328    const resetOTP = () => {
329      otpSuccess.value = false;
330      otpFail.value = false;
331    };
332    const verifyCode = async (code) => {
333      visible.value = true;
334      const end_point = props.sending_type === "forget-password" ? "/api/v1/customer/verify-pass-otp" : "/api/v1/customer/verify-otp";
335      try {
336        const { data } = await authAPI.post(end_point, {
337          verifyId: props.verifyId,
338          type: props.sendingMethod.value,
339          otpCode: parseInt(code)
340        });
341        if (!data.status) {
342          $q.notify({
343            message: data.message || "Fail verifying OTP",
344            type: "negative",
345            position: "top-right"
346          });
347          otpSuccess.value = false;
348          otpFail.value = true;
349          resetTimer();
350        } else {
351          otpSuccess.value = true;
352          otpFail.value = false;
353          clearInterval(countdown);
354          router.push({ name: props.redirect });
355        }
356      } catch (error) {
357        $q.notify({
358          message: error.message || "Verifying OTP Error",
359          type: "negative",
360          position: "top-right"
361        });
362      } finally {
363        setTimeout(() => {
364          visible.value = false;
365        }, 2e3);
366      }
367    };
368    const onResendCode = () => {
369      if (timer.value > 0) {
370        return;
371      }
372      resendOTP();
373    };
374    const resetTimer = () => {
375      timer.value = 59;
376      startCountdown();
377    };
378    const startCountdown = () => {
379      clearInterval(countdown);
380      countdown = setInterval(() => {
381        if (timer.value > 0) {
382          timer.value -= 1;
383        } else {
384          clearInterval(countdown);
385        }
386      }, 1e3);
387    };
388    const resendOTP = async () => {
389      var _a, _b;
390      visible.value = true;
391      try {
392        const { data } = await authAPI.post(
393          "/api/v1/customer/resend-otp",
394          {
395            verifyId: props.verifyId,
396            type: props.sendingMethod.value,
397            sending_type: props.sending_type === "forget-password" ? 1 : 0
398          },
399          { withCredentials: true }
400        );
401        if (!data || !data.status) {
402          $q.notify({
403            message: (data == null ? void 0 : data.message) || "Resend OTP Failed",
404            type: "negative",
405            position: "top-right"
406          });
407        } else {
408          $q.notify({
409            message: data.message || "OTP Resent Successfully",
410            type: "positive",
411            position: "top-right"
412          });
413          resetTimer();
414        }
415      } catch (error) {
416        $q.notify({
417          message: ((_b = (_a = error.response) == null ? void 0 : _a.data) == null ? void 0 : _b.message) || error.message || "Resend OTP Error",
418          type: "negative",
419          position: "top-right"
420        });
421      } finally {
422        visible.value = false;
423      }
424    };
425    const otpFieldClasses = computed(() => {
426      if (otpSuccess.value)
427        return "otp-valid otp-disabled";
428      if (otpFail.value)
429        return "otp-invalid ";
430      return "";
431    });
432    __expose({
433      toggleOTP
434    });
435    onBeforeUnmount(() => {
436      clearInterval(countdown);
437    });
438    return (_ctx, _cache) => {
439      return openBlock(), createBlock(QDialog, {
440        modelValue: show.value,
441        "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => show.value = $event),
442        persistent: "",
443        "no-shake": "",
444        "backdrop-filter": "blur(4px)"
445      }, {
446        default: withCtx(() => [
447          createVNode(QCard, {
448            class: "q-pa-sm",
449            style: { "width": "600px", "height": "400px" }
450          }, {
451            default: withCtx(() => [
452              createVNode(QCardSection, { align: "center" }, {
453                default: withCtx(() => {
454                  var _a, _b, _c;
455                  return [
456                    _cache[3] || (_cache[3] = createBaseVNode("div", { class: "ibf-h6 text-weight-bold" }, "Enter your Verification Code", -1)),
457                    createBaseVNode("div", _hoisted_1, [
458                      _cache[2] || (_cache[2] = createTextVNode(" We sent a code to ", -1)),
459                      createBaseVNode("span", _hoisted_2, toDisplayString(((_a = props.sendingMethod) == null ? void 0 : _a.value) === "email" ? maskText(((_b = props.sendingMethod) == null ? void 0 : _b.subtitle) || "--", 2, 10, "\u2022") : maskText(((_c = props.sendingMethod) == null ? void 0 : _c.subtitle) || "--", 4, 2, "\u2022")), 1)
460                    ])
461                  ];
462                }),
463                _: 1
464              }),
465              createVNode(QCardSection, { align: "center" }, {
466                default: withCtx(() => [
467                  !otpSuccess.value ? (openBlock(), createBlock(unref(QOtp), {
468                    key: 0,
469                    ref_key: "otpInputRef",
470                    ref: otpInputRef,
471                    "field-classes": "q-mx-xs",
472                    "input-styles": "max-width: 42px; height: 55px;",
473                    "input-classes": [otpFieldClasses.value, "ibf-h8"],
474                    outlined: "",
475                    hide: "",
476                    "bg-color": "grey-1",
477                    onChange: resetOTP,
478                    onComplete: verifyCode
479                  }, null, 8, ["input-classes"])) : createCommentVNode("", true),
480                  createBaseVNode("div", _hoisted_3, [
481                    otpSuccess.value ? (openBlock(), createElementBlock("div", _hoisted_4, [
482                      _cache[4] || (_cache[4] = createBaseVNode("div", { class: "ibf-h10 text-weight-medium text-positive" }, " Verification Successful ", -1)),
483                      otpFail.value ? (openBlock(), createElementBlock("div", _hoisted_5, " Verification Failed ")) : createCommentVNode("", true)
484                    ])) : createCommentVNode("", true)
485                  ])
486                ]),
487                _: 1
488              }),
489              createVNode(QCardSection, {
490                class: "q-py-xs",
491                align: "center"
492              }, {
493                default: withCtx(() => [
494                  otpSuccess.value ? (openBlock(), createElementBlock("div", _hoisted_6, [
495                    createVNode(QBtn, {
496                      color: "primary",
497                      icon: "mdi-rocket-launch",
498                      label: "Start",
499                      onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$router.push({ name: props.redirect }))
500                    })
501                  ])) : (openBlock(), createElementBlock("div", _hoisted_7, [
502                    _cache[7] || (_cache[7] = createTextVNode(" Didn't receive the code? ", -1)),
503                    createBaseVNode("span", {
504                      class: "text-primary",
505                      style: normalizeStyle({
506                        cursor: timer.value > 0 ? "not-allowed" : "pointer",
507                        color: timer.value > 0 ? "#1976D2" : "primary"
508                      }),
509                      onClick: onResendCode
510                    }, [
511                      _cache[5] || (_cache[5] = createBaseVNode("span", null, "Resend Code", -1)),
512                      _cache[6] || (_cache[6] = createTextVNode()),
513                      timer.value > 0 ? (openBlock(), createElementBlock("span", _hoisted_8, toDisplayString(timer.value) + "s", 1)) : createCommentVNode("", true)
514                    ], 4)
515                  ]))
516                ]),
517                _: 1
518              }),
519              createVNode(QInnerLoading, {
520                showing: visible.value,
521                label: "Please wait...",
522                "label-class": "text-teal",
523                "label-style": "font-size: 1.1em"
524              }, null, 8, ["showing"])
525            ]),
526            _: 1
527          })
528        ]),
529        _: 1
530      }, 8, ["modelValue"]);
531    };
532  }
533};
534var OTPComponent = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "OTPComponent.vue"]]);
535export { OTPComponent as O };
536//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT1RQQ29tcG9uZW50LjE2NTU1MDUxLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9ub2RlX21vZHVsZXMvcXVhc2FyLWFwcC1leHRlbnNpb24tcS1vdHAvc3JjL2NvbXBvbmVudC9RT3RwLnZ1ZSIsIi4uLy4uLy4uL3NyYy9wYWdlcy9hdXRoZW50aWNhdGlvbi9jb21wb25lbnRzL290cC1jb21wb25lbnRzL09UUENvbXBvbmVudC52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICA8ZGl2IEBjbGljaz1cImZvY3VzQW5kU2VsZWN0SW5wdXQoZ2V0SW5wdXRWYWx1ZUF0KGFjdGl2ZUlucHV0KSlcIj5cbiAgICA8UUZpZWxkXG4gICAgICBjbGFzcz1cIm1haW4tZmllbGRcIlxuICAgICAgOmNsYXNzPVwie1xuICAgICAgICAnY29tcGxldGUnOiBwaW4ubGVuZ3RoID09PSBudW0sXG4gICAgICB9XCJcbiAgICAgIGJnLWNvbG9yPVwidHJhbnNwYXJlbnRcIlxuICAgICAgOm1vZGVsLXZhbHVlPVwicGluXCJcbiAgICAgIDpkaXNhYmxlPVwicHJvcHMubG9hZGluZ1wiXG4gICAgICA6cnVsZXM9XCJwcm9wcy5ydWxlc1wiXG4gICAgICA6ZXJyb3I9XCJwcm9wcy5lcnJvclwiXG4gICAgICA6cmVhY3RpdmUtcnVsZXM9XCJwcm9wcy5yZWFjdGl2ZVJ1bGVzXCJcbiAgICAgIDpsYXp5LXJ1bGVzPVwicHJvcHMubGF6eVJ1bGVzXCJcbiAgICAgIDpsb2FkaW5nPVwicHJvcHMubG9hZGluZ1wiXG4gICAgICA6ZXJyb3ItbWVzc2FnZT1cInByb3BzLmVycm9yTWVzc2FnZVwiXG4gICAgICA6bGFiZWw9XCJwcm9wcy5sYWJlbFwiXG4gICAgICA6c3RhY2stbGFiZWw9XCJwcm9wcy5zdGFja0xhYmVsXCJcbiAgICAgIDpib3R0b20tc2xvdHM9XCJwcm9wcy5ib3R0b21TbG90c1wiXG4gICAgICA6aGludD1cInByb3BzLmhpbnRcIlxuICAgICAgOmhpZGUtaGludD1cInByb3BzLmhpZGVIaW50XCJcbiAgICAgIDpwcmVmaXg9XCJwcm9wcy5wcmVmaXhcIlxuICAgICAgOnN1ZmZpeD1cInByb3BzLnN1ZmZpeFwiXG4gICAgICA6Ym9yZGVybGVzcz1cInRydWVcIlxuICAgICAgOmNsZWFyYWJsZT1cImZhbHNlXCJcbiAgICAgIDpjb3VudGVyPVwiZmFsc2VcIlxuICAgICAgOm5vLWVycm9yLWljb249XCJ0cnVlXCJcbiAgICAgIDpkZW5zZT1cInRydWVcIlxuICAgID5cbiAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihfLCBpKSBpbiBudW1cIiA6a2V5PVwiaVwiPlxuICAgICAgICA8UUZpZWxkXG4gICAgICAgICAgY2xhc3M9XCJvdHAtZmllbGRcIlxuICAgICAgICAgIDpjbGFzcz1cImZpZWxkQ2xhc3Nlc1wiXG4gICAgICAgICAgOmF1dG9mb2N1cz1cImF1dG9mb2N1c1wiXG4gICAgICAgICAgOmRpc2FibGU9XCJkaXNhYmxlZFtpXVwiXG4gICAgICAgICAgOnJlYWRvbmx5PVwicHJvcHMucmVhZG9ubHlcIlxuICAgICAgICAgIDpsYWJlbC1jb2xvcj1cInByb3BzLmxhYmVsQ29sb3JcIlxuICAgICAgICAgIDpjb2xvcj1cInByb3BzLmNvbG9yXCJcbiAgICAgICAgICA6YmctY29sb3I9XCJwcm9wcy5iZ0NvbG9yXCJcbiAgICAgICAgICA6ZGFyaz1cInByb3BzLmRhcmtcIlxuICAgICAgICAgIDpmaWxsZWQ9XCJwcm9wcy5maWxsZWRcIlxuICAgICAgICAgIDpvdXRsaW5lZD1cInByb3BzLm91dGxpbmVkXCJcbiAgICAgICAgICA6Ym9yZGVybGVzcz1cInByb3BzLmJvcmRlcmxlc3NcIlxuICAgICAgICAgIDpzdGFuZG91dD1cInByb3BzLnN0YW5kb3V0XCJcbiAgICAgICAgICA6cm91bmRlZD1cInByb3BzLnJvdW5kZWRcIlxuICAgICAgICAgIDpzcXVhcmU9XCJwcm9wcy5zcXVhcmVcIlxuICAgICAgICAgIDpkZW5zZT1cInByb3BzLmRlbnNlXCJcbiAgICAgICAgICA6aXRlbS1hbGlnbmVkPVwicHJvcHMuaXRlbUFsaWduZWRcIlxuICAgICAgICA+XG4gICAgICAgICAgPHRlbXBsYXRlICNkZWZhdWx0PlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgI
536HJlZj1cImlucHV0XCJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIGlucHV0bW9kZT1cInRlbFwiXG4gICAgICAgICAgICAgIG1pbj1cIjBcIlxuICAgICAgICAgICAgICBtYXg9XCI5XCJcbiAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMVwiXG4gICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XVwiXG4gICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgIHRpdGxlPVwiXCJcbiAgICAgICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRbaV1cIlxuICAgICAgICAgICAgICA6c3R5bGU9XCJpbnB1dFN0eWxlc1wiXG4gICAgICAgICAgICAgIDpjbGFzcz1cIlsnb3RwLWlucHV0JywgaW5wdXRDbGFzc2VzLCBjb25kaXRpb25hbENsYXNzW2ldXVwiXG4gICAgICAgICAgICAgIDpwbGFjZWhvbGRlcj1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgOmF1dG9mb2N1cz1cImFjdGl2ZUlucHV0ID09PSBpXCJcbiAgICAgICAgICAgICAgQGlucHV0PVwiaGFuZGxlT25DaGFuZ2VcIlxuICAgICAgICAgICAgICBAa2V5ZG93bj1cImhhbmRsZU9uS2V5RG93blwiXG4gICAgICAgICAgICAgIEBwYXN0ZT1cImhhbmRsZU9uUGFzdGVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L1FGaWVsZD5cbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJzZXBhcmF0b3IubGVuZ3RoICYmIGkgIT09IG51bSAtIDFcIj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJxLW10LWF1dG8gcS1tYi1hdXRvIG5vbi1zZWxlY3RhYmxlXCJcbiAgICAgICAgICAgIDpjbGFzcz1cIid0ZXh0LScgKyAocHJvcHMuY29sb3IgPz8gJ3NlY29uZGFyeScpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBzZXBhcmF0b3IgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgICAgPHNsb3QgbmFtZT1cImNvbnRyb2xcIj48L3Nsb3Q+XG4gICAgPC9RRmllbGQ+XG4gICAgPHNsb3QgbmFtZT1cImZvb3RlclwiPjwvc2xvdD5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIiBzZXR1cD5cbmltcG9ydCB7IFFGaWVsZCB9IGZyb20gJ3F1YXNhcidcbmltcG9ydCB7IG9uTW91bnRlZCwgUHJvcFR5cGUsIHJlZiwgUmVmLCB3YXRjaCB9IGZyb20gJ3Z1ZSdcblxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFsnY29tcGxldGUnLCAnY2hhbmdlJ10pXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcbiAgLi4uUUZpZWxkLnByb3BzLFxuICBudW06IHtcbiAgICB0eXBlOiBOdW1iZXIgYXMgUHJvcFR5cGU8bnVtYmVyPixcbiAgICBkZWZhdWx0OiA2LFxuICB9LFxuICBzZXBhcmF0b3I6IHtcbiAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8c3RyaW5nPixcbiAgICBkZWZhdWx0OiAnJyxcbiAgfSxcbiAgaW5wdXRTdHlsZXM6IHtcbiAgICB0eXBlOiBbU3RyaW5nLCBPYmplY3RdIGFzIFByb3BUeXBlPHN0cmluZyB8IGFueT4sXG4gIH0sXG4gIGZpZWxkQ2xhc3Nlczoge1xuICAgIHR5cGU6IFtTdHJpbmcsIEFycmF5XSBhcyBQcm9wVHlwZTxzdHJpbmdbXSB8IHN0cmluZz4sXG4gIH0sXG4gIGlucHV0Q2xhc3Nlczoge1xuICAgIHR5cGU6IFtTdHJpbmcsIEFycmF5XSBhcyBQcm9wVHlwZTxzdHJpbmdbXSB8IHN0cmluZz4sXG4gIH0sXG4gIGNvbmRpdGlvbmFsQ2xhc3M6IHtcbiAgICB0eXBlOiBBcnJheSBhcyBQcm9wVHlwZTxzdHJpbmdbXT4sXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gIGF1dG9mb2N1czoge1xuICAgIHR5cGU6IEJvb2xlYW4gYXMgUHJvcFR5cGU8Ym9vbGVhbj4sXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIHBsYWNlaG9sZGVyOiB7XG4gICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPHN0cmluZz4sXG4gICAgZGVmYXVsdDogJyAnLFxuICB9LFxufSlcblxuY29uc3QgaW5wdXQgPSByZWY8SFRNTElucHV0RWxlbWVudCB8IG51bGw+KG51bGwpIGFzIFJlZjxIVE1MSW5wdXRFbGVtZW50PlxuY29uc3QgYWN0aXZlSW5wdXQgPSByZWY8bnVtYmVyPigwKVxuY29uc3QgZGlzYWJsZWQgPSByZWY8Ym9vbGVhbltdPihbLi4uQXJyYXkocHJvcHMubnVtKS5rZXlzKCldLm1hcCgoKSA9PiB0cnVlKSlcbmNvbnN0IHBpbiA9IHJlZjxzdHJpbmc+KCcnKVxuXG5jb25zdCBkaWdpdHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMCB9LCAoXywgaSkgPT4gaS50b1N0cmluZygpKVxuXG5mdW5jdGlvbiBmb2N1c0FuZFNlbGVjdElucHV0KGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gIGlucHV0LmZvY3VzKClcbiAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMClcbiAgaW5wdXQuc2VsZWN0KClcbn1cbmZ1bmN0aW9uIGhhbmRsZU9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XG4gIGdldElucHV0VmFsdWVBdChhY3RpdmVJbnB1dC52YWx1ZSk/LmJsdXIoKVxuICBwaW4udmFsdWUgPSBldmVudC5jbGlwYm9hcmREYXRhXG4gICAgLmdldERhdGEoJ3RleHQvcGxhaW4nKVxuICAgIC5zbGljZSgwLCBwcm9wcy5udW0gLSBhY3RpdmVJbnB1dC52YWx1ZSlcbiAgICAuc3BsaXQoJycpXG4gICAgLm1hcChlbGVtID0+IE51bWJlcihlbGVtKSlcbiAgICAuZmlsdGVyKGVsZW0gPT4gTnVtYmVyLmlzSW50ZWdlcihlbGVtKSlcbiAgICAubWFwKCh2YWx1ZSwgaSkgPT4gaW5wdXRWYWx1ZShTdHJpbmcodmFsdWUpLCBpKSlcbiAgICAuam9pbignJylcbiAgcmV0dXJuIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbn1cbmZ1bmN0aW9uIGlucHV0VmFsdWUodmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlciA9IGFjdGl2ZUlucHV0LnZhbHVlKSB7XG4gIHJldHVybiBnZXRJbnB1dFZhbHVlQXQoaW5kZXgpLnZhbHVlID0gdmFsdWVbMF0gPz8gJydcbn1cbmZ1bmN0aW9uIGdldElucHV0VmFsdWVBdChrZXk6IG51bWJlcikge1xuICByZXR1cm4gaW5wdXQudmFsdWUuYXQoa2V5KVxufVxuZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoKSB7XG4gIHBpbi52YWx1ZSA9IGdldFBpbigpXG59XG5mdW5jdGlvbiBnZXRQaW4oKSB7XG4gIGxldCBzdHIgPSAnJ1xuICBmb3IgKGNvbnN0IHsgdmFsdWUgfSBvZiBpbnB1dC52YWx1ZSkge1xuICAgIHN0ciArPSB2YWx1ZVxuICB9XG4gI
536HJldHVybiBzdHJcbn1cbmZ1bmN0aW9uIGhhbmRsZU9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICBpZiAocHJvcHMubG9hZGluZykge1xuICAgIHJldHVybiBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cbiAgY29uc3QgeyBrZXksIGNvZGUgfSA9IGV2ZW50XG4gIGlmIChjb2RlID09PSAnS2V5VicpIHtcbiAgICByZXR1cm5cbiAgfVxuICBzd2l0Y2ggKGtleSkge1xuICAgIGNhc2UgJ0JhY2tzcGFjZSc6IHtcbiAgICAgIGlmIChhY3RpdmVJbnB1dC52YWx1ZSA9PT0gcHJvcHMubnVtIC0gMSAmJiBnZXRJbnB1dFZhbHVlQXQocHJvcHMubnVtIC0gMSkudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpbnB1dFZhbHVlKCcnKVxuICAgICAgaWYgKGFjdGl2ZUlucHV0LnZhbHVlID4gMCkge1xuICAgICAgICBpbnB1dFZhbHVlKCcnLCBhY3RpdmVJbnB1dC52YWx1ZSAtIDEpXG4gICAgICB9XG4gICAgICBwaW4udmFsdWUgPSBnZXRQaW4oKVxuICAgICAgYnJlYWtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgaWYgKChjb2RlLnN0YXJ0c1dpdGgoJ0RpZ2l0JykgfHwgY29kZS5zdGFydHNXaXRoKCdOdW1wYWQnKSkgJiYgZGlnaXRzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgaW5wdXRWYWx1ZShrZXkpXG4gICAgICAgIHBpbi52YWx1ZSA9IGdldFBpbigpXG4gICAgICB9XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG59XG53YXRjaChcbiAgKCkgPT4gcGluLnZhbHVlLFxuICAobmV3VmFsLCBvbGRWYWwpID0+IHtcbiAgICBpZiAobmV3VmFsID09PSBvbGRWYWwpIHtcbiAgICAgIHJldHVyblxuICAgI
536H1cbiAgICBlbWl0KCdjaGFuZ2UnLCBuZXdWYWwpXG4gICAgaWYgKHByb3BzLm51bSA9PT0gbmV3VmFsLmxlbmd0aCkge1xuICAgICAgZW1pdCgnY29tcGxldGUnLCBuZXdWYWwpXG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gTWF0aC5taW4obmV3VmFsLmxlbmd0aCwgcHJvcHMubnVtIC0gMSlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc2FibGVkLnZhbHVlLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgZGlzYWJsZWQudmFsdWUuc3BsaWNlKGksIDEsIGkgIT09IHZhbHVlKVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGFjdGl2ZUlucHV0LnZhbHVlID0gdmFsdWVcbiAgICB9KVxuICB9LFxuKVxud2F0Y2goXG4gICgpID0+IGFjdGl2ZUlucHV0LnZhbHVlLFxuICAobmV3VmFsLCBvbGRWYWwpID0+IHtcbiAgICBpZiAob2xkVmFsICE9PSBuZXdWYWwgJiYgbmV3VmFsIDw9IHByb3BzLm51bSAtIDEpIHtcbiAgICAgIGNvbnN0IGVsZW0gPSBnZXRJbnB1dFZhbHVlQXQobmV3VmFsKVxuICAgICAgaWYgKCFlbGVtLmRpc2FibGVkKSB7XG4gICAgICAgIGZvY3VzQW5kU2VsZWN0SW5wdXQoZWxlbSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4pXG5vbk1vdW50ZWQoKCkgPT4ge1xuICBpZiAocHJvcHMuYXV0b2ZvY3VzKSB7XG4gICAgZm9jdXNBbmRTZWxlY3RJbnB1dChnZXRJbnB1dFZhbHVlQXQoMCkpXG4gIH1cbiAgZGlzYWJsZWQudmFsdWUuc3BsaWNlKGRpc2FibGVkLnZhbHVlLCAwLCBmYWxzZSlcbiAgaWYgKHByb3BzLm1vZGVsVmFsdWUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLm1vZGVsVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlucHV0VmFsdWUocHJvcHMubW9kZWxWYWx1ZVtpXSwgaSlcbiAgICB9XG4gIH1cbn0pXG5kZWZpbmVFeHBvc2Uoe1xuICBibHVyKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubnVtOyBpKyspIHtcbiAgICAgIGdldElucHV0VmFsdWVBdChpKS5ibHVyKClcbiAgICB9XG4gIH0sXG4gIGZvY3VzKCkge1xuICAgIGZvY3VzQW5kU2VsZWN0SW5wdXQoZ2V0SW5wdXRWYWx1ZUF0KGFjdGl2ZUlucHV0LnZhbHVlID0gMCkpXG4gIH0sXG4gIGNsZWFyKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubnVtOyBpKyspIHtcbiAgICAgIGlucHV0VmFsdWUoJycsIGkpXG4gICAgfVxuICAgIHBpbi52YWx1ZSA9ICcnXG4gIH0sXG4gIGdldFBpbixcbn0pXG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuYm9keS5ib2R5LS1kYXJrIC5vdHAtaW5wdXQge1xuICBjb2xvcjogd2hpdGU7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuPC9zdHlsZT5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiIHNjb3BlZD5cbkBtaXhpbiBkZXNpZ24tY29udHJvbCgkY29sb3IpIHtcbiAgOmRlZXAoLnEtZmllbGRfX2NvbnRyb2wpIHtcbiAgICAmOmhvdmVyOjpiZWZvcmUge1xuICAgICAgYm9yZGVyLWNvbG9yOiAkY29sb3I7XG4gICAgfVxuICAgICYucm93IHtcbiAgICAgIG91dGxpbmUtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgY29sb3I6ICRjb2xvcjtcbiAgICB9XG4gICAgJjpoYXMoaW5wdXQ6bm90KDpwbGFjZWhvbGRlci1zaG93bikpIHtcbiAgICAgICY6OmJlZm9yZSxcbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAkY29sb3I7XG4gICAgICAgIGNvbG9yOiAkY29sb3I7XG4gICAgICAgIGJvcmRlci13aWR0aDogMnB4O1xuICAgICAgfVxuICAgIH1cbiAgICAmOjphZnRlciB7XG4gICAgICBjb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgfVxuICAgICY6OmJlZm9yZSB7XG4gICAgICBib3JkZXItd2lkdGg6IDJweDtcbiAgICB9XG4gIH1cbn1cbjpkZWVwKC5vdHAtaW5wdXQpIHtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogbm9uZTtcbiAgbWluLXdpZHRoOiAyNHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG91dGxpbmU6IG5vbmU7XG5cbiAgJjppbnZhbGlkLFxuICAmOnZhbGlkLFxuICAmOmFjdGl2ZSxcbiAgJjpmb2N1cy12aXNpYmxlLFxuICAmOmhvdmVyIHtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG4gICY6Zm9jdXMtdmlzaWJsZSxcbiAgJjpmb2N1cyxcbiAgJjp0YXJnZXQge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gIH1cbiAgJjo6c2VsZWN0aW9uIHtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgfVxuICAmOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuICAmOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgIG1hcmdpbjogMDtcbiAgfVxuICAmOjpwbGFjZWhvbGRlciB7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB9XG59XG46aG9zdCB7XG4gIGxhYmVsIHtcbiAgICBjdXJzb3I6IHRleHQ7XG4gIH1cbn1cbi5tYWluLWZpZWxkIHtcbiAgd2lkdGg6IGZpdC1jb250ZW50O1xuXG4gIDpkZWVwKC5vdHAtZmllbGQpIHtcbiAgICBpbnB1dCxcbiAgICAucS1maWVsZF9fY29udHJvbC1jb250YWluZXIge1xuICAgICAgb3BhY2l0eTogMSAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAucS1maWVsZF9faW5uZXIge1xuICAgICAgY3Vyc29yOiB0ZXh0O1xuICAgIH1cbiAgfVxuICAucS1maWVsZCB7XG4gICAgQGluY2x1ZGUgZGVzaWduLWNvbnRyb2woJHByaW1hcnkpO1xuICB9XG4gICYuY29tcGxldGUge1xuICAgIEBpbmNsdWRlIGRlc2lnbi1jb250cm9sKCRwb3NpdGl2ZSk7XG4gIH1cbiAgJi5xLWZpZWxkLS1lcnJvciB7XG4gICAgQGluY2x1ZGUgZGVzaWduLWNvbnRyb2woJG5lZ2F0aXZlKTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPHEtZGlhbG9nIHYtbW9kZWw9XCJzaG93XCIgcGVyc2lzdGVudCBuby1zaGFrZSBiYWNrZHJvcC1maWx0ZXI9XCJibHVyKDRweClcIj5cbiAgICA8cS1jYXJkIGNsYXNzPVwicS1wYS1zbVwiIHN0eWxlPVwid2lkdGg6IDYwMHB4OyBoZWlnaHQ6IDQwMHB4XCI+XG4gICAgICA8cS1jYXJkLXNlY3Rpb24gYWxpZ249XCJjZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImliZi1oNiB0ZXh0LXdlaWdodC1ib2xkXCI+RW50ZXIgeW91ciBWZXJpZmljYXRpb24gQ29kZTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWJmLWgxMCBxLW10LXNtIHRleHQtZ3JleS02XCI+XG4gICAgICAgICAgV2Ugc2VudCBhIGNvZGUgdG9cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtcHJpbWFyeVwiPnt7XG4gICAgICAgICAgICBwcm9wcy5zZW5kaW5nTWV0aG9kPy52YWx1ZSA9PT0gXCJlbWFpbFwiXG4gICAgICAgICAgICAgID8gbWFza1RleHQocHJvcHMuc2VuZGluZ01ldGhvZD8uc3VidGl0bGUgfHwgXCItLVwiLCAyLCAxMCwgXCLigKJcIilcbiAgICAgICAgICAgICAgOiBtYXNrVGV4dChwcm9wcy5zZW5kaW5nTWV0aG9kPy5zdWJ0aXRsZSB8fCBcIi0tXCIsIDQsIDIsIFwi4oCiXCIpXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9xLWNhcmQtc2VjdGlvbj5cbiAgICAgIDxxLWNhcmQtc2VjdGlvbiBhbGlnbj1cImNlbn
536RlclwiPlxuICAgICAgICA8UU90cFxuICAgICAgICAgIHYtaWY9XCIhb3RwU3VjY2Vzc1wiXG4gICAgICAgICAgcmVmPVwib3RwSW5wdXRSZWZcIlxuICAgICAgICAgIGZpZWxkLWNsYXNzZXM9XCJxLW14LXhzXCJcbiAgICAgICAgICBpbnB1dC1zdHlsZXM9XCJtYXgtd2lkdGg6IDQycHg7IGhlaWdodDogNTVweDtcIlxuICAgICAgICAgIDppbnB1dC1jbGFzc2VzPVwiW290cEZpZWxkQ2xhc3NlcywgJ2liZi1oOCddXCJcbiAgICAgICAgICBvdXRsaW5lZFxuICAgICAgICAgIGhpZGVcbiAgICAgICAgICBiZy1jb2xvcj1cImdyZXktMVwiXG4gICAgICAgICAgQGNoYW5nZT1cInJlc2V0T1RQXCJcbiAgICAgICAgICBAY29tcGxldGU9XCJ2ZXJpZnlDb2RlXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8ZGl2IGlkPVwibWVzc2FnZVwiPlxuICAgICAgICAgIDxkaXYgdi1pZj1cIm90cFN1Y2Nlc3NcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpYmYtaDEwIHRleHQtd2VpZ2h0LW1lZGl1bSB0ZXh0LXBvc2l0aXZlXCI+XG4gICAgICAgICAgICAgIFZlcmlmaWNhdGlvbiBTdWNjZXNzZnVsXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImliZi1oMTAgdGV4dC13ZWlnaHQtbWVkaXVtIHRleHQtbmVnYXRpdmVcIlxuICAgICAgICAgICAgICB2LWlmPVwib3RwRmFpbFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFZlcmlmaWNhdGlvbiBGYWlsZWRcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvcS1jYXJkLXNlY3Rpb24+XG5cbiAgICAgIDxxLWNhcmQtc2VjdGlvbiBjbGFzcz1cInEtcHkteHNcIiBhbGlnbj1cImNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIiB2LWlmPVwib3RwU3VjY2Vzc1wiPlxuICAgICAgICAgIDxxLWJ0blxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgIGljb249XCJtZGktcm9ja2V0LWxhdW5jaFwiXG4gICAgICAgICAgICBsYWJlbD1cIlN0YXJ0XCJcbiAgICAgICAgICAgIEBjbGljaz1cIiRyb3V0ZXIucHVzaCh7IG5hbWU6IHByb3BzLnJlZGlyZWN0IH0pXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2FwdGlvbiB0ZXh0LWdyZXkgcS1tdC1tZFwiIHYtZWxzZT5cbiAgICAgICAgICBEaWRuJ3QgcmVjZWl2ZSB0aGUgY29kZT9cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXByaW1hcnlcIlxuICAgICAgICAgICAgOnN0eWxlPVwie1xuICAgICAgICAgICAgICBjdXJzb3I6IHRpbWVyID4gMCA/ICdub3QtYWxsb3dlZCcgOiAncG9pbnRlcicsXG4gICAgICAgICAgICAgIGNvbG9yOiB0aW1lciA+IDAgPyAnIzE5NzZEMicgOiAncHJpbWFyeScsXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICAgIEBjbGljaz1cIm9uUmVzZW5kQ29kZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4+UmVzZW5kIENvZGU8L3NwYW4+IDxzcGFuIHYtaWY9XCJ0aW1lciA+IDBcIj57eyB0aW1lciB9fXM8L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvcS1jYXJkLXNlY3Rpb24+XG5cbiAgICAgIDwhLS0gaW5uZXIgbG9hZGluZyAtLT5cbiAgICAgIDxxLWlubmVyLWxvYWRpbmdcbiAgICAgICAgOnNob3dpbmc9XCJ2aXNpYmxlXCJcbiAgICAgICAgbGFiZWw9XCJQbGVhc2Ugd2FpdC4uLlwiXG4gICAgICAgIGxhYmVsLWNsYXNzPVwidGV4dC10ZWFsXCJcbiAgICAgICAgbGFiZWwtc3R5bGU9XCJmb250LXNpemU6IDEuMWVtXCJcbiAgICAgIC8+XG4gICAgPC9xLWNhcmQ+XG4gIDwvcS1kaWFsb2c+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IHNldHVwPlxuaW1wb3J0IHsgdXNlUXVhc2FyIH0gZnJvbSBcInF1YXNhclwiO1xuaW1wb3J0IFFPdHAgZnJvbSBcInF1YXNhci1hcHAtZXh0ZW5zaW9uLXEtb3RwXCI7XG5pbXBvcnQgeyBhdXRoQVBJIH0gZnJvbSBcInNyYy9ib290L2F4aW9zXCI7XG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCBvbkJlZm9yZVVubW91bnQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VSb3V0ZXIgfSBmcm9tIFwidnVlLXJvdXRlclwiO1xuXG5jb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKTtcblxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XG4gIHZlcmlmeUlkOiB7XG4gICAgdHlwZTogU3RyaW5nLFxuICAgIGRlZmF1bHQ6IFwiXCIsXG4gIH0sXG5cbiAgc2VuZGluZ01ldGhvZDoge1xuICAgIHR5cGU6IE9iamVjdCxcbiAgICBkZWZhdWx0OiAoKSA9PiAoe1xuICAgICAgdmFsdWU6IFwic21zXCIsXG4gICAgICBsYWJlbDogXCJQaG9uZVwiLFxuICAgICAgaWNvbjogXCJtZGktcGhvbmUtb3V0bGluZVwiLFxuICAgICAgc3VidGl0bGU6IFwiVmVyaWZ5IHdpdGggc2lnbnVwIHBob25lIG51bWJlclwiLFxuICAgIH0pLFxuICB9LFxuXG4gIHNlbmRpbmdfdHlwZToge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgICBkZWZhdWx0OiBcImVtYWlsXCIsXG4gIH0sXG5cbiAgcmVkaXJlY3Q6IHtcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgZGVmYXVsdDogXCJsb2dpbi1wYWdlXCIsXG4gIH0sXG59KTtcblxuY29uc3QgJHEgPSB1c2VRdWFzYXIoKTtcbmNvbnN0IHNob3cgPSByZWYoZmFsc2UpO1xuY29uc3Qgb3RwU3VjY2VzcyA9IHJlZihmYWxzZSk7XG5jb25zdCBvdHBGYWlsID0gcmVmKGZhbHNlKTtcblxuY29uc3QgdGltZXIgPSByZWYoNTkpO1xubGV0IGNvdW50ZG93biA9IG51bGw7XG5cbmNvbnN0IHZpc2libGUgPSByZWYoZmFsc2UpO1xuXG5jb25zdCB0b2dnbGVPVFAgPSAoKSA9PiB7XG4gIHNob3cudmFsdWUgPSAhc2hvdy52YWx1ZTtcbiAgaWYgKHNob3cudmFsdWUpIHN0YXJ0Q291bnRkb3duKCk7XG59O1xuXG5jb25zdCBvdHBJbnB1dFJlZiA9IHJlZihudWxsKTtcblxuZnVuY3Rpb24gbWFza1RleHQodmFsdWUsIGtlZXBTdGFydCA9IDIsIGtlZXBFbmQgPSAyLCBtYXNrQ2hhciA9IFwi4oCiXCIpIHtcbiAgY29uc3QgcyA9IFN0cmluZyh2YWx1ZSB8fCBcIlwiKTtcbiAgaWYgKCFzKSByZXR1cm4gXCJcIjtcbiAgaWYgKHMubGVuZ3RoIDw9IGtlZXBTdGFydCArIGtlZXBFbmQpIHJldHVybi
536BzO1xuICBjb25zdCBtaWRMZW4gPSBzLmxlbmd0aCAtIGtlZXBTdGFydCAtIGtlZXBFbmQ7XG4gIHJldHVybiBzLnNsaWNlKDAsIGtlZXBTdGFydCkgKyBtYXNrQ2hhci5yZXBlYXQobWlkTGVuKSArIHMuc2xpY2UoLWtlZXBFbmQpO1xufVxuXG5jb25zdCBvbk9UUENsZWFyID0gKCkgPT4ge1xuICBvdHBJbnB1dFJlZi52YWx1ZS5jbGVhcigpO1xufTtcblxuY29uc3QgcmVzZXRPVFAgPSAoKSA9PiB7XG4gIG90cFN1Y2Nlc3MudmFsdWUgPSBmYWxzZTtcbiAgb3RwRmFpbC52YWx1ZSA9IGZhbHNlO1xufTtcblxuY29uc3QgdmVyaWZ5Q29kZSA9IGFzeW5jIChjb2RlKSA9PiB7XG4gIHZpc2libGUudmFsdWUgPSB0cnVlOyAvLyBzdGFydCBsb2FkaW5nXG5cbiAgY29uc3QgZW5kX3BvaW50ID1cbiAgICBwcm9wcy5zZW5kaW5nX3R5cGUgPT09IFwiZm9yZ2V0LXBhc3N3b3JkXCJcbiAgICAgID8gXCIvYXBpL3YxL2N1c3RvbWVyL3ZlcmlmeS1wYXNzLW90cFwiXG4gICAgICA6IFwiL2FwaS92MS9jdXN0b21lci92ZXJpZnktb3RwXCI7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhdXRoQVBJLnBvc3QoZW5kX3BvaW50LCB7XG4gICAgICB2ZXJpZnlJZDogcHJvcHMudmVyaWZ5SWQsXG4gICAgICB0eXBlOiBwcm9wcy5zZW5kaW5nTWV0aG9kLnZhbHVlLFxuICAgICAgb3RwQ29kZTogcGFyc2VJbnQoY29kZSksXG4gICAgfSk7XG5cbiAgICBpZiAoIWRhdGEuc3RhdHVzKSB7XG4gICAgICAvLyBmYWlsIE9UUFxuICAgICAgJHEubm90aWZ5KHtcbiAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlIHx8IFwiRmFpbCB2ZXJpZnlpbmcgT1RQXCIsXG4gICAgICAgIHR5cGU6IFwibmVnYXRpdmVcIixcbiAgICAgICAgcG9zaXRpb246IFwidG9wLXJpZ2h0XCIsXG4gICAgICB9KTtcblxuICAgICAgb3RwU3VjY2Vzcy52YWx1ZSA9IGZhbHNlO1xuICAgICAgb3RwRmFpbC52YWx1ZSA9IHRydWU7XG5cbiAgICAgIHJlc2V0VGltZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc3VjY2VzcyBPVFBcbiAgICAgIG90cFN1Y2Nlc3MudmFsdWUgPSB0cnVlO1xuICAgICAgb3RwRmFpbC52YWx1ZSA9IGZhbHNlO1xuICAgICAgY2xlYXJJbnRlcnZhbChjb3VudGRvd24pO1xuICAgICAgcm91dGVyLnB1c2goeyBuYW1lOiBwcm9wcy5yZWRpcmVjdCB9KTsgLy8gYXV0byBkaXJlY3QgdG8gdGhlIGRlc3RpbmF0aW9uIHBhZ2VcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgJHEubm90aWZ5KHtcbiAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgXCJWZXJpZnlpbmcgT1RQIEVycm9yXCIsXG4gICAgICB0eXBlOiBcIm5lZ2F0aXZlXCIsXG4gICAgICBwb3NpdGlvbjogXCJ0b3AtcmlnaHRcIixcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHZpc2libGUudmFsdWUgPSBmYWxzZTtcbiAgICB9LCAyMDAwKTtcbiAgfVxufTtcblxuY29uc3Qgb25SZXNlbmRDb2RlID0gKCkgPT4ge1xuICBpZiAodGltZXIudmFsdWUgPiAwKSB7XG4gICAgcmV0dXJuOyAvLyBzdGlsbCB3YWl0aW5nXG4gIH1cblxuICByZXNlbmRPVFAoKTtcbn07XG5cbmNvbnN0IHJlc2V0VGltZXIgPSAoKSA9PiB7XG4gIHRpbWVyLnZhbHVlID0gNTk7XG4gIHN0YXJ0Q291bnRkb3duKCk7XG59O1xuXG5jb25zdCBzdGFydENvdW50ZG93biA9ICgpID0+IHtcbiAgY2xlYXJJbnRlcnZhbChjb3VudGRvd24pO1xuICBjb3VudGRvd24gPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHRpbWVyLnZhbHVlID4gMCkge1xuICAgICAgdGltZXIudmFsdWUgLT0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2xlYXJJbnRlcnZhbChjb3VudGRvd24pO1xuICAgIH1cbiAgfSwgMTAwMCk7XG59O1xuXG5jb25zdCByZXNlbmRPVFAgPSBhc3luYyAoKSA9PiB7XG4gIHZpc2libGUudmFsdWUgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXV0aEFQSS5wb3N0KFxuICAgICAgXCIvYXBpL3YxL2N1c3RvbWVyL3Jlc2VuZC1vdHBcIixcbiAgICAgIHtcbiAgICAgICAgdmVyaWZ5SWQ6IHByb3BzLnZlcmlmeUlkLFxuICAgICAgICB0eXBlOiBwcm9wcy5zZW5kaW5nTWV0aG9kLnZhbHVlLFxuICAgICAgICBzZW5kaW5nX3R5cGU6IHByb3BzLnNlbmRpbmdfdHlwZSA9PT0gXCJmb3JnZXQtcGFzc3dvcmRcIiA/IDEgOiAwLFxuICAgICAgfSxcbiAgICAgIHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgaWYgKCFkYXRhIHx8ICFkYXRhLnN0YXR1cykge1xuICAgICAgJHEubm90aWZ5KHtcbiAgICAgICAgbWVzc2FnZTogZGF0YT8ubWVzc2FnZSB8fCBcIlJlc2VuZCBPVFAgRmFpbGVkXCIsXG4gICAgICAgIHR5cGU6IFwibmVnYXRpdmVcIixcbiAgICAgICAgcG9zaXRpb246IFwidG9wLXJpZ2h0XCIsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgJHEubm90aWZ5KHtcbiAgICAgICAgbWVzc2FnZTogZGF0YS5tZXNzYWdlIHx8IFwiT1RQIFJlc2VudCBTdWNjZXNzZnVsbHlcIixcbiAgICAgICAgdHlwZTogXCJwb3NpdGl2ZVwiLFxuICAgICAgICBwb3NpdGlvbjogXCJ0b3AtcmlnaHRcIixcbiAgICAgIH0pO1xuICAgICAgcmVzZXRUaW1lcigpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAkcS5ub3RpZnkoe1xuICAgICAgbWVzc2FnZTogZXJyb3IucmVzcG9uc2U/LmRhdGE/Lm1lc3NhZ2UgfHwgZXJyb3IubWVzc2FnZSB8fCBcIlJlc2VuZCBPVFAgRXJyb3JcIixcbiAgICAgIHR5cGU6IFwibmVnYXRpdmVcIixcbiAgICAgIHBvc2l0aW9uOiBcInRvcC1yaWdodFwiLFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIHZpc2libGUudmFsdWUgPSBmYWxzZTtcbiAgfVxufTtcblxuLy8gRHluYW1pY2FsbHkgY29tcHV0ZSBPVFAgaW5wdXQgY2xhc3NlcyBiYXNlZCBvbiB2YWxpZGF0aW9uIHJlc3VsdFxuY29uc3Qgb3RwRmllbGRDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xuICBpZiAob3RwU3VjY2Vzcy52YWx1ZSkgcmV0dXJuIFwib3RwLXZhbGlkIG90cC1kaXNhYmxlZFwiO1xuICBpZiAob3RwRmFpbC52YWx1ZSkgcmV0dXJuIFwib3RwLWludmFsaWQgXCI7XG4gIHJldHVybi
536BcIlwiOyAvLyBEZWZhdWx0IGNsYXNzXG59KTtcblxuZGVmaW5lRXhwb3NlKHtcbiAgdG9nZ2xlT1RQLFxufSk7XG5cbm9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gIGNsZWFySW50ZXJ2YWwoY291bnRkb3duKTtcbn0pO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLyogU3R5bGluZyBmb3IgdmFsaWQgYW5kIGludmFsaWQgT1RQIHN0YXRlcyAqL1xuLm90cC12YWxpZCB7XG4gIGJvcmRlcjogMi41cHggc29saWQgZ3JlZW4gIWltcG9ydGFudDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4ub3RwLWludmFsaWQge1xuICBib3JkZXI6IDIuNXB4IHNvbGlkIHJlZCAhaW1wb3J0YW50O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbi5vdHAtZGlzYWJsZWQge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbjwvc3R5bGU+XG4iXSwibmFtZXMiOlsiaW5wdXQiLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX2NyZWF0ZVZOb2RlIiwiX3VucmVmIiwiX25vcm1hbGl6ZUNsYXNzIiwiX29wZW5CbG9jayIsIl9GcmFnbWVudCIsIl9yZW5kZXJMaXN0IiwiX3dpdGhDdHgiLCJfY3JlYXRlRWxlbWVudFZOb2RlIiwiX25vcm1hbGl6ZVN0eWxlIiwiX2hvaXN0ZWRfMSIsIl90b0Rpc3BsYXlTdHJpbmciLCJfY3JlYXRlQ29tbWVudFZOb2RlIiwiX3JlbmRlclNsb3QiLCJfY3JlYXRlQmxvY2siLCIkcm91dGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUZBLFVBQU0sT0FBTztBQUNiLFVBQU0sUUFBUTtBQWlDUixVQUFBLFFBQVEsSUFBNkIsSUFBSTtBQUN6QyxVQUFBLGNBQWMsSUFBWSxDQUFDO0FBQ2pDLFVBQU0sV0FBVyxJQUFlLENBQUMsR0FBRyxNQUFNLE1BQU0sR0FBRyxFQUFFLEtBQU0sQ0F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

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.