PageSourceSearch

https://www.ibf.com.kh/assets/MyLearningPage.f7b9b4c0.js

js ibf.com.kh collected 2026-10-09 21:43:41 UTC 194,605 bytes, 1,800 lines download raw bytes

1import { Q as QPage } from "./QPage.89183c37.js";
2import { B as BackBtnPrimary } from "./BackBtnPrimary.eb804f1c.js";
3import { _ as _export_sfc, m as openBlock, n as createElementBlock, F as Fragment, y as renderList, j as createVNode, x as withCtx, aM as QCardSection, p as createBaseVNode, Q as QIcon, aN as QCard, c2 as useLearningStore, r as ref, c as computed, o as onMounted, w as watch, A as createBlock, t as toDisplayString, q as normalizeClass, B as createTextVNode, v as createCommentVNode, a9 as useUserStore, a5 as QBtn, C as QSeparator, bv as QDialog, b3 as QCardActions, R as Notify, a7 as withDirectives, c0 as vShow, Z as reactive, l as resolveComponent, bY as API_CONFIG } from "./index.6f7a794b.js";
4import { Q as QSkeleton } from "./QSkeleton.54d5b63a.js";
5import { Q as QLinearProgress } from "./QLinearProgress.2d0cdd4e.js";
6import { o as isValid, f as format } from "./format.76edbff1.js";
7import { Q as QBadge } from "./QBadge.f0332250.js";
8import { u as useQuasar } from "./use-quasar.1ed7d5ca.js";
9import "./constants.3aa83b60.js";
10const _sfc_main$4 = {};
11const _hoisted_1$4 = { class: "q-gutter-y-md" };
12const _hoisted_2$4 = { class: "row q-gutter-lg" };
13const _hoisted_3$3 = { class: "col-12 col-md-auto" };
14const _hoisted_4$3 = { class: "col-12 col-md" };
15const _hoisted_5$3 = { class: "row q-gutter-md q-my-xs" };
16const _hoisted_6$3 = { class: "row items-center" };
17const _hoisted_7$3 = { class: "row items-center" };
18const _hoisted_8$2 = { class: "col-12 col-md-auto" };
19function _sfc_render(_ctx, _cache) {
20  return openBlock(), createElementBlock("section", _hoisted_1$4, [
21    (openBlock(), createElementBlock(Fragment, null, renderList(3, (i) => {
22      return createVNode(QCard, {
23        square: "",
24        flat: "",
25        bordered: "",
26        key: i
27      }, {
28        default: withCtx(() => [
29          createVNode(QCardSection, null, {
30            default: withCtx(() => [
31              createBaseVNode("div", _hoisted_2$4, [
32                createBaseVNode("div", _hoisted_3$3, [
33                  createVNode(QSkeleton, {
34                    height: "150px",
35                    width: "150px"
36                  })
37                ]),
38                createBaseVNode("div", _hoisted_4$3, [
39                  createVNode(QSkeleton, {
40                    type: "text",
41                    width: "90%"
42                  }),
43                  createVNode(QSkeleton, {
44                    type: "text",
45                    width: "100px"
46                  }),
47                  createBaseVNode("div", _hoisted_5$3, [
48                    createBaseVNode("div", _hoisted_6$3, [
49                      createVNode(QIcon, {
50                        name: "mdi-earth",
51                        color: "grey-6",
52                        class: "q-mr-sm",
53                        size: "18px"
54                      }),
55                      createVNode(QSkeleton, {
56                        type: "text",
57                        width: "100px"
58                      })
59                    ]),
60                    createBaseVNode("div", _hoisted_7$3, [
61                      createVNode(QIcon, {
62                        name: "mdi-checkbox-blank-badge-outline",
63                        color: "grey-6",
64                        class: "q-mr-sm",
65                        size: "18px"
66                      }),
67                      createVNode(QSkeleton, {
68                        type: "text",
69                        width: "100px"
70                      })
71                    ])
72                  ])
73                ]),
74                createBaseVNode("div", _hoisted_8$2, [
75                  createVNode(QSkeleton, {
76                    type: "circle",
77                    width: "130px",
78                    height: "130px"
79                  })
80                ])
81              ])
82            ]),
83            _: 1
84          })
85        ]),
86        _: 1
87      });
88    }), 64))
89  ]);
90}
91var OrderItemCardSkeleton = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["render", _sfc_render], ["__file", "OrderItemCardSkeleton.vue"]]);
92var LearningCourseCard_vue_vue_type_style_index_0_scoped_true_lang = "";
93const _hoisted_1$3 = { class: "row no-wrap q-gutter-x-md items-start" };
94const _hoisted_2$3 = { class: "learning-course-card__thumb col-auto" };
95const _hoisted_3$2 = ["src", "alt"];
96const _hoisted_4$2 = {
97  key: 1,
98  class: "learning-course-card__thumb-fallback"
99};
100const _hoisted_5$2 = { class: "col" };
101const _hoisted_6$2 = {
102  class: "text-weight-medium text-dark ibf-h9 q-mb-xs",
103  style: { "line-height": "1.3" }
104};
105const _hoisted_7$2 = { class: "row q-gutter-xs" };
106const _hoisted_8$1 = { class: "learning-course-card__footer q-px-md q-pb-md" };
107const _hoisted_9$1 = { class: "row items-center justify-between q-mb-xs" };
108const _hoisted_10$1 = { class: "row items-center text-grey-7 ibf-h12" };
109const _hoisted_11$1 = {
110  key: 0,
111  class: "text-grey-8 ibf-h12 text-weight-medium"
112};
113const _sfc_main$3 = {
114  __name: "LearningCourseCard",
115  props: {
116    course: {
117      type: Object,
118      required: true
119    }
120  },
121  emits: ["open"],
122  setup(__props) {
123    const props = __props;
124    const learningStore = useLearningStore();
125    const features = ref({
126      assessments: false,
127      training: false,
128      evaluation: false
129    });
130    const featureItems = computed(() => [
131      {
132        key: "assessments",
133        label: "Assessments",
134        icon: "mdi-clipboard-text-outline",
135        available: features.value.assessments
136      },
137      {
138        key: "training",
139        label: "Training Session",
140        icon: "mdi-calendar-clock-outline",
141        available: features.value.training
142      },
143      {
144        key: "evaluation",
145        label: "Evaluation",
146        icon: "mdi-star-outline",
147        available: features.value.evaluation
148      }
149    ]);
150    const loadFeatures = async () => {
151      var _a;
152      const courseId = (_a = props.course) == null ? void 0 : _a.courseId;
153      if (!courseId) {
154        features.value = {
155          assessments: false,
156          training: false,
157          evaluation: false
158        };
159        return;
160      }
161      const result = await learningStore.serverFetchCourseFeatureAvailability(courseId);
162      features.value = {
163        assessments: Boolean(result == null ? void 0 : result.assessments),
164        training: Boolean(result == null ? void 0 : result.training),
165        evaluation: Boolean(result == null ? void 0 : result.evaluation)
166      };
167    };
168    onMounted(loadFeatures);
169    watch(
170      () => {
171        var _a;
172        return (_a = props.course) == null ? void 0 : _a.courseId;
173      },
174      () => {
175        loadFeatures();
176      }
177    );
178    const progressValue = computed(
179      () => {
180        var _a;
181        return Math.min(100, Math.max(0, Number((_a = props.course) == null ? void 0 : _a.progress) || 0));
182      }
183    );
184    const hasElearningInfo = computed(() => {
185      const course = props.course;
186      if (typeof (course == null ? void 0 : course.has_elearning) === "boolean")
187        return course.has_elearning;
188      return Boolean((course == null ? void 0 : course.pk) && (course == null ? void 0 : course.sk) && (course == null ? void 0 : course.version));
189    });
190    const formatLastAccessed = (value) => {
191      if (!value)
192        return "-- --";
193      try {
194        const date = new Date(value);
195        if (!isValid(date))
196          return "-- --";
197        return format(date, "dd-MMM-yyyy");
198      } catch {
199        return "-- --";
200      }
201    };
202    const lastAccessedLabel = computed(
203      () => {
204        var _a;
205        return formatLastAccessed((_a = props.course) == null ? void 0 : _a.last_access);
206      }
207    );
208    return (_ctx, _cache) => {
209      return openBlock(), createBlock(QCard, {
210        flat: "",
211        bordered: "",
212        class: "learning-course-card cursor-pointer",
213        onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("open", __props.course))
214      }, {
215        default: withCtx(() => [
216          createVNode(QCardSection, { class: "q-pa-md" }, {
217            default: withCtx(() => [
218              createBaseVNode("div", _hoisted_1$3, [
219                createBaseVNode("div", _hoisted_2$3, [
220                  __props.course.thumbnail ? (openBlock(), createElementBlock("img", {
221                    key: 0,
222                    src: __props.course.thumbnail,
223                    alt: __props.course.title,
224                    class: "learning-course-card__thumb-img"
225                  }, null, 8, _hoisted_3$2)) : (openBlock(), createElementBlock("div", _hoisted_4$2, [
226                    createVNode(QIcon, {
227                      name: "mdi-trophy",
228                      size: "28px",
229                      color: "white"
230                    })
231                  ]))
232                ]),
233                createBaseVNode("div", _hoisted_5$2, [
234                  createBaseVNode("div", _hoisted_6$2, toDisplayString(__props.course.title), 1),
235                  createBaseVNode("div", _hoisted_7$2, [
236                    (openBlock(true), createElementBlock(Fragment, null, renderList(featureItems.value, (item) => {
237                      return openBlock(), createElementBlock("span", {
238                        key: item.key,
239                        class: normalizeClass(["learning-course-card__feature", {
240                          "learning-course-card__feature--available": item.available,
241                          "learning-course-card__feature--unavailable": !item.available
242                        }])
243                      }, [
244                        createVNode(QIcon, {
245                          name: item.icon,
246                          size: "12px",
247                          class: "q-mr-xs"
248                        }, null, 8, ["name"]),
249                        createTextVNode(" " + toDisplayString(item.label), 1)
250                      ], 2);
251                    }), 128))
252                  ])
253                ])
254              ])
255            ]),
256            _: 1
257          }),
258          createBaseVNode("div", _hoisted_8$1, [
259            createBaseVNode("div", _hoisted_9$1, [
260              createBaseVNode("div", _hoisted_10$1, [
261                createVNode(QIcon, {
262                  name: "mdi-clock-outline",
263                  size: "14px",
264                  color: "primary",
265                  class: "q-mr-xs"
266                }),
267                createBaseVNode("span", null, "Last accessed " + toDisplayString(lastAccessedLabel.value), 1)
268              ]),
269              hasElearningInfo.value ? (openBlock(), createElementBlock("span", _hoisted_11$1, toDisplayString(progressValue.value) + "%", 1)) : createCommentVNode("", true)
270            ]),
271            hasElearningInfo.value ? (openBlock(), createBlock(QLinearProgress, {
272              key: 0,
273              rounded: "",
274              size: "6px",
275              value: progressValue.value / 100,
276              color: "green",
277              "track-color": "grey-4"
278            }, null, 8, ["value"])) : createCommentVNode("", true)
279          ])
280        ]),
281        _: 1
282      });
283    };
284  }
285};
286var LearningCourseCard = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-6c9b8e54"], ["__file", "LearningCourseCard.vue"]]);
287var CourseActionsSheet_vue_vue_type_style_index_0_scoped_true_lang = "";
288var CourseActionsSheet_vue_vue_type_style_index_1_lang = "";
289const _hoisted_1$2 = { class: "course-actions-sheet__thumb q-mr-md" };
290const _hoisted_2$2 = ["src", "alt"];
291const _hoisted_3$1 = {
292  key: 1,
293  class: "course-actions-sheet__thumb-fallback"
294};
295const _hoisted_4$1 = {
296  class: "col text-weight-medium text-dark ibf-h8 ellipsis",
297  style: { "line-height": "1.35" }
298};
299const _hoisted_5$1 = { class: "course-actions-sheet__scroll" };
300const _hoisted_6$1 = {
301  key: 0,
302  class: "q-gutter-y-sm q-mb-lg"
303};
304const _hoisted_7$1 = {
305  key: 1,
306  class: "q-mb-lg"
307};
308const _hoisted_8 = { class: "course-actions-sheet__group-label" };
309const _hoisted_9 = { class: "course-actions-sheet__assessment-list" };
310const _hoisted_10 = ["disabled", "onClick"];
311const _hoisted_11 = { class: "col text-left" };
312const _hoisted_12 = { class: "row items-center q-gutter-x-sm no-wrap" };
313const _hoisted_13 = { class: "text-weight-medium text-dark" };
314const _hoisted_14 = {
315  key: 0,
316  class: "text-grey-6 ibf-h12 q-mt-xs"
317};
318const _hoisted_15 = {
319  key: 1,
320  class: "ibf-h12 q-mt-xs text-positive"
321};
322const _hoisted_16 = { key: 0 };
323const _hoisted_17 = {
324  key: 2,
325  class: "ibf-h12 q-mt-xs text-grey-5"
326};
327const _hoisted_18 = {
328  key: 0,
329  class: "course-actions-sheet__empty text-grey-6 ibf-h12"
330};
331const _hoisted_19 = {
332  key: 2,
333  class: "q-gutter-y-sm q-mb-lg"
334};
335const _hoisted_20 = {
336  key: 3,
337  class: "course-actions-sheet__assessment-list q-mb-lg"
338};
339const _hoisted_21 = ["disabled", "onClick"];
340const _hoisted_22 = { class: "course-actions-sheet__assessment-icon course-actions-sheet__assessment-icon--training" };
341const _hoisted_23 = { class: "col text-left" };
342const _hoisted_24 = { class: "row items-center q-gutter-x-sm" };
343const _hoisted_25 = { class: "text-weight-medium text-dark" };
344const _hoisted_26 = {
345  key: 0,
346  class: "text-grey-7 text-weight-regular"
347};
348const _hoisted_27 = { class: "text-grey-6 ibf-h12 q-mt-xs" };
349const _hoisted_28 = {
350  key: 0,
351  class: "ibf-h12 q-mt-xs text-positive"
352};
353const _hoisted_29 = {
354  key: 0,
355  class: "course-actions-sheet__empty text-grey-6 ibf-h12"
356};
357const _hoisted_30 = { class: "course-actions-sheet__footer" };
358const _hoisted_31 = { class: "q-gutter-y-sm" };
359const _hoisted_32 = { class: "iqr-ticket" };
360const _hoisted_33 = {
361  key: 0,
362  class: "iqr-ticket__course"
363};
364const _hoisted_34 = {
365  key: 1,
366  class: "iqr-ticket__candidate"
367};
368const _hoisted_35 = ["src"];
369const _hoisted_36 = {
370  key: 3,
371  class: "iqr-ticket__code-block"
372};
373const _hoisted_37 = { class: "iqr-ticket__code-value" };
374const _sfc_main$2 = {
375  __name: "CourseActionsSheet",
376  props: {
377    modelValue: {
378      type: Boolean,
379      default: false
380    },
381    course: {
382      type: Object,
383      default: null
384    }
385  },
386  emits: ["update:modelValue", "continue"],
387  setup(__props, { emit: __emit }) {
388    const props = __props;
389    const emit = __emit;
390    const learningStore = useLearningStore();
391    const userStore = useUserStore();
392    const $q = useQuasar();
393    const assessmentsLoading = ref(false);
394    const assessmentsPayload = ref(null);
395    const trainingsLoading = ref(false);
396    const trainingSessions = ref([]);
397    const ticketLoading = ref(false);
398    const ticketDownloadLoading = ref(false);
399    const showTicketDialog = ref(false);
400    const attendanceTicket = ref(null);
401    const materialUrl = computed(() => {
402      var _a;
403      return ((_a = props.course) == null ? void 0 : _a.materialUrl) || null;
404    });
405    const hasMaterial = computed(() => {
406      var _a;
407      return Boolean(((_a = props.course) == null ? void 0 : _a.hasMaterial) && materialUrl.value);
408    });
409    const orderItemId = computed(() => {
410      var _a;
411      return ((_a = props.course) == null ? void 0 : _a.orderItemId) || null;
412    });
413    const canShowAttendanceQr = computed(
414      () => {
415        var _a;
416        return Boolean(orderItemId.value) && Boolean((_a = props.course) == null ? void 0 : _a.payment_status) && !trainingsLoading.value && trainingSessions.value.length > 0;
417      }
418    );
419    const ticketCode = computed(
420      () => {
421        var _a, _b;
422        return ((_b = (_a = attendanceTicket.value) == null ? void 0 : _a.ticket) == null ? void 0 : _b.ticket_code) || "";
423      }
424    );
425    const formatPersonTitle = (rawTitle) => {
426      const value = String(rawTitle || "").trim();
427      if (!value)
428        return "";
429      const normalized = value.replace(/\.$/, "");
430      const upper = normalized.toUpperCase();
431      if (upper === "H.E" || upper === "HE")
432        return "H.E.";
433      const titled = normalized.charAt(0).toUpperCase() + normalized.slice(1).toLowerCase();
434      return `${titled}.`;
435    };
436    const candidateName = computed(() => {
437      var _a, _b, _c, _d, _e;
438      const ticketCandidate = ((_a = attendanceTicket.value) == null ? void 0 : _a.candidate) || {};
439      const user = userStore.getUser || {};
440      const title = formatPersonTitle(
441        ticketCandidate.title || user.title || ((_b = props.course) == null ? void 0 : _b.title_name)
442      );
443      const fromParts = [
444        ticketCandidate.first_name || user.first_name,
445        ticketCandidate.last_name || user.last_name
446      ].filter(Boolean).join(" ").trim();
447      const name = fromParts || ticketCandidate.full_name || user.name || user.full_name || ((_c = props.course) == null ? void 0 : _c.student_name) || ((_d = props.course) == null ? void 0 : _d.full_name) || ((_e = props.course) == null ? void 0 : _e.customer_name) || "";
448      if (!name)
449        return title;
450      return title ? `${title} ${name}` : name;
451    });
452    const ticketQrPayload = computed(() => {
453      var _a, _b;
454      const qr = (_b = (_a = attendanceTicket.value) == null ? void 0 : _a.ticket) == null ? void 0 : _b.qr_code;
455      if (!qr)
456        return ticketCode.value;
457      if (typeof qr === "string")
458        return qr;
459      try {
460        return JSON.stringify(qr);
461      } catch {
462        return ticketCode.value;
463      }
464    });
465    const ticketQrImageUrl = computed(() => {
466      if (!ticketQrPayload.value)
467        return "";
468      return `https://api.qrserver.com/v1/create-qr-code/?size=280x280&data=${encodeURIComponent(
469        ticketQrPayload.value
470      )}`;
471    });
472    const hasElearningCredentials = computed(() => {
473      const course = props.course;
474      return Boolean((course == null ? void 0 : course.ulid) && (course == null ? void 0 : course.sk) && (course == null ? void 0 : course.version));
475    });
476    const isPhysicalOnly = computed(() => {
477      const course = props.course;
478      if (!(course == null ? void 0 : course.payment_status))
479        return false;
480      if (course.has_elearning === false)
481        return true;
482      return !hasElearningCredentials.value;
483    });
484    const canContinue = computed(
485      () => {
486        var _a;
487        return Boolean((_a = props.course) == null ? void 0 : _a.payment_status) && hasElearningCredentials.value && !isPhysicalOnly.value;
488      }
489    );
490    const continueLabel = computed(() => {
491      var _a, _b;
492      const progress = Number((_a = props.course) == null ? void 0 : _a.progress) || 0;
493      if (progress === 100)
494        return "Review Learning";
495      if (progress > 0 || ((_b = props.course) == null ? void 0 : _b.last_access))
496        return "Continue Learning";
497      return "Start Learning";
498    });
499    const formatSessionDate = (value) => {
500      if (!value)
501        return "Date TBC";
502      try {
503        const date = new Date(value);
504        if (!isValid(date))
505          return String(value);
506        return format(date, "dd-MMM-yyyy");
507      } catch {
508        return String(value);
509      }
510    };
511    const formatCompletedAt = (value) => {
512      if (!value)
513        return null;
514      try {
515        const date = new Date(value);
516        if (!isValid(date))
517          return null;
518        return format(date, "dd-MMM-yyyy");
519      } catch {
520        return null;
521      }
522    };
523    const isShownOnMyLearning = (slot) => {
524      var _a;
525      if (!(slot == null ? void 0 : slot.formId))
526        return false;
527      const moduleId = String((_a = slot.moduleId) != null ? _a : "").trim();
528      if (moduleId === "")
529        return true;
530      return slot.showOnMyLearning === true;
531    };
532    const mapAssessmentRow = (assessment, config, index = 0) => {
533      if (!isShownOnMyLearning(assessment))
534        return null;
535      const completed = Boolean(assessment.completed);
536      const totalScore = assessment.totalScore;
537      const maxScore = assessment.maxScore;
538      let scoreLabel = null;
539      if (completed && totalScore != null && maxScore != null) {
540        scoreLabel = `Score ${totalScore}/${maxScore}`;
541      }
542      const moduleHint = assessment.moduleTitle || null;
543      return {
544        key: `${config.key}-${assessment.moduleId || "course"}-${assessment.formId}-${index}`,
545        kind: config.key,
546        label: config.label,
547        hint: moduleHint || config.hint,
548        icon: config.icon,
549        iconColor: config.iconColor,
550        formId: assessment.formId,
551        title: assessment.title || null,
552        url: assessment.url || null,
553        completed,
554        completedAtLabel: formatCompletedAt(assessment.completedAt),
555        scoreLabel
556      };
557    };
558    const slotList = (payload, type) => {
559      if (!payload)
560        return [];
561      const arrays = {
562        pre: payload.preAssessments,
563        post: payload.postAssessments,
564        evaluate: payload.evaluateAssessments
565      };
566      const list = arrays[type];
567      if (Array.isArray(list) && list.length > 0)
568        return list;
569      const single = type === "pre" ? payload.preAssessment : type === "post" ? payload.postAssessment : payload.evaluateAssessment;
570      return single ? [single] : [];
571    };
572    const visibleAssessments = computed(() => {
573      const payload = assessmentsPayload.value;
574      const configs = [
575        {
576          key: "pre",
577          label: "Pre-Assessment",
578          hint: "Take before learning",
579          icon: "mdi-clipboard-text-outline",
580          iconColor: "primary"
581        },
582        {
583          key: "post",
584          label: "Post-Assessment",
585          hint: "Take after learning",
586          icon: "mdi-checkbox-marked-outline",
587          iconColor: "secondary"
588        },
589        {
590          key: "evaluate",
591          label: "Evaluation",
592          hint: "Course feedback",
593          icon: "mdi-star-outline",
594          iconColor: "orange"
595        }
596      ];
597      return configs.flatMap(
598        (config) => slotList(payload, config.key).map((slot, index) => mapAssessmentRow(slot, config, index)).filter(Boolean)
599      );
600    });
601    const KIND_NAME = {
602      pre: "Pre-Assessment",
603      post: "Post-Assessment",
604      evaluate: "Evaluation"
605    };
606    const GROUP_LABEL = {
607      pre: "Pre-tests",
608      post: "Post-tests",
609      evaluate: "Evaluations"
610    };
611    function meaningfulFormTitle(title) {
612      const cleaned = String(title || "").trim();
613      if (!cleaned)
614        return "";
615      const normalized = (value) => value.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
616      const phrases = /* @__PURE__ */ new Set([
617        "pre test",
618        "pre assessment",
619        "pretest",
620        "post test",
621        "post assessment",
622        "posttest",
623        "evaluation",
624        "evaluate",
625        "course evaluation",
626        "course feedback"
627      ]);
628      if (phrases.has(normalized(cleaned)))
629        return "";
630      const parts = cleaned.split(/[:·|]/).map((part) =>
630 part.trim()).filter(Boolean);
631      if (parts.length > 1 && parts.every((part) => phrases.has(normalized(part))))
632        return "";
633      return cleaned;
634    }
635    const assessmentGroups = computed(() => {
636      const rows = visibleAssessments.value;
637      return ["pre", "post", "evaluate"].map((kind) => {
638        const items = rows.filter((row) => row.kind === kind);
639        if (!items.length)
640          return null;
641        return {
642          key: kind,
643          label: GROUP_LABEL[kind],
644          items: items.map((row, index) => {
645            const title = meaningfulFormTitle(row.title);
646            if (items.length <= 1) {
647              return { ...row, title: title || null };
648            }
649            return {
650              ...row,
651              label: title || `${KIND_NAME[kind]} ${index + 1}`,
652              title: null
653            };
654          })
655        };
656      }).filter(Boolean);
657    });
658    const trainingRows = computed(
659      () => trainingSessions.value.map((session) => {
660        var _a, _b;
661        const isVirtual = String(session.deliveryType || "").toLowerCase() === "virtual";
662        const isExam = String(session.sessionCategory || "").toLowerCase() === "exam";
663        const isZoom = isVirtual && Boolean(session.meetingLink);
664        const venueParts = [session.venue, session.room].filter(Boolean);
665        let locationLabel = "Location TBC";
666        if (isZoom) {
667          locationLabel = "Zoom";
668        } else if (isVirtual) {
669          locationLabel = "Virtual";
670        } else if (venueParts.length) {
671          locationLabel = venueParts.join(" \xB7 ");
672        }
673        const attendanceStatus = ((_a = session.attendance) == null ? void 0 : _a.status) || "not_checked_in";
674        let attendanceLabel = "Not checked in";
675        let attendanceBadgeColor = "grey-4";
676        let attendanceBadgeTextColor = "grey-8";
677        if (attendanceStatus === "checked_in") {
678          attendanceLabel = "Present";
679          attendanceBadgeColor = "positive";
680          attendanceBadgeTextColor = "white";
681        } else if (attendanceStatus === "absent") {
682          attendanceLabel = "Absent";
683          attendanceBadgeColor = "negative";
684          attendanceBadgeTextColor = "white";
685        }
686        let checkedInAtLabel = null;
687        if ((_b = session.attendance) == null ? void 0 : _b.checked_in_at) {
688          try {
689            const checkedAt = new Date(session.attendance.checked_in_at);
690            if (isValid(checkedAt)) {
691              checkedInAtLabel = format(checkedAt, "dd-MMM-yyyy HH:mm");
692            }
693          } catch {
694            checkedInAtLabel = String(session.attendance.checked_in_at);
695          }
696        }
697        return {
698          id: session.id,
699          dateLabel: formatSessionDate(session.date),
700          time: session.time || null,
701          locationLabel,
702          isVirtual,
703          isExam,
704          isZoom,
705          actionUrl: session.meetingLink || session.mapUrl || null,
706          attendanceLabel,
707          attendanceBadgeColor,
708          attendanceBadgeTextColor,
709          checkedInAtLabel
710        };
711      })
712    );
713    const resetAssessments = () => {
714      assessmentsPayload.value = null;
715    };
716    const resetTrainings = () => {
717      trainingSessions.value = [];
718    };
719    const fetchAssessments = async () => {
720      var _a;
721      const courseId = (_a = props.course) == null ? void 0 : _a.courseId;
722      if (!courseId) {
723        resetAssessments();
724        return;
725      }
726      assessmentsLoading.value = true;
727      try {
728        const result = await learningStore.serverFetchCourseAssessments(courseId);
729        assessmentsPayload.value = result || null;
730      } finally {
731        assessmentsLoading.value = false;
732      }
733    };
734    const fetchTrainings = async () => {
735      var _a;
736      const courseId = (_a = props.course) == null ? void 0 : _a.courseId;
737      if (!courseId) {
738        resetTrainings();
739        return;
740      }
741      trainingsLoading.value = true;
742      try {
743        const result = await learningStore.serverFetchCourseTrainings(
744          courseId,
745          orderItemId.value
746        );
747        trainingSessions.value = result.sessions || [];
748      } finally {
749        trainingsLoading.value = false;
750      }
751    };
752    const openAttendanceQr = async () => {
753      var _a;
754      if (!orderItemId.value)
755        return;
756      ticketLoading.value = true;
757      try {
758        const result = await learningStore.serverFetchAttendanceTicket(
759          orderItemId.value
760        );
761        attendanceTicket.value = result;
762        if ((_a = result == null ? void 0 : result.ticket) == null ? void 0 : _a.ticket_code) {
763          showTicketDialog.value = true;
764        }
765      } finally {
766        ticketLoading.value = false;
767      }
768    };
769    const loadImage = (src) => new Promise((resolve, reject) => {
770      const img = new Image();
771      img.onload = () => resolve(img);
772      img.onerror = () => reject(new Error("Failed to load ticket image."));
773      img.src = src;
774    });
775    const wrapCanvasText = (ctx, text, maxWidth) => {
776      const words = String(text || "").split(/\s+/).filter(Boolean);
777      if (!words.length)
778        return [];
779      const lines = [];
780      let current = words[0];
781      for (let i = 1; i < words.length; i += 1) {
782        const next = `${current} ${words[i]}`;
783        if (ctx.measureText(next).width <= maxWidth) {
784          current = next;
785        } else {
786          lines.push(current);
787          current = words[i];
788        }
789      }
790      lines.push(current);
791      return lines.slice(0, 3);
792    };
793    const downloadIqrTicketJpg = async () => {
794      var _a;
795      if (!ticketQrPayload.value)
796        return;
797      ticketDownloadLoading.value = true;
798      let qrObjectUrl = null;
799      try {
800        const logo = await loadImage("/images/IBF_logo_full_bg.png");
801        const qrResponse = await fetch(
802          `https://api.qrserver.com/v1/create-qr-code/?size=500x500&data=${encodeURIComponent(
803            ticketQrPayload.value
804          )}`
805        );
806        if (!qrResponse.ok)
807          throw new Error("Failed to fetch QR image.");
808        const qrBlob = await qrResponse.blob();
809        qrObjectUrl = URL.createObjectURL(qrBlob);
810        const qr = await loadImage(qrObjectUrl);
811        const width = 720;
812        const padding = 48;
813        const contentWidth = width - padding * 2;
814        const logoMaxW = 280;
815        const logoMaxH = 110;
816        const logoScale = Math.min(
817          logoMaxW / logo.width,
818          logoMaxH / logo.height,
819          1
820        );
821        const logoW = logo.width * logoScale;
822        const logoH = logo.height * logoScale;
823        const qrSize = 420;
824        const courseTitle = ((_a = props.course) == null ? void 0 : _a.title) || "";
825        const candidate = candidateName.value || "";
826        const hint = "Show this QR code to your moderator for check-in.";
827        const measure = document.createElement("canvas").getContext("2d");
828        measure.font = "bold 22px sans-serif";
829        const courseLines = courseTitle ? wrapCanvasText(measure, courseTitle, contentWidth) : [];
830        measure.font = "22px sans-serif";
831        const candidateLines = candidate ? wrapCanvasText(measure, candidate, contentWidth) : [];
832        measure.font = "18px sans-serif";
833        const hintLines = wrapCanvasText(measure, hint, contentWidth);
834        let height = padding;
835        height += logoH + 28;
836        height += 42;
837        if (courseLines.length)
838          height += courseLines.length * 28 + 12;
839        if (candidateLines.length)
840          height += candidateLines.length * 28 + 16;
841        height += qrSize + 28;
842        if (ticketCode.value)
843          height += 70;
844        height += hintLines.length * 24 + 16;
845        height += padding;
846        const canvas = document.createElement("canvas");
847        canvas.width = width;
848        canvas.height = height;
849        const ctx = canvas.getContext("2d");
850        ctx.fillStyle = "#ffffff";
851        ctx.fillRect(0, 0, width, height);
852        let y = padding;
853        ctx.drawImage(logo, (width - logoW) / 2, y, logoW, logoH);
854        y += logoH + 28;
855        ctx.textAlign = "center";
856        ctx.fillStyle = "#8f1723";
857        ctx.font = "bold 36px sans-serif";
858        ctx.fillText("I-QR Ticket", width / 2, y);
859        y += 42;
860        if (courseLines.length) {
861          ctx.fillStyle = "#333333";
862          ctx.font = "bold 22px sans-serif";
863          courseLines.forEach((line) => {
864            ctx.fillText(line, width / 2, y);
865            y += 28;
866          });
867          y += 8;
868        }
869        if (candidateLines.length) {
870          ctx.fillStyle = "#555555";
871          ctx.font = "22px sans-serif";
872          candidateLines.forEach((line) => {
873            ctx.fillText(line, width / 2, y);
874            y += 28;
875          });
876          y += 12;
877        }
878        ctx.drawImage(qr, (width - qrSize) / 2, y, qrSize, qrSize);
879        y += qrSize + 32;
880        if (ticketCode.value) {
881          ctx.fillStyle = "#888888";
882          ctx.font = "18px sans-serif";
883          ctx.fillText("Ticket code", width / 2, y);
884          y += 30;
885          ctx.fillStyle = "#8f1723";
886          ctx.font = "bold 28px sans-serif";
887          ctx.fillText(String(ticketCode.value), width / 2, y);
888          y += 36;
889        }
890        ctx.fillStyle = "#666666";
891        ctx.font = "18px sans-serif";
892        hintLines.forEach((line) => {
893          ctx.fillText(line, width / 2, y);
894          y += 24;
895        });
896        const dataUrl = canvas.toDataURL("image/jpeg", 0.92);
897        const safeCode = String(ticketCode.value || "ticket").replace(/[^\w.-]+/g, "-").slice(0, 40);
898        const link = document.createElement("a");
899        link.href = dataUrl;
900        link.download = `I-QR-Ticket-${safeCode}.jpg`;
901        document.body.appendChild(link);
902        link.click();
903        link.remove();
904        Notify.create({
905          type: "positive",
906          message: "I-QR Ticket downloaded.",
907          position: "top-right"
908        });
909      } catch (error) {
910        Notify.create({
911          type: "negative",
912          message: (error == null ? void 0 : error.message) || "Failed to download I-QR Ticket.",
913          position: "top-right"
914        });
915      } finally {
916        if (qrObjectUrl)
917          URL.revokeObjectURL(qrObjectUrl);
918        ticketDownloadLoading.value = false;
919      }
920    };
921    watch(
922      () => {
923        var _a, _b;
924        return [props.modelValue, (_a = props.course) == null ? void 0 : _a.courseId, (_b = props.course) == null ? void 0 : _b.orderItemId];
925      },
926      ([open]) => {
927        if (open && props.course) {
928          fetchAssessments();
929          fetchTrainings();
930        } else if (!open) {
931          resetAssessments();
932          resetTrainings();
933          attendanceTicket.value = null;
934          showTicketDialog.value = false;
935        }
936      }
937    );
938    const close = () => emit("update:modelValue", false);
939    const openUrl = (url) => {
940      if (!url)
941        return;
942      window.open(url, "_blank", "noopener,noreferrer");
943    };
944    const safeHttpUrl = (url) => {
945      try {
946        const parsed = new URL(url, window.location.origin);
947        if (parsed.protocol !== "http:" && parsed.protocol !== "https:")
948          return null;
949        return parsed.toString();
950      } catch {
951        return null;
952      }
953    };
954    const leavesIbfSite = (url) => {
955      try {
956        return new URL(url).origin !== window.location.origin;
957      } catch {
958        return true;
959      }
960    };
961    const confirmLeaveAndOpen = (url) => {
962      const target = safeHttpUrl(url);
963      if (!target)
964        return;
965      const redirect = () => {
966        window.location.assign(target);
967      };
968      if (!leavesIbfSite(target)) {
969        redirect();
970        return;
971      }
972      $q.dialog({
973        title: "Leave IBF?",
974        message: "You are about to leave the IBF website. If you continue, you will be redirected.",
975        cancel: {
976          label: "Stay",
977          flat: true,
978          color: "primary",
979          noCaps: true
980        },
981        ok: {
982          label: "Continue",
983          color: "primary",
984          unelevated: true,
985          noCaps: true
986        },
987        persistent: true
988      }).onOk(redirect);
989    };
990    const buildAssessmentUrlWithSession = (url) => {
991      var _a, _b, _c, _d;
992      if (!url)
993        return null;
994      const token = userStore.getToken;
995      if (!token)
996        return url;
997      try {
998        const parsedUrl = new URL(url, window.location.origin);
999        const isFormFillPath = /^\/f\/[^/]+/i.test(parsedUrl.pathname || "");
1000        if (!isFormFillPath) {
1001          return url;
1002        }
1003        parsedUrl.searchParams.set("access_token", token);
1004        const email = ((_a = userStore.getUser) == null ? void 0 : _a.email) || ((_b = userStore.getUser) == null ? void 0 : _b.work_email);
1005        if (email) {
1006          parsedUrl.searchParams.set("email", email);
1007        }
1008        const fullName = [(_c = userStore.getUser) == null ? void 0 : _c.first_name, (_d = userStore.getUser) == null ? void 0 : _d.last_name].filter(
1008Boolean).join(" ").trim();
1009        if (fullName) {
1010          parsedUrl.searchParams.set("name", fullName);
1011        }
1012        const refreshToken = userStore.getRefreshToken;
1013        if (refreshToken) {
1014          parsedUrl.searchParams.set("refresh_token", refreshToken);
1015          parsedUrl.searchParams.set("expires_in", String(30 * 24 * 60 * 60));
1016        }
1017        return parsedUrl.toString();
1018      } catch {
1019        return url;
1020      }
1021    };
1022    const openAssessmentUrl = (url) => {
1023      openUrl(buildAssessmentUrlWithSession(url));
1024    };
1025    const emitContinue = () => {
1026      if (!canContinue.value)
1027        return;
1028      emit("continue", props.course);
1029    };
1030    return (_ctx, _cache) => {
1031      return openBlock(), createElementBlock(Fragment, null, [
1032        createVNode(QDialog, {
1033          "model-value": __props.modelValue,
1034          position: "bottom",
1035          "backdrop-filter": "blur(2px)",
1036          "content-class": "course-actions-dialog-content",
1037          "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.$emit("update:modelValue", $event))
1038        }, {
1039          default: withCtx(() => [
1040            createVNode(QCard, {
1041              flat: "",
1042              class: "course-actions-sheet"
1043            }, {
1044              default: withCtx(() => [
1045                createVNode(QCardSection, { class: "course-actions-sheet__header row items-center no-wrap" }, {
1046                  default: withCtx(() => {
1047                    var _a, _b, _c;
1048                    return [
1049                      createBaseVNode("div", _hoisted_1$2, [
1050                        ((_a = __props.course) == null ? void 0 : _a.thumbnail) ? (openBlock(), createElementBlock("img", {
1051                          key: 0,
1052                          src: __props.course.thumbnail,
1053                          alt: (_b = __props.course) == null ? void 0 : _b.title,
1054                          class: "course-actions-sheet__thumb-img"
1055                        }, null, 8, _hoisted_2$2)) : (openBlock(), createElementBlock("div", _hoisted_3$1, [
1056                          createVNode(QIcon, {
1057                            name: "mdi-trophy",
1058                            size: "22px",
1059                            color: "white"
1060                          })
1061                        ]))
1062                      ]),
1063                      createBaseVNode("div", _hoisted_4$1, toDisplayString((_c = __props.course) == null ? void 0 : _c.title), 1),
1064                      createVNode(QBtn, {
1065                        flat: "",
1066                        dense: "",
1067                        icon: "mdi-close",
1068                        color: "grey-8",
1069                        "aria-label": "Close",
1070                        class: "q-ml-sm",
1071                        onClick: close
1072                      })
1073                    ];
1074                  }),
1075                  _: 1
1076                }),
1077                createVNode(QSeparator),
1078                createBaseVNode("div", _hoisted_5$1, [
1079                  createVNode(QCardSection, { class: "course-actions-sheet__body" }, {
1080                    default: withCtx(() => [
1081                      _cache[5] || (_cache[5] = createBaseVNode("div", { class: "course-actions-sheet__section-label" }, "Assessments", -1)),
1082                      assessmentsLoading.value ? (openBlock(), createElementBlock("div", _hoisted_6$1, [
1083                        createVNode(QSkeleton, {
1084                          type: "rect",
1085                          height: "72px",
1086                          square: ""
1087                        }),
1088                        createVNode(QSkeleton, {
1089                          type: "rect",
1090                          height: "72px",
1091                          square: ""
1092                        })
1093                      ])) : (openBlock(), createElementBlock("div", _hoisted_7$1, [
1094                        (openBlock(true), createElementBlock(Fragment, null, renderList(assessmentGroups.value, (group) => {
1095                          return openBlock(), createElementBlock("div", {
1096                            key: group.key,
1097                            class: "course-actions-sheet__group"
1098                          }, [
1099                            createBaseVNode("div", _hoisted_8, toDisplayString(group.label), 1),
1100                            createBaseVNode("div", _hoisted_9, [
1101                              (openBlock(true), createElementBlock(Fragment, null, renderList(group.items, (item) => {
1102                                return openBlock(), createElementBlock("button", {
1103                                  key: item.key,
1104                                  type: "button",
1105                                  class: normalizeClass(["course-actions-sheet__assessment", {
1106                                    "course-actions-sheet__assessment--completed": item.completed,
1107                                    "course-actions-sheet__assessment--disabled": !item.url
1108                                  }]),
1109                                  disabled: !item.url,
1110                                  onClick: ($event) => openAssessmentUrl(item.url)
1111                                }, [
1112                                  createBaseVNode("div", {
1113                                    class: normalizeClass(["course-actions-sheet__assessment-icon", `course-actions-sheet__assessment-icon--${item.kind}`])
1114                                  }, [
1115                                    createVNode(QIcon, {
1116                                      name: item.icon,
1117                                      size: "20px",
1118                                      color: item.iconColor
1119                                    }, null, 8, ["name", "color"])
1120                                  ], 2),
1121                                  createBaseVNode("div", _hoisted_11, [
1122                                    createBaseVNode("div", _hoisted_12, [
1123                                      createBaseVNode("div", _hoisted_13, toDisplayString(item.label), 1),
1124                                      item.completed ? (openBlock(), createBlock(QBadge, {
1125                                        key: 0,
1126                                        color: "positive",
1127                                        "text-color": "white",
1128                                        label: "Completed",
1129                                        class: "course-actions-sheet__badge"
1130                                      })) : item.formId ? (openBlock(), createBlock(QBadge, {
1131                                        key: 1,
1132                                        color: "grey-4",
1133                                        "text-color": "grey-8",
1134                                        label: "Not started",
1135                                        class: "course-actions-sheet__badge"
1136                                      })) : createCommentVNode("", true)
1137                                    ]),
1138                                    item.title || item.hint ? (openBlock(), createElementBlock("div", _hoisted_14, toDisplayString(item.title || item.hint), 1)) : createCommentVNode("", true),
1139                                    item.completed && item.completedAtLabel ? (openBlock(), createElementBlock("div", _hoisted_15, [
1140                                      createTextVNode(" Completed on " + toDisplayString(item.completedAtLabel) + " ", 1),
1141                                      item.scoreLabel ? (openBlock(), createElementBlock("span", _hoisted_16, " \xB7 " + toDisplayString(item.scoreLabel), 1)) : createCommentVNode("", true)
1142                                    ])) : !item.url && item.formId ? (openBlock(), createElementBlock("div", _hoisted_17, " Form link unavailable ")) : createCommentVNode("", true)
1143                                  ]),
1144                                  createVNode(QIcon, {
1145                                    name: item.completed ? "mdi-check-circle" : "mdi-chevron-right",
1146                                    size: "20px",
1147                                    color: item.completed ? "positive" : "grey-5"
1148                                  }, null, 8, ["name", "color"])
1149                                ], 10, _hoisted_10);
1150                              }), 128))
1151                            ])
1152                          ]);
1153                        }), 128)),
1154                        visibleAssessments.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_18, " No assessments available for this course. ")) : createCommentVNode("", true)
1155                      ])),
1156                      _cache[6] || (_cache[6] = createBaseVNode("div", { class: "course-actions-sheet__section-label" }, "Trainings", -1)),
1157                      trainingsLoading.value ? (openBlock(), createElementBlock("div", _hoisted_19, [
1158                        createVNode(QSkeleton, {
1159                          type: "rect",
1160                          height: "72px",
1161                          square: ""
1162                        })
1163                      ])) : (openBlock(), createElementBlock("div", _hoisted_20, [
1164                        (openBlock(true), createElementBlock(Fragment, null, renderList(trainingRows.value, (session) => {
1165                          return openBlock(), createElementBlock("button", {
1166                            key: session.id,
1167                            type: "button",
1168                            class: normalizeClass(["course-actions-sheet__assessment", {
1169                              "course-actions-sheet__assessment--disabled": !session.actionUrl
1170                            }]),
1171                            disabled: !session.actionUrl,
1172                            onClick: ($event) => confirmLeaveAndOpen(session.actionUrl)
1173                          }, [
1174                            createBaseVNode("div", _hoisted_22, [
1175                              createVNode(QIcon, {
1176                                name: session.isVirtual ? "mdi-video-outline" : "mdi-map-marker-outline",
1177                                size: "20px",
1178                                color: session.isVirtual ? "secondary" : "primary"
1179                              }, null, 8, ["name", "color"])
1180                            ]),
1181                            createBaseVNode("div", _hoisted_23, [
1182                              createBaseVNode("div", _hoisted_24, [
1183                                createBaseVNode("div", _hoisted_25, [
1184                                  createTextVNode(toDisplayString(session.dateLabel) + " ", 1),
1185                                  session.time ? (openBlock(), createElementBlock("span", _hoisted_26, " \xB7 " + toDisplayString(session.time), 1)) : createCommentVNode("", true)
1186                                ]),
1187                                session.isExam ? (openBlock(), createBlock(QBadge, {
1188                                  key: 0,
1189                                  color: "deep-orange",
1190                                  "text-color": "white",
1191                                  label: "Exam",
1192                                  class: "course-actions-sheet__badge"
1193                                })) : createCommentVNode("", true),
1194                                session.isZoom ? (openBlock(), createBlock(QBadge, {
1195                                  key: 1,
1196                                  color: "secondary",
1197                                  "text-color": "white",
1198                                  label: "Zoom",
1199                                  class: "course-actions-sheet__badge"
1200                                })) : session.isVirtual ? (openBlock(), createBlock(QBadge, {
1201                                  key: 2,
1202                                  outline: "",
1203                                  color: "secondary",
1204                                  label: "Virtual",
1205                                  class: "course-actions-sheet__badge"
1206                                })) : createCommentVNode("", true),
1207                                createVNode(QBadge, {
1208                                  color: session.attendanceBadgeColor,
1209                                  "text-color": session.attendanceBadgeTextColor,
1210                                  label: session.attendanceLabel,
1211                                  class: "course-actions-sheet__badge"
1212                                }, null, 8, ["color", "text-color", "label"])
1213                              ]),
1214                              createBaseVNode("div", _hoisted_27, toDisplayString(session.locationLabel), 1),
1215                              session.checkedInAtLabel ? (openBlock(), createElementBlock("div", _hoisted_28, " Checked in " + toDisplayString(session.checkedInAtLabel), 1)) : createCommentVNode("", true)
1216                            ]),
1217                            session.actionUrl ? (openBlock(), createBlock(QIcon, {
1218                              key: 0,
1219                              name: "mdi-chevron-right",
1220                              size: "20px",
1221                              color: "grey-5"
1222                            })) : createCommentVNode("", true)
1223                          ], 10, _hoisted_21);
1224                        }), 128)),
1225                        trainingRows.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_29, " No local trainings available. ")) : createCommentVNode("", true)
1226                      ]))
1227                    ]),
1228                    _: 1
1229                  })
1230                ]),
1231                createBaseVNode("div", _hoisted_30, [
1232                  createVNode(QSeparator),
1233                  createVNode(QCardSection, { class: "course-actions-sheet__footer-body" }, {
1234                    default: withCtx(() => [
1235                      _cache[8] || (_cache[8] = createBaseVNode("div", { class: "course-actions-sheet__section-label" }, "Actions", -1)),
1236                      createBaseVNode("div", _hoisted_31, [
1237                        canShowAttendanceQr.value ? (openBlock(), createBlock(QBtn, {
1238                          key: 0,
1239                          unelevated: "",
1240                          "no-caps": "",
1241                          square: "",
1242                          color: "primary",
1243                          outline: "",
1244                          class: "full-width course-actions-sheet__action-btn",
1245                          icon: "mdi-qrcode",
1246                          label: "Show I-QR Ticket",
1247                          loading: ticketLoading.value,
1248                          onClick: openAttendanceQr
1249                        }, null, 8, ["loading"])) : createCommentVNode("", true),
1250                        isPhysicalOnly.value ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
1251                          createVNode(QBtn, {
1252                            unelevated: "",
1253                            "no-caps": "",
1254                            square: "",
1255                            color: "grey-4",
1256                            "text-color": "grey-8",
1257                            class: "full-width course-actions-sheet__action-btn",
1258                            icon: "mdi-account-group-outline",
1259                            label: "In-person class only",
1260                            disable: ""
1261                          }),
1262                          _cache[7] || (_cache[7] = createBaseVNode("div", { class: "course-actions-sheet__action-remark text-grey-6 ibf-h12" }, " This is a physical / in-person class only. Online learning is not available for this course, so Start Learning is disabled. ", -1))
1263                        ], 64)) : !canContinue.value ? (openBlock(), createBlock(QBtn, {
1264                          key: 2,
1265                          unelevated: "",
1266                          "no-caps": "",
1267                          square: "",
1268                          color: "grey-4",
1269                          "text-color": "grey-8",
1270                          class: "full-width course-actions-sheet__action-btn",
1271                          icon: "mdi-timeline-clock-outline",
1272                          label: "Pending access ...",
1273                          disable: ""
1274                        })) : (openBlock(), createBlock(QBtn, {
1275                          key: 3,
1276                          unelevated: "",
1277                          "no-caps": "",
1278                          square: "",
1279                          color: "secondary",
1280                          class: "full-width course-actions-sheet__action-btn",
1281                          icon: "mdi-play-circle-outline",
1282                          label: continueLabel.value,
1283                          onClick: emitContinue
1284                        }, null, 8, ["label"])),
1285                        createVNode(QBtn, {
1286                          unelevated: "",
1287                          "no-caps": "",
1288                          square: "",
1289                          color: "primary",
1290                          class: "full-width course-actions-sheet__action-btn",
1291                          icon: "mdi-download",
1292                          label: "Download Training Material",
1293                          disable: !hasMaterial.value,
1294                          onClick: _cache[0] || (_cache[0] = ($event) => openUrl(materialUrl.value))
1295                        }, null, 8, ["disable"])
1296                      ])
1297                    ]),
1298                    _: 1
1299                  })
1300                ])
1301              ]),
1302              _: 1
1303            })
1304          ]),
1305          _: 1
1306        }, 8, ["model-value"]),
1307        createVNode(QDialog, {
1308          modelValue: showTicketDialog.value,
1309          "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => showTicketDialog.value = $event),
1310          persistent: ""
1311        }, {
1312          default: withCtx(() => [
1313            createVNode(QCard, { class: "course-attendance-ticket-card" }, {
1314              default: withCtx(() => [
1315                createVNode(QCardSection, { class: "row items-center justify-between bg-primary text-white" }, {
1316                  default: withCtx(() => [
1317                    _cache[9] || (_cache[9] = createBaseVNode("div", { class: "text-subtitle1 text-weight-bold" }, "I-QR Ticket", -1)),
1318                    createVNode(QBtn, {
1319                      flat: "",
1320                      round: "",
1321                      dense: "",
1322                      icon: "close",
1323                      onClick: _cache[2] || (_cache[2] = ($event) => showTicketDialog.value = false)
1324                    })
1325                  ]),
1326                  _: 1
1327                }),
1328                createVNode(QCardSection, { class: "q-pa-lg" }, {
1329                  default: withCtx(() => {
1330                    var _a;
1331                    return [
1332                      createBaseVNode("div", _hoisted_32, [
1333                        _cache[11] || (_cache[11] = createBaseVNode("div", { class: "iqr-ticket__logo-wrap" }, [
1334                          createBaseVNode("img", {
1335                            src: "/images/IBF_logo_full_bg.png",
1336                            alt: "IBF Logo",
1337                            class: "iqr-ticket__logo"
1338                          })
1339                        ], -1)),
1340                        _cache[12] || (_cache[12] = createBaseVNode("div", { class: "iqr-ticket__title" }, "I-QR Ticket", -1)),
1341                        ((_a = __props.course) == null ? void 0 : _a.title) ? (openBlock(), createElementBlock("div", _hoisted_33, toDisplayString(__props.course.title), 1)) : createCommentVNode("", true),
1342                        candidateName.value ? (openBlock(), createElementBlock("div", _hoisted_34, toDisplayString(candidateName.value), 1)) : createCommentVNode("", true),
1343                        ticketQrImageUrl.value ? (openBlock(), createElementBlock("img", {
1344                          key: 2,
1345                          src: ticketQrImageUrl.value,
1346                          alt: "I-QR Ticket QR code",
1347                          class: "iqr-ticket__qr"
1348                        }, null, 8, _hoisted_35)) : createCommentVNode("", true),
1349                        ticketCode.value ? (openBlock(), createElementBlock("div", _hoisted_36, [
1350                          _cache[10] || (_cache[10] = createBaseVNode("div", { class: "iqr-ticket__code-label" }, "Ticket code", -1)),
1351                          createBaseVNode("div", _hoisted_37, toDisplayString(ticketCode.value), 1)
1352                        ])) : createCommentVNode("", true),
1353                        _cache[13] || (_cache[13] = createBaseVNode("div", { class: "iqr-ticket__subtitle" }, " Show this QR code to your moderator for check-in. ", -1))
1354                      ])
1355                    ];
1356                  }),
1357                  _: 1
1358                }),
1359                createVNode(QCardActions, {
1360                  align: "right",
1361                  class: "q-px-md q-pb-md"
1362                }, {
1363                  default: withCtx(() => [
1364                    createVNode(QBtn, {
1365                      flat: "",
1366                      "no-caps": "",
1367                      color: "grey-7",
1368                      label: "Close",
1369                      onClick: _cache[3] || (_cache[3] = ($event) => showTicketDialog.value = false)
1370                    }),
1371                    createVNode(QBtn, {
1372                      unelevated: "",
1373                      "no-caps": "",
1374                      color: "secondary",
1375                      icon: "mdi-download",
1376                      label: "Download JPG",
1377                      loading: ticketDownloadLoading.value,
1378                      disable: !ticketQrImageUrl.value,
1379                      onClick: downloadIqrTicketJpg
1380                    }, null, 8, ["loading", "disable"])
1381                  ]),
1382                  _: 1
1383                })
1384              ]),
1385              _: 1
1386            })
1387          ]),
1388          _: 1
1389        }, 8, ["modelValue"])
1390      ], 64);
1391    };
1392  }
1393};
1394var CourseActionsSheet = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-05f7827e"], ["__file", "CourseActionsSheet.vue"]]);
1395var MyLearningModernView_vue_vue_type_style_index_0_scoped_true_lang = "";
1396const _hoisted_1$1 = { class: "my-learning-modern" };
1397const _hoisted_2$1 = { class: "my-learning-modern__pill-toggle q-mb-sm" };
1398const _hoisted_3 = ["onClick"];
1399const _hoisted_4 = { class: "text-grey-6 ibf-h12 q-py-sm q-mb-sm text-center" };
1400const _hoisted_5 = {
1401  key: 1,
1402  class: "q-gutter-y-md"
1403};
1404const _hoisted_6 = { class: "q-mt-md flex flex-center" };
1405const _hoisted_7 = {
1406  key: 1,
1407  class: "text-caption text-grey-6 q-my-md"
1408};
1409const _sfc_main$1 = {
1410  __name: "MyLearningModernView",
1411  props: {
1412    tab: {
1413      type: String,
1414      required: true
1415    },
1416    sections: {
1417      type: Array,
1418      required: true
1419    },
1420    isLoading: {
1421      type: Boolean,
1422      default: false
1423    },
1424    isLoadingMore: {
1425      type: Boolean,
1426      default: false
1427    }
1428  },
1429  emits: ["update:tab", "load-more", "continue"],
1430  setup(__props) {
1431    const sheetOpen = ref(false);
1432    const selectedCourse = ref(null);
1433    const courseCountLabel = (section) => {
1434      var _a, _b, _c;
1435      const loaded = (_b = (_a = section.courses) == null ? void 0 : _a.length) != null ? _b : 0;
1436      const total = Number((_c = section.total) != null ? _c : 0);
1437      return total > loaded ? `${loaded} of ${total} course(s)` : `${loaded} course(s)`;
1438    };
1439    const openCourseSheet = (course) => {
1440      selectedCourse.value = course;
1441      sheetOpen.value = true;
1442    };
1443    return (_ctx, _cache) => {
1444      return openBlock(), createElementBlock("div", _hoisted_1$1, [
1445        createBaseVNode("div", _hoisted_2$1, [
1446          (openBlock(true), createElementBlock(Fragment, null, renderList(__props.sections, (section) => {
1447            return openBlock(), createElementBlock("button", {
1448              key: section.name,
1449              type: "button",
1450              class: normalizeClass(["my-learning-modern__pill", { "my-learning-modern__pill--active": __props.tab === section.name }]),
1451              onClick: ($event) => _ctx.$emit("update:tab", section.name)
1452            }, toDisplayString(section.label), 11, _hoisted_3);
1453          }), 128))
1454        ]),
1455        (openBlock(true), createElementBlock(Fragment, null, renderList(__props.sections, (sectionPanel) => {
1456          return withDirectives((openBlock(), createElementBlock("div", {
1457            key: sectionPanel.name
1458          }, [
1459            createBaseVNode("div", _hoisted_4, toDisplayString(sectionPanel.label) + ": " + toDisplayString(courseCountLabel(sectionPanel)), 1),
1460            __props.isLoading && __props.tab === sectionPanel.name && !sectionPanel.fetched ? (openBlock(), createBlock(OrderItemCardSkeleton, { key: 0 })) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
1461              !sectionPanel.courses || sectionPanel.courses.length === 0 ? (openBlock(), createBlock(QCard, {
1462                key: 0,
1463                flat: "",
1464                class: "ibf-card-1 bg-grey-2"
1465              }, {
1466                default: withCtx(() => [
1467                  createVNode(QCardSection, { class: "flex flex-center ibf-h8 text-grey-6" }, {
1468                    default: withCtx(() => [..._cache[2] || (_cache[2] = [
1469                      createTextVNode(" -- No items to display -- ", -1)
1470                    ])]),
1471                    _: 1
1472                  })
1473                ]),
1474                _: 1
1475              })) : (openBlock(), createElementBlock("div", _hoisted_5, [
1476                (openBlock(true), createElementBlock(Fragment, null, renderList(sectionPanel.courses, (course) => {
1477                  return openBlock(), createBlock(LearningCourseCard, {
1478                    key: `${sectionPanel.name}#${course.orderItemId}`,
1479                    course,
1480                    onOpen: openCourseSheet
1481                  }, null, 8, ["course"]);
1482                }), 128)),
1483                createBaseVNode("div", _hoisted_6, [
1484                  sectionPanel.hasMore ? (openBlock(), createBlock(QBtn, {
1485                    key: 0,
1486                    label: "Load more",
1487                    color: "primary",
1488                    outline: "",
1489                    rounded: "",
1490                    loading: __props.isLoadingMore && __props.tab === sectionPanel.name,
1491                    onClick: ($event) => _ctx.$emit("load-more", sectionPanel)
1492                  }, null, 8, ["loading", "onClick"])) : (openBlock(), createElementBlock("div", _hoisted_7, " You\u2019re all caught up "))
1493                ])
1494              ]))
1495            ], 64))
1496          ])), [
1497            [vShow, __props.tab === sectionPanel.name]
1498          ]);
1499        }), 128)),
1500        createVNode(CourseActionsSheet, {
1501          modelValue: sheetOpen.value,
1502          "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => sheetOpen.value = $event),
1503          course: selectedCourse.value,
1504          onContinue: _cache[1] || (_cache[1] = ($event) => _ctx.$emit("continue", $event))
1505        }, null, 8, ["modelValue", "course"])
1506      ]);
1507    };
1508  }
1509};
1510var MyLearningModernView = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-0f89d9ac"], ["__file", "MyLearningModernView.vue"]]);
1511function asRecord(value) {
1512  return value && typeof value === "object" && !Array.isArray(value) ? value : {};
1513}
1514function asRecordArray(value) {
1515  return Array.isArray(value) ? value.map(asRecord).filter((record) => Object.keys(record).length) : [];
1516}
1517function getText(source, keys, fallback = "") {
1518  for (const key of keys) {
1519    const value = source[key];
1520    if (typeof value === "string" && value.trim())
1521      return value.trim();
1522    if (typeof value === "number")
1523      return String(value);
1524  }
1525  return fallback;
1526}
1527function isTruthyFlag(value) {
1528  if (value === true || value === 1 || value === "1")
1529    return true;
1530  if (value === false || value === 0 || value === "0" || value === null || value === void 0) {
1531    return false;
1532  }
1533  if (typeof value === "string") {
1534    return ["true", "yes", "active"].includes(value.toLowerCase());
1535  }
1536  return Boolean(value);
1537}
1538function isNotExpired(expireDate) {
1539  if (!expireDate)
1540    return true;
1541  const expiry = new Date(expireDate);
1542  if (Number.isNaN(expiry.getTime()))
1543    return true;
1544  const today = new Date();
1545  today.setHours(0, 0, 0, 0);
1546  return expiry >= today;
1547}
1548function resolveExtraMaterialType(material) {
1549  return material.type === "material" ? "material" : "course_detail";
1550}
1551function resolveMaterialUrl(url, materialApiBase = "") {
1552  const trimmed = String(url || "").trim();
1553  if (!trimmed)
1554    return "";
1555  if (/^https?:\/\//i.test(trimmed))
1556    return trimmed;
1557  if (trimmed.startsWith("//"))
1558    return `https:${trimmed}`;
1559  const base = String(materialApiBase || "").replace(/\/$/, "");
1560  if (!base)
1561    return trimmed;
1562  return `${base}/${trimmed.replace(/^\//, "")}`;
1563}
1564function getCurrentCourseMaterial(record, materialApiBase = "", type = "course_detail") {
1565  const materials = asRecordArray(asRecord(record).extra_materials).filter(
1566    (material) => resolveExtraMaterialType(material) === type
1567  );
1568  const activeMaterials = materials.filter(
1569    (material) => isTruthyFlag(material.is_active)
1570  );
1571  const current = activeMaterials.find((material) => isTruthyFlag(material.is_current)) || (activeMaterials.length === 1 ? activeMaterials[0] : void 0);
1572  if (!current)
1573    return { url: "", label: "" };
1574  const expireDate = getText(current, ["expire_date", "expireDate"]);
1575  if (!isNotExpired(expireDate))
1576    return { url: "", label: "" };
1577  const rawUrl = getText(current, ["file_url", "fileUrl", "url"]);
1578  if (!rawUrl)
1579    return { url: "", label: "" };
1580  return {
1581    url: resolveMaterialUrl(rawUrl, materialApiBase),
1582    label: getText(
1583      current,
1584      ["label", "title", "name"],
1585      type === "material" ? "Training Material" : "Course Detail"
1586    )
1587  };
1588}
1589var MyLearningPage_vue_vue_type_style_index_0_scoped_true_lang = "";
1590const _hoisted_1 = { class: "ibf-container-1200 q-pa-md" };
1591const _hoisted_2 = { class: "my-learning-page__header q-mt-sm q-mb-md" };
1592const _sfc_main = {
1593  __name: "MyLearningPage",
1594  setup(__props) {
1595    const learningStore = useLearningStore();
1596    const userStore = useUserStore();
1597    const appMode = "production";
1598    const apiEndPoint = API_CONFIG[appMode];
1599    const materialApiBase = (apiEndPoint == null ? void 0 : apiEndPoint.CM_API_URL) || "";
1600    const tab = ref("in_progress");
1601    const isLoading = ref(true);
1602    const isLoadingMore = ref(false);
1603    const searchQuery = ref("");
1604    const selectedCourseTypes = ref([2, 3, 5]);
1605    const rowsPerPage = ref(5);
1606    const sections = reactive([
1607      {
1608        name: "in_progress",
1609        label: "In Progress",
1610        icon: "mdi-progress-alert",
1611        courses: [],
1612        fetched: false,
1613        page: 1,
1614        hasMore: true,
1615        totalPages: 1,
1616        total: 0
1617      },
1618      {
1619        name: "completed",
1620        label: "Completed",
1621        icon: "mdi-check-circle-outline",
1622        courses: [],
1623        fetched: false,
1624        page: 1,
1625        hasMore: true,
1626        totalPages: 1,
1627        total: 0
1628      }
1629    ]);
1630    const fetchCourses = async (status, append = false) => {
1631      var _a;
1632      const section = sections.find((s) => s.name === status);
1633      if (!section)
1634        return;
1635      try {
1636        if (append) {
1637          isLoadingMore.value = true;
1638        } else {
1639          isLoading.value = true;
1640        }
1641        const filters = {
1642          status,
1643          rowsPerPage: rowsPerPage.value,
1644          page: section.page,
1645          course_type: selectedCourseTypes.value,
1646          query: searchQuery.value ? "title" : void 0,
1647          value: searchQuery.value || void 0
1648        };
1649        const { items, meta } = await learningStore.serverFetchOrderItems(filters);
1650        const formatted = items.map((product) => {
1651          var _a2;
1652          const { record, thumbnail } = product.course || {};
1653          const { linkage } = record || { linkage: [] };
1654          const online_material = (linkage || []).find(
1655            (link) => link.version === product.course_version
1656          ) || null;
1657          const ulid = (online_material == null ? void 0 : online_material.ulid) || null;
1658          const sk = (online_material == null ? void 0 : online_material.SK) || product.SK || null;
1659          const pk = product.PK || (online_material == null ? void 0 : online_material.PK) || null;
1660          const version = product.course_version || (online_material == null ? void 0 : online_material.version) || null;
1661          const hasElearning = Boolean(pk && sk && version);
1662          const trainingMaterial = getCurrentCourseMaterial(
1663            record,
1664            materialApiBase,
1665            "material"
1666          );
1667          return {
1668            is_online_course: Boolean((_a2 = product.course) == null ? void 0 : _a2.is_online_course) && hasElearning,
1669            courseId: product.course.id,
1670            ulid,
1671            pk,
1672            sk,
1673            title: product.course.title,
1674            product_type: product.course.product_type,
1675            core_areas: product.course.core_areas,
1676            duration_text: product.course.duration_text,
1677            thumbnail,
1678            orderItemId: product.id,
1679            progress: product.learning_progress || 0,
1680            version,
1681            has_elearning: hasElearning,
1682            last_access: product.latest_access_at,
1683            last_access_diff: product.latest_access_at_diff,
1684            payment_status: product.payment_status,
1685            materialUrl: trainingMaterial.url,
1686            materialLabel: trainingMaterial.label,
1687            hasMaterial: Boolean(trainingMaterial.url)
1688          };
1689        });
1690        if (append) {
1691          section.courses.push(...formatted);
1692        } else {
1693          section.courses = formatted;
1694        }
1695        section.fetched = true;
1696        if (meta) {
1697          section.page = meta.current_page;
1698          section.totalPages = meta.total_pages;
1699          section.total = (_a = meta.total) != null ? _a : section.courses.length;
1700          section.hasMore = meta.current_page < meta.total_pages;
1701        } else {
1702          section.total = section.courses.length;
1703          section.hasMore = false;
1704        }
1705      } finally {
1706        isLoading.value = false;
1707        isLoadingMore.value = false;
1708      }
1709    };
1710    const loadMore = (section) => {
1711      if (!section || !(section.page < section.totalPages))
1712        return;
1713      section.page++;
1714      fetchCourses(section.name, true);
1715    };
1716    watch(tab, (newTab) => {
1717      const section = sections.find((s) => s.name === newTab);
1718      if (section && !section.fetched) {
1719        section.page = 1;
1720        fetchCourses(newTab);
1721      }
1722    });
1723    watch([searchQuery, selectedCourseTypes], () => {
1724      sections.forEach((section) => {
1725        section.fetched = false;
1726        section.page = 1;
1727        section.courses = [];
1728        section.hasMore = true;
1729        section.total = 0;
1730      });
1731      fetchCourses(tab.value);
1732    });
1733    onMounted(() => {
1734      fetchCourses(tab.value);
1735    });
1736    const continueLearning = (course) => {
1737      if (!(course == null ? void 0 : course.ulid) || !(course == null ? void 0 : course.sk) || !(course == null ? void 0 : course.version))
1738        return;
1739      const baseUrl = apiEndPoint.E_LEARNING_URL;
1740      const bridgeUrl = `${baseUrl}/auth-bridge?ulid=${course.ulid}&sk=${course.sk}&oi_id=${course.orderItemId}`;
1741      const elearningWin = window.open(bridgeUrl, "_blank");
1742      const onMessage = (event) => {
1743        try {
1744          if (event.origin === baseUrl && event.data === "ready") {
1745            if (elearningWin && !elearningWin.closed) {
1746              elearningWin.postMessage(
1747                {
1748                  token: userStore.getToken,
1749                  refreshToken: userStore.getRefreshToken
1750                },
1751                baseUrl
1752              );
1753            }
1754          }
1755        } finally {
1756          window.removeEventListener("message", onMessage);
1757        }
1758      };
1759      try {
1760        window.addEventListener("message", onMessage, { once: true });
1761      } catch (e) {
1762        window.addEventListener("message", onMessage);
1763      }
1764    };
1765    return (_ctx, _cache) => {
1766      const _component_q_heading_1 = resolveComponent("q-heading-1");
1767      return openBlock(), createBlock(QPage, {
1768        padding: "",
1769        class: "my-learning-page my-learning-page--modern"
1770      }, {
1771        default: withCtx(() => [
1772          createBaseVNode("div", _hoisted_1, [
1773            createVNode(BackBtnPrimary, { route_name: "dashboard-page" }),
1774            createBaseVNode("div", _hoisted_2, [
1775              createVNode(_component_q_heading_1, {
1776                icon: "mdi-book-open-variant",
1777                title: "My Learning",
1778                subtitle: "All your courses",
1779                showLine: true
1780              })
1781            ]),
1782            createVNode(MyLearningModernView, {
1783              tab: tab.value,
1784              sections,
1785              "is-loading": isLoading.value,
1786              "is-loading-more": isLoadingMore.value,
1787              "onUpdate:tab": _cache[0] || (_cache[0] = ($event) => tab.value = $event),
1788              onLoadMore: loadMore,
1789              onContinue: continueLearning
1790            }, null, 8, ["tab", "sections", "is-loading", "is-loading-more"])
1791          ])
1792        ]),
1793        _: 1
1794      });
1795    };
1796  }
1797};
1798var MyLearningPage = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-13eb2eb7"], ["__file", "MyLearningPage.vue"]]);
1799export { MyLearningPage as default };
1800//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXlMZWFybmluZ1BhZ2UuZjdiOWI0YzAuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYWdlcy91c2VyL2xlYXJuaW5nL2NvbXBvbmVudHMvTGVhcm5pbmdDb3Vyc2VDYXJkLnZ1ZSIsIi4uLy4uLy4uL3NyYy9wYWdlcy91c2VyL2xlYXJuaW5nL2NvbXBvbmVudHMvQ291cnNlQWN0aW9uc1NoZWV0LnZ1ZSIsIi4uLy4uLy4uL3NyYy9wYWdlcy91c2VyL2xlYXJuaW5nL2NvbXBvbmVudHMvTXlMZWFybmluZ01vZGVyblZpZXcudnVlIiwiLi4vLi4vLi4vc3JjL2hlbHBlcnMvbGVhcm5pbmcvY291cnNlTWF0ZXJpYWwuanMiLCIuLi8uLi8uLi9zcmMvcGFnZXMvdXNlci9sZWFybmluZy9NeUxlYXJuaW5nUGFnZS52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICA8cS1jYXJkIGZsYXQgYm9yZGVyZWQgY2xhc3M9XCJsZWFybmluZy1jb3Vyc2UtY2FyZCBjdXJzb3ItcG9pbnRlclwiIEBjbGljaz1cIiRlbWl0KCdvcGVuJywgY291cnNlKVwiPlxuICAgIDxxLWNhcmQtc2VjdGlvbiBjbGFzcz1cInEtcGEtbWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbm8td3JhcCBxLWd1dHRlci14LW1kIGl0ZW1zLXN0YXJ0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWFybmluZy1jb3Vyc2UtY2FyZF9fdGh1bWIgY29sLWF1dG9cIj5cbiAgICAgICAgICA8aW1nXG4gICAgICAgICAgICB2LWlmPVwiY291cnNlLnRodW1ibmFpbFwiXG4gICAgICAgICAgICA6c3JjPVwiY291cnNlLnRodW1ibmFpbFwiXG4gICAgICAgICAgICA6YWx0PVwiY291cnNlLnRpdGxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwibGVhcm5pbmctY291cnNlLWNhcmRfX3RodW1iLWltZ1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IHYtZWxzZSBjbGFzcz1cImxlYXJuaW5nLWNvdXJzZS1jYXJkX190aHVtYi1mYWxsYmFja1wiPlxuICAgICAgICAgICAgPHEtaWNvbiBuYW1lPVwibWRpLXRyb3BoeVwiIHNpemU9XCIyOHB4XCIgY29sb3I9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC13ZWlnaHQtbWVkaXVtIHRleHQtZGFyayBpYmYtaDkgcS1tYi14c1wiIHN0eWxlPVwibGluZS1oZWlnaHQ6IDEuM1wiPlxuICAgICAgICAgICAge3sgY291cnNlLnRpdGxlIH19XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBxLWd1dHRlci14cyB
1800xLW1iLXNtXCI+XG4gICAgICAgICAgICA8cS1iYWRnZVxuICAgICAgICAgICAgICB2LWlmPVwicHJvZHVjdFR5cGVMYWJlbFwiXG4gICAgICAgICAgICAgIHJvdW5kZWRcbiAgICAgICAgICAgICAgY2xhc3M9XCJsZWFybmluZy1jb3Vyc2UtY2FyZF9fY2hpcCBsZWFybmluZy1jb3Vyc2UtY2FyZF9fY2hpcC0tdHlwZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHByb2R1Y3RUeXBlTGFiZWwgfX1cbiAgICAgICAgICAgIDwvcS1iYWRnZT5cbiAgICAgICAgICAgIDxxLWJhZGdlXG4gICAgICAgICAgICAgIHYtaWY9XCJjb3JlQXJlYUxhYmVsXCJcbiAgICAgICAgICAgICAgcm91bmRlZFxuICAgICAgICAgICAgICBjbGFzcz1cImxlYXJuaW5nLWNvdXJzZS1jYXJkX19jaGlwIGxlYXJuaW5nLWNvdXJzZS1jYXJkX19jaGlwLS1hcmVhXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgY29yZUFyZWFMYWJlbCB9fVxuICAgICAgICAgICAgPC9xLWJhZGdlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIC0tPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBxLWd1dHRlci14c1wiPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgdi1mb3I9XCJpdGVtIGluIGZlYXR1cmVJdGVtc1wiXG4gICAgICAgICAgICAgIDprZXk9XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibGVhcm5pbmctY291cnNlLWNhcmRfX2ZlYXR1cmVcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7XG4gICAgICAgICAgICAgICAgJ2xlYXJuaW5nLWNvdXJzZS1jYXJkX19mZWF0dXJlLS1hdmFpbGFibGUnOiBpdGVtLmF2YWlsYWJsZSxcbiAgICAgICAgICAgICAgICAnbGVhcm5pbmctY291cnNlLWNhcmRfX2ZlYXR1cmUtLXVuYXZhaWxhYmxlJzogIWl0ZW0uYXZhaWxhYmxlLFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHEtaWNvbiA6bmFtZT1cIml0ZW0uaWNvblwiIHNpemU9XCIxMnB4XCIgY2xhc3M9XCJxLW1yLXhzXCIgLz5cbiAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvcS1jYXJkLXNlY3Rpb24+XG5cbiAgICA8ZGl2IGNsYXNzPVwibGVhcm5pbmctY291cnNlLWNhcmRfX2Zvb3RlciBxLXB4LW1kIHEtcGItbWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBxLW1iLXhzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgaXRlbXMtY2VudGVyIHRleHQtZ3JleS03IGliZi1oMTJcIj5cbiAgICAgICAgICA8cS1pY29uIG5hbWU9XCJtZGktY2xvY2stb3V0bGluZVwiIHNpemU9XCIxNHB4XCIgY29sb3I9XCJwcmltYXJ5XCIgY2xhc3M9XCJxLW1yLXhzXCIgLz5cbiAgICAgICAgICA8c3Bhbj5MYXN0IGFjY2Vzc2VkIHt7IGxhc3RBY2Nlc3NlZExhYmVsIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICB2LWlmPVwiaGFzRWxlYXJuaW5nSW5mb1wiXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LWdyZXktOCBpYmYtaDEyIHRleHQtd2VpZ2h0LW1lZGl1bVwiXG4gICAgICAgID57eyBwcm9ncmVzc1ZhbHVlIH19JTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHEtbGluZWFyLXByb2dyZXNzXG4gICAgICAgIHYtaWY9XCJoYXNFbGVhcm5pbmdJbmZvXCJcbiAgICAgICAgcm91bmRlZFxuICAgICAgICBzaXplPVwiNnB4XCJcbiAgICAgICAgOnZhbHVlPVwicHJvZ3Jlc3NWYWx1ZSAvIDEwMFwiXG4gICAgICAgIGNvbG9yPVwiZ3JlZW5cIlxuICAgICAgICB0cmFjay1jb2xvcj1cImdyZXktNFwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICA8L3EtY2FyZD5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgc2V0dXA+XG5pbXBvcnQgeyBjb21wdXRlZCwgb25Nb3VudGVkLCByZWYsIHdhdGNoIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgZm9ybWF0LCBpc1ZhbGlkIH0gZnJvbSBcImRhdGUtZm5zXCI7XG5pbXBvcnQgeyB1c2VMZWFybmluZ1N0b3JlIH0gZnJvbSBcInNyYy9zdG9yZXMvbGVhcm5pbmctc3RvcmVcIjtcblxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XG4gIGNvdXJzZToge1xuICAgIHR5cGU6IE9iamVjdCxcbiAgICByZXF1aXJlZDogdHJ1ZSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVFbWl0cyhbXCJvcGVuXCJdKTtcblxuY29uc3QgbGVhcm5pbmdTdG9yZSA9IHVzZUxlYXJuaW5nU3RvcmUoKTtcblxuY29uc3QgZmVhdHVyZXMgPSByZWYoe1xuICBhc3Nlc3NtZW50czogZmFsc2UsXG4gIHRyYWluaW5nOiBmYWxzZSxcbiAgZXZhbHVhdGlvbjogZmFsc2UsXG59KTtcblxuY29uc3QgZmVhdHVyZUl0ZW1zID0gY29tcHV0ZWQoKCkgPT4gW1xuICB7XG4gICAga2V5OiBcImFzc2Vzc21lbnRzXCIsXG4gICAgbGFiZWw6IFwiQXNzZXNzbWVudHNcIixcbiAgICBpY29uOiBcIm1kaS1jbGlwYm9hcmQtdGV4dC1vdXRsaW5lXCIsXG4gICAgYXZhaWxhYmxlOiBmZWF0dXJlcy52YWx1ZS5hc3Nlc3NtZW50cyxcbiAgfSxcbiAge1xuICAgIGtleTogXCJ0cmFpbmluZ1wiLFxuICAgIGxhYmVsOiBcIlRyYWluaW5nIFNlc3Npb25cIixcbiAgICBpY29uOiBcIm1kaS1jYWxlbmRhci1jbG9jay1vdXRsaW5lXCIsXG4gICAgYXZhaWxhYmxlOiBmZWF0dXJlcy52YWx1ZS50cmFpbmluZyxcbiAgfSxcbiAge1xuICAgIGtleTogXCJldmFsdWF0aW9uXCIsXG4gICAgbGFiZWw6IFwiRXZhbHVhdGlvblwiLFxuICAgIGljb246IFwibWRpLXN0YXItb3V0bGluZVwiLFxuICAgIGF2YWlsYWJsZTogZmVhdHVyZXMudmFsdWUuZXZhbHVhdGlvbixcbiAgfSxcbl0pO1xuXG5jb25zdCBsb2FkRmVhdHVyZXMgPSBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGNvdXJzZUlkID0gcHJvcHMuY291cnNlPy5jb3Vyc2VJZDtcbiAgaWYgKCFjb3Vyc2VJZCkge1xuICAgIGZlYXR1cmVzLnZhbHVlID0ge1xuICAgICAgYXNzZXNzbWVudHM6IGZhbHNlLFxuICAgICAgdHJhaW5pbmc6IGZhbHNlLFxuICAgICAgZXZhbHVhdGlvbjogZmFsc2UsXG4gICAgfTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBsZWFybmluZ1N0b3JlLnNlcnZlckZldGNoQ291cnNlRmVhdHVyZUF2YWlsYWJpbGl0eShjb3Vyc2VJZCk7XG4gIGZlYXR1cmVzLnZhbHVlID0ge1xuICAgIGFzc2Vzc21lbnRzOiBCb29sZWFuKHJlc3VsdD8uYXNzZXNzbWVudHMpLFxuICAgIHRyYWluaW5nOiBCb29sZWFuKHJlc3VsdD8udHJhaW5pbmcpLFxuICAgIGV2YWx1YXRpb246IEJvb2xlYW4ocmVzdWx0Py5ldmFsdWF0aW9uKSxcbiAgfTtcbn07XG5cbm9uTW91bnRlZChsb2FkRmVhdHVyZXMpO1xud2F0Y2goXG4gICgpID0+IHByb3BzLmNvdXJzZT8uY291cnNlSWQsXG4gICgpID0+IHtcbiAgICBsb2FkRmVhdHVyZXMoKTtcbiAgfVxuKTtcblxuY29uc3QgcHJvZ3Jlc3NWYWx1ZSA9IGNvbXB1dGVkKCgpID0+XG4gIE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgTnVtYmVyKHByb3BzLmNvdXJzZT8ucHJvZ3Jlc3MpIHx8IDApKVxuKTtcblxuLyoqIFByb2dyZXNzIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIHRoZSBjb3Vyc2UgaGFzIGxpbmtlZCBlLWxlYXJuaW5nIG1hdGVyaWFsIChwaywgc2ssIHZlcnNpb24pLiAqL1xuY29uc3QgaGFzRWxlYXJuaW5nSW5mbyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgY29uc3QgY291cnNlID0gcHJvcHMuY291cnNlO1xuICBpZiAodHlwZW9mIGNvdXJzZT8uaGFzX2VsZWFybmluZyA9PT0gXCJib29sZWFuXCIpIHJldHVybi
1800Bjb3Vyc2UuaGFzX2VsZWFybmluZztcbiAgcmV0dXJuIEJvb2xlYW4oY291cnNlPy5wayAmJiBjb3Vyc2U/LnNrICYmIGNvdXJzZT8udmVyc2lvbik7XG59KTtcblxuY29uc3QgZm9ybWF0TGFzdEFjY2Vzc2VkID0gKHZhbHVlKSA9PiB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIi0tIC0tXCI7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICBpZiAoIWlzVmFsaWQoZGF0ZSkpIHJldHVybiBcIi0tIC0tXCI7XG4gICAgcmV0dXJuIGZvcm1hdChkYXRlLCBcImRkLU1NTS15eXl5XCIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCItLSAtLVwiO1xuICB9XG59O1xuXG5jb25zdCBsYXN0QWNjZXNzZWRMYWJlbCA9IGNvbXB1dGVkKCgpID0+XG4gIGZvcm1hdExhc3RBY2Nlc3NlZChwcm9wcy5jb3Vyc2U/Lmxhc3RfYWNjZXNzKVxuKTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgc2NvcGVkIGxhbmc9XCJzY3NzXCI+XG4ubGVhcm5pbmctY291cnNlLWNhcmQge1xuICBib3JkZXItcmFkaXVzOiAxNnB4O1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNik7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMDQpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuMTVzIGVhc2U7XG5cbiAgJjpob3ZlciB7XG4gICAgYm94LXNoYWRvdzogMCA0cHggMTRweCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xuICB9XG5cbiAgJl9fdGh1bWIge1xuICAgIHdpZHRoOiA1NnB4O1xuICAgIGhlaWdodDogNTZweDtcbiAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZmxleC1zaHJpbms6IDA7XG4gIH1cblxuICAmX190aHVtYi1pbWcge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBvYmplY3QtZml0OiBjb3ZlcjtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuXG4gICZfX3RodW1iLWZhbGxiYWNrIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYmFja2dyb3VuZDogJHByaW1hcnk7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB9XG5cbiAgJl9fZmVhdHVyZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmb250LXNpemU6IDExcHg7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBwYWRkaW5nOiA0cHggMTBweDtcbiAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICBsaW5lLWhlaWdodDogMS4yO1xuICAgIG1heC13aWR0aDogMTYwcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG4gICAgJi0tYXZhaWxhYmxlIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjUsIDE0MCwgMTA2LCAwLjEyKTtcbiAgICAgIGNvbG9yOiAjMTk4YzZhO1xuICAgIH1cblxuICAgICYtLXVuYXZhaWxhYmxlIHtcbiAgICAgIGJhY2tncm91bmQ6ICNlY2VjZWM7XG4gICAgICBjb2xvcjogIzllOWU5ZTtcbiAgICB9XG4gIH1cblxuICAmX19mb290ZXIge1xuICAgIG1hcmdpbjogMCAxMnB4IDEycHg7XG4gICAgcGFkZGluZzogMTBweCAxMnB4O1xuICAgIGJhY2tncm91bmQ6ICNmNWY1ZjU7XG4gICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPHEtZGlhbG9nXG4gICAgOm1vZGVsLXZhbHVlPVwibW9kZWxWYWx1ZVwiXG4gICAgcG9zaXRpb249XCJib3R0b21cIlxuICAgIGJhY2tkcm9wLWZpbHRlcj1cImJsdXIoMnB4KVwiXG4gICAgY29udGVudC1jbGFzcz1cImNvdXJzZS1hY3Rpb25zLWRpYWxvZy1jb250ZW50XCJcbiAgICBAdXBkYXRlOm1vZGVsLXZhbHVlPVwiJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgJGV2ZW50KVwiXG4gID5cbiAgICA8cS1jYXJkIGZsYXQgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldFwiPlxuICAgICAgPHEtY2FyZC1zZWN0aW9uIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2hlYWRlciByb3cgaXRlbXMtY2VudGVyIG5vLXdyYXBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1hY3Rpb25zLXNoZWV0X190aHVtYiBxLW1yLW1kXCI+XG4gICAgICAgICAgPGltZ1xuICAgICAgICAgICAgdi1pZj1cImNvdXJzZT8udGh1bWJuYWlsXCJcbiAgICAgICAgICAgIDpzcmM9XCJjb3Vyc2UudGh1bWJuYWlsXCJcbiAgICAgICAgICAgIDphbHQ9XCJjb3Vyc2U/LnRpdGxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX3RodW1iLWltZ1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IHYtZWxzZSBjbGFzcz1cImNvdXJzZS1hY3Rpb25zLXNoZWV0X190aHVtYi1mYWxsYmFja1wiPlxuICAgICAgICAgICAgPHEtaWNvbiBuYW1lPVwibWRpLXRyb3BoeVwiIHNpemU9XCIyMnB4XCIgY29sb3I9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgdGV4dC13ZWlnaHQtbWVkaXVtIHRleHQtZGFyayBpYmYtaDggZWxsaXBzaXNcIiBzdHlsZT1cImxpbmUtaGVpZ2h0OiAxLjM1XCI+XG4gICAgICAgICAge3sgY291cnNlPy50aXRsZSB9fVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8cS1idG5cbiAgICAgICAgICBmbGF0XG4gICAgICAgICAgZGVuc2VcbiAgICAgICAgICBpY29uPVwibWRpLWNsb3NlXCJcbiAgICAgICAgICBjb2xvcj1cImdyZXktOFwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCJcbiAgICAgICAgICBjbGFzcz1cInEtbWwtc21cIlxuICAgICAgICAgIEBjbGljaz1cImNsb3NlXCJcbiAgICAgICAgLz5cbiAgICAgIDwvcS1jYXJkLXNlY3Rpb24+XG5cbiAgICAgIDxxLXNlcGFyYXRvciAvPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX3Njcm9sbFwiPlxuICAgICAgICA8cS1jYXJkLXNlY3Rpb24gY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYm9keVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fc2VjdGlvbi1sYWJlbFwiPkFzc2Vzc21lbnRzPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IHYtaWY9XCJhc3Nlc3NtZW50c0xvYWRpbmdcIiBjbGFzcz1cInEtZ3V0dGVyLXktc20gcS1tYi1sZ1wiPlxuICAgICAgICAgICAgPHEtc2tlbGV0b24gdHlwZT1cInJlY3RcIiBoZWlnaHQ9XCI3MnB4XCIgc3F1YXJlIC8+XG4gICAgICAgICAgICA8cS1za2VsZXRvbiB0eXBlPVwicmVjdFwiIGhlaWdodD1cIjcycHhcIiBzcXVhcmUgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwicS1tYi1sZ1wiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICB2LWZvcj1cImdyb3VwIGluIGFzc2Vzc21lbnRHcm91cHNcIlxuICAgICAgICAgICAgICA6a2V5PVwiZ3JvdXAua2V5XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fZ3JvdXBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2dyb3VwLWxhYmVsXCI+e3sgZ3JvdXAubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1hY3Rpb25zLXNoZWV0X19hc3Nlc3NtZW50LWxpc3RcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdi1mb3I9XCJpdGVtIGluIGdyb3VwLml0ZW1zXCJcbiAgICAgICAgICAgICAgOmtleT1cIml0ZW0ua2V5XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2Fzc2Vzc21lbnRcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7XG4gICAgICAgICAgICAgICAgJ2NvdXJzZS1hY3Rpb25zLXNoZWV0X19hc3Nlc3NtZW50LS1jb21wbGV0ZWQnOiBpdGVtLmNvbXBsZXRlZCxcbiAgICAgICAgICAgICAgICAnY291cnNlLWFjdGlvbnMtc2hlZXRfX2Fzc2Vzc21lbnQtLWRpc2FibGVkJzogIWl0ZW0udXJsLFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgOmRpc2FibGVkPVwiIWl0ZW0udXJsXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwib3BlbkFzc2Vzc21lbnRVcmwoaXRlbS51cmwpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2Fzc2Vzc21lbnQtaWNvblwiXG4gICAgICAgICAgICAgICAgOmNsYXNzPVwiYGNvdXJzZS1hY3Rpb25zLXNoZWV0X19hc3Nlc3NtZW50LWljb24tLSR7aXRlbS5raW5kfWBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHEtaWNvbiA6bmFtZT1cIml0ZW0uaWNvblwiIHNpemU9XCIyMHB4XCIgOmNvbG9yPVwiaXRlbS5pY29uQ29sb3JcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIHRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgaXRlbXMtY2VudGVyIHEtZ3V0dGVyLXgtc20gbm8td3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtd2VpZ2h0LW1lZGl1bSB0ZXh0LWRhcmtcIj57eyBpdGVtLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8cS1iYWRnZVxuICAgICAgICAgICAgICAgICAgICB2LWlmPVwiaXRlbS5jb21wbGV0ZWRcIlxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInBvc2l0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgdGV4dC1jb2xvcj1cIndoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJDb21wbGV0ZWRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvdXJzZS1hY3Rpb25zLXNoZWV0X19iYWRnZVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHEtYmFkZ2VcbiAgICAgICAgICAgICAgICAgICAgdi1lbHNlLWlmPVwiaXRlbS5mb3JtSWRcIlxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cImdyZXktNFwiXG4gICAgICAgICAgICAgICAgICAgI
1800HRleHQtY29sb3I9XCJncmV5LThcIlxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIk5vdCBzdGFydGVkXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cIml0ZW0udGl0bGUgfHwgaXRlbS5oaW50XCIgY2xhc3M9XCJ0ZXh0LWdyZXktNiBpYmYtaDEyIHEtbXQteHNcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0udGl0bGUgfHwgaXRlbS5oaW50IH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJpdGVtLmNvbXBsZXRlZCAmJiBpdGVtLmNvbXBsZXRlZEF0TGFiZWxcIiBjbGFzcz1cImliZi1oMTIgcS1tdC14cyB0ZXh0LXBvc2l0aXZlXCI+XG4gICAgICAgICAgICAgICAgICBDb21wbGV0ZWQgb24ge3sgaXRlbS5jb21wbGV0ZWRBdExhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8c3BhbiB2LWlmPVwiaXRlbS5zY29yZUxhYmVsXCI+IMK3IHt7IGl0ZW0uc2NvcmVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHYtZWxzZS1pZj1cIiFpdGVtLnVybCAmJiBpdGVtLmZvcm1JZFwiIGNsYXNzPVwiaWJmLWgxMiBxLW10LXhzIHRleHQtZ3JleS01XCI+XG4gICAgICAgICAgICAgICAgICBGb3JtIGxpbmsgdW5hdmFpbGFibGVcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPHEtaWNvblxuICAgICAgICAgICAgICAgIDpuYW1lPVwiaXRlbS5jb21wbGV0ZWQgPyAnbWRpLWNoZWNrLWNpcmNsZScgOiAnbWRpLWNoZXZyb24tcmlnaHQnXCJcbiAgICAgICAgICAgICAgICBzaXplPVwiMjBweFwiXG4gICAgICAgICAgICAgICAgOmNvbG9yPVwiaXRlbS5jb21wbGV0ZWQgPyAncG9zaXRpdmUnIDogJ2dyZXktNSdcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgdi1pZj1cInZpc2libGVBc3Nlc3NtZW50cy5sZW5ndGggPT09IDBcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNvdXJzZS1hY3Rpb25zLXNoZWV0X19lbXB0eSB0ZXh0LWdyZXktNiBpYmYtaDEyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgTm8gYXNzZXNzbWVudHMgYXZhaWxhYmxlIGZvciB0aGlzIGNvdXJzZS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1hY3Rpb25zLXNoZWV0X19zZWN0aW9uLWxhYmVsXCI+VHJhaW5pbmdzPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IHYtaWY9XCJ0cmFpbmluZ3NMb2FkaW5nXCIgY2xhc3M9XCJxLWd1dHRlci15LXNtIHEtbWItbGdcIj5cbiAgICAgICAgICAgIDxxLXNrZWxldG9uIHR5cGU9XCJyZWN0XCIgaGVpZ2h0PVwiNzJweFwiIHNxdWFyZSAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiB2LWVsc2UgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYXNzZXNzbWVudC1saXN0IHEtbWItbGdcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdi1mb3I9XCJzZXNzaW9uIGluIHRyYWluaW5nUm93c1wiXG4gICAgICAgICAgICAgIDprZXk9XCJzZXNzaW9uLmlkXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2Fzc2Vzc21lbnRcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7XG4gICAgICAgICAgICAgICAgJ2NvdXJzZS1hY3Rpb25zLXNoZWV0X19hc3Nlc3NtZW50LS1kaXNhYmxlZCc6ICFzZXNzaW9uLmFjdGlvblVybCxcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIDpkaXNhYmxlZD1cIiFzZXNzaW9uLmFjdGlvblVybFwiXG4gICAgICAgICAgICAgIEBjbGljaz1cImNvbmZpcm1MZWF2ZUFuZE9wZW4oc2Vzc2lvbi5hY3Rpb25VcmwpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2Fzc2Vzc21lbnQtaWNvbiBjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYXNzZXNzbWVudC1pY29uLS10cmFpbmluZ1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cS1pY29uXG4gICAgICAgICAgICAgICAgICA6bmFtZT1cInNlc3Npb24uaXNWaXJ0dWFsID8gJ21kaS12aWRlby1vdXRsaW5lJyA6ICdtZGktbWFwLW1hcmtlci1vdXRsaW5lJ1wiXG4gICAgICAgICAgICAgICAgICBzaXplPVwiMjBweFwiXG4gICAgICAgICAgICAgICAgICA6Y29sb3I9XCJzZXNzaW9uLmlzVmlydHVhbCA/ICdzZWNvbmRhcnknIDogJ3ByaW1hcnknXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIHRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgaXRlbXMtY2VudGVyIHEtZ3V0dGVyLXgtc21cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXdlaWdodC1tZWRpdW0gdGV4dC1kYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHNlc3Npb24uZGF0ZUxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XCJzZXNzaW9uLnRpbWVcIiBjbGFzcz1cInRleHQtZ3JleS03IHRleHQtd2VpZ2h0LXJlZ3VsYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICDCtyB7eyBzZXNzaW9uLnRpbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8cS1iYWRnZVxuICAgICAgICAgICAgICAgICAgICB2LWlmPVwic2Vzc2lvbi5pc0V4YW1cIlxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cImRlZXAtb3JhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgdGV4dC1jb2xvcj1cIndoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJFeGFtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxxLWJhZGdlXG4gICAgICAgICAgICAgICAgICAgI
1800HYtaWY9XCJzZXNzaW9uLmlzWm9vbVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgdGV4dC1jb2xvcj1cIndoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJab29tXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxxLWJhZGdlXG4gICAgICAgICAgICAgICAgICAgIHYtZWxzZS1pZj1cInNlc3Npb24uaXNWaXJ0dWFsXCJcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZVxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiVmlydHVhbFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2JhZGdlXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8cS1iYWRnZVxuICAgICAgICAgICAgICAgICAgICA6Y29sb3I9XCJzZXNzaW9uLmF0dGVuZGFuY2VCYWRnZUNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgOnRleHQtY29sb3I9XCJzZXNzaW9uLmF0dGVuZGFuY2VCYWRnZVRleHRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIDpsYWJlbD1cInNlc3Npb24uYXR0ZW5kYW5jZUxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ncmV5LTYgaWJmLWgxMiBxLW10LXhzXCI+XG4gICAgICAgICAgICAgICAgICB7eyBzZXNzaW9uLmxvY2F0aW9uTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICB2LWlmPVwic2Vzc2lvbi5jaGVja2VkSW5BdExhYmVsXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWJmLWgxMiBxLW10LXhzIHRleHQtcG9zaXRpdmVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIENoZWNrZWQgaW4ge3sgc2Vzc2lvbi5jaGVja2VkSW5BdExhYmVsIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxxLWljb25cbiAgICAgICAgICAgICAgICB2LWlmPVwic2Vzc2lvbi5hY3Rpb25VcmxcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJtZGktY2hldnJvbi1yaWdodFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cIjIwcHhcIlxuICAgICAgICAgICAgICAgIGNvbG9yPVwiZ3JleS01XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIHYtaWY9XCJ0cmFpbmluZ1Jvd3MubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fZW1wdHkgdGV4dC1ncmV5LTYgaWJmLWgxMlwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIE5vIGxvY2FsIHRyYWluaW5ncyBhdmFpbGFibGUuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9xLWNhcmQtc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2Zvb3RlclwiPlxuICAgICAgICA8cS1zZXBhcmF0b3IgLz5cbiAgICAgICAgPHEtY2FyZC1zZWN0aW9uIGNsYXNzPVwiY291cnNlLWFjdGlvbnMtc2hlZXRfX2Zvb3Rlci1ib2R5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1hY3Rpb25zLXNoZWV0X19zZWN0aW9uLWxhYmVsXCI+QWN0aW9uczwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInEtZ3V0dGVyLXktc21cIj5cbiAgICAgICAgICAgIDxxLWJ0blxuICAgICAgICAgICAgICB2LWlmPVwiY2FuU2hvd0F0dGVuZGFuY2VRclwiXG4gICAgICAgICAgICAgIHVuZWxldmF0ZWRcbiAgICAgICAgICAgICAgbm8tY2Fwc1xuICAgICAgICAgICAgICBzcXVhcmVcbiAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgb3V0bGluZVxuICAgICAgICAgICAgICBjbGFzcz1cImZ1bGwtd2lkdGggY291cnNlLWFjdGlvbnMtc2hlZXRfX2FjdGlvbi1idG5cIlxuICAgICAgICAgICAgICBpY29uPVwibWRpLXFyY29kZVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiU2hvdyBJLVFSIFRpY2tldFwiXG4gICAgICAgICAgICAgIDpsb2FkaW5nPVwidGlja2V0TG9hZGluZ1wiXG4gICAgICAgICAgICAgIEBjbGljaz1cIm9wZW5BdHRlbmRhbmNlUXJcIlxuICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJpc1BoeXNpY2FsT25seVwiPlxuICAgICAgICAgICAgICA8cS1idG5cbiAgICAgICAgICAgICAgICB1bmVsZXZhdGVkXG4gICAgICAgICAgICAgICAgbm8tY2Fwc1xuICAgICAgICAgICAgICAgIHNxdWFyZVxuICAgICAgICAgICAgICAgIGNvbG9yPVwiZ3JleS00XCJcbiAgICAgICAgICAgICAgICB0ZXh0LWNvbG9yPVwiZ3JleS04XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZ1bGwtd2lkdGggY291cnNlLWFjdGlvbnMtc2hlZXRfX2FjdGlvbi1idG5cIlxuICAgICAgICAgICAgICAgIGljb249XCJtZGktYWNjb3VudC1ncm91cC1vdXRsaW5lXCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkluLXBlcnNvbiBjbGFzcyBvbmx5XCJcbiAgICAgICAgICAgICAgICBkaXNhYmxlXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYWN0aW9uLXJlbWFyayB0ZXh0LWdyZXktNiBpYmYtaDEyXCI+XG4gICAgICAgICAgICAgICAgVGhpcyBpcyBhIHBoeXNpY2FsIC8gaW4tcGVyc29uIGNsYXNzIG9ubHkuIE9ubGluZSBsZWFybmluZyBpcyBub3RcbiAgICAgICAgICAgICAgICBhdmFpbGFibGUgZm9yIHRoaXMgY291cnNlLCBzbyBTdGFydCBMZWFybmluZyBpcyBkaXNhYmxlZC5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxuXG4gICAgICAgICAgICA8cS1idG5cbiAgICAgICAgICAgICAgdi1lbHNlLWlmPVwiIWNhbkNvbnRpbnVlXCJcbiAgICAgICAgICAgICAgdW5lbGV2YXRlZFxuICAgICAgICAgICAgICBuby1jYXBzXG4gICAgICAgICAgICAgI
1800HNxdWFyZVxuICAgICAgICAgICAgICBjb2xvcj1cImdyZXktNFwiXG4gICAgICAgICAgICAgIHRleHQtY29sb3I9XCJncmV5LThcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZ1bGwtd2lkdGggY291cnNlLWFjdGlvbnMtc2hlZXRfX2FjdGlvbi1idG5cIlxuICAgICAgICAgICAgICBpY29uPVwibWRpLXRpbWVsaW5lLWNsb2NrLW91dGxpbmVcIlxuICAgICAgICAgICAgICBsYWJlbD1cIlBlbmRpbmcgYWNjZXNzIC4uLlwiXG4gICAgICAgICAgICAgIGRpc2FibGVcbiAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgIDxxLWJ0blxuICAgICAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICAgICAgdW5lbGV2YXRlZFxuICAgICAgICAgICAgICBuby1jYXBzXG4gICAgICAgICAgICAgIHNxdWFyZVxuICAgICAgICAgICAgICBjb2xvcj1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZnVsbC13aWR0aCBjb3Vyc2UtYWN0aW9ucy1zaGVldF9fYWN0aW9uLWJ0blwiXG4gICAgICAgICAgICAgIGljb249XCJtZGktcGxheS1jaXJjbGUtb3V0bGluZVwiXG4gICAgICAgICAgICAgIDpsYWJlbD1cImNvbnRpbnVlTGFiZWxcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJlbWl0Q29udGludWVcIlxuICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgPHEtYnRuXG4gICAgICAgICAgICAgIHVuZWxldmF0ZWRcbiAgICAgICAgICAgICAgbm8tY2Fwc1xuICAgICAgICAgICAgICBzcXVhcmVcbiAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmdWxsLXdpZHRoIGNvdXJzZS1hY3Rpb25zLXNoZWV0X19hY3Rpb24tYnRuXCJcbiAgICAgICAgICAgICAgaWNvbj1cIm1kaS1kb3dubG9hZFwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiRG93bmxvYWQgVHJhaW5pbmcgTWF0ZXJpYWxcIlxuICAgICAgICAgICAgICA6ZGlzYWJsZT1cIiFoYXNNYXRlcmlhbFwiXG4gICAgICAgICAgICAgIEBjbGljaz1cIm9wZW5VcmwobWF0ZXJpYWxVcmwpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcS1jYXJkLXNlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L3EtY2FyZD5cbiAgPC9xLWRpYWxvZz5cblxuICA8cS1kaWFsb2cgdi1tb2RlbD1cInNob3dUaWNrZXREaWFsb2dcIiBwZXJzaXN0ZW50PlxuICAgIDxxLWNhcmQgY2xhc3M9XCJjb3Vyc2UtYXR0ZW5kYW5jZS10aWNrZXQtY2FyZFwiPlxuICAgICAgPHEtY2FyZC1zZWN0aW9uIGNsYXNzPVwicm93IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYmctcHJpbWFyeSB0ZXh0LXdoaXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN1YnRpdGxlMSB0ZXh0LXdlaWdodC1ib2xkXCI+SS1RUiBUaWNrZXQ8L2Rpdj5cbiAgICAgICAgPHEtYnRuIGZsYXQgcm91bmQgZGVuc2UgaWNvbj1cImNsb3NlXCIgQGNsaWNrPVwic2hvd1RpY2tldERpYWxvZyA9IGZhbHNlXCIgLz5cbiAgICAgIDwvcS1jYXJkLXNlY3Rpb24+XG5cbiAgICAgIDxxLWNhcmQtc2VjdGlvbiBjbGFzcz1cInEtcGEtbGdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlxci10aWNrZXRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXFyLXRpY2tldF9fbG9nby13cmFwXCI+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIHNyYz1cIi9pbWFnZXMvSUJGX2xvZ29fZnVsbF9iZy5wbmdcIlxuICAgICAgICAgICAgICBhbHQ9XCJJQkYgTG9nb1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaXFyLXRpY2tldF9fbG9nb1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlxci10aWNrZXRfX3RpdGxlXCI+SS1RUiBUaWNrZXQ8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgdi1pZj1cImNvdXJzZT8udGl0bGVcIiBjbGFzcz1cImlxci10aWNrZXRfX2NvdXJzZVwiPlxuICAgICAgICAgICAge3sgY291cnNlLnRpdGxlIH19XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IHYtaWY9XCJjYW5kaWRhdGVOYW1lXCIgY2xhc3M9XCJpcXItdGlja2V0X19jYW5kaWRhdGVcIj5cbiAgICAgICAgICAgIHt7IGNhbmRpZGF0ZU5hbWUgfX1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIHYtaWY9XCJ0aWNrZXRRckltYWdlVXJsXCJcbiAgICAgICAgICAgIDpzcmM9XCJ0aWNrZXRRckltYWdlVXJsXCJcbiAgICAgICAgICAgIGFsdD1cIkktUVIgVGlja2V0IFFSIGNvZGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJpcXItdGlja2V0X19xclwiXG4gICAgICAgICAgLz5cblxuICAgICAgICAgIDxkaXYgdi1pZj1cInRpY2tldENvZGVcIiBjbGFzcz1cImlxci10aWNrZXRfX2NvZGUtYmxvY2tcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpcXItdGlja2V0X19jb2RlLWxhYmVsXCI+VGlja2V0IGNvZGU8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpcXItdGlja2V0X19jb2RlLXZhbHVlXCI+e3sgdGlja2V0Q29kZSB9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlxci10aWNrZXRfX3N1YnRpdGxlXCI+XG4gICAgICAgICAgICBTaG93IHRoaXMgUVIgY29kZSB0byB5b3VyIG1vZGVyYXRvciBmb3IgY2hlY2staW4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9xLWNhcmQtc2VjdGlvbj5cblxuICAgICAgPHEtY2FyZC1hY3Rpb25zIGFsaWduPVwicmlnaHRcIiBjbGFzcz1cInEtcHgtbWQgcS1wYi1tZFwiPlxuICAgICAgICA8cS1idG5cbiAgICAgICAgICBmbGF0XG4gICAgICAgICAgbm8tY2Fwc1xuICAgICAgICAgIGNvbG9yPVwiZ3JleS03XCJcbiAgICAgICAgICBsYWJlbD1cIkNsb3NlXCJcbiAgICAgICAgICBAY2xpY2s9XCJzaG93VGlja2V0RGlhbG9nID0gZmFsc2VcIlxuICAgICAgICAvPlxuICAgICAgICA8cS1idG5cbiAgICAgICAgICB1bmVsZXZhdGVkXG4gICAgICAgICAgbm8tY2Fwc1xuICAgICAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICBpY29uPVwibWRpLWRvd25sb2FkXCJcbiAgICAgICAgICBsYWJlbD1cIkRvd25sb2FkIEpQR1wiXG4gICAgICAgICAgOmxvYWRpbmc9XCJ0aWNrZXREb3dubG9hZExvYWRpbmdcIlxuICAgICAgICAgIDpkaXNhYmxlPVwiIXRpY2tldFFySW1hZ2VVcmxcIlxuICAgICAgICAgIEBjbGljaz1cImRvd25sb2FkSXFyVGlja2V0SnBnXCJcbiAgICAgICAgLz5cbiAgICAgIDwvcS1jYXJkLWFjdGlvbnM+XG4gICAgPC9xLWNhcmQ+XG4gIDwvcS1kaWFsb2c+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IHNldHVwPlxuaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiwgd2F0Y2ggfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBmb3JtYXQsIGlzVmFsaWQgfSBmcm9tIFwiZGF0ZS1mb
1800nNcIjtcbmltcG9ydCB7IE5vdGlmeSwgdXNlUXVhc2FyIH0gZnJvbSBcInF1YXNhclwiO1xuaW1wb3J0IHsgdXNlTGVhcm5pbmdTdG9yZSB9IGZyb20gXCJzcmMvc3RvcmVzL2xlYXJuaW5nLXN0b3JlXCI7XG5pbXBvcnQgeyB1c2VVc2VyU3RvcmUgfSBmcm9tIFwic3JjL3N0b3Jlcy91c2VyLXN0b3JlXCI7XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICBtb2RlbFZhbHVlOiB7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgY291cnNlOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICAgIGRlZmF1bHQ6IG51bGwsXG4gIH0sXG59KTtcblxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFtcInVwZGF0ZTptb2RlbFZhbHVlXCIsIFwiY29udGludWVcIl0pO1xuXG5jb25zdCBsZWFybmluZ1N0b3JlID0gdXNlTGVhcm5pbmdTdG9yZSgpO1xuY29uc3QgdXNlclN0b3JlID0gdXNlVXNlclN0b3JlKCk7XG5jb25zdCAkcSA9IHVzZVF1YXNhcigpO1xuXG5jb25zdCBhc3Nlc3NtZW50c0xvYWRpbmcgPSByZWYoZmFsc2UpO1xuY29uc3QgYXNzZXNzbWVudHNQYXlsb2FkID0gcmVmKG51bGwpO1xuXG5jb25zdCB0cmFpbmluZ3NMb2FkaW5nID0gcmVmKGZhbHNlKTtcbmNvbnN0IHRyYWluaW5nU2Vzc2lvbnMgPSByZWYoW10pO1xuY29uc3QgdGlja2V0TG9hZGluZyA9IHJlZihmYWxzZSk7XG5jb25zdCB0aWNrZXREb3dubG9hZExvYWRpbmcgPSByZWYoZmFsc2UpO1xuY29uc3Qgc2hvd1RpY2tldERpYWxvZyA9IHJlZihmYWxzZSk7XG5jb25zdCBhdHRlbmRhbmNlVGlja2V0ID0gcmVmKG51bGwpO1xuXG5jb25zdCBtYXRlcmlhbFVybCA9IGNvbXB1dGVkKCgpID0+IHByb3BzLmNvdXJzZT8ubWF0ZXJpYWxVcmwgfHwgbnVsbCk7XG5jb25zdCBoYXNNYXRlcmlhbCA9IGNvbXB1dGVkKCgpID0+IEJvb2xlYW4ocHJvcHMuY291cnNlPy5oYXNNYXRlcmlhbCAmJiBtYXRlcmlhbFVybC52YWx1ZSkpO1xuY29uc3Qgb3JkZXJJdGVtSWQgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5jb3Vyc2U/Lm9yZGVySXRlbUlkIHx8IG51bGwpO1xuXG5jb25zdCBjYW5TaG93QXR0ZW5kYW5jZVFyID0gY29tcHV0ZWQoXG4gICgpID0+XG4gICAgQm9vbGVhbihvcmRlckl0ZW1JZC52YWx1ZSkgJiZcbiAgICBCb29sZWFuKHByb3BzLmNvdXJzZT8ucGF5bWVudF9zdGF0dXMpICYmXG4gICAgIXRyYWluaW5nc0xvYWRpbmcudmFsdWUgJiZcbiAgICB0cmFpbmluZ1Nlc3Npb25zLnZhbHVlLmxlbmd0aCA+IDBcbik7XG5cbmNvbnN0IHRpY2tldENvZGUgPSBjb21wdXRlZChcbiAgKCkgPT4gYXR0ZW5kYW5jZVRpY2tldC52YWx1ZT8udGlja2V0Py50aWNrZXRfY29kZSB8fCBcIlwiXG4pO1xuXG5jb25zdCBmb3JtYXRQZXJzb25UaXRsZSA9IChyYXdUaXRsZSkgPT4ge1xuICBjb25zdCB2YWx1ZSA9IFN0cmluZyhyYXdUaXRsZSB8fCBcIlwiKS50cmltKCk7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIlwiO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS5yZXBsYWNlKC9cXC4kLywgXCJcIik7XG4gIGNvbnN0IHVwcGVyID0gbm9ybWFsaXplZC50b1VwcGVyQ2FzZSgpO1xuICBpZiAodXBwZXIgPT09IFwiSC5FXCIgfHwgdXBwZXIgPT09IFwiSEVcIikgcmV0dXJuIFwiSC5FLlwiO1xuXG4gIGNvbnN0IHRpdGxlZCA9XG4gICAgbm9ybWFsaXplZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5vcm1hbGl6ZWQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIGAke3RpdGxlZH0uYDtcbn07XG5cbmNvbnN0IGNhbmRpZGF0ZU5hbWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gIGNvbnN0IHRpY2tldENhbmRpZGF0ZSA9IGF0dGVuZGFuY2VUaWNrZXQudmFsdWU/LmNhbmRpZGF0ZSB8fCB7fTtcbiAgY29uc3QgdXNlciA9IHVzZXJTdG9yZS5nZXRVc2VyIHx8IHt9O1xuXG4gIGNvbnN0IHRpdGxlID0gZm9ybWF0UGVyc29uVGl0bGUoXG4gICAgdGlja2V0Q2FuZGlkYXRlLnRpdGxlIHx8IHVzZXIudGl0bGUgfHwgcHJvcHMuY291cnNlPy50aXRsZV9uYW1lXG4gICk7XG5cbiAgY29uc3QgZnJvbVBhcnRzID0gW1xuICAgIHRpY2tldENhbmRpZGF0ZS5maXJzdF9uYW1lIHx8IHVzZXIuZmlyc3RfbmFtZSxcbiAgICB0aWNrZXRDYW5kaWRhdGUubGFzdF9uYW1lIHx8IHVzZXIubGFzdF9uYW1lLFxuICBdXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKFwiIFwiKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgbmFtZSA9XG4gICAgZnJvbVBhcnRzIHx8XG4gICAgdGlja2V0Q2FuZGlkYXRlLmZ1bGxfbmFtZSB8fFxuICAgIHVzZXIubmFtZSB8fFxuICAgIHVzZXIuZnVsbF9uYW1lIHx8XG4gICAgcHJvcHMuY291cnNlPy5zdHVkZW50X25hbWUgfHxcbiAgICBwcm9wcy5jb3Vyc2U/LmZ1bGxfbmFtZSB8fFxuICAgIHByb3BzLmNvdXJzZT8uY3VzdG9tZXJfbmFtZSB8fFxuICAgIFwiXCI7XG5cbiAgaWYgKCFuYW1lKSByZXR1cm4gdGl0bGU7XG4gIHJldHVybiB0aXRsZSA/IGAke3RpdGxlfSAke25hbWV9YCA6IG5hbWU7XG59KTtcblxuY29uc3QgdGlja2V0UXJQYXlsb2FkID0gY29tcHV0ZWQoKCkgPT4ge1xuICBjb25zdCBxciA9IGF0dGVuZGFuY2VUaWNrZXQudmFsdWU/LnRpY2tldD8ucXJfY29kZTtcbiAgaWYgKCFxcikgcmV0dXJuIHRpY2tldENvZGUudmFsdWU7XG4gIGlmICh0eXBlb2YgcXIgPT09IFwic3RyaW5nXCIpIHJldHVybiBxcjtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocXIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdGlja2V0Q29kZS52YWx1ZTtcbiAgfVxufSk7XG5cbmNvbnN0IHRpY2tldFFySW1hZ2VVcmwgPSBjb21wdXRlZCgoKSA9PiB7XG4gIGlmICghdGlja2V0UXJQYXlsb2FkLnZhbHVlKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIGBodHRwczovL2FwaS5xcnNlcnZlci5jb20vdjEvY3JlYXRlLXFyLWNvZGUvP3NpemU9MjgweDI4MCZkYXRhPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgIHRpY2tldFFyUGF5bG9hZC52YWx1ZVxuICApfWA7XG59KTtcblxuY29uc3QgaGFzRWxlYXJuaW5nQ3JlZGVudGlhbHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gIGNvbnN0IGNvdXJzZSA9IHByb3BzLmNvdXJzZTtcbiAgcmV0dXJuIEJvb2xlYW4oY291cnNlPy51bGlkICYmIGNvdXJzZT8uc2sgJiYgY291cnNlPy52ZXJzaW9uKTtcbn0pO1xuXG4vKiogUGFpZCBjb3Vyc2Ugd2l0aG91dCBsaW5rZWQgZS1sZWFybmluZyBtYXRlcmlhbCAocGh5c2ljYWwgLyBjbGFzc3Jvb20gb25seSkuICovXG5jb25zdCBpc1BoeXNpY2FsT25seSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgY29uc3QgY291cnNlID0gcHJvcHMuY291cnNlO1xuICBpZiAoIWNvdXJzZT8ucGF5bWVudF9zdGF0dXMpIHJldHVybi
1800BmYWxzZTtcbiAgaWYgKGNvdXJzZS5oYXNfZWxlYXJuaW5nID09PSBmYWxzZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhaGFzRWxlYXJuaW5nQ3JlZGVudGlhbHMudmFsdWU7XG59KTtcblxuY29uc3QgY2FuQ29udGludWUgPSBjb21wdXRlZChcbiAgKCkgPT5cbiAgICBCb29sZWFuKHByb3BzLmNvdXJzZT8ucGF5bWVudF9zdGF0dXMpICYmXG4gICAgaGFzRWxlYXJuaW5nQ3JlZGVudGlhbHMudmFsdWUgJiZcbiAgICAhaXNQaHlzaWNhbE9ubHkudmFsdWVcbik7XG5cbmNvbnN0IGNvbnRpbnVlTGFiZWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gIGNvbnN0IHByb2dyZXNzID0gTnVtYmVyKHByb3BzLmNvdXJzZT8ucHJvZ3Jlc3MpIHx8IDA7XG4gIGlmIChwcm9ncmVzcyA9PT0gMTAwKSByZXR1cm4gXCJSZXZpZXcgTGVhcm5pbmdcIjtcbiAgaWYgKHByb2dyZXNzID4gMCB8fCBwcm9wcy5jb3Vyc2U/Lmxhc3RfYWNjZXNzKSByZXR1cm4gXCJDb250aW51ZSBMZWFybmluZ1wiO1xuICByZXR1cm4gXCJTdGFydCBMZWFybmluZ1wiO1xufSk7XG5cbmNvbnN0IGZvcm1hdFNlc3Npb25EYXRlID0gKHZhbHVlKSA9PiB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIkRhdGUgVEJDXCI7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICBpZiAoIWlzVmFsaWQoZGF0ZSkpIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIHJldHVybiBmb3JtYXQoZGF0ZSwgXCJkZC1NTU0teXl5eVwiKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbn07XG5cbmNvbnN0IGZvcm1hdENvbXBsZXRlZEF0ID0gKHZhbHVlKSA9PiB7XG4gIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgaWYgKCFpc1ZhbGlkKGRhdGUpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gZm9ybWF0KGRhdGUsIFwiZGQtTU1NLXl5eXlcIik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCBpc1Nob3duT25NeUxlYXJuaW5nID0gKHNsb3QpID0+IHtcbiAgaWYgKCFzbG90Py5mb3JtSWQpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbW9kdWxlSWQgPSBTdHJpbmcoc2xvdC5tb2R1bGVJZCA/PyBcIlwiKS50cmltKCk7XG4gIC8vIEZvcm0tYnVpbGRlciBjb3Vyc2UtZGlyZWN0IGF0dGFjaCAobm8gbW9kdWxlKSBhbHdheXMgbGlzdHMgb24gTXkgTGVhcm5pbmcuXG4gIGlmIChtb2R1bGVJZCA9PT0gXCJcIikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBzbG90LnNob3dPbk15TGVhcm5pbmcgPT09IHRydWU7XG59O1xuXG5jb25zdCBtYXBBc3Nlc3NtZW50Um93ID0gKGFzc2Vzc21lbnQsIGNvbmZpZywgaW5kZXggPSAwKSA9PiB7XG4gIGlmICghaXNTaG93bk9uTXlMZWFybmluZyhhc3Nlc3NtZW50KSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgY29tcGxldGVkID0gQm9vbGVhbihhc3Nlc3NtZW50LmNvbXBsZXRlZCk7XG4gIGNvbnN0IHRvdGFsU2NvcmUgPSBhc3Nlc3NtZW50LnRvdGFsU2NvcmU7XG4gIGNvbnN0IG1heFNjb3JlID0gYXNzZXNzbWVudC5tYXhTY29yZTtcbiAgbGV0IHNjb3JlTGFiZWwgPSBudWxsO1xuICBpZiAoY29tcGxldGVkICYmIHRvdGFsU2NvcmUgIT0gbnVsbCAmJiBtYXhTY29yZSAhPSBudWxsKSB7XG4gICAgc2NvcmVMYWJlbCA9IGBTY29yZSAke3RvdGFsU2NvcmV9LyR7bWF4U2NvcmV9YDtcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZUhpbnQgPSBhc3Nlc3NtZW50Lm1vZHVsZVRpdGxlIHx8IG51bGw7XG5cbiAgcmV0dXJuIHtcbiAgICBrZXk6IGAke2NvbmZpZy5rZXl9LSR7YXNzZXNzbWVudC5tb2R1bGVJZCB8fCBcImNvdXJzZVwifS0ke2Fzc2Vzc21lbnQuZm9ybUlkfS0ke2luZGV4fWAsXG4gICAga2luZDogY29uZmlnLmtleSxcbiAgICBsYWJlbDogY29uZmlnLmxhYmVsLFxuICAgIGhpbnQ6IG1vZHVsZUhpbnQgfHwgY29uZmlnLmhpbnQsXG4gICAgaWNvbjogY29uZmlnLmljb24sXG4gICAgaWNvbkNvbG9yOiBjb25maWcuaWNvbkNvbG9yLFxuICAgIGZvcm1JZDogYXNzZXNzbWVudC5mb3JtSWQsXG4gICAgdGl0bGU6IGFzc2Vzc21lbnQudGl0bGUgfHwgbnVsbCxcbiAgICB1cmw6IGFzc2Vzc21lbnQudXJsIHx8IG51bGwsXG4gICAgY29tcGxldGVkLFxuICAgIGNvbXBsZXRlZEF0TGFiZWw6IGZvcm1hdENvbXBsZXRlZEF0KGFzc2Vzc21lbnQuY29tcGxldGVkQXQpLFxuICAgIHNjb3JlTGFiZWwsXG4gIH07XG59O1xuXG5jb25zdCBzbG90TGlzdCA9IChwYXlsb2FkLCB0eXBlKSA9PiB7XG4gIGlmICghcGF5bG9hZCkgcmV0dXJuIFtdO1xuICBjb25zdCBhcnJheXMgPSB7XG4gICAgcHJlOiBwYXlsb2FkLnByZUFzc2Vzc21lbnRzLFxuICAgIHBvc3Q6IHBheWxvYWQucG9zdEFzc2Vzc21lbnRzLFxuICAgIGV2YWx1YXRlOiBwYXlsb2FkLmV2YWx1YXRlQXNzZXNzbWVudHMsXG4gIH07XG4gIGNvbnN0IGxpc3QgPSBhcnJheXNbdHlwZV07XG4gIGlmIChBcnJheS5pc0FycmF5KGxpc3QpICYmIGxpc3QubGVuZ3RoID4gMCkgcmV0dXJuIGxpc3Q7XG4gIGNvbnN0IHNpbmdsZSA9XG4gICAgdHlwZSA9PT0gXCJwcmVcIlxuICAgICAgPyBwYXlsb2FkLnByZUFzc2Vzc21lbnRcbiAgICAgIDogdHlwZSA9PT0gXCJwb3N0XCJcbiAgICAgICAgPyBwYXlsb2FkLnBvc3RBc3Nlc3NtZW50XG4gICAgICAgIDogcGF5bG9hZC5ldmFsdWF0ZUFzc2Vzc21lbnQ7XG4gIHJldHVybiBzaW5nbGUgPyBbc2luZ2xlXSA6IFtdO1xufTtcblxuY29uc3QgdmlzaWJsZUFzc2Vzc21lbnRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICBjb25zdCBwYXlsb2FkID0gYXNzZXNzbWVudHNQYXlsb2FkLnZhbHVlO1xuICBjb25zdCBjb25maWdzID0gW1xuICAgIHtcbiAgICAgIGtleTogXCJwcmVcIixcbiAgICAgIGxhYmVsOiBcIlByZS1Bc3Nlc3NtZW50XCIsXG4gICAgICBoaW50OiBcIlRha2UgYmVmb3JlIGxlYXJuaW5nXCIsXG4gICAgICBpY29uOiBcIm1kaS1jbGlwYm9hcmQtdGV4dC1vdXRsaW5lXCIsXG4gICAgICBpY29uQ29sb3I6IFwicHJpbWFyeVwiLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiBcInBvc3RcIixcbiAgICAgIGxhYmVsOiBcIlBvc3QtQXNzZXNzbWVudFwiLFxuICAgICAgaGludDogXCJUYWtlIGFmdGVyIGxlYXJuaW5nXCIsXG4gICAgICBpY29uOiBcIm1kaS1jaGVja2JveC1tYXJrZWQtb3V0bGluZVwiLFxuICAgICAgaWNvbkNvbG9yOiBcInNlY29uZGFyeVwiLFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiBcImV2YWx1YXRlXCIsXG4gICAgICBsYWJlbDogXCJFdmFsdWF0aW9uXCIsXG4gICAgICBoaW50OiBcIkNvdXJzZSBmZWVkYmFja1wiLFxuICAgICAgaWNvbjogXCJtZGktc3Rhci1vdXRsaW5lXCIsXG4gICAgICBpY29uQ29sb3I6IFwib3JhbmdlXCIsXG4gICAgfSxcbiAgXTtcblxuICByZXR1cm4gY29uZmlncy5mbGF0TWFwKChjb25maWcpID0+XG4gICAgc2xvdExpc3QocGF5bG9hZCwgY29uZmlnLmtleSlcbiAgICAgIC5tYXAoKHNsb3QsIGluZGV4KSA9PiBtYXBBc3Nlc3NtZW50Um93KHNsb3QsIGNvbmZpZywgaW5kZXgpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICApO1xufSk7XG5cbmNvbnN0IEtJTk
1800RfTkFNRSA9IHtcbiAgcHJlOiBcIlByZS1Bc3Nlc3NtZW50XCIsXG4gIHBvc3Q6IFwiUG9zdC1Bc3Nlc3NtZW50XCIsXG4gIGV2YWx1YXRlOiBcIkV2YWx1YXRpb25cIixcbn07XG5cbmNvbnN0IEdST1VQX0xBQkVMID0ge1xuICBwcmU6IFwiUHJlLXRlc3RzXCIsXG4gIHBvc3Q6IFwiUG9zdC10ZXN0c1wiLFxuICBldmFsdWF0ZTogXCJFdmFsdWF0aW9uc1wiLFxufTtcblxuZnVuY3Rpb24gbWVhbmluZ2Z1bEZvcm1UaXRsZSh0aXRsZSkge1xuICBjb25zdCBjbGVhbmVkID0gU3RyaW5nKHRpdGxlIHx8IFwiXCIpLnRyaW0oKTtcbiAgaWYgKCFjbGVhbmVkKSByZXR1cm4gXCJcIjtcbiAgY29uc3Qgbm9ybWFsaXplZCA9ICh2YWx1ZSkgPT4gdmFsdWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csIFwiIFwiKS50cmltKCk7XG4gIGNvbnN0IHBocmFzZXMgPSBuZXcgU2V0KFtcbiAgICBcInByZSB0ZXN0XCIsXG4gICAgXCJwcmUgYXNzZXNzbWVudFwiLFxuICAgIFwicHJldGVzdFwiLFxuICAgIFwicG9zdCB0ZXN0XCIsXG4gICAgXCJwb3N0IGFzc2Vzc21lbnRcIixcbiAgICBcInBvc3R0ZXN0XCIsXG4gICAgXCJldmFsdWF0aW9uXCIsXG4gICAgXCJldmFsdWF0ZVwiLFxuICAgIFwiY291cnNlIGV2YWx1YXRpb25cIixcbiAgICBcImNvdXJzZSBmZWVkYmFja1wiLFxuICBdKTtcbiAgaWYgKHBocmFzZXMuaGFzKG5vcm1hbGl6ZWQoY2xlYW5lZCkpKSByZXR1cm4gXCJcIjtcbiAgY29uc3QgcGFydHMgPSBjbGVhbmVkLnNwbGl0KC9bOsK3fF0vKS5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG4gIGlmIChwYXJ0cy5sZW5ndGggPiAxICYmIHBhcnRzLmV2ZXJ5KChwYXJ0KSA9PiBwaHJhc2VzLmhhcyhub3JtYWxpemVkKHBhcnQpKSkpIHJldHVybiBcIlwiO1xuICByZXR1cm4gY2xlYW5lZDtcbn1cblxuY29uc3QgYXNzZXNzbWVudEdyb3VwcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgY29uc3Qgcm93cyA9IHZpc2libGVBc3Nlc3NtZW50cy52YWx1ZTtcbiAgcmV0dXJuIFtcInByZVwiLCBcInBvc3RcIiwgXCJldmFsdWF0ZVwiXVxuICAgIC5tYXAoKGtpbmQpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gcm93cy5maWx0ZXIoKHJvdykgPT4gcm93LmtpbmQgPT09IGtpbmQpO1xuICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBraW5kLFxuICAgICAgICBsYWJlbDogR1JPVVBfTEFCRUxba2luZF0sXG4gICAgICAgIGl0ZW1zOiBpdGVtcy5tYXAoKHJvdywgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCB0aXRsZSA9IG1lYW5pbmdmdWxGb3JtVGl0bGUocm93LnRpdGxlKTtcbiAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnJvdywgdGl0bGU6IHRpdGxlIHx8IG51bGwgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnJvdyxcbiAgICAgICAgICAgIGxhYmVsOiB0aXRsZSB8fCBgJHtLSU5EX05BTUVba2luZF19ICR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgICB0aXRsZTogbnVsbCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufSk7XG5cbmNvbnN0IHRyYWluaW5nUm93cyA9IGNvbXB1dGVkKCgpID0+XG4gIHRyYWluaW5nU2Vzc2lvbnMudmFsdWUubWFwKChzZXNzaW9uKSA9PiB7XG4gICAgY29uc3QgaXNWaXJ0dWFsID0gU3RyaW5nKHNlc3Npb24uZGVsaXZlcnlUeXBlIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwidmlydHVhbFwiO1xuICAgIGNvbnN0IGlzRXhhbSA9IFN0cmluZyhzZXNzaW9uLnNlc3Npb25DYXRlZ29yeSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpID09PSBcImV4YW1cIjtcbiAgICBjb25zdCBpc1pvb20gPSBpc1ZpcnR1YWwgJiYgQm9vbGVhbihzZXNzaW9uLm1lZXRpbmdMaW5rKTtcblxuICAgIGNvbnN0IHZlbnVlUGFydHMgPSBbc2Vzc2lvbi52ZW51ZSwgc2Vzc2lvbi5yb29tXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxvY2F0aW9uTGFiZWwgPSBcIkxvY2F0aW9uIFRCQ1wiO1xuICAgIGlmIChpc1pvb20pIHtcbiAgICAgIGxvY2F0aW9uTGFiZWwgPSBcIlpvb21cIjtcbiAgICB9IGVsc2UgaWYgKGlzVmlydHVhbCkge1xuICAgICAgbG9jYXRpb25MYWJlbCA9IFwiVmlydHVhbFwiO1xuICAgIH0gZWxzZSBpZiAodmVudWVQYXJ0cy5sZW5ndGgpIHtcbiAgICAgIGxvY2F0aW9uTGFiZWwgPSB2ZW51ZVBhcnRzLmpvaW4oXCIgwrcgXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dGVuZGFuY2VTdGF0dXMgPSBzZXNzaW9uLmF0dGVuZGFuY2U/LnN0YXR1cyB8fCBcIm5vdF9jaGVja2VkX2luXCI7XG4gICAgbGV0IGF0dGVuZGFuY2VMYWJlbCA9IFwiTm90IGNoZWNrZWQgaW5cIjtcbiAgICBsZXQgYXR0ZW5kYW5jZUJhZGdlQ29sb3IgPSBcImdyZXktNFwiO1xuICAgIGxldCBhdHRlbmRhbmNlQmFkZ2VUZXh0Q29sb3IgPSBcImdyZXktOFwiO1xuICAgIGlmIChhdHRlbmRhbmNlU3RhdHVzID09PSBcImNoZWNrZWRfaW5cIikge1xuICAgICAgYXR0ZW5kYW5jZUxhYmVsID0gXCJQcmVzZW50XCI7XG4gICAgICBhdHRlbmRhbmNlQmFkZ2VDb2xvciA9IFwicG9zaXRpdmVcIjtcbiAgICAgIGF0dGVuZGFuY2VCYWRnZVRleHRDb2xvciA9IFwid2hpdGVcIjtcbiAgICB9IGVsc2UgaWYgKGF0dGVuZGFuY2VTdGF0dXMgPT09IFwiYWJzZW50XCIpIHtcbiAgICAgIGF0dGVuZGFuY2VMYWJlbCA9IFwiQWJzZW50XCI7XG4gICAgICBhdHRlbmRhbmNlQmFkZ2VDb2xvciA9IFwibmVnYXRpdmVcIjtcbiAgICAgIGF0dGVuZGFuY2VCYWRnZVRleHRDb2xvciA9IFwid2hpdGVcIjtcbiAgICB9XG5cbiAgICBsZXQgY2hlY2tlZEluQXRMYWJlbCA9IG51bGw7XG4gICAgaWYgKHNlc3Npb24uYXR0ZW5kYW5jZT8uY2hlY2tlZF9pbl9hdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2hlY2tlZEF0ID0gbmV3IERhdGUoc2Vzc2lvbi5hdHRlbmRhbmNlLmNoZWNrZWRfaW5fYXQpO1xuICAgICAgICBpZiAoaXNWYWxpZC
1800hjaGVja2VkQXQpKSB7XG4gICAgICAgICAgY2hlY2tlZEluQXRMYWJlbCA9IGZvcm1hdChjaGVja2VkQXQsIFwiZGQtTU1NLXl5eXkgSEg6bW1cIik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjaGVja2VkSW5BdExhYmVsID0gU3RyaW5nKHNlc3Npb24uYXR0ZW5kYW5jZS5jaGVja2VkX2luX2F0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHNlc3Npb24uaWQsXG4gICAgICBkYXRlTGFiZWw6IGZvcm1hdFNlc3Npb25EYXRlKHNlc3Npb24uZGF0ZSksXG4gICAgICB0aW1lOiBzZXNzaW9uLnRpbWUgfHwgbnVsbCxcbiAgICAgIGxvY2F0aW9uTGFiZWwsXG4gICAgICBpc1ZpcnR1YWwsXG4gICAgICBpc0V4YW0sXG4gICAgICBpc1pvb20sXG4gICAgICBhY3Rpb25Vcmw6IHNlc3Npb24ubWVldGluZ0xpbmsgfHwgc2Vzc2lvbi5tYXBVcmwgfHwgbnVsbCxcbiAgICAgIGF0dGVuZGFuY2VMYWJlbCxcbiAgICAgIGF0dGVuZGFuY2VCYWRnZUNvbG9yLFxuICAgICAgYXR0ZW5kYW5jZUJhZGdlVGV4dENvbG9yLFxuICAgICAgY2hlY2tlZEluQXRMYWJlbCxcbiAgICB9O1xuICB9KVxuKTtcblxuY29uc3QgcmVzZXRBc3Nlc3NtZW50cyA9ICgpID0+IHtcbiAgYXNzZXNzbWVudHNQYXlsb2FkLnZhbHVlID0gbnVsbDtcbn07XG5cbmNvbnN0IHJlc2V0VHJhaW5pbmdzID0gKCkgPT4ge1xuICB0cmFpbmluZ1Nlc3Npb25zLnZhbHVlID0gW107XG59O1xuXG5jb25zdCBmZXRjaEFzc2Vzc21lbnRzID0gYXN5bmMgKCkgPT4ge1xuICBjb25zdCBjb3Vyc2VJZCA9IHByb3BzLmNvdXJzZT8uY291cnNlSWQ7XG4gIGlmICghY291cnNlSWQpIHtcbiAgICByZXNldEFzc2Vzc21lbnRzKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXNzZXNzbWVudHNMb2FkaW5nLnZhbHVlID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBsZWFybmluZ1N0b3JlLnNlcnZlckZldGNoQ291cnNlQXNzZXNzbWVudHMoY291cnNlSWQpO1xuICAgIGFzc2Vzc21lbnRzUGF5bG9hZC52YWx1ZSA9IHJlc3VsdCB8fCBudWxsO1xuICB9IGZpbmFsbHkge1xuICAgIGFzc2Vzc21lbnRzTG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICB9XG59O1xuXG5jb25zdCBmZXRjaFRyYWluaW5ncyA9IGFzeW5jICgpID0+IHtcbiAgY29uc3QgY291cnNlSWQgPSBwcm9wcy5jb3Vyc2U/LmNvdXJzZUlkO1xuICBpZiAoIWNvdXJzZUlkKSB7XG4gICAgcmVzZXRUcmFpbmluZ3MoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cmFpbmluZ3NMb2FkaW5nLnZhbHVlID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBsZWFybmluZ1N0b3JlLnNlcnZlckZldGNoQ291cnNlVHJhaW5pbmdzKFxuICAgICAgY291cnNlSWQsXG4gICAgICBvcmRlckl0ZW1JZC52YWx1ZVxuICAgICk7XG4gICAgdHJhaW5pbmdTZXNzaW9ucy52YWx1ZSA9IHJlc3VsdC5zZXNzaW9ucyB8fCBbXTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cmFpbmluZ3NMb2FkaW5nLnZhbHVlID0gZmFsc2U7XG4gIH1cbn07XG5cbmNvbnN0IG9wZW5BdHRlbmRhbmNlUXIgPSBhc3luYyAoKSA9PiB7XG4gIGlmICghb3JkZXJJdGVtSWQudmFsdWUpIHJldHVybjtcbiAgdGlja2V0TG9hZGluZy52YWx1ZSA9IHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbGVhcm5pbmdTdG9yZS5zZXJ2ZXJGZXRjaEF0dGVuZGFuY2VUaWNrZXQoXG4gICAgICBvcmRlckl0ZW1JZC52YWx1ZVxuICAgICk7XG4gICAgYXR0ZW5kYW5jZVRpY2tldC52YWx1ZSA9IHJlc3VsdDtcbiAgICBpZiAocmVzdWx0Py50aWNrZXQ/LnRpY2tldF9jb2RlKSB7XG4gICAgICBzaG93VGlja2V0RGlhbG9nLnZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgdGlja2V0TG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuICB9XG59O1xuXG5jb25zdCBsb2FkSW1hZ2UgPSAoc3JjKSA9PlxuICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgaW1nLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1nKTtcbiAgICBpbWcub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gbG9hZCB0aWNrZXQgaW1hZ2UuXCIpKTtcbiAgICBpbWcuc3JjID0gc3JjO1xuICB9KTtcblxuY29uc3Qgd3JhcENhbnZhc1RleHQgPSAoY3R4LCB0ZXh0LCBtYXhXaWR0aCkgPT4ge1xuICBjb25zdCB3b3JkcyA9IFN0cmluZyh0ZXh0IHx8IFwiXCIpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAoIXdvcmRzLmxlbmd0aCkgcmV0dXJuIFtdO1xuICBjb25zdCBsaW5lcyA9IFtdO1xuICBsZXQgY3VycmVudCA9IHdvcmRzWzBdO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IHdvcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgbmV4dCA9IGAke2N1cnJlbnR9ICR7d29yZHNbaV19YDtcbiAgICBpZiAoY3R4Lm1lYXN1cmVUZXh0KG5leHQpLndpZHRoIDw9IG1heFdpZHRoKSB7XG4gICAgICBjdXJyZW50ID0gbmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaChjdXJyZW50KTtcbiAgICAgIGN1cnJlbnQgPSB3b3Jkc1tpXTtcbiAgICB9XG4gIH1cbiAgbGluZXMucHVzaChjdXJyZW50KTtcbiAgcmV0dXJuIGxpbmVzLnNsaWNlKDAsIDMpO1xufTtcblxuY29uc3QgZG93bmxvYWRJcXJUaWNrZXRKcGcgPSBhc3luYyAoKSA9PiB7XG4gIGlmICghdGlja2V0UXJQYXlsb2FkLnZhbHVlKSByZXR1cm47XG5cbiAgdGlja2V0RG93bmxvYWRMb2FkaW5nLnZhbHVlID0gdHJ1ZTtcbiAgbGV0IHFyT2JqZWN0VXJsID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsb2dvID0gYXdhaXQgbG9hZEltYWdlKFwiL2ltYWdlcy9JQkZfbG9nb19mdWxsX2JnLnBuZ1wiKTtcblxuICAgIGNvbnN0IHFyUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgIGBodHRwczovL2FwaS5xcnNlcnZlci5jb20vdjEvY3JlYXRlLXFyLWNvZGUvP3NpemU9NTAweDUwMCZkYXRhPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICB0aWNrZXRRclBheWxvYWQudmFsdWVcbiAgICAgICl9YFxuICAgICk7XG4gICAgaWYgKCFxclJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZmV0Y2ggUVIgaW1hZ2UuXCIpO1xuICAgIGNvbnN0IHFyQmxvYiA9IGF3YWl0IHFyUmVzcG9uc2UuYmxvYigpO1xuICAgIHFyT2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChxckJsb2IpO1xuICAgIGNvbnN0IHFyID0gYXdhaXQgbG9hZEltYWdlKHFyT2JqZWN0VXJsKTtcblxuICAgIGNvbnN0IHdpZHRoID0gNzIwO1xuICAgIGNvbnN0IHBhZGRpbmcgPSA0ODtcbiAgICBjb25zdCBjb250ZW50V2lkdGggPSB3aWR0aCAtIHBhZGRpbmcgKiAyO1xuICAgIGNvbnN0IGxvZ29NYXhXID0gMjgwO1xuICAgIGNvbnN0IGxvZ29NYXhIID0gMTEwO1xuICAgIGNvbnN0IGxvZ29TY2FsZSA9IE1hdGgubWluKFxuICAgICAgbG9nb01heFcgLyBsb2dvLndpZHRoLFxuICAgICAgbG9nb01heEggLyBsb2dvLmhlaWdodCxcbiAgICAgIDFcbiAgICApO
18001xuICAgIGNvbnN0IGxvZ29XID0gbG9nby53aWR0aCAqIGxvZ29TY2FsZTtcbiAgICBjb25zdCBsb2dvSCA9IGxvZ28uaGVpZ2h0ICogbG9nb1NjYWxlO1xuICAgIGNvbnN0IHFyU2l6ZSA9IDQyMDtcbiAgICBjb25zdCBjb3Vyc2VUaXRsZSA9IHByb3BzLmNvdXJzZT8udGl0bGUgfHwgXCJcIjtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBjYW5kaWRhdGVOYW1lLnZhbHVlIHx8IFwiXCI7XG4gICAgY29uc3QgaGludCA9IFwiU2hvdyB0aGlzIFFSIGNvZGUgdG8geW91ciBtb2RlcmF0b3IgZm9yIGNoZWNrLWluLlwiO1xuXG4gICAgY29uc3QgbWVhc3VyZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIG1lYXN1cmUuZm9udCA9IFwiYm9sZCAyMnB4IHNhbnMtc2VyaWZcIjtcbiAgICBjb25zdCBjb3Vyc2VMaW5lcyA9IGNvdXJzZVRpdGxlXG4gICAgICA/IHdyYXBDYW52YXNUZXh0KG1lYXN1cmUsIGNvdXJzZVRpdGxlLCBjb250ZW50V2lkdGgpXG4gICAgICA6IFtdO1xuICAgIG1lYXN1cmUuZm9udCA9IFwiMjJweCBzYW5zLXNlcmlmXCI7XG4gICAgY29uc3QgY2FuZGlkYXRlTGluZXMgPSBjYW5kaWRhdGVcbiAgICAgID8gd3JhcENhbnZhc1RleHQobWVhc3VyZSwgY2FuZGlkYXRlLCBjb250ZW50V2lkdGgpXG4gICAgICA6IFtdO1xuICAgIG1lYXN1cmUuZm9udCA9IFwiMThweCBzYW5zLXNlcmlmXCI7XG4gICAgY29uc3QgaGludExpbmVzID0gd3JhcENhbnZhc1RleHQobWVhc3VyZSwgaGludCwgY29udGVudFdpZHRoKTtcblxuICAgIGxldCBoZWlnaHQgPSBwYWRkaW5nO1xuICAgIGhlaWdodCArPSBsb2dvSCArIDI4O1xuICAgIGhlaWdodCArPSA0MjsgLy8gdGl0bGVcbiAgICBpZiAoY291cnNlTGluZXMubGVuZ3RoKSBoZWlnaHQgKz0gY291cnNlTGluZXMubGVuZ3RoICogMjggKyAxMjtcbiAgICBpZiAoY2FuZGlkYXRlTGluZXMubGVuZ3RoKSBoZWlnaHQgKz0gY2FuZGlkYXRlTGluZXMubGVuZ3RoICogMjggKyAxNjtcbiAgICBoZWlnaHQgKz0gcXJTaXplICsgMjg7XG4gICAgaWYgKHRpY2tldENvZGUudmFsdWUpIGhlaWdodCArPSA3MDtcbiAgICBoZWlnaHQgKz0gaGludExpbmVzLmxlbmd0aCAqIDI0ICsgMTY7XG4gICAgaGVpZ2h0ICs9IHBhZGRpbmc7XG5cbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblxuICAgIGN0eC5maWxsU3R5bGUgPSBcIiNmZmZmZmZcIjtcbiAgICBjdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICBsZXQgeSA9IHBhZGRpbmc7XG4gICAgY3R4LmRyYXdJbWFnZShsb2dvLCAod2lkdGggLSBsb2dvVykgLyAyLCB5LCBsb2dvVywgbG9nb0gpO1xuICAgIHkgKz0gbG9nb0ggKyAyODtcblxuICAgIGN0eC50ZXh0QWxpZ24gPSBcImNlbnRlclwiO1xuICAgIGN0eC5maWxsU3R5bGUgPSBcIiM4ZjE3MjNcIjtcbiAgICBjdHguZm9udCA9IFwiYm9sZCAzNnB4IHNhbnMtc2VyaWZcIjtcbiAgICBjdHguZmlsbFRleHQoXCJJLVFSIFRpY2tldFwiLCB3aWR0aCAvIDIsIHkpO1xuICAgIHkgKz0gNDI7XG5cbiAgICBpZiAoY291cnNlTGluZXMubGVuZ3RoKSB7XG4gICAgICBjdHguZmlsbFN0eWxlID0gXCIjMzMzMzMzXCI7XG4gICAgICBjdHguZm9udCA9IFwiYm9sZCAyMnB4IHNhbnMtc2VyaWZcIjtcbiAgICAgIGNvdXJzZUxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICAgICAgY3R4LmZpbGxUZXh0KGxpbmUsIHdpZHRoIC8gMiwgeSk7XG4gICAgICAgIHkgKz0gMjg7XG4gICAgICB9KTtcbiAgICAgIHkgKz0gODtcbiAgICB9XG5cbiAgICBpZiAoY2FuZGlkYXRlTGluZXMubGVuZ3RoKSB7XG4gICAgICBjdHguZmlsbFN0eWxlID0gXCIjNTU1NTU1XCI7XG4gICAgICBjdHguZm9udCA9IFwiMjJweCBzYW5zLXNlcmlmXCI7XG4gICAgICBjYW5kaWRhdGVMaW5lcy5mb3JFYWNoKChsaW5lKSA9PiB7XG4gICAgICAgIGN0eC5maWxsVGV4dChsaW5lLCB3aWR0aCAvIDIsIHkpO1xuICAgICAgICB5ICs9IDI4O1xuICAgICAgfSk7XG4gICAgICB5ICs9IDEyO1xuICAgIH1cblxuICAgIGN0eC5kcmF3SW1hZ2UocXIsICh3aWR0aCAtIHFyU2l6ZSkgLyAyLCB5LCBxclNpemUsIHFyU2l6ZSk7XG4gICAgeSArPSBxclNpemUgKyAzMjtcblxuICAgIGlmICh0aWNrZXRDb2RlLnZhbHVlKSB7XG4gICAgICBjdHguZmlsbFN0eWxlID0gXCIjODg4ODg4XCI7XG4gICAgICBjdHguZm9udCA9IFwiMThweCBzYW5zLXNlcmlmXCI7XG4gICAgICBjdHguZmlsbFRleHQoXCJUaWNrZXQgY29kZVwiLCB3aWR0aCAvIDIsIHkpO1xuICAgICAgeSArPSAzMDtcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBcIiM4ZjE3MjNcIjtcbiAgICAgIGN0eC5mb250ID0gXCJib2xkIDI4cHggc2Fucy1zZXJpZlwiO1xuICAgICAgY3R4LmZpbGxUZXh0KFN0cmluZyh0aWNrZXRDb2RlLnZhbHVlKSwgd2lkdGggLyAyLCB5KTtcbiAgICAgIHkgKz0gMzY7XG4gICAgfVxuXG4gICAgY3R4LmZpbGxTdHlsZSA9IFwiIzY2NjY2NlwiO1xuICAgIGN0eC5mb250ID0gXCIxOHB4IHNhbnMtc2VyaWZcIjtcbiAgICBoaW50TGluZXMuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgICAgY3R4LmZpbGxUZXh0KGxpbmUsIHdpZHRoIC8gMiwgeSk7XG4gICAgICB5ICs9IDI0O1xuICAgIH0pO1xuXG4gICAgY29uc3QgZGF0YVVybCA9IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9qcGVnXCIsIDAuOTIpO1xuICAgIGNvbnN0IHNhZmVDb2RlID0gU3RyaW5nKHRpY2tldENvZGUudmFsdWUgfHwgXCJ0aWNrZXRcIilcbiAgICAgIC5yZXBsYWNlKC9bXlxcdy4tXSsvZywgXCItXCIpXG4gICAgICAuc2xpY2UoMCwgNDApO1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICBsaW5rLmhyZWYgPSBkYXRhVXJsO1xuICAgIGxpbmsuZG93bmxvYWQgPSBgSS1RUi1UaWNrZXQtJHtzYWZlQ29kZX0uanBnYDtcbiAgICBkb2
1800N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuICAgIGxpbmsuY2xpY2soKTtcbiAgICBsaW5rLnJlbW92ZSgpO1xuXG4gICAgTm90aWZ5LmNyZWF0ZSh7XG4gICAgICB0eXBlOiBcInBvc2l0aXZlXCIsXG4gICAgICBtZXNzYWdlOiBcIkktUVIgVGlja2V0IGRvd25sb2FkZWQuXCIsXG4gICAgICBwb3NpdGlvbjogXCJ0b3AtcmlnaHRcIixcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBOb3RpZnkuY3JlYXRlKHtcbiAgICAgIHR5cGU6IFwibmVnYXRpdmVcIixcbiAgICAgIG1lc3NhZ2U6IGVycm9yPy5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIGRvd25sb2FkIEktUVIgVGlja2V0LlwiLFxuICAgICAgcG9zaXRpb246IFwidG9wLXJpZ2h0XCIsXG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHFyT2JqZWN0VXJsKSBVUkwucmV2b2tlT2JqZWN0VVJMKHFyT2JqZWN0VXJsKTtcbiAgICB0aWNrZXREb3dubG9hZExvYWRpbmcudmFsdWUgPSBmYWxzZTtcbiAgfVxufTtcblxud2F0Y2goXG4gICgpID0+IFtwcm9wcy5tb2RlbFZhbHVlLCBwcm9wcy5jb3Vyc2U/LmNvdXJzZUlkLCBwcm9wcy5jb3Vyc2U/Lm9yZGVySXRlbUlkXSxcbiAgKFtvcGVuXSkgPT4ge1xuICAgIGlmIChvcGVuICYmIHByb3BzLmNvdXJzZSkge1xuICAgICAgZmV0Y2hBc3Nlc3NtZW50cygpO1xuICAgICAgZmV0Y2hUcmFpbmluZ3MoKTtcbiAgICB9IGVsc2UgaWYgKCFvcGVuKSB7XG4gICAgICByZXNldEFzc2Vzc21lbnRzKCk7XG4gICAgICByZXNldFRyYWluaW5ncygpO1xuICAgICAgYXR0ZW5kYW5jZVRpY2tldC52YWx1ZSA9IG51bGw7XG4gICAgICBzaG93VGlja2V0RGlhbG9nLnZhbHVlID0gZmFsc2U7XG4gICAgfVxuICB9XG4pO1xuXG5jb25zdCBjbG9zZSA9ICgpID0+IGVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCBmYWxzZSk7XG5cbmNvbnN0IG9wZW5VcmwgPSAodXJsKSA9PiB7XG4gIGlmICghdXJsKSByZXR1cm47XG4gIHdpbmRvdy5vcGVuKHVybCwgXCJfYmxhbmtcIiwgXCJub29wZW5lcixub3JlZmVycmVyXCIpO1xufTtcblxuY29uc3Qgc2FmZUh0dHBVcmwgPSAodXJsKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgIGlmIChwYXJzZWQucHJvdG9jb2wgIT09IFwiaHR0cDpcIiAmJiBwYXJzZWQucHJvdG9jb2wgIT09IFwiaHR0cHM6XCIpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBwYXJzZWQudG9TdHJpbmcoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IGxlYXZlc0liZlNpdGUgPSAodXJsKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwodXJsKS5vcmlnaW4gIT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5jb25zdCBjb25maXJtTGVhdmVBbmRPcGVuID0gKHVybCkgPT4ge1xuICBjb25zdCB0YXJnZXQgPSBzYWZlSHR0cFVybCh1cmwpO1xuICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuXG4gIGNvbnN0IHJlZGlyZWN0ID0gKCkgPT4ge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odGFyZ2V0KTtcbiAgfTtcblxuICBpZiAoIWxlYXZlc0liZlNpdGUodGFyZ2V0KSkge1xuICAgIHJlZGlyZWN0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgJHEuZGlhbG9nKHtcbiAgICB0aXRsZTogXCJMZWF2ZSBJQkY/XCIsXG4gICAgbWVzc2FnZTpcbiAgICAgIFwiWW91IGFyZSBhYm91dCB0byBsZWF2ZSB0aGUgSUJGIHdlYnNpdGUuIElmIHlvdSBjb250aW51ZSwgeW91IHdpbGwgYmUgcmVkaXJlY3RlZC5cIixcbiAgICBjYW5jZWw6IHtcbiAgICAgIGxhYmVsOiBcIlN0YXlcIixcbiAgICAgIGZsYXQ6IHRydWUsXG4gICAgICBjb2xvcjogXCJwcmltYXJ5XCIsXG4gICAgICBub0NhcHM6IHRydWUsXG4gICAgfSxcbiAgICBvazoge1xuICAgICAgbGFiZWw6IFwiQ29udGludWVcIixcbiAgICAgIGNvbG9yOiBcInByaW1hcnlcIixcbiAgICAgIHVuZWxldmF0ZWQ6IHRydWUsXG4gICAgICBub0NhcHM6IHRydWUsXG4gICAgfSxcbiAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICB9KS5vbk9rKHJlZGlyZWN0KTtcbn07XG5cbmNvbnN0IGJ1aWxkQXNzZXNzbWVudFVybFdpdGhTZXNzaW9uID0gKHVybCkgPT4ge1xuICBpZiAoIXVybCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgdG9rZW4gPSB1c2VyU3RvcmUuZ2V0VG9rZW47XG4gIGlmICghdG9rZW4pIHJldHVybiB1cmw7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHVybCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgY29uc3QgaXNGb3JtRmlsbFBhdGggPSAvXlxcL2ZcXC9bXi9dKy9pLnRlc3QocGFyc2VkVXJsLnBhdGhuYW1lIHx8IFwiXCIpO1xuICAgIGlmICghaXNGb3JtRmlsbFBhdGgpIHtcbiAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgcGFyc2VkVXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJhY2Nlc3NfdG9rZW5cIiwgdG9rZW4pO1xuXG4gICAgY29uc3QgZW1haWwgPSB1c2VyU3RvcmUuZ2V0VXNlcj8uZW1haWwgfHwgdXNlclN0b3JlLmdldFVzZXI/LndvcmtfZW1haWw7XG4gICAgaWYgKGVtYWlsKSB7XG4gICAgICBwYXJzZWRVcmwuc2VhcmNoUGFyYW1zLnNldChcImVtYWlsXCIsIGVtYWlsKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsTmFtZSA9IFt1c2VyU3RvcmUuZ2V0VXNlcj8uZmlyc3RfbmFtZSwgdXNlclN0b3JlLmdldFVzZXI/Lmxhc3RfbmFtZV1cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKFwiIFwiKVxuICAgICAgLnRyaW0oKTtcbiAgICBpZiAoZnVsbE5hbWUpIHtcbiAgICAgIHBhcnNlZFVybC5zZWFyY2hQYXJhbXMuc2V0KFwibmFtZVwiLCBmdWxsTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gdXNlclN0b3JlLmdldFJlZnJlc2hUb2tlbjtcbiAgICBpZiAocmVmcmVzaFRva2VuKSB7XG4gICAgICBwYXJzZWRVcmwuc2VhcmNoUGFyYW1zLnNldChcInJlZnJlc2hfdG9rZW5cIiwgcmVmcmVzaFRva2VuKTtcbiAgICAgIHBhcnNlZFVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZXhwaXJlc19pblwiLCBTdHJpbmcoMzAgKiAyNCAqIDYwICogNjApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkVXJsLnRvU3RyaW5nKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybi
1800B1cmw7XG4gIH1cbn07XG5cbmNvbnN0IG9wZW5Bc3Nlc3NtZW50VXJsID0gKHVybCkgPT4ge1xuICBvcGVuVXJsKGJ1aWxkQXNzZXNzbWVudFVybFdpdGhTZXNzaW9uKHVybCkpO1xufTtcblxuY29uc3QgZW1pdENvbnRpbnVlID0gKCkgPT4ge1xuICBpZiAoIWNhbkNvbnRpbnVlLnZhbHVlKSByZXR1cm47XG4gIGVtaXQoXCJjb250aW51ZVwiLCBwcm9wcy5jb3Vyc2UpO1xufTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgc2NvcGVkIGxhbmc9XCJzY3NzXCI+XG4uY291cnNlLWFjdGlvbnMtc2hlZXQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiBub25lO1xuICBtYXgtaGVpZ2h0OiBtaW4oODV2aCwgNzIwcHgpO1xuICBib3JkZXItcmFkaXVzOiAxNnB4IDE2cHggMCAwO1xuICBib3gtc2hhZG93OiAwIC00cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gICZfX2hlYWRlciB7XG4gICAgZmxleC1zaHJpbms6IDA7XG4gICAgcGFkZGluZzogMTZweCAyMHB4O1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gIH1cblxuICAmX19zY3JvbGwge1xuICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7XG4gIH1cblxuICAmX19ib2R5IHtcbiAgICBwYWRkaW5nOiAyMHB4O1xuICB9XG5cbiAgJl9fZm9vdGVyIHtcbiAgICBmbGV4LXNocmluazogMDtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIGJveC1zaGFkb3c6IDAgLTJweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4wNik7XG4gICAgcGFkZGluZy1ib3R0b206IGVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tLCAwKTtcbiAgfVxuXG4gICZfX2Zvb3Rlci1ib2R5IHtcbiAgICBwYWRkaW5nOiAxNnB4IDIwcHggMjBweDtcbiAgfVxuXG4gICZfX3RodW1iIHtcbiAgICB3aWR0aDogNDRweDtcbiAgICBoZWlnaHQ6IDQ0cHg7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICB9XG5cbiAgJl9fdGh1bWItaW1nIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgb2JqZWN0LWZpdDogY292ZXI7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICAmX190aHVtYi1mYWxsYmFjayB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJhY2tncm91bmQ6ICRwcmltYXJ5O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgfVxuXG4gICZfX3NlY3Rpb24tbGFiZWwge1xuICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICBmb250LXdlaWdodDogNjAwO1xuICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIGNvbG9yOiAjNzU3NTc1O1xuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gIH1cblxuICAmX19ncm91cCArICZfX2dyb3VwIHtcbiAgICBtYXJnaW4tdG9wOiAxNHB4O1xuICB9XG5cbiAgJl9fZ3JvdXAtbGFiZWwge1xuICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgICBjb2xvcjogIzFhMWYzNjtcbiAgICBmb250LXNpemU6IDEzcHg7XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgfVxuXG4gICZfX2Fzc2Vzc21lbnQtbGlzdCB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjA4KTtcbiAgfVxuXG4gICZfX2Fzc2Vzc21lbnQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDEycHg7XG4gICAgcGFkZGluZzogMTRweCAxNnB4O1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjA4KTtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIGJhY2tncm91bmQ6ICNmYWZhZmE7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGZvbnQ6IGluaGVyaXQ7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzIGVhc2U7XG5cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbiAgICB9XG5cbiAgICAmOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmMGYwZjA7XG4gICAgfVxuXG4gICAgJi0tY29tcGxldGVkIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjUsIDE0MCwgMTA2LCAwLjA2KTtcbiAgICB9XG5cbiAgICAmLS1kaXNhYmxlZCB7XG4gICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICBvcGFjaXR5OiAwLjg1O1xuICAgIH1cbiAgfVxuXG4gICZfX2JhZGdlIHtcbiAgICBmb250LXNpemU6IDEwcHg7XG4gICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICBwYWRkaW5nOiAycHggNnB4O1xuICB9XG5cbiAgJl9fYXNzZXNzbWVudC1pY29uIHtcbiAgICB3aWR0aDogMzZweDtcbiAgICBoZWlnaHQ6IDM2cHg7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgZmxleC1zaHJpbms6IDA7XG5cbiAgICAmLS1wcmUge1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgxNDAsIDI1LCAzNywgMC4xKTtcbiAgICB9XG5cbiAgICAmLS1wb3N0IHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgODksIDIzNSwgMC4xKTtcbiAgICB9XG5cbiAgICAmLS1ldmFsdWF0ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTUyLCAwLCAwLjEyKTtcbiAgICB9XG5cbiAgICAmLS10cmFpbmluZyB7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1LCAxNDAsIDEwNiwgMC4xKTtcbiAgICB9XG4gIH1cblxuICAmX19lbXB0eSB7XG4gICAgcGFkZGluZzogMTZweDtcbiAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4wOCk7XG4gIH1cblxuICAmX19hY3Rpb24tYnRuIHtcbiAgICBtaW4taGVpZ2h0OiA0OHB4O1xuICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxuXG4gICZfX2FjdGlvbi1yZW1hcmsge1xuICAgIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gICAgcGFkZGluZzogMCAycHg7XG4gIH1cbn1cbjwvc3R5bGU+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLyogUXVhc2FyIGNhcHMgbWluaW1pemVkIGRpYWxvZyBjb250ZW50IGF0IDU2MHB4IOKAlCBvdmVycmlkZSBmb3IgdGhpcyBzaGVldC4gKi9cbi5xLWRpYWxvZ19faW5uZXItLW1pbmltaXplZCA+IC5jb3Vyc2UtYWN0aW9ucy1kaWFsb2ctY29udGVudCxcbi5xLWRpYWxvZ19faW5uZXItLWJvdHRvbSA+IC5jb3Vyc2UtYWN0aW9ucy1kaWFsb2ctY29udGVudCxcbi5xLWRpYWxvZ19faW5uZXIgPiAuY291cnNlLWFjdGlvbnMtc2hlZXQsXG4uY291cnNlLWFjdGlvbnMtZGlhbG9nLWNvbnRlbnQuY291cnNlLWFjdGlvbnMtc2hlZXQsXG4uY291cnNlLWFjdGlvbnMtZGlhbG9nLWNvbnRlbnQge1xuICB3aWR0aDogbWluKDk2MHB4LCA5MnZ3
1800KSAhaW1wb3J0YW50O1xuICBtYXgtd2lkdGg6IG1pbig5NjBweCwgOTJ2dykgIWltcG9ydGFudDtcbn1cblxuLnEtZGlhbG9nX19pbm5lci0tYm90dG9tIHtcbiAgcGFkZGluZy1sZWZ0OiAxNnB4ICFpbXBvcnRhbnQ7XG4gIHBhZGRpbmctcmlnaHQ6IDE2cHggIWltcG9ydGFudDtcbn1cblxuLmNvdXJzZS1hdHRlbmRhbmNlLXRpY2tldC1jYXJkIHtcbiAgd2lkdGg6IG1pbig0MDBweCwgOTJ2dyk7XG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XG59XG5cbi5pcXItdGlja2V0IHtcbiAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjA2KTtcbiAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgcGFkZGluZzogMjBweCAxNnB4IDI0cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmlxci10aWNrZXRfX2xvZ28td3JhcCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xufVxuXG4uaXFyLXRpY2tldF9fbG9nbyB7XG4gIHdpZHRoOiAxNTBweDtcbiAgbWF4LXdpZHRoOiA3MCU7XG4gIGhlaWdodDogYXV0bztcbiAgb2JqZWN0LWZpdDogY29udGFpbjtcbn1cblxuLmlxci10aWNrZXRfX3RpdGxlIHtcbiAgZm9udC1zaXplOiAxLjE1cmVtO1xuICBmb250LXdlaWdodDogNzAwO1xuICBjb2xvcjogIzhmMTcyMztcbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcbn1cblxuLmlxci10aWNrZXRfX3N1YnRpdGxlIHtcbiAgZm9udC1zaXplOiAwLjg1cmVtO1xuICBjb2xvcjogIzY2NjtcbiAgbWFyZ2luLXRvcDogMTJweDtcbn1cblxuLmlxci10aWNrZXRfX2NvdXJzZSB7XG4gIGZvbnQtc2l6ZTogMC45cmVtO1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogIzMzMztcbiAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICBsaW5lLWhlaWdodDogMS4zNTtcbn1cblxuLmlxci10aWNrZXRfX2NhbmRpZGF0ZSB7XG4gIGZvbnQtc2l6ZTogMC45cmVtO1xuICBjb2xvcjogIzU1NTtcbiAgbWFyZ2luLWJvdHRvbTogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDEuMzU7XG59XG5cbi5pcXItdGlja2V0X19xciB7XG4gIHdpZHRoOiAyMjBweDtcbiAgaGVpZ2h0OiAyMjBweDtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBvYmplY3QtZml0OiBjb250YWluO1xuICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xuICBwYWRkaW5nOiA4cHg7XG4gIGJhY2tncm91bmQ6ICNmZmY7XG59XG5cbi5pcXItdGlja2V0X19jb2RlLWJsb2NrIHtcbiAgbWFyZ2luLXRvcDogMTZweDtcbn1cblxuLmlxci10aWNrZXRfX2NvZGUtbGFiZWwge1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIGNvbG9yOiAjODg4O1xuICBtYXJnaW4tYm90dG9tOiAycHg7XG59XG5cbi5pcXItdGlja2V0X19jb2RlLXZhbHVlIHtcbiAgZm9udC1zaXplOiAxLjA1cmVtO1xuICBmb250LXdlaWdodDogNzAwO1xuICBjb2xvcjogIzhmMTcyMztcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTtcbiAgd29yZC1icmVhazogYnJlYWstYWxsO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cIm15LWxlYXJuaW5nLW1vZGVyblwiPlxuICAgIDxkaXYgY2xhc3M9XCJteS1sZWFybmluZy1tb2Rlcm5fX3BpbGwtdG9nZ2xlIHEtbWItc21cIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdi1mb3I9XCJzZWN0aW9uIGluIHNlY3Rpb25zXCJcbiAgICAgICAgOmtleT1cInNlY3Rpb24ubmFtZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cIm15LWxlYXJuaW5nLW1vZGVybl9fcGlsbFwiXG4gICAgICAgIDpjbGFzcz1cInsgJ215LWxlYXJuaW5nLW1vZGVybl9fcGlsbC0tYWN0aXZlJzogdGFiID09PSBzZWN0aW9uLm5hbWUgfVwiXG4gICAgICAgIEBjbGljaz1cIiRlbWl0KCd1cGRhdGU6dGFiJywgc2VjdGlvbi5uYW1lKVwiXG4gICAgICA+XG4gICAgICAgIHt7IHNlY3Rpb24ubGFiZWwgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBPbmUgcGFuZWwgcGVyIHN0YXR1cyDigJQgc2FtZSBwYXR0ZXJuIGFzIGNsYXNzaWMgKHNlcGFyYXRlIEFQSSArIHBhZ2luYXRpb24pIC0tPlxuICAgIDxkaXZcbiAgICAgIHYtZm9yPVwic2VjdGlvblBhbmVsIGluIHNlY3Rpb25zXCJcbiAgICAgIDprZXk9XCJzZWN0aW9uUGFuZWwubmFtZVwiXG4gICAgICB2LXNob3c9XCJ0YWIgPT09IHNlY3Rpb25QYW5lbC5uYW1lXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ncmV5LTYgaWJmLWgxMiBxLXB5LXNtIHEtbWItc20gdGV4dC1jZW50ZXJcIj5cbiAgICAgICAge3sgc2VjdGlvblBhbmVsLmxhYmVsIH19OiB7eyBjb3Vyc2VDb3VudExhYmVsKHNlY3Rpb25QYW5lbCkgfX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8T3JkZXJJdGVtQ2FyZFNrZWxldG9uXG4gICAgICAgIHYtaWY9XCJpc0xvYWRpbmcgJiYgdGFiID09PSBzZWN0aW9uUGFuZWwubmFtZSAmJiAhc2VjdGlvblBhbmVsLmZldGNoZWRcIlxuICAgICAgLz5cblxuICAgICAgPHRlbXBsYXRlIHYtZWxzZT5cbiAgICAgICAgPHEtY2FyZFxuICAgICAgICAgIGZsYXRcbiAgICAgICAgICBjbGFzcz1cImliZi1jYXJkLTEgYmctZ3JleS0yXCJcbiAgICAgICAgICB2LWlmPVwiIXNlY3Rpb25QYW5lbC5jb3Vyc2VzIHx8IHNlY3Rpb25QYW5lbC5jb3Vyc2VzLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgID5cbiAgICAgICAgICA8cS1jYXJkLXNlY3Rpb24gY2xhc3M9XCJmbGV4IGZsZXgtY2VudGVyIGliZi1oOCB0ZXh0LWdyZXktNlwiPlxuICAgICAgICAgICAgLS0gTm8gaXRlbXMgdG8gZGlzcGxheSAtLVxuICAgICAgICAgIDwvcS1jYXJkLXNlY3Rpb24+XG4gICAgICAgIDwvcS1jYXJkPlxuXG4gICAgICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwicS1ndXR0ZXIteS1tZFwiPlxuICAgICAgICAgIDxMZWFybmluZ0NvdXJzZUNhcmRcbiAgICAgICAgICAgIHYtZm9yPVwiY291cnNlIGluIHNlY3Rpb25QYW5lbC5jb3Vyc2VzXCJcbiAgICAgICAgICAgIDprZXk9XCJgJHtzZWN0aW9uUGFuZWwubmFtZX0jJHtjb3Vyc2Uub3JkZXJJdGVtSWR9YFwiXG4gICAgICAgICAgICA6Y291cnNlPVwiY291cnNlXCJcbiAgICAgICAgICAgIEBvcGVuPVwib3BlbkNvdXJzZVNoZWV0XCJcbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInEtbXQtbWQgZmxleCBmbGV4LWNlbnRlclwiPlxuICAgICAgICAgICAgPHEtYnRuXG4gICAgICAgICAgICAgI
1800HYtaWY9XCJzZWN0aW9uUGFuZWwuaGFzTW9yZVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiTG9hZCBtb3JlXCJcbiAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgb3V0bGluZVxuICAgICAgICAgICAgICByb3VuZGVkXG4gICAgICAgICAgICAgIDpsb2FkaW5nPVwiaXNMb2FkaW5nTW9yZSAmJiB0YWIgPT09IHNlY3Rpb25QYW5lbC5uYW1lXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwiJGVtaXQoJ2xvYWQtbW9yZScsIHNlY3Rpb25QYW5lbClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwidGV4dC1jYXB0aW9uIHRleHQtZ3JleS02IHEtbXktbWRcIj5cbiAgICAgICAgICAgICAgWW914oCZcmUgYWxsIGNhdWdodCB1cFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cblxuICAgIDxDb3Vyc2VBY3Rpb25zU2hlZXRcbiAgICAgIHYtbW9kZWw9XCJzaGVldE9wZW5cIlxuICAgICAgOmNvdXJzZT1cInNlbGVjdGVkQ291cnNlXCJcbiAgICAgIEBjb250aW51ZT1cIiRlbWl0KCdjb250aW51ZScsICRldmVudClcIlxuICAgIC8+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBzZXR1cD5cbmltcG9ydCB7IHJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCBPcmRlckl0ZW1DYXJkU2tlbGV0b24gZnJvbSBcIi4vT3JkZXJJdGVtQ2FyZFNrZWxldG9uLnZ1ZVwiO1xuaW1wb3J0IExlYXJuaW5nQ291cnNlQ2FyZCBmcm9tIFwiLi9MZWFybmluZ0NvdXJzZUNhcmQudnVlXCI7XG5pbXBvcnQgQ291cnNlQWN0aW9uc1NoZWV0IGZyb20gXCIuL0NvdXJzZUFjdGlvbnNTaGVldC52dWVcIjtcblxuZGVmaW5lUHJvcHMoe1xuICB0YWI6IHtcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgcmVxdWlyZWQ6IHRydWUsXG4gIH0sXG4gIHNlY3Rpb25zOiB7XG4gICAgdHlwZTogQXJyYXksXG4gICAgcmVxdWlyZWQ6IHRydWUsXG4gIH0sXG4gIGlzTG9hZGluZzoge1xuICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIGlzTG9hZGluZ01vcmU6IHtcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxufSk7XG5cbmRlZmluZUVtaXRzKFtcInVwZGF0ZTp0YWJcIiwgXCJsb2FkLW1vcmVcIiwgXCJjb250aW51ZVwiXSk7XG5cbmNvbnN0IHNoZWV0T3BlbiA9IHJlZihmYWxzZSk7XG5jb25zdCBzZWxlY3RlZENvdXJzZSA9IHJlZihudWxsKTtcblxuLy8gT25seSA1IHJvd3MgbG9hZCBhdCBhIHRpbWUsIHNvIHRoZSB0YWIgdG90YWwgaXMgdXN1YWxseSBhaGVhZCBvZiB0aGUgdmlzaWJsZSBjYXJkcy5cbmNvbnN0IGNvdXJzZUNvdW50TGFiZWwgPSAoc2VjdGlvbikgPT4ge1xuICBjb25zdCBsb2FkZWQgPSBzZWN0aW9uLmNvdXJzZXM/Lmxlbmd0aCA/PyAwO1xuICBjb25zdCB0b3RhbCA9IE51bWJlcihzZWN0aW9uLnRvdGFsID8/IDApO1xuXG4gIHJldHVybiB0b3RhbCA+IGxvYWRlZCA/IGAke2xvYWRlZH0gb2YgJHt0b3RhbH0gY291cnNlKHMpYCA6IGAke2xvYWRlZH0gY291cnNlKHMpYDtcbn07XG5cbmNvbnN0IG9wZW5Db3Vyc2VTaGVldCA9IChjb3Vyc2UpID0+IHtcbiAgc2VsZWN0ZWRDb3Vyc2UudmFsdWUgPSBjb3Vyc2U7XG4gIHNoZWV0T3Blbi52YWx1ZSA9IHRydWU7XG59O1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBzY29wZWQgbGFuZz1cInNjc3NcIj5cbi5teS1sZWFybmluZy1tb2Rlcm4ge1xuICAmX19waWxsLXRvZ2dsZSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiAjZWNlY2VjO1xuICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgIHBhZGRpbmc6IDRweDtcbiAgICBnYXA6IDRweDtcbiAgfVxuXG4gICZfX3BpbGwge1xuICAgIGZsZXg6IDEgMSAwO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBjb2xvcjogIzU1NTtcbiAgICBmb250OiBpbmhlcml0O1xuICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICBmb250LXdlaWdodDogNjAwO1xuICAgIHBhZGRpbmc6IDEwcHggMThweDtcbiAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZSwgY29sb3IgMC4xNXMgZWFzZTtcblxuICAgICYtLWFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiAkc2Vjb25kYXJ5O1xuICAgICAgY29sb3I6ICNmZmY7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiZnVuY3Rpb24gYXNSZWNvcmQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IHt9O1xufVxuXG5mdW5jdGlvbiBhc1JlY29yZEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgID8gdmFsdWUubWFwKGFzUmVjb3JkKS5maWx0ZXIoKHJlY29yZCkgPT4gT2JqZWN0LmtleXMocmVjb3JkKS5sZW5ndGgpXG4gICAgOiBbXTtcbn1cblxuZnVuY3Rpb24gZ2V0VGV4dChzb3VyY2UsIGtleXMsIGZhbGxiYWNrID0gXCJcIikge1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKSkgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gZmFsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIGlzVHJ1dGh5RmxhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IFwiMVwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKFxuICAgIHZhbHVlID09PSBmYWxzZSB8fFxuICAgIHZhbHVlID09PSAwIHx8XG4gICAgdmFsdWUgPT09IFwiMFwiIHx8XG4gICAgdmFsdWUgPT09IG51bGwgfHxcbiAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICkge1xuICAgIHJldHVybi
1800BmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFtcInRydWVcIiwgXCJ5ZXNcIiwgXCJhY3RpdmVcIl0uaW5jbHVkZXModmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbiAgcmV0dXJuIEJvb2xlYW4odmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpc05vdEV4cGlyZWQoZXhwaXJlRGF0ZSkge1xuICBpZiAoIWV4cGlyZURhdGUpIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IGV4cGlyeSA9IG5ldyBEYXRlKGV4cGlyZURhdGUpO1xuICBpZiAoTnVtYmVyLmlzTmFOKGV4cGlyeS5nZXRUaW1lKCkpKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZXhwaXJ5ID49IHRvZGF5O1xufVxuXG4vKipcbiAqIExlZ2FjeSBtYXRlcmlhbHMgd2l0aG91dCBhIHR5cGUgd2VyZSB1c2VkIGFzIGNvdXJzZS9wcm9ncmFtIGRldGFpbCBQREZzLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRXh0cmFNYXRlcmlhbFR5cGUobWF0ZXJpYWwpIHtcbiAgcmV0dXJuIG1hdGVyaWFsLnR5cGUgPT09IFwibWF0ZXJpYWxcIiA/IFwibWF0ZXJpYWxcIiA6IFwiY291cnNlX2RldGFpbFwiO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTWF0ZXJpYWxVcmwodXJsLCBtYXRlcmlhbEFwaUJhc2UgPSBcIlwiKSB7XG4gIGNvbnN0IHRyaW1tZWQgPSBTdHJpbmcodXJsIHx8IFwiXCIpLnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gXCJcIjtcblxuICBpZiAoL15odHRwcz86XFwvXFwvL2kudGVzdCh0cmltbWVkKSkgcmV0dXJuIHRyaW1tZWQ7XG4gIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoXCIvL1wiKSkgcmV0dXJuIGBodHRwczoke3RyaW1tZWR9YDtcblxuICBjb25zdCBiYXNlID0gU3RyaW5nKG1hdGVyaWFsQXBpQmFzZSB8fCBcIlwiKS5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG4gIGlmICghYmFzZSkgcmV0dXJuIHRyaW1tZWQ7XG5cbiAgcmV0dXJuIGAke2Jhc2V9LyR7dHJpbW1lZC5yZXBsYWNlKC9eXFwvLywgXCJcIil9YDtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvdXJzZU1hdGVyaWFsKFxuICByZWNvcmQsXG4gIG1hdGVyaWFsQXBpQmFzZSA9IFwiXCIsXG4gIHR5cGUgPSBcImNvdXJzZV9kZXRhaWxcIlxuKSB7XG4gIGNvbnN0IG1hdGVyaWFscyA9IGFzUmVjb3JkQXJyYXkoYXNSZWNvcmQocmVjb3JkKS5leHRyYV9tYXRlcmlhbHMpLmZpbHRlcihcbiAgICAobWF0ZXJpYWwpID0+IHJlc29sdmVFeHRyYU1hdGVyaWFsVHlwZShtYXRlcmlhbCkgPT09IHR5cGVcbiAgKTtcbiAgY29uc3QgYWN0aXZlTWF0ZXJpYWxzID0gbWF0ZXJpYWxzLmZpbHRlcigobWF0ZXJpYWwpID0+XG4gICAgaXNUcnV0aHlGbGFnKG1hdGVyaWFsLmlzX2FjdGl2ZSlcbiAgKTtcblxuICBjb25zdCBjdXJyZW50ID1cbiAgICBhY3RpdmVNYXRlcmlhbHMuZmluZCgobWF0ZXJpYWwpID0+IGlzVHJ1dGh5RmxhZyhtYXRlcmlhbC5pc19jdXJyZW50KSkgfHxcbiAgICAoYWN0aXZlTWF0ZXJpYWxzLmxlbmd0aCA9PT0gMSA/IGFjdGl2ZU1hdGVyaWFsc1swXSA6IHVuZGVmaW5lZCk7XG5cbiAgaWYgKCFjdXJyZW50KSByZXR1cm4geyB1cmw6IFwiXCIsIGxhYmVsOiBcIlwiIH07XG5cbiAgY29uc3QgZXhwaXJlRGF0ZSA9IGdldFRleHQoY3VycmVudCwgW1wiZXhwaXJlX2RhdGVcIiwgXCJleHBpcmVEYXRlXCJdKTtcbiAgaWYgKCFpc05vdEV4cGlyZWQoZXhwaXJlRGF0ZSkpIHJldHVybiB7IHVybDogXCJcIiwgbGFiZWw6IFwiXCIgfTtcblxuICBjb25zdCByYXdVcmwgPSBnZXRUZXh0KGN1cnJlbnQsIFtcImZpbGVfdXJsXCIsIFwiZmlsZVVybFwiLCBcInVybFwiXSk7XG4gIGlmICghcmF3VXJsKSByZXR1cm4geyB1cmw6IFwiXCIsIGxhYmVsOiBcIlwiIH07XG5cbiAgcmV0dXJuIHtcbiAgICB1cmw6IHJlc29sdmVNYXRlcmlhbFVybChyYXdVcmwsIG1hdGVyaWFsQXBpQmFzZSksXG4gICAgbGFiZWw6IGdldFRleHQoXG4gICAgICBjdXJyZW50LFxuICAgICAgW1wibGFiZWxcIiwgXCJ0aXRsZVwiLCBcIm5hbWVcIl0sXG4gICAgICB0eXBlID09PSBcIm1hdGVyaWFsXCIgPyBcIlRyYWluaW5nIE1hdGVyaWFsXCIgOiBcIkNvdXJzZSBEZXRhaWxcIlxuICAgICksXG4gIH07XG59XG5cbmV4cG9ydCB7XG4gIGdldEN1cnJlbnRDb3Vyc2VNYXRlcmlhbCxcbiAgcmVzb2x2ZUV4dHJhTWF0ZXJpYWxUeXBlLFxuICByZXNvbHZlTWF0ZXJpYWxVcmwsXG59O1xuIiwiPHRlbXBsYXRlPlxuICA8cS1wYWdlIHBhZGRpbmcgY2xhc3M9XCJteS1sZWFybmluZy1wYWdlIG15LWxlYXJuaW5nLXBhZ2UtLW1vZGVyblwiPlxuICAgIDxkaXYgY2xhc3M9XCJpYmYtY29udGFpbmVyLTEyMDAgcS1wYS1tZFwiPlxuICAgICAgPEJhY2tCdG5QcmltYXJ5IHJvdXRlX25hbWU9XCJkYXNoYm9hcmQtcGFnZVwiIC8+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJteS1sZWFybmluZy1wYWdlX19oZWFkZXIgcS1tdC1zbSBxLW1iLW1kXCI+XG4gICAgICAgIDxxLWhlYWRpbmctMVxuICAgICAgICAgIGljb249XCJtZGktYm9vay1vcGVuLXZhcmlhbnRcIlxuICAgICAgICAgIHRpdGxlPVwiTXkgTGVhcm5pbmdcIlxuICAgICAgICAgIHN1YnRpdGxlPVwiQWxsIHlvdXIgY291cnNlc1wiXG4gICAgICAgICAgOnNob3dMaW5lPVwidHJ1ZVwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPE15TGVhcm5pbmdNb2Rlcm5WaWV3XG4gICAgICAgIDp0YWI9XCJ0YWJcIlxuICAgICAgICA6c2VjdGlvbnM9XCJzZWN0aW9uc1wiXG4gICAgICAgIDppcy1sb2FkaW5nPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgOmlzLWxvYWRpbmctbW9yZT1cImlzTG9hZGluZ01vcmVcIlxuICAgICAgICBAdXBkYXRlOnRhYj1cInRhYiA9ICRldmVudFwiXG4gICAgICAgIEBsb2FkLW1vcmU9XCJsb2FkTW9yZVwiXG4gICAgICAgIEBjb250aW51ZT1cImNvbnRpbnVlTGVhcm5pbmdcIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgPC9xLXBhZ2U+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IHNldHVwPlxuaW1wb3J0IHsgcmVhY3RpdmUsIHJlZiwgd2F0Y2gsIG9uTW91bnRlZCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCBCYWNrQnRuUHJpbWFyeSBmcm9tIFwic3JjL2NvbXBvbmVudHMvdG9vbHMvQmFja0J0blByaW1hcnkudnVlXCI7XG5pbXBvcnQgTXlMZWFybmluZ01vZGVyblZpZXcgZnJvbSBcIi4vY29tcG9uZW50cy9NeUxlYXJuaW5nTW9kZXJuVmlldy52dWVcIjtcbmltcG9ydCB7
1800IHVzZUxlYXJuaW5nU3RvcmUgfSBmcm9tIFwic3JjL3N0b3Jlcy9sZWFybmluZy1zdG9yZVwiO1xuaW1wb3J0IHsgdXNlVXNlclN0b3JlIH0gZnJvbSBcInNyYy9zdG9yZXMvdXNlci1zdG9yZVwiO1xuaW1wb3J0IEFQSV9DT05GSUcgZnJvbSBcInNyYy9oZWxwZXJzL2FwaS9hcGlDb25maWdcIjtcbmltcG9ydCB7IGdldEN1cnJlbnRDb3Vyc2VNYXRlcmlhbCB9IGZyb20gXCJzcmMvaGVscGVycy9sZWFybmluZy9jb3Vyc2VNYXRlcmlhbFwiO1xuXG5jb25zdCBsZWFybmluZ1N0b3JlID0gdXNlTGVhcm5pbmdTdG9yZSgpO1xuY29uc3QgdXNlclN0b3JlID0gdXNlVXNlclN0b3JlKCk7XG5jb25zdCBhcHBNb2RlID0gcHJvY2Vzcy5lbnYuQVBQX01PREUgfHwgXCJzdGFnaW5nXCI7XG5jb25zdCBhcGlFbmRQb2ludCA9IEFQSV9DT05GSUdbYXBwTW9kZV07XG5jb25zdCBtYXRlcmlhbEFwaUJhc2UgPSBhcGlFbmRQb2ludD8uQ01fQVBJX1VSTCB8fCBcIlwiO1xuXG5jb25zdCB0YWIgPSByZWYoXCJpbl9wcm9ncmVzc1wiKTtcbmNvbnN0IGlzTG9hZGluZyA9IHJlZih0cnVlKTtcbmNvbnN0IGlzTG9hZGluZ01vcmUgPSByZWYoZmFsc2UpO1xuXG5jb25zdCBzZWFyY2hRdWVyeSA9IHJlZihcIlwiKTtcbi8vIGNvdXJzZV90eXBlX2lkOiAyID0gTG9jYWwgQ2VydGlmaWNhdGlvbiwgMyA9IFNob3J0IFRyYWluaW5nIENvdXJzZSwgNSA9IEN1c3RvbWl6ZWRcbmNvbnN0IHNlbGVjdGVkQ291cnNlVHlwZXMgPSByZWYoWzIsIDMsIDVdKTtcbmNvbnN0IHJvd3NQZXJQYWdlID0gcmVmKDUpO1xuXG5jb25zdCBzZWN0aW9ucyA9IHJlYWN0aXZlKFtcbiAge1xuICAgIG5hbWU6IFwiaW5fcHJvZ3Jlc3NcIixcbiAgICBsYWJlbDogXCJJbiBQcm9ncmVzc1wiLFxuICAgIGljb246IFwibWRpLXByb2dyZXNzLWFsZXJ0XCIsXG4gICAgY291cnNlczogW10sXG4gICAgZmV0Y2hlZDogZmFsc2UsXG4gICAgcGFnZTogMSxcbiAgICBoYXNNb3JlOiB0cnVlLFxuICAgIHRvdGFsUGFnZXM6IDEsXG4gICAgdG90YWw6IDAsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcImNvbXBsZXRlZFwiLFxuICAgIGxhYmVsOiBcIkNvbXBsZXRlZFwiLFxuICAgIGljb246IFwibWRpLWNoZWNrLWNpcmNsZS1vdXRsaW5lXCIsXG4gICAgY291cnNlczogW10sXG4gICAgZmV0Y2hlZDogZmFsc2UsXG4gICAgcGFnZTogMSxcbiAgICBoYXNNb3JlOiB0cnVlLFxuICAgIHRvdGFsUGFnZXM6IDEsXG4gICAgdG90YWw6IDAsXG4gIH0sXG5dKTtcblxuY29uc3QgZmV0Y2hDb3Vyc2VzID0gYXN5bmMgKHN0YXR1cywgYXBwZW5kID0gZmFsc2UpID0+IHtcbiAgY29uc3Qgc2VjdGlvbiA9IHNlY3Rpb25zLmZpbmQoKHMpID0+IHMubmFtZSA9PT0gc3RhdHVzKTtcbiAgaWYgKCFzZWN0aW9uKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBpZiAoYXBwZW5kKSB7XG4gICAgICBpc0xvYWRpbmdNb3JlLnZhbHVlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNMb2FkaW5nLnZhbHVlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJzID0ge1xuICAgICAgc3RhdHVzLCAvLyBcImluX3Byb2dyZXNzXCIgfCBcImNvbXBsZXRlZFwiIOKAlCBzZXBhcmF0ZSBBUEkgZmlsdGVyIHBlciB0YWJcbiAgICAgIHJvd3NQZXJQYWdlOiByb3dzUGVyUGFnZS52YWx1ZSxcbiAgICAgIHBhZ2U6IHNlY3Rpb24ucGFnZSxcbiAgICAgIGNvdXJzZV90eXBlOiBzZWxlY3RlZENvdXJzZVR5cGVzLnZhbHVlLFxuICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnZhbHVlID8gXCJ0aXRsZVwiIDogdW5kZWZpbmVkLFxuICAgICAgdmFsdWU6IHNlYXJjaFF1ZXJ5LnZhbHVlIHx8IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBpdGVtcywgbWV0YSB9ID0gYXdhaXQgbGVhcm5pbmdTdG9yZS5zZXJ2ZXJGZXRjaE9yZGVySXRlbXMoZmlsdGVycyk7XG5cbiAgICAvLyBsaXN0LW9yZGVyLWl0ZW1zIGlzIHBhaWQtb25seSBzZXJ2ZXItc2lkZSwgc28gZXZlcnkgcm93IGl0IHJldHVybnMgaXMgcmVuZGVyZWRcbiAgICAvLyBhbmQgdGhlIHRhYiB0b3RhbCBzdGF5cyBpbiBzdGVwIHdpdGggdGhlIGNhcmRzLlxuICAgIGNvbnN0IGZvcm1hdHRlZCA9IGl0ZW1zXG4gICAgICAubWFwKChwcm9kdWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmVjb3JkLCB0aHVtYm5haWwgfSA9IHByb2R1Y3QuY291cnNlIHx8IHt9O1xuICAgICAgICBjb25zdCB7IGxpbmthZ2UgfSA9IHJlY29yZCB8fCB7IGxpbmthZ2U6IFtdIH07XG4gICAgICAgIGNvbnN0IG9ubGluZV9tYXRlcmlhbCA9XG4gICAgICAgICAgKGxpbmthZ2UgfHwgW10pLmZpbmQoXG4gICAgICAgICAgICAobGluaykgPT4gbGluay52ZXJzaW9uID09PSBwcm9kdWN0LmNvdXJzZV92ZXJzaW9uXG4gICAgICAgICAgKSB8fCBudWxsO1xuXG4gICAgICAgIGNvbnN0IHVsaWQgPSBvbmxpbmVfbWF0ZXJpYWw/LnVsaWQgfHwgbnVsbDtcbiAgICAgICAgY29uc3Qgc2sgPSBvbmxpbmVfbWF0ZXJpYWw/LlNLIHx8IHByb2R1Y3QuU0sgfHwgbnVsbDtcbiAgICAgICAgY29uc3QgcGsgPSBwcm9kdWN0LlBLIHx8IG9ubGluZV9tYXRlcmlhbD8uUEsgfHwgbnVsbDtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IHByb2R1Y3QuY291cnNlX3ZlcnNpb24gfHwgb25saW5lX21hdGVyaWFsPy52ZXJzaW9uIHx8IG51bGw7XG4gICAgICAgIGNvbnN0IGhhc0VsZWFybmluZyA9IEJvb2xlYW4ocGsgJiYgc2sgJiYgdmVyc2lvbik7XG4gICAgICAgIGNvbnN0IHRyYWluaW5nTWF0ZXJpYWwgPSBnZXRDdXJyZW50Q291cnNlTWF0ZXJpYWwoXG4gICAgICAgICAgcmVjb3JkLFxuICAgICAgICAgIG1hdGVyaWFsQXBpQmFzZSxcbiAgICAgICAgICBcIm1hdGVyaWFsXCJcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzX29ubGluZV9jb3Vyc2U6IEJvb2xlYW4ocHJvZHVjdC5jb3Vyc2U/LmlzX29ubGluZV9jb3Vyc2UpICYmIGhhc0VsZWFybmluZyxcbiAgICAgICAgICBjb3Vyc2VJZDogcHJvZHVjdC5jb3Vyc2UuaWQsXG4gICAgICAgICAgdWxpZCxcbiAgICAgICAgICBwayxcbiAgICAgICAgICBzayxcbiAgICAgICAgICB0aXRsZTogcHJvZHVjdC5jb3Vyc2UudGl0bGUsXG4gICAgICAgICAgcHJvZHVjdF90eXBlOiBwcm9kdWN0LmNvdXJzZS5wcm9kdWN0X3R5cGUsXG4gICAgICAgICAgY29yZV9hcmVhczogcHJvZHVjdC5jb3Vyc2UuY29yZV9hcmVhcyxcbiAgICAgICAgICBkdXJhdGlvbl90ZXh0OiBwcm9kdWN0LmNvdXJzZS5kdXJhdGlvbl90ZXh0LFxuICAgICAgICAgI
1800HRodW1ibmFpbCxcbiAgICAgICAgICBvcmRlckl0ZW1JZDogcHJvZHVjdC5pZCxcbiAgICAgICAgICBwcm9ncmVzczogcHJvZHVjdC5sZWFybmluZ19wcm9ncmVzcyB8fCAwLFxuICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgaGFzX2VsZWFybmluZzogaGFzRWxlYXJuaW5nLFxuICAgICAgICAgIGxhc3RfYWNjZXNzOiBwcm9kdWN0LmxhdGVzdF9hY2Nlc3NfYXQsXG4gICAgICAgICAgbGFzdF9hY2Nlc3NfZGlmZjogcHJvZHVjdC5sYXRlc3RfYWNjZXNzX2F0X2RpZmYsXG4gICAgICAgICAgcGF5bWVudF9zdGF0dXM6IHByb2R1Y3QucGF5bWVudF9zdGF0dXMsXG4gICAgICAgICAgbWF0ZXJpYWxVcmw6IHRyYWluaW5nTWF0ZXJpYWwudXJsLFxuICAgICAgICAgIG1hdGVyaWFsTGFiZWw6IHRyYWluaW5nTWF0ZXJpYWwubGFiZWwsXG4gICAgICAgICAgaGFzTWF0ZXJpYWw6IEJvb2xlYW4odHJhaW5pbmdNYXRlcmlhbC51cmwpLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICBpZiAoYXBwZW5kKSB7XG4gICAgICBzZWN0aW9uLmNvdXJzZXMucHVzaCguLi5mb3JtYXR0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWN0aW9uLmNvdXJzZXMgPSBmb3JtYXR0ZWQ7XG4gICAgfVxuXG4gICAgc2VjdGlvbi5mZXRjaGVkID0gdHJ1ZTtcblxuICAgIGlmIChtZXRhKSB7XG4gICAgICBzZWN0aW9uLnBhZ2UgPSBtZXRhLmN1cnJlbnRfcGFnZTtcbiAgICAgIHNlY3Rpb24udG90YWxQYWdlcyA9IG1ldGEudG90YWxfcGFnZXM7XG4gICAgICBzZWN0aW9uLnRvdGFsID0gbWV0YS50b3RhbCA/PyBzZWN0aW9uLmNvdXJzZXMubGVuZ3RoO1xuICAgICAgc2VjdGlvbi5oYXNNb3JlID0gbWV0YS5jdXJyZW50X3BhZ2UgPCBtZXRhLnRvdGFsX3BhZ2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWN0aW9uLnRvdGFsID0gc2VjdGlvbi5jb3Vyc2VzLmxlbmd0aDtcbiAgICAgIHNlY3Rpb24uaGFzTW9yZSA9IGZhbHNlO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpc0xvYWRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICBpc0xvYWRpbmdNb3JlLnZhbHVlID0gZmFsc2U7XG4gIH1cbn07XG5cbmNvbnN0IGxvYWRNb3JlID0gKHNlY3Rpb24pID0+IHtcbiAgaWYgKCFzZWN0aW9uIHx8ICEoc2VjdGlvbi5wYWdlIDwgc2VjdGlvbi50b3RhbFBhZ2VzKSkgcmV0dXJuO1xuICBzZWN0aW9uLnBhZ2UrKztcbiAgZmV0Y2hDb3Vyc2VzKHNlY3Rpb24ubmFtZSwgdHJ1ZSk7XG59O1xuXG4vLyBMYXp5LWxvYWQgZWFjaCBzdGF0dXMgaW5kZXBlbmRlbnRseSAoY2xhc3NpYyBiZWhhdmlvcilcbndhdGNoKHRhYiwgKG5ld1RhYikgPT4ge1xuICBjb25zdCBzZWN0aW9uID0gc2VjdGlvbnMuZmluZCgocykgPT4gcy5uYW1lID09PSBuZXdUYWIpO1xuICBpZiAoc2VjdGlvbiAmJiAhc2VjdGlvbi5mZXRjaGVkKSB7XG4gICAgc2VjdGlvbi5wYWdlID0gMTtcbiAgICBmZXRjaENvdXJzZXMobmV3VGFiKTtcbiAgfVxufSk7XG5cbndhdGNoKFtzZWFyY2hRdWVyeSwgc2VsZWN0ZWRDb3Vyc2VUeXBlc10sICgpID0+IHtcbiAgc2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xuICAgIHNlY3Rpb24uZmV0Y2hlZCA9IGZhbHNlO1xuICAgIHNlY3Rpb24ucGFnZSA9IDE7XG4gICAgc2VjdGlvbi5jb3Vyc2VzID0gW107XG4gICAgc2VjdGlvbi5oYXNNb3JlID0gdHJ1ZTtcbiAgICBzZWN0aW9uLnRvdGFsID0gMDtcbiAgfSk7XG4gIGZldGNoQ291cnNlcyh0YWIudmFsdWUpO1xufSk7XG5cbm9uTW91bnRlZCgoKSA9PiB7XG4gIGZldGNoQ291cnNlcyh0YWIudmFsdWUpO1xufSk7XG5cbmNvbnN0IGNvbnRpbnVlTGVhcm5pbmcgPSAoY291cnNlKSA9PiB7XG4gIGlmICghY291cnNlPy51bGlkIHx8ICFjb3Vyc2U/LnNrIHx8ICFjb3Vyc2U/LnZlcnNpb24pIHJldHVybjtcblxuICBjb25zdCBiYXNlVXJsID0gYXBpRW5kUG9pbnQuRV9MRUFSTklOR19VUkwgfHwgXCJodHRwczovL2VsZWFybmluZy5pYmZueHQuY29tXCI7XG4gIGNvbnN0IGJyaWRnZVVybCA9IGAke2Jhc2VVcmx9L2F1dGgtYnJpZGdlP3VsaWQ9JHtjb3Vyc2UudWxpZH0mc2s9JHtjb3Vyc2Uuc2t9Jm9pX2lkPSR7Y291cnNlLm9yZGVySXRlbUlkfWA7XG4gIGNvbnN0IGVsZWFybmluZ1dpbiA9IHdpbmRvdy5vcGVuKGJyaWRnZVVybCwgXCJfYmxhbmtcIik7XG5cbiAgY29uc3Qgb25NZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChldmVudC5vcmlnaW4gPT09IGJhc2VVcmwgJiYgZXZlbnQuZGF0YSA9PT0gXCJyZWFkeVwiKSB7XG4gICAgICAgIGlmIChlbGVhcm5pbmdXaW4gJiYgIWVsZWFybmluZ1dpbi5jbG9zZWQpIHtcbiAgICAgICAgICBlbGVhcm5pbmdXaW4ucG9zdE1lc3NhZ2UoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRva2VuOiB1c2VyU3RvcmUuZ2V0VG9rZW4sXG4gICAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogdXNlclN0b3JlLmdldFJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBiYXNlVXJsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25NZXNzYWdlKTtcbiAgICB9XG4gIH07XG5cbiAgdHJ5IHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25NZXNzYWdlLCB7IG9uY2U6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25NZXNzYWdlKTtcbiAgfVxufTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgc2NvcGVkIGxhbmc9XCJzY3NzXCI+XG4ubXktbGVhcm5pbmctcGFnZSB7XG4gICYtLW1vZGVybiB7XG4gICAgYmFja2dyb3VuZDogI2Y3ZjRlZjtcbiAgICBtaW4taGVpZ2h0OiAxMDAlO1xuICB9XG5cbiAgJl9faGVhZGVyIHtcbiAgICA6ZGVlcCgucS1oZWFkaW5nLTEpLFxuICAgIDpkZWVwKC5xLW1iLW1kKSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIl0sIm5hbWVzIjpbIl9jcmVhdGVCbG9jayIsIiRlbWl0IiwiX2NyZWF0ZVZOb2RlIiwiX2NyZWF0ZUVsZW1lbnRWTm9kZSIsIl9ob2lzdGVkXzEiLCJfaG9pc3RlZF8yIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9vcGVuQmxvY2siLCJfaG9pc3RlZF80IiwiX2hvaXN0ZWRfNSIsIl9ob2lzdGVkXzYiLCJfdG9EaXNwbGF5U3RyaW5nIiwiX2hvaXN0ZWRfNyIsIl9GcmFnbWVudCIsIl9yZW5kZXJMaXN0IiwiX2hvaXN0ZWRfOCIsIl9ob2lzdGVkXzkiLCJfaG9pc3RlZF8xMCIsIl9ob2lzdGVkXzExIiwiX2hvaXN0ZWRfMyIsIl9ub3JtYWxpem
1800VDbGFzcyIsIl9jcmVhdGVUZXh0Vk5vZGUiLCJfYSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzRkEsVUFBTSxRQUFRO0FBU2QsVUFBTSxnQkFBZ0IsaUJBQWdCO0FBRXRDLFVBQU0sV0FBVyxJQUFJO0FBQUEsTUFDbkIsYUFBYTtBQUFBLE1BQ2IsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLElBQ2QsQ0FBQztBQUVELFVBQU0sZUFBZSxTQUFTLE1BQU07QUFBQSxNQUNsQztBQUFBLFFBQ0UsS0FBSztBQUFBLFFBQ0wsT0FBTztBQUFBLFFBQ1AsTUFBTTtBQUFBLFFBQ04sV0FBVyxTQUFTLE1BQU07QUFBQSxNQUMzQjtBQUFBLE1BQ0Q7QUFBQSxRQUNFLEtBQUs7QUFBQSxRQUNMLE9BQU87QUFBQSxRQUNQLE1BQU07QUFBQSxRQUNOLFdBQVcsU0FBUyxNQUFNO0FBQUEsTUFDM0I7QUFBQSxNQUNEO0FBQUEsUUFDRSxLQUFLO0FBQUEsUUFDTCxPQUFPO0FBQUEsUUFDUCxNQUFNO0FBQUEsUUFDTixXQUFXLFNBQVMsTUFBTTtBQUFBLE1BQzNCO0FBQUEsSUFDSCxDQUFDO0FBRUQsVUFBTSxlQUFlLFlBQVk7O0FBQy9CLFlBQU0sWUFBVyxXQUFNLFdBQU4sbUJBQWM7QUFDL0IsVUFBSSxDQUFDLFVBQVU7QUFDYixpQkFBUyxRQUFRO0FBQUEsVUFDZixhQUFhO0FBQUEsVUFDYixVQUFVO0FBQUEsVUFDVixZQUFZO0FBQUEsUUFDbEI7QUFDSTtBQUFBLE1BQ0Y7QUFFQSxZQUFNLFNBQVMsTUFBTSxjQUFjLHFDQUFxQyxRQUFRO0FBQ2hGLGVBQVMsUUFBUTtBQUFBLFFBQ2YsYUFBYSxRQUFRLGlDQUFRLFdBQVc7QUFBQSxRQUN4QyxVQUFVLFFBQVEsaUNBQVEsUUFBUTtBQUFBLFFBQ2xDLFlBQVksUU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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.