@ilamy/calendar 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -41
- package/dist/index.cjs +377 -361
- package/dist/index.d.cts +39 -35
- package/dist/index.d.ts +39 -35
- package/dist/index.js +291 -280
- package/package.json +16 -13
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
// src/features/month-view/components/month-view.tsx
|
|
3
3
|
import { AnimatePresence as AnimatePresence3, motion as motion3 } from "motion/react";
|
|
4
|
-
import
|
|
4
|
+
import React6, { useMemo as useMemo2 } from "react";
|
|
5
5
|
|
|
6
6
|
// src/contexts/calendar-context/context.ts
|
|
7
7
|
import { createContext, useContext } from "react";
|
|
@@ -46,7 +46,173 @@ import { ChevronDownIcon } from "lucide-react";
|
|
|
46
46
|
|
|
47
47
|
// src/lib/utils.ts
|
|
48
48
|
import { clsx } from "clsx";
|
|
49
|
+
|
|
50
|
+
// src/lib/dayjs-config.ts
|
|
49
51
|
import dayjs from "dayjs";
|
|
52
|
+
import weekday from "dayjs/plugin/weekday.js";
|
|
53
|
+
import weekOfYear from "dayjs/plugin/weekOfYear.js";
|
|
54
|
+
import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js";
|
|
55
|
+
import isSameOrBefore from "dayjs/plugin/isSameOrBefore.js";
|
|
56
|
+
import isBetween from "dayjs/plugin/isBetween.js";
|
|
57
|
+
import minMax from "dayjs/plugin/minMax.js";
|
|
58
|
+
import timezone from "dayjs/plugin/timezone.js";
|
|
59
|
+
import utc from "dayjs/plugin/utc.js";
|
|
60
|
+
import localeData from "dayjs/plugin/localeData.js";
|
|
61
|
+
import"dayjs/locale/af.js";
|
|
62
|
+
import"dayjs/locale/am.js";
|
|
63
|
+
import"dayjs/locale/ar-dz.js";
|
|
64
|
+
import"dayjs/locale/ar-iq.js";
|
|
65
|
+
import"dayjs/locale/ar-kw.js";
|
|
66
|
+
import"dayjs/locale/ar-ly.js";
|
|
67
|
+
import"dayjs/locale/ar-ma.js";
|
|
68
|
+
import"dayjs/locale/ar-sa.js";
|
|
69
|
+
import"dayjs/locale/ar-tn.js";
|
|
70
|
+
import"dayjs/locale/ar.js";
|
|
71
|
+
import"dayjs/locale/az.js";
|
|
72
|
+
import"dayjs/locale/be.js";
|
|
73
|
+
import"dayjs/locale/bg.js";
|
|
74
|
+
import"dayjs/locale/bi.js";
|
|
75
|
+
import"dayjs/locale/bm.js";
|
|
76
|
+
import"dayjs/locale/bn-bd.js";
|
|
77
|
+
import"dayjs/locale/bn.js";
|
|
78
|
+
import"dayjs/locale/bo.js";
|
|
79
|
+
import"dayjs/locale/br.js";
|
|
80
|
+
import"dayjs/locale/bs.js";
|
|
81
|
+
import"dayjs/locale/ca.js";
|
|
82
|
+
import"dayjs/locale/cs.js";
|
|
83
|
+
import"dayjs/locale/cv.js";
|
|
84
|
+
import"dayjs/locale/cy.js";
|
|
85
|
+
import"dayjs/locale/da.js";
|
|
86
|
+
import"dayjs/locale/de-at.js";
|
|
87
|
+
import"dayjs/locale/de-ch.js";
|
|
88
|
+
import"dayjs/locale/de.js";
|
|
89
|
+
import"dayjs/locale/dv.js";
|
|
90
|
+
import"dayjs/locale/el.js";
|
|
91
|
+
import"dayjs/locale/en-au.js";
|
|
92
|
+
import"dayjs/locale/en-ca.js";
|
|
93
|
+
import"dayjs/locale/en-gb.js";
|
|
94
|
+
import"dayjs/locale/en-ie.js";
|
|
95
|
+
import"dayjs/locale/en-il.js";
|
|
96
|
+
import"dayjs/locale/en-in.js";
|
|
97
|
+
import"dayjs/locale/en-nz.js";
|
|
98
|
+
import"dayjs/locale/en-sg.js";
|
|
99
|
+
import"dayjs/locale/en-tt.js";
|
|
100
|
+
import"dayjs/locale/en.js";
|
|
101
|
+
import"dayjs/locale/eo.js";
|
|
102
|
+
import"dayjs/locale/es-do.js";
|
|
103
|
+
import"dayjs/locale/es-mx.js";
|
|
104
|
+
import"dayjs/locale/es-pr.js";
|
|
105
|
+
import"dayjs/locale/es-us.js";
|
|
106
|
+
import"dayjs/locale/es.js";
|
|
107
|
+
import"dayjs/locale/et.js";
|
|
108
|
+
import"dayjs/locale/eu.js";
|
|
109
|
+
import"dayjs/locale/fa.js";
|
|
110
|
+
import"dayjs/locale/fi.js";
|
|
111
|
+
import"dayjs/locale/fo.js";
|
|
112
|
+
import"dayjs/locale/fr-ca.js";
|
|
113
|
+
import"dayjs/locale/fr-ch.js";
|
|
114
|
+
import"dayjs/locale/fr.js";
|
|
115
|
+
import"dayjs/locale/fy.js";
|
|
116
|
+
import"dayjs/locale/ga.js";
|
|
117
|
+
import"dayjs/locale/gd.js";
|
|
118
|
+
import"dayjs/locale/gl.js";
|
|
119
|
+
import"dayjs/locale/gom-latn.js";
|
|
120
|
+
import"dayjs/locale/gu.js";
|
|
121
|
+
import"dayjs/locale/he.js";
|
|
122
|
+
import"dayjs/locale/hi.js";
|
|
123
|
+
import"dayjs/locale/hr.js";
|
|
124
|
+
import"dayjs/locale/ht.js";
|
|
125
|
+
import"dayjs/locale/hu.js";
|
|
126
|
+
import"dayjs/locale/hy-am.js";
|
|
127
|
+
import"dayjs/locale/id.js";
|
|
128
|
+
import"dayjs/locale/is.js";
|
|
129
|
+
import"dayjs/locale/it-ch.js";
|
|
130
|
+
import"dayjs/locale/it.js";
|
|
131
|
+
import"dayjs/locale/ja.js";
|
|
132
|
+
import"dayjs/locale/jv.js";
|
|
133
|
+
import"dayjs/locale/ka.js";
|
|
134
|
+
import"dayjs/locale/kk.js";
|
|
135
|
+
import"dayjs/locale/km.js";
|
|
136
|
+
import"dayjs/locale/kn.js";
|
|
137
|
+
import"dayjs/locale/ko.js";
|
|
138
|
+
import"dayjs/locale/ku.js";
|
|
139
|
+
import"dayjs/locale/ky.js";
|
|
140
|
+
import"dayjs/locale/lb.js";
|
|
141
|
+
import"dayjs/locale/lo.js";
|
|
142
|
+
import"dayjs/locale/lt.js";
|
|
143
|
+
import"dayjs/locale/lv.js";
|
|
144
|
+
import"dayjs/locale/me.js";
|
|
145
|
+
import"dayjs/locale/mi.js";
|
|
146
|
+
import"dayjs/locale/mk.js";
|
|
147
|
+
import"dayjs/locale/ml.js";
|
|
148
|
+
import"dayjs/locale/mn.js";
|
|
149
|
+
import"dayjs/locale/mr.js";
|
|
150
|
+
import"dayjs/locale/ms-my.js";
|
|
151
|
+
import"dayjs/locale/ms.js";
|
|
152
|
+
import"dayjs/locale/mt.js";
|
|
153
|
+
import"dayjs/locale/my.js";
|
|
154
|
+
import"dayjs/locale/nb.js";
|
|
155
|
+
import"dayjs/locale/ne.js";
|
|
156
|
+
import"dayjs/locale/nl-be.js";
|
|
157
|
+
import"dayjs/locale/nl.js";
|
|
158
|
+
import"dayjs/locale/nn.js";
|
|
159
|
+
import"dayjs/locale/oc-lnc.js";
|
|
160
|
+
import"dayjs/locale/pa-in.js";
|
|
161
|
+
import"dayjs/locale/pl.js";
|
|
162
|
+
import"dayjs/locale/pt-br.js";
|
|
163
|
+
import"dayjs/locale/pt.js";
|
|
164
|
+
import"dayjs/locale/rn.js";
|
|
165
|
+
import"dayjs/locale/ro.js";
|
|
166
|
+
import"dayjs/locale/ru.js";
|
|
167
|
+
import"dayjs/locale/rw.js";
|
|
168
|
+
import"dayjs/locale/sd.js";
|
|
169
|
+
import"dayjs/locale/se.js";
|
|
170
|
+
import"dayjs/locale/si.js";
|
|
171
|
+
import"dayjs/locale/sk.js";
|
|
172
|
+
import"dayjs/locale/sl.js";
|
|
173
|
+
import"dayjs/locale/sq.js";
|
|
174
|
+
import"dayjs/locale/sr-cyrl.js";
|
|
175
|
+
import"dayjs/locale/sr.js";
|
|
176
|
+
import"dayjs/locale/ss.js";
|
|
177
|
+
import"dayjs/locale/sv-fi.js";
|
|
178
|
+
import"dayjs/locale/sv.js";
|
|
179
|
+
import"dayjs/locale/sw.js";
|
|
180
|
+
import"dayjs/locale/ta.js";
|
|
181
|
+
import"dayjs/locale/te.js";
|
|
182
|
+
import"dayjs/locale/tet.js";
|
|
183
|
+
import"dayjs/locale/tg.js";
|
|
184
|
+
import"dayjs/locale/th.js";
|
|
185
|
+
import"dayjs/locale/tk.js";
|
|
186
|
+
import"dayjs/locale/tl-ph.js";
|
|
187
|
+
import"dayjs/locale/tlh.js";
|
|
188
|
+
import"dayjs/locale/tr.js";
|
|
189
|
+
import"dayjs/locale/tzl.js";
|
|
190
|
+
import"dayjs/locale/tzm-latn.js";
|
|
191
|
+
import"dayjs/locale/tzm.js";
|
|
192
|
+
import"dayjs/locale/ug-cn.js";
|
|
193
|
+
import"dayjs/locale/uk.js";
|
|
194
|
+
import"dayjs/locale/ur.js";
|
|
195
|
+
import"dayjs/locale/uz-latn.js";
|
|
196
|
+
import"dayjs/locale/uz.js";
|
|
197
|
+
import"dayjs/locale/vi.js";
|
|
198
|
+
import"dayjs/locale/x-pseudo.js";
|
|
199
|
+
import"dayjs/locale/yo.js";
|
|
200
|
+
import"dayjs/locale/zh-cn.js";
|
|
201
|
+
import"dayjs/locale/zh-hk.js";
|
|
202
|
+
import"dayjs/locale/zh-tw.js";
|
|
203
|
+
import"dayjs/locale/zh.js";
|
|
204
|
+
dayjs.extend(weekday);
|
|
205
|
+
dayjs.extend(weekOfYear);
|
|
206
|
+
dayjs.extend(isSameOrAfter);
|
|
207
|
+
dayjs.extend(isSameOrBefore);
|
|
208
|
+
dayjs.extend(isBetween);
|
|
209
|
+
dayjs.extend(minMax);
|
|
210
|
+
dayjs.extend(timezone);
|
|
211
|
+
dayjs.extend(utc);
|
|
212
|
+
dayjs.extend(localeData);
|
|
213
|
+
var dayjs_config_default = dayjs;
|
|
214
|
+
|
|
215
|
+
// src/lib/utils.ts
|
|
50
216
|
import { twMerge } from "tailwind-merge";
|
|
51
217
|
function cn(...inputs) {
|
|
52
218
|
return twMerge(clsx(inputs));
|
|
@@ -204,7 +370,6 @@ function Checkbox({
|
|
|
204
370
|
// src/components/ui/card.tsx
|
|
205
371
|
import { jsxDEV as jsxDEV7 } from "react/jsx-dev-runtime";
|
|
206
372
|
// src/components/ui/date-picker.tsx
|
|
207
|
-
import dayjs2 from "dayjs";
|
|
208
373
|
import { Calendar as CalendarIcon } from "lucide-react";
|
|
209
374
|
|
|
210
375
|
// src/components/ui/popover.tsx
|
|
@@ -274,7 +439,7 @@ function DatePicker({
|
|
|
274
439
|
/* @__PURE__ */ jsxDEV9(CalendarIcon, {
|
|
275
440
|
className: "mr-2 h-4 w-4"
|
|
276
441
|
}, undefined, false, undefined, this),
|
|
277
|
-
date ?
|
|
442
|
+
date ? dayjs_config_default(date).format("MMM D, YYYY") : /* @__PURE__ */ jsxDEV9("span", {
|
|
278
443
|
children: label
|
|
279
444
|
}, undefined, false, undefined, this)
|
|
280
445
|
]
|
|
@@ -398,14 +563,27 @@ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
|
|
|
398
563
|
import { CheckIcon as CheckIcon2, ChevronRightIcon, CircleIcon } from "lucide-react";
|
|
399
564
|
import { jsxDEV as jsxDEV11 } from "react/jsx-dev-runtime";
|
|
400
565
|
// src/components/ui/form.tsx
|
|
401
|
-
import * as
|
|
566
|
+
import * as React2 from "react";
|
|
402
567
|
import { Slot as Slot3 } from "@radix-ui/react-slot";
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
568
|
+
|
|
569
|
+
// node_modules/react-hook-form/dist/index.esm.mjs
|
|
570
|
+
import * as React from "react";
|
|
571
|
+
import React__default from "react";
|
|
572
|
+
var isWeb = typeof window !== "undefined" && typeof window.HTMLElement !== "undefined" && typeof document !== "undefined";
|
|
573
|
+
var VALIDATION_MODE = {
|
|
574
|
+
onBlur: "onBlur",
|
|
575
|
+
onChange: "onChange",
|
|
576
|
+
onSubmit: "onSubmit",
|
|
577
|
+
onTouched: "onTouched",
|
|
578
|
+
all: "all"
|
|
579
|
+
};
|
|
580
|
+
var HookFormContext = React__default.createContext(null);
|
|
581
|
+
HookFormContext.displayName = "HookFormContext";
|
|
582
|
+
var defaultOptions = {
|
|
583
|
+
mode: VALIDATION_MODE.onSubmit,
|
|
584
|
+
reValidateMode: VALIDATION_MODE.onChange,
|
|
585
|
+
shouldFocusError: true
|
|
586
|
+
};
|
|
409
587
|
|
|
410
588
|
// src/components/ui/label.tsx
|
|
411
589
|
import * as LabelPrimitive from "@radix-ui/react-label";
|
|
@@ -424,8 +602,8 @@ function Label2({
|
|
|
424
602
|
|
|
425
603
|
// src/components/ui/form.tsx
|
|
426
604
|
import { jsxDEV as jsxDEV13 } from "react/jsx-dev-runtime";
|
|
427
|
-
var FormFieldContext =
|
|
428
|
-
var FormItemContext =
|
|
605
|
+
var FormFieldContext = React2.createContext({});
|
|
606
|
+
var FormItemContext = React2.createContext({});
|
|
429
607
|
// src/components/ui/input.tsx
|
|
430
608
|
import { jsxDEV as jsxDEV14 } from "react/jsx-dev-runtime";
|
|
431
609
|
function Input({ className, type, ...props }) {
|
|
@@ -647,173 +825,8 @@ var AllEventDialog = ({ ref }) => {
|
|
|
647
825
|
}, undefined, false, undefined, this);
|
|
648
826
|
};
|
|
649
827
|
|
|
650
|
-
// src/lib/dayjs-config.ts
|
|
651
|
-
import dayjs3 from "dayjs";
|
|
652
|
-
import weekday from "dayjs/plugin/weekday.js";
|
|
653
|
-
import weekOfYear from "dayjs/plugin/weekOfYear.js";
|
|
654
|
-
import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js";
|
|
655
|
-
import isSameOrBefore from "dayjs/plugin/isSameOrBefore.js";
|
|
656
|
-
import isBetween from "dayjs/plugin/isBetween.js";
|
|
657
|
-
import minMax from "dayjs/plugin/minMax.js";
|
|
658
|
-
import timezone from "dayjs/plugin/timezone.js";
|
|
659
|
-
import utc from "dayjs/plugin/utc.js";
|
|
660
|
-
import localeData from "dayjs/plugin/localeData.js";
|
|
661
|
-
import"dayjs/locale/af";
|
|
662
|
-
import"dayjs/locale/am";
|
|
663
|
-
import"dayjs/locale/ar-dz";
|
|
664
|
-
import"dayjs/locale/ar-iq";
|
|
665
|
-
import"dayjs/locale/ar-kw";
|
|
666
|
-
import"dayjs/locale/ar-ly";
|
|
667
|
-
import"dayjs/locale/ar-ma";
|
|
668
|
-
import"dayjs/locale/ar-sa";
|
|
669
|
-
import"dayjs/locale/ar-tn";
|
|
670
|
-
import"dayjs/locale/ar";
|
|
671
|
-
import"dayjs/locale/az";
|
|
672
|
-
import"dayjs/locale/be";
|
|
673
|
-
import"dayjs/locale/bg";
|
|
674
|
-
import"dayjs/locale/bi";
|
|
675
|
-
import"dayjs/locale/bm";
|
|
676
|
-
import"dayjs/locale/bn-bd";
|
|
677
|
-
import"dayjs/locale/bn";
|
|
678
|
-
import"dayjs/locale/bo";
|
|
679
|
-
import"dayjs/locale/br";
|
|
680
|
-
import"dayjs/locale/bs";
|
|
681
|
-
import"dayjs/locale/ca";
|
|
682
|
-
import"dayjs/locale/cs";
|
|
683
|
-
import"dayjs/locale/cv";
|
|
684
|
-
import"dayjs/locale/cy";
|
|
685
|
-
import"dayjs/locale/da";
|
|
686
|
-
import"dayjs/locale/de-at";
|
|
687
|
-
import"dayjs/locale/de-ch";
|
|
688
|
-
import"dayjs/locale/de";
|
|
689
|
-
import"dayjs/locale/dv";
|
|
690
|
-
import"dayjs/locale/el";
|
|
691
|
-
import"dayjs/locale/en-au";
|
|
692
|
-
import"dayjs/locale/en-ca";
|
|
693
|
-
import"dayjs/locale/en-gb";
|
|
694
|
-
import"dayjs/locale/en-ie";
|
|
695
|
-
import"dayjs/locale/en-il";
|
|
696
|
-
import"dayjs/locale/en-in";
|
|
697
|
-
import"dayjs/locale/en-nz";
|
|
698
|
-
import"dayjs/locale/en-sg";
|
|
699
|
-
import"dayjs/locale/en-tt";
|
|
700
|
-
import"dayjs/locale/en";
|
|
701
|
-
import"dayjs/locale/eo";
|
|
702
|
-
import"dayjs/locale/es-do";
|
|
703
|
-
import"dayjs/locale/es-mx";
|
|
704
|
-
import"dayjs/locale/es-pr";
|
|
705
|
-
import"dayjs/locale/es-us";
|
|
706
|
-
import"dayjs/locale/es";
|
|
707
|
-
import"dayjs/locale/et";
|
|
708
|
-
import"dayjs/locale/eu";
|
|
709
|
-
import"dayjs/locale/fa";
|
|
710
|
-
import"dayjs/locale/fi";
|
|
711
|
-
import"dayjs/locale/fo";
|
|
712
|
-
import"dayjs/locale/fr-ca";
|
|
713
|
-
import"dayjs/locale/fr-ch";
|
|
714
|
-
import"dayjs/locale/fr";
|
|
715
|
-
import"dayjs/locale/fy";
|
|
716
|
-
import"dayjs/locale/ga";
|
|
717
|
-
import"dayjs/locale/gd";
|
|
718
|
-
import"dayjs/locale/gl";
|
|
719
|
-
import"dayjs/locale/gom-latn";
|
|
720
|
-
import"dayjs/locale/gu";
|
|
721
|
-
import"dayjs/locale/he";
|
|
722
|
-
import"dayjs/locale/hi";
|
|
723
|
-
import"dayjs/locale/hr";
|
|
724
|
-
import"dayjs/locale/ht";
|
|
725
|
-
import"dayjs/locale/hu";
|
|
726
|
-
import"dayjs/locale/hy-am";
|
|
727
|
-
import"dayjs/locale/id";
|
|
728
|
-
import"dayjs/locale/is";
|
|
729
|
-
import"dayjs/locale/it-ch";
|
|
730
|
-
import"dayjs/locale/it";
|
|
731
|
-
import"dayjs/locale/ja";
|
|
732
|
-
import"dayjs/locale/jv";
|
|
733
|
-
import"dayjs/locale/ka";
|
|
734
|
-
import"dayjs/locale/kk";
|
|
735
|
-
import"dayjs/locale/km";
|
|
736
|
-
import"dayjs/locale/kn";
|
|
737
|
-
import"dayjs/locale/ko";
|
|
738
|
-
import"dayjs/locale/ku";
|
|
739
|
-
import"dayjs/locale/ky";
|
|
740
|
-
import"dayjs/locale/lb";
|
|
741
|
-
import"dayjs/locale/lo";
|
|
742
|
-
import"dayjs/locale/lt";
|
|
743
|
-
import"dayjs/locale/lv";
|
|
744
|
-
import"dayjs/locale/me";
|
|
745
|
-
import"dayjs/locale/mi";
|
|
746
|
-
import"dayjs/locale/mk";
|
|
747
|
-
import"dayjs/locale/ml";
|
|
748
|
-
import"dayjs/locale/mn";
|
|
749
|
-
import"dayjs/locale/mr";
|
|
750
|
-
import"dayjs/locale/ms-my";
|
|
751
|
-
import"dayjs/locale/ms";
|
|
752
|
-
import"dayjs/locale/mt";
|
|
753
|
-
import"dayjs/locale/my";
|
|
754
|
-
import"dayjs/locale/nb";
|
|
755
|
-
import"dayjs/locale/ne";
|
|
756
|
-
import"dayjs/locale/nl-be";
|
|
757
|
-
import"dayjs/locale/nl";
|
|
758
|
-
import"dayjs/locale/nn";
|
|
759
|
-
import"dayjs/locale/oc-lnc";
|
|
760
|
-
import"dayjs/locale/pa-in";
|
|
761
|
-
import"dayjs/locale/pl";
|
|
762
|
-
import"dayjs/locale/pt-br";
|
|
763
|
-
import"dayjs/locale/pt";
|
|
764
|
-
import"dayjs/locale/rn";
|
|
765
|
-
import"dayjs/locale/ro";
|
|
766
|
-
import"dayjs/locale/ru";
|
|
767
|
-
import"dayjs/locale/rw";
|
|
768
|
-
import"dayjs/locale/sd";
|
|
769
|
-
import"dayjs/locale/se";
|
|
770
|
-
import"dayjs/locale/si";
|
|
771
|
-
import"dayjs/locale/sk";
|
|
772
|
-
import"dayjs/locale/sl";
|
|
773
|
-
import"dayjs/locale/sq";
|
|
774
|
-
import"dayjs/locale/sr-cyrl";
|
|
775
|
-
import"dayjs/locale/sr";
|
|
776
|
-
import"dayjs/locale/ss";
|
|
777
|
-
import"dayjs/locale/sv-fi";
|
|
778
|
-
import"dayjs/locale/sv";
|
|
779
|
-
import"dayjs/locale/sw";
|
|
780
|
-
import"dayjs/locale/ta";
|
|
781
|
-
import"dayjs/locale/te";
|
|
782
|
-
import"dayjs/locale/tet";
|
|
783
|
-
import"dayjs/locale/tg";
|
|
784
|
-
import"dayjs/locale/th";
|
|
785
|
-
import"dayjs/locale/tk";
|
|
786
|
-
import"dayjs/locale/tl-ph";
|
|
787
|
-
import"dayjs/locale/tlh";
|
|
788
|
-
import"dayjs/locale/tr";
|
|
789
|
-
import"dayjs/locale/tzl";
|
|
790
|
-
import"dayjs/locale/tzm-latn";
|
|
791
|
-
import"dayjs/locale/tzm";
|
|
792
|
-
import"dayjs/locale/ug-cn";
|
|
793
|
-
import"dayjs/locale/uk";
|
|
794
|
-
import"dayjs/locale/ur";
|
|
795
|
-
import"dayjs/locale/uz-latn";
|
|
796
|
-
import"dayjs/locale/uz";
|
|
797
|
-
import"dayjs/locale/vi";
|
|
798
|
-
import"dayjs/locale/x-pseudo";
|
|
799
|
-
import"dayjs/locale/yo";
|
|
800
|
-
import"dayjs/locale/zh-cn";
|
|
801
|
-
import"dayjs/locale/zh-hk";
|
|
802
|
-
import"dayjs/locale/zh-tw";
|
|
803
|
-
import"dayjs/locale/zh";
|
|
804
|
-
dayjs3.extend(weekday);
|
|
805
|
-
dayjs3.extend(weekOfYear);
|
|
806
|
-
dayjs3.extend(isSameOrAfter);
|
|
807
|
-
dayjs3.extend(isSameOrBefore);
|
|
808
|
-
dayjs3.extend(isBetween);
|
|
809
|
-
dayjs3.extend(minMax);
|
|
810
|
-
dayjs3.extend(timezone);
|
|
811
|
-
dayjs3.extend(utc);
|
|
812
|
-
dayjs3.extend(localeData);
|
|
813
|
-
var dayjs_config_default = dayjs3;
|
|
814
|
-
|
|
815
828
|
// src/features/month-view/components/day-cell.tsx
|
|
816
|
-
import
|
|
829
|
+
import React4 from "react";
|
|
817
830
|
|
|
818
831
|
// src/features/droppable-cell/droppable-cell.tsx
|
|
819
832
|
import { useDroppable } from "@dnd-kit/core";
|
|
@@ -872,7 +885,7 @@ var DayCell = ({
|
|
|
872
885
|
day,
|
|
873
886
|
className = ""
|
|
874
887
|
}) => {
|
|
875
|
-
const allEventsDialogRef =
|
|
888
|
+
const allEventsDialogRef = React4.useRef(null);
|
|
876
889
|
const {
|
|
877
890
|
events,
|
|
878
891
|
currentDate,
|
|
@@ -946,13 +959,17 @@ var DayCell = ({
|
|
|
946
959
|
// src/features/month-view/components/month-header.tsx
|
|
947
960
|
import { AnimatePresence as AnimatePresence2, motion as motion2 } from "motion/react";
|
|
948
961
|
import { useMemo } from "react";
|
|
949
|
-
import dayjs4 from "dayjs";
|
|
950
962
|
import { jsxDEV as jsxDEV28 } from "react/jsx-dev-runtime";
|
|
951
963
|
var MonthHeader = () => {
|
|
952
|
-
const {
|
|
964
|
+
const {
|
|
965
|
+
firstDayOfWeek,
|
|
966
|
+
currentLocale,
|
|
967
|
+
stickyViewHeader,
|
|
968
|
+
viewHeaderClassName
|
|
969
|
+
} = useCalendarContext();
|
|
953
970
|
const weekDays = useMemo(() => {
|
|
954
|
-
const days =
|
|
955
|
-
const shortDays =
|
|
971
|
+
const days = dayjs_config_default.weekdays().map((day) => day.toLowerCase());
|
|
972
|
+
const shortDays = dayjs_config_default.weekdaysShort().map((day) => day.toLowerCase());
|
|
956
973
|
for (let i = 0;i < firstDayOfWeek; i++) {
|
|
957
974
|
const dayToMove = days.shift();
|
|
958
975
|
const shortDayToMove = shortDays.shift();
|
|
@@ -964,7 +981,7 @@ var MonthHeader = () => {
|
|
|
964
981
|
return { days, shortDays };
|
|
965
982
|
}, [firstDayOfWeek, currentLocale]);
|
|
966
983
|
return /* @__PURE__ */ jsxDEV28("div", {
|
|
967
|
-
className: cn("grid grid-cols-7 border-b
|
|
984
|
+
className: cn("grid grid-cols-7 border-b", stickyViewHeader && "sticky top-0 z-100", viewHeaderClassName),
|
|
968
985
|
"data-testid": "month-header",
|
|
969
986
|
children: weekDays.days.map((weekDay, index) => /* @__PURE__ */ jsxDEV28(AnimatePresence2, {
|
|
970
987
|
mode: "wait",
|
|
@@ -996,7 +1013,7 @@ var MonthHeader = () => {
|
|
|
996
1013
|
|
|
997
1014
|
// src/lib/constants.ts
|
|
998
1015
|
var GAP_BETWEEN_ELEMENTS = 1;
|
|
999
|
-
var DAY_NUMBER_HEIGHT =
|
|
1016
|
+
var DAY_NUMBER_HEIGHT = 28;
|
|
1000
1017
|
var EVENT_BAR_HEIGHT = 24;
|
|
1001
1018
|
|
|
1002
1019
|
// src/features/month-view/components/week-events-layer.tsx
|
|
@@ -1144,7 +1161,7 @@ var WeekEventsLayer = ({ days }) => {
|
|
|
1144
1161
|
// src/features/month-view/components/month-view.tsx
|
|
1145
1162
|
import { jsxDEV as jsxDEV30 } from "react/jsx-dev-runtime";
|
|
1146
1163
|
var MonthView = ({ dayMaxEvents = 3 }) => {
|
|
1147
|
-
const allEventsDialogRef =
|
|
1164
|
+
const allEventsDialogRef = React6.useRef(null);
|
|
1148
1165
|
const { currentDate, firstDayOfWeek } = useCalendarContext();
|
|
1149
1166
|
const firstDayOfMonth = currentDate.startOf("month");
|
|
1150
1167
|
let adjustedFirstDayOfCalendar = firstDayOfMonth.clone();
|
|
@@ -1168,8 +1185,8 @@ var MonthView = ({ dayMaxEvents = 3 }) => {
|
|
|
1168
1185
|
"data-testid": "month-view",
|
|
1169
1186
|
children: [
|
|
1170
1187
|
/* @__PURE__ */ jsxDEV30(MonthHeader, {}, undefined, false, undefined, this),
|
|
1171
|
-
/* @__PURE__ */ jsxDEV30(
|
|
1172
|
-
className: "flex-1 overflow-auto",
|
|
1188
|
+
/* @__PURE__ */ jsxDEV30("div", {
|
|
1189
|
+
className: "flex-1 overflow-auto h-full",
|
|
1173
1190
|
"data-testid": "month-scroll-area",
|
|
1174
1191
|
children: /* @__PURE__ */ jsxDEV30(AnimatePresence3, {
|
|
1175
1192
|
mode: "wait",
|
|
@@ -1178,7 +1195,7 @@ var MonthView = ({ dayMaxEvents = 3 }) => {
|
|
|
1178
1195
|
animate: { opacity: 1 },
|
|
1179
1196
|
exit: { opacity: 0 },
|
|
1180
1197
|
transition: { duration: 0.25, ease: "easeInOut" },
|
|
1181
|
-
className: "relative grid
|
|
1198
|
+
className: "relative grid h-full grid-cols-7 grid-rows-6 overflow-auto",
|
|
1182
1199
|
"data-testid": "month-calendar-grid",
|
|
1183
1200
|
children: calendarDays.map((days, index) => {
|
|
1184
1201
|
return /* @__PURE__ */ jsxDEV30("div", {
|
|
@@ -1213,7 +1230,6 @@ var MonthView = ({ dayMaxEvents = 3 }) => {
|
|
|
1213
1230
|
};
|
|
1214
1231
|
|
|
1215
1232
|
// src/features/week-view/week-view.tsx
|
|
1216
|
-
import dayjs9 from "dayjs";
|
|
1217
1233
|
import weekOfYear2 from "dayjs/plugin/weekOfYear";
|
|
1218
1234
|
|
|
1219
1235
|
// src/features/week-view/week-all-day-row.tsx
|
|
@@ -1234,7 +1250,7 @@ var WeekAllDayRow = () => {
|
|
|
1234
1250
|
const weekEvents = allEvents.filter((event) => {
|
|
1235
1251
|
return event.start.isSameOrAfter(adjustedStartOfWeek) && event.start.isSameOrBefore(endOfWeek) || event.end.isSameOrAfter(adjustedStartOfWeek) && event.end.isSameOrBefore(endOfWeek) || event.start.isBefore(adjustedStartOfWeek) && event.end.isAfter(endOfWeek);
|
|
1236
1252
|
});
|
|
1237
|
-
const allDayEvents = weekEvents.filter((event) => event.
|
|
1253
|
+
const allDayEvents = weekEvents.filter((event) => event.allDay);
|
|
1238
1254
|
const { processedAllDayEvents } = useMemo3(() => {
|
|
1239
1255
|
const sortedEvents = [...allDayEvents].sort((a, b) => {
|
|
1240
1256
|
const startDiff = a.start.diff(b.start);
|
|
@@ -1278,7 +1294,7 @@ var WeekAllDayRow = () => {
|
|
|
1278
1294
|
width,
|
|
1279
1295
|
top: rowIndex * (EVENT_BAR_HEIGHT + GAP_BETWEEN_ELEMENTS),
|
|
1280
1296
|
height: EVENT_BAR_HEIGHT,
|
|
1281
|
-
|
|
1297
|
+
allDay: true
|
|
1282
1298
|
});
|
|
1283
1299
|
});
|
|
1284
1300
|
return {
|
|
@@ -1325,7 +1341,6 @@ var WeekAllDayRow = () => {
|
|
|
1325
1341
|
};
|
|
1326
1342
|
|
|
1327
1343
|
// src/features/week-view/week-header.tsx
|
|
1328
|
-
import dayjs5 from "dayjs";
|
|
1329
1344
|
import { AnimatePresence as AnimatePresence4, motion as motion4 } from "motion/react";
|
|
1330
1345
|
import { jsxDEV as jsxDEV32 } from "react/jsx-dev-runtime";
|
|
1331
1346
|
var WeekHeader = () => {
|
|
@@ -1334,7 +1349,8 @@ var WeekHeader = () => {
|
|
|
1334
1349
|
selectDate,
|
|
1335
1350
|
openEventForm,
|
|
1336
1351
|
firstDayOfWeek,
|
|
1337
|
-
|
|
1352
|
+
stickyViewHeader,
|
|
1353
|
+
viewHeaderClassName
|
|
1338
1354
|
} = useCalendarContext();
|
|
1339
1355
|
const startOfWeek = currentDate.startOf("week").day(firstDayOfWeek);
|
|
1340
1356
|
const adjustedStartOfWeek = currentDate.isBefore(startOfWeek) ? startOfWeek.subtract(1, "week") : startOfWeek;
|
|
@@ -1343,7 +1359,7 @@ var WeekHeader = () => {
|
|
|
1343
1359
|
weekDays.push(adjustedStartOfWeek.add(i, "day"));
|
|
1344
1360
|
}
|
|
1345
1361
|
return /* @__PURE__ */ jsxDEV32("div", {
|
|
1346
|
-
className: cn("grid grid-cols-[auto_1fr_1fr_1fr_1fr_1fr_1fr_1fr] grid-rows-1
|
|
1362
|
+
className: cn("grid grid-cols-[auto_1fr_1fr_1fr_1fr_1fr_1fr_1fr] grid-rows-1", stickyViewHeader && "sticky top-0 z-100", viewHeaderClassName),
|
|
1347
1363
|
"data-testid": "week-header",
|
|
1348
1364
|
children: [
|
|
1349
1365
|
/* @__PURE__ */ jsxDEV32("div", {
|
|
@@ -1363,7 +1379,7 @@ var WeekHeader = () => {
|
|
|
1363
1379
|
}, undefined, true, undefined, this)
|
|
1364
1380
|
}, undefined, false, undefined, this),
|
|
1365
1381
|
weekDays.map((day, index) => {
|
|
1366
|
-
const isToday = day.isSame(
|
|
1382
|
+
const isToday = day.isSame(dayjs_config_default(), "day");
|
|
1367
1383
|
return /* @__PURE__ */ jsxDEV32(AnimatePresence4, {
|
|
1368
1384
|
mode: "wait",
|
|
1369
1385
|
children: /* @__PURE__ */ jsxDEV32(motion4.div, {
|
|
@@ -1398,20 +1414,13 @@ var WeekHeader = () => {
|
|
|
1398
1414
|
}, undefined, true, undefined, this);
|
|
1399
1415
|
};
|
|
1400
1416
|
|
|
1401
|
-
// src/features/week-view/week-time-grid.tsx
|
|
1402
|
-
import dayjs8 from "dayjs";
|
|
1403
|
-
|
|
1404
|
-
// src/features/week-view/week-day-col.tsx
|
|
1405
|
-
import dayjs7 from "dayjs";
|
|
1406
|
-
|
|
1407
1417
|
// src/hooks/useProcessedDayEvents.ts
|
|
1408
|
-
import dayjs6 from "dayjs";
|
|
1409
1418
|
import { useMemo as useMemo4 } from "react";
|
|
1410
1419
|
var useProcessedDayEvents = ({ day }) => {
|
|
1411
1420
|
const { getEventsForDateRange } = useCalendarContext();
|
|
1412
1421
|
const todayEvents = useMemo4(() => {
|
|
1413
1422
|
let eventsForDay = getEventsForDateRange(day.startOf("day"), day.endOf("day"));
|
|
1414
|
-
eventsForDay = eventsForDay.filter((e) => !e.
|
|
1423
|
+
eventsForDay = eventsForDay.filter((e) => !e.allDay).toSorted((a, b) => a.start.diff(b.start));
|
|
1415
1424
|
if (eventsForDay.length === 0) {
|
|
1416
1425
|
return [];
|
|
1417
1426
|
}
|
|
@@ -1426,7 +1435,7 @@ var useProcessedDayEvents = ({ day }) => {
|
|
|
1426
1435
|
currentCluster = [];
|
|
1427
1436
|
}
|
|
1428
1437
|
currentCluster.push(event);
|
|
1429
|
-
lastEventEnd = lastEventEnd ?
|
|
1438
|
+
lastEventEnd = lastEventEnd ? dayjs_config_default.max(lastEventEnd, event.end) : event.end;
|
|
1430
1439
|
}
|
|
1431
1440
|
if (currentCluster.length > 0) {
|
|
1432
1441
|
clusters.push(currentCluster);
|
|
@@ -1538,7 +1547,7 @@ var DayEventsLayer = ({
|
|
|
1538
1547
|
|
|
1539
1548
|
// src/features/week-view/week-day-col.tsx
|
|
1540
1549
|
import { jsxDEV as jsxDEV34 } from "react/jsx-dev-runtime";
|
|
1541
|
-
var hours = Array.from({ length: 24 }, (_, i) => i).map((hour) =>
|
|
1550
|
+
var hours = Array.from({ length: 24 }, (_, i) => i).map((hour) => dayjs_config_default().hour(hour).minute(0));
|
|
1542
1551
|
var WeekDayCol = ({ day }) => {
|
|
1543
1552
|
return /* @__PURE__ */ jsxDEV34("div", {
|
|
1544
1553
|
"data-testid": `week-day-col-${day.format("YYYY-MM-DD")}`,
|
|
@@ -1566,7 +1575,7 @@ var WeekDayCol = ({ day }) => {
|
|
|
1566
1575
|
|
|
1567
1576
|
// src/features/week-view/week-time-grid.tsx
|
|
1568
1577
|
import { jsxDEV as jsxDEV35 } from "react/jsx-dev-runtime";
|
|
1569
|
-
var hours2 = Array.from({ length: 24 }, (_, i) => i).map((hour) =>
|
|
1578
|
+
var hours2 = Array.from({ length: 24 }, (_, i) => i).map((hour) => dayjs_config_default().hour(hour).minute(0));
|
|
1570
1579
|
var WeekTimeGrid = () => {
|
|
1571
1580
|
const { currentDate, firstDayOfWeek } = useCalendarContext();
|
|
1572
1581
|
const startOfWeek = currentDate.startOf("week").day(firstDayOfWeek);
|
|
@@ -1575,7 +1584,7 @@ var WeekTimeGrid = () => {
|
|
|
1575
1584
|
for (let i = 0;i < 7; i++) {
|
|
1576
1585
|
weekDays.push(adjustedStartOfWeek.add(i, "day"));
|
|
1577
1586
|
}
|
|
1578
|
-
const todayIndex = weekDays.findIndex((day) => day.isSame(
|
|
1587
|
+
const todayIndex = weekDays.findIndex((day) => day.isSame(dayjs_config_default(), "day"));
|
|
1579
1588
|
const isCurrentWeek = todayIndex !== -1;
|
|
1580
1589
|
return /* @__PURE__ */ jsxDEV35("div", {
|
|
1581
1590
|
"data-testid": "week-time-grid",
|
|
@@ -1600,7 +1609,7 @@ var WeekTimeGrid = () => {
|
|
|
1600
1609
|
"data-testid": "week-current-time-indicator",
|
|
1601
1610
|
className: "pointer-events-none absolute z-20",
|
|
1602
1611
|
style: {
|
|
1603
|
-
top: `${(
|
|
1612
|
+
top: `${(dayjs_config_default().hour() + dayjs_config_default().minute() / 60) * 60}px`,
|
|
1604
1613
|
left: `${todayIndex * (100 / 7)}%`,
|
|
1605
1614
|
width: `${100 / 7}%`
|
|
1606
1615
|
},
|
|
@@ -1617,7 +1626,7 @@ var WeekTimeGrid = () => {
|
|
|
1617
1626
|
|
|
1618
1627
|
// src/features/week-view/week-view.tsx
|
|
1619
1628
|
import { jsxDEV as jsxDEV36 } from "react/jsx-dev-runtime";
|
|
1620
|
-
|
|
1629
|
+
dayjs_config_default.extend(weekOfYear2);
|
|
1621
1630
|
var WeekView = () => {
|
|
1622
1631
|
return /* @__PURE__ */ jsxDEV36("div", {
|
|
1623
1632
|
className: "flex h-full flex-col",
|
|
@@ -1638,7 +1647,6 @@ var WeekView = () => {
|
|
|
1638
1647
|
var week_view_default = WeekView;
|
|
1639
1648
|
|
|
1640
1649
|
// src/features/day-view/day-view.tsx
|
|
1641
|
-
import dayjs12 from "dayjs";
|
|
1642
1650
|
import { Fragment as Fragment2 } from "react";
|
|
1643
1651
|
|
|
1644
1652
|
// src/features/day-view/day-all-day-row.tsx
|
|
@@ -1648,8 +1656,8 @@ var DayAllDayRow = () => {
|
|
|
1648
1656
|
const { currentDate, getEventsForDate } = useCalendarContext();
|
|
1649
1657
|
const dayEvents = getEventsForDate(currentDate);
|
|
1650
1658
|
const { allDayEvents } = useMemo5(() => {
|
|
1651
|
-
const allDayEvts = dayEvents.filter((event) => event.
|
|
1652
|
-
const regularEvts = dayEvents.filter((event) => !event.
|
|
1659
|
+
const allDayEvts = dayEvents.filter((event) => event.allDay);
|
|
1660
|
+
const regularEvts = dayEvents.filter((event) => !event.allDay);
|
|
1653
1661
|
return { allDayEvents: allDayEvts, regularEvents: regularEvts };
|
|
1654
1662
|
}, [dayEvents]);
|
|
1655
1663
|
const { processedAllDayEvents } = useMemo5(() => {
|
|
@@ -1675,7 +1683,7 @@ var DayAllDayRow = () => {
|
|
|
1675
1683
|
width: 100,
|
|
1676
1684
|
top: rowIndex * EVENT_BAR_HEIGHT,
|
|
1677
1685
|
height: EVENT_BAR_HEIGHT,
|
|
1678
|
-
|
|
1686
|
+
allDay: true
|
|
1679
1687
|
});
|
|
1680
1688
|
});
|
|
1681
1689
|
return {
|
|
@@ -1720,14 +1728,13 @@ var DayAllDayRow = () => {
|
|
|
1720
1728
|
|
|
1721
1729
|
// src/features/day-view/day-header.tsx
|
|
1722
1730
|
import { AnimatePresence as AnimatePresence5, motion as motion5 } from "motion/react";
|
|
1723
|
-
import dayjs10 from "dayjs";
|
|
1724
1731
|
import { jsxDEV as jsxDEV38 } from "react/jsx-dev-runtime";
|
|
1725
1732
|
var DayHeader = () => {
|
|
1726
|
-
const { currentDate,
|
|
1727
|
-
const isToday = currentDate.isSame(
|
|
1733
|
+
const { currentDate, stickyViewHeader, viewHeaderClassName } = useCalendarContext();
|
|
1734
|
+
const isToday = currentDate.isSame(dayjs_config_default(), "day");
|
|
1728
1735
|
return /* @__PURE__ */ jsxDEV38("div", {
|
|
1729
1736
|
"data-testid": "day-header",
|
|
1730
|
-
className: cn("flex items-center justify-center border-b p-2 border-x
|
|
1737
|
+
className: cn("flex items-center justify-center border-b p-2 border-x", stickyViewHeader && "sticky top-0 z-100", viewHeaderClassName),
|
|
1731
1738
|
children: /* @__PURE__ */ jsxDEV38(AnimatePresence5, {
|
|
1732
1739
|
mode: "wait",
|
|
1733
1740
|
children: /* @__PURE__ */ jsxDEV38(motion5.div, {
|
|
@@ -1753,10 +1760,9 @@ var DayHeader = () => {
|
|
|
1753
1760
|
};
|
|
1754
1761
|
|
|
1755
1762
|
// src/features/day-view/day-time-col.tsx
|
|
1756
|
-
import dayjs11 from "dayjs";
|
|
1757
1763
|
import { jsxDEV as jsxDEV39 } from "react/jsx-dev-runtime";
|
|
1758
1764
|
var hours3 = Array.from({ length: 24 }, (_, i) => i).map((hour) => {
|
|
1759
|
-
return
|
|
1765
|
+
return dayjs_config_default().hour(hour).minute(0);
|
|
1760
1766
|
});
|
|
1761
1767
|
var DayTimeCol = ({ className }) => {
|
|
1762
1768
|
return /* @__PURE__ */ jsxDEV39("div", {
|
|
@@ -1778,10 +1784,10 @@ import { jsxDEV as jsxDEV40 } from "react/jsx-dev-runtime";
|
|
|
1778
1784
|
var DayView = () => {
|
|
1779
1785
|
const { currentDate } = useCalendarContext();
|
|
1780
1786
|
const hours4 = Array.from({ length: 24 }, (_, i) => i).map((hour) => {
|
|
1781
|
-
return
|
|
1787
|
+
return dayjs_config_default().hour(hour).minute(0);
|
|
1782
1788
|
});
|
|
1783
1789
|
const timeSegments = [0, 15, 30, 45];
|
|
1784
|
-
const isToday = currentDate.isSame(
|
|
1790
|
+
const isToday = currentDate.isSame(dayjs_config_default(), "day");
|
|
1785
1791
|
const cellDate = currentDate.format("YYYY-MM-DD");
|
|
1786
1792
|
return /* @__PURE__ */ jsxDEV40("div", {
|
|
1787
1793
|
"data-testid": "day-view",
|
|
@@ -1866,7 +1872,7 @@ var DayView = () => {
|
|
|
1866
1872
|
"data-testid": "day-current-time-indicator",
|
|
1867
1873
|
className: "absolute right-0 left-0 z-40 border-t border-red-500",
|
|
1868
1874
|
style: {
|
|
1869
|
-
top: `${(
|
|
1875
|
+
top: `${(dayjs_config_default().hour() + dayjs_config_default().minute() / 60) * 60}px`
|
|
1870
1876
|
},
|
|
1871
1877
|
children: /* @__PURE__ */ jsxDEV40("div", {
|
|
1872
1878
|
className: "-mt-1 -ml-1 h-2 w-2 rounded-full bg-red-500"
|
|
@@ -1884,8 +1890,7 @@ var DayView = () => {
|
|
|
1884
1890
|
var day_view_default = DayView;
|
|
1885
1891
|
|
|
1886
1892
|
// src/components/event-form/event-form.tsx
|
|
1887
|
-
import
|
|
1888
|
-
import { useEffect, useState as useState2 } from "react";
|
|
1893
|
+
import { useEffect as useEffect2, useState as useState2 } from "react";
|
|
1889
1894
|
import { jsxDEV as jsxDEV41 } from "react/jsx-dev-runtime";
|
|
1890
1895
|
var colorOptions = [
|
|
1891
1896
|
{ value: "bg-blue-100 text-blue-800", label: "Blue" },
|
|
@@ -1914,13 +1919,13 @@ var EventForm = ({
|
|
|
1914
1919
|
const start = selectedEvent?.originalStart ?? selectedEvent?.start;
|
|
1915
1920
|
const end = selectedEvent?.originalEnd ?? selectedEvent?.end;
|
|
1916
1921
|
const defaultStartDate = selectedDate?.toDate() || new Date;
|
|
1917
|
-
const defaultEndDate = selectedDate?.add(1, "hour").toDate() ||
|
|
1922
|
+
const defaultEndDate = selectedDate?.add(1, "hour").toDate() || dayjs_config_default().add(1, "hour").toDate();
|
|
1918
1923
|
const [startDate, setStartDate] = useState2(start?.toDate() || defaultStartDate);
|
|
1919
1924
|
const [endDate, setEndDate] = useState2(end?.toDate() || defaultEndDate);
|
|
1920
|
-
const [isAllDay, setIsAllDay] = useState2(selectedEvent?.
|
|
1925
|
+
const [isAllDay, setIsAllDay] = useState2(selectedEvent?.allDay || false);
|
|
1921
1926
|
const [selectedColor, setSelectedColor] = useState2(selectedEvent?.color || colorOptions[0].value);
|
|
1922
|
-
const [startTime, setStartTime] = useState2(selectedEvent ? selectedEvent.start.format("HH:mm") :
|
|
1923
|
-
const [endTime, setEndTime] = useState2(selectedEvent ? selectedEvent.end.format("HH:mm") :
|
|
1927
|
+
const [startTime, setStartTime] = useState2(selectedEvent ? selectedEvent.start.format("HH:mm") : dayjs_config_default(defaultStartDate).format("HH:mm"));
|
|
1928
|
+
const [endTime, setEndTime] = useState2(selectedEvent ? selectedEvent.end.format("HH:mm") : dayjs_config_default(defaultEndDate).format("HH:mm"));
|
|
1924
1929
|
const [formValues, setFormValues] = useState2({
|
|
1925
1930
|
title: selectedEvent?.title || "",
|
|
1926
1931
|
description: selectedEvent?.description || "",
|
|
@@ -1946,7 +1951,7 @@ var EventForm = ({
|
|
|
1946
1951
|
setEndTime(timeValue);
|
|
1947
1952
|
}
|
|
1948
1953
|
};
|
|
1949
|
-
|
|
1954
|
+
useEffect2(() => {
|
|
1950
1955
|
if (isAllDay) {
|
|
1951
1956
|
setEndTime("23:59");
|
|
1952
1957
|
}
|
|
@@ -1955,20 +1960,20 @@ var EventForm = ({
|
|
|
1955
1960
|
e.preventDefault();
|
|
1956
1961
|
const [startHours, startMinutes] = startTime.split(":").map(Number);
|
|
1957
1962
|
const [endHours, endMinutes] = endTime.split(":").map(Number);
|
|
1958
|
-
let startDateTime =
|
|
1959
|
-
let endDateTime =
|
|
1963
|
+
let startDateTime = dayjs_config_default(startDate).hour(startHours).minute(startMinutes);
|
|
1964
|
+
let endDateTime = dayjs_config_default(endDate).hour(endHours).minute(endMinutes);
|
|
1960
1965
|
if (isAllDay) {
|
|
1961
1966
|
startDateTime = startDateTime.hour(0).minute(0);
|
|
1962
1967
|
endDateTime = endDateTime.hour(23).minute(59);
|
|
1963
1968
|
}
|
|
1964
1969
|
const eventData = {
|
|
1965
|
-
id: selectedEvent?.id ||
|
|
1970
|
+
id: selectedEvent?.id || dayjs_config_default().format("YYYYMMDDHHmmss"),
|
|
1966
1971
|
title: formValues.title,
|
|
1967
1972
|
start: startDateTime,
|
|
1968
1973
|
end: endDateTime,
|
|
1969
1974
|
description: formValues.description,
|
|
1970
1975
|
location: formValues.location,
|
|
1971
|
-
|
|
1976
|
+
allDay: isAllDay,
|
|
1972
1977
|
color: selectedColor
|
|
1973
1978
|
};
|
|
1974
1979
|
if (selectedEvent.id) {
|
|
@@ -1984,8 +1989,8 @@ var EventForm = ({
|
|
|
1984
1989
|
onClose();
|
|
1985
1990
|
}
|
|
1986
1991
|
};
|
|
1987
|
-
|
|
1988
|
-
if (
|
|
1992
|
+
useEffect2(() => {
|
|
1993
|
+
if (dayjs_config_default(startDate).isAfter(dayjs_config_default(endDate))) {
|
|
1989
1994
|
setEndDate(startDate);
|
|
1990
1995
|
}
|
|
1991
1996
|
}, [startDate, endDate]);
|
|
@@ -2037,12 +2042,12 @@ var EventForm = ({
|
|
|
2037
2042
|
className: "flex items-center space-x-2",
|
|
2038
2043
|
children: [
|
|
2039
2044
|
/* @__PURE__ */ jsxDEV41(Checkbox, {
|
|
2040
|
-
id: "
|
|
2045
|
+
id: "allDay",
|
|
2041
2046
|
checked: isAllDay,
|
|
2042
2047
|
onCheckedChange: (checked) => setIsAllDay(checked === true)
|
|
2043
2048
|
}, undefined, false, undefined, this),
|
|
2044
2049
|
/* @__PURE__ */ jsxDEV41(Label2, {
|
|
2045
|
-
htmlFor: "
|
|
2050
|
+
htmlFor: "allDay",
|
|
2046
2051
|
className: "text-xs sm:text-sm",
|
|
2047
2052
|
children: "All day"
|
|
2048
2053
|
}, undefined, false, undefined, this)
|
|
@@ -2233,7 +2238,6 @@ import { Calendar as CalendarIcon2, Menu, Plus } from "lucide-react";
|
|
|
2233
2238
|
import { useCallback, useState as useState4 } from "react";
|
|
2234
2239
|
|
|
2235
2240
|
// src/components/header/title-content.tsx
|
|
2236
|
-
import dayjs14 from "dayjs";
|
|
2237
2241
|
import { AnimatePresence as AnimatePresence6, motion as motion6 } from "motion/react";
|
|
2238
2242
|
import { ChevronDown } from "lucide-react";
|
|
2239
2243
|
import { useState as useState3 } from "react";
|
|
@@ -2457,7 +2461,7 @@ var TitleContent = () => {
|
|
|
2457
2461
|
return Array.from({ length: daysInMonth }, (_, i) => {
|
|
2458
2462
|
const dayDate = firstDayOfMonth.date(i + 1);
|
|
2459
2463
|
const isCurrentDay = dayDate.isSame(currentDate, "day");
|
|
2460
|
-
const isToday = dayDate.isSame(
|
|
2464
|
+
const isToday = dayDate.isSame(dayjs_config_default(), "day");
|
|
2461
2465
|
return /* @__PURE__ */ jsxDEV42(Button, {
|
|
2462
2466
|
variant: "ghost",
|
|
2463
2467
|
className: cn("justify-start font-normal", isCurrentDay && "bg-primary/10"),
|
|
@@ -2704,14 +2708,13 @@ var Header2 = () => {
|
|
|
2704
2708
|
};
|
|
2705
2709
|
var base_header_default = Header2;
|
|
2706
2710
|
// src/features/year-view/year-view.tsx
|
|
2707
|
-
import dayjs15 from "dayjs";
|
|
2708
2711
|
import { AnimatePresence as AnimatePresence7, motion as motion7 } from "motion/react";
|
|
2709
2712
|
import { jsxDEV as jsxDEV45 } from "react/jsx-dev-runtime";
|
|
2710
2713
|
var YearView = () => {
|
|
2711
2714
|
const { currentDate, selectDate, events, setView, getEventsForDate } = useCalendarContext();
|
|
2712
2715
|
const year = currentDate.year();
|
|
2713
2716
|
const months2 = Array.from({ length: 12 }, (_, i) => {
|
|
2714
|
-
const monthDate =
|
|
2717
|
+
const monthDate = dayjs_config_default().year(year).month(i).startOf("month");
|
|
2715
2718
|
return {
|
|
2716
2719
|
date: monthDate,
|
|
2717
2720
|
name: monthDate.format("MMMM"),
|
|
@@ -2740,7 +2743,7 @@ var YearView = () => {
|
|
|
2740
2743
|
const daysArray = Array.from({ length: 42 }, (_, i) => {
|
|
2741
2744
|
const day = firstDayOfCalendar.add(i, "day");
|
|
2742
2745
|
const isCurrentMonth = day.month() === month.date.month();
|
|
2743
|
-
const isToday = day.isSame(
|
|
2746
|
+
const isToday = day.isSame(dayjs_config_default(), "day");
|
|
2744
2747
|
const isCurrentDate = day.isSame(currentDate, "day");
|
|
2745
2748
|
const dayEvents = getEventsForDate(day);
|
|
2746
2749
|
const hasEvents = dayEvents.length > 0;
|
|
@@ -2853,13 +2856,12 @@ import {
|
|
|
2853
2856
|
useSensor,
|
|
2854
2857
|
useSensors
|
|
2855
2858
|
} from "@dnd-kit/core";
|
|
2856
|
-
import
|
|
2857
|
-
import React9 from "react";
|
|
2859
|
+
import React10 from "react";
|
|
2858
2860
|
import { snapCenterToCursor } from "@dnd-kit/modifiers";
|
|
2859
2861
|
import { jsxDEV as jsxDEV46 } from "react/jsx-dev-runtime";
|
|
2860
2862
|
function CalendarDndContext({ children }) {
|
|
2861
2863
|
const { updateEvent, view, disableDragAndDrop } = useCalendarContext();
|
|
2862
|
-
const [activeEvent, setActiveEvent] =
|
|
2864
|
+
const [activeEvent, setActiveEvent] = React10.useState(null);
|
|
2863
2865
|
const mouseSensor = useSensor(MouseSensor, {
|
|
2864
2866
|
activationConstraint: {
|
|
2865
2867
|
distance: 2
|
|
@@ -2889,7 +2891,7 @@ function CalendarDndContext({ children }) {
|
|
|
2889
2891
|
const originalStart = activeEvent.originalStart ?? activeEvent.start;
|
|
2890
2892
|
const originalEnd = activeEvent.originalEnd ?? activeEvent.end;
|
|
2891
2893
|
const durationMinutes = originalEnd.diff(originalStart, "minute");
|
|
2892
|
-
const newStart =
|
|
2894
|
+
const newStart = dayjs_config_default(date).hour(hour).minute(minute || 0);
|
|
2893
2895
|
let newEnd = newStart.add(durationMinutes, "minute");
|
|
2894
2896
|
if (newEnd.isSame(newEnd.startOf("day"))) {
|
|
2895
2897
|
newEnd = newEnd.subtract(1, "day").endOf("day");
|
|
@@ -2900,7 +2902,7 @@ function CalendarDndContext({ children }) {
|
|
|
2900
2902
|
});
|
|
2901
2903
|
} else if (over.data.current?.type === "day-cell") {
|
|
2902
2904
|
const { date } = over.data.current;
|
|
2903
|
-
const newDate =
|
|
2905
|
+
const newDate = dayjs_config_default(date);
|
|
2904
2906
|
const isMultiDayEvent = !activeEvent.start.isSame(activeEvent.end, "day");
|
|
2905
2907
|
const originalStart = activeEvent.originalStart ?? activeEvent.start;
|
|
2906
2908
|
const originalEnd = activeEvent.originalEnd ?? activeEvent.end;
|
|
@@ -2970,17 +2972,16 @@ function CalendarDndContext({ children }) {
|
|
|
2970
2972
|
}
|
|
2971
2973
|
|
|
2972
2974
|
// src/contexts/calendar-context/provider.tsx
|
|
2973
|
-
import dayjs17 from "dayjs";
|
|
2974
2975
|
import {
|
|
2975
2976
|
useCallback as useCallback2,
|
|
2976
|
-
useEffect as
|
|
2977
|
+
useEffect as useEffect3,
|
|
2977
2978
|
useMemo as useMemo6,
|
|
2978
2979
|
useState as useState5
|
|
2979
2980
|
} from "react";
|
|
2980
2981
|
import { jsxDEV as jsxDEV47 } from "react/jsx-dev-runtime";
|
|
2981
2982
|
var CalendarProvider = ({
|
|
2982
2983
|
children,
|
|
2983
|
-
|
|
2984
|
+
events = [],
|
|
2984
2985
|
firstDayOfWeek = 0,
|
|
2985
2986
|
renderEvent,
|
|
2986
2987
|
onEventClick,
|
|
@@ -2992,29 +2993,32 @@ var CalendarProvider = ({
|
|
|
2992
2993
|
disableEventClick,
|
|
2993
2994
|
disableDragAndDrop,
|
|
2994
2995
|
dayMaxEvents,
|
|
2995
|
-
|
|
2996
|
+
stickyViewHeader,
|
|
2997
|
+
viewHeaderClassName
|
|
2996
2998
|
}) => {
|
|
2997
|
-
const [currentDate, setCurrentDate] = useState5(
|
|
2999
|
+
const [currentDate, setCurrentDate] = useState5(dayjs_config_default());
|
|
2998
3000
|
const [view, setView] = useState5("month");
|
|
2999
|
-
const [
|
|
3001
|
+
const [currentEvents, setCurrentEvents] = useState5(events);
|
|
3000
3002
|
const [isEventFormOpen, setIsEventFormOpen] = useState5(false);
|
|
3001
3003
|
const [selectedEvent, setSelectedEvent] = useState5(null);
|
|
3002
3004
|
const [selectedDate, setSelectedDate] = useState5(null);
|
|
3003
3005
|
const [currentLocale, setCurrentLocale] = useState5(locale || "en");
|
|
3004
|
-
|
|
3005
|
-
|
|
3006
|
-
|
|
3006
|
+
const [currentTimezone, setCurrentTimezone] = useState5(timezone2 || "");
|
|
3007
|
+
useEffect3(() => {
|
|
3008
|
+
if (events) {
|
|
3009
|
+
setCurrentEvents(events);
|
|
3007
3010
|
}
|
|
3008
|
-
}, [
|
|
3009
|
-
|
|
3011
|
+
}, [events]);
|
|
3012
|
+
useEffect3(() => {
|
|
3010
3013
|
if (locale) {
|
|
3011
3014
|
setCurrentLocale(locale);
|
|
3012
|
-
|
|
3015
|
+
dayjs_config_default.locale(locale);
|
|
3013
3016
|
}
|
|
3014
3017
|
}, [locale]);
|
|
3015
|
-
|
|
3018
|
+
useEffect3(() => {
|
|
3016
3019
|
if (timezone2) {
|
|
3017
|
-
|
|
3020
|
+
setCurrentTimezone(timezone2);
|
|
3021
|
+
dayjs_config_default.tz.setDefault(timezone2);
|
|
3018
3022
|
}
|
|
3019
3023
|
}, [timezone2]);
|
|
3020
3024
|
const selectDate = useCallback2((date) => {
|
|
@@ -3053,16 +3057,16 @@ var CalendarProvider = ({
|
|
|
3053
3057
|
}
|
|
3054
3058
|
}, [view]);
|
|
3055
3059
|
const today = useCallback2(() => {
|
|
3056
|
-
setCurrentDate(
|
|
3060
|
+
setCurrentDate(dayjs_config_default());
|
|
3057
3061
|
}, []);
|
|
3058
3062
|
const addEvent = useCallback2((event) => {
|
|
3059
|
-
|
|
3063
|
+
setCurrentEvents((prevEvents) => [...prevEvents, event]);
|
|
3060
3064
|
}, []);
|
|
3061
3065
|
const updateEvent = useCallback2((eventId, updatedEvent) => {
|
|
3062
|
-
|
|
3066
|
+
setCurrentEvents((prevEvents) => prevEvents.map((event) => event.id === eventId ? { ...event, ...updatedEvent } : event));
|
|
3063
3067
|
}, []);
|
|
3064
3068
|
const deleteEvent = useCallback2((eventId) => {
|
|
3065
|
-
|
|
3069
|
+
setCurrentEvents((prevEvents) => prevEvents.filter((event) => event.id !== eventId));
|
|
3066
3070
|
}, []);
|
|
3067
3071
|
const editEvent = useCallback2((event) => {
|
|
3068
3072
|
setSelectedEvent(event);
|
|
@@ -3098,7 +3102,7 @@ var CalendarProvider = ({
|
|
|
3098
3102
|
start: startDate,
|
|
3099
3103
|
end: endDate,
|
|
3100
3104
|
description: "",
|
|
3101
|
-
|
|
3105
|
+
allDay: false,
|
|
3102
3106
|
isRecurring: false,
|
|
3103
3107
|
recurrence: null,
|
|
3104
3108
|
parentEventId: null
|
|
@@ -3234,10 +3238,10 @@ var CalendarProvider = ({
|
|
|
3234
3238
|
return getEventsForDateRange(day, nextDay);
|
|
3235
3239
|
}, [getEventsForDateRange]);
|
|
3236
3240
|
const addRecurringEvent = useCallback2((event) => {
|
|
3237
|
-
|
|
3241
|
+
setCurrentEvents((prevEvents) => [...prevEvents, event]);
|
|
3238
3242
|
}, []);
|
|
3239
3243
|
const deleteRecurringEvent = useCallback2((eventId, deleteAll) => {
|
|
3240
|
-
|
|
3244
|
+
setCurrentEvents((prevEvents) => {
|
|
3241
3245
|
const event = prevEvents.find((e) => e.id === eventId);
|
|
3242
3246
|
if (!event)
|
|
3243
3247
|
return prevEvents;
|
|
@@ -3270,7 +3274,7 @@ var CalendarProvider = ({
|
|
|
3270
3274
|
});
|
|
3271
3275
|
}, []);
|
|
3272
3276
|
const updateRecurringEvent = useCallback2((eventId, updatedEvent, updateAll) => {
|
|
3273
|
-
|
|
3277
|
+
setCurrentEvents((prevEvents) => {
|
|
3274
3278
|
const event = prevEvents.find((e) => e.id === eventId);
|
|
3275
3279
|
if (!event)
|
|
3276
3280
|
return prevEvents;
|
|
@@ -3321,7 +3325,7 @@ var CalendarProvider = ({
|
|
|
3321
3325
|
});
|
|
3322
3326
|
}, []);
|
|
3323
3327
|
const createExceptionForRecurringEvent = useCallback2((eventId, date) => {
|
|
3324
|
-
|
|
3328
|
+
setCurrentEvents((prevEvents) => {
|
|
3325
3329
|
const event = prevEvents.find((e) => e.id === eventId);
|
|
3326
3330
|
if (!event || !event.recurrence)
|
|
3327
3331
|
return prevEvents;
|
|
@@ -3345,7 +3349,7 @@ var CalendarProvider = ({
|
|
|
3345
3349
|
const contextValue = useMemo6(() => ({
|
|
3346
3350
|
currentDate,
|
|
3347
3351
|
view,
|
|
3348
|
-
events,
|
|
3352
|
+
events: currentEvents,
|
|
3349
3353
|
currentLocale,
|
|
3350
3354
|
isEventFormOpen,
|
|
3351
3355
|
selectedEvent,
|
|
@@ -3373,16 +3377,17 @@ var CalendarProvider = ({
|
|
|
3373
3377
|
onEventClick: handleEventClick,
|
|
3374
3378
|
onCellClick: handleDateClick,
|
|
3375
3379
|
locale,
|
|
3376
|
-
timezone:
|
|
3380
|
+
timezone: currentTimezone,
|
|
3377
3381
|
disableCellClick,
|
|
3378
3382
|
disableEventClick,
|
|
3379
3383
|
disableDragAndDrop,
|
|
3380
3384
|
dayMaxEvents,
|
|
3381
|
-
|
|
3385
|
+
stickyViewHeader,
|
|
3386
|
+
viewHeaderClassName
|
|
3382
3387
|
}), [
|
|
3383
3388
|
currentDate,
|
|
3384
3389
|
view,
|
|
3385
|
-
|
|
3390
|
+
currentEvents,
|
|
3386
3391
|
currentLocale,
|
|
3387
3392
|
isEventFormOpen,
|
|
3388
3393
|
selectedEvent,
|
|
@@ -3408,12 +3413,13 @@ var CalendarProvider = ({
|
|
|
3408
3413
|
handleEventClick,
|
|
3409
3414
|
handleDateClick,
|
|
3410
3415
|
locale,
|
|
3411
|
-
|
|
3416
|
+
currentTimezone,
|
|
3412
3417
|
disableCellClick,
|
|
3413
3418
|
disableEventClick,
|
|
3414
3419
|
disableDragAndDrop,
|
|
3415
3420
|
dayMaxEvents,
|
|
3416
|
-
|
|
3421
|
+
stickyViewHeader,
|
|
3422
|
+
viewHeaderClassName
|
|
3417
3423
|
]);
|
|
3418
3424
|
return /* @__PURE__ */ jsxDEV47(CalendarContext.Provider, {
|
|
3419
3425
|
value: contextValue,
|
|
@@ -3500,10 +3506,11 @@ var IlamyCalendar = ({
|
|
|
3500
3506
|
disableEventClick,
|
|
3501
3507
|
disableDragAndDrop,
|
|
3502
3508
|
dayMaxEvents = DEFAULT_DAY_MAX_EVENTS,
|
|
3503
|
-
|
|
3509
|
+
stickyViewHeader = true,
|
|
3510
|
+
viewHeaderClassName = ""
|
|
3504
3511
|
}) => {
|
|
3505
3512
|
return /* @__PURE__ */ jsxDEV48(CalendarProvider, {
|
|
3506
|
-
|
|
3513
|
+
events,
|
|
3507
3514
|
firstDayOfWeek: dayNumberMap[firstDayOfWeek],
|
|
3508
3515
|
renderEvent,
|
|
3509
3516
|
onEventClick,
|
|
@@ -3515,7 +3522,8 @@ var IlamyCalendar = ({
|
|
|
3515
3522
|
disableEventClick,
|
|
3516
3523
|
disableDragAndDrop,
|
|
3517
3524
|
dayMaxEvents,
|
|
3518
|
-
|
|
3525
|
+
stickyViewHeader,
|
|
3526
|
+
viewHeaderClassName,
|
|
3519
3527
|
children: /* @__PURE__ */ jsxDEV48(CalendarContent, {}, undefined, false, undefined, this)
|
|
3520
3528
|
}, undefined, false, undefined, this);
|
|
3521
3529
|
};
|
|
@@ -3523,3 +3531,6 @@ export {
|
|
|
3523
3531
|
usePublicCalendarContext as useIlamyCalendarContext,
|
|
3524
3532
|
IlamyCalendar
|
|
3525
3533
|
};
|
|
3534
|
+
|
|
3535
|
+
//# debugId=6116CC68B191B54164756E2164756E21
|
|
3536
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2ZlYXR1cmVzL21vbnRoLXZpZXcvY29tcG9uZW50cy9tb250aC12aWV3LnRzeCIsICIuLi9zcmMvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL2FjY29yZGlvbi50c3giLCAiLi4vc3JjL2xpYi91dGlscy50cyIsICIuLi9zcmMvbGliL2RheWpzLWNvbmZpZy50cyIsICIuLi9zcmMvY29tcG9uZW50cy91aS9hbGVydC50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvYmFkZ2UudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL2J1dHRvbi50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvY2FsZW5kYXIudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL2NoZWNrYm94LnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9kYXRlLXBpY2tlci50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvcG9wb3Zlci50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvZGlhbG9nLnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9kcm9wZG93bi1tZW51LnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9mb3JtLnRzeCIsICIuLi9ub2RlX21vZHVsZXMvcmVhY3QtaG9vay1mb3JtL2Rpc3QvaW5kZXguZXNtLm1qcyIsICIuLi9zcmMvY29tcG9uZW50cy91aS9sYWJlbC50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvaW5wdXQudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3Njcm9sbC1hcmVhLnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9zZWxlY3QudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3NlcGFyYXRvci50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvc2hlZXQudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3RhYnMudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3Rvb2x0aXAudHN4IiwgIi4uL3NyYy9mZWF0dXJlcy9tb250aC12aWV3L2NvbXBvbmVudHMvYWxsLWV2ZW50cy1kaWFsb2cudHN4IiwgIi4uL3NyYy9mZWF0dXJlcy9kcmFnZ2FibGUtZXZlbnQvZHJhZ2dhYmxlLWV2ZW50LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvbW9udGgtdmlldy9jb21wb25lbnRzL2RheS1jZWxsLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZHJvcHBhYmxlLWNlbGwvZHJvcHBhYmxlLWNlbGwudHN4IiwgIi4uL3NyYy9mZWF0dXJlcy9tb250aC12aWV3L2NvbXBvbmVudHMvbW9udGgtaGVhZGVyLnRzeCIsICIuLi9zcmMvbGliL2NvbnN0YW50cy50cyIsICIuLi9zcmMvZmVhdHVyZXMvbW9udGgtdmlldy9jb21wb25lbnRzL3dlZWstZXZlbnRzLWxheWVyLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvd2Vlay12aWV3L3dlZWstdmlldy50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL3dlZWstdmlldy93ZWVrLWFsbC1kYXktcm93LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvd2Vlay12aWV3L3dlZWstaGVhZGVyLnRzeCIsICIuLi9zcmMvaG9va3MvdXNlUHJvY2Vzc2VkRGF5RXZlbnRzLnRzIiwgIi4uL3NyYy9mZWF0dXJlcy9kYXktdmlldy9kYXktZXZlbnRzLWxheWVyLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvd2Vlay12aWV3L3dlZWstZGF5LWNvbC50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL3dlZWstdmlldy93ZWVrLXRpbWUtZ3JpZC50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL2RheS12aWV3L2RheS12aWV3LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZGF5LXZpZXcvZGF5LWFsbC1kYXktcm93LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZGF5LXZpZXcvZGF5LWhlYWRlci50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL2RheS12aWV3L2RheS10aW1lLWNvbC50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvZXZlbnQtZm9ybS9ldmVudC1mb3JtLnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy9oZWFkZXIvYmFzZS1oZWFkZXIudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL2hlYWRlci90aXRsZS1jb250ZW50LnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy9oZWFkZXIvdmlldy1jb250cm9scy50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL3llYXItdmlldy95ZWFyLXZpZXcudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL2lsYW15LWNhbGVuZGFyL2lsYW15LWNhbGVuZGFyLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZHJhZy1hbmQtZHJvcC9jYWxlbmRhci1kbmQtY29udGV4dC50c3giLCAiLi4vc3JjL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvcHJvdmlkZXIudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IEFuaW1hdGVQcmVzZW5jZSwgbW90aW9uIH0gZnJvbSAnbW90aW9uL3JlYWN0J1xuaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgQWxsRXZlbnREaWFsb2cgfSBmcm9tICcuL2FsbC1ldmVudHMtZGlhbG9nJ1xuaW1wb3J0IHsgRGF5Q2VsbCB9IGZyb20gJy4vZGF5LWNlbGwnXG5pbXBvcnQgdHlwZSB7IE1vbnRoVmlld1Byb3BzLCBTZWxlY3RlZERheUV2ZW50cyB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgTW9udGhIZWFkZXIgfSBmcm9tICcuL21vbnRoLWhlYWRlcidcbmltcG9ydCB7IFdlZWtFdmVudHNMYXllciB9IGZyb20gJy4vd2Vlay1ldmVudHMtbGF5ZXInXG5cbmV4cG9ydCBjb25zdCBNb250aFZpZXc6IFJlYWN0LkZDPE1vbnRoVmlld1Byb3BzPiA9ICh7IGRheU1heEV2ZW50cyA9IDMgfSkgPT4ge1xuICBjb25zdCBhbGxFdmVudHNEaWFsb2dSZWYgPSBSZWFjdC51c2VSZWY8e1xuICAgIG9wZW46ICgpID0+IHZvaWRcbiAgICBjbG9zZTogKCkgPT4gdm9pZFxuICAgIHNldFNlbGVjdGVkRGF5RXZlbnRzOiAoZGF5RXZlbnRzOiBTZWxlY3RlZERheUV2ZW50cykgPT4gdm9pZFxuICB9PihudWxsKVxuICBjb25zdCB7IGN1cnJlbnREYXRlLCBmaXJzdERheU9mV2VlayB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBHZXQgc3RhcnQgZGF0ZSBmb3IgdGhlIGN1cnJlbnQgbW9udGggdmlldyBiYXNlZCBvbiBmaXJzdERheU9mV2Vla1xuICBjb25zdCBmaXJzdERheU9mTW9udGggPSBjdXJyZW50RGF0ZS5zdGFydE9mKCdtb250aCcpXG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIGNhbGVuZGFyIGdyaWQgY29ycmVjdGx5XG4gIC8vIEZpbmQgdGhlIGZpcnN0IGRheSBvZiB3ZWVrIChlLmcuIFN1bmRheSBvciBNb25kYXkpIHRoYXQgY29tZXMgYmVmb3JlIG9yIG9uIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoXG4gIGxldCBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhciA9IGZpcnN0RGF5T2ZNb250aC5jbG9uZSgpXG4gIHdoaWxlIChhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhci5kYXkoKSAhPT0gZmlyc3REYXlPZldlZWspIHtcbiAgICBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhciA9IGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyLnN1YnRyYWN0KDEsICdkYXknKVxuICB9XG5cbiAgLy8gQWx3YXlzIGdlbmVyYXRlIDYgd2Vla3MgKDQyIGRheXMpIHJlZ2FyZGxlc3Mgb2YgdGhlIG1vbnRoIGxlbmd0aFxuICAvLyBUaGlzIGVuc3VyZXMgd2UgYWx3YXlzIGhhdmUgNiByb3dzIG9mIGRheXNcbiAgY29uc3QgY2FsZW5kYXJEYXlzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gNiB3ZWVrcyDDlyA3IGRheXMgPSA0MiBkYXlzXG4gICAgY29uc3QgZGF5czogZGF5anMuRGF5anNbXVtdID0gW1tdXVxuICAgIGxldCBkYXkgPSBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhci5jbG9uZSgpIC8vIENsb25lIHRvIGF2b2lkIG11dGF0aW9uXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0MjsgaSsrKSB7XG4gICAgICBpZiAoZGF5c1tkYXlzLmxlbmd0aCAtIDFdLmxlbmd0aCA9PT0gNykge1xuICAgICAgICBkYXlzLnB1c2goW10pIC8vIFN0YXJ0IGEgbmV3IHdlZWtcbiAgICAgIH1cbiAgICAgIGRheXNbZGF5cy5sZW5ndGggLSAxXS5wdXNoKGRheSlcbiAgICAgIGRheSA9IGRheS5hZGQoMSwgJ2RheScpIC8vIE1vdmUgdG8gdGhlIG5leHQgZGF5XG4gICAgfVxuICAgIHJldHVybiBkYXlzXG4gIH0sIFthZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhcl0pXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaC1mdWxsIGZsZXgtY29sXCIgZGF0YS10ZXN0aWQ9XCJtb250aC12aWV3XCI+XG4gICAgICB7LyogV2VlayBkYXlzIGhlYWRlciAqL31cbiAgICAgIDxNb250aEhlYWRlciAvPlxuXG4gICAgICB7LyogQ2FsZW5kYXIgZ3JpZCAtIGFkZGVkIGZpeGVkIGhlaWdodCAqL31cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LWF1dG8gaC1mdWxsXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJtb250aC1zY3JvbGwtYXJlYVwiXG4gICAgICA+XG4gICAgICAgIDxBbmltYXRlUHJlc2VuY2UgbW9kZT1cIndhaXRcIj5cbiAgICAgICAgICA8bW90aW9uLmRpdlxuICAgICAgICAgICAga2V5PXtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCB9fVxuICAgICAgICAgICAgYW5pbWF0ZT17eyBvcGFjaXR5OiAxIH19XG4gICAgICAgICAgICBleGl0PXt7IG9wYWNpdHk6IDAgfX1cbiAgICAgICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuMjUsIGVhc2U6ICdlYXNlSW5PdXQnIH19XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBncmlkIGgtZnVsbCBncmlkLWNvbHMtNyBncmlkLXJvd3MtNiBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibW9udGgtY2FsZW5kYXItZ3JpZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgey8qIERheSBjZWxscyAqL31cbiAgICAgICAgICAgIHtjYWxlbmRhckRheXMubWFwKChkYXlzLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGtleT17YHdlZWstJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgY29sLXNwYW4tNyBncmlkIGdyaWQtY29scy03XCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgd2Vlay1yb3ctJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtkYXlzLm1hcCgoZGF5LCBkYXlJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxEYXlDZWxsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleD17ZGF5SW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXk9e2RheX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRheU1heEV2ZW50cz17ZGF5TWF4RXZlbnRzfVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXItciBib3JkZXItYiBmaXJzdDpib3JkZXItbFwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgfSl9XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCB6LTEwIHBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPFdlZWtFdmVudHNMYXllciBkYXlzPXtkYXlzfSAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvbW90aW9uLmRpdj5cbiAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIERpYWxvZyBmb3Igc2hvd2luZyBhbGwgZXZlbnRzICovfVxuICAgICAgPEFsbEV2ZW50RGlhbG9nIHJlZj17YWxsRXZlbnRzRGlhbG9nUmVmfSAvPlxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcbmltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCdcblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhckNvbnRleHRUeXBlIHtcbiAgY3VycmVudERhdGU6IGRheWpzLkRheWpzXG4gIHZpZXc6ICdtb250aCcgfCAnd2VlaycgfCAnZGF5JyB8ICd5ZWFyJ1xuICBldmVudHM6IENhbGVuZGFyRXZlbnRbXVxuICBpc0V2ZW50Rm9ybU9wZW46IGJvb2xlYW5cbiAgc2VsZWN0ZWRFdmVudDogQ2FsZW5kYXJFdmVudCB8IG51bGxcbiAgc2VsZWN0ZWREYXRlOiBkYXlqcy5EYXlqcyB8IG51bGxcbiAgZmlyc3REYXlPZldlZWs6IG51bWJlciAvLyAwIGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSwgZXRjLlxuICBzZXRDdXJyZW50RGF0ZTogKGRhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIHNlbGVjdERhdGU6IChkYXRlOiBkYXlqcy5EYXlqcykgPT4gdm9pZFxuICBzZXRWaWV3OiAodmlldzogJ21vbnRoJyB8ICd3ZWVrJyB8ICdkYXknIHwgJ3llYXInKSA9PiB2b2lkXG4gIG5leHRQZXJpb2Q6ICgpID0+IHZvaWRcbiAgcHJldlBlcmlvZDogKCkgPT4gdm9pZFxuICB0b2RheTogKCkgPT4gdm9pZFxuICBhZGRFdmVudDogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIHVwZGF0ZUV2ZW50OiAoZXZlbnRJZDogc3RyaW5nLCBldmVudDogUGFydGlhbDxDYWxlbmRhckV2ZW50PikgPT4gdm9pZFxuICBkZWxldGVFdmVudDogKGV2ZW50SWQ6IHN0cmluZykgPT4gdm9pZFxuICBvcGVuRXZlbnRGb3JtOiAoZGF0ZT86IGRheWpzLkRheWpzLCBldmVudD86IENhbGVuZGFyRXZlbnQpID0+IHZvaWRcbiAgY2xvc2VFdmVudEZvcm06ICgpID0+IHZvaWRcbiAgZ2V0RXZlbnRzRm9yRGF0ZTogKGRhdGU6IGRheWpzLkRheWpzKSA9PiBDYWxlbmRhckV2ZW50W11cbiAgZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlOiAoXG4gICAgc3RhcnQ6IGRheWpzLkRheWpzLFxuICAgIGVuZDogZGF5anMuRGF5anNcbiAgKSA9PiBDYWxlbmRhckV2ZW50W11cbiAgZXhwYW5kUmVjdXJyaW5nRXZlbnQ6IChcbiAgICBiYXNlRXZlbnQ6IENhbGVuZGFyRXZlbnQsXG4gICAgc3RhcnREYXRlOiBkYXlqcy5EYXlqcyxcbiAgICBlbmREYXRlOiBkYXlqcy5EYXlqc1xuICApID0+IENhbGVuZGFyRXZlbnRbXVxuICBhZGRSZWN1cnJpbmdFdmVudDogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIGRlbGV0ZVJlY3VycmluZ0V2ZW50OiAoZXZlbnRJZDogc3RyaW5nLCBkZWxldGVBbGw6IGJvb2xlYW4pID0+IHZvaWRcbiAgdXBkYXRlUmVjdXJyaW5nRXZlbnQ6IChcbiAgICBldmVudElkOiBzdHJpbmcsXG4gICAgdXBkYXRlZEV2ZW50OiBQYXJ0aWFsPENhbGVuZGFyRXZlbnQ+LFxuICAgIHVwZGF0ZUFsbDogYm9vbGVhblxuICApID0+IHZvaWRcbiAgY3JlYXRlRXhjZXB0aW9uRm9yUmVjdXJyaW5nRXZlbnQ6IChldmVudElkOiBzdHJpbmcsIGRhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIHJlbmRlckV2ZW50PzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBSZWFjdC5SZWFjdE5vZGVcbiAgb25FdmVudENsaWNrOiAoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHZvaWRcbiAgb25DZWxsQ2xpY2s6IChzdGFydERhdGU6IGRheWpzLkRheWpzLCBlbmREYXRlOiBkYXlqcy5EYXlqcykgPT4gdm9pZFxuICBjdXJyZW50TG9jYWxlPzogc3RyaW5nXG4gIGRpc2FibGVDZWxsQ2xpY2s/OiBib29sZWFuXG4gIGRpc2FibGVFdmVudENsaWNrPzogYm9vbGVhblxuICBkaXNhYmxlRHJhZ0FuZERyb3A/OiBib29sZWFuXG4gIGRheU1heEV2ZW50czogbnVtYmVyXG4gIHN0aWNreVZpZXdIZWFkZXI6IGJvb2xlYW5cbiAgdmlld0hlYWRlckNsYXNzTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBDYWxlbmRhckNvbnRleHQgPSBjcmVhdGVDb250ZXh0PENhbGVuZGFyQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KFxuICB1bmRlZmluZWRcbilcblxuZXhwb3J0IGNvbnN0IHVzZUNhbGVuZGFyQ29udGV4dCA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQ2FsZW5kYXJDb250ZXh0KVxuICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VDYWxlbmRhckNvbnRleHQgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIENhbGVuZGFyUHJvdmlkZXInKVxuICB9XG4gIHJldHVybiBjb250ZXh0XG59XG5cbmV4cG9ydCBjb25zdCB1c2VQdWJsaWNDYWxlbmRhckNvbnRleHQgPSAoKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KENhbGVuZGFyQ29udGV4dClcbiAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlQ2FsZW5kYXJDb250ZXh0IG11c3QgYmUgdXNlZCB3aXRoaW4gaWxhbXkgY2FsZW5kYXInKVxuICB9XG4gIHJldHVybiB7XG4gICAgY3VycmVudERhdGU6IGNvbnRleHQuY3VycmVudERhdGUsXG4gICAgdmlldzogY29udGV4dC52aWV3LFxuICAgIGV2ZW50czogY29udGV4dC5ldmVudHMsXG4gICAgaXNFdmVudEZvcm1PcGVuOiBjb250ZXh0LmlzRXZlbnRGb3JtT3BlbixcbiAgICBzZWxlY3RlZEV2ZW50OiBjb250ZXh0LnNlbGVjdGVkRXZlbnQsXG4gICAgc2VsZWN0ZWREYXRlOiBjb250ZXh0LnNlbGVjdGVkRGF0ZSxcbiAgICBmaXJzdERheU9mV2VlazogY29udGV4dC5maXJzdERheU9mV2VlayxcbiAgICBzZXRDdXJyZW50RGF0ZTogY29udGV4dC5zZXRDdXJyZW50RGF0ZSxcbiAgICBzZWxlY3REYXRlOiBjb250ZXh0LnNlbGVjdERhdGUsXG4gICAgc2V0VmlldzogY29udGV4dC5zZXRWaWV3LFxuICAgIG5leHRQZXJpb2Q6IGNvbnRleHQubmV4dFBlcmlvZCxcbiAgICBwcmV2UGVyaW9kOiBjb250ZXh0LnByZXZQZXJpb2QsXG4gICAgdG9kYXk6IGNvbnRleHQudG9kYXksXG4gICAgYWRkRXZlbnQ6IGNvbnRleHQuYWRkRXZlbnQsXG4gICAgdXBkYXRlRXZlbnQ6IGNvbnRleHQudXBkYXRlRXZlbnQsXG4gICAgZGVsZXRlRXZlbnQ6IGNvbnRleHQuZGVsZXRlRXZlbnQsXG4gICAgb3BlbkV2ZW50Rm9ybTogY29udGV4dC5vcGVuRXZlbnRGb3JtLFxuICAgIGNsb3NlRXZlbnRGb3JtOiBjb250ZXh0LmNsb3NlRXZlbnRGb3JtLFxuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgQWNjb3JkaW9uUHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1hY2NvcmRpb24nXG5pbXBvcnQgeyBDaGV2cm9uRG93bkljb24gfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmZ1bmN0aW9uIEFjY29yZGlvbih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgQWNjb3JkaW9uUHJpbWl0aXZlLlJvb3Q+KSB7XG4gIHJldHVybiA8QWNjb3JkaW9uUHJpbWl0aXZlLlJvb3QgZGF0YS1zbG90PVwiYWNjb3JkaW9uXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBBY2NvcmRpb25JdGVtKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIEFjY29yZGlvblByaW1pdGl2ZS5JdGVtPikge1xuICByZXR1cm4gKFxuICAgIDxBY2NvcmRpb25QcmltaXRpdmUuSXRlbVxuICAgICAgZGF0YS1zbG90PVwiYWNjb3JkaW9uLWl0ZW1cIlxuICAgICAgY2xhc3NOYW1lPXtjbignYm9yZGVyLWIgbGFzdDpib3JkZXItYi0wJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIEFjY29yZGlvblRyaWdnZXIoe1xuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIEFjY29yZGlvblByaW1pdGl2ZS5UcmlnZ2VyPikge1xuICByZXR1cm4gKFxuICAgIDxBY2NvcmRpb25QcmltaXRpdmUuSGVhZGVyIGNsYXNzTmFtZT1cImZsZXhcIj5cbiAgICAgIDxBY2NvcmRpb25QcmltaXRpdmUuVHJpZ2dlclxuICAgICAgICBkYXRhLXNsb3Q9XCJhY2NvcmRpb24tdHJpZ2dlclwiXG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2ZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgZmxleCBmbGV4LTEgaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00IHJvdW5kZWQtbWQgcHktNCB0ZXh0LWxlZnQgdGV4dC1zbSBmb250LW1lZGl1bSB0cmFuc2l0aW9uLWFsbCBvdXRsaW5lLW5vbmUgaG92ZXI6dW5kZXJsaW5lIGZvY3VzLXZpc2libGU6cmluZy1bM3B4XSBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAgWyZbZGF0YS1zdGF0ZT1vcGVuXT5zdmddOnJvdGF0ZS0xODAnLFxuICAgICAgICAgIGNsYXNzTmFtZVxuICAgICAgICApfVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICA+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPENoZXZyb25Eb3duSWNvbiBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgcG9pbnRlci1ldmVudHMtbm9uZSBzaXplLTQgc2hyaW5rLTAgdHJhbnNsYXRlLXktMC41IHRyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTIwMFwiIC8+XG4gICAgICA8L0FjY29yZGlvblByaW1pdGl2ZS5UcmlnZ2VyPlxuICAgIDwvQWNjb3JkaW9uUHJpbWl0aXZlLkhlYWRlcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBBY2NvcmRpb25Db250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBBY2NvcmRpb25QcmltaXRpdmUuQ29udGVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8QWNjb3JkaW9uUHJpbWl0aXZlLkNvbnRlbnRcbiAgICAgIGRhdGEtc2xvdD1cImFjY29yZGlvbi1jb250ZW50XCJcbiAgICAgIGNsYXNzTmFtZT1cImRhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1hY2NvcmRpb24tdXAgZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1hY2NvcmRpb24tZG93biBvdmVyZmxvdy1jbGlwIHRleHQtc21cIlxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbigncHQtMCBwYi00JywgY2xhc3NOYW1lKX0+e2NoaWxkcmVufTwvZGl2PlxuICAgIDwvQWNjb3JkaW9uUHJpbWl0aXZlLkNvbnRlbnQ+XG4gIClcbn1cblxuZXhwb3J0IHsgQWNjb3JkaW9uLCBBY2NvcmRpb25JdGVtLCBBY2NvcmRpb25UcmlnZ2VyLCBBY2NvcmRpb25Db250ZW50IH1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSAnQC9jb21wb25lbnRzJ1xuaW1wb3J0IHsgdHlwZSBDbGFzc1ZhbHVlLCBjbHN4IH0gZnJvbSAnY2xzeCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyB0d01lcmdlIH0gZnJvbSAndGFpbHdpbmQtbWVyZ2UnXG5cbmV4cG9ydCBmdW5jdGlvbiBjbiguLi5pbnB1dHM6IENsYXNzVmFsdWVbXSkge1xuICByZXR1cm4gdHdNZXJnZShjbHN4KGlucHV0cykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1vY2tFdmVudHMoeyBjb3VudCA9IDUgfSA9IHt9KSB7XG4gIGNvbnN0IGV2ZW50czogQ2FsZW5kYXJFdmVudFtdID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgZXZlbnRzLnB1c2goe1xuICAgICAgaWQ6IGkudG9TdHJpbmcoKSxcbiAgICAgIHRpdGxlOiBgTW9jayBFdmVudCAke2kgKyAxfWAsXG4gICAgICBzdGFydDogZGF5anMoKS5hZGQoaSwgJ2RheScpLnN0YXJ0T2YoJ2RheScpLFxuICAgICAgZW5kOiBkYXlqcygpLmFkZChpLCAnZGF5JykuZW5kT2YoJ2RheScpLFxuICAgICAgY29sb3I6ICdiZy1ncmF5LTEwMCB0ZXh0LWdyYXktODAwJyxcbiAgICB9KVxuICB9XG4gIHJldHVybiBldmVudHNcbn1cbiIsCiAgICAiaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xuaW1wb3J0IHdlZWtkYXkgZnJvbSAnZGF5anMvcGx1Z2luL3dlZWtkYXkuanMnXG5pbXBvcnQgd2Vla09mWWVhciBmcm9tICdkYXlqcy9wbHVnaW4vd2Vla09mWWVhci5qcydcbmltcG9ydCBpc1NhbWVPckFmdGVyIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckFmdGVyLmpzJ1xuaW1wb3J0IGlzU2FtZU9yQmVmb3JlIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckJlZm9yZS5qcydcbmltcG9ydCBpc0JldHdlZW4gZnJvbSAnZGF5anMvcGx1Z2luL2lzQmV0d2Vlbi5qcydcbmltcG9ydCBtaW5NYXggZnJvbSAnZGF5anMvcGx1Z2luL21pbk1heC5qcydcbmltcG9ydCB0aW1lem9uZSBmcm9tICdkYXlqcy9wbHVnaW4vdGltZXpvbmUuanMnXG5pbXBvcnQgdXRjIGZyb20gJ2RheWpzL3BsdWdpbi91dGMuanMnXG5pbXBvcnQgbG9jYWxlRGF0YSBmcm9tICdkYXlqcy9wbHVnaW4vbG9jYWxlRGF0YS5qcydcblxuLy8gSW1wb3J0IGFsbCBkYXlqcyBsb2NhbGVzIGFscGhhYmV0aWNhbGx5XG4vLyBsb2NhbGUuanNvbiBmaWxlOiBbe1wia2V5XCI6XCJhZlwiLFwibmFtZVwiOlwiQWZyaWthYW5zXCJ9LHtcImtleVwiOlwiYW1cIixcIm5hbWVcIjpcIkFtaGFyaWNcIn0se1wia2V5XCI6XCJhci1kelwiLFwibmFtZVwiOlwiQXJhYmljIChBbGdlcmlhKVwifSx7XCJrZXlcIjpcImFyLWlxXCIsXCJuYW1lXCI6XCIgQXJhYmljIChJcmFxKVwifSx7XCJrZXlcIjpcImFyLWt3XCIsXCJuYW1lXCI6XCJBcmFiaWMgKEt1d2FpdClcIn0se1wia2V5XCI6XCJhci1seVwiLFwibmFtZVwiOlwiQXJhYmljIChMeWJpYSlcIn0se1wia2V5XCI6XCJhci1tYVwiLFwibmFtZVwiOlwiQXJhYmljIChNb3JvY2NvKVwifSx7XCJrZXlcIjpcImFyLXNhXCIsXCJuYW1lXCI6XCJBcmFiaWMgKFNhdWRpIEFyYWJpYSlcIn0se1wia2V5XCI6XCJhci10blwiLFwibmFtZVwiOlwiIEFyYWJpYyAoVHVuaXNpYSlcIn0se1wia2V5XCI6XCJhclwiLFwibmFtZVwiOlwiQXJhYmljXCJ9LHtcImtleVwiOlwiYXpcIixcIm5hbWVcIjpcIkF6ZXJiYWlqYW5pXCJ9LHtcImtleVwiOlwiYmVcIixcIm5hbWVcIjpcIkJlbGFydXNpYW5cIn0se1wia2V5XCI6XCJiZ1wiLFwibmFtZVwiOlwiQnVsZ2FyaWFuXCJ9LHtcImtleVwiOlwiYmlcIixcIm5hbWVcIjpcIkJpc2xhbWFcIn0se1wia2V5XCI6XCJibVwiLFwibmFtZVwiOlwiQmFtYmFyYVwifSx7XCJrZXlcIjpcImJuLWJkXCIsXCJuYW1lXCI6XCJCZW5nYWxpIChCYW5nbGFkZXNoKVwifSx7XCJrZXlcIjpcImJuXCIsXCJuYW1lXCI6XCJCZW5nYWxpXCJ9LHtcImtleVwiOlwiYm9cIixcIm5hbWVcIjpcIlRpYmV0YW5cIn0se1wia2V5XCI6XCJiclwiLFwibmFtZVwiOlwiQnJldG9uXCJ9LHtcImtleVwiOlwiYnNcIixcIm5hbWVcIjpcIkJvc25pYW5cIn0se1wia2V5XCI6XCJjYVwiLFwibmFtZVwiOlwiQ2F0YWxhblwifSx7XCJrZXlcIjpcImNzXCIsXCJuYW1lXCI6XCJDemVjaFwifSx7XCJrZXlcIjpcImN2XCIsXCJuYW1lXCI6XCJDaHV2YXNoXCJ9LHtcImtleVwiOlwiY3lcIixcIm5hbWVcIjpcIldlbHNoXCJ9LHtcImtleVwiOlwiZGUtYXRcIixcIm5hbWVcIjpcIkdlcm1hbiAoQXVzdHJpYSlcIn0se1wia2V5XCI6XCJkYVwiLFwibmFtZVwiOlwiRGFuaXNoXCJ9LHtcImtleVwiOlwiZGUtY2hcIixcIm5hbWVcIjpcIkdlcm1hbiAoU3dpdHplcmxhbmQpXCJ9LHtcImtleVwiOlwiZGVcIixcIm5hbWVcIjpcIkdlcm1hblwifSx7XCJrZXlcIjpcImR2XCIsXCJuYW1lXCI6XCJNYWxkaXZpYW5cIn0se1wia2V5XCI6XCJlbFwiLFwibmFtZVwiOlwiR3JlZWtcIn0se1wia2V5XCI6XCJlbi1hdVwiLFwibmFtZVwiOlwiRW5nbGlzaCAoQXVzdHJhbGlhKVwifSx7XCJrZXlcIjpcImVuLWNhXCIsXCJuYW1lXCI6XCJFbmdsaXNoIChDYW5hZGEpXCJ9LHtcImtleVwiOlwiZW4tZ2JcIixcIm5hbWVcIjpcIkVuZ2xpc2ggKFVuaXRlZCBLaW5nZG9tKVwifSx7XCJrZXlcIjpcImVuLWllXCIsXCJuYW1lXCI6XCJFbmdsaXNoIChJcmVsYW5kKVwifSx7XCJrZXlcIjpcImVuLWlsXCIsXCJuYW1lXCI6XCJFbmdsaXNoIChJc3JhZWwpXCJ9LHtcImtleVwiOlwiZW4taW5cIixcIm5hbWVcIjpcIkVuZ2xpc2ggKEluZGlhKVwifSx7XCJrZXlcIjpcImVuLW56XCIsXCJuYW1lXCI6XCJFbmdsaXNoIChOZXcgWmVhbGFuZClcIn0se1wia2V5XCI6XCJlbi1zZ1wiLFwibmFtZVwiOlwiRW5nbGlzaCAoU2luZ2Fwb3JlKVwifSx7XCJrZXlcIjpcImVuLXR0XCIsXCJuYW1lXCI6XCJFbmdsaXNoIChUcmluaWRhZCAmIFRvYmFnbylcIn0se1wia2V5XCI6XCJlb1wiLFwibmFtZVwiOlwiRXNwZXJhbnRvXCJ9LHtcImtleVwiOlwiZW5cIixcIm5hbWVcIjpcIkVuZ2xpc2hcIn0se1wia2V5XCI6XCJlcy1kb1wiLFwibmFtZVwiOlwiU3BhbmlzaCAoRG9taW5pY2FuIFJlcHVibGljKVwifSx7XCJrZXlcIjpcImVzLW14XCIsXCJuYW1lXCI6XCJTcGFuaXNoIChNZXhpY28pXCJ9LHtcImtleVwiOlwiZXMtcHJcIixcIm5hbWVcIjpcIlNwYW5pc2ggKFB1ZXJ0byBSaWNvKVwifSx7XCJrZXlcIjpcImVzLXVzXCIsXCJuYW1lXCI6XCJTcGFuaXNoIChVbml0ZWQgU3RhdGVzKVwifSx7XCJrZXlcIjpcImV0XCIsXCJuYW1lXCI6XCJFc3RvbmlhblwifSx7XCJrZXlcIjpcImVzXCIsXCJuYW1lXCI6XCJTcGFuaXNoXCJ9LHtcImtleVwiOlwiZXVcIixcIm5hbWVcIjpcIkJhc3F1ZVwifSx7XCJrZXlcIjpcImZhXCIsXCJuYW1lXCI6XCJQZXJzaWFuXCJ9LHtcImtleVwiOlwiZm9cIixcIm5hbWVcIjpcIkZhcm9lc2VcIn0se1wia2V5XCI6XCJmaVwiLFwibmFtZVwiOlwiRmlubmlzaFwifSx7XCJrZXlcIjpcImZyLWNhXCIsXCJuYW1lXCI6XCJGcmVuY2ggKENhbmFkYSlcIn0se1wia2V5XCI6XCJmci1jaFwiLFwibmFtZVwiOlwiRnJlbmNoIChTd2l0emVybGFuZClcIn0se1wia2V5XCI6XCJmclwiLFwibmFtZVwiOlwiRnJlbmNoXCJ9LHtcImtleVwiOlwiZnlcIixcIm5hbWVcIjpcIkZyaXNpYW5cIn0se1wia2V5XCI6XCJnYVwiLFwibmFtZVwiOlwiSXJpc2ggb3IgSXJpc2ggR2FlbGljXCJ9LHtcImtleVwiOlwiZ2RcIixcIm5hbWVcIjpcIlNjb3R0aXNoIEdhZWxpY1wifSx7XCJrZXlcIjpcImdvbS1sYXRuXCIsXCJuYW1lXCI6XCJLb25rYW5pIExhdGluIHNjcmlwdFwifSx7XCJrZXlcIjpcImdsXCIsXCJuYW1lXCI6XCJHYWxpY2lhblwifSx7XCJrZXlcIjpcImd1XCIsXCJuYW1lXCI6XCJHdWphcmF0aVwifSx7XCJrZXlcIjpcImhlXCIsXCJuYW1lXCI6XCJIZWJyZXdcIn0se1wia2V5XCI6XCJoaVwiLFwibmFtZVwiOlwiSGluZGlcIn0se1wia2V5XCI6XCJoclwiLFwibmFtZVwiOlwiQ3JvYXRpYW5cIn0se1wia2V5XCI6XCJodVwiLFwibmFtZVwiOlwiSHVuZ2FyaWFuXCJ9LHtcImtleVwiOlwiaHRcIixcIm5hbWVcIjpcIkhhaXRpYW4gQ3Jlb2xlIChIYWl0aSlcIn0se1wia2V5XCI6XCJoeS1hbVwiLFwibmFtZVwiOlwiQXJtZW5pYW5cIn0se1wia2V5XCI6XCJpZFwiLFwibmFtZVwiOlwiSW5kb25lc2lhblwifSx7XCJrZXlcIjpcImlzXCIsXCJuYW1lXCI6XCJJY2VsYW5kaWNcIn0se1wia2V5XCI6XCJpdC1jaFwiLFwibmFtZVwiOlwiSXRhbGlhbiAoU3dpdHplcmxhbmQpXCJ9LHtcImtleVwiOlwiaXRcIixcIm5hbWVcIjpcIkl0YWxpYW5cIn0se1wia2V5XCI6XCJqYVwiLFwibmFtZVwiOlwiSmFwYW5lc2VcIn0se1wia2V5XCI6XCJqdlwiLFwibmFtZVwiOlwiSmF2YW5lc2VcIn0se1wia2V5XCI6XCJrYVwiLFwibmFtZVwiOlwiR2VvcmdpYW5cIn0se1wia2V5XCI6XCJra1wiLFwibmFtZVwiOlwiS2F6YWtoXCJ9LHtcImtleVwiOlwia21cIixcIm5hbWVcIjpcIkNhbWJvZGlhblwifSx7XCJrZXlcIjpcImtuXCIsXCJuYW1lXCI6XCJLYW5uYWRhXCJ9LHtcImtleVwiOlwia29cIixcIm5hbWVcIjpcIktvcmVhblwifSx7XCJrZXlcIjpcImt1XCIsXCJuYW1lXCI6XCJLdXJkaXNoXCJ9LHtcImtleVwiOlwia3lcIixcIm5hbWVcIjpcIkt5cmd5elwifSx7XCJrZXlcIjpcImxiXCIsXCJuYW1lXCI6XCJMdXhlbWJvdXJnaXNoXCJ9LHtcImtleVwiOlwibG9cIixcIm5hbWVcIjpcIkxhb1wifSx7XCJrZXlcIjpcImx0XCIsXCJuYW1lXCI6XCJMaXRodWFuaWFuXCJ9LHtcImtleVwiOlwibHZcIixcIm5hbWVcIjpcIkxhdHZpYW5cIn0se1wia2V5XCI6XCJtZVwiLFwibmFtZVwiOlwiTW9udGVuZWdyaW5cIn0se1wia2V5XCI6XCJtaVwiLFwibmFtZVwiOlwiTWFvcmlcIn0se1wia2V5XCI6XCJta1wiLFwibmFtZVwiOlwiTWFjZWRvbmlhblwifSx7XCJrZXlcIjpcIm1sXCIsXCJuYW1lXCI6XCJNYWxheWFsYW1cIn0se1wia2V5XCI6XCJtblwiLFwibmFtZVwiOlwiTW9uZ29saWFuXCJ9LHtcImtleVwiOlwibXJcIixcIm5hbWVcIjpcIk1hcmF0aGlcIn0se1wia2V5XCI6XCJtcy1teVwiLFwibmFtZVwiOlwiTWFsYXlcIn0se1wia2V5XCI6XCJtc1wiLFwibmFtZVwiOlwiTWFsYXlcIn0se1wia2V5XCI6XCJtdFwiLFwibmFtZVwiOlwiTWFsdGVzZSAoTWFsdGEpXCJ9LHtcImtleVwiOlwibXlcIixcIm5hbWVcIjpcIkJ1cm1lc2VcIn0se1wia2V5XCI6XCJuYlwiLFwibmFtZVwiOlwiTm9yd2VnaWFuIEJva23DpWxcIn0se1wia2V5XCI6XCJuZVwiLFwibmFtZVwiOlwiTmVwYWxlc2VcIn0se1wia2V5XCI6XCJubC1iZVwiLFwibmFtZVwiOlwiRHV0Y2ggKEJlbGdpdW0pXCJ9LHtcImtleVwiOlwibmxcIixcIm5hbWVcIjpcIkR1dGNoXCJ9LHtcImtleVwiOlwicGxcIixcIm5hbWVcIjpcIlBvbGlzaFwifSx7XCJrZXlcIjpcInB0LWJyXCIsXCJuYW1lXCI6XCJQb3J0dWd1ZXNlIChCcmF6aWwpXCJ9LHtcImtleVwiOlwicHRcIixcIm5hbWVcIjpcIlBvcnR1Z3Vlc2VcIn0se1wia2V5XCI6XCJyblwiLFwibmFtZVwiOlwiS2lydW5kaVwifSx7XCJrZXlcIjpcInJvXCIsXCJuYW1lXCI6XCJSb21hbmlhblwifSx7XCJrZXlcIjpcInJ1XCIsXCJuYW1lXCI6XCJSdXNzaWFuXCJ9LHtcImtleVwiOlwicndcIixcIm5hbWVcIjpcIktpbnlhcndhbmRhIChSd2FuZGEpXCJ9LHtcImtleVwiOlwic2RcIixcIm5hbWVcIjpcIlNpbmRoaVwifSx7XCJrZXlcIjpcInNlXCIsXCJuYW1lXCI6XCJOb3J0aGVybiBTYW1pXCJ9LHtcImtleVwiOlwic2lcIixcIm5hbWVcIjpcIlNpbmhhbGVzZVwifSx7XCJrZXlcIjpcInNrXCIsXCJuYW1lXCI6XCJTbG92YWtcIn0se1wia2V5XCI6XCJzbFwiLFwibmFtZVwiOlwiU2xvdmVuaWFuXCJ9LHtcImtleVwiOlwic3FcIixcIm5hbWVcIjpcIkFsYmFuaWFuXCJ9LHtcImtleVwiOlwic3ItY3lybFwiLFwibmFtZVwiOlwiU2VyYmlhbiBDeXJpbGxpY1wifSx7XCJrZXlcIjpcInNzXCIsXCJuYW1lXCI6XCJzaVN3YXRpXCJ9LHtcImtleVwiOlwic3YtZmlcIixcIm5hbWVcIjpcIkZpbmxhbmQgU3dlZGlzaFwifSx7XCJrZXlcIjpcInNyXCIsXCJuYW1lXCI6XCJTZXJiaWFuXCJ9LHtcImtleVwiOlwic3ZcIixcIm5hbWVcIjpcIlN3ZWRpc2hcIn0se1wia2V5XCI6XCJzd1wiLFwibmFtZVwiOlwiU3dhaGlsaVwifSx7XCJrZXlcIjpcInRhXCIsXCJuYW1lXCI6XCJUYW1pbFwifSx7XCJrZXlcIjpcInRlXCIsXCJuYW1lXCI6XCJUZWx1Z3VcIn0se1wia2V5XCI6XCJ0ZXRcIixcIm5hbWVcIjpcIlRldHVuIERpbGkgKEVhc3QgVGltb3IpXCJ9LHtcImtleVwiOlwidGdcIixcIm5hbWVcIjpcIlRhamlrXCJ9LHtcImtleVwiOlwidGhcIixcIm5hbWVcIjpcIlRoYWlcIn0se1wia2V5XCI6XCJ0a1wiLFwibmFtZVwiOlwiVHVya21lblwifSx7XCJrZXlcIjpcInRsLXBoXCIsXCJuYW1lXCI6XCJUYWdhbG9nIChQaGlsaXBwaW5lcylcIn0se1wia2V5XCI6XCJ0bGhcIixcIm5hbWVcIjpcIktsaW5nb25cIn0se1wia2V5XCI6XCJ0clwiLFwibmFtZVwiOlwiVHVya2lzaFwifSx7XCJrZXlcIjpcInR6bFwiLFwibmFtZVwiOlwiVGFsb3NzYW5cIn0se1wia2V5XCI6XCJ0em0tbGF0blwiLFwibmFtZVwiOlwiQ2VudHJhbCBBdGxhcyBUYW1hemlnaHQgTGF0aW5cIn0se1wia2V5XCI6XCJ0em1cIixcIm5hbWVcIjpcIkNlbnRyYWwgQXRsYXMgVGFtYXppZ2h0XCJ9LHtcImtleVwiOlwidWctY25cIixcIm5hbWVcIjpcIlV5Z2h1ciAoQ2hpbmEpXCJ9LHtcImtleVwiOlwidWtcIixcIm5hbWVcIjpcIlVrcmFpbmlhblwifSx7XCJrZXlcIjpcInVyXCIsXCJuYW1lXCI6XCJVcmR1XCJ9LHtcImtleVwiOlwidXotbGF0blwiLFwibmFtZVwiOlwiVXpiZWsgTGF0aW5cIn0se1wia2V5XCI6XCJ1elwiLFwibmFtZVwiOlwiVXpiZWtcIn0se1wia2V5XCI6XCJ2aVwiLFwibmFtZVwiOlwiVmlldG5hbWVzZVwifSx7XCJrZXlcIjpcIngtcHNldWRvXCIsXCJuYW1lXCI6XCJQc2V1ZG9cIn0se1wia2V5XCI6XCJ5b1wiLFwibmFtZVwiOlwiWW9ydWJhIE5pZ2VyaWFcIn0se1wia2V5XCI6XCJ6aC1jblwiLFwibmFtZVwiOlwiQ2hpbmVzZSAoQ2hpbmEpXCJ9LHtcImtleVwiOlwiemgtaGtcIixcIm5hbWVcIjpcIkNoaW5lc2UgKEhvbmcgS29uZylcIn0se1wia2V5XCI6XCJ6aC10d1wiLFwibmFtZVwiOlwiQ2hpbmVzZSAoVGFpd2FuKVwifSx7XCJrZXlcIjpcInpoXCIsXCJuYW1lXCI6XCJDaGluZXNlXCJ9LHtcImtleVwiOlwib2MtbG5jXCIsXCJuYW1lXCI6XCJPY2NpdGFuLCBsZW5nYWRvY2lhbiBkaWFsZWN0ZVwifSx7XCJrZXlcIjpcIm5uXCIsXCJuYW1lXCI6XCJOeW5vcnNrXCJ9LHtcImtleVwiOlwicGEtaW5cIixcIm5hbWVcIjpcIlB1bmphYmkgKEluZGlhKVwifV1cbmltcG9ydCAnZGF5anMvbG9jYWxlL2FmLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYW0uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9hci1kei5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2FyLWlxLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYXIta3cuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9hci1seS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2FyLW1hLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYXItc2EuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9hci10bi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2FyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYXouanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9iZS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2JnLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYmkuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ibS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2JuLWJkLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYm4uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9iby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2JyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYnMuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9jYS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2NzLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvY3YuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9jeS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2RhLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZGUtYXQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9kZS1jaC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2RlLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZHYuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLWF1LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW4tY2EuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbi1nYi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLWllLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW4taWwuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbi1pbi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLW56LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW4tc2cuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbi10dC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW8uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lcy1kby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VzLW14LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZXMtcHIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lcy11cy5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VzLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZXQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ldS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2ZhLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZmkuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9mby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2ZyLWNhLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZnItY2guanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9mci5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2Z5LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZ2EuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9nZC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2dsLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZ29tLWxhdG4uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ndS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2hlLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvaGkuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9oci5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2h0LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvaHUuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9oeS1hbS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2lkLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvaXMuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9pdC1jaC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2l0LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvamEuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9qdi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2thLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUva2suanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9rbS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2tuLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUva28uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9rdS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2t5LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbGIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9sby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2x0LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbHYuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9tZS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL21pLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbWsuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9tbC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL21uLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbXIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9tcy1teS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL21zLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbXQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9teS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL25iLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbmUuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ubC1iZS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL25sLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbm4uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9vYy1sbmMuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9wYS1pbi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3BsLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvcHQtYnIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9wdC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3JuLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvcm8uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ydS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3J3LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc2QuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9zZS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3NpLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc2suanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9zbC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3NxLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc3ItY3lybC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3NyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc3MuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9zdi1maS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3N2LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc3cuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90YS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3RlLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdGV0LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdGcuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90aC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3RrLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdGwtcGguanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90bGguanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90ci5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3R6bC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3R6bS1sYXRuLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdHptLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdWctY24uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS91ay5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3VyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdXotbGF0bi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3V6LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdmkuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS94LXBzZXVkby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3lvLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvemgtY24uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS96aC1oay5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3poLXR3LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvemguanMnXG5cbi8vIEV4dGVuZCBkYXlqcyB3aXRoIHBsdWdpbnNcbmRheWpzLmV4dGVuZCh3ZWVrZGF5KVxuZGF5anMuZXh0ZW5kKHdlZWtPZlllYXIpXG5kYXlqcy5leHRlbmQoaXNTYW1lT3JBZnRlcilcbmRheWpzLmV4dGVuZChpc1NhbWVPckJlZm9yZSlcbmRheWpzLmV4dGVuZChpc0JldHdlZW4pXG5kYXlqcy5leHRlbmQobWluTWF4KVxuZGF5anMuZXh0ZW5kKHRpbWV6b25lKVxuZGF5anMuZXh0ZW5kKHV0YylcbmRheWpzLmV4dGVuZChsb2NhbGVEYXRhKVxuXG5leHBvcnQgZGVmYXVsdCBkYXlqc1xuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmNvbnN0IGFsZXJ0VmFyaWFudHMgPSBjdmEoXG4gICdyZWxhdGl2ZSB3LWZ1bGwgcm91bmRlZC1sZyBib3JkZXIgcHgtNCBweS0zIHRleHQtc20gZ3JpZCBoYXMtWz5zdmddOmdyaWQtY29scy1bY2FsYyh2YXIoLS1zcGFjaW5nKSo0KV8xZnJdIGdyaWQtY29scy1bMF8xZnJdIGhhcy1bPnN2Z106Z2FwLXgtMyBnYXAteS0wLjUgaXRlbXMtc3RhcnQgWyY+c3ZnXTpzaXplLTQgWyY+c3ZnXTp0cmFuc2xhdGUteS0wLjUgWyY+c3ZnXTp0ZXh0LWN1cnJlbnQnLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6IHtcbiAgICAgICAgZGVmYXVsdDogJ2JnLWNhcmQgdGV4dC1jYXJkLWZvcmVncm91bmQnLFxuICAgICAgICBkZXN0cnVjdGl2ZTpcbiAgICAgICAgICAndGV4dC1kZXN0cnVjdGl2ZSBiZy1jYXJkIFsmPnN2Z106dGV4dC1jdXJyZW50ICo6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC1kZXN0cnVjdGl2ZS85MCcsXG4gICAgICAgIHByaW1hcnk6XG4gICAgICAgICAgJ2JnLWJsdWUtNTAgZGFyazpiZy1ibHVlLTk1MC8yMCBib3JkZXItYmx1ZS0yMDAgZGFyazpib3JkZXItYmx1ZS04MDAgdGV4dC1ibHVlLTkwMCBkYXJrOnRleHQtYmx1ZS0xMDAgWyY+c3ZnXTp0ZXh0LWJsdWUtNjAwIGRhcms6WyY+c3ZnXTp0ZXh0LWJsdWUtNDAwICo6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC1ibHVlLTgwMCBkYXJrOio6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC1ibHVlLTIwMCcsXG4gICAgICAgIHNlY29uZGFyeTpcbiAgICAgICAgICAnYmctZ3JheS01MCBkYXJrOmJnLWdyYXktOTUwLzIwIGJvcmRlci1ncmF5LTIwMCBkYXJrOmJvcmRlci1ncmF5LTgwMCB0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC1ncmF5LTEwMCBbJj5zdmddOnRleHQtZ3JheS02MDAgZGFyazpbJj5zdmddOnRleHQtZ3JheS00MDAgKjpkYXRhLVtzbG90PWFsZXJ0LWRlc2NyaXB0aW9uXTp0ZXh0LWdyYXktODAwIGRhcms6KjpkYXRhLVtzbG90PWFsZXJ0LWRlc2NyaXB0aW9uXTp0ZXh0LWdyYXktMjAwJyxcbiAgICAgICAgc3VjY2VzczpcbiAgICAgICAgICAnYmctZ3JlZW4tNTAgZGFyazpiZy1ncmVlbi05NTAvMjAgYm9yZGVyLWdyZWVuLTIwMCBkYXJrOmJvcmRlci1ncmVlbi04MDAgdGV4dC1ncmVlbi05MDAgZGFyazp0ZXh0LWdyZWVuLTEwMCBbJj5zdmddOnRleHQtZ3JlZW4tNjAwIGRhcms6WyY+c3ZnXTp0ZXh0LWdyZWVuLTQwMCAqOmRhdGEtW3Nsb3Q9YWxlcnQtZGVzY3JpcHRpb25dOnRleHQtZ3JlZW4tODAwIGRhcms6KjpkYXRhLVtzbG90PWFsZXJ0LWRlc2NyaXB0aW9uXTp0ZXh0LWdyZWVuLTIwMCcsXG4gICAgICAgIHdhcm5pbmc6XG4gICAgICAgICAgJ2JnLXllbGxvdy01MCBkYXJrOmJnLXllbGxvdy05NTAvMjAgYm9yZGVyLXllbGxvdy0yMDAgZGFyazpib3JkZXIteWVsbG93LTgwMCB0ZXh0LXllbGxvdy05MDAgZGFyazp0ZXh0LXllbGxvdy0xMDAgWyY+c3ZnXTp0ZXh0LXllbGxvdy02MDAgZGFyazpbJj5zdmddOnRleHQteWVsbG93LTQwMCAqOmRhdGEtW3Nsb3Q9YWxlcnQtZGVzY3JpcHRpb25dOnRleHQteWVsbG93LTgwMCBkYXJrOio6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC15ZWxsb3ctMjAwJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZhdWx0VmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6ICdkZWZhdWx0JyxcbiAgICB9LFxuICB9XG4pXG5cbmZ1bmN0aW9uIEFsZXJ0KHtcbiAgY2xhc3NOYW1lLFxuICB2YXJpYW50LFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2Rpdic+ICYgVmFyaWFudFByb3BzPHR5cGVvZiBhbGVydFZhcmlhbnRzPikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtc2xvdD1cImFsZXJ0XCJcbiAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICBjbGFzc05hbWU9e2NuKGFsZXJ0VmFyaWFudHMoeyB2YXJpYW50IH0pLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gQWxlcnRUaXRsZSh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2Rpdic+KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS1zbG90PVwiYWxlcnQtdGl0bGVcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2NvbC1zdGFydC0yIGxpbmUtY2xhbXAtMSBtaW4taC00IGZvbnQtbWVkaXVtIHRyYWNraW5nLXRpZ2h0JyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gQWxlcnREZXNjcmlwdGlvbih7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdkaXYnPikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtc2xvdD1cImFsZXJ0LWRlc2NyaXB0aW9uXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICd0ZXh0LW11dGVkLWZvcmVncm91bmQgY29sLXN0YXJ0LTIgZ3JpZCBqdXN0aWZ5LWl0ZW1zLXN0YXJ0IGdhcC0xIHRleHQtc20gWyZfcF06bGVhZGluZy1yZWxheGVkJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHsgQWxlcnQsIEFsZXJ0VGl0bGUsIEFsZXJ0RGVzY3JpcHRpb24gfVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFNsb3QgfSBmcm9tICdAcmFkaXgtdWkvcmVhY3Qtc2xvdCdcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmNvbnN0IGJhZGdlVmFyaWFudHMgPSBjdmEoXG4gICdpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1tZCBib3JkZXIgcHgtMiBweS0wLjUgdGV4dC14cyBmb250LW1lZGl1bSB3LWZpdCB3aGl0ZXNwYWNlLW5vd3JhcCBzaHJpbmstMCBbJj5zdmddOnNpemUtMyBnYXAtMSBbJj5zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0gYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazphcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS80MCBhcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlIHRyYW5zaXRpb24tW2NvbG9yLGJveC1zaGFkb3ddIG92ZXJmbG93LWNsaXAnLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6IHtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAnYm9yZGVyLXRyYW5zcGFyZW50IGJnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgW2EmXTpob3ZlcjpiZy1wcmltYXJ5LzkwJyxcbiAgICAgICAgc2Vjb25kYXJ5OlxuICAgICAgICAgICdib3JkZXItdHJhbnNwYXJlbnQgYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQgW2EmXTpob3ZlcjpiZy1zZWNvbmRhcnkvOTAnLFxuICAgICAgICBkZXN0cnVjdGl2ZTpcbiAgICAgICAgICAnYm9yZGVyLXRyYW5zcGFyZW50IGJnLWRlc3RydWN0aXZlIHRleHQtd2hpdGUgW2EmXTpob3ZlcjpiZy1kZXN0cnVjdGl2ZS85MCBmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazpmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvNDAgZGFyazpiZy1kZXN0cnVjdGl2ZS82MCcsXG4gICAgICAgIG91dGxpbmU6XG4gICAgICAgICAgJ3RleHQtZm9yZWdyb3VuZCBbYSZdOmhvdmVyOmJnLWFjY2VudCBbYSZdOmhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgdmFyaWFudDogJ2RlZmF1bHQnLFxuICAgIH0sXG4gIH1cbilcblxuZnVuY3Rpb24gQmFkZ2Uoe1xuICBjbGFzc05hbWUsXG4gIHZhcmlhbnQsXG4gIGFzQ2hpbGQgPSBmYWxzZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdzcGFuJz4gJlxuICBWYXJpYW50UHJvcHM8dHlwZW9mIGJhZGdlVmFyaWFudHM+ICYgeyBhc0NoaWxkPzogYm9vbGVhbiB9KSB7XG4gIGNvbnN0IENvbXAgPSBhc0NoaWxkID8gU2xvdCA6ICdzcGFuJ1xuXG4gIHJldHVybiAoXG4gICAgPENvbXBcbiAgICAgIGRhdGEtc2xvdD1cImJhZGdlXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oYmFkZ2VWYXJpYW50cyh7IHZhcmlhbnQgfSksIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBCYWRnZSwgYmFkZ2VWYXJpYW50cyB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gJ0ByYWRpeC11aS9yZWFjdC1zbG90J1xuaW1wb3J0IHsgY3ZhLCB0eXBlIFZhcmlhbnRQcm9wcyB9IGZyb20gJ2NsYXNzLXZhcmlhbmNlLWF1dGhvcml0eSdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuY29uc3QgYnV0dG9uVmFyaWFudHMgPSBjdmEoXG4gIFwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0yIHdoaXRlc3BhY2Utbm93cmFwIHJvdW5kZWQtbWQgdGV4dC1zbSBmb250LW1lZGl1bSB0cmFuc2l0aW9uLWFsbCBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAgWyZfc3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lIFsmX3N2Zzpub3QoW2NsYXNzKj0nc2l6ZS0nXSldOnNpemUtNCBzaHJpbmstMCBbJl9zdmddOnNocmluay0wIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGZvY3VzLXZpc2libGU6cmluZy1bM3B4XSBhcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzQwIGFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmVcIixcbiAge1xuICAgIHZhcmlhbnRzOiB7XG4gICAgICB2YXJpYW50OiB7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgc2hhZG93LXhzIGhvdmVyOmJnLXByaW1hcnkvOTAnLFxuICAgICAgICBkZXN0cnVjdGl2ZTpcbiAgICAgICAgICAnYmctZGVzdHJ1Y3RpdmUgdGV4dC13aGl0ZSBzaGFkb3cteHMgaG92ZXI6YmctZGVzdHJ1Y3RpdmUvOTAgZm9jdXMtdmlzaWJsZTpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6Zm9jdXMtdmlzaWJsZTpyaW5nLWRlc3RydWN0aXZlLzQwIGRhcms6YmctZGVzdHJ1Y3RpdmUvNjAnLFxuICAgICAgICBvdXRsaW5lOlxuICAgICAgICAgICdib3JkZXIgYmctYmFja2dyb3VuZCBzaGFkb3cteHMgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQgZGFyazpiZy1pbnB1dC8zMCBkYXJrOmJvcmRlci1pbnB1dCBkYXJrOmhvdmVyOmJnLWlucHV0LzUwJyxcbiAgICAgICAgc2Vjb25kYXJ5OlxuICAgICAgICAgICdiZy1zZWNvbmRhcnkgdGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZCBzaGFkb3cteHMgaG92ZXI6Ymctc2Vjb25kYXJ5LzgwJyxcbiAgICAgICAgZ2hvc3Q6XG4gICAgICAgICAgJ2hvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGRhcms6aG92ZXI6YmctYWNjZW50LzUwJyxcbiAgICAgICAgbGluazogJ3RleHQtcHJpbWFyeSB1bmRlcmxpbmUtb2Zmc2V0LTQgaG92ZXI6dW5kZXJsaW5lJyxcbiAgICAgIH0sXG4gICAgICBzaXplOiB7XG4gICAgICAgIGRlZmF1bHQ6ICdoLTkgcHgtNCBweS0yIGhhcy1bPnN2Z106cHgtMycsXG4gICAgICAgIHNtOiAnaC04IHJvdW5kZWQtbWQgZ2FwLTEuNSBweC0zIGhhcy1bPnN2Z106cHgtMi41JyxcbiAgICAgICAgbGc6ICdoLTEwIHJvdW5kZWQtbWQgcHgtNiBoYXMtWz5zdmddOnB4LTQnLFxuICAgICAgICBpY29uOiAnc2l6ZS05JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZhdWx0VmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6ICdkZWZhdWx0JyxcbiAgICAgIHNpemU6ICdkZWZhdWx0JyxcbiAgICB9LFxuICB9XG4pXG5cbmZ1bmN0aW9uIEJ1dHRvbih7XG4gIGNsYXNzTmFtZSxcbiAgdmFyaWFudCxcbiAgc2l6ZSxcbiAgYXNDaGlsZCA9IGZhbHNlLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2J1dHRvbic+ICZcbiAgVmFyaWFudFByb3BzPHR5cGVvZiBidXR0b25WYXJpYW50cz4gJiB7XG4gICAgYXNDaGlsZD86IGJvb2xlYW5cbiAgfSkge1xuICBjb25zdCBDb21wID0gYXNDaGlsZCA/IFNsb3QgOiAnYnV0dG9uJ1xuXG4gIHJldHVybiAoXG4gICAgPENvbXBcbiAgICAgIGRhdGEtc2xvdD1cImJ1dHRvblwiXG4gICAgICBjbGFzc05hbWU9e2NuKGJ1dHRvblZhcmlhbnRzKHsgdmFyaWFudCwgc2l6ZSwgY2xhc3NOYW1lIH0pKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmV4cG9ydCB7IEJ1dHRvbiwgYnV0dG9uVmFyaWFudHMgfVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IENoZXZyb25MZWZ0LCBDaGV2cm9uUmlnaHQgfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5pbXBvcnQgeyBEYXlQaWNrZXIgfSBmcm9tICdyZWFjdC1kYXktcGlja2VyJ1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgYnV0dG9uVmFyaWFudHMgfSBmcm9tICdAL2NvbXBvbmVudHMvdWkvYnV0dG9uJ1xuXG5mdW5jdGlvbiBDYWxlbmRhcih7XG4gIGNsYXNzTmFtZSxcbiAgY2xhc3NOYW1lcyxcbiAgc2hvd091dHNpZGVEYXlzID0gdHJ1ZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEYXlQaWNrZXI+KSB7XG4gIHJldHVybiAoXG4gICAgPERheVBpY2tlclxuICAgICAgc2hvd091dHNpZGVEYXlzPXtzaG93T3V0c2lkZURheXN9XG4gICAgICBjbGFzc05hbWU9e2NuKCdwLTMnLCBjbGFzc05hbWUpfVxuICAgICAgY2xhc3NOYW1lcz17e1xuICAgICAgICBtb250aHM6ICdmbGV4IGZsZXgtY29sIHNtOmZsZXgtcm93IGdhcC0yJyxcbiAgICAgICAgbW9udGg6ICdmbGV4IGZsZXgtY29sIGdhcC00JyxcbiAgICAgICAgY2FwdGlvbjogJ2ZsZXgganVzdGlmeS1jZW50ZXIgcHQtMSByZWxhdGl2ZSBpdGVtcy1jZW50ZXIgdy1mdWxsJyxcbiAgICAgICAgY2FwdGlvbl9sYWJlbDogJ3RleHQtc20gZm9udC1tZWRpdW0nLFxuICAgICAgICBuYXY6ICdmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMScsXG4gICAgICAgIG5hdl9idXR0b246IGNuKFxuICAgICAgICAgIGJ1dHRvblZhcmlhbnRzKHsgdmFyaWFudDogJ291dGxpbmUnIH0pLFxuICAgICAgICAgICdzaXplLTcgYmctdHJhbnNwYXJlbnQgcC0wIG9wYWNpdHktNTAgaG92ZXI6b3BhY2l0eS0xMDAnXG4gICAgICAgICksXG4gICAgICAgIG5hdl9idXR0b25fcHJldmlvdXM6ICdhYnNvbHV0ZSBsZWZ0LTEnLFxuICAgICAgICBuYXZfYnV0dG9uX25leHQ6ICdhYnNvbHV0ZSByaWdodC0xJyxcbiAgICAgICAgdGFibGU6ICd3LWZ1bGwgYm9yZGVyLWNvbGxhcHNlIHNwYWNlLXgtMScsXG4gICAgICAgIGhlYWRfcm93OiAnZmxleCcsXG4gICAgICAgIGhlYWRfY2VsbDpcbiAgICAgICAgICAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHJvdW5kZWQtbWQgdy04IGZvbnQtbm9ybWFsIHRleHQtWzAuOHJlbV0nLFxuICAgICAgICByb3c6ICdmbGV4IHctZnVsbCBtdC0yJyxcbiAgICAgICAgY2VsbDogY24oXG4gICAgICAgICAgJ3JlbGF0aXZlIHAtMCB0ZXh0LWNlbnRlciB0ZXh0LXNtIGZvY3VzLXdpdGhpbjpyZWxhdGl2ZSBmb2N1cy13aXRoaW46ei0yMCBbJjpoYXMoW2FyaWEtc2VsZWN0ZWRdKV06YmctYWNjZW50IFsmOmhhcyhbYXJpYS1zZWxlY3RlZF0uZGF5LXJhbmdlLWVuZCldOnJvdW5kZWQtci1tZCcsXG4gICAgICAgICAgcHJvcHMubW9kZSA9PT0gJ3JhbmdlJ1xuICAgICAgICAgICAgPyAnWyY6aGFzKD4uZGF5LXJhbmdlLWVuZCldOnJvdW5kZWQtci1tZCBbJjpoYXMoPi5kYXktcmFuZ2Utc3RhcnQpXTpyb3VuZGVkLWwtbWQgZmlyc3Q6WyY6aGFzKFthcmlhLXNlbGVjdGVkXSldOnJvdW5kZWQtbC1tZCBsYXN0OlsmOmhhcyhbYXJpYS1zZWxlY3RlZF0pXTpyb3VuZGVkLXItbWQnXG4gICAgICAgICAgICA6ICdbJjpoYXMoW2FyaWEtc2VsZWN0ZWRdKV06cm91bmRlZC1tZCdcbiAgICAgICAgKSxcbiAgICAgICAgZGF5OiBjbihcbiAgICAgICAgICBidXR0b25WYXJpYW50cyh7IHZhcmlhbnQ6ICdnaG9zdCcgfSksXG4gICAgICAgICAgJ3NpemUtOCBwLTAgZm9udC1ub3JtYWwgYXJpYS1zZWxlY3RlZDpvcGFjaXR5LTEwMCdcbiAgICAgICAgKSxcbiAgICAgICAgZGF5X3JhbmdlX3N0YXJ0OlxuICAgICAgICAgICdkYXktcmFuZ2Utc3RhcnQgYXJpYS1zZWxlY3RlZDpiZy1wcmltYXJ5IGFyaWEtc2VsZWN0ZWQ6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQnLFxuICAgICAgICBkYXlfcmFuZ2VfZW5kOlxuICAgICAgICAgICdkYXktcmFuZ2UtZW5kIGFyaWEtc2VsZWN0ZWQ6YmctcHJpbWFyeSBhcmlhLXNlbGVjdGVkOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJyxcbiAgICAgICAgZGF5X3NlbGVjdGVkOlxuICAgICAgICAgICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGhvdmVyOmJnLXByaW1hcnkgaG92ZXI6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQgZm9jdXM6YmctcHJpbWFyeSBmb2N1czp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCcsXG4gICAgICAgIGRheV90b2RheTogJ2JnLWFjY2VudCB0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJyxcbiAgICAgICAgZGF5X291dHNpZGU6XG4gICAgICAgICAgJ2RheS1vdXRzaWRlIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBhcmlhLXNlbGVjdGVkOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCcsXG4gICAgICAgIGRheV9kaXNhYmxlZDogJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCBvcGFjaXR5LTUwJyxcbiAgICAgICAgZGF5X3JhbmdlX21pZGRsZTpcbiAgICAgICAgICAnYXJpYS1zZWxlY3RlZDpiZy1hY2NlbnQgYXJpYS1zZWxlY3RlZDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJyxcbiAgICAgICAgZGF5X2hpZGRlbjogJ2ludmlzaWJsZScsXG4gICAgICAgIC4uLmNsYXNzTmFtZXMsXG4gICAgICB9fVxuICAgICAgY29tcG9uZW50cz17e1xuICAgICAgICBJY29uTGVmdDogKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9KSA9PiAoXG4gICAgICAgICAgPENoZXZyb25MZWZ0IGNsYXNzTmFtZT17Y24oJ3NpemUtNCcsIGNsYXNzTmFtZSl9IHsuLi5wcm9wc30gLz5cbiAgICAgICAgKSxcbiAgICAgICAgSWNvblJpZ2h0OiAoeyBjbGFzc05hbWUsIC4uLnByb3BzIH0pID0+IChcbiAgICAgICAgICA8Q2hldnJvblJpZ2h0IGNsYXNzTmFtZT17Y24oJ3NpemUtNCcsIGNsYXNzTmFtZSl9IHsuLi5wcm9wc30gLz5cbiAgICAgICAgKSxcbiAgICAgIH19XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBDYWxlbmRhciB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgQ2hlY2tib3hQcmltaXRpdmUgZnJvbSAnQHJhZGl4LXVpL3JlYWN0LWNoZWNrYm94J1xuaW1wb3J0IHsgQ2hlY2tJY29uIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBDaGVja2JveCh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBDaGVja2JveFByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gKFxuICAgIDxDaGVja2JveFByaW1pdGl2ZS5Sb290XG4gICAgICBkYXRhLXNsb3Q9XCJjaGVja2JveFwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncGVlciBib3JkZXItaW5wdXQgZGFyazpiZy1pbnB1dC8zMCBkYXRhLVtzdGF0ZT1jaGVja2VkXTpiZy1wcmltYXJ5IGRhdGEtW3N0YXRlPWNoZWNrZWRdOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGRhcms6ZGF0YS1bc3RhdGU9Y2hlY2tlZF06YmctcHJpbWFyeSBkYXRhLVtzdGF0ZT1jaGVja2VkXTpib3JkZXItcHJpbWFyeSBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6YXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvNDAgYXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZSBzaXplLTQgc2hyaW5rLTAgcm91bmRlZC1bNHB4XSBib3JkZXIgc2hhZG93LXhzIHRyYW5zaXRpb24tc2hhZG93IG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0gZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgPlxuICAgICAgPENoZWNrYm94UHJpbWl0aXZlLkluZGljYXRvclxuICAgICAgICBkYXRhLXNsb3Q9XCJjaGVja2JveC1pbmRpY2F0b3JcIlxuICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LWN1cnJlbnQgdHJhbnNpdGlvbi1ub25lXCJcbiAgICAgID5cbiAgICAgICAgPENoZWNrSWNvbiBjbGFzc05hbWU9XCJzaXplLTMuNVwiIC8+XG4gICAgICA8L0NoZWNrYm94UHJpbWl0aXZlLkluZGljYXRvcj5cbiAgICA8L0NoZWNrYm94UHJpbWl0aXZlLlJvb3Q+XG4gIClcbn1cblxuZXhwb3J0IHsgQ2hlY2tib3ggfVxuIiwKICAgICJpbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgQ2FsZW5kYXIgYXMgQ2FsZW5kYXJJY29uIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJ0AvY29tcG9uZW50cy91aS9idXR0b24nXG5pbXBvcnQgeyBDYWxlbmRhciB9IGZyb20gJ0AvY29tcG9uZW50cy91aS9jYWxlbmRhcidcbmltcG9ydCB7XG4gIFBvcG92ZXIsXG4gIFBvcG92ZXJDb250ZW50LFxuICBQb3BvdmVyVHJpZ2dlcixcbn0gZnJvbSAnQC9jb21wb25lbnRzL3VpL3BvcG92ZXInXG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFBvcG92ZXJDbG9zZSB9IGZyb20gJ0ByYWRpeC11aS9yZWFjdC1wb3BvdmVyJ1xuXG5pbnRlcmZhY2UgRGF0ZVBpY2tlclByb3BzIHtcbiAgZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZFxuICBzZXREYXRlOiAoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICBsYWJlbD86IHN0cmluZ1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgY2xvc2VPblNlbGVjdD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIERhdGVQaWNrZXIoe1xuICBkYXRlLFxuICBjbG9zZU9uU2VsZWN0LFxuICBzZXREYXRlLFxuICBsYWJlbCA9ICdQaWNrIGEgZGF0ZScsXG4gIGNsYXNzTmFtZSxcbn06IERhdGVQaWNrZXJQcm9wcykge1xuICBjb25zdCBwb3BPdmVyUmVmID0gdXNlUmVmPEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbD4obnVsbClcblxuICBjb25zdCBvblNlbGVjdCA9IChkYXRlOiBEYXRlIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgc2V0RGF0ZShkYXRlKVxuICAgIGlmIChjbG9zZU9uU2VsZWN0KSB7XG4gICAgICBwb3BPdmVyUmVmLmN1cnJlbnQ/LmNsaWNrKClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAgPFBvcG92ZXI+XG4gICAgICAgIDxQb3BvdmVyVHJpZ2dlciBhc0NoaWxkPlxuICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICd3LWZ1bGwganVzdGlmeS1zdGFydCB0ZXh0LWxlZnQgZm9udC1ub3JtYWwnLFxuICAgICAgICAgICAgICAhZGF0ZSAmJiAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kJ1xuICAgICAgICAgICAgKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Q2FsZW5kYXJJY29uIGNsYXNzTmFtZT1cIm1yLTIgaC00IHctNFwiIC8+XG4gICAgICAgICAgICB7ZGF0ZSA/IGRheWpzKGRhdGUpLmZvcm1hdCgnTU1NIEQsIFlZWVknKSA6IDxzcGFuPntsYWJlbH08L3NwYW4+fVxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L1BvcG92ZXJUcmlnZ2VyPlxuICAgICAgICA8UG9wb3ZlckNvbnRlbnQgY2xhc3NOYW1lPVwidy1hdXRvIHAtMFwiIGFsaWduPVwic3RhcnRcIj5cbiAgICAgICAgICA8UG9wb3ZlckNsb3NlIHJlZj17cG9wT3ZlclJlZn0gLz5cbiAgICAgICAgICA8Q2FsZW5kYXJcbiAgICAgICAgICAgIG1vZGU9XCJzaW5nbGVcIlxuICAgICAgICAgICAgc2VsZWN0ZWQ9e2RhdGV9XG4gICAgICAgICAgICBvblNlbGVjdD17b25TZWxlY3R9XG4gICAgICAgICAgICBpbml0aWFsRm9jdXNcbiAgICAgICAgICAvPlxuICAgICAgICA8L1BvcG92ZXJDb250ZW50PlxuICAgICAgPC9Qb3BvdmVyPlxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgUG9wb3ZlclByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtcG9wb3ZlcidcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gUG9wb3Zlcih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgUG9wb3ZlclByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gPFBvcG92ZXJQcmltaXRpdmUuUm9vdCBkYXRhLXNsb3Q9XCJwb3BvdmVyXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBQb3BvdmVyVHJpZ2dlcih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgUG9wb3ZlclByaW1pdGl2ZS5UcmlnZ2VyPikge1xuICByZXR1cm4gPFBvcG92ZXJQcmltaXRpdmUuVHJpZ2dlciBkYXRhLXNsb3Q9XCJwb3BvdmVyLXRyaWdnZXJcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIFBvcG92ZXJDb250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBhbGlnbiA9ICdjZW50ZXInLFxuICBzaWRlT2Zmc2V0ID0gNCxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBQb3BvdmVyUHJpbWl0aXZlLkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPFBvcG92ZXJQcmltaXRpdmUuUG9ydGFsPlxuICAgICAgPFBvcG92ZXJQcmltaXRpdmUuQ29udGVudFxuICAgICAgICBkYXRhLXNsb3Q9XCJwb3BvdmVyLWNvbnRlbnRcIlxuICAgICAgICBhbGlnbj17YWxpZ259XG4gICAgICAgIHNpZGVPZmZzZXQ9e3NpZGVPZmZzZXR9XG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2JnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQgZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZGF0YS1bc3RhdGU9Y2xvc2VkXTp6b29tLW91dC05NSBkYXRhLVtzdGF0ZT1vcGVuXTp6b29tLWluLTk1IGRhdGEtW3NpZGU9Ym90dG9tXTpzbGlkZS1pbi1mcm9tLXRvcC0yIGRhdGEtW3NpZGU9bGVmdF06c2xpZGUtaW4tZnJvbS1yaWdodC0yIGRhdGEtW3NpZGU9cmlnaHRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGRhdGEtW3NpZGU9dG9wXTpzbGlkZS1pbi1mcm9tLWJvdHRvbS0yIHotNTAgdy03MiBvcmlnaW4tKC0tcmFkaXgtcG9wb3Zlci1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4pIHJvdW5kZWQtbWQgYm9yZGVyIHAtNCBzaGFkb3ctbWQgb3V0bGluZS1oaWRkZW4nLFxuICAgICAgICAgIGNsYXNzTmFtZVxuICAgICAgICApfVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAvPlxuICAgIDwvUG9wb3ZlclByaW1pdGl2ZS5Qb3J0YWw+XG4gIClcbn1cblxuZnVuY3Rpb24gUG9wb3ZlckFuY2hvcih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgUG9wb3ZlclByaW1pdGl2ZS5BbmNob3I+KSB7XG4gIHJldHVybiA8UG9wb3ZlclByaW1pdGl2ZS5BbmNob3IgZGF0YS1zbG90PVwicG9wb3Zlci1hbmNob3JcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmV4cG9ydCB7IFBvcG92ZXIsIFBvcG92ZXJUcmlnZ2VyLCBQb3BvdmVyQ29udGVudCwgUG9wb3ZlckFuY2hvciB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgRGlhbG9nUHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1kaWFsb2cnXG5pbXBvcnQgeyBYSWNvbiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gRGlhbG9nKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEaWFsb2dQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIDxEaWFsb2dQcmltaXRpdmUuUm9vdCBkYXRhLXNsb3Q9XCJkaWFsb2dcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIERpYWxvZ1RyaWdnZXIoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERpYWxvZ1ByaW1pdGl2ZS5UcmlnZ2VyPikge1xuICByZXR1cm4gPERpYWxvZ1ByaW1pdGl2ZS5UcmlnZ2VyIGRhdGEtc2xvdD1cImRpYWxvZy10cmlnZ2VyXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBEaWFsb2dQb3J0YWwoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERpYWxvZ1ByaW1pdGl2ZS5Qb3J0YWw+KSB7XG4gIHJldHVybiA8RGlhbG9nUHJpbWl0aXZlLlBvcnRhbCBkYXRhLXNsb3Q9XCJkaWFsb2ctcG9ydGFsXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBEaWFsb2dDbG9zZSh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGlhbG9nUHJpbWl0aXZlLkNsb3NlPikge1xuICByZXR1cm4gPERpYWxvZ1ByaW1pdGl2ZS5DbG9zZSBkYXRhLXNsb3Q9XCJkaWFsb2ctY2xvc2VcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIERpYWxvZ092ZXJsYXkoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGlhbG9nUHJpbWl0aXZlLk92ZXJsYXk+KSB7XG4gIHJldHVybiAoXG4gICAgPERpYWxvZ1ByaW1pdGl2ZS5PdmVybGF5XG4gICAgICBkYXRhLXNsb3Q9XCJkaWFsb2ctb3ZlcmxheVwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZml4ZWQgaW5zZXQtMCB6LTUwIGJnLWJsYWNrLzUwJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRGlhbG9nQ29udGVudCh7XG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGlhbG9nUHJpbWl0aXZlLkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPERpYWxvZ1BvcnRhbCBkYXRhLXNsb3Q9XCJkaWFsb2ctcG9ydGFsXCI+XG4gICAgICA8RGlhbG9nT3ZlcmxheSAvPlxuICAgICAgPERpYWxvZ1ByaW1pdGl2ZS5Db250ZW50XG4gICAgICAgIGRhdGEtc2xvdD1cImRpYWxvZy1jb250ZW50XCJcbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAnYmctYmFja2dyb3VuZCBkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWluIGRhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1vdXQgZGF0YS1bc3RhdGU9Y2xvc2VkXTpmYWRlLW91dC0wIGRhdGEtW3N0YXRlPW9wZW5dOmZhZGUtaW4tMCBkYXRhLVtzdGF0ZT1jbG9zZWRdOnpvb20tb3V0LTk1IGRhdGEtW3N0YXRlPW9wZW5dOnpvb20taW4tOTUgZml4ZWQgdG9wLVs1MCVdIGxlZnQtWzUwJV0gei01MCBncmlkIHctZnVsbCBtYXgtdy1bY2FsYygxMDAlLTJyZW0pXSB0cmFuc2xhdGUteC1bLTUwJV0gdHJhbnNsYXRlLXktWy01MCVdIGdhcC00IHJvdW5kZWQtbGcgYm9yZGVyIHAtNiBzaGFkb3ctbGcgZHVyYXRpb24tMjAwIHNtOm1heC13LWxnJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgPlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDxEaWFsb2dQcmltaXRpdmUuQ2xvc2UgY2xhc3NOYW1lPVwicmluZy1vZmZzZXQtYmFja2dyb3VuZCBmb2N1czpyaW5nLXJpbmcgZGF0YS1bc3RhdGU9b3Blbl06YmctYWNjZW50IGRhdGEtW3N0YXRlPW9wZW5dOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBhYnNvbHV0ZSB0b3AtNCByaWdodC00IHJvdW5kZWQteHMgb3BhY2l0eS03MCB0cmFuc2l0aW9uLW9wYWNpdHkgaG92ZXI6b3BhY2l0eS0xMDAgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctb2Zmc2V0LTIgZm9jdXM6b3V0bGluZS1oaWRkZW4gZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIj5cbiAgICAgICAgICA8WEljb24gLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XG4gICAgICAgIDwvRGlhbG9nUHJpbWl0aXZlLkNsb3NlPlxuICAgICAgPC9EaWFsb2dQcmltaXRpdmUuQ29udGVudD5cbiAgICA8L0RpYWxvZ1BvcnRhbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBEaWFsb2dIZWFkZXIoeyBjbGFzc05hbWUsIC4uLnByb3BzIH06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdkaXYnPikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtc2xvdD1cImRpYWxvZy1oZWFkZXJcIlxuICAgICAgY2xhc3NOYW1lPXtjbignZmxleCBmbGV4LWNvbCBnYXAtMiB0ZXh0LWNlbnRlciBzbTp0ZXh0LWxlZnQnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRGlhbG9nRm9vdGVyKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczwnZGl2Jz4pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXNsb3Q9XCJkaWFsb2ctZm9vdGVyXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdmbGV4IGZsZXgtY29sLXJldmVyc2UgZ2FwLTIgc206ZmxleC1yb3cgc206anVzdGlmeS1lbmQnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBEaWFsb2dUaXRsZSh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEaWFsb2dQcmltaXRpdmUuVGl0bGU+KSB7XG4gIHJldHVybiAoXG4gICAgPERpYWxvZ1ByaW1pdGl2ZS5UaXRsZVxuICAgICAgZGF0YS1zbG90PVwiZGlhbG9nLXRpdGxlXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ3RleHQtbGcgbGVhZGluZy1ub25lIGZvbnQtc2VtaWJvbGQnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRGlhbG9nRGVzY3JpcHRpb24oe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGlhbG9nUHJpbWl0aXZlLkRlc2NyaXB0aW9uPikge1xuICByZXR1cm4gKFxuICAgIDxEaWFsb2dQcmltaXRpdmUuRGVzY3JpcHRpb25cbiAgICAgIGRhdGEtc2xvdD1cImRpYWxvZy1kZXNjcmlwdGlvblwiXG4gICAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LW11dGVkLWZvcmVncm91bmQgdGV4dC1zbScsIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQge1xuICBEaWFsb2csXG4gIERpYWxvZ0Nsb3NlLFxuICBEaWFsb2dDb250ZW50LFxuICBEaWFsb2dEZXNjcmlwdGlvbixcbiAgRGlhbG9nRm9vdGVyLFxuICBEaWFsb2dIZWFkZXIsXG4gIERpYWxvZ092ZXJsYXksXG4gIERpYWxvZ1BvcnRhbCxcbiAgRGlhbG9nVGl0bGUsXG4gIERpYWxvZ1RyaWdnZXIsXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgRHJvcGRvd25NZW51UHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1kcm9wZG93bi1tZW51J1xuaW1wb3J0IHsgQ2hlY2tJY29uLCBDaGV2cm9uUmlnaHRJY29uLCBDaXJjbGVJY29uIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnUoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERyb3Bkb3duTWVudVByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gPERyb3Bkb3duTWVudVByaW1pdGl2ZS5Sb290IGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnVcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVBvcnRhbCh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlBvcnRhbD4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlBvcnRhbCBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXBvcnRhbFwiIHsuLi5wcm9wc30gLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVUcmlnZ2VyKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuVHJpZ2dlcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlRyaWdnZXJcbiAgICAgIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtdHJpZ2dlclwiXG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVDb250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBzaWRlT2Zmc2V0ID0gNCxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuQ29udGVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlBvcnRhbD5cbiAgICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuQ29udGVudFxuICAgICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LWNvbnRlbnRcIlxuICAgICAgICBzaWRlT2Zmc2V0PXtzaWRlT2Zmc2V0fVxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdiZy1wb3BvdmVyIHRleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGRhdGEtW3N0YXRlPWNsb3NlZF06em9vbS1vdXQtOTUgZGF0YS1bc3RhdGU9b3Blbl06em9vbS1pbi05NSBkYXRhLVtzaWRlPWJvdHRvbV06c2xpZGUtaW4tZnJvbS10b3AtMiBkYXRhLVtzaWRlPWxlZnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPXJpZ2h0XTpzbGlkZS1pbi1mcm9tLWxlZnQtMiBkYXRhLVtzaWRlPXRvcF06c2xpZGUtaW4tZnJvbS1ib3R0b20tMiB6LTUwIG1heC1oLSgtLXJhZGl4LWRyb3Bkb3duLW1lbnUtY29udGVudC1hdmFpbGFibGUtaGVpZ2h0KSBtaW4tdy1bOHJlbV0gb3JpZ2luLSgtLXJhZGl4LWRyb3Bkb3duLW1lbnUtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luKSBvdmVyZmxvdy14LWhpZGRlbiBvdmVyZmxvdy15LWF1dG8gcm91bmRlZC1tZCBib3JkZXIgcC0xIHNoYWRvdy1tZCcsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgIC8+XG4gICAgPC9Ecm9wZG93bk1lbnVQcmltaXRpdmUuUG9ydGFsPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudUdyb3VwKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuR3JvdXA+KSB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5Hcm91cCBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LWdyb3VwXCIgey4uLnByb3BzfSAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudUl0ZW0oe1xuICBjbGFzc05hbWUsXG4gIGluc2V0LFxuICB2YXJpYW50ID0gJ2RlZmF1bHQnLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERyb3Bkb3duTWVudVByaW1pdGl2ZS5JdGVtPiAmIHtcbiAgaW5zZXQ/OiBib29sZWFuXG4gIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAnZGVzdHJ1Y3RpdmUnXG59KSB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5JdGVtXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LWl0ZW1cIlxuICAgICAgZGF0YS1pbnNldD17aW5zZXR9XG4gICAgICBkYXRhLXZhcmlhbnQ9e3ZhcmlhbnR9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICBcImZvY3VzOmJnLWFjY2VudCBmb2N1czp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGRhdGEtW3ZhcmlhbnQ9ZGVzdHJ1Y3RpdmVdOnRleHQtZGVzdHJ1Y3RpdmUgZGF0YS1bdmFyaWFudD1kZXN0cnVjdGl2ZV06Zm9jdXM6YmctZGVzdHJ1Y3RpdmUvMTAgZGFyazpkYXRhLVt2YXJpYW50PWRlc3RydWN0aXZlXTpmb2N1czpiZy1kZXN0cnVjdGl2ZS8yMCBkYXRhLVt2YXJpYW50PWRlc3RydWN0aXZlXTpmb2N1czp0ZXh0LWRlc3RydWN0aXZlIGRhdGEtW3ZhcmlhbnQ9ZGVzdHJ1Y3RpdmVdOio6W3N2Z106IXRleHQtZGVzdHJ1Y3RpdmUgWyZfc3ZnOm5vdChbY2xhc3MqPSd0ZXh0LSddKV06dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHJlbGF0aXZlIGZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtc20gcHgtMiBweS0xLjUgdGV4dC1zbSBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCBkYXRhLVtpbnNldF06cGwtOCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIixcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRHJvcGRvd25NZW51Q2hlY2tib3hJdGVtKHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgY2hlY2tlZCxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuQ2hlY2tib3hJdGVtPikge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuQ2hlY2tib3hJdGVtXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LWNoZWNrYm94LWl0ZW1cIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgXCJmb2N1czpiZy1hY2NlbnQgZm9jdXM6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCByZWxhdGl2ZSBmbGV4IGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLXNtIHB5LTEuNSBwci0yIHBsLTggdGV4dC1zbSBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIixcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgY2hlY2tlZD17Y2hlY2tlZH1cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIGxlZnQtMiBmbGV4IHNpemUtMy41IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLkl0ZW1JbmRpY2F0b3I+XG4gICAgICAgICAgPENoZWNrSWNvbiBjbGFzc05hbWU9XCJzaXplLTRcIiAvPlxuICAgICAgICA8L0Ryb3Bkb3duTWVudVByaW1pdGl2ZS5JdGVtSW5kaWNhdG9yPlxuICAgICAgPC9zcGFuPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvRHJvcGRvd25NZW51UHJpbWl0aXZlLkNoZWNrYm94SXRlbT5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVSYWRpb0dyb3VwKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuUmFkaW9Hcm91cD4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlJhZGlvR3JvdXBcbiAgICAgIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtcmFkaW8tZ3JvdXBcIlxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRHJvcGRvd25NZW51UmFkaW9JdGVtKHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuUmFkaW9JdGVtPikge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuUmFkaW9JdGVtXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXJhZGlvLWl0ZW1cIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgXCJmb2N1czpiZy1hY2NlbnQgZm9jdXM6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCByZWxhdGl2ZSBmbGV4IGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLXNtIHB5LTEuNSBwci0yIHBsLTggdGV4dC1zbSBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIixcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgbGVmdC0yIGZsZXggc2l6ZS0zLjUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuSXRlbUluZGljYXRvcj5cbiAgICAgICAgICA8Q2lyY2xlSWNvbiBjbGFzc05hbWU9XCJzaXplLTIgZmlsbC1jdXJyZW50XCIgLz5cbiAgICAgICAgPC9Ecm9wZG93bk1lbnVQcmltaXRpdmUuSXRlbUluZGljYXRvcj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0Ryb3Bkb3duTWVudVByaW1pdGl2ZS5SYWRpb0l0ZW0+XG4gIClcbn1cblxuZnVuY3Rpb24gRHJvcGRvd25NZW51TGFiZWwoe1xuICBjbGFzc05hbWUsXG4gIGluc2V0LFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERyb3Bkb3duTWVudVByaW1pdGl2ZS5MYWJlbD4gJiB7XG4gIGluc2V0PzogYm9vbGVhblxufSkge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuTGFiZWxcbiAgICAgIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtbGFiZWxcIlxuICAgICAgZGF0YS1pbnNldD17aW5zZXR9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncHgtMiBweS0xLjUgdGV4dC1zbSBmb250LW1lZGl1bSBkYXRhLVtpbnNldF06cGwtOCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVNlcGFyYXRvcih7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuU2VwYXJhdG9yPikge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuU2VwYXJhdG9yXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXNlcGFyYXRvclwiXG4gICAgICBjbGFzc05hbWU9e2NuKCdiZy1ib3JkZXIgLW14LTEgbXktMSBoLXB4JywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVNob3J0Y3V0KHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J3NwYW4nPikge1xuICByZXR1cm4gKFxuICAgIDxzcGFuXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXNob3J0Y3V0XCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICd0ZXh0LW11dGVkLWZvcmVncm91bmQgbWwtYXV0byB0ZXh0LXhzIHRyYWNraW5nLXdpZGVzdCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVN1Yih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlN1Yj4pIHtcbiAgcmV0dXJuIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuU3ViIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtc3ViXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVTdWJUcmlnZ2VyKHtcbiAgY2xhc3NOYW1lLFxuICBpbnNldCxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlN1YlRyaWdnZXI+ICYge1xuICBpbnNldD86IGJvb2xlYW5cbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlN1YlRyaWdnZXJcbiAgICAgIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtc3ViLXRyaWdnZXJcIlxuICAgICAgZGF0YS1pbnNldD17aW5zZXR9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZm9jdXM6YmctYWNjZW50IGZvY3VzOnRleHQtYWNjZW50LWZvcmVncm91bmQgZGF0YS1bc3RhdGU9b3Blbl06YmctYWNjZW50IGRhdGEtW3N0YXRlPW9wZW5dOnRleHQtYWNjZW50LWZvcmVncm91bmQgZmxleCBjdXJzb3ItZGVmYXVsdCBpdGVtcy1jZW50ZXIgcm91bmRlZC1zbSBweC0yIHB5LTEuNSB0ZXh0LXNtIG91dGxpbmUtaGlkZGVuIHNlbGVjdC1ub25lIGRhdGEtW2luc2V0XTpwbC04JyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDxDaGV2cm9uUmlnaHRJY29uIGNsYXNzTmFtZT1cIm1sLWF1dG8gc2l6ZS00XCIgLz5cbiAgICA8L0Ryb3Bkb3duTWVudVByaW1pdGl2ZS5TdWJUcmlnZ2VyPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVN1YkNvbnRlbnQoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlN1YkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5TdWJDb250ZW50XG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXN1Yi1jb250ZW50XCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdiZy1wb3BvdmVyIHRleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGRhdGEtW3N0YXRlPWNsb3NlZF06em9vbS1vdXQtOTUgZGF0YS1bc3RhdGU9b3Blbl06em9vbS1pbi05NSBkYXRhLVtzaWRlPWJvdHRvbV06c2xpZGUtaW4tZnJvbS10b3AtMiBkYXRhLVtzaWRlPWxlZnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPXJpZ2h0XTpzbGlkZS1pbi1mcm9tLWxlZnQtMiBkYXRhLVtzaWRlPXRvcF06c2xpZGUtaW4tZnJvbS1ib3R0b20tMiB6LTUwIG1pbi13LVs4cmVtXSBvcmlnaW4tKC0tcmFkaXgtZHJvcGRvd24tbWVudS1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4pIG92ZXJmbG93LWNsaXAgcm91bmRlZC1tZCBib3JkZXIgcC0xIHNoYWRvdy1sZycsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmV4cG9ydCB7XG4gIERyb3Bkb3duTWVudSxcbiAgRHJvcGRvd25NZW51UG9ydGFsLFxuICBEcm9wZG93bk1lbnVUcmlnZ2VyLFxuICBEcm9wZG93bk1lbnVDb250ZW50LFxuICBEcm9wZG93bk1lbnVHcm91cCxcbiAgRHJvcGRvd25NZW51TGFiZWwsXG4gIERyb3Bkb3duTWVudUl0ZW0sXG4gIERyb3Bkb3duTWVudUNoZWNrYm94SXRlbSxcbiAgRHJvcGRvd25NZW51UmFkaW9Hcm91cCxcbiAgRHJvcGRvd25NZW51UmFkaW9JdGVtLFxuICBEcm9wZG93bk1lbnVTZXBhcmF0b3IsXG4gIERyb3Bkb3duTWVudVNob3J0Y3V0LFxuICBEcm9wZG93bk1lbnVTdWIsXG4gIERyb3Bkb3duTWVudVN1YlRyaWdnZXIsXG4gIERyb3Bkb3duTWVudVN1YkNvbnRlbnQsXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHR5cGUgKiBhcyBMYWJlbFByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtbGFiZWwnXG5pbXBvcnQgeyBTbG90IH0gZnJvbSAnQHJhZGl4LXVpL3JlYWN0LXNsb3QnXG5pbXBvcnQge1xuICBDb250cm9sbGVyLFxuICBGb3JtUHJvdmlkZXIsXG4gIHVzZUZvcm1Db250ZXh0LFxuICB1c2VGb3JtU3RhdGUsXG4gIHR5cGUgQ29udHJvbGxlclByb3BzLFxuICB0eXBlIEZpZWxkUGF0aCxcbiAgdHlwZSBGaWVsZFZhbHVlcyxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJ1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgTGFiZWwgfSBmcm9tICdAL2NvbXBvbmVudHMvdWkvbGFiZWwnXG5cbmNvbnN0IEZvcm0gPSBGb3JtUHJvdmlkZXJcblxudHlwZSBGb3JtRmllbGRDb250ZXh0VmFsdWU8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4gPSB7XG4gIG5hbWU6IFROYW1lXG59XG5cbmNvbnN0IEZvcm1GaWVsZENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0PEZvcm1GaWVsZENvbnRleHRWYWx1ZT4oXG4gIHt9IGFzIEZvcm1GaWVsZENvbnRleHRWYWx1ZVxuKVxuXG5jb25zdCBGb3JtRmllbGQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICAuLi5wcm9wc1xufTogQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEZvcm1GaWVsZENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3sgbmFtZTogcHJvcHMubmFtZSB9fT5cbiAgICAgIDxDb250cm9sbGVyIHsuLi5wcm9wc30gLz5cbiAgICA8L0Zvcm1GaWVsZENvbnRleHQuUHJvdmlkZXI+XG4gIClcbn1cblxuY29uc3QgdXNlRm9ybUZpZWxkID0gKCkgPT4ge1xuICBjb25zdCBmaWVsZENvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEZvcm1GaWVsZENvbnRleHQpXG4gIGNvbnN0IGl0ZW1Db250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChGb3JtSXRlbUNvbnRleHQpXG4gIGNvbnN0IHsgZ2V0RmllbGRTdGF0ZSB9ID0gdXNlRm9ybUNvbnRleHQoKVxuICBjb25zdCBmb3JtU3RhdGUgPSB1c2VGb3JtU3RhdGUoeyBuYW1lOiBmaWVsZENvbnRleHQubmFtZSB9KVxuICBjb25zdCBmaWVsZFN0YXRlID0gZ2V0RmllbGRTdGF0ZShmaWVsZENvbnRleHQubmFtZSwgZm9ybVN0YXRlKVxuXG4gIGlmICghZmllbGRDb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VGb3JtRmllbGQgc2hvdWxkIGJlIHVzZWQgd2l0aGluIDxGb3JtRmllbGQ+JylcbiAgfVxuXG4gIGNvbnN0IHsgaWQgfSA9IGl0ZW1Db250ZXh0XG5cbiAgcmV0dXJuIHtcbiAgICBpZCxcbiAgICBuYW1lOiBmaWVsZENvbnRleHQubmFtZSxcbiAgICBmb3JtSXRlbUlkOiBgJHtpZH0tZm9ybS1pdGVtYCxcbiAgICBmb3JtRGVzY3JpcHRpb25JZDogYCR7aWR9LWZvcm0taXRlbS1kZXNjcmlwdGlvbmAsXG4gICAgZm9ybU1lc3NhZ2VJZDogYCR7aWR9LWZvcm0taXRlbS1tZXNzYWdlYCxcbiAgICAuLi5maWVsZFN0YXRlLFxuICB9XG59XG5cbnR5cGUgRm9ybUl0ZW1Db250ZXh0VmFsdWUgPSB7XG4gIGlkOiBzdHJpbmdcbn1cblxuY29uc3QgRm9ybUl0ZW1Db250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dDxGb3JtSXRlbUNvbnRleHRWYWx1ZT4oXG4gIHt9IGFzIEZvcm1JdGVtQ29udGV4dFZhbHVlXG4pXG5cbmZ1bmN0aW9uIEZvcm1JdGVtKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczwnZGl2Jz4pIHtcbiAgY29uc3QgaWQgPSBSZWFjdC51c2VJZCgpXG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUl0ZW1Db250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7IGlkIH19PlxuICAgICAgPGRpdlxuICAgICAgICBkYXRhLXNsb3Q9XCJmb3JtLWl0ZW1cIlxuICAgICAgICBjbGFzc05hbWU9e2NuKCdncmlkIGdhcC0yJywgY2xhc3NOYW1lKX1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgLz5cbiAgICA8L0Zvcm1JdGVtQ29udGV4dC5Qcm92aWRlcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBGb3JtTGFiZWwoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgTGFiZWxQcmltaXRpdmUuUm9vdD4pIHtcbiAgY29uc3QgeyBlcnJvciwgZm9ybUl0ZW1JZCB9ID0gdXNlRm9ybUZpZWxkKClcblxuICByZXR1cm4gKFxuICAgIDxMYWJlbFxuICAgICAgZGF0YS1zbG90PVwiZm9ybS1sYWJlbFwiXG4gICAgICBkYXRhLWVycm9yPXshIWVycm9yfVxuICAgICAgY2xhc3NOYW1lPXtjbignZGF0YS1bZXJyb3I9dHJ1ZV06dGV4dC1kZXN0cnVjdGl2ZScsIGNsYXNzTmFtZSl9XG4gICAgICBodG1sRm9yPXtmb3JtSXRlbUlkfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRm9ybUNvbnRyb2woeyAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2xvdD4pIHtcbiAgY29uc3QgeyBlcnJvciwgZm9ybUl0ZW1JZCwgZm9ybURlc2NyaXB0aW9uSWQsIGZvcm1NZXNzYWdlSWQgfSA9IHVzZUZvcm1GaWVsZCgpXG5cbiAgcmV0dXJuIChcbiAgICA8U2xvdFxuICAgICAgZGF0YS1zbG90PVwiZm9ybS1jb250cm9sXCJcbiAgICAgIGlkPXtmb3JtSXRlbUlkfVxuICAgICAgYXJpYS1kZXNjcmliZWRieT17XG4gICAgICAgICFlcnJvclxuICAgICAgICAgID8gYCR7Zm9ybURlc2NyaXB0aW9uSWR9YFxuICAgICAgICAgIDogYCR7Zm9ybURlc2NyaXB0aW9uSWR9ICR7Zm9ybU1lc3NhZ2VJZH1gXG4gICAgICB9XG4gICAgICBhcmlhLWludmFsaWQ9eyEhZXJyb3J9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBGb3JtRGVzY3JpcHRpb24oeyBjbGFzc05hbWUsIC4uLnByb3BzIH06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdwJz4pIHtcbiAgY29uc3QgeyBmb3JtRGVzY3JpcHRpb25JZCB9ID0gdXNlRm9ybUZpZWxkKClcblxuICByZXR1cm4gKFxuICAgIDxwXG4gICAgICBkYXRhLXNsb3Q9XCJmb3JtLWRlc2NyaXB0aW9uXCJcbiAgICAgIGlkPXtmb3JtRGVzY3JpcHRpb25JZH1cbiAgICAgIGNsYXNzTmFtZT17Y24oJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCB0ZXh0LXNtJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIEZvcm1NZXNzYWdlKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczwncCc+KSB7XG4gIGNvbnN0IHsgZXJyb3IsIGZvcm1NZXNzYWdlSWQgfSA9IHVzZUZvcm1GaWVsZCgpXG4gIGNvbnN0IGJvZHkgPSBlcnJvciA/IFN0cmluZyhlcnJvcj8ubWVzc2FnZSA/PyAnJykgOiBwcm9wcy5jaGlsZHJlblxuXG4gIGlmICghYm9keSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxwXG4gICAgICBkYXRhLXNsb3Q9XCJmb3JtLW1lc3NhZ2VcIlxuICAgICAgaWQ9e2Zvcm1NZXNzYWdlSWR9XG4gICAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LWRlc3RydWN0aXZlIHRleHQtc20nLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIHtib2R5fVxuICAgIDwvcD5cbiAgKVxufVxuXG5leHBvcnQge1xuICB1c2VGb3JtRmllbGQsXG4gIEZvcm0sXG4gIEZvcm1JdGVtLFxuICBGb3JtTGFiZWwsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtRGVzY3JpcHRpb24sXG4gIEZvcm1NZXNzYWdlLFxuICBGb3JtRmllbGQsXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdF9fZGVmYXVsdCBmcm9tICdyZWFjdCc7XG5cbnZhciBpc0NoZWNrQm94SW5wdXQgPSAoZWxlbWVudCkgPT4gZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnO1xuXG52YXIgaXNEYXRlT2JqZWN0ID0gKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG5cbnZhciBpc051bGxPclVuZGVmaW5lZCA9ICh2YWx1ZSkgPT4gdmFsdWUgPT0gbnVsbDtcblxuY29uc3QgaXNPYmplY3RUeXBlID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xudmFyIGlzT2JqZWN0ID0gKHZhbHVlKSA9PiAhaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpICYmXG4gICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgaXNPYmplY3RUeXBlKHZhbHVlKSAmJlxuICAgICFpc0RhdGVPYmplY3QodmFsdWUpO1xuXG52YXIgZ2V0RXZlbnRWYWx1ZSA9IChldmVudCkgPT4gaXNPYmplY3QoZXZlbnQpICYmIGV2ZW50LnRhcmdldFxuICAgID8gaXNDaGVja0JveElucHV0KGV2ZW50LnRhcmdldClcbiAgICAgICAgPyBldmVudC50YXJnZXQuY2hlY2tlZFxuICAgICAgICA6IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgIDogZXZlbnQ7XG5cbnZhciBnZXROb2RlUGFyZW50TmFtZSA9IChuYW1lKSA9PiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLnNlYXJjaCgvXFwuXFxkKyhcXC58JCkvKSkgfHwgbmFtZTtcblxudmFyIGlzTmFtZUluRmllbGRBcnJheSA9IChuYW1lcywgbmFtZSkgPT4gbmFtZXMuaGFzKGdldE5vZGVQYXJlbnROYW1lKG5hbWUpKTtcblxudmFyIGlzUGxhaW5PYmplY3QgPSAodGVtcE9iamVjdCkgPT4ge1xuICAgIGNvbnN0IHByb3RvdHlwZUNvcHkgPSB0ZW1wT2JqZWN0LmNvbnN0cnVjdG9yICYmIHRlbXBPYmplY3QuY29uc3RydWN0b3IucHJvdG90eXBlO1xuICAgIHJldHVybiAoaXNPYmplY3QocHJvdG90eXBlQ29weSkgJiYgcHJvdG90eXBlQ29weS5oYXNPd25Qcm9wZXJ0eSgnaXNQcm90b3R5cGVPZicpKTtcbn07XG5cbnZhciBpc1dlYiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIHdpbmRvdy5IVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuXG5mdW5jdGlvbiBjbG9uZU9iamVjdChkYXRhKSB7XG4gICAgbGV0IGNvcHk7XG4gICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoZGF0YSk7XG4gICAgY29uc3QgaXNGaWxlTGlzdEluc3RhbmNlID0gdHlwZW9mIEZpbGVMaXN0ICE9PSAndW5kZWZpbmVkJyA/IGRhdGEgaW5zdGFuY2VvZiBGaWxlTGlzdCA6IGZhbHNlO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBjb3B5ID0gbmV3IERhdGUoZGF0YSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCEoaXNXZWIgJiYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iIHx8IGlzRmlsZUxpc3RJbnN0YW5jZSkpICYmXG4gICAgICAgIChpc0FycmF5IHx8IGlzT2JqZWN0KGRhdGEpKSkge1xuICAgICAgICBjb3B5ID0gaXNBcnJheSA/IFtdIDoge307XG4gICAgICAgIGlmICghaXNBcnJheSAmJiAhaXNQbGFpbk9iamVjdChkYXRhKSkge1xuICAgICAgICAgICAgY29weSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb3B5W2tleV0gPSBjbG9uZU9iamVjdChkYXRhW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHJldHVybiBjb3B5O1xufVxuXG52YXIgaXNLZXkgPSAodmFsdWUpID0+IC9eXFx3KiQvLnRlc3QodmFsdWUpO1xuXG52YXIgaXNVbmRlZmluZWQgPSAodmFsKSA9PiB2YWwgPT09IHVuZGVmaW5lZDtcblxudmFyIGNvbXBhY3QgPSAodmFsdWUpID0+IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuZmlsdGVyKEJvb2xlYW4pIDogW107XG5cbnZhciBzdHJpbmdUb1BhdGggPSAoaW5wdXQpID0+IGNvbXBhY3QoaW5wdXQucmVwbGFjZSgvW1wifCddfFxcXS9nLCAnJykuc3BsaXQoL1xcLnxcXFsvKSk7XG5cbnZhciBnZXQgPSAob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgICBpZiAoIXBhdGggfHwgIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gKGlzS2V5KHBhdGgpID8gW3BhdGhdIDogc3RyaW5nVG9QYXRoKHBhdGgpKS5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiBpc051bGxPclVuZGVmaW5lZChyZXN1bHQpID8gcmVzdWx0IDogcmVzdWx0W2tleV0sIG9iamVjdCk7XG4gICAgcmV0dXJuIGlzVW5kZWZpbmVkKHJlc3VsdCkgfHwgcmVzdWx0ID09PSBvYmplY3RcbiAgICAgICAgPyBpc1VuZGVmaW5lZChvYmplY3RbcGF0aF0pXG4gICAgICAgICAgICA/IGRlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgOiBvYmplY3RbcGF0aF1cbiAgICAgICAgOiByZXN1bHQ7XG59O1xuXG52YXIgaXNCb29sZWFuID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcblxudmFyIHNldCA9IChvYmplY3QsIHBhdGgsIHZhbHVlKSA9PiB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgY29uc3QgdGVtcFBhdGggPSBpc0tleShwYXRoKSA/IFtwYXRoXSA6IHN0cmluZ1RvUGF0aChwYXRoKTtcbiAgICBjb25zdCBsZW5ndGggPSB0ZW1wUGF0aC5sZW5ndGg7XG4gICAgY29uc3QgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjb25zdCBrZXkgPSB0ZW1wUGF0aFtpbmRleF07XG4gICAgICAgIGxldCBuZXdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZiAoaW5kZXggIT09IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgY29uc3Qgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID1cbiAgICAgICAgICAgICAgICBpc09iamVjdChvYmpWYWx1ZSkgfHwgQXJyYXkuaXNBcnJheShvYmpWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgICAgICAgICAgICA6ICFpc05hTigrdGVtcFBhdGhbaW5kZXggKyAxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycgfHwga2V5ID09PSAnY29uc3RydWN0b3InIHx8IGtleSA9PT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3Rba2V5XSA9IG5ld1ZhbHVlO1xuICAgICAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgICB9XG59O1xuXG5jb25zdCBFVkVOVFMgPSB7XG4gICAgQkxVUjogJ2JsdXInLFxuICAgIEZPQ1VTX09VVDogJ2ZvY3Vzb3V0JyxcbiAgICBDSEFOR0U6ICdjaGFuZ2UnLFxufTtcbmNvbnN0IFZBTElEQVRJT05fTU9ERSA9IHtcbiAgICBvbkJsdXI6ICdvbkJsdXInLFxuICAgIG9uQ2hhbmdlOiAnb25DaGFuZ2UnLFxuICAgIG9uU3VibWl0OiAnb25TdWJtaXQnLFxuICAgIG9uVG91Y2hlZDogJ29uVG91Y2hlZCcsXG4gICAgYWxsOiAnYWxsJyxcbn07XG5jb25zdCBJTlBVVF9WQUxJREFUSU9OX1JVTEVTID0ge1xuICAgIG1heDogJ21heCcsXG4gICAgbWluOiAnbWluJyxcbiAgICBtYXhMZW5ndGg6ICdtYXhMZW5ndGgnLFxuICAgIG1pbkxlbmd0aDogJ21pbkxlbmd0aCcsXG4gICAgcGF0dGVybjogJ3BhdHRlcm4nLFxuICAgIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICAgIHZhbGlkYXRlOiAndmFsaWRhdGUnLFxufTtcblxuY29uc3QgSG9va0Zvcm1Db250ZXh0ID0gUmVhY3RfX2RlZmF1bHQuY3JlYXRlQ29udGV4dChudWxsKTtcbkhvb2tGb3JtQ29udGV4dC5kaXNwbGF5TmFtZSA9ICdIb29rRm9ybUNvbnRleHQnO1xuLyoqXG4gKiBUaGlzIGN1c3RvbSBob29rIGFsbG93cyB5b3UgdG8gYWNjZXNzIHRoZSBmb3JtIGNvbnRleHQuIHVzZUZvcm1Db250ZXh0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gZGVlcGx5IG5lc3RlZCBzdHJ1Y3R1cmVzLCB3aGVyZSBpdCB3b3VsZCBiZWNvbWUgaW5jb252ZW5pZW50IHRvIHBhc3MgdGhlIGNvbnRleHQgYXMgYSBwcm9wLiBUbyBiZSB1c2VkIHdpdGgge0BsaW5rIEZvcm1Qcm92aWRlcn0uXG4gKlxuICogQHJlbWFya3NcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZWZvcm1jb250ZXh0KSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9yZWFjdC1ob29rLWZvcm0tdjctZm9ybS1jb250ZXh0LXl0dWRpKVxuICpcbiAqIEByZXR1cm5zIHJldHVybiBhbGwgdXNlRm9ybSBtZXRob2RzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCBtZXRob2RzID0gdXNlRm9ybSgpO1xuICogICBjb25zdCBvblN1Ym1pdCA9IGRhdGEgPT4gY29uc29sZS5sb2coZGF0YSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxGb3JtUHJvdmlkZXIgey4uLm1ldGhvZHN9ID5cbiAqICAgICAgIDxmb3JtIG9uU3VibWl0PXttZXRob2RzLmhhbmRsZVN1Ym1pdChvblN1Ym1pdCl9PlxuICogICAgICAgICA8TmVzdGVkSW5wdXQgLz5cbiAqICAgICAgICAgPGlucHV0IHR5cGU9XCJzdWJtaXRcIiAvPlxuICogICAgICAgPC9mb3JtPlxuICogICAgIDwvRm9ybVByb3ZpZGVyPlxuICogICApO1xuICogfVxuICpcbiAqICBmdW5jdGlvbiBOZXN0ZWRJbnB1dCgpIHtcbiAqICAgY29uc3QgeyByZWdpc3RlciB9ID0gdXNlRm9ybUNvbnRleHQoKTsgLy8gcmV0cmlldmUgYWxsIGhvb2sgbWV0aG9kc1xuICogICByZXR1cm4gPGlucHV0IHsuLi5yZWdpc3RlcihcInRlc3RcIil9IC8+O1xuICogfVxuICogYGBgXG4gKi9cbmNvbnN0IHVzZUZvcm1Db250ZXh0ID0gKCkgPT4gUmVhY3RfX2RlZmF1bHQudXNlQ29udGV4dChIb29rRm9ybUNvbnRleHQpO1xuLyoqXG4gKiBBIHByb3ZpZGVyIGNvbXBvbmVudCB0aGF0IHByb3BhZ2F0ZXMgdGhlIGB1c2VGb3JtYCBtZXRob2RzIHRvIGFsbCBjaGlsZHJlbiBjb21wb25lbnRzIHZpYSBbUmVhY3QgQ29udGV4dF0oaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2NvbnRleHQuaHRtbCkgQVBJLiBUbyBiZSB1c2VkIHdpdGgge0BsaW5rIHVzZUZvcm1Db250ZXh0fS5cbiAqXG4gKiBAcmVtYXJrc1xuICogW0FQSV0oaHR0cHM6Ly9yZWFjdC1ob29rLWZvcm0uY29tL2RvY3MvdXNlZm9ybWNvbnRleHQpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3JlYWN0LWhvb2stZm9ybS12Ny1mb3JtLWNvbnRleHQteXR1ZGkpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gYWxsIHVzZUZvcm0gbWV0aG9kc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFwcCgpIHtcbiAqICAgY29uc3QgbWV0aG9kcyA9IHVzZUZvcm0oKTtcbiAqICAgY29uc3Qgb25TdWJtaXQgPSBkYXRhID0+IGNvbnNvbGUubG9nKGRhdGEpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8Rm9ybVByb3ZpZGVyIHsuLi5tZXRob2RzfSA+XG4gKiAgICAgICA8Zm9ybSBvblN1Ym1pdD17bWV0aG9kcy5oYW5kbGVTdWJtaXQob25TdWJtaXQpfT5cbiAqICAgICAgICAgPE5lc3RlZElucHV0IC8+XG4gKiAgICAgICAgIDxpbnB1dCB0eXBlPVwic3VibWl0XCIgLz5cbiAqICAgICAgIDwvZm9ybT5cbiAqICAgICA8L0Zvcm1Qcm92aWRlcj5cbiAqICAgKTtcbiAqIH1cbiAqXG4gKiAgZnVuY3Rpb24gTmVzdGVkSW5wdXQoKSB7XG4gKiAgIGNvbnN0IHsgcmVnaXN0ZXIgfSA9IHVzZUZvcm1Db250ZXh0KCk7IC8vIHJldHJpZXZlIGFsbCBob29rIG1ldGhvZHNcbiAqICAgcmV0dXJuIDxpbnB1dCB7Li4ucmVnaXN0ZXIoXCJ0ZXN0XCIpfSAvPjtcbiAqIH1cbiAqIGBgYFxuICovXG5jb25zdCBGb3JtUHJvdmlkZXIgPSAocHJvcHMpID0+IHtcbiAgICBjb25zdCB7IGNoaWxkcmVuLCAuLi5kYXRhIH0gPSBwcm9wcztcbiAgICByZXR1cm4gKFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSG9va0Zvcm1Db250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBkYXRhIH0sIGNoaWxkcmVuKSk7XG59O1xuXG52YXIgZ2V0UHJveHlGb3JtU3RhdGUgPSAoZm9ybVN0YXRlLCBjb250cm9sLCBsb2NhbFByb3h5Rm9ybVN0YXRlLCBpc1Jvb3QgPSB0cnVlKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBkZWZhdWx0VmFsdWVzOiBjb250cm9sLl9kZWZhdWx0VmFsdWVzLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybVN0YXRlKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIGtleSwge1xuICAgICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2tleSA9IGtleTtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5fcHJveHlGb3JtU3RhdGVbX2tleV0gIT09IFZBTElEQVRJT05fTU9ERS5hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5fcHJveHlGb3JtU3RhdGVbX2tleV0gPSAhaXNSb290IHx8IFZBTElEQVRJT05fTU9ERS5hbGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvY2FsUHJveHlGb3JtU3RhdGUgJiYgKGxvY2FsUHJveHlGb3JtU3RhdGVbX2tleV0gPSB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybVN0YXRlW19rZXldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7XG5cbi8qKlxuICogVGhpcyBjdXN0b20gaG9vayBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSB0byBlYWNoIGZvcm0gc3RhdGUsIGFuZCBpc29sYXRlIHRoZSByZS1yZW5kZXIgYXQgdGhlIGN1c3RvbSBob29rIGxldmVsLiBJdCBoYXMgaXRzIHNjb3BlIGluIHRlcm1zIG9mIGZvcm0gc3RhdGUgc3Vic2NyaXB0aW9uLCBzbyBpdCB3b3VsZCBub3QgYWZmZWN0IG90aGVyIHVzZUZvcm1TdGF0ZSBhbmQgdXNlRm9ybS4gVXNpbmcgdGhpcyBob29rIGNhbiByZWR1Y2UgdGhlIHJlLXJlbmRlciBpbXBhY3Qgb24gbGFyZ2UgYW5kIGNvbXBsZXggZm9ybSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcmVtYXJrc1xuICogW0FQSV0oaHR0cHM6Ly9yZWFjdC1ob29rLWZvcm0uY29tL2RvY3MvdXNlZm9ybXN0YXRlKSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy91c2Vmb3Jtc3RhdGUtNzV4bHkpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gaW5jbHVkZSBvcHRpb25zIG9uIHNwZWNpZnkgZmllbGRzIHRvIHN1YnNjcmliZS4ge0BsaW5rIFVzZUZvcm1TdGF0ZVJldHVybn1cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBBcHAoKSB7XG4gKiAgIGNvbnN0IHsgcmVnaXN0ZXIsIGhhbmRsZVN1Ym1pdCwgY29udHJvbCB9ID0gdXNlRm9ybSh7XG4gKiAgICAgZGVmYXVsdFZhbHVlczoge1xuICogICAgIGZpcnN0TmFtZTogXCJmaXJzdE5hbWVcIlxuICogICB9fSk7XG4gKiAgIGNvbnN0IHsgZGlydHlGaWVsZHMgfSA9IHVzZUZvcm1TdGF0ZSh7XG4gKiAgICAgY29udHJvbFxuICogICB9KTtcbiAqICAgY29uc3Qgb25TdWJtaXQgPSAoZGF0YSkgPT4gY29uc29sZS5sb2coZGF0YSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVTdWJtaXQob25TdWJtaXQpfT5cbiAqICAgICAgIDxpbnB1dCB7Li4ucmVnaXN0ZXIoXCJmaXJzdE5hbWVcIil9IHBsYWNlaG9sZGVyPVwiRmlyc3QgTmFtZVwiIC8+XG4gKiAgICAgICB7ZGlydHlGaWVsZHMuZmlyc3ROYW1lICYmIDxwPkZpZWxkIGlzIGRpcnR5LjwvcD59XG4gKiAgICAgICA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIC8+XG4gKiAgICAgPC9mb3JtPlxuICogICApO1xuICogfVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHVzZUZvcm1TdGF0ZShwcm9wcykge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIGNvbnN0IHsgY29udHJvbCA9IG1ldGhvZHMuY29udHJvbCwgZGlzYWJsZWQsIG5hbWUsIGV4YWN0IH0gPSBwcm9wcyB8fCB7fTtcbiAgICBjb25zdCBbZm9ybVN0YXRlLCB1cGRhdGVGb3JtU3RhdGVdID0gUmVhY3RfX2RlZmF1bHQudXNlU3RhdGUoY29udHJvbC5fZm9ybVN0YXRlKTtcbiAgICBjb25zdCBfbG9jYWxQcm94eUZvcm1TdGF0ZSA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZih7XG4gICAgICAgIGlzRGlydHk6IGZhbHNlLFxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBkaXJ0eUZpZWxkczogZmFsc2UsXG4gICAgICAgIHRvdWNoZWRGaWVsZHM6IGZhbHNlLFxuICAgICAgICB2YWxpZGF0aW5nRmllbGRzOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZGF0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yczogZmFsc2UsXG4gICAgfSk7XG4gICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiBjb250cm9sLl9zdWJzY3JpYmUoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBmb3JtU3RhdGU6IF9sb2NhbFByb3h5Rm9ybVN0YXRlLmN1cnJlbnQsXG4gICAgICAgIGV4YWN0LFxuICAgICAgICBjYWxsYmFjazogKGZvcm1TdGF0ZSkgPT4ge1xuICAgICAgICAgICAgIWRpc2FibGVkICYmXG4gICAgICAgICAgICAgICAgdXBkYXRlRm9ybVN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29udHJvbC5fZm9ybVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAuLi5mb3JtU3RhdGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfSksIFtuYW1lLCBkaXNhYmxlZCwgZXhhY3RdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBfbG9jYWxQcm94eUZvcm1TdGF0ZS5jdXJyZW50LmlzVmFsaWQgJiYgY29udHJvbC5fc2V0VmFsaWQodHJ1ZSk7XG4gICAgfSwgW2NvbnRyb2xdKTtcbiAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQudXNlTWVtbygoKSA9PiBnZXRQcm94eUZvcm1TdGF0ZShmb3JtU3RhdGUsIGNvbnRyb2wsIF9sb2NhbFByb3h5Rm9ybVN0YXRlLmN1cnJlbnQsIGZhbHNlKSwgW2Zvcm1TdGF0ZSwgY29udHJvbF0pO1xufVxuXG52YXIgaXNTdHJpbmcgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG5cbnZhciBnZW5lcmF0ZVdhdGNoT3V0cHV0ID0gKG5hbWVzLCBfbmFtZXMsIGZvcm1WYWx1ZXMsIGlzR2xvYmFsLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgICBpZiAoaXNTdHJpbmcobmFtZXMpKSB7XG4gICAgICAgIGlzR2xvYmFsICYmIF9uYW1lcy53YXRjaC5hZGQobmFtZXMpO1xuICAgICAgICByZXR1cm4gZ2V0KGZvcm1WYWx1ZXMsIG5hbWVzLCBkZWZhdWx0VmFsdWUpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuYW1lcykpIHtcbiAgICAgICAgcmV0dXJuIG5hbWVzLm1hcCgoZmllbGROYW1lKSA9PiAoaXNHbG9iYWwgJiYgX25hbWVzLndhdGNoLmFkZChmaWVsZE5hbWUpLFxuICAgICAgICAgICAgZ2V0KGZvcm1WYWx1ZXMsIGZpZWxkTmFtZSkpKTtcbiAgICB9XG4gICAgaXNHbG9iYWwgJiYgKF9uYW1lcy53YXRjaEFsbCA9IHRydWUpO1xuICAgIHJldHVybiBmb3JtVmFsdWVzO1xufTtcblxuLyoqXG4gKiBDdXN0b20gaG9vayB0byBzdWJzY3JpYmUgdG8gZmllbGQgY2hhbmdlIGFuZCBpc29sYXRlIHJlLXJlbmRlcmluZyBhdCB0aGUgY29tcG9uZW50IGxldmVsLlxuICpcbiAqIEByZW1hcmtzXG4gKlxuICogW0FQSV0oaHR0cHM6Ly9yZWFjdC1ob29rLWZvcm0uY29tL2RvY3MvdXNld2F0Y2gpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3JlYWN0LWhvb2stZm9ybS12Ny10cy11c2V3YXRjaC1oOWk1ZSlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm0oKTtcbiAqIGNvbnN0IHZhbHVlcyA9IHVzZVdhdGNoKHtcbiAqICAgbmFtZTogXCJmaWVsZE5hbWVcIlxuICogICBjb250cm9sLFxuICogfSlcbiAqIGBgYFxuICovXG5mdW5jdGlvbiB1c2VXYXRjaChwcm9wcykge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIGNvbnN0IHsgY29udHJvbCA9IG1ldGhvZHMuY29udHJvbCwgbmFtZSwgZGVmYXVsdFZhbHVlLCBkaXNhYmxlZCwgZXhhY3QsIH0gPSBwcm9wcyB8fCB7fTtcbiAgICBjb25zdCBfZGVmYXVsdFZhbHVlID0gUmVhY3RfX2RlZmF1bHQudXNlUmVmKGRlZmF1bHRWYWx1ZSk7XG4gICAgY29uc3QgW3ZhbHVlLCB1cGRhdGVWYWx1ZV0gPSBSZWFjdF9fZGVmYXVsdC51c2VTdGF0ZShjb250cm9sLl9nZXRXYXRjaChuYW1lLCBfZGVmYXVsdFZhbHVlLmN1cnJlbnQpKTtcbiAgICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IGNvbnRyb2wuX3N1YnNjcmliZSh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGZvcm1TdGF0ZToge1xuICAgICAgICAgICAgdmFsdWVzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBleGFjdCxcbiAgICAgICAgY2FsbGJhY2s6IChmb3JtU3RhdGUpID0+ICFkaXNhYmxlZCAmJlxuICAgICAgICAgICAgdXBkYXRlVmFsdWUoZ2VuZXJhdGVXYXRjaE91dHB1dChuYW1lLCBjb250cm9sLl9uYW1lcywgZm9ybVN0YXRlLnZhbHVlcyB8fCBjb250cm9sLl9mb3JtVmFsdWVzLCBmYWxzZSwgX2RlZmF1bHRWYWx1ZS5jdXJyZW50KSksXG4gICAgfSksIFtuYW1lLCBjb250cm9sLCBkaXNhYmxlZCwgZXhhY3RdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4gY29udHJvbC5fcmVtb3ZlVW5tb3VudGVkKCkpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBDdXN0b20gaG9vayB0byB3b3JrIHdpdGggY29udHJvbGxlZCBjb21wb25lbnQsIHRoaXMgZnVuY3Rpb24gcHJvdmlkZSB5b3Ugd2l0aCBib3RoIGZvcm0gYW5kIGZpZWxkIGxldmVsIHN0YXRlLiBSZS1yZW5kZXIgaXMgaXNvbGF0ZWQgYXQgdGhlIGhvb2sgbGV2ZWwuXG4gKlxuICogQHJlbWFya3NcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZWNvbnRyb2xsZXIpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3VzZWNvbnRyb2xsZXItMG84cHgpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gdGhlIHBhdGggbmFtZSB0byB0aGUgZm9ybSBmaWVsZCB2YWx1ZSwgYW5kIHZhbGlkYXRpb24gcnVsZXMuXG4gKlxuICogQHJldHVybnMgZmllbGQgcHJvcGVydGllcywgZmllbGQgYW5kIGZvcm0gc3RhdGUuIHtAbGluayBVc2VDb250cm9sbGVyUmV0dXJufVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIElucHV0KHByb3BzKSB7XG4gKiAgIGNvbnN0IHsgZmllbGQsIGZpZWxkU3RhdGUsIGZvcm1TdGF0ZSB9ID0gdXNlQ29udHJvbGxlcihwcm9wcyk7XG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGRpdj5cbiAqICAgICAgIDxpbnB1dCB7Li4uZmllbGR9IHBsYWNlaG9sZGVyPXtwcm9wcy5uYW1lfSAvPlxuICogICAgICAgPHA+e2ZpZWxkU3RhdGUuaXNUb3VjaGVkICYmIFwiVG91Y2hlZFwifTwvcD5cbiAqICAgICAgIDxwPntmb3JtU3RhdGUuaXNTdWJtaXR0ZWQgPyBcInN1Ym1pdHRlZFwiIDogXCJcIn08L3A+XG4gKiAgICAgPC9kaXY+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gdXNlQ29udHJvbGxlcihwcm9wcykge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIGNvbnN0IHsgbmFtZSwgZGlzYWJsZWQsIGNvbnRyb2wgPSBtZXRob2RzLmNvbnRyb2wsIHNob3VsZFVucmVnaXN0ZXIgfSA9IHByb3BzO1xuICAgIGNvbnN0IGlzQXJyYXlGaWVsZCA9IGlzTmFtZUluRmllbGRBcnJheShjb250cm9sLl9uYW1lcy5hcnJheSwgbmFtZSk7XG4gICAgY29uc3QgdmFsdWUgPSB1c2VXYXRjaCh7XG4gICAgICAgIGNvbnRyb2wsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0KGNvbnRyb2wuX2Zvcm1WYWx1ZXMsIG5hbWUsIGdldChjb250cm9sLl9kZWZhdWx0VmFsdWVzLCBuYW1lLCBwcm9wcy5kZWZhdWx0VmFsdWUpKSxcbiAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgZm9ybVN0YXRlID0gdXNlRm9ybVN0YXRlKHtcbiAgICAgICAgY29udHJvbCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgX3Byb3BzID0gUmVhY3RfX2RlZmF1bHQudXNlUmVmKHByb3BzKTtcbiAgICBjb25zdCBfcmVnaXN0ZXJQcm9wcyA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZihjb250cm9sLnJlZ2lzdGVyKG5hbWUsIHtcbiAgICAgICAgLi4ucHJvcHMucnVsZXMsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICAuLi4oaXNCb29sZWFuKHByb3BzLmRpc2FibGVkKSA/IHsgZGlzYWJsZWQ6IHByb3BzLmRpc2FibGVkIH0gOiB7fSksXG4gICAgfSkpO1xuICAgIGNvbnN0IGZpZWxkU3RhdGUgPSBSZWFjdF9fZGVmYXVsdC51c2VNZW1vKCgpID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHt9LCB7XG4gICAgICAgIGludmFsaWQ6IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6ICgpID0+ICEhZ2V0KGZvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpLFxuICAgICAgICB9LFxuICAgICAgICBpc0RpcnR5OiB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiAhIWdldChmb3JtU3RhdGUuZGlydHlGaWVsZHMsIG5hbWUpLFxuICAgICAgICB9LFxuICAgICAgICBpc1RvdWNoZWQ6IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6ICgpID0+ICEhZ2V0KGZvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKSxcbiAgICAgICAgfSxcbiAgICAgICAgaXNWYWxpZGF0aW5nOiB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiAhIWdldChmb3JtU3RhdGUudmFsaWRhdGluZ0ZpZWxkcywgbmFtZSksXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiBnZXQoZm9ybVN0YXRlLmVycm9ycywgbmFtZSksXG4gICAgICAgIH0sXG4gICAgfSksIFtmb3JtU3RhdGUsIG5hbWVdKTtcbiAgICBjb25zdCBvbkNoYW5nZSA9IFJlYWN0X19kZWZhdWx0LnVzZUNhbGxiYWNrKChldmVudCkgPT4gX3JlZ2lzdGVyUHJvcHMuY3VycmVudC5vbkNoYW5nZSh7XG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgdmFsdWU6IGdldEV2ZW50VmFsdWUoZXZlbnQpLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogRVZFTlRTLkNIQU5HRSxcbiAgICB9KSwgW25hbWVdKTtcbiAgICBjb25zdCBvbkJsdXIgPSBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjaygoKSA9PiBfcmVnaXN0ZXJQcm9wcy5jdXJyZW50Lm9uQmx1cih7XG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgdmFsdWU6IGdldChjb250cm9sLl9mb3JtVmFsdWVzLCBuYW1lKSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IEVWRU5UUy5CTFVSLFxuICAgIH0pLCBbbmFtZSwgY29udHJvbC5fZm9ybVZhbHVlc10pO1xuICAgIGNvbnN0IHJlZiA9IFJlYWN0X19kZWZhdWx0LnVzZUNhbGxiYWNrKChlbG0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoY29udHJvbC5fZmllbGRzLCBuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkICYmIGVsbSkge1xuICAgICAgICAgICAgZmllbGQuX2YucmVmID0ge1xuICAgICAgICAgICAgICAgIGZvY3VzOiAoKSA9PiBlbG0uZm9jdXMgJiYgZWxtLmZvY3VzKCksXG4gICAgICAgICAgICAgICAgc2VsZWN0OiAoKSA9PiBlbG0uc2VsZWN0ICYmIGVsbS5zZWxlY3QoKSxcbiAgICAgICAgICAgICAgICBzZXRDdXN0b21WYWxpZGl0eTogKG1lc3NhZ2UpID0+IGVsbS5zZXRDdXN0b21WYWxpZGl0eShtZXNzYWdlKSxcbiAgICAgICAgICAgICAgICByZXBvcnRWYWxpZGl0eTogKCkgPT4gZWxtLnJlcG9ydFZhbGlkaXR5KCksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSwgW2NvbnRyb2wuX2ZpZWxkcywgbmFtZV0pO1xuICAgIGNvbnN0IGZpZWxkID0gUmVhY3RfX2RlZmF1bHQudXNlTWVtbygoKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgLi4uKGlzQm9vbGVhbihkaXNhYmxlZCkgfHwgZm9ybVN0YXRlLmRpc2FibGVkXG4gICAgICAgICAgICA/IHsgZGlzYWJsZWQ6IGZvcm1TdGF0ZS5kaXNhYmxlZCB8fCBkaXNhYmxlZCB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgb25DaGFuZ2UsXG4gICAgICAgIG9uQmx1cixcbiAgICAgICAgcmVmLFxuICAgIH0pLCBbbmFtZSwgZGlzYWJsZWQsIGZvcm1TdGF0ZS5kaXNhYmxlZCwgb25DaGFuZ2UsIG9uQmx1ciwgcmVmLCB2YWx1ZV0pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IF9zaG91bGRVbnJlZ2lzdGVyRmllbGQgPSBjb250cm9sLl9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXIgfHwgc2hvdWxkVW5yZWdpc3RlcjtcbiAgICAgICAgY29udHJvbC5yZWdpc3RlcihuYW1lLCB7XG4gICAgICAgICAgICAuLi5fcHJvcHMuY3VycmVudC5ydWxlcyxcbiAgICAgICAgICAgIC4uLihpc0Jvb2xlYW4oX3Byb3BzLmN1cnJlbnQuZGlzYWJsZWQpXG4gICAgICAgICAgICAgICAgPyB7IGRpc2FibGVkOiBfcHJvcHMuY3VycmVudC5kaXNhYmxlZCB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB1cGRhdGVNb3VudGVkID0gKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldChjb250cm9sLl9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLl9mKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuX2YubW91bnQgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdXBkYXRlTW91bnRlZChuYW1lLCB0cnVlKTtcbiAgICAgICAgaWYgKF9zaG91bGRVbnJlZ2lzdGVyRmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xvbmVPYmplY3QoZ2V0KGNvbnRyb2wuX29wdGlvbnMuZGVmYXVsdFZhbHVlcywgbmFtZSkpO1xuICAgICAgICAgICAgc2V0KGNvbnRyb2wuX2RlZmF1bHRWYWx1ZXMsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChnZXQoY29udHJvbC5fZm9ybVZhbHVlcywgbmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgc2V0KGNvbnRyb2wuX2Zvcm1WYWx1ZXMsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAhaXNBcnJheUZpZWxkICYmIGNvbnRyb2wucmVnaXN0ZXIobmFtZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAoaXNBcnJheUZpZWxkXG4gICAgICAgICAgICAgICAgPyBfc2hvdWxkVW5yZWdpc3RlckZpZWxkICYmICFjb250cm9sLl9zdGF0ZS5hY3Rpb25cbiAgICAgICAgICAgICAgICA6IF9zaG91bGRVbnJlZ2lzdGVyRmllbGQpXG4gICAgICAgICAgICAgICAgPyBjb250cm9sLnVucmVnaXN0ZXIobmFtZSlcbiAgICAgICAgICAgICAgICA6IHVwZGF0ZU1vdW50ZWQobmFtZSwgZmFsc2UpO1xuICAgICAgICB9O1xuICAgIH0sIFtuYW1lLCBjb250cm9sLCBpc0FycmF5RmllbGQsIHNob3VsZFVucmVnaXN0ZXJdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb250cm9sLl9zZXREaXNhYmxlZEZpZWxkKHtcbiAgICAgICAgICAgIGRpc2FibGVkLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgfSk7XG4gICAgfSwgW2Rpc2FibGVkLCBuYW1lLCBjb250cm9sXSk7XG4gICAgcmV0dXJuIFJlYWN0X19kZWZhdWx0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGZvcm1TdGF0ZSxcbiAgICAgICAgZmllbGRTdGF0ZSxcbiAgICB9KSwgW2ZpZWxkLCBmb3JtU3RhdGUsIGZpZWxkU3RhdGVdKTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgYmFzZWQgb24gYHVzZUNvbnRyb2xsZXJgIGhvb2sgdG8gd29yayB3aXRoIGNvbnRyb2xsZWQgY29tcG9uZW50LlxuICpcbiAqIEByZW1hcmtzXG4gKiBbQVBJXShodHRwczovL3JlYWN0LWhvb2stZm9ybS5jb20vZG9jcy91c2Vjb250cm9sbGVyL2NvbnRyb2xsZXIpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3JlYWN0LWhvb2stZm9ybS12Ni1jb250cm9sbGVyLXRzLWp3eXp3KSDigKIgW1ZpZGVvXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PU4yVU5rX1VDVnlBKVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIHRoZSBwYXRoIG5hbWUgdG8gdGhlIGZvcm0gZmllbGQgdmFsdWUsIGFuZCB2YWxpZGF0aW9uIHJ1bGVzLlxuICpcbiAqIEByZXR1cm5zIHByb3ZpZGUgZmllbGQgaGFuZGxlciBmdW5jdGlvbnMsIGZpZWxkIGFuZCBmb3JtIHN0YXRlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFwcCgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPEZvcm1WYWx1ZXM+KHtcbiAqICAgICBkZWZhdWx0VmFsdWVzOiB7XG4gKiAgICAgICB0ZXN0OiBcIlwiXG4gKiAgICAgfVxuICogICB9KTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGZvcm0+XG4gKiAgICAgICA8Q29udHJvbGxlclxuICogICAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgICBuYW1lPVwidGVzdFwiXG4gKiAgICAgICAgIHJlbmRlcj17KHsgZmllbGQ6IHsgb25DaGFuZ2UsIG9uQmx1ciwgdmFsdWUsIHJlZiB9LCBmb3JtU3RhdGUsIGZpZWxkU3RhdGUgfSkgPT4gKFxuICogICAgICAgICAgIDw+XG4gKiAgICAgICAgICAgICA8aW5wdXRcbiAqICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfSAvLyBzZW5kIHZhbHVlIHRvIGhvb2sgZm9ybVxuICogICAgICAgICAgICAgICBvbkJsdXI9e29uQmx1cn0gLy8gbm90aWZ5IHdoZW4gaW5wdXQgaXMgdG91Y2hlZFxuICogICAgICAgICAgICAgICB2YWx1ZT17dmFsdWV9IC8vIHJldHVybiB1cGRhdGVkIHZhbHVlXG4gKiAgICAgICAgICAgICAgIHJlZj17cmVmfSAvLyBzZXQgcmVmIGZvciBmb2N1cyBtYW5hZ2VtZW50XG4gKiAgICAgICAgICAgICAvPlxuICogICAgICAgICAgICAgPHA+e2Zvcm1TdGF0ZS5pc1N1Ym1pdHRlZCA/IFwic3VibWl0dGVkXCIgOiBcIlwifTwvcD5cbiAqICAgICAgICAgICAgIDxwPntmaWVsZFN0YXRlLmlzVG91Y2hlZCA/IFwidG91Y2hlZFwiIDogXCJcIn08L3A+XG4gKiAgICAgICAgICAgPC8+XG4gKiAgICAgICAgICl9XG4gKiAgICAgICAvPlxuICogICAgIDwvZm9ybT5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICovXG5jb25zdCBDb250cm9sbGVyID0gKHByb3BzKSA9PiBwcm9wcy5yZW5kZXIodXNlQ29udHJvbGxlcihwcm9wcykpO1xuXG5jb25zdCBmbGF0dGVuID0gKG9iaikgPT4ge1xuICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0VHlwZShvYmpba2V5XSkgJiYgb2JqW2tleV0gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IG5lc3RlZCA9IGZsYXR0ZW4ob2JqW2tleV0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuZXN0ZWRLZXkgb2YgT2JqZWN0LmtleXMobmVzdGVkKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dFtgJHtrZXl9LiR7bmVzdGVkS2V5fWBdID0gbmVzdGVkW25lc3RlZEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG59O1xuXG5jb25zdCBQT1NUX1JFUVVFU1QgPSAncG9zdCc7XG4vKipcbiAqIEZvcm0gY29tcG9uZW50IHRvIG1hbmFnZSBzdWJtaXNzaW9uLlxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIHRvIHNldHVwIHN1Ym1pc3Npb24gZGV0YWlsLiB7QGxpbmsgRm9ybVByb3BzfVxuICpcbiAqIEByZXR1cm5zIGZvcm0gY29tcG9uZW50IG9yIGhlYWRsZXNzIHJlbmRlciBwcm9wLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFwcCgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sLCBmb3JtU3RhdGU6IHsgZXJyb3JzIH0gfSA9IHVzZUZvcm0oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPEZvcm0gYWN0aW9uPVwiL2FwaVwiIGNvbnRyb2w9e2NvbnRyb2x9PlxuICogICAgICAgPGlucHV0IHsuLi5yZWdpc3RlcihcIm5hbWVcIil9IC8+XG4gKiAgICAgICA8cD57ZXJyb3JzPy5yb290Py5zZXJ2ZXIgJiYgJ1NlcnZlciBlcnJvcid9PC9wPlxuICogICAgICAgPGJ1dHRvbj5TdWJtaXQ8L2J1dHRvbj5cbiAqICAgICA8L0Zvcm0+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gRm9ybShwcm9wcykge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIGNvbnN0IFttb3VudGVkLCBzZXRNb3VudGVkXSA9IFJlYWN0X19kZWZhdWx0LnVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCB7IGNvbnRyb2wgPSBtZXRob2RzLmNvbnRyb2wsIG9uU3VibWl0LCBjaGlsZHJlbiwgYWN0aW9uLCBtZXRob2QgPSBQT1NUX1JFUVVFU1QsIGhlYWRlcnMsIGVuY1R5cGUsIG9uRXJyb3IsIHJlbmRlciwgb25TdWNjZXNzLCB2YWxpZGF0ZVN0YXR1cywgLi4ucmVzdCB9ID0gcHJvcHM7XG4gICAgY29uc3Qgc3VibWl0ID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgIGxldCBoYXNFcnJvciA9IGZhbHNlO1xuICAgICAgICBsZXQgdHlwZSA9ICcnO1xuICAgICAgICBhd2FpdCBjb250cm9sLmhhbmRsZVN1Ym1pdChhc3luYyAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGxldCBmb3JtRGF0YUpzb24gPSAnJztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9ybURhdGFKc29uID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoX2EpIHsgfVxuICAgICAgICAgICAgY29uc3QgZmxhdHRlbkZvcm1WYWx1ZXMgPSBmbGF0dGVuKGNvbnRyb2wuX2Zvcm1WYWx1ZXMpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmxhdHRlbkZvcm1WYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBmbGF0dGVuRm9ybVZhbHVlc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvblN1Ym1pdCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG9uU3VibWl0KHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhSnNvbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRTdHJpbmdpZnlTdWJtaXNzaW9uRGF0YSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgJiYgaGVhZGVyc1snQ29udGVudC1UeXBlJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNUeXBlLFxuICAgICAgICAgICAgICAgICAgICBdLnNvbWUoKHZhbHVlKSA9PiB2YWx1ZSAmJiB2YWx1ZS5pbmNsdWRlcygnanNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChTdHJpbmcoYWN0aW9uKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGVuY1R5cGUgPyB7ICdDb250ZW50LVR5cGUnOiBlbmNUeXBlIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogc2hvdWxkU3RyaW5naWZ5U3VibWlzc2lvbkRhdGEgPyBmb3JtRGF0YUpzb24gOiBmb3JtRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHZhbGlkYXRlU3RhdHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAhdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzcG9uc2Uuc3RhdHVzIDwgMjAwIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSAzMDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yICYmIG9uRXJyb3IoeyByZXNwb25zZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2VzcyAmJiBvblN1Y2Nlc3MoeyByZXNwb25zZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yICYmIG9uRXJyb3IoeyBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKGV2ZW50KTtcbiAgICAgICAgaWYgKGhhc0Vycm9yICYmIHByb3BzLmNvbnRyb2wpIHtcbiAgICAgICAgICAgIHByb3BzLmNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgIGlzU3VibWl0U3VjY2Vzc2Z1bDogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHByb3BzLmNvbnRyb2wuc2V0RXJyb3IoJ3Jvb3Quc2VydmVyJywge1xuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgc2V0TW91bnRlZCh0cnVlKTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIHJlbmRlciA/IChSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0X19kZWZhdWx0LkZyYWdtZW50LCBudWxsLCByZW5kZXIoe1xuICAgICAgICBzdWJtaXQsXG4gICAgfSkpKSA6IChSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiLCB7IG5vVmFsaWRhdGU6IG1vdW50ZWQsIGFjdGlvbjogYWN0aW9uLCBtZXRob2Q6IG1ldGhvZCwgZW5jVHlwZTogZW5jVHlwZSwgb25TdWJtaXQ6IHN1Ym1pdCwgLi4ucmVzdCB9LCBjaGlsZHJlbikpO1xufVxuXG52YXIgYXBwZW5kRXJyb3JzID0gKG5hbWUsIHZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSwgZXJyb3JzLCB0eXBlLCBtZXNzYWdlKSA9PiB2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWFcbiAgICA/IHtcbiAgICAgICAgLi4uZXJyb3JzW25hbWVdLFxuICAgICAgICB0eXBlczoge1xuICAgICAgICAgICAgLi4uKGVycm9yc1tuYW1lXSAmJiBlcnJvcnNbbmFtZV0udHlwZXMgPyBlcnJvcnNbbmFtZV0udHlwZXMgOiB7fSksXG4gICAgICAgICAgICBbdHlwZV06IG1lc3NhZ2UgfHwgdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9XG4gICAgOiB7fTtcblxudmFyIGNvbnZlcnRUb0FycmF5UGF5bG9hZCA9ICh2YWx1ZSkgPT4gKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcblxudmFyIGNyZWF0ZVN1YmplY3QgPSAoKSA9PiB7XG4gICAgbGV0IF9vYnNlcnZlcnMgPSBbXTtcbiAgICBjb25zdCBuZXh0ID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgb2JzZXJ2ZXIgb2YgX29ic2VydmVycykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCAmJiBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgc3Vic2NyaWJlID0gKG9ic2VydmVyKSA9PiB7XG4gICAgICAgIF9vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1bnN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIF9vYnNlcnZlcnMgPSBfb2JzZXJ2ZXJzLmZpbHRlcigobykgPT4gbyAhPT0gb2JzZXJ2ZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgICBfb2JzZXJ2ZXJzID0gW107XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQgb2JzZXJ2ZXJzKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZlcnM7XG4gICAgICAgIH0sXG4gICAgICAgIG5leHQsXG4gICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgdW5zdWJzY3JpYmUsXG4gICAgfTtcbn07XG5cbnZhciBpc1ByaW1pdGl2ZSA9ICh2YWx1ZSkgPT4gaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpIHx8ICFpc09iamVjdFR5cGUodmFsdWUpO1xuXG5mdW5jdGlvbiBkZWVwRXF1YWwob2JqZWN0MSwgb2JqZWN0MiwgX2ludGVybmFsX3Zpc2l0ZWQgPSBuZXcgV2Vha1NldCgpKSB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iamVjdDEpIHx8IGlzUHJpbWl0aXZlKG9iamVjdDIpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QxID09PSBvYmplY3QyO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlT2JqZWN0KG9iamVjdDEpICYmIGlzRGF0ZU9iamVjdChvYmplY3QyKSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0MS5nZXRUaW1lKCkgPT09IG9iamVjdDIuZ2V0VGltZSgpO1xuICAgIH1cbiAgICBjb25zdCBrZXlzMSA9IE9iamVjdC5rZXlzKG9iamVjdDEpO1xuICAgIGNvbnN0IGtleXMyID0gT2JqZWN0LmtleXMob2JqZWN0Mik7XG4gICAgaWYgKGtleXMxLmxlbmd0aCAhPT0ga2V5czIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKF9pbnRlcm5hbF92aXNpdGVkLmhhcyhvYmplY3QxKSB8fCBfaW50ZXJuYWxfdmlzaXRlZC5oYXMob2JqZWN0MikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIF9pbnRlcm5hbF92aXNpdGVkLmFkZChvYmplY3QxKTtcbiAgICBfaW50ZXJuYWxfdmlzaXRlZC5hZGQob2JqZWN0Mik7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5czEpIHtcbiAgICAgICAgY29uc3QgdmFsMSA9IG9iamVjdDFba2V5XTtcbiAgICAgICAgaWYgKCFrZXlzMi5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSAhPT0gJ3JlZicpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbDIgPSBvYmplY3QyW2tleV07XG4gICAgICAgICAgICBpZiAoKGlzRGF0ZU9iamVjdCh2YWwxKSAmJiBpc0RhdGVPYmplY3QodmFsMikpIHx8XG4gICAgICAgICAgICAgICAgKGlzT2JqZWN0KHZhbDEpICYmIGlzT2JqZWN0KHZhbDIpKSB8fFxuICAgICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KHZhbDEpICYmIEFycmF5LmlzQXJyYXkodmFsMikpXG4gICAgICAgICAgICAgICAgPyAhZGVlcEVxdWFsKHZhbDEsIHZhbDIsIF9pbnRlcm5hbF92aXNpdGVkKVxuICAgICAgICAgICAgICAgIDogdmFsMSAhPT0gdmFsMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxudmFyIGlzRW1wdHlPYmplY3QgPSAodmFsdWUpID0+IGlzT2JqZWN0KHZhbHVlKSAmJiAhT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aDtcblxudmFyIGlzRmlsZUlucHV0ID0gKGVsZW1lbnQpID0+IGVsZW1lbnQudHlwZSA9PT0gJ2ZpbGUnO1xuXG52YXIgaXNGdW5jdGlvbiA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xuXG52YXIgaXNIVE1MRWxlbWVudCA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICghaXNXZWIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBvd25lciA9IHZhbHVlID8gdmFsdWUub3duZXJEb2N1bWVudCA6IDA7XG4gICAgcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mXG4gICAgICAgIChvd25lciAmJiBvd25lci5kZWZhdWx0VmlldyA/IG93bmVyLmRlZmF1bHRWaWV3LkhUTUxFbGVtZW50IDogSFRNTEVsZW1lbnQpKTtcbn07XG5cbnZhciBpc011bHRpcGxlU2VsZWN0ID0gKGVsZW1lbnQpID0+IGVsZW1lbnQudHlwZSA9PT0gYHNlbGVjdC1tdWx0aXBsZWA7XG5cbnZhciBpc1JhZGlvSW5wdXQgPSAoZWxlbWVudCkgPT4gZWxlbWVudC50eXBlID09PSAncmFkaW8nO1xuXG52YXIgaXNSYWRpb09yQ2hlY2tib3ggPSAocmVmKSA9PiBpc1JhZGlvSW5wdXQocmVmKSB8fCBpc0NoZWNrQm94SW5wdXQocmVmKTtcblxudmFyIGxpdmUgPSAocmVmKSA9PiBpc0hUTUxFbGVtZW50KHJlZikgJiYgcmVmLmlzQ29ubmVjdGVkO1xuXG5mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgdXBkYXRlUGF0aCkge1xuICAgIGNvbnN0IGxlbmd0aCA9IHVwZGF0ZVBhdGguc2xpY2UoMCwgLTEpLmxlbmd0aDtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBvYmplY3QgPSBpc1VuZGVmaW5lZChvYmplY3QpID8gaW5kZXgrKyA6IG9iamVjdFt1cGRhdGVQYXRoW2luZGV4KytdXTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbn1cbmZ1bmN0aW9uIGlzRW1wdHlBcnJheShvYmopIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICFpc1VuZGVmaW5lZChvYmpba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgIGNvbnN0IHBhdGhzID0gQXJyYXkuaXNBcnJheShwYXRoKVxuICAgICAgICA/IHBhdGhcbiAgICAgICAgOiBpc0tleShwYXRoKVxuICAgICAgICAgICAgPyBbcGF0aF1cbiAgICAgICAgICAgIDogc3RyaW5nVG9QYXRoKHBhdGgpO1xuICAgIGNvbnN0IGNoaWxkT2JqZWN0ID0gcGF0aHMubGVuZ3RoID09PSAxID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIHBhdGhzKTtcbiAgICBjb25zdCBpbmRleCA9IHBhdGhzLmxlbmd0aCAtIDE7XG4gICAgY29uc3Qga2V5ID0gcGF0aHNbaW5kZXhdO1xuICAgIGlmIChjaGlsZE9iamVjdCkge1xuICAgICAgICBkZWxldGUgY2hpbGRPYmplY3Rba2V5XTtcbiAgICB9XG4gICAgaWYgKGluZGV4ICE9PSAwICYmXG4gICAgICAgICgoaXNPYmplY3QoY2hpbGRPYmplY3QpICYmIGlzRW1wdHlPYmplY3QoY2hpbGRPYmplY3QpKSB8fFxuICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoY2hpbGRPYmplY3QpICYmIGlzRW1wdHlBcnJheShjaGlsZE9iamVjdCkpKSkge1xuICAgICAgICB1bnNldChvYmplY3QsIHBhdGhzLnNsaWNlKDAsIC0xKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG59XG5cbnZhciBvYmplY3RIYXNGdW5jdGlvbiA9IChkYXRhKSA9PiB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihkYXRhW2tleV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBtYXJrRmllbGRzRGlydHkoZGF0YSwgZmllbGRzID0ge30pIHtcbiAgICBjb25zdCBpc1BhcmVudE5vZGVBcnJheSA9IEFycmF5LmlzQXJyYXkoZGF0YSk7XG4gICAgaWYgKGlzT2JqZWN0KGRhdGEpIHx8IGlzUGFyZW50Tm9kZUFycmF5KSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFba2V5XSkgfHxcbiAgICAgICAgICAgICAgICAoaXNPYmplY3QoZGF0YVtrZXldKSAmJiAhb2JqZWN0SGFzRnVuY3Rpb24oZGF0YVtrZXldKSkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZHNba2V5XSA9IEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSA/IFtdIDoge307XG4gICAgICAgICAgICAgICAgbWFya0ZpZWxkc0RpcnR5KGRhdGFba2V5XSwgZmllbGRzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGRhdGFba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkcztcbn1cbmZ1bmN0aW9uIGdldERpcnR5RmllbGRzRnJvbURlZmF1bHRWYWx1ZXMoZGF0YSwgZm9ybVZhbHVlcywgZGlydHlGaWVsZHNGcm9tVmFsdWVzKSB7XG4gICAgY29uc3QgaXNQYXJlbnROb2RlQXJyYXkgPSBBcnJheS5pc0FycmF5KGRhdGEpO1xuICAgIGlmIChpc09iamVjdChkYXRhKSB8fCBpc1BhcmVudE5vZGVBcnJheSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhW2tleV0pIHx8XG4gICAgICAgICAgICAgICAgKGlzT2JqZWN0KGRhdGFba2V5XSkgJiYgIW9iamVjdEhhc0Z1bmN0aW9uKGRhdGFba2V5XSkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGZvcm1WYWx1ZXMpIHx8XG4gICAgICAgICAgICAgICAgICAgIGlzUHJpbWl0aXZlKGRpcnR5RmllbGRzRnJvbVZhbHVlc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXJ0eUZpZWxkc0Zyb21WYWx1ZXNba2V5XSA9IEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBtYXJrRmllbGRzRGlydHkoZGF0YVtrZXldLCBbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogeyAuLi5tYXJrRmllbGRzRGlydHkoZGF0YVtrZXldKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0RGlydHlGaWVsZHNGcm9tRGVmYXVsdFZhbHVlcyhkYXRhW2tleV0sIGlzTnVsbE9yVW5kZWZpbmVkKGZvcm1WYWx1ZXMpID8ge30gOiBmb3JtVmFsdWVzW2tleV0sIGRpcnR5RmllbGRzRnJvbVZhbHVlc1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXJ0eUZpZWxkc0Zyb21WYWx1ZXNba2V5XSA9ICFkZWVwRXF1YWwoZGF0YVtrZXldLCBmb3JtVmFsdWVzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaXJ0eUZpZWxkc0Zyb21WYWx1ZXM7XG59XG52YXIgZ2V0RGlydHlGaWVsZHMgPSAoZGVmYXVsdFZhbHVlcywgZm9ybVZhbHVlcykgPT4gZ2V0RGlydHlGaWVsZHNGcm9tRGVmYXVsdFZhbHVlcyhkZWZhdWx0VmFsdWVzLCBmb3JtVmFsdWVzLCBtYXJrRmllbGRzRGlydHkoZm9ybVZhbHVlcykpO1xuXG5jb25zdCBkZWZhdWx0UmVzdWx0ID0ge1xuICAgIHZhbHVlOiBmYWxzZSxcbiAgICBpc1ZhbGlkOiBmYWxzZSxcbn07XG5jb25zdCB2YWxpZFJlc3VsdCA9IHsgdmFsdWU6IHRydWUsIGlzVmFsaWQ6IHRydWUgfTtcbnZhciBnZXRDaGVja2JveFZhbHVlID0gKG9wdGlvbnMpID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBvcHRpb25zXG4gICAgICAgICAgICAgICAgLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24gJiYgb3B0aW9uLmNoZWNrZWQgJiYgIW9wdGlvbi5kaXNhYmxlZClcbiAgICAgICAgICAgICAgICAubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdmFsdWVzLCBpc1ZhbGlkOiAhIXZhbHVlcy5sZW5ndGggfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9uc1swXS5jaGVja2VkICYmICFvcHRpb25zWzBdLmRpc2FibGVkXG4gICAgICAgICAgICA/IC8vIEB0cy1leHBlY3QtZXJyb3IgZXhwZWN0ZWQgdG8gd29yayBpbiB0aGUgYnJvd3NlclxuICAgICAgICAgICAgICAgIG9wdGlvbnNbMF0uYXR0cmlidXRlcyAmJiAhaXNVbmRlZmluZWQob3B0aW9uc1swXS5hdHRyaWJ1dGVzLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IGlzVW5kZWZpbmVkKG9wdGlvbnNbMF0udmFsdWUpIHx8IG9wdGlvbnNbMF0udmFsdWUgPT09ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHZhbGlkUmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgdmFsdWU6IG9wdGlvbnNbMF0udmFsdWUsIGlzVmFsaWQ6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICA6IHZhbGlkUmVzdWx0XG4gICAgICAgICAgICA6IGRlZmF1bHRSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0UmVzdWx0O1xufTtcblxudmFyIGdldEZpZWxkVmFsdWVBcyA9ICh2YWx1ZSwgeyB2YWx1ZUFzTnVtYmVyLCB2YWx1ZUFzRGF0ZSwgc2V0VmFsdWVBcyB9KSA9PiBpc1VuZGVmaW5lZCh2YWx1ZSlcbiAgICA/IHZhbHVlXG4gICAgOiB2YWx1ZUFzTnVtYmVyXG4gICAgICAgID8gdmFsdWUgPT09ICcnXG4gICAgICAgICAgICA/IE5hTlxuICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICAgICAgICAgID8gK3ZhbHVlXG4gICAgICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICA6IHZhbHVlQXNEYXRlICYmIGlzU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgPyBuZXcgRGF0ZSh2YWx1ZSlcbiAgICAgICAgICAgIDogc2V0VmFsdWVBc1xuICAgICAgICAgICAgICAgID8gc2V0VmFsdWVBcyh2YWx1ZSlcbiAgICAgICAgICAgICAgICA6IHZhbHVlO1xuXG5jb25zdCBkZWZhdWx0UmV0dXJuID0ge1xuICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgIHZhbHVlOiBudWxsLFxufTtcbnZhciBnZXRSYWRpb1ZhbHVlID0gKG9wdGlvbnMpID0+IEFycmF5LmlzQXJyYXkob3B0aW9ucylcbiAgICA/IG9wdGlvbnMucmVkdWNlKChwcmV2aW91cywgb3B0aW9uKSA9PiBvcHRpb24gJiYgb3B0aW9uLmNoZWNrZWQgJiYgIW9wdGlvbi5kaXNhYmxlZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICB9XG4gICAgICAgIDogcHJldmlvdXMsIGRlZmF1bHRSZXR1cm4pXG4gICAgOiBkZWZhdWx0UmV0dXJuO1xuXG5mdW5jdGlvbiBnZXRGaWVsZFZhbHVlKF9mKSB7XG4gICAgY29uc3QgcmVmID0gX2YucmVmO1xuICAgIGlmIChpc0ZpbGVJbnB1dChyZWYpKSB7XG4gICAgICAgIHJldHVybiByZWYuZmlsZXM7XG4gICAgfVxuICAgIGlmIChpc1JhZGlvSW5wdXQocmVmKSkge1xuICAgICAgICByZXR1cm4gZ2V0UmFkaW9WYWx1ZShfZi5yZWZzKS52YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzTXVsdGlwbGVTZWxlY3QocmVmKSkge1xuICAgICAgICByZXR1cm4gWy4uLnJlZi5zZWxlY3RlZE9wdGlvbnNdLm1hcCgoeyB2YWx1ZSB9KSA9PiB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpc0NoZWNrQm94SW5wdXQocmVmKSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2hlY2tib3hWYWx1ZShfZi5yZWZzKS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGdldEZpZWxkVmFsdWVBcyhpc1VuZGVmaW5lZChyZWYudmFsdWUpID8gX2YucmVmLnZhbHVlIDogcmVmLnZhbHVlLCBfZik7XG59XG5cbnZhciBnZXRSZXNvbHZlck9wdGlvbnMgPSAoZmllbGRzTmFtZXMsIF9maWVsZHMsIGNyaXRlcmlhTW9kZSwgc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbikgPT4ge1xuICAgIGNvbnN0IGZpZWxkcyA9IHt9O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBmaWVsZHNOYW1lcykge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgZmllbGQgJiYgc2V0KGZpZWxkcywgbmFtZSwgZmllbGQuX2YpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjcml0ZXJpYU1vZGUsXG4gICAgICAgIG5hbWVzOiBbLi4uZmllbGRzTmFtZXNdLFxuICAgICAgICBmaWVsZHMsXG4gICAgICAgIHNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24sXG4gICAgfTtcbn07XG5cbnZhciBpc1JlZ2V4ID0gKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cDtcblxudmFyIGdldFJ1bGVWYWx1ZSA9IChydWxlKSA9PiBpc1VuZGVmaW5lZChydWxlKVxuICAgID8gcnVsZVxuICAgIDogaXNSZWdleChydWxlKVxuICAgICAgICA/IHJ1bGUuc291cmNlXG4gICAgICAgIDogaXNPYmplY3QocnVsZSlcbiAgICAgICAgICAgID8gaXNSZWdleChydWxlLnZhbHVlKVxuICAgICAgICAgICAgICAgID8gcnVsZS52YWx1ZS5zb3VyY2VcbiAgICAgICAgICAgICAgICA6IHJ1bGUudmFsdWVcbiAgICAgICAgICAgIDogcnVsZTtcblxudmFyIGdldFZhbGlkYXRpb25Nb2RlcyA9IChtb2RlKSA9PiAoe1xuICAgIGlzT25TdWJtaXQ6ICFtb2RlIHx8IG1vZGUgPT09IFZBTElEQVRJT05fTU9ERS5vblN1Ym1pdCxcbiAgICBpc09uQmx1cjogbW9kZSA9PT0gVkFMSURBVElPTl9NT0RFLm9uQmx1cixcbiAgICBpc09uQ2hhbmdlOiBtb2RlID09PSBWQUxJREFUSU9OX01PREUub25DaGFuZ2UsXG4gICAgaXNPbkFsbDogbW9kZSA9PT0gVkFMSURBVElPTl9NT0RFLmFsbCxcbiAgICBpc09uVG91Y2g6IG1vZGUgPT09IFZBTElEQVRJT05fTU9ERS5vblRvdWNoZWQsXG59KTtcblxuY29uc3QgQVNZTkNfRlVOQ1RJT04gPSAnQXN5bmNGdW5jdGlvbic7XG52YXIgaGFzUHJvbWlzZVZhbGlkYXRpb24gPSAoZmllbGRSZWZlcmVuY2UpID0+ICEhZmllbGRSZWZlcmVuY2UgJiZcbiAgICAhIWZpZWxkUmVmZXJlbmNlLnZhbGlkYXRlICYmXG4gICAgISEoKGlzRnVuY3Rpb24oZmllbGRSZWZlcmVuY2UudmFsaWRhdGUpICYmXG4gICAgICAgIGZpZWxkUmVmZXJlbmNlLnZhbGlkYXRlLmNvbnN0cnVjdG9yLm5hbWUgPT09IEFTWU5DX0ZVTkNUSU9OKSB8fFxuICAgICAgICAoaXNPYmplY3QoZmllbGRSZWZlcmVuY2UudmFsaWRhdGUpICYmXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKGZpZWxkUmVmZXJlbmNlLnZhbGlkYXRlKS5maW5kKCh2YWxpZGF0ZUZ1bmN0aW9uKSA9PiB2YWxpZGF0ZUZ1bmN0aW9uLmNvbnN0cnVjdG9yLm5hbWUgPT09IEFTWU5DX0ZVTkNUSU9OKSkpO1xuXG52YXIgaGFzVmFsaWRhdGlvbiA9IChvcHRpb25zKSA9PiBvcHRpb25zLm1vdW50ICYmXG4gICAgKG9wdGlvbnMucmVxdWlyZWQgfHxcbiAgICAgICAgb3B0aW9ucy5taW4gfHxcbiAgICAgICAgb3B0aW9ucy5tYXggfHxcbiAgICAgICAgb3B0aW9ucy5tYXhMZW5ndGggfHxcbiAgICAgICAgb3B0aW9ucy5taW5MZW5ndGggfHxcbiAgICAgICAgb3B0aW9ucy5wYXR0ZXJuIHx8XG4gICAgICAgIG9wdGlvbnMudmFsaWRhdGUpO1xuXG52YXIgaXNXYXRjaGVkID0gKG5hbWUsIF9uYW1lcywgaXNCbHVyRXZlbnQpID0+ICFpc0JsdXJFdmVudCAmJlxuICAgIChfbmFtZXMud2F0Y2hBbGwgfHxcbiAgICAgICAgX25hbWVzLndhdGNoLmhhcyhuYW1lKSB8fFxuICAgICAgICBbLi4uX25hbWVzLndhdGNoXS5zb21lKCh3YXRjaE5hbWUpID0+IG5hbWUuc3RhcnRzV2l0aCh3YXRjaE5hbWUpICYmXG4gICAgICAgICAgICAvXlxcLlxcdysvLnRlc3QobmFtZS5zbGljZSh3YXRjaE5hbWUubGVuZ3RoKSkpKTtcblxuY29uc3QgaXRlcmF0ZUZpZWxkc0J5QWN0aW9uID0gKGZpZWxkcywgYWN0aW9uLCBmaWVsZHNOYW1lcywgYWJvcnRFYXJseSkgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGZpZWxkc05hbWVzIHx8IE9iamVjdC5rZXlzKGZpZWxkcykpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoZmllbGRzLCBrZXkpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgX2YsIC4uLmN1cnJlbnRGaWVsZCB9ID0gZmllbGQ7XG4gICAgICAgICAgICBpZiAoX2YpIHtcbiAgICAgICAgICAgICAgICBpZiAoX2YucmVmcyAmJiBfZi5yZWZzWzBdICYmIGFjdGlvbihfZi5yZWZzWzBdLCBrZXkpICYmICFhYm9ydEVhcmx5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChfZi5yZWYgJiYgYWN0aW9uKF9mLnJlZiwgX2YubmFtZSkgJiYgIWFib3J0RWFybHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlcmF0ZUZpZWxkc0J5QWN0aW9uKGN1cnJlbnRGaWVsZCwgYWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc09iamVjdChjdXJyZW50RmllbGQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZXJhdGVGaWVsZHNCeUFjdGlvbihjdXJyZW50RmllbGQsIGFjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbn07XG5cbmZ1bmN0aW9uIHNjaGVtYUVycm9yTG9va3VwKGVycm9ycywgX2ZpZWxkcywgbmFtZSkge1xuICAgIGNvbnN0IGVycm9yID0gZ2V0KGVycm9ycywgbmFtZSk7XG4gICAgaWYgKGVycm9yIHx8IGlzS2V5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG5hbWVzID0gbmFtZS5zcGxpdCgnLicpO1xuICAgIHdoaWxlIChuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gbmFtZXMuam9pbignLicpO1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICBjb25zdCBmb3VuZEVycm9yID0gZ2V0KGVycm9ycywgZmllbGROYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkICYmICFBcnJheS5pc0FycmF5KGZpZWxkKSAmJiBuYW1lICE9PSBmaWVsZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWUgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRFcnJvciAmJiBmb3VuZEVycm9yLnR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgICAgIGVycm9yOiBmb3VuZEVycm9yLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRFcnJvciAmJiBmb3VuZEVycm9yLnJvb3QgJiYgZm91bmRFcnJvci5yb290LnR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogYCR7ZmllbGROYW1lfS5yb290YCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZm91bmRFcnJvci5yb290LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBuYW1lcy5wb3AoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICB9O1xufVxuXG52YXIgc2hvdWxkUmVuZGVyRm9ybVN0YXRlID0gKGZvcm1TdGF0ZURhdGEsIF9wcm94eUZvcm1TdGF0ZSwgdXBkYXRlRm9ybVN0YXRlLCBpc1Jvb3QpID0+IHtcbiAgICB1cGRhdGVGb3JtU3RhdGUoZm9ybVN0YXRlRGF0YSk7XG4gICAgY29uc3QgeyBuYW1lLCAuLi5mb3JtU3RhdGUgfSA9IGZvcm1TdGF0ZURhdGE7XG4gICAgcmV0dXJuIChpc0VtcHR5T2JqZWN0KGZvcm1TdGF0ZSkgfHxcbiAgICAgICAgT2JqZWN0LmtleXMoZm9ybVN0YXRlKS5sZW5ndGggPj0gT2JqZWN0LmtleXMoX3Byb3h5Rm9ybVN0YXRlKS5sZW5ndGggfHxcbiAgICAgICAgT2JqZWN0LmtleXMoZm9ybVN0YXRlKS5maW5kKChrZXkpID0+IF9wcm94eUZvcm1TdGF0ZVtrZXldID09PVxuICAgICAgICAgICAgKCFpc1Jvb3QgfHwgVkFMSURBVElPTl9NT0RFLmFsbCkpKTtcbn07XG5cbnZhciBzaG91bGRTdWJzY3JpYmVCeU5hbWUgPSAobmFtZSwgc2lnbmFsTmFtZSwgZXhhY3QpID0+ICFuYW1lIHx8XG4gICAgIXNpZ25hbE5hbWUgfHxcbiAgICBuYW1lID09PSBzaWduYWxOYW1lIHx8XG4gICAgY29udmVydFRvQXJyYXlQYXlsb2FkKG5hbWUpLnNvbWUoKGN1cnJlbnROYW1lKSA9PiBjdXJyZW50TmFtZSAmJlxuICAgICAgICAoZXhhY3RcbiAgICAgICAgICAgID8gY3VycmVudE5hbWUgPT09IHNpZ25hbE5hbWVcbiAgICAgICAgICAgIDogY3VycmVudE5hbWUuc3RhcnRzV2l0aChzaWduYWxOYW1lKSB8fFxuICAgICAgICAgICAgICAgIHNpZ25hbE5hbWUuc3RhcnRzV2l0aChjdXJyZW50TmFtZSkpKTtcblxudmFyIHNraXBWYWxpZGF0aW9uID0gKGlzQmx1ckV2ZW50LCBpc1RvdWNoZWQsIGlzU3VibWl0dGVkLCByZVZhbGlkYXRlTW9kZSwgbW9kZSkgPT4ge1xuICAgIGlmIChtb2RlLmlzT25BbGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmICghaXNTdWJtaXR0ZWQgJiYgbW9kZS5pc09uVG91Y2gpIHtcbiAgICAgICAgcmV0dXJuICEoaXNUb3VjaGVkIHx8IGlzQmx1ckV2ZW50KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdWJtaXR0ZWQgPyByZVZhbGlkYXRlTW9kZS5pc09uQmx1ciA6IG1vZGUuaXNPbkJsdXIpIHtcbiAgICAgICAgcmV0dXJuICFpc0JsdXJFdmVudDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdWJtaXR0ZWQgPyByZVZhbGlkYXRlTW9kZS5pc09uQ2hhbmdlIDogbW9kZS5pc09uQ2hhbmdlKSB7XG4gICAgICAgIHJldHVybiBpc0JsdXJFdmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgdW5zZXRFbXB0eUFycmF5ID0gKHJlZiwgbmFtZSkgPT4gIWNvbXBhY3QoZ2V0KHJlZiwgbmFtZSkpLmxlbmd0aCAmJiB1bnNldChyZWYsIG5hbWUpO1xuXG52YXIgdXBkYXRlRmllbGRBcnJheVJvb3RFcnJvciA9IChlcnJvcnMsIGVycm9yLCBuYW1lKSA9PiB7XG4gICAgY29uc3QgZmllbGRBcnJheUVycm9ycyA9IGNvbnZlcnRUb0FycmF5UGF5bG9hZChnZXQoZXJyb3JzLCBuYW1lKSk7XG4gICAgc2V0KGZpZWxkQXJyYXlFcnJvcnMsICdyb290JywgZXJyb3JbbmFtZV0pO1xuICAgIHNldChlcnJvcnMsIG5hbWUsIGZpZWxkQXJyYXlFcnJvcnMpO1xuICAgIHJldHVybiBlcnJvcnM7XG59O1xuXG52YXIgaXNNZXNzYWdlID0gKHZhbHVlKSA9PiBpc1N0cmluZyh2YWx1ZSk7XG5cbmZ1bmN0aW9uIGdldFZhbGlkYXRlRXJyb3IocmVzdWx0LCByZWYsIHR5cGUgPSAndmFsaWRhdGUnKSB7XG4gICAgaWYgKGlzTWVzc2FnZShyZXN1bHQpIHx8XG4gICAgICAgIChBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0LmV2ZXJ5KGlzTWVzc2FnZSkpIHx8XG4gICAgICAgIChpc0Jvb2xlYW4ocmVzdWx0KSAmJiAhcmVzdWx0KSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGlzTWVzc2FnZShyZXN1bHQpID8gcmVzdWx0IDogJycsXG4gICAgICAgICAgICByZWYsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG52YXIgZ2V0VmFsdWVBbmRNZXNzYWdlID0gKHZhbGlkYXRpb25EYXRhKSA9PiBpc09iamVjdCh2YWxpZGF0aW9uRGF0YSkgJiYgIWlzUmVnZXgodmFsaWRhdGlvbkRhdGEpXG4gICAgPyB2YWxpZGF0aW9uRGF0YVxuICAgIDoge1xuICAgICAgICB2YWx1ZTogdmFsaWRhdGlvbkRhdGEsXG4gICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgIH07XG5cbnZhciB2YWxpZGF0ZUZpZWxkID0gYXN5bmMgKGZpZWxkLCBkaXNhYmxlZEZpZWxkTmFtZXMsIGZvcm1WYWx1ZXMsIHZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSwgc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbiwgaXNGaWVsZEFycmF5KSA9PiB7XG4gICAgY29uc3QgeyByZWYsIHJlZnMsIHJlcXVpcmVkLCBtYXhMZW5ndGgsIG1pbkxlbmd0aCwgbWluLCBtYXgsIHBhdHRlcm4sIHZhbGlkYXRlLCBuYW1lLCB2YWx1ZUFzTnVtYmVyLCBtb3VudCwgfSA9IGZpZWxkLl9mO1xuICAgIGNvbnN0IGlucHV0VmFsdWUgPSBnZXQoZm9ybVZhbHVlcywgbmFtZSk7XG4gICAgaWYgKCFtb3VudCB8fCBkaXNhYmxlZEZpZWxkTmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRSZWYgPSByZWZzID8gcmVmc1swXSA6IHJlZjtcbiAgICBjb25zdCBzZXRDdXN0b21WYWxpZGl0eSA9IChtZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChzaG91bGRVc2VOYXRpdmVWYWxpZGF0aW9uICYmIGlucHV0UmVmLnJlcG9ydFZhbGlkaXR5KSB7XG4gICAgICAgICAgICBpbnB1dFJlZi5zZXRDdXN0b21WYWxpZGl0eShpc0Jvb2xlYW4obWVzc2FnZSkgPyAnJyA6IG1lc3NhZ2UgfHwgJycpO1xuICAgICAgICAgICAgaW5wdXRSZWYucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgZXJyb3IgPSB7fTtcbiAgICBjb25zdCBpc1JhZGlvID0gaXNSYWRpb0lucHV0KHJlZik7XG4gICAgY29uc3QgaXNDaGVja0JveCA9IGlzQ2hlY2tCb3hJbnB1dChyZWYpO1xuICAgIGNvbnN0IGlzUmFkaW9PckNoZWNrYm94ID0gaXNSYWRpbyB8fCBpc0NoZWNrQm94O1xuICAgIGNvbnN0IGlzRW1wdHkgPSAoKHZhbHVlQXNOdW1iZXIgfHwgaXNGaWxlSW5wdXQocmVmKSkgJiZcbiAgICAgICAgaXNVbmRlZmluZWQocmVmLnZhbHVlKSAmJlxuICAgICAgICBpc1VuZGVmaW5lZChpbnB1dFZhbHVlKSkgfHxcbiAgICAgICAgKGlzSFRNTEVsZW1lbnQocmVmKSAmJiByZWYudmFsdWUgPT09ICcnKSB8fFxuICAgICAgICBpbnB1dFZhbHVlID09PSAnJyB8fFxuICAgICAgICAoQXJyYXkuaXNBcnJheShpbnB1dFZhbHVlKSAmJiAhaW5wdXRWYWx1ZS5sZW5ndGgpO1xuICAgIGNvbnN0IGFwcGVuZEVycm9yc0N1cnJ5ID0gYXBwZW5kRXJyb3JzLmJpbmQobnVsbCwgbmFtZSwgdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhLCBlcnJvcik7XG4gICAgY29uc3QgZ2V0TWluTWF4TWVzc2FnZSA9IChleGNlZWRNYXgsIG1heExlbmd0aE1lc3NhZ2UsIG1pbkxlbmd0aE1lc3NhZ2UsIG1heFR5cGUgPSBJTlBVVF9WQUxJREFUSU9OX1JVTEVTLm1heExlbmd0aCwgbWluVHlwZSA9IElOUFVUX1ZBTElEQVRJT05fUlVMRVMubWluTGVuZ3RoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBleGNlZWRNYXggPyBtYXhMZW5ndGhNZXNzYWdlIDogbWluTGVuZ3RoTWVzc2FnZTtcbiAgICAgICAgZXJyb3JbbmFtZV0gPSB7XG4gICAgICAgICAgICB0eXBlOiBleGNlZWRNYXggPyBtYXhUeXBlIDogbWluVHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICByZWYsXG4gICAgICAgICAgICAuLi5hcHBlbmRFcnJvcnNDdXJyeShleGNlZWRNYXggPyBtYXhUeXBlIDogbWluVHlwZSwgbWVzc2FnZSksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBpZiAoaXNGaWVsZEFycmF5XG4gICAgICAgID8gIUFycmF5LmlzQXJyYXkoaW5wdXRWYWx1ZSkgfHwgIWlucHV0VmFsdWUubGVuZ3RoXG4gICAgICAgIDogcmVxdWlyZWQgJiZcbiAgICAgICAgICAgICgoIWlzUmFkaW9PckNoZWNrYm94ICYmIChpc0VtcHR5IHx8IGlzTnVsbE9yVW5kZWZpbmVkKGlucHV0VmFsdWUpKSkgfHxcbiAgICAgICAgICAgICAgICAoaXNCb29sZWFuKGlucHV0VmFsdWUpICYmICFpbnB1dFZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIChpc0NoZWNrQm94ICYmICFnZXRDaGVja2JveFZhbHVlKHJlZnMpLmlzVmFsaWQpIHx8XG4gICAgICAgICAgICAgICAgKGlzUmFkaW8gJiYgIWdldFJhZGlvVmFsdWUocmVmcykuaXNWYWxpZCkpKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIG1lc3NhZ2UgfSA9IGlzTWVzc2FnZShyZXF1aXJlZClcbiAgICAgICAgICAgID8geyB2YWx1ZTogISFyZXF1aXJlZCwgbWVzc2FnZTogcmVxdWlyZWQgfVxuICAgICAgICAgICAgOiBnZXRWYWx1ZUFuZE1lc3NhZ2UocmVxdWlyZWQpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGVycm9yW25hbWVdID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IElOUFVUX1ZBTElEQVRJT05fUlVMRVMucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICByZWY6IGlucHV0UmVmLFxuICAgICAgICAgICAgICAgIC4uLmFwcGVuZEVycm9yc0N1cnJ5KElOUFVUX1ZBTElEQVRJT05fUlVMRVMucmVxdWlyZWQsIG1lc3NhZ2UpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICghdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhKSB7XG4gICAgICAgICAgICAgICAgc2V0Q3VzdG9tVmFsaWRpdHkobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghaXNFbXB0eSAmJiAoIWlzTnVsbE9yVW5kZWZpbmVkKG1pbikgfHwgIWlzTnVsbE9yVW5kZWZpbmVkKG1heCkpKSB7XG4gICAgICAgIGxldCBleGNlZWRNYXg7XG4gICAgICAgIGxldCBleGNlZWRNaW47XG4gICAgICAgIGNvbnN0IG1heE91dHB1dCA9IGdldFZhbHVlQW5kTWVzc2FnZShtYXgpO1xuICAgICAgICBjb25zdCBtaW5PdXRwdXQgPSBnZXRWYWx1ZUFuZE1lc3NhZ2UobWluKTtcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChpbnB1dFZhbHVlKSAmJiAhaXNOYU4oaW5wdXRWYWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlTnVtYmVyID0gcmVmLnZhbHVlQXNOdW1iZXIgfHxcbiAgICAgICAgICAgICAgICAoaW5wdXRWYWx1ZSA/ICtpbnB1dFZhbHVlIDogaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKG1heE91dHB1dC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBleGNlZWRNYXggPSB2YWx1ZU51bWJlciA+IG1heE91dHB1dC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQobWluT3V0cHV0LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGV4Y2VlZE1pbiA9IHZhbHVlTnVtYmVyIDwgbWluT3V0cHV0LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVEYXRlID0gcmVmLnZhbHVlQXNEYXRlIHx8IG5ldyBEYXRlKGlucHV0VmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgY29udmVydFRpbWVUb0RhdGUgPSAodGltZSkgPT4gbmV3IERhdGUobmV3IERhdGUoKS50b0RhdGVTdHJpbmcoKSArICcgJyArIHRpbWUpO1xuICAgICAgICAgICAgY29uc3QgaXNUaW1lID0gcmVmLnR5cGUgPT0gJ3RpbWUnO1xuICAgICAgICAgICAgY29uc3QgaXNXZWVrID0gcmVmLnR5cGUgPT0gJ3dlZWsnO1xuICAgICAgICAgICAgaWYgKGlzU3RyaW5nKG1heE91dHB1dC52YWx1ZSkgJiYgaW5wdXRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGV4Y2VlZE1heCA9IGlzVGltZVxuICAgICAgICAgICAgICAgICAgICA/IGNvbnZlcnRUaW1lVG9EYXRlKGlucHV0VmFsdWUpID4gY29udmVydFRpbWVUb0RhdGUobWF4T3V0cHV0LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA6IGlzV2Vla1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnB1dFZhbHVlID4gbWF4T3V0cHV0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHZhbHVlRGF0ZSA+IG5ldyBEYXRlKG1heE91dHB1dC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcobWluT3V0cHV0LnZhbHVlKSAmJiBpbnB1dFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZXhjZWVkTWluID0gaXNUaW1lXG4gICAgICAgICAgICAgICAgICAgID8gY29udmVydFRpbWVUb0RhdGUoaW5wdXRWYWx1ZSkgPCBjb252ZXJ0VGltZVRvRGF0ZShtaW5PdXRwdXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIDogaXNXZWVrXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGlucHV0VmFsdWUgPCBtaW5PdXRwdXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWVEYXRlIDwgbmV3IERhdGUobWluT3V0cHV0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhjZWVkTWF4IHx8IGV4Y2VlZE1pbikge1xuICAgICAgICAgICAgZ2V0TWluTWF4TWVzc2FnZSghIWV4Y2VlZE1heCwgbWF4T3V0cHV0Lm1lc3NhZ2UsIG1pbk91dHB1dC5tZXNzYWdlLCBJTlBVVF9WQUxJREFUSU9OX1JVTEVTLm1heCwgSU5QVVRfVkFMSURBVElPTl9SVUxFUy5taW4pO1xuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICBzZXRDdXN0b21WYWxpZGl0eShlcnJvcltuYW1lXS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKChtYXhMZW5ndGggfHwgbWluTGVuZ3RoKSAmJlxuICAgICAgICAhaXNFbXB0eSAmJlxuICAgICAgICAoaXNTdHJpbmcoaW5wdXRWYWx1ZSkgfHwgKGlzRmllbGRBcnJheSAmJiBBcnJheS5pc0FycmF5KGlucHV0VmFsdWUpKSkpIHtcbiAgICAgICAgY29uc3QgbWF4TGVuZ3RoT3V0cHV0ID0gZ2V0VmFsdWVBbmRNZXNzYWdlKG1heExlbmd0aCk7XG4gICAgICAgIGNvbnN0IG1pbkxlbmd0aE91dHB1dCA9IGdldFZhbHVlQW5kTWVzc2FnZShtaW5MZW5ndGgpO1xuICAgICAgICBjb25zdCBleGNlZWRNYXggPSAhaXNOdWxsT3JVbmRlZmluZWQobWF4TGVuZ3RoT3V0cHV0LnZhbHVlKSAmJlxuICAgICAgICAgICAgaW5wdXRWYWx1ZS5sZW5ndGggPiArbWF4TGVuZ3RoT3V0cHV0LnZhbHVlO1xuICAgICAgICBjb25zdCBleGNlZWRNaW4gPSAhaXNOdWxsT3JVbmRlZmluZWQobWluTGVuZ3RoT3V0cHV0LnZhbHVlKSAmJlxuICAgICAgICAgICAgaW5wdXRWYWx1ZS5sZW5ndGggPCArbWluTGVuZ3RoT3V0cHV0LnZhbHVlO1xuICAgICAgICBpZiAoZXhjZWVkTWF4IHx8IGV4Y2VlZE1pbikge1xuICAgICAgICAgICAgZ2V0TWluTWF4TWVzc2FnZShleGNlZWRNYXgsIG1heExlbmd0aE91dHB1dC5tZXNzYWdlLCBtaW5MZW5ndGhPdXRwdXQubWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgIHNldEN1c3RvbVZhbGlkaXR5KGVycm9yW25hbWVdLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocGF0dGVybiAmJiAhaXNFbXB0eSAmJiBpc1N0cmluZyhpbnB1dFZhbHVlKSkge1xuICAgICAgICBjb25zdCB7IHZhbHVlOiBwYXR0ZXJuVmFsdWUsIG1lc3NhZ2UgfSA9IGdldFZhbHVlQW5kTWVzc2FnZShwYXR0ZXJuKTtcbiAgICAgICAgaWYgKGlzUmVnZXgocGF0dGVyblZhbHVlKSAmJiAhaW5wdXRWYWx1ZS5tYXRjaChwYXR0ZXJuVmFsdWUpKSB7XG4gICAgICAgICAgICBlcnJvcltuYW1lXSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBJTlBVVF9WQUxJREFUSU9OX1JVTEVTLnBhdHRlcm4sXG4gICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICByZWYsXG4gICAgICAgICAgICAgICAgLi4uYXBwZW5kRXJyb3JzQ3VycnkoSU5QVVRfVkFMSURBVElPTl9SVUxFUy5wYXR0ZXJuLCBtZXNzYWdlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoIXZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgIHNldEN1c3RvbVZhbGlkaXR5KG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsaWRhdGUpKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2YWxpZGF0ZShpbnB1dFZhbHVlLCBmb3JtVmFsdWVzKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlRXJyb3IgPSBnZXRWYWxpZGF0ZUVycm9yKHJlc3VsdCwgaW5wdXRSZWYpO1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvcltuYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4udmFsaWRhdGVFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgLi4uYXBwZW5kRXJyb3JzQ3VycnkoSU5QVVRfVkFMSURBVElPTl9SVUxFUy52YWxpZGF0ZSwgdmFsaWRhdGVFcnJvci5tZXNzYWdlKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmICghdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEN1c3RvbVZhbGlkaXR5KHZhbGlkYXRlRXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3QodmFsaWRhdGUpKSB7XG4gICAgICAgICAgICBsZXQgdmFsaWRhdGlvblJlc3VsdCA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsaWRhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRW1wdHlPYmplY3QodmFsaWRhdGlvblJlc3VsdCkgJiYgIXZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVFcnJvciA9IGdldFZhbGlkYXRlRXJyb3IoYXdhaXQgdmFsaWRhdGVba2V5XShpbnB1dFZhbHVlLCBmb3JtVmFsdWVzKSwgaW5wdXRSZWYsIGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnZhbGlkYXRlRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5hcHBlbmRFcnJvcnNDdXJyeShrZXksIHZhbGlkYXRlRXJyb3IubWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHNldEN1c3RvbVZhbGlkaXR5KHZhbGlkYXRlRXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yW25hbWVdID0gdmFsaWRhdGlvblJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNFbXB0eU9iamVjdCh2YWxpZGF0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIGVycm9yW25hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICByZWY6IGlucHV0UmVmLFxuICAgICAgICAgICAgICAgICAgICAuLi52YWxpZGF0aW9uUmVzdWx0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRDdXN0b21WYWxpZGl0eSh0cnVlKTtcbiAgICByZXR1cm4gZXJyb3I7XG59O1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBtb2RlOiBWQUxJREFUSU9OX01PREUub25TdWJtaXQsXG4gICAgcmVWYWxpZGF0ZU1vZGU6IFZBTElEQVRJT05fTU9ERS5vbkNoYW5nZSxcbiAgICBzaG91bGRGb2N1c0Vycm9yOiB0cnVlLFxufTtcbmZ1bmN0aW9uIGNyZWF0ZUZvcm1Db250cm9sKHByb3BzID0ge30pIHtcbiAgICBsZXQgX29wdGlvbnMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAuLi5wcm9wcyxcbiAgICB9O1xuICAgIGxldCBfZm9ybVN0YXRlID0ge1xuICAgICAgICBzdWJtaXRDb3VudDogMCxcbiAgICAgICAgaXNEaXJ0eTogZmFsc2UsXG4gICAgICAgIGlzUmVhZHk6IGZhbHNlLFxuICAgICAgICBpc0xvYWRpbmc6IGlzRnVuY3Rpb24oX29wdGlvbnMuZGVmYXVsdFZhbHVlcyksXG4gICAgICAgIGlzVmFsaWRhdGluZzogZmFsc2UsXG4gICAgICAgIGlzU3VibWl0dGVkOiBmYWxzZSxcbiAgICAgICAgaXNTdWJtaXR0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNTdWJtaXRTdWNjZXNzZnVsOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIHRvdWNoZWRGaWVsZHM6IHt9LFxuICAgICAgICBkaXJ0eUZpZWxkczoge30sXG4gICAgICAgIHZhbGlkYXRpbmdGaWVsZHM6IHt9LFxuICAgICAgICBlcnJvcnM6IF9vcHRpb25zLmVycm9ycyB8fCB7fSxcbiAgICAgICAgZGlzYWJsZWQ6IF9vcHRpb25zLmRpc2FibGVkIHx8IGZhbHNlLFxuICAgIH07XG4gICAgbGV0IF9maWVsZHMgPSB7fTtcbiAgICBsZXQgX2RlZmF1bHRWYWx1ZXMgPSBpc09iamVjdChfb3B0aW9ucy5kZWZhdWx0VmFsdWVzKSB8fCBpc09iamVjdChfb3B0aW9ucy52YWx1ZXMpXG4gICAgICAgID8gY2xvbmVPYmplY3QoX29wdGlvbnMuZGVmYXVsdFZhbHVlcyB8fCBfb3B0aW9ucy52YWx1ZXMpIHx8IHt9XG4gICAgICAgIDoge307XG4gICAgbGV0IF9mb3JtVmFsdWVzID0gX29wdGlvbnMuc2hvdWxkVW5yZWdpc3RlclxuICAgICAgICA/IHt9XG4gICAgICAgIDogY2xvbmVPYmplY3QoX2RlZmF1bHRWYWx1ZXMpO1xuICAgIGxldCBfc3RhdGUgPSB7XG4gICAgICAgIGFjdGlvbjogZmFsc2UsXG4gICAgICAgIG1vdW50OiBmYWxzZSxcbiAgICAgICAgd2F0Y2g6IGZhbHNlLFxuICAgIH07XG4gICAgbGV0IF9uYW1lcyA9IHtcbiAgICAgICAgbW91bnQ6IG5ldyBTZXQoKSxcbiAgICAgICAgZGlzYWJsZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgdW5Nb3VudDogbmV3IFNldCgpLFxuICAgICAgICBhcnJheTogbmV3IFNldCgpLFxuICAgICAgICB3YXRjaDogbmV3IFNldCgpLFxuICAgIH07XG4gICAgbGV0IGRlbGF5RXJyb3JDYWxsYmFjaztcbiAgICBsZXQgdGltZXIgPSAwO1xuICAgIGNvbnN0IF9wcm94eUZvcm1TdGF0ZSA9IHtcbiAgICAgICAgaXNEaXJ0eTogZmFsc2UsXG4gICAgICAgIGRpcnR5RmllbGRzOiBmYWxzZSxcbiAgICAgICAgdmFsaWRhdGluZ0ZpZWxkczogZmFsc2UsXG4gICAgICAgIHRvdWNoZWRGaWVsZHM6IGZhbHNlLFxuICAgICAgICBpc1ZhbGlkYXRpbmc6IGZhbHNlLFxuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3JzOiBmYWxzZSxcbiAgICB9O1xuICAgIGxldCBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUgPSB7XG4gICAgICAgIC4uLl9wcm94eUZvcm1TdGF0ZSxcbiAgICB9O1xuICAgIGNvbnN0IF9zdWJqZWN0cyA9IHtcbiAgICAgICAgYXJyYXk6IGNyZWF0ZVN1YmplY3QoKSxcbiAgICAgICAgc3RhdGU6IGNyZWF0ZVN1YmplY3QoKSxcbiAgICB9O1xuICAgIGNvbnN0IHNob3VsZERpc3BsYXlBbGxBc3NvY2lhdGVkRXJyb3JzID0gX29wdGlvbnMuY3JpdGVyaWFNb2RlID09PSBWQUxJREFUSU9OX01PREUuYWxsO1xuICAgIGNvbnN0IGRlYm91bmNlID0gKGNhbGxiYWNrKSA9PiAod2FpdCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHdhaXQpO1xuICAgIH07XG4gICAgY29uc3QgX3NldFZhbGlkID0gYXN5bmMgKHNob3VsZFVwZGF0ZVZhbGlkKSA9PiB7XG4gICAgICAgIGlmICghX29wdGlvbnMuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgIChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZCB8fFxuICAgICAgICAgICAgICAgIF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZS5pc1ZhbGlkIHx8XG4gICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlVmFsaWQpKSB7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gX29wdGlvbnMucmVzb2x2ZXJcbiAgICAgICAgICAgICAgICA/IGlzRW1wdHlPYmplY3QoKGF3YWl0IF9ydW5TY2hlbWEoKSkuZXJyb3JzKVxuICAgICAgICAgICAgICAgIDogYXdhaXQgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uKF9maWVsZHMsIHRydWUpO1xuICAgICAgICAgICAgaWYgKGlzVmFsaWQgIT09IF9mb3JtU3RhdGUuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgX3VwZGF0ZUlzVmFsaWRhdGluZyA9IChuYW1lcywgaXNWYWxpZGF0aW5nKSA9PiB7XG4gICAgICAgIGlmICghX29wdGlvbnMuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgIChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZGF0aW5nIHx8XG4gICAgICAgICAgICAgICAgX3Byb3h5Rm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNWYWxpZGF0aW5nIHx8XG4gICAgICAgICAgICAgICAgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMpKSB7XG4gICAgICAgICAgICAobmFtZXMgfHwgQXJyYXkuZnJvbShfbmFtZXMubW91bnQpKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZGF0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHNldChfZm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMsIG5hbWUsIGlzVmFsaWRhdGluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5zZXQoX2Zvcm1TdGF0ZS52YWxpZGF0aW5nRmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW5nRmllbGRzOiBfZm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMsXG4gICAgICAgICAgICAgICAgaXNWYWxpZGF0aW5nOiAhaXNFbXB0eU9iamVjdChfZm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IF9zZXRGaWVsZEFycmF5ID0gKG5hbWUsIHZhbHVlcyA9IFtdLCBtZXRob2QsIGFyZ3MsIHNob3VsZFNldFZhbHVlcyA9IHRydWUsIHNob3VsZFVwZGF0ZUZpZWxkc0FuZFN0YXRlID0gdHJ1ZSkgPT4ge1xuICAgICAgICBpZiAoYXJncyAmJiBtZXRob2QgJiYgIV9vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBfc3RhdGUuYWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChzaG91bGRVcGRhdGVGaWVsZHNBbmRTdGF0ZSAmJiBBcnJheS5pc0FycmF5KGdldChfZmllbGRzLCBuYW1lKSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlcyA9IG1ldGhvZChnZXQoX2ZpZWxkcywgbmFtZSksIGFyZ3MuYXJnQSwgYXJncy5hcmdCKTtcbiAgICAgICAgICAgICAgICBzaG91bGRTZXRWYWx1ZXMgJiYgc2V0KF9maWVsZHMsIG5hbWUsIGZpZWxkVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaG91bGRVcGRhdGVGaWVsZHNBbmRTdGF0ZSAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZ2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBtZXRob2QoZ2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKSwgYXJncy5hcmdBLCBhcmdzLmFyZ0IpO1xuICAgICAgICAgICAgICAgIHNob3VsZFNldFZhbHVlcyAmJiBzZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUsIGVycm9ycyk7XG4gICAgICAgICAgICAgICAgdW5zZXRFbXB0eUFycmF5KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoX3Byb3h5Rm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUudG91Y2hlZEZpZWxkcykgJiZcbiAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZHNBbmRTdGF0ZSAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZ2V0KF9mb3JtU3RhdGUudG91Y2hlZEZpZWxkcywgbmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG91Y2hlZEZpZWxkcyA9IG1ldGhvZChnZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKSwgYXJncy5hcmdBLCBhcmdzLmFyZ0IpO1xuICAgICAgICAgICAgICAgIHNob3VsZFNldFZhbHVlcyAmJiBzZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lLCB0b3VjaGVkRmllbGRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfcHJveHlGb3JtU3RhdGUuZGlydHlGaWVsZHMgfHwgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLmRpcnR5RmllbGRzKSB7XG4gICAgICAgICAgICAgICAgX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcyA9IGdldERpcnR5RmllbGRzKF9kZWZhdWx0VmFsdWVzLCBfZm9ybVZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBpc0RpcnR5OiBfZ2V0RGlydHkobmFtZSwgdmFsdWVzKSxcbiAgICAgICAgICAgICAgICBkaXJ0eUZpZWxkczogX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcyxcbiAgICAgICAgICAgICAgICBlcnJvcnM6IF9mb3JtU3RhdGUuZXJyb3JzLFxuICAgICAgICAgICAgICAgIGlzVmFsaWQ6IF9mb3JtU3RhdGUuaXNWYWxpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0KF9mb3JtVmFsdWVzLCBuYW1lLCB2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGVFcnJvcnMgPSAobmFtZSwgZXJyb3IpID0+IHtcbiAgICAgICAgc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCBlcnJvcik7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgX3NldEVycm9ycyA9IChlcnJvcnMpID0+IHtcbiAgICAgICAgX2Zvcm1TdGF0ZS5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGVWYWxpZEFuZFZhbHVlID0gKG5hbWUsIHNob3VsZFNraXBTZXRWYWx1ZUFzLCB2YWx1ZSwgcmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGdldChfZm9ybVZhbHVlcywgbmFtZSwgaXNVbmRlZmluZWQodmFsdWUpID8gZ2V0KF9kZWZhdWx0VmFsdWVzLCBuYW1lKSA6IHZhbHVlKTtcbiAgICAgICAgICAgIGlzVW5kZWZpbmVkKGRlZmF1bHRWYWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAocmVmICYmIHJlZi5kZWZhdWx0Q2hlY2tlZCkgfHxcbiAgICAgICAgICAgICAgICBzaG91bGRTa2lwU2V0VmFsdWVBc1xuICAgICAgICAgICAgICAgID8gc2V0KF9mb3JtVmFsdWVzLCBuYW1lLCBzaG91bGRTa2lwU2V0VmFsdWVBcyA/IGRlZmF1bHRWYWx1ZSA6IGdldEZpZWxkVmFsdWUoZmllbGQuX2YpKVxuICAgICAgICAgICAgICAgIDogc2V0RmllbGRWYWx1ZShuYW1lLCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgX3N0YXRlLm1vdW50ICYmIF9zZXRWYWxpZCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGVUb3VjaEFuZERpcnR5ID0gKG5hbWUsIGZpZWxkVmFsdWUsIGlzQmx1ckV2ZW50LCBzaG91bGREaXJ0eSwgc2hvdWxkUmVuZGVyKSA9PiB7XG4gICAgICAgIGxldCBzaG91bGRVcGRhdGVGaWVsZCA9IGZhbHNlO1xuICAgICAgICBsZXQgaXNQcmV2aW91c0RpcnR5ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH07XG4gICAgICAgIGlmICghX29wdGlvbnMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGlmICghaXNCbHVyRXZlbnQgfHwgc2hvdWxkRGlydHkpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3Byb3h5Rm9ybVN0YXRlLmlzRGlydHkgfHwgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLmlzRGlydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNQcmV2aW91c0RpcnR5ID0gX2Zvcm1TdGF0ZS5pc0RpcnR5O1xuICAgICAgICAgICAgICAgICAgICBfZm9ybVN0YXRlLmlzRGlydHkgPSBvdXRwdXQuaXNEaXJ0eSA9IF9nZXREaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZCA9IGlzUHJldmlvdXNEaXJ0eSAhPT0gb3V0cHV0LmlzRGlydHk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudEZpZWxkUHJpc3RpbmUgPSBkZWVwRXF1YWwoZ2V0KF9kZWZhdWx0VmFsdWVzLCBuYW1lKSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaXNQcmV2aW91c0RpcnR5ID0gISFnZXQoX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgaXNDdXJyZW50RmllbGRQcmlzdGluZVxuICAgICAgICAgICAgICAgICAgICA/IHVuc2V0KF9mb3JtU3RhdGUuZGlydHlGaWVsZHMsIG5hbWUpXG4gICAgICAgICAgICAgICAgICAgIDogc2V0KF9mb3JtU3RhdGUuZGlydHlGaWVsZHMsIG5hbWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIG91dHB1dC5kaXJ0eUZpZWxkcyA9IF9mb3JtU3RhdGUuZGlydHlGaWVsZHM7XG4gICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlRmllbGQgPVxuICAgICAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKChfcHJveHlGb3JtU3RhdGUuZGlydHlGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuZGlydHlGaWVsZHMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmV2aW91c0RpcnR5ICE9PSAhaXNDdXJyZW50RmllbGRQcmlzdGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNCbHVyRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1ByZXZpb3VzRmllbGRUb3VjaGVkID0gZ2V0KF9mb3JtU3RhdGUudG91Y2hlZEZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ByZXZpb3VzRmllbGRUb3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldChfZm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMsIG5hbWUsIGlzQmx1ckV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnRvdWNoZWRGaWVsZHMgPSBfZm9ybVN0YXRlLnRvdWNoZWRGaWVsZHM7XG4gICAgICAgICAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpZWxkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfcHJveHlGb3JtU3RhdGUudG91Y2hlZEZpZWxkcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUudG91Y2hlZEZpZWxkcykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmV2aW91c0ZpZWxkVG91Y2hlZCAhPT0gaXNCbHVyRXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpZWxkICYmIHNob3VsZFJlbmRlciAmJiBfc3ViamVjdHMuc3RhdGUubmV4dChvdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaG91bGRVcGRhdGVGaWVsZCA/IG91dHB1dCA6IHt9O1xuICAgIH07XG4gICAgY29uc3Qgc2hvdWxkUmVuZGVyQnlFcnJvciA9IChuYW1lLCBpc1ZhbGlkLCBlcnJvciwgZmllbGRTdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2aW91c0ZpZWxkRXJyb3IgPSBnZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpO1xuICAgICAgICBjb25zdCBzaG91bGRVcGRhdGVWYWxpZCA9IChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZCB8fCBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNWYWxpZCkgJiZcbiAgICAgICAgICAgIGlzQm9vbGVhbihpc1ZhbGlkKSAmJlxuICAgICAgICAgICAgX2Zvcm1TdGF0ZS5pc1ZhbGlkICE9PSBpc1ZhbGlkO1xuICAgICAgICBpZiAoX29wdGlvbnMuZGVsYXlFcnJvciAmJiBlcnJvcikge1xuICAgICAgICAgICAgZGVsYXlFcnJvckNhbGxiYWNrID0gZGVib3VuY2UoKCkgPT4gdXBkYXRlRXJyb3JzKG5hbWUsIGVycm9yKSk7XG4gICAgICAgICAgICBkZWxheUVycm9yQ2FsbGJhY2soX29wdGlvbnMuZGVsYXlFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgZGVsYXlFcnJvckNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgPyBzZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUsIGVycm9yKVxuICAgICAgICAgICAgICAgIDogdW5zZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoZXJyb3IgPyAhZGVlcEVxdWFsKHByZXZpb3VzRmllbGRFcnJvciwgZXJyb3IpIDogcHJldmlvdXNGaWVsZEVycm9yKSB8fFxuICAgICAgICAgICAgIWlzRW1wdHlPYmplY3QoZmllbGRTdGF0ZSkgfHxcbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZVZhbGlkKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkRm9ybVN0YXRlID0ge1xuICAgICAgICAgICAgICAgIC4uLmZpZWxkU3RhdGUsXG4gICAgICAgICAgICAgICAgLi4uKHNob3VsZFVwZGF0ZVZhbGlkICYmIGlzQm9vbGVhbihpc1ZhbGlkKSA/IHsgaXNWYWxpZCB9IDoge30pLFxuICAgICAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBfZm9ybVN0YXRlID0ge1xuICAgICAgICAgICAgICAgIC4uLl9mb3JtU3RhdGUsXG4gICAgICAgICAgICAgICAgLi4udXBkYXRlZEZvcm1TdGF0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh1cGRhdGVkRm9ybVN0YXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgX3J1blNjaGVtYSA9IGFzeW5jIChuYW1lKSA9PiB7XG4gICAgICAgIF91cGRhdGVJc1ZhbGlkYXRpbmcobmFtZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9vcHRpb25zLnJlc29sdmVyKF9mb3JtVmFsdWVzLCBfb3B0aW9ucy5jb250ZXh0LCBnZXRSZXNvbHZlck9wdGlvbnMobmFtZSB8fCBfbmFtZXMubW91bnQsIF9maWVsZHMsIF9vcHRpb25zLmNyaXRlcmlhTW9kZSwgX29wdGlvbnMuc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbikpO1xuICAgICAgICBfdXBkYXRlSXNWYWxpZGF0aW5nKG5hbWUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgY29uc3QgZXhlY3V0ZVNjaGVtYUFuZFVwZGF0ZVN0YXRlID0gYXN5bmMgKG5hbWVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZXJyb3JzIH0gPSBhd2FpdCBfcnVuU2NoZW1hKG5hbWVzKTtcbiAgICAgICAgaWYgKG5hbWVzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGdldChlcnJvcnMsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgICAgID8gc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgOiB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBfZm9ybVN0YXRlLmVycm9ycyA9IGVycm9ycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH07XG4gICAgY29uc3QgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uID0gYXN5bmMgKGZpZWxkcywgc2hvdWxkT25seUNoZWNrVmFsaWQsIGNvbnRleHQgPSB7XG4gICAgICAgIHZhbGlkOiB0cnVlLFxuICAgIH0pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGZpZWxkcykge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IF9mLCAuLi5maWVsZFZhbHVlIH0gPSBmaWVsZDtcbiAgICAgICAgICAgICAgICBpZiAoX2YpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNGaWVsZEFycmF5Um9vdCA9IF9uYW1lcy5hcnJheS5oYXMoX2YubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzUHJvbWlzZUZ1bmN0aW9uID0gZmllbGQuX2YgJiYgaGFzUHJvbWlzZVZhbGlkYXRpb24oZmllbGQuX2YpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlRnVuY3Rpb24gJiYgX3Byb3h5Rm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF91cGRhdGVJc1ZhbGlkYXRpbmcoW25hbWVdLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZEVycm9yID0gYXdhaXQgdmFsaWRhdGVGaWVsZChmaWVsZCwgX25hbWVzLmRpc2FibGVkLCBfZm9ybVZhbHVlcywgc2hvdWxkRGlzcGxheUFsbEFzc29jaWF0ZWRFcnJvcnMsIF9vcHRpb25zLnNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24gJiYgIXNob3VsZE9ubHlDaGVja1ZhbGlkLCBpc0ZpZWxkQXJyYXlSb290KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvbWlzZUZ1bmN0aW9uICYmIF9wcm94eUZvcm1TdGF0ZS52YWxpZGF0aW5nRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdXBkYXRlSXNWYWxpZGF0aW5nKFtuYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRXJyb3JbX2YubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRPbmx5Q2hlY2tWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICFzaG91bGRPbmx5Q2hlY2tWYWxpZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGdldChmaWVsZEVycm9yLCBfZi5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaXNGaWVsZEFycmF5Um9vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHVwZGF0ZUZpZWxkQXJyYXlSb290RXJyb3IoX2Zvcm1TdGF0ZS5lcnJvcnMsIGZpZWxkRXJyb3IsIF9mLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBfZi5uYW1lLCBmaWVsZEVycm9yW19mLm5hbWVdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5zZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIF9mLm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIWlzRW1wdHlPYmplY3QoZmllbGRWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGV4ZWN1dGVCdWlsdEluVmFsaWRhdGlvbihmaWVsZFZhbHVlLCBzaG91bGRPbmx5Q2hlY2tWYWxpZCwgY29udGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0LnZhbGlkO1xuICAgIH07XG4gICAgY29uc3QgX3JlbW92ZVVubW91bnRlZCA9ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIF9uYW1lcy51bk1vdW50KSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgIGZpZWxkICYmXG4gICAgICAgICAgICAgICAgKGZpZWxkLl9mLnJlZnNcbiAgICAgICAgICAgICAgICAgICAgPyBmaWVsZC5fZi5yZWZzLmV2ZXJ5KChyZWYpID0+ICFsaXZlKHJlZikpXG4gICAgICAgICAgICAgICAgICAgIDogIWxpdmUoZmllbGQuX2YucmVmKSkgJiZcbiAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIF9uYW1lcy51bk1vdW50ID0gbmV3IFNldCgpO1xuICAgIH07XG4gICAgY29uc3QgX2dldERpcnR5ID0gKG5hbWUsIGRhdGEpID0+ICFfb3B0aW9ucy5kaXNhYmxlZCAmJlxuICAgICAgICAobmFtZSAmJiBkYXRhICYmIHNldChfZm9ybVZhbHVlcywgbmFtZSwgZGF0YSksXG4gICAgICAgICAgICAhZGVlcEVxdWFsKGdldFZhbHVlcygpLCBfZGVmYXVsdFZhbHVlcykpO1xuICAgIGNvbnN0IF9nZXRXYXRjaCA9IChuYW1lcywgZGVmYXVsdFZhbHVlLCBpc0dsb2JhbCkgPT4gZ2VuZXJhdGVXYXRjaE91dHB1dChuYW1lcywgX25hbWVzLCB7XG4gICAgICAgIC4uLihfc3RhdGUubW91bnRcbiAgICAgICAgICAgID8gX2Zvcm1WYWx1ZXNcbiAgICAgICAgICAgIDogaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKVxuICAgICAgICAgICAgICAgID8gX2RlZmF1bHRWYWx1ZXNcbiAgICAgICAgICAgICAgICA6IGlzU3RyaW5nKG5hbWVzKVxuICAgICAgICAgICAgICAgICAgICA/IHsgW25hbWVzXTogZGVmYXVsdFZhbHVlIH1cbiAgICAgICAgICAgICAgICAgICAgOiBkZWZhdWx0VmFsdWUpLFxuICAgIH0sIGlzR2xvYmFsLCBkZWZhdWx0VmFsdWUpO1xuICAgIGNvbnN0IF9nZXRGaWVsZEFycmF5ID0gKG5hbWUpID0+IGNvbXBhY3QoZ2V0KF9zdGF0ZS5tb3VudCA/IF9mb3JtVmFsdWVzIDogX2RlZmF1bHRWYWx1ZXMsIG5hbWUsIF9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXIgPyBnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUsIFtdKSA6IFtdKSk7XG4gICAgY29uc3Qgc2V0RmllbGRWYWx1ZSA9IChuYW1lLCB2YWx1ZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBsZXQgZmllbGRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkUmVmZXJlbmNlID0gZmllbGQuX2Y7XG4gICAgICAgICAgICBpZiAoZmllbGRSZWZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICAhZmllbGRSZWZlcmVuY2UuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgc2V0KF9mb3JtVmFsdWVzLCBuYW1lLCBnZXRGaWVsZFZhbHVlQXModmFsdWUsIGZpZWxkUmVmZXJlbmNlKSk7XG4gICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgIGlzSFRNTEVsZW1lbnQoZmllbGRSZWZlcmVuY2UucmVmKSAmJiBpc051bGxPclVuZGVmaW5lZCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGlzTXVsdGlwbGVTZWxlY3QoZmllbGRSZWZlcmVuY2UucmVmKSkge1xuICAgICAgICAgICAgICAgICAgICBbLi4uZmllbGRSZWZlcmVuY2UucmVmLm9wdGlvbnNdLmZvckVhY2goKG9wdGlvblJlZikgPT4gKG9wdGlvblJlZi5zZWxlY3RlZCA9IGZpZWxkVmFsdWUuaW5jbHVkZXMob3B0aW9uUmVmLnZhbHVlKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFJlZmVyZW5jZS5yZWZzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NoZWNrQm94SW5wdXQoZmllbGRSZWZlcmVuY2UucmVmKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2UucmVmcy5mb3JFYWNoKChjaGVja2JveFJlZikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tib3hSZWYuZGVmYXVsdENoZWNrZWQgfHwgIWNoZWNrYm94UmVmLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveFJlZi5jaGVja2VkID0gISFmaWVsZFZhbHVlLmZpbmQoKGRhdGEpID0+IGRhdGEgPT09IGNoZWNrYm94UmVmLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94UmVmLmNoZWNrZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPT09IGNoZWNrYm94UmVmLnZhbHVlIHx8ICEhZmllbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2UucmVmcy5mb3JFYWNoKChyYWRpb1JlZikgPT4gKHJhZGlvUmVmLmNoZWNrZWQgPSByYWRpb1JlZi52YWx1ZSA9PT0gZmllbGRWYWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRmlsZUlucHV0KGZpZWxkUmVmZXJlbmNlLnJlZikpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2UucmVmLnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZFJlZmVyZW5jZS5yZWYudmFsdWUgPSBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkUmVmZXJlbmNlLnJlZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGNsb25lT2JqZWN0KF9mb3JtVmFsdWVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIChvcHRpb25zLnNob3VsZERpcnR5IHx8IG9wdGlvbnMuc2hvdWxkVG91Y2gpICYmXG4gICAgICAgICAgICB1cGRhdGVUb3VjaEFuZERpcnR5KG5hbWUsIGZpZWxkVmFsdWUsIG9wdGlvbnMuc2hvdWxkVG91Y2gsIG9wdGlvbnMuc2hvdWxkRGlydHksIHRydWUpO1xuICAgICAgICBvcHRpb25zLnNob3VsZFZhbGlkYXRlICYmIHRyaWdnZXIobmFtZSk7XG4gICAgfTtcbiAgICBjb25zdCBzZXRWYWx1ZXMgPSAobmFtZSwgdmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZEtleSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZS5oYXNPd25Qcm9wZXJ0eShmaWVsZEtleSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gdmFsdWVbZmllbGRLZXldO1xuICAgICAgICAgICAgY29uc3QgZmllbGROYW1lID0gbmFtZSArICcuJyArIGZpZWxkS2V5O1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoX2ZpZWxkcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgIChfbmFtZXMuYXJyYXkuaGFzKG5hbWUpIHx8XG4gICAgICAgICAgICAgICAgaXNPYmplY3QoZmllbGRWYWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAoZmllbGQgJiYgIWZpZWxkLl9mKSkgJiZcbiAgICAgICAgICAgICAgICAhaXNEYXRlT2JqZWN0KGZpZWxkVmFsdWUpXG4gICAgICAgICAgICAgICAgPyBzZXRWYWx1ZXMoZmllbGROYW1lLCBmaWVsZFZhbHVlLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIDogc2V0RmllbGRWYWx1ZShmaWVsZE5hbWUsIGZpZWxkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBzZXRWYWx1ZSA9IChuYW1lLCB2YWx1ZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBjb25zdCBpc0ZpZWxkQXJyYXkgPSBfbmFtZXMuYXJyYXkuaGFzKG5hbWUpO1xuICAgICAgICBjb25zdCBjbG9uZVZhbHVlID0gY2xvbmVPYmplY3QodmFsdWUpO1xuICAgICAgICBzZXQoX2Zvcm1WYWx1ZXMsIG5hbWUsIGNsb25lVmFsdWUpO1xuICAgICAgICBpZiAoaXNGaWVsZEFycmF5KSB7XG4gICAgICAgICAgICBfc3ViamVjdHMuYXJyYXkubmV4dCh7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGNsb25lT2JqZWN0KF9mb3JtVmFsdWVzKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKChfcHJveHlGb3JtU3RhdGUuaXNEaXJ0eSB8fFxuICAgICAgICAgICAgICAgIF9wcm94eUZvcm1TdGF0ZS5kaXJ0eUZpZWxkcyB8fFxuICAgICAgICAgICAgICAgIF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZS5pc0RpcnR5IHx8XG4gICAgICAgICAgICAgICAgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLmRpcnR5RmllbGRzKSAmJlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2hvdWxkRGlydHkpIHtcbiAgICAgICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGRpcnR5RmllbGRzOiBnZXREaXJ0eUZpZWxkcyhfZGVmYXVsdFZhbHVlcywgX2Zvcm1WYWx1ZXMpLFxuICAgICAgICAgICAgICAgICAgICBpc0RpcnR5OiBfZ2V0RGlydHkobmFtZSwgY2xvbmVWYWx1ZSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmaWVsZCAmJiAhZmllbGQuX2YgJiYgIWlzTnVsbE9yVW5kZWZpbmVkKGNsb25lVmFsdWUpXG4gICAgICAgICAgICAgICAgPyBzZXRWYWx1ZXMobmFtZSwgY2xvbmVWYWx1ZSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICA6IHNldEZpZWxkVmFsdWUobmFtZSwgY2xvbmVWYWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaXNXYXRjaGVkKG5hbWUsIF9uYW1lcykgJiYgX3N1YmplY3RzLnN0YXRlLm5leHQoeyAuLi5fZm9ybVN0YXRlIH0pO1xuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICBuYW1lOiBfc3RhdGUubW91bnQgPyBuYW1lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdmFsdWVzOiBjbG9uZU9iamVjdChfZm9ybVZhbHVlcyksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3Qgb25DaGFuZ2UgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgX3N0YXRlLm1vdW50ID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICBsZXQgbmFtZSA9IHRhcmdldC5uYW1lO1xuICAgICAgICBsZXQgaXNGaWVsZFZhbHVlVXBkYXRlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBjb25zdCBfdXBkYXRlSXNGaWVsZFZhbHVlVXBkYXRlZCA9IChmaWVsZFZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpc0ZpZWxkVmFsdWVVcGRhdGVkID1cbiAgICAgICAgICAgICAgICBOdW1iZXIuaXNOYU4oZmllbGRWYWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGlzRGF0ZU9iamVjdChmaWVsZFZhbHVlKSAmJiBpc05hTihmaWVsZFZhbHVlLmdldFRpbWUoKSkpIHx8XG4gICAgICAgICAgICAgICAgICAgIGRlZXBFcXVhbChmaWVsZFZhbHVlLCBnZXQoX2Zvcm1WYWx1ZXMsIG5hbWUsIGZpZWxkVmFsdWUpKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbk1vZGVCZWZvcmVTdWJtaXQgPSBnZXRWYWxpZGF0aW9uTW9kZXMoX29wdGlvbnMubW9kZSk7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25Nb2RlQWZ0ZXJTdWJtaXQgPSBnZXRWYWxpZGF0aW9uTW9kZXMoX29wdGlvbnMucmVWYWxpZGF0ZU1vZGUpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgICAgIGxldCBpc1ZhbGlkO1xuICAgICAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHRhcmdldC50eXBlXG4gICAgICAgICAgICAgICAgPyBnZXRGaWVsZFZhbHVlKGZpZWxkLl9mKVxuICAgICAgICAgICAgICAgIDogZ2V0RXZlbnRWYWx1ZShldmVudCk7XG4gICAgICAgICAgICBjb25zdCBpc0JsdXJFdmVudCA9IGV2ZW50LnR5cGUgPT09IEVWRU5UUy5CTFVSIHx8IGV2ZW50LnR5cGUgPT09IEVWRU5UUy5GT0NVU19PVVQ7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRTa2lwVmFsaWRhdGlvbiA9ICghaGFzVmFsaWRhdGlvbihmaWVsZC5fZikgJiZcbiAgICAgICAgICAgICAgICAhX29wdGlvbnMucmVzb2x2ZXIgJiZcbiAgICAgICAgICAgICAgICAhZ2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAgICFmaWVsZC5fZi5kZXBzKSB8fFxuICAgICAgICAgICAgICAgIHNraXBWYWxpZGF0aW9uKGlzQmx1ckV2ZW50LCBnZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKSwgX2Zvcm1TdGF0ZS5pc1N1Ym1pdHRlZCwgdmFsaWRhdGlvbk1vZGVBZnRlclN1Ym1pdCwgdmFsaWRhdGlvbk1vZGVCZWZvcmVTdWJtaXQpO1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hlZCA9IGlzV2F0Y2hlZChuYW1lLCBfbmFtZXMsIGlzQmx1ckV2ZW50KTtcbiAgICAgICAgICAgIHNldChfZm9ybVZhbHVlcywgbmFtZSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoaXNCbHVyRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5fZi5vbkJsdXIgJiYgZmllbGQuX2Yub25CbHVyKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBkZWxheUVycm9yQ2FsbGJhY2sgJiYgZGVsYXlFcnJvckNhbGxiYWNrKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQuX2Yub25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5fZi5vbkNoYW5nZShldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWVsZFN0YXRlID0gdXBkYXRlVG91Y2hBbmREaXJ0eShuYW1lLCBmaWVsZFZhbHVlLCBpc0JsdXJFdmVudCk7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRSZW5kZXIgPSAhaXNFbXB0eU9iamVjdChmaWVsZFN0YXRlKSB8fCB3YXRjaGVkO1xuICAgICAgICAgICAgIWlzQmx1ckV2ZW50ICYmXG4gICAgICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBldmVudC50eXBlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGNsb25lT2JqZWN0KF9mb3JtVmFsdWVzKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChzaG91bGRTa2lwVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZCB8fCBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX29wdGlvbnMubW9kZSA9PT0gJ29uQmx1cicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0JsdXJFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZXRWYWxpZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc0JsdXJFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3NldFZhbGlkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIChzaG91bGRSZW5kZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoeyBuYW1lLCAuLi4od2F0Y2hlZCA/IHt9IDogZmllbGRTdGF0ZSkgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgIWlzQmx1ckV2ZW50ICYmIHdhdGNoZWQgJiYgX3N1YmplY3RzLnN0YXRlLm5leHQoeyAuLi5fZm9ybVN0YXRlIH0pO1xuICAgICAgICAgICAgaWYgKF9vcHRpb25zLnJlc29sdmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlcnJvcnMgfSA9IGF3YWl0IF9ydW5TY2hlbWEoW25hbWVdKTtcbiAgICAgICAgICAgICAgICBfdXBkYXRlSXNGaWVsZFZhbHVlVXBkYXRlZChmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNGaWVsZFZhbHVlVXBkYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0Vycm9yTG9va3VwUmVzdWx0ID0gc2NoZW1hRXJyb3JMb29rdXAoX2Zvcm1TdGF0ZS5lcnJvcnMsIF9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckxvb2t1cFJlc3VsdCA9IHNjaGVtYUVycm9yTG9va3VwKGVycm9ycywgX2ZpZWxkcywgcHJldmlvdXNFcnJvckxvb2t1cFJlc3VsdC5uYW1lIHx8IG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGVycm9yTG9va3VwUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgICAgICAgICBuYW1lID0gZXJyb3JMb29rdXBSZXN1bHQubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGlzRW1wdHlPYmplY3QoZXJyb3JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBfdXBkYXRlSXNWYWxpZGF0aW5nKFtuYW1lXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSAoYXdhaXQgdmFsaWRhdGVGaWVsZChmaWVsZCwgX25hbWVzLmRpc2FibGVkLCBfZm9ybVZhbHVlcywgc2hvdWxkRGlzcGxheUFsbEFzc29jaWF0ZWRFcnJvcnMsIF9vcHRpb25zLnNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24pKVtuYW1lXTtcbiAgICAgICAgICAgICAgICBfdXBkYXRlSXNWYWxpZGF0aW5nKFtuYW1lXSk7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZUlzRmllbGRWYWx1ZVVwZGF0ZWQoZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmllbGRWYWx1ZVVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZS5pc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gYXdhaXQgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uKF9maWVsZHMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRmllbGRWYWx1ZVVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5fZi5kZXBzICYmXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIoZmllbGQuX2YuZGVwcyk7XG4gICAgICAgICAgICAgICAgc2hvdWxkUmVuZGVyQnlFcnJvcihuYW1lLCBpc1ZhbGlkLCBlcnJvciwgZmllbGRTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IF9mb2N1c0lucHV0ID0gKHJlZiwga2V5KSA9PiB7XG4gICAgICAgIGlmIChnZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIGtleSkgJiYgcmVmLmZvY3VzKSB7XG4gICAgICAgICAgICByZWYuZm9jdXMoKTtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9O1xuICAgIGNvbnN0IHRyaWdnZXIgPSBhc3luYyAobmFtZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGxldCBpc1ZhbGlkO1xuICAgICAgICBsZXQgdmFsaWRhdGlvblJlc3VsdDtcbiAgICAgICAgY29uc3QgZmllbGROYW1lcyA9IGNvbnZlcnRUb0FycmF5UGF5bG9hZChuYW1lKTtcbiAgICAgICAgaWYgKF9vcHRpb25zLnJlc29sdmVyKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBleGVjdXRlU2NoZW1hQW5kVXBkYXRlU3RhdGUoaXNVbmRlZmluZWQobmFtZSkgPyBuYW1lIDogZmllbGROYW1lcyk7XG4gICAgICAgICAgICBpc1ZhbGlkID0gaXNFbXB0eU9iamVjdChlcnJvcnMpO1xuICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IG5hbWVcbiAgICAgICAgICAgICAgICA/ICFmaWVsZE5hbWVzLnNvbWUoKG5hbWUpID0+IGdldChlcnJvcnMsIG5hbWUpKVxuICAgICAgICAgICAgICAgIDogaXNWYWxpZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lKSB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gKGF3YWl0IFByb21pc2UuYWxsKGZpZWxkTmFtZXMubWFwKGFzeW5jIChmaWVsZE5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlQnVpbHRJblZhbGlkYXRpb24oZmllbGQgJiYgZmllbGQuX2YgPyB7IFtmaWVsZE5hbWVdOiBmaWVsZCB9IDogZmllbGQpO1xuICAgICAgICAgICAgfSkpKS5ldmVyeShCb29sZWFuKTtcbiAgICAgICAgICAgICEoIXZhbGlkYXRpb25SZXN1bHQgJiYgIV9mb3JtU3RhdGUuaXNWYWxpZCkgJiYgX3NldFZhbGlkKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gaXNWYWxpZCA9IGF3YWl0IGV4ZWN1dGVCdWlsdEluVmFsaWRhdGlvbihfZmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAuLi4oIWlzU3RyaW5nKG5hbWUpIHx8XG4gICAgICAgICAgICAgICAgKChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZCB8fCBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNWYWxpZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCAhPT0gX2Zvcm1TdGF0ZS5pc1ZhbGlkKVxuICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICA6IHsgbmFtZSB9KSxcbiAgICAgICAgICAgIC4uLihfb3B0aW9ucy5yZXNvbHZlciB8fCAhbmFtZSA/IHsgaXNWYWxpZCB9IDoge30pLFxuICAgICAgICAgICAgZXJyb3JzOiBfZm9ybVN0YXRlLmVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICAgIG9wdGlvbnMuc2hvdWxkRm9jdXMgJiZcbiAgICAgICAgICAgICF2YWxpZGF0aW9uUmVzdWx0ICYmXG4gICAgICAgICAgICBpdGVyYXRlRmllbGRzQnlBY3Rpb24oX2ZpZWxkcywgX2ZvY3VzSW5wdXQsIG5hbWUgPyBmaWVsZE5hbWVzIDogX25hbWVzLm1vdW50KTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQ7XG4gICAgfTtcbiAgICBjb25zdCBnZXRWYWx1ZXMgPSAoZmllbGROYW1lcykgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgICAgICAuLi4oX3N0YXRlLm1vdW50ID8gX2Zvcm1WYWx1ZXMgOiBfZGVmYXVsdFZhbHVlcyksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpc1VuZGVmaW5lZChmaWVsZE5hbWVzKVxuICAgICAgICAgICAgPyB2YWx1ZXNcbiAgICAgICAgICAgIDogaXNTdHJpbmcoZmllbGROYW1lcylcbiAgICAgICAgICAgICAgICA/IGdldCh2YWx1ZXMsIGZpZWxkTmFtZXMpXG4gICAgICAgICAgICAgICAgOiBmaWVsZE5hbWVzLm1hcCgobmFtZSkgPT4gZ2V0KHZhbHVlcywgbmFtZSkpO1xuICAgIH07XG4gICAgY29uc3QgZ2V0RmllbGRTdGF0ZSA9IChuYW1lLCBmb3JtU3RhdGUpID0+ICh7XG4gICAgICAgIGludmFsaWQ6ICEhZ2V0KChmb3JtU3RhdGUgfHwgX2Zvcm1TdGF0ZSkuZXJyb3JzLCBuYW1lKSxcbiAgICAgICAgaXNEaXJ0eTogISFnZXQoKGZvcm1TdGF0ZSB8fCBfZm9ybVN0YXRlKS5kaXJ0eUZpZWxkcywgbmFtZSksXG4gICAgICAgIGVycm9yOiBnZXQoKGZvcm1TdGF0ZSB8fCBfZm9ybVN0YXRlKS5lcnJvcnMsIG5hbWUpLFxuICAgICAgICBpc1ZhbGlkYXRpbmc6ICEhZ2V0KF9mb3JtU3RhdGUudmFsaWRhdGluZ0ZpZWxkcywgbmFtZSksXG4gICAgICAgIGlzVG91Y2hlZDogISFnZXQoKGZvcm1TdGF0ZSB8fCBfZm9ybVN0YXRlKS50b3VjaGVkRmllbGRzLCBuYW1lKSxcbiAgICB9KTtcbiAgICBjb25zdCBjbGVhckVycm9ycyA9IChuYW1lKSA9PiB7XG4gICAgICAgIG5hbWUgJiZcbiAgICAgICAgICAgIGNvbnZlcnRUb0FycmF5UGF5bG9hZChuYW1lKS5mb3JFYWNoKChpbnB1dE5hbWUpID0+IHVuc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBpbnB1dE5hbWUpKTtcbiAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgZXJyb3JzOiBuYW1lID8gX2Zvcm1TdGF0ZS5lcnJvcnMgOiB7fSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBzZXRFcnJvciA9IChuYW1lLCBlcnJvciwgb3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCByZWYgPSAoZ2V0KF9maWVsZHMsIG5hbWUsIHsgX2Y6IHt9IH0pLl9mIHx8IHt9KS5yZWY7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFcnJvciA9IGdldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSkgfHwge307XG4gICAgICAgIC8vIERvbid0IG92ZXJyaWRlIGV4aXN0aW5nIGVycm9yIG1lc3NhZ2VzIGVsc2V3aGVyZSBpbiB0aGUgb2JqZWN0IHRyZWUuXG4gICAgICAgIGNvbnN0IHsgcmVmOiBjdXJyZW50UmVmLCBtZXNzYWdlLCB0eXBlLCAuLi5yZXN0T2ZFcnJvclRyZWUgfSA9IGN1cnJlbnRFcnJvcjtcbiAgICAgICAgc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCB7XG4gICAgICAgICAgICAuLi5yZXN0T2ZFcnJvclRyZWUsXG4gICAgICAgICAgICAuLi5lcnJvcixcbiAgICAgICAgICAgIHJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBlcnJvcnM6IF9mb3JtU3RhdGUuZXJyb3JzLFxuICAgICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMuc2hvdWxkRm9jdXMgJiYgcmVmICYmIHJlZi5mb2N1cyAmJiByZWYuZm9jdXMoKTtcbiAgICB9O1xuICAgIGNvbnN0IHdhdGNoID0gKG5hbWUsIGRlZmF1bHRWYWx1ZSkgPT4gaXNGdW5jdGlvbihuYW1lKVxuICAgICAgICA/IF9zdWJqZWN0cy5zdGF0ZS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHBheWxvYWQpID0+IG5hbWUoX2dldFdhdGNoKHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlKSwgcGF5bG9hZCksXG4gICAgICAgIH0pXG4gICAgICAgIDogX2dldFdhdGNoKG5hbWUsIGRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gICAgY29uc3QgX3N1YnNjcmliZSA9IChwcm9wcykgPT4gX3N1YmplY3RzLnN0YXRlLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChmb3JtU3RhdGUpID0+IHtcbiAgICAgICAgICAgIGlmIChzaG91bGRTdWJzY3JpYmVCeU5hbWUocHJvcHMubmFtZSwgZm9ybVN0YXRlLm5hbWUsIHByb3BzLmV4YWN0KSAmJlxuICAgICAgICAgICAgICAgIHNob3VsZFJlbmRlckZvcm1TdGF0ZShmb3JtU3RhdGUsIHByb3BzLmZvcm1TdGF0ZSB8fCBfcHJveHlGb3JtU3RhdGUsIF9zZXRGb3JtU3RhdGUsIHByb3BzLnJlUmVuZGVyUm9vdCkpIHtcbiAgICAgICAgICAgICAgICBwcm9wcy5jYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogeyAuLi5fZm9ybVZhbHVlcyB9LFxuICAgICAgICAgICAgICAgICAgICAuLi5fZm9ybVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAuLi5mb3JtU3RhdGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSkudW5zdWJzY3JpYmU7XG4gICAgY29uc3Qgc3Vic2NyaWJlID0gKHByb3BzKSA9PiB7XG4gICAgICAgIF9zdGF0ZS5tb3VudCA9IHRydWU7XG4gICAgICAgIF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgIC4uLl9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZSxcbiAgICAgICAgICAgIC4uLnByb3BzLmZvcm1TdGF0ZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF9zdWJzY3JpYmUoe1xuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgICAgICBmb3JtU3RhdGU6IF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCB1bnJlZ2lzdGVyID0gKG5hbWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiBuYW1lID8gY29udmVydFRvQXJyYXlQYXlsb2FkKG5hbWUpIDogX25hbWVzLm1vdW50KSB7XG4gICAgICAgICAgICBfbmFtZXMubW91bnQuZGVsZXRlKGZpZWxkTmFtZSk7XG4gICAgICAgICAgICBfbmFtZXMuYXJyYXkuZGVsZXRlKGZpZWxkTmFtZSk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMua2VlcFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdW5zZXQoX2ZpZWxkcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgICAgICB1bnNldChfZm9ybVZhbHVlcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICFvcHRpb25zLmtlZXBFcnJvciAmJiB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgZmllbGROYW1lKTtcbiAgICAgICAgICAgICFvcHRpb25zLmtlZXBEaXJ0eSAmJiB1bnNldChfZm9ybVN0YXRlLmRpcnR5RmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgIW9wdGlvbnMua2VlcFRvdWNoZWQgJiYgdW5zZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgIW9wdGlvbnMua2VlcElzVmFsaWRhdGluZyAmJlxuICAgICAgICAgICAgICAgIHVuc2V0KF9mb3JtU3RhdGUudmFsaWRhdGluZ0ZpZWxkcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgICFfb3B0aW9ucy5zaG91bGRVbnJlZ2lzdGVyICYmXG4gICAgICAgICAgICAgICAgIW9wdGlvbnMua2VlcERlZmF1bHRWYWx1ZSAmJlxuICAgICAgICAgICAgICAgIHVuc2V0KF9kZWZhdWx0VmFsdWVzLCBmaWVsZE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIHZhbHVlczogY2xvbmVPYmplY3QoX2Zvcm1WYWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgLi4uX2Zvcm1TdGF0ZSxcbiAgICAgICAgICAgIC4uLighb3B0aW9ucy5rZWVwRGlydHkgPyB7fSA6IHsgaXNEaXJ0eTogX2dldERpcnR5KCkgfSksXG4gICAgICAgIH0pO1xuICAgICAgICAhb3B0aW9ucy5rZWVwSXNWYWxpZCAmJiBfc2V0VmFsaWQoKTtcbiAgICB9O1xuICAgIGNvbnN0IF9zZXREaXNhYmxlZEZpZWxkID0gKHsgZGlzYWJsZWQsIG5hbWUsIH0pID0+IHtcbiAgICAgICAgaWYgKChpc0Jvb2xlYW4oZGlzYWJsZWQpICYmIF9zdGF0ZS5tb3VudCkgfHxcbiAgICAgICAgICAgICEhZGlzYWJsZWQgfHxcbiAgICAgICAgICAgIF9uYW1lcy5kaXNhYmxlZC5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGRpc2FibGVkID8gX25hbWVzLmRpc2FibGVkLmFkZChuYW1lKSA6IF9uYW1lcy5kaXNhYmxlZC5kZWxldGUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJlZ2lzdGVyID0gKG5hbWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBsZXQgZmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkSXNEZWZpbmVkID0gaXNCb29sZWFuKG9wdGlvbnMuZGlzYWJsZWQpIHx8IGlzQm9vbGVhbihfb3B0aW9ucy5kaXNhYmxlZCk7XG4gICAgICAgIHNldChfZmllbGRzLCBuYW1lLCB7XG4gICAgICAgICAgICAuLi4oZmllbGQgfHwge30pLFxuICAgICAgICAgICAgX2Y6IHtcbiAgICAgICAgICAgICAgICAuLi4oZmllbGQgJiYgZmllbGQuX2YgPyBmaWVsZC5fZiA6IHsgcmVmOiB7IG5hbWUgfSB9KSxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIG1vdW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgX25hbWVzLm1vdW50LmFkZChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICBfc2V0RGlzYWJsZWRGaWVsZCh7XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGlzQm9vbGVhbihvcHRpb25zLmRpc2FibGVkKVxuICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbnMuZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgOiBfb3B0aW9ucy5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1cGRhdGVWYWxpZEFuZFZhbHVlKG5hbWUsIHRydWUsIG9wdGlvbnMudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi4oZGlzYWJsZWRJc0RlZmluZWRcbiAgICAgICAgICAgICAgICA/IHsgZGlzYWJsZWQ6IG9wdGlvbnMuZGlzYWJsZWQgfHwgX29wdGlvbnMuZGlzYWJsZWQgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgLi4uKF9vcHRpb25zLnByb2dyZXNzaXZlXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAhIW9wdGlvbnMucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogZ2V0UnVsZVZhbHVlKG9wdGlvbnMubWluKSxcbiAgICAgICAgICAgICAgICAgICAgbWF4OiBnZXRSdWxlVmFsdWUob3B0aW9ucy5tYXgpLFxuICAgICAgICAgICAgICAgICAgICBtaW5MZW5ndGg6IGdldFJ1bGVWYWx1ZShvcHRpb25zLm1pbkxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgIG1heExlbmd0aDogZ2V0UnVsZVZhbHVlKG9wdGlvbnMubWF4TGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybjogZ2V0UnVsZVZhbHVlKG9wdGlvbnMucGF0dGVybiksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIG9uQ2hhbmdlLFxuICAgICAgICAgICAgb25CbHVyOiBvbkNoYW5nZSxcbiAgICAgICAgICAgIHJlZjogKHJlZikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIobmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFJlZiA9IGlzVW5kZWZpbmVkKHJlZi52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVmLnF1ZXJ5U2VsZWN0b3JBbGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlZi5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCxzZWxlY3QsdGV4dGFyZWEnKVswXSB8fCByZWZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgOiByZWY7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvT3JDaGVja2JveCA9IGlzUmFkaW9PckNoZWNrYm94KGZpZWxkUmVmKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmcyA9IGZpZWxkLl9mLnJlZnMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYWRpb09yQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVmcy5maW5kKChvcHRpb24pID0+IG9wdGlvbiA9PT0gZmllbGRSZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGZpZWxkUmVmID09PSBmaWVsZC5fZi5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXQoX2ZpZWxkcywgbmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Y6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5maWVsZC5fZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmFkaW9PckNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlZnMuZmlsdGVyKGxpdmUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkUmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KGdldChfZGVmYXVsdFZhbHVlcywgbmFtZSkpID8gW3t9XSA6IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY6IHsgdHlwZTogZmllbGRSZWYudHlwZSwgbmFtZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyByZWY6IGZpZWxkUmVmIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVZhbGlkQW5kVmFsdWUobmFtZSwgZmFsc2UsIHVuZGVmaW5lZCwgZmllbGRSZWYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSwge30pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuX2YpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLl9mLm1vdW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKF9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXIgfHwgb3B0aW9ucy5zaG91bGRVbnJlZ2lzdGVyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIShpc05hbWVJbkZpZWxkQXJyYXkoX25hbWVzLmFycmF5LCBuYW1lKSAmJiBfc3RhdGUuYWN0aW9uKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgX25hbWVzLnVuTW91bnQuYWRkKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBfZm9jdXNFcnJvciA9ICgpID0+IF9vcHRpb25zLnNob3VsZEZvY3VzRXJyb3IgJiZcbiAgICAgICAgaXRlcmF0ZUZpZWxkc0J5QWN0aW9uKF9maWVsZHMsIF9mb2N1c0lucHV0LCBfbmFtZXMubW91bnQpO1xuICAgIGNvbnN0IF9kaXNhYmxlRm9ybSA9IChkaXNhYmxlZCkgPT4ge1xuICAgICAgICBpZiAoaXNCb29sZWFuKGRpc2FibGVkKSkge1xuICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoeyBkaXNhYmxlZCB9KTtcbiAgICAgICAgICAgIGl0ZXJhdGVGaWVsZHNCeUFjdGlvbihfZmllbGRzLCAocmVmLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmLmRpc2FibGVkID0gY3VycmVudEZpZWxkLl9mLmRpc2FibGVkIHx8IGRpc2FibGVkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50RmllbGQuX2YucmVmcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZC5fZi5yZWZzLmZvckVhY2goKGlucHV0UmVmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRSZWYuZGlzYWJsZWQgPSBjdXJyZW50RmllbGQuX2YuZGlzYWJsZWQgfHwgZGlzYWJsZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDAsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgaGFuZGxlU3VibWl0ID0gKG9uVmFsaWQsIG9uSW52YWxpZCkgPT4gYXN5bmMgKGUpID0+IHtcbiAgICAgICAgbGV0IG9uVmFsaWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQgJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5wZXJzaXN0ICYmXG4gICAgICAgICAgICAgICAgZS5wZXJzaXN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpZWxkVmFsdWVzID0gY2xvbmVPYmplY3QoX2Zvcm1WYWx1ZXMpO1xuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICBpc1N1Ym1pdHRpbmc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoX29wdGlvbnMucmVzb2x2ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZXJyb3JzLCB2YWx1ZXMgfSA9IGF3YWl0IF9ydW5TY2hlbWEoKTtcbiAgICAgICAgICAgIF9mb3JtU3RhdGUuZXJyb3JzID0gZXJyb3JzO1xuICAgICAgICAgICAgZmllbGRWYWx1ZXMgPSBjbG9uZU9iamVjdCh2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uKF9maWVsZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfbmFtZXMuZGlzYWJsZWQuc2l6ZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIF9uYW1lcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIHVuc2V0KGZpZWxkVmFsdWVzLCBuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgJ3Jvb3QnKTtcbiAgICAgICAgaWYgKGlzRW1wdHlPYmplY3QoX2Zvcm1TdGF0ZS5lcnJvcnMpKSB7XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgZXJyb3JzOiB7fSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBvblZhbGlkKGZpZWxkVmFsdWVzLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIG9uVmFsaWRFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKG9uSW52YWxpZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG9uSW52YWxpZCh7IC4uLl9mb3JtU3RhdGUuZXJyb3JzIH0sIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2ZvY3VzRXJyb3IoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoX2ZvY3VzRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIGlzU3VibWl0dGVkOiB0cnVlLFxuICAgICAgICAgICAgaXNTdWJtaXR0aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlzU3VibWl0U3VjY2Vzc2Z1bDogaXNFbXB0eU9iamVjdChfZm9ybVN0YXRlLmVycm9ycykgJiYgIW9uVmFsaWRFcnJvcixcbiAgICAgICAgICAgIHN1Ym1pdENvdW50OiBfZm9ybVN0YXRlLnN1Ym1pdENvdW50ICsgMSxcbiAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob25WYWxpZEVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBvblZhbGlkRXJyb3I7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJlc2V0RmllbGQgPSAobmFtZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGlmIChnZXQoX2ZpZWxkcywgbmFtZSkpIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChvcHRpb25zLmRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBzZXRWYWx1ZShuYW1lLCBjbG9uZU9iamVjdChnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRWYWx1ZShuYW1lLCBvcHRpb25zLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgc2V0KF9kZWZhdWx0VmFsdWVzLCBuYW1lLCBjbG9uZU9iamVjdChvcHRpb25zLmRlZmF1bHRWYWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmtlZXBUb3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgdW5zZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5rZWVwRGlydHkpIHtcbiAgICAgICAgICAgICAgICB1bnNldChfZm9ybVN0YXRlLmRpcnR5RmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICBfZm9ybVN0YXRlLmlzRGlydHkgPSBvcHRpb25zLmRlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICA/IF9nZXREaXJ0eShuYW1lLCBjbG9uZU9iamVjdChnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUpKSlcbiAgICAgICAgICAgICAgICAgICAgOiBfZ2V0RGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5rZWVwRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICAgICAgX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgJiYgX3NldFZhbGlkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7IC4uLl9mb3JtU3RhdGUgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IF9yZXNldCA9IChmb3JtVmFsdWVzLCBrZWVwU3RhdGVPcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZFZhbHVlcyA9IGZvcm1WYWx1ZXMgPyBjbG9uZU9iamVjdChmb3JtVmFsdWVzKSA6IF9kZWZhdWx0VmFsdWVzO1xuICAgICAgICBjb25zdCBjbG9uZVVwZGF0ZWRWYWx1ZXMgPSBjbG9uZU9iamVjdCh1cGRhdGVkVmFsdWVzKTtcbiAgICAgICAgY29uc3QgaXNFbXB0eVJlc2V0VmFsdWVzID0gaXNFbXB0eU9iamVjdChmb3JtVmFsdWVzKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gaXNFbXB0eVJlc2V0VmFsdWVzID8gX2RlZmF1bHRWYWx1ZXMgOiBjbG9uZVVwZGF0ZWRWYWx1ZXM7XG4gICAgICAgIGlmICgha2VlcFN0YXRlT3B0aW9ucy5rZWVwRGVmYXVsdFZhbHVlcykge1xuICAgICAgICAgICAgX2RlZmF1bHRWYWx1ZXMgPSB1cGRhdGVkVmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICgha2VlcFN0YXRlT3B0aW9ucy5rZWVwVmFsdWVzKSB7XG4gICAgICAgICAgICBpZiAoa2VlcFN0YXRlT3B0aW9ucy5rZWVwRGlydHlWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZHNUb0NoZWNrID0gbmV3IFNldChbXG4gICAgICAgICAgICAgICAgICAgIC4uLl9uYW1lcy5tb3VudCxcbiAgICAgICAgICAgICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ2V0RGlydHlGaWVsZHMoX2RlZmF1bHRWYWx1ZXMsIF9mb3JtVmFsdWVzKSksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZE5hbWUgb2YgQXJyYXkuZnJvbShmaWVsZHNUb0NoZWNrKSkge1xuICAgICAgICAgICAgICAgICAgICBnZXQoX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcywgZmllbGROYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBzZXQodmFsdWVzLCBmaWVsZE5hbWUsIGdldChfZm9ybVZhbHVlcywgZmllbGROYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0VmFsdWUoZmllbGROYW1lLCBnZXQodmFsdWVzLCBmaWVsZE5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNXZWIgJiYgaXNVbmRlZmluZWQoZm9ybVZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIF9uYW1lcy5tb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQuX2YpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFJlZmVyZW5jZSA9IEFycmF5LmlzQXJyYXkoZmllbGQuX2YucmVmcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmaWVsZC5fZi5yZWZzWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmllbGQuX2YucmVmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0hUTUxFbGVtZW50KGZpZWxkUmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtID0gZmllbGRSZWZlcmVuY2UuY2xvc2VzdCgnZm9ybScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGtlZXBTdGF0ZU9wdGlvbnMua2VlcEZpZWxkc1JlZikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiBfbmFtZXMubW91bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKGZpZWxkTmFtZSwgZ2V0KHZhbHVlcywgZmllbGROYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9maWVsZHMgPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZm9ybVZhbHVlcyA9IF9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXJcbiAgICAgICAgICAgICAgICA/IGtlZXBTdGF0ZU9wdGlvbnMua2VlcERlZmF1bHRWYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgPyBjbG9uZU9iamVjdChfZGVmYXVsdFZhbHVlcylcbiAgICAgICAgICAgICAgICAgICAgOiB7fVxuICAgICAgICAgICAgICAgIDogY2xvbmVPYmplY3QodmFsdWVzKTtcbiAgICAgICAgICAgIF9zdWJqZWN0cy5hcnJheS5uZXh0KHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IHsgLi4udmFsdWVzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IHsgLi4udmFsdWVzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBfbmFtZXMgPSB7XG4gICAgICAgICAgICBtb3VudDoga2VlcFN0YXRlT3B0aW9ucy5rZWVwRGlydHlWYWx1ZXMgPyBfbmFtZXMubW91bnQgOiBuZXcgU2V0KCksXG4gICAgICAgICAgICB1bk1vdW50OiBuZXcgU2V0KCksXG4gICAgICAgICAgICBhcnJheTogbmV3IFNldCgpLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgICAgIHdhdGNoOiBuZXcgU2V0KCksXG4gICAgICAgICAgICB3YXRjaEFsbDogZmFsc2UsXG4gICAgICAgICAgICBmb2N1czogJycsXG4gICAgICAgIH07XG4gICAgICAgIF9zdGF0ZS5tb3VudCA9XG4gICAgICAgICAgICAhX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgfHxcbiAgICAgICAgICAgICAgICAhIWtlZXBTdGF0ZU9wdGlvbnMua2VlcElzVmFsaWQgfHxcbiAgICAgICAgICAgICAgICAhIWtlZXBTdGF0ZU9wdGlvbnMua2VlcERpcnR5VmFsdWVzO1xuICAgICAgICBfc3RhdGUud2F0Y2ggPSAhIV9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXI7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIHN1Ym1pdENvdW50OiBrZWVwU3RhdGVPcHRpb25zLmtlZXBTdWJtaXRDb3VudFxuICAgICAgICAgICAgICAgID8gX2Zvcm1TdGF0ZS5zdWJtaXRDb3VudFxuICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIGlzRGlydHk6IGlzRW1wdHlSZXNldFZhbHVlc1xuICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICA6IGtlZXBTdGF0ZU9wdGlvbnMua2VlcERpcnR5XG4gICAgICAgICAgICAgICAgICAgID8gX2Zvcm1TdGF0ZS5pc0RpcnR5XG4gICAgICAgICAgICAgICAgICAgIDogISEoa2VlcFN0YXRlT3B0aW9ucy5rZWVwRGVmYXVsdFZhbHVlcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIWRlZXBFcXVhbChmb3JtVmFsdWVzLCBfZGVmYXVsdFZhbHVlcykpLFxuICAgICAgICAgICAgaXNTdWJtaXR0ZWQ6IGtlZXBTdGF0ZU9wdGlvbnMua2VlcElzU3VibWl0dGVkXG4gICAgICAgICAgICAgICAgPyBfZm9ybVN0YXRlLmlzU3VibWl0dGVkXG4gICAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGRpcnR5RmllbGRzOiBpc0VtcHR5UmVzZXRWYWx1ZXNcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBEaXJ0eVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IGtlZXBTdGF0ZU9wdGlvbnMua2VlcERlZmF1bHRWYWx1ZXMgJiYgX2Zvcm1WYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0RGlydHlGaWVsZHMoX2RlZmF1bHRWYWx1ZXMsIF9mb3JtVmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfZm9ybVN0YXRlLmRpcnR5RmllbGRzXG4gICAgICAgICAgICAgICAgICAgIDoga2VlcFN0YXRlT3B0aW9ucy5rZWVwRGVmYXVsdFZhbHVlcyAmJiBmb3JtVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGdldERpcnR5RmllbGRzKF9kZWZhdWx0VmFsdWVzLCBmb3JtVmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBEaXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30sXG4gICAgICAgICAgICB0b3VjaGVkRmllbGRzOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBUb3VjaGVkXG4gICAgICAgICAgICAgICAgPyBfZm9ybVN0YXRlLnRvdWNoZWRGaWVsZHNcbiAgICAgICAgICAgICAgICA6IHt9LFxuICAgICAgICAgICAgZXJyb3JzOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBFcnJvcnMgPyBfZm9ybVN0YXRlLmVycm9ycyA6IHt9LFxuICAgICAgICAgICAgaXNTdWJtaXRTdWNjZXNzZnVsOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBJc1N1Ym1pdFN1Y2Nlc3NmdWxcbiAgICAgICAgICAgICAgICA/IF9mb3JtU3RhdGUuaXNTdWJtaXRTdWNjZXNzZnVsXG4gICAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGlzU3VibWl0dGluZzogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgcmVzZXQgPSAoZm9ybVZhbHVlcywga2VlcFN0YXRlT3B0aW9ucykgPT4gX3Jlc2V0KGlzRnVuY3Rpb24oZm9ybVZhbHVlcylcbiAgICAgICAgPyBmb3JtVmFsdWVzKF9mb3JtVmFsdWVzKVxuICAgICAgICA6IGZvcm1WYWx1ZXMsIGtlZXBTdGF0ZU9wdGlvbnMpO1xuICAgIGNvbnN0IHNldEZvY3VzID0gKG5hbWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgY29uc3QgZmllbGRSZWZlcmVuY2UgPSBmaWVsZCAmJiBmaWVsZC5fZjtcbiAgICAgICAgaWYgKGZpZWxkUmVmZXJlbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFJlZiA9IGZpZWxkUmVmZXJlbmNlLnJlZnNcbiAgICAgICAgICAgICAgICA/IGZpZWxkUmVmZXJlbmNlLnJlZnNbMF1cbiAgICAgICAgICAgICAgICA6IGZpZWxkUmVmZXJlbmNlLnJlZjtcbiAgICAgICAgICAgIGlmIChmaWVsZFJlZi5mb2N1cykge1xuICAgICAgICAgICAgICAgIGZpZWxkUmVmLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zaG91bGRTZWxlY3QgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNGdW5jdGlvbihmaWVsZFJlZi5zZWxlY3QpICYmXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkUmVmLnNlbGVjdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBfc2V0Rm9ybVN0YXRlID0gKHVwZGF0ZWRGb3JtU3RhdGUpID0+IHtcbiAgICAgICAgX2Zvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgIC4uLl9mb3JtU3RhdGUsXG4gICAgICAgICAgICAuLi51cGRhdGVkRm9ybVN0YXRlLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgX3Jlc2V0RGVmYXVsdFZhbHVlcyA9ICgpID0+IGlzRnVuY3Rpb24oX29wdGlvbnMuZGVmYXVsdFZhbHVlcykgJiZcbiAgICAgICAgX29wdGlvbnMuZGVmYXVsdFZhbHVlcygpLnRoZW4oKHZhbHVlcykgPT4ge1xuICAgICAgICAgICAgcmVzZXQodmFsdWVzLCBfb3B0aW9ucy5yZXNldE9wdGlvbnMpO1xuICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgY29uc3QgbWV0aG9kcyA9IHtcbiAgICAgICAgY29udHJvbDoge1xuICAgICAgICAgICAgcmVnaXN0ZXIsXG4gICAgICAgICAgICB1bnJlZ2lzdGVyLFxuICAgICAgICAgICAgZ2V0RmllbGRTdGF0ZSxcbiAgICAgICAgICAgIGhhbmRsZVN1Ym1pdCxcbiAgICAgICAgICAgIHNldEVycm9yLFxuICAgICAgICAgICAgX3N1YnNjcmliZSxcbiAgICAgICAgICAgIF9ydW5TY2hlbWEsXG4gICAgICAgICAgICBfZm9jdXNFcnJvcixcbiAgICAgICAgICAgIF9nZXRXYXRjaCxcbiAgICAgICAgICAgIF9nZXREaXJ0eSxcbiAgICAgICAgICAgIF9zZXRWYWxpZCxcbiAgICAgICAgICAgIF9zZXRGaWVsZEFycmF5LFxuICAgICAgICAgICAgX3NldERpc2FibGVkRmllbGQsXG4gICAgICAgICAgICBfc2V0RXJyb3JzLFxuICAgICAgICAgICAgX2dldEZpZWxkQXJyYXksXG4gICAgICAgICAgICBfcmVzZXQsXG4gICAgICAgICAgICBfcmVzZXREZWZhdWx0VmFsdWVzLFxuICAgICAgICAgICAgX3JlbW92ZVVubW91bnRlZCxcbiAgICAgICAgICAgIF9kaXNhYmxlRm9ybSxcbiAgICAgICAgICAgIF9zdWJqZWN0cyxcbiAgICAgICAgICAgIF9wcm94eUZvcm1TdGF0ZSxcbiAgICAgICAgICAgIGdldCBfZmllbGRzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZmllbGRzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBfZm9ybVZhbHVlcygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2Zvcm1WYWx1ZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IF9zdGF0ZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3N0YXRlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldCBfc3RhdGUodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfc3RhdGUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgX2RlZmF1bHRWYWx1ZXMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0VmFsdWVzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBfbmFtZXMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9uYW1lcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQgX25hbWVzKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX25hbWVzID0gdmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IF9mb3JtU3RhdGUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mb3JtU3RhdGU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IF9vcHRpb25zKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfb3B0aW9ucztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQgX29wdGlvbnModmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uX29wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIC4uLnZhbHVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIHRyaWdnZXIsXG4gICAgICAgIHJlZ2lzdGVyLFxuICAgICAgICBoYW5kbGVTdWJtaXQsXG4gICAgICAgIHdhdGNoLFxuICAgICAgICBzZXRWYWx1ZSxcbiAgICAgICAgZ2V0VmFsdWVzLFxuICAgICAgICByZXNldCxcbiAgICAgICAgcmVzZXRGaWVsZCxcbiAgICAgICAgY2xlYXJFcnJvcnMsXG4gICAgICAgIHVucmVnaXN0ZXIsXG4gICAgICAgIHNldEVycm9yLFxuICAgICAgICBzZXRGb2N1cyxcbiAgICAgICAgZ2V0RmllbGRTdGF0ZSxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLm1ldGhvZHMsXG4gICAgICAgIGZvcm1Db250cm9sOiBtZXRob2RzLFxuICAgIH07XG59XG5cbnZhciBnZW5lcmF0ZUlkID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICB9XG4gICAgY29uc3QgZCA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ3VuZGVmaW5lZCcgPyBEYXRlLm5vdygpIDogcGVyZm9ybWFuY2Uubm93KCkgKiAxMDAwO1xuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gICAgICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2ICsgZCkgJSAxNiB8IDA7XG4gICAgICAgIHJldHVybiAoYyA9PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4KS50b1N0cmluZygxNik7XG4gICAgfSk7XG59O1xuXG52YXIgZ2V0Rm9jdXNGaWVsZE5hbWUgPSAobmFtZSwgaW5kZXgsIG9wdGlvbnMgPSB7fSkgPT4gb3B0aW9ucy5zaG91bGRGb2N1cyB8fCBpc1VuZGVmaW5lZChvcHRpb25zLnNob3VsZEZvY3VzKVxuICAgID8gb3B0aW9ucy5mb2N1c05hbWUgfHxcbiAgICAgICAgYCR7bmFtZX0uJHtpc1VuZGVmaW5lZChvcHRpb25zLmZvY3VzSW5kZXgpID8gaW5kZXggOiBvcHRpb25zLmZvY3VzSW5kZXh9LmBcbiAgICA6ICcnO1xuXG52YXIgYXBwZW5kQXQgPSAoZGF0YSwgdmFsdWUpID0+IFtcbiAgICAuLi5kYXRhLFxuICAgIC4uLmNvbnZlcnRUb0FycmF5UGF5bG9hZCh2YWx1ZSksXG5dO1xuXG52YXIgZmlsbEVtcHR5QXJyYXkgPSAodmFsdWUpID0+IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKCgpID0+IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGluc2VydChkYXRhLCBpbmRleCwgdmFsdWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICAuLi5kYXRhLnNsaWNlKDAsIGluZGV4KSxcbiAgICAgICAgLi4uY29udmVydFRvQXJyYXlQYXlsb2FkKHZhbHVlKSxcbiAgICAgICAgLi4uZGF0YS5zbGljZShpbmRleCksXG4gICAgXTtcbn1cblxudmFyIG1vdmVBcnJheUF0ID0gKGRhdGEsIGZyb20sIHRvKSA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKGlzVW5kZWZpbmVkKGRhdGFbdG9dKSkge1xuICAgICAgICBkYXRhW3RvXSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZGF0YS5zcGxpY2UodG8sIDAsIGRhdGEuc3BsaWNlKGZyb20sIDEpWzBdKTtcbiAgICByZXR1cm4gZGF0YTtcbn07XG5cbnZhciBwcmVwZW5kQXQgPSAoZGF0YSwgdmFsdWUpID0+IFtcbiAgICAuLi5jb252ZXJ0VG9BcnJheVBheWxvYWQodmFsdWUpLFxuICAgIC4uLmNvbnZlcnRUb0FycmF5UGF5bG9hZChkYXRhKSxcbl07XG5cbmZ1bmN0aW9uIHJlbW92ZUF0SW5kZXhlcyhkYXRhLCBpbmRleGVzKSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IHRlbXAgPSBbLi4uZGF0YV07XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICAgIHRlbXAuc3BsaWNlKGluZGV4IC0gaSwgMSk7XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBhY3QodGVtcCkubGVuZ3RoID8gdGVtcCA6IFtdO1xufVxudmFyIHJlbW92ZUFycmF5QXQgPSAoZGF0YSwgaW5kZXgpID0+IGlzVW5kZWZpbmVkKGluZGV4KVxuICAgID8gW11cbiAgICA6IHJlbW92ZUF0SW5kZXhlcyhkYXRhLCBjb252ZXJ0VG9BcnJheVBheWxvYWQoaW5kZXgpLnNvcnQoKGEsIGIpID0+IGEgLSBiKSk7XG5cbnZhciBzd2FwQXJyYXlBdCA9IChkYXRhLCBpbmRleEEsIGluZGV4QikgPT4ge1xuICAgIFtkYXRhW2luZGV4QV0sIGRhdGFbaW5kZXhCXV0gPSBbZGF0YVtpbmRleEJdLCBkYXRhW2luZGV4QV1dO1xufTtcblxudmFyIHVwZGF0ZUF0ID0gKGZpZWxkVmFsdWVzLCBpbmRleCwgdmFsdWUpID0+IHtcbiAgICBmaWVsZFZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICByZXR1cm4gZmllbGRWYWx1ZXM7XG59O1xuXG4vKipcbiAqIEEgY3VzdG9tIGhvb2sgdGhhdCBleHBvc2VzIGNvbnZlbmllbnQgbWV0aG9kcyB0byBwZXJmb3JtIG9wZXJhdGlvbnMgd2l0aCBhIGxpc3Qgb2YgZHluYW1pYyBpbnB1dHMgdGhhdCBuZWVkIHRvIGJlIGFwcGVuZGVkLCB1cGRhdGVkLCByZW1vdmVkIGV0Yy4g4oCiIFtEZW1vXShodHRwczovL2NvZGVzYW5kYm94LmlvL3MvcmVhY3QtaG9vay1mb3JtLXVzZWZpZWxkYXJyYXktc3N1Z24pIOKAoiBbVmlkZW9dKGh0dHBzOi8veW91dHUuYmUvNE1yYmZHU0ZZMkEpXG4gKlxuICogQHJlbWFya3NcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZWZpZWxkYXJyYXkpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3JlYWN0LWhvb2stZm9ybS11c2VmaWVsZGFycmF5LXNzdWduKVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIHVzZUZpZWxkQXJyYXkgcHJvcHNcbiAqXG4gKiBAcmV0dXJucyBtZXRob2RzIC0gZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgd2l0aCB0aGUgRmllbGQgQXJyYXlzIChkeW5hbWljIGlucHV0cykge0BsaW5rIFVzZUZpZWxkQXJyYXlSZXR1cm59XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCB7IHJlZ2lzdGVyLCBjb250cm9sLCBoYW5kbGVTdWJtaXQsIHJlc2V0LCB0cmlnZ2VyLCBzZXRFcnJvciB9ID0gdXNlRm9ybSh7XG4gKiAgICAgZGVmYXVsdFZhbHVlczoge1xuICogICAgICAgdGVzdDogW11cbiAqICAgICB9XG4gKiAgIH0pO1xuICogICBjb25zdCB7IGZpZWxkcywgYXBwZW5kIH0gPSB1c2VGaWVsZEFycmF5KHtcbiAqICAgICBjb250cm9sLFxuICogICAgIG5hbWU6IFwidGVzdFwiXG4gKiAgIH0pO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8Zm9ybSBvblN1Ym1pdD17aGFuZGxlU3VibWl0KGRhdGEgPT4gY29uc29sZS5sb2coZGF0YSkpfT5cbiAqICAgICAgIHtmaWVsZHMubWFwKChpdGVtLCBpbmRleCkgPT4gKFxuICogICAgICAgICAgPGlucHV0IGtleT17aXRlbS5pZH0gey4uLnJlZ2lzdGVyKGB0ZXN0LiR7aW5kZXh9LmZpcnN0TmFtZWApfSAgLz5cbiAqICAgICAgICkpfVxuICogICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17KCkgPT4gYXBwZW5kKHsgZmlyc3ROYW1lOiBcImJpbGxcIiB9KX0+XG4gKiAgICAgICAgIGFwcGVuZFxuICogICAgICAgPC9idXR0b24+XG4gKiAgICAgICA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIC8+XG4gKiAgICAgPC9mb3JtPlxuICogICApO1xuICogfVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHVzZUZpZWxkQXJyYXkocHJvcHMpIHtcbiAgICBjb25zdCBtZXRob2RzID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgICBjb25zdCB7IGNvbnRyb2wgPSBtZXRob2RzLmNvbnRyb2wsIG5hbWUsIGtleU5hbWUgPSAnaWQnLCBzaG91bGRVbnJlZ2lzdGVyLCBydWxlcywgfSA9IHByb3BzO1xuICAgIGNvbnN0IFtmaWVsZHMsIHNldEZpZWxkc10gPSBSZWFjdF9fZGVmYXVsdC51c2VTdGF0ZShjb250cm9sLl9nZXRGaWVsZEFycmF5KG5hbWUpKTtcbiAgICBjb25zdCBpZHMgPSBSZWFjdF9fZGVmYXVsdC51c2VSZWYoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKS5tYXAoZ2VuZXJhdGVJZCkpO1xuICAgIGNvbnN0IF9maWVsZElkcyA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZihmaWVsZHMpO1xuICAgIGNvbnN0IF9uYW1lID0gUmVhY3RfX2RlZmF1bHQudXNlUmVmKG5hbWUpO1xuICAgIGNvbnN0IF9hY3Rpb25lZCA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZihmYWxzZSk7XG4gICAgX25hbWUuY3VycmVudCA9IG5hbWU7XG4gICAgX2ZpZWxkSWRzLmN1cnJlbnQgPSBmaWVsZHM7XG4gICAgY29udHJvbC5fbmFtZXMuYXJyYXkuYWRkKG5hbWUpO1xuICAgIHJ1bGVzICYmXG4gICAgICAgIGNvbnRyb2wucmVnaXN0ZXIobmFtZSwgcnVsZXMpO1xuICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4gY29udHJvbC5fc3ViamVjdHMuYXJyYXkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHsgdmFsdWVzLCBuYW1lOiBmaWVsZEFycmF5TmFtZSwgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkQXJyYXlOYW1lID09PSBfbmFtZS5jdXJyZW50IHx8ICFmaWVsZEFycmF5TmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWVzID0gZ2V0KHZhbHVlcywgX25hbWUuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEZpZWxkcyhmaWVsZFZhbHVlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlkcy5jdXJyZW50ID0gZmllbGRWYWx1ZXMubWFwKGdlbmVyYXRlSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KS51bnN1YnNjcmliZSwgW2NvbnRyb2xdKTtcbiAgICBjb25zdCB1cGRhdGVWYWx1ZXMgPSBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjaygodXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMpID0+IHtcbiAgICAgICAgX2FjdGlvbmVkLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICBjb250cm9sLl9zZXRGaWVsZEFycmF5KG5hbWUsIHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICB9LCBbY29udHJvbCwgbmFtZV0pO1xuICAgIGNvbnN0IGFwcGVuZCA9ICh2YWx1ZSwgb3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCBhcHBlbmRWYWx1ZSA9IGNvbnZlcnRUb0FycmF5UGF5bG9hZChjbG9uZU9iamVjdCh2YWx1ZSkpO1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IGFwcGVuZEF0KGNvbnRyb2wuX2dldEZpZWxkQXJyYXkobmFtZSksIGFwcGVuZFZhbHVlKTtcbiAgICAgICAgY29udHJvbC5fbmFtZXMuZm9jdXMgPSBnZXRGb2N1c0ZpZWxkTmFtZShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcy5sZW5ndGggLSAxLCBvcHRpb25zKTtcbiAgICAgICAgaWRzLmN1cnJlbnQgPSBhcHBlbmRBdChpZHMuY3VycmVudCwgYXBwZW5kVmFsdWUubWFwKGdlbmVyYXRlSWQpKTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgYXBwZW5kQXQsIHtcbiAgICAgICAgICAgIGFyZ0E6IGZpbGxFbXB0eUFycmF5KHZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBwcmVwZW5kID0gKHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXBlbmRWYWx1ZSA9IGNvbnZlcnRUb0FycmF5UGF5bG9hZChjbG9uZU9iamVjdCh2YWx1ZSkpO1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IHByZXBlbmRBdChjb250cm9sLl9nZXRGaWVsZEFycmF5KG5hbWUpLCBwcmVwZW5kVmFsdWUpO1xuICAgICAgICBjb250cm9sLl9uYW1lcy5mb2N1cyA9IGdldEZvY3VzRmllbGROYW1lKG5hbWUsIDAsIG9wdGlvbnMpO1xuICAgICAgICBpZHMuY3VycmVudCA9IHByZXBlbmRBdChpZHMuY3VycmVudCwgcHJlcGVuZFZhbHVlLm1hcChnZW5lcmF0ZUlkKSk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIGNvbnRyb2wuX3NldEZpZWxkQXJyYXkobmFtZSwgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIHByZXBlbmRBdCwge1xuICAgICAgICAgICAgYXJnQTogZmlsbEVtcHR5QXJyYXkodmFsdWUpLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHJlbW92ZSA9IChpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IHJlbW92ZUFycmF5QXQoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKSwgaW5kZXgpO1xuICAgICAgICBpZHMuY3VycmVudCA9IHJlbW92ZUFycmF5QXQoaWRzLmN1cnJlbnQsIGluZGV4KTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoZ2V0KGNvbnRyb2wuX2ZpZWxkcywgbmFtZSkpICYmXG4gICAgICAgICAgICBzZXQoY29udHJvbC5fZmllbGRzLCBuYW1lLCB1bmRlZmluZWQpO1xuICAgICAgICBjb250cm9sLl9zZXRGaWVsZEFycmF5KG5hbWUsIHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzLCByZW1vdmVBcnJheUF0LCB7XG4gICAgICAgICAgICBhcmdBOiBpbmRleCxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBpbnNlcnQkMSA9IChpbmRleCwgdmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0VmFsdWUgPSBjb252ZXJ0VG9BcnJheVBheWxvYWQoY2xvbmVPYmplY3QodmFsdWUpKTtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMgPSBpbnNlcnQoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKSwgaW5kZXgsIGluc2VydFZhbHVlKTtcbiAgICAgICAgY29udHJvbC5fbmFtZXMuZm9jdXMgPSBnZXRGb2N1c0ZpZWxkTmFtZShuYW1lLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICAgIGlkcy5jdXJyZW50ID0gaW5zZXJ0KGlkcy5jdXJyZW50LCBpbmRleCwgaW5zZXJ0VmFsdWUubWFwKGdlbmVyYXRlSWQpKTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgaW5zZXJ0LCB7XG4gICAgICAgICAgICBhcmdBOiBpbmRleCxcbiAgICAgICAgICAgIGFyZ0I6IGZpbGxFbXB0eUFycmF5KHZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBzd2FwID0gKGluZGV4QSwgaW5kZXhCKSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzID0gY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKTtcbiAgICAgICAgc3dhcEFycmF5QXQodXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIGluZGV4QSwgaW5kZXhCKTtcbiAgICAgICAgc3dhcEFycmF5QXQoaWRzLmN1cnJlbnQsIGluZGV4QSwgaW5kZXhCKTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgc3dhcEFycmF5QXQsIHtcbiAgICAgICAgICAgIGFyZ0E6IGluZGV4QSxcbiAgICAgICAgICAgIGFyZ0I6IGluZGV4QixcbiAgICAgICAgfSwgZmFsc2UpO1xuICAgIH07XG4gICAgY29uc3QgbW92ZSA9IChmcm9tLCB0bykgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IGNvbnRyb2wuX2dldEZpZWxkQXJyYXkobmFtZSk7XG4gICAgICAgIG1vdmVBcnJheUF0KHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzLCBmcm9tLCB0byk7XG4gICAgICAgIG1vdmVBcnJheUF0KGlkcy5jdXJyZW50LCBmcm9tLCB0byk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIGNvbnRyb2wuX3NldEZpZWxkQXJyYXkobmFtZSwgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIG1vdmVBcnJheUF0LCB7XG4gICAgICAgICAgICBhcmdBOiBmcm9tLFxuICAgICAgICAgICAgYXJnQjogdG8sXG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICB9O1xuICAgIGNvbnN0IHVwZGF0ZSA9IChpbmRleCwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlVmFsdWUgPSBjbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzID0gdXBkYXRlQXQoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKSwgaW5kZXgsIHVwZGF0ZVZhbHVlKTtcbiAgICAgICAgaWRzLmN1cnJlbnQgPSBbLi4udXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXNdLm1hcCgoaXRlbSwgaSkgPT4gIWl0ZW0gfHwgaSA9PT0gaW5kZXggPyBnZW5lcmF0ZUlkKCkgOiBpZHMuY3VycmVudFtpXSk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyhbLi4udXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXNdKTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgdXBkYXRlQXQsIHtcbiAgICAgICAgICAgIGFyZ0E6IGluZGV4LFxuICAgICAgICAgICAgYXJnQjogdXBkYXRlVmFsdWUsXG4gICAgICAgIH0sIHRydWUsIGZhbHNlKTtcbiAgICB9O1xuICAgIGNvbnN0IHJlcGxhY2UgPSAodmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMgPSBjb252ZXJ0VG9BcnJheVBheWxvYWQoY2xvbmVPYmplY3QodmFsdWUpKTtcbiAgICAgICAgaWRzLmN1cnJlbnQgPSB1cGRhdGVkRmllbGRBcnJheVZhbHVlcy5tYXAoZ2VuZXJhdGVJZCk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyhbLi4udXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXNdKTtcbiAgICAgICAgc2V0RmllbGRzKFsuLi51cGRhdGVkRmllbGRBcnJheVZhbHVlc10pO1xuICAgICAgICBjb250cm9sLl9zZXRGaWVsZEFycmF5KG5hbWUsIFsuLi51cGRhdGVkRmllbGRBcnJheVZhbHVlc10sIChkYXRhKSA9PiBkYXRhLCB7fSwgdHJ1ZSwgZmFsc2UpO1xuICAgIH07XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29udHJvbC5fc3RhdGUuYWN0aW9uID0gZmFsc2U7XG4gICAgICAgIGlzV2F0Y2hlZChuYW1lLCBjb250cm9sLl9uYW1lcykgJiZcbiAgICAgICAgICAgIGNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgIC4uLmNvbnRyb2wuX2Zvcm1TdGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoX2FjdGlvbmVkLmN1cnJlbnQgJiZcbiAgICAgICAgICAgICghZ2V0VmFsaWRhdGlvbk1vZGVzKGNvbnRyb2wuX29wdGlvbnMubW9kZSkuaXNPblN1Ym1pdCB8fFxuICAgICAgICAgICAgICAgIGNvbnRyb2wuX2Zvcm1TdGF0ZS5pc1N1Ym1pdHRlZCkgJiZcbiAgICAgICAgICAgICFnZXRWYWxpZGF0aW9uTW9kZXMoY29udHJvbC5fb3B0aW9ucy5yZVZhbGlkYXRlTW9kZSkuaXNPblN1Ym1pdCkge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wuX29wdGlvbnMucmVzb2x2ZXIpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLl9ydW5TY2hlbWEoW25hbWVdKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBnZXQocmVzdWx0LmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nRXJyb3IgPSBnZXQoY29udHJvbC5fZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0Vycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICghZXJyb3IgJiYgZXhpc3RpbmdFcnJvci50eXBlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhpc3RpbmdFcnJvci50eXBlICE9PSBlcnJvci50eXBlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0Vycm9yLm1lc3NhZ2UgIT09IGVycm9yLm1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBlcnJvciAmJiBlcnJvci50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2V0KGNvbnRyb2wuX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUsIGVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5zZXQoY29udHJvbC5fZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLl9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IGNvbnRyb2wuX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoY29udHJvbC5fZmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuX2YgJiZcbiAgICAgICAgICAgICAgICAgICAgIShnZXRWYWxpZGF0aW9uTW9kZXMoY29udHJvbC5fb3B0aW9ucy5yZVZhbGlkYXRlTW9kZSkuaXNPblN1Ym1pdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsaWRhdGlvbk1vZGVzKGNvbnRyb2wuX29wdGlvbnMubW9kZSkuaXNPblN1Ym1pdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVGaWVsZChmaWVsZCwgY29udHJvbC5fbmFtZXMuZGlzYWJsZWQsIGNvbnRyb2wuX2Zvcm1WYWx1ZXMsIGNvbnRyb2wuX29wdGlvbnMuY3JpdGVyaWFNb2RlID09PSBWQUxJREFUSU9OX01PREUuYWxsLCBjb250cm9sLl9vcHRpb25zLnNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24sIHRydWUpLnRoZW4oKGVycm9yKSA9PiAhaXNFbXB0eU9iamVjdChlcnJvcikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yczogdXBkYXRlRmllbGRBcnJheVJvb3RFcnJvcihjb250cm9sLl9mb3JtU3RhdGUuZXJyb3JzLCBlcnJvciwgbmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHZhbHVlczogY2xvbmVPYmplY3QoY29udHJvbC5fZm9ybVZhbHVlcyksXG4gICAgICAgIH0pO1xuICAgICAgICBjb250cm9sLl9uYW1lcy5mb2N1cyAmJlxuICAgICAgICAgICAgaXRlcmF0ZUZpZWxkc0J5QWN0aW9uKGNvbnRyb2wuX2ZpZWxkcywgKHJlZiwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuX25hbWVzLmZvY3VzICYmXG4gICAgICAgICAgICAgICAgICAgIGtleS5zdGFydHNXaXRoKGNvbnRyb2wuX25hbWVzLmZvY3VzKSAmJlxuICAgICAgICAgICAgICAgICAgICByZWYuZm9jdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY29udHJvbC5fbmFtZXMuZm9jdXMgPSAnJztcbiAgICAgICAgY29udHJvbC5fc2V0VmFsaWQoKTtcbiAgICAgICAgX2FjdGlvbmVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9LCBbZmllbGRzLCBuYW1lLCBjb250cm9sXSk7XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgIWdldChjb250cm9sLl9mb3JtVmFsdWVzLCBuYW1lKSAmJiBjb250cm9sLl9zZXRGaWVsZEFycmF5KG5hbWUpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlTW91bnRlZCA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KGNvbnRyb2wuX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLl9mKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLl9mLm1vdW50ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnRyb2wuX29wdGlvbnMuc2hvdWxkVW5yZWdpc3RlciB8fCBzaG91bGRVbnJlZ2lzdGVyXG4gICAgICAgICAgICAgICAgPyBjb250cm9sLnVucmVnaXN0ZXIobmFtZSlcbiAgICAgICAgICAgICAgICA6IHVwZGF0ZU1vdW50ZWQobmFtZSwgZmFsc2UpO1xuICAgICAgICB9O1xuICAgIH0sIFtuYW1lLCBjb250cm9sLCBrZXlOYW1lLCBzaG91bGRVbnJlZ2lzdGVyXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3dhcDogUmVhY3RfX2RlZmF1bHQudXNlQ2FsbGJhY2soc3dhcCwgW3VwZGF0ZVZhbHVlcywgbmFtZSwgY29udHJvbF0pLFxuICAgICAgICBtb3ZlOiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhtb3ZlLCBbdXBkYXRlVmFsdWVzLCBuYW1lLCBjb250cm9sXSksXG4gICAgICAgIHByZXBlbmQ6IFJlYWN0X19kZWZhdWx0LnVzZUNhbGxiYWNrKHByZXBlbmQsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgYXBwZW5kOiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhhcHBlbmQsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgcmVtb3ZlOiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhyZW1vdmUsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgaW5zZXJ0OiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhpbnNlcnQkMSwgW3VwZGF0ZVZhbHVlcywgbmFtZSwgY29udHJvbF0pLFxuICAgICAgICB1cGRhdGU6IFJlYWN0X19kZWZhdWx0LnVzZUNhbGxiYWNrKHVwZGF0ZSwgW3VwZGF0ZVZhbHVlcywgbmFtZSwgY29udHJvbF0pLFxuICAgICAgICByZXBsYWNlOiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhyZXBsYWNlLCBbdXBkYXRlVmFsdWVzLCBuYW1lLCBjb250cm9sXSksXG4gICAgICAgIGZpZWxkczogUmVhY3RfX2RlZmF1bHQudXNlTWVtbygoKSA9PiBmaWVsZHMubWFwKChmaWVsZCwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgICAgIFtrZXlOYW1lXTogaWRzLmN1cnJlbnRbaW5kZXhdIHx8IGdlbmVyYXRlSWQoKSxcbiAgICAgICAgfSkpLCBbZmllbGRzLCBrZXlOYW1lXSksXG4gICAgfTtcbn1cblxuLyoqXG4gKiBDdXN0b20gaG9vayB0byBtYW5hZ2UgdGhlIGVudGlyZSBmb3JtLlxuICpcbiAqIEByZW1hcmtzXG4gKiBbQVBJXShodHRwczovL3JlYWN0LWhvb2stZm9ybS5jb20vZG9jcy91c2Vmb3JtKSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9yZWFjdC1ob29rLWZvcm0tZ2V0LXN0YXJ0ZWQtdHMtNWtzbW0pIOKAoiBbVmlkZW9dKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9UmtYdjRBWFhDXzQpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gZm9ybSBjb25maWd1cmF0aW9uIGFuZCB2YWxpZGF0aW9uIHBhcmFtZXRlcnMuXG4gKlxuICogQHJldHVybnMgbWV0aG9kcyAtIGluZGl2aWR1YWwgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9ybSBzdGF0ZS4ge0BsaW5rIFVzZUZvcm1SZXR1cm59XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCB7IHJlZ2lzdGVyLCBoYW5kbGVTdWJtaXQsIHdhdGNoLCBmb3JtU3RhdGU6IHsgZXJyb3JzIH0gfSA9IHVzZUZvcm0oKTtcbiAqICAgY29uc3Qgb25TdWJtaXQgPSBkYXRhID0+IGNvbnNvbGUubG9nKGRhdGEpO1xuICpcbiAqICAgY29uc29sZS5sb2cod2F0Y2goXCJleGFtcGxlXCIpKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGZvcm0gb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdChvblN1Ym1pdCl9PlxuICogICAgICAgPGlucHV0IGRlZmF1bHRWYWx1ZT1cInRlc3RcIiB7Li4ucmVnaXN0ZXIoXCJleGFtcGxlXCIpfSAvPlxuICogICAgICAgPGlucHV0IHsuLi5yZWdpc3RlcihcImV4YW1wbGVSZXF1aXJlZFwiLCB7IHJlcXVpcmVkOiB0cnVlIH0pfSAvPlxuICogICAgICAge2Vycm9ycy5leGFtcGxlUmVxdWlyZWQgJiYgPHNwYW4+VGhpcyBmaWVsZCBpcyByZXF1aXJlZDwvc3Bhbj59XG4gKiAgICAgICA8YnV0dG9uPlN1Ym1pdDwvYnV0dG9uPlxuICogICAgIDwvZm9ybT5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICovXG5mdW5jdGlvbiB1c2VGb3JtKHByb3BzID0ge30pIHtcbiAgICBjb25zdCBfZm9ybUNvbnRyb2wgPSBSZWFjdF9fZGVmYXVsdC51c2VSZWYodW5kZWZpbmVkKTtcbiAgICBjb25zdCBfdmFsdWVzID0gUmVhY3RfX2RlZmF1bHQudXNlUmVmKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgW2Zvcm1TdGF0ZSwgdXBkYXRlRm9ybVN0YXRlXSA9IFJlYWN0X19kZWZhdWx0LnVzZVN0YXRlKHtcbiAgICAgICAgaXNEaXJ0eTogZmFsc2UsXG4gICAgICAgIGlzVmFsaWRhdGluZzogZmFsc2UsXG4gICAgICAgIGlzTG9hZGluZzogaXNGdW5jdGlvbihwcm9wcy5kZWZhdWx0VmFsdWVzKSxcbiAgICAgICAgaXNTdWJtaXR0ZWQ6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdHRpbmc6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdFN1Y2Nlc3NmdWw6IGZhbHNlLFxuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgc3VibWl0Q291bnQ6IDAsXG4gICAgICAgIGRpcnR5RmllbGRzOiB7fSxcbiAgICAgICAgdG91Y2hlZEZpZWxkczoge30sXG4gICAgICAgIHZhbGlkYXRpbmdGaWVsZHM6IHt9LFxuICAgICAgICBlcnJvcnM6IHByb3BzLmVycm9ycyB8fCB7fSxcbiAgICAgICAgZGlzYWJsZWQ6IHByb3BzLmRpc2FibGVkIHx8IGZhbHNlLFxuICAgICAgICBpc1JlYWR5OiBmYWxzZSxcbiAgICAgICAgZGVmYXVsdFZhbHVlczogaXNGdW5jdGlvbihwcm9wcy5kZWZhdWx0VmFsdWVzKVxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogcHJvcHMuZGVmYXVsdFZhbHVlcyxcbiAgICB9KTtcbiAgICBpZiAoIV9mb3JtQ29udHJvbC5jdXJyZW50KSB7XG4gICAgICAgIGlmIChwcm9wcy5mb3JtQ29udHJvbCkge1xuICAgICAgICAgICAgX2Zvcm1Db250cm9sLmN1cnJlbnQgPSB7XG4gICAgICAgICAgICAgICAgLi4ucHJvcHMuZm9ybUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgZm9ybVN0YXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWVzICYmICFpc0Z1bmN0aW9uKHByb3BzLmRlZmF1bHRWYWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgcHJvcHMuZm9ybUNvbnRyb2wucmVzZXQocHJvcHMuZGVmYXVsdFZhbHVlcywgcHJvcHMucmVzZXRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm9ybUNvbnRyb2wsIC4uLnJlc3QgfSA9IGNyZWF0ZUZvcm1Db250cm9sKHByb3BzKTtcbiAgICAgICAgICAgIF9mb3JtQ29udHJvbC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgICAgIC4uLnJlc3QsXG4gICAgICAgICAgICAgICAgZm9ybVN0YXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb250cm9sID0gX2Zvcm1Db250cm9sLmN1cnJlbnQuY29udHJvbDtcbiAgICBjb250cm9sLl9vcHRpb25zID0gcHJvcHM7XG4gICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1YiA9IGNvbnRyb2wuX3N1YnNjcmliZSh7XG4gICAgICAgICAgICBmb3JtU3RhdGU6IGNvbnRyb2wuX3Byb3h5Rm9ybVN0YXRlLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHVwZGF0ZUZvcm1TdGF0ZSh7IC4uLmNvbnRyb2wuX2Zvcm1TdGF0ZSB9KSxcbiAgICAgICAgICAgIHJlUmVuZGVyUm9vdDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0ZUZvcm1TdGF0ZSgoZGF0YSkgPT4gKHtcbiAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICBpc1JlYWR5OiB0cnVlLFxuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnRyb2wuX2Zvcm1TdGF0ZS5pc1JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHN1YjtcbiAgICB9LCBbY29udHJvbF0pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiBjb250cm9sLl9kaXNhYmxlRm9ybShwcm9wcy5kaXNhYmxlZCksIFtjb250cm9sLCBwcm9wcy5kaXNhYmxlZF0pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChwcm9wcy5tb2RlKSB7XG4gICAgICAgICAgICBjb250cm9sLl9vcHRpb25zLm1vZGUgPSBwcm9wcy5tb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wcy5yZVZhbGlkYXRlTW9kZSkge1xuICAgICAgICAgICAgY29udHJvbC5fb3B0aW9ucy5yZVZhbGlkYXRlTW9kZSA9IHByb3BzLnJlVmFsaWRhdGVNb2RlO1xuICAgICAgICB9XG4gICAgfSwgW2NvbnRyb2wsIHByb3BzLm1vZGUsIHByb3BzLnJlVmFsaWRhdGVNb2RlXSk7XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHByb3BzLmVycm9ycykge1xuICAgICAgICAgICAgY29udHJvbC5fc2V0RXJyb3JzKHByb3BzLmVycm9ycyk7XG4gICAgICAgICAgICBjb250cm9sLl9mb2N1c0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICB9LCBbY29udHJvbCwgcHJvcHMuZXJyb3JzXSk7XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgcHJvcHMuc2hvdWxkVW5yZWdpc3RlciAmJlxuICAgICAgICAgICAgY29udHJvbC5fc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiBjb250cm9sLl9nZXRXYXRjaCgpLFxuICAgICAgICAgICAgfSk7XG4gICAgfSwgW2NvbnRyb2wsIHByb3BzLnNob3VsZFVucmVnaXN0ZXJdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoY29udHJvbC5fcHJveHlGb3JtU3RhdGUuaXNEaXJ0eSkge1xuICAgICAgICAgICAgY29uc3QgaXNEaXJ0eSA9IGNvbnRyb2wuX2dldERpcnR5KCk7XG4gICAgICAgICAgICBpZiAoaXNEaXJ0eSAhPT0gZm9ybVN0YXRlLmlzRGlydHkpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLl9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgaXNEaXJ0eSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIFtjb250cm9sLCBmb3JtU3RhdGUuaXNEaXJ0eV0pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChwcm9wcy52YWx1ZXMgJiYgIWRlZXBFcXVhbChwcm9wcy52YWx1ZXMsIF92YWx1ZXMuY3VycmVudCkpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuX3Jlc2V0KHByb3BzLnZhbHVlcywge1xuICAgICAgICAgICAgICAgIGtlZXBGaWVsZHNSZWY6IHRydWUsXG4gICAgICAgICAgICAgICAgLi4uY29udHJvbC5fb3B0aW9ucy5yZXNldE9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF92YWx1ZXMuY3VycmVudCA9IHByb3BzLnZhbHVlcztcbiAgICAgICAgICAgIHVwZGF0ZUZvcm1TdGF0ZSgoc3RhdGUpID0+ICh7IC4uLnN0YXRlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyb2wuX3Jlc2V0RGVmYXVsdFZhbHVlcygpO1xuICAgICAgICB9XG4gICAgfSwgW2NvbnRyb2wsIHByb3BzLnZhbHVlc10pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICghY29udHJvbC5fc3RhdGUubW91bnQpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuX3NldFZhbGlkKCk7XG4gICAgICAgICAgICBjb250cm9sLl9zdGF0ZS5tb3VudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2wuX3N0YXRlLndhdGNoKSB7XG4gICAgICAgICAgICBjb250cm9sLl9zdGF0ZS53YXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgY29udHJvbC5fc3ViamVjdHMuc3RhdGUubmV4dCh7IC4uLmNvbnRyb2wuX2Zvcm1TdGF0ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sLl9yZW1vdmVVbm1vdW50ZWQoKTtcbiAgICB9KTtcbiAgICBfZm9ybUNvbnRyb2wuY3VycmVudC5mb3JtU3RhdGUgPSBnZXRQcm94eUZvcm1TdGF0ZShmb3JtU3RhdGUsIGNvbnRyb2wpO1xuICAgIHJldHVybiBfZm9ybUNvbnRyb2wuY3VycmVudDtcbn1cblxuZXhwb3J0IHsgQ29udHJvbGxlciwgRm9ybSwgRm9ybVByb3ZpZGVyLCBhcHBlbmRFcnJvcnMsIGNyZWF0ZUZvcm1Db250cm9sLCBnZXQsIHNldCwgdXNlQ29udHJvbGxlciwgdXNlRmllbGRBcnJheSwgdXNlRm9ybSwgdXNlRm9ybUNvbnRleHQsIHVzZUZvcm1TdGF0ZSwgdXNlV2F0Y2ggfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbS5tanMubWFwXG4iLAogICAgIid1c2UgY2xpZW50J1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIExhYmVsUHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1sYWJlbCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gTGFiZWwoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgTGFiZWxQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIChcbiAgICA8TGFiZWxQcmltaXRpdmUuUm9vdFxuICAgICAgZGF0YS1zbG90PVwibGFiZWxcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHRleHQtc20gbGVhZGluZy1ub25lIGZvbnQtbWVkaXVtIHNlbGVjdC1ub25lIGdyb3VwLWRhdGEtW2Rpc2FibGVkPXRydWVdOnBvaW50ZXItZXZlbnRzLW5vbmUgZ3JvdXAtZGF0YS1bZGlzYWJsZWQ9dHJ1ZV06b3BhY2l0eS01MCBwZWVyLWRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBwZWVyLWRpc2FibGVkOm9wYWNpdHktNTAnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBMYWJlbCB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBJbnB1dCh7IGNsYXNzTmFtZSwgdHlwZSwgLi4ucHJvcHMgfTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2lucHV0Jz4pIHtcbiAgcmV0dXJuIChcbiAgICA8aW5wdXRcbiAgICAgIHR5cGU9e3R5cGV9XG4gICAgICBkYXRhLXNsb3Q9XCJpbnB1dFwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZmlsZTp0ZXh0LWZvcmVncm91bmQgcGxhY2Vob2xkZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHNlbGVjdGlvbjpiZy1wcmltYXJ5IHNlbGVjdGlvbjp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBkYXJrOmJnLWlucHV0LzMwIGJvcmRlci1pbnB1dCBmbGV4IGgtOSB3LWZ1bGwgbWluLXctMCByb3VuZGVkLW1kIGJvcmRlciBiZy10cmFuc3BhcmVudCBweC0zIHB5LTEgdGV4dC1iYXNlIHNoYWRvdy14cyB0cmFuc2l0aW9uLVtjb2xvcixib3gtc2hhZG93XSBvdXRsaW5lLW5vbmUgZmlsZTppbmxpbmUtZmxleCBmaWxlOmgtNyBmaWxlOmJvcmRlci0wIGZpbGU6YmctdHJhbnNwYXJlbnQgZmlsZTp0ZXh0LXNtIGZpbGU6Zm9udC1tZWRpdW0gZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCBtZDp0ZXh0LXNtJyxcbiAgICAgICAgJ2ZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgZm9jdXMtdmlzaWJsZTpyaW5nLVszcHhdJyxcbiAgICAgICAgJ2FyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6YXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvNDAgYXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZScsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmV4cG9ydCB7IElucHV0IH1cbiIsCiAgICAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgKiBhcyBTY3JvbGxBcmVhUHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1zY3JvbGwtYXJlYSdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gU2Nyb2xsQXJlYSh7XG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2Nyb2xsQXJlYVByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gKFxuICAgIDxTY3JvbGxBcmVhUHJpbWl0aXZlLlJvb3RcbiAgICAgIGRhdGEtc2xvdD1cInNjcm9sbC1hcmVhXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ3JlbGF0aXZlJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICA8U2Nyb2xsQXJlYVByaW1pdGl2ZS5WaWV3cG9ydFxuICAgICAgICBkYXRhLXNsb3Q9XCJzY3JvbGwtYXJlYS12aWV3cG9ydFwiXG4gICAgICAgIGNsYXNzTmFtZT1cImZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIHNpemUtZnVsbCByb3VuZGVkLVtpbmhlcml0XSB0cmFuc2l0aW9uLVtjb2xvcixib3gtc2hhZG93XSBvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLVszcHhdIGZvY3VzLXZpc2libGU6b3V0bGluZS0xXCJcbiAgICAgID5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9TY3JvbGxBcmVhUHJpbWl0aXZlLlZpZXdwb3J0PlxuICAgICAgPFNjcm9sbEJhciAvPlxuICAgICAgPFNjcm9sbEFyZWFQcmltaXRpdmUuQ29ybmVyIC8+XG4gICAgPC9TY3JvbGxBcmVhUHJpbWl0aXZlLlJvb3Q+XG4gIClcbn1cblxuZnVuY3Rpb24gU2Nyb2xsQmFyKHtcbiAgY2xhc3NOYW1lLFxuICBvcmllbnRhdGlvbiA9ICd2ZXJ0aWNhbCcsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2Nyb2xsQXJlYVByaW1pdGl2ZS5TY3JvbGxBcmVhU2Nyb2xsYmFyPikge1xuICByZXR1cm4gKFxuICAgIDxTY3JvbGxBcmVhUHJpbWl0aXZlLlNjcm9sbEFyZWFTY3JvbGxiYXJcbiAgICAgIGRhdGEtc2xvdD1cInNjcm9sbC1hcmVhLXNjcm9sbGJhclwiXG4gICAgICBvcmllbnRhdGlvbj17b3JpZW50YXRpb259XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZmxleCB0b3VjaC1ub25lIHAtcHggdHJhbnNpdGlvbi1jb2xvcnMgc2VsZWN0LW5vbmUnLFxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyAmJlxuICAgICAgICAgICdoLWZ1bGwgdy0yLjUgYm9yZGVyLWwgYm9yZGVyLWwtdHJhbnNwYXJlbnQnLFxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnICYmXG4gICAgICAgICAgJ2gtMi41IGZsZXgtY29sIGJvcmRlci10IGJvcmRlci10LXRyYW5zcGFyZW50JyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxTY3JvbGxBcmVhUHJpbWl0aXZlLlNjcm9sbEFyZWFUaHVtYlxuICAgICAgICBkYXRhLXNsb3Q9XCJzY3JvbGwtYXJlYS10aHVtYlwiXG4gICAgICAgIGNsYXNzTmFtZT1cImJnLWJvcmRlciByZWxhdGl2ZSBmbGV4LTEgcm91bmRlZC1mdWxsXCJcbiAgICAgIC8+XG4gICAgPC9TY3JvbGxBcmVhUHJpbWl0aXZlLlNjcm9sbEFyZWFTY3JvbGxiYXI+XG4gIClcbn1cblxuZXhwb3J0IHsgU2Nyb2xsQXJlYSwgU2Nyb2xsQmFyIH1cbiIsCiAgICAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgKiBhcyBTZWxlY3RQcmltaXRpdmUgZnJvbSAnQHJhZGl4LXVpL3JlYWN0LXNlbGVjdCdcbmltcG9ydCB7IENoZWNrSWNvbiwgQ2hldnJvbkRvd25JY29uLCBDaGV2cm9uVXBJY29uIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBTZWxlY3Qoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gPFNlbGVjdFByaW1pdGl2ZS5Sb290IGRhdGEtc2xvdD1cInNlbGVjdFwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gU2VsZWN0R3JvdXAoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5Hcm91cD4pIHtcbiAgcmV0dXJuIDxTZWxlY3RQcmltaXRpdmUuR3JvdXAgZGF0YS1zbG90PVwic2VsZWN0LWdyb3VwXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBTZWxlY3RWYWx1ZSh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2VsZWN0UHJpbWl0aXZlLlZhbHVlPikge1xuICByZXR1cm4gPFNlbGVjdFByaW1pdGl2ZS5WYWx1ZSBkYXRhLXNsb3Q9XCJzZWxlY3QtdmFsdWVcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIFNlbGVjdFRyaWdnZXIoe1xuICBjbGFzc05hbWUsXG4gIHNpemUgPSAnZGVmYXVsdCcsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5UcmlnZ2VyPiAmIHtcbiAgc2l6ZT86ICdzbScgfCAnZGVmYXVsdCdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0UHJpbWl0aXZlLlRyaWdnZXJcbiAgICAgIGRhdGEtc2xvdD1cInNlbGVjdC10cmlnZ2VyXCJcbiAgICAgIGRhdGEtc2l6ZT17c2l6ZX1cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgIFwiYm9yZGVyLWlucHV0IGRhdGEtW3BsYWNlaG9sZGVyXTp0ZXh0LW11dGVkLWZvcmVncm91bmQgWyZfc3ZnOm5vdChbY2xhc3MqPSd0ZXh0LSddKV06dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazphcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS80MCBhcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlIGRhcms6YmctaW5wdXQvMzAgZGFyazpob3ZlcjpiZy1pbnB1dC81MCBmbGV4IHctZml0IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTIgcm91bmRlZC1tZCBib3JkZXIgYmctdHJhbnNwYXJlbnQgcHgtMyBweS0yIHRleHQtc20gd2hpdGVzcGFjZS1ub3dyYXAgc2hhZG93LXhzIHRyYW5zaXRpb24tW2NvbG9yLGJveC1zaGFkb3ddIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0gZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAgZGF0YS1bc2l6ZT1kZWZhdWx0XTpoLTkgZGF0YS1bc2l6ZT1zbV06aC04ICo6ZGF0YS1bc2xvdD1zZWxlY3QtdmFsdWVdOmxpbmUtY2xhbXAtMSAqOmRhdGEtW3Nsb3Q9c2VsZWN0LXZhbHVlXTpmbGV4ICo6ZGF0YS1bc2xvdD1zZWxlY3QtdmFsdWVdOml0ZW1zLWNlbnRlciAqOmRhdGEtW3Nsb3Q9c2VsZWN0LXZhbHVlXTpnYXAtMiBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIixcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDxTZWxlY3RQcmltaXRpdmUuSWNvbiBhc0NoaWxkPlxuICAgICAgICA8Q2hldnJvbkRvd25JY29uIGNsYXNzTmFtZT1cInNpemUtNCBvcGFjaXR5LTUwXCIgLz5cbiAgICAgIDwvU2VsZWN0UHJpbWl0aXZlLkljb24+XG4gICAgPC9TZWxlY3RQcmltaXRpdmUuVHJpZ2dlcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWxlY3RDb250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgcG9zaXRpb24gPSAncG9wcGVyJyxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZWxlY3RQcmltaXRpdmUuQ29udGVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0UHJpbWl0aXZlLlBvcnRhbD5cbiAgICAgIDxTZWxlY3RQcmltaXRpdmUuQ29udGVudFxuICAgICAgICBkYXRhLXNsb3Q9XCJzZWxlY3QtY29udGVudFwiXG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2JnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQgZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZGF0YS1bc3RhdGU9Y2xvc2VkXTp6b29tLW91dC05NSBkYXRhLVtzdGF0ZT1vcGVuXTp6b29tLWluLTk1IGRhdGEtW3NpZGU9Ym90dG9tXTpzbGlkZS1pbi1mcm9tLXRvcC0yIGRhdGEtW3NpZGU9bGVmdF06c2xpZGUtaW4tZnJvbS1yaWdodC0yIGRhdGEtW3NpZGU9cmlnaHRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGRhdGEtW3NpZGU9dG9wXTpzbGlkZS1pbi1mcm9tLWJvdHRvbS0yIHJlbGF0aXZlIHotNTAgbWF4LWgtKC0tcmFkaXgtc2VsZWN0LWNvbnRlbnQtYXZhaWxhYmxlLWhlaWdodCkgbWluLXctWzhyZW1dIG9yaWdpbi0oLS1yYWRpeC1zZWxlY3QtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luKSBvdmVyZmxvdy14LWhpZGRlbiBvdmVyZmxvdy15LWF1dG8gcm91bmRlZC1tZCBib3JkZXIgc2hhZG93LW1kJyxcbiAgICAgICAgICBwb3NpdGlvbiA9PT0gJ3BvcHBlcicgJiZcbiAgICAgICAgICAgICdkYXRhLVtzaWRlPWJvdHRvbV06dHJhbnNsYXRlLXktMSBkYXRhLVtzaWRlPWxlZnRdOi10cmFuc2xhdGUteC0xIGRhdGEtW3NpZGU9cmlnaHRdOnRyYW5zbGF0ZS14LTEgZGF0YS1bc2lkZT10b3BdOi10cmFuc2xhdGUteS0xJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgcG9zaXRpb249e3Bvc2l0aW9ufVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICA+XG4gICAgICAgIDxTZWxlY3RTY3JvbGxVcEJ1dHRvbiAvPlxuICAgICAgICA8U2VsZWN0UHJpbWl0aXZlLlZpZXdwb3J0XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICdwLTEnLFxuICAgICAgICAgICAgcG9zaXRpb24gPT09ICdwb3BwZXInICYmXG4gICAgICAgICAgICAgICdoLVt2YXIoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci1oZWlnaHQpXSB3LWZ1bGwgbWluLXctW3ZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLXdpZHRoKV0gc2Nyb2xsLW15LTEnXG4gICAgICAgICAgKX1cbiAgICAgICAgPlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9TZWxlY3RQcmltaXRpdmUuVmlld3BvcnQ+XG4gICAgICAgIDxTZWxlY3RTY3JvbGxEb3duQnV0dG9uIC8+XG4gICAgICA8L1NlbGVjdFByaW1pdGl2ZS5Db250ZW50PlxuICAgIDwvU2VsZWN0UHJpbWl0aXZlLlBvcnRhbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWxlY3RMYWJlbCh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZWxlY3RQcmltaXRpdmUuTGFiZWw+KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFByaW1pdGl2ZS5MYWJlbFxuICAgICAgZGF0YS1zbG90PVwic2VsZWN0LWxhYmVsXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCBweC0yIHB5LTEuNSB0ZXh0LXhzJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFNlbGVjdEl0ZW0oe1xuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5JdGVtPikge1xuICByZXR1cm4gKFxuICAgIDxTZWxlY3RQcmltaXRpdmUuSXRlbVxuICAgICAgZGF0YS1zbG90PVwic2VsZWN0LWl0ZW1cIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgXCJmb2N1czpiZy1hY2NlbnQgZm9jdXM6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCBbJl9zdmc6bm90KFtjbGFzcyo9J3RleHQtJ10pXTp0ZXh0LW11dGVkLWZvcmVncm91bmQgcmVsYXRpdmUgZmxleCB3LWZ1bGwgY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtc20gcHktMS41IHByLTggcGwtMiB0ZXh0LXNtIG91dGxpbmUtaGlkZGVuIHNlbGVjdC1ub25lIGRhdGEtW2Rpc2FibGVkXTpwb2ludGVyLWV2ZW50cy1ub25lIGRhdGEtW2Rpc2FibGVkXTpvcGFjaXR5LTUwIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnNocmluay0wIFsmX3N2Zzpub3QoW2NsYXNzKj0nc2l6ZS0nXSldOnNpemUtNCAqOltzcGFuXTpsYXN0OmZsZXggKjpbc3Bhbl06bGFzdDppdGVtcy1jZW50ZXIgKjpbc3Bhbl06bGFzdDpnYXAtMlwiLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMiBmbGV4IHNpemUtMy41IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICA8U2VsZWN0UHJpbWl0aXZlLkl0ZW1JbmRpY2F0b3I+XG4gICAgICAgICAgPENoZWNrSWNvbiBjbGFzc05hbWU9XCJzaXplLTRcIiAvPlxuICAgICAgICA8L1NlbGVjdFByaW1pdGl2ZS5JdGVtSW5kaWNhdG9yPlxuICAgICAgPC9zcGFuPlxuICAgICAgPFNlbGVjdFByaW1pdGl2ZS5JdGVtVGV4dD57Y2hpbGRyZW59PC9TZWxlY3RQcmltaXRpdmUuSXRlbVRleHQ+XG4gICAgPC9TZWxlY3RQcmltaXRpdmUuSXRlbT5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWxlY3RTZXBhcmF0b3Ioe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2VsZWN0UHJpbWl0aXZlLlNlcGFyYXRvcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0UHJpbWl0aXZlLlNlcGFyYXRvclxuICAgICAgZGF0YS1zbG90PVwic2VsZWN0LXNlcGFyYXRvclwiXG4gICAgICBjbGFzc05hbWU9e2NuKCdiZy1ib3JkZXIgcG9pbnRlci1ldmVudHMtbm9uZSAtbXgtMSBteS0xIGgtcHgnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gU2VsZWN0U2Nyb2xsVXBCdXR0b24oe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2VsZWN0UHJpbWl0aXZlLlNjcm9sbFVwQnV0dG9uPikge1xuICByZXR1cm4gKFxuICAgIDxTZWxlY3RQcmltaXRpdmUuU2Nyb2xsVXBCdXR0b25cbiAgICAgIGRhdGEtc2xvdD1cInNlbGVjdC1zY3JvbGwtdXAtYnV0dG9uXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdmbGV4IGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweS0xJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxDaGV2cm9uVXBJY29uIGNsYXNzTmFtZT1cInNpemUtNFwiIC8+XG4gICAgPC9TZWxlY3RQcmltaXRpdmUuU2Nyb2xsVXBCdXR0b24+XG4gIClcbn1cblxuZnVuY3Rpb24gU2VsZWN0U2Nyb2xsRG93bkJ1dHRvbih7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZWxlY3RQcmltaXRpdmUuU2Nyb2xsRG93bkJ1dHRvbj4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0UHJpbWl0aXZlLlNjcm9sbERvd25CdXR0b25cbiAgICAgIGRhdGEtc2xvdD1cInNlbGVjdC1zY3JvbGwtZG93bi1idXR0b25cIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2ZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgPlxuICAgICAgPENoZXZyb25Eb3duSWNvbiBjbGFzc05hbWU9XCJzaXplLTRcIiAvPlxuICAgIDwvU2VsZWN0UHJpbWl0aXZlLlNjcm9sbERvd25CdXR0b24+XG4gIClcbn1cblxuZXhwb3J0IHtcbiAgU2VsZWN0LFxuICBTZWxlY3RDb250ZW50LFxuICBTZWxlY3RHcm91cCxcbiAgU2VsZWN0SXRlbSxcbiAgU2VsZWN0TGFiZWwsXG4gIFNlbGVjdFNjcm9sbERvd25CdXR0b24sXG4gIFNlbGVjdFNjcm9sbFVwQnV0dG9uLFxuICBTZWxlY3RTZXBhcmF0b3IsXG4gIFNlbGVjdFRyaWdnZXIsXG4gIFNlbGVjdFZhbHVlLFxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIFNlcGFyYXRvclByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3Qtc2VwYXJhdG9yJ1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBTZXBhcmF0b3Ioe1xuICBjbGFzc05hbWUsXG4gIG9yaWVudGF0aW9uID0gJ2hvcml6b250YWwnLFxuICBkZWNvcmF0aXZlID0gdHJ1ZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZXBhcmF0b3JQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VwYXJhdG9yUHJpbWl0aXZlLlJvb3RcbiAgICAgIGRhdGEtc2xvdD1cInNlcGFyYXRvci1yb290XCJcbiAgICAgIGRlY29yYXRpdmU9e2RlY29yYXRpdmV9XG4gICAgICBvcmllbnRhdGlvbj17b3JpZW50YXRpb259XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnYmctYm9yZGVyIHNocmluay0wIGRhdGEtW29yaWVudGF0aW9uPWhvcml6b250YWxdOmgtcHggZGF0YS1bb3JpZW50YXRpb249aG9yaXpvbnRhbF06dy1mdWxsIGRhdGEtW29yaWVudGF0aW9uPXZlcnRpY2FsXTpoLWZ1bGwgZGF0YS1bb3JpZW50YXRpb249dmVydGljYWxdOnctcHgnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBTZXBhcmF0b3IgfVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIFNoZWV0UHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1kaWFsb2cnXG5pbXBvcnQgeyBYSWNvbiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gU2hlZXQoeyAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2hlZXRQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIDxTaGVldFByaW1pdGl2ZS5Sb290IGRhdGEtc2xvdD1cInNoZWV0XCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBTaGVldFRyaWdnZXIoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNoZWV0UHJpbWl0aXZlLlRyaWdnZXI+KSB7XG4gIHJldHVybiA8U2hlZXRQcmltaXRpdmUuVHJpZ2dlciBkYXRhLXNsb3Q9XCJzaGVldC10cmlnZ2VyXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBTaGVldENsb3NlKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTaGVldFByaW1pdGl2ZS5DbG9zZT4pIHtcbiAgcmV0dXJuIDxTaGVldFByaW1pdGl2ZS5DbG9zZSBkYXRhLXNsb3Q9XCJzaGVldC1jbG9zZVwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gU2hlZXRQb3J0YWwoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNoZWV0UHJpbWl0aXZlLlBvcnRhbD4pIHtcbiAgcmV0dXJuIDxTaGVldFByaW1pdGl2ZS5Qb3J0YWwgZGF0YS1zbG90PVwic2hlZXQtcG9ydGFsXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBTaGVldE92ZXJsYXkoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2hlZXRQcmltaXRpdmUuT3ZlcmxheT4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2hlZXRQcmltaXRpdmUuT3ZlcmxheVxuICAgICAgZGF0YS1zbG90PVwic2hlZXQtb3ZlcmxheVwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZml4ZWQgaW5zZXQtMCB6LTUwIGJnLWJsYWNrLzUwJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gU2hlZXRDb250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgc2lkZSA9ICdyaWdodCcsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2hlZXRQcmltaXRpdmUuQ29udGVudD4gJiB7XG4gIHNpZGU/OiAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0J1xufSkge1xuICByZXR1cm4gKFxuICAgIDxTaGVldFBvcnRhbD5cbiAgICAgIDxTaGVldE92ZXJsYXkgLz5cbiAgICAgIDxTaGVldFByaW1pdGl2ZS5Db250ZW50XG4gICAgICAgIGRhdGEtc2xvdD1cInNoZWV0LWNvbnRlbnRcIlxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdiZy1iYWNrZ3JvdW5kIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBmaXhlZCB6LTUwIGZsZXggZmxleC1jb2wgZ2FwLTQgc2hhZG93LWxnIHRyYW5zaXRpb24gZWFzZS1pbi1vdXQgZGF0YS1bc3RhdGU9Y2xvc2VkXTpkdXJhdGlvbi0zMDAgZGF0YS1bc3RhdGU9b3Blbl06ZHVyYXRpb24tNTAwJyxcbiAgICAgICAgICBzaWRlID09PSAncmlnaHQnICYmXG4gICAgICAgICAgICAnZGF0YS1bc3RhdGU9Y2xvc2VkXTpzbGlkZS1vdXQtdG8tcmlnaHQgZGF0YS1bc3RhdGU9b3Blbl06c2xpZGUtaW4tZnJvbS1yaWdodCBpbnNldC15LTAgcmlnaHQtMCBoLWZ1bGwgdy0zLzQgYm9yZGVyLWwgc206bWF4LXctc20nLFxuICAgICAgICAgIHNpZGUgPT09ICdsZWZ0JyAmJlxuICAgICAgICAgICAgJ2RhdGEtW3N0YXRlPWNsb3NlZF06c2xpZGUtb3V0LXRvLWxlZnQgZGF0YS1bc3RhdGU9b3Blbl06c2xpZGUtaW4tZnJvbS1sZWZ0IGluc2V0LXktMCBsZWZ0LTAgaC1mdWxsIHctMy80IGJvcmRlci1yIHNtOm1heC13LXNtJyxcbiAgICAgICAgICBzaWRlID09PSAndG9wJyAmJlxuICAgICAgICAgICAgJ2RhdGEtW3N0YXRlPWNsb3NlZF06c2xpZGUtb3V0LXRvLXRvcCBkYXRhLVtzdGF0ZT1vcGVuXTpzbGlkZS1pbi1mcm9tLXRvcCBpbnNldC14LTAgdG9wLTAgaC1hdXRvIGJvcmRlci1iJyxcbiAgICAgICAgICBzaWRlID09PSAnYm90dG9tJyAmJlxuICAgICAgICAgICAgJ2RhdGEtW3N0YXRlPWNsb3NlZF06c2xpZGUtb3V0LXRvLWJvdHRvbSBkYXRhLVtzdGF0ZT1vcGVuXTpzbGlkZS1pbi1mcm9tLWJvdHRvbSBpbnNldC14LTAgYm90dG9tLTAgaC1hdXRvIGJvcmRlci10JyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgPlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDxTaGVldFByaW1pdGl2ZS5DbG9zZSBjbGFzc05hbWU9XCJyaW5nLW9mZnNldC1iYWNrZ3JvdW5kIGZvY3VzOnJpbmctcmluZyBkYXRhLVtzdGF0ZT1vcGVuXTpiZy1zZWNvbmRhcnkgYWJzb2x1dGUgdG9wLTQgcmlnaHQtNCByb3VuZGVkLXhzIG9wYWNpdHktNzAgdHJhbnNpdGlvbi1vcGFjaXR5IGhvdmVyOm9wYWNpdHktMTAwIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLW9mZnNldC0yIGZvY3VzOm91dGxpbmUtaGlkZGVuIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICA8WEljb24gY2xhc3NOYW1lPVwic2l6ZS00XCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XG4gICAgICAgIDwvU2hlZXRQcmltaXRpdmUuQ2xvc2U+XG4gICAgICA8L1NoZWV0UHJpbWl0aXZlLkNvbnRlbnQ+XG4gICAgPC9TaGVldFBvcnRhbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBTaGVldEhlYWRlcih7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2Rpdic+KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS1zbG90PVwic2hlZXQtaGVhZGVyXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ2ZsZXggZmxleC1jb2wgZ2FwLTEuNSBwLTQnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gU2hlZXRGb290ZXIoeyBjbGFzc05hbWUsIC4uLnByb3BzIH06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdkaXYnPikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtc2xvdD1cInNoZWV0LWZvb3RlclwiXG4gICAgICBjbGFzc05hbWU9e2NuKCdtdC1hdXRvIGZsZXggZmxleC1jb2wgZ2FwLTIgcC00JywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFNoZWV0VGl0bGUoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2hlZXRQcmltaXRpdmUuVGl0bGU+KSB7XG4gIHJldHVybiAoXG4gICAgPFNoZWV0UHJpbWl0aXZlLlRpdGxlXG4gICAgICBkYXRhLXNsb3Q9XCJzaGVldC10aXRsZVwiXG4gICAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LWZvcmVncm91bmQgZm9udC1zZW1pYm9sZCcsIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBTaGVldERlc2NyaXB0aW9uKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNoZWV0UHJpbWl0aXZlLkRlc2NyaXB0aW9uPikge1xuICByZXR1cm4gKFxuICAgIDxTaGVldFByaW1pdGl2ZS5EZXNjcmlwdGlvblxuICAgICAgZGF0YS1zbG90PVwic2hlZXQtZGVzY3JpcHRpb25cIlxuICAgICAgY2xhc3NOYW1lPXtjbigndGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRleHQtc20nLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHtcbiAgU2hlZXQsXG4gIFNoZWV0VHJpZ2dlcixcbiAgU2hlZXRDbG9zZSxcbiAgU2hlZXRDb250ZW50LFxuICBTaGVldEhlYWRlcixcbiAgU2hlZXRGb290ZXIsXG4gIFNoZWV0VGl0bGUsXG4gIFNoZWV0RGVzY3JpcHRpb24sXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgVGFic1ByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtdGFicydcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gVGFicyh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBUYWJzUHJpbWl0aXZlLlJvb3Q+KSB7XG4gIHJldHVybiAoXG4gICAgPFRhYnNQcmltaXRpdmUuUm9vdFxuICAgICAgZGF0YS1zbG90PVwidGFic1wiXG4gICAgICBjbGFzc05hbWU9e2NuKCdmbGV4IGZsZXgtY29sIGdhcC0yJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFRhYnNMaXN0KHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFRhYnNQcmltaXRpdmUuTGlzdD4pIHtcbiAgcmV0dXJuIChcbiAgICA8VGFic1ByaW1pdGl2ZS5MaXN0XG4gICAgICBkYXRhLXNsb3Q9XCJ0YWJzLWxpc3RcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2JnLW11dGVkIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBpbmxpbmUtZmxleCBoLTkgdy1maXQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbGcgcC1bM3B4XScsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFRhYnNUcmlnZ2VyKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFRhYnNQcmltaXRpdmUuVHJpZ2dlcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8VGFic1ByaW1pdGl2ZS5UcmlnZ2VyXG4gICAgICBkYXRhLXNsb3Q9XCJ0YWJzLXRyaWdnZXJcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgXCJkYXRhLVtzdGF0ZT1hY3RpdmVdOmJnLWJhY2tncm91bmQgZGFyazpkYXRhLVtzdGF0ZT1hY3RpdmVdOnRleHQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGZvY3VzLXZpc2libGU6b3V0bGluZS1yaW5nIGRhcms6ZGF0YS1bc3RhdGU9YWN0aXZlXTpib3JkZXItaW5wdXQgZGFyazpkYXRhLVtzdGF0ZT1hY3RpdmVdOmJnLWlucHV0LzMwIHRleHQtZm9yZWdyb3VuZCBkYXJrOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBpbmxpbmUtZmxleCBoLVtjYWxjKDEwMCUtMXB4KV0gZmxleC0xIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMS41IHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBweC0yIHB5LTEgdGV4dC1zbSBmb250LW1lZGl1bSB3aGl0ZXNwYWNlLW5vd3JhcCB0cmFuc2l0aW9uLVtjb2xvcixib3gtc2hhZG93XSBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTEgZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpvcGFjaXR5LTUwIGRhdGEtW3N0YXRlPWFjdGl2ZV06c2hhZG93LXNtIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnNocmluay0wIFsmX3N2Zzpub3QoW2NsYXNzKj0nc2l6ZS0nXSldOnNpemUtNFwiLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBUYWJzQ29udGVudCh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBUYWJzUHJpbWl0aXZlLkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPFRhYnNQcmltaXRpdmUuQ29udGVudFxuICAgICAgZGF0YS1zbG90PVwidGFicy1jb250ZW50XCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ2ZsZXgtMSBvdXRsaW5lLW5vbmUnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHsgVGFicywgVGFic0xpc3QsIFRhYnNUcmlnZ2VyLCBUYWJzQ29udGVudCB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgVG9vbHRpcFByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtdG9vbHRpcCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gVG9vbHRpcFByb3ZpZGVyKHtcbiAgZGVsYXlEdXJhdGlvbiA9IDAsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgVG9vbHRpcFByaW1pdGl2ZS5Qcm92aWRlcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8VG9vbHRpcFByaW1pdGl2ZS5Qcm92aWRlclxuICAgICAgZGF0YS1zbG90PVwidG9vbHRpcC1wcm92aWRlclwiXG4gICAgICBkZWxheUR1cmF0aW9uPXtkZWxheUR1cmF0aW9ufVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gVG9vbHRpcCh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgVG9vbHRpcFByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gKFxuICAgIDxUb29sdGlwUHJvdmlkZXI+XG4gICAgICA8VG9vbHRpcFByaW1pdGl2ZS5Sb290IGRhdGEtc2xvdD1cInRvb2x0aXBcIiB7Li4ucHJvcHN9IC8+XG4gICAgPC9Ub29sdGlwUHJvdmlkZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gVG9vbHRpcFRyaWdnZXIoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFRvb2x0aXBQcmltaXRpdmUuVHJpZ2dlcj4pIHtcbiAgcmV0dXJuIDxUb29sdGlwUHJpbWl0aXZlLlRyaWdnZXIgZGF0YS1zbG90PVwidG9vbHRpcC10cmlnZ2VyXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBUb29sdGlwQ29udGVudCh7XG4gIGNsYXNzTmFtZSxcbiAgc2lkZU9mZnNldCA9IDAsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFRvb2x0aXBQcmltaXRpdmUuQ29udGVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8VG9vbHRpcFByaW1pdGl2ZS5Qb3J0YWw+XG4gICAgICA8VG9vbHRpcFByaW1pdGl2ZS5Db250ZW50XG4gICAgICAgIGRhdGEtc2xvdD1cInRvb2x0aXAtY29udGVudFwiXG4gICAgICAgIHNpZGVPZmZzZXQ9e3NpZGVPZmZzZXR9XG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgYW5pbWF0ZS1pbiBmYWRlLWluLTAgem9vbS1pbi05NSBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1jbG9zZWRdOnpvb20tb3V0LTk1IGRhdGEtW3NpZGU9Ym90dG9tXTpzbGlkZS1pbi1mcm9tLXRvcC0yIGRhdGEtW3NpZGU9bGVmdF06c2xpZGUtaW4tZnJvbS1yaWdodC0yIGRhdGEtW3NpZGU9cmlnaHRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGRhdGEtW3NpZGU9dG9wXTpzbGlkZS1pbi1mcm9tLWJvdHRvbS0yIHotNTAgdy1maXQgb3JpZ2luLSgtLXJhZGl4LXRvb2x0aXAtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luKSByb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQteHMgdGV4dC1iYWxhbmNlJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgPlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDxUb29sdGlwUHJpbWl0aXZlLkFycm93IGNsYXNzTmFtZT1cImJnLXByaW1hcnkgZmlsbC1wcmltYXJ5IHotNTAgc2l6ZS0yLjUgdHJhbnNsYXRlLXktW2NhbGMoLTUwJV8tXzJweCldIHJvdGF0ZS00NSByb3VuZGVkLVsycHhdXCIgLz5cbiAgICAgIDwvVG9vbHRpcFByaW1pdGl2ZS5Db250ZW50PlxuICAgIDwvVG9vbHRpcFByaW1pdGl2ZS5Qb3J0YWw+XG4gIClcbn1cblxuZXhwb3J0IHsgVG9vbHRpcCwgVG9vbHRpcFRyaWdnZXIsIFRvb2x0aXBDb250ZW50LCBUb29sdGlwUHJvdmlkZXIgfVxuIiwKICAgICJpbXBvcnQge1xuICBEaWFsb2csXG4gIERpYWxvZ0NvbnRlbnQsXG4gIERpYWxvZ0hlYWRlcixcbiAgRGlhbG9nVGl0bGUsXG59IGZyb20gJ0AvY29tcG9uZW50cy91aSdcbmltcG9ydCBSZWFjdCwgeyB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRHJhZ2dhYmxlRXZlbnQgfSBmcm9tICdAL2ZlYXR1cmVzL2RyYWdnYWJsZS1ldmVudC9kcmFnZ2FibGUtZXZlbnQnXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB0eXBlIHsgU2VsZWN0ZWREYXlFdmVudHMgfSBmcm9tICcuLi90eXBlcydcblxuaW50ZXJmYWNlIEFsbEV2ZW50RGlhbG9nUHJvcHMge1xuICByZWY6IFJlYWN0LlJlZjx7XG4gICAgb3BlbjogKCkgPT4gdm9pZFxuICAgIGNsb3NlOiAoKSA9PiB2b2lkXG4gICAgc2V0U2VsZWN0ZWREYXlFdmVudHM6IChkYXlFdmVudHM6IFNlbGVjdGVkRGF5RXZlbnRzKSA9PiB2b2lkXG4gIH0+XG59XG5cbmV4cG9ydCBjb25zdCBBbGxFdmVudERpYWxvZzogUmVhY3QuRkM8QWxsRXZlbnREaWFsb2dQcm9wcz4gPSAoeyByZWYgfSkgPT4ge1xuICBjb25zdCBbZGlhbG9nT3Blbiwgc2V0RGlhbG9nT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3NlbGVjdGVkRGF5RXZlbnRzLCBzZXRTZWxlY3RlZERheUV2ZW50c10gPVxuICAgIHVzZVN0YXRlPFNlbGVjdGVkRGF5RXZlbnRzIHwgbnVsbD4obnVsbClcbiAgY29uc3QgeyBjdXJyZW50RGF0ZSwgZmlyc3REYXlPZldlZWsgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+ICh7XG4gICAgb3BlbjogKCkgPT4gc2V0RGlhbG9nT3Blbih0cnVlKSxcbiAgICBjbG9zZTogKCkgPT4gc2V0RGlhbG9nT3BlbihmYWxzZSksXG4gICAgc2V0U2VsZWN0ZWREYXlFdmVudHM6IChkYXlFdmVudHM6IFNlbGVjdGVkRGF5RXZlbnRzKSA9PlxuICAgICAgc2V0U2VsZWN0ZWREYXlFdmVudHMoZGF5RXZlbnRzKSxcbiAgfSkpXG5cbiAgLy8gR2V0IHN0YXJ0IGRhdGUgZm9yIHRoZSBjdXJyZW50IG1vbnRoIHZpZXcgYmFzZWQgb24gZmlyc3REYXlPZldlZWtcbiAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gY3VycmVudERhdGUuc3RhcnRPZignbW9udGgnKVxuXG4gIC8vIENhbGN1bGF0ZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSBjYWxlbmRhciBncmlkIGNvcnJlY3RseVxuICAvLyBGaW5kIHRoZSBmaXJzdCBkYXkgb2Ygd2VlayAoZS5nLiBTdW5kYXkgb3IgTW9uZGF5KSB0aGF0IGNvbWVzIGJlZm9yZSBvciBvbiB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aFxuICBsZXQgYWRqdXN0ZWRGaXJzdERheU9mQ2FsZW5kYXIgPSBmaXJzdERheU9mTW9udGguY2xvbmUoKVxuICB3aGlsZSAoYWRqdXN0ZWRGaXJzdERheU9mQ2FsZW5kYXIuZGF5KCkgIT09IGZpcnN0RGF5T2ZXZWVrKSB7XG4gICAgYWRqdXN0ZWRGaXJzdERheU9mQ2FsZW5kYXIgPSBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhci5zdWJ0cmFjdCgxLCAnZGF5JylcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPERpYWxvZyBvcGVuPXtkaWFsb2dPcGVufSBvbk9wZW5DaGFuZ2U9e3NldERpYWxvZ09wZW59PlxuICAgICAgPERpYWxvZ0NvbnRlbnQgY2xhc3NOYW1lPVwibWF4LWgtWzgwdmhdIG1heC13LW1kIG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICA8RGlhbG9nSGVhZGVyPlxuICAgICAgICAgIDxEaWFsb2dUaXRsZT5cbiAgICAgICAgICAgIHtzZWxlY3RlZERheUV2ZW50cyAmJiBzZWxlY3RlZERheUV2ZW50cy5kYXkuZm9ybWF0KCdNTU1NIEQsIFlZWVknKX1cbiAgICAgICAgICA8L0RpYWxvZ1RpdGxlPlxuICAgICAgICA8L0RpYWxvZ0hlYWRlcj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC00IHNwYWNlLXktM1wiPlxuICAgICAgICAgIHtzZWxlY3RlZERheUV2ZW50cyAmJlxuICAgICAgICAgICAgc2VsZWN0ZWREYXlFdmVudHMuZXZlbnRzLm1hcCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8RHJhZ2dhYmxlRXZlbnRcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZD17ZXZlbnQuaWR9IC8vIFVzZSBldmVudCBJRCBmb3IgdW5pcXVlIGlkZW50aWZpY2F0aW9uXG4gICAgICAgICAgICAgICAgICBrZXk9e2V2ZW50LmlkfVxuICAgICAgICAgICAgICAgICAgZXZlbnQ9e2V2ZW50fVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgbXktMSBoLVszMHB4XVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9EaWFsb2dDb250ZW50PlxuICAgIDwvRGlhbG9nPlxuICApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCB7IHVzZURyYWdnYWJsZSB9IGZyb20gJ0BkbmQta2l0L2NvcmUnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCB0eXBlIHsgQ1NTUHJvcGVydGllcyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgbWVtbyB9IGZyb20gJ3JlYWN0J1xuXG5mdW5jdGlvbiBEcmFnZ2FibGVFdmVudFVubWVtb2l6ZWQoe1xuICBlbGVtZW50SWQsXG4gIGV2ZW50LFxuICBjbGFzc05hbWUsXG4gIHN0eWxlLFxuICBkaXNhYmxlRHJhZyA9IGZhbHNlLFxufToge1xuICBlbGVtZW50SWQ6IHN0cmluZ1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgc3R5bGU/OiBDU1NQcm9wZXJ0aWVzXG4gIGV2ZW50OiBDYWxlbmRhckV2ZW50XG4gIGRpc2FibGVEcmFnPzogYm9vbGVhblxufSkge1xuICBjb25zdCB7IG9uRXZlbnRDbGljaywgcmVuZGVyRXZlbnQsIGRpc2FibGVFdmVudENsaWNrLCBkaXNhYmxlRHJhZ0FuZERyb3AgfSA9XG4gICAgdXNlQ2FsZW5kYXJDb250ZXh0KClcbiAgY29uc3QgeyBhdHRyaWJ1dGVzLCBsaXN0ZW5lcnMsIHNldE5vZGVSZWYsIGlzRHJhZ2dpbmcgfSA9IHVzZURyYWdnYWJsZSh7XG4gICAgaWQ6IGVsZW1lbnRJZCxcbiAgICBkYXRhOiB7XG4gICAgICBldmVudCxcbiAgICAgIHR5cGU6ICdjYWxlbmRhci1ldmVudCcsXG4gICAgfSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZURyYWcgfHwgZGlzYWJsZURyYWdBbmREcm9wLFxuICB9KVxuXG4gIC8vIERlZmF1bHQgZXZlbnQgY29udGVudCB0byByZW5kZXIgaWYgY3VzdG9tIHJlbmRlckV2ZW50IGlzIG5vdCBwcm92aWRlZFxuICBjb25zdCBEZWZhdWx0RXZlbnRDb250ZW50ID0gKCkgPT4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgIGV2ZW50LmJhY2tncm91bmRDb2xvciB8fCAnYmctYmx1ZS01MDAnLFxuICAgICAgICBldmVudC5jb2xvciB8fCAndGV4dC13aGl0ZScsXG4gICAgICAgICdoLWZ1bGwgdy1mdWxsIHB4LTEgYm9yZGVyLVsxLjVweF0gYm9yZGVyLWNhcmQgcm91bmRlZC1tZCB0ZXh0LWxlZnQgb3ZlcmZsb3ctY2xpcCdcbiAgICAgICl9XG4gICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6IGV2ZW50LmJhY2tncm91bmRDb2xvciwgY29sb3I6IGV2ZW50LmNvbG9yIH19XG4gICAgPlxuICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1bMTBweF0gZm9udC1zZW1pYm9sZCBzbTp0ZXh0LXhzIG10LTAuNVwiPlxuICAgICAgICB7ZXZlbnQudGl0bGV9XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gIClcblxuICByZXR1cm4gKFxuICAgIDxBbmltYXRlUHJlc2VuY2UgbW9kZT1cIndhaXRcIj5cbiAgICAgIDxtb3Rpb24uZGl2XG4gICAgICAgIGtleT17ZWxlbWVudElkfVxuICAgICAgICByZWY9e3NldE5vZGVSZWZ9XG4gICAgICAgIHsuLi5hdHRyaWJ1dGVzfVxuICAgICAgICB7Li4ubGlzdGVuZXJzfVxuICAgICAgICBpbml0aWFsPXt7IG9wYWNpdHk6IDAsIHk6IC01MCB9fVxuICAgICAgICBhbmltYXRlPXt7IG9wYWNpdHk6IDEsIHk6IDAgfX1cbiAgICAgICAgZXhpdD17eyBvcGFjaXR5OiAwLCB5OiAtNTAgfX1cbiAgICAgICAgbGF5b3V0XG4gICAgICAgIGxheW91dElkPXtlbGVtZW50SWR9XG4gICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuNCwgZWFzZTogJ2Vhc2VJbk91dCcgfX1cbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAndHJ1bmNhdGUgaC1mdWxsIHctZnVsbCcsXG4gICAgICAgICAgZGlzYWJsZURyYWcgfHwgZGlzYWJsZURyYWdBbmREcm9wXG4gICAgICAgICAgICA/IGRpc2FibGVFdmVudENsaWNrXG4gICAgICAgICAgICAgID8gJ2N1cnNvci1kZWZhdWx0J1xuICAgICAgICAgICAgICA6ICdjdXJzb3ItcG9pbnRlcidcbiAgICAgICAgICAgIDogJ2N1cnNvci1ncmFiJyxcbiAgICAgICAgICBpc0RyYWdnaW5nICYmXG4gICAgICAgICAgICAhKGRpc2FibGVEcmFnIHx8IGRpc2FibGVEcmFnQW5kRHJvcCkgJiZcbiAgICAgICAgICAgICdjdXJzb3ItZ3JhYmJpbmcgc2hhZG93LWxnJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICBvbkV2ZW50Q2xpY2soZXZlbnQpXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHsvKiBVc2UgY3VzdG9tIHJlbmRlckV2ZW50IGZyb20gY29udGV4dCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgZGVmYXVsdCAqL31cbiAgICAgICAge3JlbmRlckV2ZW50ID8gcmVuZGVyRXZlbnQoZXZlbnQpIDogPERlZmF1bHRFdmVudENvbnRlbnQgLz59XG4gICAgICA8L21vdGlvbi5kaXY+XG4gICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IERyYWdnYWJsZUV2ZW50ID0gbWVtbyhcbiAgRHJhZ2dhYmxlRXZlbnRVbm1lbW9pemVkLFxuICAocHJldlByb3BzLCBuZXh0UHJvcHMpID0+IHtcbiAgICAvLyBDb21wYXJlIHRoZSBlc3NlbnRpYWwgcHJvcHMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gICAgcmV0dXJuIChcbiAgICAgIHByZXZQcm9wcy5lbGVtZW50SWQgPT09IG5leHRQcm9wcy5lbGVtZW50SWQgJiZcbiAgICAgIHByZXZQcm9wcy5kaXNhYmxlRHJhZyA9PT0gbmV4dFByb3BzLmRpc2FibGVEcmFnICYmXG4gICAgICBwcmV2UHJvcHMuY2xhc3NOYW1lID09PSBuZXh0UHJvcHMuY2xhc3NOYW1lICYmXG4gICAgICBwcmV2UHJvcHMuZXZlbnQuaWQgPT09IG5leHRQcm9wcy5ldmVudC5pZCAmJlxuICAgICAgcHJldlByb3BzLmV2ZW50LmhlaWdodCA9PT0gbmV4dFByb3BzLmV2ZW50LmhlaWdodFxuICAgIClcbiAgfVxuKVxuIiwKICAgICJpbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgRHJvcHBhYmxlQ2VsbCB9IGZyb20gJ0AvZmVhdHVyZXMvZHJvcHBhYmxlLWNlbGwvZHJvcHBhYmxlLWNlbGwnXG5pbXBvcnQgeyBBbGxFdmVudERpYWxvZyB9IGZyb20gJy4vYWxsLWV2ZW50cy1kaWFsb2cnXG5pbXBvcnQgdHlwZSB7IFNlbGVjdGVkRGF5RXZlbnRzIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQgfSBmcm9tICdAL2NvbXBvbmVudHMvdHlwZXMnXG5cbmludGVyZmFjZSBEYXlDZWxsUHJvcHMge1xuICBpbmRleDogbnVtYmVyIC8vIEluZGV4IG9mIHRoZSBkYXkgaW4gdGhlIHdlZWsgKDAtNilcbiAgZGF5OiBkYXlqcy5EYXlqc1xuICBkYXlNYXhFdmVudHM/OiBudW1iZXJcbiAgY2xhc3NOYW1lPzogc3RyaW5nIC8vIE9wdGlvbmFsIGNsYXNzTmFtZSBmb3IgY3VzdG9tIHN0eWxpbmdcbn1cblxuZXhwb3J0IGNvbnN0IERheUNlbGw6IFJlYWN0LkZDPERheUNlbGxQcm9wcz4gPSAoe1xuICBpbmRleCxcbiAgZGF5LFxuICBjbGFzc05hbWUgPSAnJyxcbn0pID0+IHtcbiAgY29uc3QgYWxsRXZlbnRzRGlhbG9nUmVmID0gUmVhY3QudXNlUmVmPHtcbiAgICBvcGVuOiAoKSA9PiB2b2lkXG4gICAgY2xvc2U6ICgpID0+IHZvaWRcbiAgICBzZXRTZWxlY3RlZERheUV2ZW50czogKGRheUV2ZW50czogU2VsZWN0ZWREYXlFdmVudHMpID0+IHZvaWRcbiAgfT4obnVsbClcbiAgY29uc3Qge1xuICAgIGV2ZW50cyxcbiAgICBjdXJyZW50RGF0ZSxcbiAgICBmaXJzdERheU9mV2VlayxcbiAgICBkYXlNYXhFdmVudHMgPSAwLFxuICB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcbiAgY29uc3QgdG9kYXlFdmVudHMgPSBldmVudHMuZmlsdGVyKChlKSA9PiB7XG4gICAgY29uc3Qgc3RhcnRzVG9kYXkgPSBlLnN0YXJ0LmlzU2FtZShkYXksICdkYXknKVxuICAgIGNvbnN0IGVuZHNUb2RheSA9IGUuZW5kLmlzU2FtZShkYXksICdkYXknKVxuICAgIGNvbnN0IHNwYW5zVG9kYXkgPSBlLnN0YXJ0LmlzQmVmb3JlKGRheSwgJ2RheScpICYmIGUuZW5kLmlzQWZ0ZXIoZGF5LCAnZGF5JylcblxuICAgIHJldHVybiBzdGFydHNUb2RheSB8fCBlbmRzVG9kYXkgfHwgc3BhbnNUb2RheVxuICB9KVxuXG4gIC8vIEdldCBzdGFydCBkYXRlIGZvciB0aGUgY3VycmVudCBtb250aCB2aWV3IGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrXG4gIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IGN1cnJlbnREYXRlLnN0YXJ0T2YoJ21vbnRoJylcblxuICAvLyBDYWxjdWxhdGUgdGhlIGZpcnN0IGRheSBvZiB0aGUgY2FsZW5kYXIgZ3JpZCBjb3JyZWN0bHlcbiAgLy8gRmluZCB0aGUgZmlyc3QgZGF5IG9mIHdlZWsgKGUuZy4gU3VuZGF5IG9yIE1vbmRheSkgdGhhdCBjb21lcyBiZWZvcmUgb3Igb24gdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGhcbiAgbGV0IGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyID0gZmlyc3REYXlPZk1vbnRoLmNsb25lKClcbiAgd2hpbGUgKGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyLmRheSgpICE9PSBmaXJzdERheU9mV2Vlaykge1xuICAgIGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyID0gYWRqdXN0ZWRGaXJzdERheU9mQ2FsZW5kYXIuc3VidHJhY3QoMSwgJ2RheScpXG4gIH1cblxuICAvLyBIYW5kbGVyIGZvciBzaG93aW5nIGFsbCBldmVudHMgaW4gYSBkaWFsb2dcbiAgY29uc3Qgc2hvd0FsbEV2ZW50cyA9IChkYXk6IGRheWpzLkRheWpzLCBldmVudHM6IENhbGVuZGFyRXZlbnRbXSkgPT4ge1xuICAgIGFsbEV2ZW50c0RpYWxvZ1JlZi5jdXJyZW50Py5zZXRTZWxlY3RlZERheUV2ZW50cyh7XG4gICAgICBkYXksXG4gICAgICBldmVudHMsXG4gICAgfSlcbiAgICBhbGxFdmVudHNEaWFsb2dSZWYuY3VycmVudD8ub3BlbigpXG4gIH1cblxuICBjb25zdCBpc1RvZGF5ID0gZGF5LmlzU2FtZShkYXlqcygpLCAnZGF5JylcbiAgY29uc3QgaXNDdXJyZW50TW9udGggPSBkYXkubW9udGgoKSA9PT0gY3VycmVudERhdGUubW9udGgoKVxuICBjb25zdCBpc0xhc3RDb2x1bW4gPSBpbmRleCA9PT0gNiAvLyBTYXR1cmRheSBpcyB0aGUgbGFzdCBjb2x1bW4gaW4gYSB3ZWVrXG5cbiAgY29uc3QgaGlkZGVuRXZlbnRzQ291bnQgPSB0b2RheUV2ZW50cy5sZW5ndGggLSBkYXlNYXhFdmVudHNcbiAgY29uc3QgaGFzSGlkZGVuRXZlbnRzID0gaGlkZGVuRXZlbnRzQ291bnQgPiAwXG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPERyb3BwYWJsZUNlbGxcbiAgICAgICAgaWQ9e2BkYXktY2VsbC0ke2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgICB0eXBlPVwiZGF5LWNlbGxcIlxuICAgICAgICBkYXRhLXRlc3RpZD17YGRheS1jZWxsLSR7ZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgIGRhdGU9e2RheX1cbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAnY3Vyc29yLXBvaW50ZXIgb3ZlcmZsb3ctY2xpcCBwLTEgaG92ZXI6YmctYWNjZW50JyxcbiAgICAgICAgICAhaXNDdXJyZW50TW9udGggJiYgJ2JnLXNlY29uZGFyeSB0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgICAgIGlzTGFzdENvbHVtbiAmJiAnYm9yZGVyLXItMCcsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICA+XG4gICAgICAgIHsvKiBBYnNvbHV0ZWx5IHBvc2l0aW9uZWQgbXVsdGktZGF5IGJhcnMgKEdvb2dsZSBDYWxlbmRhciBzdHlsZSkgKi99XG5cbiAgICAgICAgey8qIFNpbmdsZS1kYXkgZXZlbnRzIGNvbnRhaW5lciBwb3NpdGlvbmVkIGJlbG93IG11bHRpLWRheSBldmVudHMgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgIHsvKiBEYXkgbnVtYmVyICovfVxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdmbGV4IGgtNSB3LTUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtZnVsbCB0ZXh0LXhzIHNtOmgtNiBzbTp3LTYgc206dGV4dC1zbScsXG4gICAgICAgICAgICAgIGlzVG9kYXkgJiYgJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgZm9udC1tZWRpdW0nXG4gICAgICAgICAgICApfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtkYXkuZGF0ZSgpfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIFJlbmRlciBwbGFjZWhvbGRlcnMgZm9yIGV2ZW50cyB0aGF0IG9jY3VyIHRvZGF5IHNvIHRoYXQgdGhlIGNlbGwgaGVpZ2h0IGlzIGFjY29yZGluZyB0byBkYXlNYXhFdmVudHMuICovfVxuICAgICAgICAgIHt0b2RheUV2ZW50cy5zbGljZSgwLCBkYXlNYXhFdmVudHMpLm1hcCgoZXZlbnQsIHJvd0luZGV4KSA9PiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGtleT17YGVtcHR5LSR7cm93SW5kZXh9YH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC1bMjBweF0gdy1mdWxsXCJcbiAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2V2ZW50Py50aXRsZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG5cbiAgICAgICAgICB7LyogU2hvdyBtb3JlIGV2ZW50cyBidXR0b24gd2l0aCBhY2N1cmF0ZSBjb3VudCAqL31cbiAgICAgICAgICB7aGFzSGlkZGVuRXZlbnRzICYmIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGhvdmVyOnRleHQtZm9yZWdyb3VuZCBjdXJzb3ItcG9pbnRlciB0ZXh0LVsxMHB4XSB3aGl0ZXNwYWNlLW5vd3JhcCBzbTp0ZXh0LXhzIG10LTFcIlxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcblxuICAgICAgICAgICAgICAgIHNob3dBbGxFdmVudHMoZGF5LCB0b2RheUV2ZW50cylcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgK3toaWRkZW5FdmVudHNDb3VudH0gbW9yZVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L0Ryb3BwYWJsZUNlbGw+XG5cbiAgICAgIHsvKiBEaWFsb2cgZm9yIHNob3dpbmcgYWxsIGV2ZW50cyAqL31cbiAgICAgIDxBbGxFdmVudERpYWxvZyByZWY9e2FsbEV2ZW50c0RpYWxvZ1JlZn0gLz5cbiAgICA8Lz5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VEcm9wcGFibGUgfSBmcm9tICdAZG5kLWtpdC9jb3JlJ1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHR5cGUgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuXG5pbnRlcmZhY2UgRHJvcHBhYmxlQ2VsbFByb3BzIHtcbiAgaWQ6IHN0cmluZ1xuICB0eXBlOiAnZGF5LWNlbGwnIHwgJ3RpbWUtY2VsbCdcbiAgZGF0ZTogZGF5anMuRGF5anNcbiAgaG91cj86IG51bWJlclxuICBtaW51dGU/OiBudW1iZXJcbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGVcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIHN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xuICAnZGF0YS10ZXN0aWQnPzogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEcm9wcGFibGVDZWxsKHtcbiAgaWQsXG4gIHR5cGUsXG4gIGRhdGUsXG4gIGhvdXIsXG4gIG1pbnV0ZSxcbiAgY2hpbGRyZW4sXG4gIGNsYXNzTmFtZSxcbiAgc3R5bGUsXG4gICdkYXRhLXRlc3RpZCc6IGRhdGFUZXN0SWQsXG59OiBEcm9wcGFibGVDZWxsUHJvcHMpIHtcbiAgY29uc3QgeyBvbkNlbGxDbGljaywgZGlzYWJsZURyYWdBbmREcm9wLCBkaXNhYmxlQ2VsbENsaWNrIH0gPVxuICAgIHVzZUNhbGVuZGFyQ29udGV4dCgpXG4gIGNvbnN0IHsgaXNPdmVyLCBzZXROb2RlUmVmIH0gPSB1c2VEcm9wcGFibGUoe1xuICAgIGlkLFxuICAgIGRhdGE6IHtcbiAgICAgIHR5cGUsXG4gICAgICBkYXRlLFxuICAgICAgaG91cixcbiAgICAgIG1pbnV0ZSxcbiAgICB9LFxuICAgIGRpc2FibGVkOiBkaXNhYmxlRHJhZ0FuZERyb3AsXG4gIH0pXG5cbiAgY29uc3QgaGFuZGxlQ2VsbENsaWNrID0gKGU6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgaWYgKGRpc2FibGVDZWxsQ2xpY2spIHJldHVyblxuXG4gICAgY29uc3Qgc3RhcnREYXRlID0gZGF0ZS5ob3VyKGhvdXIgPz8gMCkubWludXRlKG1pbnV0ZSA/PyAwKVxuICAgIGxldCBlbmREYXRlID0gc3RhcnREYXRlLmNsb25lKClcbiAgICBpZiAoaG91ciAhPT0gdW5kZWZpbmVkICYmIG1pbnV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmREYXRlID0gZW5kRGF0ZS5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUgKyAxNSkgLy8gZGF5IHZpZXcgdGltZSBzbG90cyBhcmUgMTUgbWludXRlc1xuICAgIH0gZWxzZSBpZiAoaG91ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmREYXRlID0gZW5kRGF0ZS5ob3VyKGhvdXIgKyAxKS5taW51dGUoMCkgLy8gd2VlayB2aWV3IHRpbWUgc2xvdHMgYXJlIDEgaG91clxuICAgIH0gZWxzZSB7XG4gICAgICBlbmREYXRlID0gZW5kRGF0ZS5ob3VyKDIzKS5taW51dGUoNTkpIC8vIG1vbnRoIHZpZXcgZnVsbCBkYXlcbiAgICB9XG5cbiAgICBvbkNlbGxDbGljayhzdGFydERhdGUsIGVuZERhdGUpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17c2V0Tm9kZVJlZn1cbiAgICAgIGRhdGEtdGVzdGlkPXtkYXRhVGVzdElkfVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBpc092ZXIgJiYgIWRpc2FibGVEcmFnQW5kRHJvcCAmJiAnYmctYWNjZW50JyxcbiAgICAgICAgZGlzYWJsZUNlbGxDbGljayA/ICdjdXJzb3ItZGVmYXVsdCcgOiAnY3Vyc29yLXBvaW50ZXInXG4gICAgICApfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2VsbENsaWNrfVxuICAgICAgc3R5bGU9e3N0eWxlfVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCBSZWFjdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgTW9udGhIZWFkZXI6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCB7XG4gICAgZmlyc3REYXlPZldlZWssXG4gICAgY3VycmVudExvY2FsZSxcbiAgICBzdGlja3lWaWV3SGVhZGVyLFxuICAgIHZpZXdIZWFkZXJDbGFzc05hbWUsXG4gIH0gPSB1c2VDYWxlbmRhckNvbnRleHQoKVxuXG4gIC8vIFJlb3JkZXIgd2VlayBkYXlzIGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrXG4gIGNvbnN0IHdlZWtEYXlzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgZGF5cyA9IGRheWpzLndlZWtkYXlzKCkubWFwKChkYXkpID0+IGRheS50b0xvd2VyQ2FzZSgpKVxuICAgIGNvbnN0IHNob3J0RGF5cyA9IGRheWpzLndlZWtkYXlzU2hvcnQoKS5tYXAoKGRheSkgPT4gZGF5LnRvTG93ZXJDYXNlKCkpXG5cbiAgICAvLyBSb3RhdGUgdGhlIGFycmF5IGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXJzdERheU9mV2VlazsgaSsrKSB7XG4gICAgICBjb25zdCBkYXlUb01vdmUgPSBkYXlzLnNoaWZ0KClcbiAgICAgIGNvbnN0IHNob3J0RGF5VG9Nb3ZlID0gc2hvcnREYXlzLnNoaWZ0KClcbiAgICAgIGlmIChkYXlUb01vdmUpIGRheXMucHVzaChkYXlUb01vdmUpXG4gICAgICBpZiAoc2hvcnREYXlUb01vdmUpIHNob3J0RGF5cy5wdXNoKHNob3J0RGF5VG9Nb3ZlKVxuICAgIH1cblxuICAgIHJldHVybiB7IGRheXMsIHNob3J0RGF5cyB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZmlyc3REYXlPZldlZWssIGN1cnJlbnRMb2NhbGVdKVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2dyaWQgZ3JpZC1jb2xzLTcgYm9yZGVyLWInLFxuICAgICAgICBzdGlja3lWaWV3SGVhZGVyICYmICdzdGlja3kgdG9wLTAgei0xMDAnLFxuICAgICAgICB2aWV3SGVhZGVyQ2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgZGF0YS10ZXN0aWQ9XCJtb250aC1oZWFkZXJcIlxuICAgID5cbiAgICAgIHt3ZWVrRGF5cy5kYXlzLm1hcCgod2Vla0RheSwgaW5kZXgpID0+IChcbiAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBrZXk9e3dlZWtEYXl9IG1vZGU9XCJ3YWl0XCI+XG4gICAgICAgICAgPG1vdGlvbi5kaXZcbiAgICAgICAgICAgIGtleT17d2Vla0RheX1cbiAgICAgICAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCwgeTogLTEwIH19XG4gICAgICAgICAgICBhbmltYXRlPXt7IG9wYWNpdHk6IDEsIHk6IDAgfX1cbiAgICAgICAgICAgIGV4aXQ9e3sgb3BhY2l0eTogMCwgeTogLTEwIH19XG4gICAgICAgICAgICB0cmFuc2l0aW9uPXt7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwLjI1LFxuICAgICAgICAgICAgICBlYXNlOiAnZWFzZUluT3V0JyxcbiAgICAgICAgICAgICAgZGVsYXk6IGluZGV4ICogMC4wNSxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJweS0yIHRleHQtY2VudGVyIGZvbnQtbWVkaXVtIGJvcmRlci1yIGZpcnN0OmJvcmRlci1sXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgd2Vla2RheS1oZWFkZXItJHt3ZWVrRGF5fWB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIHRleHQtc20gc206aW5saW5lXCI+e3dlZWtEYXl9PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14cyBzbTpoaWRkZW5cIj5cbiAgICAgICAgICAgICAge3dlZWtEYXlzLnNob3J0RGF5c1tpbmRleF19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9tb3Rpb24uZGl2PlxuICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cbiAgICAgICkpfVxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImV4cG9ydCBjb25zdCBHQVBfQkVUV0VFTl9FTEVNRU5UUyA9IDEgLy8gcHggKGdhcC0xKVxuZXhwb3J0IGNvbnN0IERBWV9OVU1CRVJfSEVJR0hUID0gMjggLy8gcHggKGgtNylcbmV4cG9ydCBjb25zdCBFVkVOVF9CQVJfSEVJR0hUID0gMjQgLy8gcHggKGgtWzI0cHhdKVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQgfSBmcm9tICdAL2NvbXBvbmVudHMvdHlwZXMnXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBEcmFnZ2FibGVFdmVudCB9IGZyb20gJ0AvZmVhdHVyZXMvZHJhZ2dhYmxlLWV2ZW50L2RyYWdnYWJsZS1ldmVudCdcbmltcG9ydCB7XG4gIERBWV9OVU1CRVJfSEVJR0hULFxuICBFVkVOVF9CQVJfSEVJR0hULFxuICBHQVBfQkVUV0VFTl9FTEVNRU5UUyxcbn0gZnJvbSAnQC9saWIvY29uc3RhbnRzJ1xuXG5pbnRlcmZhY2UgUHJvY2Vzc2VkRXZlbnQgZXh0ZW5kcyBDYWxlbmRhckV2ZW50IHtcbiAgbGVmdDogbnVtYmVyIC8vIExlZnQgcG9zaXRpb24gaW4gcGVyY2VudGFnZVxuICB3aWR0aDogbnVtYmVyIC8vIFdpZHRoIGluIHBlcmNlbnRhZ2VcbiAgdG9wOiBudW1iZXIgLy8gVG9wIHBvc2l0aW9uIGluIHBlcmNlbnRhZ2VcbiAgaGVpZ2h0OiBudW1iZXIgLy8gSGVpZ2h0IGluIHBlcmNlbnRhZ2VcbiAgcG9zaXRpb246IG51bWJlciAvLyBQb3NpdGlvbiBpbiB0aGUgcm93ICgwIGZvciBmaXJzdCwgMSBmb3Igc2Vjb25kLCBldGMuKVxufVxuXG5pbnRlcmZhY2UgV2Vla0V2ZW50c0xheWVyUHJvcHMge1xuICBkYXlzOiBkYXlqcy5EYXlqc1tdXG59XG5cbmV4cG9ydCBjb25zdCBXZWVrRXZlbnRzTGF5ZXI6IFJlYWN0LkZDPFdlZWtFdmVudHNMYXllclByb3BzPiA9ICh7IGRheXMgfSkgPT4ge1xuICBjb25zdCB7IGV2ZW50cywgZGF5TWF4RXZlbnRzIH0gPSB1c2VDYWxlbmRhckNvbnRleHQoKVxuXG4gIGNvbnN0IHdlZWtTdGFydCA9IGRheXNbMF1cbiAgY29uc3Qgd2Vla0VuZCA9IGRheXNbNl1cblxuICAvLyBHZXQgYWxsIGV2ZW50cyB0aGF0IGludGVyc2VjdCB3aXRoIHRoaXMgd2Vla1xuICBjb25zdCB3ZWVrRXZlbnRzID0gZXZlbnRzLmZpbHRlcigoZSkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0c0luV2VlayA9XG4gICAgICBlLnN0YXJ0LmlzU2FtZU9yQWZ0ZXIod2Vla1N0YXJ0LnN0YXJ0T2YoJ2RheScpKSAmJlxuICAgICAgZS5zdGFydC5pc1NhbWVPckJlZm9yZSh3ZWVrRW5kLmVuZE9mKCdkYXknKSlcbiAgICBjb25zdCBlbmRzSW5XZWVrID1cbiAgICAgIGUuZW5kLmlzU2FtZU9yQWZ0ZXIod2Vla1N0YXJ0LnN0YXJ0T2YoJ2RheScpKSAmJlxuICAgICAgZS5lbmQuaXNTYW1lT3JCZWZvcmUod2Vla0VuZC5lbmRPZignZGF5JykpXG4gICAgY29uc3Qgc3BhbnNXZWVrID1cbiAgICAgIGUuc3RhcnQuaXNCZWZvcmUod2Vla1N0YXJ0LnN0YXJ0T2YoJ2RheScpKSAmJlxuICAgICAgZS5lbmQuaXNBZnRlcih3ZWVrRW5kLmVuZE9mKCdkYXknKSlcbiAgICByZXR1cm4gc3RhcnRzSW5XZWVrIHx8IGVuZHNJbldlZWsgfHwgc3BhbnNXZWVrXG4gIH0pXG5cbiAgLy8gU2VwYXJhdGUgbXVsdGktZGF5IGFuZCBzaW5nbGUtZGF5IGV2ZW50c1xuICBjb25zdCBtdWx0aURheUV2ZW50cyA9IHdlZWtFdmVudHMuZmlsdGVyKFxuICAgIChlKSA9PiBlLmVuZC5kaWZmKGUuc3RhcnQsICdkYXknKSA+IDBcbiAgKVxuICBjb25zdCBzaW5nbGVEYXlFdmVudHMgPSB3ZWVrRXZlbnRzLmZpbHRlcihcbiAgICAoZSkgPT4gZS5lbmQuZGlmZihlLnN0YXJ0LCAnZGF5JykgPT09IDBcbiAgKVxuXG4gIC8vIFNvcnQgbXVsdGktZGF5IGV2ZW50cyBieSBzdGFydCBkYXRlLCB0aGVuIGJ5IGR1cmF0aW9uXG4gIGNvbnN0IHNvcnRlZE11bHRpRGF5ID0gWy4uLm11bHRpRGF5RXZlbnRzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qgc3RhcnREaWZmID0gYS5zdGFydC5kaWZmKGIuc3RhcnQpXG4gICAgaWYgKHN0YXJ0RGlmZiAhPT0gMCkgcmV0dXJuIHN0YXJ0RGlmZlxuICAgIHJldHVybiBiLmVuZC5kaWZmKGIuc3RhcnQpIC0gYS5lbmQuZGlmZihhLnN0YXJ0KSAvLyBMb25nZXIgZXZlbnRzIGZpcnN0XG4gIH0pXG5cbiAgLy8gU29ydCBzaW5nbGUtZGF5IGV2ZW50cyBieSBzdGFydCB0aW1lXG4gIGNvbnN0IHNvcnRlZFNpbmdsZURheSA9IFsuLi5zaW5nbGVEYXlFdmVudHNdLnNvcnQoKGEsIGIpID0+XG4gICAgYS5zdGFydC5kaWZmKGIuc3RhcnQpXG4gIClcblxuICAvLyBDcmVhdGUgNyB4IGRheU1heEV2ZW50cyBncmlkIHdpdGggZmxhZ3NcbiAgY29uc3QgZ3JpZDogQXJyYXk8QXJyYXk8eyB0YWtlbjogYm9vbGVhbjsgZXZlbnQ6IENhbGVuZGFyRXZlbnQgfCBudWxsIH0+PiA9IFtdXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGRheU1heEV2ZW50czsgcm93KyspIHtcbiAgICBncmlkW3Jvd10gPSBbXVxuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IDc7IGNvbCsrKSB7XG4gICAgICBncmlkW3Jvd11bY29sXSA9IHsgdGFrZW46IGZhbHNlLCBldmVudDogbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXZlbnRQb3NpdGlvbnM6IFByb2Nlc3NlZEV2ZW50W10gPSBbXVxuXG4gIC8vIFN0ZXAgMTogQXNzaWduIHBvc2l0aW9ucyB0byBtdWx0aS1kYXkgZXZlbnRzIGZpcnN0XG4gIGZvciAoY29uc3QgZXZlbnQgb2Ygc29ydGVkTXVsdGlEYXkpIHtcbiAgICBjb25zdCBldmVudFN0YXJ0ID0gZGF5anMubWF4KGV2ZW50LnN0YXJ0LnN0YXJ0T2YoJ2RheScpLCB3ZWVrU3RhcnQpXG4gICAgY29uc3QgZXZlbnRFbmQgPSBkYXlqcy5taW4oZXZlbnQuZW5kLnN0YXJ0T2YoJ2RheScpLCB3ZWVrRW5kKVxuICAgIGNvbnN0IHN0YXJ0Q29sID0gTWF0aC5tYXgoMCwgZXZlbnRTdGFydC5kaWZmKHdlZWtTdGFydCwgJ2RheScpKVxuICAgIGNvbnN0IGVuZENvbCA9IE1hdGgubWluKDYsIGV2ZW50RW5kLmRpZmYod2Vla1N0YXJ0LCAnZGF5JykpXG5cbiAgICAvLyBUcnkgdG8gcGxhY2UgdGhlIGV2ZW50IHN0YXJ0aW5nIGZyb20gaXRzIG9yaWdpbmFsIHN0YXJ0IGNvbHVtblxuICAgIGxldCBwbGFjZWRTdWNjZXNzZnVsbHkgPSBmYWxzZVxuXG4gICAgLy8gRmlyc3QgdHJ5OiBwbGFjZSBmcm9tIG9yaWdpbmFsIHN0YXJ0IHBvc2l0aW9uXG4gICAgbGV0IGFzc2lnbmVkUm93ID0gLTFcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBkYXlNYXhFdmVudHM7IHJvdysrKSB7XG4gICAgICBsZXQgY2FuUGxhY2UgPSB0cnVlXG4gICAgICBmb3IgKGxldCBjb2wgPSBzdGFydENvbDsgY29sIDw9IGVuZENvbDsgY29sKyspIHtcbiAgICAgICAgaWYgKGdyaWRbcm93XVtjb2xdLnRha2VuKSB7XG4gICAgICAgICAgY2FuUGxhY2UgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjYW5QbGFjZSkge1xuICAgICAgICBhc3NpZ25lZFJvdyA9IHJvd1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGZvdW5kIGEgcm93LCBhc3NpZ24gdGhlIGV2ZW50IHRvIGFsbCBpdHMgY29sdW1uc1xuICAgIGlmIChhc3NpZ25lZFJvdyAhPT0gLTEpIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IHN0YXJ0Q29sOyBjb2wgPD0gZW5kQ29sOyBjb2wrKykge1xuICAgICAgICBncmlkW2Fzc2lnbmVkUm93XVtjb2xdID0geyB0YWtlbjogdHJ1ZSwgZXZlbnQgfVxuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgcG9zaXRpb24gZGF0YSBmb3IgcmVuZGVyaW5nXG4gICAgICBjb25zdCBzcGFuRGF5cyA9IGVuZENvbCAtIHN0YXJ0Q29sICsgMVxuICAgICAgZXZlbnRQb3NpdGlvbnMucHVzaCh7XG4gICAgICAgIGxlZnQ6IChzdGFydENvbCAvIDcpICogMTAwLFxuICAgICAgICB3aWR0aDogKHNwYW5EYXlzIC8gNykgKiAxMDAsXG4gICAgICAgIHRvcDpcbiAgICAgICAgICBEQVlfTlVNQkVSX0hFSUdIVCArXG4gICAgICAgICAgR0FQX0JFVFdFRU5fRUxFTUVOVFMgK1xuICAgICAgICAgIGFzc2lnbmVkUm93ICogKEVWRU5UX0JBUl9IRUlHSFQgKyBHQVBfQkVUV0VFTl9FTEVNRU5UUyksXG4gICAgICAgIGhlaWdodDogRVZFTlRfQkFSX0hFSUdIVCxcbiAgICAgICAgcG9zaXRpb246IGFzc2lnbmVkUm93LFxuICAgICAgICAuLi5ldmVudCxcbiAgICAgIH0pXG4gICAgICBwbGFjZWRTdWNjZXNzZnVsbHkgPSB0cnVlXG4gICAgfVxuXG4gICAgLy8gSWYgY291bGRuJ3QgcGxhY2UgYXQgb3JpZ2luYWwgcG9zaXRpb24sIHRyeSB0cnVuY2F0ZWQgdmVyc2lvbnMgc3RhcnRpbmcgZnJvbSBsYXRlciBkYXlzXG4gICAgaWYgKCFwbGFjZWRTdWNjZXNzZnVsbHkpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCB0cnlTdGFydENvbCA9IHN0YXJ0Q29sICsgMTtcbiAgICAgICAgdHJ5U3RhcnRDb2wgPD0gZW5kQ29sO1xuICAgICAgICB0cnlTdGFydENvbCsrXG4gICAgICApIHtcbiAgICAgICAgLy8gVHJ5IHRvIHBsYWNlIHRoZSB0cnVuY2F0ZWQgZXZlbnQgc3RhcnRpbmcgZnJvbSB0aGlzIGNvbHVtblxuICAgICAgICBsZXQgdHJ1bmNhdGVkQXNzaWduZWRSb3cgPSAtMVxuICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBkYXlNYXhFdmVudHM7IHJvdysrKSB7XG4gICAgICAgICAgbGV0IGNhblBsYWNlID0gdHJ1ZVxuICAgICAgICAgIGZvciAobGV0IGNvbCA9IHRyeVN0YXJ0Q29sOyBjb2wgPD0gZW5kQ29sOyBjb2wrKykge1xuICAgICAgICAgICAgaWYgKGdyaWRbcm93XVtjb2xdLnRha2VuKSB7XG4gICAgICAgICAgICAgIGNhblBsYWNlID0gZmFsc2VcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNhblBsYWNlKSB7XG4gICAgICAgICAgICB0cnVuY2F0ZWRBc3NpZ25lZFJvdyA9IHJvd1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBmb3VuZCBhIHJvdyBmb3IgdGhlIHRydW5jYXRlZCB2ZXJzaW9uLCBwbGFjZSBpdFxuICAgICAgICBpZiAodHJ1bmNhdGVkQXNzaWduZWRSb3cgIT09IC0xKSB7XG4gICAgICAgICAgZm9yIChsZXQgY29sID0gdHJ5U3RhcnRDb2w7IGNvbCA8PSBlbmRDb2w7IGNvbCsrKSB7XG4gICAgICAgICAgICBncmlkW3RydW5jYXRlZEFzc2lnbmVkUm93XVtjb2xdID0geyB0YWtlbjogdHJ1ZSwgZXZlbnQgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENyZWF0ZSBwb3NpdGlvbiBkYXRhIGZvciB0aGUgdHJ1bmNhdGVkIHJlbmRlcmluZ1xuICAgICAgICAgIGNvbnN0IHRydW5jYXRlZFNwYW5EYXlzID0gZW5kQ29sIC0gdHJ5U3RhcnRDb2wgKyAxXG4gICAgICAgICAgZXZlbnRQb3NpdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBsZWZ0OiAodHJ5U3RhcnRDb2wgLyA3KSAqIDEwMCxcbiAgICAgICAgICAgIHdpZHRoOiAodHJ1bmNhdGVkU3BhbkRheXMgLyA3KSAqIDEwMCxcbiAgICAgICAgICAgIHRvcDpcbiAgICAgICAgICAgICAgREFZX05VTUJFUl9IRUlHSFQgK1xuICAgICAgICAgICAgICBHQVBfQkVUV0VFTl9FTEVNRU5UUyArXG4gICAgICAgICAgICAgIHRydW5jYXRlZEFzc2lnbmVkUm93ICogKEVWRU5UX0JBUl9IRUlHSFQgKyBHQVBfQkVUV0VFTl9FTEVNRU5UUyksXG4gICAgICAgICAgICBoZWlnaHQ6IEVWRU5UX0JBUl9IRUlHSFQsXG4gICAgICAgICAgICBwb3NpdGlvbjogdHJ1bmNhdGVkQXNzaWduZWRSb3csXG4gICAgICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHBsYWNlZFN1Y2Nlc3NmdWxseSA9IHRydWVcbiAgICAgICAgICBicmVhayAvLyBTdWNjZXNzZnVsbHkgcGxhY2VkLCBzdG9wIHRyeWluZyBvdGhlciBzdGFydCBwb3NpdGlvbnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFN0ZXAgMjogRmlsbCBnYXBzIHdpdGggc2luZ2xlLWRheSBldmVudHNcbiAgZm9yIChjb25zdCBldmVudCBvZiBzb3J0ZWRTaW5nbGVEYXkpIHtcbiAgICBjb25zdCBldmVudFN0YXJ0ID0gZGF5anMubWF4KGV2ZW50LnN0YXJ0LnN0YXJ0T2YoJ2RheScpLCB3ZWVrU3RhcnQpXG4gICAgY29uc3QgY29sID0gTWF0aC5tYXgoMCwgZXZlbnRTdGFydC5kaWZmKHdlZWtTdGFydCwgJ2RheScpKVxuXG4gICAgLy8gRmluZCB0aGUgZmlyc3QgYXZhaWxhYmxlIHJvdyBpbiB0aGlzIGNvbHVtblxuICAgIGxldCBhc3NpZ25lZFJvdyA9IC0xXG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgZGF5TWF4RXZlbnRzOyByb3crKykge1xuICAgICAgaWYgKCFncmlkW3Jvd11bY29sXS50YWtlbikge1xuICAgICAgICBhc3NpZ25lZFJvdyA9IHJvd1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGZvdW5kIGEgcm93LCBhc3NpZ24gdGhlIGV2ZW50XG4gICAgaWYgKGFzc2lnbmVkUm93ICE9PSAtMSkge1xuICAgICAgZ3JpZFthc3NpZ25lZFJvd11bY29sXSA9IHsgdGFrZW46IHRydWUsIGV2ZW50IH1cblxuICAgICAgLy8gQ3JlYXRlIHBvc2l0aW9uIGRhdGEgZm9yIHJlbmRlcmluZ1xuICAgICAgZXZlbnRQb3NpdGlvbnMucHVzaCh7XG4gICAgICAgIGxlZnQ6IChjb2wgLyA3KSAqIDEwMCxcbiAgICAgICAgd2lkdGg6ICgxIC8gNykgKiAxMDAsXG4gICAgICAgIHRvcDpcbiAgICAgICAgICBEQVlfTlVNQkVSX0hFSUdIVCArXG4gICAgICAgICAgR0FQX0JFVFdFRU5fRUxFTUVOVFMgK1xuICAgICAgICAgIGFzc2lnbmVkUm93ICogKEVWRU5UX0JBUl9IRUlHSFQgKyBHQVBfQkVUV0VFTl9FTEVNRU5UUyksXG4gICAgICAgIGhlaWdodDogRVZFTlRfQkFSX0hFSUdIVCxcbiAgICAgICAgcG9zaXRpb246IGFzc2lnbmVkUm93LFxuICAgICAgICAuLi5ldmVudCxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIHctZnVsbCBoLWZ1bGwgcG9pbnRlci1ldmVudHMtbm9uZSB6LTIwIG92ZXJmbG93LWNsaXBcIj5cbiAgICAgIHtldmVudFBvc2l0aW9ucy5tYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtgZXZlbnQtJHtldmVudC5pZH0tJHtldmVudC5wb3NpdGlvbn0tJHt3ZWVrU3RhcnQuZm9ybWF0KFxuICAgICAgICAgICAgICAnWVlZWS1NTS1ERCdcbiAgICAgICAgICAgICl9YH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHotMTAgcG9pbnRlci1ldmVudHMtYXV0byBvdmVyZmxvdy1jbGlwXCJcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGxlZnQ6IGBjYWxjKCR7ZXZlbnQubGVmdH0lICsgdmFyKC0tc3BhY2luZykgKiAwLjI1KWAsXG4gICAgICAgICAgICAgIHdpZHRoOiBgY2FsYygke2V2ZW50LndpZHRofSUgLSB2YXIoLS1zcGFjaW5nKSAqIDEpYCxcbiAgICAgICAgICAgICAgdG9wOiBgJHtldmVudC50b3B9cHhgLFxuICAgICAgICAgICAgICBoZWlnaHQ6IGAke0VWRU5UX0JBUl9IRUlHSFR9cHhgLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8RHJhZ2dhYmxlRXZlbnRcbiAgICAgICAgICAgICAgZWxlbWVudElkPXtgZXZlbnQtJHtldmVudC5pZH0tJHtcbiAgICAgICAgICAgICAgICBldmVudC5wb3NpdGlvblxuICAgICAgICAgICAgICB9LSR7d2Vla1N0YXJ0LmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgICAgIGV2ZW50PXtldmVudH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC1mdWxsIHctZnVsbCBzaGFkb3dcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKVxuICAgICAgfSl9XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsCiAgICAiaW1wb3J0IHsgU2Nyb2xsQXJlYSB9IGZyb20gJ0AvY29tcG9uZW50cy91aSdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgd2Vla09mWWVhciBmcm9tICdkYXlqcy9wbHVnaW4vd2Vla09mWWVhcidcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFdlZWtBbGxEYXlSb3cgfSBmcm9tICcuL3dlZWstYWxsLWRheS1yb3cnXG5pbXBvcnQgeyBXZWVrSGVhZGVyIH0gZnJvbSAnLi93ZWVrLWhlYWRlcidcbmltcG9ydCB7IFdlZWtUaW1lR3JpZCB9IGZyb20gJy4vd2Vlay10aW1lLWdyaWQnXG4vLyBBZGQgd2Vla09mWWVhciBwbHVnaW4gdG8gZGF5anNcbmRheWpzLmV4dGVuZCh3ZWVrT2ZZZWFyKVxuXG5jb25zdCBXZWVrVmlldzogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGgtZnVsbCBmbGV4LWNvbFwiIGRhdGEtdGVzdGlkPVwid2Vlay12aWV3XCI+XG4gICAgICB7LyogV2VlayBoZWFkZXIgcm93IC0gZml4ZWQgKi99XG4gICAgICA8V2Vla0hlYWRlciAvPlxuXG4gICAgICB7LyogU2Nyb2xsYWJsZSB0aW1lIGdyaWQgKi99XG4gICAgICA8U2Nyb2xsQXJlYVxuICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGZsZXgtMSBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJ3ZWVrLXNjcm9sbC1hcmVhXCJcbiAgICAgID5cbiAgICAgICAgey8qIEFsbC1kYXkgZXZlbnRzIHJvdyAtIGR5bmFtaWMgaGVpZ2h0IGJhc2VkIG9uIGNvbnRlbnQgKi99XG4gICAgICAgIDxXZWVrQWxsRGF5Um93IC8+XG4gICAgICAgIDxXZWVrVGltZUdyaWQgLz5cbiAgICAgIDwvU2Nyb2xsQXJlYT5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBXZWVrVmlld1xuIiwKICAgICJpbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCBSZWFjdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBEcmFnZ2FibGVFdmVudCB9IGZyb20gJy4uL2RyYWdnYWJsZS1ldmVudC9kcmFnZ2FibGUtZXZlbnQnXG5pbXBvcnQgeyBEcm9wcGFibGVDZWxsIH0gZnJvbSAnLi4vZHJvcHBhYmxlLWNlbGwvZHJvcHBhYmxlLWNlbGwnXG5pbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQsIFByb2Nlc3NlZENhbGVuZGFyRXZlbnQgfSBmcm9tICdAL2NvbXBvbmVudHMvdHlwZXMnXG5pbXBvcnQgeyBFVkVOVF9CQVJfSEVJR0hULCBHQVBfQkVUV0VFTl9FTEVNRU5UUyB9IGZyb20gJ0AvbGliL2NvbnN0YW50cydcblxuZXhwb3J0IGNvbnN0IFdlZWtBbGxEYXlSb3c6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREYXRlLCBnZXRFdmVudHNGb3JEYXRlUmFuZ2UsIGZpcnN0RGF5T2ZXZWVrIH0gPVxuICAgIHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgLy8gR2V0IHN0YXJ0IGFuZCBlbmQgb2YgY3VycmVudCB3ZWVrIGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrIHNldHRpbmdcbiAgY29uc3Qgc3RhcnRPZldlZWsgPSBjdXJyZW50RGF0ZS5zdGFydE9mKCd3ZWVrJykuZGF5KGZpcnN0RGF5T2ZXZWVrKVxuICAvLyBJZiBjdXJyZW50IGRhdGUgaXMgYmVmb3JlIHRoZSBzdGFydCBvZiB3ZWVrLCBtb3ZlIGJhY2sgb25lIHdlZWtcbiAgY29uc3QgYWRqdXN0ZWRTdGFydE9mV2VlayA9IGN1cnJlbnREYXRlLmlzQmVmb3JlKHN0YXJ0T2ZXZWVrKVxuICAgID8gc3RhcnRPZldlZWsuc3VidHJhY3QoMSwgJ3dlZWsnKVxuICAgIDogc3RhcnRPZldlZWtcbiAgY29uc3QgZW5kT2ZXZWVrID0gYWRqdXN0ZWRTdGFydE9mV2Vlay5hZGQoNiwgJ2RheScpXG5cbiAgLy8gQ3JlYXRlIGFuIGFycmF5IG9mIGRheXMgZm9yIHRoZSBjdXJyZW50IHdlZWtcbiAgY29uc3Qgd2Vla0RheXMgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgIHdlZWtEYXlzLnB1c2goYWRqdXN0ZWRTdGFydE9mV2Vlay5hZGQoaSwgJ2RheScpKVxuICB9XG5cbiAgLy8gR2V0IGV2ZW50cyB0aGF0IG1pZ2h0IG92ZXJsYXAgd2l0aCB0aGlzIHdlZWsgKGV4cGFuZCBzZWFyY2ggcmFuZ2UpXG4gIGNvbnN0IGV4cGFuZGVkU3RhcnREYXRlID0gYWRqdXN0ZWRTdGFydE9mV2Vlay5zdWJ0cmFjdCg2LCAnZGF5JykgLy8gTG9vayA2IGRheXMgYmVmb3JlIHdlZWsgc3RhcnRcbiAgY29uc3QgZXhwYW5kZWRFbmREYXRlID0gZW5kT2ZXZWVrLmFkZCg2LCAnZGF5JykgLy8gTG9vayA2IGRheXMgYWZ0ZXIgd2VlayBlbmRcbiAgY29uc3QgYWxsRXZlbnRzID0gZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlKGV4cGFuZGVkU3RhcnREYXRlLCBleHBhbmRlZEVuZERhdGUpXG5cbiAgLy8gRmlsdGVyIGV2ZW50cyB0aGF0IGFjdHVhbGx5IG92ZXJsYXAgd2l0aCB0aGUgY3VycmVudCB3ZWVrXG4gIGNvbnN0IHdlZWtFdmVudHMgPSBhbGxFdmVudHMuZmlsdGVyKChldmVudCkgPT4ge1xuICAgIC8vIEZpeGVkIGxvZ2ljOiBBbiBldmVudCBvdmVybGFwcyB3aXRoIHRoaXMgd2VlayBpZjpcbiAgICByZXR1cm4gKFxuICAgICAgLy8gRWl0aGVyIHRoZSBldmVudCBzdGFydHMgZHVyaW5nIHRoaXMgd2Vla1xuICAgICAgKGV2ZW50LnN0YXJ0LmlzU2FtZU9yQWZ0ZXIoYWRqdXN0ZWRTdGFydE9mV2VlaykgJiZcbiAgICAgICAgZXZlbnQuc3RhcnQuaXNTYW1lT3JCZWZvcmUoZW5kT2ZXZWVrKSkgfHxcbiAgICAgIC8vIE9yIHRoZSBldmVudCBlbmRzIGR1cmluZyB0aGlzIHdlZWtcbiAgICAgIChldmVudC5lbmQuaXNTYW1lT3JBZnRlcihhZGp1c3RlZFN0YXJ0T2ZXZWVrKSAmJlxuICAgICAgICBldmVudC5lbmQuaXNTYW1lT3JCZWZvcmUoZW5kT2ZXZWVrKSkgfHxcbiAgICAgIC8vIE9yIHRoZSBldmVudCBzcGFucyB0aGUgZW50aXJlIHdlZWsgKHN0YXJ0cyBiZWZvcmUgYW5kIGVuZHMgYWZ0ZXIpXG4gICAgICAoZXZlbnQuc3RhcnQuaXNCZWZvcmUoYWRqdXN0ZWRTdGFydE9mV2VlaykgJiZcbiAgICAgICAgZXZlbnQuZW5kLmlzQWZ0ZXIoZW5kT2ZXZWVrKSlcbiAgICApXG4gIH0pXG5cbiAgLy8gU2VwYXJhdGUgYWxsLWRheSBldmVudHMgZnJvbSByZWd1bGFyIGV2ZW50cyAoaW5jbHVkaW5nIG11bHRpLWRheSBldmVudHMpXG4gIGNvbnN0IGFsbERheUV2ZW50cyA9IHdlZWtFdmVudHMuZmlsdGVyKChldmVudCkgPT4gZXZlbnQuYWxsRGF5KVxuXG4gIC8vIFByb2Nlc3MgYW5kIGxheW91dCBhbGwtZGF5IGV2ZW50cyB0byBhdm9pZCBvdmVybGFwcGluZ1xuICBjb25zdCB7IHByb2Nlc3NlZEFsbERheUV2ZW50cyB9ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gU29ydCBhbGwtZGF5IGV2ZW50cyBieSBzdGFydCBkYXRlIGFuZCB0aGVuIGJ5IGR1cmF0aW9uIChsb25nZXIgZXZlbnRzIGZpcnN0KVxuICAgIGNvbnN0IHNvcnRlZEV2ZW50cyA9IFsuLi5hbGxEYXlFdmVudHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIC8vIEZpcnN0IGNvbXBhcmUgYnkgc3RhcnQgZGF0ZVxuICAgICAgY29uc3Qgc3RhcnREaWZmID0gYS5zdGFydC5kaWZmKGIuc3RhcnQpXG4gICAgICBpZiAoc3RhcnREaWZmICE9PSAwKSByZXR1cm4gc3RhcnREaWZmXG5cbiAgICAgIC8vIElmIHN0YXJ0IGRhdGVzIGFyZSB0aGUgc2FtZSwgbG9uZ2VyIGV2ZW50cyBjb21lIGZpcnN0XG4gICAgICBjb25zdCBhRHVyYXRpb24gPSBhLmVuZC5kaWZmKGEuc3RhcnQpXG4gICAgICBjb25zdCBiRHVyYXRpb24gPSBiLmVuZC5kaWZmKGIuc3RhcnQpXG4gICAgICByZXR1cm4gYkR1cmF0aW9uIC0gYUR1cmF0aW9uXG4gICAgfSlcblxuICAgIC8vIFRyYWNrIHBvc2l0aW9ucyBpbiByb3dzXG4gICAgY29uc3Qgcm93czogeyBlbmQ6IGRheWpzLkRheWpzOyBldmVudDogQ2FsZW5kYXJFdmVudCB9W11bXSA9IFtdXG4gICAgY29uc3QgcHJvY2Vzc2VkRXZlbnRzOiBQcm9jZXNzZWRDYWxlbmRhckV2ZW50W10gPSBbXVxuXG4gICAgc29ydGVkRXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAvLyBDYWxjdWxhdGUgd2hpY2ggZGF5cyB0aGlzIGV2ZW50IHNwYW5zXG4gICAgICBjb25zdCBldmVudFN0YXJ0ID0gZXZlbnQuc3RhcnQuaXNCZWZvcmUoYWRqdXN0ZWRTdGFydE9mV2VlaylcbiAgICAgICAgPyBhZGp1c3RlZFN0YXJ0T2ZXZWVrXG4gICAgICAgIDogZXZlbnQuc3RhcnRcbiAgICAgIGNvbnN0IGV2ZW50RW5kID0gZXZlbnQuZW5kLmlzQWZ0ZXIoZW5kT2ZXZWVrKSA/IGVuZE9mV2VlayA6IGV2ZW50LmVuZFxuXG4gICAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gYXMgcGVyY2VudGFnZSBvZiB0aGUgd2VlayB3aWR0aFxuICAgICAgY29uc3Qgc3RhcnREYXlJbmRleCA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBldmVudFN0YXJ0LmRpZmYoYWRqdXN0ZWRTdGFydE9mV2VlaywgJ2RheScpXG4gICAgICApXG4gICAgICBjb25zdCBlbmREYXlJbmRleCA9IE1hdGgubWluKDYsIGV2ZW50RW5kLmRpZmYoYWRqdXN0ZWRTdGFydE9mV2VlaywgJ2RheScpKVxuXG4gICAgICBjb25zdCBsZWZ0ID0gKHN0YXJ0RGF5SW5kZXggLyA3KSAqIDEwMFxuICAgICAgY29uc3Qgd2lkdGggPSAoKGVuZERheUluZGV4IC0gc3RhcnREYXlJbmRleCArIDEpIC8gNykgKiAxMDBcblxuICAgICAgLy8gRmluZCBhIHJvdyB3aGVyZSB0aGlzIGV2ZW50IGNhbiBmaXRcbiAgICAgIGxldCByb3dJbmRleCA9IDBcbiAgICAgIGxldCBwbGFjZWQgPSBmYWxzZVxuXG4gICAgICB3aGlsZSAoIXBsYWNlZCkge1xuICAgICAgICBpZiAocm93SW5kZXggPj0gcm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcm93IGlmIG5lZWRlZFxuICAgICAgICAgIHJvd3MucHVzaChbXSlcbiAgICAgICAgICBwbGFjZWQgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBldmVudCBjYW4gZml0IGluIHRoZSBjdXJyZW50IHJvd1xuICAgICAgICAgIGNvbnN0IHJvdyA9IHJvd3Nbcm93SW5kZXhdXG4gICAgICAgICAgY29uc3QgY2FuRml0ID0gcm93LmV2ZXJ5KChpdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICBldmVudFN0YXJ0LmlzQWZ0ZXIoaXRlbS5lbmQpIHx8XG4gICAgICAgICAgICAgIGV2ZW50RW5kLmlzQmVmb3JlKGl0ZW0uZXZlbnQuc3RhcnQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChjYW5GaXQpIHtcbiAgICAgICAgICAgIHBsYWNlZCA9IHRydWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93SW5kZXgrK1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgZXZlbnQgdG8gdGhlIHJvd1xuICAgICAgcm93c1tyb3dJbmRleF0ucHVzaCh7IGVuZDogZXZlbnRFbmQsIGV2ZW50IH0pXG5cbiAgICAgIC8vIEFkZCBwcm9jZXNzZWQgZXZlbnQgd2l0aCBjb3JyZWN0IHBvc2l0aW9uaW5nXG4gICAgICBwcm9jZXNzZWRFdmVudHMucHVzaCh7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBsZWZ0LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgdG9wOiByb3dJbmRleCAqIChFVkVOVF9CQVJfSEVJR0hUICsgR0FQX0JFVFdFRU5fRUxFTUVOVFMpLFxuICAgICAgICBoZWlnaHQ6IEVWRU5UX0JBUl9IRUlHSFQsXG4gICAgICAgIGFsbERheTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzZWRBbGxEYXlFdmVudHM6IHByb2Nlc3NlZEV2ZW50cyxcbiAgICAgIGFsbERheVJvd3NDb3VudDogTWF0aC5tYXgoMSwgcm93cy5sZW5ndGgpLCAvLyBBdCBsZWFzdCAxIHJvdywgZXZlbiBpZiBlbXB0eVxuICAgIH1cbiAgfSwgW2FsbERheUV2ZW50cywgYWRqdXN0ZWRTdGFydE9mV2VlaywgZW5kT2ZXZWVrXSlcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLVthdXRvXzFmcl8xZnJfMWZyXzFmcl8xZnJfMWZyXzFmcl0gZ3JpZC1yb3dzLTEgcmVsYXRpdmVcIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJ3ZWVrLWFsbC1kYXktcm93XCJcbiAgICA+XG4gICAgICB7LyogTGVmdCBsYWJlbCBmb3IgYWxsLWRheSBldmVudHMgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInctMTQgZmxleCBzaHJpbmstMCBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmQgYm9yZGVyLXggYm9yZGVyLWIgcHItMiBtaW4taC0xNlwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgdGV4dC1bMTBweF0gd2hpdGVzcGFjZS1ub3dyYXAgc206dGV4dC14c1wiPlxuICAgICAgICAgIEFsbC1kYXlcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBEcm9wcGFibGUgY2VsbHMgZm9yIGVhY2ggZGF5ICovfVxuICAgICAge3dlZWtEYXlzLm1hcCgoZGF5KSA9PiAoXG4gICAgICAgIDxEcm9wcGFibGVDZWxsXG4gICAgICAgICAga2V5PXtgYWxsLWRheS0ke2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgICAgIGlkPXtgYWxsLWRheS1jZWxsLSR7ZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgdHlwZT1cImRheS1jZWxsXCJcbiAgICAgICAgICBkYXRlPXtkYXl9XG4gICAgICAgICAgY2xhc3NOYW1lPVwiaG92ZXI6YmctYWNjZW50IGgtZnVsbCBmbGV4LTEgY3Vyc29yLXBvaW50ZXIgYm9yZGVyLXIgYm9yZGVyLWJcIlxuICAgICAgICAvPlxuICAgICAgKSl9XG5cbiAgICAgIHsvKiBBbGwtZGF5IGV2ZW50IGJsb2NrcyAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCB6LTEwIHAtMSBjb2wtc3Bhbi03IGNvbC1zdGFydC0yXCI+XG4gICAgICAgIHtwcm9jZXNzZWRBbGxEYXlFdmVudHMubWFwKChldmVudCwgaW5kZXgpID0+IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBrZXk9e2BhbGwtZGF5LWNvbnRhaW5lci0ke2V2ZW50LmlkfWB9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZVwiXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBsZWZ0OiBgJHtldmVudC5sZWZ0fSVgLFxuICAgICAgICAgICAgICB3aWR0aDogYGNhbGMoJHtldmVudC53aWR0aH0lIC0gdmFyKC0tc3BhY2luZykgKiAyKWAsXG4gICAgICAgICAgICAgIHRvcDogYCR7ZXZlbnQudG9wfXB4YCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBgJHtldmVudC5oZWlnaHR9cHhgLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8RHJhZ2dhYmxlRXZlbnRcbiAgICAgICAgICAgICAgZWxlbWVudElkPXtgYWxsLWRheS0ke2V2ZW50LmlkfS0ke2luZGV4fWB9XG4gICAgICAgICAgICAgIGV2ZW50PXtldmVudH1cbiAgICAgICAgICAgICAga2V5PXtgYWxsLWRheS0ke2V2ZW50LmlkfS0ke2luZGV4fWB9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtZnVsbCB3LWZ1bGwgb3ZlcmZsb3ctY2xpcCB0ZXh0LXhzIGFic29sdXRlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsCiAgICAiaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IEFuaW1hdGVQcmVzZW5jZSwgbW90aW9uIH0gZnJvbSAnbW90aW9uL3JlYWN0J1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuXG5leHBvcnQgY29uc3QgV2Vla0hlYWRlcjogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjdXJyZW50RGF0ZSxcbiAgICBzZWxlY3REYXRlLFxuICAgIG9wZW5FdmVudEZvcm0sXG4gICAgZmlyc3REYXlPZldlZWssXG4gICAgc3RpY2t5Vmlld0hlYWRlcixcbiAgICB2aWV3SGVhZGVyQ2xhc3NOYW1lLFxuICB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBHZXQgc3RhcnQgYW5kIGVuZCBvZiBjdXJyZW50IHdlZWsgYmFzZWQgb24gZmlyc3REYXlPZldlZWsgc2V0dGluZ1xuICBjb25zdCBzdGFydE9mV2VlayA9IGN1cnJlbnREYXRlLnN0YXJ0T2YoJ3dlZWsnKS5kYXkoZmlyc3REYXlPZldlZWspXG4gIC8vIElmIGN1cnJlbnQgZGF0ZSBpcyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHdlZWssIG1vdmUgYmFjayBvbmUgd2Vla1xuICBjb25zdCBhZGp1c3RlZFN0YXJ0T2ZXZWVrID0gY3VycmVudERhdGUuaXNCZWZvcmUoc3RhcnRPZldlZWspXG4gICAgPyBzdGFydE9mV2Vlay5zdWJ0cmFjdCgxLCAnd2VlaycpXG4gICAgOiBzdGFydE9mV2Vla1xuXG4gIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBkYXlzIGZvciB0aGUgY3VycmVudCB3ZWVrXG4gIGNvbnN0IHdlZWtEYXlzID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICB3ZWVrRGF5cy5wdXNoKGFkanVzdGVkU3RhcnRPZldlZWsuYWRkKGksICdkYXknKSlcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgLy8gY3NzIGdyaWQgaGVhZGVyIHdpdGggbGVmIGNvcm5lciBjZWxsIHNob3J0ZXIgdGhhbiB0aGUgcmVzdFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdncmlkIGdyaWQtY29scy1bYXV0b18xZnJfMWZyXzFmcl8xZnJfMWZyXzFmcl8xZnJdIGdyaWQtcm93cy0xJyxcbiAgICAgICAgc3RpY2t5Vmlld0hlYWRlciAmJiAnc3RpY2t5IHRvcC0wIHotMTAwJyxcbiAgICAgICAgdmlld0hlYWRlckNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIGRhdGEtdGVzdGlkPVwid2Vlay1oZWFkZXJcIlxuICAgID5cbiAgICAgIHsvKiBDb3JuZXIgY2VsbCB3aXRoIHdlZWsgbnVtYmVyICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc3Bhbi0xIHctMTQgc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJvcmRlci14IGJvcmRlci1iIHAtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRleHQteHNcIj5XZWVrPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+e2N1cnJlbnREYXRlLndlZWsoKX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBEYXkgaGVhZGVyIGNlbGxzICovfVxuICAgICAge3dlZWtEYXlzLm1hcCgoZGF5LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBpc1RvZGF5ID0gZGF5LmlzU2FtZShkYXlqcygpLCAnZGF5JylcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxBbmltYXRlUHJlc2VuY2Uga2V5PXtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9IG1vZGU9XCJ3YWl0XCI+XG4gICAgICAgICAgICA8bW90aW9uLmRpdlxuICAgICAgICAgICAgICBrZXk9e2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgICAgaW5pdGlhbD17eyBvcGFjaXR5OiAwLCB5OiAtMTAgfX1cbiAgICAgICAgICAgICAgYW5pbWF0ZT17eyBvcGFjaXR5OiAxLCB5OiAwIH19XG4gICAgICAgICAgICAgIGV4aXQ9e3sgb3BhY2l0eTogMCwgeTogLTEwIH19XG4gICAgICAgICAgICAgIHRyYW5zaXRpb249e3tcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMC4yNSxcbiAgICAgICAgICAgICAgICBlYXNlOiAnZWFzZUluT3V0JyxcbiAgICAgICAgICAgICAgICBkZWxheTogaW5kZXggKiAwLjA1LFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICdob3ZlcjpiZy1hY2NlbnQgZmxleC0xIGN1cnNvci1wb2ludGVyIHAtMSB0ZXh0LWNlbnRlciBzbTpwLTIgYm9yZGVyLXIgYm9yZGVyLWInLFxuICAgICAgICAgICAgICAgIGlzVG9kYXkgJiYgJ2JnLXByaW1hcnkvMTAgZm9udC1ib2xkJ1xuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0RGF0ZShkYXkpXG4gICAgICAgICAgICAgICAgb3BlbkV2ZW50Rm9ybShkYXkpXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgd2Vlay1kYXktaGVhZGVyLSR7ZGF5LmZvcm1hdCgnZGRkZCcpLnRvTG93ZXJDYXNlKCl9YH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj57ZGF5LmZvcm1hdCgnZGRkJyl9PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICAgJ214LWF1dG8gbXQtMSBmbGV4IGgtNSB3LTUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtZnVsbCB0ZXh0LXhzIHNtOmgtNyBzbTp3LTcgc206dGV4dC1zbScsXG4gICAgICAgICAgICAgICAgICBpc1RvZGF5ICYmICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJ1xuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7ZGF5LmRhdGUoKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21vdGlvbi5kaXY+XG4gICAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICAgIClcbiAgICAgIH0pfVxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcblxuaW50ZXJmYWNlIFByb2Nlc3NlZEV2ZW50IGV4dGVuZHMgQ2FsZW5kYXJFdmVudCB7XG4gIGxlZnQ6IG51bWJlciAvLyBMZWZ0IHBvc2l0aW9uIGluIHBlcmNlbnRhZ2VcbiAgd2lkdGg6IG51bWJlciAvLyBXaWR0aCBpbiBwZXJjZW50YWdlXG4gIHRvcDogbnVtYmVyIC8vIFRvcCBwb3NpdGlvbiBpbiBwZXJjZW50YWdlXG4gIGhlaWdodDogbnVtYmVyIC8vIEhlaWdodCBpbiBwZXJjZW50YWdlXG4gIHpJbmRleD86IG51bWJlciAvLyBaLWluZGV4IGZvciBsYXllcmluZyBvdmVybGFwcGluZyBldmVudHNcbn1cblxuaW50ZXJmYWNlIFVzZVByb2Nlc3NlZERheUV2ZW50c1Byb3BzIHtcbiAgZGF5OiBkYXlqcy5EYXlqcyAvLyBUaGUgc3BlY2lmaWMgZGF5IHRoaXMgY29sdW1uIHJlcHJlc2VudHNcbn1cblxuZXhwb3J0IGNvbnN0IHVzZVByb2Nlc3NlZERheUV2ZW50cyA9ICh7IGRheSB9OiBVc2VQcm9jZXNzZWREYXlFdmVudHNQcm9wcykgPT4ge1xuICBjb25zdCB7IGdldEV2ZW50c0ZvckRhdGVSYW5nZSB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICBjb25zdCB0b2RheUV2ZW50cyA9IHVzZU1lbW88UHJvY2Vzc2VkRXZlbnRbXT4oKCkgPT4ge1xuICAgIGxldCBldmVudHNGb3JEYXkgPSBnZXRFdmVudHNGb3JEYXRlUmFuZ2UoXG4gICAgICBkYXkuc3RhcnRPZignZGF5JyksXG4gICAgICBkYXkuZW5kT2YoJ2RheScpXG4gICAgKVxuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwtZGF5IGV2ZW50cyBhbmQgc29ydCBieSBzdGFydCB0aW1lXG4gICAgZXZlbnRzRm9yRGF5ID0gZXZlbnRzRm9yRGF5XG4gICAgICAuZmlsdGVyKChlKSA9PiAhZS5hbGxEYXkpXG4gICAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEuc3RhcnQuZGlmZihiLnN0YXJ0KSlcblxuICAgIGlmIChldmVudHNGb3JEYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICAvLyBTdGVwIDE6IEdyb3VwIGV2ZW50cyBpbnRvIGNsdXN0ZXJzIG9mIG92ZXJsYXBwaW5nIGV2ZW50c1xuICAgIGNvbnN0IGNsdXN0ZXJzOiBDYWxlbmRhckV2ZW50W11bXSA9IFtdXG4gICAgbGV0IGN1cnJlbnRDbHVzdGVyOiBDYWxlbmRhckV2ZW50W10gPSBbXVxuICAgIGxldCBsYXN0RXZlbnRFbmQ6IGRheWpzLkRheWpzIHwgbnVsbCA9IG51bGxcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50c0ZvckRheSkge1xuICAgICAgaWYgKGxhc3RFdmVudEVuZCAmJiBldmVudC5zdGFydC5pc1NhbWVPckFmdGVyKGxhc3RFdmVudEVuZCkpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRDbHVzdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjbHVzdGVycy5wdXNoKGN1cnJlbnRDbHVzdGVyKVxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRDbHVzdGVyID0gW11cbiAgICAgIH1cbiAgICAgIGN1cnJlbnRDbHVzdGVyLnB1c2goZXZlbnQpXG4gICAgICBsYXN0RXZlbnRFbmQgPSBsYXN0RXZlbnRFbmRcbiAgICAgICAgPyBkYXlqcy5tYXgobGFzdEV2ZW50RW5kLCBldmVudC5lbmQpXG4gICAgICAgIDogZXZlbnQuZW5kXG4gICAgfVxuICAgIGlmIChjdXJyZW50Q2x1c3Rlci5sZW5ndGggPiAwKSB7XG4gICAgICBjbHVzdGVycy5wdXNoKGN1cnJlbnRDbHVzdGVyKVxuICAgIH1cblxuICAgIC8vIFN0ZXAgMjogRm9yIGVhY2ggY2x1c3RlciwgdXNlIGEgbW9yZSBpbnRlbGxpZ2VudCBjb2x1bW4gYXNzaWdubWVudFxuICAgIGNvbnN0IHByb2Nlc3NlZEV2ZW50czogUHJvY2Vzc2VkRXZlbnRbXSA9IFtdXG4gICAgZm9yIChjb25zdCBjbHVzdGVyIG9mIGNsdXN0ZXJzKSB7XG4gICAgICBpZiAoY2x1c3Rlci5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gU2luZ2xlIGV2ZW50IHRha2VzIGZ1bGwgd2lkdGhcbiAgICAgICAgY29uc3QgZXZlbnQgPSBjbHVzdGVyWzBdXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGV2ZW50LnN0YXJ0LmhvdXIoKSArIGV2ZW50LnN0YXJ0Lm1pbnV0ZSgpIC8gNjBcbiAgICAgICAgbGV0IGVuZFRpbWUgPSBldmVudC5lbmQuaG91cigpICsgZXZlbnQuZW5kLm1pbnV0ZSgpIC8gNjBcbiAgICAgICAgaWYgKGVuZFRpbWUgPCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZXZlbnQgZW5kcyBvbiB0aGUgbmV4dCBkYXksIHNldCBlbmQgdGltZSB0byAyNCBob3Vyc1xuICAgICAgICAgIGVuZFRpbWUgPSAyNFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsRHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lXG4gICAgICAgIGNvbnN0IHRvcCA9IChzdGFydFRpbWUgLyAyNCkgKiAxMDBcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gKHRvdGFsRHVyYXRpb24gLyAyNCkgKiAxMDBcbiAgICAgICAgcHJvY2Vzc2VkRXZlbnRzLnB1c2goeyAuLi5ldmVudCwgbGVmdDogMCwgd2lkdGg6IDEwMCwgdG9wLCBoZWlnaHQgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gTXVsdGlwbGUgZXZlbnRzIC0gdXNlIGxheWVyZWQgcG9zaXRpb25pbmcgYXBwcm9hY2hcbiAgICAgIC8vIFNvcnQgYnkgZHVyYXRpb24gKGxvbmdlc3QgZmlyc3QpLCB0aGVuIGJ5IHN0YXJ0IHRpbWVcbiAgICAgIGNvbnN0IHNvcnRlZEV2ZW50cyA9IFsuLi5jbHVzdGVyXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFEdXJhdGlvbiA9IGEuZW5kLmRpZmYoYS5zdGFydCwgJ21pbnV0ZScpXG4gICAgICAgIGNvbnN0IGJEdXJhdGlvbiA9IGIuZW5kLmRpZmYoYi5zdGFydCwgJ21pbnV0ZScpXG5cbiAgICAgICAgLy8gTG9uZ2VyIGV2ZW50cyBmaXJzdFxuICAgICAgICBpZiAoYUR1cmF0aW9uICE9PSBiRHVyYXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gYkR1cmF0aW9uIC0gYUR1cmF0aW9uXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBzYW1lIGR1cmF0aW9uLCBlYXJsaWVyIHN0YXJ0IHRpbWUgZmlyc3RcbiAgICAgICAgcmV0dXJuIGEuc3RhcnQuZGlmZihiLnN0YXJ0KVxuICAgICAgfSlcblxuICAgICAgLy8gUHJvY2VzcyBldmVudHMgd2l0aCBsYXllcmVkIHBvc2l0aW9uaW5nXG4gICAgICBjb25zdCB0b3RhbEV2ZW50cyA9IHNvcnRlZEV2ZW50cy5sZW5ndGhcblxuICAgICAgLy8gQ2FsY3VsYXRlIGR5bmFtaWMgb2Zmc2V0IGJhc2VkIG9uIG51bWJlciBvZiBvdmVybGFwcGluZyBldmVudHNcbiAgICAgIC8vIEZld2VyIGV2ZW50cyA9IGxhcmdlciBpbmRpdmlkdWFsIG9mZnNldHMsIG1vcmUgZXZlbnRzID0gc21hbGxlciBvZmZzZXRzXG4gICAgICBsZXQgbWF4T2Zmc2V0OiBudW1iZXJcbiAgICAgIGlmICh0b3RhbEV2ZW50cyA9PT0gMikge1xuICAgICAgICBtYXhPZmZzZXQgPSAyNSAvLyAyNSUgb2Zmc2V0IGZvciAyIGV2ZW50c1xuICAgICAgfSBlbHNlIGlmICh0b3RhbEV2ZW50cyA9PT0gMykge1xuICAgICAgICBtYXhPZmZzZXQgPSA1MCAvLyA1MCUgdG90YWwgZm9yIDMgZXZlbnRzICgyNSUgZWFjaClcbiAgICAgIH0gZWxzZSBpZiAodG90YWxFdmVudHMgPT09IDQpIHtcbiAgICAgICAgbWF4T2Zmc2V0ID0gNjAgLy8gNjAlIHRvdGFsIGZvciA0IGV2ZW50cyAoMjAlIGVhY2gpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXhPZmZzZXQgPSA3MCAvLyA3MCUgdG90YWwgZm9yIDUrIGV2ZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvZmZzZXRQZXJFdmVudCA9IHRvdGFsRXZlbnRzID4gMSA/IG1heE9mZnNldCAvICh0b3RhbEV2ZW50cyAtIDEpIDogMFxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZEV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBldmVudCA9IHNvcnRlZEV2ZW50c1tpXVxuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBldmVudC5zdGFydC5ob3VyKCkgKyBldmVudC5zdGFydC5taW51dGUoKSAvIDYwXG4gICAgICAgIGxldCBlbmRUaW1lID0gZXZlbnQuZW5kLmhvdXIoKSArIGV2ZW50LmVuZC5taW51dGUoKSAvIDYwXG5cbiAgICAgICAgaWYgKGVuZFRpbWUgPCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZXZlbnQgZW5kcyBvbiB0aGUgbmV4dCBkYXksIHNldCBlbmQgdGltZSB0byAyNCBob3Vyc1xuICAgICAgICAgIGVuZFRpbWUgPSAyNFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxEdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWVcbiAgICAgICAgY29uc3QgdG9wID0gKHN0YXJ0VGltZSAvIDI0KSAqIDEwMFxuICAgICAgICBjb25zdCBoZWlnaHQgPSAodG90YWxEdXJhdGlvbiAvIDI0KSAqIDEwMFxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbmluZyBiYXNlZCBvbiBsYXllciBhbmQgdG90YWwgZXZlbnRzXG4gICAgICAgIGxldCBsZWZ0OiBudW1iZXJcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXJcbiAgICAgICAgbGV0IHpJbmRleDogbnVtYmVyXG5cbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAvLyBGaXJzdCBldmVudCAobG9uZ2VzdCkgdGFrZXMgZnVsbCB3aWR0aCBhdCBib3R0b21cbiAgICAgICAgICBsZWZ0ID0gMFxuICAgICAgICAgIHdpZHRoID0gMTAwXG4gICAgICAgICAgekluZGV4ID0gMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN1YnNlcXVlbnQgZXZlbnRzIGFyZSBvZmZzZXQgZHluYW1pY2FsbHkgYmFzZWQgb24gdG90YWwgZXZlbnQgY291bnRcbiAgICAgICAgICBsZWZ0ID0gb2Zmc2V0UGVyRXZlbnQgKiBpXG4gICAgICAgICAgd2lkdGggPSAxMDAgLSBsZWZ0IC8vIFJlbWFpbmluZyB3aWR0aFxuICAgICAgICAgIHpJbmRleCA9IGkgKyAxIC8vIEhpZ2hlciB6LWluZGV4IGZvciBldmVudHMgb24gdG9wXG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzZWRFdmVudHMucHVzaCh7XG4gICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIHpJbmRleCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvY2Vzc2VkRXZlbnRzXG4gIH0sIFtkYXksIGdldEV2ZW50c0ZvckRhdGVSYW5nZV0pXG5cbiAgcmV0dXJuIHRvZGF5RXZlbnRzXG59XG4iLAogICAgImltcG9ydCB7IHVzZVByb2Nlc3NlZERheUV2ZW50cyB9IGZyb20gJ0AvaG9va3MvdXNlUHJvY2Vzc2VkRGF5RXZlbnRzJ1xuaW1wb3J0IHsgRHJhZ2dhYmxlRXZlbnQgfSBmcm9tICcuLi9kcmFnZ2FibGUtZXZlbnQvZHJhZ2dhYmxlLWV2ZW50J1xuaW1wb3J0IHR5cGUgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuaW50ZXJmYWNlIERheUV2ZW50c0xheWVyUHJvcHMge1xuICBkYXk6IGRheWpzLkRheWpzIC8vIFRoZSBzcGVjaWZpYyBkYXkgdGhpcyBsYXllciByZXByZXNlbnRzXG4gICdkYXRhLXRlc3RpZCc/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IERheUV2ZW50c0xheWVyOiBSZWFjdC5GQzxEYXlFdmVudHNMYXllclByb3BzPiA9ICh7XG4gIGRheSxcbiAgJ2RhdGEtdGVzdGlkJzogZGF0YVRlc3RJZCxcbn0pID0+IHtcbiAgY29uc3QgdG9kYXlFdmVudHMgPSB1c2VQcm9jZXNzZWREYXlFdmVudHMoeyBkYXkgfSlcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdGVzdGlkPXtkYXRhVGVzdElkfVxuICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBpbnNldC0wIHotMzBcIlxuICAgID5cbiAgICAgIHt0b2RheUV2ZW50cy5tYXAoKGV2ZW50LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB2ZXJ5VmVyeVVuaXF1ZUtleSA9IGBldmVudC0ke2V2ZW50LmlkfS0ke2luZGV4fS0ke2RheS5mb3JtYXQoXG4gICAgICAgICAgJ1lZWVktTU0tREQnXG4gICAgICAgICl9YFxuICAgICAgICBjb25zdCBpc1Nob3J0RXZlbnQgPSBldmVudC5lbmQuZGlmZihldmVudC5zdGFydCwgJ21pbnV0ZScpIDw9IDE1XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtgY29udGFpbmVyLSR7dmVyeVZlcnlVbmlxdWVLZXl9YH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlXCJcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGxlZnQ6IGAke2V2ZW50LmxlZnR9JWAsXG4gICAgICAgICAgICAgIHdpZHRoOiBgY2FsYygke2V2ZW50LndpZHRofSUgLSB2YXIoLS1zcGFjaW5nKSAqIDIpYCxcbiAgICAgICAgICAgICAgdG9wOiBgJHtldmVudC50b3B9JWAsXG4gICAgICAgICAgICAgIGhlaWdodDogYCR7ZXZlbnQuaGVpZ2h0fSVgLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8RHJhZ2dhYmxlRXZlbnRcbiAgICAgICAgICAgICAgZWxlbWVudElkPXtgZHJhZ2dhYmxlLSR7dmVyeVZlcnlVbmlxdWVLZXl9YH1cbiAgICAgICAgICAgICAgZXZlbnQ9e2V2ZW50fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKCdwb2ludGVyLWV2ZW50cy1hdXRvIGFic29sdXRlJywge1xuICAgICAgICAgICAgICAgICdbJl9wXTp0ZXh0LVsxMHB4XSBbJl9wXTptdC0wJzogaXNTaG9ydEV2ZW50LFxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIClcbiAgICAgIH0pfVxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5pbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRGF5RXZlbnRzTGF5ZXIgfSBmcm9tICcuLi9kYXktdmlldy9kYXktZXZlbnRzLWxheWVyJ1xuaW1wb3J0IHsgRHJvcHBhYmxlQ2VsbCB9IGZyb20gJy4uL2Ryb3BwYWJsZS1jZWxsL2Ryb3BwYWJsZS1jZWxsJ1xuXG5jb25zdCBob3VycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDI0IH0sIChfLCBpKSA9PiBpKS5tYXAoKGhvdXIpID0+XG4gIGRheWpzKCkuaG91cihob3VyKS5taW51dGUoMClcbilcblxuaW50ZXJmYWNlIFdlZWtEYXlDb2xQcm9wcyB7XG4gIGRheTogZGF5anMuRGF5anMgLy8gVGhlIHNwZWNpZmljIGRheSB0aGlzIGNvbHVtbiByZXByZXNlbnRzXG59XG5cbmV4cG9ydCBjb25zdCBXZWVrRGF5Q29sOiBSZWFjdC5GQzxXZWVrRGF5Q29sUHJvcHM+ID0gKHsgZGF5IH0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXRlc3RpZD17YHdlZWstZGF5LWNvbC0ke2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgY2xhc3NOYW1lPVwiY29sLXNwYW4tMSByZWxhdGl2ZSBncmlkIGdyaWQtcm93cy0yNCBib3JkZXItclwiXG4gICAgPlxuICAgICAge2hvdXJzLm1hcCgodGltZSkgPT4ge1xuICAgICAgICBjb25zdCBob3VyID0gdGltZS5ob3VyKClcbiAgICAgICAgY29uc3QgY2VsbERhdGUgPSBkYXkuZm9ybWF0KCdZWVlZLU1NLUREJylcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxEcm9wcGFibGVDZWxsXG4gICAgICAgICAgICBrZXk9e2Ake2NlbGxEYXRlfS0ke3RpbWUuZm9ybWF0KCdISCcpfWB9XG4gICAgICAgICAgICBpZD17YHRpbWUtY2VsbC0ke2NlbGxEYXRlfS0ke3RpbWUuZm9ybWF0KCdISCcpfWB9XG4gICAgICAgICAgICB0eXBlPVwidGltZS1jZWxsXCJcbiAgICAgICAgICAgIGRhdGU9e2RheX1cbiAgICAgICAgICAgIGhvdXI9e2hvdXJ9XG4gICAgICAgICAgICBkYXRhLXRlc3RpZD17YHdlZWstdGltZS1jZWxsLSR7Y2VsbERhdGV9LSR7dGltZS5mb3JtYXQoJ0hIJyl9YH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdob3ZlcjpiZy1hY2NlbnQgcmVsYXRpdmUgei0yMCBoLVs2MHB4XSBjdXJzb3ItcG9pbnRlciBib3JkZXItYidcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKVxuICAgICAgfSl9XG5cbiAgICAgIHsvKiBFdmVudCBibG9ja3MgbGF5ZXIgKi99XG4gICAgICA8RGF5RXZlbnRzTGF5ZXJcbiAgICAgICAgZGF0YS10ZXN0aWQ9e2B3ZWVrLWRheS1ldmVudHMtJHtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9YH1cbiAgICAgICAgZGF5PXtkYXl9XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFdlZWtEYXlDb2wgfSBmcm9tICcuL3dlZWstZGF5LWNvbCdcblxuY29uc3QgaG91cnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNCB9LCAoXywgaSkgPT4gaSkubWFwKChob3VyKSA9PlxuICBkYXlqcygpLmhvdXIoaG91cikubWludXRlKDApXG4pXG5cbmV4cG9ydCBjb25zdCBXZWVrVGltZUdyaWQ6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREYXRlLCBmaXJzdERheU9mV2VlayB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBHZXQgc3RhcnQgYW5kIGVuZCBvZiBjdXJyZW50IHdlZWsgYmFzZWQgb24gZmlyc3REYXlPZldlZWsgc2V0dGluZ1xuICBjb25zdCBzdGFydE9mV2VlayA9IGN1cnJlbnREYXRlLnN0YXJ0T2YoJ3dlZWsnKS5kYXkoZmlyc3REYXlPZldlZWspXG4gIC8vIElmIGN1cnJlbnQgZGF0ZSBpcyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHdlZWssIG1vdmUgYmFjayBvbmUgd2Vla1xuICBjb25zdCBhZGp1c3RlZFN0YXJ0T2ZXZWVrID0gY3VycmVudERhdGUuaXNCZWZvcmUoc3RhcnRPZldlZWspXG4gICAgPyBzdGFydE9mV2Vlay5zdWJ0cmFjdCgxLCAnd2VlaycpXG4gICAgOiBzdGFydE9mV2Vla1xuXG4gIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBkYXlzIGZvciB0aGUgY3VycmVudCB3ZWVrXG4gIGNvbnN0IHdlZWtEYXlzID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICB3ZWVrRGF5cy5wdXNoKGFkanVzdGVkU3RhcnRPZldlZWsuYWRkKGksICdkYXknKSlcbiAgfVxuXG4gIC8vIFNlcGFyYXRlIGFsbC1kYXkgZXZlbnRzIGZyb20gcmVndWxhciBldmVudHMgKGluY2x1ZGluZyBtdWx0aS1kYXkgZXZlbnRzKVxuXG4gIC8vIEZpbmQgaWYgY3VycmVudCBkYXkgaXMgaW4gdGhlIGRpc3BsYXllZCB3ZWVrXG4gIGNvbnN0IHRvZGF5SW5kZXggPSB3ZWVrRGF5cy5maW5kSW5kZXgoKGRheSkgPT4gZGF5LmlzU2FtZShkYXlqcygpLCAnZGF5JykpXG4gIGNvbnN0IGlzQ3VycmVudFdlZWsgPSB0b2RheUluZGV4ICE9PSAtMVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS10ZXN0aWQ9XCJ3ZWVrLXRpbWUtZ3JpZFwiXG4gICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBoLWZ1bGwgZ3JpZCBncmlkLWNvbHMtW2F1dG9fcmVwZWF0KDcsMWZyKV0gZ3JpZC1yb3dzLVtyZXBlYXQoMjQsbWlubWF4KDYwcHgsIDFmcikpXVwiXG4gICAgPlxuICAgICAgey8qIFRpbWUgbGFiZWxzIGNvbHVtbiAtIGZpeGVkICovfVxuICAgICAgPGRpdlxuICAgICAgICBkYXRhLXRlc3RpZD1cIndlZWstdGltZS1sYWJlbHNcIlxuICAgICAgICBjbGFzc05hbWU9XCJ6LTEwIGNvbC1zcGFuLTEgdy0xNCBncmlkIGdyaWQtcm93cy0yNCBib3JkZXIteFwiXG4gICAgICA+XG4gICAgICAgIHtob3Vycy5tYXAoKHRpbWUpID0+IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBrZXk9e3RpbWUuZm9ybWF0KCdISDptbScpfVxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2B3ZWVrLXRpbWUtaG91ci0ke3RpbWUuZm9ybWF0KCdISCcpfWB9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJoLVs2MHB4XSBib3JkZXItYiB0ZXh0LXJpZ2h0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgcHItMiB0ZXh0LXJpZ2h0IHRleHQtWzEwcHhdIHNtOnRleHQteHNcIj5cbiAgICAgICAgICAgICAge3RpbWUuZm9ybWF0KCdoIEEnKX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIERheSBjb2x1bW5zIHdpdGggdGltZSBzbG90cyAqL31cbiAgICAgIHt3ZWVrRGF5cy5tYXAoKGRheSkgPT4gKFxuICAgICAgICA8V2Vla0RheUNvbCBrZXk9e2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX0gZGF5PXtkYXl9IC8+XG4gICAgICApKX1cblxuICAgICAgey8qIEN1cnJlbnQgdGltZSBpbmRpY2F0b3IgKi99XG4gICAgICB7aXNDdXJyZW50V2VlayAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIndlZWstY3VycmVudC10aW1lLWluZGljYXRvclwiXG4gICAgICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSB6LTIwXCJcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgdG9wOiBgJHsoZGF5anMoKS5ob3VyKCkgKyBkYXlqcygpLm1pbnV0ZSgpIC8gNjApICogNjB9cHhgLFxuICAgICAgICAgICAgbGVmdDogYCR7dG9kYXlJbmRleCAqICgxMDAgLyA3KX0lYCxcbiAgICAgICAgICAgIHdpZHRoOiBgJHsxMDAgLyA3fSVgLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBib3JkZXItdCBib3JkZXItcmVkLTUwMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCItbXQtMSBtbC0xIGgtMiB3LTIgcm91bmRlZC1mdWxsIGJnLXJlZC01MDBcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB7IFNjcm9sbEFyZWEgfSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5pbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgRnJhZ21lbnQgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IERyb3BwYWJsZUNlbGwgfSBmcm9tICcuLi9kcm9wcGFibGUtY2VsbC9kcm9wcGFibGUtY2VsbCdcbmltcG9ydCB7IERheUFsbERheVJvdyB9IGZyb20gJy4vZGF5LWFsbC1kYXktcm93J1xuaW1wb3J0IHsgRGF5RXZlbnRzTGF5ZXIgfSBmcm9tICcuL2RheS1ldmVudHMtbGF5ZXInXG5pbXBvcnQgeyBEYXlIZWFkZXIgfSBmcm9tICcuL2RheS1oZWFkZXInXG5pbXBvcnQgeyBEYXlUaW1lQ29sIH0gZnJvbSAnLi9kYXktdGltZS1jb2wnXG5cbmNvbnN0IERheVZpZXcgPSAoKSA9PiB7XG4gIGNvbnN0IHsgY3VycmVudERhdGUgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgLy8gSG91cnMgdG8gZGlzcGxheSAoYWxsIDI0IGhvdXJzIG9mIHRoZSBkYXkpXG4gIGNvbnN0IGhvdXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjQgfSwgKF8sIGkpID0+IGkpLm1hcCgoaG91cikgPT4ge1xuICAgIHJldHVybiBkYXlqcygpLmhvdXIoaG91cikubWludXRlKDApXG4gIH0pXG5cbiAgLy8gRm9yIG1vcmUgZ3JhbnVsYXIgdGltZSBzbG90cywgd2UnbGwgZGl2aWRlIGVhY2ggaG91ciBpbnRvIDE1LW1pbnV0ZSBzZWdtZW50c1xuICBjb25zdCB0aW1lU2VnbWVudHMgPSBbMCwgMTUsIDMwLCA0NV1cblxuICAvLyBHZXQgY3VycmVudCBkYXkncyBldmVudHMgLSB0aGlzIHdpbGwgcmVmcmVzaCBhdXRvbWF0aWNhbGx5IHdoZW4gc3RvcmUgdXBkYXRlc1xuICAvLyBiZWNhdXNlIGdldEV2ZW50c0ZvckRhdGUgaXMgYSBzZWxlY3RvciBmdW5jdGlvbiBmcm9tIHRoZSBzdG9yZSB0aGF0IHJ1bnMgd2hlbmV2ZXIgZXZlbnRzIGNoYW5nZVxuXG4gIGNvbnN0IGlzVG9kYXkgPSBjdXJyZW50RGF0ZS5pc1NhbWUoZGF5anMoKSwgJ2RheScpXG4gIGNvbnN0IGNlbGxEYXRlID0gY3VycmVudERhdGUuZm9ybWF0KCdZWVlZLU1NLUREJylcblxuICByZXR1cm4gKFxuICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJkYXktdmlld1wiIGNsYXNzTmFtZT1cImZsZXggaC1mdWxsIGZsZXgtY29sXCI+XG4gICAgICB7LyogRGF5IGhlYWRlciAqL31cbiAgICAgIDxEYXlIZWFkZXIgLz5cblxuICAgICAgey8qIFRpbWUgZ3JpZCB3aXRob3V0IHNjcm9sbGJhciAqL31cbiAgICAgIDxTY3JvbGxBcmVhXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LXNjcm9sbC1hcmVhXCJcbiAgICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleC0xIG92ZXJmbG93LXktYXV0b1wiXG4gICAgICA+XG4gICAgICAgIHsvKiBBbGwtZGF5IGV2ZW50cyByb3cgKi99XG4gICAgICAgIDxEYXlBbGxEYXlSb3cgLz5cblxuICAgICAgICB7LyogU2V0IGEgZml4ZWQgaGVpZ2h0IGNvbnRhaW5lciB0aGF0IG1hdGNoZXMgZXhhY3RseSB0aGUgdG90YWwgaGVpZ2h0IG9mIGFsbCBob3VyIGJsb2NrcyAqL31cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LXRpbWUtZ3JpZFwiXG4gICAgICAgICAgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtOCBkaXZpZGUteCBib3JkZXIteFwiXG4gICAgICAgICAgc3R5bGU9e3sgaGVpZ2h0OiBgJHtob3Vycy5sZW5ndGggKiA2MH1weGAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHsvKiBUaW1lIGxhYmVscyBjb2x1bW4gKi99XG4gICAgICAgICAgPERheVRpbWVDb2wgY2xhc3NOYW1lPVwiY29sLXNwYW4tMiBoLWZ1bGwgbWQ6Y29sLXNwYW4tMVwiIC8+XG5cbiAgICAgICAgICB7LyogRGF5IGNvbHVtbiB3aXRoIGV2ZW50cyAqL31cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImRheS1ldmVudHMtY29sdW1uXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIGNvbC1zcGFuLTYgaC1mdWxsIG1kOmNvbC1zcGFuLTdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsvKiBCYWNrZ3JvdW5kIGdyaWQgZm9yIHRpbWUgc2xvdHMgLSBsb3dlc3QgbGF5ZXIgKi99XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LWJhY2tncm91bmQtZ3JpZFwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LTAgei0wXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2hvdXJzLm1hcCgoaG91ciwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBrZXk9e2BiZy0ke2N1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpfS0ke2hvdXIuZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgICAnSEgnXG4gICAgICAgICAgICAgICAgICApfWB9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLVs2MHB4XSBib3JkZXItYlwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgey8qIDE1LW1pbnV0ZSBtYXJrZXIgbGluZXMgKi99XG4gICAgICAgICAgICAgICAgICB7dGltZVNlZ21lbnRzLnNsaWNlKDEpLm1hcCgobWludXRlcykgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAga2V5PXtgYmctJHtob3VyLmZvcm1hdCgnSEgnKX0tJHttaW51dGVzfWB9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm9yZGVyLWJvcmRlciBhYnNvbHV0ZSB3LWZ1bGwgYm9yZGVyLXQgYm9yZGVyLWRhc2hlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgdG9wOiBgJHtpbmRleCAqIDYwICsgbWludXRlc31weGAgfX1cbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBJbnRlcmFjdGl2ZSBsYXllciBmb3IgdGltZSBzbG90cyAtIG1pZGRsZSBsYXllciB3aXRoIG5vIGJvcmRlcnMgKi99XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LWludGVyYWN0aXZlLWxheWVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtYXV0byBhYnNvbHV0ZSBpbnNldC0wIHotMjBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7aG91cnMubWFwKCh0aW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG91ciA9IHRpbWUuaG91cigpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgPEZyYWdtZW50IGtleT17YCR7Y2VsbERhdGV9LSR7dGltZS5mb3JtYXQoJ0hIJyl9YH0+XG4gICAgICAgICAgICAgICAgICAgIDxEcm9wcGFibGVDZWxsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9e2B0aW1lLWNlbGwtJHtjZWxsRGF0ZX0tJHt0aW1lLmZvcm1hdCgnSEgnKX0tMDBgfVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0aW1lLWNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGU9e2N1cnJlbnREYXRlfVxuICAgICAgICAgICAgICAgICAgICAgIGhvdXI9e2hvdXJ9XG4gICAgICAgICAgICAgICAgICAgICAgbWludXRlPXswfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oJ2hvdmVyOmJnLWFjY2VudCBoLVsxNXB4XSBjdXJzb3ItcG9pbnRlcicpfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8RHJvcHBhYmxlQ2VsbFxuICAgICAgICAgICAgICAgICAgICAgIGlkPXtgdGltZS1jZWxsLSR7Y2VsbERhdGV9LSR7dGltZS5mb3JtYXQoJ0hIJyl9LTE1YH1cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGltZS1jZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRlPXtjdXJyZW50RGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICBob3VyPXtob3VyfVxuICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZT17MTV9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaG92ZXI6YmctYWNjZW50IGgtWzE1cHhdIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPERyb3BwYWJsZUNlbGxcbiAgICAgICAgICAgICAgICAgICAgICBpZD17YHRpbWUtY2VsbC0ke2NlbGxEYXRlfS0ke3RpbWUuZm9ybWF0KCdISCcpfS0zMGB9XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRpbWUtY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0ZT17Y3VycmVudERhdGV9XG4gICAgICAgICAgICAgICAgICAgICAgaG91cj17aG91cn1cbiAgICAgICAgICAgICAgICAgICAgICBtaW51dGU9ezMwfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImhvdmVyOmJnLWFjY2VudCBoLVsxNXB4XSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxEcm9wcGFibGVDZWxsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9e2B0aW1lLWNlbGwtJHtjZWxsRGF0ZX0tJHt0aW1lLmZvcm1hdCgnSEgnKX0tNDVgfVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0aW1lLWNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGU9e2N1cnJlbnREYXRlfVxuICAgICAgICAgICAgICAgICAgICAgIGhvdXI9e2hvdXJ9XG4gICAgICAgICAgICAgICAgICAgICAgbWludXRlPXs0NX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJob3ZlcjpiZy1hY2NlbnQgaC1bMTVweF0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBFdmVudHMgbGF5ZXIgLSBtaWRkbGUtdG9wIGxheWVyICovfVxuICAgICAgICAgICAgPERheUV2ZW50c0xheWVyIGRheT17Y3VycmVudERhdGV9IC8+XG5cbiAgICAgICAgICAgIHsvKiBDdXJyZW50IHRpbWUgaW5kaWNhdG9yIC0gdG9wIGxheWVyICovfVxuICAgICAgICAgICAge2lzVG9kYXkgJiYgKFxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJkYXktY3VycmVudC10aW1lLWluZGljYXRvclwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMCBsZWZ0LTAgei00MCBib3JkZXItdCBib3JkZXItcmVkLTUwMFwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgIHRvcDogYCR7KGRheWpzKCkuaG91cigpICsgZGF5anMoKS5taW51dGUoKSAvIDYwKSAqIDYwfXB4YCxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCItbXQtMSAtbWwtMSBoLTIgdy0yIHJvdW5kZWQtZnVsbCBiZy1yZWQtNTAwXCI+PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L1Njcm9sbEFyZWE+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgRGF5Vmlld1xuIiwKICAgICJpbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IERyYWdnYWJsZUV2ZW50IH0gZnJvbSAnLi4vZHJhZ2dhYmxlLWV2ZW50L2RyYWdnYWJsZS1ldmVudCdcbmltcG9ydCB7IERyb3BwYWJsZUNlbGwgfSBmcm9tICcuLi9kcm9wcGFibGUtY2VsbC9kcm9wcGFibGUtY2VsbCdcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCwgUHJvY2Vzc2VkQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcbmltcG9ydCB7IEVWRU5UX0JBUl9IRUlHSFQgfSBmcm9tICdAL2xpYi9jb25zdGFudHMnXG5cbmV4cG9ydCBjb25zdCBEYXlBbGxEYXlSb3cgPSAoKSA9PiB7XG4gIGNvbnN0IHsgY3VycmVudERhdGUsIGdldEV2ZW50c0ZvckRhdGUgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgLy8gR2V0IGN1cnJlbnQgZGF5J3MgZXZlbnRzIC0gdGhpcyB3aWxsIHJlZnJlc2ggYXV0b21hdGljYWxseSB3aGVuIHN0b3JlIHVwZGF0ZXNcbiAgLy8gYmVjYXVzZSBnZXRFdmVudHNGb3JEYXRlIGlzIGEgc2VsZWN0b3IgZnVuY3Rpb24gZnJvbSB0aGUgc3RvcmUgdGhhdCBydW5zIHdoZW5ldmVyIGV2ZW50cyBjaGFuZ2VcbiAgY29uc3QgZGF5RXZlbnRzID0gZ2V0RXZlbnRzRm9yRGF0ZShjdXJyZW50RGF0ZSlcblxuICAvLyBTZXBhcmF0ZSBhbGwtZGF5IGV2ZW50cyBmcm9tIHJlZ3VsYXIgZXZlbnRzXG4gIGNvbnN0IHsgYWxsRGF5RXZlbnRzIH0gPSB1c2VNZW1vKCgpID0+IHtcbiAgICAvLyBPbmx5IGV2ZW50cyBleHBsaWNpdGx5IG1hcmtlZCBhcyBhbGxEYXkgc2hvdWxkIGJlIGluIHRoZSBhbGwtZGF5IHNlY3Rpb25cbiAgICBjb25zdCBhbGxEYXlFdnRzID0gZGF5RXZlbnRzLmZpbHRlcigoZXZlbnQpID0+IGV2ZW50LmFsbERheSlcblxuICAgIC8vIFJlZ3VsYXIgZXZlbnRzIChpbmNsdWRpbmcgbXVsdGktZGF5IGV2ZW50cylcbiAgICBjb25zdCByZWd1bGFyRXZ0cyA9IGRheUV2ZW50cy5maWx0ZXIoKGV2ZW50KSA9PiAhZXZlbnQuYWxsRGF5KVxuXG4gICAgcmV0dXJuIHsgYWxsRGF5RXZlbnRzOiBhbGxEYXlFdnRzLCByZWd1bGFyRXZlbnRzOiByZWd1bGFyRXZ0cyB9XG4gIH0sIFtkYXlFdmVudHNdKSAvLyBPbmx5IGRlcGVuZCBvbiB0aGUgZGF5RXZlbnRzIHdoaWNoIGlzIHJlZnJlc2hlZCBhdXRvbWF0aWNhbGx5XG5cbiAgLy8gUHJvY2VzcyBhbGwtZGF5IGV2ZW50cyBmb3IgZGlzcGxheVxuICBjb25zdCB7IHByb2Nlc3NlZEFsbERheUV2ZW50cyB9ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gU29ydCBhbGwtZGF5IGV2ZW50cyAoaWYgbmVlZGVkKVxuICAgIGNvbnN0IHNvcnRlZEV2ZW50cyA9IFsuLi5hbGxEYXlFdmVudHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIHJldHVybiBhLnN0YXJ0LmRpZmYoYi5zdGFydClcbiAgICB9KVxuXG4gICAgLy8gVHJhY2sgcG9zaXRpb25zIGluIHJvd3MgZm9yIHN0YWNraW5nXG4gICAgY29uc3Qgcm93czogeyBldmVudDogQ2FsZW5kYXJFdmVudCB9W11bXSA9IFtdXG4gICAgY29uc3QgcHJvY2Vzc2VkRXZlbnRzOiBQcm9jZXNzZWRDYWxlbmRhckV2ZW50W10gPSBbXVxuXG4gICAgc29ydGVkRXZlbnRzLmZvckVhY2goKGV2ZW50LCByb3dJbmRleCkgPT4ge1xuICAgICAgbGV0IHBsYWNlZCA9IGZhbHNlXG5cbiAgICAgIHdoaWxlICghcGxhY2VkKSB7XG4gICAgICAgIGlmIChyb3dJbmRleCA+PSByb3dzLmxlbmd0aCkge1xuICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyByb3cgaWYgbmVlZGVkXG4gICAgICAgICAgcm93cy5wdXNoKFtdKVxuICAgICAgICAgIHBsYWNlZCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJbiBkYXkgdmlldywgd2UgY2FuIHBsYWNlIG9uZSBldmVudCBwZXIgcm93IGFzIHRoZXkgZG9uJ3Qgb3ZlcmxhcCBob3Jpem9udGFsbHlcbiAgICAgICAgICAvLyBUaGlzIGlzIHNpbXBsZXIgdGhhbiB3ZWVrIHZpZXcgd2hlcmUgd2UgbmVlZGVkIHRvIGNoZWNrIGZvciBvdmVybGFwc1xuICAgICAgICAgIHBsYWNlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgZXZlbnQgdG8gdGhlIHJvd1xuICAgICAgcm93c1tyb3dJbmRleF0ucHVzaCh7IGV2ZW50IH0pXG5cbiAgICAgIC8vIEFkZCBwcm9jZXNzZWQgZXZlbnQgd2l0aCBjb3JyZWN0IHBvc2l0aW9uaW5nXG4gICAgICBwcm9jZXNzZWRFdmVudHMucHVzaCh7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgICB0b3A6IHJvd0luZGV4ICogRVZFTlRfQkFSX0hFSUdIVCxcbiAgICAgICAgaGVpZ2h0OiBFVkVOVF9CQVJfSEVJR0hULFxuICAgICAgICBhbGxEYXk6IHRydWUsXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvY2Vzc2VkQWxsRGF5RXZlbnRzOiBwcm9jZXNzZWRFdmVudHMsXG4gICAgICBhbGxEYXlSb3dzQ291bnQ6IE1hdGgubWF4KDEsIHJvd3MubGVuZ3RoKSwgLy8gQXQgbGVhc3QgMSByb3csIGV2ZW4gaWYgZW1wdHlcbiAgICB9XG4gIH0sIFthbGxEYXlFdmVudHNdKVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS10ZXN0aWQ9XCJkYXktYWxsLWRheS1yb3dcIlxuICAgICAgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtOCBib3JkZXItYiBib3JkZXIteFwiXG4gICAgPlxuICAgICAgey8qIExlZnQgbGFiZWwgZm9yIGFsbC1kYXkgZXZlbnRzICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc3Bhbi0yIGZsZXggc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIGJvcmRlci1yIHByLTIgbWQ6Y29sLXNwYW4tMVwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgdGV4dC1bMTBweF0gd2hpdGVzcGFjZS1ub3dyYXAgc206dGV4dC14c1wiPlxuICAgICAgICAgIEFsbC1kYXlcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBBbGwtZGF5IGV2ZW50cyBjb250YWluZXIgd2l0aCBkeW5hbWljIGhlaWdodCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgY29sLXNwYW4tNiBtZDpjb2wtc3Bhbi03IFwiPlxuICAgICAgICA8RHJvcHBhYmxlQ2VsbFxuICAgICAgICAgIGlkPXtgYWxsLWRheS0ke2N1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgdHlwZT1cImRheS1jZWxsXCJcbiAgICAgICAgICBkYXRlPXtjdXJyZW50RGF0ZX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJob3ZlcjpiZy1hY2NlbnQgdy1mdWxsIGN1cnNvci1wb2ludGVyIG1pbi1oLTEwIGZsZXggZmxleC1jb2xcIlxuICAgICAgICA+XG4gICAgICAgICAge3Byb2Nlc3NlZEFsbERheUV2ZW50cy5tYXAoKGV2ZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGtleT17YGFsbC1kYXktJHtldmVudC5pZH0tJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IGhlaWdodDogRVZFTlRfQkFSX0hFSUdIVCArICdweCcgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxEcmFnZ2FibGVFdmVudFxuICAgICAgICAgICAgICAgICAgZWxlbWVudElkPXtgYWxsLWRheS0ke2V2ZW50LmlkfS0ke2luZGV4fWB9XG4gICAgICAgICAgICAgICAgICBldmVudD17ZXZlbnR9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvdmVyZmxvdy1jbGlwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgd2lkdGg6IGBjYWxjKDEwMCUgLSB2YXIoLS1zcGFjaW5nKSAqIDIpYCB9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pfVxuICAgICAgICA8L0Ryb3BwYWJsZUNlbGw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5cbmV4cG9ydCBjb25zdCBEYXlIZWFkZXIgPSAoKSA9PiB7XG4gIGNvbnN0IHsgY3VycmVudERhdGUsIHN0aWNreVZpZXdIZWFkZXIsIHZpZXdIZWFkZXJDbGFzc05hbWUgfSA9XG4gICAgdXNlQ2FsZW5kYXJDb250ZXh0KClcbiAgY29uc3QgaXNUb2RheSA9IGN1cnJlbnREYXRlLmlzU2FtZShkYXlqcygpLCAnZGF5JylcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LWhlYWRlclwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWIgcC0yIGJvcmRlci14JyxcbiAgICAgICAgc3RpY2t5Vmlld0hlYWRlciAmJiAnc3RpY2t5IHRvcC0wIHotMTAwJyxcbiAgICAgICAgdmlld0hlYWRlckNsYXNzTmFtZVxuICAgICAgKX1cbiAgICA+XG4gICAgICA8QW5pbWF0ZVByZXNlbmNlIG1vZGU9XCJ3YWl0XCI+XG4gICAgICAgIDxtb3Rpb24uZGl2XG4gICAgICAgICAga2V5PXtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICBpbml0aWFsPXt7IG9wYWNpdHk6IDAsIHk6IC0xMCB9fVxuICAgICAgICAgIGFuaW1hdGU9e3sgb3BhY2l0eTogMSwgeTogMCB9fVxuICAgICAgICAgIGV4aXQ9e3sgb3BhY2l0eTogMCwgeTogLTEwIH19XG4gICAgICAgICAgdHJhbnNpdGlvbj17eyBkdXJhdGlvbjogMC4yNSwgZWFzZTogJ2Vhc2VJbk91dCcgfX1cbiAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LXNlbWlib2xkIHNtOnRleHQteGwnLFxuICAgICAgICAgICAgaXNUb2RheSAmJiAndGV4dC1wcmltYXJ5J1xuICAgICAgICAgICl9XG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ4czppbmxpbmUgaGlkZGVuXCI+XG4gICAgICAgICAgICB7Y3VycmVudERhdGUuZm9ybWF0KCdkZGRkLCAnKX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2N1cnJlbnREYXRlLmZvcm1hdCgnTU1NTSBELCBZWVlZJyl9XG4gICAgICAgICAge2lzVG9kYXkgJiYgKFxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBtbC0yIHJvdW5kZWQtZnVsbCBweC0xIHB5LTAuNSB0ZXh0LXhzIHNtOnB4LTIgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICBUb2RheVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvbW90aW9uLmRpdj5cbiAgICAgIDwvQW5pbWF0ZVByZXNlbmNlPlxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5cbi8vIEhvdXJzIHRvIGRpc3BsYXkgKGFsbCAyNCBob3VycyBvZiB0aGUgZGF5KVxuY29uc3QgaG91cnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNCB9LCAoXywgaSkgPT4gaSkubWFwKChob3VyKSA9PiB7XG4gIHJldHVybiBkYXlqcygpLmhvdXIoaG91cikubWludXRlKDApXG59KVxuXG5pbnRlcmZhY2UgRGF5VGltZUNvbFByb3BzIHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBEYXlUaW1lQ29sOiBSZWFjdC5GQzxEYXlUaW1lQ29sUHJvcHM+ID0gKHsgY2xhc3NOYW1lIH0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXRlc3RpZD1cImRheS10aW1lLWNvbFwiXG4gICAgICBjbGFzc05hbWU9e2Bjb2wtc3Bhbi0yIGgtZnVsbCBtZDpjb2wtc3Bhbi0xICR7Y2xhc3NOYW1lfWB9XG4gICAgPlxuICAgICAge2hvdXJzLm1hcCgodGltZSkgPT4gKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAga2V5PXt0aW1lLmZvcm1hdCgnSEg6bW0nKX1cbiAgICAgICAgICBkYXRhLXRlc3RpZD17YGRheS10aW1lLWhvdXItJHt0aW1lLmZvcm1hdCgnSEgnKX1gfVxuICAgICAgICAgIGNsYXNzTmFtZT1cImgtWzYwcHhdIGJvcmRlci1iIHRleHQtcmlnaHRcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHByLTIgdGV4dC1yaWdodCB0ZXh0LVsxMHB4XSBzbTp0ZXh0LXhzXCI+XG4gICAgICAgICAgICB7dGltZS5mb3JtYXQoJ2ggQScpfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHtcbiAgQnV0dG9uLFxuICBDaGVja2JveCxcbiAgRGF0ZVBpY2tlcixcbiAgRGlhbG9nLFxuICBEaWFsb2dDb250ZW50LFxuICBEaWFsb2dEZXNjcmlwdGlvbixcbiAgRGlhbG9nRm9vdGVyLFxuICBEaWFsb2dIZWFkZXIsXG4gIERpYWxvZ1RpdGxlLFxuICBJbnB1dCxcbiAgTGFiZWwsXG4gIFRvb2x0aXAsXG4gIFRvb2x0aXBDb250ZW50LFxuICBUb29sdGlwUHJvdmlkZXIsXG4gIFRvb2x0aXBUcmlnZ2VyLFxufSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHR5cGUgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSAnQC9jb21wb25lbnRzL3R5cGVzJ1xuXG5jb25zdCBjb2xvck9wdGlvbnMgPSBbXG4gIHsgdmFsdWU6ICdiZy1ibHVlLTEwMCB0ZXh0LWJsdWUtODAwJywgbGFiZWw6ICdCbHVlJyB9LFxuICB7IHZhbHVlOiAnYmctZ3JlZW4tMTAwIHRleHQtZ3JlZW4tODAwJywgbGFiZWw6ICdHcmVlbicgfSxcbiAgeyB2YWx1ZTogJ2JnLXB1cnBsZS0xMDAgdGV4dC1wdXJwbGUtODAwJywgbGFiZWw6ICdQdXJwbGUnIH0sXG4gIHsgdmFsdWU6ICdiZy1yZWQtMTAwIHRleHQtcmVkLTgwMCcsIGxhYmVsOiAnUmVkJyB9LFxuICB7IHZhbHVlOiAnYmcteWVsbG93LTEwMCB0ZXh0LXllbGxvdy04MDAnLCBsYWJlbDogJ1llbGxvdycgfSxcbiAgeyB2YWx1ZTogJ2JnLXBpbmstMTAwIHRleHQtcGluay04MDAnLCBsYWJlbDogJ1BpbmsnIH0sXG4gIHsgdmFsdWU6ICdiZy1pbmRpZ28tMTAwIHRleHQtaW5kaWdvLTgwMCcsIGxhYmVsOiAnSW5kaWdvJyB9LFxuICB7IHZhbHVlOiAnYmctYW1iZXItMTAwIHRleHQtYW1iZXItODAwJywgbGFiZWw6ICdBbWJlcicgfSxcbiAgeyB2YWx1ZTogJ2JnLWVtZXJhbGQtMTAwIHRleHQtZW1lcmFsZC04MDAnLCBsYWJlbDogJ0VtZXJhbGQnIH0sXG4gIHsgdmFsdWU6ICdiZy1za3ktMTAwIHRleHQtc2t5LTgwMCcsIGxhYmVsOiAnU2t5JyB9LFxuICB7IHZhbHVlOiAnYmctdmlvbGV0LTEwMCB0ZXh0LXZpb2xldC04MDAnLCBsYWJlbDogJ1Zpb2xldCcgfSxcbiAgeyB2YWx1ZTogJ2JnLXJvc2UtMTAwIHRleHQtcm9zZS04MDAnLCBsYWJlbDogJ1Jvc2UnIH0sXG4gIHsgdmFsdWU6ICdiZy10ZWFsLTEwMCB0ZXh0LXRlYWwtODAwJywgbGFiZWw6ICdUZWFsJyB9LFxuICB7IHZhbHVlOiAnYmctb3JhbmdlLTEwMCB0ZXh0LW9yYW5nZS04MDAnLCBsYWJlbDogJ09yYW5nZScgfSxcbl1cblxuaW50ZXJmYWNlIEV2ZW50Rm9ybVByb3BzIHtcbiAgc2VsZWN0ZWRFdmVudD86IENhbGVuZGFyRXZlbnQgfCBudWxsXG4gIHNlbGVjdGVkRGF0ZT86IGRheWpzLkRheWpzIHwgbnVsbFxuICBvbkFkZD86IChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gdm9pZFxuICBvblVwZGF0ZT86IChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gdm9pZFxuICBvbkRlbGV0ZT86IChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gdm9pZFxuICBvbkNsb3NlOiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBjb25zdCBFdmVudEZvcm06IFJlYWN0LkZDPEV2ZW50Rm9ybVByb3BzPiA9ICh7XG4gIHNlbGVjdGVkRXZlbnQsXG4gIHNlbGVjdGVkRGF0ZSxcbiAgb25DbG9zZSxcbiAgb25VcGRhdGUsXG4gIG9uRGVsZXRlLFxuICBvbkFkZCxcbn0pID0+IHtcbiAgY29uc3Qgc3RhcnQgPSBzZWxlY3RlZEV2ZW50Py5vcmlnaW5hbFN0YXJ0ID8/IHNlbGVjdGVkRXZlbnQ/LnN0YXJ0XG4gIGNvbnN0IGVuZCA9IHNlbGVjdGVkRXZlbnQ/Lm9yaWdpbmFsRW5kID8/IHNlbGVjdGVkRXZlbnQ/LmVuZFxuXG4gIC8vIEZvcm0gZGVmYXVsdCB2YWx1ZXNcbiAgY29uc3QgZGVmYXVsdFN0YXJ0RGF0ZSA9IHNlbGVjdGVkRGF0ZT8udG9EYXRlKCkgfHwgbmV3IERhdGUoKVxuICBjb25zdCBkZWZhdWx0RW5kRGF0ZSA9XG4gICAgc2VsZWN0ZWREYXRlPy5hZGQoMSwgJ2hvdXInKS50b0RhdGUoKSB8fCBkYXlqcygpLmFkZCgxLCAnaG91cicpLnRvRGF0ZSgpXG5cbiAgLy8gRm9ybSBzdGF0ZVxuICBjb25zdCBbc3RhcnREYXRlLCBzZXRTdGFydERhdGVdID0gdXNlU3RhdGUoXG4gICAgc3RhcnQ/LnRvRGF0ZSgpIHx8IGRlZmF1bHRTdGFydERhdGVcbiAgKVxuICBjb25zdCBbZW5kRGF0ZSwgc2V0RW5kRGF0ZV0gPSB1c2VTdGF0ZShlbmQ/LnRvRGF0ZSgpIHx8IGRlZmF1bHRFbmREYXRlKVxuICBjb25zdCBbaXNBbGxEYXksIHNldElzQWxsRGF5XSA9IHVzZVN0YXRlKHNlbGVjdGVkRXZlbnQ/LmFsbERheSB8fCBmYWxzZSlcbiAgY29uc3QgW3NlbGVjdGVkQ29sb3IsIHNldFNlbGVjdGVkQ29sb3JdID0gdXNlU3RhdGUoXG4gICAgc2VsZWN0ZWRFdmVudD8uY29sb3IgfHwgY29sb3JPcHRpb25zWzBdLnZhbHVlXG4gIClcblxuICAvLyBUaW1lIHN0YXRlXG4gIGNvbnN0IFtzdGFydFRpbWUsIHNldFN0YXJ0VGltZV0gPSB1c2VTdGF0ZShcbiAgICBzZWxlY3RlZEV2ZW50XG4gICAgICA/IHNlbGVjdGVkRXZlbnQuc3RhcnQuZm9ybWF0KCdISDptbScpXG4gICAgICA6IGRheWpzKGRlZmF1bHRTdGFydERhdGUpLmZvcm1hdCgnSEg6bW0nKVxuICApXG4gIGNvbnN0IFtlbmRUaW1lLCBzZXRFbmRUaW1lXSA9IHVzZVN0YXRlKFxuICAgIHNlbGVjdGVkRXZlbnRcbiAgICAgID8gc2VsZWN0ZWRFdmVudC5lbmQuZm9ybWF0KCdISDptbScpXG4gICAgICA6IGRheWpzKGRlZmF1bHRFbmREYXRlKS5mb3JtYXQoJ0hIOm1tJylcbiAgKVxuXG4gIC8vIEluaXRpYWxpemUgZm9ybSB2YWx1ZXMgZnJvbSBzZWxlY3RlZCBldmVudCBvciBkZWZhdWx0c1xuICBjb25zdCBbZm9ybVZhbHVlcywgc2V0Rm9ybVZhbHVlc10gPSB1c2VTdGF0ZSh7XG4gICAgdGl0bGU6IHNlbGVjdGVkRXZlbnQ/LnRpdGxlIHx8ICcnLFxuICAgIGRlc2NyaXB0aW9uOiBzZWxlY3RlZEV2ZW50Py5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICBsb2NhdGlvbjogc2VsZWN0ZWRFdmVudD8ubG9jYXRpb24gfHwgJycsXG4gIH0pXG5cbiAgLy8gQ3JlYXRlIHdyYXBwZXIgZnVuY3Rpb25zIHRvIGZpeCBUeXBlU2NyaXB0IGVycm9ycyB3aXRoIERhdGVQaWNrZXJcbiAgY29uc3QgaGFuZGxlU3RhcnREYXRlQ2hhbmdlID0gKGRhdGU6IERhdGUgfCB1bmRlZmluZWQpID0+IHtcbiAgICBpZiAoZGF0ZSkgc2V0U3RhcnREYXRlKGRhdGUpXG4gIH1cblxuICBjb25zdCBoYW5kbGVFbmREYXRlQ2hhbmdlID0gKGRhdGU6IERhdGUgfCB1bmRlZmluZWQpID0+IHtcbiAgICBpZiAoZGF0ZSkgc2V0RW5kRGF0ZShkYXRlKVxuICB9XG5cbiAgLy8gVXBkYXRlIGZvcm0gdmFsdWVzIHdoZW4gaW5wdXQgY2hhbmdlc1xuICBjb25zdCBoYW5kbGVJbnB1dENoYW5nZSA9IChcbiAgICBlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD5cbiAgKSA9PiB7XG4gICAgY29uc3QgeyBuYW1lLCB2YWx1ZSB9ID0gZS50YXJnZXRcbiAgICBzZXRGb3JtVmFsdWVzKChwcmV2KSA9PiAoeyAuLi5wcmV2LCBbbmFtZV06IHZhbHVlIH0pKVxuICB9XG5cbiAgLy8gSGFuZGxlIHRpbWUgY2hhbmdlc1xuICBjb25zdCBoYW5kbGVUaW1lQ2hhbmdlID0gKFxuICAgIGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+LFxuICAgIGlzU3RhcnQ6IGJvb2xlYW5cbiAgKSA9PiB7XG4gICAgY29uc3QgdGltZVZhbHVlID0gZS50YXJnZXQudmFsdWVcbiAgICBpZiAoaXNTdGFydCkge1xuICAgICAgc2V0U3RhcnRUaW1lKHRpbWVWYWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RW5kVGltZSh0aW1lVmFsdWUpXG4gICAgfVxuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBSZXNldCBlbmQgdGltZSB3aGVuIGFsbCBkYXkgaXMgdG9nZ2xlZCB0byBvblxuICAgIGlmIChpc0FsbERheSkge1xuICAgICAgc2V0RW5kVGltZSgnMjM6NTknKVxuICAgIH1cbiAgfSwgW2lzQWxsRGF5XSlcblxuICAvLyBIYW5kbGUgZm9ybSBzdWJtaXNzaW9uXG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9IChlOiBSZWFjdC5Gb3JtRXZlbnQpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KClcblxuICAgIC8vIENyZWF0ZSBmdWxsIGRhdGV0aW1lIG9iamVjdHMgYnkgY29tYmluaW5nIGRhdGUgYW5kIHRpbWVcbiAgICBjb25zdCBbc3RhcnRIb3Vycywgc3RhcnRNaW51dGVzXSA9IHN0YXJ0VGltZS5zcGxpdCgnOicpLm1hcChOdW1iZXIpXG4gICAgY29uc3QgW2VuZEhvdXJzLCBlbmRNaW51dGVzXSA9IGVuZFRpbWUuc3BsaXQoJzonKS5tYXAoTnVtYmVyKVxuXG4gICAgbGV0IHN0YXJ0RGF0ZVRpbWUgPSBkYXlqcyhzdGFydERhdGUpLmhvdXIoc3RhcnRIb3VycykubWludXRlKHN0YXJ0TWludXRlcylcblxuICAgIGxldCBlbmREYXRlVGltZSA9IGRheWpzKGVuZERhdGUpLmhvdXIoZW5kSG91cnMpLm1pbnV0ZShlbmRNaW51dGVzKVxuXG4gICAgLy8gRm9yIGFsbC1kYXkgZXZlbnRzLCBzZXQgYXBwcm9wcmlhdGUgdGltZXNcbiAgICBpZiAoaXNBbGxEYXkpIHtcbiAgICAgIHN0YXJ0RGF0ZVRpbWUgPSBzdGFydERhdGVUaW1lLmhvdXIoMCkubWludXRlKDApXG4gICAgICBlbmREYXRlVGltZSA9IGVuZERhdGVUaW1lLmhvdXIoMjMpLm1pbnV0ZSg1OSlcbiAgICB9XG5cbiAgICBjb25zdCBldmVudERhdGE6IENhbGVuZGFyRXZlbnQgPSB7XG4gICAgICBpZDogc2VsZWN0ZWRFdmVudD8uaWQgfHwgZGF5anMoKS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzJyksXG4gICAgICB0aXRsZTogZm9ybVZhbHVlcy50aXRsZSxcbiAgICAgIHN0YXJ0OiBzdGFydERhdGVUaW1lLFxuICAgICAgZW5kOiBlbmREYXRlVGltZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBmb3JtVmFsdWVzLmRlc2NyaXB0aW9uLFxuICAgICAgbG9jYXRpb246IGZvcm1WYWx1ZXMubG9jYXRpb24sXG4gICAgICBhbGxEYXk6IGlzQWxsRGF5LFxuICAgICAgY29sb3I6IHNlbGVjdGVkQ29sb3IsXG4gICAgfVxuXG4gICAgaWYgKHNlbGVjdGVkRXZlbnQuaWQpIHtcbiAgICAgIG9uVXBkYXRlPy4oZXZlbnREYXRhKVxuICAgIH0gZWxzZSB7XG4gICAgICBvbkFkZD8uKGV2ZW50RGF0YSlcbiAgICB9XG5cbiAgICBvbkNsb3NlKClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZSA9ICgpID0+IHtcbiAgICBpZiAoc2VsZWN0ZWRFdmVudC5pZCkge1xuICAgICAgb25EZWxldGU/LihzZWxlY3RlZEV2ZW50KVxuICAgICAgb25DbG9zZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgZW5kIGRhdGUgaXMgbm90IGJlZm9yZSBzdGFydCBkYXRlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRheWpzKHN0YXJ0RGF0ZSkuaXNBZnRlcihkYXlqcyhlbmREYXRlKSkpIHtcbiAgICAgIHNldEVuZERhdGUoc3RhcnREYXRlKVxuICAgIH1cbiAgfSwgW3N0YXJ0RGF0ZSwgZW5kRGF0ZV0pXG5cbiAgcmV0dXJuIChcbiAgICA8RGlhbG9nIG9wZW49e3RydWV9IG9uT3BlbkNoYW5nZT17b25DbG9zZX0+XG4gICAgICA8RGlhbG9nQ29udGVudCBjbGFzc05hbWU9XCJ3LVs5MHZ3XSBtYXgtdy1bNTAwcHhdIHAtNCBzbTpwLTZcIj5cbiAgICAgICAgPGZvcm0gb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH0+XG4gICAgICAgICAgPERpYWxvZ0hlYWRlciBjbGFzc05hbWU9XCJtYi0yIHNtOm1iLTRcIj5cbiAgICAgICAgICAgIDxEaWFsb2dUaXRsZSBjbGFzc05hbWU9XCJ0ZXh0LWJhc2Ugc206dGV4dC1sZ1wiPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRFdmVudC5pZCA/ICdFZGl0IEV2ZW50JyA6ICdDcmVhdGUgRXZlbnQnfVxuICAgICAgICAgICAgPC9EaWFsb2dUaXRsZT5cbiAgICAgICAgICAgIDxEaWFsb2dEZXNjcmlwdGlvbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5cbiAgICAgICAgICAgICAge3NlbGVjdGVkRXZlbnQuaWRcbiAgICAgICAgICAgICAgICA/ICdFZGl0IHlvdXIgZXZlbnQgZGV0YWlscydcbiAgICAgICAgICAgICAgICA6ICdBZGQgYSBuZXcgZXZlbnQgdG8geW91ciBjYWxlbmRhcid9XG4gICAgICAgICAgICA8L0RpYWxvZ0Rlc2NyaXB0aW9uPlxuICAgICAgICAgIDwvRGlhbG9nSGVhZGVyPlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIHB5LTIgc206Z2FwLTQgc206cHktNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0yXCI+XG4gICAgICAgICAgICAgIDxMYWJlbCBodG1sRm9yPVwidGl0bGVcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5cbiAgICAgICAgICAgICAgICBUaXRsZVxuICAgICAgICAgICAgICA8L0xhYmVsPlxuICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgIHZhbHVlPXtmb3JtVmFsdWVzLnRpdGxlfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkV2ZW50IHRpdGxlXCJcbiAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtOCB0ZXh0LXNtIHNtOmgtOVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTJcIj5cbiAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgaWQ9XCJhbGxEYXlcIlxuICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2lzQWxsRGF5fVxuICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGNoZWNrZWQpID0+IHNldElzQWxsRGF5KGNoZWNrZWQgPT09IHRydWUpfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cImFsbERheVwiIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgIEFsbCBkYXlcbiAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTIgc206Z2FwLTRcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8TGFiZWwgY2xhc3NOYW1lPVwidGV4dC14cyBzbTp0ZXh0LXNtXCI+U3RhcnQgRGF0ZTwvTGFiZWw+XG4gICAgICAgICAgICAgICAgPERhdGVQaWNrZXJcbiAgICAgICAgICAgICAgICAgIGRhdGU9e3N0YXJ0RGF0ZX1cbiAgICAgICAgICAgICAgICAgIHNldERhdGU9e2hhbmRsZVN0YXJ0RGF0ZUNoYW5nZX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTFcIlxuICAgICAgICAgICAgICAgICAgY2xvc2VPblNlbGVjdFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxMYWJlbCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5FbmQgRGF0ZTwvTGFiZWw+XG4gICAgICAgICAgICAgICAgPERhdGVQaWNrZXJcbiAgICAgICAgICAgICAgICAgIGRhdGU9e2VuZERhdGV9XG4gICAgICAgICAgICAgICAgICBzZXREYXRlPXtoYW5kbGVFbmREYXRlQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtMVwiXG4gICAgICAgICAgICAgICAgICBjbG9zZU9uU2VsZWN0XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgeyFpc0FsbERheSAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMiBnYXAtMiBzbTpnYXAtNFwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cInN0YXJ0LXRpbWVcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgU3RhcnQgVGltZVxuICAgICAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICBpZD1cInN0YXJ0LXRpbWVcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGltZVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzdGFydFRpbWV9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gaGFuZGxlVGltZUNoYW5nZShlLCB0cnVlKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtMSBoLTggdGV4dC1zbSBzbTpoLTlcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPExhYmVsIGh0bWxGb3I9XCJlbmQtdGltZVwiIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICBFbmQgVGltZVxuICAgICAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICBpZD1cImVuZC10aW1lXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRpbWVcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17ZW5kVGltZX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBoYW5kbGVUaW1lQ2hhbmdlKGUsIGZhbHNlKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtMSBoLTggdGV4dC1zbSBzbTpoLTlcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTEgc206Z2FwLTJcIj5cbiAgICAgICAgICAgICAgPExhYmVsIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPkNvbG9yPC9MYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxUb29sdGlwUHJvdmlkZXI+XG4gICAgICAgICAgICAgICAgICB7Y29sb3JPcHRpb25zLm1hcCgoY29sb3IpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPFRvb2x0aXAga2V5PXtjb2xvci52YWx1ZX0+XG4gICAgICAgICAgICAgICAgICAgICAgPFRvb2x0aXBUcmlnZ2VyIGFzQ2hpbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17Y29sb3IudmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2NvbG9yLnZhbHVlfSBoLTYgdy02IHJvdW5kZWQtZnVsbCBzbTpoLTggc206dy04YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbG9yID09PSBjb2xvci52YWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JpbmctMiByaW5nLWJsYWNrIHJpbmctb2Zmc2V0LTEgc206cmluZy1vZmZzZXQtMidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VsZWN0ZWRDb2xvcihjb2xvci52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2NvbG9yLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L1Rvb2x0aXBUcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgIDxUb29sdGlwQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPntjb2xvci5sYWJlbH08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9Ub29sdGlwUHJvdmlkZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtMSBzbTpnYXAtMlwiPlxuICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cImxvY2F0aW9uXCIgY2xhc3NOYW1lPVwidGV4dC14cyBzbTp0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgTG9jYXRpb25cbiAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgaWQ9XCJsb2NhdGlvblwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImxvY2F0aW9uXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT17Zm9ybVZhbHVlcy5sb2NhdGlvbn1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFdmVudCBsb2NhdGlvbiAob3B0aW9uYWwpXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggdGV4dC1zbSBzbTpoLTlcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtMSBzbTpnYXAtMlwiPlxuICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cImRlc2NyaXB0aW9uXCIgY2xhc3NOYW1lPVwidGV4dC14cyBzbTp0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgaWQ9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT17Zm9ybVZhbHVlcy5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFdmVudCBkZXNjcmlwdGlvbiAob3B0aW9uYWwpXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggdGV4dC1zbSBzbTpoLTlcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8RGlhbG9nRm9vdGVyIGNsYXNzTmFtZT1cIm10LTIgZmxleCBmbGV4LWNvbC1yZXZlcnNlIGdhcC0yIHNtOm10LTQgc206ZmxleC1yb3cgc206Z2FwLTBcIj5cbiAgICAgICAgICAgIHtzZWxlY3RlZEV2ZW50LmlkICYmIChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJkZXN0cnVjdGl2ZVwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlRGVsZXRlfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBzbTptci1hdXRvIHNtOnctYXV0b1wiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIERlbGV0ZVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGdhcC0yIHNtOnctYXV0b1wiPlxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xvc2V9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIHNtOmZsZXgtbm9uZVwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3NOYW1lPVwiZmxleC0xIHNtOmZsZXgtbm9uZVwiIHNpemU9XCJzbVwiPlxuICAgICAgICAgICAgICAgIHtzZWxlY3RlZEV2ZW50LmlkID8gJ1VwZGF0ZScgOiAnQ3JlYXRlJ31cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L0RpYWxvZ0Zvb3Rlcj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9EaWFsb2dDb250ZW50PlxuICAgIDwvRGlhbG9nPlxuICApXG59XG4iLAogICAgImltcG9ydCB7XG4gIEJ1dHRvbixcbiAgUG9wb3ZlcixcbiAgUG9wb3ZlckNvbnRlbnQsXG4gIFBvcG92ZXJUcmlnZ2VyLFxufSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB7IENhbGVuZGFyIGFzIENhbGVuZGFySWNvbiwgTWVudSwgUGx1cyB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBUaXRsZUNvbnRlbnQgZnJvbSAnLi90aXRsZS1jb250ZW50J1xuaW1wb3J0IFZpZXdDb250cm9scyBmcm9tICcuL3ZpZXctY29udHJvbHMnXG5cbnR5cGUgSGVhZGVyUHJvcHMgPSBvYmplY3RcblxuY29uc3QgSGVhZGVyOiBSZWFjdC5GQzxIZWFkZXJQcm9wcz4gPSAoKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjdXJyZW50RGF0ZSxcbiAgICB2aWV3LFxuICAgIHNldFZpZXcsXG4gICAgbmV4dFBlcmlvZCxcbiAgICBwcmV2UGVyaW9kLFxuICAgIHRvZGF5LFxuICAgIG9wZW5FdmVudEZvcm0sXG4gIH0gPSB1c2VDYWxlbmRhckNvbnRleHQoKVxuXG4gIC8vIFN0YXRlIGZvciBtb2JpbGUgbWVudSBwb3BvdmVyXG4gIGNvbnN0IFttb2JpbGVQb3BvdmVyT3Blbiwgc2V0TW9iaWxlUG9wb3Zlck9wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgLy8gSGFuZGxlIHZpZXcgY2hhbmdlIHdpdGggb3B0aW9uYWwgcG9wb3ZlciBjbG9zaW5nXG4gIGNvbnN0IGhhbmRsZVZpZXdDaGFuZ2UgPSAoXG4gICAgbmV3VmlldzogJ2RheScgfCAnd2VlaycgfCAnbW9udGgnIHwgJ3llYXInLFxuICAgIGNsb3NlUG9wb3ZlciA9IGZhbHNlXG4gICkgPT4ge1xuICAgIHNldFZpZXcobmV3VmlldylcbiAgICBpZiAoY2xvc2VQb3BvdmVyKSB7XG4gICAgICBzZXRNb2JpbGVQb3BvdmVyT3BlbihmYWxzZSlcbiAgICB9XG4gIH1cblxuICAvLyBDYWxsYmFjayBmb3IgbmF2aWdhdGlvbiB0aGF0IGFsc28gY2xvc2VzIHRoZSBtb2JpbGUgcG9wb3ZlclxuICBjb25zdCBoYW5kbGVOYXZpZ2F0aW9uID0ge1xuICAgIHRvZGF5OiAoKSA9PiB7XG4gICAgICB0b2RheSgpXG4gICAgICBzZXRNb2JpbGVQb3BvdmVyT3BlbihmYWxzZSlcbiAgICB9LFxuICAgIHByZXZpb3VzOiAoKSA9PiB7XG4gICAgICBwcmV2UGVyaW9kKClcbiAgICAgIHNldE1vYmlsZVBvcG92ZXJPcGVuKGZhbHNlKVxuICAgIH0sXG4gICAgbmV4dDogKCkgPT4ge1xuICAgICAgbmV4dFBlcmlvZCgpXG4gICAgICBzZXRNb2JpbGVQb3BvdmVyT3BlbihmYWxzZSlcbiAgICB9LFxuICB9XG5cbiAgY29uc3QgTmV3RXZlbnRCdXR0b24gPSB1c2VDYWxsYmFjayhcbiAgICAoKSA9PiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgIDxCdXR0b25cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvcGVuRXZlbnRGb3JtKGN1cnJlbnREYXRlKX1cbiAgICAgICAgICB2YXJpYW50PVwiZGVmYXVsdFwiXG4gICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMVwiXG4gICAgICAgID5cbiAgICAgICAgICA8UGx1cyBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6aW5saW5lXCI+TmV3IEV2ZW50PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1kOmhpZGRlblwiPk5ldzwvc3Bhbj5cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICApLFxuICAgIFtjdXJyZW50RGF0ZSwgb3BlbkV2ZW50Rm9ybV1cbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHsvKiBDYWxlbmRhciBIZWFkZXIgd2l0aCBncmlkIGxheW91dCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiQGNvbnRhaW5lciBncmlkIGdyaWQtY29scy0xMiBpdGVtcy1jZW50ZXIgZ2FwLTIgYm9yZGVyLWIgcC0yIHNtOnAtNFwiPlxuICAgICAgICB7LyogVGl0bGUgYXJlYSAtIExlZnQgc2VjdGlvbiAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc3Bhbi0xMiBmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIgQDR4bDpjb2wtc3Bhbi01IEA0eGw6anVzdGlmeS1zdGFydFwiPlxuICAgICAgICAgIDxDYWxlbmRhckljb24gY2xhc3NOYW1lPVwiaC01IHctNVwiIC8+XG4gICAgICAgICAgPFRpdGxlQ29udGVudCAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogTmV3IGV2ZW50IGJ1dHRvbiAtIE1vYmlsZSAmIERlc2t0b3AgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNwYW4tMTIgZmxleCBmbGV4LXdyYXAganVzdGlmeS1jZW50ZXIgZ2FwLTEgQDR4bDpjb2wtc3Bhbi03IEA0eGw6anVzdGlmeS1lbmRcIj5cbiAgICAgICAgICB7LyogRGVza3RvcCBjb250cm9scyAtIGNlbnRyYWxpemVkICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZCBnYXAtMSBzbTpmbGV4XCI+XG4gICAgICAgICAgICA8Vmlld0NvbnRyb2xzXG4gICAgICAgICAgICAgIGN1cnJlbnRWaWV3PXt2aWV3fVxuICAgICAgICAgICAgICBvbkNoYW5nZT17c2V0Vmlld31cbiAgICAgICAgICAgICAgb25Ub2RheT17dG9kYXl9XG4gICAgICAgICAgICAgIG9uTmV4dD17bmV4dFBlcmlvZH1cbiAgICAgICAgICAgICAgb25QcmV2aW91cz17cHJldlBlcmlvZH1cbiAgICAgICAgICAgICAgdmFyaWFudD1cImRlZmF1bHRcIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJqdXN0aWZ5LWVuZFwiXG4gICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICB7LyogTmV3IGV2ZW50IGJ1dHRvbiAtIERlc2t0b3AgKi99XG4gICAgICAgICAgICA8TmV3RXZlbnRCdXR0b24gLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIHsvKiBNb2JpbGUgbmF2aWdhdGlvbiBtZW51IGJ1dHRvbiAtIFJpZ2h0IGFsaWduZWQgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZCBnYXAtMSBzbTpoaWRkZW5cIj5cbiAgICAgICAgICAgIHsvKiBOZXcgZXZlbnQgYnV0dG9uIC0gTW9iaWxlICovfVxuICAgICAgICAgICAgPE5ld0V2ZW50QnV0dG9uIC8+XG5cbiAgICAgICAgICAgIDxQb3BvdmVyXG4gICAgICAgICAgICAgIG9wZW49e21vYmlsZVBvcG92ZXJPcGVufVxuICAgICAgICAgICAgICBvbk9wZW5DaGFuZ2U9e3NldE1vYmlsZVBvcG92ZXJPcGVufVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lXCIgc2l6ZT1cInNtXCI+XG4gICAgICAgICAgICAgICAgICA8TWVudSBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgPC9Qb3BvdmVyVHJpZ2dlcj5cbiAgICAgICAgICAgICAgPFBvcG92ZXJDb250ZW50IGFsaWduPVwiZW5kXCIgY2xhc3NOYW1lPVwidy1bMjQwcHhdIHAtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwibWItMSB0ZXh0LXNtIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICAgIFZpZXcgJiBOYXZpZ2F0aW9uXG4gICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgPFZpZXdDb250cm9sc1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Vmlldz17dmlld31cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhuZXdWaWV3KSA9PiBoYW5kbGVWaWV3Q2hhbmdlKG5ld1ZpZXcsIHRydWUpfVxuICAgICAgICAgICAgICAgICAgICBvblRvZGF5PXtoYW5kbGVOYXZpZ2F0aW9uLnRvZGF5fVxuICAgICAgICAgICAgICAgICAgICBvbk5leHQ9e2hhbmRsZU5hdmlnYXRpb24ubmV4dH1cbiAgICAgICAgICAgICAgICAgICAgb25QcmV2aW91cz17aGFuZGxlTmF2aWdhdGlvbi5wcmV2aW91c31cbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9Qb3BvdmVyQ29udGVudD5cbiAgICAgICAgICAgIDwvUG9wb3Zlcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBIZWFkZXJcbiIsCiAgICAiaW1wb3J0IHtcbiAgQnV0dG9uLFxuICBQb3BvdmVyLFxuICBQb3BvdmVyQ29udGVudCxcbiAgUG9wb3ZlclRyaWdnZXIsXG59IGZyb20gJ0AvY29tcG9uZW50cy91aSdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCB7IENoZXZyb25Eb3duIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuLy8gQ3JlYXRlIGFycmF5cyBmb3IgbW9udGggYW5kIHllYXIgb3B0aW9uc1xuY29uc3QgbW9udGhzID0gW1xuICAnSmFudWFyeScsXG4gICdGZWJydWFyeScsXG4gICdNYXJjaCcsXG4gICdBcHJpbCcsXG4gICdNYXknLFxuICAnSnVuZScsXG4gICdKdWx5JyxcbiAgJ0F1Z3VzdCcsXG4gICdTZXB0ZW1iZXInLFxuICAnT2N0b2JlcicsXG4gICdOb3ZlbWJlcicsXG4gICdEZWNlbWJlcicsXG5dXG5cbi8vIEFuaW1hdGlvbiB2YXJpYW50cyBmb3IgbnVtYmVyIHRyYW5zaXRpb25zXG5jb25zdCBhbmltYXRpb25WYXJpYW50cyA9IHtcbiAgaW5pdGlhbDogeyBvcGFjaXR5OiAwLCB5OiAxMCB9LFxuICBhbmltYXRlOiB7IG9wYWNpdHk6IDEsIHk6IDAgfSxcbiAgZXhpdDogeyBvcGFjaXR5OiAwLCB5OiAtMTAgfSxcbn1cblxuY29uc3QgVGl0bGVDb250ZW50ID0gKCkgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREYXRlLCB2aWV3LCBzZXRDdXJyZW50RGF0ZSB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBTdGF0ZSBmb3IgbW9iaWxlIG1lbnUgYW5kIHBvcG92ZXJzXG4gIGNvbnN0IFttb250aFBvcG92ZXJPcGVuLCBzZXRNb250aFBvcG92ZXJPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbeWVhclBvcG92ZXJPcGVuLCBzZXRZZWFyUG9wb3Zlck9wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFt3ZWVrUG9wb3Zlck9wZW4sIHNldFdlZWtQb3BvdmVyT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2RheVBvcG92ZXJPcGVuLCBzZXREYXlQb3BvdmVyT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCBjdXJyZW50WWVhciA9IGN1cnJlbnREYXRlLnllYXIoKVxuICBjb25zdCB5ZWFycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDExIH0sIChfLCBpKSA9PiBjdXJyZW50WWVhciAtIDUgKyBpKVxuXG4gIC8vIEhhbmRsZSBtb250aCBhbmQgeWVhciBzZWxlY3Rpb25cbiAgY29uc3QgaGFuZGxlTW9udGhDaGFuZ2UgPSAobW9udGg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG5ld0RhdGUgPSBjdXJyZW50RGF0ZS5tb250aChtb250aClcbiAgICBzZXRDdXJyZW50RGF0ZShuZXdEYXRlKVxuICAgIHNldE1vbnRoUG9wb3Zlck9wZW4oZmFsc2UpXG4gIH1cblxuICBjb25zdCBoYW5kbGVZZWFyQ2hhbmdlID0gKHllYXI6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG5ld0RhdGUgPSBjdXJyZW50RGF0ZS55ZWFyKHllYXIpXG4gICAgc2V0Q3VycmVudERhdGUobmV3RGF0ZSlcbiAgICBzZXRZZWFyUG9wb3Zlck9wZW4oZmFsc2UpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7dmlldyAhPT0gJ3llYXInICYmIChcbiAgICAgICAgPFBvcG92ZXIgb3Blbj17bW9udGhQb3BvdmVyT3Blbn0gb25PcGVuQ2hhbmdlPXtzZXRNb250aFBvcG92ZXJPcGVufT5cbiAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcHgtMiBmb250LXNlbWlib2xkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICAgIDxtb3Rpb24uc3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtgbW9udGgtJHtjdXJyZW50RGF0ZS5tb250aCgpfWB9XG4gICAgICAgICAgICAgICAgICBpbml0aWFsPVwiaW5pdGlhbFwiXG4gICAgICAgICAgICAgICAgICBhbmltYXRlPVwiYW5pbWF0ZVwiXG4gICAgICAgICAgICAgICAgICBleGl0PVwiZXhpdFwiXG4gICAgICAgICAgICAgICAgICB2YXJpYW50cz17YW5pbWF0aW9uVmFyaWFudHN9XG4gICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uPXt7IGR1cmF0aW9uOiAwLjI1LCBlYXNlOiAnZWFzZUluT3V0JyB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtjdXJyZW50RGF0ZS5mb3JtYXQoJ01NTU0nKX1cbiAgICAgICAgICAgICAgICA8L21vdGlvbi5zcGFuPlxuICAgICAgICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cbiAgICAgICAgICAgICAgPENoZXZyb25Eb3duIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPC9Qb3BvdmVyVHJpZ2dlcj5cbiAgICAgICAgICA8UG9wb3ZlckNvbnRlbnQgY2xhc3NOYW1lPVwidy00MCBwLTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBtYXgtaC02MCBmbGV4LWNvbCBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICAgICAgICAgIHttb250aHMubWFwKChtb250aCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICBrZXk9e21vbnRofVxuICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICdqdXN0aWZ5LXN0YXJ0IGZvbnQtbm9ybWFsJyxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudERhdGUubW9udGgoKSA9PT0gaW5kZXggJiYgJ2JnLXByaW1hcnkvMTAnXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlTW9udGhDaGFuZ2UoaW5kZXgpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHttb250aH1cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L1BvcG92ZXJDb250ZW50PlxuICAgICAgICA8L1BvcG92ZXI+XG4gICAgICApfVxuXG4gICAgICA8UG9wb3ZlciBvcGVuPXt5ZWFyUG9wb3Zlck9wZW59IG9uT3BlbkNoYW5nZT17c2V0WWVhclBvcG92ZXJPcGVufT5cbiAgICAgICAgPFBvcG92ZXJUcmlnZ2VyIGFzQ2hpbGQ+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHB4LTIgZm9udC1zZW1pYm9sZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICA8bW90aW9uLnNwYW5cbiAgICAgICAgICAgICAgICBrZXk9e2B5ZWFyLSR7Y3VycmVudERhdGUueWVhcigpfWB9XG4gICAgICAgICAgICAgICAgaW5pdGlhbD1cImluaXRpYWxcIlxuICAgICAgICAgICAgICAgIGFuaW1hdGU9XCJhbmltYXRlXCJcbiAgICAgICAgICAgICAgICBleGl0PVwiZXhpdFwiXG4gICAgICAgICAgICAgICAgdmFyaWFudHM9e2FuaW1hdGlvblZhcmlhbnRzfVxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuMjUsIGVhc2U6ICdlYXNlSW5PdXQnIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7Y3VycmVudERhdGUuZm9ybWF0KCdZWVlZJyl9XG4gICAgICAgICAgICAgIDwvbW90aW9uLnNwYW4+XG4gICAgICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cbiAgICAgICAgICAgIDxDaGV2cm9uRG93biBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgPC9Qb3BvdmVyVHJpZ2dlcj5cbiAgICAgICAgPFBvcG92ZXJDb250ZW50IGNsYXNzTmFtZT1cInctMjQgcC0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1heC1oLTYwIGZsZXgtY29sIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgIHt5ZWFycy5tYXAoKHllYXIpID0+IChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIGtleT17eWVhcn1cbiAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAnanVzdGlmeS1zdGFydCBmb250LW5vcm1hbCcsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS55ZWFyKCkgPT09IHllYXIgJiYgJ2JnLXByaW1hcnkvMTAnXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVZZWFyQ2hhbmdlKHllYXIpfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3llYXJ9XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvUG9wb3ZlckNvbnRlbnQ+XG4gICAgICA8L1BvcG92ZXI+XG5cbiAgICAgIHsvKiBEaXNwbGF5IGFkZGl0aW9uYWwgdmlldy1zcGVjaWZpYyBpbmZvcm1hdGlvbiAqL31cbiAgICAgIHt2aWV3ID09PSAnd2VlaycgJiYgKFxuICAgICAgICA8UG9wb3ZlciBvcGVuPXt3ZWVrUG9wb3Zlck9wZW59IG9uT3BlbkNoYW5nZT17c2V0V2Vla1BvcG92ZXJPcGVufT5cbiAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcHgtMiBmb250LXNlbWlib2xkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICAgIDxtb3Rpb24uc3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtgd2Vlay1yYW5nZS0ke2N1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgICAgICAgICBpbml0aWFsPVwiaW5pdGlhbFwiXG4gICAgICAgICAgICAgICAgICBhbmltYXRlPVwiYW5pbWF0ZVwiXG4gICAgICAgICAgICAgICAgICBleGl0PVwiZXhpdFwiXG4gICAgICAgICAgICAgICAgICB2YXJpYW50cz17YW5pbWF0aW9uVmFyaWFudHN9XG4gICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uPXt7IGR1cmF0aW9uOiAwLjI1LCBlYXNlOiAnZWFzZUluT3V0JyB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtgJHtjdXJyZW50RGF0ZVxuICAgICAgICAgICAgICAgICAgICAuc3RhcnRPZignd2VlaycpXG4gICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoJ01NTSBEJyl9IC0gJHtjdXJyZW50RGF0ZVxuICAgICAgICAgICAgICAgICAgICAuZW5kT2YoJ3dlZWsnKVxuICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KCdNTU0gRCcpfWB9XG4gICAgICAgICAgICAgICAgPC9tb3Rpb24uc3Bhbj5cbiAgICAgICAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICAgICAgICAgIDxDaGV2cm9uRG93biBjbGFzc05hbWU9XCJtbC0xIGgtMyB3LTMgb3BhY2l0eS03MFwiIC8+XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8L1BvcG92ZXJUcmlnZ2VyPlxuICAgICAgICAgIDxQb3BvdmVyQ29udGVudCBjbGFzc05hbWU9XCJ3LTU2IHAtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1heC1oLTYwIGZsZXgtY29sIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgICAgey8qIFNob3cgNyB3ZWVrcyAoMyBwYXN0LCBjdXJyZW50LCAzIGZ1dHVyZSkgKi99XG4gICAgICAgICAgICAgIHtBcnJheS5mcm9tKHsgbGVuZ3RoOiA3IH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2Vla0RhdGUgPSBjdXJyZW50RGF0ZS5zdWJ0cmFjdCgzLCAnd2VlaycpLmFkZChpLCAnd2VlaycpXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRPZldlZWsgPSB3ZWVrRGF0ZS5zdGFydE9mKCd3ZWVrJylcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRPZldlZWsgPSB3ZWVrRGF0ZS5lbmRPZignd2VlaycpXG4gICAgICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50V2VlayA9IHdlZWtEYXRlLmlzU2FtZShjdXJyZW50RGF0ZSwgJ3dlZWsnKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAga2V5PXtzdGFydE9mV2Vlay5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAnanVzdGlmeS1zdGFydCBmb250LW5vcm1hbCcsXG4gICAgICAgICAgICAgICAgICAgICAgaXNDdXJyZW50V2VlayAmJiAnYmctcHJpbWFyeS8xMCdcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJlbnREYXRlKHN0YXJ0T2ZXZWVrKVxuICAgICAgICAgICAgICAgICAgICAgIHNldFdlZWtQb3BvdmVyT3BlbihmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2Ake3N0YXJ0T2ZXZWVrLmZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICdNTU0gRCdcbiAgICAgICAgICAgICAgICAgICAgICApfSAtICR7ZW5kT2ZXZWVrLmZvcm1hdCgnRCcpfWB9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIHtzdGFydE9mV2Vlay5tb250aCgpICE9PSBlbmRPZldlZWsubW9udGgoKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG9wYWNpdHktNzBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2Ake3N0YXJ0T2ZXZWVrLmZvcm1hdCgnTU1NJyl9LSR7ZW5kT2ZXZWVrLmZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTU1NJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9Qb3BvdmVyQ29udGVudD5cbiAgICAgICAgPC9Qb3BvdmVyPlxuICAgICAgKX1cbiAgICAgIHt2aWV3ID09PSAnZGF5JyAmJiAoXG4gICAgICAgIDxQb3BvdmVyIG9wZW49e2RheVBvcG92ZXJPcGVufSBvbk9wZW5DaGFuZ2U9e3NldERheVBvcG92ZXJPcGVufT5cbiAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcHgtMiBmb250LXNlbWlib2xkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICAgIDxtb3Rpb24uc3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtgZGF5LWluZm8tJHtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgICAgICAgICAgICAgaW5pdGlhbD1cImluaXRpYWxcIlxuICAgICAgICAgICAgICAgICAgYW5pbWF0ZT1cImFuaW1hdGVcIlxuICAgICAgICAgICAgICAgICAgZXhpdD1cImV4aXRcIlxuICAgICAgICAgICAgICAgICAgdmFyaWFudHM9e2FuaW1hdGlvblZhcmlhbnRzfVxuICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbj17eyBkdXJhdGlvbjogMC4yNSwgZWFzZTogJ2Vhc2VJbk91dCcgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7Y3VycmVudERhdGUuZm9ybWF0KCdkZGRkLCBEJyl9XG4gICAgICAgICAgICAgICAgPC9tb3Rpb24uc3Bhbj5cbiAgICAgICAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICAgICAgICAgIDxDaGV2cm9uRG93biBjbGFzc05hbWU9XCJtbC0xIGgtMyB3LTMgb3BhY2l0eS03MFwiIC8+XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8L1BvcG92ZXJUcmlnZ2VyPlxuICAgICAgICAgIDxQb3BvdmVyQ29udGVudCBjbGFzc05hbWU9XCJ3LTU2IHAtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1heC1oLTYwIGZsZXgtY29sIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgICAgey8qIFNob3cgYWxsIGRheXMgb2YgdGhlIGN1cnJlbnQgbW9udGggKi99XG4gICAgICAgICAgICAgIHsoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEdldCBmaXJzdCBkYXkgb2YgbW9udGggYW5kIGxhc3QgZGF5IG9mIG1vbnRoXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gY3VycmVudERhdGUuc3RhcnRPZignbW9udGgnKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gY3VycmVudERhdGUuZGF5c0luTW9udGgoKVxuXG4gICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgYXJyYXkgb2YgZGF5cyBpbiB0aGUgbW9udGhcbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogZGF5c0luTW9udGggfSwgKF8sIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRheURhdGUgPSBmaXJzdERheU9mTW9udGguZGF0ZShpICsgMSkgLy8gaSArIDEgYmVjYXVzZSBkYXlzIHN0YXJ0IGF0IDFcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudERheSA9IGRheURhdGUuaXNTYW1lKGN1cnJlbnREYXRlLCAnZGF5JylcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzVG9kYXkgPSBkYXlEYXRlLmlzU2FtZShkYXlqcygpLCAnZGF5JylcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGtleT17ZGF5RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICAgICAnanVzdGlmeS1zdGFydCBmb250LW5vcm1hbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0N1cnJlbnREYXkgJiYgJ2JnLXByaW1hcnkvMTAnXG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyZW50RGF0ZShkYXlEYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF5UG9wb3Zlck9wZW4oZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2RheURhdGUuZm9ybWF0KCdkZGRkLCBNTU0gRCcpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtpc1RvZGF5ICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCByb3VuZGVkLXNtIHB4LTEgdGV4dC14c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvZGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH0pKCl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L1BvcG92ZXJDb250ZW50PlxuICAgICAgICA8L1BvcG92ZXI+XG4gICAgICApfVxuICAgIDwvPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IFRpdGxlQ29udGVudFxuIiwKICAgICJpbXBvcnQgeyBCdXR0b24gfSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgQ2hldnJvbkxlZnQsIENoZXZyb25SaWdodCB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcblxudHlwZSBWaWV3Q29udHJvbHNQcm9wcyA9IHtcbiAgY3VycmVudFZpZXc6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJ1xuICBvbkNoYW5nZTogKHZpZXc6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJykgPT4gdm9pZFxuICBvblRvZGF5PzogKCkgPT4gdm9pZFxuICBvbk5leHQ/OiAoKSA9PiB2b2lkXG4gIG9uUHJldmlvdXM/OiAoKSA9PiB2b2lkXG4gIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAnZ3JpZCdcbiAgc2l6ZT86ICdzbScgfCAnZGVmYXVsdCdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmNvbnN0IFZpZXdDb250cm9sczogUmVhY3QuRkM8Vmlld0NvbnRyb2xzUHJvcHM+ID0gKHtcbiAgY3VycmVudFZpZXcsXG4gIG9uQ2hhbmdlLFxuICB2YXJpYW50ID0gJ2RlZmF1bHQnLFxuICBzaXplID0gJ3NtJyxcbiAgY2xhc3NOYW1lLFxuICBvblRvZGF5LFxuICBvbk5leHQsXG4gIG9uUHJldmlvdXMsXG59KSA9PiB7XG4gIGNvbnN0IGlzR3JpZCA9IHZhcmlhbnQgPT09ICdncmlkJ1xuXG4gIC8vIEV4dHJhY3QgY29tbW9uIGJ1dHRvbiBjbGFzc05hbWUgbG9naWMgdG8gYSBmdW5jdGlvblxuICBjb25zdCBnZXRCdXR0b25DbGFzc05hbWUgPSAodmlld1R5cGU6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJykgPT4ge1xuICAgIHJldHVybiBjbihcbiAgICAgIC8vIEJhc2Ugd2lkdGggZm9yIGdyaWQgbGF5b3V0XG4gICAgICBpc0dyaWQgPyAndy1mdWxsJyA6ICcnLFxuICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciB5ZWFyIGJ1dHRvbiB2aXNpYmlsaXR5IG9uIG1vYmlsZVxuICAgICAgdmlld1R5cGUgPT09ICd5ZWFyJyA/IChpc0dyaWQgPyAndy1mdWxsJyA6ICdoaWRkZW4gbWQ6aW5saW5lLWZsZXgnKSA6ICcnLFxuICAgICAgLy8gQWN0aXZlIHZpZXcgc3R5bGluZ1xuICAgICAgY3VycmVudFZpZXcgPT09IHZpZXdUeXBlICYmICdiZy1wcmltYXJ5LzgwJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IGdldEJ0blZhcmlhbnQgPSAodmlld1R5cGU6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJykgPT4ge1xuICAgIHJldHVybiBjdXJyZW50VmlldyA9PT0gdmlld1R5cGUgPyAnZGVmYXVsdCcgOiAnb3V0bGluZSdcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgaXNHcmlkID8gJ2dyaWQgZ3JpZC1jb2xzLTIgZ2FwLTInIDogJ2ZsZXggZ2FwLTEnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgPlxuICAgICAgPEJ1dHRvbiBvbkNsaWNrPXtvblByZXZpb3VzfSB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9e3NpemV9PlxuICAgICAgICA8Q2hldnJvbkxlZnQgY2xhc3NOYW1lPVwiaC00IHctNFwiIC8+XG4gICAgICA8L0J1dHRvbj5cbiAgICAgIDxCdXR0b24gb25DbGljaz17b25OZXh0fSB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9e3NpemV9PlxuICAgICAgICA8Q2hldnJvblJpZ2h0IGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgPC9CdXR0b24+XG5cbiAgICAgIDxCdXR0b25cbiAgICAgICAgb25DbGljaz17KCkgPT4gb25DaGFuZ2UoJ2RheScpfVxuICAgICAgICB2YXJpYW50PXtnZXRCdG5WYXJpYW50KCdkYXknKX1cbiAgICAgICAgc2l6ZT17c2l6ZX1cbiAgICAgICAgY2xhc3NOYW1lPXtnZXRCdXR0b25DbGFzc05hbWUoJ2RheScpfVxuICAgICAgPlxuICAgICAgICBEYXlcbiAgICAgIDwvQnV0dG9uPlxuICAgICAgPEJ1dHRvblxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbkNoYW5nZSgnd2VlaycpfVxuICAgICAgICB2YXJpYW50PXtnZXRCdG5WYXJpYW50KCd3ZWVrJyl9XG4gICAgICAgIHNpemU9e3NpemV9XG4gICAgICAgIGNsYXNzTmFtZT17Z2V0QnV0dG9uQ2xhc3NOYW1lKCd3ZWVrJyl9XG4gICAgICA+XG4gICAgICAgIFdlZWtcbiAgICAgIDwvQnV0dG9uPlxuICAgICAgPEJ1dHRvblxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbkNoYW5nZSgnbW9udGgnKX1cbiAgICAgICAgdmFyaWFudD17Z2V0QnRuVmFyaWFudCgnbW9udGgnKX1cbiAgICAgICAgc2l6ZT17c2l6ZX1cbiAgICAgICAgY2xhc3NOYW1lPXtnZXRCdXR0b25DbGFzc05hbWUoJ21vbnRoJyl9XG4gICAgICA+XG4gICAgICAgIE1vbnRoXG4gICAgICA8L0J1dHRvbj5cbiAgICAgIDxCdXR0b25cbiAgICAgICAgb25DbGljaz17KCkgPT4gb25DaGFuZ2UoJ3llYXInKX1cbiAgICAgICAgdmFyaWFudD17Z2V0QnRuVmFyaWFudCgneWVhcicpfVxuICAgICAgICBzaXplPXtzaXplfVxuICAgICAgICBjbGFzc05hbWU9e2dldEJ1dHRvbkNsYXNzTmFtZSgneWVhcicpfVxuICAgICAgPlxuICAgICAgICBZZWFyXG4gICAgICA8L0J1dHRvbj5cblxuICAgICAgPEJ1dHRvbiBvbkNsaWNrPXtvblRvZGF5fSB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9e3NpemV9PlxuICAgICAgICBUb2RheVxuICAgICAgPC9CdXR0b24+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgVmlld0NvbnRyb2xzXG4iLAogICAgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgU2Nyb2xsQXJlYSB9IGZyb20gJ0AvY29tcG9uZW50cy91aSdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgQW5pbWF0ZVByZXNlbmNlLCBtb3Rpb24gfSBmcm9tICdtb3Rpb24vcmVhY3QnXG5cbmNvbnN0IFllYXJWaWV3OiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3QgeyBjdXJyZW50RGF0ZSwgc2VsZWN0RGF0ZSwgZXZlbnRzLCBzZXRWaWV3LCBnZXRFdmVudHNGb3JEYXRlIH0gPVxuICAgIHVzZUNhbGVuZGFyQ29udGV4dCgpXG4gIGNvbnN0IHllYXIgPSBjdXJyZW50RGF0ZS55ZWFyKClcblxuICAvLyBHZW5lcmF0ZSBhbiBhcnJheSBvZiAxMiBtb250aHMgZm9yIHRoZSBjdXJyZW50IHllYXJcbiAgY29uc3QgbW9udGhzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTIgfSwgKF8sIGkpID0+IHtcbiAgICBjb25zdCBtb250aERhdGUgPSBkYXlqcygpLnllYXIoeWVhcikubW9udGgoaSkuc3RhcnRPZignbW9udGgnKVxuICAgIHJldHVybiB7XG4gICAgICBkYXRlOiBtb250aERhdGUsXG4gICAgICBuYW1lOiBtb250aERhdGUuZm9ybWF0KCdNTU1NJyksXG4gICAgICBkYXlzSW5Nb250aDogbW9udGhEYXRlLmRheXNJbk1vbnRoKCksXG4gICAgICBmaXJzdERheU9mTW9udGg6IG1vbnRoRGF0ZS5zdGFydE9mKCdtb250aCcpLmRheSgpLCAvLyAwLTYsIDAgaXMgU3VuZGF5XG4gICAgfVxuICB9KVxuXG4gIC8vIENhbGN1bGF0ZSBldmVudHMgZm9yIGVhY2ggbW9udGhcbiAgY29uc3QgbW9udGhzV2l0aEV2ZW50Q291bnQgPSBtb250aHMubWFwKChtb250aCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50c0luTW9udGggPSBldmVudHMuZmlsdGVyKFxuICAgICAgKGV2ZW50KSA9PlxuICAgICAgICBldmVudC5zdGFydC55ZWFyKCkgPT09IHllYXIgJiZcbiAgICAgICAgZXZlbnQuc3RhcnQubW9udGgoKSA9PT0gbW9udGguZGF0ZS5tb250aCgpXG4gICAgKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1vbnRoLFxuICAgICAgZXZlbnRDb3VudDogZXZlbnRzSW5Nb250aC5sZW5ndGgsXG4gICAgfVxuICB9KVxuXG4gIC8vIEhhbmRsZSBtb250aCBjbGljayB0byBuYXZpZ2F0ZSB0byBtb250aCB2aWV3XG4gIGNvbnN0IGhhbmRsZU1vbnRoQ2xpY2sgPSAoZGF0ZTogZGF5anMuRGF5anMpID0+IHtcbiAgICBzZWxlY3REYXRlKGRhdGUpXG4gICAgc2V0VmlldygnbW9udGgnKVxuICB9XG5cbiAgLy8gSGFuZGxlIGRheSBjbGljayB3aXRoaW4gdGhlIG1pbmkgY2FsZW5kYXJcbiAgY29uc3QgaGFuZGxlRGF5Q2xpY2sgPSAoZGF0ZTogZGF5anMuRGF5anMsIGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkgLy8gUHJldmVudCB0cmlnZ2VyaW5nIHRoZSBtb250aCBjbGlja1xuICAgIHNlbGVjdERhdGUoZGF0ZSlcbiAgICBzZXRWaWV3KCdkYXknKSAvLyBOYXZpZ2F0ZSBkaXJlY3RseSB0byBkYXkgdmlldyB3aGVuIGNsaWNraW5nIG9uIGEgc3BlY2lmaWMgZGF5XG4gIH1cblxuICAvLyBHZW5lcmF0ZSBkYXlzIGZvciBtaW5pIGNhbGVuZGFyIGluIGVhY2ggbW9udGhcbiAgY29uc3QgcmVuZGVyTWluaUNhbGVuZGFyID0gKG1vbnRoOiAodHlwZW9mIG1vbnRoc1dpdGhFdmVudENvdW50KVswXSkgPT4ge1xuICAgIC8vIEdldCB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aCdzIGNhbGVuZGFyICh3aGljaCBjb3VsZCBiZSBpbiB0aGUgcHJldmlvdXMgbW9udGgpXG4gICAgY29uc3QgZmlyc3REYXlPZkNhbGVuZGFyID0gbW9udGguZGF0ZS5zdGFydE9mKCdtb250aCcpLnN0YXJ0T2YoJ3dlZWsnKVxuXG4gICAgLy8gQ3JlYXRlIDQyIGRheXMgKDYgcm93cyBvZiA3IGRheXMpIGZvciBjb25zaXN0ZW5jeVxuICAgIGNvbnN0IGRheXNBcnJheSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDQyIH0sIChfLCBpKSA9PiB7XG4gICAgICBjb25zdCBkYXkgPSBmaXJzdERheU9mQ2FsZW5kYXIuYWRkKGksICdkYXknKVxuICAgICAgY29uc3QgaXNDdXJyZW50TW9udGggPSBkYXkubW9udGgoKSA9PT0gbW9udGguZGF0ZS5tb250aCgpXG4gICAgICBjb25zdCBpc1RvZGF5ID0gZGF5LmlzU2FtZShkYXlqcygpLCAnZGF5JylcbiAgICAgIGNvbnN0IGlzQ3VycmVudERhdGUgPSBkYXkuaXNTYW1lKGN1cnJlbnREYXRlLCAnZGF5JylcblxuICAgICAgLy8gR2V0IGV2ZW50cyBmb3IgdGhpcyBkYXlcbiAgICAgIGNvbnN0IGRheUV2ZW50cyA9IGdldEV2ZW50c0ZvckRhdGUoZGF5KVxuICAgICAgY29uc3QgaGFzRXZlbnRzID0gZGF5RXZlbnRzLmxlbmd0aCA+IDBcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF5LFxuICAgICAgICBpc0N1cnJlbnRNb250aCxcbiAgICAgICAgaXNUb2RheSxcbiAgICAgICAgaXNDdXJyZW50RGF0ZSxcbiAgICAgICAgaGFzRXZlbnRzLFxuICAgICAgICBldmVudENvdW50OiBkYXlFdmVudHMubGVuZ3RoLFxuICAgICAgICAvLyBHcm91cCBldmVudHMgYnkgdGhlaXIgY2F0ZWdvcmllcyB0byBzaG93IGRpZmZlcmVudCBjb2xvcnNcbiAgICAgICAgZXZlbnRzOiBkYXlFdmVudHMsXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGRhdGEtdGVzdGlkPXtgeWVhci1taW5pLWNhbGVuZGFyLSR7bW9udGguZGF0ZS5mb3JtYXQoJ01NJyl9YH1cbiAgICAgICAgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtNyBnYXAtWzFweF0gdGV4dC1bMC42cmVtXVwiXG4gICAgICA+XG4gICAgICAgIHsvKiBEYXkgbmFtZXMgKi99XG4gICAgICAgIHtbJ1MnLCAnTScsICdUJywgJ1cnLCAnVCcsICdGJywgJ1MnXS5tYXAoKGRheU5hbWUsIGkpID0+IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBrZXk9e2BoZWFkZXItJHtpfWB9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgaC0zIHRleHQtY2VudGVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7ZGF5TmFtZX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSl9XG5cbiAgICAgICAgey8qIENhbGVuZGFyIGRheXMgKi99XG4gICAgICAgIHtkYXlzQXJyYXkubWFwKChkYXlJbmZvLCBpKSA9PiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtgZGF5LSR7aX1gfVxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2B5ZWFyLWRheS0ke2RheUluZm8uZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gaGFuZGxlRGF5Q2xpY2soZGF5SW5mby5kYXksIGUpfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ3JlbGF0aXZlIGZsZXggYXNwZWN0LXNxdWFyZSB3LWZ1bGwgY3Vyc29yLXBvaW50ZXIgZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyJyxcbiAgICAgICAgICAgICAgJ2hvdmVyOmJnLWFjY2VudCByb3VuZGVkLXNtIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTIwMCcsXG4gICAgICAgICAgICAgICFkYXlJbmZvLmlzQ3VycmVudE1vbnRoICYmICd0ZXh0LW11dGVkLWZvcmVncm91bmQgb3BhY2l0eS01MCcsXG4gICAgICAgICAgICAgIGRheUluZm8uaXNUb2RheSAmJlxuICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgICAgIGRheUluZm8uaXNDdXJyZW50RGF0ZSAmJlxuICAgICAgICAgICAgICAgICFkYXlJbmZvLmlzVG9kYXkgJiZcbiAgICAgICAgICAgICAgICAnYmctbXV0ZWQgcm91bmRlZC1mdWxsIGZvbnQtYm9sZCcsXG4gICAgICAgICAgICAgIGRheUluZm8uaGFzRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgIWRheUluZm8uaXNUb2RheSAmJlxuICAgICAgICAgICAgICAgICFkYXlJbmZvLmlzQ3VycmVudERhdGUgJiZcbiAgICAgICAgICAgICAgICAnZm9udC1tZWRpdW0nXG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgdGl0bGU9e1xuICAgICAgICAgICAgICBkYXlJbmZvLmhhc0V2ZW50c1xuICAgICAgICAgICAgICAgID8gYCR7ZGF5SW5mby5ldmVudENvdW50fSBldmVudCR7XG4gICAgICAgICAgICAgICAgICAgIGRheUluZm8uZXZlbnRDb3VudCA+IDEgPyAncycgOiAnJ1xuICAgICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1jZW50ZXIgbGVhZGluZy1ub25lXCI+XG4gICAgICAgICAgICAgIHtkYXlJbmZvLmRheS5kYXRlKCl9XG4gICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgIHsvKiBFbmhhbmNlZCBldmVudCBpbmRpY2F0b3IgLSBzaG93IG11bHRpcGxlIGNvbG9yZWQgZG90cyBmb3IgZGlmZmVyZW50IGV2ZW50IHR5cGVzICovfVxuICAgICAgICAgICAge2RheUluZm8uaGFzRXZlbnRzICYmIChcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAnYWJzb2x1dGUgYm90dG9tLTAgZmxleCB3LWZ1bGwganVzdGlmeS1jZW50ZXIgc3BhY2UteC1bMXB4XScsXG4gICAgICAgICAgICAgICAgICBkYXlJbmZvLmlzVG9kYXkgPyAnYm90dG9tLVsxcHhdJyA6ICcnXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHsvKiBTaG93IHVwIHRvIDMgZXZlbnQgZG90cyB3aXRoIGRpZmZlcmVudCBjb2xvcnMgaWYgYXZhaWxhYmxlICovfVxuICAgICAgICAgICAgICAgIHtkYXlJbmZvLmV2ZW50Q291bnQgPiAwICYmIChcbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICAgJ2gtWzNweF0gdy1bM3B4XSByb3VuZGVkLWZ1bGwnLFxuICAgICAgICAgICAgICAgICAgICAgIGRheUluZm8uaXNUb2RheSA/ICdiZy1wcmltYXJ5LWZvcmVncm91bmQnIDogJ2JnLXByaW1hcnknXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge2RheUluZm8uZXZlbnRDb3VudCA+IDEgJiYgKFxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAnaC1bM3B4XSB3LVszcHhdIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgZGF5SW5mby5pc1RvZGF5ID8gJ2JnLXByaW1hcnktZm9yZWdyb3VuZCcgOiAnYmctYmx1ZS01MDAnXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge2RheUluZm8uZXZlbnRDb3VudCA+IDIgJiYgKFxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAnaC1bM3B4XSB3LVszcHhdIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgZGF5SW5mby5pc1RvZGF5ID8gJ2JnLXByaW1hcnktZm9yZWdyb3VuZCcgOiAnYmctZ3JlZW4tNTAwJ1xuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8U2Nyb2xsQXJlYSBkYXRhLXRlc3RpZD1cInllYXItdmlld1wiIGNsYXNzTmFtZT1cImgtZnVsbFwiPlxuICAgICAgPGRpdlxuICAgICAgICBkYXRhLXRlc3RpZD1cInllYXItZ3JpZFwiXG4gICAgICAgIGNsYXNzTmFtZT1cImdyaWQgYXV0by1yb3dzLWZyIGdyaWQtY29scy0xIGdhcC00IHAtNCBzbTpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtM1wiXG4gICAgICA+XG4gICAgICAgIHttb250aHNXaXRoRXZlbnRDb3VudC5tYXAoKG1vbnRoLCBpbmRleCkgPT4gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGtleT17bW9udGgubmFtZX1cbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgeWVhci1tb250aC0ke21vbnRoLmRhdGUuZm9ybWF0KCdNTScpfWB9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVNb250aENsaWNrKG1vbnRoLmRhdGUpfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiaG92ZXI6Ym9yZGVyLXByaW1hcnkgZmxleCBjdXJzb3ItcG9pbnRlciBmbGV4LWNvbCByb3VuZGVkLWxnIGJvcmRlciBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGhvdmVyOnNjYWxlLVsxLjAxXSBob3ZlcjpzaGFkb3ctbWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxBbmltYXRlUHJlc2VuY2UgbW9kZT1cIndhaXRcIj5cbiAgICAgICAgICAgICAgPG1vdGlvbi5kaXZcbiAgICAgICAgICAgICAgICBrZXk9e2Btb250aC0ke2luZGV4fWB9XG4gICAgICAgICAgICAgICAgaW5pdGlhbD17eyBvcGFjaXR5OiAwLCB5OiAtMTAgfX1cbiAgICAgICAgICAgICAgICBhbmltYXRlPXt7IG9wYWNpdHk6IDEsIHk6IDAgfX1cbiAgICAgICAgICAgICAgICBleGl0PXt7IG9wYWNpdHk6IDAsIHk6IC0xMCB9fVxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb249e3tcbiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAwLjI1LFxuICAgICAgICAgICAgICAgICAgZWFzZTogJ2Vhc2VJbk91dCcsXG4gICAgICAgICAgICAgICAgICBkZWxheTogaW5kZXggKiAwLjA1LFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWItMiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGgzXG4gICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD17YHllYXItbW9udGgtdGl0bGUtJHttb250aC5kYXRlLmZvcm1hdCgnTU0nKX1gfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LW1lZGl1bVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge21vbnRoLm5hbWV9XG4gICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICB7bW9udGguZXZlbnRDb3VudCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2B5ZWFyLW1vbnRoLWV2ZW50LWNvdW50LSR7bW9udGguZGF0ZS5mb3JtYXQoJ01NJyl9YH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCByb3VuZGVkLWZ1bGwgcHgtMiBweS0xIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7bW9udGguZXZlbnRDb3VudH17JyAnfVxuICAgICAgICAgICAgICAgICAgICB7bW9udGguZXZlbnRDb3VudCA9PT0gMSA/ICdldmVudCcgOiAnZXZlbnRzJ31cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L21vdGlvbi5kaXY+XG4gICAgICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cblxuICAgICAgICAgICAge3JlbmRlck1pbmlDYWxlbmRhcihtb250aCl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgPC9TY3JvbGxBcmVhPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IFllYXJWaWV3XG4iLAogICAgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IE1vbnRoVmlldyB9IGZyb20gJ0AvZmVhdHVyZXMvbW9udGgtdmlldy9jb21wb25lbnRzL21vbnRoLXZpZXcnXG5pbXBvcnQgV2Vla1ZpZXcgZnJvbSAnQC9mZWF0dXJlcy93ZWVrLXZpZXcvd2Vlay12aWV3J1xuaW1wb3J0IERheVZpZXcgZnJvbSAnQC9mZWF0dXJlcy9kYXktdmlldy9kYXktdmlldydcbmltcG9ydCB7IEV2ZW50Rm9ybSB9IGZyb20gJy4uL2V2ZW50LWZvcm0vZXZlbnQtZm9ybSdcbmltcG9ydCB7IEhlYWRlciB9IGZyb20gJy4uL2hlYWRlcidcbmltcG9ydCBZZWFyVmlldyBmcm9tICdAL2ZlYXR1cmVzL3llYXItdmlldy95ZWFyLXZpZXcnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCB7IENhbGVuZGFyRG5kQ29udGV4dCB9IGZyb20gJ0AvZmVhdHVyZXMvZHJhZy1hbmQtZHJvcC9jYWxlbmRhci1kbmQtY29udGV4dCdcbmltcG9ydCB7IENhbGVuZGFyUHJvdmlkZXIgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvcHJvdmlkZXInXG5pbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQsIFdlZWtEYXlzIH0gZnJvbSAnQC9jb21wb25lbnRzL3R5cGVzJ1xuaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcblxuY29uc3QgQ2FsZW5kYXJDb250ZW50OiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIHZpZXcsXG4gICAgaXNFdmVudEZvcm1PcGVuLFxuICAgIGNsb3NlRXZlbnRGb3JtLFxuICAgIHNlbGVjdGVkRXZlbnQsXG4gICAgc2VsZWN0ZWREYXRlLFxuICAgIGFkZEV2ZW50LFxuICAgIHVwZGF0ZUV2ZW50LFxuICAgIGRlbGV0ZUV2ZW50LFxuICAgIGRheU1heEV2ZW50cyxcbiAgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgY29uc3Qgdmlld01hcCA9IHtcbiAgICBtb250aDogPE1vbnRoVmlldyBrZXk9XCJtb250aFwiIGRheU1heEV2ZW50cz17ZGF5TWF4RXZlbnRzfSAvPixcbiAgICB3ZWVrOiA8V2Vla1ZpZXcga2V5PVwid2Vla1wiIC8+LFxuICAgIGRheTogPERheVZpZXcga2V5PVwiZGF5XCIgLz4sXG4gICAgeWVhcjogPFllYXJWaWV3IGtleT1cInllYXJcIiAvPixcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZU9uVXBkYXRlID0gKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgdXBkYXRlRXZlbnQoZXZlbnQuaWQsIGV2ZW50KVxuICB9XG5cbiAgY29uc3QgaGFuZGxlT25EZWxldGUgPSAoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHtcbiAgICBkZWxldGVFdmVudChldmVudC5pZClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGxcIj5cbiAgICAgIDxIZWFkZXIgLz5cblxuICAgICAgey8qIENhbGVuZGFyIEJvZHkgd2l0aCBBbmltYXRlUHJlc2VuY2UgZm9yIHZpZXcgdHJhbnNpdGlvbnMgKi99XG4gICAgICA8Q2FsZW5kYXJEbmRDb250ZXh0PlxuICAgICAgICA8QW5pbWF0ZVByZXNlbmNlIG1vZGU9XCJ3YWl0XCI+XG4gICAgICAgICAgPG1vdGlvbi5kaXZcbiAgICAgICAgICAgIGtleT17dmlld31cbiAgICAgICAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCwgeDogMjAgfX1cbiAgICAgICAgICAgIGFuaW1hdGU9e3sgb3BhY2l0eTogMSwgeDogMCB9fVxuICAgICAgICAgICAgZXhpdD17eyBvcGFjaXR5OiAwLCB4OiAtMjAgfX1cbiAgICAgICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuMSwgZWFzZTogJ2Vhc2VJbk91dCcgfX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtZnVsbCB3LWZ1bGxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt2aWV3TWFwW3ZpZXddfVxuICAgICAgICAgIDwvbW90aW9uLmRpdj5cbiAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICA8L0NhbGVuZGFyRG5kQ29udGV4dD5cblxuICAgICAgey8qIEV2ZW50IEZvcm0gRGlhbG9nICovfVxuICAgICAge2lzRXZlbnRGb3JtT3BlbiAmJiAoXG4gICAgICAgIDxFdmVudEZvcm1cbiAgICAgICAgICBvbkNsb3NlPXtjbG9zZUV2ZW50Rm9ybX1cbiAgICAgICAgICBzZWxlY3RlZEV2ZW50PXtzZWxlY3RlZEV2ZW50fVxuICAgICAgICAgIHNlbGVjdGVkRGF0ZT17c2VsZWN0ZWREYXRlfVxuICAgICAgICAgIG9uQWRkPXthZGRFdmVudH1cbiAgICAgICAgICBvblVwZGF0ZT17aGFuZGxlT25VcGRhdGV9XG4gICAgICAgICAgb25EZWxldGU9e2hhbmRsZU9uRGVsZXRlfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5pbnRlcmZhY2UgQ2FsZW5kYXJQcm9wcyB7XG4gIGV2ZW50cz86IENhbGVuZGFyRXZlbnRbXVxuICBmaXJzdERheU9mV2Vlaz86IFdlZWtEYXlzXG4gIHJlbmRlckV2ZW50PzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBSZWFjdC5SZWFjdE5vZGVcbiAgb25FdmVudENsaWNrPzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIG9uQ2VsbENsaWNrPzogKHN0YXJ0RGF0ZTogZGF5anMuRGF5anMsIGVuZERhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIG9uVmlld0NoYW5nZT86ICh2aWV3OiAnbW9udGgnIHwgJ3dlZWsnIHwgJ2RheScgfCAneWVhcicpID0+IHZvaWRcbiAgbG9jYWxlPzogc3RyaW5nXG4gIHRpbWV6b25lPzogc3RyaW5nXG4gIGRpc2FibGVDZWxsQ2xpY2s/OiBib29sZWFuXG4gIGRpc2FibGVFdmVudENsaWNrPzogYm9vbGVhblxuICBkaXNhYmxlRHJhZ0FuZERyb3A/OiBib29sZWFuXG4gIGRheU1heEV2ZW50cz86IG51bWJlclxuICBzdGlja3lWaWV3SGVhZGVyPzogYm9vbGVhblxuICB2aWV3SGVhZGVyQ2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmNvbnN0IGRheU51bWJlck1hcDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgc3VuZGF5OiAwLFxuICBtb25kYXk6IDEsXG4gIHR1ZXNkYXk6IDIsXG4gIHdlZG5lc2RheTogMyxcbiAgdGh1cnNkYXk6IDQsXG4gIGZyaWRheTogNSxcbiAgc2F0dXJkYXk6IDYsXG59XG5cbmNvbnN0IERFRkFVTFRfREFZX01BWF9FVkVOVFMgPSA2XG5leHBvcnQgY29uc3QgSWxhbXlDYWxlbmRhcjogUmVhY3QuRkM8Q2FsZW5kYXJQcm9wcz4gPSAoe1xuICBldmVudHMsXG4gIGZpcnN0RGF5T2ZXZWVrID0gJ3N1bmRheScsXG4gIHJlbmRlckV2ZW50LFxuICBvbkV2ZW50Q2xpY2ssXG4gIG9uQ2VsbENsaWNrLFxuICBvblZpZXdDaGFuZ2UsXG4gIGxvY2FsZSxcbiAgdGltZXpvbmUsXG4gIGRpc2FibGVDZWxsQ2xpY2ssXG4gIGRpc2FibGVFdmVudENsaWNrLFxuICBkaXNhYmxlRHJhZ0FuZERyb3AsXG4gIGRheU1heEV2ZW50cyA9IERFRkFVTFRfREFZX01BWF9FVkVOVFMsXG4gIHN0aWNreVZpZXdIZWFkZXIgPSB0cnVlLFxuICB2aWV3SGVhZGVyQ2xhc3NOYW1lID0gJycsXG59KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPENhbGVuZGFyUHJvdmlkZXJcbiAgICAgIGV2ZW50cz17ZXZlbnRzfVxuICAgICAgZmlyc3REYXlPZldlZWs9e2RheU51bWJlck1hcFtmaXJzdERheU9mV2Vla119XG4gICAgICByZW5kZXJFdmVudD17cmVuZGVyRXZlbnR9XG4gICAgICBvbkV2ZW50Q2xpY2s9e29uRXZlbnRDbGlja31cbiAgICAgIG9uQ2VsbENsaWNrPXtvbkNlbGxDbGlja31cbiAgICAgIG9uVmlld0NoYW5nZT17b25WaWV3Q2hhbmdlfVxuICAgICAgbG9jYWxlPXtsb2NhbGV9XG4gICAgICB0aW1lem9uZT17dGltZXpvbmV9XG4gICAgICBkaXNhYmxlQ2VsbENsaWNrPXtkaXNhYmxlQ2VsbENsaWNrfVxuICAgICAgZGlzYWJsZUV2ZW50Q2xpY2s9e2Rpc2FibGVFdmVudENsaWNrfVxuICAgICAgZGlzYWJsZURyYWdBbmREcm9wPXtkaXNhYmxlRHJhZ0FuZERyb3B9XG4gICAgICBkYXlNYXhFdmVudHM9e2RheU1heEV2ZW50c31cbiAgICAgIHN0aWNreVZpZXdIZWFkZXI9e3N0aWNreVZpZXdIZWFkZXJ9XG4gICAgICB2aWV3SGVhZGVyQ2xhc3NOYW1lPXt2aWV3SGVhZGVyQ2xhc3NOYW1lfVxuICAgID5cbiAgICAgIDxDYWxlbmRhckNvbnRlbnQgLz5cbiAgICA8L0NhbGVuZGFyUHJvdmlkZXI+XG4gIClcbn1cbiIsCiAgICAiaW1wb3J0IHtcbiAgRG5kQ29udGV4dCxcbiAgRHJhZ092ZXJsYXksXG4gIE1vdXNlU2Vuc29yLFxuICBwb2ludGVyV2l0aGluLFxuICBUb3VjaFNlbnNvcixcbiAgdXNlU2Vuc29yLFxuICB1c2VTZW5zb3JzLFxufSBmcm9tICdAZG5kLWtpdC9jb3JlJ1xuaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHtcbiAgRHJhZ0NhbmNlbEV2ZW50LFxuICBEcmFnRW5kRXZlbnQsXG4gIERyYWdTdGFydEV2ZW50LFxufSBmcm9tICdAZG5kLWtpdC9jb3JlJ1xuaW1wb3J0IHsgc25hcENlbnRlclRvQ3Vyc29yIH0gZnJvbSAnQGRuZC1raXQvbW9kaWZpZXJzJ1xuaW1wb3J0IHR5cGUgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSAnQC9jb21wb25lbnRzL3R5cGVzJ1xuXG5pbnRlcmZhY2UgQ2FsZW5kYXJEbmRDb250ZXh0UHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDYWxlbmRhckRuZENvbnRleHQoeyBjaGlsZHJlbiB9OiBDYWxlbmRhckRuZENvbnRleHRQcm9wcykge1xuICBjb25zdCB7IHVwZGF0ZUV2ZW50LCB2aWV3LCBkaXNhYmxlRHJhZ0FuZERyb3AgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG4gIGNvbnN0IFthY3RpdmVFdmVudCwgc2V0QWN0aXZlRXZlbnRdID0gUmVhY3QudXNlU3RhdGU8Q2FsZW5kYXJFdmVudCB8IG51bGw+KFxuICAgIG51bGxcbiAgKVxuXG4gIC8vIENvbmZpZ3VyZSBzZW5zb3JzIHdpdGggcmVkdWNlZCBhY3RpdmF0aW9uIGNvbnN0cmFpbnRzIGZvciBlYXNpZXIgZHJhZ2dpbmdcbiAgY29uc3QgbW91c2VTZW5zb3IgPSB1c2VTZW5zb3IoTW91c2VTZW5zb3IsIHtcbiAgICAvLyBSZXF1aXJlIG1pbmltYWwgbW92ZW1lbnQgYmVmb3JlIGFjdGl2YXRpbmdcbiAgICBhY3RpdmF0aW9uQ29uc3RyYWludDoge1xuICAgICAgZGlzdGFuY2U6IDIsXG4gICAgfSxcbiAgfSlcblxuICBjb25zdCB0b3VjaFNlbnNvciA9IHVzZVNlbnNvcihUb3VjaFNlbnNvciwge1xuICAgIC8vIFJlZHVjZSBkZWxheSBmb3IgdG91Y2ggZGV2aWNlc1xuICAgIGFjdGl2YXRpb25Db25zdHJhaW50OiB7XG4gICAgICBkZWxheTogMTAwLFxuICAgICAgdG9sZXJhbmNlOiA1LFxuICAgIH0sXG4gIH0pXG5cbiAgY29uc3Qgc2Vuc29ycyA9IHVzZVNlbnNvcnMobW91c2VTZW5zb3IsIHRvdWNoU2Vuc29yKVxuXG4gIGNvbnN0IGhhbmRsZURyYWdTdGFydCA9IChldmVudDogRHJhZ1N0YXJ0RXZlbnQpID0+IHtcbiAgICBjb25zdCB7IGFjdGl2ZSB9ID0gZXZlbnRcblxuICAgIC8vIFNldCB0aGUgYWN0aXZlIGV2ZW50IGJhc2VkIG9uIHRoZSBldmVudCBkYXRhXG4gICAgaWYgKGFjdGl2ZS5kYXRhLmN1cnJlbnQ/LnR5cGUgPT09ICdjYWxlbmRhci1ldmVudCcpIHtcbiAgICAgIHNldEFjdGl2ZUV2ZW50KGFjdGl2ZS5kYXRhLmN1cnJlbnQuZXZlbnQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlRHJhZ0VuZCA9IChldmVudDogRHJhZ0VuZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBhY3RpdmUsIG92ZXIgfSA9IGV2ZW50XG5cbiAgICBpZiAoIWFjdGl2ZSB8fCAhb3ZlciB8fCAhYWN0aXZlRXZlbnQpIHtcbiAgICAgIHNldEFjdGl2ZUV2ZW50KG51bGwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAob3Zlci5kYXRhLmN1cnJlbnQ/LnR5cGUgPT09ICd0aW1lLWNlbGwnKSB7XG4gICAgICBjb25zdCB7IGRhdGUsIGhvdXIgPSAwLCBtaW51dGUgPSAwIH0gPSBvdmVyLmRhdGEuY3VycmVudFxuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGV2ZW50IGR1cmF0aW9uIGluIG1pbnV0ZXNcbiAgICAgIGNvbnN0IG9yaWdpbmFsU3RhcnQgPSBhY3RpdmVFdmVudC5vcmlnaW5hbFN0YXJ0ID8/IGFjdGl2ZUV2ZW50LnN0YXJ0XG4gICAgICBjb25zdCBvcmlnaW5hbEVuZCA9IGFjdGl2ZUV2ZW50Lm9yaWdpbmFsRW5kID8/IGFjdGl2ZUV2ZW50LmVuZFxuICAgICAgY29uc3QgZHVyYXRpb25NaW51dGVzID0gb3JpZ2luYWxFbmQuZGlmZihvcmlnaW5hbFN0YXJ0LCAnbWludXRlJylcblxuICAgICAgLy8gQ3JlYXRlIG5ldyBzdGFydCB0aW1lIGJhc2VkIG9uIHRoZSBkcm9wIHRhcmdldFxuICAgICAgY29uc3QgbmV3U3RhcnQgPSBkYXlqcyhkYXRlKVxuICAgICAgICAuaG91cihob3VyKVxuICAgICAgICAubWludXRlKG1pbnV0ZSB8fCAwKVxuXG4gICAgICAvLyBDcmVhdGUgbmV3IGVuZCB0aW1lIGJ5IGFkZGluZyB0aGUgb3JpZ2luYWwgZHVyYXRpb25cbiAgICAgIGxldCBuZXdFbmQgPSBuZXdTdGFydC5hZGQoZHVyYXRpb25NaW51dGVzLCAnbWludXRlJylcbiAgICAgIGlmIChuZXdFbmQuaXNTYW1lKG5ld0VuZC5zdGFydE9mKCdkYXknKSkpIHtcbiAgICAgICAgLy8gSWYgdGhlIG5ldyBlbmQgdGltZSBpcyBhdCBtaWRuaWdodCwgc2V0IGl0IHRvIDI0IGhvdXJzIG9mIHBhcnRpYWwgZGF5XG4gICAgICAgIG5ld0VuZCA9IG5ld0VuZC5zdWJ0cmFjdCgxLCAnZGF5JykuZW5kT2YoJ2RheScpXG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZXZlbnQgd2l0aCBuZXcgdGltZXNcbiAgICAgIHVwZGF0ZUV2ZW50KGFjdGl2ZUV2ZW50LmlkLCB7XG4gICAgICAgIHN0YXJ0OiBuZXdTdGFydCxcbiAgICAgICAgZW5kOiBuZXdFbmQsXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAob3Zlci5kYXRhLmN1cnJlbnQ/LnR5cGUgPT09ICdkYXktY2VsbCcpIHtcbiAgICAgIGNvbnN0IHsgZGF0ZSB9ID0gb3Zlci5kYXRhLmN1cnJlbnRcbiAgICAgIGNvbnN0IG5ld0RhdGUgPSBkYXlqcyhkYXRlKVxuXG4gICAgICAvLyBGb3IgbXVsdGktZGF5IGV2ZW50cywgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgZHVyYXRpb24gaW4gZGF5c1xuICAgICAgY29uc3QgaXNNdWx0aURheUV2ZW50ID0gIWFjdGl2ZUV2ZW50LnN0YXJ0LmlzU2FtZShhY3RpdmVFdmVudC5lbmQsICdkYXknKVxuICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydCA9IGFjdGl2ZUV2ZW50Lm9yaWdpbmFsU3RhcnQgPz8gYWN0aXZlRXZlbnQuc3RhcnRcbiAgICAgIGNvbnN0IG9yaWdpbmFsRW5kID0gYWN0aXZlRXZlbnQub3JpZ2luYWxFbmQgPz8gYWN0aXZlRXZlbnQuZW5kXG5cbiAgICAgIGlmIChpc011bHRpRGF5RXZlbnQpIHtcbiAgICAgICAgaWYgKHZpZXcgPT09ICd3ZWVrJykge1xuICAgICAgICAgIC8vIEdldCB0aW1lIGNvbXBvbmVudHMgdG8gcHJlc2VydmVcbiAgICAgICAgICBjb25zdCBzdGFydEhvdXIgPSBvcmlnaW5hbFN0YXJ0LmhvdXIoKVxuICAgICAgICAgIGNvbnN0IHN0YXJ0TWludXRlID0gb3JpZ2luYWxTdGFydC5taW51dGUoKVxuICAgICAgICAgIGNvbnN0IGVuZEhvdXIgPSBvcmlnaW5hbEVuZC5ob3VyKClcbiAgICAgICAgICBjb25zdCBlbmRNaW51dGUgPSBvcmlnaW5hbEVuZC5taW51dGUoKVxuXG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIGR1cmF0aW9uIGluIGRheXMgdG8gcHJlc2VydmVcbiAgICAgICAgICBjb25zdCBkdXJhdGlvbkRheXMgPSBvcmlnaW5hbEVuZC5kaWZmKG9yaWdpbmFsU3RhcnQsICdkYXknKVxuXG4gICAgICAgICAgLy8gQ3JlYXRlIG5ldyBzdGFydCBhbmQgZW5kIGRhdGVzXG4gICAgICAgICAgY29uc3QgbmV3U3RhcnQgPSBuZXdEYXRlXG4gICAgICAgICAgICAuc3RhcnRPZignZGF5JylcbiAgICAgICAgICAgIC5ob3VyKHN0YXJ0SG91cilcbiAgICAgICAgICAgIC5taW51dGUoc3RhcnRNaW51dGUpXG4gICAgICAgICAgY29uc3QgbmV3RW5kID0gbmV3U3RhcnRcbiAgICAgICAgICAgIC5hZGQoZHVyYXRpb25EYXlzLCAnZGF5JylcbiAgICAgICAgICAgIC5ob3VyKGVuZEhvdXIpXG4gICAgICAgICAgICAubWludXRlKGVuZE1pbnV0ZSlcblxuICAgICAgICAgIHVwZGF0ZUV2ZW50KGFjdGl2ZUV2ZW50LmlkLCB7XG4gICAgICAgICAgICBzdGFydDogbmV3U3RhcnQsXG4gICAgICAgICAgICBlbmQ6IG5ld0VuZCxcbiAgICAgICAgICAgIG9yaWdpbmFsU3RhcnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9yaWdpbmFsRW5kOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3Igb3RoZXIgdmlld3MgbGlrZSBtb250aCB2aWV3XG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkYXRlIHNoaWZ0IChob3cgbWFueSBkYXlzIHdlJ3JlIG1vdmluZyB0aGUgZXZlbnQpXG4gICAgICAgICAgY29uc3QgZGF5c0RpZmZlcmVuY2UgPSBuZXdEYXRlLmRpZmYoXG4gICAgICAgICAgICBvcmlnaW5hbFN0YXJ0LnN0YXJ0T2YoJ2RheScpLFxuICAgICAgICAgICAgJ2RheSdcbiAgICAgICAgICApXG5cbiAgICAgICAgICAvLyBDYWxjdWxhdGUgbmV3IHN0YXJ0IGFuZCBlbmQgd2hpbGUgcHJlc2VydmluZyB0aW1lIGNvbXBvbmVudHNcbiAgICAgICAgICBjb25zdCBuZXdTdGFydCA9IG9yaWdpbmFsU3RhcnQuYWRkKGRheXNEaWZmZXJlbmNlLCAnZGF5JylcbiAgICAgICAgICBjb25zdCBuZXdFbmQgPSBvcmlnaW5hbEVuZC5hZGQoZGF5c0RpZmZlcmVuY2UsICdkYXknKVxuXG4gICAgICAgICAgdXBkYXRlRXZlbnQoYWN0aXZlRXZlbnQuaWQsIHtcbiAgICAgICAgICAgIHN0YXJ0OiBuZXdTdGFydCxcbiAgICAgICAgICAgIGVuZDogbmV3RW5kLFxuICAgICAgICAgICAgb3JpZ2luYWxTdGFydDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3JpZ2luYWxFbmQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3Igc2luZ2xlLWRheSBldmVudHMsIG1haW50YWluIHRoZSB0aW1lIGJ1dCBjaGFuZ2UgdGhlIGRhdGVcbiAgICAgICAgY29uc3QgbmV3U3RhcnQgPSBuZXdEYXRlXG4gICAgICAgICAgLmhvdXIoYWN0aXZlRXZlbnQuc3RhcnQuaG91cigpKVxuICAgICAgICAgIC5taW51dGUoYWN0aXZlRXZlbnQuc3RhcnQubWludXRlKCkpXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGV2ZW50IGR1cmF0aW9uIGFuZCBzZXQgbmV3IGVuZCB0aW1lXG4gICAgICAgIGNvbnN0IGR1cmF0aW9uTWludXRlcyA9IGFjdGl2ZUV2ZW50LmVuZC5kaWZmKFxuICAgICAgICAgIGFjdGl2ZUV2ZW50LnN0YXJ0LFxuICAgICAgICAgICdtaW51dGUnXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgbmV3RW5kID0gbmV3U3RhcnQuYWRkKGR1cmF0aW9uTWludXRlcywgJ21pbnV0ZScpXG5cbiAgICAgICAgdXBkYXRlRXZlbnQoYWN0aXZlRXZlbnQuaWQsIHtcbiAgICAgICAgICBzdGFydDogbmV3U3RhcnQsXG4gICAgICAgICAgZW5kOiBuZXdFbmQsXG4gICAgICAgICAgb3JpZ2luYWxTdGFydDogdW5kZWZpbmVkLFxuICAgICAgICAgIG9yaWdpbmFsRW5kOiB1bmRlZmluZWQsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0QWN0aXZlRXZlbnQobnVsbClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURyYWdDYW5jZWwgPSAoX2V2ZW50OiBEcmFnQ2FuY2VsRXZlbnQpID0+IHtcbiAgICBzZXRBY3RpdmVFdmVudChudWxsKVxuICB9XG5cbiAgLy8gSWYgZHJhZyBhbmQgZHJvcCBpcyBkaXNhYmxlZCwganVzdCByZXR1cm4gY2hpbGRyZW4gd2l0aG91dCBEbmRDb250ZXh0XG4gIGlmIChkaXNhYmxlRHJhZ0FuZERyb3ApIHtcbiAgICByZXR1cm4gY2hpbGRyZW4gYXMgUmVhY3QuUmVhY3RFbGVtZW50XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxEbmRDb250ZXh0XG4gICAgICBzZW5zb3JzPXtzZW5zb3JzfVxuICAgICAgb25EcmFnU3RhcnQ9e2hhbmRsZURyYWdTdGFydH1cbiAgICAgIG9uRHJhZ0VuZD17aGFuZGxlRHJhZ0VuZH1cbiAgICAgIG9uRHJhZ0NhbmNlbD17aGFuZGxlRHJhZ0NhbmNlbH1cbiAgICAgIGNvbGxpc2lvbkRldGVjdGlvbj17cG9pbnRlcldpdGhpbn1cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICA8RHJhZ092ZXJsYXkgbW9kaWZpZXJzPXtbc25hcENlbnRlclRvQ3Vyc29yXX0+XG4gICAgICAgIHthY3RpdmVFdmVudCAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ2N1cnNvci1ncmFiIHRydW5jYXRlIHJvdW5kZWQgYmctYW1iZXItMjAwIHAtMiB0ZXh0LVsxMHB4XSBzaGFkb3ctbGcgc206dGV4dC14cycsXG4gICAgICAgICAgICAgIGFjdGl2ZUV2ZW50LmJhY2tncm91bmRDb2xvciB8fCAnYmctYmx1ZS01MDAnLFxuICAgICAgICAgICAgICBhY3RpdmVFdmVudC5jb2xvciB8fCAndGV4dC13aGl0ZSdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2FjdGl2ZUV2ZW50Py50aXRsZX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvRHJhZ092ZXJsYXk+XG4gICAgPC9EbmRDb250ZXh0PlxuICApXG59XG4iLAogICAgImltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgUmVhY3QsIHtcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlU3RhdGUsXG4gIHR5cGUgUmVhY3ROb2RlLFxufSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IENhbGVuZGFyQ29udGV4dCB9IGZyb20gJy4vY29udGV4dCdcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcblxuaW50ZXJmYWNlIENhbGVuZGFyUHJvdmlkZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGVcbiAgZXZlbnRzPzogQ2FsZW5kYXJFdmVudFtdXG4gIGZpcnN0RGF5T2ZXZWVrPzogbnVtYmVyIC8vIDAgZm9yIFN1bmRheSwgMSBmb3IgTW9uZGF5LCBldGMuXG4gIHJlbmRlckV2ZW50PzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBSZWFjdE5vZGVcbiAgb25FdmVudENsaWNrPzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIG9uQ2VsbENsaWNrPzogKHN0YXJ0RGF0ZTogZGF5anMuRGF5anMsIGVuZERhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIG9uVmlld0NoYW5nZT86ICh2aWV3OiAnbW9udGgnIHwgJ3dlZWsnIHwgJ2RheScgfCAneWVhcicpID0+IHZvaWRcbiAgbG9jYWxlPzogc3RyaW5nXG4gIHRpbWV6b25lPzogc3RyaW5nXG4gIGRpc2FibGVDZWxsQ2xpY2s/OiBib29sZWFuXG4gIGRpc2FibGVFdmVudENsaWNrPzogYm9vbGVhblxuICBkaXNhYmxlRHJhZ0FuZERyb3A/OiBib29sZWFuXG4gIGRheU1heEV2ZW50czogbnVtYmVyXG4gIHN0aWNreVZpZXdIZWFkZXI6IGJvb2xlYW5cbiAgdmlld0hlYWRlckNsYXNzTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBDYWxlbmRhclByb3ZpZGVyOiBSZWFjdC5GQzxDYWxlbmRhclByb3ZpZGVyUHJvcHM+ID0gKHtcbiAgY2hpbGRyZW4sXG4gIGV2ZW50cyA9IFtdLFxuICBmaXJzdERheU9mV2VlayA9IDAsIC8vIERlZmF1bHQgdG8gU3VuZGF5LFxuICByZW5kZXJFdmVudCxcbiAgb25FdmVudENsaWNrLFxuICBvbkNlbGxDbGljayxcbiAgb25WaWV3Q2hhbmdlLFxuICBsb2NhbGUsXG4gIHRpbWV6b25lLFxuICBkaXNhYmxlQ2VsbENsaWNrLFxuICBkaXNhYmxlRXZlbnRDbGljayxcbiAgZGlzYWJsZURyYWdBbmREcm9wLFxuICBkYXlNYXhFdmVudHMsXG4gIHN0aWNreVZpZXdIZWFkZXIsXG4gIHZpZXdIZWFkZXJDbGFzc05hbWUsXG59KSA9PiB7XG4gIC8vIFN0YXRlXG4gIGNvbnN0IFtjdXJyZW50RGF0ZSwgc2V0Q3VycmVudERhdGVdID0gdXNlU3RhdGU8ZGF5anMuRGF5anM+KGRheWpzKCkpXG4gIGNvbnN0IFt2aWV3LCBzZXRWaWV3XSA9IHVzZVN0YXRlPCdtb250aCcgfCAnd2VlaycgfCAnZGF5JyB8ICd5ZWFyJz4oJ21vbnRoJylcbiAgY29uc3QgW2N1cnJlbnRFdmVudHMsIHNldEN1cnJlbnRFdmVudHNdID0gdXNlU3RhdGU8Q2FsZW5kYXJFdmVudFtdPihldmVudHMpXG4gIGNvbnN0IFtpc0V2ZW50Rm9ybU9wZW4sIHNldElzRXZlbnRGb3JtT3Blbl0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSlcbiAgY29uc3QgW3NlbGVjdGVkRXZlbnQsIHNldFNlbGVjdGVkRXZlbnRdID0gdXNlU3RhdGU8Q2FsZW5kYXJFdmVudCB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtzZWxlY3RlZERhdGUsIHNldFNlbGVjdGVkRGF0ZV0gPSB1c2VTdGF0ZTxkYXlqcy5EYXlqcyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtjdXJyZW50TG9jYWxlLCBzZXRDdXJyZW50TG9jYWxlXSA9IHVzZVN0YXRlPHN0cmluZz4obG9jYWxlIHx8ICdlbicpXG4gIGNvbnN0IFtjdXJyZW50VGltZXpvbmUsIHNldEN1cnJlbnRUaW1lem9uZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KHRpbWV6b25lIHx8ICcnKVxuXG4gIC8vIFVwZGF0ZSBldmVudHMgd2hlbiBldmVudHMgcHJvcCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGV2ZW50cykge1xuICAgICAgc2V0Q3VycmVudEV2ZW50cyhldmVudHMpXG4gICAgfVxuICB9LCBbZXZlbnRzXSlcblxuICAvLyBDb25maWd1cmUgbG9jYWxlIHdoZW4gbG9jYWxlIHByb3AgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsb2NhbGUpIHtcbiAgICAgIHNldEN1cnJlbnRMb2NhbGUobG9jYWxlKVxuICAgICAgZGF5anMubG9jYWxlKGxvY2FsZSlcbiAgICB9XG4gIH0sIFtsb2NhbGVdKVxuXG4gIC8vIENvbmZpZ3VyZSB0aW1lem9uZSBmb3IgY3VycmVudERhdGUgd2hlbiB0aW1lem9uZSBwcm9wIGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodGltZXpvbmUpIHtcbiAgICAgIHNldEN1cnJlbnRUaW1lem9uZSh0aW1lem9uZSlcbiAgICAgIGRheWpzLnR6LnNldERlZmF1bHQodGltZXpvbmUpXG4gICAgfVxuICB9LCBbdGltZXpvbmVdKVxuXG4gIC8vIEhhbmRsZXJzXG4gIGNvbnN0IHNlbGVjdERhdGUgPSB1c2VDYWxsYmFjaygoZGF0ZTogZGF5anMuRGF5anMpID0+IHtcbiAgICBzZXRDdXJyZW50RGF0ZShkYXRlKVxuICB9LCBbXSlcblxuICBjb25zdCBuZXh0UGVyaW9kID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHN3aXRjaCAodmlldykge1xuICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLmFkZCgxLCAnbW9udGgnKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLmFkZCgxLCAnd2VlaycpKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgc2V0Q3VycmVudERhdGUoKGN1cnJlbnREYXRlKSA9PiBjdXJyZW50RGF0ZS5hZGQoMSwgJ2RheScpKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIHNldEN1cnJlbnREYXRlKChjdXJyZW50RGF0ZSkgPT4gY3VycmVudERhdGUuYWRkKDEsICd5ZWFyJykpXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9LCBbdmlld10pXG5cbiAgY29uc3QgcHJldlBlcmlvZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzd2l0Y2ggKHZpZXcpIHtcbiAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgc2V0Q3VycmVudERhdGUoKGN1cnJlbnREYXRlKSA9PiBjdXJyZW50RGF0ZS5zdWJ0cmFjdCgxLCAnbW9udGgnKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLnN1YnRyYWN0KDEsICd3ZWVrJykpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdkYXknOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLnN1YnRyYWN0KDEsICdkYXknKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLnN1YnRyYWN0KDEsICd5ZWFyJykpXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9LCBbdmlld10pXG5cbiAgY29uc3QgdG9kYXkgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0Q3VycmVudERhdGUoZGF5anMoKSlcbiAgfSwgW10pXG5cbiAgY29uc3QgYWRkRXZlbnQgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHtcbiAgICBzZXRDdXJyZW50RXZlbnRzKChwcmV2RXZlbnRzKSA9PiBbLi4ucHJldkV2ZW50cywgZXZlbnRdKVxuICB9LCBbXSlcblxuICBjb25zdCB1cGRhdGVFdmVudCA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudElkOiBzdHJpbmcsIHVwZGF0ZWRFdmVudDogUGFydGlhbDxDYWxlbmRhckV2ZW50PikgPT4ge1xuICAgICAgc2V0Q3VycmVudEV2ZW50cygocHJldkV2ZW50cykgPT5cbiAgICAgICAgcHJldkV2ZW50cy5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgIGV2ZW50LmlkID09PSBldmVudElkID8geyAuLi5ldmVudCwgLi4udXBkYXRlZEV2ZW50IH0gOiBldmVudFxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcbiAgICBbXVxuICApXG5cbiAgY29uc3QgZGVsZXRlRXZlbnQgPSB1c2VDYWxsYmFjaygoZXZlbnRJZDogc3RyaW5nKSA9PiB7XG4gICAgc2V0Q3VycmVudEV2ZW50cygocHJldkV2ZW50cykgPT5cbiAgICAgIHByZXZFdmVudHMuZmlsdGVyKChldmVudCkgPT4gZXZlbnQuaWQgIT09IGV2ZW50SWQpXG4gICAgKVxuICB9LCBbXSlcblxuICBjb25zdCBlZGl0RXZlbnQgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHtcbiAgICBzZXRTZWxlY3RlZEV2ZW50KGV2ZW50KVxuICAgIHNldElzRXZlbnRGb3JtT3Blbih0cnVlKVxuICB9LCBbXSlcblxuICBjb25zdCBjbG9zZUV2ZW50Rm9ybSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTZWxlY3RlZERhdGUobnVsbClcbiAgICBzZXRTZWxlY3RlZEV2ZW50KG51bGwpXG4gICAgc2V0SXNFdmVudEZvcm1PcGVuKGZhbHNlKVxuICB9LCBbXSlcblxuICAvLyBDdXN0b20gaGFuZGxlcnMgdGhhdCBjYWxsIGV4dGVybmFsIGNhbGxiYWNrc1xuICBjb25zdCBoYW5kbGVWaWV3Q2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld1ZpZXc6ICdtb250aCcgfCAnd2VlaycgfCAnZGF5JyB8ICd5ZWFyJykgPT4ge1xuICAgICAgc2V0VmlldyhuZXdWaWV3KVxuICAgICAgb25WaWV3Q2hhbmdlPy4obmV3VmlldylcbiAgICB9LFxuICAgIFtvblZpZXdDaGFuZ2VdXG4gIClcblxuICBjb25zdCBoYW5kbGVFdmVudENsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgICBpZiAoZGlzYWJsZUNlbGxDbGljaykgcmV0dXJuXG4gICAgICBpZiAob25FdmVudENsaWNrKSB7XG4gICAgICAgIG9uRXZlbnRDbGljayhldmVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkaXRFdmVudChldmVudClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtkaXNhYmxlQ2VsbENsaWNrLCBvbkV2ZW50Q2xpY2ssIGVkaXRFdmVudF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZURhdGVDbGljayA9IHVzZUNhbGxiYWNrKFxuICAgIChzdGFydERhdGU6IGRheWpzLkRheWpzLCBlbmREYXRlOiBkYXlqcy5EYXlqcykgPT4ge1xuICAgICAgaWYgKGRpc2FibGVDZWxsQ2xpY2spIHJldHVyblxuXG4gICAgICBpZiAob25DZWxsQ2xpY2spIHtcbiAgICAgICAgb25DZWxsQ2xpY2soc3RhcnREYXRlLCBlbmREYXRlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0U2VsZWN0ZWREYXRlKHN0YXJ0RGF0ZSlcbiAgICAgICAgc2V0U2VsZWN0ZWRFdmVudCh7XG4gICAgICAgICAgdGl0bGU6IGBOZXcgRXZlbnRgLFxuICAgICAgICAgIHN0YXJ0OiBzdGFydERhdGUsXG4gICAgICAgICAgZW5kOiBlbmREYXRlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICBhbGxEYXk6IGZhbHNlLFxuICAgICAgICAgIGlzUmVjdXJyaW5nOiBmYWxzZSxcbiAgICAgICAgICByZWN1cnJlbmNlOiBudWxsLFxuICAgICAgICAgIHBhcmVudEV2ZW50SWQ6IG51bGwsXG4gICAgICAgIH0gYXMgQ2FsZW5kYXJFdmVudClcbiAgICAgICAgc2V0SXNFdmVudEZvcm1PcGVuKHRydWUpXG4gICAgICB9XG4gICAgfSxcbiAgICBbb25DZWxsQ2xpY2ssIGRpc2FibGVDZWxsQ2xpY2tdXG4gIClcblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBuZXh0IG9jY3VycmVuY2UgYmFzZWQgb24gZnJlcXVlbmN5XG4gIGNvbnN0IGdldE5leHRPY2N1cnJlbmNlID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZGF0ZTogZGF5anMuRGF5anMsXG4gICAgICBmcmVxOiAnZGFpbHknIHwgJ3dlZWtseScgfCAnbW9udGhseScgfCAneWVhcmx5JyxcbiAgICAgIGludDogbnVtYmVyLFxuICAgICAgZGF5cz86IG51bWJlcltdXG4gICAgKTogZGF5anMuRGF5anMgPT4ge1xuICAgICAgc3dpdGNoIChmcmVxKSB7XG4gICAgICAgIGNhc2UgJ2RhaWx5JzpcbiAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnZGF5JylcbiAgICAgICAgY2FzZSAnd2Vla2x5JzpcbiAgICAgICAgICBpZiAoZGF5cyAmJiBkYXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc3BlY2lmaWMgZGF5cyBvZiB0aGUgd2VlaywgZmluZCB0aGUgbmV4dCBkYXkgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgIGxldCBuZXh0RGF0ZSA9IGRhdGUuYWRkKDEsICdkYXknKVxuICAgICAgICAgICAgbGV0IGxvb3BDb3VudCA9IDBcblxuICAgICAgICAgICAgLy8gUHJldmVudCBpbmZpbml0ZSBsb29wIC0gbWF4aW11bSA3IGl0ZXJhdGlvbnMgdG8gZmluZCB0aGUgbmV4dCBkYXlcbiAgICAgICAgICAgIHdoaWxlIChsb29wQ291bnQgPCA3KSB7XG4gICAgICAgICAgICAgIGlmIChkYXlzLmluY2x1ZGVzKG5leHREYXRlLmRheSgpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0RGF0ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5leHREYXRlID0gbmV4dERhdGUuYWRkKDEsICdkYXknKVxuICAgICAgICAgICAgICBsb29wQ291bnQrK1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBuZXh0IGRheSwganVzdCBhZGQgdGhlIGludGVydmFsIHdlZWtzXG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnd2VlaycpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwganVzdCBhZGQgdGhlIGludGVydmFsIHdlZWtzXG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnd2VlaycpXG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdtb250aGx5JzpcbiAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnbW9udGgnKVxuICAgICAgICBjYXNlICd5ZWFybHknOlxuICAgICAgICAgIHJldHVybiBkYXRlLmFkZChpbnQsICd5ZWFyJylcbiAgICAgIH1cbiAgICB9LFxuICAgIFtdXG4gIClcblxuICAvLyBFeHBhbmQgcmVjdXJyaW5nIGV2ZW50cyBmb3IgYSBkYXRlIHJhbmdlXG4gIGNvbnN0IGV4cGFuZFJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgYmFzZUV2ZW50OiBDYWxlbmRhckV2ZW50LFxuICAgICAgc3RhcnREYXRlOiBkYXlqcy5EYXlqcyxcbiAgICAgIGVuZERhdGU6IGRheWpzLkRheWpzXG4gICAgKTogQ2FsZW5kYXJFdmVudFtdID0+IHtcbiAgICAgIGNvbnN0IGV4cGFuZGVkRXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBbXVxuICAgICAgaWYgKCFiYXNlRXZlbnQucmVjdXJyZW5jZSkgcmV0dXJuIFtiYXNlRXZlbnRdXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZnJlcXVlbmN5LFxuICAgICAgICBpbnRlcnZhbCxcbiAgICAgICAgZW5kRGF0ZTogcmVjdXJyZW5jZUVuZERhdGUsXG4gICAgICAgIGNvdW50LFxuICAgICAgICBkYXlzT2ZXZWVrLFxuICAgICAgICBleGNlcHRpb25zID0gW10sXG4gICAgICB9ID0gYmFzZUV2ZW50LnJlY3VycmVuY2VcblxuICAgICAgLy8gR2V0IGV4aXN0aW5nIGV4Y2VwdGlvbnMgZnJvbSB0aGUgZXZlbnRzIGFycmF5XG4gICAgICBjb25zdCBleGlzdGluZ0V4Y2VwdGlvbnMgPSBldmVudHMuZmlsdGVyKFxuICAgICAgICAoZXZlbnQpID0+IGV2ZW50LnBhcmVudEV2ZW50SWQgPT09IGJhc2VFdmVudC5pZCAmJiBldmVudC5pc0V4Y2VwdGlvblxuICAgICAgKVxuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGR1cmF0aW9uIG9mIHRoZSBldmVudFxuICAgICAgY29uc3QgZHVyYXRpb24gPSBiYXNlRXZlbnQuZW5kLmRpZmYoYmFzZUV2ZW50LnN0YXJ0LCAnbWludXRlJylcblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIGVuZCBkYXRlIGZvciByZWN1cnJlbmNlXG4gICAgICBjb25zdCBtYXhFbmREYXRlID1cbiAgICAgICAgcmVjdXJyZW5jZUVuZERhdGUgJiYgcmVjdXJyZW5jZUVuZERhdGUuaXNCZWZvcmUoZW5kRGF0ZSlcbiAgICAgICAgICA/IHJlY3VycmVuY2VFbmREYXRlXG4gICAgICAgICAgOiBlbmREYXRlXG5cbiAgICAgIGxldCBjdXJyZW50RGF0ZSA9IGJhc2VFdmVudC5zdGFydC5jbG9uZSgpXG4gICAgICBsZXQgb2NjdXJyZW5jZXMgPSAwXG5cbiAgICAgIC8vIElmIHRoZSByZWN1cnJpbmcgZXZlbnQgc3RhcnRzIGFmdGVyIHRoZSBlbmQgb2Ygb3VyIHJhbmdlLCBubyBldmVudHMgdG8gZ2VuZXJhdGVcbiAgICAgIGlmIChjdXJyZW50RGF0ZS5pc0FmdGVyKG1heEVuZERhdGUpKSB7XG4gICAgICAgIHJldHVybiBbXVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSBuZWVkIHRvIHN0YXJ0IGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnJlbmNlIHBhdHRlcm4sXG4gICAgICAvLyBmYXN0LWZvcndhcmQgdG8gZmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiBvdXIgZGF0ZSByYW5nZVxuICAgICAgaWYgKGN1cnJlbnREYXRlLmlzQmVmb3JlKHN0YXJ0RGF0ZSkpIHtcbiAgICAgICAgc3dpdGNoIChmcmVxdWVuY3kpIHtcbiAgICAgICAgICBjYXNlICdkYWlseSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGRheXNUb0FkZCA9XG4gICAgICAgICAgICAgIE1hdGguZmxvb3Ioc3RhcnREYXRlLmRpZmYoY3VycmVudERhdGUsICdkYXknKSAvIGludGVydmFsKSAqXG4gICAgICAgICAgICAgIGludGVydmFsXG4gICAgICAgICAgICBpZiAoZGF5c1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlLmFkZChkYXlzVG9BZGQsICdkYXknKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnd2Vla2x5Jzoge1xuICAgICAgICAgICAgaWYgKCFkYXlzT2ZXZWVrIHx8IGRheXNPZldlZWsubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHdlZWtzVG9BZGQgPVxuICAgICAgICAgICAgICAgIE1hdGguZmxvb3Ioc3RhcnREYXRlLmRpZmYoY3VycmVudERhdGUsICd3ZWVrJykgLyBpbnRlcnZhbCkgKlxuICAgICAgICAgICAgICAgIGludGVydmFsXG4gICAgICAgICAgICAgIGlmICh3ZWVrc1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGUuYWRkKHdlZWtzVG9BZGQsICd3ZWVrJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnbW9udGhseSc6IHtcbiAgICAgICAgICAgIGNvbnN0IG1vbnRoc1RvQWRkID1cbiAgICAgICAgICAgICAgTWF0aC5mbG9vcihzdGFydERhdGUuZGlmZihjdXJyZW50RGF0ZSwgJ21vbnRoJykgLyBpbnRlcnZhbCkgKlxuICAgICAgICAgICAgICBpbnRlcnZhbFxuICAgICAgICAgICAgaWYgKG1vbnRoc1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlLmFkZChtb250aHNUb0FkZCwgJ21vbnRoJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3llYXJseSc6IHtcbiAgICAgICAgICAgIGNvbnN0IHllYXJzVG9BZGQgPVxuICAgICAgICAgICAgICBNYXRoLmZsb29yKHN0YXJ0RGF0ZS5kaWZmKGN1cnJlbnREYXRlLCAneWVhcicpIC8gaW50ZXJ2YWwpICpcbiAgICAgICAgICAgICAgaW50ZXJ2YWxcbiAgICAgICAgICAgIGlmICh5ZWFyc1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlLmFkZCh5ZWFyc1RvQWRkLCAneWVhcicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoXG4gICAgICAgIChjdXJyZW50RGF0ZS5pc0JlZm9yZShtYXhFbmREYXRlKSB8fFxuICAgICAgICAgIGN1cnJlbnREYXRlLmlzU2FtZShtYXhFbmREYXRlLCAnZGF5JykpICYmXG4gICAgICAgIChjb3VudCA9PT0gdW5kZWZpbmVkIHx8IG9jY3VycmVuY2VzIDwgY291bnQpXG4gICAgICApIHtcbiAgICAgICAgLy8gRm9ybWF0IGN1cnJlbnQgZGF0ZSBmb3IgY29tcGFyaXNvblxuICAgICAgICBjb25zdCBjdXJyZW50RGF0ZVN0ciA9IGN1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG5cbiAgICAgICAgLy8gU2tpcCBpZiB0aGlzIGRhdGUgaXMgaW4gZXhjZXB0aW9uc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXhjZXB0aW9ucy5zb21lKFxuICAgICAgICAgICAgKGRhdGUpID0+IGRhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykgPT09IGN1cnJlbnREYXRlU3RyXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IG9jY3VycmVuY2VcbiAgICAgICAgICBjdXJyZW50RGF0ZSA9IGdldE5leHRPY2N1cnJlbmNlKFxuICAgICAgICAgICAgY3VycmVudERhdGUsXG4gICAgICAgICAgICBmcmVxdWVuY3ksXG4gICAgICAgICAgICBpbnRlcnZhbCxcbiAgICAgICAgICAgIGRheXNPZldlZWtcbiAgICAgICAgICApXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgaWYgaXQncyBhIHdlZWtseSByZWN1cnJlbmNlIHdpdGggc3BlY2lmaWVkIGRheXMgYW5kIGN1cnJlbnQgZGF5IGlzIG5vdCBpbmNsdWRlZFxuICAgICAgICBpZiAoXG4gICAgICAgICAgZnJlcXVlbmN5ID09PSAnd2Vla2x5JyAmJlxuICAgICAgICAgIGRheXNPZldlZWsgJiZcbiAgICAgICAgICBkYXlzT2ZXZWVrLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAhZGF5c09mV2Vlay5pbmNsdWRlcyhjdXJyZW50RGF0ZS5kYXkoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3VycmVudERhdGUgPSBjdXJyZW50RGF0ZS5hZGQoMSwgJ2RheScpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBjdXN0b20gZXhjZXB0aW9uIGZvciB0aGlzIG9jY3VycmVuY2VcbiAgICAgICAgY29uc3QgZXhjZXB0aW9uRXZlbnQgPSBleGlzdGluZ0V4Y2VwdGlvbnMuZmluZChcbiAgICAgICAgICAoZXZlbnQpID0+IGV2ZW50LnN0YXJ0LmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBjdXJyZW50RGF0ZVN0clxuICAgICAgICApXG5cbiAgICAgICAgaWYgKGV4Y2VwdGlvbkV2ZW50KSB7XG4gICAgICAgICAgLy8gVXNlIHRoZSBleGNlcHRpb24gaW5zdGVhZCBvZiBnZW5lcmF0aW5nIGEgbmV3IGV2ZW50XG4gICAgICAgICAgZXhwYW5kZWRFdmVudHMucHVzaChleGNlcHRpb25FdmVudClcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50RGF0ZS5pc0FmdGVyKHN0YXJ0RGF0ZS5zdWJ0cmFjdCgxLCAnZGF5JykpKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IG9jY3VycmVuY2UgaWYgaXQgZmFsbHMgd2l0aGluIHRoZSByZXF1ZXN0ZWQgcmFuZ2VcbiAgICAgICAgICBjb25zdCBldmVudEluc3RhbmNlOiBDYWxlbmRhckV2ZW50ID0ge1xuICAgICAgICAgICAgLi4uYmFzZUV2ZW50LFxuICAgICAgICAgICAgaWQ6IGAke2Jhc2VFdmVudC5pZH0tJHtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVlNTUREJyl9YCxcbiAgICAgICAgICAgIHN0YXJ0OiBjdXJyZW50RGF0ZS5jbG9uZSgpLFxuICAgICAgICAgICAgZW5kOiBjdXJyZW50RGF0ZS5jbG9uZSgpLmFkZChkdXJhdGlvbiwgJ21pbnV0ZScpLFxuICAgICAgICAgICAgaXNSZWN1cnJpbmc6IHRydWUsXG4gICAgICAgICAgICBwYXJlbnRFdmVudElkOiBiYXNlRXZlbnQuaWQsXG4gICAgICAgICAgfVxuICAgICAgICAgIGV4cGFuZGVkRXZlbnRzLnB1c2goZXZlbnRJbnN0YW5jZSlcbiAgICAgICAgfVxuXG4gICAgICAgIG9jY3VycmVuY2VzKytcbiAgICAgICAgY3VycmVudERhdGUgPSBnZXROZXh0T2NjdXJyZW5jZShcbiAgICAgICAgICBjdXJyZW50RGF0ZSxcbiAgICAgICAgICBmcmVxdWVuY3ksXG4gICAgICAgICAgaW50ZXJ2YWwsXG4gICAgICAgICAgZGF5c09mV2Vla1xuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleHBhbmRlZEV2ZW50c1xuICAgIH0sXG4gICAgW2V2ZW50cywgZ2V0TmV4dE9jY3VycmVuY2VdXG4gIClcblxuICAvLyBFdmVudCBxdWVyeSBmdW5jdGlvbnNcbiAgY29uc3QgZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKHN0YXJ0OiBkYXlqcy5EYXlqcywgZW5kOiBkYXlqcy5EYXlqcyk6IENhbGVuZGFyRXZlbnRbXSA9PiB7XG4gICAgICBjb25zdCBzdGFydERhdGUgPSBzdGFydC5zdGFydE9mKCdkYXknKVxuICAgICAgY29uc3QgZW5kRGF0ZSA9IGVuZC5lbmRPZignZGF5JylcblxuICAgICAgLy8gRmlsdGVyIHJlZ3VsYXIgZXZlbnRzIGZpcnN0XG4gICAgICBjb25zdCByZWd1bGFyRXZlbnRzID0gZXZlbnRzLmZpbHRlcigoZXZlbnQpID0+IHtcbiAgICAgICAgLy8gRml4ZWQgbG9naWMgZm9yIGNoZWNraW5nIGlmIGV2ZW50IG92ZXJsYXBzIHdpdGggdGhlIGRhdGUgcmFuZ2VcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvLyBDYXNlIDE6IEV2ZW50IHN0YXJ0cyB3aXRoaW4gdGhlIHJhbmdlXG4gICAgICAgICAgKChldmVudC5zdGFydC5pc0FmdGVyKHN0YXJ0RGF0ZSkgfHwgZXZlbnQuc3RhcnQuaXNTYW1lKHN0YXJ0RGF0ZSkpICYmXG4gICAgICAgICAgICAoZXZlbnQuc3RhcnQuaXNCZWZvcmUoZW5kRGF0ZSkgfHwgZXZlbnQuc3RhcnQuaXNTYW1lKGVuZERhdGUpKSkgfHxcbiAgICAgICAgICAvLyBDYXNlIDI6IEV2ZW50IGVuZHMgd2l0aGluIHRoZSByYW5nZVxuICAgICAgICAgICgoZXZlbnQuZW5kLmlzQWZ0ZXIoc3RhcnREYXRlKSB8fCBldmVudC5lbmQuaXNTYW1lKHN0YXJ0RGF0ZSkpICYmXG4gICAgICAgICAgICAoZXZlbnQuZW5kLmlzQmVmb3JlKGVuZERhdGUpIHx8IGV2ZW50LmVuZC5pc1NhbWUoZW5kRGF0ZSkpKSB8fFxuICAgICAgICAgIC8vIENhc2UgMzogRXZlbnQgc3BhbnMgYWNyb3NzIHRoZSBlbnRpcmUgcmFuZ2VcbiAgICAgICAgICAoZXZlbnQuc3RhcnQuaXNCZWZvcmUoc3RhcnREYXRlKSAmJiBldmVudC5lbmQuaXNBZnRlcihlbmREYXRlKSlcbiAgICAgICAgKVxuICAgICAgfSlcblxuICAgICAgLy8gRmluZCBwYXJlbnQgcmVjdXJyaW5nIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgZXhwYW5kZWRcbiAgICAgIGNvbnN0IHJlY3VycmluZ1BhcmVudEV2ZW50cyA9IGV2ZW50cy5maWx0ZXIoXG4gICAgICAgIChldmVudCkgPT4gZXZlbnQucmVjdXJyZW5jZSAmJiAhZXZlbnQucGFyZW50RXZlbnRJZFxuICAgICAgKVxuXG4gICAgICAvLyBFeHBhbmQgcmVjdXJyaW5nIGV2ZW50cyBmb3IgdGhpcyByYW5nZVxuICAgICAgbGV0IHJlY3VycmluZ0V2ZW50czogQ2FsZW5kYXJFdmVudFtdID0gW11cbiAgICAgIHJlY3VycmluZ1BhcmVudEV2ZW50cy5mb3JFYWNoKChwYXJlbnRFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBleHBhbmRlZCA9IGV4cGFuZFJlY3VycmluZ0V2ZW50KHBhcmVudEV2ZW50LCBzdGFydERhdGUsIGVuZERhdGUpXG4gICAgICAgIHJlY3VycmluZ0V2ZW50cyA9IFsuLi5yZWN1cnJpbmdFdmVudHMsIC4uLmV4cGFuZGVkXVxuICAgICAgfSlcblxuICAgICAgLy8gQ29tYmluZSBhbGwgZXZlbnRzIGFuZCByZW1vdmUgYW55IGR1cGxpY2F0ZXNcbiAgICAgIHJldHVybiBbLi4ucmVndWxhckV2ZW50cywgLi4ucmVjdXJyaW5nRXZlbnRzXS5maWx0ZXIoXG4gICAgICAgIChldmVudCwgaW5kZXgsIHNlbGYpID0+XG4gICAgICAgICAgaW5kZXggPT09IHNlbGYuZmluZEluZGV4KChlKSA9PiBlLmlkID09PSBldmVudC5pZClcbiAgICAgIClcbiAgICB9LFxuICAgIFtldmVudHMsIGV4cGFuZFJlY3VycmluZ0V2ZW50XVxuICApXG5cbiAgY29uc3QgZ2V0RXZlbnRzRm9yRGF0ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChkYXRlOiBkYXlqcy5EYXlqcyk6IENhbGVuZGFyRXZlbnRbXSA9PiB7XG4gICAgICBjb25zdCBkYXkgPSBkYXRlLnN0YXJ0T2YoJ2RheScpXG4gICAgICBjb25zdCBuZXh0RGF5ID0gZGF5LmFkZCgxLCAnZGF5JylcbiAgICAgIHJldHVybiBnZXRFdmVudHNGb3JEYXRlUmFuZ2UoZGF5LCBuZXh0RGF5KVxuICAgIH0sXG4gICAgW2dldEV2ZW50c0ZvckRhdGVSYW5nZV1cbiAgKVxuXG4gIC8vIFJlY3VycmluZyBldmVudCBvcGVyYXRpb25zXG4gIGNvbnN0IGFkZFJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgc2V0Q3VycmVudEV2ZW50cygocHJldkV2ZW50cykgPT4gWy4uLnByZXZFdmVudHMsIGV2ZW50XSlcbiAgfSwgW10pXG5cbiAgY29uc3QgZGVsZXRlUmVjdXJyaW5nRXZlbnQgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnRJZDogc3RyaW5nLCBkZWxldGVBbGw6IGJvb2xlYW4pID0+IHtcbiAgICAgIHNldEN1cnJlbnRFdmVudHMoKHByZXZFdmVudHMpID0+IHtcbiAgICAgICAgLy8gRmluZCB0aGUgZXZlbnQgYnkgSURcbiAgICAgICAgY29uc3QgZXZlbnQgPSBwcmV2RXZlbnRzLmZpbmQoKGUpID0+IGUuaWQgPT09IGV2ZW50SWQpXG4gICAgICAgIGlmICghZXZlbnQpIHJldHVybiBwcmV2RXZlbnRzXG5cbiAgICAgICAgaWYgKGV2ZW50LnBhcmVudEV2ZW50SWQgJiYgIWRlbGV0ZUFsbCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSByZWN1cnJpbmcgaW5zdGFuY2UsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgaW5zdGFuY2VcblxuICAgICAgICAgIC8vIEZpbmQgdGhlIHBhcmVudCBldmVudFxuICAgICAgICAgIGNvbnN0IHBhcmVudEV2ZW50ID0gcHJldkV2ZW50cy5maW5kKFxuICAgICAgICAgICAgKGUpID0+IGUuaWQgPT09IGV2ZW50LnBhcmVudEV2ZW50SWRcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKCFwYXJlbnRFdmVudCB8fCAhcGFyZW50RXZlbnQucmVjdXJyZW5jZSkgcmV0dXJuIHByZXZFdmVudHNcblxuICAgICAgICAgIC8vIEFkZCB0aGlzIGRhdGUgdG8gdGhlIGV4Y2VwdGlvbnMgbGlzdFxuICAgICAgICAgIHJldHVybiBwcmV2RXZlbnRzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50LnBhcmVudEV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5lLFxuICAgICAgICAgICAgICAgIHJlY3VycmVuY2U6IHtcbiAgICAgICAgICAgICAgICAgIC4uLmUucmVjdXJyZW5jZSEsXG4gICAgICAgICAgICAgICAgICBleGNlcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgIC4uLihlLnJlY3VycmVuY2UhLmV4Y2VwdGlvbnMgfHwgW10pLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdGFydC5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnBhcmVudEV2ZW50SWQgJiYgZGVsZXRlQWxsKSB7XG4gICAgICAgICAgLy8gV2Ugd2FudCB0byBkZWxldGUgYWxsIG9jY3VycmVuY2VzIG9mIHRoaXMgcmVjdXJyaW5nIGV2ZW50XG4gICAgICAgICAgLy8gRmluZCB0aGUgcGFyZW50IElEIGFuZCBkZWxldGUgaXQgYW5kIGFsbCBpdHMgY2hpbGRyZW5cbiAgICAgICAgICByZXR1cm4gcHJldkV2ZW50cy5maWx0ZXIoXG4gICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgZS5pZCAhPT0gZXZlbnQucGFyZW50RXZlbnRJZCAmJlxuICAgICAgICAgICAgICBlLnBhcmVudEV2ZW50SWQgIT09IGV2ZW50LnBhcmVudEV2ZW50SWRcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQucmVjdXJyZW5jZSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBwYXJlbnQgcmVjdXJyaW5nIGV2ZW50LCBkZWxldGUgaXQgYW5kIGFsbCBpdHMgaW5zdGFuY2VzXG4gICAgICAgICAgcmV0dXJuIHByZXZFdmVudHMuZmlsdGVyKFxuICAgICAgICAgICAgKGUpID0+IGUuaWQgIT09IGV2ZW50LmlkICYmIGUucGFyZW50RXZlbnRJZCAhPT0gZXZlbnQuaWRcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVndWxhciBldmVudCwganVzdCBkZWxldGUgaXRcbiAgICAgICAgICByZXR1cm4gcHJldkV2ZW50cy5maWx0ZXIoKGUpID0+IGUuaWQgIT09IGV2ZW50LmlkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG4gICAgW11cbiAgKVxuXG4gIGNvbnN0IHVwZGF0ZVJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZXZlbnRJZDogc3RyaW5nLFxuICAgICAgdXBkYXRlZEV2ZW50OiBQYXJ0aWFsPENhbGVuZGFyRXZlbnQ+LFxuICAgICAgdXBkYXRlQWxsOiBib29sZWFuXG4gICAgKSA9PiB7XG4gICAgICBzZXRDdXJyZW50RXZlbnRzKChwcmV2RXZlbnRzKSA9PiB7XG4gICAgICAgIC8vIEZpbmQgdGhlIGV2ZW50IGJ5IElEXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gcHJldkV2ZW50cy5maW5kKChlKSA9PiBlLmlkID09PSBldmVudElkKVxuICAgICAgICBpZiAoIWV2ZW50KSByZXR1cm4gcHJldkV2ZW50c1xuXG4gICAgICAgIGlmIChldmVudC5wYXJlbnRFdmVudElkICYmICF1cGRhdGVBbGwpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVjdXJyaW5nIGluc3RhbmNlIGJlaW5nIHVwZGF0ZWQgaW5kaXZpZHVhbGx5XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYW4gZXhjZXB0aW9uIHdpdGggdGhlIHVwZGF0ZXNcbiAgICAgICAgICBjb25zdCBleGNlcHRpb25FdmVudDogQ2FsZW5kYXJFdmVudCA9IHtcbiAgICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgICAgLi4udXBkYXRlZEV2ZW50LFxuICAgICAgICAgICAgaXNFeGNlcHRpb246IHRydWUsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQWRkIHRoZSBleGNlcHRpb24gdG8gdGhlIHN0b3JlIGFuZCBhZGQgdGhpcyBkYXRlIHRvIHRoZSBwYXJlbnQncyBleGNlcHRpb25zIGxpc3RcbiAgICAgICAgICBjb25zdCB1cGRhdGVkRXZlbnRzID0gcHJldkV2ZW50cy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLmlkID09PSBldmVudC5wYXJlbnRFdmVudElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZSxcbiAgICAgICAgICAgICAgICByZWN1cnJlbmNlOiB7XG4gICAgICAgICAgICAgICAgICAuLi5lLnJlY3VycmVuY2UhLFxuICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAuLi4oZS5yZWN1cnJlbmNlIS5leGNlcHRpb25zIHx8IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RhcnQuc3RhcnRPZignZGF5JyksXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVybiBbLi4udXBkYXRlZEV2ZW50cywgZXhjZXB0aW9uRXZlbnRdXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQucGFyZW50RXZlbnRJZCAmJiB1cGRhdGVBbGwpIHtcbiAgICAgICAgICAvLyBVcGRhdGUgYWxsIG9jY3VycmVuY2VzIGJ5IHVwZGF0aW5nIHRoZSBwYXJlbnRcbiAgICAgICAgICAvLyBGaW5kIHRoZSBwYXJlbnQgYW5kIHVwZGF0ZSBpdFxuICAgICAgICAgIHJldHVybiBwcmV2RXZlbnRzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50LnBhcmVudEV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uZSwgLi4udXBkYXRlZEV2ZW50IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5yZWN1cnJlbmNlKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIHBhcmVudCByZWN1cnJpbmcgZXZlbnQsIHVwZGF0ZSBpdCBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBwcmV2RXZlbnRzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50LmlkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLmUsIC4uLnVwZGF0ZWRFdmVudCB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVndWxhciBldmVudCwganVzdCB1cGRhdGUgaXRcbiAgICAgICAgICByZXR1cm4gcHJldkV2ZW50cy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLmlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi5lLCAuLi51cGRhdGVkRXZlbnQgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG4gICAgW11cbiAgKVxuXG4gIGNvbnN0IGNyZWF0ZUV4Y2VwdGlvbkZvclJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50SWQ6IHN0cmluZywgZGF0ZTogZGF5anMuRGF5anMpID0+IHtcbiAgICAgIHNldEN1cnJlbnRFdmVudHMoKHByZXZFdmVudHMpID0+IHtcbiAgICAgICAgLy8gRmluZCB0aGUgZXZlbnQgZmlyc3RcbiAgICAgICAgY29uc3QgZXZlbnQgPSBwcmV2RXZlbnRzLmZpbmQoKGUpID0+IGUuaWQgPT09IGV2ZW50SWQpXG4gICAgICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LnJlY3VycmVuY2UpIHJldHVybiBwcmV2RXZlbnRzXG5cbiAgICAgICAgLy8gQWRkIHRoZSBkYXRlIHRvIGV4Y2VwdGlvbnNcbiAgICAgICAgcmV0dXJuIHByZXZFdmVudHMubWFwKChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50SWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmUsXG4gICAgICAgICAgICAgIHJlY3VycmVuY2U6IHtcbiAgICAgICAgICAgICAgICAuLi5lLnJlY3VycmVuY2UhLFxuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgIC4uLihlLnJlY3VycmVuY2UhLmV4Y2VwdGlvbnMgfHwgW10pLFxuICAgICAgICAgICAgICAgICAgZGF0ZS5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LFxuICAgIFtdXG4gIClcblxuICAvLyBDcmVhdGUgdGhlIGNvbnRleHQgdmFsdWVcbiAgY29uc3QgY29udGV4dFZhbHVlID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgY3VycmVudERhdGUsXG4gICAgICB2aWV3LFxuICAgICAgZXZlbnRzOiBjdXJyZW50RXZlbnRzLFxuICAgICAgY3VycmVudExvY2FsZSxcbiAgICAgIGlzRXZlbnRGb3JtT3BlbixcbiAgICAgIHNlbGVjdGVkRXZlbnQsXG4gICAgICBzZWxlY3RlZERhdGUsXG4gICAgICBmaXJzdERheU9mV2VlayxcbiAgICAgIHNldEN1cnJlbnREYXRlLFxuICAgICAgc2VsZWN0RGF0ZSxcbiAgICAgIHNldFZpZXc6IGhhbmRsZVZpZXdDaGFuZ2UsXG4gICAgICBuZXh0UGVyaW9kLFxuICAgICAgcHJldlBlcmlvZCxcbiAgICAgIHRvZGF5LFxuICAgICAgYWRkRXZlbnQsXG4gICAgICB1cGRhdGVFdmVudCxcbiAgICAgIGRlbGV0ZUV2ZW50LFxuICAgICAgb3BlbkV2ZW50Rm9ybTogKCkgPT4gc2V0SXNFdmVudEZvcm1PcGVuKHRydWUpLFxuICAgICAgY2xvc2VFdmVudEZvcm0sXG4gICAgICBnZXRFdmVudHNGb3JEYXRlLFxuICAgICAgZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlLFxuICAgICAgZXhwYW5kUmVjdXJyaW5nRXZlbnQsXG4gICAgICBhZGRSZWN1cnJpbmdFdmVudCxcbiAgICAgIGRlbGV0ZVJlY3VycmluZ0V2ZW50LFxuICAgICAgdXBkYXRlUmVjdXJyaW5nRXZlbnQsXG4gICAgICBjcmVhdGVFeGNlcHRpb25Gb3JSZWN1cnJpbmdFdmVudCxcbiAgICAgIHJlbmRlckV2ZW50LFxuICAgICAgb25FdmVudENsaWNrOiBoYW5kbGVFdmVudENsaWNrLFxuICAgICAgb25DZWxsQ2xpY2s6IGhhbmRsZURhdGVDbGljayxcbiAgICAgIGxvY2FsZSxcbiAgICAgIHRpbWV6b25lOiBjdXJyZW50VGltZXpvbmUsXG4gICAgICBkaXNhYmxlQ2VsbENsaWNrLFxuICAgICAgZGlzYWJsZUV2ZW50Q2xpY2ssXG4gICAgICBkaXNhYmxlRHJhZ0FuZERyb3AsXG4gICAgICBkYXlNYXhFdmVudHMsXG4gICAgICBzdGlja3lWaWV3SGVhZGVyLFxuICAgICAgdmlld0hlYWRlckNsYXNzTmFtZSxcbiAgICB9KSxcbiAgICBbXG4gICAgICBjdXJyZW50RGF0ZSxcbiAgICAgIHZpZXcsXG4gICAgICBjdXJyZW50RXZlbnRzLFxuICAgICAgY3VycmVudExvY2FsZSxcbiAgICAgIGlzRXZlbnRGb3JtT3BlbixcbiAgICAgIHNlbGVjdGVkRXZlbnQsXG4gICAgICBzZWxlY3RlZERhdGUsXG4gICAgICBmaXJzdERheU9mV2VlayxcbiAgICAgIHNlbGVjdERhdGUsXG4gICAgICBoYW5kbGVWaWV3Q2hhbmdlLFxuICAgICAgbmV4dFBlcmlvZCxcbiAgICAgIHByZXZQZXJpb2QsXG4gICAgICB0b2RheSxcbiAgICAgIGFkZEV2ZW50LFxuICAgICAgdXBkYXRlRXZlbnQsXG4gICAgICBkZWxldGVFdmVudCxcbiAgICAgIGNsb3NlRXZlbnRGb3JtLFxuICAgICAgZ2V0RXZlbnRzRm9yRGF0ZSxcbiAgICAgIGdldEV2ZW50c0ZvckRhdGVSYW5nZSxcbiAgICAgIGV4cGFuZFJlY3VycmluZ0V2ZW50LFxuICAgICAgYWRkUmVjdXJyaW5nRXZlbnQsXG4gICAgICBkZWxldGVSZWN1cnJpbmdFdmVudCxcbiAgICAgIHVwZGF0ZVJlY3VycmluZ0V2ZW50LFxuICAgICAgY3JlYXRlRXhjZXB0aW9uRm9yUmVjdXJyaW5nRXZlbnQsXG4gICAgICByZW5kZXJFdmVudCxcbiAgICAgIGhhbmRsZUV2ZW50Q2xpY2ssXG4gICAgICBoYW5kbGVEYXRlQ2xpY2ssXG4gICAgICBsb2NhbGUsXG4gICAgICBjdXJyZW50VGltZXpvbmUsXG4gICAgICBkaXNhYmxlQ2VsbENsaWNrLFxuICAgICAgZGlzYWJsZUV2ZW50Q2xpY2ssXG4gICAgICBkaXNhYmxlRHJhZ0FuZERyb3AsXG4gICAgICBkYXlNYXhFdmVudHMsXG4gICAgICBzdGlja3lWaWV3SGVhZGVyLFxuICAgICAgdmlld0hlYWRlckNsYXNzTmFtZSxcbiAgICBdXG4gIClcblxuICByZXR1cm4gKFxuICAgIDxDYWxlbmRhckNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NvbnRleHRWYWx1ZX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9DYWxlbmRhckNvbnRleHQuUHJvdmlkZXI+XG4gIClcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFDQSw0QkFBUyw0QkFBaUI7QUFDMUIsNEJBQWdCOzs7QUNBaEI7QUFtRE8sSUFBTSxrQkFBa0IsY0FDN0IsU0FDRjtBQUVPLElBQU0scUJBQXFCLE1BQU07QUFBQSxFQUN0QyxNQUFNLFVBQVUsV0FBVyxlQUFlO0FBQUEsRUFDMUMsSUFBSSxZQUFZLFdBQVc7QUFBQSxJQUN6QixNQUFNLElBQUksTUFBTSwyREFBMkQ7QUFBQSxFQUM3RTtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBR0YsSUFBTSwyQkFBMkIsTUFBTTtBQUFBLEVBQzVDLE1BQU0sVUFBVSxXQUFXLGVBQWU7QUFBQSxFQUMxQyxJQUFJLFlBQVksV0FBVztBQUFBLElBQ3pCLE1BQU0sSUFBSSxNQUFNLHVEQUF1RDtBQUFBLEVBQ3pFO0FBQUEsRUFDQSxPQUFPO0FBQUEsSUFDTCxhQUFhLFFBQVE7QUFBQSxJQUNyQixNQUFNLFFBQVE7QUFBQSxJQUNkLFFBQVEsUUFBUTtBQUFBLElBQ2hCLGlCQUFpQixRQUFRO0FBQUEsSUFDekIsZUFBZSxRQUFRO0FBQUEsSUFDdkIsY0FBYyxRQUFRO0FBQUEsSUFDdEIsZ0JBQWdCLFFBQVE7QUFBQSxJQUN4QixnQkFBZ0IsUUFBUTtBQUFBLElBQ3hCLFlBQVksUUFBUTtBQUFBLElBQ3BCLFNBQVMsUUFBUTtBQUFBLElBQ2pCLFlBQVksUUFBUTtBQUFBLElBQ3BCLFlBQVksUUFBUTtBQUFBLElBQ3BCLE9BQU8sUUFBUTtBQUFBLElBQ2YsVUFBVSxRQUFRO0FBQUEsSUFDbEIsYUFBYSxRQUFRO0FBQUEsSUFDckIsYUFBYSxRQUFRO0FBQUEsSUFDckIsZUFBZSxRQUFRO0FBQUEsSUFDdkIsZ0JBQWdCLFFBQVE7QUFBQSxFQUMxQjtBQUFBOzs7QUN4RkY7QUFDQTs7O0FDREE7OztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBLE1BQU0sT0FBTyxPQUFPO0FBQ3BCLE1BQU0sT0FBTyxVQUFVO0FBQ3ZCLE1BQU0sT0FBTyxhQUFhO0FBQzFCLE1BQU0sT0FBTyxjQUFjO0FBQzNCLE1BQU0sT0FBTyxTQUFTO0FBQ3RCLE1BQU0sT0FBTyxNQUFNO0FBQ25CLE1BQU0sT0FBTyxRQUFRO0FBQ3JCLE1BQU0sT0FBTyxHQUFHO0FBQ2hCLE1BQU0sT0FBTyxVQUFVO0FBRXZCLElBQWU7OztBRHJLZjtBQUVPLFNBQVMsRUFBRSxJQUFJLFFBQXNCO0FBQUEsRUFDMUMsT0FBTyxRQUFRLEtBQUssTUFBTSxDQUFDO0FBQUE7Ozs7O0FFTDdCOztBQUlBLElBQU0sZ0JBQWdCLElBQ3BCLHFPQUNBO0FBQUEsRUFDRSxVQUFVO0FBQUEsSUFDUixTQUFTO0FBQUEsTUFDUCxTQUFTO0FBQUEsTUFDVCxhQUNFO0FBQUEsTUFDRixTQUNFO0FBQUEsTUFDRixXQUNFO0FBQUEsTUFDRixTQUNFO0FBQUEsTUFDRixTQUNFO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLGlCQUFpQjtBQUFBLElBQ2YsU0FBUztBQUFBLEVBQ1g7QUFDRixDQUNGOztBQzFCQTtBQUNBLGdCQUFTOztBQUlULElBQU0sZ0JBQWdCLEtBQ3BCLGdaQUNBO0FBQUEsRUFDRSxVQUFVO0FBQUEsSUFDUixTQUFTO0FBQUEsTUFDUCxTQUNFO0FBQUEsTUFDRixXQUNFO0FBQUEsTUFDRixhQUNFO0FBQUEsTUFDRixTQUNFO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLGlCQUFpQjtBQUFBLElBQ2YsU0FBUztBQUFBLEVBQ1g7QUFDRixDQUNGOztBQ3hCQSxpQkFBUztBQUNULGdCQUFTOztBQUlULElBQU0saUJBQWlCLEtBQ3JCLCtiQUNBO0FBQUEsRUFDRSxVQUFVO0FBQUEsSUFDUixTQUFTO0FBQUEsTUFDUCxTQUNFO0FBQUEsTUFDRixhQUNFO0FBQUEsTUFDRixTQUNFO0FBQUEsTUFDRixXQUNFO0FBQUEsTUFDRixPQUNFO0FBQUEsTUFDRixNQUFNO0FBQUEsSUFDUjtBQUFBLElBQ0EsTUFBTTtBQUFBLE1BQ0osU0FBUztBQUFBLE1BQ1QsSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLElBQ1I7QUFBQSxFQUNGO0FBQUEsRUFDQSxpQkFBaUI7QUFBQSxJQUNmLFNBQVM7QUFBQSxJQUNULE1BQU07QUFBQSxFQUNSO0FBQ0YsQ0FDRjtBQUVBLFNBQVMsTUFBTTtBQUFBLEVBQ2I7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsVUFBVTtBQUFBLEtBQ1A7QUFBQSxHQUlBO0FBQUEsRUFDSCxNQUFNLE9BQU8sVUFBVSxRQUFPO0FBQUEsRUFFOUIsdUJBQ0UsUUFBQyxNQUFEO0FBQUEsSUFDRSxhQUFVO0FBQUEsSUFDVixXQUFXLEdBQUcsZUFBZSxFQUFFLFNBQVMsTUFBTSxVQUFVLENBQUMsQ0FBQztBQUFBLE9BQ3REO0FBQUEsS0FITixpQ0FJQTtBQUFBOztBQ3JESjtBQUNBOztBQUtBLFNBQVMsUUFBUTtBQUFBLEVBQ2Y7QUFBQSxFQUNBO0FBQUEsRUFDQSxrQkFBa0I7QUFBQSxLQUNmO0FBQUEsR0FDc0M7QUFBQSxFQUN6Qyx1QkFDRSxRQUFDLFdBQUQ7QUFBQSxJQUNFO0FBQUEsSUFDQSxXQUFXLEdBQUcsT0FBTyxTQUFTO0FBQUEsSUFDOUIsWUFBWTtBQUFBLE1BQ1YsUUFBUTtBQUFBLE1BQ1IsT0FBTztBQUFBLE1BQ1AsU0FBUztBQUFBLE1BQ1QsZUFBZTtBQUFBLE1BQ2YsS0FBSztBQUFBLE1BQ0wsWUFBWSxHQUNWLGVBQWUsRUFBRSxTQUFTLFVBQVUsQ0FBQyxHQUNyQyx3REFDRjtBQUFBLE1BQ0EscUJBQXFCO0FBQUEsTUFDckIsaUJBQWlCO0FBQUEsTUFDakIsT0FBTztBQUFBLE1BQ1AsVUFBVTtBQUFBLE1BQ1YsV0FDRTtBQUFBLE1BQ0YsS0FBSztBQUFBLE1BQ0wsTUFBTSxHQUNKLG1LQUNBLE1BQU0sU0FBUyxVQUNYLHlLQUNBLHFDQUNOO0FBQUEsTUFDQSxLQUFLLEdBQ0gsZUFBZSxFQUFFLFNBQVMsUUFBUSxDQUFDLEdBQ25DLGtEQUNGO0FBQUEsTUFDQSxpQkFDRTtBQUFBLE1BQ0YsZUFDRTtBQUFBLE1BQ0YsY0FDRTtBQUFBLE1BQ0YsV0FBVztBQUFBLE1BQ1gsYUFDRTtBQUFBLE1BQ0YsY0FBYztBQUFBLE1BQ2Qsa0JBQ0U7QUFBQSxNQUNGLFlBQVk7QUFBQSxTQUNUO0FBQUEsSUFDTDtBQUFBLElBQ0EsWUFBWTtBQUFBLE1BQ1YsVUFBVSxHQUFHLDBCQUFjLDZCQUN6QixRQUFDLGFBQUQ7QUFBQSxRQUFhLFdBQVcsR0FBRyxVQUFVLFVBQVM7QUFBQSxXQUFPO0FBQUEsU0FBckQsaUNBQTREO0FBQUEsTUFFOUQsV0FBVyxHQUFHLDBCQUFjLDZCQUMxQixRQUFDLGNBQUQ7QUFBQSxRQUFjLFdBQVcsR0FBRyxVQUFVLFVBQVM7QUFBQSxXQUFPO0FBQUEsU0FBdEQsaUNBQTZEO0FBQUEsSUFFakU7QUFBQSxPQUNJO0FBQUEsS0FyRE4saUNBc0RBO0FBQUE7O0FDbkVKO0FBQ0E7O0FBSUEsU0FBUyxRQUFRO0FBQUEsRUFDZjtBQUFBLEtBQ0c7QUFBQSxHQUNtRDtBQUFBLEVBQ3RELHVCQUNFLFFBY29CLHdCQWRwQjtBQUFBLElBQ0UsYUFBVTtBQUFBLElBQ1YsV0FBVyxHQUNULCtlQUNBLFNBQ0Y7QUFBQSxPQUNJO0FBQUEsSUFOTiwwQkFRRSxRQUtvQiw2QkFMcEI7QUFBQSxNQUNFLGFBQVU7QUFBQSxNQUNWLFdBQVU7QUFBQSxNQUZaLDBCQUlFLFFBQUMsV0FBRDtBQUFBLFFBQVcsV0FBVTtBQUFBLFNBQXJCLGlDQUFnQztBQUFBLE9BSmxDLGlDQUtFO0FBQUEsS0FiSixpQ0FjRTtBQUFBOzs7O0FDeEJOLHFCQUFTOzs7QUNBVDs7QUFJQSxTQUFTLE9BQU87QUFBQSxLQUNYO0FBQUEsR0FDa0Q7QUFBQSxFQUNyRCx1QkFBTyxRQUFrQix1QkFBbEI7QUFBQSxJQUF1QixhQUFVO0FBQUEsT0FBYztBQUFBLEtBQS9DLGlDQUFzRDtBQUFBO0FBRy9ELFNBQVMsY0FBYztBQUFBLEtBQ2xCO0FBQUEsR0FDcUQ7QUFBQSxFQUN4RCx1QkFBTyxRQUFrQiwwQkFBbEI7QUFBQSxJQUEwQixhQUFVO0FBQUEsT0FBc0I7QUFBQSxLQUExRCxpQ0FBaUU7QUFBQTtBQUcxRSxTQUFTLGNBQWM7QUFBQSxFQUNyQjtBQUFBLEVBQ0EsUUFBUTtBQUFBLEVBQ1IsYUFBYTtBQUFBLEtBQ1Y7QUFBQSxHQUNxRDtBQUFBLEVBQ3hELHVCQUNFLFFBV21CLHlCQVhuQjtBQUFBLDhCQUNFLFFBQWtCLDBCQUFsQjtBQUFBLE1BQ0UsYUFBVTtBQUFBLE1BQ1Y7QUFBQSxNQUNBO0FBQUEsTUFDQSxXQUFXLEdBQ1Qsa2VBQ0EsU0FDRjtBQUFBLFNBQ0k7QUFBQSxPQVJOLGlDQVNBO0FBQUEsS0FWRixpQ0FXRTtBQUFBOzs7QUR6Qk47QUFDQTtBQUFBO0FBVU8sU0FBUyxVQUFVO0FBQUEsRUFDeEI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsUUFBUTtBQUFBLEVBQ1I7QUFBQSxHQUNrQjtBQUFBLEVBQ2xCLE1BQU0sYUFBYSxPQUFpQyxJQUFJO0FBQUEsRUFFeEQsTUFBTSxXQUFXLENBQUMsVUFBMkI7QUFBQSxJQUMzQyxRQUFRLEtBQUk7QUFBQSxJQUNaLElBQUksZUFBZTtBQUFBLE1BQ2pCLFdBQVcsU0FBUyxNQUFNO0FBQUEsSUFDNUI7QUFBQTtBQUFBLEVBR0YsdUJBQ0UsUUF3QkUsT0F4QkY7QUFBQSxJQUFLO0FBQUEsSUFBTCwwQkFDRSxRQXNCRSxTQXRCRjtBQUFBLGdCQXNCRTtBQUFBLHdCQXJCQSxRQVdFLGdCQVhGO0FBQUEsVUFBZ0IsU0FBTztBQUFBLFVBQXZCLDBCQUNFLFFBU0UsUUFURjtBQUFBLFlBQ0UsU0FBUTtBQUFBLFlBQ1IsV0FBVyxHQUNULCtDQUNDLFFBQVEsdUJBQ1g7QUFBQSxZQUxGLFVBU0U7QUFBQSw4QkFGQSxRQUFDLGNBQUQ7QUFBQSxnQkFBYyxXQUFVO0FBQUEsaUJBQXhCLGlDQUF1QztBQUFBLGNBQ3RDLE9BQU8scUJBQU0sSUFBSSxFQUFFLE9BQU8sYUFBYSxvQkFBSSxRQUFlLFFBQWY7QUFBQSwwQkFBTztBQUFBLGlCQUFQLGlDQUFlO0FBQUE7QUFBQSxhQVI3RCxnQ0FTRTtBQUFBLFdBVkosaUNBV0U7QUFBQSx3QkFDRixRQVFFLGdCQVJGO0FBQUEsVUFBZ0IsV0FBVTtBQUFBLFVBQWEsT0FBTTtBQUFBLFVBQTdDLFVBUUU7QUFBQSw0QkFQQSxRQUFDLGNBQUQ7QUFBQSxjQUFjLEtBQUs7QUFBQSxlQUFuQixpQ0FBK0I7QUFBQSw0QkFDL0IsUUFBQyxVQUFEO0FBQUEsY0FDRSxNQUFLO0FBQUEsY0FDTCxVQUFVO0FBQUEsY0FDVjtBQUFBLGNBQ0EsY0FBWTtBQUFBLGVBSmQsaUNBS0E7QUFBQTtBQUFBLFdBUEYsZ0NBUUU7QUFBQTtBQUFBLE9BckJKLGdDQXNCRTtBQUFBLEtBdkJKLGlDQXdCRTtBQUFBOztBRTdETjtBQUNBOztBQUlBLFNBQVMsTUFBTTtBQUFBLEtBQ1Y7QUFBQSxHQUNpRDtBQUFBLEVBQ3BELHVCQUFPLFNBQWlCLHNCQUFqQjtBQUFBLElBQXNCLGFBQVU7QUFBQSxPQUFhO0FBQUEsS0FBN0MsaUNBQW9EO0FBQUE7QUFTN0QsU0FBUyxZQUFZO0FBQUEsS0FDaEI7QUFBQSxHQUNtRDtBQUFBLEVBQ3RELHVCQUFPLFNBQWlCLHdCQUFqQjtBQUFBLElBQXdCLGFBQVU7QUFBQSxPQUFvQjtBQUFBLEtBQXRELGlDQUE2RDtBQUFBO0FBU3RFLFNBQVMsYUFBYTtBQUFBLEVBQ3BCO0FBQUEsS0FDRztBQUFBLEdBQ29EO0FBQUEsRUFDdkQsdUJBQ0UsU0FBaUIseUJBQWpCO0FBQUEsSUFDRSxhQUFVO0FBQUEsSUFDVixXQUFXLEdBQ1QsMEpBQ0EsU0FDRjtBQUFBLE9BQ0k7QUFBQSxLQU5OLGlDQU9BO0FBQUE7QUFJSixTQUFTLGFBQWE7QUFBQSxFQUNwQjtBQUFBLEVBQ0E7QUFBQSxLQUNHO0FBQUEsR0FDb0Q7QUFBQSxFQUN2RCx1QkFDRSxTQWdCRSxjQWhCRjtBQUFBLElBQWMsYUFBVTtBQUFBLElBQXhCLFVBZ0JFO0FBQUEsc0JBZkEsU0FBQyxlQUFELHFDQUFlO0FBQUEsc0JBQ2YsU0Fha0IseUJBYmxCO0FBQUEsUUFDRSxhQUFVO0FBQUEsUUFDVixXQUFXLEdBQ1QsK1dBQ0EsU0FDRjtBQUFBLFdBQ0k7QUFBQSxRQU5OLFVBYUU7QUFBQSxVQUxDO0FBQUEsMEJBQ0QsU0FHa0IsdUJBSGxCO0FBQUEsWUFBdUIsV0FBVTtBQUFBLFlBQWpDLFVBR0U7QUFBQSw4QkFGQSxTQUFDLE9BQUQscUNBQU87QUFBQSw4QkFDUCxTQUFpQyxRQUFqQztBQUFBLGdCQUFNLFdBQVU7QUFBQSxnQkFBaEI7QUFBQSxrREFBaUM7QUFBQTtBQUFBLGFBRm5DLGdDQUdFO0FBQUE7QUFBQSxTQVpKLGdDQWFFO0FBQUE7QUFBQSxLQWZKLGdDQWdCRTtBQUFBO0FBSU4sU0FBUyxZQUFZLEdBQUcsY0FBYyxTQUFzQztBQUFBLEVBQzFFLHVCQUNFLFNBQUMsT0FBRDtBQUFBLElBQ0UsYUFBVTtBQUFBLElBQ1YsV0FBVyxHQUFHLGdEQUFnRCxTQUFTO0FBQUEsT0FDbkU7QUFBQSxLQUhOLGlDQUlBO0FBQUE7QUFJSixTQUFTLFlBQVksR0FBRyxjQUFjLFNBQXNDO0FBQUEsRUFDMUUsdUJBQ0UsU0FBQyxPQUFEO0FBQUEsSUFDRSxhQUFVO0FBQUEsSUFDVixXQUFXLEdBQ1QsMERBQ0EsU0FDRjtBQUFBLE9BQ0k7QUFBQSxLQU5OLGlDQU9BO0FBQUE7QUFJSixTQUFTLFdBQVc7QUFBQSxFQUNsQjtBQUFBLEtBQ0c7QUFBQSxHQUNrRDtBQUFBLEVBQ3JELHVCQUNFLFNBQWlCLHVCQUFqQjtBQUFBLElBQ0UsYUFBVTtBQUFBLElBQ1YsV0FBVyxHQUFHLHNDQUFzQyxTQUFTO0FBQUEsT0FDekQ7QUFBQSxLQUhOLGlDQUlBO0FBQUE7QUFJSixTQUFTLGlCQUFpQjtBQUFBLEVBQ3hCO0FBQUEsS0FDRztBQUFBLEdBQ3dEO0FBQUEsRUFDM0QsdUJBQ0UsU0FBaUIsNkJBQWpCO0FBQUEsSUFDRSxhQUFVO0FBQUEsSUFDVixXQUFXLEdBQUcsaUNBQWlDLFNBQVM7QUFBQSxPQUNwRDtBQUFBLEtBSE4saUNBSUE7QUFBQTs7QUNwSEo7QUFDQSxzQkFBUzs7O0FDRlQ7QUFFQSxpQkFBUzs7O0FDRlQ7QUFDQTtBQTZCQSxJQUFJLFFBQVEsT0FBTyxXQUFXLGVBQzFCLE9BQU8sT0FBTyxnQkFBZ0IsZUFDOUIsT0FBTyxhQUFhO0FBaUZ4QixJQUFNLGtCQUFrQjtBQUFBLEVBQ3BCLFFBQVE7QUFBQSxFQUNSLFVBQVU7QUFBQSxFQUNWLFVBQVU7QUFBQSxFQUNWLFdBQVc7QUFBQSxFQUNYLEtBQUs7QUFDVDtBQVdBLElBQU0sa0JBQWtCLGVBQWUsY0FBYyxJQUFJO0FBQ3pELGdCQUFnQixjQUFjO0FBbW1DOUIsSUFBTSxpQkFBaUI7QUFBQSxFQUNuQixNQUFNLGdCQUFnQjtBQUFBLEVBQ3RCLGdCQUFnQixnQkFBZ0I7QUFBQSxFQUNoQyxrQkFBa0I7QUFDdEI7OztBQ3Z1Q0E7O0FBSEE7QUFPQSxTQUFTLE1BQUs7QUFBQSxFQUNaO0FBQUEsS0FDRztBQUFBLEdBQ2dEO0FBQUEsRUFDbkQsdUJBQ0UsU0FBZ0IscUJBQWhCO0FBQUEsSUFDRSxhQUFVO0FBQUEsSUFDVixXQUFXLEdBQ1QsdU5BQ0EsU0FDRjtBQUFBLE9BQ0k7QUFBQSxLQU5OLGlDQU9BO0FBQUE7Ozs7QUZNSixJQUFNLG1CQUF5QixxQkFDN0IsQ0FBQyxDQUNIO0FBMENBLElBQU0sa0JBQXdCLHFCQUM1QixDQUFDLENBQ0g7OztBR25FQSxTQUFTLEtBQUssR0FBRyxXQUFXLFNBQVMsU0FBd0M7QUFBQSxFQUMzRSx1QkFDRSxTQUFDLFNBQUQ7QUFBQSxJQUNFO0FBQUEsSUFDQSxhQUFVO0FBQUEsSUFDVixXQUFXLEdBQ1QsbWNBQ0EsaUZBQ0EsMEdBQ0EsU0FDRjtBQUFBLE9BQ0k7QUFBQSxLQVROLGlDQVVBO0FBQUE7Ozs7QUNmSjs7QUFJQSxTQUFTLFVBQVU7QUFBQSxFQUNqQjtBQUFBLEVBQ0E7QUFBQSxLQUNHO0FBQUEsR0FDcUQ7QUFBQSxFQUN4RCx1QkFDRSxTQWFzQiwwQkFidEI7QUFBQSxJQUNFLGFBQVU7QUFBQSxJQUNWLFdBQVcsR0FBRyxZQUFZLFNBQVM7QUFBQSxPQUMvQjtBQUFBLElBSE4sVUFhRTtBQUFBLHNCQVJBLFNBS3NCLDhCQUx0QjtBQUFBLFFBQ0UsYUFBVTtBQUFBLFFBQ1YsV0FBVTtBQUFBLFFBRlo7QUFBQSwwQ0FLRTtBQUFBLHNCQUNGLFNBQUMsV0FBRCxxQ0FBVztBQUFBLHNCQUNYLFNBQXFCLDRCQUFyQixxQ0FBNEI7QUFBQTtBQUFBLEtBWjlCLGdDQWFFO0FBQUE7QUFJTixTQUFTLFNBQVM7QUFBQSxFQUNoQjtBQUFBLEVBQ0EsY0FBYztBQUFBLEtBQ1g7QUFBQSxHQUNvRTtBQUFBLEVBQ3ZFLHVCQUNFLFNBaUJzQix5Q0FqQnRCO0FBQUEsSUFDRSxhQUFVO0FBQUEsSUFDVjtBQUFBLElBQ0EsV0FBVyxHQUNULHNEQUNBLGdCQUFnQixjQUNkLDhDQUNGLGdCQUFnQixnQkFDZCxnREFDRixTQUNGO0FBQUEsT0FDSTtBQUFBLElBWE4sMEJBYUUsU0FBcUIscUNBQXJCO0FBQUEsTUFDRSxhQUFVO0FBQUEsTUFDVixXQUFVO0FBQUEsT0FGWixpQ0FHQTtBQUFBLEtBaEJGLGlDQWlCRTtBQUFBOztBQ2xETjtBQUNBLHNCQUFTLCtCQUFXOzs7QUNEcEI7OztBQ0FBO0FBQ0Esa0JBQVM7Ozs7O0FDRFQ7Ozs7O0FDQUE7O0FBSUEsU0FBUyxlQUFlO0FBQUEsRUFDdEIsZ0JBQWdCO0FBQUEsS0FDYjtBQUFBLEdBQ3NEO0FBQUEsRUFDekQsdUJBQ0UsU0FBa0IsMkJBQWxCO0FBQUEsSUFDRSxhQUFVO0FBQUEsSUFDVjtBQUFBLE9BQ0k7QUFBQSxLQUhOLGlDQUlBO0FBQUE7QUFJSixTQUFTLE9BQU87QUFBQSxLQUNYO0FBQUEsR0FDa0Q7QUFBQSxFQUNyRCx1QkFDRSxTQUVFLGlCQUZGO0FBQUEsOEJBQ0UsU0FBa0IsdUJBQWxCO0FBQUEsTUFBdUIsYUFBVTtBQUFBLFNBQWM7QUFBQSxPQUEvQyxpQ0FBc0Q7QUFBQSxLQUR4RCxpQ0FFRTtBQUFBO0FBSU4sU0FBUyxjQUFjO0FBQUEsS0FDbEI7QUFBQSxHQUNxRDtBQUFBLEVBQ3hELHVCQUFPLFNBQWtCLDBCQUFsQjtBQUFBLElBQTBCLGFBQVU7QUFBQSxPQUFzQjtBQUFBLEtBQTFELGlDQUFpRTtBQUFBO0FBRzFFLFNBQVMsY0FBYztBQUFBLEVBQ3JCO0FBQUEsRUFDQSxhQUFhO0FBQUEsRUFDYjtBQUFBLEtBQ0c7QUFBQSxHQUNxRDtBQUFBLEVBQ3hELHVCQUNFLFNBYW1CLHlCQWJuQjtBQUFBLDhCQUNFLFNBV21CLDBCQVhuQjtBQUFBLE1BQ0UsYUFBVTtBQUFBLE1BQ1Y7QUFBQSxNQUNBLFdBQVcsR0FDVCwwYUFDQSxTQUNGO0FBQUEsU0FDSTtBQUFBLE1BUE4sVUFXRTtBQUFBLFFBRkM7QUFBQSx3QkFDRCxTQUFrQix3QkFBbEI7QUFBQSxVQUF3QixXQUFVO0FBQUEsV0FBbEMsaUNBQWlJO0FBQUE7QUFBQSxPQVZuSSxnQ0FXRTtBQUFBLEtBWkosaUNBYUU7QUFBQTs7QUNoRE47OztBQ0hBO0FBQ0E7QUFFQTtBQUFBO0FBRUEsU0FBUyx3QkFBd0I7QUFBQSxFQUMvQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsY0FBYztBQUFBLEdBT2I7QUFBQSxFQUNELFFBQVEsY0FBYyxhQUFhLG1CQUFtQix1QkFDcEQsbUJBQW1CO0FBQUEsRUFDckIsUUFBUSxZQUFZLFdBQVcsWUFBWSxlQUFlLGFBQWE7QUFBQSxJQUNyRSxJQUFJO0FBQUEsSUFDSixNQUFNO0FBQUEsTUFDSjtBQUFBLE1BQ0EsTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBLFVBQVUsZUFBZTtBQUFBLEVBQzNCLENBQUM7QUFBQSxFQUdELE1BQU0sc0JBQXNCLHNCQUMxQixTQVdFLE9BWEY7QUFBQSxJQUNFLFdBQVcsR0FDVCxNQUFNLG1CQUFtQixlQUN6QixNQUFNLFNBQVMsY0FDZixrRkFDRjtBQUFBLElBQ0EsT0FBTyxFQUFFLGlCQUFpQixNQUFNLGlCQUFpQixPQUFPLE1BQU0sTUFBTTtBQUFBLElBTnRFLDBCQVFFLFNBRUUsS0FGRjtBQUFBLE1BQUcsV0FBVTtBQUFBLE1BQWIsVUFDRyxNQUFNO0FBQUEsT0FEVCxpQ0FFRTtBQUFBLEtBVkosaUNBV0U7QUFBQSxFQUdKLHVCQUNFLFNBaUNFLGlCQWpDRjtBQUFBLElBQWlCLE1BQUs7QUFBQSxJQUF0QiwwQkFDRSxTQStCRSxPQUFPLEtBL0JUO0FBQUEsTUFFRSxLQUFLO0FBQUEsU0FDRDtBQUFBLFNBQ0E7QUFBQSxNQUNKLFNBQVMsRUFBRSxTQUFTLEdBQUcsR0FBRyxJQUFJO0FBQUEsTUFDOUIsU0FBUyxFQUFFLFNBQVMsR0FBRyxHQUFHLEVBQUU7QUFBQSxNQUM1QixNQUFNLEVBQUUsU0FBUyxHQUFHLEdBQUcsSUFBSTtBQUFBLE1BQzNCLFFBQU07QUFBQSxNQUNOLFVBQVU7QUFBQSxNQUNWLFlBQVksRUFBRSxVQUFVLEtBQUssTUFBTSxZQUFZO0FBQUEsTUFDL0MsV0FBVyxHQUNULDBCQUNBLGVBQWUscUJBQ1gsb0JBQ0UsbUJBQ0EsbUJBQ0YsZUFDSixnQkFDSSxlQUFlLHVCQUNqQiw2QkFDRixTQUNGO0FBQUEsTUFDQTtBQUFBLE1BQ0EsU0FBUyxDQUFDLE1BQU07QUFBQSxRQUNkLEVBQUUsZ0JBQWdCO0FBQUEsUUFDbEIsYUFBYSxLQUFLO0FBQUE7QUFBQSxNQTFCdEIsVUE4QkcsY0FBYyxZQUFZLEtBQUssb0JBQUksU0FBQyxxQkFBRCxxQ0FBcUI7QUFBQSxPQTdCcEQsV0FEUCxzQkErQkU7QUFBQSxLQWhDSixpQ0FpQ0U7QUFBQTtBQUlDLElBQU0saUJBQWlCLEtBQzVCLDBCQUNBLENBQUMsV0FBVyxjQUFjO0FBQUEsRUFFeEIsT0FDRSxVQUFVLGNBQWMsVUFBVSxhQUNsQyxVQUFVLGdCQUFnQixVQUFVLGVBQ3BDLFVBQVUsY0FBYyxVQUFVLGFBQ2xDLFVBQVUsTUFBTSxPQUFPLFVBQVUsTUFBTSxNQUN2QyxVQUFVLE1BQU0sV0FBVyxVQUFVLE1BQU07QUFBQSxDQUdqRDs7OztBRC9FTyxJQUFNLGlCQUFnRCxHQUFHLFVBQVU7QUFBQSxFQUN4RSxPQUFPLFlBQVksaUJBQWlCLFNBQVMsS0FBSztBQUFBLEVBQ2xELE9BQU8sbUJBQW1CLHdCQUN4QixTQUFtQyxJQUFJO0FBQUEsRUFDekMsUUFBUSxhQUFhLG1CQUFtQixtQkFBbUI7QUFBQSxFQUUzRCxvQkFBb0IsS0FBSyxPQUFPO0FBQUEsSUFDOUIsTUFBTSxNQUFNLGNBQWMsSUFBSTtBQUFBLElBQzlCLE9BQU8sTUFBTSxjQUFjLEtBQUs7QUFBQSxJQUNoQyxzQkFBc0IsQ0FBQyxjQUNyQixxQkFBcUIsU0FBUztBQUFBLEVBQ2xDLEVBQUU7QUFBQSxFQUdGLE1BQU0sa0JBQWtCLFlBQVksUUFBUSxPQUFPO0FBQUEsRUFJbkQsSUFBSSw2QkFBNkIsZ0JBQWdCLE1BQU07QUFBQSxFQUN2RCxPQUFPLDJCQUEyQixJQUFJLE1BQU0sZ0JBQWdCO0FBQUEsSUFDMUQsNkJBQTZCLDJCQUEyQixTQUFTLEdBQUcsS0FBSztBQUFBLEVBQzNFO0FBQUEsRUFFQSx1QkFDRSxTQXFCRSxRQXJCRjtBQUFBLElBQVEsTUFBTTtBQUFBLElBQVksY0FBYztBQUFBLElBQXhDLDBCQUNFLFNBbUJFLGVBbkJGO0FBQUEsTUFBZSxXQUFVO0FBQUEsTUFBekIsVUFtQkU7QUFBQSx3QkFsQkEsU0FJRSxjQUpGO0FBQUEsb0NBQ0UsU0FFRSxhQUZGO0FBQUEsc0JBQ0cscUJBQXFCLGtCQUFrQixJQUFJLE9BQU8sY0FBYztBQUFBLGFBRG5FLGlDQUVFO0FBQUEsV0FISixpQ0FJRTtBQUFBLHdCQUNGLFNBWUUsT0FaRjtBQUFBLFVBQUssV0FBVTtBQUFBLFVBQWYsVUFDRyxxQkFDQyxrQkFBa0IsT0FBTyxJQUFJLENBQUMsVUFBVTtBQUFBLFlBQ3RDLHVCQUNFLFNBQUMsZ0JBQUQ7QUFBQSxjQUNFLFdBQVcsTUFBTTtBQUFBLGNBRWpCO0FBQUEsY0FDQSxXQUFVO0FBQUEsZUFGTCxNQUFNLElBRmIsc0JBS0E7QUFBQSxXQUVIO0FBQUEsV0FYTCxpQ0FZRTtBQUFBO0FBQUEsT0FsQkosZ0NBbUJFO0FBQUEsS0FwQkosaUNBcUJFO0FBQUE7OztBRTlETjs7O0FDREE7O0FBaUJPLFNBQVMsYUFBYTtBQUFBLEVBQzNCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsZUFBZTtBQUFBLEdBQ007QUFBQSxFQUNyQixRQUFRLGFBQWEsb0JBQW9CLHFCQUN2QyxtQkFBbUI7QUFBQSxFQUNyQixRQUFRLFFBQVEsZUFBZSxhQUFhO0FBQUEsSUFDMUM7QUFBQSxJQUNBLE1BQU07QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLElBQ0EsVUFBVTtBQUFBLEVBQ1osQ0FBQztBQUFBLEVBRUQsTUFBTSxrQkFBa0IsQ0FBQyxNQUF3QjtBQUFBLElBQy9DLEVBQUUsZ0JBQWdCO0FBQUEsSUFDbEIsSUFBSTtBQUFBLE1BQWtCO0FBQUEsSUFFdEIsTUFBTSxZQUFZLEtBQUssS0FBSyxRQUFRLENBQUMsRUFBRSxPQUFPLFVBQVUsQ0FBQztBQUFBLElBQ3pELElBQUksVUFBVSxVQUFVLE1BQU07QUFBQSxJQUM5QixJQUFJLFNBQVMsYUFBYSxXQUFXLFdBQVc7QUFBQSxNQUM5QyxVQUFVLFFBQVEsS0FBSyxJQUFJLEVBQUUsT0FBTyxTQUFTLEVBQUU7QUFBQSxJQUNqRCxFQUFPLFNBQUksU0FBUyxXQUFXO0FBQUEsTUFDN0IsVUFBVSxRQUFRLEtBQUssT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFDM0MsRUFBTztBQUFBLE1BQ0wsVUFBVSxRQUFRLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRTtBQUFBO0FBQUEsSUFHdEMsWUFBWSxXQUFXLE9BQU87QUFBQTtBQUFBLEVBR2hDLHVCQUNFLFNBWUUsT0FaRjtBQUFBLElBQ0UsS0FBSztBQUFBLElBQ0wsZUFBYTtBQUFBLElBQ2IsV0FBVyxHQUNULFdBQ0EsV0FBVyxzQkFBc0IsYUFDakMsbUJBQW1CLG1CQUFtQixnQkFDeEM7QUFBQSxJQUNBLFNBQVM7QUFBQSxJQUNUO0FBQUEsSUFURjtBQUFBLHNDQVlFO0FBQUE7Ozs7QUR4REMsSUFBTSxVQUFrQztBQUFBLEVBQzdDO0FBQUEsRUFDQTtBQUFBLEVBQ0EsWUFBWTtBQUFBLE1BQ1I7QUFBQSxFQUNKLE1BQU0scUJBQXFCLE9BQU0sT0FJOUIsSUFBSTtBQUFBLEVBQ1A7QUFBQSxJQUNFO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLGVBQWU7QUFBQSxNQUNiLG1CQUFtQjtBQUFBLEVBQ3ZCLE1BQU0sY0FBYyxPQUFPLE9BQU8sQ0FBQyxNQUFNO0FBQUEsSUFDdkMsTUFBTSxjQUFjLEVBQUUsTUFBTSxPQUFPLEtBQUssS0FBSztBQUFBLElBQzdDLE1BQU0sWUFBWSxFQUFFLElBQUksT0FBTyxLQUFLLEtBQUs7QUFBQSxJQUN6QyxNQUFNLGFBQWEsRUFBRSxNQUFNLFNBQVMsS0FBSyxLQUFLLEtBQUssRUFBRSxJQUFJLFFBQVEsS0FBSyxLQUFLO0FBQUEsSUFFM0UsT0FBTyxlQUFlLGFBQWE7QUFBQSxHQUNwQztBQUFBLEVBR0QsTUFBTSxrQkFBa0IsWUFBWSxRQUFRLE9BQU87QUFBQSxFQUluRCxJQUFJLDZCQUE2QixnQkFBZ0IsTUFBTTtBQUFBLEVBQ3ZELE9BQU8sMkJBQTJCLElBQUksTUFBTSxnQkFBZ0I7QUFBQSxJQUMxRCw2QkFBNkIsMkJBQTJCLFNBQVMsR0FBRyxLQUFLO0FBQUEsRUFDM0U7QUFBQSxFQUdBLE1BQU0sZ0JBQWdCLENBQUMsTUFBa0IsWUFBNEI7QUFBQSxJQUNuRSxtQkFBbUIsU0FBUyxxQkFBcUI7QUFBQSxNQUMvQztBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUNELG1CQUFtQixTQUFTLEtBQUs7QUFBQTtBQUFBLEVBR25DLE1BQU0sVUFBVSxJQUFJLE9BQU8scUJBQU0sR0FBRyxLQUFLO0FBQUEsRUFDekMsTUFBTSxpQkFBaUIsSUFBSSxNQUFNLE1BQU0sWUFBWSxNQUFNO0FBQUEsRUFDekQsTUFBTSxlQUFlLFVBQVU7QUFBQSxFQUUvQixNQUFNLG9CQUFvQixZQUFZLFNBQVM7QUFBQSxFQUMvQyxNQUFNLGtCQUFrQixvQkFBb0I7QUFBQSxFQUU1Qyx1QkFDRTtBQUFBLGNBc0RFO0FBQUEsc0JBckRBLFNBaURFLGVBakRGO0FBQUEsUUFDRSxJQUFJLFlBQVksSUFBSSxPQUFPLFlBQVk7QUFBQSxRQUN2QyxNQUFLO0FBQUEsUUFDTCxlQUFhLFlBQVksSUFBSSxPQUFPLFlBQVk7QUFBQSxRQUNoRCxNQUFNO0FBQUEsUUFDTixXQUFXLEdBQ1QscURBQ0Msa0JBQWtCLHNDQUNuQixnQkFBZ0IsY0FDaEIsU0FDRjtBQUFBLFFBVkYsMEJBZUUsU0FpQ0UsT0FqQ0Y7QUFBQSxVQUFLLFdBQVU7QUFBQSxVQUFmLFVBaUNFO0FBQUEsNEJBL0JBLFNBT0UsT0FQRjtBQUFBLGNBQ0UsV0FBVyxHQUNULDBGQUNBLFdBQVcsZ0RBQ2I7QUFBQSxjQUpGLFVBTUcsSUFBSSxLQUFLO0FBQUEsZUFOWixpQ0FPRTtBQUFBLFlBR0QsWUFBWSxNQUFNLEdBQUcsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLDZCQUM5QyxTQUFDLE9BQUQ7QUFBQSxjQUVFLFdBQVU7QUFBQSxjQUNWLGVBQWEsT0FBTztBQUFBLGVBRmYsU0FBUyxZQURoQixzQkFJQSxDQUNEO0FBQUEsWUFHQSxtQ0FDQyxTQVNFLE9BVEY7QUFBQSxjQUNFLFdBQVU7QUFBQSxjQUNWLFNBQVMsQ0FBQyxNQUFNO0FBQUEsZ0JBQ2QsRUFBRSxnQkFBZ0I7QUFBQSxnQkFFbEIsY0FBYyxLQUFLLFdBQVc7QUFBQTtBQUFBLGNBTGxDLFVBU0U7QUFBQSxnQkFURjtBQUFBLGdCQVFJO0FBQUEsZ0JBUko7QUFBQTtBQUFBLCtDQVNFO0FBQUE7QUFBQSxXQS9CTixnQ0FpQ0U7QUFBQSxTQWhESixpQ0FpREU7QUFBQSxzQkFHRixTQUFDLGdCQUFEO0FBQUEsUUFBZ0IsS0FBSztBQUFBLFNBQXJCLGlDQUF5QztBQUFBO0FBQUEsS0FyRDNDLGdDQXNERTtBQUFBOzs7QUV6SE4sNEJBQVMsNEJBQWlCO0FBQzFCOztBQUtPLElBQU0sY0FBd0IsTUFBTTtBQUFBLEVBQ3pDO0FBQUEsSUFDRTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLE1BQ0UsbUJBQW1CO0FBQUEsRUFHdkIsTUFBTSxXQUFXLFFBQVEsTUFBTTtBQUFBLElBQzdCLE1BQU0sT0FBTyxxQkFBTSxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxZQUFZLENBQUM7QUFBQSxJQUM1RCxNQUFNLFlBQVkscUJBQU0sY0FBYyxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDO0FBQUEsSUFHdEUsU0FBUyxJQUFJLEVBQUcsSUFBSSxnQkFBZ0IsS0FBSztBQUFBLE1BQ3ZDLE1BQU0sWUFBWSxLQUFLLE1BQU07QUFBQSxNQUM3QixNQUFNLGlCQUFpQixVQUFVLE1BQU07QUFBQSxNQUN2QyxJQUFJO0FBQUEsUUFBVyxLQUFLLEtBQUssU0FBUztBQUFBLE1BQ2xDLElBQUk7QUFBQSxRQUFnQixVQUFVLEtBQUssY0FBYztBQUFBLElBQ25EO0FBQUEsSUFFQSxPQUFPLEVBQUUsTUFBTSxVQUFVO0FBQUEsS0FFeEIsQ0FBQyxnQkFBZ0IsYUFBYSxDQUFDO0FBQUEsRUFFbEMsdUJBQ0UsU0E4QkUsT0E5QkY7QUFBQSxJQUNFLFdBQVcsR0FDVCw2QkFDQSxvQkFBb0Isc0JBQ3BCLG1CQUNGO0FBQUEsSUFDQSxlQUFZO0FBQUEsSUFOZCxVQVFHLFNBQVMsS0FBSyxJQUFJLENBQUMsU0FBUywwQkFDM0IsU0FtQkUsa0JBbkJGO0FBQUEsTUFBK0IsTUFBSztBQUFBLE1BQXBDLDBCQUNFLFNBaUJFLFFBQU8sS0FqQlQ7QUFBQSxRQUVFLFNBQVMsRUFBRSxTQUFTLEdBQUcsR0FBRyxJQUFJO0FBQUEsUUFDOUIsU0FBUyxFQUFFLFNBQVMsR0FBRyxHQUFHLEVBQUU7QUFBQSxRQUM1QixNQUFNLEVBQUUsU0FBUyxHQUFHLEdBQUcsSUFBSTtBQUFBLFFBQzNCLFlBQVk7QUFBQSxVQUNWLFVBQVU7QUFBQSxVQUNWLE1BQU07QUFBQSxVQUNOLE9BQU8sUUFBUTtBQUFBLFFBQ2pCO0FBQUEsUUFDQSxXQUFVO0FBQUEsUUFDVixlQUFhLGtCQUFrQjtBQUFBLFFBWGpDLFVBaUJFO0FBQUEsMEJBSkEsU0FBc0QsUUFBdEQ7QUFBQSxZQUFNLFdBQVU7QUFBQSxZQUFoQixVQUE0QztBQUFBLGFBQTVDLGlDQUFzRDtBQUFBLDBCQUN0RCxTQUVFLFFBRkY7QUFBQSxZQUFNLFdBQVU7QUFBQSxZQUFoQixVQUNHLFNBQVMsVUFBVTtBQUFBLGFBRHRCLGlDQUVFO0FBQUE7QUFBQSxTQWZHLFNBRFAscUJBaUJFO0FBQUEsT0FsQmtCLFNBQXRCLHNCQW1CRSxDQUNIO0FBQUEsS0E3QkgsaUNBOEJFO0FBQUE7OztBQzlEQyxJQUFNLHVCQUF1QjtBQUM3QixJQUFNLG9CQUFvQjtBQUMxQixJQUFNLG1CQUFtQjs7OztBQ29CekIsSUFBTSxrQkFBa0QsR0FBRyxXQUFXO0FBQUEsRUFDM0UsUUFBUSxRQUFRLGlCQUFpQixtQkFBbUI7QUFBQSxFQUVwRCxNQUFNLFlBQVksS0FBSztBQUFBLEVBQ3ZCLE1BQU0sVUFBVSxLQUFLO0FBQUEsRUFHckIsTUFBTSxhQUFhLE9BQU8sT0FBTyxDQUFDLE1BQU07QUFBQSxJQUN0QyxNQUFNLGVBQ0osRUFBRSxNQUFNLGNBQWMsVUFBVSxRQUFRLEtBQUssQ0FBQyxLQUM5QyxFQUFFLE1BQU0sZUFBZSxRQUFRLE1BQU0sS0FBSyxDQUFDO0FBQUEsSUFDN0MsTUFBTSxhQUNKLEVBQUUsSUFBSSxjQUFjLFVBQVUsUUFBUSxLQUFLLENBQUMsS0FDNUMsRUFBRSxJQUFJLGVBQWUsUUFBUSxNQUFNLEtBQUssQ0FBQztBQUFBLElBQzNDLE1BQU0sWUFDSixFQUFFLE1BQU0sU0FBUyxVQUFVLFFBQVEsS0FBSyxDQUFDLEtBQ3pDLEVBQUUsSUFBSSxRQUFRLFFBQVEsTUFBTSxLQUFLLENBQUM7QUFBQSxJQUNwQyxPQUFPLGdCQUFnQixjQUFjO0FBQUEsR0FDdEM7QUFBQSxFQUdELE1BQU0saUJBQWlCLFdBQVcsT0FDaEMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxLQUFLLEVBQUUsT0FBTyxLQUFLLElBQUksQ0FDdEM7QUFBQSxFQUNBLE1BQU0sa0JBQWtCLFdBQVcsT0FDakMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxLQUFLLEVBQUUsT0FBTyxLQUFLLE1BQU0sQ0FDeEM7QUFBQSxFQUdBLE1BQU0saUJBQWlCLENBQUMsR0FBRyxjQUFjLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTTtBQUFBLElBQ3hELE1BQU0sWUFBWSxFQUFFLE1BQU0sS0FBSyxFQUFFLEtBQUs7QUFBQSxJQUN0QyxJQUFJLGNBQWM7QUFBQSxNQUFHLE9BQU87QUFBQSxJQUM1QixPQUFPLEVBQUUsSUFBSSxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUUsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLEdBQ2hEO0FBQUEsRUFHRCxNQUFNLGtCQUFrQixDQUFDLEdBQUcsZUFBZSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQ3BELEVBQUUsTUFBTSxLQUFLLEVBQUUsS0FBSyxDQUN0QjtBQUFBLEVBR0EsTUFBTSxPQUFzRSxDQUFDO0FBQUEsRUFDN0UsU0FBUyxNQUFNLEVBQUcsTUFBTSxjQUFjLE9BQU87QUFBQSxJQUMzQyxLQUFLLE9BQU8sQ0FBQztBQUFBLElBQ2IsU0FBUyxNQUFNLEVBQUcsTUFBTSxHQUFHLE9BQU87QUFBQSxNQUNoQyxLQUFLLEtBQUssT0FBTyxFQUFFLE9BQU8sT0FBTyxPQUFPLEtBQUs7QUFBQSxJQUMvQztBQUFBLEVBQ0Y7QUFBQSxFQUVBLE1BQU0saUJBQW1DLENBQUM7QUFBQSxFQUcxQyxXQUFXLFNBQVMsZ0JBQWdCO0FBQUEsSUFDbEMsTUFBTSxhQUFhLHFCQUFNLElBQUksTUFBTSxNQUFNLFFBQVEsS0FBSyxHQUFHLFNBQVM7QUFBQSxJQUNsRSxNQUFNLFdBQVcscUJBQU0sSUFBSSxNQUFNLElBQUksUUFBUSxLQUFLLEdBQUcsT0FBTztBQUFBLElBQzVELE1BQU0sV0FBVyxLQUFLLElBQUksR0FBRyxXQUFXLEtBQUssV0FBVyxLQUFLLENBQUM7QUFBQSxJQUM5RCxNQUFNLFNBQVMsS0FBSyxJQUFJLEdBQUcsU0FBUyxLQUFLLFdBQVcsS0FBSyxDQUFDO0FBQUEsSUFHMUQsSUFBSSxxQkFBcUI7QUFBQSxJQUd6QixJQUFJLGNBQWM7QUFBQSxJQUNsQixTQUFTLE1BQU0sRUFBRyxNQUFNLGNBQWMsT0FBTztBQUFBLE1BQzNDLElBQUksV0FBVztBQUFBLE1BQ2YsU0FBUyxNQUFNLFNBQVUsT0FBTyxRQUFRLE9BQU87QUFBQSxRQUM3QyxJQUFJLEtBQUssS0FBSyxLQUFLLE9BQU87QUFBQSxVQUN4QixXQUFXO0FBQUEsVUFDWDtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFDQSxJQUFJLFVBQVU7QUFBQSxRQUNaLGNBQWM7QUFBQSxRQUNkO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUdBLElBQUksZ0JBQWdCLElBQUk7QUFBQSxNQUN0QixTQUFTLE1BQU0sU0FBVSxPQUFPLFFBQVEsT0FBTztBQUFBLFFBQzdDLEtBQUssYUFBYSxPQUFPLEVBQUUsT0FBTyxNQUFNLE1BQU07QUFBQSxNQUNoRDtBQUFBLE1BR0EsTUFBTSxXQUFXLFNBQVMsV0FBVztBQUFBLE1BQ3JDLGVBQWUsS0FBSztBQUFBLFFBQ2xCLE1BQU8sV0FBVyxJQUFLO0FBQUEsUUFDdkIsT0FBUSxXQUFXLElBQUs7QUFBQSxRQUN4QixLQUNFLG9CQUNBLHVCQUNBLGVBQWUsbUJBQW1CO0FBQUEsUUFDcEMsUUFBUTtBQUFBLFFBQ1IsVUFBVTtBQUFBLFdBQ1A7QUFBQSxNQUNMLENBQUM7QUFBQSxNQUNELHFCQUFxQjtBQUFBLElBQ3ZCO0FBQUEsSUFHQSxLQUFLLG9CQUFvQjtBQUFBLE1BQ3ZCLFNBQ00sY0FBYyxXQUFXLEVBQzdCLGVBQWUsUUFDZixlQUNBO0FBQUEsUUFFQSxJQUFJLHVCQUF1QjtBQUFBLFFBQzNCLFNBQVMsTUFBTSxFQUFHLE1BQU0sY0FBYyxPQUFPO0FBQUEsVUFDM0MsSUFBSSxXQUFXO0FBQUEsVUFDZixTQUFTLE1BQU0sWUFBYSxPQUFPLFFBQVEsT0FBTztBQUFBLFlBQ2hELElBQUksS0FBSyxLQUFLLEtBQUssT0FBTztBQUFBLGNBQ3hCLFdBQVc7QUFBQSxjQUNYO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxVQUNBLElBQUksVUFBVTtBQUFBLFlBQ1osdUJBQXVCO0FBQUEsWUFDdkI7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLFFBR0EsSUFBSSx5QkFBeUIsSUFBSTtBQUFBLFVBQy9CLFNBQVMsTUFBTSxZQUFhLE9BQU8sUUFBUSxPQUFPO0FBQUEsWUFDaEQsS0FBSyxzQkFBc0IsT0FBTyxFQUFFLE9BQU8sTUFBTSxNQUFNO0FBQUEsVUFDekQ7QUFBQSxVQUdBLE1BQU0sb0JBQW9CLFNBQVMsY0FBYztBQUFBLFVBQ2pELGVBQWUsS0FBSztBQUFBLFlBQ2xCLE1BQU8sY0FBYyxJQUFLO0FBQUEsWUFDMUIsT0FBUSxvQkFBb0IsSUFBSztBQUFBLFlBQ2pDLEtBQ0Usb0JBQ0EsdUJBQ0Esd0JBQXdCLG1CQUFtQjtBQUFBLFlBQzdDLFFBQVE7QUFBQSxZQUNSLFVBQVU7QUFBQSxlQUNQO0FBQUEsVUFDTCxDQUFDO0FBQUEsVUFDRCxxQkFBcUI7QUFBQSxVQUNyQjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUdBLFdBQVcsU0FBUyxpQkFBaUI7QUFBQSxJQUNuQyxNQUFNLGFBQWEscUJBQU0sSUFBSSxNQUFNLE1BQU0sUUFBUSxLQUFLLEdBQUcsU0FBUztBQUFBLElBQ2xFLE1BQU0sTUFBTSxLQUFLLElBQUksR0FBRyxXQUFXLEtBQUssV0FBVyxLQUFLLENBQUM7QUFBQSxJQUd6RCxJQUFJLGNBQWM7QUFBQSxJQUNsQixTQUFTLE1BQU0sRUFBRyxNQUFNLGNBQWMsT0FBTztBQUFBLE1BQzNDLEtBQUssS0FBSyxLQUFLLEtBQUssT0FBTztBQUFBLFFBQ3pCLGNBQWM7QUFBQSxRQUNkO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUdBLElBQUksZ0JBQWdCLElBQUk7QUFBQSxNQUN0QixLQUFLLGFBQWEsT0FBTyxFQUFFLE9BQU8sTUFBTSxNQUFNO0FBQUEsTUFHOUMsZUFBZSxLQUFLO0FBQUEsUUFDbEIsTUFBTyxNQUFNLElBQUs7QUFBQSxRQUNsQixPQUFRLElBQUksSUFBSztBQUFBLFFBQ2pCLEtBQ0Usb0JBQ0EsdUJBQ0EsZUFBZSxtQkFBbUI7QUFBQSxRQUNwQyxRQUFRO0FBQUEsUUFDUixVQUFVO0FBQUEsV0FDUDtBQUFBLE1BQ0wsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQUEsRUFFQSx1QkFDRSxTQXlCRSxPQXpCRjtBQUFBLElBQUssV0FBVTtBQUFBLElBQWYsVUFDRyxlQUFlLElBQUksQ0FBQyxVQUFVO0FBQUEsTUFDN0IsdUJBQ0UsU0FtQkUsT0FuQkY7QUFBQSxRQUlFLFdBQVU7QUFBQSxRQUNWLE9BQU87QUFBQSxVQUNMLE1BQU0sUUFBUSxNQUFNO0FBQUEsVUFDcEIsT0FBTyxRQUFRLE1BQU07QUFBQSxVQUNyQixLQUFLLEdBQUcsTUFBTTtBQUFBLFVBQ2QsUUFBUSxHQUFHO0FBQUEsUUFDYjtBQUFBLFFBVkYsMEJBWUUsU0FBQyxnQkFBRDtBQUFBLFVBQ0UsV0FBVyxTQUFTLE1BQU0sTUFDeEIsTUFBTSxZQUNKLFVBQVUsT0FBTyxZQUFZO0FBQUEsVUFDakM7QUFBQSxVQUNBLFdBQVU7QUFBQSxXQUxaLGlDQU1BO0FBQUEsU0FqQkssU0FBUyxNQUFNLE1BQU0sTUFBTSxZQUFZLFVBQVUsT0FDcEQsWUFDRixLQUhGLHNCQW1CRTtBQUFBLEtBRUw7QUFBQSxLQXhCSCxpQ0F5QkU7QUFBQTs7OztBOUIzTkMsSUFBTSxZQUFzQyxHQUFHLGVBQWUsUUFBUTtBQUFBLEVBQzNFLE1BQU0scUJBQXFCLE9BQU0sT0FJOUIsSUFBSTtBQUFBLEVBQ1AsUUFBUSxhQUFhLG1CQUFtQixtQkFBbUI7QUFBQSxFQUczRCxNQUFNLGtCQUFrQixZQUFZLFFBQVEsT0FBTztBQUFBLEVBSW5ELElBQUksNkJBQTZCLGdCQUFnQixNQUFNO0FBQUEsRUFDdkQsT0FBTywyQkFBMkIsSUFBSSxNQUFNLGdCQUFnQjtBQUFBLElBQzFELDZCQUE2QiwyQkFBMkIsU0FBUyxHQUFHLEtBQUs7QUFBQSxFQUMzRTtBQUFBLEVBSUEsTUFBTSxlQUFlLFNBQVEsTUFBTTtBQUFBLElBRWpDLE1BQU0sT0FBd0IsQ0FBQyxDQUFDLENBQUM7QUFBQSxJQUNqQyxJQUFJLE1BQU0sMkJBQTJCLE1BQU07QUFBQSxJQUMzQyxTQUFTLElBQUksRUFBRyxJQUFJLElBQUksS0FBSztBQUFBLE1BQzNCLElBQUksS0FBSyxLQUFLLFNBQVMsR0FBRyxXQUFXLEdBQUc7QUFBQSxRQUN0QyxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQUEsTUFDZDtBQUFBLE1BQ0EsS0FBSyxLQUFLLFNBQVMsR0FBRyxLQUFLLEdBQUc7QUFBQSxNQUM5QixNQUFNLElBQUksSUFBSSxHQUFHLEtBQUs7QUFBQSxJQUN4QjtBQUFBLElBQ0EsT0FBTztBQUFBLEtBQ04sQ0FBQywwQkFBMEIsQ0FBQztBQUFBLEVBRS9CLHVCQUNFLFNBbURFLE9BbkRGO0FBQUEsSUFBSyxXQUFVO0FBQUEsSUFBdUIsZUFBWTtBQUFBLElBQWxELFVBbURFO0FBQUEsc0JBakRBLFNBQUMsYUFBRCxxQ0FBYTtBQUFBLHNCQUdiLFNBMENFLE9BMUNGO0FBQUEsUUFDRSxXQUFVO0FBQUEsUUFDVixlQUFZO0FBQUEsUUFGZCwwQkFJRSxTQXFDRSxrQkFyQ0Y7QUFBQSxVQUFpQixNQUFLO0FBQUEsVUFBdEIsMEJBQ0UsU0FtQ0UsUUFBTyxLQW5DVDtBQUFBLFlBRUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtBQUFBLFlBQ3RCLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFBQSxZQUN0QixNQUFNLEVBQUUsU0FBUyxFQUFFO0FBQUEsWUFDbkIsWUFBWSxFQUFFLFVBQVUsTUFBTSxNQUFNLFlBQVk7QUFBQSxZQUNoRCxXQUFVO0FBQUEsWUFDVixlQUFZO0FBQUEsWUFQZCxVQVVHLGFBQWEsSUFBSSxDQUFDLE1BQU0sVUFBVTtBQUFBLGNBQ2pDLHVCQUNFLFNBb0JFLE9BcEJGO0FBQUEsZ0JBRUUsV0FBVTtBQUFBLGdCQUNWLGVBQWEsWUFBWTtBQUFBLGdCQUgzQixVQW9CRTtBQUFBLGtCQWZDLEtBQUssSUFBSSxDQUFDLEtBQUssYUFBYTtBQUFBLG9CQUMzQix1QkFDRSxTQUFDLFNBQUQ7QUFBQSxzQkFDRSxPQUFPO0FBQUEsc0JBQ1A7QUFBQSxzQkFDQTtBQUFBLHNCQUVBLFdBQVU7QUFBQSx1QkFETCxJQUFJLE9BQU8sWUFBWSxHQUo5QixzQkFNQTtBQUFBLG1CQUVIO0FBQUEsa0NBRUQsU0FFRSxPQUZGO0FBQUEsb0JBQUssV0FBVTtBQUFBLG9CQUFmLDBCQUNFLFNBQUMsaUJBQUQ7QUFBQSxzQkFBaUI7QUFBQSx1QkFBakIsaUNBQTZCO0FBQUEscUJBRC9CLGlDQUVFO0FBQUE7QUFBQSxpQkFsQkcsUUFBUSxTQURmLHFCQW9CRTtBQUFBLGFBRUw7QUFBQSxhQWpDSSxZQUFZLE9BQU8sWUFBWSxHQUR0QyxzQkFtQ0U7QUFBQSxXQXBDSixpQ0FxQ0U7QUFBQSxTQXpDSixpQ0EwQ0U7QUFBQSxzQkFHRixTQUFDLGdCQUFEO0FBQUEsUUFBZ0IsS0FBSztBQUFBLFNBQXJCLGlDQUF5QztBQUFBO0FBQUEsS0FsRDNDLGdDQW1ERTtBQUFBOzs7QStCOUZOOzs7QUNBQSxvQkFBZ0I7O0FBTVQsSUFBTSxnQkFBMEIsTUFBTTtBQUFBLEVBQzNDLFFBQVEsYUFBYSx1QkFBdUIsbUJBQzFDLG1CQUFtQjtBQUFBLEVBR3JCLE1BQU0sY0FBYyxZQUFZLFFBQVEsTUFBTSxFQUFFLElBQUksY0FBYztBQUFBLEVBRWxFLE1BQU0sc0JBQXNCLFlBQVksU0FBUyxXQUFXLElBQ3hELFlBQVksU0FBUyxHQUFHLE1BQU0sSUFDOUI7QUFBQSxFQUNKLE1BQU0sWUFBWSxvQkFBb0IsSUFBSSxHQUFHLEtBQUs7QUFBQSxFQUdsRCxNQUFNLFdBQVcsQ0FBQztBQUFBLEVBQ2xCLFNBQVMsSUFBSSxFQUFHLElBQUksR0FBRyxLQUFLO0FBQUEsSUFDMUIsU0FBUyxLQUFLLG9CQUFvQixJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQUEsRUFDakQ7QUFBQSxFQUdBLE1BQU0sb0JBQW9CLG9CQUFvQixTQUFTLEdBQUcsS0FBSztBQUFBLEVBQy9ELE1BQU0sa0JBQWtCLFVBQVUsSUFBSSxHQUFHLEtBQUs7QUFBQSxFQUM5QyxNQUFNLFlBQVksc0JBQXNCLG1CQUFtQixlQUFlO0FBQUEsRUFHMUUsTUFBTSxhQUFhLFVBQVUsT0FBTyxDQUFDLFVBQVU7QUFBQSxJQUU3QyxPQUVHLE1BQU0sTUFBTSxjQUFjLG1CQUFtQixLQUM1QyxNQUFNLE1BQU0sZUFBZSxTQUFTLEtBRXJDLE1BQU0sSUFBSSxjQUFjLG1CQUFtQixLQUMxQyxNQUFNLElBQUksZUFBZSxTQUFTLEtBRW5DLE1BQU0sTUFBTSxTQUFTLG1CQUFtQixLQUN2QyxNQUFNLElBQUksUUFBUSxTQUFTO0FBQUEsR0FFaEM7QUFBQSxFQUdELE1BQU0sZUFBZSxXQUFXLE9BQU8sQ0FBQyxVQUFVLE1BQU0sTUFBTTtBQUFBLEVBRzlELFFBQVEsMEJBQTBCLFNBQVEsTUFBTTtBQUFBLElBRTlDLE1BQU0sZUFBZSxDQUFDLEdBQUcsWUFBWSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU07QUFBQSxNQUVwRCxNQUFNLFlBQVksRUFBRSxNQUFNLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDdEMsSUFBSSxjQUFjO0FBQUEsUUFBRyxPQUFPO0FBQUEsTUFHNUIsTUFBTSxZQUFZLEVBQUUsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ3BDLE1BQU0sWUFBWSxFQUFFLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNwQyxPQUFPLFlBQVk7QUFBQSxLQUNwQjtBQUFBLElBR0QsTUFBTSxPQUF1RCxDQUFDO0FBQUEsSUFDOUQsTUFBTSxrQkFBNEMsQ0FBQztBQUFBLElBRW5ELGFBQWEsUUFBUSxDQUFDLFVBQVU7QUFBQSxNQUU5QixNQUFNLGFBQWEsTUFBTSxNQUFNLFNBQVMsbUJBQW1CLElBQ3ZELHNCQUNBLE1BQU07QUFBQSxNQUNWLE1BQU0sV0FBVyxNQUFNLElBQUksUUFBUSxTQUFTLElBQUksWUFBWSxNQUFNO0FBQUEsTUFHbEUsTUFBTSxnQkFBZ0IsS0FBSyxJQUN6QixHQUNBLFdBQVcsS0FBSyxxQkFBcUIsS0FBSyxDQUM1QztBQUFBLE1BQ0EsTUFBTSxjQUFjLEtBQUssSUFBSSxHQUFHLFNBQVMsS0FBSyxxQkFBcUIsS0FBSyxDQUFDO0FBQUEsTUFFekUsTUFBTSxPQUFRLGdCQUFnQixJQUFLO0FBQUEsTUFDbkMsTUFBTSxTQUFVLGNBQWMsZ0JBQWdCLEtBQUssSUFBSztBQUFBLE1BR3hELElBQUksV0FBVztBQUFBLE1BQ2YsSUFBSSxTQUFTO0FBQUEsTUFFYixRQUFRLFFBQVE7QUFBQSxRQUNkLElBQUksWUFBWSxLQUFLLFFBQVE7QUFBQSxVQUUzQixLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQUEsVUFDWixTQUFTO0FBQUEsUUFDWCxFQUFPO0FBQUEsVUFFTCxNQUFNLE1BQU0sS0FBSztBQUFBLFVBQ2pCLE1BQU0sU0FBUyxJQUFJLE1BQU0sQ0FBQyxTQUFTO0FBQUEsWUFDakMsT0FDRSxXQUFXLFFBQVEsS0FBSyxHQUFHLEtBQzNCLFNBQVMsU0FBUyxLQUFLLE1BQU0sS0FBSztBQUFBLFdBRXJDO0FBQUEsVUFFRCxJQUFJLFFBQVE7QUFBQSxZQUNWLFNBQVM7QUFBQSxVQUNYLEVBQU87QUFBQSxZQUNMO0FBQUE7QUFBQTtBQUFBLE1BR047QUFBQSxNQUdBLEtBQUssVUFBVSxLQUFLLEVBQUUsS0FBSyxVQUFVLE1BQU0sQ0FBQztBQUFBLE1BRzVDLGdCQUFnQixLQUFLO0FBQUEsV0FDaEI7QUFBQSxRQUNIO0FBQUEsUUFDQTtBQUFBLFFBQ0EsS0FBSyxZQUFZLG1CQUFtQjtBQUFBLFFBQ3BDLFFBQVE7QUFBQSxRQUNSLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxLQUNGO0FBQUEsSUFFRCxPQUFPO0FBQUEsTUFDTCx1QkFBdUI7QUFBQSxNQUN2QixpQkFBaUIsS0FBSyxJQUFJLEdBQUcsS0FBSyxNQUFNO0FBQUEsSUFDMUM7QUFBQSxLQUNDLENBQUMsY0FBYyxxQkFBcUIsU0FBUyxDQUFDO0FBQUEsRUFFakQsdUJBQ0UsU0E0Q0UsT0E1Q0Y7QUFBQSxJQUNFLFdBQVU7QUFBQSxJQUNWLGVBQVk7QUFBQSxJQUZkLFVBNENFO0FBQUEsc0JBdkNBLFNBSUUsT0FKRjtBQUFBLFFBQUssV0FBVTtBQUFBLFFBQWYsMEJBQ0UsU0FFRSxRQUZGO0FBQUEsVUFBTSxXQUFVO0FBQUEsVUFBaEI7QUFBQSw0Q0FFRTtBQUFBLFNBSEosaUNBSUU7QUFBQSxNQUdELFNBQVMsSUFBSSxDQUFDLHdCQUNiLFNBQUMsZUFBRDtBQUFBLFFBRUUsSUFBSSxnQkFBZ0IsSUFBSSxPQUFPLFlBQVk7QUFBQSxRQUMzQyxNQUFLO0FBQUEsUUFDTCxNQUFNO0FBQUEsUUFDTixXQUFVO0FBQUEsU0FKTCxXQUFXLElBQUksT0FBTyxZQUFZLEtBRHpDLHNCQU1BLENBQ0Q7QUFBQSxzQkFHRCxTQW9CRSxPQXBCRjtBQUFBLFFBQUssV0FBVTtBQUFBLFFBQWYsVUFDRyxzQkFBc0IsSUFBSSxDQUFDLE9BQU8sMEJBQ2pDLFNBZ0JFLE9BaEJGO0FBQUEsVUFFRSxXQUFVO0FBQUEsVUFDVixPQUFPO0FBQUEsWUFDTCxNQUFNLEdBQUcsTUFBTTtBQUFBLFlBQ2YsT0FBTyxRQUFRLE1BQU07QUFBQSxZQUNyQixLQUFLLEdBQUcsTUFBTTtBQUFBLFlBQ2QsUUFBUSxHQUFHLE1BQU07QUFBQSxVQUNuQjtBQUFBLFVBUkYsMEJBVUUsU0FBQyxnQkFBRDtBQUFBLFlBQ0UsV0FBVyxXQUFXLE1BQU0sTUFBTTtBQUFBLFlBQ2xDO0FBQUEsWUFFQSxXQUFVO0FBQUEsYUFETCxXQUFXLE1BQU0sTUFBTSxTQUg5QixzQkFLQTtBQUFBLFdBZEsscUJBQXFCLE1BQU0sTUFEbEMsc0JBZ0JFLENBQ0g7QUFBQSxTQW5CSCxpQ0FvQkU7QUFBQTtBQUFBLEtBM0NKLGdDQTRDRTtBQUFBOzs7QUM5S04sNEJBQVMsNEJBQWlCO0FBQUE7QUFHbkIsSUFBTSxhQUF1QixNQUFNO0FBQUEsRUFDeEM7QUFBQSxJQUNFO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxNQUNFLG1CQUFtQjtBQUFBLEVBR3ZCLE1BQU0sY0FBYyxZQUFZLFFBQVEsTUFBTSxFQUFFLElBQUksY0FBYztBQUFBLEVBRWxFLE1BQU0sc0JBQXNCLFlBQVksU0FBUyxXQUFXLElBQ3hELFlBQVksU0FBUyxHQUFHLE1BQU0sSUFDOUI7QUFBQSxFQUdKLE1BQU0sV0FBVyxDQUFDO0FBQUEsRUFDbEIsU0FBUyxJQUFJLEVBQUcsSUFBSSxHQUFHLEtBQUs7QUFBQSxJQUMxQixTQUFTLEtBQUssb0JBQW9CLElBQUksR0FBRyxLQUFLLENBQUM7QUFBQSxFQUNqRDtBQUFBLEVBRUEsdUJBRUUsU0F1REUsT0F2REY7QUFBQSxJQUNFLFdBQVcsR0FDVCxpRUFDQSxvQkFBb0Isc0JBQ3BCLG1CQUNGO0FBQUEsSUFDQSxlQUFZO0FBQUEsSUFOZCxVQXVERTtBQUFBLHNCQTlDQSxTQUtFLE9BTEY7QUFBQSxRQUFLLFdBQVU7QUFBQSxRQUFmLDBCQUNFLFNBR0UsT0FIRjtBQUFBLFVBQUssV0FBVTtBQUFBLFVBQWYsVUFHRTtBQUFBLDRCQUZBLFNBQXNELFFBQXREO0FBQUEsY0FBTSxXQUFVO0FBQUEsY0FBaEI7QUFBQSxnREFBc0Q7QUFBQSw0QkFDdEQsU0FBb0QsUUFBcEQ7QUFBQSxjQUFNLFdBQVU7QUFBQSxjQUFoQixVQUErQixZQUFZLEtBQUs7QUFBQSxlQUFoRCxpQ0FBb0Q7QUFBQTtBQUFBLFdBRnRELGdDQUdFO0FBQUEsU0FKSixpQ0FLRTtBQUFBLE1BR0QsU0FBUyxJQUFJLENBQUMsS0FBSyxVQUFVO0FBQUEsUUFDNUIsTUFBTSxVQUFVLElBQUksT0FBTyxxQkFBTSxHQUFHLEtBQUs7QUFBQSxRQUV6Qyx1QkFDRSxTQStCRSxrQkEvQkY7QUFBQSxVQUFnRCxNQUFLO0FBQUEsVUFBckQsMEJBQ0UsU0E2QkUsUUFBTyxLQTdCVDtBQUFBLFlBRUUsU0FBUyxFQUFFLFNBQVMsR0FBRyxHQUFHLElBQUk7QUFBQSxZQUM5QixTQUFTLEVBQUUsU0FBUyxHQUFHLEdBQUcsRUFBRTtBQUFBLFlBQzVCLE1BQU0sRUFBRSxTQUFTLEdBQUcsR0FBRyxJQUFJO0FBQUEsWUFDM0IsWUFBWTtBQUFBLGNBQ1YsVUFBVTtBQUFBLGNBQ1YsTUFBTTtBQUFBLGNBQ04sT0FBTyxRQUFRO0FBQUEsWUFDakI7QUFBQSxZQUNBLFdBQVcsR0FDVCxrRkFDQSxXQUFXLHlCQUNiO0FBQUEsWUFDQSxTQUFTLE1BQU07QUFBQSxjQUNiLFdBQVcsR0FBRztBQUFBLGNBQ2QsY0FBYyxHQUFHO0FBQUE7QUFBQSxZQUVuQixlQUFhLG1CQUFtQixJQUFJLE9BQU8sTUFBTSxFQUFFLFlBQVk7QUFBQSxZQWxCakUsVUE2QkU7QUFBQSw4QkFUQSxTQUF5RCxPQUF6RDtBQUFBLGdCQUFLLFdBQVU7QUFBQSxnQkFBZixVQUFxQyxJQUFJLE9BQU8sS0FBSztBQUFBLGlCQUFyRCxpQ0FBeUQ7QUFBQSw4QkFDekQsU0FPRSxPQVBGO0FBQUEsZ0JBQ0UsV0FBVyxHQUNULHVHQUNBLFdBQVcsb0NBQ2I7QUFBQSxnQkFKRixVQU1HLElBQUksS0FBSztBQUFBLGlCQU5aLGlDQU9FO0FBQUE7QUFBQSxhQTNCRyxJQUFJLE9BQU8sWUFBWSxHQUQ5QixxQkE2QkU7QUFBQSxXQTlCa0IsSUFBSSxPQUFPLFlBQVksR0FBN0Msc0JBK0JFO0FBQUEsT0FFTDtBQUFBO0FBQUEsS0F0REgsZ0NBdURFO0FBQUE7OztBQ3BGTixvQkFBUztBQWVGLElBQU0sd0JBQXdCLEdBQUcsVUFBc0M7QUFBQSxFQUM1RSxRQUFRLDBCQUEwQixtQkFBbUI7QUFBQSxFQUVyRCxNQUFNLGNBQWMsU0FBMEIsTUFBTTtBQUFBLElBQ2xELElBQUksZUFBZSxzQkFDakIsSUFBSSxRQUFRLEtBQUssR0FDakIsSUFBSSxNQUFNLEtBQUssQ0FDakI7QUFBQSxJQUdBLGVBQWUsYUFDWixPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFDdkIsU0FBUyxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sS0FBSyxFQUFFLEtBQUssQ0FBQztBQUFBLElBRTNDLElBQUksYUFBYSxXQUFXLEdBQUc7QUFBQSxNQUM3QixPQUFPLENBQUM7QUFBQSxJQUNWO0FBQUEsSUFHQSxNQUFNLFdBQThCLENBQUM7QUFBQSxJQUNyQyxJQUFJLGlCQUFrQyxDQUFDO0FBQUEsSUFDdkMsSUFBSSxlQUFtQztBQUFBLElBQ3ZDLFdBQVcsU0FBUyxjQUFjO0FBQUEsTUFDaEMsSUFBSSxnQkFBZ0IsTUFBTSxNQUFNLGNBQWMsWUFBWSxHQUFHO0FBQUEsUUFDM0QsSUFBSSxlQUFlLFNBQVMsR0FBRztBQUFBLFVBQzdCLFNBQVMsS0FBSyxjQUFjO0FBQUEsUUFDOUI7QUFBQSxRQUNBLGlCQUFpQixDQUFDO0FBQUEsTUFDcEI7QUFBQSxNQUNBLGVBQWUsS0FBSyxLQUFLO0FBQUEsTUFDekIsZUFBZSxlQUNYLHFCQUFNLElBQUksY0FBYyxNQUFNLEdBQUcsSUFDakMsTUFBTTtBQUFBLElBQ1o7QUFBQSxJQUNBLElBQUksZUFBZSxTQUFTLEdBQUc7QUFBQSxNQUM3QixTQUFTLEtBQUssY0FBYztBQUFBLElBQzlCO0FBQUEsSUFHQSxNQUFNLGtCQUFvQyxDQUFDO0FBQUEsSUFDM0MsV0FBVyxXQUFXLFVBQVU7QUFBQSxNQUM5QixJQUFJLFFBQVEsV0FBVyxHQUFHO0FBQUEsUUFFeEIsTUFBTSxRQUFRLFFBQVE7QUFBQSxRQUN0QixNQUFNLFlBQVksTUFBTSxNQUFNLEtBQUssSUFBSSxNQUFNLE1BQU0sT0FBTyxJQUFJO0FBQUEsUUFDOUQsSUFBSSxVQUFVLE1BQU0sSUFBSSxLQUFLLElBQUksTUFBTSxJQUFJLE9BQU8sSUFBSTtBQUFBLFFBQ3RELElBQUksVUFBVSxXQUFXO0FBQUEsVUFFdkIsVUFBVTtBQUFBLFFBQ1o7QUFBQSxRQUNBLE1BQU0sZ0JBQWdCLFVBQVU7QUFBQSxRQUNoQyxNQUFNLE1BQU8sWUFBWSxLQUFNO0FBQUEsUUFDL0IsTUFBTSxTQUFVLGdCQUFnQixLQUFNO0FBQUEsUUFDdEMsZ0JBQWdCLEtBQUssS0FBSyxPQUFPLE1BQU0sR0FBRyxPQUFPLEtBQUssS0FBSyxPQUFPLENBQUM7QUFBQSxRQUNuRTtBQUFBLE1BQ0Y7QUFBQSxNQUlBLE1BQU0sZUFBZSxDQUFDLEdBQUcsT0FBTyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU07QUFBQSxRQUMvQyxNQUFNLFlBQVksRUFBRSxJQUFJLEtBQUssRUFBRSxPQUFPLFFBQVE7QUFBQSxRQUM5QyxNQUFNLFlBQVksRUFBRSxJQUFJLEtBQUssRUFBRSxPQUFPLFFBQVE7QUFBQSxRQUc5QyxJQUFJLGNBQWMsV0FBVztBQUFBLFVBQzNCLE9BQU8sWUFBWTtBQUFBLFFBQ3JCO0FBQUEsUUFHQSxPQUFPLEVBQUUsTUFBTSxLQUFLLEVBQUUsS0FBSztBQUFBLE9BQzVCO0FBQUEsTUFHRCxNQUFNLGNBQWMsYUFBYTtBQUFBLE1BSWpDLElBQUk7QUFBQSxNQUNKLElBQUksZ0JBQWdCLEdBQUc7QUFBQSxRQUNyQixZQUFZO0FBQUEsTUFDZCxFQUFPLFNBQUksZ0JBQWdCLEdBQUc7QUFBQSxRQUM1QixZQUFZO0FBQUEsTUFDZCxFQUFPLFNBQUksZ0JBQWdCLEdBQUc7QUFBQSxRQUM1QixZQUFZO0FBQUEsTUFDZCxFQUFPO0FBQUEsUUFDTCxZQUFZO0FBQUE7QUFBQSxNQUdkLE1BQU0saUJBQWlCLGNBQWMsSUFBSSxhQUFhLGNBQWMsS0FBSztBQUFBLE1BRXpFLFNBQVMsSUFBSSxFQUFHLElBQUksYUFBYSxRQUFRLEtBQUs7QUFBQSxRQUM1QyxNQUFNLFFBQVEsYUFBYTtBQUFBLFFBQzNCLE1BQU0sWUFBWSxNQUFNLE1BQU0sS0FBSyxJQUFJLE1BQU0sTUFBTSxPQUFPLElBQUk7QUFBQSxRQUM5RCxJQUFJLFVBQVUsTUFBTSxJQUFJLEtBQUssSUFBSSxNQUFNLElBQUksT0FBTyxJQUFJO0FBQUEsUUFFdEQsSUFBSSxVQUFVLFdBQVc7QUFBQSxVQUV2QixVQUFVO0FBQUEsUUFDWjtBQUFBLFFBRUEsTUFBTSxnQkFBZ0IsVUFBVTtBQUFBLFFBQ2hDLE1BQU0sTUFBTyxZQUFZLEtBQU07QUFBQSxRQUMvQixNQUFNLFNBQVUsZ0JBQWdCLEtBQU07QUFBQSxRQUd0QyxJQUFJO0FBQUEsUUFDSixJQUFJO0FBQUEsUUFDSixJQUFJO0FBQUEsUUFFSixJQUFJLE1BQU0sR0FBRztBQUFBLFVBRVgsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFVBQ1IsU0FBUztBQUFBLFFBQ1gsRUFBTztBQUFBLFVBRUwsT0FBTyxpQkFBaUI7QUFBQSxVQUN4QixRQUFRLE1BQU07QUFBQSxVQUNkLFNBQVMsSUFBSTtBQUFBO0FBQUEsUUFHZixnQkFBZ0IsS0FBSztBQUFBLGFBQ2hCO0FBQUEsVUFDSDtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxRQUNGLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUFBLElBRUEsT0FBTztBQUFBLEtBQ04sQ0FBQyxLQUFLLHFCQUFxQixDQUFDO0FBQUEsRUFFL0IsT0FBTztBQUFBOzs7O0FDOUlGLElBQU0saUJBQWdEO0FBQUEsRUFDM0Q7QUFBQSxFQUNBLGVBQWU7QUFBQSxNQUNYO0FBQUEsRUFDSixNQUFNLGNBQWMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDO0FBQUEsRUFFakQsdUJBQ0UsU0E4QkUsT0E5QkY7QUFBQSxJQUNFLGVBQWE7QUFBQSxJQUNiLFdBQVU7QUFBQSxJQUZaLFVBSUcsWUFBWSxJQUFJLENBQUMsT0FBTyxVQUFVO0FBQUEsTUFDakMsTUFBTSxvQkFBb0IsU0FBUyxNQUFNLE1BQU0sU0FBUyxJQUFJLE9BQzFELFlBQ0Y7QUFBQSxNQUNBLE1BQU0sZUFBZSxNQUFNLElBQUksS0FBSyxNQUFNLE9BQU8sUUFBUSxLQUFLO0FBQUEsTUFDOUQsdUJBQ0UsU0FpQkUsT0FqQkY7QUFBQSxRQUVFLFdBQVU7QUFBQSxRQUNWLE9BQU87QUFBQSxVQUNMLE1BQU0sR0FBRyxNQUFNO0FBQUEsVUFDZixPQUFPLFFBQVEsTUFBTTtBQUFBLFVBQ3JCLEtBQUssR0FBRyxNQUFNO0FBQUEsVUFDZCxRQUFRLEdBQUcsTUFBTTtBQUFBLFFBQ25CO0FBQUEsUUFSRiwwQkFVRSxTQUFDLGdCQUFEO0FBQUEsVUFDRSxXQUFXLGFBQWE7QUFBQSxVQUN4QjtBQUFBLFVBQ0EsV0FBVyxHQUFHLGdDQUFnQztBQUFBLFlBQzVDLGdDQUFnQztBQUFBLFVBQ2xDLENBQUM7QUFBQSxXQUxILGlDQU1BO0FBQUEsU0FmSyxhQUFhLHFCQURwQixzQkFpQkU7QUFBQSxLQUVMO0FBQUEsS0E3QkgsaUNBOEJFO0FBQUE7Ozs7QUN6Q04sSUFBTSxRQUFRLE1BQU0sS0FBSyxFQUFFLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsU0FDekQscUJBQU0sRUFBRSxLQUFLLElBQUksRUFBRSxPQUFPLENBQUMsQ0FDN0I7QUFNTyxJQUFNLGFBQXdDLEdBQUcsVUFBVTtBQUFBLEVBQ2hFLHVCQUNFLFNBNEJFLE9BNUJGO0FBQUEsSUFDRSxlQUFhLGdCQUFnQixJQUFJLE9BQU8sWUFBWTtBQUFBLElBQ3BELFdBQVU7QUFBQSxJQUZaLFVBNEJFO0FBQUEsTUF4QkMsTUFBTSxJQUFJLENBQUMsU0FBUztBQUFBLFFBQ25CLE1BQU0sT0FBTyxLQUFLLEtBQUs7QUFBQSxRQUN2QixNQUFNLFdBQVcsSUFBSSxPQUFPLFlBQVk7QUFBQSxRQUV4Qyx1QkFDRSxTQUFDLGVBQUQ7QUFBQSxVQUVFLElBQUksYUFBYSxZQUFZLEtBQUssT0FBTyxJQUFJO0FBQUEsVUFDN0MsTUFBSztBQUFBLFVBQ0wsTUFBTTtBQUFBLFVBQ047QUFBQSxVQUNBLGVBQWEsa0JBQWtCLFlBQVksS0FBSyxPQUFPLElBQUk7QUFBQSxVQUMzRCxXQUFXLEdBQ1QsZ0VBQ0Y7QUFBQSxXQVJLLEdBQUcsWUFBWSxLQUFLLE9BQU8sSUFBSSxLQUR0QyxzQkFVQTtBQUFBLE9BRUg7QUFBQSxzQkFHRCxTQUFDLGdCQUFEO0FBQUEsUUFDRSxlQUFhLG1CQUFtQixJQUFJLE9BQU8sWUFBWTtBQUFBLFFBQ3ZEO0FBQUEsU0FGRixpQ0FHQTtBQUFBO0FBQUEsS0EzQkYsZ0NBNEJFO0FBQUE7Ozs7QUN2Q04sSUFBTSxTQUFRLE1BQU0sS0FBSyxFQUFFLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsU0FDekQscUJBQU0sRUFBRSxLQUFLLElBQUksRUFBRSxPQUFPLENBQUMsQ0FDN0I7QUFFTyxJQUFNLGVBQXlCLE1BQU07QUFBQSxFQUMxQyxRQUFRLGFBQWEsbUJBQW1CLG1CQUFtQjtBQUFBLEVBRzNELE1BQU0sY0FBYyxZQUFZLFFBQVEsTUFBTSxFQUFFLElBQUksY0FBYztBQUFBLEVBRWxFLE1BQU0sc0JBQXNCLFlBQVksU0FBUyxXQUFXLElBQ3hELFlBQVksU0FBUyxHQUFHLE1BQU0sSUFDOUI7QUFBQSxFQUdKLE1BQU0sV0FBVyxDQUFDO0FBQUEsRUFDbEIsU0FBUyxJQUFJLEVBQUcsSUFBSSxHQUFHLEtBQUs7QUFBQSxJQUMxQixTQUFTLEtBQUssb0JBQW9CLElBQUksR0FBRyxLQUFLLENBQUM7QUFBQSxFQUNqRDtBQUFBLEVBS0EsTUFBTSxhQUFhLFNBQVMsVUFBVSxDQUFDLFFBQVEsSUFBSSxPQUFPLHFCQUFNLEdBQUcsS0FBSyxDQUFDO0FBQUEsRUFDekUsTUFBTSxnQkFBZ0IsZUFBZTtBQUFBLEVBRXJDLHVCQUNFLFNBMkNFLE9BM0NGO0FBQUEsSUFDRSxlQUFZO0FBQUEsSUFDWixXQUFVO0FBQUEsSUFGWixVQTJDRTtBQUFBLHNCQXRDQSxTQWVFLE9BZkY7QUFBQSxRQUNFLGVBQVk7QUFBQSxRQUNaLFdBQVU7QUFBQSxRQUZaLFVBSUcsT0FBTSxJQUFJLENBQUMseUJBQ1YsU0FRRSxPQVJGO0FBQUEsVUFFRSxlQUFhLGtCQUFrQixLQUFLLE9BQU8sSUFBSTtBQUFBLFVBQy9DLFdBQVU7QUFBQSxVQUhaLDBCQUtFLFNBRUUsUUFGRjtBQUFBLFlBQU0sV0FBVTtBQUFBLFlBQWhCLFVBQ0csS0FBSyxPQUFPLEtBQUs7QUFBQSxhQURwQixpQ0FFRTtBQUFBLFdBTkcsS0FBSyxPQUFPLE9BQU8sR0FEMUIsc0JBUUUsQ0FDSDtBQUFBLFNBZEgsaUNBZUU7QUFBQSxNQUdELFNBQVMsSUFBSSxDQUFDLHdCQUNiLFNBQUMsWUFBRDtBQUFBLFFBQTJDO0FBQUEsU0FBMUIsSUFBSSxPQUFPLFlBQVksR0FBeEMsc0JBQXFELENBQ3REO0FBQUEsTUFHQSxpQ0FDQyxTQVlFLE9BWkY7QUFBQSxRQUNFLGVBQVk7QUFBQSxRQUNaLFdBQVU7QUFBQSxRQUNWLE9BQU87QUFBQSxVQUNMLEtBQUssSUFBSSxxQkFBTSxFQUFFLEtBQUssSUFBSSxxQkFBTSxFQUFFLE9BQU8sSUFBSSxNQUFNO0FBQUEsVUFDbkQsTUFBTSxHQUFHLGNBQWMsTUFBTTtBQUFBLFVBQzdCLE9BQU8sR0FBRyxNQUFNO0FBQUEsUUFDbEI7QUFBQSxRQVBGLDBCQVNFLFNBRUUsT0FGRjtBQUFBLFVBQUssV0FBVTtBQUFBLFVBQWYsMEJBQ0UsU0FBOEQsT0FBOUQ7QUFBQSxZQUFLLFdBQVU7QUFBQSxhQUFmLGlDQUE4RDtBQUFBLFdBRGhFLGlDQUVFO0FBQUEsU0FYSixpQ0FZRTtBQUFBO0FBQUEsS0F6Q04sZ0NBMkNFO0FBQUE7Ozs7QU5uRU4scUJBQU0sT0FBTyxXQUFVO0FBRXZCLElBQU0sV0FBcUIsTUFBTTtBQUFBLEVBQy9CLHVCQUNFLFNBYUUsT0FiRjtBQUFBLElBQUssV0FBVTtBQUFBLElBQXVCLGVBQVk7QUFBQSxJQUFsRCxVQWFFO0FBQUEsc0JBWEEsU0FBQyxZQUFELHFDQUFZO0FBQUEsc0JBR1osU0FPRSxZQVBGO0FBQUEsUUFDRSxXQUFVO0FBQUEsUUFDVixlQUFZO0FBQUEsUUFGZCxVQU9FO0FBQUEsMEJBRkEsU0FBQyxlQUFELHFDQUFlO0FBQUEsMEJBQ2YsU0FBQyxjQUFELHFDQUFjO0FBQUE7QUFBQSxTQU5oQixnQ0FPRTtBQUFBO0FBQUEsS0FaSixnQ0FhRTtBQUFBO0FBSU4sSUFBZTs7O0FPekJmLHFCQUFTOzs7QUNIVCxvQkFBUzs7QUFNRixJQUFNLGVBQWUsTUFBTTtBQUFBLEVBQ2hDLFFBQVEsYUFBYSxxQkFBcUIsbUJBQW1CO0FBQUEsRUFJN0QsTUFBTSxZQUFZLGlCQUFpQixXQUFXO0FBQUEsRUFHOUMsUUFBUSxpQkFBaUIsU0FBUSxNQUFNO0FBQUEsSUFFckMsTUFBTSxhQUFhLFVBQVUsT0FBTyxDQUFDLFVBQVUsTUFBTSxNQUFNO0FBQUEsSUFHM0QsTUFBTSxjQUFjLFVBQVUsT0FBTyxDQUFDLFdBQVcsTUFBTSxNQUFNO0FBQUEsSUFFN0QsT0FBTyxFQUFFLGNBQWMsWUFBWSxlQUFlLFlBQVk7QUFBQSxLQUM3RCxDQUFDLFNBQVMsQ0FBQztBQUFBLEVBR2QsUUFBUSwwQkFBMEIsU0FBUSxNQUFNO0FBQUEsSUFFOUMsTUFBTSxlQUFlLENBQUMsR0FBRyxZQUFZLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTTtBQUFBLE1BQ3BELE9BQU8sRUFBRSxNQUFNLEtBQUssRUFBRSxLQUFLO0FBQUEsS0FDNUI7QUFBQSxJQUdELE1BQU0sT0FBcUMsQ0FBQztBQUFBLElBQzVDLE1BQU0sa0JBQTRDLENBQUM7QUFBQSxJQUVuRCxhQUFhLFFBQVEsQ0FBQyxPQUFPLGFBQWE7QUFBQSxNQUN4QyxJQUFJLFNBQVM7QUFBQSxNQUViLFFBQVEsUUFBUTtBQUFBLFFBQ2QsSUFBSSxZQUFZLEtBQUssUUFBUTtBQUFBLFVBRTNCLEtBQUssS0FBSyxDQUFDLENBQUM7QUFBQSxVQUNaLFNBQVM7QUFBQSxRQUNYLEVBQU87QUFBQSxVQUdMLFNBQVM7QUFBQTtBQUFBLE1BRWI7QUFBQSxNQUdBLEtBQUssVUFBVSxLQUFLLEVBQUUsTUFBTSxDQUFDO0FBQUEsTUFHN0IsZ0JBQWdCLEtBQUs7QUFBQSxXQUNoQjtBQUFBLFFBQ0gsTUFBTTtBQUFBLFFBQ04sT0FBTztBQUFBLFFBQ1AsS0FBSyxXQUFXO0FBQUEsUUFDaEIsUUFBUTtBQUFBLFFBQ1IsUUFBUTtBQUFBLE1BQ1YsQ0FBQztBQUFBLEtBQ0Y7QUFBQSxJQUVELE9BQU87QUFBQSxNQUNMLHVCQUF1QjtBQUFBLE1BQ3ZCLGlCQUFpQixLQUFLLElBQUksR0FBRyxLQUFLLE1BQU07QUFBQSxJQUMxQztBQUFBLEtBQ0MsQ0FBQyxZQUFZLENBQUM7QUFBQSxFQUVqQix1QkFDRSxTQW9DRSxPQXBDRjtBQUFBLElBQ0UsZUFBWTtBQUFBLElBQ1osV0FBVTtBQUFBLElBRlosVUFvQ0U7QUFBQSxzQkEvQkEsU0FJRSxPQUpGO0FBQUEsUUFBSyxXQUFVO0FBQUEsUUFBZiwwQkFDRSxTQUVFLFFBRkY7QUFBQSxVQUFNLFdBQVU7QUFBQSxVQUFoQjtBQUFBLDRDQUVFO0FBQUEsU0FISixpQ0FJRTtBQUFBLHNCQUdGLFNBdUJFLE9BdkJGO0FBQUEsUUFBSyxXQUFVO0FBQUEsUUFBZiwwQkFDRSxTQXFCRSxlQXJCRjtBQUFBLFVBQ0UsSUFBSSxXQUFXLFlBQVksT0FBTyxZQUFZO0FBQUEsVUFDOUMsTUFBSztBQUFBLFVBQ0wsTUFBTTtBQUFBLFVBQ04sV0FBVTtBQUFBLFVBSlosVUFNRyxzQkFBc0IsSUFBSSxDQUFDLE9BQU8sVUFBVTtBQUFBLFlBQzNDLHVCQUNFLFNBVUUsT0FWRjtBQUFBLGNBRUUsT0FBTyxFQUFFLFFBQVEsbUJBQW1CLEtBQUs7QUFBQSxjQUYzQywwQkFJRSxTQUFDLGdCQUFEO0FBQUEsZ0JBQ0UsV0FBVyxXQUFXLE1BQU0sTUFBTTtBQUFBLGdCQUNsQztBQUFBLGdCQUNBLFdBQVU7QUFBQSxnQkFDVixPQUFPLEVBQUUsT0FBTyxrQ0FBa0M7QUFBQSxpQkFKcEQsaUNBS0E7QUFBQSxlQVJLLFdBQVcsTUFBTSxNQUFNLFNBRDlCLHNCQVVFO0FBQUEsV0FFTDtBQUFBLFdBcEJILGlDQXFCRTtBQUFBLFNBdEJKLGlDQXVCRTtBQUFBO0FBQUEsS0FuQ0osZ0NBb0NFO0FBQUE7OztBQzFHTiw0QkFBUyw0QkFBaUI7O0FBR25CLElBQU0sWUFBWSxNQUFNO0FBQUEsRUFDN0IsUUFBUSxhQUFhLGtCQUFrQix3QkFDckMsbUJBQW1CO0FBQUEsRUFDckIsTUFBTSxVQUFVLFlBQVksT0FBTyxxQkFBTSxHQUFHLEtBQUs7QUFBQSxFQUVqRCx1QkFDRSxTQStCRSxPQS9CRjtBQUFBLElBQ0UsZUFBWTtBQUFBLElBQ1osV0FBVyxHQUNULDBEQUNBLG9CQUFvQixzQkFDcEIsbUJBQ0Y7QUFBQSxJQU5GLDBCQVFFLFNBc0JFLGtCQXRCRjtBQUFBLE1BQWlCLE1BQUs7QUFBQSxNQUF0QiwwQkFDRSxTQW9CRSxRQUFPLEtBcEJUO0FBQUEsUUFFRSxTQUFTLEVBQUUsU0FBUyxHQUFHLEdBQUcsSUFBSTtBQUFBLFFBQzlCLFNBQVMsRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFFO0FBQUEsUUFDNUIsTUFBTSxFQUFFLFNBQVMsR0FBRyxHQUFHLElBQUk7QUFBQSxRQUMzQixZQUFZLEVBQUUsVUFBVSxNQUFNLE1BQU0sWUFBWTtBQUFBLFFBQ2hELFdBQVcsR0FDVCxvRUFDQSxXQUFXLGNBQ2I7QUFBQSxRQVRGLFVBb0JFO0FBQUEsMEJBVEEsU0FFRSxRQUZGO0FBQUEsWUFBTSxXQUFVO0FBQUEsWUFBaEIsVUFDRyxZQUFZLE9BQU8sUUFBUTtBQUFBLGFBRDlCLGlDQUVFO0FBQUEsVUFDRCxZQUFZLE9BQU8sY0FBYztBQUFBLFVBQ2pDLDJCQUNDLFNBRUUsUUFGRjtBQUFBLFlBQU0sV0FBVTtBQUFBLFlBQWhCO0FBQUEsOENBRUU7QUFBQTtBQUFBLFNBakJDLFlBQVksT0FBTyxZQUFZLEdBRHRDLHFCQW9CRTtBQUFBLE9BckJKLGlDQXNCRTtBQUFBLEtBOUJKLGlDQStCRTtBQUFBOzs7O0FDdkNOLElBQU0sU0FBUSxNQUFNLEtBQUssRUFBRSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVM7QUFBQSxFQUNsRSxPQUFPLHFCQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQUEsQ0FDbkM7QUFNTSxJQUFNLGFBQXdDLEdBQUcsZ0JBQWdCO0FBQUEsRUFDdEUsdUJBQ0UsU0FlRSxPQWZGO0FBQUEsSUFDRSxlQUFZO0FBQUEsSUFDWixXQUFXLG1DQUFtQztBQUFBLElBRmhELFVBSUcsT0FBTSxJQUFJLENBQUMseUJBQ1YsU0FRRSxPQVJGO0FBQUEsTUFFRSxlQUFhLGlCQUFpQixLQUFLLE9BQU8sSUFBSTtBQUFBLE1BQzlDLFdBQVU7QUFBQSxNQUhaLDBCQUtFLFNBRUUsUUFGRjtBQUFBLFFBQU0sV0FBVTtBQUFBLFFBQWhCLFVBQ0csS0FBSyxPQUFPLEtBQUs7QUFBQSxTQURwQixpQ0FFRTtBQUFBLE9BTkcsS0FBSyxPQUFPLE9BQU8sR0FEMUIsc0JBUUUsQ0FDSDtBQUFBLEtBZEgsaUNBZUU7QUFBQTs7OztBSGpCTixJQUFNLFVBQVUsTUFBTTtBQUFBLEVBQ3BCLFFBQVEsZ0JBQWdCLG1CQUFtQjtBQUFBLEVBRzNDLE1BQU0sU0FBUSxNQUFNLEtBQUssRUFBRSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVM7QUFBQSxJQUNsRSxPQUFPLHFCQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQUEsR0FDbkM7QUFBQSxFQUdELE1BQU0sZUFBZSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFBQSxFQUtuQyxNQUFNLFVBQVUsWUFBWSxPQUFPLHFCQUFNLEdBQUcsS0FBSztBQUFBLEVBQ2pELE1BQU0sV0FBVyxZQUFZLE9BQU8sWUFBWTtBQUFBLEVBRWhELHVCQUNFLFNBbUhFLE9BbkhGO0FBQUEsSUFBSyxlQUFZO0FBQUEsSUFBVyxXQUFVO0FBQUEsSUFBdEMsVUFtSEU7QUFBQSxzQkFqSEEsU0FBQyxXQUFELHFDQUFXO0FBQUEsc0JBR1gsU0E2R0UsWUE3R0Y7QUFBQSxRQUNFLGVBQVk7QUFBQSxRQUNaLFdBQVU7QUFBQSxRQUZaLFVBNkdFO0FBQUEsMEJBeEdBLFNBQUMsY0FBRCxxQ0FBYztBQUFBLDBCQUdkLFNBb0dFLE9BcEdGO0FBQUEsWUFDRSxlQUFZO0FBQUEsWUFDWixXQUFVO0FBQUEsWUFDVixPQUFPLEVBQUUsUUFBUSxHQUFHLE9BQU0sU0FBUyxPQUFPO0FBQUEsWUFINUMsVUFvR0U7QUFBQSw4QkE5RkEsU0FBQyxZQUFEO0FBQUEsZ0JBQVksV0FBVTtBQUFBLGlCQUF0QixpQ0FBd0Q7QUFBQSw4QkFHeEQsU0EwRkUsT0ExRkY7QUFBQSxnQkFDRSxlQUFZO0FBQUEsZ0JBQ1osV0FBVTtBQUFBLGdCQUZaLFVBMEZFO0FBQUEsa0NBckZBLFNBcUJFLE9BckJGO0FBQUEsb0JBQ0UsZUFBWTtBQUFBLG9CQUNaLFdBQVU7QUFBQSxvQkFGWixVQUlHLE9BQU0sSUFBSSxDQUFDLE1BQU0sMEJBQ2hCLFNBY0UsT0FkRjtBQUFBLHNCQUlFLFdBQVU7QUFBQSxzQkFKWixVQU9HLGFBQWEsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLDRCQUMxQixTQUlHLE9BSkg7QUFBQSx3QkFFRSxXQUFVO0FBQUEsd0JBQ1YsT0FBTyxFQUFFLEtBQUssR0FBRyxRQUFRLEtBQUssWUFBWTtBQUFBLHlCQUZyQyxNQUFNLEtBQUssT0FBTyxJQUFJLEtBQUssV0FEbEMsc0JBSUcsQ0FDSjtBQUFBLHVCQVpJLE1BQU0sWUFBWSxPQUFPLFlBQVksS0FBSyxLQUFLLE9BQ2xELElBQ0YsS0FIRixzQkFjRSxDQUNIO0FBQUEscUJBcEJILGlDQXFCRTtBQUFBLGtDQUdGLFNBNENFLE9BNUNGO0FBQUEsb0JBQ0UsZUFBWTtBQUFBLG9CQUNaLFdBQVU7QUFBQSxvQkFGWixVQUlHLE9BQU0sSUFBSSxDQUFDLFNBQVM7QUFBQSxzQkFDbkIsTUFBTSxPQUFPLEtBQUssS0FBSztBQUFBLHNCQUV2Qix1QkFDRSxTQWlDRSxXQWpDRjtBQUFBLGtDQWlDRTtBQUFBLDBDQWhDQSxTQUFDLGVBQUQ7QUFBQSw0QkFDRSxJQUFJLGFBQWEsWUFBWSxLQUFLLE9BQU8sSUFBSTtBQUFBLDRCQUM3QyxNQUFLO0FBQUEsNEJBQ0wsTUFBTTtBQUFBLDRCQUNOO0FBQUEsNEJBQ0EsUUFBUTtBQUFBLDRCQUNSLFdBQVcsR0FBRyx5Q0FBeUM7QUFBQSw2QkFOekQsaUNBT0E7QUFBQSwwQ0FDQSxTQUFDLGVBQUQ7QUFBQSw0QkFDRSxJQUFJLGFBQWEsWUFBWSxLQUFLLE9BQU8sSUFBSTtBQUFBLDRCQUM3QyxNQUFLO0FBQUEsNEJBQ0wsTUFBTTtBQUFBLDRCQUNOO0FBQUEsNEJBQ0EsUUFBUTtBQUFBLDRCQUNSLFdBQVU7QUFBQSw2QkFOWixpQ0FPQTtBQUFBLDBDQUNBLFNBQUMsZUFBRDtBQUFBLDRCQUNFLElBQUksYUFBYSxZQUFZLEtBQUssT0FBTyxJQUFJO0FBQUEsNEJBQzdDLE1BQUs7QUFBQSw0QkFDTCxNQUFNO0FBQUEsNEJBQ047QUFBQSw0QkFDQSxRQUFRO0FBQUEsNEJBQ1IsV0FBVTtBQUFBLDZCQU5aLGlDQU9BO0FBQUEsMENBQ0EsU0FBQyxlQUFEO0FBQUEsNEJBQ0UsSUFBSSxhQUFhLFlBQVksS0FBSyxPQUFPLElBQUk7QUFBQSw0QkFDN0MsTUFBSztBQUFBLDRCQUNMLE1BQU07QUFBQSw0QkFDTjtBQUFBLDRCQUNBLFFBQVE7QUFBQSw0QkFDUixXQUFVO0FBQUEsNkJBTlosaUNBT0E7QUFBQTtBQUFBLHlCQWhDYSxHQUFHLFlBQVksS0FBSyxPQUFPLElBQUksS0FBOUMscUJBaUNFO0FBQUEscUJBRUw7QUFBQSxxQkEzQ0gsaUNBNENFO0FBQUEsa0NBR0YsU0FBQyxnQkFBRDtBQUFBLG9CQUFnQixLQUFLO0FBQUEscUJBQXJCLGlDQUFrQztBQUFBLGtCQUdqQywyQkFDQyxTQVFFLE9BUkY7QUFBQSxvQkFDRSxlQUFZO0FBQUEsb0JBQ1osV0FBVTtBQUFBLG9CQUNWLE9BQU87QUFBQSxzQkFDTCxLQUFLLElBQUkscUJBQU0sRUFBRSxLQUFLLElBQUkscUJBQU0sRUFBRSxPQUFPLElBQUksTUFBTTtBQUFBLG9CQUNyRDtBQUFBLG9CQUxGLDBCQU9FLFNBQStELE9BQS9EO0FBQUEsc0JBQUssV0FBVTtBQUFBLHVCQUFmLGlDQUErRDtBQUFBLHFCQVBqRSxpQ0FRRTtBQUFBO0FBQUEsaUJBeEZOLGdDQTBGRTtBQUFBO0FBQUEsYUFuR0osZ0NBb0dFO0FBQUE7QUFBQSxTQTVHSixnQ0E2R0U7QUFBQTtBQUFBLEtBbEhKLGdDQW1IRTtBQUFBO0FBSU4sSUFBZTs7O0FJbkpmLHNCQUFnQix3QkFBVzs7QUFzQjNCLElBQU0sZUFBZTtBQUFBLEVBQ25CLEVBQUUsT0FBTyw2QkFBNkIsT0FBTyxPQUFPO0FBQUEsRUFDcEQsRUFBRSxPQUFPLCtCQUErQixPQUFPLFFBQVE7QUFBQSxFQUN2RCxFQUFFLE9BQU8saUNBQWlDLE9BQU8sU0FBUztBQUFBLEVBQzFELEVBQUUsT0FBTywyQkFBMkIsT0FBTyxNQUFNO0FBQUEsRUFDakQsRUFBRSxPQUFPLGlDQUFpQyxPQUFPLFNBQVM7QUFBQSxFQUMxRCxFQUFFLE9BQU8sNkJBQTZCLE9BQU8sT0FBTztBQUFBLEVBQ3BELEVBQUUsT0FBTyxpQ0FBaUMsT0FBTyxTQUFTO0FBQUEsRUFDMUQsRUFBRSxPQUFPLCtCQUErQixPQUFPLFFBQVE7QUFBQSxFQUN2RCxFQUFFLE9BQU8sbUNBQW1DLE9BQU8sVUFBVTtBQUFBLEVBQzdELEVBQUUsT0FBTywyQkFBMkIsT0FBTyxNQUFNO0FBQUEsRUFDakQsRUFBRSxPQUFPLGlDQUFpQyxPQUFPLFNBQVM7QUFBQSxFQUMxRCxFQUFFLE9BQU8sNkJBQTZCLE9BQU8sT0FBTztBQUFBLEVBQ3BELEVBQUUsT0FBTyw2QkFBNkIsT0FBTyxPQUFPO0FBQUEsRUFDcEQsRUFBRSxPQUFPLGlDQUFpQyxPQUFPLFNBQVM7QUFDNUQ7QUFXTyxJQUFNLFlBQXNDO0FBQUEsRUFDakQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE1BQ0k7QUFBQSxFQUNKLE1BQU0sUUFBUSxlQUFlLGlCQUFpQixlQUFlO0FBQUEsRUFDN0QsTUFBTSxNQUFNLGVBQWUsZUFBZSxlQUFlO0FBQUEsRUFHekQsTUFBTSxtQkFBbUIsY0FBYyxPQUFPLEtBQUssSUFBSTtBQUFBLEVBQ3ZELE1BQU0saUJBQ0osY0FBYyxJQUFJLEdBQUcsTUFBTSxFQUFFLE9BQU8sS0FBSyxxQkFBTSxFQUFFLElBQUksR0FBRyxNQUFNLEVBQUUsT0FBTztBQUFBLEVBR3pFLE9BQU8sV0FBVyxnQkFBZ0IsVUFDaEMsT0FBTyxPQUFPLEtBQUssZ0JBQ3JCO0FBQUEsRUFDQSxPQUFPLFNBQVMsY0FBYyxVQUFTLEtBQUssT0FBTyxLQUFLLGNBQWM7QUFBQSxFQUN0RSxPQUFPLFVBQVUsZUFBZSxVQUFTLGVBQWUsVUFBVSxLQUFLO0FBQUEsRUFDdkUsT0FBTyxlQUFlLG9CQUFvQixVQUN4QyxlQUFlLFNBQVMsYUFBYSxHQUFHLEtBQzFDO0FBQUEsRUFHQSxPQUFPLFdBQVcsZ0JBQWdCLFVBQ2hDLGdCQUNJLGNBQWMsTUFBTSxPQUFPLE9BQU8sSUFDbEMscUJBQU0sZ0JBQWdCLEVBQUUsT0FBTyxPQUFPLENBQzVDO0FBQUEsRUFDQSxPQUFPLFNBQVMsY0FBYyxVQUM1QixnQkFDSSxjQUFjLElBQUksT0FBTyxPQUFPLElBQ2hDLHFCQUFNLGNBQWMsRUFBRSxPQUFPLE9BQU8sQ0FDMUM7QUFBQSxFQUdBLE9BQU8sWUFBWSxpQkFBaUIsVUFBUztBQUFBLElBQzNDLE9BQU8sZUFBZSxTQUFTO0FBQUEsSUFDL0IsYUFBYSxlQUFlLGVBQWU7QUFBQSxJQUMzQyxVQUFVLGVBQWUsWUFBWTtBQUFBLEVBQ3ZDLENBQUM7QUFBQSxFQUdELE1BQU0sd0JBQXdCLENBQUMsU0FBMkI7QUFBQSxJQUN4RCxJQUFJO0FBQUEsTUFBTSxhQUFhLElBQUk7QUFBQTtBQUFBLEVBRzdCLE1BQU0sc0JBQXNCLENBQUMsU0FBMkI7QUFBQSxJQUN0RCxJQUFJO0FBQUEsTUFBTSxXQUFXLElBQUk7QUFBQTtBQUFBLEVBSTNCLE1BQU0sb0JBQW9CLENBQ3hCLE1BQ0c7QUFBQSxJQUNILFFBQVEsTUFBTSxVQUFVLEVBQUU7QUFBQSxJQUMxQixjQUFjLENBQUMsVUFBVSxLQUFLLE9BQU8sT0FBTyxNQUFNLEVBQUU7QUFBQTtBQUFBLEVBSXRELE1BQU0sbUJBQW1CLENBQ3ZCLEdBQ0EsWUFDRztBQUFBLElBQ0gsTUFBTSxZQUFZLEVBQUUsT0FBTztBQUFBLElBQzNCLElBQUksU0FBUztBQUFBLE1BQ1gsYUFBYSxTQUFTO0FBQUEsSUFDeEIsRUFBTztBQUFBLE1BQ0wsV0FBVyxTQUFTO0FBQUE7QUFBQTtBQUFBLEVBSXhCLFdBQVUsTUFBTTtBQUFBLElBRWQsSUFBSSxVQUFVO0FBQUEsTUFDWixXQUFXLE9BQU87QUFBQSxJQUNwQjtBQUFBLEtBQ0MsQ0FBQyxRQUFRLENBQUM7QUFBQSxFQUdiLE1BQU0sZUFBZSxDQUFDLE1BQXVCO0FBQUEsSUFDM0MsRUFBRSxlQUFlO0FBQUEsSUFHakIsT0FBTyxZQUFZLGdCQUFnQixVQUFVLE1BQU0sR0FBRyxFQUFFLElBQUksTUFBTTtBQUFBLElBQ2xFLE9BQU8sVUFBVSxjQUFjLFFBQVEsTUFBTSxHQUFHLEVBQUUsSUFBSSxNQUFNO0FBQUEsSUFFNUQsSUFBSSxnQkFBZ0IscUJBQU0sU0FBUyxFQUFFLEtBQUssVUFBVSxFQUFFLE9BQU8sWUFBWTtBQUFBLElBRXpFLElBQUksY0FBYyxxQkFBTSxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQUUsT0FBTyxVQUFVO0FBQUEsSUFHakUsSUFBSSxVQUFVO0FBQUEsTUFDWixnQkFBZ0IsY0FBYyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUM7QUFBQSxNQUM5QyxjQUFjLFlBQVksS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFO0FBQUEsSUFDOUM7QUFBQSxJQUVBLE1BQU0sWUFBMkI7QUFBQSxNQUMvQixJQUFJLGVBQWUsTUFBTSxxQkFBTSxFQUFFLE9BQU8sZ0JBQWdCO0FBQUEsTUFDeEQsT0FBTyxXQUFXO0FBQUEsTUFDbEIsT0FBTztBQUFBLE1BQ1AsS0FBSztBQUFBLE1BQ0wsYUFBYSxXQUFXO0FBQUEsTUFDeEIsVUFBVSxXQUFXO0FBQUEsTUFDckIsUUFBUTtBQUFBLE1BQ1IsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLElBQUksY0FBYyxJQUFJO0FBQUEsTUFDcEIsV0FBVyxTQUFTO0FBQUEsSUFDdEIsRUFBTztBQUFBLE1BQ0wsUUFBUSxTQUFTO0FBQUE7QUFBQSxJQUduQixRQUFRO0FBQUE7QUFBQSxFQUdWLE1BQU0sZUFBZSxNQUFNO0FBQUEsSUFDekIsSUFBSSxjQUFjLElBQUk7QUFBQSxNQUNwQixXQUFXLGFBQWE7QUFBQSxNQUN4QixRQUFRO0FBQUEsSUFDVjtBQUFBO0FBQUEsRUFJRixXQUFVLE1BQU07QUFBQSxJQUNkLElBQUkscUJBQU0sU0FBUyxFQUFFLFFBQVEscUJBQU0sT0FBTyxDQUFDLEdBQUc7QUFBQSxNQUM1QyxXQUFXLFNBQVM7QUFBQSxJQUN0QjtBQUFBLEtBQ0MsQ0FBQyxXQUFXLE9BQU8sQ0FBQztBQUFBLEVBRXZCLHVCQUNFLFNBbUxFLFFBbkxGO0FBQUEsSUFBUSxNQUFNO0FBQUEsSUFBTSxjQUFjO0FBQUEsSUFBbEMsMEJBQ0UsU0FpTEUsZUFqTEY7QUFBQSxNQUFlLFdBQVU7QUFBQSxNQUF6QiwwQkFDRSxTQStLRSxRQS9LRjtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQWhCLFVBK0tFO0FBQUEsMEJBOUtBLFNBU0UsY0FURjtBQUFBLFlBQWMsV0FBVTtBQUFBLFlBQXhCLFVBU0U7QUFBQSw4QkFSQSxTQUVFLGFBRkY7QUFBQSxnQkFBYSxXQUFVO0FBQUEsZ0JBQXZCLFVBQ0csY0FBYyxLQUFLLGVBQWU7QUFBQSxpQkFEckMsaUNBRUU7QUFBQSw4QkFDRixTQUlFLG1CQUpGO0FBQUEsZ0JBQW1CLFdBQVU7QUFBQSxnQkFBN0IsVUFDRyxjQUFjLEtBQ1gsNEJBQ0E7QUFBQSxpQkFITixpQ0FJRTtBQUFBO0FBQUEsYUFSSixnQ0FTRTtBQUFBLDBCQUVGLFNBc0lFLE9BdElGO0FBQUEsWUFBSyxXQUFVO0FBQUEsWUFBZixVQXNJRTtBQUFBLDhCQXJJQSxTQWNFLE9BZEY7QUFBQSxnQkFBSyxXQUFVO0FBQUEsZ0JBQWYsVUFjRTtBQUFBLGtDQWJBLFNBRUUsUUFGRjtBQUFBLG9CQUFPLFNBQVE7QUFBQSxvQkFBUSxXQUFVO0FBQUEsb0JBQWpDO0FBQUEsc0RBRUU7QUFBQSxrQ0FDRixTQUFDLE9BQUQ7QUFBQSxvQkFDRSxJQUFHO0FBQUEsb0JBQ0gsTUFBSztBQUFBLG9CQUNMLE9BQU8sV0FBVztBQUFBLG9CQUNsQixVQUFVO0FBQUEsb0JBQ1YsYUFBWTtBQUFBLG9CQUNaLFVBQVE7QUFBQSxvQkFDUixXQUFTO0FBQUEsb0JBQ1QsV0FBVTtBQUFBLHFCQVJaLGlDQVNBO0FBQUE7QUFBQSxpQkFiRixnQ0FjRTtBQUFBLDhCQUVGLFNBU0UsT0FURjtBQUFBLGdCQUFLLFdBQVU7QUFBQSxnQkFBZixVQVNFO0FBQUEsa0NBUkEsU0FBQyxVQUFEO0FBQUEsb0JBQ0UsSUFBRztBQUFBLG9CQUNILFNBQVM7QUFBQSxvQkFDVCxpQkFBaUIsQ0FBQyxZQUFZLFlBQVksWUFBWSxJQUFJO0FBQUEscUJBSDVELGlDQUlBO0FBQUEsa0NBQ0EsU0FFRSxRQUZGO0FBQUEsb0JBQU8sU0FBUTtBQUFBLG9CQUFTLFdBQVU7QUFBQSxvQkFBbEM7QUFBQSxzREFFRTtBQUFBO0FBQUEsaUJBUkosZ0NBU0U7QUFBQSw4QkFFRixTQW1CRSxPQW5CRjtBQUFBLGdCQUFLLFdBQVU7QUFBQSxnQkFBZixVQW1CRTtBQUFBLGtDQWxCQSxTQVFFLE9BUkY7QUFBQSw4QkFRRTtBQUFBLHNDQVBBLFNBQWtELFFBQWxEO0FBQUEsd0JBQU8sV0FBVTtBQUFBLHdCQUFqQjtBQUFBLDBEQUFrRDtBQUFBLHNDQUNsRCxTQUFDLFlBQUQ7QUFBQSx3QkFDRSxNQUFNO0FBQUEsd0JBQ04sU0FBUztBQUFBLHdCQUNULFdBQVU7QUFBQSx3QkFDVixlQUFhO0FBQUEseUJBSmYsaUNBS0E7QUFBQTtBQUFBLHFCQVBGLGdDQVFFO0FBQUEsa0NBQ0YsU0FRRSxPQVJGO0FBQUEsOEJBUUU7QUFBQSxzQ0FQQSxTQUFnRCxRQUFoRDtBQUFBLHdCQUFPLFdBQVU7QUFBQSx3QkFBakI7QUFBQSwwREFBZ0Q7QUFBQSxzQ0FDaEQsU0FBQyxZQUFEO0FBQUEsd0JBQ0UsTUFBTTtBQUFBLHdCQUNOLFNBQVM7QUFBQSx3QkFDVCxXQUFVO0FBQUEsd0JBQ1YsZUFBYTtBQUFBLHlCQUpmLGlDQUtBO0FBQUE7QUFBQSxxQkFQRixnQ0FRRTtBQUFBO0FBQUEsaUJBbEJKLGdDQW1CRTtBQUFBLGVBRUEsNEJBQ0EsU0F5QkUsT0F6QkY7QUFBQSxnQkFBSyxXQUFVO0FBQUEsZ0JBQWYsVUF5QkU7QUFBQSxrQ0F4QkEsU0FXRSxPQVhGO0FBQUEsOEJBV0U7QUFBQSxzQ0FWQSxTQUVFLFFBRkY7QUFBQSx3QkFBTyxTQUFRO0FBQUEsd0JBQWEsV0FBVTtBQUFBLHdCQUF0QztBQUFBLDBEQUVFO0FBQUEsc0NBQ0YsU0FBQyxPQUFEO0FBQUEsd0JBQ0UsSUFBRztBQUFBLHdCQUNILE1BQUs7QUFBQSx3QkFDTCxPQUFPO0FBQUEsd0JBQ1AsVUFBVSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSTtBQUFBLHdCQUN6QyxXQUFVO0FBQUEseUJBTFosaUNBTUE7QUFBQTtBQUFBLHFCQVZGLGdDQVdFO0FBQUEsa0NBQ0YsU0FXRSxPQVhGO0FBQUEsOEJBV0U7QUFBQSxzQ0FWQSxTQUVFLFFBRkY7QUFBQSx3QkFBTyxTQUFRO0FBQUEsd0JBQVcsV0FBVTtBQUFBLHdCQUFwQztBQUFBLDBEQUVFO0FBQUEsc0NBQ0YsU0FBQyxPQUFEO0FBQUEsd0JBQ0UsSUFBRztBQUFBLHdCQUNILE1BQUs7QUFBQSx3QkFDTCxPQUFPO0FBQUEsd0JBQ1AsVUFBVSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsS0FBSztBQUFBLHdCQUMxQyxXQUFVO0FBQUEseUJBTFosaUNBTUE7QUFBQTtBQUFBLHFCQVZGLGdDQVdFO0FBQUE7QUFBQSxpQkF4QkosZ0NBeUJFO0FBQUEsOEJBR0osU0EyQkUsT0EzQkY7QUFBQSxnQkFBSyxXQUFVO0FBQUEsZ0JBQWYsVUEyQkU7QUFBQSxrQ0ExQkEsU0FBNkMsUUFBN0M7QUFBQSxvQkFBTyxXQUFVO0FBQUEsb0JBQWpCO0FBQUEsc0RBQTZDO0FBQUEsa0NBQzdDLFNBd0JFLE9BeEJGO0FBQUEsb0JBQUssV0FBVTtBQUFBLG9CQUFmLDBCQUNFLFNBc0JFLGlCQXRCRjtBQUFBLGdDQUNHLGFBQWEsSUFBSSxDQUFDLDBCQUNqQixTQWtCRSxTQWxCRjtBQUFBLGtDQWtCRTtBQUFBLDBDQWpCQSxTQWFFLGdCQWJGO0FBQUEsNEJBQWdCLFNBQU87QUFBQSw0QkFBdkIsMEJBQ0UsU0FBQyxRQUFEO0FBQUEsOEJBQ0UsU0FBUTtBQUFBLDhCQUVSLE1BQUs7QUFBQSw4QkFDTCxXQUFXLEdBQ1QsR0FBRyxNQUFNLDRDQUNULGtCQUFrQixNQUFNLFNBQ3RCLGtEQUNKO0FBQUEsOEJBQ0EsU0FBUyxNQUFNLGlCQUFpQixNQUFNLEtBQUs7QUFBQSw4QkFDM0MsY0FBWSxNQUFNO0FBQUEsK0JBUmIsTUFBTSxPQUZiLHNCQVdBO0FBQUEsNkJBWkYsaUNBYUU7QUFBQSwwQ0FDRixTQUVFLGdCQUZGO0FBQUEsc0RBQ0UsU0FBaUQsS0FBakQ7QUFBQSw4QkFBRyxXQUFVO0FBQUEsOEJBQWIsVUFBbUMsTUFBTTtBQUFBLCtCQUF6QyxpQ0FBaUQ7QUFBQSw2QkFEbkQsaUNBRUU7QUFBQTtBQUFBLHlCQWpCVSxNQUFNLE9BQXBCLHFCQWtCRSxDQUNIO0FBQUEsdUJBckJILGlDQXNCRTtBQUFBLHFCQXZCSixpQ0F3QkU7QUFBQTtBQUFBLGlCQTFCSixnQ0EyQkU7QUFBQSw4QkFFRixTQVlFLE9BWkY7QUFBQSxnQkFBSyxXQUFVO0FBQUEsZ0JBQWYsVUFZRTtBQUFBLGtDQVhBLFNBRUUsUUFGRjtBQUFBLG9CQUFPLFNBQVE7QUFBQSxvQkFBVyxXQUFVO0FBQUEsb0JBQXBDO0FBQUEsc0RBRUU7QUFBQSxrQ0FDRixTQUFDLE9BQUQ7QUFBQSxvQkFDRSxJQUFHO0FBQUEsb0JBQ0gsTUFBSztBQUFBLG9CQUNMLE9BQU8sV0FBVztBQUFBLG9CQUNsQixVQUFVO0FBQUEsb0JBQ1YsYUFBWTtBQUFBLG9CQUNaLFdBQVU7QUFBQSxxQkFOWixpQ0FPQTtBQUFBO0FBQUEsaUJBWEYsZ0NBWUU7QUFBQSw4QkFFRixTQVlFLE9BWkY7QUFBQSxnQkFBSyxXQUFVO0FBQUEsZ0JBQWYsVUFZRTtBQUFBLGtDQVhBLFNBRUUsUUFGRjtBQUFBLG9CQUFPLFNBQVE7QUFBQSxvQkFBYyxXQUFVO0FBQUEsb0JBQXZDO0FBQUEsc0RBRUU7QUFBQSxrQ0FDRixTQUFDLE9BQUQ7QUFBQSxvQkFDRSxJQUFHO0FBQUEsb0JBQ0gsTUFBSztBQUFBLG9CQUNMLE9BQU8sV0FBVztBQUFBLG9CQUNsQixVQUFVO0FBQUEsb0JBQ1YsYUFBWTtBQUFBLG9CQUNaLFdBQVU7QUFBQSxxQkFOWixpQ0FPQTtBQUFBO0FBQUEsaUJBWEYsZ0NBWUU7QUFBQTtBQUFBLGFBcklKLGdDQXNJRTtBQUFBLDBCQUVGLFNBMEJFLGNBMUJGO0FBQUEsWUFBYyxXQUFVO0FBQUEsWUFBeEIsVUEwQkU7QUFBQSxjQXpCQyxjQUFjLHNCQUNiLFNBUUUsUUFSRjtBQUFBLGdCQUNFLE1BQUs7QUFBQSxnQkFDTCxTQUFRO0FBQUEsZ0JBQ1IsU0FBUztBQUFBLGdCQUNULFdBQVU7QUFBQSxnQkFDVixNQUFLO0FBQUEsZ0JBTFA7QUFBQSxrREFRRTtBQUFBLDhCQUVKLFNBYUUsT0FiRjtBQUFBLGdCQUFLLFdBQVU7QUFBQSxnQkFBZixVQWFFO0FBQUEsa0NBWkEsU0FRRSxRQVJGO0FBQUEsb0JBQ0UsTUFBSztBQUFBLG9CQUNMLFNBQVE7QUFBQSxvQkFDUixTQUFTO0FBQUEsb0JBQ1QsV0FBVTtBQUFBLG9CQUNWLE1BQUs7QUFBQSxvQkFMUDtBQUFBLHNEQVFFO0FBQUEsa0NBQ0YsU0FFRSxRQUZGO0FBQUEsb0JBQVEsTUFBSztBQUFBLG9CQUFTLFdBQVU7QUFBQSxvQkFBc0IsTUFBSztBQUFBLG9CQUEzRCxVQUNHLGNBQWMsS0FBSyxXQUFXO0FBQUEscUJBRGpDLGlDQUVFO0FBQUE7QUFBQSxpQkFaSixnQ0FhRTtBQUFBO0FBQUEsYUF6QkosZ0NBMEJFO0FBQUE7QUFBQSxTQTlLSixnQ0ErS0U7QUFBQSxPQWhMSixpQ0FpTEU7QUFBQSxLQWxMSixpQ0FtTEU7QUFBQTs7O0FDcFdOLHFCQUFTO0FBQ1Qsa0NBQTZCOzs7QUNDN0IsNEJBQVMsNEJBQWlCO0FBQzFCO0FBQ0EscUJBQVM7QUFBQTtBQUdULElBQU0sU0FBUztBQUFBLEVBQ2I7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBR0EsSUFBTSxvQkFBb0I7QUFBQSxFQUN4QixTQUFTLEVBQUUsU0FBUyxHQUFHLEdBQUcsR0FBRztBQUFBLEVBQzdCLFNBQVMsRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFFO0FBQUEsRUFDNUIsTUFBTSxFQUFFLFNBQVMsR0FBRyxHQUFHLElBQUk7QUFDN0I7QUFFQSxJQUFNLGVBQWUsTUFBTTtBQUFBLEVBQ3pCLFFBQVEsYUFBYSxNQUFNLG1CQUFtQixtQkFBbUI7QUFBQSxFQUdqRSxPQUFPLGtCQUFrQix1QkFBdUIsVUFBUyxLQUFLO0FBQUEsRUFDOUQsT0FBTyxpQkFBaUIsc0JBQXNCLFVBQVMsS0FBSztBQUFBLEVBQzVELE9BQU8saUJBQWlCLHNCQUFzQixVQUFTLEtBQUs7QUFBQSxFQUM1RCxPQUFPLGdCQUFnQixxQkFBcUIsVUFBUyxLQUFLO0FBQUEsRUFFMUQsTUFBTSxjQUFjLFlBQVksS0FBSztBQUFBLEVBQ3JDLE1BQU0sUUFBUSxNQUFNLEtBQUssRUFBRSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTSxjQUFjLElBQUksQ0FBQztBQUFBLEVBR3RFLE1BQU0sb0JBQW9CLENBQUMsVUFBa0I7QUFBQSxJQUMzQyxNQUFNLFVBQVUsWUFBWSxNQUFNLEtBQUs7QUFBQSxJQUN2QyxlQUFlLE9BQU87QUFBQSxJQUN0QixvQkFBb0IsS0FBSztBQUFBO0FBQUEsRUFHM0IsTUFBTSxtQkFBbUIsQ0FBQyxTQUFpQjtBQUFBLElBQ3pDLE1BQU0sVUFBVSxZQUFZLEtBQUssSUFBSTtBQUFBLElBQ3JDLGVBQWUsT0FBTztBQUFBLElBQ3RCLG1CQUFtQixLQUFLO0FBQUE7QUFBQSxFQUcxQix1QkFDRTtBQUFBLGNBd05FO0FBQUEsTUF2TkMsU0FBUywwQkFDUixTQXNDRSxTQXRDRjtBQUFBLFFBQVMsTUFBTTtBQUFBLFFBQWtCLGNBQWM7QUFBQSxRQUEvQyxVQXNDRTtBQUFBLDBCQXJDQSxTQW1CRSxnQkFuQkY7QUFBQSxZQUFnQixTQUFPO0FBQUEsWUFBdkIsMEJBQ0UsU0FpQkUsUUFqQkY7QUFBQSxjQUNFLFNBQVE7QUFBQSxjQUNSLFdBQVU7QUFBQSxjQUZaLFVBaUJFO0FBQUEsZ0NBYkEsU0FXRSxrQkFYRjtBQUFBLGtCQUFpQixNQUFLO0FBQUEsa0JBQXRCLDBCQUNFLFNBU0UsUUFBTyxNQVRUO0FBQUEsb0JBRUUsU0FBUTtBQUFBLG9CQUNSLFNBQVE7QUFBQSxvQkFDUixNQUFLO0FBQUEsb0JBQ0wsVUFBVTtBQUFBLG9CQUNWLFlBQVksRUFBRSxVQUFVLE1BQU0sTUFBTSxZQUFZO0FBQUEsb0JBTmxELFVBUUcsWUFBWSxPQUFPLE1BQU07QUFBQSxxQkFQckIsU0FBUyxZQUFZLE1BQU0sS0FEbEMsc0JBU0U7QUFBQSxtQkFWSixpQ0FXRTtBQUFBLGdDQUNGLFNBQUMsYUFBRDtBQUFBLGtCQUFhLFdBQVU7QUFBQSxtQkFBdkIsaUNBQWlDO0FBQUE7QUFBQSxlQWhCbkMsZ0NBaUJFO0FBQUEsYUFsQkosaUNBbUJFO0FBQUEsMEJBQ0YsU0FnQkUsZ0JBaEJGO0FBQUEsWUFBZ0IsV0FBVTtBQUFBLFlBQTFCLDBCQUNFLFNBY0UsT0FkRjtBQUFBLGNBQUssV0FBVTtBQUFBLGNBQWYsVUFDRyxPQUFPLElBQUksQ0FBQyxPQUFPLDBCQUNsQixTQVVFLFFBVkY7QUFBQSxnQkFFRSxTQUFRO0FBQUEsZ0JBQ1IsV0FBVyxHQUNULDZCQUNBLFlBQVksTUFBTSxNQUFNLFNBQVMsZUFDbkM7QUFBQSxnQkFDQSxTQUFTLE1BQU0sa0JBQWtCLEtBQUs7QUFBQSxnQkFQeEMsVUFTRztBQUFBLGlCQVJJLE9BRFAsc0JBVUUsQ0FDSDtBQUFBLGVBYkgsaUNBY0U7QUFBQSxhQWZKLGlDQWdCRTtBQUFBO0FBQUEsU0FyQ0osZ0NBc0NFO0FBQUEsc0JBR0osU0FzQ0UsU0F0Q0Y7QUFBQSxRQUFTLE1BQU07QUFBQSxRQUFpQixjQUFjO0FBQUEsUUFBOUMsVUFzQ0U7QUFBQSwwQkFyQ0EsU0FtQkUsZ0JBbkJGO0FBQUEsWUFBZ0IsU0FBTztBQUFBLFlBQXZCLDBCQUNFLFNBaUJFLFFBakJGO0FBQUEsY0FDRSxTQUFRO0FBQUEsY0FDUixXQUFVO0FBQUEsY0FGWixVQWlCRTtBQUFBLGdDQWJBLFNBV0Usa0JBWEY7QUFBQSxrQkFBaUIsTUFBSztBQUFBLGtCQUF0QiwwQkFDRSxTQVNFLFFBQU8sTUFUVDtBQUFBLG9CQUVFLFNBQVE7QUFBQSxvQkFDUixTQUFRO0FBQUEsb0JBQ1IsTUFBSztBQUFBLG9CQUNMLFVBQVU7QUFBQSxvQkFDVixZQUFZLEVBQUUsVUFBVSxNQUFNLE1BQU0sWUFBWTtBQUFBLG9CQU5sRCxVQVFHLFlBQVksT0FBTyxNQUFNO0FBQUEscUJBUHJCLFFBQVEsWUFBWSxLQUFLLEtBRGhDLHNCQVNFO0FBQUEsbUJBVkosaUNBV0U7QUFBQSxnQ0FDRixTQUFDLGFBQUQ7QUFBQSxrQkFBYSxXQUFVO0FBQUEsbUJBQXZCLGlDQUFpQztBQUFBO0FBQUEsZUFoQm5DLGdDQWlCRTtBQUFBLGFBbEJKLGlDQW1CRTtBQUFBLDBCQUNGLFNBZ0JFLGdCQWhCRjtBQUFBLFlBQWdCLFdBQVU7QUFBQSxZQUExQiwwQkFDRSxTQWNFLE9BZEY7QUFBQSxjQUFLLFdBQVU7QUFBQSxjQUFmLFVBQ0csTUFBTSxJQUFJLENBQUMseUJBQ1YsU0FVRSxRQVZGO0FBQUEsZ0JBRUUsU0FBUTtBQUFBLGdCQUNSLFdBQVcsR0FDVCw2QkFDQSxZQUFZLEtBQUssTUFBTSxRQUFRLGVBQ2pDO0FBQUEsZ0JBQ0EsU0FBUyxNQUFNLGlCQUFpQixJQUFJO0FBQUEsZ0JBUHRDLFVBU0c7QUFBQSxpQkFSSSxNQURQLHNCQVVFLENBQ0g7QUFBQSxlQWJILGlDQWNFO0FBQUEsYUFmSixpQ0FnQkU7QUFBQTtBQUFBLFNBckNKLGdDQXNDRTtBQUFBLE1BR0QsU0FBUywwQkFDUixTQWdFRSxTQWhFRjtBQUFBLFFBQVMsTUFBTTtBQUFBLFFBQWlCLGNBQWM7QUFBQSxRQUE5QyxVQWdFRTtBQUFBLDBCQS9EQSxTQXVCRSxnQkF2QkY7QUFBQSxZQUFnQixTQUFPO0FBQUEsWUFBdkIsMEJBQ0UsU0FxQkUsUUFyQkY7QUFBQSxjQUNFLFNBQVE7QUFBQSxjQUNSLFdBQVU7QUFBQSxjQUZaLFVBcUJFO0FBQUEsZ0NBakJBLFNBZUUsa0JBZkY7QUFBQSxrQkFBaUIsTUFBSztBQUFBLGtCQUF0QiwwQkFDRSxTQWFFLFFBQU8sTUFiVDtBQUFBLG9CQUVFLFNBQVE7QUFBQSxvQkFDUixTQUFRO0FBQUEsb0JBQ1IsTUFBSztBQUFBLG9CQUNMLFVBQVU7QUFBQSxvQkFDVixZQUFZLEVBQUUsVUFBVSxNQUFNLE1BQU0sWUFBWTtBQUFBLG9CQU5sRCxVQVFHLEdBQUcsWUFDRCxRQUFRLE1BQU0sRUFDZCxPQUFPLE9BQU8sT0FBTyxZQUNyQixNQUFNLE1BQU0sRUFDWixPQUFPLE9BQU87QUFBQSxxQkFYWixjQUFjLFlBQVksT0FBTyxZQUFZLEtBRHBELHNCQWFFO0FBQUEsbUJBZEosaUNBZUU7QUFBQSxnQ0FDRixTQUFDLGFBQUQ7QUFBQSxrQkFBYSxXQUFVO0FBQUEsbUJBQXZCLGlDQUFpRDtBQUFBO0FBQUEsZUFwQm5ELGdDQXFCRTtBQUFBLGFBdEJKLGlDQXVCRTtBQUFBLDBCQUNGLFNBc0NFLGdCQXRDRjtBQUFBLFlBQWdCLFdBQVU7QUFBQSxZQUExQiwwQkFDRSxTQW9DRSxPQXBDRjtBQUFBLGNBQUssV0FBVTtBQUFBLGNBQWYsVUFFRyxNQUFNLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTTtBQUFBLGdCQUNuQyxNQUFNLFdBQVcsWUFBWSxTQUFTLEdBQUcsTUFBTSxFQUFFLElBQUksR0FBRyxNQUFNO0FBQUEsZ0JBQzlELE1BQU0sY0FBYyxTQUFTLFFBQVEsTUFBTTtBQUFBLGdCQUMzQyxNQUFNLFlBQVksU0FBUyxNQUFNLE1BQU07QUFBQSxnQkFDdkMsTUFBTSxnQkFBZ0IsU0FBUyxPQUFPLGFBQWEsTUFBTTtBQUFBLGdCQUV6RCx1QkFDRSxTQXdCRSxRQXhCRjtBQUFBLGtCQUVFLFNBQVE7QUFBQSxrQkFDUixXQUFXLEdBQ1QsNkJBQ0EsaUJBQWlCLGVBQ25CO0FBQUEsa0JBQ0EsU0FBUyxNQUFNO0FBQUEsb0JBQ2IsZUFBZSxXQUFXO0FBQUEsb0JBQzFCLG1CQUFtQixLQUFLO0FBQUE7QUFBQSxrQkFUNUIsMEJBWUUsU0FXRSxPQVhGO0FBQUEsb0JBQUssV0FBVTtBQUFBLG9CQUFmLFVBV0U7QUFBQSxzQ0FWQSxTQUVpQyxRQUZqQztBQUFBLGtDQUFPLEdBQUcsWUFBWSxPQUNwQixPQUNGLE9BQU8sVUFBVSxPQUFPLEdBQUc7QUFBQSx5QkFGM0IsaUNBRWlDO0FBQUEsc0JBQ2hDLFlBQVksTUFBTSxNQUFNLFVBQVUsTUFBTSxxQkFDdkMsU0FJRSxRQUpGO0FBQUEsd0JBQU0sV0FBVTtBQUFBLHdCQUFoQixVQUNHLEdBQUcsWUFBWSxPQUFPLEtBQUssS0FBSyxVQUFVLE9BQ3pDLEtBQ0Y7QUFBQSx5QkFIRixpQ0FJRTtBQUFBO0FBQUEscUJBVE4sZ0NBV0U7QUFBQSxtQkF0QkcsWUFBWSxPQUFPLFlBQVksR0FEdEMsc0JBd0JFO0FBQUEsZUFFTDtBQUFBLGVBbkNILGlDQW9DRTtBQUFBLGFBckNKLGlDQXNDRTtBQUFBO0FBQUEsU0EvREosZ0NBZ0VFO0FBQUEsTUFFSCxTQUFTLHlCQUNSLFNBOERFLFNBOURGO0FBQUEsUUFBUyxNQUFNO0FBQUEsUUFBZ0IsY0FBYztBQUFBLFFBQTdDLFVBOERFO0FBQUEsMEJBN0RBLFNBbUJFLGdCQW5CRjtBQUFBLFlBQWdCLFNBQU87QUFBQSxZQUF2QiwwQkFDRSxTQWlCRSxRQWpCRjtBQUFBLGNBQ0UsU0FBUTtBQUFBLGNBQ1IsV0FBVTtBQUFBLGNBRlosVUFpQkU7QUFBQSxnQ0FiQSxTQVdFLGtCQVhGO0FBQUEsa0JBQWlCLE1BQUs7QUFBQSxrQkFBdEIsMEJBQ0UsU0FTRSxRQUFPLE1BVFQ7QUFBQSxvQkFFRSxTQUFRO0FBQUEsb0JBQ1IsU0FBUTtBQUFBLG9CQUNSLE1BQUs7QUFBQSxvQkFDTCxVQUFVO0FBQUEsb0JBQ1YsWUFBWSxFQUFFLFVBQVUsTUFBTSxNQUFNLFlBQVk7QUFBQSxvQkFObEQsVUFRRyxZQUFZLE9BQU8sU0FBUztBQUFBLHFCQVB4QixZQUFZLFlBQVksT0FBTyxZQUFZLEtBRGxELHNCQVNFO0FBQUEsbUJBVkosaUNBV0U7QUFBQSxnQ0FDRixTQUFDLGFBQUQ7QUFBQSxrQkFBYSxXQUFVO0FBQUEsbUJBQXZCLGlDQUFpRDtBQUFBO0FBQUEsZUFoQm5ELGdDQWlCRTtBQUFBLGFBbEJKLGlDQW1CRTtBQUFBLDBCQUNGLFNBd0NFLGdCQXhDRjtBQUFBLFlBQWdCLFdBQVU7QUFBQSxZQUExQiwwQkFDRSxTQXNDRSxPQXRDRjtBQUFBLGNBQUssV0FBVTtBQUFBLGNBQWYsV0FFSSxNQUFNO0FBQUEsZ0JBRU4sTUFBTSxrQkFBa0IsWUFBWSxRQUFRLE9BQU87QUFBQSxnQkFDbkQsTUFBTSxjQUFjLFlBQVksWUFBWTtBQUFBLGdCQUc1QyxPQUFPLE1BQU0sS0FBSyxFQUFFLFFBQVEsWUFBWSxHQUFHLENBQUMsR0FBRyxNQUFNO0FBQUEsa0JBQ25ELE1BQU0sVUFBVSxnQkFBZ0IsS0FBSyxJQUFJLENBQUM7QUFBQSxrQkFDMUMsTUFBTSxlQUFlLFFBQVEsT0FBTyxhQUFhLEtBQUs7QUFBQSxrQkFDdEQsTUFBTSxVQUFVLFFBQVEsT0FBTyxxQkFBTSxHQUFHLEtBQUs7QUFBQSxrQkFFN0MsdUJBQ0UsU0FvQkUsUUFwQkY7QUFBQSxvQkFFRSxTQUFRO0FBQUEsb0JBQ1IsV0FBVyxHQUNULDZCQUNBLGdCQUFnQixlQUNsQjtBQUFBLG9CQUNBLFNBQVMsTUFBTTtBQUFBLHNCQUNiLGVBQWUsT0FBTztBQUFBLHNCQUN0QixrQkFBa0IsS0FBSztBQUFBO0FBQUEsb0JBVDNCLDBCQVlFLFNBT0UsT0FQRjtBQUFBLHNCQUFLLFdBQVU7QUFBQSxzQkFBZixVQU9FO0FBQUEsd0NBTkEsU0FBdUMsUUFBdkM7QUFBQSxvQ0FBTyxRQUFRLE9BQU8sYUFBYTtBQUFBLDJCQUFuQyxpQ0FBdUM7QUFBQSx3QkFDdEMsMkJBQ0MsU0FFRSxRQUZGO0FBQUEsMEJBQU0sV0FBVTtBQUFBLDBCQUFoQjtBQUFBLDREQUVFO0FBQUE7QUFBQSx1QkFMTixnQ0FPRTtBQUFBLHFCQWxCRyxRQUFRLE9BQU8sWUFBWSxHQURsQyxzQkFvQkU7QUFBQSxpQkFFTDtBQUFBLGlCQUNBO0FBQUEsZUFyQ0wsaUNBc0NFO0FBQUEsYUF2Q0osaUNBd0NFO0FBQUE7QUFBQSxTQTdESixnQ0E4REU7QUFBQTtBQUFBLEtBdE5OLGdDQXdORTtBQUFBO0FBSU4sSUFBZTs7O0FDeFJmLHdCQUFTLDhCQUFhO0FBQUE7QUFjdEIsSUFBTSxlQUE0QztBQUFBLEVBQ2hEO0FBQUEsRUFDQTtBQUFBLEVBQ0EsVUFBVTtBQUFBLEVBQ1YsT0FBTztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxNQUNJO0FBQUEsRUFDSixNQUFNLFNBQVMsWUFBWTtBQUFBLEVBRzNCLE1BQU0scUJBQXFCLENBQUMsYUFBZ0Q7QUFBQSxJQUMxRSxPQUFPLEdBRUwsU0FBUyxXQUFXLElBRXBCLGFBQWEsU0FBVSxTQUFTLFdBQVcsMEJBQTJCLElBRXRFLGdCQUFnQixZQUFZLGVBQzlCO0FBQUE7QUFBQSxFQUdGLE1BQU0sZ0JBQWdCLENBQUMsYUFBZ0Q7QUFBQSxJQUNyRSxPQUFPLGdCQUFnQixXQUFXLFlBQVk7QUFBQTtBQUFBLEVBR2hELHVCQUNFLFNBaURFLE9BakRGO0FBQUEsSUFDRSxXQUFXLEdBQ1QsU0FBUywyQkFBMkIsY0FDcEMsU0FDRjtBQUFBLElBSkYsVUFpREU7QUFBQSxzQkEzQ0EsU0FFRSxRQUZGO0FBQUEsUUFBUSxTQUFTO0FBQUEsUUFBWSxTQUFRO0FBQUEsUUFBVTtBQUFBLFFBQS9DLDBCQUNFLFNBQUMsY0FBRDtBQUFBLFVBQWEsV0FBVTtBQUFBLFdBQXZCLGlDQUFpQztBQUFBLFNBRG5DLGlDQUVFO0FBQUEsc0JBQ0YsU0FFRSxRQUZGO0FBQUEsUUFBUSxTQUFTO0FBQUEsUUFBUSxTQUFRO0FBQUEsUUFBVTtBQUFBLFFBQTNDLDBCQUNFLFNBQUMsZUFBRDtBQUFBLFVBQWMsV0FBVTtBQUFBLFdBQXhCLGlDQUFrQztBQUFBLFNBRHBDLGlDQUVFO0FBQUEsc0JBRUYsU0FPRSxRQVBGO0FBQUEsUUFDRSxTQUFTLE1BQU0sU0FBUyxLQUFLO0FBQUEsUUFDN0IsU0FBUyxjQUFjLEtBQUs7QUFBQSxRQUM1QjtBQUFBLFFBQ0EsV0FBVyxtQkFBbUIsS0FBSztBQUFBLFFBSnJDO0FBQUEsMENBT0U7QUFBQSxzQkFDRixTQU9FLFFBUEY7QUFBQSxRQUNFLFNBQVMsTUFBTSxTQUFTLE1BQU07QUFBQSxRQUM5QixTQUFTLGNBQWMsTUFBTTtBQUFBLFFBQzdCO0FBQUEsUUFDQSxXQUFXLG1CQUFtQixNQUFNO0FBQUEsUUFKdEM7QUFBQSwwQ0FPRTtBQUFBLHNCQUNGLFNBT0UsUUFQRjtBQUFBLFFBQ0UsU0FBUyxNQUFNLFNBQVMsT0FBTztBQUFBLFFBQy9CLFNBQVMsY0FBYyxPQUFPO0FBQUEsUUFDOUI7QUFBQSxRQUNBLFdBQVcsbUJBQW1CLE9BQU87QUFBQSxRQUp2QztBQUFBLDBDQU9FO0FBQUEsc0JBQ0YsU0FPRSxRQVBGO0FBQUEsUUFDRSxTQUFTLE1BQU0sU0FBUyxNQUFNO0FBQUEsUUFDOUIsU0FBUyxjQUFjLE1BQU07QUFBQSxRQUM3QjtBQUFBLFFBQ0EsV0FBVyxtQkFBbUIsTUFBTTtBQUFBLFFBSnRDO0FBQUEsMENBT0U7QUFBQSxzQkFFRixTQUVFLFFBRkY7QUFBQSxRQUFRLFNBQVM7QUFBQSxRQUFTLFNBQVE7QUFBQSxRQUFVO0FBQUEsUUFBNUM7QUFBQSwwQ0FFRTtBQUFBO0FBQUEsS0FoREosZ0NBaURFO0FBQUE7QUFJTixJQUFlOzs7O0FGcEZmLElBQU0sVUFBZ0MsTUFBTTtBQUFBLEVBQzFDO0FBQUEsSUFDRTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLE1BQ0UsbUJBQW1CO0FBQUEsRUFHdkIsT0FBTyxtQkFBbUIsd0JBQXdCLFVBQVMsS0FBSztBQUFBLEVBR2hFLE1BQU0sbUJBQW1CLENBQ3ZCLFNBQ0EsZUFBZSxVQUNaO0FBQUEsSUFDSCxRQUFRLE9BQU87QUFBQSxJQUNmLElBQUksY0FBYztBQUFBLE1BQ2hCLHFCQUFxQixLQUFLO0FBQUEsSUFDNUI7QUFBQTtBQUFBLEVBSUYsTUFBTSxtQkFBbUI7QUFBQSxJQUN2QixPQUFPLE1BQU07QUFBQSxNQUNYLE1BQU07QUFBQSxNQUNOLHFCQUFxQixLQUFLO0FBQUE7QUFBQSxJQUU1QixVQUFVLE1BQU07QUFBQSxNQUNkLFdBQVc7QUFBQSxNQUNYLHFCQUFxQixLQUFLO0FBQUE7QUFBQSxJQUU1QixNQUFNLE1BQU07QUFBQSxNQUNWLFdBQVc7QUFBQSxNQUNYLHFCQUFxQixLQUFLO0FBQUE7QUFBQSxFQUU5QjtBQUFBLEVBRUEsTUFBTSxpQkFBaUIsWUFDckIsc0JBQ0UsU0FXRSxPQVhGO0FBQUEsSUFBSyxXQUFVO0FBQUEsSUFBZiwwQkFDRSxTQVNFLFFBVEY7QUFBQSxNQUNFLFNBQVMsTUFBTSxjQUFjLFdBQVc7QUFBQSxNQUN4QyxTQUFRO0FBQUEsTUFDUixNQUFLO0FBQUEsTUFDTCxXQUFVO0FBQUEsTUFKWixVQVNFO0FBQUEsd0JBSEEsU0FBQyxNQUFEO0FBQUEsVUFBTSxXQUFVO0FBQUEsV0FBaEIsaUNBQTBCO0FBQUEsd0JBQzFCLFNBQThDLFFBQTlDO0FBQUEsVUFBTSxXQUFVO0FBQUEsVUFBaEI7QUFBQSw0Q0FBOEM7QUFBQSx3QkFDOUMsU0FBaUMsUUFBakM7QUFBQSxVQUFNLFdBQVU7QUFBQSxVQUFoQjtBQUFBLDRDQUFpQztBQUFBO0FBQUEsT0FSbkMsZ0NBU0U7QUFBQSxLQVZKLGlDQVdFLEdBRUosQ0FBQyxhQUFhLGFBQWEsQ0FDN0I7QUFBQSxFQUVBLHVCQUNFO0FBQUEsOEJBRUUsU0F5REUsT0F6REY7QUFBQSxNQUFLLFdBQVU7QUFBQSxNQUFmLFVBeURFO0FBQUEsd0JBdkRBLFNBR0UsT0FIRjtBQUFBLFVBQUssV0FBVTtBQUFBLFVBQWYsVUFHRTtBQUFBLDRCQUZBLFNBQUMsZUFBRDtBQUFBLGNBQWMsV0FBVTtBQUFBLGVBQXhCLGlDQUFrQztBQUFBLDRCQUNsQyxTQUFDLHVCQUFELHFDQUFjO0FBQUE7QUFBQSxXQUZoQixnQ0FHRTtBQUFBLHdCQUdGLFNBZ0RFLE9BaERGO0FBQUEsVUFBSyxXQUFVO0FBQUEsVUFBZixVQWdERTtBQUFBLDRCQTlDQSxTQWFFLE9BYkY7QUFBQSxjQUFLLFdBQVU7QUFBQSxjQUFmLFVBYUU7QUFBQSxnQ0FaQSxTQUFDLHVCQUFEO0FBQUEsa0JBQ0UsYUFBYTtBQUFBLGtCQUNiLFVBQVU7QUFBQSxrQkFDVixTQUFTO0FBQUEsa0JBQ1QsUUFBUTtBQUFBLGtCQUNSLFlBQVk7QUFBQSxrQkFDWixTQUFRO0FBQUEsa0JBQ1IsV0FBVTtBQUFBLG1CQVBaLGlDQVFBO0FBQUEsZ0NBR0EsU0FBQyxnQkFBRCxxQ0FBZ0I7QUFBQTtBQUFBLGVBWmxCLGdDQWFFO0FBQUEsNEJBR0YsU0E2QkUsT0E3QkY7QUFBQSxjQUFLLFdBQVU7QUFBQSxjQUFmLFVBNkJFO0FBQUEsZ0NBM0JBLFNBQUMsZ0JBQUQscUNBQWdCO0FBQUEsZ0NBRWhCLFNBd0JFLFNBeEJGO0FBQUEsa0JBQ0UsTUFBTTtBQUFBLGtCQUNOLGNBQWM7QUFBQSxrQkFGaEIsVUF3QkU7QUFBQSxvQ0FwQkEsU0FJRSxnQkFKRjtBQUFBLHNCQUFnQixTQUFPO0FBQUEsc0JBQXZCLDBCQUNFLFNBRUUsUUFGRjtBQUFBLHdCQUFRLFNBQVE7QUFBQSx3QkFBVSxNQUFLO0FBQUEsd0JBQS9CLDBCQUNFLFNBQUMsTUFBRDtBQUFBLDBCQUFNLFdBQVU7QUFBQSwyQkFBaEIsaUNBQTBCO0FBQUEseUJBRDVCLGlDQUVFO0FBQUEsdUJBSEosaUNBSUU7QUFBQSxvQ0FDRixTQWNFLGdCQWRGO0FBQUEsc0JBQWdCLE9BQU07QUFBQSxzQkFBTSxXQUFVO0FBQUEsc0JBQXRDLDBCQUNFLFNBWUUsT0FaRjtBQUFBLHdCQUFLLFdBQVU7QUFBQSx3QkFBZixVQVlFO0FBQUEsMENBWEEsU0FFRSxNQUZGO0FBQUEsNEJBQUksV0FBVTtBQUFBLDRCQUFkO0FBQUEsOERBRUU7QUFBQSwwQ0FDRixTQUFDLHVCQUFEO0FBQUEsNEJBQ0UsYUFBYTtBQUFBLDRCQUNiLFVBQVUsQ0FBQyxZQUFZLGlCQUFpQixTQUFTLElBQUk7QUFBQSw0QkFDckQsU0FBUyxpQkFBaUI7QUFBQSw0QkFDMUIsUUFBUSxpQkFBaUI7QUFBQSw0QkFDekIsWUFBWSxpQkFBaUI7QUFBQSw0QkFDN0IsU0FBUTtBQUFBLDZCQU5WLGlDQU9BO0FBQUE7QUFBQSx5QkFYRixnQ0FZRTtBQUFBLHVCQWJKLGlDQWNFO0FBQUE7QUFBQSxtQkF2QkosZ0NBd0JFO0FBQUE7QUFBQSxlQTVCSixnQ0E2QkU7QUFBQTtBQUFBLFdBL0NKLGdDQWdERTtBQUFBO0FBQUEsT0F4REosZ0NBeURFO0FBQUEsS0EzREosaUNBNERFO0FBQUE7QUFJTixJQUFlOztBR3JJZiw0QkFBUyw0QkFBaUI7QUFBQTtBQUUxQixJQUFNLFdBQXFCLE1BQU07QUFBQSxFQUMvQixRQUFRLGFBQWEsWUFBWSxRQUFRLFNBQVMscUJBQ2hELG1CQUFtQjtBQUFBLEVBQ3JCLE1BQU0sT0FBTyxZQUFZLEtBQUs7QUFBQSxFQUc5QixNQUFNLFVBQVMsTUFBTSxLQUFLLEVBQUUsUUFBUSxHQUFHLEdBQUcsQ0FBQyxHQUFHLE1BQU07QUFBQSxJQUNsRCxNQUFNLFlBQVkscUJBQU0sRUFBRSxLQUFLLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxRQUFRLE9BQU87QUFBQSxJQUM3RCxPQUFPO0FBQUEsTUFDTCxNQUFNO0FBQUEsTUFDTixNQUFNLFVBQVUsT0FBTyxNQUFNO0FBQUEsTUFDN0IsYUFBYSxVQUFVLFlBQVk7QUFBQSxNQUNuQyxpQkFBaUIsVUFBVSxRQUFRLE9BQU8sRUFBRSxJQUFJO0FBQUEsSUFDbEQ7QUFBQSxHQUNEO0FBQUEsRUFHRCxNQUFNLHVCQUF1QixRQUFPLElBQUksQ0FBQyxVQUFVO0FBQUEsSUFDakQsTUFBTSxnQkFBZ0IsT0FBTyxPQUMzQixDQUFDLFVBQ0MsTUFBTSxNQUFNLEtBQUssTUFBTSxRQUN2QixNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLENBQzdDO0FBQUEsSUFFQSxPQUFPO0FBQUEsU0FDRjtBQUFBLE1BQ0gsWUFBWSxjQUFjO0FBQUEsSUFDNUI7QUFBQSxHQUNEO0FBQUEsRUFHRCxNQUFNLG1CQUFtQixDQUFDLFNBQXNCO0FBQUEsSUFDOUMsV0FBVyxJQUFJO0FBQUEsSUFDZixRQUFRLE9BQU87QUFBQTtBQUFBLEVBSWpCLE1BQU0saUJBQWlCLENBQUMsTUFBbUIsVUFBNEI7QUFBQSxJQUNyRSxNQUFNLGdCQUFnQjtBQUFBLElBQ3RCLFdBQVcsSUFBSTtBQUFBLElBQ2YsUUFBUSxLQUFLO0FBQUE7QUFBQSxFQUlmLE1BQU0scUJBQXFCLENBQUMsVUFBNEM7QUFBQSxJQUV0RSxNQUFNLHFCQUFxQixNQUFNLEtBQUssUUFBUSxPQUFPLEVBQUUsUUFBUSxNQUFNO0FBQUEsSUFHckUsTUFBTSxZQUFZLE1BQU0sS0FBSyxFQUFFLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNO0FBQUEsTUFDckQsTUFBTSxNQUFNLG1CQUFtQixJQUFJLEdBQUcsS0FBSztBQUFBLE1BQzNDLE1BQU0saUJBQWlCLElBQUksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNO0FBQUEsTUFDeEQsTUFBTSxVQUFVLElBQUksT0FBTyxxQkFBTSxHQUFHLEtBQUs7QUFBQSxNQUN6QyxNQUFNLGdCQUFnQixJQUFJLE9BQU8sYUFBYSxLQUFLO0FBQUEsTUFHbkQsTUFBTSxZQUFZLGlCQUFpQixHQUFHO0FBQUEsTUFDdEMsTUFBTSxZQUFZLFVBQVUsU0FBUztBQUFBLE1BRXJDLE9BQU87QUFBQSxRQUNMO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0EsWUFBWSxVQUFVO0FBQUEsUUFFdEIsUUFBUTtBQUFBLE1BQ1Y7QUFBQSxLQUNEO0FBQUEsSUFFRCx1QkFDRSxTQW1GRSxPQW5GRjtBQUFBLE1BQ0UsZUFBYSxzQkFBc0IsTUFBTSxLQUFLLE9BQU8sSUFBSTtBQUFBLE1BQ3pELFdBQVU7QUFBQSxNQUZaLFVBbUZFO0FBQUEsUUE5RUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsc0JBQ2pELFNBS0UsT0FMRjtBQUFBLFVBRUUsV0FBVTtBQUFBLFVBRlosVUFJRztBQUFBLFdBSEksVUFBVSxLQURqQixzQkFLRSxDQUNIO0FBQUEsUUFHQSxVQUFVLElBQUksQ0FBQyxTQUFTLHNCQUN2QixTQWlFRSxPQWpFRjtBQUFBLFVBRUUsZUFBYSxZQUFZLFFBQVEsSUFBSSxPQUFPLFlBQVk7QUFBQSxVQUN4RCxTQUFTLENBQUMsTUFBTSxlQUFlLFFBQVEsS0FBSyxDQUFDO0FBQUEsVUFDN0MsV0FBVyxHQUNULDBGQUNBLDhEQUNDLFFBQVEsa0JBQWtCLG9DQUMzQixRQUFRLFdBQ04sbURBQ0YsUUFBUSxrQkFDTCxRQUFRLFdBQ1QsbUNBQ0YsUUFBUSxjQUNMLFFBQVEsWUFDUixRQUFRLGlCQUNULGFBQ0o7QUFBQSxVQUNBLE9BQ0UsUUFBUSxZQUNKLEdBQUcsUUFBUSxtQkFDVCxRQUFRLGFBQWEsSUFBSSxNQUFNLE9BRWpDO0FBQUEsVUF2QlIsVUFpRUU7QUFBQSw0QkF2Q0EsU0FFRSxRQUZGO0FBQUEsY0FBTSxXQUFVO0FBQUEsY0FBaEIsVUFDRyxRQUFRLElBQUksS0FBSztBQUFBLGVBRHBCLGlDQUVFO0FBQUEsWUFHRCxRQUFRLDZCQUNQLFNBK0JFLE9BL0JGO0FBQUEsY0FDRSxXQUFXLEdBQ1QsOERBQ0EsUUFBUSxVQUFVLGlCQUFpQixFQUNyQztBQUFBLGNBSkYsVUErQkU7QUFBQSxnQkF4QkMsUUFBUSxhQUFhLHFCQUNwQixTQUFDLFFBQUQ7QUFBQSxrQkFDRSxXQUFXLEdBQ1QsZ0NBQ0EsUUFBUSxVQUFVLDBCQUEwQixZQUM5QztBQUFBLG1CQUpGLGlDQUtBO0FBQUEsZ0JBRUQsUUFBUSxhQUFhLHFCQUNwQixTQUFDLFFBQUQ7QUFBQSxrQkFDRSxXQUFXLEdBQ1QsZ0NBQ0EsUUFBUSxVQUFVLDBCQUEwQixhQUM5QztBQUFBLG1CQUpGLGlDQUtBO0FBQUEsZ0JBRUQsUUFBUSxhQUFhLHFCQUNwQixTQUFDLFFBQUQ7QUFBQSxrQkFDRSxXQUFXLEdBQ1QsZ0NBQ0EsUUFBUSxVQUFVLDBCQUEwQixjQUM5QztBQUFBLG1CQUpGLGlDQUtBO0FBQUE7QUFBQSxlQTdCSixnQ0ErQkU7QUFBQTtBQUFBLFdBOURDLE9BQU8sS0FEZCxxQkFpRUUsQ0FDSDtBQUFBO0FBQUEsT0FsRkgsZ0NBbUZFO0FBQUE7QUFBQSxFQUlOLHVCQUNFLFNBK0NFLFlBL0NGO0FBQUEsSUFBWSxlQUFZO0FBQUEsSUFBWSxXQUFVO0FBQUEsSUFBOUMsMEJBQ0UsU0E2Q0UsT0E3Q0Y7QUFBQSxNQUNFLGVBQVk7QUFBQSxNQUNaLFdBQVU7QUFBQSxNQUZaLFVBSUcscUJBQXFCLElBQUksQ0FBQyxPQUFPLDBCQUNoQyxTQXNDRSxPQXRDRjtBQUFBLFFBRUUsZUFBYSxjQUFjLE1BQU0sS0FBSyxPQUFPLElBQUk7QUFBQSxRQUNqRCxTQUFTLE1BQU0saUJBQWlCLE1BQU0sSUFBSTtBQUFBLFFBQzFDLFdBQVU7QUFBQSxRQUpaLFVBc0NFO0FBQUEsMEJBaENBLFNBNkJFLGtCQTdCRjtBQUFBLFlBQWlCLE1BQUs7QUFBQSxZQUF0QiwwQkFDRSxTQTJCRSxRQUFPLEtBM0JUO0FBQUEsY0FFRSxTQUFTLEVBQUUsU0FBUyxHQUFHLEdBQUcsSUFBSTtBQUFBLGNBQzlCLFNBQVMsRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFFO0FBQUEsY0FDNUIsTUFBTSxFQUFFLFNBQVMsR0FBRyxHQUFHLElBQUk7QUFBQSxjQUMzQixZQUFZO0FBQUEsZ0JBQ1YsVUFBVTtBQUFBLGdCQUNWLE1BQU07QUFBQSxnQkFDTixPQUFPLFFBQVE7QUFBQSxjQUNqQjtBQUFBLGNBQ0EsV0FBVTtBQUFBLGNBVlosVUEyQkU7QUFBQSxnQ0FmQSxTQUtFLE1BTEY7QUFBQSxrQkFDRSxlQUFhLG9CQUFvQixNQUFNLEtBQUssT0FBTyxJQUFJO0FBQUEsa0JBQ3ZELFdBQVU7QUFBQSxrQkFGWixVQUlHLE1BQU07QUFBQSxtQkFKVCxpQ0FLRTtBQUFBLGdCQUNELE1BQU0sYUFBYSxxQkFDbEIsU0FNRSxRQU5GO0FBQUEsa0JBQ0UsZUFBYSwwQkFBMEIsTUFBTSxLQUFLLE9BQU8sSUFBSTtBQUFBLGtCQUM3RCxXQUFVO0FBQUEsa0JBRlosVUFNRTtBQUFBLG9CQUZDLE1BQU07QUFBQSxvQkFBWTtBQUFBLG9CQUNsQixNQUFNLGVBQWUsSUFBSSxVQUFVO0FBQUE7QUFBQSxtQkFMdEMsZ0NBTUU7QUFBQTtBQUFBLGVBeEJDLFNBQVMsU0FEaEIscUJBMkJFO0FBQUEsYUE1QkosaUNBNkJFO0FBQUEsVUFFRCxtQkFBbUIsS0FBSztBQUFBO0FBQUEsU0FwQ3BCLE1BQU0sTUFEYixxQkFzQ0UsQ0FDSDtBQUFBLE9BNUNILGlDQTZDRTtBQUFBLEtBOUNKLGlDQStDRTtBQUFBO0FBSU4sSUFBZTs7O0FDbk5mLDRCQUFTLDRCQUFpQjs7O0FDUDFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVlBO0FBTUE7QUFBQTtBQU9PLFNBQVMsa0JBQWtCLEdBQUcsWUFBcUM7QUFBQSxFQUN4RSxRQUFRLGFBQWEsTUFBTSx1QkFBdUIsbUJBQW1CO0FBQUEsRUFDckUsT0FBTyxhQUFhLGtCQUFrQixRQUFNLFNBQzFDLElBQ0Y7QUFBQSxFQUdBLE1BQU0sY0FBYyxVQUFVLGFBQWE7QUFBQSxJQUV6QyxzQkFBc0I7QUFBQSxNQUNwQixVQUFVO0FBQUEsSUFDWjtBQUFBLEVBQ0YsQ0FBQztBQUFBLEVBRUQsTUFBTSxjQUFjLFVBQVUsYUFBYTtBQUFBLElBRXpDLHNCQUFzQjtBQUFBLE1BQ3BCLE9BQU87QUFBQSxNQUNQLFdBQVc7QUFBQSxJQUNiO0FBQUEsRUFDRixDQUFDO0FBQUEsRUFFRCxNQUFNLFVBQVUsV0FBVyxhQUFhLFdBQVc7QUFBQSxFQUVuRCxNQUFNLGtCQUFrQixDQUFDLFVBQTBCO0FBQUEsSUFDakQsUUFBUSxXQUFXO0FBQUEsSUFHbkIsSUFBSSxPQUFPLEtBQUssU0FBUyxTQUFTLGtCQUFrQjtBQUFBLE1BQ2xELGVBQWUsT0FBTyxLQUFLLFFBQVEsS0FBSztBQUFBLElBQzFDO0FBQUE7QUFBQSxFQUdGLE1BQU0sZ0JBQWdCLENBQUMsVUFBd0I7QUFBQSxJQUM3QyxRQUFRLFFBQVEsU0FBUztBQUFBLElBRXpCLEtBQUssV0FBVyxTQUFTLGFBQWE7QUFBQSxNQUNwQyxlQUFlLElBQUk7QUFBQSxNQUNuQjtBQUFBLElBQ0Y7QUFBQSxJQUVBLElBQUksS0FBSyxLQUFLLFNBQVMsU0FBUyxhQUFhO0FBQUEsTUFDM0MsUUFBUSxNQUFNLE9BQU8sR0FBRyxTQUFTLE1BQU0sS0FBSyxLQUFLO0FBQUEsTUFHakQsTUFBTSxnQkFBZ0IsWUFBWSxpQkFBaUIsWUFBWTtBQUFBLE1BQy9ELE1BQU0sY0FBYyxZQUFZLGVBQWUsWUFBWTtBQUFBLE1BQzNELE1BQU0sa0JBQWtCLFlBQVksS0FBSyxlQUFlLFFBQVE7QUFBQSxNQUdoRSxNQUFNLFdBQVcscUJBQU0sSUFBSSxFQUN4QixLQUFLLElBQUksRUFDVCxPQUFPLFVBQVUsQ0FBQztBQUFBLE1BR3JCLElBQUksU0FBUyxTQUFTLElBQUksaUJBQWlCLFFBQVE7QUFBQSxNQUNuRCxJQUFJLE9BQU8sT0FBTyxPQUFPLFFBQVEsS0FBSyxDQUFDLEdBQUc7QUFBQSxRQUV4QyxTQUFTLE9BQU8sU0FBUyxHQUFHLEtBQUssRUFBRSxNQUFNLEtBQUs7QUFBQSxNQUNoRDtBQUFBLE1BR0EsWUFBWSxZQUFZLElBQUk7QUFBQSxRQUMxQixPQUFPO0FBQUEsUUFDUCxLQUFLO0FBQUEsTUFDUCxDQUFDO0FBQUEsSUFDSCxFQUFPLFNBQUksS0FBSyxLQUFLLFNBQVMsU0FBUyxZQUFZO0FBQUEsTUFDakQsUUFBUSxTQUFTLEtBQUssS0FBSztBQUFBLE1BQzNCLE1BQU0sVUFBVSxxQkFBTSxJQUFJO0FBQUEsTUFHMUIsTUFBTSxtQkFBbUIsWUFBWSxNQUFNLE9BQU8sWUFBWSxLQUFLLEtBQUs7QUFBQSxNQUN4RSxNQUFNLGdCQUFnQixZQUFZLGlCQUFpQixZQUFZO0FBQUEsTUFDL0QsTUFBTSxjQUFjLFlBQVksZUFBZSxZQUFZO0FBQUEsTUFFM0QsSUFBSSxpQkFBaUI7QUFBQSxRQUNuQixJQUFJLFNBQVMsUUFBUTtBQUFBLFVBRW5CLE1BQU0sWUFBWSxjQUFjLEtBQUs7QUFBQSxVQUNyQyxNQUFNLGNBQWMsY0FBYyxPQUFPO0FBQUEsVUFDekMsTUFBTSxVQUFVLFlBQVksS0FBSztBQUFBLFVBQ2pDLE1BQU0sWUFBWSxZQUFZLE9BQU87QUFBQSxVQUdyQyxNQUFNLGVBQWUsWUFBWSxLQUFLLGVBQWUsS0FBSztBQUFBLFVBRzFELE1BQU0sV0FBVyxRQUNkLFFBQVEsS0FBSyxFQUNiLEtBQUssU0FBUyxFQUNkLE9BQU8sV0FBVztBQUFBLFVBQ3JCLE1BQU0sU0FBUyxTQUNaLElBQUksY0FBYyxLQUFLLEVBQ3ZCLEtBQUssT0FBTyxFQUNaLE9BQU8sU0FBUztBQUFBLFVBRW5CLFlBQVksWUFBWSxJQUFJO0FBQUEsWUFDMUIsT0FBTztBQUFBLFlBQ1AsS0FBSztBQUFBLFlBQ0wsZUFBZTtBQUFBLFlBQ2YsYUFBYTtBQUFBLFVBQ2YsQ0FBQztBQUFBLFFBQ0gsRUFBTztBQUFBLFVBR0wsTUFBTSxpQkFBaUIsUUFBUSxLQUM3QixjQUFjLFFBQVEsS0FBSyxHQUMzQixLQUNGO0FBQUEsVUFHQSxNQUFNLFdBQVcsY0FBYyxJQUFJLGdCQUFnQixLQUFLO0FBQUEsVUFDeEQsTUFBTSxTQUFTLFlBQVksSUFBSSxnQkFBZ0IsS0FBSztBQUFBLFVBRXBELFlBQVksWUFBWSxJQUFJO0FBQUEsWUFDMUIsT0FBTztBQUFBLFlBQ1AsS0FBSztBQUFBLFlBQ0wsZUFBZTtBQUFBLFlBQ2YsYUFBYTtBQUFBLFVBQ2YsQ0FBQztBQUFBO0FBQUEsTUFFTCxFQUFPO0FBQUEsUUFFTCxNQUFNLFdBQVcsUUFDZCxLQUFLLFlBQVksTUFBTSxLQUFLLENBQUMsRUFDN0IsT0FBTyxZQUFZLE1BQU0sT0FBTyxDQUFDO0FBQUEsUUFHcEMsTUFBTSxrQkFBa0IsWUFBWSxJQUFJLEtBQ3RDLFlBQVksT0FDWixRQUNGO0FBQUEsUUFDQSxNQUFNLFNBQVMsU0FBUyxJQUFJLGlCQUFpQixRQUFRO0FBQUEsUUFFckQsWUFBWSxZQUFZLElBQUk7QUFBQSxVQUMxQixPQUFPO0FBQUEsVUFDUCxLQUFLO0FBQUEsVUFDTCxlQUFlO0FBQUEsVUFDZixhQUFhO0FBQUEsUUFDZixDQUFDO0FBQUE7QUFBQSxJQUVMO0FBQUEsSUFFQSxlQUFlLElBQUk7QUFBQTtBQUFBLEVBR3JCLE1BQU0sbUJBQW1CLENBQUMsV0FBNEI7QUFBQSxJQUNwRCxlQUFlLElBQUk7QUFBQTtBQUFBLEVBSXJCLElBQUksb0JBQW9CO0FBQUEsSUFDdEIsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLHVCQUNFLFNBcUJFLFlBckJGO0FBQUEsSUFDRTtBQUFBLElBQ0EsYUFBYTtBQUFBLElBQ2IsV0FBVztBQUFBLElBQ1gsY0FBYztBQUFBLElBQ2Qsb0JBQW9CO0FBQUEsSUFMdEIsVUFxQkU7QUFBQSxNQWRDO0FBQUEsc0JBQ0QsU0FZRSxhQVpGO0FBQUEsUUFBYSxXQUFXLENBQUMsa0JBQWtCO0FBQUEsUUFBM0MsVUFDRywrQkFDQyxTQVFFLE9BUkY7QUFBQSxVQUNFLFdBQVcsR0FDVCxrRkFDQSxZQUFZLG1CQUFtQixlQUMvQixZQUFZLFNBQVMsWUFDdkI7QUFBQSxVQUxGLFVBT0csYUFBYTtBQUFBLFdBUGhCLGlDQVFFO0FBQUEsU0FWTixpQ0FZRTtBQUFBO0FBQUEsS0FwQkosZ0NBcUJFO0FBQUE7OztBQ3pNTjtBQUFBLGlCQUNFO0FBQUEsZUFDQTtBQUFBLGFBQ0E7QUFBQSxjQUNBO0FBQUE7O0FBd0JLLElBQU0sbUJBQW9EO0FBQUEsRUFDL0Q7QUFBQSxFQUNBLFNBQVMsQ0FBQztBQUFBLEVBQ1YsaUJBQWlCO0FBQUEsRUFDakI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE1BQ0k7QUFBQSxFQUVKLE9BQU8sYUFBYSxrQkFBa0IsVUFBc0IscUJBQU0sQ0FBQztBQUFBLEVBQ25FLE9BQU8sTUFBTSxXQUFXLFVBQTRDLE9BQU87QUFBQSxFQUMzRSxPQUFPLGVBQWUsb0JBQW9CLFVBQTBCLE1BQU07QUFBQSxFQUMxRSxPQUFPLGlCQUFpQixzQkFBc0IsVUFBa0IsS0FBSztBQUFBLEVBQ3JFLE9BQU8sZUFBZSxvQkFBb0IsVUFBK0IsSUFBSTtBQUFBLEVBQzdFLE9BQU8sY0FBYyxtQkFBbUIsVUFBNkIsSUFBSTtBQUFBLEVBQ3pFLE9BQU8sZUFBZSxvQkFBb0IsVUFBaUIsVUFBVSxJQUFJO0FBQUEsRUFDekUsT0FBTyxpQkFBaUIsc0JBQXNCLFVBQWlCLGFBQVksRUFBRTtBQUFBLEVBRzdFLFdBQVUsTUFBTTtBQUFBLElBQ2QsSUFBSSxRQUFRO0FBQUEsTUFDVixpQkFBaUIsTUFBTTtBQUFBLElBQ3pCO0FBQUEsS0FDQyxDQUFDLE1BQU0sQ0FBQztBQUFBLEVBR1gsV0FBVSxNQUFNO0FBQUEsSUFDZCxJQUFJLFFBQVE7QUFBQSxNQUNWLGlCQUFpQixNQUFNO0FBQUEsTUFDdkIscUJBQU0sT0FBTyxNQUFNO0FBQUEsSUFDckI7QUFBQSxLQUNDLENBQUMsTUFBTSxDQUFDO0FBQUEsRUFHWCxXQUFVLE1BQU07QUFBQSxJQUNkLElBQUksV0FBVTtBQUFBLE1BQ1osbUJBQW1CLFNBQVE7QUFBQSxNQUMzQixxQkFBTSxHQUFHLFdBQVcsU0FBUTtBQUFBLElBQzlCO0FBQUEsS0FDQyxDQUFDLFNBQVEsQ0FBQztBQUFBLEVBR2IsTUFBTSxhQUFhLGFBQVksQ0FBQyxTQUFzQjtBQUFBLElBQ3BELGVBQWUsSUFBSTtBQUFBLEtBQ2xCLENBQUMsQ0FBQztBQUFBLEVBRUwsTUFBTSxhQUFhLGFBQVksTUFBTTtBQUFBLElBQ25DLFFBQVE7QUFBQSxXQUNEO0FBQUEsUUFDSCxlQUFlLENBQUMsaUJBQWdCLGFBQVksSUFBSSxHQUFHLE9BQU8sQ0FBQztBQUFBLFFBQzNEO0FBQUEsV0FDRztBQUFBLFFBQ0gsZUFBZSxDQUFDLGlCQUFnQixhQUFZLElBQUksR0FBRyxNQUFNLENBQUM7QUFBQSxRQUMxRDtBQUFBLFdBQ0c7QUFBQSxRQUNILGVBQWUsQ0FBQyxpQkFBZ0IsYUFBWSxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQUEsUUFDekQ7QUFBQSxXQUNHO0FBQUEsUUFDSCxlQUFlLENBQUMsaUJBQWdCLGFBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQztBQUFBLFFBQzFEO0FBQUE7QUFBQSxLQUVILENBQUMsSUFBSSxDQUFDO0FBQUEsRUFFVCxNQUFNLGFBQWEsYUFBWSxNQUFNO0FBQUEsSUFDbkMsUUFBUTtBQUFBLFdBQ0Q7QUFBQSxRQUNILGVBQWUsQ0FBQyxpQkFBZ0IsYUFBWSxTQUFTLEdBQUcsT0FBTyxDQUFDO0FBQUEsUUFDaEU7QUFBQSxXQUNHO0FBQUEsUUFDSCxlQUFlLENBQUMsaUJBQWdCLGFBQVksU0FBUyxHQUFHLE1BQU0sQ0FBQztBQUFBLFFBQy9EO0FBQUEsV0FDRztBQUFBLFFBQ0gsZUFBZSxDQUFDLGlCQUFnQixhQUFZLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFBQSxRQUM5RDtBQUFBLFdBQ0c7QUFBQSxRQUNILGVBQWUsQ0FBQyxpQkFBZ0IsYUFBWSxTQUFTLEdBQUcsTUFBTSxDQUFDO0FBQUEsUUFDL0Q7QUFBQTtBQUFBLEtBRUgsQ0FBQyxJQUFJLENBQUM7QUFBQSxFQUVULE1BQU0sUUFBUSxhQUFZLE1BQU07QUFBQSxJQUM5QixlQUFlLHFCQUFNLENBQUM7QUFBQSxLQUNyQixDQUFDLENBQUM7QUFBQSxFQUVMLE1BQU0sV0FBVyxhQUFZLENBQUMsVUFBeUI7QUFBQSxJQUNyRCxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsR0FBRyxZQUFZLEtBQUssQ0FBQztBQUFBLEtBQ3RELENBQUMsQ0FBQztBQUFBLEVBRUwsTUFBTSxjQUFjLGFBQ2xCLENBQUMsU0FBaUIsaUJBQXlDO0FBQUEsSUFDekQsaUJBQWlCLENBQUMsZUFDaEIsV0FBVyxJQUFJLENBQUMsVUFDZCxNQUFNLE9BQU8sVUFBVSxLQUFLLFVBQVUsYUFBYSxJQUFJLEtBQ3pELENBQ0Y7QUFBQSxLQUVGLENBQUMsQ0FDSDtBQUFBLEVBRUEsTUFBTSxjQUFjLGFBQVksQ0FBQyxZQUFvQjtBQUFBLElBQ25ELGlCQUFpQixDQUFDLGVBQ2hCLFdBQVcsT0FBTyxDQUFDLFVBQVUsTUFBTSxPQUFPLE9BQU8sQ0FDbkQ7QUFBQSxLQUNDLENBQUMsQ0FBQztBQUFBLEVBRUwsTUFBTSxZQUFZLGFBQVksQ0FBQyxVQUF5QjtBQUFBLElBQ3RELGlCQUFpQixLQUFLO0FBQUEsSUFDdEIsbUJBQW1CLElBQUk7QUFBQSxLQUN0QixDQUFDLENBQUM7QUFBQSxFQUVMLE1BQU0saUJBQWlCLGFBQVksTUFBTTtBQUFBLElBQ3ZDLGdCQUFnQixJQUFJO0FBQUEsSUFDcEIsaUJBQWlCLElBQUk7QUFBQSxJQUNyQixtQkFBbUIsS0FBSztBQUFBLEtBQ3ZCLENBQUMsQ0FBQztBQUFBLEVBR0wsTUFBTSxtQkFBbUIsYUFDdkIsQ0FBQyxZQUErQztBQUFBLElBQzlDLFFBQVEsT0FBTztBQUFBLElBQ2YsZUFBZSxPQUFPO0FBQUEsS0FFeEIsQ0FBQyxZQUFZLENBQ2Y7QUFBQSxFQUVBLE1BQU0sbUJBQW1CLGFBQ3ZCLENBQUMsVUFBeUI7QUFBQSxJQUN4QixJQUFJO0FBQUEsTUFBa0I7QUFBQSxJQUN0QixJQUFJLGNBQWM7QUFBQSxNQUNoQixhQUFhLEtBQUs7QUFBQSxJQUNwQixFQUFPO0FBQUEsTUFDTCxVQUFVLEtBQUs7QUFBQTtBQUFBLEtBR25CLENBQUMsa0JBQWtCLGNBQWMsU0FBUyxDQUM1QztBQUFBLEVBRUEsTUFBTSxrQkFBa0IsYUFDdEIsQ0FBQyxXQUF3QixZQUF5QjtBQUFBLElBQ2hELElBQUk7QUFBQSxNQUFrQjtBQUFBLElBRXRCLElBQUksYUFBYTtBQUFBLE1BQ2YsWUFBWSxXQUFXLE9BQU87QUFBQSxJQUNoQyxFQUFPO0FBQUEsTUFDTCxnQkFBZ0IsU0FBUztBQUFBLE1BQ3pCLGlCQUFpQjtBQUFBLFFBQ2YsT0FBTztBQUFBLFFBQ1AsT0FBTztBQUFBLFFBQ1AsS0FBSztBQUFBLFFBQ0wsYUFBYTtBQUFBLFFBQ2IsUUFBUTtBQUFBLFFBQ1IsYUFBYTtBQUFBLFFBQ2IsWUFBWTtBQUFBLFFBQ1osZUFBZTtBQUFBLE1BQ2pCLENBQWtCO0FBQUEsTUFDbEIsbUJBQW1CLElBQUk7QUFBQTtBQUFBLEtBRzNCLENBQUMsYUFBYSxnQkFBZ0IsQ0FDaEM7QUFBQSxFQUdBLE1BQU0sb0JBQW9CLGFBQ3hCLENBQ0UsTUFDQSxNQUNBLEtBQ0EsU0FDZ0I7QUFBQSxJQUNoQixRQUFRO0FBQUEsV0FDRDtBQUFBLFFBQ0gsT0FBTyxLQUFLLElBQUksS0FBSyxLQUFLO0FBQUEsV0FDdkI7QUFBQSxRQUNILElBQUksUUFBUSxLQUFLLFNBQVMsR0FBRztBQUFBLFVBRTNCLElBQUksV0FBVyxLQUFLLElBQUksR0FBRyxLQUFLO0FBQUEsVUFDaEMsSUFBSSxZQUFZO0FBQUEsVUFHaEIsT0FBTyxZQUFZLEdBQUc7QUFBQSxZQUNwQixJQUFJLEtBQUssU0FBUyxTQUFTLElBQUksQ0FBQyxHQUFHO0FBQUEsY0FDakMsT0FBTztBQUFBLFlBQ1Q7QUFBQSxZQUNBLFdBQVcsU0FBUyxJQUFJLEdBQUcsS0FBSztBQUFBLFlBQ2hDO0FBQUEsVUFDRjtBQUFBLFVBR0EsT0FBTyxLQUFLLElBQUksS0FBSyxNQUFNO0FBQUEsUUFDN0IsRUFBTztBQUFBLFVBRUwsT0FBTyxLQUFLLElBQUksS0FBSyxNQUFNO0FBQUE7QUFBQSxXQUUxQjtBQUFBLFFBQ0gsT0FBTyxLQUFLLElBQUksS0FBSyxPQUFPO0FBQUEsV0FDekI7QUFBQSxRQUNILE9BQU8sS0FBSyxJQUFJLEtBQUssTUFBTTtBQUFBO0FBQUEsS0FHakMsQ0FBQyxDQUNIO0FBQUEsRUFHQSxNQUFNLHVCQUF1QixhQUMzQixDQUNFLFdBQ0EsV0FDQSxZQUNvQjtBQUFBLElBQ3BCLE1BQU0saUJBQWtDLENBQUM7QUFBQSxJQUN6QyxLQUFLLFVBQVU7QUFBQSxNQUFZLE9BQU8sQ0FBQyxTQUFTO0FBQUEsSUFFNUM7QUFBQSxNQUNFO0FBQUEsTUFDQTtBQUFBLE1BQ0EsU0FBUztBQUFBLE1BQ1Q7QUFBQSxNQUNBO0FBQUEsTUFDQSxhQUFhLENBQUM7QUFBQSxRQUNaLFVBQVU7QUFBQSxJQUdkLE1BQU0scUJBQXFCLE9BQU8sT0FDaEMsQ0FBQyxVQUFVLE1BQU0sa0JBQWtCLFVBQVUsTUFBTSxNQUFNLFdBQzNEO0FBQUEsSUFHQSxNQUFNLFdBQVcsVUFBVSxJQUFJLEtBQUssVUFBVSxPQUFPLFFBQVE7QUFBQSxJQUc3RCxNQUFNLGFBQ0oscUJBQXFCLGtCQUFrQixTQUFTLE9BQU8sSUFDbkQsb0JBQ0E7QUFBQSxJQUVOLElBQUksZUFBYyxVQUFVLE1BQU0sTUFBTTtBQUFBLElBQ3hDLElBQUksY0FBYztBQUFBLElBR2xCLElBQUksYUFBWSxRQUFRLFVBQVUsR0FBRztBQUFBLE1BQ25DLE9BQU8sQ0FBQztBQUFBLElBQ1Y7QUFBQSxJQUlBLElBQUksYUFBWSxTQUFTLFNBQVMsR0FBRztBQUFBLE1BQ25DLFFBQVE7QUFBQSxhQUNELFNBQVM7QUFBQSxVQUNaLE1BQU0sWUFDSixLQUFLLE1BQU0sVUFBVSxLQUFLLGNBQWEsS0FBSyxJQUFJLFFBQVEsSUFDeEQ7QUFBQSxVQUNGLElBQUksWUFBWSxHQUFHO0FBQUEsWUFDakIsZUFBYyxhQUFZLElBQUksV0FBVyxLQUFLO0FBQUEsVUFDaEQ7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLGFBQ0ssVUFBVTtBQUFBLFVBQ2IsS0FBSyxjQUFjLFdBQVcsV0FBVyxHQUFHO0FBQUEsWUFDMUMsTUFBTSxhQUNKLEtBQUssTUFBTSxVQUFVLEtBQUssY0FBYSxNQUFNLElBQUksUUFBUSxJQUN6RDtBQUFBLFlBQ0YsSUFBSSxhQUFhLEdBQUc7QUFBQSxjQUNsQixlQUFjLGFBQVksSUFBSSxZQUFZLE1BQU07QUFBQSxZQUNsRDtBQUFBLFVBQ0Y7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLGFBQ0ssV0FBVztBQUFBLFVBQ2QsTUFBTSxjQUNKLEtBQUssTUFBTSxVQUFVLEtBQUssY0FBYSxPQUFPLElBQUksUUFBUSxJQUMxRDtBQUFBLFVBQ0YsSUFBSSxjQUFjLEdBQUc7QUFBQSxZQUNuQixlQUFjLGFBQVksSUFBSSxhQUFhLE9BQU87QUFBQSxVQUNwRDtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsYUFDSyxVQUFVO0FBQUEsVUFDYixNQUFNLGFBQ0osS0FBSyxNQUFNLFVBQVUsS0FBSyxjQUFhLE1BQU0sSUFBSSxRQUFRLElBQ3pEO0FBQUEsVUFDRixJQUFJLGFBQWEsR0FBRztBQUFBLFlBQ2xCLGVBQWMsYUFBWSxJQUFJLFlBQVksTUFBTTtBQUFBLFVBQ2xEO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQTtBQUFBLElBRUo7QUFBQSxJQUVBLFFBQ0csYUFBWSxTQUFTLFVBQVUsS0FDOUIsYUFBWSxPQUFPLFlBQVksS0FBSyxPQUNyQyxVQUFVLGFBQWEsY0FBYyxRQUN0QztBQUFBLE1BRUEsTUFBTSxpQkFBaUIsYUFBWSxPQUFPLFlBQVk7QUFBQSxNQUd0RCxJQUNFLFdBQVcsS0FDVCxDQUFDLFNBQVMsS0FBSyxPQUFPLFlBQVksTUFBTSxjQUMxQyxHQUNBO0FBQUEsUUFFQSxlQUFjLGtCQUNaLGNBQ0EsV0FDQSxVQUNBLFVBQ0Y7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLE1BR0EsSUFDRSxjQUFjLFlBQ2QsY0FDQSxXQUFXLFNBQVMsTUFDbkIsV0FBVyxTQUFTLGFBQVksSUFBSSxDQUFDLEdBQ3RDO0FBQUEsUUFDQSxlQUFjLGFBQVksSUFBSSxHQUFHLEtBQUs7QUFBQSxRQUN0QztBQUFBLE1BQ0Y7QUFBQSxNQUdBLE1BQU0saUJBQWlCLG1CQUFtQixLQUN4QyxDQUFDLFVBQVUsTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLGNBQ2xEO0FBQUEsTUFFQSxJQUFJLGdCQUFnQjtBQUFBLFFBRWxCLGVBQWUsS0FBSyxjQUFjO0FBQUEsTUFDcEMsRUFBTyxTQUFJLGFBQVksUUFBUSxVQUFVLFNBQVMsR0FBRyxLQUFLLENBQUMsR0FBRztBQUFBLFFBRTVELE1BQU0sZ0JBQStCO0FBQUEsYUFDaEM7QUFBQSxVQUNILElBQUksR0FBRyxVQUFVLE1BQU0sYUFBWSxPQUFPLFVBQVU7QUFBQSxVQUNwRCxPQUFPLGFBQVksTUFBTTtBQUFBLFVBQ3pCLEtBQUssYUFBWSxNQUFNLEVBQUUsSUFBSSxVQUFVLFFBQVE7QUFBQSxVQUMvQyxhQUFhO0FBQUEsVUFDYixlQUFlLFVBQVU7QUFBQSxRQUMzQjtBQUFBLFFBQ0EsZUFBZSxLQUFLLGFBQWE7QUFBQSxNQUNuQztBQUFBLE1BRUE7QUFBQSxNQUNBLGVBQWMsa0JBQ1osY0FDQSxXQUNBLFVBQ0EsVUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUVBLE9BQU87QUFBQSxLQUVULENBQUMsUUFBUSxpQkFBaUIsQ0FDNUI7QUFBQSxFQUdBLE1BQU0sd0JBQXdCLGFBQzVCLENBQUMsT0FBb0IsUUFBc0M7QUFBQSxJQUN6RCxNQUFNLFlBQVksTUFBTSxRQUFRLEtBQUs7QUFBQSxJQUNyQyxNQUFNLFVBQVUsSUFBSSxNQUFNLEtBQUs7QUFBQSxJQUcvQixNQUFNLGdCQUFnQixPQUFPLE9BQU8sQ0FBQyxVQUFVO0FBQUEsTUFFN0MsUUFFSSxNQUFNLE1BQU0sUUFBUSxTQUFTLEtBQUssTUFBTSxNQUFNLE9BQU8sU0FBUyxPQUM3RCxNQUFNLE1BQU0sU0FBUyxPQUFPLEtBQUssTUFBTSxNQUFNLE9BQU8sT0FBTyxPQUU1RCxNQUFNLElBQUksUUFBUSxTQUFTLEtBQUssTUFBTSxJQUFJLE9BQU8sU0FBUyxPQUN6RCxNQUFNLElBQUksU0FBUyxPQUFPLEtBQUssTUFBTSxJQUFJLE9BQU8sT0FBTyxNQUV6RCxNQUFNLE1BQU0sU0FBUyxTQUFTLEtBQUssTUFBTSxJQUFJLFFBQVEsT0FBTztBQUFBLEtBRWhFO0FBQUEsSUFHRCxNQUFNLHdCQUF3QixPQUFPLE9BQ25DLENBQUMsVUFBVSxNQUFNLGVBQWUsTUFBTSxhQUN4QztBQUFBLElBR0EsSUFBSSxrQkFBbUMsQ0FBQztBQUFBLElBQ3hDLHNCQUFzQixRQUFRLENBQUMsZ0JBQWdCO0FBQUEsTUFDN0MsTUFBTSxXQUFXLHFCQUFxQixhQUFhLFdBQVcsT0FBTztBQUFBLE1BQ3JFLGtCQUFrQixDQUFDLEdBQUcsaUJBQWlCLEdBQUcsUUFBUTtBQUFBLEtBQ25EO0FBQUEsSUFHRCxPQUFPLENBQUMsR0FBRyxlQUFlLEdBQUcsZUFBZSxFQUFFLE9BQzVDLENBQUMsT0FBTyxPQUFPLFNBQ2IsVUFBVSxLQUFLLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxNQUFNLEVBQUUsQ0FDckQ7QUFBQSxLQUVGLENBQUMsUUFBUSxvQkFBb0IsQ0FDL0I7QUFBQSxFQUVBLE1BQU0sbUJBQW1CLGFBQ3ZCLENBQUMsU0FBdUM7QUFBQSxJQUN0QyxNQUFNLE1BQU0sS0FBSyxRQUFRLEtBQUs7QUFBQSxJQUM5QixNQUFNLFVBQVUsSUFBSSxJQUFJLEdBQUcsS0FBSztBQUFBLElBQ2hDLE9BQU8sc0JBQXNCLEtBQUssT0FBTztBQUFBLEtBRTNDLENBQUMscUJBQXFCLENBQ3hCO0FBQUEsRUFHQSxNQUFNLG9CQUFvQixhQUFZLENBQUMsVUFBeUI7QUFBQSxJQUM5RCxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsR0FBRyxZQUFZLEtBQUssQ0FBQztBQUFBLEtBQ3RELENBQUMsQ0FBQztBQUFBLEVBRUwsTUFBTSx1QkFBdUIsYUFDM0IsQ0FBQyxTQUFpQixjQUF1QjtBQUFBLElBQ3ZDLGlCQUFpQixDQUFDLGVBQWU7QUFBQSxNQUUvQixNQUFNLFFBQVEsV0FBVyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sT0FBTztBQUFBLE1BQ3JELEtBQUs7QUFBQSxRQUFPLE9BQU87QUFBQSxNQUVuQixJQUFJLE1BQU0sa0JBQWtCLFdBQVc7QUFBQSxRQUlyQyxNQUFNLGNBQWMsV0FBVyxLQUM3QixDQUFDLE1BQU0sRUFBRSxPQUFPLE1BQU0sYUFDeEI7QUFBQSxRQUNBLEtBQUssZ0JBQWdCLFlBQVk7QUFBQSxVQUFZLE9BQU87QUFBQSxRQUdwRCxPQUFPLFdBQVcsSUFBSSxDQUFDLE1BQU07QUFBQSxVQUMzQixJQUFJLEVBQUUsT0FBTyxNQUFNLGVBQWU7QUFBQSxZQUNoQyxPQUFPO0FBQUEsaUJBQ0Y7QUFBQSxjQUNILFlBQVk7QUFBQSxtQkFDUCxFQUFFO0FBQUEsZ0JBQ0wsWUFBWTtBQUFBLGtCQUNWLEdBQUksRUFBRSxXQUFZLGNBQWMsQ0FBQztBQUFBLGtCQUNqQyxNQUFNLE1BQU0sUUFBUSxLQUFLO0FBQUEsZ0JBQzNCO0FBQUEsY0FDRjtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsVUFDQSxPQUFPO0FBQUEsU0FDUjtBQUFBLE1BQ0gsRUFBTyxTQUFJLE1BQU0saUJBQWlCLFdBQVc7QUFBQSxRQUczQyxPQUFPLFdBQVcsT0FDaEIsQ0FBQyxNQUNDLEVBQUUsT0FBTyxNQUFNLGlCQUNmLEVBQUUsa0JBQWtCLE1BQU0sYUFDOUI7QUFBQSxNQUNGLEVBQU8sU0FBSSxNQUFNLFlBQVk7QUFBQSxRQUUzQixPQUFPLFdBQVcsT0FDaEIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxNQUFNLE1BQU0sRUFBRSxrQkFBa0IsTUFBTSxFQUN4RDtBQUFBLE1BQ0YsRUFBTztBQUFBLFFBRUwsT0FBTyxXQUFXLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxNQUFNLEVBQUU7QUFBQTtBQUFBLEtBRXBEO0FBQUEsS0FFSCxDQUFDLENBQ0g7QUFBQSxFQUVBLE1BQU0sdUJBQXVCLGFBQzNCLENBQ0UsU0FDQSxjQUNBLGNBQ0c7QUFBQSxJQUNILGlCQUFpQixDQUFDLGVBQWU7QUFBQSxNQUUvQixNQUFNLFFBQVEsV0FBVyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sT0FBTztBQUFBLE1BQ3JELEtBQUs7QUFBQSxRQUFPLE9BQU87QUFBQSxNQUVuQixJQUFJLE1BQU0sa0JBQWtCLFdBQVc7QUFBQSxRQUlyQyxNQUFNLGlCQUFnQztBQUFBLGFBQ2pDO0FBQUEsYUFDQTtBQUFBLFVBQ0gsYUFBYTtBQUFBLFFBQ2Y7QUFBQSxRQUdBLE1BQU0sZ0JBQWdCLFdBQVcsSUFBSSxDQUFDLE1BQU07QUFBQSxVQUMxQyxJQUFJLEVBQUUsT0FBTyxNQUFNLGVBQWU7QUFBQSxZQUNoQyxPQUFPO0FBQUEsaUJBQ0Y7QUFBQSxjQUNILFlBQVk7QUFBQSxtQkFDUCxFQUFFO0FBQUEsZ0JBQ0wsWUFBWTtBQUFBLGtCQUNWLEdBQUksRUFBRSxXQUFZLGNBQWMsQ0FBQztBQUFBLGtCQUNqQyxNQUFNLE1BQU0sUUFBUSxLQUFLO0FBQUEsZ0JBQzNCO0FBQUEsY0FDRjtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsVUFDQSxPQUFPO0FBQUEsU0FDUjtBQUFBLFFBRUQsT0FBTyxDQUFDLEdBQUcsZUFBZSxjQUFjO0FBQUEsTUFDMUMsRUFBTyxTQUFJLE1BQU0saUJBQWlCLFdBQVc7QUFBQSxRQUczQyxPQUFPLFdBQVcsSUFBSSxDQUFDLE1BQU07QUFBQSxVQUMzQixJQUFJLEVBQUUsT0FBTyxNQUFNLGVBQWU7QUFBQSxZQUNoQyxPQUFPLEtBQUssTUFBTSxhQUFhO0FBQUEsVUFDakM7QUFBQSxVQUNBLE9BQU87QUFBQSxTQUNSO0FBQUEsTUFDSCxFQUFPLFNBQUksTUFBTSxZQUFZO0FBQUEsUUFFM0IsT0FBTyxXQUFXLElBQUksQ0FBQyxNQUFNO0FBQUEsVUFDM0IsSUFBSSxFQUFFLE9BQU8sTUFBTSxJQUFJO0FBQUEsWUFDckIsT0FBTyxLQUFLLE1BQU0sYUFBYTtBQUFBLFVBQ2pDO0FBQUEsVUFDQSxPQUFPO0FBQUEsU0FDUjtBQUFBLE1BQ0gsRUFBTztBQUFBLFFBRUwsT0FBTyxXQUFXLElBQUksQ0FBQyxNQUFNO0FBQUEsVUFDM0IsSUFBSSxFQUFFLE9BQU8sTUFBTSxJQUFJO0FBQUEsWUFDckIsT0FBTyxLQUFLLE1BQU0sYUFBYTtBQUFBLFVBQ2pDO0FBQUEsVUFDQSxPQUFPO0FBQUEsU0FDUjtBQUFBO0FBQUEsS0FFSjtBQUFBLEtBRUgsQ0FBQyxDQUNIO0FBQUEsRUFFQSxNQUFNLG1DQUFtQyxhQUN2QyxDQUFDLFNBQWlCLFNBQXNCO0FBQUEsSUFDdEMsaUJBQWlCLENBQUMsZUFBZTtBQUFBLE1BRS9CLE1BQU0sUUFBUSxXQUFXLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxPQUFPO0FBQUEsTUFDckQsS0FBSyxVQUFVLE1BQU07QUFBQSxRQUFZLE9BQU87QUFBQSxNQUd4QyxPQUFPLFdBQVcsSUFBSSxDQUFDLE1BQU07QUFBQSxRQUMzQixJQUFJLEVBQUUsT0FBTyxTQUFTO0FBQUEsVUFDcEIsT0FBTztBQUFBLGVBQ0Y7QUFBQSxZQUNILFlBQVk7QUFBQSxpQkFDUCxFQUFFO0FBQUEsY0FDTCxZQUFZO0FBQUEsZ0JBQ1YsR0FBSSxFQUFFLFdBQVksY0FBYyxDQUFDO0FBQUEsZ0JBQ2pDLEtBQUssUUFBUSxLQUFLO0FBQUEsY0FDcEI7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxRQUNBLE9BQU87QUFBQSxPQUNSO0FBQUEsS0FDRjtBQUFBLEtBRUgsQ0FBQyxDQUNIO0FBQUEsRUFHQSxNQUFNLGVBQWUsU0FDbkIsT0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsSUFDQSxRQUFRO0FBQUEsSUFDUjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsU0FBUztBQUFBLElBQ1Q7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsZUFBZSxNQUFNLG1CQUFtQixJQUFJO0FBQUEsSUFDNUM7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsY0FBYztBQUFBLElBQ2QsYUFBYTtBQUFBLElBQ2I7QUFBQSxJQUNBLFVBQVU7QUFBQSxJQUNWO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQ0E7QUFBQSxJQUNFO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FDRjtBQUFBLEVBRUEsdUJBQ0UsU0FFRSxnQkFBZ0IsVUFGbEI7QUFBQSxJQUEwQixPQUFPO0FBQUEsSUFBakM7QUFBQSxzQ0FFRTtBQUFBOzs7O0FGaHFCTixJQUFNLGtCQUE0QixNQUFNO0FBQUEsRUFDdEM7QUFBQSxJQUNFO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxNQUNFLG1CQUFtQjtBQUFBLEVBRXZCLE1BQU0sVUFBVTtBQUFBLElBQ2QsdUJBQU8sU0FBQyxXQUFEO0FBQUEsTUFBdUI7QUFBQSxPQUFSLFNBQWYsc0JBQW1EO0FBQUEsSUFDMUQsc0JBQU0sU0FBQyxtQkFBRCxJQUFjLFFBQWQsc0JBQXFCO0FBQUEsSUFDM0IscUJBQUssU0FBQyxrQkFBRCxJQUFhLE9BQWIsc0JBQW1CO0FBQUEsSUFDeEIsc0JBQU0sU0FBQyxtQkFBRCxJQUFjLFFBQWQsc0JBQXFCO0FBQUEsRUFDN0I7QUFBQSxFQUVBLE1BQU0saUJBQWlCLENBQUMsVUFBeUI7QUFBQSxJQUMvQyxZQUFZLE1BQU0sSUFBSSxLQUFLO0FBQUE7QUFBQSxFQUc3QixNQUFNLGlCQUFpQixDQUFDLFVBQXlCO0FBQUEsSUFDL0MsWUFBWSxNQUFNLEVBQUU7QUFBQTtBQUFBLEVBR3RCLHVCQUNFLFNBOEJFLE9BOUJGO0FBQUEsSUFBSyxXQUFVO0FBQUEsSUFBZixVQThCRTtBQUFBLHNCQTdCQSxTQUFDLHFCQUFELHFDQUFRO0FBQUEsc0JBR1IsU0FhRSxvQkFiRjtBQUFBLGtDQUNFLFNBV0Usa0JBWEY7QUFBQSxVQUFpQixNQUFLO0FBQUEsVUFBdEIsMEJBQ0UsU0FTRSxRQUFPLEtBVFQ7QUFBQSxZQUVFLFNBQVMsRUFBRSxTQUFTLEdBQUcsR0FBRyxHQUFHO0FBQUEsWUFDN0IsU0FBUyxFQUFFLFNBQVMsR0FBRyxHQUFHLEVBQUU7QUFBQSxZQUM1QixNQUFNLEVBQUUsU0FBUyxHQUFHLEdBQUcsSUFBSTtBQUFBLFlBQzNCLFlBQVksRUFBRSxVQUFVLEtBQUssTUFBTSxZQUFZO0FBQUEsWUFDL0MsV0FBVTtBQUFBLFlBTlosVUFRRyxRQUFRO0FBQUEsYUFQSixNQURQLHNCQVNFO0FBQUEsV0FWSixpQ0FXRTtBQUFBLFNBWkosaUNBYUU7QUFBQSxNQUdELG1DQUNDLFNBQUMsV0FBRDtBQUFBLFFBQ0UsU0FBUztBQUFBLFFBQ1Q7QUFBQSxRQUNBO0FBQUEsUUFDQSxPQUFPO0FBQUEsUUFDUCxVQUFVO0FBQUEsUUFDVixVQUFVO0FBQUEsU0FOWixpQ0FPQTtBQUFBO0FBQUEsS0E1QkosZ0NBOEJFO0FBQUE7QUFxQk4sSUFBTSxlQUF1QztBQUFBLEVBQzNDLFFBQVE7QUFBQSxFQUNSLFFBQVE7QUFBQSxFQUNSLFNBQVM7QUFBQSxFQUNULFdBQVc7QUFBQSxFQUNYLFVBQVU7QUFBQSxFQUNWLFFBQVE7QUFBQSxFQUNSLFVBQVU7QUFDWjtBQUVBLElBQU0seUJBQXlCO0FBQ3hCLElBQU0sZ0JBQXlDO0FBQUEsRUFDcEQ7QUFBQSxFQUNBLGlCQUFpQjtBQUFBLEVBQ2pCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBLGVBQWU7QUFBQSxFQUNmLG1CQUFtQjtBQUFBLEVBQ25CLHNCQUFzQjtBQUFBLE1BQ2xCO0FBQUEsRUFDSix1QkFDRSxTQWlCRSxrQkFqQkY7QUFBQSxJQUNFO0FBQUEsSUFDQSxnQkFBZ0IsYUFBYTtBQUFBLElBQzdCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBZEYsMEJBZ0JFLFNBQUMsaUJBQUQscUNBQWlCO0FBQUEsS0FoQm5CLGlDQWlCRTtBQUFBOyIsCiAgImRlYnVnSWQiOiAiNjExNkNDNjhCMTkxQjU0MTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|