@ditojs/ui 2.23.0 → 2.24.1
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/dist/dito-ui.es.js +154 -150
- package/dist/dito-ui.umd.js +9 -9
- package/package.json +5 -5
- package/src/utils/index.js +1 -1
- package/src/utils/vue.js +5 -1
package/dist/dito-ui.es.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { isSymbol as Nt, def as
|
|
2
|
-
import { asArray as es, isString as ts, hyphenate as
|
|
1
|
+
import { isSymbol as Nt, def as Js, extend as z, isObject as K, toRawType as Qn, hasOwn as C, isArray as E, isIntegerKey as Xt, makeMap as Gs, hasChanged as Re, isMap as Ie, capitalize as ft, getGlobalThis as Zn, camelize as pt, isString as we, normalizeClass as x, normalizeStyle as Je, isFunction as L, isOn as Xs, NOOP as ke, EMPTY_ARR as Qs, EMPTY_OBJ as X, isSet as Ze, isPlainObject as Zs, isPromise as eo, toHandlerKey as to, toNumber as no, looseIndexOf as Qt, looseEqual as ht, invokeArrayFns as so, looseToNumber as $t, toDisplayString as I } from "@vue/shared";
|
|
2
|
+
import { asArray as es, isString as ts, hyphenate as oo, defaultFormats as gt, format as mt, assignDeeply as ro } from "@ditojs/utils";
|
|
3
3
|
function ns(e) {
|
|
4
4
|
return {
|
|
5
5
|
year: (e == null ? void 0 : e.getFullYear()) ?? 0,
|
|
@@ -36,7 +36,7 @@ function Zt(e, {
|
|
|
36
36
|
p = r
|
|
37
37
|
] = os(e, { date: n, time: s });
|
|
38
38
|
if (c && c.length >= 4) {
|
|
39
|
-
t === "en-US" && i === "/" && u === "/" && ([o, l] = [l, o]), l =
|
|
39
|
+
t === "en-US" && i === "/" && u === "/" && ([o, l] = [l, o]), l = io(l, { locale: t });
|
|
40
40
|
const m = (w) => w === null || w.length === 2;
|
|
41
41
|
if (l !== null && (!s || m(d) && m(a) && m(f)))
|
|
42
42
|
return new Date(
|
|
@@ -91,7 +91,7 @@ function os(e, { date: t = !0, time: n = !0 } = {}) {
|
|
|
91
91
|
const s = (e == null ? void 0 : e.split(/([\s.,:/]+)/)) || [];
|
|
92
92
|
return t || s.unshift("1", ".", "1", ".", "2000", " "), !n && s.length > 5 && (s.length = 5), s;
|
|
93
93
|
}
|
|
94
|
-
function
|
|
94
|
+
function io(e, { locale: t = "en-US" } = {}) {
|
|
95
95
|
const n = +e;
|
|
96
96
|
if (!isNaN(n))
|
|
97
97
|
return n - 1;
|
|
@@ -114,20 +114,20 @@ function ro(e, { locale: t = "en-US" } = {}) {
|
|
|
114
114
|
function bn(e, ...t) {
|
|
115
115
|
console.warn(`[Vue warn] ${e}`, ...t);
|
|
116
116
|
}
|
|
117
|
-
let
|
|
118
|
-
function
|
|
117
|
+
let lo;
|
|
118
|
+
function ao(e, t = lo) {
|
|
119
119
|
t && t.active && t.effects.push(e);
|
|
120
120
|
}
|
|
121
121
|
let ze;
|
|
122
|
-
class
|
|
122
|
+
class uo {
|
|
123
123
|
constructor(t, n, s, r) {
|
|
124
|
-
this.fn = t, this.trigger = n, this.scheduler = s, this.active = !0, this.deps = [], this._dirtyLevel = 3, this._trackId = 0, this._runnings = 0, this._queryings = 0, this._depsLength = 0,
|
|
124
|
+
this.fn = t, this.trigger = n, this.scheduler = s, this.active = !0, this.deps = [], this._dirtyLevel = 3, this._trackId = 0, this._runnings = 0, this._queryings = 0, this._depsLength = 0, ao(this, r);
|
|
125
125
|
}
|
|
126
126
|
get dirty() {
|
|
127
127
|
if (this._dirtyLevel === 1) {
|
|
128
128
|
this._dirtyLevel = 0, this._queryings++, Dt();
|
|
129
129
|
for (const t of this.deps)
|
|
130
|
-
if (t.computed && (
|
|
130
|
+
if (t.computed && (co(t.computed), this._dirtyLevel >= 2))
|
|
131
131
|
break;
|
|
132
132
|
Ct(), this._queryings--;
|
|
133
133
|
}
|
|
@@ -151,7 +151,7 @@ class ao {
|
|
|
151
151
|
this.active && (En(this), Sn(this), (t = this.onStop) == null || t.call(this), this.active = !1);
|
|
152
152
|
}
|
|
153
153
|
}
|
|
154
|
-
function
|
|
154
|
+
function co(e) {
|
|
155
155
|
return e.value;
|
|
156
156
|
}
|
|
157
157
|
function En(e) {
|
|
@@ -184,7 +184,7 @@ function tn() {
|
|
|
184
184
|
for (Rt--; !Rt && At.length; )
|
|
185
185
|
At.shift()();
|
|
186
186
|
}
|
|
187
|
-
function
|
|
187
|
+
function fo(e, t, n) {
|
|
188
188
|
var s;
|
|
189
189
|
if (t.get(e) !== e._trackId) {
|
|
190
190
|
t.set(e, e._trackId);
|
|
@@ -193,7 +193,7 @@ function co(e, t, n) {
|
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
195
|
const At = [];
|
|
196
|
-
function
|
|
196
|
+
function po(e, t, n) {
|
|
197
197
|
var s;
|
|
198
198
|
en();
|
|
199
199
|
for (const r of e.keys())
|
|
@@ -203,7 +203,7 @@ function fo(e, t, n) {
|
|
|
203
203
|
}
|
|
204
204
|
tn();
|
|
205
205
|
}
|
|
206
|
-
const
|
|
206
|
+
const ho = (e, t) => {
|
|
207
207
|
const n = /* @__PURE__ */ new Map();
|
|
208
208
|
return n.cleanup = e, n.computed = t, n;
|
|
209
209
|
}, Lt = /* @__PURE__ */ new WeakMap(), De = Symbol(process.env.NODE_ENV !== "production" ? "iterate" : ""), Ht = Symbol(process.env.NODE_ENV !== "production" ? "Map key iterate" : "");
|
|
@@ -212,7 +212,7 @@ function F(e, t, n) {
|
|
|
212
212
|
let s = Lt.get(e);
|
|
213
213
|
s || Lt.set(e, s = /* @__PURE__ */ new Map());
|
|
214
214
|
let r = s.get(n);
|
|
215
|
-
r || s.set(n, r =
|
|
215
|
+
r || s.set(n, r = ho(() => s.delete(n))), fo(
|
|
216
216
|
ze,
|
|
217
217
|
r,
|
|
218
218
|
process.env.NODE_ENV !== "production" ? {
|
|
@@ -249,7 +249,7 @@ function _e(e, t, n, s, r, o) {
|
|
|
249
249
|
}
|
|
250
250
|
en();
|
|
251
251
|
for (const u of l)
|
|
252
|
-
u &&
|
|
252
|
+
u && po(
|
|
253
253
|
u,
|
|
254
254
|
3,
|
|
255
255
|
process.env.NODE_ENV !== "production" ? {
|
|
@@ -263,10 +263,10 @@ function _e(e, t, n, s, r, o) {
|
|
|
263
263
|
);
|
|
264
264
|
tn();
|
|
265
265
|
}
|
|
266
|
-
const
|
|
266
|
+
const go = /* @__PURE__ */ Gs("__proto__,__v_isRef,__isVue"), ls = new Set(
|
|
267
267
|
/* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((e) => e !== "arguments" && e !== "caller").map((e) => Symbol[e]).filter(Nt)
|
|
268
|
-
), Vn = /* @__PURE__ */
|
|
269
|
-
function
|
|
268
|
+
), Vn = /* @__PURE__ */ mo();
|
|
269
|
+
function mo() {
|
|
270
270
|
const e = {};
|
|
271
271
|
return ["includes", "indexOf", "lastIndexOf"].forEach((t) => {
|
|
272
272
|
e[t] = function(...n) {
|
|
@@ -284,7 +284,7 @@ function go() {
|
|
|
284
284
|
};
|
|
285
285
|
}), e;
|
|
286
286
|
}
|
|
287
|
-
function
|
|
287
|
+
function yo(e) {
|
|
288
288
|
const t = V(this);
|
|
289
289
|
return F(t, "has", e), t.hasOwnProperty(e);
|
|
290
290
|
}
|
|
@@ -301,7 +301,7 @@ class as {
|
|
|
301
301
|
if (n === "__v_isShallow")
|
|
302
302
|
return o;
|
|
303
303
|
if (n === "__v_raw")
|
|
304
|
-
return s === (r ? o ? ps : fs : o ?
|
|
304
|
+
return s === (r ? o ? ps : fs : o ? Oo : ds).get(t) || // receiver is not the reactive proxy, but has the same prototype
|
|
305
305
|
// this means the reciever is a user proxy of the reactive proxy
|
|
306
306
|
Object.getPrototypeOf(t) === Object.getPrototypeOf(s) ? t : void 0;
|
|
307
307
|
const i = E(t);
|
|
@@ -309,13 +309,13 @@ class as {
|
|
|
309
309
|
if (i && C(Vn, n))
|
|
310
310
|
return Reflect.get(Vn, n, s);
|
|
311
311
|
if (n === "hasOwnProperty")
|
|
312
|
-
return
|
|
312
|
+
return yo;
|
|
313
313
|
}
|
|
314
314
|
const l = Reflect.get(t, n, s);
|
|
315
|
-
return (Nt(n) ? ls.has(n) :
|
|
315
|
+
return (Nt(n) ? ls.has(n) : go(n)) || (r || F(t, "get", n), o) ? l : Y(l) ? i && Xt(n) ? l : l.value : K(l) ? r ? gs(l) : hs(l) : l;
|
|
316
316
|
}
|
|
317
317
|
}
|
|
318
|
-
class
|
|
318
|
+
class _o extends as {
|
|
319
319
|
constructor(t = !1) {
|
|
320
320
|
super(!1, t);
|
|
321
321
|
}
|
|
@@ -362,7 +362,7 @@ class us extends as {
|
|
|
362
362
|
), !0;
|
|
363
363
|
}
|
|
364
364
|
}
|
|
365
|
-
const
|
|
365
|
+
const wo = /* @__PURE__ */ new _o(), vo = /* @__PURE__ */ new us(), bo = /* @__PURE__ */ new us(!0), nn = (e) => e, Tt = (e) => Reflect.getPrototypeOf(e);
|
|
366
366
|
function et(e, t, n = !1, s = !1) {
|
|
367
367
|
e = e.__v_raw;
|
|
368
368
|
const r = V(e), o = V(t);
|
|
@@ -446,7 +446,7 @@ function ae(e) {
|
|
|
446
446
|
return e === "delete" ? !1 : e === "clear" ? void 0 : this;
|
|
447
447
|
};
|
|
448
448
|
}
|
|
449
|
-
function
|
|
449
|
+
function Eo() {
|
|
450
450
|
const e = {
|
|
451
451
|
get(o) {
|
|
452
452
|
return et(this, o);
|
|
@@ -530,24 +530,24 @@ function bo() {
|
|
|
530
530
|
];
|
|
531
531
|
}
|
|
532
532
|
const [
|
|
533
|
-
Eo,
|
|
534
533
|
So,
|
|
535
534
|
Vo,
|
|
536
|
-
No
|
|
537
|
-
|
|
535
|
+
No,
|
|
536
|
+
Do
|
|
537
|
+
] = /* @__PURE__ */ Eo();
|
|
538
538
|
function sn(e, t) {
|
|
539
|
-
const n = t ? e ?
|
|
539
|
+
const n = t ? e ? Do : No : e ? Vo : So;
|
|
540
540
|
return (s, r, o) => r === "__v_isReactive" ? !e : r === "__v_isReadonly" ? e : r === "__v_raw" ? s : Reflect.get(
|
|
541
541
|
C(n, r) && r in s ? n : s,
|
|
542
542
|
r,
|
|
543
543
|
o
|
|
544
544
|
);
|
|
545
545
|
}
|
|
546
|
-
const
|
|
546
|
+
const Co = {
|
|
547
547
|
get: /* @__PURE__ */ sn(!1, !1)
|
|
548
|
-
}, Co = {
|
|
549
|
-
get: /* @__PURE__ */ sn(!0, !1)
|
|
550
548
|
}, To = {
|
|
549
|
+
get: /* @__PURE__ */ sn(!0, !1)
|
|
550
|
+
}, xo = {
|
|
551
551
|
get: /* @__PURE__ */ sn(!0, !0)
|
|
552
552
|
};
|
|
553
553
|
function cs(e, t, n) {
|
|
@@ -559,8 +559,8 @@ function cs(e, t, n) {
|
|
|
559
559
|
);
|
|
560
560
|
}
|
|
561
561
|
}
|
|
562
|
-
const ds = /* @__PURE__ */ new WeakMap(),
|
|
563
|
-
function
|
|
562
|
+
const ds = /* @__PURE__ */ new WeakMap(), Oo = /* @__PURE__ */ new WeakMap(), fs = /* @__PURE__ */ new WeakMap(), ps = /* @__PURE__ */ new WeakMap();
|
|
563
|
+
function Po(e) {
|
|
564
564
|
switch (e) {
|
|
565
565
|
case "Object":
|
|
566
566
|
case "Array":
|
|
@@ -574,15 +574,15 @@ function Oo(e) {
|
|
|
574
574
|
return 0;
|
|
575
575
|
}
|
|
576
576
|
}
|
|
577
|
-
function
|
|
578
|
-
return e.__v_skip || !Object.isExtensible(e) ? 0 :
|
|
577
|
+
function Mo(e) {
|
|
578
|
+
return e.__v_skip || !Object.isExtensible(e) ? 0 : Po(Qn(e));
|
|
579
579
|
}
|
|
580
580
|
function hs(e) {
|
|
581
581
|
return Oe(e) ? e : on(
|
|
582
582
|
e,
|
|
583
583
|
!1,
|
|
584
|
-
|
|
585
|
-
|
|
584
|
+
wo,
|
|
585
|
+
Co,
|
|
586
586
|
ds
|
|
587
587
|
);
|
|
588
588
|
}
|
|
@@ -590,8 +590,8 @@ function gs(e) {
|
|
|
590
590
|
return on(
|
|
591
591
|
e,
|
|
592
592
|
!0,
|
|
593
|
-
|
|
594
|
-
|
|
593
|
+
vo,
|
|
594
|
+
To,
|
|
595
595
|
fs
|
|
596
596
|
);
|
|
597
597
|
}
|
|
@@ -599,8 +599,8 @@ function rt(e) {
|
|
|
599
599
|
return on(
|
|
600
600
|
e,
|
|
601
601
|
!0,
|
|
602
|
-
|
|
603
|
-
|
|
602
|
+
bo,
|
|
603
|
+
xo,
|
|
604
604
|
ps
|
|
605
605
|
);
|
|
606
606
|
}
|
|
@@ -612,7 +612,7 @@ function on(e, t, n, s, r) {
|
|
|
612
612
|
const o = r.get(e);
|
|
613
613
|
if (o)
|
|
614
614
|
return o;
|
|
615
|
-
const i =
|
|
615
|
+
const i = Mo(e);
|
|
616
616
|
if (i === 0)
|
|
617
617
|
return e;
|
|
618
618
|
const l = new Proxy(
|
|
@@ -637,8 +637,8 @@ function V(e) {
|
|
|
637
637
|
const t = e && e.__v_raw;
|
|
638
638
|
return t ? V(t) : e;
|
|
639
639
|
}
|
|
640
|
-
function
|
|
641
|
-
return
|
|
640
|
+
function ms(e) {
|
|
641
|
+
return Js(e, "__v_skip", !0), e;
|
|
642
642
|
}
|
|
643
643
|
const rn = (e) => K(e) ? hs(e) : e, ln = (e) => K(e) ? gs(e) : e;
|
|
644
644
|
function Y(e) {
|
|
@@ -681,7 +681,7 @@ function v(e, ...t) {
|
|
|
681
681
|
e + t.join(""),
|
|
682
682
|
n && n.proxy,
|
|
683
683
|
r.map(
|
|
684
|
-
({ vnode: o }) => `at <${
|
|
684
|
+
({ vnode: o }) => `at <${Hs(n, o.type)}>`
|
|
685
685
|
).join(`
|
|
686
686
|
`),
|
|
687
687
|
r
|
|
@@ -718,7 +718,7 @@ function Lo(e) {
|
|
|
718
718
|
}), t;
|
|
719
719
|
}
|
|
720
720
|
function Ho({ vnode: e, recurseCount: t }) {
|
|
721
|
-
const n = t > 0 ? `... (${t} recursive calls)` : "", s = e.component ? e.component.parent == null : !1, r = ` at <${
|
|
721
|
+
const n = t > 0 ? `... (${t} recursive calls)` : "", s = e.component ? e.component.parent == null : !1, r = ` at <${Hs(
|
|
722
722
|
e.component,
|
|
723
723
|
e.type,
|
|
724
724
|
s
|
|
@@ -728,11 +728,11 @@ function Ho({ vnode: e, recurseCount: t }) {
|
|
|
728
728
|
function Bo(e) {
|
|
729
729
|
const t = [], n = Object.keys(e);
|
|
730
730
|
return n.slice(0, 3).forEach((s) => {
|
|
731
|
-
t.push(...
|
|
731
|
+
t.push(...ys(s, e[s]));
|
|
732
732
|
}), n.length > 3 && t.push(" ..."), t;
|
|
733
733
|
}
|
|
734
|
-
function
|
|
735
|
-
return we(t) ? (t = JSON.stringify(t), n ? t : [`${e}=${t}`]) : typeof t == "number" || typeof t == "boolean" || t == null ? n ? t : [`${e}=${t}`] : Y(t) ? (t =
|
|
734
|
+
function ys(e, t, n) {
|
|
735
|
+
return we(t) ? (t = JSON.stringify(t), n ? t : [`${e}=${t}`]) : typeof t == "number" || typeof t == "boolean" || t == null ? n ? t : [`${e}=${t}`] : Y(t) ? (t = ys(e, V(t.value), !0), n ? t : [`${e}=Ref<`, t, ">"]) : L(t) ? [`${e}=fn${t.name ? `<${t.name}>` : ""}`] : (t = V(t), n ? t : [`${e}=`, t]);
|
|
736
736
|
}
|
|
737
737
|
function Ko(e, t) {
|
|
738
738
|
process.env.NODE_ENV !== "production" && e !== void 0 && (typeof e != "number" ? v(`${t} is not a valid number - got ${JSON.stringify(e)}.`) : isNaN(e) && v(`${t} is NaN - the duration expression might be incorrect.`));
|
|
@@ -780,7 +780,7 @@ function xe(e, t, n, s) {
|
|
|
780
780
|
function Fe(e, t, n, s) {
|
|
781
781
|
if (L(e)) {
|
|
782
782
|
const o = xe(e, t, n, s);
|
|
783
|
-
return o &&
|
|
783
|
+
return o && eo(o) && o.catch((i) => {
|
|
784
784
|
un(i, t, n);
|
|
785
785
|
}), o;
|
|
786
786
|
}
|
|
@@ -830,11 +830,11 @@ const Q = [];
|
|
|
830
830
|
let he = 0;
|
|
831
831
|
const $e = [];
|
|
832
832
|
let re = null, de = 0;
|
|
833
|
-
const
|
|
833
|
+
const _s = /* @__PURE__ */ Promise.resolve();
|
|
834
834
|
let cn = null;
|
|
835
835
|
const jo = 100;
|
|
836
836
|
function Yo(e) {
|
|
837
|
-
const t = cn ||
|
|
837
|
+
const t = cn || _s;
|
|
838
838
|
return e ? t.then(this ? e.bind(this) : e) : t;
|
|
839
839
|
}
|
|
840
840
|
function zo(e) {
|
|
@@ -849,16 +849,16 @@ function dn(e) {
|
|
|
849
849
|
(!Q.length || !Q.includes(
|
|
850
850
|
e,
|
|
851
851
|
_t && e.allowRecurse ? he + 1 : he
|
|
852
|
-
)) && (e.id == null ? Q.push(e) : Q.splice(zo(e.id), 0, e),
|
|
852
|
+
)) && (e.id == null ? Q.push(e) : Q.splice(zo(e.id), 0, e), ws());
|
|
853
853
|
}
|
|
854
|
-
function
|
|
855
|
-
!_t && !Ut && (Ut = !0, cn =
|
|
854
|
+
function ws() {
|
|
855
|
+
!_t && !Ut && (Ut = !0, cn = _s.then(bs));
|
|
856
856
|
}
|
|
857
|
-
function
|
|
857
|
+
function vs(e) {
|
|
858
858
|
E(e) ? $e.push(...e) : (!re || !re.includes(
|
|
859
859
|
e,
|
|
860
860
|
e.allowRecurse ? de + 1 : de
|
|
861
|
-
)) && $e.push(e),
|
|
861
|
+
)) && $e.push(e), ws();
|
|
862
862
|
}
|
|
863
863
|
function Wo(e) {
|
|
864
864
|
if ($e.length) {
|
|
@@ -870,7 +870,7 @@ function Wo(e) {
|
|
|
870
870
|
return;
|
|
871
871
|
}
|
|
872
872
|
for (re = t, process.env.NODE_ENV !== "production" && (e = e || /* @__PURE__ */ new Map()), de = 0; de < re.length; de++)
|
|
873
|
-
process.env.NODE_ENV !== "production" &&
|
|
873
|
+
process.env.NODE_ENV !== "production" && Es(e, re[de]) || re[de]();
|
|
874
874
|
re = null, de = 0;
|
|
875
875
|
}
|
|
876
876
|
}
|
|
@@ -884,9 +884,9 @@ const Ge = (e) => e.id == null ? 1 / 0 : e.id, qo = (e, t) => {
|
|
|
884
884
|
}
|
|
885
885
|
return n;
|
|
886
886
|
};
|
|
887
|
-
function
|
|
887
|
+
function bs(e) {
|
|
888
888
|
Ut = !1, _t = !0, process.env.NODE_ENV !== "production" && (e = e || /* @__PURE__ */ new Map()), Q.sort(qo);
|
|
889
|
-
const t = process.env.NODE_ENV !== "production" ? (n) =>
|
|
889
|
+
const t = process.env.NODE_ENV !== "production" ? (n) => Es(e, n) : ke;
|
|
890
890
|
try {
|
|
891
891
|
for (he = 0; he < Q.length; he++) {
|
|
892
892
|
const n = Q[he];
|
|
@@ -897,10 +897,10 @@ function vs(e) {
|
|
|
897
897
|
}
|
|
898
898
|
}
|
|
899
899
|
} finally {
|
|
900
|
-
he = 0, Q.length = 0, Wo(e), _t = !1, cn = null, (Q.length || $e.length) &&
|
|
900
|
+
he = 0, Q.length = 0, Wo(e), _t = !1, cn = null, (Q.length || $e.length) && bs(e);
|
|
901
901
|
}
|
|
902
902
|
}
|
|
903
|
-
function
|
|
903
|
+
function Es(e, t) {
|
|
904
904
|
if (!e.has(t))
|
|
905
905
|
e.set(t, 1);
|
|
906
906
|
else {
|
|
@@ -930,7 +930,7 @@ function Jo(e, t) {
|
|
|
930
930
|
}), !0);
|
|
931
931
|
}
|
|
932
932
|
function We(e) {
|
|
933
|
-
return
|
|
933
|
+
return Bs(e) ? e.__vccOpts : e;
|
|
934
934
|
}
|
|
935
935
|
function Go(e, t) {
|
|
936
936
|
const n = wt.get(e);
|
|
@@ -950,7 +950,7 @@ function Xo(e, t) {
|
|
|
950
950
|
"[HMR] Root or manually mounted instance modified. Full reload required."
|
|
951
951
|
);
|
|
952
952
|
}
|
|
953
|
-
|
|
953
|
+
vs(() => {
|
|
954
954
|
for (const r of s)
|
|
955
955
|
Me.delete(
|
|
956
956
|
We(r.type)
|
|
@@ -977,12 +977,12 @@ let ge, je = [], jt = !1;
|
|
|
977
977
|
function Qo(e, ...t) {
|
|
978
978
|
ge ? ge.emit(e, ...t) : jt || je.push({ event: e, args: t });
|
|
979
979
|
}
|
|
980
|
-
function
|
|
980
|
+
function Ss(e, t) {
|
|
981
981
|
var n, s;
|
|
982
982
|
ge = e, ge ? (ge.enabled = !0, je.forEach(({ event: r, args: o }) => ge.emit(r, ...o)), je = []) : /* handle late devtools injection - only do this if we are in an actual */ /* browser environment to avoid the timer handle stalling test runner exit */ /* (#4815) */ typeof window < "u" && // some envs mock window but not fully
|
|
983
983
|
window.HTMLElement && // also exclude jsdom
|
|
984
984
|
!((s = (n = window.navigator) == null ? void 0 : n.userAgent) != null && s.includes("jsdom")) ? ((t.__VUE_DEVTOOLS_HOOK_REPLAY__ = t.__VUE_DEVTOOLS_HOOK_REPLAY__ || []).push((o) => {
|
|
985
|
-
|
|
985
|
+
Ss(o, t);
|
|
986
986
|
}), setTimeout(() => {
|
|
987
987
|
ge || (t.__VUE_DEVTOOLS_HOOK_REPLAY__ = null, jt = !0, je = []);
|
|
988
988
|
}, 3e3)) : (jt = !0, je = []);
|
|
@@ -1002,10 +1002,10 @@ function er(e) {
|
|
|
1002
1002
|
);
|
|
1003
1003
|
};
|
|
1004
1004
|
}
|
|
1005
|
-
let D = null,
|
|
1005
|
+
let D = null, Vs = null;
|
|
1006
1006
|
function On(e) {
|
|
1007
1007
|
const t = D;
|
|
1008
|
-
return D = e,
|
|
1008
|
+
return D = e, Vs = e && e.type.__scopeId || null, t;
|
|
1009
1009
|
}
|
|
1010
1010
|
function j(e, t = D, n) {
|
|
1011
1011
|
if (!t || e._n)
|
|
@@ -1064,7 +1064,7 @@ function Pn(e, t) {
|
|
|
1064
1064
|
}
|
|
1065
1065
|
const sr = (e) => e.__isSuspense;
|
|
1066
1066
|
function or(e, t) {
|
|
1067
|
-
t && t.pendingBranch ? E(e) ? t.effects.push(...e) : t.effects.push(e) :
|
|
1067
|
+
t && t.pendingBranch ? E(e) ? t.effects.push(...e) : t.effects.push(e) : vs(e);
|
|
1068
1068
|
}
|
|
1069
1069
|
const rr = Symbol.for("v-scx"), ir = () => {
|
|
1070
1070
|
{
|
|
@@ -1157,7 +1157,7 @@ function lr(e, t, {
|
|
|
1157
1157
|
B.allowRecurse = !!t;
|
|
1158
1158
|
let G;
|
|
1159
1159
|
r === "sync" ? G = B : r === "post" ? G = () => An(B, c && c.suspense) : (B.pre = !0, c && (B.id = c.uid), G = () => dn(B));
|
|
1160
|
-
const N = new
|
|
1160
|
+
const N = new uo(a, ke, G), U = () => {
|
|
1161
1161
|
N.stop();
|
|
1162
1162
|
};
|
|
1163
1163
|
return process.env.NODE_ENV !== "production" && (N.onTrack = i, N.onTrigger = l), t ? n ? B() : H = N.run() : r === "post" ? An(
|
|
@@ -1169,7 +1169,7 @@ function ar(e, t, n) {
|
|
|
1169
1169
|
const s = this.proxy, r = we(e) ? e.includes(".") ? ur(s, e) : () => s[e] : e.bind(s, s);
|
|
1170
1170
|
let o;
|
|
1171
1171
|
L(t) ? o = t : (o = t.handler, n = t);
|
|
1172
|
-
const i =
|
|
1172
|
+
const i = As(this), l = lr(r, o.bind(s), n);
|
|
1173
1173
|
return i(), l;
|
|
1174
1174
|
}
|
|
1175
1175
|
function ur(e, t) {
|
|
@@ -1200,7 +1200,7 @@ function Ve(e, t, n = 0, s) {
|
|
|
1200
1200
|
e.forEach((r) => {
|
|
1201
1201
|
Ve(r, t, n, s);
|
|
1202
1202
|
});
|
|
1203
|
-
else if (
|
|
1203
|
+
else if (Zs(e))
|
|
1204
1204
|
for (const r in e)
|
|
1205
1205
|
Ve(e[r], t, n, s);
|
|
1206
1206
|
return e;
|
|
@@ -1208,7 +1208,7 @@ function Ve(e, t, n = 0, s) {
|
|
|
1208
1208
|
function vt(e, t) {
|
|
1209
1209
|
if (D === null)
|
|
1210
1210
|
return process.env.NODE_ENV !== "production" && v("withDirectives can only be used inside render functions."), e;
|
|
1211
|
-
const n =
|
|
1211
|
+
const n = Ls(D) || D.proxy, s = e.dirs || (e.dirs = []);
|
|
1212
1212
|
for (let r = 0; r < t.length; r++) {
|
|
1213
1213
|
let [o, i, l, u = X] = t[r];
|
|
1214
1214
|
o && (L(o) && (o = {
|
|
@@ -1239,7 +1239,7 @@ function cr() {
|
|
|
1239
1239
|
e.isUnmounting = !0;
|
|
1240
1240
|
}), e;
|
|
1241
1241
|
}
|
|
1242
|
-
const W = [Function, Array],
|
|
1242
|
+
const W = [Function, Array], Ns = {
|
|
1243
1243
|
mode: String,
|
|
1244
1244
|
appear: Boolean,
|
|
1245
1245
|
persisted: Boolean,
|
|
@@ -1260,12 +1260,12 @@ const W = [Function, Array], Vs = {
|
|
|
1260
1260
|
onAppearCancelled: W
|
|
1261
1261
|
}, dr = {
|
|
1262
1262
|
name: "BaseTransition",
|
|
1263
|
-
props:
|
|
1263
|
+
props: Ns,
|
|
1264
1264
|
setup(e, { slots: t }) {
|
|
1265
|
-
const n =
|
|
1265
|
+
const n = Rs(), s = cr();
|
|
1266
1266
|
let r;
|
|
1267
1267
|
return () => {
|
|
1268
|
-
const o = t.default &&
|
|
1268
|
+
const o = t.default && Cs(t.default(), !0);
|
|
1269
1269
|
if (!o || !o.length)
|
|
1270
1270
|
return;
|
|
1271
1271
|
let i = o[0];
|
|
@@ -1303,7 +1303,7 @@ const W = [Function, Array], Vs = {
|
|
|
1303
1303
|
const w = m();
|
|
1304
1304
|
r === void 0 ? r = w : w !== r && (r = w, p = !0);
|
|
1305
1305
|
}
|
|
1306
|
-
if (f && f.type !== ie && (!
|
|
1306
|
+
if (f && f.type !== ie && (!Ms(c, f) || p)) {
|
|
1307
1307
|
const w = zt(
|
|
1308
1308
|
f,
|
|
1309
1309
|
l,
|
|
@@ -1315,7 +1315,7 @@ const W = [Function, Array], Vs = {
|
|
|
1315
1315
|
s.isLeaving = !1, n.update.active !== !1 && (n.effect.dirty = !0, n.update());
|
|
1316
1316
|
}, Pt(i);
|
|
1317
1317
|
u === "in-out" && c.type !== ie && (w.delayLeave = ($, H, B) => {
|
|
1318
|
-
const G =
|
|
1318
|
+
const G = Ds(
|
|
1319
1319
|
s,
|
|
1320
1320
|
f
|
|
1321
1321
|
);
|
|
@@ -1328,7 +1328,7 @@ const W = [Function, Array], Vs = {
|
|
|
1328
1328
|
};
|
|
1329
1329
|
}
|
|
1330
1330
|
}, fr = dr;
|
|
1331
|
-
function
|
|
1331
|
+
function Ds(e, t) {
|
|
1332
1332
|
const { leavingVNodes: n } = e;
|
|
1333
1333
|
let s = n.get(t.type);
|
|
1334
1334
|
return s || (s = /* @__PURE__ */ Object.create(null), n.set(t.type, s)), s;
|
|
@@ -1350,7 +1350,7 @@ function zt(e, t, n, s) {
|
|
|
1350
1350
|
onAppear: $,
|
|
1351
1351
|
onAfterAppear: H,
|
|
1352
1352
|
onAppearCancelled: B
|
|
1353
|
-
} = t, G = String(e.key), N =
|
|
1353
|
+
} = t, G = String(e.key), N = Ds(n, e), U = (S, O) => {
|
|
1354
1354
|
S && Fe(
|
|
1355
1355
|
S,
|
|
1356
1356
|
s,
|
|
@@ -1375,7 +1375,7 @@ function zt(e, t, n, s) {
|
|
|
1375
1375
|
/* cancelled */
|
|
1376
1376
|
);
|
|
1377
1377
|
const k = N[G];
|
|
1378
|
-
k &&
|
|
1378
|
+
k && Ms(e, k) && k.el[fe] && k.el[fe](), U(O, [S]);
|
|
1379
1379
|
},
|
|
1380
1380
|
enter(S) {
|
|
1381
1381
|
let O = u, k = c, ne = d;
|
|
@@ -1411,11 +1411,11 @@ function zt(e, t, n, s) {
|
|
|
1411
1411
|
return se;
|
|
1412
1412
|
}
|
|
1413
1413
|
function Pt(e) {
|
|
1414
|
-
if (
|
|
1414
|
+
if (Ts(e))
|
|
1415
1415
|
return e = Le(e), e.children = null, e;
|
|
1416
1416
|
}
|
|
1417
1417
|
function Mn(e) {
|
|
1418
|
-
return
|
|
1418
|
+
return Ts(e) ? (
|
|
1419
1419
|
// #7121 ensure get the child component subtree in case
|
|
1420
1420
|
// it's been replaced during HMR
|
|
1421
1421
|
process.env.NODE_ENV !== "production" && e.component ? e.component.subTree : e.children ? e.children[0] : void 0
|
|
@@ -1424,13 +1424,13 @@ function Mn(e) {
|
|
|
1424
1424
|
function Wt(e, t) {
|
|
1425
1425
|
e.shapeFlag & 6 && e.component ? Wt(e.component.subTree, t) : e.shapeFlag & 128 ? (e.ssContent.transition = t.clone(e.ssContent), e.ssFallback.transition = t.clone(e.ssFallback)) : e.transition = t;
|
|
1426
1426
|
}
|
|
1427
|
-
function
|
|
1427
|
+
function Cs(e, t = !1, n) {
|
|
1428
1428
|
let s = [], r = 0;
|
|
1429
1429
|
for (let o = 0; o < e.length; o++) {
|
|
1430
1430
|
let i = e[o];
|
|
1431
1431
|
const l = n == null ? i.key : String(n) + String(i.key != null ? i.key : o);
|
|
1432
1432
|
i.type === T ? (i.patchFlag & 128 && r++, s = s.concat(
|
|
1433
|
-
|
|
1433
|
+
Cs(i.children, t, l)
|
|
1434
1434
|
)) : (t || i.type !== ie) && s.push(l != null ? Le(i, { key: l }) : i);
|
|
1435
1435
|
}
|
|
1436
1436
|
if (r > 1)
|
|
@@ -1438,28 +1438,28 @@ function Ds(e, t = !1, n) {
|
|
|
1438
1438
|
s[o].patchFlag = -2;
|
|
1439
1439
|
return s;
|
|
1440
1440
|
}
|
|
1441
|
-
const pr = (e) => !!e.type.__asyncLoader,
|
|
1441
|
+
const pr = (e) => !!e.type.__asyncLoader, Ts = (e) => e.type.__isKeepAlive;
|
|
1442
1442
|
function hr(e, t, n = be, s = !1) {
|
|
1443
1443
|
if (n) {
|
|
1444
1444
|
const r = n[e] || (n[e] = []), o = t.__weh || (t.__weh = (...i) => {
|
|
1445
1445
|
if (n.isUnmounted)
|
|
1446
1446
|
return;
|
|
1447
1447
|
Dt();
|
|
1448
|
-
const l =
|
|
1448
|
+
const l = As(n), u = Fe(t, n, e, i);
|
|
1449
1449
|
return l(), Ct(), u;
|
|
1450
1450
|
});
|
|
1451
1451
|
return s ? r.unshift(o) : r.push(o), o;
|
|
1452
1452
|
} else if (process.env.NODE_ENV !== "production") {
|
|
1453
|
-
const r =
|
|
1453
|
+
const r = to(an[e].replace(/ hook$/, ""));
|
|
1454
1454
|
v(
|
|
1455
1455
|
`${r} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). If you are using async setup(), make sure to register lifecycle hooks before the first await statement.`
|
|
1456
1456
|
);
|
|
1457
1457
|
}
|
|
1458
1458
|
}
|
|
1459
|
-
const
|
|
1459
|
+
const xs = (e) => (t, n = be) => (
|
|
1460
1460
|
// post-create lifecycle registrations are noops during SSR (except for serverPrefetch)
|
|
1461
1461
|
(!pn || e === "sp") && hr(e, (...s) => t(...s), n)
|
|
1462
|
-
), gr =
|
|
1462
|
+
), gr = xs("m"), mr = xs("bum");
|
|
1463
1463
|
function ye(e, t, n, s) {
|
|
1464
1464
|
let r;
|
|
1465
1465
|
const o = n && n[s];
|
|
@@ -1496,7 +1496,7 @@ function M(e, t, n = {}, s, r) {
|
|
|
1496
1496
|
process.env.NODE_ENV !== "production" && o && o.length > 1 && (v(
|
|
1497
1497
|
"SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template."
|
|
1498
1498
|
), o = () => []), o && o._c && (o._d = !1), g();
|
|
1499
|
-
const i = o &&
|
|
1499
|
+
const i = o && Os(o(n)), l = Ae(
|
|
1500
1500
|
T,
|
|
1501
1501
|
{
|
|
1502
1502
|
key: n.key || // slot content array of a dynamic conditional slot may have a branch
|
|
@@ -1508,10 +1508,10 @@ function M(e, t, n = {}, s, r) {
|
|
|
1508
1508
|
);
|
|
1509
1509
|
return !r && l.scopeId && (l.slotScopeIds = [l.scopeId + "-s"]), o && o._c && (o._d = !0), l;
|
|
1510
1510
|
}
|
|
1511
|
-
function
|
|
1512
|
-
return e.some((t) => Et(t) ? !(t.type === ie || t.type === T && !
|
|
1511
|
+
function Os(e) {
|
|
1512
|
+
return e.some((t) => Et(t) ? !(t.type === ie || t.type === T && !Os(t.children)) : !0) ? e : null;
|
|
1513
1513
|
}
|
|
1514
|
-
const qt = (e) => e ? Pr(e) ?
|
|
1514
|
+
const qt = (e) => e ? Pr(e) ? Ls(e) || e.proxy : qt(e.parent) : null, qe = (
|
|
1515
1515
|
// Move PURE marker to new line to workaround compiler discarding it
|
|
1516
1516
|
// due to type annotation
|
|
1517
1517
|
/* @__PURE__ */ z(/* @__PURE__ */ Object.create(null), {
|
|
@@ -1620,7 +1620,7 @@ function wr() {
|
|
|
1620
1620
|
return vr().slots;
|
|
1621
1621
|
}
|
|
1622
1622
|
function vr() {
|
|
1623
|
-
const e =
|
|
1623
|
+
const e = Rs();
|
|
1624
1624
|
return process.env.NODE_ENV !== "production" && !e && v("useContext() called without active instance."), e.setupContext || (e.setupContext = kr(e));
|
|
1625
1625
|
}
|
|
1626
1626
|
function kn(e) {
|
|
@@ -1755,11 +1755,11 @@ let Xe = 1;
|
|
|
1755
1755
|
function Ln(e) {
|
|
1756
1756
|
Xe += e;
|
|
1757
1757
|
}
|
|
1758
|
-
function
|
|
1759
|
-
return e.dynamicChildren = Xe > 0 ? ee ||
|
|
1758
|
+
function Ps(e) {
|
|
1759
|
+
return e.dynamicChildren = Xe > 0 ? ee || Qs : null, Tr(), Xe > 0 && ee && ee.push(e), e;
|
|
1760
1760
|
}
|
|
1761
1761
|
function _(e, t, n, s, r, o) {
|
|
1762
|
-
return
|
|
1762
|
+
return Ps(
|
|
1763
1763
|
y(
|
|
1764
1764
|
e,
|
|
1765
1765
|
t,
|
|
@@ -1772,7 +1772,7 @@ function _(e, t, n, s, r, o) {
|
|
|
1772
1772
|
);
|
|
1773
1773
|
}
|
|
1774
1774
|
function Ae(e, t, n, s, r) {
|
|
1775
|
-
return
|
|
1775
|
+
return Ps(
|
|
1776
1776
|
R(
|
|
1777
1777
|
e,
|
|
1778
1778
|
t,
|
|
@@ -1786,12 +1786,12 @@ function Ae(e, t, n, s, r) {
|
|
|
1786
1786
|
function Et(e) {
|
|
1787
1787
|
return e ? e.__v_isVNode === !0 : !1;
|
|
1788
1788
|
}
|
|
1789
|
-
function
|
|
1789
|
+
function Ms(e, t) {
|
|
1790
1790
|
return process.env.NODE_ENV !== "production" && t.shapeFlag & 6 && Me.has(t.type) ? (e.shapeFlag &= -257, t.shapeFlag &= -513, !1) : e.type === t.type && e.key === t.key;
|
|
1791
1791
|
}
|
|
1792
|
-
const xr = (...e) =>
|
|
1792
|
+
const xr = (...e) => Fs(
|
|
1793
1793
|
...e
|
|
1794
|
-
),
|
|
1794
|
+
), ks = "__vInternal", Is = ({ key: e }) => e ?? null, dt = ({
|
|
1795
1795
|
ref: e,
|
|
1796
1796
|
ref_key: t,
|
|
1797
1797
|
ref_for: n
|
|
@@ -1802,9 +1802,9 @@ function y(e, t = null, n = null, s = 0, r = null, o = e === T ? 0 : 1, i = !1,
|
|
|
1802
1802
|
__v_skip: !0,
|
|
1803
1803
|
type: e,
|
|
1804
1804
|
props: t,
|
|
1805
|
-
key: t &&
|
|
1805
|
+
key: t && Is(t),
|
|
1806
1806
|
ref: t && dt(t),
|
|
1807
|
-
scopeId:
|
|
1807
|
+
scopeId: Vs,
|
|
1808
1808
|
slotScopeIds: null,
|
|
1809
1809
|
children: n,
|
|
1810
1810
|
component: null,
|
|
@@ -1835,8 +1835,8 @@ function y(e, t = null, n = null, s = 0, r = null, o = e === T ? 0 : 1, i = !1,
|
|
|
1835
1835
|
// vnode should not be considered dynamic due to handler caching.
|
|
1836
1836
|
u.patchFlag !== 32 && ee.push(u), u;
|
|
1837
1837
|
}
|
|
1838
|
-
const R = process.env.NODE_ENV !== "production" ? xr :
|
|
1839
|
-
function
|
|
1838
|
+
const R = process.env.NODE_ENV !== "production" ? xr : Fs;
|
|
1839
|
+
function Fs(e, t = null, n = null, s = 0, r = null, o = !1) {
|
|
1840
1840
|
if ((!e || e === tr) && (process.env.NODE_ENV !== "production" && !e && v(`Invalid vnode type when creating vnode: ${e}.`), e = ie), Et(e)) {
|
|
1841
1841
|
const l = Le(
|
|
1842
1842
|
e,
|
|
@@ -1846,7 +1846,7 @@ function Is(e, t = null, n = null, s = 0, r = null, o = !1) {
|
|
|
1846
1846
|
);
|
|
1847
1847
|
return n && fn(l, n), Xe > 0 && !o && ee && (l.shapeFlag & 6 ? ee[ee.indexOf(e)] = l : ee.push(l)), l.patchFlag |= -2, l;
|
|
1848
1848
|
}
|
|
1849
|
-
if (
|
|
1849
|
+
if (Bs(e) && (e = e.__vccOpts), t) {
|
|
1850
1850
|
t = Or(t);
|
|
1851
1851
|
let { class: l, style: u } = t;
|
|
1852
1852
|
l && !we(l) && (t.class = x(l)), K(u) && (Kt(u) && !E(u) && (u = z({}, u)), t.style = Je(u));
|
|
@@ -1869,7 +1869,7 @@ Component that was made reactive: `,
|
|
|
1869
1869
|
);
|
|
1870
1870
|
}
|
|
1871
1871
|
function Or(e) {
|
|
1872
|
-
return e ? Kt(e) ||
|
|
1872
|
+
return e ? Kt(e) || ks in e ? z({}, e) : e : null;
|
|
1873
1873
|
}
|
|
1874
1874
|
function Le(e, t, n = !1) {
|
|
1875
1875
|
const { props: s, ref: r, patchFlag: o, children: i } = e, l = t ? te(s || {}, t) : s;
|
|
@@ -1878,7 +1878,7 @@ function Le(e, t, n = !1) {
|
|
|
1878
1878
|
__v_skip: !0,
|
|
1879
1879
|
type: e.type,
|
|
1880
1880
|
props: l,
|
|
1881
|
-
key: l &&
|
|
1881
|
+
key: l && Is(l),
|
|
1882
1882
|
ref: t && t.ref ? (
|
|
1883
1883
|
// #2078 in the case of <component :is="vnode" ref="extra"/>
|
|
1884
1884
|
// if the vnode itself already has a ref, cloneVNode will need to merge
|
|
@@ -1887,7 +1887,7 @@ function Le(e, t, n = !1) {
|
|
|
1887
1887
|
) : r,
|
|
1888
1888
|
scopeId: e.scopeId,
|
|
1889
1889
|
slotScopeIds: e.slotScopeIds,
|
|
1890
|
-
children: process.env.NODE_ENV !== "production" && o === -1 && E(i) ? i.map(
|
|
1890
|
+
children: process.env.NODE_ENV !== "production" && o === -1 && E(i) ? i.map($s) : i,
|
|
1891
1891
|
target: e.target,
|
|
1892
1892
|
targetAnchor: e.targetAnchor,
|
|
1893
1893
|
staticCount: e.staticCount,
|
|
@@ -1916,9 +1916,9 @@ function Le(e, t, n = !1) {
|
|
|
1916
1916
|
ce: e.ce
|
|
1917
1917
|
};
|
|
1918
1918
|
}
|
|
1919
|
-
function
|
|
1919
|
+
function $s(e) {
|
|
1920
1920
|
const t = Le(e);
|
|
1921
|
-
return E(e.children) && (t.children = e.children.map(
|
|
1921
|
+
return E(e.children) && (t.children = e.children.map($s)), t;
|
|
1922
1922
|
}
|
|
1923
1923
|
function St(e = " ", t = 0) {
|
|
1924
1924
|
return R(Cr, null, e, t);
|
|
@@ -1941,7 +1941,7 @@ function fn(e, t) {
|
|
|
1941
1941
|
} else {
|
|
1942
1942
|
n = 32;
|
|
1943
1943
|
const r = t._;
|
|
1944
|
-
!r && !(
|
|
1944
|
+
!r && !(ks in t) ? t._ctx = D : r === 3 && D && (D.slots._ === 1 ? t._ = 1 : (t._ = 2, e.patchFlag |= 1024));
|
|
1945
1945
|
}
|
|
1946
1946
|
else
|
|
1947
1947
|
L(t) ? (t = { default: t, _ctx: D }, n = 32) : (t = String(t), s & 64 ? (n = 16, t = [St(t)]) : n = 8);
|
|
@@ -1956,7 +1956,7 @@ function te(...e) {
|
|
|
1956
1956
|
t.class !== s.class && (t.class = x([t.class, s.class]));
|
|
1957
1957
|
else if (r === "style")
|
|
1958
1958
|
t.style = Je([t.style, s.style]);
|
|
1959
|
-
else if (
|
|
1959
|
+
else if (Xs(r)) {
|
|
1960
1960
|
const o = t[r], i = s[r];
|
|
1961
1961
|
i && o !== i && !(E(o) && o.includes(i)) && (t[r] = o ? [].concat(o, i) : i);
|
|
1962
1962
|
} else
|
|
@@ -1965,7 +1965,7 @@ function te(...e) {
|
|
|
1965
1965
|
return t;
|
|
1966
1966
|
}
|
|
1967
1967
|
let be = null;
|
|
1968
|
-
const
|
|
1968
|
+
const Rs = () => be || D;
|
|
1969
1969
|
let Jt;
|
|
1970
1970
|
{
|
|
1971
1971
|
const e = Zn(), t = (n, s) => {
|
|
@@ -1982,7 +1982,7 @@ let Jt;
|
|
|
1982
1982
|
(n) => pn = n
|
|
1983
1983
|
);
|
|
1984
1984
|
}
|
|
1985
|
-
const
|
|
1985
|
+
const As = (e) => {
|
|
1986
1986
|
const t = be;
|
|
1987
1987
|
return Jt(e), e.scope.on(), () => {
|
|
1988
1988
|
e.scope.off(), Jt(t);
|
|
@@ -2049,9 +2049,9 @@ function kr(e) {
|
|
|
2049
2049
|
expose: t
|
|
2050
2050
|
};
|
|
2051
2051
|
}
|
|
2052
|
-
function
|
|
2052
|
+
function Ls(e) {
|
|
2053
2053
|
if (e.exposed)
|
|
2054
|
-
return e.exposeProxy || (e.exposeProxy = new Proxy(Fo(
|
|
2054
|
+
return e.exposeProxy || (e.exposeProxy = new Proxy(Fo(ms(e.exposed)), {
|
|
2055
2055
|
get(t, n) {
|
|
2056
2056
|
if (n in t)
|
|
2057
2057
|
return t[n];
|
|
@@ -2067,7 +2067,7 @@ const Ir = /(?:^|[-_])(\w)/g, Fr = (e) => e.replace(Ir, (t) => t.toUpperCase()).
|
|
|
2067
2067
|
function hn(e, t = !0) {
|
|
2068
2068
|
return L(e) ? e.displayName || e.name : e.name || t && e.__name;
|
|
2069
2069
|
}
|
|
2070
|
-
function
|
|
2070
|
+
function Hs(e, t, n = !1) {
|
|
2071
2071
|
let s = hn(t);
|
|
2072
2072
|
if (!s && t.__file) {
|
|
2073
2073
|
const r = t.__file.match(/([^/\\]+)\.\w+$/);
|
|
@@ -2085,10 +2085,10 @@ function Ls(e, t, n = !1) {
|
|
|
2085
2085
|
}
|
|
2086
2086
|
return s ? Fr(s) : n ? "App" : "Anonymous";
|
|
2087
2087
|
}
|
|
2088
|
-
function
|
|
2088
|
+
function Bs(e) {
|
|
2089
2089
|
return L(e) && "__vccOpts" in e;
|
|
2090
2090
|
}
|
|
2091
|
-
function
|
|
2091
|
+
function Ks(e, t, n) {
|
|
2092
2092
|
const s = arguments.length;
|
|
2093
2093
|
return s === 2 ? K(t) && !E(t) ? Et(t) ? R(e, null, [t]) : R(e, t) : R(e, null, t) : (s > 3 ? n = Array.prototype.slice.call(arguments, 2) : s === 3 && Et(n) && (n = [n]), R(e, t, n));
|
|
2094
2094
|
}
|
|
@@ -2209,9 +2209,9 @@ process.env.NODE_ENV;
|
|
|
2209
2209
|
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
|
2210
2210
|
* @license MIT
|
|
2211
2211
|
**/
|
|
2212
|
-
const ue = "transition", Ke = "animation", Vt = Symbol("_vtc"), xt = (e, { slots: t }) =>
|
|
2212
|
+
const ue = "transition", Ke = "animation", Vt = Symbol("_vtc"), xt = (e, { slots: t }) => Ks(fr, Ar(e), t);
|
|
2213
2213
|
xt.displayName = "Transition";
|
|
2214
|
-
const
|
|
2214
|
+
const Us = {
|
|
2215
2215
|
name: String,
|
|
2216
2216
|
type: String,
|
|
2217
2217
|
css: {
|
|
@@ -2231,8 +2231,8 @@ const Ks = {
|
|
|
2231
2231
|
};
|
|
2232
2232
|
xt.props = /* @__PURE__ */ z(
|
|
2233
2233
|
{},
|
|
2234
|
-
|
|
2235
|
-
|
|
2234
|
+
Ns,
|
|
2235
|
+
Us
|
|
2236
2236
|
);
|
|
2237
2237
|
const Ee = (e, t = []) => {
|
|
2238
2238
|
E(e) ? e.forEach((n) => n(...t)) : e && e(...t);
|
|
@@ -2240,7 +2240,7 @@ const Ee = (e, t = []) => {
|
|
|
2240
2240
|
function Ar(e) {
|
|
2241
2241
|
const t = {};
|
|
2242
2242
|
for (const h in e)
|
|
2243
|
-
h in
|
|
2243
|
+
h in Us || (t[h] = e[h]);
|
|
2244
2244
|
if (e.css === !1)
|
|
2245
2245
|
return t;
|
|
2246
2246
|
const {
|
|
@@ -2313,7 +2313,7 @@ function Lr(e) {
|
|
|
2313
2313
|
}
|
|
2314
2314
|
}
|
|
2315
2315
|
function It(e) {
|
|
2316
|
-
const t =
|
|
2316
|
+
const t = no(e);
|
|
2317
2317
|
return process.env.NODE_ENV !== "production" && Ko(t, "<transition> explicit duration"), t;
|
|
2318
2318
|
}
|
|
2319
2319
|
function ce(e, t) {
|
|
@@ -2375,9 +2375,9 @@ function Yn(e) {
|
|
|
2375
2375
|
function Kr() {
|
|
2376
2376
|
return document.body.offsetHeight;
|
|
2377
2377
|
}
|
|
2378
|
-
const
|
|
2378
|
+
const js = Symbol("_vod"), Gt = {
|
|
2379
2379
|
beforeMount(e, { value: t }, { transition: n }) {
|
|
2380
|
-
e[
|
|
2380
|
+
e[js] = e.style.display === "none" ? "" : e.style.display, n && t ? n.beforeEnter(e) : Ue(e, t);
|
|
2381
2381
|
},
|
|
2382
2382
|
mounted(e, { value: t }, { transition: n }) {
|
|
2383
2383
|
n && t && n.enter(e);
|
|
@@ -2393,7 +2393,7 @@ const Us = Symbol("_vod"), Gt = {
|
|
|
2393
2393
|
};
|
|
2394
2394
|
process.env.NODE_ENV !== "production" && (Gt.name = "show");
|
|
2395
2395
|
function Ue(e, t) {
|
|
2396
|
-
e.style.display = t ? e[
|
|
2396
|
+
e.style.display = t ? e[js] : "none";
|
|
2397
2397
|
}
|
|
2398
2398
|
Symbol(process.env.NODE_ENV !== "production" ? "CSS_VAR_TEXT" : "");
|
|
2399
2399
|
function me(e, t, n, s) {
|
|
@@ -2401,7 +2401,7 @@ function me(e, t, n, s) {
|
|
|
2401
2401
|
}
|
|
2402
2402
|
const ve = (e) => {
|
|
2403
2403
|
const t = e.props["onUpdate:modelValue"] || !1;
|
|
2404
|
-
return E(t) ? (n) =>
|
|
2404
|
+
return E(t) ? (n) => so(t, n) : t;
|
|
2405
2405
|
};
|
|
2406
2406
|
function Ur(e) {
|
|
2407
2407
|
e.target.composing = !0;
|
|
@@ -2433,7 +2433,7 @@ const J = Symbol("_assign"), Wn = {
|
|
|
2433
2433
|
const i = r || e.type === "number" ? $t(e.value) : e.value, l = t ?? "";
|
|
2434
2434
|
i !== l && (document.activeElement === e && e.type !== "range" && (n || s && e.value.trim() === l) || (e.value = l));
|
|
2435
2435
|
}
|
|
2436
|
-
},
|
|
2436
|
+
}, Ys = {
|
|
2437
2437
|
// #4096 array checkboxes need to be deep traversed
|
|
2438
2438
|
deep: !0,
|
|
2439
2439
|
created(e, t, n) {
|
|
@@ -2451,7 +2451,7 @@ const J = Symbol("_assign"), Wn = {
|
|
|
2451
2451
|
const l = new Set(s);
|
|
2452
2452
|
o ? l.add(r) : l.delete(r), i(l);
|
|
2453
2453
|
} else
|
|
2454
|
-
i(
|
|
2454
|
+
i(zs(e, o));
|
|
2455
2455
|
});
|
|
2456
2456
|
},
|
|
2457
2457
|
// set initial checked on mount to wait for true-value/false-value
|
|
@@ -2461,7 +2461,7 @@ const J = Symbol("_assign"), Wn = {
|
|
|
2461
2461
|
}
|
|
2462
2462
|
};
|
|
2463
2463
|
function qn(e, { value: t, oldValue: n }, s) {
|
|
2464
|
-
e._modelValue = t, E(t) ? e.checked = Qt(t, s.props.value) > -1 : Ze(t) ? e.checked = t.has(s.props.value) : t !== n && (e.checked = ht(t,
|
|
2464
|
+
e._modelValue = t, E(t) ? e.checked = Qt(t, s.props.value) > -1 : Ze(t) ? e.checked = t.has(s.props.value) : t !== n && (e.checked = ht(t, zs(e, !0)));
|
|
2465
2465
|
}
|
|
2466
2466
|
const jr = {
|
|
2467
2467
|
created(e, { value: t }, n) {
|
|
@@ -2520,7 +2520,7 @@ function Jn(e, t) {
|
|
|
2520
2520
|
function He(e) {
|
|
2521
2521
|
return "_value" in e ? e._value : e.value;
|
|
2522
2522
|
}
|
|
2523
|
-
function
|
|
2523
|
+
function zs(e, t) {
|
|
2524
2524
|
const n = t ? "_trueValue" : "_falseValue";
|
|
2525
2525
|
return n in e ? e[n] : t;
|
|
2526
2526
|
}
|
|
@@ -2547,7 +2547,7 @@ function Wr(e, t) {
|
|
|
2547
2547
|
default:
|
|
2548
2548
|
switch (t) {
|
|
2549
2549
|
case "checkbox":
|
|
2550
|
-
return
|
|
2550
|
+
return Ys;
|
|
2551
2551
|
case "radio":
|
|
2552
2552
|
return jr;
|
|
2553
2553
|
default:
|
|
@@ -3050,7 +3050,7 @@ const Si = {
|
|
|
3050
3050
|
},
|
|
3051
3051
|
popupClass() {
|
|
3052
3052
|
const e = {
|
|
3053
|
-
[`dito-popup-${
|
|
3053
|
+
[`dito-popup-${oo(this.placement)}`]: !0
|
|
3054
3054
|
};
|
|
3055
3055
|
return this.customClass && (e[this.customClass] = !0), e;
|
|
3056
3056
|
},
|
|
@@ -3171,7 +3171,7 @@ const Si = {
|
|
|
3171
3171
|
}, this.hideDelay) : this.showPopup = !1);
|
|
3172
3172
|
}
|
|
3173
3173
|
}
|
|
3174
|
-
},
|
|
3174
|
+
}, Ws = /* @__PURE__ */ le(Si, [["render", Ei]]), Vi = ["id", "type", "name", "title", "disabled", "readonly", "autofocus", "placeholder", "autocomplete", "aria-label"];
|
|
3175
3175
|
function Ni(e, t, n, s, r, o) {
|
|
3176
3176
|
return g(), _("div", {
|
|
3177
3177
|
class: x(["dito-input", o.classes])
|
|
@@ -3328,7 +3328,7 @@ function xi(e, t, n, s, r, o) {
|
|
|
3328
3328
|
}, 16, ["show"]);
|
|
3329
3329
|
}
|
|
3330
3330
|
const Oi = {
|
|
3331
|
-
components: { Trigger:
|
|
3331
|
+
components: { Trigger: Ws, Calendar: _i, InputField: yn, Icon: _n },
|
|
3332
3332
|
emits: ["update:modelValue", "update:show", "change", "focus", "blur"],
|
|
3333
3333
|
inheritAttrs: !1,
|
|
3334
3334
|
props: {
|
|
@@ -3516,7 +3516,7 @@ function Ki(e, t, n, s, r, o) {
|
|
|
3516
3516
|
}, 16, ["show"]);
|
|
3517
3517
|
}
|
|
3518
3518
|
const Ui = {
|
|
3519
|
-
components: { Trigger:
|
|
3519
|
+
components: { Trigger: Ws, InputField: yn, Icon: _n },
|
|
3520
3520
|
emits: ["update:modelValue", "update:show", "change", "focus", "blur"],
|
|
3521
3521
|
inheritAttrs: !1,
|
|
3522
3522
|
props: {
|
|
@@ -3790,7 +3790,7 @@ const Wi = {
|
|
|
3790
3790
|
return this.$refs.input.input;
|
|
3791
3791
|
},
|
|
3792
3792
|
formatOptions() {
|
|
3793
|
-
return
|
|
3793
|
+
return ro(
|
|
3794
3794
|
{
|
|
3795
3795
|
locale: this.locale,
|
|
3796
3796
|
time: gt.time,
|
|
@@ -3990,7 +3990,7 @@ function rl(e, t, n, s, r, o) {
|
|
|
3990
3990
|
name: n.name,
|
|
3991
3991
|
disabled: n.disabled
|
|
3992
3992
|
}), null, 16, nl), [
|
|
3993
|
-
[
|
|
3993
|
+
[Ys, r.checked]
|
|
3994
3994
|
]),
|
|
3995
3995
|
sl,
|
|
3996
3996
|
n.labels ? (g(), _("span", ol, [
|
|
@@ -4053,13 +4053,13 @@ const il = {
|
|
|
4053
4053
|
}
|
|
4054
4054
|
}
|
|
4055
4055
|
}, pl = /* @__PURE__ */ le(il, [["render", rl]]);
|
|
4056
|
-
function
|
|
4057
|
-
return e ?
|
|
4056
|
+
function qs({ enabled: e }, { slots: t }) {
|
|
4057
|
+
return e ? Ks(xt, ll, t) : t.default();
|
|
4058
4058
|
}
|
|
4059
|
-
|
|
4059
|
+
qs.props = {
|
|
4060
4060
|
enabled: { type: Boolean, default: !0 }
|
|
4061
4061
|
};
|
|
4062
|
-
const hl =
|
|
4062
|
+
const hl = qs, Pe = (e, t) => Object.assign(e.style, t), ut = (e) => setTimeout(e, 0), Xn = (e) => getComputedStyle(e).height, ll = {
|
|
4063
4063
|
name: "dito-height",
|
|
4064
4064
|
onAfterEnter(e) {
|
|
4065
4065
|
ut(() => Pe(e, { height: null }));
|
|
@@ -4092,6 +4092,9 @@ function al(e) {
|
|
|
4092
4092
|
function gl(e, t = {}) {
|
|
4093
4093
|
return e = ts(e) ? wr()[e] : e, al(e == null ? void 0 : e(t));
|
|
4094
4094
|
}
|
|
4095
|
+
function ml(e) {
|
|
4096
|
+
return ms({ value: e });
|
|
4097
|
+
}
|
|
4095
4098
|
export {
|
|
4096
4099
|
_i as Calendar,
|
|
4097
4100
|
Pi as DatePicker,
|
|
@@ -4102,7 +4105,7 @@ export {
|
|
|
4102
4105
|
pl as SwitchButton,
|
|
4103
4106
|
ji as TimePicker,
|
|
4104
4107
|
hl as TransitionHeight,
|
|
4105
|
-
|
|
4108
|
+
Ws as Trigger,
|
|
4106
4109
|
Ft as addEvents,
|
|
4107
4110
|
yt as alterDate,
|
|
4108
4111
|
wi as combineEvents,
|
|
@@ -4114,6 +4117,7 @@ export {
|
|
|
4114
4117
|
gl as hasSlotContent,
|
|
4115
4118
|
al as hasVNodeContent,
|
|
4116
4119
|
Zt as parseDate,
|
|
4120
|
+
ml as raw,
|
|
4117
4121
|
pe as setSelection
|
|
4118
4122
|
};
|
|
4119
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl0by11aS5lcy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2RhdGUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS9yZWFjdGl2aXR5L2Rpc3QvcmVhY3Rpdml0eS5lc20tYnVuZGxlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3J1bnRpbWUtY29yZS9kaXN0L3J1bnRpbWUtY29yZS5lc20tYnVuZGxlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3J1bnRpbWUtZG9tL2Rpc3QvcnVudGltZS1kb20uZXNtLWJ1bmRsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdnVlL2Rpc3QvdnVlLnJ1bnRpbWUuZXNtLWJ1bmRsZXIuanMiLCIuLi9zcmMvY29tcG9uZW50cy9DYWxlbmRhci52dWUiLCIuLi9zcmMvdXRpbHMvZXZlbnQuanMiLCIuLi9zcmMvdXRpbHMvdHJpZ2dlci5qcyIsIi4uL3NyYy9jb21wb25lbnRzL1RyaWdnZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvSW5wdXRGaWVsZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9JY29uLnZ1ZSIsIi4uL3NyYy91dGlscy9zZWxlY3Rpb24uanMiLCIuLi9zcmMvY29tcG9uZW50cy9EYXRlUGlja2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL1RpbWVQaWNrZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGF0ZVRpbWVQaWNrZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvUGFnaW5hdGlvbi52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9Td2l0Y2hCdXR0b24udnVlIiwiLi4vc3JjL3RyYW5zaXRpb25zL1RyYW5zaXRpb25IZWlnaHQudnVlIiwiLi4vc3JjL3V0aWxzL3Z1ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVEYXRlKGRhdGUpIHtcbiAgcmV0dXJuIHtcbiAgICB5ZWFyOiBkYXRlPy5nZXRGdWxsWWVhcigpID8/IDAsXG4gICAgbW9udGg6IGRhdGU/LmdldE1vbnRoKCkgPz8gMCxcbiAgICBkYXk6IGRhdGU/LmdldERhdGUoKSA/PyAwLFxuICAgIGhvdXI6IGRhdGU/LmdldEhvdXJzKCkgPz8gMCxcbiAgICBtaW51dGU6IGRhdGU/LmdldE1pbnV0ZXMoKSA/PyAwLFxuICAgIHNlY29uZDogZGF0ZT8uZ2V0U2Vjb25kcygpID8/IDAsXG4gICAgbWlsbGlzZWNvbmQ6IGRhdGU/LmdldE1pbGxpc2Vjb25kcygpID8/IDBcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWx0ZXJEYXRlKGRhdGUsIG92ZXJyaWRlcyA9IHt9KSB7XG4gIHJldHVybiBuZXcgRGF0ZSguLi5PYmplY3QudmFsdWVzKHsgLi4uZGVzY3JpYmVEYXRlKGRhdGUpLCAuLi5vdmVycmlkZXMgfSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGUoc3RyaW5nLCB7XG4gIGxvY2FsZSA9ICdlbi1VUycsXG4gIGRhdGUgPSB0cnVlLFxuICB0aW1lID0gdHJ1ZVxufSA9IHt9KSB7XG4gIGNvbnN0IHRpbWVEZWZhdWx0ID0gdGltZSA/IG51bGwgOiAwXG4gIGxldCBbXG4gICAgZGF5LFxuICAgIHNlcDEsXG4gICAgbW9udGgsXG4gICAgc2VwMixcbiAgICB5ZWFyLFxuICAgICxcbiAgICBob3VyID0gdGltZURlZmF1bHQsXG4gICAgLFxuICAgIG1pbnV0ZSA9IHRpbWVEZWZhdWx0LFxuICAgICxcbiAgICBzZWNvbmQgPSB0aW1lRGVmYXVsdCxcbiAgICAsXG4gICAgbWlsbGlzZWNvbmQgPSB0aW1lRGVmYXVsdFxuICBdID0gZ2V0RGF0ZVBhcnRzKHN0cmluZywgeyBkYXRlLCB0aW1lIH0pXG4gIGlmICh5ZWFyICYmIHllYXIubGVuZ3RoID49IDQpIHtcbiAgICBpZiAobG9jYWxlID09PSAnZW4tVVMnICYmIHNlcDEgPT09ICcvJyAmJiBzZXAyID09PSAnLycpIHtcbiAgICAgIC8vIEFtZXJpY2FuIGZvcm1hdDogTU0vREQvWVlZWVxuICAgICAgO1tkYXksIG1vbnRoXSA9IFttb250aCwgZGF5XVxuICAgIH1cbiAgICBtb250aCA9IGdldE1vbnRoSW5kZXgobW9udGgsIHsgbG9jYWxlIH0pXG4gICAgY29uc3QgaXNWYWxpZFRpbWVQYXJ0ID0gcGFydCA9PiBwYXJ0ID09PSBudWxsIHx8IHBhcnQubGVuZ3RoID09PSAyXG4gICAgaWYgKFxuICAgICAgbW9udGggIT09IG51bGwgJiYgKFxuICAgICAgICAhdGltZSB8fCAoXG4gICAgICAgICAgaXNWYWxpZFRpbWVQYXJ0KGhvdXIpICYmXG4gICAgICAgICAgaXNWYWxpZFRpbWVQYXJ0KG1pbnV0ZSkgJiZcbiAgICAgICAgICBpc1ZhbGlkVGltZVBhcnQoc2Vjb25kKVxuICAgICAgICApXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoXG4gICAgICAgICt5ZWFyLFxuICAgICAgICArbW9udGgsXG4gICAgICAgICtkYXksXG4gICAgICAgICtob3VyLFxuICAgICAgICArbWludXRlLFxuICAgICAgICArc2Vjb25kLFxuICAgICAgICArbWlsbGlzZWNvbmRcbiAgICAgIClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGVQYXJ0QXRQb3NpdGlvbihzdHJpbmcsIHBvc2l0aW9uLCB7XG4gIGxvY2FsZSA9ICdlbi1VUycsXG4gIGRhdGUgPSB0cnVlLFxuICB0aW1lID0gdHJ1ZVxufSA9IHt9KSB7XG4gIGNvbnN0IHBhcnRzID0gZ2V0RGF0ZVBhcnRzKHN0cmluZywgeyBkYXRlLCB0aW1lIH0pXG5cbiAgY29uc3QgZ2V0UG9zaXRpb24gPSAocG9zaXRpb24sIGxlbmd0aCA9IHBhcnRzLmxlbmd0aCkgPT4ge1xuICAgIGxldCBwb3MgPSAwXG4gICAgbGV0IGluZGV4ID0gMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bm1vZGlmaWVkLWxvb3AtY29uZGl0aW9uXG4gICAgd2hpbGUgKChwb3NpdGlvbiA9PT0gbnVsbCB8fCBwb3MgPD0gcG9zaXRpb24pICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBwb3MgKz0gcGFydHNbaW5kZXgrK10/Lmxlbmd0aCA/PyAwXG4gICAgfVxuICAgIHJldHVybiB7IHBvc2l0aW9uOiBwb3MsIGluZGV4IH1cbiAgfVxuXG4gIC8vIFRpbWUgc3RhcnRzIGF0IGluZGV4IDYsIGR1ZSB0byB0aGUgc2VwYXJhdG9yIGFmdGVyIHRoZSBkYXRlLlxuICBjb25zdCBvZmZzZXQgPSAhZGF0ZSA/IGdldFBvc2l0aW9uKG51bGwsIDYpLnBvc2l0aW9uIDogMFxuICBwb3NpdGlvbiArPSBvZmZzZXRcblxuICBsZXQgeyBpbmRleCB9ID0gZ2V0UG9zaXRpb24ocG9zaXRpb24pXG5cbiAgY29uc3QgaXNVUyA9IGxvY2FsZSA9PT0gJ2VuLVVTJ1xuICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgaXNVUyA/ICdtb250aCcgOiAnZGF5JyxcbiAgICBudWxsLFxuICAgIGlzVVMgPyAnZGF5JyA6ICdtb250aCcsXG4gICAgbnVsbCxcbiAgICAneWVhcicsXG4gICAgbnVsbCxcbiAgICAnaG91cicsXG4gICAgbnVsbCxcbiAgICAnbWludXRlJyxcbiAgICBudWxsLFxuICAgICdzZWNvbmQnLFxuICAgIG51bGwsXG4gICAgJ21pbGxpc2Vjb25kJ1xuICBdXG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgaWYgKHZhbHVlc1tpbmRleF0pIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gZ2V0UG9zaXRpb24obnVsbCwgaW5kZXgpLnBvc2l0aW9uIC0gb2Zmc2V0XG4gICAgICBjb25zdCBlbmQgPSBzdGFydCArIHBhcnRzW2luZGV4XS5sZW5ndGhcbiAgICAgIHJldHVybiB7IG5hbWU6IHZhbHVlc1tpbmRleF0sIHN0YXJ0LCBlbmQgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBnZXREYXRlUGFydHMoc3RyaW5nLCB7IGRhdGUgPSB0cnVlLCB0aW1lID0gdHJ1ZSB9ID0ge30pIHtcbiAgY29uc3QgcGFydHMgPSBzdHJpbmc/LnNwbGl0KC8oW1xccy4sOi9dKykvKSB8fCBbXVxuICBpZiAoIWRhdGUpIHtcbiAgICAvLyBBZGQgZHVtbXkgZGF0ZSBwYXJ0cyB0byBtYWtlIHN1cmUgd2UgZ2V0IGEgdGltZS1vbmx5IGRhdGUuXG4gICAgcGFydHMudW5zaGlmdCgnMScsICcuJywgJzEnLCAnLicsICcyMDAwJywgJyAnKVxuICB9XG4gIGlmICghdGltZSAmJiBwYXJ0cy5sZW5ndGggPiA1KSB7XG4gICAgcGFydHMubGVuZ3RoID0gNVxuICB9XG4gIHJldHVybiBwYXJ0c1xufVxuXG5mdW5jdGlvbiBnZXRNb250aEluZGV4KG1vbnRoLCB7IGxvY2FsZSA9ICdlbi1VUycgfSA9IHt9KSB7XG4gIGNvbnN0IHZhbHVlID0gK21vbnRoXG4gIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlIC0gMVxuICB9XG4gIGNvbnN0IG1hdGNoID0gbW9udGgudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgaWYgKG1hdGNoLmxlbmd0aCA8IDMpIHJldHVybiBudWxsXG4gIGNvbnN0IHNob3J0Rm9ybWF0ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCB7IG1vbnRoOiAnc2hvcnQnIH0pXG4gIGNvbnN0IGxvbmdGb3JtYXQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIHsgbW9udGg6ICdsb25nJyB9KVxuICBmb3IgKGxldCBpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMjAwMCwgaSwgMSlcbiAgICBpZiAoXG4gICAgICBzaG9ydEZvcm1hdC5mb3JtYXQoZGF0ZSkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoKSB8fFxuICAgICAgbG9uZ0Zvcm1hdC5mb3JtYXQoZGF0ZSkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoKVxuICAgICkge1xuICAgICAgcmV0dXJuIGlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbiIsIi8qKlxuKiBAdnVlL3JlYWN0aXZpdHkgdjMuNC4xMFxuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuaW1wb3J0IHsgTk9PUCwgZXh0ZW5kLCBpc0FycmF5LCBpc1N5bWJvbCwgaXNNYXAsIGlzSW50ZWdlcktleSwgaGFzT3duLCBoYXNDaGFuZ2VkLCBpc09iamVjdCwgbWFrZU1hcCwgY2FwaXRhbGl6ZSwgdG9SYXdUeXBlLCBkZWYsIGlzRnVuY3Rpb24gfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmZ1bmN0aW9uIHdhcm4obXNnLCAuLi5hcmdzKSB7XG4gIGNvbnNvbGUud2FybihgW1Z1ZSB3YXJuXSAke21zZ31gLCAuLi5hcmdzKTtcbn1cblxubGV0IGFjdGl2ZUVmZmVjdFNjb3BlO1xuY2xhc3MgRWZmZWN0U2NvcGUge1xuICBjb25zdHJ1Y3RvcihkZXRhY2hlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy5kZXRhY2hlZCA9IGRldGFjaGVkO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5lZmZlY3RzID0gW107XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5jbGVhbnVwcyA9IFtdO1xuICAgIHRoaXMucGFyZW50ID0gYWN0aXZlRWZmZWN0U2NvcGU7XG4gICAgaWYgKCFkZXRhY2hlZCAmJiBhY3RpdmVFZmZlY3RTY29wZSkge1xuICAgICAgdGhpcy5pbmRleCA9IChhY3RpdmVFZmZlY3RTY29wZS5zY29wZXMgfHwgKGFjdGl2ZUVmZmVjdFNjb3BlLnNjb3BlcyA9IFtdKSkucHVzaChcbiAgICAgICAgdGhpc1xuICAgICAgKSAtIDE7XG4gICAgfVxuICB9XG4gIGdldCBhY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgfVxuICBydW4oZm4pIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG4gICAgICBjb25zdCBjdXJyZW50RWZmZWN0U2NvcGUgPSBhY3RpdmVFZmZlY3RTY29wZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhY3RpdmVFZmZlY3RTY29wZSA9IGN1cnJlbnRFZmZlY3RTY29wZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4oYGNhbm5vdCBydW4gYW4gaW5hY3RpdmUgZWZmZWN0IHNjb3BlLmApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gbm9uLWRldGFjaGVkIHNjb3Blc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uKCkge1xuICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gdGhpcztcbiAgfVxuICAvKipcbiAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gbm9uLWRldGFjaGVkIHNjb3Blc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9mZigpIHtcbiAgICBhY3RpdmVFZmZlY3RTY29wZSA9IHRoaXMucGFyZW50O1xuICB9XG4gIHN0b3AoZnJvbVBhcmVudCkge1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIGxldCBpLCBsO1xuICAgICAgZm9yIChpID0gMCwgbCA9IHRoaXMuZWZmZWN0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdGhpcy5lZmZlY3RzW2ldLnN0b3AoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IDAsIGwgPSB0aGlzLmNsZWFudXBzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB0aGlzLmNsZWFudXBzW2ldKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zY29wZXMpIHtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IHRoaXMuc2NvcGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIHRoaXMuc2NvcGVzW2ldLnN0b3AodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5kZXRhY2hlZCAmJiB0aGlzLnBhcmVudCAmJiAhZnJvbVBhcmVudCkge1xuICAgICAgICBjb25zdCBsYXN0ID0gdGhpcy5wYXJlbnQuc2NvcGVzLnBvcCgpO1xuICAgICAgICBpZiAobGFzdCAmJiBsYXN0ICE9PSB0aGlzKSB7XG4gICAgICAgICAgdGhpcy5wYXJlbnQuc2NvcGVzW3RoaXMuaW5kZXhdID0gbGFzdDtcbiAgICAgICAgICBsYXN0LmluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5wYXJlbnQgPSB2b2lkIDA7XG4gICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVmZmVjdFNjb3BlKGRldGFjaGVkKSB7XG4gIHJldHVybiBuZXcgRWZmZWN0U2NvcGUoZGV0YWNoZWQpO1xufVxuZnVuY3Rpb24gcmVjb3JkRWZmZWN0U2NvcGUoZWZmZWN0LCBzY29wZSA9IGFjdGl2ZUVmZmVjdFNjb3BlKSB7XG4gIGlmIChzY29wZSAmJiBzY29wZS5hY3RpdmUpIHtcbiAgICBzY29wZS5lZmZlY3RzLnB1c2goZWZmZWN0KTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q3VycmVudFNjb3BlKCkge1xuICByZXR1cm4gYWN0aXZlRWZmZWN0U2NvcGU7XG59XG5mdW5jdGlvbiBvblNjb3BlRGlzcG9zZShmbikge1xuICBpZiAoYWN0aXZlRWZmZWN0U2NvcGUpIHtcbiAgICBhY3RpdmVFZmZlY3RTY29wZS5jbGVhbnVwcy5wdXNoKGZuKTtcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybihcbiAgICAgIGBvblNjb3BlRGlzcG9zZSgpIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBlZmZlY3Qgc2NvcGUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoLmBcbiAgICApO1xuICB9XG59XG5cbmxldCBhY3RpdmVFZmZlY3Q7XG5jbGFzcyBSZWFjdGl2ZUVmZmVjdCB7XG4gIGNvbnN0cnVjdG9yKGZuLCB0cmlnZ2VyLCBzY2hlZHVsZXIsIHNjb3BlKSB7XG4gICAgdGhpcy5mbiA9IGZuO1xuICAgIHRoaXMudHJpZ2dlciA9IHRyaWdnZXI7XG4gICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuZGVwcyA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX2RpcnR5TGV2ZWwgPSAzO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX3RyYWNrSWQgPSAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX3J1bm5pbmdzID0gMDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLl9xdWVyeWluZ3MgPSAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX2RlcHNMZW5ndGggPSAwO1xuICAgIHJlY29yZEVmZmVjdFNjb3BlKHRoaXMsIHNjb3BlKTtcbiAgfVxuICBnZXQgZGlydHkoKSB7XG4gICAgaWYgKHRoaXMuX2RpcnR5TGV2ZWwgPT09IDEpIHtcbiAgICAgIHRoaXMuX2RpcnR5TGV2ZWwgPSAwO1xuICAgICAgdGhpcy5fcXVlcnlpbmdzKys7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiB0aGlzLmRlcHMpIHtcbiAgICAgICAgaWYgKGRlcC5jb21wdXRlZCkge1xuICAgICAgICAgIHRyaWdnZXJDb21wdXRlZChkZXAuY29tcHV0ZWQpO1xuICAgICAgICAgIGlmICh0aGlzLl9kaXJ0eUxldmVsID49IDIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgdGhpcy5fcXVlcnlpbmdzLS07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kaXJ0eUxldmVsID49IDI7XG4gIH1cbiAgc2V0IGRpcnR5KHYpIHtcbiAgICB0aGlzLl9kaXJ0eUxldmVsID0gdiA/IDMgOiAwO1xuICB9XG4gIHJ1bigpIHtcbiAgICB0aGlzLl9kaXJ0eUxldmVsID0gMDtcbiAgICBpZiAoIXRoaXMuYWN0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5mbigpO1xuICAgIH1cbiAgICBsZXQgbGFzdFNob3VsZFRyYWNrID0gc2hvdWxkVHJhY2s7XG4gICAgbGV0IGxhc3RFZmZlY3QgPSBhY3RpdmVFZmZlY3Q7XG4gICAgdHJ5IHtcbiAgICAgIHNob3VsZFRyYWNrID0gdHJ1ZTtcbiAgICAgIGFjdGl2ZUVmZmVjdCA9IHRoaXM7XG4gICAgICB0aGlzLl9ydW5uaW5ncysrO1xuICAgICAgcHJlQ2xlYW51cEVmZmVjdCh0aGlzKTtcbiAgICAgIHJldHVybiB0aGlzLmZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHBvc3RDbGVhbnVwRWZmZWN0KHRoaXMpO1xuICAgICAgdGhpcy5fcnVubmluZ3MtLTtcbiAgICAgIGFjdGl2ZUVmZmVjdCA9IGxhc3RFZmZlY3Q7XG4gICAgICBzaG91bGRUcmFjayA9IGxhc3RTaG91bGRUcmFjaztcbiAgICB9XG4gIH1cbiAgc3RvcCgpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgICBwcmVDbGVhbnVwRWZmZWN0KHRoaXMpO1xuICAgICAgcG9zdENsZWFudXBFZmZlY3QodGhpcyk7XG4gICAgICAoX2EgPSB0aGlzLm9uU3RvcCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlckNvbXB1dGVkKGNvbXB1dGVkKSB7XG4gIHJldHVybiBjb21wdXRlZC52YWx1ZTtcbn1cbmZ1bmN0aW9uIHByZUNsZWFudXBFZmZlY3QoZWZmZWN0Mikge1xuICBlZmZlY3QyLl90cmFja0lkKys7XG4gIGVmZmVjdDIuX2RlcHNMZW5ndGggPSAwO1xufVxuZnVuY3Rpb24gcG9zdENsZWFudXBFZmZlY3QoZWZmZWN0Mikge1xuICBpZiAoZWZmZWN0Mi5kZXBzICYmIGVmZmVjdDIuZGVwcy5sZW5ndGggPiBlZmZlY3QyLl9kZXBzTGVuZ3RoKSB7XG4gICAgZm9yIChsZXQgaSA9IGVmZmVjdDIuX2RlcHNMZW5ndGg7IGkgPCBlZmZlY3QyLmRlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNsZWFudXBEZXBFZmZlY3QoZWZmZWN0Mi5kZXBzW2ldLCBlZmZlY3QyKTtcbiAgICB9XG4gICAgZWZmZWN0Mi5kZXBzLmxlbmd0aCA9IGVmZmVjdDIuX2RlcHNMZW5ndGg7XG4gIH1cbn1cbmZ1bmN0aW9uIGNsZWFudXBEZXBFZmZlY3QoZGVwLCBlZmZlY3QyKSB7XG4gIGNvbnN0IHRyYWNrSWQgPSBkZXAuZ2V0KGVmZmVjdDIpO1xuICBpZiAodHJhY2tJZCAhPT0gdm9pZCAwICYmIGVmZmVjdDIuX3RyYWNrSWQgIT09IHRyYWNrSWQpIHtcbiAgICBkZXAuZGVsZXRlKGVmZmVjdDIpO1xuICAgIGlmIChkZXAuc2l6ZSA9PT0gMCkge1xuICAgICAgZGVwLmNsZWFudXAoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVmZmVjdChmbiwgb3B0aW9ucykge1xuICBpZiAoZm4uZWZmZWN0IGluc3RhbmNlb2YgUmVhY3RpdmVFZmZlY3QpIHtcbiAgICBmbiA9IGZuLmVmZmVjdC5mbjtcbiAgfVxuICBjb25zdCBfZWZmZWN0ID0gbmV3IFJlYWN0aXZlRWZmZWN0KGZuLCBOT09QLCAoKSA9PiB7XG4gICAgaWYgKF9lZmZlY3QuZGlydHkpIHtcbiAgICAgIF9lZmZlY3QucnVuKCk7XG4gICAgfVxuICB9KTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBleHRlbmQoX2VmZmVjdCwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMuc2NvcGUpXG4gICAgICByZWNvcmRFZmZlY3RTY29wZShfZWZmZWN0LCBvcHRpb25zLnNjb3BlKTtcbiAgfVxuICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubGF6eSkge1xuICAgIF9lZmZlY3QucnVuKCk7XG4gIH1cbiAgY29uc3QgcnVubmVyID0gX2VmZmVjdC5ydW4uYmluZChfZWZmZWN0KTtcbiAgcnVubmVyLmVmZmVjdCA9IF9lZmZlY3Q7XG4gIHJldHVybiBydW5uZXI7XG59XG5mdW5jdGlvbiBzdG9wKHJ1bm5lcikge1xuICBydW5uZXIuZWZmZWN0LnN0b3AoKTtcbn1cbmxldCBzaG91bGRUcmFjayA9IHRydWU7XG5sZXQgcGF1c2VTY2hlZHVsZVN0YWNrID0gMDtcbmNvbnN0IHRyYWNrU3RhY2sgPSBbXTtcbmZ1bmN0aW9uIHBhdXNlVHJhY2tpbmcoKSB7XG4gIHRyYWNrU3RhY2sucHVzaChzaG91bGRUcmFjayk7XG4gIHNob3VsZFRyYWNrID0gZmFsc2U7XG59XG5mdW5jdGlvbiBlbmFibGVUcmFja2luZygpIHtcbiAgdHJhY2tTdGFjay5wdXNoKHNob3VsZFRyYWNrKTtcbiAgc2hvdWxkVHJhY2sgPSB0cnVlO1xufVxuZnVuY3Rpb24gcmVzZXRUcmFja2luZygpIHtcbiAgY29uc3QgbGFzdCA9IHRyYWNrU3RhY2sucG9wKCk7XG4gIHNob3VsZFRyYWNrID0gbGFzdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IGxhc3Q7XG59XG5mdW5jdGlvbiBwYXVzZVNjaGVkdWxpbmcoKSB7XG4gIHBhdXNlU2NoZWR1bGVTdGFjaysrO1xufVxuZnVuY3Rpb24gcmVzZXRTY2hlZHVsaW5nKCkge1xuICBwYXVzZVNjaGVkdWxlU3RhY2stLTtcbiAgd2hpbGUgKCFwYXVzZVNjaGVkdWxlU3RhY2sgJiYgcXVldWVFZmZlY3RTY2hlZHVsZXJzLmxlbmd0aCkge1xuICAgIHF1ZXVlRWZmZWN0U2NoZWR1bGVycy5zaGlmdCgpKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRyYWNrRWZmZWN0KGVmZmVjdDIsIGRlcCwgZGVidWdnZXJFdmVudEV4dHJhSW5mbykge1xuICB2YXIgX2E7XG4gIGlmIChkZXAuZ2V0KGVmZmVjdDIpICE9PSBlZmZlY3QyLl90cmFja0lkKSB7XG4gICAgZGVwLnNldChlZmZlY3QyLCBlZmZlY3QyLl90cmFja0lkKTtcbiAgICBjb25zdCBvbGREZXAgPSBlZmZlY3QyLmRlcHNbZWZmZWN0Mi5fZGVwc0xlbmd0aF07XG4gICAgaWYgKG9sZERlcCAhPT0gZGVwKSB7XG4gICAgICBpZiAob2xkRGVwKSB7XG4gICAgICAgIGNsZWFudXBEZXBFZmZlY3Qob2xkRGVwLCBlZmZlY3QyKTtcbiAgICAgIH1cbiAgICAgIGVmZmVjdDIuZGVwc1tlZmZlY3QyLl9kZXBzTGVuZ3RoKytdID0gZGVwO1xuICAgIH0gZWxzZSB7XG4gICAgICBlZmZlY3QyLl9kZXBzTGVuZ3RoKys7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAoX2EgPSBlZmZlY3QyLm9uVHJhY2spID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWxsKGVmZmVjdDIsIGV4dGVuZCh7IGVmZmVjdDogZWZmZWN0MiB9LCBkZWJ1Z2dlckV2ZW50RXh0cmFJbmZvKSk7XG4gICAgfVxuICB9XG59XG5jb25zdCBxdWV1ZUVmZmVjdFNjaGVkdWxlcnMgPSBbXTtcbmZ1bmN0aW9uIHRyaWdnZXJFZmZlY3RzKGRlcCwgZGlydHlMZXZlbCwgZGVidWdnZXJFdmVudEV4dHJhSW5mbykge1xuICB2YXIgX2E7XG4gIHBhdXNlU2NoZWR1bGluZygpO1xuICBmb3IgKGNvbnN0IGVmZmVjdDIgb2YgZGVwLmtleXMoKSkge1xuICAgIGlmICghZWZmZWN0Mi5hbGxvd1JlY3Vyc2UgJiYgZWZmZWN0Mi5fcnVubmluZ3MpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZWZmZWN0Mi5fZGlydHlMZXZlbCA8IGRpcnR5TGV2ZWwgJiYgKCFlZmZlY3QyLl9ydW5uaW5ncyB8fCBkaXJ0eUxldmVsICE9PSAyKSkge1xuICAgICAgY29uc3QgbGFzdERpcnR5TGV2ZWwgPSBlZmZlY3QyLl9kaXJ0eUxldmVsO1xuICAgICAgZWZmZWN0Mi5fZGlydHlMZXZlbCA9IGRpcnR5TGV2ZWw7XG4gICAgICBpZiAobGFzdERpcnR5TGV2ZWwgPT09IDAgJiYgKCFlZmZlY3QyLl9xdWVyeWluZ3MgfHwgZGlydHlMZXZlbCAhPT0gMikpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAoX2EgPSBlZmZlY3QyLm9uVHJpZ2dlcikgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmNhbGwoZWZmZWN0MiwgZXh0ZW5kKHsgZWZmZWN0OiBlZmZlY3QyIH0sIGRlYnVnZ2VyRXZlbnRFeHRyYUluZm8pKTtcbiAgICAgICAgfVxuICAgICAgICBlZmZlY3QyLnRyaWdnZXIoKTtcbiAgICAgICAgaWYgKGVmZmVjdDIuc2NoZWR1bGVyKSB7XG4gICAgICAgICAgcXVldWVFZmZlY3RTY2hlZHVsZXJzLnB1c2goZWZmZWN0Mi5zY2hlZHVsZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlc2V0U2NoZWR1bGluZygpO1xufVxuXG5jb25zdCBjcmVhdGVEZXAgPSAoY2xlYW51cCwgY29tcHV0ZWQpID0+IHtcbiAgY29uc3QgZGVwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgZGVwLmNsZWFudXAgPSBjbGVhbnVwO1xuICBkZXAuY29tcHV0ZWQgPSBjb21wdXRlZDtcbiAgcmV0dXJuIGRlcDtcbn07XG5cbmNvbnN0IHRhcmdldE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgSVRFUkFURV9LRVkgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IFwiaXRlcmF0ZVwiIDogXCJcIik7XG5jb25zdCBNQVBfS0VZX0lURVJBVEVfS0VZID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBcIk1hcCBrZXkgaXRlcmF0ZVwiIDogXCJcIik7XG5mdW5jdGlvbiB0cmFjayh0YXJnZXQsIHR5cGUsIGtleSkge1xuICBpZiAoc2hvdWxkVHJhY2sgJiYgYWN0aXZlRWZmZWN0KSB7XG4gICAgbGV0IGRlcHNNYXAgPSB0YXJnZXRNYXAuZ2V0KHRhcmdldCk7XG4gICAgaWYgKCFkZXBzTWFwKSB7XG4gICAgICB0YXJnZXRNYXAuc2V0KHRhcmdldCwgZGVwc01hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkpO1xuICAgIH1cbiAgICBsZXQgZGVwID0gZGVwc01hcC5nZXQoa2V5KTtcbiAgICBpZiAoIWRlcCkge1xuICAgICAgZGVwc01hcC5zZXQoa2V5LCBkZXAgPSBjcmVhdGVEZXAoKCkgPT4gZGVwc01hcC5kZWxldGUoa2V5KSkpO1xuICAgIH1cbiAgICB0cmFja0VmZmVjdChcbiAgICAgIGFjdGl2ZUVmZmVjdCxcbiAgICAgIGRlcCxcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB7XG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgdHlwZSxcbiAgICAgICAga2V5XG4gICAgICB9IDogdm9pZCAwXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlcih0YXJnZXQsIHR5cGUsIGtleSwgbmV3VmFsdWUsIG9sZFZhbHVlLCBvbGRUYXJnZXQpIHtcbiAgY29uc3QgZGVwc01hcCA9IHRhcmdldE1hcC5nZXQodGFyZ2V0KTtcbiAgaWYgKCFkZXBzTWFwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBkZXBzID0gW107XG4gIGlmICh0eXBlID09PSBcImNsZWFyXCIpIHtcbiAgICBkZXBzID0gWy4uLmRlcHNNYXAudmFsdWVzKCldO1xuICB9IGVsc2UgaWYgKGtleSA9PT0gXCJsZW5ndGhcIiAmJiBpc0FycmF5KHRhcmdldCkpIHtcbiAgICBjb25zdCBuZXdMZW5ndGggPSBOdW1iZXIobmV3VmFsdWUpO1xuICAgIGRlcHNNYXAuZm9yRWFjaCgoZGVwLCBrZXkyKSA9PiB7XG4gICAgICBpZiAoa2V5MiA9PT0gXCJsZW5ndGhcIiB8fCAhaXNTeW1ib2woa2V5MikgJiYga2V5MiA+PSBuZXdMZW5ndGgpIHtcbiAgICAgICAgZGVwcy5wdXNoKGRlcCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGtleSAhPT0gdm9pZCAwKSB7XG4gICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoa2V5KSk7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICBpZiAoIWlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChJVEVSQVRFX0tFWSkpO1xuICAgICAgICAgIGlmIChpc01hcCh0YXJnZXQpKSB7XG4gICAgICAgICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoTUFQX0tFWV9JVEVSQVRFX0tFWSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc0ludGVnZXJLZXkoa2V5KSkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChcImxlbmd0aFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICAgIGlmICghaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KElURVJBVEVfS0VZKSk7XG4gICAgICAgICAgaWYgKGlzTWFwKHRhcmdldCkpIHtcbiAgICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChNQVBfS0VZX0lURVJBVEVfS0VZKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInNldFwiOlxuICAgICAgICBpZiAoaXNNYXAodGFyZ2V0KSkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChJVEVSQVRFX0tFWSkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBwYXVzZVNjaGVkdWxpbmcoKTtcbiAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgIGlmIChkZXApIHtcbiAgICAgIHRyaWdnZXJFZmZlY3RzKFxuICAgICAgICBkZXAsXG4gICAgICAgIDMsXG4gICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB7XG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICAgIG9sZFZhbHVlLFxuICAgICAgICAgIG9sZFRhcmdldFxuICAgICAgICB9IDogdm9pZCAwXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXNldFNjaGVkdWxpbmcoKTtcbn1cbmZ1bmN0aW9uIGdldERlcEZyb21SZWFjdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgX2E7XG4gIHJldHVybiAoX2EgPSB0YXJnZXRNYXAuZ2V0KG9iamVjdCkpID09IG51bGwgPyB2b2lkIDAgOiBfYS5nZXQoa2V5KTtcbn1cblxuY29uc3QgaXNOb25UcmFja2FibGVLZXlzID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoYF9fcHJvdG9fXyxfX3ZfaXNSZWYsX19pc1Z1ZWApO1xuY29uc3QgYnVpbHRJblN5bWJvbHMgPSBuZXcgU2V0KFxuICAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcImFyZ3VtZW50c1wiICYmIGtleSAhPT0gXCJjYWxsZXJcIikubWFwKChrZXkpID0+IFN5bWJvbFtrZXldKS5maWx0ZXIoaXNTeW1ib2wpXG4pO1xuY29uc3QgYXJyYXlJbnN0cnVtZW50YXRpb25zID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUFycmF5SW5zdHJ1bWVudGF0aW9ucygpO1xuZnVuY3Rpb24gY3JlYXRlQXJyYXlJbnN0cnVtZW50YXRpb25zKCkge1xuICBjb25zdCBpbnN0cnVtZW50YXRpb25zID0ge307XG4gIFtcImluY2x1ZGVzXCIsIFwiaW5kZXhPZlwiLCBcImxhc3RJbmRleE9mXCJdLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGluc3RydW1lbnRhdGlvbnNba2V5XSA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IGFyciA9IHRvUmF3KHRoaXMpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB0cmFjayhhcnIsIFwiZ2V0XCIsIGkgKyBcIlwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcyA9IGFycltrZXldKC4uLmFyZ3MpO1xuICAgICAgaWYgKHJlcyA9PT0gLTEgfHwgcmVzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gYXJyW2tleV0oLi4uYXJncy5tYXAodG9SYXcpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIFtcInB1c2hcIiwgXCJwb3BcIiwgXCJzaGlmdFwiLCBcInVuc2hpZnRcIiwgXCJzcGxpY2VcIl0uZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaW5zdHJ1bWVudGF0aW9uc1trZXldID0gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgcGF1c2VUcmFja2luZygpO1xuICAgICAgcGF1c2VTY2hlZHVsaW5nKCk7XG4gICAgICBjb25zdCByZXMgPSB0b1Jhdyh0aGlzKVtrZXldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgcmVzZXRTY2hlZHVsaW5nKCk7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gIH0pO1xuICByZXR1cm4gaW5zdHJ1bWVudGF0aW9ucztcbn1cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KGtleSkge1xuICBjb25zdCBvYmogPSB0b1Jhdyh0aGlzKTtcbiAgdHJhY2sob2JqLCBcImhhc1wiLCBrZXkpO1xuICByZXR1cm4gb2JqLmhhc093blByb3BlcnR5KGtleSk7XG59XG5jbGFzcyBCYXNlUmVhY3RpdmVIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoX2lzUmVhZG9ubHkgPSBmYWxzZSwgX3NoYWxsb3cgPSBmYWxzZSkge1xuICAgIHRoaXMuX2lzUmVhZG9ubHkgPSBfaXNSZWFkb25seTtcbiAgICB0aGlzLl9zaGFsbG93ID0gX3NoYWxsb3c7XG4gIH1cbiAgZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcikge1xuICAgIGNvbnN0IGlzUmVhZG9ubHkyID0gdGhpcy5faXNSZWFkb25seSwgc2hhbGxvdyA9IHRoaXMuX3NoYWxsb3c7XG4gICAgaWYgKGtleSA9PT0gXCJfX3ZfaXNSZWFjdGl2ZVwiKSB7XG4gICAgICByZXR1cm4gIWlzUmVhZG9ubHkyO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9pc1JlYWRvbmx5XCIpIHtcbiAgICAgIHJldHVybiBpc1JlYWRvbmx5MjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfaXNTaGFsbG93XCIpIHtcbiAgICAgIHJldHVybiBzaGFsbG93O1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9yYXdcIikge1xuICAgICAgaWYgKHJlY2VpdmVyID09PSAoaXNSZWFkb25seTIgPyBzaGFsbG93ID8gc2hhbGxvd1JlYWRvbmx5TWFwIDogcmVhZG9ubHlNYXAgOiBzaGFsbG93ID8gc2hhbGxvd1JlYWN0aXZlTWFwIDogcmVhY3RpdmVNYXApLmdldCh0YXJnZXQpIHx8IC8vIHJlY2VpdmVyIGlzIG5vdCB0aGUgcmVhY3RpdmUgcHJveHksIGJ1dCBoYXMgdGhlIHNhbWUgcHJvdG90eXBlXG4gICAgICAvLyB0aGlzIG1lYW5zIHRoZSByZWNpZXZlciBpcyBhIHVzZXIgcHJveHkgb2YgdGhlIHJlYWN0aXZlIHByb3h5XG4gICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHJlY2VpdmVyKSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRJc0FycmF5ID0gaXNBcnJheSh0YXJnZXQpO1xuICAgIGlmICghaXNSZWFkb25seTIpIHtcbiAgICAgIGlmICh0YXJnZXRJc0FycmF5ICYmIGhhc093bihhcnJheUluc3RydW1lbnRhdGlvbnMsIGtleSkpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KGFycmF5SW5zdHJ1bWVudGF0aW9ucywga2V5LCByZWNlaXZlcik7XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSBcImhhc093blByb3BlcnR5XCIpIHtcbiAgICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXMgPSBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICAgIGlmIChpc1N5bWJvbChrZXkpID8gYnVpbHRJblN5bWJvbHMuaGFzKGtleSkgOiBpc05vblRyYWNrYWJsZUtleXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKCFpc1JlYWRvbmx5Mikge1xuICAgICAgdHJhY2sodGFyZ2V0LCBcImdldFwiLCBrZXkpO1xuICAgIH1cbiAgICBpZiAoc2hhbGxvdykge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKGlzUmVmKHJlcykpIHtcbiAgICAgIHJldHVybiB0YXJnZXRJc0FycmF5ICYmIGlzSW50ZWdlcktleShrZXkpID8gcmVzIDogcmVzLnZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3QocmVzKSkge1xuICAgICAgcmV0dXJuIGlzUmVhZG9ubHkyID8gcmVhZG9ubHkocmVzKSA6IHJlYWN0aXZlKHJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbmNsYXNzIE11dGFibGVSZWFjdGl2ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlUmVhY3RpdmVIYW5kbGVyIHtcbiAgY29uc3RydWN0b3Ioc2hhbGxvdyA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZmFsc2UsIHNoYWxsb3cpO1xuICB9XG4gIHNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gICAgbGV0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgaWYgKCF0aGlzLl9zaGFsbG93KSB7XG4gICAgICBjb25zdCBpc09sZFZhbHVlUmVhZG9ubHkgPSBpc1JlYWRvbmx5KG9sZFZhbHVlKTtcbiAgICAgIGlmICghaXNTaGFsbG93KHZhbHVlKSAmJiAhaXNSZWFkb25seSh2YWx1ZSkpIHtcbiAgICAgICAgb2xkVmFsdWUgPSB0b1JhdyhvbGRWYWx1ZSk7XG4gICAgICAgIHZhbHVlID0gdG9SYXcodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0FycmF5KHRhcmdldCkgJiYgaXNSZWYob2xkVmFsdWUpICYmICFpc1JlZih2YWx1ZSkpIHtcbiAgICAgICAgaWYgKGlzT2xkVmFsdWVSZWFkb25seSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbGRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGhhZEtleSA9IGlzQXJyYXkodGFyZ2V0KSAmJiBpc0ludGVnZXJLZXkoa2V5KSA/IE51bWJlcihrZXkpIDwgdGFyZ2V0Lmxlbmd0aCA6IGhhc093bih0YXJnZXQsIGtleSk7XG4gICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcik7XG4gICAgaWYgKHRhcmdldCA9PT0gdG9SYXcocmVjZWl2ZXIpKSB7XG4gICAgICBpZiAoIWhhZEtleSkge1xuICAgICAgICB0cmlnZ2VyKHRhcmdldCwgXCJhZGRcIiwga2V5LCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGhhc0NoYW5nZWQodmFsdWUsIG9sZFZhbHVlKSkge1xuICAgICAgICB0cmlnZ2VyKHRhcmdldCwgXCJzZXRcIiwga2V5LCB2YWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwga2V5KSB7XG4gICAgY29uc3QgaGFkS2V5ID0gaGFzT3duKHRhcmdldCwga2V5KTtcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRhcmdldFtrZXldO1xuICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBrZXkpO1xuICAgIGlmIChyZXN1bHQgJiYgaGFkS2V5KSB7XG4gICAgICB0cmlnZ2VyKHRhcmdldCwgXCJkZWxldGVcIiwga2V5LCB2b2lkIDAsIG9sZFZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBoYXModGFyZ2V0LCBrZXkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0Lmhhcyh0YXJnZXQsIGtleSk7XG4gICAgaWYgKCFpc1N5bWJvbChrZXkpIHx8ICFidWlsdEluU3ltYm9scy5oYXMoa2V5KSkge1xuICAgICAgdHJhY2sodGFyZ2V0LCBcImhhc1wiLCBrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIG93bktleXModGFyZ2V0KSB7XG4gICAgdHJhY2soXG4gICAgICB0YXJnZXQsXG4gICAgICBcIml0ZXJhdGVcIixcbiAgICAgIGlzQXJyYXkodGFyZ2V0KSA/IFwibGVuZ3RoXCIgOiBJVEVSQVRFX0tFWVxuICAgICk7XG4gICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpO1xuICB9XG59XG5jbGFzcyBSZWFkb25seVJlYWN0aXZlSGFuZGxlciBleHRlbmRzIEJhc2VSZWFjdGl2ZUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvcihzaGFsbG93ID0gZmFsc2UpIHtcbiAgICBzdXBlcih0cnVlLCBzaGFsbG93KTtcbiAgfVxuICBzZXQodGFyZ2V0LCBrZXkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihcbiAgICAgICAgYFNldCBvcGVyYXRpb24gb24ga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBmYWlsZWQ6IHRhcmdldCBpcyByZWFkb25seS5gLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwga2V5KSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBEZWxldGUgb3BlcmF0aW9uIG9uIGtleSBcIiR7U3RyaW5nKGtleSl9XCIgZmFpbGVkOiB0YXJnZXQgaXMgcmVhZG9ubHkuYCxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuY29uc3QgbXV0YWJsZUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNdXRhYmxlUmVhY3RpdmVIYW5kbGVyKCk7XG5jb25zdCByZWFkb25seUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBSZWFkb25seVJlYWN0aXZlSGFuZGxlcigpO1xuY29uc3Qgc2hhbGxvd1JlYWN0aXZlSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE11dGFibGVSZWFjdGl2ZUhhbmRsZXIoXG4gIHRydWVcbik7XG5jb25zdCBzaGFsbG93UmVhZG9ubHlIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgUmVhZG9ubHlSZWFjdGl2ZUhhbmRsZXIodHJ1ZSk7XG5cbmNvbnN0IHRvU2hhbGxvdyA9ICh2YWx1ZSkgPT4gdmFsdWU7XG5jb25zdCBnZXRQcm90byA9ICh2KSA9PiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHYpO1xuZnVuY3Rpb24gZ2V0KHRhcmdldCwga2V5LCBpc1JlYWRvbmx5ID0gZmFsc2UsIGlzU2hhbGxvdyA9IGZhbHNlKSB7XG4gIHRhcmdldCA9IHRhcmdldFtcIl9fdl9yYXdcIl07XG4gIGNvbnN0IHJhd1RhcmdldCA9IHRvUmF3KHRhcmdldCk7XG4gIGNvbnN0IHJhd0tleSA9IHRvUmF3KGtleSk7XG4gIGlmICghaXNSZWFkb25seSkge1xuICAgIGlmIChoYXNDaGFuZ2VkKGtleSwgcmF3S2V5KSkge1xuICAgICAgdHJhY2socmF3VGFyZ2V0LCBcImdldFwiLCBrZXkpO1xuICAgIH1cbiAgICB0cmFjayhyYXdUYXJnZXQsIFwiZ2V0XCIsIHJhd0tleSk7XG4gIH1cbiAgY29uc3QgeyBoYXM6IGhhczIgfSA9IGdldFByb3RvKHJhd1RhcmdldCk7XG4gIGNvbnN0IHdyYXAgPSBpc1NoYWxsb3cgPyB0b1NoYWxsb3cgOiBpc1JlYWRvbmx5ID8gdG9SZWFkb25seSA6IHRvUmVhY3RpdmU7XG4gIGlmIChoYXMyLmNhbGwocmF3VGFyZ2V0LCBrZXkpKSB7XG4gICAgcmV0dXJuIHdyYXAodGFyZ2V0LmdldChrZXkpKTtcbiAgfSBlbHNlIGlmIChoYXMyLmNhbGwocmF3VGFyZ2V0LCByYXdLZXkpKSB7XG4gICAgcmV0dXJuIHdyYXAodGFyZ2V0LmdldChyYXdLZXkpKTtcbiAgfSBlbHNlIGlmICh0YXJnZXQgIT09IHJhd1RhcmdldCkge1xuICAgIHRhcmdldC5nZXQoa2V5KTtcbiAgfVxufVxuZnVuY3Rpb24gaGFzKGtleSwgaXNSZWFkb25seSA9IGZhbHNlKSB7XG4gIGNvbnN0IHRhcmdldCA9IHRoaXNbXCJfX3ZfcmF3XCJdO1xuICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICBjb25zdCByYXdLZXkgPSB0b1JhdyhrZXkpO1xuICBpZiAoIWlzUmVhZG9ubHkpIHtcbiAgICBpZiAoaGFzQ2hhbmdlZChrZXksIHJhd0tleSkpIHtcbiAgICAgIHRyYWNrKHJhd1RhcmdldCwgXCJoYXNcIiwga2V5KTtcbiAgICB9XG4gICAgdHJhY2socmF3VGFyZ2V0LCBcImhhc1wiLCByYXdLZXkpO1xuICB9XG4gIHJldHVybiBrZXkgPT09IHJhd0tleSA/IHRhcmdldC5oYXMoa2V5KSA6IHRhcmdldC5oYXMoa2V5KSB8fCB0YXJnZXQuaGFzKHJhd0tleSk7XG59XG5mdW5jdGlvbiBzaXplKHRhcmdldCwgaXNSZWFkb25seSA9IGZhbHNlKSB7XG4gIHRhcmdldCA9IHRhcmdldFtcIl9fdl9yYXdcIl07XG4gICFpc1JlYWRvbmx5ICYmIHRyYWNrKHRvUmF3KHRhcmdldCksIFwiaXRlcmF0ZVwiLCBJVEVSQVRFX0tFWSk7XG4gIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIFwic2l6ZVwiLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gIHZhbHVlID0gdG9SYXcodmFsdWUpO1xuICBjb25zdCB0YXJnZXQgPSB0b1Jhdyh0aGlzKTtcbiAgY29uc3QgcHJvdG8gPSBnZXRQcm90byh0YXJnZXQpO1xuICBjb25zdCBoYWRLZXkgPSBwcm90by5oYXMuY2FsbCh0YXJnZXQsIHZhbHVlKTtcbiAgaWYgKCFoYWRLZXkpIHtcbiAgICB0YXJnZXQuYWRkKHZhbHVlKTtcbiAgICB0cmlnZ2VyKHRhcmdldCwgXCJhZGRcIiwgdmFsdWUsIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbmZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gIHZhbHVlID0gdG9SYXcodmFsdWUpO1xuICBjb25zdCB0YXJnZXQgPSB0b1Jhdyh0aGlzKTtcbiAgY29uc3QgeyBoYXM6IGhhczIsIGdldDogZ2V0MiB9ID0gZ2V0UHJvdG8odGFyZ2V0KTtcbiAgbGV0IGhhZEtleSA9IGhhczIuY2FsbCh0YXJnZXQsIGtleSk7XG4gIGlmICghaGFkS2V5KSB7XG4gICAga2V5ID0gdG9SYXcoa2V5KTtcbiAgICBoYWRLZXkgPSBoYXMyLmNhbGwodGFyZ2V0LCBrZXkpO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjaGVja0lkZW50aXR5S2V5cyh0YXJnZXQsIGhhczIsIGtleSk7XG4gIH1cbiAgY29uc3Qgb2xkVmFsdWUgPSBnZXQyLmNhbGwodGFyZ2V0LCBrZXkpO1xuICB0YXJnZXQuc2V0KGtleSwgdmFsdWUpO1xuICBpZiAoIWhhZEtleSkge1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiLCBrZXksIHZhbHVlKTtcbiAgfSBlbHNlIGlmIChoYXNDaGFuZ2VkKHZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICB0cmlnZ2VyKHRhcmdldCwgXCJzZXRcIiwga2V5LCB2YWx1ZSwgb2xkVmFsdWUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuZnVuY3Rpb24gZGVsZXRlRW50cnkoa2V5KSB7XG4gIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICBjb25zdCB7IGhhczogaGFzMiwgZ2V0OiBnZXQyIH0gPSBnZXRQcm90byh0YXJnZXQpO1xuICBsZXQgaGFkS2V5ID0gaGFzMi5jYWxsKHRhcmdldCwga2V5KTtcbiAgaWYgKCFoYWRLZXkpIHtcbiAgICBrZXkgPSB0b1JhdyhrZXkpO1xuICAgIGhhZEtleSA9IGhhczIuY2FsbCh0YXJnZXQsIGtleSk7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNoZWNrSWRlbnRpdHlLZXlzKHRhcmdldCwgaGFzMiwga2V5KTtcbiAgfVxuICBjb25zdCBvbGRWYWx1ZSA9IGdldDIgPyBnZXQyLmNhbGwodGFyZ2V0LCBrZXkpIDogdm9pZCAwO1xuICBjb25zdCByZXN1bHQgPSB0YXJnZXQuZGVsZXRlKGtleSk7XG4gIGlmIChoYWRLZXkpIHtcbiAgICB0cmlnZ2VyKHRhcmdldCwgXCJkZWxldGVcIiwga2V5LCB2b2lkIDAsIG9sZFZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY2xlYXIoKSB7XG4gIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICBjb25zdCBoYWRJdGVtcyA9IHRhcmdldC5zaXplICE9PSAwO1xuICBjb25zdCBvbGRUYXJnZXQgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gaXNNYXAodGFyZ2V0KSA/IG5ldyBNYXAodGFyZ2V0KSA6IG5ldyBTZXQodGFyZ2V0KSA6IHZvaWQgMDtcbiAgY29uc3QgcmVzdWx0ID0gdGFyZ2V0LmNsZWFyKCk7XG4gIGlmIChoYWRJdGVtcykge1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcImNsZWFyXCIsIHZvaWQgMCwgdm9pZCAwLCBvbGRUYXJnZXQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjcmVhdGVGb3JFYWNoKGlzUmVhZG9ubHksIGlzU2hhbGxvdykge1xuICByZXR1cm4gZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGNvbnN0IG9ic2VydmVkID0gdGhpcztcbiAgICBjb25zdCB0YXJnZXQgPSBvYnNlcnZlZFtcIl9fdl9yYXdcIl07XG4gICAgY29uc3QgcmF3VGFyZ2V0ID0gdG9SYXcodGFyZ2V0KTtcbiAgICBjb25zdCB3cmFwID0gaXNTaGFsbG93ID8gdG9TaGFsbG93IDogaXNSZWFkb25seSA/IHRvUmVhZG9ubHkgOiB0b1JlYWN0aXZlO1xuICAgICFpc1JlYWRvbmx5ICYmIHRyYWNrKHJhd1RhcmdldCwgXCJpdGVyYXRlXCIsIElURVJBVEVfS0VZKTtcbiAgICByZXR1cm4gdGFyZ2V0LmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHdyYXAodmFsdWUpLCB3cmFwKGtleSksIG9ic2VydmVkKTtcbiAgICB9KTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKG1ldGhvZCwgaXNSZWFkb25seSwgaXNTaGFsbG93KSB7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpc1tcIl9fdl9yYXdcIl07XG4gICAgY29uc3QgcmF3VGFyZ2V0ID0gdG9SYXcodGFyZ2V0KTtcbiAgICBjb25zdCB0YXJnZXRJc01hcCA9IGlzTWFwKHJhd1RhcmdldCk7XG4gICAgY29uc3QgaXNQYWlyID0gbWV0aG9kID09PSBcImVudHJpZXNcIiB8fCBtZXRob2QgPT09IFN5bWJvbC5pdGVyYXRvciAmJiB0YXJnZXRJc01hcDtcbiAgICBjb25zdCBpc0tleU9ubHkgPSBtZXRob2QgPT09IFwia2V5c1wiICYmIHRhcmdldElzTWFwO1xuICAgIGNvbnN0IGlubmVySXRlcmF0b3IgPSB0YXJnZXRbbWV0aG9kXSguLi5hcmdzKTtcbiAgICBjb25zdCB3cmFwID0gaXNTaGFsbG93ID8gdG9TaGFsbG93IDogaXNSZWFkb25seSA/IHRvUmVhZG9ubHkgOiB0b1JlYWN0aXZlO1xuICAgICFpc1JlYWRvbmx5ICYmIHRyYWNrKFxuICAgICAgcmF3VGFyZ2V0LFxuICAgICAgXCJpdGVyYXRlXCIsXG4gICAgICBpc0tleU9ubHkgPyBNQVBfS0VZX0lURVJBVEVfS0VZIDogSVRFUkFURV9LRVlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAvLyBpdGVyYXRvciBwcm90b2NvbFxuICAgICAgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gaW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIHJldHVybiBkb25lID8geyB2YWx1ZSwgZG9uZSB9IDoge1xuICAgICAgICAgIHZhbHVlOiBpc1BhaXIgPyBbd3JhcCh2YWx1ZVswXSksIHdyYXAodmFsdWVbMV0pXSA6IHdyYXAodmFsdWUpLFxuICAgICAgICAgIGRvbmVcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICAvLyBpdGVyYWJsZSBwcm90b2NvbFxuICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH07XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVSZWFkb25seU1ldGhvZCh0eXBlKSB7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGNvbnN0IGtleSA9IGFyZ3NbMF0gPyBgb24ga2V5IFwiJHthcmdzWzBdfVwiIGAgOiBgYDtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYCR7Y2FwaXRhbGl6ZSh0eXBlKX0gb3BlcmF0aW9uICR7a2V5fWZhaWxlZDogdGFyZ2V0IGlzIHJlYWRvbmx5LmAsXG4gICAgICAgIHRvUmF3KHRoaXMpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZSA9PT0gXCJkZWxldGVcIiA/IGZhbHNlIDogdHlwZSA9PT0gXCJjbGVhclwiID8gdm9pZCAwIDogdGhpcztcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUluc3RydW1lbnRhdGlvbnMoKSB7XG4gIGNvbnN0IG11dGFibGVJbnN0cnVtZW50YXRpb25zMiA9IHtcbiAgICBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIGtleSk7XG4gICAgfSxcbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBzaXplKHRoaXMpO1xuICAgIH0sXG4gICAgaGFzLFxuICAgIGFkZCxcbiAgICBzZXQsXG4gICAgZGVsZXRlOiBkZWxldGVFbnRyeSxcbiAgICBjbGVhcixcbiAgICBmb3JFYWNoOiBjcmVhdGVGb3JFYWNoKGZhbHNlLCBmYWxzZSlcbiAgfTtcbiAgY29uc3Qgc2hhbGxvd0luc3RydW1lbnRhdGlvbnMyID0ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywga2V5LCBmYWxzZSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBzaXplKHRoaXMpO1xuICAgIH0sXG4gICAgaGFzLFxuICAgIGFkZCxcbiAgICBzZXQsXG4gICAgZGVsZXRlOiBkZWxldGVFbnRyeSxcbiAgICBjbGVhcixcbiAgICBmb3JFYWNoOiBjcmVhdGVGb3JFYWNoKGZhbHNlLCB0cnVlKVxuICB9O1xuICBjb25zdCByZWFkb25seUluc3RydW1lbnRhdGlvbnMyID0ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywga2V5LCB0cnVlKTtcbiAgICB9LFxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIHNpemUodGhpcywgdHJ1ZSk7XG4gICAgfSxcbiAgICBoYXMoa2V5KSB7XG4gICAgICByZXR1cm4gaGFzLmNhbGwodGhpcywga2V5LCB0cnVlKTtcbiAgICB9LFxuICAgIGFkZDogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJhZGRcIiksXG4gICAgc2V0OiBjcmVhdGVSZWFkb25seU1ldGhvZChcInNldFwiKSxcbiAgICBkZWxldGU6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiZGVsZXRlXCIpLFxuICAgIGNsZWFyOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImNsZWFyXCIpLFxuICAgIGZvckVhY2g6IGNyZWF0ZUZvckVhY2godHJ1ZSwgZmFsc2UpXG4gIH07XG4gIGNvbnN0IHNoYWxsb3dSZWFkb25seUluc3RydW1lbnRhdGlvbnMyID0ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywga2V5LCB0cnVlLCB0cnVlKTtcbiAgICB9LFxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIHNpemUodGhpcywgdHJ1ZSk7XG4gICAgfSxcbiAgICBoYXMoa2V5KSB7XG4gICAgICByZXR1cm4gaGFzLmNhbGwodGhpcywga2V5LCB0cnVlKTtcbiAgICB9LFxuICAgIGFkZDogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJhZGRcIiksXG4gICAgc2V0OiBjcmVhdGVSZWFkb25seU1ldGhvZChcInNldFwiKSxcbiAgICBkZWxldGU6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiZGVsZXRlXCIpLFxuICAgIGNsZWFyOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImNsZWFyXCIpLFxuICAgIGZvckVhY2g6IGNyZWF0ZUZvckVhY2godHJ1ZSwgdHJ1ZSlcbiAgfTtcbiAgY29uc3QgaXRlcmF0b3JNZXRob2RzID0gW1wia2V5c1wiLCBcInZhbHVlc1wiLCBcImVudHJpZXNcIiwgU3ltYm9sLml0ZXJhdG9yXTtcbiAgaXRlcmF0b3JNZXRob2RzLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgIG11dGFibGVJbnN0cnVtZW50YXRpb25zMlttZXRob2RdID0gY3JlYXRlSXRlcmFibGVNZXRob2QoXG4gICAgICBtZXRob2QsXG4gICAgICBmYWxzZSxcbiAgICAgIGZhbHNlXG4gICAgKTtcbiAgICByZWFkb25seUluc3RydW1lbnRhdGlvbnMyW21ldGhvZF0gPSBjcmVhdGVJdGVyYWJsZU1ldGhvZChcbiAgICAgIG1ldGhvZCxcbiAgICAgIHRydWUsXG4gICAgICBmYWxzZVxuICAgICk7XG4gICAgc2hhbGxvd0luc3RydW1lbnRhdGlvbnMyW21ldGhvZF0gPSBjcmVhdGVJdGVyYWJsZU1ldGhvZChcbiAgICAgIG1ldGhvZCxcbiAgICAgIGZhbHNlLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczJbbWV0aG9kXSA9IGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKFxuICAgICAgbWV0aG9kLFxuICAgICAgdHJ1ZSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9KTtcbiAgcmV0dXJuIFtcbiAgICBtdXRhYmxlSW5zdHJ1bWVudGF0aW9uczIsXG4gICAgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMixcbiAgICBzaGFsbG93SW5zdHJ1bWVudGF0aW9uczIsXG4gICAgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczJcbiAgXTtcbn1cbmNvbnN0IFtcbiAgbXV0YWJsZUluc3RydW1lbnRhdGlvbnMsXG4gIHJlYWRvbmx5SW5zdHJ1bWVudGF0aW9ucyxcbiAgc2hhbGxvd0luc3RydW1lbnRhdGlvbnMsXG4gIHNoYWxsb3dSZWFkb25seUluc3RydW1lbnRhdGlvbnNcbl0gPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9ucygpO1xuZnVuY3Rpb24gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKGlzUmVhZG9ubHksIHNoYWxsb3cpIHtcbiAgY29uc3QgaW5zdHJ1bWVudGF0aW9ucyA9IHNoYWxsb3cgPyBpc1JlYWRvbmx5ID8gc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9ucyA6IHNoYWxsb3dJbnN0cnVtZW50YXRpb25zIDogaXNSZWFkb25seSA/IHJlYWRvbmx5SW5zdHJ1bWVudGF0aW9ucyA6IG11dGFibGVJbnN0cnVtZW50YXRpb25zO1xuICByZXR1cm4gKHRhcmdldCwga2V5LCByZWNlaXZlcikgPT4ge1xuICAgIGlmIChrZXkgPT09IFwiX192X2lzUmVhY3RpdmVcIikge1xuICAgICAgcmV0dXJuICFpc1JlYWRvbmx5O1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9pc1JlYWRvbmx5XCIpIHtcbiAgICAgIHJldHVybiBpc1JlYWRvbmx5O1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9yYXdcIikge1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgcmV0dXJuIFJlZmxlY3QuZ2V0KFxuICAgICAgaGFzT3duKGluc3RydW1lbnRhdGlvbnMsIGtleSkgJiYga2V5IGluIHRhcmdldCA/IGluc3RydW1lbnRhdGlvbnMgOiB0YXJnZXQsXG4gICAgICBrZXksXG4gICAgICByZWNlaXZlclxuICAgICk7XG4gIH07XG59XG5jb25zdCBtdXRhYmxlQ29sbGVjdGlvbkhhbmRsZXJzID0ge1xuICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIoZmFsc2UsIGZhbHNlKVxufTtcbmNvbnN0IHNoYWxsb3dDb2xsZWN0aW9uSGFuZGxlcnMgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcihmYWxzZSwgdHJ1ZSlcbn07XG5jb25zdCByZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgZ2V0OiAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKHRydWUsIGZhbHNlKVxufTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgZ2V0OiAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKHRydWUsIHRydWUpXG59O1xuZnVuY3Rpb24gY2hlY2tJZGVudGl0eUtleXModGFyZ2V0LCBoYXMyLCBrZXkpIHtcbiAgY29uc3QgcmF3S2V5ID0gdG9SYXcoa2V5KTtcbiAgaWYgKHJhd0tleSAhPT0ga2V5ICYmIGhhczIuY2FsbCh0YXJnZXQsIHJhd0tleSkpIHtcbiAgICBjb25zdCB0eXBlID0gdG9SYXdUeXBlKHRhcmdldCk7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFJlYWN0aXZlICR7dHlwZX0gY29udGFpbnMgYm90aCB0aGUgcmF3IGFuZCByZWFjdGl2ZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBvYmplY3Qke3R5cGUgPT09IGBNYXBgID8gYCBhcyBrZXlzYCA6IGBgfSwgd2hpY2ggY2FuIGxlYWQgdG8gaW5jb25zaXN0ZW5jaWVzLiBBdm9pZCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiB0aGUgcmF3IGFuZCByZWFjdGl2ZSB2ZXJzaW9ucyBvZiBhbiBvYmplY3QgYW5kIG9ubHkgdXNlIHRoZSByZWFjdGl2ZSB2ZXJzaW9uIGlmIHBvc3NpYmxlLmBcbiAgICApO1xuICB9XG59XG5cbmNvbnN0IHJlYWN0aXZlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCBzaGFsbG93UmVhY3RpdmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHJlYWRvbmx5TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCBzaGFsbG93UmVhZG9ubHlNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIHRhcmdldFR5cGVNYXAocmF3VHlwZSkge1xuICBzd2l0Y2ggKHJhd1R5cGUpIHtcbiAgICBjYXNlIFwiT2JqZWN0XCI6XG4gICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICByZXR1cm4gMSAvKiBDT01NT04gKi87XG4gICAgY2FzZSBcIk1hcFwiOlxuICAgIGNhc2UgXCJTZXRcIjpcbiAgICBjYXNlIFwiV2Vha01hcFwiOlxuICAgIGNhc2UgXCJXZWFrU2V0XCI6XG4gICAgICByZXR1cm4gMiAvKiBDT0xMRUNUSU9OICovO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gMCAvKiBJTlZBTElEICovO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUYXJnZXRUeXBlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZVtcIl9fdl9za2lwXCJdIHx8ICFPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSA/IDAgLyogSU5WQUxJRCAqLyA6IHRhcmdldFR5cGVNYXAodG9SYXdUeXBlKHZhbHVlKSk7XG59XG5mdW5jdGlvbiByZWFjdGl2ZSh0YXJnZXQpIHtcbiAgaWYgKGlzUmVhZG9ubHkodGFyZ2V0KSkge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KFxuICAgIHRhcmdldCxcbiAgICBmYWxzZSxcbiAgICBtdXRhYmxlSGFuZGxlcnMsXG4gICAgbXV0YWJsZUNvbGxlY3Rpb25IYW5kbGVycyxcbiAgICByZWFjdGl2ZU1hcFxuICApO1xufVxuZnVuY3Rpb24gc2hhbGxvd1JlYWN0aXZlKHRhcmdldCkge1xuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIGZhbHNlLFxuICAgIHNoYWxsb3dSZWFjdGl2ZUhhbmRsZXJzLFxuICAgIHNoYWxsb3dDb2xsZWN0aW9uSGFuZGxlcnMsXG4gICAgc2hhbGxvd1JlYWN0aXZlTWFwXG4gICk7XG59XG5mdW5jdGlvbiByZWFkb25seSh0YXJnZXQpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KFxuICAgIHRhcmdldCxcbiAgICB0cnVlLFxuICAgIHJlYWRvbmx5SGFuZGxlcnMsXG4gICAgcmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMsXG4gICAgcmVhZG9ubHlNYXBcbiAgKTtcbn1cbmZ1bmN0aW9uIHNoYWxsb3dSZWFkb25seSh0YXJnZXQpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KFxuICAgIHRhcmdldCxcbiAgICB0cnVlLFxuICAgIHNoYWxsb3dSZWFkb25seUhhbmRsZXJzLFxuICAgIHNoYWxsb3dSZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyxcbiAgICBzaGFsbG93UmVhZG9ubHlNYXBcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KHRhcmdldCwgaXNSZWFkb25seTIsIGJhc2VIYW5kbGVycywgY29sbGVjdGlvbkhhbmRsZXJzLCBwcm94eU1hcCkge1xuICBpZiAoIWlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgY29uc29sZS53YXJuKGB2YWx1ZSBjYW5ub3QgYmUgbWFkZSByZWFjdGl2ZTogJHtTdHJpbmcodGFyZ2V0KX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICBpZiAodGFyZ2V0W1wiX192X3Jhd1wiXSAmJiAhKGlzUmVhZG9ubHkyICYmIHRhcmdldFtcIl9fdl9pc1JlYWN0aXZlXCJdKSkge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgY29uc3QgZXhpc3RpbmdQcm94eSA9IHByb3h5TWFwLmdldCh0YXJnZXQpO1xuICBpZiAoZXhpc3RpbmdQcm94eSkge1xuICAgIHJldHVybiBleGlzdGluZ1Byb3h5O1xuICB9XG4gIGNvbnN0IHRhcmdldFR5cGUgPSBnZXRUYXJnZXRUeXBlKHRhcmdldCk7XG4gIGlmICh0YXJnZXRUeXBlID09PSAwIC8qIElOVkFMSUQgKi8pIHtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KFxuICAgIHRhcmdldCxcbiAgICB0YXJnZXRUeXBlID09PSAyIC8qIENPTExFQ1RJT04gKi8gPyBjb2xsZWN0aW9uSGFuZGxlcnMgOiBiYXNlSGFuZGxlcnNcbiAgKTtcbiAgcHJveHlNYXAuc2V0KHRhcmdldCwgcHJveHkpO1xuICByZXR1cm4gcHJveHk7XG59XG5mdW5jdGlvbiBpc1JlYWN0aXZlKHZhbHVlKSB7XG4gIGlmIChpc1JlYWRvbmx5KHZhbHVlKSkge1xuICAgIHJldHVybiBpc1JlYWN0aXZlKHZhbHVlW1wiX192X3Jhd1wiXSk7XG4gIH1cbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlW1wiX192X2lzUmVhY3RpdmVcIl0pO1xufVxuZnVuY3Rpb24gaXNSZWFkb25seSh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWVbXCJfX3ZfaXNSZWFkb25seVwiXSk7XG59XG5mdW5jdGlvbiBpc1NoYWxsb3codmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlW1wiX192X2lzU2hhbGxvd1wiXSk7XG59XG5mdW5jdGlvbiBpc1Byb3h5KHZhbHVlKSB7XG4gIHJldHVybiBpc1JlYWN0aXZlKHZhbHVlKSB8fCBpc1JlYWRvbmx5KHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHRvUmF3KG9ic2VydmVkKSB7XG4gIGNvbnN0IHJhdyA9IG9ic2VydmVkICYmIG9ic2VydmVkW1wiX192X3Jhd1wiXTtcbiAgcmV0dXJuIHJhdyA/IHRvUmF3KHJhdykgOiBvYnNlcnZlZDtcbn1cbmZ1bmN0aW9uIG1hcmtSYXcodmFsdWUpIHtcbiAgZGVmKHZhbHVlLCBcIl9fdl9za2lwXCIsIHRydWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5jb25zdCB0b1JlYWN0aXZlID0gKHZhbHVlKSA9PiBpc09iamVjdCh2YWx1ZSkgPyByZWFjdGl2ZSh2YWx1ZSkgOiB2YWx1ZTtcbmNvbnN0IHRvUmVhZG9ubHkgPSAodmFsdWUpID0+IGlzT2JqZWN0KHZhbHVlKSA/IHJlYWRvbmx5KHZhbHVlKSA6IHZhbHVlO1xuXG5jbGFzcyBDb21wdXRlZFJlZkltcGwge1xuICBjb25zdHJ1Y3RvcihnZXR0ZXIsIF9zZXR0ZXIsIGlzUmVhZG9ubHksIGlzU1NSKSB7XG4gICAgdGhpcy5fc2V0dGVyID0gX3NldHRlcjtcbiAgICB0aGlzLmRlcCA9IHZvaWQgMDtcbiAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gICAgdGhpc1tcIl9fdl9pc1JlYWRvbmx5XCJdID0gZmFsc2U7XG4gICAgdGhpcy5lZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoXG4gICAgICAoKSA9PiBnZXR0ZXIodGhpcy5fdmFsdWUpLFxuICAgICAgKCkgPT4gdHJpZ2dlclJlZlZhbHVlKHRoaXMsIDEpXG4gICAgKTtcbiAgICB0aGlzLmVmZmVjdC5jb21wdXRlZCA9IHRoaXM7XG4gICAgdGhpcy5lZmZlY3QuYWN0aXZlID0gdGhpcy5fY2FjaGVhYmxlID0gIWlzU1NSO1xuICAgIHRoaXNbXCJfX3ZfaXNSZWFkb25seVwiXSA9IGlzUmVhZG9ubHk7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0b1Jhdyh0aGlzKTtcbiAgICB0cmFja1JlZlZhbHVlKHNlbGYpO1xuICAgIGlmICghc2VsZi5fY2FjaGVhYmxlIHx8IHNlbGYuZWZmZWN0LmRpcnR5KSB7XG4gICAgICBpZiAoaGFzQ2hhbmdlZChzZWxmLl92YWx1ZSwgc2VsZi5fdmFsdWUgPSBzZWxmLmVmZmVjdC5ydW4oKSkpIHtcbiAgICAgICAgdHJpZ2dlclJlZlZhbHVlKHNlbGYsIDIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VsZi5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbHVlKSB7XG4gICAgdGhpcy5fc2V0dGVyKG5ld1ZhbHVlKTtcbiAgfVxuICAvLyAjcmVnaW9uIHBvbHlmaWxsIF9kaXJ0eSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0aGlyZCBwYXJ0eSBjb2RlIGZvciBWdWUgPD0gMy4zLnhcbiAgZ2V0IF9kaXJ0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5lZmZlY3QuZGlydHk7XG4gIH1cbiAgc2V0IF9kaXJ0eSh2KSB7XG4gICAgdGhpcy5lZmZlY3QuZGlydHkgPSB2O1xuICB9XG4gIC8vICNlbmRyZWdpb25cbn1cbmZ1bmN0aW9uIGNvbXB1dGVkKGdldHRlck9yT3B0aW9ucywgZGVidWdPcHRpb25zLCBpc1NTUiA9IGZhbHNlKSB7XG4gIGxldCBnZXR0ZXI7XG4gIGxldCBzZXR0ZXI7XG4gIGNvbnN0IG9ubHlHZXR0ZXIgPSBpc0Z1bmN0aW9uKGdldHRlck9yT3B0aW9ucyk7XG4gIGlmIChvbmx5R2V0dGVyKSB7XG4gICAgZ2V0dGVyID0gZ2V0dGVyT3JPcHRpb25zO1xuICAgIHNldHRlciA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyAoKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oXCJXcml0ZSBvcGVyYXRpb24gZmFpbGVkOiBjb21wdXRlZCB2YWx1ZSBpcyByZWFkb25seVwiKTtcbiAgICB9IDogTk9PUDtcbiAgfSBlbHNlIHtcbiAgICBnZXR0ZXIgPSBnZXR0ZXJPck9wdGlvbnMuZ2V0O1xuICAgIHNldHRlciA9IGdldHRlck9yT3B0aW9ucy5zZXQ7XG4gIH1cbiAgY29uc3QgY1JlZiA9IG5ldyBDb21wdXRlZFJlZkltcGwoZ2V0dGVyLCBzZXR0ZXIsIG9ubHlHZXR0ZXIgfHwgIXNldHRlciwgaXNTU1IpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBkZWJ1Z09wdGlvbnMgJiYgIWlzU1NSKSB7XG4gICAgY1JlZi5lZmZlY3Qub25UcmFjayA9IGRlYnVnT3B0aW9ucy5vblRyYWNrO1xuICAgIGNSZWYuZWZmZWN0Lm9uVHJpZ2dlciA9IGRlYnVnT3B0aW9ucy5vblRyaWdnZXI7XG4gIH1cbiAgcmV0dXJuIGNSZWY7XG59XG5cbmZ1bmN0aW9uIHRyYWNrUmVmVmFsdWUocmVmMikge1xuICBpZiAoc2hvdWxkVHJhY2sgJiYgYWN0aXZlRWZmZWN0KSB7XG4gICAgcmVmMiA9IHRvUmF3KHJlZjIpO1xuICAgIHRyYWNrRWZmZWN0KFxuICAgICAgYWN0aXZlRWZmZWN0LFxuICAgICAgcmVmMi5kZXAgfHwgKHJlZjIuZGVwID0gY3JlYXRlRGVwKFxuICAgICAgICAoKSA9PiByZWYyLmRlcCA9IHZvaWQgMCxcbiAgICAgICAgcmVmMiBpbnN0YW5jZW9mIENvbXB1dGVkUmVmSW1wbCA/IHJlZjIgOiB2b2lkIDBcbiAgICAgICkpLFxuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHtcbiAgICAgICAgdGFyZ2V0OiByZWYyLFxuICAgICAgICB0eXBlOiBcImdldFwiLFxuICAgICAgICBrZXk6IFwidmFsdWVcIlxuICAgICAgfSA6IHZvaWQgMFxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRyaWdnZXJSZWZWYWx1ZShyZWYyLCBkaXJ0eUxldmVsID0gMywgbmV3VmFsKSB7XG4gIHJlZjIgPSB0b1JhdyhyZWYyKTtcbiAgY29uc3QgZGVwID0gcmVmMi5kZXA7XG4gIGlmIChkZXApIHtcbiAgICB0cmlnZ2VyRWZmZWN0cyhcbiAgICAgIGRlcCxcbiAgICAgIGRpcnR5TGV2ZWwsXG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8ge1xuICAgICAgICB0YXJnZXQ6IHJlZjIsXG4gICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgIGtleTogXCJ2YWx1ZVwiLFxuICAgICAgICBuZXdWYWx1ZTogbmV3VmFsXG4gICAgICB9IDogdm9pZCAwXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNSZWYocikge1xuICByZXR1cm4gISEociAmJiByLl9fdl9pc1JlZiA9PT0gdHJ1ZSk7XG59XG5mdW5jdGlvbiByZWYodmFsdWUpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlZih2YWx1ZSwgZmFsc2UpO1xufVxuZnVuY3Rpb24gc2hhbGxvd1JlZih2YWx1ZSkge1xuICByZXR1cm4gY3JlYXRlUmVmKHZhbHVlLCB0cnVlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlZihyYXdWYWx1ZSwgc2hhbGxvdykge1xuICBpZiAoaXNSZWYocmF3VmFsdWUpKSB7XG4gICAgcmV0dXJuIHJhd1ZhbHVlO1xuICB9XG4gIHJldHVybiBuZXcgUmVmSW1wbChyYXdWYWx1ZSwgc2hhbGxvdyk7XG59XG5jbGFzcyBSZWZJbXBsIHtcbiAgY29uc3RydWN0b3IodmFsdWUsIF9fdl9pc1NoYWxsb3cpIHtcbiAgICB0aGlzLl9fdl9pc1NoYWxsb3cgPSBfX3ZfaXNTaGFsbG93O1xuICAgIHRoaXMuZGVwID0gdm9pZCAwO1xuICAgIHRoaXMuX192X2lzUmVmID0gdHJ1ZTtcbiAgICB0aGlzLl9yYXdWYWx1ZSA9IF9fdl9pc1NoYWxsb3cgPyB2YWx1ZSA6IHRvUmF3KHZhbHVlKTtcbiAgICB0aGlzLl92YWx1ZSA9IF9fdl9pc1NoYWxsb3cgPyB2YWx1ZSA6IHRvUmVhY3RpdmUodmFsdWUpO1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICB0cmFja1JlZlZhbHVlKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsKSB7XG4gICAgY29uc3QgdXNlRGlyZWN0VmFsdWUgPSB0aGlzLl9fdl9pc1NoYWxsb3cgfHwgaXNTaGFsbG93KG5ld1ZhbCkgfHwgaXNSZWFkb25seShuZXdWYWwpO1xuICAgIG5ld1ZhbCA9IHVzZURpcmVjdFZhbHVlID8gbmV3VmFsIDogdG9SYXcobmV3VmFsKTtcbiAgICBpZiAoaGFzQ2hhbmdlZChuZXdWYWwsIHRoaXMuX3Jhd1ZhbHVlKSkge1xuICAgICAgdGhpcy5fcmF3VmFsdWUgPSBuZXdWYWw7XG4gICAgICB0aGlzLl92YWx1ZSA9IHVzZURpcmVjdFZhbHVlID8gbmV3VmFsIDogdG9SZWFjdGl2ZShuZXdWYWwpO1xuICAgICAgdHJpZ2dlclJlZlZhbHVlKHRoaXMsIDMsIG5ld1ZhbCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB0cmlnZ2VyUmVmKHJlZjIpIHtcbiAgdHJpZ2dlclJlZlZhbHVlKHJlZjIsIDMsICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyByZWYyLnZhbHVlIDogdm9pZCAwKTtcbn1cbmZ1bmN0aW9uIHVucmVmKHJlZjIpIHtcbiAgcmV0dXJuIGlzUmVmKHJlZjIpID8gcmVmMi52YWx1ZSA6IHJlZjI7XG59XG5mdW5jdGlvbiB0b1ZhbHVlKHNvdXJjZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbihzb3VyY2UpID8gc291cmNlKCkgOiB1bnJlZihzb3VyY2UpO1xufVxuY29uc3Qgc2hhbGxvd1Vud3JhcEhhbmRsZXJzID0ge1xuICBnZXQ6ICh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpID0+IHVucmVmKFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcikpLFxuICBzZXQ6ICh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKSA9PiB7XG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0YXJnZXRba2V5XTtcbiAgICBpZiAoaXNSZWYob2xkVmFsdWUpICYmICFpc1JlZih2YWx1ZSkpIHtcbiAgICAgIG9sZFZhbHVlLnZhbHVlID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpO1xuICAgIH1cbiAgfVxufTtcbmZ1bmN0aW9uIHByb3h5UmVmcyhvYmplY3RXaXRoUmVmcykge1xuICByZXR1cm4gaXNSZWFjdGl2ZShvYmplY3RXaXRoUmVmcykgPyBvYmplY3RXaXRoUmVmcyA6IG5ldyBQcm94eShvYmplY3RXaXRoUmVmcywgc2hhbGxvd1Vud3JhcEhhbmRsZXJzKTtcbn1cbmNsYXNzIEN1c3RvbVJlZkltcGwge1xuICBjb25zdHJ1Y3RvcihmYWN0b3J5KSB7XG4gICAgdGhpcy5kZXAgPSB2b2lkIDA7XG4gICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICAgIGNvbnN0IHsgZ2V0LCBzZXQgfSA9IGZhY3RvcnkoXG4gICAgICAoKSA9PiB0cmFja1JlZlZhbHVlKHRoaXMpLFxuICAgICAgKCkgPT4gdHJpZ2dlclJlZlZhbHVlKHRoaXMpXG4gICAgKTtcbiAgICB0aGlzLl9nZXQgPSBnZXQ7XG4gICAgdGhpcy5fc2V0ID0gc2V0O1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0KCk7XG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbCkge1xuICAgIHRoaXMuX3NldChuZXdWYWwpO1xuICB9XG59XG5mdW5jdGlvbiBjdXN0b21SZWYoZmFjdG9yeSkge1xuICByZXR1cm4gbmV3IEN1c3RvbVJlZkltcGwoZmFjdG9yeSk7XG59XG5mdW5jdGlvbiB0b1JlZnMob2JqZWN0KSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc1Byb3h5KG9iamVjdCkpIHtcbiAgICBjb25zb2xlLndhcm4oYHRvUmVmcygpIGV4cGVjdHMgYSByZWFjdGl2ZSBvYmplY3QgYnV0IHJlY2VpdmVkIGEgcGxhaW4gb25lLmApO1xuICB9XG4gIGNvbnN0IHJldCA9IGlzQXJyYXkob2JqZWN0KSA/IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICByZXRba2V5XSA9IHByb3BlcnR5VG9SZWYob2JqZWN0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5jbGFzcyBPYmplY3RSZWZJbXBsIHtcbiAgY29uc3RydWN0b3IoX29iamVjdCwgX2tleSwgX2RlZmF1bHRWYWx1ZSkge1xuICAgIHRoaXMuX29iamVjdCA9IF9vYmplY3Q7XG4gICAgdGhpcy5fa2V5ID0gX2tleTtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSBfZGVmYXVsdFZhbHVlO1xuICAgIHRoaXMuX192X2lzUmVmID0gdHJ1ZTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5fb2JqZWN0W3RoaXMuX2tleV07XG4gICAgcmV0dXJuIHZhbCA9PT0gdm9pZCAwID8gdGhpcy5fZGVmYXVsdFZhbHVlIDogdmFsO1xuICB9XG4gIHNldCB2YWx1ZShuZXdWYWwpIHtcbiAgICB0aGlzLl9vYmplY3RbdGhpcy5fa2V5XSA9IG5ld1ZhbDtcbiAgfVxuICBnZXQgZGVwKCkge1xuICAgIHJldHVybiBnZXREZXBGcm9tUmVhY3RpdmUodG9SYXcodGhpcy5fb2JqZWN0KSwgdGhpcy5fa2V5KTtcbiAgfVxufVxuY2xhc3MgR2V0dGVyUmVmSW1wbCB7XG4gIGNvbnN0cnVjdG9yKF9nZXR0ZXIpIHtcbiAgICB0aGlzLl9nZXR0ZXIgPSBfZ2V0dGVyO1xuICAgIHRoaXMuX192X2lzUmVmID0gdHJ1ZTtcbiAgICB0aGlzLl9fdl9pc1JlYWRvbmx5ID0gdHJ1ZTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldHRlcigpO1xuICB9XG59XG5mdW5jdGlvbiB0b1JlZihzb3VyY2UsIGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gIGlmIChpc1JlZihzb3VyY2UpKSB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHNvdXJjZSkpIHtcbiAgICByZXR1cm4gbmV3IEdldHRlclJlZkltcGwoc291cmNlKTtcbiAgfSBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpICYmIGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5VG9SZWYoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlZihzb3VyY2UpO1xuICB9XG59XG5mdW5jdGlvbiBwcm9wZXJ0eVRvUmVmKHNvdXJjZSwga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgY29uc3QgdmFsID0gc291cmNlW2tleV07XG4gIHJldHVybiBpc1JlZih2YWwpID8gdmFsIDogbmV3IE9iamVjdFJlZkltcGwoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSk7XG59XG5cbmNvbnN0IGRlZmVycmVkQ29tcHV0ZWQgPSBjb21wdXRlZDtcblxuY29uc3QgVHJhY2tPcFR5cGVzID0ge1xuICBcIkdFVFwiOiBcImdldFwiLFxuICBcIkhBU1wiOiBcImhhc1wiLFxuICBcIklURVJBVEVcIjogXCJpdGVyYXRlXCJcbn07XG5jb25zdCBUcmlnZ2VyT3BUeXBlcyA9IHtcbiAgXCJTRVRcIjogXCJzZXRcIixcbiAgXCJBRERcIjogXCJhZGRcIixcbiAgXCJERUxFVEVcIjogXCJkZWxldGVcIixcbiAgXCJDTEVBUlwiOiBcImNsZWFyXCJcbn07XG5jb25zdCBSZWFjdGl2ZUZsYWdzID0ge1xuICBcIlNLSVBcIjogXCJfX3Zfc2tpcFwiLFxuICBcIklTX1JFQUNUSVZFXCI6IFwiX192X2lzUmVhY3RpdmVcIixcbiAgXCJJU19SRUFET05MWVwiOiBcIl9fdl9pc1JlYWRvbmx5XCIsXG4gIFwiSVNfU0hBTExPV1wiOiBcIl9fdl9pc1NoYWxsb3dcIixcbiAgXCJSQVdcIjogXCJfX3ZfcmF3XCJcbn07XG5cbmV4cG9ydCB7IEVmZmVjdFNjb3BlLCBJVEVSQVRFX0tFWSwgUmVhY3RpdmVFZmZlY3QsIFJlYWN0aXZlRmxhZ3MsIFRyYWNrT3BUeXBlcywgVHJpZ2dlck9wVHlwZXMsIGNvbXB1dGVkLCBjdXN0b21SZWYsIGRlZmVycmVkQ29tcHV0ZWQsIGVmZmVjdCwgZWZmZWN0U2NvcGUsIGVuYWJsZVRyYWNraW5nLCBnZXRDdXJyZW50U2NvcGUsIGlzUHJveHksIGlzUmVhY3RpdmUsIGlzUmVhZG9ubHksIGlzUmVmLCBpc1NoYWxsb3csIG1hcmtSYXcsIG9uU2NvcGVEaXNwb3NlLCBwYXVzZVNjaGVkdWxpbmcsIHBhdXNlVHJhY2tpbmcsIHByb3h5UmVmcywgcmVhY3RpdmUsIHJlYWRvbmx5LCByZWYsIHJlc2V0U2NoZWR1bGluZywgcmVzZXRUcmFja2luZywgc2hhbGxvd1JlYWN0aXZlLCBzaGFsbG93UmVhZG9ubHksIHNoYWxsb3dSZWYsIHN0b3AsIHRvUmF3LCB0b1JlZiwgdG9SZWZzLCB0b1ZhbHVlLCB0cmFjaywgdHJpZ2dlciwgdHJpZ2dlclJlZiwgdW5yZWYgfTtcbiIsIi8qKlxuKiBAdnVlL3J1bnRpbWUtY29yZSB2My40LjEwXG4qIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzXG4qIEBsaWNlbnNlIE1JVFxuKiovXG5pbXBvcnQgeyBwYXVzZVRyYWNraW5nLCByZXNldFRyYWNraW5nLCBpc1JlZiwgdG9SYXcsIGlzU2hhbGxvdyBhcyBpc1NoYWxsb3ckMSwgaXNSZWFjdGl2ZSwgUmVhY3RpdmVFZmZlY3QsIGdldEN1cnJlbnRTY29wZSwgcmVmLCBzaGFsbG93UmVhZG9ubHksIHRyYWNrLCByZWFjdGl2ZSwgc2hhbGxvd1JlYWN0aXZlLCB0cmlnZ2VyLCBpc1Byb3h5LCBwcm94eVJlZnMsIG1hcmtSYXcsIEVmZmVjdFNjb3BlLCBjb21wdXRlZCBhcyBjb21wdXRlZCQxLCBjdXN0b21SZWYsIGlzUmVhZG9ubHkgfSBmcm9tICdAdnVlL3JlYWN0aXZpdHknO1xuZXhwb3J0IHsgRWZmZWN0U2NvcGUsIFJlYWN0aXZlRWZmZWN0LCBUcmFja09wVHlwZXMsIFRyaWdnZXJPcFR5cGVzLCBjdXN0b21SZWYsIGVmZmVjdCwgZWZmZWN0U2NvcGUsIGdldEN1cnJlbnRTY29wZSwgaXNQcm94eSwgaXNSZWFjdGl2ZSwgaXNSZWFkb25seSwgaXNSZWYsIGlzU2hhbGxvdywgbWFya1Jhdywgb25TY29wZURpc3Bvc2UsIHByb3h5UmVmcywgcmVhY3RpdmUsIHJlYWRvbmx5LCByZWYsIHNoYWxsb3dSZWFjdGl2ZSwgc2hhbGxvd1JlYWRvbmx5LCBzaGFsbG93UmVmLCBzdG9wLCB0b1JhdywgdG9SZWYsIHRvUmVmcywgdG9WYWx1ZSwgdHJpZ2dlclJlZiwgdW5yZWYgfSBmcm9tICdAdnVlL3JlYWN0aXZpdHknO1xuaW1wb3J0IHsgaXNTdHJpbmcsIGlzRnVuY3Rpb24sIGlzUHJvbWlzZSwgaXNBcnJheSwgTk9PUCwgZ2V0R2xvYmFsVGhpcywgZXh0ZW5kLCBFTVBUWV9PQkosIHRvSGFuZGxlcktleSwgbG9vc2VUb051bWJlciwgaHlwaGVuYXRlLCBjYW1lbGl6ZSwgaXNPYmplY3QsIGlzT24sIGhhc093biwgaXNNb2RlbExpc3RlbmVyLCBjYXBpdGFsaXplLCB0b051bWJlciwgaGFzQ2hhbmdlZCwgcmVtb3ZlLCBpc1NldCwgaXNNYXAsIGlzUGxhaW5PYmplY3QsIGlzQnVpbHRJbkRpcmVjdGl2ZSwgaW52b2tlQXJyYXlGbnMsIGlzUmVnRXhwLCBpc0dsb2JhbGx5QWxsb3dlZCwgTk8sIGRlZiwgaXNSZXNlcnZlZFByb3AsIEVNUFRZX0FSUiwgdG9SYXdUeXBlLCBtYWtlTWFwLCBub3JtYWxpemVDbGFzcywgc3RyaW5naWZ5U3R5bGUsIG5vcm1hbGl6ZVN0eWxlLCBpc0tub3duU3ZnQXR0ciwgaXNCb29sZWFuQXR0ciwgaXNLbm93bkh0bWxBdHRyLCBpbmNsdWRlQm9vbGVhbkF0dHIgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5leHBvcnQgeyBjYW1lbGl6ZSwgY2FwaXRhbGl6ZSwgbm9ybWFsaXplQ2xhc3MsIG5vcm1hbGl6ZVByb3BzLCBub3JtYWxpemVTdHlsZSwgdG9EaXNwbGF5U3RyaW5nLCB0b0hhbmRsZXJLZXkgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmNvbnN0IHN0YWNrID0gW107XG5mdW5jdGlvbiBwdXNoV2FybmluZ0NvbnRleHQodm5vZGUpIHtcbiAgc3RhY2sucHVzaCh2bm9kZSk7XG59XG5mdW5jdGlvbiBwb3BXYXJuaW5nQ29udGV4dCgpIHtcbiAgc3RhY2sucG9wKCk7XG59XG5mdW5jdGlvbiB3YXJuJDEobXNnLCAuLi5hcmdzKSB7XG4gIHBhdXNlVHJhY2tpbmcoKTtcbiAgY29uc3QgaW5zdGFuY2UgPSBzdGFjay5sZW5ndGggPyBzdGFja1tzdGFjay5sZW5ndGggLSAxXS5jb21wb25lbnQgOiBudWxsO1xuICBjb25zdCBhcHBXYXJuSGFuZGxlciA9IGluc3RhbmNlICYmIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLndhcm5IYW5kbGVyO1xuICBjb25zdCB0cmFjZSA9IGdldENvbXBvbmVudFRyYWNlKCk7XG4gIGlmIChhcHBXYXJuSGFuZGxlcikge1xuICAgIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhcbiAgICAgIGFwcFdhcm5IYW5kbGVyLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICAxMSxcbiAgICAgIFtcbiAgICAgICAgbXNnICsgYXJncy5qb2luKFwiXCIpLFxuICAgICAgICBpbnN0YW5jZSAmJiBpbnN0YW5jZS5wcm94eSxcbiAgICAgICAgdHJhY2UubWFwKFxuICAgICAgICAgICh7IHZub2RlIH0pID0+IGBhdCA8JHtmb3JtYXRDb21wb25lbnROYW1lKGluc3RhbmNlLCB2bm9kZS50eXBlKX0+YFxuICAgICAgICApLmpvaW4oXCJcXG5cIiksXG4gICAgICAgIHRyYWNlXG4gICAgICBdXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB3YXJuQXJncyA9IFtgW1Z1ZSB3YXJuXTogJHttc2d9YCwgLi4uYXJnc107XG4gICAgaWYgKHRyYWNlLmxlbmd0aCAmJiAvLyBhdm9pZCBzcGFtbWluZyBjb25zb2xlIGR1cmluZyB0ZXN0c1xuICAgIHRydWUpIHtcbiAgICAgIHdhcm5BcmdzLnB1c2goYFxuYCwgLi4uZm9ybWF0VHJhY2UodHJhY2UpKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKC4uLndhcm5BcmdzKTtcbiAgfVxuICByZXNldFRyYWNraW5nKCk7XG59XG5mdW5jdGlvbiBnZXRDb21wb25lbnRUcmFjZSgpIHtcbiAgbGV0IGN1cnJlbnRWTm9kZSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICBpZiAoIWN1cnJlbnRWTm9kZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkU3RhY2sgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnRWTm9kZSkge1xuICAgIGNvbnN0IGxhc3QgPSBub3JtYWxpemVkU3RhY2tbMF07XG4gICAgaWYgKGxhc3QgJiYgbGFzdC52bm9kZSA9PT0gY3VycmVudFZOb2RlKSB7XG4gICAgICBsYXN0LnJlY3Vyc2VDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBub3JtYWxpemVkU3RhY2sucHVzaCh7XG4gICAgICAgIHZub2RlOiBjdXJyZW50Vk5vZGUsXG4gICAgICAgIHJlY3Vyc2VDb3VudDogMFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudEluc3RhbmNlID0gY3VycmVudFZOb2RlLmNvbXBvbmVudCAmJiBjdXJyZW50Vk5vZGUuY29tcG9uZW50LnBhcmVudDtcbiAgICBjdXJyZW50Vk5vZGUgPSBwYXJlbnRJbnN0YW5jZSAmJiBwYXJlbnRJbnN0YW5jZS52bm9kZTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZFN0YWNrO1xufVxuZnVuY3Rpb24gZm9ybWF0VHJhY2UodHJhY2UpIHtcbiAgY29uc3QgbG9ncyA9IFtdO1xuICB0cmFjZS5mb3JFYWNoKChlbnRyeSwgaSkgPT4ge1xuICAgIGxvZ3MucHVzaCguLi5pID09PSAwID8gW10gOiBbYFxuYF0sIC4uLmZvcm1hdFRyYWNlRW50cnkoZW50cnkpKTtcbiAgfSk7XG4gIHJldHVybiBsb2dzO1xufVxuZnVuY3Rpb24gZm9ybWF0VHJhY2VFbnRyeSh7IHZub2RlLCByZWN1cnNlQ291bnQgfSkge1xuICBjb25zdCBwb3N0Zml4ID0gcmVjdXJzZUNvdW50ID4gMCA/IGAuLi4gKCR7cmVjdXJzZUNvdW50fSByZWN1cnNpdmUgY2FsbHMpYCA6IGBgO1xuICBjb25zdCBpc1Jvb3QgPSB2bm9kZS5jb21wb25lbnQgPyB2bm9kZS5jb21wb25lbnQucGFyZW50ID09IG51bGwgOiBmYWxzZTtcbiAgY29uc3Qgb3BlbiA9IGAgYXQgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShcbiAgICB2bm9kZS5jb21wb25lbnQsXG4gICAgdm5vZGUudHlwZSxcbiAgICBpc1Jvb3RcbiAgKX1gO1xuICBjb25zdCBjbG9zZSA9IGA+YCArIHBvc3RmaXg7XG4gIHJldHVybiB2bm9kZS5wcm9wcyA/IFtvcGVuLCAuLi5mb3JtYXRQcm9wcyh2bm9kZS5wcm9wcyksIGNsb3NlXSA6IFtvcGVuICsgY2xvc2VdO1xufVxuZnVuY3Rpb24gZm9ybWF0UHJvcHMocHJvcHMpIHtcbiAgY29uc3QgcmVzID0gW107XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gIGtleXMuc2xpY2UoMCwgMykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgcmVzLnB1c2goLi4uZm9ybWF0UHJvcChrZXksIHByb3BzW2tleV0pKTtcbiAgfSk7XG4gIGlmIChrZXlzLmxlbmd0aCA+IDMpIHtcbiAgICByZXMucHVzaChgIC4uLmApO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBmb3JtYXRQcm9wKGtleSwgdmFsdWUsIHJhdykge1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09JHt2YWx1ZX1gXTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09JHt2YWx1ZX1gXTtcbiAgfSBlbHNlIGlmIChpc1JlZih2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IGZvcm1hdFByb3Aoa2V5LCB0b1Jhdyh2YWx1ZS52YWx1ZSksIHRydWUpO1xuICAgIHJldHVybiByYXcgPyB2YWx1ZSA6IFtgJHtrZXl9PVJlZjxgLCB2YWx1ZSwgYD5gXTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHJldHVybiBbYCR7a2V5fT1mbiR7dmFsdWUubmFtZSA/IGA8JHt2YWx1ZS5uYW1lfT5gIDogYGB9YF07XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09YCwgdmFsdWVdO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnROdW1iZXIodmFsLCB0eXBlKSB7XG4gIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSlcbiAgICByZXR1cm47XG4gIGlmICh2YWwgPT09IHZvaWQgMCkge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsICE9PSBcIm51bWJlclwiKSB7XG4gICAgd2FybiQxKGAke3R5cGV9IGlzIG5vdCBhIHZhbGlkIG51bWJlciAtIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbCl9LmApO1xuICB9IGVsc2UgaWYgKGlzTmFOKHZhbCkpIHtcbiAgICB3YXJuJDEoYCR7dHlwZX0gaXMgTmFOIC0gdGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LmApO1xuICB9XG59XG5cbmNvbnN0IEVycm9yQ29kZXMgPSB7XG4gIFwiU0VUVVBfRlVOQ1RJT05cIjogMCxcbiAgXCIwXCI6IFwiU0VUVVBfRlVOQ1RJT05cIixcbiAgXCJSRU5ERVJfRlVOQ1RJT05cIjogMSxcbiAgXCIxXCI6IFwiUkVOREVSX0ZVTkNUSU9OXCIsXG4gIFwiV0FUQ0hfR0VUVEVSXCI6IDIsXG4gIFwiMlwiOiBcIldBVENIX0dFVFRFUlwiLFxuICBcIldBVENIX0NBTExCQUNLXCI6IDMsXG4gIFwiM1wiOiBcIldBVENIX0NBTExCQUNLXCIsXG4gIFwiV0FUQ0hfQ0xFQU5VUFwiOiA0LFxuICBcIjRcIjogXCJXQVRDSF9DTEVBTlVQXCIsXG4gIFwiTkFUSVZFX0VWRU5UX0hBTkRMRVJcIjogNSxcbiAgXCI1XCI6IFwiTkFUSVZFX0VWRU5UX0hBTkRMRVJcIixcbiAgXCJDT01QT05FTlRfRVZFTlRfSEFORExFUlwiOiA2LFxuICBcIjZcIjogXCJDT01QT05FTlRfRVZFTlRfSEFORExFUlwiLFxuICBcIlZOT0RFX0hPT0tcIjogNyxcbiAgXCI3XCI6IFwiVk5PREVfSE9PS1wiLFxuICBcIkRJUkVDVElWRV9IT09LXCI6IDgsXG4gIFwiOFwiOiBcIkRJUkVDVElWRV9IT09LXCIsXG4gIFwiVFJBTlNJVElPTl9IT09LXCI6IDksXG4gIFwiOVwiOiBcIlRSQU5TSVRJT05fSE9PS1wiLFxuICBcIkFQUF9FUlJPUl9IQU5ETEVSXCI6IDEwLFxuICBcIjEwXCI6IFwiQVBQX0VSUk9SX0hBTkRMRVJcIixcbiAgXCJBUFBfV0FSTl9IQU5ETEVSXCI6IDExLFxuICBcIjExXCI6IFwiQVBQX1dBUk5fSEFORExFUlwiLFxuICBcIkZVTkNUSU9OX1JFRlwiOiAxMixcbiAgXCIxMlwiOiBcIkZVTkNUSU9OX1JFRlwiLFxuICBcIkFTWU5DX0NPTVBPTkVOVF9MT0FERVJcIjogMTMsXG4gIFwiMTNcIjogXCJBU1lOQ19DT01QT05FTlRfTE9BREVSXCIsXG4gIFwiU0NIRURVTEVSXCI6IDE0LFxuICBcIjE0XCI6IFwiU0NIRURVTEVSXCJcbn07XG5jb25zdCBFcnJvclR5cGVTdHJpbmdzJDEgPSB7XG4gIFtcInNwXCJdOiBcInNlcnZlclByZWZldGNoIGhvb2tcIixcbiAgW1wiYmNcIl06IFwiYmVmb3JlQ3JlYXRlIGhvb2tcIixcbiAgW1wiY1wiXTogXCJjcmVhdGVkIGhvb2tcIixcbiAgW1wiYm1cIl06IFwiYmVmb3JlTW91bnQgaG9va1wiLFxuICBbXCJtXCJdOiBcIm1vdW50ZWQgaG9va1wiLFxuICBbXCJidVwiXTogXCJiZWZvcmVVcGRhdGUgaG9va1wiLFxuICBbXCJ1XCJdOiBcInVwZGF0ZWRcIixcbiAgW1wiYnVtXCJdOiBcImJlZm9yZVVubW91bnQgaG9va1wiLFxuICBbXCJ1bVwiXTogXCJ1bm1vdW50ZWQgaG9va1wiLFxuICBbXCJhXCJdOiBcImFjdGl2YXRlZCBob29rXCIsXG4gIFtcImRhXCJdOiBcImRlYWN0aXZhdGVkIGhvb2tcIixcbiAgW1wiZWNcIl06IFwiZXJyb3JDYXB0dXJlZCBob29rXCIsXG4gIFtcInJ0Y1wiXTogXCJyZW5kZXJUcmFja2VkIGhvb2tcIixcbiAgW1wicnRnXCJdOiBcInJlbmRlclRyaWdnZXJlZCBob29rXCIsXG4gIFswXTogXCJzZXR1cCBmdW5jdGlvblwiLFxuICBbMV06IFwicmVuZGVyIGZ1bmN0aW9uXCIsXG4gIFsyXTogXCJ3YXRjaGVyIGdldHRlclwiLFxuICBbM106IFwid2F0Y2hlciBjYWxsYmFja1wiLFxuICBbNF06IFwid2F0Y2hlciBjbGVhbnVwIGZ1bmN0aW9uXCIsXG4gIFs1XTogXCJuYXRpdmUgZXZlbnQgaGFuZGxlclwiLFxuICBbNl06IFwiY29tcG9uZW50IGV2ZW50IGhhbmRsZXJcIixcbiAgWzddOiBcInZub2RlIGhvb2tcIixcbiAgWzhdOiBcImRpcmVjdGl2ZSBob29rXCIsXG4gIFs5XTogXCJ0cmFuc2l0aW9uIGhvb2tcIixcbiAgWzEwXTogXCJhcHAgZXJyb3JIYW5kbGVyXCIsXG4gIFsxMV06IFwiYXBwIHdhcm5IYW5kbGVyXCIsXG4gIFsxMl06IFwicmVmIGZ1bmN0aW9uXCIsXG4gIFsxM106IFwiYXN5bmMgY29tcG9uZW50IGxvYWRlclwiLFxuICBbMTRdOiBcInNjaGVkdWxlciBmbHVzaC4gVGhpcyBpcyBsaWtlbHkgYSBWdWUgaW50ZXJuYWxzIGJ1Zy4gUGxlYXNlIG9wZW4gYW4gaXNzdWUgYXQgaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL2NvcmUgLlwiXG59O1xuZnVuY3Rpb24gY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncykge1xuICBsZXQgcmVzO1xuICB0cnkge1xuICAgIHJlcyA9IGFyZ3MgPyBmbiguLi5hcmdzKSA6IGZuKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIHR5cGUpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpIHtcbiAgaWYgKGlzRnVuY3Rpb24oZm4pKSB7XG4gICAgY29uc3QgcmVzID0gY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncyk7XG4gICAgaWYgKHJlcyAmJiBpc1Byb21pc2UocmVzKSkge1xuICAgICAgcmVzLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgdHlwZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbi5sZW5ndGg7IGkrKykge1xuICAgIHZhbHVlcy5wdXNoKGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGZuW2ldLCBpbnN0YW5jZSwgdHlwZSwgYXJncykpO1xuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5mdW5jdGlvbiBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCB0eXBlLCB0aHJvd0luRGV2ID0gdHJ1ZSkge1xuICBjb25zdCBjb250ZXh0Vk5vZGUgPSBpbnN0YW5jZSA/IGluc3RhbmNlLnZub2RlIDogbnVsbDtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgbGV0IGN1ciA9IGluc3RhbmNlLnBhcmVudDtcbiAgICBjb25zdCBleHBvc2VkSW5zdGFuY2UgPSBpbnN0YW5jZS5wcm94eTtcbiAgICBjb25zdCBlcnJvckluZm8gPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gRXJyb3JUeXBlU3RyaW5ncyQxW3R5cGVdIDogYGh0dHBzOi8vdnVlanMub3JnL2Vycm9ycy8jcnVudGltZS0ke3R5cGV9YDtcbiAgICB3aGlsZSAoY3VyKSB7XG4gICAgICBjb25zdCBlcnJvckNhcHR1cmVkSG9va3MgPSBjdXIuZWM7XG4gICAgICBpZiAoZXJyb3JDYXB0dXJlZEhvb2tzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXJyb3JDYXB0dXJlZEhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGVycm9yQ2FwdHVyZWRIb29rc1tpXShlcnIsIGV4cG9zZWRJbnN0YW5jZSwgZXJyb3JJbmZvKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN1ciA9IGN1ci5wYXJlbnQ7XG4gICAgfVxuICAgIGNvbnN0IGFwcEVycm9ySGFuZGxlciA9IGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLmVycm9ySGFuZGxlcjtcbiAgICBpZiAoYXBwRXJyb3JIYW5kbGVyKSB7XG4gICAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoXG4gICAgICAgIGFwcEVycm9ySGFuZGxlcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMTAsXG4gICAgICAgIFtlcnIsIGV4cG9zZWRJbnN0YW5jZSwgZXJyb3JJbmZvXVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgbG9nRXJyb3IoZXJyLCB0eXBlLCBjb250ZXh0Vk5vZGUsIHRocm93SW5EZXYpO1xufVxuZnVuY3Rpb24gbG9nRXJyb3IoZXJyLCB0eXBlLCBjb250ZXh0Vk5vZGUsIHRocm93SW5EZXYgPSB0cnVlKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgaW5mbyA9IEVycm9yVHlwZVN0cmluZ3MkMVt0eXBlXTtcbiAgICBpZiAoY29udGV4dFZOb2RlKSB7XG4gICAgICBwdXNoV2FybmluZ0NvbnRleHQoY29udGV4dFZOb2RlKTtcbiAgICB9XG4gICAgd2FybiQxKGBVbmhhbmRsZWQgZXJyb3Ike2luZm8gPyBgIGR1cmluZyBleGVjdXRpb24gb2YgJHtpbmZvfWAgOiBgYH1gKTtcbiAgICBpZiAoY29udGV4dFZOb2RlKSB7XG4gICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgIH1cbiAgICBpZiAodGhyb3dJbkRldikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5sZXQgaXNGbHVzaGluZyA9IGZhbHNlO1xubGV0IGlzRmx1c2hQZW5kaW5nID0gZmFsc2U7XG5jb25zdCBxdWV1ZSA9IFtdO1xubGV0IGZsdXNoSW5kZXggPSAwO1xuY29uc3QgcGVuZGluZ1Bvc3RGbHVzaENicyA9IFtdO1xubGV0IGFjdGl2ZVBvc3RGbHVzaENicyA9IG51bGw7XG5sZXQgcG9zdEZsdXNoSW5kZXggPSAwO1xuY29uc3QgcmVzb2x2ZWRQcm9taXNlID0gLyogQF9fUFVSRV9fICovIFByb21pc2UucmVzb2x2ZSgpO1xubGV0IGN1cnJlbnRGbHVzaFByb21pc2UgPSBudWxsO1xuY29uc3QgUkVDVVJTSU9OX0xJTUlUID0gMTAwO1xuZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgY29uc3QgcCA9IGN1cnJlbnRGbHVzaFByb21pc2UgfHwgcmVzb2x2ZWRQcm9taXNlO1xuICByZXR1cm4gZm4gPyBwLnRoZW4odGhpcyA/IGZuLmJpbmQodGhpcykgOiBmbikgOiBwO1xufVxuZnVuY3Rpb24gZmluZEluc2VydGlvbkluZGV4KGlkKSB7XG4gIGxldCBzdGFydCA9IGZsdXNoSW5kZXggKyAxO1xuICBsZXQgZW5kID0gcXVldWUubGVuZ3RoO1xuICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICBjb25zdCBtaWRkbGUgPSBzdGFydCArIGVuZCA+Pj4gMTtcbiAgICBjb25zdCBtaWRkbGVKb2IgPSBxdWV1ZVttaWRkbGVdO1xuICAgIGNvbnN0IG1pZGRsZUpvYklkID0gZ2V0SWQobWlkZGxlSm9iKTtcbiAgICBpZiAobWlkZGxlSm9iSWQgPCBpZCB8fCBtaWRkbGVKb2JJZCA9PT0gaWQgJiYgbWlkZGxlSm9iLnByZSkge1xuICAgICAgc3RhcnQgPSBtaWRkbGUgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmQgPSBtaWRkbGU7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdGFydDtcbn1cbmZ1bmN0aW9uIHF1ZXVlSm9iKGpvYikge1xuICBpZiAoIXF1ZXVlLmxlbmd0aCB8fCAhcXVldWUuaW5jbHVkZXMoXG4gICAgam9iLFxuICAgIGlzRmx1c2hpbmcgJiYgam9iLmFsbG93UmVjdXJzZSA/IGZsdXNoSW5kZXggKyAxIDogZmx1c2hJbmRleFxuICApKSB7XG4gICAgaWYgKGpvYi5pZCA9PSBudWxsKSB7XG4gICAgICBxdWV1ZS5wdXNoKGpvYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlLnNwbGljZShmaW5kSW5zZXJ0aW9uSW5kZXgoam9iLmlkKSwgMCwgam9iKTtcbiAgICB9XG4gICAgcXVldWVGbHVzaCgpO1xuICB9XG59XG5mdW5jdGlvbiBxdWV1ZUZsdXNoKCkge1xuICBpZiAoIWlzRmx1c2hpbmcgJiYgIWlzRmx1c2hQZW5kaW5nKSB7XG4gICAgaXNGbHVzaFBlbmRpbmcgPSB0cnVlO1xuICAgIGN1cnJlbnRGbHVzaFByb21pc2UgPSByZXNvbHZlZFByb21pc2UudGhlbihmbHVzaEpvYnMpO1xuICB9XG59XG5mdW5jdGlvbiBpbnZhbGlkYXRlSm9iKGpvYikge1xuICBjb25zdCBpID0gcXVldWUuaW5kZXhPZihqb2IpO1xuICBpZiAoaSA+IGZsdXNoSW5kZXgpIHtcbiAgICBxdWV1ZS5zcGxpY2UoaSwgMSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHF1ZXVlUG9zdEZsdXNoQ2IoY2IpIHtcbiAgaWYgKCFpc0FycmF5KGNiKSkge1xuICAgIGlmICghYWN0aXZlUG9zdEZsdXNoQ2JzIHx8ICFhY3RpdmVQb3N0Rmx1c2hDYnMuaW5jbHVkZXMoXG4gICAgICBjYixcbiAgICAgIGNiLmFsbG93UmVjdXJzZSA/IHBvc3RGbHVzaEluZGV4ICsgMSA6IHBvc3RGbHVzaEluZGV4XG4gICAgKSkge1xuICAgICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKGNiKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKC4uLmNiKTtcbiAgfVxuICBxdWV1ZUZsdXNoKCk7XG59XG5mdW5jdGlvbiBmbHVzaFByZUZsdXNoQ2JzKGluc3RhbmNlLCBzZWVuLCBpID0gaXNGbHVzaGluZyA/IGZsdXNoSW5kZXggKyAxIDogMCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHNlZW4gPSBzZWVuIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIH1cbiAgZm9yICg7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNiID0gcXVldWVbaV07XG4gICAgaWYgKGNiICYmIGNiLnByZSkge1xuICAgICAgaWYgKGluc3RhbmNlICYmIGNiLmlkICE9PSBpbnN0YW5jZS51aWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2VlbiwgY2IpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcXVldWUuc3BsaWNlKGksIDEpO1xuICAgICAgaS0tO1xuICAgICAgY2IoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoUG9zdEZsdXNoQ2JzKHNlZW4pIHtcbiAgaWYgKHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoKSB7XG4gICAgY29uc3QgZGVkdXBlZCA9IFsuLi5uZXcgU2V0KHBlbmRpbmdQb3N0Rmx1c2hDYnMpXS5zb3J0KFxuICAgICAgKGEsIGIpID0+IGdldElkKGEpIC0gZ2V0SWQoYilcbiAgICApO1xuICAgIHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoID0gMDtcbiAgICBpZiAoYWN0aXZlUG9zdEZsdXNoQ2JzKSB7XG4gICAgICBhY3RpdmVQb3N0Rmx1c2hDYnMucHVzaCguLi5kZWR1cGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWN0aXZlUG9zdEZsdXNoQ2JzID0gZGVkdXBlZDtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgc2VlbiA9IHNlZW4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB9XG4gICAgZm9yIChwb3N0Rmx1c2hJbmRleCA9IDA7IHBvc3RGbHVzaEluZGV4IDwgYWN0aXZlUG9zdEZsdXNoQ2JzLmxlbmd0aDsgcG9zdEZsdXNoSW5kZXgrKykge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGFjdGl2ZVBvc3RGbHVzaENic1twb3N0Rmx1c2hJbmRleF0pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYWN0aXZlUG9zdEZsdXNoQ2JzW3Bvc3RGbHVzaEluZGV4XSgpO1xuICAgIH1cbiAgICBhY3RpdmVQb3N0Rmx1c2hDYnMgPSBudWxsO1xuICAgIHBvc3RGbHVzaEluZGV4ID0gMDtcbiAgfVxufVxuY29uc3QgZ2V0SWQgPSAoam9iKSA9PiBqb2IuaWQgPT0gbnVsbCA/IEluZmluaXR5IDogam9iLmlkO1xuY29uc3QgY29tcGFyYXRvciA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IGRpZmYgPSBnZXRJZChhKSAtIGdldElkKGIpO1xuICBpZiAoZGlmZiA9PT0gMCkge1xuICAgIGlmIChhLnByZSAmJiAhYi5wcmUpXG4gICAgICByZXR1cm4gLTE7XG4gICAgaWYgKGIucHJlICYmICFhLnByZSlcbiAgICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiBkaWZmO1xufTtcbmZ1bmN0aW9uIGZsdXNoSm9icyhzZWVuKSB7XG4gIGlzRmx1c2hQZW5kaW5nID0gZmFsc2U7XG4gIGlzRmx1c2hpbmcgPSB0cnVlO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHNlZW4gPSBzZWVuIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIH1cbiAgcXVldWUuc29ydChjb21wYXJhdG9yKTtcbiAgY29uc3QgY2hlY2sgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gKGpvYikgPT4gY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGpvYikgOiBOT09QO1xuICB0cnkge1xuICAgIGZvciAoZmx1c2hJbmRleCA9IDA7IGZsdXNoSW5kZXggPCBxdWV1ZS5sZW5ndGg7IGZsdXNoSW5kZXgrKykge1xuICAgICAgY29uc3Qgam9iID0gcXVldWVbZmx1c2hJbmRleF07XG4gICAgICBpZiAoam9iICYmIGpvYi5hY3RpdmUgIT09IGZhbHNlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNoZWNrKGpvYikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoam9iLCBudWxsLCAxNCk7XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGZsdXNoSW5kZXggPSAwO1xuICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgZmx1c2hQb3N0Rmx1c2hDYnMoc2Vlbik7XG4gICAgaXNGbHVzaGluZyA9IGZhbHNlO1xuICAgIGN1cnJlbnRGbHVzaFByb21pc2UgPSBudWxsO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggfHwgcGVuZGluZ1Bvc3RGbHVzaENicy5sZW5ndGgpIHtcbiAgICAgIGZsdXNoSm9icyhzZWVuKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlVXBkYXRlcyhzZWVuLCBmbikge1xuICBpZiAoIXNlZW4uaGFzKGZuKSkge1xuICAgIHNlZW4uc2V0KGZuLCAxKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBjb3VudCA9IHNlZW4uZ2V0KGZuKTtcbiAgICBpZiAoY291bnQgPiBSRUNVUlNJT05fTElNSVQpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gZm4ub3duZXJJbnN0YW5jZTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBpbnN0YW5jZSAmJiBnZXRDb21wb25lbnROYW1lKGluc3RhbmNlLnR5cGUpO1xuICAgICAgaGFuZGxlRXJyb3IoXG4gICAgICAgIGBNYXhpbXVtIHJlY3Vyc2l2ZSB1cGRhdGVzIGV4Y2VlZGVkJHtjb21wb25lbnROYW1lID8gYCBpbiBjb21wb25lbnQgPCR7Y29tcG9uZW50TmFtZX0+YCA6IGBgfS4gVGhpcyBtZWFucyB5b3UgaGF2ZSBhIHJlYWN0aXZlIGVmZmVjdCB0aGF0IGlzIG11dGF0aW5nIGl0cyBvd24gZGVwZW5kZW5jaWVzIGFuZCB0aHVzIHJlY3Vyc2l2ZWx5IHRyaWdnZXJpbmcgaXRzZWxmLiBQb3NzaWJsZSBzb3VyY2VzIGluY2x1ZGUgY29tcG9uZW50IHRlbXBsYXRlLCByZW5kZXIgZnVuY3Rpb24sIHVwZGF0ZWQgaG9vayBvciB3YXRjaGVyIHNvdXJjZSBmdW5jdGlvbi5gLFxuICAgICAgICBudWxsLFxuICAgICAgICAxMFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWVuLnNldChmbiwgY291bnQgKyAxKTtcbiAgICB9XG4gIH1cbn1cblxubGV0IGlzSG1yVXBkYXRpbmcgPSBmYWxzZTtcbmNvbnN0IGhtckRpcnR5Q29tcG9uZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfSE1SX1JVTlRJTUVfXyA9IHtcbiAgICBjcmVhdGVSZWNvcmQ6IHRyeVdyYXAoY3JlYXRlUmVjb3JkKSxcbiAgICByZXJlbmRlcjogdHJ5V3JhcChyZXJlbmRlciksXG4gICAgcmVsb2FkOiB0cnlXcmFwKHJlbG9hZClcbiAgfTtcbn1cbmNvbnN0IG1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5mdW5jdGlvbiByZWdpc3RlckhNUihpbnN0YW5jZSkge1xuICBjb25zdCBpZCA9IGluc3RhbmNlLnR5cGUuX19obXJJZDtcbiAgbGV0IHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICBpZiAoIXJlY29yZCkge1xuICAgIGNyZWF0ZVJlY29yZChpZCwgaW5zdGFuY2UudHlwZSk7XG4gICAgcmVjb3JkID0gbWFwLmdldChpZCk7XG4gIH1cbiAgcmVjb3JkLmluc3RhbmNlcy5hZGQoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gdW5yZWdpc3RlckhNUihpbnN0YW5jZSkge1xuICBtYXAuZ2V0KGluc3RhbmNlLnR5cGUuX19obXJJZCkuaW5zdGFuY2VzLmRlbGV0ZShpbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWNvcmQoaWQsIGluaXRpYWxEZWYpIHtcbiAgaWYgKG1hcC5oYXMoaWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIG1hcC5zZXQoaWQsIHtcbiAgICBpbml0aWFsRGVmOiBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbml0aWFsRGVmKSxcbiAgICBpbnN0YW5jZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KClcbiAgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoY29tcG9uZW50KSB7XG4gIHJldHVybiBpc0NsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQuX192Y2NPcHRzIDogY29tcG9uZW50O1xufVxuZnVuY3Rpb24gcmVyZW5kZXIoaWQsIG5ld1JlbmRlcikge1xuICBjb25zdCByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVjb3JkLmluaXRpYWxEZWYucmVuZGVyID0gbmV3UmVuZGVyO1xuICBbLi4ucmVjb3JkLmluc3RhbmNlc10uZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICBpZiAobmV3UmVuZGVyKSB7XG4gICAgICBpbnN0YW5jZS5yZW5kZXIgPSBuZXdSZW5kZXI7XG4gICAgICBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbnN0YW5jZS50eXBlKS5yZW5kZXIgPSBuZXdSZW5kZXI7XG4gICAgfVxuICAgIGluc3RhbmNlLnJlbmRlckNhY2hlID0gW107XG4gICAgaXNIbXJVcGRhdGluZyA9IHRydWU7XG4gICAgaW5zdGFuY2UuZWZmZWN0LmRpcnR5ID0gdHJ1ZTtcbiAgICBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICBpc0htclVwZGF0aW5nID0gZmFsc2U7XG4gIH0pO1xufVxuZnVuY3Rpb24gcmVsb2FkKGlkLCBuZXdDb21wKSB7XG4gIGNvbnN0IHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICBpZiAoIXJlY29yZClcbiAgICByZXR1cm47XG4gIG5ld0NvbXAgPSBub3JtYWxpemVDbGFzc0NvbXBvbmVudChuZXdDb21wKTtcbiAgdXBkYXRlQ29tcG9uZW50RGVmKHJlY29yZC5pbml0aWFsRGVmLCBuZXdDb21wKTtcbiAgY29uc3QgaW5zdGFuY2VzID0gWy4uLnJlY29yZC5pbnN0YW5jZXNdO1xuICBmb3IgKGNvbnN0IGluc3RhbmNlIG9mIGluc3RhbmNlcykge1xuICAgIGNvbnN0IG9sZENvbXAgPSBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbnN0YW5jZS50eXBlKTtcbiAgICBpZiAoIWhtckRpcnR5Q29tcG9uZW50cy5oYXMob2xkQ29tcCkpIHtcbiAgICAgIGlmIChvbGRDb21wICE9PSByZWNvcmQuaW5pdGlhbERlZikge1xuICAgICAgICB1cGRhdGVDb21wb25lbnREZWYob2xkQ29tcCwgbmV3Q29tcCk7XG4gICAgICB9XG4gICAgICBobXJEaXJ0eUNvbXBvbmVudHMuYWRkKG9sZENvbXApO1xuICAgIH1cbiAgICBpbnN0YW5jZS5hcHBDb250ZXh0LnByb3BzQ2FjaGUuZGVsZXRlKGluc3RhbmNlLnR5cGUpO1xuICAgIGluc3RhbmNlLmFwcENvbnRleHQuZW1pdHNDYWNoZS5kZWxldGUoaW5zdGFuY2UudHlwZSk7XG4gICAgaW5zdGFuY2UuYXBwQ29udGV4dC5vcHRpb25zQ2FjaGUuZGVsZXRlKGluc3RhbmNlLnR5cGUpO1xuICAgIGlmIChpbnN0YW5jZS5jZVJlbG9hZCkge1xuICAgICAgaG1yRGlydHlDb21wb25lbnRzLmFkZChvbGRDb21wKTtcbiAgICAgIGluc3RhbmNlLmNlUmVsb2FkKG5ld0NvbXAuc3R5bGVzKTtcbiAgICAgIGhtckRpcnR5Q29tcG9uZW50cy5kZWxldGUob2xkQ29tcCk7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5wYXJlbnQpIHtcbiAgICAgIGluc3RhbmNlLnBhcmVudC5lZmZlY3QuZGlydHkgPSB0cnVlO1xuICAgICAgcXVldWVKb2IoaW5zdGFuY2UucGFyZW50LnVwZGF0ZSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5hcHBDb250ZXh0LnJlbG9hZCkge1xuICAgICAgaW5zdGFuY2UuYXBwQ29udGV4dC5yZWxvYWQoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltITVJdIFJvb3Qgb3IgbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSBtb2RpZmllZC4gRnVsbCByZWxvYWQgcmVxdWlyZWQuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHF1ZXVlUG9zdEZsdXNoQ2IoKCkgPT4ge1xuICAgIGZvciAoY29uc3QgaW5zdGFuY2Ugb2YgaW5zdGFuY2VzKSB7XG4gICAgICBobXJEaXJ0eUNvbXBvbmVudHMuZGVsZXRlKFxuICAgICAgICBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbnN0YW5jZS50eXBlKVxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50RGVmKG9sZENvbXAsIG5ld0NvbXApIHtcbiAgZXh0ZW5kKG9sZENvbXAsIG5ld0NvbXApO1xuICBmb3IgKGNvbnN0IGtleSBpbiBvbGRDb21wKSB7XG4gICAgaWYgKGtleSAhPT0gXCJfX2ZpbGVcIiAmJiAhKGtleSBpbiBuZXdDb21wKSkge1xuICAgICAgZGVsZXRlIG9sZENvbXBba2V5XTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHRyeVdyYXAoZm4pIHtcbiAgcmV0dXJuIChpZCwgYXJnKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmbihpZCwgYXJnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0hNUl0gU29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIFZ1ZSBjb21wb25lbnQgaG90LXJlbG9hZC4gRnVsbCByZWxvYWQgcmVxdWlyZWQuYFxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbmxldCBkZXZ0b29scyQxO1xubGV0IGJ1ZmZlciA9IFtdO1xubGV0IGRldnRvb2xzTm90SW5zdGFsbGVkID0gZmFsc2U7XG5mdW5jdGlvbiBlbWl0JDEoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgaWYgKGRldnRvb2xzJDEpIHtcbiAgICBkZXZ0b29scyQxLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICB9IGVsc2UgaWYgKCFkZXZ0b29sc05vdEluc3RhbGxlZCkge1xuICAgIGJ1ZmZlci5wdXNoKHsgZXZlbnQsIGFyZ3MgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldERldnRvb2xzSG9vayQxKGhvb2ssIHRhcmdldCkge1xuICB2YXIgX2EsIF9iO1xuICBkZXZ0b29scyQxID0gaG9vaztcbiAgaWYgKGRldnRvb2xzJDEpIHtcbiAgICBkZXZ0b29scyQxLmVuYWJsZWQgPSB0cnVlO1xuICAgIGJ1ZmZlci5mb3JFYWNoKCh7IGV2ZW50LCBhcmdzIH0pID0+IGRldnRvb2xzJDEuZW1pdChldmVudCwgLi4uYXJncykpO1xuICAgIGJ1ZmZlciA9IFtdO1xuICB9IGVsc2UgaWYgKFxuICAgIC8vIGhhbmRsZSBsYXRlIGRldnRvb2xzIGluamVjdGlvbiAtIG9ubHkgZG8gdGhpcyBpZiB3ZSBhcmUgaW4gYW4gYWN0dWFsXG4gICAgLy8gYnJvd3NlciBlbnZpcm9ubWVudCB0byBhdm9pZCB0aGUgdGltZXIgaGFuZGxlIHN0YWxsaW5nIHRlc3QgcnVubmVyIGV4aXRcbiAgICAvLyAoIzQ4MTUpXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiAvLyBzb21lIGVudnMgbW9jayB3aW5kb3cgYnV0IG5vdCBmdWxseVxuICAgIHdpbmRvdy5IVE1MRWxlbWVudCAmJiAvLyBhbHNvIGV4Y2x1ZGUganNkb21cbiAgICAhKChfYiA9IChfYSA9IHdpbmRvdy5uYXZpZ2F0b3IpID09IG51bGwgPyB2b2lkIDAgOiBfYS51c2VyQWdlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfYi5pbmNsdWRlcyhcImpzZG9tXCIpKVxuICApIHtcbiAgICBjb25zdCByZXBsYXkgPSB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyA9IHRhcmdldC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fIHx8IFtdO1xuICAgIHJlcGxheS5wdXNoKChuZXdIb29rKSA9PiB7XG4gICAgICBzZXREZXZ0b29sc0hvb2skMShuZXdIb29rLCB0YXJnZXQpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFkZXZ0b29scyQxKSB7XG4gICAgICAgIHRhcmdldC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fID0gbnVsbDtcbiAgICAgICAgZGV2dG9vbHNOb3RJbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgIH1cbiAgICB9LCAzZTMpO1xuICB9IGVsc2Uge1xuICAgIGRldnRvb2xzTm90SW5zdGFsbGVkID0gdHJ1ZTtcbiAgICBidWZmZXIgPSBbXTtcbiAgfVxufVxuZnVuY3Rpb24gZGV2dG9vbHNJbml0QXBwKGFwcCwgdmVyc2lvbikge1xuICBlbWl0JDEoXCJhcHA6aW5pdFwiIC8qIEFQUF9JTklUICovLCBhcHAsIHZlcnNpb24sIHtcbiAgICBGcmFnbWVudCxcbiAgICBUZXh0LFxuICAgIENvbW1lbnQsXG4gICAgU3RhdGljXG4gIH0pO1xufVxuZnVuY3Rpb24gZGV2dG9vbHNVbm1vdW50QXBwKGFwcCkge1xuICBlbWl0JDEoXCJhcHA6dW5tb3VudFwiIC8qIEFQUF9VTk1PVU5UICovLCBhcHApO1xufVxuY29uc3QgZGV2dG9vbHNDb21wb25lbnRBZGRlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXG4gIFwiY29tcG9uZW50OmFkZGVkXCIgLyogQ09NUE9ORU5UX0FEREVEICovXG4pO1xuY29uc3QgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURldnRvb2xzQ29tcG9uZW50SG9vayhcImNvbXBvbmVudDp1cGRhdGVkXCIgLyogQ09NUE9ORU5UX1VQREFURUQgKi8pO1xuY29uc3QgX2RldnRvb2xzQ29tcG9uZW50UmVtb3ZlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXG4gIFwiY29tcG9uZW50OnJlbW92ZWRcIiAvKiBDT01QT05FTlRfUkVNT1ZFRCAqL1xuKTtcbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50UmVtb3ZlZCA9IChjb21wb25lbnQpID0+IHtcbiAgaWYgKGRldnRvb2xzJDEgJiYgdHlwZW9mIGRldnRvb2xzJDEuY2xlYW51cEJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiICYmIC8vIHJlbW92ZSB0aGUgY29tcG9uZW50IGlmIGl0IHdhc24ndCBidWZmZXJlZFxuICAhZGV2dG9vbHMkMS5jbGVhbnVwQnVmZmVyKGNvbXBvbmVudCkpIHtcbiAgICBfZGV2dG9vbHNDb21wb25lbnRSZW1vdmVkKGNvbXBvbmVudCk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soaG9vaykge1xuICByZXR1cm4gKGNvbXBvbmVudCkgPT4ge1xuICAgIGVtaXQkMShcbiAgICAgIGhvb2ssXG4gICAgICBjb21wb25lbnQuYXBwQ29udGV4dC5hcHAsXG4gICAgICBjb21wb25lbnQudWlkLFxuICAgICAgY29tcG9uZW50LnBhcmVudCA/IGNvbXBvbmVudC5wYXJlbnQudWlkIDogdm9pZCAwLFxuICAgICAgY29tcG9uZW50XG4gICAgKTtcbiAgfTtcbn1cbmNvbnN0IGRldnRvb2xzUGVyZlN0YXJ0ID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURldnRvb2xzUGVyZm9ybWFuY2VIb29rKFxuICBcInBlcmY6c3RhcnRcIiAvKiBQRVJGT1JNQU5DRV9TVEFSVCAqL1xuKTtcbmNvbnN0IGRldnRvb2xzUGVyZkVuZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhcbiAgXCJwZXJmOmVuZFwiIC8qIFBFUkZPUk1BTkNFX0VORCAqL1xuKTtcbmZ1bmN0aW9uIGNyZWF0ZURldnRvb2xzUGVyZm9ybWFuY2VIb29rKGhvb2spIHtcbiAgcmV0dXJuIChjb21wb25lbnQsIHR5cGUsIHRpbWUpID0+IHtcbiAgICBlbWl0JDEoaG9vaywgY29tcG9uZW50LmFwcENvbnRleHQuYXBwLCBjb21wb25lbnQudWlkLCBjb21wb25lbnQsIHR5cGUsIHRpbWUpO1xuICB9O1xufVxuZnVuY3Rpb24gZGV2dG9vbHNDb21wb25lbnRFbWl0KGNvbXBvbmVudCwgZXZlbnQsIHBhcmFtcykge1xuICBlbWl0JDEoXG4gICAgXCJjb21wb25lbnQ6ZW1pdFwiIC8qIENPTVBPTkVOVF9FTUlUICovLFxuICAgIGNvbXBvbmVudC5hcHBDb250ZXh0LmFwcCxcbiAgICBjb21wb25lbnQsXG4gICAgZXZlbnQsXG4gICAgcGFyYW1zXG4gICk7XG59XG5cbmZ1bmN0aW9uIGVtaXQoaW5zdGFuY2UsIGV2ZW50LCAuLi5yYXdBcmdzKSB7XG4gIGlmIChpbnN0YW5jZS5pc1VubW91bnRlZClcbiAgICByZXR1cm47XG4gIGNvbnN0IHByb3BzID0gaW5zdGFuY2Uudm5vZGUucHJvcHMgfHwgRU1QVFlfT0JKO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGVtaXRzT3B0aW9ucyxcbiAgICAgIHByb3BzT3B0aW9uczogW3Byb3BzT3B0aW9uc11cbiAgICB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKGVtaXRzT3B0aW9ucykge1xuICAgICAgaWYgKCEoZXZlbnQgaW4gZW1pdHNPcHRpb25zKSAmJiB0cnVlKSB7XG4gICAgICAgIGlmICghcHJvcHNPcHRpb25zIHx8ICEodG9IYW5kbGVyS2V5KGV2ZW50KSBpbiBwcm9wc09wdGlvbnMpKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYENvbXBvbmVudCBlbWl0dGVkIGV2ZW50IFwiJHtldmVudH1cIiBidXQgaXQgaXMgbmVpdGhlciBkZWNsYXJlZCBpbiB0aGUgZW1pdHMgb3B0aW9uIG5vciBhcyBhbiBcIiR7dG9IYW5kbGVyS2V5KGV2ZW50KX1cIiBwcm9wLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBlbWl0c09wdGlvbnNbZXZlbnRdO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWxpZGF0b3IpKSB7XG4gICAgICAgICAgY29uc3QgaXNWYWxpZCA9IHZhbGlkYXRvciguLi5yYXdBcmdzKTtcbiAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgYEludmFsaWQgZXZlbnQgYXJndW1lbnRzOiBldmVudCB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgZXZlbnQgXCIke2V2ZW50fVwiLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGxldCBhcmdzID0gcmF3QXJncztcbiAgY29uc3QgaXNNb2RlbExpc3RlbmVyID0gZXZlbnQuc3RhcnRzV2l0aChcInVwZGF0ZTpcIik7XG4gIGNvbnN0IG1vZGVsQXJnID0gaXNNb2RlbExpc3RlbmVyICYmIGV2ZW50LnNsaWNlKDcpO1xuICBpZiAobW9kZWxBcmcgJiYgbW9kZWxBcmcgaW4gcHJvcHMpIHtcbiAgICBjb25zdCBtb2RpZmllcnNLZXkgPSBgJHttb2RlbEFyZyA9PT0gXCJtb2RlbFZhbHVlXCIgPyBcIm1vZGVsXCIgOiBtb2RlbEFyZ31Nb2RpZmllcnNgO1xuICAgIGNvbnN0IHsgbnVtYmVyLCB0cmltIH0gPSBwcm9wc1ttb2RpZmllcnNLZXldIHx8IEVNUFRZX09CSjtcbiAgICBpZiAodHJpbSkge1xuICAgICAgYXJncyA9IHJhd0FyZ3MubWFwKChhKSA9PiBpc1N0cmluZyhhKSA/IGEudHJpbSgpIDogYSk7XG4gICAgfVxuICAgIGlmIChudW1iZXIpIHtcbiAgICAgIGFyZ3MgPSByYXdBcmdzLm1hcChsb29zZVRvTnVtYmVyKTtcbiAgICB9XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgZGV2dG9vbHNDb21wb25lbnRFbWl0KGluc3RhbmNlLCBldmVudCwgYXJncyk7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCBsb3dlckNhc2VFdmVudCA9IGV2ZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyQ2FzZUV2ZW50ICE9PSBldmVudCAmJiBwcm9wc1t0b0hhbmRsZXJLZXkobG93ZXJDYXNlRXZlbnQpXSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgRXZlbnQgXCIke2xvd2VyQ2FzZUV2ZW50fVwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICR7Zm9ybWF0Q29tcG9uZW50TmFtZShcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBpbnN0YW5jZS50eXBlXG4gICAgICAgICl9IGJ1dCB0aGUgaGFuZGxlciBpcyByZWdpc3RlcmVkIGZvciBcIiR7ZXZlbnR9XCIuIE5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHlvdSBjYW5ub3QgdXNlIHYtb24gdG8gbGlzdGVuIHRvIGNhbWVsQ2FzZSBldmVudHMgd2hlbiB1c2luZyBpbi1ET00gdGVtcGxhdGVzLiBZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBcIiR7aHlwaGVuYXRlKFxuICAgICAgICAgIGV2ZW50XG4gICAgICAgICl9XCIgaW5zdGVhZCBvZiBcIiR7ZXZlbnR9XCIuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbGV0IGhhbmRsZXJOYW1lO1xuICBsZXQgaGFuZGxlciA9IHByb3BzW2hhbmRsZXJOYW1lID0gdG9IYW5kbGVyS2V5KGV2ZW50KV0gfHwgLy8gYWxzbyB0cnkgY2FtZWxDYXNlIGV2ZW50IGhhbmRsZXIgKCMyMjQ5KVxuICBwcm9wc1toYW5kbGVyTmFtZSA9IHRvSGFuZGxlcktleShjYW1lbGl6ZShldmVudCkpXTtcbiAgaWYgKCFoYW5kbGVyICYmIGlzTW9kZWxMaXN0ZW5lcikge1xuICAgIGhhbmRsZXIgPSBwcm9wc1toYW5kbGVyTmFtZSA9IHRvSGFuZGxlcktleShoeXBoZW5hdGUoZXZlbnQpKV07XG4gIH1cbiAgaWYgKGhhbmRsZXIpIHtcbiAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgIGhhbmRsZXIsXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIDYsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgfVxuICBjb25zdCBvbmNlSGFuZGxlciA9IHByb3BzW2hhbmRsZXJOYW1lICsgYE9uY2VgXTtcbiAgaWYgKG9uY2VIYW5kbGVyKSB7XG4gICAgaWYgKCFpbnN0YW5jZS5lbWl0dGVkKSB7XG4gICAgICBpbnN0YW5jZS5lbWl0dGVkID0ge307XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5lbWl0dGVkW2hhbmRsZXJOYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbnN0YW5jZS5lbWl0dGVkW2hhbmRsZXJOYW1lXSA9IHRydWU7XG4gICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBvbmNlSGFuZGxlcixcbiAgICAgIGluc3RhbmNlLFxuICAgICAgNixcbiAgICAgIGFyZ3NcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVFbWl0c09wdGlvbnMoY29tcCwgYXBwQ29udGV4dCwgYXNNaXhpbiA9IGZhbHNlKSB7XG4gIGNvbnN0IGNhY2hlID0gYXBwQ29udGV4dC5lbWl0c0NhY2hlO1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoY29tcCk7XG4gIGlmIChjYWNoZWQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgcmF3ID0gY29tcC5lbWl0cztcbiAgbGV0IG5vcm1hbGl6ZWQgPSB7fTtcbiAgbGV0IGhhc0V4dGVuZHMgPSBmYWxzZTtcbiAgaWYgKF9fVlVFX09QVElPTlNfQVBJX18gJiYgIWlzRnVuY3Rpb24oY29tcCkpIHtcbiAgICBjb25zdCBleHRlbmRFbWl0cyA9IChyYXcyKSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkRnJvbUV4dGVuZCA9IG5vcm1hbGl6ZUVtaXRzT3B0aW9ucyhyYXcyLCBhcHBDb250ZXh0LCB0cnVlKTtcbiAgICAgIGlmIChub3JtYWxpemVkRnJvbUV4dGVuZCkge1xuICAgICAgICBoYXNFeHRlbmRzID0gdHJ1ZTtcbiAgICAgICAgZXh0ZW5kKG5vcm1hbGl6ZWQsIG5vcm1hbGl6ZWRGcm9tRXh0ZW5kKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICghYXNNaXhpbiAmJiBhcHBDb250ZXh0Lm1peGlucy5sZW5ndGgpIHtcbiAgICAgIGFwcENvbnRleHQubWl4aW5zLmZvckVhY2goZXh0ZW5kRW1pdHMpO1xuICAgIH1cbiAgICBpZiAoY29tcC5leHRlbmRzKSB7XG4gICAgICBleHRlbmRFbWl0cyhjb21wLmV4dGVuZHMpO1xuICAgIH1cbiAgICBpZiAoY29tcC5taXhpbnMpIHtcbiAgICAgIGNvbXAubWl4aW5zLmZvckVhY2goZXh0ZW5kRW1pdHMpO1xuICAgIH1cbiAgfVxuICBpZiAoIXJhdyAmJiAhaGFzRXh0ZW5kcykge1xuICAgIGlmIChpc09iamVjdChjb21wKSkge1xuICAgICAgY2FjaGUuc2V0KGNvbXAsIG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoaXNBcnJheShyYXcpKSB7XG4gICAgcmF3LmZvckVhY2goKGtleSkgPT4gbm9ybWFsaXplZFtrZXldID0gbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgZXh0ZW5kKG5vcm1hbGl6ZWQsIHJhdyk7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgY2FjaGUuc2V0KGNvbXAsIG5vcm1hbGl6ZWQpO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuZnVuY3Rpb24gaXNFbWl0TGlzdGVuZXIob3B0aW9ucywga2V5KSB7XG4gIGlmICghb3B0aW9ucyB8fCAhaXNPbihrZXkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGtleSA9IGtleS5zbGljZSgyKS5yZXBsYWNlKC9PbmNlJC8sIFwiXCIpO1xuICByZXR1cm4gaGFzT3duKG9wdGlvbnMsIGtleVswXS50b0xvd2VyQ2FzZSgpICsga2V5LnNsaWNlKDEpKSB8fCBoYXNPd24ob3B0aW9ucywgaHlwaGVuYXRlKGtleSkpIHx8IGhhc093bihvcHRpb25zLCBrZXkpO1xufVxuXG5sZXQgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gbnVsbDtcbmxldCBjdXJyZW50U2NvcGVJZCA9IG51bGw7XG5mdW5jdGlvbiBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgY29uc3QgcHJldiA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbiAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gaW5zdGFuY2U7XG4gIGN1cnJlbnRTY29wZUlkID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UudHlwZS5fX3Njb3BlSWQgfHwgbnVsbDtcbiAgcmV0dXJuIHByZXY7XG59XG5mdW5jdGlvbiBwdXNoU2NvcGVJZChpZCkge1xuICBjdXJyZW50U2NvcGVJZCA9IGlkO1xufVxuZnVuY3Rpb24gcG9wU2NvcGVJZCgpIHtcbiAgY3VycmVudFNjb3BlSWQgPSBudWxsO1xufVxuY29uc3Qgd2l0aFNjb3BlSWQgPSAoX2lkKSA9PiB3aXRoQ3R4O1xuZnVuY3Rpb24gd2l0aEN0eChmbiwgY3R4ID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLCBpc05vblNjb3BlZFNsb3QpIHtcbiAgaWYgKCFjdHgpXG4gICAgcmV0dXJuIGZuO1xuICBpZiAoZm4uX24pIHtcbiAgICByZXR1cm4gZm47XG4gIH1cbiAgY29uc3QgcmVuZGVyRm5XaXRoQ29udGV4dCA9ICguLi5hcmdzKSA9PiB7XG4gICAgaWYgKHJlbmRlckZuV2l0aENvbnRleHQuX2QpIHtcbiAgICAgIHNldEJsb2NrVHJhY2tpbmcoLTEpO1xuICAgIH1cbiAgICBjb25zdCBwcmV2SW5zdGFuY2UgPSBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UoY3R4KTtcbiAgICBsZXQgcmVzO1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBmbiguLi5hcmdzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKHByZXZJbnN0YW5jZSk7XG4gICAgICBpZiAocmVuZGVyRm5XaXRoQ29udGV4dC5fZCkge1xuICAgICAgICBzZXRCbG9ja1RyYWNraW5nKDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGRldnRvb2xzQ29tcG9uZW50VXBkYXRlZChjdHgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuICByZW5kZXJGbldpdGhDb250ZXh0Ll9uID0gdHJ1ZTtcbiAgcmVuZGVyRm5XaXRoQ29udGV4dC5fYyA9IHRydWU7XG4gIHJlbmRlckZuV2l0aENvbnRleHQuX2QgPSB0cnVlO1xuICByZXR1cm4gcmVuZGVyRm5XaXRoQ29udGV4dDtcbn1cblxubGV0IGFjY2Vzc2VkQXR0cnMgPSBmYWxzZTtcbmZ1bmN0aW9uIG1hcmtBdHRyc0FjY2Vzc2VkKCkge1xuICBhY2Nlc3NlZEF0dHJzID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlbmRlckNvbXBvbmVudFJvb3QoaW5zdGFuY2UpIHtcbiAgY29uc3Qge1xuICAgIHR5cGU6IENvbXBvbmVudCxcbiAgICB2bm9kZSxcbiAgICBwcm94eSxcbiAgICB3aXRoUHJveHksXG4gICAgcHJvcHMsXG4gICAgcHJvcHNPcHRpb25zOiBbcHJvcHNPcHRpb25zXSxcbiAgICBzbG90cyxcbiAgICBhdHRycyxcbiAgICBlbWl0LFxuICAgIHJlbmRlcixcbiAgICByZW5kZXJDYWNoZSxcbiAgICBkYXRhLFxuICAgIHNldHVwU3RhdGUsXG4gICAgY3R4LFxuICAgIGluaGVyaXRBdHRyc1xuICB9ID0gaW5zdGFuY2U7XG4gIGxldCByZXN1bHQ7XG4gIGxldCBmYWxsdGhyb3VnaEF0dHJzO1xuICBjb25zdCBwcmV2ID0gc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKGluc3RhbmNlKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBhY2Nlc3NlZEF0dHJzID0gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgNCkge1xuICAgICAgY29uc3QgcHJveHlUb1VzZSA9IHdpdGhQcm94eSB8fCBwcm94eTtcbiAgICAgIGNvbnN0IHRoaXNQcm94eSA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2V0dXBTdGF0ZS5fX2lzU2NyaXB0U2V0dXAgPyBuZXcgUHJveHkocHJveHlUb1VzZSwge1xuICAgICAgICBnZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYFByb3BlcnR5ICcke1N0cmluZyhcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApfScgd2FzIGFjY2Vzc2VkIHZpYSAndGhpcycuIEF2b2lkIHVzaW5nICd0aGlzJyBpbiB0ZW1wbGF0ZXMuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcik7XG4gICAgICAgIH1cbiAgICAgIH0pIDogcHJveHlUb1VzZTtcbiAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZVZOb2RlKFxuICAgICAgICByZW5kZXIuY2FsbChcbiAgICAgICAgICB0aGlzUHJveHksXG4gICAgICAgICAgcHJveHlUb1VzZSxcbiAgICAgICAgICByZW5kZXJDYWNoZSxcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICBzZXR1cFN0YXRlLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY3R4XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBmYWxsdGhyb3VnaEF0dHJzID0gYXR0cnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlbmRlcjIgPSBDb21wb25lbnQ7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBhdHRycyA9PT0gcHJvcHMpIHtcbiAgICAgICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZVZOb2RlKFxuICAgICAgICByZW5kZXIyLmxlbmd0aCA+IDEgPyByZW5kZXIyKFxuICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB7XG4gICAgICAgICAgICBnZXQgYXR0cnMoKSB7XG4gICAgICAgICAgICAgIG1hcmtBdHRyc0FjY2Vzc2VkKCk7XG4gICAgICAgICAgICAgIHJldHVybiBhdHRycztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzbG90cyxcbiAgICAgICAgICAgIGVtaXRcbiAgICAgICAgICB9IDogeyBhdHRycywgc2xvdHMsIGVtaXQgfVxuICAgICAgICApIDogcmVuZGVyMihcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICBudWxsXG4gICAgICAgICAgLyogd2Uga25vdyBpdCBkb2Vzbid0IG5lZWQgaXQgKi9cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGZhbGx0aHJvdWdoQXR0cnMgPSBDb21wb25lbnQucHJvcHMgPyBhdHRycyA6IGdldEZ1bmN0aW9uYWxGYWxsdGhyb3VnaChhdHRycyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBibG9ja1N0YWNrLmxlbmd0aCA9IDA7XG4gICAgaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgMSk7XG4gICAgcmVzdWx0ID0gY3JlYXRlVk5vZGUoQ29tbWVudCk7XG4gIH1cbiAgbGV0IHJvb3QgPSByZXN1bHQ7XG4gIGxldCBzZXRSb290ID0gdm9pZCAwO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiByZXN1bHQucGF0Y2hGbGFnID4gMCAmJiByZXN1bHQucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgIFtyb290LCBzZXRSb290XSA9IGdldENoaWxkUm9vdChyZXN1bHQpO1xuICB9XG4gIGlmIChmYWxsdGhyb3VnaEF0dHJzICYmIGluaGVyaXRBdHRycyAhPT0gZmFsc2UpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmFsbHRocm91Z2hBdHRycyk7XG4gICAgY29uc3QgeyBzaGFwZUZsYWcgfSA9IHJvb3Q7XG4gICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICBpZiAoc2hhcGVGbGFnICYgKDEgfCA2KSkge1xuICAgICAgICBpZiAocHJvcHNPcHRpb25zICYmIGtleXMuc29tZShpc01vZGVsTGlzdGVuZXIpKSB7XG4gICAgICAgICAgZmFsbHRocm91Z2hBdHRycyA9IGZpbHRlck1vZGVsTGlzdGVuZXJzKFxuICAgICAgICAgICAgZmFsbHRocm91Z2hBdHRycyxcbiAgICAgICAgICAgIHByb3BzT3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdCA9IGNsb25lVk5vZGUocm9vdCwgZmFsbHRocm91Z2hBdHRycyk7XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWFjY2Vzc2VkQXR0cnMgJiYgcm9vdC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICAgIGNvbnN0IGFsbEF0dHJzID0gT2JqZWN0LmtleXMoYXR0cnMpO1xuICAgICAgICBjb25zdCBldmVudEF0dHJzID0gW107XG4gICAgICAgIGNvbnN0IGV4dHJhQXR0cnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBhbGxBdHRycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBhbGxBdHRyc1tpXTtcbiAgICAgICAgICBpZiAoaXNPbihrZXkpKSB7XG4gICAgICAgICAgICBpZiAoIWlzTW9kZWxMaXN0ZW5lcihrZXkpKSB7XG4gICAgICAgICAgICAgIGV2ZW50QXR0cnMucHVzaChrZXlbMl0udG9Mb3dlckNhc2UoKSArIGtleS5zbGljZSgzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4dHJhQXR0cnMucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0cmFBdHRycy5sZW5ndGgpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgRXh0cmFuZW91cyBub24tcHJvcHMgYXR0cmlidXRlcyAoJHtleHRyYUF0dHJzLmpvaW4oXCIsIFwiKX0pIHdlcmUgcGFzc2VkIHRvIGNvbXBvbmVudCBidXQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJlY2F1c2UgY29tcG9uZW50IHJlbmRlcnMgZnJhZ21lbnQgb3IgdGV4dCByb290IG5vZGVzLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudEF0dHJzLmxlbmd0aCkge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBFeHRyYW5lb3VzIG5vbi1lbWl0cyBldmVudCBsaXN0ZW5lcnMgKCR7ZXZlbnRBdHRycy5qb2luKFwiLCBcIil9KSB3ZXJlIHBhc3NlZCB0byBjb21wb25lbnQgYnV0IGNvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBiZWNhdXNlIGNvbXBvbmVudCByZW5kZXJzIGZyYWdtZW50IG9yIHRleHQgcm9vdCBub2Rlcy4gSWYgdGhlIGxpc3RlbmVyIGlzIGludGVuZGVkIHRvIGJlIGEgY29tcG9uZW50IGN1c3RvbSBldmVudCBsaXN0ZW5lciBvbmx5LCBkZWNsYXJlIGl0IHVzaW5nIHRoZSBcImVtaXRzXCIgb3B0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICh2bm9kZS5kaXJzKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzRWxlbWVudFJvb3Qocm9vdCkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYFJ1bnRpbWUgZGlyZWN0aXZlIHVzZWQgb24gY29tcG9uZW50IHdpdGggbm9uLWVsZW1lbnQgcm9vdCBub2RlLiBUaGUgZGlyZWN0aXZlcyB3aWxsIG5vdCBmdW5jdGlvbiBhcyBpbnRlbmRlZC5gXG4gICAgICApO1xuICAgIH1cbiAgICByb290ID0gY2xvbmVWTm9kZShyb290KTtcbiAgICByb290LmRpcnMgPSByb290LmRpcnMgPyByb290LmRpcnMuY29uY2F0KHZub2RlLmRpcnMpIDogdm5vZGUuZGlycztcbiAgfVxuICBpZiAodm5vZGUudHJhbnNpdGlvbikge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0VsZW1lbnRSb290KHJvb3QpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBDb21wb25lbnQgaW5zaWRlIDxUcmFuc2l0aW9uPiByZW5kZXJzIG5vbi1lbGVtZW50IHJvb3Qgbm9kZSB0aGF0IGNhbm5vdCBiZSBhbmltYXRlZC5gXG4gICAgICApO1xuICAgIH1cbiAgICByb290LnRyYW5zaXRpb24gPSB2bm9kZS50cmFuc2l0aW9uO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldFJvb3QpIHtcbiAgICBzZXRSb290KHJvb3QpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHJvb3Q7XG4gIH1cbiAgc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKHByZXYpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgZ2V0Q2hpbGRSb290ID0gKHZub2RlKSA9PiB7XG4gIGNvbnN0IHJhd0NoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gIGNvbnN0IGR5bmFtaWNDaGlsZHJlbiA9IHZub2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgY29uc3QgY2hpbGRSb290ID0gZmlsdGVyU2luZ2xlUm9vdChyYXdDaGlsZHJlbik7XG4gIGlmICghY2hpbGRSb290KSB7XG4gICAgcmV0dXJuIFt2bm9kZSwgdm9pZCAwXTtcbiAgfVxuICBjb25zdCBpbmRleCA9IHJhd0NoaWxkcmVuLmluZGV4T2YoY2hpbGRSb290KTtcbiAgY29uc3QgZHluYW1pY0luZGV4ID0gZHluYW1pY0NoaWxkcmVuID8gZHluYW1pY0NoaWxkcmVuLmluZGV4T2YoY2hpbGRSb290KSA6IC0xO1xuICBjb25zdCBzZXRSb290ID0gKHVwZGF0ZWRSb290KSA9PiB7XG4gICAgcmF3Q2hpbGRyZW5baW5kZXhdID0gdXBkYXRlZFJvb3Q7XG4gICAgaWYgKGR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgaWYgKGR5bmFtaWNJbmRleCA+IC0xKSB7XG4gICAgICAgIGR5bmFtaWNDaGlsZHJlbltkeW5hbWljSW5kZXhdID0gdXBkYXRlZFJvb3Q7XG4gICAgICB9IGVsc2UgaWYgKHVwZGF0ZWRSb290LnBhdGNoRmxhZyA+IDApIHtcbiAgICAgICAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID0gWy4uLmR5bmFtaWNDaGlsZHJlbiwgdXBkYXRlZFJvb3RdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIFtub3JtYWxpemVWTm9kZShjaGlsZFJvb3QpLCBzZXRSb290XTtcbn07XG5mdW5jdGlvbiBmaWx0ZXJTaW5nbGVSb290KGNoaWxkcmVuKSB7XG4gIGxldCBzaW5nbGVSb290O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoaXNWTm9kZShjaGlsZCkpIHtcbiAgICAgIGlmIChjaGlsZC50eXBlICE9PSBDb21tZW50IHx8IGNoaWxkLmNoaWxkcmVuID09PSBcInYtaWZcIikge1xuICAgICAgICBpZiAoc2luZ2xlUm9vdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaW5nbGVSb290ID0gY2hpbGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2luZ2xlUm9vdDtcbn1cbmNvbnN0IGdldEZ1bmN0aW9uYWxGYWxsdGhyb3VnaCA9IChhdHRycykgPT4ge1xuICBsZXQgcmVzO1xuICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgIGlmIChrZXkgPT09IFwiY2xhc3NcIiB8fCBrZXkgPT09IFwic3R5bGVcIiB8fCBpc09uKGtleSkpIHtcbiAgICAgIChyZXMgfHwgKHJlcyA9IHt9KSlba2V5XSA9IGF0dHJzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuY29uc3QgZmlsdGVyTW9kZWxMaXN0ZW5lcnMgPSAoYXR0cnMsIHByb3BzKSA9PiB7XG4gIGNvbnN0IHJlcyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgIGlmICghaXNNb2RlbExpc3RlbmVyKGtleSkgfHwgIShrZXkuc2xpY2UoOSkgaW4gcHJvcHMpKSB7XG4gICAgICByZXNba2V5XSA9IGF0dHJzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuY29uc3QgaXNFbGVtZW50Um9vdCA9ICh2bm9kZSkgPT4ge1xuICByZXR1cm4gdm5vZGUuc2hhcGVGbGFnICYgKDYgfCAxKSB8fCB2bm9kZS50eXBlID09PSBDb21tZW50O1xufTtcbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZUNvbXBvbmVudChwcmV2Vk5vZGUsIG5leHRWTm9kZSwgb3B0aW1pemVkKSB7XG4gIGNvbnN0IHsgcHJvcHM6IHByZXZQcm9wcywgY2hpbGRyZW46IHByZXZDaGlsZHJlbiwgY29tcG9uZW50IH0gPSBwcmV2Vk5vZGU7XG4gIGNvbnN0IHsgcHJvcHM6IG5leHRQcm9wcywgY2hpbGRyZW46IG5leHRDaGlsZHJlbiwgcGF0Y2hGbGFnIH0gPSBuZXh0Vk5vZGU7XG4gIGNvbnN0IGVtaXRzID0gY29tcG9uZW50LmVtaXRzT3B0aW9ucztcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgKHByZXZDaGlsZHJlbiB8fCBuZXh0Q2hpbGRyZW4pICYmIGlzSG1yVXBkYXRpbmcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAobmV4dFZOb2RlLmRpcnMgfHwgbmV4dFZOb2RlLnRyYW5zaXRpb24pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAob3B0aW1pemVkICYmIHBhdGNoRmxhZyA+PSAwKSB7XG4gICAgaWYgKHBhdGNoRmxhZyAmIDEwMjQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocGF0Y2hGbGFnICYgMTYpIHtcbiAgICAgIGlmICghcHJldlByb3BzKSB7XG4gICAgICAgIHJldHVybiAhIW5leHRQcm9wcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzKTtcbiAgICB9IGVsc2UgaWYgKHBhdGNoRmxhZyAmIDgpIHtcbiAgICAgIGNvbnN0IGR5bmFtaWNQcm9wcyA9IG5leHRWTm9kZS5keW5hbWljUHJvcHM7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGR5bmFtaWNQcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBkeW5hbWljUHJvcHNbaV07XG4gICAgICAgIGlmIChuZXh0UHJvcHNba2V5XSAhPT0gcHJldlByb3BzW2tleV0gJiYgIWlzRW1pdExpc3RlbmVyKGVtaXRzLCBrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHByZXZDaGlsZHJlbiB8fCBuZXh0Q2hpbGRyZW4pIHtcbiAgICAgIGlmICghbmV4dENoaWxkcmVuIHx8ICFuZXh0Q2hpbGRyZW4uJHN0YWJsZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByZXZQcm9wcyA9PT0gbmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghcHJldlByb3BzKSB7XG4gICAgICByZXR1cm4gISFuZXh0UHJvcHM7XG4gICAgfVxuICAgIGlmICghbmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc1Byb3BzQ2hhbmdlZChwcmV2UHJvcHMsIG5leHRQcm9wcywgZW1pdHMpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhc1Byb3BzQ2hhbmdlZChwcmV2UHJvcHMsIG5leHRQcm9wcywgZW1pdHNPcHRpb25zKSB7XG4gIGNvbnN0IG5leHRLZXlzID0gT2JqZWN0LmtleXMobmV4dFByb3BzKTtcbiAgaWYgKG5leHRLZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMocHJldlByb3BzKS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5leHRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gbmV4dEtleXNbaV07XG4gICAgaWYgKG5leHRQcm9wc1trZXldICE9PSBwcmV2UHJvcHNba2V5XSAmJiAhaXNFbWl0TGlzdGVuZXIoZW1pdHNPcHRpb25zLCBrZXkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gdXBkYXRlSE9DSG9zdEVsKHsgdm5vZGUsIHBhcmVudCB9LCBlbCkge1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgY29uc3Qgcm9vdCA9IHBhcmVudC5zdWJUcmVlO1xuICAgIGlmIChyb290LnN1c3BlbnNlICYmIHJvb3Quc3VzcGVuc2UuYWN0aXZlQnJhbmNoID09PSB2bm9kZSkge1xuICAgICAgcm9vdC5lbCA9IHZub2RlLmVsO1xuICAgIH1cbiAgICBpZiAocm9vdCA9PT0gdm5vZGUpIHtcbiAgICAgICh2bm9kZSA9IHBhcmVudC52bm9kZSkuZWwgPSBlbDtcbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBDT01QT05FTlRTID0gXCJjb21wb25lbnRzXCI7XG5jb25zdCBESVJFQ1RJVkVTID0gXCJkaXJlY3RpdmVzXCI7XG5mdW5jdGlvbiByZXNvbHZlQ29tcG9uZW50KG5hbWUsIG1heWJlU2VsZlJlZmVyZW5jZSkge1xuICByZXR1cm4gcmVzb2x2ZUFzc2V0KENPTVBPTkVOVFMsIG5hbWUsIHRydWUsIG1heWJlU2VsZlJlZmVyZW5jZSkgfHwgbmFtZTtcbn1cbmNvbnN0IE5VTExfRFlOQU1JQ19DT01QT05FTlQgPSBTeW1ib2wuZm9yKFwidi1uZGNcIik7XG5mdW5jdGlvbiByZXNvbHZlRHluYW1pY0NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgaWYgKGlzU3RyaW5nKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUFzc2V0KENPTVBPTkVOVFMsIGNvbXBvbmVudCwgZmFsc2UpIHx8IGNvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29tcG9uZW50IHx8IE5VTExfRFlOQU1JQ19DT01QT05FTlQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVEaXJlY3RpdmUobmFtZSkge1xuICByZXR1cm4gcmVzb2x2ZUFzc2V0KERJUkVDVElWRVMsIG5hbWUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUFzc2V0KHR5cGUsIG5hbWUsIHdhcm5NaXNzaW5nID0gdHJ1ZSwgbWF5YmVTZWxmUmVmZXJlbmNlID0gZmFsc2UpIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgfHwgY3VycmVudEluc3RhbmNlO1xuICBpZiAoaW5zdGFuY2UpIHtcbiAgICBjb25zdCBDb21wb25lbnQgPSBpbnN0YW5jZS50eXBlO1xuICAgIGlmICh0eXBlID09PSBDT01QT05FTlRTKSB7XG4gICAgICBjb25zdCBzZWxmTmFtZSA9IGdldENvbXBvbmVudE5hbWUoXG4gICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgICBpZiAoc2VsZk5hbWUgJiYgKHNlbGZOYW1lID09PSBuYW1lIHx8IHNlbGZOYW1lID09PSBjYW1lbGl6ZShuYW1lKSB8fCBzZWxmTmFtZSA9PT0gY2FwaXRhbGl6ZShjYW1lbGl6ZShuYW1lKSkpKSB7XG4gICAgICAgIHJldHVybiBDb21wb25lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IChcbiAgICAgIC8vIGxvY2FsIHJlZ2lzdHJhdGlvblxuICAgICAgLy8gY2hlY2sgaW5zdGFuY2VbdHlwZV0gZmlyc3Qgd2hpY2ggaXMgcmVzb2x2ZWQgZm9yIG9wdGlvbnMgQVBJXG4gICAgICByZXNvbHZlKGluc3RhbmNlW3R5cGVdIHx8IENvbXBvbmVudFt0eXBlXSwgbmFtZSkgfHwgLy8gZ2xvYmFsIHJlZ2lzdHJhdGlvblxuICAgICAgcmVzb2x2ZShpbnN0YW5jZS5hcHBDb250ZXh0W3R5cGVdLCBuYW1lKVxuICAgICk7XG4gICAgaWYgKCFyZXMgJiYgbWF5YmVTZWxmUmVmZXJlbmNlKSB7XG4gICAgICByZXR1cm4gQ29tcG9uZW50O1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuTWlzc2luZyAmJiAhcmVzKSB7XG4gICAgICBjb25zdCBleHRyYSA9IHR5cGUgPT09IENPTVBPTkVOVFMgPyBgXG5JZiB0aGlzIGlzIGEgbmF0aXZlIGN1c3RvbSBlbGVtZW50LCBtYWtlIHN1cmUgdG8gZXhjbHVkZSBpdCBmcm9tIGNvbXBvbmVudCByZXNvbHV0aW9uIHZpYSBjb21waWxlck9wdGlvbnMuaXNDdXN0b21FbGVtZW50LmAgOiBgYDtcbiAgICAgIHdhcm4kMShgRmFpbGVkIHRvIHJlc29sdmUgJHt0eXBlLnNsaWNlKDAsIC0xKX06ICR7bmFtZX0ke2V4dHJhfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgcmVzb2x2ZSR7Y2FwaXRhbGl6ZSh0eXBlLnNsaWNlKDAsIC0xKSl9IGNhbiBvbmx5IGJlIHVzZWQgaW4gcmVuZGVyKCkgb3Igc2V0dXAoKS5gXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZShyZWdpc3RyeSwgbmFtZSkge1xuICByZXR1cm4gcmVnaXN0cnkgJiYgKHJlZ2lzdHJ5W25hbWVdIHx8IHJlZ2lzdHJ5W2NhbWVsaXplKG5hbWUpXSB8fCByZWdpc3RyeVtjYXBpdGFsaXplKGNhbWVsaXplKG5hbWUpKV0pO1xufVxuXG5jb25zdCBpc1N1c3BlbnNlID0gKHR5cGUpID0+IHR5cGUuX19pc1N1c3BlbnNlO1xubGV0IHN1c3BlbnNlSWQgPSAwO1xuY29uc3QgU3VzcGVuc2VJbXBsID0ge1xuICBuYW1lOiBcIlN1c3BlbnNlXCIsXG4gIC8vIEluIG9yZGVyIHRvIG1ha2UgU3VzcGVuc2UgdHJlZS1zaGFrYWJsZSwgd2UgbmVlZCB0byBhdm9pZCBpbXBvcnRpbmcgaXRcbiAgLy8gZGlyZWN0bHkgaW4gdGhlIHJlbmRlcmVyLiBUaGUgcmVuZGVyZXIgY2hlY2tzIGZvciB0aGUgX19pc1N1c3BlbnNlIGZsYWdcbiAgLy8gb24gYSB2bm9kZSdzIHR5cGUgYW5kIGNhbGxzIHRoZSBgcHJvY2Vzc2AgbWV0aG9kLCBwYXNzaW5nIGluIHJlbmRlcmVyXG4gIC8vIGludGVybmFscy5cbiAgX19pc1N1c3BlbnNlOiB0cnVlLFxuICBwcm9jZXNzKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIG1vdW50U3VzcGVuc2UoXG4gICAgICAgIG4yLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgcmVuZGVyZXJJbnRlcm5hbHNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5kZXBzID4gMCkge1xuICAgICAgICBuMi5zdXNwZW5zZSA9IG4xLnN1c3BlbnNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwYXRjaFN1c3BlbnNlKFxuICAgICAgICBuMSxcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICAgICApO1xuICAgIH1cbiAgfSxcbiAgaHlkcmF0ZTogaHlkcmF0ZVN1c3BlbnNlLFxuICBjcmVhdGU6IGNyZWF0ZVN1c3BlbnNlQm91bmRhcnksXG4gIG5vcm1hbGl6ZTogbm9ybWFsaXplU3VzcGVuc2VDaGlsZHJlblxufTtcbmNvbnN0IFN1c3BlbnNlID0gU3VzcGVuc2VJbXBsIDtcbmZ1bmN0aW9uIHRyaWdnZXJFdmVudCh2bm9kZSwgbmFtZSkge1xuICBjb25zdCBldmVudExpc3RlbmVyID0gdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHNbbmFtZV07XG4gIGlmIChpc0Z1bmN0aW9uKGV2ZW50TGlzdGVuZXIpKSB7XG4gICAgZXZlbnRMaXN0ZW5lcigpO1xuICB9XG59XG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMpIHtcbiAgY29uc3Qge1xuICAgIHA6IHBhdGNoLFxuICAgIG86IHsgY3JlYXRlRWxlbWVudCB9XG4gIH0gPSByZW5kZXJlckludGVybmFscztcbiAgY29uc3QgaGlkZGVuQ29udGFpbmVyID0gY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgY29uc3Qgc3VzcGVuc2UgPSB2bm9kZS5zdXNwZW5zZSA9IGNyZWF0ZVN1c3BlbnNlQm91bmRhcnkoXG4gICAgdm5vZGUsXG4gICAgcGFyZW50U3VzcGVuc2UsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIGNvbnRhaW5lcixcbiAgICBoaWRkZW5Db250YWluZXIsXG4gICAgYW5jaG9yLFxuICAgIG5hbWVzcGFjZSxcbiAgICBzbG90U2NvcGVJZHMsXG4gICAgb3B0aW1pemVkLFxuICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICk7XG4gIHBhdGNoKFxuICAgIG51bGwsXG4gICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IHZub2RlLnNzQ29udGVudCxcbiAgICBoaWRkZW5Db250YWluZXIsXG4gICAgbnVsbCxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgc3VzcGVuc2UsXG4gICAgbmFtZXNwYWNlLFxuICAgIHNsb3RTY29wZUlkc1xuICApO1xuICBpZiAoc3VzcGVuc2UuZGVwcyA+IDApIHtcbiAgICB0cmlnZ2VyRXZlbnQodm5vZGUsIFwib25QZW5kaW5nXCIpO1xuICAgIHRyaWdnZXJFdmVudCh2bm9kZSwgXCJvbkZhbGxiYWNrXCIpO1xuICAgIHBhdGNoKFxuICAgICAgbnVsbCxcbiAgICAgIHZub2RlLnNzRmFsbGJhY2ssXG4gICAgICBjb250YWluZXIsXG4gICAgICBhbmNob3IsXG4gICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICBudWxsLFxuICAgICAgLy8gZmFsbGJhY2sgdHJlZSB3aWxsIG5vdCBoYXZlIHN1c3BlbnNlIGNvbnRleHRcbiAgICAgIG5hbWVzcGFjZSxcbiAgICAgIHNsb3RTY29wZUlkc1xuICAgICk7XG4gICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCB2bm9kZS5zc0ZhbGxiYWNrKTtcbiAgfSBlbHNlIHtcbiAgICBzdXNwZW5zZS5yZXNvbHZlKGZhbHNlLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcGF0Y2hTdXNwZW5zZShuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHsgcDogcGF0Y2gsIHVtOiB1bm1vdW50LCBvOiB7IGNyZWF0ZUVsZW1lbnQgfSB9KSB7XG4gIGNvbnN0IHN1c3BlbnNlID0gbjIuc3VzcGVuc2UgPSBuMS5zdXNwZW5zZTtcbiAgc3VzcGVuc2Uudm5vZGUgPSBuMjtcbiAgbjIuZWwgPSBuMS5lbDtcbiAgY29uc3QgbmV3QnJhbmNoID0gbjIuc3NDb250ZW50O1xuICBjb25zdCBuZXdGYWxsYmFjayA9IG4yLnNzRmFsbGJhY2s7XG4gIGNvbnN0IHsgYWN0aXZlQnJhbmNoLCBwZW5kaW5nQnJhbmNoLCBpc0luRmFsbGJhY2ssIGlzSHlkcmF0aW5nIH0gPSBzdXNwZW5zZTtcbiAgaWYgKHBlbmRpbmdCcmFuY2gpIHtcbiAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoID0gbmV3QnJhbmNoO1xuICAgIGlmIChpc1NhbWVWTm9kZVR5cGUobmV3QnJhbmNoLCBwZW5kaW5nQnJhbmNoKSkge1xuICAgICAgcGF0Y2goXG4gICAgICAgIHBlbmRpbmdCcmFuY2gsXG4gICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgICAgaWYgKHN1c3BlbnNlLmRlcHMgPD0gMCkge1xuICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICB9IGVsc2UgaWYgKGlzSW5GYWxsYmFjaykge1xuICAgICAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgICAgICBuZXdGYWxsYmFjayxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAvLyBmYWxsYmFjayB0cmVlIHdpbGwgbm90IGhhdmUgc3VzcGVuc2UgY29udGV4dFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIG5ld0ZhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdXNwZW5zZS5wZW5kaW5nSWQgPSBzdXNwZW5zZUlkKys7XG4gICAgICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgc3VzcGVuc2UuaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoID0gcGVuZGluZ0JyYW5jaDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVubW91bnQocGVuZGluZ0JyYW5jaCwgcGFyZW50Q29tcG9uZW50LCBzdXNwZW5zZSk7XG4gICAgICB9XG4gICAgICBzdXNwZW5zZS5kZXBzID0gMDtcbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMubGVuZ3RoID0gMDtcbiAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBpZiAoaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICAgICAgbmV3RmFsbGJhY2ssXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgLy8gZmFsbGJhY2sgdHJlZSB3aWxsIG5vdCBoYXZlIHN1c3BlbnNlIGNvbnRleHRcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBuZXdGYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZlQnJhbmNoICYmIGlzU2FtZVZOb2RlVHlwZShuZXdCcmFuY2gsIGFjdGl2ZUJyYW5jaCkpIHtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgICAgc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGFjdGl2ZUJyYW5jaCAmJiBpc1NhbWVWTm9kZVR5cGUobmV3QnJhbmNoLCBhY3RpdmVCcmFuY2gpKSB7XG4gICAgICBwYXRjaChcbiAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBuZXdCcmFuY2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXZlbnQobjIsIFwib25QZW5kaW5nXCIpO1xuICAgICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IG5ld0JyYW5jaDtcbiAgICAgIGlmIChuZXdCcmFuY2guc2hhcGVGbGFnICYgNTEyKSB7XG4gICAgICAgIHN1c3BlbnNlLnBlbmRpbmdJZCA9IG5ld0JyYW5jaC5jb21wb25lbnQuc3VzcGVuc2VJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1c3BlbnNlLnBlbmRpbmdJZCA9IHN1c3BlbnNlSWQrKztcbiAgICAgIH1cbiAgICAgIHBhdGNoKFxuICAgICAgICBudWxsLFxuICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyB0aW1lb3V0LCBwZW5kaW5nSWQgfSA9IHN1c3BlbnNlO1xuICAgICAgICBpZiAodGltZW91dCA+IDApIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nSWQgPT09IHBlbmRpbmdJZCkge1xuICAgICAgICAgICAgICBzdXNwZW5zZS5mYWxsYmFjayhuZXdGYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGltZW91dCA9PT0gMCkge1xuICAgICAgICAgIHN1c3BlbnNlLmZhbGxiYWNrKG5ld0ZhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxubGV0IGhhc1dhcm5lZCA9IGZhbHNlO1xuZnVuY3Rpb24gY3JlYXRlU3VzcGVuc2VCb3VuZGFyeSh2bm9kZSwgcGFyZW50U3VzcGVuc2UsIHBhcmVudENvbXBvbmVudCwgY29udGFpbmVyLCBoaWRkZW5Db250YWluZXIsIGFuY2hvciwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMsIGlzSHlkcmF0aW5nID0gZmFsc2UpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHJ1ZSAmJiAhaGFzV2FybmVkKSB7XG4gICAgaGFzV2FybmVkID0gdHJ1ZTtcbiAgICBjb25zb2xlW2NvbnNvbGUuaW5mbyA/IFwiaW5mb1wiIDogXCJsb2dcIl0oXG4gICAgICBgPFN1c3BlbnNlPiBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgaXRzIEFQSSB3aWxsIGxpa2VseSBjaGFuZ2UuYFxuICAgICk7XG4gIH1cbiAgY29uc3Qge1xuICAgIHA6IHBhdGNoLFxuICAgIG06IG1vdmUsXG4gICAgdW06IHVubW91bnQsXG4gICAgbjogbmV4dCxcbiAgICBvOiB7IHBhcmVudE5vZGUsIHJlbW92ZSB9XG4gIH0gPSByZW5kZXJlckludGVybmFscztcbiAgbGV0IHBhcmVudFN1c3BlbnNlSWQ7XG4gIGNvbnN0IGlzU3VzcGVuc2libGUgPSBpc1ZOb2RlU3VzcGVuc2libGUodm5vZGUpO1xuICBpZiAoaXNTdXNwZW5zaWJsZSkge1xuICAgIGlmIChwYXJlbnRTdXNwZW5zZSA9PSBudWxsID8gdm9pZCAwIDogcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgcGFyZW50U3VzcGVuc2VJZCA9IHBhcmVudFN1c3BlbnNlLnBlbmRpbmdJZDtcbiAgICAgIHBhcmVudFN1c3BlbnNlLmRlcHMrKztcbiAgICB9XG4gIH1cbiAgY29uc3QgdGltZW91dCA9IHZub2RlLnByb3BzID8gdG9OdW1iZXIodm5vZGUucHJvcHMudGltZW91dCkgOiB2b2lkIDA7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgYXNzZXJ0TnVtYmVyKHRpbWVvdXQsIGBTdXNwZW5zZSB0aW1lb3V0YCk7XG4gIH1cbiAgY29uc3QgaW5pdGlhbEFuY2hvciA9IGFuY2hvcjtcbiAgY29uc3Qgc3VzcGVuc2UgPSB7XG4gICAgdm5vZGUsXG4gICAgcGFyZW50OiBwYXJlbnRTdXNwZW5zZSxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgbmFtZXNwYWNlLFxuICAgIGNvbnRhaW5lcixcbiAgICBoaWRkZW5Db250YWluZXIsXG4gICAgZGVwczogMCxcbiAgICBwZW5kaW5nSWQ6IHN1c3BlbnNlSWQrKyxcbiAgICB0aW1lb3V0OiB0eXBlb2YgdGltZW91dCA9PT0gXCJudW1iZXJcIiA/IHRpbWVvdXQgOiAtMSxcbiAgICBhY3RpdmVCcmFuY2g6IG51bGwsXG4gICAgcGVuZGluZ0JyYW5jaDogbnVsbCxcbiAgICBpc0luRmFsbGJhY2s6ICFpc0h5ZHJhdGluZyxcbiAgICBpc0h5ZHJhdGluZyxcbiAgICBpc1VubW91bnRlZDogZmFsc2UsXG4gICAgZWZmZWN0czogW10sXG4gICAgcmVzb2x2ZShyZXN1bWUgPSBmYWxzZSwgc3luYyA9IGZhbHNlKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICBpZiAoIXJlc3VtZSAmJiAhc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBzdXNwZW5zZS5yZXNvbHZlKCkgaXMgY2FsbGVkIHdpdGhvdXQgYSBwZW5kaW5nIGJyYW5jaC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VzcGVuc2UuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgc3VzcGVuc2UucmVzb2x2ZSgpIGlzIGNhbGxlZCBvbiBhbiBhbHJlYWR5IHVubW91bnRlZCBzdXNwZW5zZSBib3VuZGFyeS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICB2bm9kZTogdm5vZGUyLFxuICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgIHBlbmRpbmdCcmFuY2gsXG4gICAgICAgIHBlbmRpbmdJZCxcbiAgICAgICAgZWZmZWN0cyxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50OiBwYXJlbnRDb21wb25lbnQyLFxuICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcjJcbiAgICAgIH0gPSBzdXNwZW5zZTtcbiAgICAgIGxldCBkZWxheUVudGVyID0gZmFsc2U7XG4gICAgICBpZiAoc3VzcGVuc2UuaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgc3VzcGVuc2UuaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoIXJlc3VtZSkge1xuICAgICAgICBkZWxheUVudGVyID0gYWN0aXZlQnJhbmNoICYmIHBlbmRpbmdCcmFuY2gudHJhbnNpdGlvbiAmJiBwZW5kaW5nQnJhbmNoLnRyYW5zaXRpb24ubW9kZSA9PT0gXCJvdXQtaW5cIjtcbiAgICAgICAgaWYgKGRlbGF5RW50ZXIpIHtcbiAgICAgICAgICBhY3RpdmVCcmFuY2gudHJhbnNpdGlvbi5hZnRlckxlYXZlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBlbmRpbmdJZCA9PT0gc3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICAgICAgICAgIG1vdmUoXG4gICAgICAgICAgICAgICAgcGVuZGluZ0JyYW5jaCxcbiAgICAgICAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgICAgICAgIGFuY2hvciA9PT0gaW5pdGlhbEFuY2hvciA/IG5leHQoYWN0aXZlQnJhbmNoKSA6IGFuY2hvcixcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZWZmZWN0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aXZlQnJhbmNoKSB7XG4gICAgICAgICAgaWYgKHBhcmVudE5vZGUoYWN0aXZlQnJhbmNoLmVsKSAhPT0gc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBhbmNob3IgPSBuZXh0KGFjdGl2ZUJyYW5jaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVubW91bnQoYWN0aXZlQnJhbmNoLCBwYXJlbnRDb21wb25lbnQyLCBzdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZWxheUVudGVyKSB7XG4gICAgICAgICAgbW92ZShwZW5kaW5nQnJhbmNoLCBjb250YWluZXIyLCBhbmNob3IsIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIHBlbmRpbmdCcmFuY2gpO1xuICAgICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IG51bGw7XG4gICAgICBzdXNwZW5zZS5pc0luRmFsbGJhY2sgPSBmYWxzZTtcbiAgICAgIGxldCBwYXJlbnQgPSBzdXNwZW5zZS5wYXJlbnQ7XG4gICAgICBsZXQgaGFzVW5yZXNvbHZlZEFuY2VzdG9yID0gZmFsc2U7XG4gICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICAgIHBhcmVudC5lZmZlY3RzLnB1c2goLi4uZWZmZWN0cyk7XG4gICAgICAgICAgaGFzVW5yZXNvbHZlZEFuY2VzdG9yID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgfVxuICAgICAgaWYgKCFoYXNVbnJlc29sdmVkQW5jZXN0b3IgJiYgIWRlbGF5RW50ZXIpIHtcbiAgICAgICAgcXVldWVQb3N0Rmx1c2hDYihlZmZlY3RzKTtcbiAgICAgIH1cbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMgPSBbXTtcbiAgICAgIGlmIChpc1N1c3BlbnNpYmxlKSB7XG4gICAgICAgIGlmIChwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nQnJhbmNoICYmIHBhcmVudFN1c3BlbnNlSWQgPT09IHBhcmVudFN1c3BlbnNlLnBlbmRpbmdJZCkge1xuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLmRlcHMtLTtcbiAgICAgICAgICBpZiAocGFyZW50U3VzcGVuc2UuZGVwcyA9PT0gMCAmJiAhc3luYykge1xuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KHZub2RlMiwgXCJvblJlc29sdmVcIik7XG4gICAgfSxcbiAgICBmYWxsYmFjayhmYWxsYmFja1ZOb2RlKSB7XG4gICAgICBpZiAoIXN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB2bm9kZTogdm5vZGUyLCBhY3RpdmVCcmFuY2gsIHBhcmVudENvbXBvbmVudDogcGFyZW50Q29tcG9uZW50MiwgY29udGFpbmVyOiBjb250YWluZXIyLCBuYW1lc3BhY2U6IG5hbWVzcGFjZTIgfSA9IHN1c3BlbnNlO1xuICAgICAgdHJpZ2dlckV2ZW50KHZub2RlMiwgXCJvbkZhbGxiYWNrXCIpO1xuICAgICAgY29uc3QgYW5jaG9yMiA9IG5leHQoYWN0aXZlQnJhbmNoKTtcbiAgICAgIGNvbnN0IG1vdW50RmFsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgIGlmICghc3VzcGVuc2UuaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgZmFsbGJhY2tWTm9kZSxcbiAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgIGFuY2hvcjIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50MixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgbmFtZXNwYWNlMixcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgZmFsbGJhY2tWTm9kZSk7XG4gICAgICB9O1xuICAgICAgY29uc3QgZGVsYXlFbnRlciA9IGZhbGxiYWNrVk5vZGUudHJhbnNpdGlvbiAmJiBmYWxsYmFja1ZOb2RlLnRyYW5zaXRpb24ubW9kZSA9PT0gXCJvdXQtaW5cIjtcbiAgICAgIGlmIChkZWxheUVudGVyKSB7XG4gICAgICAgIGFjdGl2ZUJyYW5jaC50cmFuc2l0aW9uLmFmdGVyTGVhdmUgPSBtb3VudEZhbGxiYWNrO1xuICAgICAgfVxuICAgICAgc3VzcGVuc2UuaXNJbkZhbGxiYWNrID0gdHJ1ZTtcbiAgICAgIHVubW91bnQoXG4gICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50MixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgLy8gbm8gc3VzcGVuc2Ugc28gdW5tb3VudCBob29rcyBmaXJlIG5vd1xuICAgICAgICB0cnVlXG4gICAgICAgIC8vIHNob3VsZFJlbW92ZVxuICAgICAgKTtcbiAgICAgIGlmICghZGVsYXlFbnRlcikge1xuICAgICAgICBtb3VudEZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBtb3ZlKGNvbnRhaW5lcjIsIGFuY2hvcjIsIHR5cGUpIHtcbiAgICAgIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCAmJiBtb3ZlKHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCwgY29udGFpbmVyMiwgYW5jaG9yMiwgdHlwZSk7XG4gICAgICBzdXNwZW5zZS5jb250YWluZXIgPSBjb250YWluZXIyO1xuICAgIH0sXG4gICAgbmV4dCgpIHtcbiAgICAgIHJldHVybiBzdXNwZW5zZS5hY3RpdmVCcmFuY2ggJiYgbmV4dChzdXNwZW5zZS5hY3RpdmVCcmFuY2gpO1xuICAgIH0sXG4gICAgcmVnaXN0ZXJEZXAoaW5zdGFuY2UsIHNldHVwUmVuZGVyRWZmZWN0KSB7XG4gICAgICBjb25zdCBpc0luUGVuZGluZ1N1c3BlbnNlID0gISFzdXNwZW5zZS5wZW5kaW5nQnJhbmNoO1xuICAgICAgaWYgKGlzSW5QZW5kaW5nU3VzcGVuc2UpIHtcbiAgICAgICAgc3VzcGVuc2UuZGVwcysrO1xuICAgICAgfVxuICAgICAgY29uc3QgaHlkcmF0ZWRFbCA9IGluc3RhbmNlLnZub2RlLmVsO1xuICAgICAgaW5zdGFuY2UuYXN5bmNEZXAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCAwKTtcbiAgICAgIH0pLnRoZW4oKGFzeW5jU2V0dXBSZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKGluc3RhbmNlLmlzVW5tb3VudGVkIHx8IHN1c3BlbnNlLmlzVW5tb3VudGVkIHx8IHN1c3BlbnNlLnBlbmRpbmdJZCAhPT0gaW5zdGFuY2Uuc3VzcGVuc2VJZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZS5hc3luY1Jlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgeyB2bm9kZTogdm5vZGUyIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwdXNoV2FybmluZ0NvbnRleHQodm5vZGUyKTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVTZXR1cFJlc3VsdChpbnN0YW5jZSwgYXN5bmNTZXR1cFJlc3VsdCwgZmFsc2UpO1xuICAgICAgICBpZiAoaHlkcmF0ZWRFbCkge1xuICAgICAgICAgIHZub2RlMi5lbCA9IGh5ZHJhdGVkRWw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAhaHlkcmF0ZWRFbCAmJiBpbnN0YW5jZS5zdWJUcmVlLmVsO1xuICAgICAgICBzZXR1cFJlbmRlckVmZmVjdChcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICB2bm9kZTIsXG4gICAgICAgICAgLy8gY29tcG9uZW50IG1heSBoYXZlIGJlZW4gbW92ZWQgYmVmb3JlIHJlc29sdmUuXG4gICAgICAgICAgLy8gaWYgdGhpcyBpcyBub3QgYSBoeWRyYXRpb24sIGluc3RhbmNlLnN1YlRyZWUgd2lsbCBiZSB0aGUgY29tbWVudFxuICAgICAgICAgIC8vIHBsYWNlaG9sZGVyLlxuICAgICAgICAgIHBhcmVudE5vZGUoaHlkcmF0ZWRFbCB8fCBpbnN0YW5jZS5zdWJUcmVlLmVsKSxcbiAgICAgICAgICAvLyBhbmNob3Igd2lsbCBub3QgYmUgdXNlZCBpZiB0aGlzIGlzIGh5ZHJhdGlvbiwgc28gb25seSBuZWVkIHRvXG4gICAgICAgICAgLy8gY29uc2lkZXIgdGhlIGNvbW1lbnQgcGxhY2Vob2xkZXIgY2FzZS5cbiAgICAgICAgICBoeWRyYXRlZEVsID8gbnVsbCA6IG5leHQoaW5zdGFuY2Uuc3ViVHJlZSksXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBpZiAocGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICByZW1vdmUocGxhY2Vob2xkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUhPQ0hvc3RFbChpbnN0YW5jZSwgdm5vZGUyLmVsKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0luUGVuZGluZ1N1c3BlbnNlICYmIC0tc3VzcGVuc2UuZGVwcyA9PT0gMCkge1xuICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICB1bm1vdW50KHBhcmVudFN1c3BlbnNlMiwgZG9SZW1vdmUpIHtcbiAgICAgIHN1c3BlbnNlLmlzVW5tb3VudGVkID0gdHJ1ZTtcbiAgICAgIGlmIChzdXNwZW5zZS5hY3RpdmVCcmFuY2gpIHtcbiAgICAgICAgdW5tb3VudChcbiAgICAgICAgICBzdXNwZW5zZS5hY3RpdmVCcmFuY2gsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlMixcbiAgICAgICAgICBkb1JlbW92ZVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgICAgdW5tb3VudChcbiAgICAgICAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZTIsXG4gICAgICAgICAgZG9SZW1vdmVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBzdXNwZW5zZTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVTdXNwZW5zZShub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMsIGh5ZHJhdGVOb2RlKSB7XG4gIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2UgPSBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KFxuICAgIHZub2RlLFxuICAgIHBhcmVudFN1c3BlbnNlLFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBub2RlLnBhcmVudE5vZGUsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgbnVsbCxcbiAgICBuYW1lc3BhY2UsXG4gICAgc2xvdFNjb3BlSWRzLFxuICAgIG9wdGltaXplZCxcbiAgICByZW5kZXJlckludGVybmFscyxcbiAgICB0cnVlXG4gICk7XG4gIGNvbnN0IHJlc3VsdCA9IGh5ZHJhdGVOb2RlKFxuICAgIG5vZGUsXG4gICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IHZub2RlLnNzQ29udGVudCxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgc3VzcGVuc2UsXG4gICAgc2xvdFNjb3BlSWRzLFxuICAgIG9wdGltaXplZFxuICApO1xuICBpZiAoc3VzcGVuc2UuZGVwcyA9PT0gMCkge1xuICAgIHN1c3BlbnNlLnJlc29sdmUoZmFsc2UsIHRydWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBub3JtYWxpemVTdXNwZW5zZUNoaWxkcmVuKHZub2RlKSB7XG4gIGNvbnN0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiB9ID0gdm5vZGU7XG4gIGNvbnN0IGlzU2xvdENoaWxkcmVuID0gc2hhcGVGbGFnICYgMzI7XG4gIHZub2RlLnNzQ29udGVudCA9IG5vcm1hbGl6ZVN1c3BlbnNlU2xvdChcbiAgICBpc1Nsb3RDaGlsZHJlbiA/IGNoaWxkcmVuLmRlZmF1bHQgOiBjaGlsZHJlblxuICApO1xuICB2bm9kZS5zc0ZhbGxiYWNrID0gaXNTbG90Q2hpbGRyZW4gPyBub3JtYWxpemVTdXNwZW5zZVNsb3QoY2hpbGRyZW4uZmFsbGJhY2spIDogY3JlYXRlVk5vZGUoQ29tbWVudCk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVTdXNwZW5zZVNsb3Qocykge1xuICBsZXQgYmxvY2s7XG4gIGlmIChpc0Z1bmN0aW9uKHMpKSB7XG4gICAgY29uc3QgdHJhY2tCbG9jayA9IGlzQmxvY2tUcmVlRW5hYmxlZCAmJiBzLl9jO1xuICAgIGlmICh0cmFja0Jsb2NrKSB7XG4gICAgICBzLl9kID0gZmFsc2U7XG4gICAgICBvcGVuQmxvY2soKTtcbiAgICB9XG4gICAgcyA9IHMoKTtcbiAgICBpZiAodHJhY2tCbG9jaykge1xuICAgICAgcy5fZCA9IHRydWU7XG4gICAgICBibG9jayA9IGN1cnJlbnRCbG9jaztcbiAgICAgIGNsb3NlQmxvY2soKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQXJyYXkocykpIHtcbiAgICBjb25zdCBzaW5nbGVDaGlsZCA9IGZpbHRlclNpbmdsZVJvb3Qocyk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXNpbmdsZUNoaWxkICYmIHMuZmlsdGVyKChjaGlsZCkgPT4gY2hpbGQgIT09IE5VTExfRFlOQU1JQ19DT01QT05FTlQpLmxlbmd0aCA+IDApIHtcbiAgICAgIHdhcm4kMShgPFN1c3BlbnNlPiBzbG90cyBleHBlY3QgYSBzaW5nbGUgcm9vdCBub2RlLmApO1xuICAgIH1cbiAgICBzID0gc2luZ2xlQ2hpbGQ7XG4gIH1cbiAgcyA9IG5vcm1hbGl6ZVZOb2RlKHMpO1xuICBpZiAoYmxvY2sgJiYgIXMuZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgcy5keW5hbWljQ2hpbGRyZW4gPSBibG9jay5maWx0ZXIoKGMpID0+IGMgIT09IHMpO1xuICB9XG4gIHJldHVybiBzO1xufVxuZnVuY3Rpb24gcXVldWVFZmZlY3RXaXRoU3VzcGVuc2UoZm4sIHN1c3BlbnNlKSB7XG4gIGlmIChzdXNwZW5zZSAmJiBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgaWYgKGlzQXJyYXkoZm4pKSB7XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzLnB1c2goLi4uZm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzLnB1c2goZm4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBxdWV1ZVBvc3RGbHVzaENiKGZuKTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBicmFuY2gpIHtcbiAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoID0gYnJhbmNoO1xuICBjb25zdCB7IHZub2RlLCBwYXJlbnRDb21wb25lbnQgfSA9IHN1c3BlbnNlO1xuICBsZXQgZWwgPSBicmFuY2guZWw7XG4gIHdoaWxlICghZWwgJiYgYnJhbmNoLmNvbXBvbmVudCkge1xuICAgIGJyYW5jaCA9IGJyYW5jaC5jb21wb25lbnQuc3ViVHJlZTtcbiAgICBlbCA9IGJyYW5jaC5lbDtcbiAgfVxuICB2bm9kZS5lbCA9IGVsO1xuICBpZiAocGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudC5zdWJUcmVlID09PSB2bm9kZSkge1xuICAgIHBhcmVudENvbXBvbmVudC52bm9kZS5lbCA9IGVsO1xuICAgIHVwZGF0ZUhPQ0hvc3RFbChwYXJlbnRDb21wb25lbnQsIGVsKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNWTm9kZVN1c3BlbnNpYmxlKHZub2RlKSB7XG4gIHZhciBfYTtcbiAgcmV0dXJuICgoX2EgPSB2bm9kZS5wcm9wcykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnN1c3BlbnNpYmxlKSAhPSBudWxsICYmIHZub2RlLnByb3BzLnN1c3BlbnNpYmxlICE9PSBmYWxzZTtcbn1cblxuY29uc3Qgc3NyQ29udGV4dEtleSA9IFN5bWJvbC5mb3IoXCJ2LXNjeFwiKTtcbmNvbnN0IHVzZVNTUkNvbnRleHQgPSAoKSA9PiB7XG4gIHtcbiAgICBjb25zdCBjdHggPSBpbmplY3Qoc3NyQ29udGV4dEtleSk7XG4gICAgaWYgKCFjdHgpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKFxuICAgICAgICBgU2VydmVyIHJlbmRlcmluZyBjb250ZXh0IG5vdCBwcm92aWRlZC4gTWFrZSBzdXJlIHRvIG9ubHkgY2FsbCB1c2VTU1JDb250ZXh0KCkgY29uZGl0aW9uYWxseSBpbiB0aGUgc2VydmVyIGJ1aWxkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjdHg7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHdhdGNoRWZmZWN0KGVmZmVjdCwgb3B0aW9ucykge1xuICByZXR1cm4gZG9XYXRjaChlZmZlY3QsIG51bGwsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gd2F0Y2hQb3N0RWZmZWN0KGVmZmVjdCwgb3B0aW9ucykge1xuICByZXR1cm4gZG9XYXRjaChcbiAgICBlZmZlY3QsXG4gICAgbnVsbCxcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gZXh0ZW5kKHt9LCBvcHRpb25zLCB7IGZsdXNoOiBcInBvc3RcIiB9KSA6IHsgZmx1c2g6IFwicG9zdFwiIH1cbiAgKTtcbn1cbmZ1bmN0aW9uIHdhdGNoU3luY0VmZmVjdChlZmZlY3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRvV2F0Y2goXG4gICAgZWZmZWN0LFxuICAgIG51bGwsXG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGV4dGVuZCh7fSwgb3B0aW9ucywgeyBmbHVzaDogXCJzeW5jXCIgfSkgOiB7IGZsdXNoOiBcInN5bmNcIiB9XG4gICk7XG59XG5jb25zdCBJTklUSUFMX1dBVENIRVJfVkFMVUUgPSB7fTtcbmZ1bmN0aW9uIHdhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnMpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgd2FybiQxKFxuICAgICAgYFxcYHdhdGNoKGZuLCBvcHRpb25zPylcXGAgc2lnbmF0dXJlIGhhcyBiZWVuIG1vdmVkIHRvIGEgc2VwYXJhdGUgQVBJLiBVc2UgXFxgd2F0Y2hFZmZlY3QoZm4sIG9wdGlvbnM/KVxcYCBpbnN0ZWFkLiBcXGB3YXRjaFxcYCBub3cgb25seSBzdXBwb3J0cyBcXGB3YXRjaChzb3VyY2UsIGNiLCBvcHRpb25zPykgc2lnbmF0dXJlLmBcbiAgICApO1xuICB9XG4gIHJldHVybiBkb1dhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gZG9XYXRjaChzb3VyY2UsIGNiLCB7XG4gIGltbWVkaWF0ZSxcbiAgZGVlcCxcbiAgZmx1c2gsXG4gIG9uY2UsXG4gIG9uVHJhY2ssXG4gIG9uVHJpZ2dlclxufSA9IEVNUFRZX09CSikge1xuICBpZiAoY2IgJiYgb25jZSkge1xuICAgIGNvbnN0IF9jYiA9IGNiO1xuICAgIGNiID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIF9jYiguLi5hcmdzKTtcbiAgICAgIHVud2F0Y2goKTtcbiAgICB9O1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGRlZXAgIT09IHZvaWQgMCAmJiB0eXBlb2YgZGVlcCA9PT0gXCJudW1iZXJcIikge1xuICAgIHdhcm4kMShcbiAgICAgIGB3YXRjaCgpIFwiZGVlcFwiIG9wdGlvbiB3aXRoIG51bWJlciB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgd2F0Y2ggZGVwdGggaW4gZnV0dXJlIHZlcnNpb25zLiBQbGVhc2UgdXNlIGEgYm9vbGVhbiBpbnN0ZWFkIHRvIGF2b2lkIHBvdGVudGlhbCBicmVha2FnZS5gXG4gICAgKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhY2IpIHtcbiAgICBpZiAoaW1tZWRpYXRlICE9PSB2b2lkIDApIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYHdhdGNoKCkgXCJpbW1lZGlhdGVcIiBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyB0aGUgd2F0Y2goc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucz8pIHNpZ25hdHVyZS5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZGVlcCAhPT0gdm9pZCAwKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGB3YXRjaCgpIFwiZGVlcFwiIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIHRoZSB3YXRjaChzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zPykgc2lnbmF0dXJlLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvbmNlICE9PSB2b2lkIDApIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYHdhdGNoKCkgXCJvbmNlXCIgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgdGhlIHdhdGNoKHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgd2FybkludmFsaWRTb3VyY2UgPSAocykgPT4ge1xuICAgIHdhcm4kMShcbiAgICAgIGBJbnZhbGlkIHdhdGNoIHNvdXJjZTogYCxcbiAgICAgIHMsXG4gICAgICBgQSB3YXRjaCBzb3VyY2UgY2FuIG9ubHkgYmUgYSBnZXR0ZXIvZWZmZWN0IGZ1bmN0aW9uLCBhIHJlZiwgYSByZWFjdGl2ZSBvYmplY3QsIG9yIGFuIGFycmF5IG9mIHRoZXNlIHR5cGVzLmBcbiAgICApO1xuICB9O1xuICBjb25zdCBpbnN0YW5jZSA9IGN1cnJlbnRJbnN0YW5jZTtcbiAgY29uc3QgcmVhY3RpdmVHZXR0ZXIgPSAoc291cmNlMikgPT4gZGVlcCA9PT0gdHJ1ZSA/IHNvdXJjZTIgOiAoXG4gICAgLy8gZm9yIGRlZXA6IGZhbHNlLCBvbmx5IHRyYXZlcnNlIHJvb3QtbGV2ZWwgcHJvcGVydGllc1xuICAgIHRyYXZlcnNlKHNvdXJjZTIsIGRlZXAgPT09IGZhbHNlID8gMSA6IHZvaWQgMClcbiAgKTtcbiAgbGV0IGdldHRlcjtcbiAgbGV0IGZvcmNlVHJpZ2dlciA9IGZhbHNlO1xuICBsZXQgaXNNdWx0aVNvdXJjZSA9IGZhbHNlO1xuICBpZiAoaXNSZWYoc291cmNlKSkge1xuICAgIGdldHRlciA9ICgpID0+IHNvdXJjZS52YWx1ZTtcbiAgICBmb3JjZVRyaWdnZXIgPSBpc1NoYWxsb3ckMShzb3VyY2UpO1xuICB9IGVsc2UgaWYgKGlzUmVhY3RpdmUoc291cmNlKSkge1xuICAgIGdldHRlciA9ICgpID0+IHJlYWN0aXZlR2V0dGVyKHNvdXJjZSk7XG4gICAgZm9yY2VUcmlnZ2VyID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHNvdXJjZSkpIHtcbiAgICBpc011bHRpU291cmNlID0gdHJ1ZTtcbiAgICBmb3JjZVRyaWdnZXIgPSBzb3VyY2Uuc29tZSgocykgPT4gaXNSZWFjdGl2ZShzKSB8fCBpc1NoYWxsb3ckMShzKSk7XG4gICAgZ2V0dGVyID0gKCkgPT4gc291cmNlLm1hcCgocykgPT4ge1xuICAgICAgaWYgKGlzUmVmKHMpKSB7XG4gICAgICAgIHJldHVybiBzLnZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChpc1JlYWN0aXZlKHMpKSB7XG4gICAgICAgIHJldHVybiByZWFjdGl2ZUdldHRlcihzKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihzKSkge1xuICAgICAgICByZXR1cm4gY2FsbFdpdGhFcnJvckhhbmRsaW5nKHMsIGluc3RhbmNlLCAyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybkludmFsaWRTb3VyY2Uocyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihzb3VyY2UpKSB7XG4gICAgaWYgKGNiKSB7XG4gICAgICBnZXR0ZXIgPSAoKSA9PiBjYWxsV2l0aEVycm9ySGFuZGxpbmcoc291cmNlLCBpbnN0YW5jZSwgMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgaWYgKGNsZWFudXApIHtcbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAzLFxuICAgICAgICAgIFtvbkNsZWFudXBdXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBnZXR0ZXIgPSBOT09QO1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybkludmFsaWRTb3VyY2Uoc291cmNlKTtcbiAgfVxuICBpZiAoY2IgJiYgZGVlcCkge1xuICAgIGNvbnN0IGJhc2VHZXR0ZXIgPSBnZXR0ZXI7XG4gICAgZ2V0dGVyID0gKCkgPT4gdHJhdmVyc2UoYmFzZUdldHRlcigpKTtcbiAgfVxuICBsZXQgY2xlYW51cDtcbiAgbGV0IG9uQ2xlYW51cCA9IChmbikgPT4ge1xuICAgIGNsZWFudXAgPSBlZmZlY3Qub25TdG9wID0gKCkgPT4ge1xuICAgICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgNCk7XG4gICAgICBjbGVhbnVwID0gZWZmZWN0Lm9uU3RvcCA9IHZvaWQgMDtcbiAgICB9O1xuICB9O1xuICBsZXQgc3NyQ2xlYW51cDtcbiAgaWYgKGlzSW5TU1JDb21wb25lbnRTZXR1cCkge1xuICAgIG9uQ2xlYW51cCA9IE5PT1A7XG4gICAgaWYgKCFjYikge1xuICAgICAgZ2V0dGVyKCk7XG4gICAgfSBlbHNlIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGNiLCBpbnN0YW5jZSwgMywgW1xuICAgICAgICBnZXR0ZXIoKSxcbiAgICAgICAgaXNNdWx0aVNvdXJjZSA/IFtdIDogdm9pZCAwLFxuICAgICAgICBvbkNsZWFudXBcbiAgICAgIF0pO1xuICAgIH1cbiAgICBpZiAoZmx1c2ggPT09IFwic3luY1wiKSB7XG4gICAgICBjb25zdCBjdHggPSB1c2VTU1JDb250ZXh0KCk7XG4gICAgICBzc3JDbGVhbnVwID0gY3R4Ll9fd2F0Y2hlckhhbmRsZXMgfHwgKGN0eC5fX3dhdGNoZXJIYW5kbGVzID0gW10pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gTk9PUDtcbiAgICB9XG4gIH1cbiAgbGV0IG9sZFZhbHVlID0gaXNNdWx0aVNvdXJjZSA/IG5ldyBBcnJheShzb3VyY2UubGVuZ3RoKS5maWxsKElOSVRJQUxfV0FUQ0hFUl9WQUxVRSkgOiBJTklUSUFMX1dBVENIRVJfVkFMVUU7XG4gIGNvbnN0IGpvYiA9ICgpID0+IHtcbiAgICBpZiAoIWVmZmVjdC5hY3RpdmUgfHwgIWVmZmVjdC5kaXJ0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY2IpIHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZWZmZWN0LnJ1bigpO1xuICAgICAgaWYgKGRlZXAgfHwgZm9yY2VUcmlnZ2VyIHx8IChpc011bHRpU291cmNlID8gbmV3VmFsdWUuc29tZSgodiwgaSkgPT4gaGFzQ2hhbmdlZCh2LCBvbGRWYWx1ZVtpXSkpIDogaGFzQ2hhbmdlZChuZXdWYWx1ZSwgb2xkVmFsdWUpKSB8fCBmYWxzZSkge1xuICAgICAgICBpZiAoY2xlYW51cCkge1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhjYiwgaW5zdGFuY2UsIDMsIFtcbiAgICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgICAvLyBwYXNzIHVuZGVmaW5lZCBhcyB0aGUgb2xkIHZhbHVlIHdoZW4gaXQncyBjaGFuZ2VkIGZvciB0aGUgZmlyc3QgdGltZVxuICAgICAgICAgIG9sZFZhbHVlID09PSBJTklUSUFMX1dBVENIRVJfVkFMVUUgPyB2b2lkIDAgOiBpc011bHRpU291cmNlICYmIG9sZFZhbHVlWzBdID09PSBJTklUSUFMX1dBVENIRVJfVkFMVUUgPyBbXSA6IG9sZFZhbHVlLFxuICAgICAgICAgIG9uQ2xlYW51cFxuICAgICAgICBdKTtcbiAgICAgICAgb2xkVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWZmZWN0LnJ1bigpO1xuICAgIH1cbiAgfTtcbiAgam9iLmFsbG93UmVjdXJzZSA9ICEhY2I7XG4gIGxldCBzY2hlZHVsZXI7XG4gIGlmIChmbHVzaCA9PT0gXCJzeW5jXCIpIHtcbiAgICBzY2hlZHVsZXIgPSBqb2I7XG4gIH0gZWxzZSBpZiAoZmx1c2ggPT09IFwicG9zdFwiKSB7XG4gICAgc2NoZWR1bGVyID0gKCkgPT4gcXVldWVQb3N0UmVuZGVyRWZmZWN0KGpvYiwgaW5zdGFuY2UgJiYgaW5zdGFuY2Uuc3VzcGVuc2UpO1xuICB9IGVsc2Uge1xuICAgIGpvYi5wcmUgPSB0cnVlO1xuICAgIGlmIChpbnN0YW5jZSlcbiAgICAgIGpvYi5pZCA9IGluc3RhbmNlLnVpZDtcbiAgICBzY2hlZHVsZXIgPSAoKSA9PiBxdWV1ZUpvYihqb2IpO1xuICB9XG4gIGNvbnN0IGVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChnZXR0ZXIsIE5PT1AsIHNjaGVkdWxlcik7XG4gIGNvbnN0IHNjb3BlID0gZ2V0Q3VycmVudFNjb3BlKCk7XG4gIGNvbnN0IHVud2F0Y2ggPSAoKSA9PiB7XG4gICAgZWZmZWN0LnN0b3AoKTtcbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgIHJlbW92ZShzY29wZS5lZmZlY3RzLCBlZmZlY3QpO1xuICAgIH1cbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBlZmZlY3Qub25UcmFjayA9IG9uVHJhY2s7XG4gICAgZWZmZWN0Lm9uVHJpZ2dlciA9IG9uVHJpZ2dlcjtcbiAgfVxuICBpZiAoY2IpIHtcbiAgICBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICBqb2IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2xkVmFsdWUgPSBlZmZlY3QucnVuKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGZsdXNoID09PSBcInBvc3RcIikge1xuICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChcbiAgICAgIGVmZmVjdC5ydW4uYmluZChlZmZlY3QpLFxuICAgICAgaW5zdGFuY2UgJiYgaW5zdGFuY2Uuc3VzcGVuc2VcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGVmZmVjdC5ydW4oKTtcbiAgfVxuICBpZiAoc3NyQ2xlYW51cClcbiAgICBzc3JDbGVhbnVwLnB1c2godW53YXRjaCk7XG4gIHJldHVybiB1bndhdGNoO1xufVxuZnVuY3Rpb24gaW5zdGFuY2VXYXRjaChzb3VyY2UsIHZhbHVlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHB1YmxpY1RoaXMgPSB0aGlzLnByb3h5O1xuICBjb25zdCBnZXR0ZXIgPSBpc1N0cmluZyhzb3VyY2UpID8gc291cmNlLmluY2x1ZGVzKFwiLlwiKSA/IGNyZWF0ZVBhdGhHZXR0ZXIocHVibGljVGhpcywgc291cmNlKSA6ICgpID0+IHB1YmxpY1RoaXNbc291cmNlXSA6IHNvdXJjZS5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpO1xuICBsZXQgY2I7XG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIGNiID0gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgY2IgPSB2YWx1ZS5oYW5kbGVyO1xuICAgIG9wdGlvbnMgPSB2YWx1ZTtcbiAgfVxuICBjb25zdCByZXNldCA9IHNldEN1cnJlbnRJbnN0YW5jZSh0aGlzKTtcbiAgY29uc3QgcmVzID0gZG9XYXRjaChnZXR0ZXIsIGNiLmJpbmQocHVibGljVGhpcyksIG9wdGlvbnMpO1xuICByZXNldCgpO1xuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gY3JlYXRlUGF0aEdldHRlcihjdHgsIHBhdGgpIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBsZXQgY3VyID0gY3R4O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoICYmIGN1cjsgaSsrKSB7XG4gICAgICBjdXIgPSBjdXJbc2VnbWVudHNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gY3VyO1xuICB9O1xufVxuZnVuY3Rpb24gdHJhdmVyc2UodmFsdWUsIGRlcHRoLCBjdXJyZW50RGVwdGggPSAwLCBzZWVuKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IHZhbHVlW1wiX192X3NraXBcIl0pIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGRlcHRoICYmIGRlcHRoID4gMCkge1xuICAgIGlmIChjdXJyZW50RGVwdGggPj0gZGVwdGgpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY3VycmVudERlcHRoKys7XG4gIH1cbiAgc2VlbiA9IHNlZW4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgaWYgKHNlZW4uaGFzKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBzZWVuLmFkZCh2YWx1ZSk7XG4gIGlmIChpc1JlZih2YWx1ZSkpIHtcbiAgICB0cmF2ZXJzZSh2YWx1ZS52YWx1ZSwgZGVwdGgsIGN1cnJlbnREZXB0aCwgc2Vlbik7XG4gIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0cmF2ZXJzZSh2YWx1ZVtpXSwgZGVwdGgsIGN1cnJlbnREZXB0aCwgc2Vlbik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU2V0KHZhbHVlKSB8fCBpc01hcCh2YWx1ZSkpIHtcbiAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICB0cmF2ZXJzZSh2LCBkZXB0aCwgY3VycmVudERlcHRoLCBzZWVuKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICB0cmF2ZXJzZSh2YWx1ZVtrZXldLCBkZXB0aCwgY3VycmVudERlcHRoLCBzZWVuKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZURpcmVjdGl2ZU5hbWUobmFtZSkge1xuICBpZiAoaXNCdWlsdEluRGlyZWN0aXZlKG5hbWUpKSB7XG4gICAgd2FybiQxKFwiRG8gbm90IHVzZSBidWlsdC1pbiBkaXJlY3RpdmUgaWRzIGFzIGN1c3RvbSBkaXJlY3RpdmUgaWQ6IFwiICsgbmFtZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdpdGhEaXJlY3RpdmVzKHZub2RlLCBkaXJlY3RpdmVzKSB7XG4gIGlmIChjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgPT09IG51bGwpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShgd2l0aERpcmVjdGl2ZXMgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgcmVuZGVyIGZ1bmN0aW9ucy5gKTtcbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbiAgY29uc3QgaW5zdGFuY2UgPSBnZXRFeHBvc2VQcm94eShjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UpIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5wcm94eTtcbiAgY29uc3QgYmluZGluZ3MgPSB2bm9kZS5kaXJzIHx8ICh2bm9kZS5kaXJzID0gW10pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpcmVjdGl2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgW2RpciwgdmFsdWUsIGFyZywgbW9kaWZpZXJzID0gRU1QVFlfT0JKXSA9IGRpcmVjdGl2ZXNbaV07XG4gICAgaWYgKGRpcikge1xuICAgICAgaWYgKGlzRnVuY3Rpb24oZGlyKSkge1xuICAgICAgICBkaXIgPSB7XG4gICAgICAgICAgbW91bnRlZDogZGlyLFxuICAgICAgICAgIHVwZGF0ZWQ6IGRpclxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGRpci5kZWVwKSB7XG4gICAgICAgIHRyYXZlcnNlKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGJpbmRpbmdzLnB1c2goe1xuICAgICAgICBkaXIsXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgb2xkVmFsdWU6IHZvaWQgMCxcbiAgICAgICAgYXJnLFxuICAgICAgICBtb2RpZmllcnNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdm5vZGU7XG59XG5mdW5jdGlvbiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBwcmV2Vk5vZGUsIGluc3RhbmNlLCBuYW1lKSB7XG4gIGNvbnN0IGJpbmRpbmdzID0gdm5vZGUuZGlycztcbiAgY29uc3Qgb2xkQmluZGluZ3MgPSBwcmV2Vk5vZGUgJiYgcHJldlZOb2RlLmRpcnM7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBiaW5kaW5nID0gYmluZGluZ3NbaV07XG4gICAgaWYgKG9sZEJpbmRpbmdzKSB7XG4gICAgICBiaW5kaW5nLm9sZFZhbHVlID0gb2xkQmluZGluZ3NbaV0udmFsdWU7XG4gICAgfVxuICAgIGxldCBob29rID0gYmluZGluZy5kaXJbbmFtZV07XG4gICAgaWYgKGhvb2spIHtcbiAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGhvb2ssIGluc3RhbmNlLCA4LCBbXG4gICAgICAgIHZub2RlLmVsLFxuICAgICAgICBiaW5kaW5nLFxuICAgICAgICB2bm9kZSxcbiAgICAgICAgcHJldlZOb2RlXG4gICAgICBdKTtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgbGVhdmVDYktleSA9IFN5bWJvbChcIl9sZWF2ZUNiXCIpO1xuY29uc3QgZW50ZXJDYktleSA9IFN5bWJvbChcIl9lbnRlckNiXCIpO1xuZnVuY3Rpb24gdXNlVHJhbnNpdGlvblN0YXRlKCkge1xuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBpc01vdW50ZWQ6IGZhbHNlLFxuICAgIGlzTGVhdmluZzogZmFsc2UsXG4gICAgaXNVbm1vdW50aW5nOiBmYWxzZSxcbiAgICBsZWF2aW5nVk5vZGVzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpXG4gIH07XG4gIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgc3RhdGUuaXNNb3VudGVkID0gdHJ1ZTtcbiAgfSk7XG4gIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gICAgc3RhdGUuaXNVbm1vdW50aW5nID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiBzdGF0ZTtcbn1cbmNvbnN0IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yID0gW0Z1bmN0aW9uLCBBcnJheV07XG5jb25zdCBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyA9IHtcbiAgbW9kZTogU3RyaW5nLFxuICBhcHBlYXI6IEJvb2xlYW4sXG4gIHBlcnNpc3RlZDogQm9vbGVhbixcbiAgLy8gZW50ZXJcbiAgb25CZWZvcmVFbnRlcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uRW50ZXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkFmdGVyRW50ZXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkVudGVyQ2FuY2VsbGVkOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgLy8gbGVhdmVcbiAgb25CZWZvcmVMZWF2ZTogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uTGVhdmU6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkFmdGVyTGVhdmU6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkxlYXZlQ2FuY2VsbGVkOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgLy8gYXBwZWFyXG4gIG9uQmVmb3JlQXBwZWFyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BcHBlYXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkFmdGVyQXBwZWFyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BcHBlYXJDYW5jZWxsZWQ6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yXG59O1xuY29uc3QgQmFzZVRyYW5zaXRpb25JbXBsID0ge1xuICBuYW1lOiBgQmFzZVRyYW5zaXRpb25gLFxuICBwcm9wczogQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMsXG4gIHNldHVwKHByb3BzLCB7IHNsb3RzIH0pIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IHN0YXRlID0gdXNlVHJhbnNpdGlvblN0YXRlKCk7XG4gICAgbGV0IHByZXZUcmFuc2l0aW9uS2V5O1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHNsb3RzLmRlZmF1bHQgJiYgZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKHNsb3RzLmRlZmF1bHQoKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGNoaWxkID0gY2hpbGRyZW5bMF07XG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICBsZXQgaGFzRm91bmQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgaWYgKGMudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaGFzRm91bmQpIHtcbiAgICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICAgIFwiPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudCBvciBjb21wb25lbnQuIFVzZSA8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hpbGQgPSBjO1xuICAgICAgICAgICAgaGFzRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCEhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhd1Byb3BzID0gdG9SYXcocHJvcHMpO1xuICAgICAgY29uc3QgeyBtb2RlIH0gPSByYXdQcm9wcztcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG1vZGUgJiYgbW9kZSAhPT0gXCJpbi1vdXRcIiAmJiBtb2RlICE9PSBcIm91dC1pblwiICYmIG1vZGUgIT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgIHdhcm4kMShgaW52YWxpZCA8dHJhbnNpdGlvbj4gbW9kZTogJHttb2RlfWApO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmlzTGVhdmluZykge1xuICAgICAgICByZXR1cm4gZW1wdHlQbGFjZWhvbGRlcihjaGlsZCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpbm5lckNoaWxkID0gZ2V0S2VlcEFsaXZlQ2hpbGQoY2hpbGQpO1xuICAgICAgaWYgKCFpbm5lckNoaWxkKSB7XG4gICAgICAgIHJldHVybiBlbXB0eVBsYWNlaG9sZGVyKGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVudGVySG9va3MgPSByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICBpbm5lckNoaWxkLFxuICAgICAgICByYXdQcm9wcyxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGluc3RhbmNlXG4gICAgICApO1xuICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKGlubmVyQ2hpbGQsIGVudGVySG9va3MpO1xuICAgICAgY29uc3Qgb2xkQ2hpbGQgPSBpbnN0YW5jZS5zdWJUcmVlO1xuICAgICAgY29uc3Qgb2xkSW5uZXJDaGlsZCA9IG9sZENoaWxkICYmIGdldEtlZXBBbGl2ZUNoaWxkKG9sZENoaWxkKTtcbiAgICAgIGxldCB0cmFuc2l0aW9uS2V5Q2hhbmdlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgeyBnZXRUcmFuc2l0aW9uS2V5IH0gPSBpbm5lckNoaWxkLnR5cGU7XG4gICAgICBpZiAoZ2V0VHJhbnNpdGlvbktleSkge1xuICAgICAgICBjb25zdCBrZXkgPSBnZXRUcmFuc2l0aW9uS2V5KCk7XG4gICAgICAgIGlmIChwcmV2VHJhbnNpdGlvbktleSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgcHJldlRyYW5zaXRpb25LZXkgPSBrZXk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSBwcmV2VHJhbnNpdGlvbktleSkge1xuICAgICAgICAgIHByZXZUcmFuc2l0aW9uS2V5ID0ga2V5O1xuICAgICAgICAgIHRyYW5zaXRpb25LZXlDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9sZElubmVyQ2hpbGQgJiYgb2xkSW5uZXJDaGlsZC50eXBlICE9PSBDb21tZW50ICYmICghaXNTYW1lVk5vZGVUeXBlKGlubmVyQ2hpbGQsIG9sZElubmVyQ2hpbGQpIHx8IHRyYW5zaXRpb25LZXlDaGFuZ2VkKSkge1xuICAgICAgICBjb25zdCBsZWF2aW5nSG9va3MgPSByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgIG9sZElubmVyQ2hpbGQsXG4gICAgICAgICAgcmF3UHJvcHMsXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgKTtcbiAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKG9sZElubmVyQ2hpbGQsIGxlYXZpbmdIb29rcyk7XG4gICAgICAgIGlmIChtb2RlID09PSBcIm91dC1pblwiKSB7XG4gICAgICAgICAgc3RhdGUuaXNMZWF2aW5nID0gdHJ1ZTtcbiAgICAgICAgICBsZWF2aW5nSG9va3MuYWZ0ZXJMZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLmlzTGVhdmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlLnVwZGF0ZS5hY3RpdmUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIGluc3RhbmNlLmVmZmVjdC5kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICAgIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGVtcHR5UGxhY2Vob2xkZXIoY2hpbGQpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiaW4tb3V0XCIgJiYgaW5uZXJDaGlsZC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICAgICAgbGVhdmluZ0hvb2tzLmRlbGF5TGVhdmUgPSAoZWwsIGVhcmx5UmVtb3ZlLCBkZWxheWVkTGVhdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGdldExlYXZpbmdOb2Rlc0ZvclR5cGUoXG4gICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICBvbGRJbm5lckNoaWxkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGVhdmluZ1ZOb2Rlc0NhY2hlW1N0cmluZyhvbGRJbm5lckNoaWxkLmtleSldID0gb2xkSW5uZXJDaGlsZDtcbiAgICAgICAgICAgIGVsW2xlYXZlQ2JLZXldID0gKCkgPT4ge1xuICAgICAgICAgICAgICBlYXJseVJlbW92ZSgpO1xuICAgICAgICAgICAgICBlbFtsZWF2ZUNiS2V5XSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgZGVsZXRlIGVudGVySG9va3MuZGVsYXllZExlYXZlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGVudGVySG9va3MuZGVsYXllZExlYXZlID0gZGVsYXllZExlYXZlO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuICB9XG59O1xuY29uc3QgQmFzZVRyYW5zaXRpb24gPSBCYXNlVHJhbnNpdGlvbkltcGw7XG5mdW5jdGlvbiBnZXRMZWF2aW5nTm9kZXNGb3JUeXBlKHN0YXRlLCB2bm9kZSkge1xuICBjb25zdCB7IGxlYXZpbmdWTm9kZXMgfSA9IHN0YXRlO1xuICBsZXQgbGVhdmluZ1ZOb2Rlc0NhY2hlID0gbGVhdmluZ1ZOb2Rlcy5nZXQodm5vZGUudHlwZSk7XG4gIGlmICghbGVhdmluZ1ZOb2Rlc0NhY2hlKSB7XG4gICAgbGVhdmluZ1ZOb2Rlc0NhY2hlID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGVhdmluZ1ZOb2Rlcy5zZXQodm5vZGUudHlwZSwgbGVhdmluZ1ZOb2Rlc0NhY2hlKTtcbiAgfVxuICByZXR1cm4gbGVhdmluZ1ZOb2Rlc0NhY2hlO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyh2bm9kZSwgcHJvcHMsIHN0YXRlLCBpbnN0YW5jZSkge1xuICBjb25zdCB7XG4gICAgYXBwZWFyLFxuICAgIG1vZGUsXG4gICAgcGVyc2lzdGVkID0gZmFsc2UsXG4gICAgb25CZWZvcmVFbnRlcixcbiAgICBvbkVudGVyLFxuICAgIG9uQWZ0ZXJFbnRlcixcbiAgICBvbkVudGVyQ2FuY2VsbGVkLFxuICAgIG9uQmVmb3JlTGVhdmUsXG4gICAgb25MZWF2ZSxcbiAgICBvbkFmdGVyTGVhdmUsXG4gICAgb25MZWF2ZUNhbmNlbGxlZCxcbiAgICBvbkJlZm9yZUFwcGVhcixcbiAgICBvbkFwcGVhcixcbiAgICBvbkFmdGVyQXBwZWFyLFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qga2V5ID0gU3RyaW5nKHZub2RlLmtleSk7XG4gIGNvbnN0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGdldExlYXZpbmdOb2Rlc0ZvclR5cGUoc3RhdGUsIHZub2RlKTtcbiAgY29uc3QgY2FsbEhvb2sgPSAoaG9vaywgYXJncykgPT4ge1xuICAgIGhvb2sgJiYgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBob29rLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA5LFxuICAgICAgYXJnc1xuICAgICk7XG4gIH07XG4gIGNvbnN0IGNhbGxBc3luY0hvb2sgPSAoaG9vaywgYXJncykgPT4ge1xuICAgIGNvbnN0IGRvbmUgPSBhcmdzWzFdO1xuICAgIGNhbGxIb29rKGhvb2ssIGFyZ3MpO1xuICAgIGlmIChpc0FycmF5KGhvb2spKSB7XG4gICAgICBpZiAoaG9vay5ldmVyeSgoaG9vazIpID0+IGhvb2syLmxlbmd0aCA8PSAxKSlcbiAgICAgICAgZG9uZSgpO1xuICAgIH0gZWxzZSBpZiAoaG9vay5sZW5ndGggPD0gMSkge1xuICAgICAgZG9uZSgpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaG9va3MgPSB7XG4gICAgbW9kZSxcbiAgICBwZXJzaXN0ZWQsXG4gICAgYmVmb3JlRW50ZXIoZWwpIHtcbiAgICAgIGxldCBob29rID0gb25CZWZvcmVFbnRlcjtcbiAgICAgIGlmICghc3RhdGUuaXNNb3VudGVkKSB7XG4gICAgICAgIGlmIChhcHBlYXIpIHtcbiAgICAgICAgICBob29rID0gb25CZWZvcmVBcHBlYXIgfHwgb25CZWZvcmVFbnRlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlbFtsZWF2ZUNiS2V5XSkge1xuICAgICAgICBlbFtsZWF2ZUNiS2V5XShcbiAgICAgICAgICB0cnVlXG4gICAgICAgICAgLyogY2FuY2VsbGVkICovXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBsZWF2aW5nVk5vZGUgPSBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5XTtcbiAgICAgIGlmIChsZWF2aW5nVk5vZGUgJiYgaXNTYW1lVk5vZGVUeXBlKHZub2RlLCBsZWF2aW5nVk5vZGUpICYmIGxlYXZpbmdWTm9kZS5lbFtsZWF2ZUNiS2V5XSkge1xuICAgICAgICBsZWF2aW5nVk5vZGUuZWxbbGVhdmVDYktleV0oKTtcbiAgICAgIH1cbiAgICAgIGNhbGxIb29rKGhvb2ssIFtlbF0pO1xuICAgIH0sXG4gICAgZW50ZXIoZWwpIHtcbiAgICAgIGxldCBob29rID0gb25FbnRlcjtcbiAgICAgIGxldCBhZnRlckhvb2sgPSBvbkFmdGVyRW50ZXI7XG4gICAgICBsZXQgY2FuY2VsSG9vayA9IG9uRW50ZXJDYW5jZWxsZWQ7XG4gICAgICBpZiAoIXN0YXRlLmlzTW91bnRlZCkge1xuICAgICAgICBpZiAoYXBwZWFyKSB7XG4gICAgICAgICAgaG9vayA9IG9uQXBwZWFyIHx8IG9uRW50ZXI7XG4gICAgICAgICAgYWZ0ZXJIb29rID0gb25BZnRlckFwcGVhciB8fCBvbkFmdGVyRW50ZXI7XG4gICAgICAgICAgY2FuY2VsSG9vayA9IG9uQXBwZWFyQ2FuY2VsbGVkIHx8IG9uRW50ZXJDYW5jZWxsZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBkb25lID0gZWxbZW50ZXJDYktleV0gPSAoY2FuY2VsbGVkKSA9PiB7XG4gICAgICAgIGlmIChjYWxsZWQpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgY2FsbEhvb2soY2FuY2VsSG9vaywgW2VsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbEhvb2soYWZ0ZXJIb29rLCBbZWxdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaG9va3MuZGVsYXllZExlYXZlKSB7XG4gICAgICAgICAgaG9va3MuZGVsYXllZExlYXZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxbZW50ZXJDYktleV0gPSB2b2lkIDA7XG4gICAgICB9O1xuICAgICAgaWYgKGhvb2spIHtcbiAgICAgICAgY2FsbEFzeW5jSG9vayhob29rLCBbZWwsIGRvbmVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGxlYXZlKGVsLCByZW1vdmUpIHtcbiAgICAgIGNvbnN0IGtleTIgPSBTdHJpbmcodm5vZGUua2V5KTtcbiAgICAgIGlmIChlbFtlbnRlckNiS2V5XSkge1xuICAgICAgICBlbFtlbnRlckNiS2V5XShcbiAgICAgICAgICB0cnVlXG4gICAgICAgICAgLyogY2FuY2VsbGVkICovXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaXNVbm1vdW50aW5nKSB7XG4gICAgICAgIHJldHVybiByZW1vdmUoKTtcbiAgICAgIH1cbiAgICAgIGNhbGxIb29rKG9uQmVmb3JlTGVhdmUsIFtlbF0pO1xuICAgICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgZG9uZSA9IGVsW2xlYXZlQ2JLZXldID0gKGNhbmNlbGxlZCkgPT4ge1xuICAgICAgICBpZiAoY2FsbGVkKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgcmVtb3ZlKCk7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICBjYWxsSG9vayhvbkxlYXZlQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsSG9vayhvbkFmdGVyTGVhdmUsIFtlbF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsW2xlYXZlQ2JLZXldID0gdm9pZCAwO1xuICAgICAgICBpZiAobGVhdmluZ1ZOb2Rlc0NhY2hlW2tleTJdID09PSB2bm9kZSkge1xuICAgICAgICAgIGRlbGV0ZSBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5Ml07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5Ml0gPSB2bm9kZTtcbiAgICAgIGlmIChvbkxlYXZlKSB7XG4gICAgICAgIGNhbGxBc3luY0hvb2sob25MZWF2ZSwgW2VsLCBkb25lXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBjbG9uZSh2bm9kZTIpIHtcbiAgICAgIHJldHVybiByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKHZub2RlMiwgcHJvcHMsIHN0YXRlLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaG9va3M7XG59XG5mdW5jdGlvbiBlbXB0eVBsYWNlaG9sZGVyKHZub2RlKSB7XG4gIGlmIChpc0tlZXBBbGl2ZSh2bm9kZSkpIHtcbiAgICB2bm9kZSA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgIHZub2RlLmNoaWxkcmVuID0gbnVsbDtcbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEtlZXBBbGl2ZUNoaWxkKHZub2RlKSB7XG4gIHJldHVybiBpc0tlZXBBbGl2ZSh2bm9kZSkgPyAoXG4gICAgLy8gIzcxMjEgZW5zdXJlIGdldCB0aGUgY2hpbGQgY29tcG9uZW50IHN1YnRyZWUgaW4gY2FzZVxuICAgIC8vIGl0J3MgYmVlbiByZXBsYWNlZCBkdXJpbmcgSE1SXG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB2bm9kZS5jb21wb25lbnQgPyB2bm9kZS5jb21wb25lbnQuc3ViVHJlZSA6IHZub2RlLmNoaWxkcmVuID8gdm5vZGUuY2hpbGRyZW5bMF0gOiB2b2lkIDBcbiAgKSA6IHZub2RlO1xufVxuZnVuY3Rpb24gc2V0VHJhbnNpdGlvbkhvb2tzKHZub2RlLCBob29rcykge1xuICBpZiAodm5vZGUuc2hhcGVGbGFnICYgNiAmJiB2bm9kZS5jb21wb25lbnQpIHtcbiAgICBzZXRUcmFuc2l0aW9uSG9va3Modm5vZGUuY29tcG9uZW50LnN1YlRyZWUsIGhvb2tzKTtcbiAgfSBlbHNlIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICB2bm9kZS5zc0NvbnRlbnQudHJhbnNpdGlvbiA9IGhvb2tzLmNsb25lKHZub2RlLnNzQ29udGVudCk7XG4gICAgdm5vZGUuc3NGYWxsYmFjay50cmFuc2l0aW9uID0gaG9va3MuY2xvbmUodm5vZGUuc3NGYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgdm5vZGUudHJhbnNpdGlvbiA9IGhvb2tzO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4oY2hpbGRyZW4sIGtlZXBDb21tZW50ID0gZmFsc2UsIHBhcmVudEtleSkge1xuICBsZXQgcmV0ID0gW107XG4gIGxldCBrZXllZEZyYWdtZW50Q291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgY29uc3Qga2V5ID0gcGFyZW50S2V5ID09IG51bGwgPyBjaGlsZC5rZXkgOiBTdHJpbmcocGFyZW50S2V5KSArIFN0cmluZyhjaGlsZC5rZXkgIT0gbnVsbCA/IGNoaWxkLmtleSA6IGkpO1xuICAgIGlmIChjaGlsZC50eXBlID09PSBGcmFnbWVudCkge1xuICAgICAgaWYgKGNoaWxkLnBhdGNoRmxhZyAmIDEyOClcbiAgICAgICAga2V5ZWRGcmFnbWVudENvdW50Kys7XG4gICAgICByZXQgPSByZXQuY29uY2F0KFxuICAgICAgICBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4oY2hpbGQuY2hpbGRyZW4sIGtlZXBDb21tZW50LCBrZXkpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoa2VlcENvbW1lbnQgfHwgY2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgcmV0LnB1c2goa2V5ICE9IG51bGwgPyBjbG9uZVZOb2RlKGNoaWxkLCB7IGtleSB9KSA6IGNoaWxkKTtcbiAgICB9XG4gIH1cbiAgaWYgKGtleWVkRnJhZ21lbnRDb3VudCA+IDEpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJldC5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0W2ldLnBhdGNoRmxhZyA9IC0yO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKiEgI19fTk9fU0lERV9FRkZFQ1RTX18gKi9cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBkZWZpbmVDb21wb25lbnQob3B0aW9ucywgZXh0cmFPcHRpb25zKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKG9wdGlvbnMpID8gKFxuICAgIC8vICM4MzI2OiBleHRlbmQgY2FsbCBhbmQgb3B0aW9ucy5uYW1lIGFjY2VzcyBhcmUgY29uc2lkZXJlZCBzaWRlLWVmZmVjdHNcbiAgICAvLyBieSBSb2xsdXAsIHNvIHdlIGhhdmUgdG8gd3JhcCBpdCBpbiBhIHB1cmUtYW5ub3RhdGVkIElJRkUuXG4gICAgLyogQF9fUFVSRV9fICovICgoKSA9PiBleHRlbmQoeyBuYW1lOiBvcHRpb25zLm5hbWUgfSwgZXh0cmFPcHRpb25zLCB7IHNldHVwOiBvcHRpb25zIH0pKSgpXG4gICkgOiBvcHRpb25zO1xufVxuXG5jb25zdCBpc0FzeW5jV3JhcHBlciA9IChpKSA9PiAhIWkudHlwZS5fX2FzeW5jTG9hZGVyO1xuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gZGVmaW5lQXN5bmNDb21wb25lbnQoc291cmNlKSB7XG4gIGlmIChpc0Z1bmN0aW9uKHNvdXJjZSkpIHtcbiAgICBzb3VyY2UgPSB7IGxvYWRlcjogc291cmNlIH07XG4gIH1cbiAgY29uc3Qge1xuICAgIGxvYWRlcixcbiAgICBsb2FkaW5nQ29tcG9uZW50LFxuICAgIGVycm9yQ29tcG9uZW50LFxuICAgIGRlbGF5ID0gMjAwLFxuICAgIHRpbWVvdXQsXG4gICAgLy8gdW5kZWZpbmVkID0gbmV2ZXIgdGltZXMgb3V0XG4gICAgc3VzcGVuc2libGUgPSB0cnVlLFxuICAgIG9uRXJyb3I6IHVzZXJPbkVycm9yXG4gIH0gPSBzb3VyY2U7XG4gIGxldCBwZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gIGxldCByZXNvbHZlZENvbXA7XG4gIGxldCByZXRyaWVzID0gMDtcbiAgY29uc3QgcmV0cnkgPSAoKSA9PiB7XG4gICAgcmV0cmllcysrO1xuICAgIHBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICByZXR1cm4gbG9hZCgpO1xuICB9O1xuICBjb25zdCBsb2FkID0gKCkgPT4ge1xuICAgIGxldCB0aGlzUmVxdWVzdDtcbiAgICByZXR1cm4gcGVuZGluZ1JlcXVlc3QgfHwgKHRoaXNSZXF1ZXN0ID0gcGVuZGluZ1JlcXVlc3QgPSBsb2FkZXIoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBlcnIgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyKSk7XG4gICAgICBpZiAodXNlck9uRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCB1c2VyUmV0cnkgPSAoKSA9PiByZXNvbHZlKHJldHJ5KCkpO1xuICAgICAgICAgIGNvbnN0IHVzZXJGYWlsID0gKCkgPT4gcmVqZWN0KGVycik7XG4gICAgICAgICAgdXNlck9uRXJyb3IoZXJyLCB1c2VyUmV0cnksIHVzZXJGYWlsLCByZXRyaWVzICsgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0pLnRoZW4oKGNvbXApID0+IHtcbiAgICAgIGlmICh0aGlzUmVxdWVzdCAhPT0gcGVuZGluZ1JlcXVlc3QgJiYgcGVuZGluZ1JlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZXF1ZXN0O1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWNvbXApIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBBc3luYyBjb21wb25lbnQgbG9hZGVyIHJlc29sdmVkIHRvIHVuZGVmaW5lZC4gSWYgeW91IGFyZSB1c2luZyByZXRyeSgpLCBtYWtlIHN1cmUgdG8gcmV0dXJuIGl0cyByZXR1cm4gdmFsdWUuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGNvbXAgJiYgKGNvbXAuX19lc01vZHVsZSB8fCBjb21wW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09IFwiTW9kdWxlXCIpKSB7XG4gICAgICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjb21wICYmICFpc09iamVjdChjb21wKSAmJiAhaXNGdW5jdGlvbihjb21wKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXN5bmMgY29tcG9uZW50IGxvYWQgcmVzdWx0OiAke2NvbXB9YCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlZENvbXAgPSBjb21wO1xuICAgICAgcmV0dXJuIGNvbXA7XG4gICAgfSkpO1xuICB9O1xuICByZXR1cm4gZGVmaW5lQ29tcG9uZW50KHtcbiAgICBuYW1lOiBcIkFzeW5jQ29tcG9uZW50V3JhcHBlclwiLFxuICAgIF9fYXN5bmNMb2FkZXI6IGxvYWQsXG4gICAgZ2V0IF9fYXN5bmNSZXNvbHZlZCgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZENvbXA7XG4gICAgfSxcbiAgICBzZXR1cCgpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gY3VycmVudEluc3RhbmNlO1xuICAgICAgaWYgKHJlc29sdmVkQ29tcCkge1xuICAgICAgICByZXR1cm4gKCkgPT4gY3JlYXRlSW5uZXJDb21wKHJlc29sdmVkQ29tcCwgaW5zdGFuY2UpO1xuICAgICAgfVxuICAgICAgY29uc3Qgb25FcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgcGVuZGluZ1JlcXVlc3QgPSBudWxsO1xuICAgICAgICBoYW5kbGVFcnJvcihcbiAgICAgICAgICBlcnIsXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgMTMsXG4gICAgICAgICAgIWVycm9yQ29tcG9uZW50XG4gICAgICAgICk7XG4gICAgICB9O1xuICAgICAgaWYgKHN1c3BlbnNpYmxlICYmIGluc3RhbmNlLnN1c3BlbnNlIHx8IGlzSW5TU1JDb21wb25lbnRTZXR1cCkge1xuICAgICAgICByZXR1cm4gbG9hZCgpLnRoZW4oKGNvbXApID0+IHtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gY3JlYXRlSW5uZXJDb21wKGNvbXAsIGluc3RhbmNlKTtcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gZXJyb3JDb21wb25lbnQgPyBjcmVhdGVWTm9kZShlcnJvckNvbXBvbmVudCwge1xuICAgICAgICAgICAgZXJyb3I6IGVyclxuICAgICAgICAgIH0pIDogbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBsb2FkZWQgPSByZWYoZmFsc2UpO1xuICAgICAgY29uc3QgZXJyb3IgPSByZWYoKTtcbiAgICAgIGNvbnN0IGRlbGF5ZWQgPSByZWYoISFkZWxheSk7XG4gICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgZGVsYXllZC52YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgICB9XG4gICAgICBpZiAodGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICghbG9hZGVkLnZhbHVlICYmICFlcnJvci52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQXN5bmMgY29tcG9uZW50IHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9bXMuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgICAgICAgIGVycm9yLnZhbHVlID0gZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICB9XG4gICAgICBsb2FkKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGxvYWRlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgIGlmIChpbnN0YW5jZS5wYXJlbnQgJiYgaXNLZWVwQWxpdmUoaW5zdGFuY2UucGFyZW50LnZub2RlKSkge1xuICAgICAgICAgIGluc3RhbmNlLnBhcmVudC5lZmZlY3QuZGlydHkgPSB0cnVlO1xuICAgICAgICAgIHF1ZXVlSm9iKGluc3RhbmNlLnBhcmVudC51cGRhdGUpO1xuICAgICAgICB9XG4gICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgICAgZXJyb3IudmFsdWUgPSBlcnI7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChsb2FkZWQudmFsdWUgJiYgcmVzb2x2ZWRDb21wKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUlubmVyQ29tcChyZXNvbHZlZENvbXAsIGluc3RhbmNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvci52YWx1ZSAmJiBlcnJvckNvbXBvbmVudCkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVWTm9kZShlcnJvckNvbXBvbmVudCwge1xuICAgICAgICAgICAgZXJyb3I6IGVycm9yLnZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAobG9hZGluZ0NvbXBvbmVudCAmJiAhZGVsYXllZC52YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVWTm9kZShsb2FkaW5nQ29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlSW5uZXJDb21wKGNvbXAsIHBhcmVudCkge1xuICBjb25zdCB7IHJlZjogcmVmMiwgcHJvcHMsIGNoaWxkcmVuLCBjZSB9ID0gcGFyZW50LnZub2RlO1xuICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKGNvbXAsIHByb3BzLCBjaGlsZHJlbik7XG4gIHZub2RlLnJlZiA9IHJlZjI7XG4gIHZub2RlLmNlID0gY2U7XG4gIGRlbGV0ZSBwYXJlbnQudm5vZGUuY2U7XG4gIHJldHVybiB2bm9kZTtcbn1cblxuY29uc3QgaXNLZWVwQWxpdmUgPSAodm5vZGUpID0+IHZub2RlLnR5cGUuX19pc0tlZXBBbGl2ZTtcbmNvbnN0IEtlZXBBbGl2ZUltcGwgPSB7XG4gIG5hbWU6IGBLZWVwQWxpdmVgLFxuICAvLyBNYXJrZXIgZm9yIHNwZWNpYWwgaGFuZGxpbmcgaW5zaWRlIHRoZSByZW5kZXJlci4gV2UgYXJlIG5vdCB1c2luZyBhID09PVxuICAvLyBjaGVjayBkaXJlY3RseSBvbiBLZWVwQWxpdmUgaW4gdGhlIHJlbmRlcmVyLCBiZWNhdXNlIGltcG9ydGluZyBpdCBkaXJlY3RseVxuICAvLyB3b3VsZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgdHJlZS1zaGFrZW4uXG4gIF9faXNLZWVwQWxpdmU6IHRydWUsXG4gIHByb3BzOiB7XG4gICAgaW5jbHVkZTogW1N0cmluZywgUmVnRXhwLCBBcnJheV0sXG4gICAgZXhjbHVkZTogW1N0cmluZywgUmVnRXhwLCBBcnJheV0sXG4gICAgbWF4OiBbU3RyaW5nLCBOdW1iZXJdXG4gIH0sXG4gIHNldHVwKHByb3BzLCB7IHNsb3RzIH0pIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IHNoYXJlZENvbnRleHQgPSBpbnN0YW5jZS5jdHg7XG4gICAgaWYgKCFzaGFyZWRDb250ZXh0LnJlbmRlcmVyKSB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHNsb3RzLmRlZmF1bHQgJiYgc2xvdHMuZGVmYXVsdCgpO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID09PSAxID8gY2hpbGRyZW5bMF0gOiBjaGlsZHJlbjtcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICBjb25zdCBrZXlzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICBsZXQgY3VycmVudCA9IG51bGw7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBpbnN0YW5jZS5fX3ZfY2FjaGUgPSBjYWNoZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50U3VzcGVuc2UgPSBpbnN0YW5jZS5zdXNwZW5zZTtcbiAgICBjb25zdCB7XG4gICAgICByZW5kZXJlcjoge1xuICAgICAgICBwOiBwYXRjaCxcbiAgICAgICAgbTogbW92ZSxcbiAgICAgICAgdW06IF91bm1vdW50LFxuICAgICAgICBvOiB7IGNyZWF0ZUVsZW1lbnQgfVxuICAgICAgfVxuICAgIH0gPSBzaGFyZWRDb250ZXh0O1xuICAgIGNvbnN0IHN0b3JhZ2VDb250YWluZXIgPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHNoYXJlZENvbnRleHQuYWN0aXZhdGUgPSAodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBuYW1lc3BhY2UsIG9wdGltaXplZCkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UyID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgbW92ZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIDAsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIHBhdGNoKFxuICAgICAgICBpbnN0YW5jZTIudm5vZGUsXG4gICAgICAgIHZub2RlLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgaW5zdGFuY2UyLFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICB2bm9kZS5zbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGluc3RhbmNlMi5pc0RlYWN0aXZhdGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChpbnN0YW5jZTIuYSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGluc3RhbmNlMi5hKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2bm9kZUhvb2sgPSB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy5vblZub2RlTW91bnRlZDtcbiAgICAgICAgaWYgKHZub2RlSG9vaykge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIGluc3RhbmNlMi5wYXJlbnQsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UyKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHNoYXJlZENvbnRleHQuZGVhY3RpdmF0ZSA9ICh2bm9kZSkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UyID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgbW92ZSh2bm9kZSwgc3RvcmFnZUNvbnRhaW5lciwgbnVsbCwgMSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGluc3RhbmNlMi5kYSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGluc3RhbmNlMi5kYSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgdm5vZGVIb29rID0gdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMub25Wbm9kZVVubW91bnRlZDtcbiAgICAgICAgaWYgKHZub2RlSG9vaykge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIGluc3RhbmNlMi5wYXJlbnQsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZTIuaXNEZWFjdGl2YXRlZCA9IHRydWU7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgZGV2dG9vbHNDb21wb25lbnRBZGRlZChpbnN0YW5jZTIpO1xuICAgICAgfVxuICAgIH07XG4gICAgZnVuY3Rpb24gdW5tb3VudCh2bm9kZSkge1xuICAgICAgcmVzZXRTaGFwZUZsYWcodm5vZGUpO1xuICAgICAgX3VubW91bnQodm5vZGUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBydW5lQ2FjaGUoZmlsdGVyKSB7XG4gICAgICBjYWNoZS5mb3JFYWNoKCh2bm9kZSwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBnZXRDb21wb25lbnROYW1lKHZub2RlLnR5cGUpO1xuICAgICAgICBpZiAobmFtZSAmJiAoIWZpbHRlciB8fCAhZmlsdGVyKG5hbWUpKSkge1xuICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShrZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJ1bmVDYWNoZUVudHJ5KGtleSkge1xuICAgICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGtleSk7XG4gICAgICBpZiAoIWN1cnJlbnQgfHwgIWlzU2FtZVZOb2RlVHlwZShjYWNoZWQsIGN1cnJlbnQpKSB7XG4gICAgICAgIHVubW91bnQoY2FjaGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudCkge1xuICAgICAgICByZXNldFNoYXBlRmxhZyhjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAga2V5cy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgd2F0Y2goXG4gICAgICAoKSA9PiBbcHJvcHMuaW5jbHVkZSwgcHJvcHMuZXhjbHVkZV0sXG4gICAgICAoW2luY2x1ZGUsIGV4Y2x1ZGVdKSA9PiB7XG4gICAgICAgIGluY2x1ZGUgJiYgcHJ1bmVDYWNoZSgobmFtZSkgPT4gbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSk7XG4gICAgICAgIGV4Y2x1ZGUgJiYgcHJ1bmVDYWNoZSgobmFtZSkgPT4gIW1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpO1xuICAgICAgfSxcbiAgICAgIC8vIHBydW5lIHBvc3QtcmVuZGVyIGFmdGVyIGBjdXJyZW50YCBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICB7IGZsdXNoOiBcInBvc3RcIiwgZGVlcDogdHJ1ZSB9XG4gICAgKTtcbiAgICBsZXQgcGVuZGluZ0NhY2hlS2V5ID0gbnVsbDtcbiAgICBjb25zdCBjYWNoZVN1YnRyZWUgPSAoKSA9PiB7XG4gICAgICBpZiAocGVuZGluZ0NhY2hlS2V5ICE9IG51bGwpIHtcbiAgICAgICAgY2FjaGUuc2V0KHBlbmRpbmdDYWNoZUtleSwgZ2V0SW5uZXJDaGlsZChpbnN0YW5jZS5zdWJUcmVlKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBvbk1vdW50ZWQoY2FjaGVTdWJ0cmVlKTtcbiAgICBvblVwZGF0ZWQoY2FjaGVTdWJ0cmVlKTtcbiAgICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgICAgY2FjaGUuZm9yRWFjaCgoY2FjaGVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3ViVHJlZSwgc3VzcGVuc2UgfSA9IGluc3RhbmNlO1xuICAgICAgICBjb25zdCB2bm9kZSA9IGdldElubmVyQ2hpbGQoc3ViVHJlZSk7XG4gICAgICAgIGlmIChjYWNoZWQudHlwZSA9PT0gdm5vZGUudHlwZSAmJiBjYWNoZWQua2V5ID09PSB2bm9kZS5rZXkpIHtcbiAgICAgICAgICByZXNldFNoYXBlRmxhZyh2bm9kZSk7XG4gICAgICAgICAgY29uc3QgZGEgPSB2bm9kZS5jb21wb25lbnQuZGE7XG4gICAgICAgICAgZGEgJiYgcXVldWVQb3N0UmVuZGVyRWZmZWN0KGRhLCBzdXNwZW5zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHVubW91bnQoY2FjaGVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBwZW5kaW5nQ2FjaGVLZXkgPSBudWxsO1xuICAgICAgaWYgKCFzbG90cy5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0KCk7XG4gICAgICBjb25zdCByYXdWTm9kZSA9IGNoaWxkcmVuWzBdO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoYEtlZXBBbGl2ZSBzaG91bGQgY29udGFpbiBleGFjdGx5IG9uZSBjb21wb25lbnQgY2hpbGQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IG51bGw7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgIH0gZWxzZSBpZiAoIWlzVk5vZGUocmF3Vk5vZGUpIHx8ICEocmF3Vk5vZGUuc2hhcGVGbGFnICYgNCkgJiYgIShyYXdWTm9kZS5zaGFwZUZsYWcgJiAxMjgpKSB7XG4gICAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgICByZXR1cm4gcmF3Vk5vZGU7XG4gICAgICB9XG4gICAgICBsZXQgdm5vZGUgPSBnZXRJbm5lckNoaWxkKHJhd1ZOb2RlKTtcbiAgICAgIGNvbnN0IGNvbXAgPSB2bm9kZS50eXBlO1xuICAgICAgY29uc3QgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoXG4gICAgICAgIGlzQXN5bmNXcmFwcGVyKHZub2RlKSA/IHZub2RlLnR5cGUuX19hc3luY1Jlc29sdmVkIHx8IHt9IDogY29tcFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgaW5jbHVkZSwgZXhjbHVkZSwgbWF4IH0gPSBwcm9wcztcbiAgICAgIGlmIChpbmNsdWRlICYmICghbmFtZSB8fCAhbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSkgfHwgZXhjbHVkZSAmJiBuYW1lICYmIG1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpIHtcbiAgICAgICAgY3VycmVudCA9IHZub2RlO1xuICAgICAgICByZXR1cm4gcmF3Vk5vZGU7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSB2bm9kZS5rZXkgPT0gbnVsbCA/IGNvbXAgOiB2bm9kZS5rZXk7XG4gICAgICBjb25zdCBjYWNoZWRWTm9kZSA9IGNhY2hlLmdldChrZXkpO1xuICAgICAgaWYgKHZub2RlLmVsKSB7XG4gICAgICAgIHZub2RlID0gY2xvbmVWTm9kZSh2bm9kZSk7XG4gICAgICAgIGlmIChyYXdWTm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgICAgICByYXdWTm9kZS5zc0NvbnRlbnQgPSB2bm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGVuZGluZ0NhY2hlS2V5ID0ga2V5O1xuICAgICAgaWYgKGNhY2hlZFZOb2RlKSB7XG4gICAgICAgIHZub2RlLmVsID0gY2FjaGVkVk5vZGUuZWw7XG4gICAgICAgIHZub2RlLmNvbXBvbmVudCA9IGNhY2hlZFZOb2RlLmNvbXBvbmVudDtcbiAgICAgICAgaWYgKHZub2RlLnRyYW5zaXRpb24pIHtcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uSG9va3Modm5vZGUsIHZub2RlLnRyYW5zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHZub2RlLnNoYXBlRmxhZyB8PSA1MTI7XG4gICAgICAgIGtleXMuZGVsZXRlKGtleSk7XG4gICAgICAgIGtleXMuYWRkKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzLmFkZChrZXkpO1xuICAgICAgICBpZiAobWF4ICYmIGtleXMuc2l6ZSA+IHBhcnNlSW50KG1heCwgMTApKSB7XG4gICAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGtleXMudmFsdWVzKCkubmV4dCgpLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdm5vZGUuc2hhcGVGbGFnIHw9IDI1NjtcbiAgICAgIGN1cnJlbnQgPSB2bm9kZTtcbiAgICAgIHJldHVybiBpc1N1c3BlbnNlKHJhd1ZOb2RlLnR5cGUpID8gcmF3Vk5vZGUgOiB2bm9kZTtcbiAgICB9O1xuICB9XG59O1xuY29uc3QgS2VlcEFsaXZlID0gS2VlcEFsaXZlSW1wbDtcbmZ1bmN0aW9uIG1hdGNoZXMocGF0dGVybiwgbmFtZSkge1xuICBpZiAoaXNBcnJheShwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnNvbWUoKHApID0+IG1hdGNoZXMocCwgbmFtZSkpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nKHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoXCIsXCIpLmluY2x1ZGVzKG5hbWUpO1xuICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4udGVzdChuYW1lKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBvbkFjdGl2YXRlZChob29rLCB0YXJnZXQpIHtcbiAgcmVnaXN0ZXJLZWVwQWxpdmVIb29rKGhvb2ssIFwiYVwiLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gb25EZWFjdGl2YXRlZChob29rLCB0YXJnZXQpIHtcbiAgcmVnaXN0ZXJLZWVwQWxpdmVIb29rKGhvb2ssIFwiZGFcIiwgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyS2VlcEFsaXZlSG9vayhob29rLCB0eXBlLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UpIHtcbiAgY29uc3Qgd3JhcHBlZEhvb2sgPSBob29rLl9fd2RjIHx8IChob29rLl9fd2RjID0gKCkgPT4ge1xuICAgIGxldCBjdXJyZW50ID0gdGFyZ2V0O1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBpZiAoY3VycmVudC5pc0RlYWN0aXZhdGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIGhvb2soKTtcbiAgfSk7XG4gIGluamVjdEhvb2sodHlwZSwgd3JhcHBlZEhvb2ssIHRhcmdldCk7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBsZXQgY3VycmVudCA9IHRhcmdldC5wYXJlbnQ7XG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudC5wYXJlbnQpIHtcbiAgICAgIGlmIChpc0tlZXBBbGl2ZShjdXJyZW50LnBhcmVudC52bm9kZSkpIHtcbiAgICAgICAgaW5qZWN0VG9LZWVwQWxpdmVSb290KHdyYXBwZWRIb29rLCB0eXBlLCB0YXJnZXQsIGN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gaW5qZWN0VG9LZWVwQWxpdmVSb290KGhvb2ssIHR5cGUsIHRhcmdldCwga2VlcEFsaXZlUm9vdCkge1xuICBjb25zdCBpbmplY3RlZCA9IGluamVjdEhvb2soXG4gICAgdHlwZSxcbiAgICBob29rLFxuICAgIGtlZXBBbGl2ZVJvb3QsXG4gICAgdHJ1ZVxuICAgIC8qIHByZXBlbmQgKi9cbiAgKTtcbiAgb25Vbm1vdW50ZWQoKCkgPT4ge1xuICAgIHJlbW92ZShrZWVwQWxpdmVSb290W3R5cGVdLCBpbmplY3RlZCk7XG4gIH0sIHRhcmdldCk7XG59XG5mdW5jdGlvbiByZXNldFNoYXBlRmxhZyh2bm9kZSkge1xuICB2bm9kZS5zaGFwZUZsYWcgJj0gfjI1NjtcbiAgdm5vZGUuc2hhcGVGbGFnICY9IH41MTI7XG59XG5mdW5jdGlvbiBnZXRJbm5lckNoaWxkKHZub2RlKSB7XG4gIHJldHVybiB2bm9kZS5zaGFwZUZsYWcgJiAxMjggPyB2bm9kZS5zc0NvbnRlbnQgOiB2bm9kZTtcbn1cblxuZnVuY3Rpb24gaW5qZWN0SG9vayh0eXBlLCBob29rLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UsIHByZXBlbmQgPSBmYWxzZSkge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgY29uc3QgaG9va3MgPSB0YXJnZXRbdHlwZV0gfHwgKHRhcmdldFt0eXBlXSA9IFtdKTtcbiAgICBjb25zdCB3cmFwcGVkSG9vayA9IGhvb2suX193ZWggfHwgKGhvb2suX193ZWggPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKHRhcmdldC5pc1VubW91bnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBjb25zdCByZXNldCA9IHNldEN1cnJlbnRJbnN0YW5jZSh0YXJnZXQpO1xuICAgICAgY29uc3QgcmVzID0gY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoaG9vaywgdGFyZ2V0LCB0eXBlLCBhcmdzKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICAgIGlmIChwcmVwZW5kKSB7XG4gICAgICBob29rcy51bnNoaWZ0KHdyYXBwZWRIb29rKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va3MucHVzaCh3cmFwcGVkSG9vayk7XG4gICAgfVxuICAgIHJldHVybiB3cmFwcGVkSG9vaztcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgYXBpTmFtZSA9IHRvSGFuZGxlcktleShFcnJvclR5cGVTdHJpbmdzJDFbdHlwZV0ucmVwbGFjZSgvIGhvb2skLywgXCJcIikpO1xuICAgIHdhcm4kMShcbiAgICAgIGAke2FwaU5hbWV9IGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYmUgYXNzb2NpYXRlZCB3aXRoLiBMaWZlY3ljbGUgaW5qZWN0aW9uIEFQSXMgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgZXhlY3V0aW9uIG9mIHNldHVwKCkuYCArIChgIElmIHlvdSBhcmUgdXNpbmcgYXN5bmMgc2V0dXAoKSwgbWFrZSBzdXJlIHRvIHJlZ2lzdGVyIGxpZmVjeWNsZSBob29rcyBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0IHN0YXRlbWVudC5gIClcbiAgICApO1xuICB9XG59XG5jb25zdCBjcmVhdGVIb29rID0gKGxpZmVjeWNsZSkgPT4gKGhvb2ssIHRhcmdldCA9IGN1cnJlbnRJbnN0YW5jZSkgPT4gKFxuICAvLyBwb3N0LWNyZWF0ZSBsaWZlY3ljbGUgcmVnaXN0cmF0aW9ucyBhcmUgbm9vcHMgZHVyaW5nIFNTUiAoZXhjZXB0IGZvciBzZXJ2ZXJQcmVmZXRjaClcbiAgKCFpc0luU1NSQ29tcG9uZW50U2V0dXAgfHwgbGlmZWN5Y2xlID09PSBcInNwXCIpICYmIGluamVjdEhvb2sobGlmZWN5Y2xlLCAoLi4uYXJncykgPT4gaG9vayguLi5hcmdzKSwgdGFyZ2V0KVxuKTtcbmNvbnN0IG9uQmVmb3JlTW91bnQgPSBjcmVhdGVIb29rKFwiYm1cIik7XG5jb25zdCBvbk1vdW50ZWQgPSBjcmVhdGVIb29rKFwibVwiKTtcbmNvbnN0IG9uQmVmb3JlVXBkYXRlID0gY3JlYXRlSG9vayhcImJ1XCIpO1xuY29uc3Qgb25VcGRhdGVkID0gY3JlYXRlSG9vayhcInVcIik7XG5jb25zdCBvbkJlZm9yZVVubW91bnQgPSBjcmVhdGVIb29rKFwiYnVtXCIpO1xuY29uc3Qgb25Vbm1vdW50ZWQgPSBjcmVhdGVIb29rKFwidW1cIik7XG5jb25zdCBvblNlcnZlclByZWZldGNoID0gY3JlYXRlSG9vayhcInNwXCIpO1xuY29uc3Qgb25SZW5kZXJUcmlnZ2VyZWQgPSBjcmVhdGVIb29rKFxuICBcInJ0Z1wiXG4pO1xuY29uc3Qgb25SZW5kZXJUcmFja2VkID0gY3JlYXRlSG9vayhcbiAgXCJydGNcIlxuKTtcbmZ1bmN0aW9uIG9uRXJyb3JDYXB0dXJlZChob29rLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UpIHtcbiAgaW5qZWN0SG9vayhcImVjXCIsIGhvb2ssIHRhcmdldCk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckxpc3Qoc291cmNlLCByZW5kZXJJdGVtLCBjYWNoZSwgaW5kZXgpIHtcbiAgbGV0IHJldDtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUgJiYgY2FjaGVbaW5kZXhdO1xuICBpZiAoaXNBcnJheShzb3VyY2UpIHx8IGlzU3RyaW5nKHNvdXJjZSkpIHtcbiAgICByZXQgPSBuZXcgQXJyYXkoc291cmNlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzb3VyY2UubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICByZXRbaV0gPSByZW5kZXJJdGVtKHNvdXJjZVtpXSwgaSwgdm9pZCAwLCBjYWNoZWQgJiYgY2FjaGVkW2ldKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFOdW1iZXIuaXNJbnRlZ2VyKHNvdXJjZSkpIHtcbiAgICAgIHdhcm4kMShgVGhlIHYtZm9yIHJhbmdlIGV4cGVjdCBhbiBpbnRlZ2VyIHZhbHVlIGJ1dCBnb3QgJHtzb3VyY2V9LmApO1xuICAgIH1cbiAgICByZXQgPSBuZXcgQXJyYXkoc291cmNlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZTsgaSsrKSB7XG4gICAgICByZXRbaV0gPSByZW5kZXJJdGVtKGkgKyAxLCBpLCB2b2lkIDAsIGNhY2hlZCAmJiBjYWNoZWRbaV0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgaWYgKHNvdXJjZVtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gICAgICByZXQgPSBBcnJheS5mcm9tKFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIChpdGVtLCBpKSA9PiByZW5kZXJJdGVtKGl0ZW0sIGksIHZvaWQgMCwgY2FjaGVkICYmIGNhY2hlZFtpXSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgcmV0W2ldID0gcmVuZGVySXRlbShzb3VyY2Vba2V5XSwga2V5LCBpLCBjYWNoZWQgJiYgY2FjaGVkW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0ID0gW107XG4gIH1cbiAgaWYgKGNhY2hlKSB7XG4gICAgY2FjaGVbaW5kZXhdID0gcmV0O1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNsb3RzKHNsb3RzLCBkeW5hbWljU2xvdHMpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkeW5hbWljU2xvdHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzbG90ID0gZHluYW1pY1Nsb3RzW2ldO1xuICAgIGlmIChpc0FycmF5KHNsb3QpKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNsb3QubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc2xvdHNbc2xvdFtqXS5uYW1lXSA9IHNsb3Rbal0uZm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzbG90KSB7XG4gICAgICBzbG90c1tzbG90Lm5hbWVdID0gc2xvdC5rZXkgPyAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBzbG90LmZuKC4uLmFyZ3MpO1xuICAgICAgICBpZiAocmVzKVxuICAgICAgICAgIHJlcy5rZXkgPSBzbG90LmtleTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0gOiBzbG90LmZuO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2xvdHM7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclNsb3Qoc2xvdHMsIG5hbWUsIHByb3BzID0ge30sIGZhbGxiYWNrLCBub1Nsb3R0ZWQpIHtcbiAgaWYgKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5pc0NFIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5wYXJlbnQgJiYgaXNBc3luY1dyYXBwZXIoY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLnBhcmVudCkgJiYgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLnBhcmVudC5pc0NFKSB7XG4gICAgaWYgKG5hbWUgIT09IFwiZGVmYXVsdFwiKVxuICAgICAgcHJvcHMubmFtZSA9IG5hbWU7XG4gICAgcmV0dXJuIGNyZWF0ZVZOb2RlKFwic2xvdFwiLCBwcm9wcywgZmFsbGJhY2sgJiYgZmFsbGJhY2soKSk7XG4gIH1cbiAgbGV0IHNsb3QgPSBzbG90c1tuYW1lXTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2xvdCAmJiBzbG90Lmxlbmd0aCA+IDEpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgU1NSLW9wdGltaXplZCBzbG90IGZ1bmN0aW9uIGRldGVjdGVkIGluIGEgbm9uLVNTUi1vcHRpbWl6ZWQgcmVuZGVyIGZ1bmN0aW9uLiBZb3UgbmVlZCB0byBtYXJrIHRoaXMgY29tcG9uZW50IHdpdGggJGR5bmFtaWMtc2xvdHMgaW4gdGhlIHBhcmVudCB0ZW1wbGF0ZS5gXG4gICAgKTtcbiAgICBzbG90ID0gKCkgPT4gW107XG4gIH1cbiAgaWYgKHNsb3QgJiYgc2xvdC5fYykge1xuICAgIHNsb3QuX2QgPSBmYWxzZTtcbiAgfVxuICBvcGVuQmxvY2soKTtcbiAgY29uc3QgdmFsaWRTbG90Q29udGVudCA9IHNsb3QgJiYgZW5zdXJlVmFsaWRWTm9kZShzbG90KHByb3BzKSk7XG4gIGNvbnN0IHJlbmRlcmVkID0gY3JlYXRlQmxvY2soXG4gICAgRnJhZ21lbnQsXG4gICAge1xuICAgICAga2V5OiBwcm9wcy5rZXkgfHwgLy8gc2xvdCBjb250ZW50IGFycmF5IG9mIGEgZHluYW1pYyBjb25kaXRpb25hbCBzbG90IG1heSBoYXZlIGEgYnJhbmNoXG4gICAgICAvLyBrZXkgYXR0YWNoZWQgaW4gdGhlIGBjcmVhdGVTbG90c2AgaGVscGVyLCByZXNwZWN0IHRoYXRcbiAgICAgIHZhbGlkU2xvdENvbnRlbnQgJiYgdmFsaWRTbG90Q29udGVudC5rZXkgfHwgYF8ke25hbWV9YFxuICAgIH0sXG4gICAgdmFsaWRTbG90Q29udGVudCB8fCAoZmFsbGJhY2sgPyBmYWxsYmFjaygpIDogW10pLFxuICAgIHZhbGlkU2xvdENvbnRlbnQgJiYgc2xvdHMuXyA9PT0gMSA/IDY0IDogLTJcbiAgKTtcbiAgaWYgKCFub1Nsb3R0ZWQgJiYgcmVuZGVyZWQuc2NvcGVJZCkge1xuICAgIHJlbmRlcmVkLnNsb3RTY29wZUlkcyA9IFtyZW5kZXJlZC5zY29wZUlkICsgXCItc1wiXTtcbiAgfVxuICBpZiAoc2xvdCAmJiBzbG90Ll9jKSB7XG4gICAgc2xvdC5fZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHJlbmRlcmVkO1xufVxuZnVuY3Rpb24gZW5zdXJlVmFsaWRWTm9kZSh2bm9kZXMpIHtcbiAgcmV0dXJuIHZub2Rlcy5zb21lKChjaGlsZCkgPT4ge1xuICAgIGlmICghaXNWTm9kZShjaGlsZCkpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gQ29tbWVudClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gRnJhZ21lbnQgJiYgIWVuc3VyZVZhbGlkVk5vZGUoY2hpbGQuY2hpbGRyZW4pKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KSA/IHZub2RlcyA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHRvSGFuZGxlcnMob2JqLCBwcmVzZXJ2ZUNhc2VJZk5lY2Vzc2FyeSkge1xuICBjb25zdCByZXQgPSB7fTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzT2JqZWN0KG9iaikpIHtcbiAgICB3YXJuJDEoYHYtb24gd2l0aCBubyBhcmd1bWVudCBleHBlY3RzIGFuIG9iamVjdCB2YWx1ZS5gKTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIHJldFtwcmVzZXJ2ZUNhc2VJZk5lY2Vzc2FyeSAmJiAvW0EtWl0vLnRlc3Qoa2V5KSA/IGBvbjoke2tleX1gIDogdG9IYW5kbGVyS2V5KGtleSldID0gb2JqW2tleV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuY29uc3QgZ2V0UHVibGljSW5zdGFuY2UgPSAoaSkgPT4ge1xuICBpZiAoIWkpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmIChpc1N0YXRlZnVsQ29tcG9uZW50KGkpKVxuICAgIHJldHVybiBnZXRFeHBvc2VQcm94eShpKSB8fCBpLnByb3h5O1xuICByZXR1cm4gZ2V0UHVibGljSW5zdGFuY2UoaS5wYXJlbnQpO1xufTtcbmNvbnN0IHB1YmxpY1Byb3BlcnRpZXNNYXAgPSAoXG4gIC8vIE1vdmUgUFVSRSBtYXJrZXIgdG8gbmV3IGxpbmUgdG8gd29ya2Fyb3VuZCBjb21waWxlciBkaXNjYXJkaW5nIGl0XG4gIC8vIGR1ZSB0byB0eXBlIGFubm90YXRpb25cbiAgLyogQF9fUFVSRV9fICovIGV4dGVuZCgvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwge1xuICAgICQ6IChpKSA9PiBpLFxuICAgICRlbDogKGkpID0+IGkudm5vZGUuZWwsXG4gICAgJGRhdGE6IChpKSA9PiBpLmRhdGEsXG4gICAgJHByb3BzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLnByb3BzKSA6IGkucHJvcHMsXG4gICAgJGF0dHJzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLmF0dHJzKSA6IGkuYXR0cnMsXG4gICAgJHNsb3RzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLnNsb3RzKSA6IGkuc2xvdHMsXG4gICAgJHJlZnM6IChpKSA9PiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KGkucmVmcykgOiBpLnJlZnMsXG4gICAgJHBhcmVudDogKGkpID0+IGdldFB1YmxpY0luc3RhbmNlKGkucGFyZW50KSxcbiAgICAkcm9vdDogKGkpID0+IGdldFB1YmxpY0luc3RhbmNlKGkucm9vdCksXG4gICAgJGVtaXQ6IChpKSA9PiBpLmVtaXQsXG4gICAgJG9wdGlvbnM6IChpKSA9PiBfX1ZVRV9PUFRJT05TX0FQSV9fID8gcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaSkgOiBpLnR5cGUsXG4gICAgJGZvcmNlVXBkYXRlOiAoaSkgPT4gaS5mIHx8IChpLmYgPSAoKSA9PiB7XG4gICAgICBpLmVmZmVjdC5kaXJ0eSA9IHRydWU7XG4gICAgICBxdWV1ZUpvYihpLnVwZGF0ZSk7XG4gICAgfSksXG4gICAgJG5leHRUaWNrOiAoaSkgPT4gaS5uIHx8IChpLm4gPSBuZXh0VGljay5iaW5kKGkucHJveHkpKSxcbiAgICAkd2F0Y2g6IChpKSA9PiBfX1ZVRV9PUFRJT05TX0FQSV9fID8gaW5zdGFuY2VXYXRjaC5iaW5kKGkpIDogTk9PUFxuICB9KVxuKTtcbmNvbnN0IGlzUmVzZXJ2ZWRQcmVmaXggPSAoa2V5KSA9PiBrZXkgPT09IFwiX1wiIHx8IGtleSA9PT0gXCIkXCI7XG5jb25zdCBoYXNTZXR1cEJpbmRpbmcgPSAoc3RhdGUsIGtleSkgPT4gc3RhdGUgIT09IEVNUFRZX09CSiAmJiAhc3RhdGUuX19pc1NjcmlwdFNldHVwICYmIGhhc093bihzdGF0ZSwga2V5KTtcbmNvbnN0IFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyA9IHtcbiAgZ2V0KHsgXzogaW5zdGFuY2UgfSwga2V5KSB7XG4gICAgY29uc3QgeyBjdHgsIHNldHVwU3RhdGUsIGRhdGEsIHByb3BzLCBhY2Nlc3NDYWNoZSwgdHlwZSwgYXBwQ29udGV4dCB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5ID09PSBcIl9faXNWdWVcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBub3JtYWxpemVkUHJvcHM7XG4gICAgaWYgKGtleVswXSAhPT0gXCIkXCIpIHtcbiAgICAgIGNvbnN0IG4gPSBhY2Nlc3NDYWNoZVtrZXldO1xuICAgICAgaWYgKG4gIT09IHZvaWQgMCkge1xuICAgICAgICBzd2l0Y2ggKG4pIHtcbiAgICAgICAgICBjYXNlIDEgLyogU0VUVVAgKi86XG4gICAgICAgICAgICByZXR1cm4gc2V0dXBTdGF0ZVtrZXldO1xuICAgICAgICAgIGNhc2UgMiAvKiBEQVRBICovOlxuICAgICAgICAgICAgcmV0dXJuIGRhdGFba2V5XTtcbiAgICAgICAgICBjYXNlIDQgLyogQ09OVEVYVCAqLzpcbiAgICAgICAgICAgIHJldHVybiBjdHhba2V5XTtcbiAgICAgICAgICBjYXNlIDMgLyogUFJPUFMgKi86XG4gICAgICAgICAgICByZXR1cm4gcHJvcHNba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChoYXNTZXR1cEJpbmRpbmcoc2V0dXBTdGF0ZSwga2V5KSkge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gMSAvKiBTRVRVUCAqLztcbiAgICAgICAgcmV0dXJuIHNldHVwU3RhdGVba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YSAhPT0gRU1QVFlfT0JKICYmIGhhc093bihkYXRhLCBrZXkpKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAyIC8qIERBVEEgKi87XG4gICAgICAgIHJldHVybiBkYXRhW2tleV07XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAvLyBvbmx5IGNhY2hlIG90aGVyIHByb3BlcnRpZXMgd2hlbiBpbnN0YW5jZSBoYXMgZGVjbGFyZWQgKHRodXMgc3RhYmxlKVxuICAgICAgICAvLyBwcm9wc1xuICAgICAgICAobm9ybWFsaXplZFByb3BzID0gaW5zdGFuY2UucHJvcHNPcHRpb25zWzBdKSAmJiBoYXNPd24obm9ybWFsaXplZFByb3BzLCBrZXkpXG4gICAgICApIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDMgLyogUFJPUFMgKi87XG4gICAgICAgIHJldHVybiBwcm9wc1trZXldO1xuICAgICAgfSBlbHNlIGlmIChjdHggIT09IEVNUFRZX09CSiAmJiBoYXNPd24oY3R4LCBrZXkpKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSA0IC8qIENPTlRFWFQgKi87XG4gICAgICAgIHJldHVybiBjdHhba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoIV9fVlVFX09QVElPTlNfQVBJX18gfHwgc2hvdWxkQ2FjaGVBY2Nlc3MpIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDAgLyogT1RIRVIgKi87XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHB1YmxpY0dldHRlciA9IHB1YmxpY1Byb3BlcnRpZXNNYXBba2V5XTtcbiAgICBsZXQgY3NzTW9kdWxlLCBnbG9iYWxQcm9wZXJ0aWVzO1xuICAgIGlmIChwdWJsaWNHZXR0ZXIpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiJGF0dHJzXCIpIHtcbiAgICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIsIGtleSk7XG4gICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXkgPT09IFwiJHNsb3RzXCIpIHtcbiAgICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIsIGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHVibGljR2V0dGVyKGluc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgLy8gY3NzIG1vZHVsZSAoaW5qZWN0ZWQgYnkgdnVlLWxvYWRlcilcbiAgICAgIChjc3NNb2R1bGUgPSB0eXBlLl9fY3NzTW9kdWxlcykgJiYgKGNzc01vZHVsZSA9IGNzc01vZHVsZVtrZXldKVxuICAgICkge1xuICAgICAgcmV0dXJuIGNzc01vZHVsZTtcbiAgICB9IGVsc2UgaWYgKGN0eCAhPT0gRU1QVFlfT0JKICYmIGhhc093bihjdHgsIGtleSkpIHtcbiAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSA0IC8qIENPTlRFWFQgKi87XG4gICAgICByZXR1cm4gY3R4W2tleV07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIGdsb2JhbCBwcm9wZXJ0aWVzXG4gICAgICBnbG9iYWxQcm9wZXJ0aWVzID0gYXBwQ29udGV4dC5jb25maWcuZ2xvYmFsUHJvcGVydGllcywgaGFzT3duKGdsb2JhbFByb3BlcnRpZXMsIGtleSlcbiAgICApIHtcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIGdsb2JhbFByb3BlcnRpZXNba2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlICYmICghaXNTdHJpbmcoa2V5KSB8fCAvLyAjMTA5MSBhdm9pZCBpbnRlcm5hbCBpc1JlZi9pc1ZOb2RlIGNoZWNrcyBvbiBjb21wb25lbnQgaW5zdGFuY2UgbGVhZGluZ1xuICAgIC8vIHRvIGluZmluaXRlIHdhcm5pbmcgbG9vcFxuICAgIGtleS5pbmRleE9mKFwiX192XCIpICE9PSAwKSkge1xuICAgICAgaWYgKGRhdGEgIT09IEVNUFRZX09CSiAmJiBpc1Jlc2VydmVkUHJlZml4KGtleVswXSkgJiYgaGFzT3duKGRhdGEsIGtleSkpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBQcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgKX0gbXVzdCBiZSBhY2Nlc3NlZCB2aWEgJGRhdGEgYmVjYXVzZSBpdCBzdGFydHMgd2l0aCBhIHJlc2VydmVkIGNoYXJhY3RlciAoXCIkXCIgb3IgXCJfXCIpIGFuZCBpcyBub3QgcHJveGllZCBvbiB0aGUgcmVuZGVyIGNvbnRleHQuYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZSA9PT0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgUHJvcGVydHkgJHtKU09OLnN0cmluZ2lmeShrZXkpfSB3YXMgYWNjZXNzZWQgZHVyaW5nIHJlbmRlciBidXQgaXMgbm90IGRlZmluZWQgb24gaW5zdGFuY2UuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgc2V0KHsgXzogaW5zdGFuY2UgfSwga2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IHsgZGF0YSwgc2V0dXBTdGF0ZSwgY3R4IH0gPSBpbnN0YW5jZTtcbiAgICBpZiAoaGFzU2V0dXBCaW5kaW5nKHNldHVwU3RhdGUsIGtleSkpIHtcbiAgICAgIHNldHVwU3RhdGVba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldHVwU3RhdGUuX19pc1NjcmlwdFNldHVwICYmIGhhc093bihzZXR1cFN0YXRlLCBrZXkpKSB7XG4gICAgICB3YXJuJDEoYENhbm5vdCBtdXRhdGUgPHNjcmlwdCBzZXR1cD4gYmluZGluZyBcIiR7a2V5fVwiIGZyb20gT3B0aW9ucyBBUEkuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChkYXRhICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGRhdGEsIGtleSkpIHtcbiAgICAgIGRhdGFba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChoYXNPd24oaW5zdGFuY2UucHJvcHMsIGtleSkpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKGBBdHRlbXB0aW5nIHRvIG11dGF0ZSBwcm9wIFwiJHtrZXl9XCIuIFByb3BzIGFyZSByZWFkb25seS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGtleVswXSA9PT0gXCIkXCIgJiYga2V5LnNsaWNlKDEpIGluIGluc3RhbmNlKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShcbiAgICAgICAgYEF0dGVtcHRpbmcgdG8gbXV0YXRlIHB1YmxpYyBwcm9wZXJ0eSBcIiR7a2V5fVwiLiBQcm9wZXJ0aWVzIHN0YXJ0aW5nIHdpdGggJCBhcmUgcmVzZXJ2ZWQgYW5kIHJlYWRvbmx5LmBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSBpbiBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3R4W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGhhcyh7XG4gICAgXzogeyBkYXRhLCBzZXR1cFN0YXRlLCBhY2Nlc3NDYWNoZSwgY3R4LCBhcHBDb250ZXh0LCBwcm9wc09wdGlvbnMgfVxuICB9LCBrZXkpIHtcbiAgICBsZXQgbm9ybWFsaXplZFByb3BzO1xuICAgIHJldHVybiAhIWFjY2Vzc0NhY2hlW2tleV0gfHwgZGF0YSAhPT0gRU1QVFlfT0JKICYmIGhhc093bihkYXRhLCBrZXkpIHx8IGhhc1NldHVwQmluZGluZyhzZXR1cFN0YXRlLCBrZXkpIHx8IChub3JtYWxpemVkUHJvcHMgPSBwcm9wc09wdGlvbnNbMF0pICYmIGhhc093bihub3JtYWxpemVkUHJvcHMsIGtleSkgfHwgaGFzT3duKGN0eCwga2V5KSB8fCBoYXNPd24ocHVibGljUHJvcGVydGllc01hcCwga2V5KSB8fCBoYXNPd24oYXBwQ29udGV4dC5jb25maWcuZ2xvYmFsUHJvcGVydGllcywga2V5KTtcbiAgfSxcbiAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpIHtcbiAgICBpZiAoZGVzY3JpcHRvci5nZXQgIT0gbnVsbCkge1xuICAgICAgdGFyZ2V0Ll8uYWNjZXNzQ2FjaGVba2V5XSA9IDA7XG4gICAgfSBlbHNlIGlmIChoYXNPd24oZGVzY3JpcHRvciwgXCJ2YWx1ZVwiKSkge1xuICAgICAgdGhpcy5zZXQodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IudmFsdWUsIG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn07XG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0cnVlKSB7XG4gIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycy5vd25LZXlzID0gKHRhcmdldCkgPT4ge1xuICAgIHdhcm4kMShcbiAgICAgIGBBdm9pZCBhcHAgbG9naWMgdGhhdCByZWxpZXMgb24gZW51bWVyYXRpbmcga2V5cyBvbiBhIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhlIGtleXMgd2lsbCBiZSBlbXB0eSBpbiBwcm9kdWN0aW9uIG1vZGUgdG8gYXZvaWQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQuYFxuICAgICk7XG4gICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpO1xuICB9O1xufVxuY29uc3QgUnVudGltZUNvbXBpbGVkUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIGV4dGVuZChcbiAge30sXG4gIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyxcbiAge1xuICAgIGdldCh0YXJnZXQsIGtleSkge1xuICAgICAgaWYgKGtleSA9PT0gU3ltYm9sLnVuc2NvcGFibGVzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMuZ2V0KHRhcmdldCwga2V5LCB0YXJnZXQpO1xuICAgIH0sXG4gICAgaGFzKF8sIGtleSkge1xuICAgICAgY29uc3QgaGFzID0ga2V5WzBdICE9PSBcIl9cIiAmJiAhaXNHbG9iYWxseUFsbG93ZWQoa2V5KTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFoYXMgJiYgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzLmhhcyhfLCBrZXkpKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgUHJvcGVydHkgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICl9IHNob3VsZCBub3Qgc3RhcnQgd2l0aCBfIHdoaWNoIGlzIGEgcmVzZXJ2ZWQgcHJlZml4IGZvciBWdWUgaW50ZXJuYWxzLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXM7XG4gICAgfVxuICB9XG4pO1xuZnVuY3Rpb24gY3JlYXRlRGV2UmVuZGVyQ29udGV4dChpbnN0YW5jZSkge1xuICBjb25zdCB0YXJnZXQgPSB7fTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgYF9gLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogKCkgPT4gaW5zdGFuY2VcbiAgfSk7XG4gIE9iamVjdC5rZXlzKHB1YmxpY1Byb3BlcnRpZXNNYXApLmZvckVhY2goKGtleSkgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6ICgpID0+IHB1YmxpY1Byb3BlcnRpZXNNYXBba2V5XShpbnN0YW5jZSksXG4gICAgICAvLyBpbnRlcmNlcHRlZCBieSB0aGUgcHJveHkgc28gbm8gbmVlZCBmb3IgaW1wbGVtZW50YXRpb24sXG4gICAgICAvLyBidXQgbmVlZGVkIHRvIHByZXZlbnQgc2V0IGVycm9yc1xuICAgICAgc2V0OiBOT09QXG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gZXhwb3NlUHJvcHNPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3Qge1xuICAgIGN0eCxcbiAgICBwcm9wc09wdGlvbnM6IFtwcm9wc09wdGlvbnNdXG4gIH0gPSBpbnN0YW5jZTtcbiAgaWYgKHByb3BzT3B0aW9ucykge1xuICAgIE9iamVjdC5rZXlzKHByb3BzT3B0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IGluc3RhbmNlLnByb3BzW2tleV0sXG4gICAgICAgIHNldDogTk9PUFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGV4cG9zZVNldHVwU3RhdGVPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3QgeyBjdHgsIHNldHVwU3RhdGUgfSA9IGluc3RhbmNlO1xuICBPYmplY3Qua2V5cyh0b1JhdyhzZXR1cFN0YXRlKSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKCFzZXR1cFN0YXRlLl9faXNTY3JpcHRTZXR1cCkge1xuICAgICAgaWYgKGlzUmVzZXJ2ZWRQcmVmaXgoa2V5WzBdKSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYHNldHVwKCkgcmV0dXJuIHByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBrZXlcbiAgICAgICAgICApfSBzaG91bGQgbm90IHN0YXJ0IHdpdGggXCIkXCIgb3IgXCJfXCIgd2hpY2ggYXJlIHJlc2VydmVkIHByZWZpeGVzIGZvciBWdWUgaW50ZXJuYWxzLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBzZXR1cFN0YXRlW2tleV0sXG4gICAgICAgIHNldDogTk9PUFxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3Qgd2FyblJ1bnRpbWVVc2FnZSA9IChtZXRob2QpID0+IHdhcm4kMShcbiAgYCR7bWV0aG9kfSgpIGlzIGEgY29tcGlsZXItaGludCBoZWxwZXIgdGhhdCBpcyBvbmx5IHVzYWJsZSBpbnNpZGUgPHNjcmlwdCBzZXR1cD4gb2YgYSBzaW5nbGUgZmlsZSBjb21wb25lbnQuIEl0cyBhcmd1bWVudHMgc2hvdWxkIGJlIGNvbXBpbGVkIGF3YXkgYW5kIHBhc3NpbmcgaXQgYXQgcnVudGltZSBoYXMgbm8gZWZmZWN0LmBcbik7XG5mdW5jdGlvbiBkZWZpbmVQcm9wcygpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVQcm9wc2ApO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZGVmaW5lRW1pdHMoKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lRW1pdHNgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRlZmluZUV4cG9zZShleHBvc2VkKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lRXhwb3NlYCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlZmluZU9wdGlvbnMob3B0aW9ucykge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZU9wdGlvbnNgKTtcbiAgfVxufVxuZnVuY3Rpb24gZGVmaW5lU2xvdHMoKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lU2xvdHNgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRlZmluZU1vZGVsKCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoXCJkZWZpbmVNb2RlbFwiKTtcbiAgfVxufVxuZnVuY3Rpb24gd2l0aERlZmF1bHRzKHByb3BzLCBkZWZhdWx0cykge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYHdpdGhEZWZhdWx0c2ApO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gdXNlU2xvdHMoKSB7XG4gIHJldHVybiBnZXRDb250ZXh0KCkuc2xvdHM7XG59XG5mdW5jdGlvbiB1c2VBdHRycygpIHtcbiAgcmV0dXJuIGdldENvbnRleHQoKS5hdHRycztcbn1cbmZ1bmN0aW9uIGdldENvbnRleHQoKSB7XG4gIGNvbnN0IGkgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWkpIHtcbiAgICB3YXJuJDEoYHVzZUNvbnRleHQoKSBjYWxsZWQgd2l0aG91dCBhY3RpdmUgaW5zdGFuY2UuYCk7XG4gIH1cbiAgcmV0dXJuIGkuc2V0dXBDb250ZXh0IHx8IChpLnNldHVwQ29udGV4dCA9IGNyZWF0ZVNldHVwQ29udGV4dChpKSk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVQcm9wc09yRW1pdHMocHJvcHMpIHtcbiAgcmV0dXJuIGlzQXJyYXkocHJvcHMpID8gcHJvcHMucmVkdWNlKFxuICAgIChub3JtYWxpemVkLCBwKSA9PiAobm9ybWFsaXplZFtwXSA9IG51bGwsIG5vcm1hbGl6ZWQpLFxuICAgIHt9XG4gICkgOiBwcm9wcztcbn1cbmZ1bmN0aW9uIG1lcmdlRGVmYXVsdHMocmF3LCBkZWZhdWx0cykge1xuICBjb25zdCBwcm9wcyA9IG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhyYXcpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBkZWZhdWx0cykge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChcIl9fc2tpcFwiKSlcbiAgICAgIGNvbnRpbnVlO1xuICAgIGxldCBvcHQgPSBwcm9wc1trZXldO1xuICAgIGlmIChvcHQpIHtcbiAgICAgIGlmIChpc0FycmF5KG9wdCkgfHwgaXNGdW5jdGlvbihvcHQpKSB7XG4gICAgICAgIG9wdCA9IHByb3BzW2tleV0gPSB7IHR5cGU6IG9wdCwgZGVmYXVsdDogZGVmYXVsdHNba2V5XSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0LmRlZmF1bHQgPSBkZWZhdWx0c1trZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0ID09PSBudWxsKSB7XG4gICAgICBvcHQgPSBwcm9wc1trZXldID0geyBkZWZhdWx0OiBkZWZhdWx0c1trZXldIH07XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuJDEoYHByb3BzIGRlZmF1bHQga2V5IFwiJHtrZXl9XCIgaGFzIG5vIGNvcnJlc3BvbmRpbmcgZGVjbGFyYXRpb24uYCk7XG4gICAgfVxuICAgIGlmIChvcHQgJiYgZGVmYXVsdHNbYF9fc2tpcF8ke2tleX1gXSkge1xuICAgICAgb3B0LnNraXBGYWN0b3J5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb3BzO1xufVxuZnVuY3Rpb24gbWVyZ2VNb2RlbHMoYSwgYikge1xuICBpZiAoIWEgfHwgIWIpXG4gICAgcmV0dXJuIGEgfHwgYjtcbiAgaWYgKGlzQXJyYXkoYSkgJiYgaXNBcnJheShiKSlcbiAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gIHJldHVybiBleHRlbmQoe30sIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhhKSwgbm9ybWFsaXplUHJvcHNPckVtaXRzKGIpKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVByb3BzUmVzdFByb3h5KHByb3BzLCBleGNsdWRlZEtleXMpIHtcbiAgY29uc3QgcmV0ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgaWYgKCFleGNsdWRlZEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gcHJvcHNba2V5XVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiB3aXRoQXN5bmNDb250ZXh0KGdldEF3YWl0YWJsZSkge1xuICBjb25zdCBjdHggPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWN0eCkge1xuICAgIHdhcm4kMShcbiAgICAgIGB3aXRoQXN5bmNDb250ZXh0IGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBjdXJyZW50IGluc3RhbmNlLiBUaGlzIGlzIGxpa2VseSBhIGJ1Zy5gXG4gICAgKTtcbiAgfVxuICBsZXQgYXdhaXRhYmxlID0gZ2V0QXdhaXRhYmxlKCk7XG4gIHVuc2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmIChpc1Byb21pc2UoYXdhaXRhYmxlKSkge1xuICAgIGF3YWl0YWJsZSA9IGF3YWl0YWJsZS5jYXRjaCgoZSkgPT4ge1xuICAgICAgc2V0Q3VycmVudEluc3RhbmNlKGN0eCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBbYXdhaXRhYmxlLCAoKSA9PiBzZXRDdXJyZW50SW5zdGFuY2UoY3R4KV07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUR1cGxpY2F0ZUNoZWNrZXIoKSB7XG4gIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiAodHlwZSwga2V5KSA9PiB7XG4gICAgaWYgKGNhY2hlW2tleV0pIHtcbiAgICAgIHdhcm4kMShgJHt0eXBlfSBwcm9wZXJ0eSBcIiR7a2V5fVwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiAke2NhY2hlW2tleV19LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWNoZVtrZXldID0gdHlwZTtcbiAgICB9XG4gIH07XG59XG5sZXQgc2hvdWxkQ2FjaGVBY2Nlc3MgPSB0cnVlO1xuZnVuY3Rpb24gYXBwbHlPcHRpb25zKGluc3RhbmNlKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSk7XG4gIGNvbnN0IHB1YmxpY1RoaXMgPSBpbnN0YW5jZS5wcm94eTtcbiAgY29uc3QgY3R4ID0gaW5zdGFuY2UuY3R4O1xuICBzaG91bGRDYWNoZUFjY2VzcyA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5iZWZvcmVDcmVhdGUpIHtcbiAgICBjYWxsSG9vayhvcHRpb25zLmJlZm9yZUNyZWF0ZSwgaW5zdGFuY2UsIFwiYmNcIik7XG4gIH1cbiAgY29uc3Qge1xuICAgIC8vIHN0YXRlXG4gICAgZGF0YTogZGF0YU9wdGlvbnMsXG4gICAgY29tcHV0ZWQ6IGNvbXB1dGVkT3B0aW9ucyxcbiAgICBtZXRob2RzLFxuICAgIHdhdGNoOiB3YXRjaE9wdGlvbnMsXG4gICAgcHJvdmlkZTogcHJvdmlkZU9wdGlvbnMsXG4gICAgaW5qZWN0OiBpbmplY3RPcHRpb25zLFxuICAgIC8vIGxpZmVjeWNsZVxuICAgIGNyZWF0ZWQsXG4gICAgYmVmb3JlTW91bnQsXG4gICAgbW91bnRlZCxcbiAgICBiZWZvcmVVcGRhdGUsXG4gICAgdXBkYXRlZCxcbiAgICBhY3RpdmF0ZWQsXG4gICAgZGVhY3RpdmF0ZWQsXG4gICAgYmVmb3JlRGVzdHJveSxcbiAgICBiZWZvcmVVbm1vdW50LFxuICAgIGRlc3Ryb3llZCxcbiAgICB1bm1vdW50ZWQsXG4gICAgcmVuZGVyLFxuICAgIHJlbmRlclRyYWNrZWQsXG4gICAgcmVuZGVyVHJpZ2dlcmVkLFxuICAgIGVycm9yQ2FwdHVyZWQsXG4gICAgc2VydmVyUHJlZmV0Y2gsXG4gICAgLy8gcHVibGljIEFQSVxuICAgIGV4cG9zZSxcbiAgICBpbmhlcml0QXR0cnMsXG4gICAgLy8gYXNzZXRzXG4gICAgY29tcG9uZW50cyxcbiAgICBkaXJlY3RpdmVzLFxuICAgIGZpbHRlcnNcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVEdXBsaWNhdGVDaGVja2VyKCkgOiBudWxsO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IFtwcm9wc09wdGlvbnNdID0gaW5zdGFuY2UucHJvcHNPcHRpb25zO1xuICAgIGlmIChwcm9wc09wdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzT3B0aW9ucykge1xuICAgICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJQcm9wc1wiIC8qIFBST1BTICovLCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoaW5qZWN0T3B0aW9ucykge1xuICAgIHJlc29sdmVJbmplY3Rpb25zKGluamVjdE9wdGlvbnMsIGN0eCwgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKTtcbiAgfVxuICBpZiAobWV0aG9kcykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IG1ldGhvZEhhbmRsZXIgPSBtZXRob2RzW2tleV07XG4gICAgICBpZiAoaXNGdW5jdGlvbihtZXRob2RIYW5kbGVyKSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IG1ldGhvZEhhbmRsZXIuYmluZChwdWJsaWNUaGlzKSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN0eFtrZXldID0gbWV0aG9kSGFuZGxlci5iaW5kKHB1YmxpY1RoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiTWV0aG9kc1wiIC8qIE1FVEhPRFMgKi8sIGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYE1ldGhvZCBcIiR7a2V5fVwiIGhhcyB0eXBlIFwiJHt0eXBlb2YgbWV0aG9kSGFuZGxlcn1cIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIERpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoZGF0YU9wdGlvbnMpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNGdW5jdGlvbihkYXRhT3B0aW9ucykpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYFRoZSBkYXRhIG9wdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24uIFBsYWluIG9iamVjdCB1c2FnZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBkYXRhT3B0aW9ucy5jYWxsKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzUHJvbWlzZShkYXRhKSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgZGF0YSgpIHJldHVybmVkIGEgUHJvbWlzZSAtIG5vdGUgZGF0YSgpIGNhbm5vdCBiZSBhc3luYzsgSWYgeW91IGludGVuZCB0byBwZXJmb3JtIGRhdGEgZmV0Y2hpbmcgYmVmb3JlIGNvbXBvbmVudCByZW5kZXJzLCB1c2UgYXN5bmMgc2V0dXAoKSArIDxTdXNwZW5zZT4uYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYGRhdGEoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UuZGF0YSA9IHJlYWN0aXZlKGRhdGEpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkRhdGFcIiAvKiBEQVRBICovLCBrZXkpO1xuICAgICAgICAgIGlmICghaXNSZXNlcnZlZFByZWZpeChrZXlbMF0pKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBnZXQ6ICgpID0+IGRhdGFba2V5XSxcbiAgICAgICAgICAgICAgc2V0OiBOT09QXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc2hvdWxkQ2FjaGVBY2Nlc3MgPSB0cnVlO1xuICBpZiAoY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgICBjb25zdCBvcHQgPSBjb21wdXRlZE9wdGlvbnNba2V5XTtcbiAgICAgIGNvbnN0IGdldCA9IGlzRnVuY3Rpb24ob3B0KSA/IG9wdC5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpIDogaXNGdW5jdGlvbihvcHQuZ2V0KSA/IG9wdC5nZXQuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKSA6IE5PT1A7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBnZXQgPT09IE5PT1ApIHtcbiAgICAgICAgd2FybiQxKGBDb21wdXRlZCBwcm9wZXJ0eSBcIiR7a2V5fVwiIGhhcyBubyBnZXR0ZXIuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBzZXQgPSAhaXNGdW5jdGlvbihvcHQpICYmIGlzRnVuY3Rpb24ob3B0LnNldCkgPyBvcHQuc2V0LmJpbmQocHVibGljVGhpcykgOiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gKCkgPT4ge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYFdyaXRlIG9wZXJhdGlvbiBmYWlsZWQ6IGNvbXB1dGVkIHByb3BlcnR5IFwiJHtrZXl9XCIgaXMgcmVhZG9ubHkuYFxuICAgICAgICApO1xuICAgICAgfSA6IE5PT1A7XG4gICAgICBjb25zdCBjID0gY29tcHV0ZWQoe1xuICAgICAgICBnZXQsXG4gICAgICAgIHNldFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IGMudmFsdWUsXG4gICAgICAgIHNldDogKHYpID0+IGMudmFsdWUgPSB2XG4gICAgICB9KTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkNvbXB1dGVkXCIgLyogQ09NUFVURUQgKi8sIGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICh3YXRjaE9wdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB3YXRjaE9wdGlvbnMpIHtcbiAgICAgIGNyZWF0ZVdhdGNoZXIod2F0Y2hPcHRpb25zW2tleV0sIGN0eCwgcHVibGljVGhpcywga2V5KTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb3ZpZGVPcHRpb25zKSB7XG4gICAgY29uc3QgcHJvdmlkZXMgPSBpc0Z1bmN0aW9uKHByb3ZpZGVPcHRpb25zKSA/IHByb3ZpZGVPcHRpb25zLmNhbGwocHVibGljVGhpcykgOiBwcm92aWRlT3B0aW9ucztcbiAgICBSZWZsZWN0Lm93bktleXMocHJvdmlkZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgcHJvdmlkZShrZXksIHByb3ZpZGVzW2tleV0pO1xuICAgIH0pO1xuICB9XG4gIGlmIChjcmVhdGVkKSB7XG4gICAgY2FsbEhvb2soY3JlYXRlZCwgaW5zdGFuY2UsIFwiY1wiKTtcbiAgfVxuICBmdW5jdGlvbiByZWdpc3RlckxpZmVjeWNsZUhvb2socmVnaXN0ZXIsIGhvb2spIHtcbiAgICBpZiAoaXNBcnJheShob29rKSkge1xuICAgICAgaG9vay5mb3JFYWNoKChfaG9vaykgPT4gcmVnaXN0ZXIoX2hvb2suYmluZChwdWJsaWNUaGlzKSkpO1xuICAgIH0gZWxzZSBpZiAoaG9vaykge1xuICAgICAgcmVnaXN0ZXIoaG9vay5iaW5kKHB1YmxpY1RoaXMpKTtcbiAgICB9XG4gIH1cbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQmVmb3JlTW91bnQsIGJlZm9yZU1vdW50KTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uTW91bnRlZCwgbW91bnRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkJlZm9yZVVwZGF0ZSwgYmVmb3JlVXBkYXRlKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uVXBkYXRlZCwgdXBkYXRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkFjdGl2YXRlZCwgYWN0aXZhdGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uRGVhY3RpdmF0ZWQsIGRlYWN0aXZhdGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uRXJyb3JDYXB0dXJlZCwgZXJyb3JDYXB0dXJlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblJlbmRlclRyYWNrZWQsIHJlbmRlclRyYWNrZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25SZW5kZXJUcmlnZ2VyZWQsIHJlbmRlclRyaWdnZXJlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkJlZm9yZVVubW91bnQsIGJlZm9yZVVubW91bnQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25Vbm1vdW50ZWQsIHVubW91bnRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblNlcnZlclByZWZldGNoLCBzZXJ2ZXJQcmVmZXRjaCk7XG4gIGlmIChpc0FycmF5KGV4cG9zZSkpIHtcbiAgICBpZiAoZXhwb3NlLmxlbmd0aCkge1xuICAgICAgY29uc3QgZXhwb3NlZCA9IGluc3RhbmNlLmV4cG9zZWQgfHwgKGluc3RhbmNlLmV4cG9zZWQgPSB7fSk7XG4gICAgICBleHBvc2UuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvc2VkLCBrZXksIHtcbiAgICAgICAgICBnZXQ6ICgpID0+IHB1YmxpY1RoaXNba2V5XSxcbiAgICAgICAgICBzZXQ6ICh2YWwpID0+IHB1YmxpY1RoaXNba2V5XSA9IHZhbFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIWluc3RhbmNlLmV4cG9zZWQpIHtcbiAgICAgIGluc3RhbmNlLmV4cG9zZWQgPSB7fTtcbiAgICB9XG4gIH1cbiAgaWYgKHJlbmRlciAmJiBpbnN0YW5jZS5yZW5kZXIgPT09IE5PT1ApIHtcbiAgICBpbnN0YW5jZS5yZW5kZXIgPSByZW5kZXI7XG4gIH1cbiAgaWYgKGluaGVyaXRBdHRycyAhPSBudWxsKSB7XG4gICAgaW5zdGFuY2UuaW5oZXJpdEF0dHJzID0gaW5oZXJpdEF0dHJzO1xuICB9XG4gIGlmIChjb21wb25lbnRzKVxuICAgIGluc3RhbmNlLmNvbXBvbmVudHMgPSBjb21wb25lbnRzO1xuICBpZiAoZGlyZWN0aXZlcylcbiAgICBpbnN0YW5jZS5kaXJlY3RpdmVzID0gZGlyZWN0aXZlcztcbn1cbmZ1bmN0aW9uIHJlc29sdmVJbmplY3Rpb25zKGluamVjdE9wdGlvbnMsIGN0eCwgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzID0gTk9PUCkge1xuICBpZiAoaXNBcnJheShpbmplY3RPcHRpb25zKSkge1xuICAgIGluamVjdE9wdGlvbnMgPSBub3JtYWxpemVJbmplY3QoaW5qZWN0T3B0aW9ucyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gaW5qZWN0T3B0aW9ucykge1xuICAgIGNvbnN0IG9wdCA9IGluamVjdE9wdGlvbnNba2V5XTtcbiAgICBsZXQgaW5qZWN0ZWQ7XG4gICAgaWYgKGlzT2JqZWN0KG9wdCkpIHtcbiAgICAgIGlmIChcImRlZmF1bHRcIiBpbiBvcHQpIHtcbiAgICAgICAgaW5qZWN0ZWQgPSBpbmplY3QoXG4gICAgICAgICAgb3B0LmZyb20gfHwga2V5LFxuICAgICAgICAgIG9wdC5kZWZhdWx0LFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluamVjdGVkID0gaW5qZWN0KG9wdC5mcm9tIHx8IGtleSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluamVjdGVkID0gaW5qZWN0KG9wdCk7XG4gICAgfVxuICAgIGlmIChpc1JlZihpbmplY3RlZCkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gaW5qZWN0ZWQudmFsdWUsXG4gICAgICAgIHNldDogKHYpID0+IGluamVjdGVkLnZhbHVlID0gdlxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eFtrZXldID0gaW5qZWN0ZWQ7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJJbmplY3RcIiAvKiBJTkpFQ1QgKi8sIGtleSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjYWxsSG9vayhob29rLCBpbnN0YW5jZSwgdHlwZSkge1xuICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICBpc0FycmF5KGhvb2spID8gaG9vay5tYXAoKGgpID0+IGguYmluZChpbnN0YW5jZS5wcm94eSkpIDogaG9vay5iaW5kKGluc3RhbmNlLnByb3h5KSxcbiAgICBpbnN0YW5jZSxcbiAgICB0eXBlXG4gICk7XG59XG5mdW5jdGlvbiBjcmVhdGVXYXRjaGVyKHJhdywgY3R4LCBwdWJsaWNUaGlzLCBrZXkpIHtcbiAgY29uc3QgZ2V0dGVyID0ga2V5LmluY2x1ZGVzKFwiLlwiKSA/IGNyZWF0ZVBhdGhHZXR0ZXIocHVibGljVGhpcywga2V5KSA6ICgpID0+IHB1YmxpY1RoaXNba2V5XTtcbiAgaWYgKGlzU3RyaW5nKHJhdykpIHtcbiAgICBjb25zdCBoYW5kbGVyID0gY3R4W3Jhd107XG4gICAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICAgIHdhdGNoKGdldHRlciwgaGFuZGxlcik7XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuJDEoYEludmFsaWQgd2F0Y2ggaGFuZGxlciBzcGVjaWZpZWQgYnkga2V5IFwiJHtyYXd9XCJgLCBoYW5kbGVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihyYXcpKSB7XG4gICAgd2F0Y2goZ2V0dGVyLCByYXcuYmluZChwdWJsaWNUaGlzKSk7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QocmF3KSkge1xuICAgIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICAgIHJhdy5mb3JFYWNoKChyKSA9PiBjcmVhdGVXYXRjaGVyKHIsIGN0eCwgcHVibGljVGhpcywga2V5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBpc0Z1bmN0aW9uKHJhdy5oYW5kbGVyKSA/IHJhdy5oYW5kbGVyLmJpbmQocHVibGljVGhpcykgOiBjdHhbcmF3LmhhbmRsZXJdO1xuICAgICAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICAgICAgd2F0Y2goZ2V0dGVyLCBoYW5kbGVyLCByYXcpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHdhcm4kMShgSW52YWxpZCB3YXRjaCBoYW5kbGVyIHNwZWNpZmllZCBieSBrZXkgXCIke3Jhdy5oYW5kbGVyfVwiYCwgaGFuZGxlcik7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoYEludmFsaWQgd2F0Y2ggb3B0aW9uOiBcIiR7a2V5fVwiYCwgcmF3KTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaW5zdGFuY2UpIHtcbiAgY29uc3QgYmFzZSA9IGluc3RhbmNlLnR5cGU7XG4gIGNvbnN0IHsgbWl4aW5zLCBleHRlbmRzOiBleHRlbmRzT3B0aW9ucyB9ID0gYmFzZTtcbiAgY29uc3Qge1xuICAgIG1peGluczogZ2xvYmFsTWl4aW5zLFxuICAgIG9wdGlvbnNDYWNoZTogY2FjaGUsXG4gICAgY29uZmlnOiB7IG9wdGlvbk1lcmdlU3RyYXRlZ2llcyB9XG4gIH0gPSBpbnN0YW5jZS5hcHBDb250ZXh0O1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoYmFzZSk7XG4gIGxldCByZXNvbHZlZDtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJlc29sdmVkID0gY2FjaGVkO1xuICB9IGVsc2UgaWYgKCFnbG9iYWxNaXhpbnMubGVuZ3RoICYmICFtaXhpbnMgJiYgIWV4dGVuZHNPcHRpb25zKSB7XG4gICAge1xuICAgICAgcmVzb2x2ZWQgPSBiYXNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXNvbHZlZCA9IHt9O1xuICAgIGlmIChnbG9iYWxNaXhpbnMubGVuZ3RoKSB7XG4gICAgICBnbG9iYWxNaXhpbnMuZm9yRWFjaChcbiAgICAgICAgKG0pID0+IG1lcmdlT3B0aW9ucyhyZXNvbHZlZCwgbSwgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzLCB0cnVlKVxuICAgICAgKTtcbiAgICB9XG4gICAgbWVyZ2VPcHRpb25zKHJlc29sdmVkLCBiYXNlLCBvcHRpb25NZXJnZVN0cmF0ZWdpZXMpO1xuICB9XG4gIGlmIChpc09iamVjdChiYXNlKSkge1xuICAgIGNhY2hlLnNldChiYXNlLCByZXNvbHZlZCk7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHRvLCBmcm9tLCBzdHJhdHMsIGFzTWl4aW4gPSBmYWxzZSkge1xuICBjb25zdCB7IG1peGlucywgZXh0ZW5kczogZXh0ZW5kc09wdGlvbnMgfSA9IGZyb207XG4gIGlmIChleHRlbmRzT3B0aW9ucykge1xuICAgIG1lcmdlT3B0aW9ucyh0bywgZXh0ZW5kc09wdGlvbnMsIHN0cmF0cywgdHJ1ZSk7XG4gIH1cbiAgaWYgKG1peGlucykge1xuICAgIG1peGlucy5mb3JFYWNoKFxuICAgICAgKG0pID0+IG1lcmdlT3B0aW9ucyh0bywgbSwgc3RyYXRzLCB0cnVlKVxuICAgICk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgIGlmIChhc01peGluICYmIGtleSA9PT0gXCJleHBvc2VcIikge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoXG4gICAgICAgIGBcImV4cG9zZVwiIG9wdGlvbiBpcyBpZ25vcmVkIHdoZW4gZGVjbGFyZWQgaW4gbWl4aW5zIG9yIGV4dGVuZHMuIEl0IHNob3VsZCBvbmx5IGJlIGRlY2xhcmVkIGluIHRoZSBiYXNlIGNvbXBvbmVudCBpdHNlbGYuYFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3RyYXQgPSBpbnRlcm5hbE9wdGlvbk1lcmdlU3RyYXRzW2tleV0gfHwgc3RyYXRzICYmIHN0cmF0c1trZXldO1xuICAgICAgdG9ba2V5XSA9IHN0cmF0ID8gc3RyYXQodG9ba2V5XSwgZnJvbVtrZXldKSA6IGZyb21ba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufVxuY29uc3QgaW50ZXJuYWxPcHRpb25NZXJnZVN0cmF0cyA9IHtcbiAgZGF0YTogbWVyZ2VEYXRhRm4sXG4gIHByb3BzOiBtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnMsXG4gIGVtaXRzOiBtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnMsXG4gIC8vIG9iamVjdHNcbiAgbWV0aG9kczogbWVyZ2VPYmplY3RPcHRpb25zLFxuICBjb21wdXRlZDogbWVyZ2VPYmplY3RPcHRpb25zLFxuICAvLyBsaWZlY3ljbGVcbiAgYmVmb3JlQ3JlYXRlOiBtZXJnZUFzQXJyYXksXG4gIGNyZWF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgYmVmb3JlTW91bnQ6IG1lcmdlQXNBcnJheSxcbiAgbW91bnRlZDogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVVcGRhdGU6IG1lcmdlQXNBcnJheSxcbiAgdXBkYXRlZDogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVEZXN0cm95OiBtZXJnZUFzQXJyYXksXG4gIGJlZm9yZVVubW91bnQ6IG1lcmdlQXNBcnJheSxcbiAgZGVzdHJveWVkOiBtZXJnZUFzQXJyYXksXG4gIHVubW91bnRlZDogbWVyZ2VBc0FycmF5LFxuICBhY3RpdmF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgZGVhY3RpdmF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgZXJyb3JDYXB0dXJlZDogbWVyZ2VBc0FycmF5LFxuICBzZXJ2ZXJQcmVmZXRjaDogbWVyZ2VBc0FycmF5LFxuICAvLyBhc3NldHNcbiAgY29tcG9uZW50czogbWVyZ2VPYmplY3RPcHRpb25zLFxuICBkaXJlY3RpdmVzOiBtZXJnZU9iamVjdE9wdGlvbnMsXG4gIC8vIHdhdGNoXG4gIHdhdGNoOiBtZXJnZVdhdGNoT3B0aW9ucyxcbiAgLy8gcHJvdmlkZSAvIGluamVjdFxuICBwcm92aWRlOiBtZXJnZURhdGFGbixcbiAgaW5qZWN0OiBtZXJnZUluamVjdFxufTtcbmZ1bmN0aW9uIG1lcmdlRGF0YUZuKHRvLCBmcm9tKSB7XG4gIGlmICghZnJvbSkge1xuICAgIHJldHVybiB0bztcbiAgfVxuICBpZiAoIXRvKSB7XG4gICAgcmV0dXJuIGZyb207XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZERhdGFGbigpIHtcbiAgICByZXR1cm4gKGV4dGVuZCkoXG4gICAgICBpc0Z1bmN0aW9uKHRvKSA/IHRvLmNhbGwodGhpcywgdGhpcykgOiB0byxcbiAgICAgIGlzRnVuY3Rpb24oZnJvbSkgPyBmcm9tLmNhbGwodGhpcywgdGhpcykgOiBmcm9tXG4gICAgKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIG1lcmdlSW5qZWN0KHRvLCBmcm9tKSB7XG4gIHJldHVybiBtZXJnZU9iamVjdE9wdGlvbnMobm9ybWFsaXplSW5qZWN0KHRvKSwgbm9ybWFsaXplSW5qZWN0KGZyb20pKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdChyYXcpIHtcbiAgaWYgKGlzQXJyYXkocmF3KSkge1xuICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXNbcmF3W2ldXSA9IHJhd1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICByZXR1cm4gcmF3O1xufVxuZnVuY3Rpb24gbWVyZ2VBc0FycmF5KHRvLCBmcm9tKSB7XG4gIHJldHVybiB0byA/IFsuLi5uZXcgU2V0KFtdLmNvbmNhdCh0bywgZnJvbSkpXSA6IGZyb207XG59XG5mdW5jdGlvbiBtZXJnZU9iamVjdE9wdGlvbnModG8sIGZyb20pIHtcbiAgcmV0dXJuIHRvID8gZXh0ZW5kKC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0bywgZnJvbSkgOiBmcm9tO1xufVxuZnVuY3Rpb24gbWVyZ2VFbWl0c09yUHJvcHNPcHRpb25zKHRvLCBmcm9tKSB7XG4gIGlmICh0bykge1xuICAgIGlmIChpc0FycmF5KHRvKSAmJiBpc0FycmF5KGZyb20pKSB7XG4gICAgICByZXR1cm4gWy4uLi8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFsuLi50bywgLi4uZnJvbV0pXTtcbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuZChcbiAgICAgIC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgbm9ybWFsaXplUHJvcHNPckVtaXRzKHRvKSxcbiAgICAgIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhmcm9tICE9IG51bGwgPyBmcm9tIDoge30pXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnJvbTtcbiAgfVxufVxuZnVuY3Rpb24gbWVyZ2VXYXRjaE9wdGlvbnModG8sIGZyb20pIHtcbiAgaWYgKCF0bylcbiAgICByZXR1cm4gZnJvbTtcbiAgaWYgKCFmcm9tKVxuICAgIHJldHVybiB0bztcbiAgY29uc3QgbWVyZ2VkID0gZXh0ZW5kKC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0byk7XG4gIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICBtZXJnZWRba2V5XSA9IG1lcmdlQXNBcnJheSh0b1trZXldLCBmcm9tW2tleV0pO1xuICB9XG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFwcENvbnRleHQoKSB7XG4gIHJldHVybiB7XG4gICAgYXBwOiBudWxsLFxuICAgIGNvbmZpZzoge1xuICAgICAgaXNOYXRpdmVUYWc6IE5PLFxuICAgICAgcGVyZm9ybWFuY2U6IGZhbHNlLFxuICAgICAgZ2xvYmFsUHJvcGVydGllczoge30sXG4gICAgICBvcHRpb25NZXJnZVN0cmF0ZWdpZXM6IHt9LFxuICAgICAgZXJyb3JIYW5kbGVyOiB2b2lkIDAsXG4gICAgICB3YXJuSGFuZGxlcjogdm9pZCAwLFxuICAgICAgY29tcGlsZXJPcHRpb25zOiB7fVxuICAgIH0sXG4gICAgbWl4aW5zOiBbXSxcbiAgICBjb21wb25lbnRzOiB7fSxcbiAgICBkaXJlY3RpdmVzOiB7fSxcbiAgICBwcm92aWRlczogLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgb3B0aW9uc0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSxcbiAgICBwcm9wc0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSxcbiAgICBlbWl0c0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKVxuICB9O1xufVxubGV0IHVpZCQxID0gMDtcbmZ1bmN0aW9uIGNyZWF0ZUFwcEFQSShyZW5kZXIsIGh5ZHJhdGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZUFwcChyb290Q29tcG9uZW50LCByb290UHJvcHMgPSBudWxsKSB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKHJvb3RDb21wb25lbnQpKSB7XG4gICAgICByb290Q29tcG9uZW50ID0gZXh0ZW5kKHt9LCByb290Q29tcG9uZW50KTtcbiAgICB9XG4gICAgaWYgKHJvb3RQcm9wcyAhPSBudWxsICYmICFpc09iamVjdChyb290UHJvcHMpKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShgcm9vdCBwcm9wcyBwYXNzZWQgdG8gYXBwLm1vdW50KCkgbXVzdCBiZSBhbiBvYmplY3QuYCk7XG4gICAgICByb290UHJvcHMgPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0ID0gY3JlYXRlQXBwQ29udGV4dCgpO1xuICAgIGNvbnN0IGluc3RhbGxlZFBsdWdpbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTtcbiAgICBsZXQgaXNNb3VudGVkID0gZmFsc2U7XG4gICAgY29uc3QgYXBwID0gY29udGV4dC5hcHAgPSB7XG4gICAgICBfdWlkOiB1aWQkMSsrLFxuICAgICAgX2NvbXBvbmVudDogcm9vdENvbXBvbmVudCxcbiAgICAgIF9wcm9wczogcm9vdFByb3BzLFxuICAgICAgX2NvbnRhaW5lcjogbnVsbCxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0LFxuICAgICAgX2luc3RhbmNlOiBudWxsLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGdldCBjb25maWcoKSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmNvbmZpZztcbiAgICAgIH0sXG4gICAgICBzZXQgY29uZmlnKHYpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgYXBwLmNvbmZpZyBjYW5ub3QgYmUgcmVwbGFjZWQuIE1vZGlmeSBpbmRpdmlkdWFsIG9wdGlvbnMgaW5zdGVhZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZShwbHVnaW4sIC4uLm9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGluc3RhbGxlZFBsdWdpbnMuaGFzKHBsdWdpbikpIHtcbiAgICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShgUGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0YXJnZXQgYXBwLmApO1xuICAgICAgICB9IGVsc2UgaWYgKHBsdWdpbiAmJiBpc0Z1bmN0aW9uKHBsdWdpbi5pbnN0YWxsKSkge1xuICAgICAgICAgIGluc3RhbGxlZFBsdWdpbnMuYWRkKHBsdWdpbik7XG4gICAgICAgICAgcGx1Z2luLmluc3RhbGwoYXBwLCAuLi5vcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHBsdWdpbikpIHtcbiAgICAgICAgICBpbnN0YWxsZWRQbHVnaW5zLmFkZChwbHVnaW4pO1xuICAgICAgICAgIHBsdWdpbihhcHAsIC4uLm9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQSBwbHVnaW4gbXVzdCBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhbiBcImluc3RhbGxcIiBmdW5jdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIG1peGluKG1peGluKSB7XG4gICAgICAgIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fKSB7XG4gICAgICAgICAgaWYgKCFjb250ZXh0Lm1peGlucy5pbmNsdWRlcyhtaXhpbikpIHtcbiAgICAgICAgICAgIGNvbnRleHQubWl4aW5zLnB1c2gobWl4aW4pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBcIk1peGluIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0YXJnZXQgYXBwXCIgKyAobWl4aW4ubmFtZSA/IGA6ICR7bWl4aW4ubmFtZX1gIDogXCJcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXCJNaXhpbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIGJ1aWxkcyBzdXBwb3J0aW5nIE9wdGlvbnMgQVBJXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9LFxuICAgICAgY29tcG9uZW50KG5hbWUsIGNvbXBvbmVudCkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShuYW1lLCBjb250ZXh0LmNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5jb21wb25lbnRzW25hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXSkge1xuICAgICAgICAgIHdhcm4kMShgQ29tcG9uZW50IFwiJHtuYW1lfVwiIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBpbiB0YXJnZXQgYXBwLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXSA9IGNvbXBvbmVudDtcbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBkaXJlY3RpdmUobmFtZSwgZGlyZWN0aXZlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgdmFsaWRhdGVEaXJlY3RpdmVOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGlyZWN0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlyZWN0aXZlc1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV0pIHtcbiAgICAgICAgICB3YXJuJDEoYERpcmVjdGl2ZSBcIiR7bmFtZX1cIiBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgaW4gdGFyZ2V0IGFwcC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV0gPSBkaXJlY3RpdmU7XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9LFxuICAgICAgbW91bnQocm9vdENvbnRhaW5lciwgaXNIeWRyYXRlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgaWYgKCFpc01vdW50ZWQpIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiByb290Q29udGFpbmVyLl9fdnVlX2FwcF9fKSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIGBUaGVyZSBpcyBhbHJlYWR5IGFuIGFwcCBpbnN0YW5jZSBtb3VudGVkIG9uIHRoZSBob3N0IGNvbnRhaW5lci5cbiBJZiB5b3Ugd2FudCB0byBtb3VudCBhbm90aGVyIGFwcCBvbiB0aGUgc2FtZSBob3N0IGNvbnRhaW5lciwgeW91IG5lZWQgdG8gdW5tb3VudCB0aGUgcHJldmlvdXMgYXBwIGJ5IGNhbGxpbmcgXFxgYXBwLnVubW91bnQoKVxcYCBmaXJzdC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKHJvb3RDb21wb25lbnQsIHJvb3RQcm9wcyk7XG4gICAgICAgICAgdm5vZGUuYXBwQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgbmFtZXNwYWNlID0gXCJzdmdcIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVzcGFjZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG5hbWVzcGFjZSA9IHZvaWQgMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIGNvbnRleHQucmVsb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICByZW5kZXIoXG4gICAgICAgICAgICAgICAgY2xvbmVWTm9kZSh2bm9kZSksXG4gICAgICAgICAgICAgICAgcm9vdENvbnRhaW5lcixcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0h5ZHJhdGUgJiYgaHlkcmF0ZSkge1xuICAgICAgICAgICAgaHlkcmF0ZSh2bm9kZSwgcm9vdENvbnRhaW5lcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbmRlcih2bm9kZSwgcm9vdENvbnRhaW5lciwgbmFtZXNwYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaXNNb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgICBhcHAuX2NvbnRhaW5lciA9IHJvb3RDb250YWluZXI7XG4gICAgICAgICAgcm9vdENvbnRhaW5lci5fX3Z1ZV9hcHBfXyA9IGFwcDtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgICAgIGFwcC5faW5zdGFuY2UgPSB2bm9kZS5jb21wb25lbnQ7XG4gICAgICAgICAgICBkZXZ0b29sc0luaXRBcHAoYXBwLCB2ZXJzaW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGdldEV4cG9zZVByb3h5KHZub2RlLmNvbXBvbmVudCkgfHwgdm5vZGUuY29tcG9uZW50LnByb3h5O1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQXBwIGhhcyBhbHJlYWR5IGJlZW4gbW91bnRlZC5cbklmIHlvdSB3YW50IHRvIHJlbW91bnQgdGhlIHNhbWUgYXBwLCBtb3ZlIHlvdXIgYXBwIGNyZWF0aW9uIGxvZ2ljIGludG8gYSBmYWN0b3J5IGZ1bmN0aW9uIGFuZCBjcmVhdGUgZnJlc2ggYXBwIGluc3RhbmNlcyBmb3IgZWFjaCBtb3VudCAtIGUuZy4gXFxgY29uc3QgY3JlYXRlTXlBcHAgPSAoKSA9PiBjcmVhdGVBcHAoQXBwKVxcYGBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdW5tb3VudCgpIHtcbiAgICAgICAgaWYgKGlzTW91bnRlZCkge1xuICAgICAgICAgIHJlbmRlcihudWxsLCBhcHAuX2NvbnRhaW5lcik7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICBhcHAuX2luc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICAgIGRldnRvb2xzVW5tb3VudEFwcChhcHApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgYXBwLl9jb250YWluZXIuX192dWVfYXBwX187XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHdhcm4kMShgQ2Fubm90IHVubW91bnQgYW4gYXBwIHRoYXQgaXMgbm90IG1vdW50ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm92aWRlKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5IGluIGNvbnRleHQucHJvdmlkZXMpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQXBwIGFscmVhZHkgcHJvdmlkZXMgcHJvcGVydHkgd2l0aCBrZXkgXCIke1N0cmluZyhrZXkpfVwiLiBJdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyB2YWx1ZS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LnByb3ZpZGVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBydW5XaXRoQ29udGV4dChmbikge1xuICAgICAgICBjdXJyZW50QXBwID0gYXBwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmbigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGN1cnJlbnRBcHAgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gYXBwO1xuICB9O1xufVxubGV0IGN1cnJlbnRBcHAgPSBudWxsO1xuXG5mdW5jdGlvbiBwcm92aWRlKGtleSwgdmFsdWUpIHtcbiAgaWYgKCFjdXJyZW50SW5zdGFuY2UpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybiQxKGBwcm92aWRlKCkgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgc2V0dXAoKS5gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IHByb3ZpZGVzID0gY3VycmVudEluc3RhbmNlLnByb3ZpZGVzO1xuICAgIGNvbnN0IHBhcmVudFByb3ZpZGVzID0gY3VycmVudEluc3RhbmNlLnBhcmVudCAmJiBjdXJyZW50SW5zdGFuY2UucGFyZW50LnByb3ZpZGVzO1xuICAgIGlmIChwYXJlbnRQcm92aWRlcyA9PT0gcHJvdmlkZXMpIHtcbiAgICAgIHByb3ZpZGVzID0gY3VycmVudEluc3RhbmNlLnByb3ZpZGVzID0gT2JqZWN0LmNyZWF0ZShwYXJlbnRQcm92aWRlcyk7XG4gICAgfVxuICAgIHByb3ZpZGVzW2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gaW5qZWN0KGtleSwgZGVmYXVsdFZhbHVlLCB0cmVhdERlZmF1bHRBc0ZhY3RvcnkgPSBmYWxzZSkge1xuICBjb25zdCBpbnN0YW5jZSA9IGN1cnJlbnRJbnN0YW5jZSB8fCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG4gIGlmIChpbnN0YW5jZSB8fCBjdXJyZW50QXBwKSB7XG4gICAgY29uc3QgcHJvdmlkZXMgPSBpbnN0YW5jZSA/IGluc3RhbmNlLnBhcmVudCA9PSBudWxsID8gaW5zdGFuY2Uudm5vZGUuYXBwQ29udGV4dCAmJiBpbnN0YW5jZS52bm9kZS5hcHBDb250ZXh0LnByb3ZpZGVzIDogaW5zdGFuY2UucGFyZW50LnByb3ZpZGVzIDogY3VycmVudEFwcC5fY29udGV4dC5wcm92aWRlcztcbiAgICBpZiAocHJvdmlkZXMgJiYga2V5IGluIHByb3ZpZGVzKSB7XG4gICAgICByZXR1cm4gcHJvdmlkZXNba2V5XTtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICByZXR1cm4gdHJlYXREZWZhdWx0QXNGYWN0b3J5ICYmIGlzRnVuY3Rpb24oZGVmYXVsdFZhbHVlKSA/IGRlZmF1bHRWYWx1ZS5jYWxsKGluc3RhbmNlICYmIGluc3RhbmNlLnByb3h5KSA6IGRlZmF1bHRWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShgaW5qZWN0aW9uIFwiJHtTdHJpbmcoa2V5KX1cIiBub3QgZm91bmQuYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoYGluamVjdCgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkgb3IgZnVuY3Rpb25hbCBjb21wb25lbnRzLmApO1xuICB9XG59XG5mdW5jdGlvbiBoYXNJbmplY3Rpb25Db250ZXh0KCkge1xuICByZXR1cm4gISEoY3VycmVudEluc3RhbmNlIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSB8fCBjdXJyZW50QXBwKTtcbn1cblxuZnVuY3Rpb24gaW5pdFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgaXNTdGF0ZWZ1bCwgaXNTU1IgPSBmYWxzZSkge1xuICBjb25zdCBwcm9wcyA9IHt9O1xuICBjb25zdCBhdHRycyA9IHt9O1xuICBkZWYoYXR0cnMsIEludGVybmFsT2JqZWN0S2V5LCAxKTtcbiAgaW5zdGFuY2UucHJvcHNEZWZhdWx0cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBpbnN0YW5jZS5wcm9wc09wdGlvbnNbMF0pIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvcHMpKSB7XG4gICAgICBwcm9wc1trZXldID0gdm9pZCAwO1xuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHZhbGlkYXRlUHJvcHMocmF3UHJvcHMgfHwge30sIHByb3BzLCBpbnN0YW5jZSk7XG4gIH1cbiAgaWYgKGlzU3RhdGVmdWwpIHtcbiAgICBpbnN0YW5jZS5wcm9wcyA9IGlzU1NSID8gcHJvcHMgOiBzaGFsbG93UmVhY3RpdmUocHJvcHMpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW5zdGFuY2UudHlwZS5wcm9wcykge1xuICAgICAgaW5zdGFuY2UucHJvcHMgPSBhdHRycztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UucHJvcHMgPSBwcm9wcztcbiAgICB9XG4gIH1cbiAgaW5zdGFuY2UuYXR0cnMgPSBhdHRycztcbn1cbmZ1bmN0aW9uIGlzSW5IbXJDb250ZXh0KGluc3RhbmNlKSB7XG4gIHdoaWxlIChpbnN0YW5jZSkge1xuICAgIGlmIChpbnN0YW5jZS50eXBlLl9faG1ySWQpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnBhcmVudDtcbiAgfVxufVxuZnVuY3Rpb24gdXBkYXRlUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCByYXdQcmV2UHJvcHMsIG9wdGltaXplZCkge1xuICBjb25zdCB7XG4gICAgcHJvcHMsXG4gICAgYXR0cnMsXG4gICAgdm5vZGU6IHsgcGF0Y2hGbGFnIH1cbiAgfSA9IGluc3RhbmNlO1xuICBjb25zdCByYXdDdXJyZW50UHJvcHMgPSB0b1Jhdyhwcm9wcyk7XG4gIGNvbnN0IFtvcHRpb25zXSA9IGluc3RhbmNlLnByb3BzT3B0aW9ucztcbiAgbGV0IGhhc0F0dHJzQ2hhbmdlZCA9IGZhbHNlO1xuICBpZiAoXG4gICAgLy8gYWx3YXlzIGZvcmNlIGZ1bGwgZGlmZiBpbiBkZXZcbiAgICAvLyAtICMxOTQyIGlmIGhtciBpcyBlbmFibGVkIHdpdGggc2ZjIGNvbXBvbmVudFxuICAgIC8vIC0gdml0ZSM4NzIgbm9uLXNmYyBjb21wb25lbnQgdXNlZCBieSBzZmMgY29tcG9uZW50XG4gICAgISghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSW5IbXJDb250ZXh0KGluc3RhbmNlKSkgJiYgKG9wdGltaXplZCB8fCBwYXRjaEZsYWcgPiAwKSAmJiAhKHBhdGNoRmxhZyAmIDE2KVxuICApIHtcbiAgICBpZiAocGF0Y2hGbGFnICYgOCkge1xuICAgICAgY29uc3QgcHJvcHNUb1VwZGF0ZSA9IGluc3RhbmNlLnZub2RlLmR5bmFtaWNQcm9wcztcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHNUb1VwZGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQga2V5ID0gcHJvcHNUb1VwZGF0ZVtpXTtcbiAgICAgICAgaWYgKGlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3UHJvcHNba2V5XTtcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoaGFzT3duKGF0dHJzLCBrZXkpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjYW1lbGl6ZWRLZXkgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgICAgICAgcHJvcHNbY2FtZWxpemVkS2V5XSA9IHJlc29sdmVQcm9wVmFsdWUoXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIHJhd0N1cnJlbnRQcm9wcyxcbiAgICAgICAgICAgICAgY2FtZWxpemVkS2V5LFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgIGF0dHJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpKSB7XG4gICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBsZXQga2ViYWJLZXk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcmF3Q3VycmVudFByb3BzKSB7XG4gICAgICBpZiAoIXJhd1Byb3BzIHx8IC8vIGZvciBjYW1lbENhc2VcbiAgICAgICFoYXNPd24ocmF3UHJvcHMsIGtleSkgJiYgLy8gaXQncyBwb3NzaWJsZSB0aGUgb3JpZ2luYWwgcHJvcHMgd2FzIHBhc3NlZCBpbiBhcyBrZWJhYi1jYXNlXG4gICAgICAvLyBhbmQgY29udmVydGVkIHRvIGNhbWVsQ2FzZSAoIzk1NSlcbiAgICAgICgoa2ViYWJLZXkgPSBoeXBoZW5hdGUoa2V5KSkgPT09IGtleSB8fCAhaGFzT3duKHJhd1Byb3BzLCBrZWJhYktleSkpKSB7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKHJhd1ByZXZQcm9wcyAmJiAvLyBmb3IgY2FtZWxDYXNlXG4gICAgICAgICAgKHJhd1ByZXZQcm9wc1trZXldICE9PSB2b2lkIDAgfHwgLy8gZm9yIGtlYmFiLWNhc2VcbiAgICAgICAgICByYXdQcmV2UHJvcHNba2ViYWJLZXldICE9PSB2b2lkIDApKSB7XG4gICAgICAgICAgICBwcm9wc1trZXldID0gcmVzb2x2ZVByb3BWYWx1ZShcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgcmF3Q3VycmVudFByb3BzLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBwcm9wc1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhdHRycyAhPT0gcmF3Q3VycmVudFByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgICAgICBpZiAoIXJhd1Byb3BzIHx8ICFoYXNPd24ocmF3UHJvcHMsIGtleSkgJiYgdHJ1ZSkge1xuICAgICAgICAgIGRlbGV0ZSBhdHRyc1trZXldO1xuICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGhhc0F0dHJzQ2hhbmdlZCkge1xuICAgIHRyaWdnZXIoaW5zdGFuY2UsIFwic2V0XCIsIFwiJGF0dHJzXCIpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgdmFsaWRhdGVQcm9wcyhyYXdQcm9wcyB8fCB7fSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0RnVsbFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcHJvcHMsIGF0dHJzKSB7XG4gIGNvbnN0IFtvcHRpb25zLCBuZWVkQ2FzdEtleXNdID0gaW5zdGFuY2UucHJvcHNPcHRpb25zO1xuICBsZXQgaGFzQXR0cnNDaGFuZ2VkID0gZmFsc2U7XG4gIGxldCByYXdDYXN0VmFsdWVzO1xuICBpZiAocmF3UHJvcHMpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gcmF3UHJvcHMpIHtcbiAgICAgIGlmIChpc1Jlc2VydmVkUHJvcChrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSByYXdQcm9wc1trZXldO1xuICAgICAgbGV0IGNhbWVsS2V5O1xuICAgICAgaWYgKG9wdGlvbnMgJiYgaGFzT3duKG9wdGlvbnMsIGNhbWVsS2V5ID0gY2FtZWxpemUoa2V5KSkpIHtcbiAgICAgICAgaWYgKCFuZWVkQ2FzdEtleXMgfHwgIW5lZWRDYXN0S2V5cy5pbmNsdWRlcyhjYW1lbEtleSkpIHtcbiAgICAgICAgICBwcm9wc1tjYW1lbEtleV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAocmF3Q2FzdFZhbHVlcyB8fCAocmF3Q2FzdFZhbHVlcyA9IHt9KSlbY2FtZWxLZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gYXR0cnMpIHx8IHZhbHVlICE9PSBhdHRyc1trZXldKSB7XG4gICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG5lZWRDYXN0S2V5cykge1xuICAgIGNvbnN0IHJhd0N1cnJlbnRQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICBjb25zdCBjYXN0VmFsdWVzID0gcmF3Q2FzdFZhbHVlcyB8fCBFTVBUWV9PQko7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZWVkQ2FzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IG5lZWRDYXN0S2V5c1tpXTtcbiAgICAgIHByb3BzW2tleV0gPSByZXNvbHZlUHJvcFZhbHVlKFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICByYXdDdXJyZW50UHJvcHMsXG4gICAgICAgIGtleSxcbiAgICAgICAgY2FzdFZhbHVlc1trZXldLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgIWhhc093bihjYXN0VmFsdWVzLCBrZXkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzQXR0cnNDaGFuZ2VkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVByb3BWYWx1ZShvcHRpb25zLCBwcm9wcywga2V5LCB2YWx1ZSwgaW5zdGFuY2UsIGlzQWJzZW50KSB7XG4gIGNvbnN0IG9wdCA9IG9wdGlvbnNba2V5XTtcbiAgaWYgKG9wdCAhPSBudWxsKSB7XG4gICAgY29uc3QgaGFzRGVmYXVsdCA9IGhhc093bihvcHQsIFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoaGFzRGVmYXVsdCAmJiB2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBvcHQuZGVmYXVsdDtcbiAgICAgIGlmIChvcHQudHlwZSAhPT0gRnVuY3Rpb24gJiYgIW9wdC5za2lwRmFjdG9yeSAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgeyBwcm9wc0RlZmF1bHRzIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgaWYgKGtleSBpbiBwcm9wc0RlZmF1bHRzKSB7XG4gICAgICAgICAgdmFsdWUgPSBwcm9wc0RlZmF1bHRzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICAgIHZhbHVlID0gcHJvcHNEZWZhdWx0c1trZXldID0gZGVmYXVsdFZhbHVlLmNhbGwoXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3B0WzAgLyogc2hvdWxkQ2FzdCAqL10pIHtcbiAgICAgIGlmIChpc0Fic2VudCAmJiAhaGFzRGVmYXVsdCkge1xuICAgICAgICB2YWx1ZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChvcHRbMSAvKiBzaG91bGRDYXN0VHJ1ZSAqL10gJiYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlID09PSBoeXBoZW5hdGUoa2V5KSkpIHtcbiAgICAgICAgdmFsdWUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBub3JtYWxpemVQcm9wc09wdGlvbnMoY29tcCwgYXBwQ29udGV4dCwgYXNNaXhpbiA9IGZhbHNlKSB7XG4gIGNvbnN0IGNhY2hlID0gYXBwQ29udGV4dC5wcm9wc0NhY2hlO1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoY29tcCk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHJhdyA9IGNvbXAucHJvcHM7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fTtcbiAgY29uc3QgbmVlZENhc3RLZXlzID0gW107XG4gIGxldCBoYXNFeHRlbmRzID0gZmFsc2U7XG4gIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fICYmICFpc0Z1bmN0aW9uKGNvbXApKSB7XG4gICAgY29uc3QgZXh0ZW5kUHJvcHMgPSAocmF3MikgPT4ge1xuICAgICAgaGFzRXh0ZW5kcyA9IHRydWU7XG4gICAgICBjb25zdCBbcHJvcHMsIGtleXNdID0gbm9ybWFsaXplUHJvcHNPcHRpb25zKHJhdzIsIGFwcENvbnRleHQsIHRydWUpO1xuICAgICAgZXh0ZW5kKG5vcm1hbGl6ZWQsIHByb3BzKTtcbiAgICAgIGlmIChrZXlzKVxuICAgICAgICBuZWVkQ2FzdEtleXMucHVzaCguLi5rZXlzKTtcbiAgICB9O1xuICAgIGlmICghYXNNaXhpbiAmJiBhcHBDb250ZXh0Lm1peGlucy5sZW5ndGgpIHtcbiAgICAgIGFwcENvbnRleHQubWl4aW5zLmZvckVhY2goZXh0ZW5kUHJvcHMpO1xuICAgIH1cbiAgICBpZiAoY29tcC5leHRlbmRzKSB7XG4gICAgICBleHRlbmRQcm9wcyhjb21wLmV4dGVuZHMpO1xuICAgIH1cbiAgICBpZiAoY29tcC5taXhpbnMpIHtcbiAgICAgIGNvbXAubWl4aW5zLmZvckVhY2goZXh0ZW5kUHJvcHMpO1xuICAgIH1cbiAgfVxuICBpZiAoIXJhdyAmJiAhaGFzRXh0ZW5kcykge1xuICAgIGlmIChpc09iamVjdChjb21wKSkge1xuICAgICAgY2FjaGUuc2V0KGNvbXAsIEVNUFRZX0FSUik7XG4gICAgfVxuICAgIHJldHVybiBFTVBUWV9BUlI7XG4gIH1cbiAgaWYgKGlzQXJyYXkocmF3KSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNTdHJpbmcocmF3W2ldKSkge1xuICAgICAgICB3YXJuJDEoYHByb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC5gLCByYXdbaV0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9ybWFsaXplZEtleSA9IGNhbWVsaXplKHJhd1tpXSk7XG4gICAgICBpZiAodmFsaWRhdGVQcm9wTmFtZShub3JtYWxpemVkS2V5KSkge1xuICAgICAgICBub3JtYWxpemVkW25vcm1hbGl6ZWRLZXldID0gRU1QVFlfT0JKO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChyYXcpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNPYmplY3QocmF3KSkge1xuICAgICAgd2FybiQxKGBpbnZhbGlkIHByb3BzIG9wdGlvbnNgLCByYXcpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiByYXcpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgaWYgKHZhbGlkYXRlUHJvcE5hbWUobm9ybWFsaXplZEtleSkpIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gcmF3W2tleV07XG4gICAgICAgIGNvbnN0IHByb3AgPSBub3JtYWxpemVkW25vcm1hbGl6ZWRLZXldID0gaXNBcnJheShvcHQpIHx8IGlzRnVuY3Rpb24ob3B0KSA/IHsgdHlwZTogb3B0IH0gOiBleHRlbmQoe30sIG9wdCk7XG4gICAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgICAgY29uc3QgYm9vbGVhbkluZGV4ID0gZ2V0VHlwZUluZGV4KEJvb2xlYW4sIHByb3AudHlwZSk7XG4gICAgICAgICAgY29uc3Qgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpO1xuICAgICAgICAgIHByb3BbMCAvKiBzaG91bGRDYXN0ICovXSA9IGJvb2xlYW5JbmRleCA+IC0xO1xuICAgICAgICAgIHByb3BbMSAvKiBzaG91bGRDYXN0VHJ1ZSAqL10gPSBzdHJpbmdJbmRleCA8IDAgfHwgYm9vbGVhbkluZGV4IDwgc3RyaW5nSW5kZXg7XG4gICAgICAgICAgaWYgKGJvb2xlYW5JbmRleCA+IC0xIHx8IGhhc093bihwcm9wLCBcImRlZmF1bHRcIikpIHtcbiAgICAgICAgICAgIG5lZWRDYXN0S2V5cy5wdXNoKG5vcm1hbGl6ZWRLZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCByZXMgPSBbbm9ybWFsaXplZCwgbmVlZENhc3RLZXlzXTtcbiAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgY2FjaGUuc2V0KGNvbXAsIHJlcyk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcE5hbWUoa2V5KSB7XG4gIGlmIChrZXlbMF0gIT09IFwiJFwiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4kMShgSW52YWxpZCBwcm9wIG5hbWU6IFwiJHtrZXl9XCIgaXMgYSByZXNlcnZlZCBwcm9wZXJ0eS5gKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBnZXRUeXBlKGN0b3IpIHtcbiAgY29uc3QgbWF0Y2ggPSBjdG9yICYmIGN0b3IudG9TdHJpbmcoKS5tYXRjaCgvXlxccyooZnVuY3Rpb258Y2xhc3MpIChcXHcrKS8pO1xuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsyXSA6IGN0b3IgPT09IG51bGwgPyBcIm51bGxcIiA6IFwiXCI7XG59XG5mdW5jdGlvbiBpc1NhbWVUeXBlKGEsIGIpIHtcbiAgcmV0dXJuIGdldFR5cGUoYSkgPT09IGdldFR5cGUoYik7XG59XG5mdW5jdGlvbiBnZXRUeXBlSW5kZXgodHlwZSwgZXhwZWN0ZWRUeXBlcykge1xuICBpZiAoaXNBcnJheShleHBlY3RlZFR5cGVzKSkge1xuICAgIHJldHVybiBleHBlY3RlZFR5cGVzLmZpbmRJbmRleCgodCkgPT4gaXNTYW1lVHlwZSh0LCB0eXBlKSk7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihleHBlY3RlZFR5cGVzKSkge1xuICAgIHJldHVybiBpc1NhbWVUeXBlKGV4cGVjdGVkVHlwZXMsIHR5cGUpID8gMCA6IC0xO1xuICB9XG4gIHJldHVybiAtMTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcHMocmF3UHJvcHMsIHByb3BzLCBpbnN0YW5jZSkge1xuICBjb25zdCByZXNvbHZlZFZhbHVlcyA9IHRvUmF3KHByb3BzKTtcbiAgY29uc3Qgb3B0aW9ucyA9IGluc3RhbmNlLnByb3BzT3B0aW9uc1swXTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucykge1xuICAgIGxldCBvcHQgPSBvcHRpb25zW2tleV07XG4gICAgaWYgKG9wdCA9PSBudWxsKVxuICAgICAgY29udGludWU7XG4gICAgdmFsaWRhdGVQcm9wKFxuICAgICAga2V5LFxuICAgICAgcmVzb2x2ZWRWYWx1ZXNba2V5XSxcbiAgICAgIG9wdCxcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkocmVzb2x2ZWRWYWx1ZXMpIDogcmVzb2x2ZWRWYWx1ZXMsXG4gICAgICAhaGFzT3duKHJhd1Byb3BzLCBrZXkpICYmICFoYXNPd24ocmF3UHJvcHMsIGh5cGhlbmF0ZShrZXkpKVxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcChuYW1lLCB2YWx1ZSwgcHJvcCwgcHJvcHMsIGlzQWJzZW50KSB7XG4gIGNvbnN0IHsgdHlwZSwgcmVxdWlyZWQsIHZhbGlkYXRvciwgc2tpcENoZWNrIH0gPSBwcm9wO1xuICBpZiAocmVxdWlyZWQgJiYgaXNBYnNlbnQpIHtcbiAgICB3YXJuJDEoJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogXCInICsgbmFtZSArICdcIicpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcmVxdWlyZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlICE9PSB0cnVlICYmICFza2lwQ2hlY2spIHtcbiAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuICAgIGNvbnN0IHR5cGVzID0gaXNBcnJheSh0eXBlKSA/IHR5cGUgOiBbdHlwZV07XG4gICAgY29uc3QgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoICYmICFpc1ZhbGlkOyBpKyspIHtcbiAgICAgIGNvbnN0IHsgdmFsaWQsIGV4cGVjdGVkVHlwZSB9ID0gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZXNbaV0pO1xuICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGV4cGVjdGVkVHlwZSB8fCBcIlwiKTtcbiAgICAgIGlzVmFsaWQgPSB2YWxpZDtcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB3YXJuJDEoZ2V0SW52YWxpZFR5cGVNZXNzYWdlKG5hbWUsIHZhbHVlLCBleHBlY3RlZFR5cGVzKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGlmICh2YWxpZGF0b3IgJiYgIXZhbGlkYXRvcih2YWx1ZSwgcHJvcHMpKSB7XG4gICAgd2FybiQxKCdJbnZhbGlkIHByb3A6IGN1c3RvbSB2YWxpZGF0b3IgY2hlY2sgZmFpbGVkIGZvciBwcm9wIFwiJyArIG5hbWUgKyAnXCIuJyk7XG4gIH1cbn1cbmNvbnN0IGlzU2ltcGxlVHlwZSA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFxuICBcIlN0cmluZyxOdW1iZXIsQm9vbGVhbixGdW5jdGlvbixTeW1ib2wsQmlnSW50XCJcbik7XG5mdW5jdGlvbiBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlKSB7XG4gIGxldCB2YWxpZDtcbiAgY29uc3QgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTtcbiAgaWYgKGlzU2ltcGxlVHlwZShleHBlY3RlZFR5cGUpKSB7XG4gICAgY29uc3QgdCA9IHR5cGVvZiB2YWx1ZTtcbiAgICB2YWxpZCA9IHQgPT09IGV4cGVjdGVkVHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghdmFsaWQgJiYgdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJPYmplY3RcIikge1xuICAgIHZhbGlkID0gaXNPYmplY3QodmFsdWUpO1xuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJBcnJheVwiKSB7XG4gICAgdmFsaWQgPSBpc0FycmF5KHZhbHVlKTtcbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwibnVsbFwiKSB7XG4gICAgdmFsaWQgPSB2YWx1ZSA9PT0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHZhbGlkLFxuICAgIGV4cGVjdGVkVHlwZVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0SW52YWxpZFR5cGVNZXNzYWdlKG5hbWUsIHZhbHVlLCBleHBlY3RlZFR5cGVzKSB7XG4gIGlmIChleHBlY3RlZFR5cGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBgUHJvcCB0eXBlIFtdIGZvciBwcm9wIFwiJHtuYW1lfVwiIHdvbid0IG1hdGNoIGFueXRoaW5nLiBEaWQgeW91IG1lYW4gdG8gdXNlIHR5cGUgQXJyYXkgaW5zdGVhZD9gO1xuICB9XG4gIGxldCBtZXNzYWdlID0gYEludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCIke25hbWV9XCIuIEV4cGVjdGVkICR7ZXhwZWN0ZWRUeXBlcy5tYXAoY2FwaXRhbGl6ZSkuam9pbihcIiB8IFwiKX1gO1xuICBjb25zdCBleHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGVzWzBdO1xuICBjb25zdCByZWNlaXZlZFR5cGUgPSB0b1Jhd1R5cGUodmFsdWUpO1xuICBjb25zdCBleHBlY3RlZFZhbHVlID0gc3R5bGVWYWx1ZSh2YWx1ZSwgZXhwZWN0ZWRUeXBlKTtcbiAgY29uc3QgcmVjZWl2ZWRWYWx1ZSA9IHN0eWxlVmFsdWUodmFsdWUsIHJlY2VpdmVkVHlwZSk7XG4gIGlmIChleHBlY3RlZFR5cGVzLmxlbmd0aCA9PT0gMSAmJiBpc0V4cGxpY2FibGUoZXhwZWN0ZWRUeXBlKSAmJiAhaXNCb29sZWFuKGV4cGVjdGVkVHlwZSwgcmVjZWl2ZWRUeXBlKSkge1xuICAgIG1lc3NhZ2UgKz0gYCB3aXRoIHZhbHVlICR7ZXhwZWN0ZWRWYWx1ZX1gO1xuICB9XG4gIG1lc3NhZ2UgKz0gYCwgZ290ICR7cmVjZWl2ZWRUeXBlfSBgO1xuICBpZiAoaXNFeHBsaWNhYmxlKHJlY2VpdmVkVHlwZSkpIHtcbiAgICBtZXNzYWdlICs9IGB3aXRoIHZhbHVlICR7cmVjZWl2ZWRWYWx1ZX0uYDtcbiAgfVxuICByZXR1cm4gbWVzc2FnZTtcbn1cbmZ1bmN0aW9uIHN0eWxlVmFsdWUodmFsdWUsIHR5cGUpIHtcbiAgaWYgKHR5cGUgPT09IFwiU3RyaW5nXCIpIHtcbiAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJOdW1iZXJcIikge1xuICAgIHJldHVybiBgJHtOdW1iZXIodmFsdWUpfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzRXhwbGljYWJsZSh0eXBlKSB7XG4gIGNvbnN0IGV4cGxpY2l0VHlwZXMgPSBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCJdO1xuICByZXR1cm4gZXhwbGljaXRUeXBlcy5zb21lKChlbGVtKSA9PiB0eXBlLnRvTG93ZXJDYXNlKCkgPT09IGVsZW0pO1xufVxuZnVuY3Rpb24gaXNCb29sZWFuKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3Muc29tZSgoZWxlbSkgPT4gZWxlbS50b0xvd2VyQ2FzZSgpID09PSBcImJvb2xlYW5cIik7XG59XG5cbmNvbnN0IGlzSW50ZXJuYWxLZXkgPSAoa2V5KSA9PiBrZXlbMF0gPT09IFwiX1wiIHx8IGtleSA9PT0gXCIkc3RhYmxlXCI7XG5jb25zdCBub3JtYWxpemVTbG90VmFsdWUgPSAodmFsdWUpID0+IGlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKG5vcm1hbGl6ZVZOb2RlKSA6IFtub3JtYWxpemVWTm9kZSh2YWx1ZSldO1xuY29uc3Qgbm9ybWFsaXplU2xvdCA9IChrZXksIHJhd1Nsb3QsIGN0eCkgPT4ge1xuICBpZiAocmF3U2xvdC5fbikge1xuICAgIHJldHVybiByYXdTbG90O1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB3aXRoQ3R4KCguLi5hcmdzKSA9PiB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY3VycmVudEluc3RhbmNlKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBTbG90IFwiJHtrZXl9XCIgaW52b2tlZCBvdXRzaWRlIG9mIHRoZSByZW5kZXIgZnVuY3Rpb246IHRoaXMgd2lsbCBub3QgdHJhY2sgZGVwZW5kZW5jaWVzIHVzZWQgaW4gdGhlIHNsb3QuIEludm9rZSB0aGUgc2xvdCBmdW5jdGlvbiBpbnNpZGUgdGhlIHJlbmRlciBmdW5jdGlvbiBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVTbG90VmFsdWUocmF3U2xvdCguLi5hcmdzKSk7XG4gIH0sIGN0eCk7XG4gIG5vcm1hbGl6ZWQuX2MgPSBmYWxzZTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59O1xuY29uc3Qgbm9ybWFsaXplT2JqZWN0U2xvdHMgPSAocmF3U2xvdHMsIHNsb3RzLCBpbnN0YW5jZSkgPT4ge1xuICBjb25zdCBjdHggPSByYXdTbG90cy5fY3R4O1xuICBmb3IgKGNvbnN0IGtleSBpbiByYXdTbG90cykge1xuICAgIGlmIChpc0ludGVybmFsS2V5KGtleSkpXG4gICAgICBjb250aW51ZTtcbiAgICBjb25zdCB2YWx1ZSA9IHJhd1Nsb3RzW2tleV07XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICBzbG90c1trZXldID0gbm9ybWFsaXplU2xvdChrZXksIHZhbHVlLCBjdHgpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHJ1ZSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYE5vbi1mdW5jdGlvbiB2YWx1ZSBlbmNvdW50ZXJlZCBmb3Igc2xvdCBcIiR7a2V5fVwiLiBQcmVmZXIgZnVuY3Rpb24gc2xvdHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplU2xvdFZhbHVlKHZhbHVlKTtcbiAgICAgIHNsb3RzW2tleV0gPSAoKSA9PiBub3JtYWxpemVkO1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IG5vcm1hbGl6ZVZOb2RlU2xvdHMgPSAoaW5zdGFuY2UsIGNoaWxkcmVuKSA9PiB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0tlZXBBbGl2ZShpbnN0YW5jZS52bm9kZSkgJiYgdHJ1ZSkge1xuICAgIHdhcm4kMShcbiAgICAgIGBOb24tZnVuY3Rpb24gdmFsdWUgZW5jb3VudGVyZWQgZm9yIGRlZmF1bHQgc2xvdC4gUHJlZmVyIGZ1bmN0aW9uIHNsb3RzIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuYFxuICAgICk7XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNsb3RWYWx1ZShjaGlsZHJlbik7XG4gIGluc3RhbmNlLnNsb3RzLmRlZmF1bHQgPSAoKSA9PiBub3JtYWxpemVkO1xufTtcbmNvbnN0IGluaXRTbG90cyA9IChpbnN0YW5jZSwgY2hpbGRyZW4pID0+IHtcbiAgaWYgKGluc3RhbmNlLnZub2RlLnNoYXBlRmxhZyAmIDMyKSB7XG4gICAgY29uc3QgdHlwZSA9IGNoaWxkcmVuLl87XG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIGluc3RhbmNlLnNsb3RzID0gdG9SYXcoY2hpbGRyZW4pO1xuICAgICAgZGVmKGNoaWxkcmVuLCBcIl9cIiwgdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vcm1hbGl6ZU9iamVjdFNsb3RzKFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgaW5zdGFuY2Uuc2xvdHMgPSB7fSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGluc3RhbmNlLnNsb3RzID0ge307XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBub3JtYWxpemVWTm9kZVNsb3RzKGluc3RhbmNlLCBjaGlsZHJlbik7XG4gICAgfVxuICB9XG4gIGRlZihpbnN0YW5jZS5zbG90cywgSW50ZXJuYWxPYmplY3RLZXksIDEpO1xufTtcbmNvbnN0IHVwZGF0ZVNsb3RzID0gKGluc3RhbmNlLCBjaGlsZHJlbiwgb3B0aW1pemVkKSA9PiB7XG4gIGNvbnN0IHsgdm5vZGUsIHNsb3RzIH0gPSBpbnN0YW5jZTtcbiAgbGV0IG5lZWREZWxldGlvbkNoZWNrID0gdHJ1ZTtcbiAgbGV0IGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldCA9IEVNUFRZX09CSjtcbiAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDMyKSB7XG4gICAgY29uc3QgdHlwZSA9IGNoaWxkcmVuLl87XG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSG1yVXBkYXRpbmcpIHtcbiAgICAgICAgZXh0ZW5kKHNsb3RzLCBjaGlsZHJlbik7XG4gICAgICAgIHRyaWdnZXIoaW5zdGFuY2UsIFwic2V0XCIsIFwiJHNsb3RzXCIpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpbWl6ZWQgJiYgdHlwZSA9PT0gMSkge1xuICAgICAgICBuZWVkRGVsZXRpb25DaGVjayA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXh0ZW5kKHNsb3RzLCBjaGlsZHJlbik7XG4gICAgICAgIGlmICghb3B0aW1pemVkICYmIHR5cGUgPT09IDEpIHtcbiAgICAgICAgICBkZWxldGUgc2xvdHMuXztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZWVkRGVsZXRpb25DaGVjayA9ICFjaGlsZHJlbi4kc3RhYmxlO1xuICAgICAgbm9ybWFsaXplT2JqZWN0U2xvdHMoY2hpbGRyZW4sIHNsb3RzKTtcbiAgICB9XG4gICAgZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0ID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW4pIHtcbiAgICBub3JtYWxpemVWTm9kZVNsb3RzKGluc3RhbmNlLCBjaGlsZHJlbik7XG4gICAgZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0ID0geyBkZWZhdWx0OiAxIH07XG4gIH1cbiAgaWYgKG5lZWREZWxldGlvbkNoZWNrKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2xvdHMpIHtcbiAgICAgIGlmICghaXNJbnRlcm5hbEtleShrZXkpICYmIGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldFtrZXldID09IG51bGwpIHtcbiAgICAgICAgZGVsZXRlIHNsb3RzW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBzZXRSZWYocmF3UmVmLCBvbGRSYXdSZWYsIHBhcmVudFN1c3BlbnNlLCB2bm9kZSwgaXNVbm1vdW50ID0gZmFsc2UpIHtcbiAgaWYgKGlzQXJyYXkocmF3UmVmKSkge1xuICAgIHJhd1JlZi5mb3JFYWNoKFxuICAgICAgKHIsIGkpID0+IHNldFJlZihcbiAgICAgICAgcixcbiAgICAgICAgb2xkUmF3UmVmICYmIChpc0FycmF5KG9sZFJhd1JlZikgPyBvbGRSYXdSZWZbaV0gOiBvbGRSYXdSZWYpLFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGlzVW5tb3VudFxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpc0FzeW5jV3JhcHBlcih2bm9kZSkgJiYgIWlzVW5tb3VudCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWZWYWx1ZSA9IHZub2RlLnNoYXBlRmxhZyAmIDQgPyBnZXRFeHBvc2VQcm94eSh2bm9kZS5jb21wb25lbnQpIHx8IHZub2RlLmNvbXBvbmVudC5wcm94eSA6IHZub2RlLmVsO1xuICBjb25zdCB2YWx1ZSA9IGlzVW5tb3VudCA/IG51bGwgOiByZWZWYWx1ZTtcbiAgY29uc3QgeyBpOiBvd25lciwgcjogcmVmIH0gPSByYXdSZWY7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFvd25lcikge1xuICAgIHdhcm4kMShcbiAgICAgIGBNaXNzaW5nIHJlZiBvd25lciBjb250ZXh0LiByZWYgY2Fubm90IGJlIHVzZWQgb24gaG9pc3RlZCB2bm9kZXMuIEEgdm5vZGUgd2l0aCByZWYgbXVzdCBiZSBjcmVhdGVkIGluc2lkZSB0aGUgcmVuZGVyIGZ1bmN0aW9uLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBvbGRSZWYgPSBvbGRSYXdSZWYgJiYgb2xkUmF3UmVmLnI7XG4gIGNvbnN0IHJlZnMgPSBvd25lci5yZWZzID09PSBFTVBUWV9PQkogPyBvd25lci5yZWZzID0ge30gOiBvd25lci5yZWZzO1xuICBjb25zdCBzZXR1cFN0YXRlID0gb3duZXIuc2V0dXBTdGF0ZTtcbiAgaWYgKG9sZFJlZiAhPSBudWxsICYmIG9sZFJlZiAhPT0gcmVmKSB7XG4gICAgaWYgKGlzU3RyaW5nKG9sZFJlZikpIHtcbiAgICAgIHJlZnNbb2xkUmVmXSA9IG51bGw7XG4gICAgICBpZiAoaGFzT3duKHNldHVwU3RhdGUsIG9sZFJlZikpIHtcbiAgICAgICAgc2V0dXBTdGF0ZVtvbGRSZWZdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzUmVmKG9sZFJlZikpIHtcbiAgICAgIG9sZFJlZi52YWx1ZSA9IG51bGw7XG4gICAgfVxuICB9XG4gIGlmIChpc0Z1bmN0aW9uKHJlZikpIHtcbiAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcocmVmLCBvd25lciwgMTIsIFt2YWx1ZSwgcmVmc10pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IF9pc1N0cmluZyA9IGlzU3RyaW5nKHJlZik7XG4gICAgY29uc3QgX2lzUmVmID0gaXNSZWYocmVmKTtcbiAgICBpZiAoX2lzU3RyaW5nIHx8IF9pc1JlZikge1xuICAgICAgY29uc3QgZG9TZXQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChyYXdSZWYuZikge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gX2lzU3RyaW5nID8gaGFzT3duKHNldHVwU3RhdGUsIHJlZikgPyBzZXR1cFN0YXRlW3JlZl0gOiByZWZzW3JlZl0gOiByZWYudmFsdWU7XG4gICAgICAgICAgaWYgKGlzVW5tb3VudCkge1xuICAgICAgICAgICAgaXNBcnJheShleGlzdGluZykgJiYgcmVtb3ZlKGV4aXN0aW5nLCByZWZWYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgICAgICAgICAgaWYgKF9pc1N0cmluZykge1xuICAgICAgICAgICAgICAgIHJlZnNbcmVmXSA9IFtyZWZWYWx1ZV07XG4gICAgICAgICAgICAgICAgaWYgKGhhc093bihzZXR1cFN0YXRlLCByZWYpKSB7XG4gICAgICAgICAgICAgICAgICBzZXR1cFN0YXRlW3JlZl0gPSByZWZzW3JlZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlZi52YWx1ZSA9IFtyZWZWYWx1ZV07XG4gICAgICAgICAgICAgICAgaWYgKHJhd1JlZi5rKVxuICAgICAgICAgICAgICAgICAgcmVmc1tyYXdSZWYua10gPSByZWYudmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nLmluY2x1ZGVzKHJlZlZhbHVlKSkge1xuICAgICAgICAgICAgICBleGlzdGluZy5wdXNoKHJlZlZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX2lzU3RyaW5nKSB7XG4gICAgICAgICAgcmVmc1tyZWZdID0gdmFsdWU7XG4gICAgICAgICAgaWYgKGhhc093bihzZXR1cFN0YXRlLCByZWYpKSB7XG4gICAgICAgICAgICBzZXR1cFN0YXRlW3JlZl0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX2lzUmVmKSB7XG4gICAgICAgICAgcmVmLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgaWYgKHJhd1JlZi5rKVxuICAgICAgICAgICAgcmVmc1tyYXdSZWYua10gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFwiSW52YWxpZCB0ZW1wbGF0ZSByZWYgdHlwZTpcIiwgcmVmLCBgKCR7dHlwZW9mIHJlZn0pYCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZG9TZXQuaWQgPSAtMTtcbiAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KGRvU2V0LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1NldCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybiQxKFwiSW52YWxpZCB0ZW1wbGF0ZSByZWYgdHlwZTpcIiwgcmVmLCBgKCR7dHlwZW9mIHJlZn0pYCk7XG4gICAgfVxuICB9XG59XG5cbmxldCBoYXNNaXNtYXRjaCA9IGZhbHNlO1xuY29uc3QgaXNTVkdDb250YWluZXIgPSAoY29udGFpbmVyKSA9PiBjb250YWluZXIubmFtZXNwYWNlVVJJLmluY2x1ZGVzKFwic3ZnXCIpICYmIGNvbnRhaW5lci50YWdOYW1lICE9PSBcImZvcmVpZ25PYmplY3RcIjtcbmNvbnN0IGlzTWF0aE1MQ29udGFpbmVyID0gKGNvbnRhaW5lcikgPT4gY29udGFpbmVyLm5hbWVzcGFjZVVSSS5pbmNsdWRlcyhcIk1hdGhNTFwiKTtcbmNvbnN0IGdldENvbnRhaW5lclR5cGUgPSAoY29udGFpbmVyKSA9PiB7XG4gIGlmIChpc1NWR0NvbnRhaW5lcihjb250YWluZXIpKVxuICAgIHJldHVybiBcInN2Z1wiO1xuICBpZiAoaXNNYXRoTUxDb250YWluZXIoY29udGFpbmVyKSlcbiAgICByZXR1cm4gXCJtYXRobWxcIjtcbiAgcmV0dXJuIHZvaWQgMDtcbn07XG5jb25zdCBpc0NvbW1lbnQgPSAobm9kZSkgPT4gbm9kZS5ub2RlVHlwZSA9PT0gOCAvKiBDT01NRU5UICovO1xuZnVuY3Rpb24gY3JlYXRlSHlkcmF0aW9uRnVuY3Rpb25zKHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gIGNvbnN0IHtcbiAgICBtdDogbW91bnRDb21wb25lbnQsXG4gICAgcDogcGF0Y2gsXG4gICAgbzoge1xuICAgICAgcGF0Y2hQcm9wLFxuICAgICAgY3JlYXRlVGV4dCxcbiAgICAgIG5leHRTaWJsaW5nLFxuICAgICAgcGFyZW50Tm9kZSxcbiAgICAgIHJlbW92ZSxcbiAgICAgIGluc2VydCxcbiAgICAgIGNyZWF0ZUNvbW1lbnRcbiAgICB9XG4gIH0gPSByZW5kZXJlckludGVybmFscztcbiAgY29uc3QgaHlkcmF0ZSA9ICh2bm9kZSwgY29udGFpbmVyKSA9PiB7XG4gICAgaWYgKCFjb250YWluZXIuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIHdhcm4kMShcbiAgICAgICAgYEF0dGVtcHRpbmcgdG8gaHlkcmF0ZSBleGlzdGluZyBtYXJrdXAgYnV0IGNvbnRhaW5lciBpcyBlbXB0eS4gUGVyZm9ybWluZyBmdWxsIG1vdW50IGluc3RlYWQuYFxuICAgICAgKTtcbiAgICAgIHBhdGNoKG51bGwsIHZub2RlLCBjb250YWluZXIpO1xuICAgICAgZmx1c2hQb3N0Rmx1c2hDYnMoKTtcbiAgICAgIGNvbnRhaW5lci5fdm5vZGUgPSB2bm9kZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaGFzTWlzbWF0Y2ggPSBmYWxzZTtcbiAgICBoeWRyYXRlTm9kZShjb250YWluZXIuZmlyc3RDaGlsZCwgdm5vZGUsIG51bGwsIG51bGwsIG51bGwpO1xuICAgIGZsdXNoUG9zdEZsdXNoQ2JzKCk7XG4gICAgY29udGFpbmVyLl92bm9kZSA9IHZub2RlO1xuICAgIGlmIChoYXNNaXNtYXRjaCAmJiB0cnVlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBIeWRyYXRpb24gY29tcGxldGVkIGJ1dCBjb250YWlucyBtaXNtYXRjaGVzLmApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaHlkcmF0ZU5vZGUgPSAobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCBpc0ZyYWdtZW50U3RhcnQgPSBpc0NvbW1lbnQobm9kZSkgJiYgbm9kZS5kYXRhID09PSBcIltcIjtcbiAgICBjb25zdCBvbk1pc21hdGNoID0gKCkgPT4gaGFuZGxlTWlzbWF0Y2goXG4gICAgICBub2RlLFxuICAgICAgdm5vZGUsXG4gICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgIGlzRnJhZ21lbnRTdGFydFxuICAgICk7XG4gICAgY29uc3QgeyB0eXBlLCByZWYsIHNoYXBlRmxhZywgcGF0Y2hGbGFnIH0gPSB2bm9kZTtcbiAgICBsZXQgZG9tVHlwZSA9IG5vZGUubm9kZVR5cGU7XG4gICAgdm5vZGUuZWwgPSBub2RlO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgaWYgKCEoXCJfX3Zub2RlXCIgaW4gbm9kZSkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIFwiX192bm9kZVwiLCB7XG4gICAgICAgICAgdmFsdWU6IHZub2RlLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCEoXCJfX3Z1ZVBhcmVudENvbXBvbmVudFwiIGluIG5vZGUpKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCBcIl9fdnVlUGFyZW50Q29tcG9uZW50XCIsIHtcbiAgICAgICAgICB2YWx1ZTogcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGF0Y2hGbGFnID09PSAtMikge1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICB2bm9kZS5keW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBsZXQgbmV4dE5vZGUgPSBudWxsO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUZXh0OlxuICAgICAgICBpZiAoZG9tVHlwZSAhPT0gMyAvKiBURVhUICovKSB7XG4gICAgICAgICAgaWYgKHZub2RlLmNoaWxkcmVuID09PSBcIlwiKSB7XG4gICAgICAgICAgICBpbnNlcnQodm5vZGUuZWwgPSBjcmVhdGVUZXh0KFwiXCIpLCBwYXJlbnROb2RlKG5vZGUpLCBub2RlKTtcbiAgICAgICAgICAgIG5leHROb2RlID0gbm9kZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChub2RlLmRhdGEgIT09IHZub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIHdhcm4kMShcbiAgICAgICAgICAgICAgYEh5ZHJhdGlvbiB0ZXh0IG1pc21hdGNoIGluYCxcbiAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLFxuICAgICAgICAgICAgICBgXG4gIC0gcmVuZGVyZWQgb24gc2VydmVyOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YVxuICAgICAgICAgICAgICApfVxuICAtIGV4cGVjdGVkIG9uIGNsaWVudDogJHtKU09OLnN0cmluZ2lmeSh2bm9kZS5jaGlsZHJlbil9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG5vZGUuZGF0YSA9IHZub2RlLmNoaWxkcmVuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb21tZW50OlxuICAgICAgICBpZiAoaXNUZW1wbGF0ZU5vZGUobm9kZSkpIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICAgIHJlcGxhY2VOb2RlKFxuICAgICAgICAgICAgdm5vZGUuZWwgPSBub2RlLmNvbnRlbnQuZmlyc3RDaGlsZCxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGRvbVR5cGUgIT09IDggLyogQ09NTUVOVCAqLyB8fCBpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGF0aWM6XG4gICAgICAgIGlmIChpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICBub2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgZG9tVHlwZSA9IG5vZGUubm9kZVR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvbVR5cGUgPT09IDEgLyogRUxFTUVOVCAqLyB8fCBkb21UeXBlID09PSAzIC8qIFRFWFQgKi8pIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgY29uc3QgbmVlZFRvQWRvcHRDb250ZW50ID0gIXZub2RlLmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZub2RlLnN0YXRpY0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGlmIChuZWVkVG9BZG9wdENvbnRlbnQpXG4gICAgICAgICAgICAgIHZub2RlLmNoaWxkcmVuICs9IG5leHROb2RlLm5vZGVUeXBlID09PSAxIC8qIEVMRU1FTlQgKi8gPyBuZXh0Tm9kZS5vdXRlckhUTUwgOiBuZXh0Tm9kZS5kYXRhO1xuICAgICAgICAgICAgaWYgKGkgPT09IHZub2RlLnN0YXRpY0NvdW50IC0gMSkge1xuICAgICAgICAgICAgICB2bm9kZS5hbmNob3IgPSBuZXh0Tm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobmV4dE5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXNGcmFnbWVudFN0YXJ0ID8gbmV4dFNpYmxpbmcobmV4dE5vZGUpIDogbmV4dE5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb25NaXNtYXRjaCgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGcmFnbWVudDpcbiAgICAgICAgaWYgKCFpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IGh5ZHJhdGVGcmFnbWVudChcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxKSB7XG4gICAgICAgICAgaWYgKChkb21UeXBlICE9PSAxIC8qIEVMRU1FTlQgKi8gfHwgdm5vZGUudHlwZS50b0xvd2VyQ2FzZSgpICE9PSBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkgJiYgIWlzVGVtcGxhdGVOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBoeWRyYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA2KSB7XG4gICAgICAgICAgdm5vZGUuc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzO1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgICAgaWYgKGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBsb2NhdGVDbG9zaW5nQW5jaG9yKG5vZGUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNDb21tZW50KG5vZGUpICYmIG5vZGUuZGF0YSA9PT0gXCJ0ZWxlcG9ydCBzdGFydFwiKSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IGxvY2F0ZUNsb3NpbmdBbmNob3Iobm9kZSwgbm9kZS5kYXRhLCBcInRlbGVwb3J0IGVuZFwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbW91bnRDb21wb25lbnQoXG4gICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIGdldENvbnRhaW5lclR5cGUoY29udGFpbmVyKSxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGlzQXN5bmNXcmFwcGVyKHZub2RlKSkge1xuICAgICAgICAgICAgbGV0IHN1YlRyZWU7XG4gICAgICAgICAgICBpZiAoaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgICAgIHN1YlRyZWUgPSBjcmVhdGVWTm9kZShGcmFnbWVudCk7XG4gICAgICAgICAgICAgIHN1YlRyZWUuYW5jaG9yID0gbmV4dE5vZGUgPyBuZXh0Tm9kZS5wcmV2aW91c1NpYmxpbmcgOiBjb250YWluZXIubGFzdENoaWxkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3ViVHJlZSA9IG5vZGUubm9kZVR5cGUgPT09IDMgPyBjcmVhdGVUZXh0Vk5vZGUoXCJcIikgOiBjcmVhdGVWTm9kZShcImRpdlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YlRyZWUuZWwgPSBub2RlO1xuICAgICAgICAgICAgdm5vZGUuY29tcG9uZW50LnN1YlRyZWUgPSBzdWJUcmVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgICAgIGlmIChkb21UeXBlICE9PSA4IC8qIENPTU1FTlQgKi8pIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IHZub2RlLnR5cGUuaHlkcmF0ZShcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgICByZW5kZXJlckludGVybmFscyxcbiAgICAgICAgICAgICAgaHlkcmF0ZUNoaWxkcmVuXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IHZub2RlLnR5cGUuaHlkcmF0ZShcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgZ2V0Q29udGFpbmVyVHlwZShwYXJlbnROb2RlKG5vZGUpKSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgICAgIHJlbmRlcmVySW50ZXJuYWxzLFxuICAgICAgICAgICAgaHlkcmF0ZU5vZGVcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fKSB7XG4gICAgICAgICAgd2FybiQxKFwiSW52YWxpZCBIb3N0Vk5vZGUgdHlwZTpcIiwgdHlwZSwgYCgke3R5cGVvZiB0eXBlfSlgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVmICE9IG51bGwpIHtcbiAgICAgIHNldFJlZihyZWYsIG51bGwsIHBhcmVudFN1c3BlbnNlLCB2bm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0Tm9kZTtcbiAgfTtcbiAgY29uc3QgaHlkcmF0ZUVsZW1lbnQgPSAoZWwsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIG9wdGltaXplZCA9IG9wdGltaXplZCB8fCAhIXZub2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgICBjb25zdCB7IHR5cGUsIHByb3BzLCBwYXRjaEZsYWcsIHNoYXBlRmxhZywgZGlycywgdHJhbnNpdGlvbiB9ID0gdm5vZGU7XG4gICAgY29uc3QgZm9yY2VQYXRjaCA9IHR5cGUgPT09IFwiaW5wdXRcIiB8fCB0eXBlID09PSBcIm9wdGlvblwiO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IGZvcmNlUGF0Y2ggfHwgcGF0Y2hGbGFnICE9PSAtMSkge1xuICAgICAgaWYgKGRpcnMpIHtcbiAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImNyZWF0ZWRcIik7XG4gICAgICB9XG4gICAgICBsZXQgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgPSBmYWxzZTtcbiAgICAgIGlmIChpc1RlbXBsYXRlTm9kZShlbCkpIHtcbiAgICAgICAgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgPSBuZWVkVHJhbnNpdGlvbihwYXJlbnRTdXNwZW5zZSwgdHJhbnNpdGlvbikgJiYgcGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudC52bm9kZS5wcm9wcyAmJiBwYXJlbnRDb21wb25lbnQudm5vZGUucHJvcHMuYXBwZWFyO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZWwuY29udGVudC5maXJzdENoaWxkO1xuICAgICAgICBpZiAobmVlZENhbGxUcmFuc2l0aW9uSG9va3MpIHtcbiAgICAgICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJlcGxhY2VOb2RlKGNvbnRlbnQsIGVsLCBwYXJlbnRDb21wb25lbnQpO1xuICAgICAgICB2bm9kZS5lbCA9IGVsID0gY29udGVudDtcbiAgICAgIH1cbiAgICAgIGlmIChzaGFwZUZsYWcgJiAxNiAmJiAvLyBza2lwIGlmIGVsZW1lbnQgaGFzIGlubmVySFRNTCAvIHRleHRDb250ZW50XG4gICAgICAhKHByb3BzICYmIChwcm9wcy5pbm5lckhUTUwgfHwgcHJvcHMudGV4dENvbnRlbnQpKSkge1xuICAgICAgICBsZXQgbmV4dCA9IGh5ZHJhdGVDaGlsZHJlbihcbiAgICAgICAgICBlbC5maXJzdENoaWxkLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGxldCBoYXNXYXJuZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKG5leHQpIHtcbiAgICAgICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgaWYgKCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgIWhhc1dhcm5lZCkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBgSHlkcmF0aW9uIGNoaWxkcmVuIG1pc21hdGNoIG9uYCxcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgIGBcblNlcnZlciByZW5kZXJlZCBlbGVtZW50IGNvbnRhaW5zIG1vcmUgY2hpbGQgbm9kZXMgdGhhbiBjbGllbnQgdmRvbS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaGFzV2FybmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY3VyID0gbmV4dDtcbiAgICAgICAgICBuZXh0ID0gbmV4dC5uZXh0U2libGluZztcbiAgICAgICAgICByZW1vdmUoY3VyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA4KSB7XG4gICAgICAgIGlmIChlbC50ZXh0Q29udGVudCAhPT0gdm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fKSAmJiB3YXJuJDEoXG4gICAgICAgICAgICBgSHlkcmF0aW9uIHRleHQgY29udGVudCBtaXNtYXRjaCBvbmAsXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICAgIGBcbiAgLSByZW5kZXJlZCBvbiBzZXJ2ZXI6ICR7ZWwudGV4dENvbnRlbnR9XG4gIC0gZXhwZWN0ZWQgb24gY2xpZW50OiAke3Zub2RlLmNoaWxkcmVufWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcykge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBmb3JjZVBhdGNoIHx8ICFvcHRpbWl6ZWQgfHwgcGF0Y2hGbGFnICYgKDE2IHwgMzIpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHByb3BIYXNNaXNtYXRjaChlbCwga2V5LCBwcm9wc1trZXldLCB2bm9kZSkpIHtcbiAgICAgICAgICAgICAgaGFzTWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZvcmNlUGF0Y2ggJiYgKGtleS5lbmRzV2l0aChcInZhbHVlXCIpIHx8IGtleSA9PT0gXCJpbmRldGVybWluYXRlXCIpIHx8IGlzT24oa2V5KSAmJiAhaXNSZXNlcnZlZFByb3Aoa2V5KSB8fCAvLyBmb3JjZSBoeWRyYXRlIHYtYmluZCB3aXRoIC5wcm9wIG1vZGlmaWVyc1xuICAgICAgICAgICAga2V5WzBdID09PSBcIi5cIikge1xuICAgICAgICAgICAgICBwYXRjaFByb3AoXG4gICAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgcHJvcHNba2V5XSxcbiAgICAgICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgIHBhcmVudENvbXBvbmVudFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5vbkNsaWNrKSB7XG4gICAgICAgICAgcGF0Y2hQcm9wKFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBcIm9uQ2xpY2tcIixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwcm9wcy5vbkNsaWNrLFxuICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IHZub2RlSG9va3M7XG4gICAgICBpZiAodm5vZGVIb29rcyA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkge1xuICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rcywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICB9XG4gICAgICBpZiAoZGlycykge1xuICAgICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiYmVmb3JlTW91bnRcIik7XG4gICAgICB9XG4gICAgICBpZiAoKHZub2RlSG9va3MgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlTW91bnRlZCkgfHwgZGlycyB8fCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcykge1xuICAgICAgICBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZSgoKSA9PiB7XG4gICAgICAgICAgdm5vZGVIb29rcyAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rcywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICAgICAgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgJiYgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICAgICAgZGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwibW91bnRlZFwiKTtcbiAgICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWwubmV4dFNpYmxpbmc7XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVDaGlsZHJlbiA9IChub2RlLCBwYXJlbnRWTm9kZSwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIG9wdGltaXplZCA9IG9wdGltaXplZCB8fCAhIXBhcmVudFZOb2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudFZOb2RlLmNoaWxkcmVuO1xuICAgIGNvbnN0IGwgPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgbGV0IGhhc1dhcm5lZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjb25zdCB2bm9kZSA9IG9wdGltaXplZCA/IGNoaWxkcmVuW2ldIDogY2hpbGRyZW5baV0gPSBub3JtYWxpemVWTm9kZShjaGlsZHJlbltpXSk7XG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICBub2RlID0gaHlkcmF0ZU5vZGUoXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh2bm9kZS50eXBlID09PSBUZXh0ICYmICF2bm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhc01pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgaWYgKCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgIWhhc1dhcm5lZCkge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBIeWRyYXRpb24gY2hpbGRyZW4gbWlzbWF0Y2ggb25gLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYFxuU2VydmVyIHJlbmRlcmVkIGVsZW1lbnQgY29udGFpbnMgZmV3ZXIgY2hpbGQgbm9kZXMgdGhhbiBjbGllbnQgdmRvbS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBoYXNXYXJuZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGdldENvbnRhaW5lclR5cGUoY29udGFpbmVyKSxcbiAgICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVGcmFnbWVudCA9IChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCB7IHNsb3RTY29wZUlkczogZnJhZ21lbnRTbG90U2NvcGVJZHMgfSA9IHZub2RlO1xuICAgIGlmIChmcmFnbWVudFNsb3RTY29wZUlkcykge1xuICAgICAgc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzID8gc2xvdFNjb3BlSWRzLmNvbmNhdChmcmFnbWVudFNsb3RTY29wZUlkcykgOiBmcmFnbWVudFNsb3RTY29wZUlkcztcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50Tm9kZShub2RlKTtcbiAgICBjb25zdCBuZXh0ID0gaHlkcmF0ZUNoaWxkcmVuKFxuICAgICAgbmV4dFNpYmxpbmcobm9kZSksXG4gICAgICB2bm9kZSxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgb3B0aW1pemVkXG4gICAgKTtcbiAgICBpZiAobmV4dCAmJiBpc0NvbW1lbnQobmV4dCkgJiYgbmV4dC5kYXRhID09PSBcIl1cIikge1xuICAgICAgcmV0dXJuIG5leHRTaWJsaW5nKHZub2RlLmFuY2hvciA9IG5leHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICBpbnNlcnQodm5vZGUuYW5jaG9yID0gY3JlYXRlQ29tbWVudChgXWApLCBjb250YWluZXIsIG5leHQpO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuICB9O1xuICBjb25zdCBoYW5kbGVNaXNtYXRjaCA9IChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBpc0ZyYWdtZW50KSA9PiB7XG4gICAgaGFzTWlzbWF0Y2ggPSB0cnVlO1xuICAgICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgd2FybiQxKFxuICAgICAgYEh5ZHJhdGlvbiBub2RlIG1pc21hdGNoOlxuLSByZW5kZXJlZCBvbiBzZXJ2ZXI6YCxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlLm5vZGVUeXBlID09PSAzIC8qIFRFWFQgKi8gPyBgKHRleHQpYCA6IGlzQ29tbWVudChub2RlKSAmJiBub2RlLmRhdGEgPT09IFwiW1wiID8gYChzdGFydCBvZiBmcmFnbWVudClgIDogYGAsXG4gICAgICBgXG4tIGV4cGVjdGVkIG9uIGNsaWVudDpgLFxuICAgICAgdm5vZGUudHlwZVxuICAgICk7XG4gICAgdm5vZGUuZWwgPSBudWxsO1xuICAgIGlmIChpc0ZyYWdtZW50KSB7XG4gICAgICBjb25zdCBlbmQgPSBsb2NhdGVDbG9zaW5nQW5jaG9yKG5vZGUpO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgY29uc3QgbmV4dDIgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgaWYgKG5leHQyICYmIG5leHQyICE9PSBlbmQpIHtcbiAgICAgICAgICByZW1vdmUobmV4dDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5leHQgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICBjb25zdCBjb250YWluZXIgPSBwYXJlbnROb2RlKG5vZGUpO1xuICAgIHJlbW92ZShub2RlKTtcbiAgICBwYXRjaChcbiAgICAgIG51bGwsXG4gICAgICB2bm9kZSxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG5leHQsXG4gICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgIGdldENvbnRhaW5lclR5cGUoY29udGFpbmVyKSxcbiAgICAgIHNsb3RTY29wZUlkc1xuICAgICk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH07XG4gIGNvbnN0IGxvY2F0ZUNsb3NpbmdBbmNob3IgPSAobm9kZSwgb3BlbiA9IFwiW1wiLCBjbG9zZSA9IFwiXVwiKSA9PiB7XG4gICAgbGV0IG1hdGNoID0gMDtcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgbm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgaWYgKG5vZGUgJiYgaXNDb21tZW50KG5vZGUpKSB7XG4gICAgICAgIGlmIChub2RlLmRhdGEgPT09IG9wZW4pXG4gICAgICAgICAgbWF0Y2grKztcbiAgICAgICAgaWYgKG5vZGUuZGF0YSA9PT0gY2xvc2UpIHtcbiAgICAgICAgICBpZiAobWF0Y2ggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWF0Y2gtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG4gIGNvbnN0IHJlcGxhY2VOb2RlID0gKG5ld05vZGUsIG9sZE5vZGUsIHBhcmVudENvbXBvbmVudCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudE5vZGUyID0gb2xkTm9kZS5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnROb2RlMikge1xuICAgICAgcGFyZW50Tm9kZTIucmVwbGFjZUNoaWxkKG5ld05vZGUsIG9sZE5vZGUpO1xuICAgIH1cbiAgICBsZXQgcGFyZW50ID0gcGFyZW50Q29tcG9uZW50O1xuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmIChwYXJlbnQudm5vZGUuZWwgPT09IG9sZE5vZGUpIHtcbiAgICAgICAgcGFyZW50LnZub2RlLmVsID0gcGFyZW50LnN1YlRyZWUuZWwgPSBuZXdOb2RlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGlzVGVtcGxhdGVOb2RlID0gKG5vZGUpID0+IHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBFTEVNRU5UICovICYmIG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInRlbXBsYXRlXCI7XG4gIH07XG4gIHJldHVybiBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdO1xufVxuZnVuY3Rpb24gcHJvcEhhc01pc21hdGNoKGVsLCBrZXksIGNsaWVudFZhbHVlLCB2bm9kZSkge1xuICBsZXQgbWlzbWF0Y2hUeXBlO1xuICBsZXQgbWlzbWF0Y2hLZXk7XG4gIGxldCBhY3R1YWw7XG4gIGxldCBleHBlY3RlZDtcbiAgaWYgKGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgYWN0dWFsID0gZWwuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIik7XG4gICAgZXhwZWN0ZWQgPSBub3JtYWxpemVDbGFzcyhjbGllbnRWYWx1ZSk7XG4gICAgaWYgKCFpc1NldEVxdWFsKHRvQ2xhc3NTZXQoYWN0dWFsIHx8IFwiXCIpLCB0b0NsYXNzU2V0KGV4cGVjdGVkKSkpIHtcbiAgICAgIG1pc21hdGNoVHlwZSA9IG1pc21hdGNoS2V5ID0gYGNsYXNzYDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIpIHtcbiAgICBhY3R1YWwgPSBlbC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICBleHBlY3RlZCA9IGlzU3RyaW5nKGNsaWVudFZhbHVlKSA/IGNsaWVudFZhbHVlIDogc3RyaW5naWZ5U3R5bGUobm9ybWFsaXplU3R5bGUoY2xpZW50VmFsdWUpKTtcbiAgICBjb25zdCBhY3R1YWxNYXAgPSB0b1N0eWxlTWFwKGFjdHVhbCk7XG4gICAgY29uc3QgZXhwZWN0ZWRNYXAgPSB0b1N0eWxlTWFwKGV4cGVjdGVkKTtcbiAgICBpZiAodm5vZGUuZGlycykge1xuICAgICAgZm9yIChjb25zdCB7IGRpciwgdmFsdWUgfSBvZiB2bm9kZS5kaXJzKSB7XG4gICAgICAgIGlmIChkaXIubmFtZSA9PT0gXCJzaG93XCIgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgZXhwZWN0ZWRNYXAuc2V0KFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpc01hcEVxdWFsKGFjdHVhbE1hcCwgZXhwZWN0ZWRNYXApKSB7XG4gICAgICBtaXNtYXRjaFR5cGUgPSBtaXNtYXRjaEtleSA9IFwic3R5bGVcIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZWwgaW5zdGFuY2VvZiBTVkdFbGVtZW50ICYmIGlzS25vd25TdmdBdHRyKGtleSkgfHwgZWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiAoaXNCb29sZWFuQXR0cihrZXkpIHx8IGlzS25vd25IdG1sQXR0cihrZXkpKSkge1xuICAgIGlmIChpc0Jvb2xlYW5BdHRyKGtleSkpIHtcbiAgICAgIGFjdHVhbCA9IGVsLmhhc0F0dHJpYnV0ZShrZXkpO1xuICAgICAgZXhwZWN0ZWQgPSBpbmNsdWRlQm9vbGVhbkF0dHIoY2xpZW50VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWwuaGFzQXR0cmlidXRlKGtleSkpIHtcbiAgICAgICAgYWN0dWFsID0gZWwuZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzZXJ2ZXJWYWx1ZSA9IGVsW2tleV07XG4gICAgICAgIGFjdHVhbCA9IGlzT2JqZWN0KHNlcnZlclZhbHVlKSB8fCBzZXJ2ZXJWYWx1ZSA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhzZXJ2ZXJWYWx1ZSk7XG4gICAgICB9XG4gICAgICBleHBlY3RlZCA9IGlzT2JqZWN0KGNsaWVudFZhbHVlKSB8fCBjbGllbnRWYWx1ZSA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhjbGllbnRWYWx1ZSk7XG4gICAgfVxuICAgIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgICBtaXNtYXRjaFR5cGUgPSBgYXR0cmlidXRlYDtcbiAgICAgIG1pc21hdGNoS2V5ID0ga2V5O1xuICAgIH1cbiAgfVxuICBpZiAobWlzbWF0Y2hUeXBlKSB7XG4gICAgY29uc3QgZm9ybWF0ID0gKHYpID0+IHYgPT09IGZhbHNlID8gYChub3QgcmVuZGVyZWQpYCA6IGAke21pc21hdGNoS2V5fT1cIiR7dn1cImA7XG4gICAgY29uc3QgcHJlU2VnbWVudCA9IGBIeWRyYXRpb24gJHttaXNtYXRjaFR5cGV9IG1pc21hdGNoIG9uYDtcbiAgICBjb25zdCBwb3N0U2VnbWVudCA9IGBcbiAgLSByZW5kZXJlZCBvbiBzZXJ2ZXI6ICR7Zm9ybWF0KGFjdHVhbCl9XG4gIC0gZXhwZWN0ZWQgb24gY2xpZW50OiAke2Zvcm1hdChleHBlY3RlZCl9XG4gIE5vdGU6IHRoaXMgbWlzbWF0Y2ggaXMgY2hlY2stb25seS4gVGhlIERPTSB3aWxsIG5vdCBiZSByZWN0aWZpZWQgaW4gcHJvZHVjdGlvbiBkdWUgdG8gcGVyZm9ybWFuY2Ugb3ZlcmhlYWQuXG4gIFlvdSBzaG91bGQgZml4IHRoZSBzb3VyY2Ugb2YgdGhlIG1pc21hdGNoLmA7XG4gICAge1xuICAgICAgd2FybiQxKHByZVNlZ21lbnQsIGVsLCBwb3N0U2VnbWVudCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHRvQ2xhc3NTZXQoc3RyKSB7XG4gIHJldHVybiBuZXcgU2V0KHN0ci50cmltKCkuc3BsaXQoL1xccysvKSk7XG59XG5mdW5jdGlvbiBpc1NldEVxdWFsKGEsIGIpIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3QgcyBvZiBhKSB7XG4gICAgaWYgKCFiLmhhcyhzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHRvU3R5bGVNYXAoc3RyKSB7XG4gIGNvbnN0IHN0eWxlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIHN0ci5zcGxpdChcIjtcIikpIHtcbiAgICBsZXQgW2tleSwgdmFsdWVdID0gaXRlbS5zcGxpdChcIjpcIik7XG4gICAga2V5ID0ga2V5ID09IG51bGwgPyB2b2lkIDAgOiBrZXkudHJpbSgpO1xuICAgIHZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IHZvaWQgMCA6IHZhbHVlLnRyaW0oKTtcbiAgICBpZiAoa2V5ICYmIHZhbHVlKSB7XG4gICAgICBzdHlsZU1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHlsZU1hcDtcbn1cbmZ1bmN0aW9uIGlzTWFwRXF1YWwoYSwgYikge1xuICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgYSkge1xuICAgIGlmICh2YWx1ZSAhPT0gYi5nZXQoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxubGV0IHN1cHBvcnRlZDtcbmxldCBwZXJmO1xuZnVuY3Rpb24gc3RhcnRNZWFzdXJlKGluc3RhbmNlLCB0eXBlKSB7XG4gIGlmIChpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5wZXJmb3JtYW5jZSAmJiBpc1N1cHBvcnRlZCgpKSB7XG4gICAgcGVyZi5tYXJrKGB2dWUtJHt0eXBlfS0ke2luc3RhbmNlLnVpZH1gKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICBkZXZ0b29sc1BlcmZTdGFydChpbnN0YW5jZSwgdHlwZSwgaXNTdXBwb3J0ZWQoKSA/IHBlcmYubm93KCkgOiBEYXRlLm5vdygpKTtcbiAgfVxufVxuZnVuY3Rpb24gZW5kTWVhc3VyZShpbnN0YW5jZSwgdHlwZSkge1xuICBpZiAoaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcucGVyZm9ybWFuY2UgJiYgaXNTdXBwb3J0ZWQoKSkge1xuICAgIGNvbnN0IHN0YXJ0VGFnID0gYHZ1ZS0ke3R5cGV9LSR7aW5zdGFuY2UudWlkfWA7XG4gICAgY29uc3QgZW5kVGFnID0gc3RhcnRUYWcgKyBgOmVuZGA7XG4gICAgcGVyZi5tYXJrKGVuZFRhZyk7XG4gICAgcGVyZi5tZWFzdXJlKFxuICAgICAgYDwke2Zvcm1hdENvbXBvbmVudE5hbWUoaW5zdGFuY2UsIGluc3RhbmNlLnR5cGUpfT4gJHt0eXBlfWAsXG4gICAgICBzdGFydFRhZyxcbiAgICAgIGVuZFRhZ1xuICAgICk7XG4gICAgcGVyZi5jbGVhck1hcmtzKHN0YXJ0VGFnKTtcbiAgICBwZXJmLmNsZWFyTWFya3MoZW5kVGFnKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICBkZXZ0b29sc1BlcmZFbmQoaW5zdGFuY2UsIHR5cGUsIGlzU3VwcG9ydGVkKCkgPyBwZXJmLm5vdygpIDogRGF0ZS5ub3coKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzU3VwcG9ydGVkKCkge1xuICBpZiAoc3VwcG9ydGVkICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gc3VwcG9ydGVkO1xuICB9XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5wZXJmb3JtYW5jZSkge1xuICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgcGVyZiA9IHdpbmRvdy5wZXJmb3JtYW5jZTtcbiAgfSBlbHNlIHtcbiAgICBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gc3VwcG9ydGVkO1xufVxuXG5mdW5jdGlvbiBpbml0RmVhdHVyZUZsYWdzKCkge1xuICBjb25zdCBuZWVkV2FybiA9IFtdO1xuICBpZiAodHlwZW9mIF9fVlVFX09QVElPTlNfQVBJX18gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBuZWVkV2Fybi5wdXNoKGBfX1ZVRV9PUFRJT05TX0FQSV9fYCk7XG4gICAgZ2V0R2xvYmFsVGhpcygpLl9fVlVFX09QVElPTlNfQVBJX18gPSB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgX19WVUVfUFJPRF9ERVZUT09MU19fICE9PSBcImJvb2xlYW5cIikge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbmVlZFdhcm4ucHVzaChgX19WVUVfUFJPRF9ERVZUT09MU19fYCk7XG4gICAgZ2V0R2xvYmFsVGhpcygpLl9fVlVFX1BST0RfREVWVE9PTFNfXyA9IGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fICE9PSBcImJvb2xlYW5cIikge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbmVlZFdhcm4ucHVzaChgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fYCk7XG4gICAgZ2V0R2xvYmFsVGhpcygpLl9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXyA9IGZhbHNlO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG5lZWRXYXJuLmxlbmd0aCkge1xuICAgIGNvbnN0IG11bHRpID0gbmVlZFdhcm4ubGVuZ3RoID4gMTtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgRmVhdHVyZSBmbGFnJHttdWx0aSA/IGBzYCA6IGBgfSAke25lZWRXYXJuLmpvaW4oXCIsIFwiKX0gJHttdWx0aSA/IGBhcmVgIDogYGlzYH0gbm90IGV4cGxpY2l0bHkgZGVmaW5lZC4gWW91IGFyZSBydW5uaW5nIHRoZSBlc20tYnVuZGxlciBidWlsZCBvZiBWdWUsIHdoaWNoIGV4cGVjdHMgdGhlc2UgY29tcGlsZS10aW1lIGZlYXR1cmUgZmxhZ3MgdG8gYmUgZ2xvYmFsbHkgaW5qZWN0ZWQgdmlhIHRoZSBidW5kbGVyIGNvbmZpZyBpbiBvcmRlciB0byBnZXQgYmV0dGVyIHRyZWUtc2hha2luZyBpbiB0aGUgcHJvZHVjdGlvbiBidW5kbGUuXG5cbkZvciBtb3JlIGRldGFpbHMsIHNlZSBodHRwczovL2xpbmsudnVlanMub3JnL2ZlYXR1cmUtZmxhZ3MuYFxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgcXVldWVQb3N0UmVuZGVyRWZmZWN0ID0gcXVldWVFZmZlY3RXaXRoU3VzcGVuc2UgO1xuZnVuY3Rpb24gY3JlYXRlUmVuZGVyZXIob3B0aW9ucykge1xuICByZXR1cm4gYmFzZUNyZWF0ZVJlbmRlcmVyKG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXIob3B0aW9ucykge1xuICByZXR1cm4gYmFzZUNyZWF0ZVJlbmRlcmVyKG9wdGlvbnMsIGNyZWF0ZUh5ZHJhdGlvbkZ1bmN0aW9ucyk7XG59XG5mdW5jdGlvbiBiYXNlQ3JlYXRlUmVuZGVyZXIob3B0aW9ucywgY3JlYXRlSHlkcmF0aW9uRm5zKSB7XG4gIHtcbiAgICBpbml0RmVhdHVyZUZsYWdzKCk7XG4gIH1cbiAgY29uc3QgdGFyZ2V0ID0gZ2V0R2xvYmFsVGhpcygpO1xuICB0YXJnZXQuX19WVUVfXyA9IHRydWU7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIHNldERldnRvb2xzSG9vayQxKHRhcmdldC5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fLCB0YXJnZXQpO1xuICB9XG4gIGNvbnN0IHtcbiAgICBpbnNlcnQ6IGhvc3RJbnNlcnQsXG4gICAgcmVtb3ZlOiBob3N0UmVtb3ZlLFxuICAgIHBhdGNoUHJvcDogaG9zdFBhdGNoUHJvcCxcbiAgICBjcmVhdGVFbGVtZW50OiBob3N0Q3JlYXRlRWxlbWVudCxcbiAgICBjcmVhdGVUZXh0OiBob3N0Q3JlYXRlVGV4dCxcbiAgICBjcmVhdGVDb21tZW50OiBob3N0Q3JlYXRlQ29tbWVudCxcbiAgICBzZXRUZXh0OiBob3N0U2V0VGV4dCxcbiAgICBzZXRFbGVtZW50VGV4dDogaG9zdFNldEVsZW1lbnRUZXh0LFxuICAgIHBhcmVudE5vZGU6IGhvc3RQYXJlbnROb2RlLFxuICAgIG5leHRTaWJsaW5nOiBob3N0TmV4dFNpYmxpbmcsXG4gICAgc2V0U2NvcGVJZDogaG9zdFNldFNjb3BlSWQgPSBOT09QLFxuICAgIGluc2VydFN0YXRpY0NvbnRlbnQ6IGhvc3RJbnNlcnRTdGF0aWNDb250ZW50XG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBwYXRjaCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yID0gbnVsbCwgcGFyZW50Q29tcG9uZW50ID0gbnVsbCwgcGFyZW50U3VzcGVuc2UgPSBudWxsLCBuYW1lc3BhY2UgPSB2b2lkIDAsIHNsb3RTY29wZUlkcyA9IG51bGwsIG9wdGltaXplZCA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZyA/IGZhbHNlIDogISFuMi5keW5hbWljQ2hpbGRyZW4pID0+IHtcbiAgICBpZiAobjEgPT09IG4yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuMSAmJiAhaXNTYW1lVk5vZGVUeXBlKG4xLCBuMikpIHtcbiAgICAgIGFuY2hvciA9IGdldE5leHRIb3N0Tm9kZShuMSk7XG4gICAgICB1bm1vdW50KG4xLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgIG4xID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKG4yLnBhdGNoRmxhZyA9PT0gLTIpIHtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgbjIuZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeyB0eXBlLCByZWYsIHNoYXBlRmxhZyB9ID0gbjI7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFRleHQ6XG4gICAgICAgIHByb2Nlc3NUZXh0KG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ29tbWVudDpcbiAgICAgICAgcHJvY2Vzc0NvbW1lbnROb2RlKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RhdGljOlxuICAgICAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgICAgIG1vdW50U3RhdGljTm9kZShuMiwgY29udGFpbmVyLCBhbmNob3IsIG5hbWVzcGFjZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBhdGNoU3RhdGljTm9kZShuMSwgbjIsIGNvbnRhaW5lciwgbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICAgIHByb2Nlc3NGcmFnbWVudChcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxKSB7XG4gICAgICAgICAgcHJvY2Vzc0VsZW1lbnQoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50KFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgICAgIHR5cGUucHJvY2VzcyhcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgICAgIGludGVybmFsc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICAgICAgdHlwZS5wcm9jZXNzKFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgaW50ZXJuYWxzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFwiSW52YWxpZCBWTm9kZSB0eXBlOlwiLCB0eXBlLCBgKCR7dHlwZW9mIHR5cGV9KWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZWYgIT0gbnVsbCAmJiBwYXJlbnRDb21wb25lbnQpIHtcbiAgICAgIHNldFJlZihyZWYsIG4xICYmIG4xLnJlZiwgcGFyZW50U3VzcGVuc2UsIG4yIHx8IG4xLCAhbjIpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc1RleHQgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvcikgPT4ge1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBob3N0SW5zZXJ0KFxuICAgICAgICBuMi5lbCA9IGhvc3RDcmVhdGVUZXh0KG4yLmNoaWxkcmVuKSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3JcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVsID0gbjIuZWwgPSBuMS5lbDtcbiAgICAgIGlmIChuMi5jaGlsZHJlbiAhPT0gbjEuY2hpbGRyZW4pIHtcbiAgICAgICAgaG9zdFNldFRleHQoZWwsIG4yLmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IHByb2Nlc3NDb21tZW50Tm9kZSA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yKSA9PiB7XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGhvc3RJbnNlcnQoXG4gICAgICAgIG4yLmVsID0gaG9zdENyZWF0ZUNvbW1lbnQobjIuY2hpbGRyZW4gfHwgXCJcIiksXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgbW91bnRTdGF0aWNOb2RlID0gKG4yLCBjb250YWluZXIsIGFuY2hvciwgbmFtZXNwYWNlKSA9PiB7XG4gICAgW24yLmVsLCBuMi5hbmNob3JdID0gaG9zdEluc2VydFN0YXRpY0NvbnRlbnQoXG4gICAgICBuMi5jaGlsZHJlbixcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGFuY2hvcixcbiAgICAgIG5hbWVzcGFjZSxcbiAgICAgIG4yLmVsLFxuICAgICAgbjIuYW5jaG9yXG4gICAgKTtcbiAgfTtcbiAgY29uc3QgcGF0Y2hTdGF0aWNOb2RlID0gKG4xLCBuMiwgY29udGFpbmVyLCBuYW1lc3BhY2UpID0+IHtcbiAgICBpZiAobjIuY2hpbGRyZW4gIT09IG4xLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBhbmNob3IgPSBob3N0TmV4dFNpYmxpbmcobjEuYW5jaG9yKTtcbiAgICAgIHJlbW92ZVN0YXRpY05vZGUobjEpO1xuICAgICAgW24yLmVsLCBuMi5hbmNob3JdID0gaG9zdEluc2VydFN0YXRpY0NvbnRlbnQoXG4gICAgICAgIG4yLmNoaWxkcmVuLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgbmFtZXNwYWNlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgbjIuYW5jaG9yID0gbjEuYW5jaG9yO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgbW92ZVN0YXRpY05vZGUgPSAoeyBlbCwgYW5jaG9yIH0sIGNvbnRhaW5lciwgbmV4dFNpYmxpbmcpID0+IHtcbiAgICBsZXQgbmV4dDtcbiAgICB3aGlsZSAoZWwgJiYgZWwgIT09IGFuY2hvcikge1xuICAgICAgbmV4dCA9IGhvc3ROZXh0U2libGluZyhlbCk7XG4gICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIG5leHRTaWJsaW5nKTtcbiAgICAgIGVsID0gbmV4dDtcbiAgICB9XG4gICAgaG9zdEluc2VydChhbmNob3IsIGNvbnRhaW5lciwgbmV4dFNpYmxpbmcpO1xuICB9O1xuICBjb25zdCByZW1vdmVTdGF0aWNOb2RlID0gKHsgZWwsIGFuY2hvciB9KSA9PiB7XG4gICAgbGV0IG5leHQ7XG4gICAgd2hpbGUgKGVsICYmIGVsICE9PSBhbmNob3IpIHtcbiAgICAgIG5leHQgPSBob3N0TmV4dFNpYmxpbmcoZWwpO1xuICAgICAgaG9zdFJlbW92ZShlbCk7XG4gICAgICBlbCA9IG5leHQ7XG4gICAgfVxuICAgIGhvc3RSZW1vdmUoYW5jaG9yKTtcbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0VsZW1lbnQgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGlmIChuMi50eXBlID09PSBcInN2Z1wiKSB7XG4gICAgICBuYW1lc3BhY2UgPSBcInN2Z1wiO1xuICAgIH0gZWxzZSBpZiAobjIudHlwZSA9PT0gXCJtYXRoXCIpIHtcbiAgICAgIG5hbWVzcGFjZSA9IFwibWF0aG1sXCI7XG4gICAgfVxuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBtb3VudEVsZW1lbnQoXG4gICAgICAgIG4yLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0Y2hFbGVtZW50KFxuICAgICAgICBuMSxcbiAgICAgICAgbjIsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudEVsZW1lbnQgPSAodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgbGV0IGVsO1xuICAgIGxldCB2bm9kZUhvb2s7XG4gICAgY29uc3QgeyBwcm9wcywgc2hhcGVGbGFnLCB0cmFuc2l0aW9uLCBkaXJzIH0gPSB2bm9kZTtcbiAgICBlbCA9IHZub2RlLmVsID0gaG9zdENyZWF0ZUVsZW1lbnQoXG4gICAgICB2bm9kZS50eXBlLFxuICAgICAgbmFtZXNwYWNlLFxuICAgICAgcHJvcHMgJiYgcHJvcHMuaXMsXG4gICAgICBwcm9wc1xuICAgICk7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDgpIHtcbiAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChlbCwgdm5vZGUuY2hpbGRyZW4pO1xuICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgIHZub2RlLmNoaWxkcmVuLFxuICAgICAgICBlbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgcmVzb2x2ZUNoaWxkcmVuTmFtZXNwYWNlKHZub2RlLCBuYW1lc3BhY2UpLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRpcnMpIHtcbiAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJjcmVhdGVkXCIpO1xuICAgIH1cbiAgICBzZXRTY29wZUlkKGVsLCB2bm9kZSwgdm5vZGUuc2NvcGVJZCwgc2xvdFNjb3BlSWRzLCBwYXJlbnRDb21wb25lbnQpO1xuICAgIGlmIChwcm9wcykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gXCJ2YWx1ZVwiICYmICFpc1Jlc2VydmVkUHJvcChrZXkpKSB7XG4gICAgICAgICAgaG9zdFBhdGNoUHJvcChcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHByb3BzW2tleV0sXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICB2bm9kZS5jaGlsZHJlbixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgdW5tb3VudENoaWxkcmVuXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFwidmFsdWVcIiBpbiBwcm9wcykge1xuICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcInZhbHVlXCIsIG51bGwsIHByb3BzLnZhbHVlLCBuYW1lc3BhY2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZub2RlSG9vayA9IHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkge1xuICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsIFwiX192bm9kZVwiLCB7XG4gICAgICAgIHZhbHVlOiB2bm9kZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsLCBcIl9fdnVlUGFyZW50Q29tcG9uZW50XCIsIHtcbiAgICAgICAgdmFsdWU6IHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZGlycykge1xuICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZU1vdW50XCIpO1xuICAgIH1cbiAgICBjb25zdCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IG5lZWRUcmFuc2l0aW9uKHBhcmVudFN1c3BlbnNlLCB0cmFuc2l0aW9uKTtcbiAgICBpZiAobmVlZENhbGxUcmFuc2l0aW9uSG9va3MpIHtcbiAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoZWwpO1xuICAgIH1cbiAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgaWYgKCh2bm9kZUhvb2sgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlTW91bnRlZCkgfHwgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgfHwgZGlycykge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgdm5vZGVIb29rICYmIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgICBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyAmJiB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICAgICAgZGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwibW91bnRlZFwiKTtcbiAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHNldFNjb3BlSWQgPSAoZWwsIHZub2RlLCBzY29wZUlkLCBzbG90U2NvcGVJZHMsIHBhcmVudENvbXBvbmVudCkgPT4ge1xuICAgIGlmIChzY29wZUlkKSB7XG4gICAgICBob3N0U2V0U2NvcGVJZChlbCwgc2NvcGVJZCk7XG4gICAgfVxuICAgIGlmIChzbG90U2NvcGVJZHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xvdFNjb3BlSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGhvc3RTZXRTY29wZUlkKGVsLCBzbG90U2NvcGVJZHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGFyZW50Q29tcG9uZW50KSB7XG4gICAgICBsZXQgc3ViVHJlZSA9IHBhcmVudENvbXBvbmVudC5zdWJUcmVlO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc3ViVHJlZS5wYXRjaEZsYWcgPiAwICYmIHN1YlRyZWUucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgICAgICBzdWJUcmVlID0gZmlsdGVyU2luZ2xlUm9vdChzdWJUcmVlLmNoaWxkcmVuKSB8fCBzdWJUcmVlO1xuICAgICAgfVxuICAgICAgaWYgKHZub2RlID09PSBzdWJUcmVlKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFZOb2RlID0gcGFyZW50Q29tcG9uZW50LnZub2RlO1xuICAgICAgICBzZXRTY29wZUlkKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHBhcmVudFZOb2RlLFxuICAgICAgICAgIHBhcmVudFZOb2RlLnNjb3BlSWQsXG4gICAgICAgICAgcGFyZW50Vk5vZGUuc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudC5wYXJlbnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50Q2hpbGRyZW4gPSAoY2hpbGRyZW4sIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBzdGFydCA9IDApID0+IHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGNoaWxkcmVuW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGNoaWxkcmVuW2ldKTtcbiAgICAgIHBhdGNoKFxuICAgICAgICBudWxsLFxuICAgICAgICBjaGlsZCxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaEVsZW1lbnQgPSAobjEsIG4yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgY29uc3QgZWwgPSBuMi5lbCA9IG4xLmVsO1xuICAgIGxldCB7IHBhdGNoRmxhZywgZHluYW1pY0NoaWxkcmVuLCBkaXJzIH0gPSBuMjtcbiAgICBwYXRjaEZsYWcgfD0gbjEucGF0Y2hGbGFnICYgMTY7XG4gICAgY29uc3Qgb2xkUHJvcHMgPSBuMS5wcm9wcyB8fCBFTVBUWV9PQko7XG4gICAgY29uc3QgbmV3UHJvcHMgPSBuMi5wcm9wcyB8fCBFTVBUWV9PQko7XG4gICAgbGV0IHZub2RlSG9vaztcbiAgICBwYXJlbnRDb21wb25lbnQgJiYgdG9nZ2xlUmVjdXJzZShwYXJlbnRDb21wb25lbnQsIGZhbHNlKTtcbiAgICBpZiAodm5vZGVIb29rID0gbmV3UHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkge1xuICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCBuMiwgbjEpO1xuICAgIH1cbiAgICBpZiAoZGlycykge1xuICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayhuMiwgbjEsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVVcGRhdGVcIik7XG4gICAgfVxuICAgIHBhcmVudENvbXBvbmVudCAmJiB0b2dnbGVSZWN1cnNlKHBhcmVudENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZykge1xuICAgICAgcGF0Y2hGbGFnID0gMDtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgcGF0Y2hCbG9ja0NoaWxkcmVuKFxuICAgICAgICBuMS5keW5hbWljQ2hpbGRyZW4sXG4gICAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgZWwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHJlc29sdmVDaGlsZHJlbk5hbWVzcGFjZShuMiwgbmFtZXNwYWNlKSxcbiAgICAgICAgc2xvdFNjb3BlSWRzXG4gICAgICApO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIW9wdGltaXplZCkge1xuICAgICAgcGF0Y2hDaGlsZHJlbihcbiAgICAgICAgbjEsXG4gICAgICAgIG4yLFxuICAgICAgICBlbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgcmVzb2x2ZUNoaWxkcmVuTmFtZXNwYWNlKG4yLCBuYW1lc3BhY2UpLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocGF0Y2hGbGFnID4gMCkge1xuICAgICAgaWYgKHBhdGNoRmxhZyAmIDE2KSB7XG4gICAgICAgIHBhdGNoUHJvcHMoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgb2xkUHJvcHMsXG4gICAgICAgICAgbmV3UHJvcHMsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHBhdGNoRmxhZyAmIDIpIHtcbiAgICAgICAgICBpZiAob2xkUHJvcHMuY2xhc3MgIT09IG5ld1Byb3BzLmNsYXNzKSB7XG4gICAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcImNsYXNzXCIsIG51bGwsIG5ld1Byb3BzLmNsYXNzLCBuYW1lc3BhY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0Y2hGbGFnICYgNCkge1xuICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIFwic3R5bGVcIiwgb2xkUHJvcHMuc3R5bGUsIG5ld1Byb3BzLnN0eWxlLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRjaEZsYWcgJiA4KSB7XG4gICAgICAgICAgY29uc3QgcHJvcHNUb1VwZGF0ZSA9IG4yLmR5bmFtaWNQcm9wcztcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzVG9VcGRhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHByb3BzVG9VcGRhdGVbaV07XG4gICAgICAgICAgICBjb25zdCBwcmV2ID0gb2xkUHJvcHNba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBuZXdQcm9wc1trZXldO1xuICAgICAgICAgICAgaWYgKG5leHQgIT09IHByZXYgfHwga2V5ID09PSBcInZhbHVlXCIpIHtcbiAgICAgICAgICAgICAgaG9zdFBhdGNoUHJvcChcbiAgICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgcHJldixcbiAgICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICBuMS5jaGlsZHJlbixcbiAgICAgICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICAgICAgdW5tb3VudENoaWxkcmVuXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocGF0Y2hGbGFnICYgMSkge1xuICAgICAgICBpZiAobjEuY2hpbGRyZW4gIT09IG4yLmNoaWxkcmVuKSB7XG4gICAgICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGVsLCBuMi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFvcHRpbWl6ZWQgJiYgZHluYW1pY0NoaWxkcmVuID09IG51bGwpIHtcbiAgICAgIHBhdGNoUHJvcHMoXG4gICAgICAgIGVsLFxuICAgICAgICBuMixcbiAgICAgICAgb2xkUHJvcHMsXG4gICAgICAgIG5ld1Byb3BzLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2VcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICgodm5vZGVIb29rID0gbmV3UHJvcHMub25Wbm9kZVVwZGF0ZWQpIHx8IGRpcnMpIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIG4yLCBuMSk7XG4gICAgICAgIGRpcnMgJiYgaW52b2tlRGlyZWN0aXZlSG9vayhuMiwgbjEsIHBhcmVudENvbXBvbmVudCwgXCJ1cGRhdGVkXCIpO1xuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hCbG9ja0NoaWxkcmVuID0gKG9sZENoaWxkcmVuLCBuZXdDaGlsZHJlbiwgZmFsbGJhY2tDb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb2xkVk5vZGUgPSBvbGRDaGlsZHJlbltpXTtcbiAgICAgIGNvbnN0IG5ld1ZOb2RlID0gbmV3Q2hpbGRyZW5baV07XG4gICAgICBjb25zdCBjb250YWluZXIgPSAoXG4gICAgICAgIC8vIG9sZFZOb2RlIG1heSBiZSBhbiBlcnJvcmVkIGFzeW5jIHNldHVwKCkgY29tcG9uZW50IGluc2lkZSBTdXNwZW5zZVxuICAgICAgICAvLyB3aGljaCB3aWxsIG5vdCBoYXZlIGEgbW91bnRlZCBlbGVtZW50XG4gICAgICAgIG9sZFZOb2RlLmVsICYmIC8vIC0gSW4gdGhlIGNhc2Ugb2YgYSBGcmFnbWVudCwgd2UgbmVlZCB0byBwcm92aWRlIHRoZSBhY3R1YWwgcGFyZW50XG4gICAgICAgIC8vIG9mIHRoZSBGcmFnbWVudCBpdHNlbGYgc28gaXQgY2FuIG1vdmUgaXRzIGNoaWxkcmVuLlxuICAgICAgICAob2xkVk5vZGUudHlwZSA9PT0gRnJhZ21lbnQgfHwgLy8gLSBJbiB0aGUgY2FzZSBvZiBkaWZmZXJlbnQgbm9kZXMsIHRoZXJlIGlzIGdvaW5nIHRvIGJlIGEgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gd2hpY2ggYWxzbyByZXF1aXJlcyB0aGUgY29ycmVjdCBwYXJlbnQgY29udGFpbmVyXG4gICAgICAgICFpc1NhbWVWTm9kZVR5cGUob2xkVk5vZGUsIG5ld1ZOb2RlKSB8fCAvLyAtIEluIHRoZSBjYXNlIG9mIGEgY29tcG9uZW50LCBpdCBjb3VsZCBjb250YWluIGFueXRoaW5nLlxuICAgICAgICBvbGRWTm9kZS5zaGFwZUZsYWcgJiAoNiB8IDY0KSkgPyBob3N0UGFyZW50Tm9kZShvbGRWTm9kZS5lbCkgOiAoXG4gICAgICAgICAgLy8gSW4gb3RoZXIgY2FzZXMsIHRoZSBwYXJlbnQgY29udGFpbmVyIGlzIG5vdCBhY3R1YWxseSB1c2VkIHNvIHdlXG4gICAgICAgICAgLy8ganVzdCBwYXNzIHRoZSBibG9jayBlbGVtZW50IGhlcmUgdG8gYXZvaWQgYSBET00gcGFyZW50Tm9kZSBjYWxsLlxuICAgICAgICAgIGZhbGxiYWNrQ29udGFpbmVyXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwYXRjaChcbiAgICAgICAgb2xkVk5vZGUsXG4gICAgICAgIG5ld1ZOb2RlLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hQcm9wcyA9IChlbCwgdm5vZGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlKSA9PiB7XG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcykge1xuICAgICAgaWYgKG9sZFByb3BzICE9PSBFTVBUWV9PQkopIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2xkUHJvcHMpIHtcbiAgICAgICAgICBpZiAoIWlzUmVzZXJ2ZWRQcm9wKGtleSkgJiYgIShrZXkgaW4gbmV3UHJvcHMpKSB7XG4gICAgICAgICAgICBob3N0UGF0Y2hQcm9wKFxuICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICBvbGRQcm9wc1trZXldLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgIHZub2RlLmNoaWxkcmVuLFxuICAgICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgICB1bm1vdW50Q2hpbGRyZW5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdQcm9wcykge1xuICAgICAgICBpZiAoaXNSZXNlcnZlZFByb3Aoa2V5KSlcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbmV4dCA9IG5ld1Byb3BzW2tleV07XG4gICAgICAgIGNvbnN0IHByZXYgPSBvbGRQcm9wc1trZXldO1xuICAgICAgICBpZiAobmV4dCAhPT0gcHJldiAmJiBrZXkgIT09IFwidmFsdWVcIikge1xuICAgICAgICAgIGhvc3RQYXRjaFByb3AoXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHByZXYsXG4gICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgdm5vZGUuY2hpbGRyZW4sXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIHVubW91bnRDaGlsZHJlblxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChcInZhbHVlXCIgaW4gbmV3UHJvcHMpIHtcbiAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwgXCJ2YWx1ZVwiLCBvbGRQcm9wcy52YWx1ZSwgbmV3UHJvcHMudmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzRnJhZ21lbnQgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGZyYWdtZW50U3RhcnRBbmNob3IgPSBuMi5lbCA9IG4xID8gbjEuZWwgOiBob3N0Q3JlYXRlVGV4dChcIlwiKTtcbiAgICBjb25zdCBmcmFnbWVudEVuZEFuY2hvciA9IG4yLmFuY2hvciA9IG4xID8gbjEuYW5jaG9yIDogaG9zdENyZWF0ZVRleHQoXCJcIik7XG4gICAgbGV0IHsgcGF0Y2hGbGFnLCBkeW5hbWljQ2hpbGRyZW4sIHNsb3RTY29wZUlkczogZnJhZ21lbnRTbG90U2NvcGVJZHMgfSA9IG4yO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIC8vICM1NTIzIGRldiByb290IGZyYWdtZW50IG1heSBpbmhlcml0IGRpcmVjdGl2ZXNcbiAgICAoaXNIbXJVcGRhdGluZyB8fCBwYXRjaEZsYWcgJiAyMDQ4KSkge1xuICAgICAgcGF0Y2hGbGFnID0gMDtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGZyYWdtZW50U2xvdFNjb3BlSWRzKSB7XG4gICAgICBzbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHMgPyBzbG90U2NvcGVJZHMuY29uY2F0KGZyYWdtZW50U2xvdFNjb3BlSWRzKSA6IGZyYWdtZW50U2xvdFNjb3BlSWRzO1xuICAgIH1cbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgaG9zdEluc2VydChmcmFnbWVudFN0YXJ0QW5jaG9yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBob3N0SW5zZXJ0KGZyYWdtZW50RW5kQW5jaG9yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICAvLyAjMTAwMDdcbiAgICAgICAgLy8gc3VjaCBmcmFnbWVudCBsaWtlIGA8PjwvPmAgd2lsbCBiZSBjb21waWxlZCBpbnRvXG4gICAgICAgIC8vIGEgZnJhZ21lbnQgd2hpY2ggZG9lc24ndCBoYXZlIGEgY2hpbGRyZW4uXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSBmYWxsYmFjayB0byBhbiBlbXB0eSBhcnJheVxuICAgICAgICBuMi5jaGlsZHJlbiB8fCBbXSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBmcmFnbWVudEVuZEFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBhdGNoRmxhZyA+IDAgJiYgcGF0Y2hGbGFnICYgNjQgJiYgZHluYW1pY0NoaWxkcmVuICYmIC8vICMyNzE1IHRoZSBwcmV2aW91cyBmcmFnbWVudCBjb3VsZCd2ZSBiZWVuIGEgQkFJTGVkIG9uZSBhcyBhIHJlc3VsdFxuICAgICAgLy8gb2YgcmVuZGVyU2xvdCgpIHdpdGggbm8gdmFsaWQgY2hpbGRyZW5cbiAgICAgIG4xLmR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgICBwYXRjaEJsb2NrQ2hpbGRyZW4oXG4gICAgICAgICAgbjEuZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB0cmF2ZXJzZVN0YXRpY0NoaWxkcmVuKG4xLCBuMik7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gIzIwODAgaWYgdGhlIHN0YWJsZSBmcmFnbWVudCBoYXMgYSBrZXksIGl0J3MgYSA8dGVtcGxhdGUgdi1mb3I+IHRoYXQgbWF5XG4gICAgICAgICAgLy8gIGdldCBtb3ZlZCBhcm91bmQuIE1ha2Ugc3VyZSBhbGwgcm9vdCBsZXZlbCB2bm9kZXMgaW5oZXJpdCBlbC5cbiAgICAgICAgICAvLyAjMjEzNCBvciBpZiBpdCdzIGEgY29tcG9uZW50IHJvb3QsIGl0IG1heSBhbHNvIGdldCBtb3ZlZCBhcm91bmRcbiAgICAgICAgICAvLyBhcyB0aGUgY29tcG9uZW50IGlzIGJlaW5nIG1vdmVkLlxuICAgICAgICAgIG4yLmtleSAhPSBudWxsIHx8IHBhcmVudENvbXBvbmVudCAmJiBuMiA9PT0gcGFyZW50Q29tcG9uZW50LnN1YlRyZWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAvKiBzaGFsbG93ICovXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0Y2hDaGlsZHJlbihcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgZnJhZ21lbnRFbmRBbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzQ29tcG9uZW50ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBuMi5zbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHM7XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGlmIChuMi5zaGFwZUZsYWcgJiA1MTIpIHtcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LmN0eC5hY3RpdmF0ZShcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1vdW50Q29tcG9uZW50KFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlQ29tcG9uZW50KG4xLCBuMiwgb3B0aW1pemVkKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50Q29tcG9uZW50ID0gKGluaXRpYWxWTm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgb3B0aW1pemVkKSA9PiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSAoaW5pdGlhbFZOb2RlLmNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKFxuICAgICAgaW5pdGlhbFZOb2RlLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2VcbiAgICApKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpbnN0YW5jZS50eXBlLl9faG1ySWQpIHtcbiAgICAgIHJlZ2lzdGVySE1SKGluc3RhbmNlKTtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChpbml0aWFsVk5vZGUpO1xuICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgbW91bnRgKTtcbiAgICB9XG4gICAgaWYgKGlzS2VlcEFsaXZlKGluaXRpYWxWTm9kZSkpIHtcbiAgICAgIGluc3RhbmNlLmN0eC5yZW5kZXJlciA9IGludGVybmFscztcbiAgICB9XG4gICAge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgaW5pdGApO1xuICAgICAgfVxuICAgICAgc2V0dXBDb21wb25lbnQoaW5zdGFuY2UpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYGluaXRgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluc3RhbmNlLmFzeW5jRGVwKSB7XG4gICAgICBwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5yZWdpc3RlckRlcChpbnN0YW5jZSwgc2V0dXBSZW5kZXJFZmZlY3QpO1xuICAgICAgaWYgKCFpbml0aWFsVk5vZGUuZWwpIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBpbnN0YW5jZS5zdWJUcmVlID0gY3JlYXRlVk5vZGUoQ29tbWVudCk7XG4gICAgICAgIHByb2Nlc3NDb21tZW50Tm9kZShudWxsLCBwbGFjZWhvbGRlciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXR1cFJlbmRlckVmZmVjdChcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIGluaXRpYWxWTm9kZSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgbW91bnRgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHVwZGF0ZUNvbXBvbmVudCA9IChuMSwgbjIsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbjIuY29tcG9uZW50ID0gbjEuY29tcG9uZW50O1xuICAgIGlmIChzaG91bGRVcGRhdGVDb21wb25lbnQobjEsIG4yLCBvcHRpbWl6ZWQpKSB7XG4gICAgICBpZiAoaW5zdGFuY2UuYXN5bmNEZXAgJiYgIWluc3RhbmNlLmFzeW5jUmVzb2x2ZWQpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwdXNoV2FybmluZ0NvbnRleHQobjIpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlcihpbnN0YW5jZSwgbjIsIG9wdGltaXplZCk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0YW5jZS5uZXh0ID0gbjI7XG4gICAgICAgIGludmFsaWRhdGVKb2IoaW5zdGFuY2UudXBkYXRlKTtcbiAgICAgICAgaW5zdGFuY2UuZWZmZWN0LmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgICBpbnN0YW5jZS52bm9kZSA9IG4yO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc2V0dXBSZW5kZXJFZmZlY3QgPSAoaW5zdGFuY2UsIGluaXRpYWxWTm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudFVwZGF0ZUZuID0gKCkgPT4ge1xuICAgICAgaWYgKCFpbnN0YW5jZS5pc01vdW50ZWQpIHtcbiAgICAgICAgbGV0IHZub2RlSG9vaztcbiAgICAgICAgY29uc3QgeyBlbCwgcHJvcHMgfSA9IGluaXRpYWxWTm9kZTtcbiAgICAgICAgY29uc3QgeyBibSwgbSwgcGFyZW50IH0gPSBpbnN0YW5jZTtcbiAgICAgICAgY29uc3QgaXNBc3luY1dyYXBwZXJWTm9kZSA9IGlzQXN5bmNXcmFwcGVyKGluaXRpYWxWTm9kZSk7XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIGZhbHNlKTtcbiAgICAgICAgaWYgKGJtKSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoYm0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBc3luY1dyYXBwZXJWTm9kZSAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZUJlZm9yZU1vdW50KSkge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgaW5pdGlhbFZOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCB0cnVlKTtcbiAgICAgICAgaWYgKGVsICYmIGh5ZHJhdGVOb2RlKSB7XG4gICAgICAgICAgY29uc3QgaHlkcmF0ZVN1YlRyZWUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluc3RhbmNlLnN1YlRyZWUgPSByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKTtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYGh5ZHJhdGVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh5ZHJhdGVOb2RlKFxuICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAgaW5zdGFuY2Uuc3ViVHJlZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYGh5ZHJhdGVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpc0FzeW5jV3JhcHBlclZOb2RlKSB7XG4gICAgICAgICAgICBpbml0aWFsVk5vZGUudHlwZS5fX2FzeW5jTG9hZGVyKCkudGhlbihcbiAgICAgICAgICAgICAgLy8gbm90ZTogd2UgYXJlIG1vdmluZyB0aGUgcmVuZGVyIGNhbGwgaW50byBhbiBhc3luYyBjYWxsYmFjayxcbiAgICAgICAgICAgICAgLy8gd2hpY2ggbWVhbnMgaXQgd29uJ3QgdHJhY2sgZGVwZW5kZW5jaWVzIC0gYnV0IGl0J3Mgb2sgYmVjYXVzZVxuICAgICAgICAgICAgICAvLyBhIHNlcnZlci1yZW5kZXJlZCBhc3luYyB3cmFwcGVyIGlzIGFscmVhZHkgaW4gcmVzb2x2ZWQgc3RhdGVcbiAgICAgICAgICAgICAgLy8gYW5kIGl0IHdpbGwgbmV2ZXIgbmVlZCB0byBjaGFuZ2UuXG4gICAgICAgICAgICAgICgpID0+ICFpbnN0YW5jZS5pc1VubW91bnRlZCAmJiBoeWRyYXRlU3ViVHJlZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoeWRyYXRlU3ViVHJlZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHN1YlRyZWUgPSBpbnN0YW5jZS5zdWJUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHN1YlRyZWUsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluaXRpYWxWTm9kZS5lbCA9IHN1YlRyZWUuZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QobSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBc3luY1dyYXBwZXJWTm9kZSAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpKSB7XG4gICAgICAgICAgY29uc3Qgc2NvcGVkSW5pdGlhbFZOb2RlID0gaW5pdGlhbFZOb2RlO1xuICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChcbiAgICAgICAgICAgICgpID0+IGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgc2NvcGVkSW5pdGlhbFZOb2RlKSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5pdGlhbFZOb2RlLnNoYXBlRmxhZyAmIDI1NiB8fCBwYXJlbnQgJiYgaXNBc3luY1dyYXBwZXIocGFyZW50LnZub2RlKSAmJiBwYXJlbnQudm5vZGUuc2hhcGVGbGFnICYgMjU2KSB7XG4gICAgICAgICAgaW5zdGFuY2UuYSAmJiBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoaW5zdGFuY2UuYSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLmlzTW91bnRlZCA9IHRydWU7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGluaXRpYWxWTm9kZSA9IGNvbnRhaW5lciA9IGFuY2hvciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgeyBuZXh0LCBidSwgdSwgcGFyZW50LCB2bm9kZSB9ID0gaW5zdGFuY2U7XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBub25IeWRyYXRlZEFzeW5jUm9vdCA9IGxvY2F0ZU5vbkh5ZHJhdGVkQXN5bmNSb290KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAobm9uSHlkcmF0ZWRBc3luY1Jvb3QpIHtcbiAgICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAgIG5leHQuZWwgPSB2bm9kZS5lbDtcbiAgICAgICAgICAgICAgdXBkYXRlQ29tcG9uZW50UHJlUmVuZGVyKGluc3RhbmNlLCBuZXh0LCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9uSHlkcmF0ZWRBc3luY1Jvb3QuYXN5bmNEZXAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaW5zdGFuY2UuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRVcGRhdGVGbigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9yaWdpbk5leHQgPSBuZXh0O1xuICAgICAgICBsZXQgdm5vZGVIb29rO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChuZXh0IHx8IGluc3RhbmNlLnZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCBmYWxzZSk7XG4gICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgbmV4dC5lbCA9IHZub2RlLmVsO1xuICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlcihpbnN0YW5jZSwgbmV4dCwgb3B0aW1pemVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0ID0gdm5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1KSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoYnUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2bm9kZUhvb2sgPSBuZXh0LnByb3BzICYmIG5leHQucHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgbmV4dCwgdm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIHRydWUpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5leHRUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZUcmVlID0gaW5zdGFuY2Uuc3ViVHJlZTtcbiAgICAgICAgaW5zdGFuY2Uuc3ViVHJlZSA9IG5leHRUcmVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgcHJldlRyZWUsXG4gICAgICAgICAgbmV4dFRyZWUsXG4gICAgICAgICAgLy8gcGFyZW50IG1heSBoYXZlIGNoYW5nZWQgaWYgaXQncyBpbiBhIHRlbGVwb3J0XG4gICAgICAgICAgaG9zdFBhcmVudE5vZGUocHJldlRyZWUuZWwpLFxuICAgICAgICAgIC8vIGFuY2hvciBtYXkgaGF2ZSBjaGFuZ2VkIGlmIGl0J3MgaW4gYSBmcmFnbWVudFxuICAgICAgICAgIGdldE5leHRIb3N0Tm9kZShwcmV2VHJlZSksXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dC5lbCA9IG5leHRUcmVlLmVsO1xuICAgICAgICBpZiAob3JpZ2luTmV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhPQ0hvc3RFbChpbnN0YW5jZSwgbmV4dFRyZWUuZWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1KSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KHUsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodm5vZGVIb29rID0gbmV4dC5wcm9wcyAmJiBuZXh0LnByb3BzLm9uVm5vZGVVcGRhdGVkKSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4gaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50LCBuZXh0LCB2bm9kZSksXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGVmZmVjdCA9IGluc3RhbmNlLmVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChcbiAgICAgIGNvbXBvbmVudFVwZGF0ZUZuLFxuICAgICAgTk9PUCxcbiAgICAgICgpID0+IHF1ZXVlSm9iKHVwZGF0ZSksXG4gICAgICBpbnN0YW5jZS5zY29wZVxuICAgICAgLy8gdHJhY2sgaXQgaW4gY29tcG9uZW50J3MgZWZmZWN0IHNjb3BlXG4gICAgKTtcbiAgICBjb25zdCB1cGRhdGUgPSBpbnN0YW5jZS51cGRhdGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWZmZWN0LmRpcnR5KSB7XG4gICAgICAgIGVmZmVjdC5ydW4oKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHVwZGF0ZS5pZCA9IGluc3RhbmNlLnVpZDtcbiAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCB0cnVlKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgZWZmZWN0Lm9uVHJhY2sgPSBpbnN0YW5jZS5ydGMgPyAoZSkgPT4gaW52b2tlQXJyYXlGbnMoaW5zdGFuY2UucnRjLCBlKSA6IHZvaWQgMDtcbiAgICAgIGVmZmVjdC5vblRyaWdnZXIgPSBpbnN0YW5jZS5ydGcgPyAoZSkgPT4gaW52b2tlQXJyYXlGbnMoaW5zdGFuY2UucnRnLCBlKSA6IHZvaWQgMDtcbiAgICAgIHVwZGF0ZS5vd25lckluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgfVxuICAgIHVwZGF0ZSgpO1xuICB9O1xuICBjb25zdCB1cGRhdGVDb21wb25lbnRQcmVSZW5kZXIgPSAoaW5zdGFuY2UsIG5leHRWTm9kZSwgb3B0aW1pemVkKSA9PiB7XG4gICAgbmV4dFZOb2RlLmNvbXBvbmVudCA9IGluc3RhbmNlO1xuICAgIGNvbnN0IHByZXZQcm9wcyA9IGluc3RhbmNlLnZub2RlLnByb3BzO1xuICAgIGluc3RhbmNlLnZub2RlID0gbmV4dFZOb2RlO1xuICAgIGluc3RhbmNlLm5leHQgPSBudWxsO1xuICAgIHVwZGF0ZVByb3BzKGluc3RhbmNlLCBuZXh0Vk5vZGUucHJvcHMsIHByZXZQcm9wcywgb3B0aW1pemVkKTtcbiAgICB1cGRhdGVTbG90cyhpbnN0YW5jZSwgbmV4dFZOb2RlLmNoaWxkcmVuLCBvcHRpbWl6ZWQpO1xuICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICBmbHVzaFByZUZsdXNoQ2JzKGluc3RhbmNlKTtcbiAgICByZXNldFRyYWNraW5nKCk7XG4gIH07XG4gIGNvbnN0IHBhdGNoQ2hpbGRyZW4gPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgYzEgPSBuMSAmJiBuMS5jaGlsZHJlbjtcbiAgICBjb25zdCBwcmV2U2hhcGVGbGFnID0gbjEgPyBuMS5zaGFwZUZsYWcgOiAwO1xuICAgIGNvbnN0IGMyID0gbjIuY2hpbGRyZW47XG4gICAgY29uc3QgeyBwYXRjaEZsYWcsIHNoYXBlRmxhZyB9ID0gbjI7XG4gICAgaWYgKHBhdGNoRmxhZyA+IDApIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgJiAxMjgpIHtcbiAgICAgICAgcGF0Y2hLZXllZENoaWxkcmVuKFxuICAgICAgICAgIGMxLFxuICAgICAgICAgIGMyLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAocGF0Y2hGbGFnICYgMjU2KSB7XG4gICAgICAgIHBhdGNoVW5rZXllZENoaWxkcmVuKFxuICAgICAgICAgIGMxLFxuICAgICAgICAgIGMyLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDgpIHtcbiAgICAgIGlmIChwcmV2U2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgdW5tb3VudENoaWxkcmVuKGMxLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChjMiAhPT0gYzEpIHtcbiAgICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGNvbnRhaW5lciwgYzIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJldlNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgICAgIHBhdGNoS2V5ZWRDaGlsZHJlbihcbiAgICAgICAgICAgIGMxLFxuICAgICAgICAgICAgYzIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5tb3VudENoaWxkcmVuKGMxLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByZXZTaGFwZUZsYWcgJiA4KSB7XG4gICAgICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGNvbnRhaW5lciwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgICAgIGMyLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaFVua2V5ZWRDaGlsZHJlbiA9IChjMSwgYzIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgYzEgPSBjMSB8fCBFTVBUWV9BUlI7XG4gICAgYzIgPSBjMiB8fCBFTVBUWV9BUlI7XG4gICAgY29uc3Qgb2xkTGVuZ3RoID0gYzEubGVuZ3RoO1xuICAgIGNvbnN0IG5ld0xlbmd0aCA9IGMyLmxlbmd0aDtcbiAgICBjb25zdCBjb21tb25MZW5ndGggPSBNYXRoLm1pbihvbGRMZW5ndGgsIG5ld0xlbmd0aCk7XG4gICAgbGV0IGk7XG4gICAgZm9yIChpID0gMDsgaSA8IGNvbW1vbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuZXh0Q2hpbGQgPSBjMltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGMyW2ldKTtcbiAgICAgIHBhdGNoKFxuICAgICAgICBjMVtpXSxcbiAgICAgICAgbmV4dENoaWxkLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvbGRMZW5ndGggPiBuZXdMZW5ndGgpIHtcbiAgICAgIHVubW91bnRDaGlsZHJlbihcbiAgICAgICAgYzEsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHRydWUsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBjb21tb25MZW5ndGhcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgIGMyLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgY29tbW9uTGVuZ3RoXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hLZXllZENoaWxkcmVuID0gKGMxLCBjMiwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBsZXQgaSA9IDA7XG4gICAgY29uc3QgbDIgPSBjMi5sZW5ndGg7XG4gICAgbGV0IGUxID0gYzEubGVuZ3RoIC0gMTtcbiAgICBsZXQgZTIgPSBsMiAtIDE7XG4gICAgd2hpbGUgKGkgPD0gZTEgJiYgaSA8PSBlMikge1xuICAgICAgY29uc3QgbjEgPSBjMVtpXTtcbiAgICAgIGNvbnN0IG4yID0gYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSk7XG4gICAgICBpZiAoaXNTYW1lVk5vZGVUeXBlKG4xLCBuMikpIHtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG4gICAgd2hpbGUgKGkgPD0gZTEgJiYgaSA8PSBlMikge1xuICAgICAgY29uc3QgbjEgPSBjMVtlMV07XG4gICAgICBjb25zdCBuMiA9IGMyW2UyXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2UyXSkgOiBub3JtYWxpemVWTm9kZShjMltlMl0pO1xuICAgICAgaWYgKGlzU2FtZVZOb2RlVHlwZShuMSwgbjIpKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG4xLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBlMS0tO1xuICAgICAgZTItLTtcbiAgICB9XG4gICAgaWYgKGkgPiBlMSkge1xuICAgICAgaWYgKGkgPD0gZTIpIHtcbiAgICAgICAgY29uc3QgbmV4dFBvcyA9IGUyICsgMTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gbmV4dFBvcyA8IGwyID8gYzJbbmV4dFBvc10uZWwgOiBwYXJlbnRBbmNob3I7XG4gICAgICAgIHdoaWxlIChpIDw9IGUyKSB7XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSksXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpID4gZTIpIHtcbiAgICAgIHdoaWxlIChpIDw9IGUxKSB7XG4gICAgICAgIHVubW91bnQoYzFbaV0sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHMxID0gaTtcbiAgICAgIGNvbnN0IHMyID0gaTtcbiAgICAgIGNvbnN0IGtleVRvTmV3SW5kZXhNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgZm9yIChpID0gczI7IGkgPD0gZTI7IGkrKykge1xuICAgICAgICBjb25zdCBuZXh0Q2hpbGQgPSBjMltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGMyW2ldKTtcbiAgICAgICAgaWYgKG5leHRDaGlsZC5rZXkgIT0gbnVsbCkge1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleVRvTmV3SW5kZXhNYXAuaGFzKG5leHRDaGlsZC5rZXkpKSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIGBEdXBsaWNhdGUga2V5cyBmb3VuZCBkdXJpbmcgdXBkYXRlOmAsXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5leHRDaGlsZC5rZXkpLFxuICAgICAgICAgICAgICBgTWFrZSBzdXJlIGtleXMgYXJlIHVuaXF1ZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZXlUb05ld0luZGV4TWFwLnNldChuZXh0Q2hpbGQua2V5LCBpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGo7XG4gICAgICBsZXQgcGF0Y2hlZCA9IDA7XG4gICAgICBjb25zdCB0b0JlUGF0Y2hlZCA9IGUyIC0gczIgKyAxO1xuICAgICAgbGV0IG1vdmVkID0gZmFsc2U7XG4gICAgICBsZXQgbWF4TmV3SW5kZXhTb0ZhciA9IDA7XG4gICAgICBjb25zdCBuZXdJbmRleFRvT2xkSW5kZXhNYXAgPSBuZXcgQXJyYXkodG9CZVBhdGNoZWQpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHRvQmVQYXRjaGVkOyBpKyspXG4gICAgICAgIG5ld0luZGV4VG9PbGRJbmRleE1hcFtpXSA9IDA7XG4gICAgICBmb3IgKGkgPSBzMTsgaSA8PSBlMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByZXZDaGlsZCA9IGMxW2ldO1xuICAgICAgICBpZiAocGF0Y2hlZCA+PSB0b0JlUGF0Y2hlZCkge1xuICAgICAgICAgIHVubW91bnQocHJldkNoaWxkLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3SW5kZXg7XG4gICAgICAgIGlmIChwcmV2Q2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdJbmRleCA9IGtleVRvTmV3SW5kZXhNYXAuZ2V0KHByZXZDaGlsZC5rZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAoaiA9IHMyOyBqIDw9IGUyOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChuZXdJbmRleFRvT2xkSW5kZXhNYXBbaiAtIHMyXSA9PT0gMCAmJiBpc1NhbWVWTm9kZVR5cGUocHJldkNoaWxkLCBjMltqXSkpIHtcbiAgICAgICAgICAgICAgbmV3SW5kZXggPSBqO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld0luZGV4ID09PSB2b2lkIDApIHtcbiAgICAgICAgICB1bm1vdW50KHByZXZDaGlsZCwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3SW5kZXhUb09sZEluZGV4TWFwW25ld0luZGV4IC0gczJdID0gaSArIDE7XG4gICAgICAgICAgaWYgKG5ld0luZGV4ID49IG1heE5ld0luZGV4U29GYXIpIHtcbiAgICAgICAgICAgIG1heE5ld0luZGV4U29GYXIgPSBuZXdJbmRleDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIHByZXZDaGlsZCxcbiAgICAgICAgICAgIGMyW25ld0luZGV4XSxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgcGF0Y2hlZCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBpbmNyZWFzaW5nTmV3SW5kZXhTZXF1ZW5jZSA9IG1vdmVkID8gZ2V0U2VxdWVuY2UobmV3SW5kZXhUb09sZEluZGV4TWFwKSA6IEVNUFRZX0FSUjtcbiAgICAgIGogPSBpbmNyZWFzaW5nTmV3SW5kZXhTZXF1ZW5jZS5sZW5ndGggLSAxO1xuICAgICAgZm9yIChpID0gdG9CZVBhdGNoZWQgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBzMiArIGk7XG4gICAgICAgIGNvbnN0IG5leHRDaGlsZCA9IGMyW25leHRJbmRleF07XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IG5leHRJbmRleCArIDEgPCBsMiA/IGMyW25leHRJbmRleCArIDFdLmVsIDogcGFyZW50QW5jaG9yO1xuICAgICAgICBpZiAobmV3SW5kZXhUb09sZEluZGV4TWFwW2ldID09PSAwKSB7XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbmV4dENoaWxkLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKG1vdmVkKSB7XG4gICAgICAgICAgaWYgKGogPCAwIHx8IGkgIT09IGluY3JlYXNpbmdOZXdJbmRleFNlcXVlbmNlW2pdKSB7XG4gICAgICAgICAgICBtb3ZlKG5leHRDaGlsZCwgY29udGFpbmVyLCBhbmNob3IsIDIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBqLS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3ZlID0gKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUsIHBhcmVudFN1c3BlbnNlID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IHsgZWwsIHR5cGUsIHRyYW5zaXRpb24sIGNoaWxkcmVuLCBzaGFwZUZsYWcgfSA9IHZub2RlO1xuICAgIGlmIChzaGFwZUZsYWcgJiA2KSB7XG4gICAgICBtb3ZlKHZub2RlLmNvbXBvbmVudC5zdWJUcmVlLCBjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICB2bm9kZS5zdXNwZW5zZS5tb3ZlKGNvbnRhaW5lciwgYW5jaG9yLCBtb3ZlVHlwZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgdHlwZS5tb3ZlKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgaW50ZXJuYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vdmUoY2hpbGRyZW5baV0sIGNvbnRhaW5lciwgYW5jaG9yLCBtb3ZlVHlwZSk7XG4gICAgICB9XG4gICAgICBob3N0SW5zZXJ0KHZub2RlLmFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gU3RhdGljKSB7XG4gICAgICBtb3ZlU3RhdGljTm9kZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZWVkVHJhbnNpdGlvbjIgPSBtb3ZlVHlwZSAhPT0gMiAmJiBzaGFwZUZsYWcgJiAxICYmIHRyYW5zaXRpb247XG4gICAgaWYgKG5lZWRUcmFuc2l0aW9uMikge1xuICAgICAgaWYgKG1vdmVUeXBlID09PSAwKSB7XG4gICAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoZWwpO1xuICAgICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB0cmFuc2l0aW9uLmVudGVyKGVsKSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBsZWF2ZSwgZGVsYXlMZWF2ZSwgYWZ0ZXJMZWF2ZSB9ID0gdHJhbnNpdGlvbjtcbiAgICAgICAgY29uc3QgcmVtb3ZlMiA9ICgpID0+IGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgY29uc3QgcGVyZm9ybUxlYXZlID0gKCkgPT4ge1xuICAgICAgICAgIGxlYXZlKGVsLCAoKSA9PiB7XG4gICAgICAgICAgICByZW1vdmUyKCk7XG4gICAgICAgICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRlbGF5TGVhdmUpIHtcbiAgICAgICAgICBkZWxheUxlYXZlKGVsLCByZW1vdmUyLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlcmZvcm1MZWF2ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHVubW91bnQgPSAodm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlID0gZmFsc2UsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgdHlwZSxcbiAgICAgIHByb3BzLFxuICAgICAgcmVmLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICBzaGFwZUZsYWcsXG4gICAgICBwYXRjaEZsYWcsXG4gICAgICBkaXJzXG4gICAgfSA9IHZub2RlO1xuICAgIGlmIChyZWYgIT0gbnVsbCkge1xuICAgICAgc2V0UmVmKHJlZiwgbnVsbCwgcGFyZW50U3VzcGVuc2UsIHZub2RlLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDI1Nikge1xuICAgICAgcGFyZW50Q29tcG9uZW50LmN0eC5kZWFjdGl2YXRlKHZub2RlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkSW52b2tlRGlycyA9IHNoYXBlRmxhZyAmIDEgJiYgZGlycztcbiAgICBjb25zdCBzaG91bGRJbnZva2VWbm9kZUhvb2sgPSAhaXNBc3luY1dyYXBwZXIodm5vZGUpO1xuICAgIGxldCB2bm9kZUhvb2s7XG4gICAgaWYgKHNob3VsZEludm9rZVZub2RlSG9vayAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZUJlZm9yZVVubW91bnQpKSB7XG4gICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgIHVubW91bnRDb21wb25lbnQodm5vZGUuY29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICAgIHZub2RlLnN1c3BlbnNlLnVubW91bnQocGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZEludm9rZURpcnMpIHtcbiAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZVVubW91bnRcIik7XG4gICAgICB9XG4gICAgICBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgICAgdm5vZGUudHlwZS5yZW1vdmUoXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgICBpbnRlcm5hbHMsXG4gICAgICAgICAgZG9SZW1vdmVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZHluYW1pY0NoaWxkcmVuICYmIC8vICMxMTUzOiBmYXN0IHBhdGggc2hvdWxkIG5vdCBiZSB0YWtlbiBmb3Igbm9uLXN0YWJsZSAodi1mb3IpIGZyYWdtZW50c1xuICAgICAgKHR5cGUgIT09IEZyYWdtZW50IHx8IHBhdGNoRmxhZyA+IDAgJiYgcGF0Y2hGbGFnICYgNjQpKSB7XG4gICAgICAgIHVubW91bnRDaGlsZHJlbihcbiAgICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gRnJhZ21lbnQgJiYgcGF0Y2hGbGFnICYgKDEyOCB8IDI1NikgfHwgIW9wdGltaXplZCAmJiBzaGFwZUZsYWcgJiAxNikge1xuICAgICAgICB1bm1vdW50Q2hpbGRyZW4oY2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfVxuICAgICAgaWYgKGRvUmVtb3ZlKSB7XG4gICAgICAgIHJlbW92ZSh2bm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRJbnZva2VWbm9kZUhvb2sgJiYgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVVbm1vdW50ZWQpIHx8IHNob3VsZEludm9rZURpcnMpIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgICAgc2hvdWxkSW52b2tlRGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwidW5tb3VudGVkXCIpO1xuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcmVtb3ZlID0gKHZub2RlKSA9PiB7XG4gICAgY29uc3QgeyB0eXBlLCBlbCwgYW5jaG9yLCB0cmFuc2l0aW9uIH0gPSB2bm9kZTtcbiAgICBpZiAodHlwZSA9PT0gRnJhZ21lbnQpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHZub2RlLnBhdGNoRmxhZyA+IDAgJiYgdm5vZGUucGF0Y2hGbGFnICYgMjA0OCAmJiB0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZCkge1xuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSBDb21tZW50KSB7XG4gICAgICAgICAgICBob3N0UmVtb3ZlKGNoaWxkLmVsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlKGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlRnJhZ21lbnQoZWwsIGFuY2hvcik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBTdGF0aWMpIHtcbiAgICAgIHJlbW92ZVN0YXRpY05vZGUodm5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwZXJmb3JtUmVtb3ZlID0gKCkgPT4ge1xuICAgICAgaG9zdFJlbW92ZShlbCk7XG4gICAgICBpZiAodHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQgJiYgdHJhbnNpdGlvbi5hZnRlckxlYXZlKSB7XG4gICAgICAgIHRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEgJiYgdHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQpIHtcbiAgICAgIGNvbnN0IHsgbGVhdmUsIGRlbGF5TGVhdmUgfSA9IHRyYW5zaXRpb247XG4gICAgICBjb25zdCBwZXJmb3JtTGVhdmUgPSAoKSA9PiBsZWF2ZShlbCwgcGVyZm9ybVJlbW92ZSk7XG4gICAgICBpZiAoZGVsYXlMZWF2ZSkge1xuICAgICAgICBkZWxheUxlYXZlKHZub2RlLmVsLCBwZXJmb3JtUmVtb3ZlLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVyZm9ybUxlYXZlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlcmZvcm1SZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlbW92ZUZyYWdtZW50ID0gKGN1ciwgZW5kKSA9PiB7XG4gICAgbGV0IG5leHQ7XG4gICAgd2hpbGUgKGN1ciAhPT0gZW5kKSB7XG4gICAgICBuZXh0ID0gaG9zdE5leHRTaWJsaW5nKGN1cik7XG4gICAgICBob3N0UmVtb3ZlKGN1cik7XG4gICAgICBjdXIgPSBuZXh0O1xuICAgIH1cbiAgICBob3N0UmVtb3ZlKGVuZCk7XG4gIH07XG4gIGNvbnN0IHVubW91bnRDb21wb25lbnQgPSAoaW5zdGFuY2UsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSkgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGluc3RhbmNlLnR5cGUuX19obXJJZCkge1xuICAgICAgdW5yZWdpc3RlckhNUihpbnN0YW5jZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgYnVtLCBzY29wZSwgdXBkYXRlLCBzdWJUcmVlLCB1bSB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKGJ1bSkge1xuICAgICAgaW52b2tlQXJyYXlGbnMoYnVtKTtcbiAgICB9XG4gICAgc2NvcGUuc3RvcCgpO1xuICAgIGlmICh1cGRhdGUpIHtcbiAgICAgIHVwZGF0ZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIHVubW91bnQoc3ViVHJlZSwgaW5zdGFuY2UsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSk7XG4gICAgfVxuICAgIGlmICh1bSkge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KHVtLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICBpbnN0YW5jZS5pc1VubW91bnRlZCA9IHRydWU7XG4gICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIGlmIChwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nQnJhbmNoICYmICFwYXJlbnRTdXNwZW5zZS5pc1VubW91bnRlZCAmJiBpbnN0YW5jZS5hc3luY0RlcCAmJiAhaW5zdGFuY2UuYXN5bmNSZXNvbHZlZCAmJiBpbnN0YW5jZS5zdXNwZW5zZUlkID09PSBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nSWQpIHtcbiAgICAgIHBhcmVudFN1c3BlbnNlLmRlcHMtLTtcbiAgICAgIGlmIChwYXJlbnRTdXNwZW5zZS5kZXBzID09PSAwKSB7XG4gICAgICAgIHBhcmVudFN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZXZ0b29sc0NvbXBvbmVudFJlbW92ZWQoaW5zdGFuY2UpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgdW5tb3VudENoaWxkcmVuID0gKGNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSA9IGZhbHNlLCBvcHRpbWl6ZWQgPSBmYWxzZSwgc3RhcnQgPSAwKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHVubW91bnQoY2hpbGRyZW5baV0sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlLCBvcHRpbWl6ZWQpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZ2V0TmV4dEhvc3ROb2RlID0gKHZub2RlKSA9PiB7XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDYpIHtcbiAgICAgIHJldHVybiBnZXROZXh0SG9zdE5vZGUodm5vZGUuY29tcG9uZW50LnN1YlRyZWUpO1xuICAgIH1cbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICByZXR1cm4gdm5vZGUuc3VzcGVuc2UubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gaG9zdE5leHRTaWJsaW5nKHZub2RlLmFuY2hvciB8fCB2bm9kZS5lbCk7XG4gIH07XG4gIGxldCBpc0ZsdXNoaW5nID0gZmFsc2U7XG4gIGNvbnN0IHJlbmRlciA9ICh2bm9kZSwgY29udGFpbmVyLCBuYW1lc3BhY2UpID0+IHtcbiAgICBpZiAodm5vZGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGNvbnRhaW5lci5fdm5vZGUpIHtcbiAgICAgICAgdW5tb3VudChjb250YWluZXIuX3Zub2RlLCBudWxsLCBudWxsLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGF0Y2goXG4gICAgICAgIGNvbnRhaW5lci5fdm5vZGUgfHwgbnVsbCxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbmFtZXNwYWNlXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWlzRmx1c2hpbmcpIHtcbiAgICAgIGlzRmx1c2hpbmcgPSB0cnVlO1xuICAgICAgZmx1c2hQcmVGbHVzaENicygpO1xuICAgICAgZmx1c2hQb3N0Rmx1c2hDYnMoKTtcbiAgICAgIGlzRmx1c2hpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgY29udGFpbmVyLl92bm9kZSA9IHZub2RlO1xuICB9O1xuICBjb25zdCBpbnRlcm5hbHMgPSB7XG4gICAgcDogcGF0Y2gsXG4gICAgdW06IHVubW91bnQsXG4gICAgbTogbW92ZSxcbiAgICByOiByZW1vdmUsXG4gICAgbXQ6IG1vdW50Q29tcG9uZW50LFxuICAgIG1jOiBtb3VudENoaWxkcmVuLFxuICAgIHBjOiBwYXRjaENoaWxkcmVuLFxuICAgIHBiYzogcGF0Y2hCbG9ja0NoaWxkcmVuLFxuICAgIG46IGdldE5leHRIb3N0Tm9kZSxcbiAgICBvOiBvcHRpb25zXG4gIH07XG4gIGxldCBoeWRyYXRlO1xuICBsZXQgaHlkcmF0ZU5vZGU7XG4gIGlmIChjcmVhdGVIeWRyYXRpb25GbnMpIHtcbiAgICBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdID0gY3JlYXRlSHlkcmF0aW9uRm5zKFxuICAgICAgaW50ZXJuYWxzXG4gICAgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlbmRlcixcbiAgICBoeWRyYXRlLFxuICAgIGNyZWF0ZUFwcDogY3JlYXRlQXBwQVBJKHJlbmRlciwgaHlkcmF0ZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVDaGlsZHJlbk5hbWVzcGFjZSh7IHR5cGUsIHByb3BzIH0sIGN1cnJlbnROYW1lc3BhY2UpIHtcbiAgcmV0dXJuIGN1cnJlbnROYW1lc3BhY2UgPT09IFwic3ZnXCIgJiYgdHlwZSA9PT0gXCJmb3JlaWduT2JqZWN0XCIgfHwgY3VycmVudE5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiAmJiB0eXBlID09PSBcImFubm90YXRpb24teG1sXCIgJiYgcHJvcHMgJiYgcHJvcHMuZW5jb2RpbmcgJiYgcHJvcHMuZW5jb2RpbmcuaW5jbHVkZXMoXCJodG1sXCIpID8gdm9pZCAwIDogY3VycmVudE5hbWVzcGFjZTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZVJlY3Vyc2UoeyBlZmZlY3QsIHVwZGF0ZSB9LCBhbGxvd2VkKSB7XG4gIGVmZmVjdC5hbGxvd1JlY3Vyc2UgPSB1cGRhdGUuYWxsb3dSZWN1cnNlID0gYWxsb3dlZDtcbn1cbmZ1bmN0aW9uIG5lZWRUcmFuc2l0aW9uKHBhcmVudFN1c3BlbnNlLCB0cmFuc2l0aW9uKSB7XG4gIHJldHVybiAoIXBhcmVudFN1c3BlbnNlIHx8IHBhcmVudFN1c3BlbnNlICYmICFwYXJlbnRTdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSAmJiB0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZDtcbn1cbmZ1bmN0aW9uIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4objEsIG4yLCBzaGFsbG93ID0gZmFsc2UpIHtcbiAgY29uc3QgY2gxID0gbjEuY2hpbGRyZW47XG4gIGNvbnN0IGNoMiA9IG4yLmNoaWxkcmVuO1xuICBpZiAoaXNBcnJheShjaDEpICYmIGlzQXJyYXkoY2gyKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2gxLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjMSA9IGNoMVtpXTtcbiAgICAgIGxldCBjMiA9IGNoMltpXTtcbiAgICAgIGlmIChjMi5zaGFwZUZsYWcgJiAxICYmICFjMi5keW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKGMyLnBhdGNoRmxhZyA8PSAwIHx8IGMyLnBhdGNoRmxhZyA9PT0gMzIpIHtcbiAgICAgICAgICBjMiA9IGNoMltpXSA9IGNsb25lSWZNb3VudGVkKGNoMltpXSk7XG4gICAgICAgICAgYzIuZWwgPSBjMS5lbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNoYWxsb3cpXG4gICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihjMSwgYzIpO1xuICAgICAgfVxuICAgICAgaWYgKGMyLnR5cGUgPT09IFRleHQpIHtcbiAgICAgICAgYzIuZWwgPSBjMS5lbDtcbiAgICAgIH1cbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGMyLnR5cGUgPT09IENvbW1lbnQgJiYgIWMyLmVsKSB7XG4gICAgICAgIGMyLmVsID0gYzEuZWw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBnZXRTZXF1ZW5jZShhcnIpIHtcbiAgY29uc3QgcCA9IGFyci5zbGljZSgpO1xuICBjb25zdCByZXN1bHQgPSBbMF07XG4gIGxldCBpLCBqLCB1LCB2LCBjO1xuICBjb25zdCBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBhcnJJID0gYXJyW2ldO1xuICAgIGlmIChhcnJJICE9PSAwKSB7XG4gICAgICBqID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChhcnJbal0gPCBhcnJJKSB7XG4gICAgICAgIHBbaV0gPSBqO1xuICAgICAgICByZXN1bHQucHVzaChpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB1ID0gMDtcbiAgICAgIHYgPSByZXN1bHQubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlICh1IDwgdikge1xuICAgICAgICBjID0gdSArIHYgPj4gMTtcbiAgICAgICAgaWYgKGFycltyZXN1bHRbY11dIDwgYXJySSkge1xuICAgICAgICAgIHUgPSBjICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ID0gYztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGFyckkgPCBhcnJbcmVzdWx0W3VdXSkge1xuICAgICAgICBpZiAodSA+IDApIHtcbiAgICAgICAgICBwW2ldID0gcmVzdWx0W3UgLSAxXTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbdV0gPSBpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1ID0gcmVzdWx0Lmxlbmd0aDtcbiAgdiA9IHJlc3VsdFt1IC0gMV07XG4gIHdoaWxlICh1LS0gPiAwKSB7XG4gICAgcmVzdWx0W3VdID0gdjtcbiAgICB2ID0gcFt2XTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbG9jYXRlTm9uSHlkcmF0ZWRBc3luY1Jvb3QoaW5zdGFuY2UpIHtcbiAgY29uc3Qgc3ViQ29tcG9uZW50ID0gaW5zdGFuY2Uuc3ViVHJlZS5jb21wb25lbnQ7XG4gIGlmIChzdWJDb21wb25lbnQpIHtcbiAgICBpZiAoc3ViQ29tcG9uZW50LmFzeW5jRGVwICYmICFzdWJDb21wb25lbnQuYXN5bmNSZXNvbHZlZCkge1xuICAgICAgcmV0dXJuIHN1YkNvbXBvbmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvY2F0ZU5vbkh5ZHJhdGVkQXN5bmNSb290KHN1YkNvbXBvbmVudCk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGlzVGVsZXBvcnQgPSAodHlwZSkgPT4gdHlwZS5fX2lzVGVsZXBvcnQ7XG5jb25zdCBpc1RlbGVwb3J0RGlzYWJsZWQgPSAocHJvcHMpID0+IHByb3BzICYmIChwcm9wcy5kaXNhYmxlZCB8fCBwcm9wcy5kaXNhYmxlZCA9PT0gXCJcIik7XG5jb25zdCBpc1RhcmdldFNWRyA9ICh0YXJnZXQpID0+IHR5cGVvZiBTVkdFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ7XG5jb25zdCBpc1RhcmdldE1hdGhNTCA9ICh0YXJnZXQpID0+IHR5cGVvZiBNYXRoTUxFbGVtZW50ID09PSBcImZ1bmN0aW9uXCIgJiYgdGFyZ2V0IGluc3RhbmNlb2YgTWF0aE1MRWxlbWVudDtcbmNvbnN0IHJlc29sdmVUYXJnZXQgPSAocHJvcHMsIHNlbGVjdCkgPT4ge1xuICBjb25zdCB0YXJnZXRTZWxlY3RvciA9IHByb3BzICYmIHByb3BzLnRvO1xuICBpZiAoaXNTdHJpbmcodGFyZ2V0U2VsZWN0b3IpKSB7XG4gICAgaWYgKCFzZWxlY3QpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKFxuICAgICAgICBgQ3VycmVudCByZW5kZXJlciBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyB0YXJnZXQgZm9yIFRlbGVwb3J0cy4gKG1pc3NpbmcgcXVlcnlTZWxlY3RvciByZW5kZXJlciBvcHRpb24pYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBzZWxlY3QodGFyZ2V0U2VsZWN0b3IpO1xuICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2NhdGUgVGVsZXBvcnQgdGFyZ2V0IHdpdGggc2VsZWN0b3IgXCIke3RhcmdldFNlbGVjdG9yfVwiLiBOb3RlIHRoZSB0YXJnZXQgZWxlbWVudCBtdXN0IGV4aXN0IGJlZm9yZSB0aGUgY29tcG9uZW50IGlzIG1vdW50ZWQgLSBpLmUuIHRoZSB0YXJnZXQgY2Fubm90IGJlIHJlbmRlcmVkIGJ5IHRoZSBjb21wb25lbnQgaXRzZWxmLCBhbmQgaWRlYWxseSBzaG91bGQgYmUgb3V0c2lkZSBvZiB0aGUgZW50aXJlIFZ1ZSBjb21wb25lbnQgdHJlZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhdGFyZ2V0U2VsZWN0b3IgJiYgIWlzVGVsZXBvcnREaXNhYmxlZChwcm9wcykpIHtcbiAgICAgIHdhcm4kMShgSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQ6ICR7dGFyZ2V0U2VsZWN0b3J9YCk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRTZWxlY3RvcjtcbiAgfVxufTtcbmNvbnN0IFRlbGVwb3J0SW1wbCA9IHtcbiAgbmFtZTogXCJUZWxlcG9ydFwiLFxuICBfX2lzVGVsZXBvcnQ6IHRydWUsXG4gIHByb2Nlc3MobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgaW50ZXJuYWxzKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWM6IG1vdW50Q2hpbGRyZW4sXG4gICAgICBwYzogcGF0Y2hDaGlsZHJlbixcbiAgICAgIHBiYzogcGF0Y2hCbG9ja0NoaWxkcmVuLFxuICAgICAgbzogeyBpbnNlcnQsIHF1ZXJ5U2VsZWN0b3IsIGNyZWF0ZVRleHQsIGNyZWF0ZUNvbW1lbnQgfVxuICAgIH0gPSBpbnRlcm5hbHM7XG4gICAgY29uc3QgZGlzYWJsZWQgPSBpc1RlbGVwb3J0RGlzYWJsZWQobjIucHJvcHMpO1xuICAgIGxldCB7IHNoYXBlRmxhZywgY2hpbGRyZW4sIGR5bmFtaWNDaGlsZHJlbiB9ID0gbjI7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZykge1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICBkeW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBuMi5lbCA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVDb21tZW50KFwidGVsZXBvcnQgc3RhcnRcIikgOiBjcmVhdGVUZXh0KFwiXCIpO1xuICAgICAgY29uc3QgbWFpbkFuY2hvciA9IG4yLmFuY2hvciA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVDb21tZW50KFwidGVsZXBvcnQgZW5kXCIpIDogY3JlYXRlVGV4dChcIlwiKTtcbiAgICAgIGluc2VydChwbGFjZWhvbGRlciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgaW5zZXJ0KG1haW5BbmNob3IsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IG4yLnRhcmdldCA9IHJlc29sdmVUYXJnZXQobjIucHJvcHMsIHF1ZXJ5U2VsZWN0b3IpO1xuICAgICAgY29uc3QgdGFyZ2V0QW5jaG9yID0gbjIudGFyZ2V0QW5jaG9yID0gY3JlYXRlVGV4dChcIlwiKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgaW5zZXJ0KHRhcmdldEFuY2hvciwgdGFyZ2V0KTtcbiAgICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBpc1RhcmdldFNWRyh0YXJnZXQpKSB7XG4gICAgICAgICAgbmFtZXNwYWNlID0gXCJzdmdcIjtcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIgfHwgaXNUYXJnZXRNYXRoTUwodGFyZ2V0KSkge1xuICAgICAgICAgIG5hbWVzcGFjZSA9IFwibWF0aG1sXCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgd2FybiQxKFwiSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQgb24gbW91bnQ6XCIsIHRhcmdldCwgYCgke3R5cGVvZiB0YXJnZXR9KWApO1xuICAgICAgfVxuICAgICAgY29uc3QgbW91bnQgPSAoY29udGFpbmVyMiwgYW5jaG9yMikgPT4ge1xuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgICAgYW5jaG9yMixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBtb3VudChjb250YWluZXIsIG1haW5BbmNob3IpO1xuICAgICAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAgICAgbW91bnQodGFyZ2V0LCB0YXJnZXRBbmNob3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgY29uc3QgbWFpbkFuY2hvciA9IG4yLmFuY2hvciA9IG4xLmFuY2hvcjtcbiAgICAgIGNvbnN0IHRhcmdldCA9IG4yLnRhcmdldCA9IG4xLnRhcmdldDtcbiAgICAgIGNvbnN0IHRhcmdldEFuY2hvciA9IG4yLnRhcmdldEFuY2hvciA9IG4xLnRhcmdldEFuY2hvcjtcbiAgICAgIGNvbnN0IHdhc0Rpc2FibGVkID0gaXNUZWxlcG9ydERpc2FibGVkKG4xLnByb3BzKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb250YWluZXIgPSB3YXNEaXNhYmxlZCA/IGNvbnRhaW5lciA6IHRhcmdldDtcbiAgICAgIGNvbnN0IGN1cnJlbnRBbmNob3IgPSB3YXNEaXNhYmxlZCA/IG1haW5BbmNob3IgOiB0YXJnZXRBbmNob3I7XG4gICAgICBpZiAobmFtZXNwYWNlID09PSBcInN2Z1wiIHx8IGlzVGFyZ2V0U1ZHKHRhcmdldCkpIHtcbiAgICAgICAgbmFtZXNwYWNlID0gXCJzdmdcIjtcbiAgICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlID09PSBcIm1hdGhtbFwiIHx8IGlzVGFyZ2V0TWF0aE1MKHRhcmdldCkpIHtcbiAgICAgICAgbmFtZXNwYWNlID0gXCJtYXRobWxcIjtcbiAgICAgIH1cbiAgICAgIGlmIChkeW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgICAgcGF0Y2hCbG9ja0NoaWxkcmVuKFxuICAgICAgICAgIG4xLmR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgY3VycmVudENvbnRhaW5lcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkc1xuICAgICAgICApO1xuICAgICAgICB0cmF2ZXJzZVN0YXRpY0NoaWxkcmVuKG4xLCBuMiwgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgICAgcGF0Y2hDaGlsZHJlbihcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjdXJyZW50Q29udGFpbmVyLFxuICAgICAgICAgIGN1cnJlbnRBbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBpZiAoIXdhc0Rpc2FibGVkKSB7XG4gICAgICAgICAgbW92ZVRlbGVwb3J0KFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBtYWluQW5jaG9yLFxuICAgICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgICAgMVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG4yLnByb3BzICYmIG4xLnByb3BzICYmIG4yLnByb3BzLnRvICE9PSBuMS5wcm9wcy50bykge1xuICAgICAgICAgICAgbjIucHJvcHMudG8gPSBuMS5wcm9wcy50bztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgobjIucHJvcHMgJiYgbjIucHJvcHMudG8pICE9PSAobjEucHJvcHMgJiYgbjEucHJvcHMudG8pKSB7XG4gICAgICAgICAgY29uc3QgbmV4dFRhcmdldCA9IG4yLnRhcmdldCA9IHJlc29sdmVUYXJnZXQoXG4gICAgICAgICAgICBuMi5wcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5U2VsZWN0b3JcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChuZXh0VGFyZ2V0KSB7XG4gICAgICAgICAgICBtb3ZlVGVsZXBvcnQoXG4gICAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgICBuZXh0VGFyZ2V0LFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBpbnRlcm5hbHMsXG4gICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIFwiSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQgb24gdXBkYXRlOlwiLFxuICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgIGAoJHt0eXBlb2YgdGFyZ2V0fSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh3YXNEaXNhYmxlZCkge1xuICAgICAgICAgIG1vdmVUZWxlcG9ydChcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgdGFyZ2V0QW5jaG9yLFxuICAgICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgICAgMVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlQ3NzVmFycyhuMik7XG4gIH0sXG4gIHJlbW92ZSh2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgb3B0aW1pemVkLCB7IHVtOiB1bm1vdW50LCBvOiB7IHJlbW92ZTogaG9zdFJlbW92ZSB9IH0sIGRvUmVtb3ZlKSB7XG4gICAgY29uc3QgeyBzaGFwZUZsYWcsIGNoaWxkcmVuLCBhbmNob3IsIHRhcmdldEFuY2hvciwgdGFyZ2V0LCBwcm9wcyB9ID0gdm5vZGU7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgaG9zdFJlbW92ZSh0YXJnZXRBbmNob3IpO1xuICAgIH1cbiAgICBkb1JlbW92ZSAmJiBob3N0UmVtb3ZlKGFuY2hvcik7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBjb25zdCBzaG91bGRSZW1vdmUgPSBkb1JlbW92ZSB8fCAhaXNUZWxlcG9ydERpc2FibGVkKHByb3BzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgdW5tb3VudChcbiAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgc2hvdWxkUmVtb3ZlLFxuICAgICAgICAgICEhY2hpbGQuZHluYW1pY0NoaWxkcmVuXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBtb3ZlOiBtb3ZlVGVsZXBvcnQsXG4gIGh5ZHJhdGU6IGh5ZHJhdGVUZWxlcG9ydFxufTtcbmZ1bmN0aW9uIG1vdmVUZWxlcG9ydCh2bm9kZSwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IsIHsgbzogeyBpbnNlcnQgfSwgbTogbW92ZSB9LCBtb3ZlVHlwZSA9IDIpIHtcbiAgaWYgKG1vdmVUeXBlID09PSAwKSB7XG4gICAgaW5zZXJ0KHZub2RlLnRhcmdldEFuY2hvciwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IpO1xuICB9XG4gIGNvbnN0IHsgZWwsIGFuY2hvciwgc2hhcGVGbGFnLCBjaGlsZHJlbiwgcHJvcHMgfSA9IHZub2RlO1xuICBjb25zdCBpc1Jlb3JkZXIgPSBtb3ZlVHlwZSA9PT0gMjtcbiAgaWYgKGlzUmVvcmRlcikge1xuICAgIGluc2VydChlbCwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IpO1xuICB9XG4gIGlmICghaXNSZW9yZGVyIHx8IGlzVGVsZXBvcnREaXNhYmxlZChwcm9wcykpIHtcbiAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbW92ZShcbiAgICAgICAgICBjaGlsZHJlbltpXSxcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgcGFyZW50QW5jaG9yLFxuICAgICAgICAgIDJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGlzUmVvcmRlcikge1xuICAgIGluc2VydChhbmNob3IsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yKTtcbiAgfVxufVxuZnVuY3Rpb24gaHlkcmF0ZVRlbGVwb3J0KG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwge1xuICBvOiB7IG5leHRTaWJsaW5nLCBwYXJlbnROb2RlLCBxdWVyeVNlbGVjdG9yIH1cbn0sIGh5ZHJhdGVDaGlsZHJlbikge1xuICBjb25zdCB0YXJnZXQgPSB2bm9kZS50YXJnZXQgPSByZXNvbHZlVGFyZ2V0KFxuICAgIHZub2RlLnByb3BzLFxuICAgIHF1ZXJ5U2VsZWN0b3JcbiAgKTtcbiAgaWYgKHRhcmdldCkge1xuICAgIGNvbnN0IHRhcmdldE5vZGUgPSB0YXJnZXQuX2xwYSB8fCB0YXJnZXQuZmlyc3RDaGlsZDtcbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgIGlmIChpc1RlbGVwb3J0RGlzYWJsZWQodm5vZGUucHJvcHMpKSB7XG4gICAgICAgIHZub2RlLmFuY2hvciA9IGh5ZHJhdGVDaGlsZHJlbihcbiAgICAgICAgICBuZXh0U2libGluZyhub2RlKSxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICBwYXJlbnROb2RlKG5vZGUpLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHZub2RlLnRhcmdldEFuY2hvciA9IHRhcmdldE5vZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2bm9kZS5hbmNob3IgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgbGV0IHRhcmdldEFuY2hvciA9IHRhcmdldE5vZGU7XG4gICAgICAgIHdoaWxlICh0YXJnZXRBbmNob3IpIHtcbiAgICAgICAgICB0YXJnZXRBbmNob3IgPSBuZXh0U2libGluZyh0YXJnZXRBbmNob3IpO1xuICAgICAgICAgIGlmICh0YXJnZXRBbmNob3IgJiYgdGFyZ2V0QW5jaG9yLm5vZGVUeXBlID09PSA4ICYmIHRhcmdldEFuY2hvci5kYXRhID09PSBcInRlbGVwb3J0IGFuY2hvclwiKSB7XG4gICAgICAgICAgICB2bm9kZS50YXJnZXRBbmNob3IgPSB0YXJnZXRBbmNob3I7XG4gICAgICAgICAgICB0YXJnZXQuX2xwYSA9IHZub2RlLnRhcmdldEFuY2hvciAmJiBuZXh0U2libGluZyh2bm9kZS50YXJnZXRBbmNob3IpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGh5ZHJhdGVDaGlsZHJlbihcbiAgICAgICAgICB0YXJnZXROb2RlLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVDc3NWYXJzKHZub2RlKTtcbiAgfVxuICByZXR1cm4gdm5vZGUuYW5jaG9yICYmIG5leHRTaWJsaW5nKHZub2RlLmFuY2hvcik7XG59XG5jb25zdCBUZWxlcG9ydCA9IFRlbGVwb3J0SW1wbDtcbmZ1bmN0aW9uIHVwZGF0ZUNzc1ZhcnModm5vZGUpIHtcbiAgY29uc3QgY3R4ID0gdm5vZGUuY3R4O1xuICBpZiAoY3R4ICYmIGN0eC51dCkge1xuICAgIGxldCBub2RlID0gdm5vZGUuY2hpbGRyZW5bMF0uZWw7XG4gICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gdm5vZGUudGFyZ2V0QW5jaG9yKSB7XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSlcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXYtb3duZXJcIiwgY3R4LnVpZCk7XG4gICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICB9XG4gICAgY3R4LnV0KCk7XG4gIH1cbn1cblxuY29uc3QgRnJhZ21lbnQgPSBTeW1ib2wuZm9yKFwidi1mZ3RcIik7XG5jb25zdCBUZXh0ID0gU3ltYm9sLmZvcihcInYtdHh0XCIpO1xuY29uc3QgQ29tbWVudCA9IFN5bWJvbC5mb3IoXCJ2LWNtdFwiKTtcbmNvbnN0IFN0YXRpYyA9IFN5bWJvbC5mb3IoXCJ2LXN0Y1wiKTtcbmNvbnN0IGJsb2NrU3RhY2sgPSBbXTtcbmxldCBjdXJyZW50QmxvY2sgPSBudWxsO1xuZnVuY3Rpb24gb3BlbkJsb2NrKGRpc2FibGVUcmFja2luZyA9IGZhbHNlKSB7XG4gIGJsb2NrU3RhY2sucHVzaChjdXJyZW50QmxvY2sgPSBkaXNhYmxlVHJhY2tpbmcgPyBudWxsIDogW10pO1xufVxuZnVuY3Rpb24gY2xvc2VCbG9jaygpIHtcbiAgYmxvY2tTdGFjay5wb3AoKTtcbiAgY3VycmVudEJsb2NrID0gYmxvY2tTdGFja1tibG9ja1N0YWNrLmxlbmd0aCAtIDFdIHx8IG51bGw7XG59XG5sZXQgaXNCbG9ja1RyZWVFbmFibGVkID0gMTtcbmZ1bmN0aW9uIHNldEJsb2NrVHJhY2tpbmcodmFsdWUpIHtcbiAgaXNCbG9ja1RyZWVFbmFibGVkICs9IHZhbHVlO1xufVxuZnVuY3Rpb24gc2V0dXBCbG9jayh2bm9kZSkge1xuICB2bm9kZS5keW5hbWljQ2hpbGRyZW4gPSBpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwID8gY3VycmVudEJsb2NrIHx8IEVNUFRZX0FSUiA6IG51bGw7XG4gIGNsb3NlQmxvY2soKTtcbiAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgY3VycmVudEJsb2NrKSB7XG4gICAgY3VycmVudEJsb2NrLnB1c2godm5vZGUpO1xuICB9XG4gIHJldHVybiB2bm9kZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRCbG9jayh0eXBlLCBwcm9wcywgY2hpbGRyZW4sIHBhdGNoRmxhZywgZHluYW1pY1Byb3BzLCBzaGFwZUZsYWcpIHtcbiAgcmV0dXJuIHNldHVwQmxvY2soXG4gICAgY3JlYXRlQmFzZVZOb2RlKFxuICAgICAgdHlwZSxcbiAgICAgIHByb3BzLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBwYXRjaEZsYWcsXG4gICAgICBkeW5hbWljUHJvcHMsXG4gICAgICBzaGFwZUZsYWcsXG4gICAgICB0cnVlXG4gICAgKVxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlQmxvY2sodHlwZSwgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcykge1xuICByZXR1cm4gc2V0dXBCbG9jayhcbiAgICBjcmVhdGVWTm9kZShcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgcGF0Y2hGbGFnLFxuICAgICAgZHluYW1pY1Byb3BzLFxuICAgICAgdHJ1ZVxuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzVk5vZGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID8gdmFsdWUuX192X2lzVk5vZGUgPT09IHRydWUgOiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzU2FtZVZOb2RlVHlwZShuMSwgbjIpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbjIuc2hhcGVGbGFnICYgNiAmJiBobXJEaXJ0eUNvbXBvbmVudHMuaGFzKG4yLnR5cGUpKSB7XG4gICAgbjEuc2hhcGVGbGFnICY9IH4yNTY7XG4gICAgbjIuc2hhcGVGbGFnICY9IH41MTI7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBuMS50eXBlID09PSBuMi50eXBlICYmIG4xLmtleSA9PT0gbjIua2V5O1xufVxubGV0IHZub2RlQXJnc1RyYW5zZm9ybWVyO1xuZnVuY3Rpb24gdHJhbnNmb3JtVk5vZGVBcmdzKHRyYW5zZm9ybWVyKSB7XG4gIHZub2RlQXJnc1RyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7XG59XG5jb25zdCBjcmVhdGVWTm9kZVdpdGhBcmdzVHJhbnNmb3JtID0gKC4uLmFyZ3MpID0+IHtcbiAgcmV0dXJuIF9jcmVhdGVWTm9kZShcbiAgICAuLi52bm9kZUFyZ3NUcmFuc2Zvcm1lciA/IHZub2RlQXJnc1RyYW5zZm9ybWVyKGFyZ3MsIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSkgOiBhcmdzXG4gICk7XG59O1xuY29uc3QgSW50ZXJuYWxPYmplY3RLZXkgPSBgX192SW50ZXJuYWxgO1xuY29uc3Qgbm9ybWFsaXplS2V5ID0gKHsga2V5IH0pID0+IGtleSAhPSBudWxsID8ga2V5IDogbnVsbDtcbmNvbnN0IG5vcm1hbGl6ZVJlZiA9ICh7XG4gIHJlZixcbiAgcmVmX2tleSxcbiAgcmVmX2ZvclxufSkgPT4ge1xuICBpZiAodHlwZW9mIHJlZiA9PT0gXCJudW1iZXJcIikge1xuICAgIHJlZiA9IFwiXCIgKyByZWY7XG4gIH1cbiAgcmV0dXJuIHJlZiAhPSBudWxsID8gaXNTdHJpbmcocmVmKSB8fCBpc1JlZihyZWYpIHx8IGlzRnVuY3Rpb24ocmVmKSA/IHsgaTogY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLCByOiByZWYsIGs6IHJlZl9rZXksIGY6ICEhcmVmX2ZvciB9IDogcmVmIDogbnVsbDtcbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlVk5vZGUodHlwZSwgcHJvcHMgPSBudWxsLCBjaGlsZHJlbiA9IG51bGwsIHBhdGNoRmxhZyA9IDAsIGR5bmFtaWNQcm9wcyA9IG51bGwsIHNoYXBlRmxhZyA9IHR5cGUgPT09IEZyYWdtZW50ID8gMCA6IDEsIGlzQmxvY2tOb2RlID0gZmFsc2UsIG5lZWRGdWxsQ2hpbGRyZW5Ob3JtYWxpemF0aW9uID0gZmFsc2UpIHtcbiAgY29uc3Qgdm5vZGUgPSB7XG4gICAgX192X2lzVk5vZGU6IHRydWUsXG4gICAgX192X3NraXA6IHRydWUsXG4gICAgdHlwZSxcbiAgICBwcm9wcyxcbiAgICBrZXk6IHByb3BzICYmIG5vcm1hbGl6ZUtleShwcm9wcyksXG4gICAgcmVmOiBwcm9wcyAmJiBub3JtYWxpemVSZWYocHJvcHMpLFxuICAgIHNjb3BlSWQ6IGN1cnJlbnRTY29wZUlkLFxuICAgIHNsb3RTY29wZUlkczogbnVsbCxcbiAgICBjaGlsZHJlbixcbiAgICBjb21wb25lbnQ6IG51bGwsXG4gICAgc3VzcGVuc2U6IG51bGwsXG4gICAgc3NDb250ZW50OiBudWxsLFxuICAgIHNzRmFsbGJhY2s6IG51bGwsXG4gICAgZGlyczogbnVsbCxcbiAgICB0cmFuc2l0aW9uOiBudWxsLFxuICAgIGVsOiBudWxsLFxuICAgIGFuY2hvcjogbnVsbCxcbiAgICB0YXJnZXQ6IG51bGwsXG4gICAgdGFyZ2V0QW5jaG9yOiBudWxsLFxuICAgIHN0YXRpY0NvdW50OiAwLFxuICAgIHNoYXBlRmxhZyxcbiAgICBwYXRjaEZsYWcsXG4gICAgZHluYW1pY1Byb3BzLFxuICAgIGR5bmFtaWNDaGlsZHJlbjogbnVsbCxcbiAgICBhcHBDb250ZXh0OiBudWxsLFxuICAgIGN0eDogY3VycmVudFJlbmRlcmluZ0luc3RhbmNlXG4gIH07XG4gIGlmIChuZWVkRnVsbENoaWxkcmVuTm9ybWFsaXphdGlvbikge1xuICAgIG5vcm1hbGl6ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbik7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgdHlwZS5ub3JtYWxpemUodm5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjaGlsZHJlbikge1xuICAgIHZub2RlLnNoYXBlRmxhZyB8PSBpc1N0cmluZyhjaGlsZHJlbikgPyA4IDogMTY7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdm5vZGUua2V5ICE9PSB2bm9kZS5rZXkpIHtcbiAgICB3YXJuJDEoYFZOb2RlIGNyZWF0ZWQgd2l0aCBpbnZhbGlkIGtleSAoTmFOKS4gVk5vZGUgdHlwZTpgLCB2bm9kZS50eXBlKTtcbiAgfVxuICBpZiAoaXNCbG9ja1RyZWVFbmFibGVkID4gMCAmJiAvLyBhdm9pZCBhIGJsb2NrIG5vZGUgZnJvbSB0cmFja2luZyBpdHNlbGZcbiAgIWlzQmxvY2tOb2RlICYmIC8vIGhhcyBjdXJyZW50IHBhcmVudCBibG9ja1xuICBjdXJyZW50QmxvY2sgJiYgLy8gcHJlc2VuY2Ugb2YgYSBwYXRjaCBmbGFnIGluZGljYXRlcyB0aGlzIG5vZGUgbmVlZHMgcGF0Y2hpbmcgb24gdXBkYXRlcy5cbiAgLy8gY29tcG9uZW50IG5vZGVzIGFsc28gc2hvdWxkIGFsd2F5cyBiZSBwYXRjaGVkLCBiZWNhdXNlIGV2ZW4gaWYgdGhlXG4gIC8vIGNvbXBvbmVudCBkb2Vzbid0IG5lZWQgdG8gdXBkYXRlLCBpdCBuZWVkcyB0byBwZXJzaXN0IHRoZSBpbnN0YW5jZSBvbiB0b1xuICAvLyB0aGUgbmV4dCB2bm9kZSBzbyB0aGF0IGl0IGNhbiBiZSBwcm9wZXJseSB1bm1vdW50ZWQgbGF0ZXIuXG4gICh2bm9kZS5wYXRjaEZsYWcgPiAwIHx8IHNoYXBlRmxhZyAmIDYpICYmIC8vIHRoZSBFVkVOVFMgZmxhZyBpcyBvbmx5IGZvciBoeWRyYXRpb24gYW5kIGlmIGl0IGlzIHRoZSBvbmx5IGZsYWcsIHRoZVxuICAvLyB2bm9kZSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgZHluYW1pYyBkdWUgdG8gaGFuZGxlciBjYWNoaW5nLlxuICB2bm9kZS5wYXRjaEZsYWcgIT09IDMyKSB7XG4gICAgY3VycmVudEJsb2NrLnB1c2godm5vZGUpO1xuICB9XG4gIHJldHVybiB2bm9kZTtcbn1cbmNvbnN0IGNyZWF0ZVZOb2RlID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZVZOb2RlV2l0aEFyZ3NUcmFuc2Zvcm0gOiBfY3JlYXRlVk5vZGU7XG5mdW5jdGlvbiBfY3JlYXRlVk5vZGUodHlwZSwgcHJvcHMgPSBudWxsLCBjaGlsZHJlbiA9IG51bGwsIHBhdGNoRmxhZyA9IDAsIGR5bmFtaWNQcm9wcyA9IG51bGwsIGlzQmxvY2tOb2RlID0gZmFsc2UpIHtcbiAgaWYgKCF0eXBlIHx8IHR5cGUgPT09IE5VTExfRFlOQU1JQ19DT01QT05FTlQpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhdHlwZSkge1xuICAgICAgd2FybiQxKGBJbnZhbGlkIHZub2RlIHR5cGUgd2hlbiBjcmVhdGluZyB2bm9kZTogJHt0eXBlfS5gKTtcbiAgICB9XG4gICAgdHlwZSA9IENvbW1lbnQ7XG4gIH1cbiAgaWYgKGlzVk5vZGUodHlwZSkpIHtcbiAgICBjb25zdCBjbG9uZWQgPSBjbG9uZVZOb2RlKFxuICAgICAgdHlwZSxcbiAgICAgIHByb3BzLFxuICAgICAgdHJ1ZVxuICAgICAgLyogbWVyZ2VSZWY6IHRydWUgKi9cbiAgICApO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgbm9ybWFsaXplQ2hpbGRyZW4oY2xvbmVkLCBjaGlsZHJlbik7XG4gICAgfVxuICAgIGlmIChpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwICYmICFpc0Jsb2NrTm9kZSAmJiBjdXJyZW50QmxvY2spIHtcbiAgICAgIGlmIChjbG9uZWQuc2hhcGVGbGFnICYgNikge1xuICAgICAgICBjdXJyZW50QmxvY2tbY3VycmVudEJsb2NrLmluZGV4T2YodHlwZSldID0gY2xvbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudEJsb2NrLnB1c2goY2xvbmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY2xvbmVkLnBhdGNoRmxhZyB8PSAtMjtcbiAgICByZXR1cm4gY2xvbmVkO1xuICB9XG4gIGlmIChpc0NsYXNzQ29tcG9uZW50KHR5cGUpKSB7XG4gICAgdHlwZSA9IHR5cGUuX192Y2NPcHRzO1xuICB9XG4gIGlmIChwcm9wcykge1xuICAgIHByb3BzID0gZ3VhcmRSZWFjdGl2ZVByb3BzKHByb3BzKTtcbiAgICBsZXQgeyBjbGFzczoga2xhc3MsIHN0eWxlIH0gPSBwcm9wcztcbiAgICBpZiAoa2xhc3MgJiYgIWlzU3RyaW5nKGtsYXNzKSkge1xuICAgICAgcHJvcHMuY2xhc3MgPSBub3JtYWxpemVDbGFzcyhrbGFzcyk7XG4gICAgfVxuICAgIGlmIChpc09iamVjdChzdHlsZSkpIHtcbiAgICAgIGlmIChpc1Byb3h5KHN0eWxlKSAmJiAhaXNBcnJheShzdHlsZSkpIHtcbiAgICAgICAgc3R5bGUgPSBleHRlbmQoe30sIHN0eWxlKTtcbiAgICAgIH1cbiAgICAgIHByb3BzLnN0eWxlID0gbm9ybWFsaXplU3R5bGUoc3R5bGUpO1xuICAgIH1cbiAgfVxuICBjb25zdCBzaGFwZUZsYWcgPSBpc1N0cmluZyh0eXBlKSA/IDEgOiBpc1N1c3BlbnNlKHR5cGUpID8gMTI4IDogaXNUZWxlcG9ydCh0eXBlKSA/IDY0IDogaXNPYmplY3QodHlwZSkgPyA0IDogaXNGdW5jdGlvbih0eXBlKSA/IDIgOiAwO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzaGFwZUZsYWcgJiA0ICYmIGlzUHJveHkodHlwZSkpIHtcbiAgICB0eXBlID0gdG9SYXcodHlwZSk7XG4gICAgd2FybiQxKFxuICAgICAgYFZ1ZSByZWNlaXZlZCBhIENvbXBvbmVudCB0aGF0IHdhcyBtYWRlIGEgcmVhY3RpdmUgb2JqZWN0LiBUaGlzIGNhbiBsZWFkIHRvIHVubmVjZXNzYXJ5IHBlcmZvcm1hbmNlIG92ZXJoZWFkIGFuZCBzaG91bGQgYmUgYXZvaWRlZCBieSBtYXJraW5nIHRoZSBjb21wb25lbnQgd2l0aCBcXGBtYXJrUmF3XFxgIG9yIHVzaW5nIFxcYHNoYWxsb3dSZWZcXGAgaW5zdGVhZCBvZiBcXGByZWZcXGAuYCxcbiAgICAgIGBcbkNvbXBvbmVudCB0aGF0IHdhcyBtYWRlIHJlYWN0aXZlOiBgLFxuICAgICAgdHlwZVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJhc2VWTm9kZShcbiAgICB0eXBlLFxuICAgIHByb3BzLFxuICAgIGNoaWxkcmVuLFxuICAgIHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHMsXG4gICAgc2hhcGVGbGFnLFxuICAgIGlzQmxvY2tOb2RlLFxuICAgIHRydWVcbiAgKTtcbn1cbmZ1bmN0aW9uIGd1YXJkUmVhY3RpdmVQcm9wcyhwcm9wcykge1xuICBpZiAoIXByb3BzKVxuICAgIHJldHVybiBudWxsO1xuICByZXR1cm4gaXNQcm94eShwcm9wcykgfHwgSW50ZXJuYWxPYmplY3RLZXkgaW4gcHJvcHMgPyBleHRlbmQoe30sIHByb3BzKSA6IHByb3BzO1xufVxuZnVuY3Rpb24gY2xvbmVWTm9kZSh2bm9kZSwgZXh0cmFQcm9wcywgbWVyZ2VSZWYgPSBmYWxzZSkge1xuICBjb25zdCB7IHByb3BzLCByZWYsIHBhdGNoRmxhZywgY2hpbGRyZW4gfSA9IHZub2RlO1xuICBjb25zdCBtZXJnZWRQcm9wcyA9IGV4dHJhUHJvcHMgPyBtZXJnZVByb3BzKHByb3BzIHx8IHt9LCBleHRyYVByb3BzKSA6IHByb3BzO1xuICBjb25zdCBjbG9uZWQgPSB7XG4gICAgX192X2lzVk5vZGU6IHRydWUsXG4gICAgX192X3NraXA6IHRydWUsXG4gICAgdHlwZTogdm5vZGUudHlwZSxcbiAgICBwcm9wczogbWVyZ2VkUHJvcHMsXG4gICAga2V5OiBtZXJnZWRQcm9wcyAmJiBub3JtYWxpemVLZXkobWVyZ2VkUHJvcHMpLFxuICAgIHJlZjogZXh0cmFQcm9wcyAmJiBleHRyYVByb3BzLnJlZiA/IChcbiAgICAgIC8vICMyMDc4IGluIHRoZSBjYXNlIG9mIDxjb21wb25lbnQgOmlzPVwidm5vZGVcIiByZWY9XCJleHRyYVwiLz5cbiAgICAgIC8vIGlmIHRoZSB2bm9kZSBpdHNlbGYgYWxyZWFkeSBoYXMgYSByZWYsIGNsb25lVk5vZGUgd2lsbCBuZWVkIHRvIG1lcmdlXG4gICAgICAvLyB0aGUgcmVmcyBzbyB0aGUgc2luZ2xlIHZub2RlIGNhbiBiZSBzZXQgb24gbXVsdGlwbGUgcmVmc1xuICAgICAgbWVyZ2VSZWYgJiYgcmVmID8gaXNBcnJheShyZWYpID8gcmVmLmNvbmNhdChub3JtYWxpemVSZWYoZXh0cmFQcm9wcykpIDogW3JlZiwgbm9ybWFsaXplUmVmKGV4dHJhUHJvcHMpXSA6IG5vcm1hbGl6ZVJlZihleHRyYVByb3BzKVxuICAgICkgOiByZWYsXG4gICAgc2NvcGVJZDogdm5vZGUuc2NvcGVJZCxcbiAgICBzbG90U2NvcGVJZHM6IHZub2RlLnNsb3RTY29wZUlkcyxcbiAgICBjaGlsZHJlbjogISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBwYXRjaEZsYWcgPT09IC0xICYmIGlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4ubWFwKGRlZXBDbG9uZVZOb2RlKSA6IGNoaWxkcmVuLFxuICAgIHRhcmdldDogdm5vZGUudGFyZ2V0LFxuICAgIHRhcmdldEFuY2hvcjogdm5vZGUudGFyZ2V0QW5jaG9yLFxuICAgIHN0YXRpY0NvdW50OiB2bm9kZS5zdGF0aWNDb3VudCxcbiAgICBzaGFwZUZsYWc6IHZub2RlLnNoYXBlRmxhZyxcbiAgICAvLyBpZiB0aGUgdm5vZGUgaXMgY2xvbmVkIHdpdGggZXh0cmEgcHJvcHMsIHdlIGNhbiBubyBsb25nZXIgYXNzdW1lIGl0c1xuICAgIC8vIGV4aXN0aW5nIHBhdGNoIGZsYWcgdG8gYmUgcmVsaWFibGUgYW5kIG5lZWQgdG8gYWRkIHRoZSBGVUxMX1BST1BTIGZsYWcuXG4gICAgLy8gbm90ZTogcHJlc2VydmUgZmxhZyBmb3IgZnJhZ21lbnRzIHNpbmNlIHRoZXkgdXNlIHRoZSBmbGFnIGZvciBjaGlsZHJlblxuICAgIC8vIGZhc3QgcGF0aHMgb25seS5cbiAgICBwYXRjaEZsYWc6IGV4dHJhUHJvcHMgJiYgdm5vZGUudHlwZSAhPT0gRnJhZ21lbnQgPyBwYXRjaEZsYWcgPT09IC0xID8gMTYgOiBwYXRjaEZsYWcgfCAxNiA6IHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHM6IHZub2RlLmR5bmFtaWNQcm9wcyxcbiAgICBkeW5hbWljQ2hpbGRyZW46IHZub2RlLmR5bmFtaWNDaGlsZHJlbixcbiAgICBhcHBDb250ZXh0OiB2bm9kZS5hcHBDb250ZXh0LFxuICAgIGRpcnM6IHZub2RlLmRpcnMsXG4gICAgdHJhbnNpdGlvbjogdm5vZGUudHJhbnNpdGlvbixcbiAgICAvLyBUaGVzZSBzaG91bGQgdGVjaG5pY2FsbHkgb25seSBiZSBub24tbnVsbCBvbiBtb3VudGVkIFZOb2Rlcy4gSG93ZXZlcixcbiAgICAvLyB0aGV5ICpzaG91bGQqIGJlIGNvcGllZCBmb3Iga2VwdC1hbGl2ZSB2bm9kZXMuIFNvIHdlIGp1c3QgYWx3YXlzIGNvcHlcbiAgICAvLyB0aGVtIHNpbmNlIHRoZW0gYmVpbmcgbm9uLW51bGwgZHVyaW5nIGEgbW91bnQgZG9lc24ndCBhZmZlY3QgdGhlIGxvZ2ljIGFzXG4gICAgLy8gdGhleSB3aWxsIHNpbXBseSBiZSBvdmVyd3JpdHRlbi5cbiAgICBjb21wb25lbnQ6IHZub2RlLmNvbXBvbmVudCxcbiAgICBzdXNwZW5zZTogdm5vZGUuc3VzcGVuc2UsXG4gICAgc3NDb250ZW50OiB2bm9kZS5zc0NvbnRlbnQgJiYgY2xvbmVWTm9kZSh2bm9kZS5zc0NvbnRlbnQpLFxuICAgIHNzRmFsbGJhY2s6IHZub2RlLnNzRmFsbGJhY2sgJiYgY2xvbmVWTm9kZSh2bm9kZS5zc0ZhbGxiYWNrKSxcbiAgICBlbDogdm5vZGUuZWwsXG4gICAgYW5jaG9yOiB2bm9kZS5hbmNob3IsXG4gICAgY3R4OiB2bm9kZS5jdHgsXG4gICAgY2U6IHZub2RlLmNlXG4gIH07XG4gIHJldHVybiBjbG9uZWQ7XG59XG5mdW5jdGlvbiBkZWVwQ2xvbmVWTm9kZSh2bm9kZSkge1xuICBjb25zdCBjbG9uZWQgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgaWYgKGlzQXJyYXkodm5vZGUuY2hpbGRyZW4pKSB7XG4gICAgY2xvbmVkLmNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW4ubWFwKGRlZXBDbG9uZVZOb2RlKTtcbiAgfVxuICByZXR1cm4gY2xvbmVkO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dFZOb2RlKHRleHQgPSBcIiBcIiwgZmxhZyA9IDApIHtcbiAgcmV0dXJuIGNyZWF0ZVZOb2RlKFRleHQsIG51bGwsIHRleHQsIGZsYWcpO1xufVxuZnVuY3Rpb24gY3JlYXRlU3RhdGljVk5vZGUoY29udGVudCwgbnVtYmVyT2ZOb2Rlcykge1xuICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKFN0YXRpYywgbnVsbCwgY29udGVudCk7XG4gIHZub2RlLnN0YXRpY0NvdW50ID0gbnVtYmVyT2ZOb2RlcztcbiAgcmV0dXJuIHZub2RlO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29tbWVudFZOb2RlKHRleHQgPSBcIlwiLCBhc0Jsb2NrID0gZmFsc2UpIHtcbiAgcmV0dXJuIGFzQmxvY2sgPyAob3BlbkJsb2NrKCksIGNyZWF0ZUJsb2NrKENvbW1lbnQsIG51bGwsIHRleHQpKSA6IGNyZWF0ZVZOb2RlKENvbW1lbnQsIG51bGwsIHRleHQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplVk5vZGUoY2hpbGQpIHtcbiAgaWYgKGNoaWxkID09IG51bGwgfHwgdHlwZW9mIGNoaWxkID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShDb21tZW50KTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KGNoaWxkKSkge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShcbiAgICAgIEZyYWdtZW50LFxuICAgICAgbnVsbCxcbiAgICAgIC8vICMzNjY2LCBhdm9pZCByZWZlcmVuY2UgcG9sbHV0aW9uIHdoZW4gcmV1c2luZyB2bm9kZVxuICAgICAgY2hpbGQuc2xpY2UoKVxuICAgICk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNoaWxkID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGNsb25lSWZNb3VudGVkKGNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlVk5vZGUoVGV4dCwgbnVsbCwgU3RyaW5nKGNoaWxkKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNsb25lSWZNb3VudGVkKGNoaWxkKSB7XG4gIHJldHVybiBjaGlsZC5lbCA9PT0gbnVsbCAmJiBjaGlsZC5wYXRjaEZsYWcgIT09IC0xIHx8IGNoaWxkLm1lbW8gPyBjaGlsZCA6IGNsb25lVk5vZGUoY2hpbGQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIGNoaWxkcmVuKSB7XG4gIGxldCB0eXBlID0gMDtcbiAgY29uc3QgeyBzaGFwZUZsYWcgfSA9IHZub2RlO1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIHR5cGUgPSAxNjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09IFwib2JqZWN0XCIpIHtcbiAgICBpZiAoc2hhcGVGbGFnICYgKDEgfCA2NCkpIHtcbiAgICAgIGNvbnN0IHNsb3QgPSBjaGlsZHJlbi5kZWZhdWx0O1xuICAgICAgaWYgKHNsb3QpIHtcbiAgICAgICAgc2xvdC5fYyAmJiAoc2xvdC5fZCA9IGZhbHNlKTtcbiAgICAgICAgbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIHNsb3QoKSk7XG4gICAgICAgIHNsb3QuX2MgJiYgKHNsb3QuX2QgPSB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9IDMyO1xuICAgICAgY29uc3Qgc2xvdEZsYWcgPSBjaGlsZHJlbi5fO1xuICAgICAgaWYgKCFzbG90RmxhZyAmJiAhKEludGVybmFsT2JqZWN0S2V5IGluIGNoaWxkcmVuKSkge1xuICAgICAgICBjaGlsZHJlbi5fY3R4ID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xuICAgICAgfSBlbHNlIGlmIChzbG90RmxhZyA9PT0gMyAmJiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5zbG90cy5fID09PSAxKSB7XG4gICAgICAgICAgY2hpbGRyZW4uXyA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hpbGRyZW4uXyA9IDI7XG4gICAgICAgICAgdm5vZGUucGF0Y2hGbGFnIHw9IDEwMjQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihjaGlsZHJlbikpIHtcbiAgICBjaGlsZHJlbiA9IHsgZGVmYXVsdDogY2hpbGRyZW4sIF9jdHg6IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSB9O1xuICAgIHR5cGUgPSAzMjtcbiAgfSBlbHNlIHtcbiAgICBjaGlsZHJlbiA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICB0eXBlID0gMTY7XG4gICAgICBjaGlsZHJlbiA9IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9IDg7XG4gICAgfVxuICB9XG4gIHZub2RlLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIHZub2RlLnNoYXBlRmxhZyB8PSB0eXBlO1xufVxuZnVuY3Rpb24gbWVyZ2VQcm9wcyguLi5hcmdzKSB7XG4gIGNvbnN0IHJldCA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b01lcmdlID0gYXJnc1tpXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0b01lcmdlKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImNsYXNzXCIpIHtcbiAgICAgICAgaWYgKHJldC5jbGFzcyAhPT0gdG9NZXJnZS5jbGFzcykge1xuICAgICAgICAgIHJldC5jbGFzcyA9IG5vcm1hbGl6ZUNsYXNzKFtyZXQuY2xhc3MsIHRvTWVyZ2UuY2xhc3NdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIikge1xuICAgICAgICByZXQuc3R5bGUgPSBub3JtYWxpemVTdHlsZShbcmV0LnN0eWxlLCB0b01lcmdlLnN0eWxlXSk7XG4gICAgICB9IGVsc2UgaWYgKGlzT24oa2V5KSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHJldFtrZXldO1xuICAgICAgICBjb25zdCBpbmNvbWluZyA9IHRvTWVyZ2Vba2V5XTtcbiAgICAgICAgaWYgKGluY29taW5nICYmIGV4aXN0aW5nICE9PSBpbmNvbWluZyAmJiAhKGlzQXJyYXkoZXhpc3RpbmcpICYmIGV4aXN0aW5nLmluY2x1ZGVzKGluY29taW5nKSkpIHtcbiAgICAgICAgICByZXRba2V5XSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBpbmNvbWluZykgOiBpbmNvbWluZztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgIT09IFwiXCIpIHtcbiAgICAgICAgcmV0W2tleV0gPSB0b01lcmdlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBpbnZva2VWTm9kZUhvb2soaG9vaywgaW5zdGFuY2UsIHZub2RlLCBwcmV2Vk5vZGUgPSBudWxsKSB7XG4gIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGhvb2ssIGluc3RhbmNlLCA3LCBbXG4gICAgdm5vZGUsXG4gICAgcHJldlZOb2RlXG4gIF0pO1xufVxuXG5jb25zdCBlbXB0eUFwcENvbnRleHQgPSBjcmVhdGVBcHBDb250ZXh0KCk7XG5sZXQgdWlkID0gMDtcbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHZub2RlLCBwYXJlbnQsIHN1c3BlbnNlKSB7XG4gIGNvbnN0IHR5cGUgPSB2bm9kZS50eXBlO1xuICBjb25zdCBhcHBDb250ZXh0ID0gKHBhcmVudCA/IHBhcmVudC5hcHBDb250ZXh0IDogdm5vZGUuYXBwQ29udGV4dCkgfHwgZW1wdHlBcHBDb250ZXh0O1xuICBjb25zdCBpbnN0YW5jZSA9IHtcbiAgICB1aWQ6IHVpZCsrLFxuICAgIHZub2RlLFxuICAgIHR5cGUsXG4gICAgcGFyZW50LFxuICAgIGFwcENvbnRleHQsXG4gICAgcm9vdDogbnVsbCxcbiAgICAvLyB0byBiZSBpbW1lZGlhdGVseSBzZXRcbiAgICBuZXh0OiBudWxsLFxuICAgIHN1YlRyZWU6IG51bGwsXG4gICAgLy8gd2lsbCBiZSBzZXQgc3luY2hyb25vdXNseSByaWdodCBhZnRlciBjcmVhdGlvblxuICAgIGVmZmVjdDogbnVsbCxcbiAgICB1cGRhdGU6IG51bGwsXG4gICAgLy8gd2lsbCBiZSBzZXQgc3luY2hyb25vdXNseSByaWdodCBhZnRlciBjcmVhdGlvblxuICAgIHNjb3BlOiBuZXcgRWZmZWN0U2NvcGUoXG4gICAgICB0cnVlXG4gICAgICAvKiBkZXRhY2hlZCAqL1xuICAgICksXG4gICAgcmVuZGVyOiBudWxsLFxuICAgIHByb3h5OiBudWxsLFxuICAgIGV4cG9zZWQ6IG51bGwsXG4gICAgZXhwb3NlUHJveHk6IG51bGwsXG4gICAgd2l0aFByb3h5OiBudWxsLFxuICAgIHByb3ZpZGVzOiBwYXJlbnQgPyBwYXJlbnQucHJvdmlkZXMgOiBPYmplY3QuY3JlYXRlKGFwcENvbnRleHQucHJvdmlkZXMpLFxuICAgIGFjY2Vzc0NhY2hlOiBudWxsLFxuICAgIHJlbmRlckNhY2hlOiBbXSxcbiAgICAvLyBsb2NhbCByZXNvbHZlZCBhc3NldHNcbiAgICBjb21wb25lbnRzOiBudWxsLFxuICAgIGRpcmVjdGl2ZXM6IG51bGwsXG4gICAgLy8gcmVzb2x2ZWQgcHJvcHMgYW5kIGVtaXRzIG9wdGlvbnNcbiAgICBwcm9wc09wdGlvbnM6IG5vcm1hbGl6ZVByb3BzT3B0aW9ucyh0eXBlLCBhcHBDb250ZXh0KSxcbiAgICBlbWl0c09wdGlvbnM6IG5vcm1hbGl6ZUVtaXRzT3B0aW9ucyh0eXBlLCBhcHBDb250ZXh0KSxcbiAgICAvLyBlbWl0XG4gICAgZW1pdDogbnVsbCxcbiAgICAvLyB0byBiZSBzZXQgaW1tZWRpYXRlbHlcbiAgICBlbWl0dGVkOiBudWxsLFxuICAgIC8vIHByb3BzIGRlZmF1bHQgdmFsdWVcbiAgICBwcm9wc0RlZmF1bHRzOiBFTVBUWV9PQkosXG4gICAgLy8gaW5oZXJpdEF0dHJzXG4gICAgaW5oZXJpdEF0dHJzOiB0eXBlLmluaGVyaXRBdHRycyxcbiAgICAvLyBzdGF0ZVxuICAgIGN0eDogRU1QVFlfT0JKLFxuICAgIGRhdGE6IEVNUFRZX09CSixcbiAgICBwcm9wczogRU1QVFlfT0JKLFxuICAgIGF0dHJzOiBFTVBUWV9PQkosXG4gICAgc2xvdHM6IEVNUFRZX09CSixcbiAgICByZWZzOiBFTVBUWV9PQkosXG4gICAgc2V0dXBTdGF0ZTogRU1QVFlfT0JKLFxuICAgIHNldHVwQ29udGV4dDogbnVsbCxcbiAgICBhdHRyc1Byb3h5OiBudWxsLFxuICAgIHNsb3RzUHJveHk6IG51bGwsXG4gICAgLy8gc3VzcGVuc2UgcmVsYXRlZFxuICAgIHN1c3BlbnNlLFxuICAgIHN1c3BlbnNlSWQ6IHN1c3BlbnNlID8gc3VzcGVuc2UucGVuZGluZ0lkIDogMCxcbiAgICBhc3luY0RlcDogbnVsbCxcbiAgICBhc3luY1Jlc29sdmVkOiBmYWxzZSxcbiAgICAvLyBsaWZlY3ljbGUgaG9va3NcbiAgICAvLyBub3QgdXNpbmcgZW51bXMgaGVyZSBiZWNhdXNlIGl0IHJlc3VsdHMgaW4gY29tcHV0ZWQgcHJvcGVydGllc1xuICAgIGlzTW91bnRlZDogZmFsc2UsXG4gICAgaXNVbm1vdW50ZWQ6IGZhbHNlLFxuICAgIGlzRGVhY3RpdmF0ZWQ6IGZhbHNlLFxuICAgIGJjOiBudWxsLFxuICAgIGM6IG51bGwsXG4gICAgYm06IG51bGwsXG4gICAgbTogbnVsbCxcbiAgICBidTogbnVsbCxcbiAgICB1OiBudWxsLFxuICAgIHVtOiBudWxsLFxuICAgIGJ1bTogbnVsbCxcbiAgICBkYTogbnVsbCxcbiAgICBhOiBudWxsLFxuICAgIHJ0ZzogbnVsbCxcbiAgICBydGM6IG51bGwsXG4gICAgZWM6IG51bGwsXG4gICAgc3A6IG51bGxcbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpbnN0YW5jZS5jdHggPSBjcmVhdGVEZXZSZW5kZXJDb250ZXh0KGluc3RhbmNlKTtcbiAgfSBlbHNlIHtcbiAgICBpbnN0YW5jZS5jdHggPSB7IF86IGluc3RhbmNlIH07XG4gIH1cbiAgaW5zdGFuY2Uucm9vdCA9IHBhcmVudCA/IHBhcmVudC5yb290IDogaW5zdGFuY2U7XG4gIGluc3RhbmNlLmVtaXQgPSBlbWl0LmJpbmQobnVsbCwgaW5zdGFuY2UpO1xuICBpZiAodm5vZGUuY2UpIHtcbiAgICB2bm9kZS5jZShpbnN0YW5jZSk7XG4gIH1cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxubGV0IGN1cnJlbnRJbnN0YW5jZSA9IG51bGw7XG5jb25zdCBnZXRDdXJyZW50SW5zdGFuY2UgPSAoKSA9PiBjdXJyZW50SW5zdGFuY2UgfHwgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xubGV0IGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlO1xubGV0IHNldEluU1NSU2V0dXBTdGF0ZTtcbntcbiAgY29uc3QgZyA9IGdldEdsb2JhbFRoaXMoKTtcbiAgY29uc3QgcmVnaXN0ZXJHbG9iYWxTZXR0ZXIgPSAoa2V5LCBzZXR0ZXIpID0+IHtcbiAgICBsZXQgc2V0dGVycztcbiAgICBpZiAoIShzZXR0ZXJzID0gZ1trZXldKSlcbiAgICAgIHNldHRlcnMgPSBnW2tleV0gPSBbXTtcbiAgICBzZXR0ZXJzLnB1c2goc2V0dGVyKTtcbiAgICByZXR1cm4gKHYpID0+IHtcbiAgICAgIGlmIChzZXR0ZXJzLmxlbmd0aCA+IDEpXG4gICAgICAgIHNldHRlcnMuZm9yRWFjaCgoc2V0KSA9PiBzZXQodikpO1xuICAgICAgZWxzZVxuICAgICAgICBzZXR0ZXJzWzBdKHYpO1xuICAgIH07XG4gIH07XG4gIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlID0gcmVnaXN0ZXJHbG9iYWxTZXR0ZXIoXG4gICAgYF9fVlVFX0lOU1RBTkNFX1NFVFRFUlNfX2AsXG4gICAgKHYpID0+IGN1cnJlbnRJbnN0YW5jZSA9IHZcbiAgKTtcbiAgc2V0SW5TU1JTZXR1cFN0YXRlID0gcmVnaXN0ZXJHbG9iYWxTZXR0ZXIoXG4gICAgYF9fVlVFX1NTUl9TRVRURVJTX19gLFxuICAgICh2KSA9PiBpc0luU1NSQ29tcG9uZW50U2V0dXAgPSB2XG4gICk7XG59XG5jb25zdCBzZXRDdXJyZW50SW5zdGFuY2UgPSAoaW5zdGFuY2UpID0+IHtcbiAgY29uc3QgcHJldiA9IGN1cnJlbnRJbnN0YW5jZTtcbiAgaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICBpbnN0YW5jZS5zY29wZS5vbigpO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGluc3RhbmNlLnNjb3BlLm9mZigpO1xuICAgIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlKHByZXYpO1xuICB9O1xufTtcbmNvbnN0IHVuc2V0Q3VycmVudEluc3RhbmNlID0gKCkgPT4ge1xuICBjdXJyZW50SW5zdGFuY2UgJiYgY3VycmVudEluc3RhbmNlLnNjb3BlLm9mZigpO1xuICBpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZShudWxsKTtcbn07XG5jb25zdCBpc0J1aWx0SW5UYWcgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChcInNsb3QsY29tcG9uZW50XCIpO1xuZnVuY3Rpb24gdmFsaWRhdGVDb21wb25lbnROYW1lKG5hbWUsIGNvbmZpZykge1xuICBjb25zdCBhcHBJc05hdGl2ZVRhZyA9IGNvbmZpZy5pc05hdGl2ZVRhZyB8fCBOTztcbiAgaWYgKGlzQnVpbHRJblRhZyhuYW1lKSB8fCBhcHBJc05hdGl2ZVRhZyhuYW1lKSkge1xuICAgIHdhcm4kMShcbiAgICAgIFwiRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCBpZDogXCIgKyBuYW1lXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2Uudm5vZGUuc2hhcGVGbGFnICYgNDtcbn1cbmxldCBpc0luU1NSQ29tcG9uZW50U2V0dXAgPSBmYWxzZTtcbmZ1bmN0aW9uIHNldHVwQ29tcG9uZW50KGluc3RhbmNlLCBpc1NTUiA9IGZhbHNlKSB7XG4gIGlzU1NSICYmIHNldEluU1NSU2V0dXBTdGF0ZShpc1NTUik7XG4gIGNvbnN0IHsgcHJvcHMsIGNoaWxkcmVuIH0gPSBpbnN0YW5jZS52bm9kZTtcbiAgY29uc3QgaXNTdGF0ZWZ1bCA9IGlzU3RhdGVmdWxDb21wb25lbnQoaW5zdGFuY2UpO1xuICBpbml0UHJvcHMoaW5zdGFuY2UsIHByb3BzLCBpc1N0YXRlZnVsLCBpc1NTUik7XG4gIGluaXRTbG90cyhpbnN0YW5jZSwgY2hpbGRyZW4pO1xuICBjb25zdCBzZXR1cFJlc3VsdCA9IGlzU3RhdGVmdWwgPyBzZXR1cFN0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlLCBpc1NTUikgOiB2b2lkIDA7XG4gIGlzU1NSICYmIHNldEluU1NSU2V0dXBTdGF0ZShmYWxzZSk7XG4gIHJldHVybiBzZXR1cFJlc3VsdDtcbn1cbmZ1bmN0aW9uIHNldHVwU3RhdGVmdWxDb21wb25lbnQoaW5zdGFuY2UsIGlzU1NSKSB7XG4gIHZhciBfYTtcbiAgY29uc3QgQ29tcG9uZW50ID0gaW5zdGFuY2UudHlwZTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpZiAoQ29tcG9uZW50Lm5hbWUpIHtcbiAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShDb21wb25lbnQubmFtZSwgaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcpO1xuICAgIH1cbiAgICBpZiAoQ29tcG9uZW50LmNvbXBvbmVudHMpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoQ29tcG9uZW50LmNvbXBvbmVudHMpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZXNbaV0sIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKENvbXBvbmVudC5kaXJlY3RpdmVzKSB7XG4gICAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKENvbXBvbmVudC5kaXJlY3RpdmVzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsaWRhdGVEaXJlY3RpdmVOYW1lKG5hbWVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKENvbXBvbmVudC5jb21waWxlck9wdGlvbnMgJiYgaXNSdW50aW1lT25seSgpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBcImNvbXBpbGVyT3B0aW9uc1wiIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gdXNpbmcgYSBidWlsZCBvZiBWdWUgdGhhdCBpbmNsdWRlcyB0aGUgcnVudGltZSBjb21waWxlci4gU2luY2UgeW91IGFyZSB1c2luZyBhIHJ1bnRpbWUtb25seSBidWlsZCwgdGhlIG9wdGlvbnMgc2hvdWxkIGJlIHBhc3NlZCB2aWEgeW91ciBidWlsZCB0b29sIGNvbmZpZyBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGluc3RhbmNlLmFjY2Vzc0NhY2hlID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGluc3RhbmNlLnByb3h5ID0gbWFya1JhdyhuZXcgUHJveHkoaW5zdGFuY2UuY3R4LCBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMpKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBleHBvc2VQcm9wc09uUmVuZGVyQ29udGV4dChpbnN0YW5jZSk7XG4gIH1cbiAgY29uc3QgeyBzZXR1cCB9ID0gQ29tcG9uZW50O1xuICBpZiAoc2V0dXApIHtcbiAgICBjb25zdCBzZXR1cENvbnRleHQgPSBpbnN0YW5jZS5zZXR1cENvbnRleHQgPSBzZXR1cC5sZW5ndGggPiAxID8gY3JlYXRlU2V0dXBDb250ZXh0KGluc3RhbmNlKSA6IG51bGw7XG4gICAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICBjb25zdCBzZXR1cFJlc3VsdCA9IGNhbGxXaXRoRXJyb3JIYW5kbGluZyhcbiAgICAgIHNldHVwLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICAwLFxuICAgICAgW1xuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KGluc3RhbmNlLnByb3BzKSA6IGluc3RhbmNlLnByb3BzLFxuICAgICAgICBzZXR1cENvbnRleHRcbiAgICAgIF1cbiAgICApO1xuICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICByZXNldCgpO1xuICAgIGlmIChpc1Byb21pc2Uoc2V0dXBSZXN1bHQpKSB7XG4gICAgICBzZXR1cFJlc3VsdC50aGVuKHVuc2V0Q3VycmVudEluc3RhbmNlLCB1bnNldEN1cnJlbnRJbnN0YW5jZSk7XG4gICAgICBpZiAoaXNTU1IpIHtcbiAgICAgICAgcmV0dXJuIHNldHVwUmVzdWx0LnRoZW4oKHJlc29sdmVkUmVzdWx0KSA9PiB7XG4gICAgICAgICAgaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIHJlc29sdmVkUmVzdWx0LCBpc1NTUik7XG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgaGFuZGxlRXJyb3IoZSwgaW5zdGFuY2UsIDApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3RhbmNlLmFzeW5jRGVwID0gc2V0dXBSZXN1bHQ7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpbnN0YW5jZS5zdXNwZW5zZSkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSAoX2EgPSBDb21wb25lbnQubmFtZSkgIT0gbnVsbCA/IF9hIDogXCJBbm9ueW1vdXNcIjtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQ29tcG9uZW50IDwke25hbWV9Pjogc2V0dXAgZnVuY3Rpb24gcmV0dXJuZWQgYSBwcm9taXNlLCBidXQgbm8gPFN1c3BlbnNlPiBib3VuZGFyeSB3YXMgZm91bmQgaW4gdGhlIHBhcmVudCBjb21wb25lbnQgdHJlZS4gQSBjb21wb25lbnQgd2l0aCBhc3luYyBzZXR1cCgpIG11c3QgYmUgbmVzdGVkIGluIGEgPFN1c3BlbnNlPiBpbiBvcmRlciB0byBiZSByZW5kZXJlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoYW5kbGVTZXR1cFJlc3VsdChpbnN0YW5jZSwgc2V0dXBSZXN1bHQsIGlzU1NSKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZmluaXNoQ29tcG9uZW50U2V0dXAoaW5zdGFuY2UsIGlzU1NSKTtcbiAgfVxufVxuZnVuY3Rpb24gaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIHNldHVwUmVzdWx0LCBpc1NTUikge1xuICBpZiAoaXNGdW5jdGlvbihzZXR1cFJlc3VsdCkpIHtcbiAgICBpZiAoaW5zdGFuY2UudHlwZS5fX3NzcklubGluZVJlbmRlcikge1xuICAgICAgaW5zdGFuY2Uuc3NyUmVuZGVyID0gc2V0dXBSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLnJlbmRlciA9IHNldHVwUmVzdWx0O1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChzZXR1cFJlc3VsdCkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc1ZOb2RlKHNldHVwUmVzdWx0KSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgc2V0dXAoKSBzaG91bGQgbm90IHJldHVybiBWTm9kZXMgZGlyZWN0bHkgLSByZXR1cm4gYSByZW5kZXIgZnVuY3Rpb24gaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGluc3RhbmNlLmRldnRvb2xzUmF3U2V0dXBTdGF0ZSA9IHNldHVwUmVzdWx0O1xuICAgIH1cbiAgICBpbnN0YW5jZS5zZXR1cFN0YXRlID0gcHJveHlSZWZzKHNldHVwUmVzdWx0KTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgZXhwb3NlU2V0dXBTdGF0ZU9uUmVuZGVyQ29udGV4dChpbnN0YW5jZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2V0dXBSZXN1bHQgIT09IHZvaWQgMCkge1xuICAgIHdhcm4kMShcbiAgICAgIGBzZXR1cCgpIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0LiBSZWNlaXZlZDogJHtzZXR1cFJlc3VsdCA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIHNldHVwUmVzdWx0fWBcbiAgICApO1xuICB9XG4gIGZpbmlzaENvbXBvbmVudFNldHVwKGluc3RhbmNlLCBpc1NTUik7XG59XG5sZXQgY29tcGlsZTtcbmxldCBpbnN0YWxsV2l0aFByb3h5O1xuZnVuY3Rpb24gcmVnaXN0ZXJSdW50aW1lQ29tcGlsZXIoX2NvbXBpbGUpIHtcbiAgY29tcGlsZSA9IF9jb21waWxlO1xuICBpbnN0YWxsV2l0aFByb3h5ID0gKGkpID0+IHtcbiAgICBpZiAoaS5yZW5kZXIuX3JjKSB7XG4gICAgICBpLndpdGhQcm94eSA9IG5ldyBQcm94eShpLmN0eCwgUnVudGltZUNvbXBpbGVkUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzKTtcbiAgICB9XG4gIH07XG59XG5jb25zdCBpc1J1bnRpbWVPbmx5ID0gKCkgPT4gIWNvbXBpbGU7XG5mdW5jdGlvbiBmaW5pc2hDb21wb25lbnRTZXR1cChpbnN0YW5jZSwgaXNTU1IsIHNraXBPcHRpb25zKSB7XG4gIGNvbnN0IENvbXBvbmVudCA9IGluc3RhbmNlLnR5cGU7XG4gIGlmICghaW5zdGFuY2UucmVuZGVyKSB7XG4gICAgaWYgKCFpc1NTUiAmJiBjb21waWxlICYmICFDb21wb25lbnQucmVuZGVyKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IENvbXBvbmVudC50ZW1wbGF0ZSB8fCByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSkudGVtcGxhdGU7XG4gICAgICBpZiAodGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBjb21waWxlYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBpc0N1c3RvbUVsZW1lbnQsIGNvbXBpbGVyT3B0aW9ucyB9ID0gaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWc7XG4gICAgICAgIGNvbnN0IHsgZGVsaW1pdGVycywgY29tcGlsZXJPcHRpb25zOiBjb21wb25lbnRDb21waWxlck9wdGlvbnMgfSA9IENvbXBvbmVudDtcbiAgICAgICAgY29uc3QgZmluYWxDb21waWxlck9wdGlvbnMgPSBleHRlbmQoXG4gICAgICAgICAgZXh0ZW5kKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc0N1c3RvbUVsZW1lbnQsXG4gICAgICAgICAgICAgIGRlbGltaXRlcnNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21waWxlck9wdGlvbnNcbiAgICAgICAgICApLFxuICAgICAgICAgIGNvbXBvbmVudENvbXBpbGVyT3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBDb21wb25lbnQucmVuZGVyID0gY29tcGlsZSh0ZW1wbGF0ZSwgZmluYWxDb21waWxlck9wdGlvbnMpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBjb21waWxlYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaW5zdGFuY2UucmVuZGVyID0gQ29tcG9uZW50LnJlbmRlciB8fCBOT09QO1xuICAgIGlmIChpbnN0YWxsV2l0aFByb3h5KSB7XG4gICAgICBpbnN0YWxsV2l0aFByb3h5KGluc3RhbmNlKTtcbiAgICB9XG4gIH1cbiAgaWYgKF9fVlVFX09QVElPTlNfQVBJX18gJiYgdHJ1ZSkge1xuICAgIGNvbnN0IHJlc2V0ID0gc2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgdHJ5IHtcbiAgICAgIGFwcGx5T3B0aW9ucyhpbnN0YW5jZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgfVxuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFDb21wb25lbnQucmVuZGVyICYmIGluc3RhbmNlLnJlbmRlciA9PT0gTk9PUCAmJiAhaXNTU1IpIHtcbiAgICBpZiAoIWNvbXBpbGUgJiYgQ29tcG9uZW50LnRlbXBsYXRlKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBDb21wb25lbnQgcHJvdmlkZWQgdGVtcGxhdGUgb3B0aW9uIGJ1dCBydW50aW1lIGNvbXBpbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBidWlsZCBvZiBWdWUuYCArIChgIENvbmZpZ3VyZSB5b3VyIGJ1bmRsZXIgdG8gYWxpYXMgXCJ2dWVcIiB0byBcInZ1ZS9kaXN0L3Z1ZS5lc20tYnVuZGxlci5qc1wiLmAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2FybiQxKGBDb21wb25lbnQgaXMgbWlzc2luZyB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24uYCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBnZXRBdHRyc1Byb3h5KGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS5hdHRyc1Byb3h5IHx8IChpbnN0YW5jZS5hdHRyc1Byb3h5ID0gbmV3IFByb3h5KFxuICAgIGluc3RhbmNlLmF0dHJzLFxuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB7XG4gICAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIsIFwiJGF0dHJzXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gICAgICB9LFxuICAgICAgc2V0KCkge1xuICAgICAgICB3YXJuJDEoYHNldHVwQ29udGV4dC5hdHRycyBpcyByZWFkb25seS5gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5KCkge1xuICAgICAgICB3YXJuJDEoYHNldHVwQ29udGV4dC5hdHRycyBpcyByZWFkb25seS5gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIsIFwiJGF0dHJzXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gICAgICB9XG4gICAgfVxuICApKTtcbn1cbmZ1bmN0aW9uIGdldFNsb3RzUHJveHkoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLnNsb3RzUHJveHkgfHwgKGluc3RhbmNlLnNsb3RzUHJveHkgPSBuZXcgUHJveHkoaW5zdGFuY2Uuc2xvdHMsIHtcbiAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgIHRyYWNrKGluc3RhbmNlLCBcImdldFwiLCBcIiRzbG90c1wiKTtcbiAgICAgIHJldHVybiB0YXJnZXRba2V5XTtcbiAgICB9XG4gIH0pKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNldHVwQ29udGV4dChpbnN0YW5jZSkge1xuICBjb25zdCBleHBvc2UgPSAoZXhwb3NlZCkgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBpZiAoaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgICAgICB3YXJuJDEoYGV4cG9zZSgpIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBzZXR1cCgpLmApO1xuICAgICAgfVxuICAgICAgaWYgKGV4cG9zZWQgIT0gbnVsbCkge1xuICAgICAgICBsZXQgZXhwb3NlZFR5cGUgPSB0eXBlb2YgZXhwb3NlZDtcbiAgICAgICAgaWYgKGV4cG9zZWRUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkoZXhwb3NlZCkpIHtcbiAgICAgICAgICAgIGV4cG9zZWRUeXBlID0gXCJhcnJheVwiO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZWYoZXhwb3NlZCkpIHtcbiAgICAgICAgICAgIGV4cG9zZWRUeXBlID0gXCJyZWZcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cG9zZWRUeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYGV4cG9zZSgpIHNob3VsZCBiZSBwYXNzZWQgYSBwbGFpbiBvYmplY3QsIHJlY2VpdmVkICR7ZXhwb3NlZFR5cGV9LmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGluc3RhbmNlLmV4cG9zZWQgPSBleHBvc2VkIHx8IHt9O1xuICB9O1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgIGdldCBhdHRycygpIHtcbiAgICAgICAgcmV0dXJuIGdldEF0dHJzUHJveHkoaW5zdGFuY2UpO1xuICAgICAgfSxcbiAgICAgIGdldCBzbG90cygpIHtcbiAgICAgICAgcmV0dXJuIGdldFNsb3RzUHJveHkoaW5zdGFuY2UpO1xuICAgICAgfSxcbiAgICAgIGdldCBlbWl0KCkge1xuICAgICAgICByZXR1cm4gKGV2ZW50LCAuLi5hcmdzKSA9PiBpbnN0YW5jZS5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICAgIH0sXG4gICAgICBleHBvc2VcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0IGF0dHJzKCkge1xuICAgICAgICByZXR1cm4gZ2V0QXR0cnNQcm94eShpbnN0YW5jZSk7XG4gICAgICB9LFxuICAgICAgc2xvdHM6IGluc3RhbmNlLnNsb3RzLFxuICAgICAgZW1pdDogaW5zdGFuY2UuZW1pdCxcbiAgICAgIGV4cG9zZVxuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEV4cG9zZVByb3h5KGluc3RhbmNlKSB7XG4gIGlmIChpbnN0YW5jZS5leHBvc2VkKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmV4cG9zZVByb3h5IHx8IChpbnN0YW5jZS5leHBvc2VQcm94eSA9IG5ldyBQcm94eShwcm94eVJlZnMobWFya1JhdyhpbnN0YW5jZS5leHBvc2VkKSksIHtcbiAgICAgIGdldCh0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAoa2V5IGluIHRhcmdldCkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgaW4gcHVibGljUHJvcGVydGllc01hcCkge1xuICAgICAgICAgIHJldHVybiBwdWJsaWNQcm9wZXJ0aWVzTWFwW2tleV0oaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFzKHRhcmdldCwga2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gdGFyZ2V0IHx8IGtleSBpbiBwdWJsaWNQcm9wZXJ0aWVzTWFwO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxufVxuY29uc3QgY2xhc3NpZnlSRSA9IC8oPzpefFstX10pKFxcdykvZztcbmNvbnN0IGNsYXNzaWZ5ID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoY2xhc3NpZnlSRSwgKGMpID0+IGMudG9VcHBlckNhc2UoKSkucmVwbGFjZSgvWy1fXS9nLCBcIlwiKTtcbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50LCBpbmNsdWRlSW5mZXJyZWQgPSB0cnVlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKENvbXBvbmVudCkgPyBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgOiBDb21wb25lbnQubmFtZSB8fCBpbmNsdWRlSW5mZXJyZWQgJiYgQ29tcG9uZW50Ll9fbmFtZTtcbn1cbmZ1bmN0aW9uIGZvcm1hdENvbXBvbmVudE5hbWUoaW5zdGFuY2UsIENvbXBvbmVudCwgaXNSb290ID0gZmFsc2UpIHtcbiAgbGV0IG5hbWUgPSBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCk7XG4gIGlmICghbmFtZSAmJiBDb21wb25lbnQuX19maWxlKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBDb21wb25lbnQuX19maWxlLm1hdGNoKC8oW14vXFxcXF0rKVxcLlxcdyskLyk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBuYW1lID0gbWF0Y2hbMV07XG4gICAgfVxuICB9XG4gIGlmICghbmFtZSAmJiBpbnN0YW5jZSAmJiBpbnN0YW5jZS5wYXJlbnQpIHtcbiAgICBjb25zdCBpbmZlckZyb21SZWdpc3RyeSA9IChyZWdpc3RyeSkgPT4ge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVnaXN0cnkpIHtcbiAgICAgICAgaWYgKHJlZ2lzdHJ5W2tleV0gPT09IENvbXBvbmVudCkge1xuICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIG5hbWUgPSBpbmZlckZyb21SZWdpc3RyeShcbiAgICAgIGluc3RhbmNlLmNvbXBvbmVudHMgfHwgaW5zdGFuY2UucGFyZW50LnR5cGUuY29tcG9uZW50c1xuICAgICkgfHwgaW5mZXJGcm9tUmVnaXN0cnkoaW5zdGFuY2UuYXBwQ29udGV4dC5jb21wb25lbnRzKTtcbiAgfVxuICByZXR1cm4gbmFtZSA/IGNsYXNzaWZ5KG5hbWUpIDogaXNSb290ID8gYEFwcGAgOiBgQW5vbnltb3VzYDtcbn1cbmZ1bmN0aW9uIGlzQ2xhc3NDb21wb25lbnQodmFsdWUpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24odmFsdWUpICYmIFwiX192Y2NPcHRzXCIgaW4gdmFsdWU7XG59XG5cbmNvbnN0IGNvbXB1dGVkID0gKGdldHRlck9yT3B0aW9ucywgZGVidWdPcHRpb25zKSA9PiB7XG4gIHJldHVybiBjb21wdXRlZCQxKGdldHRlck9yT3B0aW9ucywgZGVidWdPcHRpb25zLCBpc0luU1NSQ29tcG9uZW50U2V0dXApO1xufTtcblxuZnVuY3Rpb24gdXNlTW9kZWwocHJvcHMsIG5hbWUsIG9wdGlvbnMgPSBFTVBUWV9PQkopIHtcbiAgY29uc3QgaSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaSkge1xuICAgIHdhcm4kMShgdXNlTW9kZWwoKSBjYWxsZWQgd2l0aG91dCBhY3RpdmUgaW5zdGFuY2UuYCk7XG4gICAgcmV0dXJuIHJlZigpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpLnByb3BzT3B0aW9uc1swXVtuYW1lXSkge1xuICAgIHdhcm4kMShgdXNlTW9kZWwoKSBjYWxsZWQgd2l0aCBwcm9wIFwiJHtuYW1lfVwiIHdoaWNoIGlzIG5vdCBkZWNsYXJlZC5gKTtcbiAgICByZXR1cm4gcmVmKCk7XG4gIH1cbiAgY29uc3QgY2FtZWxpemVkTmFtZSA9IGNhbWVsaXplKG5hbWUpO1xuICBjb25zdCBoeXBoZW5hdGVkTmFtZSA9IGh5cGhlbmF0ZShuYW1lKTtcbiAgY29uc3QgcmVzID0gY3VzdG9tUmVmKCh0cmFjaywgdHJpZ2dlcikgPT4ge1xuICAgIGxldCBsb2NhbFZhbHVlO1xuICAgIHdhdGNoU3luY0VmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wVmFsdWUgPSBwcm9wc1tuYW1lXTtcbiAgICAgIGlmIChoYXNDaGFuZ2VkKGxvY2FsVmFsdWUsIHByb3BWYWx1ZSkpIHtcbiAgICAgICAgbG9jYWxWYWx1ZSA9IHByb3BWYWx1ZTtcbiAgICAgICAgdHJpZ2dlcigpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHRyYWNrKCk7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmdldCA/IG9wdGlvbnMuZ2V0KGxvY2FsVmFsdWUpIDogbG9jYWxWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgcmF3UHJvcHMgPSBpLnZub2RlLnByb3BzO1xuICAgICAgICBpZiAoIShyYXdQcm9wcyAmJiAvLyBjaGVjayBpZiBwYXJlbnQgaGFzIHBhc3NlZCB2LW1vZGVsXG4gICAgICAgIChuYW1lIGluIHJhd1Byb3BzIHx8IGNhbWVsaXplZE5hbWUgaW4gcmF3UHJvcHMgfHwgaHlwaGVuYXRlZE5hbWUgaW4gcmF3UHJvcHMpICYmIChgb25VcGRhdGU6JHtuYW1lfWAgaW4gcmF3UHJvcHMgfHwgYG9uVXBkYXRlOiR7Y2FtZWxpemVkTmFtZX1gIGluIHJhd1Byb3BzIHx8IGBvblVwZGF0ZToke2h5cGhlbmF0ZWROYW1lfWAgaW4gcmF3UHJvcHMpKSAmJiBoYXNDaGFuZ2VkKHZhbHVlLCBsb2NhbFZhbHVlKSkge1xuICAgICAgICAgIGxvY2FsVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB0cmlnZ2VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaS5lbWl0KGB1cGRhdGU6JHtuYW1lfWAsIG9wdGlvbnMuc2V0ID8gb3B0aW9ucy5zZXQodmFsdWUpIDogdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICBjb25zdCBtb2RpZmllcktleSA9IG5hbWUgPT09IFwibW9kZWxWYWx1ZVwiID8gXCJtb2RlbE1vZGlmaWVyc1wiIDogYCR7bmFtZX1Nb2RpZmllcnNgO1xuICByZXNbU3ltYm9sLml0ZXJhdG9yXSA9ICgpID0+IHtcbiAgICBsZXQgaTIgPSAwO1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0KCkge1xuICAgICAgICBpZiAoaTIgPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGkyKysgPyBwcm9wc1ttb2RpZmllcktleV0gfHwge30gOiByZXMsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gaCh0eXBlLCBwcm9wc09yQ2hpbGRyZW4sIGNoaWxkcmVuKSB7XG4gIGNvbnN0IGwgPSBhcmd1bWVudHMubGVuZ3RoO1xuICBpZiAobCA9PT0gMikge1xuICAgIGlmIChpc09iamVjdChwcm9wc09yQ2hpbGRyZW4pICYmICFpc0FycmF5KHByb3BzT3JDaGlsZHJlbikpIHtcbiAgICAgIGlmIChpc1ZOb2RlKHByb3BzT3JDaGlsZHJlbikpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIG51bGwsIFtwcm9wc09yQ2hpbGRyZW5dKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBwcm9wc09yQ2hpbGRyZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgbnVsbCwgcHJvcHNPckNoaWxkcmVuKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGwgPiAzKSB7XG4gICAgICBjaGlsZHJlbiA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgfSBlbHNlIGlmIChsID09PSAzICYmIGlzVk5vZGUoY2hpbGRyZW4pKSB7XG4gICAgICBjaGlsZHJlbiA9IFtjaGlsZHJlbl07XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBwcm9wc09yQ2hpbGRyZW4sIGNoaWxkcmVuKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NoYWxsb3codmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlW1wiX192X2lzU2hhbGxvd1wiXSk7XG59XG5cbmZ1bmN0aW9uIGluaXRDdXN0b21Gb3JtYXR0ZXIoKSB7XG4gIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHZ1ZVN0eWxlID0geyBzdHlsZTogXCJjb2xvcjojM2JhNzc2XCIgfTtcbiAgY29uc3QgbnVtYmVyU3R5bGUgPSB7IHN0eWxlOiBcImNvbG9yOiMxNjc3ZmZcIiB9O1xuICBjb25zdCBzdHJpbmdTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6I2Y1MjIyZFwiIH07XG4gIGNvbnN0IGtleXdvcmRTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6I2ViMmY5NlwiIH07XG4gIGNvbnN0IGZvcm1hdHRlciA9IHtcbiAgICBoZWFkZXIob2JqKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAob2JqLl9faXNWdWUpIHtcbiAgICAgICAgcmV0dXJuIFtcImRpdlwiLCB2dWVTdHlsZSwgYFZ1ZUluc3RhbmNlYF07XG4gICAgICB9IGVsc2UgaWYgKGlzUmVmKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIFtcInNwYW5cIiwgdnVlU3R5bGUsIGdlblJlZkZsYWcob2JqKV0sXG4gICAgICAgICAgXCI8XCIsXG4gICAgICAgICAgZm9ybWF0VmFsdWUob2JqLnZhbHVlKSxcbiAgICAgICAgICBgPmBcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFjdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgICBbXCJzcGFuXCIsIHZ1ZVN0eWxlLCBpc1NoYWxsb3cob2JqKSA/IFwiU2hhbGxvd1JlYWN0aXZlXCIgOiBcIlJlYWN0aXZlXCJdLFxuICAgICAgICAgIFwiPFwiLFxuICAgICAgICAgIGZvcm1hdFZhbHVlKG9iaiksXG4gICAgICAgICAgYD4ke2lzUmVhZG9ubHkob2JqKSA/IGAgKHJlYWRvbmx5KWAgOiBgYH1gXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKGlzUmVhZG9ubHkob2JqKSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge30sXG4gICAgICAgICAgW1wic3BhblwiLCB2dWVTdHlsZSwgaXNTaGFsbG93KG9iaikgPyBcIlNoYWxsb3dSZWFkb25seVwiIDogXCJSZWFkb25seVwiXSxcbiAgICAgICAgICBcIjxcIixcbiAgICAgICAgICBmb3JtYXRWYWx1ZShvYmopLFxuICAgICAgICAgIFwiPlwiXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIGhhc0JvZHkob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIG9iai5fX2lzVnVlO1xuICAgIH0sXG4gICAgYm9keShvYmopIHtcbiAgICAgIGlmIChvYmogJiYgb2JqLl9faXNWdWUpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIC4uLmZvcm1hdEluc3RhbmNlKG9iai4kKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gZm9ybWF0SW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgICBjb25zdCBibG9ja3MgPSBbXTtcbiAgICBpZiAoaW5zdGFuY2UudHlwZS5wcm9wcyAmJiBpbnN0YW5jZS5wcm9wcykge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcInByb3BzXCIsIHRvUmF3KGluc3RhbmNlLnByb3BzKSkpO1xuICAgIH1cbiAgICBpZiAoaW5zdGFuY2Uuc2V0dXBTdGF0ZSAhPT0gRU1QVFlfT0JKKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwic2V0dXBcIiwgaW5zdGFuY2Uuc2V0dXBTdGF0ZSkpO1xuICAgIH1cbiAgICBpZiAoaW5zdGFuY2UuZGF0YSAhPT0gRU1QVFlfT0JKKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwiZGF0YVwiLCB0b1JhdyhpbnN0YW5jZS5kYXRhKSkpO1xuICAgIH1cbiAgICBjb25zdCBjb21wdXRlZCA9IGV4dHJhY3RLZXlzKGluc3RhbmNlLCBcImNvbXB1dGVkXCIpO1xuICAgIGlmIChjb21wdXRlZCkge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcImNvbXB1dGVkXCIsIGNvbXB1dGVkKSk7XG4gICAgfVxuICAgIGNvbnN0IGluamVjdGVkID0gZXh0cmFjdEtleXMoaW5zdGFuY2UsIFwiaW5qZWN0XCIpO1xuICAgIGlmIChpbmplY3RlZCkge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcImluamVjdGVkXCIsIGluamVjdGVkKSk7XG4gICAgfVxuICAgIGJsb2Nrcy5wdXNoKFtcbiAgICAgIFwiZGl2XCIsXG4gICAgICB7fSxcbiAgICAgIFtcbiAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzdHlsZToga2V5d29yZFN0eWxlLnN0eWxlICsgXCI7b3BhY2l0eTowLjY2XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCIkIChpbnRlcm5hbCk6IFwiXG4gICAgICBdLFxuICAgICAgW1wib2JqZWN0XCIsIHsgb2JqZWN0OiBpbnN0YW5jZSB9XVxuICAgIF0pO1xuICAgIHJldHVybiBibG9ja3M7XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VCbG9jayh0eXBlLCB0YXJnZXQpIHtcbiAgICB0YXJnZXQgPSBleHRlbmQoe30sIHRhcmdldCk7XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0YXJnZXQpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwge31dO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgXCJkaXZcIixcbiAgICAgIHsgc3R5bGU6IFwibGluZS1oZWlnaHQ6MS4yNWVtO21hcmdpbi1ib3R0b206MC42ZW1cIiB9LFxuICAgICAgW1xuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7XG4gICAgICAgICAgc3R5bGU6IFwiY29sb3I6IzQ3NjU4MlwiXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzdHlsZTogXCJwYWRkaW5nLWxlZnQ6MS4yNWVtXCJcbiAgICAgICAgfSxcbiAgICAgICAgLi4uT2JqZWN0LmtleXModGFyZ2V0KS5tYXAoKGtleSkgPT4ge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBbXCJzcGFuXCIsIGtleXdvcmRTdHlsZSwga2V5ICsgXCI6IFwiXSxcbiAgICAgICAgICAgIGZvcm1hdFZhbHVlKHRhcmdldFtrZXldLCBmYWxzZSlcbiAgICAgICAgICBdO1xuICAgICAgICB9KVxuICAgICAgXVxuICAgIF07XG4gIH1cbiAgZnVuY3Rpb24gZm9ybWF0VmFsdWUodiwgYXNSYXcgPSB0cnVlKSB7XG4gICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBudW1iZXJTdHlsZSwgdl07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwgc3RyaW5nU3R5bGUsIEpTT04uc3RyaW5naWZ5KHYpXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwga2V5d29yZFN0eWxlLCB2XTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHYpKSB7XG4gICAgICByZXR1cm4gW1wib2JqZWN0XCIsIHsgb2JqZWN0OiBhc1JhdyA/IHRvUmF3KHYpIDogdiB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwgc3RyaW5nU3R5bGUsIFN0cmluZyh2KV07XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGV4dHJhY3RLZXlzKGluc3RhbmNlLCB0eXBlKSB7XG4gICAgY29uc3QgQ29tcCA9IGluc3RhbmNlLnR5cGU7XG4gICAgaWYgKGlzRnVuY3Rpb24oQ29tcCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXh0cmFjdGVkID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gaW5zdGFuY2UuY3R4KSB7XG4gICAgICBpZiAoaXNLZXlPZlR5cGUoQ29tcCwga2V5LCB0eXBlKSkge1xuICAgICAgICBleHRyYWN0ZWRba2V5XSA9IGluc3RhbmNlLmN0eFtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXh0cmFjdGVkO1xuICB9XG4gIGZ1bmN0aW9uIGlzS2V5T2ZUeXBlKENvbXAsIGtleSwgdHlwZSkge1xuICAgIGNvbnN0IG9wdHMgPSBDb21wW3R5cGVdO1xuICAgIGlmIChpc0FycmF5KG9wdHMpICYmIG9wdHMuaW5jbHVkZXMoa2V5KSB8fCBpc09iamVjdChvcHRzKSAmJiBrZXkgaW4gb3B0cykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChDb21wLmV4dGVuZHMgJiYgaXNLZXlPZlR5cGUoQ29tcC5leHRlbmRzLCBrZXksIHR5cGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKENvbXAubWl4aW5zICYmIENvbXAubWl4aW5zLnNvbWUoKG0pID0+IGlzS2V5T2ZUeXBlKG0sIGtleSwgdHlwZSkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2VuUmVmRmxhZyh2KSB7XG4gICAgaWYgKGlzU2hhbGxvdyh2KSkge1xuICAgICAgcmV0dXJuIGBTaGFsbG93UmVmYDtcbiAgICB9XG4gICAgaWYgKHYuZWZmZWN0KSB7XG4gICAgICByZXR1cm4gYENvbXB1dGVkUmVmYDtcbiAgICB9XG4gICAgcmV0dXJuIGBSZWZgO1xuICB9XG4gIGlmICh3aW5kb3cuZGV2dG9vbHNGb3JtYXR0ZXJzKSB7XG4gICAgd2luZG93LmRldnRvb2xzRm9ybWF0dGVycy5wdXNoKGZvcm1hdHRlcik7XG4gIH0gZWxzZSB7XG4gICAgd2luZG93LmRldnRvb2xzRm9ybWF0dGVycyA9IFtmb3JtYXR0ZXJdO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdpdGhNZW1vKG1lbW8sIHJlbmRlciwgY2FjaGUsIGluZGV4KSB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlW2luZGV4XTtcbiAgaWYgKGNhY2hlZCAmJiBpc01lbW9TYW1lKGNhY2hlZCwgbWVtbykpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHJldCA9IHJlbmRlcigpO1xuICByZXQubWVtbyA9IG1lbW8uc2xpY2UoKTtcbiAgcmV0dXJuIGNhY2hlW2luZGV4XSA9IHJldDtcbn1cbmZ1bmN0aW9uIGlzTWVtb1NhbWUoY2FjaGVkLCBtZW1vKSB7XG4gIGNvbnN0IHByZXYgPSBjYWNoZWQubWVtbztcbiAgaWYgKHByZXYubGVuZ3RoICE9IG1lbW8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldi5sZW5ndGg7IGkrKykge1xuICAgIGlmIChoYXNDaGFuZ2VkKHByZXZbaV0sIG1lbW9baV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwICYmIGN1cnJlbnRCbG9jaykge1xuICAgIGN1cnJlbnRCbG9jay5wdXNoKGNhY2hlZCk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IHZlcnNpb24gPSBcIjMuNC4xMFwiO1xuY29uc3Qgd2FybiA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB3YXJuJDEgOiBOT09QO1xuY29uc3QgRXJyb3JUeXBlU3RyaW5ncyA9IEVycm9yVHlwZVN0cmluZ3MkMSA7XG5jb25zdCBkZXZ0b29scyA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgdHJ1ZSA/IGRldnRvb2xzJDEgOiB2b2lkIDA7XG5jb25zdCBzZXREZXZ0b29sc0hvb2sgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IHRydWUgPyBzZXREZXZ0b29sc0hvb2skMSA6IE5PT1A7XG5jb25zdCBfc3NyVXRpbHMgPSB7XG4gIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlLFxuICBzZXR1cENvbXBvbmVudCxcbiAgcmVuZGVyQ29tcG9uZW50Um9vdCxcbiAgc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlLFxuICBpc1ZOb2RlOiBpc1ZOb2RlLFxuICBub3JtYWxpemVWTm9kZVxufTtcbmNvbnN0IHNzclV0aWxzID0gX3NzclV0aWxzIDtcbmNvbnN0IHJlc29sdmVGaWx0ZXIgPSBudWxsO1xuY29uc3QgY29tcGF0VXRpbHMgPSBudWxsO1xuY29uc3QgRGVwcmVjYXRpb25UeXBlcyA9IG51bGw7XG5cbmV4cG9ydCB7IEJhc2VUcmFuc2l0aW9uLCBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycywgQ29tbWVudCwgRGVwcmVjYXRpb25UeXBlcywgRXJyb3JDb2RlcywgRXJyb3JUeXBlU3RyaW5ncywgRnJhZ21lbnQsIEtlZXBBbGl2ZSwgU3RhdGljLCBTdXNwZW5zZSwgVGVsZXBvcnQsIFRleHQsIGFzc2VydE51bWJlciwgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcsIGNhbGxXaXRoRXJyb3JIYW5kbGluZywgY2xvbmVWTm9kZSwgY29tcGF0VXRpbHMsIGNvbXB1dGVkLCBjcmVhdGVCbG9jaywgY3JlYXRlQ29tbWVudFZOb2RlLCBjcmVhdGVFbGVtZW50QmxvY2ssIGNyZWF0ZUJhc2VWTm9kZSBhcyBjcmVhdGVFbGVtZW50Vk5vZGUsIGNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyLCBjcmVhdGVQcm9wc1Jlc3RQcm94eSwgY3JlYXRlUmVuZGVyZXIsIGNyZWF0ZVNsb3RzLCBjcmVhdGVTdGF0aWNWTm9kZSwgY3JlYXRlVGV4dFZOb2RlLCBjcmVhdGVWTm9kZSwgZGVmaW5lQXN5bmNDb21wb25lbnQsIGRlZmluZUNvbXBvbmVudCwgZGVmaW5lRW1pdHMsIGRlZmluZUV4cG9zZSwgZGVmaW5lTW9kZWwsIGRlZmluZU9wdGlvbnMsIGRlZmluZVByb3BzLCBkZWZpbmVTbG90cywgZGV2dG9vbHMsIGdldEN1cnJlbnRJbnN0YW5jZSwgZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuLCBndWFyZFJlYWN0aXZlUHJvcHMsIGgsIGhhbmRsZUVycm9yLCBoYXNJbmplY3Rpb25Db250ZXh0LCBpbml0Q3VzdG9tRm9ybWF0dGVyLCBpbmplY3QsIGlzTWVtb1NhbWUsIGlzUnVudGltZU9ubHksIGlzVk5vZGUsIG1lcmdlRGVmYXVsdHMsIG1lcmdlTW9kZWxzLCBtZXJnZVByb3BzLCBuZXh0VGljaywgb25BY3RpdmF0ZWQsIG9uQmVmb3JlTW91bnQsIG9uQmVmb3JlVW5tb3VudCwgb25CZWZvcmVVcGRhdGUsIG9uRGVhY3RpdmF0ZWQsIG9uRXJyb3JDYXB0dXJlZCwgb25Nb3VudGVkLCBvblJlbmRlclRyYWNrZWQsIG9uUmVuZGVyVHJpZ2dlcmVkLCBvblNlcnZlclByZWZldGNoLCBvblVubW91bnRlZCwgb25VcGRhdGVkLCBvcGVuQmxvY2ssIHBvcFNjb3BlSWQsIHByb3ZpZGUsIHB1c2hTY29wZUlkLCBxdWV1ZVBvc3RGbHVzaENiLCByZWdpc3RlclJ1bnRpbWVDb21waWxlciwgcmVuZGVyTGlzdCwgcmVuZGVyU2xvdCwgcmVzb2x2ZUNvbXBvbmVudCwgcmVzb2x2ZURpcmVjdGl2ZSwgcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQsIHJlc29sdmVGaWx0ZXIsIHJlc29sdmVUcmFuc2l0aW9uSG9va3MsIHNldEJsb2NrVHJhY2tpbmcsIHNldERldnRvb2xzSG9vaywgc2V0VHJhbnNpdGlvbkhvb2tzLCBzc3JDb250ZXh0S2V5LCBzc3JVdGlscywgdG9IYW5kbGVycywgdHJhbnNmb3JtVk5vZGVBcmdzLCB1c2VBdHRycywgdXNlTW9kZWwsIHVzZVNTUkNvbnRleHQsIHVzZVNsb3RzLCB1c2VUcmFuc2l0aW9uU3RhdGUsIHZlcnNpb24sIHdhcm4sIHdhdGNoLCB3YXRjaEVmZmVjdCwgd2F0Y2hQb3N0RWZmZWN0LCB3YXRjaFN5bmNFZmZlY3QsIHdpdGhBc3luY0NvbnRleHQsIHdpdGhDdHgsIHdpdGhEZWZhdWx0cywgd2l0aERpcmVjdGl2ZXMsIHdpdGhNZW1vLCB3aXRoU2NvcGVJZCB9O1xuIiwiLyoqXG4qIEB2dWUvcnVudGltZS1kb20gdjMuNC4xMFxuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuaW1wb3J0IHsgaCwgQmFzZVRyYW5zaXRpb24sIEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLCBhc3NlcnROdW1iZXIsIGdldEN1cnJlbnRJbnN0YW5jZSwgd2Fybiwgd2F0Y2hQb3N0RWZmZWN0LCBvbk1vdW50ZWQsIG9uVW5tb3VudGVkLCBGcmFnbWVudCwgU3RhdGljLCBjYW1lbGl6ZSwgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcsIGRlZmluZUNvbXBvbmVudCwgbmV4dFRpY2ssIGNyZWF0ZVZOb2RlLCB1c2VUcmFuc2l0aW9uU3RhdGUsIG9uVXBkYXRlZCwgdG9SYXcsIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbiwgc2V0VHJhbnNpdGlvbkhvb2tzLCByZXNvbHZlVHJhbnNpdGlvbkhvb2tzLCBpc1J1bnRpbWVPbmx5LCBjcmVhdGVSZW5kZXJlciwgY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXIgfSBmcm9tICdAdnVlL3J1bnRpbWUtY29yZSc7XG5leHBvcnQgKiBmcm9tICdAdnVlL3J1bnRpbWUtY29yZSc7XG5pbXBvcnQgeyBleHRlbmQsIGlzT2JqZWN0LCB0b051bWJlciwgaXNBcnJheSwgaXNTdHJpbmcsIGh5cGhlbmF0ZSwgY2FwaXRhbGl6ZSwgaXNTcGVjaWFsQm9vbGVhbkF0dHIsIGluY2x1ZGVCb29sZWFuQXR0ciwgaXNPbiwgaXNNb2RlbExpc3RlbmVyLCBpc0Z1bmN0aW9uLCBjYW1lbGl6ZSBhcyBjYW1lbGl6ZSQxLCBFTVBUWV9PQkosIGxvb3NlVG9OdW1iZXIsIGxvb3NlSW5kZXhPZiwgaXNTZXQsIGxvb3NlRXF1YWwsIGludm9rZUFycmF5Rm5zLCBpc0hUTUxUYWcsIGlzU1ZHVGFnLCBpc01hdGhNTFRhZyB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuY29uc3Qgc3ZnTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7XG5jb25zdCBtYXRobWxOUyA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwiO1xuY29uc3QgZG9jID0gdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiID8gZG9jdW1lbnQgOiBudWxsO1xuY29uc3QgdGVtcGxhdGVDb250YWluZXIgPSBkb2MgJiYgLyogQF9fUFVSRV9fICovIGRvYy5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5jb25zdCBub2RlT3BzID0ge1xuICBpbnNlcnQ6IChjaGlsZCwgcGFyZW50LCBhbmNob3IpID0+IHtcbiAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBhbmNob3IgfHwgbnVsbCk7XG4gIH0sXG4gIHJlbW92ZTogKGNoaWxkKSA9PiB7XG4gICAgY29uc3QgcGFyZW50ID0gY2hpbGQucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICAgIH1cbiAgfSxcbiAgY3JlYXRlRWxlbWVudDogKHRhZywgbmFtZXNwYWNlLCBpcywgcHJvcHMpID0+IHtcbiAgICBjb25zdCBlbCA9IG5hbWVzcGFjZSA9PT0gXCJzdmdcIiA/IGRvYy5jcmVhdGVFbGVtZW50TlMoc3ZnTlMsIHRhZykgOiBuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIgPyBkb2MuY3JlYXRlRWxlbWVudE5TKG1hdGhtbE5TLCB0YWcpIDogZG9jLmNyZWF0ZUVsZW1lbnQodGFnLCBpcyA/IHsgaXMgfSA6IHZvaWQgMCk7XG4gICAgaWYgKHRhZyA9PT0gXCJzZWxlY3RcIiAmJiBwcm9wcyAmJiBwcm9wcy5tdWx0aXBsZSAhPSBudWxsKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiLCBwcm9wcy5tdWx0aXBsZSk7XG4gICAgfVxuICAgIHJldHVybiBlbDtcbiAgfSxcbiAgY3JlYXRlVGV4dDogKHRleHQpID0+IGRvYy5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSxcbiAgY3JlYXRlQ29tbWVudDogKHRleHQpID0+IGRvYy5jcmVhdGVDb21tZW50KHRleHQpLFxuICBzZXRUZXh0OiAobm9kZSwgdGV4dCkgPT4ge1xuICAgIG5vZGUubm9kZVZhbHVlID0gdGV4dDtcbiAgfSxcbiAgc2V0RWxlbWVudFRleHQ6IChlbCwgdGV4dCkgPT4ge1xuICAgIGVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgfSxcbiAgcGFyZW50Tm9kZTogKG5vZGUpID0+IG5vZGUucGFyZW50Tm9kZSxcbiAgbmV4dFNpYmxpbmc6IChub2RlKSA9PiBub2RlLm5leHRTaWJsaW5nLFxuICBxdWVyeVNlbGVjdG9yOiAoc2VsZWN0b3IpID0+IGRvYy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSxcbiAgc2V0U2NvcGVJZChlbCwgaWQpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoaWQsIFwiXCIpO1xuICB9LFxuICAvLyBfX1VOU0FGRV9fXG4gIC8vIFJlYXNvbjogaW5uZXJIVE1MLlxuICAvLyBTdGF0aWMgY29udGVudCBoZXJlIGNhbiBvbmx5IGNvbWUgZnJvbSBjb21waWxlZCB0ZW1wbGF0ZXMuXG4gIC8vIEFzIGxvbmcgYXMgdGhlIHVzZXIgb25seSB1c2VzIHRydXN0ZWQgdGVtcGxhdGVzLCB0aGlzIGlzIHNhZmUuXG4gIGluc2VydFN0YXRpY0NvbnRlbnQoY29udGVudCwgcGFyZW50LCBhbmNob3IsIG5hbWVzcGFjZSwgc3RhcnQsIGVuZCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IGFuY2hvciA/IGFuY2hvci5wcmV2aW91c1NpYmxpbmcgOiBwYXJlbnQubGFzdENoaWxkO1xuICAgIGlmIChzdGFydCAmJiAoc3RhcnQgPT09IGVuZCB8fCBzdGFydC5uZXh0U2libGluZykpIHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoc3RhcnQuY2xvbmVOb2RlKHRydWUpLCBhbmNob3IpO1xuICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCB8fCAhKHN0YXJ0ID0gc3RhcnQubmV4dFNpYmxpbmcpKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wbGF0ZUNvbnRhaW5lci5pbm5lckhUTUwgPSBuYW1lc3BhY2UgPT09IFwic3ZnXCIgPyBgPHN2Zz4ke2NvbnRlbnR9PC9zdmc+YCA6IG5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiA/IGA8bWF0aD4ke2NvbnRlbnR9PC9tYXRoPmAgOiBjb250ZW50O1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNvbnRhaW5lci5jb250ZW50O1xuICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRlbXBsYXRlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlICh3cmFwcGVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICB0ZW1wbGF0ZS5hcHBlbmRDaGlsZCh3cmFwcGVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlLnJlbW92ZUNoaWxkKHdyYXBwZXIpO1xuICAgICAgfVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0ZW1wbGF0ZSwgYW5jaG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIGZpcnN0XG4gICAgICBiZWZvcmUgPyBiZWZvcmUubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZCxcbiAgICAgIC8vIGxhc3RcbiAgICAgIGFuY2hvciA/IGFuY2hvci5wcmV2aW91c1NpYmxpbmcgOiBwYXJlbnQubGFzdENoaWxkXG4gICAgXTtcbiAgfVxufTtcblxuY29uc3QgVFJBTlNJVElPTiA9IFwidHJhbnNpdGlvblwiO1xuY29uc3QgQU5JTUFUSU9OID0gXCJhbmltYXRpb25cIjtcbmNvbnN0IHZ0Y0tleSA9IFN5bWJvbChcIl92dGNcIik7XG5jb25zdCBUcmFuc2l0aW9uID0gKHByb3BzLCB7IHNsb3RzIH0pID0+IGgoQmFzZVRyYW5zaXRpb24sIHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocHJvcHMpLCBzbG90cyk7XG5UcmFuc2l0aW9uLmRpc3BsYXlOYW1lID0gXCJUcmFuc2l0aW9uXCI7XG5jb25zdCBET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0ge1xuICBuYW1lOiBTdHJpbmcsXG4gIHR5cGU6IFN0cmluZyxcbiAgY3NzOiB7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBkZWZhdWx0OiB0cnVlXG4gIH0sXG4gIGR1cmF0aW9uOiBbU3RyaW5nLCBOdW1iZXIsIE9iamVjdF0sXG4gIGVudGVyRnJvbUNsYXNzOiBTdHJpbmcsXG4gIGVudGVyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgZW50ZXJUb0NsYXNzOiBTdHJpbmcsXG4gIGFwcGVhckZyb21DbGFzczogU3RyaW5nLFxuICBhcHBlYXJBY3RpdmVDbGFzczogU3RyaW5nLFxuICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsXG4gIGxlYXZlRnJvbUNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgbGVhdmVUb0NsYXNzOiBTdHJpbmdcbn07XG5jb25zdCBUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0gVHJhbnNpdGlvbi5wcm9wcyA9IC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoXG4gIHt9LFxuICBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyxcbiAgRE9NVHJhbnNpdGlvblByb3BzVmFsaWRhdG9yc1xuKTtcbmNvbnN0IGNhbGxIb29rID0gKGhvb2ssIGFyZ3MgPSBbXSkgPT4ge1xuICBpZiAoaXNBcnJheShob29rKSkge1xuICAgIGhvb2suZm9yRWFjaCgoaDIpID0+IGgyKC4uLmFyZ3MpKTtcbiAgfSBlbHNlIGlmIChob29rKSB7XG4gICAgaG9vayguLi5hcmdzKTtcbiAgfVxufTtcbmNvbnN0IGhhc0V4cGxpY2l0Q2FsbGJhY2sgPSAoaG9vaykgPT4ge1xuICByZXR1cm4gaG9vayA/IGlzQXJyYXkoaG9vaykgPyBob29rLnNvbWUoKGgyKSA9PiBoMi5sZW5ndGggPiAxKSA6IGhvb2subGVuZ3RoID4gMSA6IGZhbHNlO1xufTtcbmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocmF3UHJvcHMpIHtcbiAgY29uc3QgYmFzZVByb3BzID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHJhd1Byb3BzKSB7XG4gICAgaWYgKCEoa2V5IGluIERPTVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMpKSB7XG4gICAgICBiYXNlUHJvcHNba2V5XSA9IHJhd1Byb3BzW2tleV07XG4gICAgfVxuICB9XG4gIGlmIChyYXdQcm9wcy5jc3MgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGJhc2VQcm9wcztcbiAgfVxuICBjb25zdCB7XG4gICAgbmFtZSA9IFwidlwiLFxuICAgIHR5cGUsXG4gICAgZHVyYXRpb24sXG4gICAgZW50ZXJGcm9tQ2xhc3MgPSBgJHtuYW1lfS1lbnRlci1mcm9tYCxcbiAgICBlbnRlckFjdGl2ZUNsYXNzID0gYCR7bmFtZX0tZW50ZXItYWN0aXZlYCxcbiAgICBlbnRlclRvQ2xhc3MgPSBgJHtuYW1lfS1lbnRlci10b2AsXG4gICAgYXBwZWFyRnJvbUNsYXNzID0gZW50ZXJGcm9tQ2xhc3MsXG4gICAgYXBwZWFyQWN0aXZlQ2xhc3MgPSBlbnRlckFjdGl2ZUNsYXNzLFxuICAgIGFwcGVhclRvQ2xhc3MgPSBlbnRlclRvQ2xhc3MsXG4gICAgbGVhdmVGcm9tQ2xhc3MgPSBgJHtuYW1lfS1sZWF2ZS1mcm9tYCxcbiAgICBsZWF2ZUFjdGl2ZUNsYXNzID0gYCR7bmFtZX0tbGVhdmUtYWN0aXZlYCxcbiAgICBsZWF2ZVRvQ2xhc3MgPSBgJHtuYW1lfS1sZWF2ZS10b2BcbiAgfSA9IHJhd1Byb3BzO1xuICBjb25zdCBkdXJhdGlvbnMgPSBub3JtYWxpemVEdXJhdGlvbihkdXJhdGlvbik7XG4gIGNvbnN0IGVudGVyRHVyYXRpb24gPSBkdXJhdGlvbnMgJiYgZHVyYXRpb25zWzBdO1xuICBjb25zdCBsZWF2ZUR1cmF0aW9uID0gZHVyYXRpb25zICYmIGR1cmF0aW9uc1sxXTtcbiAgY29uc3Qge1xuICAgIG9uQmVmb3JlRW50ZXIsXG4gICAgb25FbnRlcixcbiAgICBvbkVudGVyQ2FuY2VsbGVkLFxuICAgIG9uTGVhdmUsXG4gICAgb25MZWF2ZUNhbmNlbGxlZCxcbiAgICBvbkJlZm9yZUFwcGVhciA9IG9uQmVmb3JlRW50ZXIsXG4gICAgb25BcHBlYXIgPSBvbkVudGVyLFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkID0gb25FbnRlckNhbmNlbGxlZFxuICB9ID0gYmFzZVByb3BzO1xuICBjb25zdCBmaW5pc2hFbnRlciA9IChlbCwgaXNBcHBlYXIsIGRvbmUpID0+IHtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGlzQXBwZWFyID8gYXBwZWFyVG9DbGFzcyA6IGVudGVyVG9DbGFzcyk7XG4gICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBpc0FwcGVhciA/IGFwcGVhckFjdGl2ZUNsYXNzIDogZW50ZXJBY3RpdmVDbGFzcyk7XG4gICAgZG9uZSAmJiBkb25lKCk7XG4gIH07XG4gIGNvbnN0IGZpbmlzaExlYXZlID0gKGVsLCBkb25lKSA9PiB7XG4gICAgZWwuX2lzTGVhdmluZyA9IGZhbHNlO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVUb0NsYXNzKTtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgIGRvbmUgJiYgZG9uZSgpO1xuICB9O1xuICBjb25zdCBtYWtlRW50ZXJIb29rID0gKGlzQXBwZWFyKSA9PiB7XG4gICAgcmV0dXJuIChlbCwgZG9uZSkgPT4ge1xuICAgICAgY29uc3QgaG9vayA9IGlzQXBwZWFyID8gb25BcHBlYXIgOiBvbkVudGVyO1xuICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IGZpbmlzaEVudGVyKGVsLCBpc0FwcGVhciwgZG9uZSk7XG4gICAgICBjYWxsSG9vayhob29rLCBbZWwsIHJlc29sdmVdKTtcbiAgICAgIG5leHRGcmFtZSgoKSA9PiB7XG4gICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJGcm9tQ2xhc3MgOiBlbnRlckZyb21DbGFzcyk7XG4gICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJUb0NsYXNzIDogZW50ZXJUb0NsYXNzKTtcbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdENhbGxiYWNrKGhvb2spKSB7XG4gICAgICAgICAgd2hlblRyYW5zaXRpb25FbmRzKGVsLCB0eXBlLCBlbnRlckR1cmF0aW9uLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGV4dGVuZChiYXNlUHJvcHMsIHtcbiAgICBvbkJlZm9yZUVudGVyKGVsKSB7XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUVudGVyLCBbZWxdKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgZW50ZXJGcm9tQ2xhc3MpO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBlbnRlckFjdGl2ZUNsYXNzKTtcbiAgICB9LFxuICAgIG9uQmVmb3JlQXBwZWFyKGVsKSB7XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUFwcGVhciwgW2VsXSk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGFwcGVhckZyb21DbGFzcyk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGFwcGVhckFjdGl2ZUNsYXNzKTtcbiAgICB9LFxuICAgIG9uRW50ZXI6IG1ha2VFbnRlckhvb2soZmFsc2UpLFxuICAgIG9uQXBwZWFyOiBtYWtlRW50ZXJIb29rKHRydWUpLFxuICAgIG9uTGVhdmUoZWwsIGRvbmUpIHtcbiAgICAgIGVsLl9pc0xlYXZpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IGZpbmlzaExlYXZlKGVsLCBkb25lKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgICAgZm9yY2VSZWZsb3coKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7XG4gICAgICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICBpZiAoIWVsLl9pc0xlYXZpbmcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUZyb21DbGFzcyk7XG4gICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVUb0NsYXNzKTtcbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdENhbGxiYWNrKG9uTGVhdmUpKSB7XG4gICAgICAgICAgd2hlblRyYW5zaXRpb25FbmRzKGVsLCB0eXBlLCBsZWF2ZUR1cmF0aW9uLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjYWxsSG9vayhvbkxlYXZlLCBbZWwsIHJlc29sdmVdKTtcbiAgICB9LFxuICAgIG9uRW50ZXJDYW5jZWxsZWQoZWwpIHtcbiAgICAgIGZpbmlzaEVudGVyKGVsLCBmYWxzZSk7XG4gICAgICBjYWxsSG9vayhvbkVudGVyQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICB9LFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hFbnRlcihlbCwgdHJ1ZSk7XG4gICAgICBjYWxsSG9vayhvbkFwcGVhckNhbmNlbGxlZCwgW2VsXSk7XG4gICAgfSxcbiAgICBvbkxlYXZlQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hMZWF2ZShlbCk7XG4gICAgICBjYWxsSG9vayhvbkxlYXZlQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplRHVyYXRpb24oZHVyYXRpb24pIHtcbiAgaWYgKGR1cmF0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmIChpc09iamVjdChkdXJhdGlvbikpIHtcbiAgICByZXR1cm4gW051bWJlck9mKGR1cmF0aW9uLmVudGVyKSwgTnVtYmVyT2YoZHVyYXRpb24ubGVhdmUpXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBuID0gTnVtYmVyT2YoZHVyYXRpb24pO1xuICAgIHJldHVybiBbbiwgbl07XG4gIH1cbn1cbmZ1bmN0aW9uIE51bWJlck9mKHZhbCkge1xuICBjb25zdCByZXMgPSB0b051bWJlcih2YWwpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGFzc2VydE51bWJlcihyZXMsIFwiPHRyYW5zaXRpb24+IGV4cGxpY2l0IGR1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGNscykge1xuICBjbHMuc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGVsLmNsYXNzTGlzdC5hZGQoYykpO1xuICAoZWxbdnRjS2V5XSB8fCAoZWxbdnRjS2V5XSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpKS5hZGQoY2xzKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgY2xzKSB7XG4gIGNscy5zcGxpdCgvXFxzKy8pLmZvckVhY2goKGMpID0+IGMgJiYgZWwuY2xhc3NMaXN0LnJlbW92ZShjKSk7XG4gIGNvbnN0IF92dGMgPSBlbFt2dGNLZXldO1xuICBpZiAoX3Z0Yykge1xuICAgIF92dGMuZGVsZXRlKGNscyk7XG4gICAgaWYgKCFfdnRjLnNpemUpIHtcbiAgICAgIGVsW3Z0Y0tleV0gPSB2b2lkIDA7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBuZXh0RnJhbWUoY2IpIHtcbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2IpO1xuICB9KTtcbn1cbmxldCBlbmRJZCA9IDA7XG5mdW5jdGlvbiB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIGV4cGVjdGVkVHlwZSwgZXhwbGljaXRUaW1lb3V0LCByZXNvbHZlKSB7XG4gIGNvbnN0IGlkID0gZWwuX2VuZElkID0gKytlbmRJZDtcbiAgY29uc3QgcmVzb2x2ZUlmTm90U3RhbGUgPSAoKSA9PiB7XG4gICAgaWYgKGlkID09PSBlbC5fZW5kSWQpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9XG4gIH07XG4gIGlmIChleHBsaWNpdFRpbWVvdXQpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChyZXNvbHZlSWZOb3RTdGFsZSwgZXhwbGljaXRUaW1lb3V0KTtcbiAgfVxuICBjb25zdCB7IHR5cGUsIHRpbWVvdXQsIHByb3BDb3VudCB9ID0gZ2V0VHJhbnNpdGlvbkluZm8oZWwsIGV4cGVjdGVkVHlwZSk7XG4gIGlmICghdHlwZSkge1xuICAgIHJldHVybiByZXNvbHZlKCk7XG4gIH1cbiAgY29uc3QgZW5kRXZlbnQgPSB0eXBlICsgXCJlbmRcIjtcbiAgbGV0IGVuZGVkID0gMDtcbiAgY29uc3QgZW5kID0gKCkgPT4ge1xuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZW5kRXZlbnQsIG9uRW5kKTtcbiAgICByZXNvbHZlSWZOb3RTdGFsZSgpO1xuICB9O1xuICBjb25zdCBvbkVuZCA9IChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBlbCAmJiArK2VuZGVkID49IHByb3BDb3VudCkge1xuICAgICAgZW5kKCk7XG4gICAgfVxuICB9O1xuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBpZiAoZW5kZWQgPCBwcm9wQ291bnQpIHtcbiAgICAgIGVuZCgpO1xuICAgIH1cbiAgfSwgdGltZW91dCArIDEpO1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGVuZEV2ZW50LCBvbkVuZCk7XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uSW5mbyhlbCwgZXhwZWN0ZWRUeXBlKSB7XG4gIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgY29uc3QgZ2V0U3R5bGVQcm9wZXJ0aWVzID0gKGtleSkgPT4gKHN0eWxlc1trZXldIHx8IFwiXCIpLnNwbGl0KFwiLCBcIik7XG4gIGNvbnN0IHRyYW5zaXRpb25EZWxheXMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7VFJBTlNJVElPTn1EZWxheWApO1xuICBjb25zdCB0cmFuc2l0aW9uRHVyYXRpb25zID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059RHVyYXRpb25gKTtcbiAgY29uc3QgdHJhbnNpdGlvblRpbWVvdXQgPSBnZXRUaW1lb3V0KHRyYW5zaXRpb25EZWxheXMsIHRyYW5zaXRpb25EdXJhdGlvbnMpO1xuICBjb25zdCBhbmltYXRpb25EZWxheXMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7QU5JTUFUSU9OfURlbGF5YCk7XG4gIGNvbnN0IGFuaW1hdGlvbkR1cmF0aW9ucyA9IGdldFN0eWxlUHJvcGVydGllcyhgJHtBTklNQVRJT059RHVyYXRpb25gKTtcbiAgY29uc3QgYW5pbWF0aW9uVGltZW91dCA9IGdldFRpbWVvdXQoYW5pbWF0aW9uRGVsYXlzLCBhbmltYXRpb25EdXJhdGlvbnMpO1xuICBsZXQgdHlwZSA9IG51bGw7XG4gIGxldCB0aW1lb3V0ID0gMDtcbiAgbGV0IHByb3BDb3VudCA9IDA7XG4gIGlmIChleHBlY3RlZFR5cGUgPT09IFRSQU5TSVRJT04pIHtcbiAgICBpZiAodHJhbnNpdGlvblRpbWVvdXQgPiAwKSB7XG4gICAgICB0eXBlID0gVFJBTlNJVElPTjtcbiAgICAgIHRpbWVvdXQgPSB0cmFuc2l0aW9uVGltZW91dDtcbiAgICAgIHByb3BDb3VudCA9IHRyYW5zaXRpb25EdXJhdGlvbnMubGVuZ3RoO1xuICAgIH1cbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IEFOSU1BVElPTikge1xuICAgIGlmIChhbmltYXRpb25UaW1lb3V0ID4gMCkge1xuICAgICAgdHlwZSA9IEFOSU1BVElPTjtcbiAgICAgIHRpbWVvdXQgPSBhbmltYXRpb25UaW1lb3V0O1xuICAgICAgcHJvcENvdW50ID0gYW5pbWF0aW9uRHVyYXRpb25zLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGltZW91dCA9IE1hdGgubWF4KHRyYW5zaXRpb25UaW1lb3V0LCBhbmltYXRpb25UaW1lb3V0KTtcbiAgICB0eXBlID0gdGltZW91dCA+IDAgPyB0cmFuc2l0aW9uVGltZW91dCA+IGFuaW1hdGlvblRpbWVvdXQgPyBUUkFOU0lUSU9OIDogQU5JTUFUSU9OIDogbnVsbDtcbiAgICBwcm9wQ291bnQgPSB0eXBlID8gdHlwZSA9PT0gVFJBTlNJVElPTiA/IHRyYW5zaXRpb25EdXJhdGlvbnMubGVuZ3RoIDogYW5pbWF0aW9uRHVyYXRpb25zLmxlbmd0aCA6IDA7XG4gIH1cbiAgY29uc3QgaGFzVHJhbnNmb3JtID0gdHlwZSA9PT0gVFJBTlNJVElPTiAmJiAvXFxiKHRyYW5zZm9ybXxhbGwpKCx8JCkvLnRlc3QoXG4gICAgZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059UHJvcGVydHlgKS50b1N0cmluZygpXG4gICk7XG4gIHJldHVybiB7XG4gICAgdHlwZSxcbiAgICB0aW1lb3V0LFxuICAgIHByb3BDb3VudCxcbiAgICBoYXNUcmFuc2Zvcm1cbiAgfTtcbn1cbmZ1bmN0aW9uIGdldFRpbWVvdXQoZGVsYXlzLCBkdXJhdGlvbnMpIHtcbiAgd2hpbGUgKGRlbGF5cy5sZW5ndGggPCBkdXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgZGVsYXlzID0gZGVsYXlzLmNvbmNhdChkZWxheXMpO1xuICB9XG4gIHJldHVybiBNYXRoLm1heCguLi5kdXJhdGlvbnMubWFwKChkLCBpKSA9PiB0b01zKGQpICsgdG9NcyhkZWxheXNbaV0pKSk7XG59XG5mdW5jdGlvbiB0b01zKHMpIHtcbiAgaWYgKHMgPT09IFwiYXV0b1wiKVxuICAgIHJldHVybiAwO1xuICByZXR1cm4gTnVtYmVyKHMuc2xpY2UoMCwgLTEpLnJlcGxhY2UoXCIsXCIsIFwiLlwiKSkgKiAxZTM7XG59XG5mdW5jdGlvbiBmb3JjZVJlZmxvdygpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0O1xufVxuXG5mdW5jdGlvbiBwYXRjaENsYXNzKGVsLCB2YWx1ZSwgaXNTVkcpIHtcbiAgY29uc3QgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbFt2dGNLZXldO1xuICBpZiAodHJhbnNpdGlvbkNsYXNzZXMpIHtcbiAgICB2YWx1ZSA9ICh2YWx1ZSA/IFt2YWx1ZSwgLi4udHJhbnNpdGlvbkNsYXNzZXNdIDogWy4uLnRyYW5zaXRpb25DbGFzc2VzXSkuam9pbihcIiBcIik7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJjbGFzc1wiKTtcbiAgfSBlbHNlIGlmIChpc1NWRykge1xuICAgIGVsLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBlbC5jbGFzc05hbWUgPSB2YWx1ZTtcbiAgfVxufVxuXG5jb25zdCB2U2hvd09sZEtleSA9IFN5bWJvbChcIl92b2RcIik7XG5jb25zdCB2U2hvdyA9IHtcbiAgYmVmb3JlTW91bnQoZWwsIHsgdmFsdWUgfSwgeyB0cmFuc2l0aW9uIH0pIHtcbiAgICBlbFt2U2hvd09sZEtleV0gPSBlbC5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiA/IFwiXCIgOiBlbC5zdHlsZS5kaXNwbGF5O1xuICAgIGlmICh0cmFuc2l0aW9uICYmIHZhbHVlKSB7XG4gICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RGlzcGxheShlbCwgdmFsdWUpO1xuICAgIH1cbiAgfSxcbiAgbW91bnRlZChlbCwgeyB2YWx1ZSB9LCB7IHRyYW5zaXRpb24gfSkge1xuICAgIGlmICh0cmFuc2l0aW9uICYmIHZhbHVlKSB7XG4gICAgICB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICB9XG4gIH0sXG4gIHVwZGF0ZWQoZWwsIHsgdmFsdWUsIG9sZFZhbHVlIH0sIHsgdHJhbnNpdGlvbiB9KSB7XG4gICAgaWYgKCF2YWx1ZSA9PT0gIW9sZFZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdHJhbnNpdGlvbi5iZWZvcmVFbnRlcihlbCk7XG4gICAgICAgIHNldERpc3BsYXkoZWwsIHRydWUpO1xuICAgICAgICB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zaXRpb24ubGVhdmUoZWwsICgpID0+IHtcbiAgICAgICAgICBzZXREaXNwbGF5KGVsLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXREaXNwbGF5KGVsLCB2YWx1ZSk7XG4gICAgfVxuICB9LFxuICBiZWZvcmVVbm1vdW50KGVsLCB7IHZhbHVlIH0pIHtcbiAgICBzZXREaXNwbGF5KGVsLCB2YWx1ZSk7XG4gIH1cbn07XG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICB2U2hvdy5uYW1lID0gXCJzaG93XCI7XG59XG5mdW5jdGlvbiBzZXREaXNwbGF5KGVsLCB2YWx1ZSkge1xuICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBlbFt2U2hvd09sZEtleV0gOiBcIm5vbmVcIjtcbn1cbmZ1bmN0aW9uIGluaXRWU2hvd0ZvclNTUigpIHtcbiAgdlNob3cuZ2V0U1NSUHJvcHMgPSAoeyB2YWx1ZSB9KSA9PiB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgc3R5bGU6IHsgZGlzcGxheTogXCJub25lXCIgfSB9O1xuICAgIH1cbiAgfTtcbn1cblxuY29uc3QgQ1NTX1ZBUl9URVhUID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBcIkNTU19WQVJfVEVYVFwiIDogXCJcIik7XG5mdW5jdGlvbiB1c2VDc3NWYXJzKGdldHRlcikge1xuICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoIWluc3RhbmNlKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGB1c2VDc3NWYXJzIGlzIGNhbGxlZCB3aXRob3V0IGN1cnJlbnQgYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZS5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdXBkYXRlVGVsZXBvcnRzID0gaW5zdGFuY2UudXQgPSAodmFycyA9IGdldHRlcihpbnN0YW5jZS5wcm94eSkpID0+IHtcbiAgICBBcnJheS5mcm9tKFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtdi1vd25lcj1cIiR7aW5zdGFuY2UudWlkfVwiXWApXG4gICAgKS5mb3JFYWNoKChub2RlKSA9PiBzZXRWYXJzT25Ob2RlKG5vZGUsIHZhcnMpKTtcbiAgfTtcbiAgY29uc3Qgc2V0VmFycyA9ICgpID0+IHtcbiAgICBjb25zdCB2YXJzID0gZ2V0dGVyKGluc3RhbmNlLnByb3h5KTtcbiAgICBzZXRWYXJzT25WTm9kZShpbnN0YW5jZS5zdWJUcmVlLCB2YXJzKTtcbiAgICB1cGRhdGVUZWxlcG9ydHModmFycyk7XG4gIH07XG4gIHdhdGNoUG9zdEVmZmVjdChzZXRWYXJzKTtcbiAgb25Nb3VudGVkKCgpID0+IHtcbiAgICBjb25zdCBvYiA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHNldFZhcnMpO1xuICAgIG9iLm9ic2VydmUoaW5zdGFuY2Uuc3ViVHJlZS5lbC5wYXJlbnROb2RlLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICBvblVubW91bnRlZCgoKSA9PiBvYi5kaXNjb25uZWN0KCkpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHNldFZhcnNPblZOb2RlKHZub2RlLCB2YXJzKSB7XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICBjb25zdCBzdXNwZW5zZSA9IHZub2RlLnN1c3BlbnNlO1xuICAgIHZub2RlID0gc3VzcGVuc2UuYWN0aXZlQnJhbmNoO1xuICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nQnJhbmNoICYmICFzdXNwZW5zZS5pc0h5ZHJhdGluZykge1xuICAgICAgc3VzcGVuc2UuZWZmZWN0cy5wdXNoKCgpID0+IHtcbiAgICAgICAgc2V0VmFyc09uVk5vZGUoc3VzcGVuc2UuYWN0aXZlQnJhbmNoLCB2YXJzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICB3aGlsZSAodm5vZGUuY29tcG9uZW50KSB7XG4gICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnQuc3ViVHJlZTtcbiAgfVxuICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMSAmJiB2bm9kZS5lbCkge1xuICAgIHNldFZhcnNPbk5vZGUodm5vZGUuZWwsIHZhcnMpO1xuICB9IGVsc2UgaWYgKHZub2RlLnR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoYykgPT4gc2V0VmFyc09uVk5vZGUoYywgdmFycykpO1xuICB9IGVsc2UgaWYgKHZub2RlLnR5cGUgPT09IFN0YXRpYykge1xuICAgIGxldCB7IGVsLCBhbmNob3IgfSA9IHZub2RlO1xuICAgIHdoaWxlIChlbCkge1xuICAgICAgc2V0VmFyc09uTm9kZShlbCwgdmFycyk7XG4gICAgICBpZiAoZWwgPT09IGFuY2hvcilcbiAgICAgICAgYnJlYWs7XG4gICAgICBlbCA9IGVsLm5leHRTaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0VmFyc09uTm9kZShlbCwgdmFycykge1xuICBpZiAoZWwubm9kZVR5cGUgPT09IDEpIHtcbiAgICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICAgIGxldCBjc3NUZXh0ID0gXCJcIjtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzKSB7XG4gICAgICBzdHlsZS5zZXRQcm9wZXJ0eShgLS0ke2tleX1gLCB2YXJzW2tleV0pO1xuICAgICAgY3NzVGV4dCArPSBgLS0ke2tleX06ICR7dmFyc1trZXldfTtgO1xuICAgIH1cbiAgICBzdHlsZVtDU1NfVkFSX1RFWFRdID0gY3NzVGV4dDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRjaFN0eWxlKGVsLCBwcmV2LCBuZXh0KSB7XG4gIGNvbnN0IHN0eWxlID0gZWwuc3R5bGU7XG4gIGNvbnN0IGN1cnJlbnREaXNwbGF5ID0gc3R5bGUuZGlzcGxheTtcbiAgY29uc3QgaXNDc3NTdHJpbmcgPSBpc1N0cmluZyhuZXh0KTtcbiAgaWYgKG5leHQgJiYgIWlzQ3NzU3RyaW5nKSB7XG4gICAgaWYgKHByZXYgJiYgIWlzU3RyaW5nKHByZXYpKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcmV2KSB7XG4gICAgICAgIGlmIChuZXh0W2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgIHNldFN0eWxlKHN0eWxlLCBrZXksIFwiXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIG5leHQpIHtcbiAgICAgIHNldFN0eWxlKHN0eWxlLCBrZXksIG5leHRba2V5XSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc0Nzc1N0cmluZykge1xuICAgICAgaWYgKHByZXYgIT09IG5leHQpIHtcbiAgICAgICAgY29uc3QgY3NzVmFyVGV4dCA9IHN0eWxlW0NTU19WQVJfVEVYVF07XG4gICAgICAgIGlmIChjc3NWYXJUZXh0KSB7XG4gICAgICAgICAgbmV4dCArPSBcIjtcIiArIGNzc1ZhclRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3R5bGUuY3NzVGV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcmV2KSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICB9XG4gIH1cbiAgaWYgKHZTaG93T2xkS2V5IGluIGVsKSB7XG4gICAgc3R5bGUuZGlzcGxheSA9IGN1cnJlbnREaXNwbGF5O1xuICB9XG59XG5jb25zdCBzZW1pY29sb25SRSA9IC9bXlxcXFxdO1xccyokLztcbmNvbnN0IGltcG9ydGFudFJFID0gL1xccyohaW1wb3J0YW50JC87XG5mdW5jdGlvbiBzZXRTdHlsZShzdHlsZSwgbmFtZSwgdmFsKSB7XG4gIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICB2YWwuZm9yRWFjaCgodikgPT4gc2V0U3R5bGUoc3R5bGUsIG5hbWUsIHYpKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodmFsID09IG51bGwpXG4gICAgICB2YWwgPSBcIlwiO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBpZiAoc2VtaWNvbG9uUkUudGVzdCh2YWwpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYFVuZXhwZWN0ZWQgc2VtaWNvbG9uIGF0IHRoZSBlbmQgb2YgJyR7bmFtZX0nIHN0eWxlIHZhbHVlOiAnJHt2YWx9J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICBzdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmVmaXhlZCA9IGF1dG9QcmVmaXgoc3R5bGUsIG5hbWUpO1xuICAgICAgaWYgKGltcG9ydGFudFJFLnRlc3QodmFsKSkge1xuICAgICAgICBzdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgICBoeXBoZW5hdGUocHJlZml4ZWQpLFxuICAgICAgICAgIHZhbC5yZXBsYWNlKGltcG9ydGFudFJFLCBcIlwiKSxcbiAgICAgICAgICBcImltcG9ydGFudFwiXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHlsZVtwcmVmaXhlZF0gPSB2YWw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5jb25zdCBwcmVmaXhlcyA9IFtcIldlYmtpdFwiLCBcIk1velwiLCBcIm1zXCJdO1xuY29uc3QgcHJlZml4Q2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGF1dG9QcmVmaXgoc3R5bGUsIHJhd05hbWUpIHtcbiAgY29uc3QgY2FjaGVkID0gcHJlZml4Q2FjaGVbcmF3TmFtZV07XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGxldCBuYW1lID0gY2FtZWxpemUocmF3TmFtZSk7XG4gIGlmIChuYW1lICE9PSBcImZpbHRlclwiICYmIG5hbWUgaW4gc3R5bGUpIHtcbiAgICByZXR1cm4gcHJlZml4Q2FjaGVbcmF3TmFtZV0gPSBuYW1lO1xuICB9XG4gIG5hbWUgPSBjYXBpdGFsaXplKG5hbWUpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcHJlZml4ZWQgPSBwcmVmaXhlc1tpXSArIG5hbWU7XG4gICAgaWYgKHByZWZpeGVkIGluIHN0eWxlKSB7XG4gICAgICByZXR1cm4gcHJlZml4Q2FjaGVbcmF3TmFtZV0gPSBwcmVmaXhlZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJhd05hbWU7XG59XG5cbmNvbnN0IHhsaW5rTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIjtcbmZ1bmN0aW9uIHBhdGNoQXR0cihlbCwga2V5LCB2YWx1ZSwgaXNTVkcsIGluc3RhbmNlKSB7XG4gIGlmIChpc1NWRyAmJiBrZXkuc3RhcnRzV2l0aChcInhsaW5rOlwiKSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGVOUyh4bGlua05TLCBrZXkuc2xpY2UoNiwga2V5Lmxlbmd0aCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGVOUyh4bGlua05TLCBrZXksIHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaXNCb29sZWFuID0gaXNTcGVjaWFsQm9vbGVhbkF0dHIoa2V5KTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBpc0Jvb2xlYW4gJiYgIWluY2x1ZGVCb29sZWFuQXR0cih2YWx1ZSkpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCBpc0Jvb2xlYW4gPyBcIlwiIDogdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRjaERPTVByb3AoZWwsIGtleSwgdmFsdWUsIHByZXZDaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdW5tb3VudENoaWxkcmVuKSB7XG4gIGlmIChrZXkgPT09IFwiaW5uZXJIVE1MXCIgfHwga2V5ID09PSBcInRleHRDb250ZW50XCIpIHtcbiAgICBpZiAocHJldkNoaWxkcmVuKSB7XG4gICAgICB1bm1vdW50Q2hpbGRyZW4ocHJldkNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlKTtcbiAgICB9XG4gICAgZWxba2V5XSA9IHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gIGlmIChrZXkgPT09IFwidmFsdWVcIiAmJiB0YWcgIT09IFwiUFJPR1JFU1NcIiAmJiAvLyBjdXN0b20gZWxlbWVudHMgbWF5IHVzZSBfdmFsdWUgaW50ZXJuYWxseVxuICAhdGFnLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgIGVsLl92YWx1ZSA9IHZhbHVlO1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFnID09PSBcIk9QVElPTlwiID8gZWwuZ2V0QXR0cmlidXRlKFwidmFsdWVcIikgOiBlbC52YWx1ZTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWU7XG4gICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgZWwudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IG5lZWRSZW1vdmUgPSBmYWxzZTtcbiAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGVsW2tleV07XG4gICAgaWYgKHR5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICB2YWx1ZSA9IGluY2x1ZGVCb29sZWFuQXR0cih2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsICYmIHR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgIG5lZWRSZW1vdmUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgdmFsdWUgPSAwO1xuICAgICAgbmVlZFJlbW92ZSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgZWxba2V5XSA9IHZhbHVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIW5lZWRSZW1vdmUpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBGYWlsZWQgc2V0dGluZyBwcm9wIFwiJHtrZXl9XCIgb24gPCR7dGFnLnRvTG93ZXJDYXNlKCl9PjogdmFsdWUgJHt2YWx1ZX0gaXMgaW52YWxpZC5gLFxuICAgICAgICBlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBuZWVkUmVtb3ZlICYmIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xufVxuXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIoZWwsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xufVxuY29uc3QgdmVpS2V5ID0gU3ltYm9sKFwiX3ZlaVwiKTtcbmZ1bmN0aW9uIHBhdGNoRXZlbnQoZWwsIHJhd05hbWUsIHByZXZWYWx1ZSwgbmV4dFZhbHVlLCBpbnN0YW5jZSA9IG51bGwpIHtcbiAgY29uc3QgaW52b2tlcnMgPSBlbFt2ZWlLZXldIHx8IChlbFt2ZWlLZXldID0ge30pO1xuICBjb25zdCBleGlzdGluZ0ludm9rZXIgPSBpbnZva2Vyc1tyYXdOYW1lXTtcbiAgaWYgKG5leHRWYWx1ZSAmJiBleGlzdGluZ0ludm9rZXIpIHtcbiAgICBleGlzdGluZ0ludm9rZXIudmFsdWUgPSBuZXh0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW25hbWUsIG9wdGlvbnNdID0gcGFyc2VOYW1lKHJhd05hbWUpO1xuICAgIGlmIChuZXh0VmFsdWUpIHtcbiAgICAgIGNvbnN0IGludm9rZXIgPSBpbnZva2Vyc1tyYXdOYW1lXSA9IGNyZWF0ZUludm9rZXIobmV4dFZhbHVlLCBpbnN0YW5jZSk7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBuYW1lLCBpbnZva2VyLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGV4aXN0aW5nSW52b2tlcikge1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihlbCwgbmFtZSwgZXhpc3RpbmdJbnZva2VyLCBvcHRpb25zKTtcbiAgICAgIGludm9rZXJzW3Jhd05hbWVdID0gdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuY29uc3Qgb3B0aW9uc01vZGlmaWVyUkUgPSAvKD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87XG5mdW5jdGlvbiBwYXJzZU5hbWUobmFtZSkge1xuICBsZXQgb3B0aW9ucztcbiAgaWYgKG9wdGlvbnNNb2RpZmllclJFLnRlc3QobmFtZSkpIHtcbiAgICBvcHRpb25zID0ge307XG4gICAgbGV0IG07XG4gICAgd2hpbGUgKG0gPSBuYW1lLm1hdGNoKG9wdGlvbnNNb2RpZmllclJFKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sZW5ndGggLSBtWzBdLmxlbmd0aCk7XG4gICAgICBvcHRpb25zW21bMF0udG9Mb3dlckNhc2UoKV0gPSB0cnVlO1xuICAgIH1cbiAgfVxuICBjb25zdCBldmVudCA9IG5hbWVbMl0gPT09IFwiOlwiID8gbmFtZS5zbGljZSgzKSA6IGh5cGhlbmF0ZShuYW1lLnNsaWNlKDIpKTtcbiAgcmV0dXJuIFtldmVudCwgb3B0aW9uc107XG59XG5sZXQgY2FjaGVkTm93ID0gMDtcbmNvbnN0IHAgPSAvKiBAX19QVVJFX18gKi8gUHJvbWlzZS5yZXNvbHZlKCk7XG5jb25zdCBnZXROb3cgPSAoKSA9PiBjYWNoZWROb3cgfHwgKHAudGhlbigoKSA9PiBjYWNoZWROb3cgPSAwKSwgY2FjaGVkTm93ID0gRGF0ZS5ub3coKSk7XG5mdW5jdGlvbiBjcmVhdGVJbnZva2VyKGluaXRpYWxWYWx1ZSwgaW5zdGFuY2UpIHtcbiAgY29uc3QgaW52b2tlciA9IChlKSA9PiB7XG4gICAgaWYgKCFlLl92dHMpIHtcbiAgICAgIGUuX3Z0cyA9IERhdGUubm93KCk7XG4gICAgfSBlbHNlIGlmIChlLl92dHMgPD0gaW52b2tlci5hdHRhY2hlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgIHBhdGNoU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKGUsIGludm9rZXIudmFsdWUpLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA1LFxuICAgICAgW2VdXG4gICAgKTtcbiAgfTtcbiAgaW52b2tlci52YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgaW52b2tlci5hdHRhY2hlZCA9IGdldE5vdygpO1xuICByZXR1cm4gaW52b2tlcjtcbn1cbmZ1bmN0aW9uIHBhdGNoU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKGUsIHZhbHVlKSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IG9yaWdpbmFsU3RvcCA9IGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gKCkgPT4ge1xuICAgICAgb3JpZ2luYWxTdG9wLmNhbGwoZSk7XG4gICAgICBlLl9zdG9wcGVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGZuKSA9PiAoZTIpID0+ICFlMi5fc3RvcHBlZCAmJiBmbiAmJiBmbihlMikpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5jb25zdCBpc05hdGl2ZU9uID0gKGtleSkgPT4ga2V5LmNoYXJDb2RlQXQoMCkgPT09IDExMSAmJiBrZXkuY2hhckNvZGVBdCgxKSA9PT0gMTEwICYmIC8vIGxvd2VyY2FzZSBsZXR0ZXJcbmtleS5jaGFyQ29kZUF0KDIpID4gOTYgJiYga2V5LmNoYXJDb2RlQXQoMikgPCAxMjM7XG5jb25zdCBwYXRjaFByb3AgPSAoZWwsIGtleSwgcHJldlZhbHVlLCBuZXh0VmFsdWUsIG5hbWVzcGFjZSwgcHJldkNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB1bm1vdW50Q2hpbGRyZW4pID0+IHtcbiAgY29uc3QgaXNTVkcgPSBuYW1lc3BhY2UgPT09IFwic3ZnXCI7XG4gIGlmIChrZXkgPT09IFwiY2xhc3NcIikge1xuICAgIHBhdGNoQ2xhc3MoZWwsIG5leHRWYWx1ZSwgaXNTVkcpO1xuICB9IGVsc2UgaWYgKGtleSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgcGF0Y2hTdHlsZShlbCwgcHJldlZhbHVlLCBuZXh0VmFsdWUpO1xuICB9IGVsc2UgaWYgKGlzT24oa2V5KSkge1xuICAgIGlmICghaXNNb2RlbExpc3RlbmVyKGtleSkpIHtcbiAgICAgIHBhdGNoRXZlbnQoZWwsIGtleSwgcHJldlZhbHVlLCBuZXh0VmFsdWUsIHBhcmVudENvbXBvbmVudCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGtleVswXSA9PT0gXCIuXCIgPyAoa2V5ID0ga2V5LnNsaWNlKDEpLCB0cnVlKSA6IGtleVswXSA9PT0gXCJeXCIgPyAoa2V5ID0ga2V5LnNsaWNlKDEpLCBmYWxzZSkgOiBzaG91bGRTZXRBc1Byb3AoZWwsIGtleSwgbmV4dFZhbHVlLCBpc1NWRykpIHtcbiAgICBwYXRjaERPTVByb3AoXG4gICAgICBlbCxcbiAgICAgIGtleSxcbiAgICAgIG5leHRWYWx1ZSxcbiAgICAgIHByZXZDaGlsZHJlbixcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgdW5tb3VudENoaWxkcmVuXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoa2V5ID09PSBcInRydWUtdmFsdWVcIikge1xuICAgICAgZWwuX3RydWVWYWx1ZSA9IG5leHRWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJmYWxzZS12YWx1ZVwiKSB7XG4gICAgICBlbC5fZmFsc2VWYWx1ZSA9IG5leHRWYWx1ZTtcbiAgICB9XG4gICAgcGF0Y2hBdHRyKGVsLCBrZXksIG5leHRWYWx1ZSwgaXNTVkcpO1xuICB9XG59O1xuZnVuY3Rpb24gc2hvdWxkU2V0QXNQcm9wKGVsLCBrZXksIHZhbHVlLCBpc1NWRykge1xuICBpZiAoaXNTVkcpIHtcbiAgICBpZiAoa2V5ID09PSBcImlubmVySFRNTFwiIHx8IGtleSA9PT0gXCJ0ZXh0Q29udGVudFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGtleSBpbiBlbCAmJiBpc05hdGl2ZU9uKGtleSkgJiYgaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJzcGVsbGNoZWNrXCIgfHwga2V5ID09PSBcImRyYWdnYWJsZVwiIHx8IGtleSA9PT0gXCJ0cmFuc2xhdGVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcImZvcm1cIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcImxpc3RcIiAmJiBlbC50YWdOYW1lID09PSBcIklOUFVUXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJ0eXBlXCIgJiYgZWwudGFnTmFtZSA9PT0gXCJURVhUQVJFQVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwid2lkdGhcIiB8fCBrZXkgPT09IFwiaGVpZ2h0XCIpIHtcbiAgICBjb25zdCB0YWcgPSBlbC50YWdOYW1lO1xuICAgIGlmICh0YWcgPT09IFwiSU1HXCIgfHwgdGFnID09PSBcIlZJREVPXCIgfHwgdGFnID09PSBcIkNBTlZBU1wiIHx8IHRhZyA9PT0gXCJTT1VSQ0VcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoaXNOYXRpdmVPbihrZXkpICYmIGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4ga2V5IGluIGVsO1xufVxuXG4vKiEgI19fTk9fU0lERV9FRkZFQ1RTX18gKi9cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBkZWZpbmVDdXN0b21FbGVtZW50KG9wdGlvbnMsIGh5ZHJhdGUyKSB7XG4gIGNvbnN0IENvbXAgPSBkZWZpbmVDb21wb25lbnQob3B0aW9ucyk7XG4gIGNsYXNzIFZ1ZUN1c3RvbUVsZW1lbnQgZXh0ZW5kcyBWdWVFbGVtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihpbml0aWFsUHJvcHMpIHtcbiAgICAgIHN1cGVyKENvbXAsIGluaXRpYWxQcm9wcywgaHlkcmF0ZTIpO1xuICAgIH1cbiAgfVxuICBWdWVDdXN0b21FbGVtZW50LmRlZiA9IENvbXA7XG4gIHJldHVybiBWdWVDdXN0b21FbGVtZW50O1xufVxuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG5jb25zdCBkZWZpbmVTU1JDdXN0b21FbGVtZW50ID0gLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi8gKG9wdGlvbnMpID0+IHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBkZWZpbmVDdXN0b21FbGVtZW50KG9wdGlvbnMsIGh5ZHJhdGUpO1xufTtcbmNvbnN0IEJhc2VDbGFzcyA9IHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiA/IEhUTUxFbGVtZW50IDogY2xhc3Mge1xufTtcbmNsYXNzIFZ1ZUVsZW1lbnQgZXh0ZW5kcyBCYXNlQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcihfZGVmLCBfcHJvcHMgPSB7fSwgaHlkcmF0ZTIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2RlZiA9IF9kZWY7XG4gICAgdGhpcy5fcHJvcHMgPSBfcHJvcHM7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgIHRoaXMuX2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3Jlc29sdmVkID0gZmFsc2U7XG4gICAgdGhpcy5fbnVtYmVyUHJvcHMgPSBudWxsO1xuICAgIHRoaXMuX29iID0gbnVsbDtcbiAgICBpZiAodGhpcy5zaGFkb3dSb290ICYmIGh5ZHJhdGUyKSB7XG4gICAgICBoeWRyYXRlMih0aGlzLl9jcmVhdGVWTm9kZSgpLCB0aGlzLnNoYWRvd1Jvb3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0aGlzLnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgQ3VzdG9tIGVsZW1lbnQgaGFzIHByZS1yZW5kZXJlZCBkZWNsYXJhdGl2ZSBzaGFkb3cgcm9vdCBidXQgaXMgbm90IGRlZmluZWQgYXMgaHlkcmF0YWJsZS4gVXNlIFxcYGRlZmluZVNTUkN1c3RvbUVsZW1lbnRcXGAuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiBcIm9wZW5cIiB9KTtcbiAgICAgIGlmICghdGhpcy5fZGVmLl9fYXN5bmNMb2FkZXIpIHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZVByb3BzKHRoaXMuX2RlZik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgaWYgKHRoaXMuX3Jlc29sdmVkKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZURlZigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5fb2IpIHtcbiAgICAgIHRoaXMuX29iLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuX29iID0gbnVsbDtcbiAgICB9XG4gICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25uZWN0ZWQpIHtcbiAgICAgICAgcmVuZGVyKG51bGwsIHRoaXMuc2hhZG93Um9vdCk7XG4gICAgICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogcmVzb2x2ZSBpbm5lciBjb21wb25lbnQgZGVmaW5pdGlvbiAoaGFuZGxlIHBvc3NpYmxlIGFzeW5jIGNvbXBvbmVudClcbiAgICovXG4gIF9yZXNvbHZlRGVmKCkge1xuICAgIHRoaXMuX3Jlc29sdmVkID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fc2V0QXR0cih0aGlzLmF0dHJpYnV0ZXNbaV0ubmFtZSk7XG4gICAgfVxuICAgIHRoaXMuX29iID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgZm9yIChjb25zdCBtIG9mIG11dGF0aW9ucykge1xuICAgICAgICB0aGlzLl9zZXRBdHRyKG0uYXR0cmlidXRlTmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fb2Iub2JzZXJ2ZSh0aGlzLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG4gICAgY29uc3QgcmVzb2x2ZSA9IChkZWYsIGlzQXN5bmMgPSBmYWxzZSkgPT4ge1xuICAgICAgY29uc3QgeyBwcm9wcywgc3R5bGVzIH0gPSBkZWY7XG4gICAgICBsZXQgbnVtYmVyUHJvcHM7XG4gICAgICBpZiAocHJvcHMgJiYgIWlzQXJyYXkocHJvcHMpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgICAgICAgY29uc3Qgb3B0ID0gcHJvcHNba2V5XTtcbiAgICAgICAgICBpZiAob3B0ID09PSBOdW1iZXIgfHwgb3B0ICYmIG9wdC50eXBlID09PSBOdW1iZXIpIHtcbiAgICAgICAgICAgIGlmIChrZXkgaW4gdGhpcy5fcHJvcHMpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcHJvcHNba2V5XSA9IHRvTnVtYmVyKHRoaXMuX3Byb3BzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKG51bWJlclByb3BzIHx8IChudW1iZXJQcm9wcyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpKSlbY2FtZWxpemUkMShrZXkpXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9udW1iZXJQcm9wcyA9IG51bWJlclByb3BzO1xuICAgICAgaWYgKGlzQXN5bmMpIHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZVByb3BzKGRlZik7XG4gICAgICB9XG4gICAgICB0aGlzLl9hcHBseVN0eWxlcyhzdHlsZXMpO1xuICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfTtcbiAgICBjb25zdCBhc3luY0RlZiA9IHRoaXMuX2RlZi5fX2FzeW5jTG9hZGVyO1xuICAgIGlmIChhc3luY0RlZikge1xuICAgICAgYXN5bmNEZWYoKS50aGVuKChkZWYpID0+IHJlc29sdmUoZGVmLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUodGhpcy5fZGVmKTtcbiAgICB9XG4gIH1cbiAgX3Jlc29sdmVQcm9wcyhkZWYpIHtcbiAgICBjb25zdCB7IHByb3BzIH0gPSBkZWY7XG4gICAgY29uc3QgZGVjbGFyZWRQcm9wS2V5cyA9IGlzQXJyYXkocHJvcHMpID8gcHJvcHMgOiBPYmplY3Qua2V5cyhwcm9wcyB8fCB7fSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcykpIHtcbiAgICAgIGlmIChrZXlbMF0gIT09IFwiX1wiICYmIGRlY2xhcmVkUHJvcEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICB0aGlzLl9zZXRQcm9wKGtleSwgdGhpc1trZXldLCB0cnVlLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGRlY2xhcmVkUHJvcEtleXMubWFwKGNhbWVsaXplJDEpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UHJvcChrZXkpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQodmFsKSB7XG4gICAgICAgICAgdGhpcy5fc2V0UHJvcChrZXksIHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBfc2V0QXR0cihrZXkpIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZShrZXkpO1xuICAgIGNvbnN0IGNhbWVsS2V5ID0gY2FtZWxpemUkMShrZXkpO1xuICAgIGlmICh0aGlzLl9udW1iZXJQcm9wcyAmJiB0aGlzLl9udW1iZXJQcm9wc1tjYW1lbEtleV0pIHtcbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRQcm9wKGNhbWVsS2V5LCB2YWx1ZSwgZmFsc2UpO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9nZXRQcm9wKGtleSkge1xuICAgIHJldHVybiB0aGlzLl9wcm9wc1trZXldO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9zZXRQcm9wKGtleSwgdmFsLCBzaG91bGRSZWZsZWN0ID0gdHJ1ZSwgc2hvdWxkVXBkYXRlID0gdHJ1ZSkge1xuICAgIGlmICh2YWwgIT09IHRoaXMuX3Byb3BzW2tleV0pIHtcbiAgICAgIHRoaXMuX3Byb3BzW2tleV0gPSB2YWw7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlICYmIHRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJlZmxlY3QpIHtcbiAgICAgICAgaWYgKHZhbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGh5cGhlbmF0ZShrZXkpLCBcIlwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShoeXBoZW5hdGUoa2V5KSwgdmFsICsgXCJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoIXZhbCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKGh5cGhlbmF0ZShrZXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBfdXBkYXRlKCkge1xuICAgIHJlbmRlcih0aGlzLl9jcmVhdGVWTm9kZSgpLCB0aGlzLnNoYWRvd1Jvb3QpO1xuICB9XG4gIF9jcmVhdGVWTm9kZSgpIHtcbiAgICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKHRoaXMuX2RlZiwgZXh0ZW5kKHt9LCB0aGlzLl9wcm9wcykpO1xuICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgIHZub2RlLmNlID0gKGluc3RhbmNlKSA9PiB7XG4gICAgICAgIHRoaXMuX2luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIGluc3RhbmNlLmlzQ0UgPSB0cnVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGluc3RhbmNlLmNlUmVsb2FkID0gKG5ld1N0eWxlcykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlcykge1xuICAgICAgICAgICAgICB0aGlzLl9zdHlsZXMuZm9yRWFjaCgocykgPT4gdGhpcy5zaGFkb3dSb290LnJlbW92ZUNoaWxkKHMpKTtcbiAgICAgICAgICAgICAgdGhpcy5fc3R5bGVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hcHBseVN0eWxlcyhuZXdTdHlsZXMpO1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXNwYXRjaCA9IChldmVudCwgYXJncykgPT4ge1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudChldmVudCwge1xuICAgICAgICAgICAgICBkZXRhaWw6IGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdGFuY2UuZW1pdCA9IChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAgICAgIGRpc3BhdGNoKGV2ZW50LCBhcmdzKTtcbiAgICAgICAgICBpZiAoaHlwaGVuYXRlKGV2ZW50KSAhPT0gZXZlbnQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKGh5cGhlbmF0ZShldmVudCksIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXM7XG4gICAgICAgIHdoaWxlIChwYXJlbnQgPSBwYXJlbnQgJiYgKHBhcmVudC5wYXJlbnROb2RlIHx8IHBhcmVudC5ob3N0KSkge1xuICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBWdWVFbGVtZW50KSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5wYXJlbnQgPSBwYXJlbnQuX2luc3RhbmNlO1xuICAgICAgICAgICAgaW5zdGFuY2UucHJvdmlkZXMgPSBwYXJlbnQuX2luc3RhbmNlLnByb3ZpZGVzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbiAgX2FwcGx5U3R5bGVzKHN0eWxlcykge1xuICAgIGlmIChzdHlsZXMpIHtcbiAgICAgIHN0eWxlcy5mb3JFYWNoKChjc3MpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICAgICAgcy50ZXh0Q29udGVudCA9IGNzcztcbiAgICAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKHMpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICh0aGlzLl9zdHlsZXMgfHwgKHRoaXMuX3N0eWxlcyA9IFtdKSkucHVzaChzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVzZUNzc01vZHVsZShuYW1lID0gXCIkc3R5bGVcIikge1xuICB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYHVzZUNzc01vZHVsZSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgc2V0dXAoKWApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlcyA9IGluc3RhbmNlLnR5cGUuX19jc3NNb2R1bGVzO1xuICAgIGlmICghbW9kdWxlcykge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZXMgaW5qZWN0ZWQuYCk7XG4gICAgICByZXR1cm4gRU1QVFlfT0JKO1xuICAgIH1cbiAgICBjb25zdCBtb2QgPSBtb2R1bGVzW25hbWVdO1xuICAgIGlmICghbW9kKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYEN1cnJlbnQgaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBDU1MgbW9kdWxlIG5hbWVkIFwiJHtuYW1lfVwiLmApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgcmV0dXJuIG1vZDtcbiAgfVxufVxuXG5jb25zdCBwb3NpdGlvbk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgbmV3UG9zaXRpb25NYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IG1vdmVDYktleSA9IFN5bWJvbChcIl9tb3ZlQ2JcIik7XG5jb25zdCBlbnRlckNiS2V5ID0gU3ltYm9sKFwiX2VudGVyQ2JcIik7XG5jb25zdCBUcmFuc2l0aW9uR3JvdXBJbXBsID0ge1xuICBuYW1lOiBcIlRyYW5zaXRpb25Hcm91cFwiLFxuICBwcm9wczogLyogQF9fUFVSRV9fICovIGV4dGVuZCh7fSwgVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycywge1xuICAgIHRhZzogU3RyaW5nLFxuICAgIG1vdmVDbGFzczogU3RyaW5nXG4gIH0pLFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHVzZVRyYW5zaXRpb25TdGF0ZSgpO1xuICAgIGxldCBwcmV2Q2hpbGRyZW47XG4gICAgbGV0IGNoaWxkcmVuO1xuICAgIG9uVXBkYXRlZCgoKSA9PiB7XG4gICAgICBpZiAoIXByZXZDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbW92ZUNsYXNzID0gcHJvcHMubW92ZUNsYXNzIHx8IGAke3Byb3BzLm5hbWUgfHwgXCJ2XCJ9LW1vdmVgO1xuICAgICAgaWYgKCFoYXNDU1NUcmFuc2Zvcm0oXG4gICAgICAgIHByZXZDaGlsZHJlblswXS5lbCxcbiAgICAgICAgaW5zdGFuY2Uudm5vZGUuZWwsXG4gICAgICAgIG1vdmVDbGFzc1xuICAgICAgKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwcmV2Q2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7XG4gICAgICBwcmV2Q2hpbGRyZW4uZm9yRWFjaChyZWNvcmRQb3NpdGlvbik7XG4gICAgICBjb25zdCBtb3ZlZENoaWxkcmVuID0gcHJldkNoaWxkcmVuLmZpbHRlcihhcHBseVRyYW5zbGF0aW9uKTtcbiAgICAgIGZvcmNlUmVmbG93KCk7XG4gICAgICBtb3ZlZENoaWxkcmVuLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBjLmVsO1xuICAgICAgICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7XG4gICAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IFwiXCI7XG4gICAgICAgIGNvbnN0IGNiID0gZWxbbW92ZUNiS2V5XSA9IChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUgJiYgZS50YXJnZXQgIT09IGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZSB8fCAvdHJhbnNmb3JtJC8udGVzdChlLnByb3BlcnR5TmFtZSkpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsIGNiKTtcbiAgICAgICAgICAgIGVsW21vdmVDYktleV0gPSBudWxsO1xuICAgICAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBtb3ZlQ2xhc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25lbmRcIiwgY2IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IHJhd1Byb3BzID0gdG9SYXcocHJvcHMpO1xuICAgICAgY29uc3QgY3NzVHJhbnNpdGlvblByb3BzID0gcmVzb2x2ZVRyYW5zaXRpb25Qcm9wcyhyYXdQcm9wcyk7XG4gICAgICBsZXQgdGFnID0gcmF3UHJvcHMudGFnIHx8IEZyYWdtZW50O1xuICAgICAgcHJldkNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICBjaGlsZHJlbiA9IHNsb3RzLmRlZmF1bHQgPyBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4oc2xvdHMuZGVmYXVsdCgpKSA6IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoY2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uSG9va3MoXG4gICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgIHJlc29sdmVUcmFuc2l0aW9uSG9va3MoY2hpbGQsIGNzc1RyYW5zaXRpb25Qcm9wcywgc3RhdGUsIGluc3RhbmNlKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHdhcm4oYDxUcmFuc2l0aW9uR3JvdXA+IGNoaWxkcmVuIG11c3QgYmUga2V5ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcmV2Q2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjaGlsZCA9IHByZXZDaGlsZHJlbltpXTtcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uSG9va3MoXG4gICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgIHJlc29sdmVUcmFuc2l0aW9uSG9va3MoY2hpbGQsIGNzc1RyYW5zaXRpb25Qcm9wcywgc3RhdGUsIGluc3RhbmNlKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcG9zaXRpb25NYXAuc2V0KGNoaWxkLCBjaGlsZC5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0YWcsIG51bGwsIGNoaWxkcmVuKTtcbiAgICB9O1xuICB9XG59O1xuY29uc3QgcmVtb3ZlTW9kZSA9IChwcm9wcykgPT4gZGVsZXRlIHByb3BzLm1vZGU7XG4vKiBAX19QVVJFX18gKi8gcmVtb3ZlTW9kZShUcmFuc2l0aW9uR3JvdXBJbXBsLnByb3BzKTtcbmNvbnN0IFRyYW5zaXRpb25Hcm91cCA9IFRyYW5zaXRpb25Hcm91cEltcGw7XG5mdW5jdGlvbiBjYWxsUGVuZGluZ0NicyhjKSB7XG4gIGNvbnN0IGVsID0gYy5lbDtcbiAgaWYgKGVsW21vdmVDYktleV0pIHtcbiAgICBlbFttb3ZlQ2JLZXldKCk7XG4gIH1cbiAgaWYgKGVsW2VudGVyQ2JLZXldKSB7XG4gICAgZWxbZW50ZXJDYktleV0oKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVjb3JkUG9zaXRpb24oYykge1xuICBuZXdQb3NpdGlvbk1hcC5zZXQoYywgYy5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG59XG5mdW5jdGlvbiBhcHBseVRyYW5zbGF0aW9uKGMpIHtcbiAgY29uc3Qgb2xkUG9zID0gcG9zaXRpb25NYXAuZ2V0KGMpO1xuICBjb25zdCBuZXdQb3MgPSBuZXdQb3NpdGlvbk1hcC5nZXQoYyk7XG4gIGNvbnN0IGR4ID0gb2xkUG9zLmxlZnQgLSBuZXdQb3MubGVmdDtcbiAgY29uc3QgZHkgPSBvbGRQb3MudG9wIC0gbmV3UG9zLnRvcDtcbiAgaWYgKGR4IHx8IGR5KSB7XG4gICAgY29uc3QgcyA9IGMuZWwuc3R5bGU7XG4gICAgcy50cmFuc2Zvcm0gPSBzLndlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtkeH1weCwke2R5fXB4KWA7XG4gICAgcy50cmFuc2l0aW9uRHVyYXRpb24gPSBcIjBzXCI7XG4gICAgcmV0dXJuIGM7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhc0NTU1RyYW5zZm9ybShlbCwgcm9vdCwgbW92ZUNsYXNzKSB7XG4gIGNvbnN0IGNsb25lID0gZWwuY2xvbmVOb2RlKCk7XG4gIGNvbnN0IF92dGMgPSBlbFt2dGNLZXldO1xuICBpZiAoX3Z0Yykge1xuICAgIF92dGMuZm9yRWFjaCgoY2xzKSA9PiB7XG4gICAgICBjbHMuc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGNsb25lLmNsYXNzTGlzdC5yZW1vdmUoYykpO1xuICAgIH0pO1xuICB9XG4gIG1vdmVDbGFzcy5zcGxpdCgvXFxzKy8pLmZvckVhY2goKGMpID0+IGMgJiYgY2xvbmUuY2xhc3NMaXN0LmFkZChjKSk7XG4gIGNsb25lLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgY29uc3QgY29udGFpbmVyID0gcm9vdC5ub2RlVHlwZSA9PT0gMSA/IHJvb3QgOiByb290LnBhcmVudE5vZGU7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjbG9uZSk7XG4gIGNvbnN0IHsgaGFzVHJhbnNmb3JtIH0gPSBnZXRUcmFuc2l0aW9uSW5mbyhjbG9uZSk7XG4gIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjbG9uZSk7XG4gIHJldHVybiBoYXNUcmFuc2Zvcm07XG59XG5cbmNvbnN0IGdldE1vZGVsQXNzaWduZXIgPSAodm5vZGUpID0+IHtcbiAgY29uc3QgZm4gPSB2bm9kZS5wcm9wc1tcIm9uVXBkYXRlOm1vZGVsVmFsdWVcIl0gfHwgZmFsc2U7XG4gIHJldHVybiBpc0FycmF5KGZuKSA/ICh2YWx1ZSkgPT4gaW52b2tlQXJyYXlGbnMoZm4sIHZhbHVlKSA6IGZuO1xufTtcbmZ1bmN0aW9uIG9uQ29tcG9zaXRpb25TdGFydChlKSB7XG4gIGUudGFyZ2V0LmNvbXBvc2luZyA9IHRydWU7XG59XG5mdW5jdGlvbiBvbkNvbXBvc2l0aW9uRW5kKGUpIHtcbiAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gIGlmICh0YXJnZXQuY29tcG9zaW5nKSB7XG4gICAgdGFyZ2V0LmNvbXBvc2luZyA9IGZhbHNlO1xuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIpKTtcbiAgfVxufVxuY29uc3QgYXNzaWduS2V5ID0gU3ltYm9sKFwiX2Fzc2lnblwiKTtcbmNvbnN0IHZNb2RlbFRleHQgPSB7XG4gIGNyZWF0ZWQoZWwsIHsgbW9kaWZpZXJzOiB7IGxhenksIHRyaW0sIG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGNvbnN0IGNhc3RUb051bWJlciA9IG51bWJlciB8fCB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy50eXBlID09PSBcIm51bWJlclwiO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIGxhenkgPyBcImNoYW5nZVwiIDogXCJpbnB1dFwiLCAoZSkgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0LmNvbXBvc2luZylcbiAgICAgICAgcmV0dXJuO1xuICAgICAgbGV0IGRvbVZhbHVlID0gZWwudmFsdWU7XG4gICAgICBpZiAodHJpbSkge1xuICAgICAgICBkb21WYWx1ZSA9IGRvbVZhbHVlLnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGlmIChjYXN0VG9OdW1iZXIpIHtcbiAgICAgICAgZG9tVmFsdWUgPSBsb29zZVRvTnVtYmVyKGRvbVZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGVsW2Fzc2lnbktleV0oZG9tVmFsdWUpO1xuICAgIH0pO1xuICAgIGlmICh0cmltKSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAgIGVsLnZhbHVlID0gZWwudmFsdWUudHJpbSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghbGF6eSkge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjb21wb3NpdGlvbnN0YXJ0XCIsIG9uQ29tcG9zaXRpb25TdGFydCk7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNvbXBvc2l0aW9uZW5kXCIsIG9uQ29tcG9zaXRpb25FbmQpO1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgb25Db21wb3NpdGlvbkVuZCk7XG4gICAgfVxuICB9LFxuICAvLyBzZXQgdmFsdWUgb24gbW91bnRlZCBzbyBpdCdzIGFmdGVyIG1pbi9tYXggZm9yIHR5cGU9XCJyYW5nZVwiXG4gIG1vdW50ZWQoZWwsIHsgdmFsdWUgfSkge1xuICAgIGVsLnZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTtcbiAgfSxcbiAgYmVmb3JlVXBkYXRlKGVsLCB7IHZhbHVlLCBtb2RpZmllcnM6IHsgbGF6eSwgdHJpbSwgbnVtYmVyIH0gfSwgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgaWYgKGVsLmNvbXBvc2luZylcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBlbFZhbHVlID0gbnVtYmVyIHx8IGVsLnR5cGUgPT09IFwibnVtYmVyXCIgPyBsb29zZVRvTnVtYmVyKGVsLnZhbHVlKSA6IGVsLnZhbHVlO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTtcbiAgICBpZiAoZWxWYWx1ZSA9PT0gbmV3VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGVsICYmIGVsLnR5cGUgIT09IFwicmFuZ2VcIikge1xuICAgICAgaWYgKGxhenkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRyaW0gJiYgZWwudmFsdWUudHJpbSgpID09PSBuZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGVsLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbn07XG5jb25zdCB2TW9kZWxDaGVja2JveCA9IHtcbiAgLy8gIzQwOTYgYXJyYXkgY2hlY2tib3hlcyBuZWVkIHRvIGJlIGRlZXAgdHJhdmVyc2VkXG4gIGRlZXA6IHRydWUsXG4gIGNyZWF0ZWQoZWwsIF8sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSBlbC5fbW9kZWxWYWx1ZTtcbiAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZSA9IGdldFZhbHVlKGVsKTtcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSBlbC5jaGVja2VkO1xuICAgICAgY29uc3QgYXNzaWduID0gZWxbYXNzaWduS2V5XTtcbiAgICAgIGlmIChpc0FycmF5KG1vZGVsVmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbG9vc2VJbmRleE9mKG1vZGVsVmFsdWUsIGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gaW5kZXggIT09IC0xO1xuICAgICAgICBpZiAoY2hlY2tlZCAmJiAhZm91bmQpIHtcbiAgICAgICAgICBhc3NpZ24obW9kZWxWYWx1ZS5jb25jYXQoZWxlbWVudFZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrZWQgJiYgZm91bmQpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IFsuLi5tb2RlbFZhbHVlXTtcbiAgICAgICAgICBmaWx0ZXJlZC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgIGFzc2lnbihmaWx0ZXJlZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNTZXQobW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgY2xvbmVkID0gbmV3IFNldChtb2RlbFZhbHVlKTtcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICBjbG9uZWQuYWRkKGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xvbmVkLmRlbGV0ZShlbGVtZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2lnbihjbG9uZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNzaWduKGdldENoZWNrYm94VmFsdWUoZWwsIGNoZWNrZWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgLy8gc2V0IGluaXRpYWwgY2hlY2tlZCBvbiBtb3VudCB0byB3YWl0IGZvciB0cnVlLXZhbHVlL2ZhbHNlLXZhbHVlXG4gIG1vdW50ZWQ6IHNldENoZWNrZWQsXG4gIGJlZm9yZVVwZGF0ZShlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgc2V0Q2hlY2tlZChlbCwgYmluZGluZywgdm5vZGUpO1xuICB9XG59O1xuZnVuY3Rpb24gc2V0Q2hlY2tlZChlbCwgeyB2YWx1ZSwgb2xkVmFsdWUgfSwgdm5vZGUpIHtcbiAgZWwuX21vZGVsVmFsdWUgPSB2YWx1ZTtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgZWwuY2hlY2tlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpID4gLTE7XG4gIH0gZWxzZSBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgZWwuY2hlY2tlZCA9IHZhbHVlLmhhcyh2bm9kZS5wcm9wcy52YWx1ZSk7XG4gIH0gZWxzZSBpZiAodmFsdWUgIT09IG9sZFZhbHVlKSB7XG4gICAgZWwuY2hlY2tlZCA9IGxvb3NlRXF1YWwodmFsdWUsIGdldENoZWNrYm94VmFsdWUoZWwsIHRydWUpKTtcbiAgfVxufVxuY29uc3Qgdk1vZGVsUmFkaW8gPSB7XG4gIGNyZWF0ZWQoZWwsIHsgdmFsdWUgfSwgdm5vZGUpIHtcbiAgICBlbC5jaGVja2VkID0gbG9vc2VFcXVhbCh2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpO1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBlbFthc3NpZ25LZXldKGdldFZhbHVlKGVsKSk7XG4gICAgfSk7XG4gIH0sXG4gIGJlZm9yZVVwZGF0ZShlbCwgeyB2YWx1ZSwgb2xkVmFsdWUgfSwgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgaWYgKHZhbHVlICE9PSBvbGRWYWx1ZSkge1xuICAgICAgZWwuY2hlY2tlZCA9IGxvb3NlRXF1YWwodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKTtcbiAgICB9XG4gIH1cbn07XG5jb25zdCB2TW9kZWxTZWxlY3QgPSB7XG4gIC8vIDxzZWxlY3QgbXVsdGlwbGU+IHZhbHVlIG5lZWQgdG8gYmUgZGVlcCB0cmF2ZXJzZWRcbiAgZGVlcDogdHJ1ZSxcbiAgY3JlYXRlZChlbCwgeyB2YWx1ZSwgbW9kaWZpZXJzOiB7IG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgY29uc3QgaXNTZXRNb2RlbCA9IGlzU2V0KHZhbHVlKTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZWxlY3RlZFZhbCA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChlbC5vcHRpb25zLCAobykgPT4gby5zZWxlY3RlZCkubWFwKFxuICAgICAgICAobykgPT4gbnVtYmVyID8gbG9vc2VUb051bWJlcihnZXRWYWx1ZShvKSkgOiBnZXRWYWx1ZShvKVxuICAgICAgKTtcbiAgICAgIGVsW2Fzc2lnbktleV0oXG4gICAgICAgIGVsLm11bHRpcGxlID8gaXNTZXRNb2RlbCA/IG5ldyBTZXQoc2VsZWN0ZWRWYWwpIDogc2VsZWN0ZWRWYWwgOiBzZWxlY3RlZFZhbFswXVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gIH0sXG4gIC8vIHNldCB2YWx1ZSBpbiBtb3VudGVkICYgdXBkYXRlZCBiZWNhdXNlIDxzZWxlY3Q+IHJlbGllcyBvbiBpdHMgY2hpbGRyZW5cbiAgLy8gPG9wdGlvbj5zLlxuICBtb3VudGVkKGVsLCB7IHZhbHVlIH0pIHtcbiAgICBzZXRTZWxlY3RlZChlbCwgdmFsdWUpO1xuICB9LFxuICBiZWZvcmVVcGRhdGUoZWwsIF9iaW5kaW5nLCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgfSxcbiAgdXBkYXRlZChlbCwgeyB2YWx1ZSB9KSB7XG4gICAgc2V0U2VsZWN0ZWQoZWwsIHZhbHVlKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNldFNlbGVjdGVkKGVsLCB2YWx1ZSkge1xuICBjb25zdCBpc011bHRpcGxlID0gZWwubXVsdGlwbGU7XG4gIGlmIChpc011bHRpcGxlICYmICFpc0FycmF5KHZhbHVlKSAmJiAhaXNTZXQodmFsdWUpKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKFxuICAgICAgYDxzZWxlY3QgbXVsdGlwbGUgdi1tb2RlbD4gZXhwZWN0cyBhbiBBcnJheSBvciBTZXQgdmFsdWUgZm9yIGl0cyBiaW5kaW5nLCBidXQgZ290ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSl9LmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGxldCBpID0gMCwgbCA9IGVsLm9wdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gZWwub3B0aW9uc1tpXTtcbiAgICBjb25zdCBvcHRpb25WYWx1ZSA9IGdldFZhbHVlKG9wdGlvbik7XG4gICAgaWYgKGlzTXVsdGlwbGUpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBsb29zZUluZGV4T2YodmFsdWUsIG9wdGlvblZhbHVlKSA+IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdmFsdWUuaGFzKG9wdGlvblZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7XG4gICAgICAgIGlmIChlbC5zZWxlY3RlZEluZGV4ICE9PSBpKVxuICAgICAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghaXNNdWx0aXBsZSAmJiBlbC5zZWxlY3RlZEluZGV4ICE9PSAtMSkge1xuICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VmFsdWUoZWwpIHtcbiAgcmV0dXJuIFwiX3ZhbHVlXCIgaW4gZWwgPyBlbC5fdmFsdWUgOiBlbC52YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldENoZWNrYm94VmFsdWUoZWwsIGNoZWNrZWQpIHtcbiAgY29uc3Qga2V5ID0gY2hlY2tlZCA/IFwiX3RydWVWYWx1ZVwiIDogXCJfZmFsc2VWYWx1ZVwiO1xuICByZXR1cm4ga2V5IGluIGVsID8gZWxba2V5XSA6IGNoZWNrZWQ7XG59XG5jb25zdCB2TW9kZWxEeW5hbWljID0ge1xuICBjcmVhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBudWxsLCBcImNyZWF0ZWRcIik7XG4gIH0sXG4gIG1vdW50ZWQoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIG51bGwsIFwibW91bnRlZFwiKTtcbiAgfSxcbiAgYmVmb3JlVXBkYXRlKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSwgXCJiZWZvcmVVcGRhdGVcIik7XG4gIH0sXG4gIHVwZGF0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpIHtcbiAgICBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlLCBcInVwZGF0ZWRcIik7XG4gIH1cbn07XG5mdW5jdGlvbiByZXNvbHZlRHluYW1pY01vZGVsKHRhZ05hbWUsIHR5cGUpIHtcbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgY2FzZSBcIlNFTEVDVFwiOlxuICAgICAgcmV0dXJuIHZNb2RlbFNlbGVjdDtcbiAgICBjYXNlIFwiVEVYVEFSRUFcIjpcbiAgICAgIHJldHVybiB2TW9kZWxUZXh0O1xuICAgIGRlZmF1bHQ6XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgcmV0dXJuIHZNb2RlbENoZWNrYm94O1xuICAgICAgICBjYXNlIFwicmFkaW9cIjpcbiAgICAgICAgICByZXR1cm4gdk1vZGVsUmFkaW87XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHZNb2RlbFRleHQ7XG4gICAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUsIGhvb2spIHtcbiAgY29uc3QgbW9kZWxUb1VzZSA9IHJlc29sdmVEeW5hbWljTW9kZWwoXG4gICAgZWwudGFnTmFtZSxcbiAgICB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy50eXBlXG4gICk7XG4gIGNvbnN0IGZuID0gbW9kZWxUb1VzZVtob29rXTtcbiAgZm4gJiYgZm4oZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpO1xufVxuZnVuY3Rpb24gaW5pdFZNb2RlbEZvclNTUigpIHtcbiAgdk1vZGVsVGV4dC5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0pID0+ICh7IHZhbHVlIH0pO1xuICB2TW9kZWxSYWRpby5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0sIHZub2RlKSA9PiB7XG4gICAgaWYgKHZub2RlLnByb3BzICYmIGxvb3NlRXF1YWwodm5vZGUucHJvcHMudmFsdWUsIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgIH1cbiAgfTtcbiAgdk1vZGVsQ2hlY2tib3guZ2V0U1NSUHJvcHMgPSAoeyB2YWx1ZSB9LCB2bm9kZSkgPT4ge1xuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKHZub2RlLnByb3BzICYmIGxvb3NlSW5kZXhPZih2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgICBpZiAodm5vZGUucHJvcHMgJiYgdmFsdWUuaGFzKHZub2RlLnByb3BzLnZhbHVlKSkge1xuICAgICAgICByZXR1cm4geyBjaGVja2VkOiB0cnVlIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgIH1cbiAgfTtcbiAgdk1vZGVsRHluYW1pYy5nZXRTU1JQcm9wcyA9IChiaW5kaW5nLCB2bm9kZSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygdm5vZGUudHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb2RlbFRvVXNlID0gcmVzb2x2ZUR5bmFtaWNNb2RlbChcbiAgICAgIC8vIHJlc29sdmVEeW5hbWljTW9kZWwgZXhwZWN0cyBhbiB1cHBlcmNhc2UgdGFnIG5hbWUsIGJ1dCB2bm9kZS50eXBlIGlzIGxvd2VyY2FzZVxuICAgICAgdm5vZGUudHlwZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMudHlwZVxuICAgICk7XG4gICAgaWYgKG1vZGVsVG9Vc2UuZ2V0U1NSUHJvcHMpIHtcbiAgICAgIHJldHVybiBtb2RlbFRvVXNlLmdldFNTUlByb3BzKGJpbmRpbmcsIHZub2RlKTtcbiAgICB9XG4gIH07XG59XG5cbmNvbnN0IHN5c3RlbU1vZGlmaWVycyA9IFtcImN0cmxcIiwgXCJzaGlmdFwiLCBcImFsdFwiLCBcIm1ldGFcIl07XG5jb25zdCBtb2RpZmllckd1YXJkcyA9IHtcbiAgc3RvcDogKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCksXG4gIHByZXZlbnQ6IChlKSA9PiBlLnByZXZlbnREZWZhdWx0KCksXG4gIHNlbGY6IChlKSA9PiBlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0LFxuICBjdHJsOiAoZSkgPT4gIWUuY3RybEtleSxcbiAgc2hpZnQ6IChlKSA9PiAhZS5zaGlmdEtleSxcbiAgYWx0OiAoZSkgPT4gIWUuYWx0S2V5LFxuICBtZXRhOiAoZSkgPT4gIWUubWV0YUtleSxcbiAgbGVmdDogKGUpID0+IFwiYnV0dG9uXCIgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMCxcbiAgbWlkZGxlOiAoZSkgPT4gXCJidXR0b25cIiBpbiBlICYmIGUuYnV0dG9uICE9PSAxLFxuICByaWdodDogKGUpID0+IFwiYnV0dG9uXCIgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMixcbiAgZXhhY3Q6IChlLCBtb2RpZmllcnMpID0+IHN5c3RlbU1vZGlmaWVycy5zb21lKChtKSA9PiBlW2Ake219S2V5YF0gJiYgIW1vZGlmaWVycy5pbmNsdWRlcyhtKSlcbn07XG5jb25zdCB3aXRoTW9kaWZpZXJzID0gKGZuLCBtb2RpZmllcnMpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBmbi5fd2l0aE1vZHMgfHwgKGZuLl93aXRoTW9kcyA9IHt9KTtcbiAgY29uc3QgY2FjaGVLZXkgPSBtb2RpZmllcnMuam9pbihcIi5cIik7XG4gIHJldHVybiBjYWNoZVtjYWNoZUtleV0gfHwgKGNhY2hlW2NhY2hlS2V5XSA9IChldmVudCwgLi4uYXJncykgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kaWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBndWFyZCA9IG1vZGlmaWVyR3VhcmRzW21vZGlmaWVyc1tpXV07XG4gICAgICBpZiAoZ3VhcmQgJiYgZ3VhcmQoZXZlbnQsIG1vZGlmaWVycykpXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGZuKGV2ZW50LCAuLi5hcmdzKTtcbiAgfSk7XG59O1xuY29uc3Qga2V5TmFtZXMgPSB7XG4gIGVzYzogXCJlc2NhcGVcIixcbiAgc3BhY2U6IFwiIFwiLFxuICB1cDogXCJhcnJvdy11cFwiLFxuICBsZWZ0OiBcImFycm93LWxlZnRcIixcbiAgcmlnaHQ6IFwiYXJyb3ctcmlnaHRcIixcbiAgZG93bjogXCJhcnJvdy1kb3duXCIsXG4gIGRlbGV0ZTogXCJiYWNrc3BhY2VcIlxufTtcbmNvbnN0IHdpdGhLZXlzID0gKGZuLCBtb2RpZmllcnMpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBmbi5fd2l0aEtleXMgfHwgKGZuLl93aXRoS2V5cyA9IHt9KTtcbiAgY29uc3QgY2FjaGVLZXkgPSBtb2RpZmllcnMuam9pbihcIi5cIik7XG4gIHJldHVybiBjYWNoZVtjYWNoZUtleV0gfHwgKGNhY2hlW2NhY2hlS2V5XSA9IChldmVudCkgPT4ge1xuICAgIGlmICghKFwia2V5XCIgaW4gZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50S2V5ID0gaHlwaGVuYXRlKGV2ZW50LmtleSk7XG4gICAgaWYgKG1vZGlmaWVycy5zb21lKChrKSA9PiBrID09PSBldmVudEtleSB8fCBrZXlOYW1lc1trXSA9PT0gZXZlbnRLZXkpKSB7XG4gICAgICByZXR1cm4gZm4oZXZlbnQpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCByZW5kZXJlck9wdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKHsgcGF0Y2hQcm9wIH0sIG5vZGVPcHMpO1xubGV0IHJlbmRlcmVyO1xubGV0IGVuYWJsZWRIeWRyYXRpb24gPSBmYWxzZTtcbmZ1bmN0aW9uIGVuc3VyZVJlbmRlcmVyKCkge1xuICByZXR1cm4gcmVuZGVyZXIgfHwgKHJlbmRlcmVyID0gY3JlYXRlUmVuZGVyZXIocmVuZGVyZXJPcHRpb25zKSk7XG59XG5mdW5jdGlvbiBlbnN1cmVIeWRyYXRpb25SZW5kZXJlcigpIHtcbiAgcmVuZGVyZXIgPSBlbmFibGVkSHlkcmF0aW9uID8gcmVuZGVyZXIgOiBjcmVhdGVIeWRyYXRpb25SZW5kZXJlcihyZW5kZXJlck9wdGlvbnMpO1xuICBlbmFibGVkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgcmV0dXJuIHJlbmRlcmVyO1xufVxuY29uc3QgcmVuZGVyID0gKC4uLmFyZ3MpID0+IHtcbiAgZW5zdXJlUmVuZGVyZXIoKS5yZW5kZXIoLi4uYXJncyk7XG59O1xuY29uc3QgaHlkcmF0ZSA9ICguLi5hcmdzKSA9PiB7XG4gIGVuc3VyZUh5ZHJhdGlvblJlbmRlcmVyKCkuaHlkcmF0ZSguLi5hcmdzKTtcbn07XG5jb25zdCBjcmVhdGVBcHAgPSAoLi4uYXJncykgPT4ge1xuICBjb25zdCBhcHAgPSBlbnN1cmVSZW5kZXJlcigpLmNyZWF0ZUFwcCguLi5hcmdzKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpbmplY3ROYXRpdmVUYWdDaGVjayhhcHApO1xuICAgIGluamVjdENvbXBpbGVyT3B0aW9uc0NoZWNrKGFwcCk7XG4gIH1cbiAgY29uc3QgeyBtb3VudCB9ID0gYXBwO1xuICBhcHAubW91bnQgPSAoY29udGFpbmVyT3JTZWxlY3RvcikgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5vcm1hbGl6ZUNvbnRhaW5lcihjb250YWluZXJPclNlbGVjdG9yKTtcbiAgICBpZiAoIWNvbnRhaW5lcilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBjb21wb25lbnQgPSBhcHAuX2NvbXBvbmVudDtcbiAgICBpZiAoIWlzRnVuY3Rpb24oY29tcG9uZW50KSAmJiAhY29tcG9uZW50LnJlbmRlciAmJiAhY29tcG9uZW50LnRlbXBsYXRlKSB7XG4gICAgICBjb21wb25lbnQudGVtcGxhdGUgPSBjb250YWluZXIuaW5uZXJIVE1MO1xuICAgIH1cbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICBjb25zdCBwcm94eSA9IG1vdW50KGNvbnRhaW5lciwgZmFsc2UsIHJlc29sdmVSb290TmFtZXNwYWNlKGNvbnRhaW5lcikpO1xuICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQXR0cmlidXRlKFwidi1jbG9ha1wiKTtcbiAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLXYtYXBwXCIsIFwiXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcHJveHk7XG4gIH07XG4gIHJldHVybiBhcHA7XG59O1xuY29uc3QgY3JlYXRlU1NSQXBwID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgYXBwID0gZW5zdXJlSHlkcmF0aW9uUmVuZGVyZXIoKS5jcmVhdGVBcHAoLi4uYXJncyk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaW5qZWN0TmF0aXZlVGFnQ2hlY2soYXBwKTtcbiAgICBpbmplY3RDb21waWxlck9wdGlvbnNDaGVjayhhcHApO1xuICB9XG4gIGNvbnN0IHsgbW91bnQgfSA9IGFwcDtcbiAgYXBwLm1vdW50ID0gKGNvbnRhaW5lck9yU2VsZWN0b3IpID0+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSBub3JtYWxpemVDb250YWluZXIoY29udGFpbmVyT3JTZWxlY3Rvcik7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIG1vdW50KGNvbnRhaW5lciwgdHJ1ZSwgcmVzb2x2ZVJvb3ROYW1lc3BhY2UoY29udGFpbmVyKSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gYXBwO1xufTtcbmZ1bmN0aW9uIHJlc29sdmVSb290TmFtZXNwYWNlKGNvbnRhaW5lcikge1xuICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkge1xuICAgIHJldHVybiBcInN2Z1wiO1xuICB9XG4gIGlmICh0eXBlb2YgTWF0aE1MRWxlbWVudCA9PT0gXCJmdW5jdGlvblwiICYmIGNvbnRhaW5lciBpbnN0YW5jZW9mIE1hdGhNTEVsZW1lbnQpIHtcbiAgICByZXR1cm4gXCJtYXRobWxcIjtcbiAgfVxufVxuZnVuY3Rpb24gaW5qZWN0TmF0aXZlVGFnQ2hlY2soYXBwKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcHAuY29uZmlnLCBcImlzTmF0aXZlVGFnXCIsIHtcbiAgICB2YWx1ZTogKHRhZykgPT4gaXNIVE1MVGFnKHRhZykgfHwgaXNTVkdUYWcodGFnKSB8fCBpc01hdGhNTFRhZyh0YWcpLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbn1cbmZ1bmN0aW9uIGluamVjdENvbXBpbGVyT3B0aW9uc0NoZWNrKGFwcCkge1xuICBpZiAoaXNSdW50aW1lT25seSgpKSB7XG4gICAgY29uc3QgaXNDdXN0b21FbGVtZW50ID0gYXBwLmNvbmZpZy5pc0N1c3RvbUVsZW1lbnQ7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwcC5jb25maWcsIFwiaXNDdXN0b21FbGVtZW50XCIsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGlzQ3VzdG9tRWxlbWVudDtcbiAgICAgIH0sXG4gICAgICBzZXQoKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYFRoZSBcXGBpc0N1c3RvbUVsZW1lbnRcXGAgY29uZmlnIG9wdGlvbiBpcyBkZXByZWNhdGVkLiBVc2UgXFxgY29tcGlsZXJPcHRpb25zLmlzQ3VzdG9tRWxlbWVudFxcYCBpbnN0ZWFkLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBjb21waWxlck9wdGlvbnMgPSBhcHAuY29uZmlnLmNvbXBpbGVyT3B0aW9ucztcbiAgICBjb25zdCBtc2cgPSBgVGhlIFxcYGNvbXBpbGVyT3B0aW9uc1xcYCBjb25maWcgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgYSBidWlsZCBvZiBWdWUuanMgdGhhdCBpbmNsdWRlcyB0aGUgcnVudGltZSBjb21waWxlciAoYWthIFwiZnVsbCBidWlsZFwiKS4gU2luY2UgeW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkLCBcXGBjb21waWxlck9wdGlvbnNcXGAgbXVzdCBiZSBwYXNzZWQgdG8gXFxgQHZ1ZS9jb21waWxlci1kb21cXGAgaW4gdGhlIGJ1aWxkIHNldHVwIGluc3RlYWQuXG4tIEZvciB2dWUtbG9hZGVyOiBwYXNzIGl0IHZpYSB2dWUtbG9hZGVyJ3MgXFxgY29tcGlsZXJPcHRpb25zXFxgIGxvYWRlciBvcHRpb24uXG4tIEZvciB2dWUtY2xpOiBzZWUgaHR0cHM6Ly9jbGkudnVlanMub3JnL2d1aWRlL3dlYnBhY2suaHRtbCNtb2RpZnlpbmctb3B0aW9ucy1vZi1hLWxvYWRlclxuLSBGb3Igdml0ZTogcGFzcyBpdCB2aWEgQHZpdGVqcy9wbHVnaW4tdnVlIG9wdGlvbnMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdml0ZWpzL3ZpdGUtcGx1Z2luLXZ1ZS90cmVlL21haW4vcGFja2FnZXMvcGx1Z2luLXZ1ZSNleGFtcGxlLWZvci1wYXNzaW5nLW9wdGlvbnMtdG8tdnVlY29tcGlsZXItc2ZjYDtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwLmNvbmZpZywgXCJjb21waWxlck9wdGlvbnNcIiwge1xuICAgICAgZ2V0KCkge1xuICAgICAgICB3YXJuKG1zZyk7XG4gICAgICAgIHJldHVybiBjb21waWxlck9wdGlvbnM7XG4gICAgICB9LFxuICAgICAgc2V0KCkge1xuICAgICAgICB3YXJuKG1zZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKGlzU3RyaW5nKGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCByZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbnRhaW5lcik7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXJlcykge1xuICAgICAgd2FybihcbiAgICAgICAgYEZhaWxlZCB0byBtb3VudCBhcHA6IG1vdW50IHRhcmdldCBzZWxlY3RvciBcIiR7Y29udGFpbmVyfVwiIHJldHVybmVkIG51bGwuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3aW5kb3cuU2hhZG93Um9vdCAmJiBjb250YWluZXIgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCAmJiBjb250YWluZXIubW9kZSA9PT0gXCJjbG9zZWRcIikge1xuICAgIHdhcm4oXG4gICAgICBgbW91bnRpbmcgb24gYSBTaGFkb3dSb290IHdpdGggXFxge21vZGU6IFwiY2xvc2VkXCJ9XFxgIG1heSBsZWFkIHRvIHVucHJlZGljdGFibGUgYnVnc2BcbiAgICApO1xuICB9XG4gIHJldHVybiBjb250YWluZXI7XG59XG5sZXQgc3NyRGlyZWN0aXZlSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbmNvbnN0IGluaXREaXJlY3RpdmVzRm9yU1NSID0gKCkgPT4ge1xuICBpZiAoIXNzckRpcmVjdGl2ZUluaXRpYWxpemVkKSB7XG4gICAgc3NyRGlyZWN0aXZlSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIGluaXRWTW9kZWxGb3JTU1IoKTtcbiAgICBpbml0VlNob3dGb3JTU1IoKTtcbiAgfVxufSA7XG5cbmV4cG9ydCB7IFRyYW5zaXRpb24sIFRyYW5zaXRpb25Hcm91cCwgVnVlRWxlbWVudCwgY3JlYXRlQXBwLCBjcmVhdGVTU1JBcHAsIGRlZmluZUN1c3RvbUVsZW1lbnQsIGRlZmluZVNTUkN1c3RvbUVsZW1lbnQsIGh5ZHJhdGUsIGluaXREaXJlY3RpdmVzRm9yU1NSLCByZW5kZXIsIHVzZUNzc01vZHVsZSwgdXNlQ3NzVmFycywgdk1vZGVsQ2hlY2tib3gsIHZNb2RlbER5bmFtaWMsIHZNb2RlbFJhZGlvLCB2TW9kZWxTZWxlY3QsIHZNb2RlbFRleHQsIHZTaG93LCB3aXRoS2V5cywgd2l0aE1vZGlmaWVycyB9O1xuIiwiLyoqXG4qIHZ1ZSB2My40LjEwXG4qIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzXG4qIEBsaWNlbnNlIE1JVFxuKiovXG5pbXBvcnQgeyBpbml0Q3VzdG9tRm9ybWF0dGVyLCB3YXJuIH0gZnJvbSAnQHZ1ZS9ydW50aW1lLWRvbSc7XG5leHBvcnQgKiBmcm9tICdAdnVlL3J1bnRpbWUtZG9tJztcblxuZnVuY3Rpb24gaW5pdERldigpIHtcbiAge1xuICAgIGluaXRDdXN0b21Gb3JtYXR0ZXIoKTtcbiAgfVxufVxuXG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICBpbml0RGV2KCk7XG59XG5jb25zdCBjb21waWxlID0gKCkgPT4ge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4oXG4gICAgICBgUnVudGltZSBjb21waWxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnVpbGQgb2YgVnVlLmAgKyAoYCBDb25maWd1cmUgeW91ciBidW5kbGVyIHRvIGFsaWFzIFwidnVlXCIgdG8gXCJ2dWUvZGlzdC92dWUuZXNtLWJ1bmRsZXIuanNcIi5gIClcbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgeyBjb21waWxlIH07XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNhbGVuZGFyXG4gIC5kaXRvLWNhbGVuZGFyLXBvcHVwXG4gICAgLmRpdG8tY2FsZW5kYXItaW5uZXJcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWlmPVwiY3VycmVudE1vZGUgPT09ICdkYXknXCJcbiAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYuZGl0by1jYWxlbmRhci1zdGVwLW1vbnRoKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcE1vbnRoKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW5cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QteWVhcihcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2V0TW9kZSgneWVhcicpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSwgeyB5ZWFyOiB0cnVlIH0pIH19XG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LW1vbnRoKFxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZXRNb2RlKCdtb250aCcpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSwgeyBtb250aDogdHJ1ZSB9KSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQuZGl0by1jYWxlbmRhci1zdGVwLW1vbnRoKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcE1vbnRoKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dC5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci13ZWVrZGF5c1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJ3ZWVrZGF5IGluIHdlZWtkYXlOYW1lc1wiXG4gICAgICAgICAgICApIHt7IHdlZWtkYXkuc2hvcnQgfX1cbiAgICAgICAgICAuZGl0by1jYWxlbmRhci1kYXRlc1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJkYXRlIGluIGRhdGVSYW5nZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImRhdGUuc3RhdGUgJiYgYGRpdG8tY2FsZW5kYXItaXRlbS0ke2RhdGUuc3RhdGV9YFwiXG4gICAgICAgICAgICAgIEBjbGljaz1cImRhdGUuc3RhdGUgIT09ICdkaXNhYmxlZCcgJiYgc2VsZWN0RGF0ZShkYXRlLmRhdGUpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZS50ZXh0IH19XG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWZvb3RlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3Qtbm93KFxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICA6dGl0bGU9XCJkYXRlVG9TdHJpbmcobmV3IERhdGUoKSlcIlxuICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0RGF0ZShuZXcgRGF0ZSgpKVwiXG4gICAgICAgICAgKVxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtZWxzZS1pZj1cImN1cnJlbnRNb2RlID09PSAnbW9udGgnXCJcbiAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW5cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QteWVhcihcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2V0TW9kZSgneWVhcicpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSwgeyB5ZWFyOiB0cnVlIH0pIH19XG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci1tb250aHNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwiKG1vbnRoLCBpbmRleCkgaW4gbW9udGhOYW1lc1wiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImdldE1vbnRoQ2xhc3MoaW5kZXgpXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0TW9udGgoaW5kZXgpXCJcbiAgICAgICAgICAgICkge3sgbW9udGguc2hvcnQgfX1cbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWVsc2UtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ3llYXInXCJcbiAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBEZWNhZGUoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgc3BhbiB7eyBkZWNhZGVUb1N0cmluZyhjdXJyZW50VmFsdWUpIH19XG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBEZWNhZGUoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItYm9keVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLXllYXJzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cInllYXIgaW4geWVhclJhbmdlXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiZ2V0WWVhckNsYXNzKHllYXIpXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0WWVhcih5ZWFyKVwiXG4gICAgICAgICAgICApIHt7IHllYXIgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBkZXNjcmliZURhdGUsIGFsdGVyRGF0ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAnc2VsZWN0J10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZGlzYWJsZWREYXRlOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIG1vZGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGF5JyB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICBjb25zdCB7IHdlZWtkYXlOYW1lcywgbW9udGhOYW1lcyB9ID0gZ2V0TG9jYWxlTmFtZXModGhpcy5sb2NhbGUpXG4gICAgcmV0dXJuIHtcbiAgICAgIHdlZWtkYXlOYW1lcyxcbiAgICAgIG1vbnRoTmFtZXMsXG4gICAgICBkYXRlUmFuZ2U6IFtdLFxuICAgICAgeWVhclJhbmdlOiBbXSxcbiAgICAgIGN1cnJlbnRWYWx1ZTogKFxuICAgICAgICB0aGlzLm1vZGVsVmFsdWUgfHxcbiAgICAgICAgLy8gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHVzZSBjdXJyZW50IGRhdGUgYnV0IGNsZWFyIHRpbWUgZmllbGRzOlxuICAgICAgICBhbHRlckRhdGUobmV3IERhdGUoKSwgeyBob3VyOiAwLCBtaW51dGU6IDAsIHNlY29uZDogMCwgbWlsbGlzZWNvbmQ6IDAgfSlcbiAgICAgICksXG4gICAgICBjdXJyZW50TW9kZTogdGhpcy5tb2RlXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0byB8fCBuZXcgRGF0ZSgpXG4gICAgICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGRpc2FibGVkRGF0ZTogJ3VwZGF0ZURhdGVSYW5nZScsXG5cbiAgICBtb2RlKG1vZGUpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vZGUgPSBtb2RlXG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRNb250aENsYXNzKG1vbnRoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSc6IChcbiAgICAgICAgICB0aGlzLm1vZGVsVmFsdWUgJiZcbiAgICAgICAgICBtb250aCA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldE1vbnRoKCkgJiZcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgICApLFxuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQnOiBtb250aCA9PT0gdGhpcy5jdXJyZW50VmFsdWUuZ2V0TW9udGgoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRZZWFyQ2xhc3MoeWVhcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUnOiAoXG4gICAgICAgICAgdGhpcy5tb2RlbFZhbHVlICYmIHllYXIgPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICAgICksXG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCc6IHllYXIgPT09IHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0RGF0ZShvdmVycmlkZXMsIHVwZGF0ZSA9IGZhbHNlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGFsdGVyRGF0ZSh0aGlzLmN1cnJlbnRWYWx1ZSwgb3ZlcnJpZGVzKVxuICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHRoaXMuY3VycmVudFZhbHVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdGVwRGVjYWRlKHN0ZXApIHtcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIHllYXI6IHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBzdGVwICogMTBcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNldE1vZGUobW9kZSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9kZSA9IG1vZGVcbiAgICB9LFxuXG4gICAgc3RlcE1vbnRoKHN0ZXApIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBjb25zdCB7IHllYXIsIG1vbnRoIH0gPSB0aGlzLmdldFllYXJNb250aChcbiAgICAgICAgY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpICsgc3RlcFxuICAgICAgKVxuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgbW9udGgsXG4gICAgICAgIGRheTogTWF0aC5taW4oXG4gICAgICAgICAgdGhpcy5nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCksXG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUuZ2V0RGF0ZSgpXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHN0ZXBZZWFyKHN0ZXApIHtcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIHllYXI6IHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBzdGVwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzZWxlY3REYXRlKGRhdGUpIHtcbiAgICAgIHRoaXMuc2V0RGF0ZShkZXNjcmliZURhdGUoZGF0ZSksIHRydWUpXG4gICAgICB0aGlzLiRlbWl0KCdzZWxlY3QnKVxuICAgIH0sXG5cbiAgICBzZWxlY3RNb250aChtb250aCkge1xuICAgICAgdGhpcy5zZXRNb2RlKCdkYXknKVxuICAgICAgLy8gU2V0IGRheSB0byAxIHRvIGF2b2lkIHNlbGVjdGluZyBhIGRhdGUgdGhhdCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZVxuICAgICAgLy8gbmV3IG1vbnRoLCBlLmcuIEZlYiAzMSAtPiBNYXIgMy5cbiAgICAgIHRoaXMuc2V0RGF0ZSh7IG1vbnRoLCBkYXk6IDEgfSwgdHJ1ZSlcbiAgICB9LFxuXG4gICAgc2VsZWN0WWVhcih5ZWFyKSB7XG4gICAgICB0aGlzLnNldE1vZGUoJ21vbnRoJylcbiAgICAgIHRoaXMuc2V0RGF0ZSh7IHllYXIgfSwgdHJ1ZSlcbiAgICB9LFxuXG4gICAgZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICBpZiAobW9udGggPiAxMSkge1xuICAgICAgICB5ZWFyKytcbiAgICAgICAgbW9udGggPSAwXG4gICAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMCkge1xuICAgICAgICB5ZWFyLS1cbiAgICAgICAgbW9udGggPSAxMVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgeWVhciwgbW9udGggfVxuICAgIH0sXG5cbiAgICBkYXRlVG9TdHJpbmcoXG4gICAgICBkYXRlLFxuICAgICAgeyB5ZWFyLCBtb250aCwgZGF5IH0gPSB7IHllYXI6IHRydWUsIG1vbnRoOiB0cnVlLCBkYXk6IHRydWUgfVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcodGhpcy5sb2NhbGUsIHtcbiAgICAgICAgeWVhcjogeWVhciAmJiAnbnVtZXJpYycsXG4gICAgICAgIG1vbnRoOiBtb250aCAmJiAnbG9uZycsXG4gICAgICAgIGRheTogZGF5ICYmICdudW1lcmljJ1xuICAgICAgfSlcbiAgICB9LFxuXG4gICAgZGVjYWRlVG9TdHJpbmcoZGF0ZSkge1xuICAgICAgY29uc3QgeWVhciA9IHRoaXMuZ2V0Rmlyc3RZZWFyT2ZEZWNhZGUoZGF0ZS5nZXRGdWxsWWVhcigpKVxuICAgICAgcmV0dXJuIGAke3llYXJ9IOKAkyAke3llYXIgKyA5fWBcbiAgICB9LFxuXG4gICAgZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApLmdldERhdGUoKVxuICAgIH0sXG5cbiAgICBnZXRGaXJzdFllYXJPZkRlY2FkZSh5ZWFyKSB7XG4gICAgICBjb25zdCB5ZWFyU3RyID0geWVhci50b1N0cmluZygpXG4gICAgICByZXR1cm4gK2Ake3llYXJTdHIuc2xpY2UoMCwgLTEpfTBgXG4gICAgfSxcblxuICAgIG5hdmlnYXRlKHsgc3RlcCwgZW50ZXIsIG1vZGUgPSB0aGlzLmN1cnJlbnRNb2RlLCB1cGRhdGUgPSBmYWxzZSB9KSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgaWYgKHN0ZXApIHtcbiAgICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7IGRheTogY3VycmVudFZhbHVlLmdldERhdGUoKSArIHN0ZXAgfSwgdXBkYXRlKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICB0aGlzLnNldERhdGUoeyBtb250aDogY3VycmVudFZhbHVlLmdldE1vbnRoKCkgKyBzdGVwIH0sIHVwZGF0ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICB0aGlzLnNldERhdGUoeyB5ZWFyOiBjdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSArIHN0ZXAgfSwgdXBkYXRlKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChlbnRlcikge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY3VycmVudE1vZGUpIHtcbiAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlKGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCdkYXknKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnbW9udGgnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB1cGRhdGVEYXRlUmFuZ2UoKSB7XG4gICAgICB0aGlzLmRhdGVSYW5nZSA9IFtdXG4gICAgICB0aGlzLnllYXJSYW5nZSA9IFtdXG5cbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBjb25zdCB5ZWFyID0gY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgIGNvbnN0IG1vbnRoID0gY3VycmVudFZhbHVlLmdldE1vbnRoKClcbiAgICAgIGNvbnN0IHN0YXJ0WWVhciA9IHRoaXMuZ2V0Rmlyc3RZZWFyT2ZEZWNhZGUoeWVhcilcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICB0aGlzLnllYXJSYW5nZS5wdXNoKHN0YXJ0WWVhciArIGkpXG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyTW9udGhGaXJzdERheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKVxuICAgICAgbGV0IGZpcnN0RGF5V2VlayA9IGN1cnJNb250aEZpcnN0RGF5LmdldERheSgpICsgMVxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA9PT0gMCkge1xuICAgICAgICBmaXJzdERheVdlZWsgPSA3XG4gICAgICB9XG4gICAgICBjb25zdCBudW1EYXlzID0gdGhpcy5nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aClcbiAgICAgIGlmIChmaXJzdERheVdlZWsgPiAxKSB7XG4gICAgICAgIGNvbnN0IHByZXZNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSlcbiAgICAgICAgY29uc3QgcHJldk1vbnRoTnVtRGF5cyA9IHRoaXMuZ2V0RGF5c0luTW9udGgoXG4gICAgICAgICAgcHJldk1vbnRoLnllYXIsXG4gICAgICAgICAgcHJldk1vbnRoLm1vbnRoXG4gICAgICAgIClcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBmaXJzdERheVdlZWs7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRheSA9IHByZXZNb250aE51bURheXMgLSBmaXJzdERheVdlZWsgKyBpICsgMVxuICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShwcmV2TW9udGgueWVhciwgcHJldk1vbnRoLm1vbnRoLCBkYXkpXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgICB0ZXh0OiBkYXksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgc3RhdGU6IHRoaXMuZGlzYWJsZWREYXRlKGRhdGUpID8gJ2Rpc2FibGVkJyA6ICdncmF5J1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbnVtRGF5czsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgaSlcbiAgICAgICAgY29uc3QgaXNEYXkgPSBkYXRlID0+IChcbiAgICAgICAgICBkYXRlICYmXG4gICAgICAgICAgZGF0ZS5nZXREYXRlKCkgPT09IGkgJiZcbiAgICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IHllYXIgJiZcbiAgICAgICAgICBkYXRlLmdldE1vbnRoKCkgPT09IG1vbnRoXG4gICAgICAgIClcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBpc0RheSh0aGlzLm1vZGVsVmFsdWUpXG4gICAgICAgICAgPyAnYWN0aXZlJ1xuICAgICAgICAgIDogaXNEYXkobm93KVxuICAgICAgICAgICAgPyAndG9kYXknXG4gICAgICAgICAgICA6IHRoaXMuZGlzYWJsZWREYXRlKGRhdGUpXG4gICAgICAgICAgICAgID8gJ2Rpc2FibGVkJ1xuICAgICAgICAgICAgICA6IGlzRGF5KGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICAgICAgICA/ICdjdXJyZW50J1xuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgc3RhdGVcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dE1vbnRoTmVlZCA9IDQyIC0gdGhpcy5kYXRlUmFuZ2UubGVuZ3RoXG4gICAgICBpZiAobmV4dE1vbnRoTmVlZCA+IDApIHtcbiAgICAgICAgY29uc3QgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuZXh0TW9udGhOZWVkOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgaSlcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZGlzYWJsZWREYXRlKGRhdGUpID8gJ2Rpc2FibGVkJyA6ICdncmF5J1xuICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgICAgdGV4dDogaSxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY29uc3QgbG9jYWxlTmFtZXMgPSB7fVxuXG4vLyBDYWxsaW5nIGB0b0xvY2FsZVN0cmluZygpYCB0aGlzIG11Y2ggYXBwZWFycyB0byBiZSBleHBlbnNpdmUsIHNvIGNhY2hlIGl0OlxuZnVuY3Rpb24gZ2V0TG9jYWxlTmFtZXMobG9jYWxlKSB7XG4gIGxldCBuYW1lcyA9IGxvY2FsZU5hbWVzW2xvY2FsZV1cbiAgaWYgKCFuYW1lcykge1xuICAgIGNvbnN0IHdlZWtkYXlOYW1lcyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwLCAwLCBpKVxuICAgICAgd2Vla2RheU5hbWVzLnB1c2goe1xuICAgICAgICBsb25nOiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyB3ZWVrZGF5OiAnbG9uZycgfSksXG4gICAgICAgIHNob3J0OiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyB3ZWVrZGF5OiAnc2hvcnQnIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBtb250aE5hbWVzID0gW11cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAxMjsgaSsrKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCwgaSwgMClcbiAgICAgIG1vbnRoTmFtZXMucHVzaCh7XG4gICAgICAgIGxvbmc6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IG1vbnRoOiAnbG9uZycgfSksXG4gICAgICAgIHNob3J0OiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyBtb250aDogJ3Nob3J0JyB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgbmFtZXMgPSBsb2NhbGVOYW1lc1tsb2NhbGVdID0ge1xuICAgICAgd2Vla2RheU5hbWVzLFxuICAgICAgbW9udGhOYW1lc1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmFtZXNcbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNhbGVuZGFyIHtcbiAgbWluLXdpZHRoOiAyNDBweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLmRpdG8tY2FsZW5kYXItcG9wdXAge1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gIGJveC1zaGFkb3c6ICRzaGFkb3ctd2luZG93O1xuICB6LWluZGV4OiAkei1pbmRleC1wb3B1cDtcbn1cblxuLmRpdG8tY2FsZW5kYXItYm9keSB7XG4gIHBhZGRpbmc6IDAgMC41ZW07XG5cbiAgc3BhbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgLyA3KTtcbiAgICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQ7XG4gICAgbGluZS1oZWlnaHQ6IGNhbGMoI3skaW5wdXQtaGVpZ2h0fSAtIDJweCk7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBib3JkZXI6ICRib3JkZXItd2lkdGggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS10b2RheSB7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkICRjb2xvci1hY3RpdmU7XG4gICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSB7XG4gICAgJixcbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgICBjb2xvcjogd2hpdGU7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1kaXNhYmxlZCB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1kaXNhYmxlZCxcbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1ncmF5IHtcbiAgICBjb2xvcjogIzk5OTk5OTtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1tb250aHMsXG4uZGl0by1jYWxlbmRhci15ZWFycyB7XG4gIHNwYW4ge1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgLyA0KTtcbiAgICBtYXJnaW46IDAuNWVtIDA7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3BhbiB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLyA1KTtcbn1cblxuLmRpdG8tY2FsZW5kYXIgYSxcbi5kaXRvLWNhbGVuZGFyLWRhdGVzIHNwYW4sXG4uZGl0by1jYWxlbmRhci1tb250aHMgc3Bhbixcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW4ge1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlciBzcGFuIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuXG4gIGEge1xuICAgIHBhZGRpbmc6IDAgMC4yZW07XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItZGF0ZXMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyLW1vbnRocyBzcGFuOmhvdmVyLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyOm5vdCg6aG92ZXIpIC5kaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCB7XG4gIGJhY2tncm91bmQ6ICRjb2xvci1oaWdobGlnaHQ7XG59XG5cbi5kaXRvLWNhbGVuZGFyLXdlZWtkYXlzIHNwYW4ge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlcixcbi5kaXRvLWNhbGVuZGFyLWZvb3RlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQ7XG4gIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xufVxuXG4uZGl0by1jYWxlbmRhci1mb290ZXIge1xuICBib3JkZXItdG9wOiAkYm9yZGVyLXN0eWxlO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgYm9yZGVyLWJvdHRvbTogJGJvcmRlci1zdHlsZTtcbiAgZGlzcGxheTogZmxleDtcblxuICA+IHNwYW4ge1xuICAgIG1hcmdpbjogYXV0bztcbiAgICBwYWRkaW5nOiAwIDAuNWVtO1xuICB9XG5cbiAgYSB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLXByZXYsXG4uZGl0by1jYWxlbmRhci1zdGVwLW5leHQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiA1JTtcbiAgbWluLXdpZHRoOiAyZW07XG4gIG1heC13aWR0aDogM2VtO1xuXG4gICY6OmFmdGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICBmb250LXNpemU6IDEuMjVlbTtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLXByZXYge1xuICAmOjphZnRlciB7XG4gICAgY29udGVudDogJ+KAuSc7XG4gIH1cblxuICAmLmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyOjphZnRlciB7XG4gICAgY29udGVudDogJ8KrJztcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLW5leHQge1xuICAmOjphZnRlciB7XG4gICAgY29udGVudDogJ+KAuic7XG4gIH1cblxuICAmLmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyOjphZnRlciB7XG4gICAgY29udGVudDogJ8K7JztcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zZWxlY3Qtbm93IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICdOb3cnO1xuICB9XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudHModGFyZ2V0cywgZXZlbnRzKSB7XG4gIHRhcmdldHMgPVxuICAgIHRhcmdldHMgaW5zdGFuY2VvZiBOb2RlTGlzdFxuICAgICAgPyBBcnJheS5mcm9tKHRhcmdldHMpXG4gICAgICA6IGFzQXJyYXkodGFyZ2V0cylcblxuICBmb3IgKGNvbnN0IFt0eXBlLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhldmVudHMpKSB7XG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZW1vdmUoKSB7XG4gICAgICBmb3IgKGNvbnN0IFt0eXBlLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhldmVudHMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZUV2ZW50cyguLi5ldmVudHMpIHtcbiAgcmV0dXJuIHtcbiAgICByZW1vdmUoKSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgICBldmVudC5yZW1vdmUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2V5KGV2ZW50KSB7XG4gIHJldHVybiB7XG4gICAgMzc6ICdsZWZ0JyxcbiAgICAzODogJ3VwJyxcbiAgICAzOTogJ3JpZ2h0JyxcbiAgICA0MDogJ2Rvd24nLFxuICAgIDEzOiAnZW50ZXInXG4gIH1bZXZlbnQ/LmtleUNvZGVdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KSB7XG4gIGNvbnN0IGtleSA9IGdldEtleShldmVudClcbiAgcmV0dXJuIHtcbiAgICBob3I6IHsgbGVmdDogLTEsIHJpZ2h0OiAxIH1ba2V5XSB8fCAwLFxuICAgIHZlcjogeyB1cDogLTEsIGRvd246IDEgfVtrZXldIHx8IDAsXG4gICAgZW50ZXI6IGtleSA9PT0gJ2VudGVyJ1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXQoY29tcG9uZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IGlzU3RyaW5nKGNvbXBvbmVudC50YXJnZXQpXG4gICAgPyBjb21wb25lbnQuJHJlZnNbY29tcG9uZW50LnRhcmdldF1cbiAgICA6IGNvbXBvbmVudC50YXJnZXRcbiAgcmV0dXJuIHRhcmdldD8uJGVsID8/IHRhcmdldFxufVxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by10cmlnZ2VyLWNvbnRhaW5lclxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtaWY9XCJhbHdheXNTaG93XCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdjbGljaydcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gICAgQGNsaWNrPVwib25DbGlja1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2hvdmVyJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgICBAbW91c2VlbnRlcj1cIm9uSG92ZXIodHJ1ZSlcIlxuICAgIEBtb3VzZWxlYXZlPVwib25Ib3ZlcihmYWxzZSlcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdmb2N1cycgfHwgdHJpZ2dlciA9PT0gJ2Fsd2F5cydcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIFRyYW5zaXRpb24oOm5hbWU9XCJgZGl0by0ke3RyYW5zaXRpb259YFwiKVxuICAgIC5kaXRvLXBvcHVwKFxuICAgICAgdi1pZj1cInRyaWdnZXIgPT09ICdob3ZlcidcIlxuICAgICAgdi1zaG93PVwic2hvd1BvcHVwXCJcbiAgICAgIHJlZj1cInBvcHVwXCJcbiAgICAgIDpjbGFzcz1cInBvcHVwQ2xhc3NcIlxuICAgICAgOnN0eWxlPVwicG9wdXBTdHlsZVwiXG4gICAgICBAbW91c2VlbnRlcj1cIm9uSG92ZXIodHJ1ZSlcIlxuICAgICAgQG1vdXNlbGVhdmU9XCJvbkhvdmVyKGZhbHNlKVwiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cInNob3dQb3B1cFwiXG4gICAgICAgIG5hbWU9XCJwb3B1cFwiXG4gICAgICApXG4gICAgLmRpdG8tcG9wdXAoXG4gICAgICB2LWVsc2VcbiAgICAgIHYtc2hvdz1cInNob3dQb3B1cFwiXG4gICAgICByZWY9XCJwb3B1cFwiXG4gICAgICA6Y2xhc3M9XCJwb3B1cENsYXNzXCJcbiAgICAgIDpzdHlsZT1cInBvcHVwU3R5bGVcIlxuICAgIClcbiAgICAgIHNsb3QoXG4gICAgICAgIHYtaWY9XCJzaG93UG9wdXBcIlxuICAgICAgICBuYW1lPVwicG9wdXBcIlxuICAgICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGh5cGhlbmF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBhZGRFdmVudHMsIGNvbWJpbmVFdmVudHMgfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcbmltcG9ydCB7IGdldFRhcmdldCB9IGZyb20gJy4uL3V0aWxzL3RyaWdnZXInXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOnNob3cnXSxcblxuICBwcm9wczoge1xuICAgIHRyaWdnZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnY2xpY2snIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tJyB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBjdXN0b21DbGFzczogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB6SW5kZXg6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG4gICAga2VlcEluVmlldzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgaGlkZVdoZW5DbGlja091dHNpZGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGFsd2F5c1Nob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb3ZlcjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGhpZGVEZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgcG9wdXBQbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50LFxuICAgICAgZm9jdXNFdmVudHM6IG51bGwsXG4gICAgICBjbG9zZUV2ZW50czogbnVsbCxcbiAgICAgIHBvcHVwRXZlbnRzOiBudWxsLFxuICAgICAgYmx1clRpbWVyOiBudWxsLFxuICAgICAgbW91c2VMZWF2ZVRpbWVyOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdHJpZ2dlckNsYXNzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tdHJpZ2dlci1kaXNhYmxlZCc6IHRoaXMuZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcG9wdXBDbGFzcygpIHtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSB7XG4gICAgICAgIFtgZGl0by1wb3B1cC0ke2h5cGhlbmF0ZSh0aGlzLnBsYWNlbWVudCl9YF06IHRydWVcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1c3RvbUNsYXNzKSB7XG4gICAgICAgIGNsYXNzZXNbdGhpcy5jdXN0b21DbGFzc10gPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3Nlc1xuICAgIH0sXG5cbiAgICBwb3B1cFN0eWxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuekluZGV4ID8gYHotaW5kZXg6ICR7dGhpcy56SW5kZXh9YCA6ICcnXG4gICAgfSxcblxuICAgIHRyaWdnZXJUYXJnZXQoKSB7XG4gICAgICByZXR1cm4gZ2V0VGFyZ2V0KHRoaXMpXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgc2hvdyhzaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHNob3cgfHwgdGhpcy5hbHdheXNTaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB0aGlzLm9uU2hvd1BvcHVwKHRvKSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICBjb25zdCB7IHRyaWdnZXIsIHBvcHVwIH0gPSB0aGlzLiRyZWZzXG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2ZvY3VzJykge1xuICAgICAgdGhpcy5mb2N1c0V2ZW50cyA9IHRoaXMuYWRkRm9jdXNFdmVudHModGhpcy50cmlnZ2VyVGFyZ2V0ID8/IHRyaWdnZXIpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGlkZVdoZW5DbGlja091dHNpZGUgJiYgIXRoaXMuYWx3YXlzU2hvdykge1xuICAgICAgLy8gVXNlICdtb3VzZXVwJyBpbnN0ZWFkIG9mICdjbGljaycsIHNpbmNlIGNsaWNrIGFwcGVhcnMgdG8gaGFwcGVuIGFmdGVyXG4gICAgICAvLyB0aGUgRE9NIGluc2lkZSBvZiBwb3B1cHMgY291bGQgY2hhbmdlIGluIGEgd2F5IHNvIHRoYXQgdGhlIGNoZWNrXG4gICAgICAvLyBgcG9wdXAuY29udGFpbnMoZXZlbnQudGFyZ2V0KWAgd291bGQgZmFpbDpcbiAgICAgIHRoaXMuY2xvc2VFdmVudHMgPSBhZGRFdmVudHMod2luZG93LCB7XG4gICAgICAgIG1vdXNldXA6IGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCAmJlxuICAgICAgICAgICAgIXBvcHVwLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICAgICAgICF0cmlnZ2VyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICAgICAgICF0aGlzLnRyaWdnZXJUYXJnZXQ/LmNvbnRhaW5zKGV2ZW50LnRhcmdldClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hbHdheXNTaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLnNob3dQb3B1cCA9IHRoaXMuc2hvd1xuICB9LFxuXG4gIHVubW91bnRlZCgpIHtcbiAgICB0aGlzLmZvY3VzRXZlbnRzPy5yZW1vdmUoKVxuICAgIHRoaXMuY2xvc2VFdmVudHM/LnJlbW92ZSgpXG4gICAgdGhpcy5wb3B1cEV2ZW50cz8ucmVtb3ZlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgICBjb25zdCB7IHRyaWdnZXIsIHBvcHVwIH0gPSB0aGlzLiRyZWZzXG4gICAgICBpZiAodGhpcy5zaG93ICYmIHBvcHVwLm9mZnNldFdpZHRoID09PSAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVQb3NpdGlvbigpLCAwKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy50cmlnZ2VyVGFyZ2V0ID8/IHRyaWdnZXJcbiAgICAgIC8vIEFjdHVhbGx5IHJlc2l6ZSB0aGUgcG9wdXAncyBmaXJzdCBjaGlsZCwgc28gdGhleSBjYW4gc2V0IHNpemUgbGltaXRzLlxuICAgICAgY29uc3QgZWwgPSB0aGlzLnRhcmdldCA9PT0gJ3BvcHVwJyA/IHRyaWdnZXIgOiBwb3B1cC5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLnN0eWxlLndpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLndpZHRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJvdW5kcyA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgY29uc3QgdHJpZ2dlckxlZnQgPSBib3VuZHMubGVmdCArIHdpbmRvdy5zY3JvbGxYXG4gICAgICBjb25zdCB0cmlnZ2VyVG9wID0gYm91bmRzLnRvcCArIHdpbmRvdy5zY3JvbGxZXG4gICAgICBjb25zdCB0cmlnZ2VyV2lkdGggPSBib3VuZHMud2lkdGhcbiAgICAgIGNvbnN0IHRyaWdnZXJIZWlnaHQgPSBib3VuZHMuaGVpZ2h0XG4gICAgICBjb25zdCBwb3B1cFdpZHRoID0gcG9wdXAub2Zmc2V0V2lkdGhcbiAgICAgIGNvbnN0IHBvcHVwSGVpZ2h0ID0gcG9wdXAub2Zmc2V0SGVpZ2h0XG5cbiAgICAgIGxldCBbcGFydDEsIHBhcnQyXSA9IHRoaXMucG9wdXBQbGFjZW1lbnQuc3BsaXQoJy0nKSB8fCBbXVxuICAgICAgaWYgKHRoaXMua2VlcEluVmlldykge1xuICAgICAgICBjb25zdCB3aW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoXG4gICAgICAgIGNvbnN0IHdpbkhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJUb3AgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAnYm90dG9tJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCAtIHRyaWdnZXJIZWlnaHQgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAndG9wJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJMZWZ0IDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDEgPSAncmlnaHQnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgaWYgKHdpbldpZHRoIC0gdHJpZ2dlckxlZnQgLSB0cmlnZ2VyV2lkdGggPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdsZWZ0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0MiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICdib3R0b20nXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnYm90dG9tJykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyVG9wICsgdHJpZ2dlckhlaWdodCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICd0b3AnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnbGVmdCcpIHtcbiAgICAgICAgICBpZiAod2luV2lkdGggLSB0cmlnZ2VyTGVmdCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ3JpZ2h0J1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyTGVmdCArIHRyaWdnZXJXaWR0aCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ2xlZnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBsZWZ0ID0gMFxuICAgICAgbGV0IHRvcCA9IDBcbiAgICAgIHN3aXRjaCAocGFydDEpIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICB0b3AgLT0gcG9wdXBIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBsZWZ0IC09IHBvcHVwV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbGVmdCArPSB0cmlnZ2VyV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRvcCArPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAocGFydDIpIHtcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGxlZnQgLT0gcG9wdXBXaWR0aCAtIHRyaWdnZXJXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgdG9wIC09IHBvcHVwSGVpZ2h0IC0gdHJpZ2dlckhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb3Zlcikge1xuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgdG9wICs9IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICB0b3AgLT0gdHJpZ2dlckhlaWdodFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0ICE9PSB0cmlnZ2VyKSB7XG4gICAgICAgIGNvbnN0IHRyaWdnZXJCb3VuZHMgPSB0cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGxlZnQgKz0gdHJpZ2dlckxlZnQgLSB0cmlnZ2VyQm91bmRzLmxlZnRcbiAgICAgICAgdG9wICs9IHRyaWdnZXJUb3AgLSB0cmlnZ2VyQm91bmRzLnRvcFxuICAgICAgfVxuICAgICAgcG9wdXAuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgXG4gICAgICBwb3B1cC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgXG4gICAgfSxcblxuICAgIGFkZEZvY3VzRXZlbnRzKHBhcmVudCkge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgdGV4dGFyZWEnKVxuICAgICAgbGV0IGlucHV0XG5cbiAgICAgIHJldHVybiBjb21iaW5lRXZlbnRzKFxuICAgICAgICBhZGRFdmVudHModGFyZ2V0cywge1xuICAgICAgICAgIGZvY3VzOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmJsdXJUaW1lcilcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICAgICAgLy8gVXNlIHRpbWVvdXQgdG8gYWxsb3cgY2xpY2tlZCBpbnB1dHMgdG8gZ3JhYiBmb2N1c1xuICAgICAgICAgICAgdGhpcy5ibHVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLiRyZWZzLnBvcHVwLm1hdGNoZXMoJzpmb2N1cy13aXRoaW4nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMClcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuXG4gICAgICAgIGFkZEV2ZW50cyhwYXJlbnQsIHtcbiAgICAgICAgICBtb3VzZWRvd246IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJ2lucHV0LCB0ZXh0YXJlYSwgYnV0dG9uJykpIHtcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcygnLmRpdG8tYnV0dG9uLWNsZWFyJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgdHJpZ2dlciA9IHRoaXMudHJpZ2dlclRhcmdldCA/PyB0aGlzLiRyZWZzLnRyaWdnZXJcbiAgICAgICAgICAgICAgLy8gTWFyayB0cmlnZ2VyIGlucHV0IGFzIHJlYWRvbmx5IHNvIGl0IGNhbid0IGxvb3NlIGZvY3VzIHdoaWxlXG4gICAgICAgICAgICAgIC8vIHVzZXIgZG9lcyBvdGhlciBtb3VzZS1hY3Rpdml0aWVzIGluIHBvcHVwLlxuICAgICAgICAgICAgICBpbnB1dCA9IHRyaWdnZXIucXVlcnlTZWxlY3RvcignaW5wdXQsIHRleHRhcmVhJylcbiAgICAgICAgICAgICAgaWYgKGlucHV0ICYmICFpbnB1dC5oYXNBdHRyaWJ1dGUoJ3JlYWRvbmx5JykpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JywgJ3RydWUnKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gbnVsbFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIG1vdXNldXA6IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgICAgICAvLyBHaXZlIHNvbWUgdGltZSBmb3Igb3RoZXIgZXZlbnRzIHRvIHVwZGF0ZSBpbnB1dCBiZWZvcmUgaXRcbiAgICAgICAgICAgICAgLy8gYmVjb21lcyBlZGl0YWJsZSBhbmQgc3RpbGwgZm9jdXNlZCBhZ2Fpbi5cbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaW5wdXQucmVtb3ZlQXR0cmlidXRlKCdyZWFkb25seScpXG4gICAgICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcygnaW5wdXQsIHRleHRhcmVhLCBidXR0b24nKSkge1xuICAgICAgICAgICAgICAgICAgaW5wdXQuZm9jdXMoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnB1dCA9IG51bGxcbiAgICAgICAgICAgICAgfSwgMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfSxcblxuICAgIG9uU2hvd1BvcHVwKHNob3cpIHtcbiAgICAgIGlmIChzaG93KSB7XG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdmb2N1cycpIHtcbiAgICAgICAgICB0aGlzLnBvcHVwRXZlbnRzID0gdGhpcy5hZGRGb2N1c0V2ZW50cyh0aGlzLiRyZWZzLnBvcHVwKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3B1cEV2ZW50cz8ucmVtb3ZlKClcbiAgICAgICAgdGhpcy5wb3B1cEV2ZW50cyA9IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25DbGljaygpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Ib3ZlcihlbnRlcikge1xuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1vdXNlTGVhdmVUaW1lcilcbiAgICAgICAgaWYgKGVudGVyKSB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGlkZURlbGF5KSB7XG4gICAgICAgICAgICB0aGlzLm1vdXNlTGVhdmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgICB9LCB0aGlzLmhpZGVEZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcbkBpbXBvcnQgJy4uL3N0eWxlcy90cmFuc2l0aW9ucy9pbmRleC5zY3NzJztcblxuLmRpdG8tdHJpZ2dlci1jb250YWluZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5kaXRvLXRyaWdnZXItZGlzYWJsZWQge1xuICBjb2xvcjogJGNvbG9yLWRpc2FibGVkO1xuICBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XG4gIGN1cnNvcjogZGVmYXVsdDtcblxuICAqIHtcbiAgICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDtcbiAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAgICY6Zm9jdXMge1xuICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuLmRpdG8tcG9wdXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogJHotaW5kZXgtcG9wdXA7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWlucHV0KDpjbGFzcz1cImNsYXNzZXNcIilcbiAgc2xvdChuYW1lPVwiYmVmb3JlXCIpXG4gIGlucHV0KFxuICAgIDppZD1cImlkXCJcbiAgICByZWY9XCJpbnB1dFwiXG4gICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgOnR5cGU9XCJ0eXBlXCJcbiAgICA6bmFtZT1cIm5hbWVcIlxuICAgIDp0aXRsZT1cInRpdGxlXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgOnJlYWRvbmx5PVwicmVhZG9ubHlcIlxuICAgIDphdXRvZm9jdXM9XCJhdXRvZm9jdXNcIlxuICAgIDpwbGFjZWhvbGRlcj1cInBsYWNlaG9sZGVyXCJcbiAgICA6YXV0b2NvbXBsZXRlPVwiYXV0b2NvbXBsZXRlXCJcbiAgICA6YXJpYS1sYWJlbD1cInRpdGxlXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgKVxuICBzbG90KG5hbWU9XCJhZnRlclwiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnXSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogW1N0cmluZywgTnVtYmVyXSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndGV4dCcgfSxcbiAgICBpZDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRpdGxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgcmVhZG9ubHk6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBhdXRvZm9jdXM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBhdXRvY29tcGxldGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnb2ZmJyB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBob3ZlcmluZzogZmFsc2UsXG4gICAgICBmb2N1c2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNsYXNzZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kYXR0cnMuY2xhc3NcbiAgICB9LFxuXG4gICAgYXR0cmlidXRlcygpIHtcbiAgICAgIGNvbnN0IHsgY2xhc3M6IF8sIC4uLmF0dHJpYnV0ZXMgfSA9IHRoaXMuJGF0dHJzXG4gICAgICByZXR1cm4gYXR0cmlidXRlc1xuICAgIH0sXG5cbiAgICBpbnB1dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzLmlucHV0XG4gICAgfSxcblxuICAgIHNpemUoKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgc2l6ZSBiYXNlZCBvbiBtaW4gJiBtYXggc2V0dGluZ3MsIGlmIHRoZXkncmUgcHJvdmlkZWQuXG4gICAgICBjb25zdCB7IHNpemUsIG1pbiwgbWF4IH0gPSB0aGlzLiRhdHRyc1xuICAgICAgY29uc3QgZ2V0TGVuZ3RoID0gdmFsdWUgPT4gKHZhbHVlICE9IG51bGwgPyBgJHt2YWx1ZX1gLmxlbmd0aCA6IDApXG4gICAgICByZXR1cm4gc2l6ZSB8fCBnZXRMZW5ndGgobWluKSB8fCBnZXRMZW5ndGgobWF4KSB8fCB1bmRlZmluZWRcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gIT09IGZyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUoY3VycmVudFZhbHVlKSB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlICE9PSB0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjdXJyZW50VmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWlucHV0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXG4gIEBleHRlbmQgJWlucHV0O1xuXG4gIGlucHV0IHtcbiAgICAvLyBJbmhlcml0IGFsbCBzdHlsaW5nIGZyb20gLmRpdG8taW5wdXRcbiAgICBhbGw6IGluaGVyaXQ7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlcjogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5pLmRpdG8taWNvbihcbiAgOmNsYXNzPWB7XG4gICAgWydkaXRvLWljb24tLScgKyBuYW1lXTogdHJ1ZSxcbiAgICAnZGl0by1pY29uLS1kaXNhYmxlZCc6IGRpc2FibGVkXG4gIH1gXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBwcm9wczoge1xuICAgIG5hbWU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBkaXNhYmxlZDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4vLyBgeWFybiBidWlsZDppY29uc2AgY29udmVydHMgdGhlIGljb24gU1ZHIGZpbGVzIHRvIHNpbGVudCBjbGFzc2VzIGluc2lkZVxuLy8gYHNyYy9zdHlsZXMvbWl4aW5zL19pY29ucy5zY3NzYCwgbWFraW5nIHRoZW0gYXZhaWxhYmxlIHRvIGFsbCBvdGhlciBzYXNzXG4vLyBjb2RlIHRocm91Z2ggYF9pbXBvcnRzYC5cbi8vIEluIG9yZGVyIHRvIGJlIGFibGUgdG8gdXNlIHRoZW0gYXMgbm9ybWFsIENTUyBjbGFzc2VzLCBjb252ZXJ0IHRoZW0gaGVyZTpcbkBlYWNoICRuYW1lIGluICRpY29ucyB7XG4gIC5kaXRvLWljb24tLSN7JG5hbWV9IHtcbiAgICAmOjphZnRlciB7XG4gICAgICBAZXh0ZW5kICVpY29uLSN7JG5hbWV9O1xuXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLWljb24ge1xuICBAYXQtcm9vdCAuZGl0by1pbnB1dCAmIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgaW5zZXQ6ICRib3JkZXItd2lkdGg7XG4gICAgbGVmdDogdW5zZXQ7XG4gICAgd2lkdGg6IDJlbTtcbiAgICBmb250LXN0eWxlOiBub3JtYWw7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgY29sb3I6ICRjb2xvci1ncmV5O1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcblxuICAgICYtLWRpc2FibGVkIHtcbiAgICAgIGNvbG9yOiAkY29sb3ItbGlnaHQ7XG4gICAgfVxuICB9XG5cbiAgQGF0LXJvb3QgLmRpdG8taW5wdXQ6Zm9jdXMtd2l0aGluICYge1xuICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICB9XG59XG48L3N0eWxlPlxuIiwiZXhwb3J0IGZ1bmN0aW9uIHNldFNlbGVjdGlvbihpbnB1dCwgeyBzdGFydCwgZW5kIH0pIHtcbiAgaWYgKGlucHV0Py5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgIGlucHV0LmZvY3VzKClcbiAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb24oaW5wdXQpIHtcbiAgcmV0dXJuIGlucHV0ICYmICdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXRcbiAgICA/IHsgc3RhcnQ6IGlucHV0LnNlbGVjdGlvblN0YXJ0LCBlbmQ6IGlucHV0LnNlbGVjdGlvbkVuZCB9XG4gICAgOiBudWxsXG59XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblRyaWdnZXIuZGl0by1kYXRlLXBpY2tlcihcbiAgcmVmPVwidHJpZ2dlclwiXG4gIHYtbW9kZWw6c2hvdz1cInNob3dQb3B1cFwiXG4gIHRyaWdnZXI9XCJmb2N1c1wiXG4gIHYtYmluZD1cInsgdHJhbnNpdGlvbiwgcGxhY2VtZW50LCBkaXNhYmxlZCwgdGFyZ2V0IH1cIlxuKVxuICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICBzbG90KFxuICAgICAgdi1pZj1cIiRzbG90cy50cmlnZ2VyXCJcbiAgICAgIG5hbWU9XCJ0cmlnZ2VyXCJcbiAgICApXG4gICAgSW5wdXRGaWVsZC5kaXRvLWRhdGUtcGlja2VyLWlucHV0KFxuICAgICAgdi1lbHNlXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFRleHRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgOmNsYXNzPVwieyAnZGl0by1mb2N1cyc6IGZvY3VzZWQgfVwiXG4gICAgICB2LWJpbmQ9XCJ7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCwgLi4uJGF0dHJzIH1cIlxuICAgICAgQGZvY3VzPVwib25Gb2N1cyh0cnVlKVwiXG4gICAgICBAYmx1cj1cIm9uRm9jdXMoZmFsc2UpXCJcbiAgICAgIEBrZXlkb3duPVwib25LZXlEb3duXCJcbiAgICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uTW91c2VEb3duKGZhbHNlKVwiXG4gICAgKVxuICAgICAgdGVtcGxhdGUoI2JlZm9yZSlcbiAgICAgICAgc2xvdChuYW1lPVwiYmVmb3JlXCIpXG4gICAgICB0ZW1wbGF0ZSgjYWZ0ZXIpXG4gICAgICAgIEljb24oXG4gICAgICAgICAgbmFtZT1cImNhbGVuZGFyXCJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgICAgQG1vdXNlZG93bi5wcmV2ZW50PVwib25Nb3VzZURvd24odHJ1ZSlcIlxuICAgICAgICApXG4gICAgICAgIHNsb3QobmFtZT1cImFmdGVyXCIpXG4gIHRlbXBsYXRlKCNwb3B1cClcbiAgICBDYWxlbmRhci5kaXRvLWRhdGUtcGlja2VyLXBvcHVwKFxuICAgICAgcmVmPVwiY2FsZW5kYXJcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgICB2LWJpbmQ9XCJ7IGxvY2FsZSwgZGlzYWJsZWREYXRlIH1cIlxuICAgICAgQHNlbGVjdD1cInNob3dQb3B1cCA9IGZhbHNlXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZm9ybWF0LCBkZWZhdWx0Rm9ybWF0cyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgVHJpZ2dlciBmcm9tICcuL1RyaWdnZXIudnVlJ1xuaW1wb3J0IENhbGVuZGFyIGZyb20gJy4vQ2FsZW5kYXIudnVlJ1xuaW1wb3J0IElucHV0RmllbGQgZnJvbSAnLi9JbnB1dEZpZWxkLnZ1ZSdcbmltcG9ydCBJY29uIGZyb20gJy4vSWNvbi52dWUnXG5pbXBvcnQgeyBwYXJzZURhdGUsIGdldERhdGVQYXJ0QXRQb3NpdGlvbiB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5pbXBvcnQgeyBnZXRTZWxlY3Rpb24sIHNldFNlbGVjdGlvbiB9IGZyb20gJy4uL3V0aWxzL3NlbGVjdGlvbi5qcydcbmltcG9ydCB7IGdldEtleU5hdmlnYXRpb24gfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcbmltcG9ydCB7IGdldFRhcmdldCB9IGZyb20gJy4uL3V0aWxzL3RyaWdnZXIuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBUcmlnZ2VyLCBDYWxlbmRhciwgSW5wdXRGaWVsZCwgSWNvbiB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICd1cGRhdGU6c2hvdycsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tLWxlZnQnIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogJ3RyaWdnZXInIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGZvcm1hdDoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4gKHtcbiAgICAgICAgZGF0ZTogZGVmYXVsdEZvcm1hdHMuZGF0ZSxcbiAgICAgICAgdGltZTogZmFsc2VcbiAgICAgIH0pXG4gICAgfSxcbiAgICBkaXNhYmxlZERhdGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEZvY3VzZWQgfHwgdGhpcy5zaG93UG9wdXBcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gZ2V0VGFyZ2V0KHRoaXMpPy5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpXG4gICAgfSxcblxuICAgIGZvcm1hdE9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAuLi50aGlzLmZvcm1hdFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpIHx8ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKVxuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gZGF0ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICgrdmFsdWUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25Gb2N1cyhmb2N1cykge1xuICAgICAgdGhpcy5pbnB1dEZvY3VzZWQgPSBmb2N1c1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBmb2N1c1xuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IHsgdmVyOiBzdGVwLCBlbnRlciB9ID0gZ2V0S2V5TmF2aWdhdGlvbihldmVudClcbiAgICAgIGlmIChzdGVwIHx8IGVudGVyKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdldFNlbGVjdGlvbih0aGlzLmlucHV0KT8uc3RhcnRcbiAgICAgICAgY29uc3QgZ2V0RGF0ZVBhcnQgPSBwb3NpdGlvbiA9PlxuICAgICAgICAgIGdldERhdGVQYXJ0QXRQb3NpdGlvbih0aGlzLmN1cnJlbnRUZXh0LCBwb3NpdGlvbiwgdGhpcy5mb3JtYXRPcHRpb25zKVxuXG4gICAgICAgIGlmIChzdGVwICYmICF0aGlzLnNob3dQb3B1cCkge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHsgY2FsZW5kYXIgfSA9IHRoaXMuJHJlZnNcbiAgICAgICAgICBpZiAoY2FsZW5kYXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZTogbW9kZSwgc3RhcnQgfSA9IGdldERhdGVQYXJ0KHBvc2l0aW9uKSB8fCB7fVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBtb2RlICYmXG4gICAgICAgICAgICAgIGNhbGVuZGFyLm5hdmlnYXRlKHsgc3RlcCwgZW50ZXIsIG1vZGUsIHVwZGF0ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbih0aGlzLmlucHV0LCBnZXREYXRlUGFydChzdGFydCkpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbk1vdXNlRG93bih0b2dnbGUpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gIXRoaXMuZGlzYWJsZWQgJiYgKCF0b2dnbGUgfHwgIXRoaXMuc2hvd1BvcHVwKVxuICAgICAgaWYgKHRoaXMuc2hvd1BvcHVwKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRhdGUtcGlja2VyIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWluLXdpZHRoOiA4ZW07XG4gIH1cbn1cblxuLmRpdG8tZGF0ZS1waWNrZXItcG9wdXAge1xuICBtYXJnaW46ICRwb3B1cC1tYXJnaW47XG59XG48L3N0eWxlPlxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5UcmlnZ2VyLmRpdG8tdGltZS1waWNrZXIoXG4gIHJlZj1cInRyaWdnZXJcIlxuICB2LW1vZGVsOnNob3c9XCJzaG93UG9wdXBcIlxuICB0cmlnZ2VyPVwiZm9jdXNcIlxuICB2LWJpbmQ9XCJ7IHRyYW5zaXRpb24sIHBsYWNlbWVudCwgZGlzYWJsZWQsIHRhcmdldCB9XCJcbilcbiAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgc2xvdChcbiAgICAgIHYtaWY9XCIkc2xvdHMudHJpZ2dlclwiXG4gICAgICBuYW1lPVwidHJpZ2dlclwiXG4gICAgKVxuICAgIElucHV0RmllbGQuZGl0by10aW1lLXBpY2tlci1pbnB1dChcbiAgICAgIHYtZWxzZVxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBmb2N1c2VkIH1cIlxuICAgICAgdi1iaW5kPVwieyBwbGFjZWhvbGRlciwgZGlzYWJsZWQsIC4uLiRhdHRycyB9XCJcbiAgICAgIEBmb2N1cz1cIm9uRm9jdXModHJ1ZSlcIlxuICAgICAgQGJsdXI9XCJvbkZvY3VzKGZhbHNlKVwiXG4gICAgICBAa2V5ZG93bj1cIm9uS2V5RG93blwiXG4gICAgICBAbW91c2Vkb3duLnN0b3A9XCJvbk1vdXNlRG93bihmYWxzZSlcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCNiZWZvcmUpXG4gICAgICAgIHNsb3QobmFtZT1cImJlZm9yZVwiKVxuICAgICAgdGVtcGxhdGUoI2FmdGVyKVxuICAgICAgICBJY29uKFxuICAgICAgICAgIG5hbWU9XCJjbG9ja1wiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIEBtb3VzZWRvd24ucHJldmVudD1cIm9uTW91c2VEb3duKHRydWUpXCJcbiAgICAgICAgKVxuICAgICAgICBzbG90KG5hbWU9XCJhZnRlclwiKVxuICB0ZW1wbGF0ZSgjcG9wdXApXG4gICAgLmRpdG8tdGltZS1waWNrZXItcG9wdXBcbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItaG91cihyZWY9XCJob3VyXCIpXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImluZGV4IGluIDI0XCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBsaShcbiAgICAgICAgICAgICAgdi1pZj1cIiFkaXNhYmxlZEhvdXIoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgc2VsZWN0ZWQ6IGhvdXIgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwiaG91ciA9IGluZGV4IC0gMVwiXG4gICAgICAgICAgICApIHt7IGxlZnRQYWQoaW5kZXggLSAxKSB9fVxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1taW51dGUocmVmPVwibWludXRlXCIpXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImluZGV4IGluIDYwXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBsaShcbiAgICAgICAgICAgICAgdi1pZj1cIiFkaXNhYmxlZE1pbnV0ZShpbmRleCAtIDEpXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyBzZWxlY3RlZDogbWludXRlID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cIm1pbnV0ZSA9IGluZGV4IC0gMVwiXG4gICAgICAgICAgICApIHt7IGxlZnRQYWQoaW5kZXggLSAxKSB9fVxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1zZWNvbmQocmVmPVwic2Vjb25kXCIpXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImluZGV4IGluIDYwXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBsaShcbiAgICAgICAgICAgICAgdi1pZj1cIiFkaXNhYmxlZFNlY29uZChpbmRleCAtIDEpXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyBzZWxlY3RlZDogc2Vjb25kID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlY29uZCA9IGluZGV4IC0gMVwiXG4gICAgICAgICAgICApIHt7IGxlZnRQYWQoaW5kZXggLSAxKSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGZvcm1hdCwgZGVmYXVsdEZvcm1hdHMgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi9UcmlnZ2VyLnZ1ZSdcbmltcG9ydCBJbnB1dEZpZWxkIGZyb20gJy4vSW5wdXRGaWVsZC52dWUnXG5pbXBvcnQgSWNvbiBmcm9tICcuL0ljb24udnVlJ1xuaW1wb3J0IHsgYWx0ZXJEYXRlLCBwYXJzZURhdGUsIGdldERhdGVQYXJ0QXRQb3NpdGlvbiB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5pbXBvcnQgeyBnZXRTZWxlY3Rpb24sIHNldFNlbGVjdGlvbiB9IGZyb20gJy4uL3V0aWxzL3NlbGVjdGlvbi5qcydcbmltcG9ydCB7IGdldEtleU5hdmlnYXRpb24gfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcbmltcG9ydCB7IGdldFRhcmdldCB9IGZyb20gJy4uL3V0aWxzL3RyaWdnZXIuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBUcmlnZ2VyLCBJbnB1dEZpZWxkLCBJY29uIH0sXG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ3VwZGF0ZTpzaG93JywgJ2NoYW5nZScsICdmb2N1cycsICdibHVyJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20tbGVmdCcgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB0YXJnZXQ6IHsgdHlwZTogW1N0cmluZywgSFRNTEVsZW1lbnRdLCBkZWZhdWx0OiAndHJpZ2dlcicgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZm9ybWF0OiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiAoKSA9PiAoe1xuICAgICAgICB0aW1lOiBkZWZhdWx0Rm9ybWF0cy50aW1lLFxuICAgICAgICBkYXRlOiBmYWxzZVxuICAgICAgfSlcbiAgICB9LFxuICAgIGRpc2FibGVkSG91cjogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBkaXNhYmxlZE1pbnV0ZTogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBkaXNhYmxlZFNlY29uZDogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBpbnB1dEZvY3VzZWQ6IGZhbHNlLFxuICAgICAgaWdub3JlTmV4dENoYW5nZTogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGb2N1c2VkIHx8IHRoaXMuc2hvd1BvcHVwXG4gICAgfSxcblxuICAgIGlucHV0KCkge1xuICAgICAgcmV0dXJuIGdldFRhcmdldCh0aGlzKT8ucXVlcnlTZWxlY3RvcignaW5wdXQnKVxuICAgIH0sXG5cbiAgICBmb3JtYXRPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgLi4udGhpcy5mb3JtYXRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFRleHQ6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh0aGlzLmN1cnJlbnRWYWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKSB8fCAnJ1xuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBwYXJzZURhdGUodmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucylcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGRhdGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50RGF0ZSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlIHx8XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBEYXRlKCkgb2JqZWN0IHdpdGggdGhlIHRpbWUgc2V0IHRvIDAsIHRvIGJlIHVzZWQgd2hlblxuICAgICAgICAvLyBmaXJzdCBzZXR0aW5nIGFueSBvZiB0aGUgdGltZXMsIGZvciBtZWFuaW5nZnVsIGRhdGVzIGluIGNhc2UgdGhlXG4gICAgICAgIC8vIG9iamVjdCBpcyBzaGFyZWQgd2l0aCBhIERhdGVQaWNrZXIsIGUuZy4gdGhyb3VnaCBEYXRlVGltZVBpY2tlci5cbiAgICAgICAgYWx0ZXJEYXRlKG5ldyBEYXRlKCksIHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAsIG1pbGxpc2Vjb25kOiAwIH0pXG4gICAgICApXG4gICAgfSxcblxuICAgIGhvdXI6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERhdGUuZ2V0SG91cnMoKVxuICAgICAgfSxcblxuICAgICAgc2V0KGhvdXIpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgaG91ciB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBtaW51dGU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERhdGUuZ2V0TWludXRlcygpXG4gICAgICB9LFxuXG4gICAgICBzZXQobWludXRlKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZSh7IG1pbnV0ZSB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZWNvbmQ6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERhdGUuZ2V0U2Vjb25kcygpXG4gICAgICB9LFxuXG4gICAgICBzZXQoc2Vjb25kKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZSh7IHNlY29uZCB9KVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgICAgdGhpcy5zY3JvbGxBbGwodHJ1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKHZhbHVlKSB7XG4gICAgICBpZiAoK3ZhbHVlICE9PSArdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsdWUpXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbHVlKVxuICAgICAgICB0aGlzLnNjcm9sbEFsbCh0cnVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dCgpIHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbihpbnB1dClcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5mb2N1c2VkICYmXG4gICAgICAgICF0aGlzLmlnbm9yZU5leHRDaGFuZ2UgJiZcbiAgICAgICAgc2VsZWN0aW9uLnN0YXJ0ID09PSBzZWxlY3Rpb24uZW5kXG4gICAgICApIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gc2V0U2VsZWN0aW9uKGlucHV0LCBzZWxlY3Rpb24pKVxuICAgICAgfVxuICAgICAgdGhpcy5pZ25vcmVOZXh0Q2hhbmdlID0gZmFsc2VcbiAgICB9LFxuXG4gICAgc2hvdyhzaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHNob3dcbiAgICB9LFxuXG4gICAgc2hvd1BvcHVwKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8pIHtcbiAgICAgICAgdGhpcy5zY3JvbGxBbGwoZmFsc2UpXG4gICAgICB9XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBsZWZ0UGFkKHZhbHVlKSB7XG4gICAgICByZXR1cm4gKCcwJyArIHZhbHVlKS5zbGljZSgtMilcbiAgICB9LFxuXG4gICAgc2V0VGltZShvdmVycmlkZXMpIHtcbiAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gYWx0ZXJEYXRlKHRoaXMuY3VycmVudERhdGUsIHtcbiAgICAgICAgLi4ub3ZlcnJpZGVzLFxuICAgICAgICBtaWxsaXNlY29uZDogMFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc2Nyb2xsQWxsKHNtb290aCkge1xuICAgICAgY29uc3Qgc2Nyb2xsID0gKHJlZiwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4kcmVmc1tyZWZdXG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gKFxuICAgICAgICAgICAgdGFyZ2V0LnNjcm9sbEhlaWdodCAvXG4gICAgICAgICAgICAvLyBGaXJzdCBhbmQgbGFzdCBvbmUgYWRkIDMgdGltZXMgdGhlIG1hcmdpbi5cbiAgICAgICAgICAgICh0YXJnZXQuY2hpbGRFbGVtZW50Q291bnQgKyA2KVxuICAgICAgICAgIClcbiAgICAgICAgICBjb25zdCB0b3AgPSBNYXRoLnJvdW5kKHZhbHVlICogbGluZUhlaWdodClcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKHRhcmdldC5zY3JvbGxUb3AgLSB0b3ApXG4gICAgICAgICAgdGFyZ2V0LnNjcm9sbFRvKHtcbiAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgIGJlaGF2aW9yOiBzbW9vdGggJiYgZGlzdGFuY2UgPCAxMDAgPyAnc21vb3RoJyA6ICdhdXRvJ1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgc2Nyb2xsKCdob3VyJywgdGhpcy5ob3VyKVxuICAgICAgICBzY3JvbGwoJ21pbnV0ZScsIHRoaXMubWludXRlKVxuICAgICAgICBzY3JvbGwoJ3NlY29uZCcsIHRoaXMuc2Vjb25kKVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgb25Gb2N1cyhmb2N1cykge1xuICAgICAgdGhpcy5pbnB1dEZvY3VzZWQgPSBmb2N1c1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBmb2N1c1xuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbihpbnB1dClcbiAgICAgIGNvbnN0IHsgdmVyOiBzdGVwLCBlbnRlciB9ID0gZ2V0S2V5TmF2aWdhdGlvbihldmVudClcbiAgICAgIGlmIChzdGVwIHx8IGVudGVyKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgICAgICBjb25zdCBnZXREYXRlUGFydCA9IHBvc2l0aW9uID0+XG4gICAgICAgICAgZ2V0RGF0ZVBhcnRBdFBvc2l0aW9uKHRoaXMuY3VycmVudFRleHQsIHBvc2l0aW9uLCB0aGlzLmZvcm1hdE9wdGlvbnMpXG5cbiAgICAgICAgaWYgKHN0ZXApIHtcbiAgICAgICAgICBpZiAoIXRoaXMuc2hvd1BvcHVwKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeyBuYW1lLCBzdGFydCB9ID0gZ2V0RGF0ZVBhcnQoc2VsZWN0aW9uLnN0YXJ0KSB8fCB7fVxuICAgICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW25hbWVdICsgc3RlcFxuICAgICAgICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuJHJlZnNbbmFtZV0uY2hpbGRFbGVtZW50Q291bnRcbiAgICAgICAgICAgICAgdGhpc1tuYW1lXSA9XG4gICAgICAgICAgICAgICAgdmFsdWUgPCAwXG4gICAgICAgICAgICAgICAgICA/IHZhbHVlICsgY291bnRcbiAgICAgICAgICAgICAgICAgIDogdmFsdWUgPj0gY291bnRcbiAgICAgICAgICAgICAgICAgICAgPyB2YWx1ZSAtIGNvdW50XG4gICAgICAgICAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgICAgICAgdGhpcy5pZ25vcmVOZXh0Q2hhbmdlID0gdHJ1ZVxuICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24oaW5wdXQsIGdldERhdGVQYXJ0KHN0YXJ0KSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGVudGVyKSB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdGlvbi5zdGFydCA9PT0gc2VsZWN0aW9uLmVuZCkge1xuICAgICAgICBjb25zdCB7IHZhbHVlIH0gPSBpbnB1dFxuICAgICAgICBsZXQgcG9zID0gc2VsZWN0aW9uLnN0YXJ0XG5cbiAgICAgICAgY29uc3QgaXNEaWdpdCA9IGNoYXIgPT4gIWlzTmFOKHBhcnNlSW50KGNoYXIsIDEwKSlcblxuICAgICAgICBpZiAoZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGlmIChpc0RpZ2l0KGV2ZW50LmtleSkgJiYgcG9zIDwgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHZhbHVlW3Bvc10gPT09ICc6JyAmJlxuICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3BvcyAtIDFdKSAmJlxuICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3BvcyAtIDJdKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHBvcysrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZW1vdmUgbmV4dCBkaWdpdCBzbyB0aGUgZXZlbnQgb3ZlcnJpZGVzIGl0IGluc3RlYWQgb2YgaW5zZXJ0aW5nXG4gICAgICAgICAgICAvLyBuZXcgY2hhcnMuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zXSkgJiYgKFxuICAgICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zICsgMV0pIHx8XG4gICAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3MgLSAxXSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gKFxuICAgICAgICAgICAgICAgIHZhbHVlLnNsaWNlKDAsIHBvcykgK1xuICAgICAgICAgICAgICAgIHZhbHVlLnNsaWNlKHBvcyArIDEpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKGlucHV0LCB7IHN0YXJ0OiBwb3MsIGVuZDogcG9zIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGZvcm1hdCh0aGlzLmN1cnJlbnRWYWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKS5sZW5ndGhcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IGxlbmd0aCkge1xuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA+IGxlbmd0aCkge1xuICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGxlbmd0aClcbiAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKGlucHV0LCBzZWxlY3Rpb24pXG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBvcyA9PT0gMSB8fFxuICAgICAgICAgICAgWycgJywgJzonXS5pbmNsdWRlcyh2YWx1ZVtwb3MgLSAyXSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcG9zID09PSB2YWx1ZS5sZW5ndGggfHxcbiAgICAgICAgICAgICAgdmFsdWVbcG9zXSA9PT0gJzonXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcG9zLS1cbiAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAoXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMCwgcG9zKSArXG4gICAgICAgICAgICAgICAgKCh2YWx1ZVtwb3MgLSAxXSA/PyAnJykgKyAnMDAnKSArXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UocG9zICsgMSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oaW5wdXQsIHsgc3RhcnQ6IHBvcywgZW5kOiBwb3MgfSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zXSkgJiZcbiAgICAgICAgICAgICAgIWlzRGlnaXQoK3ZhbHVlW3BvcyArIDFdKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIFdoZW4gcmVtb3ZpbmcgdGhlIGZpcnN0IG9mIHR3byBkaWdpdHMsIHJlcGxhY2Ugd2l0aCAwXG4gICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgcG9zKSArICcwJyArIHZhbHVlLnNsaWNlKHBvcylcbiAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKGlucHV0LCB7IHN0YXJ0OiBwb3MsIGVuZDogcG9zIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uTW91c2VEb3duKHRvZ2dsZSkge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSAhdGhpcy5kaXNhYmxlZCAmJiAoIXRvZ2dsZSB8fCAhdGhpcy5zaG93UG9wdXApXG4gICAgICBpZiAodGhpcy5zaG93UG9wdXApIHtcbiAgICAgICAgdGhpcy5mb2N1cygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tdGltZS1waWNrZXIge1xuICAuZGl0by1pbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWluLXdpZHRoOiA2ZW07XG4gIH1cbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAge1xuICBtYXgtd2lkdGg6IDE2MHB4O1xuICBtYXJnaW46ICRwb3B1cC1tYXJnaW47XG59XG5cbiR0aW1lLXBpY2tlci1saW5lLWhlaWdodDogMjRweDtcblxuLmRpdG8tdGltZS1waWNrZXIge1xuICAuZGl0by1pbnB1dCB7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXdpZHRoOiAwIDFweCAwO1xuICBtYXJnaW4tbGVmdDogLTFweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgd2lkdGg6IGNhbGMoMTAwJSAvIDMgKyAxcHgpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gICY6bGFzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXJpZ2h0OiAwO1xuICB9XG5cbiAgdWwge1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWFyZ2luOiAwO1xuICAgIC8vIEhpZGUgc2Nyb2xsYmFyOlxuICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAgIHBhZGRpbmc6IDAgMTdweCAwIDA7XG4gICAgaGVpZ2h0OiA3ICogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuXG4gICAgJiA+IGxpIHtcbiAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6ICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDMgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDMgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xuICAgICAgfVxuXG4gICAgICAmLnNlbGVjdGVkLFxuICAgICAgJi5zZWxlY3RlZDpob3ZlciB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIH1cblxuICAgICAgJi5kaXNhYmxlZCB7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgICAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgICAgIH1cblxuICAgICAgJi5kaXNhYmxlZDpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1kYXRlLXRpbWUtcGlja2VyKHJlZj1cInBpY2tlclwiKVxuICAuZGl0by1kYXRlLXRpbWUtcGlja2VyX19pbm5lcig6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogZm9jdXNlZCB9XCIpXG4gICAgSW5wdXRGaWVsZC5kaXRvLWRhdGUtdGltZS1waWNrZXJfX2lucHV0KFxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBmb2N1c2VkIH1cIlxuICAgICAgdi1iaW5kPVwieyBwbGFjZWhvbGRlciwgZGlzYWJsZWQsIC4uLiRhdHRycyB9XCJcbiAgICAgIEBmb2N1cz1cIm9uRm9jdXModHJ1ZSlcIlxuICAgICAgQGJsdXI9XCJvbkZvY3VzKGZhbHNlKVwiXG4gICAgICBAa2V5ZG93bj1cIm9uS2V5RG93blwiXG4gICAgICBAbW91c2Vkb3duLnN0b3A9XCJvbk1vdXNlRG93bihmYWxzZSlcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCNiZWZvcmUpXG4gICAgICAgIHNsb3QobmFtZT1cImJlZm9yZVwiKVxuICAgICAgdGVtcGxhdGUoI2FmdGVyKVxuICAgICAgICBJY29uKFxuICAgICAgICAgIG5hbWU9XCJjYWxlbmRhclwiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIEBtb3VzZWRvd24ucHJldmVudD1cIm9uTW91c2VEb3duKHRydWUpXCJcbiAgICAgICAgKVxuICAgICAgICBzbG90KG5hbWU9XCJhZnRlclwiKVxuICAgIERhdGVQaWNrZXIoXG4gICAgICByZWY9XCJkYXRlXCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgICAgdi1tb2RlbDpzaG93PVwic2hvd0RhdGVcIlxuICAgICAgcGxhY2VtZW50PVwiYm90dG9tLWxlZnRcIlxuICAgICAgOnRhcmdldD1cIiRyZWZzLnBpY2tlclwiXG4gICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICAgICAgLy8tIEludGVudGlvbmFsbHkgZW1wdHlcbiAgICBUaW1lUGlja2VyKFxuICAgICAgcmVmPVwidGltZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dUaW1lXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1yaWdodFwiXG4gICAgICA6dGFyZ2V0PVwiJHJlZnMucGlja2VyXCJcbiAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgICAgICAvLy0gSW50ZW50aW9uYWxseSBlbXB0eVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGZvcm1hdCwgZGVmYXVsdEZvcm1hdHMsIGFzc2lnbkRlZXBseSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgSW5wdXRGaWVsZCBmcm9tICcuL0lucHV0RmllbGQudnVlJ1xuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSAnLi9EYXRlUGlja2VyLnZ1ZSdcbmltcG9ydCBUaW1lUGlja2VyIGZyb20gJy4vVGltZVBpY2tlci52dWUnXG5pbXBvcnQgSWNvbiBmcm9tICcuL0ljb24udnVlJ1xuaW1wb3J0IHsgcGFyc2VEYXRlIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZS5qcydcbmltcG9ydCB7IGdldFNlbGVjdGlvbiwgc2V0U2VsZWN0aW9uIH0gZnJvbSAnLi4vdXRpbHMvc2VsZWN0aW9uLmpzJ1xuaW1wb3J0IHsgZ2V0S2V5TmF2aWdhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgSW5wdXRGaWVsZCwgRGF0ZVBpY2tlciwgVGltZVBpY2tlciwgSWNvbiB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBmb3JtYXQ6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dEYXRlOiBmYWxzZSxcbiAgICAgIHNob3dUaW1lOiBmYWxzZSxcbiAgICAgIGlucHV0Rm9jdXNlZDogZmFsc2UsXG4gICAgICBkYXRlRm9jdXNlZDogZmFsc2UsXG4gICAgICB0aW1lRm9jdXNlZDogZmFsc2UsXG4gICAgICBjbG9zZWRNb2RlOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgYXR0cmlidXRlcygpIHtcbiAgICAgIGNvbnN0IHsgdHJhbnNpdGlvbiwgZGlzYWJsZWQsIGxvY2FsZSwgZm9ybWF0T3B0aW9uczogZm9ybWF0IH0gPSB0aGlzXG4gICAgICByZXR1cm4geyB0cmFuc2l0aW9uLCBkaXNhYmxlZCwgbG9jYWxlLCBmb3JtYXQgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGb2N1c2VkIHx8IHRoaXMuc2hvd0RhdGUgfHwgdGhpcy5zaG93VGltZVxuICAgIH0sXG5cbiAgICBpbnB1dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzLmlucHV0LmlucHV0XG4gICAgfSxcblxuICAgIGZvcm1hdE9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4gYXNzaWduRGVlcGx5KFxuICAgICAgICB7XG4gICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICB0aW1lOiBkZWZhdWx0Rm9ybWF0cy50aW1lLFxuICAgICAgICAgIGRhdGU6IGRlZmF1bHRGb3JtYXRzLmRhdGVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICAgICAgZm9ybWF0OiAodmFsdWUsIHR5cGUsIG9wdGlvbnMpID0+XG4gICAgICAgICAgICAgIHR5cGUgPT09ICdsaXRlcmFsJyAmJiAvXFxiYXRcXGIvLnRlc3QodmFsdWUpXG4gICAgICAgICAgICAgICAgPyAnLCAnXG4gICAgICAgICAgICAgICAgOiB0aGlzLmZvcm1hdD8uZGF0ZT8uZm9ybWF0Py4odmFsdWUsIHR5cGUsIG9wdGlvbnMpID8/IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0aGlzLmZvcm1hdFxuICAgICAgKVxuICAgIH0sXG5cbiAgICB0aW1lSW5kZXgoKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5jdXJyZW50VGV4dFxuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgY29uc3QgdGltZSA9IHRleHQubWF0Y2goLyhbXFxTXStcXHMqKSQvKT8uWzFdXG4gICAgICAgIGlmICh0aW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoIC0gdGltZS5sZW5ndGhcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgY3VycmVudFRleHQ6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh0aGlzLmN1cnJlbnRWYWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKSB8fCAnJ1xuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBwYXJzZURhdGUodmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucylcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24odGhpcy5pbnB1dClcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGRhdGVcbiAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24odGhpcy5pbnB1dCwgc2VsZWN0aW9uKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKHZhbHVlKSB7XG4gICAgICBpZiAoK3ZhbHVlICE9PSArdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsdWUpXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbHVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25Gb2N1cyhmb2N1cykge1xuICAgICAgdGhpcy5pbnB1dEZvY3VzZWQgPSBmb2N1c1xuICAgICAgaWYgKGZvY3VzKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUG9wdXBzKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd0RhdGUgPSBmYWxzZVxuICAgICAgICB0aGlzLnNob3dUaW1lID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Nb3VzZURvd24odG9nZ2xlKSB7XG4gICAgICBpZiAodG9nZ2xlICYmICh0aGlzLnNob3dEYXRlIHx8IHRoaXMuc2hvd1RpbWUpKSB7XG4gICAgICAgIHRoaXMuc2hvd0RhdGUgPSBmYWxzZVxuICAgICAgICB0aGlzLnNob3dUaW1lID0gZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnVwZGF0ZVBvcHVwcygpKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmdldE1vZGUoZXZlbnQpXG4gICAgICB0aGlzLiRyZWZzW21vZGVdLm9uS2V5RG93bihldmVudClcbiAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkTW9kZSA9IG1vZGVcbiAgICAgIH0gZWxzZSBpZiAobW9kZSAhPT0gdGhpcy5jbG9zZWRNb2RlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUG9wdXBzKG1vZGUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldE1vZGUoZXZlbnQgPSBudWxsKSB7XG4gICAgICBjb25zdCB7IHN0YXJ0IH0gPSBnZXRTZWxlY3Rpb24odGhpcy5pbnB1dClcbiAgICAgIGNvbnN0IHsgaG9yOiBzdGVwIH0gPSBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KVxuICAgICAgcmV0dXJuIHRoaXMudGltZUluZGV4ID09PSBudWxsIHx8IHN0YXJ0ICsgc3RlcCA8IHRoaXMudGltZUluZGV4XG4gICAgICAgID8gJ2RhdGUnXG4gICAgICAgIDogJ3RpbWUnXG4gICAgfSxcblxuICAgIHVwZGF0ZVBvcHVwcyhtb2RlID0gdGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgIGlmIChtb2RlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkTW9kZSA9IG51bGxcbiAgICAgIH1cbiAgICAgIHRoaXMuc2hvd0RhdGUgPSBtb2RlID09PSAnZGF0ZSdcbiAgICAgIHRoaXMuc2hvd1RpbWUgPSBtb2RlID09PSAndGltZSdcbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1kYXRlLXRpbWUtcGlja2VyIHtcbiAgJl9faW5uZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gIH1cblxuICAmX19pbnB1dCB7XG4gICAgZmxleDogMTtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIG1pbi13aWR0aDogMTJlbTtcbiAgfVxuXG4gIC5kaXRvLWRhdGUtcGlja2VyLFxuICAuZGl0by10aW1lLXBpY2tlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPCEtLSBlc2xpbnQtZGlzYWJsZSB2dWUvbm8tdGVtcGxhdGUtc2hhZG93IC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXBhZ2luYXRpb25cbiAgLmRpdG8tcGFnaW5hdGlvbi10b3RhbChcbiAgICB2LWlmPVwic2hvd1RvdGFsXCJcbiAgKVxuICAgIHRlbXBsYXRlKFxuICAgICAgdi1pZj1cInRvdGFsID4gMFwiXG4gICAgKSB7eyBmaXJzdCB9fSDigJMge3sgbGFzdCB9fSAvIHt7IHRvdGFsIH19XG4gIC5kaXRvLWJ1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kKFxuICAgIHYtaWY9XCJudW1QYWdlcyA+IDFcIlxuICApXG4gICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgdi1mb3I9XCJidXR0b24gaW4gYnV0dG9uc1wiXG4gICAgICA6Y2xhc3M9XCJnZXRCdXR0b25DbGFzc2VzKGJ1dHRvbilcIlxuICAgICAgOmRpc2FibGVkPVwiYnV0dG9uLmRpc2FibGVkXCJcbiAgICAgIEBjbGljaz1cIm9uQ2xpY2tCdXR0b24oYnV0dG9uKVwiXG4gICAgKVxuICAgICAgc3BhbihcbiAgICAgICAgdi1pZj1cImJ1dHRvbi50ZXh0XCJcbiAgICAgICkge3sgYnV0dG9uLnRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTpwYWdlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICB0b3RhbDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBwYWdlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMSB9LFxuICAgIHBhZ2VTaXplOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTAgfSxcbiAgICBzaG93VG90YWw6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1ByZXY6IHRydWUsXG4gICAgICBzaG93TmV4dDogdHJ1ZSxcbiAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmaXJzdCgpIHtcbiAgICAgIHJldHVybiAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZSArIDFcbiAgICB9LFxuXG4gICAgbGFzdCgpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLmZpcnN0ICsgdGhpcy5wYWdlU2l6ZSAtIDEsIHRoaXMudG90YWwpXG4gICAgfSxcblxuICAgIG51bVBhZ2VzKCkge1xuICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLnRvdGFsIC8gdGhpcy5wYWdlU2l6ZSlcbiAgICB9LFxuXG4gICAgYnV0dG9ucygpIHtcbiAgICAgIGNvbnN0IHsgc2hvd1ByZXYsIHNob3dOZXh0LCBjdXJyZW50UGFnZSwgbnVtUGFnZXMgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHNob3dMZW5ndGggPSBzaG93UHJldiArIHNob3dOZXh0ICsgMVxuXG4gICAgICBsZXQgc3RhcnQgPSAxXG4gICAgICBsZXQgZW5kID0gMVxuICAgICAgaWYgKG51bVBhZ2VzIDw9IHNob3dMZW5ndGgpIHtcbiAgICAgICAgZW5kID0gbnVtUGFnZXNcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFBhZ2UgPD0gc2hvd1ByZXYgKyAxKSB7XG4gICAgICAgIGVuZCA9IHNob3dMZW5ndGhcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFBhZ2UgPj0gbnVtUGFnZXMgLSBzaG93TmV4dCkge1xuICAgICAgICBlbmQgPSBudW1QYWdlc1xuICAgICAgICBzdGFydCA9IG51bVBhZ2VzIC0gc2hvd0xlbmd0aCArIDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0ID0gY3VycmVudFBhZ2UgLSBzaG93UHJldlxuICAgICAgICBlbmQgPSBjdXJyZW50UGFnZSArIHNob3dOZXh0XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvbnMgPSBbXVxuICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgaW5kZXg6IGN1cnJlbnRQYWdlIC0gMSxcbiAgICAgICAgdHlwZTogJ3ByZXYnLFxuICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPD0gMVxuICAgICAgfSlcbiAgICAgIGlmIChzdGFydCA+PSAyKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7IGluZGV4OiAxLCB0ZXh0OiAxIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgPiAyKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IE1hdGgubWF4KDEsIGN1cnJlbnRQYWdlIC0gMTApLFxuICAgICAgICAgIHR5cGU6ICdlbGxpcHNpcy1wcmV2J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgdGV4dDogaSxcbiAgICAgICAgICBhY3RpdmU6IGkgPT09IGN1cnJlbnRQYWdlXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoZW5kIDwgbnVtUGFnZXMgLSAxKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IE1hdGgubWluKG51bVBhZ2VzLCBjdXJyZW50UGFnZSArIDEwKSxcbiAgICAgICAgICB0eXBlOiAnZWxsaXBzaXMtbmV4dCdcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPD0gbnVtUGFnZXMgLSAxKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7IGluZGV4OiBudW1QYWdlcywgdGV4dDogbnVtUGFnZXMgfSlcbiAgICAgIH1cbiAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgIGluZGV4OiBjdXJyZW50UGFnZSArIDEsXG4gICAgICAgIHR5cGU6ICduZXh0JyxcbiAgICAgICAgZGlzYWJsZWQ6IGN1cnJlbnRQYWdlID49IG51bVBhZ2VzXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gYnV0dG9uc1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHBhZ2UocGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2VcbiAgICB9LFxuXG4gICAgcGFnZVNpemUoKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA+IHRoaXMubnVtUGFnZXMpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMubnVtUGFnZXNcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFBhZ2UodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byAhPT0gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6cGFnZScsIHRvKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnBhZ2VcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0QnV0dG9uQ2xhc3NlcyhidXR0b24pIHtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSB7XG4gICAgICAgICdkaXRvLXNlbGVjdGVkJzogYnV0dG9uLmFjdGl2ZVxuICAgICAgfVxuICAgICAgaWYgKGJ1dHRvbi50eXBlKSB7XG4gICAgICAgIGNsYXNzZXNbYGRpdG8tYnV0dG9uLSR7YnV0dG9uLnR5cGV9YF0gPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3Nlc1xuICAgIH0sXG5cbiAgICBvbkNsaWNrQnV0dG9uKGJ1dHRvbikge1xuICAgICAgaWYgKFxuICAgICAgICBidXR0b24uaW5kZXggJiZcbiAgICAgICAgIWJ1dHRvbi5kaXNhYmxlZCAmJlxuICAgICAgICBidXR0b24uaW5kZXggIT09IHRoaXMuY3VycmVudFBhZ2VcbiAgICAgICkge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gYnV0dG9uLmluZGV4XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYWdpbmF0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcblxuICAuZGl0by1wYWdpbmF0aW9uLXRvdGFsIHtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcblxuICAgIG1hcmdpbjogMCAwLjVlbTtcbiAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbiB7XG4gICAgdHJhbnNpdGlvbjpcbiAgICAgIGFsbCAwLjNzIGVhc2UsXG4gICAgICBjb2xvciAwcyxcbiAgICAgIGJhY2tncm91bmQgMHMsXG4gICAgICBib3JkZXIgMHM7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICBwYWRkaW5nOiAwIDAuNWVtO1xuXG4gICAgJi1wcmV2LFxuICAgICYtbmV4dCB7XG4gICAgICAmOjpiZWZvcmUge1xuICAgICAgICBAZXh0ZW5kICVpY29uLWFycm93O1xuICAgICAgfVxuICAgIH1cblxuICAgICYtcHJldjo6YmVmb3JlIHtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTtcbiAgICB9XG5cbiAgICAmLWVsbGlwc2lzLXByZXYsXG4gICAgJi1lbGxpcHNpcy1uZXh0IHtcbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tZWxsaXBzaXM7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXI6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tY2hldnJvbnM7XG4gICAgICB9XG5cbiAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICBib3JkZXI6IDA7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgY29sb3I6ICRjb2xvci10ZXh0O1xuXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gICAgICB9XG5cbiAgICAgICY6YWN0aXZlIHtcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLWVsbGlwc2lzLXByZXY6OmJlZm9yZSB7XG4gICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXN3aXRjaChcbiAgOmNsYXNzPVwiY2xhc3Nlc1wiXG4gIDpzdHlsZT1cInN0eWxlc1wiXG4pXG4gIC5kaXRvLXN3aXRjaC1wYW5lXG4gICAgaW5wdXQoXG4gICAgICA6aWQ9XCJpZFwiXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICAgIHYtbW9kZWw9XCJjaGVja2VkXCJcbiAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICA6bmFtZT1cIm5hbWVcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIClcbiAgICAuZGl0by1zd2l0Y2gtYnV0dG9uXG4gICAgc3Bhbi5kaXRvLXN3aXRjaC1sYWJlbChcbiAgICAgIHYtaWY9XCJsYWJlbHNcIlxuICAgIClcbiAgICAgIHNsb3QoXG4gICAgICAgIHYtaWY9XCJjaGVja2VkXCJcbiAgICAgICAgbmFtZT1cImNoZWNrZWRcIlxuICAgICAgKSB7eyBsYWJlbHMuY2hlY2tlZCB8fCAnb24nIH19XG4gICAgICBzbG90KFxuICAgICAgICB2LWVsc2VcbiAgICAgICAgbmFtZT1cInVuY2hlY2tlZFwiXG4gICAgICApIHt7IGxhYmVscy51bmNoZWNrZWQgfHwgJ29mZicgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ2NoYW5nZSddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGlkOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBsYWJlbHM6IHsgdHlwZTogW09iamVjdCwgQm9vbGVhbl0sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjaGVja2VkOiB0aGlzLm1vZGVsVmFsdWVcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjbGFzc2VzKCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgdGhpcy4kYXR0cnMuY2xhc3MsXG4gICAgICAgIHtcbiAgICAgICAgICAnZGl0by1jaGVja2VkJzogdGhpcy5jaGVja2VkLFxuICAgICAgICAgICdkaXRvLWRpc2FibGVkJzogdGhpcy5kaXNhYmxlZFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIGNvbnN0IHsgbGFiZWxzOiB7IGNoZWNrZWQsIHVuY2hlY2tlZCB9ID0ge30gfSA9IHRoaXNcbiAgICAgIC8vIENhbGN1bGF0ZSBgLS1zd2l0Y2gtd2lkdGhgIGluIGByZW1gLCBiYXNlZCBvbiBsYWJlbCBsZW5ndGguXG4gICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCgwLCBjaGVja2VkPy5sZW5ndGgsIHVuY2hlY2tlZD8ubGVuZ3RoKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJy0tc3dpdGNoLXdpZHRoJzogbGVuZ3RoID8gYCR7bGVuZ3RoICogMS41fXJlbWAgOiBudWxsXG4gICAgICB9XG4gICAgfSxcblxuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICBjb25zdCB7IGNsYXNzOiBfLCAuLi5hdHRyaWJ1dGVzIH0gPSB0aGlzLiRhdHRyc1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKG1vZGVsVmFsdWUpIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9IG1vZGVsVmFsdWVcbiAgICB9LFxuXG4gICAgY2hlY2tlZChjaGVja2VkKSB7XG4gICAgICBpZiAoY2hlY2tlZCAhPT0gdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgY2hlY2tlZClcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgY2hlY2tlZClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zd2l0Y2gge1xuICAvLyBVc2Ugd2hvbGUgbXVsdGlwbGVzIG9mIGByZW1gIGZvciBzaXplcyBhbmQgYHB4YCBtYXJnaW5zL3BhZGRpbmcgYWxvbmdcbiAgLy8gd2l0aCBgY2FsYygpYCB0byBlbmQgdXAgd2l0aCBldmVuIHBpeGVsIHNpemVzLlxuICAtLXN3aXRjaC13aWR0aDogNGVtO1xuICAtLXN3aXRjaC1oZWlnaHQ6IDJlbTtcbiAgLS1zd2l0Y2gtbWFyZ2luOiAycHg7XG4gIC0tc3dpdGNoLXBhZGRpbmc6IDNweDtcbiAgLS1zd2l0Y2gtc3BlZWQ6IDMwMG1zO1xuICAtLWxhYmVsLW1hcmdpbjogMC41ZW07XG4gIC0td2lkdGg6IGNhbGModmFyKC0tc3dpdGNoLXdpZHRoKSAtIDIgKiB2YXIoLS1zd2l0Y2gtbWFyZ2luKSk7XG4gIC0taGVpZ2h0OiBjYWxjKHZhcigtLXN3aXRjaC1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1tYXJnaW4pKTtcbiAgLS1vZmZzZXQ6IGNhbGModmFyKC0td2lkdGgpIC0gdmFyKC0taGVpZ2h0KSk7XG5cbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGhlaWdodDogdmFyKC0tc3dpdGNoLWhlaWdodCk7XG4gIC8vIFRvIG1ha2UgaW5saW5lIGxhYmVscyBhcHBlYXIgb24gY29uc2lzdGVudCBiYXNlbGluZTpcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgLmRpdG8tc3dpdGNoLXBhbmUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogdmFyKC0td2lkdGgpO1xuICAgIGhlaWdodDogdmFyKC0taGVpZ2h0KTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1wYW5lLFxuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIHRvcDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgfVxuXG4gIGlucHV0IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYm9yZGVyLXJhZGl1czogMWVtO1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodDtcbiAgICB0cmFuc2l0aW9uOlxuICAgICAgYm9yZGVyLWNvbG9yIDAuM3MsXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuM3M7XG4gIH1cblxuICAuZGl0by1zd2l0Y2gtYnV0dG9uIHtcbiAgICAtLXNpemU6IGNhbGModmFyKC0taGVpZ2h0KSAtIDIgKiB2YXIoLS1zd2l0Y2gtcGFkZGluZykpO1xuXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogdmFyKC0tc3dpdGNoLXBhZGRpbmcpO1xuICAgIGxlZnQ6IHZhcigtLXN3aXRjaC1wYWRkaW5nKTtcbiAgICB3aWR0aDogdmFyKC0tc2l6ZSk7XG4gICAgaGVpZ2h0OiB2YXIoLS1zaXplKTtcbiAgICBib3JkZXItcmFkaXVzOiBjYWxjKHZhcigtLXNpemUpIC8gMik7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLXN3aXRjaC1zcGVlZCk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWJ1dHRvbixcbiAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiB2YXIoLS1sYWJlbC1tYXJnaW4pO1xuICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgfVxuXG4gICYuZGl0by1jaGVja2VkIHtcbiAgICBpbnB1dCB7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cblxuICAgIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKHZhcigtLW9mZnNldCkpO1xuICAgIH1cblxuICAgIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgICBsZWZ0OiB2YXIoLS1sYWJlbC1tYXJnaW4pO1xuICAgICAgcmlnaHQ6IHVuc2V0O1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1kaXNhYmxlZCB7XG4gICAgQGV4dGVuZCAlYnV0dG9uLWRpc2FibGVkO1xuICB9XG5cbiAgJjpmb2N1cy13aXRoaW46bm90KDpob3Zlcikge1xuICAgIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgICAgYm94LXNoYWRvdzogJHNoYWRvdy1mb2N1cztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8c2NyaXB0PlxuaW1wb3J0IHsgaCBhcyBjcmVhdGVFbGVtZW50LCBUcmFuc2l0aW9uIH0gZnJvbSAndnVlJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZnVuY3Rpb24gVHJhbnNpdGlvbkhlaWdodCh7IGVuYWJsZWQgfSwgeyBzbG90cyB9KSB7XG4gIHJldHVybiBlbmFibGVkXG4gICAgPyBjcmVhdGVFbGVtZW50KFRyYW5zaXRpb24sIHByb3BzLCBzbG90cylcbiAgICA6IHNsb3RzLmRlZmF1bHQoKVxufVxuXG5UcmFuc2l0aW9uSGVpZ2h0LnByb3BzID0ge1xuICBlbmFibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2l0aW9uSGVpZ2h0XG5cbmNvbnN0IHNldFN0eWxlID0gKGVsZW1lbnQsIHN0eWxlKSA9PiBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXG5jb25zdCBuZXh0VGltZW91dCA9IGNhbGxiYWNrID0+IHNldFRpbWVvdXQoY2FsbGJhY2ssIDApXG5cbi8vIEZvcmNlIHJlcGFpbnQgdG8gbWFrZSBzdXJlIHRoZSBhbmltYXRpb24gaXMgdHJpZ2dlcmVkIGNvcnJlY3RseS5cbmNvbnN0IGZvcmNlUmVwYWludCA9IGVsZW1lbnQgPT4gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5oZWlnaHRcblxuY29uc3QgcHJvcHMgPSB7XG4gIG5hbWU6ICdkaXRvLWhlaWdodCcsXG5cbiAgb25BZnRlckVudGVyKGVsZW1lbnQpIHtcbiAgICAvLyBBIHRpbWVvdXQgYmVmb3JlIHNldHRpbmcgc3R5bGUgaXMgb25seSByZWFsbHkgbmVlZGVkIGFmdGVyIGNhbGxzIHRvXG4gICAgLy8gYGZvcmNlUmVwYWludCgpYCwgYnV0IHVzaW5nIG9uZSBoZXJlIHRvbyBwcmVzZXJ2ZXMgZXhlY3V0aW9uIHNlcXVlbmNlIHNvXG4gICAgLy8gdGhhdCB0aGUgY2FsbCBmcm9tIGBlbnRlcigpYCBjYW4gbmV2ZXIgb3V0cnVuIHRoZSBvbmUgZnJvbSBgYWZ0ZXJFbnRlcigpYFxuICAgIG5leHRUaW1lb3V0KCgpID0+IHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0OiBudWxsIH0pKVxuICB9LFxuXG4gIG9uRW50ZXIoZWxlbWVudCkge1xuICAgIC8vIEZvciBzb21lIHJlYXNvbiB3ZSdyZSBnZXR0aW5nIHR3byBgb25FbnRlcigpYCBjYWxscyBwZXIgdHJhbnNpdGlvbixcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIGlnbm9yZSB0aGUgc2Vjb25kIG9uZS4gVGhpcyBtaWdodCBiZSBsaW5rZWQgdG8gdGhlIHVzZVxuICAgIC8vIG9mIGBuZXh0VGltZW91dCgpYCwgd2hpY2ggaXMgcmVxdWlyZWQgdG8gZ2V0IHRoZSBjb3JyZWN0IHZhbHVlIGZvclxuICAgIC8vIGBoZWlnaHRgLCBiYXNlZCBvbiBgJi0tbGFiZWwtdmVydGljYWxgIGNhbGN1bGF0aW9ucy5cbiAgICBjb25zdCB7IHdpZHRoIH0gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgc2V0U3R5bGUoZWxlbWVudCwge1xuICAgICAgd2lkdGgsXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgICAgaGVpZ2h0OiAnYXV0bydcbiAgICB9KVxuICAgIG5leHRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHsgaGVpZ2h0IH0gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgICBzZXRTdHlsZShlbGVtZW50LCB7XG4gICAgICAgIHdpZHRoOiBudWxsLFxuICAgICAgICBwb3NpdGlvbjogbnVsbCxcbiAgICAgICAgdmlzaWJpbGl0eTogbnVsbCxcbiAgICAgICAgaGVpZ2h0OiAwXG4gICAgICB9KVxuICAgICAgZm9yY2VSZXBhaW50KGVsZW1lbnQpXG4gICAgICBuZXh0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodCB9KSlcbiAgICB9KVxuICB9LFxuXG4gIG9uTGVhdmUoZWxlbWVudCkge1xuICAgIGNvbnN0IHsgaGVpZ2h0IH0gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgc2V0U3R5bGUoZWxlbWVudCwgeyBoZWlnaHQgfSlcbiAgICBmb3JjZVJlcGFpbnQoZWxlbWVudClcbiAgICBuZXh0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodDogMCB9KSlcbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuJGR1cmF0aW9uOiAwLjE1cztcblxuLmRpdG8taGVpZ2h0LWVudGVyLWFjdGl2ZSxcbi5kaXRvLWhlaWdodC1sZWF2ZS1hY3RpdmUge1xuICB0cmFuc2l0aW9uOiBoZWlnaHQgJGR1cmF0aW9uICRlYXNlLW91dC1xdWFydDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmRpdG8taGVpZ2h0LWVudGVyLWFjdGl2ZSB7XG4gIGFuaW1hdGlvbjogZGl0by1zbGlkZS1lbnRlciAkZHVyYXRpb24gJGVhc2Utb3V0LXF1YXJ0O1xufVxuXG4uZGl0by1oZWlnaHQtbGVhdmUtYWN0aXZlIHtcbiAgYW5pbWF0aW9uOiBkaXRvLXNsaWRlLWxlYXZlICRkdXJhdGlvbiAkZWFzZS1vdXQtcXVhcnQ7XG59XG5cbi5kaXRvLWhlaWdodC1lbnRlci1mcm9tLFxuLmRpdG8taGVpZ2h0LWxlYXZlLXRvIHtcbiAgaGVpZ2h0OiAwO1xufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IHVzZVNsb3RzLCBDb21tZW50IH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgaXNTdHJpbmcsIGFzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzVk5vZGVDb250ZW50KHZub2RlKSB7XG4gIHJldHVybiB2bm9kZSAmJiBhc0FycmF5KHZub2RlKS5zb21lKHZub2RlID0+IHZub2RlLnR5cGUgIT09IENvbW1lbnQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNTbG90Q29udGVudChzbG90LCBwcm9wcyA9IHt9KSB7XG4gIHNsb3QgPSBpc1N0cmluZyhzbG90KSA/IHVzZVNsb3RzKClbc2xvdF0gOiBzbG90XG4gIHJldHVybiBoYXNWTm9kZUNvbnRlbnQoc2xvdD8uKHByb3BzKSlcbn1cbiJdLCJuYW1lcyI6WyJkZXNjcmliZURhdGUiLCJkYXRlIiwiYWx0ZXJEYXRlIiwib3ZlcnJpZGVzIiwicGFyc2VEYXRlIiwic3RyaW5nIiwibG9jYWxlIiwidGltZSIsInRpbWVEZWZhdWx0IiwiZGF5Iiwic2VwMSIsIm1vbnRoIiwic2VwMiIsInllYXIiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwibWlsbGlzZWNvbmQiLCJnZXREYXRlUGFydHMiLCJnZXRNb250aEluZGV4IiwiaXNWYWxpZFRpbWVQYXJ0IiwicGFydCIsImdldERhdGVQYXJ0QXRQb3NpdGlvbiIsInBvc2l0aW9uIiwicGFydHMiLCJnZXRQb3NpdGlvbiIsImxlbmd0aCIsInBvcyIsImluZGV4IiwiX2EiLCJvZmZzZXQiLCJpc1VTIiwidmFsdWVzIiwic3RhcnQiLCJlbmQiLCJ2YWx1ZSIsIm1hdGNoIiwic2hvcnRGb3JtYXQiLCJsb25nRm9ybWF0Iiwid2FybiIsIm1zZyIsImFyZ3MiLCJhY3RpdmVFZmZlY3RTY29wZSIsInJlY29yZEVmZmVjdFNjb3BlIiwiZWZmZWN0Iiwic2NvcGUiLCJhY3RpdmVFZmZlY3QiLCJSZWFjdGl2ZUVmZmVjdCIsImZuIiwidHJpZ2dlciIsInNjaGVkdWxlciIsInBhdXNlVHJhY2tpbmciLCJkZXAiLCJ0cmlnZ2VyQ29tcHV0ZWQiLCJyZXNldFRyYWNraW5nIiwidiIsImxhc3RTaG91bGRUcmFjayIsInNob3VsZFRyYWNrIiwibGFzdEVmZmVjdCIsInByZUNsZWFudXBFZmZlY3QiLCJwb3N0Q2xlYW51cEVmZmVjdCIsImNvbXB1dGVkIiwiZWZmZWN0MiIsImkiLCJjbGVhbnVwRGVwRWZmZWN0IiwidHJhY2tJZCIsInBhdXNlU2NoZWR1bGVTdGFjayIsInRyYWNrU3RhY2siLCJsYXN0IiwicGF1c2VTY2hlZHVsaW5nIiwicmVzZXRTY2hlZHVsaW5nIiwicXVldWVFZmZlY3RTY2hlZHVsZXJzIiwidHJhY2tFZmZlY3QiLCJkZWJ1Z2dlckV2ZW50RXh0cmFJbmZvIiwib2xkRGVwIiwiZXh0ZW5kIiwidHJpZ2dlckVmZmVjdHMiLCJkaXJ0eUxldmVsIiwibGFzdERpcnR5TGV2ZWwiLCJjcmVhdGVEZXAiLCJjbGVhbnVwIiwidGFyZ2V0TWFwIiwiSVRFUkFURV9LRVkiLCJNQVBfS0VZX0lURVJBVEVfS0VZIiwidHJhY2siLCJ0YXJnZXQiLCJ0eXBlIiwia2V5IiwiZGVwc01hcCIsIm5ld1ZhbHVlIiwib2xkVmFsdWUiLCJvbGRUYXJnZXQiLCJkZXBzIiwiaXNBcnJheSIsIm5ld0xlbmd0aCIsImtleTIiLCJpc1N5bWJvbCIsImlzSW50ZWdlcktleSIsImlzTWFwIiwiaXNOb25UcmFja2FibGVLZXlzIiwibWFrZU1hcCIsImJ1aWx0SW5TeW1ib2xzIiwiYXJyYXlJbnN0cnVtZW50YXRpb25zIiwiY3JlYXRlQXJyYXlJbnN0cnVtZW50YXRpb25zIiwiaW5zdHJ1bWVudGF0aW9ucyIsImFyciIsInRvUmF3IiwibCIsInJlcyIsImhhc093blByb3BlcnR5Iiwib2JqIiwiQmFzZVJlYWN0aXZlSGFuZGxlciIsIl9pc1JlYWRvbmx5IiwiX3NoYWxsb3ciLCJyZWNlaXZlciIsImlzUmVhZG9ubHkyIiwic2hhbGxvdyIsInNoYWxsb3dSZWFkb25seU1hcCIsInJlYWRvbmx5TWFwIiwic2hhbGxvd1JlYWN0aXZlTWFwIiwicmVhY3RpdmVNYXAiLCJ0YXJnZXRJc0FycmF5IiwiaGFzT3duIiwiaXNSZWYiLCJpc09iamVjdCIsInJlYWRvbmx5IiwicmVhY3RpdmUiLCJNdXRhYmxlUmVhY3RpdmVIYW5kbGVyIiwiaXNPbGRWYWx1ZVJlYWRvbmx5IiwiaXNSZWFkb25seSIsImlzU2hhbGxvdyIsImhhZEtleSIsInJlc3VsdCIsImhhc0NoYW5nZWQiLCJSZWFkb25seVJlYWN0aXZlSGFuZGxlciIsIm11dGFibGVIYW5kbGVycyIsInJlYWRvbmx5SGFuZGxlcnMiLCJzaGFsbG93UmVhZG9ubHlIYW5kbGVycyIsInRvU2hhbGxvdyIsImdldFByb3RvIiwiZ2V0IiwicmF3VGFyZ2V0IiwicmF3S2V5IiwiaGFzMiIsIndyYXAiLCJ0b1JlYWRvbmx5IiwidG9SZWFjdGl2ZSIsImhhcyIsInNpemUiLCJhZGQiLCJzZXQiLCJnZXQyIiwiY2hlY2tJZGVudGl0eUtleXMiLCJkZWxldGVFbnRyeSIsImNsZWFyIiwiaGFkSXRlbXMiLCJjcmVhdGVGb3JFYWNoIiwiY2FsbGJhY2siLCJ0aGlzQXJnIiwib2JzZXJ2ZWQiLCJjcmVhdGVJdGVyYWJsZU1ldGhvZCIsIm1ldGhvZCIsInRhcmdldElzTWFwIiwiaXNQYWlyIiwiaXNLZXlPbmx5IiwiaW5uZXJJdGVyYXRvciIsImRvbmUiLCJjcmVhdGVSZWFkb25seU1ldGhvZCIsImNhcGl0YWxpemUiLCJjcmVhdGVJbnN0cnVtZW50YXRpb25zIiwibXV0YWJsZUluc3RydW1lbnRhdGlvbnMyIiwic2hhbGxvd0luc3RydW1lbnRhdGlvbnMyIiwicmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMiIsInNoYWxsb3dSZWFkb25seUluc3RydW1lbnRhdGlvbnMyIiwibXV0YWJsZUluc3RydW1lbnRhdGlvbnMiLCJyZWFkb25seUluc3RydW1lbnRhdGlvbnMiLCJzaGFsbG93SW5zdHJ1bWVudGF0aW9ucyIsInNoYWxsb3dSZWFkb25seUluc3RydW1lbnRhdGlvbnMiLCJjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIiLCJtdXRhYmxlQ29sbGVjdGlvbkhhbmRsZXJzIiwicmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMiLCJzaGFsbG93UmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMiLCJ0b1Jhd1R5cGUiLCJ0YXJnZXRUeXBlTWFwIiwicmF3VHlwZSIsImdldFRhcmdldFR5cGUiLCJjcmVhdGVSZWFjdGl2ZU9iamVjdCIsInNoYWxsb3dSZWFkb25seSIsImJhc2VIYW5kbGVycyIsImNvbGxlY3Rpb25IYW5kbGVycyIsInByb3h5TWFwIiwiZXhpc3RpbmdQcm94eSIsInRhcmdldFR5cGUiLCJwcm94eSIsImlzUmVhY3RpdmUiLCJpc1Byb3h5IiwicmF3IiwibWFya1JhdyIsImRlZiIsInIiLCJ1bnJlZiIsInJlZjIiLCJzaGFsbG93VW53cmFwSGFuZGxlcnMiLCJwcm94eVJlZnMiLCJvYmplY3RXaXRoUmVmcyIsInN0YWNrIiwicHVzaFdhcm5pbmdDb250ZXh0Iiwidm5vZGUiLCJwb3BXYXJuaW5nQ29udGV4dCIsIndhcm4kMSIsImluc3RhbmNlIiwiYXBwV2FybkhhbmRsZXIiLCJ0cmFjZSIsImdldENvbXBvbmVudFRyYWNlIiwiY2FsbFdpdGhFcnJvckhhbmRsaW5nIiwiZm9ybWF0Q29tcG9uZW50TmFtZSIsIndhcm5BcmdzIiwiZm9ybWF0VHJhY2UiLCJjdXJyZW50Vk5vZGUiLCJub3JtYWxpemVkU3RhY2siLCJwYXJlbnRJbnN0YW5jZSIsImxvZ3MiLCJlbnRyeSIsImZvcm1hdFRyYWNlRW50cnkiLCJyZWN1cnNlQ291bnQiLCJwb3N0Zml4IiwiaXNSb290Iiwib3BlbiIsImNsb3NlIiwiZm9ybWF0UHJvcHMiLCJwcm9wcyIsImtleXMiLCJmb3JtYXRQcm9wIiwiaXNTdHJpbmciLCJpc0Z1bmN0aW9uIiwiYXNzZXJ0TnVtYmVyIiwidmFsIiwiRXJyb3JUeXBlU3RyaW5ncyQxIiwiZXJyIiwiaGFuZGxlRXJyb3IiLCJjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyIsImlzUHJvbWlzZSIsInRocm93SW5EZXYiLCJjb250ZXh0Vk5vZGUiLCJjdXIiLCJleHBvc2VkSW5zdGFuY2UiLCJlcnJvckluZm8iLCJlcnJvckNhcHR1cmVkSG9va3MiLCJhcHBFcnJvckhhbmRsZXIiLCJsb2dFcnJvciIsImluZm8iLCJpc0ZsdXNoaW5nIiwiaXNGbHVzaFBlbmRpbmciLCJxdWV1ZSIsImZsdXNoSW5kZXgiLCJwZW5kaW5nUG9zdEZsdXNoQ2JzIiwiYWN0aXZlUG9zdEZsdXNoQ2JzIiwicG9zdEZsdXNoSW5kZXgiLCJyZXNvbHZlZFByb21pc2UiLCJjdXJyZW50Rmx1c2hQcm9taXNlIiwiUkVDVVJTSU9OX0xJTUlUIiwibmV4dFRpY2siLCJwIiwiZmluZEluc2VydGlvbkluZGV4IiwiaWQiLCJtaWRkbGUiLCJtaWRkbGVKb2IiLCJtaWRkbGVKb2JJZCIsImdldElkIiwicXVldWVKb2IiLCJqb2IiLCJxdWV1ZUZsdXNoIiwiZmx1c2hKb2JzIiwicXVldWVQb3N0Rmx1c2hDYiIsImNiIiwiZmx1c2hQb3N0Rmx1c2hDYnMiLCJzZWVuIiwiZGVkdXBlZCIsImEiLCJiIiwiY2hlY2tSZWN1cnNpdmVVcGRhdGVzIiwiY29tcGFyYXRvciIsImRpZmYiLCJjaGVjayIsIk5PT1AiLCJjb3VudCIsImNvbXBvbmVudE5hbWUiLCJnZXRDb21wb25lbnROYW1lIiwiaG1yRGlydHlDb21wb25lbnRzIiwiZ2V0R2xvYmFsVGhpcyIsInRyeVdyYXAiLCJjcmVhdGVSZWNvcmQiLCJyZXJlbmRlciIsInJlbG9hZCIsIm1hcCIsImluaXRpYWxEZWYiLCJub3JtYWxpemVDbGFzc0NvbXBvbmVudCIsImNvbXBvbmVudCIsImlzQ2xhc3NDb21wb25lbnQiLCJuZXdSZW5kZXIiLCJyZWNvcmQiLCJuZXdDb21wIiwidXBkYXRlQ29tcG9uZW50RGVmIiwiaW5zdGFuY2VzIiwib2xkQ29tcCIsImFyZyIsImUiLCJkZXZ0b29scyQxIiwiYnVmZmVyIiwiZGV2dG9vbHNOb3RJbnN0YWxsZWQiLCJlbWl0JDEiLCJldmVudCIsInNldERldnRvb2xzSG9vayQxIiwiaG9vayIsIl9iIiwibmV3SG9vayIsImRldnRvb2xzQ29tcG9uZW50VXBkYXRlZCIsImNyZWF0ZURldnRvb2xzQ29tcG9uZW50SG9vayIsImN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSIsImN1cnJlbnRTY29wZUlkIiwic2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlIiwicHJldiIsIndpdGhDdHgiLCJjdHgiLCJpc05vblNjb3BlZFNsb3QiLCJyZW5kZXJGbldpdGhDb250ZXh0Iiwic2V0QmxvY2tUcmFja2luZyIsInByZXZJbnN0YW5jZSIsIkNPTVBPTkVOVFMiLCJyZXNvbHZlQ29tcG9uZW50IiwibmFtZSIsIm1heWJlU2VsZlJlZmVyZW5jZSIsInJlc29sdmVBc3NldCIsIk5VTExfRFlOQU1JQ19DT01QT05FTlQiLCJ3YXJuTWlzc2luZyIsImN1cnJlbnRJbnN0YW5jZSIsIkNvbXBvbmVudCIsInNlbGZOYW1lIiwiY2FtZWxpemUiLCJyZXNvbHZlIiwiZXh0cmEiLCJyZWdpc3RyeSIsImlzU3VzcGVuc2UiLCJxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZSIsInN1c3BlbnNlIiwic3NyQ29udGV4dEtleSIsInVzZVNTUkNvbnRleHQiLCJpbmplY3QiLCJJTklUSUFMX1dBVENIRVJfVkFMVUUiLCJkb1dhdGNoIiwic291cmNlIiwiaW1tZWRpYXRlIiwiZGVlcCIsImZsdXNoIiwib25jZSIsIm9uVHJhY2siLCJvblRyaWdnZXIiLCJFTVBUWV9PQkoiLCJfY2IiLCJ1bndhdGNoIiwid2FybkludmFsaWRTb3VyY2UiLCJzIiwicmVhY3RpdmVHZXR0ZXIiLCJzb3VyY2UyIiwidHJhdmVyc2UiLCJnZXR0ZXIiLCJmb3JjZVRyaWdnZXIiLCJpc011bHRpU291cmNlIiwiaXNTaGFsbG93JDEiLCJvbkNsZWFudXAiLCJiYXNlR2V0dGVyIiwic3NyQ2xlYW51cCIsImlzSW5TU1JDb21wb25lbnRTZXR1cCIsInF1ZXVlUG9zdFJlbmRlckVmZmVjdCIsImluc3RhbmNlV2F0Y2giLCJvcHRpb25zIiwicHVibGljVGhpcyIsImNyZWF0ZVBhdGhHZXR0ZXIiLCJyZXNldCIsInNldEN1cnJlbnRJbnN0YW5jZSIsInBhdGgiLCJzZWdtZW50cyIsImRlcHRoIiwiY3VycmVudERlcHRoIiwiaXNTZXQiLCJpc1BsYWluT2JqZWN0Iiwid2l0aERpcmVjdGl2ZXMiLCJkaXJlY3RpdmVzIiwiZ2V0RXhwb3NlUHJveHkiLCJiaW5kaW5ncyIsImRpciIsIm1vZGlmaWVycyIsImxlYXZlQ2JLZXkiLCJlbnRlckNiS2V5IiwidXNlVHJhbnNpdGlvblN0YXRlIiwic3RhdGUiLCJvbk1vdW50ZWQiLCJvbkJlZm9yZVVubW91bnQiLCJUcmFuc2l0aW9uSG9va1ZhbGlkYXRvciIsIkJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzIiwiQmFzZVRyYW5zaXRpb25JbXBsIiwic2xvdHMiLCJnZXRDdXJyZW50SW5zdGFuY2UiLCJwcmV2VHJhbnNpdGlvbktleSIsImNoaWxkcmVuIiwiZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuIiwiY2hpbGQiLCJoYXNGb3VuZCIsImMiLCJDb21tZW50IiwicmF3UHJvcHMiLCJtb2RlIiwiZW1wdHlQbGFjZWhvbGRlciIsImlubmVyQ2hpbGQiLCJnZXRLZWVwQWxpdmVDaGlsZCIsImVudGVySG9va3MiLCJyZXNvbHZlVHJhbnNpdGlvbkhvb2tzIiwic2V0VHJhbnNpdGlvbkhvb2tzIiwib2xkQ2hpbGQiLCJvbGRJbm5lckNoaWxkIiwidHJhbnNpdGlvbktleUNoYW5nZWQiLCJnZXRUcmFuc2l0aW9uS2V5IiwiaXNTYW1lVk5vZGVUeXBlIiwibGVhdmluZ0hvb2tzIiwiZWwiLCJlYXJseVJlbW92ZSIsImRlbGF5ZWRMZWF2ZSIsImxlYXZpbmdWTm9kZXNDYWNoZSIsImdldExlYXZpbmdOb2Rlc0ZvclR5cGUiLCJCYXNlVHJhbnNpdGlvbiIsImxlYXZpbmdWTm9kZXMiLCJhcHBlYXIiLCJwZXJzaXN0ZWQiLCJvbkJlZm9yZUVudGVyIiwib25FbnRlciIsIm9uQWZ0ZXJFbnRlciIsIm9uRW50ZXJDYW5jZWxsZWQiLCJvbkJlZm9yZUxlYXZlIiwib25MZWF2ZSIsIm9uQWZ0ZXJMZWF2ZSIsIm9uTGVhdmVDYW5jZWxsZWQiLCJvbkJlZm9yZUFwcGVhciIsIm9uQXBwZWFyIiwib25BZnRlckFwcGVhciIsIm9uQXBwZWFyQ2FuY2VsbGVkIiwiY2FsbEhvb2siLCJjYWxsQXN5bmNIb29rIiwiaG9vazIiLCJob29rcyIsImxlYXZpbmdWTm9kZSIsImFmdGVySG9vayIsImNhbmNlbEhvb2siLCJjYWxsZWQiLCJjYW5jZWxsZWQiLCJyZW1vdmUiLCJ2bm9kZTIiLCJpc0tlZXBBbGl2ZSIsImNsb25lVk5vZGUiLCJrZWVwQ29tbWVudCIsInBhcmVudEtleSIsInJldCIsImtleWVkRnJhZ21lbnRDb3VudCIsIkZyYWdtZW50IiwiaXNBc3luY1dyYXBwZXIiLCJpbmplY3RIb29rIiwicHJlcGVuZCIsIndyYXBwZWRIb29rIiwiYXBpTmFtZSIsInRvSGFuZGxlcktleSIsImNyZWF0ZUhvb2siLCJsaWZlY3ljbGUiLCJyZW5kZXJMaXN0IiwicmVuZGVySXRlbSIsImNhY2hlIiwiY2FjaGVkIiwiaXRlbSIsInJlbmRlclNsb3QiLCJmYWxsYmFjayIsIm5vU2xvdHRlZCIsImNyZWF0ZVZOb2RlIiwic2xvdCIsIm9wZW5CbG9jayIsInZhbGlkU2xvdENvbnRlbnQiLCJlbnN1cmVWYWxpZFZOb2RlIiwicmVuZGVyZWQiLCJjcmVhdGVCbG9jayIsInZub2RlcyIsImlzVk5vZGUiLCJnZXRQdWJsaWNJbnN0YW5jZSIsImlzU3RhdGVmdWxDb21wb25lbnQiLCJwdWJsaWNQcm9wZXJ0aWVzTWFwIiwicmVzb2x2ZU1lcmdlZE9wdGlvbnMiLCJpc1Jlc2VydmVkUHJlZml4IiwiaGFzU2V0dXBCaW5kaW5nIiwiUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzIiwic2V0dXBTdGF0ZSIsImRhdGEiLCJhY2Nlc3NDYWNoZSIsImFwcENvbnRleHQiLCJub3JtYWxpemVkUHJvcHMiLCJuIiwicHVibGljR2V0dGVyIiwiY3NzTW9kdWxlIiwiZ2xvYmFsUHJvcGVydGllcyIsInByb3BzT3B0aW9ucyIsImRlc2NyaXB0b3IiLCJ1c2VTbG90cyIsImdldENvbnRleHQiLCJjcmVhdGVTZXR1cENvbnRleHQiLCJub3JtYWxpemVQcm9wc09yRW1pdHMiLCJub3JtYWxpemVkIiwiYmFzZSIsIm1peGlucyIsImV4dGVuZHNPcHRpb25zIiwiZ2xvYmFsTWl4aW5zIiwib3B0aW9uTWVyZ2VTdHJhdGVnaWVzIiwicmVzb2x2ZWQiLCJtIiwibWVyZ2VPcHRpb25zIiwidG8iLCJmcm9tIiwic3RyYXRzIiwiYXNNaXhpbiIsInN0cmF0IiwiaW50ZXJuYWxPcHRpb25NZXJnZVN0cmF0cyIsIm1lcmdlRGF0YUZuIiwibWVyZ2VFbWl0c09yUHJvcHNPcHRpb25zIiwibWVyZ2VPYmplY3RPcHRpb25zIiwibWVyZ2VBc0FycmF5IiwibWVyZ2VXYXRjaE9wdGlvbnMiLCJtZXJnZUluamVjdCIsIm5vcm1hbGl6ZUluamVjdCIsIm1lcmdlZCIsImN1cnJlbnRBcHAiLCJkZWZhdWx0VmFsdWUiLCJ0cmVhdERlZmF1bHRBc0ZhY3RvcnkiLCJwcm92aWRlcyIsImlzVGVsZXBvcnQiLCJUZXh0IiwiYmxvY2tTdGFjayIsImN1cnJlbnRCbG9jayIsImRpc2FibGVUcmFja2luZyIsImNsb3NlQmxvY2siLCJpc0Jsb2NrVHJlZUVuYWJsZWQiLCJzZXR1cEJsb2NrIiwiRU1QVFlfQVJSIiwiY3JlYXRlRWxlbWVudEJsb2NrIiwicGF0Y2hGbGFnIiwiZHluYW1pY1Byb3BzIiwic2hhcGVGbGFnIiwiY3JlYXRlQmFzZVZOb2RlIiwibjEiLCJuMiIsImNyZWF0ZVZOb2RlV2l0aEFyZ3NUcmFuc2Zvcm0iLCJfY3JlYXRlVk5vZGUiLCJJbnRlcm5hbE9iamVjdEtleSIsIm5vcm1hbGl6ZUtleSIsIm5vcm1hbGl6ZVJlZiIsInJlZiIsInJlZl9rZXkiLCJyZWZfZm9yIiwiaXNCbG9ja05vZGUiLCJuZWVkRnVsbENoaWxkcmVuTm9ybWFsaXphdGlvbiIsIm5vcm1hbGl6ZUNoaWxkcmVuIiwiY2xvbmVkIiwiZ3VhcmRSZWFjdGl2ZVByb3BzIiwia2xhc3MiLCJzdHlsZSIsIm5vcm1hbGl6ZUNsYXNzIiwibm9ybWFsaXplU3R5bGUiLCJleHRyYVByb3BzIiwibWVyZ2VSZWYiLCJtZXJnZWRQcm9wcyIsIm1lcmdlUHJvcHMiLCJkZWVwQ2xvbmVWTm9kZSIsImNyZWF0ZVRleHRWTm9kZSIsInRleHQiLCJmbGFnIiwiY3JlYXRlQ29tbWVudFZOb2RlIiwiYXNCbG9jayIsInNsb3RGbGFnIiwidG9NZXJnZSIsImlzT24iLCJleGlzdGluZyIsImluY29taW5nIiwiaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2UiLCJnIiwicmVnaXN0ZXJHbG9iYWxTZXR0ZXIiLCJzZXR0ZXIiLCJzZXR0ZXJzIiwiZ2V0QXR0cnNQcm94eSIsImdldFNsb3RzUHJveHkiLCJleHBvc2UiLCJleHBvc2VkIiwiZXhwb3NlZFR5cGUiLCJjbGFzc2lmeVJFIiwiY2xhc3NpZnkiLCJzdHIiLCJpbmNsdWRlSW5mZXJyZWQiLCJpbmZlckZyb21SZWdpc3RyeSIsImgiLCJwcm9wc09yQ2hpbGRyZW4iLCJpbml0Q3VzdG9tRm9ybWF0dGVyIiwidnVlU3R5bGUiLCJudW1iZXJTdHlsZSIsInN0cmluZ1N0eWxlIiwia2V5d29yZFN0eWxlIiwiZm9ybWF0dGVyIiwiZ2VuUmVmRmxhZyIsImZvcm1hdFZhbHVlIiwiZm9ybWF0SW5zdGFuY2UiLCJibG9ja3MiLCJjcmVhdGVJbnN0YW5jZUJsb2NrIiwiZXh0cmFjdEtleXMiLCJpbmplY3RlZCIsImFzUmF3IiwiQ29tcCIsImV4dHJhY3RlZCIsImlzS2V5T2ZUeXBlIiwib3B0cyIsIlRSQU5TSVRJT04iLCJBTklNQVRJT04iLCJ2dGNLZXkiLCJUcmFuc2l0aW9uIiwicmVzb2x2ZVRyYW5zaXRpb25Qcm9wcyIsIkRPTVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMiLCJoMiIsImhhc0V4cGxpY2l0Q2FsbGJhY2siLCJiYXNlUHJvcHMiLCJkdXJhdGlvbiIsImVudGVyRnJvbUNsYXNzIiwiZW50ZXJBY3RpdmVDbGFzcyIsImVudGVyVG9DbGFzcyIsImFwcGVhckZyb21DbGFzcyIsImFwcGVhckFjdGl2ZUNsYXNzIiwiYXBwZWFyVG9DbGFzcyIsImxlYXZlRnJvbUNsYXNzIiwibGVhdmVBY3RpdmVDbGFzcyIsImxlYXZlVG9DbGFzcyIsImR1cmF0aW9ucyIsIm5vcm1hbGl6ZUR1cmF0aW9uIiwiZW50ZXJEdXJhdGlvbiIsImxlYXZlRHVyYXRpb24iLCJmaW5pc2hFbnRlciIsImlzQXBwZWFyIiwicmVtb3ZlVHJhbnNpdGlvbkNsYXNzIiwiZmluaXNoTGVhdmUiLCJtYWtlRW50ZXJIb29rIiwibmV4dEZyYW1lIiwiYWRkVHJhbnNpdGlvbkNsYXNzIiwid2hlblRyYW5zaXRpb25FbmRzIiwiZm9yY2VSZWZsb3ciLCJOdW1iZXJPZiIsInRvTnVtYmVyIiwiY2xzIiwiX3Z0YyIsImVuZElkIiwiZXhwZWN0ZWRUeXBlIiwiZXhwbGljaXRUaW1lb3V0IiwicmVzb2x2ZUlmTm90U3RhbGUiLCJ0aW1lb3V0IiwicHJvcENvdW50IiwiZ2V0VHJhbnNpdGlvbkluZm8iLCJlbmRFdmVudCIsImVuZGVkIiwib25FbmQiLCJzdHlsZXMiLCJnZXRTdHlsZVByb3BlcnRpZXMiLCJ0cmFuc2l0aW9uRGVsYXlzIiwidHJhbnNpdGlvbkR1cmF0aW9ucyIsInRyYW5zaXRpb25UaW1lb3V0IiwiZ2V0VGltZW91dCIsImFuaW1hdGlvbkRlbGF5cyIsImFuaW1hdGlvbkR1cmF0aW9ucyIsImFuaW1hdGlvblRpbWVvdXQiLCJoYXNUcmFuc2Zvcm0iLCJkZWxheXMiLCJkIiwidG9NcyIsInZTaG93T2xkS2V5IiwidlNob3ciLCJ0cmFuc2l0aW9uIiwic2V0RGlzcGxheSIsImFkZEV2ZW50TGlzdGVuZXIiLCJoYW5kbGVyIiwiZ2V0TW9kZWxBc3NpZ25lciIsImludm9rZUFycmF5Rm5zIiwib25Db21wb3NpdGlvblN0YXJ0Iiwib25Db21wb3NpdGlvbkVuZCIsImFzc2lnbktleSIsInZNb2RlbFRleHQiLCJsYXp5IiwidHJpbSIsIm51bWJlciIsImNhc3RUb051bWJlciIsImRvbVZhbHVlIiwibG9vc2VUb051bWJlciIsImVsVmFsdWUiLCJ2TW9kZWxDaGVja2JveCIsIl8iLCJtb2RlbFZhbHVlIiwiZWxlbWVudFZhbHVlIiwiZ2V0VmFsdWUiLCJjaGVja2VkIiwiYXNzaWduIiwibG9vc2VJbmRleE9mIiwiZm91bmQiLCJmaWx0ZXJlZCIsImdldENoZWNrYm94VmFsdWUiLCJzZXRDaGVja2VkIiwiYmluZGluZyIsImxvb3NlRXF1YWwiLCJ2TW9kZWxSYWRpbyIsInZNb2RlbFNlbGVjdCIsImlzU2V0TW9kZWwiLCJzZWxlY3RlZFZhbCIsIm8iLCJzZXRTZWxlY3RlZCIsIl9iaW5kaW5nIiwiaXNNdWx0aXBsZSIsIm9wdGlvbiIsIm9wdGlvblZhbHVlIiwidk1vZGVsRHluYW1pYyIsImNhbGxNb2RlbEhvb2siLCJwcmV2Vk5vZGUiLCJyZXNvbHZlRHluYW1pY01vZGVsIiwidGFnTmFtZSIsInN5c3RlbU1vZGlmaWVycyIsIm1vZGlmaWVyR3VhcmRzIiwid2l0aE1vZGlmaWVycyIsImNhY2hlS2V5IiwiZ3VhcmQiLCJpbml0RGV2IiwiX3NmY19tYWluIiwid2Vla2RheU5hbWVzIiwibW9udGhOYW1lcyIsImdldExvY2FsZU5hbWVzIiwidXBkYXRlIiwic3RlcCIsImN1cnJlbnRWYWx1ZSIsImVudGVyIiwic3RhcnRZZWFyIiwiZmlyc3REYXlXZWVrIiwibnVtRGF5cyIsInByZXZNb250aCIsInByZXZNb250aE51bURheXMiLCJub3ciLCJpc0RheSIsIm5leHRNb250aE5lZWQiLCJuZXh0TW9udGgiLCJsb2NhbGVOYW1lcyIsIm5hbWVzIiwiYWRkRXZlbnRzIiwidGFyZ2V0cyIsImV2ZW50cyIsImFzQXJyYXkiLCJjb21iaW5lRXZlbnRzIiwiZ2V0S2V5IiwiZ2V0S2V5TmF2aWdhdGlvbiIsImdldFRhcmdldCIsImNsYXNzZXMiLCJoeXBoZW5hdGUiLCJzaG93IiwicG9wdXAiLCJfYyIsImJvdW5kcyIsInRyaWdnZXJMZWZ0IiwidHJpZ2dlclRvcCIsInRyaWdnZXJXaWR0aCIsInRyaWdnZXJIZWlnaHQiLCJwb3B1cFdpZHRoIiwicG9wdXBIZWlnaHQiLCJwYXJ0MSIsInBhcnQyIiwid2luV2lkdGgiLCJ3aW5IZWlnaHQiLCJsZWZ0IiwidG9wIiwidHJpZ2dlckJvdW5kcyIsInBhcmVudCIsImlucHV0IiwiYXR0cmlidXRlcyIsIm1pbiIsIm1heCIsImdldExlbmd0aCIsIl9vcGVuQmxvY2siLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwic2V0U2VsZWN0aW9uIiwiZ2V0U2VsZWN0aW9uIiwiVHJpZ2dlciIsIkNhbGVuZGFyIiwiSW5wdXRGaWVsZCIsIkljb24iLCJkZWZhdWx0Rm9ybWF0cyIsImZvcm1hdCIsImZvY3VzIiwiZ2V0RGF0ZVBhcnQiLCJjYWxlbmRhciIsInRvZ2dsZSIsInNlbGVjdGlvbiIsInNtb290aCIsInNjcm9sbCIsImxpbmVIZWlnaHQiLCJkaXN0YW5jZSIsImlzRGlnaXQiLCJjaGFyIiwiRGF0ZVBpY2tlciIsIlRpbWVQaWNrZXIiLCJkaXNhYmxlZCIsImFzc2lnbkRlZXBseSIsInNob3dQcmV2Iiwic2hvd05leHQiLCJjdXJyZW50UGFnZSIsIm51bVBhZ2VzIiwic2hvd0xlbmd0aCIsImJ1dHRvbnMiLCJwYWdlIiwiYnV0dG9uIiwidW5jaGVja2VkIiwiVHJhbnNpdGlvbkhlaWdodCIsImVuYWJsZWQiLCJjcmVhdGVFbGVtZW50Iiwic2V0U3R5bGUiLCJlbGVtZW50IiwibmV4dFRpbWVvdXQiLCJmb3JjZVJlcGFpbnQiLCJ3aWR0aCIsImhlaWdodCIsImhhc1ZOb2RlQ29udGVudCIsImhhc1Nsb3RDb250ZW50Il0sIm1hcHBpbmdzIjoiOztBQUFPLFNBQVNBLEdBQWFDLEdBQU07QUFDakMsU0FBTztBQUFBLElBQ0ws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
|
|
4123
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl0by11aS5lcy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2RhdGUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS9yZWFjdGl2aXR5L2Rpc3QvcmVhY3Rpdml0eS5lc20tYnVuZGxlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3J1bnRpbWUtY29yZS9kaXN0L3J1bnRpbWUtY29yZS5lc20tYnVuZGxlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVlL3J1bnRpbWUtZG9tL2Rpc3QvcnVudGltZS1kb20uZXNtLWJ1bmRsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdnVlL2Rpc3QvdnVlLnJ1bnRpbWUuZXNtLWJ1bmRsZXIuanMiLCIuLi9zcmMvY29tcG9uZW50cy9DYWxlbmRhci52dWUiLCIuLi9zcmMvdXRpbHMvZXZlbnQuanMiLCIuLi9zcmMvdXRpbHMvdHJpZ2dlci5qcyIsIi4uL3NyYy9jb21wb25lbnRzL1RyaWdnZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvSW5wdXRGaWVsZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9JY29uLnZ1ZSIsIi4uL3NyYy91dGlscy9zZWxlY3Rpb24uanMiLCIuLi9zcmMvY29tcG9uZW50cy9EYXRlUGlja2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL1RpbWVQaWNrZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGF0ZVRpbWVQaWNrZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvUGFnaW5hdGlvbi52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9Td2l0Y2hCdXR0b24udnVlIiwiLi4vc3JjL3RyYW5zaXRpb25zL1RyYW5zaXRpb25IZWlnaHQudnVlIiwiLi4vc3JjL3V0aWxzL3Z1ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVEYXRlKGRhdGUpIHtcbiAgcmV0dXJuIHtcbiAgICB5ZWFyOiBkYXRlPy5nZXRGdWxsWWVhcigpID8/IDAsXG4gICAgbW9udGg6IGRhdGU/LmdldE1vbnRoKCkgPz8gMCxcbiAgICBkYXk6IGRhdGU/LmdldERhdGUoKSA/PyAwLFxuICAgIGhvdXI6IGRhdGU/LmdldEhvdXJzKCkgPz8gMCxcbiAgICBtaW51dGU6IGRhdGU/LmdldE1pbnV0ZXMoKSA/PyAwLFxuICAgIHNlY29uZDogZGF0ZT8uZ2V0U2Vjb25kcygpID8/IDAsXG4gICAgbWlsbGlzZWNvbmQ6IGRhdGU/LmdldE1pbGxpc2Vjb25kcygpID8/IDBcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWx0ZXJEYXRlKGRhdGUsIG92ZXJyaWRlcyA9IHt9KSB7XG4gIHJldHVybiBuZXcgRGF0ZSguLi5PYmplY3QudmFsdWVzKHsgLi4uZGVzY3JpYmVEYXRlKGRhdGUpLCAuLi5vdmVycmlkZXMgfSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGUoc3RyaW5nLCB7XG4gIGxvY2FsZSA9ICdlbi1VUycsXG4gIGRhdGUgPSB0cnVlLFxuICB0aW1lID0gdHJ1ZVxufSA9IHt9KSB7XG4gIGNvbnN0IHRpbWVEZWZhdWx0ID0gdGltZSA/IG51bGwgOiAwXG4gIGxldCBbXG4gICAgZGF5LFxuICAgIHNlcDEsXG4gICAgbW9udGgsXG4gICAgc2VwMixcbiAgICB5ZWFyLFxuICAgICxcbiAgICBob3VyID0gdGltZURlZmF1bHQsXG4gICAgLFxuICAgIG1pbnV0ZSA9IHRpbWVEZWZhdWx0LFxuICAgICxcbiAgICBzZWNvbmQgPSB0aW1lRGVmYXVsdCxcbiAgICAsXG4gICAgbWlsbGlzZWNvbmQgPSB0aW1lRGVmYXVsdFxuICBdID0gZ2V0RGF0ZVBhcnRzKHN0cmluZywgeyBkYXRlLCB0aW1lIH0pXG4gIGlmICh5ZWFyICYmIHllYXIubGVuZ3RoID49IDQpIHtcbiAgICBpZiAobG9jYWxlID09PSAnZW4tVVMnICYmIHNlcDEgPT09ICcvJyAmJiBzZXAyID09PSAnLycpIHtcbiAgICAgIC8vIEFtZXJpY2FuIGZvcm1hdDogTU0vREQvWVlZWVxuICAgICAgO1tkYXksIG1vbnRoXSA9IFttb250aCwgZGF5XVxuICAgIH1cbiAgICBtb250aCA9IGdldE1vbnRoSW5kZXgobW9udGgsIHsgbG9jYWxlIH0pXG4gICAgY29uc3QgaXNWYWxpZFRpbWVQYXJ0ID0gcGFydCA9PiBwYXJ0ID09PSBudWxsIHx8IHBhcnQubGVuZ3RoID09PSAyXG4gICAgaWYgKFxuICAgICAgbW9udGggIT09IG51bGwgJiYgKFxuICAgICAgICAhdGltZSB8fCAoXG4gICAgICAgICAgaXNWYWxpZFRpbWVQYXJ0KGhvdXIpICYmXG4gICAgICAgICAgaXNWYWxpZFRpbWVQYXJ0KG1pbnV0ZSkgJiZcbiAgICAgICAgICBpc1ZhbGlkVGltZVBhcnQoc2Vjb25kKVxuICAgICAgICApXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoXG4gICAgICAgICt5ZWFyLFxuICAgICAgICArbW9udGgsXG4gICAgICAgICtkYXksXG4gICAgICAgICtob3VyLFxuICAgICAgICArbWludXRlLFxuICAgICAgICArc2Vjb25kLFxuICAgICAgICArbWlsbGlzZWNvbmRcbiAgICAgIClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGVQYXJ0QXRQb3NpdGlvbihzdHJpbmcsIHBvc2l0aW9uLCB7XG4gIGxvY2FsZSA9ICdlbi1VUycsXG4gIGRhdGUgPSB0cnVlLFxuICB0aW1lID0gdHJ1ZVxufSA9IHt9KSB7XG4gIGNvbnN0IHBhcnRzID0gZ2V0RGF0ZVBhcnRzKHN0cmluZywgeyBkYXRlLCB0aW1lIH0pXG5cbiAgY29uc3QgZ2V0UG9zaXRpb24gPSAocG9zaXRpb24sIGxlbmd0aCA9IHBhcnRzLmxlbmd0aCkgPT4ge1xuICAgIGxldCBwb3MgPSAwXG4gICAgbGV0IGluZGV4ID0gMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bm1vZGlmaWVkLWxvb3AtY29uZGl0aW9uXG4gICAgd2hpbGUgKChwb3NpdGlvbiA9PT0gbnVsbCB8fCBwb3MgPD0gcG9zaXRpb24pICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBwb3MgKz0gcGFydHNbaW5kZXgrK10/Lmxlbmd0aCA/PyAwXG4gICAgfVxuICAgIHJldHVybiB7IHBvc2l0aW9uOiBwb3MsIGluZGV4IH1cbiAgfVxuXG4gIC8vIFRpbWUgc3RhcnRzIGF0IGluZGV4IDYsIGR1ZSB0byB0aGUgc2VwYXJhdG9yIGFmdGVyIHRoZSBkYXRlLlxuICBjb25zdCBvZmZzZXQgPSAhZGF0ZSA/IGdldFBvc2l0aW9uKG51bGwsIDYpLnBvc2l0aW9uIDogMFxuICBwb3NpdGlvbiArPSBvZmZzZXRcblxuICBsZXQgeyBpbmRleCB9ID0gZ2V0UG9zaXRpb24ocG9zaXRpb24pXG5cbiAgY29uc3QgaXNVUyA9IGxvY2FsZSA9PT0gJ2VuLVVTJ1xuICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgaXNVUyA/ICdtb250aCcgOiAnZGF5JyxcbiAgICBudWxsLFxuICAgIGlzVVMgPyAnZGF5JyA6ICdtb250aCcsXG4gICAgbnVsbCxcbiAgICAneWVhcicsXG4gICAgbnVsbCxcbiAgICAnaG91cicsXG4gICAgbnVsbCxcbiAgICAnbWludXRlJyxcbiAgICBudWxsLFxuICAgICdzZWNvbmQnLFxuICAgIG51bGwsXG4gICAgJ21pbGxpc2Vjb25kJ1xuICBdXG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgaWYgKHZhbHVlc1tpbmRleF0pIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gZ2V0UG9zaXRpb24obnVsbCwgaW5kZXgpLnBvc2l0aW9uIC0gb2Zmc2V0XG4gICAgICBjb25zdCBlbmQgPSBzdGFydCArIHBhcnRzW2luZGV4XS5sZW5ndGhcbiAgICAgIHJldHVybiB7IG5hbWU6IHZhbHVlc1tpbmRleF0sIHN0YXJ0LCBlbmQgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBnZXREYXRlUGFydHMoc3RyaW5nLCB7IGRhdGUgPSB0cnVlLCB0aW1lID0gdHJ1ZSB9ID0ge30pIHtcbiAgY29uc3QgcGFydHMgPSBzdHJpbmc/LnNwbGl0KC8oW1xccy4sOi9dKykvKSB8fCBbXVxuICBpZiAoIWRhdGUpIHtcbiAgICAvLyBBZGQgZHVtbXkgZGF0ZSBwYXJ0cyB0byBtYWtlIHN1cmUgd2UgZ2V0IGEgdGltZS1vbmx5IGRhdGUuXG4gICAgcGFydHMudW5zaGlmdCgnMScsICcuJywgJzEnLCAnLicsICcyMDAwJywgJyAnKVxuICB9XG4gIGlmICghdGltZSAmJiBwYXJ0cy5sZW5ndGggPiA1KSB7XG4gICAgcGFydHMubGVuZ3RoID0gNVxuICB9XG4gIHJldHVybiBwYXJ0c1xufVxuXG5mdW5jdGlvbiBnZXRNb250aEluZGV4KG1vbnRoLCB7IGxvY2FsZSA9ICdlbi1VUycgfSA9IHt9KSB7XG4gIGNvbnN0IHZhbHVlID0gK21vbnRoXG4gIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlIC0gMVxuICB9XG4gIGNvbnN0IG1hdGNoID0gbW9udGgudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgaWYgKG1hdGNoLmxlbmd0aCA8IDMpIHJldHVybiBudWxsXG4gIGNvbnN0IHNob3J0Rm9ybWF0ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCB7IG1vbnRoOiAnc2hvcnQnIH0pXG4gIGNvbnN0IGxvbmdGb3JtYXQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIHsgbW9udGg6ICdsb25nJyB9KVxuICBmb3IgKGxldCBpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMjAwMCwgaSwgMSlcbiAgICBpZiAoXG4gICAgICBzaG9ydEZvcm1hdC5mb3JtYXQoZGF0ZSkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoKSB8fFxuICAgICAgbG9uZ0Zvcm1hdC5mb3JtYXQoZGF0ZSkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoKVxuICAgICkge1xuICAgICAgcmV0dXJuIGlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbiIsIi8qKlxuKiBAdnVlL3JlYWN0aXZpdHkgdjMuNC4xMFxuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuaW1wb3J0IHsgTk9PUCwgZXh0ZW5kLCBpc0FycmF5LCBpc1N5bWJvbCwgaXNNYXAsIGlzSW50ZWdlcktleSwgaGFzT3duLCBoYXNDaGFuZ2VkLCBpc09iamVjdCwgbWFrZU1hcCwgY2FwaXRhbGl6ZSwgdG9SYXdUeXBlLCBkZWYsIGlzRnVuY3Rpb24gfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmZ1bmN0aW9uIHdhcm4obXNnLCAuLi5hcmdzKSB7XG4gIGNvbnNvbGUud2FybihgW1Z1ZSB3YXJuXSAke21zZ31gLCAuLi5hcmdzKTtcbn1cblxubGV0IGFjdGl2ZUVmZmVjdFNjb3BlO1xuY2xhc3MgRWZmZWN0U2NvcGUge1xuICBjb25zdHJ1Y3RvcihkZXRhY2hlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy5kZXRhY2hlZCA9IGRldGFjaGVkO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5lZmZlY3RzID0gW107XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5jbGVhbnVwcyA9IFtdO1xuICAgIHRoaXMucGFyZW50ID0gYWN0aXZlRWZmZWN0U2NvcGU7XG4gICAgaWYgKCFkZXRhY2hlZCAmJiBhY3RpdmVFZmZlY3RTY29wZSkge1xuICAgICAgdGhpcy5pbmRleCA9IChhY3RpdmVFZmZlY3RTY29wZS5zY29wZXMgfHwgKGFjdGl2ZUVmZmVjdFNjb3BlLnNjb3BlcyA9IFtdKSkucHVzaChcbiAgICAgICAgdGhpc1xuICAgICAgKSAtIDE7XG4gICAgfVxuICB9XG4gIGdldCBhY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgfVxuICBydW4oZm4pIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG4gICAgICBjb25zdCBjdXJyZW50RWZmZWN0U2NvcGUgPSBhY3RpdmVFZmZlY3RTY29wZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhY3RpdmVFZmZlY3RTY29wZSA9IGN1cnJlbnRFZmZlY3RTY29wZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4oYGNhbm5vdCBydW4gYW4gaW5hY3RpdmUgZWZmZWN0IHNjb3BlLmApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gbm9uLWRldGFjaGVkIHNjb3Blc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uKCkge1xuICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gdGhpcztcbiAgfVxuICAvKipcbiAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gbm9uLWRldGFjaGVkIHNjb3Blc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9mZigpIHtcbiAgICBhY3RpdmVFZmZlY3RTY29wZSA9IHRoaXMucGFyZW50O1xuICB9XG4gIHN0b3AoZnJvbVBhcmVudCkge1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIGxldCBpLCBsO1xuICAgICAgZm9yIChpID0gMCwgbCA9IHRoaXMuZWZmZWN0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdGhpcy5lZmZlY3RzW2ldLnN0b3AoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IDAsIGwgPSB0aGlzLmNsZWFudXBzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB0aGlzLmNsZWFudXBzW2ldKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zY29wZXMpIHtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IHRoaXMuc2NvcGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIHRoaXMuc2NvcGVzW2ldLnN0b3AodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5kZXRhY2hlZCAmJiB0aGlzLnBhcmVudCAmJiAhZnJvbVBhcmVudCkge1xuICAgICAgICBjb25zdCBsYXN0ID0gdGhpcy5wYXJlbnQuc2NvcGVzLnBvcCgpO1xuICAgICAgICBpZiAobGFzdCAmJiBsYXN0ICE9PSB0aGlzKSB7XG4gICAgICAgICAgdGhpcy5wYXJlbnQuc2NvcGVzW3RoaXMuaW5kZXhdID0gbGFzdDtcbiAgICAgICAgICBsYXN0LmluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5wYXJlbnQgPSB2b2lkIDA7XG4gICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVmZmVjdFNjb3BlKGRldGFjaGVkKSB7XG4gIHJldHVybiBuZXcgRWZmZWN0U2NvcGUoZGV0YWNoZWQpO1xufVxuZnVuY3Rpb24gcmVjb3JkRWZmZWN0U2NvcGUoZWZmZWN0LCBzY29wZSA9IGFjdGl2ZUVmZmVjdFNjb3BlKSB7XG4gIGlmIChzY29wZSAmJiBzY29wZS5hY3RpdmUpIHtcbiAgICBzY29wZS5lZmZlY3RzLnB1c2goZWZmZWN0KTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q3VycmVudFNjb3BlKCkge1xuICByZXR1cm4gYWN0aXZlRWZmZWN0U2NvcGU7XG59XG5mdW5jdGlvbiBvblNjb3BlRGlzcG9zZShmbikge1xuICBpZiAoYWN0aXZlRWZmZWN0U2NvcGUpIHtcbiAgICBhY3RpdmVFZmZlY3RTY29wZS5jbGVhbnVwcy5wdXNoKGZuKTtcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybihcbiAgICAgIGBvblNjb3BlRGlzcG9zZSgpIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBlZmZlY3Qgc2NvcGUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoLmBcbiAgICApO1xuICB9XG59XG5cbmxldCBhY3RpdmVFZmZlY3Q7XG5jbGFzcyBSZWFjdGl2ZUVmZmVjdCB7XG4gIGNvbnN0cnVjdG9yKGZuLCB0cmlnZ2VyLCBzY2hlZHVsZXIsIHNjb3BlKSB7XG4gICAgdGhpcy5mbiA9IGZuO1xuICAgIHRoaXMudHJpZ2dlciA9IHRyaWdnZXI7XG4gICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuZGVwcyA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX2RpcnR5TGV2ZWwgPSAzO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX3RyYWNrSWQgPSAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX3J1bm5pbmdzID0gMDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLl9xdWVyeWluZ3MgPSAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX2RlcHNMZW5ndGggPSAwO1xuICAgIHJlY29yZEVmZmVjdFNjb3BlKHRoaXMsIHNjb3BlKTtcbiAgfVxuICBnZXQgZGlydHkoKSB7XG4gICAgaWYgKHRoaXMuX2RpcnR5TGV2ZWwgPT09IDEpIHtcbiAgICAgIHRoaXMuX2RpcnR5TGV2ZWwgPSAwO1xuICAgICAgdGhpcy5fcXVlcnlpbmdzKys7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiB0aGlzLmRlcHMpIHtcbiAgICAgICAgaWYgKGRlcC5jb21wdXRlZCkge1xuICAgICAgICAgIHRyaWdnZXJDb21wdXRlZChkZXAuY29tcHV0ZWQpO1xuICAgICAgICAgIGlmICh0aGlzLl9kaXJ0eUxldmVsID49IDIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgdGhpcy5fcXVlcnlpbmdzLS07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kaXJ0eUxldmVsID49IDI7XG4gIH1cbiAgc2V0IGRpcnR5KHYpIHtcbiAgICB0aGlzLl9kaXJ0eUxldmVsID0gdiA/IDMgOiAwO1xuICB9XG4gIHJ1bigpIHtcbiAgICB0aGlzLl9kaXJ0eUxldmVsID0gMDtcbiAgICBpZiAoIXRoaXMuYWN0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5mbigpO1xuICAgIH1cbiAgICBsZXQgbGFzdFNob3VsZFRyYWNrID0gc2hvdWxkVHJhY2s7XG4gICAgbGV0IGxhc3RFZmZlY3QgPSBhY3RpdmVFZmZlY3Q7XG4gICAgdHJ5IHtcbiAgICAgIHNob3VsZFRyYWNrID0gdHJ1ZTtcbiAgICAgIGFjdGl2ZUVmZmVjdCA9IHRoaXM7XG4gICAgICB0aGlzLl9ydW5uaW5ncysrO1xuICAgICAgcHJlQ2xlYW51cEVmZmVjdCh0aGlzKTtcbiAgICAgIHJldHVybiB0aGlzLmZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHBvc3RDbGVhbnVwRWZmZWN0KHRoaXMpO1xuICAgICAgdGhpcy5fcnVubmluZ3MtLTtcbiAgICAgIGFjdGl2ZUVmZmVjdCA9IGxhc3RFZmZlY3Q7XG4gICAgICBzaG91bGRUcmFjayA9IGxhc3RTaG91bGRUcmFjaztcbiAgICB9XG4gIH1cbiAgc3RvcCgpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgICBwcmVDbGVhbnVwRWZmZWN0KHRoaXMpO1xuICAgICAgcG9zdENsZWFudXBFZmZlY3QodGhpcyk7XG4gICAgICAoX2EgPSB0aGlzLm9uU3RvcCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlckNvbXB1dGVkKGNvbXB1dGVkKSB7XG4gIHJldHVybiBjb21wdXRlZC52YWx1ZTtcbn1cbmZ1bmN0aW9uIHByZUNsZWFudXBFZmZlY3QoZWZmZWN0Mikge1xuICBlZmZlY3QyLl90cmFja0lkKys7XG4gIGVmZmVjdDIuX2RlcHNMZW5ndGggPSAwO1xufVxuZnVuY3Rpb24gcG9zdENsZWFudXBFZmZlY3QoZWZmZWN0Mikge1xuICBpZiAoZWZmZWN0Mi5kZXBzICYmIGVmZmVjdDIuZGVwcy5sZW5ndGggPiBlZmZlY3QyLl9kZXBzTGVuZ3RoKSB7XG4gICAgZm9yIChsZXQgaSA9IGVmZmVjdDIuX2RlcHNMZW5ndGg7IGkgPCBlZmZlY3QyLmRlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNsZWFudXBEZXBFZmZlY3QoZWZmZWN0Mi5kZXBzW2ldLCBlZmZlY3QyKTtcbiAgICB9XG4gICAgZWZmZWN0Mi5kZXBzLmxlbmd0aCA9IGVmZmVjdDIuX2RlcHNMZW5ndGg7XG4gIH1cbn1cbmZ1bmN0aW9uIGNsZWFudXBEZXBFZmZlY3QoZGVwLCBlZmZlY3QyKSB7XG4gIGNvbnN0IHRyYWNrSWQgPSBkZXAuZ2V0KGVmZmVjdDIpO1xuICBpZiAodHJhY2tJZCAhPT0gdm9pZCAwICYmIGVmZmVjdDIuX3RyYWNrSWQgIT09IHRyYWNrSWQpIHtcbiAgICBkZXAuZGVsZXRlKGVmZmVjdDIpO1xuICAgIGlmIChkZXAuc2l6ZSA9PT0gMCkge1xuICAgICAgZGVwLmNsZWFudXAoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVmZmVjdChmbiwgb3B0aW9ucykge1xuICBpZiAoZm4uZWZmZWN0IGluc3RhbmNlb2YgUmVhY3RpdmVFZmZlY3QpIHtcbiAgICBmbiA9IGZuLmVmZmVjdC5mbjtcbiAgfVxuICBjb25zdCBfZWZmZWN0ID0gbmV3IFJlYWN0aXZlRWZmZWN0KGZuLCBOT09QLCAoKSA9PiB7XG4gICAgaWYgKF9lZmZlY3QuZGlydHkpIHtcbiAgICAgIF9lZmZlY3QucnVuKCk7XG4gICAgfVxuICB9KTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBleHRlbmQoX2VmZmVjdCwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMuc2NvcGUpXG4gICAgICByZWNvcmRFZmZlY3RTY29wZShfZWZmZWN0LCBvcHRpb25zLnNjb3BlKTtcbiAgfVxuICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubGF6eSkge1xuICAgIF9lZmZlY3QucnVuKCk7XG4gIH1cbiAgY29uc3QgcnVubmVyID0gX2VmZmVjdC5ydW4uYmluZChfZWZmZWN0KTtcbiAgcnVubmVyLmVmZmVjdCA9IF9lZmZlY3Q7XG4gIHJldHVybiBydW5uZXI7XG59XG5mdW5jdGlvbiBzdG9wKHJ1bm5lcikge1xuICBydW5uZXIuZWZmZWN0LnN0b3AoKTtcbn1cbmxldCBzaG91bGRUcmFjayA9IHRydWU7XG5sZXQgcGF1c2VTY2hlZHVsZVN0YWNrID0gMDtcbmNvbnN0IHRyYWNrU3RhY2sgPSBbXTtcbmZ1bmN0aW9uIHBhdXNlVHJhY2tpbmcoKSB7XG4gIHRyYWNrU3RhY2sucHVzaChzaG91bGRUcmFjayk7XG4gIHNob3VsZFRyYWNrID0gZmFsc2U7XG59XG5mdW5jdGlvbiBlbmFibGVUcmFja2luZygpIHtcbiAgdHJhY2tTdGFjay5wdXNoKHNob3VsZFRyYWNrKTtcbiAgc2hvdWxkVHJhY2sgPSB0cnVlO1xufVxuZnVuY3Rpb24gcmVzZXRUcmFja2luZygpIHtcbiAgY29uc3QgbGFzdCA9IHRyYWNrU3RhY2sucG9wKCk7XG4gIHNob3VsZFRyYWNrID0gbGFzdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IGxhc3Q7XG59XG5mdW5jdGlvbiBwYXVzZVNjaGVkdWxpbmcoKSB7XG4gIHBhdXNlU2NoZWR1bGVTdGFjaysrO1xufVxuZnVuY3Rpb24gcmVzZXRTY2hlZHVsaW5nKCkge1xuICBwYXVzZVNjaGVkdWxlU3RhY2stLTtcbiAgd2hpbGUgKCFwYXVzZVNjaGVkdWxlU3RhY2sgJiYgcXVldWVFZmZlY3RTY2hlZHVsZXJzLmxlbmd0aCkge1xuICAgIHF1ZXVlRWZmZWN0U2NoZWR1bGVycy5zaGlmdCgpKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRyYWNrRWZmZWN0KGVmZmVjdDIsIGRlcCwgZGVidWdnZXJFdmVudEV4dHJhSW5mbykge1xuICB2YXIgX2E7XG4gIGlmIChkZXAuZ2V0KGVmZmVjdDIpICE9PSBlZmZlY3QyLl90cmFja0lkKSB7XG4gICAgZGVwLnNldChlZmZlY3QyLCBlZmZlY3QyLl90cmFja0lkKTtcbiAgICBjb25zdCBvbGREZXAgPSBlZmZlY3QyLmRlcHNbZWZmZWN0Mi5fZGVwc0xlbmd0aF07XG4gICAgaWYgKG9sZERlcCAhPT0gZGVwKSB7XG4gICAgICBpZiAob2xkRGVwKSB7XG4gICAgICAgIGNsZWFudXBEZXBFZmZlY3Qob2xkRGVwLCBlZmZlY3QyKTtcbiAgICAgIH1cbiAgICAgIGVmZmVjdDIuZGVwc1tlZmZlY3QyLl9kZXBzTGVuZ3RoKytdID0gZGVwO1xuICAgIH0gZWxzZSB7XG4gICAgICBlZmZlY3QyLl9kZXBzTGVuZ3RoKys7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAoX2EgPSBlZmZlY3QyLm9uVHJhY2spID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWxsKGVmZmVjdDIsIGV4dGVuZCh7IGVmZmVjdDogZWZmZWN0MiB9LCBkZWJ1Z2dlckV2ZW50RXh0cmFJbmZvKSk7XG4gICAgfVxuICB9XG59XG5jb25zdCBxdWV1ZUVmZmVjdFNjaGVkdWxlcnMgPSBbXTtcbmZ1bmN0aW9uIHRyaWdnZXJFZmZlY3RzKGRlcCwgZGlydHlMZXZlbCwgZGVidWdnZXJFdmVudEV4dHJhSW5mbykge1xuICB2YXIgX2E7XG4gIHBhdXNlU2NoZWR1bGluZygpO1xuICBmb3IgKGNvbnN0IGVmZmVjdDIgb2YgZGVwLmtleXMoKSkge1xuICAgIGlmICghZWZmZWN0Mi5hbGxvd1JlY3Vyc2UgJiYgZWZmZWN0Mi5fcnVubmluZ3MpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZWZmZWN0Mi5fZGlydHlMZXZlbCA8IGRpcnR5TGV2ZWwgJiYgKCFlZmZlY3QyLl9ydW5uaW5ncyB8fCBkaXJ0eUxldmVsICE9PSAyKSkge1xuICAgICAgY29uc3QgbGFzdERpcnR5TGV2ZWwgPSBlZmZlY3QyLl9kaXJ0eUxldmVsO1xuICAgICAgZWZmZWN0Mi5fZGlydHlMZXZlbCA9IGRpcnR5TGV2ZWw7XG4gICAgICBpZiAobGFzdERpcnR5TGV2ZWwgPT09IDAgJiYgKCFlZmZlY3QyLl9xdWVyeWluZ3MgfHwgZGlydHlMZXZlbCAhPT0gMikpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAoX2EgPSBlZmZlY3QyLm9uVHJpZ2dlcikgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmNhbGwoZWZmZWN0MiwgZXh0ZW5kKHsgZWZmZWN0OiBlZmZlY3QyIH0sIGRlYnVnZ2VyRXZlbnRFeHRyYUluZm8pKTtcbiAgICAgICAgfVxuICAgICAgICBlZmZlY3QyLnRyaWdnZXIoKTtcbiAgICAgICAgaWYgKGVmZmVjdDIuc2NoZWR1bGVyKSB7XG4gICAgICAgICAgcXVldWVFZmZlY3RTY2hlZHVsZXJzLnB1c2goZWZmZWN0Mi5zY2hlZHVsZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlc2V0U2NoZWR1bGluZygpO1xufVxuXG5jb25zdCBjcmVhdGVEZXAgPSAoY2xlYW51cCwgY29tcHV0ZWQpID0+IHtcbiAgY29uc3QgZGVwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgZGVwLmNsZWFudXAgPSBjbGVhbnVwO1xuICBkZXAuY29tcHV0ZWQgPSBjb21wdXRlZDtcbiAgcmV0dXJuIGRlcDtcbn07XG5cbmNvbnN0IHRhcmdldE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgSVRFUkFURV9LRVkgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IFwiaXRlcmF0ZVwiIDogXCJcIik7XG5jb25zdCBNQVBfS0VZX0lURVJBVEVfS0VZID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBcIk1hcCBrZXkgaXRlcmF0ZVwiIDogXCJcIik7XG5mdW5jdGlvbiB0cmFjayh0YXJnZXQsIHR5cGUsIGtleSkge1xuICBpZiAoc2hvdWxkVHJhY2sgJiYgYWN0aXZlRWZmZWN0KSB7XG4gICAgbGV0IGRlcHNNYXAgPSB0YXJnZXRNYXAuZ2V0KHRhcmdldCk7XG4gICAgaWYgKCFkZXBzTWFwKSB7XG4gICAgICB0YXJnZXRNYXAuc2V0KHRhcmdldCwgZGVwc01hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkpO1xuICAgIH1cbiAgICBsZXQgZGVwID0gZGVwc01hcC5nZXQoa2V5KTtcbiAgICBpZiAoIWRlcCkge1xuICAgICAgZGVwc01hcC5zZXQoa2V5LCBkZXAgPSBjcmVhdGVEZXAoKCkgPT4gZGVwc01hcC5kZWxldGUoa2V5KSkpO1xuICAgIH1cbiAgICB0cmFja0VmZmVjdChcbiAgICAgIGFjdGl2ZUVmZmVjdCxcbiAgICAgIGRlcCxcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB7XG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgdHlwZSxcbiAgICAgICAga2V5XG4gICAgICB9IDogdm9pZCAwXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlcih0YXJnZXQsIHR5cGUsIGtleSwgbmV3VmFsdWUsIG9sZFZhbHVlLCBvbGRUYXJnZXQpIHtcbiAgY29uc3QgZGVwc01hcCA9IHRhcmdldE1hcC5nZXQodGFyZ2V0KTtcbiAgaWYgKCFkZXBzTWFwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBkZXBzID0gW107XG4gIGlmICh0eXBlID09PSBcImNsZWFyXCIpIHtcbiAgICBkZXBzID0gWy4uLmRlcHNNYXAudmFsdWVzKCldO1xuICB9IGVsc2UgaWYgKGtleSA9PT0gXCJsZW5ndGhcIiAmJiBpc0FycmF5KHRhcmdldCkpIHtcbiAgICBjb25zdCBuZXdMZW5ndGggPSBOdW1iZXIobmV3VmFsdWUpO1xuICAgIGRlcHNNYXAuZm9yRWFjaCgoZGVwLCBrZXkyKSA9PiB7XG4gICAgICBpZiAoa2V5MiA9PT0gXCJsZW5ndGhcIiB8fCAhaXNTeW1ib2woa2V5MikgJiYga2V5MiA+PSBuZXdMZW5ndGgpIHtcbiAgICAgICAgZGVwcy5wdXNoKGRlcCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGtleSAhPT0gdm9pZCAwKSB7XG4gICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoa2V5KSk7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICBpZiAoIWlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChJVEVSQVRFX0tFWSkpO1xuICAgICAgICAgIGlmIChpc01hcCh0YXJnZXQpKSB7XG4gICAgICAgICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoTUFQX0tFWV9JVEVSQVRFX0tFWSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc0ludGVnZXJLZXkoa2V5KSkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChcImxlbmd0aFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICAgIGlmICghaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KElURVJBVEVfS0VZKSk7XG4gICAgICAgICAgaWYgKGlzTWFwKHRhcmdldCkpIHtcbiAgICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChNQVBfS0VZX0lURVJBVEVfS0VZKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInNldFwiOlxuICAgICAgICBpZiAoaXNNYXAodGFyZ2V0KSkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChJVEVSQVRFX0tFWSkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBwYXVzZVNjaGVkdWxpbmcoKTtcbiAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgIGlmIChkZXApIHtcbiAgICAgIHRyaWdnZXJFZmZlY3RzKFxuICAgICAgICBkZXAsXG4gICAgICAgIDMsXG4gICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB7XG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICAgIG9sZFZhbHVlLFxuICAgICAgICAgIG9sZFRhcmdldFxuICAgICAgICB9IDogdm9pZCAwXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXNldFNjaGVkdWxpbmcoKTtcbn1cbmZ1bmN0aW9uIGdldERlcEZyb21SZWFjdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgX2E7XG4gIHJldHVybiAoX2EgPSB0YXJnZXRNYXAuZ2V0KG9iamVjdCkpID09IG51bGwgPyB2b2lkIDAgOiBfYS5nZXQoa2V5KTtcbn1cblxuY29uc3QgaXNOb25UcmFja2FibGVLZXlzID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoYF9fcHJvdG9fXyxfX3ZfaXNSZWYsX19pc1Z1ZWApO1xuY29uc3QgYnVpbHRJblN5bWJvbHMgPSBuZXcgU2V0KFxuICAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcImFyZ3VtZW50c1wiICYmIGtleSAhPT0gXCJjYWxsZXJcIikubWFwKChrZXkpID0+IFN5bWJvbFtrZXldKS5maWx0ZXIoaXNTeW1ib2wpXG4pO1xuY29uc3QgYXJyYXlJbnN0cnVtZW50YXRpb25zID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUFycmF5SW5zdHJ1bWVudGF0aW9ucygpO1xuZnVuY3Rpb24gY3JlYXRlQXJyYXlJbnN0cnVtZW50YXRpb25zKCkge1xuICBjb25zdCBpbnN0cnVtZW50YXRpb25zID0ge307XG4gIFtcImluY2x1ZGVzXCIsIFwiaW5kZXhPZlwiLCBcImxhc3RJbmRleE9mXCJdLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGluc3RydW1lbnRhdGlvbnNba2V5XSA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IGFyciA9IHRvUmF3KHRoaXMpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB0cmFjayhhcnIsIFwiZ2V0XCIsIGkgKyBcIlwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcyA9IGFycltrZXldKC4uLmFyZ3MpO1xuICAgICAgaWYgKHJlcyA9PT0gLTEgfHwgcmVzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gYXJyW2tleV0oLi4uYXJncy5tYXAodG9SYXcpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIFtcInB1c2hcIiwgXCJwb3BcIiwgXCJzaGlmdFwiLCBcInVuc2hpZnRcIiwgXCJzcGxpY2VcIl0uZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaW5zdHJ1bWVudGF0aW9uc1trZXldID0gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgcGF1c2VUcmFja2luZygpO1xuICAgICAgcGF1c2VTY2hlZHVsaW5nKCk7XG4gICAgICBjb25zdCByZXMgPSB0b1Jhdyh0aGlzKVtrZXldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgcmVzZXRTY2hlZHVsaW5nKCk7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gIH0pO1xuICByZXR1cm4gaW5zdHJ1bWVudGF0aW9ucztcbn1cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KGtleSkge1xuICBjb25zdCBvYmogPSB0b1Jhdyh0aGlzKTtcbiAgdHJhY2sob2JqLCBcImhhc1wiLCBrZXkpO1xuICByZXR1cm4gb2JqLmhhc093blByb3BlcnR5KGtleSk7XG59XG5jbGFzcyBCYXNlUmVhY3RpdmVIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoX2lzUmVhZG9ubHkgPSBmYWxzZSwgX3NoYWxsb3cgPSBmYWxzZSkge1xuICAgIHRoaXMuX2lzUmVhZG9ubHkgPSBfaXNSZWFkb25seTtcbiAgICB0aGlzLl9zaGFsbG93ID0gX3NoYWxsb3c7XG4gIH1cbiAgZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcikge1xuICAgIGNvbnN0IGlzUmVhZG9ubHkyID0gdGhpcy5faXNSZWFkb25seSwgc2hhbGxvdyA9IHRoaXMuX3NoYWxsb3c7XG4gICAgaWYgKGtleSA9PT0gXCJfX3ZfaXNSZWFjdGl2ZVwiKSB7XG4gICAgICByZXR1cm4gIWlzUmVhZG9ubHkyO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9pc1JlYWRvbmx5XCIpIHtcbiAgICAgIHJldHVybiBpc1JlYWRvbmx5MjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfaXNTaGFsbG93XCIpIHtcbiAgICAgIHJldHVybiBzaGFsbG93O1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9yYXdcIikge1xuICAgICAgaWYgKHJlY2VpdmVyID09PSAoaXNSZWFkb25seTIgPyBzaGFsbG93ID8gc2hhbGxvd1JlYWRvbmx5TWFwIDogcmVhZG9ubHlNYXAgOiBzaGFsbG93ID8gc2hhbGxvd1JlYWN0aXZlTWFwIDogcmVhY3RpdmVNYXApLmdldCh0YXJnZXQpIHx8IC8vIHJlY2VpdmVyIGlzIG5vdCB0aGUgcmVhY3RpdmUgcHJveHksIGJ1dCBoYXMgdGhlIHNhbWUgcHJvdG90eXBlXG4gICAgICAvLyB0aGlzIG1lYW5zIHRoZSByZWNpZXZlciBpcyBhIHVzZXIgcHJveHkgb2YgdGhlIHJlYWN0aXZlIHByb3h5XG4gICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHJlY2VpdmVyKSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRJc0FycmF5ID0gaXNBcnJheSh0YXJnZXQpO1xuICAgIGlmICghaXNSZWFkb25seTIpIHtcbiAgICAgIGlmICh0YXJnZXRJc0FycmF5ICYmIGhhc093bihhcnJheUluc3RydW1lbnRhdGlvbnMsIGtleSkpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KGFycmF5SW5zdHJ1bWVudGF0aW9ucywga2V5LCByZWNlaXZlcik7XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSBcImhhc093blByb3BlcnR5XCIpIHtcbiAgICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXMgPSBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICAgIGlmIChpc1N5bWJvbChrZXkpID8gYnVpbHRJblN5bWJvbHMuaGFzKGtleSkgOiBpc05vblRyYWNrYWJsZUtleXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKCFpc1JlYWRvbmx5Mikge1xuICAgICAgdHJhY2sodGFyZ2V0LCBcImdldFwiLCBrZXkpO1xuICAgIH1cbiAgICBpZiAoc2hhbGxvdykge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKGlzUmVmKHJlcykpIHtcbiAgICAgIHJldHVybiB0YXJnZXRJc0FycmF5ICYmIGlzSW50ZWdlcktleShrZXkpID8gcmVzIDogcmVzLnZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3QocmVzKSkge1xuICAgICAgcmV0dXJuIGlzUmVhZG9ubHkyID8gcmVhZG9ubHkocmVzKSA6IHJlYWN0aXZlKHJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbmNsYXNzIE11dGFibGVSZWFjdGl2ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlUmVhY3RpdmVIYW5kbGVyIHtcbiAgY29uc3RydWN0b3Ioc2hhbGxvdyA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZmFsc2UsIHNoYWxsb3cpO1xuICB9XG4gIHNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gICAgbGV0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgaWYgKCF0aGlzLl9zaGFsbG93KSB7XG4gICAgICBjb25zdCBpc09sZFZhbHVlUmVhZG9ubHkgPSBpc1JlYWRvbmx5KG9sZFZhbHVlKTtcbiAgICAgIGlmICghaXNTaGFsbG93KHZhbHVlKSAmJiAhaXNSZWFkb25seSh2YWx1ZSkpIHtcbiAgICAgICAgb2xkVmFsdWUgPSB0b1JhdyhvbGRWYWx1ZSk7XG4gICAgICAgIHZhbHVlID0gdG9SYXcodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0FycmF5KHRhcmdldCkgJiYgaXNSZWYob2xkVmFsdWUpICYmICFpc1JlZih2YWx1ZSkpIHtcbiAgICAgICAgaWYgKGlzT2xkVmFsdWVSZWFkb25seSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbGRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGhhZEtleSA9IGlzQXJyYXkodGFyZ2V0KSAmJiBpc0ludGVnZXJLZXkoa2V5KSA/IE51bWJlcihrZXkpIDwgdGFyZ2V0Lmxlbmd0aCA6IGhhc093bih0YXJnZXQsIGtleSk7XG4gICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcik7XG4gICAgaWYgKHRhcmdldCA9PT0gdG9SYXcocmVjZWl2ZXIpKSB7XG4gICAgICBpZiAoIWhhZEtleSkge1xuICAgICAgICB0cmlnZ2VyKHRhcmdldCwgXCJhZGRcIiwga2V5LCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGhhc0NoYW5nZWQodmFsdWUsIG9sZFZhbHVlKSkge1xuICAgICAgICB0cmlnZ2VyKHRhcmdldCwgXCJzZXRcIiwga2V5LCB2YWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwga2V5KSB7XG4gICAgY29uc3QgaGFkS2V5ID0gaGFzT3duKHRhcmdldCwga2V5KTtcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRhcmdldFtrZXldO1xuICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBrZXkpO1xuICAgIGlmIChyZXN1bHQgJiYgaGFkS2V5KSB7XG4gICAgICB0cmlnZ2VyKHRhcmdldCwgXCJkZWxldGVcIiwga2V5LCB2b2lkIDAsIG9sZFZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBoYXModGFyZ2V0LCBrZXkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0Lmhhcyh0YXJnZXQsIGtleSk7XG4gICAgaWYgKCFpc1N5bWJvbChrZXkpIHx8ICFidWlsdEluU3ltYm9scy5oYXMoa2V5KSkge1xuICAgICAgdHJhY2sodGFyZ2V0LCBcImhhc1wiLCBrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIG93bktleXModGFyZ2V0KSB7XG4gICAgdHJhY2soXG4gICAgICB0YXJnZXQsXG4gICAgICBcIml0ZXJhdGVcIixcbiAgICAgIGlzQXJyYXkodGFyZ2V0KSA/IFwibGVuZ3RoXCIgOiBJVEVSQVRFX0tFWVxuICAgICk7XG4gICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpO1xuICB9XG59XG5jbGFzcyBSZWFkb25seVJlYWN0aXZlSGFuZGxlciBleHRlbmRzIEJhc2VSZWFjdGl2ZUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvcihzaGFsbG93ID0gZmFsc2UpIHtcbiAgICBzdXBlcih0cnVlLCBzaGFsbG93KTtcbiAgfVxuICBzZXQodGFyZ2V0LCBrZXkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihcbiAgICAgICAgYFNldCBvcGVyYXRpb24gb24ga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBmYWlsZWQ6IHRhcmdldCBpcyByZWFkb25seS5gLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwga2V5KSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBEZWxldGUgb3BlcmF0aW9uIG9uIGtleSBcIiR7U3RyaW5nKGtleSl9XCIgZmFpbGVkOiB0YXJnZXQgaXMgcmVhZG9ubHkuYCxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuY29uc3QgbXV0YWJsZUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNdXRhYmxlUmVhY3RpdmVIYW5kbGVyKCk7XG5jb25zdCByZWFkb25seUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBSZWFkb25seVJlYWN0aXZlSGFuZGxlcigpO1xuY29uc3Qgc2hhbGxvd1JlYWN0aXZlSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE11dGFibGVSZWFjdGl2ZUhhbmRsZXIoXG4gIHRydWVcbik7XG5jb25zdCBzaGFsbG93UmVhZG9ubHlIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgUmVhZG9ubHlSZWFjdGl2ZUhhbmRsZXIodHJ1ZSk7XG5cbmNvbnN0IHRvU2hhbGxvdyA9ICh2YWx1ZSkgPT4gdmFsdWU7XG5jb25zdCBnZXRQcm90byA9ICh2KSA9PiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHYpO1xuZnVuY3Rpb24gZ2V0KHRhcmdldCwga2V5LCBpc1JlYWRvbmx5ID0gZmFsc2UsIGlzU2hhbGxvdyA9IGZhbHNlKSB7XG4gIHRhcmdldCA9IHRhcmdldFtcIl9fdl9yYXdcIl07XG4gIGNvbnN0IHJhd1RhcmdldCA9IHRvUmF3KHRhcmdldCk7XG4gIGNvbnN0IHJhd0tleSA9IHRvUmF3KGtleSk7XG4gIGlmICghaXNSZWFkb25seSkge1xuICAgIGlmIChoYXNDaGFuZ2VkKGtleSwgcmF3S2V5KSkge1xuICAgICAgdHJhY2socmF3VGFyZ2V0LCBcImdldFwiLCBrZXkpO1xuICAgIH1cbiAgICB0cmFjayhyYXdUYXJnZXQsIFwiZ2V0XCIsIHJhd0tleSk7XG4gIH1cbiAgY29uc3QgeyBoYXM6IGhhczIgfSA9IGdldFByb3RvKHJhd1RhcmdldCk7XG4gIGNvbnN0IHdyYXAgPSBpc1NoYWxsb3cgPyB0b1NoYWxsb3cgOiBpc1JlYWRvbmx5ID8gdG9SZWFkb25seSA6IHRvUmVhY3RpdmU7XG4gIGlmIChoYXMyLmNhbGwocmF3VGFyZ2V0LCBrZXkpKSB7XG4gICAgcmV0dXJuIHdyYXAodGFyZ2V0LmdldChrZXkpKTtcbiAgfSBlbHNlIGlmIChoYXMyLmNhbGwocmF3VGFyZ2V0LCByYXdLZXkpKSB7XG4gICAgcmV0dXJuIHdyYXAodGFyZ2V0LmdldChyYXdLZXkpKTtcbiAgfSBlbHNlIGlmICh0YXJnZXQgIT09IHJhd1RhcmdldCkge1xuICAgIHRhcmdldC5nZXQoa2V5KTtcbiAgfVxufVxuZnVuY3Rpb24gaGFzKGtleSwgaXNSZWFkb25seSA9IGZhbHNlKSB7XG4gIGNvbnN0IHRhcmdldCA9IHRoaXNbXCJfX3ZfcmF3XCJdO1xuICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICBjb25zdCByYXdLZXkgPSB0b1JhdyhrZXkpO1xuICBpZiAoIWlzUmVhZG9ubHkpIHtcbiAgICBpZiAoaGFzQ2hhbmdlZChrZXksIHJhd0tleSkpIHtcbiAgICAgIHRyYWNrKHJhd1RhcmdldCwgXCJoYXNcIiwga2V5KTtcbiAgICB9XG4gICAgdHJhY2socmF3VGFyZ2V0LCBcImhhc1wiLCByYXdLZXkpO1xuICB9XG4gIHJldHVybiBrZXkgPT09IHJhd0tleSA/IHRhcmdldC5oYXMoa2V5KSA6IHRhcmdldC5oYXMoa2V5KSB8fCB0YXJnZXQuaGFzKHJhd0tleSk7XG59XG5mdW5jdGlvbiBzaXplKHRhcmdldCwgaXNSZWFkb25seSA9IGZhbHNlKSB7XG4gIHRhcmdldCA9IHRhcmdldFtcIl9fdl9yYXdcIl07XG4gICFpc1JlYWRvbmx5ICYmIHRyYWNrKHRvUmF3KHRhcmdldCksIFwiaXRlcmF0ZVwiLCBJVEVSQVRFX0tFWSk7XG4gIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIFwic2l6ZVwiLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gIHZhbHVlID0gdG9SYXcodmFsdWUpO1xuICBjb25zdCB0YXJnZXQgPSB0b1Jhdyh0aGlzKTtcbiAgY29uc3QgcHJvdG8gPSBnZXRQcm90byh0YXJnZXQpO1xuICBjb25zdCBoYWRLZXkgPSBwcm90by5oYXMuY2FsbCh0YXJnZXQsIHZhbHVlKTtcbiAgaWYgKCFoYWRLZXkpIHtcbiAgICB0YXJnZXQuYWRkKHZhbHVlKTtcbiAgICB0cmlnZ2VyKHRhcmdldCwgXCJhZGRcIiwgdmFsdWUsIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbmZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gIHZhbHVlID0gdG9SYXcodmFsdWUpO1xuICBjb25zdCB0YXJnZXQgPSB0b1Jhdyh0aGlzKTtcbiAgY29uc3QgeyBoYXM6IGhhczIsIGdldDogZ2V0MiB9ID0gZ2V0UHJvdG8odGFyZ2V0KTtcbiAgbGV0IGhhZEtleSA9IGhhczIuY2FsbCh0YXJnZXQsIGtleSk7XG4gIGlmICghaGFkS2V5KSB7XG4gICAga2V5ID0gdG9SYXcoa2V5KTtcbiAgICBoYWRLZXkgPSBoYXMyLmNhbGwodGFyZ2V0LCBrZXkpO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjaGVja0lkZW50aXR5S2V5cyh0YXJnZXQsIGhhczIsIGtleSk7XG4gIH1cbiAgY29uc3Qgb2xkVmFsdWUgPSBnZXQyLmNhbGwodGFyZ2V0LCBrZXkpO1xuICB0YXJnZXQuc2V0KGtleSwgdmFsdWUpO1xuICBpZiAoIWhhZEtleSkge1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiLCBrZXksIHZhbHVlKTtcbiAgfSBlbHNlIGlmIChoYXNDaGFuZ2VkKHZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICB0cmlnZ2VyKHRhcmdldCwgXCJzZXRcIiwga2V5LCB2YWx1ZSwgb2xkVmFsdWUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuZnVuY3Rpb24gZGVsZXRlRW50cnkoa2V5KSB7XG4gIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICBjb25zdCB7IGhhczogaGFzMiwgZ2V0OiBnZXQyIH0gPSBnZXRQcm90byh0YXJnZXQpO1xuICBsZXQgaGFkS2V5ID0gaGFzMi5jYWxsKHRhcmdldCwga2V5KTtcbiAgaWYgKCFoYWRLZXkpIHtcbiAgICBrZXkgPSB0b1JhdyhrZXkpO1xuICAgIGhhZEtleSA9IGhhczIuY2FsbCh0YXJnZXQsIGtleSk7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNoZWNrSWRlbnRpdHlLZXlzKHRhcmdldCwgaGFzMiwga2V5KTtcbiAgfVxuICBjb25zdCBvbGRWYWx1ZSA9IGdldDIgPyBnZXQyLmNhbGwodGFyZ2V0LCBrZXkpIDogdm9pZCAwO1xuICBjb25zdCByZXN1bHQgPSB0YXJnZXQuZGVsZXRlKGtleSk7XG4gIGlmIChoYWRLZXkpIHtcbiAgICB0cmlnZ2VyKHRhcmdldCwgXCJkZWxldGVcIiwga2V5LCB2b2lkIDAsIG9sZFZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY2xlYXIoKSB7XG4gIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICBjb25zdCBoYWRJdGVtcyA9IHRhcmdldC5zaXplICE9PSAwO1xuICBjb25zdCBvbGRUYXJnZXQgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gaXNNYXAodGFyZ2V0KSA/IG5ldyBNYXAodGFyZ2V0KSA6IG5ldyBTZXQodGFyZ2V0KSA6IHZvaWQgMDtcbiAgY29uc3QgcmVzdWx0ID0gdGFyZ2V0LmNsZWFyKCk7XG4gIGlmIChoYWRJdGVtcykge1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcImNsZWFyXCIsIHZvaWQgMCwgdm9pZCAwLCBvbGRUYXJnZXQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjcmVhdGVGb3JFYWNoKGlzUmVhZG9ubHksIGlzU2hhbGxvdykge1xuICByZXR1cm4gZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGNvbnN0IG9ic2VydmVkID0gdGhpcztcbiAgICBjb25zdCB0YXJnZXQgPSBvYnNlcnZlZFtcIl9fdl9yYXdcIl07XG4gICAgY29uc3QgcmF3VGFyZ2V0ID0gdG9SYXcodGFyZ2V0KTtcbiAgICBjb25zdCB3cmFwID0gaXNTaGFsbG93ID8gdG9TaGFsbG93IDogaXNSZWFkb25seSA/IHRvUmVhZG9ubHkgOiB0b1JlYWN0aXZlO1xuICAgICFpc1JlYWRvbmx5ICYmIHRyYWNrKHJhd1RhcmdldCwgXCJpdGVyYXRlXCIsIElURVJBVEVfS0VZKTtcbiAgICByZXR1cm4gdGFyZ2V0LmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHdyYXAodmFsdWUpLCB3cmFwKGtleSksIG9ic2VydmVkKTtcbiAgICB9KTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKG1ldGhvZCwgaXNSZWFkb25seSwgaXNTaGFsbG93KSB7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpc1tcIl9fdl9yYXdcIl07XG4gICAgY29uc3QgcmF3VGFyZ2V0ID0gdG9SYXcodGFyZ2V0KTtcbiAgICBjb25zdCB0YXJnZXRJc01hcCA9IGlzTWFwKHJhd1RhcmdldCk7XG4gICAgY29uc3QgaXNQYWlyID0gbWV0aG9kID09PSBcImVudHJpZXNcIiB8fCBtZXRob2QgPT09IFN5bWJvbC5pdGVyYXRvciAmJiB0YXJnZXRJc01hcDtcbiAgICBjb25zdCBpc0tleU9ubHkgPSBtZXRob2QgPT09IFwia2V5c1wiICYmIHRhcmdldElzTWFwO1xuICAgIGNvbnN0IGlubmVySXRlcmF0b3IgPSB0YXJnZXRbbWV0aG9kXSguLi5hcmdzKTtcbiAgICBjb25zdCB3cmFwID0gaXNTaGFsbG93ID8gdG9TaGFsbG93IDogaXNSZWFkb25seSA/IHRvUmVhZG9ubHkgOiB0b1JlYWN0aXZlO1xuICAgICFpc1JlYWRvbmx5ICYmIHRyYWNrKFxuICAgICAgcmF3VGFyZ2V0LFxuICAgICAgXCJpdGVyYXRlXCIsXG4gICAgICBpc0tleU9ubHkgPyBNQVBfS0VZX0lURVJBVEVfS0VZIDogSVRFUkFURV9LRVlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAvLyBpdGVyYXRvciBwcm90b2NvbFxuICAgICAgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gaW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIHJldHVybiBkb25lID8geyB2YWx1ZSwgZG9uZSB9IDoge1xuICAgICAgICAgIHZhbHVlOiBpc1BhaXIgPyBbd3JhcCh2YWx1ZVswXSksIHdyYXAodmFsdWVbMV0pXSA6IHdyYXAodmFsdWUpLFxuICAgICAgICAgIGRvbmVcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICAvLyBpdGVyYWJsZSBwcm90b2NvbFxuICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH07XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVSZWFkb25seU1ldGhvZCh0eXBlKSB7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGNvbnN0IGtleSA9IGFyZ3NbMF0gPyBgb24ga2V5IFwiJHthcmdzWzBdfVwiIGAgOiBgYDtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYCR7Y2FwaXRhbGl6ZSh0eXBlKX0gb3BlcmF0aW9uICR7a2V5fWZhaWxlZDogdGFyZ2V0IGlzIHJlYWRvbmx5LmAsXG4gICAgICAgIHRvUmF3KHRoaXMpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZSA9PT0gXCJkZWxldGVcIiA/IGZhbHNlIDogdHlwZSA9PT0gXCJjbGVhclwiID8gdm9pZCAwIDogdGhpcztcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUluc3RydW1lbnRhdGlvbnMoKSB7XG4gIGNvbnN0IG11dGFibGVJbnN0cnVtZW50YXRpb25zMiA9IHtcbiAgICBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIGtleSk7XG4gICAgfSxcbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBzaXplKHRoaXMpO1xuICAgIH0sXG4gICAgaGFzLFxuICAgIGFkZCxcbiAgICBzZXQsXG4gICAgZGVsZXRlOiBkZWxldGVFbnRyeSxcbiAgICBjbGVhcixcbiAgICBmb3JFYWNoOiBjcmVhdGVGb3JFYWNoKGZhbHNlLCBmYWxzZSlcbiAgfTtcbiAgY29uc3Qgc2hhbGxvd0luc3RydW1lbnRhdGlvbnMyID0ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywga2V5LCBmYWxzZSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBzaXplKHRoaXMpO1xuICAgIH0sXG4gICAgaGFzLFxuICAgIGFkZCxcbiAgICBzZXQsXG4gICAgZGVsZXRlOiBkZWxldGVFbnRyeSxcbiAgICBjbGVhcixcbiAgICBmb3JFYWNoOiBjcmVhdGVGb3JFYWNoKGZhbHNlLCB0cnVlKVxuICB9O1xuICBjb25zdCByZWFkb25seUluc3RydW1lbnRhdGlvbnMyID0ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywga2V5LCB0cnVlKTtcbiAgICB9LFxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIHNpemUodGhpcywgdHJ1ZSk7XG4gICAgfSxcbiAgICBoYXMoa2V5KSB7XG4gICAgICByZXR1cm4gaGFzLmNhbGwodGhpcywga2V5LCB0cnVlKTtcbiAgICB9LFxuICAgIGFkZDogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJhZGRcIiksXG4gICAgc2V0OiBjcmVhdGVSZWFkb25seU1ldGhvZChcInNldFwiKSxcbiAgICBkZWxldGU6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiZGVsZXRlXCIpLFxuICAgIGNsZWFyOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImNsZWFyXCIpLFxuICAgIGZvckVhY2g6IGNyZWF0ZUZvckVhY2godHJ1ZSwgZmFsc2UpXG4gIH07XG4gIGNvbnN0IHNoYWxsb3dSZWFkb25seUluc3RydW1lbnRhdGlvbnMyID0ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywga2V5LCB0cnVlLCB0cnVlKTtcbiAgICB9LFxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIHNpemUodGhpcywgdHJ1ZSk7XG4gICAgfSxcbiAgICBoYXMoa2V5KSB7XG4gICAgICByZXR1cm4gaGFzLmNhbGwodGhpcywga2V5LCB0cnVlKTtcbiAgICB9LFxuICAgIGFkZDogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJhZGRcIiksXG4gICAgc2V0OiBjcmVhdGVSZWFkb25seU1ldGhvZChcInNldFwiKSxcbiAgICBkZWxldGU6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiZGVsZXRlXCIpLFxuICAgIGNsZWFyOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImNsZWFyXCIpLFxuICAgIGZvckVhY2g6IGNyZWF0ZUZvckVhY2godHJ1ZSwgdHJ1ZSlcbiAgfTtcbiAgY29uc3QgaXRlcmF0b3JNZXRob2RzID0gW1wia2V5c1wiLCBcInZhbHVlc1wiLCBcImVudHJpZXNcIiwgU3ltYm9sLml0ZXJhdG9yXTtcbiAgaXRlcmF0b3JNZXRob2RzLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgIG11dGFibGVJbnN0cnVtZW50YXRpb25zMlttZXRob2RdID0gY3JlYXRlSXRlcmFibGVNZXRob2QoXG4gICAgICBtZXRob2QsXG4gICAgICBmYWxzZSxcbiAgICAgIGZhbHNlXG4gICAgKTtcbiAgICByZWFkb25seUluc3RydW1lbnRhdGlvbnMyW21ldGhvZF0gPSBjcmVhdGVJdGVyYWJsZU1ldGhvZChcbiAgICAgIG1ldGhvZCxcbiAgICAgIHRydWUsXG4gICAgICBmYWxzZVxuICAgICk7XG4gICAgc2hhbGxvd0luc3RydW1lbnRhdGlvbnMyW21ldGhvZF0gPSBjcmVhdGVJdGVyYWJsZU1ldGhvZChcbiAgICAgIG1ldGhvZCxcbiAgICAgIGZhbHNlLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczJbbWV0aG9kXSA9IGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKFxuICAgICAgbWV0aG9kLFxuICAgICAgdHJ1ZSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9KTtcbiAgcmV0dXJuIFtcbiAgICBtdXRhYmxlSW5zdHJ1bWVudGF0aW9uczIsXG4gICAgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMixcbiAgICBzaGFsbG93SW5zdHJ1bWVudGF0aW9uczIsXG4gICAgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczJcbiAgXTtcbn1cbmNvbnN0IFtcbiAgbXV0YWJsZUluc3RydW1lbnRhdGlvbnMsXG4gIHJlYWRvbmx5SW5zdHJ1bWVudGF0aW9ucyxcbiAgc2hhbGxvd0luc3RydW1lbnRhdGlvbnMsXG4gIHNoYWxsb3dSZWFkb25seUluc3RydW1lbnRhdGlvbnNcbl0gPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9ucygpO1xuZnVuY3Rpb24gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKGlzUmVhZG9ubHksIHNoYWxsb3cpIHtcbiAgY29uc3QgaW5zdHJ1bWVudGF0aW9ucyA9IHNoYWxsb3cgPyBpc1JlYWRvbmx5ID8gc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9ucyA6IHNoYWxsb3dJbnN0cnVtZW50YXRpb25zIDogaXNSZWFkb25seSA/IHJlYWRvbmx5SW5zdHJ1bWVudGF0aW9ucyA6IG11dGFibGVJbnN0cnVtZW50YXRpb25zO1xuICByZXR1cm4gKHRhcmdldCwga2V5LCByZWNlaXZlcikgPT4ge1xuICAgIGlmIChrZXkgPT09IFwiX192X2lzUmVhY3RpdmVcIikge1xuICAgICAgcmV0dXJuICFpc1JlYWRvbmx5O1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9pc1JlYWRvbmx5XCIpIHtcbiAgICAgIHJldHVybiBpc1JlYWRvbmx5O1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9yYXdcIikge1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgcmV0dXJuIFJlZmxlY3QuZ2V0KFxuICAgICAgaGFzT3duKGluc3RydW1lbnRhdGlvbnMsIGtleSkgJiYga2V5IGluIHRhcmdldCA/IGluc3RydW1lbnRhdGlvbnMgOiB0YXJnZXQsXG4gICAgICBrZXksXG4gICAgICByZWNlaXZlclxuICAgICk7XG4gIH07XG59XG5jb25zdCBtdXRhYmxlQ29sbGVjdGlvbkhhbmRsZXJzID0ge1xuICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIoZmFsc2UsIGZhbHNlKVxufTtcbmNvbnN0IHNoYWxsb3dDb2xsZWN0aW9uSGFuZGxlcnMgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcihmYWxzZSwgdHJ1ZSlcbn07XG5jb25zdCByZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgZ2V0OiAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKHRydWUsIGZhbHNlKVxufTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgZ2V0OiAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKHRydWUsIHRydWUpXG59O1xuZnVuY3Rpb24gY2hlY2tJZGVudGl0eUtleXModGFyZ2V0LCBoYXMyLCBrZXkpIHtcbiAgY29uc3QgcmF3S2V5ID0gdG9SYXcoa2V5KTtcbiAgaWYgKHJhd0tleSAhPT0ga2V5ICYmIGhhczIuY2FsbCh0YXJnZXQsIHJhd0tleSkpIHtcbiAgICBjb25zdCB0eXBlID0gdG9SYXdUeXBlKHRhcmdldCk7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFJlYWN0aXZlICR7dHlwZX0gY29udGFpbnMgYm90aCB0aGUgcmF3IGFuZCByZWFjdGl2ZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBvYmplY3Qke3R5cGUgPT09IGBNYXBgID8gYCBhcyBrZXlzYCA6IGBgfSwgd2hpY2ggY2FuIGxlYWQgdG8gaW5jb25zaXN0ZW5jaWVzLiBBdm9pZCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiB0aGUgcmF3IGFuZCByZWFjdGl2ZSB2ZXJzaW9ucyBvZiBhbiBvYmplY3QgYW5kIG9ubHkgdXNlIHRoZSByZWFjdGl2ZSB2ZXJzaW9uIGlmIHBvc3NpYmxlLmBcbiAgICApO1xuICB9XG59XG5cbmNvbnN0IHJlYWN0aXZlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCBzaGFsbG93UmVhY3RpdmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHJlYWRvbmx5TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCBzaGFsbG93UmVhZG9ubHlNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIHRhcmdldFR5cGVNYXAocmF3VHlwZSkge1xuICBzd2l0Y2ggKHJhd1R5cGUpIHtcbiAgICBjYXNlIFwiT2JqZWN0XCI6XG4gICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICByZXR1cm4gMSAvKiBDT01NT04gKi87XG4gICAgY2FzZSBcIk1hcFwiOlxuICAgIGNhc2UgXCJTZXRcIjpcbiAgICBjYXNlIFwiV2Vha01hcFwiOlxuICAgIGNhc2UgXCJXZWFrU2V0XCI6XG4gICAgICByZXR1cm4gMiAvKiBDT0xMRUNUSU9OICovO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gMCAvKiBJTlZBTElEICovO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUYXJnZXRUeXBlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZVtcIl9fdl9za2lwXCJdIHx8ICFPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSA/IDAgLyogSU5WQUxJRCAqLyA6IHRhcmdldFR5cGVNYXAodG9SYXdUeXBlKHZhbHVlKSk7XG59XG5mdW5jdGlvbiByZWFjdGl2ZSh0YXJnZXQpIHtcbiAgaWYgKGlzUmVhZG9ubHkodGFyZ2V0KSkge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KFxuICAgIHRhcmdldCxcbiAgICBmYWxzZSxcbiAgICBtdXRhYmxlSGFuZGxlcnMsXG4gICAgbXV0YWJsZUNvbGxlY3Rpb25IYW5kbGVycyxcbiAgICByZWFjdGl2ZU1hcFxuICApO1xufVxuZnVuY3Rpb24gc2hhbGxvd1JlYWN0aXZlKHRhcmdldCkge1xuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIGZhbHNlLFxuICAgIHNoYWxsb3dSZWFjdGl2ZUhhbmRsZXJzLFxuICAgIHNoYWxsb3dDb2xsZWN0aW9uSGFuZGxlcnMsXG4gICAgc2hhbGxvd1JlYWN0aXZlTWFwXG4gICk7XG59XG5mdW5jdGlvbiByZWFkb25seSh0YXJnZXQpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KFxuICAgIHRhcmdldCxcbiAgICB0cnVlLFxuICAgIHJlYWRvbmx5SGFuZGxlcnMsXG4gICAgcmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMsXG4gICAgcmVhZG9ubHlNYXBcbiAgKTtcbn1cbmZ1bmN0aW9uIHNoYWxsb3dSZWFkb25seSh0YXJnZXQpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KFxuICAgIHRhcmdldCxcbiAgICB0cnVlLFxuICAgIHNoYWxsb3dSZWFkb25seUhhbmRsZXJzLFxuICAgIHNoYWxsb3dSZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyxcbiAgICBzaGFsbG93UmVhZG9ubHlNYXBcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KHRhcmdldCwgaXNSZWFkb25seTIsIGJhc2VIYW5kbGVycywgY29sbGVjdGlvbkhhbmRsZXJzLCBwcm94eU1hcCkge1xuICBpZiAoIWlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgY29uc29sZS53YXJuKGB2YWx1ZSBjYW5ub3QgYmUgbWFkZSByZWFjdGl2ZTogJHtTdHJpbmcodGFyZ2V0KX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICBpZiAodGFyZ2V0W1wiX192X3Jhd1wiXSAmJiAhKGlzUmVhZG9ubHkyICYmIHRhcmdldFtcIl9fdl9pc1JlYWN0aXZlXCJdKSkge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgY29uc3QgZXhpc3RpbmdQcm94eSA9IHByb3h5TWFwLmdldCh0YXJnZXQpO1xuICBpZiAoZXhpc3RpbmdQcm94eSkge1xuICAgIHJldHVybiBleGlzdGluZ1Byb3h5O1xuICB9XG4gIGNvbnN0IHRhcmdldFR5cGUgPSBnZXRUYXJnZXRUeXBlKHRhcmdldCk7XG4gIGlmICh0YXJnZXRUeXBlID09PSAwIC8qIElOVkFMSUQgKi8pIHtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KFxuICAgIHRhcmdldCxcbiAgICB0YXJnZXRUeXBlID09PSAyIC8qIENPTExFQ1RJT04gKi8gPyBjb2xsZWN0aW9uSGFuZGxlcnMgOiBiYXNlSGFuZGxlcnNcbiAgKTtcbiAgcHJveHlNYXAuc2V0KHRhcmdldCwgcHJveHkpO1xuICByZXR1cm4gcHJveHk7XG59XG5mdW5jdGlvbiBpc1JlYWN0aXZlKHZhbHVlKSB7XG4gIGlmIChpc1JlYWRvbmx5KHZhbHVlKSkge1xuICAgIHJldHVybiBpc1JlYWN0aXZlKHZhbHVlW1wiX192X3Jhd1wiXSk7XG4gIH1cbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlW1wiX192X2lzUmVhY3RpdmVcIl0pO1xufVxuZnVuY3Rpb24gaXNSZWFkb25seSh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWVbXCJfX3ZfaXNSZWFkb25seVwiXSk7XG59XG5mdW5jdGlvbiBpc1NoYWxsb3codmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlW1wiX192X2lzU2hhbGxvd1wiXSk7XG59XG5mdW5jdGlvbiBpc1Byb3h5KHZhbHVlKSB7XG4gIHJldHVybiBpc1JlYWN0aXZlKHZhbHVlKSB8fCBpc1JlYWRvbmx5KHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHRvUmF3KG9ic2VydmVkKSB7XG4gIGNvbnN0IHJhdyA9IG9ic2VydmVkICYmIG9ic2VydmVkW1wiX192X3Jhd1wiXTtcbiAgcmV0dXJuIHJhdyA/IHRvUmF3KHJhdykgOiBvYnNlcnZlZDtcbn1cbmZ1bmN0aW9uIG1hcmtSYXcodmFsdWUpIHtcbiAgZGVmKHZhbHVlLCBcIl9fdl9za2lwXCIsIHRydWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5jb25zdCB0b1JlYWN0aXZlID0gKHZhbHVlKSA9PiBpc09iamVjdCh2YWx1ZSkgPyByZWFjdGl2ZSh2YWx1ZSkgOiB2YWx1ZTtcbmNvbnN0IHRvUmVhZG9ubHkgPSAodmFsdWUpID0+IGlzT2JqZWN0KHZhbHVlKSA/IHJlYWRvbmx5KHZhbHVlKSA6IHZhbHVlO1xuXG5jbGFzcyBDb21wdXRlZFJlZkltcGwge1xuICBjb25zdHJ1Y3RvcihnZXR0ZXIsIF9zZXR0ZXIsIGlzUmVhZG9ubHksIGlzU1NSKSB7XG4gICAgdGhpcy5fc2V0dGVyID0gX3NldHRlcjtcbiAgICB0aGlzLmRlcCA9IHZvaWQgMDtcbiAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gICAgdGhpc1tcIl9fdl9pc1JlYWRvbmx5XCJdID0gZmFsc2U7XG4gICAgdGhpcy5lZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoXG4gICAgICAoKSA9PiBnZXR0ZXIodGhpcy5fdmFsdWUpLFxuICAgICAgKCkgPT4gdHJpZ2dlclJlZlZhbHVlKHRoaXMsIDEpXG4gICAgKTtcbiAgICB0aGlzLmVmZmVjdC5jb21wdXRlZCA9IHRoaXM7XG4gICAgdGhpcy5lZmZlY3QuYWN0aXZlID0gdGhpcy5fY2FjaGVhYmxlID0gIWlzU1NSO1xuICAgIHRoaXNbXCJfX3ZfaXNSZWFkb25seVwiXSA9IGlzUmVhZG9ubHk7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0b1Jhdyh0aGlzKTtcbiAgICB0cmFja1JlZlZhbHVlKHNlbGYpO1xuICAgIGlmICghc2VsZi5fY2FjaGVhYmxlIHx8IHNlbGYuZWZmZWN0LmRpcnR5KSB7XG4gICAgICBpZiAoaGFzQ2hhbmdlZChzZWxmLl92YWx1ZSwgc2VsZi5fdmFsdWUgPSBzZWxmLmVmZmVjdC5ydW4oKSkpIHtcbiAgICAgICAgdHJpZ2dlclJlZlZhbHVlKHNlbGYsIDIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VsZi5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbHVlKSB7XG4gICAgdGhpcy5fc2V0dGVyKG5ld1ZhbHVlKTtcbiAgfVxuICAvLyAjcmVnaW9uIHBvbHlmaWxsIF9kaXJ0eSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0aGlyZCBwYXJ0eSBjb2RlIGZvciBWdWUgPD0gMy4zLnhcbiAgZ2V0IF9kaXJ0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5lZmZlY3QuZGlydHk7XG4gIH1cbiAgc2V0IF9kaXJ0eSh2KSB7XG4gICAgdGhpcy5lZmZlY3QuZGlydHkgPSB2O1xuICB9XG4gIC8vICNlbmRyZWdpb25cbn1cbmZ1bmN0aW9uIGNvbXB1dGVkKGdldHRlck9yT3B0aW9ucywgZGVidWdPcHRpb25zLCBpc1NTUiA9IGZhbHNlKSB7XG4gIGxldCBnZXR0ZXI7XG4gIGxldCBzZXR0ZXI7XG4gIGNvbnN0IG9ubHlHZXR0ZXIgPSBpc0Z1bmN0aW9uKGdldHRlck9yT3B0aW9ucyk7XG4gIGlmIChvbmx5R2V0dGVyKSB7XG4gICAgZ2V0dGVyID0gZ2V0dGVyT3JPcHRpb25zO1xuICAgIHNldHRlciA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyAoKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oXCJXcml0ZSBvcGVyYXRpb24gZmFpbGVkOiBjb21wdXRlZCB2YWx1ZSBpcyByZWFkb25seVwiKTtcbiAgICB9IDogTk9PUDtcbiAgfSBlbHNlIHtcbiAgICBnZXR0ZXIgPSBnZXR0ZXJPck9wdGlvbnMuZ2V0O1xuICAgIHNldHRlciA9IGdldHRlck9yT3B0aW9ucy5zZXQ7XG4gIH1cbiAgY29uc3QgY1JlZiA9IG5ldyBDb21wdXRlZFJlZkltcGwoZ2V0dGVyLCBzZXR0ZXIsIG9ubHlHZXR0ZXIgfHwgIXNldHRlciwgaXNTU1IpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBkZWJ1Z09wdGlvbnMgJiYgIWlzU1NSKSB7XG4gICAgY1JlZi5lZmZlY3Qub25UcmFjayA9IGRlYnVnT3B0aW9ucy5vblRyYWNrO1xuICAgIGNSZWYuZWZmZWN0Lm9uVHJpZ2dlciA9IGRlYnVnT3B0aW9ucy5vblRyaWdnZXI7XG4gIH1cbiAgcmV0dXJuIGNSZWY7XG59XG5cbmZ1bmN0aW9uIHRyYWNrUmVmVmFsdWUocmVmMikge1xuICBpZiAoc2hvdWxkVHJhY2sgJiYgYWN0aXZlRWZmZWN0KSB7XG4gICAgcmVmMiA9IHRvUmF3KHJlZjIpO1xuICAgIHRyYWNrRWZmZWN0KFxuICAgICAgYWN0aXZlRWZmZWN0LFxuICAgICAgcmVmMi5kZXAgfHwgKHJlZjIuZGVwID0gY3JlYXRlRGVwKFxuICAgICAgICAoKSA9PiByZWYyLmRlcCA9IHZvaWQgMCxcbiAgICAgICAgcmVmMiBpbnN0YW5jZW9mIENvbXB1dGVkUmVmSW1wbCA/IHJlZjIgOiB2b2lkIDBcbiAgICAgICkpLFxuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHtcbiAgICAgICAgdGFyZ2V0OiByZWYyLFxuICAgICAgICB0eXBlOiBcImdldFwiLFxuICAgICAgICBrZXk6IFwidmFsdWVcIlxuICAgICAgfSA6IHZvaWQgMFxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRyaWdnZXJSZWZWYWx1ZShyZWYyLCBkaXJ0eUxldmVsID0gMywgbmV3VmFsKSB7XG4gIHJlZjIgPSB0b1JhdyhyZWYyKTtcbiAgY29uc3QgZGVwID0gcmVmMi5kZXA7XG4gIGlmIChkZXApIHtcbiAgICB0cmlnZ2VyRWZmZWN0cyhcbiAgICAgIGRlcCxcbiAgICAgIGRpcnR5TGV2ZWwsXG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8ge1xuICAgICAgICB0YXJnZXQ6IHJlZjIsXG4gICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgIGtleTogXCJ2YWx1ZVwiLFxuICAgICAgICBuZXdWYWx1ZTogbmV3VmFsXG4gICAgICB9IDogdm9pZCAwXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNSZWYocikge1xuICByZXR1cm4gISEociAmJiByLl9fdl9pc1JlZiA9PT0gdHJ1ZSk7XG59XG5mdW5jdGlvbiByZWYodmFsdWUpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlZih2YWx1ZSwgZmFsc2UpO1xufVxuZnVuY3Rpb24gc2hhbGxvd1JlZih2YWx1ZSkge1xuICByZXR1cm4gY3JlYXRlUmVmKHZhbHVlLCB0cnVlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlZihyYXdWYWx1ZSwgc2hhbGxvdykge1xuICBpZiAoaXNSZWYocmF3VmFsdWUpKSB7XG4gICAgcmV0dXJuIHJhd1ZhbHVlO1xuICB9XG4gIHJldHVybiBuZXcgUmVmSW1wbChyYXdWYWx1ZSwgc2hhbGxvdyk7XG59XG5jbGFzcyBSZWZJbXBsIHtcbiAgY29uc3RydWN0b3IodmFsdWUsIF9fdl9pc1NoYWxsb3cpIHtcbiAgICB0aGlzLl9fdl9pc1NoYWxsb3cgPSBfX3ZfaXNTaGFsbG93O1xuICAgIHRoaXMuZGVwID0gdm9pZCAwO1xuICAgIHRoaXMuX192X2lzUmVmID0gdHJ1ZTtcbiAgICB0aGlzLl9yYXdWYWx1ZSA9IF9fdl9pc1NoYWxsb3cgPyB2YWx1ZSA6IHRvUmF3KHZhbHVlKTtcbiAgICB0aGlzLl92YWx1ZSA9IF9fdl9pc1NoYWxsb3cgPyB2YWx1ZSA6IHRvUmVhY3RpdmUodmFsdWUpO1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICB0cmFja1JlZlZhbHVlKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsKSB7XG4gICAgY29uc3QgdXNlRGlyZWN0VmFsdWUgPSB0aGlzLl9fdl9pc1NoYWxsb3cgfHwgaXNTaGFsbG93KG5ld1ZhbCkgfHwgaXNSZWFkb25seShuZXdWYWwpO1xuICAgIG5ld1ZhbCA9IHVzZURpcmVjdFZhbHVlID8gbmV3VmFsIDogdG9SYXcobmV3VmFsKTtcbiAgICBpZiAoaGFzQ2hhbmdlZChuZXdWYWwsIHRoaXMuX3Jhd1ZhbHVlKSkge1xuICAgICAgdGhpcy5fcmF3VmFsdWUgPSBuZXdWYWw7XG4gICAgICB0aGlzLl92YWx1ZSA9IHVzZURpcmVjdFZhbHVlID8gbmV3VmFsIDogdG9SZWFjdGl2ZShuZXdWYWwpO1xuICAgICAgdHJpZ2dlclJlZlZhbHVlKHRoaXMsIDMsIG5ld1ZhbCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB0cmlnZ2VyUmVmKHJlZjIpIHtcbiAgdHJpZ2dlclJlZlZhbHVlKHJlZjIsIDMsICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyByZWYyLnZhbHVlIDogdm9pZCAwKTtcbn1cbmZ1bmN0aW9uIHVucmVmKHJlZjIpIHtcbiAgcmV0dXJuIGlzUmVmKHJlZjIpID8gcmVmMi52YWx1ZSA6IHJlZjI7XG59XG5mdW5jdGlvbiB0b1ZhbHVlKHNvdXJjZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbihzb3VyY2UpID8gc291cmNlKCkgOiB1bnJlZihzb3VyY2UpO1xufVxuY29uc3Qgc2hhbGxvd1Vud3JhcEhhbmRsZXJzID0ge1xuICBnZXQ6ICh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpID0+IHVucmVmKFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcikpLFxuICBzZXQ6ICh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKSA9PiB7XG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0YXJnZXRba2V5XTtcbiAgICBpZiAoaXNSZWYob2xkVmFsdWUpICYmICFpc1JlZih2YWx1ZSkpIHtcbiAgICAgIG9sZFZhbHVlLnZhbHVlID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpO1xuICAgIH1cbiAgfVxufTtcbmZ1bmN0aW9uIHByb3h5UmVmcyhvYmplY3RXaXRoUmVmcykge1xuICByZXR1cm4gaXNSZWFjdGl2ZShvYmplY3RXaXRoUmVmcykgPyBvYmplY3RXaXRoUmVmcyA6IG5ldyBQcm94eShvYmplY3RXaXRoUmVmcywgc2hhbGxvd1Vud3JhcEhhbmRsZXJzKTtcbn1cbmNsYXNzIEN1c3RvbVJlZkltcGwge1xuICBjb25zdHJ1Y3RvcihmYWN0b3J5KSB7XG4gICAgdGhpcy5kZXAgPSB2b2lkIDA7XG4gICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICAgIGNvbnN0IHsgZ2V0LCBzZXQgfSA9IGZhY3RvcnkoXG4gICAgICAoKSA9PiB0cmFja1JlZlZhbHVlKHRoaXMpLFxuICAgICAgKCkgPT4gdHJpZ2dlclJlZlZhbHVlKHRoaXMpXG4gICAgKTtcbiAgICB0aGlzLl9nZXQgPSBnZXQ7XG4gICAgdGhpcy5fc2V0ID0gc2V0O1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0KCk7XG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbCkge1xuICAgIHRoaXMuX3NldChuZXdWYWwpO1xuICB9XG59XG5mdW5jdGlvbiBjdXN0b21SZWYoZmFjdG9yeSkge1xuICByZXR1cm4gbmV3IEN1c3RvbVJlZkltcGwoZmFjdG9yeSk7XG59XG5mdW5jdGlvbiB0b1JlZnMob2JqZWN0KSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc1Byb3h5KG9iamVjdCkpIHtcbiAgICBjb25zb2xlLndhcm4oYHRvUmVmcygpIGV4cGVjdHMgYSByZWFjdGl2ZSBvYmplY3QgYnV0IHJlY2VpdmVkIGEgcGxhaW4gb25lLmApO1xuICB9XG4gIGNvbnN0IHJldCA9IGlzQXJyYXkob2JqZWN0KSA/IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICByZXRba2V5XSA9IHByb3BlcnR5VG9SZWYob2JqZWN0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5jbGFzcyBPYmplY3RSZWZJbXBsIHtcbiAgY29uc3RydWN0b3IoX29iamVjdCwgX2tleSwgX2RlZmF1bHRWYWx1ZSkge1xuICAgIHRoaXMuX29iamVjdCA9IF9vYmplY3Q7XG4gICAgdGhpcy5fa2V5ID0gX2tleTtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSBfZGVmYXVsdFZhbHVlO1xuICAgIHRoaXMuX192X2lzUmVmID0gdHJ1ZTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5fb2JqZWN0W3RoaXMuX2tleV07XG4gICAgcmV0dXJuIHZhbCA9PT0gdm9pZCAwID8gdGhpcy5fZGVmYXVsdFZhbHVlIDogdmFsO1xuICB9XG4gIHNldCB2YWx1ZShuZXdWYWwpIHtcbiAgICB0aGlzLl9vYmplY3RbdGhpcy5fa2V5XSA9IG5ld1ZhbDtcbiAgfVxuICBnZXQgZGVwKCkge1xuICAgIHJldHVybiBnZXREZXBGcm9tUmVhY3RpdmUodG9SYXcodGhpcy5fb2JqZWN0KSwgdGhpcy5fa2V5KTtcbiAgfVxufVxuY2xhc3MgR2V0dGVyUmVmSW1wbCB7XG4gIGNvbnN0cnVjdG9yKF9nZXR0ZXIpIHtcbiAgICB0aGlzLl9nZXR0ZXIgPSBfZ2V0dGVyO1xuICAgIHRoaXMuX192X2lzUmVmID0gdHJ1ZTtcbiAgICB0aGlzLl9fdl9pc1JlYWRvbmx5ID0gdHJ1ZTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldHRlcigpO1xuICB9XG59XG5mdW5jdGlvbiB0b1JlZihzb3VyY2UsIGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gIGlmIChpc1JlZihzb3VyY2UpKSB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHNvdXJjZSkpIHtcbiAgICByZXR1cm4gbmV3IEdldHRlclJlZkltcGwoc291cmNlKTtcbiAgfSBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpICYmIGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5VG9SZWYoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlZihzb3VyY2UpO1xuICB9XG59XG5mdW5jdGlvbiBwcm9wZXJ0eVRvUmVmKHNvdXJjZSwga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgY29uc3QgdmFsID0gc291cmNlW2tleV07XG4gIHJldHVybiBpc1JlZih2YWwpID8gdmFsIDogbmV3IE9iamVjdFJlZkltcGwoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSk7XG59XG5cbmNvbnN0IGRlZmVycmVkQ29tcHV0ZWQgPSBjb21wdXRlZDtcblxuY29uc3QgVHJhY2tPcFR5cGVzID0ge1xuICBcIkdFVFwiOiBcImdldFwiLFxuICBcIkhBU1wiOiBcImhhc1wiLFxuICBcIklURVJBVEVcIjogXCJpdGVyYXRlXCJcbn07XG5jb25zdCBUcmlnZ2VyT3BUeXBlcyA9IHtcbiAgXCJTRVRcIjogXCJzZXRcIixcbiAgXCJBRERcIjogXCJhZGRcIixcbiAgXCJERUxFVEVcIjogXCJkZWxldGVcIixcbiAgXCJDTEVBUlwiOiBcImNsZWFyXCJcbn07XG5jb25zdCBSZWFjdGl2ZUZsYWdzID0ge1xuICBcIlNLSVBcIjogXCJfX3Zfc2tpcFwiLFxuICBcIklTX1JFQUNUSVZFXCI6IFwiX192X2lzUmVhY3RpdmVcIixcbiAgXCJJU19SRUFET05MWVwiOiBcIl9fdl9pc1JlYWRvbmx5XCIsXG4gIFwiSVNfU0hBTExPV1wiOiBcIl9fdl9pc1NoYWxsb3dcIixcbiAgXCJSQVdcIjogXCJfX3ZfcmF3XCJcbn07XG5cbmV4cG9ydCB7IEVmZmVjdFNjb3BlLCBJVEVSQVRFX0tFWSwgUmVhY3RpdmVFZmZlY3QsIFJlYWN0aXZlRmxhZ3MsIFRyYWNrT3BUeXBlcywgVHJpZ2dlck9wVHlwZXMsIGNvbXB1dGVkLCBjdXN0b21SZWYsIGRlZmVycmVkQ29tcHV0ZWQsIGVmZmVjdCwgZWZmZWN0U2NvcGUsIGVuYWJsZVRyYWNraW5nLCBnZXRDdXJyZW50U2NvcGUsIGlzUHJveHksIGlzUmVhY3RpdmUsIGlzUmVhZG9ubHksIGlzUmVmLCBpc1NoYWxsb3csIG1hcmtSYXcsIG9uU2NvcGVEaXNwb3NlLCBwYXVzZVNjaGVkdWxpbmcsIHBhdXNlVHJhY2tpbmcsIHByb3h5UmVmcywgcmVhY3RpdmUsIHJlYWRvbmx5LCByZWYsIHJlc2V0U2NoZWR1bGluZywgcmVzZXRUcmFja2luZywgc2hhbGxvd1JlYWN0aXZlLCBzaGFsbG93UmVhZG9ubHksIHNoYWxsb3dSZWYsIHN0b3AsIHRvUmF3LCB0b1JlZiwgdG9SZWZzLCB0b1ZhbHVlLCB0cmFjaywgdHJpZ2dlciwgdHJpZ2dlclJlZiwgdW5yZWYgfTtcbiIsIi8qKlxuKiBAdnVlL3J1bnRpbWUtY29yZSB2My40LjEwXG4qIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzXG4qIEBsaWNlbnNlIE1JVFxuKiovXG5pbXBvcnQgeyBwYXVzZVRyYWNraW5nLCByZXNldFRyYWNraW5nLCBpc1JlZiwgdG9SYXcsIGlzU2hhbGxvdyBhcyBpc1NoYWxsb3ckMSwgaXNSZWFjdGl2ZSwgUmVhY3RpdmVFZmZlY3QsIGdldEN1cnJlbnRTY29wZSwgcmVmLCBzaGFsbG93UmVhZG9ubHksIHRyYWNrLCByZWFjdGl2ZSwgc2hhbGxvd1JlYWN0aXZlLCB0cmlnZ2VyLCBpc1Byb3h5LCBwcm94eVJlZnMsIG1hcmtSYXcsIEVmZmVjdFNjb3BlLCBjb21wdXRlZCBhcyBjb21wdXRlZCQxLCBjdXN0b21SZWYsIGlzUmVhZG9ubHkgfSBmcm9tICdAdnVlL3JlYWN0aXZpdHknO1xuZXhwb3J0IHsgRWZmZWN0U2NvcGUsIFJlYWN0aXZlRWZmZWN0LCBUcmFja09wVHlwZXMsIFRyaWdnZXJPcFR5cGVzLCBjdXN0b21SZWYsIGVmZmVjdCwgZWZmZWN0U2NvcGUsIGdldEN1cnJlbnRTY29wZSwgaXNQcm94eSwgaXNSZWFjdGl2ZSwgaXNSZWFkb25seSwgaXNSZWYsIGlzU2hhbGxvdywgbWFya1Jhdywgb25TY29wZURpc3Bvc2UsIHByb3h5UmVmcywgcmVhY3RpdmUsIHJlYWRvbmx5LCByZWYsIHNoYWxsb3dSZWFjdGl2ZSwgc2hhbGxvd1JlYWRvbmx5LCBzaGFsbG93UmVmLCBzdG9wLCB0b1JhdywgdG9SZWYsIHRvUmVmcywgdG9WYWx1ZSwgdHJpZ2dlclJlZiwgdW5yZWYgfSBmcm9tICdAdnVlL3JlYWN0aXZpdHknO1xuaW1wb3J0IHsgaXNTdHJpbmcsIGlzRnVuY3Rpb24sIGlzUHJvbWlzZSwgaXNBcnJheSwgTk9PUCwgZ2V0R2xvYmFsVGhpcywgZXh0ZW5kLCBFTVBUWV9PQkosIHRvSGFuZGxlcktleSwgbG9vc2VUb051bWJlciwgaHlwaGVuYXRlLCBjYW1lbGl6ZSwgaXNPYmplY3QsIGlzT24sIGhhc093biwgaXNNb2RlbExpc3RlbmVyLCBjYXBpdGFsaXplLCB0b051bWJlciwgaGFzQ2hhbmdlZCwgcmVtb3ZlLCBpc1NldCwgaXNNYXAsIGlzUGxhaW5PYmplY3QsIGlzQnVpbHRJbkRpcmVjdGl2ZSwgaW52b2tlQXJyYXlGbnMsIGlzUmVnRXhwLCBpc0dsb2JhbGx5QWxsb3dlZCwgTk8sIGRlZiwgaXNSZXNlcnZlZFByb3AsIEVNUFRZX0FSUiwgdG9SYXdUeXBlLCBtYWtlTWFwLCBub3JtYWxpemVDbGFzcywgc3RyaW5naWZ5U3R5bGUsIG5vcm1hbGl6ZVN0eWxlLCBpc0tub3duU3ZnQXR0ciwgaXNCb29sZWFuQXR0ciwgaXNLbm93bkh0bWxBdHRyLCBpbmNsdWRlQm9vbGVhbkF0dHIgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5leHBvcnQgeyBjYW1lbGl6ZSwgY2FwaXRhbGl6ZSwgbm9ybWFsaXplQ2xhc3MsIG5vcm1hbGl6ZVByb3BzLCBub3JtYWxpemVTdHlsZSwgdG9EaXNwbGF5U3RyaW5nLCB0b0hhbmRsZXJLZXkgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmNvbnN0IHN0YWNrID0gW107XG5mdW5jdGlvbiBwdXNoV2FybmluZ0NvbnRleHQodm5vZGUpIHtcbiAgc3RhY2sucHVzaCh2bm9kZSk7XG59XG5mdW5jdGlvbiBwb3BXYXJuaW5nQ29udGV4dCgpIHtcbiAgc3RhY2sucG9wKCk7XG59XG5mdW5jdGlvbiB3YXJuJDEobXNnLCAuLi5hcmdzKSB7XG4gIHBhdXNlVHJhY2tpbmcoKTtcbiAgY29uc3QgaW5zdGFuY2UgPSBzdGFjay5sZW5ndGggPyBzdGFja1tzdGFjay5sZW5ndGggLSAxXS5jb21wb25lbnQgOiBudWxsO1xuICBjb25zdCBhcHBXYXJuSGFuZGxlciA9IGluc3RhbmNlICYmIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLndhcm5IYW5kbGVyO1xuICBjb25zdCB0cmFjZSA9IGdldENvbXBvbmVudFRyYWNlKCk7XG4gIGlmIChhcHBXYXJuSGFuZGxlcikge1xuICAgIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhcbiAgICAgIGFwcFdhcm5IYW5kbGVyLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICAxMSxcbiAgICAgIFtcbiAgICAgICAgbXNnICsgYXJncy5qb2luKFwiXCIpLFxuICAgICAgICBpbnN0YW5jZSAmJiBpbnN0YW5jZS5wcm94eSxcbiAgICAgICAgdHJhY2UubWFwKFxuICAgICAgICAgICh7IHZub2RlIH0pID0+IGBhdCA8JHtmb3JtYXRDb21wb25lbnROYW1lKGluc3RhbmNlLCB2bm9kZS50eXBlKX0+YFxuICAgICAgICApLmpvaW4oXCJcXG5cIiksXG4gICAgICAgIHRyYWNlXG4gICAgICBdXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB3YXJuQXJncyA9IFtgW1Z1ZSB3YXJuXTogJHttc2d9YCwgLi4uYXJnc107XG4gICAgaWYgKHRyYWNlLmxlbmd0aCAmJiAvLyBhdm9pZCBzcGFtbWluZyBjb25zb2xlIGR1cmluZyB0ZXN0c1xuICAgIHRydWUpIHtcbiAgICAgIHdhcm5BcmdzLnB1c2goYFxuYCwgLi4uZm9ybWF0VHJhY2UodHJhY2UpKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKC4uLndhcm5BcmdzKTtcbiAgfVxuICByZXNldFRyYWNraW5nKCk7XG59XG5mdW5jdGlvbiBnZXRDb21wb25lbnRUcmFjZSgpIHtcbiAgbGV0IGN1cnJlbnRWTm9kZSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICBpZiAoIWN1cnJlbnRWTm9kZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkU3RhY2sgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnRWTm9kZSkge1xuICAgIGNvbnN0IGxhc3QgPSBub3JtYWxpemVkU3RhY2tbMF07XG4gICAgaWYgKGxhc3QgJiYgbGFzdC52bm9kZSA9PT0gY3VycmVudFZOb2RlKSB7XG4gICAgICBsYXN0LnJlY3Vyc2VDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBub3JtYWxpemVkU3RhY2sucHVzaCh7XG4gICAgICAgIHZub2RlOiBjdXJyZW50Vk5vZGUsXG4gICAgICAgIHJlY3Vyc2VDb3VudDogMFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudEluc3RhbmNlID0gY3VycmVudFZOb2RlLmNvbXBvbmVudCAmJiBjdXJyZW50Vk5vZGUuY29tcG9uZW50LnBhcmVudDtcbiAgICBjdXJyZW50Vk5vZGUgPSBwYXJlbnRJbnN0YW5jZSAmJiBwYXJlbnRJbnN0YW5jZS52bm9kZTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZFN0YWNrO1xufVxuZnVuY3Rpb24gZm9ybWF0VHJhY2UodHJhY2UpIHtcbiAgY29uc3QgbG9ncyA9IFtdO1xuICB0cmFjZS5mb3JFYWNoKChlbnRyeSwgaSkgPT4ge1xuICAgIGxvZ3MucHVzaCguLi5pID09PSAwID8gW10gOiBbYFxuYF0sIC4uLmZvcm1hdFRyYWNlRW50cnkoZW50cnkpKTtcbiAgfSk7XG4gIHJldHVybiBsb2dzO1xufVxuZnVuY3Rpb24gZm9ybWF0VHJhY2VFbnRyeSh7IHZub2RlLCByZWN1cnNlQ291bnQgfSkge1xuICBjb25zdCBwb3N0Zml4ID0gcmVjdXJzZUNvdW50ID4gMCA/IGAuLi4gKCR7cmVjdXJzZUNvdW50fSByZWN1cnNpdmUgY2FsbHMpYCA6IGBgO1xuICBjb25zdCBpc1Jvb3QgPSB2bm9kZS5jb21wb25lbnQgPyB2bm9kZS5jb21wb25lbnQucGFyZW50ID09IG51bGwgOiBmYWxzZTtcbiAgY29uc3Qgb3BlbiA9IGAgYXQgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShcbiAgICB2bm9kZS5jb21wb25lbnQsXG4gICAgdm5vZGUudHlwZSxcbiAgICBpc1Jvb3RcbiAgKX1gO1xuICBjb25zdCBjbG9zZSA9IGA+YCArIHBvc3RmaXg7XG4gIHJldHVybiB2bm9kZS5wcm9wcyA/IFtvcGVuLCAuLi5mb3JtYXRQcm9wcyh2bm9kZS5wcm9wcyksIGNsb3NlXSA6IFtvcGVuICsgY2xvc2VdO1xufVxuZnVuY3Rpb24gZm9ybWF0UHJvcHMocHJvcHMpIHtcbiAgY29uc3QgcmVzID0gW107XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gIGtleXMuc2xpY2UoMCwgMykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgcmVzLnB1c2goLi4uZm9ybWF0UHJvcChrZXksIHByb3BzW2tleV0pKTtcbiAgfSk7XG4gIGlmIChrZXlzLmxlbmd0aCA+IDMpIHtcbiAgICByZXMucHVzaChgIC4uLmApO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBmb3JtYXRQcm9wKGtleSwgdmFsdWUsIHJhdykge1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09JHt2YWx1ZX1gXTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09JHt2YWx1ZX1gXTtcbiAgfSBlbHNlIGlmIChpc1JlZih2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IGZvcm1hdFByb3Aoa2V5LCB0b1Jhdyh2YWx1ZS52YWx1ZSksIHRydWUpO1xuICAgIHJldHVybiByYXcgPyB2YWx1ZSA6IFtgJHtrZXl9PVJlZjxgLCB2YWx1ZSwgYD5gXTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHJldHVybiBbYCR7a2V5fT1mbiR7dmFsdWUubmFtZSA/IGA8JHt2YWx1ZS5uYW1lfT5gIDogYGB9YF07XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09YCwgdmFsdWVdO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnROdW1iZXIodmFsLCB0eXBlKSB7XG4gIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSlcbiAgICByZXR1cm47XG4gIGlmICh2YWwgPT09IHZvaWQgMCkge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsICE9PSBcIm51bWJlclwiKSB7XG4gICAgd2FybiQxKGAke3R5cGV9IGlzIG5vdCBhIHZhbGlkIG51bWJlciAtIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbCl9LmApO1xuICB9IGVsc2UgaWYgKGlzTmFOKHZhbCkpIHtcbiAgICB3YXJuJDEoYCR7dHlwZX0gaXMgTmFOIC0gdGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LmApO1xuICB9XG59XG5cbmNvbnN0IEVycm9yQ29kZXMgPSB7XG4gIFwiU0VUVVBfRlVOQ1RJT05cIjogMCxcbiAgXCIwXCI6IFwiU0VUVVBfRlVOQ1RJT05cIixcbiAgXCJSRU5ERVJfRlVOQ1RJT05cIjogMSxcbiAgXCIxXCI6IFwiUkVOREVSX0ZVTkNUSU9OXCIsXG4gIFwiV0FUQ0hfR0VUVEVSXCI6IDIsXG4gIFwiMlwiOiBcIldBVENIX0dFVFRFUlwiLFxuICBcIldBVENIX0NBTExCQUNLXCI6IDMsXG4gIFwiM1wiOiBcIldBVENIX0NBTExCQUNLXCIsXG4gIFwiV0FUQ0hfQ0xFQU5VUFwiOiA0LFxuICBcIjRcIjogXCJXQVRDSF9DTEVBTlVQXCIsXG4gIFwiTkFUSVZFX0VWRU5UX0hBTkRMRVJcIjogNSxcbiAgXCI1XCI6IFwiTkFUSVZFX0VWRU5UX0hBTkRMRVJcIixcbiAgXCJDT01QT05FTlRfRVZFTlRfSEFORExFUlwiOiA2LFxuICBcIjZcIjogXCJDT01QT05FTlRfRVZFTlRfSEFORExFUlwiLFxuICBcIlZOT0RFX0hPT0tcIjogNyxcbiAgXCI3XCI6IFwiVk5PREVfSE9PS1wiLFxuICBcIkRJUkVDVElWRV9IT09LXCI6IDgsXG4gIFwiOFwiOiBcIkRJUkVDVElWRV9IT09LXCIsXG4gIFwiVFJBTlNJVElPTl9IT09LXCI6IDksXG4gIFwiOVwiOiBcIlRSQU5TSVRJT05fSE9PS1wiLFxuICBcIkFQUF9FUlJPUl9IQU5ETEVSXCI6IDEwLFxuICBcIjEwXCI6IFwiQVBQX0VSUk9SX0hBTkRMRVJcIixcbiAgXCJBUFBfV0FSTl9IQU5ETEVSXCI6IDExLFxuICBcIjExXCI6IFwiQVBQX1dBUk5fSEFORExFUlwiLFxuICBcIkZVTkNUSU9OX1JFRlwiOiAxMixcbiAgXCIxMlwiOiBcIkZVTkNUSU9OX1JFRlwiLFxuICBcIkFTWU5DX0NPTVBPTkVOVF9MT0FERVJcIjogMTMsXG4gIFwiMTNcIjogXCJBU1lOQ19DT01QT05FTlRfTE9BREVSXCIsXG4gIFwiU0NIRURVTEVSXCI6IDE0LFxuICBcIjE0XCI6IFwiU0NIRURVTEVSXCJcbn07XG5jb25zdCBFcnJvclR5cGVTdHJpbmdzJDEgPSB7XG4gIFtcInNwXCJdOiBcInNlcnZlclByZWZldGNoIGhvb2tcIixcbiAgW1wiYmNcIl06IFwiYmVmb3JlQ3JlYXRlIGhvb2tcIixcbiAgW1wiY1wiXTogXCJjcmVhdGVkIGhvb2tcIixcbiAgW1wiYm1cIl06IFwiYmVmb3JlTW91bnQgaG9va1wiLFxuICBbXCJtXCJdOiBcIm1vdW50ZWQgaG9va1wiLFxuICBbXCJidVwiXTogXCJiZWZvcmVVcGRhdGUgaG9va1wiLFxuICBbXCJ1XCJdOiBcInVwZGF0ZWRcIixcbiAgW1wiYnVtXCJdOiBcImJlZm9yZVVubW91bnQgaG9va1wiLFxuICBbXCJ1bVwiXTogXCJ1bm1vdW50ZWQgaG9va1wiLFxuICBbXCJhXCJdOiBcImFjdGl2YXRlZCBob29rXCIsXG4gIFtcImRhXCJdOiBcImRlYWN0aXZhdGVkIGhvb2tcIixcbiAgW1wiZWNcIl06IFwiZXJyb3JDYXB0dXJlZCBob29rXCIsXG4gIFtcInJ0Y1wiXTogXCJyZW5kZXJUcmFja2VkIGhvb2tcIixcbiAgW1wicnRnXCJdOiBcInJlbmRlclRyaWdnZXJlZCBob29rXCIsXG4gIFswXTogXCJzZXR1cCBmdW5jdGlvblwiLFxuICBbMV06IFwicmVuZGVyIGZ1bmN0aW9uXCIsXG4gIFsyXTogXCJ3YXRjaGVyIGdldHRlclwiLFxuICBbM106IFwid2F0Y2hlciBjYWxsYmFja1wiLFxuICBbNF06IFwid2F0Y2hlciBjbGVhbnVwIGZ1bmN0aW9uXCIsXG4gIFs1XTogXCJuYXRpdmUgZXZlbnQgaGFuZGxlclwiLFxuICBbNl06IFwiY29tcG9uZW50IGV2ZW50IGhhbmRsZXJcIixcbiAgWzddOiBcInZub2RlIGhvb2tcIixcbiAgWzhdOiBcImRpcmVjdGl2ZSBob29rXCIsXG4gIFs5XTogXCJ0cmFuc2l0aW9uIGhvb2tcIixcbiAgWzEwXTogXCJhcHAgZXJyb3JIYW5kbGVyXCIsXG4gIFsxMV06IFwiYXBwIHdhcm5IYW5kbGVyXCIsXG4gIFsxMl06IFwicmVmIGZ1bmN0aW9uXCIsXG4gIFsxM106IFwiYXN5bmMgY29tcG9uZW50IGxvYWRlclwiLFxuICBbMTRdOiBcInNjaGVkdWxlciBmbHVzaC4gVGhpcyBpcyBsaWtlbHkgYSBWdWUgaW50ZXJuYWxzIGJ1Zy4gUGxlYXNlIG9wZW4gYW4gaXNzdWUgYXQgaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL2NvcmUgLlwiXG59O1xuZnVuY3Rpb24gY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncykge1xuICBsZXQgcmVzO1xuICB0cnkge1xuICAgIHJlcyA9IGFyZ3MgPyBmbiguLi5hcmdzKSA6IGZuKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIHR5cGUpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpIHtcbiAgaWYgKGlzRnVuY3Rpb24oZm4pKSB7XG4gICAgY29uc3QgcmVzID0gY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncyk7XG4gICAgaWYgKHJlcyAmJiBpc1Byb21pc2UocmVzKSkge1xuICAgICAgcmVzLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgdHlwZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbi5sZW5ndGg7IGkrKykge1xuICAgIHZhbHVlcy5wdXNoKGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGZuW2ldLCBpbnN0YW5jZSwgdHlwZSwgYXJncykpO1xuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5mdW5jdGlvbiBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCB0eXBlLCB0aHJvd0luRGV2ID0gdHJ1ZSkge1xuICBjb25zdCBjb250ZXh0Vk5vZGUgPSBpbnN0YW5jZSA/IGluc3RhbmNlLnZub2RlIDogbnVsbDtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgbGV0IGN1ciA9IGluc3RhbmNlLnBhcmVudDtcbiAgICBjb25zdCBleHBvc2VkSW5zdGFuY2UgPSBpbnN0YW5jZS5wcm94eTtcbiAgICBjb25zdCBlcnJvckluZm8gPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gRXJyb3JUeXBlU3RyaW5ncyQxW3R5cGVdIDogYGh0dHBzOi8vdnVlanMub3JnL2Vycm9ycy8jcnVudGltZS0ke3R5cGV9YDtcbiAgICB3aGlsZSAoY3VyKSB7XG4gICAgICBjb25zdCBlcnJvckNhcHR1cmVkSG9va3MgPSBjdXIuZWM7XG4gICAgICBpZiAoZXJyb3JDYXB0dXJlZEhvb2tzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXJyb3JDYXB0dXJlZEhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGVycm9yQ2FwdHVyZWRIb29rc1tpXShlcnIsIGV4cG9zZWRJbnN0YW5jZSwgZXJyb3JJbmZvKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN1ciA9IGN1ci5wYXJlbnQ7XG4gICAgfVxuICAgIGNvbnN0IGFwcEVycm9ySGFuZGxlciA9IGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLmVycm9ySGFuZGxlcjtcbiAgICBpZiAoYXBwRXJyb3JIYW5kbGVyKSB7XG4gICAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoXG4gICAgICAgIGFwcEVycm9ySGFuZGxlcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMTAsXG4gICAgICAgIFtlcnIsIGV4cG9zZWRJbnN0YW5jZSwgZXJyb3JJbmZvXVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgbG9nRXJyb3IoZXJyLCB0eXBlLCBjb250ZXh0Vk5vZGUsIHRocm93SW5EZXYpO1xufVxuZnVuY3Rpb24gbG9nRXJyb3IoZXJyLCB0eXBlLCBjb250ZXh0Vk5vZGUsIHRocm93SW5EZXYgPSB0cnVlKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgaW5mbyA9IEVycm9yVHlwZVN0cmluZ3MkMVt0eXBlXTtcbiAgICBpZiAoY29udGV4dFZOb2RlKSB7XG4gICAgICBwdXNoV2FybmluZ0NvbnRleHQoY29udGV4dFZOb2RlKTtcbiAgICB9XG4gICAgd2FybiQxKGBVbmhhbmRsZWQgZXJyb3Ike2luZm8gPyBgIGR1cmluZyBleGVjdXRpb24gb2YgJHtpbmZvfWAgOiBgYH1gKTtcbiAgICBpZiAoY29udGV4dFZOb2RlKSB7XG4gICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgIH1cbiAgICBpZiAodGhyb3dJbkRldikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5sZXQgaXNGbHVzaGluZyA9IGZhbHNlO1xubGV0IGlzRmx1c2hQZW5kaW5nID0gZmFsc2U7XG5jb25zdCBxdWV1ZSA9IFtdO1xubGV0IGZsdXNoSW5kZXggPSAwO1xuY29uc3QgcGVuZGluZ1Bvc3RGbHVzaENicyA9IFtdO1xubGV0IGFjdGl2ZVBvc3RGbHVzaENicyA9IG51bGw7XG5sZXQgcG9zdEZsdXNoSW5kZXggPSAwO1xuY29uc3QgcmVzb2x2ZWRQcm9taXNlID0gLyogQF9fUFVSRV9fICovIFByb21pc2UucmVzb2x2ZSgpO1xubGV0IGN1cnJlbnRGbHVzaFByb21pc2UgPSBudWxsO1xuY29uc3QgUkVDVVJTSU9OX0xJTUlUID0gMTAwO1xuZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgY29uc3QgcCA9IGN1cnJlbnRGbHVzaFByb21pc2UgfHwgcmVzb2x2ZWRQcm9taXNlO1xuICByZXR1cm4gZm4gPyBwLnRoZW4odGhpcyA/IGZuLmJpbmQodGhpcykgOiBmbikgOiBwO1xufVxuZnVuY3Rpb24gZmluZEluc2VydGlvbkluZGV4KGlkKSB7XG4gIGxldCBzdGFydCA9IGZsdXNoSW5kZXggKyAxO1xuICBsZXQgZW5kID0gcXVldWUubGVuZ3RoO1xuICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICBjb25zdCBtaWRkbGUgPSBzdGFydCArIGVuZCA+Pj4gMTtcbiAgICBjb25zdCBtaWRkbGVKb2IgPSBxdWV1ZVttaWRkbGVdO1xuICAgIGNvbnN0IG1pZGRsZUpvYklkID0gZ2V0SWQobWlkZGxlSm9iKTtcbiAgICBpZiAobWlkZGxlSm9iSWQgPCBpZCB8fCBtaWRkbGVKb2JJZCA9PT0gaWQgJiYgbWlkZGxlSm9iLnByZSkge1xuICAgICAgc3RhcnQgPSBtaWRkbGUgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmQgPSBtaWRkbGU7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdGFydDtcbn1cbmZ1bmN0aW9uIHF1ZXVlSm9iKGpvYikge1xuICBpZiAoIXF1ZXVlLmxlbmd0aCB8fCAhcXVldWUuaW5jbHVkZXMoXG4gICAgam9iLFxuICAgIGlzRmx1c2hpbmcgJiYgam9iLmFsbG93UmVjdXJzZSA/IGZsdXNoSW5kZXggKyAxIDogZmx1c2hJbmRleFxuICApKSB7XG4gICAgaWYgKGpvYi5pZCA9PSBudWxsKSB7XG4gICAgICBxdWV1ZS5wdXNoKGpvYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlLnNwbGljZShmaW5kSW5zZXJ0aW9uSW5kZXgoam9iLmlkKSwgMCwgam9iKTtcbiAgICB9XG4gICAgcXVldWVGbHVzaCgpO1xuICB9XG59XG5mdW5jdGlvbiBxdWV1ZUZsdXNoKCkge1xuICBpZiAoIWlzRmx1c2hpbmcgJiYgIWlzRmx1c2hQZW5kaW5nKSB7XG4gICAgaXNGbHVzaFBlbmRpbmcgPSB0cnVlO1xuICAgIGN1cnJlbnRGbHVzaFByb21pc2UgPSByZXNvbHZlZFByb21pc2UudGhlbihmbHVzaEpvYnMpO1xuICB9XG59XG5mdW5jdGlvbiBpbnZhbGlkYXRlSm9iKGpvYikge1xuICBjb25zdCBpID0gcXVldWUuaW5kZXhPZihqb2IpO1xuICBpZiAoaSA+IGZsdXNoSW5kZXgpIHtcbiAgICBxdWV1ZS5zcGxpY2UoaSwgMSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHF1ZXVlUG9zdEZsdXNoQ2IoY2IpIHtcbiAgaWYgKCFpc0FycmF5KGNiKSkge1xuICAgIGlmICghYWN0aXZlUG9zdEZsdXNoQ2JzIHx8ICFhY3RpdmVQb3N0Rmx1c2hDYnMuaW5jbHVkZXMoXG4gICAgICBjYixcbiAgICAgIGNiLmFsbG93UmVjdXJzZSA/IHBvc3RGbHVzaEluZGV4ICsgMSA6IHBvc3RGbHVzaEluZGV4XG4gICAgKSkge1xuICAgICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKGNiKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKC4uLmNiKTtcbiAgfVxuICBxdWV1ZUZsdXNoKCk7XG59XG5mdW5jdGlvbiBmbHVzaFByZUZsdXNoQ2JzKGluc3RhbmNlLCBzZWVuLCBpID0gaXNGbHVzaGluZyA/IGZsdXNoSW5kZXggKyAxIDogMCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHNlZW4gPSBzZWVuIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIH1cbiAgZm9yICg7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNiID0gcXVldWVbaV07XG4gICAgaWYgKGNiICYmIGNiLnByZSkge1xuICAgICAgaWYgKGluc3RhbmNlICYmIGNiLmlkICE9PSBpbnN0YW5jZS51aWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2VlbiwgY2IpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcXVldWUuc3BsaWNlKGksIDEpO1xuICAgICAgaS0tO1xuICAgICAgY2IoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoUG9zdEZsdXNoQ2JzKHNlZW4pIHtcbiAgaWYgKHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoKSB7XG4gICAgY29uc3QgZGVkdXBlZCA9IFsuLi5uZXcgU2V0KHBlbmRpbmdQb3N0Rmx1c2hDYnMpXS5zb3J0KFxuICAgICAgKGEsIGIpID0+IGdldElkKGEpIC0gZ2V0SWQoYilcbiAgICApO1xuICAgIHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoID0gMDtcbiAgICBpZiAoYWN0aXZlUG9zdEZsdXNoQ2JzKSB7XG4gICAgICBhY3RpdmVQb3N0Rmx1c2hDYnMucHVzaCguLi5kZWR1cGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWN0aXZlUG9zdEZsdXNoQ2JzID0gZGVkdXBlZDtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgc2VlbiA9IHNlZW4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB9XG4gICAgZm9yIChwb3N0Rmx1c2hJbmRleCA9IDA7IHBvc3RGbHVzaEluZGV4IDwgYWN0aXZlUG9zdEZsdXNoQ2JzLmxlbmd0aDsgcG9zdEZsdXNoSW5kZXgrKykge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGFjdGl2ZVBvc3RGbHVzaENic1twb3N0Rmx1c2hJbmRleF0pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYWN0aXZlUG9zdEZsdXNoQ2JzW3Bvc3RGbHVzaEluZGV4XSgpO1xuICAgIH1cbiAgICBhY3RpdmVQb3N0Rmx1c2hDYnMgPSBudWxsO1xuICAgIHBvc3RGbHVzaEluZGV4ID0gMDtcbiAgfVxufVxuY29uc3QgZ2V0SWQgPSAoam9iKSA9PiBqb2IuaWQgPT0gbnVsbCA/IEluZmluaXR5IDogam9iLmlkO1xuY29uc3QgY29tcGFyYXRvciA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IGRpZmYgPSBnZXRJZChhKSAtIGdldElkKGIpO1xuICBpZiAoZGlmZiA9PT0gMCkge1xuICAgIGlmIChhLnByZSAmJiAhYi5wcmUpXG4gICAgICByZXR1cm4gLTE7XG4gICAgaWYgKGIucHJlICYmICFhLnByZSlcbiAgICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiBkaWZmO1xufTtcbmZ1bmN0aW9uIGZsdXNoSm9icyhzZWVuKSB7XG4gIGlzRmx1c2hQZW5kaW5nID0gZmFsc2U7XG4gIGlzRmx1c2hpbmcgPSB0cnVlO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHNlZW4gPSBzZWVuIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIH1cbiAgcXVldWUuc29ydChjb21wYXJhdG9yKTtcbiAgY29uc3QgY2hlY2sgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gKGpvYikgPT4gY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGpvYikgOiBOT09QO1xuICB0cnkge1xuICAgIGZvciAoZmx1c2hJbmRleCA9IDA7IGZsdXNoSW5kZXggPCBxdWV1ZS5sZW5ndGg7IGZsdXNoSW5kZXgrKykge1xuICAgICAgY29uc3Qgam9iID0gcXVldWVbZmx1c2hJbmRleF07XG4gICAgICBpZiAoam9iICYmIGpvYi5hY3RpdmUgIT09IGZhbHNlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNoZWNrKGpvYikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoam9iLCBudWxsLCAxNCk7XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGZsdXNoSW5kZXggPSAwO1xuICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgZmx1c2hQb3N0Rmx1c2hDYnMoc2Vlbik7XG4gICAgaXNGbHVzaGluZyA9IGZhbHNlO1xuICAgIGN1cnJlbnRGbHVzaFByb21pc2UgPSBudWxsO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggfHwgcGVuZGluZ1Bvc3RGbHVzaENicy5sZW5ndGgpIHtcbiAgICAgIGZsdXNoSm9icyhzZWVuKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlVXBkYXRlcyhzZWVuLCBmbikge1xuICBpZiAoIXNlZW4uaGFzKGZuKSkge1xuICAgIHNlZW4uc2V0KGZuLCAxKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBjb3VudCA9IHNlZW4uZ2V0KGZuKTtcbiAgICBpZiAoY291bnQgPiBSRUNVUlNJT05fTElNSVQpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gZm4ub3duZXJJbnN0YW5jZTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBpbnN0YW5jZSAmJiBnZXRDb21wb25lbnROYW1lKGluc3RhbmNlLnR5cGUpO1xuICAgICAgaGFuZGxlRXJyb3IoXG4gICAgICAgIGBNYXhpbXVtIHJlY3Vyc2l2ZSB1cGRhdGVzIGV4Y2VlZGVkJHtjb21wb25lbnROYW1lID8gYCBpbiBjb21wb25lbnQgPCR7Y29tcG9uZW50TmFtZX0+YCA6IGBgfS4gVGhpcyBtZWFucyB5b3UgaGF2ZSBhIHJlYWN0aXZlIGVmZmVjdCB0aGF0IGlzIG11dGF0aW5nIGl0cyBvd24gZGVwZW5kZW5jaWVzIGFuZCB0aHVzIHJlY3Vyc2l2ZWx5IHRyaWdnZXJpbmcgaXRzZWxmLiBQb3NzaWJsZSBzb3VyY2VzIGluY2x1ZGUgY29tcG9uZW50IHRlbXBsYXRlLCByZW5kZXIgZnVuY3Rpb24sIHVwZGF0ZWQgaG9vayBvciB3YXRjaGVyIHNvdXJjZSBmdW5jdGlvbi5gLFxuICAgICAgICBudWxsLFxuICAgICAgICAxMFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWVuLnNldChmbiwgY291bnQgKyAxKTtcbiAgICB9XG4gIH1cbn1cblxubGV0IGlzSG1yVXBkYXRpbmcgPSBmYWxzZTtcbmNvbnN0IGhtckRpcnR5Q29tcG9uZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfSE1SX1JVTlRJTUVfXyA9IHtcbiAgICBjcmVhdGVSZWNvcmQ6IHRyeVdyYXAoY3JlYXRlUmVjb3JkKSxcbiAgICByZXJlbmRlcjogdHJ5V3JhcChyZXJlbmRlciksXG4gICAgcmVsb2FkOiB0cnlXcmFwKHJlbG9hZClcbiAgfTtcbn1cbmNvbnN0IG1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5mdW5jdGlvbiByZWdpc3RlckhNUihpbnN0YW5jZSkge1xuICBjb25zdCBpZCA9IGluc3RhbmNlLnR5cGUuX19obXJJZDtcbiAgbGV0IHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICBpZiAoIXJlY29yZCkge1xuICAgIGNyZWF0ZVJlY29yZChpZCwgaW5zdGFuY2UudHlwZSk7XG4gICAgcmVjb3JkID0gbWFwLmdldChpZCk7XG4gIH1cbiAgcmVjb3JkLmluc3RhbmNlcy5hZGQoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gdW5yZWdpc3RlckhNUihpbnN0YW5jZSkge1xuICBtYXAuZ2V0KGluc3RhbmNlLnR5cGUuX19obXJJZCkuaW5zdGFuY2VzLmRlbGV0ZShpbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWNvcmQoaWQsIGluaXRpYWxEZWYpIHtcbiAgaWYgKG1hcC5oYXMoaWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIG1hcC5zZXQoaWQsIHtcbiAgICBpbml0aWFsRGVmOiBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbml0aWFsRGVmKSxcbiAgICBpbnN0YW5jZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KClcbiAgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoY29tcG9uZW50KSB7XG4gIHJldHVybiBpc0NsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQuX192Y2NPcHRzIDogY29tcG9uZW50O1xufVxuZnVuY3Rpb24gcmVyZW5kZXIoaWQsIG5ld1JlbmRlcikge1xuICBjb25zdCByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVjb3JkLmluaXRpYWxEZWYucmVuZGVyID0gbmV3UmVuZGVyO1xuICBbLi4ucmVjb3JkLmluc3RhbmNlc10uZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICBpZiAobmV3UmVuZGVyKSB7XG4gICAgICBpbnN0YW5jZS5yZW5kZXIgPSBuZXdSZW5kZXI7XG4gICAgICBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbnN0YW5jZS50eXBlKS5yZW5kZXIgPSBuZXdSZW5kZXI7XG4gICAgfVxuICAgIGluc3RhbmNlLnJlbmRlckNhY2hlID0gW107XG4gICAgaXNIbXJVcGRhdGluZyA9IHRydWU7XG4gICAgaW5zdGFuY2UuZWZmZWN0LmRpcnR5ID0gdHJ1ZTtcbiAgICBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICBpc0htclVwZGF0aW5nID0gZmFsc2U7XG4gIH0pO1xufVxuZnVuY3Rpb24gcmVsb2FkKGlkLCBuZXdDb21wKSB7XG4gIGNvbnN0IHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICBpZiAoIXJlY29yZClcbiAgICByZXR1cm47XG4gIG5ld0NvbXAgPSBub3JtYWxpemVDbGFzc0NvbXBvbmVudChuZXdDb21wKTtcbiAgdXBkYXRlQ29tcG9uZW50RGVmKHJlY29yZC5pbml0aWFsRGVmLCBuZXdDb21wKTtcbiAgY29uc3QgaW5zdGFuY2VzID0gWy4uLnJlY29yZC5pbnN0YW5jZXNdO1xuICBmb3IgKGNvbnN0IGluc3RhbmNlIG9mIGluc3RhbmNlcykge1xuICAgIGNvbnN0IG9sZENvbXAgPSBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbnN0YW5jZS50eXBlKTtcbiAgICBpZiAoIWhtckRpcnR5Q29tcG9uZW50cy5oYXMob2xkQ29tcCkpIHtcbiAgICAgIGlmIChvbGRDb21wICE9PSByZWNvcmQuaW5pdGlhbERlZikge1xuICAgICAgICB1cGRhdGVDb21wb25lbnREZWYob2xkQ29tcCwgbmV3Q29tcCk7XG4gICAgICB9XG4gICAgICBobXJEaXJ0eUNvbXBvbmVudHMuYWRkKG9sZENvbXApO1xuICAgIH1cbiAgICBpbnN0YW5jZS5hcHBDb250ZXh0LnByb3BzQ2FjaGUuZGVsZXRlKGluc3RhbmNlLnR5cGUpO1xuICAgIGluc3RhbmNlLmFwcENvbnRleHQuZW1pdHNDYWNoZS5kZWxldGUoaW5zdGFuY2UudHlwZSk7XG4gICAgaW5zdGFuY2UuYXBwQ29udGV4dC5vcHRpb25zQ2FjaGUuZGVsZXRlKGluc3RhbmNlLnR5cGUpO1xuICAgIGlmIChpbnN0YW5jZS5jZVJlbG9hZCkge1xuICAgICAgaG1yRGlydHlDb21wb25lbnRzLmFkZChvbGRDb21wKTtcbiAgICAgIGluc3RhbmNlLmNlUmVsb2FkKG5ld0NvbXAuc3R5bGVzKTtcbiAgICAgIGhtckRpcnR5Q29tcG9uZW50cy5kZWxldGUob2xkQ29tcCk7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5wYXJlbnQpIHtcbiAgICAgIGluc3RhbmNlLnBhcmVudC5lZmZlY3QuZGlydHkgPSB0cnVlO1xuICAgICAgcXVldWVKb2IoaW5zdGFuY2UucGFyZW50LnVwZGF0ZSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5hcHBDb250ZXh0LnJlbG9hZCkge1xuICAgICAgaW5zdGFuY2UuYXBwQ29udGV4dC5yZWxvYWQoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltITVJdIFJvb3Qgb3IgbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSBtb2RpZmllZC4gRnVsbCByZWxvYWQgcmVxdWlyZWQuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHF1ZXVlUG9zdEZsdXNoQ2IoKCkgPT4ge1xuICAgIGZvciAoY29uc3QgaW5zdGFuY2Ugb2YgaW5zdGFuY2VzKSB7XG4gICAgICBobXJEaXJ0eUNvbXBvbmVudHMuZGVsZXRlKFxuICAgICAgICBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbnN0YW5jZS50eXBlKVxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50RGVmKG9sZENvbXAsIG5ld0NvbXApIHtcbiAgZXh0ZW5kKG9sZENvbXAsIG5ld0NvbXApO1xuICBmb3IgKGNvbnN0IGtleSBpbiBvbGRDb21wKSB7XG4gICAgaWYgKGtleSAhPT0gXCJfX2ZpbGVcIiAmJiAhKGtleSBpbiBuZXdDb21wKSkge1xuICAgICAgZGVsZXRlIG9sZENvbXBba2V5XTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHRyeVdyYXAoZm4pIHtcbiAgcmV0dXJuIChpZCwgYXJnKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmbihpZCwgYXJnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0hNUl0gU29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIFZ1ZSBjb21wb25lbnQgaG90LXJlbG9hZC4gRnVsbCByZWxvYWQgcmVxdWlyZWQuYFxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbmxldCBkZXZ0b29scyQxO1xubGV0IGJ1ZmZlciA9IFtdO1xubGV0IGRldnRvb2xzTm90SW5zdGFsbGVkID0gZmFsc2U7XG5mdW5jdGlvbiBlbWl0JDEoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgaWYgKGRldnRvb2xzJDEpIHtcbiAgICBkZXZ0b29scyQxLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICB9IGVsc2UgaWYgKCFkZXZ0b29sc05vdEluc3RhbGxlZCkge1xuICAgIGJ1ZmZlci5wdXNoKHsgZXZlbnQsIGFyZ3MgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldERldnRvb2xzSG9vayQxKGhvb2ssIHRhcmdldCkge1xuICB2YXIgX2EsIF9iO1xuICBkZXZ0b29scyQxID0gaG9vaztcbiAgaWYgKGRldnRvb2xzJDEpIHtcbiAgICBkZXZ0b29scyQxLmVuYWJsZWQgPSB0cnVlO1xuICAgIGJ1ZmZlci5mb3JFYWNoKCh7IGV2ZW50LCBhcmdzIH0pID0+IGRldnRvb2xzJDEuZW1pdChldmVudCwgLi4uYXJncykpO1xuICAgIGJ1ZmZlciA9IFtdO1xuICB9IGVsc2UgaWYgKFxuICAgIC8vIGhhbmRsZSBsYXRlIGRldnRvb2xzIGluamVjdGlvbiAtIG9ubHkgZG8gdGhpcyBpZiB3ZSBhcmUgaW4gYW4gYWN0dWFsXG4gICAgLy8gYnJvd3NlciBlbnZpcm9ubWVudCB0byBhdm9pZCB0aGUgdGltZXIgaGFuZGxlIHN0YWxsaW5nIHRlc3QgcnVubmVyIGV4aXRcbiAgICAvLyAoIzQ4MTUpXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiAvLyBzb21lIGVudnMgbW9jayB3aW5kb3cgYnV0IG5vdCBmdWxseVxuICAgIHdpbmRvdy5IVE1MRWxlbWVudCAmJiAvLyBhbHNvIGV4Y2x1ZGUganNkb21cbiAgICAhKChfYiA9IChfYSA9IHdpbmRvdy5uYXZpZ2F0b3IpID09IG51bGwgPyB2b2lkIDAgOiBfYS51c2VyQWdlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfYi5pbmNsdWRlcyhcImpzZG9tXCIpKVxuICApIHtcbiAgICBjb25zdCByZXBsYXkgPSB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyA9IHRhcmdldC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fIHx8IFtdO1xuICAgIHJlcGxheS5wdXNoKChuZXdIb29rKSA9PiB7XG4gICAgICBzZXREZXZ0b29sc0hvb2skMShuZXdIb29rLCB0YXJnZXQpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFkZXZ0b29scyQxKSB7XG4gICAgICAgIHRhcmdldC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fID0gbnVsbDtcbiAgICAgICAgZGV2dG9vbHNOb3RJbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgIH1cbiAgICB9LCAzZTMpO1xuICB9IGVsc2Uge1xuICAgIGRldnRvb2xzTm90SW5zdGFsbGVkID0gdHJ1ZTtcbiAgICBidWZmZXIgPSBbXTtcbiAgfVxufVxuZnVuY3Rpb24gZGV2dG9vbHNJbml0QXBwKGFwcCwgdmVyc2lvbikge1xuICBlbWl0JDEoXCJhcHA6aW5pdFwiIC8qIEFQUF9JTklUICovLCBhcHAsIHZlcnNpb24sIHtcbiAgICBGcmFnbWVudCxcbiAgICBUZXh0LFxuICAgIENvbW1lbnQsXG4gICAgU3RhdGljXG4gIH0pO1xufVxuZnVuY3Rpb24gZGV2dG9vbHNVbm1vdW50QXBwKGFwcCkge1xuICBlbWl0JDEoXCJhcHA6dW5tb3VudFwiIC8qIEFQUF9VTk1PVU5UICovLCBhcHApO1xufVxuY29uc3QgZGV2dG9vbHNDb21wb25lbnRBZGRlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXG4gIFwiY29tcG9uZW50OmFkZGVkXCIgLyogQ09NUE9ORU5UX0FEREVEICovXG4pO1xuY29uc3QgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURldnRvb2xzQ29tcG9uZW50SG9vayhcImNvbXBvbmVudDp1cGRhdGVkXCIgLyogQ09NUE9ORU5UX1VQREFURUQgKi8pO1xuY29uc3QgX2RldnRvb2xzQ29tcG9uZW50UmVtb3ZlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXG4gIFwiY29tcG9uZW50OnJlbW92ZWRcIiAvKiBDT01QT05FTlRfUkVNT1ZFRCAqL1xuKTtcbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50UmVtb3ZlZCA9IChjb21wb25lbnQpID0+IHtcbiAgaWYgKGRldnRvb2xzJDEgJiYgdHlwZW9mIGRldnRvb2xzJDEuY2xlYW51cEJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiICYmIC8vIHJlbW92ZSB0aGUgY29tcG9uZW50IGlmIGl0IHdhc24ndCBidWZmZXJlZFxuICAhZGV2dG9vbHMkMS5jbGVhbnVwQnVmZmVyKGNvbXBvbmVudCkpIHtcbiAgICBfZGV2dG9vbHNDb21wb25lbnRSZW1vdmVkKGNvbXBvbmVudCk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soaG9vaykge1xuICByZXR1cm4gKGNvbXBvbmVudCkgPT4ge1xuICAgIGVtaXQkMShcbiAgICAgIGhvb2ssXG4gICAgICBjb21wb25lbnQuYXBwQ29udGV4dC5hcHAsXG4gICAgICBjb21wb25lbnQudWlkLFxuICAgICAgY29tcG9uZW50LnBhcmVudCA/IGNvbXBvbmVudC5wYXJlbnQudWlkIDogdm9pZCAwLFxuICAgICAgY29tcG9uZW50XG4gICAgKTtcbiAgfTtcbn1cbmNvbnN0IGRldnRvb2xzUGVyZlN0YXJ0ID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURldnRvb2xzUGVyZm9ybWFuY2VIb29rKFxuICBcInBlcmY6c3RhcnRcIiAvKiBQRVJGT1JNQU5DRV9TVEFSVCAqL1xuKTtcbmNvbnN0IGRldnRvb2xzUGVyZkVuZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhcbiAgXCJwZXJmOmVuZFwiIC8qIFBFUkZPUk1BTkNFX0VORCAqL1xuKTtcbmZ1bmN0aW9uIGNyZWF0ZURldnRvb2xzUGVyZm9ybWFuY2VIb29rKGhvb2spIHtcbiAgcmV0dXJuIChjb21wb25lbnQsIHR5cGUsIHRpbWUpID0+IHtcbiAgICBlbWl0JDEoaG9vaywgY29tcG9uZW50LmFwcENvbnRleHQuYXBwLCBjb21wb25lbnQudWlkLCBjb21wb25lbnQsIHR5cGUsIHRpbWUpO1xuICB9O1xufVxuZnVuY3Rpb24gZGV2dG9vbHNDb21wb25lbnRFbWl0KGNvbXBvbmVudCwgZXZlbnQsIHBhcmFtcykge1xuICBlbWl0JDEoXG4gICAgXCJjb21wb25lbnQ6ZW1pdFwiIC8qIENPTVBPTkVOVF9FTUlUICovLFxuICAgIGNvbXBvbmVudC5hcHBDb250ZXh0LmFwcCxcbiAgICBjb21wb25lbnQsXG4gICAgZXZlbnQsXG4gICAgcGFyYW1zXG4gICk7XG59XG5cbmZ1bmN0aW9uIGVtaXQoaW5zdGFuY2UsIGV2ZW50LCAuLi5yYXdBcmdzKSB7XG4gIGlmIChpbnN0YW5jZS5pc1VubW91bnRlZClcbiAgICByZXR1cm47XG4gIGNvbnN0IHByb3BzID0gaW5zdGFuY2Uudm5vZGUucHJvcHMgfHwgRU1QVFlfT0JKO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGVtaXRzT3B0aW9ucyxcbiAgICAgIHByb3BzT3B0aW9uczogW3Byb3BzT3B0aW9uc11cbiAgICB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKGVtaXRzT3B0aW9ucykge1xuICAgICAgaWYgKCEoZXZlbnQgaW4gZW1pdHNPcHRpb25zKSAmJiB0cnVlKSB7XG4gICAgICAgIGlmICghcHJvcHNPcHRpb25zIHx8ICEodG9IYW5kbGVyS2V5KGV2ZW50KSBpbiBwcm9wc09wdGlvbnMpKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYENvbXBvbmVudCBlbWl0dGVkIGV2ZW50IFwiJHtldmVudH1cIiBidXQgaXQgaXMgbmVpdGhlciBkZWNsYXJlZCBpbiB0aGUgZW1pdHMgb3B0aW9uIG5vciBhcyBhbiBcIiR7dG9IYW5kbGVyS2V5KGV2ZW50KX1cIiBwcm9wLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBlbWl0c09wdGlvbnNbZXZlbnRdO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWxpZGF0b3IpKSB7XG4gICAgICAgICAgY29uc3QgaXNWYWxpZCA9IHZhbGlkYXRvciguLi5yYXdBcmdzKTtcbiAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgYEludmFsaWQgZXZlbnQgYXJndW1lbnRzOiBldmVudCB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgZXZlbnQgXCIke2V2ZW50fVwiLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGxldCBhcmdzID0gcmF3QXJncztcbiAgY29uc3QgaXNNb2RlbExpc3RlbmVyID0gZXZlbnQuc3RhcnRzV2l0aChcInVwZGF0ZTpcIik7XG4gIGNvbnN0IG1vZGVsQXJnID0gaXNNb2RlbExpc3RlbmVyICYmIGV2ZW50LnNsaWNlKDcpO1xuICBpZiAobW9kZWxBcmcgJiYgbW9kZWxBcmcgaW4gcHJvcHMpIHtcbiAgICBjb25zdCBtb2RpZmllcnNLZXkgPSBgJHttb2RlbEFyZyA9PT0gXCJtb2RlbFZhbHVlXCIgPyBcIm1vZGVsXCIgOiBtb2RlbEFyZ31Nb2RpZmllcnNgO1xuICAgIGNvbnN0IHsgbnVtYmVyLCB0cmltIH0gPSBwcm9wc1ttb2RpZmllcnNLZXldIHx8IEVNUFRZX09CSjtcbiAgICBpZiAodHJpbSkge1xuICAgICAgYXJncyA9IHJhd0FyZ3MubWFwKChhKSA9PiBpc1N0cmluZyhhKSA/IGEudHJpbSgpIDogYSk7XG4gICAgfVxuICAgIGlmIChudW1iZXIpIHtcbiAgICAgIGFyZ3MgPSByYXdBcmdzLm1hcChsb29zZVRvTnVtYmVyKTtcbiAgICB9XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgZGV2dG9vbHNDb21wb25lbnRFbWl0KGluc3RhbmNlLCBldmVudCwgYXJncyk7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCBsb3dlckNhc2VFdmVudCA9IGV2ZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyQ2FzZUV2ZW50ICE9PSBldmVudCAmJiBwcm9wc1t0b0hhbmRsZXJLZXkobG93ZXJDYXNlRXZlbnQpXSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgRXZlbnQgXCIke2xvd2VyQ2FzZUV2ZW50fVwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICR7Zm9ybWF0Q29tcG9uZW50TmFtZShcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBpbnN0YW5jZS50eXBlXG4gICAgICAgICl9IGJ1dCB0aGUgaGFuZGxlciBpcyByZWdpc3RlcmVkIGZvciBcIiR7ZXZlbnR9XCIuIE5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHlvdSBjYW5ub3QgdXNlIHYtb24gdG8gbGlzdGVuIHRvIGNhbWVsQ2FzZSBldmVudHMgd2hlbiB1c2luZyBpbi1ET00gdGVtcGxhdGVzLiBZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBcIiR7aHlwaGVuYXRlKFxuICAgICAgICAgIGV2ZW50XG4gICAgICAgICl9XCIgaW5zdGVhZCBvZiBcIiR7ZXZlbnR9XCIuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbGV0IGhhbmRsZXJOYW1lO1xuICBsZXQgaGFuZGxlciA9IHByb3BzW2hhbmRsZXJOYW1lID0gdG9IYW5kbGVyS2V5KGV2ZW50KV0gfHwgLy8gYWxzbyB0cnkgY2FtZWxDYXNlIGV2ZW50IGhhbmRsZXIgKCMyMjQ5KVxuICBwcm9wc1toYW5kbGVyTmFtZSA9IHRvSGFuZGxlcktleShjYW1lbGl6ZShldmVudCkpXTtcbiAgaWYgKCFoYW5kbGVyICYmIGlzTW9kZWxMaXN0ZW5lcikge1xuICAgIGhhbmRsZXIgPSBwcm9wc1toYW5kbGVyTmFtZSA9IHRvSGFuZGxlcktleShoeXBoZW5hdGUoZXZlbnQpKV07XG4gIH1cbiAgaWYgKGhhbmRsZXIpIHtcbiAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgIGhhbmRsZXIsXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIDYsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgfVxuICBjb25zdCBvbmNlSGFuZGxlciA9IHByb3BzW2hhbmRsZXJOYW1lICsgYE9uY2VgXTtcbiAgaWYgKG9uY2VIYW5kbGVyKSB7XG4gICAgaWYgKCFpbnN0YW5jZS5lbWl0dGVkKSB7XG4gICAgICBpbnN0YW5jZS5lbWl0dGVkID0ge307XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5lbWl0dGVkW2hhbmRsZXJOYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbnN0YW5jZS5lbWl0dGVkW2hhbmRsZXJOYW1lXSA9IHRydWU7XG4gICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBvbmNlSGFuZGxlcixcbiAgICAgIGluc3RhbmNlLFxuICAgICAgNixcbiAgICAgIGFyZ3NcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVFbWl0c09wdGlvbnMoY29tcCwgYXBwQ29udGV4dCwgYXNNaXhpbiA9IGZhbHNlKSB7XG4gIGNvbnN0IGNhY2hlID0gYXBwQ29udGV4dC5lbWl0c0NhY2hlO1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoY29tcCk7XG4gIGlmIChjYWNoZWQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgcmF3ID0gY29tcC5lbWl0cztcbiAgbGV0IG5vcm1hbGl6ZWQgPSB7fTtcbiAgbGV0IGhhc0V4dGVuZHMgPSBmYWxzZTtcbiAgaWYgKF9fVlVFX09QVElPTlNfQVBJX18gJiYgIWlzRnVuY3Rpb24oY29tcCkpIHtcbiAgICBjb25zdCBleHRlbmRFbWl0cyA9IChyYXcyKSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkRnJvbUV4dGVuZCA9IG5vcm1hbGl6ZUVtaXRzT3B0aW9ucyhyYXcyLCBhcHBDb250ZXh0LCB0cnVlKTtcbiAgICAgIGlmIChub3JtYWxpemVkRnJvbUV4dGVuZCkge1xuICAgICAgICBoYXNFeHRlbmRzID0gdHJ1ZTtcbiAgICAgICAgZXh0ZW5kKG5vcm1hbGl6ZWQsIG5vcm1hbGl6ZWRGcm9tRXh0ZW5kKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICghYXNNaXhpbiAmJiBhcHBDb250ZXh0Lm1peGlucy5sZW5ndGgpIHtcbiAgICAgIGFwcENvbnRleHQubWl4aW5zLmZvckVhY2goZXh0ZW5kRW1pdHMpO1xuICAgIH1cbiAgICBpZiAoY29tcC5leHRlbmRzKSB7XG4gICAgICBleHRlbmRFbWl0cyhjb21wLmV4dGVuZHMpO1xuICAgIH1cbiAgICBpZiAoY29tcC5taXhpbnMpIHtcbiAgICAgIGNvbXAubWl4aW5zLmZvckVhY2goZXh0ZW5kRW1pdHMpO1xuICAgIH1cbiAgfVxuICBpZiAoIXJhdyAmJiAhaGFzRXh0ZW5kcykge1xuICAgIGlmIChpc09iamVjdChjb21wKSkge1xuICAgICAgY2FjaGUuc2V0KGNvbXAsIG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoaXNBcnJheShyYXcpKSB7XG4gICAgcmF3LmZvckVhY2goKGtleSkgPT4gbm9ybWFsaXplZFtrZXldID0gbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgZXh0ZW5kKG5vcm1hbGl6ZWQsIHJhdyk7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgY2FjaGUuc2V0KGNvbXAsIG5vcm1hbGl6ZWQpO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuZnVuY3Rpb24gaXNFbWl0TGlzdGVuZXIob3B0aW9ucywga2V5KSB7XG4gIGlmICghb3B0aW9ucyB8fCAhaXNPbihrZXkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGtleSA9IGtleS5zbGljZSgyKS5yZXBsYWNlKC9PbmNlJC8sIFwiXCIpO1xuICByZXR1cm4gaGFzT3duKG9wdGlvbnMsIGtleVswXS50b0xvd2VyQ2FzZSgpICsga2V5LnNsaWNlKDEpKSB8fCBoYXNPd24ob3B0aW9ucywgaHlwaGVuYXRlKGtleSkpIHx8IGhhc093bihvcHRpb25zLCBrZXkpO1xufVxuXG5sZXQgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gbnVsbDtcbmxldCBjdXJyZW50U2NvcGVJZCA9IG51bGw7XG5mdW5jdGlvbiBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgY29uc3QgcHJldiA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbiAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gaW5zdGFuY2U7XG4gIGN1cnJlbnRTY29wZUlkID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UudHlwZS5fX3Njb3BlSWQgfHwgbnVsbDtcbiAgcmV0dXJuIHByZXY7XG59XG5mdW5jdGlvbiBwdXNoU2NvcGVJZChpZCkge1xuICBjdXJyZW50U2NvcGVJZCA9IGlkO1xufVxuZnVuY3Rpb24gcG9wU2NvcGVJZCgpIHtcbiAgY3VycmVudFNjb3BlSWQgPSBudWxsO1xufVxuY29uc3Qgd2l0aFNjb3BlSWQgPSAoX2lkKSA9PiB3aXRoQ3R4O1xuZnVuY3Rpb24gd2l0aEN0eChmbiwgY3R4ID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLCBpc05vblNjb3BlZFNsb3QpIHtcbiAgaWYgKCFjdHgpXG4gICAgcmV0dXJuIGZuO1xuICBpZiAoZm4uX24pIHtcbiAgICByZXR1cm4gZm47XG4gIH1cbiAgY29uc3QgcmVuZGVyRm5XaXRoQ29udGV4dCA9ICguLi5hcmdzKSA9PiB7XG4gICAgaWYgKHJlbmRlckZuV2l0aENvbnRleHQuX2QpIHtcbiAgICAgIHNldEJsb2NrVHJhY2tpbmcoLTEpO1xuICAgIH1cbiAgICBjb25zdCBwcmV2SW5zdGFuY2UgPSBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UoY3R4KTtcbiAgICBsZXQgcmVzO1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBmbiguLi5hcmdzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKHByZXZJbnN0YW5jZSk7XG4gICAgICBpZiAocmVuZGVyRm5XaXRoQ29udGV4dC5fZCkge1xuICAgICAgICBzZXRCbG9ja1RyYWNraW5nKDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGRldnRvb2xzQ29tcG9uZW50VXBkYXRlZChjdHgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuICByZW5kZXJGbldpdGhDb250ZXh0Ll9uID0gdHJ1ZTtcbiAgcmVuZGVyRm5XaXRoQ29udGV4dC5fYyA9IHRydWU7XG4gIHJlbmRlckZuV2l0aENvbnRleHQuX2QgPSB0cnVlO1xuICByZXR1cm4gcmVuZGVyRm5XaXRoQ29udGV4dDtcbn1cblxubGV0IGFjY2Vzc2VkQXR0cnMgPSBmYWxzZTtcbmZ1bmN0aW9uIG1hcmtBdHRyc0FjY2Vzc2VkKCkge1xuICBhY2Nlc3NlZEF0dHJzID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlbmRlckNvbXBvbmVudFJvb3QoaW5zdGFuY2UpIHtcbiAgY29uc3Qge1xuICAgIHR5cGU6IENvbXBvbmVudCxcbiAgICB2bm9kZSxcbiAgICBwcm94eSxcbiAgICB3aXRoUHJveHksXG4gICAgcHJvcHMsXG4gICAgcHJvcHNPcHRpb25zOiBbcHJvcHNPcHRpb25zXSxcbiAgICBzbG90cyxcbiAgICBhdHRycyxcbiAgICBlbWl0LFxuICAgIHJlbmRlcixcbiAgICByZW5kZXJDYWNoZSxcbiAgICBkYXRhLFxuICAgIHNldHVwU3RhdGUsXG4gICAgY3R4LFxuICAgIGluaGVyaXRBdHRyc1xuICB9ID0gaW5zdGFuY2U7XG4gIGxldCByZXN1bHQ7XG4gIGxldCBmYWxsdGhyb3VnaEF0dHJzO1xuICBjb25zdCBwcmV2ID0gc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKGluc3RhbmNlKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBhY2Nlc3NlZEF0dHJzID0gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgNCkge1xuICAgICAgY29uc3QgcHJveHlUb1VzZSA9IHdpdGhQcm94eSB8fCBwcm94eTtcbiAgICAgIGNvbnN0IHRoaXNQcm94eSA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2V0dXBTdGF0ZS5fX2lzU2NyaXB0U2V0dXAgPyBuZXcgUHJveHkocHJveHlUb1VzZSwge1xuICAgICAgICBnZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYFByb3BlcnR5ICcke1N0cmluZyhcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApfScgd2FzIGFjY2Vzc2VkIHZpYSAndGhpcycuIEF2b2lkIHVzaW5nICd0aGlzJyBpbiB0ZW1wbGF0ZXMuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcik7XG4gICAgICAgIH1cbiAgICAgIH0pIDogcHJveHlUb1VzZTtcbiAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZVZOb2RlKFxuICAgICAgICByZW5kZXIuY2FsbChcbiAgICAgICAgICB0aGlzUHJveHksXG4gICAgICAgICAgcHJveHlUb1VzZSxcbiAgICAgICAgICByZW5kZXJDYWNoZSxcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICBzZXR1cFN0YXRlLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY3R4XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBmYWxsdGhyb3VnaEF0dHJzID0gYXR0cnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlbmRlcjIgPSBDb21wb25lbnQ7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBhdHRycyA9PT0gcHJvcHMpIHtcbiAgICAgICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZVZOb2RlKFxuICAgICAgICByZW5kZXIyLmxlbmd0aCA+IDEgPyByZW5kZXIyKFxuICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB7XG4gICAgICAgICAgICBnZXQgYXR0cnMoKSB7XG4gICAgICAgICAgICAgIG1hcmtBdHRyc0FjY2Vzc2VkKCk7XG4gICAgICAgICAgICAgIHJldHVybiBhdHRycztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzbG90cyxcbiAgICAgICAgICAgIGVtaXRcbiAgICAgICAgICB9IDogeyBhdHRycywgc2xvdHMsIGVtaXQgfVxuICAgICAgICApIDogcmVuZGVyMihcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICBudWxsXG4gICAgICAgICAgLyogd2Uga25vdyBpdCBkb2Vzbid0IG5lZWQgaXQgKi9cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGZhbGx0aHJvdWdoQXR0cnMgPSBDb21wb25lbnQucHJvcHMgPyBhdHRycyA6IGdldEZ1bmN0aW9uYWxGYWxsdGhyb3VnaChhdHRycyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBibG9ja1N0YWNrLmxlbmd0aCA9IDA7XG4gICAgaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgMSk7XG4gICAgcmVzdWx0ID0gY3JlYXRlVk5vZGUoQ29tbWVudCk7XG4gIH1cbiAgbGV0IHJvb3QgPSByZXN1bHQ7XG4gIGxldCBzZXRSb290ID0gdm9pZCAwO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiByZXN1bHQucGF0Y2hGbGFnID4gMCAmJiByZXN1bHQucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgIFtyb290LCBzZXRSb290XSA9IGdldENoaWxkUm9vdChyZXN1bHQpO1xuICB9XG4gIGlmIChmYWxsdGhyb3VnaEF0dHJzICYmIGluaGVyaXRBdHRycyAhPT0gZmFsc2UpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmFsbHRocm91Z2hBdHRycyk7XG4gICAgY29uc3QgeyBzaGFwZUZsYWcgfSA9IHJvb3Q7XG4gICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICBpZiAoc2hhcGVGbGFnICYgKDEgfCA2KSkge1xuICAgICAgICBpZiAocHJvcHNPcHRpb25zICYmIGtleXMuc29tZShpc01vZGVsTGlzdGVuZXIpKSB7XG4gICAgICAgICAgZmFsbHRocm91Z2hBdHRycyA9IGZpbHRlck1vZGVsTGlzdGVuZXJzKFxuICAgICAgICAgICAgZmFsbHRocm91Z2hBdHRycyxcbiAgICAgICAgICAgIHByb3BzT3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdCA9IGNsb25lVk5vZGUocm9vdCwgZmFsbHRocm91Z2hBdHRycyk7XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWFjY2Vzc2VkQXR0cnMgJiYgcm9vdC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICAgIGNvbnN0IGFsbEF0dHJzID0gT2JqZWN0LmtleXMoYXR0cnMpO1xuICAgICAgICBjb25zdCBldmVudEF0dHJzID0gW107XG4gICAgICAgIGNvbnN0IGV4dHJhQXR0cnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBhbGxBdHRycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBhbGxBdHRyc1tpXTtcbiAgICAgICAgICBpZiAoaXNPbihrZXkpKSB7XG4gICAgICAgICAgICBpZiAoIWlzTW9kZWxMaXN0ZW5lcihrZXkpKSB7XG4gICAgICAgICAgICAgIGV2ZW50QXR0cnMucHVzaChrZXlbMl0udG9Mb3dlckNhc2UoKSArIGtleS5zbGljZSgzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4dHJhQXR0cnMucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0cmFBdHRycy5sZW5ndGgpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgRXh0cmFuZW91cyBub24tcHJvcHMgYXR0cmlidXRlcyAoJHtleHRyYUF0dHJzLmpvaW4oXCIsIFwiKX0pIHdlcmUgcGFzc2VkIHRvIGNvbXBvbmVudCBidXQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJlY2F1c2UgY29tcG9uZW50IHJlbmRlcnMgZnJhZ21lbnQgb3IgdGV4dCByb290IG5vZGVzLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudEF0dHJzLmxlbmd0aCkge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBFeHRyYW5lb3VzIG5vbi1lbWl0cyBldmVudCBsaXN0ZW5lcnMgKCR7ZXZlbnRBdHRycy5qb2luKFwiLCBcIil9KSB3ZXJlIHBhc3NlZCB0byBjb21wb25lbnQgYnV0IGNvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBiZWNhdXNlIGNvbXBvbmVudCByZW5kZXJzIGZyYWdtZW50IG9yIHRleHQgcm9vdCBub2Rlcy4gSWYgdGhlIGxpc3RlbmVyIGlzIGludGVuZGVkIHRvIGJlIGEgY29tcG9uZW50IGN1c3RvbSBldmVudCBsaXN0ZW5lciBvbmx5LCBkZWNsYXJlIGl0IHVzaW5nIHRoZSBcImVtaXRzXCIgb3B0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICh2bm9kZS5kaXJzKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzRWxlbWVudFJvb3Qocm9vdCkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYFJ1bnRpbWUgZGlyZWN0aXZlIHVzZWQgb24gY29tcG9uZW50IHdpdGggbm9uLWVsZW1lbnQgcm9vdCBub2RlLiBUaGUgZGlyZWN0aXZlcyB3aWxsIG5vdCBmdW5jdGlvbiBhcyBpbnRlbmRlZC5gXG4gICAgICApO1xuICAgIH1cbiAgICByb290ID0gY2xvbmVWTm9kZShyb290KTtcbiAgICByb290LmRpcnMgPSByb290LmRpcnMgPyByb290LmRpcnMuY29uY2F0KHZub2RlLmRpcnMpIDogdm5vZGUuZGlycztcbiAgfVxuICBpZiAodm5vZGUudHJhbnNpdGlvbikge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0VsZW1lbnRSb290KHJvb3QpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBDb21wb25lbnQgaW5zaWRlIDxUcmFuc2l0aW9uPiByZW5kZXJzIG5vbi1lbGVtZW50IHJvb3Qgbm9kZSB0aGF0IGNhbm5vdCBiZSBhbmltYXRlZC5gXG4gICAgICApO1xuICAgIH1cbiAgICByb290LnRyYW5zaXRpb24gPSB2bm9kZS50cmFuc2l0aW9uO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldFJvb3QpIHtcbiAgICBzZXRSb290KHJvb3QpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHJvb3Q7XG4gIH1cbiAgc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKHByZXYpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgZ2V0Q2hpbGRSb290ID0gKHZub2RlKSA9PiB7XG4gIGNvbnN0IHJhd0NoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gIGNvbnN0IGR5bmFtaWNDaGlsZHJlbiA9IHZub2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgY29uc3QgY2hpbGRSb290ID0gZmlsdGVyU2luZ2xlUm9vdChyYXdDaGlsZHJlbik7XG4gIGlmICghY2hpbGRSb290KSB7XG4gICAgcmV0dXJuIFt2bm9kZSwgdm9pZCAwXTtcbiAgfVxuICBjb25zdCBpbmRleCA9IHJhd0NoaWxkcmVuLmluZGV4T2YoY2hpbGRSb290KTtcbiAgY29uc3QgZHluYW1pY0luZGV4ID0gZHluYW1pY0NoaWxkcmVuID8gZHluYW1pY0NoaWxkcmVuLmluZGV4T2YoY2hpbGRSb290KSA6IC0xO1xuICBjb25zdCBzZXRSb290ID0gKHVwZGF0ZWRSb290KSA9PiB7XG4gICAgcmF3Q2hpbGRyZW5baW5kZXhdID0gdXBkYXRlZFJvb3Q7XG4gICAgaWYgKGR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgaWYgKGR5bmFtaWNJbmRleCA+IC0xKSB7XG4gICAgICAgIGR5bmFtaWNDaGlsZHJlbltkeW5hbWljSW5kZXhdID0gdXBkYXRlZFJvb3Q7XG4gICAgICB9IGVsc2UgaWYgKHVwZGF0ZWRSb290LnBhdGNoRmxhZyA+IDApIHtcbiAgICAgICAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID0gWy4uLmR5bmFtaWNDaGlsZHJlbiwgdXBkYXRlZFJvb3RdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIFtub3JtYWxpemVWTm9kZShjaGlsZFJvb3QpLCBzZXRSb290XTtcbn07XG5mdW5jdGlvbiBmaWx0ZXJTaW5nbGVSb290KGNoaWxkcmVuKSB7XG4gIGxldCBzaW5nbGVSb290O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoaXNWTm9kZShjaGlsZCkpIHtcbiAgICAgIGlmIChjaGlsZC50eXBlICE9PSBDb21tZW50IHx8IGNoaWxkLmNoaWxkcmVuID09PSBcInYtaWZcIikge1xuICAgICAgICBpZiAoc2luZ2xlUm9vdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaW5nbGVSb290ID0gY2hpbGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2luZ2xlUm9vdDtcbn1cbmNvbnN0IGdldEZ1bmN0aW9uYWxGYWxsdGhyb3VnaCA9IChhdHRycykgPT4ge1xuICBsZXQgcmVzO1xuICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgIGlmIChrZXkgPT09IFwiY2xhc3NcIiB8fCBrZXkgPT09IFwic3R5bGVcIiB8fCBpc09uKGtleSkpIHtcbiAgICAgIChyZXMgfHwgKHJlcyA9IHt9KSlba2V5XSA9IGF0dHJzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuY29uc3QgZmlsdGVyTW9kZWxMaXN0ZW5lcnMgPSAoYXR0cnMsIHByb3BzKSA9PiB7XG4gIGNvbnN0IHJlcyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgIGlmICghaXNNb2RlbExpc3RlbmVyKGtleSkgfHwgIShrZXkuc2xpY2UoOSkgaW4gcHJvcHMpKSB7XG4gICAgICByZXNba2V5XSA9IGF0dHJzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuY29uc3QgaXNFbGVtZW50Um9vdCA9ICh2bm9kZSkgPT4ge1xuICByZXR1cm4gdm5vZGUuc2hhcGVGbGFnICYgKDYgfCAxKSB8fCB2bm9kZS50eXBlID09PSBDb21tZW50O1xufTtcbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZUNvbXBvbmVudChwcmV2Vk5vZGUsIG5leHRWTm9kZSwgb3B0aW1pemVkKSB7XG4gIGNvbnN0IHsgcHJvcHM6IHByZXZQcm9wcywgY2hpbGRyZW46IHByZXZDaGlsZHJlbiwgY29tcG9uZW50IH0gPSBwcmV2Vk5vZGU7XG4gIGNvbnN0IHsgcHJvcHM6IG5leHRQcm9wcywgY2hpbGRyZW46IG5leHRDaGlsZHJlbiwgcGF0Y2hGbGFnIH0gPSBuZXh0Vk5vZGU7XG4gIGNvbnN0IGVtaXRzID0gY29tcG9uZW50LmVtaXRzT3B0aW9ucztcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgKHByZXZDaGlsZHJlbiB8fCBuZXh0Q2hpbGRyZW4pICYmIGlzSG1yVXBkYXRpbmcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAobmV4dFZOb2RlLmRpcnMgfHwgbmV4dFZOb2RlLnRyYW5zaXRpb24pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAob3B0aW1pemVkICYmIHBhdGNoRmxhZyA+PSAwKSB7XG4gICAgaWYgKHBhdGNoRmxhZyAmIDEwMjQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocGF0Y2hGbGFnICYgMTYpIHtcbiAgICAgIGlmICghcHJldlByb3BzKSB7XG4gICAgICAgIHJldHVybiAhIW5leHRQcm9wcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzKTtcbiAgICB9IGVsc2UgaWYgKHBhdGNoRmxhZyAmIDgpIHtcbiAgICAgIGNvbnN0IGR5bmFtaWNQcm9wcyA9IG5leHRWTm9kZS5keW5hbWljUHJvcHM7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGR5bmFtaWNQcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBkeW5hbWljUHJvcHNbaV07XG4gICAgICAgIGlmIChuZXh0UHJvcHNba2V5XSAhPT0gcHJldlByb3BzW2tleV0gJiYgIWlzRW1pdExpc3RlbmVyKGVtaXRzLCBrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHByZXZDaGlsZHJlbiB8fCBuZXh0Q2hpbGRyZW4pIHtcbiAgICAgIGlmICghbmV4dENoaWxkcmVuIHx8ICFuZXh0Q2hpbGRyZW4uJHN0YWJsZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByZXZQcm9wcyA9PT0gbmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghcHJldlByb3BzKSB7XG4gICAgICByZXR1cm4gISFuZXh0UHJvcHM7XG4gICAgfVxuICAgIGlmICghbmV4dFByb3BzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc1Byb3BzQ2hhbmdlZChwcmV2UHJvcHMsIG5leHRQcm9wcywgZW1pdHMpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhc1Byb3BzQ2hhbmdlZChwcmV2UHJvcHMsIG5leHRQcm9wcywgZW1pdHNPcHRpb25zKSB7XG4gIGNvbnN0IG5leHRLZXlzID0gT2JqZWN0LmtleXMobmV4dFByb3BzKTtcbiAgaWYgKG5leHRLZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMocHJldlByb3BzKS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5leHRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gbmV4dEtleXNbaV07XG4gICAgaWYgKG5leHRQcm9wc1trZXldICE9PSBwcmV2UHJvcHNba2V5XSAmJiAhaXNFbWl0TGlzdGVuZXIoZW1pdHNPcHRpb25zLCBrZXkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gdXBkYXRlSE9DSG9zdEVsKHsgdm5vZGUsIHBhcmVudCB9LCBlbCkge1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgY29uc3Qgcm9vdCA9IHBhcmVudC5zdWJUcmVlO1xuICAgIGlmIChyb290LnN1c3BlbnNlICYmIHJvb3Quc3VzcGVuc2UuYWN0aXZlQnJhbmNoID09PSB2bm9kZSkge1xuICAgICAgcm9vdC5lbCA9IHZub2RlLmVsO1xuICAgIH1cbiAgICBpZiAocm9vdCA9PT0gdm5vZGUpIHtcbiAgICAgICh2bm9kZSA9IHBhcmVudC52bm9kZSkuZWwgPSBlbDtcbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBDT01QT05FTlRTID0gXCJjb21wb25lbnRzXCI7XG5jb25zdCBESVJFQ1RJVkVTID0gXCJkaXJlY3RpdmVzXCI7XG5mdW5jdGlvbiByZXNvbHZlQ29tcG9uZW50KG5hbWUsIG1heWJlU2VsZlJlZmVyZW5jZSkge1xuICByZXR1cm4gcmVzb2x2ZUFzc2V0KENPTVBPTkVOVFMsIG5hbWUsIHRydWUsIG1heWJlU2VsZlJlZmVyZW5jZSkgfHwgbmFtZTtcbn1cbmNvbnN0IE5VTExfRFlOQU1JQ19DT01QT05FTlQgPSBTeW1ib2wuZm9yKFwidi1uZGNcIik7XG5mdW5jdGlvbiByZXNvbHZlRHluYW1pY0NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgaWYgKGlzU3RyaW5nKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUFzc2V0KENPTVBPTkVOVFMsIGNvbXBvbmVudCwgZmFsc2UpIHx8IGNvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29tcG9uZW50IHx8IE5VTExfRFlOQU1JQ19DT01QT05FTlQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVEaXJlY3RpdmUobmFtZSkge1xuICByZXR1cm4gcmVzb2x2ZUFzc2V0KERJUkVDVElWRVMsIG5hbWUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUFzc2V0KHR5cGUsIG5hbWUsIHdhcm5NaXNzaW5nID0gdHJ1ZSwgbWF5YmVTZWxmUmVmZXJlbmNlID0gZmFsc2UpIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgfHwgY3VycmVudEluc3RhbmNlO1xuICBpZiAoaW5zdGFuY2UpIHtcbiAgICBjb25zdCBDb21wb25lbnQgPSBpbnN0YW5jZS50eXBlO1xuICAgIGlmICh0eXBlID09PSBDT01QT05FTlRTKSB7XG4gICAgICBjb25zdCBzZWxmTmFtZSA9IGdldENvbXBvbmVudE5hbWUoXG4gICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgICBpZiAoc2VsZk5hbWUgJiYgKHNlbGZOYW1lID09PSBuYW1lIHx8IHNlbGZOYW1lID09PSBjYW1lbGl6ZShuYW1lKSB8fCBzZWxmTmFtZSA9PT0gY2FwaXRhbGl6ZShjYW1lbGl6ZShuYW1lKSkpKSB7XG4gICAgICAgIHJldHVybiBDb21wb25lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IChcbiAgICAgIC8vIGxvY2FsIHJlZ2lzdHJhdGlvblxuICAgICAgLy8gY2hlY2sgaW5zdGFuY2VbdHlwZV0gZmlyc3Qgd2hpY2ggaXMgcmVzb2x2ZWQgZm9yIG9wdGlvbnMgQVBJXG4gICAgICByZXNvbHZlKGluc3RhbmNlW3R5cGVdIHx8IENvbXBvbmVudFt0eXBlXSwgbmFtZSkgfHwgLy8gZ2xvYmFsIHJlZ2lzdHJhdGlvblxuICAgICAgcmVzb2x2ZShpbnN0YW5jZS5hcHBDb250ZXh0W3R5cGVdLCBuYW1lKVxuICAgICk7XG4gICAgaWYgKCFyZXMgJiYgbWF5YmVTZWxmUmVmZXJlbmNlKSB7XG4gICAgICByZXR1cm4gQ29tcG9uZW50O1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuTWlzc2luZyAmJiAhcmVzKSB7XG4gICAgICBjb25zdCBleHRyYSA9IHR5cGUgPT09IENPTVBPTkVOVFMgPyBgXG5JZiB0aGlzIGlzIGEgbmF0aXZlIGN1c3RvbSBlbGVtZW50LCBtYWtlIHN1cmUgdG8gZXhjbHVkZSBpdCBmcm9tIGNvbXBvbmVudCByZXNvbHV0aW9uIHZpYSBjb21waWxlck9wdGlvbnMuaXNDdXN0b21FbGVtZW50LmAgOiBgYDtcbiAgICAgIHdhcm4kMShgRmFpbGVkIHRvIHJlc29sdmUgJHt0eXBlLnNsaWNlKDAsIC0xKX06ICR7bmFtZX0ke2V4dHJhfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgcmVzb2x2ZSR7Y2FwaXRhbGl6ZSh0eXBlLnNsaWNlKDAsIC0xKSl9IGNhbiBvbmx5IGJlIHVzZWQgaW4gcmVuZGVyKCkgb3Igc2V0dXAoKS5gXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZShyZWdpc3RyeSwgbmFtZSkge1xuICByZXR1cm4gcmVnaXN0cnkgJiYgKHJlZ2lzdHJ5W25hbWVdIHx8IHJlZ2lzdHJ5W2NhbWVsaXplKG5hbWUpXSB8fCByZWdpc3RyeVtjYXBpdGFsaXplKGNhbWVsaXplKG5hbWUpKV0pO1xufVxuXG5jb25zdCBpc1N1c3BlbnNlID0gKHR5cGUpID0+IHR5cGUuX19pc1N1c3BlbnNlO1xubGV0IHN1c3BlbnNlSWQgPSAwO1xuY29uc3QgU3VzcGVuc2VJbXBsID0ge1xuICBuYW1lOiBcIlN1c3BlbnNlXCIsXG4gIC8vIEluIG9yZGVyIHRvIG1ha2UgU3VzcGVuc2UgdHJlZS1zaGFrYWJsZSwgd2UgbmVlZCB0byBhdm9pZCBpbXBvcnRpbmcgaXRcbiAgLy8gZGlyZWN0bHkgaW4gdGhlIHJlbmRlcmVyLiBUaGUgcmVuZGVyZXIgY2hlY2tzIGZvciB0aGUgX19pc1N1c3BlbnNlIGZsYWdcbiAgLy8gb24gYSB2bm9kZSdzIHR5cGUgYW5kIGNhbGxzIHRoZSBgcHJvY2Vzc2AgbWV0aG9kLCBwYXNzaW5nIGluIHJlbmRlcmVyXG4gIC8vIGludGVybmFscy5cbiAgX19pc1N1c3BlbnNlOiB0cnVlLFxuICBwcm9jZXNzKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIG1vdW50U3VzcGVuc2UoXG4gICAgICAgIG4yLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgcmVuZGVyZXJJbnRlcm5hbHNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5kZXBzID4gMCkge1xuICAgICAgICBuMi5zdXNwZW5zZSA9IG4xLnN1c3BlbnNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwYXRjaFN1c3BlbnNlKFxuICAgICAgICBuMSxcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICAgICApO1xuICAgIH1cbiAgfSxcbiAgaHlkcmF0ZTogaHlkcmF0ZVN1c3BlbnNlLFxuICBjcmVhdGU6IGNyZWF0ZVN1c3BlbnNlQm91bmRhcnksXG4gIG5vcm1hbGl6ZTogbm9ybWFsaXplU3VzcGVuc2VDaGlsZHJlblxufTtcbmNvbnN0IFN1c3BlbnNlID0gU3VzcGVuc2VJbXBsIDtcbmZ1bmN0aW9uIHRyaWdnZXJFdmVudCh2bm9kZSwgbmFtZSkge1xuICBjb25zdCBldmVudExpc3RlbmVyID0gdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHNbbmFtZV07XG4gIGlmIChpc0Z1bmN0aW9uKGV2ZW50TGlzdGVuZXIpKSB7XG4gICAgZXZlbnRMaXN0ZW5lcigpO1xuICB9XG59XG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMpIHtcbiAgY29uc3Qge1xuICAgIHA6IHBhdGNoLFxuICAgIG86IHsgY3JlYXRlRWxlbWVudCB9XG4gIH0gPSByZW5kZXJlckludGVybmFscztcbiAgY29uc3QgaGlkZGVuQ29udGFpbmVyID0gY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgY29uc3Qgc3VzcGVuc2UgPSB2bm9kZS5zdXNwZW5zZSA9IGNyZWF0ZVN1c3BlbnNlQm91bmRhcnkoXG4gICAgdm5vZGUsXG4gICAgcGFyZW50U3VzcGVuc2UsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIGNvbnRhaW5lcixcbiAgICBoaWRkZW5Db250YWluZXIsXG4gICAgYW5jaG9yLFxuICAgIG5hbWVzcGFjZSxcbiAgICBzbG90U2NvcGVJZHMsXG4gICAgb3B0aW1pemVkLFxuICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICk7XG4gIHBhdGNoKFxuICAgIG51bGwsXG4gICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IHZub2RlLnNzQ29udGVudCxcbiAgICBoaWRkZW5Db250YWluZXIsXG4gICAgbnVsbCxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgc3VzcGVuc2UsXG4gICAgbmFtZXNwYWNlLFxuICAgIHNsb3RTY29wZUlkc1xuICApO1xuICBpZiAoc3VzcGVuc2UuZGVwcyA+IDApIHtcbiAgICB0cmlnZ2VyRXZlbnQodm5vZGUsIFwib25QZW5kaW5nXCIpO1xuICAgIHRyaWdnZXJFdmVudCh2bm9kZSwgXCJvbkZhbGxiYWNrXCIpO1xuICAgIHBhdGNoKFxuICAgICAgbnVsbCxcbiAgICAgIHZub2RlLnNzRmFsbGJhY2ssXG4gICAgICBjb250YWluZXIsXG4gICAgICBhbmNob3IsXG4gICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICBudWxsLFxuICAgICAgLy8gZmFsbGJhY2sgdHJlZSB3aWxsIG5vdCBoYXZlIHN1c3BlbnNlIGNvbnRleHRcbiAgICAgIG5hbWVzcGFjZSxcbiAgICAgIHNsb3RTY29wZUlkc1xuICAgICk7XG4gICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCB2bm9kZS5zc0ZhbGxiYWNrKTtcbiAgfSBlbHNlIHtcbiAgICBzdXNwZW5zZS5yZXNvbHZlKGZhbHNlLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcGF0Y2hTdXNwZW5zZShuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHsgcDogcGF0Y2gsIHVtOiB1bm1vdW50LCBvOiB7IGNyZWF0ZUVsZW1lbnQgfSB9KSB7XG4gIGNvbnN0IHN1c3BlbnNlID0gbjIuc3VzcGVuc2UgPSBuMS5zdXNwZW5zZTtcbiAgc3VzcGVuc2Uudm5vZGUgPSBuMjtcbiAgbjIuZWwgPSBuMS5lbDtcbiAgY29uc3QgbmV3QnJhbmNoID0gbjIuc3NDb250ZW50O1xuICBjb25zdCBuZXdGYWxsYmFjayA9IG4yLnNzRmFsbGJhY2s7XG4gIGNvbnN0IHsgYWN0aXZlQnJhbmNoLCBwZW5kaW5nQnJhbmNoLCBpc0luRmFsbGJhY2ssIGlzSHlkcmF0aW5nIH0gPSBzdXNwZW5zZTtcbiAgaWYgKHBlbmRpbmdCcmFuY2gpIHtcbiAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoID0gbmV3QnJhbmNoO1xuICAgIGlmIChpc1NhbWVWTm9kZVR5cGUobmV3QnJhbmNoLCBwZW5kaW5nQnJhbmNoKSkge1xuICAgICAgcGF0Y2goXG4gICAgICAgIHBlbmRpbmdCcmFuY2gsXG4gICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgICAgaWYgKHN1c3BlbnNlLmRlcHMgPD0gMCkge1xuICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICB9IGVsc2UgaWYgKGlzSW5GYWxsYmFjaykge1xuICAgICAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgICAgICBuZXdGYWxsYmFjayxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAvLyBmYWxsYmFjayB0cmVlIHdpbGwgbm90IGhhdmUgc3VzcGVuc2UgY29udGV4dFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIG5ld0ZhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdXNwZW5zZS5wZW5kaW5nSWQgPSBzdXNwZW5zZUlkKys7XG4gICAgICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgc3VzcGVuc2UuaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoID0gcGVuZGluZ0JyYW5jaDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVubW91bnQocGVuZGluZ0JyYW5jaCwgcGFyZW50Q29tcG9uZW50LCBzdXNwZW5zZSk7XG4gICAgICB9XG4gICAgICBzdXNwZW5zZS5kZXBzID0gMDtcbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMubGVuZ3RoID0gMDtcbiAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBpZiAoaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICAgICAgbmV3RmFsbGJhY2ssXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgLy8gZmFsbGJhY2sgdHJlZSB3aWxsIG5vdCBoYXZlIHN1c3BlbnNlIGNvbnRleHRcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBuZXdGYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZlQnJhbmNoICYmIGlzU2FtZVZOb2RlVHlwZShuZXdCcmFuY2gsIGFjdGl2ZUJyYW5jaCkpIHtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgICAgc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGFjdGl2ZUJyYW5jaCAmJiBpc1NhbWVWTm9kZVR5cGUobmV3QnJhbmNoLCBhY3RpdmVCcmFuY2gpKSB7XG4gICAgICBwYXRjaChcbiAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBuZXdCcmFuY2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXZlbnQobjIsIFwib25QZW5kaW5nXCIpO1xuICAgICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IG5ld0JyYW5jaDtcbiAgICAgIGlmIChuZXdCcmFuY2guc2hhcGVGbGFnICYgNTEyKSB7XG4gICAgICAgIHN1c3BlbnNlLnBlbmRpbmdJZCA9IG5ld0JyYW5jaC5jb21wb25lbnQuc3VzcGVuc2VJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1c3BlbnNlLnBlbmRpbmdJZCA9IHN1c3BlbnNlSWQrKztcbiAgICAgIH1cbiAgICAgIHBhdGNoKFxuICAgICAgICBudWxsLFxuICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyB0aW1lb3V0LCBwZW5kaW5nSWQgfSA9IHN1c3BlbnNlO1xuICAgICAgICBpZiAodGltZW91dCA+IDApIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nSWQgPT09IHBlbmRpbmdJZCkge1xuICAgICAgICAgICAgICBzdXNwZW5zZS5mYWxsYmFjayhuZXdGYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGltZW91dCA9PT0gMCkge1xuICAgICAgICAgIHN1c3BlbnNlLmZhbGxiYWNrKG5ld0ZhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxubGV0IGhhc1dhcm5lZCA9IGZhbHNlO1xuZnVuY3Rpb24gY3JlYXRlU3VzcGVuc2VCb3VuZGFyeSh2bm9kZSwgcGFyZW50U3VzcGVuc2UsIHBhcmVudENvbXBvbmVudCwgY29udGFpbmVyLCBoaWRkZW5Db250YWluZXIsIGFuY2hvciwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMsIGlzSHlkcmF0aW5nID0gZmFsc2UpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHJ1ZSAmJiAhaGFzV2FybmVkKSB7XG4gICAgaGFzV2FybmVkID0gdHJ1ZTtcbiAgICBjb25zb2xlW2NvbnNvbGUuaW5mbyA/IFwiaW5mb1wiIDogXCJsb2dcIl0oXG4gICAgICBgPFN1c3BlbnNlPiBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgaXRzIEFQSSB3aWxsIGxpa2VseSBjaGFuZ2UuYFxuICAgICk7XG4gIH1cbiAgY29uc3Qge1xuICAgIHA6IHBhdGNoLFxuICAgIG06IG1vdmUsXG4gICAgdW06IHVubW91bnQsXG4gICAgbjogbmV4dCxcbiAgICBvOiB7IHBhcmVudE5vZGUsIHJlbW92ZSB9XG4gIH0gPSByZW5kZXJlckludGVybmFscztcbiAgbGV0IHBhcmVudFN1c3BlbnNlSWQ7XG4gIGNvbnN0IGlzU3VzcGVuc2libGUgPSBpc1ZOb2RlU3VzcGVuc2libGUodm5vZGUpO1xuICBpZiAoaXNTdXNwZW5zaWJsZSkge1xuICAgIGlmIChwYXJlbnRTdXNwZW5zZSA9PSBudWxsID8gdm9pZCAwIDogcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgcGFyZW50U3VzcGVuc2VJZCA9IHBhcmVudFN1c3BlbnNlLnBlbmRpbmdJZDtcbiAgICAgIHBhcmVudFN1c3BlbnNlLmRlcHMrKztcbiAgICB9XG4gIH1cbiAgY29uc3QgdGltZW91dCA9IHZub2RlLnByb3BzID8gdG9OdW1iZXIodm5vZGUucHJvcHMudGltZW91dCkgOiB2b2lkIDA7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgYXNzZXJ0TnVtYmVyKHRpbWVvdXQsIGBTdXNwZW5zZSB0aW1lb3V0YCk7XG4gIH1cbiAgY29uc3QgaW5pdGlhbEFuY2hvciA9IGFuY2hvcjtcbiAgY29uc3Qgc3VzcGVuc2UgPSB7XG4gICAgdm5vZGUsXG4gICAgcGFyZW50OiBwYXJlbnRTdXNwZW5zZSxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgbmFtZXNwYWNlLFxuICAgIGNvbnRhaW5lcixcbiAgICBoaWRkZW5Db250YWluZXIsXG4gICAgZGVwczogMCxcbiAgICBwZW5kaW5nSWQ6IHN1c3BlbnNlSWQrKyxcbiAgICB0aW1lb3V0OiB0eXBlb2YgdGltZW91dCA9PT0gXCJudW1iZXJcIiA/IHRpbWVvdXQgOiAtMSxcbiAgICBhY3RpdmVCcmFuY2g6IG51bGwsXG4gICAgcGVuZGluZ0JyYW5jaDogbnVsbCxcbiAgICBpc0luRmFsbGJhY2s6ICFpc0h5ZHJhdGluZyxcbiAgICBpc0h5ZHJhdGluZyxcbiAgICBpc1VubW91bnRlZDogZmFsc2UsXG4gICAgZWZmZWN0czogW10sXG4gICAgcmVzb2x2ZShyZXN1bWUgPSBmYWxzZSwgc3luYyA9IGZhbHNlKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICBpZiAoIXJlc3VtZSAmJiAhc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBzdXNwZW5zZS5yZXNvbHZlKCkgaXMgY2FsbGVkIHdpdGhvdXQgYSBwZW5kaW5nIGJyYW5jaC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VzcGVuc2UuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgc3VzcGVuc2UucmVzb2x2ZSgpIGlzIGNhbGxlZCBvbiBhbiBhbHJlYWR5IHVubW91bnRlZCBzdXNwZW5zZSBib3VuZGFyeS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICB2bm9kZTogdm5vZGUyLFxuICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgIHBlbmRpbmdCcmFuY2gsXG4gICAgICAgIHBlbmRpbmdJZCxcbiAgICAgICAgZWZmZWN0cyxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50OiBwYXJlbnRDb21wb25lbnQyLFxuICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcjJcbiAgICAgIH0gPSBzdXNwZW5zZTtcbiAgICAgIGxldCBkZWxheUVudGVyID0gZmFsc2U7XG4gICAgICBpZiAoc3VzcGVuc2UuaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgc3VzcGVuc2UuaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoIXJlc3VtZSkge1xuICAgICAgICBkZWxheUVudGVyID0gYWN0aXZlQnJhbmNoICYmIHBlbmRpbmdCcmFuY2gudHJhbnNpdGlvbiAmJiBwZW5kaW5nQnJhbmNoLnRyYW5zaXRpb24ubW9kZSA9PT0gXCJvdXQtaW5cIjtcbiAgICAgICAgaWYgKGRlbGF5RW50ZXIpIHtcbiAgICAgICAgICBhY3RpdmVCcmFuY2gudHJhbnNpdGlvbi5hZnRlckxlYXZlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBlbmRpbmdJZCA9PT0gc3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICAgICAgICAgIG1vdmUoXG4gICAgICAgICAgICAgICAgcGVuZGluZ0JyYW5jaCxcbiAgICAgICAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgICAgICAgIGFuY2hvciA9PT0gaW5pdGlhbEFuY2hvciA/IG5leHQoYWN0aXZlQnJhbmNoKSA6IGFuY2hvcixcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZWZmZWN0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aXZlQnJhbmNoKSB7XG4gICAgICAgICAgaWYgKHBhcmVudE5vZGUoYWN0aXZlQnJhbmNoLmVsKSAhPT0gc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBhbmNob3IgPSBuZXh0KGFjdGl2ZUJyYW5jaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVubW91bnQoYWN0aXZlQnJhbmNoLCBwYXJlbnRDb21wb25lbnQyLCBzdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZWxheUVudGVyKSB7XG4gICAgICAgICAgbW92ZShwZW5kaW5nQnJhbmNoLCBjb250YWluZXIyLCBhbmNob3IsIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIHBlbmRpbmdCcmFuY2gpO1xuICAgICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IG51bGw7XG4gICAgICBzdXNwZW5zZS5pc0luRmFsbGJhY2sgPSBmYWxzZTtcbiAgICAgIGxldCBwYXJlbnQgPSBzdXNwZW5zZS5wYXJlbnQ7XG4gICAgICBsZXQgaGFzVW5yZXNvbHZlZEFuY2VzdG9yID0gZmFsc2U7XG4gICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICAgIHBhcmVudC5lZmZlY3RzLnB1c2goLi4uZWZmZWN0cyk7XG4gICAgICAgICAgaGFzVW5yZXNvbHZlZEFuY2VzdG9yID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgfVxuICAgICAgaWYgKCFoYXNVbnJlc29sdmVkQW5jZXN0b3IgJiYgIWRlbGF5RW50ZXIpIHtcbiAgICAgICAgcXVldWVQb3N0Rmx1c2hDYihlZmZlY3RzKTtcbiAgICAgIH1cbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMgPSBbXTtcbiAgICAgIGlmIChpc1N1c3BlbnNpYmxlKSB7XG4gICAgICAgIGlmIChwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nQnJhbmNoICYmIHBhcmVudFN1c3BlbnNlSWQgPT09IHBhcmVudFN1c3BlbnNlLnBlbmRpbmdJZCkge1xuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLmRlcHMtLTtcbiAgICAgICAgICBpZiAocGFyZW50U3VzcGVuc2UuZGVwcyA9PT0gMCAmJiAhc3luYykge1xuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KHZub2RlMiwgXCJvblJlc29sdmVcIik7XG4gICAgfSxcbiAgICBmYWxsYmFjayhmYWxsYmFja1ZOb2RlKSB7XG4gICAgICBpZiAoIXN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB2bm9kZTogdm5vZGUyLCBhY3RpdmVCcmFuY2gsIHBhcmVudENvbXBvbmVudDogcGFyZW50Q29tcG9uZW50MiwgY29udGFpbmVyOiBjb250YWluZXIyLCBuYW1lc3BhY2U6IG5hbWVzcGFjZTIgfSA9IHN1c3BlbnNlO1xuICAgICAgdHJpZ2dlckV2ZW50KHZub2RlMiwgXCJvbkZhbGxiYWNrXCIpO1xuICAgICAgY29uc3QgYW5jaG9yMiA9IG5leHQoYWN0aXZlQnJhbmNoKTtcbiAgICAgIGNvbnN0IG1vdW50RmFsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgIGlmICghc3VzcGVuc2UuaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgZmFsbGJhY2tWTm9kZSxcbiAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgIGFuY2hvcjIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50MixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgbmFtZXNwYWNlMixcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgZmFsbGJhY2tWTm9kZSk7XG4gICAgICB9O1xuICAgICAgY29uc3QgZGVsYXlFbnRlciA9IGZhbGxiYWNrVk5vZGUudHJhbnNpdGlvbiAmJiBmYWxsYmFja1ZOb2RlLnRyYW5zaXRpb24ubW9kZSA9PT0gXCJvdXQtaW5cIjtcbiAgICAgIGlmIChkZWxheUVudGVyKSB7XG4gICAgICAgIGFjdGl2ZUJyYW5jaC50cmFuc2l0aW9uLmFmdGVyTGVhdmUgPSBtb3VudEZhbGxiYWNrO1xuICAgICAgfVxuICAgICAgc3VzcGVuc2UuaXNJbkZhbGxiYWNrID0gdHJ1ZTtcbiAgICAgIHVubW91bnQoXG4gICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50MixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgLy8gbm8gc3VzcGVuc2Ugc28gdW5tb3VudCBob29rcyBmaXJlIG5vd1xuICAgICAgICB0cnVlXG4gICAgICAgIC8vIHNob3VsZFJlbW92ZVxuICAgICAgKTtcbiAgICAgIGlmICghZGVsYXlFbnRlcikge1xuICAgICAgICBtb3VudEZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBtb3ZlKGNvbnRhaW5lcjIsIGFuY2hvcjIsIHR5cGUpIHtcbiAgICAgIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCAmJiBtb3ZlKHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCwgY29udGFpbmVyMiwgYW5jaG9yMiwgdHlwZSk7XG4gICAgICBzdXNwZW5zZS5jb250YWluZXIgPSBjb250YWluZXIyO1xuICAgIH0sXG4gICAgbmV4dCgpIHtcbiAgICAgIHJldHVybiBzdXNwZW5zZS5hY3RpdmVCcmFuY2ggJiYgbmV4dChzdXNwZW5zZS5hY3RpdmVCcmFuY2gpO1xuICAgIH0sXG4gICAgcmVnaXN0ZXJEZXAoaW5zdGFuY2UsIHNldHVwUmVuZGVyRWZmZWN0KSB7XG4gICAgICBjb25zdCBpc0luUGVuZGluZ1N1c3BlbnNlID0gISFzdXNwZW5zZS5wZW5kaW5nQnJhbmNoO1xuICAgICAgaWYgKGlzSW5QZW5kaW5nU3VzcGVuc2UpIHtcbiAgICAgICAgc3VzcGVuc2UuZGVwcysrO1xuICAgICAgfVxuICAgICAgY29uc3QgaHlkcmF0ZWRFbCA9IGluc3RhbmNlLnZub2RlLmVsO1xuICAgICAgaW5zdGFuY2UuYXN5bmNEZXAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCAwKTtcbiAgICAgIH0pLnRoZW4oKGFzeW5jU2V0dXBSZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKGluc3RhbmNlLmlzVW5tb3VudGVkIHx8IHN1c3BlbnNlLmlzVW5tb3VudGVkIHx8IHN1c3BlbnNlLnBlbmRpbmdJZCAhPT0gaW5zdGFuY2Uuc3VzcGVuc2VJZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZS5hc3luY1Jlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgeyB2bm9kZTogdm5vZGUyIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwdXNoV2FybmluZ0NvbnRleHQodm5vZGUyKTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVTZXR1cFJlc3VsdChpbnN0YW5jZSwgYXN5bmNTZXR1cFJlc3VsdCwgZmFsc2UpO1xuICAgICAgICBpZiAoaHlkcmF0ZWRFbCkge1xuICAgICAgICAgIHZub2RlMi5lbCA9IGh5ZHJhdGVkRWw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAhaHlkcmF0ZWRFbCAmJiBpbnN0YW5jZS5zdWJUcmVlLmVsO1xuICAgICAgICBzZXR1cFJlbmRlckVmZmVjdChcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICB2bm9kZTIsXG4gICAgICAgICAgLy8gY29tcG9uZW50IG1heSBoYXZlIGJlZW4gbW92ZWQgYmVmb3JlIHJlc29sdmUuXG4gICAgICAgICAgLy8gaWYgdGhpcyBpcyBub3QgYSBoeWRyYXRpb24sIGluc3RhbmNlLnN1YlRyZWUgd2lsbCBiZSB0aGUgY29tbWVudFxuICAgICAgICAgIC8vIHBsYWNlaG9sZGVyLlxuICAgICAgICAgIHBhcmVudE5vZGUoaHlkcmF0ZWRFbCB8fCBpbnN0YW5jZS5zdWJUcmVlLmVsKSxcbiAgICAgICAgICAvLyBhbmNob3Igd2lsbCBub3QgYmUgdXNlZCBpZiB0aGlzIGlzIGh5ZHJhdGlvbiwgc28gb25seSBuZWVkIHRvXG4gICAgICAgICAgLy8gY29uc2lkZXIgdGhlIGNvbW1lbnQgcGxhY2Vob2xkZXIgY2FzZS5cbiAgICAgICAgICBoeWRyYXRlZEVsID8gbnVsbCA6IG5leHQoaW5zdGFuY2Uuc3ViVHJlZSksXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBpZiAocGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICByZW1vdmUocGxhY2Vob2xkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUhPQ0hvc3RFbChpbnN0YW5jZSwgdm5vZGUyLmVsKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0luUGVuZGluZ1N1c3BlbnNlICYmIC0tc3VzcGVuc2UuZGVwcyA9PT0gMCkge1xuICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICB1bm1vdW50KHBhcmVudFN1c3BlbnNlMiwgZG9SZW1vdmUpIHtcbiAgICAgIHN1c3BlbnNlLmlzVW5tb3VudGVkID0gdHJ1ZTtcbiAgICAgIGlmIChzdXNwZW5zZS5hY3RpdmVCcmFuY2gpIHtcbiAgICAgICAgdW5tb3VudChcbiAgICAgICAgICBzdXNwZW5zZS5hY3RpdmVCcmFuY2gsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlMixcbiAgICAgICAgICBkb1JlbW92ZVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgICAgdW5tb3VudChcbiAgICAgICAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZTIsXG4gICAgICAgICAgZG9SZW1vdmVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBzdXNwZW5zZTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVTdXNwZW5zZShub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMsIGh5ZHJhdGVOb2RlKSB7XG4gIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2UgPSBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KFxuICAgIHZub2RlLFxuICAgIHBhcmVudFN1c3BlbnNlLFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBub2RlLnBhcmVudE5vZGUsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgbnVsbCxcbiAgICBuYW1lc3BhY2UsXG4gICAgc2xvdFNjb3BlSWRzLFxuICAgIG9wdGltaXplZCxcbiAgICByZW5kZXJlckludGVybmFscyxcbiAgICB0cnVlXG4gICk7XG4gIGNvbnN0IHJlc3VsdCA9IGh5ZHJhdGVOb2RlKFxuICAgIG5vZGUsXG4gICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IHZub2RlLnNzQ29udGVudCxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgc3VzcGVuc2UsXG4gICAgc2xvdFNjb3BlSWRzLFxuICAgIG9wdGltaXplZFxuICApO1xuICBpZiAoc3VzcGVuc2UuZGVwcyA9PT0gMCkge1xuICAgIHN1c3BlbnNlLnJlc29sdmUoZmFsc2UsIHRydWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBub3JtYWxpemVTdXNwZW5zZUNoaWxkcmVuKHZub2RlKSB7XG4gIGNvbnN0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiB9ID0gdm5vZGU7XG4gIGNvbnN0IGlzU2xvdENoaWxkcmVuID0gc2hhcGVGbGFnICYgMzI7XG4gIHZub2RlLnNzQ29udGVudCA9IG5vcm1hbGl6ZVN1c3BlbnNlU2xvdChcbiAgICBpc1Nsb3RDaGlsZHJlbiA/IGNoaWxkcmVuLmRlZmF1bHQgOiBjaGlsZHJlblxuICApO1xuICB2bm9kZS5zc0ZhbGxiYWNrID0gaXNTbG90Q2hpbGRyZW4gPyBub3JtYWxpemVTdXNwZW5zZVNsb3QoY2hpbGRyZW4uZmFsbGJhY2spIDogY3JlYXRlVk5vZGUoQ29tbWVudCk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVTdXNwZW5zZVNsb3Qocykge1xuICBsZXQgYmxvY2s7XG4gIGlmIChpc0Z1bmN0aW9uKHMpKSB7XG4gICAgY29uc3QgdHJhY2tCbG9jayA9IGlzQmxvY2tUcmVlRW5hYmxlZCAmJiBzLl9jO1xuICAgIGlmICh0cmFja0Jsb2NrKSB7XG4gICAgICBzLl9kID0gZmFsc2U7XG4gICAgICBvcGVuQmxvY2soKTtcbiAgICB9XG4gICAgcyA9IHMoKTtcbiAgICBpZiAodHJhY2tCbG9jaykge1xuICAgICAgcy5fZCA9IHRydWU7XG4gICAgICBibG9jayA9IGN1cnJlbnRCbG9jaztcbiAgICAgIGNsb3NlQmxvY2soKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQXJyYXkocykpIHtcbiAgICBjb25zdCBzaW5nbGVDaGlsZCA9IGZpbHRlclNpbmdsZVJvb3Qocyk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXNpbmdsZUNoaWxkICYmIHMuZmlsdGVyKChjaGlsZCkgPT4gY2hpbGQgIT09IE5VTExfRFlOQU1JQ19DT01QT05FTlQpLmxlbmd0aCA+IDApIHtcbiAgICAgIHdhcm4kMShgPFN1c3BlbnNlPiBzbG90cyBleHBlY3QgYSBzaW5nbGUgcm9vdCBub2RlLmApO1xuICAgIH1cbiAgICBzID0gc2luZ2xlQ2hpbGQ7XG4gIH1cbiAgcyA9IG5vcm1hbGl6ZVZOb2RlKHMpO1xuICBpZiAoYmxvY2sgJiYgIXMuZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgcy5keW5hbWljQ2hpbGRyZW4gPSBibG9jay5maWx0ZXIoKGMpID0+IGMgIT09IHMpO1xuICB9XG4gIHJldHVybiBzO1xufVxuZnVuY3Rpb24gcXVldWVFZmZlY3RXaXRoU3VzcGVuc2UoZm4sIHN1c3BlbnNlKSB7XG4gIGlmIChzdXNwZW5zZSAmJiBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgaWYgKGlzQXJyYXkoZm4pKSB7XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzLnB1c2goLi4uZm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzLnB1c2goZm4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBxdWV1ZVBvc3RGbHVzaENiKGZuKTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBicmFuY2gpIHtcbiAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoID0gYnJhbmNoO1xuICBjb25zdCB7IHZub2RlLCBwYXJlbnRDb21wb25lbnQgfSA9IHN1c3BlbnNlO1xuICBsZXQgZWwgPSBicmFuY2guZWw7XG4gIHdoaWxlICghZWwgJiYgYnJhbmNoLmNvbXBvbmVudCkge1xuICAgIGJyYW5jaCA9IGJyYW5jaC5jb21wb25lbnQuc3ViVHJlZTtcbiAgICBlbCA9IGJyYW5jaC5lbDtcbiAgfVxuICB2bm9kZS5lbCA9IGVsO1xuICBpZiAocGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudC5zdWJUcmVlID09PSB2bm9kZSkge1xuICAgIHBhcmVudENvbXBvbmVudC52bm9kZS5lbCA9IGVsO1xuICAgIHVwZGF0ZUhPQ0hvc3RFbChwYXJlbnRDb21wb25lbnQsIGVsKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNWTm9kZVN1c3BlbnNpYmxlKHZub2RlKSB7XG4gIHZhciBfYTtcbiAgcmV0dXJuICgoX2EgPSB2bm9kZS5wcm9wcykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnN1c3BlbnNpYmxlKSAhPSBudWxsICYmIHZub2RlLnByb3BzLnN1c3BlbnNpYmxlICE9PSBmYWxzZTtcbn1cblxuY29uc3Qgc3NyQ29udGV4dEtleSA9IFN5bWJvbC5mb3IoXCJ2LXNjeFwiKTtcbmNvbnN0IHVzZVNTUkNvbnRleHQgPSAoKSA9PiB7XG4gIHtcbiAgICBjb25zdCBjdHggPSBpbmplY3Qoc3NyQ29udGV4dEtleSk7XG4gICAgaWYgKCFjdHgpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKFxuICAgICAgICBgU2VydmVyIHJlbmRlcmluZyBjb250ZXh0IG5vdCBwcm92aWRlZC4gTWFrZSBzdXJlIHRvIG9ubHkgY2FsbCB1c2VTU1JDb250ZXh0KCkgY29uZGl0aW9uYWxseSBpbiB0aGUgc2VydmVyIGJ1aWxkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjdHg7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHdhdGNoRWZmZWN0KGVmZmVjdCwgb3B0aW9ucykge1xuICByZXR1cm4gZG9XYXRjaChlZmZlY3QsIG51bGwsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gd2F0Y2hQb3N0RWZmZWN0KGVmZmVjdCwgb3B0aW9ucykge1xuICByZXR1cm4gZG9XYXRjaChcbiAgICBlZmZlY3QsXG4gICAgbnVsbCxcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gZXh0ZW5kKHt9LCBvcHRpb25zLCB7IGZsdXNoOiBcInBvc3RcIiB9KSA6IHsgZmx1c2g6IFwicG9zdFwiIH1cbiAgKTtcbn1cbmZ1bmN0aW9uIHdhdGNoU3luY0VmZmVjdChlZmZlY3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRvV2F0Y2goXG4gICAgZWZmZWN0LFxuICAgIG51bGwsXG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGV4dGVuZCh7fSwgb3B0aW9ucywgeyBmbHVzaDogXCJzeW5jXCIgfSkgOiB7IGZsdXNoOiBcInN5bmNcIiB9XG4gICk7XG59XG5jb25zdCBJTklUSUFMX1dBVENIRVJfVkFMVUUgPSB7fTtcbmZ1bmN0aW9uIHdhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnMpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzRnVuY3Rpb24oY2IpKSB7XG4gICAgd2FybiQxKFxuICAgICAgYFxcYHdhdGNoKGZuLCBvcHRpb25zPylcXGAgc2lnbmF0dXJlIGhhcyBiZWVuIG1vdmVkIHRvIGEgc2VwYXJhdGUgQVBJLiBVc2UgXFxgd2F0Y2hFZmZlY3QoZm4sIG9wdGlvbnM/KVxcYCBpbnN0ZWFkLiBcXGB3YXRjaFxcYCBub3cgb25seSBzdXBwb3J0cyBcXGB3YXRjaChzb3VyY2UsIGNiLCBvcHRpb25zPykgc2lnbmF0dXJlLmBcbiAgICApO1xuICB9XG4gIHJldHVybiBkb1dhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gZG9XYXRjaChzb3VyY2UsIGNiLCB7XG4gIGltbWVkaWF0ZSxcbiAgZGVlcCxcbiAgZmx1c2gsXG4gIG9uY2UsXG4gIG9uVHJhY2ssXG4gIG9uVHJpZ2dlclxufSA9IEVNUFRZX09CSikge1xuICBpZiAoY2IgJiYgb25jZSkge1xuICAgIGNvbnN0IF9jYiA9IGNiO1xuICAgIGNiID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIF9jYiguLi5hcmdzKTtcbiAgICAgIHVud2F0Y2goKTtcbiAgICB9O1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGRlZXAgIT09IHZvaWQgMCAmJiB0eXBlb2YgZGVlcCA9PT0gXCJudW1iZXJcIikge1xuICAgIHdhcm4kMShcbiAgICAgIGB3YXRjaCgpIFwiZGVlcFwiIG9wdGlvbiB3aXRoIG51bWJlciB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgd2F0Y2ggZGVwdGggaW4gZnV0dXJlIHZlcnNpb25zLiBQbGVhc2UgdXNlIGEgYm9vbGVhbiBpbnN0ZWFkIHRvIGF2b2lkIHBvdGVudGlhbCBicmVha2FnZS5gXG4gICAgKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhY2IpIHtcbiAgICBpZiAoaW1tZWRpYXRlICE9PSB2b2lkIDApIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYHdhdGNoKCkgXCJpbW1lZGlhdGVcIiBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyB0aGUgd2F0Y2goc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucz8pIHNpZ25hdHVyZS5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZGVlcCAhPT0gdm9pZCAwKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGB3YXRjaCgpIFwiZGVlcFwiIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIHRoZSB3YXRjaChzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zPykgc2lnbmF0dXJlLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvbmNlICE9PSB2b2lkIDApIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYHdhdGNoKCkgXCJvbmNlXCIgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgdGhlIHdhdGNoKHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgd2FybkludmFsaWRTb3VyY2UgPSAocykgPT4ge1xuICAgIHdhcm4kMShcbiAgICAgIGBJbnZhbGlkIHdhdGNoIHNvdXJjZTogYCxcbiAgICAgIHMsXG4gICAgICBgQSB3YXRjaCBzb3VyY2UgY2FuIG9ubHkgYmUgYSBnZXR0ZXIvZWZmZWN0IGZ1bmN0aW9uLCBhIHJlZiwgYSByZWFjdGl2ZSBvYmplY3QsIG9yIGFuIGFycmF5IG9mIHRoZXNlIHR5cGVzLmBcbiAgICApO1xuICB9O1xuICBjb25zdCBpbnN0YW5jZSA9IGN1cnJlbnRJbnN0YW5jZTtcbiAgY29uc3QgcmVhY3RpdmVHZXR0ZXIgPSAoc291cmNlMikgPT4gZGVlcCA9PT0gdHJ1ZSA/IHNvdXJjZTIgOiAoXG4gICAgLy8gZm9yIGRlZXA6IGZhbHNlLCBvbmx5IHRyYXZlcnNlIHJvb3QtbGV2ZWwgcHJvcGVydGllc1xuICAgIHRyYXZlcnNlKHNvdXJjZTIsIGRlZXAgPT09IGZhbHNlID8gMSA6IHZvaWQgMClcbiAgKTtcbiAgbGV0IGdldHRlcjtcbiAgbGV0IGZvcmNlVHJpZ2dlciA9IGZhbHNlO1xuICBsZXQgaXNNdWx0aVNvdXJjZSA9IGZhbHNlO1xuICBpZiAoaXNSZWYoc291cmNlKSkge1xuICAgIGdldHRlciA9ICgpID0+IHNvdXJjZS52YWx1ZTtcbiAgICBmb3JjZVRyaWdnZXIgPSBpc1NoYWxsb3ckMShzb3VyY2UpO1xuICB9IGVsc2UgaWYgKGlzUmVhY3RpdmUoc291cmNlKSkge1xuICAgIGdldHRlciA9ICgpID0+IHJlYWN0aXZlR2V0dGVyKHNvdXJjZSk7XG4gICAgZm9yY2VUcmlnZ2VyID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHNvdXJjZSkpIHtcbiAgICBpc011bHRpU291cmNlID0gdHJ1ZTtcbiAgICBmb3JjZVRyaWdnZXIgPSBzb3VyY2Uuc29tZSgocykgPT4gaXNSZWFjdGl2ZShzKSB8fCBpc1NoYWxsb3ckMShzKSk7XG4gICAgZ2V0dGVyID0gKCkgPT4gc291cmNlLm1hcCgocykgPT4ge1xuICAgICAgaWYgKGlzUmVmKHMpKSB7XG4gICAgICAgIHJldHVybiBzLnZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChpc1JlYWN0aXZlKHMpKSB7XG4gICAgICAgIHJldHVybiByZWFjdGl2ZUdldHRlcihzKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihzKSkge1xuICAgICAgICByZXR1cm4gY2FsbFdpdGhFcnJvckhhbmRsaW5nKHMsIGluc3RhbmNlLCAyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybkludmFsaWRTb3VyY2Uocyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihzb3VyY2UpKSB7XG4gICAgaWYgKGNiKSB7XG4gICAgICBnZXR0ZXIgPSAoKSA9PiBjYWxsV2l0aEVycm9ySGFuZGxpbmcoc291cmNlLCBpbnN0YW5jZSwgMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgaWYgKGNsZWFudXApIHtcbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAzLFxuICAgICAgICAgIFtvbkNsZWFudXBdXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBnZXR0ZXIgPSBOT09QO1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybkludmFsaWRTb3VyY2Uoc291cmNlKTtcbiAgfVxuICBpZiAoY2IgJiYgZGVlcCkge1xuICAgIGNvbnN0IGJhc2VHZXR0ZXIgPSBnZXR0ZXI7XG4gICAgZ2V0dGVyID0gKCkgPT4gdHJhdmVyc2UoYmFzZUdldHRlcigpKTtcbiAgfVxuICBsZXQgY2xlYW51cDtcbiAgbGV0IG9uQ2xlYW51cCA9IChmbikgPT4ge1xuICAgIGNsZWFudXAgPSBlZmZlY3Qub25TdG9wID0gKCkgPT4ge1xuICAgICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgNCk7XG4gICAgICBjbGVhbnVwID0gZWZmZWN0Lm9uU3RvcCA9IHZvaWQgMDtcbiAgICB9O1xuICB9O1xuICBsZXQgc3NyQ2xlYW51cDtcbiAgaWYgKGlzSW5TU1JDb21wb25lbnRTZXR1cCkge1xuICAgIG9uQ2xlYW51cCA9IE5PT1A7XG4gICAgaWYgKCFjYikge1xuICAgICAgZ2V0dGVyKCk7XG4gICAgfSBlbHNlIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGNiLCBpbnN0YW5jZSwgMywgW1xuICAgICAgICBnZXR0ZXIoKSxcbiAgICAgICAgaXNNdWx0aVNvdXJjZSA/IFtdIDogdm9pZCAwLFxuICAgICAgICBvbkNsZWFudXBcbiAgICAgIF0pO1xuICAgIH1cbiAgICBpZiAoZmx1c2ggPT09IFwic3luY1wiKSB7XG4gICAgICBjb25zdCBjdHggPSB1c2VTU1JDb250ZXh0KCk7XG4gICAgICBzc3JDbGVhbnVwID0gY3R4Ll9fd2F0Y2hlckhhbmRsZXMgfHwgKGN0eC5fX3dhdGNoZXJIYW5kbGVzID0gW10pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gTk9PUDtcbiAgICB9XG4gIH1cbiAgbGV0IG9sZFZhbHVlID0gaXNNdWx0aVNvdXJjZSA/IG5ldyBBcnJheShzb3VyY2UubGVuZ3RoKS5maWxsKElOSVRJQUxfV0FUQ0hFUl9WQUxVRSkgOiBJTklUSUFMX1dBVENIRVJfVkFMVUU7XG4gIGNvbnN0IGpvYiA9ICgpID0+IHtcbiAgICBpZiAoIWVmZmVjdC5hY3RpdmUgfHwgIWVmZmVjdC5kaXJ0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY2IpIHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZWZmZWN0LnJ1bigpO1xuICAgICAgaWYgKGRlZXAgfHwgZm9yY2VUcmlnZ2VyIHx8IChpc011bHRpU291cmNlID8gbmV3VmFsdWUuc29tZSgodiwgaSkgPT4gaGFzQ2hhbmdlZCh2LCBvbGRWYWx1ZVtpXSkpIDogaGFzQ2hhbmdlZChuZXdWYWx1ZSwgb2xkVmFsdWUpKSB8fCBmYWxzZSkge1xuICAgICAgICBpZiAoY2xlYW51cCkge1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhjYiwgaW5zdGFuY2UsIDMsIFtcbiAgICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgICAvLyBwYXNzIHVuZGVmaW5lZCBhcyB0aGUgb2xkIHZhbHVlIHdoZW4gaXQncyBjaGFuZ2VkIGZvciB0aGUgZmlyc3QgdGltZVxuICAgICAgICAgIG9sZFZhbHVlID09PSBJTklUSUFMX1dBVENIRVJfVkFMVUUgPyB2b2lkIDAgOiBpc011bHRpU291cmNlICYmIG9sZFZhbHVlWzBdID09PSBJTklUSUFMX1dBVENIRVJfVkFMVUUgPyBbXSA6IG9sZFZhbHVlLFxuICAgICAgICAgIG9uQ2xlYW51cFxuICAgICAgICBdKTtcbiAgICAgICAgb2xkVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWZmZWN0LnJ1bigpO1xuICAgIH1cbiAgfTtcbiAgam9iLmFsbG93UmVjdXJzZSA9ICEhY2I7XG4gIGxldCBzY2hlZHVsZXI7XG4gIGlmIChmbHVzaCA9PT0gXCJzeW5jXCIpIHtcbiAgICBzY2hlZHVsZXIgPSBqb2I7XG4gIH0gZWxzZSBpZiAoZmx1c2ggPT09IFwicG9zdFwiKSB7XG4gICAgc2NoZWR1bGVyID0gKCkgPT4gcXVldWVQb3N0UmVuZGVyRWZmZWN0KGpvYiwgaW5zdGFuY2UgJiYgaW5zdGFuY2Uuc3VzcGVuc2UpO1xuICB9IGVsc2Uge1xuICAgIGpvYi5wcmUgPSB0cnVlO1xuICAgIGlmIChpbnN0YW5jZSlcbiAgICAgIGpvYi5pZCA9IGluc3RhbmNlLnVpZDtcbiAgICBzY2hlZHVsZXIgPSAoKSA9PiBxdWV1ZUpvYihqb2IpO1xuICB9XG4gIGNvbnN0IGVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChnZXR0ZXIsIE5PT1AsIHNjaGVkdWxlcik7XG4gIGNvbnN0IHNjb3BlID0gZ2V0Q3VycmVudFNjb3BlKCk7XG4gIGNvbnN0IHVud2F0Y2ggPSAoKSA9PiB7XG4gICAgZWZmZWN0LnN0b3AoKTtcbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgIHJlbW92ZShzY29wZS5lZmZlY3RzLCBlZmZlY3QpO1xuICAgIH1cbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBlZmZlY3Qub25UcmFjayA9IG9uVHJhY2s7XG4gICAgZWZmZWN0Lm9uVHJpZ2dlciA9IG9uVHJpZ2dlcjtcbiAgfVxuICBpZiAoY2IpIHtcbiAgICBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICBqb2IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2xkVmFsdWUgPSBlZmZlY3QucnVuKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGZsdXNoID09PSBcInBvc3RcIikge1xuICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChcbiAgICAgIGVmZmVjdC5ydW4uYmluZChlZmZlY3QpLFxuICAgICAgaW5zdGFuY2UgJiYgaW5zdGFuY2Uuc3VzcGVuc2VcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGVmZmVjdC5ydW4oKTtcbiAgfVxuICBpZiAoc3NyQ2xlYW51cClcbiAgICBzc3JDbGVhbnVwLnB1c2godW53YXRjaCk7XG4gIHJldHVybiB1bndhdGNoO1xufVxuZnVuY3Rpb24gaW5zdGFuY2VXYXRjaChzb3VyY2UsIHZhbHVlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHB1YmxpY1RoaXMgPSB0aGlzLnByb3h5O1xuICBjb25zdCBnZXR0ZXIgPSBpc1N0cmluZyhzb3VyY2UpID8gc291cmNlLmluY2x1ZGVzKFwiLlwiKSA/IGNyZWF0ZVBhdGhHZXR0ZXIocHVibGljVGhpcywgc291cmNlKSA6ICgpID0+IHB1YmxpY1RoaXNbc291cmNlXSA6IHNvdXJjZS5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpO1xuICBsZXQgY2I7XG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIGNiID0gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgY2IgPSB2YWx1ZS5oYW5kbGVyO1xuICAgIG9wdGlvbnMgPSB2YWx1ZTtcbiAgfVxuICBjb25zdCByZXNldCA9IHNldEN1cnJlbnRJbnN0YW5jZSh0aGlzKTtcbiAgY29uc3QgcmVzID0gZG9XYXRjaChnZXR0ZXIsIGNiLmJpbmQocHVibGljVGhpcyksIG9wdGlvbnMpO1xuICByZXNldCgpO1xuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gY3JlYXRlUGF0aEdldHRlcihjdHgsIHBhdGgpIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBsZXQgY3VyID0gY3R4O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoICYmIGN1cjsgaSsrKSB7XG4gICAgICBjdXIgPSBjdXJbc2VnbWVudHNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gY3VyO1xuICB9O1xufVxuZnVuY3Rpb24gdHJhdmVyc2UodmFsdWUsIGRlcHRoLCBjdXJyZW50RGVwdGggPSAwLCBzZWVuKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IHZhbHVlW1wiX192X3NraXBcIl0pIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGRlcHRoICYmIGRlcHRoID4gMCkge1xuICAgIGlmIChjdXJyZW50RGVwdGggPj0gZGVwdGgpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY3VycmVudERlcHRoKys7XG4gIH1cbiAgc2VlbiA9IHNlZW4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgaWYgKHNlZW4uaGFzKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBzZWVuLmFkZCh2YWx1ZSk7XG4gIGlmIChpc1JlZih2YWx1ZSkpIHtcbiAgICB0cmF2ZXJzZSh2YWx1ZS52YWx1ZSwgZGVwdGgsIGN1cnJlbnREZXB0aCwgc2Vlbik7XG4gIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0cmF2ZXJzZSh2YWx1ZVtpXSwgZGVwdGgsIGN1cnJlbnREZXB0aCwgc2Vlbik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU2V0KHZhbHVlKSB8fCBpc01hcCh2YWx1ZSkpIHtcbiAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICB0cmF2ZXJzZSh2LCBkZXB0aCwgY3VycmVudERlcHRoLCBzZWVuKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICB0cmF2ZXJzZSh2YWx1ZVtrZXldLCBkZXB0aCwgY3VycmVudERlcHRoLCBzZWVuKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZURpcmVjdGl2ZU5hbWUobmFtZSkge1xuICBpZiAoaXNCdWlsdEluRGlyZWN0aXZlKG5hbWUpKSB7XG4gICAgd2FybiQxKFwiRG8gbm90IHVzZSBidWlsdC1pbiBkaXJlY3RpdmUgaWRzIGFzIGN1c3RvbSBkaXJlY3RpdmUgaWQ6IFwiICsgbmFtZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdpdGhEaXJlY3RpdmVzKHZub2RlLCBkaXJlY3RpdmVzKSB7XG4gIGlmIChjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgPT09IG51bGwpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShgd2l0aERpcmVjdGl2ZXMgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgcmVuZGVyIGZ1bmN0aW9ucy5gKTtcbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbiAgY29uc3QgaW5zdGFuY2UgPSBnZXRFeHBvc2VQcm94eShjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UpIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5wcm94eTtcbiAgY29uc3QgYmluZGluZ3MgPSB2bm9kZS5kaXJzIHx8ICh2bm9kZS5kaXJzID0gW10pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpcmVjdGl2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgW2RpciwgdmFsdWUsIGFyZywgbW9kaWZpZXJzID0gRU1QVFlfT0JKXSA9IGRpcmVjdGl2ZXNbaV07XG4gICAgaWYgKGRpcikge1xuICAgICAgaWYgKGlzRnVuY3Rpb24oZGlyKSkge1xuICAgICAgICBkaXIgPSB7XG4gICAgICAgICAgbW91bnRlZDogZGlyLFxuICAgICAgICAgIHVwZGF0ZWQ6IGRpclxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGRpci5kZWVwKSB7XG4gICAgICAgIHRyYXZlcnNlKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGJpbmRpbmdzLnB1c2goe1xuICAgICAgICBkaXIsXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgb2xkVmFsdWU6IHZvaWQgMCxcbiAgICAgICAgYXJnLFxuICAgICAgICBtb2RpZmllcnNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdm5vZGU7XG59XG5mdW5jdGlvbiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBwcmV2Vk5vZGUsIGluc3RhbmNlLCBuYW1lKSB7XG4gIGNvbnN0IGJpbmRpbmdzID0gdm5vZGUuZGlycztcbiAgY29uc3Qgb2xkQmluZGluZ3MgPSBwcmV2Vk5vZGUgJiYgcHJldlZOb2RlLmRpcnM7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBiaW5kaW5nID0gYmluZGluZ3NbaV07XG4gICAgaWYgKG9sZEJpbmRpbmdzKSB7XG4gICAgICBiaW5kaW5nLm9sZFZhbHVlID0gb2xkQmluZGluZ3NbaV0udmFsdWU7XG4gICAgfVxuICAgIGxldCBob29rID0gYmluZGluZy5kaXJbbmFtZV07XG4gICAgaWYgKGhvb2spIHtcbiAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGhvb2ssIGluc3RhbmNlLCA4LCBbXG4gICAgICAgIHZub2RlLmVsLFxuICAgICAgICBiaW5kaW5nLFxuICAgICAgICB2bm9kZSxcbiAgICAgICAgcHJldlZOb2RlXG4gICAgICBdKTtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgbGVhdmVDYktleSA9IFN5bWJvbChcIl9sZWF2ZUNiXCIpO1xuY29uc3QgZW50ZXJDYktleSA9IFN5bWJvbChcIl9lbnRlckNiXCIpO1xuZnVuY3Rpb24gdXNlVHJhbnNpdGlvblN0YXRlKCkge1xuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBpc01vdW50ZWQ6IGZhbHNlLFxuICAgIGlzTGVhdmluZzogZmFsc2UsXG4gICAgaXNVbm1vdW50aW5nOiBmYWxzZSxcbiAgICBsZWF2aW5nVk5vZGVzOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpXG4gIH07XG4gIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgc3RhdGUuaXNNb3VudGVkID0gdHJ1ZTtcbiAgfSk7XG4gIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XG4gICAgc3RhdGUuaXNVbm1vdW50aW5nID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiBzdGF0ZTtcbn1cbmNvbnN0IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yID0gW0Z1bmN0aW9uLCBBcnJheV07XG5jb25zdCBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyA9IHtcbiAgbW9kZTogU3RyaW5nLFxuICBhcHBlYXI6IEJvb2xlYW4sXG4gIHBlcnNpc3RlZDogQm9vbGVhbixcbiAgLy8gZW50ZXJcbiAgb25CZWZvcmVFbnRlcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uRW50ZXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkFmdGVyRW50ZXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkVudGVyQ2FuY2VsbGVkOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgLy8gbGVhdmVcbiAgb25CZWZvcmVMZWF2ZTogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uTGVhdmU6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkFmdGVyTGVhdmU6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkxlYXZlQ2FuY2VsbGVkOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgLy8gYXBwZWFyXG4gIG9uQmVmb3JlQXBwZWFyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BcHBlYXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkFmdGVyQXBwZWFyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BcHBlYXJDYW5jZWxsZWQ6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yXG59O1xuY29uc3QgQmFzZVRyYW5zaXRpb25JbXBsID0ge1xuICBuYW1lOiBgQmFzZVRyYW5zaXRpb25gLFxuICBwcm9wczogQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMsXG4gIHNldHVwKHByb3BzLCB7IHNsb3RzIH0pIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IHN0YXRlID0gdXNlVHJhbnNpdGlvblN0YXRlKCk7XG4gICAgbGV0IHByZXZUcmFuc2l0aW9uS2V5O1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHNsb3RzLmRlZmF1bHQgJiYgZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKHNsb3RzLmRlZmF1bHQoKSwgdHJ1ZSk7XG4gICAgICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGNoaWxkID0gY2hpbGRyZW5bMF07XG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICBsZXQgaGFzRm91bmQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgaWYgKGMudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaGFzRm91bmQpIHtcbiAgICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICAgIFwiPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudCBvciBjb21wb25lbnQuIFVzZSA8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hpbGQgPSBjO1xuICAgICAgICAgICAgaGFzRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCEhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhd1Byb3BzID0gdG9SYXcocHJvcHMpO1xuICAgICAgY29uc3QgeyBtb2RlIH0gPSByYXdQcm9wcztcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG1vZGUgJiYgbW9kZSAhPT0gXCJpbi1vdXRcIiAmJiBtb2RlICE9PSBcIm91dC1pblwiICYmIG1vZGUgIT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgIHdhcm4kMShgaW52YWxpZCA8dHJhbnNpdGlvbj4gbW9kZTogJHttb2RlfWApO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmlzTGVhdmluZykge1xuICAgICAgICByZXR1cm4gZW1wdHlQbGFjZWhvbGRlcihjaGlsZCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpbm5lckNoaWxkID0gZ2V0S2VlcEFsaXZlQ2hpbGQoY2hpbGQpO1xuICAgICAgaWYgKCFpbm5lckNoaWxkKSB7XG4gICAgICAgIHJldHVybiBlbXB0eVBsYWNlaG9sZGVyKGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVudGVySG9va3MgPSByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICBpbm5lckNoaWxkLFxuICAgICAgICByYXdQcm9wcyxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGluc3RhbmNlXG4gICAgICApO1xuICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKGlubmVyQ2hpbGQsIGVudGVySG9va3MpO1xuICAgICAgY29uc3Qgb2xkQ2hpbGQgPSBpbnN0YW5jZS5zdWJUcmVlO1xuICAgICAgY29uc3Qgb2xkSW5uZXJDaGlsZCA9IG9sZENoaWxkICYmIGdldEtlZXBBbGl2ZUNoaWxkKG9sZENoaWxkKTtcbiAgICAgIGxldCB0cmFuc2l0aW9uS2V5Q2hhbmdlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgeyBnZXRUcmFuc2l0aW9uS2V5IH0gPSBpbm5lckNoaWxkLnR5cGU7XG4gICAgICBpZiAoZ2V0VHJhbnNpdGlvbktleSkge1xuICAgICAgICBjb25zdCBrZXkgPSBnZXRUcmFuc2l0aW9uS2V5KCk7XG4gICAgICAgIGlmIChwcmV2VHJhbnNpdGlvbktleSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgcHJldlRyYW5zaXRpb25LZXkgPSBrZXk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSBwcmV2VHJhbnNpdGlvbktleSkge1xuICAgICAgICAgIHByZXZUcmFuc2l0aW9uS2V5ID0ga2V5O1xuICAgICAgICAgIHRyYW5zaXRpb25LZXlDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9sZElubmVyQ2hpbGQgJiYgb2xkSW5uZXJDaGlsZC50eXBlICE9PSBDb21tZW50ICYmICghaXNTYW1lVk5vZGVUeXBlKGlubmVyQ2hpbGQsIG9sZElubmVyQ2hpbGQpIHx8IHRyYW5zaXRpb25LZXlDaGFuZ2VkKSkge1xuICAgICAgICBjb25zdCBsZWF2aW5nSG9va3MgPSByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgIG9sZElubmVyQ2hpbGQsXG4gICAgICAgICAgcmF3UHJvcHMsXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgKTtcbiAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKG9sZElubmVyQ2hpbGQsIGxlYXZpbmdIb29rcyk7XG4gICAgICAgIGlmIChtb2RlID09PSBcIm91dC1pblwiKSB7XG4gICAgICAgICAgc3RhdGUuaXNMZWF2aW5nID0gdHJ1ZTtcbiAgICAgICAgICBsZWF2aW5nSG9va3MuYWZ0ZXJMZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLmlzTGVhdmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlLnVwZGF0ZS5hY3RpdmUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIGluc3RhbmNlLmVmZmVjdC5kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICAgIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGVtcHR5UGxhY2Vob2xkZXIoY2hpbGQpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiaW4tb3V0XCIgJiYgaW5uZXJDaGlsZC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICAgICAgbGVhdmluZ0hvb2tzLmRlbGF5TGVhdmUgPSAoZWwsIGVhcmx5UmVtb3ZlLCBkZWxheWVkTGVhdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGdldExlYXZpbmdOb2Rlc0ZvclR5cGUoXG4gICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICBvbGRJbm5lckNoaWxkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGVhdmluZ1ZOb2Rlc0NhY2hlW1N0cmluZyhvbGRJbm5lckNoaWxkLmtleSldID0gb2xkSW5uZXJDaGlsZDtcbiAgICAgICAgICAgIGVsW2xlYXZlQ2JLZXldID0gKCkgPT4ge1xuICAgICAgICAgICAgICBlYXJseVJlbW92ZSgpO1xuICAgICAgICAgICAgICBlbFtsZWF2ZUNiS2V5XSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgZGVsZXRlIGVudGVySG9va3MuZGVsYXllZExlYXZlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGVudGVySG9va3MuZGVsYXllZExlYXZlID0gZGVsYXllZExlYXZlO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuICB9XG59O1xuY29uc3QgQmFzZVRyYW5zaXRpb24gPSBCYXNlVHJhbnNpdGlvbkltcGw7XG5mdW5jdGlvbiBnZXRMZWF2aW5nTm9kZXNGb3JUeXBlKHN0YXRlLCB2bm9kZSkge1xuICBjb25zdCB7IGxlYXZpbmdWTm9kZXMgfSA9IHN0YXRlO1xuICBsZXQgbGVhdmluZ1ZOb2Rlc0NhY2hlID0gbGVhdmluZ1ZOb2Rlcy5nZXQodm5vZGUudHlwZSk7XG4gIGlmICghbGVhdmluZ1ZOb2Rlc0NhY2hlKSB7XG4gICAgbGVhdmluZ1ZOb2Rlc0NhY2hlID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGVhdmluZ1ZOb2Rlcy5zZXQodm5vZGUudHlwZSwgbGVhdmluZ1ZOb2Rlc0NhY2hlKTtcbiAgfVxuICByZXR1cm4gbGVhdmluZ1ZOb2Rlc0NhY2hlO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyh2bm9kZSwgcHJvcHMsIHN0YXRlLCBpbnN0YW5jZSkge1xuICBjb25zdCB7XG4gICAgYXBwZWFyLFxuICAgIG1vZGUsXG4gICAgcGVyc2lzdGVkID0gZmFsc2UsXG4gICAgb25CZWZvcmVFbnRlcixcbiAgICBvbkVudGVyLFxuICAgIG9uQWZ0ZXJFbnRlcixcbiAgICBvbkVudGVyQ2FuY2VsbGVkLFxuICAgIG9uQmVmb3JlTGVhdmUsXG4gICAgb25MZWF2ZSxcbiAgICBvbkFmdGVyTGVhdmUsXG4gICAgb25MZWF2ZUNhbmNlbGxlZCxcbiAgICBvbkJlZm9yZUFwcGVhcixcbiAgICBvbkFwcGVhcixcbiAgICBvbkFmdGVyQXBwZWFyLFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qga2V5ID0gU3RyaW5nKHZub2RlLmtleSk7XG4gIGNvbnN0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGdldExlYXZpbmdOb2Rlc0ZvclR5cGUoc3RhdGUsIHZub2RlKTtcbiAgY29uc3QgY2FsbEhvb2sgPSAoaG9vaywgYXJncykgPT4ge1xuICAgIGhvb2sgJiYgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBob29rLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA5LFxuICAgICAgYXJnc1xuICAgICk7XG4gIH07XG4gIGNvbnN0IGNhbGxBc3luY0hvb2sgPSAoaG9vaywgYXJncykgPT4ge1xuICAgIGNvbnN0IGRvbmUgPSBhcmdzWzFdO1xuICAgIGNhbGxIb29rKGhvb2ssIGFyZ3MpO1xuICAgIGlmIChpc0FycmF5KGhvb2spKSB7XG4gICAgICBpZiAoaG9vay5ldmVyeSgoaG9vazIpID0+IGhvb2syLmxlbmd0aCA8PSAxKSlcbiAgICAgICAgZG9uZSgpO1xuICAgIH0gZWxzZSBpZiAoaG9vay5sZW5ndGggPD0gMSkge1xuICAgICAgZG9uZSgpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaG9va3MgPSB7XG4gICAgbW9kZSxcbiAgICBwZXJzaXN0ZWQsXG4gICAgYmVmb3JlRW50ZXIoZWwpIHtcbiAgICAgIGxldCBob29rID0gb25CZWZvcmVFbnRlcjtcbiAgICAgIGlmICghc3RhdGUuaXNNb3VudGVkKSB7XG4gICAgICAgIGlmIChhcHBlYXIpIHtcbiAgICAgICAgICBob29rID0gb25CZWZvcmVBcHBlYXIgfHwgb25CZWZvcmVFbnRlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlbFtsZWF2ZUNiS2V5XSkge1xuICAgICAgICBlbFtsZWF2ZUNiS2V5XShcbiAgICAgICAgICB0cnVlXG4gICAgICAgICAgLyogY2FuY2VsbGVkICovXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBsZWF2aW5nVk5vZGUgPSBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5XTtcbiAgICAgIGlmIChsZWF2aW5nVk5vZGUgJiYgaXNTYW1lVk5vZGVUeXBlKHZub2RlLCBsZWF2aW5nVk5vZGUpICYmIGxlYXZpbmdWTm9kZS5lbFtsZWF2ZUNiS2V5XSkge1xuICAgICAgICBsZWF2aW5nVk5vZGUuZWxbbGVhdmVDYktleV0oKTtcbiAgICAgIH1cbiAgICAgIGNhbGxIb29rKGhvb2ssIFtlbF0pO1xuICAgIH0sXG4gICAgZW50ZXIoZWwpIHtcbiAgICAgIGxldCBob29rID0gb25FbnRlcjtcbiAgICAgIGxldCBhZnRlckhvb2sgPSBvbkFmdGVyRW50ZXI7XG4gICAgICBsZXQgY2FuY2VsSG9vayA9IG9uRW50ZXJDYW5jZWxsZWQ7XG4gICAgICBpZiAoIXN0YXRlLmlzTW91bnRlZCkge1xuICAgICAgICBpZiAoYXBwZWFyKSB7XG4gICAgICAgICAgaG9vayA9IG9uQXBwZWFyIHx8IG9uRW50ZXI7XG4gICAgICAgICAgYWZ0ZXJIb29rID0gb25BZnRlckFwcGVhciB8fCBvbkFmdGVyRW50ZXI7XG4gICAgICAgICAgY2FuY2VsSG9vayA9IG9uQXBwZWFyQ2FuY2VsbGVkIHx8IG9uRW50ZXJDYW5jZWxsZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBkb25lID0gZWxbZW50ZXJDYktleV0gPSAoY2FuY2VsbGVkKSA9PiB7XG4gICAgICAgIGlmIChjYWxsZWQpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgY2FsbEhvb2soY2FuY2VsSG9vaywgW2VsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbEhvb2soYWZ0ZXJIb29rLCBbZWxdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaG9va3MuZGVsYXllZExlYXZlKSB7XG4gICAgICAgICAgaG9va3MuZGVsYXllZExlYXZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxbZW50ZXJDYktleV0gPSB2b2lkIDA7XG4gICAgICB9O1xuICAgICAgaWYgKGhvb2spIHtcbiAgICAgICAgY2FsbEFzeW5jSG9vayhob29rLCBbZWwsIGRvbmVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGxlYXZlKGVsLCByZW1vdmUpIHtcbiAgICAgIGNvbnN0IGtleTIgPSBTdHJpbmcodm5vZGUua2V5KTtcbiAgICAgIGlmIChlbFtlbnRlckNiS2V5XSkge1xuICAgICAgICBlbFtlbnRlckNiS2V5XShcbiAgICAgICAgICB0cnVlXG4gICAgICAgICAgLyogY2FuY2VsbGVkICovXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaXNVbm1vdW50aW5nKSB7XG4gICAgICAgIHJldHVybiByZW1vdmUoKTtcbiAgICAgIH1cbiAgICAgIGNhbGxIb29rKG9uQmVmb3JlTGVhdmUsIFtlbF0pO1xuICAgICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgZG9uZSA9IGVsW2xlYXZlQ2JLZXldID0gKGNhbmNlbGxlZCkgPT4ge1xuICAgICAgICBpZiAoY2FsbGVkKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgcmVtb3ZlKCk7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICBjYWxsSG9vayhvbkxlYXZlQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsSG9vayhvbkFmdGVyTGVhdmUsIFtlbF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsW2xlYXZlQ2JLZXldID0gdm9pZCAwO1xuICAgICAgICBpZiAobGVhdmluZ1ZOb2Rlc0NhY2hlW2tleTJdID09PSB2bm9kZSkge1xuICAgICAgICAgIGRlbGV0ZSBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5Ml07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5Ml0gPSB2bm9kZTtcbiAgICAgIGlmIChvbkxlYXZlKSB7XG4gICAgICAgIGNhbGxBc3luY0hvb2sob25MZWF2ZSwgW2VsLCBkb25lXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBjbG9uZSh2bm9kZTIpIHtcbiAgICAgIHJldHVybiByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKHZub2RlMiwgcHJvcHMsIHN0YXRlLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaG9va3M7XG59XG5mdW5jdGlvbiBlbXB0eVBsYWNlaG9sZGVyKHZub2RlKSB7XG4gIGlmIChpc0tlZXBBbGl2ZSh2bm9kZSkpIHtcbiAgICB2bm9kZSA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgIHZub2RlLmNoaWxkcmVuID0gbnVsbDtcbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEtlZXBBbGl2ZUNoaWxkKHZub2RlKSB7XG4gIHJldHVybiBpc0tlZXBBbGl2ZSh2bm9kZSkgPyAoXG4gICAgLy8gIzcxMjEgZW5zdXJlIGdldCB0aGUgY2hpbGQgY29tcG9uZW50IHN1YnRyZWUgaW4gY2FzZVxuICAgIC8vIGl0J3MgYmVlbiByZXBsYWNlZCBkdXJpbmcgSE1SXG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB2bm9kZS5jb21wb25lbnQgPyB2bm9kZS5jb21wb25lbnQuc3ViVHJlZSA6IHZub2RlLmNoaWxkcmVuID8gdm5vZGUuY2hpbGRyZW5bMF0gOiB2b2lkIDBcbiAgKSA6IHZub2RlO1xufVxuZnVuY3Rpb24gc2V0VHJhbnNpdGlvbkhvb2tzKHZub2RlLCBob29rcykge1xuICBpZiAodm5vZGUuc2hhcGVGbGFnICYgNiAmJiB2bm9kZS5jb21wb25lbnQpIHtcbiAgICBzZXRUcmFuc2l0aW9uSG9va3Modm5vZGUuY29tcG9uZW50LnN1YlRyZWUsIGhvb2tzKTtcbiAgfSBlbHNlIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICB2bm9kZS5zc0NvbnRlbnQudHJhbnNpdGlvbiA9IGhvb2tzLmNsb25lKHZub2RlLnNzQ29udGVudCk7XG4gICAgdm5vZGUuc3NGYWxsYmFjay50cmFuc2l0aW9uID0gaG9va3MuY2xvbmUodm5vZGUuc3NGYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgdm5vZGUudHJhbnNpdGlvbiA9IGhvb2tzO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4oY2hpbGRyZW4sIGtlZXBDb21tZW50ID0gZmFsc2UsIHBhcmVudEtleSkge1xuICBsZXQgcmV0ID0gW107XG4gIGxldCBrZXllZEZyYWdtZW50Q291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgY29uc3Qga2V5ID0gcGFyZW50S2V5ID09IG51bGwgPyBjaGlsZC5rZXkgOiBTdHJpbmcocGFyZW50S2V5KSArIFN0cmluZyhjaGlsZC5rZXkgIT0gbnVsbCA/IGNoaWxkLmtleSA6IGkpO1xuICAgIGlmIChjaGlsZC50eXBlID09PSBGcmFnbWVudCkge1xuICAgICAgaWYgKGNoaWxkLnBhdGNoRmxhZyAmIDEyOClcbiAgICAgICAga2V5ZWRGcmFnbWVudENvdW50Kys7XG4gICAgICByZXQgPSByZXQuY29uY2F0KFxuICAgICAgICBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4oY2hpbGQuY2hpbGRyZW4sIGtlZXBDb21tZW50LCBrZXkpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoa2VlcENvbW1lbnQgfHwgY2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgcmV0LnB1c2goa2V5ICE9IG51bGwgPyBjbG9uZVZOb2RlKGNoaWxkLCB7IGtleSB9KSA6IGNoaWxkKTtcbiAgICB9XG4gIH1cbiAgaWYgKGtleWVkRnJhZ21lbnRDb3VudCA+IDEpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJldC5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0W2ldLnBhdGNoRmxhZyA9IC0yO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKiEgI19fTk9fU0lERV9FRkZFQ1RTX18gKi9cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBkZWZpbmVDb21wb25lbnQob3B0aW9ucywgZXh0cmFPcHRpb25zKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKG9wdGlvbnMpID8gKFxuICAgIC8vICM4MzI2OiBleHRlbmQgY2FsbCBhbmQgb3B0aW9ucy5uYW1lIGFjY2VzcyBhcmUgY29uc2lkZXJlZCBzaWRlLWVmZmVjdHNcbiAgICAvLyBieSBSb2xsdXAsIHNvIHdlIGhhdmUgdG8gd3JhcCBpdCBpbiBhIHB1cmUtYW5ub3RhdGVkIElJRkUuXG4gICAgLyogQF9fUFVSRV9fICovICgoKSA9PiBleHRlbmQoeyBuYW1lOiBvcHRpb25zLm5hbWUgfSwgZXh0cmFPcHRpb25zLCB7IHNldHVwOiBvcHRpb25zIH0pKSgpXG4gICkgOiBvcHRpb25zO1xufVxuXG5jb25zdCBpc0FzeW5jV3JhcHBlciA9IChpKSA9PiAhIWkudHlwZS5fX2FzeW5jTG9hZGVyO1xuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gZGVmaW5lQXN5bmNDb21wb25lbnQoc291cmNlKSB7XG4gIGlmIChpc0Z1bmN0aW9uKHNvdXJjZSkpIHtcbiAgICBzb3VyY2UgPSB7IGxvYWRlcjogc291cmNlIH07XG4gIH1cbiAgY29uc3Qge1xuICAgIGxvYWRlcixcbiAgICBsb2FkaW5nQ29tcG9uZW50LFxuICAgIGVycm9yQ29tcG9uZW50LFxuICAgIGRlbGF5ID0gMjAwLFxuICAgIHRpbWVvdXQsXG4gICAgLy8gdW5kZWZpbmVkID0gbmV2ZXIgdGltZXMgb3V0XG4gICAgc3VzcGVuc2libGUgPSB0cnVlLFxuICAgIG9uRXJyb3I6IHVzZXJPbkVycm9yXG4gIH0gPSBzb3VyY2U7XG4gIGxldCBwZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gIGxldCByZXNvbHZlZENvbXA7XG4gIGxldCByZXRyaWVzID0gMDtcbiAgY29uc3QgcmV0cnkgPSAoKSA9PiB7XG4gICAgcmV0cmllcysrO1xuICAgIHBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICByZXR1cm4gbG9hZCgpO1xuICB9O1xuICBjb25zdCBsb2FkID0gKCkgPT4ge1xuICAgIGxldCB0aGlzUmVxdWVzdDtcbiAgICByZXR1cm4gcGVuZGluZ1JlcXVlc3QgfHwgKHRoaXNSZXF1ZXN0ID0gcGVuZGluZ1JlcXVlc3QgPSBsb2FkZXIoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBlcnIgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyKSk7XG4gICAgICBpZiAodXNlck9uRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCB1c2VyUmV0cnkgPSAoKSA9PiByZXNvbHZlKHJldHJ5KCkpO1xuICAgICAgICAgIGNvbnN0IHVzZXJGYWlsID0gKCkgPT4gcmVqZWN0KGVycik7XG4gICAgICAgICAgdXNlck9uRXJyb3IoZXJyLCB1c2VyUmV0cnksIHVzZXJGYWlsLCByZXRyaWVzICsgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0pLnRoZW4oKGNvbXApID0+IHtcbiAgICAgIGlmICh0aGlzUmVxdWVzdCAhPT0gcGVuZGluZ1JlcXVlc3QgJiYgcGVuZGluZ1JlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZXF1ZXN0O1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWNvbXApIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBBc3luYyBjb21wb25lbnQgbG9hZGVyIHJlc29sdmVkIHRvIHVuZGVmaW5lZC4gSWYgeW91IGFyZSB1c2luZyByZXRyeSgpLCBtYWtlIHN1cmUgdG8gcmV0dXJuIGl0cyByZXR1cm4gdmFsdWUuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGNvbXAgJiYgKGNvbXAuX19lc01vZHVsZSB8fCBjb21wW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09IFwiTW9kdWxlXCIpKSB7XG4gICAgICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjb21wICYmICFpc09iamVjdChjb21wKSAmJiAhaXNGdW5jdGlvbihjb21wKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXN5bmMgY29tcG9uZW50IGxvYWQgcmVzdWx0OiAke2NvbXB9YCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlZENvbXAgPSBjb21wO1xuICAgICAgcmV0dXJuIGNvbXA7XG4gICAgfSkpO1xuICB9O1xuICByZXR1cm4gZGVmaW5lQ29tcG9uZW50KHtcbiAgICBuYW1lOiBcIkFzeW5jQ29tcG9uZW50V3JhcHBlclwiLFxuICAgIF9fYXN5bmNMb2FkZXI6IGxvYWQsXG4gICAgZ2V0IF9fYXN5bmNSZXNvbHZlZCgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZENvbXA7XG4gICAgfSxcbiAgICBzZXR1cCgpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gY3VycmVudEluc3RhbmNlO1xuICAgICAgaWYgKHJlc29sdmVkQ29tcCkge1xuICAgICAgICByZXR1cm4gKCkgPT4gY3JlYXRlSW5uZXJDb21wKHJlc29sdmVkQ29tcCwgaW5zdGFuY2UpO1xuICAgICAgfVxuICAgICAgY29uc3Qgb25FcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgcGVuZGluZ1JlcXVlc3QgPSBudWxsO1xuICAgICAgICBoYW5kbGVFcnJvcihcbiAgICAgICAgICBlcnIsXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgMTMsXG4gICAgICAgICAgIWVycm9yQ29tcG9uZW50XG4gICAgICAgICk7XG4gICAgICB9O1xuICAgICAgaWYgKHN1c3BlbnNpYmxlICYmIGluc3RhbmNlLnN1c3BlbnNlIHx8IGlzSW5TU1JDb21wb25lbnRTZXR1cCkge1xuICAgICAgICByZXR1cm4gbG9hZCgpLnRoZW4oKGNvbXApID0+IHtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gY3JlYXRlSW5uZXJDb21wKGNvbXAsIGluc3RhbmNlKTtcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gZXJyb3JDb21wb25lbnQgPyBjcmVhdGVWTm9kZShlcnJvckNvbXBvbmVudCwge1xuICAgICAgICAgICAgZXJyb3I6IGVyclxuICAgICAgICAgIH0pIDogbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBsb2FkZWQgPSByZWYoZmFsc2UpO1xuICAgICAgY29uc3QgZXJyb3IgPSByZWYoKTtcbiAgICAgIGNvbnN0IGRlbGF5ZWQgPSByZWYoISFkZWxheSk7XG4gICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgZGVsYXllZC52YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgICB9XG4gICAgICBpZiAodGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICghbG9hZGVkLnZhbHVlICYmICFlcnJvci52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQXN5bmMgY29tcG9uZW50IHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9bXMuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgICAgICAgIGVycm9yLnZhbHVlID0gZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICB9XG4gICAgICBsb2FkKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGxvYWRlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgIGlmIChpbnN0YW5jZS5wYXJlbnQgJiYgaXNLZWVwQWxpdmUoaW5zdGFuY2UucGFyZW50LnZub2RlKSkge1xuICAgICAgICAgIGluc3RhbmNlLnBhcmVudC5lZmZlY3QuZGlydHkgPSB0cnVlO1xuICAgICAgICAgIHF1ZXVlSm9iKGluc3RhbmNlLnBhcmVudC51cGRhdGUpO1xuICAgICAgICB9XG4gICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgICAgZXJyb3IudmFsdWUgPSBlcnI7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChsb2FkZWQudmFsdWUgJiYgcmVzb2x2ZWRDb21wKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUlubmVyQ29tcChyZXNvbHZlZENvbXAsIGluc3RhbmNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvci52YWx1ZSAmJiBlcnJvckNvbXBvbmVudCkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVWTm9kZShlcnJvckNvbXBvbmVudCwge1xuICAgICAgICAgICAgZXJyb3I6IGVycm9yLnZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAobG9hZGluZ0NvbXBvbmVudCAmJiAhZGVsYXllZC52YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVWTm9kZShsb2FkaW5nQ29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlSW5uZXJDb21wKGNvbXAsIHBhcmVudCkge1xuICBjb25zdCB7IHJlZjogcmVmMiwgcHJvcHMsIGNoaWxkcmVuLCBjZSB9ID0gcGFyZW50LnZub2RlO1xuICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKGNvbXAsIHByb3BzLCBjaGlsZHJlbik7XG4gIHZub2RlLnJlZiA9IHJlZjI7XG4gIHZub2RlLmNlID0gY2U7XG4gIGRlbGV0ZSBwYXJlbnQudm5vZGUuY2U7XG4gIHJldHVybiB2bm9kZTtcbn1cblxuY29uc3QgaXNLZWVwQWxpdmUgPSAodm5vZGUpID0+IHZub2RlLnR5cGUuX19pc0tlZXBBbGl2ZTtcbmNvbnN0IEtlZXBBbGl2ZUltcGwgPSB7XG4gIG5hbWU6IGBLZWVwQWxpdmVgLFxuICAvLyBNYXJrZXIgZm9yIHNwZWNpYWwgaGFuZGxpbmcgaW5zaWRlIHRoZSByZW5kZXJlci4gV2UgYXJlIG5vdCB1c2luZyBhID09PVxuICAvLyBjaGVjayBkaXJlY3RseSBvbiBLZWVwQWxpdmUgaW4gdGhlIHJlbmRlcmVyLCBiZWNhdXNlIGltcG9ydGluZyBpdCBkaXJlY3RseVxuICAvLyB3b3VsZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgdHJlZS1zaGFrZW4uXG4gIF9faXNLZWVwQWxpdmU6IHRydWUsXG4gIHByb3BzOiB7XG4gICAgaW5jbHVkZTogW1N0cmluZywgUmVnRXhwLCBBcnJheV0sXG4gICAgZXhjbHVkZTogW1N0cmluZywgUmVnRXhwLCBBcnJheV0sXG4gICAgbWF4OiBbU3RyaW5nLCBOdW1iZXJdXG4gIH0sXG4gIHNldHVwKHByb3BzLCB7IHNsb3RzIH0pIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IHNoYXJlZENvbnRleHQgPSBpbnN0YW5jZS5jdHg7XG4gICAgaWYgKCFzaGFyZWRDb250ZXh0LnJlbmRlcmVyKSB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHNsb3RzLmRlZmF1bHQgJiYgc2xvdHMuZGVmYXVsdCgpO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID09PSAxID8gY2hpbGRyZW5bMF0gOiBjaGlsZHJlbjtcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICBjb25zdCBrZXlzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICBsZXQgY3VycmVudCA9IG51bGw7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBpbnN0YW5jZS5fX3ZfY2FjaGUgPSBjYWNoZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50U3VzcGVuc2UgPSBpbnN0YW5jZS5zdXNwZW5zZTtcbiAgICBjb25zdCB7XG4gICAgICByZW5kZXJlcjoge1xuICAgICAgICBwOiBwYXRjaCxcbiAgICAgICAgbTogbW92ZSxcbiAgICAgICAgdW06IF91bm1vdW50LFxuICAgICAgICBvOiB7IGNyZWF0ZUVsZW1lbnQgfVxuICAgICAgfVxuICAgIH0gPSBzaGFyZWRDb250ZXh0O1xuICAgIGNvbnN0IHN0b3JhZ2VDb250YWluZXIgPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHNoYXJlZENvbnRleHQuYWN0aXZhdGUgPSAodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBuYW1lc3BhY2UsIG9wdGltaXplZCkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UyID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgbW92ZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIDAsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIHBhdGNoKFxuICAgICAgICBpbnN0YW5jZTIudm5vZGUsXG4gICAgICAgIHZub2RlLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgaW5zdGFuY2UyLFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICB2bm9kZS5zbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGluc3RhbmNlMi5pc0RlYWN0aXZhdGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChpbnN0YW5jZTIuYSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGluc3RhbmNlMi5hKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2bm9kZUhvb2sgPSB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy5vblZub2RlTW91bnRlZDtcbiAgICAgICAgaWYgKHZub2RlSG9vaykge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIGluc3RhbmNlMi5wYXJlbnQsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UyKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHNoYXJlZENvbnRleHQuZGVhY3RpdmF0ZSA9ICh2bm9kZSkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UyID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgbW92ZSh2bm9kZSwgc3RvcmFnZUNvbnRhaW5lciwgbnVsbCwgMSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGluc3RhbmNlMi5kYSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGluc3RhbmNlMi5kYSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgdm5vZGVIb29rID0gdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMub25Wbm9kZVVubW91bnRlZDtcbiAgICAgICAgaWYgKHZub2RlSG9vaykge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIGluc3RhbmNlMi5wYXJlbnQsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZTIuaXNEZWFjdGl2YXRlZCA9IHRydWU7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgZGV2dG9vbHNDb21wb25lbnRBZGRlZChpbnN0YW5jZTIpO1xuICAgICAgfVxuICAgIH07XG4gICAgZnVuY3Rpb24gdW5tb3VudCh2bm9kZSkge1xuICAgICAgcmVzZXRTaGFwZUZsYWcodm5vZGUpO1xuICAgICAgX3VubW91bnQodm5vZGUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBydW5lQ2FjaGUoZmlsdGVyKSB7XG4gICAgICBjYWNoZS5mb3JFYWNoKCh2bm9kZSwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBnZXRDb21wb25lbnROYW1lKHZub2RlLnR5cGUpO1xuICAgICAgICBpZiAobmFtZSAmJiAoIWZpbHRlciB8fCAhZmlsdGVyKG5hbWUpKSkge1xuICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShrZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJ1bmVDYWNoZUVudHJ5KGtleSkge1xuICAgICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGtleSk7XG4gICAgICBpZiAoIWN1cnJlbnQgfHwgIWlzU2FtZVZOb2RlVHlwZShjYWNoZWQsIGN1cnJlbnQpKSB7XG4gICAgICAgIHVubW91bnQoY2FjaGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudCkge1xuICAgICAgICByZXNldFNoYXBlRmxhZyhjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAga2V5cy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgd2F0Y2goXG4gICAgICAoKSA9PiBbcHJvcHMuaW5jbHVkZSwgcHJvcHMuZXhjbHVkZV0sXG4gICAgICAoW2luY2x1ZGUsIGV4Y2x1ZGVdKSA9PiB7XG4gICAgICAgIGluY2x1ZGUgJiYgcHJ1bmVDYWNoZSgobmFtZSkgPT4gbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSk7XG4gICAgICAgIGV4Y2x1ZGUgJiYgcHJ1bmVDYWNoZSgobmFtZSkgPT4gIW1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpO1xuICAgICAgfSxcbiAgICAgIC8vIHBydW5lIHBvc3QtcmVuZGVyIGFmdGVyIGBjdXJyZW50YCBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICB7IGZsdXNoOiBcInBvc3RcIiwgZGVlcDogdHJ1ZSB9XG4gICAgKTtcbiAgICBsZXQgcGVuZGluZ0NhY2hlS2V5ID0gbnVsbDtcbiAgICBjb25zdCBjYWNoZVN1YnRyZWUgPSAoKSA9PiB7XG4gICAgICBpZiAocGVuZGluZ0NhY2hlS2V5ICE9IG51bGwpIHtcbiAgICAgICAgY2FjaGUuc2V0KHBlbmRpbmdDYWNoZUtleSwgZ2V0SW5uZXJDaGlsZChpbnN0YW5jZS5zdWJUcmVlKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBvbk1vdW50ZWQoY2FjaGVTdWJ0cmVlKTtcbiAgICBvblVwZGF0ZWQoY2FjaGVTdWJ0cmVlKTtcbiAgICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgICAgY2FjaGUuZm9yRWFjaCgoY2FjaGVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3ViVHJlZSwgc3VzcGVuc2UgfSA9IGluc3RhbmNlO1xuICAgICAgICBjb25zdCB2bm9kZSA9IGdldElubmVyQ2hpbGQoc3ViVHJlZSk7XG4gICAgICAgIGlmIChjYWNoZWQudHlwZSA9PT0gdm5vZGUudHlwZSAmJiBjYWNoZWQua2V5ID09PSB2bm9kZS5rZXkpIHtcbiAgICAgICAgICByZXNldFNoYXBlRmxhZyh2bm9kZSk7XG4gICAgICAgICAgY29uc3QgZGEgPSB2bm9kZS5jb21wb25lbnQuZGE7XG4gICAgICAgICAgZGEgJiYgcXVldWVQb3N0UmVuZGVyRWZmZWN0KGRhLCBzdXNwZW5zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHVubW91bnQoY2FjaGVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBwZW5kaW5nQ2FjaGVLZXkgPSBudWxsO1xuICAgICAgaWYgKCFzbG90cy5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0KCk7XG4gICAgICBjb25zdCByYXdWTm9kZSA9IGNoaWxkcmVuWzBdO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoYEtlZXBBbGl2ZSBzaG91bGQgY29udGFpbiBleGFjdGx5IG9uZSBjb21wb25lbnQgY2hpbGQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IG51bGw7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgIH0gZWxzZSBpZiAoIWlzVk5vZGUocmF3Vk5vZGUpIHx8ICEocmF3Vk5vZGUuc2hhcGVGbGFnICYgNCkgJiYgIShyYXdWTm9kZS5zaGFwZUZsYWcgJiAxMjgpKSB7XG4gICAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgICByZXR1cm4gcmF3Vk5vZGU7XG4gICAgICB9XG4gICAgICBsZXQgdm5vZGUgPSBnZXRJbm5lckNoaWxkKHJhd1ZOb2RlKTtcbiAgICAgIGNvbnN0IGNvbXAgPSB2bm9kZS50eXBlO1xuICAgICAgY29uc3QgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoXG4gICAgICAgIGlzQXN5bmNXcmFwcGVyKHZub2RlKSA/IHZub2RlLnR5cGUuX19hc3luY1Jlc29sdmVkIHx8IHt9IDogY29tcFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgaW5jbHVkZSwgZXhjbHVkZSwgbWF4IH0gPSBwcm9wcztcbiAgICAgIGlmIChpbmNsdWRlICYmICghbmFtZSB8fCAhbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSkgfHwgZXhjbHVkZSAmJiBuYW1lICYmIG1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpIHtcbiAgICAgICAgY3VycmVudCA9IHZub2RlO1xuICAgICAgICByZXR1cm4gcmF3Vk5vZGU7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSB2bm9kZS5rZXkgPT0gbnVsbCA/IGNvbXAgOiB2bm9kZS5rZXk7XG4gICAgICBjb25zdCBjYWNoZWRWTm9kZSA9IGNhY2hlLmdldChrZXkpO1xuICAgICAgaWYgKHZub2RlLmVsKSB7XG4gICAgICAgIHZub2RlID0gY2xvbmVWTm9kZSh2bm9kZSk7XG4gICAgICAgIGlmIChyYXdWTm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgICAgICByYXdWTm9kZS5zc0NvbnRlbnQgPSB2bm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGVuZGluZ0NhY2hlS2V5ID0ga2V5O1xuICAgICAgaWYgKGNhY2hlZFZOb2RlKSB7XG4gICAgICAgIHZub2RlLmVsID0gY2FjaGVkVk5vZGUuZWw7XG4gICAgICAgIHZub2RlLmNvbXBvbmVudCA9IGNhY2hlZFZOb2RlLmNvbXBvbmVudDtcbiAgICAgICAgaWYgKHZub2RlLnRyYW5zaXRpb24pIHtcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uSG9va3Modm5vZGUsIHZub2RlLnRyYW5zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHZub2RlLnNoYXBlRmxhZyB8PSA1MTI7XG4gICAgICAgIGtleXMuZGVsZXRlKGtleSk7XG4gICAgICAgIGtleXMuYWRkKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzLmFkZChrZXkpO1xuICAgICAgICBpZiAobWF4ICYmIGtleXMuc2l6ZSA+IHBhcnNlSW50KG1heCwgMTApKSB7XG4gICAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGtleXMudmFsdWVzKCkubmV4dCgpLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdm5vZGUuc2hhcGVGbGFnIHw9IDI1NjtcbiAgICAgIGN1cnJlbnQgPSB2bm9kZTtcbiAgICAgIHJldHVybiBpc1N1c3BlbnNlKHJhd1ZOb2RlLnR5cGUpID8gcmF3Vk5vZGUgOiB2bm9kZTtcbiAgICB9O1xuICB9XG59O1xuY29uc3QgS2VlcEFsaXZlID0gS2VlcEFsaXZlSW1wbDtcbmZ1bmN0aW9uIG1hdGNoZXMocGF0dGVybiwgbmFtZSkge1xuICBpZiAoaXNBcnJheShwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnNvbWUoKHApID0+IG1hdGNoZXMocCwgbmFtZSkpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nKHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoXCIsXCIpLmluY2x1ZGVzKG5hbWUpO1xuICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4udGVzdChuYW1lKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBvbkFjdGl2YXRlZChob29rLCB0YXJnZXQpIHtcbiAgcmVnaXN0ZXJLZWVwQWxpdmVIb29rKGhvb2ssIFwiYVwiLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gb25EZWFjdGl2YXRlZChob29rLCB0YXJnZXQpIHtcbiAgcmVnaXN0ZXJLZWVwQWxpdmVIb29rKGhvb2ssIFwiZGFcIiwgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyS2VlcEFsaXZlSG9vayhob29rLCB0eXBlLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UpIHtcbiAgY29uc3Qgd3JhcHBlZEhvb2sgPSBob29rLl9fd2RjIHx8IChob29rLl9fd2RjID0gKCkgPT4ge1xuICAgIGxldCBjdXJyZW50ID0gdGFyZ2V0O1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBpZiAoY3VycmVudC5pc0RlYWN0aXZhdGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIGhvb2soKTtcbiAgfSk7XG4gIGluamVjdEhvb2sodHlwZSwgd3JhcHBlZEhvb2ssIHRhcmdldCk7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBsZXQgY3VycmVudCA9IHRhcmdldC5wYXJlbnQ7XG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudC5wYXJlbnQpIHtcbiAgICAgIGlmIChpc0tlZXBBbGl2ZShjdXJyZW50LnBhcmVudC52bm9kZSkpIHtcbiAgICAgICAgaW5qZWN0VG9LZWVwQWxpdmVSb290KHdyYXBwZWRIb29rLCB0eXBlLCB0YXJnZXQsIGN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gaW5qZWN0VG9LZWVwQWxpdmVSb290KGhvb2ssIHR5cGUsIHRhcmdldCwga2VlcEFsaXZlUm9vdCkge1xuICBjb25zdCBpbmplY3RlZCA9IGluamVjdEhvb2soXG4gICAgdHlwZSxcbiAgICBob29rLFxuICAgIGtlZXBBbGl2ZVJvb3QsXG4gICAgdHJ1ZVxuICAgIC8qIHByZXBlbmQgKi9cbiAgKTtcbiAgb25Vbm1vdW50ZWQoKCkgPT4ge1xuICAgIHJlbW92ZShrZWVwQWxpdmVSb290W3R5cGVdLCBpbmplY3RlZCk7XG4gIH0sIHRhcmdldCk7XG59XG5mdW5jdGlvbiByZXNldFNoYXBlRmxhZyh2bm9kZSkge1xuICB2bm9kZS5zaGFwZUZsYWcgJj0gfjI1NjtcbiAgdm5vZGUuc2hhcGVGbGFnICY9IH41MTI7XG59XG5mdW5jdGlvbiBnZXRJbm5lckNoaWxkKHZub2RlKSB7XG4gIHJldHVybiB2bm9kZS5zaGFwZUZsYWcgJiAxMjggPyB2bm9kZS5zc0NvbnRlbnQgOiB2bm9kZTtcbn1cblxuZnVuY3Rpb24gaW5qZWN0SG9vayh0eXBlLCBob29rLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UsIHByZXBlbmQgPSBmYWxzZSkge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgY29uc3QgaG9va3MgPSB0YXJnZXRbdHlwZV0gfHwgKHRhcmdldFt0eXBlXSA9IFtdKTtcbiAgICBjb25zdCB3cmFwcGVkSG9vayA9IGhvb2suX193ZWggfHwgKGhvb2suX193ZWggPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKHRhcmdldC5pc1VubW91bnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBjb25zdCByZXNldCA9IHNldEN1cnJlbnRJbnN0YW5jZSh0YXJnZXQpO1xuICAgICAgY29uc3QgcmVzID0gY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoaG9vaywgdGFyZ2V0LCB0eXBlLCBhcmdzKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICAgIGlmIChwcmVwZW5kKSB7XG4gICAgICBob29rcy51bnNoaWZ0KHdyYXBwZWRIb29rKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va3MucHVzaCh3cmFwcGVkSG9vayk7XG4gICAgfVxuICAgIHJldHVybiB3cmFwcGVkSG9vaztcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgYXBpTmFtZSA9IHRvSGFuZGxlcktleShFcnJvclR5cGVTdHJpbmdzJDFbdHlwZV0ucmVwbGFjZSgvIGhvb2skLywgXCJcIikpO1xuICAgIHdhcm4kMShcbiAgICAgIGAke2FwaU5hbWV9IGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYmUgYXNzb2NpYXRlZCB3aXRoLiBMaWZlY3ljbGUgaW5qZWN0aW9uIEFQSXMgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgZXhlY3V0aW9uIG9mIHNldHVwKCkuYCArIChgIElmIHlvdSBhcmUgdXNpbmcgYXN5bmMgc2V0dXAoKSwgbWFrZSBzdXJlIHRvIHJlZ2lzdGVyIGxpZmVjeWNsZSBob29rcyBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0IHN0YXRlbWVudC5gIClcbiAgICApO1xuICB9XG59XG5jb25zdCBjcmVhdGVIb29rID0gKGxpZmVjeWNsZSkgPT4gKGhvb2ssIHRhcmdldCA9IGN1cnJlbnRJbnN0YW5jZSkgPT4gKFxuICAvLyBwb3N0LWNyZWF0ZSBsaWZlY3ljbGUgcmVnaXN0cmF0aW9ucyBhcmUgbm9vcHMgZHVyaW5nIFNTUiAoZXhjZXB0IGZvciBzZXJ2ZXJQcmVmZXRjaClcbiAgKCFpc0luU1NSQ29tcG9uZW50U2V0dXAgfHwgbGlmZWN5Y2xlID09PSBcInNwXCIpICYmIGluamVjdEhvb2sobGlmZWN5Y2xlLCAoLi4uYXJncykgPT4gaG9vayguLi5hcmdzKSwgdGFyZ2V0KVxuKTtcbmNvbnN0IG9uQmVmb3JlTW91bnQgPSBjcmVhdGVIb29rKFwiYm1cIik7XG5jb25zdCBvbk1vdW50ZWQgPSBjcmVhdGVIb29rKFwibVwiKTtcbmNvbnN0IG9uQmVmb3JlVXBkYXRlID0gY3JlYXRlSG9vayhcImJ1XCIpO1xuY29uc3Qgb25VcGRhdGVkID0gY3JlYXRlSG9vayhcInVcIik7XG5jb25zdCBvbkJlZm9yZVVubW91bnQgPSBjcmVhdGVIb29rKFwiYnVtXCIpO1xuY29uc3Qgb25Vbm1vdW50ZWQgPSBjcmVhdGVIb29rKFwidW1cIik7XG5jb25zdCBvblNlcnZlclByZWZldGNoID0gY3JlYXRlSG9vayhcInNwXCIpO1xuY29uc3Qgb25SZW5kZXJUcmlnZ2VyZWQgPSBjcmVhdGVIb29rKFxuICBcInJ0Z1wiXG4pO1xuY29uc3Qgb25SZW5kZXJUcmFja2VkID0gY3JlYXRlSG9vayhcbiAgXCJydGNcIlxuKTtcbmZ1bmN0aW9uIG9uRXJyb3JDYXB0dXJlZChob29rLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UpIHtcbiAgaW5qZWN0SG9vayhcImVjXCIsIGhvb2ssIHRhcmdldCk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckxpc3Qoc291cmNlLCByZW5kZXJJdGVtLCBjYWNoZSwgaW5kZXgpIHtcbiAgbGV0IHJldDtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUgJiYgY2FjaGVbaW5kZXhdO1xuICBpZiAoaXNBcnJheShzb3VyY2UpIHx8IGlzU3RyaW5nKHNvdXJjZSkpIHtcbiAgICByZXQgPSBuZXcgQXJyYXkoc291cmNlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzb3VyY2UubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICByZXRbaV0gPSByZW5kZXJJdGVtKHNvdXJjZVtpXSwgaSwgdm9pZCAwLCBjYWNoZWQgJiYgY2FjaGVkW2ldKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFOdW1iZXIuaXNJbnRlZ2VyKHNvdXJjZSkpIHtcbiAgICAgIHdhcm4kMShgVGhlIHYtZm9yIHJhbmdlIGV4cGVjdCBhbiBpbnRlZ2VyIHZhbHVlIGJ1dCBnb3QgJHtzb3VyY2V9LmApO1xuICAgIH1cbiAgICByZXQgPSBuZXcgQXJyYXkoc291cmNlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZTsgaSsrKSB7XG4gICAgICByZXRbaV0gPSByZW5kZXJJdGVtKGkgKyAxLCBpLCB2b2lkIDAsIGNhY2hlZCAmJiBjYWNoZWRbaV0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgaWYgKHNvdXJjZVtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gICAgICByZXQgPSBBcnJheS5mcm9tKFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIChpdGVtLCBpKSA9PiByZW5kZXJJdGVtKGl0ZW0sIGksIHZvaWQgMCwgY2FjaGVkICYmIGNhY2hlZFtpXSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgcmV0W2ldID0gcmVuZGVySXRlbShzb3VyY2Vba2V5XSwga2V5LCBpLCBjYWNoZWQgJiYgY2FjaGVkW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0ID0gW107XG4gIH1cbiAgaWYgKGNhY2hlKSB7XG4gICAgY2FjaGVbaW5kZXhdID0gcmV0O1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNsb3RzKHNsb3RzLCBkeW5hbWljU2xvdHMpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkeW5hbWljU2xvdHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzbG90ID0gZHluYW1pY1Nsb3RzW2ldO1xuICAgIGlmIChpc0FycmF5KHNsb3QpKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNsb3QubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc2xvdHNbc2xvdFtqXS5uYW1lXSA9IHNsb3Rbal0uZm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzbG90KSB7XG4gICAgICBzbG90c1tzbG90Lm5hbWVdID0gc2xvdC5rZXkgPyAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBzbG90LmZuKC4uLmFyZ3MpO1xuICAgICAgICBpZiAocmVzKVxuICAgICAgICAgIHJlcy5rZXkgPSBzbG90LmtleTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0gOiBzbG90LmZuO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2xvdHM7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclNsb3Qoc2xvdHMsIG5hbWUsIHByb3BzID0ge30sIGZhbGxiYWNrLCBub1Nsb3R0ZWQpIHtcbiAgaWYgKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5pc0NFIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5wYXJlbnQgJiYgaXNBc3luY1dyYXBwZXIoY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLnBhcmVudCkgJiYgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLnBhcmVudC5pc0NFKSB7XG4gICAgaWYgKG5hbWUgIT09IFwiZGVmYXVsdFwiKVxuICAgICAgcHJvcHMubmFtZSA9IG5hbWU7XG4gICAgcmV0dXJuIGNyZWF0ZVZOb2RlKFwic2xvdFwiLCBwcm9wcywgZmFsbGJhY2sgJiYgZmFsbGJhY2soKSk7XG4gIH1cbiAgbGV0IHNsb3QgPSBzbG90c1tuYW1lXTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2xvdCAmJiBzbG90Lmxlbmd0aCA+IDEpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgU1NSLW9wdGltaXplZCBzbG90IGZ1bmN0aW9uIGRldGVjdGVkIGluIGEgbm9uLVNTUi1vcHRpbWl6ZWQgcmVuZGVyIGZ1bmN0aW9uLiBZb3UgbmVlZCB0byBtYXJrIHRoaXMgY29tcG9uZW50IHdpdGggJGR5bmFtaWMtc2xvdHMgaW4gdGhlIHBhcmVudCB0ZW1wbGF0ZS5gXG4gICAgKTtcbiAgICBzbG90ID0gKCkgPT4gW107XG4gIH1cbiAgaWYgKHNsb3QgJiYgc2xvdC5fYykge1xuICAgIHNsb3QuX2QgPSBmYWxzZTtcbiAgfVxuICBvcGVuQmxvY2soKTtcbiAgY29uc3QgdmFsaWRTbG90Q29udGVudCA9IHNsb3QgJiYgZW5zdXJlVmFsaWRWTm9kZShzbG90KHByb3BzKSk7XG4gIGNvbnN0IHJlbmRlcmVkID0gY3JlYXRlQmxvY2soXG4gICAgRnJhZ21lbnQsXG4gICAge1xuICAgICAga2V5OiBwcm9wcy5rZXkgfHwgLy8gc2xvdCBjb250ZW50IGFycmF5IG9mIGEgZHluYW1pYyBjb25kaXRpb25hbCBzbG90IG1heSBoYXZlIGEgYnJhbmNoXG4gICAgICAvLyBrZXkgYXR0YWNoZWQgaW4gdGhlIGBjcmVhdGVTbG90c2AgaGVscGVyLCByZXNwZWN0IHRoYXRcbiAgICAgIHZhbGlkU2xvdENvbnRlbnQgJiYgdmFsaWRTbG90Q29udGVudC5rZXkgfHwgYF8ke25hbWV9YFxuICAgIH0sXG4gICAgdmFsaWRTbG90Q29udGVudCB8fCAoZmFsbGJhY2sgPyBmYWxsYmFjaygpIDogW10pLFxuICAgIHZhbGlkU2xvdENvbnRlbnQgJiYgc2xvdHMuXyA9PT0gMSA/IDY0IDogLTJcbiAgKTtcbiAgaWYgKCFub1Nsb3R0ZWQgJiYgcmVuZGVyZWQuc2NvcGVJZCkge1xuICAgIHJlbmRlcmVkLnNsb3RTY29wZUlkcyA9IFtyZW5kZXJlZC5zY29wZUlkICsgXCItc1wiXTtcbiAgfVxuICBpZiAoc2xvdCAmJiBzbG90Ll9jKSB7XG4gICAgc2xvdC5fZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHJlbmRlcmVkO1xufVxuZnVuY3Rpb24gZW5zdXJlVmFsaWRWTm9kZSh2bm9kZXMpIHtcbiAgcmV0dXJuIHZub2Rlcy5zb21lKChjaGlsZCkgPT4ge1xuICAgIGlmICghaXNWTm9kZShjaGlsZCkpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gQ29tbWVudClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gRnJhZ21lbnQgJiYgIWVuc3VyZVZhbGlkVk5vZGUoY2hpbGQuY2hpbGRyZW4pKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KSA/IHZub2RlcyA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHRvSGFuZGxlcnMob2JqLCBwcmVzZXJ2ZUNhc2VJZk5lY2Vzc2FyeSkge1xuICBjb25zdCByZXQgPSB7fTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzT2JqZWN0KG9iaikpIHtcbiAgICB3YXJuJDEoYHYtb24gd2l0aCBubyBhcmd1bWVudCBleHBlY3RzIGFuIG9iamVjdCB2YWx1ZS5gKTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIHJldFtwcmVzZXJ2ZUNhc2VJZk5lY2Vzc2FyeSAmJiAvW0EtWl0vLnRlc3Qoa2V5KSA/IGBvbjoke2tleX1gIDogdG9IYW5kbGVyS2V5KGtleSldID0gb2JqW2tleV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuY29uc3QgZ2V0UHVibGljSW5zdGFuY2UgPSAoaSkgPT4ge1xuICBpZiAoIWkpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmIChpc1N0YXRlZnVsQ29tcG9uZW50KGkpKVxuICAgIHJldHVybiBnZXRFeHBvc2VQcm94eShpKSB8fCBpLnByb3h5O1xuICByZXR1cm4gZ2V0UHVibGljSW5zdGFuY2UoaS5wYXJlbnQpO1xufTtcbmNvbnN0IHB1YmxpY1Byb3BlcnRpZXNNYXAgPSAoXG4gIC8vIE1vdmUgUFVSRSBtYXJrZXIgdG8gbmV3IGxpbmUgdG8gd29ya2Fyb3VuZCBjb21waWxlciBkaXNjYXJkaW5nIGl0XG4gIC8vIGR1ZSB0byB0eXBlIGFubm90YXRpb25cbiAgLyogQF9fUFVSRV9fICovIGV4dGVuZCgvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwge1xuICAgICQ6IChpKSA9PiBpLFxuICAgICRlbDogKGkpID0+IGkudm5vZGUuZWwsXG4gICAgJGRhdGE6IChpKSA9PiBpLmRhdGEsXG4gICAgJHByb3BzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLnByb3BzKSA6IGkucHJvcHMsXG4gICAgJGF0dHJzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLmF0dHJzKSA6IGkuYXR0cnMsXG4gICAgJHNsb3RzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLnNsb3RzKSA6IGkuc2xvdHMsXG4gICAgJHJlZnM6IChpKSA9PiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KGkucmVmcykgOiBpLnJlZnMsXG4gICAgJHBhcmVudDogKGkpID0+IGdldFB1YmxpY0luc3RhbmNlKGkucGFyZW50KSxcbiAgICAkcm9vdDogKGkpID0+IGdldFB1YmxpY0luc3RhbmNlKGkucm9vdCksXG4gICAgJGVtaXQ6IChpKSA9PiBpLmVtaXQsXG4gICAgJG9wdGlvbnM6IChpKSA9PiBfX1ZVRV9PUFRJT05TX0FQSV9fID8gcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaSkgOiBpLnR5cGUsXG4gICAgJGZvcmNlVXBkYXRlOiAoaSkgPT4gaS5mIHx8IChpLmYgPSAoKSA9PiB7XG4gICAgICBpLmVmZmVjdC5kaXJ0eSA9IHRydWU7XG4gICAgICBxdWV1ZUpvYihpLnVwZGF0ZSk7XG4gICAgfSksXG4gICAgJG5leHRUaWNrOiAoaSkgPT4gaS5uIHx8IChpLm4gPSBuZXh0VGljay5iaW5kKGkucHJveHkpKSxcbiAgICAkd2F0Y2g6IChpKSA9PiBfX1ZVRV9PUFRJT05TX0FQSV9fID8gaW5zdGFuY2VXYXRjaC5iaW5kKGkpIDogTk9PUFxuICB9KVxuKTtcbmNvbnN0IGlzUmVzZXJ2ZWRQcmVmaXggPSAoa2V5KSA9PiBrZXkgPT09IFwiX1wiIHx8IGtleSA9PT0gXCIkXCI7XG5jb25zdCBoYXNTZXR1cEJpbmRpbmcgPSAoc3RhdGUsIGtleSkgPT4gc3RhdGUgIT09IEVNUFRZX09CSiAmJiAhc3RhdGUuX19pc1NjcmlwdFNldHVwICYmIGhhc093bihzdGF0ZSwga2V5KTtcbmNvbnN0IFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyA9IHtcbiAgZ2V0KHsgXzogaW5zdGFuY2UgfSwga2V5KSB7XG4gICAgY29uc3QgeyBjdHgsIHNldHVwU3RhdGUsIGRhdGEsIHByb3BzLCBhY2Nlc3NDYWNoZSwgdHlwZSwgYXBwQ29udGV4dCB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5ID09PSBcIl9faXNWdWVcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBub3JtYWxpemVkUHJvcHM7XG4gICAgaWYgKGtleVswXSAhPT0gXCIkXCIpIHtcbiAgICAgIGNvbnN0IG4gPSBhY2Nlc3NDYWNoZVtrZXldO1xuICAgICAgaWYgKG4gIT09IHZvaWQgMCkge1xuICAgICAgICBzd2l0Y2ggKG4pIHtcbiAgICAgICAgICBjYXNlIDEgLyogU0VUVVAgKi86XG4gICAgICAgICAgICByZXR1cm4gc2V0dXBTdGF0ZVtrZXldO1xuICAgICAgICAgIGNhc2UgMiAvKiBEQVRBICovOlxuICAgICAgICAgICAgcmV0dXJuIGRhdGFba2V5XTtcbiAgICAgICAgICBjYXNlIDQgLyogQ09OVEVYVCAqLzpcbiAgICAgICAgICAgIHJldHVybiBjdHhba2V5XTtcbiAgICAgICAgICBjYXNlIDMgLyogUFJPUFMgKi86XG4gICAgICAgICAgICByZXR1cm4gcHJvcHNba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChoYXNTZXR1cEJpbmRpbmcoc2V0dXBTdGF0ZSwga2V5KSkge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gMSAvKiBTRVRVUCAqLztcbiAgICAgICAgcmV0dXJuIHNldHVwU3RhdGVba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YSAhPT0gRU1QVFlfT0JKICYmIGhhc093bihkYXRhLCBrZXkpKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAyIC8qIERBVEEgKi87XG4gICAgICAgIHJldHVybiBkYXRhW2tleV07XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAvLyBvbmx5IGNhY2hlIG90aGVyIHByb3BlcnRpZXMgd2hlbiBpbnN0YW5jZSBoYXMgZGVjbGFyZWQgKHRodXMgc3RhYmxlKVxuICAgICAgICAvLyBwcm9wc1xuICAgICAgICAobm9ybWFsaXplZFByb3BzID0gaW5zdGFuY2UucHJvcHNPcHRpb25zWzBdKSAmJiBoYXNPd24obm9ybWFsaXplZFByb3BzLCBrZXkpXG4gICAgICApIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDMgLyogUFJPUFMgKi87XG4gICAgICAgIHJldHVybiBwcm9wc1trZXldO1xuICAgICAgfSBlbHNlIGlmIChjdHggIT09IEVNUFRZX09CSiAmJiBoYXNPd24oY3R4LCBrZXkpKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSA0IC8qIENPTlRFWFQgKi87XG4gICAgICAgIHJldHVybiBjdHhba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoIV9fVlVFX09QVElPTlNfQVBJX18gfHwgc2hvdWxkQ2FjaGVBY2Nlc3MpIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDAgLyogT1RIRVIgKi87XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHB1YmxpY0dldHRlciA9IHB1YmxpY1Byb3BlcnRpZXNNYXBba2V5XTtcbiAgICBsZXQgY3NzTW9kdWxlLCBnbG9iYWxQcm9wZXJ0aWVzO1xuICAgIGlmIChwdWJsaWNHZXR0ZXIpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiJGF0dHJzXCIpIHtcbiAgICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIsIGtleSk7XG4gICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXkgPT09IFwiJHNsb3RzXCIpIHtcbiAgICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIsIGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHVibGljR2V0dGVyKGluc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgLy8gY3NzIG1vZHVsZSAoaW5qZWN0ZWQgYnkgdnVlLWxvYWRlcilcbiAgICAgIChjc3NNb2R1bGUgPSB0eXBlLl9fY3NzTW9kdWxlcykgJiYgKGNzc01vZHVsZSA9IGNzc01vZHVsZVtrZXldKVxuICAgICkge1xuICAgICAgcmV0dXJuIGNzc01vZHVsZTtcbiAgICB9IGVsc2UgaWYgKGN0eCAhPT0gRU1QVFlfT0JKICYmIGhhc093bihjdHgsIGtleSkpIHtcbiAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSA0IC8qIENPTlRFWFQgKi87XG4gICAgICByZXR1cm4gY3R4W2tleV07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIGdsb2JhbCBwcm9wZXJ0aWVzXG4gICAgICBnbG9iYWxQcm9wZXJ0aWVzID0gYXBwQ29udGV4dC5jb25maWcuZ2xvYmFsUHJvcGVydGllcywgaGFzT3duKGdsb2JhbFByb3BlcnRpZXMsIGtleSlcbiAgICApIHtcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIGdsb2JhbFByb3BlcnRpZXNba2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlICYmICghaXNTdHJpbmcoa2V5KSB8fCAvLyAjMTA5MSBhdm9pZCBpbnRlcm5hbCBpc1JlZi9pc1ZOb2RlIGNoZWNrcyBvbiBjb21wb25lbnQgaW5zdGFuY2UgbGVhZGluZ1xuICAgIC8vIHRvIGluZmluaXRlIHdhcm5pbmcgbG9vcFxuICAgIGtleS5pbmRleE9mKFwiX192XCIpICE9PSAwKSkge1xuICAgICAgaWYgKGRhdGEgIT09IEVNUFRZX09CSiAmJiBpc1Jlc2VydmVkUHJlZml4KGtleVswXSkgJiYgaGFzT3duKGRhdGEsIGtleSkpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBQcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgKX0gbXVzdCBiZSBhY2Nlc3NlZCB2aWEgJGRhdGEgYmVjYXVzZSBpdCBzdGFydHMgd2l0aCBhIHJlc2VydmVkIGNoYXJhY3RlciAoXCIkXCIgb3IgXCJfXCIpIGFuZCBpcyBub3QgcHJveGllZCBvbiB0aGUgcmVuZGVyIGNvbnRleHQuYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZSA9PT0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgUHJvcGVydHkgJHtKU09OLnN0cmluZ2lmeShrZXkpfSB3YXMgYWNjZXNzZWQgZHVyaW5nIHJlbmRlciBidXQgaXMgbm90IGRlZmluZWQgb24gaW5zdGFuY2UuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgc2V0KHsgXzogaW5zdGFuY2UgfSwga2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IHsgZGF0YSwgc2V0dXBTdGF0ZSwgY3R4IH0gPSBpbnN0YW5jZTtcbiAgICBpZiAoaGFzU2V0dXBCaW5kaW5nKHNldHVwU3RhdGUsIGtleSkpIHtcbiAgICAgIHNldHVwU3RhdGVba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldHVwU3RhdGUuX19pc1NjcmlwdFNldHVwICYmIGhhc093bihzZXR1cFN0YXRlLCBrZXkpKSB7XG4gICAgICB3YXJuJDEoYENhbm5vdCBtdXRhdGUgPHNjcmlwdCBzZXR1cD4gYmluZGluZyBcIiR7a2V5fVwiIGZyb20gT3B0aW9ucyBBUEkuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChkYXRhICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGRhdGEsIGtleSkpIHtcbiAgICAgIGRhdGFba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChoYXNPd24oaW5zdGFuY2UucHJvcHMsIGtleSkpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKGBBdHRlbXB0aW5nIHRvIG11dGF0ZSBwcm9wIFwiJHtrZXl9XCIuIFByb3BzIGFyZSByZWFkb25seS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGtleVswXSA9PT0gXCIkXCIgJiYga2V5LnNsaWNlKDEpIGluIGluc3RhbmNlKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShcbiAgICAgICAgYEF0dGVtcHRpbmcgdG8gbXV0YXRlIHB1YmxpYyBwcm9wZXJ0eSBcIiR7a2V5fVwiLiBQcm9wZXJ0aWVzIHN0YXJ0aW5nIHdpdGggJCBhcmUgcmVzZXJ2ZWQgYW5kIHJlYWRvbmx5LmBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSBpbiBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3R4W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGhhcyh7XG4gICAgXzogeyBkYXRhLCBzZXR1cFN0YXRlLCBhY2Nlc3NDYWNoZSwgY3R4LCBhcHBDb250ZXh0LCBwcm9wc09wdGlvbnMgfVxuICB9LCBrZXkpIHtcbiAgICBsZXQgbm9ybWFsaXplZFByb3BzO1xuICAgIHJldHVybiAhIWFjY2Vzc0NhY2hlW2tleV0gfHwgZGF0YSAhPT0gRU1QVFlfT0JKICYmIGhhc093bihkYXRhLCBrZXkpIHx8IGhhc1NldHVwQmluZGluZyhzZXR1cFN0YXRlLCBrZXkpIHx8IChub3JtYWxpemVkUHJvcHMgPSBwcm9wc09wdGlvbnNbMF0pICYmIGhhc093bihub3JtYWxpemVkUHJvcHMsIGtleSkgfHwgaGFzT3duKGN0eCwga2V5KSB8fCBoYXNPd24ocHVibGljUHJvcGVydGllc01hcCwga2V5KSB8fCBoYXNPd24oYXBwQ29udGV4dC5jb25maWcuZ2xvYmFsUHJvcGVydGllcywga2V5KTtcbiAgfSxcbiAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpIHtcbiAgICBpZiAoZGVzY3JpcHRvci5nZXQgIT0gbnVsbCkge1xuICAgICAgdGFyZ2V0Ll8uYWNjZXNzQ2FjaGVba2V5XSA9IDA7XG4gICAgfSBlbHNlIGlmIChoYXNPd24oZGVzY3JpcHRvciwgXCJ2YWx1ZVwiKSkge1xuICAgICAgdGhpcy5zZXQodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IudmFsdWUsIG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn07XG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0cnVlKSB7XG4gIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycy5vd25LZXlzID0gKHRhcmdldCkgPT4ge1xuICAgIHdhcm4kMShcbiAgICAgIGBBdm9pZCBhcHAgbG9naWMgdGhhdCByZWxpZXMgb24gZW51bWVyYXRpbmcga2V5cyBvbiBhIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhlIGtleXMgd2lsbCBiZSBlbXB0eSBpbiBwcm9kdWN0aW9uIG1vZGUgdG8gYXZvaWQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQuYFxuICAgICk7XG4gICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpO1xuICB9O1xufVxuY29uc3QgUnVudGltZUNvbXBpbGVkUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIGV4dGVuZChcbiAge30sXG4gIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyxcbiAge1xuICAgIGdldCh0YXJnZXQsIGtleSkge1xuICAgICAgaWYgKGtleSA9PT0gU3ltYm9sLnVuc2NvcGFibGVzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMuZ2V0KHRhcmdldCwga2V5LCB0YXJnZXQpO1xuICAgIH0sXG4gICAgaGFzKF8sIGtleSkge1xuICAgICAgY29uc3QgaGFzID0ga2V5WzBdICE9PSBcIl9cIiAmJiAhaXNHbG9iYWxseUFsbG93ZWQoa2V5KTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFoYXMgJiYgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzLmhhcyhfLCBrZXkpKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgUHJvcGVydHkgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICl9IHNob3VsZCBub3Qgc3RhcnQgd2l0aCBfIHdoaWNoIGlzIGEgcmVzZXJ2ZWQgcHJlZml4IGZvciBWdWUgaW50ZXJuYWxzLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXM7XG4gICAgfVxuICB9XG4pO1xuZnVuY3Rpb24gY3JlYXRlRGV2UmVuZGVyQ29udGV4dChpbnN0YW5jZSkge1xuICBjb25zdCB0YXJnZXQgPSB7fTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgYF9gLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogKCkgPT4gaW5zdGFuY2VcbiAgfSk7XG4gIE9iamVjdC5rZXlzKHB1YmxpY1Byb3BlcnRpZXNNYXApLmZvckVhY2goKGtleSkgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6ICgpID0+IHB1YmxpY1Byb3BlcnRpZXNNYXBba2V5XShpbnN0YW5jZSksXG4gICAgICAvLyBpbnRlcmNlcHRlZCBieSB0aGUgcHJveHkgc28gbm8gbmVlZCBmb3IgaW1wbGVtZW50YXRpb24sXG4gICAgICAvLyBidXQgbmVlZGVkIHRvIHByZXZlbnQgc2V0IGVycm9yc1xuICAgICAgc2V0OiBOT09QXG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gZXhwb3NlUHJvcHNPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3Qge1xuICAgIGN0eCxcbiAgICBwcm9wc09wdGlvbnM6IFtwcm9wc09wdGlvbnNdXG4gIH0gPSBpbnN0YW5jZTtcbiAgaWYgKHByb3BzT3B0aW9ucykge1xuICAgIE9iamVjdC5rZXlzKHByb3BzT3B0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IGluc3RhbmNlLnByb3BzW2tleV0sXG4gICAgICAgIHNldDogTk9PUFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGV4cG9zZVNldHVwU3RhdGVPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3QgeyBjdHgsIHNldHVwU3RhdGUgfSA9IGluc3RhbmNlO1xuICBPYmplY3Qua2V5cyh0b1JhdyhzZXR1cFN0YXRlKSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKCFzZXR1cFN0YXRlLl9faXNTY3JpcHRTZXR1cCkge1xuICAgICAgaWYgKGlzUmVzZXJ2ZWRQcmVmaXgoa2V5WzBdKSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYHNldHVwKCkgcmV0dXJuIHByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBrZXlcbiAgICAgICAgICApfSBzaG91bGQgbm90IHN0YXJ0IHdpdGggXCIkXCIgb3IgXCJfXCIgd2hpY2ggYXJlIHJlc2VydmVkIHByZWZpeGVzIGZvciBWdWUgaW50ZXJuYWxzLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBzZXR1cFN0YXRlW2tleV0sXG4gICAgICAgIHNldDogTk9PUFxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3Qgd2FyblJ1bnRpbWVVc2FnZSA9IChtZXRob2QpID0+IHdhcm4kMShcbiAgYCR7bWV0aG9kfSgpIGlzIGEgY29tcGlsZXItaGludCBoZWxwZXIgdGhhdCBpcyBvbmx5IHVzYWJsZSBpbnNpZGUgPHNjcmlwdCBzZXR1cD4gb2YgYSBzaW5nbGUgZmlsZSBjb21wb25lbnQuIEl0cyBhcmd1bWVudHMgc2hvdWxkIGJlIGNvbXBpbGVkIGF3YXkgYW5kIHBhc3NpbmcgaXQgYXQgcnVudGltZSBoYXMgbm8gZWZmZWN0LmBcbik7XG5mdW5jdGlvbiBkZWZpbmVQcm9wcygpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVQcm9wc2ApO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZGVmaW5lRW1pdHMoKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lRW1pdHNgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRlZmluZUV4cG9zZShleHBvc2VkKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lRXhwb3NlYCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlZmluZU9wdGlvbnMob3B0aW9ucykge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZU9wdGlvbnNgKTtcbiAgfVxufVxuZnVuY3Rpb24gZGVmaW5lU2xvdHMoKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lU2xvdHNgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRlZmluZU1vZGVsKCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoXCJkZWZpbmVNb2RlbFwiKTtcbiAgfVxufVxuZnVuY3Rpb24gd2l0aERlZmF1bHRzKHByb3BzLCBkZWZhdWx0cykge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYHdpdGhEZWZhdWx0c2ApO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gdXNlU2xvdHMoKSB7XG4gIHJldHVybiBnZXRDb250ZXh0KCkuc2xvdHM7XG59XG5mdW5jdGlvbiB1c2VBdHRycygpIHtcbiAgcmV0dXJuIGdldENvbnRleHQoKS5hdHRycztcbn1cbmZ1bmN0aW9uIGdldENvbnRleHQoKSB7XG4gIGNvbnN0IGkgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWkpIHtcbiAgICB3YXJuJDEoYHVzZUNvbnRleHQoKSBjYWxsZWQgd2l0aG91dCBhY3RpdmUgaW5zdGFuY2UuYCk7XG4gIH1cbiAgcmV0dXJuIGkuc2V0dXBDb250ZXh0IHx8IChpLnNldHVwQ29udGV4dCA9IGNyZWF0ZVNldHVwQ29udGV4dChpKSk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVQcm9wc09yRW1pdHMocHJvcHMpIHtcbiAgcmV0dXJuIGlzQXJyYXkocHJvcHMpID8gcHJvcHMucmVkdWNlKFxuICAgIChub3JtYWxpemVkLCBwKSA9PiAobm9ybWFsaXplZFtwXSA9IG51bGwsIG5vcm1hbGl6ZWQpLFxuICAgIHt9XG4gICkgOiBwcm9wcztcbn1cbmZ1bmN0aW9uIG1lcmdlRGVmYXVsdHMocmF3LCBkZWZhdWx0cykge1xuICBjb25zdCBwcm9wcyA9IG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhyYXcpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBkZWZhdWx0cykge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChcIl9fc2tpcFwiKSlcbiAgICAgIGNvbnRpbnVlO1xuICAgIGxldCBvcHQgPSBwcm9wc1trZXldO1xuICAgIGlmIChvcHQpIHtcbiAgICAgIGlmIChpc0FycmF5KG9wdCkgfHwgaXNGdW5jdGlvbihvcHQpKSB7XG4gICAgICAgIG9wdCA9IHByb3BzW2tleV0gPSB7IHR5cGU6IG9wdCwgZGVmYXVsdDogZGVmYXVsdHNba2V5XSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0LmRlZmF1bHQgPSBkZWZhdWx0c1trZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0ID09PSBudWxsKSB7XG4gICAgICBvcHQgPSBwcm9wc1trZXldID0geyBkZWZhdWx0OiBkZWZhdWx0c1trZXldIH07XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuJDEoYHByb3BzIGRlZmF1bHQga2V5IFwiJHtrZXl9XCIgaGFzIG5vIGNvcnJlc3BvbmRpbmcgZGVjbGFyYXRpb24uYCk7XG4gICAgfVxuICAgIGlmIChvcHQgJiYgZGVmYXVsdHNbYF9fc2tpcF8ke2tleX1gXSkge1xuICAgICAgb3B0LnNraXBGYWN0b3J5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb3BzO1xufVxuZnVuY3Rpb24gbWVyZ2VNb2RlbHMoYSwgYikge1xuICBpZiAoIWEgfHwgIWIpXG4gICAgcmV0dXJuIGEgfHwgYjtcbiAgaWYgKGlzQXJyYXkoYSkgJiYgaXNBcnJheShiKSlcbiAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gIHJldHVybiBleHRlbmQoe30sIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhhKSwgbm9ybWFsaXplUHJvcHNPckVtaXRzKGIpKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVByb3BzUmVzdFByb3h5KHByb3BzLCBleGNsdWRlZEtleXMpIHtcbiAgY29uc3QgcmV0ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgaWYgKCFleGNsdWRlZEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gcHJvcHNba2V5XVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiB3aXRoQXN5bmNDb250ZXh0KGdldEF3YWl0YWJsZSkge1xuICBjb25zdCBjdHggPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWN0eCkge1xuICAgIHdhcm4kMShcbiAgICAgIGB3aXRoQXN5bmNDb250ZXh0IGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBjdXJyZW50IGluc3RhbmNlLiBUaGlzIGlzIGxpa2VseSBhIGJ1Zy5gXG4gICAgKTtcbiAgfVxuICBsZXQgYXdhaXRhYmxlID0gZ2V0QXdhaXRhYmxlKCk7XG4gIHVuc2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmIChpc1Byb21pc2UoYXdhaXRhYmxlKSkge1xuICAgIGF3YWl0YWJsZSA9IGF3YWl0YWJsZS5jYXRjaCgoZSkgPT4ge1xuICAgICAgc2V0Q3VycmVudEluc3RhbmNlKGN0eCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBbYXdhaXRhYmxlLCAoKSA9PiBzZXRDdXJyZW50SW5zdGFuY2UoY3R4KV07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUR1cGxpY2F0ZUNoZWNrZXIoKSB7XG4gIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiAodHlwZSwga2V5KSA9PiB7XG4gICAgaWYgKGNhY2hlW2tleV0pIHtcbiAgICAgIHdhcm4kMShgJHt0eXBlfSBwcm9wZXJ0eSBcIiR7a2V5fVwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiAke2NhY2hlW2tleV19LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWNoZVtrZXldID0gdHlwZTtcbiAgICB9XG4gIH07XG59XG5sZXQgc2hvdWxkQ2FjaGVBY2Nlc3MgPSB0cnVlO1xuZnVuY3Rpb24gYXBwbHlPcHRpb25zKGluc3RhbmNlKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSk7XG4gIGNvbnN0IHB1YmxpY1RoaXMgPSBpbnN0YW5jZS5wcm94eTtcbiAgY29uc3QgY3R4ID0gaW5zdGFuY2UuY3R4O1xuICBzaG91bGRDYWNoZUFjY2VzcyA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5iZWZvcmVDcmVhdGUpIHtcbiAgICBjYWxsSG9vayhvcHRpb25zLmJlZm9yZUNyZWF0ZSwgaW5zdGFuY2UsIFwiYmNcIik7XG4gIH1cbiAgY29uc3Qge1xuICAgIC8vIHN0YXRlXG4gICAgZGF0YTogZGF0YU9wdGlvbnMsXG4gICAgY29tcHV0ZWQ6IGNvbXB1dGVkT3B0aW9ucyxcbiAgICBtZXRob2RzLFxuICAgIHdhdGNoOiB3YXRjaE9wdGlvbnMsXG4gICAgcHJvdmlkZTogcHJvdmlkZU9wdGlvbnMsXG4gICAgaW5qZWN0OiBpbmplY3RPcHRpb25zLFxuICAgIC8vIGxpZmVjeWNsZVxuICAgIGNyZWF0ZWQsXG4gICAgYmVmb3JlTW91bnQsXG4gICAgbW91bnRlZCxcbiAgICBiZWZvcmVVcGRhdGUsXG4gICAgdXBkYXRlZCxcbiAgICBhY3RpdmF0ZWQsXG4gICAgZGVhY3RpdmF0ZWQsXG4gICAgYmVmb3JlRGVzdHJveSxcbiAgICBiZWZvcmVVbm1vdW50LFxuICAgIGRlc3Ryb3llZCxcbiAgICB1bm1vdW50ZWQsXG4gICAgcmVuZGVyLFxuICAgIHJlbmRlclRyYWNrZWQsXG4gICAgcmVuZGVyVHJpZ2dlcmVkLFxuICAgIGVycm9yQ2FwdHVyZWQsXG4gICAgc2VydmVyUHJlZmV0Y2gsXG4gICAgLy8gcHVibGljIEFQSVxuICAgIGV4cG9zZSxcbiAgICBpbmhlcml0QXR0cnMsXG4gICAgLy8gYXNzZXRzXG4gICAgY29tcG9uZW50cyxcbiAgICBkaXJlY3RpdmVzLFxuICAgIGZpbHRlcnNcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVEdXBsaWNhdGVDaGVja2VyKCkgOiBudWxsO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IFtwcm9wc09wdGlvbnNdID0gaW5zdGFuY2UucHJvcHNPcHRpb25zO1xuICAgIGlmIChwcm9wc09wdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzT3B0aW9ucykge1xuICAgICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJQcm9wc1wiIC8qIFBST1BTICovLCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoaW5qZWN0T3B0aW9ucykge1xuICAgIHJlc29sdmVJbmplY3Rpb25zKGluamVjdE9wdGlvbnMsIGN0eCwgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKTtcbiAgfVxuICBpZiAobWV0aG9kcykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGNvbnN0IG1ldGhvZEhhbmRsZXIgPSBtZXRob2RzW2tleV07XG4gICAgICBpZiAoaXNGdW5jdGlvbihtZXRob2RIYW5kbGVyKSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IG1ldGhvZEhhbmRsZXIuYmluZChwdWJsaWNUaGlzKSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN0eFtrZXldID0gbWV0aG9kSGFuZGxlci5iaW5kKHB1YmxpY1RoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiTWV0aG9kc1wiIC8qIE1FVEhPRFMgKi8sIGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYE1ldGhvZCBcIiR7a2V5fVwiIGhhcyB0eXBlIFwiJHt0eXBlb2YgbWV0aG9kSGFuZGxlcn1cIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIERpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoZGF0YU9wdGlvbnMpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNGdW5jdGlvbihkYXRhT3B0aW9ucykpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYFRoZSBkYXRhIG9wdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24uIFBsYWluIG9iamVjdCB1c2FnZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBkYXRhT3B0aW9ucy5jYWxsKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzUHJvbWlzZShkYXRhKSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgZGF0YSgpIHJldHVybmVkIGEgUHJvbWlzZSAtIG5vdGUgZGF0YSgpIGNhbm5vdCBiZSBhc3luYzsgSWYgeW91IGludGVuZCB0byBwZXJmb3JtIGRhdGEgZmV0Y2hpbmcgYmVmb3JlIGNvbXBvbmVudCByZW5kZXJzLCB1c2UgYXN5bmMgc2V0dXAoKSArIDxTdXNwZW5zZT4uYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYGRhdGEoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UuZGF0YSA9IHJlYWN0aXZlKGRhdGEpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkRhdGFcIiAvKiBEQVRBICovLCBrZXkpO1xuICAgICAgICAgIGlmICghaXNSZXNlcnZlZFByZWZpeChrZXlbMF0pKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBnZXQ6ICgpID0+IGRhdGFba2V5XSxcbiAgICAgICAgICAgICAgc2V0OiBOT09QXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc2hvdWxkQ2FjaGVBY2Nlc3MgPSB0cnVlO1xuICBpZiAoY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgICBjb25zdCBvcHQgPSBjb21wdXRlZE9wdGlvbnNba2V5XTtcbiAgICAgIGNvbnN0IGdldCA9IGlzRnVuY3Rpb24ob3B0KSA/IG9wdC5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpIDogaXNGdW5jdGlvbihvcHQuZ2V0KSA/IG9wdC5nZXQuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKSA6IE5PT1A7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBnZXQgPT09IE5PT1ApIHtcbiAgICAgICAgd2FybiQxKGBDb21wdXRlZCBwcm9wZXJ0eSBcIiR7a2V5fVwiIGhhcyBubyBnZXR0ZXIuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBzZXQgPSAhaXNGdW5jdGlvbihvcHQpICYmIGlzRnVuY3Rpb24ob3B0LnNldCkgPyBvcHQuc2V0LmJpbmQocHVibGljVGhpcykgOiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gKCkgPT4ge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYFdyaXRlIG9wZXJhdGlvbiBmYWlsZWQ6IGNvbXB1dGVkIHByb3BlcnR5IFwiJHtrZXl9XCIgaXMgcmVhZG9ubHkuYFxuICAgICAgICApO1xuICAgICAgfSA6IE5PT1A7XG4gICAgICBjb25zdCBjID0gY29tcHV0ZWQoe1xuICAgICAgICBnZXQsXG4gICAgICAgIHNldFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IGMudmFsdWUsXG4gICAgICAgIHNldDogKHYpID0+IGMudmFsdWUgPSB2XG4gICAgICB9KTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkNvbXB1dGVkXCIgLyogQ09NUFVURUQgKi8sIGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICh3YXRjaE9wdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB3YXRjaE9wdGlvbnMpIHtcbiAgICAgIGNyZWF0ZVdhdGNoZXIod2F0Y2hPcHRpb25zW2tleV0sIGN0eCwgcHVibGljVGhpcywga2V5KTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb3ZpZGVPcHRpb25zKSB7XG4gICAgY29uc3QgcHJvdmlkZXMgPSBpc0Z1bmN0aW9uKHByb3ZpZGVPcHRpb25zKSA/IHByb3ZpZGVPcHRpb25zLmNhbGwocHVibGljVGhpcykgOiBwcm92aWRlT3B0aW9ucztcbiAgICBSZWZsZWN0Lm93bktleXMocHJvdmlkZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgcHJvdmlkZShrZXksIHByb3ZpZGVzW2tleV0pO1xuICAgIH0pO1xuICB9XG4gIGlmIChjcmVhdGVkKSB7XG4gICAgY2FsbEhvb2soY3JlYXRlZCwgaW5zdGFuY2UsIFwiY1wiKTtcbiAgfVxuICBmdW5jdGlvbiByZWdpc3RlckxpZmVjeWNsZUhvb2socmVnaXN0ZXIsIGhvb2spIHtcbiAgICBpZiAoaXNBcnJheShob29rKSkge1xuICAgICAgaG9vay5mb3JFYWNoKChfaG9vaykgPT4gcmVnaXN0ZXIoX2hvb2suYmluZChwdWJsaWNUaGlzKSkpO1xuICAgIH0gZWxzZSBpZiAoaG9vaykge1xuICAgICAgcmVnaXN0ZXIoaG9vay5iaW5kKHB1YmxpY1RoaXMpKTtcbiAgICB9XG4gIH1cbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQmVmb3JlTW91bnQsIGJlZm9yZU1vdW50KTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uTW91bnRlZCwgbW91bnRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkJlZm9yZVVwZGF0ZSwgYmVmb3JlVXBkYXRlKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uVXBkYXRlZCwgdXBkYXRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkFjdGl2YXRlZCwgYWN0aXZhdGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uRGVhY3RpdmF0ZWQsIGRlYWN0aXZhdGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uRXJyb3JDYXB0dXJlZCwgZXJyb3JDYXB0dXJlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblJlbmRlclRyYWNrZWQsIHJlbmRlclRyYWNrZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25SZW5kZXJUcmlnZ2VyZWQsIHJlbmRlclRyaWdnZXJlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkJlZm9yZVVubW91bnQsIGJlZm9yZVVubW91bnQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25Vbm1vdW50ZWQsIHVubW91bnRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblNlcnZlclByZWZldGNoLCBzZXJ2ZXJQcmVmZXRjaCk7XG4gIGlmIChpc0FycmF5KGV4cG9zZSkpIHtcbiAgICBpZiAoZXhwb3NlLmxlbmd0aCkge1xuICAgICAgY29uc3QgZXhwb3NlZCA9IGluc3RhbmNlLmV4cG9zZWQgfHwgKGluc3RhbmNlLmV4cG9zZWQgPSB7fSk7XG4gICAgICBleHBvc2UuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvc2VkLCBrZXksIHtcbiAgICAgICAgICBnZXQ6ICgpID0+IHB1YmxpY1RoaXNba2V5XSxcbiAgICAgICAgICBzZXQ6ICh2YWwpID0+IHB1YmxpY1RoaXNba2V5XSA9IHZhbFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIWluc3RhbmNlLmV4cG9zZWQpIHtcbiAgICAgIGluc3RhbmNlLmV4cG9zZWQgPSB7fTtcbiAgICB9XG4gIH1cbiAgaWYgKHJlbmRlciAmJiBpbnN0YW5jZS5yZW5kZXIgPT09IE5PT1ApIHtcbiAgICBpbnN0YW5jZS5yZW5kZXIgPSByZW5kZXI7XG4gIH1cbiAgaWYgKGluaGVyaXRBdHRycyAhPSBudWxsKSB7XG4gICAgaW5zdGFuY2UuaW5oZXJpdEF0dHJzID0gaW5oZXJpdEF0dHJzO1xuICB9XG4gIGlmIChjb21wb25lbnRzKVxuICAgIGluc3RhbmNlLmNvbXBvbmVudHMgPSBjb21wb25lbnRzO1xuICBpZiAoZGlyZWN0aXZlcylcbiAgICBpbnN0YW5jZS5kaXJlY3RpdmVzID0gZGlyZWN0aXZlcztcbn1cbmZ1bmN0aW9uIHJlc29sdmVJbmplY3Rpb25zKGluamVjdE9wdGlvbnMsIGN0eCwgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzID0gTk9PUCkge1xuICBpZiAoaXNBcnJheShpbmplY3RPcHRpb25zKSkge1xuICAgIGluamVjdE9wdGlvbnMgPSBub3JtYWxpemVJbmplY3QoaW5qZWN0T3B0aW9ucyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gaW5qZWN0T3B0aW9ucykge1xuICAgIGNvbnN0IG9wdCA9IGluamVjdE9wdGlvbnNba2V5XTtcbiAgICBsZXQgaW5qZWN0ZWQ7XG4gICAgaWYgKGlzT2JqZWN0KG9wdCkpIHtcbiAgICAgIGlmIChcImRlZmF1bHRcIiBpbiBvcHQpIHtcbiAgICAgICAgaW5qZWN0ZWQgPSBpbmplY3QoXG4gICAgICAgICAgb3B0LmZyb20gfHwga2V5LFxuICAgICAgICAgIG9wdC5kZWZhdWx0LFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluamVjdGVkID0gaW5qZWN0KG9wdC5mcm9tIHx8IGtleSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluamVjdGVkID0gaW5qZWN0KG9wdCk7XG4gICAgfVxuICAgIGlmIChpc1JlZihpbmplY3RlZCkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gaW5qZWN0ZWQudmFsdWUsXG4gICAgICAgIHNldDogKHYpID0+IGluamVjdGVkLnZhbHVlID0gdlxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eFtrZXldID0gaW5qZWN0ZWQ7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJJbmplY3RcIiAvKiBJTkpFQ1QgKi8sIGtleSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjYWxsSG9vayhob29rLCBpbnN0YW5jZSwgdHlwZSkge1xuICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICBpc0FycmF5KGhvb2spID8gaG9vay5tYXAoKGgpID0+IGguYmluZChpbnN0YW5jZS5wcm94eSkpIDogaG9vay5iaW5kKGluc3RhbmNlLnByb3h5KSxcbiAgICBpbnN0YW5jZSxcbiAgICB0eXBlXG4gICk7XG59XG5mdW5jdGlvbiBjcmVhdGVXYXRjaGVyKHJhdywgY3R4LCBwdWJsaWNUaGlzLCBrZXkpIHtcbiAgY29uc3QgZ2V0dGVyID0ga2V5LmluY2x1ZGVzKFwiLlwiKSA/IGNyZWF0ZVBhdGhHZXR0ZXIocHVibGljVGhpcywga2V5KSA6ICgpID0+IHB1YmxpY1RoaXNba2V5XTtcbiAgaWYgKGlzU3RyaW5nKHJhdykpIHtcbiAgICBjb25zdCBoYW5kbGVyID0gY3R4W3Jhd107XG4gICAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICAgIHdhdGNoKGdldHRlciwgaGFuZGxlcik7XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuJDEoYEludmFsaWQgd2F0Y2ggaGFuZGxlciBzcGVjaWZpZWQgYnkga2V5IFwiJHtyYXd9XCJgLCBoYW5kbGVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihyYXcpKSB7XG4gICAgd2F0Y2goZ2V0dGVyLCByYXcuYmluZChwdWJsaWNUaGlzKSk7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QocmF3KSkge1xuICAgIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICAgIHJhdy5mb3JFYWNoKChyKSA9PiBjcmVhdGVXYXRjaGVyKHIsIGN0eCwgcHVibGljVGhpcywga2V5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBpc0Z1bmN0aW9uKHJhdy5oYW5kbGVyKSA/IHJhdy5oYW5kbGVyLmJpbmQocHVibGljVGhpcykgOiBjdHhbcmF3LmhhbmRsZXJdO1xuICAgICAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICAgICAgd2F0Y2goZ2V0dGVyLCBoYW5kbGVyLCByYXcpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHdhcm4kMShgSW52YWxpZCB3YXRjaCBoYW5kbGVyIHNwZWNpZmllZCBieSBrZXkgXCIke3Jhdy5oYW5kbGVyfVwiYCwgaGFuZGxlcik7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoYEludmFsaWQgd2F0Y2ggb3B0aW9uOiBcIiR7a2V5fVwiYCwgcmF3KTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaW5zdGFuY2UpIHtcbiAgY29uc3QgYmFzZSA9IGluc3RhbmNlLnR5cGU7XG4gIGNvbnN0IHsgbWl4aW5zLCBleHRlbmRzOiBleHRlbmRzT3B0aW9ucyB9ID0gYmFzZTtcbiAgY29uc3Qge1xuICAgIG1peGluczogZ2xvYmFsTWl4aW5zLFxuICAgIG9wdGlvbnNDYWNoZTogY2FjaGUsXG4gICAgY29uZmlnOiB7IG9wdGlvbk1lcmdlU3RyYXRlZ2llcyB9XG4gIH0gPSBpbnN0YW5jZS5hcHBDb250ZXh0O1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoYmFzZSk7XG4gIGxldCByZXNvbHZlZDtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJlc29sdmVkID0gY2FjaGVkO1xuICB9IGVsc2UgaWYgKCFnbG9iYWxNaXhpbnMubGVuZ3RoICYmICFtaXhpbnMgJiYgIWV4dGVuZHNPcHRpb25zKSB7XG4gICAge1xuICAgICAgcmVzb2x2ZWQgPSBiYXNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXNvbHZlZCA9IHt9O1xuICAgIGlmIChnbG9iYWxNaXhpbnMubGVuZ3RoKSB7XG4gICAgICBnbG9iYWxNaXhpbnMuZm9yRWFjaChcbiAgICAgICAgKG0pID0+IG1lcmdlT3B0aW9ucyhyZXNvbHZlZCwgbSwgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzLCB0cnVlKVxuICAgICAgKTtcbiAgICB9XG4gICAgbWVyZ2VPcHRpb25zKHJlc29sdmVkLCBiYXNlLCBvcHRpb25NZXJnZVN0cmF0ZWdpZXMpO1xuICB9XG4gIGlmIChpc09iamVjdChiYXNlKSkge1xuICAgIGNhY2hlLnNldChiYXNlLCByZXNvbHZlZCk7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHRvLCBmcm9tLCBzdHJhdHMsIGFzTWl4aW4gPSBmYWxzZSkge1xuICBjb25zdCB7IG1peGlucywgZXh0ZW5kczogZXh0ZW5kc09wdGlvbnMgfSA9IGZyb207XG4gIGlmIChleHRlbmRzT3B0aW9ucykge1xuICAgIG1lcmdlT3B0aW9ucyh0bywgZXh0ZW5kc09wdGlvbnMsIHN0cmF0cywgdHJ1ZSk7XG4gIH1cbiAgaWYgKG1peGlucykge1xuICAgIG1peGlucy5mb3JFYWNoKFxuICAgICAgKG0pID0+IG1lcmdlT3B0aW9ucyh0bywgbSwgc3RyYXRzLCB0cnVlKVxuICAgICk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgIGlmIChhc01peGluICYmIGtleSA9PT0gXCJleHBvc2VcIikge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoXG4gICAgICAgIGBcImV4cG9zZVwiIG9wdGlvbiBpcyBpZ25vcmVkIHdoZW4gZGVjbGFyZWQgaW4gbWl4aW5zIG9yIGV4dGVuZHMuIEl0IHNob3VsZCBvbmx5IGJlIGRlY2xhcmVkIGluIHRoZSBiYXNlIGNvbXBvbmVudCBpdHNlbGYuYFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3RyYXQgPSBpbnRlcm5hbE9wdGlvbk1lcmdlU3RyYXRzW2tleV0gfHwgc3RyYXRzICYmIHN0cmF0c1trZXldO1xuICAgICAgdG9ba2V5XSA9IHN0cmF0ID8gc3RyYXQodG9ba2V5XSwgZnJvbVtrZXldKSA6IGZyb21ba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufVxuY29uc3QgaW50ZXJuYWxPcHRpb25NZXJnZVN0cmF0cyA9IHtcbiAgZGF0YTogbWVyZ2VEYXRhRm4sXG4gIHByb3BzOiBtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnMsXG4gIGVtaXRzOiBtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnMsXG4gIC8vIG9iamVjdHNcbiAgbWV0aG9kczogbWVyZ2VPYmplY3RPcHRpb25zLFxuICBjb21wdXRlZDogbWVyZ2VPYmplY3RPcHRpb25zLFxuICAvLyBsaWZlY3ljbGVcbiAgYmVmb3JlQ3JlYXRlOiBtZXJnZUFzQXJyYXksXG4gIGNyZWF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgYmVmb3JlTW91bnQ6IG1lcmdlQXNBcnJheSxcbiAgbW91bnRlZDogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVVcGRhdGU6IG1lcmdlQXNBcnJheSxcbiAgdXBkYXRlZDogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVEZXN0cm95OiBtZXJnZUFzQXJyYXksXG4gIGJlZm9yZVVubW91bnQ6IG1lcmdlQXNBcnJheSxcbiAgZGVzdHJveWVkOiBtZXJnZUFzQXJyYXksXG4gIHVubW91bnRlZDogbWVyZ2VBc0FycmF5LFxuICBhY3RpdmF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgZGVhY3RpdmF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgZXJyb3JDYXB0dXJlZDogbWVyZ2VBc0FycmF5LFxuICBzZXJ2ZXJQcmVmZXRjaDogbWVyZ2VBc0FycmF5LFxuICAvLyBhc3NldHNcbiAgY29tcG9uZW50czogbWVyZ2VPYmplY3RPcHRpb25zLFxuICBkaXJlY3RpdmVzOiBtZXJnZU9iamVjdE9wdGlvbnMsXG4gIC8vIHdhdGNoXG4gIHdhdGNoOiBtZXJnZVdhdGNoT3B0aW9ucyxcbiAgLy8gcHJvdmlkZSAvIGluamVjdFxuICBwcm92aWRlOiBtZXJnZURhdGFGbixcbiAgaW5qZWN0OiBtZXJnZUluamVjdFxufTtcbmZ1bmN0aW9uIG1lcmdlRGF0YUZuKHRvLCBmcm9tKSB7XG4gIGlmICghZnJvbSkge1xuICAgIHJldHVybiB0bztcbiAgfVxuICBpZiAoIXRvKSB7XG4gICAgcmV0dXJuIGZyb207XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZERhdGFGbigpIHtcbiAgICByZXR1cm4gKGV4dGVuZCkoXG4gICAgICBpc0Z1bmN0aW9uKHRvKSA/IHRvLmNhbGwodGhpcywgdGhpcykgOiB0byxcbiAgICAgIGlzRnVuY3Rpb24oZnJvbSkgPyBmcm9tLmNhbGwodGhpcywgdGhpcykgOiBmcm9tXG4gICAgKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIG1lcmdlSW5qZWN0KHRvLCBmcm9tKSB7XG4gIHJldHVybiBtZXJnZU9iamVjdE9wdGlvbnMobm9ybWFsaXplSW5qZWN0KHRvKSwgbm9ybWFsaXplSW5qZWN0KGZyb20pKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdChyYXcpIHtcbiAgaWYgKGlzQXJyYXkocmF3KSkge1xuICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXNbcmF3W2ldXSA9IHJhd1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICByZXR1cm4gcmF3O1xufVxuZnVuY3Rpb24gbWVyZ2VBc0FycmF5KHRvLCBmcm9tKSB7XG4gIHJldHVybiB0byA/IFsuLi5uZXcgU2V0KFtdLmNvbmNhdCh0bywgZnJvbSkpXSA6IGZyb207XG59XG5mdW5jdGlvbiBtZXJnZU9iamVjdE9wdGlvbnModG8sIGZyb20pIHtcbiAgcmV0dXJuIHRvID8gZXh0ZW5kKC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0bywgZnJvbSkgOiBmcm9tO1xufVxuZnVuY3Rpb24gbWVyZ2VFbWl0c09yUHJvcHNPcHRpb25zKHRvLCBmcm9tKSB7XG4gIGlmICh0bykge1xuICAgIGlmIChpc0FycmF5KHRvKSAmJiBpc0FycmF5KGZyb20pKSB7XG4gICAgICByZXR1cm4gWy4uLi8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFsuLi50bywgLi4uZnJvbV0pXTtcbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuZChcbiAgICAgIC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgbm9ybWFsaXplUHJvcHNPckVtaXRzKHRvKSxcbiAgICAgIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhmcm9tICE9IG51bGwgPyBmcm9tIDoge30pXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnJvbTtcbiAgfVxufVxuZnVuY3Rpb24gbWVyZ2VXYXRjaE9wdGlvbnModG8sIGZyb20pIHtcbiAgaWYgKCF0bylcbiAgICByZXR1cm4gZnJvbTtcbiAgaWYgKCFmcm9tKVxuICAgIHJldHVybiB0bztcbiAgY29uc3QgbWVyZ2VkID0gZXh0ZW5kKC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0byk7XG4gIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICBtZXJnZWRba2V5XSA9IG1lcmdlQXNBcnJheSh0b1trZXldLCBmcm9tW2tleV0pO1xuICB9XG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFwcENvbnRleHQoKSB7XG4gIHJldHVybiB7XG4gICAgYXBwOiBudWxsLFxuICAgIGNvbmZpZzoge1xuICAgICAgaXNOYXRpdmVUYWc6IE5PLFxuICAgICAgcGVyZm9ybWFuY2U6IGZhbHNlLFxuICAgICAgZ2xvYmFsUHJvcGVydGllczoge30sXG4gICAgICBvcHRpb25NZXJnZVN0cmF0ZWdpZXM6IHt9LFxuICAgICAgZXJyb3JIYW5kbGVyOiB2b2lkIDAsXG4gICAgICB3YXJuSGFuZGxlcjogdm9pZCAwLFxuICAgICAgY29tcGlsZXJPcHRpb25zOiB7fVxuICAgIH0sXG4gICAgbWl4aW5zOiBbXSxcbiAgICBjb21wb25lbnRzOiB7fSxcbiAgICBkaXJlY3RpdmVzOiB7fSxcbiAgICBwcm92aWRlczogLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgb3B0aW9uc0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSxcbiAgICBwcm9wc0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSxcbiAgICBlbWl0c0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKVxuICB9O1xufVxubGV0IHVpZCQxID0gMDtcbmZ1bmN0aW9uIGNyZWF0ZUFwcEFQSShyZW5kZXIsIGh5ZHJhdGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZUFwcChyb290Q29tcG9uZW50LCByb290UHJvcHMgPSBudWxsKSB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKHJvb3RDb21wb25lbnQpKSB7XG4gICAgICByb290Q29tcG9uZW50ID0gZXh0ZW5kKHt9LCByb290Q29tcG9uZW50KTtcbiAgICB9XG4gICAgaWYgKHJvb3RQcm9wcyAhPSBudWxsICYmICFpc09iamVjdChyb290UHJvcHMpKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShgcm9vdCBwcm9wcyBwYXNzZWQgdG8gYXBwLm1vdW50KCkgbXVzdCBiZSBhbiBvYmplY3QuYCk7XG4gICAgICByb290UHJvcHMgPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0ID0gY3JlYXRlQXBwQ29udGV4dCgpO1xuICAgIGNvbnN0IGluc3RhbGxlZFBsdWdpbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTtcbiAgICBsZXQgaXNNb3VudGVkID0gZmFsc2U7XG4gICAgY29uc3QgYXBwID0gY29udGV4dC5hcHAgPSB7XG4gICAgICBfdWlkOiB1aWQkMSsrLFxuICAgICAgX2NvbXBvbmVudDogcm9vdENvbXBvbmVudCxcbiAgICAgIF9wcm9wczogcm9vdFByb3BzLFxuICAgICAgX2NvbnRhaW5lcjogbnVsbCxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0LFxuICAgICAgX2luc3RhbmNlOiBudWxsLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGdldCBjb25maWcoKSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmNvbmZpZztcbiAgICAgIH0sXG4gICAgICBzZXQgY29uZmlnKHYpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgYXBwLmNvbmZpZyBjYW5ub3QgYmUgcmVwbGFjZWQuIE1vZGlmeSBpbmRpdmlkdWFsIG9wdGlvbnMgaW5zdGVhZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZShwbHVnaW4sIC4uLm9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGluc3RhbGxlZFBsdWdpbnMuaGFzKHBsdWdpbikpIHtcbiAgICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShgUGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0YXJnZXQgYXBwLmApO1xuICAgICAgICB9IGVsc2UgaWYgKHBsdWdpbiAmJiBpc0Z1bmN0aW9uKHBsdWdpbi5pbnN0YWxsKSkge1xuICAgICAgICAgIGluc3RhbGxlZFBsdWdpbnMuYWRkKHBsdWdpbik7XG4gICAgICAgICAgcGx1Z2luLmluc3RhbGwoYXBwLCAuLi5vcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHBsdWdpbikpIHtcbiAgICAgICAgICBpbnN0YWxsZWRQbHVnaW5zLmFkZChwbHVnaW4pO1xuICAgICAgICAgIHBsdWdpbihhcHAsIC4uLm9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQSBwbHVnaW4gbXVzdCBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhbiBcImluc3RhbGxcIiBmdW5jdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIG1peGluKG1peGluKSB7XG4gICAgICAgIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fKSB7XG4gICAgICAgICAgaWYgKCFjb250ZXh0Lm1peGlucy5pbmNsdWRlcyhtaXhpbikpIHtcbiAgICAgICAgICAgIGNvbnRleHQubWl4aW5zLnB1c2gobWl4aW4pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBcIk1peGluIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0YXJnZXQgYXBwXCIgKyAobWl4aW4ubmFtZSA/IGA6ICR7bWl4aW4ubmFtZX1gIDogXCJcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXCJNaXhpbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIGJ1aWxkcyBzdXBwb3J0aW5nIE9wdGlvbnMgQVBJXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9LFxuICAgICAgY29tcG9uZW50KG5hbWUsIGNvbXBvbmVudCkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShuYW1lLCBjb250ZXh0LmNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5jb21wb25lbnRzW25hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXSkge1xuICAgICAgICAgIHdhcm4kMShgQ29tcG9uZW50IFwiJHtuYW1lfVwiIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBpbiB0YXJnZXQgYXBwLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXSA9IGNvbXBvbmVudDtcbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBkaXJlY3RpdmUobmFtZSwgZGlyZWN0aXZlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgdmFsaWRhdGVEaXJlY3RpdmVOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGlyZWN0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlyZWN0aXZlc1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV0pIHtcbiAgICAgICAgICB3YXJuJDEoYERpcmVjdGl2ZSBcIiR7bmFtZX1cIiBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgaW4gdGFyZ2V0IGFwcC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV0gPSBkaXJlY3RpdmU7XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9LFxuICAgICAgbW91bnQocm9vdENvbnRhaW5lciwgaXNIeWRyYXRlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgaWYgKCFpc01vdW50ZWQpIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiByb290Q29udGFpbmVyLl9fdnVlX2FwcF9fKSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIGBUaGVyZSBpcyBhbHJlYWR5IGFuIGFwcCBpbnN0YW5jZSBtb3VudGVkIG9uIHRoZSBob3N0IGNvbnRhaW5lci5cbiBJZiB5b3Ugd2FudCB0byBtb3VudCBhbm90aGVyIGFwcCBvbiB0aGUgc2FtZSBob3N0IGNvbnRhaW5lciwgeW91IG5lZWQgdG8gdW5tb3VudCB0aGUgcHJldmlvdXMgYXBwIGJ5IGNhbGxpbmcgXFxgYXBwLnVubW91bnQoKVxcYCBmaXJzdC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKHJvb3RDb21wb25lbnQsIHJvb3RQcm9wcyk7XG4gICAgICAgICAgdm5vZGUuYXBwQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgbmFtZXNwYWNlID0gXCJzdmdcIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVzcGFjZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG5hbWVzcGFjZSA9IHZvaWQgMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIGNvbnRleHQucmVsb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICByZW5kZXIoXG4gICAgICAgICAgICAgICAgY2xvbmVWTm9kZSh2bm9kZSksXG4gICAgICAgICAgICAgICAgcm9vdENvbnRhaW5lcixcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0h5ZHJhdGUgJiYgaHlkcmF0ZSkge1xuICAgICAgICAgICAgaHlkcmF0ZSh2bm9kZSwgcm9vdENvbnRhaW5lcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbmRlcih2bm9kZSwgcm9vdENvbnRhaW5lciwgbmFtZXNwYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaXNNb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgICBhcHAuX2NvbnRhaW5lciA9IHJvb3RDb250YWluZXI7XG4gICAgICAgICAgcm9vdENvbnRhaW5lci5fX3Z1ZV9hcHBfXyA9IGFwcDtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgICAgIGFwcC5faW5zdGFuY2UgPSB2bm9kZS5jb21wb25lbnQ7XG4gICAgICAgICAgICBkZXZ0b29sc0luaXRBcHAoYXBwLCB2ZXJzaW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGdldEV4cG9zZVByb3h5KHZub2RlLmNvbXBvbmVudCkgfHwgdm5vZGUuY29tcG9uZW50LnByb3h5O1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQXBwIGhhcyBhbHJlYWR5IGJlZW4gbW91bnRlZC5cbklmIHlvdSB3YW50IHRvIHJlbW91bnQgdGhlIHNhbWUgYXBwLCBtb3ZlIHlvdXIgYXBwIGNyZWF0aW9uIGxvZ2ljIGludG8gYSBmYWN0b3J5IGZ1bmN0aW9uIGFuZCBjcmVhdGUgZnJlc2ggYXBwIGluc3RhbmNlcyBmb3IgZWFjaCBtb3VudCAtIGUuZy4gXFxgY29uc3QgY3JlYXRlTXlBcHAgPSAoKSA9PiBjcmVhdGVBcHAoQXBwKVxcYGBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdW5tb3VudCgpIHtcbiAgICAgICAgaWYgKGlzTW91bnRlZCkge1xuICAgICAgICAgIHJlbmRlcihudWxsLCBhcHAuX2NvbnRhaW5lcik7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICBhcHAuX2luc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICAgIGRldnRvb2xzVW5tb3VudEFwcChhcHApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgYXBwLl9jb250YWluZXIuX192dWVfYXBwX187XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHdhcm4kMShgQ2Fubm90IHVubW91bnQgYW4gYXBwIHRoYXQgaXMgbm90IG1vdW50ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm92aWRlKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5IGluIGNvbnRleHQucHJvdmlkZXMpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQXBwIGFscmVhZHkgcHJvdmlkZXMgcHJvcGVydHkgd2l0aCBrZXkgXCIke1N0cmluZyhrZXkpfVwiLiBJdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyB2YWx1ZS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LnByb3ZpZGVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBydW5XaXRoQ29udGV4dChmbikge1xuICAgICAgICBjdXJyZW50QXBwID0gYXBwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmbigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGN1cnJlbnRBcHAgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gYXBwO1xuICB9O1xufVxubGV0IGN1cnJlbnRBcHAgPSBudWxsO1xuXG5mdW5jdGlvbiBwcm92aWRlKGtleSwgdmFsdWUpIHtcbiAgaWYgKCFjdXJyZW50SW5zdGFuY2UpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybiQxKGBwcm92aWRlKCkgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgc2V0dXAoKS5gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IHByb3ZpZGVzID0gY3VycmVudEluc3RhbmNlLnByb3ZpZGVzO1xuICAgIGNvbnN0IHBhcmVudFByb3ZpZGVzID0gY3VycmVudEluc3RhbmNlLnBhcmVudCAmJiBjdXJyZW50SW5zdGFuY2UucGFyZW50LnByb3ZpZGVzO1xuICAgIGlmIChwYXJlbnRQcm92aWRlcyA9PT0gcHJvdmlkZXMpIHtcbiAgICAgIHByb3ZpZGVzID0gY3VycmVudEluc3RhbmNlLnByb3ZpZGVzID0gT2JqZWN0LmNyZWF0ZShwYXJlbnRQcm92aWRlcyk7XG4gICAgfVxuICAgIHByb3ZpZGVzW2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gaW5qZWN0KGtleSwgZGVmYXVsdFZhbHVlLCB0cmVhdERlZmF1bHRBc0ZhY3RvcnkgPSBmYWxzZSkge1xuICBjb25zdCBpbnN0YW5jZSA9IGN1cnJlbnRJbnN0YW5jZSB8fCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG4gIGlmIChpbnN0YW5jZSB8fCBjdXJyZW50QXBwKSB7XG4gICAgY29uc3QgcHJvdmlkZXMgPSBpbnN0YW5jZSA/IGluc3RhbmNlLnBhcmVudCA9PSBudWxsID8gaW5zdGFuY2Uudm5vZGUuYXBwQ29udGV4dCAmJiBpbnN0YW5jZS52bm9kZS5hcHBDb250ZXh0LnByb3ZpZGVzIDogaW5zdGFuY2UucGFyZW50LnByb3ZpZGVzIDogY3VycmVudEFwcC5fY29udGV4dC5wcm92aWRlcztcbiAgICBpZiAocHJvdmlkZXMgJiYga2V5IGluIHByb3ZpZGVzKSB7XG4gICAgICByZXR1cm4gcHJvdmlkZXNba2V5XTtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICByZXR1cm4gdHJlYXREZWZhdWx0QXNGYWN0b3J5ICYmIGlzRnVuY3Rpb24oZGVmYXVsdFZhbHVlKSA/IGRlZmF1bHRWYWx1ZS5jYWxsKGluc3RhbmNlICYmIGluc3RhbmNlLnByb3h5KSA6IGRlZmF1bHRWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShgaW5qZWN0aW9uIFwiJHtTdHJpbmcoa2V5KX1cIiBub3QgZm91bmQuYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoYGluamVjdCgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkgb3IgZnVuY3Rpb25hbCBjb21wb25lbnRzLmApO1xuICB9XG59XG5mdW5jdGlvbiBoYXNJbmplY3Rpb25Db250ZXh0KCkge1xuICByZXR1cm4gISEoY3VycmVudEluc3RhbmNlIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSB8fCBjdXJyZW50QXBwKTtcbn1cblxuZnVuY3Rpb24gaW5pdFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgaXNTdGF0ZWZ1bCwgaXNTU1IgPSBmYWxzZSkge1xuICBjb25zdCBwcm9wcyA9IHt9O1xuICBjb25zdCBhdHRycyA9IHt9O1xuICBkZWYoYXR0cnMsIEludGVybmFsT2JqZWN0S2V5LCAxKTtcbiAgaW5zdGFuY2UucHJvcHNEZWZhdWx0cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBpbnN0YW5jZS5wcm9wc09wdGlvbnNbMF0pIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvcHMpKSB7XG4gICAgICBwcm9wc1trZXldID0gdm9pZCAwO1xuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHZhbGlkYXRlUHJvcHMocmF3UHJvcHMgfHwge30sIHByb3BzLCBpbnN0YW5jZSk7XG4gIH1cbiAgaWYgKGlzU3RhdGVmdWwpIHtcbiAgICBpbnN0YW5jZS5wcm9wcyA9IGlzU1NSID8gcHJvcHMgOiBzaGFsbG93UmVhY3RpdmUocHJvcHMpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW5zdGFuY2UudHlwZS5wcm9wcykge1xuICAgICAgaW5zdGFuY2UucHJvcHMgPSBhdHRycztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UucHJvcHMgPSBwcm9wcztcbiAgICB9XG4gIH1cbiAgaW5zdGFuY2UuYXR0cnMgPSBhdHRycztcbn1cbmZ1bmN0aW9uIGlzSW5IbXJDb250ZXh0KGluc3RhbmNlKSB7XG4gIHdoaWxlIChpbnN0YW5jZSkge1xuICAgIGlmIChpbnN0YW5jZS50eXBlLl9faG1ySWQpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnBhcmVudDtcbiAgfVxufVxuZnVuY3Rpb24gdXBkYXRlUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCByYXdQcmV2UHJvcHMsIG9wdGltaXplZCkge1xuICBjb25zdCB7XG4gICAgcHJvcHMsXG4gICAgYXR0cnMsXG4gICAgdm5vZGU6IHsgcGF0Y2hGbGFnIH1cbiAgfSA9IGluc3RhbmNlO1xuICBjb25zdCByYXdDdXJyZW50UHJvcHMgPSB0b1Jhdyhwcm9wcyk7XG4gIGNvbnN0IFtvcHRpb25zXSA9IGluc3RhbmNlLnByb3BzT3B0aW9ucztcbiAgbGV0IGhhc0F0dHJzQ2hhbmdlZCA9IGZhbHNlO1xuICBpZiAoXG4gICAgLy8gYWx3YXlzIGZvcmNlIGZ1bGwgZGlmZiBpbiBkZXZcbiAgICAvLyAtICMxOTQyIGlmIGhtciBpcyBlbmFibGVkIHdpdGggc2ZjIGNvbXBvbmVudFxuICAgIC8vIC0gdml0ZSM4NzIgbm9uLXNmYyBjb21wb25lbnQgdXNlZCBieSBzZmMgY29tcG9uZW50XG4gICAgISghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSW5IbXJDb250ZXh0KGluc3RhbmNlKSkgJiYgKG9wdGltaXplZCB8fCBwYXRjaEZsYWcgPiAwKSAmJiAhKHBhdGNoRmxhZyAmIDE2KVxuICApIHtcbiAgICBpZiAocGF0Y2hGbGFnICYgOCkge1xuICAgICAgY29uc3QgcHJvcHNUb1VwZGF0ZSA9IGluc3RhbmNlLnZub2RlLmR5bmFtaWNQcm9wcztcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHNUb1VwZGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQga2V5ID0gcHJvcHNUb1VwZGF0ZVtpXTtcbiAgICAgICAgaWYgKGlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3UHJvcHNba2V5XTtcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoaGFzT3duKGF0dHJzLCBrZXkpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjYW1lbGl6ZWRLZXkgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgICAgICAgcHJvcHNbY2FtZWxpemVkS2V5XSA9IHJlc29sdmVQcm9wVmFsdWUoXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIHJhd0N1cnJlbnRQcm9wcyxcbiAgICAgICAgICAgICAgY2FtZWxpemVkS2V5LFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgIGF0dHJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpKSB7XG4gICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBsZXQga2ViYWJLZXk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcmF3Q3VycmVudFByb3BzKSB7XG4gICAgICBpZiAoIXJhd1Byb3BzIHx8IC8vIGZvciBjYW1lbENhc2VcbiAgICAgICFoYXNPd24ocmF3UHJvcHMsIGtleSkgJiYgLy8gaXQncyBwb3NzaWJsZSB0aGUgb3JpZ2luYWwgcHJvcHMgd2FzIHBhc3NlZCBpbiBhcyBrZWJhYi1jYXNlXG4gICAgICAvLyBhbmQgY29udmVydGVkIHRvIGNhbWVsQ2FzZSAoIzk1NSlcbiAgICAgICgoa2ViYWJLZXkgPSBoeXBoZW5hdGUoa2V5KSkgPT09IGtleSB8fCAhaGFzT3duKHJhd1Byb3BzLCBrZWJhYktleSkpKSB7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKHJhd1ByZXZQcm9wcyAmJiAvLyBmb3IgY2FtZWxDYXNlXG4gICAgICAgICAgKHJhd1ByZXZQcm9wc1trZXldICE9PSB2b2lkIDAgfHwgLy8gZm9yIGtlYmFiLWNhc2VcbiAgICAgICAgICByYXdQcmV2UHJvcHNba2ViYWJLZXldICE9PSB2b2lkIDApKSB7XG4gICAgICAgICAgICBwcm9wc1trZXldID0gcmVzb2x2ZVByb3BWYWx1ZShcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgcmF3Q3VycmVudFByb3BzLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBwcm9wc1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhdHRycyAhPT0gcmF3Q3VycmVudFByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgICAgICBpZiAoIXJhd1Byb3BzIHx8ICFoYXNPd24ocmF3UHJvcHMsIGtleSkgJiYgdHJ1ZSkge1xuICAgICAgICAgIGRlbGV0ZSBhdHRyc1trZXldO1xuICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGhhc0F0dHJzQ2hhbmdlZCkge1xuICAgIHRyaWdnZXIoaW5zdGFuY2UsIFwic2V0XCIsIFwiJGF0dHJzXCIpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgdmFsaWRhdGVQcm9wcyhyYXdQcm9wcyB8fCB7fSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0RnVsbFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcHJvcHMsIGF0dHJzKSB7XG4gIGNvbnN0IFtvcHRpb25zLCBuZWVkQ2FzdEtleXNdID0gaW5zdGFuY2UucHJvcHNPcHRpb25zO1xuICBsZXQgaGFzQXR0cnNDaGFuZ2VkID0gZmFsc2U7XG4gIGxldCByYXdDYXN0VmFsdWVzO1xuICBpZiAocmF3UHJvcHMpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gcmF3UHJvcHMpIHtcbiAgICAgIGlmIChpc1Jlc2VydmVkUHJvcChrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSByYXdQcm9wc1trZXldO1xuICAgICAgbGV0IGNhbWVsS2V5O1xuICAgICAgaWYgKG9wdGlvbnMgJiYgaGFzT3duKG9wdGlvbnMsIGNhbWVsS2V5ID0gY2FtZWxpemUoa2V5KSkpIHtcbiAgICAgICAgaWYgKCFuZWVkQ2FzdEtleXMgfHwgIW5lZWRDYXN0S2V5cy5pbmNsdWRlcyhjYW1lbEtleSkpIHtcbiAgICAgICAgICBwcm9wc1tjYW1lbEtleV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAocmF3Q2FzdFZhbHVlcyB8fCAocmF3Q2FzdFZhbHVlcyA9IHt9KSlbY2FtZWxLZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gYXR0cnMpIHx8IHZhbHVlICE9PSBhdHRyc1trZXldKSB7XG4gICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG5lZWRDYXN0S2V5cykge1xuICAgIGNvbnN0IHJhd0N1cnJlbnRQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICBjb25zdCBjYXN0VmFsdWVzID0gcmF3Q2FzdFZhbHVlcyB8fCBFTVBUWV9PQko7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZWVkQ2FzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IG5lZWRDYXN0S2V5c1tpXTtcbiAgICAgIHByb3BzW2tleV0gPSByZXNvbHZlUHJvcFZhbHVlKFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICByYXdDdXJyZW50UHJvcHMsXG4gICAgICAgIGtleSxcbiAgICAgICAgY2FzdFZhbHVlc1trZXldLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgIWhhc093bihjYXN0VmFsdWVzLCBrZXkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzQXR0cnNDaGFuZ2VkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVByb3BWYWx1ZShvcHRpb25zLCBwcm9wcywga2V5LCB2YWx1ZSwgaW5zdGFuY2UsIGlzQWJzZW50KSB7XG4gIGNvbnN0IG9wdCA9IG9wdGlvbnNba2V5XTtcbiAgaWYgKG9wdCAhPSBudWxsKSB7XG4gICAgY29uc3QgaGFzRGVmYXVsdCA9IGhhc093bihvcHQsIFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoaGFzRGVmYXVsdCAmJiB2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBvcHQuZGVmYXVsdDtcbiAgICAgIGlmIChvcHQudHlwZSAhPT0gRnVuY3Rpb24gJiYgIW9wdC5za2lwRmFjdG9yeSAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgeyBwcm9wc0RlZmF1bHRzIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgaWYgKGtleSBpbiBwcm9wc0RlZmF1bHRzKSB7XG4gICAgICAgICAgdmFsdWUgPSBwcm9wc0RlZmF1bHRzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICAgIHZhbHVlID0gcHJvcHNEZWZhdWx0c1trZXldID0gZGVmYXVsdFZhbHVlLmNhbGwoXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3B0WzAgLyogc2hvdWxkQ2FzdCAqL10pIHtcbiAgICAgIGlmIChpc0Fic2VudCAmJiAhaGFzRGVmYXVsdCkge1xuICAgICAgICB2YWx1ZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChvcHRbMSAvKiBzaG91bGRDYXN0VHJ1ZSAqL10gJiYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlID09PSBoeXBoZW5hdGUoa2V5KSkpIHtcbiAgICAgICAgdmFsdWUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBub3JtYWxpemVQcm9wc09wdGlvbnMoY29tcCwgYXBwQ29udGV4dCwgYXNNaXhpbiA9IGZhbHNlKSB7XG4gIGNvbnN0IGNhY2hlID0gYXBwQ29udGV4dC5wcm9wc0NhY2hlO1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoY29tcCk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHJhdyA9IGNvbXAucHJvcHM7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fTtcbiAgY29uc3QgbmVlZENhc3RLZXlzID0gW107XG4gIGxldCBoYXNFeHRlbmRzID0gZmFsc2U7XG4gIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fICYmICFpc0Z1bmN0aW9uKGNvbXApKSB7XG4gICAgY29uc3QgZXh0ZW5kUHJvcHMgPSAocmF3MikgPT4ge1xuICAgICAgaGFzRXh0ZW5kcyA9IHRydWU7XG4gICAgICBjb25zdCBbcHJvcHMsIGtleXNdID0gbm9ybWFsaXplUHJvcHNPcHRpb25zKHJhdzIsIGFwcENvbnRleHQsIHRydWUpO1xuICAgICAgZXh0ZW5kKG5vcm1hbGl6ZWQsIHByb3BzKTtcbiAgICAgIGlmIChrZXlzKVxuICAgICAgICBuZWVkQ2FzdEtleXMucHVzaCguLi5rZXlzKTtcbiAgICB9O1xuICAgIGlmICghYXNNaXhpbiAmJiBhcHBDb250ZXh0Lm1peGlucy5sZW5ndGgpIHtcbiAgICAgIGFwcENvbnRleHQubWl4aW5zLmZvckVhY2goZXh0ZW5kUHJvcHMpO1xuICAgIH1cbiAgICBpZiAoY29tcC5leHRlbmRzKSB7XG4gICAgICBleHRlbmRQcm9wcyhjb21wLmV4dGVuZHMpO1xuICAgIH1cbiAgICBpZiAoY29tcC5taXhpbnMpIHtcbiAgICAgIGNvbXAubWl4aW5zLmZvckVhY2goZXh0ZW5kUHJvcHMpO1xuICAgIH1cbiAgfVxuICBpZiAoIXJhdyAmJiAhaGFzRXh0ZW5kcykge1xuICAgIGlmIChpc09iamVjdChjb21wKSkge1xuICAgICAgY2FjaGUuc2V0KGNvbXAsIEVNUFRZX0FSUik7XG4gICAgfVxuICAgIHJldHVybiBFTVBUWV9BUlI7XG4gIH1cbiAgaWYgKGlzQXJyYXkocmF3KSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNTdHJpbmcocmF3W2ldKSkge1xuICAgICAgICB3YXJuJDEoYHByb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC5gLCByYXdbaV0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9ybWFsaXplZEtleSA9IGNhbWVsaXplKHJhd1tpXSk7XG4gICAgICBpZiAodmFsaWRhdGVQcm9wTmFtZShub3JtYWxpemVkS2V5KSkge1xuICAgICAgICBub3JtYWxpemVkW25vcm1hbGl6ZWRLZXldID0gRU1QVFlfT0JKO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChyYXcpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNPYmplY3QocmF3KSkge1xuICAgICAgd2FybiQxKGBpbnZhbGlkIHByb3BzIG9wdGlvbnNgLCByYXcpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiByYXcpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgaWYgKHZhbGlkYXRlUHJvcE5hbWUobm9ybWFsaXplZEtleSkpIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gcmF3W2tleV07XG4gICAgICAgIGNvbnN0IHByb3AgPSBub3JtYWxpemVkW25vcm1hbGl6ZWRLZXldID0gaXNBcnJheShvcHQpIHx8IGlzRnVuY3Rpb24ob3B0KSA/IHsgdHlwZTogb3B0IH0gOiBleHRlbmQoe30sIG9wdCk7XG4gICAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgICAgY29uc3QgYm9vbGVhbkluZGV4ID0gZ2V0VHlwZUluZGV4KEJvb2xlYW4sIHByb3AudHlwZSk7XG4gICAgICAgICAgY29uc3Qgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpO1xuICAgICAgICAgIHByb3BbMCAvKiBzaG91bGRDYXN0ICovXSA9IGJvb2xlYW5JbmRleCA+IC0xO1xuICAgICAgICAgIHByb3BbMSAvKiBzaG91bGRDYXN0VHJ1ZSAqL10gPSBzdHJpbmdJbmRleCA8IDAgfHwgYm9vbGVhbkluZGV4IDwgc3RyaW5nSW5kZXg7XG4gICAgICAgICAgaWYgKGJvb2xlYW5JbmRleCA+IC0xIHx8IGhhc093bihwcm9wLCBcImRlZmF1bHRcIikpIHtcbiAgICAgICAgICAgIG5lZWRDYXN0S2V5cy5wdXNoKG5vcm1hbGl6ZWRLZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCByZXMgPSBbbm9ybWFsaXplZCwgbmVlZENhc3RLZXlzXTtcbiAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgY2FjaGUuc2V0KGNvbXAsIHJlcyk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcE5hbWUoa2V5KSB7XG4gIGlmIChrZXlbMF0gIT09IFwiJFwiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4kMShgSW52YWxpZCBwcm9wIG5hbWU6IFwiJHtrZXl9XCIgaXMgYSByZXNlcnZlZCBwcm9wZXJ0eS5gKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBnZXRUeXBlKGN0b3IpIHtcbiAgY29uc3QgbWF0Y2ggPSBjdG9yICYmIGN0b3IudG9TdHJpbmcoKS5tYXRjaCgvXlxccyooZnVuY3Rpb258Y2xhc3MpIChcXHcrKS8pO1xuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsyXSA6IGN0b3IgPT09IG51bGwgPyBcIm51bGxcIiA6IFwiXCI7XG59XG5mdW5jdGlvbiBpc1NhbWVUeXBlKGEsIGIpIHtcbiAgcmV0dXJuIGdldFR5cGUoYSkgPT09IGdldFR5cGUoYik7XG59XG5mdW5jdGlvbiBnZXRUeXBlSW5kZXgodHlwZSwgZXhwZWN0ZWRUeXBlcykge1xuICBpZiAoaXNBcnJheShleHBlY3RlZFR5cGVzKSkge1xuICAgIHJldHVybiBleHBlY3RlZFR5cGVzLmZpbmRJbmRleCgodCkgPT4gaXNTYW1lVHlwZSh0LCB0eXBlKSk7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihleHBlY3RlZFR5cGVzKSkge1xuICAgIHJldHVybiBpc1NhbWVUeXBlKGV4cGVjdGVkVHlwZXMsIHR5cGUpID8gMCA6IC0xO1xuICB9XG4gIHJldHVybiAtMTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcHMocmF3UHJvcHMsIHByb3BzLCBpbnN0YW5jZSkge1xuICBjb25zdCByZXNvbHZlZFZhbHVlcyA9IHRvUmF3KHByb3BzKTtcbiAgY29uc3Qgb3B0aW9ucyA9IGluc3RhbmNlLnByb3BzT3B0aW9uc1swXTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucykge1xuICAgIGxldCBvcHQgPSBvcHRpb25zW2tleV07XG4gICAgaWYgKG9wdCA9PSBudWxsKVxuICAgICAgY29udGludWU7XG4gICAgdmFsaWRhdGVQcm9wKFxuICAgICAga2V5LFxuICAgICAgcmVzb2x2ZWRWYWx1ZXNba2V5XSxcbiAgICAgIG9wdCxcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkocmVzb2x2ZWRWYWx1ZXMpIDogcmVzb2x2ZWRWYWx1ZXMsXG4gICAgICAhaGFzT3duKHJhd1Byb3BzLCBrZXkpICYmICFoYXNPd24ocmF3UHJvcHMsIGh5cGhlbmF0ZShrZXkpKVxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcChuYW1lLCB2YWx1ZSwgcHJvcCwgcHJvcHMsIGlzQWJzZW50KSB7XG4gIGNvbnN0IHsgdHlwZSwgcmVxdWlyZWQsIHZhbGlkYXRvciwgc2tpcENoZWNrIH0gPSBwcm9wO1xuICBpZiAocmVxdWlyZWQgJiYgaXNBYnNlbnQpIHtcbiAgICB3YXJuJDEoJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogXCInICsgbmFtZSArICdcIicpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcmVxdWlyZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlICE9PSB0cnVlICYmICFza2lwQ2hlY2spIHtcbiAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuICAgIGNvbnN0IHR5cGVzID0gaXNBcnJheSh0eXBlKSA/IHR5cGUgOiBbdHlwZV07XG4gICAgY29uc3QgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoICYmICFpc1ZhbGlkOyBpKyspIHtcbiAgICAgIGNvbnN0IHsgdmFsaWQsIGV4cGVjdGVkVHlwZSB9ID0gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZXNbaV0pO1xuICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGV4cGVjdGVkVHlwZSB8fCBcIlwiKTtcbiAgICAgIGlzVmFsaWQgPSB2YWxpZDtcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB3YXJuJDEoZ2V0SW52YWxpZFR5cGVNZXNzYWdlKG5hbWUsIHZhbHVlLCBleHBlY3RlZFR5cGVzKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGlmICh2YWxpZGF0b3IgJiYgIXZhbGlkYXRvcih2YWx1ZSwgcHJvcHMpKSB7XG4gICAgd2FybiQxKCdJbnZhbGlkIHByb3A6IGN1c3RvbSB2YWxpZGF0b3IgY2hlY2sgZmFpbGVkIGZvciBwcm9wIFwiJyArIG5hbWUgKyAnXCIuJyk7XG4gIH1cbn1cbmNvbnN0IGlzU2ltcGxlVHlwZSA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFxuICBcIlN0cmluZyxOdW1iZXIsQm9vbGVhbixGdW5jdGlvbixTeW1ib2wsQmlnSW50XCJcbik7XG5mdW5jdGlvbiBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlKSB7XG4gIGxldCB2YWxpZDtcbiAgY29uc3QgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTtcbiAgaWYgKGlzU2ltcGxlVHlwZShleHBlY3RlZFR5cGUpKSB7XG4gICAgY29uc3QgdCA9IHR5cGVvZiB2YWx1ZTtcbiAgICB2YWxpZCA9IHQgPT09IGV4cGVjdGVkVHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghdmFsaWQgJiYgdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJPYmplY3RcIikge1xuICAgIHZhbGlkID0gaXNPYmplY3QodmFsdWUpO1xuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gXCJBcnJheVwiKSB7XG4gICAgdmFsaWQgPSBpc0FycmF5KHZhbHVlKTtcbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwibnVsbFwiKSB7XG4gICAgdmFsaWQgPSB2YWx1ZSA9PT0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHZhbGlkLFxuICAgIGV4cGVjdGVkVHlwZVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0SW52YWxpZFR5cGVNZXNzYWdlKG5hbWUsIHZhbHVlLCBleHBlY3RlZFR5cGVzKSB7XG4gIGlmIChleHBlY3RlZFR5cGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBgUHJvcCB0eXBlIFtdIGZvciBwcm9wIFwiJHtuYW1lfVwiIHdvbid0IG1hdGNoIGFueXRoaW5nLiBEaWQgeW91IG1lYW4gdG8gdXNlIHR5cGUgQXJyYXkgaW5zdGVhZD9gO1xuICB9XG4gIGxldCBtZXNzYWdlID0gYEludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCIke25hbWV9XCIuIEV4cGVjdGVkICR7ZXhwZWN0ZWRUeXBlcy5tYXAoY2FwaXRhbGl6ZSkuam9pbihcIiB8IFwiKX1gO1xuICBjb25zdCBleHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGVzWzBdO1xuICBjb25zdCByZWNlaXZlZFR5cGUgPSB0b1Jhd1R5cGUodmFsdWUpO1xuICBjb25zdCBleHBlY3RlZFZhbHVlID0gc3R5bGVWYWx1ZSh2YWx1ZSwgZXhwZWN0ZWRUeXBlKTtcbiAgY29uc3QgcmVjZWl2ZWRWYWx1ZSA9IHN0eWxlVmFsdWUodmFsdWUsIHJlY2VpdmVkVHlwZSk7XG4gIGlmIChleHBlY3RlZFR5cGVzLmxlbmd0aCA9PT0gMSAmJiBpc0V4cGxpY2FibGUoZXhwZWN0ZWRUeXBlKSAmJiAhaXNCb29sZWFuKGV4cGVjdGVkVHlwZSwgcmVjZWl2ZWRUeXBlKSkge1xuICAgIG1lc3NhZ2UgKz0gYCB3aXRoIHZhbHVlICR7ZXhwZWN0ZWRWYWx1ZX1gO1xuICB9XG4gIG1lc3NhZ2UgKz0gYCwgZ290ICR7cmVjZWl2ZWRUeXBlfSBgO1xuICBpZiAoaXNFeHBsaWNhYmxlKHJlY2VpdmVkVHlwZSkpIHtcbiAgICBtZXNzYWdlICs9IGB3aXRoIHZhbHVlICR7cmVjZWl2ZWRWYWx1ZX0uYDtcbiAgfVxuICByZXR1cm4gbWVzc2FnZTtcbn1cbmZ1bmN0aW9uIHN0eWxlVmFsdWUodmFsdWUsIHR5cGUpIHtcbiAgaWYgKHR5cGUgPT09IFwiU3RyaW5nXCIpIHtcbiAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJOdW1iZXJcIikge1xuICAgIHJldHVybiBgJHtOdW1iZXIodmFsdWUpfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzRXhwbGljYWJsZSh0eXBlKSB7XG4gIGNvbnN0IGV4cGxpY2l0VHlwZXMgPSBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCJdO1xuICByZXR1cm4gZXhwbGljaXRUeXBlcy5zb21lKChlbGVtKSA9PiB0eXBlLnRvTG93ZXJDYXNlKCkgPT09IGVsZW0pO1xufVxuZnVuY3Rpb24gaXNCb29sZWFuKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3Muc29tZSgoZWxlbSkgPT4gZWxlbS50b0xvd2VyQ2FzZSgpID09PSBcImJvb2xlYW5cIik7XG59XG5cbmNvbnN0IGlzSW50ZXJuYWxLZXkgPSAoa2V5KSA9PiBrZXlbMF0gPT09IFwiX1wiIHx8IGtleSA9PT0gXCIkc3RhYmxlXCI7XG5jb25zdCBub3JtYWxpemVTbG90VmFsdWUgPSAodmFsdWUpID0+IGlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKG5vcm1hbGl6ZVZOb2RlKSA6IFtub3JtYWxpemVWTm9kZSh2YWx1ZSldO1xuY29uc3Qgbm9ybWFsaXplU2xvdCA9IChrZXksIHJhd1Nsb3QsIGN0eCkgPT4ge1xuICBpZiAocmF3U2xvdC5fbikge1xuICAgIHJldHVybiByYXdTbG90O1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB3aXRoQ3R4KCguLi5hcmdzKSA9PiB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY3VycmVudEluc3RhbmNlKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBTbG90IFwiJHtrZXl9XCIgaW52b2tlZCBvdXRzaWRlIG9mIHRoZSByZW5kZXIgZnVuY3Rpb246IHRoaXMgd2lsbCBub3QgdHJhY2sgZGVwZW5kZW5jaWVzIHVzZWQgaW4gdGhlIHNsb3QuIEludm9rZSB0aGUgc2xvdCBmdW5jdGlvbiBpbnNpZGUgdGhlIHJlbmRlciBmdW5jdGlvbiBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVTbG90VmFsdWUocmF3U2xvdCguLi5hcmdzKSk7XG4gIH0sIGN0eCk7XG4gIG5vcm1hbGl6ZWQuX2MgPSBmYWxzZTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59O1xuY29uc3Qgbm9ybWFsaXplT2JqZWN0U2xvdHMgPSAocmF3U2xvdHMsIHNsb3RzLCBpbnN0YW5jZSkgPT4ge1xuICBjb25zdCBjdHggPSByYXdTbG90cy5fY3R4O1xuICBmb3IgKGNvbnN0IGtleSBpbiByYXdTbG90cykge1xuICAgIGlmIChpc0ludGVybmFsS2V5KGtleSkpXG4gICAgICBjb250aW51ZTtcbiAgICBjb25zdCB2YWx1ZSA9IHJhd1Nsb3RzW2tleV07XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICBzbG90c1trZXldID0gbm9ybWFsaXplU2xvdChrZXksIHZhbHVlLCBjdHgpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHJ1ZSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYE5vbi1mdW5jdGlvbiB2YWx1ZSBlbmNvdW50ZXJlZCBmb3Igc2xvdCBcIiR7a2V5fVwiLiBQcmVmZXIgZnVuY3Rpb24gc2xvdHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplU2xvdFZhbHVlKHZhbHVlKTtcbiAgICAgIHNsb3RzW2tleV0gPSAoKSA9PiBub3JtYWxpemVkO1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IG5vcm1hbGl6ZVZOb2RlU2xvdHMgPSAoaW5zdGFuY2UsIGNoaWxkcmVuKSA9PiB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0tlZXBBbGl2ZShpbnN0YW5jZS52bm9kZSkgJiYgdHJ1ZSkge1xuICAgIHdhcm4kMShcbiAgICAgIGBOb24tZnVuY3Rpb24gdmFsdWUgZW5jb3VudGVyZWQgZm9yIGRlZmF1bHQgc2xvdC4gUHJlZmVyIGZ1bmN0aW9uIHNsb3RzIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuYFxuICAgICk7XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNsb3RWYWx1ZShjaGlsZHJlbik7XG4gIGluc3RhbmNlLnNsb3RzLmRlZmF1bHQgPSAoKSA9PiBub3JtYWxpemVkO1xufTtcbmNvbnN0IGluaXRTbG90cyA9IChpbnN0YW5jZSwgY2hpbGRyZW4pID0+IHtcbiAgaWYgKGluc3RhbmNlLnZub2RlLnNoYXBlRmxhZyAmIDMyKSB7XG4gICAgY29uc3QgdHlwZSA9IGNoaWxkcmVuLl87XG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIGluc3RhbmNlLnNsb3RzID0gdG9SYXcoY2hpbGRyZW4pO1xuICAgICAgZGVmKGNoaWxkcmVuLCBcIl9cIiwgdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vcm1hbGl6ZU9iamVjdFNsb3RzKFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgaW5zdGFuY2Uuc2xvdHMgPSB7fSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGluc3RhbmNlLnNsb3RzID0ge307XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBub3JtYWxpemVWTm9kZVNsb3RzKGluc3RhbmNlLCBjaGlsZHJlbik7XG4gICAgfVxuICB9XG4gIGRlZihpbnN0YW5jZS5zbG90cywgSW50ZXJuYWxPYmplY3RLZXksIDEpO1xufTtcbmNvbnN0IHVwZGF0ZVNsb3RzID0gKGluc3RhbmNlLCBjaGlsZHJlbiwgb3B0aW1pemVkKSA9PiB7XG4gIGNvbnN0IHsgdm5vZGUsIHNsb3RzIH0gPSBpbnN0YW5jZTtcbiAgbGV0IG5lZWREZWxldGlvbkNoZWNrID0gdHJ1ZTtcbiAgbGV0IGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldCA9IEVNUFRZX09CSjtcbiAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDMyKSB7XG4gICAgY29uc3QgdHlwZSA9IGNoaWxkcmVuLl87XG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSG1yVXBkYXRpbmcpIHtcbiAgICAgICAgZXh0ZW5kKHNsb3RzLCBjaGlsZHJlbik7XG4gICAgICAgIHRyaWdnZXIoaW5zdGFuY2UsIFwic2V0XCIsIFwiJHNsb3RzXCIpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpbWl6ZWQgJiYgdHlwZSA9PT0gMSkge1xuICAgICAgICBuZWVkRGVsZXRpb25DaGVjayA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXh0ZW5kKHNsb3RzLCBjaGlsZHJlbik7XG4gICAgICAgIGlmICghb3B0aW1pemVkICYmIHR5cGUgPT09IDEpIHtcbiAgICAgICAgICBkZWxldGUgc2xvdHMuXztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZWVkRGVsZXRpb25DaGVjayA9ICFjaGlsZHJlbi4kc3RhYmxlO1xuICAgICAgbm9ybWFsaXplT2JqZWN0U2xvdHMoY2hpbGRyZW4sIHNsb3RzKTtcbiAgICB9XG4gICAgZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0ID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW4pIHtcbiAgICBub3JtYWxpemVWTm9kZVNsb3RzKGluc3RhbmNlLCBjaGlsZHJlbik7XG4gICAgZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0ID0geyBkZWZhdWx0OiAxIH07XG4gIH1cbiAgaWYgKG5lZWREZWxldGlvbkNoZWNrKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2xvdHMpIHtcbiAgICAgIGlmICghaXNJbnRlcm5hbEtleShrZXkpICYmIGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldFtrZXldID09IG51bGwpIHtcbiAgICAgICAgZGVsZXRlIHNsb3RzW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBzZXRSZWYocmF3UmVmLCBvbGRSYXdSZWYsIHBhcmVudFN1c3BlbnNlLCB2bm9kZSwgaXNVbm1vdW50ID0gZmFsc2UpIHtcbiAgaWYgKGlzQXJyYXkocmF3UmVmKSkge1xuICAgIHJhd1JlZi5mb3JFYWNoKFxuICAgICAgKHIsIGkpID0+IHNldFJlZihcbiAgICAgICAgcixcbiAgICAgICAgb2xkUmF3UmVmICYmIChpc0FycmF5KG9sZFJhd1JlZikgPyBvbGRSYXdSZWZbaV0gOiBvbGRSYXdSZWYpLFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGlzVW5tb3VudFxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpc0FzeW5jV3JhcHBlcih2bm9kZSkgJiYgIWlzVW5tb3VudCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWZWYWx1ZSA9IHZub2RlLnNoYXBlRmxhZyAmIDQgPyBnZXRFeHBvc2VQcm94eSh2bm9kZS5jb21wb25lbnQpIHx8IHZub2RlLmNvbXBvbmVudC5wcm94eSA6IHZub2RlLmVsO1xuICBjb25zdCB2YWx1ZSA9IGlzVW5tb3VudCA/IG51bGwgOiByZWZWYWx1ZTtcbiAgY29uc3QgeyBpOiBvd25lciwgcjogcmVmIH0gPSByYXdSZWY7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFvd25lcikge1xuICAgIHdhcm4kMShcbiAgICAgIGBNaXNzaW5nIHJlZiBvd25lciBjb250ZXh0LiByZWYgY2Fubm90IGJlIHVzZWQgb24gaG9pc3RlZCB2bm9kZXMuIEEgdm5vZGUgd2l0aCByZWYgbXVzdCBiZSBjcmVhdGVkIGluc2lkZSB0aGUgcmVuZGVyIGZ1bmN0aW9uLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBvbGRSZWYgPSBvbGRSYXdSZWYgJiYgb2xkUmF3UmVmLnI7XG4gIGNvbnN0IHJlZnMgPSBvd25lci5yZWZzID09PSBFTVBUWV9PQkogPyBvd25lci5yZWZzID0ge30gOiBvd25lci5yZWZzO1xuICBjb25zdCBzZXR1cFN0YXRlID0gb3duZXIuc2V0dXBTdGF0ZTtcbiAgaWYgKG9sZFJlZiAhPSBudWxsICYmIG9sZFJlZiAhPT0gcmVmKSB7XG4gICAgaWYgKGlzU3RyaW5nKG9sZFJlZikpIHtcbiAgICAgIHJlZnNbb2xkUmVmXSA9IG51bGw7XG4gICAgICBpZiAoaGFzT3duKHNldHVwU3RhdGUsIG9sZFJlZikpIHtcbiAgICAgICAgc2V0dXBTdGF0ZVtvbGRSZWZdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzUmVmKG9sZFJlZikpIHtcbiAgICAgIG9sZFJlZi52YWx1ZSA9IG51bGw7XG4gICAgfVxuICB9XG4gIGlmIChpc0Z1bmN0aW9uKHJlZikpIHtcbiAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcocmVmLCBvd25lciwgMTIsIFt2YWx1ZSwgcmVmc10pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IF9pc1N0cmluZyA9IGlzU3RyaW5nKHJlZik7XG4gICAgY29uc3QgX2lzUmVmID0gaXNSZWYocmVmKTtcbiAgICBpZiAoX2lzU3RyaW5nIHx8IF9pc1JlZikge1xuICAgICAgY29uc3QgZG9TZXQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChyYXdSZWYuZikge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gX2lzU3RyaW5nID8gaGFzT3duKHNldHVwU3RhdGUsIHJlZikgPyBzZXR1cFN0YXRlW3JlZl0gOiByZWZzW3JlZl0gOiByZWYudmFsdWU7XG4gICAgICAgICAgaWYgKGlzVW5tb3VudCkge1xuICAgICAgICAgICAgaXNBcnJheShleGlzdGluZykgJiYgcmVtb3ZlKGV4aXN0aW5nLCByZWZWYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgICAgICAgICAgaWYgKF9pc1N0cmluZykge1xuICAgICAgICAgICAgICAgIHJlZnNbcmVmXSA9IFtyZWZWYWx1ZV07XG4gICAgICAgICAgICAgICAgaWYgKGhhc093bihzZXR1cFN0YXRlLCByZWYpKSB7XG4gICAgICAgICAgICAgICAgICBzZXR1cFN0YXRlW3JlZl0gPSByZWZzW3JlZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlZi52YWx1ZSA9IFtyZWZWYWx1ZV07XG4gICAgICAgICAgICAgICAgaWYgKHJhd1JlZi5rKVxuICAgICAgICAgICAgICAgICAgcmVmc1tyYXdSZWYua10gPSByZWYudmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nLmluY2x1ZGVzKHJlZlZhbHVlKSkge1xuICAgICAgICAgICAgICBleGlzdGluZy5wdXNoKHJlZlZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX2lzU3RyaW5nKSB7XG4gICAgICAgICAgcmVmc1tyZWZdID0gdmFsdWU7XG4gICAgICAgICAgaWYgKGhhc093bihzZXR1cFN0YXRlLCByZWYpKSB7XG4gICAgICAgICAgICBzZXR1cFN0YXRlW3JlZl0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX2lzUmVmKSB7XG4gICAgICAgICAgcmVmLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgaWYgKHJhd1JlZi5rKVxuICAgICAgICAgICAgcmVmc1tyYXdSZWYua10gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFwiSW52YWxpZCB0ZW1wbGF0ZSByZWYgdHlwZTpcIiwgcmVmLCBgKCR7dHlwZW9mIHJlZn0pYCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZG9TZXQuaWQgPSAtMTtcbiAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KGRvU2V0LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1NldCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybiQxKFwiSW52YWxpZCB0ZW1wbGF0ZSByZWYgdHlwZTpcIiwgcmVmLCBgKCR7dHlwZW9mIHJlZn0pYCk7XG4gICAgfVxuICB9XG59XG5cbmxldCBoYXNNaXNtYXRjaCA9IGZhbHNlO1xuY29uc3QgaXNTVkdDb250YWluZXIgPSAoY29udGFpbmVyKSA9PiBjb250YWluZXIubmFtZXNwYWNlVVJJLmluY2x1ZGVzKFwic3ZnXCIpICYmIGNvbnRhaW5lci50YWdOYW1lICE9PSBcImZvcmVpZ25PYmplY3RcIjtcbmNvbnN0IGlzTWF0aE1MQ29udGFpbmVyID0gKGNvbnRhaW5lcikgPT4gY29udGFpbmVyLm5hbWVzcGFjZVVSSS5pbmNsdWRlcyhcIk1hdGhNTFwiKTtcbmNvbnN0IGdldENvbnRhaW5lclR5cGUgPSAoY29udGFpbmVyKSA9PiB7XG4gIGlmIChpc1NWR0NvbnRhaW5lcihjb250YWluZXIpKVxuICAgIHJldHVybiBcInN2Z1wiO1xuICBpZiAoaXNNYXRoTUxDb250YWluZXIoY29udGFpbmVyKSlcbiAgICByZXR1cm4gXCJtYXRobWxcIjtcbiAgcmV0dXJuIHZvaWQgMDtcbn07XG5jb25zdCBpc0NvbW1lbnQgPSAobm9kZSkgPT4gbm9kZS5ub2RlVHlwZSA9PT0gOCAvKiBDT01NRU5UICovO1xuZnVuY3Rpb24gY3JlYXRlSHlkcmF0aW9uRnVuY3Rpb25zKHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gIGNvbnN0IHtcbiAgICBtdDogbW91bnRDb21wb25lbnQsXG4gICAgcDogcGF0Y2gsXG4gICAgbzoge1xuICAgICAgcGF0Y2hQcm9wLFxuICAgICAgY3JlYXRlVGV4dCxcbiAgICAgIG5leHRTaWJsaW5nLFxuICAgICAgcGFyZW50Tm9kZSxcbiAgICAgIHJlbW92ZSxcbiAgICAgIGluc2VydCxcbiAgICAgIGNyZWF0ZUNvbW1lbnRcbiAgICB9XG4gIH0gPSByZW5kZXJlckludGVybmFscztcbiAgY29uc3QgaHlkcmF0ZSA9ICh2bm9kZSwgY29udGFpbmVyKSA9PiB7XG4gICAgaWYgKCFjb250YWluZXIuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIHdhcm4kMShcbiAgICAgICAgYEF0dGVtcHRpbmcgdG8gaHlkcmF0ZSBleGlzdGluZyBtYXJrdXAgYnV0IGNvbnRhaW5lciBpcyBlbXB0eS4gUGVyZm9ybWluZyBmdWxsIG1vdW50IGluc3RlYWQuYFxuICAgICAgKTtcbiAgICAgIHBhdGNoKG51bGwsIHZub2RlLCBjb250YWluZXIpO1xuICAgICAgZmx1c2hQb3N0Rmx1c2hDYnMoKTtcbiAgICAgIGNvbnRhaW5lci5fdm5vZGUgPSB2bm9kZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaGFzTWlzbWF0Y2ggPSBmYWxzZTtcbiAgICBoeWRyYXRlTm9kZShjb250YWluZXIuZmlyc3RDaGlsZCwgdm5vZGUsIG51bGwsIG51bGwsIG51bGwpO1xuICAgIGZsdXNoUG9zdEZsdXNoQ2JzKCk7XG4gICAgY29udGFpbmVyLl92bm9kZSA9IHZub2RlO1xuICAgIGlmIChoYXNNaXNtYXRjaCAmJiB0cnVlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBIeWRyYXRpb24gY29tcGxldGVkIGJ1dCBjb250YWlucyBtaXNtYXRjaGVzLmApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaHlkcmF0ZU5vZGUgPSAobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCBpc0ZyYWdtZW50U3RhcnQgPSBpc0NvbW1lbnQobm9kZSkgJiYgbm9kZS5kYXRhID09PSBcIltcIjtcbiAgICBjb25zdCBvbk1pc21hdGNoID0gKCkgPT4gaGFuZGxlTWlzbWF0Y2goXG4gICAgICBub2RlLFxuICAgICAgdm5vZGUsXG4gICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgIGlzRnJhZ21lbnRTdGFydFxuICAgICk7XG4gICAgY29uc3QgeyB0eXBlLCByZWYsIHNoYXBlRmxhZywgcGF0Y2hGbGFnIH0gPSB2bm9kZTtcbiAgICBsZXQgZG9tVHlwZSA9IG5vZGUubm9kZVR5cGU7XG4gICAgdm5vZGUuZWwgPSBub2RlO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgaWYgKCEoXCJfX3Zub2RlXCIgaW4gbm9kZSkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIFwiX192bm9kZVwiLCB7XG4gICAgICAgICAgdmFsdWU6IHZub2RlLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCEoXCJfX3Z1ZVBhcmVudENvbXBvbmVudFwiIGluIG5vZGUpKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCBcIl9fdnVlUGFyZW50Q29tcG9uZW50XCIsIHtcbiAgICAgICAgICB2YWx1ZTogcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGF0Y2hGbGFnID09PSAtMikge1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICB2bm9kZS5keW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBsZXQgbmV4dE5vZGUgPSBudWxsO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUZXh0OlxuICAgICAgICBpZiAoZG9tVHlwZSAhPT0gMyAvKiBURVhUICovKSB7XG4gICAgICAgICAgaWYgKHZub2RlLmNoaWxkcmVuID09PSBcIlwiKSB7XG4gICAgICAgICAgICBpbnNlcnQodm5vZGUuZWwgPSBjcmVhdGVUZXh0KFwiXCIpLCBwYXJlbnROb2RlKG5vZGUpLCBub2RlKTtcbiAgICAgICAgICAgIG5leHROb2RlID0gbm9kZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChub2RlLmRhdGEgIT09IHZub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIHdhcm4kMShcbiAgICAgICAgICAgICAgYEh5ZHJhdGlvbiB0ZXh0IG1pc21hdGNoIGluYCxcbiAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLFxuICAgICAgICAgICAgICBgXG4gIC0gcmVuZGVyZWQgb24gc2VydmVyOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YVxuICAgICAgICAgICAgICApfVxuICAtIGV4cGVjdGVkIG9uIGNsaWVudDogJHtKU09OLnN0cmluZ2lmeSh2bm9kZS5jaGlsZHJlbil9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG5vZGUuZGF0YSA9IHZub2RlLmNoaWxkcmVuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb21tZW50OlxuICAgICAgICBpZiAoaXNUZW1wbGF0ZU5vZGUobm9kZSkpIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICAgIHJlcGxhY2VOb2RlKFxuICAgICAgICAgICAgdm5vZGUuZWwgPSBub2RlLmNvbnRlbnQuZmlyc3RDaGlsZCxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGRvbVR5cGUgIT09IDggLyogQ09NTUVOVCAqLyB8fCBpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGF0aWM6XG4gICAgICAgIGlmIChpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICBub2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgZG9tVHlwZSA9IG5vZGUubm9kZVR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvbVR5cGUgPT09IDEgLyogRUxFTUVOVCAqLyB8fCBkb21UeXBlID09PSAzIC8qIFRFWFQgKi8pIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgY29uc3QgbmVlZFRvQWRvcHRDb250ZW50ID0gIXZub2RlLmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZub2RlLnN0YXRpY0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGlmIChuZWVkVG9BZG9wdENvbnRlbnQpXG4gICAgICAgICAgICAgIHZub2RlLmNoaWxkcmVuICs9IG5leHROb2RlLm5vZGVUeXBlID09PSAxIC8qIEVMRU1FTlQgKi8gPyBuZXh0Tm9kZS5vdXRlckhUTUwgOiBuZXh0Tm9kZS5kYXRhO1xuICAgICAgICAgICAgaWYgKGkgPT09IHZub2RlLnN0YXRpY0NvdW50IC0gMSkge1xuICAgICAgICAgICAgICB2bm9kZS5hbmNob3IgPSBuZXh0Tm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobmV4dE5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXNGcmFnbWVudFN0YXJ0ID8gbmV4dFNpYmxpbmcobmV4dE5vZGUpIDogbmV4dE5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb25NaXNtYXRjaCgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGcmFnbWVudDpcbiAgICAgICAgaWYgKCFpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IGh5ZHJhdGVGcmFnbWVudChcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxKSB7XG4gICAgICAgICAgaWYgKChkb21UeXBlICE9PSAxIC8qIEVMRU1FTlQgKi8gfHwgdm5vZGUudHlwZS50b0xvd2VyQ2FzZSgpICE9PSBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkgJiYgIWlzVGVtcGxhdGVOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBoeWRyYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA2KSB7XG4gICAgICAgICAgdm5vZGUuc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzO1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgICAgaWYgKGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBsb2NhdGVDbG9zaW5nQW5jaG9yKG5vZGUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNDb21tZW50KG5vZGUpICYmIG5vZGUuZGF0YSA9PT0gXCJ0ZWxlcG9ydCBzdGFydFwiKSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IGxvY2F0ZUNsb3NpbmdBbmNob3Iobm9kZSwgbm9kZS5kYXRhLCBcInRlbGVwb3J0IGVuZFwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbW91bnRDb21wb25lbnQoXG4gICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIGdldENvbnRhaW5lclR5cGUoY29udGFpbmVyKSxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGlzQXN5bmNXcmFwcGVyKHZub2RlKSkge1xuICAgICAgICAgICAgbGV0IHN1YlRyZWU7XG4gICAgICAgICAgICBpZiAoaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgICAgIHN1YlRyZWUgPSBjcmVhdGVWTm9kZShGcmFnbWVudCk7XG4gICAgICAgICAgICAgIHN1YlRyZWUuYW5jaG9yID0gbmV4dE5vZGUgPyBuZXh0Tm9kZS5wcmV2aW91c1NpYmxpbmcgOiBjb250YWluZXIubGFzdENoaWxkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3ViVHJlZSA9IG5vZGUubm9kZVR5cGUgPT09IDMgPyBjcmVhdGVUZXh0Vk5vZGUoXCJcIikgOiBjcmVhdGVWTm9kZShcImRpdlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YlRyZWUuZWwgPSBub2RlO1xuICAgICAgICAgICAgdm5vZGUuY29tcG9uZW50LnN1YlRyZWUgPSBzdWJUcmVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgICAgIGlmIChkb21UeXBlICE9PSA4IC8qIENPTU1FTlQgKi8pIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IHZub2RlLnR5cGUuaHlkcmF0ZShcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgICByZW5kZXJlckludGVybmFscyxcbiAgICAgICAgICAgICAgaHlkcmF0ZUNoaWxkcmVuXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IHZub2RlLnR5cGUuaHlkcmF0ZShcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgZ2V0Q29udGFpbmVyVHlwZShwYXJlbnROb2RlKG5vZGUpKSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgICAgIHJlbmRlcmVySW50ZXJuYWxzLFxuICAgICAgICAgICAgaHlkcmF0ZU5vZGVcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fKSB7XG4gICAgICAgICAgd2FybiQxKFwiSW52YWxpZCBIb3N0Vk5vZGUgdHlwZTpcIiwgdHlwZSwgYCgke3R5cGVvZiB0eXBlfSlgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVmICE9IG51bGwpIHtcbiAgICAgIHNldFJlZihyZWYsIG51bGwsIHBhcmVudFN1c3BlbnNlLCB2bm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0Tm9kZTtcbiAgfTtcbiAgY29uc3QgaHlkcmF0ZUVsZW1lbnQgPSAoZWwsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIG9wdGltaXplZCA9IG9wdGltaXplZCB8fCAhIXZub2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgICBjb25zdCB7IHR5cGUsIHByb3BzLCBwYXRjaEZsYWcsIHNoYXBlRmxhZywgZGlycywgdHJhbnNpdGlvbiB9ID0gdm5vZGU7XG4gICAgY29uc3QgZm9yY2VQYXRjaCA9IHR5cGUgPT09IFwiaW5wdXRcIiB8fCB0eXBlID09PSBcIm9wdGlvblwiO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IGZvcmNlUGF0Y2ggfHwgcGF0Y2hGbGFnICE9PSAtMSkge1xuICAgICAgaWYgKGRpcnMpIHtcbiAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImNyZWF0ZWRcIik7XG4gICAgICB9XG4gICAgICBsZXQgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgPSBmYWxzZTtcbiAgICAgIGlmIChpc1RlbXBsYXRlTm9kZShlbCkpIHtcbiAgICAgICAgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgPSBuZWVkVHJhbnNpdGlvbihwYXJlbnRTdXNwZW5zZSwgdHJhbnNpdGlvbikgJiYgcGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudC52bm9kZS5wcm9wcyAmJiBwYXJlbnRDb21wb25lbnQudm5vZGUucHJvcHMuYXBwZWFyO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZWwuY29udGVudC5maXJzdENoaWxkO1xuICAgICAgICBpZiAobmVlZENhbGxUcmFuc2l0aW9uSG9va3MpIHtcbiAgICAgICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJlcGxhY2VOb2RlKGNvbnRlbnQsIGVsLCBwYXJlbnRDb21wb25lbnQpO1xuICAgICAgICB2bm9kZS5lbCA9IGVsID0gY29udGVudDtcbiAgICAgIH1cbiAgICAgIGlmIChzaGFwZUZsYWcgJiAxNiAmJiAvLyBza2lwIGlmIGVsZW1lbnQgaGFzIGlubmVySFRNTCAvIHRleHRDb250ZW50XG4gICAgICAhKHByb3BzICYmIChwcm9wcy5pbm5lckhUTUwgfHwgcHJvcHMudGV4dENvbnRlbnQpKSkge1xuICAgICAgICBsZXQgbmV4dCA9IGh5ZHJhdGVDaGlsZHJlbihcbiAgICAgICAgICBlbC5maXJzdENoaWxkLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGxldCBoYXNXYXJuZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKG5leHQpIHtcbiAgICAgICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgaWYgKCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgIWhhc1dhcm5lZCkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBgSHlkcmF0aW9uIGNoaWxkcmVuIG1pc21hdGNoIG9uYCxcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgIGBcblNlcnZlciByZW5kZXJlZCBlbGVtZW50IGNvbnRhaW5zIG1vcmUgY2hpbGQgbm9kZXMgdGhhbiBjbGllbnQgdmRvbS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaGFzV2FybmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY3VyID0gbmV4dDtcbiAgICAgICAgICBuZXh0ID0gbmV4dC5uZXh0U2libGluZztcbiAgICAgICAgICByZW1vdmUoY3VyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA4KSB7XG4gICAgICAgIGlmIChlbC50ZXh0Q29udGVudCAhPT0gdm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fKSAmJiB3YXJuJDEoXG4gICAgICAgICAgICBgSHlkcmF0aW9uIHRleHQgY29udGVudCBtaXNtYXRjaCBvbmAsXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICAgIGBcbiAgLSByZW5kZXJlZCBvbiBzZXJ2ZXI6ICR7ZWwudGV4dENvbnRlbnR9XG4gIC0gZXhwZWN0ZWQgb24gY2xpZW50OiAke3Zub2RlLmNoaWxkcmVufWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcykge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBmb3JjZVBhdGNoIHx8ICFvcHRpbWl6ZWQgfHwgcGF0Y2hGbGFnICYgKDE2IHwgMzIpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHByb3BIYXNNaXNtYXRjaChlbCwga2V5LCBwcm9wc1trZXldLCB2bm9kZSkpIHtcbiAgICAgICAgICAgICAgaGFzTWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZvcmNlUGF0Y2ggJiYgKGtleS5lbmRzV2l0aChcInZhbHVlXCIpIHx8IGtleSA9PT0gXCJpbmRldGVybWluYXRlXCIpIHx8IGlzT24oa2V5KSAmJiAhaXNSZXNlcnZlZFByb3Aoa2V5KSB8fCAvLyBmb3JjZSBoeWRyYXRlIHYtYmluZCB3aXRoIC5wcm9wIG1vZGlmaWVyc1xuICAgICAgICAgICAga2V5WzBdID09PSBcIi5cIikge1xuICAgICAgICAgICAgICBwYXRjaFByb3AoXG4gICAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgcHJvcHNba2V5XSxcbiAgICAgICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgIHBhcmVudENvbXBvbmVudFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5vbkNsaWNrKSB7XG4gICAgICAgICAgcGF0Y2hQcm9wKFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBcIm9uQ2xpY2tcIixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwcm9wcy5vbkNsaWNrLFxuICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IHZub2RlSG9va3M7XG4gICAgICBpZiAodm5vZGVIb29rcyA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkge1xuICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rcywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICB9XG4gICAgICBpZiAoZGlycykge1xuICAgICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiYmVmb3JlTW91bnRcIik7XG4gICAgICB9XG4gICAgICBpZiAoKHZub2RlSG9va3MgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlTW91bnRlZCkgfHwgZGlycyB8fCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcykge1xuICAgICAgICBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZSgoKSA9PiB7XG4gICAgICAgICAgdm5vZGVIb29rcyAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rcywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICAgICAgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgJiYgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICAgICAgZGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwibW91bnRlZFwiKTtcbiAgICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWwubmV4dFNpYmxpbmc7XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVDaGlsZHJlbiA9IChub2RlLCBwYXJlbnRWTm9kZSwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIG9wdGltaXplZCA9IG9wdGltaXplZCB8fCAhIXBhcmVudFZOb2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudFZOb2RlLmNoaWxkcmVuO1xuICAgIGNvbnN0IGwgPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgbGV0IGhhc1dhcm5lZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjb25zdCB2bm9kZSA9IG9wdGltaXplZCA/IGNoaWxkcmVuW2ldIDogY2hpbGRyZW5baV0gPSBub3JtYWxpemVWTm9kZShjaGlsZHJlbltpXSk7XG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICBub2RlID0gaHlkcmF0ZU5vZGUoXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh2bm9kZS50eXBlID09PSBUZXh0ICYmICF2bm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhc01pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgaWYgKCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgIWhhc1dhcm5lZCkge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBIeWRyYXRpb24gY2hpbGRyZW4gbWlzbWF0Y2ggb25gLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYFxuU2VydmVyIHJlbmRlcmVkIGVsZW1lbnQgY29udGFpbnMgZmV3ZXIgY2hpbGQgbm9kZXMgdGhhbiBjbGllbnQgdmRvbS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBoYXNXYXJuZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGdldENvbnRhaW5lclR5cGUoY29udGFpbmVyKSxcbiAgICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVGcmFnbWVudCA9IChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCB7IHNsb3RTY29wZUlkczogZnJhZ21lbnRTbG90U2NvcGVJZHMgfSA9IHZub2RlO1xuICAgIGlmIChmcmFnbWVudFNsb3RTY29wZUlkcykge1xuICAgICAgc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzID8gc2xvdFNjb3BlSWRzLmNvbmNhdChmcmFnbWVudFNsb3RTY29wZUlkcykgOiBmcmFnbWVudFNsb3RTY29wZUlkcztcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50Tm9kZShub2RlKTtcbiAgICBjb25zdCBuZXh0ID0gaHlkcmF0ZUNoaWxkcmVuKFxuICAgICAgbmV4dFNpYmxpbmcobm9kZSksXG4gICAgICB2bm9kZSxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgb3B0aW1pemVkXG4gICAgKTtcbiAgICBpZiAobmV4dCAmJiBpc0NvbW1lbnQobmV4dCkgJiYgbmV4dC5kYXRhID09PSBcIl1cIikge1xuICAgICAgcmV0dXJuIG5leHRTaWJsaW5nKHZub2RlLmFuY2hvciA9IG5leHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICBpbnNlcnQodm5vZGUuYW5jaG9yID0gY3JlYXRlQ29tbWVudChgXWApLCBjb250YWluZXIsIG5leHQpO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuICB9O1xuICBjb25zdCBoYW5kbGVNaXNtYXRjaCA9IChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBpc0ZyYWdtZW50KSA9PiB7XG4gICAgaGFzTWlzbWF0Y2ggPSB0cnVlO1xuICAgICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgd2FybiQxKFxuICAgICAgYEh5ZHJhdGlvbiBub2RlIG1pc21hdGNoOlxuLSByZW5kZXJlZCBvbiBzZXJ2ZXI6YCxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlLm5vZGVUeXBlID09PSAzIC8qIFRFWFQgKi8gPyBgKHRleHQpYCA6IGlzQ29tbWVudChub2RlKSAmJiBub2RlLmRhdGEgPT09IFwiW1wiID8gYChzdGFydCBvZiBmcmFnbWVudClgIDogYGAsXG4gICAgICBgXG4tIGV4cGVjdGVkIG9uIGNsaWVudDpgLFxuICAgICAgdm5vZGUudHlwZVxuICAgICk7XG4gICAgdm5vZGUuZWwgPSBudWxsO1xuICAgIGlmIChpc0ZyYWdtZW50KSB7XG4gICAgICBjb25zdCBlbmQgPSBsb2NhdGVDbG9zaW5nQW5jaG9yKG5vZGUpO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgY29uc3QgbmV4dDIgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgaWYgKG5leHQyICYmIG5leHQyICE9PSBlbmQpIHtcbiAgICAgICAgICByZW1vdmUobmV4dDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5leHQgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICBjb25zdCBjb250YWluZXIgPSBwYXJlbnROb2RlKG5vZGUpO1xuICAgIHJlbW92ZShub2RlKTtcbiAgICBwYXRjaChcbiAgICAgIG51bGwsXG4gICAgICB2bm9kZSxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG5leHQsXG4gICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgIGdldENvbnRhaW5lclR5cGUoY29udGFpbmVyKSxcbiAgICAgIHNsb3RTY29wZUlkc1xuICAgICk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH07XG4gIGNvbnN0IGxvY2F0ZUNsb3NpbmdBbmNob3IgPSAobm9kZSwgb3BlbiA9IFwiW1wiLCBjbG9zZSA9IFwiXVwiKSA9PiB7XG4gICAgbGV0IG1hdGNoID0gMDtcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgbm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgaWYgKG5vZGUgJiYgaXNDb21tZW50KG5vZGUpKSB7XG4gICAgICAgIGlmIChub2RlLmRhdGEgPT09IG9wZW4pXG4gICAgICAgICAgbWF0Y2grKztcbiAgICAgICAgaWYgKG5vZGUuZGF0YSA9PT0gY2xvc2UpIHtcbiAgICAgICAgICBpZiAobWF0Y2ggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWF0Y2gtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG4gIGNvbnN0IHJlcGxhY2VOb2RlID0gKG5ld05vZGUsIG9sZE5vZGUsIHBhcmVudENvbXBvbmVudCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudE5vZGUyID0gb2xkTm9kZS5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnROb2RlMikge1xuICAgICAgcGFyZW50Tm9kZTIucmVwbGFjZUNoaWxkKG5ld05vZGUsIG9sZE5vZGUpO1xuICAgIH1cbiAgICBsZXQgcGFyZW50ID0gcGFyZW50Q29tcG9uZW50O1xuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmIChwYXJlbnQudm5vZGUuZWwgPT09IG9sZE5vZGUpIHtcbiAgICAgICAgcGFyZW50LnZub2RlLmVsID0gcGFyZW50LnN1YlRyZWUuZWwgPSBuZXdOb2RlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGlzVGVtcGxhdGVOb2RlID0gKG5vZGUpID0+IHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBFTEVNRU5UICovICYmIG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInRlbXBsYXRlXCI7XG4gIH07XG4gIHJldHVybiBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdO1xufVxuZnVuY3Rpb24gcHJvcEhhc01pc21hdGNoKGVsLCBrZXksIGNsaWVudFZhbHVlLCB2bm9kZSkge1xuICBsZXQgbWlzbWF0Y2hUeXBlO1xuICBsZXQgbWlzbWF0Y2hLZXk7XG4gIGxldCBhY3R1YWw7XG4gIGxldCBleHBlY3RlZDtcbiAgaWYgKGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgYWN0dWFsID0gZWwuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIik7XG4gICAgZXhwZWN0ZWQgPSBub3JtYWxpemVDbGFzcyhjbGllbnRWYWx1ZSk7XG4gICAgaWYgKCFpc1NldEVxdWFsKHRvQ2xhc3NTZXQoYWN0dWFsIHx8IFwiXCIpLCB0b0NsYXNzU2V0KGV4cGVjdGVkKSkpIHtcbiAgICAgIG1pc21hdGNoVHlwZSA9IG1pc21hdGNoS2V5ID0gYGNsYXNzYDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIpIHtcbiAgICBhY3R1YWwgPSBlbC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICBleHBlY3RlZCA9IGlzU3RyaW5nKGNsaWVudFZhbHVlKSA/IGNsaWVudFZhbHVlIDogc3RyaW5naWZ5U3R5bGUobm9ybWFsaXplU3R5bGUoY2xpZW50VmFsdWUpKTtcbiAgICBjb25zdCBhY3R1YWxNYXAgPSB0b1N0eWxlTWFwKGFjdHVhbCk7XG4gICAgY29uc3QgZXhwZWN0ZWRNYXAgPSB0b1N0eWxlTWFwKGV4cGVjdGVkKTtcbiAgICBpZiAodm5vZGUuZGlycykge1xuICAgICAgZm9yIChjb25zdCB7IGRpciwgdmFsdWUgfSBvZiB2bm9kZS5kaXJzKSB7XG4gICAgICAgIGlmIChkaXIubmFtZSA9PT0gXCJzaG93XCIgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgZXhwZWN0ZWRNYXAuc2V0KFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpc01hcEVxdWFsKGFjdHVhbE1hcCwgZXhwZWN0ZWRNYXApKSB7XG4gICAgICBtaXNtYXRjaFR5cGUgPSBtaXNtYXRjaEtleSA9IFwic3R5bGVcIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZWwgaW5zdGFuY2VvZiBTVkdFbGVtZW50ICYmIGlzS25vd25TdmdBdHRyKGtleSkgfHwgZWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiAoaXNCb29sZWFuQXR0cihrZXkpIHx8IGlzS25vd25IdG1sQXR0cihrZXkpKSkge1xuICAgIGlmIChpc0Jvb2xlYW5BdHRyKGtleSkpIHtcbiAgICAgIGFjdHVhbCA9IGVsLmhhc0F0dHJpYnV0ZShrZXkpO1xuICAgICAgZXhwZWN0ZWQgPSBpbmNsdWRlQm9vbGVhbkF0dHIoY2xpZW50VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWwuaGFzQXR0cmlidXRlKGtleSkpIHtcbiAgICAgICAgYWN0dWFsID0gZWwuZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzZXJ2ZXJWYWx1ZSA9IGVsW2tleV07XG4gICAgICAgIGFjdHVhbCA9IGlzT2JqZWN0KHNlcnZlclZhbHVlKSB8fCBzZXJ2ZXJWYWx1ZSA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhzZXJ2ZXJWYWx1ZSk7XG4gICAgICB9XG4gICAgICBleHBlY3RlZCA9IGlzT2JqZWN0KGNsaWVudFZhbHVlKSB8fCBjbGllbnRWYWx1ZSA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhjbGllbnRWYWx1ZSk7XG4gICAgfVxuICAgIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgICBtaXNtYXRjaFR5cGUgPSBgYXR0cmlidXRlYDtcbiAgICAgIG1pc21hdGNoS2V5ID0ga2V5O1xuICAgIH1cbiAgfVxuICBpZiAobWlzbWF0Y2hUeXBlKSB7XG4gICAgY29uc3QgZm9ybWF0ID0gKHYpID0+IHYgPT09IGZhbHNlID8gYChub3QgcmVuZGVyZWQpYCA6IGAke21pc21hdGNoS2V5fT1cIiR7dn1cImA7XG4gICAgY29uc3QgcHJlU2VnbWVudCA9IGBIeWRyYXRpb24gJHttaXNtYXRjaFR5cGV9IG1pc21hdGNoIG9uYDtcbiAgICBjb25zdCBwb3N0U2VnbWVudCA9IGBcbiAgLSByZW5kZXJlZCBvbiBzZXJ2ZXI6ICR7Zm9ybWF0KGFjdHVhbCl9XG4gIC0gZXhwZWN0ZWQgb24gY2xpZW50OiAke2Zvcm1hdChleHBlY3RlZCl9XG4gIE5vdGU6IHRoaXMgbWlzbWF0Y2ggaXMgY2hlY2stb25seS4gVGhlIERPTSB3aWxsIG5vdCBiZSByZWN0aWZpZWQgaW4gcHJvZHVjdGlvbiBkdWUgdG8gcGVyZm9ybWFuY2Ugb3ZlcmhlYWQuXG4gIFlvdSBzaG91bGQgZml4IHRoZSBzb3VyY2Ugb2YgdGhlIG1pc21hdGNoLmA7XG4gICAge1xuICAgICAgd2FybiQxKHByZVNlZ21lbnQsIGVsLCBwb3N0U2VnbWVudCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHRvQ2xhc3NTZXQoc3RyKSB7XG4gIHJldHVybiBuZXcgU2V0KHN0ci50cmltKCkuc3BsaXQoL1xccysvKSk7XG59XG5mdW5jdGlvbiBpc1NldEVxdWFsKGEsIGIpIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3QgcyBvZiBhKSB7XG4gICAgaWYgKCFiLmhhcyhzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHRvU3R5bGVNYXAoc3RyKSB7XG4gIGNvbnN0IHN0eWxlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIHN0ci5zcGxpdChcIjtcIikpIHtcbiAgICBsZXQgW2tleSwgdmFsdWVdID0gaXRlbS5zcGxpdChcIjpcIik7XG4gICAga2V5ID0ga2V5ID09IG51bGwgPyB2b2lkIDAgOiBrZXkudHJpbSgpO1xuICAgIHZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IHZvaWQgMCA6IHZhbHVlLnRyaW0oKTtcbiAgICBpZiAoa2V5ICYmIHZhbHVlKSB7XG4gICAgICBzdHlsZU1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHlsZU1hcDtcbn1cbmZ1bmN0aW9uIGlzTWFwRXF1YWwoYSwgYikge1xuICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgYSkge1xuICAgIGlmICh2YWx1ZSAhPT0gYi5nZXQoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxubGV0IHN1cHBvcnRlZDtcbmxldCBwZXJmO1xuZnVuY3Rpb24gc3RhcnRNZWFzdXJlKGluc3RhbmNlLCB0eXBlKSB7XG4gIGlmIChpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5wZXJmb3JtYW5jZSAmJiBpc1N1cHBvcnRlZCgpKSB7XG4gICAgcGVyZi5tYXJrKGB2dWUtJHt0eXBlfS0ke2luc3RhbmNlLnVpZH1gKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICBkZXZ0b29sc1BlcmZTdGFydChpbnN0YW5jZSwgdHlwZSwgaXNTdXBwb3J0ZWQoKSA/IHBlcmYubm93KCkgOiBEYXRlLm5vdygpKTtcbiAgfVxufVxuZnVuY3Rpb24gZW5kTWVhc3VyZShpbnN0YW5jZSwgdHlwZSkge1xuICBpZiAoaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcucGVyZm9ybWFuY2UgJiYgaXNTdXBwb3J0ZWQoKSkge1xuICAgIGNvbnN0IHN0YXJ0VGFnID0gYHZ1ZS0ke3R5cGV9LSR7aW5zdGFuY2UudWlkfWA7XG4gICAgY29uc3QgZW5kVGFnID0gc3RhcnRUYWcgKyBgOmVuZGA7XG4gICAgcGVyZi5tYXJrKGVuZFRhZyk7XG4gICAgcGVyZi5tZWFzdXJlKFxuICAgICAgYDwke2Zvcm1hdENvbXBvbmVudE5hbWUoaW5zdGFuY2UsIGluc3RhbmNlLnR5cGUpfT4gJHt0eXBlfWAsXG4gICAgICBzdGFydFRhZyxcbiAgICAgIGVuZFRhZ1xuICAgICk7XG4gICAgcGVyZi5jbGVhck1hcmtzKHN0YXJ0VGFnKTtcbiAgICBwZXJmLmNsZWFyTWFya3MoZW5kVGFnKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICBkZXZ0b29sc1BlcmZFbmQoaW5zdGFuY2UsIHR5cGUsIGlzU3VwcG9ydGVkKCkgPyBwZXJmLm5vdygpIDogRGF0ZS5ub3coKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzU3VwcG9ydGVkKCkge1xuICBpZiAoc3VwcG9ydGVkICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gc3VwcG9ydGVkO1xuICB9XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5wZXJmb3JtYW5jZSkge1xuICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgcGVyZiA9IHdpbmRvdy5wZXJmb3JtYW5jZTtcbiAgfSBlbHNlIHtcbiAgICBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gc3VwcG9ydGVkO1xufVxuXG5mdW5jdGlvbiBpbml0RmVhdHVyZUZsYWdzKCkge1xuICBjb25zdCBuZWVkV2FybiA9IFtdO1xuICBpZiAodHlwZW9mIF9fVlVFX09QVElPTlNfQVBJX18gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBuZWVkV2Fybi5wdXNoKGBfX1ZVRV9PUFRJT05TX0FQSV9fYCk7XG4gICAgZ2V0R2xvYmFsVGhpcygpLl9fVlVFX09QVElPTlNfQVBJX18gPSB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgX19WVUVfUFJPRF9ERVZUT09MU19fICE9PSBcImJvb2xlYW5cIikge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbmVlZFdhcm4ucHVzaChgX19WVUVfUFJPRF9ERVZUT09MU19fYCk7XG4gICAgZ2V0R2xvYmFsVGhpcygpLl9fVlVFX1BST0RfREVWVE9PTFNfXyA9IGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fICE9PSBcImJvb2xlYW5cIikge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbmVlZFdhcm4ucHVzaChgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fYCk7XG4gICAgZ2V0R2xvYmFsVGhpcygpLl9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXyA9IGZhbHNlO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG5lZWRXYXJuLmxlbmd0aCkge1xuICAgIGNvbnN0IG11bHRpID0gbmVlZFdhcm4ubGVuZ3RoID4gMTtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgRmVhdHVyZSBmbGFnJHttdWx0aSA/IGBzYCA6IGBgfSAke25lZWRXYXJuLmpvaW4oXCIsIFwiKX0gJHttdWx0aSA/IGBhcmVgIDogYGlzYH0gbm90IGV4cGxpY2l0bHkgZGVmaW5lZC4gWW91IGFyZSBydW5uaW5nIHRoZSBlc20tYnVuZGxlciBidWlsZCBvZiBWdWUsIHdoaWNoIGV4cGVjdHMgdGhlc2UgY29tcGlsZS10aW1lIGZlYXR1cmUgZmxhZ3MgdG8gYmUgZ2xvYmFsbHkgaW5qZWN0ZWQgdmlhIHRoZSBidW5kbGVyIGNvbmZpZyBpbiBvcmRlciB0byBnZXQgYmV0dGVyIHRyZWUtc2hha2luZyBpbiB0aGUgcHJvZHVjdGlvbiBidW5kbGUuXG5cbkZvciBtb3JlIGRldGFpbHMsIHNlZSBodHRwczovL2xpbmsudnVlanMub3JnL2ZlYXR1cmUtZmxhZ3MuYFxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgcXVldWVQb3N0UmVuZGVyRWZmZWN0ID0gcXVldWVFZmZlY3RXaXRoU3VzcGVuc2UgO1xuZnVuY3Rpb24gY3JlYXRlUmVuZGVyZXIob3B0aW9ucykge1xuICByZXR1cm4gYmFzZUNyZWF0ZVJlbmRlcmVyKG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXIob3B0aW9ucykge1xuICByZXR1cm4gYmFzZUNyZWF0ZVJlbmRlcmVyKG9wdGlvbnMsIGNyZWF0ZUh5ZHJhdGlvbkZ1bmN0aW9ucyk7XG59XG5mdW5jdGlvbiBiYXNlQ3JlYXRlUmVuZGVyZXIob3B0aW9ucywgY3JlYXRlSHlkcmF0aW9uRm5zKSB7XG4gIHtcbiAgICBpbml0RmVhdHVyZUZsYWdzKCk7XG4gIH1cbiAgY29uc3QgdGFyZ2V0ID0gZ2V0R2xvYmFsVGhpcygpO1xuICB0YXJnZXQuX19WVUVfXyA9IHRydWU7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIHNldERldnRvb2xzSG9vayQxKHRhcmdldC5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fLCB0YXJnZXQpO1xuICB9XG4gIGNvbnN0IHtcbiAgICBpbnNlcnQ6IGhvc3RJbnNlcnQsXG4gICAgcmVtb3ZlOiBob3N0UmVtb3ZlLFxuICAgIHBhdGNoUHJvcDogaG9zdFBhdGNoUHJvcCxcbiAgICBjcmVhdGVFbGVtZW50OiBob3N0Q3JlYXRlRWxlbWVudCxcbiAgICBjcmVhdGVUZXh0OiBob3N0Q3JlYXRlVGV4dCxcbiAgICBjcmVhdGVDb21tZW50OiBob3N0Q3JlYXRlQ29tbWVudCxcbiAgICBzZXRUZXh0OiBob3N0U2V0VGV4dCxcbiAgICBzZXRFbGVtZW50VGV4dDogaG9zdFNldEVsZW1lbnRUZXh0LFxuICAgIHBhcmVudE5vZGU6IGhvc3RQYXJlbnROb2RlLFxuICAgIG5leHRTaWJsaW5nOiBob3N0TmV4dFNpYmxpbmcsXG4gICAgc2V0U2NvcGVJZDogaG9zdFNldFNjb3BlSWQgPSBOT09QLFxuICAgIGluc2VydFN0YXRpY0NvbnRlbnQ6IGhvc3RJbnNlcnRTdGF0aWNDb250ZW50XG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBwYXRjaCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yID0gbnVsbCwgcGFyZW50Q29tcG9uZW50ID0gbnVsbCwgcGFyZW50U3VzcGVuc2UgPSBudWxsLCBuYW1lc3BhY2UgPSB2b2lkIDAsIHNsb3RTY29wZUlkcyA9IG51bGwsIG9wdGltaXplZCA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZyA/IGZhbHNlIDogISFuMi5keW5hbWljQ2hpbGRyZW4pID0+IHtcbiAgICBpZiAobjEgPT09IG4yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuMSAmJiAhaXNTYW1lVk5vZGVUeXBlKG4xLCBuMikpIHtcbiAgICAgIGFuY2hvciA9IGdldE5leHRIb3N0Tm9kZShuMSk7XG4gICAgICB1bm1vdW50KG4xLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgIG4xID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKG4yLnBhdGNoRmxhZyA9PT0gLTIpIHtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgbjIuZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeyB0eXBlLCByZWYsIHNoYXBlRmxhZyB9ID0gbjI7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFRleHQ6XG4gICAgICAgIHByb2Nlc3NUZXh0KG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ29tbWVudDpcbiAgICAgICAgcHJvY2Vzc0NvbW1lbnROb2RlKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RhdGljOlxuICAgICAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgICAgIG1vdW50U3RhdGljTm9kZShuMiwgY29udGFpbmVyLCBhbmNob3IsIG5hbWVzcGFjZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBhdGNoU3RhdGljTm9kZShuMSwgbjIsIGNvbnRhaW5lciwgbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICAgIHByb2Nlc3NGcmFnbWVudChcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxKSB7XG4gICAgICAgICAgcHJvY2Vzc0VsZW1lbnQoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50KFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgICAgIHR5cGUucHJvY2VzcyhcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgICAgIGludGVybmFsc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICAgICAgdHlwZS5wcm9jZXNzKFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgaW50ZXJuYWxzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFwiSW52YWxpZCBWTm9kZSB0eXBlOlwiLCB0eXBlLCBgKCR7dHlwZW9mIHR5cGV9KWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZWYgIT0gbnVsbCAmJiBwYXJlbnRDb21wb25lbnQpIHtcbiAgICAgIHNldFJlZihyZWYsIG4xICYmIG4xLnJlZiwgcGFyZW50U3VzcGVuc2UsIG4yIHx8IG4xLCAhbjIpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc1RleHQgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvcikgPT4ge1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBob3N0SW5zZXJ0KFxuICAgICAgICBuMi5lbCA9IGhvc3RDcmVhdGVUZXh0KG4yLmNoaWxkcmVuKSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3JcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVsID0gbjIuZWwgPSBuMS5lbDtcbiAgICAgIGlmIChuMi5jaGlsZHJlbiAhPT0gbjEuY2hpbGRyZW4pIHtcbiAgICAgICAgaG9zdFNldFRleHQoZWwsIG4yLmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IHByb2Nlc3NDb21tZW50Tm9kZSA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yKSA9PiB7XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGhvc3RJbnNlcnQoXG4gICAgICAgIG4yLmVsID0gaG9zdENyZWF0ZUNvbW1lbnQobjIuY2hpbGRyZW4gfHwgXCJcIiksXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgbW91bnRTdGF0aWNOb2RlID0gKG4yLCBjb250YWluZXIsIGFuY2hvciwgbmFtZXNwYWNlKSA9PiB7XG4gICAgW24yLmVsLCBuMi5hbmNob3JdID0gaG9zdEluc2VydFN0YXRpY0NvbnRlbnQoXG4gICAgICBuMi5jaGlsZHJlbixcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGFuY2hvcixcbiAgICAgIG5hbWVzcGFjZSxcbiAgICAgIG4yLmVsLFxuICAgICAgbjIuYW5jaG9yXG4gICAgKTtcbiAgfTtcbiAgY29uc3QgcGF0Y2hTdGF0aWNOb2RlID0gKG4xLCBuMiwgY29udGFpbmVyLCBuYW1lc3BhY2UpID0+IHtcbiAgICBpZiAobjIuY2hpbGRyZW4gIT09IG4xLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBhbmNob3IgPSBob3N0TmV4dFNpYmxpbmcobjEuYW5jaG9yKTtcbiAgICAgIHJlbW92ZVN0YXRpY05vZGUobjEpO1xuICAgICAgW24yLmVsLCBuMi5hbmNob3JdID0gaG9zdEluc2VydFN0YXRpY0NvbnRlbnQoXG4gICAgICAgIG4yLmNoaWxkcmVuLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgbmFtZXNwYWNlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgbjIuYW5jaG9yID0gbjEuYW5jaG9yO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgbW92ZVN0YXRpY05vZGUgPSAoeyBlbCwgYW5jaG9yIH0sIGNvbnRhaW5lciwgbmV4dFNpYmxpbmcpID0+IHtcbiAgICBsZXQgbmV4dDtcbiAgICB3aGlsZSAoZWwgJiYgZWwgIT09IGFuY2hvcikge1xuICAgICAgbmV4dCA9IGhvc3ROZXh0U2libGluZyhlbCk7XG4gICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIG5leHRTaWJsaW5nKTtcbiAgICAgIGVsID0gbmV4dDtcbiAgICB9XG4gICAgaG9zdEluc2VydChhbmNob3IsIGNvbnRhaW5lciwgbmV4dFNpYmxpbmcpO1xuICB9O1xuICBjb25zdCByZW1vdmVTdGF0aWNOb2RlID0gKHsgZWwsIGFuY2hvciB9KSA9PiB7XG4gICAgbGV0IG5leHQ7XG4gICAgd2hpbGUgKGVsICYmIGVsICE9PSBhbmNob3IpIHtcbiAgICAgIG5leHQgPSBob3N0TmV4dFNpYmxpbmcoZWwpO1xuICAgICAgaG9zdFJlbW92ZShlbCk7XG4gICAgICBlbCA9IG5leHQ7XG4gICAgfVxuICAgIGhvc3RSZW1vdmUoYW5jaG9yKTtcbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0VsZW1lbnQgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGlmIChuMi50eXBlID09PSBcInN2Z1wiKSB7XG4gICAgICBuYW1lc3BhY2UgPSBcInN2Z1wiO1xuICAgIH0gZWxzZSBpZiAobjIudHlwZSA9PT0gXCJtYXRoXCIpIHtcbiAgICAgIG5hbWVzcGFjZSA9IFwibWF0aG1sXCI7XG4gICAgfVxuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBtb3VudEVsZW1lbnQoXG4gICAgICAgIG4yLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0Y2hFbGVtZW50KFxuICAgICAgICBuMSxcbiAgICAgICAgbjIsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudEVsZW1lbnQgPSAodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgbGV0IGVsO1xuICAgIGxldCB2bm9kZUhvb2s7XG4gICAgY29uc3QgeyBwcm9wcywgc2hhcGVGbGFnLCB0cmFuc2l0aW9uLCBkaXJzIH0gPSB2bm9kZTtcbiAgICBlbCA9IHZub2RlLmVsID0gaG9zdENyZWF0ZUVsZW1lbnQoXG4gICAgICB2bm9kZS50eXBlLFxuICAgICAgbmFtZXNwYWNlLFxuICAgICAgcHJvcHMgJiYgcHJvcHMuaXMsXG4gICAgICBwcm9wc1xuICAgICk7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDgpIHtcbiAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChlbCwgdm5vZGUuY2hpbGRyZW4pO1xuICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgIHZub2RlLmNoaWxkcmVuLFxuICAgICAgICBlbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgcmVzb2x2ZUNoaWxkcmVuTmFtZXNwYWNlKHZub2RlLCBuYW1lc3BhY2UpLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRpcnMpIHtcbiAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJjcmVhdGVkXCIpO1xuICAgIH1cbiAgICBzZXRTY29wZUlkKGVsLCB2bm9kZSwgdm5vZGUuc2NvcGVJZCwgc2xvdFNjb3BlSWRzLCBwYXJlbnRDb21wb25lbnQpO1xuICAgIGlmIChwcm9wcykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gXCJ2YWx1ZVwiICYmICFpc1Jlc2VydmVkUHJvcChrZXkpKSB7XG4gICAgICAgICAgaG9zdFBhdGNoUHJvcChcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHByb3BzW2tleV0sXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICB2bm9kZS5jaGlsZHJlbixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgdW5tb3VudENoaWxkcmVuXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFwidmFsdWVcIiBpbiBwcm9wcykge1xuICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcInZhbHVlXCIsIG51bGwsIHByb3BzLnZhbHVlLCBuYW1lc3BhY2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZub2RlSG9vayA9IHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkge1xuICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsIFwiX192bm9kZVwiLCB7XG4gICAgICAgIHZhbHVlOiB2bm9kZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsLCBcIl9fdnVlUGFyZW50Q29tcG9uZW50XCIsIHtcbiAgICAgICAgdmFsdWU6IHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZGlycykge1xuICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZU1vdW50XCIpO1xuICAgIH1cbiAgICBjb25zdCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IG5lZWRUcmFuc2l0aW9uKHBhcmVudFN1c3BlbnNlLCB0cmFuc2l0aW9uKTtcbiAgICBpZiAobmVlZENhbGxUcmFuc2l0aW9uSG9va3MpIHtcbiAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoZWwpO1xuICAgIH1cbiAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgaWYgKCh2bm9kZUhvb2sgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlTW91bnRlZCkgfHwgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgfHwgZGlycykge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgdm5vZGVIb29rICYmIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgICBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyAmJiB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICAgICAgZGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwibW91bnRlZFwiKTtcbiAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHNldFNjb3BlSWQgPSAoZWwsIHZub2RlLCBzY29wZUlkLCBzbG90U2NvcGVJZHMsIHBhcmVudENvbXBvbmVudCkgPT4ge1xuICAgIGlmIChzY29wZUlkKSB7XG4gICAgICBob3N0U2V0U2NvcGVJZChlbCwgc2NvcGVJZCk7XG4gICAgfVxuICAgIGlmIChzbG90U2NvcGVJZHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xvdFNjb3BlSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGhvc3RTZXRTY29wZUlkKGVsLCBzbG90U2NvcGVJZHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGFyZW50Q29tcG9uZW50KSB7XG4gICAgICBsZXQgc3ViVHJlZSA9IHBhcmVudENvbXBvbmVudC5zdWJUcmVlO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc3ViVHJlZS5wYXRjaEZsYWcgPiAwICYmIHN1YlRyZWUucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgICAgICBzdWJUcmVlID0gZmlsdGVyU2luZ2xlUm9vdChzdWJUcmVlLmNoaWxkcmVuKSB8fCBzdWJUcmVlO1xuICAgICAgfVxuICAgICAgaWYgKHZub2RlID09PSBzdWJUcmVlKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFZOb2RlID0gcGFyZW50Q29tcG9uZW50LnZub2RlO1xuICAgICAgICBzZXRTY29wZUlkKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHBhcmVudFZOb2RlLFxuICAgICAgICAgIHBhcmVudFZOb2RlLnNjb3BlSWQsXG4gICAgICAgICAgcGFyZW50Vk5vZGUuc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudC5wYXJlbnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50Q2hpbGRyZW4gPSAoY2hpbGRyZW4sIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBzdGFydCA9IDApID0+IHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGNoaWxkcmVuW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGNoaWxkcmVuW2ldKTtcbiAgICAgIHBhdGNoKFxuICAgICAgICBudWxsLFxuICAgICAgICBjaGlsZCxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaEVsZW1lbnQgPSAobjEsIG4yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgY29uc3QgZWwgPSBuMi5lbCA9IG4xLmVsO1xuICAgIGxldCB7IHBhdGNoRmxhZywgZHluYW1pY0NoaWxkcmVuLCBkaXJzIH0gPSBuMjtcbiAgICBwYXRjaEZsYWcgfD0gbjEucGF0Y2hGbGFnICYgMTY7XG4gICAgY29uc3Qgb2xkUHJvcHMgPSBuMS5wcm9wcyB8fCBFTVBUWV9PQko7XG4gICAgY29uc3QgbmV3UHJvcHMgPSBuMi5wcm9wcyB8fCBFTVBUWV9PQko7XG4gICAgbGV0IHZub2RlSG9vaztcbiAgICBwYXJlbnRDb21wb25lbnQgJiYgdG9nZ2xlUmVjdXJzZShwYXJlbnRDb21wb25lbnQsIGZhbHNlKTtcbiAgICBpZiAodm5vZGVIb29rID0gbmV3UHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkge1xuICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCBuMiwgbjEpO1xuICAgIH1cbiAgICBpZiAoZGlycykge1xuICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayhuMiwgbjEsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVVcGRhdGVcIik7XG4gICAgfVxuICAgIHBhcmVudENvbXBvbmVudCAmJiB0b2dnbGVSZWN1cnNlKHBhcmVudENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZykge1xuICAgICAgcGF0Y2hGbGFnID0gMDtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgcGF0Y2hCbG9ja0NoaWxkcmVuKFxuICAgICAgICBuMS5keW5hbWljQ2hpbGRyZW4sXG4gICAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgZWwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHJlc29sdmVDaGlsZHJlbk5hbWVzcGFjZShuMiwgbmFtZXNwYWNlKSxcbiAgICAgICAgc2xvdFNjb3BlSWRzXG4gICAgICApO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIW9wdGltaXplZCkge1xuICAgICAgcGF0Y2hDaGlsZHJlbihcbiAgICAgICAgbjEsXG4gICAgICAgIG4yLFxuICAgICAgICBlbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgcmVzb2x2ZUNoaWxkcmVuTmFtZXNwYWNlKG4yLCBuYW1lc3BhY2UpLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocGF0Y2hGbGFnID4gMCkge1xuICAgICAgaWYgKHBhdGNoRmxhZyAmIDE2KSB7XG4gICAgICAgIHBhdGNoUHJvcHMoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgb2xkUHJvcHMsXG4gICAgICAgICAgbmV3UHJvcHMsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHBhdGNoRmxhZyAmIDIpIHtcbiAgICAgICAgICBpZiAob2xkUHJvcHMuY2xhc3MgIT09IG5ld1Byb3BzLmNsYXNzKSB7XG4gICAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcImNsYXNzXCIsIG51bGwsIG5ld1Byb3BzLmNsYXNzLCBuYW1lc3BhY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0Y2hGbGFnICYgNCkge1xuICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIFwic3R5bGVcIiwgb2xkUHJvcHMuc3R5bGUsIG5ld1Byb3BzLnN0eWxlLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRjaEZsYWcgJiA4KSB7XG4gICAgICAgICAgY29uc3QgcHJvcHNUb1VwZGF0ZSA9IG4yLmR5bmFtaWNQcm9wcztcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzVG9VcGRhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHByb3BzVG9VcGRhdGVbaV07XG4gICAgICAgICAgICBjb25zdCBwcmV2ID0gb2xkUHJvcHNba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBuZXdQcm9wc1trZXldO1xuICAgICAgICAgICAgaWYgKG5leHQgIT09IHByZXYgfHwga2V5ID09PSBcInZhbHVlXCIpIHtcbiAgICAgICAgICAgICAgaG9zdFBhdGNoUHJvcChcbiAgICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgcHJldixcbiAgICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICBuMS5jaGlsZHJlbixcbiAgICAgICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICAgICAgdW5tb3VudENoaWxkcmVuXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocGF0Y2hGbGFnICYgMSkge1xuICAgICAgICBpZiAobjEuY2hpbGRyZW4gIT09IG4yLmNoaWxkcmVuKSB7XG4gICAgICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGVsLCBuMi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFvcHRpbWl6ZWQgJiYgZHluYW1pY0NoaWxkcmVuID09IG51bGwpIHtcbiAgICAgIHBhdGNoUHJvcHMoXG4gICAgICAgIGVsLFxuICAgICAgICBuMixcbiAgICAgICAgb2xkUHJvcHMsXG4gICAgICAgIG5ld1Byb3BzLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2VcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICgodm5vZGVIb29rID0gbmV3UHJvcHMub25Wbm9kZVVwZGF0ZWQpIHx8IGRpcnMpIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIG4yLCBuMSk7XG4gICAgICAgIGRpcnMgJiYgaW52b2tlRGlyZWN0aXZlSG9vayhuMiwgbjEsIHBhcmVudENvbXBvbmVudCwgXCJ1cGRhdGVkXCIpO1xuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hCbG9ja0NoaWxkcmVuID0gKG9sZENoaWxkcmVuLCBuZXdDaGlsZHJlbiwgZmFsbGJhY2tDb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb2xkVk5vZGUgPSBvbGRDaGlsZHJlbltpXTtcbiAgICAgIGNvbnN0IG5ld1ZOb2RlID0gbmV3Q2hpbGRyZW5baV07XG4gICAgICBjb25zdCBjb250YWluZXIgPSAoXG4gICAgICAgIC8vIG9sZFZOb2RlIG1heSBiZSBhbiBlcnJvcmVkIGFzeW5jIHNldHVwKCkgY29tcG9uZW50IGluc2lkZSBTdXNwZW5zZVxuICAgICAgICAvLyB3aGljaCB3aWxsIG5vdCBoYXZlIGEgbW91bnRlZCBlbGVtZW50XG4gICAgICAgIG9sZFZOb2RlLmVsICYmIC8vIC0gSW4gdGhlIGNhc2Ugb2YgYSBGcmFnbWVudCwgd2UgbmVlZCB0byBwcm92aWRlIHRoZSBhY3R1YWwgcGFyZW50XG4gICAgICAgIC8vIG9mIHRoZSBGcmFnbWVudCBpdHNlbGYgc28gaXQgY2FuIG1vdmUgaXRzIGNoaWxkcmVuLlxuICAgICAgICAob2xkVk5vZGUudHlwZSA9PT0gRnJhZ21lbnQgfHwgLy8gLSBJbiB0aGUgY2FzZSBvZiBkaWZmZXJlbnQgbm9kZXMsIHRoZXJlIGlzIGdvaW5nIHRvIGJlIGEgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gd2hpY2ggYWxzbyByZXF1aXJlcyB0aGUgY29ycmVjdCBwYXJlbnQgY29udGFpbmVyXG4gICAgICAgICFpc1NhbWVWTm9kZVR5cGUob2xkVk5vZGUsIG5ld1ZOb2RlKSB8fCAvLyAtIEluIHRoZSBjYXNlIG9mIGEgY29tcG9uZW50LCBpdCBjb3VsZCBjb250YWluIGFueXRoaW5nLlxuICAgICAgICBvbGRWTm9kZS5zaGFwZUZsYWcgJiAoNiB8IDY0KSkgPyBob3N0UGFyZW50Tm9kZShvbGRWTm9kZS5lbCkgOiAoXG4gICAgICAgICAgLy8gSW4gb3RoZXIgY2FzZXMsIHRoZSBwYXJlbnQgY29udGFpbmVyIGlzIG5vdCBhY3R1YWxseSB1c2VkIHNvIHdlXG4gICAgICAgICAgLy8ganVzdCBwYXNzIHRoZSBibG9jayBlbGVtZW50IGhlcmUgdG8gYXZvaWQgYSBET00gcGFyZW50Tm9kZSBjYWxsLlxuICAgICAgICAgIGZhbGxiYWNrQ29udGFpbmVyXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwYXRjaChcbiAgICAgICAgb2xkVk5vZGUsXG4gICAgICAgIG5ld1ZOb2RlLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hQcm9wcyA9IChlbCwgdm5vZGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlKSA9PiB7XG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcykge1xuICAgICAgaWYgKG9sZFByb3BzICE9PSBFTVBUWV9PQkopIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2xkUHJvcHMpIHtcbiAgICAgICAgICBpZiAoIWlzUmVzZXJ2ZWRQcm9wKGtleSkgJiYgIShrZXkgaW4gbmV3UHJvcHMpKSB7XG4gICAgICAgICAgICBob3N0UGF0Y2hQcm9wKFxuICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICBvbGRQcm9wc1trZXldLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgIHZub2RlLmNoaWxkcmVuLFxuICAgICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgICB1bm1vdW50Q2hpbGRyZW5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdQcm9wcykge1xuICAgICAgICBpZiAoaXNSZXNlcnZlZFByb3Aoa2V5KSlcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbmV4dCA9IG5ld1Byb3BzW2tleV07XG4gICAgICAgIGNvbnN0IHByZXYgPSBvbGRQcm9wc1trZXldO1xuICAgICAgICBpZiAobmV4dCAhPT0gcHJldiAmJiBrZXkgIT09IFwidmFsdWVcIikge1xuICAgICAgICAgIGhvc3RQYXRjaFByb3AoXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHByZXYsXG4gICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgdm5vZGUuY2hpbGRyZW4sXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIHVubW91bnRDaGlsZHJlblxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChcInZhbHVlXCIgaW4gbmV3UHJvcHMpIHtcbiAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwgXCJ2YWx1ZVwiLCBvbGRQcm9wcy52YWx1ZSwgbmV3UHJvcHMudmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzRnJhZ21lbnQgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGZyYWdtZW50U3RhcnRBbmNob3IgPSBuMi5lbCA9IG4xID8gbjEuZWwgOiBob3N0Q3JlYXRlVGV4dChcIlwiKTtcbiAgICBjb25zdCBmcmFnbWVudEVuZEFuY2hvciA9IG4yLmFuY2hvciA9IG4xID8gbjEuYW5jaG9yIDogaG9zdENyZWF0ZVRleHQoXCJcIik7XG4gICAgbGV0IHsgcGF0Y2hGbGFnLCBkeW5hbWljQ2hpbGRyZW4sIHNsb3RTY29wZUlkczogZnJhZ21lbnRTbG90U2NvcGVJZHMgfSA9IG4yO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIC8vICM1NTIzIGRldiByb290IGZyYWdtZW50IG1heSBpbmhlcml0IGRpcmVjdGl2ZXNcbiAgICAoaXNIbXJVcGRhdGluZyB8fCBwYXRjaEZsYWcgJiAyMDQ4KSkge1xuICAgICAgcGF0Y2hGbGFnID0gMDtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGZyYWdtZW50U2xvdFNjb3BlSWRzKSB7XG4gICAgICBzbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHMgPyBzbG90U2NvcGVJZHMuY29uY2F0KGZyYWdtZW50U2xvdFNjb3BlSWRzKSA6IGZyYWdtZW50U2xvdFNjb3BlSWRzO1xuICAgIH1cbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgaG9zdEluc2VydChmcmFnbWVudFN0YXJ0QW5jaG9yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBob3N0SW5zZXJ0KGZyYWdtZW50RW5kQW5jaG9yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICAvLyAjMTAwMDdcbiAgICAgICAgLy8gc3VjaCBmcmFnbWVudCBsaWtlIGA8PjwvPmAgd2lsbCBiZSBjb21waWxlZCBpbnRvXG4gICAgICAgIC8vIGEgZnJhZ21lbnQgd2hpY2ggZG9lc24ndCBoYXZlIGEgY2hpbGRyZW4uXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSBmYWxsYmFjayB0byBhbiBlbXB0eSBhcnJheVxuICAgICAgICBuMi5jaGlsZHJlbiB8fCBbXSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBmcmFnbWVudEVuZEFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBhdGNoRmxhZyA+IDAgJiYgcGF0Y2hGbGFnICYgNjQgJiYgZHluYW1pY0NoaWxkcmVuICYmIC8vICMyNzE1IHRoZSBwcmV2aW91cyBmcmFnbWVudCBjb3VsZCd2ZSBiZWVuIGEgQkFJTGVkIG9uZSBhcyBhIHJlc3VsdFxuICAgICAgLy8gb2YgcmVuZGVyU2xvdCgpIHdpdGggbm8gdmFsaWQgY2hpbGRyZW5cbiAgICAgIG4xLmR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgICBwYXRjaEJsb2NrQ2hpbGRyZW4oXG4gICAgICAgICAgbjEuZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB0cmF2ZXJzZVN0YXRpY0NoaWxkcmVuKG4xLCBuMik7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gIzIwODAgaWYgdGhlIHN0YWJsZSBmcmFnbWVudCBoYXMgYSBrZXksIGl0J3MgYSA8dGVtcGxhdGUgdi1mb3I+IHRoYXQgbWF5XG4gICAgICAgICAgLy8gIGdldCBtb3ZlZCBhcm91bmQuIE1ha2Ugc3VyZSBhbGwgcm9vdCBsZXZlbCB2bm9kZXMgaW5oZXJpdCBlbC5cbiAgICAgICAgICAvLyAjMjEzNCBvciBpZiBpdCdzIGEgY29tcG9uZW50IHJvb3QsIGl0IG1heSBhbHNvIGdldCBtb3ZlZCBhcm91bmRcbiAgICAgICAgICAvLyBhcyB0aGUgY29tcG9uZW50IGlzIGJlaW5nIG1vdmVkLlxuICAgICAgICAgIG4yLmtleSAhPSBudWxsIHx8IHBhcmVudENvbXBvbmVudCAmJiBuMiA9PT0gcGFyZW50Q29tcG9uZW50LnN1YlRyZWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAvKiBzaGFsbG93ICovXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0Y2hDaGlsZHJlbihcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgZnJhZ21lbnRFbmRBbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzQ29tcG9uZW50ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBuMi5zbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHM7XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGlmIChuMi5zaGFwZUZsYWcgJiA1MTIpIHtcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LmN0eC5hY3RpdmF0ZShcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1vdW50Q29tcG9uZW50KFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlQ29tcG9uZW50KG4xLCBuMiwgb3B0aW1pemVkKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50Q29tcG9uZW50ID0gKGluaXRpYWxWTm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgb3B0aW1pemVkKSA9PiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSAoaW5pdGlhbFZOb2RlLmNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKFxuICAgICAgaW5pdGlhbFZOb2RlLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2VcbiAgICApKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpbnN0YW5jZS50eXBlLl9faG1ySWQpIHtcbiAgICAgIHJlZ2lzdGVySE1SKGluc3RhbmNlKTtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChpbml0aWFsVk5vZGUpO1xuICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgbW91bnRgKTtcbiAgICB9XG4gICAgaWYgKGlzS2VlcEFsaXZlKGluaXRpYWxWTm9kZSkpIHtcbiAgICAgIGluc3RhbmNlLmN0eC5yZW5kZXJlciA9IGludGVybmFscztcbiAgICB9XG4gICAge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgaW5pdGApO1xuICAgICAgfVxuICAgICAgc2V0dXBDb21wb25lbnQoaW5zdGFuY2UpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYGluaXRgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluc3RhbmNlLmFzeW5jRGVwKSB7XG4gICAgICBwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5yZWdpc3RlckRlcChpbnN0YW5jZSwgc2V0dXBSZW5kZXJFZmZlY3QpO1xuICAgICAgaWYgKCFpbml0aWFsVk5vZGUuZWwpIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBpbnN0YW5jZS5zdWJUcmVlID0gY3JlYXRlVk5vZGUoQ29tbWVudCk7XG4gICAgICAgIHByb2Nlc3NDb21tZW50Tm9kZShudWxsLCBwbGFjZWhvbGRlciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXR1cFJlbmRlckVmZmVjdChcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIGluaXRpYWxWTm9kZSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgbW91bnRgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHVwZGF0ZUNvbXBvbmVudCA9IChuMSwgbjIsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbjIuY29tcG9uZW50ID0gbjEuY29tcG9uZW50O1xuICAgIGlmIChzaG91bGRVcGRhdGVDb21wb25lbnQobjEsIG4yLCBvcHRpbWl6ZWQpKSB7XG4gICAgICBpZiAoaW5zdGFuY2UuYXN5bmNEZXAgJiYgIWluc3RhbmNlLmFzeW5jUmVzb2x2ZWQpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwdXNoV2FybmluZ0NvbnRleHQobjIpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlcihpbnN0YW5jZSwgbjIsIG9wdGltaXplZCk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0YW5jZS5uZXh0ID0gbjI7XG4gICAgICAgIGludmFsaWRhdGVKb2IoaW5zdGFuY2UudXBkYXRlKTtcbiAgICAgICAgaW5zdGFuY2UuZWZmZWN0LmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgICBpbnN0YW5jZS52bm9kZSA9IG4yO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc2V0dXBSZW5kZXJFZmZlY3QgPSAoaW5zdGFuY2UsIGluaXRpYWxWTm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudFVwZGF0ZUZuID0gKCkgPT4ge1xuICAgICAgaWYgKCFpbnN0YW5jZS5pc01vdW50ZWQpIHtcbiAgICAgICAgbGV0IHZub2RlSG9vaztcbiAgICAgICAgY29uc3QgeyBlbCwgcHJvcHMgfSA9IGluaXRpYWxWTm9kZTtcbiAgICAgICAgY29uc3QgeyBibSwgbSwgcGFyZW50IH0gPSBpbnN0YW5jZTtcbiAgICAgICAgY29uc3QgaXNBc3luY1dyYXBwZXJWTm9kZSA9IGlzQXN5bmNXcmFwcGVyKGluaXRpYWxWTm9kZSk7XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIGZhbHNlKTtcbiAgICAgICAgaWYgKGJtKSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoYm0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBc3luY1dyYXBwZXJWTm9kZSAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZUJlZm9yZU1vdW50KSkge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgaW5pdGlhbFZOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCB0cnVlKTtcbiAgICAgICAgaWYgKGVsICYmIGh5ZHJhdGVOb2RlKSB7XG4gICAgICAgICAgY29uc3QgaHlkcmF0ZVN1YlRyZWUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluc3RhbmNlLnN1YlRyZWUgPSByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKTtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYGh5ZHJhdGVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh5ZHJhdGVOb2RlKFxuICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAgaW5zdGFuY2Uuc3ViVHJlZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYGh5ZHJhdGVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpc0FzeW5jV3JhcHBlclZOb2RlKSB7XG4gICAgICAgICAgICBpbml0aWFsVk5vZGUudHlwZS5fX2FzeW5jTG9hZGVyKCkudGhlbihcbiAgICAgICAgICAgICAgLy8gbm90ZTogd2UgYXJlIG1vdmluZyB0aGUgcmVuZGVyIGNhbGwgaW50byBhbiBhc3luYyBjYWxsYmFjayxcbiAgICAgICAgICAgICAgLy8gd2hpY2ggbWVhbnMgaXQgd29uJ3QgdHJhY2sgZGVwZW5kZW5jaWVzIC0gYnV0IGl0J3Mgb2sgYmVjYXVzZVxuICAgICAgICAgICAgICAvLyBhIHNlcnZlci1yZW5kZXJlZCBhc3luYyB3cmFwcGVyIGlzIGFscmVhZHkgaW4gcmVzb2x2ZWQgc3RhdGVcbiAgICAgICAgICAgICAgLy8gYW5kIGl0IHdpbGwgbmV2ZXIgbmVlZCB0byBjaGFuZ2UuXG4gICAgICAgICAgICAgICgpID0+ICFpbnN0YW5jZS5pc1VubW91bnRlZCAmJiBoeWRyYXRlU3ViVHJlZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoeWRyYXRlU3ViVHJlZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHN1YlRyZWUgPSBpbnN0YW5jZS5zdWJUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHN1YlRyZWUsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluaXRpYWxWTm9kZS5lbCA9IHN1YlRyZWUuZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QobSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBc3luY1dyYXBwZXJWTm9kZSAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpKSB7XG4gICAgICAgICAgY29uc3Qgc2NvcGVkSW5pdGlhbFZOb2RlID0gaW5pdGlhbFZOb2RlO1xuICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChcbiAgICAgICAgICAgICgpID0+IGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgc2NvcGVkSW5pdGlhbFZOb2RlKSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5pdGlhbFZOb2RlLnNoYXBlRmxhZyAmIDI1NiB8fCBwYXJlbnQgJiYgaXNBc3luY1dyYXBwZXIocGFyZW50LnZub2RlKSAmJiBwYXJlbnQudm5vZGUuc2hhcGVGbGFnICYgMjU2KSB7XG4gICAgICAgICAgaW5zdGFuY2UuYSAmJiBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoaW5zdGFuY2UuYSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLmlzTW91bnRlZCA9IHRydWU7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGluaXRpYWxWTm9kZSA9IGNvbnRhaW5lciA9IGFuY2hvciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgeyBuZXh0LCBidSwgdSwgcGFyZW50LCB2bm9kZSB9ID0gaW5zdGFuY2U7XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBub25IeWRyYXRlZEFzeW5jUm9vdCA9IGxvY2F0ZU5vbkh5ZHJhdGVkQXN5bmNSb290KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAobm9uSHlkcmF0ZWRBc3luY1Jvb3QpIHtcbiAgICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAgIG5leHQuZWwgPSB2bm9kZS5lbDtcbiAgICAgICAgICAgICAgdXBkYXRlQ29tcG9uZW50UHJlUmVuZGVyKGluc3RhbmNlLCBuZXh0LCBvcHRpbWl6ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9uSHlkcmF0ZWRBc3luY1Jvb3QuYXN5bmNEZXAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaW5zdGFuY2UuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRVcGRhdGVGbigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9yaWdpbk5leHQgPSBuZXh0O1xuICAgICAgICBsZXQgdm5vZGVIb29rO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChuZXh0IHx8IGluc3RhbmNlLnZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCBmYWxzZSk7XG4gICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgbmV4dC5lbCA9IHZub2RlLmVsO1xuICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlcihpbnN0YW5jZSwgbmV4dCwgb3B0aW1pemVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0ID0gdm5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1KSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoYnUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2bm9kZUhvb2sgPSBuZXh0LnByb3BzICYmIG5leHQucHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgbmV4dCwgdm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIHRydWUpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5leHRUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZUcmVlID0gaW5zdGFuY2Uuc3ViVHJlZTtcbiAgICAgICAgaW5zdGFuY2Uuc3ViVHJlZSA9IG5leHRUcmVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgcHJldlRyZWUsXG4gICAgICAgICAgbmV4dFRyZWUsXG4gICAgICAgICAgLy8gcGFyZW50IG1heSBoYXZlIGNoYW5nZWQgaWYgaXQncyBpbiBhIHRlbGVwb3J0XG4gICAgICAgICAgaG9zdFBhcmVudE5vZGUocHJldlRyZWUuZWwpLFxuICAgICAgICAgIC8vIGFuY2hvciBtYXkgaGF2ZSBjaGFuZ2VkIGlmIGl0J3MgaW4gYSBmcmFnbWVudFxuICAgICAgICAgIGdldE5leHRIb3N0Tm9kZShwcmV2VHJlZSksXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dC5lbCA9IG5leHRUcmVlLmVsO1xuICAgICAgICBpZiAob3JpZ2luTmV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhPQ0hvc3RFbChpbnN0YW5jZSwgbmV4dFRyZWUuZWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1KSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KHUsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodm5vZGVIb29rID0gbmV4dC5wcm9wcyAmJiBuZXh0LnByb3BzLm9uVm5vZGVVcGRhdGVkKSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4gaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50LCBuZXh0LCB2bm9kZSksXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGVmZmVjdCA9IGluc3RhbmNlLmVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChcbiAgICAgIGNvbXBvbmVudFVwZGF0ZUZuLFxuICAgICAgTk9PUCxcbiAgICAgICgpID0+IHF1ZXVlSm9iKHVwZGF0ZSksXG4gICAgICBpbnN0YW5jZS5zY29wZVxuICAgICAgLy8gdHJhY2sgaXQgaW4gY29tcG9uZW50J3MgZWZmZWN0IHNjb3BlXG4gICAgKTtcbiAgICBjb25zdCB1cGRhdGUgPSBpbnN0YW5jZS51cGRhdGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWZmZWN0LmRpcnR5KSB7XG4gICAgICAgIGVmZmVjdC5ydW4oKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHVwZGF0ZS5pZCA9IGluc3RhbmNlLnVpZDtcbiAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCB0cnVlKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgZWZmZWN0Lm9uVHJhY2sgPSBpbnN0YW5jZS5ydGMgPyAoZSkgPT4gaW52b2tlQXJyYXlGbnMoaW5zdGFuY2UucnRjLCBlKSA6IHZvaWQgMDtcbiAgICAgIGVmZmVjdC5vblRyaWdnZXIgPSBpbnN0YW5jZS5ydGcgPyAoZSkgPT4gaW52b2tlQXJyYXlGbnMoaW5zdGFuY2UucnRnLCBlKSA6IHZvaWQgMDtcbiAgICAgIHVwZGF0ZS5vd25lckluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgfVxuICAgIHVwZGF0ZSgpO1xuICB9O1xuICBjb25zdCB1cGRhdGVDb21wb25lbnRQcmVSZW5kZXIgPSAoaW5zdGFuY2UsIG5leHRWTm9kZSwgb3B0aW1pemVkKSA9PiB7XG4gICAgbmV4dFZOb2RlLmNvbXBvbmVudCA9IGluc3RhbmNlO1xuICAgIGNvbnN0IHByZXZQcm9wcyA9IGluc3RhbmNlLnZub2RlLnByb3BzO1xuICAgIGluc3RhbmNlLnZub2RlID0gbmV4dFZOb2RlO1xuICAgIGluc3RhbmNlLm5leHQgPSBudWxsO1xuICAgIHVwZGF0ZVByb3BzKGluc3RhbmNlLCBuZXh0Vk5vZGUucHJvcHMsIHByZXZQcm9wcywgb3B0aW1pemVkKTtcbiAgICB1cGRhdGVTbG90cyhpbnN0YW5jZSwgbmV4dFZOb2RlLmNoaWxkcmVuLCBvcHRpbWl6ZWQpO1xuICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICBmbHVzaFByZUZsdXNoQ2JzKGluc3RhbmNlKTtcbiAgICByZXNldFRyYWNraW5nKCk7XG4gIH07XG4gIGNvbnN0IHBhdGNoQ2hpbGRyZW4gPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgYzEgPSBuMSAmJiBuMS5jaGlsZHJlbjtcbiAgICBjb25zdCBwcmV2U2hhcGVGbGFnID0gbjEgPyBuMS5zaGFwZUZsYWcgOiAwO1xuICAgIGNvbnN0IGMyID0gbjIuY2hpbGRyZW47XG4gICAgY29uc3QgeyBwYXRjaEZsYWcsIHNoYXBlRmxhZyB9ID0gbjI7XG4gICAgaWYgKHBhdGNoRmxhZyA+IDApIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgJiAxMjgpIHtcbiAgICAgICAgcGF0Y2hLZXllZENoaWxkcmVuKFxuICAgICAgICAgIGMxLFxuICAgICAgICAgIGMyLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAocGF0Y2hGbGFnICYgMjU2KSB7XG4gICAgICAgIHBhdGNoVW5rZXllZENoaWxkcmVuKFxuICAgICAgICAgIGMxLFxuICAgICAgICAgIGMyLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDgpIHtcbiAgICAgIGlmIChwcmV2U2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgdW5tb3VudENoaWxkcmVuKGMxLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChjMiAhPT0gYzEpIHtcbiAgICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGNvbnRhaW5lciwgYzIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJldlNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgICAgIHBhdGNoS2V5ZWRDaGlsZHJlbihcbiAgICAgICAgICAgIGMxLFxuICAgICAgICAgICAgYzIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5tb3VudENoaWxkcmVuKGMxLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByZXZTaGFwZUZsYWcgJiA4KSB7XG4gICAgICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGNvbnRhaW5lciwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgICAgIGMyLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaFVua2V5ZWRDaGlsZHJlbiA9IChjMSwgYzIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgYzEgPSBjMSB8fCBFTVBUWV9BUlI7XG4gICAgYzIgPSBjMiB8fCBFTVBUWV9BUlI7XG4gICAgY29uc3Qgb2xkTGVuZ3RoID0gYzEubGVuZ3RoO1xuICAgIGNvbnN0IG5ld0xlbmd0aCA9IGMyLmxlbmd0aDtcbiAgICBjb25zdCBjb21tb25MZW5ndGggPSBNYXRoLm1pbihvbGRMZW5ndGgsIG5ld0xlbmd0aCk7XG4gICAgbGV0IGk7XG4gICAgZm9yIChpID0gMDsgaSA8IGNvbW1vbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuZXh0Q2hpbGQgPSBjMltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGMyW2ldKTtcbiAgICAgIHBhdGNoKFxuICAgICAgICBjMVtpXSxcbiAgICAgICAgbmV4dENoaWxkLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvbGRMZW5ndGggPiBuZXdMZW5ndGgpIHtcbiAgICAgIHVubW91bnRDaGlsZHJlbihcbiAgICAgICAgYzEsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHRydWUsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBjb21tb25MZW5ndGhcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgIGMyLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgY29tbW9uTGVuZ3RoXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hLZXllZENoaWxkcmVuID0gKGMxLCBjMiwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBsZXQgaSA9IDA7XG4gICAgY29uc3QgbDIgPSBjMi5sZW5ndGg7XG4gICAgbGV0IGUxID0gYzEubGVuZ3RoIC0gMTtcbiAgICBsZXQgZTIgPSBsMiAtIDE7XG4gICAgd2hpbGUgKGkgPD0gZTEgJiYgaSA8PSBlMikge1xuICAgICAgY29uc3QgbjEgPSBjMVtpXTtcbiAgICAgIGNvbnN0IG4yID0gYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSk7XG4gICAgICBpZiAoaXNTYW1lVk5vZGVUeXBlKG4xLCBuMikpIHtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG4gICAgd2hpbGUgKGkgPD0gZTEgJiYgaSA8PSBlMikge1xuICAgICAgY29uc3QgbjEgPSBjMVtlMV07XG4gICAgICBjb25zdCBuMiA9IGMyW2UyXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2UyXSkgOiBub3JtYWxpemVWTm9kZShjMltlMl0pO1xuICAgICAgaWYgKGlzU2FtZVZOb2RlVHlwZShuMSwgbjIpKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG4xLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBlMS0tO1xuICAgICAgZTItLTtcbiAgICB9XG4gICAgaWYgKGkgPiBlMSkge1xuICAgICAgaWYgKGkgPD0gZTIpIHtcbiAgICAgICAgY29uc3QgbmV4dFBvcyA9IGUyICsgMTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gbmV4dFBvcyA8IGwyID8gYzJbbmV4dFBvc10uZWwgOiBwYXJlbnRBbmNob3I7XG4gICAgICAgIHdoaWxlIChpIDw9IGUyKSB7XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSksXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpID4gZTIpIHtcbiAgICAgIHdoaWxlIChpIDw9IGUxKSB7XG4gICAgICAgIHVubW91bnQoYzFbaV0sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHMxID0gaTtcbiAgICAgIGNvbnN0IHMyID0gaTtcbiAgICAgIGNvbnN0IGtleVRvTmV3SW5kZXhNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgZm9yIChpID0gczI7IGkgPD0gZTI7IGkrKykge1xuICAgICAgICBjb25zdCBuZXh0Q2hpbGQgPSBjMltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGMyW2ldKTtcbiAgICAgICAgaWYgKG5leHRDaGlsZC5rZXkgIT0gbnVsbCkge1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleVRvTmV3SW5kZXhNYXAuaGFzKG5leHRDaGlsZC5rZXkpKSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIGBEdXBsaWNhdGUga2V5cyBmb3VuZCBkdXJpbmcgdXBkYXRlOmAsXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5leHRDaGlsZC5rZXkpLFxuICAgICAgICAgICAgICBgTWFrZSBzdXJlIGtleXMgYXJlIHVuaXF1ZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZXlUb05ld0luZGV4TWFwLnNldChuZXh0Q2hpbGQua2V5LCBpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGo7XG4gICAgICBsZXQgcGF0Y2hlZCA9IDA7XG4gICAgICBjb25zdCB0b0JlUGF0Y2hlZCA9IGUyIC0gczIgKyAxO1xuICAgICAgbGV0IG1vdmVkID0gZmFsc2U7XG4gICAgICBsZXQgbWF4TmV3SW5kZXhTb0ZhciA9IDA7XG4gICAgICBjb25zdCBuZXdJbmRleFRvT2xkSW5kZXhNYXAgPSBuZXcgQXJyYXkodG9CZVBhdGNoZWQpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHRvQmVQYXRjaGVkOyBpKyspXG4gICAgICAgIG5ld0luZGV4VG9PbGRJbmRleE1hcFtpXSA9IDA7XG4gICAgICBmb3IgKGkgPSBzMTsgaSA8PSBlMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByZXZDaGlsZCA9IGMxW2ldO1xuICAgICAgICBpZiAocGF0Y2hlZCA+PSB0b0JlUGF0Y2hlZCkge1xuICAgICAgICAgIHVubW91bnQocHJldkNoaWxkLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3SW5kZXg7XG4gICAgICAgIGlmIChwcmV2Q2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdJbmRleCA9IGtleVRvTmV3SW5kZXhNYXAuZ2V0KHByZXZDaGlsZC5rZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAoaiA9IHMyOyBqIDw9IGUyOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChuZXdJbmRleFRvT2xkSW5kZXhNYXBbaiAtIHMyXSA9PT0gMCAmJiBpc1NhbWVWTm9kZVR5cGUocHJldkNoaWxkLCBjMltqXSkpIHtcbiAgICAgICAgICAgICAgbmV3SW5kZXggPSBqO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld0luZGV4ID09PSB2b2lkIDApIHtcbiAgICAgICAgICB1bm1vdW50KHByZXZDaGlsZCwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3SW5kZXhUb09sZEluZGV4TWFwW25ld0luZGV4IC0gczJdID0gaSArIDE7XG4gICAgICAgICAgaWYgKG5ld0luZGV4ID49IG1heE5ld0luZGV4U29GYXIpIHtcbiAgICAgICAgICAgIG1heE5ld0luZGV4U29GYXIgPSBuZXdJbmRleDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIHByZXZDaGlsZCxcbiAgICAgICAgICAgIGMyW25ld0luZGV4XSxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgcGF0Y2hlZCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBpbmNyZWFzaW5nTmV3SW5kZXhTZXF1ZW5jZSA9IG1vdmVkID8gZ2V0U2VxdWVuY2UobmV3SW5kZXhUb09sZEluZGV4TWFwKSA6IEVNUFRZX0FSUjtcbiAgICAgIGogPSBpbmNyZWFzaW5nTmV3SW5kZXhTZXF1ZW5jZS5sZW5ndGggLSAxO1xuICAgICAgZm9yIChpID0gdG9CZVBhdGNoZWQgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBzMiArIGk7XG4gICAgICAgIGNvbnN0IG5leHRDaGlsZCA9IGMyW25leHRJbmRleF07XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IG5leHRJbmRleCArIDEgPCBsMiA/IGMyW25leHRJbmRleCArIDFdLmVsIDogcGFyZW50QW5jaG9yO1xuICAgICAgICBpZiAobmV3SW5kZXhUb09sZEluZGV4TWFwW2ldID09PSAwKSB7XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbmV4dENoaWxkLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKG1vdmVkKSB7XG4gICAgICAgICAgaWYgKGogPCAwIHx8IGkgIT09IGluY3JlYXNpbmdOZXdJbmRleFNlcXVlbmNlW2pdKSB7XG4gICAgICAgICAgICBtb3ZlKG5leHRDaGlsZCwgY29udGFpbmVyLCBhbmNob3IsIDIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBqLS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3ZlID0gKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUsIHBhcmVudFN1c3BlbnNlID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IHsgZWwsIHR5cGUsIHRyYW5zaXRpb24sIGNoaWxkcmVuLCBzaGFwZUZsYWcgfSA9IHZub2RlO1xuICAgIGlmIChzaGFwZUZsYWcgJiA2KSB7XG4gICAgICBtb3ZlKHZub2RlLmNvbXBvbmVudC5zdWJUcmVlLCBjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICB2bm9kZS5zdXNwZW5zZS5tb3ZlKGNvbnRhaW5lciwgYW5jaG9yLCBtb3ZlVHlwZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgdHlwZS5tb3ZlKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgaW50ZXJuYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vdmUoY2hpbGRyZW5baV0sIGNvbnRhaW5lciwgYW5jaG9yLCBtb3ZlVHlwZSk7XG4gICAgICB9XG4gICAgICBob3N0SW5zZXJ0KHZub2RlLmFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gU3RhdGljKSB7XG4gICAgICBtb3ZlU3RhdGljTm9kZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZWVkVHJhbnNpdGlvbjIgPSBtb3ZlVHlwZSAhPT0gMiAmJiBzaGFwZUZsYWcgJiAxICYmIHRyYW5zaXRpb247XG4gICAgaWYgKG5lZWRUcmFuc2l0aW9uMikge1xuICAgICAgaWYgKG1vdmVUeXBlID09PSAwKSB7XG4gICAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoZWwpO1xuICAgICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB0cmFuc2l0aW9uLmVudGVyKGVsKSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBsZWF2ZSwgZGVsYXlMZWF2ZSwgYWZ0ZXJMZWF2ZSB9ID0gdHJhbnNpdGlvbjtcbiAgICAgICAgY29uc3QgcmVtb3ZlMiA9ICgpID0+IGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgY29uc3QgcGVyZm9ybUxlYXZlID0gKCkgPT4ge1xuICAgICAgICAgIGxlYXZlKGVsLCAoKSA9PiB7XG4gICAgICAgICAgICByZW1vdmUyKCk7XG4gICAgICAgICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRlbGF5TGVhdmUpIHtcbiAgICAgICAgICBkZWxheUxlYXZlKGVsLCByZW1vdmUyLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlcmZvcm1MZWF2ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHVubW91bnQgPSAodm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlID0gZmFsc2UsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgdHlwZSxcbiAgICAgIHByb3BzLFxuICAgICAgcmVmLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICBzaGFwZUZsYWcsXG4gICAgICBwYXRjaEZsYWcsXG4gICAgICBkaXJzXG4gICAgfSA9IHZub2RlO1xuICAgIGlmIChyZWYgIT0gbnVsbCkge1xuICAgICAgc2V0UmVmKHJlZiwgbnVsbCwgcGFyZW50U3VzcGVuc2UsIHZub2RlLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDI1Nikge1xuICAgICAgcGFyZW50Q29tcG9uZW50LmN0eC5kZWFjdGl2YXRlKHZub2RlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkSW52b2tlRGlycyA9IHNoYXBlRmxhZyAmIDEgJiYgZGlycztcbiAgICBjb25zdCBzaG91bGRJbnZva2VWbm9kZUhvb2sgPSAhaXNBc3luY1dyYXBwZXIodm5vZGUpO1xuICAgIGxldCB2bm9kZUhvb2s7XG4gICAgaWYgKHNob3VsZEludm9rZVZub2RlSG9vayAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZUJlZm9yZVVubW91bnQpKSB7XG4gICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgIHVubW91bnRDb21wb25lbnQodm5vZGUuY29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICAgIHZub2RlLnN1c3BlbnNlLnVubW91bnQocGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZEludm9rZURpcnMpIHtcbiAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZVVubW91bnRcIik7XG4gICAgICB9XG4gICAgICBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgICAgdm5vZGUudHlwZS5yZW1vdmUoXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgICBpbnRlcm5hbHMsXG4gICAgICAgICAgZG9SZW1vdmVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZHluYW1pY0NoaWxkcmVuICYmIC8vICMxMTUzOiBmYXN0IHBhdGggc2hvdWxkIG5vdCBiZSB0YWtlbiBmb3Igbm9uLXN0YWJsZSAodi1mb3IpIGZyYWdtZW50c1xuICAgICAgKHR5cGUgIT09IEZyYWdtZW50IHx8IHBhdGNoRmxhZyA+IDAgJiYgcGF0Y2hGbGFnICYgNjQpKSB7XG4gICAgICAgIHVubW91bnRDaGlsZHJlbihcbiAgICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gRnJhZ21lbnQgJiYgcGF0Y2hGbGFnICYgKDEyOCB8IDI1NikgfHwgIW9wdGltaXplZCAmJiBzaGFwZUZsYWcgJiAxNikge1xuICAgICAgICB1bm1vdW50Q2hpbGRyZW4oY2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfVxuICAgICAgaWYgKGRvUmVtb3ZlKSB7XG4gICAgICAgIHJlbW92ZSh2bm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRJbnZva2VWbm9kZUhvb2sgJiYgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVVbm1vdW50ZWQpIHx8IHNob3VsZEludm9rZURpcnMpIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgICAgc2hvdWxkSW52b2tlRGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwidW5tb3VudGVkXCIpO1xuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcmVtb3ZlID0gKHZub2RlKSA9PiB7XG4gICAgY29uc3QgeyB0eXBlLCBlbCwgYW5jaG9yLCB0cmFuc2l0aW9uIH0gPSB2bm9kZTtcbiAgICBpZiAodHlwZSA9PT0gRnJhZ21lbnQpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHZub2RlLnBhdGNoRmxhZyA+IDAgJiYgdm5vZGUucGF0Y2hGbGFnICYgMjA0OCAmJiB0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZCkge1xuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSBDb21tZW50KSB7XG4gICAgICAgICAgICBob3N0UmVtb3ZlKGNoaWxkLmVsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlKGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlRnJhZ21lbnQoZWwsIGFuY2hvcik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBTdGF0aWMpIHtcbiAgICAgIHJlbW92ZVN0YXRpY05vZGUodm5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwZXJmb3JtUmVtb3ZlID0gKCkgPT4ge1xuICAgICAgaG9zdFJlbW92ZShlbCk7XG4gICAgICBpZiAodHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQgJiYgdHJhbnNpdGlvbi5hZnRlckxlYXZlKSB7XG4gICAgICAgIHRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEgJiYgdHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQpIHtcbiAgICAgIGNvbnN0IHsgbGVhdmUsIGRlbGF5TGVhdmUgfSA9IHRyYW5zaXRpb247XG4gICAgICBjb25zdCBwZXJmb3JtTGVhdmUgPSAoKSA9PiBsZWF2ZShlbCwgcGVyZm9ybVJlbW92ZSk7XG4gICAgICBpZiAoZGVsYXlMZWF2ZSkge1xuICAgICAgICBkZWxheUxlYXZlKHZub2RlLmVsLCBwZXJmb3JtUmVtb3ZlLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVyZm9ybUxlYXZlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlcmZvcm1SZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlbW92ZUZyYWdtZW50ID0gKGN1ciwgZW5kKSA9PiB7XG4gICAgbGV0IG5leHQ7XG4gICAgd2hpbGUgKGN1ciAhPT0gZW5kKSB7XG4gICAgICBuZXh0ID0gaG9zdE5leHRTaWJsaW5nKGN1cik7XG4gICAgICBob3N0UmVtb3ZlKGN1cik7XG4gICAgICBjdXIgPSBuZXh0O1xuICAgIH1cbiAgICBob3N0UmVtb3ZlKGVuZCk7XG4gIH07XG4gIGNvbnN0IHVubW91bnRDb21wb25lbnQgPSAoaW5zdGFuY2UsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSkgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGluc3RhbmNlLnR5cGUuX19obXJJZCkge1xuICAgICAgdW5yZWdpc3RlckhNUihpbnN0YW5jZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgYnVtLCBzY29wZSwgdXBkYXRlLCBzdWJUcmVlLCB1bSB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKGJ1bSkge1xuICAgICAgaW52b2tlQXJyYXlGbnMoYnVtKTtcbiAgICB9XG4gICAgc2NvcGUuc3RvcCgpO1xuICAgIGlmICh1cGRhdGUpIHtcbiAgICAgIHVwZGF0ZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIHVubW91bnQoc3ViVHJlZSwgaW5zdGFuY2UsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSk7XG4gICAgfVxuICAgIGlmICh1bSkge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KHVtLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICBpbnN0YW5jZS5pc1VubW91bnRlZCA9IHRydWU7XG4gICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIGlmIChwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nQnJhbmNoICYmICFwYXJlbnRTdXNwZW5zZS5pc1VubW91bnRlZCAmJiBpbnN0YW5jZS5hc3luY0RlcCAmJiAhaW5zdGFuY2UuYXN5bmNSZXNvbHZlZCAmJiBpbnN0YW5jZS5zdXNwZW5zZUlkID09PSBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nSWQpIHtcbiAgICAgIHBhcmVudFN1c3BlbnNlLmRlcHMtLTtcbiAgICAgIGlmIChwYXJlbnRTdXNwZW5zZS5kZXBzID09PSAwKSB7XG4gICAgICAgIHBhcmVudFN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZXZ0b29sc0NvbXBvbmVudFJlbW92ZWQoaW5zdGFuY2UpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgdW5tb3VudENoaWxkcmVuID0gKGNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSA9IGZhbHNlLCBvcHRpbWl6ZWQgPSBmYWxzZSwgc3RhcnQgPSAwKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHVubW91bnQoY2hpbGRyZW5baV0sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlLCBvcHRpbWl6ZWQpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZ2V0TmV4dEhvc3ROb2RlID0gKHZub2RlKSA9PiB7XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDYpIHtcbiAgICAgIHJldHVybiBnZXROZXh0SG9zdE5vZGUodm5vZGUuY29tcG9uZW50LnN1YlRyZWUpO1xuICAgIH1cbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICByZXR1cm4gdm5vZGUuc3VzcGVuc2UubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gaG9zdE5leHRTaWJsaW5nKHZub2RlLmFuY2hvciB8fCB2bm9kZS5lbCk7XG4gIH07XG4gIGxldCBpc0ZsdXNoaW5nID0gZmFsc2U7XG4gIGNvbnN0IHJlbmRlciA9ICh2bm9kZSwgY29udGFpbmVyLCBuYW1lc3BhY2UpID0+IHtcbiAgICBpZiAodm5vZGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGNvbnRhaW5lci5fdm5vZGUpIHtcbiAgICAgICAgdW5tb3VudChjb250YWluZXIuX3Zub2RlLCBudWxsLCBudWxsLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGF0Y2goXG4gICAgICAgIGNvbnRhaW5lci5fdm5vZGUgfHwgbnVsbCxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbmFtZXNwYWNlXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWlzRmx1c2hpbmcpIHtcbiAgICAgIGlzRmx1c2hpbmcgPSB0cnVlO1xuICAgICAgZmx1c2hQcmVGbHVzaENicygpO1xuICAgICAgZmx1c2hQb3N0Rmx1c2hDYnMoKTtcbiAgICAgIGlzRmx1c2hpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgY29udGFpbmVyLl92bm9kZSA9IHZub2RlO1xuICB9O1xuICBjb25zdCBpbnRlcm5hbHMgPSB7XG4gICAgcDogcGF0Y2gsXG4gICAgdW06IHVubW91bnQsXG4gICAgbTogbW92ZSxcbiAgICByOiByZW1vdmUsXG4gICAgbXQ6IG1vdW50Q29tcG9uZW50LFxuICAgIG1jOiBtb3VudENoaWxkcmVuLFxuICAgIHBjOiBwYXRjaENoaWxkcmVuLFxuICAgIHBiYzogcGF0Y2hCbG9ja0NoaWxkcmVuLFxuICAgIG46IGdldE5leHRIb3N0Tm9kZSxcbiAgICBvOiBvcHRpb25zXG4gIH07XG4gIGxldCBoeWRyYXRlO1xuICBsZXQgaHlkcmF0ZU5vZGU7XG4gIGlmIChjcmVhdGVIeWRyYXRpb25GbnMpIHtcbiAgICBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdID0gY3JlYXRlSHlkcmF0aW9uRm5zKFxuICAgICAgaW50ZXJuYWxzXG4gICAgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlbmRlcixcbiAgICBoeWRyYXRlLFxuICAgIGNyZWF0ZUFwcDogY3JlYXRlQXBwQVBJKHJlbmRlciwgaHlkcmF0ZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVDaGlsZHJlbk5hbWVzcGFjZSh7IHR5cGUsIHByb3BzIH0sIGN1cnJlbnROYW1lc3BhY2UpIHtcbiAgcmV0dXJuIGN1cnJlbnROYW1lc3BhY2UgPT09IFwic3ZnXCIgJiYgdHlwZSA9PT0gXCJmb3JlaWduT2JqZWN0XCIgfHwgY3VycmVudE5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiAmJiB0eXBlID09PSBcImFubm90YXRpb24teG1sXCIgJiYgcHJvcHMgJiYgcHJvcHMuZW5jb2RpbmcgJiYgcHJvcHMuZW5jb2RpbmcuaW5jbHVkZXMoXCJodG1sXCIpID8gdm9pZCAwIDogY3VycmVudE5hbWVzcGFjZTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZVJlY3Vyc2UoeyBlZmZlY3QsIHVwZGF0ZSB9LCBhbGxvd2VkKSB7XG4gIGVmZmVjdC5hbGxvd1JlY3Vyc2UgPSB1cGRhdGUuYWxsb3dSZWN1cnNlID0gYWxsb3dlZDtcbn1cbmZ1bmN0aW9uIG5lZWRUcmFuc2l0aW9uKHBhcmVudFN1c3BlbnNlLCB0cmFuc2l0aW9uKSB7XG4gIHJldHVybiAoIXBhcmVudFN1c3BlbnNlIHx8IHBhcmVudFN1c3BlbnNlICYmICFwYXJlbnRTdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSAmJiB0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZDtcbn1cbmZ1bmN0aW9uIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4objEsIG4yLCBzaGFsbG93ID0gZmFsc2UpIHtcbiAgY29uc3QgY2gxID0gbjEuY2hpbGRyZW47XG4gIGNvbnN0IGNoMiA9IG4yLmNoaWxkcmVuO1xuICBpZiAoaXNBcnJheShjaDEpICYmIGlzQXJyYXkoY2gyKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2gxLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjMSA9IGNoMVtpXTtcbiAgICAgIGxldCBjMiA9IGNoMltpXTtcbiAgICAgIGlmIChjMi5zaGFwZUZsYWcgJiAxICYmICFjMi5keW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKGMyLnBhdGNoRmxhZyA8PSAwIHx8IGMyLnBhdGNoRmxhZyA9PT0gMzIpIHtcbiAgICAgICAgICBjMiA9IGNoMltpXSA9IGNsb25lSWZNb3VudGVkKGNoMltpXSk7XG4gICAgICAgICAgYzIuZWwgPSBjMS5lbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNoYWxsb3cpXG4gICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihjMSwgYzIpO1xuICAgICAgfVxuICAgICAgaWYgKGMyLnR5cGUgPT09IFRleHQpIHtcbiAgICAgICAgYzIuZWwgPSBjMS5lbDtcbiAgICAgIH1cbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGMyLnR5cGUgPT09IENvbW1lbnQgJiYgIWMyLmVsKSB7XG4gICAgICAgIGMyLmVsID0gYzEuZWw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBnZXRTZXF1ZW5jZShhcnIpIHtcbiAgY29uc3QgcCA9IGFyci5zbGljZSgpO1xuICBjb25zdCByZXN1bHQgPSBbMF07XG4gIGxldCBpLCBqLCB1LCB2LCBjO1xuICBjb25zdCBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBhcnJJID0gYXJyW2ldO1xuICAgIGlmIChhcnJJICE9PSAwKSB7XG4gICAgICBqID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChhcnJbal0gPCBhcnJJKSB7XG4gICAgICAgIHBbaV0gPSBqO1xuICAgICAgICByZXN1bHQucHVzaChpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB1ID0gMDtcbiAgICAgIHYgPSByZXN1bHQubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlICh1IDwgdikge1xuICAgICAgICBjID0gdSArIHYgPj4gMTtcbiAgICAgICAgaWYgKGFycltyZXN1bHRbY11dIDwgYXJySSkge1xuICAgICAgICAgIHUgPSBjICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ID0gYztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGFyckkgPCBhcnJbcmVzdWx0W3VdXSkge1xuICAgICAgICBpZiAodSA+IDApIHtcbiAgICAgICAgICBwW2ldID0gcmVzdWx0W3UgLSAxXTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbdV0gPSBpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1ID0gcmVzdWx0Lmxlbmd0aDtcbiAgdiA9IHJlc3VsdFt1IC0gMV07XG4gIHdoaWxlICh1LS0gPiAwKSB7XG4gICAgcmVzdWx0W3VdID0gdjtcbiAgICB2ID0gcFt2XTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbG9jYXRlTm9uSHlkcmF0ZWRBc3luY1Jvb3QoaW5zdGFuY2UpIHtcbiAgY29uc3Qgc3ViQ29tcG9uZW50ID0gaW5zdGFuY2Uuc3ViVHJlZS5jb21wb25lbnQ7XG4gIGlmIChzdWJDb21wb25lbnQpIHtcbiAgICBpZiAoc3ViQ29tcG9uZW50LmFzeW5jRGVwICYmICFzdWJDb21wb25lbnQuYXN5bmNSZXNvbHZlZCkge1xuICAgICAgcmV0dXJuIHN1YkNvbXBvbmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvY2F0ZU5vbkh5ZHJhdGVkQXN5bmNSb290KHN1YkNvbXBvbmVudCk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGlzVGVsZXBvcnQgPSAodHlwZSkgPT4gdHlwZS5fX2lzVGVsZXBvcnQ7XG5jb25zdCBpc1RlbGVwb3J0RGlzYWJsZWQgPSAocHJvcHMpID0+IHByb3BzICYmIChwcm9wcy5kaXNhYmxlZCB8fCBwcm9wcy5kaXNhYmxlZCA9PT0gXCJcIik7XG5jb25zdCBpc1RhcmdldFNWRyA9ICh0YXJnZXQpID0+IHR5cGVvZiBTVkdFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ7XG5jb25zdCBpc1RhcmdldE1hdGhNTCA9ICh0YXJnZXQpID0+IHR5cGVvZiBNYXRoTUxFbGVtZW50ID09PSBcImZ1bmN0aW9uXCIgJiYgdGFyZ2V0IGluc3RhbmNlb2YgTWF0aE1MRWxlbWVudDtcbmNvbnN0IHJlc29sdmVUYXJnZXQgPSAocHJvcHMsIHNlbGVjdCkgPT4ge1xuICBjb25zdCB0YXJnZXRTZWxlY3RvciA9IHByb3BzICYmIHByb3BzLnRvO1xuICBpZiAoaXNTdHJpbmcodGFyZ2V0U2VsZWN0b3IpKSB7XG4gICAgaWYgKCFzZWxlY3QpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKFxuICAgICAgICBgQ3VycmVudCByZW5kZXJlciBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyB0YXJnZXQgZm9yIFRlbGVwb3J0cy4gKG1pc3NpbmcgcXVlcnlTZWxlY3RvciByZW5kZXJlciBvcHRpb24pYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBzZWxlY3QodGFyZ2V0U2VsZWN0b3IpO1xuICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2NhdGUgVGVsZXBvcnQgdGFyZ2V0IHdpdGggc2VsZWN0b3IgXCIke3RhcmdldFNlbGVjdG9yfVwiLiBOb3RlIHRoZSB0YXJnZXQgZWxlbWVudCBtdXN0IGV4aXN0IGJlZm9yZSB0aGUgY29tcG9uZW50IGlzIG1vdW50ZWQgLSBpLmUuIHRoZSB0YXJnZXQgY2Fubm90IGJlIHJlbmRlcmVkIGJ5IHRoZSBjb21wb25lbnQgaXRzZWxmLCBhbmQgaWRlYWxseSBzaG91bGQgYmUgb3V0c2lkZSBvZiB0aGUgZW50aXJlIFZ1ZSBjb21wb25lbnQgdHJlZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhdGFyZ2V0U2VsZWN0b3IgJiYgIWlzVGVsZXBvcnREaXNhYmxlZChwcm9wcykpIHtcbiAgICAgIHdhcm4kMShgSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQ6ICR7dGFyZ2V0U2VsZWN0b3J9YCk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRTZWxlY3RvcjtcbiAgfVxufTtcbmNvbnN0IFRlbGVwb3J0SW1wbCA9IHtcbiAgbmFtZTogXCJUZWxlcG9ydFwiLFxuICBfX2lzVGVsZXBvcnQ6IHRydWUsXG4gIHByb2Nlc3MobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgaW50ZXJuYWxzKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWM6IG1vdW50Q2hpbGRyZW4sXG4gICAgICBwYzogcGF0Y2hDaGlsZHJlbixcbiAgICAgIHBiYzogcGF0Y2hCbG9ja0NoaWxkcmVuLFxuICAgICAgbzogeyBpbnNlcnQsIHF1ZXJ5U2VsZWN0b3IsIGNyZWF0ZVRleHQsIGNyZWF0ZUNvbW1lbnQgfVxuICAgIH0gPSBpbnRlcm5hbHM7XG4gICAgY29uc3QgZGlzYWJsZWQgPSBpc1RlbGVwb3J0RGlzYWJsZWQobjIucHJvcHMpO1xuICAgIGxldCB7IHNoYXBlRmxhZywgY2hpbGRyZW4sIGR5bmFtaWNDaGlsZHJlbiB9ID0gbjI7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZykge1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICBkeW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBuMi5lbCA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVDb21tZW50KFwidGVsZXBvcnQgc3RhcnRcIikgOiBjcmVhdGVUZXh0KFwiXCIpO1xuICAgICAgY29uc3QgbWFpbkFuY2hvciA9IG4yLmFuY2hvciA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVDb21tZW50KFwidGVsZXBvcnQgZW5kXCIpIDogY3JlYXRlVGV4dChcIlwiKTtcbiAgICAgIGluc2VydChwbGFjZWhvbGRlciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgaW5zZXJ0KG1haW5BbmNob3IsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IG4yLnRhcmdldCA9IHJlc29sdmVUYXJnZXQobjIucHJvcHMsIHF1ZXJ5U2VsZWN0b3IpO1xuICAgICAgY29uc3QgdGFyZ2V0QW5jaG9yID0gbjIudGFyZ2V0QW5jaG9yID0gY3JlYXRlVGV4dChcIlwiKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgaW5zZXJ0KHRhcmdldEFuY2hvciwgdGFyZ2V0KTtcbiAgICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBpc1RhcmdldFNWRyh0YXJnZXQpKSB7XG4gICAgICAgICAgbmFtZXNwYWNlID0gXCJzdmdcIjtcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIgfHwgaXNUYXJnZXRNYXRoTUwodGFyZ2V0KSkge1xuICAgICAgICAgIG5hbWVzcGFjZSA9IFwibWF0aG1sXCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgd2FybiQxKFwiSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQgb24gbW91bnQ6XCIsIHRhcmdldCwgYCgke3R5cGVvZiB0YXJnZXR9KWApO1xuICAgICAgfVxuICAgICAgY29uc3QgbW91bnQgPSAoY29udGFpbmVyMiwgYW5jaG9yMikgPT4ge1xuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgICAgYW5jaG9yMixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBtb3VudChjb250YWluZXIsIG1haW5BbmNob3IpO1xuICAgICAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAgICAgbW91bnQodGFyZ2V0LCB0YXJnZXRBbmNob3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgY29uc3QgbWFpbkFuY2hvciA9IG4yLmFuY2hvciA9IG4xLmFuY2hvcjtcbiAgICAgIGNvbnN0IHRhcmdldCA9IG4yLnRhcmdldCA9IG4xLnRhcmdldDtcbiAgICAgIGNvbnN0IHRhcmdldEFuY2hvciA9IG4yLnRhcmdldEFuY2hvciA9IG4xLnRhcmdldEFuY2hvcjtcbiAgICAgIGNvbnN0IHdhc0Rpc2FibGVkID0gaXNUZWxlcG9ydERpc2FibGVkKG4xLnByb3BzKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb250YWluZXIgPSB3YXNEaXNhYmxlZCA/IGNvbnRhaW5lciA6IHRhcmdldDtcbiAgICAgIGNvbnN0IGN1cnJlbnRBbmNob3IgPSB3YXNEaXNhYmxlZCA/IG1haW5BbmNob3IgOiB0YXJnZXRBbmNob3I7XG4gICAgICBpZiAobmFtZXNwYWNlID09PSBcInN2Z1wiIHx8IGlzVGFyZ2V0U1ZHKHRhcmdldCkpIHtcbiAgICAgICAgbmFtZXNwYWNlID0gXCJzdmdcIjtcbiAgICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlID09PSBcIm1hdGhtbFwiIHx8IGlzVGFyZ2V0TWF0aE1MKHRhcmdldCkpIHtcbiAgICAgICAgbmFtZXNwYWNlID0gXCJtYXRobWxcIjtcbiAgICAgIH1cbiAgICAgIGlmIChkeW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgICAgcGF0Y2hCbG9ja0NoaWxkcmVuKFxuICAgICAgICAgIG4xLmR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgY3VycmVudENvbnRhaW5lcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkc1xuICAgICAgICApO1xuICAgICAgICB0cmF2ZXJzZVN0YXRpY0NoaWxkcmVuKG4xLCBuMiwgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgICAgcGF0Y2hDaGlsZHJlbihcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjdXJyZW50Q29udGFpbmVyLFxuICAgICAgICAgIGN1cnJlbnRBbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBpZiAoIXdhc0Rpc2FibGVkKSB7XG4gICAgICAgICAgbW92ZVRlbGVwb3J0KFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBtYWluQW5jaG9yLFxuICAgICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgICAgMVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG4yLnByb3BzICYmIG4xLnByb3BzICYmIG4yLnByb3BzLnRvICE9PSBuMS5wcm9wcy50bykge1xuICAgICAgICAgICAgbjIucHJvcHMudG8gPSBuMS5wcm9wcy50bztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgobjIucHJvcHMgJiYgbjIucHJvcHMudG8pICE9PSAobjEucHJvcHMgJiYgbjEucHJvcHMudG8pKSB7XG4gICAgICAgICAgY29uc3QgbmV4dFRhcmdldCA9IG4yLnRhcmdldCA9IHJlc29sdmVUYXJnZXQoXG4gICAgICAgICAgICBuMi5wcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5U2VsZWN0b3JcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChuZXh0VGFyZ2V0KSB7XG4gICAgICAgICAgICBtb3ZlVGVsZXBvcnQoXG4gICAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgICBuZXh0VGFyZ2V0LFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBpbnRlcm5hbHMsXG4gICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIFwiSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQgb24gdXBkYXRlOlwiLFxuICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgIGAoJHt0eXBlb2YgdGFyZ2V0fSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh3YXNEaXNhYmxlZCkge1xuICAgICAgICAgIG1vdmVUZWxlcG9ydChcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgdGFyZ2V0QW5jaG9yLFxuICAgICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgICAgMVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlQ3NzVmFycyhuMik7XG4gIH0sXG4gIHJlbW92ZSh2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgb3B0aW1pemVkLCB7IHVtOiB1bm1vdW50LCBvOiB7IHJlbW92ZTogaG9zdFJlbW92ZSB9IH0sIGRvUmVtb3ZlKSB7XG4gICAgY29uc3QgeyBzaGFwZUZsYWcsIGNoaWxkcmVuLCBhbmNob3IsIHRhcmdldEFuY2hvciwgdGFyZ2V0LCBwcm9wcyB9ID0gdm5vZGU7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgaG9zdFJlbW92ZSh0YXJnZXRBbmNob3IpO1xuICAgIH1cbiAgICBkb1JlbW92ZSAmJiBob3N0UmVtb3ZlKGFuY2hvcik7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBjb25zdCBzaG91bGRSZW1vdmUgPSBkb1JlbW92ZSB8fCAhaXNUZWxlcG9ydERpc2FibGVkKHByb3BzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgdW5tb3VudChcbiAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgc2hvdWxkUmVtb3ZlLFxuICAgICAgICAgICEhY2hpbGQuZHluYW1pY0NoaWxkcmVuXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBtb3ZlOiBtb3ZlVGVsZXBvcnQsXG4gIGh5ZHJhdGU6IGh5ZHJhdGVUZWxlcG9ydFxufTtcbmZ1bmN0aW9uIG1vdmVUZWxlcG9ydCh2bm9kZSwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IsIHsgbzogeyBpbnNlcnQgfSwgbTogbW92ZSB9LCBtb3ZlVHlwZSA9IDIpIHtcbiAgaWYgKG1vdmVUeXBlID09PSAwKSB7XG4gICAgaW5zZXJ0KHZub2RlLnRhcmdldEFuY2hvciwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IpO1xuICB9XG4gIGNvbnN0IHsgZWwsIGFuY2hvciwgc2hhcGVGbGFnLCBjaGlsZHJlbiwgcHJvcHMgfSA9IHZub2RlO1xuICBjb25zdCBpc1Jlb3JkZXIgPSBtb3ZlVHlwZSA9PT0gMjtcbiAgaWYgKGlzUmVvcmRlcikge1xuICAgIGluc2VydChlbCwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IpO1xuICB9XG4gIGlmICghaXNSZW9yZGVyIHx8IGlzVGVsZXBvcnREaXNhYmxlZChwcm9wcykpIHtcbiAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbW92ZShcbiAgICAgICAgICBjaGlsZHJlbltpXSxcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgcGFyZW50QW5jaG9yLFxuICAgICAgICAgIDJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGlzUmVvcmRlcikge1xuICAgIGluc2VydChhbmNob3IsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yKTtcbiAgfVxufVxuZnVuY3Rpb24gaHlkcmF0ZVRlbGVwb3J0KG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwge1xuICBvOiB7IG5leHRTaWJsaW5nLCBwYXJlbnROb2RlLCBxdWVyeVNlbGVjdG9yIH1cbn0sIGh5ZHJhdGVDaGlsZHJlbikge1xuICBjb25zdCB0YXJnZXQgPSB2bm9kZS50YXJnZXQgPSByZXNvbHZlVGFyZ2V0KFxuICAgIHZub2RlLnByb3BzLFxuICAgIHF1ZXJ5U2VsZWN0b3JcbiAgKTtcbiAgaWYgKHRhcmdldCkge1xuICAgIGNvbnN0IHRhcmdldE5vZGUgPSB0YXJnZXQuX2xwYSB8fCB0YXJnZXQuZmlyc3RDaGlsZDtcbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgIGlmIChpc1RlbGVwb3J0RGlzYWJsZWQodm5vZGUucHJvcHMpKSB7XG4gICAgICAgIHZub2RlLmFuY2hvciA9IGh5ZHJhdGVDaGlsZHJlbihcbiAgICAgICAgICBuZXh0U2libGluZyhub2RlKSxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICBwYXJlbnROb2RlKG5vZGUpLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHZub2RlLnRhcmdldEFuY2hvciA9IHRhcmdldE5vZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2bm9kZS5hbmNob3IgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgbGV0IHRhcmdldEFuY2hvciA9IHRhcmdldE5vZGU7XG4gICAgICAgIHdoaWxlICh0YXJnZXRBbmNob3IpIHtcbiAgICAgICAgICB0YXJnZXRBbmNob3IgPSBuZXh0U2libGluZyh0YXJnZXRBbmNob3IpO1xuICAgICAgICAgIGlmICh0YXJnZXRBbmNob3IgJiYgdGFyZ2V0QW5jaG9yLm5vZGVUeXBlID09PSA4ICYmIHRhcmdldEFuY2hvci5kYXRhID09PSBcInRlbGVwb3J0IGFuY2hvclwiKSB7XG4gICAgICAgICAgICB2bm9kZS50YXJnZXRBbmNob3IgPSB0YXJnZXRBbmNob3I7XG4gICAgICAgICAgICB0YXJnZXQuX2xwYSA9IHZub2RlLnRhcmdldEFuY2hvciAmJiBuZXh0U2libGluZyh2bm9kZS50YXJnZXRBbmNob3IpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGh5ZHJhdGVDaGlsZHJlbihcbiAgICAgICAgICB0YXJnZXROb2RlLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVDc3NWYXJzKHZub2RlKTtcbiAgfVxuICByZXR1cm4gdm5vZGUuYW5jaG9yICYmIG5leHRTaWJsaW5nKHZub2RlLmFuY2hvcik7XG59XG5jb25zdCBUZWxlcG9ydCA9IFRlbGVwb3J0SW1wbDtcbmZ1bmN0aW9uIHVwZGF0ZUNzc1ZhcnModm5vZGUpIHtcbiAgY29uc3QgY3R4ID0gdm5vZGUuY3R4O1xuICBpZiAoY3R4ICYmIGN0eC51dCkge1xuICAgIGxldCBub2RlID0gdm5vZGUuY2hpbGRyZW5bMF0uZWw7XG4gICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gdm5vZGUudGFyZ2V0QW5jaG9yKSB7XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSlcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXYtb3duZXJcIiwgY3R4LnVpZCk7XG4gICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICB9XG4gICAgY3R4LnV0KCk7XG4gIH1cbn1cblxuY29uc3QgRnJhZ21lbnQgPSBTeW1ib2wuZm9yKFwidi1mZ3RcIik7XG5jb25zdCBUZXh0ID0gU3ltYm9sLmZvcihcInYtdHh0XCIpO1xuY29uc3QgQ29tbWVudCA9IFN5bWJvbC5mb3IoXCJ2LWNtdFwiKTtcbmNvbnN0IFN0YXRpYyA9IFN5bWJvbC5mb3IoXCJ2LXN0Y1wiKTtcbmNvbnN0IGJsb2NrU3RhY2sgPSBbXTtcbmxldCBjdXJyZW50QmxvY2sgPSBudWxsO1xuZnVuY3Rpb24gb3BlbkJsb2NrKGRpc2FibGVUcmFja2luZyA9IGZhbHNlKSB7XG4gIGJsb2NrU3RhY2sucHVzaChjdXJyZW50QmxvY2sgPSBkaXNhYmxlVHJhY2tpbmcgPyBudWxsIDogW10pO1xufVxuZnVuY3Rpb24gY2xvc2VCbG9jaygpIHtcbiAgYmxvY2tTdGFjay5wb3AoKTtcbiAgY3VycmVudEJsb2NrID0gYmxvY2tTdGFja1tibG9ja1N0YWNrLmxlbmd0aCAtIDFdIHx8IG51bGw7XG59XG5sZXQgaXNCbG9ja1RyZWVFbmFibGVkID0gMTtcbmZ1bmN0aW9uIHNldEJsb2NrVHJhY2tpbmcodmFsdWUpIHtcbiAgaXNCbG9ja1RyZWVFbmFibGVkICs9IHZhbHVlO1xufVxuZnVuY3Rpb24gc2V0dXBCbG9jayh2bm9kZSkge1xuICB2bm9kZS5keW5hbWljQ2hpbGRyZW4gPSBpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwID8gY3VycmVudEJsb2NrIHx8IEVNUFRZX0FSUiA6IG51bGw7XG4gIGNsb3NlQmxvY2soKTtcbiAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgY3VycmVudEJsb2NrKSB7XG4gICAgY3VycmVudEJsb2NrLnB1c2godm5vZGUpO1xuICB9XG4gIHJldHVybiB2bm9kZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRCbG9jayh0eXBlLCBwcm9wcywgY2hpbGRyZW4sIHBhdGNoRmxhZywgZHluYW1pY1Byb3BzLCBzaGFwZUZsYWcpIHtcbiAgcmV0dXJuIHNldHVwQmxvY2soXG4gICAgY3JlYXRlQmFzZVZOb2RlKFxuICAgICAgdHlwZSxcbiAgICAgIHByb3BzLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBwYXRjaEZsYWcsXG4gICAgICBkeW5hbWljUHJvcHMsXG4gICAgICBzaGFwZUZsYWcsXG4gICAgICB0cnVlXG4gICAgKVxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlQmxvY2sodHlwZSwgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcykge1xuICByZXR1cm4gc2V0dXBCbG9jayhcbiAgICBjcmVhdGVWTm9kZShcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgcGF0Y2hGbGFnLFxuICAgICAgZHluYW1pY1Byb3BzLFxuICAgICAgdHJ1ZVxuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzVk5vZGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID8gdmFsdWUuX192X2lzVk5vZGUgPT09IHRydWUgOiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzU2FtZVZOb2RlVHlwZShuMSwgbjIpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbjIuc2hhcGVGbGFnICYgNiAmJiBobXJEaXJ0eUNvbXBvbmVudHMuaGFzKG4yLnR5cGUpKSB7XG4gICAgbjEuc2hhcGVGbGFnICY9IH4yNTY7XG4gICAgbjIuc2hhcGVGbGFnICY9IH41MTI7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBuMS50eXBlID09PSBuMi50eXBlICYmIG4xLmtleSA9PT0gbjIua2V5O1xufVxubGV0IHZub2RlQXJnc1RyYW5zZm9ybWVyO1xuZnVuY3Rpb24gdHJhbnNmb3JtVk5vZGVBcmdzKHRyYW5zZm9ybWVyKSB7XG4gIHZub2RlQXJnc1RyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7XG59XG5jb25zdCBjcmVhdGVWTm9kZVdpdGhBcmdzVHJhbnNmb3JtID0gKC4uLmFyZ3MpID0+IHtcbiAgcmV0dXJuIF9jcmVhdGVWTm9kZShcbiAgICAuLi52bm9kZUFyZ3NUcmFuc2Zvcm1lciA/IHZub2RlQXJnc1RyYW5zZm9ybWVyKGFyZ3MsIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSkgOiBhcmdzXG4gICk7XG59O1xuY29uc3QgSW50ZXJuYWxPYmplY3RLZXkgPSBgX192SW50ZXJuYWxgO1xuY29uc3Qgbm9ybWFsaXplS2V5ID0gKHsga2V5IH0pID0+IGtleSAhPSBudWxsID8ga2V5IDogbnVsbDtcbmNvbnN0IG5vcm1hbGl6ZVJlZiA9ICh7XG4gIHJlZixcbiAgcmVmX2tleSxcbiAgcmVmX2ZvclxufSkgPT4ge1xuICBpZiAodHlwZW9mIHJlZiA9PT0gXCJudW1iZXJcIikge1xuICAgIHJlZiA9IFwiXCIgKyByZWY7XG4gIH1cbiAgcmV0dXJuIHJlZiAhPSBudWxsID8gaXNTdHJpbmcocmVmKSB8fCBpc1JlZihyZWYpIHx8IGlzRnVuY3Rpb24ocmVmKSA/IHsgaTogY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLCByOiByZWYsIGs6IHJlZl9rZXksIGY6ICEhcmVmX2ZvciB9IDogcmVmIDogbnVsbDtcbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlVk5vZGUodHlwZSwgcHJvcHMgPSBudWxsLCBjaGlsZHJlbiA9IG51bGwsIHBhdGNoRmxhZyA9IDAsIGR5bmFtaWNQcm9wcyA9IG51bGwsIHNoYXBlRmxhZyA9IHR5cGUgPT09IEZyYWdtZW50ID8gMCA6IDEsIGlzQmxvY2tOb2RlID0gZmFsc2UsIG5lZWRGdWxsQ2hpbGRyZW5Ob3JtYWxpemF0aW9uID0gZmFsc2UpIHtcbiAgY29uc3Qgdm5vZGUgPSB7XG4gICAgX192X2lzVk5vZGU6IHRydWUsXG4gICAgX192X3NraXA6IHRydWUsXG4gICAgdHlwZSxcbiAgICBwcm9wcyxcbiAgICBrZXk6IHByb3BzICYmIG5vcm1hbGl6ZUtleShwcm9wcyksXG4gICAgcmVmOiBwcm9wcyAmJiBub3JtYWxpemVSZWYocHJvcHMpLFxuICAgIHNjb3BlSWQ6IGN1cnJlbnRTY29wZUlkLFxuICAgIHNsb3RTY29wZUlkczogbnVsbCxcbiAgICBjaGlsZHJlbixcbiAgICBjb21wb25lbnQ6IG51bGwsXG4gICAgc3VzcGVuc2U6IG51bGwsXG4gICAgc3NDb250ZW50OiBudWxsLFxuICAgIHNzRmFsbGJhY2s6IG51bGwsXG4gICAgZGlyczogbnVsbCxcbiAgICB0cmFuc2l0aW9uOiBudWxsLFxuICAgIGVsOiBudWxsLFxuICAgIGFuY2hvcjogbnVsbCxcbiAgICB0YXJnZXQ6IG51bGwsXG4gICAgdGFyZ2V0QW5jaG9yOiBudWxsLFxuICAgIHN0YXRpY0NvdW50OiAwLFxuICAgIHNoYXBlRmxhZyxcbiAgICBwYXRjaEZsYWcsXG4gICAgZHluYW1pY1Byb3BzLFxuICAgIGR5bmFtaWNDaGlsZHJlbjogbnVsbCxcbiAgICBhcHBDb250ZXh0OiBudWxsLFxuICAgIGN0eDogY3VycmVudFJlbmRlcmluZ0luc3RhbmNlXG4gIH07XG4gIGlmIChuZWVkRnVsbENoaWxkcmVuTm9ybWFsaXphdGlvbikge1xuICAgIG5vcm1hbGl6ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbik7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgdHlwZS5ub3JtYWxpemUodm5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjaGlsZHJlbikge1xuICAgIHZub2RlLnNoYXBlRmxhZyB8PSBpc1N0cmluZyhjaGlsZHJlbikgPyA4IDogMTY7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdm5vZGUua2V5ICE9PSB2bm9kZS5rZXkpIHtcbiAgICB3YXJuJDEoYFZOb2RlIGNyZWF0ZWQgd2l0aCBpbnZhbGlkIGtleSAoTmFOKS4gVk5vZGUgdHlwZTpgLCB2bm9kZS50eXBlKTtcbiAgfVxuICBpZiAoaXNCbG9ja1RyZWVFbmFibGVkID4gMCAmJiAvLyBhdm9pZCBhIGJsb2NrIG5vZGUgZnJvbSB0cmFja2luZyBpdHNlbGZcbiAgIWlzQmxvY2tOb2RlICYmIC8vIGhhcyBjdXJyZW50IHBhcmVudCBibG9ja1xuICBjdXJyZW50QmxvY2sgJiYgLy8gcHJlc2VuY2Ugb2YgYSBwYXRjaCBmbGFnIGluZGljYXRlcyB0aGlzIG5vZGUgbmVlZHMgcGF0Y2hpbmcgb24gdXBkYXRlcy5cbiAgLy8gY29tcG9uZW50IG5vZGVzIGFsc28gc2hvdWxkIGFsd2F5cyBiZSBwYXRjaGVkLCBiZWNhdXNlIGV2ZW4gaWYgdGhlXG4gIC8vIGNvbXBvbmVudCBkb2Vzbid0IG5lZWQgdG8gdXBkYXRlLCBpdCBuZWVkcyB0byBwZXJzaXN0IHRoZSBpbnN0YW5jZSBvbiB0b1xuICAvLyB0aGUgbmV4dCB2bm9kZSBzbyB0aGF0IGl0IGNhbiBiZSBwcm9wZXJseSB1bm1vdW50ZWQgbGF0ZXIuXG4gICh2bm9kZS5wYXRjaEZsYWcgPiAwIHx8IHNoYXBlRmxhZyAmIDYpICYmIC8vIHRoZSBFVkVOVFMgZmxhZyBpcyBvbmx5IGZvciBoeWRyYXRpb24gYW5kIGlmIGl0IGlzIHRoZSBvbmx5IGZsYWcsIHRoZVxuICAvLyB2bm9kZSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgZHluYW1pYyBkdWUgdG8gaGFuZGxlciBjYWNoaW5nLlxuICB2bm9kZS5wYXRjaEZsYWcgIT09IDMyKSB7XG4gICAgY3VycmVudEJsb2NrLnB1c2godm5vZGUpO1xuICB9XG4gIHJldHVybiB2bm9kZTtcbn1cbmNvbnN0IGNyZWF0ZVZOb2RlID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZVZOb2RlV2l0aEFyZ3NUcmFuc2Zvcm0gOiBfY3JlYXRlVk5vZGU7XG5mdW5jdGlvbiBfY3JlYXRlVk5vZGUodHlwZSwgcHJvcHMgPSBudWxsLCBjaGlsZHJlbiA9IG51bGwsIHBhdGNoRmxhZyA9IDAsIGR5bmFtaWNQcm9wcyA9IG51bGwsIGlzQmxvY2tOb2RlID0gZmFsc2UpIHtcbiAgaWYgKCF0eXBlIHx8IHR5cGUgPT09IE5VTExfRFlOQU1JQ19DT01QT05FTlQpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhdHlwZSkge1xuICAgICAgd2FybiQxKGBJbnZhbGlkIHZub2RlIHR5cGUgd2hlbiBjcmVhdGluZyB2bm9kZTogJHt0eXBlfS5gKTtcbiAgICB9XG4gICAgdHlwZSA9IENvbW1lbnQ7XG4gIH1cbiAgaWYgKGlzVk5vZGUodHlwZSkpIHtcbiAgICBjb25zdCBjbG9uZWQgPSBjbG9uZVZOb2RlKFxuICAgICAgdHlwZSxcbiAgICAgIHByb3BzLFxuICAgICAgdHJ1ZVxuICAgICAgLyogbWVyZ2VSZWY6IHRydWUgKi9cbiAgICApO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgbm9ybWFsaXplQ2hpbGRyZW4oY2xvbmVkLCBjaGlsZHJlbik7XG4gICAgfVxuICAgIGlmIChpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwICYmICFpc0Jsb2NrTm9kZSAmJiBjdXJyZW50QmxvY2spIHtcbiAgICAgIGlmIChjbG9uZWQuc2hhcGVGbGFnICYgNikge1xuICAgICAgICBjdXJyZW50QmxvY2tbY3VycmVudEJsb2NrLmluZGV4T2YodHlwZSldID0gY2xvbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudEJsb2NrLnB1c2goY2xvbmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY2xvbmVkLnBhdGNoRmxhZyB8PSAtMjtcbiAgICByZXR1cm4gY2xvbmVkO1xuICB9XG4gIGlmIChpc0NsYXNzQ29tcG9uZW50KHR5cGUpKSB7XG4gICAgdHlwZSA9IHR5cGUuX192Y2NPcHRzO1xuICB9XG4gIGlmIChwcm9wcykge1xuICAgIHByb3BzID0gZ3VhcmRSZWFjdGl2ZVByb3BzKHByb3BzKTtcbiAgICBsZXQgeyBjbGFzczoga2xhc3MsIHN0eWxlIH0gPSBwcm9wcztcbiAgICBpZiAoa2xhc3MgJiYgIWlzU3RyaW5nKGtsYXNzKSkge1xuICAgICAgcHJvcHMuY2xhc3MgPSBub3JtYWxpemVDbGFzcyhrbGFzcyk7XG4gICAgfVxuICAgIGlmIChpc09iamVjdChzdHlsZSkpIHtcbiAgICAgIGlmIChpc1Byb3h5KHN0eWxlKSAmJiAhaXNBcnJheShzdHlsZSkpIHtcbiAgICAgICAgc3R5bGUgPSBleHRlbmQoe30sIHN0eWxlKTtcbiAgICAgIH1cbiAgICAgIHByb3BzLnN0eWxlID0gbm9ybWFsaXplU3R5bGUoc3R5bGUpO1xuICAgIH1cbiAgfVxuICBjb25zdCBzaGFwZUZsYWcgPSBpc1N0cmluZyh0eXBlKSA/IDEgOiBpc1N1c3BlbnNlKHR5cGUpID8gMTI4IDogaXNUZWxlcG9ydCh0eXBlKSA/IDY0IDogaXNPYmplY3QodHlwZSkgPyA0IDogaXNGdW5jdGlvbih0eXBlKSA/IDIgOiAwO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzaGFwZUZsYWcgJiA0ICYmIGlzUHJveHkodHlwZSkpIHtcbiAgICB0eXBlID0gdG9SYXcodHlwZSk7XG4gICAgd2FybiQxKFxuICAgICAgYFZ1ZSByZWNlaXZlZCBhIENvbXBvbmVudCB0aGF0IHdhcyBtYWRlIGEgcmVhY3RpdmUgb2JqZWN0LiBUaGlzIGNhbiBsZWFkIHRvIHVubmVjZXNzYXJ5IHBlcmZvcm1hbmNlIG92ZXJoZWFkIGFuZCBzaG91bGQgYmUgYXZvaWRlZCBieSBtYXJraW5nIHRoZSBjb21wb25lbnQgd2l0aCBcXGBtYXJrUmF3XFxgIG9yIHVzaW5nIFxcYHNoYWxsb3dSZWZcXGAgaW5zdGVhZCBvZiBcXGByZWZcXGAuYCxcbiAgICAgIGBcbkNvbXBvbmVudCB0aGF0IHdhcyBtYWRlIHJlYWN0aXZlOiBgLFxuICAgICAgdHlwZVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJhc2VWTm9kZShcbiAgICB0eXBlLFxuICAgIHByb3BzLFxuICAgIGNoaWxkcmVuLFxuICAgIHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHMsXG4gICAgc2hhcGVGbGFnLFxuICAgIGlzQmxvY2tOb2RlLFxuICAgIHRydWVcbiAgKTtcbn1cbmZ1bmN0aW9uIGd1YXJkUmVhY3RpdmVQcm9wcyhwcm9wcykge1xuICBpZiAoIXByb3BzKVxuICAgIHJldHVybiBudWxsO1xuICByZXR1cm4gaXNQcm94eShwcm9wcykgfHwgSW50ZXJuYWxPYmplY3RLZXkgaW4gcHJvcHMgPyBleHRlbmQoe30sIHByb3BzKSA6IHByb3BzO1xufVxuZnVuY3Rpb24gY2xvbmVWTm9kZSh2bm9kZSwgZXh0cmFQcm9wcywgbWVyZ2VSZWYgPSBmYWxzZSkge1xuICBjb25zdCB7IHByb3BzLCByZWYsIHBhdGNoRmxhZywgY2hpbGRyZW4gfSA9IHZub2RlO1xuICBjb25zdCBtZXJnZWRQcm9wcyA9IGV4dHJhUHJvcHMgPyBtZXJnZVByb3BzKHByb3BzIHx8IHt9LCBleHRyYVByb3BzKSA6IHByb3BzO1xuICBjb25zdCBjbG9uZWQgPSB7XG4gICAgX192X2lzVk5vZGU6IHRydWUsXG4gICAgX192X3NraXA6IHRydWUsXG4gICAgdHlwZTogdm5vZGUudHlwZSxcbiAgICBwcm9wczogbWVyZ2VkUHJvcHMsXG4gICAga2V5OiBtZXJnZWRQcm9wcyAmJiBub3JtYWxpemVLZXkobWVyZ2VkUHJvcHMpLFxuICAgIHJlZjogZXh0cmFQcm9wcyAmJiBleHRyYVByb3BzLnJlZiA/IChcbiAgICAgIC8vICMyMDc4IGluIHRoZSBjYXNlIG9mIDxjb21wb25lbnQgOmlzPVwidm5vZGVcIiByZWY9XCJleHRyYVwiLz5cbiAgICAgIC8vIGlmIHRoZSB2bm9kZSBpdHNlbGYgYWxyZWFkeSBoYXMgYSByZWYsIGNsb25lVk5vZGUgd2lsbCBuZWVkIHRvIG1lcmdlXG4gICAgICAvLyB0aGUgcmVmcyBzbyB0aGUgc2luZ2xlIHZub2RlIGNhbiBiZSBzZXQgb24gbXVsdGlwbGUgcmVmc1xuICAgICAgbWVyZ2VSZWYgJiYgcmVmID8gaXNBcnJheShyZWYpID8gcmVmLmNvbmNhdChub3JtYWxpemVSZWYoZXh0cmFQcm9wcykpIDogW3JlZiwgbm9ybWFsaXplUmVmKGV4dHJhUHJvcHMpXSA6IG5vcm1hbGl6ZVJlZihleHRyYVByb3BzKVxuICAgICkgOiByZWYsXG4gICAgc2NvcGVJZDogdm5vZGUuc2NvcGVJZCxcbiAgICBzbG90U2NvcGVJZHM6IHZub2RlLnNsb3RTY29wZUlkcyxcbiAgICBjaGlsZHJlbjogISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBwYXRjaEZsYWcgPT09IC0xICYmIGlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4ubWFwKGRlZXBDbG9uZVZOb2RlKSA6IGNoaWxkcmVuLFxuICAgIHRhcmdldDogdm5vZGUudGFyZ2V0LFxuICAgIHRhcmdldEFuY2hvcjogdm5vZGUudGFyZ2V0QW5jaG9yLFxuICAgIHN0YXRpY0NvdW50OiB2bm9kZS5zdGF0aWNDb3VudCxcbiAgICBzaGFwZUZsYWc6IHZub2RlLnNoYXBlRmxhZyxcbiAgICAvLyBpZiB0aGUgdm5vZGUgaXMgY2xvbmVkIHdpdGggZXh0cmEgcHJvcHMsIHdlIGNhbiBubyBsb25nZXIgYXNzdW1lIGl0c1xuICAgIC8vIGV4aXN0aW5nIHBhdGNoIGZsYWcgdG8gYmUgcmVsaWFibGUgYW5kIG5lZWQgdG8gYWRkIHRoZSBGVUxMX1BST1BTIGZsYWcuXG4gICAgLy8gbm90ZTogcHJlc2VydmUgZmxhZyBmb3IgZnJhZ21lbnRzIHNpbmNlIHRoZXkgdXNlIHRoZSBmbGFnIGZvciBjaGlsZHJlblxuICAgIC8vIGZhc3QgcGF0aHMgb25seS5cbiAgICBwYXRjaEZsYWc6IGV4dHJhUHJvcHMgJiYgdm5vZGUudHlwZSAhPT0gRnJhZ21lbnQgPyBwYXRjaEZsYWcgPT09IC0xID8gMTYgOiBwYXRjaEZsYWcgfCAxNiA6IHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHM6IHZub2RlLmR5bmFtaWNQcm9wcyxcbiAgICBkeW5hbWljQ2hpbGRyZW46IHZub2RlLmR5bmFtaWNDaGlsZHJlbixcbiAgICBhcHBDb250ZXh0OiB2bm9kZS5hcHBDb250ZXh0LFxuICAgIGRpcnM6IHZub2RlLmRpcnMsXG4gICAgdHJhbnNpdGlvbjogdm5vZGUudHJhbnNpdGlvbixcbiAgICAvLyBUaGVzZSBzaG91bGQgdGVjaG5pY2FsbHkgb25seSBiZSBub24tbnVsbCBvbiBtb3VudGVkIFZOb2Rlcy4gSG93ZXZlcixcbiAgICAvLyB0aGV5ICpzaG91bGQqIGJlIGNvcGllZCBmb3Iga2VwdC1hbGl2ZSB2bm9kZXMuIFNvIHdlIGp1c3QgYWx3YXlzIGNvcHlcbiAgICAvLyB0aGVtIHNpbmNlIHRoZW0gYmVpbmcgbm9uLW51bGwgZHVyaW5nIGEgbW91bnQgZG9lc24ndCBhZmZlY3QgdGhlIGxvZ2ljIGFzXG4gICAgLy8gdGhleSB3aWxsIHNpbXBseSBiZSBvdmVyd3JpdHRlbi5cbiAgICBjb21wb25lbnQ6IHZub2RlLmNvbXBvbmVudCxcbiAgICBzdXNwZW5zZTogdm5vZGUuc3VzcGVuc2UsXG4gICAgc3NDb250ZW50OiB2bm9kZS5zc0NvbnRlbnQgJiYgY2xvbmVWTm9kZSh2bm9kZS5zc0NvbnRlbnQpLFxuICAgIHNzRmFsbGJhY2s6IHZub2RlLnNzRmFsbGJhY2sgJiYgY2xvbmVWTm9kZSh2bm9kZS5zc0ZhbGxiYWNrKSxcbiAgICBlbDogdm5vZGUuZWwsXG4gICAgYW5jaG9yOiB2bm9kZS5hbmNob3IsXG4gICAgY3R4OiB2bm9kZS5jdHgsXG4gICAgY2U6IHZub2RlLmNlXG4gIH07XG4gIHJldHVybiBjbG9uZWQ7XG59XG5mdW5jdGlvbiBkZWVwQ2xvbmVWTm9kZSh2bm9kZSkge1xuICBjb25zdCBjbG9uZWQgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgaWYgKGlzQXJyYXkodm5vZGUuY2hpbGRyZW4pKSB7XG4gICAgY2xvbmVkLmNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW4ubWFwKGRlZXBDbG9uZVZOb2RlKTtcbiAgfVxuICByZXR1cm4gY2xvbmVkO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dFZOb2RlKHRleHQgPSBcIiBcIiwgZmxhZyA9IDApIHtcbiAgcmV0dXJuIGNyZWF0ZVZOb2RlKFRleHQsIG51bGwsIHRleHQsIGZsYWcpO1xufVxuZnVuY3Rpb24gY3JlYXRlU3RhdGljVk5vZGUoY29udGVudCwgbnVtYmVyT2ZOb2Rlcykge1xuICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKFN0YXRpYywgbnVsbCwgY29udGVudCk7XG4gIHZub2RlLnN0YXRpY0NvdW50ID0gbnVtYmVyT2ZOb2RlcztcbiAgcmV0dXJuIHZub2RlO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29tbWVudFZOb2RlKHRleHQgPSBcIlwiLCBhc0Jsb2NrID0gZmFsc2UpIHtcbiAgcmV0dXJuIGFzQmxvY2sgPyAob3BlbkJsb2NrKCksIGNyZWF0ZUJsb2NrKENvbW1lbnQsIG51bGwsIHRleHQpKSA6IGNyZWF0ZVZOb2RlKENvbW1lbnQsIG51bGwsIHRleHQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplVk5vZGUoY2hpbGQpIHtcbiAgaWYgKGNoaWxkID09IG51bGwgfHwgdHlwZW9mIGNoaWxkID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShDb21tZW50KTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KGNoaWxkKSkge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShcbiAgICAgIEZyYWdtZW50LFxuICAgICAgbnVsbCxcbiAgICAgIC8vICMzNjY2LCBhdm9pZCByZWZlcmVuY2UgcG9sbHV0aW9uIHdoZW4gcmV1c2luZyB2bm9kZVxuICAgICAgY2hpbGQuc2xpY2UoKVxuICAgICk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNoaWxkID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGNsb25lSWZNb3VudGVkKGNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlVk5vZGUoVGV4dCwgbnVsbCwgU3RyaW5nKGNoaWxkKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNsb25lSWZNb3VudGVkKGNoaWxkKSB7XG4gIHJldHVybiBjaGlsZC5lbCA9PT0gbnVsbCAmJiBjaGlsZC5wYXRjaEZsYWcgIT09IC0xIHx8IGNoaWxkLm1lbW8gPyBjaGlsZCA6IGNsb25lVk5vZGUoY2hpbGQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIGNoaWxkcmVuKSB7XG4gIGxldCB0eXBlID0gMDtcbiAgY29uc3QgeyBzaGFwZUZsYWcgfSA9IHZub2RlO1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIHR5cGUgPSAxNjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09IFwib2JqZWN0XCIpIHtcbiAgICBpZiAoc2hhcGVGbGFnICYgKDEgfCA2NCkpIHtcbiAgICAgIGNvbnN0IHNsb3QgPSBjaGlsZHJlbi5kZWZhdWx0O1xuICAgICAgaWYgKHNsb3QpIHtcbiAgICAgICAgc2xvdC5fYyAmJiAoc2xvdC5fZCA9IGZhbHNlKTtcbiAgICAgICAgbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIHNsb3QoKSk7XG4gICAgICAgIHNsb3QuX2MgJiYgKHNsb3QuX2QgPSB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9IDMyO1xuICAgICAgY29uc3Qgc2xvdEZsYWcgPSBjaGlsZHJlbi5fO1xuICAgICAgaWYgKCFzbG90RmxhZyAmJiAhKEludGVybmFsT2JqZWN0S2V5IGluIGNoaWxkcmVuKSkge1xuICAgICAgICBjaGlsZHJlbi5fY3R4ID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xuICAgICAgfSBlbHNlIGlmIChzbG90RmxhZyA9PT0gMyAmJiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5zbG90cy5fID09PSAxKSB7XG4gICAgICAgICAgY2hpbGRyZW4uXyA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hpbGRyZW4uXyA9IDI7XG4gICAgICAgICAgdm5vZGUucGF0Y2hGbGFnIHw9IDEwMjQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihjaGlsZHJlbikpIHtcbiAgICBjaGlsZHJlbiA9IHsgZGVmYXVsdDogY2hpbGRyZW4sIF9jdHg6IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSB9O1xuICAgIHR5cGUgPSAzMjtcbiAgfSBlbHNlIHtcbiAgICBjaGlsZHJlbiA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICB0eXBlID0gMTY7XG4gICAgICBjaGlsZHJlbiA9IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9IDg7XG4gICAgfVxuICB9XG4gIHZub2RlLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIHZub2RlLnNoYXBlRmxhZyB8PSB0eXBlO1xufVxuZnVuY3Rpb24gbWVyZ2VQcm9wcyguLi5hcmdzKSB7XG4gIGNvbnN0IHJldCA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b01lcmdlID0gYXJnc1tpXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0b01lcmdlKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImNsYXNzXCIpIHtcbiAgICAgICAgaWYgKHJldC5jbGFzcyAhPT0gdG9NZXJnZS5jbGFzcykge1xuICAgICAgICAgIHJldC5jbGFzcyA9IG5vcm1hbGl6ZUNsYXNzKFtyZXQuY2xhc3MsIHRvTWVyZ2UuY2xhc3NdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIikge1xuICAgICAgICByZXQuc3R5bGUgPSBub3JtYWxpemVTdHlsZShbcmV0LnN0eWxlLCB0b01lcmdlLnN0eWxlXSk7XG4gICAgICB9IGVsc2UgaWYgKGlzT24oa2V5KSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHJldFtrZXldO1xuICAgICAgICBjb25zdCBpbmNvbWluZyA9IHRvTWVyZ2Vba2V5XTtcbiAgICAgICAgaWYgKGluY29taW5nICYmIGV4aXN0aW5nICE9PSBpbmNvbWluZyAmJiAhKGlzQXJyYXkoZXhpc3RpbmcpICYmIGV4aXN0aW5nLmluY2x1ZGVzKGluY29taW5nKSkpIHtcbiAgICAgICAgICByZXRba2V5XSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBpbmNvbWluZykgOiBpbmNvbWluZztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgIT09IFwiXCIpIHtcbiAgICAgICAgcmV0W2tleV0gPSB0b01lcmdlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBpbnZva2VWTm9kZUhvb2soaG9vaywgaW5zdGFuY2UsIHZub2RlLCBwcmV2Vk5vZGUgPSBudWxsKSB7XG4gIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGhvb2ssIGluc3RhbmNlLCA3LCBbXG4gICAgdm5vZGUsXG4gICAgcHJldlZOb2RlXG4gIF0pO1xufVxuXG5jb25zdCBlbXB0eUFwcENvbnRleHQgPSBjcmVhdGVBcHBDb250ZXh0KCk7XG5sZXQgdWlkID0gMDtcbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHZub2RlLCBwYXJlbnQsIHN1c3BlbnNlKSB7XG4gIGNvbnN0IHR5cGUgPSB2bm9kZS50eXBlO1xuICBjb25zdCBhcHBDb250ZXh0ID0gKHBhcmVudCA/IHBhcmVudC5hcHBDb250ZXh0IDogdm5vZGUuYXBwQ29udGV4dCkgfHwgZW1wdHlBcHBDb250ZXh0O1xuICBjb25zdCBpbnN0YW5jZSA9IHtcbiAgICB1aWQ6IHVpZCsrLFxuICAgIHZub2RlLFxuICAgIHR5cGUsXG4gICAgcGFyZW50LFxuICAgIGFwcENvbnRleHQsXG4gICAgcm9vdDogbnVsbCxcbiAgICAvLyB0byBiZSBpbW1lZGlhdGVseSBzZXRcbiAgICBuZXh0OiBudWxsLFxuICAgIHN1YlRyZWU6IG51bGwsXG4gICAgLy8gd2lsbCBiZSBzZXQgc3luY2hyb25vdXNseSByaWdodCBhZnRlciBjcmVhdGlvblxuICAgIGVmZmVjdDogbnVsbCxcbiAgICB1cGRhdGU6IG51bGwsXG4gICAgLy8gd2lsbCBiZSBzZXQgc3luY2hyb25vdXNseSByaWdodCBhZnRlciBjcmVhdGlvblxuICAgIHNjb3BlOiBuZXcgRWZmZWN0U2NvcGUoXG4gICAgICB0cnVlXG4gICAgICAvKiBkZXRhY2hlZCAqL1xuICAgICksXG4gICAgcmVuZGVyOiBudWxsLFxuICAgIHByb3h5OiBudWxsLFxuICAgIGV4cG9zZWQ6IG51bGwsXG4gICAgZXhwb3NlUHJveHk6IG51bGwsXG4gICAgd2l0aFByb3h5OiBudWxsLFxuICAgIHByb3ZpZGVzOiBwYXJlbnQgPyBwYXJlbnQucHJvdmlkZXMgOiBPYmplY3QuY3JlYXRlKGFwcENvbnRleHQucHJvdmlkZXMpLFxuICAgIGFjY2Vzc0NhY2hlOiBudWxsLFxuICAgIHJlbmRlckNhY2hlOiBbXSxcbiAgICAvLyBsb2NhbCByZXNvbHZlZCBhc3NldHNcbiAgICBjb21wb25lbnRzOiBudWxsLFxuICAgIGRpcmVjdGl2ZXM6IG51bGwsXG4gICAgLy8gcmVzb2x2ZWQgcHJvcHMgYW5kIGVtaXRzIG9wdGlvbnNcbiAgICBwcm9wc09wdGlvbnM6IG5vcm1hbGl6ZVByb3BzT3B0aW9ucyh0eXBlLCBhcHBDb250ZXh0KSxcbiAgICBlbWl0c09wdGlvbnM6IG5vcm1hbGl6ZUVtaXRzT3B0aW9ucyh0eXBlLCBhcHBDb250ZXh0KSxcbiAgICAvLyBlbWl0XG4gICAgZW1pdDogbnVsbCxcbiAgICAvLyB0byBiZSBzZXQgaW1tZWRpYXRlbHlcbiAgICBlbWl0dGVkOiBudWxsLFxuICAgIC8vIHByb3BzIGRlZmF1bHQgdmFsdWVcbiAgICBwcm9wc0RlZmF1bHRzOiBFTVBUWV9PQkosXG4gICAgLy8gaW5oZXJpdEF0dHJzXG4gICAgaW5oZXJpdEF0dHJzOiB0eXBlLmluaGVyaXRBdHRycyxcbiAgICAvLyBzdGF0ZVxuICAgIGN0eDogRU1QVFlfT0JKLFxuICAgIGRhdGE6IEVNUFRZX09CSixcbiAgICBwcm9wczogRU1QVFlfT0JKLFxuICAgIGF0dHJzOiBFTVBUWV9PQkosXG4gICAgc2xvdHM6IEVNUFRZX09CSixcbiAgICByZWZzOiBFTVBUWV9PQkosXG4gICAgc2V0dXBTdGF0ZTogRU1QVFlfT0JKLFxuICAgIHNldHVwQ29udGV4dDogbnVsbCxcbiAgICBhdHRyc1Byb3h5OiBudWxsLFxuICAgIHNsb3RzUHJveHk6IG51bGwsXG4gICAgLy8gc3VzcGVuc2UgcmVsYXRlZFxuICAgIHN1c3BlbnNlLFxuICAgIHN1c3BlbnNlSWQ6IHN1c3BlbnNlID8gc3VzcGVuc2UucGVuZGluZ0lkIDogMCxcbiAgICBhc3luY0RlcDogbnVsbCxcbiAgICBhc3luY1Jlc29sdmVkOiBmYWxzZSxcbiAgICAvLyBsaWZlY3ljbGUgaG9va3NcbiAgICAvLyBub3QgdXNpbmcgZW51bXMgaGVyZSBiZWNhdXNlIGl0IHJlc3VsdHMgaW4gY29tcHV0ZWQgcHJvcGVydGllc1xuICAgIGlzTW91bnRlZDogZmFsc2UsXG4gICAgaXNVbm1vdW50ZWQ6IGZhbHNlLFxuICAgIGlzRGVhY3RpdmF0ZWQ6IGZhbHNlLFxuICAgIGJjOiBudWxsLFxuICAgIGM6IG51bGwsXG4gICAgYm06IG51bGwsXG4gICAgbTogbnVsbCxcbiAgICBidTogbnVsbCxcbiAgICB1OiBudWxsLFxuICAgIHVtOiBudWxsLFxuICAgIGJ1bTogbnVsbCxcbiAgICBkYTogbnVsbCxcbiAgICBhOiBudWxsLFxuICAgIHJ0ZzogbnVsbCxcbiAgICBydGM6IG51bGwsXG4gICAgZWM6IG51bGwsXG4gICAgc3A6IG51bGxcbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpbnN0YW5jZS5jdHggPSBjcmVhdGVEZXZSZW5kZXJDb250ZXh0KGluc3RhbmNlKTtcbiAgfSBlbHNlIHtcbiAgICBpbnN0YW5jZS5jdHggPSB7IF86IGluc3RhbmNlIH07XG4gIH1cbiAgaW5zdGFuY2Uucm9vdCA9IHBhcmVudCA/IHBhcmVudC5yb290IDogaW5zdGFuY2U7XG4gIGluc3RhbmNlLmVtaXQgPSBlbWl0LmJpbmQobnVsbCwgaW5zdGFuY2UpO1xuICBpZiAodm5vZGUuY2UpIHtcbiAgICB2bm9kZS5jZShpbnN0YW5jZSk7XG4gIH1cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxubGV0IGN1cnJlbnRJbnN0YW5jZSA9IG51bGw7XG5jb25zdCBnZXRDdXJyZW50SW5zdGFuY2UgPSAoKSA9PiBjdXJyZW50SW5zdGFuY2UgfHwgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xubGV0IGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlO1xubGV0IHNldEluU1NSU2V0dXBTdGF0ZTtcbntcbiAgY29uc3QgZyA9IGdldEdsb2JhbFRoaXMoKTtcbiAgY29uc3QgcmVnaXN0ZXJHbG9iYWxTZXR0ZXIgPSAoa2V5LCBzZXR0ZXIpID0+IHtcbiAgICBsZXQgc2V0dGVycztcbiAgICBpZiAoIShzZXR0ZXJzID0gZ1trZXldKSlcbiAgICAgIHNldHRlcnMgPSBnW2tleV0gPSBbXTtcbiAgICBzZXR0ZXJzLnB1c2goc2V0dGVyKTtcbiAgICByZXR1cm4gKHYpID0+IHtcbiAgICAgIGlmIChzZXR0ZXJzLmxlbmd0aCA+IDEpXG4gICAgICAgIHNldHRlcnMuZm9yRWFjaCgoc2V0KSA9PiBzZXQodikpO1xuICAgICAgZWxzZVxuICAgICAgICBzZXR0ZXJzWzBdKHYpO1xuICAgIH07XG4gIH07XG4gIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlID0gcmVnaXN0ZXJHbG9iYWxTZXR0ZXIoXG4gICAgYF9fVlVFX0lOU1RBTkNFX1NFVFRFUlNfX2AsXG4gICAgKHYpID0+IGN1cnJlbnRJbnN0YW5jZSA9IHZcbiAgKTtcbiAgc2V0SW5TU1JTZXR1cFN0YXRlID0gcmVnaXN0ZXJHbG9iYWxTZXR0ZXIoXG4gICAgYF9fVlVFX1NTUl9TRVRURVJTX19gLFxuICAgICh2KSA9PiBpc0luU1NSQ29tcG9uZW50U2V0dXAgPSB2XG4gICk7XG59XG5jb25zdCBzZXRDdXJyZW50SW5zdGFuY2UgPSAoaW5zdGFuY2UpID0+IHtcbiAgY29uc3QgcHJldiA9IGN1cnJlbnRJbnN0YW5jZTtcbiAgaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICBpbnN0YW5jZS5zY29wZS5vbigpO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGluc3RhbmNlLnNjb3BlLm9mZigpO1xuICAgIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlKHByZXYpO1xuICB9O1xufTtcbmNvbnN0IHVuc2V0Q3VycmVudEluc3RhbmNlID0gKCkgPT4ge1xuICBjdXJyZW50SW5zdGFuY2UgJiYgY3VycmVudEluc3RhbmNlLnNjb3BlLm9mZigpO1xuICBpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZShudWxsKTtcbn07XG5jb25zdCBpc0J1aWx0SW5UYWcgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChcInNsb3QsY29tcG9uZW50XCIpO1xuZnVuY3Rpb24gdmFsaWRhdGVDb21wb25lbnROYW1lKG5hbWUsIGNvbmZpZykge1xuICBjb25zdCBhcHBJc05hdGl2ZVRhZyA9IGNvbmZpZy5pc05hdGl2ZVRhZyB8fCBOTztcbiAgaWYgKGlzQnVpbHRJblRhZyhuYW1lKSB8fCBhcHBJc05hdGl2ZVRhZyhuYW1lKSkge1xuICAgIHdhcm4kMShcbiAgICAgIFwiRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCBpZDogXCIgKyBuYW1lXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2Uudm5vZGUuc2hhcGVGbGFnICYgNDtcbn1cbmxldCBpc0luU1NSQ29tcG9uZW50U2V0dXAgPSBmYWxzZTtcbmZ1bmN0aW9uIHNldHVwQ29tcG9uZW50KGluc3RhbmNlLCBpc1NTUiA9IGZhbHNlKSB7XG4gIGlzU1NSICYmIHNldEluU1NSU2V0dXBTdGF0ZShpc1NTUik7XG4gIGNvbnN0IHsgcHJvcHMsIGNoaWxkcmVuIH0gPSBpbnN0YW5jZS52bm9kZTtcbiAgY29uc3QgaXNTdGF0ZWZ1bCA9IGlzU3RhdGVmdWxDb21wb25lbnQoaW5zdGFuY2UpO1xuICBpbml0UHJvcHMoaW5zdGFuY2UsIHByb3BzLCBpc1N0YXRlZnVsLCBpc1NTUik7XG4gIGluaXRTbG90cyhpbnN0YW5jZSwgY2hpbGRyZW4pO1xuICBjb25zdCBzZXR1cFJlc3VsdCA9IGlzU3RhdGVmdWwgPyBzZXR1cFN0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlLCBpc1NTUikgOiB2b2lkIDA7XG4gIGlzU1NSICYmIHNldEluU1NSU2V0dXBTdGF0ZShmYWxzZSk7XG4gIHJldHVybiBzZXR1cFJlc3VsdDtcbn1cbmZ1bmN0aW9uIHNldHVwU3RhdGVmdWxDb21wb25lbnQoaW5zdGFuY2UsIGlzU1NSKSB7XG4gIHZhciBfYTtcbiAgY29uc3QgQ29tcG9uZW50ID0gaW5zdGFuY2UudHlwZTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpZiAoQ29tcG9uZW50Lm5hbWUpIHtcbiAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShDb21wb25lbnQubmFtZSwgaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcpO1xuICAgIH1cbiAgICBpZiAoQ29tcG9uZW50LmNvbXBvbmVudHMpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoQ29tcG9uZW50LmNvbXBvbmVudHMpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZXNbaV0sIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKENvbXBvbmVudC5kaXJlY3RpdmVzKSB7XG4gICAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKENvbXBvbmVudC5kaXJlY3RpdmVzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsaWRhdGVEaXJlY3RpdmVOYW1lKG5hbWVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKENvbXBvbmVudC5jb21waWxlck9wdGlvbnMgJiYgaXNSdW50aW1lT25seSgpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBcImNvbXBpbGVyT3B0aW9uc1wiIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gdXNpbmcgYSBidWlsZCBvZiBWdWUgdGhhdCBpbmNsdWRlcyB0aGUgcnVudGltZSBjb21waWxlci4gU2luY2UgeW91IGFyZSB1c2luZyBhIHJ1bnRpbWUtb25seSBidWlsZCwgdGhlIG9wdGlvbnMgc2hvdWxkIGJlIHBhc3NlZCB2aWEgeW91ciBidWlsZCB0b29sIGNvbmZpZyBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGluc3RhbmNlLmFjY2Vzc0NhY2hlID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGluc3RhbmNlLnByb3h5ID0gbWFya1JhdyhuZXcgUHJveHkoaW5zdGFuY2UuY3R4LCBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMpKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBleHBvc2VQcm9wc09uUmVuZGVyQ29udGV4dChpbnN0YW5jZSk7XG4gIH1cbiAgY29uc3QgeyBzZXR1cCB9ID0gQ29tcG9uZW50O1xuICBpZiAoc2V0dXApIHtcbiAgICBjb25zdCBzZXR1cENvbnRleHQgPSBpbnN0YW5jZS5zZXR1cENvbnRleHQgPSBzZXR1cC5sZW5ndGggPiAxID8gY3JlYXRlU2V0dXBDb250ZXh0KGluc3RhbmNlKSA6IG51bGw7XG4gICAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICBjb25zdCBzZXR1cFJlc3VsdCA9IGNhbGxXaXRoRXJyb3JIYW5kbGluZyhcbiAgICAgIHNldHVwLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICAwLFxuICAgICAgW1xuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KGluc3RhbmNlLnByb3BzKSA6IGluc3RhbmNlLnByb3BzLFxuICAgICAgICBzZXR1cENvbnRleHRcbiAgICAgIF1cbiAgICApO1xuICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICByZXNldCgpO1xuICAgIGlmIChpc1Byb21pc2Uoc2V0dXBSZXN1bHQpKSB7XG4gICAgICBzZXR1cFJlc3VsdC50aGVuKHVuc2V0Q3VycmVudEluc3RhbmNlLCB1bnNldEN1cnJlbnRJbnN0YW5jZSk7XG4gICAgICBpZiAoaXNTU1IpIHtcbiAgICAgICAgcmV0dXJuIHNldHVwUmVzdWx0LnRoZW4oKHJlc29sdmVkUmVzdWx0KSA9PiB7XG4gICAgICAgICAgaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIHJlc29sdmVkUmVzdWx0LCBpc1NTUik7XG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgaGFuZGxlRXJyb3IoZSwgaW5zdGFuY2UsIDApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3RhbmNlLmFzeW5jRGVwID0gc2V0dXBSZXN1bHQ7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpbnN0YW5jZS5zdXNwZW5zZSkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSAoX2EgPSBDb21wb25lbnQubmFtZSkgIT0gbnVsbCA/IF9hIDogXCJBbm9ueW1vdXNcIjtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQ29tcG9uZW50IDwke25hbWV9Pjogc2V0dXAgZnVuY3Rpb24gcmV0dXJuZWQgYSBwcm9taXNlLCBidXQgbm8gPFN1c3BlbnNlPiBib3VuZGFyeSB3YXMgZm91bmQgaW4gdGhlIHBhcmVudCBjb21wb25lbnQgdHJlZS4gQSBjb21wb25lbnQgd2l0aCBhc3luYyBzZXR1cCgpIG11c3QgYmUgbmVzdGVkIGluIGEgPFN1c3BlbnNlPiBpbiBvcmRlciB0byBiZSByZW5kZXJlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoYW5kbGVTZXR1cFJlc3VsdChpbnN0YW5jZSwgc2V0dXBSZXN1bHQsIGlzU1NSKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZmluaXNoQ29tcG9uZW50U2V0dXAoaW5zdGFuY2UsIGlzU1NSKTtcbiAgfVxufVxuZnVuY3Rpb24gaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIHNldHVwUmVzdWx0LCBpc1NTUikge1xuICBpZiAoaXNGdW5jdGlvbihzZXR1cFJlc3VsdCkpIHtcbiAgICBpZiAoaW5zdGFuY2UudHlwZS5fX3NzcklubGluZVJlbmRlcikge1xuICAgICAgaW5zdGFuY2Uuc3NyUmVuZGVyID0gc2V0dXBSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLnJlbmRlciA9IHNldHVwUmVzdWx0O1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChzZXR1cFJlc3VsdCkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc1ZOb2RlKHNldHVwUmVzdWx0KSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgc2V0dXAoKSBzaG91bGQgbm90IHJldHVybiBWTm9kZXMgZGlyZWN0bHkgLSByZXR1cm4gYSByZW5kZXIgZnVuY3Rpb24gaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGluc3RhbmNlLmRldnRvb2xzUmF3U2V0dXBTdGF0ZSA9IHNldHVwUmVzdWx0O1xuICAgIH1cbiAgICBpbnN0YW5jZS5zZXR1cFN0YXRlID0gcHJveHlSZWZzKHNldHVwUmVzdWx0KTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgZXhwb3NlU2V0dXBTdGF0ZU9uUmVuZGVyQ29udGV4dChpbnN0YW5jZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2V0dXBSZXN1bHQgIT09IHZvaWQgMCkge1xuICAgIHdhcm4kMShcbiAgICAgIGBzZXR1cCgpIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0LiBSZWNlaXZlZDogJHtzZXR1cFJlc3VsdCA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIHNldHVwUmVzdWx0fWBcbiAgICApO1xuICB9XG4gIGZpbmlzaENvbXBvbmVudFNldHVwKGluc3RhbmNlLCBpc1NTUik7XG59XG5sZXQgY29tcGlsZTtcbmxldCBpbnN0YWxsV2l0aFByb3h5O1xuZnVuY3Rpb24gcmVnaXN0ZXJSdW50aW1lQ29tcGlsZXIoX2NvbXBpbGUpIHtcbiAgY29tcGlsZSA9IF9jb21waWxlO1xuICBpbnN0YWxsV2l0aFByb3h5ID0gKGkpID0+IHtcbiAgICBpZiAoaS5yZW5kZXIuX3JjKSB7XG4gICAgICBpLndpdGhQcm94eSA9IG5ldyBQcm94eShpLmN0eCwgUnVudGltZUNvbXBpbGVkUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzKTtcbiAgICB9XG4gIH07XG59XG5jb25zdCBpc1J1bnRpbWVPbmx5ID0gKCkgPT4gIWNvbXBpbGU7XG5mdW5jdGlvbiBmaW5pc2hDb21wb25lbnRTZXR1cChpbnN0YW5jZSwgaXNTU1IsIHNraXBPcHRpb25zKSB7XG4gIGNvbnN0IENvbXBvbmVudCA9IGluc3RhbmNlLnR5cGU7XG4gIGlmICghaW5zdGFuY2UucmVuZGVyKSB7XG4gICAgaWYgKCFpc1NTUiAmJiBjb21waWxlICYmICFDb21wb25lbnQucmVuZGVyKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IENvbXBvbmVudC50ZW1wbGF0ZSB8fCByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSkudGVtcGxhdGU7XG4gICAgICBpZiAodGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBjb21waWxlYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBpc0N1c3RvbUVsZW1lbnQsIGNvbXBpbGVyT3B0aW9ucyB9ID0gaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWc7XG4gICAgICAgIGNvbnN0IHsgZGVsaW1pdGVycywgY29tcGlsZXJPcHRpb25zOiBjb21wb25lbnRDb21waWxlck9wdGlvbnMgfSA9IENvbXBvbmVudDtcbiAgICAgICAgY29uc3QgZmluYWxDb21waWxlck9wdGlvbnMgPSBleHRlbmQoXG4gICAgICAgICAgZXh0ZW5kKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc0N1c3RvbUVsZW1lbnQsXG4gICAgICAgICAgICAgIGRlbGltaXRlcnNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21waWxlck9wdGlvbnNcbiAgICAgICAgICApLFxuICAgICAgICAgIGNvbXBvbmVudENvbXBpbGVyT3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBDb21wb25lbnQucmVuZGVyID0gY29tcGlsZSh0ZW1wbGF0ZSwgZmluYWxDb21waWxlck9wdGlvbnMpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBjb21waWxlYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaW5zdGFuY2UucmVuZGVyID0gQ29tcG9uZW50LnJlbmRlciB8fCBOT09QO1xuICAgIGlmIChpbnN0YWxsV2l0aFByb3h5KSB7XG4gICAgICBpbnN0YWxsV2l0aFByb3h5KGluc3RhbmNlKTtcbiAgICB9XG4gIH1cbiAgaWYgKF9fVlVFX09QVElPTlNfQVBJX18gJiYgdHJ1ZSkge1xuICAgIGNvbnN0IHJlc2V0ID0gc2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgdHJ5IHtcbiAgICAgIGFwcGx5T3B0aW9ucyhpbnN0YW5jZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgfVxuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFDb21wb25lbnQucmVuZGVyICYmIGluc3RhbmNlLnJlbmRlciA9PT0gTk9PUCAmJiAhaXNTU1IpIHtcbiAgICBpZiAoIWNvbXBpbGUgJiYgQ29tcG9uZW50LnRlbXBsYXRlKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBDb21wb25lbnQgcHJvdmlkZWQgdGVtcGxhdGUgb3B0aW9uIGJ1dCBydW50aW1lIGNvbXBpbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBidWlsZCBvZiBWdWUuYCArIChgIENvbmZpZ3VyZSB5b3VyIGJ1bmRsZXIgdG8gYWxpYXMgXCJ2dWVcIiB0byBcInZ1ZS9kaXN0L3Z1ZS5lc20tYnVuZGxlci5qc1wiLmAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2FybiQxKGBDb21wb25lbnQgaXMgbWlzc2luZyB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24uYCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBnZXRBdHRyc1Byb3h5KGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS5hdHRyc1Byb3h5IHx8IChpbnN0YW5jZS5hdHRyc1Byb3h5ID0gbmV3IFByb3h5KFxuICAgIGluc3RhbmNlLmF0dHJzLFxuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB7XG4gICAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIsIFwiJGF0dHJzXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gICAgICB9LFxuICAgICAgc2V0KCkge1xuICAgICAgICB3YXJuJDEoYHNldHVwQ29udGV4dC5hdHRycyBpcyByZWFkb25seS5gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5KCkge1xuICAgICAgICB3YXJuJDEoYHNldHVwQ29udGV4dC5hdHRycyBpcyByZWFkb25seS5gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIsIFwiJGF0dHJzXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gICAgICB9XG4gICAgfVxuICApKTtcbn1cbmZ1bmN0aW9uIGdldFNsb3RzUHJveHkoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLnNsb3RzUHJveHkgfHwgKGluc3RhbmNlLnNsb3RzUHJveHkgPSBuZXcgUHJveHkoaW5zdGFuY2Uuc2xvdHMsIHtcbiAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgIHRyYWNrKGluc3RhbmNlLCBcImdldFwiLCBcIiRzbG90c1wiKTtcbiAgICAgIHJldHVybiB0YXJnZXRba2V5XTtcbiAgICB9XG4gIH0pKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNldHVwQ29udGV4dChpbnN0YW5jZSkge1xuICBjb25zdCBleHBvc2UgPSAoZXhwb3NlZCkgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBpZiAoaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgICAgICB3YXJuJDEoYGV4cG9zZSgpIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBzZXR1cCgpLmApO1xuICAgICAgfVxuICAgICAgaWYgKGV4cG9zZWQgIT0gbnVsbCkge1xuICAgICAgICBsZXQgZXhwb3NlZFR5cGUgPSB0eXBlb2YgZXhwb3NlZDtcbiAgICAgICAgaWYgKGV4cG9zZWRUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkoZXhwb3NlZCkpIHtcbiAgICAgICAgICAgIGV4cG9zZWRUeXBlID0gXCJhcnJheVwiO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZWYoZXhwb3NlZCkpIHtcbiAgICAgICAgICAgIGV4cG9zZWRUeXBlID0gXCJyZWZcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cG9zZWRUeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYGV4cG9zZSgpIHNob3VsZCBiZSBwYXNzZWQgYSBwbGFpbiBvYmplY3QsIHJlY2VpdmVkICR7ZXhwb3NlZFR5cGV9LmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGluc3RhbmNlLmV4cG9zZWQgPSBleHBvc2VkIHx8IHt9O1xuICB9O1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgIGdldCBhdHRycygpIHtcbiAgICAgICAgcmV0dXJuIGdldEF0dHJzUHJveHkoaW5zdGFuY2UpO1xuICAgICAgfSxcbiAgICAgIGdldCBzbG90cygpIHtcbiAgICAgICAgcmV0dXJuIGdldFNsb3RzUHJveHkoaW5zdGFuY2UpO1xuICAgICAgfSxcbiAgICAgIGdldCBlbWl0KCkge1xuICAgICAgICByZXR1cm4gKGV2ZW50LCAuLi5hcmdzKSA9PiBpbnN0YW5jZS5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICAgIH0sXG4gICAgICBleHBvc2VcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0IGF0dHJzKCkge1xuICAgICAgICByZXR1cm4gZ2V0QXR0cnNQcm94eShpbnN0YW5jZSk7XG4gICAgICB9LFxuICAgICAgc2xvdHM6IGluc3RhbmNlLnNsb3RzLFxuICAgICAgZW1pdDogaW5zdGFuY2UuZW1pdCxcbiAgICAgIGV4cG9zZVxuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEV4cG9zZVByb3h5KGluc3RhbmNlKSB7XG4gIGlmIChpbnN0YW5jZS5leHBvc2VkKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmV4cG9zZVByb3h5IHx8IChpbnN0YW5jZS5leHBvc2VQcm94eSA9IG5ldyBQcm94eShwcm94eVJlZnMobWFya1JhdyhpbnN0YW5jZS5leHBvc2VkKSksIHtcbiAgICAgIGdldCh0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAoa2V5IGluIHRhcmdldCkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgaW4gcHVibGljUHJvcGVydGllc01hcCkge1xuICAgICAgICAgIHJldHVybiBwdWJsaWNQcm9wZXJ0aWVzTWFwW2tleV0oaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFzKHRhcmdldCwga2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gdGFyZ2V0IHx8IGtleSBpbiBwdWJsaWNQcm9wZXJ0aWVzTWFwO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxufVxuY29uc3QgY2xhc3NpZnlSRSA9IC8oPzpefFstX10pKFxcdykvZztcbmNvbnN0IGNsYXNzaWZ5ID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoY2xhc3NpZnlSRSwgKGMpID0+IGMudG9VcHBlckNhc2UoKSkucmVwbGFjZSgvWy1fXS9nLCBcIlwiKTtcbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50LCBpbmNsdWRlSW5mZXJyZWQgPSB0cnVlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKENvbXBvbmVudCkgPyBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgOiBDb21wb25lbnQubmFtZSB8fCBpbmNsdWRlSW5mZXJyZWQgJiYgQ29tcG9uZW50Ll9fbmFtZTtcbn1cbmZ1bmN0aW9uIGZvcm1hdENvbXBvbmVudE5hbWUoaW5zdGFuY2UsIENvbXBvbmVudCwgaXNSb290ID0gZmFsc2UpIHtcbiAgbGV0IG5hbWUgPSBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCk7XG4gIGlmICghbmFtZSAmJiBDb21wb25lbnQuX19maWxlKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBDb21wb25lbnQuX19maWxlLm1hdGNoKC8oW14vXFxcXF0rKVxcLlxcdyskLyk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBuYW1lID0gbWF0Y2hbMV07XG4gICAgfVxuICB9XG4gIGlmICghbmFtZSAmJiBpbnN0YW5jZSAmJiBpbnN0YW5jZS5wYXJlbnQpIHtcbiAgICBjb25zdCBpbmZlckZyb21SZWdpc3RyeSA9IChyZWdpc3RyeSkgPT4ge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVnaXN0cnkpIHtcbiAgICAgICAgaWYgKHJlZ2lzdHJ5W2tleV0gPT09IENvbXBvbmVudCkge1xuICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIG5hbWUgPSBpbmZlckZyb21SZWdpc3RyeShcbiAgICAgIGluc3RhbmNlLmNvbXBvbmVudHMgfHwgaW5zdGFuY2UucGFyZW50LnR5cGUuY29tcG9uZW50c1xuICAgICkgfHwgaW5mZXJGcm9tUmVnaXN0cnkoaW5zdGFuY2UuYXBwQ29udGV4dC5jb21wb25lbnRzKTtcbiAgfVxuICByZXR1cm4gbmFtZSA/IGNsYXNzaWZ5KG5hbWUpIDogaXNSb290ID8gYEFwcGAgOiBgQW5vbnltb3VzYDtcbn1cbmZ1bmN0aW9uIGlzQ2xhc3NDb21wb25lbnQodmFsdWUpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24odmFsdWUpICYmIFwiX192Y2NPcHRzXCIgaW4gdmFsdWU7XG59XG5cbmNvbnN0IGNvbXB1dGVkID0gKGdldHRlck9yT3B0aW9ucywgZGVidWdPcHRpb25zKSA9PiB7XG4gIHJldHVybiBjb21wdXRlZCQxKGdldHRlck9yT3B0aW9ucywgZGVidWdPcHRpb25zLCBpc0luU1NSQ29tcG9uZW50U2V0dXApO1xufTtcblxuZnVuY3Rpb24gdXNlTW9kZWwocHJvcHMsIG5hbWUsIG9wdGlvbnMgPSBFTVBUWV9PQkopIHtcbiAgY29uc3QgaSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaSkge1xuICAgIHdhcm4kMShgdXNlTW9kZWwoKSBjYWxsZWQgd2l0aG91dCBhY3RpdmUgaW5zdGFuY2UuYCk7XG4gICAgcmV0dXJuIHJlZigpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpLnByb3BzT3B0aW9uc1swXVtuYW1lXSkge1xuICAgIHdhcm4kMShgdXNlTW9kZWwoKSBjYWxsZWQgd2l0aCBwcm9wIFwiJHtuYW1lfVwiIHdoaWNoIGlzIG5vdCBkZWNsYXJlZC5gKTtcbiAgICByZXR1cm4gcmVmKCk7XG4gIH1cbiAgY29uc3QgY2FtZWxpemVkTmFtZSA9IGNhbWVsaXplKG5hbWUpO1xuICBjb25zdCBoeXBoZW5hdGVkTmFtZSA9IGh5cGhlbmF0ZShuYW1lKTtcbiAgY29uc3QgcmVzID0gY3VzdG9tUmVmKCh0cmFjaywgdHJpZ2dlcikgPT4ge1xuICAgIGxldCBsb2NhbFZhbHVlO1xuICAgIHdhdGNoU3luY0VmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wVmFsdWUgPSBwcm9wc1tuYW1lXTtcbiAgICAgIGlmIChoYXNDaGFuZ2VkKGxvY2FsVmFsdWUsIHByb3BWYWx1ZSkpIHtcbiAgICAgICAgbG9jYWxWYWx1ZSA9IHByb3BWYWx1ZTtcbiAgICAgICAgdHJpZ2dlcigpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHRyYWNrKCk7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmdldCA/IG9wdGlvbnMuZ2V0KGxvY2FsVmFsdWUpIDogbG9jYWxWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgcmF3UHJvcHMgPSBpLnZub2RlLnByb3BzO1xuICAgICAgICBpZiAoIShyYXdQcm9wcyAmJiAvLyBjaGVjayBpZiBwYXJlbnQgaGFzIHBhc3NlZCB2LW1vZGVsXG4gICAgICAgIChuYW1lIGluIHJhd1Byb3BzIHx8IGNhbWVsaXplZE5hbWUgaW4gcmF3UHJvcHMgfHwgaHlwaGVuYXRlZE5hbWUgaW4gcmF3UHJvcHMpICYmIChgb25VcGRhdGU6JHtuYW1lfWAgaW4gcmF3UHJvcHMgfHwgYG9uVXBkYXRlOiR7Y2FtZWxpemVkTmFtZX1gIGluIHJhd1Byb3BzIHx8IGBvblVwZGF0ZToke2h5cGhlbmF0ZWROYW1lfWAgaW4gcmF3UHJvcHMpKSAmJiBoYXNDaGFuZ2VkKHZhbHVlLCBsb2NhbFZhbHVlKSkge1xuICAgICAgICAgIGxvY2FsVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB0cmlnZ2VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaS5lbWl0KGB1cGRhdGU6JHtuYW1lfWAsIG9wdGlvbnMuc2V0ID8gb3B0aW9ucy5zZXQodmFsdWUpIDogdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICBjb25zdCBtb2RpZmllcktleSA9IG5hbWUgPT09IFwibW9kZWxWYWx1ZVwiID8gXCJtb2RlbE1vZGlmaWVyc1wiIDogYCR7bmFtZX1Nb2RpZmllcnNgO1xuICByZXNbU3ltYm9sLml0ZXJhdG9yXSA9ICgpID0+IHtcbiAgICBsZXQgaTIgPSAwO1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0KCkge1xuICAgICAgICBpZiAoaTIgPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGkyKysgPyBwcm9wc1ttb2RpZmllcktleV0gfHwge30gOiByZXMsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gaCh0eXBlLCBwcm9wc09yQ2hpbGRyZW4sIGNoaWxkcmVuKSB7XG4gIGNvbnN0IGwgPSBhcmd1bWVudHMubGVuZ3RoO1xuICBpZiAobCA9PT0gMikge1xuICAgIGlmIChpc09iamVjdChwcm9wc09yQ2hpbGRyZW4pICYmICFpc0FycmF5KHByb3BzT3JDaGlsZHJlbikpIHtcbiAgICAgIGlmIChpc1ZOb2RlKHByb3BzT3JDaGlsZHJlbikpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIG51bGwsIFtwcm9wc09yQ2hpbGRyZW5dKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBwcm9wc09yQ2hpbGRyZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgbnVsbCwgcHJvcHNPckNoaWxkcmVuKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGwgPiAzKSB7XG4gICAgICBjaGlsZHJlbiA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgfSBlbHNlIGlmIChsID09PSAzICYmIGlzVk5vZGUoY2hpbGRyZW4pKSB7XG4gICAgICBjaGlsZHJlbiA9IFtjaGlsZHJlbl07XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBwcm9wc09yQ2hpbGRyZW4sIGNoaWxkcmVuKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NoYWxsb3codmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlW1wiX192X2lzU2hhbGxvd1wiXSk7XG59XG5cbmZ1bmN0aW9uIGluaXRDdXN0b21Gb3JtYXR0ZXIoKSB7XG4gIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHZ1ZVN0eWxlID0geyBzdHlsZTogXCJjb2xvcjojM2JhNzc2XCIgfTtcbiAgY29uc3QgbnVtYmVyU3R5bGUgPSB7IHN0eWxlOiBcImNvbG9yOiMxNjc3ZmZcIiB9O1xuICBjb25zdCBzdHJpbmdTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6I2Y1MjIyZFwiIH07XG4gIGNvbnN0IGtleXdvcmRTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6I2ViMmY5NlwiIH07XG4gIGNvbnN0IGZvcm1hdHRlciA9IHtcbiAgICBoZWFkZXIob2JqKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAob2JqLl9faXNWdWUpIHtcbiAgICAgICAgcmV0dXJuIFtcImRpdlwiLCB2dWVTdHlsZSwgYFZ1ZUluc3RhbmNlYF07XG4gICAgICB9IGVsc2UgaWYgKGlzUmVmKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIFtcInNwYW5cIiwgdnVlU3R5bGUsIGdlblJlZkZsYWcob2JqKV0sXG4gICAgICAgICAgXCI8XCIsXG4gICAgICAgICAgZm9ybWF0VmFsdWUob2JqLnZhbHVlKSxcbiAgICAgICAgICBgPmBcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFjdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgICBbXCJzcGFuXCIsIHZ1ZVN0eWxlLCBpc1NoYWxsb3cob2JqKSA/IFwiU2hhbGxvd1JlYWN0aXZlXCIgOiBcIlJlYWN0aXZlXCJdLFxuICAgICAgICAgIFwiPFwiLFxuICAgICAgICAgIGZvcm1hdFZhbHVlKG9iaiksXG4gICAgICAgICAgYD4ke2lzUmVhZG9ubHkob2JqKSA/IGAgKHJlYWRvbmx5KWAgOiBgYH1gXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKGlzUmVhZG9ubHkob2JqKSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge30sXG4gICAgICAgICAgW1wic3BhblwiLCB2dWVTdHlsZSwgaXNTaGFsbG93KG9iaikgPyBcIlNoYWxsb3dSZWFkb25seVwiIDogXCJSZWFkb25seVwiXSxcbiAgICAgICAgICBcIjxcIixcbiAgICAgICAgICBmb3JtYXRWYWx1ZShvYmopLFxuICAgICAgICAgIFwiPlwiXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIGhhc0JvZHkob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIG9iai5fX2lzVnVlO1xuICAgIH0sXG4gICAgYm9keShvYmopIHtcbiAgICAgIGlmIChvYmogJiYgb2JqLl9faXNWdWUpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIC4uLmZvcm1hdEluc3RhbmNlKG9iai4kKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gZm9ybWF0SW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgICBjb25zdCBibG9ja3MgPSBbXTtcbiAgICBpZiAoaW5zdGFuY2UudHlwZS5wcm9wcyAmJiBpbnN0YW5jZS5wcm9wcykge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcInByb3BzXCIsIHRvUmF3KGluc3RhbmNlLnByb3BzKSkpO1xuICAgIH1cbiAgICBpZiAoaW5zdGFuY2Uuc2V0dXBTdGF0ZSAhPT0gRU1QVFlfT0JKKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwic2V0dXBcIiwgaW5zdGFuY2Uuc2V0dXBTdGF0ZSkpO1xuICAgIH1cbiAgICBpZiAoaW5zdGFuY2UuZGF0YSAhPT0gRU1QVFlfT0JKKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwiZGF0YVwiLCB0b1JhdyhpbnN0YW5jZS5kYXRhKSkpO1xuICAgIH1cbiAgICBjb25zdCBjb21wdXRlZCA9IGV4dHJhY3RLZXlzKGluc3RhbmNlLCBcImNvbXB1dGVkXCIpO1xuICAgIGlmIChjb21wdXRlZCkge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcImNvbXB1dGVkXCIsIGNvbXB1dGVkKSk7XG4gICAgfVxuICAgIGNvbnN0IGluamVjdGVkID0gZXh0cmFjdEtleXMoaW5zdGFuY2UsIFwiaW5qZWN0XCIpO1xuICAgIGlmIChpbmplY3RlZCkge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcImluamVjdGVkXCIsIGluamVjdGVkKSk7XG4gICAgfVxuICAgIGJsb2Nrcy5wdXNoKFtcbiAgICAgIFwiZGl2XCIsXG4gICAgICB7fSxcbiAgICAgIFtcbiAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzdHlsZToga2V5d29yZFN0eWxlLnN0eWxlICsgXCI7b3BhY2l0eTowLjY2XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCIkIChpbnRlcm5hbCk6IFwiXG4gICAgICBdLFxuICAgICAgW1wib2JqZWN0XCIsIHsgb2JqZWN0OiBpbnN0YW5jZSB9XVxuICAgIF0pO1xuICAgIHJldHVybiBibG9ja3M7XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VCbG9jayh0eXBlLCB0YXJnZXQpIHtcbiAgICB0YXJnZXQgPSBleHRlbmQoe30sIHRhcmdldCk7XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0YXJnZXQpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwge31dO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgXCJkaXZcIixcbiAgICAgIHsgc3R5bGU6IFwibGluZS1oZWlnaHQ6MS4yNWVtO21hcmdpbi1ib3R0b206MC42ZW1cIiB9LFxuICAgICAgW1xuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7XG4gICAgICAgICAgc3R5bGU6IFwiY29sb3I6IzQ3NjU4MlwiXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzdHlsZTogXCJwYWRkaW5nLWxlZnQ6MS4yNWVtXCJcbiAgICAgICAgfSxcbiAgICAgICAgLi4uT2JqZWN0LmtleXModGFyZ2V0KS5tYXAoKGtleSkgPT4ge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBbXCJzcGFuXCIsIGtleXdvcmRTdHlsZSwga2V5ICsgXCI6IFwiXSxcbiAgICAgICAgICAgIGZvcm1hdFZhbHVlKHRhcmdldFtrZXldLCBmYWxzZSlcbiAgICAgICAgICBdO1xuICAgICAgICB9KVxuICAgICAgXVxuICAgIF07XG4gIH1cbiAgZnVuY3Rpb24gZm9ybWF0VmFsdWUodiwgYXNSYXcgPSB0cnVlKSB7XG4gICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBudW1iZXJTdHlsZSwgdl07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwgc3RyaW5nU3R5bGUsIEpTT04uc3RyaW5naWZ5KHYpXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwga2V5d29yZFN0eWxlLCB2XTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHYpKSB7XG4gICAgICByZXR1cm4gW1wib2JqZWN0XCIsIHsgb2JqZWN0OiBhc1JhdyA/IHRvUmF3KHYpIDogdiB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwgc3RyaW5nU3R5bGUsIFN0cmluZyh2KV07XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGV4dHJhY3RLZXlzKGluc3RhbmNlLCB0eXBlKSB7XG4gICAgY29uc3QgQ29tcCA9IGluc3RhbmNlLnR5cGU7XG4gICAgaWYgKGlzRnVuY3Rpb24oQ29tcCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXh0cmFjdGVkID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gaW5zdGFuY2UuY3R4KSB7XG4gICAgICBpZiAoaXNLZXlPZlR5cGUoQ29tcCwga2V5LCB0eXBlKSkge1xuICAgICAgICBleHRyYWN0ZWRba2V5XSA9IGluc3RhbmNlLmN0eFtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXh0cmFjdGVkO1xuICB9XG4gIGZ1bmN0aW9uIGlzS2V5T2ZUeXBlKENvbXAsIGtleSwgdHlwZSkge1xuICAgIGNvbnN0IG9wdHMgPSBDb21wW3R5cGVdO1xuICAgIGlmIChpc0FycmF5KG9wdHMpICYmIG9wdHMuaW5jbHVkZXMoa2V5KSB8fCBpc09iamVjdChvcHRzKSAmJiBrZXkgaW4gb3B0cykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChDb21wLmV4dGVuZHMgJiYgaXNLZXlPZlR5cGUoQ29tcC5leHRlbmRzLCBrZXksIHR5cGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKENvbXAubWl4aW5zICYmIENvbXAubWl4aW5zLnNvbWUoKG0pID0+IGlzS2V5T2ZUeXBlKG0sIGtleSwgdHlwZSkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2VuUmVmRmxhZyh2KSB7XG4gICAgaWYgKGlzU2hhbGxvdyh2KSkge1xuICAgICAgcmV0dXJuIGBTaGFsbG93UmVmYDtcbiAgICB9XG4gICAgaWYgKHYuZWZmZWN0KSB7XG4gICAgICByZXR1cm4gYENvbXB1dGVkUmVmYDtcbiAgICB9XG4gICAgcmV0dXJuIGBSZWZgO1xuICB9XG4gIGlmICh3aW5kb3cuZGV2dG9vbHNGb3JtYXR0ZXJzKSB7XG4gICAgd2luZG93LmRldnRvb2xzRm9ybWF0dGVycy5wdXNoKGZvcm1hdHRlcik7XG4gIH0gZWxzZSB7XG4gICAgd2luZG93LmRldnRvb2xzRm9ybWF0dGVycyA9IFtmb3JtYXR0ZXJdO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdpdGhNZW1vKG1lbW8sIHJlbmRlciwgY2FjaGUsIGluZGV4KSB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlW2luZGV4XTtcbiAgaWYgKGNhY2hlZCAmJiBpc01lbW9TYW1lKGNhY2hlZCwgbWVtbykpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHJldCA9IHJlbmRlcigpO1xuICByZXQubWVtbyA9IG1lbW8uc2xpY2UoKTtcbiAgcmV0dXJuIGNhY2hlW2luZGV4XSA9IHJldDtcbn1cbmZ1bmN0aW9uIGlzTWVtb1NhbWUoY2FjaGVkLCBtZW1vKSB7XG4gIGNvbnN0IHByZXYgPSBjYWNoZWQubWVtbztcbiAgaWYgKHByZXYubGVuZ3RoICE9IG1lbW8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldi5sZW5ndGg7IGkrKykge1xuICAgIGlmIChoYXNDaGFuZ2VkKHByZXZbaV0sIG1lbW9baV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwICYmIGN1cnJlbnRCbG9jaykge1xuICAgIGN1cnJlbnRCbG9jay5wdXNoKGNhY2hlZCk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IHZlcnNpb24gPSBcIjMuNC4xMFwiO1xuY29uc3Qgd2FybiA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB3YXJuJDEgOiBOT09QO1xuY29uc3QgRXJyb3JUeXBlU3RyaW5ncyA9IEVycm9yVHlwZVN0cmluZ3MkMSA7XG5jb25zdCBkZXZ0b29scyA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgdHJ1ZSA/IGRldnRvb2xzJDEgOiB2b2lkIDA7XG5jb25zdCBzZXREZXZ0b29sc0hvb2sgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IHRydWUgPyBzZXREZXZ0b29sc0hvb2skMSA6IE5PT1A7XG5jb25zdCBfc3NyVXRpbHMgPSB7XG4gIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlLFxuICBzZXR1cENvbXBvbmVudCxcbiAgcmVuZGVyQ29tcG9uZW50Um9vdCxcbiAgc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlLFxuICBpc1ZOb2RlOiBpc1ZOb2RlLFxuICBub3JtYWxpemVWTm9kZVxufTtcbmNvbnN0IHNzclV0aWxzID0gX3NzclV0aWxzIDtcbmNvbnN0IHJlc29sdmVGaWx0ZXIgPSBudWxsO1xuY29uc3QgY29tcGF0VXRpbHMgPSBudWxsO1xuY29uc3QgRGVwcmVjYXRpb25UeXBlcyA9IG51bGw7XG5cbmV4cG9ydCB7IEJhc2VUcmFuc2l0aW9uLCBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycywgQ29tbWVudCwgRGVwcmVjYXRpb25UeXBlcywgRXJyb3JDb2RlcywgRXJyb3JUeXBlU3RyaW5ncywgRnJhZ21lbnQsIEtlZXBBbGl2ZSwgU3RhdGljLCBTdXNwZW5zZSwgVGVsZXBvcnQsIFRleHQsIGFzc2VydE51bWJlciwgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcsIGNhbGxXaXRoRXJyb3JIYW5kbGluZywgY2xvbmVWTm9kZSwgY29tcGF0VXRpbHMsIGNvbXB1dGVkLCBjcmVhdGVCbG9jaywgY3JlYXRlQ29tbWVudFZOb2RlLCBjcmVhdGVFbGVtZW50QmxvY2ssIGNyZWF0ZUJhc2VWTm9kZSBhcyBjcmVhdGVFbGVtZW50Vk5vZGUsIGNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyLCBjcmVhdGVQcm9wc1Jlc3RQcm94eSwgY3JlYXRlUmVuZGVyZXIsIGNyZWF0ZVNsb3RzLCBjcmVhdGVTdGF0aWNWTm9kZSwgY3JlYXRlVGV4dFZOb2RlLCBjcmVhdGVWTm9kZSwgZGVmaW5lQXN5bmNDb21wb25lbnQsIGRlZmluZUNvbXBvbmVudCwgZGVmaW5lRW1pdHMsIGRlZmluZUV4cG9zZSwgZGVmaW5lTW9kZWwsIGRlZmluZU9wdGlvbnMsIGRlZmluZVByb3BzLCBkZWZpbmVTbG90cywgZGV2dG9vbHMsIGdldEN1cnJlbnRJbnN0YW5jZSwgZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuLCBndWFyZFJlYWN0aXZlUHJvcHMsIGgsIGhhbmRsZUVycm9yLCBoYXNJbmplY3Rpb25Db250ZXh0LCBpbml0Q3VzdG9tRm9ybWF0dGVyLCBpbmplY3QsIGlzTWVtb1NhbWUsIGlzUnVudGltZU9ubHksIGlzVk5vZGUsIG1lcmdlRGVmYXVsdHMsIG1lcmdlTW9kZWxzLCBtZXJnZVByb3BzLCBuZXh0VGljaywgb25BY3RpdmF0ZWQsIG9uQmVmb3JlTW91bnQsIG9uQmVmb3JlVW5tb3VudCwgb25CZWZvcmVVcGRhdGUsIG9uRGVhY3RpdmF0ZWQsIG9uRXJyb3JDYXB0dXJlZCwgb25Nb3VudGVkLCBvblJlbmRlclRyYWNrZWQsIG9uUmVuZGVyVHJpZ2dlcmVkLCBvblNlcnZlclByZWZldGNoLCBvblVubW91bnRlZCwgb25VcGRhdGVkLCBvcGVuQmxvY2ssIHBvcFNjb3BlSWQsIHByb3ZpZGUsIHB1c2hTY29wZUlkLCBxdWV1ZVBvc3RGbHVzaENiLCByZWdpc3RlclJ1bnRpbWVDb21waWxlciwgcmVuZGVyTGlzdCwgcmVuZGVyU2xvdCwgcmVzb2x2ZUNvbXBvbmVudCwgcmVzb2x2ZURpcmVjdGl2ZSwgcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQsIHJlc29sdmVGaWx0ZXIsIHJlc29sdmVUcmFuc2l0aW9uSG9va3MsIHNldEJsb2NrVHJhY2tpbmcsIHNldERldnRvb2xzSG9vaywgc2V0VHJhbnNpdGlvbkhvb2tzLCBzc3JDb250ZXh0S2V5LCBzc3JVdGlscywgdG9IYW5kbGVycywgdHJhbnNmb3JtVk5vZGVBcmdzLCB1c2VBdHRycywgdXNlTW9kZWwsIHVzZVNTUkNvbnRleHQsIHVzZVNsb3RzLCB1c2VUcmFuc2l0aW9uU3RhdGUsIHZlcnNpb24sIHdhcm4sIHdhdGNoLCB3YXRjaEVmZmVjdCwgd2F0Y2hQb3N0RWZmZWN0LCB3YXRjaFN5bmNFZmZlY3QsIHdpdGhBc3luY0NvbnRleHQsIHdpdGhDdHgsIHdpdGhEZWZhdWx0cywgd2l0aERpcmVjdGl2ZXMsIHdpdGhNZW1vLCB3aXRoU2NvcGVJZCB9O1xuIiwiLyoqXG4qIEB2dWUvcnVudGltZS1kb20gdjMuNC4xMFxuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuaW1wb3J0IHsgaCwgQmFzZVRyYW5zaXRpb24sIEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLCBhc3NlcnROdW1iZXIsIGdldEN1cnJlbnRJbnN0YW5jZSwgd2Fybiwgd2F0Y2hQb3N0RWZmZWN0LCBvbk1vdW50ZWQsIG9uVW5tb3VudGVkLCBGcmFnbWVudCwgU3RhdGljLCBjYW1lbGl6ZSwgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcsIGRlZmluZUNvbXBvbmVudCwgbmV4dFRpY2ssIGNyZWF0ZVZOb2RlLCB1c2VUcmFuc2l0aW9uU3RhdGUsIG9uVXBkYXRlZCwgdG9SYXcsIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbiwgc2V0VHJhbnNpdGlvbkhvb2tzLCByZXNvbHZlVHJhbnNpdGlvbkhvb2tzLCBpc1J1bnRpbWVPbmx5LCBjcmVhdGVSZW5kZXJlciwgY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXIgfSBmcm9tICdAdnVlL3J1bnRpbWUtY29yZSc7XG5leHBvcnQgKiBmcm9tICdAdnVlL3J1bnRpbWUtY29yZSc7XG5pbXBvcnQgeyBleHRlbmQsIGlzT2JqZWN0LCB0b051bWJlciwgaXNBcnJheSwgaXNTdHJpbmcsIGh5cGhlbmF0ZSwgY2FwaXRhbGl6ZSwgaXNTcGVjaWFsQm9vbGVhbkF0dHIsIGluY2x1ZGVCb29sZWFuQXR0ciwgaXNPbiwgaXNNb2RlbExpc3RlbmVyLCBpc0Z1bmN0aW9uLCBjYW1lbGl6ZSBhcyBjYW1lbGl6ZSQxLCBFTVBUWV9PQkosIGxvb3NlVG9OdW1iZXIsIGxvb3NlSW5kZXhPZiwgaXNTZXQsIGxvb3NlRXF1YWwsIGludm9rZUFycmF5Rm5zLCBpc0hUTUxUYWcsIGlzU1ZHVGFnLCBpc01hdGhNTFRhZyB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuY29uc3Qgc3ZnTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7XG5jb25zdCBtYXRobWxOUyA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwiO1xuY29uc3QgZG9jID0gdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiID8gZG9jdW1lbnQgOiBudWxsO1xuY29uc3QgdGVtcGxhdGVDb250YWluZXIgPSBkb2MgJiYgLyogQF9fUFVSRV9fICovIGRvYy5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5jb25zdCBub2RlT3BzID0ge1xuICBpbnNlcnQ6IChjaGlsZCwgcGFyZW50LCBhbmNob3IpID0+IHtcbiAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBhbmNob3IgfHwgbnVsbCk7XG4gIH0sXG4gIHJlbW92ZTogKGNoaWxkKSA9PiB7XG4gICAgY29uc3QgcGFyZW50ID0gY2hpbGQucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICAgIH1cbiAgfSxcbiAgY3JlYXRlRWxlbWVudDogKHRhZywgbmFtZXNwYWNlLCBpcywgcHJvcHMpID0+IHtcbiAgICBjb25zdCBlbCA9IG5hbWVzcGFjZSA9PT0gXCJzdmdcIiA/IGRvYy5jcmVhdGVFbGVtZW50TlMoc3ZnTlMsIHRhZykgOiBuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIgPyBkb2MuY3JlYXRlRWxlbWVudE5TKG1hdGhtbE5TLCB0YWcpIDogZG9jLmNyZWF0ZUVsZW1lbnQodGFnLCBpcyA/IHsgaXMgfSA6IHZvaWQgMCk7XG4gICAgaWYgKHRhZyA9PT0gXCJzZWxlY3RcIiAmJiBwcm9wcyAmJiBwcm9wcy5tdWx0aXBsZSAhPSBudWxsKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiLCBwcm9wcy5tdWx0aXBsZSk7XG4gICAgfVxuICAgIHJldHVybiBlbDtcbiAgfSxcbiAgY3JlYXRlVGV4dDogKHRleHQpID0+IGRvYy5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSxcbiAgY3JlYXRlQ29tbWVudDogKHRleHQpID0+IGRvYy5jcmVhdGVDb21tZW50KHRleHQpLFxuICBzZXRUZXh0OiAobm9kZSwgdGV4dCkgPT4ge1xuICAgIG5vZGUubm9kZVZhbHVlID0gdGV4dDtcbiAgfSxcbiAgc2V0RWxlbWVudFRleHQ6IChlbCwgdGV4dCkgPT4ge1xuICAgIGVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgfSxcbiAgcGFyZW50Tm9kZTogKG5vZGUpID0+IG5vZGUucGFyZW50Tm9kZSxcbiAgbmV4dFNpYmxpbmc6IChub2RlKSA9PiBub2RlLm5leHRTaWJsaW5nLFxuICBxdWVyeVNlbGVjdG9yOiAoc2VsZWN0b3IpID0+IGRvYy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSxcbiAgc2V0U2NvcGVJZChlbCwgaWQpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoaWQsIFwiXCIpO1xuICB9LFxuICAvLyBfX1VOU0FGRV9fXG4gIC8vIFJlYXNvbjogaW5uZXJIVE1MLlxuICAvLyBTdGF0aWMgY29udGVudCBoZXJlIGNhbiBvbmx5IGNvbWUgZnJvbSBjb21waWxlZCB0ZW1wbGF0ZXMuXG4gIC8vIEFzIGxvbmcgYXMgdGhlIHVzZXIgb25seSB1c2VzIHRydXN0ZWQgdGVtcGxhdGVzLCB0aGlzIGlzIHNhZmUuXG4gIGluc2VydFN0YXRpY0NvbnRlbnQoY29udGVudCwgcGFyZW50LCBhbmNob3IsIG5hbWVzcGFjZSwgc3RhcnQsIGVuZCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IGFuY2hvciA/IGFuY2hvci5wcmV2aW91c1NpYmxpbmcgOiBwYXJlbnQubGFzdENoaWxkO1xuICAgIGlmIChzdGFydCAmJiAoc3RhcnQgPT09IGVuZCB8fCBzdGFydC5uZXh0U2libGluZykpIHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoc3RhcnQuY2xvbmVOb2RlKHRydWUpLCBhbmNob3IpO1xuICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCB8fCAhKHN0YXJ0ID0gc3RhcnQubmV4dFNpYmxpbmcpKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wbGF0ZUNvbnRhaW5lci5pbm5lckhUTUwgPSBuYW1lc3BhY2UgPT09IFwic3ZnXCIgPyBgPHN2Zz4ke2NvbnRlbnR9PC9zdmc+YCA6IG5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiA/IGA8bWF0aD4ke2NvbnRlbnR9PC9tYXRoPmAgOiBjb250ZW50O1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNvbnRhaW5lci5jb250ZW50O1xuICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRlbXBsYXRlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlICh3cmFwcGVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICB0ZW1wbGF0ZS5hcHBlbmRDaGlsZCh3cmFwcGVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlLnJlbW92ZUNoaWxkKHdyYXBwZXIpO1xuICAgICAgfVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0ZW1wbGF0ZSwgYW5jaG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIGZpcnN0XG4gICAgICBiZWZvcmUgPyBiZWZvcmUubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZCxcbiAgICAgIC8vIGxhc3RcbiAgICAgIGFuY2hvciA/IGFuY2hvci5wcmV2aW91c1NpYmxpbmcgOiBwYXJlbnQubGFzdENoaWxkXG4gICAgXTtcbiAgfVxufTtcblxuY29uc3QgVFJBTlNJVElPTiA9IFwidHJhbnNpdGlvblwiO1xuY29uc3QgQU5JTUFUSU9OID0gXCJhbmltYXRpb25cIjtcbmNvbnN0IHZ0Y0tleSA9IFN5bWJvbChcIl92dGNcIik7XG5jb25zdCBUcmFuc2l0aW9uID0gKHByb3BzLCB7IHNsb3RzIH0pID0+IGgoQmFzZVRyYW5zaXRpb24sIHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocHJvcHMpLCBzbG90cyk7XG5UcmFuc2l0aW9uLmRpc3BsYXlOYW1lID0gXCJUcmFuc2l0aW9uXCI7XG5jb25zdCBET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0ge1xuICBuYW1lOiBTdHJpbmcsXG4gIHR5cGU6IFN0cmluZyxcbiAgY3NzOiB7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBkZWZhdWx0OiB0cnVlXG4gIH0sXG4gIGR1cmF0aW9uOiBbU3RyaW5nLCBOdW1iZXIsIE9iamVjdF0sXG4gIGVudGVyRnJvbUNsYXNzOiBTdHJpbmcsXG4gIGVudGVyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgZW50ZXJUb0NsYXNzOiBTdHJpbmcsXG4gIGFwcGVhckZyb21DbGFzczogU3RyaW5nLFxuICBhcHBlYXJBY3RpdmVDbGFzczogU3RyaW5nLFxuICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsXG4gIGxlYXZlRnJvbUNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgbGVhdmVUb0NsYXNzOiBTdHJpbmdcbn07XG5jb25zdCBUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0gVHJhbnNpdGlvbi5wcm9wcyA9IC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoXG4gIHt9LFxuICBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyxcbiAgRE9NVHJhbnNpdGlvblByb3BzVmFsaWRhdG9yc1xuKTtcbmNvbnN0IGNhbGxIb29rID0gKGhvb2ssIGFyZ3MgPSBbXSkgPT4ge1xuICBpZiAoaXNBcnJheShob29rKSkge1xuICAgIGhvb2suZm9yRWFjaCgoaDIpID0+IGgyKC4uLmFyZ3MpKTtcbiAgfSBlbHNlIGlmIChob29rKSB7XG4gICAgaG9vayguLi5hcmdzKTtcbiAgfVxufTtcbmNvbnN0IGhhc0V4cGxpY2l0Q2FsbGJhY2sgPSAoaG9vaykgPT4ge1xuICByZXR1cm4gaG9vayA/IGlzQXJyYXkoaG9vaykgPyBob29rLnNvbWUoKGgyKSA9PiBoMi5sZW5ndGggPiAxKSA6IGhvb2subGVuZ3RoID4gMSA6IGZhbHNlO1xufTtcbmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocmF3UHJvcHMpIHtcbiAgY29uc3QgYmFzZVByb3BzID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHJhd1Byb3BzKSB7XG4gICAgaWYgKCEoa2V5IGluIERPTVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMpKSB7XG4gICAgICBiYXNlUHJvcHNba2V5XSA9IHJhd1Byb3BzW2tleV07XG4gICAgfVxuICB9XG4gIGlmIChyYXdQcm9wcy5jc3MgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGJhc2VQcm9wcztcbiAgfVxuICBjb25zdCB7XG4gICAgbmFtZSA9IFwidlwiLFxuICAgIHR5cGUsXG4gICAgZHVyYXRpb24sXG4gICAgZW50ZXJGcm9tQ2xhc3MgPSBgJHtuYW1lfS1lbnRlci1mcm9tYCxcbiAgICBlbnRlckFjdGl2ZUNsYXNzID0gYCR7bmFtZX0tZW50ZXItYWN0aXZlYCxcbiAgICBlbnRlclRvQ2xhc3MgPSBgJHtuYW1lfS1lbnRlci10b2AsXG4gICAgYXBwZWFyRnJvbUNsYXNzID0gZW50ZXJGcm9tQ2xhc3MsXG4gICAgYXBwZWFyQWN0aXZlQ2xhc3MgPSBlbnRlckFjdGl2ZUNsYXNzLFxuICAgIGFwcGVhclRvQ2xhc3MgPSBlbnRlclRvQ2xhc3MsXG4gICAgbGVhdmVGcm9tQ2xhc3MgPSBgJHtuYW1lfS1sZWF2ZS1mcm9tYCxcbiAgICBsZWF2ZUFjdGl2ZUNsYXNzID0gYCR7bmFtZX0tbGVhdmUtYWN0aXZlYCxcbiAgICBsZWF2ZVRvQ2xhc3MgPSBgJHtuYW1lfS1sZWF2ZS10b2BcbiAgfSA9IHJhd1Byb3BzO1xuICBjb25zdCBkdXJhdGlvbnMgPSBub3JtYWxpemVEdXJhdGlvbihkdXJhdGlvbik7XG4gIGNvbnN0IGVudGVyRHVyYXRpb24gPSBkdXJhdGlvbnMgJiYgZHVyYXRpb25zWzBdO1xuICBjb25zdCBsZWF2ZUR1cmF0aW9uID0gZHVyYXRpb25zICYmIGR1cmF0aW9uc1sxXTtcbiAgY29uc3Qge1xuICAgIG9uQmVmb3JlRW50ZXIsXG4gICAgb25FbnRlcixcbiAgICBvbkVudGVyQ2FuY2VsbGVkLFxuICAgIG9uTGVhdmUsXG4gICAgb25MZWF2ZUNhbmNlbGxlZCxcbiAgICBvbkJlZm9yZUFwcGVhciA9IG9uQmVmb3JlRW50ZXIsXG4gICAgb25BcHBlYXIgPSBvbkVudGVyLFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkID0gb25FbnRlckNhbmNlbGxlZFxuICB9ID0gYmFzZVByb3BzO1xuICBjb25zdCBmaW5pc2hFbnRlciA9IChlbCwgaXNBcHBlYXIsIGRvbmUpID0+IHtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGlzQXBwZWFyID8gYXBwZWFyVG9DbGFzcyA6IGVudGVyVG9DbGFzcyk7XG4gICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBpc0FwcGVhciA/IGFwcGVhckFjdGl2ZUNsYXNzIDogZW50ZXJBY3RpdmVDbGFzcyk7XG4gICAgZG9uZSAmJiBkb25lKCk7XG4gIH07XG4gIGNvbnN0IGZpbmlzaExlYXZlID0gKGVsLCBkb25lKSA9PiB7XG4gICAgZWwuX2lzTGVhdmluZyA9IGZhbHNlO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVUb0NsYXNzKTtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgIGRvbmUgJiYgZG9uZSgpO1xuICB9O1xuICBjb25zdCBtYWtlRW50ZXJIb29rID0gKGlzQXBwZWFyKSA9PiB7XG4gICAgcmV0dXJuIChlbCwgZG9uZSkgPT4ge1xuICAgICAgY29uc3QgaG9vayA9IGlzQXBwZWFyID8gb25BcHBlYXIgOiBvbkVudGVyO1xuICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IGZpbmlzaEVudGVyKGVsLCBpc0FwcGVhciwgZG9uZSk7XG4gICAgICBjYWxsSG9vayhob29rLCBbZWwsIHJlc29sdmVdKTtcbiAgICAgIG5leHRGcmFtZSgoKSA9PiB7XG4gICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJGcm9tQ2xhc3MgOiBlbnRlckZyb21DbGFzcyk7XG4gICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJUb0NsYXNzIDogZW50ZXJUb0NsYXNzKTtcbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdENhbGxiYWNrKGhvb2spKSB7XG4gICAgICAgICAgd2hlblRyYW5zaXRpb25FbmRzKGVsLCB0eXBlLCBlbnRlckR1cmF0aW9uLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGV4dGVuZChiYXNlUHJvcHMsIHtcbiAgICBvbkJlZm9yZUVudGVyKGVsKSB7XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUVudGVyLCBbZWxdKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgZW50ZXJGcm9tQ2xhc3MpO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBlbnRlckFjdGl2ZUNsYXNzKTtcbiAgICB9LFxuICAgIG9uQmVmb3JlQXBwZWFyKGVsKSB7XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUFwcGVhciwgW2VsXSk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGFwcGVhckZyb21DbGFzcyk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGFwcGVhckFjdGl2ZUNsYXNzKTtcbiAgICB9LFxuICAgIG9uRW50ZXI6IG1ha2VFbnRlckhvb2soZmFsc2UpLFxuICAgIG9uQXBwZWFyOiBtYWtlRW50ZXJIb29rKHRydWUpLFxuICAgIG9uTGVhdmUoZWwsIGRvbmUpIHtcbiAgICAgIGVsLl9pc0xlYXZpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IGZpbmlzaExlYXZlKGVsLCBkb25lKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgICAgZm9yY2VSZWZsb3coKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7XG4gICAgICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICBpZiAoIWVsLl9pc0xlYXZpbmcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUZyb21DbGFzcyk7XG4gICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVUb0NsYXNzKTtcbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdENhbGxiYWNrKG9uTGVhdmUpKSB7XG4gICAgICAgICAgd2hlblRyYW5zaXRpb25FbmRzKGVsLCB0eXBlLCBsZWF2ZUR1cmF0aW9uLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjYWxsSG9vayhvbkxlYXZlLCBbZWwsIHJlc29sdmVdKTtcbiAgICB9LFxuICAgIG9uRW50ZXJDYW5jZWxsZWQoZWwpIHtcbiAgICAgIGZpbmlzaEVudGVyKGVsLCBmYWxzZSk7XG4gICAgICBjYWxsSG9vayhvbkVudGVyQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICB9LFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hFbnRlcihlbCwgdHJ1ZSk7XG4gICAgICBjYWxsSG9vayhvbkFwcGVhckNhbmNlbGxlZCwgW2VsXSk7XG4gICAgfSxcbiAgICBvbkxlYXZlQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hMZWF2ZShlbCk7XG4gICAgICBjYWxsSG9vayhvbkxlYXZlQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplRHVyYXRpb24oZHVyYXRpb24pIHtcbiAgaWYgKGR1cmF0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmIChpc09iamVjdChkdXJhdGlvbikpIHtcbiAgICByZXR1cm4gW051bWJlck9mKGR1cmF0aW9uLmVudGVyKSwgTnVtYmVyT2YoZHVyYXRpb24ubGVhdmUpXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBuID0gTnVtYmVyT2YoZHVyYXRpb24pO1xuICAgIHJldHVybiBbbiwgbl07XG4gIH1cbn1cbmZ1bmN0aW9uIE51bWJlck9mKHZhbCkge1xuICBjb25zdCByZXMgPSB0b051bWJlcih2YWwpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGFzc2VydE51bWJlcihyZXMsIFwiPHRyYW5zaXRpb24+IGV4cGxpY2l0IGR1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGNscykge1xuICBjbHMuc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGVsLmNsYXNzTGlzdC5hZGQoYykpO1xuICAoZWxbdnRjS2V5XSB8fCAoZWxbdnRjS2V5XSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpKS5hZGQoY2xzKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgY2xzKSB7XG4gIGNscy5zcGxpdCgvXFxzKy8pLmZvckVhY2goKGMpID0+IGMgJiYgZWwuY2xhc3NMaXN0LnJlbW92ZShjKSk7XG4gIGNvbnN0IF92dGMgPSBlbFt2dGNLZXldO1xuICBpZiAoX3Z0Yykge1xuICAgIF92dGMuZGVsZXRlKGNscyk7XG4gICAgaWYgKCFfdnRjLnNpemUpIHtcbiAgICAgIGVsW3Z0Y0tleV0gPSB2b2lkIDA7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBuZXh0RnJhbWUoY2IpIHtcbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2IpO1xuICB9KTtcbn1cbmxldCBlbmRJZCA9IDA7XG5mdW5jdGlvbiB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIGV4cGVjdGVkVHlwZSwgZXhwbGljaXRUaW1lb3V0LCByZXNvbHZlKSB7XG4gIGNvbnN0IGlkID0gZWwuX2VuZElkID0gKytlbmRJZDtcbiAgY29uc3QgcmVzb2x2ZUlmTm90U3RhbGUgPSAoKSA9PiB7XG4gICAgaWYgKGlkID09PSBlbC5fZW5kSWQpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9XG4gIH07XG4gIGlmIChleHBsaWNpdFRpbWVvdXQpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChyZXNvbHZlSWZOb3RTdGFsZSwgZXhwbGljaXRUaW1lb3V0KTtcbiAgfVxuICBjb25zdCB7IHR5cGUsIHRpbWVvdXQsIHByb3BDb3VudCB9ID0gZ2V0VHJhbnNpdGlvbkluZm8oZWwsIGV4cGVjdGVkVHlwZSk7XG4gIGlmICghdHlwZSkge1xuICAgIHJldHVybiByZXNvbHZlKCk7XG4gIH1cbiAgY29uc3QgZW5kRXZlbnQgPSB0eXBlICsgXCJlbmRcIjtcbiAgbGV0IGVuZGVkID0gMDtcbiAgY29uc3QgZW5kID0gKCkgPT4ge1xuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZW5kRXZlbnQsIG9uRW5kKTtcbiAgICByZXNvbHZlSWZOb3RTdGFsZSgpO1xuICB9O1xuICBjb25zdCBvbkVuZCA9IChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBlbCAmJiArK2VuZGVkID49IHByb3BDb3VudCkge1xuICAgICAgZW5kKCk7XG4gICAgfVxuICB9O1xuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBpZiAoZW5kZWQgPCBwcm9wQ291bnQpIHtcbiAgICAgIGVuZCgpO1xuICAgIH1cbiAgfSwgdGltZW91dCArIDEpO1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGVuZEV2ZW50LCBvbkVuZCk7XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uSW5mbyhlbCwgZXhwZWN0ZWRUeXBlKSB7XG4gIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgY29uc3QgZ2V0U3R5bGVQcm9wZXJ0aWVzID0gKGtleSkgPT4gKHN0eWxlc1trZXldIHx8IFwiXCIpLnNwbGl0KFwiLCBcIik7XG4gIGNvbnN0IHRyYW5zaXRpb25EZWxheXMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7VFJBTlNJVElPTn1EZWxheWApO1xuICBjb25zdCB0cmFuc2l0aW9uRHVyYXRpb25zID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059RHVyYXRpb25gKTtcbiAgY29uc3QgdHJhbnNpdGlvblRpbWVvdXQgPSBnZXRUaW1lb3V0KHRyYW5zaXRpb25EZWxheXMsIHRyYW5zaXRpb25EdXJhdGlvbnMpO1xuICBjb25zdCBhbmltYXRpb25EZWxheXMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7QU5JTUFUSU9OfURlbGF5YCk7XG4gIGNvbnN0IGFuaW1hdGlvbkR1cmF0aW9ucyA9IGdldFN0eWxlUHJvcGVydGllcyhgJHtBTklNQVRJT059RHVyYXRpb25gKTtcbiAgY29uc3QgYW5pbWF0aW9uVGltZW91dCA9IGdldFRpbWVvdXQoYW5pbWF0aW9uRGVsYXlzLCBhbmltYXRpb25EdXJhdGlvbnMpO1xuICBsZXQgdHlwZSA9IG51bGw7XG4gIGxldCB0aW1lb3V0ID0gMDtcbiAgbGV0IHByb3BDb3VudCA9IDA7XG4gIGlmIChleHBlY3RlZFR5cGUgPT09IFRSQU5TSVRJT04pIHtcbiAgICBpZiAodHJhbnNpdGlvblRpbWVvdXQgPiAwKSB7XG4gICAgICB0eXBlID0gVFJBTlNJVElPTjtcbiAgICAgIHRpbWVvdXQgPSB0cmFuc2l0aW9uVGltZW91dDtcbiAgICAgIHByb3BDb3VudCA9IHRyYW5zaXRpb25EdXJhdGlvbnMubGVuZ3RoO1xuICAgIH1cbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IEFOSU1BVElPTikge1xuICAgIGlmIChhbmltYXRpb25UaW1lb3V0ID4gMCkge1xuICAgICAgdHlwZSA9IEFOSU1BVElPTjtcbiAgICAgIHRpbWVvdXQgPSBhbmltYXRpb25UaW1lb3V0O1xuICAgICAgcHJvcENvdW50ID0gYW5pbWF0aW9uRHVyYXRpb25zLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGltZW91dCA9IE1hdGgubWF4KHRyYW5zaXRpb25UaW1lb3V0LCBhbmltYXRpb25UaW1lb3V0KTtcbiAgICB0eXBlID0gdGltZW91dCA+IDAgPyB0cmFuc2l0aW9uVGltZW91dCA+IGFuaW1hdGlvblRpbWVvdXQgPyBUUkFOU0lUSU9OIDogQU5JTUFUSU9OIDogbnVsbDtcbiAgICBwcm9wQ291bnQgPSB0eXBlID8gdHlwZSA9PT0gVFJBTlNJVElPTiA/IHRyYW5zaXRpb25EdXJhdGlvbnMubGVuZ3RoIDogYW5pbWF0aW9uRHVyYXRpb25zLmxlbmd0aCA6IDA7XG4gIH1cbiAgY29uc3QgaGFzVHJhbnNmb3JtID0gdHlwZSA9PT0gVFJBTlNJVElPTiAmJiAvXFxiKHRyYW5zZm9ybXxhbGwpKCx8JCkvLnRlc3QoXG4gICAgZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059UHJvcGVydHlgKS50b1N0cmluZygpXG4gICk7XG4gIHJldHVybiB7XG4gICAgdHlwZSxcbiAgICB0aW1lb3V0LFxuICAgIHByb3BDb3VudCxcbiAgICBoYXNUcmFuc2Zvcm1cbiAgfTtcbn1cbmZ1bmN0aW9uIGdldFRpbWVvdXQoZGVsYXlzLCBkdXJhdGlvbnMpIHtcbiAgd2hpbGUgKGRlbGF5cy5sZW5ndGggPCBkdXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgZGVsYXlzID0gZGVsYXlzLmNvbmNhdChkZWxheXMpO1xuICB9XG4gIHJldHVybiBNYXRoLm1heCguLi5kdXJhdGlvbnMubWFwKChkLCBpKSA9PiB0b01zKGQpICsgdG9NcyhkZWxheXNbaV0pKSk7XG59XG5mdW5jdGlvbiB0b01zKHMpIHtcbiAgaWYgKHMgPT09IFwiYXV0b1wiKVxuICAgIHJldHVybiAwO1xuICByZXR1cm4gTnVtYmVyKHMuc2xpY2UoMCwgLTEpLnJlcGxhY2UoXCIsXCIsIFwiLlwiKSkgKiAxZTM7XG59XG5mdW5jdGlvbiBmb3JjZVJlZmxvdygpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0O1xufVxuXG5mdW5jdGlvbiBwYXRjaENsYXNzKGVsLCB2YWx1ZSwgaXNTVkcpIHtcbiAgY29uc3QgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbFt2dGNLZXldO1xuICBpZiAodHJhbnNpdGlvbkNsYXNzZXMpIHtcbiAgICB2YWx1ZSA9ICh2YWx1ZSA/IFt2YWx1ZSwgLi4udHJhbnNpdGlvbkNsYXNzZXNdIDogWy4uLnRyYW5zaXRpb25DbGFzc2VzXSkuam9pbihcIiBcIik7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJjbGFzc1wiKTtcbiAgfSBlbHNlIGlmIChpc1NWRykge1xuICAgIGVsLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBlbC5jbGFzc05hbWUgPSB2YWx1ZTtcbiAgfVxufVxuXG5jb25zdCB2U2hvd09sZEtleSA9IFN5bWJvbChcIl92b2RcIik7XG5jb25zdCB2U2hvdyA9IHtcbiAgYmVmb3JlTW91bnQoZWwsIHsgdmFsdWUgfSwgeyB0cmFuc2l0aW9uIH0pIHtcbiAgICBlbFt2U2hvd09sZEtleV0gPSBlbC5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiA/IFwiXCIgOiBlbC5zdHlsZS5kaXNwbGF5O1xuICAgIGlmICh0cmFuc2l0aW9uICYmIHZhbHVlKSB7XG4gICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RGlzcGxheShlbCwgdmFsdWUpO1xuICAgIH1cbiAgfSxcbiAgbW91bnRlZChlbCwgeyB2YWx1ZSB9LCB7IHRyYW5zaXRpb24gfSkge1xuICAgIGlmICh0cmFuc2l0aW9uICYmIHZhbHVlKSB7XG4gICAgICB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICB9XG4gIH0sXG4gIHVwZGF0ZWQoZWwsIHsgdmFsdWUsIG9sZFZhbHVlIH0sIHsgdHJhbnNpdGlvbiB9KSB7XG4gICAgaWYgKCF2YWx1ZSA9PT0gIW9sZFZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdHJhbnNpdGlvbi5iZWZvcmVFbnRlcihlbCk7XG4gICAgICAgIHNldERpc3BsYXkoZWwsIHRydWUpO1xuICAgICAgICB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zaXRpb24ubGVhdmUoZWwsICgpID0+IHtcbiAgICAgICAgICBzZXREaXNwbGF5KGVsLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXREaXNwbGF5KGVsLCB2YWx1ZSk7XG4gICAgfVxuICB9LFxuICBiZWZvcmVVbm1vdW50KGVsLCB7IHZhbHVlIH0pIHtcbiAgICBzZXREaXNwbGF5KGVsLCB2YWx1ZSk7XG4gIH1cbn07XG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICB2U2hvdy5uYW1lID0gXCJzaG93XCI7XG59XG5mdW5jdGlvbiBzZXREaXNwbGF5KGVsLCB2YWx1ZSkge1xuICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBlbFt2U2hvd09sZEtleV0gOiBcIm5vbmVcIjtcbn1cbmZ1bmN0aW9uIGluaXRWU2hvd0ZvclNTUigpIHtcbiAgdlNob3cuZ2V0U1NSUHJvcHMgPSAoeyB2YWx1ZSB9KSA9PiB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgc3R5bGU6IHsgZGlzcGxheTogXCJub25lXCIgfSB9O1xuICAgIH1cbiAgfTtcbn1cblxuY29uc3QgQ1NTX1ZBUl9URVhUID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBcIkNTU19WQVJfVEVYVFwiIDogXCJcIik7XG5mdW5jdGlvbiB1c2VDc3NWYXJzKGdldHRlcikge1xuICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoIWluc3RhbmNlKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGB1c2VDc3NWYXJzIGlzIGNhbGxlZCB3aXRob3V0IGN1cnJlbnQgYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZS5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdXBkYXRlVGVsZXBvcnRzID0gaW5zdGFuY2UudXQgPSAodmFycyA9IGdldHRlcihpbnN0YW5jZS5wcm94eSkpID0+IHtcbiAgICBBcnJheS5mcm9tKFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtdi1vd25lcj1cIiR7aW5zdGFuY2UudWlkfVwiXWApXG4gICAgKS5mb3JFYWNoKChub2RlKSA9PiBzZXRWYXJzT25Ob2RlKG5vZGUsIHZhcnMpKTtcbiAgfTtcbiAgY29uc3Qgc2V0VmFycyA9ICgpID0+IHtcbiAgICBjb25zdCB2YXJzID0gZ2V0dGVyKGluc3RhbmNlLnByb3h5KTtcbiAgICBzZXRWYXJzT25WTm9kZShpbnN0YW5jZS5zdWJUcmVlLCB2YXJzKTtcbiAgICB1cGRhdGVUZWxlcG9ydHModmFycyk7XG4gIH07XG4gIHdhdGNoUG9zdEVmZmVjdChzZXRWYXJzKTtcbiAgb25Nb3VudGVkKCgpID0+IHtcbiAgICBjb25zdCBvYiA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHNldFZhcnMpO1xuICAgIG9iLm9ic2VydmUoaW5zdGFuY2Uuc3ViVHJlZS5lbC5wYXJlbnROb2RlLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICBvblVubW91bnRlZCgoKSA9PiBvYi5kaXNjb25uZWN0KCkpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHNldFZhcnNPblZOb2RlKHZub2RlLCB2YXJzKSB7XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICBjb25zdCBzdXNwZW5zZSA9IHZub2RlLnN1c3BlbnNlO1xuICAgIHZub2RlID0gc3VzcGVuc2UuYWN0aXZlQnJhbmNoO1xuICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nQnJhbmNoICYmICFzdXNwZW5zZS5pc0h5ZHJhdGluZykge1xuICAgICAgc3VzcGVuc2UuZWZmZWN0cy5wdXNoKCgpID0+IHtcbiAgICAgICAgc2V0VmFyc09uVk5vZGUoc3VzcGVuc2UuYWN0aXZlQnJhbmNoLCB2YXJzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICB3aGlsZSAodm5vZGUuY29tcG9uZW50KSB7XG4gICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnQuc3ViVHJlZTtcbiAgfVxuICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMSAmJiB2bm9kZS5lbCkge1xuICAgIHNldFZhcnNPbk5vZGUodm5vZGUuZWwsIHZhcnMpO1xuICB9IGVsc2UgaWYgKHZub2RlLnR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoYykgPT4gc2V0VmFyc09uVk5vZGUoYywgdmFycykpO1xuICB9IGVsc2UgaWYgKHZub2RlLnR5cGUgPT09IFN0YXRpYykge1xuICAgIGxldCB7IGVsLCBhbmNob3IgfSA9IHZub2RlO1xuICAgIHdoaWxlIChlbCkge1xuICAgICAgc2V0VmFyc09uTm9kZShlbCwgdmFycyk7XG4gICAgICBpZiAoZWwgPT09IGFuY2hvcilcbiAgICAgICAgYnJlYWs7XG4gICAgICBlbCA9IGVsLm5leHRTaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0VmFyc09uTm9kZShlbCwgdmFycykge1xuICBpZiAoZWwubm9kZVR5cGUgPT09IDEpIHtcbiAgICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICAgIGxldCBjc3NUZXh0ID0gXCJcIjtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzKSB7XG4gICAgICBzdHlsZS5zZXRQcm9wZXJ0eShgLS0ke2tleX1gLCB2YXJzW2tleV0pO1xuICAgICAgY3NzVGV4dCArPSBgLS0ke2tleX06ICR7dmFyc1trZXldfTtgO1xuICAgIH1cbiAgICBzdHlsZVtDU1NfVkFSX1RFWFRdID0gY3NzVGV4dDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRjaFN0eWxlKGVsLCBwcmV2LCBuZXh0KSB7XG4gIGNvbnN0IHN0eWxlID0gZWwuc3R5bGU7XG4gIGNvbnN0IGN1cnJlbnREaXNwbGF5ID0gc3R5bGUuZGlzcGxheTtcbiAgY29uc3QgaXNDc3NTdHJpbmcgPSBpc1N0cmluZyhuZXh0KTtcbiAgaWYgKG5leHQgJiYgIWlzQ3NzU3RyaW5nKSB7XG4gICAgaWYgKHByZXYgJiYgIWlzU3RyaW5nKHByZXYpKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcmV2KSB7XG4gICAgICAgIGlmIChuZXh0W2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgIHNldFN0eWxlKHN0eWxlLCBrZXksIFwiXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIG5leHQpIHtcbiAgICAgIHNldFN0eWxlKHN0eWxlLCBrZXksIG5leHRba2V5XSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc0Nzc1N0cmluZykge1xuICAgICAgaWYgKHByZXYgIT09IG5leHQpIHtcbiAgICAgICAgY29uc3QgY3NzVmFyVGV4dCA9IHN0eWxlW0NTU19WQVJfVEVYVF07XG4gICAgICAgIGlmIChjc3NWYXJUZXh0KSB7XG4gICAgICAgICAgbmV4dCArPSBcIjtcIiArIGNzc1ZhclRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3R5bGUuY3NzVGV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcmV2KSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICB9XG4gIH1cbiAgaWYgKHZTaG93T2xkS2V5IGluIGVsKSB7XG4gICAgc3R5bGUuZGlzcGxheSA9IGN1cnJlbnREaXNwbGF5O1xuICB9XG59XG5jb25zdCBzZW1pY29sb25SRSA9IC9bXlxcXFxdO1xccyokLztcbmNvbnN0IGltcG9ydGFudFJFID0gL1xccyohaW1wb3J0YW50JC87XG5mdW5jdGlvbiBzZXRTdHlsZShzdHlsZSwgbmFtZSwgdmFsKSB7XG4gIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICB2YWwuZm9yRWFjaCgodikgPT4gc2V0U3R5bGUoc3R5bGUsIG5hbWUsIHYpKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodmFsID09IG51bGwpXG4gICAgICB2YWwgPSBcIlwiO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBpZiAoc2VtaWNvbG9uUkUudGVzdCh2YWwpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYFVuZXhwZWN0ZWQgc2VtaWNvbG9uIGF0IHRoZSBlbmQgb2YgJyR7bmFtZX0nIHN0eWxlIHZhbHVlOiAnJHt2YWx9J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICBzdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmVmaXhlZCA9IGF1dG9QcmVmaXgoc3R5bGUsIG5hbWUpO1xuICAgICAgaWYgKGltcG9ydGFudFJFLnRlc3QodmFsKSkge1xuICAgICAgICBzdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgICBoeXBoZW5hdGUocHJlZml4ZWQpLFxuICAgICAgICAgIHZhbC5yZXBsYWNlKGltcG9ydGFudFJFLCBcIlwiKSxcbiAgICAgICAgICBcImltcG9ydGFudFwiXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHlsZVtwcmVmaXhlZF0gPSB2YWw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5jb25zdCBwcmVmaXhlcyA9IFtcIldlYmtpdFwiLCBcIk1velwiLCBcIm1zXCJdO1xuY29uc3QgcHJlZml4Q2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGF1dG9QcmVmaXgoc3R5bGUsIHJhd05hbWUpIHtcbiAgY29uc3QgY2FjaGVkID0gcHJlZml4Q2FjaGVbcmF3TmFtZV07XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGxldCBuYW1lID0gY2FtZWxpemUocmF3TmFtZSk7XG4gIGlmIChuYW1lICE9PSBcImZpbHRlclwiICYmIG5hbWUgaW4gc3R5bGUpIHtcbiAgICByZXR1cm4gcHJlZml4Q2FjaGVbcmF3TmFtZV0gPSBuYW1lO1xuICB9XG4gIG5hbWUgPSBjYXBpdGFsaXplKG5hbWUpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcHJlZml4ZWQgPSBwcmVmaXhlc1tpXSArIG5hbWU7XG4gICAgaWYgKHByZWZpeGVkIGluIHN0eWxlKSB7XG4gICAgICByZXR1cm4gcHJlZml4Q2FjaGVbcmF3TmFtZV0gPSBwcmVmaXhlZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJhd05hbWU7XG59XG5cbmNvbnN0IHhsaW5rTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIjtcbmZ1bmN0aW9uIHBhdGNoQXR0cihlbCwga2V5LCB2YWx1ZSwgaXNTVkcsIGluc3RhbmNlKSB7XG4gIGlmIChpc1NWRyAmJiBrZXkuc3RhcnRzV2l0aChcInhsaW5rOlwiKSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGVOUyh4bGlua05TLCBrZXkuc2xpY2UoNiwga2V5Lmxlbmd0aCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGVOUyh4bGlua05TLCBrZXksIHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaXNCb29sZWFuID0gaXNTcGVjaWFsQm9vbGVhbkF0dHIoa2V5KTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBpc0Jvb2xlYW4gJiYgIWluY2x1ZGVCb29sZWFuQXR0cih2YWx1ZSkpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCBpc0Jvb2xlYW4gPyBcIlwiIDogdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRjaERPTVByb3AoZWwsIGtleSwgdmFsdWUsIHByZXZDaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdW5tb3VudENoaWxkcmVuKSB7XG4gIGlmIChrZXkgPT09IFwiaW5uZXJIVE1MXCIgfHwga2V5ID09PSBcInRleHRDb250ZW50XCIpIHtcbiAgICBpZiAocHJldkNoaWxkcmVuKSB7XG4gICAgICB1bm1vdW50Q2hpbGRyZW4ocHJldkNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlKTtcbiAgICB9XG4gICAgZWxba2V5XSA9IHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gIGlmIChrZXkgPT09IFwidmFsdWVcIiAmJiB0YWcgIT09IFwiUFJPR1JFU1NcIiAmJiAvLyBjdXN0b20gZWxlbWVudHMgbWF5IHVzZSBfdmFsdWUgaW50ZXJuYWxseVxuICAhdGFnLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgIGVsLl92YWx1ZSA9IHZhbHVlO1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFnID09PSBcIk9QVElPTlwiID8gZWwuZ2V0QXR0cmlidXRlKFwidmFsdWVcIikgOiBlbC52YWx1ZTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWU7XG4gICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgZWwudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IG5lZWRSZW1vdmUgPSBmYWxzZTtcbiAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGVsW2tleV07XG4gICAgaWYgKHR5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICB2YWx1ZSA9IGluY2x1ZGVCb29sZWFuQXR0cih2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsICYmIHR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgIG5lZWRSZW1vdmUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgdmFsdWUgPSAwO1xuICAgICAgbmVlZFJlbW92ZSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgZWxba2V5XSA9IHZhbHVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIW5lZWRSZW1vdmUpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBGYWlsZWQgc2V0dGluZyBwcm9wIFwiJHtrZXl9XCIgb24gPCR7dGFnLnRvTG93ZXJDYXNlKCl9PjogdmFsdWUgJHt2YWx1ZX0gaXMgaW52YWxpZC5gLFxuICAgICAgICBlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBuZWVkUmVtb3ZlICYmIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xufVxuXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIoZWwsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xufVxuY29uc3QgdmVpS2V5ID0gU3ltYm9sKFwiX3ZlaVwiKTtcbmZ1bmN0aW9uIHBhdGNoRXZlbnQoZWwsIHJhd05hbWUsIHByZXZWYWx1ZSwgbmV4dFZhbHVlLCBpbnN0YW5jZSA9IG51bGwpIHtcbiAgY29uc3QgaW52b2tlcnMgPSBlbFt2ZWlLZXldIHx8IChlbFt2ZWlLZXldID0ge30pO1xuICBjb25zdCBleGlzdGluZ0ludm9rZXIgPSBpbnZva2Vyc1tyYXdOYW1lXTtcbiAgaWYgKG5leHRWYWx1ZSAmJiBleGlzdGluZ0ludm9rZXIpIHtcbiAgICBleGlzdGluZ0ludm9rZXIudmFsdWUgPSBuZXh0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW25hbWUsIG9wdGlvbnNdID0gcGFyc2VOYW1lKHJhd05hbWUpO1xuICAgIGlmIChuZXh0VmFsdWUpIHtcbiAgICAgIGNvbnN0IGludm9rZXIgPSBpbnZva2Vyc1tyYXdOYW1lXSA9IGNyZWF0ZUludm9rZXIobmV4dFZhbHVlLCBpbnN0YW5jZSk7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBuYW1lLCBpbnZva2VyLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGV4aXN0aW5nSW52b2tlcikge1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihlbCwgbmFtZSwgZXhpc3RpbmdJbnZva2VyLCBvcHRpb25zKTtcbiAgICAgIGludm9rZXJzW3Jhd05hbWVdID0gdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuY29uc3Qgb3B0aW9uc01vZGlmaWVyUkUgPSAvKD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87XG5mdW5jdGlvbiBwYXJzZU5hbWUobmFtZSkge1xuICBsZXQgb3B0aW9ucztcbiAgaWYgKG9wdGlvbnNNb2RpZmllclJFLnRlc3QobmFtZSkpIHtcbiAgICBvcHRpb25zID0ge307XG4gICAgbGV0IG07XG4gICAgd2hpbGUgKG0gPSBuYW1lLm1hdGNoKG9wdGlvbnNNb2RpZmllclJFKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sZW5ndGggLSBtWzBdLmxlbmd0aCk7XG4gICAgICBvcHRpb25zW21bMF0udG9Mb3dlckNhc2UoKV0gPSB0cnVlO1xuICAgIH1cbiAgfVxuICBjb25zdCBldmVudCA9IG5hbWVbMl0gPT09IFwiOlwiID8gbmFtZS5zbGljZSgzKSA6IGh5cGhlbmF0ZShuYW1lLnNsaWNlKDIpKTtcbiAgcmV0dXJuIFtldmVudCwgb3B0aW9uc107XG59XG5sZXQgY2FjaGVkTm93ID0gMDtcbmNvbnN0IHAgPSAvKiBAX19QVVJFX18gKi8gUHJvbWlzZS5yZXNvbHZlKCk7XG5jb25zdCBnZXROb3cgPSAoKSA9PiBjYWNoZWROb3cgfHwgKHAudGhlbigoKSA9PiBjYWNoZWROb3cgPSAwKSwgY2FjaGVkTm93ID0gRGF0ZS5ub3coKSk7XG5mdW5jdGlvbiBjcmVhdGVJbnZva2VyKGluaXRpYWxWYWx1ZSwgaW5zdGFuY2UpIHtcbiAgY29uc3QgaW52b2tlciA9IChlKSA9PiB7XG4gICAgaWYgKCFlLl92dHMpIHtcbiAgICAgIGUuX3Z0cyA9IERhdGUubm93KCk7XG4gICAgfSBlbHNlIGlmIChlLl92dHMgPD0gaW52b2tlci5hdHRhY2hlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgIHBhdGNoU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKGUsIGludm9rZXIudmFsdWUpLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA1LFxuICAgICAgW2VdXG4gICAgKTtcbiAgfTtcbiAgaW52b2tlci52YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgaW52b2tlci5hdHRhY2hlZCA9IGdldE5vdygpO1xuICByZXR1cm4gaW52b2tlcjtcbn1cbmZ1bmN0aW9uIHBhdGNoU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKGUsIHZhbHVlKSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IG9yaWdpbmFsU3RvcCA9IGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gKCkgPT4ge1xuICAgICAgb3JpZ2luYWxTdG9wLmNhbGwoZSk7XG4gICAgICBlLl9zdG9wcGVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGZuKSA9PiAoZTIpID0+ICFlMi5fc3RvcHBlZCAmJiBmbiAmJiBmbihlMikpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5jb25zdCBpc05hdGl2ZU9uID0gKGtleSkgPT4ga2V5LmNoYXJDb2RlQXQoMCkgPT09IDExMSAmJiBrZXkuY2hhckNvZGVBdCgxKSA9PT0gMTEwICYmIC8vIGxvd2VyY2FzZSBsZXR0ZXJcbmtleS5jaGFyQ29kZUF0KDIpID4gOTYgJiYga2V5LmNoYXJDb2RlQXQoMikgPCAxMjM7XG5jb25zdCBwYXRjaFByb3AgPSAoZWwsIGtleSwgcHJldlZhbHVlLCBuZXh0VmFsdWUsIG5hbWVzcGFjZSwgcHJldkNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB1bm1vdW50Q2hpbGRyZW4pID0+IHtcbiAgY29uc3QgaXNTVkcgPSBuYW1lc3BhY2UgPT09IFwic3ZnXCI7XG4gIGlmIChrZXkgPT09IFwiY2xhc3NcIikge1xuICAgIHBhdGNoQ2xhc3MoZWwsIG5leHRWYWx1ZSwgaXNTVkcpO1xuICB9IGVsc2UgaWYgKGtleSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgcGF0Y2hTdHlsZShlbCwgcHJldlZhbHVlLCBuZXh0VmFsdWUpO1xuICB9IGVsc2UgaWYgKGlzT24oa2V5KSkge1xuICAgIGlmICghaXNNb2RlbExpc3RlbmVyKGtleSkpIHtcbiAgICAgIHBhdGNoRXZlbnQoZWwsIGtleSwgcHJldlZhbHVlLCBuZXh0VmFsdWUsIHBhcmVudENvbXBvbmVudCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGtleVswXSA9PT0gXCIuXCIgPyAoa2V5ID0ga2V5LnNsaWNlKDEpLCB0cnVlKSA6IGtleVswXSA9PT0gXCJeXCIgPyAoa2V5ID0ga2V5LnNsaWNlKDEpLCBmYWxzZSkgOiBzaG91bGRTZXRBc1Byb3AoZWwsIGtleSwgbmV4dFZhbHVlLCBpc1NWRykpIHtcbiAgICBwYXRjaERPTVByb3AoXG4gICAgICBlbCxcbiAgICAgIGtleSxcbiAgICAgIG5leHRWYWx1ZSxcbiAgICAgIHByZXZDaGlsZHJlbixcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgdW5tb3VudENoaWxkcmVuXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoa2V5ID09PSBcInRydWUtdmFsdWVcIikge1xuICAgICAgZWwuX3RydWVWYWx1ZSA9IG5leHRWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJmYWxzZS12YWx1ZVwiKSB7XG4gICAgICBlbC5fZmFsc2VWYWx1ZSA9IG5leHRWYWx1ZTtcbiAgICB9XG4gICAgcGF0Y2hBdHRyKGVsLCBrZXksIG5leHRWYWx1ZSwgaXNTVkcpO1xuICB9XG59O1xuZnVuY3Rpb24gc2hvdWxkU2V0QXNQcm9wKGVsLCBrZXksIHZhbHVlLCBpc1NWRykge1xuICBpZiAoaXNTVkcpIHtcbiAgICBpZiAoa2V5ID09PSBcImlubmVySFRNTFwiIHx8IGtleSA9PT0gXCJ0ZXh0Q29udGVudFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGtleSBpbiBlbCAmJiBpc05hdGl2ZU9uKGtleSkgJiYgaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJzcGVsbGNoZWNrXCIgfHwga2V5ID09PSBcImRyYWdnYWJsZVwiIHx8IGtleSA9PT0gXCJ0cmFuc2xhdGVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcImZvcm1cIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcImxpc3RcIiAmJiBlbC50YWdOYW1lID09PSBcIklOUFVUXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJ0eXBlXCIgJiYgZWwudGFnTmFtZSA9PT0gXCJURVhUQVJFQVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwid2lkdGhcIiB8fCBrZXkgPT09IFwiaGVpZ2h0XCIpIHtcbiAgICBjb25zdCB0YWcgPSBlbC50YWdOYW1lO1xuICAgIGlmICh0YWcgPT09IFwiSU1HXCIgfHwgdGFnID09PSBcIlZJREVPXCIgfHwgdGFnID09PSBcIkNBTlZBU1wiIHx8IHRhZyA9PT0gXCJTT1VSQ0VcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoaXNOYXRpdmVPbihrZXkpICYmIGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4ga2V5IGluIGVsO1xufVxuXG4vKiEgI19fTk9fU0lERV9FRkZFQ1RTX18gKi9cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBkZWZpbmVDdXN0b21FbGVtZW50KG9wdGlvbnMsIGh5ZHJhdGUyKSB7XG4gIGNvbnN0IENvbXAgPSBkZWZpbmVDb21wb25lbnQob3B0aW9ucyk7XG4gIGNsYXNzIFZ1ZUN1c3RvbUVsZW1lbnQgZXh0ZW5kcyBWdWVFbGVtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihpbml0aWFsUHJvcHMpIHtcbiAgICAgIHN1cGVyKENvbXAsIGluaXRpYWxQcm9wcywgaHlkcmF0ZTIpO1xuICAgIH1cbiAgfVxuICBWdWVDdXN0b21FbGVtZW50LmRlZiA9IENvbXA7XG4gIHJldHVybiBWdWVDdXN0b21FbGVtZW50O1xufVxuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG5jb25zdCBkZWZpbmVTU1JDdXN0b21FbGVtZW50ID0gLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi8gKG9wdGlvbnMpID0+IHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBkZWZpbmVDdXN0b21FbGVtZW50KG9wdGlvbnMsIGh5ZHJhdGUpO1xufTtcbmNvbnN0IEJhc2VDbGFzcyA9IHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiA/IEhUTUxFbGVtZW50IDogY2xhc3Mge1xufTtcbmNsYXNzIFZ1ZUVsZW1lbnQgZXh0ZW5kcyBCYXNlQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcihfZGVmLCBfcHJvcHMgPSB7fSwgaHlkcmF0ZTIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2RlZiA9IF9kZWY7XG4gICAgdGhpcy5fcHJvcHMgPSBfcHJvcHM7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgIHRoaXMuX2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3Jlc29sdmVkID0gZmFsc2U7XG4gICAgdGhpcy5fbnVtYmVyUHJvcHMgPSBudWxsO1xuICAgIHRoaXMuX29iID0gbnVsbDtcbiAgICBpZiAodGhpcy5zaGFkb3dSb290ICYmIGh5ZHJhdGUyKSB7XG4gICAgICBoeWRyYXRlMih0aGlzLl9jcmVhdGVWTm9kZSgpLCB0aGlzLnNoYWRvd1Jvb3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0aGlzLnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgQ3VzdG9tIGVsZW1lbnQgaGFzIHByZS1yZW5kZXJlZCBkZWNsYXJhdGl2ZSBzaGFkb3cgcm9vdCBidXQgaXMgbm90IGRlZmluZWQgYXMgaHlkcmF0YWJsZS4gVXNlIFxcYGRlZmluZVNTUkN1c3RvbUVsZW1lbnRcXGAuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiBcIm9wZW5cIiB9KTtcbiAgICAgIGlmICghdGhpcy5fZGVmLl9fYXN5bmNMb2FkZXIpIHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZVByb3BzKHRoaXMuX2RlZik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgaWYgKHRoaXMuX3Jlc29sdmVkKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZURlZigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5fb2IpIHtcbiAgICAgIHRoaXMuX29iLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuX29iID0gbnVsbDtcbiAgICB9XG4gICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25uZWN0ZWQpIHtcbiAgICAgICAgcmVuZGVyKG51bGwsIHRoaXMuc2hhZG93Um9vdCk7XG4gICAgICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogcmVzb2x2ZSBpbm5lciBjb21wb25lbnQgZGVmaW5pdGlvbiAoaGFuZGxlIHBvc3NpYmxlIGFzeW5jIGNvbXBvbmVudClcbiAgICovXG4gIF9yZXNvbHZlRGVmKCkge1xuICAgIHRoaXMuX3Jlc29sdmVkID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fc2V0QXR0cih0aGlzLmF0dHJpYnV0ZXNbaV0ubmFtZSk7XG4gICAgfVxuICAgIHRoaXMuX29iID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgZm9yIChjb25zdCBtIG9mIG11dGF0aW9ucykge1xuICAgICAgICB0aGlzLl9zZXRBdHRyKG0uYXR0cmlidXRlTmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fb2Iub2JzZXJ2ZSh0aGlzLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG4gICAgY29uc3QgcmVzb2x2ZSA9IChkZWYsIGlzQXN5bmMgPSBmYWxzZSkgPT4ge1xuICAgICAgY29uc3QgeyBwcm9wcywgc3R5bGVzIH0gPSBkZWY7XG4gICAgICBsZXQgbnVtYmVyUHJvcHM7XG4gICAgICBpZiAocHJvcHMgJiYgIWlzQXJyYXkocHJvcHMpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgICAgICAgY29uc3Qgb3B0ID0gcHJvcHNba2V5XTtcbiAgICAgICAgICBpZiAob3B0ID09PSBOdW1iZXIgfHwgb3B0ICYmIG9wdC50eXBlID09PSBOdW1iZXIpIHtcbiAgICAgICAgICAgIGlmIChrZXkgaW4gdGhpcy5fcHJvcHMpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcHJvcHNba2V5XSA9IHRvTnVtYmVyKHRoaXMuX3Byb3BzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKG51bWJlclByb3BzIHx8IChudW1iZXJQcm9wcyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpKSlbY2FtZWxpemUkMShrZXkpXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9udW1iZXJQcm9wcyA9IG51bWJlclByb3BzO1xuICAgICAgaWYgKGlzQXN5bmMpIHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZVByb3BzKGRlZik7XG4gICAgICB9XG4gICAgICB0aGlzLl9hcHBseVN0eWxlcyhzdHlsZXMpO1xuICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfTtcbiAgICBjb25zdCBhc3luY0RlZiA9IHRoaXMuX2RlZi5fX2FzeW5jTG9hZGVyO1xuICAgIGlmIChhc3luY0RlZikge1xuICAgICAgYXN5bmNEZWYoKS50aGVuKChkZWYpID0+IHJlc29sdmUoZGVmLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUodGhpcy5fZGVmKTtcbiAgICB9XG4gIH1cbiAgX3Jlc29sdmVQcm9wcyhkZWYpIHtcbiAgICBjb25zdCB7IHByb3BzIH0gPSBkZWY7XG4gICAgY29uc3QgZGVjbGFyZWRQcm9wS2V5cyA9IGlzQXJyYXkocHJvcHMpID8gcHJvcHMgOiBPYmplY3Qua2V5cyhwcm9wcyB8fCB7fSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcykpIHtcbiAgICAgIGlmIChrZXlbMF0gIT09IFwiX1wiICYmIGRlY2xhcmVkUHJvcEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICB0aGlzLl9zZXRQcm9wKGtleSwgdGhpc1trZXldLCB0cnVlLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGRlY2xhcmVkUHJvcEtleXMubWFwKGNhbWVsaXplJDEpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UHJvcChrZXkpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQodmFsKSB7XG4gICAgICAgICAgdGhpcy5fc2V0UHJvcChrZXksIHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBfc2V0QXR0cihrZXkpIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZShrZXkpO1xuICAgIGNvbnN0IGNhbWVsS2V5ID0gY2FtZWxpemUkMShrZXkpO1xuICAgIGlmICh0aGlzLl9udW1iZXJQcm9wcyAmJiB0aGlzLl9udW1iZXJQcm9wc1tjYW1lbEtleV0pIHtcbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRQcm9wKGNhbWVsS2V5LCB2YWx1ZSwgZmFsc2UpO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9nZXRQcm9wKGtleSkge1xuICAgIHJldHVybiB0aGlzLl9wcm9wc1trZXldO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9zZXRQcm9wKGtleSwgdmFsLCBzaG91bGRSZWZsZWN0ID0gdHJ1ZSwgc2hvdWxkVXBkYXRlID0gdHJ1ZSkge1xuICAgIGlmICh2YWwgIT09IHRoaXMuX3Byb3BzW2tleV0pIHtcbiAgICAgIHRoaXMuX3Byb3BzW2tleV0gPSB2YWw7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlICYmIHRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJlZmxlY3QpIHtcbiAgICAgICAgaWYgKHZhbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGh5cGhlbmF0ZShrZXkpLCBcIlwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShoeXBoZW5hdGUoa2V5KSwgdmFsICsgXCJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoIXZhbCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKGh5cGhlbmF0ZShrZXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBfdXBkYXRlKCkge1xuICAgIHJlbmRlcih0aGlzLl9jcmVhdGVWTm9kZSgpLCB0aGlzLnNoYWRvd1Jvb3QpO1xuICB9XG4gIF9jcmVhdGVWTm9kZSgpIHtcbiAgICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKHRoaXMuX2RlZiwgZXh0ZW5kKHt9LCB0aGlzLl9wcm9wcykpO1xuICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgIHZub2RlLmNlID0gKGluc3RhbmNlKSA9PiB7XG4gICAgICAgIHRoaXMuX2luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIGluc3RhbmNlLmlzQ0UgPSB0cnVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGluc3RhbmNlLmNlUmVsb2FkID0gKG5ld1N0eWxlcykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlcykge1xuICAgICAgICAgICAgICB0aGlzLl9zdHlsZXMuZm9yRWFjaCgocykgPT4gdGhpcy5zaGFkb3dSb290LnJlbW92ZUNoaWxkKHMpKTtcbiAgICAgICAgICAgICAgdGhpcy5fc3R5bGVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hcHBseVN0eWxlcyhuZXdTdHlsZXMpO1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXNwYXRjaCA9IChldmVudCwgYXJncykgPT4ge1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudChldmVudCwge1xuICAgICAgICAgICAgICBkZXRhaWw6IGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdGFuY2UuZW1pdCA9IChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAgICAgIGRpc3BhdGNoKGV2ZW50LCBhcmdzKTtcbiAgICAgICAgICBpZiAoaHlwaGVuYXRlKGV2ZW50KSAhPT0gZXZlbnQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKGh5cGhlbmF0ZShldmVudCksIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXM7XG4gICAgICAgIHdoaWxlIChwYXJlbnQgPSBwYXJlbnQgJiYgKHBhcmVudC5wYXJlbnROb2RlIHx8IHBhcmVudC5ob3N0KSkge1xuICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBWdWVFbGVtZW50KSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5wYXJlbnQgPSBwYXJlbnQuX2luc3RhbmNlO1xuICAgICAgICAgICAgaW5zdGFuY2UucHJvdmlkZXMgPSBwYXJlbnQuX2luc3RhbmNlLnByb3ZpZGVzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbiAgX2FwcGx5U3R5bGVzKHN0eWxlcykge1xuICAgIGlmIChzdHlsZXMpIHtcbiAgICAgIHN0eWxlcy5mb3JFYWNoKChjc3MpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICAgICAgcy50ZXh0Q29udGVudCA9IGNzcztcbiAgICAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKHMpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICh0aGlzLl9zdHlsZXMgfHwgKHRoaXMuX3N0eWxlcyA9IFtdKSkucHVzaChzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVzZUNzc01vZHVsZShuYW1lID0gXCIkc3R5bGVcIikge1xuICB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYHVzZUNzc01vZHVsZSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgc2V0dXAoKWApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlcyA9IGluc3RhbmNlLnR5cGUuX19jc3NNb2R1bGVzO1xuICAgIGlmICghbW9kdWxlcykge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZXMgaW5qZWN0ZWQuYCk7XG4gICAgICByZXR1cm4gRU1QVFlfT0JKO1xuICAgIH1cbiAgICBjb25zdCBtb2QgPSBtb2R1bGVzW25hbWVdO1xuICAgIGlmICghbW9kKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYEN1cnJlbnQgaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBDU1MgbW9kdWxlIG5hbWVkIFwiJHtuYW1lfVwiLmApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgcmV0dXJuIG1vZDtcbiAgfVxufVxuXG5jb25zdCBwb3NpdGlvbk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgbmV3UG9zaXRpb25NYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IG1vdmVDYktleSA9IFN5bWJvbChcIl9tb3ZlQ2JcIik7XG5jb25zdCBlbnRlckNiS2V5ID0gU3ltYm9sKFwiX2VudGVyQ2JcIik7XG5jb25zdCBUcmFuc2l0aW9uR3JvdXBJbXBsID0ge1xuICBuYW1lOiBcIlRyYW5zaXRpb25Hcm91cFwiLFxuICBwcm9wczogLyogQF9fUFVSRV9fICovIGV4dGVuZCh7fSwgVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycywge1xuICAgIHRhZzogU3RyaW5nLFxuICAgIG1vdmVDbGFzczogU3RyaW5nXG4gIH0pLFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHVzZVRyYW5zaXRpb25TdGF0ZSgpO1xuICAgIGxldCBwcmV2Q2hpbGRyZW47XG4gICAgbGV0IGNoaWxkcmVuO1xuICAgIG9uVXBkYXRlZCgoKSA9PiB7XG4gICAgICBpZiAoIXByZXZDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbW92ZUNsYXNzID0gcHJvcHMubW92ZUNsYXNzIHx8IGAke3Byb3BzLm5hbWUgfHwgXCJ2XCJ9LW1vdmVgO1xuICAgICAgaWYgKCFoYXNDU1NUcmFuc2Zvcm0oXG4gICAgICAgIHByZXZDaGlsZHJlblswXS5lbCxcbiAgICAgICAgaW5zdGFuY2Uudm5vZGUuZWwsXG4gICAgICAgIG1vdmVDbGFzc1xuICAgICAgKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwcmV2Q2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7XG4gICAgICBwcmV2Q2hpbGRyZW4uZm9yRWFjaChyZWNvcmRQb3NpdGlvbik7XG4gICAgICBjb25zdCBtb3ZlZENoaWxkcmVuID0gcHJldkNoaWxkcmVuLmZpbHRlcihhcHBseVRyYW5zbGF0aW9uKTtcbiAgICAgIGZvcmNlUmVmbG93KCk7XG4gICAgICBtb3ZlZENoaWxkcmVuLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBjLmVsO1xuICAgICAgICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7XG4gICAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IFwiXCI7XG4gICAgICAgIGNvbnN0IGNiID0gZWxbbW92ZUNiS2V5XSA9IChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUgJiYgZS50YXJnZXQgIT09IGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZSB8fCAvdHJhbnNmb3JtJC8udGVzdChlLnByb3BlcnR5TmFtZSkpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsIGNiKTtcbiAgICAgICAgICAgIGVsW21vdmVDYktleV0gPSBudWxsO1xuICAgICAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBtb3ZlQ2xhc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25lbmRcIiwgY2IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IHJhd1Byb3BzID0gdG9SYXcocHJvcHMpO1xuICAgICAgY29uc3QgY3NzVHJhbnNpdGlvblByb3BzID0gcmVzb2x2ZVRyYW5zaXRpb25Qcm9wcyhyYXdQcm9wcyk7XG4gICAgICBsZXQgdGFnID0gcmF3UHJvcHMudGFnIHx8IEZyYWdtZW50O1xuICAgICAgcHJldkNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICBjaGlsZHJlbiA9IHNsb3RzLmRlZmF1bHQgPyBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4oc2xvdHMuZGVmYXVsdCgpKSA6IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoY2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uSG9va3MoXG4gICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgIHJlc29sdmVUcmFuc2l0aW9uSG9va3MoY2hpbGQsIGNzc1RyYW5zaXRpb25Qcm9wcywgc3RhdGUsIGluc3RhbmNlKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHdhcm4oYDxUcmFuc2l0aW9uR3JvdXA+IGNoaWxkcmVuIG11c3QgYmUga2V5ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcmV2Q2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjaGlsZCA9IHByZXZDaGlsZHJlbltpXTtcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uSG9va3MoXG4gICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgIHJlc29sdmVUcmFuc2l0aW9uSG9va3MoY2hpbGQsIGNzc1RyYW5zaXRpb25Qcm9wcywgc3RhdGUsIGluc3RhbmNlKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcG9zaXRpb25NYXAuc2V0KGNoaWxkLCBjaGlsZC5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0YWcsIG51bGwsIGNoaWxkcmVuKTtcbiAgICB9O1xuICB9XG59O1xuY29uc3QgcmVtb3ZlTW9kZSA9IChwcm9wcykgPT4gZGVsZXRlIHByb3BzLm1vZGU7XG4vKiBAX19QVVJFX18gKi8gcmVtb3ZlTW9kZShUcmFuc2l0aW9uR3JvdXBJbXBsLnByb3BzKTtcbmNvbnN0IFRyYW5zaXRpb25Hcm91cCA9IFRyYW5zaXRpb25Hcm91cEltcGw7XG5mdW5jdGlvbiBjYWxsUGVuZGluZ0NicyhjKSB7XG4gIGNvbnN0IGVsID0gYy5lbDtcbiAgaWYgKGVsW21vdmVDYktleV0pIHtcbiAgICBlbFttb3ZlQ2JLZXldKCk7XG4gIH1cbiAgaWYgKGVsW2VudGVyQ2JLZXldKSB7XG4gICAgZWxbZW50ZXJDYktleV0oKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVjb3JkUG9zaXRpb24oYykge1xuICBuZXdQb3NpdGlvbk1hcC5zZXQoYywgYy5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG59XG5mdW5jdGlvbiBhcHBseVRyYW5zbGF0aW9uKGMpIHtcbiAgY29uc3Qgb2xkUG9zID0gcG9zaXRpb25NYXAuZ2V0KGMpO1xuICBjb25zdCBuZXdQb3MgPSBuZXdQb3NpdGlvbk1hcC5nZXQoYyk7XG4gIGNvbnN0IGR4ID0gb2xkUG9zLmxlZnQgLSBuZXdQb3MubGVmdDtcbiAgY29uc3QgZHkgPSBvbGRQb3MudG9wIC0gbmV3UG9zLnRvcDtcbiAgaWYgKGR4IHx8IGR5KSB7XG4gICAgY29uc3QgcyA9IGMuZWwuc3R5bGU7XG4gICAgcy50cmFuc2Zvcm0gPSBzLndlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtkeH1weCwke2R5fXB4KWA7XG4gICAgcy50cmFuc2l0aW9uRHVyYXRpb24gPSBcIjBzXCI7XG4gICAgcmV0dXJuIGM7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhc0NTU1RyYW5zZm9ybShlbCwgcm9vdCwgbW92ZUNsYXNzKSB7XG4gIGNvbnN0IGNsb25lID0gZWwuY2xvbmVOb2RlKCk7XG4gIGNvbnN0IF92dGMgPSBlbFt2dGNLZXldO1xuICBpZiAoX3Z0Yykge1xuICAgIF92dGMuZm9yRWFjaCgoY2xzKSA9PiB7XG4gICAgICBjbHMuc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGNsb25lLmNsYXNzTGlzdC5yZW1vdmUoYykpO1xuICAgIH0pO1xuICB9XG4gIG1vdmVDbGFzcy5zcGxpdCgvXFxzKy8pLmZvckVhY2goKGMpID0+IGMgJiYgY2xvbmUuY2xhc3NMaXN0LmFkZChjKSk7XG4gIGNsb25lLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgY29uc3QgY29udGFpbmVyID0gcm9vdC5ub2RlVHlwZSA9PT0gMSA/IHJvb3QgOiByb290LnBhcmVudE5vZGU7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjbG9uZSk7XG4gIGNvbnN0IHsgaGFzVHJhbnNmb3JtIH0gPSBnZXRUcmFuc2l0aW9uSW5mbyhjbG9uZSk7XG4gIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjbG9uZSk7XG4gIHJldHVybiBoYXNUcmFuc2Zvcm07XG59XG5cbmNvbnN0IGdldE1vZGVsQXNzaWduZXIgPSAodm5vZGUpID0+IHtcbiAgY29uc3QgZm4gPSB2bm9kZS5wcm9wc1tcIm9uVXBkYXRlOm1vZGVsVmFsdWVcIl0gfHwgZmFsc2U7XG4gIHJldHVybiBpc0FycmF5KGZuKSA/ICh2YWx1ZSkgPT4gaW52b2tlQXJyYXlGbnMoZm4sIHZhbHVlKSA6IGZuO1xufTtcbmZ1bmN0aW9uIG9uQ29tcG9zaXRpb25TdGFydChlKSB7XG4gIGUudGFyZ2V0LmNvbXBvc2luZyA9IHRydWU7XG59XG5mdW5jdGlvbiBvbkNvbXBvc2l0aW9uRW5kKGUpIHtcbiAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gIGlmICh0YXJnZXQuY29tcG9zaW5nKSB7XG4gICAgdGFyZ2V0LmNvbXBvc2luZyA9IGZhbHNlO1xuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIpKTtcbiAgfVxufVxuY29uc3QgYXNzaWduS2V5ID0gU3ltYm9sKFwiX2Fzc2lnblwiKTtcbmNvbnN0IHZNb2RlbFRleHQgPSB7XG4gIGNyZWF0ZWQoZWwsIHsgbW9kaWZpZXJzOiB7IGxhenksIHRyaW0sIG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGNvbnN0IGNhc3RUb051bWJlciA9IG51bWJlciB8fCB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy50eXBlID09PSBcIm51bWJlclwiO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIGxhenkgPyBcImNoYW5nZVwiIDogXCJpbnB1dFwiLCAoZSkgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0LmNvbXBvc2luZylcbiAgICAgICAgcmV0dXJuO1xuICAgICAgbGV0IGRvbVZhbHVlID0gZWwudmFsdWU7XG4gICAgICBpZiAodHJpbSkge1xuICAgICAgICBkb21WYWx1ZSA9IGRvbVZhbHVlLnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGlmIChjYXN0VG9OdW1iZXIpIHtcbiAgICAgICAgZG9tVmFsdWUgPSBsb29zZVRvTnVtYmVyKGRvbVZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGVsW2Fzc2lnbktleV0oZG9tVmFsdWUpO1xuICAgIH0pO1xuICAgIGlmICh0cmltKSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAgIGVsLnZhbHVlID0gZWwudmFsdWUudHJpbSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghbGF6eSkge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjb21wb3NpdGlvbnN0YXJ0XCIsIG9uQ29tcG9zaXRpb25TdGFydCk7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNvbXBvc2l0aW9uZW5kXCIsIG9uQ29tcG9zaXRpb25FbmQpO1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgb25Db21wb3NpdGlvbkVuZCk7XG4gICAgfVxuICB9LFxuICAvLyBzZXQgdmFsdWUgb24gbW91bnRlZCBzbyBpdCdzIGFmdGVyIG1pbi9tYXggZm9yIHR5cGU9XCJyYW5nZVwiXG4gIG1vdW50ZWQoZWwsIHsgdmFsdWUgfSkge1xuICAgIGVsLnZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTtcbiAgfSxcbiAgYmVmb3JlVXBkYXRlKGVsLCB7IHZhbHVlLCBtb2RpZmllcnM6IHsgbGF6eSwgdHJpbSwgbnVtYmVyIH0gfSwgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgaWYgKGVsLmNvbXBvc2luZylcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBlbFZhbHVlID0gbnVtYmVyIHx8IGVsLnR5cGUgPT09IFwibnVtYmVyXCIgPyBsb29zZVRvTnVtYmVyKGVsLnZhbHVlKSA6IGVsLnZhbHVlO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTtcbiAgICBpZiAoZWxWYWx1ZSA9PT0gbmV3VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGVsICYmIGVsLnR5cGUgIT09IFwicmFuZ2VcIikge1xuICAgICAgaWYgKGxhenkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRyaW0gJiYgZWwudmFsdWUudHJpbSgpID09PSBuZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGVsLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbn07XG5jb25zdCB2TW9kZWxDaGVja2JveCA9IHtcbiAgLy8gIzQwOTYgYXJyYXkgY2hlY2tib3hlcyBuZWVkIHRvIGJlIGRlZXAgdHJhdmVyc2VkXG4gIGRlZXA6IHRydWUsXG4gIGNyZWF0ZWQoZWwsIF8sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSBlbC5fbW9kZWxWYWx1ZTtcbiAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZSA9IGdldFZhbHVlKGVsKTtcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSBlbC5jaGVja2VkO1xuICAgICAgY29uc3QgYXNzaWduID0gZWxbYXNzaWduS2V5XTtcbiAgICAgIGlmIChpc0FycmF5KG1vZGVsVmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbG9vc2VJbmRleE9mKG1vZGVsVmFsdWUsIGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gaW5kZXggIT09IC0xO1xuICAgICAgICBpZiAoY2hlY2tlZCAmJiAhZm91bmQpIHtcbiAgICAgICAgICBhc3NpZ24obW9kZWxWYWx1ZS5jb25jYXQoZWxlbWVudFZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrZWQgJiYgZm91bmQpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IFsuLi5tb2RlbFZhbHVlXTtcbiAgICAgICAgICBmaWx0ZXJlZC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgIGFzc2lnbihmaWx0ZXJlZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNTZXQobW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgY2xvbmVkID0gbmV3IFNldChtb2RlbFZhbHVlKTtcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICBjbG9uZWQuYWRkKGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xvbmVkLmRlbGV0ZShlbGVtZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2lnbihjbG9uZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNzaWduKGdldENoZWNrYm94VmFsdWUoZWwsIGNoZWNrZWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgLy8gc2V0IGluaXRpYWwgY2hlY2tlZCBvbiBtb3VudCB0byB3YWl0IGZvciB0cnVlLXZhbHVlL2ZhbHNlLXZhbHVlXG4gIG1vdW50ZWQ6IHNldENoZWNrZWQsXG4gIGJlZm9yZVVwZGF0ZShlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgc2V0Q2hlY2tlZChlbCwgYmluZGluZywgdm5vZGUpO1xuICB9XG59O1xuZnVuY3Rpb24gc2V0Q2hlY2tlZChlbCwgeyB2YWx1ZSwgb2xkVmFsdWUgfSwgdm5vZGUpIHtcbiAgZWwuX21vZGVsVmFsdWUgPSB2YWx1ZTtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgZWwuY2hlY2tlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpID4gLTE7XG4gIH0gZWxzZSBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgZWwuY2hlY2tlZCA9IHZhbHVlLmhhcyh2bm9kZS5wcm9wcy52YWx1ZSk7XG4gIH0gZWxzZSBpZiAodmFsdWUgIT09IG9sZFZhbHVlKSB7XG4gICAgZWwuY2hlY2tlZCA9IGxvb3NlRXF1YWwodmFsdWUsIGdldENoZWNrYm94VmFsdWUoZWwsIHRydWUpKTtcbiAgfVxufVxuY29uc3Qgdk1vZGVsUmFkaW8gPSB7XG4gIGNyZWF0ZWQoZWwsIHsgdmFsdWUgfSwgdm5vZGUpIHtcbiAgICBlbC5jaGVja2VkID0gbG9vc2VFcXVhbCh2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpO1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBlbFthc3NpZ25LZXldKGdldFZhbHVlKGVsKSk7XG4gICAgfSk7XG4gIH0sXG4gIGJlZm9yZVVwZGF0ZShlbCwgeyB2YWx1ZSwgb2xkVmFsdWUgfSwgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgaWYgKHZhbHVlICE9PSBvbGRWYWx1ZSkge1xuICAgICAgZWwuY2hlY2tlZCA9IGxvb3NlRXF1YWwodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKTtcbiAgICB9XG4gIH1cbn07XG5jb25zdCB2TW9kZWxTZWxlY3QgPSB7XG4gIC8vIDxzZWxlY3QgbXVsdGlwbGU+IHZhbHVlIG5lZWQgdG8gYmUgZGVlcCB0cmF2ZXJzZWRcbiAgZGVlcDogdHJ1ZSxcbiAgY3JlYXRlZChlbCwgeyB2YWx1ZSwgbW9kaWZpZXJzOiB7IG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgY29uc3QgaXNTZXRNb2RlbCA9IGlzU2V0KHZhbHVlKTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZWxlY3RlZFZhbCA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChlbC5vcHRpb25zLCAobykgPT4gby5zZWxlY3RlZCkubWFwKFxuICAgICAgICAobykgPT4gbnVtYmVyID8gbG9vc2VUb051bWJlcihnZXRWYWx1ZShvKSkgOiBnZXRWYWx1ZShvKVxuICAgICAgKTtcbiAgICAgIGVsW2Fzc2lnbktleV0oXG4gICAgICAgIGVsLm11bHRpcGxlID8gaXNTZXRNb2RlbCA/IG5ldyBTZXQoc2VsZWN0ZWRWYWwpIDogc2VsZWN0ZWRWYWwgOiBzZWxlY3RlZFZhbFswXVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gIH0sXG4gIC8vIHNldCB2YWx1ZSBpbiBtb3VudGVkICYgdXBkYXRlZCBiZWNhdXNlIDxzZWxlY3Q+IHJlbGllcyBvbiBpdHMgY2hpbGRyZW5cbiAgLy8gPG9wdGlvbj5zLlxuICBtb3VudGVkKGVsLCB7IHZhbHVlIH0pIHtcbiAgICBzZXRTZWxlY3RlZChlbCwgdmFsdWUpO1xuICB9LFxuICBiZWZvcmVVcGRhdGUoZWwsIF9iaW5kaW5nLCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgfSxcbiAgdXBkYXRlZChlbCwgeyB2YWx1ZSB9KSB7XG4gICAgc2V0U2VsZWN0ZWQoZWwsIHZhbHVlKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNldFNlbGVjdGVkKGVsLCB2YWx1ZSkge1xuICBjb25zdCBpc011bHRpcGxlID0gZWwubXVsdGlwbGU7XG4gIGlmIChpc011bHRpcGxlICYmICFpc0FycmF5KHZhbHVlKSAmJiAhaXNTZXQodmFsdWUpKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKFxuICAgICAgYDxzZWxlY3QgbXVsdGlwbGUgdi1tb2RlbD4gZXhwZWN0cyBhbiBBcnJheSBvciBTZXQgdmFsdWUgZm9yIGl0cyBiaW5kaW5nLCBidXQgZ290ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSl9LmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGxldCBpID0gMCwgbCA9IGVsLm9wdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gZWwub3B0aW9uc1tpXTtcbiAgICBjb25zdCBvcHRpb25WYWx1ZSA9IGdldFZhbHVlKG9wdGlvbik7XG4gICAgaWYgKGlzTXVsdGlwbGUpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBsb29zZUluZGV4T2YodmFsdWUsIG9wdGlvblZhbHVlKSA+IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdmFsdWUuaGFzKG9wdGlvblZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7XG4gICAgICAgIGlmIChlbC5zZWxlY3RlZEluZGV4ICE9PSBpKVxuICAgICAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghaXNNdWx0aXBsZSAmJiBlbC5zZWxlY3RlZEluZGV4ICE9PSAtMSkge1xuICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VmFsdWUoZWwpIHtcbiAgcmV0dXJuIFwiX3ZhbHVlXCIgaW4gZWwgPyBlbC5fdmFsdWUgOiBlbC52YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldENoZWNrYm94VmFsdWUoZWwsIGNoZWNrZWQpIHtcbiAgY29uc3Qga2V5ID0gY2hlY2tlZCA/IFwiX3RydWVWYWx1ZVwiIDogXCJfZmFsc2VWYWx1ZVwiO1xuICByZXR1cm4ga2V5IGluIGVsID8gZWxba2V5XSA6IGNoZWNrZWQ7XG59XG5jb25zdCB2TW9kZWxEeW5hbWljID0ge1xuICBjcmVhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBudWxsLCBcImNyZWF0ZWRcIik7XG4gIH0sXG4gIG1vdW50ZWQoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIG51bGwsIFwibW91bnRlZFwiKTtcbiAgfSxcbiAgYmVmb3JlVXBkYXRlKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSwgXCJiZWZvcmVVcGRhdGVcIik7XG4gIH0sXG4gIHVwZGF0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpIHtcbiAgICBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlLCBcInVwZGF0ZWRcIik7XG4gIH1cbn07XG5mdW5jdGlvbiByZXNvbHZlRHluYW1pY01vZGVsKHRhZ05hbWUsIHR5cGUpIHtcbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgY2FzZSBcIlNFTEVDVFwiOlxuICAgICAgcmV0dXJuIHZNb2RlbFNlbGVjdDtcbiAgICBjYXNlIFwiVEVYVEFSRUFcIjpcbiAgICAgIHJldHVybiB2TW9kZWxUZXh0O1xuICAgIGRlZmF1bHQ6XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgcmV0dXJuIHZNb2RlbENoZWNrYm94O1xuICAgICAgICBjYXNlIFwicmFkaW9cIjpcbiAgICAgICAgICByZXR1cm4gdk1vZGVsUmFkaW87XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHZNb2RlbFRleHQ7XG4gICAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUsIGhvb2spIHtcbiAgY29uc3QgbW9kZWxUb1VzZSA9IHJlc29sdmVEeW5hbWljTW9kZWwoXG4gICAgZWwudGFnTmFtZSxcbiAgICB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy50eXBlXG4gICk7XG4gIGNvbnN0IGZuID0gbW9kZWxUb1VzZVtob29rXTtcbiAgZm4gJiYgZm4oZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpO1xufVxuZnVuY3Rpb24gaW5pdFZNb2RlbEZvclNTUigpIHtcbiAgdk1vZGVsVGV4dC5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0pID0+ICh7IHZhbHVlIH0pO1xuICB2TW9kZWxSYWRpby5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0sIHZub2RlKSA9PiB7XG4gICAgaWYgKHZub2RlLnByb3BzICYmIGxvb3NlRXF1YWwodm5vZGUucHJvcHMudmFsdWUsIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgIH1cbiAgfTtcbiAgdk1vZGVsQ2hlY2tib3guZ2V0U1NSUHJvcHMgPSAoeyB2YWx1ZSB9LCB2bm9kZSkgPT4ge1xuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKHZub2RlLnByb3BzICYmIGxvb3NlSW5kZXhPZih2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgICBpZiAodm5vZGUucHJvcHMgJiYgdmFsdWUuaGFzKHZub2RlLnByb3BzLnZhbHVlKSkge1xuICAgICAgICByZXR1cm4geyBjaGVja2VkOiB0cnVlIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgIH1cbiAgfTtcbiAgdk1vZGVsRHluYW1pYy5nZXRTU1JQcm9wcyA9IChiaW5kaW5nLCB2bm9kZSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygdm5vZGUudHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb2RlbFRvVXNlID0gcmVzb2x2ZUR5bmFtaWNNb2RlbChcbiAgICAgIC8vIHJlc29sdmVEeW5hbWljTW9kZWwgZXhwZWN0cyBhbiB1cHBlcmNhc2UgdGFnIG5hbWUsIGJ1dCB2bm9kZS50eXBlIGlzIGxvd2VyY2FzZVxuICAgICAgdm5vZGUudHlwZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMudHlwZVxuICAgICk7XG4gICAgaWYgKG1vZGVsVG9Vc2UuZ2V0U1NSUHJvcHMpIHtcbiAgICAgIHJldHVybiBtb2RlbFRvVXNlLmdldFNTUlByb3BzKGJpbmRpbmcsIHZub2RlKTtcbiAgICB9XG4gIH07XG59XG5cbmNvbnN0IHN5c3RlbU1vZGlmaWVycyA9IFtcImN0cmxcIiwgXCJzaGlmdFwiLCBcImFsdFwiLCBcIm1ldGFcIl07XG5jb25zdCBtb2RpZmllckd1YXJkcyA9IHtcbiAgc3RvcDogKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCksXG4gIHByZXZlbnQ6IChlKSA9PiBlLnByZXZlbnREZWZhdWx0KCksXG4gIHNlbGY6IChlKSA9PiBlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0LFxuICBjdHJsOiAoZSkgPT4gIWUuY3RybEtleSxcbiAgc2hpZnQ6IChlKSA9PiAhZS5zaGlmdEtleSxcbiAgYWx0OiAoZSkgPT4gIWUuYWx0S2V5LFxuICBtZXRhOiAoZSkgPT4gIWUubWV0YUtleSxcbiAgbGVmdDogKGUpID0+IFwiYnV0dG9uXCIgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMCxcbiAgbWlkZGxlOiAoZSkgPT4gXCJidXR0b25cIiBpbiBlICYmIGUuYnV0dG9uICE9PSAxLFxuICByaWdodDogKGUpID0+IFwiYnV0dG9uXCIgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMixcbiAgZXhhY3Q6IChlLCBtb2RpZmllcnMpID0+IHN5c3RlbU1vZGlmaWVycy5zb21lKChtKSA9PiBlW2Ake219S2V5YF0gJiYgIW1vZGlmaWVycy5pbmNsdWRlcyhtKSlcbn07XG5jb25zdCB3aXRoTW9kaWZpZXJzID0gKGZuLCBtb2RpZmllcnMpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBmbi5fd2l0aE1vZHMgfHwgKGZuLl93aXRoTW9kcyA9IHt9KTtcbiAgY29uc3QgY2FjaGVLZXkgPSBtb2RpZmllcnMuam9pbihcIi5cIik7XG4gIHJldHVybiBjYWNoZVtjYWNoZUtleV0gfHwgKGNhY2hlW2NhY2hlS2V5XSA9IChldmVudCwgLi4uYXJncykgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kaWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBndWFyZCA9IG1vZGlmaWVyR3VhcmRzW21vZGlmaWVyc1tpXV07XG4gICAgICBpZiAoZ3VhcmQgJiYgZ3VhcmQoZXZlbnQsIG1vZGlmaWVycykpXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGZuKGV2ZW50LCAuLi5hcmdzKTtcbiAgfSk7XG59O1xuY29uc3Qga2V5TmFtZXMgPSB7XG4gIGVzYzogXCJlc2NhcGVcIixcbiAgc3BhY2U6IFwiIFwiLFxuICB1cDogXCJhcnJvdy11cFwiLFxuICBsZWZ0OiBcImFycm93LWxlZnRcIixcbiAgcmlnaHQ6IFwiYXJyb3ctcmlnaHRcIixcbiAgZG93bjogXCJhcnJvdy1kb3duXCIsXG4gIGRlbGV0ZTogXCJiYWNrc3BhY2VcIlxufTtcbmNvbnN0IHdpdGhLZXlzID0gKGZuLCBtb2RpZmllcnMpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBmbi5fd2l0aEtleXMgfHwgKGZuLl93aXRoS2V5cyA9IHt9KTtcbiAgY29uc3QgY2FjaGVLZXkgPSBtb2RpZmllcnMuam9pbihcIi5cIik7XG4gIHJldHVybiBjYWNoZVtjYWNoZUtleV0gfHwgKGNhY2hlW2NhY2hlS2V5XSA9IChldmVudCkgPT4ge1xuICAgIGlmICghKFwia2V5XCIgaW4gZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50S2V5ID0gaHlwaGVuYXRlKGV2ZW50LmtleSk7XG4gICAgaWYgKG1vZGlmaWVycy5zb21lKChrKSA9PiBrID09PSBldmVudEtleSB8fCBrZXlOYW1lc1trXSA9PT0gZXZlbnRLZXkpKSB7XG4gICAgICByZXR1cm4gZm4oZXZlbnQpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCByZW5kZXJlck9wdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKHsgcGF0Y2hQcm9wIH0sIG5vZGVPcHMpO1xubGV0IHJlbmRlcmVyO1xubGV0IGVuYWJsZWRIeWRyYXRpb24gPSBmYWxzZTtcbmZ1bmN0aW9uIGVuc3VyZVJlbmRlcmVyKCkge1xuICByZXR1cm4gcmVuZGVyZXIgfHwgKHJlbmRlcmVyID0gY3JlYXRlUmVuZGVyZXIocmVuZGVyZXJPcHRpb25zKSk7XG59XG5mdW5jdGlvbiBlbnN1cmVIeWRyYXRpb25SZW5kZXJlcigpIHtcbiAgcmVuZGVyZXIgPSBlbmFibGVkSHlkcmF0aW9uID8gcmVuZGVyZXIgOiBjcmVhdGVIeWRyYXRpb25SZW5kZXJlcihyZW5kZXJlck9wdGlvbnMpO1xuICBlbmFibGVkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgcmV0dXJuIHJlbmRlcmVyO1xufVxuY29uc3QgcmVuZGVyID0gKC4uLmFyZ3MpID0+IHtcbiAgZW5zdXJlUmVuZGVyZXIoKS5yZW5kZXIoLi4uYXJncyk7XG59O1xuY29uc3QgaHlkcmF0ZSA9ICguLi5hcmdzKSA9PiB7XG4gIGVuc3VyZUh5ZHJhdGlvblJlbmRlcmVyKCkuaHlkcmF0ZSguLi5hcmdzKTtcbn07XG5jb25zdCBjcmVhdGVBcHAgPSAoLi4uYXJncykgPT4ge1xuICBjb25zdCBhcHAgPSBlbnN1cmVSZW5kZXJlcigpLmNyZWF0ZUFwcCguLi5hcmdzKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpbmplY3ROYXRpdmVUYWdDaGVjayhhcHApO1xuICAgIGluamVjdENvbXBpbGVyT3B0aW9uc0NoZWNrKGFwcCk7XG4gIH1cbiAgY29uc3QgeyBtb3VudCB9ID0gYXBwO1xuICBhcHAubW91bnQgPSAoY29udGFpbmVyT3JTZWxlY3RvcikgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5vcm1hbGl6ZUNvbnRhaW5lcihjb250YWluZXJPclNlbGVjdG9yKTtcbiAgICBpZiAoIWNvbnRhaW5lcilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBjb21wb25lbnQgPSBhcHAuX2NvbXBvbmVudDtcbiAgICBpZiAoIWlzRnVuY3Rpb24oY29tcG9uZW50KSAmJiAhY29tcG9uZW50LnJlbmRlciAmJiAhY29tcG9uZW50LnRlbXBsYXRlKSB7XG4gICAgICBjb21wb25lbnQudGVtcGxhdGUgPSBjb250YWluZXIuaW5uZXJIVE1MO1xuICAgIH1cbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICBjb25zdCBwcm94eSA9IG1vdW50KGNvbnRhaW5lciwgZmFsc2UsIHJlc29sdmVSb290TmFtZXNwYWNlKGNvbnRhaW5lcikpO1xuICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQXR0cmlidXRlKFwidi1jbG9ha1wiKTtcbiAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLXYtYXBwXCIsIFwiXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcHJveHk7XG4gIH07XG4gIHJldHVybiBhcHA7XG59O1xuY29uc3QgY3JlYXRlU1NSQXBwID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgYXBwID0gZW5zdXJlSHlkcmF0aW9uUmVuZGVyZXIoKS5jcmVhdGVBcHAoLi4uYXJncyk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaW5qZWN0TmF0aXZlVGFnQ2hlY2soYXBwKTtcbiAgICBpbmplY3RDb21waWxlck9wdGlvbnNDaGVjayhhcHApO1xuICB9XG4gIGNvbnN0IHsgbW91bnQgfSA9IGFwcDtcbiAgYXBwLm1vdW50ID0gKGNvbnRhaW5lck9yU2VsZWN0b3IpID0+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSBub3JtYWxpemVDb250YWluZXIoY29udGFpbmVyT3JTZWxlY3Rvcik7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIG1vdW50KGNvbnRhaW5lciwgdHJ1ZSwgcmVzb2x2ZVJvb3ROYW1lc3BhY2UoY29udGFpbmVyKSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gYXBwO1xufTtcbmZ1bmN0aW9uIHJlc29sdmVSb290TmFtZXNwYWNlKGNvbnRhaW5lcikge1xuICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkge1xuICAgIHJldHVybiBcInN2Z1wiO1xuICB9XG4gIGlmICh0eXBlb2YgTWF0aE1MRWxlbWVudCA9PT0gXCJmdW5jdGlvblwiICYmIGNvbnRhaW5lciBpbnN0YW5jZW9mIE1hdGhNTEVsZW1lbnQpIHtcbiAgICByZXR1cm4gXCJtYXRobWxcIjtcbiAgfVxufVxuZnVuY3Rpb24gaW5qZWN0TmF0aXZlVGFnQ2hlY2soYXBwKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcHAuY29uZmlnLCBcImlzTmF0aXZlVGFnXCIsIHtcbiAgICB2YWx1ZTogKHRhZykgPT4gaXNIVE1MVGFnKHRhZykgfHwgaXNTVkdUYWcodGFnKSB8fCBpc01hdGhNTFRhZyh0YWcpLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbn1cbmZ1bmN0aW9uIGluamVjdENvbXBpbGVyT3B0aW9uc0NoZWNrKGFwcCkge1xuICBpZiAoaXNSdW50aW1lT25seSgpKSB7XG4gICAgY29uc3QgaXNDdXN0b21FbGVtZW50ID0gYXBwLmNvbmZpZy5pc0N1c3RvbUVsZW1lbnQ7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwcC5jb25maWcsIFwiaXNDdXN0b21FbGVtZW50XCIsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGlzQ3VzdG9tRWxlbWVudDtcbiAgICAgIH0sXG4gICAgICBzZXQoKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYFRoZSBcXGBpc0N1c3RvbUVsZW1lbnRcXGAgY29uZmlnIG9wdGlvbiBpcyBkZXByZWNhdGVkLiBVc2UgXFxgY29tcGlsZXJPcHRpb25zLmlzQ3VzdG9tRWxlbWVudFxcYCBpbnN0ZWFkLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBjb21waWxlck9wdGlvbnMgPSBhcHAuY29uZmlnLmNvbXBpbGVyT3B0aW9ucztcbiAgICBjb25zdCBtc2cgPSBgVGhlIFxcYGNvbXBpbGVyT3B0aW9uc1xcYCBjb25maWcgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgYSBidWlsZCBvZiBWdWUuanMgdGhhdCBpbmNsdWRlcyB0aGUgcnVudGltZSBjb21waWxlciAoYWthIFwiZnVsbCBidWlsZFwiKS4gU2luY2UgeW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkLCBcXGBjb21waWxlck9wdGlvbnNcXGAgbXVzdCBiZSBwYXNzZWQgdG8gXFxgQHZ1ZS9jb21waWxlci1kb21cXGAgaW4gdGhlIGJ1aWxkIHNldHVwIGluc3RlYWQuXG4tIEZvciB2dWUtbG9hZGVyOiBwYXNzIGl0IHZpYSB2dWUtbG9hZGVyJ3MgXFxgY29tcGlsZXJPcHRpb25zXFxgIGxvYWRlciBvcHRpb24uXG4tIEZvciB2dWUtY2xpOiBzZWUgaHR0cHM6Ly9jbGkudnVlanMub3JnL2d1aWRlL3dlYnBhY2suaHRtbCNtb2RpZnlpbmctb3B0aW9ucy1vZi1hLWxvYWRlclxuLSBGb3Igdml0ZTogcGFzcyBpdCB2aWEgQHZpdGVqcy9wbHVnaW4tdnVlIG9wdGlvbnMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdml0ZWpzL3ZpdGUtcGx1Z2luLXZ1ZS90cmVlL21haW4vcGFja2FnZXMvcGx1Z2luLXZ1ZSNleGFtcGxlLWZvci1wYXNzaW5nLW9wdGlvbnMtdG8tdnVlY29tcGlsZXItc2ZjYDtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwLmNvbmZpZywgXCJjb21waWxlck9wdGlvbnNcIiwge1xuICAgICAgZ2V0KCkge1xuICAgICAgICB3YXJuKG1zZyk7XG4gICAgICAgIHJldHVybiBjb21waWxlck9wdGlvbnM7XG4gICAgICB9LFxuICAgICAgc2V0KCkge1xuICAgICAgICB3YXJuKG1zZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKGlzU3RyaW5nKGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCByZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbnRhaW5lcik7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXJlcykge1xuICAgICAgd2FybihcbiAgICAgICAgYEZhaWxlZCB0byBtb3VudCBhcHA6IG1vdW50IHRhcmdldCBzZWxlY3RvciBcIiR7Y29udGFpbmVyfVwiIHJldHVybmVkIG51bGwuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3aW5kb3cuU2hhZG93Um9vdCAmJiBjb250YWluZXIgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCAmJiBjb250YWluZXIubW9kZSA9PT0gXCJjbG9zZWRcIikge1xuICAgIHdhcm4oXG4gICAgICBgbW91bnRpbmcgb24gYSBTaGFkb3dSb290IHdpdGggXFxge21vZGU6IFwiY2xvc2VkXCJ9XFxgIG1heSBsZWFkIHRvIHVucHJlZGljdGFibGUgYnVnc2BcbiAgICApO1xuICB9XG4gIHJldHVybiBjb250YWluZXI7XG59XG5sZXQgc3NyRGlyZWN0aXZlSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbmNvbnN0IGluaXREaXJlY3RpdmVzRm9yU1NSID0gKCkgPT4ge1xuICBpZiAoIXNzckRpcmVjdGl2ZUluaXRpYWxpemVkKSB7XG4gICAgc3NyRGlyZWN0aXZlSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIGluaXRWTW9kZWxGb3JTU1IoKTtcbiAgICBpbml0VlNob3dGb3JTU1IoKTtcbiAgfVxufSA7XG5cbmV4cG9ydCB7IFRyYW5zaXRpb24sIFRyYW5zaXRpb25Hcm91cCwgVnVlRWxlbWVudCwgY3JlYXRlQXBwLCBjcmVhdGVTU1JBcHAsIGRlZmluZUN1c3RvbUVsZW1lbnQsIGRlZmluZVNTUkN1c3RvbUVsZW1lbnQsIGh5ZHJhdGUsIGluaXREaXJlY3RpdmVzRm9yU1NSLCByZW5kZXIsIHVzZUNzc01vZHVsZSwgdXNlQ3NzVmFycywgdk1vZGVsQ2hlY2tib3gsIHZNb2RlbER5bmFtaWMsIHZNb2RlbFJhZGlvLCB2TW9kZWxTZWxlY3QsIHZNb2RlbFRleHQsIHZTaG93LCB3aXRoS2V5cywgd2l0aE1vZGlmaWVycyB9O1xuIiwiLyoqXG4qIHZ1ZSB2My40LjEwXG4qIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzXG4qIEBsaWNlbnNlIE1JVFxuKiovXG5pbXBvcnQgeyBpbml0Q3VzdG9tRm9ybWF0dGVyLCB3YXJuIH0gZnJvbSAnQHZ1ZS9ydW50aW1lLWRvbSc7XG5leHBvcnQgKiBmcm9tICdAdnVlL3J1bnRpbWUtZG9tJztcblxuZnVuY3Rpb24gaW5pdERldigpIHtcbiAge1xuICAgIGluaXRDdXN0b21Gb3JtYXR0ZXIoKTtcbiAgfVxufVxuXG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICBpbml0RGV2KCk7XG59XG5jb25zdCBjb21waWxlID0gKCkgPT4ge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4oXG4gICAgICBgUnVudGltZSBjb21waWxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnVpbGQgb2YgVnVlLmAgKyAoYCBDb25maWd1cmUgeW91ciBidW5kbGVyIHRvIGFsaWFzIFwidnVlXCIgdG8gXCJ2dWUvZGlzdC92dWUuZXNtLWJ1bmRsZXIuanNcIi5gIClcbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgeyBjb21waWxlIH07XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNhbGVuZGFyXG4gIC5kaXRvLWNhbGVuZGFyLXBvcHVwXG4gICAgLmRpdG8tY2FsZW5kYXItaW5uZXJcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWlmPVwiY3VycmVudE1vZGUgPT09ICdkYXknXCJcbiAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYuZGl0by1jYWxlbmRhci1zdGVwLW1vbnRoKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcE1vbnRoKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW5cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QteWVhcihcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2V0TW9kZSgneWVhcicpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSwgeyB5ZWFyOiB0cnVlIH0pIH19XG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LW1vbnRoKFxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZXRNb2RlKCdtb250aCcpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSwgeyBtb250aDogdHJ1ZSB9KSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQuZGl0by1jYWxlbmRhci1zdGVwLW1vbnRoKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcE1vbnRoKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dC5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci13ZWVrZGF5c1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJ3ZWVrZGF5IGluIHdlZWtkYXlOYW1lc1wiXG4gICAgICAgICAgICApIHt7IHdlZWtkYXkuc2hvcnQgfX1cbiAgICAgICAgICAuZGl0by1jYWxlbmRhci1kYXRlc1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJkYXRlIGluIGRhdGVSYW5nZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImRhdGUuc3RhdGUgJiYgYGRpdG8tY2FsZW5kYXItaXRlbS0ke2RhdGUuc3RhdGV9YFwiXG4gICAgICAgICAgICAgIEBjbGljaz1cImRhdGUuc3RhdGUgIT09ICdkaXNhYmxlZCcgJiYgc2VsZWN0RGF0ZShkYXRlLmRhdGUpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZS50ZXh0IH19XG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWZvb3RlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3Qtbm93KFxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICA6dGl0bGU9XCJkYXRlVG9TdHJpbmcobmV3IERhdGUoKSlcIlxuICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0RGF0ZShuZXcgRGF0ZSgpKVwiXG4gICAgICAgICAgKVxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtZWxzZS1pZj1cImN1cnJlbnRNb2RlID09PSAnbW9udGgnXCJcbiAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW5cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QteWVhcihcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2V0TW9kZSgneWVhcicpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSwgeyB5ZWFyOiB0cnVlIH0pIH19XG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci1tb250aHNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwiKG1vbnRoLCBpbmRleCkgaW4gbW9udGhOYW1lc1wiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImdldE1vbnRoQ2xhc3MoaW5kZXgpXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0TW9udGgoaW5kZXgpXCJcbiAgICAgICAgICAgICkge3sgbW9udGguc2hvcnQgfX1cbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWVsc2UtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ3llYXInXCJcbiAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBEZWNhZGUoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgc3BhbiB7eyBkZWNhZGVUb1N0cmluZyhjdXJyZW50VmFsdWUpIH19XG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBEZWNhZGUoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItYm9keVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLXllYXJzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cInllYXIgaW4geWVhclJhbmdlXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiZ2V0WWVhckNsYXNzKHllYXIpXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0WWVhcih5ZWFyKVwiXG4gICAgICAgICAgICApIHt7IHllYXIgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBkZXNjcmliZURhdGUsIGFsdGVyRGF0ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAnc2VsZWN0J10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZGlzYWJsZWREYXRlOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIG1vZGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGF5JyB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICBjb25zdCB7IHdlZWtkYXlOYW1lcywgbW9udGhOYW1lcyB9ID0gZ2V0TG9jYWxlTmFtZXModGhpcy5sb2NhbGUpXG4gICAgcmV0dXJuIHtcbiAgICAgIHdlZWtkYXlOYW1lcyxcbiAgICAgIG1vbnRoTmFtZXMsXG4gICAgICBkYXRlUmFuZ2U6IFtdLFxuICAgICAgeWVhclJhbmdlOiBbXSxcbiAgICAgIGN1cnJlbnRWYWx1ZTogKFxuICAgICAgICB0aGlzLm1vZGVsVmFsdWUgfHxcbiAgICAgICAgLy8gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHVzZSBjdXJyZW50IGRhdGUgYnV0IGNsZWFyIHRpbWUgZmllbGRzOlxuICAgICAgICBhbHRlckRhdGUobmV3IERhdGUoKSwgeyBob3VyOiAwLCBtaW51dGU6IDAsIHNlY29uZDogMCwgbWlsbGlzZWNvbmQ6IDAgfSlcbiAgICAgICksXG4gICAgICBjdXJyZW50TW9kZTogdGhpcy5tb2RlXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0byB8fCBuZXcgRGF0ZSgpXG4gICAgICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGRpc2FibGVkRGF0ZTogJ3VwZGF0ZURhdGVSYW5nZScsXG5cbiAgICBtb2RlKG1vZGUpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vZGUgPSBtb2RlXG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRNb250aENsYXNzKG1vbnRoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSc6IChcbiAgICAgICAgICB0aGlzLm1vZGVsVmFsdWUgJiZcbiAgICAgICAgICBtb250aCA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldE1vbnRoKCkgJiZcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgICApLFxuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQnOiBtb250aCA9PT0gdGhpcy5jdXJyZW50VmFsdWUuZ2V0TW9udGgoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRZZWFyQ2xhc3MoeWVhcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUnOiAoXG4gICAgICAgICAgdGhpcy5tb2RlbFZhbHVlICYmIHllYXIgPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICAgICksXG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCc6IHllYXIgPT09IHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0RGF0ZShvdmVycmlkZXMsIHVwZGF0ZSA9IGZhbHNlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGFsdGVyRGF0ZSh0aGlzLmN1cnJlbnRWYWx1ZSwgb3ZlcnJpZGVzKVxuICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHRoaXMuY3VycmVudFZhbHVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdGVwRGVjYWRlKHN0ZXApIHtcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIHllYXI6IHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBzdGVwICogMTBcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNldE1vZGUobW9kZSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9kZSA9IG1vZGVcbiAgICB9LFxuXG4gICAgc3RlcE1vbnRoKHN0ZXApIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBjb25zdCB7IHllYXIsIG1vbnRoIH0gPSB0aGlzLmdldFllYXJNb250aChcbiAgICAgICAgY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpICsgc3RlcFxuICAgICAgKVxuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgbW9udGgsXG4gICAgICAgIGRheTogTWF0aC5taW4oXG4gICAgICAgICAgdGhpcy5nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCksXG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUuZ2V0RGF0ZSgpXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHN0ZXBZZWFyKHN0ZXApIHtcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIHllYXI6IHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBzdGVwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzZWxlY3REYXRlKGRhdGUpIHtcbiAgICAgIHRoaXMuc2V0RGF0ZShkZXNjcmliZURhdGUoZGF0ZSksIHRydWUpXG4gICAgICB0aGlzLiRlbWl0KCdzZWxlY3QnKVxuICAgIH0sXG5cbiAgICBzZWxlY3RNb250aChtb250aCkge1xuICAgICAgdGhpcy5zZXRNb2RlKCdkYXknKVxuICAgICAgLy8gU2V0IGRheSB0byAxIHRvIGF2b2lkIHNlbGVjdGluZyBhIGRhdGUgdGhhdCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZVxuICAgICAgLy8gbmV3IG1vbnRoLCBlLmcuIEZlYiAzMSAtPiBNYXIgMy5cbiAgICAgIHRoaXMuc2V0RGF0ZSh7IG1vbnRoLCBkYXk6IDEgfSwgdHJ1ZSlcbiAgICB9LFxuXG4gICAgc2VsZWN0WWVhcih5ZWFyKSB7XG4gICAgICB0aGlzLnNldE1vZGUoJ21vbnRoJylcbiAgICAgIHRoaXMuc2V0RGF0ZSh7IHllYXIgfSwgdHJ1ZSlcbiAgICB9LFxuXG4gICAgZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICBpZiAobW9udGggPiAxMSkge1xuICAgICAgICB5ZWFyKytcbiAgICAgICAgbW9udGggPSAwXG4gICAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMCkge1xuICAgICAgICB5ZWFyLS1cbiAgICAgICAgbW9udGggPSAxMVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgeWVhciwgbW9udGggfVxuICAgIH0sXG5cbiAgICBkYXRlVG9TdHJpbmcoXG4gICAgICBkYXRlLFxuICAgICAgeyB5ZWFyLCBtb250aCwgZGF5IH0gPSB7IHllYXI6IHRydWUsIG1vbnRoOiB0cnVlLCBkYXk6IHRydWUgfVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcodGhpcy5sb2NhbGUsIHtcbiAgICAgICAgeWVhcjogeWVhciAmJiAnbnVtZXJpYycsXG4gICAgICAgIG1vbnRoOiBtb250aCAmJiAnbG9uZycsXG4gICAgICAgIGRheTogZGF5ICYmICdudW1lcmljJ1xuICAgICAgfSlcbiAgICB9LFxuXG4gICAgZGVjYWRlVG9TdHJpbmcoZGF0ZSkge1xuICAgICAgY29uc3QgeWVhciA9IHRoaXMuZ2V0Rmlyc3RZZWFyT2ZEZWNhZGUoZGF0ZS5nZXRGdWxsWWVhcigpKVxuICAgICAgcmV0dXJuIGAke3llYXJ9IOKAkyAke3llYXIgKyA5fWBcbiAgICB9LFxuXG4gICAgZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApLmdldERhdGUoKVxuICAgIH0sXG5cbiAgICBnZXRGaXJzdFllYXJPZkRlY2FkZSh5ZWFyKSB7XG4gICAgICBjb25zdCB5ZWFyU3RyID0geWVhci50b1N0cmluZygpXG4gICAgICByZXR1cm4gK2Ake3llYXJTdHIuc2xpY2UoMCwgLTEpfTBgXG4gICAgfSxcblxuICAgIG5hdmlnYXRlKHsgc3RlcCwgZW50ZXIsIG1vZGUgPSB0aGlzLmN1cnJlbnRNb2RlLCB1cGRhdGUgPSBmYWxzZSB9KSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgaWYgKHN0ZXApIHtcbiAgICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7IGRheTogY3VycmVudFZhbHVlLmdldERhdGUoKSArIHN0ZXAgfSwgdXBkYXRlKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICB0aGlzLnNldERhdGUoeyBtb250aDogY3VycmVudFZhbHVlLmdldE1vbnRoKCkgKyBzdGVwIH0sIHVwZGF0ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICB0aGlzLnNldERhdGUoeyB5ZWFyOiBjdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSArIHN0ZXAgfSwgdXBkYXRlKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChlbnRlcikge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY3VycmVudE1vZGUpIHtcbiAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlKGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCdkYXknKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnbW9udGgnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB1cGRhdGVEYXRlUmFuZ2UoKSB7XG4gICAgICB0aGlzLmRhdGVSYW5nZSA9IFtdXG4gICAgICB0aGlzLnllYXJSYW5nZSA9IFtdXG5cbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBjb25zdCB5ZWFyID0gY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgIGNvbnN0IG1vbnRoID0gY3VycmVudFZhbHVlLmdldE1vbnRoKClcbiAgICAgIGNvbnN0IHN0YXJ0WWVhciA9IHRoaXMuZ2V0Rmlyc3RZZWFyT2ZEZWNhZGUoeWVhcilcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICB0aGlzLnllYXJSYW5nZS5wdXNoKHN0YXJ0WWVhciArIGkpXG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyTW9udGhGaXJzdERheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKVxuICAgICAgbGV0IGZpcnN0RGF5V2VlayA9IGN1cnJNb250aEZpcnN0RGF5LmdldERheSgpICsgMVxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA9PT0gMCkge1xuICAgICAgICBmaXJzdERheVdlZWsgPSA3XG4gICAgICB9XG4gICAgICBjb25zdCBudW1EYXlzID0gdGhpcy5nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aClcbiAgICAgIGlmIChmaXJzdERheVdlZWsgPiAxKSB7XG4gICAgICAgIGNvbnN0IHByZXZNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSlcbiAgICAgICAgY29uc3QgcHJldk1vbnRoTnVtRGF5cyA9IHRoaXMuZ2V0RGF5c0luTW9udGgoXG4gICAgICAgICAgcHJldk1vbnRoLnllYXIsXG4gICAgICAgICAgcHJldk1vbnRoLm1vbnRoXG4gICAgICAgIClcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBmaXJzdERheVdlZWs7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRheSA9IHByZXZNb250aE51bURheXMgLSBmaXJzdERheVdlZWsgKyBpICsgMVxuICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShwcmV2TW9udGgueWVhciwgcHJldk1vbnRoLm1vbnRoLCBkYXkpXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgICB0ZXh0OiBkYXksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgc3RhdGU6IHRoaXMuZGlzYWJsZWREYXRlKGRhdGUpID8gJ2Rpc2FibGVkJyA6ICdncmF5J1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbnVtRGF5czsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgaSlcbiAgICAgICAgY29uc3QgaXNEYXkgPSBkYXRlID0+IChcbiAgICAgICAgICBkYXRlICYmXG4gICAgICAgICAgZGF0ZS5nZXREYXRlKCkgPT09IGkgJiZcbiAgICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IHllYXIgJiZcbiAgICAgICAgICBkYXRlLmdldE1vbnRoKCkgPT09IG1vbnRoXG4gICAgICAgIClcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBpc0RheSh0aGlzLm1vZGVsVmFsdWUpXG4gICAgICAgICAgPyAnYWN0aXZlJ1xuICAgICAgICAgIDogaXNEYXkobm93KVxuICAgICAgICAgICAgPyAndG9kYXknXG4gICAgICAgICAgICA6IHRoaXMuZGlzYWJsZWREYXRlKGRhdGUpXG4gICAgICAgICAgICAgID8gJ2Rpc2FibGVkJ1xuICAgICAgICAgICAgICA6IGlzRGF5KGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICAgICAgICA/ICdjdXJyZW50J1xuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgc3RhdGVcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dE1vbnRoTmVlZCA9IDQyIC0gdGhpcy5kYXRlUmFuZ2UubGVuZ3RoXG4gICAgICBpZiAobmV4dE1vbnRoTmVlZCA+IDApIHtcbiAgICAgICAgY29uc3QgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuZXh0TW9udGhOZWVkOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgaSlcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZGlzYWJsZWREYXRlKGRhdGUpID8gJ2Rpc2FibGVkJyA6ICdncmF5J1xuICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgICAgdGV4dDogaSxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY29uc3QgbG9jYWxlTmFtZXMgPSB7fVxuXG4vLyBDYWxsaW5nIGB0b0xvY2FsZVN0cmluZygpYCB0aGlzIG11Y2ggYXBwZWFycyB0byBiZSBleHBlbnNpdmUsIHNvIGNhY2hlIGl0OlxuZnVuY3Rpb24gZ2V0TG9jYWxlTmFtZXMobG9jYWxlKSB7XG4gIGxldCBuYW1lcyA9IGxvY2FsZU5hbWVzW2xvY2FsZV1cbiAgaWYgKCFuYW1lcykge1xuICAgIGNvbnN0IHdlZWtkYXlOYW1lcyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwLCAwLCBpKVxuICAgICAgd2Vla2RheU5hbWVzLnB1c2goe1xuICAgICAgICBsb25nOiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyB3ZWVrZGF5OiAnbG9uZycgfSksXG4gICAgICAgIHNob3J0OiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyB3ZWVrZGF5OiAnc2hvcnQnIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBtb250aE5hbWVzID0gW11cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAxMjsgaSsrKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCwgaSwgMClcbiAgICAgIG1vbnRoTmFtZXMucHVzaCh7XG4gICAgICAgIGxvbmc6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IG1vbnRoOiAnbG9uZycgfSksXG4gICAgICAgIHNob3J0OiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyBtb250aDogJ3Nob3J0JyB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgbmFtZXMgPSBsb2NhbGVOYW1lc1tsb2NhbGVdID0ge1xuICAgICAgd2Vla2RheU5hbWVzLFxuICAgICAgbW9udGhOYW1lc1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmFtZXNcbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNhbGVuZGFyIHtcbiAgbWluLXdpZHRoOiAyNDBweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLmRpdG8tY2FsZW5kYXItcG9wdXAge1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gIGJveC1zaGFkb3c6ICRzaGFkb3ctd2luZG93O1xuICB6LWluZGV4OiAkei1pbmRleC1wb3B1cDtcbn1cblxuLmRpdG8tY2FsZW5kYXItYm9keSB7XG4gIHBhZGRpbmc6IDAgMC41ZW07XG5cbiAgc3BhbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgLyA3KTtcbiAgICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQ7XG4gICAgbGluZS1oZWlnaHQ6IGNhbGMoI3skaW5wdXQtaGVpZ2h0fSAtIDJweCk7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBib3JkZXI6ICRib3JkZXItd2lkdGggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS10b2RheSB7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkICRjb2xvci1hY3RpdmU7XG4gICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSB7XG4gICAgJixcbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgICBjb2xvcjogd2hpdGU7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1kaXNhYmxlZCB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1kaXNhYmxlZCxcbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1ncmF5IHtcbiAgICBjb2xvcjogIzk5OTk5OTtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1tb250aHMsXG4uZGl0by1jYWxlbmRhci15ZWFycyB7XG4gIHNwYW4ge1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgLyA0KTtcbiAgICBtYXJnaW46IDAuNWVtIDA7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3BhbiB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLyA1KTtcbn1cblxuLmRpdG8tY2FsZW5kYXIgYSxcbi5kaXRvLWNhbGVuZGFyLWRhdGVzIHNwYW4sXG4uZGl0by1jYWxlbmRhci1tb250aHMgc3Bhbixcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW4ge1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlciBzcGFuIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuXG4gIGEge1xuICAgIHBhZGRpbmc6IDAgMC4yZW07XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItZGF0ZXMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyLW1vbnRocyBzcGFuOmhvdmVyLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyOm5vdCg6aG92ZXIpIC5kaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCB7XG4gIGJhY2tncm91bmQ6ICRjb2xvci1oaWdobGlnaHQ7XG59XG5cbi5kaXRvLWNhbGVuZGFyLXdlZWtkYXlzIHNwYW4ge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlcixcbi5kaXRvLWNhbGVuZGFyLWZvb3RlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQ7XG4gIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xufVxuXG4uZGl0by1jYWxlbmRhci1mb290ZXIge1xuICBib3JkZXItdG9wOiAkYm9yZGVyLXN0eWxlO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgYm9yZGVyLWJvdHRvbTogJGJvcmRlci1zdHlsZTtcbiAgZGlzcGxheTogZmxleDtcblxuICA+IHNwYW4ge1xuICAgIG1hcmdpbjogYXV0bztcbiAgICBwYWRkaW5nOiAwIDAuNWVtO1xuICB9XG5cbiAgYSB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLXByZXYsXG4uZGl0by1jYWxlbmRhci1zdGVwLW5leHQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiA1JTtcbiAgbWluLXdpZHRoOiAyZW07XG4gIG1heC13aWR0aDogM2VtO1xuXG4gICY6OmFmdGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICByaWdodDogMDtcbiAgICBmb250LXNpemU6IDEuMjVlbTtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLXByZXYge1xuICAmOjphZnRlciB7XG4gICAgY29udGVudDogJ+KAuSc7XG4gIH1cblxuICAmLmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyOjphZnRlciB7XG4gICAgY29udGVudDogJ8KrJztcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zdGVwLW5leHQge1xuICAmOjphZnRlciB7XG4gICAgY29udGVudDogJ+KAuic7XG4gIH1cblxuICAmLmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyOjphZnRlciB7XG4gICAgY29udGVudDogJ8K7JztcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1zZWxlY3Qtbm93IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICdOb3cnO1xuICB9XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudHModGFyZ2V0cywgZXZlbnRzKSB7XG4gIHRhcmdldHMgPVxuICAgIHRhcmdldHMgaW5zdGFuY2VvZiBOb2RlTGlzdFxuICAgICAgPyBBcnJheS5mcm9tKHRhcmdldHMpXG4gICAgICA6IGFzQXJyYXkodGFyZ2V0cylcblxuICBmb3IgKGNvbnN0IFt0eXBlLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhldmVudHMpKSB7XG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZW1vdmUoKSB7XG4gICAgICBmb3IgKGNvbnN0IFt0eXBlLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhldmVudHMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZUV2ZW50cyguLi5ldmVudHMpIHtcbiAgcmV0dXJuIHtcbiAgICByZW1vdmUoKSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgICBldmVudC5yZW1vdmUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2V5KGV2ZW50KSB7XG4gIHJldHVybiB7XG4gICAgMzc6ICdsZWZ0JyxcbiAgICAzODogJ3VwJyxcbiAgICAzOTogJ3JpZ2h0JyxcbiAgICA0MDogJ2Rvd24nLFxuICAgIDEzOiAnZW50ZXInXG4gIH1bZXZlbnQ/LmtleUNvZGVdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KSB7XG4gIGNvbnN0IGtleSA9IGdldEtleShldmVudClcbiAgcmV0dXJuIHtcbiAgICBob3I6IHsgbGVmdDogLTEsIHJpZ2h0OiAxIH1ba2V5XSB8fCAwLFxuICAgIHZlcjogeyB1cDogLTEsIGRvd246IDEgfVtrZXldIHx8IDAsXG4gICAgZW50ZXI6IGtleSA9PT0gJ2VudGVyJ1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXQoY29tcG9uZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IGlzU3RyaW5nKGNvbXBvbmVudC50YXJnZXQpXG4gICAgPyBjb21wb25lbnQuJHJlZnNbY29tcG9uZW50LnRhcmdldF1cbiAgICA6IGNvbXBvbmVudC50YXJnZXRcbiAgcmV0dXJuIHRhcmdldD8uJGVsID8/IHRhcmdldFxufVxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by10cmlnZ2VyLWNvbnRhaW5lclxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtaWY9XCJhbHdheXNTaG93XCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdjbGljaydcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gICAgQGNsaWNrPVwib25DbGlja1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2hvdmVyJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgICBAbW91c2VlbnRlcj1cIm9uSG92ZXIodHJ1ZSlcIlxuICAgIEBtb3VzZWxlYXZlPVwib25Ib3ZlcihmYWxzZSlcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdmb2N1cycgfHwgdHJpZ2dlciA9PT0gJ2Fsd2F5cydcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIFRyYW5zaXRpb24oOm5hbWU9XCJgZGl0by0ke3RyYW5zaXRpb259YFwiKVxuICAgIC5kaXRvLXBvcHVwKFxuICAgICAgdi1pZj1cInRyaWdnZXIgPT09ICdob3ZlcidcIlxuICAgICAgdi1zaG93PVwic2hvd1BvcHVwXCJcbiAgICAgIHJlZj1cInBvcHVwXCJcbiAgICAgIDpjbGFzcz1cInBvcHVwQ2xhc3NcIlxuICAgICAgOnN0eWxlPVwicG9wdXBTdHlsZVwiXG4gICAgICBAbW91c2VlbnRlcj1cIm9uSG92ZXIodHJ1ZSlcIlxuICAgICAgQG1vdXNlbGVhdmU9XCJvbkhvdmVyKGZhbHNlKVwiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cInNob3dQb3B1cFwiXG4gICAgICAgIG5hbWU9XCJwb3B1cFwiXG4gICAgICApXG4gICAgLmRpdG8tcG9wdXAoXG4gICAgICB2LWVsc2VcbiAgICAgIHYtc2hvdz1cInNob3dQb3B1cFwiXG4gICAgICByZWY9XCJwb3B1cFwiXG4gICAgICA6Y2xhc3M9XCJwb3B1cENsYXNzXCJcbiAgICAgIDpzdHlsZT1cInBvcHVwU3R5bGVcIlxuICAgIClcbiAgICAgIHNsb3QoXG4gICAgICAgIHYtaWY9XCJzaG93UG9wdXBcIlxuICAgICAgICBuYW1lPVwicG9wdXBcIlxuICAgICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGh5cGhlbmF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBhZGRFdmVudHMsIGNvbWJpbmVFdmVudHMgfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcbmltcG9ydCB7IGdldFRhcmdldCB9IGZyb20gJy4uL3V0aWxzL3RyaWdnZXInXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOnNob3cnXSxcblxuICBwcm9wczoge1xuICAgIHRyaWdnZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnY2xpY2snIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tJyB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBjdXN0b21DbGFzczogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB6SW5kZXg6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG4gICAga2VlcEluVmlldzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgaGlkZVdoZW5DbGlja091dHNpZGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGFsd2F5c1Nob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb3ZlcjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGhpZGVEZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgcG9wdXBQbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50LFxuICAgICAgZm9jdXNFdmVudHM6IG51bGwsXG4gICAgICBjbG9zZUV2ZW50czogbnVsbCxcbiAgICAgIHBvcHVwRXZlbnRzOiBudWxsLFxuICAgICAgYmx1clRpbWVyOiBudWxsLFxuICAgICAgbW91c2VMZWF2ZVRpbWVyOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdHJpZ2dlckNsYXNzKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tdHJpZ2dlci1kaXNhYmxlZCc6IHRoaXMuZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcG9wdXBDbGFzcygpIHtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSB7XG4gICAgICAgIFtgZGl0by1wb3B1cC0ke2h5cGhlbmF0ZSh0aGlzLnBsYWNlbWVudCl9YF06IHRydWVcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1c3RvbUNsYXNzKSB7XG4gICAgICAgIGNsYXNzZXNbdGhpcy5jdXN0b21DbGFzc10gPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3Nlc1xuICAgIH0sXG5cbiAgICBwb3B1cFN0eWxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuekluZGV4ID8gYHotaW5kZXg6ICR7dGhpcy56SW5kZXh9YCA6ICcnXG4gICAgfSxcblxuICAgIHRyaWdnZXJUYXJnZXQoKSB7XG4gICAgICByZXR1cm4gZ2V0VGFyZ2V0KHRoaXMpXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgc2hvdyhzaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHNob3cgfHwgdGhpcy5hbHdheXNTaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB0aGlzLm9uU2hvd1BvcHVwKHRvKSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICBjb25zdCB7IHRyaWdnZXIsIHBvcHVwIH0gPSB0aGlzLiRyZWZzXG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2ZvY3VzJykge1xuICAgICAgdGhpcy5mb2N1c0V2ZW50cyA9IHRoaXMuYWRkRm9jdXNFdmVudHModGhpcy50cmlnZ2VyVGFyZ2V0ID8/IHRyaWdnZXIpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGlkZVdoZW5DbGlja091dHNpZGUgJiYgIXRoaXMuYWx3YXlzU2hvdykge1xuICAgICAgLy8gVXNlICdtb3VzZXVwJyBpbnN0ZWFkIG9mICdjbGljaycsIHNpbmNlIGNsaWNrIGFwcGVhcnMgdG8gaGFwcGVuIGFmdGVyXG4gICAgICAvLyB0aGUgRE9NIGluc2lkZSBvZiBwb3B1cHMgY291bGQgY2hhbmdlIGluIGEgd2F5IHNvIHRoYXQgdGhlIGNoZWNrXG4gICAgICAvLyBgcG9wdXAuY29udGFpbnMoZXZlbnQudGFyZ2V0KWAgd291bGQgZmFpbDpcbiAgICAgIHRoaXMuY2xvc2VFdmVudHMgPSBhZGRFdmVudHMod2luZG93LCB7XG4gICAgICAgIG1vdXNldXA6IGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCAmJlxuICAgICAgICAgICAgIXBvcHVwLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICAgICAgICF0cmlnZ2VyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICAgICAgICF0aGlzLnRyaWdnZXJUYXJnZXQ/LmNvbnRhaW5zKGV2ZW50LnRhcmdldClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hbHdheXNTaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLnNob3dQb3B1cCA9IHRoaXMuc2hvd1xuICB9LFxuXG4gIHVubW91bnRlZCgpIHtcbiAgICB0aGlzLmZvY3VzRXZlbnRzPy5yZW1vdmUoKVxuICAgIHRoaXMuY2xvc2VFdmVudHM/LnJlbW92ZSgpXG4gICAgdGhpcy5wb3B1cEV2ZW50cz8ucmVtb3ZlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgICBjb25zdCB7IHRyaWdnZXIsIHBvcHVwIH0gPSB0aGlzLiRyZWZzXG4gICAgICBpZiAodGhpcy5zaG93ICYmIHBvcHVwLm9mZnNldFdpZHRoID09PSAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVQb3NpdGlvbigpLCAwKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy50cmlnZ2VyVGFyZ2V0ID8/IHRyaWdnZXJcbiAgICAgIC8vIEFjdHVhbGx5IHJlc2l6ZSB0aGUgcG9wdXAncyBmaXJzdCBjaGlsZCwgc28gdGhleSBjYW4gc2V0IHNpemUgbGltaXRzLlxuICAgICAgY29uc3QgZWwgPSB0aGlzLnRhcmdldCA9PT0gJ3BvcHVwJyA/IHRyaWdnZXIgOiBwb3B1cC5maXJzdEVsZW1lbnRDaGlsZFxuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLnN0eWxlLndpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLndpZHRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJvdW5kcyA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgY29uc3QgdHJpZ2dlckxlZnQgPSBib3VuZHMubGVmdCArIHdpbmRvdy5zY3JvbGxYXG4gICAgICBjb25zdCB0cmlnZ2VyVG9wID0gYm91bmRzLnRvcCArIHdpbmRvdy5zY3JvbGxZXG4gICAgICBjb25zdCB0cmlnZ2VyV2lkdGggPSBib3VuZHMud2lkdGhcbiAgICAgIGNvbnN0IHRyaWdnZXJIZWlnaHQgPSBib3VuZHMuaGVpZ2h0XG4gICAgICBjb25zdCBwb3B1cFdpZHRoID0gcG9wdXAub2Zmc2V0V2lkdGhcbiAgICAgIGNvbnN0IHBvcHVwSGVpZ2h0ID0gcG9wdXAub2Zmc2V0SGVpZ2h0XG5cbiAgICAgIGxldCBbcGFydDEsIHBhcnQyXSA9IHRoaXMucG9wdXBQbGFjZW1lbnQuc3BsaXQoJy0nKSB8fCBbXVxuICAgICAgaWYgKHRoaXMua2VlcEluVmlldykge1xuICAgICAgICBjb25zdCB3aW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoXG4gICAgICAgIGNvbnN0IHdpbkhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJUb3AgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAnYm90dG9tJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCAtIHRyaWdnZXJIZWlnaHQgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAndG9wJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJMZWZ0IDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDEgPSAncmlnaHQnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgaWYgKHdpbldpZHRoIC0gdHJpZ2dlckxlZnQgLSB0cmlnZ2VyV2lkdGggPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdsZWZ0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0MiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICdib3R0b20nXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnYm90dG9tJykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyVG9wICsgdHJpZ2dlckhlaWdodCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICd0b3AnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnbGVmdCcpIHtcbiAgICAgICAgICBpZiAod2luV2lkdGggLSB0cmlnZ2VyTGVmdCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ3JpZ2h0J1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyTGVmdCArIHRyaWdnZXJXaWR0aCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ2xlZnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBsZWZ0ID0gMFxuICAgICAgbGV0IHRvcCA9IDBcbiAgICAgIHN3aXRjaCAocGFydDEpIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICB0b3AgLT0gcG9wdXBIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBsZWZ0IC09IHBvcHVwV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbGVmdCArPSB0cmlnZ2VyV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRvcCArPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAocGFydDIpIHtcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGxlZnQgLT0gcG9wdXBXaWR0aCAtIHRyaWdnZXJXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgdG9wIC09IHBvcHVwSGVpZ2h0IC0gdHJpZ2dlckhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb3Zlcikge1xuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgdG9wICs9IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICB0b3AgLT0gdHJpZ2dlckhlaWdodFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0ICE9PSB0cmlnZ2VyKSB7XG4gICAgICAgIGNvbnN0IHRyaWdnZXJCb3VuZHMgPSB0cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGxlZnQgKz0gdHJpZ2dlckxlZnQgLSB0cmlnZ2VyQm91bmRzLmxlZnRcbiAgICAgICAgdG9wICs9IHRyaWdnZXJUb3AgLSB0cmlnZ2VyQm91bmRzLnRvcFxuICAgICAgfVxuICAgICAgcG9wdXAuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgXG4gICAgICBwb3B1cC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgXG4gICAgfSxcblxuICAgIGFkZEZvY3VzRXZlbnRzKHBhcmVudCkge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgdGV4dGFyZWEnKVxuICAgICAgbGV0IGlucHV0XG5cbiAgICAgIHJldHVybiBjb21iaW5lRXZlbnRzKFxuICAgICAgICBhZGRFdmVudHModGFyZ2V0cywge1xuICAgICAgICAgIGZvY3VzOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmJsdXJUaW1lcilcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICAgICAgLy8gVXNlIHRpbWVvdXQgdG8gYWxsb3cgY2xpY2tlZCBpbnB1dHMgdG8gZ3JhYiBmb2N1c1xuICAgICAgICAgICAgdGhpcy5ibHVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLiRyZWZzLnBvcHVwLm1hdGNoZXMoJzpmb2N1cy13aXRoaW4nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMClcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuXG4gICAgICAgIGFkZEV2ZW50cyhwYXJlbnQsIHtcbiAgICAgICAgICBtb3VzZWRvd246IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJ2lucHV0LCB0ZXh0YXJlYSwgYnV0dG9uJykpIHtcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcygnLmRpdG8tYnV0dG9uLWNsZWFyJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgdHJpZ2dlciA9IHRoaXMudHJpZ2dlclRhcmdldCA/PyB0aGlzLiRyZWZzLnRyaWdnZXJcbiAgICAgICAgICAgICAgLy8gTWFyayB0cmlnZ2VyIGlucHV0IGFzIHJlYWRvbmx5IHNvIGl0IGNhbid0IGxvb3NlIGZvY3VzIHdoaWxlXG4gICAgICAgICAgICAgIC8vIHVzZXIgZG9lcyBvdGhlciBtb3VzZS1hY3Rpdml0aWVzIGluIHBvcHVwLlxuICAgICAgICAgICAgICBpbnB1dCA9IHRyaWdnZXIucXVlcnlTZWxlY3RvcignaW5wdXQsIHRleHRhcmVhJylcbiAgICAgICAgICAgICAgaWYgKGlucHV0ICYmICFpbnB1dC5oYXNBdHRyaWJ1dGUoJ3JlYWRvbmx5JykpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3JlYWRvbmx5JywgJ3RydWUnKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gbnVsbFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIG1vdXNldXA6IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgICAgICAvLyBHaXZlIHNvbWUgdGltZSBmb3Igb3RoZXIgZXZlbnRzIHRvIHVwZGF0ZSBpbnB1dCBiZWZvcmUgaXRcbiAgICAgICAgICAgICAgLy8gYmVjb21lcyBlZGl0YWJsZSBhbmQgc3RpbGwgZm9jdXNlZCBhZ2Fpbi5cbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaW5wdXQucmVtb3ZlQXR0cmlidXRlKCdyZWFkb25seScpXG4gICAgICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcygnaW5wdXQsIHRleHRhcmVhLCBidXR0b24nKSkge1xuICAgICAgICAgICAgICAgICAgaW5wdXQuZm9jdXMoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnB1dCA9IG51bGxcbiAgICAgICAgICAgICAgfSwgMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfSxcblxuICAgIG9uU2hvd1BvcHVwKHNob3cpIHtcbiAgICAgIGlmIChzaG93KSB7XG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdmb2N1cycpIHtcbiAgICAgICAgICB0aGlzLnBvcHVwRXZlbnRzID0gdGhpcy5hZGRGb2N1c0V2ZW50cyh0aGlzLiRyZWZzLnBvcHVwKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3B1cEV2ZW50cz8ucmVtb3ZlKClcbiAgICAgICAgdGhpcy5wb3B1cEV2ZW50cyA9IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25DbGljaygpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Ib3ZlcihlbnRlcikge1xuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1vdXNlTGVhdmVUaW1lcilcbiAgICAgICAgaWYgKGVudGVyKSB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGlkZURlbGF5KSB7XG4gICAgICAgICAgICB0aGlzLm1vdXNlTGVhdmVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgICB9LCB0aGlzLmhpZGVEZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcbkBpbXBvcnQgJy4uL3N0eWxlcy90cmFuc2l0aW9ucy9pbmRleC5zY3NzJztcblxuLmRpdG8tdHJpZ2dlci1jb250YWluZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5kaXRvLXRyaWdnZXItZGlzYWJsZWQge1xuICBjb2xvcjogJGNvbG9yLWRpc2FibGVkO1xuICBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XG4gIGN1cnNvcjogZGVmYXVsdDtcblxuICAqIHtcbiAgICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDtcbiAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAgICY6Zm9jdXMge1xuICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuLmRpdG8tcG9wdXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogJHotaW5kZXgtcG9wdXA7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWlucHV0KDpjbGFzcz1cImNsYXNzZXNcIilcbiAgc2xvdChuYW1lPVwiYmVmb3JlXCIpXG4gIGlucHV0KFxuICAgIDppZD1cImlkXCJcbiAgICByZWY9XCJpbnB1dFwiXG4gICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgOnR5cGU9XCJ0eXBlXCJcbiAgICA6bmFtZT1cIm5hbWVcIlxuICAgIDp0aXRsZT1cInRpdGxlXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgOnJlYWRvbmx5PVwicmVhZG9ubHlcIlxuICAgIDphdXRvZm9jdXM9XCJhdXRvZm9jdXNcIlxuICAgIDpwbGFjZWhvbGRlcj1cInBsYWNlaG9sZGVyXCJcbiAgICA6YXV0b2NvbXBsZXRlPVwiYXV0b2NvbXBsZXRlXCJcbiAgICA6YXJpYS1sYWJlbD1cInRpdGxlXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgKVxuICBzbG90KG5hbWU9XCJhZnRlclwiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnXSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogW1N0cmluZywgTnVtYmVyXSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndGV4dCcgfSxcbiAgICBpZDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRpdGxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgcmVhZG9ubHk6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBhdXRvZm9jdXM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBhdXRvY29tcGxldGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnb2ZmJyB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBob3ZlcmluZzogZmFsc2UsXG4gICAgICBmb2N1c2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNsYXNzZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kYXR0cnMuY2xhc3NcbiAgICB9LFxuXG4gICAgYXR0cmlidXRlcygpIHtcbiAgICAgIGNvbnN0IHsgY2xhc3M6IF8sIC4uLmF0dHJpYnV0ZXMgfSA9IHRoaXMuJGF0dHJzXG4gICAgICByZXR1cm4gYXR0cmlidXRlc1xuICAgIH0sXG5cbiAgICBpbnB1dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzLmlucHV0XG4gICAgfSxcblxuICAgIHNpemUoKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgc2l6ZSBiYXNlZCBvbiBtaW4gJiBtYXggc2V0dGluZ3MsIGlmIHRoZXkncmUgcHJvdmlkZWQuXG4gICAgICBjb25zdCB7IHNpemUsIG1pbiwgbWF4IH0gPSB0aGlzLiRhdHRyc1xuICAgICAgY29uc3QgZ2V0TGVuZ3RoID0gdmFsdWUgPT4gKHZhbHVlICE9IG51bGwgPyBgJHt2YWx1ZX1gLmxlbmd0aCA6IDApXG4gICAgICByZXR1cm4gc2l6ZSB8fCBnZXRMZW5ndGgobWluKSB8fCBnZXRMZW5ndGgobWF4KSB8fCB1bmRlZmluZWRcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gIT09IGZyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUoY3VycmVudFZhbHVlKSB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlICE9PSB0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjdXJyZW50VmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWlucHV0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXG4gIEBleHRlbmQgJWlucHV0O1xuXG4gIGlucHV0IHtcbiAgICAvLyBJbmhlcml0IGFsbCBzdHlsaW5nIGZyb20gLmRpdG8taW5wdXRcbiAgICBhbGw6IGluaGVyaXQ7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlcjogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5pLmRpdG8taWNvbihcbiAgOmNsYXNzPWB7XG4gICAgWydkaXRvLWljb24tLScgKyBuYW1lXTogdHJ1ZSxcbiAgICAnZGl0by1pY29uLS1kaXNhYmxlZCc6IGRpc2FibGVkXG4gIH1gXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBwcm9wczoge1xuICAgIG5hbWU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBkaXNhYmxlZDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4vLyBgeWFybiBidWlsZDppY29uc2AgY29udmVydHMgdGhlIGljb24gU1ZHIGZpbGVzIHRvIHNpbGVudCBjbGFzc2VzIGluc2lkZVxuLy8gYHNyYy9zdHlsZXMvbWl4aW5zL19pY29ucy5zY3NzYCwgbWFraW5nIHRoZW0gYXZhaWxhYmxlIHRvIGFsbCBvdGhlciBzYXNzXG4vLyBjb2RlIHRocm91Z2ggYF9pbXBvcnRzYC5cbi8vIEluIG9yZGVyIHRvIGJlIGFibGUgdG8gdXNlIHRoZW0gYXMgbm9ybWFsIENTUyBjbGFzc2VzLCBjb252ZXJ0IHRoZW0gaGVyZTpcbkBlYWNoICRuYW1lIGluICRpY29ucyB7XG4gIC5kaXRvLWljb24tLSN7JG5hbWV9IHtcbiAgICAmOjphZnRlciB7XG4gICAgICBAZXh0ZW5kICVpY29uLSN7JG5hbWV9O1xuXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLWljb24ge1xuICBAYXQtcm9vdCAuZGl0by1pbnB1dCAmIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgaW5zZXQ6ICRib3JkZXItd2lkdGg7XG4gICAgbGVmdDogdW5zZXQ7XG4gICAgd2lkdGg6IDJlbTtcbiAgICBmb250LXN0eWxlOiBub3JtYWw7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgY29sb3I6ICRjb2xvci1ncmV5O1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcblxuICAgICYtLWRpc2FibGVkIHtcbiAgICAgIGNvbG9yOiAkY29sb3ItbGlnaHQ7XG4gICAgfVxuICB9XG5cbiAgQGF0LXJvb3QgLmRpdG8taW5wdXQ6Zm9jdXMtd2l0aGluICYge1xuICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICB9XG59XG48L3N0eWxlPlxuIiwiZXhwb3J0IGZ1bmN0aW9uIHNldFNlbGVjdGlvbihpbnB1dCwgeyBzdGFydCwgZW5kIH0pIHtcbiAgaWYgKGlucHV0Py5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgIGlucHV0LmZvY3VzKClcbiAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb24oaW5wdXQpIHtcbiAgcmV0dXJuIGlucHV0ICYmICdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXRcbiAgICA/IHsgc3RhcnQ6IGlucHV0LnNlbGVjdGlvblN0YXJ0LCBlbmQ6IGlucHV0LnNlbGVjdGlvbkVuZCB9XG4gICAgOiBudWxsXG59XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblRyaWdnZXIuZGl0by1kYXRlLXBpY2tlcihcbiAgcmVmPVwidHJpZ2dlclwiXG4gIHYtbW9kZWw6c2hvdz1cInNob3dQb3B1cFwiXG4gIHRyaWdnZXI9XCJmb2N1c1wiXG4gIHYtYmluZD1cInsgdHJhbnNpdGlvbiwgcGxhY2VtZW50LCBkaXNhYmxlZCwgdGFyZ2V0IH1cIlxuKVxuICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICBzbG90KFxuICAgICAgdi1pZj1cIiRzbG90cy50cmlnZ2VyXCJcbiAgICAgIG5hbWU9XCJ0cmlnZ2VyXCJcbiAgICApXG4gICAgSW5wdXRGaWVsZC5kaXRvLWRhdGUtcGlja2VyLWlucHV0KFxuICAgICAgdi1lbHNlXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFRleHRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgOmNsYXNzPVwieyAnZGl0by1mb2N1cyc6IGZvY3VzZWQgfVwiXG4gICAgICB2LWJpbmQ9XCJ7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCwgLi4uJGF0dHJzIH1cIlxuICAgICAgQGZvY3VzPVwib25Gb2N1cyh0cnVlKVwiXG4gICAgICBAYmx1cj1cIm9uRm9jdXMoZmFsc2UpXCJcbiAgICAgIEBrZXlkb3duPVwib25LZXlEb3duXCJcbiAgICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uTW91c2VEb3duKGZhbHNlKVwiXG4gICAgKVxuICAgICAgdGVtcGxhdGUoI2JlZm9yZSlcbiAgICAgICAgc2xvdChuYW1lPVwiYmVmb3JlXCIpXG4gICAgICB0ZW1wbGF0ZSgjYWZ0ZXIpXG4gICAgICAgIEljb24oXG4gICAgICAgICAgbmFtZT1cImNhbGVuZGFyXCJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgICAgQG1vdXNlZG93bi5wcmV2ZW50PVwib25Nb3VzZURvd24odHJ1ZSlcIlxuICAgICAgICApXG4gICAgICAgIHNsb3QobmFtZT1cImFmdGVyXCIpXG4gIHRlbXBsYXRlKCNwb3B1cClcbiAgICBDYWxlbmRhci5kaXRvLWRhdGUtcGlja2VyLXBvcHVwKFxuICAgICAgcmVmPVwiY2FsZW5kYXJcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgICB2LWJpbmQ9XCJ7IGxvY2FsZSwgZGlzYWJsZWREYXRlIH1cIlxuICAgICAgQHNlbGVjdD1cInNob3dQb3B1cCA9IGZhbHNlXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZm9ybWF0LCBkZWZhdWx0Rm9ybWF0cyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgVHJpZ2dlciBmcm9tICcuL1RyaWdnZXIudnVlJ1xuaW1wb3J0IENhbGVuZGFyIGZyb20gJy4vQ2FsZW5kYXIudnVlJ1xuaW1wb3J0IElucHV0RmllbGQgZnJvbSAnLi9JbnB1dEZpZWxkLnZ1ZSdcbmltcG9ydCBJY29uIGZyb20gJy4vSWNvbi52dWUnXG5pbXBvcnQgeyBwYXJzZURhdGUsIGdldERhdGVQYXJ0QXRQb3NpdGlvbiB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5pbXBvcnQgeyBnZXRTZWxlY3Rpb24sIHNldFNlbGVjdGlvbiB9IGZyb20gJy4uL3V0aWxzL3NlbGVjdGlvbi5qcydcbmltcG9ydCB7IGdldEtleU5hdmlnYXRpb24gfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcbmltcG9ydCB7IGdldFRhcmdldCB9IGZyb20gJy4uL3V0aWxzL3RyaWdnZXIuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBUcmlnZ2VyLCBDYWxlbmRhciwgSW5wdXRGaWVsZCwgSWNvbiB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICd1cGRhdGU6c2hvdycsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tLWxlZnQnIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogJ3RyaWdnZXInIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGZvcm1hdDoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4gKHtcbiAgICAgICAgZGF0ZTogZGVmYXVsdEZvcm1hdHMuZGF0ZSxcbiAgICAgICAgdGltZTogZmFsc2VcbiAgICAgIH0pXG4gICAgfSxcbiAgICBkaXNhYmxlZERhdGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEZvY3VzZWQgfHwgdGhpcy5zaG93UG9wdXBcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gZ2V0VGFyZ2V0KHRoaXMpPy5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpXG4gICAgfSxcblxuICAgIGZvcm1hdE9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAuLi50aGlzLmZvcm1hdFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpIHx8ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKVxuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gZGF0ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICgrdmFsdWUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25Gb2N1cyhmb2N1cykge1xuICAgICAgdGhpcy5pbnB1dEZvY3VzZWQgPSBmb2N1c1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBmb2N1c1xuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IHsgdmVyOiBzdGVwLCBlbnRlciB9ID0gZ2V0S2V5TmF2aWdhdGlvbihldmVudClcbiAgICAgIGlmIChzdGVwIHx8IGVudGVyKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdldFNlbGVjdGlvbih0aGlzLmlucHV0KT8uc3RhcnRcbiAgICAgICAgY29uc3QgZ2V0RGF0ZVBhcnQgPSBwb3NpdGlvbiA9PlxuICAgICAgICAgIGdldERhdGVQYXJ0QXRQb3NpdGlvbih0aGlzLmN1cnJlbnRUZXh0LCBwb3NpdGlvbiwgdGhpcy5mb3JtYXRPcHRpb25zKVxuXG4gICAgICAgIGlmIChzdGVwICYmICF0aGlzLnNob3dQb3B1cCkge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHsgY2FsZW5kYXIgfSA9IHRoaXMuJHJlZnNcbiAgICAgICAgICBpZiAoY2FsZW5kYXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZTogbW9kZSwgc3RhcnQgfSA9IGdldERhdGVQYXJ0KHBvc2l0aW9uKSB8fCB7fVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBtb2RlICYmXG4gICAgICAgICAgICAgIGNhbGVuZGFyLm5hdmlnYXRlKHsgc3RlcCwgZW50ZXIsIG1vZGUsIHVwZGF0ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbih0aGlzLmlucHV0LCBnZXREYXRlUGFydChzdGFydCkpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbk1vdXNlRG93bih0b2dnbGUpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gIXRoaXMuZGlzYWJsZWQgJiYgKCF0b2dnbGUgfHwgIXRoaXMuc2hvd1BvcHVwKVxuICAgICAgaWYgKHRoaXMuc2hvd1BvcHVwKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRhdGUtcGlja2VyIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWluLXdpZHRoOiA4ZW07XG4gIH1cbn1cblxuLmRpdG8tZGF0ZS1waWNrZXItcG9wdXAge1xuICBtYXJnaW46ICRwb3B1cC1tYXJnaW47XG59XG48L3N0eWxlPlxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5UcmlnZ2VyLmRpdG8tdGltZS1waWNrZXIoXG4gIHJlZj1cInRyaWdnZXJcIlxuICB2LW1vZGVsOnNob3c9XCJzaG93UG9wdXBcIlxuICB0cmlnZ2VyPVwiZm9jdXNcIlxuICB2LWJpbmQ9XCJ7IHRyYW5zaXRpb24sIHBsYWNlbWVudCwgZGlzYWJsZWQsIHRhcmdldCB9XCJcbilcbiAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgc2xvdChcbiAgICAgIHYtaWY9XCIkc2xvdHMudHJpZ2dlclwiXG4gICAgICBuYW1lPVwidHJpZ2dlclwiXG4gICAgKVxuICAgIElucHV0RmllbGQuZGl0by10aW1lLXBpY2tlci1pbnB1dChcbiAgICAgIHYtZWxzZVxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBmb2N1c2VkIH1cIlxuICAgICAgdi1iaW5kPVwieyBwbGFjZWhvbGRlciwgZGlzYWJsZWQsIC4uLiRhdHRycyB9XCJcbiAgICAgIEBmb2N1cz1cIm9uRm9jdXModHJ1ZSlcIlxuICAgICAgQGJsdXI9XCJvbkZvY3VzKGZhbHNlKVwiXG4gICAgICBAa2V5ZG93bj1cIm9uS2V5RG93blwiXG4gICAgICBAbW91c2Vkb3duLnN0b3A9XCJvbk1vdXNlRG93bihmYWxzZSlcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCNiZWZvcmUpXG4gICAgICAgIHNsb3QobmFtZT1cImJlZm9yZVwiKVxuICAgICAgdGVtcGxhdGUoI2FmdGVyKVxuICAgICAgICBJY29uKFxuICAgICAgICAgIG5hbWU9XCJjbG9ja1wiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIEBtb3VzZWRvd24ucHJldmVudD1cIm9uTW91c2VEb3duKHRydWUpXCJcbiAgICAgICAgKVxuICAgICAgICBzbG90KG5hbWU9XCJhZnRlclwiKVxuICB0ZW1wbGF0ZSgjcG9wdXApXG4gICAgLmRpdG8tdGltZS1waWNrZXItcG9wdXBcbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItaG91cihyZWY9XCJob3VyXCIpXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImluZGV4IGluIDI0XCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBsaShcbiAgICAgICAgICAgICAgdi1pZj1cIiFkaXNhYmxlZEhvdXIoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgc2VsZWN0ZWQ6IGhvdXIgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwiaG91ciA9IGluZGV4IC0gMVwiXG4gICAgICAgICAgICApIHt7IGxlZnRQYWQoaW5kZXggLSAxKSB9fVxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1taW51dGUocmVmPVwibWludXRlXCIpXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImluZGV4IGluIDYwXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBsaShcbiAgICAgICAgICAgICAgdi1pZj1cIiFkaXNhYmxlZE1pbnV0ZShpbmRleCAtIDEpXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyBzZWxlY3RlZDogbWludXRlID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cIm1pbnV0ZSA9IGluZGV4IC0gMVwiXG4gICAgICAgICAgICApIHt7IGxlZnRQYWQoaW5kZXggLSAxKSB9fVxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1zZWNvbmQocmVmPVwic2Vjb25kXCIpXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImluZGV4IGluIDYwXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBsaShcbiAgICAgICAgICAgICAgdi1pZj1cIiFkaXNhYmxlZFNlY29uZChpbmRleCAtIDEpXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyBzZWxlY3RlZDogc2Vjb25kID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlY29uZCA9IGluZGV4IC0gMVwiXG4gICAgICAgICAgICApIHt7IGxlZnRQYWQoaW5kZXggLSAxKSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGZvcm1hdCwgZGVmYXVsdEZvcm1hdHMgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi9UcmlnZ2VyLnZ1ZSdcbmltcG9ydCBJbnB1dEZpZWxkIGZyb20gJy4vSW5wdXRGaWVsZC52dWUnXG5pbXBvcnQgSWNvbiBmcm9tICcuL0ljb24udnVlJ1xuaW1wb3J0IHsgYWx0ZXJEYXRlLCBwYXJzZURhdGUsIGdldERhdGVQYXJ0QXRQb3NpdGlvbiB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5pbXBvcnQgeyBnZXRTZWxlY3Rpb24sIHNldFNlbGVjdGlvbiB9IGZyb20gJy4uL3V0aWxzL3NlbGVjdGlvbi5qcydcbmltcG9ydCB7IGdldEtleU5hdmlnYXRpb24gfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcbmltcG9ydCB7IGdldFRhcmdldCB9IGZyb20gJy4uL3V0aWxzL3RyaWdnZXIuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBUcmlnZ2VyLCBJbnB1dEZpZWxkLCBJY29uIH0sXG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ3VwZGF0ZTpzaG93JywgJ2NoYW5nZScsICdmb2N1cycsICdibHVyJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20tbGVmdCcgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB0YXJnZXQ6IHsgdHlwZTogW1N0cmluZywgSFRNTEVsZW1lbnRdLCBkZWZhdWx0OiAndHJpZ2dlcicgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZm9ybWF0OiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiAoKSA9PiAoe1xuICAgICAgICB0aW1lOiBkZWZhdWx0Rm9ybWF0cy50aW1lLFxuICAgICAgICBkYXRlOiBmYWxzZVxuICAgICAgfSlcbiAgICB9LFxuICAgIGRpc2FibGVkSG91cjogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBkaXNhYmxlZE1pbnV0ZTogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBkaXNhYmxlZFNlY29uZDogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBpbnB1dEZvY3VzZWQ6IGZhbHNlLFxuICAgICAgaWdub3JlTmV4dENoYW5nZTogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGb2N1c2VkIHx8IHRoaXMuc2hvd1BvcHVwXG4gICAgfSxcblxuICAgIGlucHV0KCkge1xuICAgICAgcmV0dXJuIGdldFRhcmdldCh0aGlzKT8ucXVlcnlTZWxlY3RvcignaW5wdXQnKVxuICAgIH0sXG5cbiAgICBmb3JtYXRPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgLi4udGhpcy5mb3JtYXRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFRleHQ6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh0aGlzLmN1cnJlbnRWYWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKSB8fCAnJ1xuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBwYXJzZURhdGUodmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucylcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGRhdGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50RGF0ZSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlIHx8XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBEYXRlKCkgb2JqZWN0IHdpdGggdGhlIHRpbWUgc2V0IHRvIDAsIHRvIGJlIHVzZWQgd2hlblxuICAgICAgICAvLyBmaXJzdCBzZXR0aW5nIGFueSBvZiB0aGUgdGltZXMsIGZvciBtZWFuaW5nZnVsIGRhdGVzIGluIGNhc2UgdGhlXG4gICAgICAgIC8vIG9iamVjdCBpcyBzaGFyZWQgd2l0aCBhIERhdGVQaWNrZXIsIGUuZy4gdGhyb3VnaCBEYXRlVGltZVBpY2tlci5cbiAgICAgICAgYWx0ZXJEYXRlKG5ldyBEYXRlKCksIHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAsIG1pbGxpc2Vjb25kOiAwIH0pXG4gICAgICApXG4gICAgfSxcblxuICAgIGhvdXI6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERhdGUuZ2V0SG91cnMoKVxuICAgICAgfSxcblxuICAgICAgc2V0KGhvdXIpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgaG91ciB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBtaW51dGU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERhdGUuZ2V0TWludXRlcygpXG4gICAgICB9LFxuXG4gICAgICBzZXQobWludXRlKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZSh7IG1pbnV0ZSB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZWNvbmQ6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERhdGUuZ2V0U2Vjb25kcygpXG4gICAgICB9LFxuXG4gICAgICBzZXQoc2Vjb25kKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZSh7IHNlY29uZCB9KVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgICAgdGhpcy5zY3JvbGxBbGwodHJ1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKHZhbHVlKSB7XG4gICAgICBpZiAoK3ZhbHVlICE9PSArdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsdWUpXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbHVlKVxuICAgICAgICB0aGlzLnNjcm9sbEFsbCh0cnVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dCgpIHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbihpbnB1dClcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5mb2N1c2VkICYmXG4gICAgICAgICF0aGlzLmlnbm9yZU5leHRDaGFuZ2UgJiZcbiAgICAgICAgc2VsZWN0aW9uLnN0YXJ0ID09PSBzZWxlY3Rpb24uZW5kXG4gICAgICApIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gc2V0U2VsZWN0aW9uKGlucHV0LCBzZWxlY3Rpb24pKVxuICAgICAgfVxuICAgICAgdGhpcy5pZ25vcmVOZXh0Q2hhbmdlID0gZmFsc2VcbiAgICB9LFxuXG4gICAgc2hvdyhzaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHNob3dcbiAgICB9LFxuXG4gICAgc2hvd1BvcHVwKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8pIHtcbiAgICAgICAgdGhpcy5zY3JvbGxBbGwoZmFsc2UpXG4gICAgICB9XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBsZWZ0UGFkKHZhbHVlKSB7XG4gICAgICByZXR1cm4gKCcwJyArIHZhbHVlKS5zbGljZSgtMilcbiAgICB9LFxuXG4gICAgc2V0VGltZShvdmVycmlkZXMpIHtcbiAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gYWx0ZXJEYXRlKHRoaXMuY3VycmVudERhdGUsIHtcbiAgICAgICAgLi4ub3ZlcnJpZGVzLFxuICAgICAgICBtaWxsaXNlY29uZDogMFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc2Nyb2xsQWxsKHNtb290aCkge1xuICAgICAgY29uc3Qgc2Nyb2xsID0gKHJlZiwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4kcmVmc1tyZWZdXG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gKFxuICAgICAgICAgICAgdGFyZ2V0LnNjcm9sbEhlaWdodCAvXG4gICAgICAgICAgICAvLyBGaXJzdCBhbmQgbGFzdCBvbmUgYWRkIDMgdGltZXMgdGhlIG1hcmdpbi5cbiAgICAgICAgICAgICh0YXJnZXQuY2hpbGRFbGVtZW50Q291bnQgKyA2KVxuICAgICAgICAgIClcbiAgICAgICAgICBjb25zdCB0b3AgPSBNYXRoLnJvdW5kKHZhbHVlICogbGluZUhlaWdodClcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKHRhcmdldC5zY3JvbGxUb3AgLSB0b3ApXG4gICAgICAgICAgdGFyZ2V0LnNjcm9sbFRvKHtcbiAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgIGJlaGF2aW9yOiBzbW9vdGggJiYgZGlzdGFuY2UgPCAxMDAgPyAnc21vb3RoJyA6ICdhdXRvJ1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgc2Nyb2xsKCdob3VyJywgdGhpcy5ob3VyKVxuICAgICAgICBzY3JvbGwoJ21pbnV0ZScsIHRoaXMubWludXRlKVxuICAgICAgICBzY3JvbGwoJ3NlY29uZCcsIHRoaXMuc2Vjb25kKVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgb25Gb2N1cyhmb2N1cykge1xuICAgICAgdGhpcy5pbnB1dEZvY3VzZWQgPSBmb2N1c1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBmb2N1c1xuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbihpbnB1dClcbiAgICAgIGNvbnN0IHsgdmVyOiBzdGVwLCBlbnRlciB9ID0gZ2V0S2V5TmF2aWdhdGlvbihldmVudClcbiAgICAgIGlmIChzdGVwIHx8IGVudGVyKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgICAgICBjb25zdCBnZXREYXRlUGFydCA9IHBvc2l0aW9uID0+XG4gICAgICAgICAgZ2V0RGF0ZVBhcnRBdFBvc2l0aW9uKHRoaXMuY3VycmVudFRleHQsIHBvc2l0aW9uLCB0aGlzLmZvcm1hdE9wdGlvbnMpXG5cbiAgICAgICAgaWYgKHN0ZXApIHtcbiAgICAgICAgICBpZiAoIXRoaXMuc2hvd1BvcHVwKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeyBuYW1lLCBzdGFydCB9ID0gZ2V0RGF0ZVBhcnQoc2VsZWN0aW9uLnN0YXJ0KSB8fCB7fVxuICAgICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW25hbWVdICsgc3RlcFxuICAgICAgICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuJHJlZnNbbmFtZV0uY2hpbGRFbGVtZW50Q291bnRcbiAgICAgICAgICAgICAgdGhpc1tuYW1lXSA9XG4gICAgICAgICAgICAgICAgdmFsdWUgPCAwXG4gICAgICAgICAgICAgICAgICA/IHZhbHVlICsgY291bnRcbiAgICAgICAgICAgICAgICAgIDogdmFsdWUgPj0gY291bnRcbiAgICAgICAgICAgICAgICAgICAgPyB2YWx1ZSAtIGNvdW50XG4gICAgICAgICAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgICAgICAgdGhpcy5pZ25vcmVOZXh0Q2hhbmdlID0gdHJ1ZVxuICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24oaW5wdXQsIGdldERhdGVQYXJ0KHN0YXJ0KSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGVudGVyKSB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdGlvbi5zdGFydCA9PT0gc2VsZWN0aW9uLmVuZCkge1xuICAgICAgICBjb25zdCB7IHZhbHVlIH0gPSBpbnB1dFxuICAgICAgICBsZXQgcG9zID0gc2VsZWN0aW9uLnN0YXJ0XG5cbiAgICAgICAgY29uc3QgaXNEaWdpdCA9IGNoYXIgPT4gIWlzTmFOKHBhcnNlSW50KGNoYXIsIDEwKSlcblxuICAgICAgICBpZiAoZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGlmIChpc0RpZ2l0KGV2ZW50LmtleSkgJiYgcG9zIDwgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHZhbHVlW3Bvc10gPT09ICc6JyAmJlxuICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3BvcyAtIDFdKSAmJlxuICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3BvcyAtIDJdKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHBvcysrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZW1vdmUgbmV4dCBkaWdpdCBzbyB0aGUgZXZlbnQgb3ZlcnJpZGVzIGl0IGluc3RlYWQgb2YgaW5zZXJ0aW5nXG4gICAgICAgICAgICAvLyBuZXcgY2hhcnMuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zXSkgJiYgKFxuICAgICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zICsgMV0pIHx8XG4gICAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3MgLSAxXSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gKFxuICAgICAgICAgICAgICAgIHZhbHVlLnNsaWNlKDAsIHBvcykgK1xuICAgICAgICAgICAgICAgIHZhbHVlLnNsaWNlKHBvcyArIDEpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKGlucHV0LCB7IHN0YXJ0OiBwb3MsIGVuZDogcG9zIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGZvcm1hdCh0aGlzLmN1cnJlbnRWYWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKS5sZW5ndGhcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IGxlbmd0aCkge1xuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA+IGxlbmd0aCkge1xuICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGxlbmd0aClcbiAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKGlucHV0LCBzZWxlY3Rpb24pXG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBvcyA9PT0gMSB8fFxuICAgICAgICAgICAgWycgJywgJzonXS5pbmNsdWRlcyh2YWx1ZVtwb3MgLSAyXSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcG9zID09PSB2YWx1ZS5sZW5ndGggfHxcbiAgICAgICAgICAgICAgdmFsdWVbcG9zXSA9PT0gJzonXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcG9zLS1cbiAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAoXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMCwgcG9zKSArXG4gICAgICAgICAgICAgICAgKCh2YWx1ZVtwb3MgLSAxXSA/PyAnJykgKyAnMDAnKSArXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UocG9zICsgMSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oaW5wdXQsIHsgc3RhcnQ6IHBvcywgZW5kOiBwb3MgfSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zXSkgJiZcbiAgICAgICAgICAgICAgIWlzRGlnaXQoK3ZhbHVlW3BvcyArIDFdKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIFdoZW4gcmVtb3ZpbmcgdGhlIGZpcnN0IG9mIHR3byBkaWdpdHMsIHJlcGxhY2Ugd2l0aCAwXG4gICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgcG9zKSArICcwJyArIHZhbHVlLnNsaWNlKHBvcylcbiAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKGlucHV0LCB7IHN0YXJ0OiBwb3MsIGVuZDogcG9zIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uTW91c2VEb3duKHRvZ2dsZSkge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSAhdGhpcy5kaXNhYmxlZCAmJiAoIXRvZ2dsZSB8fCAhdGhpcy5zaG93UG9wdXApXG4gICAgICBpZiAodGhpcy5zaG93UG9wdXApIHtcbiAgICAgICAgdGhpcy5mb2N1cygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tdGltZS1waWNrZXIge1xuICAuZGl0by1pbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWluLXdpZHRoOiA2ZW07XG4gIH1cbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAge1xuICBtYXgtd2lkdGg6IDE2MHB4O1xuICBtYXJnaW46ICRwb3B1cC1tYXJnaW47XG59XG5cbiR0aW1lLXBpY2tlci1saW5lLWhlaWdodDogMjRweDtcblxuLmRpdG8tdGltZS1waWNrZXIge1xuICAuZGl0by1pbnB1dCB7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXdpZHRoOiAwIDFweCAwO1xuICBtYXJnaW4tbGVmdDogLTFweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgd2lkdGg6IGNhbGMoMTAwJSAvIDMgKyAxcHgpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gICY6bGFzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXJpZ2h0OiAwO1xuICB9XG5cbiAgdWwge1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWFyZ2luOiAwO1xuICAgIC8vIEhpZGUgc2Nyb2xsYmFyOlxuICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAgIHBhZGRpbmc6IDAgMTdweCAwIDA7XG4gICAgaGVpZ2h0OiA3ICogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuXG4gICAgJiA+IGxpIHtcbiAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6ICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDMgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDMgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xuICAgICAgfVxuXG4gICAgICAmLnNlbGVjdGVkLFxuICAgICAgJi5zZWxlY3RlZDpob3ZlciB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIH1cblxuICAgICAgJi5kaXNhYmxlZCB7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgICAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgICAgIH1cblxuICAgICAgJi5kaXNhYmxlZDpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1kYXRlLXRpbWUtcGlja2VyKHJlZj1cInBpY2tlclwiKVxuICAuZGl0by1kYXRlLXRpbWUtcGlja2VyX19pbm5lcig6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogZm9jdXNlZCB9XCIpXG4gICAgSW5wdXRGaWVsZC5kaXRvLWRhdGUtdGltZS1waWNrZXJfX2lucHV0KFxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBmb2N1c2VkIH1cIlxuICAgICAgdi1iaW5kPVwieyBwbGFjZWhvbGRlciwgZGlzYWJsZWQsIC4uLiRhdHRycyB9XCJcbiAgICAgIEBmb2N1cz1cIm9uRm9jdXModHJ1ZSlcIlxuICAgICAgQGJsdXI9XCJvbkZvY3VzKGZhbHNlKVwiXG4gICAgICBAa2V5ZG93bj1cIm9uS2V5RG93blwiXG4gICAgICBAbW91c2Vkb3duLnN0b3A9XCJvbk1vdXNlRG93bihmYWxzZSlcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCNiZWZvcmUpXG4gICAgICAgIHNsb3QobmFtZT1cImJlZm9yZVwiKVxuICAgICAgdGVtcGxhdGUoI2FmdGVyKVxuICAgICAgICBJY29uKFxuICAgICAgICAgIG5hbWU9XCJjYWxlbmRhclwiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIEBtb3VzZWRvd24ucHJldmVudD1cIm9uTW91c2VEb3duKHRydWUpXCJcbiAgICAgICAgKVxuICAgICAgICBzbG90KG5hbWU9XCJhZnRlclwiKVxuICAgIERhdGVQaWNrZXIoXG4gICAgICByZWY9XCJkYXRlXCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgICAgdi1tb2RlbDpzaG93PVwic2hvd0RhdGVcIlxuICAgICAgcGxhY2VtZW50PVwiYm90dG9tLWxlZnRcIlxuICAgICAgOnRhcmdldD1cIiRyZWZzLnBpY2tlclwiXG4gICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICAgICAgLy8tIEludGVudGlvbmFsbHkgZW1wdHlcbiAgICBUaW1lUGlja2VyKFxuICAgICAgcmVmPVwidGltZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dUaW1lXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1yaWdodFwiXG4gICAgICA6dGFyZ2V0PVwiJHJlZnMucGlja2VyXCJcbiAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgICAgICAvLy0gSW50ZW50aW9uYWxseSBlbXB0eVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGZvcm1hdCwgZGVmYXVsdEZvcm1hdHMsIGFzc2lnbkRlZXBseSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgSW5wdXRGaWVsZCBmcm9tICcuL0lucHV0RmllbGQudnVlJ1xuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSAnLi9EYXRlUGlja2VyLnZ1ZSdcbmltcG9ydCBUaW1lUGlja2VyIGZyb20gJy4vVGltZVBpY2tlci52dWUnXG5pbXBvcnQgSWNvbiBmcm9tICcuL0ljb24udnVlJ1xuaW1wb3J0IHsgcGFyc2VEYXRlIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZS5qcydcbmltcG9ydCB7IGdldFNlbGVjdGlvbiwgc2V0U2VsZWN0aW9uIH0gZnJvbSAnLi4vdXRpbHMvc2VsZWN0aW9uLmpzJ1xuaW1wb3J0IHsgZ2V0S2V5TmF2aWdhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgSW5wdXRGaWVsZCwgRGF0ZVBpY2tlciwgVGltZVBpY2tlciwgSWNvbiB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBmb3JtYXQ6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dEYXRlOiBmYWxzZSxcbiAgICAgIHNob3dUaW1lOiBmYWxzZSxcbiAgICAgIGlucHV0Rm9jdXNlZDogZmFsc2UsXG4gICAgICBkYXRlRm9jdXNlZDogZmFsc2UsXG4gICAgICB0aW1lRm9jdXNlZDogZmFsc2UsXG4gICAgICBjbG9zZWRNb2RlOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgYXR0cmlidXRlcygpIHtcbiAgICAgIGNvbnN0IHsgdHJhbnNpdGlvbiwgZGlzYWJsZWQsIGxvY2FsZSwgZm9ybWF0T3B0aW9uczogZm9ybWF0IH0gPSB0aGlzXG4gICAgICByZXR1cm4geyB0cmFuc2l0aW9uLCBkaXNhYmxlZCwgbG9jYWxlLCBmb3JtYXQgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGb2N1c2VkIHx8IHRoaXMuc2hvd0RhdGUgfHwgdGhpcy5zaG93VGltZVxuICAgIH0sXG5cbiAgICBpbnB1dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzLmlucHV0LmlucHV0XG4gICAgfSxcblxuICAgIGZvcm1hdE9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4gYXNzaWduRGVlcGx5KFxuICAgICAgICB7XG4gICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICB0aW1lOiBkZWZhdWx0Rm9ybWF0cy50aW1lLFxuICAgICAgICAgIGRhdGU6IGRlZmF1bHRGb3JtYXRzLmRhdGVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICAgICAgZm9ybWF0OiAodmFsdWUsIHR5cGUsIG9wdGlvbnMpID0+XG4gICAgICAgICAgICAgIHR5cGUgPT09ICdsaXRlcmFsJyAmJiAvXFxiYXRcXGIvLnRlc3QodmFsdWUpXG4gICAgICAgICAgICAgICAgPyAnLCAnXG4gICAgICAgICAgICAgICAgOiB0aGlzLmZvcm1hdD8uZGF0ZT8uZm9ybWF0Py4odmFsdWUsIHR5cGUsIG9wdGlvbnMpID8/IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0aGlzLmZvcm1hdFxuICAgICAgKVxuICAgIH0sXG5cbiAgICB0aW1lSW5kZXgoKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5jdXJyZW50VGV4dFxuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgY29uc3QgdGltZSA9IHRleHQubWF0Y2goLyhbXFxTXStcXHMqKSQvKT8uWzFdXG4gICAgICAgIGlmICh0aW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoIC0gdGltZS5sZW5ndGhcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgY3VycmVudFRleHQ6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh0aGlzLmN1cnJlbnRWYWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKSB8fCAnJ1xuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBwYXJzZURhdGUodmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucylcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24odGhpcy5pbnB1dClcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGRhdGVcbiAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24odGhpcy5pbnB1dCwgc2VsZWN0aW9uKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKHZhbHVlKSB7XG4gICAgICBpZiAoK3ZhbHVlICE9PSArdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsdWUpXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbHVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25Gb2N1cyhmb2N1cykge1xuICAgICAgdGhpcy5pbnB1dEZvY3VzZWQgPSBmb2N1c1xuICAgICAgaWYgKGZvY3VzKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUG9wdXBzKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd0RhdGUgPSBmYWxzZVxuICAgICAgICB0aGlzLnNob3dUaW1lID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Nb3VzZURvd24odG9nZ2xlKSB7XG4gICAgICBpZiAodG9nZ2xlICYmICh0aGlzLnNob3dEYXRlIHx8IHRoaXMuc2hvd1RpbWUpKSB7XG4gICAgICAgIHRoaXMuc2hvd0RhdGUgPSBmYWxzZVxuICAgICAgICB0aGlzLnNob3dUaW1lID0gZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnVwZGF0ZVBvcHVwcygpKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmdldE1vZGUoZXZlbnQpXG4gICAgICB0aGlzLiRyZWZzW21vZGVdLm9uS2V5RG93bihldmVudClcbiAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkTW9kZSA9IG1vZGVcbiAgICAgIH0gZWxzZSBpZiAobW9kZSAhPT0gdGhpcy5jbG9zZWRNb2RlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUG9wdXBzKG1vZGUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldE1vZGUoZXZlbnQgPSBudWxsKSB7XG4gICAgICBjb25zdCB7IHN0YXJ0IH0gPSBnZXRTZWxlY3Rpb24odGhpcy5pbnB1dClcbiAgICAgIGNvbnN0IHsgaG9yOiBzdGVwIH0gPSBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KVxuICAgICAgcmV0dXJuIHRoaXMudGltZUluZGV4ID09PSBudWxsIHx8IHN0YXJ0ICsgc3RlcCA8IHRoaXMudGltZUluZGV4XG4gICAgICAgID8gJ2RhdGUnXG4gICAgICAgIDogJ3RpbWUnXG4gICAgfSxcblxuICAgIHVwZGF0ZVBvcHVwcyhtb2RlID0gdGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgIGlmIChtb2RlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkTW9kZSA9IG51bGxcbiAgICAgIH1cbiAgICAgIHRoaXMuc2hvd0RhdGUgPSBtb2RlID09PSAnZGF0ZSdcbiAgICAgIHRoaXMuc2hvd1RpbWUgPSBtb2RlID09PSAndGltZSdcbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1kYXRlLXRpbWUtcGlja2VyIHtcbiAgJl9faW5uZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gIH1cblxuICAmX19pbnB1dCB7XG4gICAgZmxleDogMTtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIG1pbi13aWR0aDogMTJlbTtcbiAgfVxuXG4gIC5kaXRvLWRhdGUtcGlja2VyLFxuICAuZGl0by10aW1lLXBpY2tlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPCEtLSBlc2xpbnQtZGlzYWJsZSB2dWUvbm8tdGVtcGxhdGUtc2hhZG93IC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXBhZ2luYXRpb25cbiAgLmRpdG8tcGFnaW5hdGlvbi10b3RhbChcbiAgICB2LWlmPVwic2hvd1RvdGFsXCJcbiAgKVxuICAgIHRlbXBsYXRlKFxuICAgICAgdi1pZj1cInRvdGFsID4gMFwiXG4gICAgKSB7eyBmaXJzdCB9fSDigJMge3sgbGFzdCB9fSAvIHt7IHRvdGFsIH19XG4gIC5kaXRvLWJ1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kKFxuICAgIHYtaWY9XCJudW1QYWdlcyA+IDFcIlxuICApXG4gICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgdi1mb3I9XCJidXR0b24gaW4gYnV0dG9uc1wiXG4gICAgICA6Y2xhc3M9XCJnZXRCdXR0b25DbGFzc2VzKGJ1dHRvbilcIlxuICAgICAgOmRpc2FibGVkPVwiYnV0dG9uLmRpc2FibGVkXCJcbiAgICAgIEBjbGljaz1cIm9uQ2xpY2tCdXR0b24oYnV0dG9uKVwiXG4gICAgKVxuICAgICAgc3BhbihcbiAgICAgICAgdi1pZj1cImJ1dHRvbi50ZXh0XCJcbiAgICAgICkge3sgYnV0dG9uLnRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTpwYWdlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICB0b3RhbDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBwYWdlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMSB9LFxuICAgIHBhZ2VTaXplOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTAgfSxcbiAgICBzaG93VG90YWw6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1ByZXY6IHRydWUsXG4gICAgICBzaG93TmV4dDogdHJ1ZSxcbiAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmaXJzdCgpIHtcbiAgICAgIHJldHVybiAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZSArIDFcbiAgICB9LFxuXG4gICAgbGFzdCgpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLmZpcnN0ICsgdGhpcy5wYWdlU2l6ZSAtIDEsIHRoaXMudG90YWwpXG4gICAgfSxcblxuICAgIG51bVBhZ2VzKCkge1xuICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLnRvdGFsIC8gdGhpcy5wYWdlU2l6ZSlcbiAgICB9LFxuXG4gICAgYnV0dG9ucygpIHtcbiAgICAgIGNvbnN0IHsgc2hvd1ByZXYsIHNob3dOZXh0LCBjdXJyZW50UGFnZSwgbnVtUGFnZXMgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHNob3dMZW5ndGggPSBzaG93UHJldiArIHNob3dOZXh0ICsgMVxuXG4gICAgICBsZXQgc3RhcnQgPSAxXG4gICAgICBsZXQgZW5kID0gMVxuICAgICAgaWYgKG51bVBhZ2VzIDw9IHNob3dMZW5ndGgpIHtcbiAgICAgICAgZW5kID0gbnVtUGFnZXNcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFBhZ2UgPD0gc2hvd1ByZXYgKyAxKSB7XG4gICAgICAgIGVuZCA9IHNob3dMZW5ndGhcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFBhZ2UgPj0gbnVtUGFnZXMgLSBzaG93TmV4dCkge1xuICAgICAgICBlbmQgPSBudW1QYWdlc1xuICAgICAgICBzdGFydCA9IG51bVBhZ2VzIC0gc2hvd0xlbmd0aCArIDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0ID0gY3VycmVudFBhZ2UgLSBzaG93UHJldlxuICAgICAgICBlbmQgPSBjdXJyZW50UGFnZSArIHNob3dOZXh0XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvbnMgPSBbXVxuICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgaW5kZXg6IGN1cnJlbnRQYWdlIC0gMSxcbiAgICAgICAgdHlwZTogJ3ByZXYnLFxuICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPD0gMVxuICAgICAgfSlcbiAgICAgIGlmIChzdGFydCA+PSAyKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7IGluZGV4OiAxLCB0ZXh0OiAxIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgPiAyKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IE1hdGgubWF4KDEsIGN1cnJlbnRQYWdlIC0gMTApLFxuICAgICAgICAgIHR5cGU6ICdlbGxpcHNpcy1wcmV2J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgdGV4dDogaSxcbiAgICAgICAgICBhY3RpdmU6IGkgPT09IGN1cnJlbnRQYWdlXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoZW5kIDwgbnVtUGFnZXMgLSAxKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IE1hdGgubWluKG51bVBhZ2VzLCBjdXJyZW50UGFnZSArIDEwKSxcbiAgICAgICAgICB0eXBlOiAnZWxsaXBzaXMtbmV4dCdcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPD0gbnVtUGFnZXMgLSAxKSB7XG4gICAgICAgIGJ1dHRvbnMucHVzaCh7IGluZGV4OiBudW1QYWdlcywgdGV4dDogbnVtUGFnZXMgfSlcbiAgICAgIH1cbiAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgIGluZGV4OiBjdXJyZW50UGFnZSArIDEsXG4gICAgICAgIHR5cGU6ICduZXh0JyxcbiAgICAgICAgZGlzYWJsZWQ6IGN1cnJlbnRQYWdlID49IG51bVBhZ2VzXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gYnV0dG9uc1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHBhZ2UocGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2VcbiAgICB9LFxuXG4gICAgcGFnZVNpemUoKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA+IHRoaXMubnVtUGFnZXMpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMubnVtUGFnZXNcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFBhZ2UodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byAhPT0gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6cGFnZScsIHRvKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnBhZ2VcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0QnV0dG9uQ2xhc3NlcyhidXR0b24pIHtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSB7XG4gICAgICAgICdkaXRvLXNlbGVjdGVkJzogYnV0dG9uLmFjdGl2ZVxuICAgICAgfVxuICAgICAgaWYgKGJ1dHRvbi50eXBlKSB7XG4gICAgICAgIGNsYXNzZXNbYGRpdG8tYnV0dG9uLSR7YnV0dG9uLnR5cGV9YF0gPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3Nlc1xuICAgIH0sXG5cbiAgICBvbkNsaWNrQnV0dG9uKGJ1dHRvbikge1xuICAgICAgaWYgKFxuICAgICAgICBidXR0b24uaW5kZXggJiZcbiAgICAgICAgIWJ1dHRvbi5kaXNhYmxlZCAmJlxuICAgICAgICBidXR0b24uaW5kZXggIT09IHRoaXMuY3VycmVudFBhZ2VcbiAgICAgICkge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gYnV0dG9uLmluZGV4XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYWdpbmF0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcblxuICAuZGl0by1wYWdpbmF0aW9uLXRvdGFsIHtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcblxuICAgIG1hcmdpbjogMCAwLjVlbTtcbiAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbiB7XG4gICAgdHJhbnNpdGlvbjpcbiAgICAgIGFsbCAwLjNzIGVhc2UsXG4gICAgICBjb2xvciAwcyxcbiAgICAgIGJhY2tncm91bmQgMHMsXG4gICAgICBib3JkZXIgMHM7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICBwYWRkaW5nOiAwIDAuNWVtO1xuXG4gICAgJi1wcmV2LFxuICAgICYtbmV4dCB7XG4gICAgICAmOjpiZWZvcmUge1xuICAgICAgICBAZXh0ZW5kICVpY29uLWFycm93O1xuICAgICAgfVxuICAgIH1cblxuICAgICYtcHJldjo6YmVmb3JlIHtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTtcbiAgICB9XG5cbiAgICAmLWVsbGlwc2lzLXByZXYsXG4gICAgJi1lbGxpcHNpcy1uZXh0IHtcbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tZWxsaXBzaXM7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXI6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tY2hldnJvbnM7XG4gICAgICB9XG5cbiAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICBib3JkZXI6IDA7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgY29sb3I6ICRjb2xvci10ZXh0O1xuXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gICAgICB9XG5cbiAgICAgICY6YWN0aXZlIHtcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLWVsbGlwc2lzLXByZXY6OmJlZm9yZSB7XG4gICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXN3aXRjaChcbiAgOmNsYXNzPVwiY2xhc3Nlc1wiXG4gIDpzdHlsZT1cInN0eWxlc1wiXG4pXG4gIC5kaXRvLXN3aXRjaC1wYW5lXG4gICAgaW5wdXQoXG4gICAgICA6aWQ9XCJpZFwiXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICAgIHYtbW9kZWw9XCJjaGVja2VkXCJcbiAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICA6bmFtZT1cIm5hbWVcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIClcbiAgICAuZGl0by1zd2l0Y2gtYnV0dG9uXG4gICAgc3Bhbi5kaXRvLXN3aXRjaC1sYWJlbChcbiAgICAgIHYtaWY9XCJsYWJlbHNcIlxuICAgIClcbiAgICAgIHNsb3QoXG4gICAgICAgIHYtaWY9XCJjaGVja2VkXCJcbiAgICAgICAgbmFtZT1cImNoZWNrZWRcIlxuICAgICAgKSB7eyBsYWJlbHMuY2hlY2tlZCB8fCAnb24nIH19XG4gICAgICBzbG90KFxuICAgICAgICB2LWVsc2VcbiAgICAgICAgbmFtZT1cInVuY2hlY2tlZFwiXG4gICAgICApIHt7IGxhYmVscy51bmNoZWNrZWQgfHwgJ29mZicgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ2NoYW5nZSddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGlkOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBsYWJlbHM6IHsgdHlwZTogW09iamVjdCwgQm9vbGVhbl0sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjaGVja2VkOiB0aGlzLm1vZGVsVmFsdWVcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjbGFzc2VzKCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgdGhpcy4kYXR0cnMuY2xhc3MsXG4gICAgICAgIHtcbiAgICAgICAgICAnZGl0by1jaGVja2VkJzogdGhpcy5jaGVja2VkLFxuICAgICAgICAgICdkaXRvLWRpc2FibGVkJzogdGhpcy5kaXNhYmxlZFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIGNvbnN0IHsgbGFiZWxzOiB7IGNoZWNrZWQsIHVuY2hlY2tlZCB9ID0ge30gfSA9IHRoaXNcbiAgICAgIC8vIENhbGN1bGF0ZSBgLS1zd2l0Y2gtd2lkdGhgIGluIGByZW1gLCBiYXNlZCBvbiBsYWJlbCBsZW5ndGguXG4gICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCgwLCBjaGVja2VkPy5sZW5ndGgsIHVuY2hlY2tlZD8ubGVuZ3RoKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJy0tc3dpdGNoLXdpZHRoJzogbGVuZ3RoID8gYCR7bGVuZ3RoICogMS41fXJlbWAgOiBudWxsXG4gICAgICB9XG4gICAgfSxcblxuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICBjb25zdCB7IGNsYXNzOiBfLCAuLi5hdHRyaWJ1dGVzIH0gPSB0aGlzLiRhdHRyc1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKG1vZGVsVmFsdWUpIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9IG1vZGVsVmFsdWVcbiAgICB9LFxuXG4gICAgY2hlY2tlZChjaGVja2VkKSB7XG4gICAgICBpZiAoY2hlY2tlZCAhPT0gdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgY2hlY2tlZClcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgY2hlY2tlZClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zd2l0Y2gge1xuICAvLyBVc2Ugd2hvbGUgbXVsdGlwbGVzIG9mIGByZW1gIGZvciBzaXplcyBhbmQgYHB4YCBtYXJnaW5zL3BhZGRpbmcgYWxvbmdcbiAgLy8gd2l0aCBgY2FsYygpYCB0byBlbmQgdXAgd2l0aCBldmVuIHBpeGVsIHNpemVzLlxuICAtLXN3aXRjaC13aWR0aDogNGVtO1xuICAtLXN3aXRjaC1oZWlnaHQ6IDJlbTtcbiAgLS1zd2l0Y2gtbWFyZ2luOiAycHg7XG4gIC0tc3dpdGNoLXBhZGRpbmc6IDNweDtcbiAgLS1zd2l0Y2gtc3BlZWQ6IDMwMG1zO1xuICAtLWxhYmVsLW1hcmdpbjogMC41ZW07XG4gIC0td2lkdGg6IGNhbGModmFyKC0tc3dpdGNoLXdpZHRoKSAtIDIgKiB2YXIoLS1zd2l0Y2gtbWFyZ2luKSk7XG4gIC0taGVpZ2h0OiBjYWxjKHZhcigtLXN3aXRjaC1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1tYXJnaW4pKTtcbiAgLS1vZmZzZXQ6IGNhbGModmFyKC0td2lkdGgpIC0gdmFyKC0taGVpZ2h0KSk7XG5cbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGhlaWdodDogdmFyKC0tc3dpdGNoLWhlaWdodCk7XG4gIC8vIFRvIG1ha2UgaW5saW5lIGxhYmVscyBhcHBlYXIgb24gY29uc2lzdGVudCBiYXNlbGluZTpcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgLmRpdG8tc3dpdGNoLXBhbmUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogdmFyKC0td2lkdGgpO1xuICAgIGhlaWdodDogdmFyKC0taGVpZ2h0KTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1wYW5lLFxuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIHRvcDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgfVxuXG4gIGlucHV0IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYm9yZGVyLXJhZGl1czogMWVtO1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodDtcbiAgICB0cmFuc2l0aW9uOlxuICAgICAgYm9yZGVyLWNvbG9yIDAuM3MsXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuM3M7XG4gIH1cblxuICAuZGl0by1zd2l0Y2gtYnV0dG9uIHtcbiAgICAtLXNpemU6IGNhbGModmFyKC0taGVpZ2h0KSAtIDIgKiB2YXIoLS1zd2l0Y2gtcGFkZGluZykpO1xuXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogdmFyKC0tc3dpdGNoLXBhZGRpbmcpO1xuICAgIGxlZnQ6IHZhcigtLXN3aXRjaC1wYWRkaW5nKTtcbiAgICB3aWR0aDogdmFyKC0tc2l6ZSk7XG4gICAgaGVpZ2h0OiB2YXIoLS1zaXplKTtcbiAgICBib3JkZXItcmFkaXVzOiBjYWxjKHZhcigtLXNpemUpIC8gMik7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLXN3aXRjaC1zcGVlZCk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWJ1dHRvbixcbiAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiB2YXIoLS1sYWJlbC1tYXJnaW4pO1xuICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgfVxuXG4gICYuZGl0by1jaGVja2VkIHtcbiAgICBpbnB1dCB7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cblxuICAgIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKHZhcigtLW9mZnNldCkpO1xuICAgIH1cblxuICAgIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgICBsZWZ0OiB2YXIoLS1sYWJlbC1tYXJnaW4pO1xuICAgICAgcmlnaHQ6IHVuc2V0O1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1kaXNhYmxlZCB7XG4gICAgQGV4dGVuZCAlYnV0dG9uLWRpc2FibGVkO1xuICB9XG5cbiAgJjpmb2N1cy13aXRoaW46bm90KDpob3Zlcikge1xuICAgIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgICAgYm94LXNoYWRvdzogJHNoYWRvdy1mb2N1cztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8c2NyaXB0PlxuaW1wb3J0IHsgaCBhcyBjcmVhdGVFbGVtZW50LCBUcmFuc2l0aW9uIH0gZnJvbSAndnVlJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZnVuY3Rpb24gVHJhbnNpdGlvbkhlaWdodCh7IGVuYWJsZWQgfSwgeyBzbG90cyB9KSB7XG4gIHJldHVybiBlbmFibGVkXG4gICAgPyBjcmVhdGVFbGVtZW50KFRyYW5zaXRpb24sIHByb3BzLCBzbG90cylcbiAgICA6IHNsb3RzLmRlZmF1bHQoKVxufVxuXG5UcmFuc2l0aW9uSGVpZ2h0LnByb3BzID0ge1xuICBlbmFibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2l0aW9uSGVpZ2h0XG5cbmNvbnN0IHNldFN0eWxlID0gKGVsZW1lbnQsIHN0eWxlKSA9PiBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXG5jb25zdCBuZXh0VGltZW91dCA9IGNhbGxiYWNrID0+IHNldFRpbWVvdXQoY2FsbGJhY2ssIDApXG5cbi8vIEZvcmNlIHJlcGFpbnQgdG8gbWFrZSBzdXJlIHRoZSBhbmltYXRpb24gaXMgdHJpZ2dlcmVkIGNvcnJlY3RseS5cbmNvbnN0IGZvcmNlUmVwYWludCA9IGVsZW1lbnQgPT4gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5oZWlnaHRcblxuY29uc3QgcHJvcHMgPSB7XG4gIG5hbWU6ICdkaXRvLWhlaWdodCcsXG5cbiAgb25BZnRlckVudGVyKGVsZW1lbnQpIHtcbiAgICAvLyBBIHRpbWVvdXQgYmVmb3JlIHNldHRpbmcgc3R5bGUgaXMgb25seSByZWFsbHkgbmVlZGVkIGFmdGVyIGNhbGxzIHRvXG4gICAgLy8gYGZvcmNlUmVwYWludCgpYCwgYnV0IHVzaW5nIG9uZSBoZXJlIHRvbyBwcmVzZXJ2ZXMgZXhlY3V0aW9uIHNlcXVlbmNlIHNvXG4gICAgLy8gdGhhdCB0aGUgY2FsbCBmcm9tIGBlbnRlcigpYCBjYW4gbmV2ZXIgb3V0cnVuIHRoZSBvbmUgZnJvbSBgYWZ0ZXJFbnRlcigpYFxuICAgIG5leHRUaW1lb3V0KCgpID0+IHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0OiBudWxsIH0pKVxuICB9LFxuXG4gIG9uRW50ZXIoZWxlbWVudCkge1xuICAgIC8vIEZvciBzb21lIHJlYXNvbiB3ZSdyZSBnZXR0aW5nIHR3byBgb25FbnRlcigpYCBjYWxscyBwZXIgdHJhbnNpdGlvbixcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIGlnbm9yZSB0aGUgc2Vjb25kIG9uZS4gVGhpcyBtaWdodCBiZSBsaW5rZWQgdG8gdGhlIHVzZVxuICAgIC8vIG9mIGBuZXh0VGltZW91dCgpYCwgd2hpY2ggaXMgcmVxdWlyZWQgdG8gZ2V0IHRoZSBjb3JyZWN0IHZhbHVlIGZvclxuICAgIC8vIGBoZWlnaHRgLCBiYXNlZCBvbiBgJi0tbGFiZWwtdmVydGljYWxgIGNhbGN1bGF0aW9ucy5cbiAgICBjb25zdCB7IHdpZHRoIH0gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgc2V0U3R5bGUoZWxlbWVudCwge1xuICAgICAgd2lkdGgsXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgICAgaGVpZ2h0OiAnYXV0bydcbiAgICB9KVxuICAgIG5leHRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHsgaGVpZ2h0IH0gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgICBzZXRTdHlsZShlbGVtZW50LCB7XG4gICAgICAgIHdpZHRoOiBudWxsLFxuICAgICAgICBwb3NpdGlvbjogbnVsbCxcbiAgICAgICAgdmlzaWJpbGl0eTogbnVsbCxcbiAgICAgICAgaGVpZ2h0OiAwXG4gICAgICB9KVxuICAgICAgZm9yY2VSZXBhaW50KGVsZW1lbnQpXG4gICAgICBuZXh0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodCB9KSlcbiAgICB9KVxuICB9LFxuXG4gIG9uTGVhdmUoZWxlbWVudCkge1xuICAgIGNvbnN0IHsgaGVpZ2h0IH0gPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgc2V0U3R5bGUoZWxlbWVudCwgeyBoZWlnaHQgfSlcbiAgICBmb3JjZVJlcGFpbnQoZWxlbWVudClcbiAgICBuZXh0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodDogMCB9KSlcbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuJGR1cmF0aW9uOiAwLjE1cztcblxuLmRpdG8taGVpZ2h0LWVudGVyLWFjdGl2ZSxcbi5kaXRvLWhlaWdodC1sZWF2ZS1hY3RpdmUge1xuICB0cmFuc2l0aW9uOiBoZWlnaHQgJGR1cmF0aW9uICRlYXNlLW91dC1xdWFydDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmRpdG8taGVpZ2h0LWVudGVyLWFjdGl2ZSB7XG4gIGFuaW1hdGlvbjogZGl0by1zbGlkZS1lbnRlciAkZHVyYXRpb24gJGVhc2Utb3V0LXF1YXJ0O1xufVxuXG4uZGl0by1oZWlnaHQtbGVhdmUtYWN0aXZlIHtcbiAgYW5pbWF0aW9uOiBkaXRvLXNsaWRlLWxlYXZlICRkdXJhdGlvbiAkZWFzZS1vdXQtcXVhcnQ7XG59XG5cbi5kaXRvLWhlaWdodC1lbnRlci1mcm9tLFxuLmRpdG8taGVpZ2h0LWxlYXZlLXRvIHtcbiAgaGVpZ2h0OiAwO1xufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IG1hcmtSYXcsIHVzZVNsb3RzLCBDb21tZW50IH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgaXNTdHJpbmcsIGFzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzVk5vZGVDb250ZW50KHZub2RlKSB7XG4gIHJldHVybiB2bm9kZSAmJiBhc0FycmF5KHZub2RlKS5zb21lKHZub2RlID0+IHZub2RlLnR5cGUgIT09IENvbW1lbnQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNTbG90Q29udGVudChzbG90LCBwcm9wcyA9IHt9KSB7XG4gIHNsb3QgPSBpc1N0cmluZyhzbG90KSA/IHVzZVNsb3RzKClbc2xvdF0gOiBzbG90XG4gIHJldHVybiBoYXNWTm9kZUNvbnRlbnQoc2xvdD8uKHByb3BzKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhdyh2YWx1ZSkge1xuICByZXR1cm4gbWFya1Jhdyh7IHZhbHVlIH0pXG59XG4iXSwibmFtZXMiOlsiZGVzY3JpYmVEYXRlIiwiZGF0ZSIsImFsdGVyRGF0ZSIsIm92ZXJyaWRlcyIsInBhcnNlRGF0ZSIsInN0cmluZyIsImxvY2FsZSIsInRpbWUiLCJ0aW1lRGVmYXVsdCIsImRheSIsInNlcDEiLCJtb250aCIsInNlcDIiLCJ5ZWFyIiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIiwiZ2V0RGF0ZVBhcnRzIiwiZ2V0TW9udGhJbmRleCIsImlzVmFsaWRUaW1lUGFydCIsInBhcnQiLCJnZXREYXRlUGFydEF0UG9zaXRpb24iLCJwb3NpdGlvbiIsInBhcnRzIiwiZ2V0UG9zaXRpb24iLCJsZW5ndGgiLCJwb3MiLCJpbmRleCIsIl9hIiwib2Zmc2V0IiwiaXNVUyIsInZhbHVlcyIsInN0YXJ0IiwiZW5kIiwidmFsdWUiLCJtYXRjaCIsInNob3J0Rm9ybWF0IiwibG9uZ0Zvcm1hdCIsIndhcm4iLCJtc2ciLCJhcmdzIiwiYWN0aXZlRWZmZWN0U2NvcGUiLCJyZWNvcmRFZmZlY3RTY29wZSIsImVmZmVjdCIsInNjb3BlIiwiYWN0aXZlRWZmZWN0IiwiUmVhY3RpdmVFZmZlY3QiLCJmbiIsInRyaWdnZXIiLCJzY2hlZHVsZXIiLCJwYXVzZVRyYWNraW5nIiwiZGVwIiwidHJpZ2dlckNvbXB1dGVkIiwicmVzZXRUcmFja2luZyIsInYiLCJsYXN0U2hvdWxkVHJhY2siLCJzaG91bGRUcmFjayIsImxhc3RFZmZlY3QiLCJwcmVDbGVhbnVwRWZmZWN0IiwicG9zdENsZWFudXBFZmZlY3QiLCJjb21wdXRlZCIsImVmZmVjdDIiLCJpIiwiY2xlYW51cERlcEVmZmVjdCIsInRyYWNrSWQiLCJwYXVzZVNjaGVkdWxlU3RhY2siLCJ0cmFja1N0YWNrIiwibGFzdCIsInBhdXNlU2NoZWR1bGluZyIsInJlc2V0U2NoZWR1bGluZyIsInF1ZXVlRWZmZWN0U2NoZWR1bGVycyIsInRyYWNrRWZmZWN0IiwiZGVidWdnZXJFdmVudEV4dHJhSW5mbyIsIm9sZERlcCIsImV4dGVuZCIsInRyaWdnZXJFZmZlY3RzIiwiZGlydHlMZXZlbCIsImxhc3REaXJ0eUxldmVsIiwiY3JlYXRlRGVwIiwiY2xlYW51cCIsInRhcmdldE1hcCIsIklURVJBVEVfS0VZIiwiTUFQX0tFWV9JVEVSQVRFX0tFWSIsInRyYWNrIiwidGFyZ2V0IiwidHlwZSIsImtleSIsImRlcHNNYXAiLCJuZXdWYWx1ZSIsIm9sZFZhbHVlIiwib2xkVGFyZ2V0IiwiZGVwcyIsImlzQXJyYXkiLCJuZXdMZW5ndGgiLCJrZXkyIiwiaXNTeW1ib2wiLCJpc0ludGVnZXJLZXkiLCJpc01hcCIsImlzTm9uVHJhY2thYmxlS2V5cyIsIm1ha2VNYXAiLCJidWlsdEluU3ltYm9scyIsImFycmF5SW5zdHJ1bWVudGF0aW9ucyIsImNyZWF0ZUFycmF5SW5zdHJ1bWVudGF0aW9ucyIsImluc3RydW1lbnRhdGlvbnMiLCJhcnIiLCJ0b1JhdyIsImwiLCJyZXMiLCJoYXNPd25Qcm9wZXJ0eSIsIm9iaiIsIkJhc2VSZWFjdGl2ZUhhbmRsZXIiLCJfaXNSZWFkb25seSIsIl9zaGFsbG93IiwicmVjZWl2ZXIiLCJpc1JlYWRvbmx5MiIsInNoYWxsb3ciLCJzaGFsbG93UmVhZG9ubHlNYXAiLCJyZWFkb25seU1hcCIsInNoYWxsb3dSZWFjdGl2ZU1hcCIsInJlYWN0aXZlTWFwIiwidGFyZ2V0SXNBcnJheSIsImhhc093biIsImlzUmVmIiwiaXNPYmplY3QiLCJyZWFkb25seSIsInJlYWN0aXZlIiwiTXV0YWJsZVJlYWN0aXZlSGFuZGxlciIsImlzT2xkVmFsdWVSZWFkb25seSIsImlzUmVhZG9ubHkiLCJpc1NoYWxsb3ciLCJoYWRLZXkiLCJyZXN1bHQiLCJoYXNDaGFuZ2VkIiwiUmVhZG9ubHlSZWFjdGl2ZUhhbmRsZXIiLCJtdXRhYmxlSGFuZGxlcnMiLCJyZWFkb25seUhhbmRsZXJzIiwic2hhbGxvd1JlYWRvbmx5SGFuZGxlcnMiLCJ0b1NoYWxsb3ciLCJnZXRQcm90byIsImdldCIsInJhd1RhcmdldCIsInJhd0tleSIsImhhczIiLCJ3cmFwIiwidG9SZWFkb25seSIsInRvUmVhY3RpdmUiLCJoYXMiLCJzaXplIiwiYWRkIiwic2V0IiwiZ2V0MiIsImNoZWNrSWRlbnRpdHlLZXlzIiwiZGVsZXRlRW50cnkiLCJjbGVhciIsImhhZEl0ZW1zIiwiY3JlYXRlRm9yRWFjaCIsImNhbGxiYWNrIiwidGhpc0FyZyIsIm9ic2VydmVkIiwiY3JlYXRlSXRlcmFibGVNZXRob2QiLCJtZXRob2QiLCJ0YXJnZXRJc01hcCIsImlzUGFpciIsImlzS2V5T25seSIsImlubmVySXRlcmF0b3IiLCJkb25lIiwiY3JlYXRlUmVhZG9ubHlNZXRob2QiLCJjYXBpdGFsaXplIiwiY3JlYXRlSW5zdHJ1bWVudGF0aW9ucyIsIm11dGFibGVJbnN0cnVtZW50YXRpb25zMiIsInNoYWxsb3dJbnN0cnVtZW50YXRpb25zMiIsInJlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczIiLCJzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMiIsIm11dGFibGVJbnN0cnVtZW50YXRpb25zIiwicmVhZG9ubHlJbnN0cnVtZW50YXRpb25zIiwic2hhbGxvd0luc3RydW1lbnRhdGlvbnMiLCJzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zIiwiY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyIiwibXV0YWJsZUNvbGxlY3Rpb25IYW5kbGVycyIsInJlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzIiwic2hhbGxvd1JlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzIiwidG9SYXdUeXBlIiwidGFyZ2V0VHlwZU1hcCIsInJhd1R5cGUiLCJnZXRUYXJnZXRUeXBlIiwiY3JlYXRlUmVhY3RpdmVPYmplY3QiLCJzaGFsbG93UmVhZG9ubHkiLCJiYXNlSGFuZGxlcnMiLCJjb2xsZWN0aW9uSGFuZGxlcnMiLCJwcm94eU1hcCIsImV4aXN0aW5nUHJveHkiLCJ0YXJnZXRUeXBlIiwicHJveHkiLCJpc1JlYWN0aXZlIiwiaXNQcm94eSIsInJhdyIsIm1hcmtSYXciLCJkZWYiLCJyIiwidW5yZWYiLCJyZWYyIiwic2hhbGxvd1Vud3JhcEhhbmRsZXJzIiwicHJveHlSZWZzIiwib2JqZWN0V2l0aFJlZnMiLCJzdGFjayIsInB1c2hXYXJuaW5nQ29udGV4dCIsInZub2RlIiwicG9wV2FybmluZ0NvbnRleHQiLCJ3YXJuJDEiLCJpbnN0YW5jZSIsImFwcFdhcm5IYW5kbGVyIiwidHJhY2UiLCJnZXRDb21wb25lbnRUcmFjZSIsImNhbGxXaXRoRXJyb3JIYW5kbGluZyIsImZvcm1hdENvbXBvbmVudE5hbWUiLCJ3YXJuQXJncyIsImZvcm1hdFRyYWNlIiwiY3VycmVudFZOb2RlIiwibm9ybWFsaXplZFN0YWNrIiwicGFyZW50SW5zdGFuY2UiLCJsb2dzIiwiZW50cnkiLCJmb3JtYXRUcmFjZUVudHJ5IiwicmVjdXJzZUNvdW50IiwicG9zdGZpeCIsImlzUm9vdCIsIm9wZW4iLCJjbG9zZSIsImZvcm1hdFByb3BzIiwicHJvcHMiLCJrZXlzIiwiZm9ybWF0UHJvcCIsImlzU3RyaW5nIiwiaXNGdW5jdGlvbiIsImFzc2VydE51bWJlciIsInZhbCIsIkVycm9yVHlwZVN0cmluZ3MkMSIsImVyciIsImhhbmRsZUVycm9yIiwiY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmciLCJpc1Byb21pc2UiLCJ0aHJvd0luRGV2IiwiY29udGV4dFZOb2RlIiwiY3VyIiwiZXhwb3NlZEluc3RhbmNlIiwiZXJyb3JJbmZvIiwiZXJyb3JDYXB0dXJlZEhvb2tzIiwiYXBwRXJyb3JIYW5kbGVyIiwibG9nRXJyb3IiLCJpbmZvIiwiaXNGbHVzaGluZyIsImlzRmx1c2hQZW5kaW5nIiwicXVldWUiLCJmbHVzaEluZGV4IiwicGVuZGluZ1Bvc3RGbHVzaENicyIsImFjdGl2ZVBvc3RGbHVzaENicyIsInBvc3RGbHVzaEluZGV4IiwicmVzb2x2ZWRQcm9taXNlIiwiY3VycmVudEZsdXNoUHJvbWlzZSIsIlJFQ1VSU0lPTl9MSU1JVCIsIm5leHRUaWNrIiwicCIsImZpbmRJbnNlcnRpb25JbmRleCIsImlkIiwibWlkZGxlIiwibWlkZGxlSm9iIiwibWlkZGxlSm9iSWQiLCJnZXRJZCIsInF1ZXVlSm9iIiwiam9iIiwicXVldWVGbHVzaCIsImZsdXNoSm9icyIsInF1ZXVlUG9zdEZsdXNoQ2IiLCJjYiIsImZsdXNoUG9zdEZsdXNoQ2JzIiwic2VlbiIsImRlZHVwZWQiLCJhIiwiYiIsImNoZWNrUmVjdXJzaXZlVXBkYXRlcyIsImNvbXBhcmF0b3IiLCJkaWZmIiwiY2hlY2siLCJOT09QIiwiY291bnQiLCJjb21wb25lbnROYW1lIiwiZ2V0Q29tcG9uZW50TmFtZSIsImhtckRpcnR5Q29tcG9uZW50cyIsImdldEdsb2JhbFRoaXMiLCJ0cnlXcmFwIiwiY3JlYXRlUmVjb3JkIiwicmVyZW5kZXIiLCJyZWxvYWQiLCJtYXAiLCJpbml0aWFsRGVmIiwibm9ybWFsaXplQ2xhc3NDb21wb25lbnQiLCJjb21wb25lbnQiLCJpc0NsYXNzQ29tcG9uZW50IiwibmV3UmVuZGVyIiwicmVjb3JkIiwibmV3Q29tcCIsInVwZGF0ZUNvbXBvbmVudERlZiIsImluc3RhbmNlcyIsIm9sZENvbXAiLCJhcmciLCJlIiwiZGV2dG9vbHMkMSIsImJ1ZmZlciIsImRldnRvb2xzTm90SW5zdGFsbGVkIiwiZW1pdCQxIiwiZXZlbnQiLCJzZXREZXZ0b29sc0hvb2skMSIsImhvb2siLCJfYiIsIm5ld0hvb2siLCJkZXZ0b29sc0NvbXBvbmVudFVwZGF0ZWQiLCJjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2siLCJjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UiLCJjdXJyZW50U2NvcGVJZCIsInNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSIsInByZXYiLCJ3aXRoQ3R4IiwiY3R4IiwiaXNOb25TY29wZWRTbG90IiwicmVuZGVyRm5XaXRoQ29udGV4dCIsInNldEJsb2NrVHJhY2tpbmciLCJwcmV2SW5zdGFuY2UiLCJDT01QT05FTlRTIiwicmVzb2x2ZUNvbXBvbmVudCIsIm5hbWUiLCJtYXliZVNlbGZSZWZlcmVuY2UiLCJyZXNvbHZlQXNzZXQiLCJOVUxMX0RZTkFNSUNfQ09NUE9ORU5UIiwid2Fybk1pc3NpbmciLCJjdXJyZW50SW5zdGFuY2UiLCJDb21wb25lbnQiLCJzZWxmTmFtZSIsImNhbWVsaXplIiwicmVzb2x2ZSIsImV4dHJhIiwicmVnaXN0cnkiLCJpc1N1c3BlbnNlIiwicXVldWVFZmZlY3RXaXRoU3VzcGVuc2UiLCJzdXNwZW5zZSIsInNzckNvbnRleHRLZXkiLCJ1c2VTU1JDb250ZXh0IiwiaW5qZWN0IiwiSU5JVElBTF9XQVRDSEVSX1ZBTFVFIiwiZG9XYXRjaCIsInNvdXJjZSIsImltbWVkaWF0ZSIsImRlZXAiLCJmbHVzaCIsIm9uY2UiLCJvblRyYWNrIiwib25UcmlnZ2VyIiwiRU1QVFlfT0JKIiwiX2NiIiwidW53YXRjaCIsIndhcm5JbnZhbGlkU291cmNlIiwicyIsInJlYWN0aXZlR2V0dGVyIiwic291cmNlMiIsInRyYXZlcnNlIiwiZ2V0dGVyIiwiZm9yY2VUcmlnZ2VyIiwiaXNNdWx0aVNvdXJjZSIsImlzU2hhbGxvdyQxIiwib25DbGVhbnVwIiwiYmFzZUdldHRlciIsInNzckNsZWFudXAiLCJpc0luU1NSQ29tcG9uZW50U2V0dXAiLCJxdWV1ZVBvc3RSZW5kZXJFZmZlY3QiLCJpbnN0YW5jZVdhdGNoIiwib3B0aW9ucyIsInB1YmxpY1RoaXMiLCJjcmVhdGVQYXRoR2V0dGVyIiwicmVzZXQiLCJzZXRDdXJyZW50SW5zdGFuY2UiLCJwYXRoIiwic2VnbWVudHMiLCJkZXB0aCIsImN1cnJlbnREZXB0aCIsImlzU2V0IiwiaXNQbGFpbk9iamVjdCIsIndpdGhEaXJlY3RpdmVzIiwiZGlyZWN0aXZlcyIsImdldEV4cG9zZVByb3h5IiwiYmluZGluZ3MiLCJkaXIiLCJtb2RpZmllcnMiLCJsZWF2ZUNiS2V5IiwiZW50ZXJDYktleSIsInVzZVRyYW5zaXRpb25TdGF0ZSIsInN0YXRlIiwib25Nb3VudGVkIiwib25CZWZvcmVVbm1vdW50IiwiVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IiLCJCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyIsIkJhc2VUcmFuc2l0aW9uSW1wbCIsInNsb3RzIiwiZ2V0Q3VycmVudEluc3RhbmNlIiwicHJldlRyYW5zaXRpb25LZXkiLCJjaGlsZHJlbiIsImdldFRyYW5zaXRpb25SYXdDaGlsZHJlbiIsImNoaWxkIiwiaGFzRm91bmQiLCJjIiwiQ29tbWVudCIsInJhd1Byb3BzIiwibW9kZSIsImVtcHR5UGxhY2Vob2xkZXIiLCJpbm5lckNoaWxkIiwiZ2V0S2VlcEFsaXZlQ2hpbGQiLCJlbnRlckhvb2tzIiwicmVzb2x2ZVRyYW5zaXRpb25Ib29rcyIsInNldFRyYW5zaXRpb25Ib29rcyIsIm9sZENoaWxkIiwib2xkSW5uZXJDaGlsZCIsInRyYW5zaXRpb25LZXlDaGFuZ2VkIiwiZ2V0VHJhbnNpdGlvbktleSIsImlzU2FtZVZOb2RlVHlwZSIsImxlYXZpbmdIb29rcyIsImVsIiwiZWFybHlSZW1vdmUiLCJkZWxheWVkTGVhdmUiLCJsZWF2aW5nVk5vZGVzQ2FjaGUiLCJnZXRMZWF2aW5nTm9kZXNGb3JUeXBlIiwiQmFzZVRyYW5zaXRpb24iLCJsZWF2aW5nVk5vZGVzIiwiYXBwZWFyIiwicGVyc2lzdGVkIiwib25CZWZvcmVFbnRlciIsIm9uRW50ZXIiLCJvbkFmdGVyRW50ZXIiLCJvbkVudGVyQ2FuY2VsbGVkIiwib25CZWZvcmVMZWF2ZSIsIm9uTGVhdmUiLCJvbkFmdGVyTGVhdmUiLCJvbkxlYXZlQ2FuY2VsbGVkIiwib25CZWZvcmVBcHBlYXIiLCJvbkFwcGVhciIsIm9uQWZ0ZXJBcHBlYXIiLCJvbkFwcGVhckNhbmNlbGxlZCIsImNhbGxIb29rIiwiY2FsbEFzeW5jSG9vayIsImhvb2syIiwiaG9va3MiLCJsZWF2aW5nVk5vZGUiLCJhZnRlckhvb2siLCJjYW5jZWxIb29rIiwiY2FsbGVkIiwiY2FuY2VsbGVkIiwicmVtb3ZlIiwidm5vZGUyIiwiaXNLZWVwQWxpdmUiLCJjbG9uZVZOb2RlIiwia2VlcENvbW1lbnQiLCJwYXJlbnRLZXkiLCJyZXQiLCJrZXllZEZyYWdtZW50Q291bnQiLCJGcmFnbWVudCIsImlzQXN5bmNXcmFwcGVyIiwiaW5qZWN0SG9vayIsInByZXBlbmQiLCJ3cmFwcGVkSG9vayIsImFwaU5hbWUiLCJ0b0hhbmRsZXJLZXkiLCJjcmVhdGVIb29rIiwibGlmZWN5Y2xlIiwicmVuZGVyTGlzdCIsInJlbmRlckl0ZW0iLCJjYWNoZSIsImNhY2hlZCIsIml0ZW0iLCJyZW5kZXJTbG90IiwiZmFsbGJhY2siLCJub1Nsb3R0ZWQiLCJjcmVhdGVWTm9kZSIsInNsb3QiLCJvcGVuQmxvY2siLCJ2YWxpZFNsb3RDb250ZW50IiwiZW5zdXJlVmFsaWRWTm9kZSIsInJlbmRlcmVkIiwiY3JlYXRlQmxvY2siLCJ2bm9kZXMiLCJpc1ZOb2RlIiwiZ2V0UHVibGljSW5zdGFuY2UiLCJpc1N0YXRlZnVsQ29tcG9uZW50IiwicHVibGljUHJvcGVydGllc01hcCIsInJlc29sdmVNZXJnZWRPcHRpb25zIiwiaXNSZXNlcnZlZFByZWZpeCIsImhhc1NldHVwQmluZGluZyIsIlB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyIsInNldHVwU3RhdGUiLCJkYXRhIiwiYWNjZXNzQ2FjaGUiLCJhcHBDb250ZXh0Iiwibm9ybWFsaXplZFByb3BzIiwibiIsInB1YmxpY0dldHRlciIsImNzc01vZHVsZSIsImdsb2JhbFByb3BlcnRpZXMiLCJwcm9wc09wdGlvbnMiLCJkZXNjcmlwdG9yIiwidXNlU2xvdHMiLCJnZXRDb250ZXh0IiwiY3JlYXRlU2V0dXBDb250ZXh0Iiwibm9ybWFsaXplUHJvcHNPckVtaXRzIiwibm9ybWFsaXplZCIsImJhc2UiLCJtaXhpbnMiLCJleHRlbmRzT3B0aW9ucyIsImdsb2JhbE1peGlucyIsIm9wdGlvbk1lcmdlU3RyYXRlZ2llcyIsInJlc29sdmVkIiwibSIsIm1lcmdlT3B0aW9ucyIsInRvIiwiZnJvbSIsInN0cmF0cyIsImFzTWl4aW4iLCJzdHJhdCIsImludGVybmFsT3B0aW9uTWVyZ2VTdHJhdHMiLCJtZXJnZURhdGFGbiIsIm1lcmdlRW1pdHNPclByb3BzT3B0aW9ucyIsIm1lcmdlT2JqZWN0T3B0aW9ucyIsIm1lcmdlQXNBcnJheSIsIm1lcmdlV2F0Y2hPcHRpb25zIiwibWVyZ2VJbmplY3QiLCJub3JtYWxpemVJbmplY3QiLCJtZXJnZWQiLCJjdXJyZW50QXBwIiwiZGVmYXVsdFZhbHVlIiwidHJlYXREZWZhdWx0QXNGYWN0b3J5IiwicHJvdmlkZXMiLCJpc1RlbGVwb3J0IiwiVGV4dCIsImJsb2NrU3RhY2siLCJjdXJyZW50QmxvY2siLCJkaXNhYmxlVHJhY2tpbmciLCJjbG9zZUJsb2NrIiwiaXNCbG9ja1RyZWVFbmFibGVkIiwic2V0dXBCbG9jayIsIkVNUFRZX0FSUiIsImNyZWF0ZUVsZW1lbnRCbG9jayIsInBhdGNoRmxhZyIsImR5bmFtaWNQcm9wcyIsInNoYXBlRmxhZyIsImNyZWF0ZUJhc2VWTm9kZSIsIm4xIiwibjIiLCJjcmVhdGVWTm9kZVdpdGhBcmdzVHJhbnNmb3JtIiwiX2NyZWF0ZVZOb2RlIiwiSW50ZXJuYWxPYmplY3RLZXkiLCJub3JtYWxpemVLZXkiLCJub3JtYWxpemVSZWYiLCJyZWYiLCJyZWZfa2V5IiwicmVmX2ZvciIsImlzQmxvY2tOb2RlIiwibmVlZEZ1bGxDaGlsZHJlbk5vcm1hbGl6YXRpb24iLCJub3JtYWxpemVDaGlsZHJlbiIsImNsb25lZCIsImd1YXJkUmVhY3RpdmVQcm9wcyIsImtsYXNzIiwic3R5bGUiLCJub3JtYWxpemVDbGFzcyIsIm5vcm1hbGl6ZVN0eWxlIiwiZXh0cmFQcm9wcyIsIm1lcmdlUmVmIiwibWVyZ2VkUHJvcHMiLCJtZXJnZVByb3BzIiwiZGVlcENsb25lVk5vZGUiLCJjcmVhdGVUZXh0Vk5vZGUiLCJ0ZXh0IiwiZmxhZyIsImNyZWF0ZUNvbW1lbnRWTm9kZSIsImFzQmxvY2siLCJzbG90RmxhZyIsInRvTWVyZ2UiLCJpc09uIiwiZXhpc3RpbmciLCJpbmNvbWluZyIsImludGVybmFsU2V0Q3VycmVudEluc3RhbmNlIiwiZyIsInJlZ2lzdGVyR2xvYmFsU2V0dGVyIiwic2V0dGVyIiwic2V0dGVycyIsImdldEF0dHJzUHJveHkiLCJnZXRTbG90c1Byb3h5IiwiZXhwb3NlIiwiZXhwb3NlZCIsImV4cG9zZWRUeXBlIiwiY2xhc3NpZnlSRSIsImNsYXNzaWZ5Iiwic3RyIiwiaW5jbHVkZUluZmVycmVkIiwiaW5mZXJGcm9tUmVnaXN0cnkiLCJoIiwicHJvcHNPckNoaWxkcmVuIiwiaW5pdEN1c3RvbUZvcm1hdHRlciIsInZ1ZVN0eWxlIiwibnVtYmVyU3R5bGUiLCJzdHJpbmdTdHlsZSIsImtleXdvcmRTdHlsZSIsImZvcm1hdHRlciIsImdlblJlZkZsYWciLCJmb3JtYXRWYWx1ZSIsImZvcm1hdEluc3RhbmNlIiwiYmxvY2tzIiwiY3JlYXRlSW5zdGFuY2VCbG9jayIsImV4dHJhY3RLZXlzIiwiaW5qZWN0ZWQiLCJhc1JhdyIsIkNvbXAiLCJleHRyYWN0ZWQiLCJpc0tleU9mVHlwZSIsIm9wdHMiLCJUUkFOU0lUSU9OIiwiQU5JTUFUSU9OIiwidnRjS2V5IiwiVHJhbnNpdGlvbiIsInJlc29sdmVUcmFuc2l0aW9uUHJvcHMiLCJET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzIiwiaDIiLCJoYXNFeHBsaWNpdENhbGxiYWNrIiwiYmFzZVByb3BzIiwiZHVyYXRpb24iLCJlbnRlckZyb21DbGFzcyIsImVudGVyQWN0aXZlQ2xhc3MiLCJlbnRlclRvQ2xhc3MiLCJhcHBlYXJGcm9tQ2xhc3MiLCJhcHBlYXJBY3RpdmVDbGFzcyIsImFwcGVhclRvQ2xhc3MiLCJsZWF2ZUZyb21DbGFzcyIsImxlYXZlQWN0aXZlQ2xhc3MiLCJsZWF2ZVRvQ2xhc3MiLCJkdXJhdGlvbnMiLCJub3JtYWxpemVEdXJhdGlvbiIsImVudGVyRHVyYXRpb24iLCJsZWF2ZUR1cmF0aW9uIiwiZmluaXNoRW50ZXIiLCJpc0FwcGVhciIsInJlbW92ZVRyYW5zaXRpb25DbGFzcyIsImZpbmlzaExlYXZlIiwibWFrZUVudGVySG9vayIsIm5leHRGcmFtZSIsImFkZFRyYW5zaXRpb25DbGFzcyIsIndoZW5UcmFuc2l0aW9uRW5kcyIsImZvcmNlUmVmbG93IiwiTnVtYmVyT2YiLCJ0b051bWJlciIsImNscyIsIl92dGMiLCJlbmRJZCIsImV4cGVjdGVkVHlwZSIsImV4cGxpY2l0VGltZW91dCIsInJlc29sdmVJZk5vdFN0YWxlIiwidGltZW91dCIsInByb3BDb3VudCIsImdldFRyYW5zaXRpb25JbmZvIiwiZW5kRXZlbnQiLCJlbmRlZCIsIm9uRW5kIiwic3R5bGVzIiwiZ2V0U3R5bGVQcm9wZXJ0aWVzIiwidHJhbnNpdGlvbkRlbGF5cyIsInRyYW5zaXRpb25EdXJhdGlvbnMiLCJ0cmFuc2l0aW9uVGltZW91dCIsImdldFRpbWVvdXQiLCJhbmltYXRpb25EZWxheXMiLCJhbmltYXRpb25EdXJhdGlvbnMiLCJhbmltYXRpb25UaW1lb3V0IiwiaGFzVHJhbnNmb3JtIiwiZGVsYXlzIiwiZCIsInRvTXMiLCJ2U2hvd09sZEtleSIsInZTaG93IiwidHJhbnNpdGlvbiIsInNldERpc3BsYXkiLCJhZGRFdmVudExpc3RlbmVyIiwiaGFuZGxlciIsImdldE1vZGVsQXNzaWduZXIiLCJpbnZva2VBcnJheUZucyIsIm9uQ29tcG9zaXRpb25TdGFydCIsIm9uQ29tcG9zaXRpb25FbmQiLCJhc3NpZ25LZXkiLCJ2TW9kZWxUZXh0IiwibGF6eSIsInRyaW0iLCJudW1iZXIiLCJjYXN0VG9OdW1iZXIiLCJkb21WYWx1ZSIsImxvb3NlVG9OdW1iZXIiLCJlbFZhbHVlIiwidk1vZGVsQ2hlY2tib3giLCJfIiwibW9kZWxWYWx1ZSIsImVsZW1lbnRWYWx1ZSIsImdldFZhbHVlIiwiY2hlY2tlZCIsImFzc2lnbiIsImxvb3NlSW5kZXhPZiIsImZvdW5kIiwiZmlsdGVyZWQiLCJnZXRDaGVja2JveFZhbHVlIiwic2V0Q2hlY2tlZCIsImJpbmRpbmciLCJsb29zZUVxdWFsIiwidk1vZGVsUmFkaW8iLCJ2TW9kZWxTZWxlY3QiLCJpc1NldE1vZGVsIiwic2VsZWN0ZWRWYWwiLCJvIiwic2V0U2VsZWN0ZWQiLCJfYmluZGluZyIsImlzTXVsdGlwbGUiLCJvcHRpb24iLCJvcHRpb25WYWx1ZSIsInZNb2RlbER5bmFtaWMiLCJjYWxsTW9kZWxIb29rIiwicHJldlZOb2RlIiwicmVzb2x2ZUR5bmFtaWNNb2RlbCIsInRhZ05hbWUiLCJzeXN0ZW1Nb2RpZmllcnMiLCJtb2RpZmllckd1YXJkcyIsIndpdGhNb2RpZmllcnMiLCJjYWNoZUtleSIsImd1YXJkIiwiaW5pdERldiIsIl9zZmNfbWFpbiIsIndlZWtkYXlOYW1lcyIsIm1vbnRoTmFtZXMiLCJnZXRMb2NhbGVOYW1lcyIsInVwZGF0ZSIsInN0ZXAiLCJjdXJyZW50VmFsdWUiLCJlbnRlciIsInN0YXJ0WWVhciIsImZpcnN0RGF5V2VlayIsIm51bURheXMiLCJwcmV2TW9udGgiLCJwcmV2TW9udGhOdW1EYXlzIiwibm93IiwiaXNEYXkiLCJuZXh0TW9udGhOZWVkIiwibmV4dE1vbnRoIiwibG9jYWxlTmFtZXMiLCJuYW1lcyIsImFkZEV2ZW50cyIsInRhcmdldHMiLCJldmVudHMiLCJhc0FycmF5IiwiY29tYmluZUV2ZW50cyIsImdldEtleSIsImdldEtleU5hdmlnYXRpb24iLCJnZXRUYXJnZXQiLCJjbGFzc2VzIiwiaHlwaGVuYXRlIiwic2hvdyIsInBvcHVwIiwiX2MiLCJib3VuZHMiLCJ0cmlnZ2VyTGVmdCIsInRyaWdnZXJUb3AiLCJ0cmlnZ2VyV2lkdGgiLCJ0cmlnZ2VySGVpZ2h0IiwicG9wdXBXaWR0aCIsInBvcHVwSGVpZ2h0IiwicGFydDEiLCJwYXJ0MiIsIndpbldpZHRoIiwid2luSGVpZ2h0IiwibGVmdCIsInRvcCIsInRyaWdnZXJCb3VuZHMiLCJwYXJlbnQiLCJpbnB1dCIsImF0dHJpYnV0ZXMiLCJtaW4iLCJtYXgiLCJnZXRMZW5ndGgiLCJfb3BlbkJsb2NrIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsInNldFNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsIlRyaWdnZXIiLCJDYWxlbmRhciIsIklucHV0RmllbGQiLCJJY29uIiwiZGVmYXVsdEZvcm1hdHMiLCJmb3JtYXQiLCJmb2N1cyIsImdldERhdGVQYXJ0IiwiY2FsZW5kYXIiLCJ0b2dnbGUiLCJzZWxlY3Rpb24iLCJzbW9vdGgiLCJzY3JvbGwiLCJsaW5lSGVpZ2h0IiwiZGlzdGFuY2UiLCJpc0RpZ2l0IiwiY2hhciIsIkRhdGVQaWNrZXIiLCJUaW1lUGlja2VyIiwiZGlzYWJsZWQiLCJhc3NpZ25EZWVwbHkiLCJzaG93UHJldiIsInNob3dOZXh0IiwiY3VycmVudFBhZ2UiLCJudW1QYWdlcyIsInNob3dMZW5ndGgiLCJidXR0b25zIiwicGFnZSIsImJ1dHRvbiIsInVuY2hlY2tlZCIsIlRyYW5zaXRpb25IZWlnaHQiLCJlbmFibGVkIiwiY3JlYXRlRWxlbWVudCIsInNldFN0eWxlIiwiZWxlbWVudCIsIm5leHRUaW1lb3V0IiwiZm9yY2VSZXBhaW50Iiwid2lkdGgiLCJoZWlnaHQiLCJoYXNWTm9kZUNvbnRlbnQiLCJo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
|