@getopenpay/openpay-js-react 0.1.9-alpha.9119c8d → 0.1.10
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/.tsbuildinfo +1 -1
- package/dist/index.js +458 -454
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { jsx as
|
|
1
|
+
import dn, { createContext as mn, useContext as pn, useRef as se, useCallback as W, useEffect as J, useState as E, useMemo as ee } from "react";
|
|
2
|
+
import { jsx as V } from "react/jsx-runtime";
|
|
3
3
|
import { z as n } from "zod";
|
|
4
|
-
import { v4 as
|
|
5
|
-
import { connectToChild as
|
|
4
|
+
import { v4 as dt } from "uuid";
|
|
5
|
+
import { connectToChild as mt } from "penpal";
|
|
6
6
|
import me from "chalk";
|
|
7
|
-
const
|
|
7
|
+
const pt = mn({
|
|
8
8
|
formId: "",
|
|
9
9
|
formHeight: "",
|
|
10
10
|
referer: void 0,
|
|
@@ -12,43 +12,43 @@ const mt = dn({
|
|
|
12
12
|
registerIframe: () => {
|
|
13
13
|
},
|
|
14
14
|
baseUrl: ""
|
|
15
|
-
}),
|
|
16
|
-
const e =
|
|
15
|
+
}), fn = () => {
|
|
16
|
+
const e = pn(pt);
|
|
17
17
|
if (!e)
|
|
18
18
|
throw new Error("useOpenPayElements must be used within an OpenPayElementsProvider");
|
|
19
19
|
return e;
|
|
20
|
-
},
|
|
20
|
+
}, yn = "https://cde.getopenpay.com", _n = n.object({
|
|
21
21
|
type: n.string(),
|
|
22
22
|
loc: n.array(n.string()),
|
|
23
23
|
msg: n.string(),
|
|
24
24
|
url: n.string()
|
|
25
|
-
}),
|
|
25
|
+
}), gn = n.array(_n), hn = n.object({
|
|
26
26
|
code: n.string(),
|
|
27
27
|
message: n.string(),
|
|
28
28
|
path: n.array(n.string())
|
|
29
|
-
}),
|
|
29
|
+
}), wn = n.array(hn), En = {
|
|
30
30
|
"failed to fetch": "Connection error: please double check if you are connected to the internet, then try again"
|
|
31
|
-
},
|
|
31
|
+
}, Le = (e) => {
|
|
32
32
|
const t = e.toLowerCase().trim();
|
|
33
|
-
return
|
|
34
|
-
},
|
|
33
|
+
return En[t] ?? e;
|
|
34
|
+
}, Cn = (e) => {
|
|
35
35
|
try {
|
|
36
36
|
return typeof JSON.parse(e) == "object";
|
|
37
37
|
} catch {
|
|
38
38
|
return !1;
|
|
39
39
|
}
|
|
40
|
-
},
|
|
41
|
-
${e.map((r) => `• ${
|
|
42
|
-
`)}`,
|
|
40
|
+
}, bn = (e) => e.length === 1 ? Le(e[0].msg) : `Please fix the following errors:
|
|
41
|
+
${e.map((r) => `• ${Le(r.msg)}`).join(`
|
|
42
|
+
`)}`, Sn = (e) => `Encountered the following errors:
|
|
43
43
|
${e.map((r) => `- ${r.path.join("/")}: ${r.message}`).join(`
|
|
44
44
|
`)}`, ie = (e) => {
|
|
45
45
|
if (e instanceof Error)
|
|
46
|
-
if (
|
|
46
|
+
if (Cn(e.message)) {
|
|
47
47
|
const t = JSON.parse(e.message);
|
|
48
|
-
return
|
|
48
|
+
return gn.safeParse(t).success ? bn(t) : wn.safeParse(t).success ? Sn(t) : (console.warn(`Encountered unknown stringified JSON object:
|
|
49
49
|
${e.message}`), e.message);
|
|
50
50
|
} else
|
|
51
|
-
return
|
|
51
|
+
return Le(e.message);
|
|
52
52
|
if (typeof e == "object")
|
|
53
53
|
try {
|
|
54
54
|
return JSON.stringify(e);
|
|
@@ -66,15 +66,15 @@ ${e.message}`), e.message);
|
|
|
66
66
|
}
|
|
67
67
|
}, R = n.string().trim().min(1, { message: "Cannot be blank" }), O = n.string().trim().optional(), _e = (e) => n.nullable(e.optional());
|
|
68
68
|
var _ = /* @__PURE__ */ ((e) => (e.FIRST_NAME = "firstName", e.LAST_NAME = "lastName", e.EMAIL = "email", e.ZIP_CODE = "zipCode", e.CITY = "city", e.STATE = "state", e.COUNTRY = "country", e.ADDRESS = "address", e.PHONE = "phone", e.PROMOTION_CODE = "promotionCode", e))(_ || {});
|
|
69
|
-
const
|
|
70
|
-
var
|
|
71
|
-
const
|
|
72
|
-
var
|
|
73
|
-
const
|
|
69
|
+
const ft = n.nativeEnum(_);
|
|
70
|
+
var yt = /* @__PURE__ */ ((e) => (e.CARD_NUMBER = "cardNumber", e.CARD_EXPIRY = "cardExpiry", e.CARD_CVC = "cardCvc", e))(yt || {});
|
|
71
|
+
const _t = n.nativeEnum(yt), gt = n.union([ft, _t]);
|
|
72
|
+
var ht = /* @__PURE__ */ ((e) => (e.CARD = "card", e.CARD_NUMBER = "card-number", e.CARD_EXPIRY = "card-expiry", e.CARD_CVC = "card-cvc", e))(ht || {});
|
|
73
|
+
const Pn = n.nativeEnum(ht), Ee = n.object({
|
|
74
74
|
provider: n.string(),
|
|
75
75
|
processor_name: _e(n.string()),
|
|
76
76
|
metadata: _e(n.record(n.string(), n.any()))
|
|
77
|
-
}),
|
|
77
|
+
}), vn = n.object({
|
|
78
78
|
id: n.string()
|
|
79
79
|
});
|
|
80
80
|
n.object({
|
|
@@ -114,22 +114,22 @@ const w = n.enum([
|
|
|
114
114
|
"TOKENIZE",
|
|
115
115
|
"CHECKOUT",
|
|
116
116
|
"START_PAYMENT_FLOW"
|
|
117
|
-
]),
|
|
118
|
-
type:
|
|
119
|
-
elementType:
|
|
117
|
+
]), kn = w.extract(["TOKENIZE_STARTED", "CHECKOUT_STARTED"]), On = n.object({ type: kn }), Rn = w.extract(["BLUR", "FOCUS", "CHANGE"]), In = n.object({
|
|
118
|
+
type: Rn,
|
|
119
|
+
elementType: _t,
|
|
120
120
|
errors: n.array(n.string()).optional()
|
|
121
|
-
}),
|
|
122
|
-
type:
|
|
121
|
+
}), An = w.extract(["LOAD_ERROR", "TOKENIZE_ERROR", "CHECKOUT_ERROR"]), Tn = n.object({
|
|
122
|
+
type: An,
|
|
123
123
|
message: R,
|
|
124
124
|
headers: n.record(n.string(), n.string()).optional()
|
|
125
|
-
}),
|
|
126
|
-
type:
|
|
127
|
-
elementType:
|
|
125
|
+
}), Mn = w.extract(["VALIDATION_ERROR"]), Dn = n.object({
|
|
126
|
+
type: Mn,
|
|
127
|
+
elementType: gt,
|
|
128
128
|
errors: n.array(n.string())
|
|
129
|
-
}),
|
|
129
|
+
}), Fn = n.object({
|
|
130
130
|
type: n.literal(w.enum.LAYOUT),
|
|
131
131
|
height: R
|
|
132
|
-
}),
|
|
132
|
+
}), Nn = n.object({
|
|
133
133
|
type: n.literal(w.enum.LOADED),
|
|
134
134
|
sessionId: R,
|
|
135
135
|
totalAmountAtoms: n.number(),
|
|
@@ -140,7 +140,7 @@ const w = n.enum([
|
|
|
140
140
|
nextActionMetadata: n.record(n.string(), n.any()),
|
|
141
141
|
paymentFlowMetadata: n.any().optional(),
|
|
142
142
|
startPFMetadata: n.optional(n.record(n.string(), n.any()))
|
|
143
|
-
}),
|
|
143
|
+
}), Ln = n.object({
|
|
144
144
|
type: n.literal(w.enum.SETUP_PAYMENT_METHOD_SUCCESS),
|
|
145
145
|
paymentMethodId: n.string()
|
|
146
146
|
}), ce = n.object({
|
|
@@ -150,40 +150,40 @@ const w = n.enum([
|
|
|
150
150
|
zipCode: R,
|
|
151
151
|
country: R,
|
|
152
152
|
promotionCode: O
|
|
153
|
-
}),
|
|
153
|
+
}), xn = n.object({
|
|
154
154
|
email: R,
|
|
155
155
|
zipCode: R,
|
|
156
156
|
country: R,
|
|
157
157
|
promotionCode: O
|
|
158
|
-
}),
|
|
159
|
-
type:
|
|
158
|
+
}), $n = w.extract(["TOKENIZE", "CHECKOUT", "START_PAYMENT_FLOW"]), wt = n.object({
|
|
159
|
+
type: $n,
|
|
160
160
|
sessionId: R,
|
|
161
161
|
checkoutPaymentMethod: Ee,
|
|
162
162
|
paymentFlowMetadata: n.any().optional(),
|
|
163
163
|
doNotUseLegacyCCFlow: n.boolean().optional(),
|
|
164
164
|
existingCCPMId: O
|
|
165
|
-
}).extend(ce.shape),
|
|
165
|
+
}).extend(ce.shape), Un = n.object({
|
|
166
166
|
type: n.literal(w.enum.TOKENIZE_SUCCESS),
|
|
167
167
|
isReadyForCheckout: n.boolean()
|
|
168
|
-
}),
|
|
168
|
+
}), qn = n.object({
|
|
169
169
|
type: n.literal(w.enum.CHECKOUT_SUCCESS),
|
|
170
170
|
invoiceUrls: n.array(n.string()),
|
|
171
171
|
subscriptionIds: n.array(n.string()),
|
|
172
172
|
customerId: n.string()
|
|
173
|
-
}),
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
Mn,
|
|
173
|
+
}), zn = n.discriminatedUnion("type", [
|
|
174
|
+
On,
|
|
175
|
+
In,
|
|
176
|
+
Tn,
|
|
178
177
|
Dn,
|
|
179
178
|
Fn,
|
|
180
|
-
|
|
181
|
-
|
|
179
|
+
Nn,
|
|
180
|
+
wt,
|
|
182
181
|
Un,
|
|
182
|
+
qn,
|
|
183
183
|
jn,
|
|
184
|
-
|
|
185
|
-
]),
|
|
186
|
-
payload:
|
|
184
|
+
Ln
|
|
185
|
+
]), Jn = n.object({
|
|
186
|
+
payload: zn,
|
|
187
187
|
nonce: R,
|
|
188
188
|
formId: R,
|
|
189
189
|
elementId: R
|
|
@@ -201,7 +201,7 @@ n.object({
|
|
|
201
201
|
existing_cc_pm_id: _e(n.string())
|
|
202
202
|
});
|
|
203
203
|
const Hn = n.object({
|
|
204
|
-
payment_methods: n.array(
|
|
204
|
+
payment_methods: n.array(vn)
|
|
205
205
|
}), Vn = n.object({
|
|
206
206
|
elementType: n.string(),
|
|
207
207
|
errors: n.array(n.string())
|
|
@@ -213,7 +213,7 @@ const Kn = n.object({
|
|
|
213
213
|
success: n.literal(!1),
|
|
214
214
|
error_type: n.literal("validation_error"),
|
|
215
215
|
errors: n.array(Vn)
|
|
216
|
-
}),
|
|
216
|
+
}), Yn = n.discriminatedUnion("success", [
|
|
217
217
|
n.object({ success: n.literal(!0) }),
|
|
218
218
|
Kn
|
|
219
219
|
]);
|
|
@@ -230,54 +230,54 @@ n.object({
|
|
|
230
230
|
non_cde_form_fields: ce
|
|
231
231
|
});
|
|
232
232
|
var ge = /* @__PURE__ */ ((e) => (e.SUCCESS = "success", e.FAILURE = "failure", e.CANCELLED = "cancelled", e))(ge || {});
|
|
233
|
-
const
|
|
233
|
+
const Zn = n.object({
|
|
234
234
|
status: n.enum([
|
|
235
235
|
"success",
|
|
236
236
|
"failure",
|
|
237
237
|
"cancelled"
|
|
238
238
|
/* CANCELLED */
|
|
239
239
|
])
|
|
240
|
-
}),
|
|
240
|
+
}), Wn = n.object({
|
|
241
241
|
type: n.string(),
|
|
242
242
|
redirect_url: n.string(),
|
|
243
243
|
initial_intent_id: n.string(),
|
|
244
244
|
consent_id: n.string()
|
|
245
|
-
}),
|
|
245
|
+
}), Et = (e) => {
|
|
246
246
|
const t = {};
|
|
247
247
|
return Object.entries(e).forEach(([r, o]) => {
|
|
248
248
|
try {
|
|
249
|
-
const s =
|
|
249
|
+
const s = ft.parse(r);
|
|
250
250
|
Array.isArray(o) ? t[s] = o : Array.isArray(o._errors) && (t[s] = o._errors);
|
|
251
251
|
} catch {
|
|
252
252
|
return;
|
|
253
253
|
}
|
|
254
254
|
}), t;
|
|
255
|
-
},
|
|
255
|
+
}, Ct = n.object({
|
|
256
256
|
stripe_pk: n.string(),
|
|
257
257
|
client_secret: n.string(),
|
|
258
258
|
stripe_pm_id: n.string()
|
|
259
|
-
}),
|
|
259
|
+
}), Bn = n.object({
|
|
260
260
|
type: n.string(),
|
|
261
261
|
client_secret: n.string(),
|
|
262
262
|
stripe_pk: n.string()
|
|
263
|
-
}),
|
|
263
|
+
}), Gn = {
|
|
264
264
|
usd: "usd",
|
|
265
265
|
brl: "brl"
|
|
266
266
|
}, le = async (e) => {
|
|
267
267
|
for (let r = 0; r < 10; r++)
|
|
268
|
-
|
|
269
|
-
if (!
|
|
268
|
+
tt() || await bt(500);
|
|
269
|
+
if (!tt())
|
|
270
270
|
throw console.log("Stripe JS not found."), new Error("Stripe JS not found.");
|
|
271
271
|
return new Stripe(e);
|
|
272
|
-
},
|
|
272
|
+
}, Qn = async (e, t) => {
|
|
273
273
|
const r = await le(e);
|
|
274
274
|
return {
|
|
275
275
|
elements: r.elements(t),
|
|
276
276
|
stripe: r
|
|
277
277
|
};
|
|
278
|
-
},
|
|
278
|
+
}, Xn = async (e, t, r, o, s) => {
|
|
279
279
|
console.log(s);
|
|
280
|
-
const i = await le(e), a =
|
|
280
|
+
const i = await le(e), a = Gn[r.toLowerCase().trim()];
|
|
281
281
|
return i.paymentRequest({
|
|
282
282
|
// TODO: replace this with stripe account country as soon as we support it
|
|
283
283
|
country: "US",
|
|
@@ -291,9 +291,9 @@ const Yn = n.object({
|
|
|
291
291
|
requestPayerEmail: !0,
|
|
292
292
|
disableWallets: []
|
|
293
293
|
});
|
|
294
|
-
},
|
|
294
|
+
}, bt = (e) => new Promise((t) => {
|
|
295
295
|
setTimeout(t, e);
|
|
296
|
-
}),
|
|
296
|
+
}), tt = () => "Stripe" in window, er = async (e) => new Promise((t, r) => {
|
|
297
297
|
try {
|
|
298
298
|
e.on("paymentmethod", async (o) => {
|
|
299
299
|
t(o);
|
|
@@ -303,7 +303,7 @@ const Yn = n.object({
|
|
|
303
303
|
} catch (o) {
|
|
304
304
|
r(o);
|
|
305
305
|
}
|
|
306
|
-
}),
|
|
306
|
+
}), tr = async (e, t) => {
|
|
307
307
|
const r = e.nextActionMetadata;
|
|
308
308
|
if (!e.paymentFlowMetadata || !e.paymentFlowMetadata.stripePmId)
|
|
309
309
|
throw new Error(`Invalid payment flow metadata format: ${JSON.stringify(e.paymentFlowMetadata)}`);
|
|
@@ -317,7 +317,7 @@ const Yn = n.object({
|
|
|
317
317
|
if (s.error)
|
|
318
318
|
throw t.complete("fail"), new Error(`Payment failed: ${s.error.message ?? "unknown"}`);
|
|
319
319
|
t.complete("success");
|
|
320
|
-
},
|
|
320
|
+
}, nr = async (e, t) => {
|
|
321
321
|
if (!e.stripe_pk || !e.client_secret)
|
|
322
322
|
throw new Error(`Invalid next action metadata format: ${JSON.stringify(e)}`);
|
|
323
323
|
const o = await (await le(e.stripe_pk)).confirmCardSetup(e.client_secret, {
|
|
@@ -326,10 +326,10 @@ const Yn = n.object({
|
|
|
326
326
|
if (o.error)
|
|
327
327
|
throw t.complete("fail"), new Error(`Payment failed: ${o.error.message ?? "unknown"}`);
|
|
328
328
|
return t.complete("success"), o;
|
|
329
|
-
},
|
|
330
|
-
const t =
|
|
331
|
-
await
|
|
332
|
-
},
|
|
329
|
+
}, rr = async (e) => {
|
|
330
|
+
const t = Ct.parse(e.nextActionMetadata);
|
|
331
|
+
await St(t);
|
|
332
|
+
}, St = async (e) => {
|
|
333
333
|
var s, i, a, c;
|
|
334
334
|
const r = await (await le(e.stripe_pk)).confirmCardSetup(e.client_secret, {
|
|
335
335
|
payment_method: e.stripe_pm_id
|
|
@@ -339,10 +339,10 @@ const Yn = n.object({
|
|
|
339
339
|
else throw o === "canceled" ? new Error("Payment cancelled, please click Submit again to pay") : new Error(
|
|
340
340
|
`${((i = r.error) == null ? void 0 : i.message) ?? ((c = (a = r.setupIntent) == null ? void 0 : a.last_setup_error) == null ? void 0 : c.message) ?? "Payment failed, please click submit again to pay."}`
|
|
341
341
|
);
|
|
342
|
-
},
|
|
342
|
+
}, or = (e) => JSON.stringify(e), he = (e, t) => Array.from(e.querySelectorAll("[data-opid]") ?? []).reduce((s, i) => {
|
|
343
343
|
const a = i.getAttribute("data-opid");
|
|
344
344
|
return a ? { ...s, [a]: i.value } : s;
|
|
345
|
-
}, t ?? {}),
|
|
345
|
+
}, t ?? {}), sr = (e, t, r, o, s, i, a) => {
|
|
346
346
|
const c = he(r, {
|
|
347
347
|
type: e,
|
|
348
348
|
sessionId: t,
|
|
@@ -351,30 +351,30 @@ const Yn = n.object({
|
|
|
351
351
|
doNotUseLegacyCCFlow: i
|
|
352
352
|
});
|
|
353
353
|
console.log(`[form] Constructing ${e} payload:`, JSON.stringify(c)), (s.provider === "apple_pay" || s.provider === "google_pay" || s.provider === "stripe_link") && (c[_.ZIP_CODE] || (console.log("[form] Overriding empty zip code (only for google pay, apple pay, and stripe link)"), c[_.ZIP_CODE] = "00000"));
|
|
354
|
-
const l =
|
|
354
|
+
const l = wt.safeParse(c);
|
|
355
355
|
if (l.success)
|
|
356
356
|
return console.log("[form] Constructed payload:", JSON.stringify(l.data)), l.data;
|
|
357
357
|
{
|
|
358
|
-
const u = l.error.format(), d =
|
|
358
|
+
const u = l.error.format(), d = Et(u);
|
|
359
359
|
for (const [f, m] of Object.entries(d))
|
|
360
360
|
o(f, m, f);
|
|
361
361
|
return console.log("[form] Constructed payload in FAIL:", l.data), null;
|
|
362
362
|
}
|
|
363
|
-
},
|
|
363
|
+
}, ir = (e) => {
|
|
364
364
|
try {
|
|
365
|
-
return
|
|
365
|
+
return Jn.parse(e);
|
|
366
366
|
} catch (t) {
|
|
367
367
|
throw console.error("Error parsing event payload:", e, t), t;
|
|
368
368
|
}
|
|
369
|
-
},
|
|
369
|
+
}, Ne = (e, t, r, o, s) => {
|
|
370
370
|
const i = {
|
|
371
371
|
payload: o,
|
|
372
|
-
nonce:
|
|
372
|
+
nonce: dt(),
|
|
373
373
|
formId: t,
|
|
374
374
|
elementId: r
|
|
375
375
|
};
|
|
376
376
|
console.log(`[form ${t}] Sending event to child ${r}:`, i), e.postMessage(JSON.stringify(i), s);
|
|
377
|
-
},
|
|
377
|
+
}, ar = async (e) => {
|
|
378
378
|
if (typeof e != "object" || !e) return !1;
|
|
379
379
|
try {
|
|
380
380
|
const t = { type: "ping" }, r = await e.send(t);
|
|
@@ -384,32 +384,32 @@ const Yn = n.object({
|
|
|
384
384
|
} catch (t) {
|
|
385
385
|
return console.error("Invalid CDE connection check:", t), !1;
|
|
386
386
|
}
|
|
387
|
-
},
|
|
388
|
-
async function
|
|
389
|
-
const r = await
|
|
387
|
+
}, cr = (e, t) => !!e && t;
|
|
388
|
+
async function lr(e) {
|
|
389
|
+
const r = await mt({
|
|
390
390
|
iframe: e,
|
|
391
391
|
debug: !0
|
|
392
|
-
}).promise, o = await
|
|
393
|
-
if (!
|
|
392
|
+
}).promise, o = await ar(r);
|
|
393
|
+
if (!cr(r, o))
|
|
394
394
|
throw new Error("Got invalid CDE connection object");
|
|
395
|
-
return r;
|
|
395
|
+
return console.log("[OJS] connected to iframe", e.id), r;
|
|
396
396
|
}
|
|
397
397
|
const S = (e) => n.nullable(e.optional());
|
|
398
398
|
n.string().trim().min(1, { message: "Cannot be blank" });
|
|
399
|
-
const
|
|
399
|
+
const ur = n.object({
|
|
400
400
|
cde_response_type: n.literal("error"),
|
|
401
401
|
message: n.string(),
|
|
402
402
|
headers: n.record(n.string(), n.string()).optional()
|
|
403
403
|
});
|
|
404
404
|
n.enum(["usd", "brl"]);
|
|
405
|
-
const
|
|
405
|
+
const Pt = n.object({
|
|
406
406
|
name: n.string(),
|
|
407
407
|
amount_atom_off: S(n.number()),
|
|
408
408
|
percent_off: S(n.number()),
|
|
409
409
|
currency: S(n.string()),
|
|
410
410
|
duration: n.string(),
|
|
411
411
|
duration_in_months: S(n.number())
|
|
412
|
-
}),
|
|
412
|
+
}), vt = n.object({
|
|
413
413
|
amount_subtotal_atom: n.number().int(),
|
|
414
414
|
amount_total_atom: n.number().int(),
|
|
415
415
|
currency: n.string(),
|
|
@@ -418,81 +418,81 @@ const St = n.object({
|
|
|
418
418
|
billing_interval: S(n.string()),
|
|
419
419
|
billing_interval_count: S(n.number().int()),
|
|
420
420
|
quantity: n.number().int()
|
|
421
|
-
}),
|
|
421
|
+
}), dr = n.record(n.string(), n.any()), mr = n.object({
|
|
422
422
|
name: n.string(),
|
|
423
|
-
settings: S(
|
|
423
|
+
settings: S(dr)
|
|
424
424
|
}), ue = n.object({
|
|
425
425
|
provider: n.string(),
|
|
426
426
|
processor_name: S(n.string()),
|
|
427
427
|
metadata: S(n.record(n.string(), n.any()))
|
|
428
|
-
}), mr = n.object({
|
|
429
|
-
quantity: n.number()
|
|
430
428
|
}), pr = n.object({
|
|
429
|
+
quantity: n.number()
|
|
430
|
+
}), fr = n.object({
|
|
431
431
|
id: S(n.string()),
|
|
432
432
|
billing_interval: S(n.string()),
|
|
433
433
|
billing_interval_count: S(n.number().int()),
|
|
434
|
-
subscription_items: n.array(
|
|
434
|
+
subscription_items: n.array(pr),
|
|
435
435
|
trial_start: S(n.string()),
|
|
436
436
|
trial_end: S(n.string())
|
|
437
|
-
}),
|
|
437
|
+
}), kt = n.object({
|
|
438
438
|
amount_atom: n.number()
|
|
439
|
-
}),
|
|
439
|
+
}), yr = n.object({
|
|
440
440
|
amount_atom: n.number(),
|
|
441
441
|
amount_atom_considering_discount_applied: n.number(),
|
|
442
442
|
currency: n.string(),
|
|
443
|
-
discount_amount_atoms: n.array(
|
|
443
|
+
discount_amount_atoms: n.array(kt),
|
|
444
444
|
subscription_item_id: n.string()
|
|
445
|
-
}), yr = n.object({
|
|
446
|
-
coupon: St
|
|
447
445
|
}), _r = n.object({
|
|
446
|
+
coupon: Pt
|
|
447
|
+
}), gr = n.object({
|
|
448
448
|
currency: n.string(),
|
|
449
|
-
discounts: n.array(
|
|
449
|
+
discounts: n.array(_r),
|
|
450
450
|
hosted_invoice_url: S(n.string()),
|
|
451
|
-
lines: n.array(
|
|
451
|
+
lines: n.array(yr),
|
|
452
452
|
remaining_amount_atom: n.number(),
|
|
453
453
|
tax_amount_atom: n.number(),
|
|
454
454
|
total_amount_atom: n.number(),
|
|
455
|
-
total_discount_amount_atoms: n.array(
|
|
456
|
-
}), tt = n.object({
|
|
457
|
-
created: n.array(pr),
|
|
458
|
-
invoices: n.array(_r)
|
|
459
|
-
}), kt = n.object({
|
|
460
|
-
preview: tt,
|
|
461
|
-
preview_post_trial: S(tt),
|
|
462
|
-
coupons: n.array(St)
|
|
455
|
+
total_discount_amount_atoms: n.array(kt)
|
|
463
456
|
}), nt = n.object({
|
|
457
|
+
created: n.array(fr),
|
|
458
|
+
invoices: n.array(gr)
|
|
459
|
+
}), Ot = n.object({
|
|
460
|
+
preview: nt,
|
|
461
|
+
preview_post_trial: S(nt),
|
|
462
|
+
coupons: n.array(Pt)
|
|
463
|
+
}), rt = n.object({
|
|
464
464
|
status: n.literal("open"),
|
|
465
465
|
token: n.string(),
|
|
466
466
|
email: S(n.string()),
|
|
467
|
-
line_items: n.array(
|
|
467
|
+
line_items: n.array(vt),
|
|
468
468
|
amount_subtotal_atom: n.number().int(),
|
|
469
469
|
amount_total_atom: n.number().int(),
|
|
470
|
-
brand:
|
|
471
|
-
subs_preview: S(
|
|
470
|
+
brand: mr,
|
|
471
|
+
subs_preview: S(Ot),
|
|
472
472
|
// Null in setup mode
|
|
473
473
|
methods_available: n.array(ue)
|
|
474
|
-
}),
|
|
474
|
+
}), Rt = n.discriminatedUnion("mode", [
|
|
475
475
|
n.object({
|
|
476
476
|
mode: n.literal("setup"),
|
|
477
477
|
currency: n.nullable(n.undefined())
|
|
478
|
-
}).extend(
|
|
478
|
+
}).extend(rt.shape),
|
|
479
479
|
n.object({
|
|
480
480
|
mode: n.enum(["payment", "subscription"]),
|
|
481
481
|
currency: n.string()
|
|
482
|
-
}).extend(
|
|
483
|
-
]),
|
|
482
|
+
}).extend(rt.shape)
|
|
483
|
+
]), hr = n.object({
|
|
484
484
|
status: n.literal("complete")
|
|
485
|
-
}),
|
|
485
|
+
}), wr = n.object({
|
|
486
486
|
status: n.literal("expired")
|
|
487
487
|
});
|
|
488
|
-
n.union([
|
|
488
|
+
n.union([Rt, hr, wr]);
|
|
489
489
|
n.object({
|
|
490
490
|
logo: n.string(),
|
|
491
491
|
icon: n.string(),
|
|
492
492
|
primary_color: n.string(),
|
|
493
493
|
secondary_color: n.string()
|
|
494
494
|
});
|
|
495
|
-
const
|
|
495
|
+
const It = n.object({
|
|
496
496
|
invoice_urls: n.array(n.string()),
|
|
497
497
|
subscription_ids: n.array(n.string()),
|
|
498
498
|
customer_id: n.string()
|
|
@@ -504,27 +504,27 @@ n.object({
|
|
|
504
504
|
customer_email: n.string(),
|
|
505
505
|
customer_zip_code: n.string(),
|
|
506
506
|
customer_country: n.string(),
|
|
507
|
-
line_items: n.array(
|
|
507
|
+
line_items: n.array(vt),
|
|
508
508
|
total_amount_atom: n.number().int(),
|
|
509
509
|
cancel_at_end: n.boolean(),
|
|
510
510
|
checkout_payment_method: ue,
|
|
511
511
|
promotion_code: n.string().optional(),
|
|
512
512
|
do_not_use_legacy_cc_flow: n.boolean().optional()
|
|
513
513
|
});
|
|
514
|
-
const
|
|
514
|
+
const Er = n.object({
|
|
515
515
|
payment_method_id: n.string()
|
|
516
516
|
});
|
|
517
517
|
n.object({
|
|
518
518
|
id: n.string(),
|
|
519
519
|
return_url: n.string()
|
|
520
520
|
});
|
|
521
|
-
const
|
|
521
|
+
const Cr = n.object({
|
|
522
522
|
type: n.string(),
|
|
523
523
|
loc: n.array(n.string()),
|
|
524
524
|
msg: n.string(),
|
|
525
525
|
url: n.string()
|
|
526
526
|
});
|
|
527
|
-
n.array(
|
|
527
|
+
n.array(Cr);
|
|
528
528
|
n.object({
|
|
529
529
|
new_customer_email: n.string().optional(),
|
|
530
530
|
new_customer_address: n.record(n.string(), n.any()).optional(),
|
|
@@ -533,11 +533,11 @@ n.object({
|
|
|
533
533
|
existing_cc_pm_id: n.string().optional(),
|
|
534
534
|
their_existing_pm_id: n.string().optional()
|
|
535
535
|
});
|
|
536
|
-
const
|
|
536
|
+
const At = n.object({
|
|
537
537
|
required_user_actions: n.array(n.record(n.string(), n.any()))
|
|
538
538
|
});
|
|
539
539
|
n.object({
|
|
540
|
-
fields:
|
|
540
|
+
fields: xn,
|
|
541
541
|
checkoutPaymentMethod: ue
|
|
542
542
|
});
|
|
543
543
|
n.object({
|
|
@@ -545,22 +545,22 @@ n.object({
|
|
|
545
545
|
non_cde_form_fields: ce,
|
|
546
546
|
checkout_payment_method: ue
|
|
547
547
|
});
|
|
548
|
-
const
|
|
548
|
+
const br = n.object({
|
|
549
549
|
required_user_actions: n.array(n.record(n.string(), n.any())),
|
|
550
550
|
cc_pm_id: n.string()
|
|
551
551
|
});
|
|
552
552
|
n.record(n.any());
|
|
553
|
-
const
|
|
554
|
-
function
|
|
553
|
+
const Sr = (e) => e.reduce((t, r) => t + r, 0);
|
|
554
|
+
function Pr(e, t) {
|
|
555
555
|
var r = Object.setPrototypeOf;
|
|
556
556
|
r ? r(e, t) : e.__proto__ = t;
|
|
557
557
|
}
|
|
558
|
-
function
|
|
558
|
+
function vr(e, t) {
|
|
559
559
|
t === void 0 && (t = e.constructor);
|
|
560
560
|
var r = Error.captureStackTrace;
|
|
561
561
|
r && r(e, t);
|
|
562
562
|
}
|
|
563
|
-
var
|
|
563
|
+
var kr = /* @__PURE__ */ function() {
|
|
564
564
|
var e = function(r, o) {
|
|
565
565
|
return e = Object.setPrototypeOf || {
|
|
566
566
|
__proto__: []
|
|
@@ -579,19 +579,19 @@ var vr = /* @__PURE__ */ function() {
|
|
|
579
579
|
}
|
|
580
580
|
t.prototype = r === null ? Object.create(r) : (o.prototype = r.prototype, new o());
|
|
581
581
|
};
|
|
582
|
-
}(),
|
|
583
|
-
|
|
582
|
+
}(), Or = function(e) {
|
|
583
|
+
kr(t, e);
|
|
584
584
|
function t(r, o) {
|
|
585
585
|
var s = this.constructor, i = e.call(this, r, o) || this;
|
|
586
586
|
return Object.defineProperty(i, "name", {
|
|
587
587
|
value: s.name,
|
|
588
588
|
enumerable: !1,
|
|
589
589
|
configurable: !0
|
|
590
|
-
}),
|
|
590
|
+
}), Pr(i, s.prototype), vr(i), i;
|
|
591
591
|
}
|
|
592
592
|
return t;
|
|
593
593
|
}(Error);
|
|
594
|
-
class
|
|
594
|
+
class Tt extends Or {
|
|
595
595
|
constructor(t) {
|
|
596
596
|
const r = `[cde-client] Error querying CDE: ${t.message}`;
|
|
597
597
|
super(r), this.response = t;
|
|
@@ -603,14 +603,14 @@ class At extends kr {
|
|
|
603
603
|
const x = async (e, t, r) => {
|
|
604
604
|
console.log("[cde-client] Querying CDE with path and connection:", t.type, e);
|
|
605
605
|
const o = await e.send(t);
|
|
606
|
-
if (console.log("[cde-client] Got response from CDE:", o),
|
|
607
|
-
throw new
|
|
608
|
-
if (!
|
|
606
|
+
if (console.log("[cde-client] Got response from CDE:", o), Ir(o))
|
|
607
|
+
throw new Tt(o);
|
|
608
|
+
if (!Rr(o, r)) {
|
|
609
609
|
const s = r.safeParse(o);
|
|
610
610
|
throw s.success ? new Error("Invalid state") : (console.error("OJS queryApi got a schema error. Expected schema:", r, "Actual:", o), s.error);
|
|
611
611
|
}
|
|
612
612
|
return o;
|
|
613
|
-
},
|
|
613
|
+
}, Rr = (e, t) => t.safeParse(e).success, Ir = (e) => ur.safeParse(e).success, Ar = async (e, t) => await x(e, { type: "get_checkout_preview", payload: t }, Ot), B = async (e) => await x(e, { type: "get_prefill", payload: {} }, Rt), Tr = async (e, t) => await x(e, { type: "v2_start_payment_flow", payload: t }, At), Mr = async (e, t) => await x(e, { type: "start_payment_flow_for_cc", payload: t }, br), Dr = async (e, t) => await x(e, { type: "start_payment_flow_for_pr", payload: t }, At), Ce = async (e, t) => await x(e, { type: "confirm_payment_flow", payload: t }, Hn), Fr = async (e, t, r) => {
|
|
614
614
|
const o = Date.now();
|
|
615
615
|
for (r = r ?? 5e3; Date.now() - o < r; ) {
|
|
616
616
|
const s = e.querySelector(`input[data-opid=${t}]`);
|
|
@@ -619,27 +619,27 @@ const x = async (e, t, r) => {
|
|
|
619
619
|
throw new Error(`Invalid state: matched input element had wrong class: ${s.tagName}`);
|
|
620
620
|
return s;
|
|
621
621
|
}
|
|
622
|
-
await
|
|
622
|
+
await bt(300);
|
|
623
623
|
}
|
|
624
624
|
return console.warn("Cannot find promo code input"), null;
|
|
625
|
-
},
|
|
626
|
-
const o = await
|
|
625
|
+
}, Nr = async (e, t, r) => {
|
|
626
|
+
const o = await Ar(e, {
|
|
627
627
|
secure_token: t,
|
|
628
628
|
promotion_code: r
|
|
629
629
|
}), s = new Set(o.preview.invoices.map((c) => c.currency));
|
|
630
630
|
if (s.size !== 1)
|
|
631
631
|
throw new Error(`Expected exactly one currency, got ${s.size}`);
|
|
632
|
-
const i = s.values().next().value ?? "usd", a =
|
|
632
|
+
const i = s.values().next().value ?? "usd", a = Sr(o.preview.invoices.map((c) => c.remaining_amount_atom));
|
|
633
633
|
return {
|
|
634
634
|
currency: i,
|
|
635
635
|
amountAtom: a
|
|
636
636
|
};
|
|
637
|
-
},
|
|
637
|
+
}, Ue = async (e, t, r, o) => {
|
|
638
638
|
if (r)
|
|
639
639
|
return { amountAtom: 0, currency: "usd" };
|
|
640
640
|
{
|
|
641
641
|
o = o || void 0;
|
|
642
|
-
const s = await
|
|
642
|
+
const s = await Nr(e, t, o);
|
|
643
643
|
return { amountAtom: s.amountAtom, currency: s.currency };
|
|
644
644
|
}
|
|
645
645
|
}, jr = async (e, t) => {
|
|
@@ -647,33 +647,33 @@ const x = async (e, t, r) => {
|
|
|
647
647
|
throw new Error("No CDE connections found");
|
|
648
648
|
return await Promise.all(
|
|
649
649
|
Array.from(e.values()).map(
|
|
650
|
-
(o) => x(o, { type: "tokenize_card", payload: t },
|
|
650
|
+
(o) => x(o, { type: "tokenize_card", payload: t }, Yn)
|
|
651
651
|
)
|
|
652
652
|
);
|
|
653
|
-
},
|
|
653
|
+
}, ot = async (e, t) => {
|
|
654
654
|
try {
|
|
655
|
-
return await x(e, { type: "checkout_card_elements", payload: t },
|
|
655
|
+
return await x(e, { type: "checkout_card_elements", payload: t }, It);
|
|
656
656
|
} catch (r) {
|
|
657
657
|
throw console.error("[cde-client] Error during checkoutCardElements:", r, JSON.stringify(r)), r;
|
|
658
658
|
}
|
|
659
|
-
},
|
|
659
|
+
}, Lr = async (e, t) => await x(e, { type: "setup_payment_method", payload: t }, Er), Mt = async (e, t) => await x(e, { type: "checkout", payload: t }, It), Dt = 1e3, xr = async (e, t) => {
|
|
660
660
|
console.log(t);
|
|
661
|
-
const o = await
|
|
661
|
+
const o = await mt({
|
|
662
662
|
iframe: e,
|
|
663
663
|
debug: !0,
|
|
664
|
-
timeout:
|
|
664
|
+
timeout: Dt,
|
|
665
665
|
childOrigin: "*"
|
|
666
666
|
// TODO: use with proper childOrigin
|
|
667
667
|
}).promise;
|
|
668
|
-
return (await x(o, { type: "ping-3ds-status" },
|
|
669
|
-
},
|
|
668
|
+
return (await x(o, { type: "ping-3ds-status" }, Zn)).status;
|
|
669
|
+
}, $r = (e) => {
|
|
670
670
|
if (typeof e != "string") return !1;
|
|
671
671
|
try {
|
|
672
672
|
return JSON.parse(e), !0;
|
|
673
673
|
} catch {
|
|
674
674
|
return !1;
|
|
675
675
|
}
|
|
676
|
-
},
|
|
676
|
+
}, qe = (e) => async (t) => {
|
|
677
677
|
try {
|
|
678
678
|
t.flowCallbacks.onCheckoutStarted();
|
|
679
679
|
const r = await e(t);
|
|
@@ -690,14 +690,14 @@ const x = async (e, t, r) => {
|
|
|
690
690
|
} catch (r) {
|
|
691
691
|
throw t.flowCallbacks.onCheckoutError(ie(r)), r;
|
|
692
692
|
}
|
|
693
|
-
},
|
|
693
|
+
}, Ft = (e) => async (t) => {
|
|
694
694
|
try {
|
|
695
695
|
return await e(t);
|
|
696
696
|
} catch (r) {
|
|
697
|
-
const { err__: o } =
|
|
697
|
+
const { err__: o } = K("init-error-catcher");
|
|
698
698
|
return o(r), { isAvailable: !1, reason: ie(r) };
|
|
699
699
|
}
|
|
700
|
-
},
|
|
700
|
+
}, K = (e) => {
|
|
701
701
|
const t = (...o) => {
|
|
702
702
|
window.console.log(`${me.green.bold("ojs/")}${me.bold.gray(`${e}`)} `, ...o);
|
|
703
703
|
}, r = (...o) => {
|
|
@@ -709,37 +709,37 @@ const x = async (e, t, r) => {
|
|
|
709
709
|
log__: t,
|
|
710
710
|
err__: r
|
|
711
711
|
};
|
|
712
|
-
}, { log__:
|
|
712
|
+
}, { log__: Lo, err__: Ur } = K("common"), ze = (e) => {
|
|
713
713
|
if (e.payment_methods.length !== 1)
|
|
714
714
|
throw new Error(`Expected exactly one payment method, got ${e.payment_methods.length}`);
|
|
715
715
|
return { payment_method_id: e.payment_methods[0].id };
|
|
716
|
-
},
|
|
716
|
+
}, Nt = (e, t) => {
|
|
717
717
|
const r = e.find((o) => t.safeParse(o).success);
|
|
718
718
|
if (!r)
|
|
719
|
-
throw
|
|
719
|
+
throw Ur("No CPMs found for model. All models:", e), new Error("No CPMs found for model");
|
|
720
720
|
return t.parse(r);
|
|
721
|
-
}, { log__:
|
|
721
|
+
}, { log__: qr, err__: jt } = K("common-cc"), Je = (e, t) => {
|
|
722
722
|
const r = ce.safeParse(e);
|
|
723
723
|
if (!r.success) {
|
|
724
|
-
const o = r.error.format(), s =
|
|
724
|
+
const o = r.error.format(), s = Et(o);
|
|
725
725
|
for (const [i, a] of Object.entries(s))
|
|
726
726
|
t(i, a, i);
|
|
727
727
|
throw jt("Got validation errors in non-CDE form fields", s), new Error("Got validation errors in non-CDE form fields");
|
|
728
728
|
}
|
|
729
729
|
return r.data;
|
|
730
|
-
},
|
|
730
|
+
}, zr = (e, t) => {
|
|
731
731
|
for (const r of e)
|
|
732
732
|
if (r.success === !1)
|
|
733
733
|
throw r.errors.forEach((o) => {
|
|
734
|
-
const s =
|
|
734
|
+
const s = gt.safeParse(o.elementType);
|
|
735
735
|
if (!s.success)
|
|
736
736
|
jt(`Unknown field name in onValidationError: ${o.elementType}`);
|
|
737
737
|
else {
|
|
738
738
|
const i = s.data;
|
|
739
739
|
t(i, o.errors);
|
|
740
740
|
}
|
|
741
|
-
}),
|
|
742
|
-
},
|
|
741
|
+
}), qr(`Error tokenizing card: got validation errors: ${JSON.stringify(r.errors)}`), new Error("Got validation errors while tokenizing card");
|
|
742
|
+
}, Jr = "ojs-stripe-link-btn", { log__: T, err__: Hr } = K("stripe-link"), Vr = n.object({
|
|
743
743
|
provider: n.literal("stripe_link"),
|
|
744
744
|
processor_name: n.literal("stripe"),
|
|
745
745
|
metadata: n.object({
|
|
@@ -749,21 +749,21 @@ const x = async (e, t, r) => {
|
|
|
749
749
|
n.object({
|
|
750
750
|
our_existing_pm_id: n.string()
|
|
751
751
|
})
|
|
752
|
-
).length(1),
|
|
752
|
+
).length(1), Yr = Ft(
|
|
753
753
|
async ({ context: e, flowCallbacks: t }) => {
|
|
754
754
|
var d;
|
|
755
|
-
|
|
756
|
-
const r =
|
|
757
|
-
|
|
755
|
+
T("Checking if there are any CPMs for Stripe PR...");
|
|
756
|
+
const r = Nt(e.checkoutPaymentMethods, Vr);
|
|
757
|
+
T("Starting stripe link flow...");
|
|
758
758
|
const o = Array.from(e.cdeConnections.values())[0], s = await B(o), i = s.mode === "setup";
|
|
759
|
-
|
|
760
|
-
const a = await
|
|
759
|
+
T("Creating stripe elements...");
|
|
760
|
+
const a = await Ue(o, s.token, i, void 0), { elements: c, stripe: l } = await Qn(r.metadata.stripe_pk, {
|
|
761
761
|
mode: "setup",
|
|
762
762
|
currency: a.currency,
|
|
763
763
|
setup_future_usage: "off_session",
|
|
764
764
|
paymentMethodCreation: "manual"
|
|
765
765
|
});
|
|
766
|
-
|
|
766
|
+
T("Mounting payment element...");
|
|
767
767
|
const u = c.create("expressCheckout", {
|
|
768
768
|
buttonHeight: (d = e.customInitParams.stripeLink) == null ? void 0 : d.buttonHeight,
|
|
769
769
|
paymentMethods: {
|
|
@@ -773,22 +773,22 @@ const x = async (e, t, r) => {
|
|
|
773
773
|
paypal: "never"
|
|
774
774
|
}
|
|
775
775
|
});
|
|
776
|
-
return u.mount(`#${
|
|
776
|
+
return u.mount(`#${Jr}`), u.on("click", async (f) => {
|
|
777
777
|
var m;
|
|
778
|
-
if (
|
|
779
|
-
|
|
778
|
+
if (T("Stripe Link button clicked"), (m = e.customInitParams.stripeLink) != null && m.overrideLinkSubmit && !await e.customInitParams.stripeLink.overrideLinkSubmit()) {
|
|
779
|
+
T("Stripe Link submit aborted by overrideLinkSubmit");
|
|
780
780
|
return;
|
|
781
781
|
}
|
|
782
782
|
f.resolve();
|
|
783
783
|
}), u.on("confirm", async (f) => {
|
|
784
|
-
|
|
784
|
+
T("Stripe Link window confirmed", f);
|
|
785
785
|
const m = await l.createPaymentMethod({
|
|
786
786
|
elements: c,
|
|
787
787
|
params: {
|
|
788
788
|
billing_details: f.billingDetails
|
|
789
789
|
}
|
|
790
790
|
});
|
|
791
|
-
m.error ? (Hr("error", m.error), t.onCheckoutError(m.error.message ?? "Stripe Link unknown error")) : (
|
|
791
|
+
m.error ? (Hr("error", m.error), t.onCheckoutError(m.error.message ?? "Stripe Link unknown error")) : (T("paymentMethod", m.paymentMethod), ae.stripeLink.run({
|
|
792
792
|
context: e,
|
|
793
793
|
checkoutPaymentMethod: r,
|
|
794
794
|
nonCdeFormInputs: he(e.formDiv),
|
|
@@ -798,7 +798,7 @@ const x = async (e, t, r) => {
|
|
|
798
798
|
}));
|
|
799
799
|
}), { isAvailable: !0 };
|
|
800
800
|
}
|
|
801
|
-
),
|
|
801
|
+
), Zr = qe(
|
|
802
802
|
async ({
|
|
803
803
|
context: e,
|
|
804
804
|
checkoutPaymentMethod: t,
|
|
@@ -806,27 +806,27 @@ const x = async (e, t, r) => {
|
|
|
806
806
|
flowCallbacks: o,
|
|
807
807
|
customParams: s
|
|
808
808
|
}) => {
|
|
809
|
-
|
|
809
|
+
T("Running Stripe PR flow...");
|
|
810
810
|
const i = Array.from(e.cdeConnections.values())[0];
|
|
811
|
-
|
|
812
|
-
const a =
|
|
813
|
-
|
|
814
|
-
const l = await
|
|
811
|
+
T("Merging PM fields with form fields...");
|
|
812
|
+
const a = Wr(r, s.stripePM), c = Je(a, o.onValidationError);
|
|
813
|
+
T("Starting payment flow...");
|
|
814
|
+
const l = await Tr(i, {
|
|
815
815
|
payment_provider: t.provider,
|
|
816
816
|
checkout_payment_method: t,
|
|
817
817
|
their_existing_pm_id: s.stripePM.id
|
|
818
818
|
});
|
|
819
|
-
|
|
819
|
+
T("Start payment flow response", l);
|
|
820
820
|
const d = Kr.parse(l.required_user_actions)[0].our_existing_pm_id, f = await B(i);
|
|
821
821
|
if (f.mode === "setup") {
|
|
822
|
-
|
|
822
|
+
T("Doing payment setup...");
|
|
823
823
|
const m = await Ce(i, {
|
|
824
824
|
secure_token: f.token,
|
|
825
825
|
existing_cc_pm_id: d
|
|
826
826
|
});
|
|
827
|
-
return { mode: "setup", result:
|
|
827
|
+
return { mode: "setup", result: ze(m) };
|
|
828
828
|
} else {
|
|
829
|
-
|
|
829
|
+
T("Doing checkout...");
|
|
830
830
|
const m = {
|
|
831
831
|
secure_token: f.token,
|
|
832
832
|
payment_input: {
|
|
@@ -841,19 +841,19 @@ const x = async (e, t, r) => {
|
|
|
841
841
|
cancel_at_end: !1,
|
|
842
842
|
checkout_payment_method: t
|
|
843
843
|
};
|
|
844
|
-
return { mode: "checkout", result: await
|
|
844
|
+
return { mode: "checkout", result: await Mt(i, m) };
|
|
845
845
|
}
|
|
846
846
|
}
|
|
847
|
-
),
|
|
847
|
+
), Wr = (e, t) => {
|
|
848
848
|
var a, c, l, u, d;
|
|
849
849
|
const r = { ...e }, [o, ...s] = ((c = (a = t.billing_details.name) == null ? void 0 : a.trim()) == null ? void 0 : c.split(/\s+/)) ?? [], i = s.join(" ") || void 0;
|
|
850
850
|
return r[_.FIRST_NAME] = r[_.FIRST_NAME] || o || "_OP_UNKNOWN", r[_.LAST_NAME] = r[_.LAST_NAME] || i || "_OP_UNKNOWN", r[_.EMAIL] = r[_.EMAIL] || // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
851
|
-
((l = t.link) == null ? void 0 : l.email) || t.billing_details.email || "op_unfilled@getopenpay.com", r[_.ZIP_CODE] = r[_.ZIP_CODE] || ((u = t.billing_details.address) == null ? void 0 : u.postal_code) || "00000", r[_.COUNTRY] = r[_.COUNTRY] || ((d = t.billing_details.address) == null ? void 0 : d.country) || "US",
|
|
852
|
-
},
|
|
851
|
+
((l = t.link) == null ? void 0 : l.email) || t.billing_details.email || "op_unfilled@getopenpay.com", r[_.ZIP_CODE] = r[_.ZIP_CODE] || ((u = t.billing_details.address) == null ? void 0 : u.postal_code) || "00000", r[_.COUNTRY] = r[_.COUNTRY] || ((d = t.billing_details.address) == null ? void 0 : d.country) || "US", T("Final form inputs:", r), r;
|
|
852
|
+
}, Br = "@keyframes fadeIn{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:2147483648!important;display:flex;justify-content:center;align-items:center;background-color:#00000080}.container{max-width:500px;max-height:600px;width:100%;height:100%;background-color:#fff;position:relative;animation:fadeIn .3s ease-out}.frame{max-width:500px;max-height:600px;width:100%;height:100%;border:none}.cancel-button{position:absolute;background:transparent;border:none;font-size:1rem;color:#fff;cursor:pointer;top:-1.5rem;padding:0;right:0}", Gr = (e) => {
|
|
853
853
|
const t = document.createElement("template");
|
|
854
854
|
t.innerHTML = `
|
|
855
855
|
<style>
|
|
856
|
-
${
|
|
856
|
+
${Br}
|
|
857
857
|
</style>
|
|
858
858
|
<div class="overlay">
|
|
859
859
|
<div class="container">
|
|
@@ -867,20 +867,20 @@ const x = async (e, t, r) => {
|
|
|
867
867
|
const s = o.querySelector("#three-ds-iframe"), i = o.querySelector(".cancel-button");
|
|
868
868
|
return document.body.appendChild(r), { host: r, iframe: s, cancelButton: i };
|
|
869
869
|
};
|
|
870
|
-
function
|
|
870
|
+
function Qr(e, t, r) {
|
|
871
871
|
const o = async () => {
|
|
872
872
|
try {
|
|
873
873
|
console.log("🔄 Polling CDE connection...");
|
|
874
|
-
const i = await
|
|
874
|
+
const i = await xr(e, r);
|
|
875
875
|
i && (console.log("🟢 CDE connection successful! Stopping polling..."), console.log("➡️ Got status:", i), clearInterval(s), t(i));
|
|
876
876
|
} catch {
|
|
877
877
|
}
|
|
878
878
|
};
|
|
879
879
|
o();
|
|
880
|
-
const s = setInterval(o,
|
|
880
|
+
const s = setInterval(o, Dt);
|
|
881
881
|
return s;
|
|
882
882
|
}
|
|
883
|
-
function
|
|
883
|
+
function Xr({
|
|
884
884
|
elements: e,
|
|
885
885
|
pollingInterval: t,
|
|
886
886
|
resolve: r
|
|
@@ -892,35 +892,35 @@ function Qr({
|
|
|
892
892
|
e.cancelButton.removeEventListener("click", o);
|
|
893
893
|
};
|
|
894
894
|
}
|
|
895
|
-
async function
|
|
895
|
+
async function eo({
|
|
896
896
|
url: e,
|
|
897
897
|
baseUrl: t
|
|
898
898
|
}) {
|
|
899
|
-
const r =
|
|
899
|
+
const r = Gr(e);
|
|
900
900
|
return new Promise((o) => {
|
|
901
901
|
const s = (c) => {
|
|
902
902
|
setTimeout(() => {
|
|
903
903
|
r.host.remove();
|
|
904
904
|
}, 1e3), o(c), a == null || a();
|
|
905
|
-
}, i =
|
|
905
|
+
}, i = Qr(r.iframe, s, new URL(t).origin), a = Xr({
|
|
906
906
|
elements: r,
|
|
907
907
|
pollingInterval: i,
|
|
908
908
|
resolve: o
|
|
909
909
|
});
|
|
910
910
|
});
|
|
911
911
|
}
|
|
912
|
-
const { log__: P, err__:
|
|
912
|
+
const { log__: P, err__: st } = K("common-cc"), { log__: it } = K("stripe-cc"), to = qe(
|
|
913
913
|
async ({ context: e, checkoutPaymentMethod: t, nonCdeFormInputs: r, flowCallbacks: o }) => {
|
|
914
914
|
var u;
|
|
915
915
|
P("├ Running common CC flow...", { checkoutPaymentMethod: t });
|
|
916
916
|
const s = Array.from(e.cdeConnections.values())[0], i = await B(s);
|
|
917
917
|
P(`├ Validating non-CDE form fields [Mode: ${i.mode}]`);
|
|
918
|
-
const a =
|
|
918
|
+
const a = Je(r, o.onValidationError);
|
|
919
919
|
P(`├ Tokenizing card info in CDE [Session: ${e.elementsSessionId}]`);
|
|
920
920
|
const c = await jr(e.cdeConnections, {
|
|
921
921
|
session_id: e.elementsSessionId
|
|
922
922
|
});
|
|
923
|
-
|
|
923
|
+
zr(c, o.onValidationError);
|
|
924
924
|
const l = {
|
|
925
925
|
session_id: e.elementsSessionId,
|
|
926
926
|
checkout_payment_method: t,
|
|
@@ -929,29 +929,29 @@ const { log__: P, err__: ot } = J("common-cc"), { log__: st } = J("stripe-cc"),
|
|
|
929
929
|
try {
|
|
930
930
|
if (i.mode === "setup") {
|
|
931
931
|
P(`├ Setting up payment method in CDE [Token: ${i.token}]`);
|
|
932
|
-
const d = await
|
|
932
|
+
const d = await Lr(s, l);
|
|
933
933
|
return P(`╰ Setup completed successfully [PM ID: ${d.payment_method_id}]`), { mode: "setup", result: d };
|
|
934
934
|
} else {
|
|
935
935
|
P(`├ Initial checkout flow. Checking out card info in CDE [Session: ${e.elementsSessionId}]`);
|
|
936
|
-
const d = await
|
|
936
|
+
const d = await ot(s, l);
|
|
937
937
|
return P("╰ Checkout completed successfully."), { mode: "checkout", result: d };
|
|
938
938
|
}
|
|
939
939
|
} catch (d) {
|
|
940
|
-
if (d instanceof
|
|
940
|
+
if (d instanceof Tt && d.originalErrorMessage === "3DS_REQUIRED") {
|
|
941
941
|
P("├ Card requires 3DS, starting non-legacy payment flow"), P("error.response.headers", d.response.headers);
|
|
942
|
-
const f = ((u = d.response.headers) == null ? void 0 : u["op-should-use-new-flow"]) === "true", m = await
|
|
943
|
-
if (P(`├ op-should-use-new-flow: ${f}`), P("├ Payment flow result:", m), f ? await
|
|
942
|
+
const f = ((u = d.response.headers) == null ? void 0 : u["op-should-use-new-flow"]) === "true", m = await Mr(s, l);
|
|
943
|
+
if (P(`├ op-should-use-new-flow: ${f}`), P("├ Payment flow result:", m), f ? await oo(m, e.baseUrl) : await so(m), i.mode === "setup") {
|
|
944
944
|
P(`├ Confirming payment flow [cc_pm_id: ${m.cc_pm_id}]`);
|
|
945
945
|
const h = await Ce(s, {
|
|
946
946
|
secure_token: i.token,
|
|
947
947
|
existing_cc_pm_id: m.cc_pm_id
|
|
948
948
|
});
|
|
949
949
|
P("├ Confirm payment flow result received Result:", h);
|
|
950
|
-
const
|
|
951
|
-
return P(`╰ Setup completed successfully [PM ID: ${
|
|
950
|
+
const C = ze(h);
|
|
951
|
+
return P(`╰ Setup completed successfully [PM ID: ${C.payment_method_id}]`), { mode: "setup", result: C };
|
|
952
952
|
} else {
|
|
953
953
|
P(`├ Checking out after 3DS flow [Flow: ${f ? "new" : "legacy"}]`);
|
|
954
|
-
const h = await
|
|
954
|
+
const h = await ot(s, {
|
|
955
955
|
...l,
|
|
956
956
|
existing_cc_pm_id: m.cc_pm_id,
|
|
957
957
|
do_not_use_legacy_cc_flow: !f
|
|
@@ -959,52 +959,52 @@ const { log__: P, err__: ot } = J("common-cc"), { log__: st } = J("stripe-cc"),
|
|
|
959
959
|
return P("╰ Checkout completed successfully."), { mode: "checkout", result: h };
|
|
960
960
|
}
|
|
961
961
|
}
|
|
962
|
-
throw
|
|
962
|
+
throw st("╰ Error checking out card info in CDE"), st(d), d;
|
|
963
963
|
}
|
|
964
964
|
}
|
|
965
|
-
),
|
|
965
|
+
), no = (e) => {
|
|
966
966
|
const t = e.required_user_actions.find((r) => r.type === "stripe_3ds");
|
|
967
967
|
if (!t)
|
|
968
968
|
throw new Error("No stripe 3DS action found");
|
|
969
|
-
return
|
|
970
|
-
},
|
|
969
|
+
return Ct.parse(t);
|
|
970
|
+
}, ro = (e) => {
|
|
971
971
|
const t = e.required_user_actions.find((r) => r.type === "airwallex_payment_consent");
|
|
972
972
|
if (!t)
|
|
973
973
|
throw new Error("No common 3DS action found");
|
|
974
|
-
return
|
|
975
|
-
},
|
|
976
|
-
const r =
|
|
974
|
+
return Wn.parse(t);
|
|
975
|
+
}, oo = async (e, t) => {
|
|
976
|
+
const r = ro(e);
|
|
977
977
|
P(`├ Using common 3DS flow [URL: ${r.redirect_url}]`);
|
|
978
|
-
const o = await
|
|
978
|
+
const o = await eo({ url: r.redirect_url, baseUrl: t });
|
|
979
979
|
if (P(`╰ 3DS verification completed [Status: ${o}]`), o === ge.CANCELLED)
|
|
980
980
|
throw new Error("3DS verification cancelled");
|
|
981
981
|
if (o === ge.FAILURE)
|
|
982
982
|
throw new Error("3DS verification failed");
|
|
983
|
-
},
|
|
984
|
-
const t =
|
|
985
|
-
|
|
986
|
-
}, { log__:
|
|
983
|
+
}, so = async (e) => {
|
|
984
|
+
const t = no(e);
|
|
985
|
+
it(`├ Using stripe 3DS flow [Client Secret: ${t.client_secret.substring(0, 8)}...]`), await St(t), it("╰ Stripe 3DS flow completed successfully");
|
|
986
|
+
}, { log__: A, err__: io } = K("stripe-pr"), ao = n.object({
|
|
987
987
|
provider: n.union([n.literal("apple_pay"), n.literal("google_pay")]),
|
|
988
988
|
processor_name: n.literal("stripe"),
|
|
989
989
|
metadata: n.object({
|
|
990
990
|
stripe_pk: n.string()
|
|
991
991
|
})
|
|
992
|
-
}),
|
|
992
|
+
}), co = Ft(
|
|
993
993
|
async ({ context: e }) => {
|
|
994
|
-
|
|
995
|
-
const t =
|
|
996
|
-
|
|
994
|
+
A("Checking if there are any CPMs for Stripe PR...");
|
|
995
|
+
const t = Nt(e.checkoutPaymentMethods, ao);
|
|
996
|
+
A("Initializing Stripe PR flow...");
|
|
997
997
|
const r = Array.from(e.cdeConnections.values())[0], o = await B(r), s = o.mode === "setup";
|
|
998
|
-
|
|
999
|
-
const i = await
|
|
998
|
+
A("Getting initial preview amount");
|
|
999
|
+
const i = await Ue(r, o.token, s, void 0), a = await Xn(
|
|
1000
1000
|
t.metadata.stripe_pk,
|
|
1001
1001
|
i.amountAtom,
|
|
1002
1002
|
i.currency,
|
|
1003
1003
|
s
|
|
1004
1004
|
);
|
|
1005
|
-
|
|
1005
|
+
A("Checking if can make payment");
|
|
1006
1006
|
const c = await a.canMakePayment();
|
|
1007
|
-
return c === null ? (
|
|
1007
|
+
return c === null ? (io("canMakePayment returned null"), { isAvailable: !1, reason: "canMakePayment returned null" }) : (A("Stripe PR flow initialized successfully. Can make payment", c), {
|
|
1008
1008
|
isAvailable: !0,
|
|
1009
1009
|
pr: a,
|
|
1010
1010
|
availableProviders: {
|
|
@@ -1013,7 +1013,7 @@ const { log__: P, err__: ot } = J("common-cc"), { log__: st } = J("stripe-cc"),
|
|
|
1013
1013
|
}
|
|
1014
1014
|
});
|
|
1015
1015
|
}
|
|
1016
|
-
),
|
|
1016
|
+
), lo = qe(
|
|
1017
1017
|
async ({
|
|
1018
1018
|
context: e,
|
|
1019
1019
|
checkoutPaymentMethod: t,
|
|
@@ -1022,33 +1022,33 @@ const { log__: P, err__: ot } = J("common-cc"), { log__: st } = J("stripe-cc"),
|
|
|
1022
1022
|
customParams: s,
|
|
1023
1023
|
initResult: i
|
|
1024
1024
|
}) => {
|
|
1025
|
-
if (
|
|
1025
|
+
if (A("Running Stripe PR flow..."), s.provider !== t.provider)
|
|
1026
1026
|
throw new Error(`Provider mismatch. Expected ${s.provider}, got ${t.provider}`);
|
|
1027
1027
|
const a = Array.from(e.cdeConnections.values())[0], c = i.pr;
|
|
1028
1028
|
if (s != null && s.overridePaymentRequest) {
|
|
1029
|
-
const
|
|
1030
|
-
|
|
1029
|
+
const C = s.overridePaymentRequest;
|
|
1030
|
+
A("Overriding PR amount with", C), mo(c, C.amount, C.pending);
|
|
1031
1031
|
}
|
|
1032
|
-
|
|
1033
|
-
const l = await
|
|
1034
|
-
|
|
1035
|
-
const u =
|
|
1036
|
-
|
|
1037
|
-
const f = await
|
|
1032
|
+
A("Showing PR dialog..."), c.show();
|
|
1033
|
+
const l = await er(c);
|
|
1034
|
+
A("Stripe PM added event:", l), A("Merging PM fields with form fields...");
|
|
1035
|
+
const u = uo(r, l), d = Je(u, o.onValidationError);
|
|
1036
|
+
A("PR dialog finished. Starting payment flow...");
|
|
1037
|
+
const f = await Dr(a, {
|
|
1038
1038
|
fields: d,
|
|
1039
1039
|
checkoutPaymentMethod: t
|
|
1040
|
-
}), m =
|
|
1041
|
-
|
|
1040
|
+
}), m = po(f);
|
|
1041
|
+
A("Confirming PR with Stripe..."), await nr(m, l);
|
|
1042
1042
|
const h = await B(a);
|
|
1043
1043
|
if (h.mode === "setup") {
|
|
1044
|
-
|
|
1045
|
-
const
|
|
1044
|
+
A("Confirming payment flow for setup...");
|
|
1045
|
+
const C = await Ce(a, {
|
|
1046
1046
|
secure_token: h.token
|
|
1047
1047
|
});
|
|
1048
|
-
return { mode: "setup", result:
|
|
1048
|
+
return { mode: "setup", result: ze(C) };
|
|
1049
1049
|
} else {
|
|
1050
|
-
|
|
1051
|
-
const
|
|
1050
|
+
A("Performing checkout...");
|
|
1051
|
+
const C = {
|
|
1052
1052
|
secure_token: h.token,
|
|
1053
1053
|
payment_input: {
|
|
1054
1054
|
provider_type: t.provider
|
|
@@ -1062,14 +1062,14 @@ const { log__: P, err__: ot } = J("common-cc"), { log__: st } = J("stripe-cc"),
|
|
|
1062
1062
|
cancel_at_end: !1,
|
|
1063
1063
|
checkout_payment_method: t
|
|
1064
1064
|
};
|
|
1065
|
-
return { mode: "checkout", result: await
|
|
1065
|
+
return { mode: "checkout", result: await Mt(a, C) };
|
|
1066
1066
|
}
|
|
1067
1067
|
}
|
|
1068
|
-
),
|
|
1068
|
+
), uo = (e, t) => {
|
|
1069
1069
|
var a, c, l, u;
|
|
1070
1070
|
const r = { ...e }, [o, ...s] = ((c = (a = t.payerName) == null ? void 0 : a.trim()) == null ? void 0 : c.split(/\s+/)) ?? [], i = s.join(" ") || void 0;
|
|
1071
|
-
return r[_.FIRST_NAME] = r[_.FIRST_NAME] || o || "_OP_UNKNOWN", r[_.LAST_NAME] = r[_.LAST_NAME] || i || "_OP_UNKNOWN", r[_.EMAIL] = r[_.EMAIL] || t.payerEmail || "op_unfilled@getopenpay.com", r[_.ZIP_CODE] = r[_.ZIP_CODE] || ((l = t.shippingAddress) == null ? void 0 : l.postalCode) || "00000", r[_.COUNTRY] = r[_.COUNTRY] || ((u = t.shippingAddress) == null ? void 0 : u.country) || "US",
|
|
1072
|
-
},
|
|
1071
|
+
return r[_.FIRST_NAME] = r[_.FIRST_NAME] || o || "_OP_UNKNOWN", r[_.LAST_NAME] = r[_.LAST_NAME] || i || "_OP_UNKNOWN", r[_.EMAIL] = r[_.EMAIL] || t.payerEmail || "op_unfilled@getopenpay.com", r[_.ZIP_CODE] = r[_.ZIP_CODE] || ((l = t.shippingAddress) == null ? void 0 : l.postalCode) || "00000", r[_.COUNTRY] = r[_.COUNTRY] || ((u = t.shippingAddress) == null ? void 0 : u.country) || "US", A("Final form inputs:", r), r;
|
|
1072
|
+
}, mo = (e, t, r) => {
|
|
1073
1073
|
e.update({
|
|
1074
1074
|
total: {
|
|
1075
1075
|
amount: t.amountAtom,
|
|
@@ -1078,12 +1078,12 @@ const { log__: P, err__: ot } = J("common-cc"), { log__: st } = J("stripe-cc"),
|
|
|
1078
1078
|
},
|
|
1079
1079
|
currency: t.currency
|
|
1080
1080
|
});
|
|
1081
|
-
},
|
|
1081
|
+
}, po = (e) => {
|
|
1082
1082
|
if (e.required_user_actions.length !== 1)
|
|
1083
1083
|
throw new Error(`Error occurred.
|
|
1084
1084
|
Details: got ${e.required_user_actions.length} required user actions`);
|
|
1085
|
-
return
|
|
1086
|
-
},
|
|
1085
|
+
return Bn.parse(e.required_user_actions[0]);
|
|
1086
|
+
}, at = (e, t, r) => {
|
|
1087
1087
|
const o = e.filter((s) => s.provider === t);
|
|
1088
1088
|
if (o.length === 0)
|
|
1089
1089
|
throw console.error("CPMs list", e), new Error(`No CPMs found with provider '${t}' and processor '${r}'`);
|
|
@@ -1094,21 +1094,21 @@ Details: got ${e.required_user_actions.length} required user actions`);
|
|
|
1094
1094
|
// ✋ Note: For flows that require initialization, please add them to `init-flows.ts`
|
|
1095
1095
|
// Common
|
|
1096
1096
|
commonCC: {
|
|
1097
|
-
run:
|
|
1097
|
+
run: to
|
|
1098
1098
|
},
|
|
1099
1099
|
// Stripe
|
|
1100
1100
|
stripePR: {
|
|
1101
|
-
init:
|
|
1102
|
-
run:
|
|
1101
|
+
init: co,
|
|
1102
|
+
run: lo
|
|
1103
1103
|
},
|
|
1104
1104
|
stripeLink: {
|
|
1105
|
-
init:
|
|
1106
|
-
run:
|
|
1105
|
+
init: Yr,
|
|
1106
|
+
run: Zr
|
|
1107
1107
|
}
|
|
1108
1108
|
// 👉 Add more flows here
|
|
1109
1109
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1110
1110
|
};
|
|
1111
|
-
function
|
|
1111
|
+
function Lt(e) {
|
|
1112
1112
|
return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
|
|
1113
1113
|
}
|
|
1114
1114
|
var be = {};
|
|
@@ -1116,7 +1116,7 @@ Object.defineProperty(be, "__esModule", {
|
|
|
1116
1116
|
value: !0
|
|
1117
1117
|
});
|
|
1118
1118
|
be.Observable = void 0;
|
|
1119
|
-
const
|
|
1119
|
+
const xt = (e) => !!Symbol[e], He = (e) => xt(e) ? Symbol[e] : "@@" + e, fo = He("iterator"), xe = He("observable"), $t = He("species");
|
|
1120
1120
|
function we(e, t) {
|
|
1121
1121
|
let r = e[t];
|
|
1122
1122
|
if (r != null) {
|
|
@@ -1126,9 +1126,9 @@ function we(e, t) {
|
|
|
1126
1126
|
}
|
|
1127
1127
|
function oe(e) {
|
|
1128
1128
|
let t = e.constructor;
|
|
1129
|
-
return t !== void 0 && (t = t[
|
|
1129
|
+
return t !== void 0 && (t = t[$t], t === null && (t = void 0)), t !== void 0 ? t : Se;
|
|
1130
1130
|
}
|
|
1131
|
-
function
|
|
1131
|
+
function yo(e) {
|
|
1132
1132
|
return e instanceof Se;
|
|
1133
1133
|
}
|
|
1134
1134
|
function te(e) {
|
|
@@ -1145,7 +1145,7 @@ function fe(e) {
|
|
|
1145
1145
|
}
|
|
1146
1146
|
});
|
|
1147
1147
|
}
|
|
1148
|
-
function
|
|
1148
|
+
function Ut(e) {
|
|
1149
1149
|
let t = e._cleanup;
|
|
1150
1150
|
if (t !== void 0 && (e._cleanup = void 0, !!t))
|
|
1151
1151
|
try {
|
|
@@ -1159,18 +1159,18 @@ function $t(e) {
|
|
|
1159
1159
|
te(r);
|
|
1160
1160
|
}
|
|
1161
1161
|
}
|
|
1162
|
-
function
|
|
1162
|
+
function $e(e) {
|
|
1163
1163
|
e._observer = void 0, e._queue = void 0, e._state = "closed";
|
|
1164
1164
|
}
|
|
1165
|
-
function
|
|
1165
|
+
function _o(e) {
|
|
1166
1166
|
let t = e._queue;
|
|
1167
1167
|
if (t) {
|
|
1168
1168
|
e._queue = void 0, e._state = "ready";
|
|
1169
|
-
for (let r = 0; r < t.length && (
|
|
1169
|
+
for (let r = 0; r < t.length && (qt(e, t[r].type, t[r].value), e._state !== "closed"); ++r)
|
|
1170
1170
|
;
|
|
1171
1171
|
}
|
|
1172
1172
|
}
|
|
1173
|
-
function
|
|
1173
|
+
function qt(e, t, r) {
|
|
1174
1174
|
e._state = "running";
|
|
1175
1175
|
let o = e._observer;
|
|
1176
1176
|
try {
|
|
@@ -1180,17 +1180,17 @@ function Ut(e, t, r) {
|
|
|
1180
1180
|
s && s.call(o, r);
|
|
1181
1181
|
break;
|
|
1182
1182
|
case "error":
|
|
1183
|
-
if (
|
|
1183
|
+
if ($e(e), s) s.call(o, r);
|
|
1184
1184
|
else throw r;
|
|
1185
1185
|
break;
|
|
1186
1186
|
case "complete":
|
|
1187
|
-
|
|
1187
|
+
$e(e), s && s.call(o);
|
|
1188
1188
|
break;
|
|
1189
1189
|
}
|
|
1190
1190
|
} catch (s) {
|
|
1191
1191
|
te(s);
|
|
1192
1192
|
}
|
|
1193
|
-
e._state === "closed" ?
|
|
1193
|
+
e._state === "closed" ? Ut(e) : e._state === "running" && (e._state = "ready");
|
|
1194
1194
|
}
|
|
1195
1195
|
function je(e, t, r) {
|
|
1196
1196
|
if (e._state !== "closed") {
|
|
@@ -1205,13 +1205,13 @@ function je(e, t, r) {
|
|
|
1205
1205
|
e._state = "buffering", e._queue = [{
|
|
1206
1206
|
type: t,
|
|
1207
1207
|
value: r
|
|
1208
|
-
}], fe(() =>
|
|
1208
|
+
}], fe(() => _o(e));
|
|
1209
1209
|
return;
|
|
1210
1210
|
}
|
|
1211
|
-
|
|
1211
|
+
qt(e, t, r);
|
|
1212
1212
|
}
|
|
1213
1213
|
}
|
|
1214
|
-
class
|
|
1214
|
+
class go {
|
|
1215
1215
|
constructor(t, r) {
|
|
1216
1216
|
this._cleanup = void 0, this._observer = t, this._queue = void 0, this._state = "initializing";
|
|
1217
1217
|
let o = this, s = {
|
|
@@ -1239,7 +1239,7 @@ class _o {
|
|
|
1239
1239
|
return this._state === "closed";
|
|
1240
1240
|
}
|
|
1241
1241
|
unsubscribe() {
|
|
1242
|
-
this._state !== "closed" && (
|
|
1242
|
+
this._state !== "closed" && ($e(this), Ut(this));
|
|
1243
1243
|
}
|
|
1244
1244
|
}
|
|
1245
1245
|
let Se = class ye {
|
|
@@ -1253,7 +1253,7 @@ let Se = class ye {
|
|
|
1253
1253
|
next: t,
|
|
1254
1254
|
error: arguments[1],
|
|
1255
1255
|
complete: arguments[2]
|
|
1256
|
-
}), new
|
|
1256
|
+
}), new go(t, this._subscriber);
|
|
1257
1257
|
}
|
|
1258
1258
|
forEach(t) {
|
|
1259
1259
|
return new Promise((r, o) => {
|
|
@@ -1408,19 +1408,19 @@ let Se = class ye {
|
|
|
1408
1408
|
};
|
|
1409
1409
|
});
|
|
1410
1410
|
}
|
|
1411
|
-
[
|
|
1411
|
+
[xe]() {
|
|
1412
1412
|
return this;
|
|
1413
1413
|
}
|
|
1414
1414
|
static from(t) {
|
|
1415
1415
|
let r = typeof this == "function" ? this : ye;
|
|
1416
1416
|
if (t == null) throw new TypeError(t + " is not an object");
|
|
1417
|
-
let o = we(t,
|
|
1417
|
+
let o = we(t, xe);
|
|
1418
1418
|
if (o) {
|
|
1419
1419
|
let s = o.call(t);
|
|
1420
1420
|
if (Object(s) !== s) throw new TypeError(s + " is not an object");
|
|
1421
|
-
return
|
|
1421
|
+
return yo(s) && s.constructor === r ? s : new r((i) => s.subscribe(i));
|
|
1422
1422
|
}
|
|
1423
|
-
if (
|
|
1423
|
+
if (xt("iterator") && (o = we(t, fo), o))
|
|
1424
1424
|
return new r((s) => {
|
|
1425
1425
|
fe(() => {
|
|
1426
1426
|
if (!s.closed) {
|
|
@@ -1454,30 +1454,30 @@ let Se = class ye {
|
|
|
1454
1454
|
});
|
|
1455
1455
|
});
|
|
1456
1456
|
}
|
|
1457
|
-
static get [
|
|
1457
|
+
static get [$t]() {
|
|
1458
1458
|
return this;
|
|
1459
1459
|
}
|
|
1460
1460
|
};
|
|
1461
1461
|
be.Observable = Se;
|
|
1462
1462
|
Object.defineProperty(Se, Symbol("extensions"), {
|
|
1463
1463
|
value: {
|
|
1464
|
-
symbol:
|
|
1464
|
+
symbol: xe,
|
|
1465
1465
|
hostReportError: te
|
|
1466
1466
|
},
|
|
1467
1467
|
configurable: !0
|
|
1468
1468
|
});
|
|
1469
|
-
var
|
|
1470
|
-
const
|
|
1469
|
+
var ho = be.Observable;
|
|
1470
|
+
const wo = /* @__PURE__ */ Lt(ho), { log__: Eo, err__: Co } = K("init-flows"), bo = () => ("ojs_init_results" in window || (window.ojs_init_results = {}), window.ojs_init_results), So = (e, t) => {
|
|
1471
1471
|
const r = { context: e, flowCallbacks: t };
|
|
1472
|
-
return {
|
|
1472
|
+
return console.log("[OJS] initializing OJS flows..."), {
|
|
1473
1473
|
// Stripe PR
|
|
1474
|
-
stripePR:
|
|
1474
|
+
stripePR: ct("stripePR", ae.stripePR.init(r)),
|
|
1475
1475
|
// Stripe Link
|
|
1476
|
-
stripeLink:
|
|
1476
|
+
stripeLink: ct("stripeLink", ae.stripeLink.init(r))
|
|
1477
1477
|
// 👉 Add initialization flows here
|
|
1478
1478
|
};
|
|
1479
|
-
},
|
|
1480
|
-
const r = new
|
|
1479
|
+
}, ct = (e, t) => {
|
|
1480
|
+
const r = new wo((o) => {
|
|
1481
1481
|
o.next({ status: "loading" }), t.then((s) => {
|
|
1482
1482
|
o.next({ status: "loaded", result: s });
|
|
1483
1483
|
}).catch((s) => {
|
|
@@ -1486,10 +1486,10 @@ const ho = /* @__PURE__ */ Nt(go), { log__: wo, err__: Eo } = J("init-flows"), C
|
|
|
1486
1486
|
});
|
|
1487
1487
|
return r.subscribe({
|
|
1488
1488
|
next: (o) => {
|
|
1489
|
-
|
|
1489
|
+
Eo(`${e} flow result`, o), bo()[e] = o;
|
|
1490
1490
|
},
|
|
1491
1491
|
error: (o) => {
|
|
1492
|
-
throw
|
|
1492
|
+
throw Co(`${e} flow initialization error:
|
|
1493
1493
|
${JSON.stringify(o)}`), o;
|
|
1494
1494
|
}
|
|
1495
1495
|
}), r;
|
|
@@ -1503,17 +1503,17 @@ ${JSON.stringify(o)}`), o;
|
|
|
1503
1503
|
and ".isAvailable" to know if a payment request is available.`
|
|
1504
1504
|
);
|
|
1505
1505
|
}
|
|
1506
|
-
},
|
|
1506
|
+
}, lt = {
|
|
1507
1507
|
isLoading: !1,
|
|
1508
1508
|
isAvailable: !1,
|
|
1509
1509
|
startFlow: async () => {
|
|
1510
1510
|
console.error("startFlow triggered when payment request is not available.");
|
|
1511
1511
|
}
|
|
1512
1512
|
};
|
|
1513
|
-
var Ve = { exports: {} },
|
|
1514
|
-
function
|
|
1513
|
+
var Ve = { exports: {} }, Po = dn;
|
|
1514
|
+
function zt(e, t, r) {
|
|
1515
1515
|
var o = typeof t == "function";
|
|
1516
|
-
|
|
1516
|
+
Po.useEffect(function() {
|
|
1517
1517
|
var s, i = !0, a = e(function() {
|
|
1518
1518
|
return i;
|
|
1519
1519
|
});
|
|
@@ -1524,11 +1524,11 @@ function qt(e, t, r) {
|
|
|
1524
1524
|
};
|
|
1525
1525
|
}, o ? r : t);
|
|
1526
1526
|
}
|
|
1527
|
-
Ve.exports =
|
|
1528
|
-
Ve.exports.useAsyncEffect =
|
|
1529
|
-
var
|
|
1530
|
-
const
|
|
1531
|
-
function
|
|
1527
|
+
Ve.exports = zt;
|
|
1528
|
+
Ve.exports.useAsyncEffect = zt;
|
|
1529
|
+
var vo = Ve.exports;
|
|
1530
|
+
const ut = /* @__PURE__ */ Lt(vo);
|
|
1531
|
+
function ko(e, t = 0) {
|
|
1532
1532
|
const r = se(!1), o = se(), s = se(e), i = W(() => r.current, []), a = W(() => {
|
|
1533
1533
|
r.current = !1, o.current && clearTimeout(o.current), o.current = setTimeout(() => {
|
|
1534
1534
|
r.current = !0, s.current();
|
|
@@ -1536,40 +1536,40 @@ function vo(e, t = 0) {
|
|
|
1536
1536
|
}, [t]), c = W(() => {
|
|
1537
1537
|
r.current = null, o.current && clearTimeout(o.current);
|
|
1538
1538
|
}, []);
|
|
1539
|
-
return
|
|
1539
|
+
return J(() => {
|
|
1540
1540
|
s.current = e;
|
|
1541
|
-
}, [e]),
|
|
1541
|
+
}, [e]), J(() => (a(), c), [t]), [i, c, a];
|
|
1542
1542
|
}
|
|
1543
|
-
function
|
|
1544
|
-
const [o, s, i] =
|
|
1545
|
-
return
|
|
1543
|
+
function Oo(e, t = 0, r = []) {
|
|
1544
|
+
const [o, s, i] = ko(e, t);
|
|
1545
|
+
return J(i, r), [o, s];
|
|
1546
1546
|
}
|
|
1547
|
-
const
|
|
1548
|
-
const [s, i] =
|
|
1549
|
-
return
|
|
1547
|
+
const Ro = (e, t, r, o) => {
|
|
1548
|
+
const [s, i] = E(""), [a, c] = E(""), [l, u] = E(null), [d, f] = E(!1), [m, h] = E(null);
|
|
1549
|
+
return ut(async () => {
|
|
1550
1550
|
if (!o || !e)
|
|
1551
1551
|
return;
|
|
1552
|
-
const
|
|
1553
|
-
|
|
1554
|
-
f(!0), h(null), i(
|
|
1552
|
+
const C = await Fr(o, _.PROMOTION_CODE);
|
|
1553
|
+
C == null || C.addEventListener("input", () => {
|
|
1554
|
+
f(!0), h(null), i(C.value);
|
|
1555
1555
|
});
|
|
1556
|
-
}, [!!o, e]),
|
|
1556
|
+
}, [!!o, e]), Oo(
|
|
1557
1557
|
() => {
|
|
1558
1558
|
e && c(s);
|
|
1559
1559
|
},
|
|
1560
1560
|
1e3,
|
|
1561
1561
|
[s, e]
|
|
1562
|
-
),
|
|
1563
|
-
async (
|
|
1562
|
+
), ut(
|
|
1563
|
+
async (C) => {
|
|
1564
1564
|
try {
|
|
1565
1565
|
if (!t || !r || !e)
|
|
1566
1566
|
return;
|
|
1567
|
-
const ve = (await B(t)).mode === "setup",
|
|
1568
|
-
console.log("[useDynamicPreview] Querying. Promo code:", a),
|
|
1567
|
+
const ve = (await B(t)).mode === "setup", N = await Ue(t, r, ve, a);
|
|
1568
|
+
console.log("[useDynamicPreview] Querying. Promo code:", a), C() ? (console.log("[useDynamicPreview] Setting preview:", a, N), h(null), u(N)) : console.log("[useDynamicPreview] Discarding:", N);
|
|
1569
1569
|
} catch (M) {
|
|
1570
|
-
|
|
1570
|
+
C() && (console.error("[useDynamicPreview] Error doing preview", ie(M)), h(ie(M)));
|
|
1571
1571
|
} finally {
|
|
1572
|
-
|
|
1572
|
+
C() && f(!1);
|
|
1573
1573
|
}
|
|
1574
1574
|
},
|
|
1575
1575
|
[!t, !r, a, e]
|
|
@@ -1578,8 +1578,8 @@ const Oo = (e, t, r, o) => {
|
|
|
1578
1578
|
isLoading: d,
|
|
1579
1579
|
error: m
|
|
1580
1580
|
};
|
|
1581
|
-
},
|
|
1582
|
-
const [t, r] =
|
|
1581
|
+
}, Jt = (e = {}) => {
|
|
1582
|
+
const [t, r] = E(e), o = ee(
|
|
1583
1583
|
() => ({
|
|
1584
1584
|
set: (i, a) => {
|
|
1585
1585
|
r((c) => ({
|
|
@@ -1605,28 +1605,29 @@ const Oo = (e, t, r, o) => {
|
|
|
1605
1605
|
...o
|
|
1606
1606
|
};
|
|
1607
1607
|
return [t, s];
|
|
1608
|
-
},
|
|
1609
|
-
const [e, t] =
|
|
1608
|
+
}, Io = () => {
|
|
1609
|
+
const [e, t] = E(0), [r, o] = Jt({
|
|
1610
1610
|
card: void 0,
|
|
1611
1611
|
"card-cvc": void 0,
|
|
1612
1612
|
"card-expiry": void 0,
|
|
1613
1613
|
"card-number": void 0
|
|
1614
|
-
}),
|
|
1614
|
+
}), s = Object.values(r).filter((i) => i !== void 0)[0] ?? null;
|
|
1615
1615
|
return {
|
|
1616
|
-
cdeConns:
|
|
1617
|
-
anyCdeConn:
|
|
1618
|
-
connectToCdeIframe: async (
|
|
1619
|
-
|
|
1620
|
-
}
|
|
1616
|
+
cdeConns: r,
|
|
1617
|
+
anyCdeConn: s,
|
|
1618
|
+
connectToCdeIframe: async (i, a) => {
|
|
1619
|
+
o.set(i, await lr(a)), t(Object.values(r).length);
|
|
1620
|
+
},
|
|
1621
|
+
numCdeConns: e
|
|
1621
1622
|
};
|
|
1622
|
-
},
|
|
1623
|
-
const t = e.replace("ojs-", "").replace("-element", ""), r =
|
|
1623
|
+
}, Ao = (e) => {
|
|
1624
|
+
const t = e.replace("ojs-", "").replace("-element", ""), r = Pn.safeParse(t);
|
|
1624
1625
|
if (!r.success)
|
|
1625
1626
|
throw new Error(
|
|
1626
1627
|
`Invalid element id: ${e}, it needs to be in the format "ojs-{elementType}-element" (e.g. "ojs-card-number-element")`
|
|
1627
1628
|
);
|
|
1628
1629
|
return r.data;
|
|
1629
|
-
},
|
|
1630
|
+
}, xo = (e) => {
|
|
1630
1631
|
const {
|
|
1631
1632
|
children: t,
|
|
1632
1633
|
checkoutSecureToken: r,
|
|
@@ -1641,30 +1642,30 @@ const Oo = (e, t, r, o) => {
|
|
|
1641
1642
|
onCheckoutSuccess: f,
|
|
1642
1643
|
onCheckoutError: m,
|
|
1643
1644
|
onSetupPaymentMethodSuccess: h,
|
|
1644
|
-
baseUrl:
|
|
1645
|
+
baseUrl: C,
|
|
1645
1646
|
enableDynamicPreviews: M,
|
|
1646
1647
|
customInitParams: ve
|
|
1647
|
-
} = e,
|
|
1648
|
+
} = e, N = C ?? yn, [Ht, Vt] = E(void 0), [Ke, Kt] = E([]), [Yt, Zt] = E("1px"), [ke, Wt] = E(!1), [$, Oe] = E(void 0), [Ye, Y] = E(!1), [Z, Bt] = E([]), [ne, Gt] = E({}), [Ze, de] = E(0), [We, H] = E(!1), [U, Qt] = E(void 0), [Be, Xt] = E(void 0), [Ge, en] = E(void 0), [q, tn] = E(void 0), [Re] = E(void 0), G = ee(() => `opjs-form-${dt()}`, []), D = se(null), { cdeConns: Qe, anyCdeConn: Q, connectToCdeIframe: nn, numCdeConns: Ie } = Io(), [rn, on] = E(null), [Xe, X] = Jt({
|
|
1648
1649
|
apple_pay: pe,
|
|
1649
1650
|
google_pay: pe
|
|
1650
1651
|
});
|
|
1651
|
-
|
|
1652
|
-
const p = { version: "0.1.
|
|
1652
|
+
J(() => {
|
|
1653
|
+
const p = { version: "0.1.10", release_version: "0.1.10" };
|
|
1653
1654
|
window.ojs_version = p, console.log("OJS version:", p);
|
|
1654
1655
|
}, []);
|
|
1655
|
-
const
|
|
1656
|
+
const sn = Ro(
|
|
1656
1657
|
M ?? !1,
|
|
1657
1658
|
Q,
|
|
1658
1659
|
r,
|
|
1659
1660
|
D.current
|
|
1660
|
-
),
|
|
1661
|
+
), Ae = W(
|
|
1661
1662
|
(p) => {
|
|
1662
|
-
if (p.origin !==
|
|
1663
|
-
const
|
|
1664
|
-
if (
|
|
1663
|
+
if (p.origin !== N || !p.source) return;
|
|
1664
|
+
const F = p.source;
|
|
1665
|
+
if (!$r(p.data))
|
|
1665
1666
|
return;
|
|
1666
|
-
const
|
|
1667
|
-
if (g.formId !== G || !
|
|
1667
|
+
const I = JSON.parse(p.data), g = ir(I), z = g.elementId;
|
|
1668
|
+
if (g.formId !== G || !z) {
|
|
1668
1669
|
console.warn("[form] Ignoring unknown event:", g);
|
|
1669
1670
|
return;
|
|
1670
1671
|
}
|
|
@@ -1674,9 +1675,9 @@ const Oo = (e, t, r, o) => {
|
|
|
1674
1675
|
}
|
|
1675
1676
|
Kt((k) => [...k, g.nonce]);
|
|
1676
1677
|
const y = g.payload, v = y.type;
|
|
1677
|
-
if (console.log(`[form] Received ${v} event from ${
|
|
1678
|
+
if (console.log(`[form] Received ${v} event from ${z}:`, g.payload), v === w.enum.LAYOUT) {
|
|
1678
1679
|
const k = y.height ? `${y.height}px` : "100%";
|
|
1679
|
-
|
|
1680
|
+
Zt(k), console.log(`[form] Element height set to: ${k}`);
|
|
1680
1681
|
} else if (v === w.enum.FOCUS && s)
|
|
1681
1682
|
s(g.elementId);
|
|
1682
1683
|
else if (v === w.enum.BLUR && i)
|
|
@@ -1684,12 +1685,12 @@ const Oo = (e, t, r, o) => {
|
|
|
1684
1685
|
else if (v === w.enum.CHANGE && a)
|
|
1685
1686
|
a(g.elementId);
|
|
1686
1687
|
else if (v === w.enum.LOADED) {
|
|
1687
|
-
const k = Z.find((b) => b.contentWindow ===
|
|
1688
|
+
const k = Z.find((b) => b.contentWindow === F);
|
|
1688
1689
|
if (Y(!1), !k) {
|
|
1689
1690
|
console.warn("[form] Ignoring LOADED event from unregistered iframe:", g);
|
|
1690
1691
|
return;
|
|
1691
1692
|
}
|
|
1692
|
-
|
|
1693
|
+
Gt((b) => ({ ...b, [z]: F })), en(y.totalAmountAtoms), Xt(y.currency), tn(y.checkoutPaymentMethods), U || Qt(y.sessionId), console.log("[form] Element loaded with prefill data:", y);
|
|
1693
1694
|
} else if (v === w.enum.TOKENIZE_STARTED)
|
|
1694
1695
|
console.log("[form] Tokenization started"), Y(!0);
|
|
1695
1696
|
else if (v === w.enum.CHECKOUT_STARTED)
|
|
@@ -1704,22 +1705,22 @@ const Oo = (e, t, r, o) => {
|
|
|
1704
1705
|
if (console.log("[form] Confirm payment flow: next actions:", y.nextActionMetadata), b === void 0)
|
|
1705
1706
|
console.log("[form] Confirming payment flow (No-op)");
|
|
1706
1707
|
else if (b === "stripe_3ds")
|
|
1707
|
-
console.log("[form] Confirming payment flow (Stripe 3DS"), await
|
|
1708
|
+
console.log("[form] Confirming payment flow (Stripe 3DS"), await rr(y);
|
|
1708
1709
|
else if (b === "stripe_payment_request") {
|
|
1709
1710
|
if (!Re)
|
|
1710
1711
|
throw new Error("Stripe PM not set");
|
|
1711
|
-
console.log("[form] Confirming payment flow (Stripe PR)"), await
|
|
1712
|
+
console.log("[form] Confirming payment flow (Stripe PR)"), await tr(y, Re);
|
|
1712
1713
|
} else
|
|
1713
1714
|
throw new Error(`Unknown next action type: ${b}`);
|
|
1714
|
-
const
|
|
1715
|
-
if (
|
|
1715
|
+
const j = await B(Q);
|
|
1716
|
+
if (j.mode === "setup") {
|
|
1716
1717
|
const { payment_methods: L } = await Ce(Q, {
|
|
1717
|
-
secure_token:
|
|
1718
|
+
secure_token: j.token,
|
|
1718
1719
|
existing_cc_pm_id: $.existingCCPMId
|
|
1719
1720
|
});
|
|
1720
1721
|
if (L.length !== 1)
|
|
1721
1722
|
throw new Error(`Expected exactly one payment method, got ${L.length}`);
|
|
1722
|
-
return console.log("[form] PF setup payment method complete:", L), Y(!1), de(0),
|
|
1723
|
+
return console.log("[form] PF setup payment method complete:", L), Y(!1), de(0), H(!1), h && h(L[0].id), {
|
|
1723
1724
|
proceedToCheckout: !1
|
|
1724
1725
|
};
|
|
1725
1726
|
} else
|
|
@@ -1733,42 +1734,42 @@ const Oo = (e, t, r, o) => {
|
|
|
1733
1734
|
return;
|
|
1734
1735
|
}
|
|
1735
1736
|
console.log("[form] Starting checkout from payment flow.");
|
|
1736
|
-
let
|
|
1737
|
-
if ($.checkoutPaymentMethod.provider === "credit_card" && (
|
|
1737
|
+
let j;
|
|
1738
|
+
if ($.checkoutPaymentMethod.provider === "credit_card" && (j = (L = y.startPFMetadata) == null ? void 0 : L.cc_pm_id, !j))
|
|
1738
1739
|
throw new Error("CC PM ID not found");
|
|
1739
|
-
|
|
1740
|
-
|
|
1740
|
+
Ne(
|
|
1741
|
+
F,
|
|
1741
1742
|
G,
|
|
1742
|
-
|
|
1743
|
-
{ ...$, type: "CHECKOUT", doNotUseLegacyCCFlow: !0, existingCCPMId:
|
|
1744
|
-
|
|
1745
|
-
),
|
|
1743
|
+
z,
|
|
1744
|
+
{ ...$, type: "CHECKOUT", doNotUseLegacyCCFlow: !0, existingCCPMId: j },
|
|
1745
|
+
N
|
|
1746
|
+
), H(!0), Oe(void 0), d && d();
|
|
1746
1747
|
}).catch((b) => {
|
|
1747
1748
|
console.log("[form] Confirmation payment flow error"), console.error(b);
|
|
1748
|
-
const
|
|
1749
|
-
Y(!1),
|
|
1749
|
+
const j = ie(b);
|
|
1750
|
+
Y(!1), H(!1), m && m(j);
|
|
1750
1751
|
});
|
|
1751
1752
|
} else if (v === w.enum.TOKENIZE_SUCCESS && $) {
|
|
1752
|
-
const k =
|
|
1753
|
-
!
|
|
1753
|
+
const k = Ze + 1, b = k === Object.keys(ne).length;
|
|
1754
|
+
!We && (b || y.isReadyForCheckout) ? (console.log("[form] Tokenized card is ready for checkout"), Ne(F, G, z, $, N), H(!0), Oe(void 0)) : (console.log(`[form] Element ${z} finished tokenization but card not yet ready for checkout`), de(k));
|
|
1754
1755
|
} else if (v === w.enum.CHECKOUT_SUCCESS)
|
|
1755
|
-
console.log("[form] Checkout complete:", y), Y(!1), de(0),
|
|
1756
|
+
console.log("[form] Checkout complete:", y), Y(!1), de(0), H(!1), f && f(y.invoiceUrls, y.subscriptionIds, y.customerId);
|
|
1756
1757
|
else if (v === w.enum.SETUP_PAYMENT_METHOD_SUCCESS)
|
|
1757
|
-
console.log("[form] Setup payment method complete:", y), Y(!1), de(0),
|
|
1758
|
+
console.log("[form] Setup payment method complete:", y), Y(!1), de(0), H(!1), h && h(y.paymentMethodId);
|
|
1758
1759
|
else if (v === w.enum.LOAD_ERROR)
|
|
1759
1760
|
console.error("[form] Error loading iframe:", y.message), l && l(y.message);
|
|
1760
1761
|
else if (v === w.enum.VALIDATION_ERROR) {
|
|
1761
1762
|
const k = $ == null ? void 0 : $.checkoutPaymentMethod.provider;
|
|
1762
|
-
(k === "credit_card" || k === void 0) && (console.error(`[form] Validation error for ${y.elementType}:`, y.errors), u && u(y.elementType, y.errors,
|
|
1763
|
+
(k === "credit_card" || k === void 0) && (console.error(`[form] Validation error for ${y.elementType}:`, y.errors), u && u(y.elementType, y.errors, z));
|
|
1763
1764
|
} else if (v === w.enum.TOKENIZE_ERROR || v === w.enum.CHECKOUT_ERROR)
|
|
1764
1765
|
if (console.error("[form] API error from element:", y.message), y.message === "3DS_REQUIRED") {
|
|
1765
|
-
const k =
|
|
1766
|
-
if (!
|
|
1767
|
-
for (const [b,
|
|
1768
|
-
if (!
|
|
1769
|
-
const L =
|
|
1766
|
+
const k = q == null ? void 0 : q.find((b) => b.provider === "credit_card");
|
|
1767
|
+
if (!U || !D.current || !u || !k) return;
|
|
1768
|
+
for (const [b, j] of Object.entries(ne)) {
|
|
1769
|
+
if (!j) continue;
|
|
1770
|
+
const L = sr(
|
|
1770
1771
|
w.enum.START_PAYMENT_FLOW,
|
|
1771
|
-
|
|
1772
|
+
U,
|
|
1772
1773
|
D.current,
|
|
1773
1774
|
u,
|
|
1774
1775
|
// Only stripe supports frontend 3DS right now,
|
|
@@ -1777,22 +1778,22 @@ const Oo = (e, t, r, o) => {
|
|
|
1777
1778
|
!1
|
|
1778
1779
|
);
|
|
1779
1780
|
if (L) {
|
|
1780
|
-
|
|
1781
|
+
H(!0), Oe(L), Ne(j, G, b, L, N);
|
|
1781
1782
|
break;
|
|
1782
1783
|
}
|
|
1783
1784
|
}
|
|
1784
1785
|
} else
|
|
1785
|
-
Y(!1),
|
|
1786
|
+
Y(!1), H(!1), m && m(y.message);
|
|
1786
1787
|
},
|
|
1787
1788
|
[
|
|
1788
1789
|
G,
|
|
1789
|
-
|
|
1790
|
+
U,
|
|
1790
1791
|
Ke,
|
|
1791
1792
|
$,
|
|
1792
1793
|
Z,
|
|
1793
1794
|
ne,
|
|
1794
|
-
Ye,
|
|
1795
1795
|
Ze,
|
|
1796
|
+
We,
|
|
1796
1797
|
i,
|
|
1797
1798
|
a,
|
|
1798
1799
|
s,
|
|
@@ -1802,12 +1803,12 @@ const Oo = (e, t, r, o) => {
|
|
|
1802
1803
|
h,
|
|
1803
1804
|
m,
|
|
1804
1805
|
u,
|
|
1805
|
-
|
|
1806
|
+
N,
|
|
1806
1807
|
Re,
|
|
1807
|
-
|
|
1808
|
+
q,
|
|
1808
1809
|
Q
|
|
1809
1810
|
]
|
|
1810
|
-
),
|
|
1811
|
+
), Te = ee(() => {
|
|
1811
1812
|
const p = () => {
|
|
1812
1813
|
};
|
|
1813
1814
|
return {
|
|
@@ -1817,99 +1818,102 @@ const Oo = (e, t, r, o) => {
|
|
|
1817
1818
|
onSetupPaymentMethodSuccess: re("onSetupPaymentMethodSuccess", h ?? p),
|
|
1818
1819
|
onValidationError: re("onValidationError", u ?? p)
|
|
1819
1820
|
};
|
|
1820
|
-
}, [m, d, f, h, u]),
|
|
1821
|
-
if (!D.current || !
|
|
1821
|
+
}, [m, d, f, h, u]), Me = () => {
|
|
1822
|
+
if (console.log(D.current, U, q), !D.current || !U || !q) return null;
|
|
1822
1823
|
const p = /* @__PURE__ */ new Map();
|
|
1823
|
-
return Object.entries(
|
|
1824
|
-
g && p.set(
|
|
1825
|
-
}), p.size === 0 ? null : {
|
|
1824
|
+
return Object.entries(Qe).forEach(([I, g]) => {
|
|
1825
|
+
g && p.set(I, g);
|
|
1826
|
+
}), p.size === 0 ? (console.log("[OJS] no CDE connections!"), null) : {
|
|
1826
1827
|
formDiv: D.current,
|
|
1827
|
-
elementsSessionId:
|
|
1828
|
-
checkoutPaymentMethods:
|
|
1828
|
+
elementsSessionId: U,
|
|
1829
|
+
checkoutPaymentMethods: q,
|
|
1829
1830
|
cdeConnections: p,
|
|
1830
1831
|
customInitParams: ve ?? {},
|
|
1831
|
-
baseUrl: new URL(
|
|
1832
|
+
baseUrl: new URL(N).origin
|
|
1832
1833
|
};
|
|
1833
|
-
},
|
|
1834
|
-
const g =
|
|
1834
|
+
}, et = (p, F, I) => {
|
|
1835
|
+
const g = Me();
|
|
1835
1836
|
if (!(!g || !D.current))
|
|
1836
1837
|
return ae.stripePR.run({
|
|
1837
1838
|
context: g,
|
|
1838
|
-
checkoutPaymentMethod:
|
|
1839
|
+
checkoutPaymentMethod: at(g.checkoutPaymentMethods, p),
|
|
1839
1840
|
nonCdeFormInputs: he(D.current),
|
|
1840
|
-
flowCallbacks:
|
|
1841
|
-
customParams: { provider: p, overridePaymentRequest:
|
|
1842
|
-
initResult:
|
|
1841
|
+
flowCallbacks: Te,
|
|
1842
|
+
customParams: { provider: p, overridePaymentRequest: I == null ? void 0 : I.overridePaymentRequest },
|
|
1843
|
+
initResult: F
|
|
1843
1844
|
});
|
|
1844
1845
|
};
|
|
1845
|
-
|
|
1846
|
-
if (
|
|
1847
|
-
|
|
1846
|
+
J(() => {
|
|
1847
|
+
if (rn !== null || (console.log("[OJS] numCdeConns", Ie, Qe), Ie === 0)) return;
|
|
1848
|
+
console.log("[OJS] Initializing");
|
|
1849
|
+
const p = Me();
|
|
1848
1850
|
if (!p) return;
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1851
|
+
console.log("[OJS] Starting init");
|
|
1852
|
+
const F = So(p, Te);
|
|
1853
|
+
on(F), console.log("[OJS] Subscribe"), F.stripePR.subscribe((I) => {
|
|
1854
|
+
if (console.log("[OJS] setPaymentRequests", I), I.status === "loading")
|
|
1852
1855
|
X.set("apple_pay", pe), X.set("google_pay", pe);
|
|
1853
|
-
else if (
|
|
1854
|
-
X.set("apple_pay",
|
|
1855
|
-
else if (
|
|
1856
|
-
const g =
|
|
1856
|
+
else if (I.status === "error")
|
|
1857
|
+
X.set("apple_pay", lt), X.set("google_pay", lt);
|
|
1858
|
+
else if (I.status === "loaded") {
|
|
1859
|
+
const g = I.result, z = g.isAvailable && g.availableProviders.applePay, Fe = g.isAvailable && g.availableProviders.googlePay;
|
|
1857
1860
|
X.set("apple_pay", {
|
|
1858
1861
|
isLoading: !1,
|
|
1859
|
-
isAvailable:
|
|
1860
|
-
startFlow: async (y) =>
|
|
1862
|
+
isAvailable: z,
|
|
1863
|
+
startFlow: async (y) => z ? et("apple_pay", g, y) : void 0
|
|
1861
1864
|
}), X.set("google_pay", {
|
|
1862
1865
|
isLoading: !1,
|
|
1863
|
-
isAvailable:
|
|
1864
|
-
startFlow: async (y) =>
|
|
1866
|
+
isAvailable: Fe,
|
|
1867
|
+
startFlow: async (y) => Fe ? et("google_pay", g, y) : void 0
|
|
1865
1868
|
});
|
|
1866
1869
|
}
|
|
1867
1870
|
});
|
|
1868
|
-
}, [D.current,
|
|
1869
|
-
const
|
|
1870
|
-
const p =
|
|
1871
|
-
!D.current || !
|
|
1871
|
+
}, [D.current, U, q, Ie === 0]);
|
|
1872
|
+
const an = () => {
|
|
1873
|
+
const p = Me();
|
|
1874
|
+
!D.current || !U || !Q || !q || !p || ae.commonCC.run({
|
|
1872
1875
|
context: p,
|
|
1873
|
-
checkoutPaymentMethod:
|
|
1876
|
+
checkoutPaymentMethod: at(q, "credit_card"),
|
|
1874
1877
|
nonCdeFormInputs: he(D.current),
|
|
1875
|
-
flowCallbacks:
|
|
1878
|
+
flowCallbacks: Te,
|
|
1876
1879
|
customParams: void 0,
|
|
1877
1880
|
// This flow requires no custom params
|
|
1878
1881
|
initResult: void 0
|
|
1879
1882
|
// This flow requires no initialization
|
|
1880
1883
|
});
|
|
1881
|
-
},
|
|
1884
|
+
}, De = W(
|
|
1882
1885
|
(p) => {
|
|
1883
|
-
|
|
1886
|
+
Ye && p.preventDefault();
|
|
1884
1887
|
},
|
|
1885
|
-
[
|
|
1888
|
+
[Ye]
|
|
1886
1889
|
);
|
|
1887
|
-
|
|
1890
|
+
J(() => {
|
|
1888
1891
|
if (ke || !D.current) return;
|
|
1889
|
-
Z.length > 0 && Z.length === Object.keys(ne).length && (console.log("[form] All elements loaded"),
|
|
1890
|
-
}, [Z, ne, ke, c,
|
|
1891
|
-
window.removeEventListener("beforeunload",
|
|
1892
|
-
}), [
|
|
1893
|
-
const
|
|
1892
|
+
Z.length > 0 && Z.length === Object.keys(ne).length && (console.log("[form] All elements loaded"), Wt(!0), c && c(Ge, Be));
|
|
1893
|
+
}, [Z, ne, ke, c, Ge, Be]), J(() => (Vt(window.location.origin), window.addEventListener("message", Ae), window.addEventListener("beforeunload", De), () => {
|
|
1894
|
+
window.removeEventListener("beforeunload", De), window.removeEventListener("message", Ae);
|
|
1895
|
+
}), [U, Ae, De]);
|
|
1896
|
+
const cn = W(
|
|
1894
1897
|
async (p) => {
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1898
|
+
const F = Z.find((g) => g.contentWindow === p.contentWindow);
|
|
1899
|
+
if (console.log("[OJS] Calling register iframe. Existing?", F), F) return;
|
|
1900
|
+
Bt((g) => [...g, p]), console.log("[OJS][form] Registering iframe:", p);
|
|
1901
|
+
const I = Ao(p.id);
|
|
1902
|
+
await nn(I, p);
|
|
1899
1903
|
},
|
|
1900
1904
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
1901
1905
|
[Z]
|
|
1902
|
-
),
|
|
1906
|
+
), ln = {
|
|
1903
1907
|
formId: G,
|
|
1904
|
-
formHeight:
|
|
1908
|
+
formHeight: Yt,
|
|
1905
1909
|
referer: Ht,
|
|
1906
1910
|
checkoutSecureToken: r,
|
|
1907
|
-
registerIframe:
|
|
1908
|
-
baseUrl:
|
|
1909
|
-
},
|
|
1910
|
-
submit:
|
|
1911
|
-
applePay:
|
|
1912
|
-
googlePay:
|
|
1911
|
+
registerIframe: cn,
|
|
1912
|
+
baseUrl: N
|
|
1913
|
+
}, un = {
|
|
1914
|
+
submit: an,
|
|
1915
|
+
applePay: Xe.apple_pay,
|
|
1916
|
+
googlePay: Xe.google_pay,
|
|
1913
1917
|
// stripeLink: {
|
|
1914
1918
|
// TODO: uncomment if we need stripe elements later.
|
|
1915
1919
|
// Better if we can make stripe link work in prod without elements.
|
|
@@ -1918,40 +1922,40 @@ const Oo = (e, t, r, o) => {
|
|
|
1918
1922
|
// pr: paymentRequests.stripe_link,
|
|
1919
1923
|
// },
|
|
1920
1924
|
loaded: ke,
|
|
1921
|
-
preview:
|
|
1925
|
+
preview: sn
|
|
1922
1926
|
};
|
|
1923
|
-
return /* @__PURE__ */
|
|
1927
|
+
return /* @__PURE__ */ V(pt.Provider, { value: ln, children: /* @__PURE__ */ V("div", { className: o, ref: D, children: t(un) }) });
|
|
1924
1928
|
}, Pe = (e) => {
|
|
1925
|
-
const { subPath: t, styles: r } = e, { formId: o, referer: s, formHeight: i, checkoutSecureToken: a, registerIframe: c, baseUrl: l } =
|
|
1929
|
+
const { subPath: t, styles: r } = e, { formId: o, referer: s, formHeight: i, checkoutSecureToken: a, registerIframe: c, baseUrl: l } = fn(), [u, d] = E(!1), f = se(null), m = ee(() => r ? or(r) : "", [r]), h = ee(() => ({
|
|
1926
1930
|
border: "none",
|
|
1927
1931
|
width: "100%",
|
|
1928
1932
|
height: i
|
|
1929
|
-
}), [i]),
|
|
1933
|
+
}), [i]), C = ee(() => {
|
|
1930
1934
|
if (!a || !s) return "";
|
|
1931
1935
|
const M = new URLSearchParams();
|
|
1932
1936
|
return M.append("referer", s), M.append("styles", m), M.append("formId", o), M.append("secureToken", a), M.toString();
|
|
1933
1937
|
}, [m, o, s, a]);
|
|
1934
|
-
return
|
|
1935
|
-
!f.current || !u
|
|
1936
|
-
}, [u]), a ? /* @__PURE__ */
|
|
1938
|
+
return J(() => d(!0), []), J(() => {
|
|
1939
|
+
console.log("[OJS] element frame register attempt", !!f.current, !!u), !(!f.current || !u) && c(f.current);
|
|
1940
|
+
}, [u]), a ? /* @__PURE__ */ V(
|
|
1937
1941
|
"iframe",
|
|
1938
1942
|
{
|
|
1939
1943
|
id: `ojs-${t}-element`,
|
|
1940
1944
|
name: `${t}-element`,
|
|
1941
1945
|
className: "ojs-iframe",
|
|
1942
|
-
src: `${l}/app/v1/${t}-element/?${
|
|
1946
|
+
src: `${l}/app/v1/${t}-element/?${C}`,
|
|
1943
1947
|
style: h,
|
|
1944
1948
|
ref: f
|
|
1945
1949
|
}
|
|
1946
|
-
) : (console.error("[form] Cannot render partially initialized frame"), /* @__PURE__ */
|
|
1947
|
-
},
|
|
1950
|
+
) : (console.error("[form] Cannot render partially initialized frame"), /* @__PURE__ */ V("div", {}));
|
|
1951
|
+
}, $o = ({ styles: e }) => /* @__PURE__ */ V(Pe, { styles: e, subPath: "card-cvc" }), Uo = ({ styles: e }) => /* @__PURE__ */ V(Pe, { styles: e, subPath: "card" }), qo = ({ styles: e }) => /* @__PURE__ */ V(Pe, { styles: e, subPath: "card-expiry" }), zo = ({ styles: e }) => /* @__PURE__ */ V(Pe, { styles: e, subPath: "card-number" });
|
|
1948
1952
|
export {
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1953
|
+
$o as CardCvcElement,
|
|
1954
|
+
Uo as CardElement,
|
|
1955
|
+
qo as CardExpiryElement,
|
|
1956
|
+
zo as CardNumberElement,
|
|
1957
|
+
xo as ElementsForm,
|
|
1954
1958
|
_ as FieldName,
|
|
1955
|
-
|
|
1959
|
+
fn as useOpenPayElements
|
|
1956
1960
|
};
|
|
1957
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXguanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCByZXF1aXJlJCQwLCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQsIHVzZVJlZiwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBqc3ggfSBmcm9tICdyZWFjdC9qc3gtcnVudGltZSc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBjb25uZWN0VG9DaGlsZCB9IGZyb20gJ3BlbnBhbCc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5jb25zdCBFbGVtZW50c0NvbnRleHQgPSBjcmVhdGVDb250ZXh0KHtcbiAgZm9ybUlkOiBcIlwiLFxuICBmb3JtSGVpZ2h0OiBcIlwiLFxuICByZWZlcmVyOiB2b2lkIDAsXG4gIGNoZWNrb3V0U2VjdXJlVG9rZW46IHZvaWQgMCxcbiAgcmVnaXN0ZXJJZnJhbWU6ICgpID0+IHtcbiAgfSxcbiAgYmFzZVVybDogXCJcIlxufSk7XG5cbmNvbnN0IHVzZU9wZW5QYXlFbGVtZW50cyA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRWxlbWVudHNDb250ZXh0KTtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlT3BlblBheUVsZW1lbnRzIG11c3QgYmUgdXNlZCB3aXRoaW4gYW4gT3BlblBheUVsZW1lbnRzUHJvdmlkZXJcIik7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuXG5jb25zdCBGUkFNRV9CQVNFX1VSTCA9IFwiaHR0cHM6Ly9jZGUuZ2V0b3BlbnBheS5jb21cIjtcblxuY29uc3QgUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5zdHJpbmcoKSxcbiAgbG9jOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBtc2c6IHouc3RyaW5nKCksXG4gIHVybDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlID0gei5hcnJheShQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciQxKTtcbmNvbnN0IFpvZEZpZWxkRXJyb3IgPSB6Lm9iamVjdCh7XG4gIGNvZGU6IHouc3RyaW5nKCksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCksXG4gIHBhdGg6IHouYXJyYXkoei5zdHJpbmcoKSlcbn0pO1xuY29uc3QgWm9kRmllbGRFcnJvcnMgPSB6LmFycmF5KFpvZEZpZWxkRXJyb3IpO1xuY29uc3QgTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRSA9IHtcbiAgXCJmYWlsZWQgdG8gZmV0Y2hcIjogYENvbm5lY3Rpb24gZXJyb3I6IHBsZWFzZSBkb3VibGUgY2hlY2sgaWYgeW91IGFyZSBjb25uZWN0ZWQgdG8gdGhlIGludGVybmV0LCB0aGVuIHRyeSBhZ2FpbmBcbn07XG5jb25zdCBnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZSA9IChvZ0Vycm9yTWVzc2FnZSkgPT4ge1xuICBjb25zdCBrZXkgPSBvZ0Vycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgcmV0dXJuIE1BUF9UT19IVU1BTl9GUklFTkRMWV9MT1dFUkNBU0Vba2V5XSA/PyBvZ0Vycm9yTWVzc2FnZTtcbn07XG5jb25zdCBpc1N0cmluZ2lmaWVkSnNvbk9iamVjdCA9IChzdHIpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0cik7XG4gICAgcmV0dXJuIHR5cGVvZiBwYXJzZWQgPT09IFwib2JqZWN0XCI7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5jb25zdCBjcmVhdGVNZXNzYWdlRnJvbVB5ZGFudGljVmFsaWRhdGlvbkVycm9yID0gKHJlc3BvbnNlKSA9PiB7XG4gIGlmIChyZXNwb25zZS5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZ2V0SHVtYW5GcmllbmRseU1lc3NhZ2UocmVzcG9uc2VbMF0ubXNnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBidWxsZXRlZCA9IHJlc3BvbnNlLm1hcCgoZXJyKSA9PiBg4oCiICR7Z2V0SHVtYW5GcmllbmRseU1lc3NhZ2UoZXJyLm1zZyl9YCkuam9pbihcIlxcblwiKTtcbiAgICByZXR1cm4gYCR7YFBsZWFzZSBmaXggdGhlIGZvbGxvd2luZyBlcnJvcnM6YH1cbiR7YnVsbGV0ZWR9YDtcbiAgfVxufTtcbmNvbnN0IGNyZWF0ZU1lc3NhZ2VGcm9tWm9kRmllbGRFcnJvcnMgPSAoZXJyb3JzKSA9PiB7XG4gIGNvbnN0IGxpc3RPZkVycm9ycyA9IGVycm9ycy5tYXAoKGVycikgPT4gYC0gJHtlcnIucGF0aC5qb2luKFwiL1wiKX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbihcIlxcblwiKTtcbiAgcmV0dXJuIGBFbmNvdW50ZXJlZCB0aGUgZm9sbG93aW5nIGVycm9yczpcbiR7bGlzdE9mRXJyb3JzfWA7XG59O1xuY29uc3QgZ2V0RXJyb3JNZXNzYWdlID0gKGUpID0+IHtcbiAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGlmIChpc1N0cmluZ2lmaWVkSnNvbk9iamVjdChlLm1lc3NhZ2UpKSB7XG4gICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGUubWVzc2FnZSk7XG4gICAgICBpZiAoUHlkYW50aWNWYWxpZGF0aW9uRXJyb3JSZXNwb25zZS5zYWZlUGFyc2Uob2JqKS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVNZXNzYWdlRnJvbVB5ZGFudGljVmFsaWRhdGlvbkVycm9yKG9iaik7XG4gICAgICB9IGVsc2UgaWYgKFpvZEZpZWxkRXJyb3JzLnNhZmVQYXJzZShvYmopLnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2VGcm9tWm9kRmllbGRFcnJvcnMob2JqKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRW5jb3VudGVyZWQgdW5rbm93biBzdHJpbmdpZmllZCBKU09OIG9iamVjdDpcbiR7ZS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4gZS5tZXNzYWdlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0SHVtYW5GcmllbmRseU1lc3NhZ2UoZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlKTtcbiAgICB9IGNhdGNoIChlMikge1xuICAgICAgcmV0dXJuIGUyICsgXCJcIjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGUgKyBcIlwiO1xuICB9XG59O1xuY29uc3QgbWFrZUNhbGxiYWNrU2FmZSA9IChjYWxsYmFja05hbWUsIGZuKSA9PiB7XG4gIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtmb3JtXSBFcnJvciBydW5uaW5nIGNhbGxiYWNrICgke2NhbGxiYWNrTmFtZX0pOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgUmVxdWlyZWRTdHJpbmcgPSB6LnN0cmluZygpLnRyaW0oKS5taW4oMSwgeyBtZXNzYWdlOiBgQ2Fubm90IGJlIGJsYW5rYCB9KTtcbmNvbnN0IE9wdGlvbmFsU3RyaW5nID0gei5zdHJpbmcoKS50cmltKCkub3B0aW9uYWwoKTtcbmNvbnN0IG51bGxPclVuZGVmT3IkMSA9ICh6VHlwZSkgPT4gei5udWxsYWJsZSh6VHlwZS5vcHRpb25hbCgpKTtcbnZhciBGaWVsZE5hbWUgPSAvKiBAX19QVVJFX18gKi8gKChGaWVsZE5hbWUyKSA9PiB7XG4gIEZpZWxkTmFtZTJbXCJGSVJTVF9OQU1FXCJdID0gXCJmaXJzdE5hbWVcIjtcbiAgRmllbGROYW1lMltcIkxBU1RfTkFNRVwiXSA9IFwibGFzdE5hbWVcIjtcbiAgRmllbGROYW1lMltcIkVNQUlMXCJdID0gXCJlbWFpbFwiO1xuICBGaWVsZE5hbWUyW1wiWklQX0NPREVcIl0gPSBcInppcENvZGVcIjtcbiAgRmllbGROYW1lMltcIkNJVFlcIl0gPSBcImNpdHlcIjtcbiAgRmllbGROYW1lMltcIlNUQVRFXCJdID0gXCJzdGF0ZVwiO1xuICBGaWVsZE5hbWUyW1wiQ09VTlRSWVwiXSA9IFwiY291bnRyeVwiO1xuICBGaWVsZE5hbWUyW1wiQUREUkVTU1wiXSA9IFwiYWRkcmVzc1wiO1xuICBGaWVsZE5hbWUyW1wiUEhPTkVcIl0gPSBcInBob25lXCI7XG4gIEZpZWxkTmFtZTJbXCJQUk9NT1RJT05fQ09ERVwiXSA9IFwicHJvbW90aW9uQ29kZVwiO1xuICByZXR1cm4gRmllbGROYW1lMjtcbn0pKEZpZWxkTmFtZSB8fCB7fSk7XG5jb25zdCBGaWVsZE5hbWVFbnVtID0gei5uYXRpdmVFbnVtKEZpZWxkTmFtZSk7XG52YXIgUHJpdmF0ZUZpZWxkTmFtZSA9IC8qIEBfX1BVUkVfXyAqLyAoKFByaXZhdGVGaWVsZE5hbWUyKSA9PiB7XG4gIFByaXZhdGVGaWVsZE5hbWUyW1wiQ0FSRF9OVU1CRVJcIl0gPSBcImNhcmROdW1iZXJcIjtcbiAgUHJpdmF0ZUZpZWxkTmFtZTJbXCJDQVJEX0VYUElSWVwiXSA9IFwiY2FyZEV4cGlyeVwiO1xuICBQcml2YXRlRmllbGROYW1lMltcIkNBUkRfQ1ZDXCJdID0gXCJjYXJkQ3ZjXCI7XG4gIHJldHVybiBQcml2YXRlRmllbGROYW1lMjtcbn0pKFByaXZhdGVGaWVsZE5hbWUgfHwge30pO1xuY29uc3QgUHJpdmF0ZUZpZWxkTmFtZUVudW0gPSB6Lm5hdGl2ZUVudW0oUHJpdmF0ZUZpZWxkTmFtZSk7XG5jb25zdCBBbGxGaWVsZE5hbWVzID0gei51bmlvbihbRmllbGROYW1lRW51bSwgUHJpdmF0ZUZpZWxkTmFtZUVudW1dKTtcbnZhciBFbGVtZW50VHlwZUVudW0gPSAvKiBAX19QVVJFX18gKi8gKChFbGVtZW50VHlwZUVudW0yKSA9PiB7XG4gIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEXCJdID0gXCJjYXJkXCI7XG4gIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEX05VTUJFUlwiXSA9IFwiY2FyZC1udW1iZXJcIjtcbiAgRWxlbWVudFR5cGVFbnVtMltcIkNBUkRfRVhQSVJZXCJdID0gXCJjYXJkLWV4cGlyeVwiO1xuICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRF9DVkNcIl0gPSBcImNhcmQtY3ZjXCI7XG4gIHJldHVybiBFbGVtZW50VHlwZUVudW0yO1xufSkoRWxlbWVudFR5cGVFbnVtIHx8IHt9KTtcbmNvbnN0IEVsZW1lbnRUeXBlID0gei5uYXRpdmVFbnVtKEVsZW1lbnRUeXBlRW51bSk7XG5jb25zdCBDaGVja291dFBheW1lbnRNZXRob2QkMSA9IHoub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHouc3RyaW5nKCksXG4gIHByb2Nlc3Nvcl9uYW1lOiBudWxsT3JVbmRlZk9yJDEoei5zdHJpbmcoKSksXG4gIG1ldGFkYXRhOiBudWxsT3JVbmRlZk9yJDEoei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkpXG59KTtcbmNvbnN0IFBheW1lbnRNZXRob2RNaW5pbWFsID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKVxufSk7XG56Lm9iamVjdCh7XG4gIGNhcmROdW1iZXI6IE9wdGlvbmFsU3RyaW5nLFxuICBleHBpcnk6IE9wdGlvbmFsU3RyaW5nLFxuICBjdmM6IE9wdGlvbmFsU3RyaW5nXG59KTtcbnoub2JqZWN0KHtcbiAgYmFja2dyb3VuZENvbG9yOiBPcHRpb25hbFN0cmluZyxcbiAgY29sb3I6IE9wdGlvbmFsU3RyaW5nLFxuICBmb250RmFtaWx5OiBPcHRpb25hbFN0cmluZyxcbiAgZm9udFNpemU6IE9wdGlvbmFsU3RyaW5nLFxuICBmb250V2VpZ2h0OiBPcHRpb25hbFN0cmluZyxcbiAgbWFyZ2luOiBPcHRpb25hbFN0cmluZyxcbiAgcGFkZGluZzogT3B0aW9uYWxTdHJpbmcsXG4gIGxldHRlclNwYWNpbmc6IE9wdGlvbmFsU3RyaW5nLFxuICBsaW5lSGVpZ2h0OiBPcHRpb25hbFN0cmluZ1xufSk7XG5jb25zdCBFdmVudFR5cGUgPSB6LmVudW0oW1xuICAvLyBFbGVtZW50IC0+IEZvcm1cbiAgXCJMQVlPVVRcIixcbiAgXCJMT0FERURcIixcbiAgXCJCTFVSXCIsXG4gIFwiRk9DVVNcIixcbiAgXCJDSEFOR0VcIixcbiAgXCJUT0tFTklaRV9TVEFSVEVEXCIsXG4gIFwiQ0hFQ0tPVVRfU1RBUlRFRFwiLFxuICBcIlBBWU1FTlRfRkxPV19TVEFSVEVEXCIsXG4gIFwiVE9LRU5JWkVfU1VDQ0VTU1wiLFxuICBcIkNIRUNLT1VUX1NVQ0NFU1NcIixcbiAgXCJMT0FEX0VSUk9SXCIsXG4gIFwiVkFMSURBVElPTl9FUlJPUlwiLFxuICBcIlRPS0VOSVpFX0VSUk9SXCIsXG4gIFwiQ0hFQ0tPVVRfRVJST1JcIixcbiAgXCJTRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTXCIsXG4gIC8vIEZvcm0gLT4gRWxlbWVudFxuICBcIlRPS0VOSVpFXCIsXG4gIFwiQ0hFQ0tPVVRcIixcbiAgXCJTVEFSVF9QQVlNRU5UX0ZMT1dcIlxuXSk7XG5jb25zdCBHZW5lcmljRXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiVE9LRU5JWkVfU1RBUlRFRFwiLCBcIkNIRUNLT1VUX1NUQVJURURcIl0pO1xuY29uc3QgR2VuZXJpY0V2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHsgdHlwZTogR2VuZXJpY0V2ZW50VHlwZSB9KTtcbmNvbnN0IElucHV0RXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiQkxVUlwiLCBcIkZPQ1VTXCIsIFwiQ0hBTkdFXCJdKTtcbmNvbnN0IElucHV0RXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBJbnB1dEV2ZW50VHlwZSxcbiAgZWxlbWVudFR5cGU6IFByaXZhdGVGaWVsZE5hbWVFbnVtLFxuICBlcnJvcnM6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKVxufSk7XG5jb25zdCBFcnJvckV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIkxPQURfRVJST1JcIiwgXCJUT0tFTklaRV9FUlJPUlwiLCBcIkNIRUNLT1VUX0VSUk9SXCJdKTtcbmNvbnN0IEVycm9yRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBFcnJvckV2ZW50VHlwZSxcbiAgbWVzc2FnZTogUmVxdWlyZWRTdHJpbmcsXG4gIGhlYWRlcnM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKClcbn0pO1xuY29uc3QgVmFsaWRhdGlvbkVycm9yRXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiVkFMSURBVElPTl9FUlJPUlwiXSk7XG5jb25zdCBWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IFZhbGlkYXRpb25FcnJvckV2ZW50VHlwZSxcbiAgZWxlbWVudFR5cGU6IEFsbEZpZWxkTmFtZXMsXG4gIGVycm9yczogei5hcnJheSh6LnN0cmluZygpKVxufSk7XG5jb25zdCBMYXlvdXRFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5MQVlPVVQpLFxuICBoZWlnaHQ6IFJlcXVpcmVkU3RyaW5nXG59KTtcbmNvbnN0IExvYWRlZEV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5saXRlcmFsKEV2ZW50VHlwZS5lbnVtLkxPQURFRCksXG4gIHNlc3Npb25JZDogUmVxdWlyZWRTdHJpbmcsXG4gIHRvdGFsQW1vdW50QXRvbXM6IHoubnVtYmVyKCksXG4gIGN1cnJlbmN5OiBPcHRpb25hbFN0cmluZyxcbiAgY2hlY2tvdXRQYXltZW50TWV0aG9kczogei5hcnJheShDaGVja291dFBheW1lbnRNZXRob2QkMSlcbn0pO1xuY29uc3QgUGF5bWVudEZsb3dTdGFydGVkRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uUEFZTUVOVF9GTE9XX1NUQVJURUQpLFxuICBuZXh0QWN0aW9uTWV0YWRhdGE6IHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpLFxuICBwYXltZW50Rmxvd01ldGFkYXRhOiB6LmFueSgpLm9wdGlvbmFsKCksXG4gIHN0YXJ0UEZNZXRhZGF0YTogei5vcHRpb25hbCh6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSlcbn0pO1xuY29uc3QgU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5TRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTKSxcbiAgcGF5bWVudE1ldGhvZElkOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IFJlcXVpcmVkRm9ybUZpZWxkcyA9IHoub2JqZWN0KHtcbiAgW1wiZmlyc3ROYW1lXCIgLyogRklSU1RfTkFNRSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJsYXN0TmFtZVwiIC8qIExBU1RfTkFNRSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJlbWFpbFwiIC8qIEVNQUlMICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcInppcENvZGVcIiAvKiBaSVBfQ09ERSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJjb3VudHJ5XCIgLyogQ09VTlRSWSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJwcm9tb3Rpb25Db2RlXCIgLyogUFJPTU9USU9OX0NPREUgKi9dOiBPcHRpb25hbFN0cmluZ1xufSk7XG5jb25zdCBQUkZvcm1GaWVsZHMgPSB6Lm9iamVjdCh7XG4gIFtcImVtYWlsXCIgLyogRU1BSUwgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wiemlwQ29kZVwiIC8qIFpJUF9DT0RFICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcImNvdW50cnlcIiAvKiBDT1VOVFJZICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcInByb21vdGlvbkNvZGVcIiAvKiBQUk9NT1RJT05fQ09ERSAqL106IE9wdGlvbmFsU3RyaW5nXG59KTtcbmNvbnN0IFN1Ym1pdEV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIlRPS0VOSVpFXCIsIFwiQ0hFQ0tPVVRcIiwgXCJTVEFSVF9QQVlNRU5UX0ZMT1dcIl0pO1xuY29uc3QgU3VibWl0RXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBTdWJtaXRFdmVudFR5cGUsXG4gIHNlc3Npb25JZDogUmVxdWlyZWRTdHJpbmcsXG4gIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gIHBheW1lbnRGbG93TWV0YWRhdGE6IHouYW55KCkub3B0aW9uYWwoKSxcbiAgZG9Ob3RVc2VMZWdhY3lDQ0Zsb3c6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGV4aXN0aW5nQ0NQTUlkOiBPcHRpb25hbFN0cmluZ1xufSkuZXh0ZW5kKFJlcXVpcmVkRm9ybUZpZWxkcy5zaGFwZSk7XG5jb25zdCBUb2tlbml6ZVN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5UT0tFTklaRV9TVUNDRVNTKSxcbiAgaXNSZWFkeUZvckNoZWNrb3V0OiB6LmJvb2xlYW4oKVxufSk7XG5jb25zdCBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5DSEVDS09VVF9TVUNDRVNTKSxcbiAgaW52b2ljZVVybHM6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gIHN1YnNjcmlwdGlvbklkczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgY3VzdG9tZXJJZDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBFdmVudFBheWxvYWQgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICBHZW5lcmljRXZlbnRQYXlsb2FkLFxuICBJbnB1dEV2ZW50UGF5bG9hZCxcbiAgRXJyb3JFdmVudFBheWxvYWQsXG4gIFZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCxcbiAgTGF5b3V0RXZlbnRQYXlsb2FkLFxuICBMb2FkZWRFdmVudFBheWxvYWQsXG4gIFN1Ym1pdEV2ZW50UGF5bG9hZCxcbiAgVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkLFxuICBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQsXG4gIFBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCxcbiAgU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWRcbl0pO1xuY29uc3QgRWxlbWVudEV2ZW50ID0gei5vYmplY3Qoe1xuICBwYXlsb2FkOiBFdmVudFBheWxvYWQsXG4gIG5vbmNlOiBSZXF1aXJlZFN0cmluZyxcbiAgZm9ybUlkOiBSZXF1aXJlZFN0cmluZyxcbiAgZWxlbWVudElkOiBSZXF1aXJlZFN0cmluZ1xufSk7XG56Lm9iamVjdCh7XG4gIGFtb3VudEF0b206IHoubnVtYmVyKCksXG4gIGN1cnJlbmN5OiBSZXF1aXJlZFN0cmluZ1xufSk7XG56Lm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogei5zdHJpbmcoKSxcbiAgcHJvbW90aW9uX2NvZGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKVxufSk7XG56Lm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogei5zdHJpbmcoKSxcbiAgZXhpc3RpbmdfY2NfcG1faWQ6IG51bGxPclVuZGVmT3IkMSh6LnN0cmluZygpKVxufSk7XG5jb25zdCBDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcGF5bWVudF9tZXRob2RzOiB6LmFycmF5KFBheW1lbnRNZXRob2RNaW5pbWFsKVxufSk7XG5jb25zdCBGaWVsZFZhbGlkYXRpb25FcnJvciA9IHoub2JqZWN0KHtcbiAgZWxlbWVudFR5cGU6IHouc3RyaW5nKCksXG4gIGVycm9yczogei5hcnJheSh6LnN0cmluZygpKVxufSk7XG56Lm9iamVjdCh7XG4gIHNlc3Npb25faWQ6IHouc3RyaW5nKClcbn0pO1xuY29uc3QgVG9rZW5pemVDYXJkRXJyb3JSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgc3VjY2Vzczogei5saXRlcmFsKGZhbHNlKSxcbiAgZXJyb3JfdHlwZTogei5saXRlcmFsKFwidmFsaWRhdGlvbl9lcnJvclwiKSxcbiAgZXJyb3JzOiB6LmFycmF5KEZpZWxkVmFsaWRhdGlvbkVycm9yKVxufSk7XG5jb25zdCBUb2tlbml6ZUNhcmRSZXNwb25zZSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwic3VjY2Vzc1wiLCBbXG4gIHoub2JqZWN0KHsgc3VjY2Vzczogei5saXRlcmFsKHRydWUpIH0pLFxuICBUb2tlbml6ZUNhcmRFcnJvclJlc3BvbnNlXG5dKTtcbnoub2JqZWN0KHtcbiAgc2Vzc2lvbl9pZDogei5zdHJpbmcoKSxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxLFxuICBub25fY2RlX2Zvcm1fZmllbGRzOiBSZXF1aXJlZEZvcm1GaWVsZHMsXG4gIGRvX25vdF91c2VfbGVnYWN5X2NjX2Zsb3c6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGV4aXN0aW5nX2NjX3BtX2lkOiBudWxsT3JVbmRlZk9yJDEoei5zdHJpbmcoKSlcbn0pO1xuei5vYmplY3Qoe1xuICBzZXNzaW9uX2lkOiB6LnN0cmluZygpLFxuICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gIG5vbl9jZGVfZm9ybV9maWVsZHM6IFJlcXVpcmVkRm9ybUZpZWxkc1xufSk7XG52YXIgVGhyZWVEU1N0YXR1cyA9IC8qIEBfX1BVUkVfXyAqLyAoKFRocmVlRFNTdGF0dXMyKSA9PiB7XG4gIFRocmVlRFNTdGF0dXMyW1wiU1VDQ0VTU1wiXSA9IFwic3VjY2Vzc1wiO1xuICBUaHJlZURTU3RhdHVzMltcIkZBSUxVUkVcIl0gPSBcImZhaWx1cmVcIjtcbiAgVGhyZWVEU1N0YXR1czJbXCJDQU5DRUxMRURcIl0gPSBcImNhbmNlbGxlZFwiO1xuICByZXR1cm4gVGhyZWVEU1N0YXR1czI7XG59KShUaHJlZURTU3RhdHVzIHx8IHt9KTtcbmNvbnN0IFBpbmczRFNTdGF0dXNSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LmVudW0oW1wic3VjY2Vzc1wiIC8qIFNVQ0NFU1MgKi8sIFwiZmFpbHVyZVwiIC8qIEZBSUxVUkUgKi8sIFwiY2FuY2VsbGVkXCIgLyogQ0FOQ0VMTEVEICovXSlcbn0pO1xuY29uc3QgQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LnN0cmluZygpLFxuICByZWRpcmVjdF91cmw6IHouc3RyaW5nKCksXG4gIGluaXRpYWxfaW50ZW50X2lkOiB6LnN0cmluZygpLFxuICBjb25zZW50X2lkOiB6LnN0cmluZygpXG59KTtcblxuY29uc3QgZXh0cmFjdElzc3Vlc1BlckZpZWxkID0gKGVycm9yKSA9PiB7XG4gIGNvbnN0IGlzc3Vlc1BlckZpZWxkID0ge307XG4gIE9iamVjdC5lbnRyaWVzKGVycm9yKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gRmllbGROYW1lRW51bS5wYXJzZShrZXkpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGlzc3Vlc1BlckZpZWxkW2ZpZWxkTmFtZV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5fZXJyb3JzKSkge1xuICAgICAgICBpc3N1ZXNQZXJGaWVsZFtmaWVsZE5hbWVdID0gdmFsdWUuX2Vycm9ycztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gaXNzdWVzUGVyRmllbGQ7XG59O1xuXG5jb25zdCBTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSB6Lm9iamVjdCh7XG4gIHN0cmlwZV9wazogei5zdHJpbmcoKSxcbiAgY2xpZW50X3NlY3JldDogei5zdHJpbmcoKSxcbiAgc3RyaXBlX3BtX2lkOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IFBheW1lbnRSZXF1ZXN0TmV4dEFjdGlvbk1ldGFkYXRhID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LnN0cmluZygpLFxuICBjbGllbnRfc2VjcmV0OiB6LnN0cmluZygpLFxuICBzdHJpcGVfcGs6IHouc3RyaW5nKClcbn0pO1xuY29uc3Qgb3VyQ3VycmVuY3lUb1RoZWlycyA9IHtcbiAgdXNkOiBcInVzZFwiLFxuICBicmw6IFwiYnJsXCJcbn07XG5jb25zdCBnZXRMb2FkZWRTdHJpcGUgPSBhc3luYyAocHVibGlzaGFibGVLZXkpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgaWYgKCFpc1N0cmlwZUpzUHJlc2VudCgpKSB7XG4gICAgICBhd2FpdCBzbGVlcCg1MDApO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU3RyaXBlSnNQcmVzZW50KCkpIHtcbiAgICBjb25zb2xlLmxvZyhcIlN0cmlwZSBKUyBub3QgZm91bmQuXCIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgU3RyaXBlIEpTIG5vdCBmb3VuZC5gKTtcbiAgfVxuICBjb25zdCBzdHJpcGUgPSBuZXcgU3RyaXBlKHB1Ymxpc2hhYmxlS2V5KTtcbiAgcmV0dXJuIHN0cmlwZTtcbn07XG5jb25zdCBjcmVhdGVTdHJpcGVFbGVtZW50cyA9IGFzeW5jIChzdHJpcGVQdWJLZXksIGVsZW1lbnRzT3B0aW9ucykgPT4ge1xuICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUoc3RyaXBlUHViS2V5KTtcbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50czogc3RyaXBlLmVsZW1lbnRzKGVsZW1lbnRzT3B0aW9ucyksXG4gICAgc3RyaXBlXG4gIH07XG59O1xuY29uc3QgY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QgPSBhc3luYyAoc3RyaXBlUHViS2V5LCB0b3RhbEFtb3VudEF0b20sIGN1cnJlbmN5LCBpc0Ftb3VudFBlbmRpbmcsIGlzTGlua09ubHkpID0+IHtcbiAgY29uc29sZS5sb2coaXNMaW5rT25seSk7XG4gIGNvbnN0IHN0cmlwZSA9IGF3YWl0IGdldExvYWRlZFN0cmlwZShzdHJpcGVQdWJLZXkpO1xuICBjb25zdCBzdHJpcGVDdXJyZW5jeSA9IG91ckN1cnJlbmN5VG9UaGVpcnNbY3VycmVuY3kudG9Mb3dlckNhc2UoKS50cmltKCldO1xuICBjb25zdCBwYXltZW50UmVxdWVzdCA9IHN0cmlwZS5wYXltZW50UmVxdWVzdCh7XG4gICAgLy8gVE9ETzogcmVwbGFjZSB0aGlzIHdpdGggc3RyaXBlIGFjY291bnQgY291bnRyeSBhcyBzb29uIGFzIHdlIHN1cHBvcnQgaXRcbiAgICBjb3VudHJ5OiBcIlVTXCIsXG4gICAgY3VycmVuY3k6IHN0cmlwZUN1cnJlbmN5LFxuICAgIHRvdGFsOiB7XG4gICAgICBsYWJlbDogXCJUb3RhbFwiLFxuICAgICAgYW1vdW50OiB0b3RhbEFtb3VudEF0b20sXG4gICAgICBwZW5kaW5nOiBpc0Ftb3VudFBlbmRpbmdcbiAgICB9LFxuICAgIHJlcXVlc3RQYXllck5hbWU6IHRydWUsXG4gICAgcmVxdWVzdFBheWVyRW1haWw6IHRydWUsXG4gICAgZGlzYWJsZVdhbGxldHM6IFtdIFxuICB9KTtcbiAgcmV0dXJuIHBheW1lbnRSZXF1ZXN0O1xufTtcbmNvbnN0IHNsZWVwID0gKHRpbWVvdXRNcykgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXRNcyk7XG4gIH0pO1xufTtcbmNvbnN0IGlzU3RyaXBlSnNQcmVzZW50ID0gKCkgPT4ge1xuICByZXR1cm4gXCJTdHJpcGVcIiBpbiB3aW5kb3c7XG59O1xuY29uc3Qgd2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QgPSBhc3luYyAocGF5bWVudFJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgcGF5bWVudFJlcXVlc3Qub24oXCJwYXltZW50bWV0aG9kXCIsIGFzeW5jIChldnQpID0+IHtcbiAgICAgICAgcmVzb2x2ZShldnQpO1xuICAgICAgfSk7XG4gICAgICBwYXltZW50UmVxdWVzdC5vbihcImNhbmNlbFwiLCAoKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFBheW1lbnQgY2FuY2VsbGVkLCBwbGVhc2UgY2xpY2sgU3VibWl0IGFnYWluIHRvIHBheWApKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChlKTtcbiAgICB9XG4gIH0pO1xufTtcbmNvbnN0IGNvbmZpcm1QYXltZW50Rmxvd0ZvclN0cmlwZVBSTGVnYWN5ID0gYXN5bmMgKHBheWxvYWQsIHN0cmlwZVBtKSA9PiB7XG4gIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBheWxvYWQubmV4dEFjdGlvbk1ldGFkYXRhO1xuICBpZiAoIXBheWxvYWQucGF5bWVudEZsb3dNZXRhZGF0YSB8fCAhcGF5bG9hZC5wYXltZW50Rmxvd01ldGFkYXRhW1wic3RyaXBlUG1JZFwiXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXltZW50IGZsb3cgbWV0YWRhdGEgZm9ybWF0OiAke0pTT04uc3RyaW5naWZ5KHBheWxvYWQucGF5bWVudEZsb3dNZXRhZGF0YSl9YCk7XG4gIH1cbiAgaWYgKCFuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrIHx8ICFuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBuZXh0IGFjdGlvbiBtZXRhZGF0YSBmb3JtYXQ6ICR7SlNPTi5zdHJpbmdpZnkobmV4dEFjdGlvbk1ldGFkYXRhKX1gKTtcbiAgfVxuICBpZiAoc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZCAhPT0gcGF5bG9hZC5wYXltZW50Rmxvd01ldGFkYXRhW1wic3RyaXBlUG1JZFwiXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUE0gSUQgbWlzbWF0Y2g6ICR7c3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZH0gIT0gJHtwYXlsb2FkLnBheW1lbnRGbG93TWV0YWRhdGFbXCJzdHJpcGVQbUlkXCJdfWApO1xuICB9XG4gIGNvbnN0IHN0cmlwZSA9IGF3YWl0IGdldExvYWRlZFN0cmlwZShuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrKTtcbiAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IHN0cmlwZS5jb25maXJtQ2FyZFNldHVwKG5leHRBY3Rpb25NZXRhZGF0YS5jbGllbnRfc2VjcmV0LCB7XG4gICAgcGF5bWVudF9tZXRob2Q6IHBheWxvYWQucGF5bWVudEZsb3dNZXRhZGF0YVtcInN0cmlwZVBtSWRcIl1cbiAgfSk7XG4gIGlmIChjb25maXJtUmVzdWx0LmVycm9yKSB7XG4gICAgc3RyaXBlUG0uY29tcGxldGUoXCJmYWlsXCIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgUGF5bWVudCBmYWlsZWQ6ICR7Y29uZmlybVJlc3VsdC5lcnJvci5tZXNzYWdlID8/IGB1bmtub3duYH1gKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJpcGVQbS5jb21wbGV0ZShcInN1Y2Nlc3NcIik7XG4gIH1cbn07XG5jb25zdCBjb25maXJtU3RyaXBlUHJQTSA9IGFzeW5jIChuZXh0QWN0aW9uTWV0YWRhdGEsIHN0cmlwZVBtKSA9PiB7XG4gIGlmICghbmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wayB8fCAhbmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmV4dCBhY3Rpb24gbWV0YWRhdGEgZm9ybWF0OiAke0pTT04uc3RyaW5naWZ5KG5leHRBY3Rpb25NZXRhZGF0YSl9YCk7XG4gIH1cbiAgY29uc3Qgc3RyaXBlID0gYXdhaXQgZ2V0TG9hZGVkU3RyaXBlKG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcGspO1xuICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgc3RyaXBlLmNvbmZpcm1DYXJkU2V0dXAobmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQsIHtcbiAgICBwYXltZW50X21ldGhvZDogc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZFxuICB9KTtcbiAgaWYgKGNvbmZpcm1SZXN1bHQuZXJyb3IpIHtcbiAgICBzdHJpcGVQbS5jb21wbGV0ZShcImZhaWxcIik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQYXltZW50IGZhaWxlZDogJHtjb25maXJtUmVzdWx0LmVycm9yLm1lc3NhZ2UgPz8gYHVua25vd25gfWApO1xuICB9IGVsc2Uge1xuICAgIHN0cmlwZVBtLmNvbXBsZXRlKFwic3VjY2Vzc1wiKTtcbiAgfVxuICByZXR1cm4gY29uZmlybVJlc3VsdDtcbn07XG5jb25zdCBjb25maXJtUGF5bWVudEZsb3dGb3IzRFMgPSBhc3luYyAocGF5bG9hZCkgPT4ge1xuICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEucGFyc2UocGF5bG9hZC5uZXh0QWN0aW9uTWV0YWRhdGEpO1xuICBhd2FpdCBsYXVuY2hTdHJpcGUzRFNEaWFsb2dGbG93KG5leHRBY3Rpb25NZXRhZGF0YSk7XG59O1xuY29uc3QgbGF1bmNoU3RyaXBlM0RTRGlhbG9nRmxvdyA9IGFzeW5jIChuZXh0QWN0aW9uTWV0YWRhdGEpID0+IHtcbiAgY29uc3Qgc3RyaXBlID0gYXdhaXQgZ2V0TG9hZGVkU3RyaXBlKG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcGspO1xuICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgc3RyaXBlLmNvbmZpcm1DYXJkU2V0dXAobmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQsIHtcbiAgICBwYXltZW50X21ldGhvZDogbmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wbV9pZFxuICB9KTtcbiAgY29uc3QgcmVzdWx0U3RhdHVzID0gY29uZmlybVJlc3VsdC5zZXR1cEludGVudD8uc3RhdHVzO1xuICBpZiAocmVzdWx0U3RhdHVzID09PSBcInN1Y2NlZWRlZFwiKSB7XG4gICAgY29uc29sZS5sb2coXCJbM0RTXSBDT05GSVJNSU5HIFBNOlwiLCBuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BtX2lkKTtcbiAgICBjb25zb2xlLmxvZyhcIlszRFNdIFNldHVwIGludGVudCBjcmVhdGVkOlwiLCBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50KTtcbiAgfSBlbHNlIGlmIChyZXN1bHRTdGF0dXMgPT09IFwiY2FuY2VsZWRcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGF5bWVudCBjYW5jZWxsZWQsIHBsZWFzZSBjbGljayBTdWJtaXQgYWdhaW4gdG8gcGF5YCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7Y29uZmlybVJlc3VsdC5lcnJvcj8ubWVzc2FnZSA/PyBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50Py5sYXN0X3NldHVwX2Vycm9yPy5tZXNzYWdlID8/IFwiUGF5bWVudCBmYWlsZWQsIHBsZWFzZSBjbGljayBzdWJtaXQgYWdhaW4gdG8gcGF5LlwifWBcbiAgICApO1xuICB9XG59O1xuXG5jb25zdCBjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyA9IChzdHlsZXMpID0+IHtcbiAgY29uc3Qgc2VyaWFsaXplZFN0eWxlcyA9IEpTT04uc3RyaW5naWZ5KHN0eWxlcyk7XG4gIHJldHVybiBzZXJpYWxpemVkU3R5bGVzO1xufTtcblxuY29uc3QgY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtID0gKGZvcm1EaXYsIGluaXRpYWxEaWN0KSA9PiB7XG4gIGNvbnN0IGluY2x1ZGVkSW5wdXRzID0gQXJyYXkuZnJvbShmb3JtRGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1vcGlkXVwiKSA/PyBbXSk7XG4gIGNvbnN0IGV4dHJhRGF0YSA9IGluY2x1ZGVkSW5wdXRzLnJlZHVjZSgoYWNjLCBpbnB1dCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGlucHV0LmdldEF0dHJpYnV0ZShcImRhdGEtb3BpZFwiKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIGFjYztcbiAgICByZXR1cm4geyAuLi5hY2MsIFtrZXldOiBpbnB1dC52YWx1ZSB9O1xuICB9LCBpbml0aWFsRGljdCA/PyB7fSk7XG4gIHJldHVybiBleHRyYURhdGE7XG59O1xuY29uc3QgY29uc3RydWN0U3VibWl0RXZlbnRQYXlsb2FkID0gKGV2ZW50VHlwZSwgc2Vzc2lvbklkLCBmb3JtRGl2LCBvblZhbGlkYXRpb25FcnJvciwgY2hlY2tvdXRQYXltZW50TWV0aG9kLCBkb05vdFVzZUxlZ2FjeUNDRmxvdywgcGF5bWVudEZsb3dNZXRhZGF0YSkgPT4ge1xuICBjb25zdCBleHRyYURhdGEgPSBjcmVhdGVJbnB1dHNEaWN0RnJvbUZvcm0oZm9ybURpdiwge1xuICAgIHR5cGU6IGV2ZW50VHlwZSxcbiAgICBzZXNzaW9uSWQsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIHBheW1lbnRGbG93TWV0YWRhdGEsXG4gICAgZG9Ob3RVc2VMZWdhY3lDQ0Zsb3dcbiAgfSk7XG4gIGNvbnNvbGUubG9nKGBbZm9ybV0gQ29uc3RydWN0aW5nICR7ZXZlbnRUeXBlfSBwYXlsb2FkOmAsIEpTT04uc3RyaW5naWZ5KGV4dHJhRGF0YSkpO1xuICBpZiAoY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyID09PSBcImFwcGxlX3BheVwiIHx8IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlciA9PT0gXCJnb29nbGVfcGF5XCIgfHwgY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyID09PSBcInN0cmlwZV9saW5rXCIpIHtcbiAgICBpZiAoIWV4dHJhRGF0YVtGaWVsZE5hbWUuWklQX0NPREVdKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBPdmVycmlkaW5nIGVtcHR5IHppcCBjb2RlIChvbmx5IGZvciBnb29nbGUgcGF5LCBhcHBsZSBwYXksIGFuZCBzdHJpcGUgbGluaylcIik7XG4gICAgICBleHRyYURhdGFbRmllbGROYW1lLlpJUF9DT0RFXSA9IFwiMDAwMDBcIjtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGF5bG9hZCA9IFN1Ym1pdEV2ZW50UGF5bG9hZC5zYWZlUGFyc2UoZXh0cmFEYXRhKTtcbiAgaWYgKCFwYXlsb2FkLnN1Y2Nlc3MpIHtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBwYXlsb2FkLmVycm9yLmZvcm1hdCgpO1xuICAgIGNvbnN0IGlzc3VlcyA9IGV4dHJhY3RJc3N1ZXNQZXJGaWVsZChmb3JtYXR0ZWQpO1xuICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZSwgZXJyb3JzXSBvZiBPYmplY3QuZW50cmllcyhpc3N1ZXMpKSB7XG4gICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9ycywgZmllbGROYW1lKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXCJbZm9ybV0gQ29uc3RydWN0ZWQgcGF5bG9hZCBpbiBGQUlMOlwiLCBwYXlsb2FkLmRhdGEpO1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIENvbnN0cnVjdGVkIHBheWxvYWQ6XCIsIEpTT04uc3RyaW5naWZ5KHBheWxvYWQuZGF0YSkpO1xuICAgIHJldHVybiBwYXlsb2FkLmRhdGE7XG4gIH1cbn07XG5jb25zdCBwYXJzZUV2ZW50UGF5bG9hZCA9IChldmVudERhdGEpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRWxlbWVudEV2ZW50LnBhcnNlKGV2ZW50RGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIHBhcnNpbmcgZXZlbnQgcGF5bG9hZDpcIiwgZXZlbnREYXRhLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5jb25zdCBlbWl0RXZlbnQgPSAodGFyZ2V0LCBmb3JtSWQsIGVsZW1lbnRJZCwgcGF5bG9hZCwgYmFzZVVybCkgPT4ge1xuICBjb25zdCBldmVudCA9IHtcbiAgICBwYXlsb2FkLFxuICAgIG5vbmNlOiB2NCgpLFxuICAgIGZvcm1JZCxcbiAgICBlbGVtZW50SWRcbiAgfTtcbiAgY29uc29sZS5sb2coYFtmb3JtICR7Zm9ybUlkfV0gU2VuZGluZyBldmVudCB0byBjaGlsZCAke2VsZW1lbnRJZH06YCwgZXZlbnQpO1xuICB0YXJnZXQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZXZlbnQpLCBiYXNlVXJsKTtcbn07XG5cbmNvbnN0IGNoZWNrSWZWYWxpZENkZUNvbm5lY3Rpb25PYmplY3QgPSBhc3luYyAob2JqKSA9PiB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8ICFvYmopIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaW5nID0geyB0eXBlOiBcInBpbmdcIiB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9iai5zZW5kKHBpbmcpO1xuICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJ3RydWUnIGFmdGVyIHBpbmcsIGdvdCAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBDREUgY29ubmVjdGlvbiBjaGVjazpgLCBlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5jb25zdCBpc1Jlc3VsdFZhbGlkID0gKG9iaiwgaXNWYWxpZCkgPT4ge1xuICByZXR1cm4gISFvYmogJiYgaXNWYWxpZDtcbn07XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVDZGVDb25uZWN0aW9uKGlmcmFtZSkge1xuICBjb25zdCBjb25uZWN0aW9uID0gY29ubmVjdFRvQ2hpbGQoe1xuICAgIGlmcmFtZSxcbiAgICBkZWJ1ZzogdHJ1ZVxuICB9KTtcbiAgY29uc3QgY29ubmVjdGlvbk9iaiA9IGF3YWl0IGNvbm5lY3Rpb24ucHJvbWlzZTtcbiAgY29uc3QgaXNWYWxpZE9iamVjdCA9IGF3YWl0IGNoZWNrSWZWYWxpZENkZUNvbm5lY3Rpb25PYmplY3QoY29ubmVjdGlvbk9iaik7XG4gIGlmICghaXNSZXN1bHRWYWxpZChjb25uZWN0aW9uT2JqLCBpc1ZhbGlkT2JqZWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgR290IGludmFsaWQgQ0RFIGNvbm5lY3Rpb24gb2JqZWN0YCk7XG4gIH1cbiAgcmV0dXJuIGNvbm5lY3Rpb25PYmo7XG59XG5cbmNvbnN0IG51bGxPclVuZGVmT3IgPSAoelR5cGUpID0+IHoubnVsbGFibGUoelR5cGUub3B0aW9uYWwoKSk7XG56LnN0cmluZygpLnRyaW0oKS5taW4oMSwgeyBtZXNzYWdlOiBgQ2Fubm90IGJlIGJsYW5rYCB9KTtcbmNvbnN0IENERVJlc3BvbnNlRXJyb3IgPSB6Lm9iamVjdCh7XG4gIGNkZV9yZXNwb25zZV90eXBlOiB6LmxpdGVyYWwoXCJlcnJvclwiKSxcbiAgbWVzc2FnZTogei5zdHJpbmcoKSxcbiAgaGVhZGVyczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKVxufSk7XG56LmVudW0oW1widXNkXCIsIFwiYnJsXCJdKTtcbmNvbnN0IENvdXBvbk1pbmltYWwgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCksXG4gIGFtb3VudF9hdG9tX29mZjogbnVsbE9yVW5kZWZPcih6Lm51bWJlcigpKSxcbiAgcGVyY2VudF9vZmY6IG51bGxPclVuZGVmT3Ioei5udW1iZXIoKSksXG4gIGN1cnJlbmN5OiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICBkdXJhdGlvbjogei5zdHJpbmcoKSxcbiAgZHVyYXRpb25faW5fbW9udGhzOiBudWxsT3JVbmRlZk9yKHoubnVtYmVyKCkpXG59KTtcbmNvbnN0IExpbmVJdGVtID0gei5vYmplY3Qoe1xuICBhbW91bnRfc3VidG90YWxfYXRvbTogei5udW1iZXIoKS5pbnQoKSxcbiAgYW1vdW50X3RvdGFsX2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGN1cnJlbmN5OiB6LnN0cmluZygpLFxuICBkZXNjcmlwdGlvbjogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgcHJpY2VfaWQ6IHouc3RyaW5nKCksXG4gIGJpbGxpbmdfaW50ZXJ2YWw6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGJpbGxpbmdfaW50ZXJ2YWxfY291bnQ6IG51bGxPclVuZGVmT3Ioei5udW1iZXIoKS5pbnQoKSksXG4gIHF1YW50aXR5OiB6Lm51bWJlcigpLmludCgpXG59KTtcbmNvbnN0IEJyYW5kU2V0dGluZ3MgPSB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKTtcbmNvbnN0IEJyYW5kID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLFxuICBzZXR0aW5nczogbnVsbE9yVW5kZWZPcihCcmFuZFNldHRpbmdzKVxufSk7XG5jb25zdCBDaGVja291dFBheW1lbnRNZXRob2QgPSB6Lm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6LnN0cmluZygpLFxuICBwcm9jZXNzb3JfbmFtZTogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgbWV0YWRhdGE6IG51bGxPclVuZGVmT3Ioei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkpXG59KTtcbmNvbnN0IFN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsID0gei5vYmplY3Qoe1xuICBxdWFudGl0eTogei5udW1iZXIoKVxufSk7XG5jb25zdCBTdWJzY3JpcHRpb25NaW5pbWFsID0gei5vYmplY3Qoe1xuICBpZDogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgYmlsbGluZ19pbnRlcnZhbDogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgYmlsbGluZ19pbnRlcnZhbF9jb3VudDogbnVsbE9yVW5kZWZPcih6Lm51bWJlcigpLmludCgpKSxcbiAgc3Vic2NyaXB0aW9uX2l0ZW1zOiB6LmFycmF5KFN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsKSxcbiAgdHJpYWxfc3RhcnQ6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIHRyaWFsX2VuZDogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKVxufSk7XG5jb25zdCBJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwgPSB6Lm9iamVjdCh7XG4gIGFtb3VudF9hdG9tOiB6Lm51bWJlcigpXG59KTtcbmNvbnN0IEludm9pY2VMaW5lSXRlbU1pbmltYWwgPSB6Lm9iamVjdCh7XG4gIGFtb3VudF9hdG9tOiB6Lm51bWJlcigpLFxuICBhbW91bnRfYXRvbV9jb25zaWRlcmluZ19kaXNjb3VudF9hcHBsaWVkOiB6Lm51bWJlcigpLFxuICBjdXJyZW5jeTogei5zdHJpbmcoKSxcbiAgZGlzY291bnRfYW1vdW50X2F0b21zOiB6LmFycmF5KEludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbCksXG4gIHN1YnNjcmlwdGlvbl9pdGVtX2lkOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IERpc2NvdW50TWluaW1hbCA9IHoub2JqZWN0KHtcbiAgY291cG9uOiBDb3Vwb25NaW5pbWFsXG59KTtcbmNvbnN0IEludm9pY2VNaW5pbWFsID0gei5vYmplY3Qoe1xuICBjdXJyZW5jeTogei5zdHJpbmcoKSxcbiAgZGlzY291bnRzOiB6LmFycmF5KERpc2NvdW50TWluaW1hbCksXG4gIGhvc3RlZF9pbnZvaWNlX3VybDogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgbGluZXM6IHouYXJyYXkoSW52b2ljZUxpbmVJdGVtTWluaW1hbCksXG4gIHJlbWFpbmluZ19hbW91bnRfYXRvbTogei5udW1iZXIoKSxcbiAgdGF4X2Ftb3VudF9hdG9tOiB6Lm51bWJlcigpLFxuICB0b3RhbF9hbW91bnRfYXRvbTogei5udW1iZXIoKSxcbiAgdG90YWxfZGlzY291bnRfYW1vdW50X2F0b21zOiB6LmFycmF5KEludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbClcbn0pO1xuY29uc3QgQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2VNaW5pbWFsID0gei5vYmplY3Qoe1xuICBjcmVhdGVkOiB6LmFycmF5KFN1YnNjcmlwdGlvbk1pbmltYWwpLFxuICBpbnZvaWNlczogei5hcnJheShJbnZvaWNlTWluaW1hbClcbn0pO1xuY29uc3QgUHJldmlld0NoZWNrb3V0UmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHByZXZpZXc6IENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCxcbiAgcHJldmlld19wb3N0X3RyaWFsOiBudWxsT3JVbmRlZk9yKENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCksXG4gIGNvdXBvbnM6IHouYXJyYXkoQ291cG9uTWluaW1hbClcbn0pO1xuY29uc3QgX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbiA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LmxpdGVyYWwoXCJvcGVuXCIpLFxuICB0b2tlbjogei5zdHJpbmcoKSxcbiAgZW1haWw6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGxpbmVfaXRlbXM6IHouYXJyYXkoTGluZUl0ZW0pLFxuICBhbW91bnRfc3VidG90YWxfYXRvbTogei5udW1iZXIoKS5pbnQoKSxcbiAgYW1vdW50X3RvdGFsX2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGJyYW5kOiBCcmFuZCxcbiAgc3Vic19wcmV2aWV3OiBudWxsT3JVbmRlZk9yKFByZXZpZXdDaGVja291dFJlc3BvbnNlKSxcbiAgLy8gTnVsbCBpbiBzZXR1cCBtb2RlXG4gIG1ldGhvZHNfYXZhaWxhYmxlOiB6LmFycmF5KENoZWNrb3V0UGF5bWVudE1ldGhvZClcbn0pO1xuY29uc3QgUGF5bWVudEZvcm1QcmVmaWxsID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJtb2RlXCIsIFtcbiAgei5vYmplY3Qoe1xuICAgIG1vZGU6IHoubGl0ZXJhbChcInNldHVwXCIpLFxuICAgIGN1cnJlbmN5OiB6Lm51bGxhYmxlKHoudW5kZWZpbmVkKCkpXG4gIH0pLmV4dGVuZChfUGF5bWVudEZvcm1QcmVmaWxsQ29tbW9uLnNoYXBlKSxcbiAgei5vYmplY3Qoe1xuICAgIG1vZGU6IHouZW51bShbXCJwYXltZW50XCIsIFwic3Vic2NyaXB0aW9uXCJdKSxcbiAgICBjdXJyZW5jeTogei5zdHJpbmcoKVxuICB9KS5leHRlbmQoX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbi5zaGFwZSlcbl0pO1xuY29uc3QgQ29tcGxldGVkRm9ybVByZWZpbGwgPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5saXRlcmFsKFwiY29tcGxldGVcIilcbn0pO1xuY29uc3QgRXhwaXJlZEZvcm1QcmVmaWxsID0gei5vYmplY3Qoe1xuICBzdGF0dXM6IHoubGl0ZXJhbChcImV4cGlyZWRcIilcbn0pO1xuei51bmlvbihbUGF5bWVudEZvcm1QcmVmaWxsLCBDb21wbGV0ZWRGb3JtUHJlZmlsbCwgRXhwaXJlZEZvcm1QcmVmaWxsXSk7XG56Lm9iamVjdCh7XG4gIGxvZ286IHouc3RyaW5nKCksXG4gIGljb246IHouc3RyaW5nKCksXG4gIHByaW1hcnlfY29sb3I6IHouc3RyaW5nKCksXG4gIHNlY29uZGFyeV9jb2xvcjogei5zdHJpbmcoKVxufSk7XG5jb25zdCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgaW52b2ljZV91cmxzOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBzdWJzY3JpcHRpb25faWRzOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBjdXN0b21lcl9pZDogei5zdHJpbmcoKVxufSk7XG56Lm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogei5zdHJpbmcoKSxcbiAgcGF5bWVudF9pbnB1dDogei5hbnkoKSxcbiAgLy8gU2hvdWxkIGZvbGxvdyBBbnlQYXltZW50SW5wdXQgZnJvbSBDREVcbiAgY3VzdG9tZXJfZW1haWw6IHouc3RyaW5nKCksXG4gIGN1c3RvbWVyX3ppcF9jb2RlOiB6LnN0cmluZygpLFxuICBjdXN0b21lcl9jb3VudHJ5OiB6LnN0cmluZygpLFxuICBsaW5lX2l0ZW1zOiB6LmFycmF5KExpbmVJdGVtKSxcbiAgdG90YWxfYW1vdW50X2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGNhbmNlbF9hdF9lbmQ6IHouYm9vbGVhbigpLFxuICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICBwcm9tb3Rpb25fY29kZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpXG59KTtcbmNvbnN0IFNldHVwQ2hlY2tvdXRSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcGF5bWVudF9tZXRob2RfaWQ6IHouc3RyaW5nKClcbn0pO1xuei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgcmV0dXJuX3VybDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5zdHJpbmcoKSxcbiAgbG9jOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBtc2c6IHouc3RyaW5nKCksXG4gIHVybDogei5zdHJpbmcoKVxufSk7XG56LmFycmF5KFB5ZGFudGljVmFsaWRhdGlvbkVycm9yKTtcbnoub2JqZWN0KHtcbiAgbmV3X2N1c3RvbWVyX2VtYWlsOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIG5ld19jdXN0b21lcl9hZGRyZXNzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKS5vcHRpb25hbCgpLFxuICBwYXltZW50X3Byb3ZpZGVyOiB6LnN0cmluZygpLFxuICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICBleGlzdGluZ19jY19wbV9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB0aGVpcl9leGlzdGluZ19wbV9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpXG59KTtcbmNvbnN0IFN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcmVxdWlyZWRfdXNlcl9hY3Rpb25zOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKVxufSk7XG56Lm9iamVjdCh7XG4gIGZpZWxkczogUFJGb3JtRmllbGRzLFxuICBjaGVja291dFBheW1lbnRNZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZFxufSk7XG56Lm9iamVjdCh7XG4gIHNlc3Npb25faWQ6IHouc3RyaW5nKCksXG4gIG5vbl9jZGVfZm9ybV9maWVsZHM6IFJlcXVpcmVkRm9ybUZpZWxkcyxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZFxufSk7XG5jb25zdCBTdGFydFBheW1lbnRGbG93Rm9yQ0NSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcmVxdWlyZWRfdXNlcl9hY3Rpb25zOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKSxcbiAgY2NfcG1faWQ6IHouc3RyaW5nKClcbn0pO1xuei5yZWNvcmQoei5hbnkoKSk7XG5cbmNvbnN0IHN1bSA9IChhcnIpID0+IHtcbiAgcmV0dXJuIGFyci5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbn07XG5cbmZ1bmN0aW9uIGZpeFByb3RvKHRhcmdldCwgcHJvdG90eXBlKSB7XG4gIHZhciBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiAgc2V0UHJvdG90eXBlT2YgPyBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvdHlwZSkgOiB0YXJnZXQuX19wcm90b19fID0gcHJvdG90eXBlO1xufVxuZnVuY3Rpb24gZml4U3RhY2sodGFyZ2V0LCBmbikge1xuICBpZiAoZm4gPT09IHZvaWQgMCkge1xuICAgIGZuID0gdGFyZ2V0LmNvbnN0cnVjdG9yO1xuICB9XG5cbiAgdmFyIGNhcHR1cmVTdGFja1RyYWNlID0gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U7XG4gIGNhcHR1cmVTdGFja1RyYWNlICYmIGNhcHR1cmVTdGFja1RyYWNlKHRhcmdldCwgZm4pO1xufVxuXG52YXIgX19leHRlbmRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICBfX3Byb3RvX186IFtdXG4gICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuXG4gICAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgICBmdW5jdGlvbiBfXygpIHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgIH1cblxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbn0oKTtcblxudmFyIEN1c3RvbUVycm9yID0gZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoQ3VzdG9tRXJyb3IsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gQ3VzdG9tRXJyb3IobWVzc2FnZSwgb3B0aW9ucykge1xuICAgIHZhciBfbmV3VGFyZ2V0ID0gdGhpcy5jb25zdHJ1Y3RvcjtcblxuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UsIG9wdGlvbnMpIHx8IHRoaXM7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX3RoaXMsICduYW1lJywge1xuICAgICAgdmFsdWU6IF9uZXdUYXJnZXQubmFtZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgZml4UHJvdG8oX3RoaXMsIF9uZXdUYXJnZXQucHJvdG90eXBlKTtcbiAgICBmaXhTdGFjayhfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIEN1c3RvbUVycm9yO1xufShFcnJvcik7XG5cbmNsYXNzIENkZUVycm9yIGV4dGVuZHMgQ3VzdG9tRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xuICAgIGNvbnN0IGZyaWVuZGx5TWVzc2FnZSA9IGBbY2RlLWNsaWVudF0gRXJyb3IgcXVlcnlpbmcgQ0RFOiAke3Jlc3BvbnNlLm1lc3NhZ2V9YDtcbiAgICBzdXBlcihmcmllbmRseU1lc3NhZ2UpO1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgfVxuICBnZXQgb3JpZ2luYWxFcnJvck1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2UubWVzc2FnZTtcbiAgfVxufVxuY29uc3QgcXVlcnlDREUgPSBhc3luYyAoY2RlQ29ubiwgZGF0YSwgcmVzcG9uc2VTY2hlbWEpID0+IHtcbiAgY29uc29sZS5sb2coXCJbY2RlLWNsaWVudF0gUXVlcnlpbmcgQ0RFIHdpdGggcGF0aCBhbmQgY29ubmVjdGlvbjpcIiwgZGF0YS50eXBlLCBjZGVDb25uKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjZGVDb25uLnNlbmQoZGF0YSk7XG4gIGNvbnNvbGUubG9nKFwiW2NkZS1jbGllbnRdIEdvdCByZXNwb25zZSBmcm9tIENERTpcIiwgcmVzcG9uc2UpO1xuICBpZiAoaXNDREVSZXNwb25zZUVycm9yKHJlc3BvbnNlKSkge1xuICAgIHRocm93IG5ldyBDZGVFcnJvcihyZXNwb25zZSk7XG4gIH1cbiAgaWYgKCFjaGVja0lmQ29uZm9ybXNUb1NjaGVtYShyZXNwb25zZSwgcmVzcG9uc2VTY2hlbWEpKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKHJlc3BvbnNlKTtcbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3RhdGVcIik7XG4gICAgY29uc29sZS5lcnJvcihcIk9KUyBxdWVyeUFwaSBnb3QgYSBzY2hlbWEgZXJyb3IuIEV4cGVjdGVkIHNjaGVtYTpcIiwgcmVzcG9uc2VTY2hlbWEsIFwiQWN0dWFsOlwiLCByZXNwb25zZSk7XG4gICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn07XG5jb25zdCBjaGVja0lmQ29uZm9ybXNUb1NjaGVtYSA9ICh2YWx1ZSwgc2NoZW1hKSA9PiB7XG4gIHJldHVybiBzY2hlbWEuc2FmZVBhcnNlKHZhbHVlKS5zdWNjZXNzO1xufTtcbmNvbnN0IGlzQ0RFUmVzcG9uc2VFcnJvciA9IChyZXNwb25zZSkgPT4ge1xuICByZXR1cm4gQ0RFUmVzcG9uc2VFcnJvci5zYWZlUGFyc2UocmVzcG9uc2UpLnN1Y2Nlc3M7XG59O1xuY29uc3QgZ2V0Q2hlY2tvdXRQcmV2aWV3ID0gYXN5bmMgKGNkZUNvbm4sIHJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJnZXRfY2hlY2tvdXRfcHJldmlld1wiLCBwYXlsb2FkOiByZXF1ZXN0IH0sIFByZXZpZXdDaGVja291dFJlc3BvbnNlKTtcbn07XG5jb25zdCBnZXRQcmVmaWxsID0gYXN5bmMgKGNkZUNvbm4pID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJnZXRfcHJlZmlsbFwiLCBwYXlsb2FkOiB7fSB9LCBQYXltZW50Rm9ybVByZWZpbGwpO1xufTtcbmNvbnN0IHN0YXJ0UGF5bWVudEZsb3cgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcInYyX3N0YXJ0X3BheW1lbnRfZmxvd1wiLCBwYXlsb2FkIH0sIFN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG59O1xuY29uc3Qgc3RhcnRQYXltZW50Rmxvd0ZvckNDID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJzdGFydF9wYXltZW50X2Zsb3dfZm9yX2NjXCIsIHBheWxvYWQgfSwgU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UpO1xufTtcbmNvbnN0IHN0YXJ0UGF5bWVudEZsb3dGb3JQUiA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic3RhcnRfcGF5bWVudF9mbG93X2Zvcl9wclwiLCBwYXlsb2FkIH0sIFN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG59O1xuY29uc3QgY29uZmlybVBheW1lbnRGbG93ID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJjb25maXJtX3BheW1lbnRfZmxvd1wiLCBwYXlsb2FkIH0sIENvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKTtcbn07XG5jb25zdCB3YWl0Rm9yRm9ybUZpZWxkSW5wdXQgPSBhc3luYyAoZm9ybURpdiwgZmllbGROYW1lLCB3YWl0VGltZU1zKSA9PiB7XG4gIGNvbnN0IHN0YXJ0V2FpdFRpbWUgPSBEYXRlLm5vdygpO1xuICB3YWl0VGltZU1zID0gd2FpdFRpbWVNcyA/PyA1ZTM7XG4gIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnRXYWl0VGltZSA8IHdhaXRUaW1lTXMpIHtcbiAgICBjb25zdCBtYXRjaCA9IGZvcm1EaXYucXVlcnlTZWxlY3RvcihgaW5wdXRbZGF0YS1vcGlkPSR7ZmllbGROYW1lfV1gKTtcbiAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgIGlmICghKG1hdGNoIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHN0YXRlOiBtYXRjaGVkIGlucHV0IGVsZW1lbnQgaGFkIHdyb25nIGNsYXNzOiAke21hdGNoLnRhZ05hbWV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuICAgIGF3YWl0IHNsZWVwKDMwMCk7XG4gIH1cbiAgY29uc29sZS53YXJuKFwiQ2Fubm90IGZpbmQgcHJvbW8gY29kZSBpbnB1dFwiKTtcbiAgcmV0dXJuIG51bGw7XG59O1xuY29uc3QgZ2V0Q2hlY2tvdXRWYWx1ZSA9IGFzeW5jIChjZGVDb25uLCBzZWN1cmVUb2tlbiwgcHJvbW9Db2RlKSA9PiB7XG4gIGNvbnN0IGNoZWNrb3V0UHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0UHJldmlldyhjZGVDb25uLCB7XG4gICAgc2VjdXJlX3Rva2VuOiBzZWN1cmVUb2tlbixcbiAgICBwcm9tb3Rpb25fY29kZTogcHJvbW9Db2RlXG4gIH0pO1xuICBjb25zdCBjdXJyZW5jaWVzID0gbmV3IFNldChjaGVja291dFByZXZpZXcucHJldmlldy5pbnZvaWNlcy5tYXAoKGludikgPT4gaW52LmN1cnJlbmN5KSk7XG4gIGlmIChjdXJyZW5jaWVzLnNpemUgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgb25lIGN1cnJlbmN5LCBnb3QgJHtjdXJyZW5jaWVzLnNpemV9YCk7XG4gIH1cbiAgY29uc3QgY3VycmVuY3kgPSBjdXJyZW5jaWVzLnZhbHVlcygpLm5leHQoKS52YWx1ZSA/PyBcInVzZFwiO1xuICBjb25zdCBhbW91bnRBdG9tID0gc3VtKGNoZWNrb3V0UHJldmlldy5wcmV2aWV3Lmludm9pY2VzLm1hcCgoaW52KSA9PiBpbnYucmVtYWluaW5nX2Ftb3VudF9hdG9tKSk7XG4gIHJldHVybiB7XG4gICAgY3VycmVuY3ksXG4gICAgYW1vdW50QXRvbVxuICB9O1xufTtcbmNvbnN0IGdldENoZWNrb3V0UHJldmlld0Ftb3VudCA9IGFzeW5jIChjZGVDb25uLCBzZWN1cmVUb2tlbiwgaXNTZXR1cE1vZGUsIHByb21vQ29kZSkgPT4ge1xuICBpZiAoaXNTZXR1cE1vZGUpIHtcbiAgICByZXR1cm4geyBhbW91bnRBdG9tOiAwLCBjdXJyZW5jeTogXCJ1c2RcIiB9O1xuICB9IGVsc2Uge1xuICAgIHByb21vQ29kZSA9ICFwcm9tb0NvZGUgPyB2b2lkIDAgOiBwcm9tb0NvZGU7XG4gICAgY29uc3QgY2hlY2tvdXRQcmV2aWV3ID0gYXdhaXQgZ2V0Q2hlY2tvdXRWYWx1ZShjZGVDb25uLCBzZWN1cmVUb2tlbiwgcHJvbW9Db2RlKTtcbiAgICByZXR1cm4geyBhbW91bnRBdG9tOiBjaGVja291dFByZXZpZXcuYW1vdW50QXRvbSwgY3VycmVuY3k6IGNoZWNrb3V0UHJldmlldy5jdXJyZW5jeSB9O1xuICB9XG59O1xuY29uc3QgdG9rZW5pemVDYXJkT25BbGxDb25uZWN0aW9ucyA9IGFzeW5jIChhbGxDZGVDb25uZWN0aW9ucywgcGF5bG9hZCkgPT4ge1xuICBpZiAoYWxsQ2RlQ29ubmVjdGlvbnMuc2l6ZSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIENERSBjb25uZWN0aW9ucyBmb3VuZFwiKTtcbiAgfVxuICBjb25zdCByZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBBcnJheS5mcm9tKGFsbENkZUNvbm5lY3Rpb25zLnZhbHVlcygpKS5tYXAoXG4gICAgICAoY2RlQ29ubikgPT4gcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcInRva2VuaXplX2NhcmRcIiwgcGF5bG9hZCB9LCBUb2tlbml6ZUNhcmRSZXNwb25zZSlcbiAgICApXG4gICk7XG4gIHJldHVybiByZXNwb25zZXM7XG59O1xuY29uc3QgY2hlY2tvdXRDYXJkRWxlbWVudHMgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiY2hlY2tvdXRfY2FyZF9lbGVtZW50c1wiLCBwYXlsb2FkIH0sIENoZWNrb3V0U3VjY2Vzc1Jlc3BvbnNlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiW2NkZS1jbGllbnRdIEVycm9yIGR1cmluZyBjaGVja291dENhcmRFbGVtZW50czpcIiwgZXJyb3IsIEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5jb25zdCBzZXR1cENoZWNrb3V0ID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJzZXR1cF9wYXltZW50X21ldGhvZFwiLCBwYXlsb2FkIH0sIFNldHVwQ2hlY2tvdXRSZXNwb25zZSk7XG59O1xuY29uc3QgcGVyZm9ybUNoZWNrb3V0ID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJjaGVja291dFwiLCBwYXlsb2FkIH0sIENoZWNrb3V0U3VjY2Vzc1Jlc3BvbnNlKTtcbn07XG5jb25zdCBDREVfUE9MTElOR19JTlRFUlZBTCA9IDFlMztcbmNvbnN0IHBpbmdDZGVGb3IzZHNTdGF0dXMgPSBhc3luYyAoaWZyYW1lLCBjaGlsZE9yaWdpbikgPT4ge1xuICBjb25zb2xlLmxvZyhjaGlsZE9yaWdpbik7XG4gIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0VG9DaGlsZCh7XG4gICAgaWZyYW1lLFxuICAgIGRlYnVnOiB0cnVlLFxuICAgIHRpbWVvdXQ6IENERV9QT0xMSU5HX0lOVEVSVkFMLFxuICAgIGNoaWxkT3JpZ2luOiBcIipcIlxuICAgIC8vIFRPRE86IHVzZSB3aXRoIHByb3BlciBjaGlsZE9yaWdpblxuICB9KTtcbiAgY29uc3QgY29ubmVjdGlvbk9iaiA9IGF3YWl0IGNvbm5lY3Rpb24ucHJvbWlzZTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcXVlcnlDREUoY29ubmVjdGlvbk9iaiwgeyB0eXBlOiBcInBpbmctM2RzLXN0YXR1c1wiIH0sIFBpbmczRFNTdGF0dXNSZXNwb25zZSk7XG4gIHJldHVybiByZXN1bHQuc3RhdHVzO1xufTtcblxuY29uc3QgaXNKc29uU3RyaW5nID0gKHN0cikgPT4ge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIEpTT04ucGFyc2Uoc3RyKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuY29uc3QgYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMgPSAoc2ltcGxlT2pzRmxvdykgPT4ge1xuICByZXR1cm4gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBwYXJhbXMuZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0U3RhcnRlZCgpO1xuICAgICAgY29uc3QgZmxvd1Jlc3VsdCA9IGF3YWl0IHNpbXBsZU9qc0Zsb3cocGFyYW1zKTtcbiAgICAgIGlmIChmbG93UmVzdWx0Lm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICBwYXJhbXMuZmxvd0NhbGxiYWNrcy5vblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MoZmxvd1Jlc3VsdC5yZXN1bHQucGF5bWVudF9tZXRob2RfaWQpO1xuICAgICAgfSBlbHNlIGlmIChmbG93UmVzdWx0Lm1vZGUgPT09IFwiY2hlY2tvdXRcIikge1xuICAgICAgICBwYXJhbXMuZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0U3VjY2VzcyhcbiAgICAgICAgICBmbG93UmVzdWx0LnJlc3VsdC5pbnZvaWNlX3VybHMsXG4gICAgICAgICAgZmxvd1Jlc3VsdC5yZXN1bHQuc3Vic2NyaXB0aW9uX2lkcyxcbiAgICAgICAgICBmbG93UmVzdWx0LnJlc3VsdC5jdXN0b21lcl9pZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgbW9kZTogJHtmbG93UmVzdWx0fWApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBwYXJhbXMuZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0RXJyb3IoZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG59O1xuY29uc3QgYWRkRXJyb3JDYXRjaGVyRm9ySW5pdCA9IChpbml0KSA9PiB7XG4gIHJldHVybiBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBpbml0KHBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHsgZXJyX18gfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiaW5pdC1lcnJvci1jYXRjaGVyXCIpO1xuICAgICAgZXJyX18oZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgaXNBdmFpbGFibGU6IGZhbHNlLCByZWFzb246IGdldEVycm9yTWVzc2FnZShlcnJvcikgfTtcbiAgICB9XG4gIH07XG59O1xuY29uc3QgY3JlYXRlT2pzRmxvd0xvZ2dlcnMgPSAocHJlZml4KSA9PiB7XG4gIGNvbnN0IGxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgd2luZG93W1wiY29uc29sZVwiXS5sb2coYCR7Y2hhbGsuZ3JlZW4uYm9sZChcIm9qcy9cIil9JHtjaGFsay5ib2xkLmdyYXkoYCR7cHJlZml4fWApfVx0YCwgLi4uYXJncyk7XG4gIH07XG4gIGNvbnN0IGVyciA9ICguLi5hcmdzKSA9PiB7XG4gICAgd2luZG93W1wiY29uc29sZVwiXS5lcnJvcihgJHtjaGFsay5yZWQuYm9sZChcIm9qcy9cIil9JHtjaGFsay5ib2xkLmdyYXkoYCR7cHJlZml4fWApfVx0YCwgLi4uYXJncyk7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbG9nLFxuICAgIGVycixcbiAgICBsb2dfXzogbG9nLFxuICAgIGVycl9fOiBlcnJcbiAgfTtcbn07XG5cbmNvbnN0IHsgbG9nX186IGxvZ19fJDUsIGVycl9fOiBlcnJfXyQ1IH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImNvbW1vblwiKTtcbmNvbnN0IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UgPSAocmVzcG9uc2UpID0+IHtcbiAgaWYgKHJlc3BvbnNlLnBheW1lbnRfbWV0aG9kcy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgb25lIHBheW1lbnQgbWV0aG9kLCBnb3QgJHtyZXNwb25zZS5wYXltZW50X21ldGhvZHMubGVuZ3RofWApO1xuICB9XG4gIHJldHVybiB7IHBheW1lbnRfbWV0aG9kX2lkOiByZXNwb25zZS5wYXltZW50X21ldGhvZHNbMF0uaWQgfTtcbn07XG5jb25zdCBmaW5kQ3BtTWF0Y2hpbmdUeXBlID0gKGFsbENQTXMsIHpvZE1vZGVsKSA9PiB7XG4gIGNvbnN0IGNwbSA9IGFsbENQTXMuZmluZCgoY3BtMikgPT4gem9kTW9kZWwuc2FmZVBhcnNlKGNwbTIpLnN1Y2Nlc3MpO1xuICBpZiAoIWNwbSkge1xuICAgIGVycl9fJDUoYE5vIENQTXMgZm91bmQgZm9yIG1vZGVsLiBBbGwgbW9kZWxzOmAsIGFsbENQTXMpO1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ1BNcyBmb3VuZCBmb3IgbW9kZWxgKTtcbiAgfVxuICByZXR1cm4gem9kTW9kZWwucGFyc2UoY3BtKTtcbn07XG5cbmNvbnN0IHsgbG9nX186IGxvZ19fJDQsIGVycl9fOiBlcnJfXyQ0IH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImNvbW1vbi1jY1wiKTtcbmNvbnN0IHZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDID0gKG5vbkNkZUZvcm1JbnB1dHMsIG9uVmFsaWRhdGlvbkVycm9yKSA9PiB7XG4gIGNvbnN0IHBheWxvYWQgPSBSZXF1aXJlZEZvcm1GaWVsZHMuc2FmZVBhcnNlKG5vbkNkZUZvcm1JbnB1dHMpO1xuICBpZiAoIXBheWxvYWQuc3VjY2Vzcykge1xuICAgIGNvbnN0IGZvcm1hdHRlZCA9IHBheWxvYWQuZXJyb3IuZm9ybWF0KCk7XG4gICAgY29uc3QgaXNzdWVzID0gZXh0cmFjdElzc3Vlc1BlckZpZWxkKGZvcm1hdHRlZCk7XG4gICAgZm9yIChjb25zdCBbZmllbGROYW1lLCBlcnJvcnNdIG9mIE9iamVjdC5lbnRyaWVzKGlzc3VlcykpIHtcbiAgICAgIG9uVmFsaWRhdGlvbkVycm9yKGZpZWxkTmFtZSwgZXJyb3JzLCBmaWVsZE5hbWUpO1xuICAgIH1cbiAgICBlcnJfXyQ0KGBHb3QgdmFsaWRhdGlvbiBlcnJvcnMgaW4gbm9uLUNERSBmb3JtIGZpZWxkc2AsIGlzc3Vlcyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiR290IHZhbGlkYXRpb24gZXJyb3JzIGluIG5vbi1DREUgZm9ybSBmaWVsZHNcIik7XG4gIH1cbiAgcmV0dXJuIHBheWxvYWQuZGF0YTtcbn07XG5jb25zdCB2YWxpZGF0ZVRva2VuaXplQ2FyZFJlc3VsdHMgPSAodG9rZW5pemVSZXN1bHRzLCBvblZhbGlkYXRpb25FcnJvcikgPT4ge1xuICBmb3IgKGNvbnN0IHRva2VuaXplUmVzdWx0IG9mIHRva2VuaXplUmVzdWx0cykge1xuICAgIGlmICh0b2tlbml6ZVJlc3VsdC5zdWNjZXNzID09PSBmYWxzZSkge1xuICAgICAgdG9rZW5pemVSZXN1bHQuZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEFsbEZpZWxkTmFtZXMuc2FmZVBhcnNlKGVycm9yLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgICAgIGVycl9fJDQoYFVua25vd24gZmllbGQgbmFtZSBpbiBvblZhbGlkYXRpb25FcnJvcjogJHtlcnJvci5lbGVtZW50VHlwZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBwYXJzZWQuZGF0YTtcbiAgICAgICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9yLmVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbG9nX18kNChgRXJyb3IgdG9rZW5pemluZyBjYXJkOiBnb3QgdmFsaWRhdGlvbiBlcnJvcnM6ICR7SlNPTi5zdHJpbmdpZnkodG9rZW5pemVSZXN1bHQuZXJyb3JzKX1gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkdvdCB2YWxpZGF0aW9uIGVycm9ycyB3aGlsZSB0b2tlbml6aW5nIGNhcmRcIik7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBPSlNfU1RSSVBFX0xJTktfQlROX0lEID0gXCJvanMtc3RyaXBlLWxpbmstYnRuXCI7XG5jb25zdCB7IGxvZ19fOiBsb2dfXyQzLCBlcnJfXzogZXJyX18kMyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJzdHJpcGUtbGlua1wiKTtcbmNvbnN0IFN0cmlwZUxpbmtDcG0gPSB6Lm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6LmxpdGVyYWwoXCJzdHJpcGVfbGlua1wiKSxcbiAgcHJvY2Vzc29yX25hbWU6IHoubGl0ZXJhbChcInN0cmlwZVwiKSxcbiAgbWV0YWRhdGE6IHoub2JqZWN0KHtcbiAgICBzdHJpcGVfcGs6IHouc3RyaW5nKClcbiAgfSlcbn0pO1xuY29uc3QgU3RyaXBlTGlua1JlcXVpcmVkVXNlckFjdGlvbnMgPSB6LmFycmF5KFxuICB6Lm9iamVjdCh7XG4gICAgb3VyX2V4aXN0aW5nX3BtX2lkOiB6LnN0cmluZygpXG4gIH0pXG4pLmxlbmd0aCgxKTtcbmNvbnN0IGluaXRTdHJpcGVMaW5rRmxvdyA9IGFkZEVycm9yQ2F0Y2hlckZvckluaXQoXG4gIGFzeW5jICh7IGNvbnRleHQsIGZsb3dDYWxsYmFja3MgfSkgPT4ge1xuICAgIGxvZ19fJDMoYENoZWNraW5nIGlmIHRoZXJlIGFyZSBhbnkgQ1BNcyBmb3IgU3RyaXBlIFBSLi4uYCk7XG4gICAgY29uc3Qgc3RyaXBlTGlua0NwbSA9IGZpbmRDcG1NYXRjaGluZ1R5cGUoY29udGV4dC5jaGVja291dFBheW1lbnRNZXRob2RzLCBTdHJpcGVMaW5rQ3BtKTtcbiAgICBsb2dfXyQzKGBTdGFydGluZyBzdHJpcGUgbGluayBmbG93Li4uYCk7XG4gICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoYW55Q2RlQ29ubmVjdGlvbik7XG4gICAgY29uc3QgaXNTZXR1cE1vZGUgPSBwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIjtcbiAgICBsb2dfXyQzKGBDcmVhdGluZyBzdHJpcGUgZWxlbWVudHMuLi5gKTtcbiAgICBjb25zdCBpbml0aWFsUHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0UHJldmlld0Ftb3VudChhbnlDZGVDb25uZWN0aW9uLCBwcmVmaWxsLnRva2VuLCBpc1NldHVwTW9kZSwgdm9pZCAwKTtcbiAgICBjb25zdCB7IGVsZW1lbnRzLCBzdHJpcGUgfSA9IGF3YWl0IGNyZWF0ZVN0cmlwZUVsZW1lbnRzKHN0cmlwZUxpbmtDcG0ubWV0YWRhdGEuc3RyaXBlX3BrLCB7XG4gICAgICBtb2RlOiBcInNldHVwXCIsXG4gICAgICBjdXJyZW5jeTogaW5pdGlhbFByZXZpZXcuY3VycmVuY3ksXG4gICAgICBzZXR1cF9mdXR1cmVfdXNhZ2U6IFwib2ZmX3Nlc3Npb25cIixcbiAgICAgIHBheW1lbnRNZXRob2RDcmVhdGlvbjogXCJtYW51YWxcIlxuICAgIH0pO1xuICAgIGxvZ19fJDMoYE1vdW50aW5nIHBheW1lbnQgZWxlbWVudC4uLmApO1xuICAgIGNvbnN0IGV4cHJlc3NDaGVja291dEVsZW1lbnQgPSBlbGVtZW50cy5jcmVhdGUoXCJleHByZXNzQ2hlY2tvdXRcIiwge1xuICAgICAgYnV0dG9uSGVpZ2h0OiBjb250ZXh0LmN1c3RvbUluaXRQYXJhbXMuc3RyaXBlTGluaz8uYnV0dG9uSGVpZ2h0LFxuICAgICAgcGF5bWVudE1ldGhvZHM6IHtcbiAgICAgICAgYW1hem9uUGF5OiBcIm5ldmVyXCIsXG4gICAgICAgIGFwcGxlUGF5OiBcIm5ldmVyXCIsXG4gICAgICAgIGdvb2dsZVBheTogXCJuZXZlclwiLFxuICAgICAgICBwYXlwYWw6IFwibmV2ZXJcIlxuICAgICAgfVxuICAgIH0pO1xuICAgIGV4cHJlc3NDaGVja291dEVsZW1lbnQubW91bnQoYCMke09KU19TVFJJUEVfTElOS19CVE5fSUR9YCk7XG4gICAgZXhwcmVzc0NoZWNrb3V0RWxlbWVudC5vbihcImNsaWNrXCIsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgbG9nX18kMyhcIlN0cmlwZSBMaW5rIGJ1dHRvbiBjbGlja2VkXCIpO1xuICAgICAgaWYgKGNvbnRleHQuY3VzdG9tSW5pdFBhcmFtcy5zdHJpcGVMaW5rPy5vdmVycmlkZUxpbmtTdWJtaXQpIHtcbiAgICAgICAgY29uc3Qgc2hvdWxkU3VibWl0ID0gYXdhaXQgY29udGV4dC5jdXN0b21Jbml0UGFyYW1zLnN0cmlwZUxpbmsub3ZlcnJpZGVMaW5rU3VibWl0KCk7XG4gICAgICAgIGlmICghc2hvdWxkU3VibWl0KSB7XG4gICAgICAgICAgbG9nX18kMyhcIlN0cmlwZSBMaW5rIHN1Ym1pdCBhYm9ydGVkIGJ5IG92ZXJyaWRlTGlua1N1Ym1pdFwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGV2ZW50LnJlc29sdmUoKTtcbiAgICB9KTtcbiAgICBleHByZXNzQ2hlY2tvdXRFbGVtZW50Lm9uKFwiY29uZmlybVwiLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgIGxvZ19fJDMoXCJTdHJpcGUgTGluayB3aW5kb3cgY29uZmlybWVkXCIsIGV2ZW50KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmlwZS5jcmVhdGVQYXltZW50TWV0aG9kKHtcbiAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGJpbGxpbmdfZGV0YWlsczogZXZlbnQuYmlsbGluZ0RldGFpbHNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgIGVycl9fJDMoXCJlcnJvclwiLCByZXN1bHQuZXJyb3IpO1xuICAgICAgICBmbG93Q2FsbGJhY2tzLm9uQ2hlY2tvdXRFcnJvcihyZXN1bHQuZXJyb3IubWVzc2FnZSA/PyBcIlN0cmlwZSBMaW5rIHVua25vd24gZXJyb3JcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dfXyQzKFwicGF5bWVudE1ldGhvZFwiLCByZXN1bHQucGF5bWVudE1ldGhvZCk7XG4gICAgICAgIE9qc0Zsb3dzLnN0cmlwZUxpbmsucnVuKHtcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogc3RyaXBlTGlua0NwbSxcbiAgICAgICAgICBub25DZGVGb3JtSW5wdXRzOiBjcmVhdGVJbnB1dHNEaWN0RnJvbUZvcm0oY29udGV4dC5mb3JtRGl2KSxcbiAgICAgICAgICBmbG93Q2FsbGJhY2tzLFxuICAgICAgICAgIGN1c3RvbVBhcmFtczogeyBzdHJpcGVQTTogcmVzdWx0LnBheW1lbnRNZXRob2QgfSxcbiAgICAgICAgICBpbml0UmVzdWx0OiB7IGlzQXZhaWxhYmxlOiB0cnVlIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgaXNBdmFpbGFibGU6IHRydWUgfTtcbiAgfVxuKTtcbmNvbnN0IHJ1blN0cmlwZUxpbmtGbG93ID0gYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMoXG4gIGFzeW5jICh7XG4gICAgY29udGV4dCxcbiAgICBjaGVja291dFBheW1lbnRNZXRob2QsXG4gICAgbm9uQ2RlRm9ybUlucHV0cyxcbiAgICBmbG93Q2FsbGJhY2tzLFxuICAgIGN1c3RvbVBhcmFtc1xuICB9KSA9PiB7XG4gICAgbG9nX18kMyhgUnVubmluZyBTdHJpcGUgUFIgZmxvdy4uLmApO1xuICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgIGxvZ19fJDMoYE1lcmdpbmcgUE0gZmllbGRzIHdpdGggZm9ybSBmaWVsZHMuLi5gKTtcbiAgICBjb25zdCBtZXJnZWRJbnB1dHMgPSBmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBNKG5vbkNkZUZvcm1JbnB1dHMsIGN1c3RvbVBhcmFtcy5zdHJpcGVQTSk7XG4gICAgY29uc3Qgbm9uQ2RlRm9ybUZpZWxkcyA9IHZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDKG1lcmdlZElucHV0cywgZmxvd0NhbGxiYWNrcy5vblZhbGlkYXRpb25FcnJvcik7XG4gICAgbG9nX18kMyhgU3RhcnRpbmcgcGF5bWVudCBmbG93Li4uYCk7XG4gICAgY29uc3Qgc3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlID0gYXdhaXQgc3RhcnRQYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICBwYXltZW50X3Byb3ZpZGVyOiBjaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXIsXG4gICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgICAgdGhlaXJfZXhpc3RpbmdfcG1faWQ6IGN1c3RvbVBhcmFtcy5zdHJpcGVQTS5pZFxuICAgIH0pO1xuICAgIGxvZ19fJDMoXCJTdGFydCBwYXltZW50IGZsb3cgcmVzcG9uc2VcIiwgc3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlKTtcbiAgICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBTdHJpcGVMaW5rUmVxdWlyZWRVc2VyQWN0aW9ucy5wYXJzZShzdGFydFBheW1lbnRGbG93UmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zKTtcbiAgICBjb25zdCBvdXJFeGlzdGluZ1BtSWQgPSBuZXh0QWN0aW9uTWV0YWRhdGFbMF0ub3VyX2V4aXN0aW5nX3BtX2lkO1xuICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgbG9nX18kMyhgRG9pbmcgcGF5bWVudCBzZXR1cC4uLmApO1xuICAgICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IGNvbmZpcm1QYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgZXhpc3RpbmdfY2NfcG1faWQ6IG91ckV4aXN0aW5nUG1JZFxuICAgICAgfSk7XG4gICAgICBjb25zdCBjcmVhdGVkUGF5bWVudE1ldGhvZCA9IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UoY29uZmlybVJlc3VsdCk7XG4gICAgICByZXR1cm4geyBtb2RlOiBcInNldHVwXCIsIHJlc3VsdDogY3JlYXRlZFBheW1lbnRNZXRob2QgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nX18kMyhgRG9pbmcgY2hlY2tvdXQuLi5gKTtcbiAgICAgIGNvbnN0IGNoZWNrb3V0UmVxdWVzdCA9IHtcbiAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuLFxuICAgICAgICBwYXltZW50X2lucHV0OiB7XG4gICAgICAgICAgcHJvdmlkZXJfdHlwZTogY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyXG4gICAgICAgIH0sXG4gICAgICAgIGN1c3RvbWVyX2VtYWlsOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5FTUFJTF0sXG4gICAgICAgIGN1c3RvbWVyX3ppcF9jb2RlOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0sXG4gICAgICAgIGN1c3RvbWVyX2NvdW50cnk6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLkNPVU5UUlldLFxuICAgICAgICBwcm9tb3Rpb25fY29kZTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuUFJPTU9USU9OX0NPREVdLFxuICAgICAgICBsaW5lX2l0ZW1zOiBwcmVmaWxsLmxpbmVfaXRlbXMsXG4gICAgICAgIHRvdGFsX2Ftb3VudF9hdG9tOiBwcmVmaWxsLmFtb3VudF90b3RhbF9hdG9tLFxuICAgICAgICBjYW5jZWxfYXRfZW5kOiBmYWxzZSxcbiAgICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IGNoZWNrb3V0UGF5bWVudE1ldGhvZFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBlcmZvcm1DaGVja291dChhbnlDZGVDb25uZWN0aW9uLCBjaGVja291dFJlcXVlc3QpO1xuICAgICAgcmV0dXJuIHsgbW9kZTogXCJjaGVja291dFwiLCByZXN1bHQgfTtcbiAgICB9XG4gIH1cbik7XG5jb25zdCBmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBNID0gKGZvcm1JbnB1dHMsIHN0cmlwZVBtKSA9PiB7XG4gIGNvbnN0IGlucHV0cyA9IHsgLi4uZm9ybUlucHV0cyB9O1xuICBjb25zdCBbcGF5ZXJGaXJzdE5hbWUsIC4uLnBheWVyTGFzdE5hbWVQYXJ0c10gPSBzdHJpcGVQbS5iaWxsaW5nX2RldGFpbHMubmFtZT8udHJpbSgpPy5zcGxpdCgvXFxzKy8pID8/IFtdO1xuICBjb25zdCBwYXllckxhc3ROYW1lID0gcGF5ZXJMYXN0TmFtZVBhcnRzLmpvaW4oXCIgXCIpIHx8IHZvaWQgMDtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5GSVJTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuRklSU1RfTkFNRV0gfHwgcGF5ZXJGaXJzdE5hbWUgfHwgXCJfT1BfVU5LTk9XTlwiO1xuICBpbnB1dHNbRmllbGROYW1lLkxBU1RfTkFNRV0gPSBpbnB1dHNbRmllbGROYW1lLkxBU1RfTkFNRV0gfHwgcGF5ZXJMYXN0TmFtZSB8fCBcIl9PUF9VTktOT1dOXCI7XG4gIGlucHV0c1tGaWVsZE5hbWUuRU1BSUxdID0gaW5wdXRzW0ZpZWxkTmFtZS5FTUFJTF0gfHwgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgc3RyaXBlUG1bXCJsaW5rXCJdPy5lbWFpbCB8fCBzdHJpcGVQbS5iaWxsaW5nX2RldGFpbHMuZW1haWwgfHwgXCJvcF91bmZpbGxlZEBnZXRvcGVucGF5LmNvbVwiO1xuICBpbnB1dHNbRmllbGROYW1lLlpJUF9DT0RFXSA9IGlucHV0c1tGaWVsZE5hbWUuWklQX0NPREVdIHx8IHN0cmlwZVBtLmJpbGxpbmdfZGV0YWlscy5hZGRyZXNzPy5wb3N0YWxfY29kZSB8fCBcIjAwMDAwXCI7XG4gIGlucHV0c1tGaWVsZE5hbWUuQ09VTlRSWV0gPSBpbnB1dHNbRmllbGROYW1lLkNPVU5UUlldIHx8IHN0cmlwZVBtLmJpbGxpbmdfZGV0YWlscy5hZGRyZXNzPy5jb3VudHJ5IHx8IFwiVVNcIjtcbiAgbG9nX18kMyhgRmluYWwgZm9ybSBpbnB1dHM6YCwgaW5wdXRzKTtcbiAgcmV0dXJuIGlucHV0cztcbn07XG5cbmNvbnN0IHN0eWxlcyA9IFwiQGtleWZyYW1lcyBmYWRlSW57MCV7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSguOSl9dG97b3BhY2l0eToxO3RyYW5zZm9ybTpzY2FsZSgxKX19Lm92ZXJsYXl7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ei1pbmRleDoyMTQ3NDgzNjQ4IWltcG9ydGFudDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwODB9LmNvbnRhaW5lcnttYXgtd2lkdGg6NTAwcHg7bWF4LWhlaWdodDo2MDBweDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQtY29sb3I6I2ZmZjtwb3NpdGlvbjpyZWxhdGl2ZTthbmltYXRpb246ZmFkZUluIC4zcyBlYXNlLW91dH0uZnJhbWV7bWF4LXdpZHRoOjUwMHB4O21heC1oZWlnaHQ6NjAwcHg7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3JkZXI6bm9uZX0uY2FuY2VsLWJ1dHRvbntwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxcmVtO2NvbG9yOiNmZmY7Y3Vyc29yOnBvaW50ZXI7dG9wOi0xLjVyZW07cGFkZGluZzowO3JpZ2h0OjB9XCI7XG5cbmNvbnN0IGNyZWF0ZUFuZE9wZW5GcmFtZSA9ICh1cmwpID0+IHtcbiAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gIHRlbXBsYXRlLmlubmVySFRNTCA9IGBcbiAgICA8c3R5bGU+XG4gICAgICAke3N0eWxlc31cbiAgICA8L3N0eWxlPlxuICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjYW5jZWwtYnV0dG9uXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxpZnJhbWUgc3JjPVwiJHt1cmx9XCIgY2xhc3M9XCJmcmFtZVwiIGlkPVwidGhyZWUtZHMtaWZyYW1lXCIgdGl0bGU9XCIzRCBTZWN1cmUgdmVyaWZpY2F0aW9uXCIgYWxsb3c9XCJwYXltZW50XCI+PC9pZnJhbWU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYDtcbiAgY29uc3QgaG9zdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnN0IHNoYWRvd1Jvb3QgPSBob3N0LmF0dGFjaFNoYWRvdyh7IG1vZGU6IFwib3BlblwiIH0pO1xuICBzaGFkb3dSb290LmFwcGVuZENoaWxkKHRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpKTtcbiAgY29uc3QgaWZyYW1lID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFwiI3RocmVlLWRzLWlmcmFtZVwiKTtcbiAgY29uc3QgY2FuY2VsQnV0dG9uID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFwiLmNhbmNlbC1idXR0b25cIik7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaG9zdCk7XG4gIHJldHVybiB7IGhvc3QsIGlmcmFtZSwgY2FuY2VsQnV0dG9uIH07XG59O1xuXG5mdW5jdGlvbiBzdGFydFBvbGxpbmcoaWZyYW1lLCBvblN1Y2Nlc3MsIGNoaWxkT3JpZ2luKSB7XG4gIGNvbnN0IGhhbmRsZVBvbGxpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUubG9nKFwi8J+UhCBQb2xsaW5nIENERSBjb25uZWN0aW9uLi4uXCIpO1xuICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgcGluZ0NkZUZvcjNkc1N0YXR1cyhpZnJhbWUsIGNoaWxkT3JpZ2luKTtcbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLwn5+iIENERSBjb25uZWN0aW9uIHN1Y2Nlc3NmdWwhIFN0b3BwaW5nIHBvbGxpbmcuLi5cIik7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi4p6h77iPIEdvdCBzdGF0dXM6XCIsIHN0YXR1cyk7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwocG9sbGluZ0ludGVydmFsKTtcbiAgICAgICAgb25TdWNjZXNzKHN0YXR1cyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB9XG4gIH07XG4gIGhhbmRsZVBvbGxpbmcoKTtcbiAgY29uc3QgcG9sbGluZ0ludGVydmFsID0gc2V0SW50ZXJ2YWwoaGFuZGxlUG9sbGluZywgQ0RFX1BPTExJTkdfSU5URVJWQUwpO1xuICByZXR1cm4gcG9sbGluZ0ludGVydmFsO1xufVxuZnVuY3Rpb24gaGFuZGxlRXZlbnRzKHtcbiAgZWxlbWVudHMsXG4gIHBvbGxpbmdJbnRlcnZhbCxcbiAgcmVzb2x2ZVxufSkge1xuICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKSA9PiB7XG4gICAgY2xlYXJJbnRlcnZhbChwb2xsaW5nSW50ZXJ2YWwpO1xuICAgIGVsZW1lbnRzLmhvc3QucmVtb3ZlKCk7XG4gICAgcmVzb2x2ZShUaHJlZURTU3RhdHVzLkNBTkNFTExFRCk7XG4gIH07XG4gIGVsZW1lbnRzLmNhbmNlbEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2FuY2VsKTtcbiAgY29uc3QgY2xlYW51cEV2ZW50TGlzdGVuZXJzID0gKCkgPT4ge1xuICAgIGVsZW1lbnRzLmNhbmNlbEJ1dHRvbi5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2FuY2VsKTtcbiAgfTtcbiAgcmV0dXJuIGNsZWFudXBFdmVudExpc3RlbmVycztcbn1cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0M2RzVmVyaWZpY2F0aW9uKHtcbiAgdXJsLFxuICBiYXNlVXJsXG59KSB7XG4gIGNvbnN0IGVsZW1lbnRzID0gY3JlYXRlQW5kT3BlbkZyYW1lKHVybCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChzdGF0dXMpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBlbGVtZW50cy5ob3N0LnJlbW92ZSgpO1xuICAgICAgfSwgMWUzKTtcbiAgICAgIHJlc29sdmUoc3RhdHVzKTtcbiAgICAgIGNsZWFudXBFdmVudExpc3RlbmVycz8uKCk7XG4gICAgfTtcbiAgICBjb25zdCBwb2xsaW5nSW50ZXJ2YWwgPSBzdGFydFBvbGxpbmcoZWxlbWVudHMuaWZyYW1lLCBvblN1Y2Nlc3MsIG5ldyBVUkwoYmFzZVVybCkub3JpZ2luKTtcbiAgICBjb25zdCBjbGVhbnVwRXZlbnRMaXN0ZW5lcnMgPSBoYW5kbGVFdmVudHMoe1xuICAgICAgZWxlbWVudHMsXG4gICAgICBwb2xsaW5nSW50ZXJ2YWwsXG4gICAgICByZXNvbHZlXG4gICAgfSk7XG4gIH0pO1xufVxuXG5jb25zdCB7IGxvZ19fOiBsb2dfXyQyLCBlcnJfXzogZXJyX18kMiB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJjb21tb24tY2NcIik7XG5jb25zdCB7IGxvZ19fOiBzdHJpcGVMb2dfXyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJzdHJpcGUtY2NcIik7XG5jb25zdCBydW5Db21tb25DY0Zsb3cgPSBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyhcbiAgYXN5bmMgKHsgY29udGV4dCwgY2hlY2tvdXRQYXltZW50TWV0aG9kLCBub25DZGVGb3JtSW5wdXRzLCBmbG93Q2FsbGJhY2tzIH0pID0+IHtcbiAgICBsb2dfXyQyKGDilJwgUnVubmluZyBjb21tb24gQ0MgZmxvdy4uLmAsIHsgY2hlY2tvdXRQYXltZW50TWV0aG9kIH0pO1xuICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgIGxvZ19fJDIoYOKUnCBWYWxpZGF0aW5nIG5vbi1DREUgZm9ybSBmaWVsZHMgW01vZGU6ICR7cHJlZmlsbC5tb2RlfV1gKTtcbiAgICBjb25zdCBub25DZGVGb3JtRmllbGRzID0gdmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0Mobm9uQ2RlRm9ybUlucHV0cywgZmxvd0NhbGxiYWNrcy5vblZhbGlkYXRpb25FcnJvcik7XG4gICAgbG9nX18kMihg4pScIFRva2VuaXppbmcgY2FyZCBpbmZvIGluIENERSBbU2Vzc2lvbjogJHtjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkfV1gKTtcbiAgICBjb25zdCB0b2tlbml6ZUNhcmRSZXN1bHRzID0gYXdhaXQgdG9rZW5pemVDYXJkT25BbGxDb25uZWN0aW9ucyhjb250ZXh0LmNkZUNvbm5lY3Rpb25zLCB7XG4gICAgICBzZXNzaW9uX2lkOiBjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkXG4gICAgfSk7XG4gICAgdmFsaWRhdGVUb2tlbml6ZUNhcmRSZXN1bHRzKHRva2VuaXplQ2FyZFJlc3VsdHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgIGNvbnN0IGNvbW1vbkNoZWNrb3V0UGFyYW1zID0ge1xuICAgICAgc2Vzc2lvbl9pZDogY29udGV4dC5lbGVtZW50c1Nlc3Npb25JZCxcbiAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2QsXG4gICAgICBub25fY2RlX2Zvcm1fZmllbGRzOiBub25DZGVGb3JtRmllbGRzXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgaWYgKHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgIGxvZ19fJDIoYOKUnCBTZXR0aW5nIHVwIHBheW1lbnQgbWV0aG9kIGluIENERSBbVG9rZW46ICR7cHJlZmlsbC50b2tlbn1dYCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNldHVwQ2hlY2tvdXQoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICBsb2dfXyQyKGDilbAgU2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBbUE0gSUQ6ICR7cmVzdWx0LnBheW1lbnRfbWV0aG9kX2lkfV1gKTtcbiAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ19fJDIoYOKUnCBJbml0aWFsIGNoZWNrb3V0IGZsb3cuIENoZWNraW5nIG91dCBjYXJkIGluZm8gaW4gQ0RFIFtTZXNzaW9uOiAke2NvbnRleHQuZWxlbWVudHNTZXNzaW9uSWR9XWApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja291dENhcmRFbGVtZW50cyhhbnlDZGVDb25uZWN0aW9uLCBjb21tb25DaGVja291dFBhcmFtcyk7XG4gICAgICAgIGxvZ19fJDIoYOKVsCBDaGVja291dCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LmApO1xuICAgICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDZGVFcnJvcikge1xuICAgICAgICBpZiAoZXJyb3Iub3JpZ2luYWxFcnJvck1lc3NhZ2UgPT09IFwiM0RTX1JFUVVJUkVEXCIpIHtcbiAgICAgICAgICBsb2dfXyQyKGDilJwgQ2FyZCByZXF1aXJlcyAzRFMsIHN0YXJ0aW5nIG5vbi1sZWdhY3kgcGF5bWVudCBmbG93YCk7XG4gICAgICAgICAgbG9nX18kMihcImVycm9yLnJlc3BvbnNlLmhlYWRlcnNcIiwgZXJyb3IucmVzcG9uc2UuaGVhZGVycyk7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkVXNlTmV3RmxvdyA9IGVycm9yLnJlc3BvbnNlLmhlYWRlcnM/LltcIm9wLXNob3VsZC11c2UtbmV3LWZsb3dcIl0gPT09IFwidHJ1ZVwiO1xuICAgICAgICAgIGNvbnN0IHN0YXJ0UGZSZXN1bHQgPSBhd2FpdCBzdGFydFBheW1lbnRGbG93Rm9yQ0MoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICAgIGxvZ19fJDIoYOKUnCBvcC1zaG91bGQtdXNlLW5ldy1mbG93OiAke3Nob3VsZFVzZU5ld0Zsb3d9YCk7XG4gICAgICAgICAgbG9nX18kMihg4pScIFBheW1lbnQgZmxvdyByZXN1bHQ6YCwgc3RhcnRQZlJlc3VsdCk7XG4gICAgICAgICAgaWYgKHNob3VsZFVzZU5ld0Zsb3cpIHtcbiAgICAgICAgICAgIGF3YWl0IGNvbW1vbkNDM0RTRmxvdyhzdGFydFBmUmVzdWx0LCBjb250ZXh0LmJhc2VVcmwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBzdHJpcGVDQzNEU0Zsb3coc3RhcnRQZlJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICAgICAgbG9nX18kMihg4pScIENvbmZpcm1pbmcgcGF5bWVudCBmbG93IFtjY19wbV9pZDogJHtzdGFydFBmUmVzdWx0LmNjX3BtX2lkfV1gKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBjb25maXJtUGF5bWVudEZsb3coYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW4sXG4gICAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBzdGFydFBmUmVzdWx0LmNjX3BtX2lkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBDb25maXJtIHBheW1lbnQgZmxvdyByZXN1bHQgcmVjZWl2ZWQgUmVzdWx0OmAsIGNvbmZpcm1SZXN1bHQpO1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlZFBheW1lbnRNZXRob2QgPSBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKGNvbmZpcm1SZXN1bHQpO1xuICAgICAgICAgICAgbG9nX18kMihg4pWwIFNldHVwIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgW1BNIElEOiAke2NyZWF0ZWRQYXltZW50TWV0aG9kLnBheW1lbnRfbWV0aG9kX2lkfV1gKTtcbiAgICAgICAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiBjcmVhdGVkUGF5bWVudE1ldGhvZCB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dfXyQyKGDilJwgQ2hlY2tpbmcgb3V0IGFmdGVyIDNEUyBmbG93IFtGbG93OiAke3Nob3VsZFVzZU5ld0Zsb3cgPyBcIm5ld1wiIDogXCJsZWdhY3lcIn1dYCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja291dENhcmRFbGVtZW50cyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgICAgICAgIC4uLmNvbW1vbkNoZWNrb3V0UGFyYW1zLFxuICAgICAgICAgICAgICBleGlzdGluZ19jY19wbV9pZDogc3RhcnRQZlJlc3VsdC5jY19wbV9pZCxcbiAgICAgICAgICAgICAgZG9fbm90X3VzZV9sZWdhY3lfY2NfZmxvdzogIXNob3VsZFVzZU5ld0Zsb3dcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9nX18kMihg4pWwIENoZWNrb3V0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuYCk7XG4gICAgICAgICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZXJyX18kMihg4pWwIEVycm9yIGNoZWNraW5nIG91dCBjYXJkIGluZm8gaW4gQ0RFYCk7XG4gICAgICBlcnJfXyQyKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuKTtcbmNvbnN0IHBhcnNlU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gKHJlc3BvbnNlKSA9PiB7XG4gIGNvbnN0IHN0cmlwZUFjdGlvbiA9IHJlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5maW5kKChhY3Rpb24pID0+IGFjdGlvbi50eXBlID09PSBcInN0cmlwZV8zZHNcIik7XG4gIGlmICghc3RyaXBlQWN0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc3RyaXBlIDNEUyBhY3Rpb24gZm91bmRcIik7XG4gIH1cbiAgcmV0dXJuIFN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShzdHJpcGVBY3Rpb24pO1xufTtcbmNvbnN0IHBhcnNlQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gKHJlc3BvbnNlKSA9PiB7XG4gIGNvbnN0IGNvbW1vbkFjdGlvbiA9IHJlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5maW5kKChhY3Rpb24pID0+IGFjdGlvbi50eXBlID09PSBcImFpcndhbGxleF9wYXltZW50X2NvbnNlbnRcIik7XG4gIGlmICghY29tbW9uQWN0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29tbW9uIDNEUyBhY3Rpb24gZm91bmRcIik7XG4gIH1cbiAgcmV0dXJuIENvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShjb21tb25BY3Rpb24pO1xufTtcbmNvbnN0IGNvbW1vbkNDM0RTRmxvdyA9IGFzeW5jIChzdGFydFBmUmVzdWx0LCBiYXNlVXJsKSA9PiB7XG4gIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBhcnNlQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhKHN0YXJ0UGZSZXN1bHQpO1xuICBsb2dfXyQyKGDilJwgVXNpbmcgY29tbW9uIDNEUyBmbG93IFtVUkw6ICR7bmV4dEFjdGlvbk1ldGFkYXRhLnJlZGlyZWN0X3VybH1dYCk7XG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHN0YXJ0M2RzVmVyaWZpY2F0aW9uKHsgdXJsOiBuZXh0QWN0aW9uTWV0YWRhdGEucmVkaXJlY3RfdXJsLCBiYXNlVXJsIH0pO1xuICBsb2dfXyQyKGDilbAgM0RTIHZlcmlmaWNhdGlvbiBjb21wbGV0ZWQgW1N0YXR1czogJHtzdGF0dXN9XWApO1xuICBpZiAoc3RhdHVzID09PSBUaHJlZURTU3RhdHVzLkNBTkNFTExFRCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIjNEUyB2ZXJpZmljYXRpb24gY2FuY2VsbGVkXCIpO1xuICB9XG4gIGlmIChzdGF0dXMgPT09IFRocmVlRFNTdGF0dXMuRkFJTFVSRSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIjNEUyB2ZXJpZmljYXRpb24gZmFpbGVkXCIpO1xuICB9XG59O1xuY29uc3Qgc3RyaXBlQ0MzRFNGbG93ID0gYXN5bmMgKHN0YXJ0UGZSZXN1bHQpID0+IHtcbiAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gcGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEoc3RhcnRQZlJlc3VsdCk7XG4gIHN0cmlwZUxvZ19fKGDilJwgVXNpbmcgc3RyaXBlIDNEUyBmbG93IFtDbGllbnQgU2VjcmV0OiAke25leHRBY3Rpb25NZXRhZGF0YS5jbGllbnRfc2VjcmV0LnN1YnN0cmluZygwLCA4KX0uLi5dYCk7XG4gIGF3YWl0IGxhdW5jaFN0cmlwZTNEU0RpYWxvZ0Zsb3cobmV4dEFjdGlvbk1ldGFkYXRhKTtcbiAgc3RyaXBlTG9nX18oXCLilbAgU3RyaXBlIDNEUyBmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcIik7XG59O1xuXG5jb25zdCB7IGxvZ19fOiBsb2dfXyQxLCBlcnJfXzogZXJyX18kMSB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJzdHJpcGUtcHJcIik7XG5jb25zdCBTdHJpcGVQckNwbSA9IHoub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHoudW5pb24oW3oubGl0ZXJhbChcImFwcGxlX3BheVwiKSwgei5saXRlcmFsKFwiZ29vZ2xlX3BheVwiKV0pLFxuICBwcm9jZXNzb3JfbmFtZTogei5saXRlcmFsKFwic3RyaXBlXCIpLFxuICBtZXRhZGF0YTogei5vYmplY3Qoe1xuICAgIHN0cmlwZV9wazogei5zdHJpbmcoKVxuICB9KVxufSk7XG5jb25zdCBpbml0U3RyaXBlUHJGbG93ID0gYWRkRXJyb3JDYXRjaGVyRm9ySW5pdChcbiAgYXN5bmMgKHsgY29udGV4dCB9KSA9PiB7XG4gICAgbG9nX18kMShgQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIGFueSBDUE1zIGZvciBTdHJpcGUgUFIuLi5gKTtcbiAgICBjb25zdCBjaGVja291dFBheW1lbnRNZXRob2QgPSBmaW5kQ3BtTWF0Y2hpbmdUeXBlKGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgU3RyaXBlUHJDcG0pO1xuICAgIGxvZ19fJDEoYEluaXRpYWxpemluZyBTdHJpcGUgUFIgZmxvdy4uLmApO1xuICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgIGNvbnN0IGlzU2V0dXBNb2RlID0gcHJlZmlsbC5tb2RlID09PSBcInNldHVwXCI7XG4gICAgbG9nX18kMShgR2V0dGluZyBpbml0aWFsIHByZXZpZXcgYW1vdW50YCk7XG4gICAgY29uc3QgaW5pdGlhbFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFByZXZpZXdBbW91bnQoYW55Q2RlQ29ubmVjdGlvbiwgcHJlZmlsbC50b2tlbiwgaXNTZXR1cE1vZGUsIHZvaWQgMCk7XG4gICAgY29uc3QgcHIgPSBhd2FpdCBjcmVhdGVTdHJpcGVQYXltZW50UmVxdWVzdChcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZC5tZXRhZGF0YS5zdHJpcGVfcGssXG4gICAgICBpbml0aWFsUHJldmlldy5hbW91bnRBdG9tLFxuICAgICAgaW5pdGlhbFByZXZpZXcuY3VycmVuY3ksXG4gICAgICBpc1NldHVwTW9kZVxuICAgICk7XG4gICAgbG9nX18kMShgQ2hlY2tpbmcgaWYgY2FuIG1ha2UgcGF5bWVudGApO1xuICAgIGNvbnN0IGNhbk1ha2VQYXltZW50ID0gYXdhaXQgcHIuY2FuTWFrZVBheW1lbnQoKTtcbiAgICBpZiAoY2FuTWFrZVBheW1lbnQgPT09IG51bGwpIHtcbiAgICAgIGVycl9fJDEoYGNhbk1ha2VQYXltZW50IHJldHVybmVkIG51bGxgKTtcbiAgICAgIHJldHVybiB7IGlzQXZhaWxhYmxlOiBmYWxzZSwgcmVhc29uOiBcImNhbk1ha2VQYXltZW50IHJldHVybmVkIG51bGxcIiB9O1xuICAgIH1cbiAgICBsb2dfXyQxKGBTdHJpcGUgUFIgZmxvdyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuIENhbiBtYWtlIHBheW1lbnRgLCBjYW5NYWtlUGF5bWVudCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQXZhaWxhYmxlOiB0cnVlLFxuICAgICAgcHIsXG4gICAgICBhdmFpbGFibGVQcm92aWRlcnM6IHtcbiAgICAgICAgYXBwbGVQYXk6IGNhbk1ha2VQYXltZW50LmFwcGxlUGF5LFxuICAgICAgICBnb29nbGVQYXk6IGNhbk1ha2VQYXltZW50Lmdvb2dsZVBheVxuICAgICAgfVxuICAgIH07XG4gIH1cbik7XG5jb25zdCBydW5TdHJpcGVQckZsb3cgPSBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyhcbiAgYXN5bmMgKHtcbiAgICBjb250ZXh0LFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICBub25DZGVGb3JtSW5wdXRzLFxuICAgIGZsb3dDYWxsYmFja3MsXG4gICAgY3VzdG9tUGFyYW1zLFxuICAgIGluaXRSZXN1bHRcbiAgfSkgPT4ge1xuICAgIGxvZ19fJDEoYFJ1bm5pbmcgU3RyaXBlIFBSIGZsb3cuLi5gKTtcbiAgICBpZiAoY3VzdG9tUGFyYW1zLnByb3ZpZGVyICE9PSBjaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvdmlkZXIgbWlzbWF0Y2guIEV4cGVjdGVkICR7Y3VzdG9tUGFyYW1zLnByb3ZpZGVyfSwgZ290ICR7Y2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyfWApO1xuICAgIH1cbiAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICBjb25zdCBwciA9IGluaXRSZXN1bHQucHI7XG4gICAgaWYgKGN1c3RvbVBhcmFtcz8ub3ZlcnJpZGVQYXltZW50UmVxdWVzdCkge1xuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBjdXN0b21QYXJhbXMub3ZlcnJpZGVQYXltZW50UmVxdWVzdDtcbiAgICAgIGxvZ19fJDEoYE92ZXJyaWRpbmcgUFIgYW1vdW50IHdpdGhgLCBvdmVycmlkZSk7XG4gICAgICB1cGRhdGVQcldpdGhBbW91bnQocHIsIG92ZXJyaWRlLmFtb3VudCwgb3ZlcnJpZGUucGVuZGluZyk7XG4gICAgfVxuICAgIGxvZ19fJDEoYFNob3dpbmcgUFIgZGlhbG9nLi4uYCk7XG4gICAgcHIuc2hvdygpO1xuICAgIGNvbnN0IHN0cmlwZVBtQWRkZWRFdmVudCA9IGF3YWl0IHdhaXRGb3JVc2VyVG9BZGRQYXltZW50TWV0aG9kKHByKTtcbiAgICBsb2dfXyQxKGBTdHJpcGUgUE0gYWRkZWQgZXZlbnQ6YCwgc3RyaXBlUG1BZGRlZEV2ZW50KTtcbiAgICBsb2dfXyQxKGBNZXJnaW5nIFBNIGZpZWxkcyB3aXRoIGZvcm0gZmllbGRzLi4uYCk7XG4gICAgY29uc3QgbWVyZ2VkSW5wdXRzID0gZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQbShub25DZGVGb3JtSW5wdXRzLCBzdHJpcGVQbUFkZGVkRXZlbnQpO1xuICAgIGNvbnN0IG5vbkNkZUZvcm1GaWVsZHMgPSB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyhtZXJnZWRJbnB1dHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgIGxvZ19fJDEoYFBSIGRpYWxvZyBmaW5pc2hlZC4gU3RhcnRpbmcgcGF5bWVudCBmbG93Li4uYCk7XG4gICAgY29uc3Qgc3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlID0gYXdhaXQgc3RhcnRQYXltZW50Rmxvd0ZvclBSKGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgIGZpZWxkczogbm9uQ2RlRm9ybUZpZWxkcyxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZFxuICAgIH0pO1xuICAgIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBhcnNlUFJOZXh0QWN0aW9uTWV0YWRhdGEoc3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlKTtcbiAgICBsb2dfXyQxKGBDb25maXJtaW5nIFBSIHdpdGggU3RyaXBlLi4uYCk7XG4gICAgYXdhaXQgY29uZmlybVN0cmlwZVByUE0obmV4dEFjdGlvbk1ldGFkYXRhLCBzdHJpcGVQbUFkZGVkRXZlbnQpO1xuICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgbG9nX18kMShgQ29uZmlybWluZyBwYXltZW50IGZsb3cgZm9yIHNldHVwLi4uYCk7XG4gICAgICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgY29uZmlybVBheW1lbnRGbG93KGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRQYXltZW50TWV0aG9kID0gcGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZShjb25maXJtUmVzdWx0KTtcbiAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiBjcmVhdGVkUGF5bWVudE1ldGhvZCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dfXyQxKGBQZXJmb3JtaW5nIGNoZWNrb3V0Li4uYCk7XG4gICAgICBjb25zdCBjaGVja291dFJlcXVlc3QgPSB7XG4gICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgcGF5bWVudF9pbnB1dDoge1xuICAgICAgICAgIHByb3ZpZGVyX3R5cGU6IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlclxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21lcl9lbWFpbDogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuRU1BSUxdLFxuICAgICAgICBjdXN0b21lcl96aXBfY29kZTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuWklQX0NPREVdLFxuICAgICAgICBjdXN0b21lcl9jb3VudHJ5OiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5DT1VOVFJZXSxcbiAgICAgICAgcHJvbW90aW9uX2NvZGU6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLlBST01PVElPTl9DT0RFXSxcbiAgICAgICAgbGluZV9pdGVtczogcHJlZmlsbC5saW5lX2l0ZW1zLFxuICAgICAgICB0b3RhbF9hbW91bnRfYXRvbTogcHJlZmlsbC5hbW91bnRfdG90YWxfYXRvbSxcbiAgICAgICAgY2FuY2VsX2F0X2VuZDogZmFsc2UsXG4gICAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2RcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwZXJmb3JtQ2hlY2tvdXQoYW55Q2RlQ29ubmVjdGlvbiwgY2hlY2tvdXRSZXF1ZXN0KTtcbiAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgfVxuICB9XG4pO1xuY29uc3QgZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQbSA9IChmb3JtSW5wdXRzLCBzdHJpcGVQbUV2dCkgPT4ge1xuICBjb25zdCBpbnB1dHMgPSB7IC4uLmZvcm1JbnB1dHMgfTtcbiAgY29uc3QgW3BheWVyRmlyc3ROYW1lLCAuLi5wYXllckxhc3ROYW1lUGFydHNdID0gc3RyaXBlUG1FdnQucGF5ZXJOYW1lPy50cmltKCk/LnNwbGl0KC9cXHMrLykgPz8gW107XG4gIGNvbnN0IHBheWVyTGFzdE5hbWUgPSBwYXllckxhc3ROYW1lUGFydHMuam9pbihcIiBcIikgfHwgdm9pZCAwO1xuICBpbnB1dHNbRmllbGROYW1lLkZJUlNUX05BTUVdID0gaW5wdXRzW0ZpZWxkTmFtZS5GSVJTVF9OQU1FXSB8fCBwYXllckZpcnN0TmFtZSB8fCBcIl9PUF9VTktOT1dOXCI7XG4gIGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSB8fCBwYXllckxhc3ROYW1lIHx8IFwiX09QX1VOS05PV05cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5FTUFJTF0gPSBpbnB1dHNbRmllbGROYW1lLkVNQUlMXSB8fCBzdHJpcGVQbUV2dC5wYXllckVtYWlsIHx8IFwib3BfdW5maWxsZWRAZ2V0b3BlbnBheS5jb21cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gPSBpbnB1dHNbRmllbGROYW1lLlpJUF9DT0RFXSB8fCBzdHJpcGVQbUV2dC5zaGlwcGluZ0FkZHJlc3M/LnBvc3RhbENvZGUgfHwgXCIwMDAwMFwiO1xuICBpbnB1dHNbRmllbGROYW1lLkNPVU5UUlldID0gaW5wdXRzW0ZpZWxkTmFtZS5DT1VOVFJZXSB8fCBzdHJpcGVQbUV2dC5zaGlwcGluZ0FkZHJlc3M/LmNvdW50cnkgfHwgXCJVU1wiO1xuICBsb2dfXyQxKGBGaW5hbCBmb3JtIGlucHV0czpgLCBpbnB1dHMpO1xuICByZXR1cm4gaW5wdXRzO1xufTtcbmNvbnN0IHVwZGF0ZVByV2l0aEFtb3VudCA9IChwciwgYW1vdW50LCBpc1BlbmRpbmcpID0+IHtcbiAgcHIudXBkYXRlKHtcbiAgICB0b3RhbDoge1xuICAgICAgYW1vdW50OiBhbW91bnQuYW1vdW50QXRvbSxcbiAgICAgIGxhYmVsOiBcIlRvdGFsXCIsXG4gICAgICBwZW5kaW5nOiBpc1BlbmRpbmdcbiAgICB9LFxuICAgIGN1cnJlbmN5OiBhbW91bnQuY3VycmVuY3lcbiAgfSk7XG59O1xuY29uc3QgcGFyc2VQUk5leHRBY3Rpb25NZXRhZGF0YSA9IChyZXNwb25zZSkgPT4ge1xuICBpZiAocmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igb2NjdXJyZWQuXG5EZXRhaWxzOiBnb3QgJHtyZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMubGVuZ3RofSByZXF1aXJlZCB1c2VyIGFjdGlvbnNgKTtcbiAgfVxuICByZXR1cm4gUGF5bWVudFJlcXVlc3ROZXh0QWN0aW9uTWV0YWRhdGEucGFyc2UocmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zWzBdKTtcbn07XG5cbmNvbnN0IGZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QgPSAoY3Btcywgd2l0aFByb3ZpZGVyLCB3aXRoUHJvY2Vzc29yKSA9PiB7XG4gIGNvbnN0IG1hdGNoZXMgPSBjcG1zLmZpbHRlcigoY3BtKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlc1Byb2Nlc3NvciA9IHRydWUgO1xuICAgIGNvbnN0IG1hdGNoZXNQcm92aWRlciA9IGNwbS5wcm92aWRlciA9PT0gd2l0aFByb3ZpZGVyO1xuICAgIHJldHVybiBtYXRjaGVzUHJvY2Vzc29yICYmIG1hdGNoZXNQcm92aWRlcjtcbiAgfSk7XG4gIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJDUE1zIGxpc3RcIiwgY3Btcyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBDUE1zIGZvdW5kIHdpdGggcHJvdmlkZXIgJyR7d2l0aFByb3ZpZGVyfScgYW5kIHByb2Nlc3NvciAnJHt3aXRoUHJvY2Vzc29yfSdgKTtcbiAgfVxuICBpZiAobWF0Y2hlcy5sZW5ndGggIT09IDEpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiQ1BNcyBsaXN0XCIsIGNwbXMpO1xuICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIG9uZSBDUE0gZm91bmQgd2l0aCBwcm92aWRlciAnJHt3aXRoUHJvdmlkZXJ9JyBhbmQgcHJvY2Vzc29yICcke3dpdGhQcm9jZXNzb3J9J2ApO1xuICB9XG4gIHJldHVybiBtYXRjaGVzWzBdO1xufTtcbmNvbnN0IE9qc0Zsb3dzID0ge1xuICAvLyDinIsgTm90ZTogRm9yIGZsb3dzIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvbiwgcGxlYXNlIGFkZCB0aGVtIHRvIGBpbml0LWZsb3dzLnRzYFxuICAvLyBDb21tb25cbiAgY29tbW9uQ0M6IHtcbiAgICBydW46IHJ1bkNvbW1vbkNjRmxvd1xuICB9LFxuICAvLyBTdHJpcGVcbiAgc3RyaXBlUFI6IHtcbiAgICBpbml0OiBpbml0U3RyaXBlUHJGbG93LFxuICAgIHJ1bjogcnVuU3RyaXBlUHJGbG93XG4gIH0sXG4gIHN0cmlwZUxpbms6IHtcbiAgICBpbml0OiBpbml0U3RyaXBlTGlua0Zsb3csXG4gICAgcnVuOiBydW5TdHJpcGVMaW5rRmxvd1xuICB9XG4gIC8vIPCfkYkgQWRkIG1vcmUgZmxvd3MgaGVyZVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcblx0cmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDtcbn1cblxudmFyIE9ic2VydmFibGUkMiA9IHt9O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoT2JzZXJ2YWJsZSQyLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYnNlcnZhYmxlJDIuT2JzZXJ2YWJsZSA9IHZvaWQgMDtcblxuLy8gPT09IFN5bWJvbCBTdXBwb3J0ID09PVxuY29uc3QgaGFzU3ltYm9sID0gbmFtZSA9PiBCb29sZWFuKFN5bWJvbFtuYW1lXSk7XG5cbmNvbnN0IGdldFN5bWJvbCA9IG5hbWUgPT4gaGFzU3ltYm9sKG5hbWUpID8gU3ltYm9sW25hbWVdIDogJ0BAJyArIG5hbWU7XG5cbmNvbnN0IFN5bWJvbEl0ZXJhdG9yID0gZ2V0U3ltYm9sKCdpdGVyYXRvcicpO1xuY29uc3QgU3ltYm9sT2JzZXJ2YWJsZSA9IGdldFN5bWJvbCgnb2JzZXJ2YWJsZScpO1xuY29uc3QgU3ltYm9sU3BlY2llcyA9IGdldFN5bWJvbCgnc3BlY2llcycpOyAvLyA9PT0gQWJzdHJhY3QgT3BlcmF0aW9ucyA9PT1cblxuZnVuY3Rpb24gZ2V0TWV0aG9kKG9iaiwga2V5KSB7XG4gIGxldCB2YWx1ZSA9IG9ialtrZXldO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcih2YWx1ZSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBnZXRTcGVjaWVzKG9iaikge1xuICBsZXQgY3RvciA9IG9iai5jb25zdHJ1Y3RvcjtcblxuICBpZiAoY3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY3RvciA9IGN0b3JbU3ltYm9sU3BlY2llc107XG5cbiAgICBpZiAoY3RvciA9PT0gbnVsbCkge1xuICAgICAgY3RvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3RvciAhPT0gdW5kZWZpbmVkID8gY3RvciA6IE9ic2VydmFibGUkMTtcbn1cblxuZnVuY3Rpb24gaXNPYnNlcnZhYmxlKHgpIHtcbiAgcmV0dXJuIHggaW5zdGFuY2VvZiBPYnNlcnZhYmxlJDE7IC8vIFNQRUM6IEJyYW5kIGNoZWNrXG59XG5cbmZ1bmN0aW9uIGhvc3RSZXBvcnRFcnJvcihlKSB7XG4gIGlmIChob3N0UmVwb3J0RXJyb3IubG9nKSB7XG4gICAgaG9zdFJlcG9ydEVycm9yLmxvZyhlKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5xdWV1ZShmbikge1xuICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgZm4oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBob3N0UmVwb3J0RXJyb3IoZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgbGV0IGNsZWFudXAgPSBzdWJzY3JpcHRpb24uX2NsZWFudXA7XG4gIGlmIChjbGVhbnVwID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgc3Vic2NyaXB0aW9uLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuXG4gIGlmICghY2xlYW51cCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiBjbGVhbnVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB1bnN1YnNjcmliZSA9IGdldE1ldGhvZChjbGVhbnVwLCAndW5zdWJzY3JpYmUnKTtcblxuICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgIHVuc3Vic2NyaWJlLmNhbGwoY2xlYW51cCk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikge1xuICBzdWJzY3JpcHRpb24uX29ic2VydmVyID0gdW5kZWZpbmVkO1xuICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gdW5kZWZpbmVkO1xuICBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ2Nsb3NlZCc7XG59XG5cbmZ1bmN0aW9uIGZsdXNoU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikge1xuICBsZXQgcXVldWUgPSBzdWJzY3JpcHRpb24uX3F1ZXVlO1xuXG4gIGlmICghcXVldWUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gdW5kZWZpbmVkO1xuICBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ3JlYWR5JztcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgbm90aWZ5U3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgcXVldWVbaV0udHlwZSwgcXVldWVbaV0udmFsdWUpO1xuICAgIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnY2xvc2VkJykgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm90aWZ5U3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgdHlwZSwgdmFsdWUpIHtcbiAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdydW5uaW5nJztcbiAgbGV0IG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vYnNlcnZlcjtcblxuICB0cnkge1xuICAgIGxldCBtID0gZ2V0TWV0aG9kKG9ic2VydmVyLCB0eXBlKTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbmV4dCc6XG4gICAgICAgIGlmIChtKSBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgY2xvc2VTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlciwgdmFsdWUpO2Vsc2UgdGhyb3cgdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIGlmIChtKSBtLmNhbGwob2JzZXJ2ZXIpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBob3N0UmVwb3J0RXJyb3IoZSk7XG4gIH1cblxuICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtlbHNlIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAncnVubmluZycpIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncmVhZHknO1xufVxuXG5mdW5jdGlvbiBvbk5vdGlmeShzdWJzY3JpcHRpb24sIHR5cGUsIHZhbHVlKSB7XG4gIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnY2xvc2VkJykgcmV0dXJuO1xuXG4gIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnYnVmZmVyaW5nJykge1xuICAgIHN1YnNjcmlwdGlvbi5fcXVldWUucHVzaCh7XG4gICAgICB0eXBlLFxuICAgICAgdmFsdWVcbiAgICB9KTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlICE9PSAncmVhZHknKSB7XG4gICAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdidWZmZXJpbmcnO1xuICAgIHN1YnNjcmlwdGlvbi5fcXVldWUgPSBbe1xuICAgICAgdHlwZSxcbiAgICAgIHZhbHVlXG4gICAgfV07XG4gICAgZW5xdWV1ZSgoKSA9PiBmbHVzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSk7XG59XG5cbmNsYXNzIFN1YnNjcmlwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG9ic2VydmVyLCBzdWJzY3JpYmVyKSB7XG4gICAgLy8gQVNTRVJUOiBvYnNlcnZlciBpcyBhbiBvYmplY3RcbiAgICAvLyBBU1NFUlQ6IHN1YnNjcmliZXIgaXMgY2FsbGFibGVcbiAgICB0aGlzLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX29ic2VydmVyID0gb2JzZXJ2ZXI7XG4gICAgdGhpcy5fcXVldWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3RhdGUgPSAnaW5pdGlhbGl6aW5nJztcbiAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgbGV0IHN1YnNjcmlwdGlvbk9ic2VydmVyID0ge1xuICAgICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX3N0YXRlID09PSAnY2xvc2VkJztcbiAgICAgIH0sXG5cbiAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgb25Ob3RpZnkoc2VsZiwgJ25leHQnLCB2YWx1ZSk7XG4gICAgICB9LFxuXG4gICAgICBlcnJvcih2YWx1ZSkge1xuICAgICAgICBvbk5vdGlmeShzZWxmLCAnZXJyb3InLCB2YWx1ZSk7XG4gICAgICB9LFxuXG4gICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgb25Ob3RpZnkoc2VsZiwgJ2NvbXBsZXRlJyk7XG4gICAgICB9XG5cbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2NsZWFudXAgPSBzdWJzY3JpYmVyLmNhbGwodW5kZWZpbmVkLCBzdWJzY3JpcHRpb25PYnNlcnZlcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSAnaW5pdGlhbGl6aW5nJykgdGhpcy5fc3RhdGUgPSAncmVhZHknO1xuICB9XG5cbiAgZ2V0IGNsb3NlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUgPT09ICdjbG9zZWQnO1xuICB9XG5cbiAgdW5zdWJzY3JpYmUoKSB7XG4gICAgaWYgKHRoaXMuX3N0YXRlICE9PSAnY2xvc2VkJykge1xuICAgICAgY2xvc2VTdWJzY3JpcHRpb24odGhpcyk7XG4gICAgICBjbGVhbnVwU3Vic2NyaXB0aW9uKHRoaXMpO1xuICAgIH1cbiAgfVxuXG59XG5cbmxldCBPYnNlcnZhYmxlJDEgPSBjbGFzcyBPYnNlcnZhYmxlIHtcbiAgY29uc3RydWN0b3Ioc3Vic2NyaWJlcikge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JzZXJ2YWJsZSBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24nKTtcbiAgICBpZiAodHlwZW9mIHN1YnNjcmliZXIgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ09ic2VydmFibGUgaW5pdGlhbGl6ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgdGhpcy5fc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG4gIH1cblxuICBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSAnb2JqZWN0JyB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgb2JzZXJ2ZXIgPSB7XG4gICAgICAgIG5leHQ6IG9ic2VydmVyLFxuICAgICAgICBlcnJvcjogYXJndW1lbnRzWzFdLFxuICAgICAgICBjb21wbGV0ZTogYXJndW1lbnRzWzJdXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKG9ic2VydmVyLCB0aGlzLl9zdWJzY3JpYmVyKTtcbiAgfVxuXG4gIGZvckVhY2goZm4pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHN1YnNjcmlwdGlvbiA9IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmbih2YWx1ZSwgZG9uZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICAgIGNvbXBsZXRlOiByZXNvbHZlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG1hcChmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB0aGlzLnN1YnNjcmliZSh7XG4gICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFsdWUgPSBmbih2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0sXG5cbiAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICB9LFxuXG4gICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgIH0pKTtcbiAgfVxuXG4gIGZpbHRlcihmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB0aGlzLnN1YnNjcmliZSh7XG4gICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFmbih2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgfSxcblxuICAgICAgZXJyb3IoZSkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgfSkpO1xuICB9XG5cbiAgcmVkdWNlKGZuKSB7XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgbGV0IGhhc1NlZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMTtcbiAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICBsZXQgc2VlZCA9IGFyZ3VtZW50c1sxXTtcbiAgICBsZXQgYWNjID0gc2VlZDtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICBsZXQgZmlyc3QgPSAhaGFzVmFsdWU7XG4gICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIWZpcnN0IHx8IGhhc1NlZWQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYWNjID0gZm4oYWNjLCB2YWx1ZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY2MgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZXJyb3IoZSkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICBpZiAoIWhhc1ZhbHVlICYmICFoYXNTZWVkKSByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IobmV3IFR5cGVFcnJvcignQ2Fubm90IHJlZHVjZSBhbiBlbXB0eSBzZXF1ZW5jZScpKTtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChhY2MpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgYWxsKCkge1xuICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICBhd2FpdCB0aGlzLmZvckVhY2godmFsdWUgPT4gdmFsdWVzLnB1c2godmFsdWUpKTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgY29uY2F0KC4uLnNvdXJjZXMpIHtcbiAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgIGxldCBzdWJzY3JpcHRpb247XG4gICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICBmdW5jdGlvbiBzdGFydE5leHQobmV4dCkge1xuICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXh0LnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dCh2KSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHYpO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXJ0TmV4dChDLmZyb20oc291cmNlc1tpbmRleCsrXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgc3RhcnROZXh0KHRoaXMpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZsYXRNYXAoZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgbGV0IHN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICAgIGxldCBvdXRlciA9IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgIGlmIChmbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBmbih2YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgaW5uZXIgPSBDLmZyb20odmFsdWUpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgICAgICBsZXQgaSA9IHN1YnNjcmlwdGlvbnMuaW5kZXhPZihpbm5lcik7XG4gICAgICAgICAgICAgIGlmIChpID49IDApIHN1YnNjcmlwdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICBjb21wbGV0ZUlmRG9uZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKGlubmVyKTtcbiAgICAgICAgfSxcblxuICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgY29tcGxldGVJZkRvbmUoKTtcbiAgICAgICAgfVxuXG4gICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gY29tcGxldGVJZkRvbmUoKSB7XG4gICAgICAgIGlmIChvdXRlci5jbG9zZWQgJiYgc3Vic2NyaXB0aW9ucy5sZW5ndGggPT09IDApIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIG91dGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgW1N5bWJvbE9ic2VydmFibGVdKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc3RhdGljIGZyb20oeCkge1xuICAgIGxldCBDID0gdHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogT2JzZXJ2YWJsZTtcbiAgICBpZiAoeCA9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKHggKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICBsZXQgbWV0aG9kID0gZ2V0TWV0aG9kKHgsIFN5bWJvbE9ic2VydmFibGUpO1xuXG4gICAgaWYgKG1ldGhvZCkge1xuICAgICAgbGV0IG9ic2VydmFibGUgPSBtZXRob2QuY2FsbCh4KTtcbiAgICAgIGlmIChPYmplY3Qob2JzZXJ2YWJsZSkgIT09IG9ic2VydmFibGUpIHRocm93IG5ldyBUeXBlRXJyb3Iob2JzZXJ2YWJsZSArICcgaXMgbm90IGFuIG9iamVjdCcpO1xuICAgICAgaWYgKGlzT2JzZXJ2YWJsZShvYnNlcnZhYmxlKSAmJiBvYnNlcnZhYmxlLmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiBvYnNlcnZhYmxlLnN1YnNjcmliZShvYnNlcnZlcikpO1xuICAgIH1cblxuICAgIGlmIChoYXNTeW1ib2woJ2l0ZXJhdG9yJykpIHtcbiAgICAgIG1ldGhvZCA9IGdldE1ldGhvZCh4LCBTeW1ib2xJdGVyYXRvcik7XG5cbiAgICAgIGlmIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcblxuICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBtZXRob2QuY2FsbCh4KSkge1xuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW0pO1xuICAgICAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeFtpXSk7XG4gICAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHggKyAnIGlzIG5vdCBvYnNlcnZhYmxlJyk7XG4gIH1cblxuICBzdGF0aWMgb2YoLi4uaXRlbXMpIHtcbiAgICBsZXQgQyA9IHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IE9ic2VydmFibGU7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgIGVucXVldWUoKCkgPT4ge1xuICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoaXRlbXNbaV0pO1xuICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgW1N5bWJvbFNwZWNpZXNdKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbn07XG5cbk9ic2VydmFibGUkMi5PYnNlcnZhYmxlID0gT2JzZXJ2YWJsZSQxO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KE9ic2VydmFibGUkMSwgU3ltYm9sKCdleHRlbnNpb25zJyksIHtcbiAgdmFsdWU6IHtcbiAgICBzeW1ib2w6IFN5bWJvbE9ic2VydmFibGUsXG4gICAgaG9zdFJlcG9ydEVycm9yXG4gIH0sXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG5cbnZhciB6ZW5PYnNlcnZhYmxlID0gT2JzZXJ2YWJsZSQyLk9ic2VydmFibGU7XG5cbmNvbnN0IE9ic2VydmFibGUgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoemVuT2JzZXJ2YWJsZSk7XG5cbmNvbnN0IHsgbG9nX18sIGVycl9fIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImluaXQtZmxvd3NcIik7XG5jb25zdCBnZXRPanNJbml0UmVzdWx0c0RlYnVnT2JqZWN0ID0gKCkgPT4ge1xuICBpZiAoIShcIm9qc19pbml0X3Jlc3VsdHNcIiBpbiB3aW5kb3cpKSB7XG4gICAgd2luZG93W1wib2pzX2luaXRfcmVzdWx0c1wiXSA9IHt9O1xuICB9XG4gIHJldHVybiB3aW5kb3dbXCJvanNfaW5pdF9yZXN1bHRzXCJdO1xufTtcbmNvbnN0IGluaXRpYWxpemVPanNGbG93cyA9IChjb250ZXh0LCBmbG93Q2FsbGJhY2tzKSA9PiB7XG4gIGNvbnN0IGluaXRQYXJhbXMgPSB7IGNvbnRleHQsIGZsb3dDYWxsYmFja3MgfTtcbiAgcmV0dXJuIHtcbiAgICAvLyBTdHJpcGUgUFJcbiAgICBzdHJpcGVQUjogcnVuSW5pdEZsb3dBc09ic2VydmFibGUoXCJzdHJpcGVQUlwiLCBPanNGbG93cy5zdHJpcGVQUi5pbml0KGluaXRQYXJhbXMpKSxcbiAgICAvLyBTdHJpcGUgTGlua1xuICAgIHN0cmlwZUxpbms6IHJ1bkluaXRGbG93QXNPYnNlcnZhYmxlKFwic3RyaXBlTGlua1wiLCBPanNGbG93cy5zdHJpcGVMaW5rLmluaXQoaW5pdFBhcmFtcykpXG4gICAgLy8g8J+RiSBBZGQgaW5pdGlhbGl6YXRpb24gZmxvd3MgaGVyZVxuICB9O1xufTtcbmNvbnN0IHJ1bkluaXRGbG93QXNPYnNlcnZhYmxlID0gKGZsb3dOYW1lLCBpbml0RmxvdykgPT4ge1xuICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJsb2FkaW5nXCIgfSk7XG4gICAgaW5pdEZsb3cudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImxvYWRlZFwiLCByZXN1bHQgfSk7XG4gICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImVycm9yXCIsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfSk7XG4gIH0pO1xuICBvYnNlcnZhYmxlLnN1YnNjcmliZSh7XG4gICAgbmV4dDogKHJlc3VsdCkgPT4ge1xuICAgICAgbG9nX18oYCR7Zmxvd05hbWV9IGZsb3cgcmVzdWx0YCwgcmVzdWx0KTtcbiAgICAgIGdldE9qc0luaXRSZXN1bHRzRGVidWdPYmplY3QoKVtmbG93TmFtZV0gPSByZXN1bHQ7XG4gICAgfSxcbiAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICBlcnJfXyhgJHtmbG93TmFtZX0gZmxvdyBpbml0aWFsaXphdGlvbiBlcnJvcjpcbiR7SlNPTi5zdHJpbmdpZnkoZXJyb3IpfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG9ic2VydmFibGU7XG59O1xuXG5jb25zdCBQUl9MT0FESU5HID0ge1xuICBpc0xvYWRpbmc6IHRydWUsXG4gIGlzQXZhaWxhYmxlOiBmYWxzZSxcbiAgc3RhcnRGbG93OiBhc3luYyAoKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYHN0YXJ0RmxvdyB0cmlnZ2VyZWQgd2hpbGUgcGF5bWVudCByZXF1ZXN0IGlzIHN0aWxsIG5vdCByZWFkeS4gXG4gICAgICBZb3UgY2FuIGNoZWNrIHRoZSBcIi5pc0xvYWRpbmdcIiBwYXJhbSB0byBrbm93IHdoZW4gYSBwYXltZW50IHJlcXVlc3QgaXMgc3RpbGwgbG9hZGluZywgXG4gICAgICBhbmQgXCIuaXNBdmFpbGFibGVcIiB0byBrbm93IGlmIGEgcGF5bWVudCByZXF1ZXN0IGlzIGF2YWlsYWJsZS5gXG4gICAgKTtcbiAgfVxufTtcbmNvbnN0IFBSX0VSUk9SID0ge1xuICBpc0xvYWRpbmc6IGZhbHNlLFxuICBpc0F2YWlsYWJsZTogZmFsc2UsXG4gIHN0YXJ0RmxvdzogYXN5bmMgKCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoYHN0YXJ0RmxvdyB0cmlnZ2VyZWQgd2hlbiBwYXltZW50IHJlcXVlc3QgaXMgbm90IGF2YWlsYWJsZS5gKTtcbiAgfVxufTtcblxudmFyIHVzZUFzeW5jRWZmZWN0JDIgPSB7ZXhwb3J0czoge319O1xuXG52YXIgUmVhY3QgPSByZXF1aXJlJCQwO1xuXG5mdW5jdGlvbiB1c2VBc3luY0VmZmVjdChlZmZlY3QsIGRlc3Ryb3ksIGlucHV0cykge1xuICB2YXIgaGFzRGVzdHJveSA9IHR5cGVvZiBkZXN0cm95ID09PSAnZnVuY3Rpb24nO1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3VsdDtcbiAgICB2YXIgbW91bnRlZCA9IHRydWU7XG4gICAgdmFyIG1heWJlUHJvbWlzZSA9IGVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbW91bnRlZDtcbiAgICB9KTtcblxuICAgIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBtb3VudGVkID0gZmFsc2U7XG5cbiAgICAgIGlmIChoYXNEZXN0cm95KSB7XG4gICAgICAgIGRlc3Ryb3kocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBoYXNEZXN0cm95ID8gaW5wdXRzIDogZGVzdHJveSk7XG59XG5cbnVzZUFzeW5jRWZmZWN0JDIuZXhwb3J0cyA9IHVzZUFzeW5jRWZmZWN0O1xudXNlQXN5bmNFZmZlY3QkMi5leHBvcnRzLnVzZUFzeW5jRWZmZWN0ID0gdXNlQXN5bmNFZmZlY3Q7XG5cbnZhciB1c2VBc3luY0VmZmVjdEV4cG9ydHMgPSB1c2VBc3luY0VmZmVjdCQyLmV4cG9ydHM7XG5jb25zdCB1c2VBc3luY0VmZmVjdCQxID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHVzZUFzeW5jRWZmZWN0RXhwb3J0cyk7XG5cbmZ1bmN0aW9uIHVzZVRpbWVvdXRGbihmbiwgbXMgPSAwKSB7XG4gIGNvbnN0IHJlYWR5ID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgdGltZW91dCA9IHVzZVJlZigpO1xuICBjb25zdCBjYWxsYmFjayA9IHVzZVJlZihmbik7XG4gIGNvbnN0IGlzUmVhZHkgPSB1c2VDYWxsYmFjaygoKSA9PiByZWFkeS5jdXJyZW50LCBbXSk7XG4gIGNvbnN0IHNldCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICByZWFkeS5jdXJyZW50ID0gZmFsc2U7XG4gICAgdGltZW91dC5jdXJyZW50ICYmIGNsZWFyVGltZW91dCh0aW1lb3V0LmN1cnJlbnQpO1xuICAgIHRpbWVvdXQuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmVhZHkuY3VycmVudCA9IHRydWU7XG4gICAgICBjYWxsYmFjay5jdXJyZW50KCk7XG4gICAgfSwgbXMpO1xuICB9LCBbbXNdKTtcbiAgY29uc3QgY2xlYXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgcmVhZHkuY3VycmVudCA9IG51bGw7XG4gICAgdGltZW91dC5jdXJyZW50ICYmIGNsZWFyVGltZW91dCh0aW1lb3V0LmN1cnJlbnQpO1xuICB9LCBbXSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY2FsbGJhY2suY3VycmVudCA9IGZuO1xuICB9LCBbZm5dKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXQoKTtcbiAgICByZXR1cm4gY2xlYXI7XG4gIH0sIFttc10pO1xuICByZXR1cm4gW2lzUmVhZHksIGNsZWFyLCBzZXRdO1xufVxuXG5mdW5jdGlvbiB1c2VEZWJvdW5jZShmbiwgbXMgPSAwLCBkZXBzID0gW10pIHtcbiAgY29uc3QgW2lzUmVhZHksIGNhbmNlbCwgcmVzZXRdID0gdXNlVGltZW91dEZuKGZuLCBtcyk7XG4gIHVzZUVmZmVjdChyZXNldCwgZGVwcyk7XG4gIHJldHVybiBbaXNSZWFkeSwgY2FuY2VsXTtcbn1cblxuY29uc3QgdXNlRHluYW1pY1ByZXZpZXcgPSAoaXNFbmFibGVkLCBjZGVDb25uLCBzZWN1cmVUb2tlbiwgZm9ybURpdikgPT4ge1xuICBjb25zdCBbcHJvbW9Db2RlSW5wdXQsIHNldFByb21vQ29kZUlucHV0XSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbcHJvbW9Db2RlRGVib3VuY2VkLCBzZXRQcm9tb0NvZGVEZWJvdW5jZWRdID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtwcmV2aWV3QW10LCBzZXRQcmV2aWV3QW10XSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbaXNQcmV2aWV3TG9hZGluZywgc2V0SXNQcmV2aWV3TG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtwcmV2aWV3RXJyb3IsIHNldFByZXZpZXdFcnJvcl0gPSB1c2VTdGF0ZShudWxsKTtcbiAgdXNlQXN5bmNFZmZlY3QkMShhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFmb3JtRGl2IHx8ICFpc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJvbW9Db2RlSW5wdXQyID0gYXdhaXQgd2FpdEZvckZvcm1GaWVsZElucHV0KGZvcm1EaXYsIEZpZWxkTmFtZS5QUk9NT1RJT05fQ09ERSk7XG4gICAgcHJvbW9Db2RlSW5wdXQyPy5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgKCkgPT4ge1xuICAgICAgc2V0SXNQcmV2aWV3TG9hZGluZyh0cnVlKTtcbiAgICAgIHNldFByZXZpZXdFcnJvcihudWxsKTtcbiAgICAgIHNldFByb21vQ29kZUlucHV0KHByb21vQ29kZUlucHV0Mi52YWx1ZSk7XG4gICAgfSk7XG4gIH0sIFshIWZvcm1EaXYsIGlzRW5hYmxlZF0pO1xuICB1c2VEZWJvdW5jZShcbiAgICAoKSA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZXRQcm9tb0NvZGVEZWJvdW5jZWQocHJvbW9Db2RlSW5wdXQpO1xuICAgIH0sXG4gICAgMWUzLFxuICAgIFtwcm9tb0NvZGVJbnB1dCwgaXNFbmFibGVkXVxuICApO1xuICB1c2VBc3luY0VmZmVjdCQxKFxuICAgIGFzeW5jIChpc01vdW50ZWQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghY2RlQ29ubiB8fCAhc2VjdXJlVG9rZW4gfHwgIWlzRW5hYmxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChjZGVDb25uKTtcbiAgICAgICAgY29uc3QgaXNTZXR1cE1vZGUgPSBwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIjtcbiAgICAgICAgY29uc3QgcHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0UHJldmlld0Ftb3VudChjZGVDb25uLCBzZWN1cmVUb2tlbiwgaXNTZXR1cE1vZGUsIHByb21vQ29kZURlYm91bmNlZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW3VzZUR5bmFtaWNQcmV2aWV3XSBRdWVyeWluZy4gUHJvbW8gY29kZTpcIiwgcHJvbW9Db2RlRGVib3VuY2VkKTtcbiAgICAgICAgaWYgKGlzTW91bnRlZCgpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJbdXNlRHluYW1pY1ByZXZpZXddIFNldHRpbmcgcHJldmlldzpcIiwgcHJvbW9Db2RlRGVib3VuY2VkLCBwcmV2aWV3KTtcbiAgICAgICAgICBzZXRQcmV2aWV3RXJyb3IobnVsbCk7XG4gICAgICAgICAgc2V0UHJldmlld0FtdChwcmV2aWV3KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlt1c2VEeW5hbWljUHJldmlld10gRGlzY2FyZGluZzpcIiwgcHJldmlldyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGlzTW91bnRlZCgpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW3VzZUR5bmFtaWNQcmV2aWV3XSBFcnJvciBkb2luZyBwcmV2aWV3YCwgZ2V0RXJyb3JNZXNzYWdlKGUpKTtcbiAgICAgICAgICBzZXRQcmV2aWV3RXJyb3IoZ2V0RXJyb3JNZXNzYWdlKGUpKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGlzTW91bnRlZCgpKSB7XG4gICAgICAgICAgc2V0SXNQcmV2aWV3TG9hZGluZyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFshY2RlQ29ubiwgIXNlY3VyZVRva2VuLCBwcm9tb0NvZGVEZWJvdW5jZWQsIGlzRW5hYmxlZF1cbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBhbW91bnQ6IHByZXZpZXdBbXQsXG4gICAgaXNMb2FkaW5nOiBpc1ByZXZpZXdMb2FkaW5nLFxuICAgIGVycm9yOiBwcmV2aWV3RXJyb3JcbiAgfTtcbn07XG5cbmNvbnN0IHVzZU1hcCA9IChpbml0aWFsTWFwID0ge30pID0+IHtcbiAgY29uc3QgW21hcCwgc2V0XSA9IHVzZVN0YXRlKGluaXRpYWxNYXApO1xuICBjb25zdCBzdGFibGVBY3Rpb25zID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgc2V0OiAoa2V5LCBlbnRyeSkgPT4ge1xuICAgICAgICBzZXQoKHByZXZNYXApID0+ICh7XG4gICAgICAgICAgLi4ucHJldk1hcCxcbiAgICAgICAgICBba2V5XTogZW50cnlcbiAgICAgICAgfSkpO1xuICAgICAgfSxcbiAgICAgIHNldEFsbDogKG5ld01hcCkgPT4ge1xuICAgICAgICBzZXQobmV3TWFwKTtcbiAgICAgIH0sXG4gICAgICByZW1vdmU6IChrZXkpID0+IHtcbiAgICAgICAgc2V0KChwcmV2TWFwKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBba2V5XTogb21pdCwgLi4ucmVzdCB9ID0gcHJldk1hcDtcbiAgICAgICAgICByZXR1cm4gcmVzdDtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcmVzZXQ6ICgpID0+IHNldChpbml0aWFsTWFwKVxuICAgIH0pLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbc2V0XVxuICApO1xuICBjb25zdCB1dGlscyA9IHtcbiAgICBnZXQ6IHVzZUNhbGxiYWNrKChrZXkpID0+IG1hcFtrZXldLCBbbWFwXSksXG4gICAgLi4uc3RhYmxlQWN0aW9uc1xuICB9O1xuICByZXR1cm4gW21hcCwgdXRpbHNdO1xufTtcblxuY29uc3QgdXNlQ2RlQ29ubmVjdGlvbiA9ICgpID0+IHtcbiAgY29uc3QgW2NkZUNvbm5zLCBjZGVDb25uc1NldHRlcl0gPSB1c2VNYXAoe1xuICAgIGNhcmQ6IHZvaWQgMCxcbiAgICBcImNhcmQtY3ZjXCI6IHZvaWQgMCxcbiAgICBcImNhcmQtZXhwaXJ5XCI6IHZvaWQgMCxcbiAgICBcImNhcmQtbnVtYmVyXCI6IHZvaWQgMFxuICB9KTtcbiAgY29uc3QgYW55Q2RlQ29ubiA9IE9iamVjdC52YWx1ZXMoY2RlQ29ubnMpLmZpbHRlcigoY2RlQ29ubikgPT4gY2RlQ29ubiAhPT0gdm9pZCAwKVswXSA/PyBudWxsO1xuICByZXR1cm4ge1xuICAgIGNkZUNvbm5zLFxuICAgIGFueUNkZUNvbm4sXG4gICAgY29ubmVjdFRvQ2RlSWZyYW1lOiBhc3luYyAoZWxlbWVudFR5cGUsIGlmcmFtZSkgPT4ge1xuICAgICAgY2RlQ29ubnNTZXR0ZXIuc2V0KGVsZW1lbnRUeXBlLCBhd2FpdCBjcmVhdGVDZGVDb25uZWN0aW9uKGlmcmFtZSkpO1xuICAgIH1cbiAgfTtcbn07XG5jb25zdCBnZXRFbGVtZW50VHlwZUZyb21JZnJhbWVJZCA9IChpZnJhbWVJZCkgPT4ge1xuICBjb25zdCBlbGVtZW50VHlwZSA9IGlmcmFtZUlkLnJlcGxhY2UoXCJvanMtXCIsIFwiXCIpLnJlcGxhY2UoXCItZWxlbWVudFwiLCBcIlwiKTtcbiAgY29uc3QgcGFyc2VkID0gRWxlbWVudFR5cGUuc2FmZVBhcnNlKGVsZW1lbnRUeXBlKTtcbiAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGVsZW1lbnQgaWQ6ICR7aWZyYW1lSWR9LCBpdCBuZWVkcyB0byBiZSBpbiB0aGUgZm9ybWF0IFwib2pzLXtlbGVtZW50VHlwZX0tZWxlbWVudFwiIChlLmcuIFwib2pzLWNhcmQtbnVtYmVyLWVsZW1lbnRcIilgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkLmRhdGE7XG59O1xuXG5jb25zdCBFbGVtZW50c0Zvcm0gPSAocHJvcHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuLFxuICAgIGNoZWNrb3V0U2VjdXJlVG9rZW4sXG4gICAgY2xhc3NOYW1lLFxuICAgIG9uRm9jdXMsXG4gICAgb25CbHVyLFxuICAgIG9uQ2hhbmdlLFxuICAgIG9uTG9hZCxcbiAgICBvbkxvYWRFcnJvcixcbiAgICBvblZhbGlkYXRpb25FcnJvcixcbiAgICBvbkNoZWNrb3V0U3RhcnRlZCxcbiAgICBvbkNoZWNrb3V0U3VjY2VzcyxcbiAgICBvbkNoZWNrb3V0RXJyb3IsXG4gICAgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzLFxuICAgIGJhc2VVcmwsXG4gICAgZW5hYmxlRHluYW1pY1ByZXZpZXdzLFxuICAgIGN1c3RvbUluaXRQYXJhbXNcbiAgfSA9IHByb3BzO1xuICBjb25zdCBmcmFtZUJhc2VVcmwgPSBiYXNlVXJsID8/IEZSQU1FX0JBU0VfVVJMO1xuICBjb25zdCBbcmVmZXJlciwgc2V0UmVmZXJlcl0gPSB1c2VTdGF0ZSh2b2lkIDApO1xuICBjb25zdCBbbm9uY2VzLCBzZXROb25jZXNdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbZm9ybUhlaWdodCwgc2V0Rm9ybUhlaWdodF0gPSB1c2VTdGF0ZShcIjFweFwiKTtcbiAgY29uc3QgW2xvYWRlZCwgc2V0TG9hZGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2V4dHJhRGF0YSwgc2V0RXh0cmFEYXRhXSA9IHVzZVN0YXRlKHZvaWQgMCk7XG4gIGNvbnN0IFtwcmV2ZW50Q2xvc2UsIHNldFByZXZlbnRDbG9zZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpZnJhbWVzLCBzZXRJZnJhbWVzXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2V2ZW50VGFyZ2V0cywgc2V0RXZlbnRUYXJnZXRzXSA9IHVzZVN0YXRlKHt9KTtcbiAgY29uc3QgW3Rva2VuaXplZCwgc2V0VG9rZW5pemVkXSA9IHVzZVN0YXRlKDApO1xuICBjb25zdCBbY2hlY2tvdXRGaXJlZCwgc2V0Q2hlY2tvdXRGaXJlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzZXNzaW9uSWQsIHNldFNlc3Npb25JZF0gPSB1c2VTdGF0ZSh2b2lkIDApO1xuICBjb25zdCBbY3VycmVuY3ksIHNldEN1cnJlbmN5XSA9IHVzZVN0YXRlKHZvaWQgMCk7XG4gIGNvbnN0IFt0b3RhbEFtb3VudEF0b21zLCBzZXRUb3RhbEFtb3VudEF0b21zXSA9IHVzZVN0YXRlKHZvaWQgMCk7XG4gIGNvbnN0IFtjaGVja291dFBheW1lbnRNZXRob2RzLCBzZXRDaGVja291dFBheW1lbnRNZXRob2RzXSA9IHVzZVN0YXRlKHZvaWQgMCk7XG4gIGNvbnN0IFtzdHJpcGVQbV0gPSB1c2VTdGF0ZSh2b2lkIDApO1xuICBjb25zdCBmb3JtSWQgPSB1c2VNZW1vKCgpID0+IGBvcGpzLWZvcm0tJHt2NCgpfWAsIFtdKTtcbiAgY29uc3QgZm9ybVJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgeyBjZGVDb25ucywgYW55Q2RlQ29ubiwgY29ubmVjdFRvQ2RlSWZyYW1lIH0gPSB1c2VDZGVDb25uZWN0aW9uKCk7XG4gIGNvbnN0IFtvanNGbG93c0luaXRpYWxpemF0aW9uLCBzZXRPanNGbG93c0luaXRpYWxpemF0aW9uXSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbcGF5bWVudFJlcXVlc3RzLCBzZXRQYXltZW50UmVxdWVzdHNdID0gdXNlTWFwKHtcbiAgICBhcHBsZV9wYXk6IFBSX0xPQURJTkcsXG4gICAgZ29vZ2xlX3BheTogUFJfTE9BRElOR1xuICB9KTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvanNfdmVyc2lvbiA9IHsgdmVyc2lvbjogXCIwLjEuOVwiLCByZWxlYXNlX3ZlcnNpb246IFwiMC4xLjktYWxwaGEuOTExOWM4ZFwiIH07XG4gICAgd2luZG93W1wib2pzX3ZlcnNpb25cIl0gPSBvanNfdmVyc2lvbjtcbiAgICBjb25zb2xlLmxvZyhcIk9KUyB2ZXJzaW9uOlwiLCBvanNfdmVyc2lvbik7XG4gIH0sIFtdKTtcbiAgY29uc3QgZHluYW1pY1ByZXZpZXcgPSB1c2VEeW5hbWljUHJldmlldyhcbiAgICBlbmFibGVEeW5hbWljUHJldmlld3MgPz8gZmFsc2UsXG4gICAgYW55Q2RlQ29ubixcbiAgICBjaGVja291dFNlY3VyZVRva2VuLFxuICAgIGZvcm1SZWYuY3VycmVudFxuICApO1xuICBjb25zdCBvbk1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5vcmlnaW4gIT09IGZyYW1lQmFzZVVybCkgcmV0dXJuO1xuICAgICAgaWYgKCFldmVudC5zb3VyY2UpIHJldHVybjtcbiAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gZXZlbnQuc291cmNlO1xuICAgICAgaWYgKCFpc0pzb25TdHJpbmcoZXZlbnQuZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3ID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTtcbiAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IHBhcnNlRXZlbnRQYXlsb2FkKHJhdyk7XG4gICAgICBjb25zdCBlbGVtZW50SWQgPSBldmVudERhdGEuZWxlbWVudElkO1xuICAgICAgY29uc3QgdGFyZ2V0Rm9ybUlkID0gZXZlbnREYXRhLmZvcm1JZDtcbiAgICAgIGlmICh0YXJnZXRGb3JtSWQgIT09IGZvcm1JZCB8fCAhZWxlbWVudElkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltmb3JtXSBJZ25vcmluZyB1bmtub3duIGV2ZW50OlwiLCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnREYXRhLm5vbmNlIGluIG5vbmNlcykge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbZm9ybV0gSWdub3JpbmcgZHVwbGljYXRlIGV2ZW50OlwiLCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZXROb25jZXMoKHByZXZOb25jZXMpID0+IFsuLi5wcmV2Tm9uY2VzLCBldmVudERhdGEubm9uY2VdKTtcbiAgICAgIGNvbnN0IGV2ZW50UGF5bG9hZCA9IGV2ZW50RGF0YS5wYXlsb2FkO1xuICAgICAgY29uc3QgZXZlbnRUeXBlID0gZXZlbnRQYXlsb2FkLnR5cGU7XG4gICAgICBjb25zb2xlLmxvZyhgW2Zvcm1dIFJlY2VpdmVkICR7ZXZlbnRUeXBlfSBldmVudCBmcm9tICR7ZWxlbWVudElkfTpgLCBldmVudERhdGEucGF5bG9hZCk7XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5MQVlPVVQpIHtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gZXZlbnRQYXlsb2FkLmhlaWdodCA/IGAke2V2ZW50UGF5bG9hZC5oZWlnaHR9cHhgIDogXCIxMDAlXCI7XG4gICAgICAgIHNldEZvcm1IZWlnaHQoaGVpZ2h0KTtcbiAgICAgICAgY29uc29sZS5sb2coYFtmb3JtXSBFbGVtZW50IGhlaWdodCBzZXQgdG86ICR7aGVpZ2h0fWApO1xuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLkZPQ1VTICYmICEhb25Gb2N1cykge1xuICAgICAgICBvbkZvY3VzKGV2ZW50RGF0YS5lbGVtZW50SWQpO1xuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLkJMVVIgJiYgISFvbkJsdXIpIHtcbiAgICAgICAgb25CbHVyKGV2ZW50RGF0YS5lbGVtZW50SWQpO1xuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLkNIQU5HRSAmJiAhIW9uQ2hhbmdlKSB7XG4gICAgICAgIG9uQ2hhbmdlKGV2ZW50RGF0YS5lbGVtZW50SWQpO1xuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLkxPQURFRCkge1xuICAgICAgICBjb25zdCBtYXRjaGluZ0lmcmFtZSA9IGlmcmFtZXMuZmluZCgoaWZyYW1lKSA9PiBpZnJhbWUuY29udGVudFdpbmRvdyA9PT0gZXZlbnRTb3VyY2UpO1xuICAgICAgICBzZXRQcmV2ZW50Q2xvc2UoZmFsc2UpO1xuICAgICAgICBpZiAoIW1hdGNoaW5nSWZyYW1lKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW2Zvcm1dIElnbm9yaW5nIExPQURFRCBldmVudCBmcm9tIHVucmVnaXN0ZXJlZCBpZnJhbWU6XCIsIGV2ZW50RGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldEV2ZW50VGFyZ2V0cygocHJldlRhcmdldHMpID0+ICh7IC4uLnByZXZUYXJnZXRzLCBbZWxlbWVudElkXTogZXZlbnRTb3VyY2UgfSkpO1xuICAgICAgICBzZXRUb3RhbEFtb3VudEF0b21zKGV2ZW50UGF5bG9hZC50b3RhbEFtb3VudEF0b21zKTtcbiAgICAgICAgc2V0Q3VycmVuY3koZXZlbnRQYXlsb2FkLmN1cnJlbmN5KTtcbiAgICAgICAgc2V0Q2hlY2tvdXRQYXltZW50TWV0aG9kcyhldmVudFBheWxvYWQuY2hlY2tvdXRQYXltZW50TWV0aG9kcyk7XG4gICAgICAgIGlmICghc2Vzc2lvbklkKSBzZXRTZXNzaW9uSWQoZXZlbnRQYXlsb2FkLnNlc3Npb25JZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbZm9ybV0gRWxlbWVudCBsb2FkZWQgd2l0aCBwcmVmaWxsIGRhdGE6YCwgZXZlbnRQYXlsb2FkKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5UT0tFTklaRV9TVEFSVEVEKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIFRva2VuaXphdGlvbiBzdGFydGVkXCIpO1xuICAgICAgICBzZXRQcmV2ZW50Q2xvc2UodHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uQ0hFQ0tPVVRfU1RBUlRFRCkge1xuICAgICAgICBpZiAob25DaGVja291dFN0YXJ0ZWQpIG9uQ2hlY2tvdXRTdGFydGVkKCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uUEFZTUVOVF9GTE9XX1NUQVJURUQpIHtcbiAgICAgICAgaWYgKCFleHRyYURhdGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGV4dHJhRGF0YSBub3QgcG9wdWxhdGVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhbnlDZGVDb25uKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgY29ubmVjdGVkIHRvIENERWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbmZpcm1QYXltZW50RmxvdyQxID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5leHRBY3Rpb25UeXBlID0gZXZlbnRQYXlsb2FkLm5leHRBY3Rpb25NZXRhZGF0YVtcInR5cGVcIl07XG4gICAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gQ29uZmlybSBwYXltZW50IGZsb3c6IG5leHQgYWN0aW9uczpcIiwgZXZlbnRQYXlsb2FkLm5leHRBY3Rpb25NZXRhZGF0YSk7XG4gICAgICAgICAgaWYgKG5leHRBY3Rpb25UeXBlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIENvbmZpcm1pbmcgcGF5bWVudCBmbG93IChOby1vcClcIik7XG4gICAgICAgICAgfSBlbHNlIGlmIChuZXh0QWN0aW9uVHlwZSA9PT0gXCJzdHJpcGVfM2RzXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIENvbmZpcm1pbmcgcGF5bWVudCBmbG93IChTdHJpcGUgM0RTXCIpO1xuICAgICAgICAgICAgYXdhaXQgY29uZmlybVBheW1lbnRGbG93Rm9yM0RTKGV2ZW50UGF5bG9hZCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChuZXh0QWN0aW9uVHlwZSA9PT0gXCJzdHJpcGVfcGF5bWVudF9yZXF1ZXN0XCIpIHtcbiAgICAgICAgICAgIGlmICghc3RyaXBlUG0pIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdHJpcGUgUE0gbm90IHNldGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gQ29uZmlybWluZyBwYXltZW50IGZsb3cgKFN0cmlwZSBQUilcIik7XG4gICAgICAgICAgICBhd2FpdCBjb25maXJtUGF5bWVudEZsb3dGb3JTdHJpcGVQUkxlZ2FjeShldmVudFBheWxvYWQsIHN0cmlwZVBtKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG5leHQgYWN0aW9uIHR5cGU6ICR7bmV4dEFjdGlvblR5cGV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm4pO1xuICAgICAgICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICAgICAgY29uc3QgeyBwYXltZW50X21ldGhvZHMgfSA9IGF3YWl0IGNvbmZpcm1QYXltZW50RmxvdyhhbnlDZGVDb25uLCB7XG4gICAgICAgICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgICAgICAgZXhpc3RpbmdfY2NfcG1faWQ6IGV4dHJhRGF0YS5leGlzdGluZ0NDUE1JZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocGF5bWVudF9tZXRob2RzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgb25lIHBheW1lbnQgbWV0aG9kLCBnb3QgJHtwYXltZW50X21ldGhvZHMubGVuZ3RofWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gUEYgc2V0dXAgcGF5bWVudCBtZXRob2QgY29tcGxldGU6XCIsIHBheW1lbnRfbWV0aG9kcyk7XG4gICAgICAgICAgICBzZXRQcmV2ZW50Q2xvc2UoZmFsc2UpO1xuICAgICAgICAgICAgc2V0VG9rZW5pemVkKDApO1xuICAgICAgICAgICAgc2V0Q2hlY2tvdXRGaXJlZChmYWxzZSk7XG4gICAgICAgICAgICBpZiAob25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzKSB7XG4gICAgICAgICAgICAgIG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyhwYXltZW50X21ldGhvZHNbMF0uaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgcHJvY2VlZFRvQ2hlY2tvdXQ6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBwcm9jZWVkVG9DaGVja291dDogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbmZpcm1QYXltZW50RmxvdyQxKCkudGhlbigoeyBwcm9jZWVkVG9DaGVja291dCB9KSA9PiB7XG4gICAgICAgICAgaWYgKCFwcm9jZWVkVG9DaGVja291dCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gTk9UIHByb2NlZWRpbmcgdG8gY2hlY2tvdXQgYWZ0ZXIgY29uZmlybWF0aW9uLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gU3RhcnRpbmcgY2hlY2tvdXQgZnJvbSBwYXltZW50IGZsb3cuXCIpO1xuICAgICAgICAgIGxldCBleGlzdGluZ0NDUE1JZDtcbiAgICAgICAgICBpZiAoZXh0cmFEYXRhLmNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlciA9PT0gXCJjcmVkaXRfY2FyZFwiKSB7XG4gICAgICAgICAgICBleGlzdGluZ0NDUE1JZCA9IGV2ZW50UGF5bG9hZC5zdGFydFBGTWV0YWRhdGE/LmNjX3BtX2lkO1xuICAgICAgICAgICAgaWYgKCFleGlzdGluZ0NDUE1JZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENDIFBNIElEIG5vdCBmb3VuZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbWl0RXZlbnQoXG4gICAgICAgICAgICBldmVudFNvdXJjZSxcbiAgICAgICAgICAgIGZvcm1JZCxcbiAgICAgICAgICAgIGVsZW1lbnRJZCxcbiAgICAgICAgICAgIHsgLi4uZXh0cmFEYXRhLCB0eXBlOiBcIkNIRUNLT1VUXCIsIGRvTm90VXNlTGVnYWN5Q0NGbG93OiB0cnVlLCBleGlzdGluZ0NDUE1JZCB9LFxuICAgICAgICAgICAgZnJhbWVCYXNlVXJsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzZXRDaGVja291dEZpcmVkKHRydWUpO1xuICAgICAgICAgIHNldEV4dHJhRGF0YSh2b2lkIDApO1xuICAgICAgICAgIGlmIChvbkNoZWNrb3V0U3RhcnRlZCkgb25DaGVja291dFN0YXJ0ZWQoKTtcbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBDb25maXJtYXRpb24gcGF5bWVudCBmbG93IGVycm9yXCIpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgY29uc3QgZXJyTXNnID0gZ2V0RXJyb3JNZXNzYWdlKGUpO1xuICAgICAgICAgIHNldFByZXZlbnRDbG9zZShmYWxzZSk7XG4gICAgICAgICAgc2V0Q2hlY2tvdXRGaXJlZChmYWxzZSk7XG4gICAgICAgICAgaWYgKG9uQ2hlY2tvdXRFcnJvcikgb25DaGVja291dEVycm9yKGVyck1zZyk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLlRPS0VOSVpFX1NVQ0NFU1MgJiYgISFleHRyYURhdGEpIHtcbiAgICAgICAgY29uc3QgdG90YWxUb2tlbml6ZWQgPSB0b2tlbml6ZWQgKyAxO1xuICAgICAgICBjb25zdCBhbGxUb2tlbml6ZWQgPSB0b3RhbFRva2VuaXplZCA9PT0gT2JqZWN0LmtleXMoZXZlbnRUYXJnZXRzKS5sZW5ndGg7XG4gICAgICAgIGlmICghY2hlY2tvdXRGaXJlZCAmJiAoYWxsVG9rZW5pemVkIHx8IGV2ZW50UGF5bG9hZC5pc1JlYWR5Rm9yQ2hlY2tvdXQpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gVG9rZW5pemVkIGNhcmQgaXMgcmVhZHkgZm9yIGNoZWNrb3V0XCIpO1xuICAgICAgICAgIGVtaXRFdmVudChldmVudFNvdXJjZSwgZm9ybUlkLCBlbGVtZW50SWQsIGV4dHJhRGF0YSwgZnJhbWVCYXNlVXJsKTtcbiAgICAgICAgICBzZXRDaGVja291dEZpcmVkKHRydWUpO1xuICAgICAgICAgIHNldEV4dHJhRGF0YSh2b2lkIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbZm9ybV0gRWxlbWVudCAke2VsZW1lbnRJZH0gZmluaXNoZWQgdG9rZW5pemF0aW9uIGJ1dCBjYXJkIG5vdCB5ZXQgcmVhZHkgZm9yIGNoZWNrb3V0YCk7XG4gICAgICAgICAgc2V0VG9rZW5pemVkKHRvdGFsVG9rZW5pemVkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLkNIRUNLT1VUX1NVQ0NFU1MpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gQ2hlY2tvdXQgY29tcGxldGU6XCIsIGV2ZW50UGF5bG9hZCk7XG4gICAgICAgIHNldFByZXZlbnRDbG9zZShmYWxzZSk7XG4gICAgICAgIHNldFRva2VuaXplZCgwKTtcbiAgICAgICAgc2V0Q2hlY2tvdXRGaXJlZChmYWxzZSk7XG4gICAgICAgIGlmIChvbkNoZWNrb3V0U3VjY2Vzcykge1xuICAgICAgICAgIG9uQ2hlY2tvdXRTdWNjZXNzKGV2ZW50UGF5bG9hZC5pbnZvaWNlVXJscywgZXZlbnRQYXlsb2FkLnN1YnNjcmlwdGlvbklkcywgZXZlbnRQYXlsb2FkLmN1c3RvbWVySWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uU0VUVVBfUEFZTUVOVF9NRVRIT0RfU1VDQ0VTUykge1xuICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBTZXR1cCBwYXltZW50IG1ldGhvZCBjb21wbGV0ZTpcIiwgZXZlbnRQYXlsb2FkKTtcbiAgICAgICAgc2V0UHJldmVudENsb3NlKGZhbHNlKTtcbiAgICAgICAgc2V0VG9rZW5pemVkKDApO1xuICAgICAgICBzZXRDaGVja291dEZpcmVkKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2Vzcykge1xuICAgICAgICAgIG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyhldmVudFBheWxvYWQucGF5bWVudE1ldGhvZElkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLkxPQURfRVJST1IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIltmb3JtXSBFcnJvciBsb2FkaW5nIGlmcmFtZTpcIiwgZXZlbnRQYXlsb2FkLm1lc3NhZ2UpO1xuICAgICAgICBpZiAob25Mb2FkRXJyb3IpIG9uTG9hZEVycm9yKGV2ZW50UGF5bG9hZC5tZXNzYWdlKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5WQUxJREFUSU9OX0VSUk9SKSB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gZXh0cmFEYXRhPy5jaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXI7XG4gICAgICAgIGlmIChwcm92aWRlciA9PT0gXCJjcmVkaXRfY2FyZFwiIHx8IHByb3ZpZGVyID09PSB2b2lkIDApIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbZm9ybV0gVmFsaWRhdGlvbiBlcnJvciBmb3IgJHtldmVudFBheWxvYWQuZWxlbWVudFR5cGV9OmAsIGV2ZW50UGF5bG9hZC5lcnJvcnMpO1xuICAgICAgICAgIGlmIChvblZhbGlkYXRpb25FcnJvcikgb25WYWxpZGF0aW9uRXJyb3IoZXZlbnRQYXlsb2FkLmVsZW1lbnRUeXBlLCBldmVudFBheWxvYWQuZXJyb3JzLCBlbGVtZW50SWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uVE9LRU5JWkVfRVJST1IgfHwgZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5DSEVDS09VVF9FUlJPUikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW2Zvcm1dIEFQSSBlcnJvciBmcm9tIGVsZW1lbnQ6XCIsIGV2ZW50UGF5bG9hZC5tZXNzYWdlKTtcbiAgICAgICAgaWYgKGV2ZW50UGF5bG9hZC5tZXNzYWdlID09PSBcIjNEU19SRVFVSVJFRFwiKSB7XG4gICAgICAgICAgY29uc3QgY2FyZENwbSA9IGNoZWNrb3V0UGF5bWVudE1ldGhvZHM/LmZpbmQoKGNwbSkgPT4gY3BtLnByb3ZpZGVyID09PSBcImNyZWRpdF9jYXJkXCIpO1xuICAgICAgICAgIGlmICghc2Vzc2lvbklkIHx8ICFmb3JtUmVmLmN1cnJlbnQgfHwgIW9uVmFsaWRhdGlvbkVycm9yIHx8ICFjYXJkQ3BtKSByZXR1cm47XG4gICAgICAgICAgZm9yIChjb25zdCBbZWxlbWVudElkMiwgdGFyZ2V0XSBvZiBPYmplY3QuZW50cmllcyhldmVudFRhcmdldHMpKSB7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBzdGFydFBheW1lbnRGbG93RXZlbnQgPSBjb25zdHJ1Y3RTdWJtaXRFdmVudFBheWxvYWQoXG4gICAgICAgICAgICAgIEV2ZW50VHlwZS5lbnVtLlNUQVJUX1BBWU1FTlRfRkxPVyxcbiAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICBmb3JtUmVmLmN1cnJlbnQsXG4gICAgICAgICAgICAgIG9uVmFsaWRhdGlvbkVycm9yLFxuICAgICAgICAgICAgICAvLyBPbmx5IHN0cmlwZSBzdXBwb3J0cyBmcm9udGVuZCAzRFMgcmlnaHQgbm93LFxuICAgICAgICAgICAgICAvLyBzbyB3ZSBwYXNzIHByb2Nlc3Nvcl9uYW1lOiAnc3RyaXBlJyB0byB0ZWxsIGRlbGVnYXRvciB0byBvbmx5IHVzZSBzdHJpcGVcbiAgICAgICAgICAgICAgeyAuLi5jYXJkQ3BtLCBwcm9jZXNzb3JfbmFtZTogXCJzdHJpcGVcIiB9LFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghc3RhcnRQYXltZW50Rmxvd0V2ZW50KSBjb250aW51ZTtcbiAgICAgICAgICAgIHNldENoZWNrb3V0RmlyZWQodHJ1ZSk7XG4gICAgICAgICAgICBzZXRFeHRyYURhdGEoc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgICAgICAgICAgIGVtaXRFdmVudCh0YXJnZXQsIGZvcm1JZCwgZWxlbWVudElkMiwgc3RhcnRQYXltZW50Rmxvd0V2ZW50LCBmcmFtZUJhc2VVcmwpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFByZXZlbnRDbG9zZShmYWxzZSk7XG4gICAgICAgICAgc2V0Q2hlY2tvdXRGaXJlZChmYWxzZSk7XG4gICAgICAgICAgaWYgKG9uQ2hlY2tvdXRFcnJvcikgb25DaGVja291dEVycm9yKGV2ZW50UGF5bG9hZC5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgZm9ybUlkLFxuICAgICAgc2Vzc2lvbklkLFxuICAgICAgbm9uY2VzLFxuICAgICAgZXh0cmFEYXRhLFxuICAgICAgaWZyYW1lcyxcbiAgICAgIGV2ZW50VGFyZ2V0cyxcbiAgICAgIHRva2VuaXplZCxcbiAgICAgIGNoZWNrb3V0RmlyZWQsXG4gICAgICBvbkJsdXIsXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIG9uRm9jdXMsXG4gICAgICBvbkxvYWRFcnJvcixcbiAgICAgIG9uQ2hlY2tvdXRTdGFydGVkLFxuICAgICAgb25DaGVja291dFN1Y2Nlc3MsXG4gICAgICBvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MsXG4gICAgICBvbkNoZWNrb3V0RXJyb3IsXG4gICAgICBvblZhbGlkYXRpb25FcnJvcixcbiAgICAgIGZyYW1lQmFzZVVybCxcbiAgICAgIHN0cmlwZVBtLFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kcyxcbiAgICAgIGFueUNkZUNvbm5cbiAgICBdXG4gICk7XG4gIGNvbnN0IG9qc0Zsb3dDYWxsYmFja3MgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBub09wID0gKCkgPT4ge1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uQ2hlY2tvdXRFcnJvcjogbWFrZUNhbGxiYWNrU2FmZShcIm9uQ2hlY2tvdXRFcnJvclwiLCBvbkNoZWNrb3V0RXJyb3IgPz8gbm9PcCksXG4gICAgICBvbkNoZWNrb3V0U3RhcnRlZDogbWFrZUNhbGxiYWNrU2FmZShcIm9uQ2hlY2tvdXRTdGFydGVkXCIsIG9uQ2hlY2tvdXRTdGFydGVkID8/IG5vT3ApLFxuICAgICAgb25DaGVja291dFN1Y2Nlc3M6IG1ha2VDYWxsYmFja1NhZmUoXCJvbkNoZWNrb3V0U3VjY2Vzc1wiLCBvbkNoZWNrb3V0U3VjY2VzcyA/PyBub09wKSxcbiAgICAgIG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzczogbWFrZUNhbGxiYWNrU2FmZShcIm9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2Vzc1wiLCBvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MgPz8gbm9PcCksXG4gICAgICBvblZhbGlkYXRpb25FcnJvcjogbWFrZUNhbGxiYWNrU2FmZShcIm9uVmFsaWRhdGlvbkVycm9yXCIsIG9uVmFsaWRhdGlvbkVycm9yID8/IG5vT3ApXG4gICAgfTtcbiAgfSwgW29uQ2hlY2tvdXRFcnJvciwgb25DaGVja291dFN0YXJ0ZWQsIG9uQ2hlY2tvdXRTdWNjZXNzLCBvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MsIG9uVmFsaWRhdGlvbkVycm9yXSk7XG4gIGNvbnN0IGdlbmVyYXRlT2pzRmxvd0NvbnRleHQgPSAoKSA9PiB7XG4gICAgaWYgKCFmb3JtUmVmLmN1cnJlbnQgfHwgIXNlc3Npb25JZCB8fCAhY2hlY2tvdXRQYXltZW50TWV0aG9kcykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY2RlQ29ubmVjdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIE9iamVjdC5lbnRyaWVzKGNkZUNvbm5zKS5mb3JFYWNoKChbZWxlbWVudFR5cGUsIGNkZUNvbm5dKSA9PiB7XG4gICAgICBpZiAoY2RlQ29ubikge1xuICAgICAgICBjZGVDb25uZWN0aW9ucy5zZXQoZWxlbWVudFR5cGUsIGNkZUNvbm4pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChjZGVDb25uZWN0aW9ucy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIGZvcm1EaXY6IGZvcm1SZWYuY3VycmVudCxcbiAgICAgIGVsZW1lbnRzU2Vzc2lvbklkOiBzZXNzaW9uSWQsXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2RzLFxuICAgICAgY2RlQ29ubmVjdGlvbnMsXG4gICAgICBjdXN0b21Jbml0UGFyYW1zOiBjdXN0b21Jbml0UGFyYW1zID8/IHt9LFxuICAgICAgYmFzZVVybDogbmV3IFVSTChmcmFtZUJhc2VVcmwpLm9yaWdpblxuICAgIH07XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH07XG4gIGNvbnN0IHN1Ym1pdFBSID0gKHByb3ZpZGVyLCBpbml0UmVzdWx0LCBwYXJhbXMpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gZ2VuZXJhdGVPanNGbG93Q29udGV4dCgpO1xuICAgIGlmICghY29udGV4dCB8fCAhZm9ybVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgcmV0dXJuIE9qc0Zsb3dzLnN0cmlwZVBSLnJ1bih7XG4gICAgICBjb250ZXh0LFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0KGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgcHJvdmlkZXIpLFxuICAgICAgbm9uQ2RlRm9ybUlucHV0czogY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtKGZvcm1SZWYuY3VycmVudCksXG4gICAgICBmbG93Q2FsbGJhY2tzOiBvanNGbG93Q2FsbGJhY2tzLFxuICAgICAgY3VzdG9tUGFyYW1zOiB7IHByb3ZpZGVyLCBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBwYXJhbXM/Lm92ZXJyaWRlUGF5bWVudFJlcXVlc3QgfSxcbiAgICAgIGluaXRSZXN1bHRcbiAgICB9KTtcbiAgfTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAob2pzRmxvd3NJbml0aWFsaXphdGlvbiAhPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRleHQgPSBnZW5lcmF0ZU9qc0Zsb3dDb250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0KSByZXR1cm47XG4gICAgY29uc3QgaW5pdGlhbGl6YXRpb24gPSBpbml0aWFsaXplT2pzRmxvd3MoY29udGV4dCwgb2pzRmxvd0NhbGxiYWNrcyk7XG4gICAgc2V0T2pzRmxvd3NJbml0aWFsaXphdGlvbihpbml0aWFsaXphdGlvbik7XG4gICAgaW5pdGlhbGl6YXRpb24uc3RyaXBlUFIuc3Vic2NyaWJlKChzdGF0dXMpID0+IHtcbiAgICAgIGlmIChzdGF0dXMuc3RhdHVzID09PSBcImxvYWRpbmdcIikge1xuICAgICAgICBzZXRQYXltZW50UmVxdWVzdHMuc2V0KFwiYXBwbGVfcGF5XCIsIFBSX0xPQURJTkcpO1xuICAgICAgICBzZXRQYXltZW50UmVxdWVzdHMuc2V0KFwiZ29vZ2xlX3BheVwiLCBQUl9MT0FESU5HKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzLnN0YXR1cyA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgIHNldFBheW1lbnRSZXF1ZXN0cy5zZXQoXCJhcHBsZV9wYXlcIiwgUFJfRVJST1IpO1xuICAgICAgICBzZXRQYXltZW50UmVxdWVzdHMuc2V0KFwiZ29vZ2xlX3BheVwiLCBQUl9FUlJPUik7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cy5zdGF0dXMgPT09IFwibG9hZGVkXCIpIHtcbiAgICAgICAgY29uc3QgaW5pdFJlc3VsdCA9IHN0YXR1cy5yZXN1bHQ7XG4gICAgICAgIGNvbnN0IGNhbkFwcGxlUGF5ID0gaW5pdFJlc3VsdC5pc0F2YWlsYWJsZSAmJiBpbml0UmVzdWx0LmF2YWlsYWJsZVByb3ZpZGVycy5hcHBsZVBheTtcbiAgICAgICAgY29uc3QgY2FuR29vZ2xlUGF5ID0gaW5pdFJlc3VsdC5pc0F2YWlsYWJsZSAmJiBpbml0UmVzdWx0LmF2YWlsYWJsZVByb3ZpZGVycy5nb29nbGVQYXk7XG4gICAgICAgIHNldFBheW1lbnRSZXF1ZXN0cy5zZXQoXCJhcHBsZV9wYXlcIiwge1xuICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgaXNBdmFpbGFibGU6IGNhbkFwcGxlUGF5LFxuICAgICAgICAgIHN0YXJ0RmxvdzogYXN5bmMgKHVzZXJQYXJhbXMpID0+IGNhbkFwcGxlUGF5ID8gc3VibWl0UFIoXCJhcHBsZV9wYXlcIiwgaW5pdFJlc3VsdCwgdXNlclBhcmFtcykgOiB2b2lkIDBcbiAgICAgICAgfSk7XG4gICAgICAgIHNldFBheW1lbnRSZXF1ZXN0cy5zZXQoXCJnb29nbGVfcGF5XCIsIHtcbiAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGlzQXZhaWxhYmxlOiBjYW5Hb29nbGVQYXksXG4gICAgICAgICAgc3RhcnRGbG93OiBhc3luYyAodXNlclBhcmFtcykgPT4gY2FuR29vZ2xlUGF5ID8gc3VibWl0UFIoXCJnb29nbGVfcGF5XCIsIGluaXRSZXN1bHQsIHVzZXJQYXJhbXMpIDogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbZm9ybVJlZi5jdXJyZW50LCBzZXNzaW9uSWQsIGNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIE9iamVjdC5rZXlzKGNkZUNvbm5zKS5sZW5ndGhdKTtcbiAgY29uc3Qgc3VibWl0Q2FyZCA9ICgpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gZ2VuZXJhdGVPanNGbG93Q29udGV4dCgpO1xuICAgIGlmICghZm9ybVJlZi5jdXJyZW50IHx8ICFzZXNzaW9uSWQgfHwgIWFueUNkZUNvbm4gfHwgIWNoZWNrb3V0UGF5bWVudE1ldGhvZHMgfHwgIWNvbnRleHQpIHJldHVybjtcbiAgICBPanNGbG93cy5jb21tb25DQy5ydW4oe1xuICAgICAgY29udGV4dCxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdChjaGVja291dFBheW1lbnRNZXRob2RzLCBcImNyZWRpdF9jYXJkXCIpLFxuICAgICAgbm9uQ2RlRm9ybUlucHV0czogY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtKGZvcm1SZWYuY3VycmVudCksXG4gICAgICBmbG93Q2FsbGJhY2tzOiBvanNGbG93Q2FsbGJhY2tzLFxuICAgICAgY3VzdG9tUGFyYW1zOiB2b2lkIDAsXG4gICAgICAvLyBUaGlzIGZsb3cgcmVxdWlyZXMgbm8gY3VzdG9tIHBhcmFtc1xuICAgICAgaW5pdFJlc3VsdDogdm9pZCAwXG4gICAgICAvLyBUaGlzIGZsb3cgcmVxdWlyZXMgbm8gaW5pdGlhbGl6YXRpb25cbiAgICB9KTtcbiAgfTtcbiAgY29uc3Qgb25CZWZvcmVVbmxvYWQgPSB1c2VDYWxsYmFjayhcbiAgICAoZSkgPT4ge1xuICAgICAgaWYgKHByZXZlbnRDbG9zZSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sXG4gICAgW3ByZXZlbnRDbG9zZV1cbiAgKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobG9hZGVkIHx8ICFmb3JtUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBjb25zdCBhcmVJZnJhbWVzTG9hZGVkID0gaWZyYW1lcy5sZW5ndGggPiAwICYmIGlmcmFtZXMubGVuZ3RoID09PSBPYmplY3Qua2V5cyhldmVudFRhcmdldHMpLmxlbmd0aDtcbiAgICBpZiAoYXJlSWZyYW1lc0xvYWRlZCkge1xuICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gQWxsIGVsZW1lbnRzIGxvYWRlZFwiKTtcbiAgICAgIHNldExvYWRlZCh0cnVlKTtcbiAgICAgIGlmIChvbkxvYWQpIG9uTG9hZCh0b3RhbEFtb3VudEF0b21zLCBjdXJyZW5jeSk7XG4gICAgfVxuICB9LCBbaWZyYW1lcywgZXZlbnRUYXJnZXRzLCBsb2FkZWQsIG9uTG9hZCwgdG90YWxBbW91bnRBdG9tcywgY3VycmVuY3ldKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRSZWZlcmVyKHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBvbk1lc3NhZ2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIG9uQmVmb3JlVW5sb2FkKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgb25CZWZvcmVVbmxvYWQpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uTWVzc2FnZSk7XG4gICAgfTtcbiAgfSwgW3Nlc3Npb25JZCwgb25NZXNzYWdlLCBvbkJlZm9yZVVubG9hZF0pO1xuICBjb25zdCByZWdpc3RlcklmcmFtZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChpZnJhbWUpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSWZyYW1lID0gaWZyYW1lcy5maW5kKChleGlzdGluZ0lmcmFtZTIpID0+IGV4aXN0aW5nSWZyYW1lMi5jb250ZW50V2luZG93ID09PSBpZnJhbWUuY29udGVudFdpbmRvdyk7XG4gICAgICBpZiAoZXhpc3RpbmdJZnJhbWUpIHJldHVybjtcbiAgICAgIHNldElmcmFtZXMoKHByZXZJZnJhbWVzKSA9PiBbLi4ucHJldklmcmFtZXMsIGlmcmFtZV0pO1xuICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gUmVnaXN0ZXJpbmcgaWZyYW1lOlwiLCBpZnJhbWUpO1xuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZUZyb21JZnJhbWVJZChpZnJhbWUuaWQpO1xuICAgICAgYXdhaXQgY29ubmVjdFRvQ2RlSWZyYW1lKGVsZW1lbnRUeXBlLCBpZnJhbWUpO1xuICAgIH0sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICAgIFtpZnJhbWVzXVxuICApO1xuICBjb25zdCB2YWx1ZSA9IHtcbiAgICBmb3JtSWQsXG4gICAgZm9ybUhlaWdodCxcbiAgICByZWZlcmVyLFxuICAgIGNoZWNrb3V0U2VjdXJlVG9rZW4sXG4gICAgcmVnaXN0ZXJJZnJhbWUsXG4gICAgYmFzZVVybDogZnJhbWVCYXNlVXJsXG4gIH07XG4gIGNvbnN0IGNoaWxkcmVuUHJvcHMgPSB7XG4gICAgc3VibWl0OiBzdWJtaXRDYXJkLFxuICAgIGFwcGxlUGF5OiBwYXltZW50UmVxdWVzdHMuYXBwbGVfcGF5LFxuICAgIGdvb2dsZVBheTogcGF5bWVudFJlcXVlc3RzLmdvb2dsZV9wYXksXG4gICAgLy8gc3RyaXBlTGluazoge1xuICAgIC8vIFRPRE86IHVuY29tbWVudCBpZiB3ZSBuZWVkIHN0cmlwZSBlbGVtZW50cyBsYXRlci5cbiAgICAvLyBCZXR0ZXIgaWYgd2UgY2FuIG1ha2Ugc3RyaXBlIGxpbmsgd29yayBpbiBwcm9kIHdpdGhvdXQgZWxlbWVudHMuXG4gICAgLy8gYnV0dG9uOiBzdHJpcGVFbGVtZW50cy5pc1JlYWR5ID8gU3RyaXBlTGlua0J1dHRvbiA6IE5vT3BFbGVtZW50LFxuICAgIC8vIGF1dGhFbGVtZW50OiBzdHJpcGVFbGVtZW50cy5pc1JlYWR5ID8gU3RyaXBlTGlua0F1dGhFbGVtZW50IDogTm9PcEVsZW1lbnQsXG4gICAgLy8gcHI6IHBheW1lbnRSZXF1ZXN0cy5zdHJpcGVfbGluayxcbiAgICAvLyB9LFxuICAgIGxvYWRlZCxcbiAgICBwcmV2aWV3OiBkeW5hbWljUHJldmlld1xuICB9O1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChFbGVtZW50c0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWUsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lLCByZWY6IGZvcm1SZWYsIGNoaWxkcmVuOiBjaGlsZHJlbihjaGlsZHJlblByb3BzKSB9KSB9KTtcbn07XG5cbmNvbnN0IEVsZW1lbnRGcmFtZSA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHN1YlBhdGgsIHN0eWxlcyB9ID0gcHJvcHM7XG4gIGNvbnN0IHsgZm9ybUlkLCByZWZlcmVyLCBmb3JtSGVpZ2h0LCBjaGVja291dFNlY3VyZVRva2VuLCByZWdpc3RlcklmcmFtZSwgYmFzZVVybCB9ID0gdXNlT3BlblBheUVsZW1lbnRzKCk7XG4gIGNvbnN0IFtoYXNMb2FkZWQsIHNldEhhc0xvYWRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IGlmcmFtZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgZWxlbWVudFN0eWxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFzdHlsZXMpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiBjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyhzdHlsZXMpO1xuICB9LCBbc3R5bGVzXSk7XG4gIGNvbnN0IGZyYW1lU3R5bGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgIGhlaWdodDogZm9ybUhlaWdodFxuICAgIH07XG4gIH0sIFtmb3JtSGVpZ2h0XSk7XG4gIGNvbnN0IHF1ZXJ5U3RyaW5nID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFjaGVja291dFNlY3VyZVRva2VuIHx8ICFyZWZlcmVyKSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgcGFyYW1zLmFwcGVuZChcInJlZmVyZXJcIiwgcmVmZXJlcik7XG4gICAgcGFyYW1zLmFwcGVuZChcInN0eWxlc1wiLCBlbGVtZW50U3R5bGUpO1xuICAgIHBhcmFtcy5hcHBlbmQoXCJmb3JtSWRcIiwgZm9ybUlkKTtcbiAgICBwYXJhbXMuYXBwZW5kKFwic2VjdXJlVG9rZW5cIiwgY2hlY2tvdXRTZWN1cmVUb2tlbik7XG4gICAgcmV0dXJuIHBhcmFtcy50b1N0cmluZygpO1xuICB9LCBbZWxlbWVudFN0eWxlLCBmb3JtSWQsIHJlZmVyZXIsIGNoZWNrb3V0U2VjdXJlVG9rZW5dKTtcbiAgdXNlRWZmZWN0KCgpID0+IHNldEhhc0xvYWRlZCh0cnVlKSwgW10pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaWZyYW1lUmVmLmN1cnJlbnQgfHwgIWhhc0xvYWRlZCkgcmV0dXJuO1xuICAgIHJlZ2lzdGVySWZyYW1lKGlmcmFtZVJlZi5jdXJyZW50KTtcbiAgfSwgW2hhc0xvYWRlZF0pO1xuICBpZiAoIWNoZWNrb3V0U2VjdXJlVG9rZW4pIHtcbiAgICBjb25zb2xlLmVycm9yKFwiW2Zvcm1dIENhbm5vdCByZW5kZXIgcGFydGlhbGx5IGluaXRpYWxpemVkIGZyYW1lXCIpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFwiZGl2XCIsIHt9KTtcbiAgfVxuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICBcImlmcmFtZVwiLFxuICAgIHtcbiAgICAgIGlkOiBgb2pzLSR7c3ViUGF0aH0tZWxlbWVudGAsXG4gICAgICBuYW1lOiBgJHtzdWJQYXRofS1lbGVtZW50YCxcbiAgICAgIGNsYXNzTmFtZTogXCJvanMtaWZyYW1lXCIsXG4gICAgICBzcmM6IGAke2Jhc2VVcmx9L2FwcC92MS8ke3N1YlBhdGh9LWVsZW1lbnQvPyR7cXVlcnlTdHJpbmd9YCxcbiAgICAgIHN0eWxlOiBmcmFtZVN0eWxlLFxuICAgICAgcmVmOiBpZnJhbWVSZWZcbiAgICB9XG4gICk7XG59O1xuXG5jb25zdCBDYXJkQ3ZjRWxlbWVudCA9ICh7IHN0eWxlcyB9KSA9PiB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KEVsZW1lbnRGcmFtZSwgeyBzdHlsZXMsIHN1YlBhdGg6IFwiY2FyZC1jdmNcIiB9KTtcbn07XG5cbmNvbnN0IENhcmRFbGVtZW50ID0gKHsgc3R5bGVzIH0pID0+IHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goRWxlbWVudEZyYW1lLCB7IHN0eWxlcywgc3ViUGF0aDogXCJjYXJkXCIgfSk7XG59O1xuXG5jb25zdCBDYXJkRXhwaXJ5RWxlbWVudCA9ICh7IHN0eWxlcyB9KSA9PiB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KEVsZW1lbnRGcmFtZSwgeyBzdHlsZXMsIHN1YlBhdGg6IFwiY2FyZC1leHBpcnlcIiB9KTtcbn07XG5cbmNvbnN0IENhcmROdW1iZXJFbGVtZW50ID0gKHsgc3R5bGVzIH0pID0+IHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goRWxlbWVudEZyYW1lLCB7IHN0eWxlcywgc3ViUGF0aDogXCJjYXJkLW51bWJlclwiIH0pO1xufTtcblxuZXhwb3J0IHsgQ2FyZEN2Y0VsZW1lbnQsIENhcmRFbGVtZW50LCBDYXJkRXhwaXJ5RWxlbWVudCwgQ2FyZE51bWJlckVsZW1lbnQsIEVsZW1lbnRzRm9ybSwgRmllbGROYW1lLCB1c2VPcGVuUGF5RWxlbWVudHMgfTsiXSwKICAibWFwcGluZ3MiOiAiQUFBQSxPQUFPQSxNQUFjLGlCQUFBQyxJQUFlLGNBQUFDLElBQVksVUFBQUMsSUFBUSxlQUFBQyxHQUFhLGFBQUFDLEdBQVcsWUFBQUMsR0FBVSxXQUFBQyxVQUFlO0FBQ3pHLFNBQVMsT0FBQUMsU0FBVztBQUNwQixTQUFTLEtBQUFDLFNBQVM7QUFDbEIsU0FBUyxNQUFBQyxVQUFVO0FBQ25CLFNBQVMsa0JBQUFDLFVBQXNCO0FBQy9CLE9BQU9DLFFBQVc7QUFFbEIsTUFBTUMsS0FBa0JaLEdBQWM7QUFBQSxFQUNwQyxRQUFRO0FBQUEsRUFDUixZQUFZO0FBQUEsRUFDWixTQUFTO0FBQUEsRUFDVCxxQkFBcUI7QUFBQSxFQUNyQixnQkFBZ0IsTUFBTTtBQUFBLEVBQ3RCO0FBQUEsRUFDQSxTQUFTO0FBQ1gsQ0FBQyxHQUVLYSxLQUFxQixNQUFNO0FBQy9CLFFBQU1DLElBQVViLEdBQVdXLEVBQWU7QUFDMUMsTUFBSSxDQUFDRTtBQUNILFVBQU0sSUFBSSxNQUFNLG1FQUFtRTtBQUVyRixTQUFPQTtBQUNULEdBRU1DLEtBQWlCLDhCQUVqQkMsS0FBNEJSLEVBQUUsT0FBTztBQUFBLEVBQ3pDLE1BQU1BLEVBQUUsT0FBTztBQUFBLEVBQ2YsS0FBS0EsRUFBRSxNQUFNQSxFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ3ZCLEtBQUtBLEVBQUUsT0FBTztBQUFBLEVBQ2QsS0FBS0EsRUFBRSxPQUFPO0FBQ2hCLENBQUMsR0FDS1MsS0FBa0NULEVBQUUsTUFBTVEsRUFBeUIsR0FDbkVFLEtBQWdCVixFQUFFLE9BQU87QUFBQSxFQUM3QixNQUFNQSxFQUFFLE9BQU87QUFBQSxFQUNmLFNBQVNBLEVBQUUsT0FBTztBQUFBLEVBQ2xCLE1BQU1BLEVBQUUsTUFBTUEsRUFBRSxPQUFPLENBQUM7QUFDMUIsQ0FBQyxHQUNLVyxLQUFpQlgsRUFBRSxNQUFNVSxFQUFhLEdBQ3RDRSxLQUFrQztBQUFBLEVBQ3RDLG1CQUFtQjtBQUNyQixHQUNNQyxLQUEwQixDQUFDQyxNQUFtQjtBQUNsRCxRQUFNQyxJQUFNRCxFQUFlLFlBQVksRUFBRSxLQUFLO0FBQzlDLFNBQU9GLEdBQWdDRyxDQUFHLEtBQUtEO0FBQ2pELEdBQ01FLEtBQTBCLENBQUNDLE1BQVE7QUFDdkMsTUFBSTtBQUVGLFdBQU8sT0FEUSxLQUFLLE1BQU1BLENBQUcsS0FDSjtBQUFBLEVBQzNCLFFBQVk7QUFDVixXQUFPO0FBQUEsRUFDVDtBQUNGLEdBQ01DLEtBQTJDLENBQUNDLE1BQzVDQSxFQUFTLFdBQVcsSUFDZk4sR0FBd0JNLEVBQVMsQ0FBQyxFQUFFLEdBQUcsSUFHdkM7QUFBQSxFQURVQSxFQUFTLElBQUksQ0FBQ0MsTUFBUSxLQUFLUCxHQUF3Qk8sRUFBSSxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUs7QUFBQSxDQUFJLENBRW5GLElBR0pDLEtBQWtDLENBQUNDLE1BRWhDO0FBQUEsRUFEY0EsRUFBTyxJQUFJLENBQUNGLE1BQVEsS0FBS0EsRUFBSSxLQUFLLEtBQUssR0FBRyxDQUFDLEtBQUtBLEVBQUksT0FBTyxFQUFFLEVBQUUsS0FBSztBQUFBLENBQUksQ0FFakYsSUFFUkcsS0FBa0IsQ0FBQyxNQUFNO0FBQzdCLE1BQUksYUFBYTtBQUNmLFFBQUlQLEdBQXdCLEVBQUUsT0FBTyxHQUFHO0FBQ3RDLFlBQU1RLElBQU0sS0FBSyxNQUFNLEVBQUUsT0FBTztBQUNoQyxhQUFJZixHQUFnQyxVQUFVZSxDQUFHLEVBQUUsVUFDMUNOLEdBQXlDTSxDQUFHLElBQzFDYixHQUFlLFVBQVVhLENBQUcsRUFBRSxVQUNoQ0gsR0FBZ0NHLENBQUcsS0FFMUMsUUFBUSxLQUFLO0FBQUEsRUFDbkIsRUFBRSxPQUFPLEVBQUUsR0FDRSxFQUFFO0FBQUEsSUFFYjtBQUNFLGFBQU9YLEdBQXdCLEVBQUUsT0FBTztBQUc1QyxNQUFJLE9BQU8sS0FBTTtBQUNmLFFBQUk7QUFDRixhQUFPLEtBQUssVUFBVSxDQUFDO0FBQUEsSUFDekIsU0FBU1ksR0FBSTtBQUNYLGFBQU9BLElBQUs7QUFBQSxJQUNkO0FBQUE7QUFFQSxXQUFPLElBQUk7QUFFZixHQUNNQyxLQUFtQixDQUFDQyxHQUFjQyxNQUMvQixJQUFJQyxNQUFTO0FBQ2xCLE1BQUk7QUFDRixXQUFPRCxFQUFHLEdBQUdDLENBQUk7QUFBQSxFQUNuQixTQUFTQyxHQUFPO0FBQ2QsWUFBUSxNQUFNLGtDQUFrQ0gsQ0FBWSxNQUFNRyxDQUFLO0FBQ3ZFO0FBQUEsRUFDRjtBQUNGLEdBR0lDLElBQWlCL0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksR0FBRyxFQUFFLFNBQVMsa0JBQWtCLENBQUMsR0FDeEVnQyxJQUFpQmhDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEdBQzVDaUMsS0FBa0IsQ0FBQ0MsTUFBVWxDLEVBQUUsU0FBU2tDLEVBQU0sU0FBUyxDQUFDO0FBQzlELElBQUlDLElBQTZCLGtCQUFDQyxPQUNoQ0EsRUFBVyxhQUFnQixhQUMzQkEsRUFBVyxZQUFlLFlBQzFCQSxFQUFXLFFBQVcsU0FDdEJBLEVBQVcsV0FBYyxXQUN6QkEsRUFBVyxPQUFVLFFBQ3JCQSxFQUFXLFFBQVcsU0FDdEJBLEVBQVcsVUFBYSxXQUN4QkEsRUFBVyxVQUFhLFdBQ3hCQSxFQUFXLFFBQVcsU0FDdEJBLEVBQVcsaUJBQW9CLGlCQUN4QkEsSUFDTkQsS0FBYSxDQUFDLENBQUM7QUFDbEIsTUFBTUUsS0FBZ0JyQyxFQUFFLFdBQVdtQyxDQUFTO0FBQzVDLElBQUlHLEtBQW9DLGtCQUFDQyxPQUN2Q0EsRUFBa0IsY0FBaUIsY0FDbkNBLEVBQWtCLGNBQWlCLGNBQ25DQSxFQUFrQixXQUFjLFdBQ3pCQSxJQUNORCxNQUFvQixDQUFDLENBQUM7QUFDekIsTUFBTUUsS0FBdUJ4QyxFQUFFLFdBQVdzQyxFQUFnQixHQUNwREcsS0FBZ0J6QyxFQUFFLE1BQU0sQ0FBQ3FDLElBQWVHLEVBQW9CLENBQUM7QUFDbkUsSUFBSUUsS0FBbUMsa0JBQUNDLE9BQ3RDQSxFQUFpQixPQUFVLFFBQzNCQSxFQUFpQixjQUFpQixlQUNsQ0EsRUFBaUIsY0FBaUIsZUFDbENBLEVBQWlCLFdBQWMsWUFDeEJBLElBQ05ELE1BQW1CLENBQUMsQ0FBQztBQUN4QixNQUFNRSxLQUFjNUMsRUFBRSxXQUFXMEMsRUFBZSxHQUMxQ0csS0FBMEI3QyxFQUFFLE9BQU87QUFBQSxFQUN2QyxVQUFVQSxFQUFFLE9BQU87QUFBQSxFQUNuQixnQkFBZ0JpQyxHQUFnQmpDLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDMUMsVUFBVWlDLEdBQWdCakMsRUFBRSxPQUFPQSxFQUFFLE9BQU8sR0FBR0EsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6RCxDQUFDLEdBQ0s4QyxLQUF1QjlDLEVBQUUsT0FBTztBQUFBLEVBQ3BDLElBQUlBLEVBQUUsT0FBTztBQUNmLENBQUM7QUFDREEsRUFBRSxPQUFPO0FBQUEsRUFDUCxZQUFZZ0M7QUFBQSxFQUNaLFFBQVFBO0FBQUEsRUFDUixLQUFLQTtBQUNQLENBQUM7QUFDRGhDLEVBQUUsT0FBTztBQUFBLEVBQ1AsaUJBQWlCZ0M7QUFBQSxFQUNqQixPQUFPQTtBQUFBLEVBQ1AsWUFBWUE7QUFBQSxFQUNaLFVBQVVBO0FBQUEsRUFDVixZQUFZQTtBQUFBLEVBQ1osUUFBUUE7QUFBQSxFQUNSLFNBQVNBO0FBQUEsRUFDVCxlQUFlQTtBQUFBLEVBQ2YsWUFBWUE7QUFDZCxDQUFDO0FBQ0QsTUFBTWUsSUFBWS9DLEVBQUUsS0FBSztBQUFBO0FBQUEsRUFFdkI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsQ0FBQyxHQUNLZ0QsS0FBbUJELEVBQVUsUUFBUSxDQUFDLG9CQUFvQixrQkFBa0IsQ0FBQyxHQUM3RUUsS0FBc0JqRCxFQUFFLE9BQU8sRUFBRSxNQUFNZ0QsR0FBaUIsQ0FBQyxHQUN6REUsS0FBaUJILEVBQVUsUUFBUSxDQUFDLFFBQVEsU0FBUyxRQUFRLENBQUMsR0FDOURJLEtBQW9CbkQsRUFBRSxPQUFPO0FBQUEsRUFDakMsTUFBTWtEO0FBQUEsRUFDTixhQUFhVjtBQUFBLEVBQ2IsUUFBUXhDLEVBQUUsTUFBTUEsRUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTO0FBQ3ZDLENBQUMsR0FDS29ELEtBQWlCTCxFQUFVLFFBQVEsQ0FBQyxjQUFjLGtCQUFrQixnQkFBZ0IsQ0FBQyxHQUNyRk0sS0FBb0JyRCxFQUFFLE9BQU87QUFBQSxFQUNqQyxNQUFNb0Q7QUFBQSxFQUNOLFNBQVNyQjtBQUFBLEVBQ1QsU0FBUy9CLEVBQUUsT0FBT0EsRUFBRSxPQUFPLEdBQUdBLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUztBQUNyRCxDQUFDLEdBQ0tzRCxLQUEyQlAsRUFBVSxRQUFRLENBQUMsa0JBQWtCLENBQUMsR0FDakVRLEtBQThCdkQsRUFBRSxPQUFPO0FBQUEsRUFDM0MsTUFBTXNEO0FBQUEsRUFDTixhQUFhYjtBQUFBLEVBQ2IsUUFBUXpDLEVBQUUsTUFBTUEsRUFBRSxPQUFPLENBQUM7QUFDNUIsQ0FBQyxHQUNLd0QsS0FBcUJ4RCxFQUFFLE9BQU87QUFBQSxFQUNsQyxNQUFNQSxFQUFFLFFBQVErQyxFQUFVLEtBQUssTUFBTTtBQUFBLEVBQ3JDLFFBQVFoQjtBQUNWLENBQUMsR0FDSzBCLEtBQXFCekQsRUFBRSxPQUFPO0FBQUEsRUFDbEMsTUFBTUEsRUFBRSxRQUFRK0MsRUFBVSxLQUFLLE1BQU07QUFBQSxFQUNyQyxXQUFXaEI7QUFBQSxFQUNYLGtCQUFrQi9CLEVBQUUsT0FBTztBQUFBLEVBQzNCLFVBQVVnQztBQUFBLEVBQ1Ysd0JBQXdCaEMsRUFBRSxNQUFNNkMsRUFBdUI7QUFDekQsQ0FBQyxHQUNLYSxLQUFpQzFELEVBQUUsT0FBTztBQUFBLEVBQzlDLE1BQU1BLEVBQUUsUUFBUStDLEVBQVUsS0FBSyxvQkFBb0I7QUFBQSxFQUNuRCxvQkFBb0IvQyxFQUFFLE9BQU9BLEVBQUUsT0FBTyxHQUFHQSxFQUFFLElBQUksQ0FBQztBQUFBLEVBQ2hELHFCQUFxQkEsRUFBRSxJQUFJLEVBQUUsU0FBUztBQUFBLEVBQ3RDLGlCQUFpQkEsRUFBRSxTQUFTQSxFQUFFLE9BQU9BLEVBQUUsT0FBTyxHQUFHQSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNELENBQUMsR0FDSzJELEtBQW1DM0QsRUFBRSxPQUFPO0FBQUEsRUFDaEQsTUFBTUEsRUFBRSxRQUFRK0MsRUFBVSxLQUFLLDRCQUE0QjtBQUFBLEVBQzNELGlCQUFpQi9DLEVBQUUsT0FBTztBQUM1QixDQUFDLEdBQ0s0RCxLQUFxQjVELEVBQUUsT0FBTztBQUFBLEVBQ2pDLFdBQStCK0I7QUFBQSxFQUMvQixVQUE2QkE7QUFBQSxFQUM3QixPQUFzQkE7QUFBQSxFQUN0QixTQUEyQkE7QUFBQSxFQUMzQixTQUEwQkE7QUFBQSxFQUMxQixlQUF1Q0M7QUFDMUMsQ0FBQyxHQUNLNkIsS0FBZTdELEVBQUUsT0FBTztBQUFBLEVBQzNCLE9BQXNCK0I7QUFBQSxFQUN0QixTQUEyQkE7QUFBQSxFQUMzQixTQUEwQkE7QUFBQSxFQUMxQixlQUF1Q0M7QUFDMUMsQ0FBQyxHQUNLOEIsS0FBa0JmLEVBQVUsUUFBUSxDQUFDLFlBQVksWUFBWSxvQkFBb0IsQ0FBQyxHQUNsRmdCLEtBQXFCL0QsRUFBRSxPQUFPO0FBQUEsRUFDbEMsTUFBTThEO0FBQUEsRUFDTixXQUFXL0I7QUFBQSxFQUNYLHVCQUF1QmM7QUFBQSxFQUN2QixxQkFBcUI3QyxFQUFFLElBQUksRUFBRSxTQUFTO0FBQUEsRUFDdEMsc0JBQXNCQSxFQUFFLFFBQVEsRUFBRSxTQUFTO0FBQUEsRUFDM0MsZ0JBQWdCZ0M7QUFDbEIsQ0FBQyxFQUFFLE9BQU80QixHQUFtQixLQUFLLEdBQzVCSSxLQUE4QmhFLEVBQUUsT0FBTztBQUFBLEVBQzNDLE1BQU1BLEVBQUUsUUFBUStDLEVBQVUsS0FBSyxnQkFBZ0I7QUFBQSxFQUMvQyxvQkFBb0IvQyxFQUFFLFFBQVE7QUFDaEMsQ0FBQyxHQUNLaUUsS0FBOEJqRSxFQUFFLE9BQU87QUFBQSxFQUMzQyxNQUFNQSxFQUFFLFFBQVErQyxFQUFVLEtBQUssZ0JBQWdCO0FBQUEsRUFDL0MsYUFBYS9DLEVBQUUsTUFBTUEsRUFBRSxPQUFPLENBQUM7QUFBQSxFQUMvQixpQkFBaUJBLEVBQUUsTUFBTUEsRUFBRSxPQUFPLENBQUM7QUFBQSxFQUNuQyxZQUFZQSxFQUFFLE9BQU87QUFDdkIsQ0FBQyxHQUNLa0UsS0FBZWxFLEVBQUUsbUJBQW1CLFFBQVE7QUFBQSxFQUNoRGlEO0FBQUEsRUFDQUU7QUFBQSxFQUNBRTtBQUFBLEVBQ0FFO0FBQUEsRUFDQUM7QUFBQSxFQUNBQztBQUFBLEVBQ0FNO0FBQUEsRUFDQUM7QUFBQSxFQUNBQztBQUFBLEVBQ0FQO0FBQUEsRUFDQUM7QUFDRixDQUFDLEdBQ0tRLEtBQWVuRSxFQUFFLE9BQU87QUFBQSxFQUM1QixTQUFTa0U7QUFBQSxFQUNULE9BQU9uQztBQUFBLEVBQ1AsUUFBUUE7QUFBQSxFQUNSLFdBQVdBO0FBQ2IsQ0FBQztBQUNEL0IsRUFBRSxPQUFPO0FBQUEsRUFDUCxZQUFZQSxFQUFFLE9BQU87QUFBQSxFQUNyQixVQUFVK0I7QUFDWixDQUFDO0FBQ0QvQixFQUFFLE9BQU87QUFBQSxFQUNQLGNBQWNBLEVBQUUsT0FBTztBQUFBLEVBQ3ZCLGdCQUFnQkEsRUFBRSxPQUFPLEVBQUUsU0FBUztBQUN0QyxDQUFDO0FBQ0RBLEVBQUUsT0FBTztBQUFBLEVBQ1AsY0FBY0EsRUFBRSxPQUFPO0FBQUEsRUFDdkIsbUJBQW1CaUMsR0FBZ0JqQyxFQUFFLE9BQU8sQ0FBQztBQUMvQyxDQUFDO0FBQ0QsTUFBTW9FLEtBQTZCcEUsRUFBRSxPQUFPO0FBQUEsRUFDMUMsaUJBQWlCQSxFQUFFLE1BQU04QyxFQUFvQjtBQUMvQyxDQUFDLEdBQ0t1QixLQUF1QnJFLEVBQUUsT0FBTztBQUFBLEVBQ3BDLGFBQWFBLEVBQUUsT0FBTztBQUFBLEVBQ3RCLFFBQVFBLEVBQUUsTUFBTUEsRUFBRSxPQUFPLENBQUM7QUFDNUIsQ0FBQztBQUNEQSxFQUFFLE9BQU87QUFBQSxFQUNQLFlBQVlBLEVBQUUsT0FBTztBQUN2QixDQUFDO0FBQ0QsTUFBTXNFLEtBQTRCdEUsRUFBRSxPQUFPO0FBQUEsRUFDekMsU0FBU0EsRUFBRSxRQUFRLEVBQUs7QUFBQSxFQUN4QixZQUFZQSxFQUFFLFFBQVEsa0JBQWtCO0FBQUEsRUFDeEMsUUFBUUEsRUFBRSxNQUFNcUUsRUFBb0I7QUFDdEMsQ0FBQyxHQUNLRSxLQUF1QnZFLEVBQUUsbUJBQW1CLFdBQVc7QUFBQSxFQUMzREEsRUFBRSxPQUFPLEVBQUUsU0FBU0EsRUFBRSxRQUFRLEVBQUksRUFBRSxDQUFDO0FBQUEsRUFDckNzRTtBQUNGLENBQUM7QUFDRHRFLEVBQUUsT0FBTztBQUFBLEVBQ1AsWUFBWUEsRUFBRSxPQUFPO0FBQUEsRUFDckIseUJBQXlCNkM7QUFBQSxFQUN6QixxQkFBcUJlO0FBQUEsRUFDckIsMkJBQTJCNUQsRUFBRSxRQUFRLEVBQUUsU0FBUztBQUFBLEVBQ2hELG1CQUFtQmlDLEdBQWdCakMsRUFBRSxPQUFPLENBQUM7QUFDL0MsQ0FBQztBQUNEQSxFQUFFLE9BQU87QUFBQSxFQUNQLFlBQVlBLEVBQUUsT0FBTztBQUFBLEVBQ3JCLHlCQUF5QjZDO0FBQUEsRUFDekIscUJBQXFCZTtBQUN2QixDQUFDO0FBQ0QsSUFBSVksS0FBaUMsa0JBQUNDLE9BQ3BDQSxFQUFlLFVBQWEsV0FDNUJBLEVBQWUsVUFBYSxXQUM1QkEsRUFBZSxZQUFlLGFBQ3ZCQSxJQUNORCxNQUFpQixDQUFDLENBQUM7QUFDdEIsTUFBTUUsS0FBd0IxRSxFQUFFLE9BQU87QUFBQSxFQUNyQyxRQUFRQSxFQUFFLEtBQUs7QUFBQSxJQUFDO0FBQUEsSUFBeUI7QUFBQSxJQUF5QjtBQUFBO0FBQUEsRUFBMkIsQ0FBQztBQUNoRyxDQUFDLEdBQ0syRSxLQUE4QjNFLEVBQUUsT0FBTztBQUFBLEVBQzNDLE1BQU1BLEVBQUUsT0FBTztBQUFBLEVBQ2YsY0FBY0EsRUFBRSxPQUFPO0FBQUEsRUFDdkIsbUJBQW1CQSxFQUFFLE9BQU87QUFBQSxFQUM1QixZQUFZQSxFQUFFLE9BQU87QUFDdkIsQ0FBQyxHQUVLNEUsS0FBd0IsQ0FBQzlDLE1BQVU7QUFDdkMsUUFBTStDLElBQWlCLENBQUM7QUFDeEIsZ0JBQU8sUUFBUS9DLENBQUssRUFBRSxRQUFRLENBQUMsQ0FBQ2YsR0FBSytELENBQUssTUFBTTtBQUM5QyxRQUFJO0FBQ0YsWUFBTUMsSUFBWTFDLEdBQWMsTUFBTXRCLENBQUc7QUFDekMsTUFBSSxNQUFNLFFBQVErRCxDQUFLLElBQ3JCRCxFQUFlRSxDQUFTLElBQUlELElBQ25CLE1BQU0sUUFBUUEsRUFBTSxPQUFPLE1BQ3BDRCxFQUFlRSxDQUFTLElBQUlELEVBQU07QUFBQSxJQUV0QyxRQUFRO0FBQ047QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDLEdBQ01EO0FBQ1QsR0FFTUcsS0FBOEJoRixFQUFFLE9BQU87QUFBQSxFQUMzQyxXQUFXQSxFQUFFLE9BQU87QUFBQSxFQUNwQixlQUFlQSxFQUFFLE9BQU87QUFBQSxFQUN4QixjQUFjQSxFQUFFLE9BQU87QUFDekIsQ0FBQyxHQUNLaUYsS0FBbUNqRixFQUFFLE9BQU87QUFBQSxFQUNoRCxNQUFNQSxFQUFFLE9BQU87QUFBQSxFQUNmLGVBQWVBLEVBQUUsT0FBTztBQUFBLEVBQ3hCLFdBQVdBLEVBQUUsT0FBTztBQUN0QixDQUFDLEdBQ0trRixLQUFzQjtBQUFBLEVBQzFCLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFDUCxHQUNNQyxLQUFrQixPQUFPQyxNQUFtQjtBQUNoRCxXQUFTQyxJQUFJLEdBQUdBLElBQUksSUFBSUE7QUFDdEIsSUFBS0MsR0FBa0IsS0FDckIsTUFBTUMsR0FBTSxHQUFHO0FBR25CLE1BQUksQ0FBQ0QsR0FBa0I7QUFDckIsa0JBQVEsSUFBSSxzQkFBc0IsR0FDNUIsSUFBSSxNQUFNLHNCQUFzQjtBQUd4QyxTQURlLElBQUksT0FBT0YsQ0FBYztBQUUxQyxHQUNNSSxLQUF1QixPQUFPQyxHQUFjQyxNQUFvQjtBQUNwRSxRQUFNQyxJQUFTLE1BQU1SLEdBQWdCTSxDQUFZO0FBQ2pELFNBQU87QUFBQSxJQUNMLFVBQVVFLEVBQU8sU0FBU0QsQ0FBZTtBQUFBLElBQ3pDLFFBQUFDO0FBQUEsRUFDRjtBQUNGLEdBQ01DLEtBQTZCLE9BQU9ILEdBQWNJLEdBQWlCQyxHQUFVQyxHQUFpQkMsTUFBZTtBQUNqSCxVQUFRLElBQUlBLENBQVU7QUFDdEIsUUFBTUwsSUFBUyxNQUFNUixHQUFnQk0sQ0FBWSxHQUMzQ1EsSUFBaUJmLEdBQW9CWSxFQUFTLFlBQVksRUFBRSxLQUFLLENBQUM7QUFjeEUsU0FidUJILEVBQU8sZUFBZTtBQUFBO0FBQUEsSUFFM0MsU0FBUztBQUFBLElBQ1QsVUFBVU07QUFBQSxJQUNWLE9BQU87QUFBQSxNQUNMLE9BQU87QUFBQSxNQUNQLFFBQVFKO0FBQUEsTUFDUixTQUFTRTtBQUFBLElBQ1g7QUFBQSxJQUNBLGtCQUFrQjtBQUFBLElBQ2xCLG1CQUFtQjtBQUFBLElBQ25CLGdCQUFnQixDQUFDO0FBQUEsRUFDbkIsQ0FBQztBQUVILEdBQ01SLEtBQVEsQ0FBQ1csTUFDTixJQUFJLFFBQVEsQ0FBQ0MsTUFBWTtBQUM5QixhQUFXQSxHQUFTRCxDQUFTO0FBQy9CLENBQUMsR0FFR1osS0FBb0IsTUFDakIsWUFBWSxRQUVmYyxLQUFnQyxPQUFPQyxNQUNwQyxJQUFJLFFBQVEsQ0FBQ0YsR0FBU0csTUFBVztBQUN0QyxNQUFJO0FBQ0YsSUFBQUQsRUFBZSxHQUFHLGlCQUFpQixPQUFPRSxNQUFRO0FBQ2hELE1BQUFKLEVBQVFJLENBQUc7QUFBQSxJQUNiLENBQUMsR0FDREYsRUFBZSxHQUFHLFVBQVUsTUFBTTtBQUNoQyxNQUFBQyxFQUFPLElBQUksTUFBTSxxREFBcUQsQ0FBQztBQUFBLElBQ3pFLENBQUM7QUFBQSxFQUNILFNBQVNFLEdBQUc7QUFDVixJQUFBRixFQUFPRSxDQUFDO0FBQUEsRUFDVjtBQUNGLENBQUMsR0FFR0MsS0FBc0MsT0FBT0MsR0FBU0MsTUFBYTtBQUN2RSxRQUFNQyxJQUFxQkYsRUFBUTtBQUNuQyxNQUFJLENBQUNBLEVBQVEsdUJBQXVCLENBQUNBLEVBQVEsb0JBQW9CO0FBQy9ELFVBQU0sSUFBSSxNQUFNLHlDQUF5QyxLQUFLLFVBQVVBLEVBQVEsbUJBQW1CLENBQUMsRUFBRTtBQUV4RyxNQUFJLENBQUNFLEVBQW1CLGFBQWEsQ0FBQ0EsRUFBbUI7QUFDdkQsVUFBTSxJQUFJLE1BQU0sd0NBQXdDLEtBQUssVUFBVUEsQ0FBa0IsQ0FBQyxFQUFFO0FBRTlGLE1BQUlELEVBQVMsY0FBYyxPQUFPRCxFQUFRLG9CQUFvQjtBQUM1RCxVQUFNLElBQUksTUFBTSxtQkFBbUJDLEVBQVMsY0FBYyxFQUFFLE9BQU9ELEVBQVEsb0JBQW9CLFVBQWEsRUFBRTtBQUdoSCxRQUFNRyxJQUFnQixPQURQLE1BQU0xQixHQUFnQnlCLEVBQW1CLFNBQVMsR0FDOUIsaUJBQWlCQSxFQUFtQixlQUFlO0FBQUEsSUFDcEYsZ0JBQWdCRixFQUFRLG9CQUFvQjtBQUFBLEVBQzlDLENBQUM7QUFDRCxNQUFJRyxFQUFjO0FBQ2hCLFVBQUFGLEVBQVMsU0FBUyxNQUFNLEdBQ2xCLElBQUksTUFBTSxtQkFBbUJFLEVBQWMsTUFBTSxXQUFXLFNBQVMsRUFBRTtBQUU3RSxFQUFBRixFQUFTLFNBQVMsU0FBUztBQUUvQixHQUNNRyxLQUFvQixPQUFPRixHQUFvQkQsTUFBYTtBQUNoRSxNQUFJLENBQUNDLEVBQW1CLGFBQWEsQ0FBQ0EsRUFBbUI7QUFDdkQsVUFBTSxJQUFJLE1BQU0sd0NBQXdDLEtBQUssVUFBVUEsQ0FBa0IsQ0FBQyxFQUFFO0FBRzlGLFFBQU1DLElBQWdCLE9BRFAsTUFBTTFCLEdBQWdCeUIsRUFBbUIsU0FBUyxHQUM5QixpQkFBaUJBLEVBQW1CLGVBQWU7QUFBQSxJQUNwRixnQkFBZ0JELEVBQVMsY0FBYztBQUFBLEVBQ3pDLENBQUM7QUFDRCxNQUFJRSxFQUFjO0FBQ2hCLFVBQUFGLEVBQVMsU0FBUyxNQUFNLEdBQ2xCLElBQUksTUFBTSxtQkFBbUJFLEVBQWMsTUFBTSxXQUFXLFNBQVMsRUFBRTtBQUU3RSxTQUFBRixFQUFTLFNBQVMsU0FBUyxHQUV0QkU7QUFDVCxHQUNNRSxLQUEyQixPQUFPTCxNQUFZO0FBQ2xELFFBQU1FLElBQXFCNUIsR0FBNEIsTUFBTTBCLEVBQVEsa0JBQWtCO0FBQ3ZGLFFBQU1NLEdBQTBCSixDQUFrQjtBQUNwRCxHQUNNSSxLQUE0QixPQUFPSixNQUF1QjtBQXhkaEUsTUFBQUssR0FBQUMsR0FBQUMsR0FBQUM7QUEwZEUsUUFBTVAsSUFBZ0IsT0FEUCxNQUFNMUIsR0FBZ0J5QixFQUFtQixTQUFTLEdBQzlCLGlCQUFpQkEsRUFBbUIsZUFBZTtBQUFBLElBQ3BGLGdCQUFnQkEsRUFBbUI7QUFBQSxFQUNyQyxDQUFDLEdBQ0tTLEtBQWVKLElBQUFKLEVBQWMsZ0JBQWQsZ0JBQUFJLEVBQTJCO0FBQ2hELE1BQUlJLE1BQWlCO0FBQ25CLFlBQVEsSUFBSSx3QkFBd0JULEVBQW1CLFlBQVksR0FDbkUsUUFBUSxJQUFJLCtCQUErQkMsRUFBYyxXQUFXO0FBQUEsTUFDL0QsT0FBSVEsTUFBaUIsYUFDcEIsSUFBSSxNQUFNLHFEQUFxRCxJQUUvRCxJQUFJO0FBQUEsSUFDUixLQUFHSCxJQUFBTCxFQUFjLFVBQWQsZ0JBQUFLLEVBQXFCLGNBQVdFLEtBQUFELElBQUFOLEVBQWMsZ0JBQWQsZ0JBQUFNLEVBQTJCLHFCQUEzQixnQkFBQUMsRUFBNkMsWUFBVyxtREFBbUQ7QUFBQSxFQUNoSjtBQUVKLEdBRU1FLEtBQTZCLENBQUNDLE1BQ1QsS0FBSyxVQUFVQSxDQUFNLEdBSTFDQyxLQUEyQixDQUFDQyxHQUFTQyxNQUNsQixNQUFNLEtBQUtELEVBQVEsaUJBQWlCLGFBQWEsS0FBSyxDQUFDLENBQUMsRUFDOUMsT0FBTyxDQUFDRSxHQUFLQyxNQUFVO0FBQ3RELFFBQU03RyxJQUFNNkcsRUFBTSxhQUFhLFdBQVc7QUFDMUMsU0FBSzdHLElBQ0UsRUFBRSxHQUFHNEcsR0FBSyxDQUFDNUcsQ0FBRyxHQUFHNkcsRUFBTSxNQUFNLElBRG5CRDtBQUVuQixHQUFHRCxLQUFlLENBQUMsQ0FBQyxHQUdoQkcsS0FBOEIsQ0FBQ0MsR0FBV0MsR0FBV04sR0FBU08sR0FBbUJDLEdBQXVCQyxHQUFzQkMsTUFBd0I7QUFDMUosUUFBTUMsSUFBWVosR0FBeUJDLEdBQVM7QUFBQSxJQUNsRCxNQUFNSztBQUFBLElBQ04sV0FBQUM7QUFBQSxJQUNBLHVCQUFBRTtBQUFBLElBQ0EscUJBQUFFO0FBQUEsSUFDQSxzQkFBQUQ7QUFBQSxFQUNGLENBQUM7QUFDRCxVQUFRLElBQUksdUJBQXVCSixDQUFTLGFBQWEsS0FBSyxVQUFVTSxDQUFTLENBQUMsSUFDOUVILEVBQXNCLGFBQWEsZUFBZUEsRUFBc0IsYUFBYSxnQkFBZ0JBLEVBQXNCLGFBQWEsbUJBQ3JJRyxFQUFVakcsRUFBVSxRQUFRLE1BQy9CLFFBQVEsSUFBSSxvRkFBb0YsR0FDaEdpRyxFQUFVakcsRUFBVSxRQUFRLElBQUk7QUFHcEMsUUFBTXVFLElBQVUzQyxHQUFtQixVQUFVcUUsQ0FBUztBQUN0RCxNQUFLMUIsRUFBUTtBQVNYLG1CQUFRLElBQUksK0JBQStCLEtBQUssVUFBVUEsRUFBUSxJQUFJLENBQUMsR0FDaEVBLEVBQVE7QUFWSztBQUNwQixVQUFNMkIsSUFBWTNCLEVBQVEsTUFBTSxPQUFPLEdBQ2pDNEIsSUFBUzFELEdBQXNCeUQsQ0FBUztBQUM5QyxlQUFXLENBQUN0RCxHQUFXekQsQ0FBTSxLQUFLLE9BQU8sUUFBUWdILENBQU07QUFDckQsTUFBQU4sRUFBa0JqRCxHQUFXekQsR0FBUXlELENBQVM7QUFFaEQsbUJBQVEsSUFBSSx1Q0FBdUMyQixFQUFRLElBQUksR0FDeEQ7QUFBQSxFQUNUO0FBSUYsR0FDTTZCLEtBQW9CLENBQUNDLE1BQWM7QUFDdkMsTUFBSTtBQUNGLFdBQU9yRSxHQUFhLE1BQU1xRSxDQUFTO0FBQUEsRUFDckMsU0FBUzFHLEdBQU87QUFDZCxrQkFBUSxNQUFNLGdDQUFnQzBHLEdBQVcxRyxDQUFLLEdBQ3hEQTtBQUFBLEVBQ1I7QUFDRixHQUNNMkcsS0FBWSxDQUFDQyxHQUFRQyxHQUFRQyxHQUFXbEMsR0FBU21DLE1BQVk7QUFDakUsUUFBTUMsSUFBUTtBQUFBLElBQ1osU0FBQXBDO0FBQUEsSUFDQSxPQUFPekcsR0FBRztBQUFBLElBQ1YsUUFBQTBJO0FBQUEsSUFDQSxXQUFBQztBQUFBLEVBQ0Y7QUFDQSxVQUFRLElBQUksU0FBU0QsQ0FBTSw0QkFBNEJDLENBQVMsS0FBS0UsQ0FBSyxHQUMxRUosRUFBTyxZQUFZLEtBQUssVUFBVUksQ0FBSyxHQUFHRCxDQUFPO0FBQ25ELEdBRU1FLEtBQWtDLE9BQU92SCxNQUFRO0FBQ3JELE1BQUksT0FBT0EsS0FBUSxZQUFZLENBQUNBLEVBQUssUUFBTztBQUM1QyxNQUFJO0FBQ0YsVUFBTXdILElBQU8sRUFBRSxNQUFNLE9BQU8sR0FDdEJDLElBQVMsTUFBTXpILEVBQUksS0FBS3dILENBQUk7QUFDbEMsUUFBSUMsTUFBVztBQUNiLFlBQU0sSUFBSSxNQUFNLG1DQUFtQyxLQUFLLFVBQVVBLENBQU0sQ0FBQyxFQUFFO0FBRTdFLFdBQU87QUFBQSxFQUNULFNBQVN6QyxHQUFHO0FBQ1YsbUJBQVEsTUFBTSxpQ0FBaUNBLENBQUMsR0FDekM7QUFBQSxFQUNUO0FBQ0YsR0FDTTBDLEtBQWdCLENBQUMxSCxHQUFLMkgsTUFDbkIsQ0FBQyxDQUFDM0gsS0FBTzJIO0FBRWxCLGVBQWVDLEdBQW9CQyxHQUFRO0FBS3pDLFFBQU1DLElBQWdCLE1BSkhwSixHQUFlO0FBQUEsSUFDaEMsUUFBQW1KO0FBQUEsSUFDQSxPQUFPO0FBQUEsRUFDVCxDQUFDLEVBQ3NDLFNBQ2pDRSxJQUFnQixNQUFNUixHQUFnQ08sQ0FBYTtBQUN6RSxNQUFJLENBQUNKLEdBQWNJLEdBQWVDLENBQWE7QUFDN0MsVUFBTSxJQUFJLE1BQU0sbUNBQW1DO0FBRXJELFNBQU9EO0FBQ1Q7QUFFQSxNQUFNRSxJQUFnQixDQUFDdEgsTUFBVWxDLEVBQUUsU0FBU2tDLEVBQU0sU0FBUyxDQUFDO0FBQzVEbEMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksR0FBRyxFQUFFLFNBQVMsa0JBQWtCLENBQUM7QUFDdkQsTUFBTXlKLEtBQW1CekosRUFBRSxPQUFPO0FBQUEsRUFDaEMsbUJBQW1CQSxFQUFFLFFBQVEsT0FBTztBQUFBLEVBQ3BDLFNBQVNBLEVBQUUsT0FBTztBQUFBLEVBQ2xCLFNBQVNBLEVBQUUsT0FBT0EsRUFBRSxPQUFPLEdBQUdBLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUztBQUNyRCxDQUFDO0FBQ0RBLEVBQUUsS0FBSyxDQUFDLE9BQU8sS0FBSyxDQUFDO0FBQ3JCLE1BQU0wSixLQUFnQjFKLEVBQUUsT0FBTztBQUFBLEVBQzdCLE1BQU1BLEVBQUUsT0FBTztBQUFBLEVBQ2YsaUJBQWlCd0osRUFBY3hKLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDekMsYUFBYXdKLEVBQWN4SixFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ3JDLFVBQVV3SixFQUFjeEosRUFBRSxPQUFPLENBQUM7QUFBQSxFQUNsQyxVQUFVQSxFQUFFLE9BQU87QUFBQSxFQUNuQixvQkFBb0J3SixFQUFjeEosRUFBRSxPQUFPLENBQUM7QUFDOUMsQ0FBQyxHQUNLMkosS0FBVzNKLEVBQUUsT0FBTztBQUFBLEVBQ3hCLHNCQUFzQkEsRUFBRSxPQUFPLEVBQUUsSUFBSTtBQUFBLEVBQ3JDLG1CQUFtQkEsRUFBRSxPQUFPLEVBQUUsSUFBSTtBQUFBLEVBQ2xDLFVBQVVBLEVBQUUsT0FBTztBQUFBLEVBQ25CLGFBQWF3SixFQUFjeEosRUFBRSxPQUFPLENBQUM7QUFBQSxFQUNyQyxVQUFVQSxFQUFFLE9BQU87QUFBQSxFQUNuQixrQkFBa0J3SixFQUFjeEosRUFBRSxPQUFPLENBQUM7QUFBQSxFQUMxQyx3QkFBd0J3SixFQUFjeEosRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDO0FBQUEsRUFDdEQsVUFBVUEsRUFBRSxPQUFPLEVBQUUsSUFBSTtBQUMzQixDQUFDLEdBQ0s0SixLQUFnQjVKLEVBQUUsT0FBT0EsRUFBRSxPQUFPLEdBQUdBLEVBQUUsSUFBSSxDQUFDLEdBQzVDNkosS0FBUTdKLEVBQUUsT0FBTztBQUFBLEVBQ3JCLE1BQU1BLEVBQUUsT0FBTztBQUFBLEVBQ2YsVUFBVXdKLEVBQWNJLEVBQWE7QUFDdkMsQ0FBQyxHQUNLRSxLQUF3QjlKLEVBQUUsT0FBTztBQUFBLEVBQ3JDLFVBQVVBLEVBQUUsT0FBTztBQUFBLEVBQ25CLGdCQUFnQndKLEVBQWN4SixFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ3hDLFVBQVV3SixFQUFjeEosRUFBRSxPQUFPQSxFQUFFLE9BQU8sR0FBR0EsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2RCxDQUFDLEdBQ0srSixLQUEwQi9KLEVBQUUsT0FBTztBQUFBLEVBQ3ZDLFVBQVVBLEVBQUUsT0FBTztBQUNyQixDQUFDLEdBQ0tnSyxLQUFzQmhLLEVBQUUsT0FBTztBQUFBLEVBQ25DLElBQUl3SixFQUFjeEosRUFBRSxPQUFPLENBQUM7QUFBQSxFQUM1QixrQkFBa0J3SixFQUFjeEosRUFBRSxPQUFPLENBQUM7QUFBQSxFQUMxQyx3QkFBd0J3SixFQUFjeEosRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDO0FBQUEsRUFDdEQsb0JBQW9CQSxFQUFFLE1BQU0rSixFQUF1QjtBQUFBLEVBQ25ELGFBQWFQLEVBQWN4SixFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ3JDLFdBQVd3SixFQUFjeEosRUFBRSxPQUFPLENBQUM7QUFDckMsQ0FBQyxHQUNLaUssS0FBb0NqSyxFQUFFLE9BQU87QUFBQSxFQUNqRCxhQUFhQSxFQUFFLE9BQU87QUFDeEIsQ0FBQyxHQUNLa0ssS0FBeUJsSyxFQUFFLE9BQU87QUFBQSxFQUN0QyxhQUFhQSxFQUFFLE9BQU87QUFBQSxFQUN0QiwwQ0FBMENBLEVBQUUsT0FBTztBQUFBLEVBQ25ELFVBQVVBLEVBQUUsT0FBTztBQUFBLEVBQ25CLHVCQUF1QkEsRUFBRSxNQUFNaUssRUFBaUM7QUFBQSxFQUNoRSxzQkFBc0JqSyxFQUFFLE9BQU87QUFDakMsQ0FBQyxHQUNLbUssS0FBa0JuSyxFQUFFLE9BQU87QUFBQSxFQUMvQixRQUFRMEo7QUFDVixDQUFDLEdBQ0tVLEtBQWlCcEssRUFBRSxPQUFPO0FBQUEsRUFDOUIsVUFBVUEsRUFBRSxPQUFPO0FBQUEsRUFDbkIsV0FBV0EsRUFBRSxNQUFNbUssRUFBZTtBQUFBLEVBQ2xDLG9CQUFvQlgsRUFBY3hKLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDNUMsT0FBT0EsRUFBRSxNQUFNa0ssRUFBc0I7QUFBQSxFQUNyQyx1QkFBdUJsSyxFQUFFLE9BQU87QUFBQSxFQUNoQyxpQkFBaUJBLEVBQUUsT0FBTztBQUFBLEVBQzFCLG1CQUFtQkEsRUFBRSxPQUFPO0FBQUEsRUFDNUIsNkJBQTZCQSxFQUFFLE1BQU1pSyxFQUFpQztBQUN4RSxDQUFDLEdBQ0tJLEtBQW9DckssRUFBRSxPQUFPO0FBQUEsRUFDakQsU0FBU0EsRUFBRSxNQUFNZ0ssRUFBbUI7QUFBQSxFQUNwQyxVQUFVaEssRUFBRSxNQUFNb0ssRUFBYztBQUNsQyxDQUFDLEdBQ0tFLEtBQTBCdEssRUFBRSxPQUFPO0FBQUEsRUFDdkMsU0FBU3FLO0FBQUEsRUFDVCxvQkFBb0JiLEVBQWNhLEVBQWlDO0FBQUEsRUFDbkUsU0FBU3JLLEVBQUUsTUFBTTBKLEVBQWE7QUFDaEMsQ0FBQyxHQUNLYSxLQUE0QnZLLEVBQUUsT0FBTztBQUFBLEVBQ3pDLFFBQVFBLEVBQUUsUUFBUSxNQUFNO0FBQUEsRUFDeEIsT0FBT0EsRUFBRSxPQUFPO0FBQUEsRUFDaEIsT0FBT3dKLEVBQWN4SixFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQy9CLFlBQVlBLEVBQUUsTUFBTTJKLEVBQVE7QUFBQSxFQUM1QixzQkFBc0IzSixFQUFFLE9BQU8sRUFBRSxJQUFJO0FBQUEsRUFDckMsbUJBQW1CQSxFQUFFLE9BQU8sRUFBRSxJQUFJO0FBQUEsRUFDbEMsT0FBTzZKO0FBQUEsRUFDUCxjQUFjTCxFQUFjYyxFQUF1QjtBQUFBO0FBQUEsRUFFbkQsbUJBQW1CdEssRUFBRSxNQUFNOEosRUFBcUI7QUFDbEQsQ0FBQyxHQUNLVSxLQUFxQnhLLEVBQUUsbUJBQW1CLFFBQVE7QUFBQSxFQUN0REEsRUFBRSxPQUFPO0FBQUEsSUFDUCxNQUFNQSxFQUFFLFFBQVEsT0FBTztBQUFBLElBQ3ZCLFVBQVVBLEVBQUUsU0FBU0EsRUFBRSxVQUFVLENBQUM7QUFBQSxFQUNwQyxDQUFDLEVBQUUsT0FBT3VLLEdBQTBCLEtBQUs7QUFBQSxFQUN6Q3ZLLEVBQUUsT0FBTztBQUFBLElBQ1AsTUFBTUEsRUFBRSxLQUFLLENBQUMsV0FBVyxjQUFjLENBQUM7QUFBQSxJQUN4QyxVQUFVQSxFQUFFLE9BQU87QUFBQSxFQUNyQixDQUFDLEVBQUUsT0FBT3VLLEdBQTBCLEtBQUs7QUFDM0MsQ0FBQyxHQUNLRSxLQUF1QnpLLEVBQUUsT0FBTztBQUFBLEVBQ3BDLFFBQVFBLEVBQUUsUUFBUSxVQUFVO0FBQzlCLENBQUMsR0FDSzBLLEtBQXFCMUssRUFBRSxPQUFPO0FBQUEsRUFDbEMsUUFBUUEsRUFBRSxRQUFRLFNBQVM7QUFDN0IsQ0FBQztBQUNEQSxFQUFFLE1BQU0sQ0FBQ3dLLElBQW9CQyxJQUFzQkMsRUFBa0IsQ0FBQztBQUN0RTFLLEVBQUUsT0FBTztBQUFBLEVBQ1AsTUFBTUEsRUFBRSxPQUFPO0FBQUEsRUFDZixNQUFNQSxFQUFFLE9BQU87QUFBQSxFQUNmLGVBQWVBLEVBQUUsT0FBTztBQUFBLEVBQ3hCLGlCQUFpQkEsRUFBRSxPQUFPO0FBQzVCLENBQUM7QUFDRCxNQUFNMkssS0FBMEIzSyxFQUFFLE9BQU87QUFBQSxFQUN2QyxjQUFjQSxFQUFFLE1BQU1BLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDaEMsa0JBQWtCQSxFQUFFLE1BQU1BLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDcEMsYUFBYUEsRUFBRSxPQUFPO0FBQ3hCLENBQUM7QUFDREEsRUFBRSxPQUFPO0FBQUEsRUFDUCxjQUFjQSxFQUFFLE9BQU87QUFBQSxFQUN2QixlQUFlQSxFQUFFLElBQUk7QUFBQTtBQUFBLEVBRXJCLGdCQUFnQkEsRUFBRSxPQUFPO0FBQUEsRUFDekIsbUJBQW1CQSxFQUFFLE9BQU87QUFBQSxFQUM1QixrQkFBa0JBLEVBQUUsT0FBTztBQUFBLEVBQzNCLFlBQVlBLEVBQUUsTUFBTTJKLEVBQVE7QUFBQSxFQUM1QixtQkFBbUIzSixFQUFFLE9BQU8sRUFBRSxJQUFJO0FBQUEsRUFDbEMsZUFBZUEsRUFBRSxRQUFRO0FBQUEsRUFDekIseUJBQXlCOEo7QUFBQSxFQUN6QixnQkFBZ0I5SixFQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsRUFDcEMsMkJBQTJCQSxFQUFFLFFBQVEsRUFBRSxTQUFTO0FBQ2xELENBQUM7QUFDRCxNQUFNNEssS0FBd0I1SyxFQUFFLE9BQU87QUFBQSxFQUNyQyxtQkFBbUJBLEVBQUUsT0FBTztBQUM5QixDQUFDO0FBQ0RBLEVBQUUsT0FBTztBQUFBLEVBQ1AsSUFBSUEsRUFBRSxPQUFPO0FBQUEsRUFDYixZQUFZQSxFQUFFLE9BQU87QUFDdkIsQ0FBQztBQUNELE1BQU02SyxLQUEwQjdLLEVBQUUsT0FBTztBQUFBLEVBQ3ZDLE1BQU1BLEVBQUUsT0FBTztBQUFBLEVBQ2YsS0FBS0EsRUFBRSxNQUFNQSxFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ3ZCLEtBQUtBLEVBQUUsT0FBTztBQUFBLEVBQ2QsS0FBS0EsRUFBRSxPQUFPO0FBQ2hCLENBQUM7QUFDREEsRUFBRSxNQUFNNkssRUFBdUI7QUFDL0I3SyxFQUFFLE9BQU87QUFBQSxFQUNQLG9CQUFvQkEsRUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLEVBQ3hDLHNCQUFzQkEsRUFBRSxPQUFPQSxFQUFFLE9BQU8sR0FBR0EsRUFBRSxJQUFJLENBQUMsRUFBRSxTQUFTO0FBQUEsRUFDN0Qsa0JBQWtCQSxFQUFFLE9BQU87QUFBQSxFQUMzQix5QkFBeUI4SjtBQUFBLEVBQ3pCLG1CQUFtQjlKLEVBQUUsT0FBTyxFQUFFLFNBQVM7QUFBQSxFQUN2QyxzQkFBc0JBLEVBQUUsT0FBTyxFQUFFLFNBQVM7QUFDNUMsQ0FBQztBQUNELE1BQU04SyxLQUEyQjlLLEVBQUUsT0FBTztBQUFBLEVBQ3hDLHVCQUF1QkEsRUFBRSxNQUFNQSxFQUFFLE9BQU9BLEVBQUUsT0FBTyxHQUFHQSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFDREEsRUFBRSxPQUFPO0FBQUEsRUFDUCxRQUFRNkQ7QUFBQSxFQUNSLHVCQUF1QmlHO0FBQ3pCLENBQUM7QUFDRDlKLEVBQUUsT0FBTztBQUFBLEVBQ1AsWUFBWUEsRUFBRSxPQUFPO0FBQUEsRUFDckIscUJBQXFCNEQ7QUFBQSxFQUNyQix5QkFBeUJrRztBQUMzQixDQUFDO0FBQ0QsTUFBTWlCLEtBQWdDL0ssRUFBRSxPQUFPO0FBQUEsRUFDN0MsdUJBQXVCQSxFQUFFLE1BQU1BLEVBQUUsT0FBT0EsRUFBRSxPQUFPLEdBQUdBLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFBQSxFQUM1RCxVQUFVQSxFQUFFLE9BQU87QUFDckIsQ0FBQztBQUNEQSxFQUFFLE9BQU9BLEVBQUUsSUFBSSxDQUFDO0FBRWhCLE1BQU1nTCxLQUFNLENBQUNDLE1BQ0pBLEVBQUksT0FBTyxDQUFDQyxHQUFHQyxNQUFNRCxJQUFJQyxHQUFHLENBQUM7QUFHdEMsU0FBU0MsR0FBUzFDLEdBQVEyQyxHQUFXO0FBQ25DLE1BQUlDLElBQWlCLE9BQU87QUFDNUIsRUFBQUEsSUFBaUJBLEVBQWU1QyxHQUFRMkMsQ0FBUyxJQUFJM0MsRUFBTyxZQUFZMkM7QUFDMUU7QUFDQSxTQUFTRSxHQUFTN0MsR0FBUTlHLEdBQUk7QUFDNUIsRUFBSUEsTUFBTyxXQUNUQSxJQUFLOEcsRUFBTztBQUdkLE1BQUk4QyxJQUFvQixNQUFNO0FBQzlCLEVBQUFBLEtBQXFCQSxFQUFrQjlDLEdBQVE5RyxDQUFFO0FBQ25EO0FBRUEsSUFBSTZKLEtBQVksMkJBQVk7QUFDMUIsTUFBSUMsSUFBaUIsU0FBdUJDLEdBQUdSLEdBQUc7QUFDaEQsV0FBQU8sSUFBaUIsT0FBTyxrQkFBa0I7QUFBQSxNQUN4QyxXQUFXLENBQUM7QUFBQSxJQUNkLGFBQWEsU0FBUyxTQUFVQyxHQUFHUixHQUFHO0FBQ3BDLE1BQUFRLEVBQUUsWUFBWVI7QUFBQSxJQUNoQixLQUFLLFNBQVVRLEdBQUdSLEdBQUc7QUFDbkIsZUFBU1MsS0FBS1Q7QUFDWixRQUFJLE9BQU8sVUFBVSxlQUFlLEtBQUtBLEdBQUdTLENBQUMsTUFBR0QsRUFBRUMsQ0FBQyxJQUFJVCxFQUFFUyxDQUFDO0FBQUEsSUFFOUQsR0FFT0YsRUFBZUMsR0FBR1IsQ0FBQztBQUFBLEVBQzVCO0FBRUEsU0FBTyxTQUFVUSxHQUFHUixHQUFHO0FBQ3JCLFFBQUksT0FBT0EsS0FBTSxjQUFjQSxNQUFNLEtBQU0sT0FBTSxJQUFJLFVBQVUseUJBQXlCLE9BQU9BLENBQUMsSUFBSSwrQkFBK0I7QUFFbkksSUFBQU8sRUFBZUMsR0FBR1IsQ0FBQztBQUVuQixhQUFTVSxJQUFLO0FBQ1osV0FBSyxjQUFjRjtBQUFBLElBQ3JCO0FBRUEsSUFBQUEsRUFBRSxZQUFZUixNQUFNLE9BQU8sT0FBTyxPQUFPQSxDQUFDLEtBQUtVLEVBQUcsWUFBWVYsRUFBRSxXQUFXLElBQUlVLEVBQUc7QUFBQSxFQUNwRjtBQUNGLEVBQUUsR0FFRUMsS0FBYyxTQUFVQyxHQUFRO0FBQ2xDLEVBQUFOLEdBQVVLLEdBQWFDLENBQU07QUFFN0IsV0FBU0QsRUFBWUUsR0FBU0MsR0FBUztBQUNyQyxRQUFJQyxJQUFhLEtBQUssYUFFbEJDLElBQVFKLEVBQU8sS0FBSyxNQUFNQyxHQUFTQyxDQUFPLEtBQUs7QUFFbkQsa0JBQU8sZUFBZUUsR0FBTyxRQUFRO0FBQUEsTUFDbkMsT0FBT0QsRUFBVztBQUFBLE1BQ2xCLFlBQVk7QUFBQSxNQUNaLGNBQWM7QUFBQSxJQUNoQixDQUFDLEdBQ0RkLEdBQVNlLEdBQU9ELEVBQVcsU0FBUyxHQUNwQ1gsR0FBU1ksQ0FBSyxHQUNQQTtBQUFBLEVBQ1Q7QUFFQSxTQUFPTDtBQUNULEVBQUUsS0FBSztBQUVQLE1BQU1NLFdBQWlCTixHQUFZO0FBQUEsRUFDakMsWUFBWTNLLEdBQVU7QUFDcEIsVUFBTWtMLElBQWtCLG9DQUFvQ2xMLEVBQVMsT0FBTztBQUM1RSxVQUFNa0wsQ0FBZSxHQUNyQixLQUFLLFdBQVdsTDtBQUFBLEVBQ2xCO0FBQUEsRUFDQSxJQUFJLHVCQUF1QjtBQUN6QixXQUFPLEtBQUssU0FBUztBQUFBLEVBQ3ZCO0FBQ0Y7QUFDQSxNQUFNbUwsSUFBVyxPQUFPQyxHQUFTQyxHQUFNQyxNQUFtQjtBQUN4RCxVQUFRLElBQUksdURBQXVERCxFQUFLLE1BQU1ELENBQU87QUFDckYsUUFBTXBMLElBQVcsTUFBTW9MLEVBQVEsS0FBS0MsQ0FBSTtBQUV4QyxNQURBLFFBQVEsSUFBSSx1Q0FBdUNyTCxDQUFRLEdBQ3ZEdUwsR0FBbUJ2TCxDQUFRO0FBQzdCLFVBQU0sSUFBSWlMLEdBQVNqTCxDQUFRO0FBRTdCLE1BQUksQ0FBQ3dMLEdBQXdCeEwsR0FBVXNMLENBQWMsR0FBRztBQUN0RCxVQUFNeEQsSUFBU3dELEVBQWUsVUFBVXRMLENBQVE7QUFDaEQsVUFBSThILEVBQU8sVUFBZSxJQUFJLE1BQU0sZUFBZSxLQUNuRCxRQUFRLE1BQU0scURBQXFEd0QsR0FBZ0IsV0FBV3RMLENBQVEsR0FDaEc4SCxFQUFPO0FBQUEsRUFDZjtBQUNBLFNBQU85SDtBQUNULEdBQ013TCxLQUEwQixDQUFDN0gsR0FBTzhILE1BQy9CQSxFQUFPLFVBQVU5SCxDQUFLLEVBQUUsU0FFM0I0SCxLQUFxQixDQUFDdkwsTUFDbkJzSSxHQUFpQixVQUFVdEksQ0FBUSxFQUFFLFNBRXhDMEwsS0FBcUIsT0FBT04sR0FBU08sTUFDbEMsTUFBTVIsRUFBU0MsR0FBUyxFQUFFLE1BQU0sd0JBQXdCLFNBQVNPLEVBQVEsR0FBR3hDLEVBQXVCLEdBRXRHeUMsSUFBYSxPQUFPUixNQUNqQixNQUFNRCxFQUFTQyxHQUFTLEVBQUUsTUFBTSxlQUFlLFNBQVMsQ0FBQyxFQUFFLEdBQUcvQixFQUFrQixHQUVuRndDLEtBQW1CLE9BQU9ULEdBQVM3RixNQUNoQyxNQUFNNEYsRUFBU0MsR0FBUyxFQUFFLE1BQU0seUJBQXlCLFNBQUE3RixFQUFRLEdBQUdvRSxFQUF3QixHQUUvRm1DLEtBQXdCLE9BQU9WLEdBQVM3RixNQUNyQyxNQUFNNEYsRUFBU0MsR0FBUyxFQUFFLE1BQU0sNkJBQTZCLFNBQUE3RixFQUFRLEdBQUdxRSxFQUE2QixHQUV4R21DLEtBQXdCLE9BQU9YLEdBQVM3RixNQUNyQyxNQUFNNEYsRUFBU0MsR0FBUyxFQUFFLE1BQU0sNkJBQTZCLFNBQUE3RixFQUFRLEdBQUdvRSxFQUF3QixHQUVuR3FDLEtBQXFCLE9BQU9aLEdBQVM3RixNQUNsQyxNQUFNNEYsRUFBU0MsR0FBUyxFQUFFLE1BQU0sd0JBQXdCLFNBQUE3RixFQUFRLEdBQUd0QyxFQUEwQixHQUVoR2dKLEtBQXdCLE9BQU8zRixHQUFTMUMsR0FBV3NJLE1BQWU7QUFDdEUsUUFBTUMsSUFBZ0IsS0FBSyxJQUFJO0FBRS9CLE9BREFELElBQWFBLEtBQWMsS0FDcEIsS0FBSyxJQUFJLElBQUlDLElBQWdCRCxLQUFZO0FBQzlDLFVBQU1FLElBQVE5RixFQUFRLGNBQWMsbUJBQW1CMUMsQ0FBUyxHQUFHO0FBQ25FLFFBQUl3SSxNQUFVLE1BQU07QUFDbEIsVUFBSSxFQUFFQSxhQUFpQjtBQUNyQixjQUFNLElBQUksTUFBTSx5REFBeURBLEVBQU0sT0FBTyxFQUFFO0FBRTFGLGFBQU9BO0FBQUEsSUFDVDtBQUNBLFVBQU1oSSxHQUFNLEdBQUc7QUFBQSxFQUNqQjtBQUNBLGlCQUFRLEtBQUssOEJBQThCLEdBQ3BDO0FBQ1QsR0FDTWlJLEtBQW1CLE9BQU9qQixHQUFTa0IsR0FBYUMsTUFBYztBQUNsRSxRQUFNQyxJQUFrQixNQUFNZCxHQUFtQk4sR0FBUztBQUFBLElBQ3hELGNBQWNrQjtBQUFBLElBQ2QsZ0JBQWdCQztBQUFBLEVBQ2xCLENBQUMsR0FDS0UsSUFBYSxJQUFJLElBQUlELEVBQWdCLFFBQVEsU0FBUyxJQUFJLENBQUNFLE1BQVFBLEVBQUksUUFBUSxDQUFDO0FBQ3RGLE1BQUlELEVBQVcsU0FBUztBQUN0QixVQUFNLElBQUksTUFBTSxzQ0FBc0NBLEVBQVcsSUFBSSxFQUFFO0FBRXpFLFFBQU05SCxJQUFXOEgsRUFBVyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsT0FDL0NFLElBQWE5QyxHQUFJMkMsRUFBZ0IsUUFBUSxTQUFTLElBQUksQ0FBQ0UsTUFBUUEsRUFBSSxxQkFBcUIsQ0FBQztBQUMvRixTQUFPO0FBQUEsSUFDTCxVQUFBL0g7QUFBQSxJQUNBLFlBQUFnSTtBQUFBLEVBQ0Y7QUFDRixHQUNNQyxLQUEyQixPQUFPeEIsR0FBU2tCLEdBQWFPLEdBQWFOLE1BQWM7QUFDdkYsTUFBSU07QUFDRixXQUFPLEVBQUUsWUFBWSxHQUFHLFVBQVUsTUFBTTtBQUNuQztBQUNMLElBQUFOLElBQWFBLEtBQVk7QUFDekIsVUFBTUMsSUFBa0IsTUFBTUgsR0FBaUJqQixHQUFTa0IsR0FBYUMsQ0FBUztBQUM5RSxXQUFPLEVBQUUsWUFBWUMsRUFBZ0IsWUFBWSxVQUFVQSxFQUFnQixTQUFTO0FBQUEsRUFDdEY7QUFDRixHQUNNTSxLQUErQixPQUFPQyxHQUFtQnhILE1BQVk7QUFDekUsTUFBSXdILEVBQWtCLFNBQVM7QUFDN0IsVUFBTSxJQUFJLE1BQU0sMEJBQTBCO0FBTzVDLFNBTGtCLE1BQU0sUUFBUTtBQUFBLElBQzlCLE1BQU0sS0FBS0EsRUFBa0IsT0FBTyxDQUFDLEVBQUU7QUFBQSxNQUNyQyxDQUFDM0IsTUFBWUQsRUFBU0MsR0FBUyxFQUFFLE1BQU0saUJBQWlCLFNBQUE3RixFQUFRLEdBQUduQyxFQUFvQjtBQUFBLElBQ3pGO0FBQUEsRUFDRjtBQUVGLEdBQ000SixLQUF1QixPQUFPNUIsR0FBUzdGLE1BQVk7QUFDdkQsTUFBSTtBQUNGLFdBQU8sTUFBTTRGLEVBQVNDLEdBQVMsRUFBRSxNQUFNLDBCQUEwQixTQUFBN0YsRUFBUSxHQUFHaUUsRUFBdUI7QUFBQSxFQUNyRyxTQUFTN0ksR0FBTztBQUNkLGtCQUFRLE1BQU0sbURBQW1EQSxHQUFPLEtBQUssVUFBVUEsQ0FBSyxDQUFDLEdBQ3ZGQTtBQUFBLEVBQ1I7QUFDRixHQUNNc00sS0FBZ0IsT0FBTzdCLEdBQVM3RixNQUM3QixNQUFNNEYsRUFBU0MsR0FBUyxFQUFFLE1BQU0sd0JBQXdCLFNBQUE3RixFQUFRLEdBQUdrRSxFQUFxQixHQUUzRnlELEtBQWtCLE9BQU85QixHQUFTN0YsTUFDL0IsTUFBTTRGLEVBQVNDLEdBQVMsRUFBRSxNQUFNLFlBQVksU0FBQTdGLEVBQVEsR0FBR2lFLEVBQXVCLEdBRWpGMkQsS0FBdUIsS0FDdkJDLEtBQXNCLE9BQU9sRixHQUFRbUYsTUFBZ0I7QUFDekQsVUFBUSxJQUFJQSxDQUFXO0FBUXZCLFFBQU1sRixJQUFnQixNQVBIcEosR0FBZTtBQUFBLElBQ2hDLFFBQUFtSjtBQUFBLElBQ0EsT0FBTztBQUFBLElBQ1AsU0FBU2lGO0FBQUEsSUFDVCxhQUFhO0FBQUE7QUFBQSxFQUVmLENBQUMsRUFDc0M7QUFFdkMsVUFEZSxNQUFNaEMsRUFBU2hELEdBQWUsRUFBRSxNQUFNLGtCQUFrQixHQUFHNUUsRUFBcUIsR0FDakY7QUFDaEIsR0FFTStKLEtBQWUsQ0FBQ3hOLE1BQVE7QUFDNUIsTUFBSSxPQUFPQSxLQUFRLFNBQVUsUUFBTztBQUNwQyxNQUFJO0FBQ0YsZ0JBQUssTUFBTUEsQ0FBRyxHQUNQO0FBQUEsRUFDVCxRQUFZO0FBQ1YsV0FBTztBQUFBLEVBQ1Q7QUFDRixHQUVNeU4sS0FBbUMsQ0FBQ0MsTUFDakMsT0FBT0MsTUFBVztBQUN2QixNQUFJO0FBQ0YsSUFBQUEsRUFBTyxjQUFjLGtCQUFrQjtBQUN2QyxVQUFNQyxJQUFhLE1BQU1GLEVBQWNDLENBQU07QUFDN0MsUUFBSUMsRUFBVyxTQUFTO0FBQ3RCLE1BQUFELEVBQU8sY0FBYyw0QkFBNEJDLEVBQVcsT0FBTyxpQkFBaUI7QUFBQSxhQUMzRUEsRUFBVyxTQUFTO0FBQzdCLE1BQUFELEVBQU8sY0FBYztBQUFBLFFBQ25CQyxFQUFXLE9BQU87QUFBQSxRQUNsQkEsRUFBVyxPQUFPO0FBQUEsUUFDbEJBLEVBQVcsT0FBTztBQUFBLE1BQ3BCO0FBQUE7QUFFQSxZQUFNLElBQUksTUFBTSxtQkFBbUJBLENBQVUsRUFBRTtBQUFBLEVBRW5ELFNBQVMvTSxHQUFPO0FBQ2QsVUFBQThNLEVBQU8sY0FBYyxnQkFBZ0JyTixHQUFnQk8sQ0FBSyxDQUFDLEdBQ3JEQTtBQUFBLEVBQ1I7QUFDRixHQUVJZ04sS0FBeUIsQ0FBQ0MsTUFDdkIsT0FBT0gsTUFBVztBQUN2QixNQUFJO0FBQ0YsV0FBTyxNQUFNRyxFQUFLSCxDQUFNO0FBQUEsRUFDMUIsU0FBUzlNLEdBQU87QUFDZCxVQUFNLEVBQUUsT0FBQWtOLEVBQU0sSUFBSUMsRUFBcUIsb0JBQW9CO0FBQzNELFdBQUFELEVBQU1sTixDQUFLLEdBQ0osRUFBRSxhQUFhLElBQU8sUUFBUVAsR0FBZ0JPLENBQUssRUFBRTtBQUFBLEVBQzlEO0FBQ0YsR0FFSW1OLElBQXVCLENBQUNDLE1BQVc7QUFDdkMsUUFBTUMsSUFBTSxJQUFJdE4sTUFBUztBQUN2QixXQUFPLFFBQVcsSUFBSSxHQUFHMUIsR0FBTSxNQUFNLEtBQUssTUFBTSxDQUFDLEdBQUdBLEdBQU0sS0FBSyxLQUFLLEdBQUcrTyxDQUFNLEVBQUUsQ0FBQyxLQUFLLEdBQUdyTixDQUFJO0FBQUEsRUFDOUYsR0FDTVQsSUFBTSxJQUFJUyxNQUFTO0FBQ3ZCLFdBQU8sUUFBVyxNQUFNLEdBQUcxQixHQUFNLElBQUksS0FBSyxNQUFNLENBQUMsR0FBR0EsR0FBTSxLQUFLLEtBQUssR0FBRytPLENBQU0sRUFBRSxDQUFDLEtBQUssR0FBR3JOLENBQUk7QUFBQSxFQUM5RjtBQUNBLFNBQU87QUFBQSxJQUNMLEtBQUFzTjtBQUFBLElBQ0EsS0FBQS9OO0FBQUEsSUFDQSxPQUFPK047QUFBQSxJQUNQLE9BQU8vTjtBQUFBLEVBQ1Q7QUFDRixHQUVNLEVBQUUsT0FBT2dPLElBQVMsT0FBT0MsR0FBUSxJQUFJSixFQUFxQixRQUFRLEdBQ2xFSyxLQUFrQyxDQUFDbk8sTUFBYTtBQUNwRCxNQUFJQSxFQUFTLGdCQUFnQixXQUFXO0FBQ3RDLFVBQU0sSUFBSSxNQUFNLDRDQUE0Q0EsRUFBUyxnQkFBZ0IsTUFBTSxFQUFFO0FBRS9GLFNBQU8sRUFBRSxtQkFBbUJBLEVBQVMsZ0JBQWdCLENBQUMsRUFBRSxHQUFHO0FBQzdELEdBQ01vTyxLQUFzQixDQUFDQyxHQUFTQyxNQUFhO0FBQ2pELFFBQU1DLElBQU1GLEVBQVEsS0FBSyxDQUFDRyxNQUFTRixFQUFTLFVBQVVFLENBQUksRUFBRSxPQUFPO0FBQ25FLE1BQUksQ0FBQ0Q7QUFDSCxVQUFBTCxHQUFRLHdDQUF3Q0csQ0FBTyxHQUNqRCxJQUFJLE1BQU0seUJBQXlCO0FBRTNDLFNBQU9DLEVBQVMsTUFBTUMsQ0FBRztBQUMzQixHQUVNLEVBQUUsT0FBT0UsSUFBUyxPQUFPQyxHQUFRLElBQUlaLEVBQXFCLFdBQVcsR0FDckVhLEtBQWdDLENBQUNDLEdBQWtCL0gsTUFBc0I7QUFDN0UsUUFBTXRCLElBQVU5QyxHQUFtQixVQUFVbU0sQ0FBZ0I7QUFDN0QsTUFBSSxDQUFDckosRUFBUSxTQUFTO0FBQ3BCLFVBQU0yQixJQUFZM0IsRUFBUSxNQUFNLE9BQU8sR0FDakM0QixJQUFTMUQsR0FBc0J5RCxDQUFTO0FBQzlDLGVBQVcsQ0FBQ3RELEdBQVd6RCxDQUFNLEtBQUssT0FBTyxRQUFRZ0gsQ0FBTTtBQUNyRCxNQUFBTixFQUFrQmpELEdBQVd6RCxHQUFReUQsQ0FBUztBQUVoRCxVQUFBOEssR0FBUSxnREFBZ0R2SCxDQUFNLEdBQ3hELElBQUksTUFBTSw4Q0FBOEM7QUFBQSxFQUNoRTtBQUNBLFNBQU81QixFQUFRO0FBQ2pCLEdBQ01zSixLQUE4QixDQUFDQyxHQUFpQmpJLE1BQXNCO0FBQzFFLGFBQVdrSSxLQUFrQkQ7QUFDM0IsUUFBSUMsRUFBZSxZQUFZO0FBQzdCLFlBQUFBLEVBQWUsT0FBTyxRQUFRLENBQUNwTyxNQUFVO0FBQ3ZDLGNBQU1xTyxJQUFTMU4sR0FBYyxVQUFVWCxFQUFNLFdBQVc7QUFDeEQsWUFBSSxDQUFDcU8sRUFBTztBQUNWLFVBQUFOLEdBQVEsNENBQTRDL04sRUFBTSxXQUFXLEVBQUU7QUFBQSxhQUNsRTtBQUNMLGdCQUFNaUQsSUFBWW9MLEVBQU87QUFDekIsVUFBQW5JLEVBQWtCakQsR0FBV2pELEVBQU0sTUFBTTtBQUFBLFFBQzNDO0FBQUEsTUFDRixDQUFDLEdBQ0Q4TixHQUFRLGlEQUFpRCxLQUFLLFVBQVVNLEVBQWUsTUFBTSxDQUFDLEVBQUUsR0FDMUYsSUFBSSxNQUFNLDZDQUE2QztBQUduRSxHQUVNRSxLQUF5Qix1QkFDekIsRUFBRSxPQUFPQyxHQUFTLE9BQU9DLEdBQVEsSUFBSXJCLEVBQXFCLGFBQWEsR0FDdkVzQixLQUFnQnZRLEVBQUUsT0FBTztBQUFBLEVBQzdCLFVBQVVBLEVBQUUsUUFBUSxhQUFhO0FBQUEsRUFDakMsZ0JBQWdCQSxFQUFFLFFBQVEsUUFBUTtBQUFBLEVBQ2xDLFVBQVVBLEVBQUUsT0FBTztBQUFBLElBQ2pCLFdBQVdBLEVBQUUsT0FBTztBQUFBLEVBQ3RCLENBQUM7QUFDSCxDQUFDLEdBQ0t3USxLQUFnQ3hRLEVBQUU7QUFBQSxFQUN0Q0EsRUFBRSxPQUFPO0FBQUEsSUFDUCxvQkFBb0JBLEVBQUUsT0FBTztBQUFBLEVBQy9CLENBQUM7QUFDSCxFQUFFLE9BQU8sQ0FBQyxHQUNKeVEsS0FBcUIzQjtBQUFBLEVBQ3pCLE9BQU8sRUFBRSxTQUFBeE8sR0FBUyxlQUFBb1EsRUFBYyxNQUFNO0FBaGpDeEMsUUFBQXpKO0FBaWpDSSxJQUFBb0osRUFBUSxpREFBaUQ7QUFDekQsVUFBTU0sSUFBZ0JwQixHQUFvQmpQLEVBQVEsd0JBQXdCaVEsRUFBYTtBQUN2RixJQUFBRixFQUFRLDhCQUE4QjtBQUN0QyxVQUFNTyxJQUFtQixNQUFNLEtBQUt0USxFQUFRLGVBQWUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUNoRXVRLElBQVUsTUFBTTlELEVBQVc2RCxDQUFnQixHQUMzQzVDLElBQWM2QyxFQUFRLFNBQVM7QUFDckMsSUFBQVIsRUFBUSw2QkFBNkI7QUFDckMsVUFBTVMsSUFBaUIsTUFBTS9DLEdBQXlCNkMsR0FBa0JDLEVBQVEsT0FBTzdDLEdBQWEsTUFBTSxHQUNwRyxFQUFFLFVBQUErQyxHQUFVLFFBQUFwTCxFQUFPLElBQUksTUFBTUgsR0FBcUJtTCxFQUFjLFNBQVMsV0FBVztBQUFBLE1BQ3hGLE1BQU07QUFBQSxNQUNOLFVBQVVHLEVBQWU7QUFBQSxNQUN6QixvQkFBb0I7QUFBQSxNQUNwQix1QkFBdUI7QUFBQSxJQUN6QixDQUFDO0FBQ0QsSUFBQVQsRUFBUSw2QkFBNkI7QUFDckMsVUFBTVcsSUFBeUJELEVBQVMsT0FBTyxtQkFBbUI7QUFBQSxNQUNoRSxlQUFjOUosSUFBQTNHLEVBQVEsaUJBQWlCLGVBQXpCLGdCQUFBMkcsRUFBcUM7QUFBQSxNQUNuRCxnQkFBZ0I7QUFBQSxRQUNkLFdBQVc7QUFBQSxRQUNYLFVBQVU7QUFBQSxRQUNWLFdBQVc7QUFBQSxRQUNYLFFBQVE7QUFBQSxNQUNWO0FBQUEsSUFDRixDQUFDO0FBQ0QsV0FBQStKLEVBQXVCLE1BQU0sSUFBSVosRUFBc0IsRUFBRSxHQUN6RFksRUFBdUIsR0FBRyxTQUFTLE9BQU9sSSxNQUFVO0FBMWtDeEQsVUFBQTdCO0FBNGtDTSxVQURBb0osRUFBUSw0QkFBNEIsSUFDaENwSixJQUFBM0csRUFBUSxpQkFBaUIsZUFBekIsUUFBQTJHLEVBQXFDLHNCQUVuQyxDQURpQixNQUFNM0csRUFBUSxpQkFBaUIsV0FBVyxtQkFBbUIsR0FDL0Q7QUFDakIsUUFBQStQLEVBQVEsa0RBQWtEO0FBQzFEO0FBQUEsTUFDRjtBQUVGLE1BQUF2SCxFQUFNLFFBQVE7QUFBQSxJQUNoQixDQUFDLEdBQ0RrSSxFQUF1QixHQUFHLFdBQVcsT0FBT2xJLE1BQVU7QUFDcEQsTUFBQXVILEVBQVEsZ0NBQWdDdkgsQ0FBSztBQUM3QyxZQUFNRyxJQUFTLE1BQU10RCxFQUFPLG9CQUFvQjtBQUFBLFFBQzlDLFVBQUFvTDtBQUFBLFFBQ0EsUUFBUTtBQUFBLFVBQ04saUJBQWlCakksRUFBTTtBQUFBLFFBQ3pCO0FBQUEsTUFDRixDQUFDO0FBQ0QsTUFBSUcsRUFBTyxTQUNUcUgsR0FBUSxTQUFTckgsRUFBTyxLQUFLLEdBQzdCeUgsRUFBYyxnQkFBZ0J6SCxFQUFPLE1BQU0sV0FBVywyQkFBMkIsTUFFakZvSCxFQUFRLGlCQUFpQnBILEVBQU8sYUFBYSxHQUM3Q2dJLEdBQVMsV0FBVyxJQUFJO0FBQUEsUUFDdEIsU0FBQTNRO0FBQUEsUUFDQSx1QkFBdUJxUTtBQUFBLFFBQ3ZCLGtCQUFrQm5KLEdBQXlCbEgsRUFBUSxPQUFPO0FBQUEsUUFDMUQsZUFBQW9RO0FBQUEsUUFDQSxjQUFjLEVBQUUsVUFBVXpILEVBQU8sY0FBYztBQUFBLFFBQy9DLFlBQVksRUFBRSxhQUFhLEdBQUs7QUFBQSxNQUNsQyxDQUFDO0FBQUEsSUFFTCxDQUFDLEdBQ00sRUFBRSxhQUFhLEdBQUs7QUFBQSxFQUM3QjtBQUNGLEdBQ01pSSxLQUFvQnhDO0FBQUEsRUFDeEIsT0FBTztBQUFBLElBQ0wsU0FBQXBPO0FBQUEsSUFDQSx1QkFBQTJIO0FBQUEsSUFDQSxrQkFBQThIO0FBQUEsSUFDQSxlQUFBVztBQUFBLElBQ0EsY0FBQVM7QUFBQSxFQUNGLE1BQU07QUFDSixJQUFBZCxFQUFRLDJCQUEyQjtBQUNuQyxVQUFNTyxJQUFtQixNQUFNLEtBQUt0USxFQUFRLGVBQWUsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUN0RSxJQUFBK1AsRUFBUSx1Q0FBdUM7QUFDL0MsVUFBTWUsSUFBZUMsR0FBZ0N0QixHQUFrQm9CLEVBQWEsUUFBUSxHQUN0RkcsSUFBbUJ4QixHQUE4QnNCLEdBQWNWLEVBQWMsaUJBQWlCO0FBQ3BHLElBQUFMLEVBQVEsMEJBQTBCO0FBQ2xDLFVBQU1rQixJQUEyQixNQUFNdkUsR0FBaUI0RCxHQUFrQjtBQUFBLE1BQ3hFLGtCQUFrQjNJLEVBQXNCO0FBQUEsTUFDeEMseUJBQXlCQTtBQUFBLE1BQ3pCLHNCQUFzQmtKLEVBQWEsU0FBUztBQUFBLElBQzlDLENBQUM7QUFDRCxJQUFBZCxFQUFRLCtCQUErQmtCLENBQXdCO0FBRS9ELFVBQU1DLElBRHFCaEIsR0FBOEIsTUFBTWUsRUFBeUIscUJBQXFCLEVBQ2xFLENBQUMsRUFBRSxvQkFDeENWLElBQVUsTUFBTTlELEVBQVc2RCxDQUFnQjtBQUNqRCxRQUFJQyxFQUFRLFNBQVMsU0FBUztBQUM1QixNQUFBUixFQUFRLHdCQUF3QjtBQUNoQyxZQUFNeEosSUFBZ0IsTUFBTXNHLEdBQW1CeUQsR0FBa0I7QUFBQSxRQUMvRCxjQUFjQyxFQUFRO0FBQUEsUUFDdEIsbUJBQW1CVztBQUFBLE1BQ3JCLENBQUM7QUFFRCxhQUFPLEVBQUUsTUFBTSxTQUFTLFFBREtsQyxHQUFnQ3pJLENBQWEsRUFDckI7QUFBQSxJQUN2RCxPQUFPO0FBQ0wsTUFBQXdKLEVBQVEsbUJBQW1CO0FBQzNCLFlBQU1vQixJQUFrQjtBQUFBLFFBQ3RCLGNBQWNaLEVBQVE7QUFBQSxRQUN0QixlQUFlO0FBQUEsVUFDYixlQUFlNUksRUFBc0I7QUFBQSxRQUN2QztBQUFBLFFBQ0EsZ0JBQWdCcUosRUFBaUJuUCxFQUFVLEtBQUs7QUFBQSxRQUNoRCxtQkFBbUJtUCxFQUFpQm5QLEVBQVUsUUFBUTtBQUFBLFFBQ3RELGtCQUFrQm1QLEVBQWlCblAsRUFBVSxPQUFPO0FBQUEsUUFDcEQsZ0JBQWdCbVAsRUFBaUJuUCxFQUFVLGNBQWM7QUFBQSxRQUN6RCxZQUFZME8sRUFBUTtBQUFBLFFBQ3BCLG1CQUFtQkEsRUFBUTtBQUFBLFFBQzNCLGVBQWU7QUFBQSxRQUNmLHlCQUF5QjVJO0FBQUEsTUFDM0I7QUFFQSxhQUFPLEVBQUUsTUFBTSxZQUFZLFFBRFosTUFBTW9HLEdBQWdCdUMsR0FBa0JhLENBQWUsRUFDcEM7QUFBQSxJQUNwQztBQUFBLEVBQ0Y7QUFDRixHQUNNSixLQUFrQyxDQUFDSyxHQUFZL0ssTUFBYTtBQW5xQ2xFLE1BQUFNLEdBQUFDLEdBQUFDLEdBQUFDLEdBQUF1SztBQW9xQ0UsUUFBTUMsSUFBUyxFQUFFLEdBQUdGLEVBQVcsR0FDekIsQ0FBQ0csR0FBZ0IsR0FBR0MsQ0FBa0IsTUFBSTVLLEtBQUFELElBQUFOLEVBQVMsZ0JBQWdCLFNBQXpCLGdCQUFBTSxFQUErQixXQUEvQixnQkFBQUMsRUFBdUMsTUFBTSxXQUFVLENBQUMsR0FDbEc2SyxJQUFnQkQsRUFBbUIsS0FBSyxHQUFHLEtBQUs7QUFDdEQsU0FBQUYsRUFBT3pQLEVBQVUsVUFBVSxJQUFJeVAsRUFBT3pQLEVBQVUsVUFBVSxLQUFLMFAsS0FBa0IsZUFDakZELEVBQU96UCxFQUFVLFNBQVMsSUFBSXlQLEVBQU96UCxFQUFVLFNBQVMsS0FBSzRQLEtBQWlCLGVBQzlFSCxFQUFPelAsRUFBVSxLQUFLLElBQUl5UCxFQUFPelAsRUFBVSxLQUFLO0FBQUEsSUFDaERnRixJQUFBUixFQUFTLFNBQVQsZ0JBQUFRLEVBQWtCLFVBQVNSLEVBQVMsZ0JBQWdCLFNBQVMsOEJBQzdEaUwsRUFBT3pQLEVBQVUsUUFBUSxJQUFJeVAsRUFBT3pQLEVBQVUsUUFBUSxPQUFLaUYsSUFBQVQsRUFBUyxnQkFBZ0IsWUFBekIsZ0JBQUFTLEVBQWtDLGdCQUFlLFNBQzVHd0ssRUFBT3pQLEVBQVUsT0FBTyxJQUFJeVAsRUFBT3pQLEVBQVUsT0FBTyxPQUFLd1AsSUFBQWhMLEVBQVMsZ0JBQWdCLFlBQXpCLGdCQUFBZ0wsRUFBa0MsWUFBVyxNQUN0R3RCLEVBQVEsc0JBQXNCdUIsQ0FBTSxHQUM3QkE7QUFDVCxHQUVNckssS0FBUyxrbUJBRVR5SyxLQUFxQixDQUFDQyxNQUFRO0FBQ2xDLFFBQU1DLElBQVcsU0FBUyxjQUFjLFVBQVU7QUFDbEQsRUFBQUEsRUFBUyxZQUFZO0FBQUE7QUFBQSxRQUVmM0ssRUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsdUJBS1MwSyxDQUFHO0FBQUE7QUFBQTtBQUFBO0FBSXhCLFFBQU1FLElBQU8sU0FBUyxjQUFjLEtBQUssR0FDbkNDLElBQWFELEVBQUssYUFBYSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3JELEVBQUFDLEVBQVcsWUFBWUYsRUFBUyxRQUFRLFVBQVUsRUFBSSxDQUFDO0FBQ3ZELFFBQU03SSxJQUFTK0ksRUFBVyxjQUFjLGtCQUFrQixHQUNwREMsSUFBZUQsRUFBVyxjQUFjLGdCQUFnQjtBQUM5RCxrQkFBUyxLQUFLLFlBQVlELENBQUksR0FDdkIsRUFBRSxNQUFBQSxHQUFNLFFBQUE5SSxHQUFRLGNBQUFnSixFQUFhO0FBQ3RDO0FBRUEsU0FBU0MsR0FBYWpKLEdBQVFrSixHQUFXL0QsR0FBYTtBQUNwRCxRQUFNZ0UsSUFBZ0IsWUFBWTtBQUNoQyxRQUFJO0FBQ0YsY0FBUSxJQUFJLDhCQUE4QjtBQUMxQyxZQUFNQyxJQUFTLE1BQU1sRSxHQUFvQmxGLEdBQVFtRixDQUFXO0FBQzVELE1BQUlpRSxNQUNGLFFBQVEsSUFBSSxtREFBbUQsR0FDL0QsUUFBUSxJQUFJLGtCQUFrQkEsQ0FBTSxHQUNwQyxjQUFjQyxDQUFlLEdBQzdCSCxFQUFVRSxDQUFNO0FBQUEsSUFFcEIsUUFBZ0I7QUFBQSxJQUNoQjtBQUFBLEVBQ0Y7QUFDQSxFQUFBRCxFQUFjO0FBQ2QsUUFBTUUsSUFBa0IsWUFBWUYsR0FBZWxFLEVBQW9CO0FBQ3ZFLFNBQU9vRTtBQUNUO0FBQ0EsU0FBU0MsR0FBYTtBQUFBLEVBQ3BCLFVBQUE1QjtBQUFBLEVBQ0EsaUJBQUEyQjtBQUFBLEVBQ0EsU0FBQXZNO0FBQ0YsR0FBRztBQUNELFFBQU15TSxJQUFlLE1BQU07QUFDekIsa0JBQWNGLENBQWUsR0FDN0IzQixFQUFTLEtBQUssT0FBTyxHQUNyQjVLLEVBQVEzQixHQUFjLFNBQVM7QUFBQSxFQUNqQztBQUNBLFNBQUF1TSxFQUFTLGFBQWEsaUJBQWlCLFNBQVM2QixDQUFZLEdBQzlCLE1BQU07QUFDbEMsSUFBQTdCLEVBQVMsYUFBYSxvQkFBb0IsU0FBUzZCLENBQVk7QUFBQSxFQUNqRTtBQUVGO0FBQ0EsZUFBZUMsR0FBcUI7QUFBQSxFQUNsQyxLQUFBWjtBQUFBLEVBQ0EsU0FBQXBKO0FBQ0YsR0FBRztBQUNELFFBQU1rSSxJQUFXaUIsR0FBbUJDLENBQUc7QUFDdkMsU0FBTyxJQUFJLFFBQVEsQ0FBQzlMLE1BQVk7QUFDOUIsVUFBTW9NLElBQVksQ0FBQ0UsTUFBVztBQUM1QixpQkFBVyxNQUFNO0FBQ2YsUUFBQTFCLEVBQVMsS0FBSyxPQUFPO0FBQUEsTUFDdkIsR0FBRyxHQUFHLEdBQ041SyxFQUFRc00sQ0FBTSxHQUNkSyxLQUFBLFFBQUFBO0FBQUEsSUFDRixHQUNNSixJQUFrQkosR0FBYXZCLEVBQVMsUUFBUXdCLEdBQVcsSUFBSSxJQUFJMUosQ0FBTyxFQUFFLE1BQU0sR0FDbEZpSyxJQUF3QkgsR0FBYTtBQUFBLE1BQ3pDLFVBQUE1QjtBQUFBLE1BQ0EsaUJBQUEyQjtBQUFBLE1BQ0EsU0FBQXZNO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0g7QUFFQSxNQUFNLEVBQUUsT0FBTzRNLEdBQVMsT0FBT0MsR0FBUSxJQUFJL0QsRUFBcUIsV0FBVyxHQUNyRSxFQUFFLE9BQU9nRSxHQUFZLElBQUloRSxFQUFxQixXQUFXLEdBQ3pEaUUsS0FBa0J4RTtBQUFBLEVBQ3RCLE9BQU8sRUFBRSxTQUFBcE8sR0FBUyx1QkFBQTJILEdBQXVCLGtCQUFBOEgsR0FBa0IsZUFBQVcsRUFBYyxNQUFNO0FBcHdDakYsUUFBQXpKO0FBcXdDSSxJQUFBOEwsRUFBUSwrQkFBK0IsRUFBRSx1QkFBQTlLLEVBQXNCLENBQUM7QUFDaEUsVUFBTTJJLElBQW1CLE1BQU0sS0FBS3RRLEVBQVEsZUFBZSxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQ2hFdVEsSUFBVSxNQUFNOUQsRUFBVzZELENBQWdCO0FBQ2pELElBQUFtQyxFQUFRLDJDQUEyQ2xDLEVBQVEsSUFBSSxHQUFHO0FBQ2xFLFVBQU1TLElBQW1CeEIsR0FBOEJDLEdBQWtCVyxFQUFjLGlCQUFpQjtBQUN4RyxJQUFBcUMsRUFBUSwyQ0FBMkN6UyxFQUFRLGlCQUFpQixHQUFHO0FBQy9FLFVBQU02UyxJQUFzQixNQUFNbEYsR0FBNkIzTixFQUFRLGdCQUFnQjtBQUFBLE1BQ3JGLFlBQVlBLEVBQVE7QUFBQSxJQUN0QixDQUFDO0FBQ0QsSUFBQTBQLEdBQTRCbUQsR0FBcUJ6QyxFQUFjLGlCQUFpQjtBQUNoRixVQUFNMEMsSUFBdUI7QUFBQSxNQUMzQixZQUFZOVMsRUFBUTtBQUFBLE1BQ3BCLHlCQUF5QjJIO0FBQUEsTUFDekIscUJBQXFCcUo7QUFBQSxJQUN2QjtBQUNBLFFBQUk7QUFDRixVQUFJVCxFQUFRLFNBQVMsU0FBUztBQUM1QixRQUFBa0MsRUFBUSw4Q0FBOENsQyxFQUFRLEtBQUssR0FBRztBQUN0RSxjQUFNNUgsSUFBUyxNQUFNbUYsR0FBY3dDLEdBQWtCd0MsQ0FBb0I7QUFDekUsZUFBQUwsRUFBUSwwQ0FBMEM5SixFQUFPLGlCQUFpQixHQUFHLEdBQ3RFLEVBQUUsTUFBTSxTQUFTLFFBQUFBLEVBQU87QUFBQSxNQUNqQyxPQUFPO0FBQ0wsUUFBQThKLEVBQVEsb0VBQW9FelMsRUFBUSxpQkFBaUIsR0FBRztBQUN4RyxjQUFNMkksSUFBUyxNQUFNa0YsR0FBcUJ5QyxHQUFrQndDLENBQW9CO0FBQ2hGLGVBQUFMLEVBQVEsb0NBQW9DLEdBQ3JDLEVBQUUsTUFBTSxZQUFZLFFBQUE5SixFQUFPO0FBQUEsTUFDcEM7QUFBQSxJQUNGLFNBQVNuSCxHQUFPO0FBQ2QsVUFBSUEsYUFBaUJzSyxNQUNmdEssRUFBTSx5QkFBeUIsZ0JBQWdCO0FBQ2pELFFBQUFpUixFQUFRLHVEQUF1RCxHQUMvREEsRUFBUSwwQkFBMEJqUixFQUFNLFNBQVMsT0FBTztBQUN4RCxjQUFNdVIsTUFBbUJwTSxJQUFBbkYsRUFBTSxTQUFTLFlBQWYsZ0JBQUFtRixFQUF5QiwrQkFBOEIsUUFDMUVxTSxJQUFnQixNQUFNckcsR0FBc0IyRCxHQUFrQndDLENBQW9CO0FBUXhGLFlBUEFMLEVBQVEsNkJBQTZCTSxDQUFnQixFQUFFLEdBQ3ZETixFQUFRLDBCQUEwQk8sQ0FBYSxHQUMzQ0QsSUFDRixNQUFNRSxHQUFnQkQsR0FBZWhULEVBQVEsT0FBTyxJQUVwRCxNQUFNa1QsR0FBZ0JGLENBQWEsR0FFakN6QyxFQUFRLFNBQVMsU0FBUztBQUM1QixVQUFBa0MsRUFBUSx3Q0FBd0NPLEVBQWMsUUFBUSxHQUFHO0FBQ3pFLGdCQUFNek0sSUFBZ0IsTUFBTXNHLEdBQW1CeUQsR0FBa0I7QUFBQSxZQUMvRCxjQUFjQyxFQUFRO0FBQUEsWUFDdEIsbUJBQW1CeUMsRUFBYztBQUFBLFVBQ25DLENBQUM7QUFDRCxVQUFBUCxFQUFRLGtEQUFrRGxNLENBQWE7QUFDdkUsZ0JBQU00TSxJQUF1Qm5FLEdBQWdDekksQ0FBYTtBQUMxRSxpQkFBQWtNLEVBQVEsMENBQTBDVSxFQUFxQixpQkFBaUIsR0FBRyxHQUNwRixFQUFFLE1BQU0sU0FBUyxRQUFRQSxFQUFxQjtBQUFBLFFBQ3ZELE9BQU87QUFDTCxVQUFBVixFQUFRLHdDQUF3Q00sSUFBbUIsUUFBUSxRQUFRLEdBQUc7QUFDdEYsZ0JBQU1wSyxJQUFTLE1BQU1rRixHQUFxQnlDLEdBQWtCO0FBQUEsWUFDMUQsR0FBR3dDO0FBQUEsWUFDSCxtQkFBbUJFLEVBQWM7QUFBQSxZQUNqQywyQkFBMkIsQ0FBQ0Q7QUFBQSxVQUM5QixDQUFDO0FBQ0QsaUJBQUFOLEVBQVEsb0NBQW9DLEdBQ3JDLEVBQUUsTUFBTSxZQUFZLFFBQUE5SixFQUFPO0FBQUEsUUFDcEM7QUFBQSxNQUNGO0FBRUYsWUFBQStKLEdBQVEsdUNBQXVDLEdBQy9DQSxHQUFRbFIsQ0FBSyxHQUNQQTtBQUFBLElBQ1I7QUFBQSxFQUNGO0FBQ0YsR0FDTTRSLEtBQW1DLENBQUN2UyxNQUFhO0FBQ3JELFFBQU13UyxJQUFleFMsRUFBUyxzQkFBc0IsS0FBSyxDQUFDeVMsTUFBV0EsRUFBTyxTQUFTLFlBQVk7QUFDakcsTUFBSSxDQUFDRDtBQUNILFVBQU0sSUFBSSxNQUFNLDRCQUE0QjtBQUU5QyxTQUFPM08sR0FBNEIsTUFBTTJPLENBQVk7QUFDdkQsR0FDTUUsS0FBbUMsQ0FBQzFTLE1BQWE7QUFDckQsUUFBTTJTLElBQWUzUyxFQUFTLHNCQUFzQixLQUFLLENBQUN5UyxNQUFXQSxFQUFPLFNBQVMsMkJBQTJCO0FBQ2hILE1BQUksQ0FBQ0U7QUFDSCxVQUFNLElBQUksTUFBTSw0QkFBNEI7QUFFOUMsU0FBT25QLEdBQTRCLE1BQU1tUCxDQUFZO0FBQ3ZELEdBQ01QLEtBQWtCLE9BQU9ELEdBQWV6SyxNQUFZO0FBQ3hELFFBQU1qQyxJQUFxQmlOLEdBQWlDUCxDQUFhO0FBQ3pFLEVBQUFQLEVBQVEsaUNBQWlDbk0sRUFBbUIsWUFBWSxHQUFHO0FBQzNFLFFBQU02TCxJQUFTLE1BQU1JLEdBQXFCLEVBQUUsS0FBS2pNLEVBQW1CLGNBQWMsU0FBQWlDLEVBQVEsQ0FBQztBQUUzRixNQURBa0ssRUFBUSx5Q0FBeUNOLENBQU0sR0FBRyxHQUN0REEsTUFBV2pPLEdBQWM7QUFDM0IsVUFBTSxJQUFJLE1BQU0sNEJBQTRCO0FBRTlDLE1BQUlpTyxNQUFXak8sR0FBYztBQUMzQixVQUFNLElBQUksTUFBTSx5QkFBeUI7QUFFN0MsR0FDTWdQLEtBQWtCLE9BQU9GLE1BQWtCO0FBQy9DLFFBQU0xTSxJQUFxQjhNLEdBQWlDSixDQUFhO0FBQ3pFLEVBQUFMLEdBQVksMkNBQTJDck0sRUFBbUIsY0FBYyxVQUFVLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FDN0csTUFBTUksR0FBMEJKLENBQWtCLEdBQ2xEcU0sR0FBWSwwQ0FBMEM7QUFDeEQsR0FFTSxFQUFFLE9BQU9jLEdBQVMsT0FBT0MsR0FBUSxJQUFJL0UsRUFBcUIsV0FBVyxHQUNyRWdGLEtBQWNqVSxFQUFFLE9BQU87QUFBQSxFQUMzQixVQUFVQSxFQUFFLE1BQU0sQ0FBQ0EsRUFBRSxRQUFRLFdBQVcsR0FBR0EsRUFBRSxRQUFRLFlBQVksQ0FBQyxDQUFDO0FBQUEsRUFDbkUsZ0JBQWdCQSxFQUFFLFFBQVEsUUFBUTtBQUFBLEVBQ2xDLFVBQVVBLEVBQUUsT0FBTztBQUFBLElBQ2pCLFdBQVdBLEVBQUUsT0FBTztBQUFBLEVBQ3RCLENBQUM7QUFDSCxDQUFDLEdBQ0trVSxLQUFtQnBGO0FBQUEsRUFDdkIsT0FBTyxFQUFFLFNBQUF4TyxFQUFRLE1BQU07QUFDckIsSUFBQXlULEVBQVEsaURBQWlEO0FBQ3pELFVBQU05TCxJQUF3QnNILEdBQW9CalAsRUFBUSx3QkFBd0IyVCxFQUFXO0FBQzdGLElBQUFGLEVBQVEsZ0NBQWdDO0FBQ3hDLFVBQU1uRCxJQUFtQixNQUFNLEtBQUt0USxFQUFRLGVBQWUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUNoRXVRLElBQVUsTUFBTTlELEVBQVc2RCxDQUFnQixHQUMzQzVDLElBQWM2QyxFQUFRLFNBQVM7QUFDckMsSUFBQWtELEVBQVEsZ0NBQWdDO0FBQ3hDLFVBQU1qRCxJQUFpQixNQUFNL0MsR0FBeUI2QyxHQUFrQkMsRUFBUSxPQUFPN0MsR0FBYSxNQUFNLEdBQ3BHbUcsSUFBSyxNQUFNdk87QUFBQSxNQUNmcUMsRUFBc0IsU0FBUztBQUFBLE1BQy9CNkksRUFBZTtBQUFBLE1BQ2ZBLEVBQWU7QUFBQSxNQUNmOUM7QUFBQSxJQUNGO0FBQ0EsSUFBQStGLEVBQVEsOEJBQThCO0FBQ3RDLFVBQU1LLElBQWlCLE1BQU1ELEVBQUcsZUFBZTtBQUMvQyxXQUFJQyxNQUFtQixRQUNyQkosR0FBUSw4QkFBOEIsR0FDL0IsRUFBRSxhQUFhLElBQU8sUUFBUSwrQkFBK0IsTUFFdEVELEVBQVEsNkRBQTZESyxDQUFjLEdBQzVFO0FBQUEsTUFDTCxhQUFhO0FBQUEsTUFDYixJQUFBRDtBQUFBLE1BQ0Esb0JBQW9CO0FBQUEsUUFDbEIsVUFBVUMsRUFBZTtBQUFBLFFBQ3pCLFdBQVdBLEVBQWU7QUFBQSxNQUM1QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsR0FDTUMsS0FBa0IzRjtBQUFBLEVBQ3RCLE9BQU87QUFBQSxJQUNMLFNBQUFwTztBQUFBLElBQ0EsdUJBQUEySDtBQUFBLElBQ0Esa0JBQUE4SDtBQUFBLElBQ0EsZUFBQVc7QUFBQSxJQUNBLGNBQUFTO0FBQUEsSUFDQSxZQUFBbUQ7QUFBQSxFQUNGLE1BQU07QUFFSixRQURBUCxFQUFRLDJCQUEyQixHQUMvQjVDLEVBQWEsYUFBYWxKLEVBQXNCO0FBQ2xELFlBQU0sSUFBSSxNQUFNLCtCQUErQmtKLEVBQWEsUUFBUSxTQUFTbEosRUFBc0IsUUFBUSxFQUFFO0FBRS9HLFVBQU0ySSxJQUFtQixNQUFNLEtBQUt0USxFQUFRLGVBQWUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUNoRTZULElBQUtHLEVBQVc7QUFDdEIsUUFBSW5ELEtBQUEsUUFBQUEsRUFBYyx3QkFBd0I7QUFDeEMsWUFBTW9ELElBQVdwRCxFQUFhO0FBQzlCLE1BQUE0QyxFQUFRLDZCQUE2QlEsQ0FBUSxHQUM3Q0MsR0FBbUJMLEdBQUlJLEVBQVMsUUFBUUEsRUFBUyxPQUFPO0FBQUEsSUFDMUQ7QUFDQSxJQUFBUixFQUFRLHNCQUFzQixHQUM5QkksRUFBRyxLQUFLO0FBQ1IsVUFBTU0sSUFBcUIsTUFBTXJPLEdBQThCK04sQ0FBRTtBQUNqRSxJQUFBSixFQUFRLDBCQUEwQlUsQ0FBa0IsR0FDcERWLEVBQVEsdUNBQXVDO0FBQy9DLFVBQU0zQyxJQUFlc0QsR0FBZ0MzRSxHQUFrQjBFLENBQWtCLEdBQ25GbkQsSUFBbUJ4QixHQUE4QnNCLEdBQWNWLEVBQWMsaUJBQWlCO0FBQ3BHLElBQUFxRCxFQUFRLDhDQUE4QztBQUN0RCxVQUFNeEMsSUFBMkIsTUFBTXJFLEdBQXNCMEQsR0FBa0I7QUFBQSxNQUM3RSxRQUFRVTtBQUFBLE1BQ1IsdUJBQUFySjtBQUFBLElBQ0YsQ0FBQyxHQUNLckIsSUFBcUIrTixHQUEwQnBELENBQXdCO0FBQzdFLElBQUF3QyxFQUFRLDhCQUE4QixHQUN0QyxNQUFNak4sR0FBa0JGLEdBQW9CNk4sQ0FBa0I7QUFDOUQsVUFBTTVELElBQVUsTUFBTTlELEVBQVc2RCxDQUFnQjtBQUNqRCxRQUFJQyxFQUFRLFNBQVMsU0FBUztBQUM1QixNQUFBa0QsRUFBUSxzQ0FBc0M7QUFDOUMsWUFBTWxOLElBQWdCLE1BQU1zRyxHQUFtQnlELEdBQWtCO0FBQUEsUUFDL0QsY0FBY0MsRUFBUTtBQUFBLE1BQ3hCLENBQUM7QUFFRCxhQUFPLEVBQUUsTUFBTSxTQUFTLFFBREt2QixHQUFnQ3pJLENBQWEsRUFDckI7QUFBQSxJQUN2RCxPQUFPO0FBQ0wsTUFBQWtOLEVBQVEsd0JBQXdCO0FBQ2hDLFlBQU10QyxJQUFrQjtBQUFBLFFBQ3RCLGNBQWNaLEVBQVE7QUFBQSxRQUN0QixlQUFlO0FBQUEsVUFDYixlQUFlNUksRUFBc0I7QUFBQSxRQUN2QztBQUFBLFFBQ0EsZ0JBQWdCcUosRUFBaUJuUCxFQUFVLEtBQUs7QUFBQSxRQUNoRCxtQkFBbUJtUCxFQUFpQm5QLEVBQVUsUUFBUTtBQUFBLFFBQ3RELGtCQUFrQm1QLEVBQWlCblAsRUFBVSxPQUFPO0FBQUEsUUFDcEQsZ0JBQWdCbVAsRUFBaUJuUCxFQUFVLGNBQWM7QUFBQSxRQUN6RCxZQUFZME8sRUFBUTtBQUFBLFFBQ3BCLG1CQUFtQkEsRUFBUTtBQUFBLFFBQzNCLGVBQWU7QUFBQSxRQUNmLHlCQUF5QjVJO0FBQUEsTUFDM0I7QUFFQSxhQUFPLEVBQUUsTUFBTSxZQUFZLFFBRFosTUFBTW9HLEdBQWdCdUMsR0FBa0JhLENBQWUsRUFDcEM7QUFBQSxJQUNwQztBQUFBLEVBQ0Y7QUFDRixHQUNNaUQsS0FBa0MsQ0FBQ2hELEdBQVlrRCxNQUFnQjtBQXA5Q3JFLE1BQUEzTixHQUFBQyxHQUFBQyxHQUFBQztBQXE5Q0UsUUFBTXdLLElBQVMsRUFBRSxHQUFHRixFQUFXLEdBQ3pCLENBQUNHLEdBQWdCLEdBQUdDLENBQWtCLE1BQUk1SyxLQUFBRCxJQUFBMk4sRUFBWSxjQUFaLGdCQUFBM04sRUFBdUIsV0FBdkIsZ0JBQUFDLEVBQStCLE1BQU0sV0FBVSxDQUFDLEdBQzFGNkssSUFBZ0JELEVBQW1CLEtBQUssR0FBRyxLQUFLO0FBQ3RELFNBQUFGLEVBQU96UCxFQUFVLFVBQVUsSUFBSXlQLEVBQU96UCxFQUFVLFVBQVUsS0FBSzBQLEtBQWtCLGVBQ2pGRCxFQUFPelAsRUFBVSxTQUFTLElBQUl5UCxFQUFPelAsRUFBVSxTQUFTLEtBQUs0UCxLQUFpQixlQUM5RUgsRUFBT3pQLEVBQVUsS0FBSyxJQUFJeVAsRUFBT3pQLEVBQVUsS0FBSyxLQUFLeVMsRUFBWSxjQUFjLDhCQUMvRWhELEVBQU96UCxFQUFVLFFBQVEsSUFBSXlQLEVBQU96UCxFQUFVLFFBQVEsT0FBS2dGLElBQUF5TixFQUFZLG9CQUFaLGdCQUFBek4sRUFBNkIsZUFBYyxTQUN0R3lLLEVBQU96UCxFQUFVLE9BQU8sSUFBSXlQLEVBQU96UCxFQUFVLE9BQU8sT0FBS2lGLElBQUF3TixFQUFZLG9CQUFaLGdCQUFBeE4sRUFBNkIsWUFBVyxNQUNqRzJNLEVBQVEsc0JBQXNCbkMsQ0FBTSxHQUM3QkE7QUFDVCxHQUNNNEMsS0FBcUIsQ0FBQ0wsR0FBSVUsR0FBUUMsTUFBYztBQUNwRCxFQUFBWCxFQUFHLE9BQU87QUFBQSxJQUNSLE9BQU87QUFBQSxNQUNMLFFBQVFVLEVBQU87QUFBQSxNQUNmLE9BQU87QUFBQSxNQUNQLFNBQVNDO0FBQUEsSUFDWDtBQUFBLElBQ0EsVUFBVUQsRUFBTztBQUFBLEVBQ25CLENBQUM7QUFDSCxHQUNNRixLQUE0QixDQUFDeFQsTUFBYTtBQUM5QyxNQUFJQSxFQUFTLHNCQUFzQixXQUFXO0FBQzVDLFVBQU0sSUFBSSxNQUFNO0FBQUEsZUFDTEEsRUFBUyxzQkFBc0IsTUFBTSx3QkFBd0I7QUFFMUUsU0FBTzhELEdBQWlDLE1BQU05RCxFQUFTLHNCQUFzQixDQUFDLENBQUM7QUFDakYsR0FFTTRULEtBQWtDLENBQUNDLEdBQU1DLEdBQWNDLE1BQWtCO0FBQzdFLFFBQU1DLElBQVVILEVBQUssT0FBTyxDQUFDdEYsTUFFSEEsRUFBSSxhQUFhdUYsQ0FFMUM7QUFDRCxNQUFJRSxFQUFRLFdBQVc7QUFDckIsa0JBQVEsTUFBTSxhQUFhSCxDQUFJLEdBQ3pCLElBQUksTUFBTSxnQ0FBZ0NDLENBQVksb0JBQW9CQyxDQUFhLEdBQUc7QUFFbEcsTUFBSUMsRUFBUSxXQUFXO0FBQ3JCLGtCQUFRLE1BQU0sYUFBYUgsQ0FBSSxHQUN6QixJQUFJLE1BQU0sMENBQTBDQyxDQUFZLG9CQUFvQkMsQ0FBYSxHQUFHO0FBRTVHLFNBQU9DLEVBQVEsQ0FBQztBQUNsQixHQUNNbEUsS0FBVztBQUFBO0FBQUE7QUFBQSxFQUdmLFVBQVU7QUFBQSxJQUNSLEtBQUtpQztBQUFBLEVBQ1A7QUFBQTtBQUFBLEVBRUEsVUFBVTtBQUFBLElBQ1IsTUFBTWdCO0FBQUEsSUFDTixLQUFLRztBQUFBLEVBQ1A7QUFBQSxFQUNBLFlBQVk7QUFBQSxJQUNWLE1BQU01RDtBQUFBLElBQ04sS0FBS1M7QUFBQSxFQUNQO0FBQUE7QUFBQTtBQUdGO0FBRUEsU0FBU2tFLEdBQXlCQyxHQUFHO0FBQ3BDLFNBQU9BLEtBQUtBLEVBQUUsY0FBYyxPQUFPLFVBQVUsZUFBZSxLQUFLQSxHQUFHLFNBQVMsSUFBSUEsRUFBRSxVQUFhQTtBQUNqRztBQUVBLElBQUlDLEtBQWUsQ0FBQztBQUVwQixPQUFPLGVBQWVBLElBQWMsY0FBYztBQUFBLEVBQ2hELE9BQU87QUFDVCxDQUFDO0FBQ0RBLEdBQWEsYUFBYTtBQUcxQixNQUFNQyxLQUFZLENBQUFDLE1BQVEsRUFBUSxPQUFPQSxDQUFJLEdBRXZDQyxLQUFZLENBQUFELE1BQVFELEdBQVVDLENBQUksSUFBSSxPQUFPQSxDQUFJLElBQUksT0FBT0EsR0FFNURFLEtBQWlCRCxHQUFVLFVBQVUsR0FDckNFLEtBQW1CRixHQUFVLFlBQVksR0FDekNHLEtBQWdCSCxHQUFVLFNBQVM7QUFFekMsU0FBU0ksR0FBVXJVLEdBQUtULEdBQUs7QUFDM0IsTUFBSStELElBQVF0RCxFQUFJVCxDQUFHO0FBQ25CLE1BQUkrRCxLQUFTLE1BQ2I7QUFBQSxRQUFJLE9BQU9BLEtBQVUsV0FBWSxPQUFNLElBQUksVUFBVUEsSUFBUSxvQkFBb0I7QUFDakYsV0FBT0E7QUFBQTtBQUNUO0FBRUEsU0FBU2dSLEdBQVd0VSxHQUFLO0FBQ3ZCLE1BQUl1VSxJQUFPdlUsRUFBSTtBQUVmLFNBQUl1VSxNQUFTLFdBQ1hBLElBQU9BLEVBQUtILEVBQWEsR0FFckJHLE1BQVMsU0FDWEEsSUFBTyxVQUlKQSxNQUFTLFNBQVlBLElBQU9DO0FBQ3JDO0FBRUEsU0FBU0MsR0FBYVosR0FBRztBQUN2QixTQUFPQSxhQUFhVztBQUN0QjtBQUVBLFNBQVNFLEdBQWdCLEdBQUc7QUFDMUIsRUFBSUEsR0FBZ0IsTUFDbEJBLEdBQWdCLElBQUksQ0FBQyxJQUVyQixXQUFXLE1BQU07QUFDZixVQUFNO0FBQUEsRUFDUixDQUFDO0FBRUw7QUFFQSxTQUFTQyxHQUFRdlUsR0FBSTtBQUNuQixVQUFRLFFBQVEsRUFBRSxLQUFLLE1BQU07QUFDM0IsUUFBSTtBQUNGLE1BQUFBLEVBQUc7QUFBQSxJQUNMLFNBQVM0RSxHQUFHO0FBQ1YsTUFBQTBQLEdBQWdCMVAsQ0FBQztBQUFBLElBQ25CO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFFQSxTQUFTNFAsR0FBb0JDLEdBQWM7QUFDekMsTUFBSUMsSUFBVUQsRUFBYTtBQUMzQixNQUFJQyxNQUFZLFdBQ2hCRCxFQUFhLFdBQVcsUUFFcEIsRUFBQ0M7QUFJTCxRQUFJO0FBQ0YsVUFBSSxPQUFPQSxLQUFZO0FBQ3JCLFFBQUFBLEVBQVE7QUFBQSxXQUNIO0FBQ0wsWUFBSUMsSUFBY1YsR0FBVVMsR0FBUyxhQUFhO0FBRWxELFFBQUlDLEtBQ0ZBLEVBQVksS0FBS0QsQ0FBTztBQUFBLE1BRTVCO0FBQUEsSUFDRixTQUFTOVAsR0FBRztBQUNWLE1BQUEwUCxHQUFnQjFQLENBQUM7QUFBQSxJQUNuQjtBQUNGO0FBRUEsU0FBU2dRLEdBQWtCSCxHQUFjO0FBQ3ZDLEVBQUFBLEVBQWEsWUFBWSxRQUN6QkEsRUFBYSxTQUFTLFFBQ3RCQSxFQUFhLFNBQVM7QUFDeEI7QUFFQSxTQUFTSSxHQUFrQkosR0FBYztBQUN2QyxNQUFJSyxJQUFRTCxFQUFhO0FBRXpCLE1BQUtLLEdBSUw7QUFBQSxJQUFBTCxFQUFhLFNBQVMsUUFDdEJBLEVBQWEsU0FBUztBQUV0QixhQUFTaFIsSUFBSSxHQUFHQSxJQUFJcVIsRUFBTSxXQUN4QkMsR0FBbUJOLEdBQWNLLEVBQU1yUixDQUFDLEVBQUUsTUFBTXFSLEVBQU1yUixDQUFDLEVBQUUsS0FBSyxHQUMxRGdSLEVBQWEsV0FBVyxXQUZJLEVBQUVoUjtBQUVsQztBQUFBO0FBRUo7QUFFQSxTQUFTc1IsR0FBbUJOLEdBQWNPLEdBQU05UixHQUFPO0FBQ3JELEVBQUF1UixFQUFhLFNBQVM7QUFDdEIsTUFBSVEsSUFBV1IsRUFBYTtBQUU1QixNQUFJO0FBQ0YsUUFBSVMsSUFBSWpCLEdBQVVnQixHQUFVRCxDQUFJO0FBRWhDLFlBQVFBLEdBQU07QUFBQSxNQUNaLEtBQUs7QUFDSCxRQUFJRSxLQUFHQSxFQUFFLEtBQUtELEdBQVUvUixDQUFLO0FBQzdCO0FBQUEsTUFFRixLQUFLO0FBRUgsWUFEQTBSLEdBQWtCSCxDQUFZLEdBQzFCUyxFQUFHLENBQUFBLEVBQUUsS0FBS0QsR0FBVS9SLENBQUs7QUFBQSxZQUFPLE9BQU1BO0FBQzFDO0FBQUEsTUFFRixLQUFLO0FBQ0gsUUFBQTBSLEdBQWtCSCxDQUFZLEdBQzFCUyxLQUFHQSxFQUFFLEtBQUtELENBQVE7QUFDdEI7QUFBQSxJQUNKO0FBQUEsRUFDRixTQUFTclEsR0FBRztBQUNWLElBQUEwUCxHQUFnQjFQLENBQUM7QUFBQSxFQUNuQjtBQUVBLEVBQUk2UCxFQUFhLFdBQVcsV0FBVUQsR0FBb0JDLENBQVksSUFBV0EsRUFBYSxXQUFXLGNBQVdBLEVBQWEsU0FBUztBQUM1STtBQUVBLFNBQVNVLEdBQVNWLEdBQWNPLEdBQU05UixHQUFPO0FBQzNDLE1BQUl1UixFQUFhLFdBQVcsVUFFNUI7QUFBQSxRQUFJQSxFQUFhLFdBQVcsYUFBYTtBQUN2QyxNQUFBQSxFQUFhLE9BQU8sS0FBSztBQUFBLFFBQ3ZCLE1BQUFPO0FBQUEsUUFDQSxPQUFBOVI7QUFBQSxNQUNGLENBQUM7QUFFRDtBQUFBLElBQ0Y7QUFFQSxRQUFJdVIsRUFBYSxXQUFXLFNBQVM7QUFDbkMsTUFBQUEsRUFBYSxTQUFTLGFBQ3RCQSxFQUFhLFNBQVMsQ0FBQztBQUFBLFFBQ3JCLE1BQUFPO0FBQUEsUUFDQSxPQUFBOVI7QUFBQSxNQUNGLENBQUMsR0FDRHFSLEdBQVEsTUFBTU0sR0FBa0JKLENBQVksQ0FBQztBQUM3QztBQUFBLElBQ0Y7QUFFQSxJQUFBTSxHQUFtQk4sR0FBY08sR0FBTTlSLENBQUs7QUFBQTtBQUM5QztBQUVBLE1BQU1rUyxHQUFhO0FBQUEsRUFDakIsWUFBWUgsR0FBVUksR0FBWTtBQUdoQyxTQUFLLFdBQVcsUUFDaEIsS0FBSyxZQUFZSixHQUNqQixLQUFLLFNBQVMsUUFDZCxLQUFLLFNBQVM7QUFDZCxRQUFJSyxJQUFPLE1BQ1BDLElBQXVCO0FBQUEsTUFDekIsSUFBSSxTQUFTO0FBQ1gsZUFBT0QsRUFBSyxXQUFXO0FBQUEsTUFDekI7QUFBQSxNQUVBLEtBQUtwUyxHQUFPO0FBQ1YsUUFBQWlTLEdBQVNHLEdBQU0sUUFBUXBTLENBQUs7QUFBQSxNQUM5QjtBQUFBLE1BRUEsTUFBTUEsR0FBTztBQUNYLFFBQUFpUyxHQUFTRyxHQUFNLFNBQVNwUyxDQUFLO0FBQUEsTUFDL0I7QUFBQSxNQUVBLFdBQVc7QUFDVCxRQUFBaVMsR0FBU0csR0FBTSxVQUFVO0FBQUEsTUFDM0I7QUFBQSxJQUVGO0FBRUEsUUFBSTtBQUNGLFdBQUssV0FBV0QsRUFBVyxLQUFLLFFBQVdFLENBQW9CO0FBQUEsSUFDakUsU0FBUzNRLEdBQUc7QUFDVixNQUFBMlEsRUFBcUIsTUFBTTNRLENBQUM7QUFBQSxJQUM5QjtBQUVBLElBQUksS0FBSyxXQUFXLG1CQUFnQixLQUFLLFNBQVM7QUFBQSxFQUNwRDtBQUFBLEVBRUEsSUFBSSxTQUFTO0FBQ1gsV0FBTyxLQUFLLFdBQVc7QUFBQSxFQUN6QjtBQUFBLEVBRUEsY0FBYztBQUNaLElBQUksS0FBSyxXQUFXLGFBQ2xCZ1EsR0FBa0IsSUFBSSxHQUN0QkosR0FBb0IsSUFBSTtBQUFBLEVBRTVCO0FBRUY7QUFFQSxJQUFJSixLQUFlLE1BQU1vQixHQUFXO0FBQUEsRUFDbEMsWUFBWUgsR0FBWTtBQUN0QixRQUFJLEVBQUUsZ0JBQWdCRyxJQUFhLE9BQU0sSUFBSSxVQUFVLDJDQUEyQztBQUNsRyxRQUFJLE9BQU9ILEtBQWUsV0FBWSxPQUFNLElBQUksVUFBVSwyQ0FBMkM7QUFDckcsU0FBSyxjQUFjQTtBQUFBLEVBQ3JCO0FBQUEsRUFFQSxVQUFVSixHQUFVO0FBQ2xCLFlBQUksT0FBT0EsS0FBYSxZQUFZQSxNQUFhLFVBQy9DQSxJQUFXO0FBQUEsTUFDVCxNQUFNQTtBQUFBLE1BQ04sT0FBTyxVQUFVLENBQUM7QUFBQSxNQUNsQixVQUFVLFVBQVUsQ0FBQztBQUFBLElBQ3ZCLElBR0ssSUFBSUcsR0FBYUgsR0FBVSxLQUFLLFdBQVc7QUFBQSxFQUNwRDtBQUFBLEVBRUEsUUFBUWpWLEdBQUk7QUFDVixXQUFPLElBQUksUUFBUSxDQUFDdUUsR0FBU0csTUFBVztBQUN0QyxVQUFJLE9BQU8xRSxLQUFPLFlBQVk7QUFDNUIsUUFBQTBFLEVBQU8sSUFBSSxVQUFVMUUsSUFBSyxvQkFBb0IsQ0FBQztBQUMvQztBQUFBLE1BQ0Y7QUFFQSxlQUFTeVYsSUFBTztBQUNkLFFBQUFoQixFQUFhLFlBQVksR0FDekJsUSxFQUFRO0FBQUEsTUFDVjtBQUVBLFVBQUlrUSxJQUFlLEtBQUssVUFBVTtBQUFBLFFBQ2hDLEtBQUt2UixHQUFPO0FBQ1YsY0FBSTtBQUNGLFlBQUFsRCxFQUFHa0QsR0FBT3VTLENBQUk7QUFBQSxVQUNoQixTQUFTN1EsR0FBRztBQUNWLFlBQUFGLEVBQU9FLENBQUMsR0FDUjZQLEVBQWEsWUFBWTtBQUFBLFVBQzNCO0FBQUEsUUFDRjtBQUFBLFFBRUEsT0FBTy9QO0FBQUEsUUFDUCxVQUFVSDtBQUFBLE1BQ1osQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVBLElBQUl2RSxHQUFJO0FBQ04sUUFBSSxPQUFPQSxLQUFPLFdBQVksT0FBTSxJQUFJLFVBQVVBLElBQUssb0JBQW9CO0FBQzNFLFFBQUkwVixJQUFJeEIsR0FBVyxJQUFJO0FBQ3ZCLFdBQU8sSUFBSXdCLEVBQUUsQ0FBQVQsTUFBWSxLQUFLLFVBQVU7QUFBQSxNQUN0QyxLQUFLL1IsR0FBTztBQUNWLFlBQUk7QUFDRixVQUFBQSxJQUFRbEQsRUFBR2tELENBQUs7QUFBQSxRQUNsQixTQUFTMEIsR0FBRztBQUNWLGlCQUFPcVEsRUFBUyxNQUFNclEsQ0FBQztBQUFBLFFBQ3pCO0FBRUEsUUFBQXFRLEVBQVMsS0FBSy9SLENBQUs7QUFBQSxNQUNyQjtBQUFBLE1BRUEsTUFBTTBCLEdBQUc7QUFDUCxRQUFBcVEsRUFBUyxNQUFNclEsQ0FBQztBQUFBLE1BQ2xCO0FBQUEsTUFFQSxXQUFXO0FBQ1QsUUFBQXFRLEVBQVMsU0FBUztBQUFBLE1BQ3BCO0FBQUEsSUFFRixDQUFDLENBQUM7QUFBQSxFQUNKO0FBQUEsRUFFQSxPQUFPalYsR0FBSTtBQUNULFFBQUksT0FBT0EsS0FBTyxXQUFZLE9BQU0sSUFBSSxVQUFVQSxJQUFLLG9CQUFvQjtBQUMzRSxRQUFJMFYsSUFBSXhCLEdBQVcsSUFBSTtBQUN2QixXQUFPLElBQUl3QixFQUFFLENBQUFULE1BQVksS0FBSyxVQUFVO0FBQUEsTUFDdEMsS0FBSy9SLEdBQU87QUFDVixZQUFJO0FBQ0YsY0FBSSxDQUFDbEQsRUFBR2tELENBQUssRUFBRztBQUFBLFFBQ2xCLFNBQVMwQixHQUFHO0FBQ1YsaUJBQU9xUSxFQUFTLE1BQU1yUSxDQUFDO0FBQUEsUUFDekI7QUFFQSxRQUFBcVEsRUFBUyxLQUFLL1IsQ0FBSztBQUFBLE1BQ3JCO0FBQUEsTUFFQSxNQUFNMEIsR0FBRztBQUNQLFFBQUFxUSxFQUFTLE1BQU1yUSxDQUFDO0FBQUEsTUFDbEI7QUFBQSxNQUVBLFdBQVc7QUFDVCxRQUFBcVEsRUFBUyxTQUFTO0FBQUEsTUFDcEI7QUFBQSxJQUVGLENBQUMsQ0FBQztBQUFBLEVBQ0o7QUFBQSxFQUVBLE9BQU9qVixHQUFJO0FBQ1QsUUFBSSxPQUFPQSxLQUFPLFdBQVksT0FBTSxJQUFJLFVBQVVBLElBQUssb0JBQW9CO0FBQzNFLFFBQUkwVixJQUFJeEIsR0FBVyxJQUFJLEdBQ25CeUIsSUFBVSxVQUFVLFNBQVMsR0FDN0JDLElBQVcsSUFFWDdQLElBRE8sVUFBVSxDQUFDO0FBRXRCLFdBQU8sSUFBSTJQLEVBQUUsQ0FBQVQsTUFBWSxLQUFLLFVBQVU7QUFBQSxNQUN0QyxLQUFLL1IsR0FBTztBQUNWLFlBQUkyUyxJQUFRLENBQUNEO0FBR2IsWUFGQUEsSUFBVyxJQUVQLENBQUNDLEtBQVNGO0FBQ1osY0FBSTtBQUNGLFlBQUE1UCxJQUFNL0YsRUFBRytGLEdBQUs3QyxDQUFLO0FBQUEsVUFDckIsU0FBUzBCLEdBQUc7QUFDVixtQkFBT3FRLEVBQVMsTUFBTXJRLENBQUM7QUFBQSxVQUN6QjtBQUFBO0FBRUEsVUFBQW1CLElBQU03QztBQUFBLE1BRVY7QUFBQSxNQUVBLE1BQU0wQixHQUFHO0FBQ1AsUUFBQXFRLEVBQVMsTUFBTXJRLENBQUM7QUFBQSxNQUNsQjtBQUFBLE1BRUEsV0FBVztBQUNULFlBQUksQ0FBQ2dSLEtBQVksQ0FBQ0QsRUFBUyxRQUFPVixFQUFTLE1BQU0sSUFBSSxVQUFVLGlDQUFpQyxDQUFDO0FBQ2pHLFFBQUFBLEVBQVMsS0FBS2xQLENBQUcsR0FDakJrUCxFQUFTLFNBQVM7QUFBQSxNQUNwQjtBQUFBLElBRUYsQ0FBQyxDQUFDO0FBQUEsRUFDSjtBQUFBLEVBRUEsTUFBTSxNQUFNO0FBQ1YsUUFBSWEsSUFBUyxDQUFDO0FBQ2QsaUJBQU0sS0FBSyxRQUFRLENBQUE1UyxNQUFTNFMsRUFBTyxLQUFLNVMsQ0FBSyxDQUFDLEdBQ3ZDNFM7QUFBQSxFQUNUO0FBQUEsRUFFQSxVQUFVQyxHQUFTO0FBQ2pCLFFBQUlMLElBQUl4QixHQUFXLElBQUk7QUFDdkIsV0FBTyxJQUFJd0IsRUFBRSxDQUFBVCxNQUFZO0FBQ3ZCLFVBQUlSLEdBQ0F1QixJQUFRO0FBRVosZUFBU0MsRUFBVUMsR0FBTTtBQUN2QixRQUFBekIsSUFBZXlCLEVBQUssVUFBVTtBQUFBLFVBQzVCLEtBQUtDLEdBQUc7QUFDTixZQUFBbEIsRUFBUyxLQUFLa0IsQ0FBQztBQUFBLFVBQ2pCO0FBQUEsVUFFQSxNQUFNdlIsR0FBRztBQUNQLFlBQUFxUSxFQUFTLE1BQU1yUSxDQUFDO0FBQUEsVUFDbEI7QUFBQSxVQUVBLFdBQVc7QUFDVCxZQUFJb1IsTUFBVUQsRUFBUSxVQUNwQnRCLElBQWUsUUFDZlEsRUFBUyxTQUFTLEtBRWxCZ0IsRUFBVVAsRUFBRSxLQUFLSyxFQUFRQyxHQUFPLENBQUMsQ0FBQztBQUFBLFVBRXRDO0FBQUEsUUFFRixDQUFDO0FBQUEsTUFDSDtBQUVBLGFBQUFDLEVBQVUsSUFBSSxHQUNQLE1BQU07QUFDWCxRQUFJeEIsTUFDRkEsRUFBYSxZQUFZLEdBQ3pCQSxJQUFlO0FBQUEsTUFFbkI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFQSxRQUFRelUsR0FBSTtBQUNWLFFBQUksT0FBT0EsS0FBTyxXQUFZLE9BQU0sSUFBSSxVQUFVQSxJQUFLLG9CQUFvQjtBQUMzRSxRQUFJMFYsSUFBSXhCLEdBQVcsSUFBSTtBQUN2QixXQUFPLElBQUl3QixFQUFFLENBQUFULE1BQVk7QUFDdkIsVUFBSW1CLElBQWdCLENBQUMsR0FDakJDLElBQVEsS0FBSyxVQUFVO0FBQUEsUUFDekIsS0FBS25ULEdBQU87QUFDVixjQUFJbEQ7QUFDRixnQkFBSTtBQUNGLGNBQUFrRCxJQUFRbEQsRUFBR2tELENBQUs7QUFBQSxZQUNsQixTQUFTMEIsR0FBRztBQUNWLHFCQUFPcVEsRUFBUyxNQUFNclEsQ0FBQztBQUFBLFlBQ3pCO0FBR0YsY0FBSTBSLElBQVFaLEVBQUUsS0FBS3hTLENBQUssRUFBRSxVQUFVO0FBQUEsWUFDbEMsS0FBS0EsR0FBTztBQUNWLGNBQUErUixFQUFTLEtBQUsvUixDQUFLO0FBQUEsWUFDckI7QUFBQSxZQUVBLE1BQU0wQixHQUFHO0FBQ1AsY0FBQXFRLEVBQVMsTUFBTXJRLENBQUM7QUFBQSxZQUNsQjtBQUFBLFlBRUEsV0FBVztBQUNULGtCQUFJbkIsSUFBSTJTLEVBQWMsUUFBUUUsQ0FBSztBQUNuQyxjQUFJN1MsS0FBSyxLQUFHMlMsRUFBYyxPQUFPM1MsR0FBRyxDQUFDLEdBQ3JDOFMsRUFBZTtBQUFBLFlBQ2pCO0FBQUEsVUFFRixDQUFDO0FBQ0QsVUFBQUgsRUFBYyxLQUFLRSxDQUFLO0FBQUEsUUFDMUI7QUFBQSxRQUVBLE1BQU0xUixHQUFHO0FBQ1AsVUFBQXFRLEVBQVMsTUFBTXJRLENBQUM7QUFBQSxRQUNsQjtBQUFBLFFBRUEsV0FBVztBQUNULFVBQUEyUixFQUFlO0FBQUEsUUFDakI7QUFBQSxNQUVGLENBQUM7QUFFRCxlQUFTQSxJQUFpQjtBQUN4QixRQUFJRixFQUFNLFVBQVVELEVBQWMsV0FBVyxLQUFHbkIsRUFBUyxTQUFTO0FBQUEsTUFDcEU7QUFFQSxhQUFPLE1BQU07QUFDWCxRQUFBbUIsRUFBYyxRQUFRLENBQUFJLE1BQUtBLEVBQUUsWUFBWSxDQUFDLEdBQzFDSCxFQUFNLFlBQVk7QUFBQSxNQUNwQjtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVBLENBQUN0QyxFQUFnQixJQUFJO0FBQ25CLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxPQUFPLEtBQUtOLEdBQUc7QUFDYixRQUFJaUMsSUFBSSxPQUFPLFFBQVMsYUFBYSxPQUFPRjtBQUM1QyxRQUFJL0IsS0FBSyxLQUFNLE9BQU0sSUFBSSxVQUFVQSxJQUFJLG1CQUFtQjtBQUMxRCxRQUFJZ0QsSUFBU3hDLEdBQVVSLEdBQUdNLEVBQWdCO0FBRTFDLFFBQUkwQyxHQUFRO0FBQ1YsVUFBSUMsSUFBYUQsRUFBTyxLQUFLaEQsQ0FBQztBQUM5QixVQUFJLE9BQU9pRCxDQUFVLE1BQU1BLEVBQVksT0FBTSxJQUFJLFVBQVVBLElBQWEsbUJBQW1CO0FBQzNGLGFBQUlyQyxHQUFhcUMsQ0FBVSxLQUFLQSxFQUFXLGdCQUFnQmhCLElBQVVnQixJQUM5RCxJQUFJaEIsRUFBRSxDQUFBVCxNQUFZeUIsRUFBVyxVQUFVekIsQ0FBUSxDQUFDO0FBQUEsSUFDekQ7QUFFQSxRQUFJdEIsR0FBVSxVQUFVLE1BQ3RCOEMsSUFBU3hDLEdBQVVSLEdBQUdLLEVBQWMsR0FFaEMyQztBQUNGLGFBQU8sSUFBSWYsRUFBRSxDQUFBVCxNQUFZO0FBQ3ZCLFFBQUFWLEdBQVEsTUFBTTtBQUNaLGNBQUksQ0FBQVUsRUFBUyxRQUViO0FBQUEscUJBQVMwQixLQUFRRixFQUFPLEtBQUtoRCxDQUFDO0FBRTVCLGtCQURBd0IsRUFBUyxLQUFLMEIsQ0FBSSxHQUNkMUIsRUFBUyxPQUFRO0FBR3ZCLFlBQUFBLEVBQVMsU0FBUztBQUFBO0FBQUEsUUFDcEIsQ0FBQztBQUFBLE1BQ0gsQ0FBQztBQUlMLFFBQUksTUFBTSxRQUFReEIsQ0FBQztBQUNqQixhQUFPLElBQUlpQyxFQUFFLENBQUFULE1BQVk7QUFDdkIsUUFBQVYsR0FBUSxNQUFNO0FBQ1osY0FBSSxDQUFBVSxFQUFTLFFBRWI7QUFBQSxxQkFBUyxJQUFJLEdBQUcsSUFBSXhCLEVBQUUsUUFBUSxFQUFFO0FBRTlCLGtCQURBd0IsRUFBUyxLQUFLeEIsRUFBRSxDQUFDLENBQUMsR0FDZHdCLEVBQVMsT0FBUTtBQUd2QixZQUFBQSxFQUFTLFNBQVM7QUFBQTtBQUFBLFFBQ3BCLENBQUM7QUFBQSxNQUNILENBQUM7QUFHSCxVQUFNLElBQUksVUFBVXhCLElBQUksb0JBQW9CO0FBQUEsRUFDOUM7QUFBQSxFQUVBLE9BQU8sTUFBTW1ELEdBQU87QUFDbEIsUUFBSWxCLElBQUksT0FBTyxRQUFTLGFBQWEsT0FBT0Y7QUFDNUMsV0FBTyxJQUFJRSxFQUFFLENBQUFULE1BQVk7QUFDdkIsTUFBQVYsR0FBUSxNQUFNO0FBQ1osWUFBSSxDQUFBVSxFQUFTLFFBRWI7QUFBQSxtQkFBU3hSLElBQUksR0FBR0EsSUFBSW1ULEVBQU0sUUFBUSxFQUFFblQ7QUFFbEMsZ0JBREF3UixFQUFTLEtBQUsyQixFQUFNblQsQ0FBQyxDQUFDLEdBQ2xCd1IsRUFBUyxPQUFRO0FBR3ZCLFVBQUFBLEVBQVMsU0FBUztBQUFBO0FBQUEsTUFDcEIsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVBLFlBQVlqQixFQUFhLElBQUk7QUFDM0IsV0FBTztBQUFBLEVBQ1Q7QUFFRjtBQUVBTixHQUFhLGFBQWFVO0FBQzFCLE9BQU8sZUFBZUEsSUFBYyxPQUFPLFlBQVksR0FBRztBQUFBLEVBQ3hELE9BQU87QUFBQSxJQUNMLFFBQVFMO0FBQUEsSUFDUixpQkFBQU87QUFBQSxFQUNGO0FBQUEsRUFDQSxjQUFjO0FBQ2hCLENBQUM7QUFFRCxJQUFJdUMsS0FBZ0JuRCxHQUFhO0FBRWpDLE1BQU04QixLQUEwQixnQkFBQWhDLEdBQXdCcUQsRUFBYSxHQUUvRCxFQUFFLE9BQUFDLElBQU8sT0FBQTFKLEdBQU0sSUFBSUMsRUFBcUIsWUFBWSxHQUNwRDBKLEtBQStCLE9BQzdCLHNCQUFzQixXQUMxQixPQUFPLG1CQUFzQixDQUFDLElBRXpCLE9BQU8sbUJBRVZDLEtBQXFCLENBQUN0WSxHQUFTb1EsTUFBa0I7QUFDckQsUUFBTW1JLElBQWEsRUFBRSxTQUFBdlksR0FBUyxlQUFBb1EsRUFBYztBQUM1QyxTQUFPO0FBQUE7QUFBQSxJQUVMLFVBQVVvSSxHQUF3QixZQUFZN0gsR0FBUyxTQUFTLEtBQUs0SCxDQUFVLENBQUM7QUFBQTtBQUFBLElBRWhGLFlBQVlDLEdBQXdCLGNBQWM3SCxHQUFTLFdBQVcsS0FBSzRILENBQVUsQ0FBQztBQUFBO0FBQUEsRUFFeEY7QUFDRixHQUNNQyxLQUEwQixDQUFDQyxHQUFVQyxNQUFhO0FBQ3RELFFBQU1WLElBQWEsSUFBSWxCLEdBQVcsQ0FBQ1AsTUFBYTtBQUM5QyxJQUFBQSxFQUFTLEtBQUssRUFBRSxRQUFRLFVBQVUsQ0FBQyxHQUNuQ21DLEVBQVMsS0FBSyxDQUFDL1AsTUFBVztBQUN4QixNQUFBNE4sRUFBUyxLQUFLLEVBQUUsUUFBUSxVQUFVLFFBQUE1TixFQUFPLENBQUM7QUFBQSxJQUM1QyxDQUFDLEVBQUUsTUFBTSxDQUFDbkgsTUFBVTtBQUNsQixNQUFBK1UsRUFBUyxLQUFLLEVBQUUsUUFBUSxTQUFTLFNBQVMvVSxFQUFNLFFBQVEsQ0FBQztBQUFBLElBQzNELENBQUM7QUFBQSxFQUNILENBQUM7QUFDRCxTQUFBd1csRUFBVyxVQUFVO0FBQUEsSUFDbkIsTUFBTSxDQUFDclAsTUFBVztBQUNoQixNQUFBeVAsR0FBTSxHQUFHSyxDQUFRLGdCQUFnQjlQLENBQU0sR0FDdkMwUCxHQUE2QixFQUFFSSxDQUFRLElBQUk5UDtBQUFBLElBQzdDO0FBQUEsSUFDQSxPQUFPLENBQUNuSCxNQUFVO0FBQ2hCLFlBQUFrTixHQUFNLEdBQUcrSixDQUFRO0FBQUEsRUFDckIsS0FBSyxVQUFValgsQ0FBSyxDQUFDLEVBQUUsR0FDYkE7QUFBQSxJQUNSO0FBQUEsRUFDRixDQUFDLEdBQ013VztBQUNULEdBRU1XLEtBQWE7QUFBQSxFQUNqQixXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQUEsRUFDYixXQUFXLFlBQVk7QUFDckIsWUFBUTtBQUFBLE1BQ047QUFBQTtBQUFBO0FBQUEsSUFHRjtBQUFBLEVBQ0Y7QUFDRixHQUNNQyxLQUFXO0FBQUEsRUFDZixXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQUEsRUFDYixXQUFXLFlBQVk7QUFDckIsWUFBUSxNQUFNLDREQUE0RDtBQUFBLEVBQzVFO0FBQ0Y7QUFFQSxJQUFJQyxLQUFtQixFQUFDLFNBQVMsQ0FBQyxFQUFDLEdBRS9CQyxLQUFRN1o7QUFFWixTQUFTOFosR0FBZUMsR0FBUUMsR0FBUzNILEdBQVE7QUFDL0MsTUFBSTRILElBQWEsT0FBT0QsS0FBWTtBQUVwQyxFQUFBSCxHQUFNLFVBQVUsV0FBWTtBQUMxQixRQUFJblEsR0FDQXdRLElBQVUsSUFDVkMsSUFBZUosRUFBTyxXQUFZO0FBQ3BDLGFBQU9HO0FBQUEsSUFDVCxDQUFDO0FBRUQsbUJBQVEsUUFBUUMsQ0FBWSxFQUFFLEtBQUssU0FBVTVVLEdBQU87QUFDbEQsTUFBQW1FLElBQVNuRTtBQUFBLElBQ1gsQ0FBQyxHQUVNLFdBQVk7QUFDakIsTUFBQTJVLElBQVUsSUFFTkQsS0FDRkQsRUFBUXRRLENBQU07QUFBQSxJQUVsQjtBQUFBLEVBQ0YsR0FBR3VRLElBQWE1SCxJQUFTMkgsQ0FBTztBQUNsQztBQUVBSixHQUFpQixVQUFVRTtBQUMzQkYsR0FBaUIsUUFBUSxpQkFBaUJFO0FBRTFDLElBQUlNLEtBQXdCUixHQUFpQjtBQUM3QyxNQUFNUyxLQUFnQyxnQkFBQXhFLEdBQXdCdUUsRUFBcUI7QUFFbkYsU0FBU0UsR0FBYWpZLEdBQUlrWSxJQUFLLEdBQUc7QUFDaEMsUUFBTUMsSUFBUXJhLEdBQU8sRUFBSyxHQUNwQnNhLElBQVV0YSxHQUFPLEdBQ2pCdWEsSUFBV3ZhLEdBQU9rQyxDQUFFLEdBQ3BCc1ksSUFBVXZhLEVBQVksTUFBTW9hLEVBQU0sU0FBUyxDQUFDLENBQUMsR0FDN0NJLElBQU14YSxFQUFZLE1BQU07QUFDNUIsSUFBQW9hLEVBQU0sVUFBVSxJQUNoQkMsRUFBUSxXQUFXLGFBQWFBLEVBQVEsT0FBTyxHQUMvQ0EsRUFBUSxVQUFVLFdBQVcsTUFBTTtBQUNqQyxNQUFBRCxFQUFNLFVBQVUsSUFDaEJFLEVBQVMsUUFBUTtBQUFBLElBQ25CLEdBQUdILENBQUU7QUFBQSxFQUNQLEdBQUcsQ0FBQ0EsQ0FBRSxDQUFDLEdBQ0RNLElBQVF6YSxFQUFZLE1BQU07QUFDOUIsSUFBQW9hLEVBQU0sVUFBVSxNQUNoQkMsRUFBUSxXQUFXLGFBQWFBLEVBQVEsT0FBTztBQUFBLEVBQ2pELEdBQUcsQ0FBQyxDQUFDO0FBQ0wsU0FBQXBhLEVBQVUsTUFBTTtBQUNkLElBQUFxYSxFQUFTLFVBQVVyWTtBQUFBLEVBQ3JCLEdBQUcsQ0FBQ0EsQ0FBRSxDQUFDLEdBQ1BoQyxFQUFVLE9BQ1J1YSxFQUFJLEdBQ0dDLElBQ04sQ0FBQ04sQ0FBRSxDQUFDLEdBQ0EsQ0FBQ0ksR0FBU0UsR0FBT0QsQ0FBRztBQUM3QjtBQUVBLFNBQVNFLEdBQVl6WSxHQUFJa1ksSUFBSyxHQUFHUSxJQUFPLENBQUMsR0FBRztBQUMxQyxRQUFNLENBQUNKLEdBQVNLLEdBQVFDLENBQUssSUFBSVgsR0FBYWpZLEdBQUlrWSxDQUFFO0FBQ3BELFNBQUFsYSxFQUFVNGEsR0FBT0YsQ0FBSSxHQUNkLENBQUNKLEdBQVNLLENBQU07QUFDekI7QUFFQSxNQUFNRSxLQUFvQixDQUFDQyxHQUFXbk8sR0FBU2tCLEdBQWFoRyxNQUFZO0FBQ3RFLFFBQU0sQ0FBQ2tULEdBQWdCQyxDQUFpQixJQUFJL2EsRUFBUyxFQUFFLEdBQ2pELENBQUNnYixHQUFvQkMsQ0FBcUIsSUFBSWpiLEVBQVMsRUFBRSxHQUN6RCxDQUFDa2IsR0FBWUMsQ0FBYSxJQUFJbmIsRUFBUyxJQUFJLEdBQzNDLENBQUNvYixHQUFrQkMsQ0FBbUIsSUFBSXJiLEVBQVMsRUFBSyxHQUN4RCxDQUFDc2IsR0FBY0MsQ0FBZSxJQUFJdmIsRUFBUyxJQUFJO0FBQ3JELFNBQUErWixHQUFpQixZQUFZO0FBQzNCLFFBQUksQ0FBQ25TLEtBQVcsQ0FBQ2lUO0FBQ2Y7QUFFRixVQUFNVyxJQUFrQixNQUFNak8sR0FBc0IzRixHQUFTdEYsRUFBVSxjQUFjO0FBQ3JGLElBQUFrWixLQUFBLFFBQUFBLEVBQWlCLGlCQUFpQixTQUFTLE1BQU07QUFDL0MsTUFBQUgsRUFBb0IsRUFBSSxHQUN4QkUsRUFBZ0IsSUFBSSxHQUNwQlIsRUFBa0JTLEVBQWdCLEtBQUs7QUFBQSxJQUN6QztBQUFBLEVBQ0YsR0FBRyxDQUFDLENBQUMsQ0FBQzVULEdBQVNpVCxDQUFTLENBQUMsR0FDekJMO0FBQUEsSUFDRSxNQUFNO0FBQ0osTUFBS0ssS0FHTEksRUFBc0JILENBQWM7QUFBQSxJQUN0QztBQUFBLElBQ0E7QUFBQSxJQUNBLENBQUNBLEdBQWdCRCxDQUFTO0FBQUEsRUFDNUIsR0FDQWQ7QUFBQSxJQUNFLE9BQU8wQixNQUFjO0FBQ25CLFVBQUk7QUFDRixZQUFJLENBQUMvTyxLQUFXLENBQUNrQixLQUFlLENBQUNpTjtBQUMvQjtBQUdGLGNBQU0xTSxNQURVLE1BQU1qQixFQUFXUixDQUFPLEdBQ1osU0FBUyxTQUMvQmdQLElBQVUsTUFBTXhOLEdBQXlCeEIsR0FBU2tCLEdBQWFPLElBQWE2TSxDQUFrQjtBQUNwRyxnQkFBUSxJQUFJLDZDQUE2Q0EsQ0FBa0IsR0FDdkVTLEVBQVUsS0FDWixRQUFRLElBQUksd0NBQXdDVCxHQUFvQlUsQ0FBTyxHQUMvRUgsRUFBZ0IsSUFBSSxHQUNwQkosRUFBY08sQ0FBTyxLQUVyQixRQUFRLElBQUksbUNBQW1DQSxDQUFPO0FBQUEsTUFFMUQsU0FBUy9VLEdBQUc7QUFDVixRQUFJOFUsRUFBVSxNQUNaLFFBQVEsTUFBTSwyQ0FBMkMvWixHQUFnQmlGLENBQUMsQ0FBQyxHQUMzRTRVLEVBQWdCN1osR0FBZ0JpRixDQUFDLENBQUM7QUFBQSxNQUV0QyxVQUFFO0FBQ0EsUUFBSThVLEVBQVUsS0FDWkosRUFBb0IsRUFBSztBQUFBLE1BRTdCO0FBQUEsSUFDRjtBQUFBLElBQ0EsQ0FBQyxDQUFDM08sR0FBUyxDQUFDa0IsR0FBYW9OLEdBQW9CSCxDQUFTO0FBQUEsRUFDeEQsR0FDTztBQUFBLElBQ0wsUUFBUUs7QUFBQSxJQUNSLFdBQVdFO0FBQUEsSUFDWCxPQUFPRTtBQUFBLEVBQ1Q7QUFDRixHQUVNSyxLQUFTLENBQUNDLElBQWEsQ0FBQyxNQUFNO0FBQ2xDLFFBQU0sQ0FBQ0MsR0FBS3ZCLENBQUcsSUFBSXRhLEVBQVM0YixDQUFVLEdBQ2hDRSxJQUFnQjdiO0FBQUEsSUFDcEIsT0FBTztBQUFBLE1BQ0wsS0FBSyxDQUFDaUIsR0FBSzZhLE1BQVU7QUFDbkIsUUFBQXpCLEVBQUksQ0FBQzBCLE9BQWE7QUFBQSxVQUNoQixHQUFHQTtBQUFBLFVBQ0gsQ0FBQzlhLENBQUcsR0FBRzZhO0FBQUEsUUFDVCxFQUFFO0FBQUEsTUFDSjtBQUFBLE1BQ0EsUUFBUSxDQUFDRSxNQUFXO0FBQ2xCLFFBQUEzQixFQUFJMkIsQ0FBTTtBQUFBLE1BQ1o7QUFBQSxNQUNBLFFBQVEsQ0FBQy9hLE1BQVE7QUFDZixRQUFBb1osRUFBSSxDQUFDMEIsTUFBWTtBQUNmLGdCQUFNLEVBQUUsQ0FBQzlhLENBQUcsR0FBR2diLEdBQU0sR0FBR0MsRUFBSyxJQUFJSDtBQUNqQyxpQkFBT0c7QUFBQSxRQUNULENBQUM7QUFBQSxNQUNIO0FBQUEsTUFDQSxPQUFPLE1BQU03QixFQUFJc0IsQ0FBVTtBQUFBLElBQzdCO0FBQUE7QUFBQSxJQUVBLENBQUN0QixDQUFHO0FBQUEsRUFDTixHQUNNOEIsSUFBUTtBQUFBLElBQ1osS0FBS3RjLEVBQVksQ0FBQ29CLE1BQVEyYSxFQUFJM2EsQ0FBRyxHQUFHLENBQUMyYSxDQUFHLENBQUM7QUFBQSxJQUN6QyxHQUFHQztBQUFBLEVBQ0w7QUFDQSxTQUFPLENBQUNELEdBQUtPLENBQUs7QUFDcEIsR0FFTUMsS0FBbUIsTUFBTTtBQUM3QixRQUFNLENBQUNDLEdBQVVDLENBQWMsSUFBSVosR0FBTztBQUFBLElBQ3hDLE1BQU07QUFBQSxJQUNOLFlBQVk7QUFBQSxJQUNaLGVBQWU7QUFBQSxJQUNmLGVBQWU7QUFBQSxFQUNqQixDQUFDLEdBQ0thLElBQWEsT0FBTyxPQUFPRixDQUFRLEVBQUUsT0FBTyxDQUFDNVAsTUFBWUEsTUFBWSxNQUFNLEVBQUUsQ0FBQyxLQUFLO0FBQ3pGLFNBQU87QUFBQSxJQUNMLFVBQUE0UDtBQUFBLElBQ0EsWUFBQUU7QUFBQSxJQUNBLG9CQUFvQixPQUFPQyxHQUFhalQsTUFBVztBQUNqRCxNQUFBK1MsRUFBZSxJQUFJRSxHQUFhLE1BQU1sVCxHQUFvQkMsQ0FBTSxDQUFDO0FBQUEsSUFDbkU7QUFBQSxFQUNGO0FBQ0YsR0FDTWtULEtBQTZCLENBQUNDLE1BQWE7QUFDL0MsUUFBTUYsSUFBY0UsRUFBUyxRQUFRLFFBQVEsRUFBRSxFQUFFLFFBQVEsWUFBWSxFQUFFLEdBQ2pFck0sSUFBU3ZOLEdBQVksVUFBVTBaLENBQVc7QUFDaEQsTUFBSSxDQUFDbk0sRUFBTztBQUNWLFVBQU0sSUFBSTtBQUFBLE1BQ1IsdUJBQXVCcU0sQ0FBUTtBQUFBLElBQ2pDO0FBRUYsU0FBT3JNLEVBQU87QUFDaEIsR0FFTXNNLEtBQWUsQ0FBQ0MsTUFBVTtBQUM5QixRQUFNO0FBQUEsSUFDSixVQUFBQztBQUFBLElBQ0EscUJBQUFDO0FBQUEsSUFDQSxXQUFBQztBQUFBLElBQ0EsU0FBQUM7QUFBQSxJQUNBLFFBQUFDO0FBQUEsSUFDQSxVQUFBQztBQUFBLElBQ0EsUUFBQUM7QUFBQSxJQUNBLGFBQUFDO0FBQUEsSUFDQSxtQkFBQWxWO0FBQUEsSUFDQSxtQkFBQW1WO0FBQUEsSUFDQSxtQkFBQUM7QUFBQSxJQUNBLGlCQUFBQztBQUFBLElBQ0EsNkJBQUFDO0FBQUEsSUFDQSxTQUFBelU7QUFBQSxJQUNBLHVCQUFBMFU7QUFBQSxJQUNBLGtCQUFBQztBQUFBLEVBQ0YsSUFBSWQsR0FDRWUsSUFBZTVVLEtBQVd0SSxJQUMxQixDQUFDbWQsSUFBU0MsRUFBVSxJQUFJOWQsRUFBUyxNQUFNLEdBQ3ZDLENBQUMrZCxJQUFRQyxFQUFTLElBQUloZSxFQUFTLENBQUMsQ0FBQyxHQUNqQyxDQUFDaWUsSUFBWUMsRUFBYSxJQUFJbGUsRUFBUyxLQUFLLEdBQzVDLENBQUNtZSxJQUFRQyxFQUFTLElBQUlwZSxFQUFTLEVBQUssR0FDcEMsQ0FBQ3VJLEdBQVc4VixFQUFZLElBQUlyZSxFQUFTLE1BQU0sR0FDM0MsQ0FBQ3NlLElBQWNDLENBQWUsSUFBSXZlLEVBQVMsRUFBSyxHQUNoRCxDQUFDd2UsR0FBU0MsRUFBVSxJQUFJemUsRUFBUyxDQUFDLENBQUMsR0FDbkMsQ0FBQzBlLElBQWNDLEVBQWUsSUFBSTNlLEVBQVMsQ0FBQyxDQUFDLEdBQzdDLENBQUM0ZSxJQUFXQyxFQUFZLElBQUk3ZSxFQUFTLENBQUMsR0FDdEMsQ0FBQzhlLElBQWVDLENBQWdCLElBQUkvZSxFQUFTLEVBQUssR0FDbEQsQ0FBQ2tJLEdBQVc4VyxFQUFZLElBQUloZixFQUFTLE1BQU0sR0FDM0MsQ0FBQ2lHLElBQVVnWixFQUFXLElBQUlqZixFQUFTLE1BQU0sR0FDekMsQ0FBQ2tmLElBQWtCQyxFQUFtQixJQUFJbmYsRUFBUyxNQUFNLEdBQ3pELENBQUNvZixHQUF3QkMsRUFBeUIsSUFBSXJmLEVBQVMsTUFBTSxHQUNyRSxDQUFDOEcsRUFBUSxJQUFJOUcsRUFBUyxNQUFNLEdBQzVCOEksSUFBUzdJLEdBQVEsTUFBTSxhQUFhRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FDOUNrZixJQUFVemYsR0FBTyxJQUFJLEdBQ3JCLEVBQUUsVUFBQXljLElBQVUsWUFBQUUsR0FBWSxvQkFBQStDLEdBQW1CLElBQUlsRCxHQUFpQixHQUNoRSxDQUFDbUQsSUFBd0JDLEVBQXlCLElBQUl6ZixFQUFTLElBQUksR0FDbkUsQ0FBQzBmLElBQWlCQyxDQUFrQixJQUFJaEUsR0FBTztBQUFBLElBQ25ELFdBQVd2QztBQUFBLElBQ1gsWUFBWUE7QUFBQSxFQUNkLENBQUM7QUFDRCxFQUFBclosRUFBVSxNQUFNO0FBQ2QsVUFBTTZmLElBQWMsRUFBRSxTQUFTLFNBQVMsaUJBQWlCLHNCQUFzQjtBQUMvRSxXQUFPLGNBQWlCQSxHQUN4QixRQUFRLElBQUksZ0JBQWdCQSxDQUFXO0FBQUEsRUFDekMsR0FBRyxDQUFDLENBQUM7QUFDTCxRQUFNQyxLQUFpQmpGO0FBQUEsSUFDckI4QyxLQUF5QjtBQUFBLElBQ3pCbEI7QUFBQSxJQUNBTztBQUFBLElBQ0F1QyxFQUFRO0FBQUEsRUFDVixHQUNNUSxLQUFZaGdCO0FBQUEsSUFDaEIsQ0FBQ21KLE1BQVU7QUFFVCxVQURJQSxFQUFNLFdBQVcyVSxLQUNqQixDQUFDM1UsRUFBTSxPQUFRO0FBQ25CLFlBQU04VyxJQUFjOVcsRUFBTTtBQUMxQixVQUFJLENBQUMyRixHQUFhM0YsRUFBTSxJQUFJO0FBQzFCO0FBRUYsWUFBTStXLElBQU0sS0FBSyxNQUFNL1csRUFBTSxJQUFJLEdBQzNCTixJQUFZRCxHQUFrQnNYLENBQUcsR0FDakNqWCxJQUFZSixFQUFVO0FBRTVCLFVBRHFCQSxFQUFVLFdBQ1ZHLEtBQVUsQ0FBQ0MsR0FBVztBQUN6QyxnQkFBUSxLQUFLLGtDQUFrQ0osQ0FBUztBQUN4RDtBQUFBLE1BQ0Y7QUFDQSxVQUFJQSxFQUFVLFNBQVNvVixJQUFRO0FBQzdCLGdCQUFRLEtBQUssb0NBQW9DcFYsQ0FBUztBQUMxRDtBQUFBLE1BQ0Y7QUFDQSxNQUFBcVYsR0FBVSxDQUFDaUMsTUFBZSxDQUFDLEdBQUdBLEdBQVl0WCxFQUFVLEtBQUssQ0FBQztBQUMxRCxZQUFNdVgsSUFBZXZYLEVBQVUsU0FDekJWLElBQVlpWSxFQUFhO0FBRS9CLFVBREEsUUFBUSxJQUFJLG1CQUFtQmpZLENBQVMsZUFBZWMsQ0FBUyxLQUFLSixFQUFVLE9BQU8sR0FDbEZWLE1BQWMvRSxFQUFVLEtBQUssUUFBUTtBQUN2QyxjQUFNaWQsSUFBU0QsRUFBYSxTQUFTLEdBQUdBLEVBQWEsTUFBTSxPQUFPO0FBQ2xFLFFBQUFoQyxHQUFjaUMsQ0FBTSxHQUNwQixRQUFRLElBQUksaUNBQWlDQSxDQUFNLEVBQUU7QUFBQSxNQUN2RCxXQUFXbFksTUFBYy9FLEVBQVUsS0FBSyxTQUFXK1o7QUFDakQsUUFBQUEsRUFBUXRVLEVBQVUsU0FBUztBQUFBLGVBQ2xCVixNQUFjL0UsRUFBVSxLQUFLLFFBQVVnYTtBQUNoRCxRQUFBQSxFQUFPdlUsRUFBVSxTQUFTO0FBQUEsZUFDakJWLE1BQWMvRSxFQUFVLEtBQUssVUFBWWlhO0FBQ2xELFFBQUFBLEVBQVN4VSxFQUFVLFNBQVM7QUFBQSxlQUNuQlYsTUFBYy9FLEVBQVUsS0FBSyxRQUFRO0FBQzlDLGNBQU1rZCxJQUFpQjVCLEVBQVEsS0FBSyxDQUFDaFYsTUFBV0EsRUFBTyxrQkFBa0J1VyxDQUFXO0FBRXBGLFlBREF4QixFQUFnQixFQUFLLEdBQ2pCLENBQUM2QixHQUFnQjtBQUNuQixrQkFBUSxLQUFLLDBEQUEwRHpYLENBQVM7QUFDaEY7QUFBQSxRQUNGO0FBQ0EsUUFBQWdXLEdBQWdCLENBQUMwQixPQUFpQixFQUFFLEdBQUdBLEdBQWEsQ0FBQ3RYLENBQVMsR0FBR2dYLEVBQVksRUFBRSxHQUMvRVosR0FBb0JlLEVBQWEsZ0JBQWdCLEdBQ2pEakIsR0FBWWlCLEVBQWEsUUFBUSxHQUNqQ2IsR0FBMEJhLEVBQWEsc0JBQXNCLEdBQ3hEaFksS0FBVzhXLEdBQWFrQixFQUFhLFNBQVMsR0FDbkQsUUFBUSxJQUFJLDRDQUE0Q0EsQ0FBWTtBQUFBLE1BQ3RFLFdBQVdqWSxNQUFjL0UsRUFBVSxLQUFLO0FBQ3RDLGdCQUFRLElBQUksNkJBQTZCLEdBQ3pDcWIsRUFBZ0IsRUFBSTtBQUFBLGVBQ1h0VyxNQUFjL0UsRUFBVSxLQUFLO0FBQ3RDLFFBQUlvYSxLQUFtQkEsRUFBa0I7QUFBQSxlQUNoQ3JWLE1BQWMvRSxFQUFVLEtBQUssc0JBQXNCO0FBQzVELFlBQUksQ0FBQ3FGO0FBQ0gsZ0JBQU0sSUFBSSxNQUFNLHlCQUF5QjtBQUUzQyxZQUFJLENBQUNpVTtBQUNILGdCQUFNLElBQUksTUFBTSxzQkFBc0I7QUE0Q3hDLFNBMUM2QixZQUFZO0FBQ3ZDLGdCQUFNOEQsSUFBaUJKLEVBQWEsbUJBQW1CO0FBRXZELGNBREEsUUFBUSxJQUFJLDhDQUE4Q0EsRUFBYSxrQkFBa0IsR0FDckZJLE1BQW1CO0FBQ3JCLG9CQUFRLElBQUksd0NBQXdDO0FBQUEsbUJBQzNDQSxNQUFtQjtBQUM1QixvQkFBUSxJQUFJLDRDQUE0QyxHQUN4RCxNQUFNcFosR0FBeUJnWixDQUFZO0FBQUEsbUJBQ2xDSSxNQUFtQiwwQkFBMEI7QUFDdEQsZ0JBQUksQ0FBQ3haO0FBQ0gsb0JBQU0sSUFBSSxNQUFNLG1CQUFtQjtBQUVyQyxvQkFBUSxJQUFJLDRDQUE0QyxHQUN4RCxNQUFNRixHQUFvQ3NaLEdBQWNwWixFQUFRO0FBQUEsVUFDbEU7QUFDRSxrQkFBTSxJQUFJLE1BQU0sNkJBQTZCd1osQ0FBYyxFQUFFO0FBRS9ELGdCQUFNdFAsSUFBVSxNQUFNOUQsRUFBV3NQLENBQVU7QUFDM0MsY0FBSXhMLEVBQVEsU0FBUyxTQUFTO0FBQzVCLGtCQUFNLEVBQUUsaUJBQUF1UCxFQUFnQixJQUFJLE1BQU1qVCxHQUFtQmtQLEdBQVk7QUFBQSxjQUMvRCxjQUFjeEwsRUFBUTtBQUFBLGNBQ3RCLG1CQUFtQnpJLEVBQVU7QUFBQSxZQUMvQixDQUFDO0FBQ0QsZ0JBQUlnWSxFQUFnQixXQUFXO0FBQzdCLG9CQUFNLElBQUksTUFBTSw0Q0FBNENBLEVBQWdCLE1BQU0sRUFBRTtBQUV0RiwyQkFBUSxJQUFJLDRDQUE0Q0EsQ0FBZSxHQUN2RWhDLEVBQWdCLEVBQUssR0FDckJNLEdBQWEsQ0FBQyxHQUNkRSxFQUFpQixFQUFLLEdBQ2xCdEIsS0FDRkEsRUFBNEI4QyxFQUFnQixDQUFDLEVBQUUsRUFBRSxHQUU1QztBQUFBLGNBQ0wsbUJBQW1CO0FBQUEsWUFDckI7QUFBQSxVQUNGO0FBQ0UsbUJBQU87QUFBQSxjQUNMLG1CQUFtQjtBQUFBLFlBQ3JCO0FBQUEsUUFFSixHQUNxQixFQUFFLEtBQUssQ0FBQyxFQUFFLG1CQUFBQyxFQUFrQixNQUFNO0FBLzdFL0QsY0FBQXBaO0FBZzhFVSxjQUFJLENBQUNvWixHQUFtQjtBQUN0QixvQkFBUSxJQUFJLHVEQUF1RDtBQUNuRTtBQUFBLFVBQ0Y7QUFDQSxrQkFBUSxJQUFJLDZDQUE2QztBQUN6RCxjQUFJQztBQUNKLGNBQUlsWSxFQUFVLHNCQUFzQixhQUFhLGtCQUMvQ2tZLEtBQWlCclosSUFBQThZLEVBQWEsb0JBQWIsZ0JBQUE5WSxFQUE4QixVQUMzQyxDQUFDcVo7QUFDSCxrQkFBTSxJQUFJLE1BQU0sb0JBQW9CO0FBR3hDLFVBQUE3WDtBQUFBLFlBQ0VtWDtBQUFBLFlBQ0FqWDtBQUFBLFlBQ0FDO0FBQUEsWUFDQSxFQUFFLEdBQUdSLEdBQVcsTUFBTSxZQUFZLHNCQUFzQixJQUFNLGdCQUFBa1ksRUFBZTtBQUFBLFlBQzdFN0M7QUFBQSxVQUNGLEdBQ0FtQixFQUFpQixFQUFJLEdBQ3JCVixHQUFhLE1BQU0sR0FDZmYsS0FBbUJBLEVBQWtCO0FBQUEsUUFDM0MsQ0FBQyxFQUFFLE1BQU0sQ0FBQzNXLE1BQU07QUFDZCxrQkFBUSxJQUFJLHdDQUF3QyxHQUNwRCxRQUFRLE1BQU1BLENBQUM7QUFDZixnQkFBTStaLElBQVNoZixHQUFnQmlGLENBQUM7QUFDaEMsVUFBQTRYLEVBQWdCLEVBQUssR0FDckJRLEVBQWlCLEVBQUssR0FDbEJ2QixLQUFpQkEsRUFBZ0JrRCxDQUFNO0FBQUEsUUFDN0MsQ0FBQztBQUFBLE1BQ0gsV0FBV3pZLE1BQWMvRSxFQUFVLEtBQUssb0JBQXNCcUYsR0FBVztBQUN2RSxjQUFNb1ksSUFBaUIvQixLQUFZLEdBQzdCZ0MsSUFBZUQsTUFBbUIsT0FBTyxLQUFLakMsRUFBWSxFQUFFO0FBQ2xFLFFBQUksQ0FBQ0ksT0FBa0I4QixLQUFnQlYsRUFBYSx1QkFDbEQsUUFBUSxJQUFJLDZDQUE2QyxHQUN6RHRYLEdBQVVtWCxHQUFhalgsR0FBUUMsR0FBV1IsR0FBV3FWLENBQVksR0FDakVtQixFQUFpQixFQUFJLEdBQ3JCVixHQUFhLE1BQU0sTUFFbkIsUUFBUSxJQUFJLGtCQUFrQnRWLENBQVMsNERBQTRELEdBQ25HOFYsR0FBYThCLENBQWM7QUFBQSxNQUUvQixXQUFXMVksTUFBYy9FLEVBQVUsS0FBSztBQUN0QyxnQkFBUSxJQUFJLDZCQUE2QmdkLENBQVksR0FDckQzQixFQUFnQixFQUFLLEdBQ3JCTSxHQUFhLENBQUMsR0FDZEUsRUFBaUIsRUFBSyxHQUNsQnhCLEtBQ0ZBLEVBQWtCMkMsRUFBYSxhQUFhQSxFQUFhLGlCQUFpQkEsRUFBYSxVQUFVO0FBQUEsZUFFMUZqWSxNQUFjL0UsRUFBVSxLQUFLO0FBQ3RDLGdCQUFRLElBQUkseUNBQXlDZ2QsQ0FBWSxHQUNqRTNCLEVBQWdCLEVBQUssR0FDckJNLEdBQWEsQ0FBQyxHQUNkRSxFQUFpQixFQUFLLEdBQ2xCdEIsS0FDRkEsRUFBNEJ5QyxFQUFhLGVBQWU7QUFBQSxlQUVqRGpZLE1BQWMvRSxFQUFVLEtBQUs7QUFDdEMsZ0JBQVEsTUFBTSxnQ0FBZ0NnZCxFQUFhLE9BQU8sR0FDOUQ3QyxLQUFhQSxFQUFZNkMsRUFBYSxPQUFPO0FBQUEsZUFDeENqWSxNQUFjL0UsRUFBVSxLQUFLLGtCQUFrQjtBQUN4RCxjQUFNMmQsSUFBV3RZLEtBQUEsZ0JBQUFBLEVBQVcsc0JBQXNCO0FBQ2xELFNBQUlzWSxNQUFhLGlCQUFpQkEsTUFBYSxZQUM3QyxRQUFRLE1BQU0sK0JBQStCWCxFQUFhLFdBQVcsS0FBS0EsRUFBYSxNQUFNLEdBQ3pGL1gsS0FBbUJBLEVBQWtCK1gsRUFBYSxhQUFhQSxFQUFhLFFBQVFuWCxDQUFTO0FBQUEsTUFFckcsV0FBV2QsTUFBYy9FLEVBQVUsS0FBSyxrQkFBa0IrRSxNQUFjL0UsRUFBVSxLQUFLO0FBRXJGLFlBREEsUUFBUSxNQUFNLGtDQUFrQ2dkLEVBQWEsT0FBTyxHQUNoRUEsRUFBYSxZQUFZLGdCQUFnQjtBQUMzQyxnQkFBTVksSUFBVTFCLEtBQUEsZ0JBQUFBLEVBQXdCLEtBQUssQ0FBQ3ZQLE1BQVFBLEVBQUksYUFBYTtBQUN2RSxjQUFJLENBQUMzSCxLQUFhLENBQUNvWCxFQUFRLFdBQVcsQ0FBQ25YLEtBQXFCLENBQUMyWSxFQUFTO0FBQ3RFLHFCQUFXLENBQUNDLEdBQVlsWSxDQUFNLEtBQUssT0FBTyxRQUFRNlYsRUFBWSxHQUFHO0FBQy9ELGdCQUFJLENBQUM3VixFQUFRO0FBQ2Isa0JBQU1tWSxJQUF3QmhaO0FBQUEsY0FDNUI5RSxFQUFVLEtBQUs7QUFBQSxjQUNmZ0Y7QUFBQSxjQUNBb1gsRUFBUTtBQUFBLGNBQ1JuWDtBQUFBO0FBQUE7QUFBQSxjQUdBLEVBQUUsR0FBRzJZLEdBQVMsZ0JBQWdCLFNBQVM7QUFBQSxjQUN2QztBQUFBLFlBQ0Y7QUFDQSxnQkFBS0UsR0FDTDtBQUFBLGNBQUFqQyxFQUFpQixFQUFJLEdBQ3JCVixHQUFhMkMsQ0FBcUIsR0FDbENwWSxHQUFVQyxHQUFRQyxHQUFRaVksR0FBWUMsR0FBdUJwRCxDQUFZO0FBQ3pFO0FBQUE7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUNFLFVBQUFXLEVBQWdCLEVBQUssR0FDckJRLEVBQWlCLEVBQUssR0FDbEJ2QixLQUFpQkEsRUFBZ0IwQyxFQUFhLE9BQU87QUFBQSxJQUcvRDtBQUFBLElBQ0E7QUFBQSxNQUNFcFg7QUFBQSxNQUNBWjtBQUFBLE1BQ0E2VjtBQUFBLE1BQ0F4VjtBQUFBLE1BQ0FpVztBQUFBLE1BQ0FFO0FBQUEsTUFDQUU7QUFBQSxNQUNBRTtBQUFBLE1BQ0E1QjtBQUFBLE1BQ0FDO0FBQUEsTUFDQUY7QUFBQSxNQUNBSTtBQUFBLE1BQ0FDO0FBQUEsTUFDQUM7QUFBQSxNQUNBRTtBQUFBLE1BQ0FEO0FBQUEsTUFDQXJWO0FBQUEsTUFDQXlWO0FBQUEsTUFDQTlXO0FBQUEsTUFDQXNZO0FBQUEsTUFDQTVDO0FBQUEsSUFDRjtBQUFBLEVBQ0YsR0FDTXlFLEtBQW1CaGhCLEdBQVEsTUFBTTtBQUNyQyxVQUFNaWhCLElBQU8sTUFBTTtBQUFBLElBQ25CO0FBQ0EsV0FBTztBQUFBLE1BQ0wsaUJBQWlCcmYsR0FBaUIsbUJBQW1CMmIsS0FBbUIwRCxDQUFJO0FBQUEsTUFDNUUsbUJBQW1CcmYsR0FBaUIscUJBQXFCeWIsS0FBcUI0RCxDQUFJO0FBQUEsTUFDbEYsbUJBQW1CcmYsR0FBaUIscUJBQXFCMGIsS0FBcUIyRCxDQUFJO0FBQUEsTUFDbEYsNkJBQTZCcmYsR0FBaUIsK0JBQStCNGIsS0FBK0J5RCxDQUFJO0FBQUEsTUFDaEgsbUJBQW1CcmYsR0FBaUIscUJBQXFCc0csS0FBcUIrWSxDQUFJO0FBQUEsSUFDcEY7QUFBQSxFQUNGLEdBQUcsQ0FBQzFELEdBQWlCRixHQUFtQkMsR0FBbUJFLEdBQTZCdFYsQ0FBaUIsQ0FBQyxHQUNwR2daLEtBQXlCLE1BQU07QUFDbkMsUUFBSSxDQUFDN0IsRUFBUSxXQUFXLENBQUNwWCxLQUFhLENBQUNrWCxFQUF3QixRQUFPO0FBQ3RFLFVBQU1nQyxJQUFpQyxvQkFBSSxJQUFJO0FBTS9DLFdBTEEsT0FBTyxRQUFROUUsRUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDRyxHQUFhL1AsQ0FBTyxNQUFNO0FBQzNELE1BQUlBLEtBQ0YwVSxFQUFlLElBQUkzRSxHQUFhL1AsQ0FBTztBQUFBLElBRTNDLENBQUMsR0FDRzBVLEVBQWUsU0FBUyxJQUNuQixPQUVPO0FBQUEsTUFDZCxTQUFTOUIsRUFBUTtBQUFBLE1BQ2pCLG1CQUFtQnBYO0FBQUEsTUFDbkIsd0JBQUFrWDtBQUFBLE1BQ0EsZ0JBQUFnQztBQUFBLE1BQ0Esa0JBQWtCekQsTUFBb0IsQ0FBQztBQUFBLE1BQ3ZDLFNBQVMsSUFBSSxJQUFJQyxDQUFZLEVBQUU7QUFBQSxJQUNqQztBQUFBLEVBRUYsR0FDTXlELEtBQVcsQ0FBQ1IsR0FBVXBNLEdBQVkxRixNQUFXO0FBQ2pELFVBQU10TyxJQUFVMGdCLEdBQXVCO0FBQ3ZDLFFBQUksR0FBQzFnQixLQUFXLENBQUM2ZSxFQUFRO0FBQ3pCLGFBQU9sTyxHQUFTLFNBQVMsSUFBSTtBQUFBLFFBQzNCLFNBQUEzUTtBQUFBLFFBQ0EsdUJBQXVCeVUsR0FBZ0N6VSxFQUFRLHdCQUF3Qm9nQixDQUFRO0FBQUEsUUFDL0Ysa0JBQWtCbFosR0FBeUIyWCxFQUFRLE9BQU87QUFBQSxRQUMxRCxlQUFlMkI7QUFBQSxRQUNmLGNBQWMsRUFBRSxVQUFBSixHQUFVLHdCQUF3QjlSLEtBQUEsZ0JBQUFBLEVBQVEsdUJBQXVCO0FBQUEsUUFDakYsWUFBQTBGO0FBQUEsTUFDRixDQUFDO0FBQUEsRUFDSDtBQUNBLEVBQUExVSxFQUFVLE1BQU07QUFDZCxRQUFJeWYsT0FBMkIsS0FBTTtBQUNyQyxVQUFNL2UsSUFBVTBnQixHQUF1QjtBQUN2QyxRQUFJLENBQUMxZ0IsRUFBUztBQUNkLFVBQU02Z0IsSUFBaUJ2SSxHQUFtQnRZLEdBQVN3Z0IsRUFBZ0I7QUFDbkUsSUFBQXhCLEdBQTBCNkIsQ0FBYyxHQUN4Q0EsRUFBZSxTQUFTLFVBQVUsQ0FBQzFPLE1BQVc7QUFDNUMsVUFBSUEsRUFBTyxXQUFXO0FBQ3BCLFFBQUErTSxFQUFtQixJQUFJLGFBQWF2RyxFQUFVLEdBQzlDdUcsRUFBbUIsSUFBSSxjQUFjdkcsRUFBVTtBQUFBLGVBQ3RDeEcsRUFBTyxXQUFXO0FBQzNCLFFBQUErTSxFQUFtQixJQUFJLGFBQWF0RyxFQUFRLEdBQzVDc0csRUFBbUIsSUFBSSxjQUFjdEcsRUFBUTtBQUFBLGVBQ3BDekcsRUFBTyxXQUFXLFVBQVU7QUFDckMsY0FBTTZCLElBQWE3QixFQUFPLFFBQ3BCMk8sSUFBYzlNLEVBQVcsZUFBZUEsRUFBVyxtQkFBbUIsVUFDdEUrTSxLQUFlL00sRUFBVyxlQUFlQSxFQUFXLG1CQUFtQjtBQUM3RSxRQUFBa0wsRUFBbUIsSUFBSSxhQUFhO0FBQUEsVUFDbEMsV0FBVztBQUFBLFVBQ1gsYUFBYTRCO0FBQUEsVUFDYixXQUFXLE9BQU9FLE1BQWVGLElBQWNGLEdBQVMsYUFBYTVNLEdBQVlnTixDQUFVLElBQUk7QUFBQSxRQUNqRyxDQUFDLEdBQ0Q5QixFQUFtQixJQUFJLGNBQWM7QUFBQSxVQUNuQyxXQUFXO0FBQUEsVUFDWCxhQUFhNkI7QUFBQSxVQUNiLFdBQVcsT0FBT0MsTUFBZUQsS0FBZUgsR0FBUyxjQUFjNU0sR0FBWWdOLENBQVUsSUFBSTtBQUFBLFFBQ25HLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSCxHQUFHLENBQUNuQyxFQUFRLFNBQVNwWCxHQUFXa1gsR0FBd0IsT0FBTyxLQUFLOUMsRUFBUSxFQUFFLE1BQU0sQ0FBQztBQUNyRixRQUFNb0YsS0FBYSxNQUFNO0FBQ3ZCLFVBQU1qaEIsSUFBVTBnQixHQUF1QjtBQUN2QyxJQUFJLENBQUM3QixFQUFRLFdBQVcsQ0FBQ3BYLEtBQWEsQ0FBQ3NVLEtBQWMsQ0FBQzRDLEtBQTBCLENBQUMzZSxLQUNqRjJRLEdBQVMsU0FBUyxJQUFJO0FBQUEsTUFDcEIsU0FBQTNRO0FBQUEsTUFDQSx1QkFBdUJ5VSxHQUFnQ2tLLEdBQXdCLGFBQWE7QUFBQSxNQUM1RixrQkFBa0J6WCxHQUF5QjJYLEVBQVEsT0FBTztBQUFBLE1BQzFELGVBQWUyQjtBQUFBLE1BQ2YsY0FBYztBQUFBO0FBQUEsTUFFZCxZQUFZO0FBQUE7QUFBQSxJQUVkLENBQUM7QUFBQSxFQUNILEdBQ01VLEtBQWlCN2hCO0FBQUEsSUFDckIsQ0FBQzZHLE1BQU07QUFDTCxNQUFJMlgsTUFBYzNYLEVBQUUsZUFBZTtBQUFBLElBQ3JDO0FBQUEsSUFDQSxDQUFDMlgsRUFBWTtBQUFBLEVBQ2Y7QUFDQSxFQUFBdmUsRUFBVSxNQUFNO0FBQ2QsUUFBSW9lLE1BQVUsQ0FBQ21CLEVBQVEsUUFBUztBQUVoQyxJQUR5QmQsRUFBUSxTQUFTLEtBQUtBLEVBQVEsV0FBVyxPQUFPLEtBQUtFLEVBQVksRUFBRSxXQUUxRixRQUFRLElBQUksNEJBQTRCLEdBQ3hDTixHQUFVLEVBQUksR0FDVmhCLEtBQVFBLEVBQU84QixJQUFrQmpaLEVBQVE7QUFBQSxFQUVqRCxHQUFHLENBQUN1WSxHQUFTRSxJQUFjUCxJQUFRZixHQUFROEIsSUFBa0JqWixFQUFRLENBQUMsR0FDdEVsRyxFQUFVLE9BQ1IrZCxHQUFXLE9BQU8sU0FBUyxNQUFNLEdBQ2pDLE9BQU8saUJBQWlCLFdBQVdnQyxFQUFTLEdBQzVDLE9BQU8saUJBQWlCLGdCQUFnQjZCLEVBQWMsR0FDL0MsTUFBTTtBQUNYLFdBQU8sb0JBQW9CLGdCQUFnQkEsRUFBYyxHQUN6RCxPQUFPLG9CQUFvQixXQUFXN0IsRUFBUztBQUFBLEVBQ2pELElBQ0MsQ0FBQzVYLEdBQVc0WCxJQUFXNkIsRUFBYyxDQUFDO0FBQ3pDLFFBQU1DLEtBQWlCOWhCO0FBQUEsSUFDckIsT0FBTzBKLE1BQVc7QUFFaEIsVUFEdUJnVixFQUFRLEtBQUssQ0FBQ3FELE1BQW9CQSxFQUFnQixrQkFBa0JyWSxFQUFPLGFBQWEsRUFDM0Y7QUFDcEIsTUFBQWlWLEdBQVcsQ0FBQ3FELE1BQWdCLENBQUMsR0FBR0EsR0FBYXRZLENBQU0sQ0FBQyxHQUNwRCxRQUFRLElBQUksOEJBQThCQSxDQUFNO0FBQ2hELFlBQU1pVCxJQUFjQyxHQUEyQmxULEVBQU8sRUFBRTtBQUN4RCxZQUFNK1YsR0FBbUI5QyxHQUFhalQsQ0FBTTtBQUFBLElBQzlDO0FBQUE7QUFBQSxJQUVBLENBQUNnVixDQUFPO0FBQUEsRUFDVixHQUNNdlosS0FBUTtBQUFBLElBQ1osUUFBQTZEO0FBQUEsSUFDQSxZQUFBbVY7QUFBQSxJQUNBLFNBQUFKO0FBQUEsSUFDQSxxQkFBQWQ7QUFBQSxJQUNBLGdCQUFBNkU7QUFBQSxJQUNBLFNBQVNoRTtBQUFBLEVBQ1gsR0FDTW1FLEtBQWdCO0FBQUEsSUFDcEIsUUFBUUw7QUFBQSxJQUNSLFVBQVVoQyxHQUFnQjtBQUFBLElBQzFCLFdBQVdBLEdBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVEzQixRQUFBdkI7QUFBQSxJQUNBLFNBQVMwQjtBQUFBLEVBQ1g7QUFDQSxTQUF1QixnQkFBQTNmLEVBQUlLLEdBQWdCLFVBQVUsRUFBRSxPQUFBMEUsSUFBTyxVQUEwQixnQkFBQS9FLEVBQUksT0FBTyxFQUFFLFdBQUE4YyxHQUFXLEtBQUtzQyxHQUFTLFVBQVV4QyxFQUFTaUYsRUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3RLLEdBRU1DLEtBQWUsQ0FBQ25GLE1BQVU7QUFDOUIsUUFBTSxFQUFFLFNBQUFvRixHQUFTLFFBQUF2YSxFQUFPLElBQUltVixHQUN0QixFQUFFLFFBQUEvVCxHQUFRLFNBQUErVSxHQUFTLFlBQUFJLEdBQVkscUJBQUFsQixHQUFxQixnQkFBQTZFLEdBQWdCLFNBQUE1WSxFQUFRLElBQUl4SSxHQUFtQixHQUNuRyxDQUFDMGhCLEdBQVdDLENBQVksSUFBSW5pQixFQUFTLEVBQUssR0FDMUNvaUIsSUFBWXZpQixHQUFPLElBQUksR0FDdkJ3aUIsSUFBZXBpQixHQUFRLE1BQ3RCeUgsSUFDRUQsR0FBMkJDLENBQU0sSUFEcEIsSUFFbkIsQ0FBQ0EsQ0FBTSxDQUFDLEdBQ0w0YSxJQUFhcmlCLEdBQVEsT0FDbEI7QUFBQSxJQUNMLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLFFBQVFnZTtBQUFBLEVBQ1YsSUFDQyxDQUFDQSxDQUFVLENBQUMsR0FDVHNFLElBQWN0aUIsR0FBUSxNQUFNO0FBQ2hDLFFBQUksQ0FBQzhjLEtBQXVCLENBQUNjLEVBQVMsUUFBTztBQUM3QyxVQUFNOU8sSUFBUyxJQUFJLGdCQUFnQjtBQUNuQyxXQUFBQSxFQUFPLE9BQU8sV0FBVzhPLENBQU8sR0FDaEM5TyxFQUFPLE9BQU8sVUFBVXNULENBQVksR0FDcEN0VCxFQUFPLE9BQU8sVUFBVWpHLENBQU0sR0FDOUJpRyxFQUFPLE9BQU8sZUFBZWdPLENBQW1CLEdBQ3pDaE8sRUFBTyxTQUFTO0FBQUEsRUFDekIsR0FBRyxDQUFDc1QsR0FBY3ZaLEdBQVErVSxHQUFTZCxDQUFtQixDQUFDO0FBTXZELFNBTEFoZCxFQUFVLE1BQU1vaUIsRUFBYSxFQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQ3RDcGlCLEVBQVUsTUFBTTtBQUNkLElBQUksQ0FBQ3FpQixFQUFVLFdBQVcsQ0FBQ0YsS0FDM0JOLEVBQWVRLEVBQVUsT0FBTztBQUFBLEVBQ2xDLEdBQUcsQ0FBQ0YsQ0FBUyxDQUFDLEdBQ1RuRixJQUlrQixnQkFBQTdjO0FBQUEsSUFDckI7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJLE9BQU8raEIsQ0FBTztBQUFBLE1BQ2xCLE1BQU0sR0FBR0EsQ0FBTztBQUFBLE1BQ2hCLFdBQVc7QUFBQSxNQUNYLEtBQUssR0FBR2paLENBQU8sV0FBV2laLENBQU8sYUFBYU0sQ0FBVztBQUFBLE1BQ3pELE9BQU9EO0FBQUEsTUFDUCxLQUFLRjtBQUFBLElBQ1A7QUFBQSxFQUNGLEtBYkUsUUFBUSxNQUFNLGtEQUFrRCxHQUN6QyxnQkFBQWxpQixFQUFJLE9BQU8sQ0FBQyxDQUFDO0FBYXhDLEdBRU1zaUIsS0FBaUIsQ0FBQyxFQUFFLFFBQUE5YSxFQUFPLE1BQ1IsZ0JBQUF4SCxFQUFJOGhCLElBQWMsRUFBRSxRQUFBdGEsR0FBUSxTQUFTLFdBQVcsQ0FBQyxHQUdwRSthLEtBQWMsQ0FBQyxFQUFFLFFBQUEvYSxFQUFPLE1BQ0wsZ0JBQUF4SCxFQUFJOGhCLElBQWMsRUFBRSxRQUFBdGEsR0FBUSxTQUFTLE9BQU8sQ0FBQyxHQUdoRWdiLEtBQW9CLENBQUMsRUFBRSxRQUFBaGIsRUFBTyxNQUNYLGdCQUFBeEgsRUFBSThoQixJQUFjLEVBQUUsUUFBQXRhLEdBQVEsU0FBUyxjQUFjLENBQUMsR0FHdkVpYixLQUFvQixDQUFDLEVBQUUsUUFBQWpiLEVBQU8sTUFDWCxnQkFBQXhILEVBQUk4aEIsSUFBYyxFQUFFLFFBQUF0YSxHQUFRLFNBQVMsY0FBYyxDQUFDOyIsCiAgIm5hbWVzIjogWyJyZXF1aXJlJCQwIiwgImNyZWF0ZUNvbnRleHQiLCAidXNlQ29udGV4dCIsICJ1c2VSZWYiLCAidXNlQ2FsbGJhY2siLCAidXNlRWZmZWN0IiwgInVzZVN0YXRlIiwgInVzZU1lbW8iLCAianN4IiwgInoiLCAidjQiLCAiY29ubmVjdFRvQ2hpbGQiLCAiY2hhbGsiLCAiRWxlbWVudHNDb250ZXh0IiwgInVzZU9wZW5QYXlFbGVtZW50cyIsICJjb250ZXh0IiwgIkZSQU1FX0JBU0VfVVJMIiwgIlB5ZGFudGljVmFsaWRhdGlvbkVycm9yJDEiLCAiUHlkYW50aWNWYWxpZGF0aW9uRXJyb3JSZXNwb25zZSIsICJab2RGaWVsZEVycm9yIiwgIlpvZEZpZWxkRXJyb3JzIiwgIk1BUF9UT19IVU1BTl9GUklFTkRMWV9MT1dFUkNBU0UiLCAiZ2V0SHVtYW5GcmllbmRseU1lc3NhZ2UiLCAib2dFcnJvck1lc3NhZ2UiLCAia2V5IiwgImlzU3RyaW5naWZpZWRKc29uT2JqZWN0IiwgInN0ciIsICJjcmVhdGVNZXNzYWdlRnJvbVB5ZGFudGljVmFsaWRhdGlvbkVycm9yIiwgInJlc3BvbnNlIiwgImVyciIsICJjcmVhdGVNZXNzYWdlRnJvbVpvZEZpZWxkRXJyb3JzIiwgImVycm9ycyIsICJnZXRFcnJvck1lc3NhZ2UiLCAib2JqIiwgImUyIiwgIm1ha2VDYWxsYmFja1NhZmUiLCAiY2FsbGJhY2tOYW1lIiwgImZuIiwgImFyZ3MiLCAiZXJyb3IiLCAiUmVxdWlyZWRTdHJpbmciLCAiT3B0aW9uYWxTdHJpbmciLCAibnVsbE9yVW5kZWZPciQxIiwgInpUeXBlIiwgIkZpZWxkTmFtZSIsICJGaWVsZE5hbWUyIiwgIkZpZWxkTmFtZUVudW0iLCAiUHJpdmF0ZUZpZWxkTmFtZSIsICJQcml2YXRlRmllbGROYW1lMiIsICJQcml2YXRlRmllbGROYW1lRW51bSIsICJBbGxGaWVsZE5hbWVzIiwgIkVsZW1lbnRUeXBlRW51bSIsICJFbGVtZW50VHlwZUVudW0yIiwgIkVsZW1lbnRUeXBlIiwgIkNoZWNrb3V0UGF5bWVudE1ldGhvZCQxIiwgIlBheW1lbnRNZXRob2RNaW5pbWFsIiwgIkV2ZW50VHlwZSIsICJHZW5lcmljRXZlbnRUeXBlIiwgIkdlbmVyaWNFdmVudFBheWxvYWQiLCAiSW5wdXRFdmVudFR5cGUiLCAiSW5wdXRFdmVudFBheWxvYWQiLCAiRXJyb3JFdmVudFR5cGUiLCAiRXJyb3JFdmVudFBheWxvYWQiLCAiVmFsaWRhdGlvbkVycm9yRXZlbnRUeXBlIiwgIlZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCIsICJMYXlvdXRFdmVudFBheWxvYWQiLCAiTG9hZGVkRXZlbnRQYXlsb2FkIiwgIlBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCIsICJTZXR1cENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJSZXF1aXJlZEZvcm1GaWVsZHMiLCAiUFJGb3JtRmllbGRzIiwgIlN1Ym1pdEV2ZW50VHlwZSIsICJTdWJtaXRFdmVudFBheWxvYWQiLCAiVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkIiwgIkNoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJFdmVudFBheWxvYWQiLCAiRWxlbWVudEV2ZW50IiwgIkNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlIiwgIkZpZWxkVmFsaWRhdGlvbkVycm9yIiwgIlRva2VuaXplQ2FyZEVycm9yUmVzcG9uc2UiLCAiVG9rZW5pemVDYXJkUmVzcG9uc2UiLCAiVGhyZWVEU1N0YXR1cyIsICJUaHJlZURTU3RhdHVzMiIsICJQaW5nM0RTU3RhdHVzUmVzcG9uc2UiLCAiQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgImV4dHJhY3RJc3N1ZXNQZXJGaWVsZCIsICJpc3N1ZXNQZXJGaWVsZCIsICJ2YWx1ZSIsICJmaWVsZE5hbWUiLCAiU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgIlBheW1lbnRSZXF1ZXN0TmV4dEFjdGlvbk1ldGFkYXRhIiwgIm91ckN1cnJlbmN5VG9UaGVpcnMiLCAiZ2V0TG9hZGVkU3RyaXBlIiwgInB1Ymxpc2hhYmxlS2V5IiwgImkiLCAiaXNTdHJpcGVKc1ByZXNlbnQiLCAic2xlZXAiLCAiY3JlYXRlU3RyaXBlRWxlbWVudHMiLCAic3RyaXBlUHViS2V5IiwgImVsZW1lbnRzT3B0aW9ucyIsICJzdHJpcGUiLCAiY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QiLCAidG90YWxBbW91bnRBdG9tIiwgImN1cnJlbmN5IiwgImlzQW1vdW50UGVuZGluZyIsICJpc0xpbmtPbmx5IiwgInN0cmlwZUN1cnJlbmN5IiwgInRpbWVvdXRNcyIsICJyZXNvbHZlIiwgIndhaXRGb3JVc2VyVG9BZGRQYXltZW50TWV0aG9kIiwgInBheW1lbnRSZXF1ZXN0IiwgInJlamVjdCIsICJldnQiLCAiZSIsICJjb25maXJtUGF5bWVudEZsb3dGb3JTdHJpcGVQUkxlZ2FjeSIsICJwYXlsb2FkIiwgInN0cmlwZVBtIiwgIm5leHRBY3Rpb25NZXRhZGF0YSIsICJjb25maXJtUmVzdWx0IiwgImNvbmZpcm1TdHJpcGVQclBNIiwgImNvbmZpcm1QYXltZW50Rmxvd0ZvcjNEUyIsICJsYXVuY2hTdHJpcGUzRFNEaWFsb2dGbG93IiwgIl9hIiwgIl9iIiwgIl9jIiwgIl9kIiwgInJlc3VsdFN0YXR1cyIsICJjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyIsICJzdHlsZXMiLCAiY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtIiwgImZvcm1EaXYiLCAiaW5pdGlhbERpY3QiLCAiYWNjIiwgImlucHV0IiwgImNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZCIsICJldmVudFR5cGUiLCAic2Vzc2lvbklkIiwgIm9uVmFsaWRhdGlvbkVycm9yIiwgImNoZWNrb3V0UGF5bWVudE1ldGhvZCIsICJkb05vdFVzZUxlZ2FjeUNDRmxvdyIsICJwYXltZW50Rmxvd01ldGFkYXRhIiwgImV4dHJhRGF0YSIsICJmb3JtYXR0ZWQiLCAiaXNzdWVzIiwgInBhcnNlRXZlbnRQYXlsb2FkIiwgImV2ZW50RGF0YSIsICJlbWl0RXZlbnQiLCAidGFyZ2V0IiwgImZvcm1JZCIsICJlbGVtZW50SWQiLCAiYmFzZVVybCIsICJldmVudCIsICJjaGVja0lmVmFsaWRDZGVDb25uZWN0aW9uT2JqZWN0IiwgInBpbmciLCAicmVzdWx0IiwgImlzUmVzdWx0VmFsaWQiLCAiaXNWYWxpZCIsICJjcmVhdGVDZGVDb25uZWN0aW9uIiwgImlmcmFtZSIsICJjb25uZWN0aW9uT2JqIiwgImlzVmFsaWRPYmplY3QiLCAibnVsbE9yVW5kZWZPciIsICJDREVSZXNwb25zZUVycm9yIiwgIkNvdXBvbk1pbmltYWwiLCAiTGluZUl0ZW0iLCAiQnJhbmRTZXR0aW5ncyIsICJCcmFuZCIsICJDaGVja291dFBheW1lbnRNZXRob2QiLCAiU3Vic2NyaXB0aW9uSXRlbU1pbmltYWwiLCAiU3Vic2NyaXB0aW9uTWluaW1hbCIsICJJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwiLCAiSW52b2ljZUxpbmVJdGVtTWluaW1hbCIsICJEaXNjb3VudE1pbmltYWwiLCAiSW52b2ljZU1pbmltYWwiLCAiQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2VNaW5pbWFsIiwgIlByZXZpZXdDaGVja291dFJlc3BvbnNlIiwgIl9QYXltZW50Rm9ybVByZWZpbGxDb21tb24iLCAiUGF5bWVudEZvcm1QcmVmaWxsIiwgIkNvbXBsZXRlZEZvcm1QcmVmaWxsIiwgIkV4cGlyZWRGb3JtUHJlZmlsbCIsICJDaGVja291dFN1Y2Nlc3NSZXNwb25zZSIsICJTZXR1cENoZWNrb3V0UmVzcG9uc2UiLCAiUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IiLCAiU3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlIiwgIlN0YXJ0UGF5bWVudEZsb3dGb3JDQ1Jlc3BvbnNlIiwgInN1bSIsICJhcnIiLCAiYSIsICJiIiwgImZpeFByb3RvIiwgInByb3RvdHlwZSIsICJzZXRQcm90b3R5cGVPZiIsICJmaXhTdGFjayIsICJjYXB0dXJlU3RhY2tUcmFjZSIsICJfX2V4dGVuZHMiLCAiX2V4dGVuZFN0YXRpY3MiLCAiZCIsICJwIiwgIl9fIiwgIkN1c3RvbUVycm9yIiwgIl9zdXBlciIsICJtZXNzYWdlIiwgIm9wdGlvbnMiLCAiX25ld1RhcmdldCIsICJfdGhpcyIsICJDZGVFcnJvciIsICJmcmllbmRseU1lc3NhZ2UiLCAicXVlcnlDREUiLCAiY2RlQ29ubiIsICJkYXRhIiwgInJlc3BvbnNlU2NoZW1hIiwgImlzQ0RFUmVzcG9uc2VFcnJvciIsICJjaGVja0lmQ29uZm9ybXNUb1NjaGVtYSIsICJzY2hlbWEiLCAiZ2V0Q2hlY2tvdXRQcmV2aWV3IiwgInJlcXVlc3QiLCAiZ2V0UHJlZmlsbCIsICJzdGFydFBheW1lbnRGbG93IiwgInN0YXJ0UGF5bWVudEZsb3dGb3JDQyIsICJzdGFydFBheW1lbnRGbG93Rm9yUFIiLCAiY29uZmlybVBheW1lbnRGbG93IiwgIndhaXRGb3JGb3JtRmllbGRJbnB1dCIsICJ3YWl0VGltZU1zIiwgInN0YXJ0V2FpdFRpbWUiLCAibWF0Y2giLCAiZ2V0Q2hlY2tvdXRWYWx1ZSIsICJzZWN1cmVUb2tlbiIsICJwcm9tb0NvZGUiLCAiY2hlY2tvdXRQcmV2aWV3IiwgImN1cnJlbmNpZXMiLCAiaW52IiwgImFtb3VudEF0b20iLCAiZ2V0Q2hlY2tvdXRQcmV2aWV3QW1vdW50IiwgImlzU2V0dXBNb2RlIiwgInRva2VuaXplQ2FyZE9uQWxsQ29ubmVjdGlvbnMiLCAiYWxsQ2RlQ29ubmVjdGlvbnMiLCAiY2hlY2tvdXRDYXJkRWxlbWVudHMiLCAic2V0dXBDaGVja291dCIsICJwZXJmb3JtQ2hlY2tvdXQiLCAiQ0RFX1BPTExJTkdfSU5URVJWQUwiLCAicGluZ0NkZUZvcjNkc1N0YXR1cyIsICJjaGlsZE9yaWdpbiIsICJpc0pzb25TdHJpbmciLCAiYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMiLCAic2ltcGxlT2pzRmxvdyIsICJwYXJhbXMiLCAiZmxvd1Jlc3VsdCIsICJhZGRFcnJvckNhdGNoZXJGb3JJbml0IiwgImluaXQiLCAiZXJyX18iLCAiY3JlYXRlT2pzRmxvd0xvZ2dlcnMiLCAicHJlZml4IiwgImxvZyIsICJsb2dfXyQ1IiwgImVycl9fJDUiLCAicGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSIsICJmaW5kQ3BtTWF0Y2hpbmdUeXBlIiwgImFsbENQTXMiLCAiem9kTW9kZWwiLCAiY3BtIiwgImNwbTIiLCAibG9nX18kNCIsICJlcnJfXyQ0IiwgInZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDIiwgIm5vbkNkZUZvcm1JbnB1dHMiLCAidmFsaWRhdGVUb2tlbml6ZUNhcmRSZXN1bHRzIiwgInRva2VuaXplUmVzdWx0cyIsICJ0b2tlbml6ZVJlc3VsdCIsICJwYXJzZWQiLCAiT0pTX1NUUklQRV9MSU5LX0JUTl9JRCIsICJsb2dfXyQzIiwgImVycl9fJDMiLCAiU3RyaXBlTGlua0NwbSIsICJTdHJpcGVMaW5rUmVxdWlyZWRVc2VyQWN0aW9ucyIsICJpbml0U3RyaXBlTGlua0Zsb3ciLCAiZmxvd0NhbGxiYWNrcyIsICJzdHJpcGVMaW5rQ3BtIiwgImFueUNkZUNvbm5lY3Rpb24iLCAicHJlZmlsbCIsICJpbml0aWFsUHJldmlldyIsICJlbGVtZW50cyIsICJleHByZXNzQ2hlY2tvdXRFbGVtZW50IiwgIk9qc0Zsb3dzIiwgInJ1blN0cmlwZUxpbmtGbG93IiwgImN1c3RvbVBhcmFtcyIsICJtZXJnZWRJbnB1dHMiLCAiZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQTSIsICJub25DZGVGb3JtRmllbGRzIiwgInN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSIsICJvdXJFeGlzdGluZ1BtSWQiLCAiY2hlY2tvdXRSZXF1ZXN0IiwgImZvcm1JbnB1dHMiLCAiX2UiLCAiaW5wdXRzIiwgInBheWVyRmlyc3ROYW1lIiwgInBheWVyTGFzdE5hbWVQYXJ0cyIsICJwYXllckxhc3ROYW1lIiwgImNyZWF0ZUFuZE9wZW5GcmFtZSIsICJ1cmwiLCAidGVtcGxhdGUiLCAiaG9zdCIsICJzaGFkb3dSb290IiwgImNhbmNlbEJ1dHRvbiIsICJzdGFydFBvbGxpbmciLCAib25TdWNjZXNzIiwgImhhbmRsZVBvbGxpbmciLCAic3RhdHVzIiwgInBvbGxpbmdJbnRlcnZhbCIsICJoYW5kbGVFdmVudHMiLCAiaGFuZGxlQ2FuY2VsIiwgInN0YXJ0M2RzVmVyaWZpY2F0aW9uIiwgImNsZWFudXBFdmVudExpc3RlbmVycyIsICJsb2dfXyQyIiwgImVycl9fJDIiLCAic3RyaXBlTG9nX18iLCAicnVuQ29tbW9uQ2NGbG93IiwgInRva2VuaXplQ2FyZFJlc3VsdHMiLCAiY29tbW9uQ2hlY2tvdXRQYXJhbXMiLCAic2hvdWxkVXNlTmV3RmxvdyIsICJzdGFydFBmUmVzdWx0IiwgImNvbW1vbkNDM0RTRmxvdyIsICJzdHJpcGVDQzNEU0Zsb3ciLCAiY3JlYXRlZFBheW1lbnRNZXRob2QiLCAicGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEiLCAic3RyaXBlQWN0aW9uIiwgImFjdGlvbiIsICJwYXJzZUNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJjb21tb25BY3Rpb24iLCAibG9nX18kMSIsICJlcnJfXyQxIiwgIlN0cmlwZVByQ3BtIiwgImluaXRTdHJpcGVQckZsb3ciLCAicHIiLCAiY2FuTWFrZVBheW1lbnQiLCAicnVuU3RyaXBlUHJGbG93IiwgImluaXRSZXN1bHQiLCAib3ZlcnJpZGUiLCAidXBkYXRlUHJXaXRoQW1vdW50IiwgInN0cmlwZVBtQWRkZWRFdmVudCIsICJmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBtIiwgInBhcnNlUFJOZXh0QWN0aW9uTWV0YWRhdGEiLCAic3RyaXBlUG1FdnQiLCAiYW1vdW50IiwgImlzUGVuZGluZyIsICJmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0IiwgImNwbXMiLCAid2l0aFByb3ZpZGVyIiwgIndpdGhQcm9jZXNzb3IiLCAibWF0Y2hlcyIsICJnZXREZWZhdWx0RXhwb3J0RnJvbUNqcyIsICJ4IiwgIk9ic2VydmFibGUkMiIsICJoYXNTeW1ib2wiLCAibmFtZSIsICJnZXRTeW1ib2wiLCAiU3ltYm9sSXRlcmF0b3IiLCAiU3ltYm9sT2JzZXJ2YWJsZSIsICJTeW1ib2xTcGVjaWVzIiwgImdldE1ldGhvZCIsICJnZXRTcGVjaWVzIiwgImN0b3IiLCAiT2JzZXJ2YWJsZSQxIiwgImlzT2JzZXJ2YWJsZSIsICJob3N0UmVwb3J0RXJyb3IiLCAiZW5xdWV1ZSIsICJjbGVhbnVwU3Vic2NyaXB0aW9uIiwgInN1YnNjcmlwdGlvbiIsICJjbGVhbnVwIiwgInVuc3Vic2NyaWJlIiwgImNsb3NlU3Vic2NyaXB0aW9uIiwgImZsdXNoU3Vic2NyaXB0aW9uIiwgInF1ZXVlIiwgIm5vdGlmeVN1YnNjcmlwdGlvbiIsICJ0eXBlIiwgIm9ic2VydmVyIiwgIm0iLCAib25Ob3RpZnkiLCAiU3Vic2NyaXB0aW9uIiwgInN1YnNjcmliZXIiLCAic2VsZiIsICJzdWJzY3JpcHRpb25PYnNlcnZlciIsICJPYnNlcnZhYmxlIiwgImRvbmUiLCAiQyIsICJoYXNTZWVkIiwgImhhc1ZhbHVlIiwgImZpcnN0IiwgInZhbHVlcyIsICJzb3VyY2VzIiwgImluZGV4IiwgInN0YXJ0TmV4dCIsICJuZXh0IiwgInYiLCAic3Vic2NyaXB0aW9ucyIsICJvdXRlciIsICJpbm5lciIsICJjb21wbGV0ZUlmRG9uZSIsICJzIiwgIm1ldGhvZCIsICJvYnNlcnZhYmxlIiwgIml0ZW0iLCAiaXRlbXMiLCAiemVuT2JzZXJ2YWJsZSIsICJsb2dfXyIsICJnZXRPanNJbml0UmVzdWx0c0RlYnVnT2JqZWN0IiwgImluaXRpYWxpemVPanNGbG93cyIsICJpbml0UGFyYW1zIiwgInJ1bkluaXRGbG93QXNPYnNlcnZhYmxlIiwgImZsb3dOYW1lIiwgImluaXRGbG93IiwgIlBSX0xPQURJTkciLCAiUFJfRVJST1IiLCAidXNlQXN5bmNFZmZlY3QkMiIsICJSZWFjdCIsICJ1c2VBc3luY0VmZmVjdCIsICJlZmZlY3QiLCAiZGVzdHJveSIsICJoYXNEZXN0cm95IiwgIm1vdW50ZWQiLCAibWF5YmVQcm9taXNlIiwgInVzZUFzeW5jRWZmZWN0RXhwb3J0cyIsICJ1c2VBc3luY0VmZmVjdCQxIiwgInVzZVRpbWVvdXRGbiIsICJtcyIsICJyZWFkeSIsICJ0aW1lb3V0IiwgImNhbGxiYWNrIiwgImlzUmVhZHkiLCAic2V0IiwgImNsZWFyIiwgInVzZURlYm91bmNlIiwgImRlcHMiLCAiY2FuY2VsIiwgInJlc2V0IiwgInVzZUR5bmFtaWNQcmV2aWV3IiwgImlzRW5hYmxlZCIsICJwcm9tb0NvZGVJbnB1dCIsICJzZXRQcm9tb0NvZGVJbnB1dCIsICJwcm9tb0NvZGVEZWJvdW5jZWQiLCAic2V0UHJvbW9Db2RlRGVib3VuY2VkIiwgInByZXZpZXdBbXQiLCAic2V0UHJldmlld0FtdCIsICJpc1ByZXZpZXdMb2FkaW5nIiwgInNldElzUHJldmlld0xvYWRpbmciLCAicHJldmlld0Vycm9yIiwgInNldFByZXZpZXdFcnJvciIsICJwcm9tb0NvZGVJbnB1dDIiLCAiaXNNb3VudGVkIiwgInByZXZpZXciLCAidXNlTWFwIiwgImluaXRpYWxNYXAiLCAibWFwIiwgInN0YWJsZUFjdGlvbnMiLCAiZW50cnkiLCAicHJldk1hcCIsICJuZXdNYXAiLCAib21pdCIsICJyZXN0IiwgInV0aWxzIiwgInVzZUNkZUNvbm5lY3Rpb24iLCAiY2RlQ29ubnMiLCAiY2RlQ29ubnNTZXR0ZXIiLCAiYW55Q2RlQ29ubiIsICJlbGVtZW50VHlwZSIsICJnZXRFbGVtZW50VHlwZUZyb21JZnJhbWVJZCIsICJpZnJhbWVJZCIsICJFbGVtZW50c0Zvcm0iLCAicHJvcHMiLCAiY2hpbGRyZW4iLCAiY2hlY2tvdXRTZWN1cmVUb2tlbiIsICJjbGFzc05hbWUiLCAib25Gb2N1cyIsICJvbkJsdXIiLCAib25DaGFuZ2UiLCAib25Mb2FkIiwgIm9uTG9hZEVycm9yIiwgIm9uQ2hlY2tvdXRTdGFydGVkIiwgIm9uQ2hlY2tvdXRTdWNjZXNzIiwgIm9uQ2hlY2tvdXRFcnJvciIsICJvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MiLCAiZW5hYmxlRHluYW1pY1ByZXZpZXdzIiwgImN1c3RvbUluaXRQYXJhbXMiLCAiZnJhbWVCYXNlVXJsIiwgInJlZmVyZXIiLCAic2V0UmVmZXJlciIsICJub25jZXMiLCAic2V0Tm9uY2VzIiwgImZvcm1IZWlnaHQiLCAic2V0Rm9ybUhlaWdodCIsICJsb2FkZWQiLCAic2V0TG9hZGVkIiwgInNldEV4dHJhRGF0YSIsICJwcmV2ZW50Q2xvc2UiLCAic2V0UHJldmVudENsb3NlIiwgImlmcmFtZXMiLCAic2V0SWZyYW1lcyIsICJldmVudFRhcmdldHMiLCAic2V0RXZlbnRUYXJnZXRzIiwgInRva2VuaXplZCIsICJzZXRUb2tlbml6ZWQiLCAiY2hlY2tvdXRGaXJlZCIsICJzZXRDaGVja291dEZpcmVkIiwgInNldFNlc3Npb25JZCIsICJzZXRDdXJyZW5jeSIsICJ0b3RhbEFtb3VudEF0b21zIiwgInNldFRvdGFsQW1vdW50QXRvbXMiLCAiY2hlY2tvdXRQYXltZW50TWV0aG9kcyIsICJzZXRDaGVja291dFBheW1lbnRNZXRob2RzIiwgImZvcm1SZWYiLCAiY29ubmVjdFRvQ2RlSWZyYW1lIiwgIm9qc0Zsb3dzSW5pdGlhbGl6YXRpb24iLCAic2V0T2pzRmxvd3NJbml0aWFsaXphdGlvbiIsICJwYXltZW50UmVxdWVzdHMiLCAic2V0UGF5bWVudFJlcXVlc3RzIiwgIm9qc192ZXJzaW9uIiwgImR5bmFtaWNQcmV2aWV3IiwgIm9uTWVzc2FnZSIsICJldmVudFNvdXJjZSIsICJyYXciLCAicHJldk5vbmNlcyIsICJldmVudFBheWxvYWQiLCAiaGVpZ2h0IiwgIm1hdGNoaW5nSWZyYW1lIiwgInByZXZUYXJnZXRzIiwgIm5leHRBY3Rpb25UeXBlIiwgInBheW1lbnRfbWV0aG9kcyIsICJwcm9jZWVkVG9DaGVja291dCIsICJleGlzdGluZ0NDUE1JZCIsICJlcnJNc2ciLCAidG90YWxUb2tlbml6ZWQiLCAiYWxsVG9rZW5pemVkIiwgInByb3ZpZGVyIiwgImNhcmRDcG0iLCAiZWxlbWVudElkMiIsICJzdGFydFBheW1lbnRGbG93RXZlbnQiLCAib2pzRmxvd0NhbGxiYWNrcyIsICJub09wIiwgImdlbmVyYXRlT2pzRmxvd0NvbnRleHQiLCAiY2RlQ29ubmVjdGlvbnMiLCAic3VibWl0UFIiLCAiaW5pdGlhbGl6YXRpb24iLCAiY2FuQXBwbGVQYXkiLCAiY2FuR29vZ2xlUGF5IiwgInVzZXJQYXJhbXMiLCAic3VibWl0Q2FyZCIsICJvbkJlZm9yZVVubG9hZCIsICJyZWdpc3RlcklmcmFtZSIsICJleGlzdGluZ0lmcmFtZTIiLCAicHJldklmcmFtZXMiLCAiY2hpbGRyZW5Qcm9wcyIsICJFbGVtZW50RnJhbWUiLCAic3ViUGF0aCIsICJoYXNMb2FkZWQiLCAic2V0SGFzTG9hZGVkIiwgImlmcmFtZVJlZiIsICJlbGVtZW50U3R5bGUiLCAiZnJhbWVTdHlsZSIsICJxdWVyeVN0cmluZyIsICJDYXJkQ3ZjRWxlbWVudCIsICJDYXJkRWxlbWVudCIsICJDYXJkRXhwaXJ5RWxlbWVudCIsICJDYXJkTnVtYmVyRWxlbWVudCJdCn0K
|
|
1961
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXguanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCByZXF1aXJlJCQwLCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQsIHVzZVJlZiwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBqc3ggfSBmcm9tICdyZWFjdC9qc3gtcnVudGltZSc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBjb25uZWN0VG9DaGlsZCB9IGZyb20gJ3BlbnBhbCc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5jb25zdCBFbGVtZW50c0NvbnRleHQgPSBjcmVhdGVDb250ZXh0KHtcbiAgZm9ybUlkOiBcIlwiLFxuICBmb3JtSGVpZ2h0OiBcIlwiLFxuICByZWZlcmVyOiB2b2lkIDAsXG4gIGNoZWNrb3V0U2VjdXJlVG9rZW46IHZvaWQgMCxcbiAgcmVnaXN0ZXJJZnJhbWU6ICgpID0+IHtcbiAgfSxcbiAgYmFzZVVybDogXCJcIlxufSk7XG5cbmNvbnN0IHVzZU9wZW5QYXlFbGVtZW50cyA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRWxlbWVudHNDb250ZXh0KTtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlT3BlblBheUVsZW1lbnRzIG11c3QgYmUgdXNlZCB3aXRoaW4gYW4gT3BlblBheUVsZW1lbnRzUHJvdmlkZXJcIik7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuXG5jb25zdCBGUkFNRV9CQVNFX1VSTCA9IFwiaHR0cHM6Ly9jZGUuZ2V0b3BlbnBheS5jb21cIjtcblxuY29uc3QgUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5zdHJpbmcoKSxcbiAgbG9jOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBtc2c6IHouc3RyaW5nKCksXG4gIHVybDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlID0gei5hcnJheShQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciQxKTtcbmNvbnN0IFpvZEZpZWxkRXJyb3IgPSB6Lm9iamVjdCh7XG4gIGNvZGU6IHouc3RyaW5nKCksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCksXG4gIHBhdGg6IHouYXJyYXkoei5zdHJpbmcoKSlcbn0pO1xuY29uc3QgWm9kRmllbGRFcnJvcnMgPSB6LmFycmF5KFpvZEZpZWxkRXJyb3IpO1xuY29uc3QgTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRSA9IHtcbiAgXCJmYWlsZWQgdG8gZmV0Y2hcIjogYENvbm5lY3Rpb24gZXJyb3I6IHBsZWFzZSBkb3VibGUgY2hlY2sgaWYgeW91IGFyZSBjb25uZWN0ZWQgdG8gdGhlIGludGVybmV0LCB0aGVuIHRyeSBhZ2FpbmBcbn07XG5jb25zdCBnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZSA9IChvZ0Vycm9yTWVzc2FnZSkgPT4ge1xuICBjb25zdCBrZXkgPSBvZ0Vycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgcmV0dXJuIE1BUF9UT19IVU1BTl9GUklFTkRMWV9MT1dFUkNBU0Vba2V5XSA/PyBvZ0Vycm9yTWVzc2FnZTtcbn07XG5jb25zdCBpc1N0cmluZ2lmaWVkSnNvbk9iamVjdCA9IChzdHIpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0cik7XG4gICAgcmV0dXJuIHR5cGVvZiBwYXJzZWQgPT09IFwib2JqZWN0XCI7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5jb25zdCBjcmVhdGVNZXNzYWdlRnJvbVB5ZGFudGljVmFsaWRhdGlvbkVycm9yID0gKHJlc3BvbnNlKSA9PiB7XG4gIGlmIChyZXNwb25zZS5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZ2V0SHVtYW5GcmllbmRseU1lc3NhZ2UocmVzcG9uc2VbMF0ubXNnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBidWxsZXRlZCA9IHJlc3BvbnNlLm1hcCgoZXJyKSA9PiBg4oCiICR7Z2V0SHVtYW5GcmllbmRseU1lc3NhZ2UoZXJyLm1zZyl9YCkuam9pbihcIlxcblwiKTtcbiAgICByZXR1cm4gYCR7YFBsZWFzZSBmaXggdGhlIGZvbGxvd2luZyBlcnJvcnM6YH1cbiR7YnVsbGV0ZWR9YDtcbiAgfVxufTtcbmNvbnN0IGNyZWF0ZU1lc3NhZ2VGcm9tWm9kRmllbGRFcnJvcnMgPSAoZXJyb3JzKSA9PiB7XG4gIGNvbnN0IGxpc3RPZkVycm9ycyA9IGVycm9ycy5tYXAoKGVycikgPT4gYC0gJHtlcnIucGF0aC5qb2luKFwiL1wiKX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbihcIlxcblwiKTtcbiAgcmV0dXJuIGBFbmNvdW50ZXJlZCB0aGUgZm9sbG93aW5nIGVycm9yczpcbiR7bGlzdE9mRXJyb3JzfWA7XG59O1xuY29uc3QgZ2V0RXJyb3JNZXNzYWdlID0gKGUpID0+IHtcbiAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGlmIChpc1N0cmluZ2lmaWVkSnNvbk9iamVjdChlLm1lc3NhZ2UpKSB7XG4gICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGUubWVzc2FnZSk7XG4gICAgICBpZiAoUHlkYW50aWNWYWxpZGF0aW9uRXJyb3JSZXNwb25zZS5zYWZlUGFyc2Uob2JqKS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVNZXNzYWdlRnJvbVB5ZGFudGljVmFsaWRhdGlvbkVycm9yKG9iaik7XG4gICAgICB9IGVsc2UgaWYgKFpvZEZpZWxkRXJyb3JzLnNhZmVQYXJzZShvYmopLnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2VGcm9tWm9kRmllbGRFcnJvcnMob2JqKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRW5jb3VudGVyZWQgdW5rbm93biBzdHJpbmdpZmllZCBKU09OIG9iamVjdDpcbiR7ZS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4gZS5tZXNzYWdlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0SHVtYW5GcmllbmRseU1lc3NhZ2UoZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlKTtcbiAgICB9IGNhdGNoIChlMikge1xuICAgICAgcmV0dXJuIGUyICsgXCJcIjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGUgKyBcIlwiO1xuICB9XG59O1xuY29uc3QgbWFrZUNhbGxiYWNrU2FmZSA9IChjYWxsYmFja05hbWUsIGZuKSA9PiB7XG4gIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtmb3JtXSBFcnJvciBydW5uaW5nIGNhbGxiYWNrICgke2NhbGxiYWNrTmFtZX0pOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgUmVxdWlyZWRTdHJpbmcgPSB6LnN0cmluZygpLnRyaW0oKS5taW4oMSwgeyBtZXNzYWdlOiBgQ2Fubm90IGJlIGJsYW5rYCB9KTtcbmNvbnN0IE9wdGlvbmFsU3RyaW5nID0gei5zdHJpbmcoKS50cmltKCkub3B0aW9uYWwoKTtcbmNvbnN0IG51bGxPclVuZGVmT3IkMSA9ICh6VHlwZSkgPT4gei5udWxsYWJsZSh6VHlwZS5vcHRpb25hbCgpKTtcbnZhciBGaWVsZE5hbWUgPSAvKiBAX19QVVJFX18gKi8gKChGaWVsZE5hbWUyKSA9PiB7XG4gIEZpZWxkTmFtZTJbXCJGSVJTVF9OQU1FXCJdID0gXCJmaXJzdE5hbWVcIjtcbiAgRmllbGROYW1lMltcIkxBU1RfTkFNRVwiXSA9IFwibGFzdE5hbWVcIjtcbiAgRmllbGROYW1lMltcIkVNQUlMXCJdID0gXCJlbWFpbFwiO1xuICBGaWVsZE5hbWUyW1wiWklQX0NPREVcIl0gPSBcInppcENvZGVcIjtcbiAgRmllbGROYW1lMltcIkNJVFlcIl0gPSBcImNpdHlcIjtcbiAgRmllbGROYW1lMltcIlNUQVRFXCJdID0gXCJzdGF0ZVwiO1xuICBGaWVsZE5hbWUyW1wiQ09VTlRSWVwiXSA9IFwiY291bnRyeVwiO1xuICBGaWVsZE5hbWUyW1wiQUREUkVTU1wiXSA9IFwiYWRkcmVzc1wiO1xuICBGaWVsZE5hbWUyW1wiUEhPTkVcIl0gPSBcInBob25lXCI7XG4gIEZpZWxkTmFtZTJbXCJQUk9NT1RJT05fQ09ERVwiXSA9IFwicHJvbW90aW9uQ29kZVwiO1xuICByZXR1cm4gRmllbGROYW1lMjtcbn0pKEZpZWxkTmFtZSB8fCB7fSk7XG5jb25zdCBGaWVsZE5hbWVFbnVtID0gei5uYXRpdmVFbnVtKEZpZWxkTmFtZSk7XG52YXIgUHJpdmF0ZUZpZWxkTmFtZSA9IC8qIEBfX1BVUkVfXyAqLyAoKFByaXZhdGVGaWVsZE5hbWUyKSA9PiB7XG4gIFByaXZhdGVGaWVsZE5hbWUyW1wiQ0FSRF9OVU1CRVJcIl0gPSBcImNhcmROdW1iZXJcIjtcbiAgUHJpdmF0ZUZpZWxkTmFtZTJbXCJDQVJEX0VYUElSWVwiXSA9IFwiY2FyZEV4cGlyeVwiO1xuICBQcml2YXRlRmllbGROYW1lMltcIkNBUkRfQ1ZDXCJdID0gXCJjYXJkQ3ZjXCI7XG4gIHJldHVybiBQcml2YXRlRmllbGROYW1lMjtcbn0pKFByaXZhdGVGaWVsZE5hbWUgfHwge30pO1xuY29uc3QgUHJpdmF0ZUZpZWxkTmFtZUVudW0gPSB6Lm5hdGl2ZUVudW0oUHJpdmF0ZUZpZWxkTmFtZSk7XG5jb25zdCBBbGxGaWVsZE5hbWVzID0gei51bmlvbihbRmllbGROYW1lRW51bSwgUHJpdmF0ZUZpZWxkTmFtZUVudW1dKTtcbnZhciBFbGVtZW50VHlwZUVudW0gPSAvKiBAX19QVVJFX18gKi8gKChFbGVtZW50VHlwZUVudW0yKSA9PiB7XG4gIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEXCJdID0gXCJjYXJkXCI7XG4gIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEX05VTUJFUlwiXSA9IFwiY2FyZC1udW1iZXJcIjtcbiAgRWxlbWVudFR5cGVFbnVtMltcIkNBUkRfRVhQSVJZXCJdID0gXCJjYXJkLWV4cGlyeVwiO1xuICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRF9DVkNcIl0gPSBcImNhcmQtY3ZjXCI7XG4gIHJldHVybiBFbGVtZW50VHlwZUVudW0yO1xufSkoRWxlbWVudFR5cGVFbnVtIHx8IHt9KTtcbmNvbnN0IEVsZW1lbnRUeXBlID0gei5uYXRpdmVFbnVtKEVsZW1lbnRUeXBlRW51bSk7XG5jb25zdCBDaGVja291dFBheW1lbnRNZXRob2QkMSA9IHoub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHouc3RyaW5nKCksXG4gIHByb2Nlc3Nvcl9uYW1lOiBudWxsT3JVbmRlZk9yJDEoei5zdHJpbmcoKSksXG4gIG1ldGFkYXRhOiBudWxsT3JVbmRlZk9yJDEoei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkpXG59KTtcbmNvbnN0IFBheW1lbnRNZXRob2RNaW5pbWFsID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKVxufSk7XG56Lm9iamVjdCh7XG4gIGNhcmROdW1iZXI6IE9wdGlvbmFsU3RyaW5nLFxuICBleHBpcnk6IE9wdGlvbmFsU3RyaW5nLFxuICBjdmM6IE9wdGlvbmFsU3RyaW5nXG59KTtcbnoub2JqZWN0KHtcbiAgYmFja2dyb3VuZENvbG9yOiBPcHRpb25hbFN0cmluZyxcbiAgY29sb3I6IE9wdGlvbmFsU3RyaW5nLFxuICBmb250RmFtaWx5OiBPcHRpb25hbFN0cmluZyxcbiAgZm9udFNpemU6IE9wdGlvbmFsU3RyaW5nLFxuICBmb250V2VpZ2h0OiBPcHRpb25hbFN0cmluZyxcbiAgbWFyZ2luOiBPcHRpb25hbFN0cmluZyxcbiAgcGFkZGluZzogT3B0aW9uYWxTdHJpbmcsXG4gIGxldHRlclNwYWNpbmc6IE9wdGlvbmFsU3RyaW5nLFxuICBsaW5lSGVpZ2h0OiBPcHRpb25hbFN0cmluZ1xufSk7XG5jb25zdCBFdmVudFR5cGUgPSB6LmVudW0oW1xuICAvLyBFbGVtZW50IC0+IEZvcm1cbiAgXCJMQVlPVVRcIixcbiAgXCJMT0FERURcIixcbiAgXCJCTFVSXCIsXG4gIFwiRk9DVVNcIixcbiAgXCJDSEFOR0VcIixcbiAgXCJUT0tFTklaRV9TVEFSVEVEXCIsXG4gIFwiQ0hFQ0tPVVRfU1RBUlRFRFwiLFxuICBcIlBBWU1FTlRfRkxPV19TVEFSVEVEXCIsXG4gIFwiVE9LRU5JWkVfU1VDQ0VTU1wiLFxuICBcIkNIRUNLT1VUX1NVQ0NFU1NcIixcbiAgXCJMT0FEX0VSUk9SXCIsXG4gIFwiVkFMSURBVElPTl9FUlJPUlwiLFxuICBcIlRPS0VOSVpFX0VSUk9SXCIsXG4gIFwiQ0hFQ0tPVVRfRVJST1JcIixcbiAgXCJTRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTXCIsXG4gIC8vIEZvcm0gLT4gRWxlbWVudFxuICBcIlRPS0VOSVpFXCIsXG4gIFwiQ0hFQ0tPVVRcIixcbiAgXCJTVEFSVF9QQVlNRU5UX0ZMT1dcIlxuXSk7XG5jb25zdCBHZW5lcmljRXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiVE9LRU5JWkVfU1RBUlRFRFwiLCBcIkNIRUNLT1VUX1NUQVJURURcIl0pO1xuY29uc3QgR2VuZXJpY0V2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHsgdHlwZTogR2VuZXJpY0V2ZW50VHlwZSB9KTtcbmNvbnN0IElucHV0RXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiQkxVUlwiLCBcIkZPQ1VTXCIsIFwiQ0hBTkdFXCJdKTtcbmNvbnN0IElucHV0RXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBJbnB1dEV2ZW50VHlwZSxcbiAgZWxlbWVudFR5cGU6IFByaXZhdGVGaWVsZE5hbWVFbnVtLFxuICBlcnJvcnM6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKVxufSk7XG5jb25zdCBFcnJvckV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIkxPQURfRVJST1JcIiwgXCJUT0tFTklaRV9FUlJPUlwiLCBcIkNIRUNLT1VUX0VSUk9SXCJdKTtcbmNvbnN0IEVycm9yRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBFcnJvckV2ZW50VHlwZSxcbiAgbWVzc2FnZTogUmVxdWlyZWRTdHJpbmcsXG4gIGhlYWRlcnM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKClcbn0pO1xuY29uc3QgVmFsaWRhdGlvbkVycm9yRXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiVkFMSURBVElPTl9FUlJPUlwiXSk7XG5jb25zdCBWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IFZhbGlkYXRpb25FcnJvckV2ZW50VHlwZSxcbiAgZWxlbWVudFR5cGU6IEFsbEZpZWxkTmFtZXMsXG4gIGVycm9yczogei5hcnJheSh6LnN0cmluZygpKVxufSk7XG5jb25zdCBMYXlvdXRFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5MQVlPVVQpLFxuICBoZWlnaHQ6IFJlcXVpcmVkU3RyaW5nXG59KTtcbmNvbnN0IExvYWRlZEV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5saXRlcmFsKEV2ZW50VHlwZS5lbnVtLkxPQURFRCksXG4gIHNlc3Npb25JZDogUmVxdWlyZWRTdHJpbmcsXG4gIHRvdGFsQW1vdW50QXRvbXM6IHoubnVtYmVyKCksXG4gIGN1cnJlbmN5OiBPcHRpb25hbFN0cmluZyxcbiAgY2hlY2tvdXRQYXltZW50TWV0aG9kczogei5hcnJheShDaGVja291dFBheW1lbnRNZXRob2QkMSlcbn0pO1xuY29uc3QgUGF5bWVudEZsb3dTdGFydGVkRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uUEFZTUVOVF9GTE9XX1NUQVJURUQpLFxuICBuZXh0QWN0aW9uTWV0YWRhdGE6IHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpLFxuICBwYXltZW50Rmxvd01ldGFkYXRhOiB6LmFueSgpLm9wdGlvbmFsKCksXG4gIHN0YXJ0UEZNZXRhZGF0YTogei5vcHRpb25hbCh6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSlcbn0pO1xuY29uc3QgU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5TRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTKSxcbiAgcGF5bWVudE1ldGhvZElkOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IFJlcXVpcmVkRm9ybUZpZWxkcyA9IHoub2JqZWN0KHtcbiAgW1wiZmlyc3ROYW1lXCIgLyogRklSU1RfTkFNRSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJsYXN0TmFtZVwiIC8qIExBU1RfTkFNRSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJlbWFpbFwiIC8qIEVNQUlMICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcInppcENvZGVcIiAvKiBaSVBfQ09ERSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJjb3VudHJ5XCIgLyogQ09VTlRSWSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJwcm9tb3Rpb25Db2RlXCIgLyogUFJPTU9USU9OX0NPREUgKi9dOiBPcHRpb25hbFN0cmluZ1xufSk7XG5jb25zdCBQUkZvcm1GaWVsZHMgPSB6Lm9iamVjdCh7XG4gIFtcImVtYWlsXCIgLyogRU1BSUwgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wiemlwQ29kZVwiIC8qIFpJUF9DT0RFICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcImNvdW50cnlcIiAvKiBDT1VOVFJZICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcInByb21vdGlvbkNvZGVcIiAvKiBQUk9NT1RJT05fQ09ERSAqL106IE9wdGlvbmFsU3RyaW5nXG59KTtcbmNvbnN0IFN1Ym1pdEV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIlRPS0VOSVpFXCIsIFwiQ0hFQ0tPVVRcIiwgXCJTVEFSVF9QQVlNRU5UX0ZMT1dcIl0pO1xuY29uc3QgU3VibWl0RXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBTdWJtaXRFdmVudFR5cGUsXG4gIHNlc3Npb25JZDogUmVxdWlyZWRTdHJpbmcsXG4gIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gIHBheW1lbnRGbG93TWV0YWRhdGE6IHouYW55KCkub3B0aW9uYWwoKSxcbiAgZG9Ob3RVc2VMZWdhY3lDQ0Zsb3c6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGV4aXN0aW5nQ0NQTUlkOiBPcHRpb25hbFN0cmluZ1xufSkuZXh0ZW5kKFJlcXVpcmVkRm9ybUZpZWxkcy5zaGFwZSk7XG5jb25zdCBUb2tlbml6ZVN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5UT0tFTklaRV9TVUNDRVNTKSxcbiAgaXNSZWFkeUZvckNoZWNrb3V0OiB6LmJvb2xlYW4oKVxufSk7XG5jb25zdCBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5DSEVDS09VVF9TVUNDRVNTKSxcbiAgaW52b2ljZVVybHM6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gIHN1YnNjcmlwdGlvbklkczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgY3VzdG9tZXJJZDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBFdmVudFBheWxvYWQgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICBHZW5lcmljRXZlbnRQYXlsb2FkLFxuICBJbnB1dEV2ZW50UGF5bG9hZCxcbiAgRXJyb3JFdmVudFBheWxvYWQsXG4gIFZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCxcbiAgTGF5b3V0RXZlbnRQYXlsb2FkLFxuICBMb2FkZWRFdmVudFBheWxvYWQsXG4gIFN1Ym1pdEV2ZW50UGF5bG9hZCxcbiAgVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkLFxuICBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQsXG4gIFBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCxcbiAgU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWRcbl0pO1xuY29uc3QgRWxlbWVudEV2ZW50ID0gei5vYmplY3Qoe1xuICBwYXlsb2FkOiBFdmVudFBheWxvYWQsXG4gIG5vbmNlOiBSZXF1aXJlZFN0cmluZyxcbiAgZm9ybUlkOiBSZXF1aXJlZFN0cmluZyxcbiAgZWxlbWVudElkOiBSZXF1aXJlZFN0cmluZ1xufSk7XG56Lm9iamVjdCh7XG4gIGFtb3VudEF0b206IHoubnVtYmVyKCksXG4gIGN1cnJlbmN5OiBSZXF1aXJlZFN0cmluZ1xufSk7XG56Lm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogei5zdHJpbmcoKSxcbiAgcHJvbW90aW9uX2NvZGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKVxufSk7XG56Lm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogei5zdHJpbmcoKSxcbiAgZXhpc3RpbmdfY2NfcG1faWQ6IG51bGxPclVuZGVmT3IkMSh6LnN0cmluZygpKVxufSk7XG5jb25zdCBDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcGF5bWVudF9tZXRob2RzOiB6LmFycmF5KFBheW1lbnRNZXRob2RNaW5pbWFsKVxufSk7XG5jb25zdCBGaWVsZFZhbGlkYXRpb25FcnJvciA9IHoub2JqZWN0KHtcbiAgZWxlbWVudFR5cGU6IHouc3RyaW5nKCksXG4gIGVycm9yczogei5hcnJheSh6LnN0cmluZygpKVxufSk7XG56Lm9iamVjdCh7XG4gIHNlc3Npb25faWQ6IHouc3RyaW5nKClcbn0pO1xuY29uc3QgVG9rZW5pemVDYXJkRXJyb3JSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgc3VjY2Vzczogei5saXRlcmFsKGZhbHNlKSxcbiAgZXJyb3JfdHlwZTogei5saXRlcmFsKFwidmFsaWRhdGlvbl9lcnJvclwiKSxcbiAgZXJyb3JzOiB6LmFycmF5KEZpZWxkVmFsaWRhdGlvbkVycm9yKVxufSk7XG5jb25zdCBUb2tlbml6ZUNhcmRSZXNwb25zZSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwic3VjY2Vzc1wiLCBbXG4gIHoub2JqZWN0KHsgc3VjY2Vzczogei5saXRlcmFsKHRydWUpIH0pLFxuICBUb2tlbml6ZUNhcmRFcnJvclJlc3BvbnNlXG5dKTtcbnoub2JqZWN0KHtcbiAgc2Vzc2lvbl9pZDogei5zdHJpbmcoKSxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxLFxuICBub25fY2RlX2Zvcm1fZmllbGRzOiBSZXF1aXJlZEZvcm1GaWVsZHMsXG4gIGRvX25vdF91c2VfbGVnYWN5X2NjX2Zsb3c6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGV4aXN0aW5nX2NjX3BtX2lkOiBudWxsT3JVbmRlZk9yJDEoei5zdHJpbmcoKSlcbn0pO1xuei5vYmplY3Qoe1xuICBzZXNzaW9uX2lkOiB6LnN0cmluZygpLFxuICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gIG5vbl9jZGVfZm9ybV9maWVsZHM6IFJlcXVpcmVkRm9ybUZpZWxkc1xufSk7XG52YXIgVGhyZWVEU1N0YXR1cyA9IC8qIEBfX1BVUkVfXyAqLyAoKFRocmVlRFNTdGF0dXMyKSA9PiB7XG4gIFRocmVlRFNTdGF0dXMyW1wiU1VDQ0VTU1wiXSA9IFwic3VjY2Vzc1wiO1xuICBUaHJlZURTU3RhdHVzMltcIkZBSUxVUkVcIl0gPSBcImZhaWx1cmVcIjtcbiAgVGhyZWVEU1N0YXR1czJbXCJDQU5DRUxMRURcIl0gPSBcImNhbmNlbGxlZFwiO1xuICByZXR1cm4gVGhyZWVEU1N0YXR1czI7XG59KShUaHJlZURTU3RhdHVzIHx8IHt9KTtcbmNvbnN0IFBpbmczRFNTdGF0dXNSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LmVudW0oW1wic3VjY2Vzc1wiIC8qIFNVQ0NFU1MgKi8sIFwiZmFpbHVyZVwiIC8qIEZBSUxVUkUgKi8sIFwiY2FuY2VsbGVkXCIgLyogQ0FOQ0VMTEVEICovXSlcbn0pO1xuY29uc3QgQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LnN0cmluZygpLFxuICByZWRpcmVjdF91cmw6IHouc3RyaW5nKCksXG4gIGluaXRpYWxfaW50ZW50X2lkOiB6LnN0cmluZygpLFxuICBjb25zZW50X2lkOiB6LnN0cmluZygpXG59KTtcblxuY29uc3QgZXh0cmFjdElzc3Vlc1BlckZpZWxkID0gKGVycm9yKSA9PiB7XG4gIGNvbnN0IGlzc3Vlc1BlckZpZWxkID0ge307XG4gIE9iamVjdC5lbnRyaWVzKGVycm9yKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gRmllbGROYW1lRW51bS5wYXJzZShrZXkpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGlzc3Vlc1BlckZpZWxkW2ZpZWxkTmFtZV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5fZXJyb3JzKSkge1xuICAgICAgICBpc3N1ZXNQZXJGaWVsZFtmaWVsZE5hbWVdID0gdmFsdWUuX2Vycm9ycztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gaXNzdWVzUGVyRmllbGQ7XG59O1xuXG5jb25zdCBTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSB6Lm9iamVjdCh7XG4gIHN0cmlwZV9wazogei5zdHJpbmcoKSxcbiAgY2xpZW50X3NlY3JldDogei5zdHJpbmcoKSxcbiAgc3RyaXBlX3BtX2lkOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IFBheW1lbnRSZXF1ZXN0TmV4dEFjdGlvbk1ldGFkYXRhID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LnN0cmluZygpLFxuICBjbGllbnRfc2VjcmV0OiB6LnN0cmluZygpLFxuICBzdHJpcGVfcGs6IHouc3RyaW5nKClcbn0pO1xuY29uc3Qgb3VyQ3VycmVuY3lUb1RoZWlycyA9IHtcbiAgdXNkOiBcInVzZFwiLFxuICBicmw6IFwiYnJsXCJcbn07XG5jb25zdCBnZXRMb2FkZWRTdHJpcGUgPSBhc3luYyAocHVibGlzaGFibGVLZXkpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgaWYgKCFpc1N0cmlwZUpzUHJlc2VudCgpKSB7XG4gICAgICBhd2FpdCBzbGVlcCg1MDApO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU3RyaXBlSnNQcmVzZW50KCkpIHtcbiAgICBjb25zb2xlLmxvZyhcIlN0cmlwZSBKUyBub3QgZm91bmQuXCIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgU3RyaXBlIEpTIG5vdCBmb3VuZC5gKTtcbiAgfVxuICBjb25zdCBzdHJpcGUgPSBuZXcgU3RyaXBlKHB1Ymxpc2hhYmxlS2V5KTtcbiAgcmV0dXJuIHN0cmlwZTtcbn07XG5jb25zdCBjcmVhdGVTdHJpcGVFbGVtZW50cyA9IGFzeW5jIChzdHJpcGVQdWJLZXksIGVsZW1lbnRzT3B0aW9ucykgPT4ge1xuICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUoc3RyaXBlUHViS2V5KTtcbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50czogc3RyaXBlLmVsZW1lbnRzKGVsZW1lbnRzT3B0aW9ucyksXG4gICAgc3RyaXBlXG4gIH07XG59O1xuY29uc3QgY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QgPSBhc3luYyAoc3RyaXBlUHViS2V5LCB0b3RhbEFtb3VudEF0b20sIGN1cnJlbmN5LCBpc0Ftb3VudFBlbmRpbmcsIGlzTGlua09ubHkpID0+IHtcbiAgY29uc29sZS5sb2coaXNMaW5rT25seSk7XG4gIGNvbnN0IHN0cmlwZSA9IGF3YWl0IGdldExvYWRlZFN0cmlwZShzdHJpcGVQdWJLZXkpO1xuICBjb25zdCBzdHJpcGVDdXJyZW5jeSA9IG91ckN1cnJlbmN5VG9UaGVpcnNbY3VycmVuY3kudG9Mb3dlckNhc2UoKS50cmltKCldO1xuICBjb25zdCBwYXltZW50UmVxdWVzdCA9IHN0cmlwZS5wYXltZW50UmVxdWVzdCh7XG4gICAgLy8gVE9ETzogcmVwbGFjZSB0aGlzIHdpdGggc3RyaXBlIGFjY291bnQgY291bnRyeSBhcyBzb29uIGFzIHdlIHN1cHBvcnQgaXRcbiAgICBjb3VudHJ5OiBcIlVTXCIsXG4gICAgY3VycmVuY3k6IHN0cmlwZUN1cnJlbmN5LFxuICAgIHRvdGFsOiB7XG4gICAgICBsYWJlbDogXCJUb3RhbFwiLFxuICAgICAgYW1vdW50OiB0b3RhbEFtb3VudEF0b20sXG4gICAgICBwZW5kaW5nOiBpc0Ftb3VudFBlbmRpbmdcbiAgICB9LFxuICAgIHJlcXVlc3RQYXllck5hbWU6IHRydWUsXG4gICAgcmVxdWVzdFBheWVyRW1haWw6IHRydWUsXG4gICAgZGlzYWJsZVdhbGxldHM6IFtdIFxuICB9KTtcbiAgcmV0dXJuIHBheW1lbnRSZXF1ZXN0O1xufTtcbmNvbnN0IHNsZWVwID0gKHRpbWVvdXRNcykgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXRNcyk7XG4gIH0pO1xufTtcbmNvbnN0IGlzU3RyaXBlSnNQcmVzZW50ID0gKCkgPT4ge1xuICByZXR1cm4gXCJTdHJpcGVcIiBpbiB3aW5kb3c7XG59O1xuY29uc3Qgd2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QgPSBhc3luYyAocGF5bWVudFJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgcGF5bWVudFJlcXVlc3Qub24oXCJwYXltZW50bWV0aG9kXCIsIGFzeW5jIChldnQpID0+IHtcbiAgICAgICAgcmVzb2x2ZShldnQpO1xuICAgICAgfSk7XG4gICAgICBwYXltZW50UmVxdWVzdC5vbihcImNhbmNlbFwiLCAoKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFBheW1lbnQgY2FuY2VsbGVkLCBwbGVhc2UgY2xpY2sgU3VibWl0IGFnYWluIHRvIHBheWApKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChlKTtcbiAgICB9XG4gIH0pO1xufTtcbmNvbnN0IGNvbmZpcm1QYXltZW50Rmxvd0ZvclN0cmlwZVBSTGVnYWN5ID0gYXN5bmMgKHBheWxvYWQsIHN0cmlwZVBtKSA9PiB7XG4gIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBheWxvYWQubmV4dEFjdGlvbk1ldGFkYXRhO1xuICBpZiAoIXBheWxvYWQucGF5bWVudEZsb3dNZXRhZGF0YSB8fCAhcGF5bG9hZC5wYXltZW50Rmxvd01ldGFkYXRhW1wic3RyaXBlUG1JZFwiXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXltZW50IGZsb3cgbWV0YWRhdGEgZm9ybWF0OiAke0pTT04uc3RyaW5naWZ5KHBheWxvYWQucGF5bWVudEZsb3dNZXRhZGF0YSl9YCk7XG4gIH1cbiAgaWYgKCFuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrIHx8ICFuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBuZXh0IGFjdGlvbiBtZXRhZGF0YSBmb3JtYXQ6ICR7SlNPTi5zdHJpbmdpZnkobmV4dEFjdGlvbk1ldGFkYXRhKX1gKTtcbiAgfVxuICBpZiAoc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZCAhPT0gcGF5bG9hZC5wYXltZW50Rmxvd01ldGFkYXRhW1wic3RyaXBlUG1JZFwiXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUE0gSUQgbWlzbWF0Y2g6ICR7c3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZH0gIT0gJHtwYXlsb2FkLnBheW1lbnRGbG93TWV0YWRhdGFbXCJzdHJpcGVQbUlkXCJdfWApO1xuICB9XG4gIGNvbnN0IHN0cmlwZSA9IGF3YWl0IGdldExvYWRlZFN0cmlwZShuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrKTtcbiAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IHN0cmlwZS5jb25maXJtQ2FyZFNldHVwKG5leHRBY3Rpb25NZXRhZGF0YS5jbGllbnRfc2VjcmV0LCB7XG4gICAgcGF5bWVudF9tZXRob2Q6IHBheWxvYWQucGF5bWVudEZsb3dNZXRhZGF0YVtcInN0cmlwZVBtSWRcIl1cbiAgfSk7XG4gIGlmIChjb25maXJtUmVzdWx0LmVycm9yKSB7XG4gICAgc3RyaXBlUG0uY29tcGxldGUoXCJmYWlsXCIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgUGF5bWVudCBmYWlsZWQ6ICR7Y29uZmlybVJlc3VsdC5lcnJvci5tZXNzYWdlID8/IGB1bmtub3duYH1gKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJpcGVQbS5jb21wbGV0ZShcInN1Y2Nlc3NcIik7XG4gIH1cbn07XG5jb25zdCBjb25maXJtU3RyaXBlUHJQTSA9IGFzeW5jIChuZXh0QWN0aW9uTWV0YWRhdGEsIHN0cmlwZVBtKSA9PiB7XG4gIGlmICghbmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wayB8fCAhbmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmV4dCBhY3Rpb24gbWV0YWRhdGEgZm9ybWF0OiAke0pTT04uc3RyaW5naWZ5KG5leHRBY3Rpb25NZXRhZGF0YSl9YCk7XG4gIH1cbiAgY29uc3Qgc3RyaXBlID0gYXdhaXQgZ2V0TG9hZGVkU3RyaXBlKG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcGspO1xuICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgc3RyaXBlLmNvbmZpcm1DYXJkU2V0dXAobmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQsIHtcbiAgICBwYXltZW50X21ldGhvZDogc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZFxuICB9KTtcbiAgaWYgKGNvbmZpcm1SZXN1bHQuZXJyb3IpIHtcbiAgICBzdHJpcGVQbS5jb21wbGV0ZShcImZhaWxcIik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQYXltZW50IGZhaWxlZDogJHtjb25maXJtUmVzdWx0LmVycm9yLm1lc3NhZ2UgPz8gYHVua25vd25gfWApO1xuICB9IGVsc2Uge1xuICAgIHN0cmlwZVBtLmNvbXBsZXRlKFwic3VjY2Vzc1wiKTtcbiAgfVxuICByZXR1cm4gY29uZmlybVJlc3VsdDtcbn07XG5jb25zdCBjb25maXJtUGF5bWVudEZsb3dGb3IzRFMgPSBhc3luYyAocGF5bG9hZCkgPT4ge1xuICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEucGFyc2UocGF5bG9hZC5uZXh0QWN0aW9uTWV0YWRhdGEpO1xuICBhd2FpdCBsYXVuY2hTdHJpcGUzRFNEaWFsb2dGbG93KG5leHRBY3Rpb25NZXRhZGF0YSk7XG59O1xuY29uc3QgbGF1bmNoU3RyaXBlM0RTRGlhbG9nRmxvdyA9IGFzeW5jIChuZXh0QWN0aW9uTWV0YWRhdGEpID0+IHtcbiAgY29uc3Qgc3RyaXBlID0gYXdhaXQgZ2V0TG9hZGVkU3RyaXBlKG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcGspO1xuICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgc3RyaXBlLmNvbmZpcm1DYXJkU2V0dXAobmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQsIHtcbiAgICBwYXltZW50X21ldGhvZDogbmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wbV9pZFxuICB9KTtcbiAgY29uc3QgcmVzdWx0U3RhdHVzID0gY29uZmlybVJlc3VsdC5zZXR1cEludGVudD8uc3RhdHVzO1xuICBpZiAocmVzdWx0U3RhdHVzID09PSBcInN1Y2NlZWRlZFwiKSB7XG4gICAgY29uc29sZS5sb2coXCJbM0RTXSBDT05GSVJNSU5HIFBNOlwiLCBuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BtX2lkKTtcbiAgICBjb25zb2xlLmxvZyhcIlszRFNdIFNldHVwIGludGVudCBjcmVhdGVkOlwiLCBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50KTtcbiAgfSBlbHNlIGlmIChyZXN1bHRTdGF0dXMgPT09IFwiY2FuY2VsZWRcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGF5bWVudCBjYW5jZWxsZWQsIHBsZWFzZSBjbGljayBTdWJtaXQgYWdhaW4gdG8gcGF5YCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7Y29uZmlybVJlc3VsdC5lcnJvcj8ubWVzc2FnZSA/PyBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50Py5sYXN0X3NldHVwX2Vycm9yPy5tZXNzYWdlID8/IFwiUGF5bWVudCBmYWlsZWQsIHBsZWFzZSBjbGljayBzdWJtaXQgYWdhaW4gdG8gcGF5LlwifWBcbiAgICApO1xuICB9XG59O1xuXG5jb25zdCBjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyA9IChzdHlsZXMpID0+IHtcbiAgY29uc3Qgc2VyaWFsaXplZFN0eWxlcyA9IEpTT04uc3RyaW5naWZ5KHN0eWxlcyk7XG4gIHJldHVybiBzZXJpYWxpemVkU3R5bGVzO1xufTtcblxuY29uc3QgY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtID0gKGZvcm1EaXYsIGluaXRpYWxEaWN0KSA9PiB7XG4gIGNvbnN0IGluY2x1ZGVkSW5wdXRzID0gQXJyYXkuZnJvbShmb3JtRGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1vcGlkXVwiKSA/PyBbXSk7XG4gIGNvbnN0IGV4dHJhRGF0YSA9IGluY2x1ZGVkSW5wdXRzLnJlZHVjZSgoYWNjLCBpbnB1dCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGlucHV0LmdldEF0dHJpYnV0ZShcImRhdGEtb3BpZFwiKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIGFjYztcbiAgICByZXR1cm4geyAuLi5hY2MsIFtrZXldOiBpbnB1dC52YWx1ZSB9O1xuICB9LCBpbml0aWFsRGljdCA/PyB7fSk7XG4gIHJldHVybiBleHRyYURhdGE7XG59O1xuY29uc3QgY29uc3RydWN0U3VibWl0RXZlbnRQYXlsb2FkID0gKGV2ZW50VHlwZSwgc2Vzc2lvbklkLCBmb3JtRGl2LCBvblZhbGlkYXRpb25FcnJvciwgY2hlY2tvdXRQYXltZW50TWV0aG9kLCBkb05vdFVzZUxlZ2FjeUNDRmxvdywgcGF5bWVudEZsb3dNZXRhZGF0YSkgPT4ge1xuICBjb25zdCBleHRyYURhdGEgPSBjcmVhdGVJbnB1dHNEaWN0RnJvbUZvcm0oZm9ybURpdiwge1xuICAgIHR5cGU6IGV2ZW50VHlwZSxcbiAgICBzZXNzaW9uSWQsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIHBheW1lbnRGbG93TWV0YWRhdGEsXG4gICAgZG9Ob3RVc2VMZWdhY3lDQ0Zsb3dcbiAgfSk7XG4gIGNvbnNvbGUubG9nKGBbZm9ybV0gQ29uc3RydWN0aW5nICR7ZXZlbnRUeXBlfSBwYXlsb2FkOmAsIEpTT04uc3RyaW5naWZ5KGV4dHJhRGF0YSkpO1xuICBpZiAoY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyID09PSBcImFwcGxlX3BheVwiIHx8IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlciA9PT0gXCJnb29nbGVfcGF5XCIgfHwgY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyID09PSBcInN0cmlwZV9saW5rXCIpIHtcbiAgICBpZiAoIWV4dHJhRGF0YVtGaWVsZE5hbWUuWklQX0NPREVdKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBPdmVycmlkaW5nIGVtcHR5IHppcCBjb2RlIChvbmx5IGZvciBnb29nbGUgcGF5LCBhcHBsZSBwYXksIGFuZCBzdHJpcGUgbGluaylcIik7XG4gICAgICBleHRyYURhdGFbRmllbGROYW1lLlpJUF9DT0RFXSA9IFwiMDAwMDBcIjtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGF5bG9hZCA9IFN1Ym1pdEV2ZW50UGF5bG9hZC5zYWZlUGFyc2UoZXh0cmFEYXRhKTtcbiAgaWYgKCFwYXlsb2FkLnN1Y2Nlc3MpIHtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBwYXlsb2FkLmVycm9yLmZvcm1hdCgpO1xuICAgIGNvbnN0IGlzc3VlcyA9IGV4dHJhY3RJc3N1ZXNQZXJGaWVsZChmb3JtYXR0ZWQpO1xuICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZSwgZXJyb3JzXSBvZiBPYmplY3QuZW50cmllcyhpc3N1ZXMpKSB7XG4gICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9ycywgZmllbGROYW1lKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXCJbZm9ybV0gQ29uc3RydWN0ZWQgcGF5bG9hZCBpbiBGQUlMOlwiLCBwYXlsb2FkLmRhdGEpO1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIENvbnN0cnVjdGVkIHBheWxvYWQ6XCIsIEpTT04uc3RyaW5naWZ5KHBheWxvYWQuZGF0YSkpO1xuICAgIHJldHVybiBwYXlsb2FkLmRhdGE7XG4gIH1cbn07XG5jb25zdCBwYXJzZUV2ZW50UGF5bG9hZCA9IChldmVudERhdGEpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRWxlbWVudEV2ZW50LnBhcnNlKGV2ZW50RGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIHBhcnNpbmcgZXZlbnQgcGF5bG9hZDpcIiwgZXZlbnREYXRhLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5jb25zdCBlbWl0RXZlbnQgPSAodGFyZ2V0LCBmb3JtSWQsIGVsZW1lbnRJZCwgcGF5bG9hZCwgYmFzZVVybCkgPT4ge1xuICBjb25zdCBldmVudCA9IHtcbiAgICBwYXlsb2FkLFxuICAgIG5vbmNlOiB2NCgpLFxuICAgIGZvcm1JZCxcbiAgICBlbGVtZW50SWRcbiAgfTtcbiAgY29uc29sZS5sb2coYFtmb3JtICR7Zm9ybUlkfV0gU2VuZGluZyBldmVudCB0byBjaGlsZCAke2VsZW1lbnRJZH06YCwgZXZlbnQpO1xuICB0YXJnZXQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZXZlbnQpLCBiYXNlVXJsKTtcbn07XG5cbmNvbnN0IGNoZWNrSWZWYWxpZENkZUNvbm5lY3Rpb25PYmplY3QgPSBhc3luYyAob2JqKSA9PiB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8ICFvYmopIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaW5nID0geyB0eXBlOiBcInBpbmdcIiB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9iai5zZW5kKHBpbmcpO1xuICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJ3RydWUnIGFmdGVyIHBpbmcsIGdvdCAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBDREUgY29ubmVjdGlvbiBjaGVjazpgLCBlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5jb25zdCBpc1Jlc3VsdFZhbGlkID0gKG9iaiwgaXNWYWxpZCkgPT4ge1xuICByZXR1cm4gISFvYmogJiYgaXNWYWxpZDtcbn07XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVDZGVDb25uZWN0aW9uKGlmcmFtZSkge1xuICBjb25zdCBjb25uZWN0aW9uID0gY29ubmVjdFRvQ2hpbGQoe1xuICAgIGlmcmFtZSxcbiAgICBkZWJ1ZzogdHJ1ZVxuICB9KTtcbiAgY29uc3QgY29ubmVjdGlvbk9iaiA9IGF3YWl0IGNvbm5lY3Rpb24ucHJvbWlzZTtcbiAgY29uc3QgaXNWYWxpZE9iamVjdCA9IGF3YWl0IGNoZWNrSWZWYWxpZENkZUNvbm5lY3Rpb25PYmplY3QoY29ubmVjdGlvbk9iaik7XG4gIGlmICghaXNSZXN1bHRWYWxpZChjb25uZWN0aW9uT2JqLCBpc1ZhbGlkT2JqZWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgR290IGludmFsaWQgQ0RFIGNvbm5lY3Rpb24gb2JqZWN0YCk7XG4gIH1cbiAgY29uc29sZS5sb2coXCJbT0pTXSBjb25uZWN0ZWQgdG8gaWZyYW1lXCIsIGlmcmFtZS5pZCk7XG4gIHJldHVybiBjb25uZWN0aW9uT2JqO1xufVxuXG5jb25zdCBudWxsT3JVbmRlZk9yID0gKHpUeXBlKSA9PiB6Lm51bGxhYmxlKHpUeXBlLm9wdGlvbmFsKCkpO1xuei5zdHJpbmcoKS50cmltKCkubWluKDEsIHsgbWVzc2FnZTogYENhbm5vdCBiZSBibGFua2AgfSk7XG5jb25zdCBDREVSZXNwb25zZUVycm9yID0gei5vYmplY3Qoe1xuICBjZGVfcmVzcG9uc2VfdHlwZTogei5saXRlcmFsKFwiZXJyb3JcIiksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCksXG4gIGhlYWRlcnM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKClcbn0pO1xuei5lbnVtKFtcInVzZFwiLCBcImJybFwiXSk7XG5jb25zdCBDb3Vwb25NaW5pbWFsID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLFxuICBhbW91bnRfYXRvbV9vZmY6IG51bGxPclVuZGVmT3Ioei5udW1iZXIoKSksXG4gIHBlcmNlbnRfb2ZmOiBudWxsT3JVbmRlZk9yKHoubnVtYmVyKCkpLFxuICBjdXJyZW5jeTogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgZHVyYXRpb246IHouc3RyaW5nKCksXG4gIGR1cmF0aW9uX2luX21vbnRoczogbnVsbE9yVW5kZWZPcih6Lm51bWJlcigpKVxufSk7XG5jb25zdCBMaW5lSXRlbSA9IHoub2JqZWN0KHtcbiAgYW1vdW50X3N1YnRvdGFsX2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGFtb3VudF90b3RhbF9hdG9tOiB6Lm51bWJlcigpLmludCgpLFxuICBjdXJyZW5jeTogei5zdHJpbmcoKSxcbiAgZGVzY3JpcHRpb246IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIHByaWNlX2lkOiB6LnN0cmluZygpLFxuICBiaWxsaW5nX2ludGVydmFsOiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICBiaWxsaW5nX2ludGVydmFsX2NvdW50OiBudWxsT3JVbmRlZk9yKHoubnVtYmVyKCkuaW50KCkpLFxuICBxdWFudGl0eTogei5udW1iZXIoKS5pbnQoKVxufSk7XG5jb25zdCBCcmFuZFNldHRpbmdzID0gei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSk7XG5jb25zdCBCcmFuZCA9IHoub2JqZWN0KHtcbiAgbmFtZTogei5zdHJpbmcoKSxcbiAgc2V0dGluZ3M6IG51bGxPclVuZGVmT3IoQnJhbmRTZXR0aW5ncylcbn0pO1xuY29uc3QgQ2hlY2tvdXRQYXltZW50TWV0aG9kID0gei5vYmplY3Qoe1xuICBwcm92aWRlcjogei5zdHJpbmcoKSxcbiAgcHJvY2Vzc29yX25hbWU6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIG1ldGFkYXRhOiBudWxsT3JVbmRlZk9yKHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKVxufSk7XG5jb25zdCBTdWJzY3JpcHRpb25JdGVtTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgcXVhbnRpdHk6IHoubnVtYmVyKClcbn0pO1xuY29uc3QgU3Vic2NyaXB0aW9uTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgaWQ6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGJpbGxpbmdfaW50ZXJ2YWw6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGJpbGxpbmdfaW50ZXJ2YWxfY291bnQ6IG51bGxPclVuZGVmT3Ioei5udW1iZXIoKS5pbnQoKSksXG4gIHN1YnNjcmlwdGlvbl9pdGVtczogei5hcnJheShTdWJzY3JpcHRpb25JdGVtTWluaW1hbCksXG4gIHRyaWFsX3N0YXJ0OiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICB0cmlhbF9lbmQ6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSlcbn0pO1xuY29uc3QgSW52b2ljZUl0ZW1EaXNjb3VudEFtb3VudHNNaW5pbWFsID0gei5vYmplY3Qoe1xuICBhbW91bnRfYXRvbTogei5udW1iZXIoKVxufSk7XG5jb25zdCBJbnZvaWNlTGluZUl0ZW1NaW5pbWFsID0gei5vYmplY3Qoe1xuICBhbW91bnRfYXRvbTogei5udW1iZXIoKSxcbiAgYW1vdW50X2F0b21fY29uc2lkZXJpbmdfZGlzY291bnRfYXBwbGllZDogei5udW1iZXIoKSxcbiAgY3VycmVuY3k6IHouc3RyaW5nKCksXG4gIGRpc2NvdW50X2Ftb3VudF9hdG9tczogei5hcnJheShJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwpLFxuICBzdWJzY3JpcHRpb25faXRlbV9pZDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBEaXNjb3VudE1pbmltYWwgPSB6Lm9iamVjdCh7XG4gIGNvdXBvbjogQ291cG9uTWluaW1hbFxufSk7XG5jb25zdCBJbnZvaWNlTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgY3VycmVuY3k6IHouc3RyaW5nKCksXG4gIGRpc2NvdW50czogei5hcnJheShEaXNjb3VudE1pbmltYWwpLFxuICBob3N0ZWRfaW52b2ljZV91cmw6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGxpbmVzOiB6LmFycmF5KEludm9pY2VMaW5lSXRlbU1pbmltYWwpLFxuICByZW1haW5pbmdfYW1vdW50X2F0b206IHoubnVtYmVyKCksXG4gIHRheF9hbW91bnRfYXRvbTogei5udW1iZXIoKSxcbiAgdG90YWxfYW1vdW50X2F0b206IHoubnVtYmVyKCksXG4gIHRvdGFsX2Rpc2NvdW50X2Ftb3VudF9hdG9tczogei5hcnJheShJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwpXG59KTtcbmNvbnN0IENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgY3JlYXRlZDogei5hcnJheShTdWJzY3JpcHRpb25NaW5pbWFsKSxcbiAgaW52b2ljZXM6IHouYXJyYXkoSW52b2ljZU1pbmltYWwpXG59KTtcbmNvbnN0IFByZXZpZXdDaGVja291dFJlc3BvbnNlID0gei5vYmplY3Qoe1xuICBwcmV2aWV3OiBDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwsXG4gIHByZXZpZXdfcG9zdF90cmlhbDogbnVsbE9yVW5kZWZPcihDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwpLFxuICBjb3Vwb25zOiB6LmFycmF5KENvdXBvbk1pbmltYWwpXG59KTtcbmNvbnN0IF9QYXltZW50Rm9ybVByZWZpbGxDb21tb24gPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5saXRlcmFsKFwib3BlblwiKSxcbiAgdG9rZW46IHouc3RyaW5nKCksXG4gIGVtYWlsOiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICBsaW5lX2l0ZW1zOiB6LmFycmF5KExpbmVJdGVtKSxcbiAgYW1vdW50X3N1YnRvdGFsX2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGFtb3VudF90b3RhbF9hdG9tOiB6Lm51bWJlcigpLmludCgpLFxuICBicmFuZDogQnJhbmQsXG4gIHN1YnNfcHJldmlldzogbnVsbE9yVW5kZWZPcihQcmV2aWV3Q2hlY2tvdXRSZXNwb25zZSksXG4gIC8vIE51bGwgaW4gc2V0dXAgbW9kZVxuICBtZXRob2RzX2F2YWlsYWJsZTogei5hcnJheShDaGVja291dFBheW1lbnRNZXRob2QpXG59KTtcbmNvbnN0IFBheW1lbnRGb3JtUHJlZmlsbCA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwibW9kZVwiLCBbXG4gIHoub2JqZWN0KHtcbiAgICBtb2RlOiB6LmxpdGVyYWwoXCJzZXR1cFwiKSxcbiAgICBjdXJyZW5jeTogei5udWxsYWJsZSh6LnVuZGVmaW5lZCgpKVxuICB9KS5leHRlbmQoX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbi5zaGFwZSksXG4gIHoub2JqZWN0KHtcbiAgICBtb2RlOiB6LmVudW0oW1wicGF5bWVudFwiLCBcInN1YnNjcmlwdGlvblwiXSksXG4gICAgY3VycmVuY3k6IHouc3RyaW5nKClcbiAgfSkuZXh0ZW5kKF9QYXltZW50Rm9ybVByZWZpbGxDb21tb24uc2hhcGUpXG5dKTtcbmNvbnN0IENvbXBsZXRlZEZvcm1QcmVmaWxsID0gei5vYmplY3Qoe1xuICBzdGF0dXM6IHoubGl0ZXJhbChcImNvbXBsZXRlXCIpXG59KTtcbmNvbnN0IEV4cGlyZWRGb3JtUHJlZmlsbCA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LmxpdGVyYWwoXCJleHBpcmVkXCIpXG59KTtcbnoudW5pb24oW1BheW1lbnRGb3JtUHJlZmlsbCwgQ29tcGxldGVkRm9ybVByZWZpbGwsIEV4cGlyZWRGb3JtUHJlZmlsbF0pO1xuei5vYmplY3Qoe1xuICBsb2dvOiB6LnN0cmluZygpLFxuICBpY29uOiB6LnN0cmluZygpLFxuICBwcmltYXJ5X2NvbG9yOiB6LnN0cmluZygpLFxuICBzZWNvbmRhcnlfY29sb3I6IHouc3RyaW5nKClcbn0pO1xuY29uc3QgQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIGludm9pY2VfdXJsczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgc3Vic2NyaXB0aW9uX2lkczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgY3VzdG9tZXJfaWQ6IHouc3RyaW5nKClcbn0pO1xuei5vYmplY3Qoe1xuICBzZWN1cmVfdG9rZW46IHouc3RyaW5nKCksXG4gIHBheW1lbnRfaW5wdXQ6IHouYW55KCksXG4gIC8vIFNob3VsZCBmb2xsb3cgQW55UGF5bWVudElucHV0IGZyb20gQ0RFXG4gIGN1c3RvbWVyX2VtYWlsOiB6LnN0cmluZygpLFxuICBjdXN0b21lcl96aXBfY29kZTogei5zdHJpbmcoKSxcbiAgY3VzdG9tZXJfY291bnRyeTogei5zdHJpbmcoKSxcbiAgbGluZV9pdGVtczogei5hcnJheShMaW5lSXRlbSksXG4gIHRvdGFsX2Ftb3VudF9hdG9tOiB6Lm51bWJlcigpLmludCgpLFxuICBjYW5jZWxfYXRfZW5kOiB6LmJvb2xlYW4oKSxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgcHJvbW90aW9uX2NvZGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZG9fbm90X3VzZV9sZWdhY3lfY2NfZmxvdzogei5ib29sZWFuKCkub3B0aW9uYWwoKVxufSk7XG5jb25zdCBTZXR1cENoZWNrb3V0UmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHBheW1lbnRfbWV0aG9kX2lkOiB6LnN0cmluZygpXG59KTtcbnoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIHJldHVybl91cmw6IHouc3RyaW5nKClcbn0pO1xuY29uc3QgUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHouc3RyaW5nKCksXG4gIGxvYzogei5hcnJheSh6LnN0cmluZygpKSxcbiAgbXNnOiB6LnN0cmluZygpLFxuICB1cmw6IHouc3RyaW5nKClcbn0pO1xuei5hcnJheShQeWRhbnRpY1ZhbGlkYXRpb25FcnJvcik7XG56Lm9iamVjdCh7XG4gIG5ld19jdXN0b21lcl9lbWFpbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBuZXdfY3VzdG9tZXJfYWRkcmVzczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkub3B0aW9uYWwoKSxcbiAgcGF5bWVudF9wcm92aWRlcjogei5zdHJpbmcoKSxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgZXhpc3RpbmdfY2NfcG1faWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdGhlaXJfZXhpc3RpbmdfcG1faWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKVxufSk7XG5jb25zdCBTdGFydFBheW1lbnRGbG93UmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHJlcXVpcmVkX3VzZXJfYWN0aW9uczogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSlcbn0pO1xuei5vYmplY3Qoe1xuICBmaWVsZHM6IFBSRm9ybUZpZWxkcyxcbiAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2Rcbn0pO1xuei5vYmplY3Qoe1xuICBzZXNzaW9uX2lkOiB6LnN0cmluZygpLFxuICBub25fY2RlX2Zvcm1fZmllbGRzOiBSZXF1aXJlZEZvcm1GaWVsZHMsXG4gIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2Rcbn0pO1xuY29uc3QgU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHJlcXVpcmVkX3VzZXJfYWN0aW9uczogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSksXG4gIGNjX3BtX2lkOiB6LnN0cmluZygpXG59KTtcbnoucmVjb3JkKHouYW55KCkpO1xuXG5jb25zdCBzdW0gPSAoYXJyKSA9PiB7XG4gIHJldHVybiBhcnIucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG59O1xuXG5mdW5jdGlvbiBmaXhQcm90byh0YXJnZXQsIHByb3RvdHlwZSkge1xuICB2YXIgc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2Y7XG4gIHNldFByb3RvdHlwZU9mID8gc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90b3R5cGUpIDogdGFyZ2V0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTtcbn1cbmZ1bmN0aW9uIGZpeFN0YWNrKHRhcmdldCwgZm4pIHtcbiAgaWYgKGZuID09PSB2b2lkIDApIHtcbiAgICBmbiA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcbiAgfVxuXG4gIHZhciBjYXB0dXJlU3RhY2tUcmFjZSA9IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlO1xuICBjYXB0dXJlU3RhY2tUcmFjZSAmJiBjYXB0dXJlU3RhY2tUcmFjZSh0YXJnZXQsIGZuKTtcbn1cblxudmFyIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9leHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gZXh0ZW5kU3RhdGljcyhkLCBiKSB7XG4gICAgX2V4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwge1xuICAgICAgX19wcm90b19fOiBbXVxuICAgIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZC5fX3Byb3RvX18gPSBiO1xuICAgIH0gfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcblxuICAgIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuXG4gICAgZnVuY3Rpb24gX18oKSB7XG4gICAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDtcbiAgICB9XG5cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG59KCk7XG5cbnZhciBDdXN0b21FcnJvciA9IGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKEN1c3RvbUVycm9yLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIEN1c3RvbUVycm9yKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG5cbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtZXNzYWdlLCBvcHRpb25zKSB8fCB0aGlzO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF90aGlzLCAnbmFtZScsIHtcbiAgICAgIHZhbHVlOiBfbmV3VGFyZ2V0Lm5hbWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGZpeFByb3RvKF90aGlzLCBfbmV3VGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgZml4U3RhY2soX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHJldHVybiBDdXN0b21FcnJvcjtcbn0oRXJyb3IpO1xuXG5jbGFzcyBDZGVFcnJvciBleHRlbmRzIEN1c3RvbUVycm9yIHtcbiAgY29uc3RydWN0b3IocmVzcG9uc2UpIHtcbiAgICBjb25zdCBmcmllbmRseU1lc3NhZ2UgPSBgW2NkZS1jbGllbnRdIEVycm9yIHF1ZXJ5aW5nIENERTogJHtyZXNwb25zZS5tZXNzYWdlfWA7XG4gICAgc3VwZXIoZnJpZW5kbHlNZXNzYWdlKTtcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIH1cbiAgZ2V0IG9yaWdpbmFsRXJyb3JNZXNzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLm1lc3NhZ2U7XG4gIH1cbn1cbmNvbnN0IHF1ZXJ5Q0RFID0gYXN5bmMgKGNkZUNvbm4sIGRhdGEsIHJlc3BvbnNlU2NoZW1hKSA9PiB7XG4gIGNvbnNvbGUubG9nKFwiW2NkZS1jbGllbnRdIFF1ZXJ5aW5nIENERSB3aXRoIHBhdGggYW5kIGNvbm5lY3Rpb246XCIsIGRhdGEudHlwZSwgY2RlQ29ubik7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2RlQ29ubi5zZW5kKGRhdGEpO1xuICBjb25zb2xlLmxvZyhcIltjZGUtY2xpZW50XSBHb3QgcmVzcG9uc2UgZnJvbSBDREU6XCIsIHJlc3BvbnNlKTtcbiAgaWYgKGlzQ0RFUmVzcG9uc2VFcnJvcihyZXNwb25zZSkpIHtcbiAgICB0aHJvdyBuZXcgQ2RlRXJyb3IocmVzcG9uc2UpO1xuICB9XG4gIGlmICghY2hlY2tJZkNvbmZvcm1zVG9TY2hlbWEocmVzcG9uc2UsIHJlc3BvbnNlU2NoZW1hKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlU2NoZW1hLnNhZmVQYXJzZShyZXNwb25zZSk7XG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0YXRlXCIpO1xuICAgIGNvbnNvbGUuZXJyb3IoXCJPSlMgcXVlcnlBcGkgZ290IGEgc2NoZW1hIGVycm9yLiBFeHBlY3RlZCBzY2hlbWE6XCIsIHJlc3BvbnNlU2NoZW1hLCBcIkFjdHVhbDpcIiwgcmVzcG9uc2UpO1xuICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59O1xuY29uc3QgY2hlY2tJZkNvbmZvcm1zVG9TY2hlbWEgPSAodmFsdWUsIHNjaGVtYSkgPT4ge1xuICByZXR1cm4gc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSkuc3VjY2Vzcztcbn07XG5jb25zdCBpc0NERVJlc3BvbnNlRXJyb3IgPSAocmVzcG9uc2UpID0+IHtcbiAgcmV0dXJuIENERVJlc3BvbnNlRXJyb3Iuc2FmZVBhcnNlKHJlc3BvbnNlKS5zdWNjZXNzO1xufTtcbmNvbnN0IGdldENoZWNrb3V0UHJldmlldyA9IGFzeW5jIChjZGVDb25uLCByZXF1ZXN0KSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiZ2V0X2NoZWNrb3V0X3ByZXZpZXdcIiwgcGF5bG9hZDogcmVxdWVzdCB9LCBQcmV2aWV3Q2hlY2tvdXRSZXNwb25zZSk7XG59O1xuY29uc3QgZ2V0UHJlZmlsbCA9IGFzeW5jIChjZGVDb25uKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiZ2V0X3ByZWZpbGxcIiwgcGF5bG9hZDoge30gfSwgUGF5bWVudEZvcm1QcmVmaWxsKTtcbn07XG5jb25zdCBzdGFydFBheW1lbnRGbG93ID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJ2Ml9zdGFydF9wYXltZW50X2Zsb3dcIiwgcGF5bG9hZCB9LCBTdGFydFBheW1lbnRGbG93UmVzcG9uc2UpO1xufTtcbmNvbnN0IHN0YXJ0UGF5bWVudEZsb3dGb3JDQyA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic3RhcnRfcGF5bWVudF9mbG93X2Zvcl9jY1wiLCBwYXlsb2FkIH0sIFN0YXJ0UGF5bWVudEZsb3dGb3JDQ1Jlc3BvbnNlKTtcbn07XG5jb25zdCBzdGFydFBheW1lbnRGbG93Rm9yUFIgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcInN0YXJ0X3BheW1lbnRfZmxvd19mb3JfcHJcIiwgcGF5bG9hZCB9LCBTdGFydFBheW1lbnRGbG93UmVzcG9uc2UpO1xufTtcbmNvbnN0IGNvbmZpcm1QYXltZW50RmxvdyA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiY29uZmlybV9wYXltZW50X2Zsb3dcIiwgcGF5bG9hZCB9LCBDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSk7XG59O1xuY29uc3Qgd2FpdEZvckZvcm1GaWVsZElucHV0ID0gYXN5bmMgKGZvcm1EaXYsIGZpZWxkTmFtZSwgd2FpdFRpbWVNcykgPT4ge1xuICBjb25zdCBzdGFydFdhaXRUaW1lID0gRGF0ZS5ub3coKTtcbiAgd2FpdFRpbWVNcyA9IHdhaXRUaW1lTXMgPz8gNWUzO1xuICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0V2FpdFRpbWUgPCB3YWl0VGltZU1zKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBmb3JtRGl2LnF1ZXJ5U2VsZWN0b3IoYGlucHV0W2RhdGEtb3BpZD0ke2ZpZWxkTmFtZX1dYCk7XG4gICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICBpZiAoIShtYXRjaCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzdGF0ZTogbWF0Y2hlZCBpbnB1dCBlbGVtZW50IGhhZCB3cm9uZyBjbGFzczogJHttYXRjaC50YWdOYW1lfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cbiAgICBhd2FpdCBzbGVlcCgzMDApO1xuICB9XG4gIGNvbnNvbGUud2FybihcIkNhbm5vdCBmaW5kIHByb21vIGNvZGUgaW5wdXRcIik7XG4gIHJldHVybiBudWxsO1xufTtcbmNvbnN0IGdldENoZWNrb3V0VmFsdWUgPSBhc3luYyAoY2RlQ29ubiwgc2VjdXJlVG9rZW4sIHByb21vQ29kZSkgPT4ge1xuICBjb25zdCBjaGVja291dFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFByZXZpZXcoY2RlQ29ubiwge1xuICAgIHNlY3VyZV90b2tlbjogc2VjdXJlVG9rZW4sXG4gICAgcHJvbW90aW9uX2NvZGU6IHByb21vQ29kZVxuICB9KTtcbiAgY29uc3QgY3VycmVuY2llcyA9IG5ldyBTZXQoY2hlY2tvdXRQcmV2aWV3LnByZXZpZXcuaW52b2ljZXMubWFwKChpbnYpID0+IGludi5jdXJyZW5jeSkpO1xuICBpZiAoY3VycmVuY2llcy5zaXplICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IG9uZSBjdXJyZW5jeSwgZ290ICR7Y3VycmVuY2llcy5zaXplfWApO1xuICB9XG4gIGNvbnN0IGN1cnJlbmN5ID0gY3VycmVuY2llcy52YWx1ZXMoKS5uZXh0KCkudmFsdWUgPz8gXCJ1c2RcIjtcbiAgY29uc3QgYW1vdW50QXRvbSA9IHN1bShjaGVja291dFByZXZpZXcucHJldmlldy5pbnZvaWNlcy5tYXAoKGludikgPT4gaW52LnJlbWFpbmluZ19hbW91bnRfYXRvbSkpO1xuICByZXR1cm4ge1xuICAgIGN1cnJlbmN5LFxuICAgIGFtb3VudEF0b21cbiAgfTtcbn07XG5jb25zdCBnZXRDaGVja291dFByZXZpZXdBbW91bnQgPSBhc3luYyAoY2RlQ29ubiwgc2VjdXJlVG9rZW4sIGlzU2V0dXBNb2RlLCBwcm9tb0NvZGUpID0+IHtcbiAgaWYgKGlzU2V0dXBNb2RlKSB7XG4gICAgcmV0dXJuIHsgYW1vdW50QXRvbTogMCwgY3VycmVuY3k6IFwidXNkXCIgfTtcbiAgfSBlbHNlIHtcbiAgICBwcm9tb0NvZGUgPSAhcHJvbW9Db2RlID8gdm9pZCAwIDogcHJvbW9Db2RlO1xuICAgIGNvbnN0IGNoZWNrb3V0UHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0VmFsdWUoY2RlQ29ubiwgc2VjdXJlVG9rZW4sIHByb21vQ29kZSk7XG4gICAgcmV0dXJuIHsgYW1vdW50QXRvbTogY2hlY2tvdXRQcmV2aWV3LmFtb3VudEF0b20sIGN1cnJlbmN5OiBjaGVja291dFByZXZpZXcuY3VycmVuY3kgfTtcbiAgfVxufTtcbmNvbnN0IHRva2VuaXplQ2FyZE9uQWxsQ29ubmVjdGlvbnMgPSBhc3luYyAoYWxsQ2RlQ29ubmVjdGlvbnMsIHBheWxvYWQpID0+IHtcbiAgaWYgKGFsbENkZUNvbm5lY3Rpb25zLnNpemUgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBDREUgY29ubmVjdGlvbnMgZm91bmRcIik7XG4gIH1cbiAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgQXJyYXkuZnJvbShhbGxDZGVDb25uZWN0aW9ucy52YWx1ZXMoKSkubWFwKFxuICAgICAgKGNkZUNvbm4pID0+IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJ0b2tlbml6ZV9jYXJkXCIsIHBheWxvYWQgfSwgVG9rZW5pemVDYXJkUmVzcG9uc2UpXG4gICAgKVxuICApO1xuICByZXR1cm4gcmVzcG9uc2VzO1xufTtcbmNvbnN0IGNoZWNrb3V0Q2FyZEVsZW1lbnRzID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcImNoZWNrb3V0X2NhcmRfZWxlbWVudHNcIiwgcGF5bG9hZCB9LCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIltjZGUtY2xpZW50XSBFcnJvciBkdXJpbmcgY2hlY2tvdXRDYXJkRWxlbWVudHM6XCIsIGVycm9yLCBKU09OLnN0cmluZ2lmeShlcnJvcikpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuY29uc3Qgc2V0dXBDaGVja291dCA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic2V0dXBfcGF5bWVudF9tZXRob2RcIiwgcGF5bG9hZCB9LCBTZXR1cENoZWNrb3V0UmVzcG9uc2UpO1xufTtcbmNvbnN0IHBlcmZvcm1DaGVja291dCA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiY2hlY2tvdXRcIiwgcGF5bG9hZCB9LCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSk7XG59O1xuY29uc3QgQ0RFX1BPTExJTkdfSU5URVJWQUwgPSAxZTM7XG5jb25zdCBwaW5nQ2RlRm9yM2RzU3RhdHVzID0gYXN5bmMgKGlmcmFtZSwgY2hpbGRPcmlnaW4pID0+IHtcbiAgY29uc29sZS5sb2coY2hpbGRPcmlnaW4pO1xuICBjb25zdCBjb25uZWN0aW9uID0gY29ubmVjdFRvQ2hpbGQoe1xuICAgIGlmcmFtZSxcbiAgICBkZWJ1ZzogdHJ1ZSxcbiAgICB0aW1lb3V0OiBDREVfUE9MTElOR19JTlRFUlZBTCxcbiAgICBjaGlsZE9yaWdpbjogXCIqXCJcbiAgICAvLyBUT0RPOiB1c2Ugd2l0aCBwcm9wZXIgY2hpbGRPcmlnaW5cbiAgfSk7XG4gIGNvbnN0IGNvbm5lY3Rpb25PYmogPSBhd2FpdCBjb25uZWN0aW9uLnByb21pc2U7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5Q0RFKGNvbm5lY3Rpb25PYmosIHsgdHlwZTogXCJwaW5nLTNkcy1zdGF0dXNcIiB9LCBQaW5nM0RTU3RhdHVzUmVzcG9uc2UpO1xuICByZXR1cm4gcmVzdWx0LnN0YXR1cztcbn07XG5cbmNvbnN0IGlzSnNvblN0cmluZyA9IChzdHIpID0+IHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBKU09OLnBhcnNlKHN0cik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmNvbnN0IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzID0gKHNpbXBsZU9qc0Zsb3cpID0+IHtcbiAgcmV0dXJuIGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgcGFyYW1zLmZsb3dDYWxsYmFja3Mub25DaGVja291dFN0YXJ0ZWQoKTtcbiAgICAgIGNvbnN0IGZsb3dSZXN1bHQgPSBhd2FpdCBzaW1wbGVPanNGbG93KHBhcmFtcyk7XG4gICAgICBpZiAoZmxvd1Jlc3VsdC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgICAgcGFyYW1zLmZsb3dDYWxsYmFja3Mub25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzKGZsb3dSZXN1bHQucmVzdWx0LnBheW1lbnRfbWV0aG9kX2lkKTtcbiAgICAgIH0gZWxzZSBpZiAoZmxvd1Jlc3VsdC5tb2RlID09PSBcImNoZWNrb3V0XCIpIHtcbiAgICAgICAgcGFyYW1zLmZsb3dDYWxsYmFja3Mub25DaGVja291dFN1Y2Nlc3MoXG4gICAgICAgICAgZmxvd1Jlc3VsdC5yZXN1bHQuaW52b2ljZV91cmxzLFxuICAgICAgICAgIGZsb3dSZXN1bHQucmVzdWx0LnN1YnNjcmlwdGlvbl9pZHMsXG4gICAgICAgICAgZmxvd1Jlc3VsdC5yZXN1bHQuY3VzdG9tZXJfaWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIG1vZGU6ICR7Zmxvd1Jlc3VsdH1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcGFyYW1zLmZsb3dDYWxsYmFja3Mub25DaGVja291dEVycm9yKGdldEVycm9yTWVzc2FnZShlcnJvcikpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xufTtcbmNvbnN0IGFkZEVycm9yQ2F0Y2hlckZvckluaXQgPSAoaW5pdCkgPT4ge1xuICByZXR1cm4gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgaW5pdChwYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCB7IGVycl9fIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImluaXQtZXJyb3ItY2F0Y2hlclwiKTtcbiAgICAgIGVycl9fKGVycm9yKTtcbiAgICAgIHJldHVybiB7IGlzQXZhaWxhYmxlOiBmYWxzZSwgcmVhc29uOiBnZXRFcnJvck1lc3NhZ2UoZXJyb3IpIH07XG4gICAgfVxuICB9O1xufTtcbmNvbnN0IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzID0gKHByZWZpeCkgPT4ge1xuICBjb25zdCBsb2cgPSAoLi4uYXJncykgPT4ge1xuICAgIHdpbmRvd1tcImNvbnNvbGVcIl0ubG9nKGAke2NoYWxrLmdyZWVuLmJvbGQoXCJvanMvXCIpfSR7Y2hhbGsuYm9sZC5ncmF5KGAke3ByZWZpeH1gKX1cdGAsIC4uLmFyZ3MpO1xuICB9O1xuICBjb25zdCBlcnIgPSAoLi4uYXJncykgPT4ge1xuICAgIHdpbmRvd1tcImNvbnNvbGVcIl0uZXJyb3IoYCR7Y2hhbGsucmVkLmJvbGQoXCJvanMvXCIpfSR7Y2hhbGsuYm9sZC5ncmF5KGAke3ByZWZpeH1gKX1cdGAsIC4uLmFyZ3MpO1xuICB9O1xuICByZXR1cm4ge1xuICAgIGxvZyxcbiAgICBlcnIsXG4gICAgbG9nX186IGxvZyxcbiAgICBlcnJfXzogZXJyXG4gIH07XG59O1xuXG5jb25zdCB7IGxvZ19fOiBsb2dfXyQ1LCBlcnJfXzogZXJyX18kNSB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJjb21tb25cIik7XG5jb25zdCBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlID0gKHJlc3BvbnNlKSA9PiB7XG4gIGlmIChyZXNwb25zZS5wYXltZW50X21ldGhvZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IG9uZSBwYXltZW50IG1ldGhvZCwgZ290ICR7cmVzcG9uc2UucGF5bWVudF9tZXRob2RzLmxlbmd0aH1gKTtcbiAgfVxuICByZXR1cm4geyBwYXltZW50X21ldGhvZF9pZDogcmVzcG9uc2UucGF5bWVudF9tZXRob2RzWzBdLmlkIH07XG59O1xuY29uc3QgZmluZENwbU1hdGNoaW5nVHlwZSA9IChhbGxDUE1zLCB6b2RNb2RlbCkgPT4ge1xuICBjb25zdCBjcG0gPSBhbGxDUE1zLmZpbmQoKGNwbTIpID0+IHpvZE1vZGVsLnNhZmVQYXJzZShjcG0yKS5zdWNjZXNzKTtcbiAgaWYgKCFjcG0pIHtcbiAgICBlcnJfXyQ1KGBObyBDUE1zIGZvdW5kIGZvciBtb2RlbC4gQWxsIG1vZGVsczpgLCBhbGxDUE1zKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIENQTXMgZm91bmQgZm9yIG1vZGVsYCk7XG4gIH1cbiAgcmV0dXJuIHpvZE1vZGVsLnBhcnNlKGNwbSk7XG59O1xuXG5jb25zdCB7IGxvZ19fOiBsb2dfXyQ0LCBlcnJfXzogZXJyX18kNCB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJjb21tb24tY2NcIik7XG5jb25zdCB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyA9IChub25DZGVGb3JtSW5wdXRzLCBvblZhbGlkYXRpb25FcnJvcikgPT4ge1xuICBjb25zdCBwYXlsb2FkID0gUmVxdWlyZWRGb3JtRmllbGRzLnNhZmVQYXJzZShub25DZGVGb3JtSW5wdXRzKTtcbiAgaWYgKCFwYXlsb2FkLnN1Y2Nlc3MpIHtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBwYXlsb2FkLmVycm9yLmZvcm1hdCgpO1xuICAgIGNvbnN0IGlzc3VlcyA9IGV4dHJhY3RJc3N1ZXNQZXJGaWVsZChmb3JtYXR0ZWQpO1xuICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZSwgZXJyb3JzXSBvZiBPYmplY3QuZW50cmllcyhpc3N1ZXMpKSB7XG4gICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9ycywgZmllbGROYW1lKTtcbiAgICB9XG4gICAgZXJyX18kNChgR290IHZhbGlkYXRpb24gZXJyb3JzIGluIG5vbi1DREUgZm9ybSBmaWVsZHNgLCBpc3N1ZXMpO1xuICAgIHRocm93IG5ldyBFcnJvcihcIkdvdCB2YWxpZGF0aW9uIGVycm9ycyBpbiBub24tQ0RFIGZvcm0gZmllbGRzXCIpO1xuICB9XG4gIHJldHVybiBwYXlsb2FkLmRhdGE7XG59O1xuY29uc3QgdmFsaWRhdGVUb2tlbml6ZUNhcmRSZXN1bHRzID0gKHRva2VuaXplUmVzdWx0cywgb25WYWxpZGF0aW9uRXJyb3IpID0+IHtcbiAgZm9yIChjb25zdCB0b2tlbml6ZVJlc3VsdCBvZiB0b2tlbml6ZVJlc3VsdHMpIHtcbiAgICBpZiAodG9rZW5pemVSZXN1bHQuc3VjY2VzcyA9PT0gZmFsc2UpIHtcbiAgICAgIHRva2VuaXplUmVzdWx0LmVycm9ycy5mb3JFYWNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBBbGxGaWVsZE5hbWVzLnNhZmVQYXJzZShlcnJvci5lbGVtZW50VHlwZSk7XG4gICAgICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBlcnJfXyQ0KGBVbmtub3duIGZpZWxkIG5hbWUgaW4gb25WYWxpZGF0aW9uRXJyb3I6ICR7ZXJyb3IuZWxlbWVudFR5cGV9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZmllbGROYW1lID0gcGFyc2VkLmRhdGE7XG4gICAgICAgICAgb25WYWxpZGF0aW9uRXJyb3IoZmllbGROYW1lLCBlcnJvci5lcnJvcnMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxvZ19fJDQoYEVycm9yIHRva2VuaXppbmcgY2FyZDogZ290IHZhbGlkYXRpb24gZXJyb3JzOiAke0pTT04uc3RyaW5naWZ5KHRva2VuaXplUmVzdWx0LmVycm9ycyl9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHb3QgdmFsaWRhdGlvbiBlcnJvcnMgd2hpbGUgdG9rZW5pemluZyBjYXJkXCIpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgT0pTX1NUUklQRV9MSU5LX0JUTl9JRCA9IFwib2pzLXN0cmlwZS1saW5rLWJ0blwiO1xuY29uc3QgeyBsb2dfXzogbG9nX18kMywgZXJyX186IGVycl9fJDMgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwic3RyaXBlLWxpbmtcIik7XG5jb25zdCBTdHJpcGVMaW5rQ3BtID0gei5vYmplY3Qoe1xuICBwcm92aWRlcjogei5saXRlcmFsKFwic3RyaXBlX2xpbmtcIiksXG4gIHByb2Nlc3Nvcl9uYW1lOiB6LmxpdGVyYWwoXCJzdHJpcGVcIiksXG4gIG1ldGFkYXRhOiB6Lm9iamVjdCh7XG4gICAgc3RyaXBlX3BrOiB6LnN0cmluZygpXG4gIH0pXG59KTtcbmNvbnN0IFN0cmlwZUxpbmtSZXF1aXJlZFVzZXJBY3Rpb25zID0gei5hcnJheShcbiAgei5vYmplY3Qoe1xuICAgIG91cl9leGlzdGluZ19wbV9pZDogei5zdHJpbmcoKVxuICB9KVxuKS5sZW5ndGgoMSk7XG5jb25zdCBpbml0U3RyaXBlTGlua0Zsb3cgPSBhZGRFcnJvckNhdGNoZXJGb3JJbml0KFxuICBhc3luYyAoeyBjb250ZXh0LCBmbG93Q2FsbGJhY2tzIH0pID0+IHtcbiAgICBsb2dfXyQzKGBDaGVja2luZyBpZiB0aGVyZSBhcmUgYW55IENQTXMgZm9yIFN0cmlwZSBQUi4uLmApO1xuICAgIGNvbnN0IHN0cmlwZUxpbmtDcG0gPSBmaW5kQ3BtTWF0Y2hpbmdUeXBlKGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgU3RyaXBlTGlua0NwbSk7XG4gICAgbG9nX18kMyhgU3RhcnRpbmcgc3RyaXBlIGxpbmsgZmxvdy4uLmApO1xuICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgIGNvbnN0IGlzU2V0dXBNb2RlID0gcHJlZmlsbC5tb2RlID09PSBcInNldHVwXCI7XG4gICAgbG9nX18kMyhgQ3JlYXRpbmcgc3RyaXBlIGVsZW1lbnRzLi4uYCk7XG4gICAgY29uc3QgaW5pdGlhbFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFByZXZpZXdBbW91bnQoYW55Q2RlQ29ubmVjdGlvbiwgcHJlZmlsbC50b2tlbiwgaXNTZXR1cE1vZGUsIHZvaWQgMCk7XG4gICAgY29uc3QgeyBlbGVtZW50cywgc3RyaXBlIH0gPSBhd2FpdCBjcmVhdGVTdHJpcGVFbGVtZW50cyhzdHJpcGVMaW5rQ3BtLm1ldGFkYXRhLnN0cmlwZV9waywge1xuICAgICAgbW9kZTogXCJzZXR1cFwiLFxuICAgICAgY3VycmVuY3k6IGluaXRpYWxQcmV2aWV3LmN1cnJlbmN5LFxuICAgICAgc2V0dXBfZnV0dXJlX3VzYWdlOiBcIm9mZl9zZXNzaW9uXCIsXG4gICAgICBwYXltZW50TWV0aG9kQ3JlYXRpb246IFwibWFudWFsXCJcbiAgICB9KTtcbiAgICBsb2dfXyQzKGBNb3VudGluZyBwYXltZW50IGVsZW1lbnQuLi5gKTtcbiAgICBjb25zdCBleHByZXNzQ2hlY2tvdXRFbGVtZW50ID0gZWxlbWVudHMuY3JlYXRlKFwiZXhwcmVzc0NoZWNrb3V0XCIsIHtcbiAgICAgIGJ1dHRvbkhlaWdodDogY29udGV4dC5jdXN0b21Jbml0UGFyYW1zLnN0cmlwZUxpbms/LmJ1dHRvbkhlaWdodCxcbiAgICAgIHBheW1lbnRNZXRob2RzOiB7XG4gICAgICAgIGFtYXpvblBheTogXCJuZXZlclwiLFxuICAgICAgICBhcHBsZVBheTogXCJuZXZlclwiLFxuICAgICAgICBnb29nbGVQYXk6IFwibmV2ZXJcIixcbiAgICAgICAgcGF5cGFsOiBcIm5ldmVyXCJcbiAgICAgIH1cbiAgICB9KTtcbiAgICBleHByZXNzQ2hlY2tvdXRFbGVtZW50Lm1vdW50KGAjJHtPSlNfU1RSSVBFX0xJTktfQlROX0lEfWApO1xuICAgIGV4cHJlc3NDaGVja291dEVsZW1lbnQub24oXCJjbGlja1wiLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgIGxvZ19fJDMoXCJTdHJpcGUgTGluayBidXR0b24gY2xpY2tlZFwiKTtcbiAgICAgIGlmIChjb250ZXh0LmN1c3RvbUluaXRQYXJhbXMuc3RyaXBlTGluaz8ub3ZlcnJpZGVMaW5rU3VibWl0KSB7XG4gICAgICAgIGNvbnN0IHNob3VsZFN1Ym1pdCA9IGF3YWl0IGNvbnRleHQuY3VzdG9tSW5pdFBhcmFtcy5zdHJpcGVMaW5rLm92ZXJyaWRlTGlua1N1Ym1pdCgpO1xuICAgICAgICBpZiAoIXNob3VsZFN1Ym1pdCkge1xuICAgICAgICAgIGxvZ19fJDMoXCJTdHJpcGUgTGluayBzdWJtaXQgYWJvcnRlZCBieSBvdmVycmlkZUxpbmtTdWJtaXRcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBldmVudC5yZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgZXhwcmVzc0NoZWNrb3V0RWxlbWVudC5vbihcImNvbmZpcm1cIiwgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICBsb2dfXyQzKFwiU3RyaXBlIExpbmsgd2luZG93IGNvbmZpcm1lZFwiLCBldmVudCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJpcGUuY3JlYXRlUGF5bWVudE1ldGhvZCh7XG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBiaWxsaW5nX2RldGFpbHM6IGV2ZW50LmJpbGxpbmdEZXRhaWxzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICBlcnJfXyQzKFwiZXJyb3JcIiwgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0RXJyb3IocmVzdWx0LmVycm9yLm1lc3NhZ2UgPz8gXCJTdHJpcGUgTGluayB1bmtub3duIGVycm9yXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nX18kMyhcInBheW1lbnRNZXRob2RcIiwgcmVzdWx0LnBheW1lbnRNZXRob2QpO1xuICAgICAgICBPanNGbG93cy5zdHJpcGVMaW5rLnJ1bih7XG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IHN0cmlwZUxpbmtDcG0sXG4gICAgICAgICAgbm9uQ2RlRm9ybUlucHV0czogY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtKGNvbnRleHQuZm9ybURpdiksXG4gICAgICAgICAgZmxvd0NhbGxiYWNrcyxcbiAgICAgICAgICBjdXN0b21QYXJhbXM6IHsgc3RyaXBlUE06IHJlc3VsdC5wYXltZW50TWV0aG9kIH0sXG4gICAgICAgICAgaW5pdFJlc3VsdDogeyBpc0F2YWlsYWJsZTogdHJ1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7IGlzQXZhaWxhYmxlOiB0cnVlIH07XG4gIH1cbik7XG5jb25zdCBydW5TdHJpcGVMaW5rRmxvdyA9IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzKFxuICBhc3luYyAoe1xuICAgIGNvbnRleHQsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIG5vbkNkZUZvcm1JbnB1dHMsXG4gICAgZmxvd0NhbGxiYWNrcyxcbiAgICBjdXN0b21QYXJhbXNcbiAgfSkgPT4ge1xuICAgIGxvZ19fJDMoYFJ1bm5pbmcgU3RyaXBlIFBSIGZsb3cuLi5gKTtcbiAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICBsb2dfXyQzKGBNZXJnaW5nIFBNIGZpZWxkcyB3aXRoIGZvcm0gZmllbGRzLi4uYCk7XG4gICAgY29uc3QgbWVyZ2VkSW5wdXRzID0gZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQTShub25DZGVGb3JtSW5wdXRzLCBjdXN0b21QYXJhbXMuc3RyaXBlUE0pO1xuICAgIGNvbnN0IG5vbkNkZUZvcm1GaWVsZHMgPSB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyhtZXJnZWRJbnB1dHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgIGxvZ19fJDMoYFN0YXJ0aW5nIHBheW1lbnQgZmxvdy4uLmApO1xuICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSA9IGF3YWl0IHN0YXJ0UGF5bWVudEZsb3coYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgcGF5bWVudF9wcm92aWRlcjogY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyLFxuICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgIHRoZWlyX2V4aXN0aW5nX3BtX2lkOiBjdXN0b21QYXJhbXMuc3RyaXBlUE0uaWRcbiAgICB9KTtcbiAgICBsb2dfXyQzKFwiU3RhcnQgcGF5bWVudCBmbG93IHJlc3BvbnNlXCIsIHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG4gICAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gU3RyaXBlTGlua1JlcXVpcmVkVXNlckFjdGlvbnMucGFyc2Uoc3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucyk7XG4gICAgY29uc3Qgb3VyRXhpc3RpbmdQbUlkID0gbmV4dEFjdGlvbk1ldGFkYXRhWzBdLm91cl9leGlzdGluZ19wbV9pZDtcbiAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgIGxvZ19fJDMoYERvaW5nIHBheW1lbnQgc2V0dXAuLi5gKTtcbiAgICAgIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBjb25maXJtUGF5bWVudEZsb3coYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW4sXG4gICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBvdXJFeGlzdGluZ1BtSWRcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY3JlYXRlZFBheW1lbnRNZXRob2QgPSBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKGNvbmZpcm1SZXN1bHQpO1xuICAgICAgcmV0dXJuIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQ6IGNyZWF0ZWRQYXltZW50TWV0aG9kIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ19fJDMoYERvaW5nIGNoZWNrb3V0Li4uYCk7XG4gICAgICBjb25zdCBjaGVja291dFJlcXVlc3QgPSB7XG4gICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgcGF5bWVudF9pbnB1dDoge1xuICAgICAgICAgIHByb3ZpZGVyX3R5cGU6IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlclxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21lcl9lbWFpbDogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuRU1BSUxdLFxuICAgICAgICBjdXN0b21lcl96aXBfY29kZTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuWklQX0NPREVdLFxuICAgICAgICBjdXN0b21lcl9jb3VudHJ5OiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5DT1VOVFJZXSxcbiAgICAgICAgcHJvbW90aW9uX2NvZGU6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLlBST01PVElPTl9DT0RFXSxcbiAgICAgICAgbGluZV9pdGVtczogcHJlZmlsbC5saW5lX2l0ZW1zLFxuICAgICAgICB0b3RhbF9hbW91bnRfYXRvbTogcHJlZmlsbC5hbW91bnRfdG90YWxfYXRvbSxcbiAgICAgICAgY2FuY2VsX2F0X2VuZDogZmFsc2UsXG4gICAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2RcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwZXJmb3JtQ2hlY2tvdXQoYW55Q2RlQ29ubmVjdGlvbiwgY2hlY2tvdXRSZXF1ZXN0KTtcbiAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgfVxuICB9XG4pO1xuY29uc3QgZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQTSA9IChmb3JtSW5wdXRzLCBzdHJpcGVQbSkgPT4ge1xuICBjb25zdCBpbnB1dHMgPSB7IC4uLmZvcm1JbnB1dHMgfTtcbiAgY29uc3QgW3BheWVyRmlyc3ROYW1lLCAuLi5wYXllckxhc3ROYW1lUGFydHNdID0gc3RyaXBlUG0uYmlsbGluZ19kZXRhaWxzLm5hbWU/LnRyaW0oKT8uc3BsaXQoL1xccysvKSA/PyBbXTtcbiAgY29uc3QgcGF5ZXJMYXN0TmFtZSA9IHBheWVyTGFzdE5hbWVQYXJ0cy5qb2luKFwiIFwiKSB8fCB2b2lkIDA7XG4gIGlucHV0c1tGaWVsZE5hbWUuRklSU1RfTkFNRV0gPSBpbnB1dHNbRmllbGROYW1lLkZJUlNUX05BTUVdIHx8IHBheWVyRmlyc3ROYW1lIHx8IFwiX09QX1VOS05PV05cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5MQVNUX05BTUVdID0gaW5wdXRzW0ZpZWxkTmFtZS5MQVNUX05BTUVdIHx8IHBheWVyTGFzdE5hbWUgfHwgXCJfT1BfVU5LTk9XTlwiO1xuICBpbnB1dHNbRmllbGROYW1lLkVNQUlMXSA9IGlucHV0c1tGaWVsZE5hbWUuRU1BSUxdIHx8IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHN0cmlwZVBtW1wibGlua1wiXT8uZW1haWwgfHwgc3RyaXBlUG0uYmlsbGluZ19kZXRhaWxzLmVtYWlsIHx8IFwib3BfdW5maWxsZWRAZ2V0b3BlbnBheS5jb21cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gPSBpbnB1dHNbRmllbGROYW1lLlpJUF9DT0RFXSB8fCBzdHJpcGVQbS5iaWxsaW5nX2RldGFpbHMuYWRkcmVzcz8ucG9zdGFsX2NvZGUgfHwgXCIwMDAwMFwiO1xuICBpbnB1dHNbRmllbGROYW1lLkNPVU5UUlldID0gaW5wdXRzW0ZpZWxkTmFtZS5DT1VOVFJZXSB8fCBzdHJpcGVQbS5iaWxsaW5nX2RldGFpbHMuYWRkcmVzcz8uY291bnRyeSB8fCBcIlVTXCI7XG4gIGxvZ19fJDMoYEZpbmFsIGZvcm0gaW5wdXRzOmAsIGlucHV0cyk7XG4gIHJldHVybiBpbnB1dHM7XG59O1xuXG5jb25zdCBzdHlsZXMgPSBcIkBrZXlmcmFtZXMgZmFkZUluezAle29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGUoLjkpfXRve29wYWNpdHk6MTt0cmFuc2Zvcm06c2NhbGUoMSl9fS5vdmVybGF5e3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3otaW5kZXg6MjE0NzQ4MzY0OCFpbXBvcnRhbnQ7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtY29sb3I6IzAwMDAwMDgwfS5jb250YWluZXJ7bWF4LXdpZHRoOjUwMHB4O21heC1oZWlnaHQ6NjAwcHg7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7cG9zaXRpb246cmVsYXRpdmU7YW5pbWF0aW9uOmZhZGVJbiAuM3MgZWFzZS1vdXR9LmZyYW1le21heC13aWR0aDo1MDBweDttYXgtaGVpZ2h0OjYwMHB4O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyOm5vbmV9LmNhbmNlbC1idXR0b257cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXI6bm9uZTtmb250LXNpemU6MXJlbTtjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyO3RvcDotMS41cmVtO3BhZGRpbmc6MDtyaWdodDowfVwiO1xuXG5jb25zdCBjcmVhdGVBbmRPcGVuRnJhbWUgPSAodXJsKSA9PiB7XG4gIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBgXG4gICAgPHN0eWxlPlxuICAgICAgJHtzdHlsZXN9XG4gICAgPC9zdHlsZT5cbiAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8aWZyYW1lIHNyYz1cIiR7dXJsfVwiIGNsYXNzPVwiZnJhbWVcIiBpZD1cInRocmVlLWRzLWlmcmFtZVwiIHRpdGxlPVwiM0QgU2VjdXJlIHZlcmlmaWNhdGlvblwiIGFsbG93PVwicGF5bWVudFwiPjwvaWZyYW1lPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjb25zdCBzaGFkb3dSb290ID0gaG9zdC5hdHRhY2hTaGFkb3coeyBtb2RlOiBcIm9wZW5cIiB9KTtcbiAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5jb250ZW50LmNsb25lTm9kZSh0cnVlKSk7XG4gIGNvbnN0IGlmcmFtZSA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIiN0aHJlZS1kcy1pZnJhbWVcIik7XG4gIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIi5jYW5jZWwtYnV0dG9uXCIpO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhvc3QpO1xuICByZXR1cm4geyBob3N0LCBpZnJhbWUsIGNhbmNlbEJ1dHRvbiB9O1xufTtcblxuZnVuY3Rpb24gc3RhcnRQb2xsaW5nKGlmcmFtZSwgb25TdWNjZXNzLCBjaGlsZE9yaWdpbikge1xuICBjb25zdCBoYW5kbGVQb2xsaW5nID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZyhcIvCflIQgUG9sbGluZyBDREUgY29ubmVjdGlvbi4uLlwiKTtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHBpbmdDZGVGb3IzZHNTdGF0dXMoaWZyYW1lLCBjaGlsZE9yaWdpbik7XG4gICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi8J+foiBDREUgY29ubmVjdGlvbiBzdWNjZXNzZnVsISBTdG9wcGluZyBwb2xsaW5nLi4uXCIpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuKeoe+4jyBHb3Qgc3RhdHVzOlwiLCBzdGF0dXMpO1xuICAgICAgICBjbGVhckludGVydmFsKHBvbGxpbmdJbnRlcnZhbCk7XG4gICAgICAgIG9uU3VjY2VzcyhzdGF0dXMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgfVxuICB9O1xuICBoYW5kbGVQb2xsaW5nKCk7XG4gIGNvbnN0IHBvbGxpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKGhhbmRsZVBvbGxpbmcsIENERV9QT0xMSU5HX0lOVEVSVkFMKTtcbiAgcmV0dXJuIHBvbGxpbmdJbnRlcnZhbDtcbn1cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50cyh7XG4gIGVsZW1lbnRzLFxuICBwb2xsaW5nSW50ZXJ2YWwsXG4gIHJlc29sdmVcbn0pIHtcbiAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4ge1xuICAgIGNsZWFySW50ZXJ2YWwocG9sbGluZ0ludGVydmFsKTtcbiAgICBlbGVtZW50cy5ob3N0LnJlbW92ZSgpO1xuICAgIHJlc29sdmUoVGhyZWVEU1N0YXR1cy5DQU5DRUxMRUQpO1xuICB9O1xuICBlbGVtZW50cy5jYW5jZWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNhbmNlbCk7XG4gIGNvbnN0IGNsZWFudXBFdmVudExpc3RlbmVycyA9ICgpID0+IHtcbiAgICBlbGVtZW50cy5jYW5jZWxCdXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNhbmNlbCk7XG4gIH07XG4gIHJldHVybiBjbGVhbnVwRXZlbnRMaXN0ZW5lcnM7XG59XG5hc3luYyBmdW5jdGlvbiBzdGFydDNkc1ZlcmlmaWNhdGlvbih7XG4gIHVybCxcbiAgYmFzZVVybFxufSkge1xuICBjb25zdCBlbGVtZW50cyA9IGNyZWF0ZUFuZE9wZW5GcmFtZSh1cmwpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoc3RhdHVzKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWxlbWVudHMuaG9zdC5yZW1vdmUoKTtcbiAgICAgIH0sIDFlMyk7XG4gICAgICByZXNvbHZlKHN0YXR1cyk7XG4gICAgICBjbGVhbnVwRXZlbnRMaXN0ZW5lcnM/LigpO1xuICAgIH07XG4gICAgY29uc3QgcG9sbGluZ0ludGVydmFsID0gc3RhcnRQb2xsaW5nKGVsZW1lbnRzLmlmcmFtZSwgb25TdWNjZXNzLCBuZXcgVVJMKGJhc2VVcmwpLm9yaWdpbik7XG4gICAgY29uc3QgY2xlYW51cEV2ZW50TGlzdGVuZXJzID0gaGFuZGxlRXZlbnRzKHtcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgcG9sbGluZ0ludGVydmFsLFxuICAgICAgcmVzb2x2ZVxuICAgIH0pO1xuICB9KTtcbn1cblxuY29uc3QgeyBsb2dfXzogbG9nX18kMiwgZXJyX186IGVycl9fJDIgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiY29tbW9uLWNjXCIpO1xuY29uc3QgeyBsb2dfXzogc3RyaXBlTG9nX18gfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwic3RyaXBlLWNjXCIpO1xuY29uc3QgcnVuQ29tbW9uQ2NGbG93ID0gYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMoXG4gIGFzeW5jICh7IGNvbnRleHQsIGNoZWNrb3V0UGF5bWVudE1ldGhvZCwgbm9uQ2RlRm9ybUlucHV0cywgZmxvd0NhbGxiYWNrcyB9KSA9PiB7XG4gICAgbG9nX18kMihg4pScIFJ1bm5pbmcgY29tbW9uIENDIGZsb3cuLi5gLCB7IGNoZWNrb3V0UGF5bWVudE1ldGhvZCB9KTtcbiAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICBsb2dfXyQyKGDilJwgVmFsaWRhdGluZyBub24tQ0RFIGZvcm0gZmllbGRzIFtNb2RlOiAke3ByZWZpbGwubW9kZX1dYCk7XG4gICAgY29uc3Qgbm9uQ2RlRm9ybUZpZWxkcyA9IHZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDKG5vbkNkZUZvcm1JbnB1dHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgIGxvZ19fJDIoYOKUnCBUb2tlbml6aW5nIGNhcmQgaW5mbyBpbiBDREUgW1Nlc3Npb246ICR7Y29udGV4dC5lbGVtZW50c1Nlc3Npb25JZH1dYCk7XG4gICAgY29uc3QgdG9rZW5pemVDYXJkUmVzdWx0cyA9IGF3YWl0IHRva2VuaXplQ2FyZE9uQWxsQ29ubmVjdGlvbnMoY29udGV4dC5jZGVDb25uZWN0aW9ucywge1xuICAgICAgc2Vzc2lvbl9pZDogY29udGV4dC5lbGVtZW50c1Nlc3Npb25JZFxuICAgIH0pO1xuICAgIHZhbGlkYXRlVG9rZW5pemVDYXJkUmVzdWx0cyh0b2tlbml6ZUNhcmRSZXN1bHRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICBjb25zdCBjb21tb25DaGVja291dFBhcmFtcyA9IHtcbiAgICAgIHNlc3Npb25faWQ6IGNvbnRleHQuZWxlbWVudHNTZXNzaW9uSWQsXG4gICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgICAgbm9uX2NkZV9mb3JtX2ZpZWxkczogbm9uQ2RlRm9ybUZpZWxkc1xuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICBsb2dfXyQyKGDilJwgU2V0dGluZyB1cCBwYXltZW50IG1ldGhvZCBpbiBDREUgW1Rva2VuOiAke3ByZWZpbGwudG9rZW59XWApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXR1cENoZWNrb3V0KGFueUNkZUNvbm5lY3Rpb24sIGNvbW1vbkNoZWNrb3V0UGFyYW1zKTtcbiAgICAgICAgbG9nX18kMihg4pWwIFNldHVwIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgW1BNIElEOiAke3Jlc3VsdC5wYXltZW50X21ldGhvZF9pZH1dYCk7XG4gICAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0IH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dfXyQyKGDilJwgSW5pdGlhbCBjaGVja291dCBmbG93LiBDaGVja2luZyBvdXQgY2FyZCBpbmZvIGluIENERSBbU2Vzc2lvbjogJHtjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkfV1gKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2hlY2tvdXRDYXJkRWxlbWVudHMoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICBsb2dfXyQyKGDilbAgQ2hlY2tvdXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5gKTtcbiAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJjaGVja291dFwiLCByZXN1bHQgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ2RlRXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLm9yaWdpbmFsRXJyb3JNZXNzYWdlID09PSBcIjNEU19SRVFVSVJFRFwiKSB7XG4gICAgICAgICAgbG9nX18kMihg4pScIENhcmQgcmVxdWlyZXMgM0RTLCBzdGFydGluZyBub24tbGVnYWN5IHBheW1lbnQgZmxvd2ApO1xuICAgICAgICAgIGxvZ19fJDIoXCJlcnJvci5yZXNwb25zZS5oZWFkZXJzXCIsIGVycm9yLnJlc3BvbnNlLmhlYWRlcnMpO1xuICAgICAgICAgIGNvbnN0IHNob3VsZFVzZU5ld0Zsb3cgPSBlcnJvci5yZXNwb25zZS5oZWFkZXJzPy5bXCJvcC1zaG91bGQtdXNlLW5ldy1mbG93XCJdID09PSBcInRydWVcIjtcbiAgICAgICAgICBjb25zdCBzdGFydFBmUmVzdWx0ID0gYXdhaXQgc3RhcnRQYXltZW50Rmxvd0ZvckNDKGFueUNkZUNvbm5lY3Rpb24sIGNvbW1vbkNoZWNrb3V0UGFyYW1zKTtcbiAgICAgICAgICBsb2dfXyQyKGDilJwgb3Atc2hvdWxkLXVzZS1uZXctZmxvdzogJHtzaG91bGRVc2VOZXdGbG93fWApO1xuICAgICAgICAgIGxvZ19fJDIoYOKUnCBQYXltZW50IGZsb3cgcmVzdWx0OmAsIHN0YXJ0UGZSZXN1bHQpO1xuICAgICAgICAgIGlmIChzaG91bGRVc2VOZXdGbG93KSB7XG4gICAgICAgICAgICBhd2FpdCBjb21tb25DQzNEU0Zsb3coc3RhcnRQZlJlc3VsdCwgY29udGV4dC5iYXNlVXJsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgc3RyaXBlQ0MzRFNGbG93KHN0YXJ0UGZSZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBDb25maXJtaW5nIHBheW1lbnQgZmxvdyBbY2NfcG1faWQ6ICR7c3RhcnRQZlJlc3VsdC5jY19wbV9pZH1dYCk7XG4gICAgICAgICAgICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgY29uZmlybVBheW1lbnRGbG93KGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgICAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuLFxuICAgICAgICAgICAgICBleGlzdGluZ19jY19wbV9pZDogc3RhcnRQZlJlc3VsdC5jY19wbV9pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsb2dfXyQyKGDilJwgQ29uZmlybSBwYXltZW50IGZsb3cgcmVzdWx0IHJlY2VpdmVkIFJlc3VsdDpgLCBjb25maXJtUmVzdWx0KTtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRQYXltZW50TWV0aG9kID0gcGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZShjb25maXJtUmVzdWx0KTtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKVsCBTZXR1cCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IFtQTSBJRDogJHtjcmVhdGVkUGF5bWVudE1ldGhvZC5wYXltZW50X21ldGhvZF9pZH1dYCk7XG4gICAgICAgICAgICByZXR1cm4geyBtb2RlOiBcInNldHVwXCIsIHJlc3VsdDogY3JlYXRlZFBheW1lbnRNZXRob2QgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nX18kMihg4pScIENoZWNraW5nIG91dCBhZnRlciAzRFMgZmxvdyBbRmxvdzogJHtzaG91bGRVc2VOZXdGbG93ID8gXCJuZXdcIiA6IFwibGVnYWN5XCJ9XWApO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2hlY2tvdXRDYXJkRWxlbWVudHMoYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICAgICAgICAuLi5jb21tb25DaGVja291dFBhcmFtcyxcbiAgICAgICAgICAgICAgZXhpc3RpbmdfY2NfcG1faWQ6IHN0YXJ0UGZSZXN1bHQuY2NfcG1faWQsXG4gICAgICAgICAgICAgIGRvX25vdF91c2VfbGVnYWN5X2NjX2Zsb3c6ICFzaG91bGRVc2VOZXdGbG93XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKVsCBDaGVja291dCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LmApO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJjaGVja291dFwiLCByZXN1bHQgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVycl9fJDIoYOKVsCBFcnJvciBjaGVja2luZyBvdXQgY2FyZCBpbmZvIGluIENERWApO1xuICAgICAgZXJyX18kMihlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbik7XG5jb25zdCBwYXJzZVN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YSA9IChyZXNwb25zZSkgPT4ge1xuICBjb25zdCBzdHJpcGVBY3Rpb24gPSByZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24udHlwZSA9PT0gXCJzdHJpcGVfM2RzXCIpO1xuICBpZiAoIXN0cmlwZUFjdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHN0cmlwZSAzRFMgYWN0aW9uIGZvdW5kXCIpO1xuICB9XG4gIHJldHVybiBTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEucGFyc2Uoc3RyaXBlQWN0aW9uKTtcbn07XG5jb25zdCBwYXJzZUNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSA9IChyZXNwb25zZSkgPT4ge1xuICBjb25zdCBjb21tb25BY3Rpb24gPSByZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24udHlwZSA9PT0gXCJhaXJ3YWxsZXhfcGF5bWVudF9jb25zZW50XCIpO1xuICBpZiAoIWNvbW1vbkFjdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbW1vbiAzRFMgYWN0aW9uIGZvdW5kXCIpO1xuICB9XG4gIHJldHVybiBDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEucGFyc2UoY29tbW9uQWN0aW9uKTtcbn07XG5jb25zdCBjb21tb25DQzNEU0Zsb3cgPSBhc3luYyAoc3RhcnRQZlJlc3VsdCwgYmFzZVVybCkgPT4ge1xuICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBwYXJzZUNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YShzdGFydFBmUmVzdWx0KTtcbiAgbG9nX18kMihg4pScIFVzaW5nIGNvbW1vbiAzRFMgZmxvdyBbVVJMOiAke25leHRBY3Rpb25NZXRhZGF0YS5yZWRpcmVjdF91cmx9XWApO1xuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBzdGFydDNkc1ZlcmlmaWNhdGlvbih7IHVybDogbmV4dEFjdGlvbk1ldGFkYXRhLnJlZGlyZWN0X3VybCwgYmFzZVVybCB9KTtcbiAgbG9nX18kMihg4pWwIDNEUyB2ZXJpZmljYXRpb24gY29tcGxldGVkIFtTdGF0dXM6ICR7c3RhdHVzfV1gKTtcbiAgaWYgKHN0YXR1cyA9PT0gVGhyZWVEU1N0YXR1cy5DQU5DRUxMRUQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGNhbmNlbGxlZFwiKTtcbiAgfVxuICBpZiAoc3RhdHVzID09PSBUaHJlZURTU3RhdHVzLkZBSUxVUkUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGZhaWxlZFwiKTtcbiAgfVxufTtcbmNvbnN0IHN0cmlwZUNDM0RTRmxvdyA9IGFzeW5jIChzdGFydFBmUmVzdWx0KSA9PiB7XG4gIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBhcnNlU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhKHN0YXJ0UGZSZXN1bHQpO1xuICBzdHJpcGVMb2dfXyhg4pScIFVzaW5nIHN0cmlwZSAzRFMgZmxvdyBbQ2xpZW50IFNlY3JldDogJHtuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldC5zdWJzdHJpbmcoMCwgOCl9Li4uXWApO1xuICBhd2FpdCBsYXVuY2hTdHJpcGUzRFNEaWFsb2dGbG93KG5leHRBY3Rpb25NZXRhZGF0YSk7XG4gIHN0cmlwZUxvZ19fKFwi4pWwIFN0cmlwZSAzRFMgZmxvdyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XCIpO1xufTtcblxuY29uc3QgeyBsb2dfXzogbG9nX18kMSwgZXJyX186IGVycl9fJDEgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwic3RyaXBlLXByXCIpO1xuY29uc3QgU3RyaXBlUHJDcG0gPSB6Lm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6LnVuaW9uKFt6LmxpdGVyYWwoXCJhcHBsZV9wYXlcIiksIHoubGl0ZXJhbChcImdvb2dsZV9wYXlcIildKSxcbiAgcHJvY2Vzc29yX25hbWU6IHoubGl0ZXJhbChcInN0cmlwZVwiKSxcbiAgbWV0YWRhdGE6IHoub2JqZWN0KHtcbiAgICBzdHJpcGVfcGs6IHouc3RyaW5nKClcbiAgfSlcbn0pO1xuY29uc3QgaW5pdFN0cmlwZVByRmxvdyA9IGFkZEVycm9yQ2F0Y2hlckZvckluaXQoXG4gIGFzeW5jICh7IGNvbnRleHQgfSkgPT4ge1xuICAgIGxvZ19fJDEoYENoZWNraW5nIGlmIHRoZXJlIGFyZSBhbnkgQ1BNcyBmb3IgU3RyaXBlIFBSLi4uYCk7XG4gICAgY29uc3QgY2hlY2tvdXRQYXltZW50TWV0aG9kID0gZmluZENwbU1hdGNoaW5nVHlwZShjb250ZXh0LmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIFN0cmlwZVByQ3BtKTtcbiAgICBsb2dfXyQxKGBJbml0aWFsaXppbmcgU3RyaXBlIFBSIGZsb3cuLi5gKTtcbiAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICBjb25zdCBpc1NldHVwTW9kZSA9IHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiO1xuICAgIGxvZ19fJDEoYEdldHRpbmcgaW5pdGlhbCBwcmV2aWV3IGFtb3VudGApO1xuICAgIGNvbnN0IGluaXRpYWxQcmV2aWV3ID0gYXdhaXQgZ2V0Q2hlY2tvdXRQcmV2aWV3QW1vdW50KGFueUNkZUNvbm5lY3Rpb24sIHByZWZpbGwudG9rZW4sIGlzU2V0dXBNb2RlLCB2b2lkIDApO1xuICAgIGNvbnN0IHByID0gYXdhaXQgY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QoXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2QubWV0YWRhdGEuc3RyaXBlX3BrLFxuICAgICAgaW5pdGlhbFByZXZpZXcuYW1vdW50QXRvbSxcbiAgICAgIGluaXRpYWxQcmV2aWV3LmN1cnJlbmN5LFxuICAgICAgaXNTZXR1cE1vZGVcbiAgICApO1xuICAgIGxvZ19fJDEoYENoZWNraW5nIGlmIGNhbiBtYWtlIHBheW1lbnRgKTtcbiAgICBjb25zdCBjYW5NYWtlUGF5bWVudCA9IGF3YWl0IHByLmNhbk1ha2VQYXltZW50KCk7XG4gICAgaWYgKGNhbk1ha2VQYXltZW50ID09PSBudWxsKSB7XG4gICAgICBlcnJfXyQxKGBjYW5NYWtlUGF5bWVudCByZXR1cm5lZCBudWxsYCk7XG4gICAgICByZXR1cm4geyBpc0F2YWlsYWJsZTogZmFsc2UsIHJlYXNvbjogXCJjYW5NYWtlUGF5bWVudCByZXR1cm5lZCBudWxsXCIgfTtcbiAgICB9XG4gICAgbG9nX18kMShgU3RyaXBlIFBSIGZsb3cgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5LiBDYW4gbWFrZSBwYXltZW50YCwgY2FuTWFrZVBheW1lbnQpO1xuICAgIHJldHVybiB7XG4gICAgICBpc0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIHByLFxuICAgICAgYXZhaWxhYmxlUHJvdmlkZXJzOiB7XG4gICAgICAgIGFwcGxlUGF5OiBjYW5NYWtlUGF5bWVudC5hcHBsZVBheSxcbiAgICAgICAgZ29vZ2xlUGF5OiBjYW5NYWtlUGF5bWVudC5nb29nbGVQYXlcbiAgICAgIH1cbiAgICB9O1xuICB9XG4pO1xuY29uc3QgcnVuU3RyaXBlUHJGbG93ID0gYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMoXG4gIGFzeW5jICh7XG4gICAgY29udGV4dCxcbiAgICBjaGVja291dFBheW1lbnRNZXRob2QsXG4gICAgbm9uQ2RlRm9ybUlucHV0cyxcbiAgICBmbG93Q2FsbGJhY2tzLFxuICAgIGN1c3RvbVBhcmFtcyxcbiAgICBpbml0UmVzdWx0XG4gIH0pID0+IHtcbiAgICBsb2dfXyQxKGBSdW5uaW5nIFN0cmlwZSBQUiBmbG93Li4uYCk7XG4gICAgaWYgKGN1c3RvbVBhcmFtcy5wcm92aWRlciAhPT0gY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3ZpZGVyIG1pc21hdGNoLiBFeHBlY3RlZCAke2N1c3RvbVBhcmFtcy5wcm92aWRlcn0sIGdvdCAke2NoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcn1gKTtcbiAgICB9XG4gICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgY29uc3QgcHIgPSBpbml0UmVzdWx0LnByO1xuICAgIGlmIChjdXN0b21QYXJhbXM/Lm92ZXJyaWRlUGF5bWVudFJlcXVlc3QpIHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gY3VzdG9tUGFyYW1zLm92ZXJyaWRlUGF5bWVudFJlcXVlc3Q7XG4gICAgICBsb2dfXyQxKGBPdmVycmlkaW5nIFBSIGFtb3VudCB3aXRoYCwgb3ZlcnJpZGUpO1xuICAgICAgdXBkYXRlUHJXaXRoQW1vdW50KHByLCBvdmVycmlkZS5hbW91bnQsIG92ZXJyaWRlLnBlbmRpbmcpO1xuICAgIH1cbiAgICBsb2dfXyQxKGBTaG93aW5nIFBSIGRpYWxvZy4uLmApO1xuICAgIHByLnNob3coKTtcbiAgICBjb25zdCBzdHJpcGVQbUFkZGVkRXZlbnQgPSBhd2FpdCB3YWl0Rm9yVXNlclRvQWRkUGF5bWVudE1ldGhvZChwcik7XG4gICAgbG9nX18kMShgU3RyaXBlIFBNIGFkZGVkIGV2ZW50OmAsIHN0cmlwZVBtQWRkZWRFdmVudCk7XG4gICAgbG9nX18kMShgTWVyZ2luZyBQTSBmaWVsZHMgd2l0aCBmb3JtIGZpZWxkcy4uLmApO1xuICAgIGNvbnN0IG1lcmdlZElucHV0cyA9IGZpbGxFbXB0eUZvcm1JbnB1dHNXaXRoU3RyaXBlUG0obm9uQ2RlRm9ybUlucHV0cywgc3RyaXBlUG1BZGRlZEV2ZW50KTtcbiAgICBjb25zdCBub25DZGVGb3JtRmllbGRzID0gdmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0MobWVyZ2VkSW5wdXRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICBsb2dfXyQxKGBQUiBkaWFsb2cgZmluaXNoZWQuIFN0YXJ0aW5nIHBheW1lbnQgZmxvdy4uLmApO1xuICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSA9IGF3YWl0IHN0YXJ0UGF5bWVudEZsb3dGb3JQUihhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICBmaWVsZHM6IG5vbkNkZUZvcm1GaWVsZHMsXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2RcbiAgICB9KTtcbiAgICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhKHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG4gICAgbG9nX18kMShgQ29uZmlybWluZyBQUiB3aXRoIFN0cmlwZS4uLmApO1xuICAgIGF3YWl0IGNvbmZpcm1TdHJpcGVQclBNKG5leHRBY3Rpb25NZXRhZGF0YSwgc3RyaXBlUG1BZGRlZEV2ZW50KTtcbiAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgIGxvZ19fJDEoYENvbmZpcm1pbmcgcGF5bWVudCBmbG93IGZvciBzZXR1cC4uLmApO1xuICAgICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IGNvbmZpcm1QYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlblxuICAgICAgfSk7XG4gICAgICBjb25zdCBjcmVhdGVkUGF5bWVudE1ldGhvZCA9IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UoY29uZmlybVJlc3VsdCk7XG4gICAgICByZXR1cm4geyBtb2RlOiBcInNldHVwXCIsIHJlc3VsdDogY3JlYXRlZFBheW1lbnRNZXRob2QgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nX18kMShgUGVyZm9ybWluZyBjaGVja291dC4uLmApO1xuICAgICAgY29uc3QgY2hlY2tvdXRSZXF1ZXN0ID0ge1xuICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW4sXG4gICAgICAgIHBheW1lbnRfaW5wdXQ6IHtcbiAgICAgICAgICBwcm92aWRlcl90eXBlOiBjaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXJcbiAgICAgICAgfSxcbiAgICAgICAgY3VzdG9tZXJfZW1haWw6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLkVNQUlMXSxcbiAgICAgICAgY3VzdG9tZXJfemlwX2NvZGU6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLlpJUF9DT0RFXSxcbiAgICAgICAgY3VzdG9tZXJfY291bnRyeTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuQ09VTlRSWV0sXG4gICAgICAgIHByb21vdGlvbl9jb2RlOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5QUk9NT1RJT05fQ09ERV0sXG4gICAgICAgIGxpbmVfaXRlbXM6IHByZWZpbGwubGluZV9pdGVtcyxcbiAgICAgICAgdG90YWxfYW1vdW50X2F0b206IHByZWZpbGwuYW1vdW50X3RvdGFsX2F0b20sXG4gICAgICAgIGNhbmNlbF9hdF9lbmQ6IGZhbHNlLFxuICAgICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogY2hlY2tvdXRQYXltZW50TWV0aG9kXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGVyZm9ybUNoZWNrb3V0KGFueUNkZUNvbm5lY3Rpb24sIGNoZWNrb3V0UmVxdWVzdCk7XG4gICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdCB9O1xuICAgIH1cbiAgfVxuKTtcbmNvbnN0IGZpbGxFbXB0eUZvcm1JbnB1dHNXaXRoU3RyaXBlUG0gPSAoZm9ybUlucHV0cywgc3RyaXBlUG1FdnQpID0+IHtcbiAgY29uc3QgaW5wdXRzID0geyAuLi5mb3JtSW5wdXRzIH07XG4gIGNvbnN0IFtwYXllckZpcnN0TmFtZSwgLi4ucGF5ZXJMYXN0TmFtZVBhcnRzXSA9IHN0cmlwZVBtRXZ0LnBheWVyTmFtZT8udHJpbSgpPy5zcGxpdCgvXFxzKy8pID8/IFtdO1xuICBjb25zdCBwYXllckxhc3ROYW1lID0gcGF5ZXJMYXN0TmFtZVBhcnRzLmpvaW4oXCIgXCIpIHx8IHZvaWQgMDtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5GSVJTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuRklSU1RfTkFNRV0gfHwgcGF5ZXJGaXJzdE5hbWUgfHwgXCJfT1BfVU5LTk9XTlwiO1xuICBpbnB1dHNbRmllbGROYW1lLkxBU1RfTkFNRV0gPSBpbnB1dHNbRmllbGROYW1lLkxBU1RfTkFNRV0gfHwgcGF5ZXJMYXN0TmFtZSB8fCBcIl9PUF9VTktOT1dOXCI7XG4gIGlucHV0c1tGaWVsZE5hbWUuRU1BSUxdID0gaW5wdXRzW0ZpZWxkTmFtZS5FTUFJTF0gfHwgc3RyaXBlUG1FdnQucGF5ZXJFbWFpbCB8fCBcIm9wX3VuZmlsbGVkQGdldG9wZW5wYXkuY29tXCI7XG4gIGlucHV0c1tGaWVsZE5hbWUuWklQX0NPREVdID0gaW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gfHwgc3RyaXBlUG1FdnQuc2hpcHBpbmdBZGRyZXNzPy5wb3N0YWxDb2RlIHx8IFwiMDAwMDBcIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5DT1VOVFJZXSA9IGlucHV0c1tGaWVsZE5hbWUuQ09VTlRSWV0gfHwgc3RyaXBlUG1FdnQuc2hpcHBpbmdBZGRyZXNzPy5jb3VudHJ5IHx8IFwiVVNcIjtcbiAgbG9nX18kMShgRmluYWwgZm9ybSBpbnB1dHM6YCwgaW5wdXRzKTtcbiAgcmV0dXJuIGlucHV0cztcbn07XG5jb25zdCB1cGRhdGVQcldpdGhBbW91bnQgPSAocHIsIGFtb3VudCwgaXNQZW5kaW5nKSA9PiB7XG4gIHByLnVwZGF0ZSh7XG4gICAgdG90YWw6IHtcbiAgICAgIGFtb3VudDogYW1vdW50LmFtb3VudEF0b20sXG4gICAgICBsYWJlbDogXCJUb3RhbFwiLFxuICAgICAgcGVuZGluZzogaXNQZW5kaW5nXG4gICAgfSxcbiAgICBjdXJyZW5jeTogYW1vdW50LmN1cnJlbmN5XG4gIH0pO1xufTtcbmNvbnN0IHBhcnNlUFJOZXh0QWN0aW9uTWV0YWRhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgaWYgKHJlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIG9jY3VycmVkLlxuRGV0YWlsczogZ290ICR7cmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmxlbmd0aH0gcmVxdWlyZWQgdXNlciBhY3Rpb25zYCk7XG4gIH1cbiAgcmV0dXJuIFBheW1lbnRSZXF1ZXN0TmV4dEFjdGlvbk1ldGFkYXRhLnBhcnNlKHJlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9uc1swXSk7XG59O1xuXG5jb25zdCBmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0ID0gKGNwbXMsIHdpdGhQcm92aWRlciwgd2l0aFByb2Nlc3NvcikgPT4ge1xuICBjb25zdCBtYXRjaGVzID0gY3Btcy5maWx0ZXIoKGNwbSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoZXNQcm9jZXNzb3IgPSB0cnVlIDtcbiAgICBjb25zdCBtYXRjaGVzUHJvdmlkZXIgPSBjcG0ucHJvdmlkZXIgPT09IHdpdGhQcm92aWRlcjtcbiAgICByZXR1cm4gbWF0Y2hlc1Byb2Nlc3NvciAmJiBtYXRjaGVzUHJvdmlkZXI7XG4gIH0pO1xuICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKFwiQ1BNcyBsaXN0XCIsIGNwbXMpO1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ1BNcyBmb3VuZCB3aXRoIHByb3ZpZGVyICcke3dpdGhQcm92aWRlcn0nIGFuZCBwcm9jZXNzb3IgJyR7d2l0aFByb2Nlc3Nvcn0nYCk7XG4gIH1cbiAgaWYgKG1hdGNoZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkNQTXMgbGlzdFwiLCBjcG1zKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiBvbmUgQ1BNIGZvdW5kIHdpdGggcHJvdmlkZXIgJyR7d2l0aFByb3ZpZGVyfScgYW5kIHByb2Nlc3NvciAnJHt3aXRoUHJvY2Vzc29yfSdgKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlc1swXTtcbn07XG5jb25zdCBPanNGbG93cyA9IHtcbiAgLy8g4pyLIE5vdGU6IEZvciBmbG93cyB0aGF0IHJlcXVpcmUgaW5pdGlhbGl6YXRpb24sIHBsZWFzZSBhZGQgdGhlbSB0byBgaW5pdC1mbG93cy50c2BcbiAgLy8gQ29tbW9uXG4gIGNvbW1vbkNDOiB7XG4gICAgcnVuOiBydW5Db21tb25DY0Zsb3dcbiAgfSxcbiAgLy8gU3RyaXBlXG4gIHN0cmlwZVBSOiB7XG4gICAgaW5pdDogaW5pdFN0cmlwZVByRmxvdyxcbiAgICBydW46IHJ1blN0cmlwZVByRmxvd1xuICB9LFxuICBzdHJpcGVMaW5rOiB7XG4gICAgaW5pdDogaW5pdFN0cmlwZUxpbmtGbG93LFxuICAgIHJ1bjogcnVuU3RyaXBlTGlua0Zsb3dcbiAgfVxuICAvLyDwn5GJIEFkZCBtb3JlIGZsb3dzIGhlcmVcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn07XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzICh4KSB7XG5cdHJldHVybiB4ICYmIHguX19lc01vZHVsZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ2RlZmF1bHQnKSA/IHhbJ2RlZmF1bHQnXSA6IHg7XG59XG5cbnZhciBPYnNlcnZhYmxlJDIgPSB7fTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KE9ic2VydmFibGUkMiwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuT2JzZXJ2YWJsZSQyLk9ic2VydmFibGUgPSB2b2lkIDA7XG5cbi8vID09PSBTeW1ib2wgU3VwcG9ydCA9PT1cbmNvbnN0IGhhc1N5bWJvbCA9IG5hbWUgPT4gQm9vbGVhbihTeW1ib2xbbmFtZV0pO1xuXG5jb25zdCBnZXRTeW1ib2wgPSBuYW1lID0+IGhhc1N5bWJvbChuYW1lKSA/IFN5bWJvbFtuYW1lXSA6ICdAQCcgKyBuYW1lO1xuXG5jb25zdCBTeW1ib2xJdGVyYXRvciA9IGdldFN5bWJvbCgnaXRlcmF0b3InKTtcbmNvbnN0IFN5bWJvbE9ic2VydmFibGUgPSBnZXRTeW1ib2woJ29ic2VydmFibGUnKTtcbmNvbnN0IFN5bWJvbFNwZWNpZXMgPSBnZXRTeW1ib2woJ3NwZWNpZXMnKTsgLy8gPT09IEFic3RyYWN0IE9wZXJhdGlvbnMgPT09XG5cbmZ1bmN0aW9uIGdldE1ldGhvZChvYmosIGtleSkge1xuICBsZXQgdmFsdWUgPSBvYmpba2V5XTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IodmFsdWUgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3BlY2llcyhvYmopIHtcbiAgbGV0IGN0b3IgPSBvYmouY29uc3RydWN0b3I7XG5cbiAgaWYgKGN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGN0b3IgPSBjdG9yW1N5bWJvbFNwZWNpZXNdO1xuXG4gICAgaWYgKGN0b3IgPT09IG51bGwpIHtcbiAgICAgIGN0b3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGN0b3IgIT09IHVuZGVmaW5lZCA/IGN0b3IgOiBPYnNlcnZhYmxlJDE7XG59XG5cbmZ1bmN0aW9uIGlzT2JzZXJ2YWJsZSh4KSB7XG4gIHJldHVybiB4IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSQxOyAvLyBTUEVDOiBCcmFuZCBjaGVja1xufVxuXG5mdW5jdGlvbiBob3N0UmVwb3J0RXJyb3IoZSkge1xuICBpZiAoaG9zdFJlcG9ydEVycm9yLmxvZykge1xuICAgIGhvc3RSZXBvcnRFcnJvci5sb2coZSk7XG4gIH0gZWxzZSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aHJvdyBlO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVucXVldWUoZm4pIHtcbiAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGZuKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB7XG4gIGxldCBjbGVhbnVwID0gc3Vic2NyaXB0aW9uLl9jbGVhbnVwO1xuICBpZiAoY2xlYW51cCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIHN1YnNjcmlwdGlvbi5fY2xlYW51cCA9IHVuZGVmaW5lZDtcblxuICBpZiAoIWNsZWFudXApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdW5zdWJzY3JpYmUgPSBnZXRNZXRob2QoY2xlYW51cCwgJ3Vuc3Vic2NyaWJlJyk7XG5cbiAgICAgIGlmICh1bnN1YnNjcmliZSkge1xuICAgICAgICB1bnN1YnNjcmliZS5jYWxsKGNsZWFudXApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGhvc3RSZXBvcnRFcnJvcihlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgc3Vic2NyaXB0aW9uLl9vYnNlcnZlciA9IHVuZGVmaW5lZDtcbiAgc3Vic2NyaXB0aW9uLl9xdWV1ZSA9IHVuZGVmaW5lZDtcbiAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdjbG9zZWQnO1xufVxuXG5mdW5jdGlvbiBmbHVzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgbGV0IHF1ZXVlID0gc3Vic2NyaXB0aW9uLl9xdWV1ZTtcblxuICBpZiAoIXF1ZXVlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3Vic2NyaXB0aW9uLl9xdWV1ZSA9IHVuZGVmaW5lZDtcbiAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdyZWFkeSc7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgIG5vdGlmeVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24sIHF1ZXVlW2ldLnR5cGUsIHF1ZXVlW2ldLnZhbHVlKTtcbiAgICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vdGlmeVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24sIHR5cGUsIHZhbHVlKSB7XG4gIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncnVubmluZyc7XG4gIGxldCBvYnNlcnZlciA9IHN1YnNjcmlwdGlvbi5fb2JzZXJ2ZXI7XG5cbiAgdHJ5IHtcbiAgICBsZXQgbSA9IGdldE1ldGhvZChvYnNlcnZlciwgdHlwZSk7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ25leHQnOlxuICAgICAgICBpZiAobSkgbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIGlmIChtKSBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtlbHNlIHRocm93IHZhbHVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnY29tcGxldGUnOlxuICAgICAgICBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgICBpZiAobSkgbS5jYWxsKG9ic2VydmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICB9XG5cbiAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7ZWxzZSBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ3J1bm5pbmcnKSBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ3JlYWR5Jztcbn1cblxuZnVuY3Rpb24gb25Ob3RpZnkoc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSkge1xuICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHJldHVybjtcblxuICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2J1ZmZlcmluZycpIHtcbiAgICBzdWJzY3JpcHRpb24uX3F1ZXVlLnB1c2goe1xuICAgICAgdHlwZSxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSAhPT0gJ3JlYWR5Jykge1xuICAgIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAnYnVmZmVyaW5nJztcbiAgICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gW3tcbiAgICAgIHR5cGUsXG4gICAgICB2YWx1ZVxuICAgIH1dO1xuICAgIGVucXVldWUoKCkgPT4gZmx1c2hTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbm90aWZ5U3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgdHlwZSwgdmFsdWUpO1xufVxuXG5jbGFzcyBTdWJzY3JpcHRpb24ge1xuICBjb25zdHJ1Y3RvcihvYnNlcnZlciwgc3Vic2NyaWJlcikge1xuICAgIC8vIEFTU0VSVDogb2JzZXJ2ZXIgaXMgYW4gb2JqZWN0XG4gICAgLy8gQVNTRVJUOiBzdWJzY3JpYmVyIGlzIGNhbGxhYmxlXG4gICAgdGhpcy5fY2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgIHRoaXMuX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3N0YXRlID0gJ2luaXRpYWxpemluZyc7XG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBzdWJzY3JpcHRpb25PYnNlcnZlciA9IHtcbiAgICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiBzZWxmLl9zdGF0ZSA9PT0gJ2Nsb3NlZCc7XG4gICAgICB9LFxuXG4gICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgIG9uTm90aWZ5KHNlbGYsICduZXh0JywgdmFsdWUpO1xuICAgICAgfSxcblxuICAgICAgZXJyb3IodmFsdWUpIHtcbiAgICAgICAgb25Ob3RpZnkoc2VsZiwgJ2Vycm9yJywgdmFsdWUpO1xuICAgICAgfSxcblxuICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgIG9uTm90aWZ5KHNlbGYsICdjb21wbGV0ZScpO1xuICAgICAgfVxuXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9jbGVhbnVwID0gc3Vic2NyaWJlci5jYWxsKHVuZGVmaW5lZCwgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN1YnNjcmlwdGlvbk9ic2VydmVyLmVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gJ2luaXRpYWxpemluZycpIHRoaXMuX3N0YXRlID0gJ3JlYWR5JztcbiAgfVxuXG4gIGdldCBjbG9zZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlID09PSAnY2xvc2VkJztcbiAgfVxuXG4gIHVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gJ2Nsb3NlZCcpIHtcbiAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHRoaXMpO1xuICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbih0aGlzKTtcbiAgICB9XG4gIH1cblxufVxuXG5sZXQgT2JzZXJ2YWJsZSQxID0gY2xhc3MgT2JzZXJ2YWJsZSB7XG4gIGNvbnN0cnVjdG9yKHN1YnNjcmliZXIpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ09ic2VydmFibGUgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uJyk7XG4gICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVyICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdPYnNlcnZhYmxlIGluaXRpYWxpemVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIHRoaXMuX3N1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuICB9XG5cbiAgc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgaWYgKHR5cGVvZiBvYnNlcnZlciAhPT0gJ29iamVjdCcgfHwgb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgIG9ic2VydmVyID0ge1xuICAgICAgICBuZXh0OiBvYnNlcnZlcixcbiAgICAgICAgZXJyb3I6IGFyZ3VtZW50c1sxXSxcbiAgICAgICAgY29tcGxldGU6IGFyZ3VtZW50c1syXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbihvYnNlcnZlciwgdGhpcy5fc3Vic2NyaWJlcik7XG4gIH1cblxuICBmb3JFYWNoKGZuKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJykpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm4odmFsdWUsIGRvbmUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBlcnJvcjogcmVqZWN0LFxuICAgICAgICBjb21wbGV0ZTogcmVzb2x2ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBtYXAoZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gZm4odmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICB9LFxuXG4gICAgICBlcnJvcihlKSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgfSxcblxuICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG5cbiAgICB9KSk7XG4gIH1cblxuICBmaWx0ZXIoZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghZm4odmFsdWUpKSByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0sXG5cbiAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICB9LFxuXG4gICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgIH0pKTtcbiAgfVxuXG4gIHJlZHVjZShmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgIGxldCBoYXNTZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDE7XG4gICAgbGV0IGhhc1ZhbHVlID0gZmFsc2U7XG4gICAgbGV0IHNlZWQgPSBhcmd1bWVudHNbMV07XG4gICAgbGV0IGFjYyA9IHNlZWQ7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgbGV0IGZpcnN0ID0gIWhhc1ZhbHVlO1xuICAgICAgICBoYXNWYWx1ZSA9IHRydWU7XG5cbiAgICAgICAgaWYgKCFmaXJzdCB8fCBoYXNTZWVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFjYyA9IGZuKGFjYywgdmFsdWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICB9LFxuXG4gICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgaWYgKCFoYXNWYWx1ZSAmJiAhaGFzU2VlZCkgcmV0dXJuIG9ic2VydmVyLmVycm9yKG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCByZWR1Y2UgYW4gZW1wdHkgc2VxdWVuY2UnKSk7XG4gICAgICAgIG9ic2VydmVyLm5leHQoYWNjKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIGFsbCgpIHtcbiAgICBsZXQgdmFsdWVzID0gW107XG4gICAgYXdhaXQgdGhpcy5mb3JFYWNoKHZhbHVlID0+IHZhbHVlcy5wdXNoKHZhbHVlKSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIGNvbmNhdCguLi5zb3VyY2VzKSB7XG4gICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICBsZXQgc3Vic2NyaXB0aW9uO1xuICAgICAgbGV0IGluZGV4ID0gMDtcblxuICAgICAgZnVuY3Rpb24gc3RhcnROZXh0KG5leHQpIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uID0gbmV4dC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQodikge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh2KTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSBzb3VyY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGFydE5leHQoQy5mcm9tKHNvdXJjZXNbaW5kZXgrK10pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHN0YXJ0TmV4dCh0aGlzKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBmbGF0TWFwKGZuKSB7XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICBsZXQgb3V0ZXIgPSB0aGlzLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gZm4odmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IGlubmVyID0gQy5mcm9tKHZhbHVlKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICAgICAgbGV0IGkgPSBzdWJzY3JpcHRpb25zLmluZGV4T2YoaW5uZXIpO1xuICAgICAgICAgICAgICBpZiAoaSA+PSAwKSBzdWJzY3JpcHRpb25zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgY29tcGxldGVJZkRvbmUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHN1YnNjcmlwdGlvbnMucHVzaChpbm5lcik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgIGNvbXBsZXRlSWZEb25lKCk7XG4gICAgICAgIH1cblxuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGNvbXBsZXRlSWZEb25lKCkge1xuICAgICAgICBpZiAob3V0ZXIuY2xvc2VkICYmIHN1YnNjcmlwdGlvbnMubGVuZ3RoID09PSAwKSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBzdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICBvdXRlci51bnN1YnNjcmliZSgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIFtTeW1ib2xPYnNlcnZhYmxlXSgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHgpIHtcbiAgICBsZXQgQyA9IHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IE9ic2VydmFibGU7XG4gICAgaWYgKHggPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAgbGV0IG1ldGhvZCA9IGdldE1ldGhvZCh4LCBTeW1ib2xPYnNlcnZhYmxlKTtcblxuICAgIGlmIChtZXRob2QpIHtcbiAgICAgIGxldCBvYnNlcnZhYmxlID0gbWV0aG9kLmNhbGwoeCk7XG4gICAgICBpZiAoT2JqZWN0KG9ic2VydmFibGUpICE9PSBvYnNlcnZhYmxlKSB0aHJvdyBuZXcgVHlwZUVycm9yKG9ic2VydmFibGUgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICAgIGlmIChpc09ic2VydmFibGUob2JzZXJ2YWJsZSkgJiYgb2JzZXJ2YWJsZS5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIG9ic2VydmFibGU7XG4gICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gb2JzZXJ2YWJsZS5zdWJzY3JpYmUob2JzZXJ2ZXIpKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzU3ltYm9sKCdpdGVyYXRvcicpKSB7XG4gICAgICBtZXRob2QgPSBnZXRNZXRob2QoeCwgU3ltYm9sSXRlcmF0b3IpO1xuXG4gICAgICBpZiAobWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICAgICAgZW5xdWV1ZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG5cbiAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgbWV0aG9kLmNhbGwoeCkpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtKTtcbiAgICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgICAgZW5xdWV1ZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHhbaV0pO1xuICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgJyBpcyBub3Qgb2JzZXJ2YWJsZScpO1xuICB9XG5cbiAgc3RhdGljIG9mKC4uLml0ZW1zKSB7XG4gICAgbGV0IEMgPSB0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBPYnNlcnZhYmxlO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW1zW2ldKTtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IFtTeW1ib2xTcGVjaWVzXSgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG59O1xuXG5PYnNlcnZhYmxlJDIuT2JzZXJ2YWJsZSA9IE9ic2VydmFibGUkMTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlJDEsIFN5bWJvbCgnZXh0ZW5zaW9ucycpLCB7XG4gIHZhbHVlOiB7XG4gICAgc3ltYm9sOiBTeW1ib2xPYnNlcnZhYmxlLFxuICAgIGhvc3RSZXBvcnRFcnJvclxuICB9LFxuICBjb25maWd1cmFibGU6IHRydWVcbn0pO1xuXG52YXIgemVuT2JzZXJ2YWJsZSA9IE9ic2VydmFibGUkMi5PYnNlcnZhYmxlO1xuXG5jb25zdCBPYnNlcnZhYmxlID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHplbk9ic2VydmFibGUpO1xuXG5jb25zdCB7IGxvZ19fLCBlcnJfXyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJpbml0LWZsb3dzXCIpO1xuY29uc3QgZ2V0T2pzSW5pdFJlc3VsdHNEZWJ1Z09iamVjdCA9ICgpID0+IHtcbiAgaWYgKCEoXCJvanNfaW5pdF9yZXN1bHRzXCIgaW4gd2luZG93KSkge1xuICAgIHdpbmRvd1tcIm9qc19pbml0X3Jlc3VsdHNcIl0gPSB7fTtcbiAgfVxuICByZXR1cm4gd2luZG93W1wib2pzX2luaXRfcmVzdWx0c1wiXTtcbn07XG5jb25zdCBpbml0aWFsaXplT2pzRmxvd3MgPSAoY29udGV4dCwgZmxvd0NhbGxiYWNrcykgPT4ge1xuICBjb25zdCBpbml0UGFyYW1zID0geyBjb250ZXh0LCBmbG93Q2FsbGJhY2tzIH07XG4gIGNvbnNvbGUubG9nKFwiW09KU10gaW5pdGlhbGl6aW5nIE9KUyBmbG93cy4uLlwiKTtcbiAgcmV0dXJuIHtcbiAgICAvLyBTdHJpcGUgUFJcbiAgICBzdHJpcGVQUjogcnVuSW5pdEZsb3dBc09ic2VydmFibGUoXCJzdHJpcGVQUlwiLCBPanNGbG93cy5zdHJpcGVQUi5pbml0KGluaXRQYXJhbXMpKSxcbiAgICAvLyBTdHJpcGUgTGlua1xuICAgIHN0cmlwZUxpbms6IHJ1bkluaXRGbG93QXNPYnNlcnZhYmxlKFwic3RyaXBlTGlua1wiLCBPanNGbG93cy5zdHJpcGVMaW5rLmluaXQoaW5pdFBhcmFtcykpXG4gICAgLy8g8J+RiSBBZGQgaW5pdGlhbGl6YXRpb24gZmxvd3MgaGVyZVxuICB9O1xufTtcbmNvbnN0IHJ1bkluaXRGbG93QXNPYnNlcnZhYmxlID0gKGZsb3dOYW1lLCBpbml0RmxvdykgPT4ge1xuICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJsb2FkaW5nXCIgfSk7XG4gICAgaW5pdEZsb3cudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImxvYWRlZFwiLCByZXN1bHQgfSk7XG4gICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImVycm9yXCIsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfSk7XG4gIH0pO1xuICBvYnNlcnZhYmxlLnN1YnNjcmliZSh7XG4gICAgbmV4dDogKHJlc3VsdCkgPT4ge1xuICAgICAgbG9nX18oYCR7Zmxvd05hbWV9IGZsb3cgcmVzdWx0YCwgcmVzdWx0KTtcbiAgICAgIGdldE9qc0luaXRSZXN1bHRzRGVidWdPYmplY3QoKVtmbG93TmFtZV0gPSByZXN1bHQ7XG4gICAgfSxcbiAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICBlcnJfXyhgJHtmbG93TmFtZX0gZmxvdyBpbml0aWFsaXphdGlvbiBlcnJvcjpcbiR7SlNPTi5zdHJpbmdpZnkoZXJyb3IpfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG9ic2VydmFibGU7XG59O1xuXG5jb25zdCBQUl9MT0FESU5HID0ge1xuICBpc0xvYWRpbmc6IHRydWUsXG4gIGlzQXZhaWxhYmxlOiBmYWxzZSxcbiAgc3RhcnRGbG93OiBhc3luYyAoKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYHN0YXJ0RmxvdyB0cmlnZ2VyZWQgd2hpbGUgcGF5bWVudCByZXF1ZXN0IGlzIHN0aWxsIG5vdCByZWFkeS4gXG4gICAgICBZb3UgY2FuIGNoZWNrIHRoZSBcIi5pc0xvYWRpbmdcIiBwYXJhbSB0byBrbm93IHdoZW4gYSBwYXltZW50IHJlcXVlc3QgaXMgc3RpbGwgbG9hZGluZywgXG4gICAgICBhbmQgXCIuaXNBdmFpbGFibGVcIiB0byBrbm93IGlmIGEgcGF5bWVudCByZXF1ZXN0IGlzIGF2YWlsYWJsZS5gXG4gICAgKTtcbiAgfVxufTtcbmNvbnN0IFBSX0VSUk9SID0ge1xuICBpc0xvYWRpbmc6IGZhbHNlLFxuICBpc0F2YWlsYWJsZTogZmFsc2UsXG4gIHN0YXJ0RmxvdzogYXN5bmMgKCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoYHN0YXJ0RmxvdyB0cmlnZ2VyZWQgd2hlbiBwYXltZW50IHJlcXVlc3QgaXMgbm90IGF2YWlsYWJsZS5gKTtcbiAgfVxufTtcblxudmFyIHVzZUFzeW5jRWZmZWN0JDIgPSB7ZXhwb3J0czoge319O1xuXG52YXIgUmVhY3QgPSByZXF1aXJlJCQwO1xuXG5mdW5jdGlvbiB1c2VBc3luY0VmZmVjdChlZmZlY3QsIGRlc3Ryb3ksIGlucHV0cykge1xuICB2YXIgaGFzRGVzdHJveSA9IHR5cGVvZiBkZXN0cm95ID09PSAnZnVuY3Rpb24nO1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3VsdDtcbiAgICB2YXIgbW91bnRlZCA9IHRydWU7XG4gICAgdmFyIG1heWJlUHJvbWlzZSA9IGVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbW91bnRlZDtcbiAgICB9KTtcblxuICAgIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBtb3VudGVkID0gZmFsc2U7XG5cbiAgICAgIGlmIChoYXNEZXN0cm95KSB7XG4gICAgICAgIGRlc3Ryb3kocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBoYXNEZXN0cm95ID8gaW5wdXRzIDogZGVzdHJveSk7XG59XG5cbnVzZUFzeW5jRWZmZWN0JDIuZXhwb3J0cyA9IHVzZUFzeW5jRWZmZWN0O1xudXNlQXN5bmNFZmZlY3QkMi5leHBvcnRzLnVzZUFzeW5jRWZmZWN0ID0gdXNlQXN5bmNFZmZlY3Q7XG5cbnZhciB1c2VBc3luY0VmZmVjdEV4cG9ydHMgPSB1c2VBc3luY0VmZmVjdCQyLmV4cG9ydHM7XG5jb25zdCB1c2VBc3luY0VmZmVjdCQxID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHVzZUFzeW5jRWZmZWN0RXhwb3J0cyk7XG5cbmZ1bmN0aW9uIHVzZVRpbWVvdXRGbihmbiwgbXMgPSAwKSB7XG4gIGNvbnN0IHJlYWR5ID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgdGltZW91dCA9IHVzZVJlZigpO1xuICBjb25zdCBjYWxsYmFjayA9IHVzZVJlZihmbik7XG4gIGNvbnN0IGlzUmVhZHkgPSB1c2VDYWxsYmFjaygoKSA9PiByZWFkeS5jdXJyZW50LCBbXSk7XG4gIGNvbnN0IHNldCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICByZWFkeS5jdXJyZW50ID0gZmFsc2U7XG4gICAgdGltZW91dC5jdXJyZW50ICYmIGNsZWFyVGltZW91dCh0aW1lb3V0LmN1cnJlbnQpO1xuICAgIHRpbWVvdXQuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmVhZHkuY3VycmVudCA9IHRydWU7XG4gICAgICBjYWxsYmFjay5jdXJyZW50KCk7XG4gICAgfSwgbXMpO1xuICB9LCBbbXNdKTtcbiAgY29uc3QgY2xlYXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgcmVhZHkuY3VycmVudCA9IG51bGw7XG4gICAgdGltZW91dC5jdXJyZW50ICYmIGNsZWFyVGltZW91dCh0aW1lb3V0LmN1cnJlbnQpO1xuICB9LCBbXSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY2FsbGJhY2suY3VycmVudCA9IGZuO1xuICB9LCBbZm5dKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXQoKTtcbiAgICByZXR1cm4gY2xlYXI7XG4gIH0sIFttc10pO1xuICByZXR1cm4gW2lzUmVhZHksIGNsZWFyLCBzZXRdO1xufVxuXG5mdW5jdGlvbiB1c2VEZWJvdW5jZShmbiwgbXMgPSAwLCBkZXBzID0gW10pIHtcbiAgY29uc3QgW2lzUmVhZHksIGNhbmNlbCwgcmVzZXRdID0gdXNlVGltZW91dEZuKGZuLCBtcyk7XG4gIHVzZUVmZmVjdChyZXNldCwgZGVwcyk7XG4gIHJldHVybiBbaXNSZWFkeSwgY2FuY2VsXTtcbn1cblxuY29uc3QgdXNlRHluYW1pY1ByZXZpZXcgPSAoaXNFbmFibGVkLCBjZGVDb25uLCBzZWN1cmVUb2tlbiwgZm9ybURpdikgPT4ge1xuICBjb25zdCBbcHJvbW9Db2RlSW5wdXQsIHNldFByb21vQ29kZUlucHV0XSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbcHJvbW9Db2RlRGVib3VuY2VkLCBzZXRQcm9tb0NvZGVEZWJvdW5jZWRdID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtwcmV2aWV3QW10LCBzZXRQcmV2aWV3QW10XSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbaXNQcmV2aWV3TG9hZGluZywgc2V0SXNQcmV2aWV3TG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtwcmV2aWV3RXJyb3IsIHNldFByZXZpZXdFcnJvcl0gPSB1c2VTdGF0ZShudWxsKTtcbiAgdXNlQXN5bmNFZmZlY3QkMShhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFmb3JtRGl2IHx8ICFpc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJvbW9Db2RlSW5wdXQyID0gYXdhaXQgd2FpdEZvckZvcm1GaWVsZElucHV0KGZvcm1EaXYsIEZpZWxkTmFtZS5QUk9NT1RJT05fQ09ERSk7XG4gICAgcHJvbW9Db2RlSW5wdXQyPy5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgKCkgPT4ge1xuICAgICAgc2V0SXNQcmV2aWV3TG9hZGluZyh0cnVlKTtcbiAgICAgIHNldFByZXZpZXdFcnJvcihudWxsKTtcbiAgICAgIHNldFByb21vQ29kZUlucHV0KHByb21vQ29kZUlucHV0Mi52YWx1ZSk7XG4gICAgfSk7XG4gIH0sIFshIWZvcm1EaXYsIGlzRW5hYmxlZF0pO1xuICB1c2VEZWJvdW5jZShcbiAgICAoKSA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZXRQcm9tb0NvZGVEZWJvdW5jZWQocHJvbW9Db2RlSW5wdXQpO1xuICAgIH0sXG4gICAgMWUzLFxuICAgIFtwcm9tb0NvZGVJbnB1dCwgaXNFbmFibGVkXVxuICApO1xuICB1c2VBc3luY0VmZmVjdCQxKFxuICAgIGFzeW5jIChpc01vdW50ZWQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghY2RlQ29ubiB8fCAhc2VjdXJlVG9rZW4gfHwgIWlzRW5hYmxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChjZGVDb25uKTtcbiAgICAgICAgY29uc3QgaXNTZXR1cE1vZGUgPSBwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIjtcbiAgICAgICAgY29uc3QgcHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0UHJldmlld0Ftb3VudChjZGVDb25uLCBzZWN1cmVUb2tlbiwgaXNTZXR1cE1vZGUsIHByb21vQ29kZURlYm91bmNlZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW3VzZUR5bmFtaWNQcmV2aWV3XSBRdWVyeWluZy4gUHJvbW8gY29kZTpcIiwgcHJvbW9Db2RlRGVib3VuY2VkKTtcbiAgICAgICAgaWYgKGlzTW91bnRlZCgpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJbdXNlRHluYW1pY1ByZXZpZXddIFNldHRpbmcgcHJldmlldzpcIiwgcHJvbW9Db2RlRGVib3VuY2VkLCBwcmV2aWV3KTtcbiAgICAgICAgICBzZXRQcmV2aWV3RXJyb3IobnVsbCk7XG4gICAgICAgICAgc2V0UHJldmlld0FtdChwcmV2aWV3KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlt1c2VEeW5hbWljUHJldmlld10gRGlzY2FyZGluZzpcIiwgcHJldmlldyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGlzTW91bnRlZCgpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW3VzZUR5bmFtaWNQcmV2aWV3XSBFcnJvciBkb2luZyBwcmV2aWV3YCwgZ2V0RXJyb3JNZXNzYWdlKGUpKTtcbiAgICAgICAgICBzZXRQcmV2aWV3RXJyb3IoZ2V0RXJyb3JNZXNzYWdlKGUpKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGlzTW91bnRlZCgpKSB7XG4gICAgICAgICAgc2V0SXNQcmV2aWV3TG9hZGluZyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFshY2RlQ29ubiwgIXNlY3VyZVRva2VuLCBwcm9tb0NvZGVEZWJvdW5jZWQsIGlzRW5hYmxlZF1cbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBhbW91bnQ6IHByZXZpZXdBbXQsXG4gICAgaXNMb2FkaW5nOiBpc1ByZXZpZXdMb2FkaW5nLFxuICAgIGVycm9yOiBwcmV2aWV3RXJyb3JcbiAgfTtcbn07XG5cbmNvbnN0IHVzZU1hcCA9IChpbml0aWFsTWFwID0ge30pID0+IHtcbiAgY29uc3QgW21hcCwgc2V0XSA9IHVzZVN0YXRlKGluaXRpYWxNYXApO1xuICBjb25zdCBzdGFibGVBY3Rpb25zID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgc2V0OiAoa2V5LCBlbnRyeSkgPT4ge1xuICAgICAgICBzZXQoKHByZXZNYXApID0+ICh7XG4gICAgICAgICAgLi4ucHJldk1hcCxcbiAgICAgICAgICBba2V5XTogZW50cnlcbiAgICAgICAgfSkpO1xuICAgICAgfSxcbiAgICAgIHNldEFsbDogKG5ld01hcCkgPT4ge1xuICAgICAgICBzZXQobmV3TWFwKTtcbiAgICAgIH0sXG4gICAgICByZW1vdmU6IChrZXkpID0+IHtcbiAgICAgICAgc2V0KChwcmV2TWFwKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBba2V5XTogb21pdCwgLi4ucmVzdCB9ID0gcHJldk1hcDtcbiAgICAgICAgICByZXR1cm4gcmVzdDtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcmVzZXQ6ICgpID0+IHNldChpbml0aWFsTWFwKVxuICAgIH0pLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbc2V0XVxuICApO1xuICBjb25zdCB1dGlscyA9IHtcbiAgICBnZXQ6IHVzZUNhbGxiYWNrKChrZXkpID0+IG1hcFtrZXldLCBbbWFwXSksXG4gICAgLi4uc3RhYmxlQWN0aW9uc1xuICB9O1xuICByZXR1cm4gW21hcCwgdXRpbHNdO1xufTtcblxuY29uc3QgdXNlQ2RlQ29ubmVjdGlvbiA9ICgpID0+IHtcbiAgY29uc3QgW251bUNkZUNvbm5zLCBzZXROdW1DZGVDb25uc10gPSB1c2VTdGF0ZSgwKTtcbiAgY29uc3QgW2NkZUNvbm5zLCBjZGVDb25uc1NldHRlcl0gPSB1c2VNYXAoe1xuICAgIGNhcmQ6IHZvaWQgMCxcbiAgICBcImNhcmQtY3ZjXCI6IHZvaWQgMCxcbiAgICBcImNhcmQtZXhwaXJ5XCI6IHZvaWQgMCxcbiAgICBcImNhcmQtbnVtYmVyXCI6IHZvaWQgMFxuICB9KTtcbiAgY29uc3QgYW55Q2RlQ29ubiA9IE9iamVjdC52YWx1ZXMoY2RlQ29ubnMpLmZpbHRlcigoY2RlQ29ubikgPT4gY2RlQ29ubiAhPT0gdm9pZCAwKVswXSA/PyBudWxsO1xuICByZXR1cm4ge1xuICAgIGNkZUNvbm5zLFxuICAgIGFueUNkZUNvbm4sXG4gICAgY29ubmVjdFRvQ2RlSWZyYW1lOiBhc3luYyAoZWxlbWVudFR5cGUsIGlmcmFtZSkgPT4ge1xuICAgICAgY2RlQ29ubnNTZXR0ZXIuc2V0KGVsZW1lbnRUeXBlLCBhd2FpdCBjcmVhdGVDZGVDb25uZWN0aW9uKGlmcmFtZSkpO1xuICAgICAgc2V0TnVtQ2RlQ29ubnMoT2JqZWN0LnZhbHVlcyhjZGVDb25ucykubGVuZ3RoKTtcbiAgICB9LFxuICAgIG51bUNkZUNvbm5zXG4gIH07XG59O1xuY29uc3QgZ2V0RWxlbWVudFR5cGVGcm9tSWZyYW1lSWQgPSAoaWZyYW1lSWQpID0+IHtcbiAgY29uc3QgZWxlbWVudFR5cGUgPSBpZnJhbWVJZC5yZXBsYWNlKFwib2pzLVwiLCBcIlwiKS5yZXBsYWNlKFwiLWVsZW1lbnRcIiwgXCJcIik7XG4gIGNvbnN0IHBhcnNlZCA9IEVsZW1lbnRUeXBlLnNhZmVQYXJzZShlbGVtZW50VHlwZSk7XG4gIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBlbGVtZW50IGlkOiAke2lmcmFtZUlkfSwgaXQgbmVlZHMgdG8gYmUgaW4gdGhlIGZvcm1hdCBcIm9qcy17ZWxlbWVudFR5cGV9LWVsZW1lbnRcIiAoZS5nLiBcIm9qcy1jYXJkLW51bWJlci1lbGVtZW50XCIpYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZC5kYXRhO1xufTtcblxuY29uc3QgRWxlbWVudHNGb3JtID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlbixcbiAgICBjaGVja291dFNlY3VyZVRva2VuLFxuICAgIGNsYXNzTmFtZSxcbiAgICBvbkZvY3VzLFxuICAgIG9uQmx1cixcbiAgICBvbkNoYW5nZSxcbiAgICBvbkxvYWQsXG4gICAgb25Mb2FkRXJyb3IsXG4gICAgb25WYWxpZGF0aW9uRXJyb3IsXG4gICAgb25DaGVja291dFN0YXJ0ZWQsXG4gICAgb25DaGVja291dFN1Y2Nlc3MsXG4gICAgb25DaGVja291dEVycm9yLFxuICAgIG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyxcbiAgICBiYXNlVXJsLFxuICAgIGVuYWJsZUR5bmFtaWNQcmV2aWV3cyxcbiAgICBjdXN0b21Jbml0UGFyYW1zXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgZnJhbWVCYXNlVXJsID0gYmFzZVVybCA/PyBGUkFNRV9CQVNFX1VSTDtcbiAgY29uc3QgW3JlZmVyZXIsIHNldFJlZmVyZXJdID0gdXNlU3RhdGUodm9pZCAwKTtcbiAgY29uc3QgW25vbmNlcywgc2V0Tm9uY2VzXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2Zvcm1IZWlnaHQsIHNldEZvcm1IZWlnaHRdID0gdXNlU3RhdGUoXCIxcHhcIik7XG4gIGNvbnN0IFtsb2FkZWQsIHNldExvYWRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtleHRyYURhdGEsIHNldEV4dHJhRGF0YV0gPSB1c2VTdGF0ZSh2b2lkIDApO1xuICBjb25zdCBbcHJldmVudENsb3NlLCBzZXRQcmV2ZW50Q2xvc2VdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaWZyYW1lcywgc2V0SWZyYW1lc10gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtldmVudFRhcmdldHMsIHNldEV2ZW50VGFyZ2V0c10gPSB1c2VTdGF0ZSh7fSk7XG4gIGNvbnN0IFt0b2tlbml6ZWQsIHNldFRva2VuaXplZF0gPSB1c2VTdGF0ZSgwKTtcbiAgY29uc3QgW2NoZWNrb3V0RmlyZWQsIHNldENoZWNrb3V0RmlyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2Vzc2lvbklkLCBzZXRTZXNzaW9uSWRdID0gdXNlU3RhdGUodm9pZCAwKTtcbiAgY29uc3QgW2N1cnJlbmN5LCBzZXRDdXJyZW5jeV0gPSB1c2VTdGF0ZSh2b2lkIDApO1xuICBjb25zdCBbdG90YWxBbW91bnRBdG9tcywgc2V0VG90YWxBbW91bnRBdG9tc10gPSB1c2VTdGF0ZSh2b2lkIDApO1xuICBjb25zdCBbY2hlY2tvdXRQYXltZW50TWV0aG9kcywgc2V0Q2hlY2tvdXRQYXltZW50TWV0aG9kc10gPSB1c2VTdGF0ZSh2b2lkIDApO1xuICBjb25zdCBbc3RyaXBlUG1dID0gdXNlU3RhdGUodm9pZCAwKTtcbiAgY29uc3QgZm9ybUlkID0gdXNlTWVtbygoKSA9PiBgb3Bqcy1mb3JtLSR7djQoKX1gLCBbXSk7XG4gIGNvbnN0IGZvcm1SZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IHsgY2RlQ29ubnMsIGFueUNkZUNvbm4sIGNvbm5lY3RUb0NkZUlmcmFtZSwgbnVtQ2RlQ29ubnMgfSA9IHVzZUNkZUNvbm5lY3Rpb24oKTtcbiAgY29uc3QgW29qc0Zsb3dzSW5pdGlhbGl6YXRpb24sIHNldE9qc0Zsb3dzSW5pdGlhbGl6YXRpb25dID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtwYXltZW50UmVxdWVzdHMsIHNldFBheW1lbnRSZXF1ZXN0c10gPSB1c2VNYXAoe1xuICAgIGFwcGxlX3BheTogUFJfTE9BRElORyxcbiAgICBnb29nbGVfcGF5OiBQUl9MT0FESU5HXG4gIH0pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9qc192ZXJzaW9uID0geyB2ZXJzaW9uOiBcIjAuMS4xMFwiLCByZWxlYXNlX3ZlcnNpb246IFwiMC4xLjEwXCIgfTtcbiAgICB3aW5kb3dbXCJvanNfdmVyc2lvblwiXSA9IG9qc192ZXJzaW9uO1xuICAgIGNvbnNvbGUubG9nKFwiT0pTIHZlcnNpb246XCIsIG9qc192ZXJzaW9uKTtcbiAgfSwgW10pO1xuICBjb25zdCBkeW5hbWljUHJldmlldyA9IHVzZUR5bmFtaWNQcmV2aWV3KFxuICAgIGVuYWJsZUR5bmFtaWNQcmV2aWV3cyA/PyBmYWxzZSxcbiAgICBhbnlDZGVDb25uLFxuICAgIGNoZWNrb3V0U2VjdXJlVG9rZW4sXG4gICAgZm9ybVJlZi5jdXJyZW50XG4gICk7XG4gIGNvbnN0IG9uTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gZnJhbWVCYXNlVXJsKSByZXR1cm47XG4gICAgICBpZiAoIWV2ZW50LnNvdXJjZSkgcmV0dXJuO1xuICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBldmVudC5zb3VyY2U7XG4gICAgICBpZiAoIWlzSnNvblN0cmluZyhldmVudC5kYXRhKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByYXcgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuICAgICAgY29uc3QgZXZlbnREYXRhID0gcGFyc2VFdmVudFBheWxvYWQocmF3KTtcbiAgICAgIGNvbnN0IGVsZW1lbnRJZCA9IGV2ZW50RGF0YS5lbGVtZW50SWQ7XG4gICAgICBjb25zdCB0YXJnZXRGb3JtSWQgPSBldmVudERhdGEuZm9ybUlkO1xuICAgICAgaWYgKHRhcmdldEZvcm1JZCAhPT0gZm9ybUlkIHx8ICFlbGVtZW50SWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW2Zvcm1dIElnbm9yaW5nIHVua25vd24gZXZlbnQ6XCIsIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudERhdGEubm9uY2UgaW4gbm9uY2VzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltmb3JtXSBJZ25vcmluZyBkdXBsaWNhdGUgZXZlbnQ6XCIsIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNldE5vbmNlcygocHJldk5vbmNlcykgPT4gWy4uLnByZXZOb25jZXMsIGV2ZW50RGF0YS5ub25jZV0pO1xuICAgICAgY29uc3QgZXZlbnRQYXlsb2FkID0gZXZlbnREYXRhLnBheWxvYWQ7XG4gICAgICBjb25zdCBldmVudFR5cGUgPSBldmVudFBheWxvYWQudHlwZTtcbiAgICAgIGNvbnNvbGUubG9nKGBbZm9ybV0gUmVjZWl2ZWQgJHtldmVudFR5cGV9IGV2ZW50IGZyb20gJHtlbGVtZW50SWR9OmAsIGV2ZW50RGF0YS5wYXlsb2FkKTtcbiAgICAgIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLkxBWU9VVCkge1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBldmVudFBheWxvYWQuaGVpZ2h0ID8gYCR7ZXZlbnRQYXlsb2FkLmhlaWdodH1weGAgOiBcIjEwMCVcIjtcbiAgICAgICAgc2V0Rm9ybUhlaWdodChoZWlnaHQpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW2Zvcm1dIEVsZW1lbnQgaGVpZ2h0IHNldCB0bzogJHtoZWlnaHR9YCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uRk9DVVMgJiYgISFvbkZvY3VzKSB7XG4gICAgICAgIG9uRm9jdXMoZXZlbnREYXRhLmVsZW1lbnRJZCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uQkxVUiAmJiAhIW9uQmx1cikge1xuICAgICAgICBvbkJsdXIoZXZlbnREYXRhLmVsZW1lbnRJZCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uQ0hBTkdFICYmICEhb25DaGFuZ2UpIHtcbiAgICAgICAgb25DaGFuZ2UoZXZlbnREYXRhLmVsZW1lbnRJZCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uTE9BREVEKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nSWZyYW1lID0gaWZyYW1lcy5maW5kKChpZnJhbWUpID0+IGlmcmFtZS5jb250ZW50V2luZG93ID09PSBldmVudFNvdXJjZSk7XG4gICAgICAgIHNldFByZXZlbnRDbG9zZShmYWxzZSk7XG4gICAgICAgIGlmICghbWF0Y2hpbmdJZnJhbWUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJbZm9ybV0gSWdub3JpbmcgTE9BREVEIGV2ZW50IGZyb20gdW5yZWdpc3RlcmVkIGlmcmFtZTpcIiwgZXZlbnREYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0RXZlbnRUYXJnZXRzKChwcmV2VGFyZ2V0cykgPT4gKHsgLi4ucHJldlRhcmdldHMsIFtlbGVtZW50SWRdOiBldmVudFNvdXJjZSB9KSk7XG4gICAgICAgIHNldFRvdGFsQW1vdW50QXRvbXMoZXZlbnRQYXlsb2FkLnRvdGFsQW1vdW50QXRvbXMpO1xuICAgICAgICBzZXRDdXJyZW5jeShldmVudFBheWxvYWQuY3VycmVuY3kpO1xuICAgICAgICBzZXRDaGVja291dFBheW1lbnRNZXRob2RzKGV2ZW50UGF5bG9hZC5jaGVja291dFBheW1lbnRNZXRob2RzKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uSWQpIHNldFNlc3Npb25JZChldmVudFBheWxvYWQuc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc29sZS5sb2coYFtmb3JtXSBFbGVtZW50IGxvYWRlZCB3aXRoIHByZWZpbGwgZGF0YTpgLCBldmVudFBheWxvYWQpO1xuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLlRPS0VOSVpFX1NUQVJURUQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gVG9rZW5pemF0aW9uIHN0YXJ0ZWRcIik7XG4gICAgICAgIHNldFByZXZlbnRDbG9zZSh0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5DSEVDS09VVF9TVEFSVEVEKSB7XG4gICAgICAgIGlmIChvbkNoZWNrb3V0U3RhcnRlZCkgb25DaGVja291dFN0YXJ0ZWQoKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5QQVlNRU5UX0ZMT1dfU1RBUlRFRCkge1xuICAgICAgICBpZiAoIWV4dHJhRGF0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZXh0cmFEYXRhIG5vdCBwb3B1bGF0ZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFueUNkZUNvbm4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBjb25uZWN0ZWQgdG8gQ0RFYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29uZmlybVBheW1lbnRGbG93JDEgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV4dEFjdGlvblR5cGUgPSBldmVudFBheWxvYWQubmV4dEFjdGlvbk1ldGFkYXRhW1widHlwZVwiXTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBDb25maXJtIHBheW1lbnQgZmxvdzogbmV4dCBhY3Rpb25zOlwiLCBldmVudFBheWxvYWQubmV4dEFjdGlvbk1ldGFkYXRhKTtcbiAgICAgICAgICBpZiAobmV4dEFjdGlvblR5cGUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gQ29uZmlybWluZyBwYXltZW50IGZsb3cgKE5vLW9wKVwiKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5leHRBY3Rpb25UeXBlID09PSBcInN0cmlwZV8zZHNcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gQ29uZmlybWluZyBwYXltZW50IGZsb3cgKFN0cmlwZSAzRFNcIik7XG4gICAgICAgICAgICBhd2FpdCBjb25maXJtUGF5bWVudEZsb3dGb3IzRFMoZXZlbnRQYXlsb2FkKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5leHRBY3Rpb25UeXBlID09PSBcInN0cmlwZV9wYXltZW50X3JlcXVlc3RcIikge1xuICAgICAgICAgICAgaWYgKCFzdHJpcGVQbSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0cmlwZSBQTSBub3Qgc2V0YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBDb25maXJtaW5nIHBheW1lbnQgZmxvdyAoU3RyaXBlIFBSKVwiKTtcbiAgICAgICAgICAgIGF3YWl0IGNvbmZpcm1QYXltZW50Rmxvd0ZvclN0cmlwZVBSTGVnYWN5KGV2ZW50UGF5bG9hZCwgc3RyaXBlUG0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbmV4dCBhY3Rpb24gdHlwZTogJHtuZXh0QWN0aW9uVHlwZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoYW55Q2RlQ29ubik7XG4gICAgICAgICAgaWYgKHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgICAgICBjb25zdCB7IHBheW1lbnRfbWV0aG9kcyB9ID0gYXdhaXQgY29uZmlybVBheW1lbnRGbG93KGFueUNkZUNvbm4sIHtcbiAgICAgICAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuLFxuICAgICAgICAgICAgICBleGlzdGluZ19jY19wbV9pZDogZXh0cmFEYXRhLmV4aXN0aW5nQ0NQTUlkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChwYXltZW50X21ldGhvZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSBvbmUgcGF5bWVudCBtZXRob2QsIGdvdCAke3BheW1lbnRfbWV0aG9kcy5sZW5ndGh9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBQRiBzZXR1cCBwYXltZW50IG1ldGhvZCBjb21wbGV0ZTpcIiwgcGF5bWVudF9tZXRob2RzKTtcbiAgICAgICAgICAgIHNldFByZXZlbnRDbG9zZShmYWxzZSk7XG4gICAgICAgICAgICBzZXRUb2tlbml6ZWQoMCk7XG4gICAgICAgICAgICBzZXRDaGVja291dEZpcmVkKGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzKHBheW1lbnRfbWV0aG9kc1swXS5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBwcm9jZWVkVG9DaGVja291dDogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHByb2NlZWRUb0NoZWNrb3V0OiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uZmlybVBheW1lbnRGbG93JDEoKS50aGVuKCh7IHByb2NlZWRUb0NoZWNrb3V0IH0pID0+IHtcbiAgICAgICAgICBpZiAoIXByb2NlZWRUb0NoZWNrb3V0KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBOT1QgcHJvY2VlZGluZyB0byBjaGVja291dCBhZnRlciBjb25maXJtYXRpb24uXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBTdGFydGluZyBjaGVja291dCBmcm9tIHBheW1lbnQgZmxvdy5cIik7XG4gICAgICAgICAgbGV0IGV4aXN0aW5nQ0NQTUlkO1xuICAgICAgICAgIGlmIChleHRyYURhdGEuY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyID09PSBcImNyZWRpdF9jYXJkXCIpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nQ0NQTUlkID0gZXZlbnRQYXlsb2FkLnN0YXJ0UEZNZXRhZGF0YT8uY2NfcG1faWQ7XG4gICAgICAgICAgICBpZiAoIWV4aXN0aW5nQ0NQTUlkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ0MgUE0gSUQgbm90IGZvdW5kYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVtaXRFdmVudChcbiAgICAgICAgICAgIGV2ZW50U291cmNlLFxuICAgICAgICAgICAgZm9ybUlkLFxuICAgICAgICAgICAgZWxlbWVudElkLFxuICAgICAgICAgICAgeyAuLi5leHRyYURhdGEsIHR5cGU6IFwiQ0hFQ0tPVVRcIiwgZG9Ob3RVc2VMZWdhY3lDQ0Zsb3c6IHRydWUsIGV4aXN0aW5nQ0NQTUlkIH0sXG4gICAgICAgICAgICBmcmFtZUJhc2VVcmxcbiAgICAgICAgICApO1xuICAgICAgICAgIHNldENoZWNrb3V0RmlyZWQodHJ1ZSk7XG4gICAgICAgICAgc2V0RXh0cmFEYXRhKHZvaWQgMCk7XG4gICAgICAgICAgaWYgKG9uQ2hlY2tvdXRTdGFydGVkKSBvbkNoZWNrb3V0U3RhcnRlZCgpO1xuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIENvbmZpcm1hdGlvbiBwYXltZW50IGZsb3cgZXJyb3JcIik7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICBjb25zdCBlcnJNc2cgPSBnZXRFcnJvck1lc3NhZ2UoZSk7XG4gICAgICAgICAgc2V0UHJldmVudENsb3NlKGZhbHNlKTtcbiAgICAgICAgICBzZXRDaGVja291dEZpcmVkKGZhbHNlKTtcbiAgICAgICAgICBpZiAob25DaGVja291dEVycm9yKSBvbkNoZWNrb3V0RXJyb3IoZXJyTXNnKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uVE9LRU5JWkVfU1VDQ0VTUyAmJiAhIWV4dHJhRGF0YSkge1xuICAgICAgICBjb25zdCB0b3RhbFRva2VuaXplZCA9IHRva2VuaXplZCArIDE7XG4gICAgICAgIGNvbnN0IGFsbFRva2VuaXplZCA9IHRvdGFsVG9rZW5pemVkID09PSBPYmplY3Qua2V5cyhldmVudFRhcmdldHMpLmxlbmd0aDtcbiAgICAgICAgaWYgKCFjaGVja291dEZpcmVkICYmIChhbGxUb2tlbml6ZWQgfHwgZXZlbnRQYXlsb2FkLmlzUmVhZHlGb3JDaGVja291dCkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBUb2tlbml6ZWQgY2FyZCBpcyByZWFkeSBmb3IgY2hlY2tvdXRcIik7XG4gICAgICAgICAgZW1pdEV2ZW50KGV2ZW50U291cmNlLCBmb3JtSWQsIGVsZW1lbnRJZCwgZXh0cmFEYXRhLCBmcmFtZUJhc2VVcmwpO1xuICAgICAgICAgIHNldENoZWNrb3V0RmlyZWQodHJ1ZSk7XG4gICAgICAgICAgc2V0RXh0cmFEYXRhKHZvaWQgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtmb3JtXSBFbGVtZW50ICR7ZWxlbWVudElkfSBmaW5pc2hlZCB0b2tlbml6YXRpb24gYnV0IGNhcmQgbm90IHlldCByZWFkeSBmb3IgY2hlY2tvdXRgKTtcbiAgICAgICAgICBzZXRUb2tlbml6ZWQodG90YWxUb2tlbml6ZWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uQ0hFQ0tPVVRfU1VDQ0VTUykge1xuICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBDaGVja291dCBjb21wbGV0ZTpcIiwgZXZlbnRQYXlsb2FkKTtcbiAgICAgICAgc2V0UHJldmVudENsb3NlKGZhbHNlKTtcbiAgICAgICAgc2V0VG9rZW5pemVkKDApO1xuICAgICAgICBzZXRDaGVja291dEZpcmVkKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uQ2hlY2tvdXRTdWNjZXNzKSB7XG4gICAgICAgICAgb25DaGVja291dFN1Y2Nlc3MoZXZlbnRQYXlsb2FkLmludm9pY2VVcmxzLCBldmVudFBheWxvYWQuc3Vic2NyaXB0aW9uSWRzLCBldmVudFBheWxvYWQuY3VzdG9tZXJJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5TRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIFNldHVwIHBheW1lbnQgbWV0aG9kIGNvbXBsZXRlOlwiLCBldmVudFBheWxvYWQpO1xuICAgICAgICBzZXRQcmV2ZW50Q2xvc2UoZmFsc2UpO1xuICAgICAgICBzZXRUb2tlbml6ZWQoMCk7XG4gICAgICAgIHNldENoZWNrb3V0RmlyZWQoZmFsc2UpO1xuICAgICAgICBpZiAob25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzKSB7XG4gICAgICAgICAgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzKGV2ZW50UGF5bG9hZC5wYXltZW50TWV0aG9kSWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uTE9BRF9FUlJPUikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW2Zvcm1dIEVycm9yIGxvYWRpbmcgaWZyYW1lOlwiLCBldmVudFBheWxvYWQubWVzc2FnZSk7XG4gICAgICAgIGlmIChvbkxvYWRFcnJvcikgb25Mb2FkRXJyb3IoZXZlbnRQYXlsb2FkLm1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLlZBTElEQVRJT05fRVJST1IpIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBleHRyYURhdGE/LmNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcjtcbiAgICAgICAgaWYgKHByb3ZpZGVyID09PSBcImNyZWRpdF9jYXJkXCIgfHwgcHJvdmlkZXIgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtmb3JtXSBWYWxpZGF0aW9uIGVycm9yIGZvciAke2V2ZW50UGF5bG9hZC5lbGVtZW50VHlwZX06YCwgZXZlbnRQYXlsb2FkLmVycm9ycyk7XG4gICAgICAgICAgaWYgKG9uVmFsaWRhdGlvbkVycm9yKSBvblZhbGlkYXRpb25FcnJvcihldmVudFBheWxvYWQuZWxlbWVudFR5cGUsIGV2ZW50UGF5bG9hZC5lcnJvcnMsIGVsZW1lbnRJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5UT0tFTklaRV9FUlJPUiB8fCBldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLkNIRUNLT1VUX0VSUk9SKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbZm9ybV0gQVBJIGVycm9yIGZyb20gZWxlbWVudDpcIiwgZXZlbnRQYXlsb2FkLm1lc3NhZ2UpO1xuICAgICAgICBpZiAoZXZlbnRQYXlsb2FkLm1lc3NhZ2UgPT09IFwiM0RTX1JFUVVJUkVEXCIpIHtcbiAgICAgICAgICBjb25zdCBjYXJkQ3BtID0gY2hlY2tvdXRQYXltZW50TWV0aG9kcz8uZmluZCgoY3BtKSA9PiBjcG0ucHJvdmlkZXIgPT09IFwiY3JlZGl0X2NhcmRcIik7XG4gICAgICAgICAgaWYgKCFzZXNzaW9uSWQgfHwgIWZvcm1SZWYuY3VycmVudCB8fCAhb25WYWxpZGF0aW9uRXJyb3IgfHwgIWNhcmRDcG0pIHJldHVybjtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtlbGVtZW50SWQyLCB0YXJnZXRdIG9mIE9iamVjdC5lbnRyaWVzKGV2ZW50VGFyZ2V0cykpIHtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dFdmVudCA9IGNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZChcbiAgICAgICAgICAgICAgRXZlbnRUeXBlLmVudW0uU1RBUlRfUEFZTUVOVF9GTE9XLFxuICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIGZvcm1SZWYuY3VycmVudCxcbiAgICAgICAgICAgICAgb25WYWxpZGF0aW9uRXJyb3IsXG4gICAgICAgICAgICAgIC8vIE9ubHkgc3RyaXBlIHN1cHBvcnRzIGZyb250ZW5kIDNEUyByaWdodCBub3csXG4gICAgICAgICAgICAgIC8vIHNvIHdlIHBhc3MgcHJvY2Vzc29yX25hbWU6ICdzdHJpcGUnIHRvIHRlbGwgZGVsZWdhdG9yIHRvIG9ubHkgdXNlIHN0cmlwZVxuICAgICAgICAgICAgICB7IC4uLmNhcmRDcG0sIHByb2Nlc3Nvcl9uYW1lOiBcInN0cmlwZVwiIH0sXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFzdGFydFBheW1lbnRGbG93RXZlbnQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2V0Q2hlY2tvdXRGaXJlZCh0cnVlKTtcbiAgICAgICAgICAgIHNldEV4dHJhRGF0YShzdGFydFBheW1lbnRGbG93RXZlbnQpO1xuICAgICAgICAgICAgZW1pdEV2ZW50KHRhcmdldCwgZm9ybUlkLCBlbGVtZW50SWQyLCBzdGFydFBheW1lbnRGbG93RXZlbnQsIGZyYW1lQmFzZVVybCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0UHJldmVudENsb3NlKGZhbHNlKTtcbiAgICAgICAgICBzZXRDaGVja291dEZpcmVkKGZhbHNlKTtcbiAgICAgICAgICBpZiAob25DaGVja291dEVycm9yKSBvbkNoZWNrb3V0RXJyb3IoZXZlbnRQYXlsb2FkLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBmb3JtSWQsXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBub25jZXMsXG4gICAgICBleHRyYURhdGEsXG4gICAgICBpZnJhbWVzLFxuICAgICAgZXZlbnRUYXJnZXRzLFxuICAgICAgdG9rZW5pemVkLFxuICAgICAgY2hlY2tvdXRGaXJlZCxcbiAgICAgIG9uQmx1cixcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIG9uTG9hZEVycm9yLFxuICAgICAgb25DaGVja291dFN0YXJ0ZWQsXG4gICAgICBvbkNoZWNrb3V0U3VjY2VzcyxcbiAgICAgIG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyxcbiAgICAgIG9uQ2hlY2tvdXRFcnJvcixcbiAgICAgIG9uVmFsaWRhdGlvbkVycm9yLFxuICAgICAgZnJhbWVCYXNlVXJsLFxuICAgICAgc3RyaXBlUG0sXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2RzLFxuICAgICAgYW55Q2RlQ29ublxuICAgIF1cbiAgKTtcbiAgY29uc3Qgb2pzRmxvd0NhbGxiYWNrcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IG5vT3AgPSAoKSA9PiB7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgb25DaGVja291dEVycm9yOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dEVycm9yXCIsIG9uQ2hlY2tvdXRFcnJvciA/PyBub09wKSxcbiAgICAgIG9uQ2hlY2tvdXRTdGFydGVkOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dFN0YXJ0ZWRcIiwgb25DaGVja291dFN0YXJ0ZWQgPz8gbm9PcCksXG4gICAgICBvbkNoZWNrb3V0U3VjY2VzczogbWFrZUNhbGxiYWNrU2FmZShcIm9uQ2hlY2tvdXRTdWNjZXNzXCIsIG9uQ2hlY2tvdXRTdWNjZXNzID8/IG5vT3ApLFxuICAgICAgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzXCIsIG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyA/PyBub09wKSxcbiAgICAgIG9uVmFsaWRhdGlvbkVycm9yOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25WYWxpZGF0aW9uRXJyb3JcIiwgb25WYWxpZGF0aW9uRXJyb3IgPz8gbm9PcClcbiAgICB9O1xuICB9LCBbb25DaGVja291dEVycm9yLCBvbkNoZWNrb3V0U3RhcnRlZCwgb25DaGVja291dFN1Y2Nlc3MsIG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2Vzcywgb25WYWxpZGF0aW9uRXJyb3JdKTtcbiAgY29uc3QgZ2VuZXJhdGVPanNGbG93Q29udGV4dCA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhmb3JtUmVmLmN1cnJlbnQsIHNlc3Npb25JZCwgY2hlY2tvdXRQYXltZW50TWV0aG9kcyk7XG4gICAgaWYgKCFmb3JtUmVmLmN1cnJlbnQgfHwgIXNlc3Npb25JZCB8fCAhY2hlY2tvdXRQYXltZW50TWV0aG9kcykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY2RlQ29ubmVjdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIE9iamVjdC5lbnRyaWVzKGNkZUNvbm5zKS5mb3JFYWNoKChbZWxlbWVudFR5cGUsIGNkZUNvbm5dKSA9PiB7XG4gICAgICBpZiAoY2RlQ29ubikge1xuICAgICAgICBjZGVDb25uZWN0aW9ucy5zZXQoZWxlbWVudFR5cGUsIGNkZUNvbm4pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChjZGVDb25uZWN0aW9ucy5zaXplID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltPSlNdIG5vIENERSBjb25uZWN0aW9ucyFcIik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIGZvcm1EaXY6IGZvcm1SZWYuY3VycmVudCxcbiAgICAgIGVsZW1lbnRzU2Vzc2lvbklkOiBzZXNzaW9uSWQsXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2RzLFxuICAgICAgY2RlQ29ubmVjdGlvbnMsXG4gICAgICBjdXN0b21Jbml0UGFyYW1zOiBjdXN0b21Jbml0UGFyYW1zID8/IHt9LFxuICAgICAgYmFzZVVybDogbmV3IFVSTChmcmFtZUJhc2VVcmwpLm9yaWdpblxuICAgIH07XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH07XG4gIGNvbnN0IHN1Ym1pdFBSID0gKHByb3ZpZGVyLCBpbml0UmVzdWx0LCBwYXJhbXMpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gZ2VuZXJhdGVPanNGbG93Q29udGV4dCgpO1xuICAgIGlmICghY29udGV4dCB8fCAhZm9ybVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgcmV0dXJuIE9qc0Zsb3dzLnN0cmlwZVBSLnJ1bih7XG4gICAgICBjb250ZXh0LFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0KGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgcHJvdmlkZXIpLFxuICAgICAgbm9uQ2RlRm9ybUlucHV0czogY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtKGZvcm1SZWYuY3VycmVudCksXG4gICAgICBmbG93Q2FsbGJhY2tzOiBvanNGbG93Q2FsbGJhY2tzLFxuICAgICAgY3VzdG9tUGFyYW1zOiB7IHByb3ZpZGVyLCBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBwYXJhbXM/Lm92ZXJyaWRlUGF5bWVudFJlcXVlc3QgfSxcbiAgICAgIGluaXRSZXN1bHRcbiAgICB9KTtcbiAgfTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAob2pzRmxvd3NJbml0aWFsaXphdGlvbiAhPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnNvbGUubG9nKFwiW09KU10gbnVtQ2RlQ29ubnNcIiwgbnVtQ2RlQ29ubnMsIGNkZUNvbm5zKTtcbiAgICBpZiAobnVtQ2RlQ29ubnMgPT09IDApIHJldHVybjtcbiAgICBjb25zb2xlLmxvZyhcIltPSlNdIEluaXRpYWxpemluZ1wiKTtcbiAgICBjb25zdCBjb250ZXh0ID0gZ2VuZXJhdGVPanNGbG93Q29udGV4dCgpO1xuICAgIGlmICghY29udGV4dCkgcmV0dXJuO1xuICAgIGNvbnNvbGUubG9nKFwiW09KU10gU3RhcnRpbmcgaW5pdFwiKTtcbiAgICBjb25zdCBpbml0aWFsaXphdGlvbiA9IGluaXRpYWxpemVPanNGbG93cyhjb250ZXh0LCBvanNGbG93Q2FsbGJhY2tzKTtcbiAgICBzZXRPanNGbG93c0luaXRpYWxpemF0aW9uKGluaXRpYWxpemF0aW9uKTtcbiAgICBjb25zb2xlLmxvZyhcIltPSlNdIFN1YnNjcmliZVwiKTtcbiAgICBpbml0aWFsaXphdGlvbi5zdHJpcGVQUi5zdWJzY3JpYmUoKHN0YXR1cykgPT4ge1xuICAgICAgY29uc29sZS5sb2coXCJbT0pTXSBzZXRQYXltZW50UmVxdWVzdHNcIiwgc3RhdHVzKTtcbiAgICAgIGlmIChzdGF0dXMuc3RhdHVzID09PSBcImxvYWRpbmdcIikge1xuICAgICAgICBzZXRQYXltZW50UmVxdWVzdHMuc2V0KFwiYXBwbGVfcGF5XCIsIFBSX0xPQURJTkcpO1xuICAgICAgICBzZXRQYXltZW50UmVxdWVzdHMuc2V0KFwiZ29vZ2xlX3BheVwiLCBQUl9MT0FESU5HKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzLnN0YXR1cyA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgIHNldFBheW1lbnRSZXF1ZXN0cy5zZXQoXCJhcHBsZV9wYXlcIiwgUFJfRVJST1IpO1xuICAgICAgICBzZXRQYXltZW50UmVxdWVzdHMuc2V0KFwiZ29vZ2xlX3BheVwiLCBQUl9FUlJPUik7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cy5zdGF0dXMgPT09IFwibG9hZGVkXCIpIHtcbiAgICAgICAgY29uc3QgaW5pdFJlc3VsdCA9IHN0YXR1cy5yZXN1bHQ7XG4gICAgICAgIGNvbnN0IGNhbkFwcGxlUGF5ID0gaW5pdFJlc3VsdC5pc0F2YWlsYWJsZSAmJiBpbml0UmVzdWx0LmF2YWlsYWJsZVByb3ZpZGVycy5hcHBsZVBheTtcbiAgICAgICAgY29uc3QgY2FuR29vZ2xlUGF5ID0gaW5pdFJlc3VsdC5pc0F2YWlsYWJsZSAmJiBpbml0UmVzdWx0LmF2YWlsYWJsZVByb3ZpZGVycy5nb29nbGVQYXk7XG4gICAgICAgIHNldFBheW1lbnRSZXF1ZXN0cy5zZXQoXCJhcHBsZV9wYXlcIiwge1xuICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgaXNBdmFpbGFibGU6IGNhbkFwcGxlUGF5LFxuICAgICAgICAgIHN0YXJ0RmxvdzogYXN5bmMgKHVzZXJQYXJhbXMpID0+IGNhbkFwcGxlUGF5ID8gc3VibWl0UFIoXCJhcHBsZV9wYXlcIiwgaW5pdFJlc3VsdCwgdXNlclBhcmFtcykgOiB2b2lkIDBcbiAgICAgICAgfSk7XG4gICAgICAgIHNldFBheW1lbnRSZXF1ZXN0cy5zZXQoXCJnb29nbGVfcGF5XCIsIHtcbiAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGlzQXZhaWxhYmxlOiBjYW5Hb29nbGVQYXksXG4gICAgICAgICAgc3RhcnRGbG93OiBhc3luYyAodXNlclBhcmFtcykgPT4gY2FuR29vZ2xlUGF5ID8gc3VibWl0UFIoXCJnb29nbGVfcGF5XCIsIGluaXRSZXN1bHQsIHVzZXJQYXJhbXMpIDogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbZm9ybVJlZi5jdXJyZW50LCBzZXNzaW9uSWQsIGNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIG51bUNkZUNvbm5zID09PSAwXSk7XG4gIGNvbnN0IHN1Ym1pdENhcmQgPSAoKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGdlbmVyYXRlT2pzRmxvd0NvbnRleHQoKTtcbiAgICBpZiAoIWZvcm1SZWYuY3VycmVudCB8fCAhc2Vzc2lvbklkIHx8ICFhbnlDZGVDb25uIHx8ICFjaGVja291dFBheW1lbnRNZXRob2RzIHx8ICFjb250ZXh0KSByZXR1cm47XG4gICAgT2pzRmxvd3MuY29tbW9uQ0MucnVuKHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IGZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QoY2hlY2tvdXRQYXltZW50TWV0aG9kcywgXCJjcmVkaXRfY2FyZFwiKSxcbiAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IGNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybShmb3JtUmVmLmN1cnJlbnQpLFxuICAgICAgZmxvd0NhbGxiYWNrczogb2pzRmxvd0NhbGxiYWNrcyxcbiAgICAgIGN1c3RvbVBhcmFtczogdm9pZCAwLFxuICAgICAgLy8gVGhpcyBmbG93IHJlcXVpcmVzIG5vIGN1c3RvbSBwYXJhbXNcbiAgICAgIGluaXRSZXN1bHQ6IHZvaWQgMFxuICAgICAgLy8gVGhpcyBmbG93IHJlcXVpcmVzIG5vIGluaXRpYWxpemF0aW9uXG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IG9uQmVmb3JlVW5sb2FkID0gdXNlQ2FsbGJhY2soXG4gICAgKGUpID0+IHtcbiAgICAgIGlmIChwcmV2ZW50Q2xvc2UpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuICAgIFtwcmV2ZW50Q2xvc2VdXG4gICk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGxvYWRlZCB8fCAhZm9ybVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgY29uc3QgYXJlSWZyYW1lc0xvYWRlZCA9IGlmcmFtZXMubGVuZ3RoID4gMCAmJiBpZnJhbWVzLmxlbmd0aCA9PT0gT2JqZWN0LmtleXMoZXZlbnRUYXJnZXRzKS5sZW5ndGg7XG4gICAgaWYgKGFyZUlmcmFtZXNMb2FkZWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIEFsbCBlbGVtZW50cyBsb2FkZWRcIik7XG4gICAgICBzZXRMb2FkZWQodHJ1ZSk7XG4gICAgICBpZiAob25Mb2FkKSBvbkxvYWQodG90YWxBbW91bnRBdG9tcywgY3VycmVuY3kpO1xuICAgIH1cbiAgfSwgW2lmcmFtZXMsIGV2ZW50VGFyZ2V0cywgbG9hZGVkLCBvbkxvYWQsIHRvdGFsQW1vdW50QXRvbXMsIGN1cnJlbmN5XSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0UmVmZXJlcih3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25NZXNzYWdlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBvbkJlZm9yZVVubG9hZCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIG9uQmVmb3JlVW5sb2FkKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBvbk1lc3NhZ2UpO1xuICAgIH07XG4gIH0sIFtzZXNzaW9uSWQsIG9uTWVzc2FnZSwgb25CZWZvcmVVbmxvYWRdKTtcbiAgY29uc3QgcmVnaXN0ZXJJZnJhbWUgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoaWZyYW1lKSA9PiB7XG4gICAgICBjb25zdCBleGlzdGluZ0lmcmFtZSA9IGlmcmFtZXMuZmluZCgoZXhpc3RpbmdJZnJhbWUyKSA9PiBleGlzdGluZ0lmcmFtZTIuY29udGVudFdpbmRvdyA9PT0gaWZyYW1lLmNvbnRlbnRXaW5kb3cpO1xuICAgICAgY29uc29sZS5sb2coXCJbT0pTXSBDYWxsaW5nIHJlZ2lzdGVyIGlmcmFtZS4gRXhpc3Rpbmc/XCIsIGV4aXN0aW5nSWZyYW1lKTtcbiAgICAgIGlmIChleGlzdGluZ0lmcmFtZSkgcmV0dXJuO1xuICAgICAgc2V0SWZyYW1lcygocHJldklmcmFtZXMpID0+IFsuLi5wcmV2SWZyYW1lcywgaWZyYW1lXSk7XG4gICAgICBjb25zb2xlLmxvZyhcIltPSlNdW2Zvcm1dIFJlZ2lzdGVyaW5nIGlmcmFtZTpcIiwgaWZyYW1lKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGVGcm9tSWZyYW1lSWQoaWZyYW1lLmlkKTtcbiAgICAgIGF3YWl0IGNvbm5lY3RUb0NkZUlmcmFtZShlbGVtZW50VHlwZSwgaWZyYW1lKTtcbiAgICB9LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbaWZyYW1lc11cbiAgKTtcbiAgY29uc3QgdmFsdWUgPSB7XG4gICAgZm9ybUlkLFxuICAgIGZvcm1IZWlnaHQsXG4gICAgcmVmZXJlcixcbiAgICBjaGVja291dFNlY3VyZVRva2VuLFxuICAgIHJlZ2lzdGVySWZyYW1lLFxuICAgIGJhc2VVcmw6IGZyYW1lQmFzZVVybFxuICB9O1xuICBjb25zdCBjaGlsZHJlblByb3BzID0ge1xuICAgIHN1Ym1pdDogc3VibWl0Q2FyZCxcbiAgICBhcHBsZVBheTogcGF5bWVudFJlcXVlc3RzLmFwcGxlX3BheSxcbiAgICBnb29nbGVQYXk6IHBheW1lbnRSZXF1ZXN0cy5nb29nbGVfcGF5LFxuICAgIC8vIHN0cmlwZUxpbms6IHtcbiAgICAvLyBUT0RPOiB1bmNvbW1lbnQgaWYgd2UgbmVlZCBzdHJpcGUgZWxlbWVudHMgbGF0ZXIuXG4gICAgLy8gQmV0dGVyIGlmIHdlIGNhbiBtYWtlIHN0cmlwZSBsaW5rIHdvcmsgaW4gcHJvZCB3aXRob3V0IGVsZW1lbnRzLlxuICAgIC8vIGJ1dHRvbjogc3RyaXBlRWxlbWVudHMuaXNSZWFkeSA/IFN0cmlwZUxpbmtCdXR0b24gOiBOb09wRWxlbWVudCxcbiAgICAvLyBhdXRoRWxlbWVudDogc3RyaXBlRWxlbWVudHMuaXNSZWFkeSA/IFN0cmlwZUxpbmtBdXRoRWxlbWVudCA6IE5vT3BFbGVtZW50LFxuICAgIC8vIHByOiBwYXltZW50UmVxdWVzdHMuc3RyaXBlX2xpbmssXG4gICAgLy8gfSxcbiAgICBsb2FkZWQsXG4gICAgcHJldmlldzogZHluYW1pY1ByZXZpZXdcbiAgfTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goRWxlbWVudHNDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcImRpdlwiLCB7IGNsYXNzTmFtZSwgcmVmOiBmb3JtUmVmLCBjaGlsZHJlbjogY2hpbGRyZW4oY2hpbGRyZW5Qcm9wcykgfSkgfSk7XG59O1xuXG5jb25zdCBFbGVtZW50RnJhbWUgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBzdWJQYXRoLCBzdHlsZXMgfSA9IHByb3BzO1xuICBjb25zdCB7IGZvcm1JZCwgcmVmZXJlciwgZm9ybUhlaWdodCwgY2hlY2tvdXRTZWN1cmVUb2tlbiwgcmVnaXN0ZXJJZnJhbWUsIGJhc2VVcmwgfSA9IHVzZU9wZW5QYXlFbGVtZW50cygpO1xuICBjb25zdCBbaGFzTG9hZGVkLCBzZXRIYXNMb2FkZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBpZnJhbWVSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IGVsZW1lbnRTdHlsZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghc3R5bGVzKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmcoc3R5bGVzKTtcbiAgfSwgW3N0eWxlc10pO1xuICBjb25zdCBmcmFtZVN0eWxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJvcmRlcjogXCJub25lXCIsXG4gICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICBoZWlnaHQ6IGZvcm1IZWlnaHRcbiAgICB9O1xuICB9LCBbZm9ybUhlaWdodF0pO1xuICBjb25zdCBxdWVyeVN0cmluZyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghY2hlY2tvdXRTZWN1cmVUb2tlbiB8fCAhcmVmZXJlcikgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIHBhcmFtcy5hcHBlbmQoXCJyZWZlcmVyXCIsIHJlZmVyZXIpO1xuICAgIHBhcmFtcy5hcHBlbmQoXCJzdHlsZXNcIiwgZWxlbWVudFN0eWxlKTtcbiAgICBwYXJhbXMuYXBwZW5kKFwiZm9ybUlkXCIsIGZvcm1JZCk7XG4gICAgcGFyYW1zLmFwcGVuZChcInNlY3VyZVRva2VuXCIsIGNoZWNrb3V0U2VjdXJlVG9rZW4pO1xuICAgIHJldHVybiBwYXJhbXMudG9TdHJpbmcoKTtcbiAgfSwgW2VsZW1lbnRTdHlsZSwgZm9ybUlkLCByZWZlcmVyLCBjaGVja291dFNlY3VyZVRva2VuXSk7XG4gIHVzZUVmZmVjdCgoKSA9PiBzZXRIYXNMb2FkZWQodHJ1ZSksIFtdKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhcIltPSlNdIGVsZW1lbnQgZnJhbWUgcmVnaXN0ZXIgYXR0ZW1wdFwiLCAhIWlmcmFtZVJlZi5jdXJyZW50LCAhIWhhc0xvYWRlZCk7XG4gICAgaWYgKCFpZnJhbWVSZWYuY3VycmVudCB8fCAhaGFzTG9hZGVkKSByZXR1cm47XG4gICAgcmVnaXN0ZXJJZnJhbWUoaWZyYW1lUmVmLmN1cnJlbnQpO1xuICB9LCBbaGFzTG9hZGVkXSk7XG4gIGlmICghY2hlY2tvdXRTZWN1cmVUb2tlbikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbZm9ybV0gQ2Fubm90IHJlbmRlciBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQgZnJhbWVcIik7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXCJkaXZcIiwge30pO1xuICB9XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgIFwiaWZyYW1lXCIsXG4gICAge1xuICAgICAgaWQ6IGBvanMtJHtzdWJQYXRofS1lbGVtZW50YCxcbiAgICAgIG5hbWU6IGAke3N1YlBhdGh9LWVsZW1lbnRgLFxuICAgICAgY2xhc3NOYW1lOiBcIm9qcy1pZnJhbWVcIixcbiAgICAgIHNyYzogYCR7YmFzZVVybH0vYXBwL3YxLyR7c3ViUGF0aH0tZWxlbWVudC8/JHtxdWVyeVN0cmluZ31gLFxuICAgICAgc3R5bGU6IGZyYW1lU3R5bGUsXG4gICAgICByZWY6IGlmcmFtZVJlZlxuICAgIH1cbiAgKTtcbn07XG5cbmNvbnN0IENhcmRDdmNFbGVtZW50ID0gKHsgc3R5bGVzIH0pID0+IHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goRWxlbWVudEZyYW1lLCB7IHN0eWxlcywgc3ViUGF0aDogXCJjYXJkLWN2Y1wiIH0pO1xufTtcblxuY29uc3QgQ2FyZEVsZW1lbnQgPSAoeyBzdHlsZXMgfSkgPT4ge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChFbGVtZW50RnJhbWUsIHsgc3R5bGVzLCBzdWJQYXRoOiBcImNhcmRcIiB9KTtcbn07XG5cbmNvbnN0IENhcmRFeHBpcnlFbGVtZW50ID0gKHsgc3R5bGVzIH0pID0+IHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goRWxlbWVudEZyYW1lLCB7IHN0eWxlcywgc3ViUGF0aDogXCJjYXJkLWV4cGlyeVwiIH0pO1xufTtcblxuY29uc3QgQ2FyZE51bWJlckVsZW1lbnQgPSAoeyBzdHlsZXMgfSkgPT4ge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChFbGVtZW50RnJhbWUsIHsgc3R5bGVzLCBzdWJQYXRoOiBcImNhcmQtbnVtYmVyXCIgfSk7XG59O1xuXG5leHBvcnQgeyBDYXJkQ3ZjRWxlbWVudCwgQ2FyZEVsZW1lbnQsIENhcmRFeHBpcnlFbGVtZW50LCBDYXJkTnVtYmVyRWxlbWVudCwgRWxlbWVudHNGb3JtLCBGaWVsZE5hbWUsIHVzZU9wZW5QYXlFbGVtZW50cyB9OyJdLAogICJtYXBwaW5ncyI6ICJBQUFBLE9BQU9BLE1BQWMsaUJBQUFDLElBQWUsY0FBQUMsSUFBWSxVQUFBQyxJQUFRLGVBQUFDLEdBQWEsYUFBQUMsR0FBVyxZQUFBQyxHQUFVLFdBQUFDLFVBQWU7QUFDekcsU0FBUyxPQUFBQyxTQUFXO0FBQ3BCLFNBQVMsS0FBQUMsU0FBUztBQUNsQixTQUFTLE1BQUFDLFVBQVU7QUFDbkIsU0FBUyxrQkFBQUMsVUFBc0I7QUFDL0IsT0FBT0MsUUFBVztBQUVsQixNQUFNQyxLQUFrQlosR0FBYztBQUFBLEVBQ3BDLFFBQVE7QUFBQSxFQUNSLFlBQVk7QUFBQSxFQUNaLFNBQVM7QUFBQSxFQUNULHFCQUFxQjtBQUFBLEVBQ3JCLGdCQUFnQixNQUFNO0FBQUEsRUFDdEI7QUFBQSxFQUNBLFNBQVM7QUFDWCxDQUFDLEdBRUthLEtBQXFCLE1BQU07QUFDL0IsUUFBTUMsSUFBVWIsR0FBV1csRUFBZTtBQUMxQyxNQUFJLENBQUNFO0FBQ0gsVUFBTSxJQUFJLE1BQU0sbUVBQW1FO0FBRXJGLFNBQU9BO0FBQ1QsR0FFTUMsS0FBaUIsOEJBRWpCQyxLQUE0QlIsRUFBRSxPQUFPO0FBQUEsRUFDekMsTUFBTUEsRUFBRSxPQUFPO0FBQUEsRUFDZixLQUFLQSxFQUFFLE1BQU1BLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDdkIsS0FBS0EsRUFBRSxPQUFPO0FBQUEs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LENBQUMsRUFBRSxRQUFBbmIsRUFBTyxNQUNYLGdCQUFBeEgsRUFBSWlpQixJQUFjLEVBQUUsUUFBQXphLEdBQVEsU0FBUyxjQUFjLENBQUMsR0FHdkVvYixLQUFvQixDQUFDLEVBQUUsUUFBQXBiLEVBQU8sTUFDWCxnQkFBQXhILEVBQUlpaUIsSUFBYyxFQUFFLFFBQUF6YSxHQUFRLFNBQVMsY0FBYyxDQUFDOyIsCiAgIm5hbWVzIjogWyJyZXF1aXJlJCQwIiwgImNyZWF0ZUNvbnRleHQiLCAidXNlQ29udGV4dCIsICJ1c2VSZWYiLCAidXNlQ2FsbGJhY2siLCAidXNlRWZmZWN0IiwgInVzZVN0YXRlIiwgInVzZU1lbW8iLCAianN4IiwgInoiLCAidjQiLCAiY29ubmVjdFRvQ2hpbGQiLCAiY2hhbGsiLCAiRWxlbWVudHNDb250ZXh0IiwgInVzZU9wZW5QYXlFbGVtZW50cyIsICJjb250ZXh0IiwgIkZSQU1FX0JBU0VfVVJMIiwgIlB5ZGFudGljVmFsaWRhdGlvbkVycm9yJDEiLCAiUHlkYW50aWNWYWxpZGF0aW9uRXJyb3JSZXNwb25zZSIsICJab2RGaWVsZEVycm9yIiwgIlpvZEZpZWxkRXJyb3JzIiwgIk1BUF9UT19IVU1BTl9GUklFTkRMWV9MT1dFUkNBU0UiLCAiZ2V0SHVtYW5GcmllbmRseU1lc3NhZ2UiLCAib2dFcnJvck1lc3NhZ2UiLCAia2V5IiwgImlzU3RyaW5naWZpZWRKc29uT2JqZWN0IiwgInN0ciIsICJjcmVhdGVNZXNzYWdlRnJvbVB5ZGFudGljVmFsaWRhdGlvbkVycm9yIiwgInJlc3BvbnNlIiwgImVyciIsICJjcmVhdGVNZXNzYWdlRnJvbVpvZEZpZWxkRXJyb3JzIiwgImVycm9ycyIsICJnZXRFcnJvck1lc3NhZ2UiLCAib2JqIiwgImUyIiwgIm1ha2VDYWxsYmFja1NhZmUiLCAiY2FsbGJhY2tOYW1lIiwgImZuIiwgImFyZ3MiLCAiZXJyb3IiLCAiUmVxdWlyZWRTdHJpbmciLCAiT3B0aW9uYWxTdHJpbmciLCAibnVsbE9yVW5kZWZPciQxIiwgInpUeXBlIiwgIkZpZWxkTmFtZSIsICJGaWVsZE5hbWUyIiwgIkZpZWxkTmFtZUVudW0iLCAiUHJpdmF0ZUZpZWxkTmFtZSIsICJQcml2YXRlRmllbGROYW1lMiIsICJQcml2YXRlRmllbGROYW1lRW51bSIsICJBbGxGaWVsZE5hbWVzIiwgIkVsZW1lbnRUeXBlRW51bSIsICJFbGVtZW50VHlwZUVudW0yIiwgIkVsZW1lbnRUeXBlIiwgIkNoZWNrb3V0UGF5bWVudE1ldGhvZCQxIiwgIlBheW1lbnRNZXRob2RNaW5pbWFsIiwgIkV2ZW50VHlwZSIsICJHZW5lcmljRXZlbnRUeXBlIiwgIkdlbmVyaWNFdmVudFBheWxvYWQiLCAiSW5wdXRFdmVudFR5cGUiLCAiSW5wdXRFdmVudFBheWxvYWQiLCAiRXJyb3JFdmVudFR5cGUiLCAiRXJyb3JFdmVudFBheWxvYWQiLCAiVmFsaWRhdGlvbkVycm9yRXZlbnRUeXBlIiwgIlZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCIsICJMYXlvdXRFdmVudFBheWxvYWQiLCAiTG9hZGVkRXZlbnRQYXlsb2FkIiwgIlBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCIsICJTZXR1cENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJSZXF1aXJlZEZvcm1GaWVsZHMiLCAiUFJGb3JtRmllbGRzIiwgIlN1Ym1pdEV2ZW50VHlwZSIsICJTdWJtaXRFdmVudFBheWxvYWQiLCAiVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkIiwgIkNoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJFdmVudFBheWxvYWQiLCAiRWxlbWVudEV2ZW50IiwgIkNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlIiwgIkZpZWxkVmFsaWRhdGlvbkVycm9yIiwgIlRva2VuaXplQ2FyZEVycm9yUmVzcG9uc2UiLCAiVG9rZW5pemVDYXJkUmVzcG9uc2UiLCAiVGhyZWVEU1N0YXR1cyIsICJUaHJlZURTU3RhdHVzMiIsICJQaW5nM0RTU3RhdHVzUmVzcG9uc2UiLCAiQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgImV4dHJhY3RJc3N1ZXNQZXJGaWVsZCIsICJpc3N1ZXNQZXJGaWVsZCIsICJ2YWx1ZSIsICJmaWVsZE5hbWUiLCAiU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgIlBheW1lbnRSZXF1ZXN0TmV4dEFjdGlvbk1ldGFkYXRhIiwgIm91ckN1cnJlbmN5VG9UaGVpcnMiLCAiZ2V0TG9hZGVkU3RyaXBlIiwgInB1Ymxpc2hhYmxlS2V5IiwgImkiLCAiaXNTdHJpcGVKc1ByZXNlbnQiLCAic2xlZXAiLCAiY3JlYXRlU3RyaXBlRWxlbWVudHMiLCAic3RyaXBlUHViS2V5IiwgImVsZW1lbnRzT3B0aW9ucyIsICJzdHJpcGUiLCAiY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QiLCAidG90YWxBbW91bnRBdG9tIiwgImN1cnJlbmN5IiwgImlzQW1vdW50UGVuZGluZyIsICJpc0xpbmtPbmx5IiwgInN0cmlwZUN1cnJlbmN5IiwgInRpbWVvdXRNcyIsICJyZXNvbHZlIiwgIndhaXRGb3JVc2VyVG9BZGRQYXltZW50TWV0aG9kIiwgInBheW1lbnRSZXF1ZXN0IiwgInJlamVjdCIsICJldnQiLCAiZSIsICJjb25maXJtUGF5bWVudEZsb3dGb3JTdHJpcGVQUkxlZ2FjeSIsICJwYXlsb2FkIiwgInN0cmlwZVBtIiwgIm5leHRBY3Rpb25NZXRhZGF0YSIsICJjb25maXJtUmVzdWx0IiwgImNvbmZpcm1TdHJpcGVQclBNIiwgImNvbmZpcm1QYXltZW50Rmxvd0ZvcjNEUyIsICJsYXVuY2hTdHJpcGUzRFNEaWFsb2dGbG93IiwgIl9hIiwgIl9iIiwgIl9jIiwgIl9kIiwgInJlc3VsdFN0YXR1cyIsICJjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyIsICJzdHlsZXMiLCAiY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtIiwgImZvcm1EaXYiLCAiaW5pdGlhbERpY3QiLCAiYWNjIiwgImlucHV0IiwgImNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZCIsICJldmVudFR5cGUiLCAic2Vzc2lvbklkIiwgIm9uVmFsaWRhdGlvbkVycm9yIiwgImNoZWNrb3V0UGF5bWVudE1ldGhvZCIsICJkb05vdFVzZUxlZ2FjeUNDRmxvdyIsICJwYXltZW50Rmxvd01ldGFkYXRhIiwgImV4dHJhRGF0YSIsICJmb3JtYXR0ZWQiLCAiaXNzdWVzIiwgInBhcnNlRXZlbnRQYXlsb2FkIiwgImV2ZW50RGF0YSIsICJlbWl0RXZlbnQiLCAidGFyZ2V0IiwgImZvcm1JZCIsICJlbGVtZW50SWQiLCAiYmFzZVVybCIsICJldmVudCIsICJjaGVja0lmVmFsaWRDZGVDb25uZWN0aW9uT2JqZWN0IiwgInBpbmciLCAicmVzdWx0IiwgImlzUmVzdWx0VmFsaWQiLCAiaXNWYWxpZCIsICJjcmVhdGVDZGVDb25uZWN0aW9uIiwgImlmcmFtZSIsICJjb25uZWN0aW9uT2JqIiwgImlzVmFsaWRPYmplY3QiLCAibnVsbE9yVW5kZWZPciIsICJDREVSZXNwb25zZUVycm9yIiwgIkNvdXBvbk1pbmltYWwiLCAiTGluZUl0ZW0iLCAiQnJhbmRTZXR0aW5ncyIsICJCcmFuZCIsICJDaGVja291dFBheW1lbnRNZXRob2QiLCAiU3Vic2NyaXB0aW9uSXRlbU1pbmltYWwiLCAiU3Vic2NyaXB0aW9uTWluaW1hbCIsICJJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwiLCAiSW52b2ljZUxpbmVJdGVtTWluaW1hbCIsICJEaXNjb3VudE1pbmltYWwiLCAiSW52b2ljZU1pbmltYWwiLCAiQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2VNaW5pbWFsIiwgIlByZXZpZXdDaGVja291dFJlc3BvbnNlIiwgIl9QYXltZW50Rm9ybVByZWZpbGxDb21tb24iLCAiUGF5bWVudEZvcm1QcmVmaWxsIiwgIkNvbXBsZXRlZEZvcm1QcmVmaWxsIiwgIkV4cGlyZWRGb3JtUHJlZmlsbCIsICJDaGVja291dFN1Y2Nlc3NSZXNwb25zZSIsICJTZXR1cENoZWNrb3V0UmVzcG9uc2UiLCAiUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IiLCAiU3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlIiwgIlN0YXJ0UGF5bWVudEZsb3dGb3JDQ1Jlc3BvbnNlIiwgInN1bSIsICJhcnIiLCAiYSIsICJiIiwgImZpeFByb3RvIiwgInByb3RvdHlwZSIsICJzZXRQcm90b3R5cGVPZiIsICJmaXhTdGFjayIsICJjYXB0dXJlU3RhY2tUcmFjZSIsICJfX2V4dGVuZHMiLCAiX2V4dGVuZFN0YXRpY3MiLCAiZCIsICJwIiwgIl9fIiwgIkN1c3RvbUVycm9yIiwgIl9zdXBlciIsICJtZXNzYWdlIiwgIm9wdGlvbnMiLCAiX25ld1RhcmdldCIsICJfdGhpcyIsICJDZGVFcnJvciIsICJmcmllbmRseU1lc3NhZ2UiLCAicXVlcnlDREUiLCAiY2RlQ29ubiIsICJkYXRhIiwgInJlc3BvbnNlU2NoZW1hIiwgImlzQ0RFUmVzcG9uc2VFcnJvciIsICJjaGVja0lmQ29uZm9ybXNUb1NjaGVtYSIsICJzY2hlbWEiLCAiZ2V0Q2hlY2tvdXRQcmV2aWV3IiwgInJlcXVlc3QiLCAiZ2V0UHJlZmlsbCIsICJzdGFydFBheW1lbnRGbG93IiwgInN0YXJ0UGF5bWVudEZsb3dGb3JDQyIsICJzdGFydFBheW1lbnRGbG93Rm9yUFIiLCAiY29uZmlybVBheW1lbnRGbG93IiwgIndhaXRGb3JGb3JtRmllbGRJbnB1dCIsICJ3YWl0VGltZU1zIiwgInN0YXJ0V2FpdFRpbWUiLCAibWF0Y2giLCAiZ2V0Q2hlY2tvdXRWYWx1ZSIsICJzZWN1cmVUb2tlbiIsICJwcm9tb0NvZGUiLCAiY2hlY2tvdXRQcmV2aWV3IiwgImN1cnJlbmNpZXMiLCAiaW52IiwgImFtb3VudEF0b20iLCAiZ2V0Q2hlY2tvdXRQcmV2aWV3QW1vdW50IiwgImlzU2V0dXBNb2RlIiwgInRva2VuaXplQ2FyZE9uQWxsQ29ubmVjdGlvbnMiLCAiYWxsQ2RlQ29ubmVjdGlvbnMiLCAiY2hlY2tvdXRDYXJkRWxlbWVudHMiLCAic2V0dXBDaGVja291dCIsICJwZXJmb3JtQ2hlY2tvdXQiLCAiQ0RFX1BPTExJTkdfSU5URVJWQUwiLCAicGluZ0NkZUZvcjNkc1N0YXR1cyIsICJjaGlsZE9yaWdpbiIsICJpc0pzb25TdHJpbmciLCAiYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMiLCAic2ltcGxlT2pzRmxvdyIsICJwYXJhbXMiLCAiZmxvd1Jlc3VsdCIsICJhZGRFcnJvckNhdGNoZXJGb3JJbml0IiwgImluaXQiLCAiZXJyX18iLCAiY3JlYXRlT2pzRmxvd0xvZ2dlcnMiLCAicHJlZml4IiwgImxvZyIsICJsb2dfXyQ1IiwgImVycl9fJDUiLCAicGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSIsICJmaW5kQ3BtTWF0Y2hpbmdUeXBlIiwgImFsbENQTXMiLCAiem9kTW9kZWwiLCAiY3BtIiwgImNwbTIiLCAibG9nX18kNCIsICJlcnJfXyQ0IiwgInZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDIiwgIm5vbkNkZUZvcm1JbnB1dHMiLCAidmFsaWRhdGVUb2tlbml6ZUNhcmRSZXN1bHRzIiwgInRva2VuaXplUmVzdWx0cyIsICJ0b2tlbml6ZVJlc3VsdCIsICJwYXJzZWQiLCAiT0pTX1NUUklQRV9MSU5LX0JUTl9JRCIsICJsb2dfXyQzIiwgImVycl9fJDMiLCAiU3RyaXBlTGlua0NwbSIsICJTdHJpcGVMaW5rUmVxdWlyZWRVc2VyQWN0aW9ucyIsICJpbml0U3RyaXBlTGlua0Zsb3ciLCAiZmxvd0NhbGxiYWNrcyIsICJzdHJpcGVMaW5rQ3BtIiwgImFueUNkZUNvbm5lY3Rpb24iLCAicHJlZmlsbCIsICJpbml0aWFsUHJldmlldyIsICJlbGVtZW50cyIsICJleHByZXNzQ2hlY2tvdXRFbGVtZW50IiwgIk9qc0Zsb3dzIiwgInJ1blN0cmlwZUxpbmtGbG93IiwgImN1c3RvbVBhcmFtcyIsICJtZXJnZWRJbnB1dHMiLCAiZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQTSIsICJub25DZGVGb3JtRmllbGRzIiwgInN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSIsICJvdXJFeGlzdGluZ1BtSWQiLCAiY2hlY2tvdXRSZXF1ZXN0IiwgImZvcm1JbnB1dHMiLCAiX2UiLCAiaW5wdXRzIiwgInBheWVyRmlyc3ROYW1lIiwgInBheWVyTGFzdE5hbWVQYXJ0cyIsICJwYXllckxhc3ROYW1lIiwgImNyZWF0ZUFuZE9wZW5GcmFtZSIsICJ1cmwiLCAidGVtcGxhdGUiLCAiaG9zdCIsICJzaGFkb3dSb290IiwgImNhbmNlbEJ1dHRvbiIsICJzdGFydFBvbGxpbmciLCAib25TdWNjZXNzIiwgImhhbmRsZVBvbGxpbmciLCAic3RhdHVzIiwgInBvbGxpbmdJbnRlcnZhbCIsICJoYW5kbGVFdmVudHMiLCAiaGFuZGxlQ2FuY2VsIiwgInN0YXJ0M2RzVmVyaWZpY2F0aW9uIiwgImNsZWFudXBFdmVudExpc3RlbmVycyIsICJsb2dfXyQyIiwgImVycl9fJDIiLCAic3RyaXBlTG9nX18iLCAicnVuQ29tbW9uQ2NGbG93IiwgInRva2VuaXplQ2FyZFJlc3VsdHMiLCAiY29tbW9uQ2hlY2tvdXRQYXJhbXMiLCAic2hvdWxkVXNlTmV3RmxvdyIsICJzdGFydFBmUmVzdWx0IiwgImNvbW1vbkNDM0RTRmxvdyIsICJzdHJpcGVDQzNEU0Zsb3ciLCAiY3JlYXRlZFBheW1lbnRNZXRob2QiLCAicGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEiLCAic3RyaXBlQWN0aW9uIiwgImFjdGlvbiIsICJwYXJzZUNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJjb21tb25BY3Rpb24iLCAibG9nX18kMSIsICJlcnJfXyQxIiwgIlN0cmlwZVByQ3BtIiwgImluaXRTdHJpcGVQckZsb3ciLCAicHIiLCAiY2FuTWFrZVBheW1lbnQiLCAicnVuU3RyaXBlUHJGbG93IiwgImluaXRSZXN1bHQiLCAib3ZlcnJpZGUiLCAidXBkYXRlUHJXaXRoQW1vdW50IiwgInN0cmlwZVBtQWRkZWRFdmVudCIsICJmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBtIiwgInBhcnNlUFJOZXh0QWN0aW9uTWV0YWRhdGEiLCAic3RyaXBlUG1FdnQiLCAiYW1vdW50IiwgImlzUGVuZGluZyIsICJmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0IiwgImNwbXMiLCAid2l0aFByb3ZpZGVyIiwgIndpdGhQcm9jZXNzb3IiLCAibWF0Y2hlcyIsICJnZXREZWZhdWx0RXhwb3J0RnJvbUNqcyIsICJ4IiwgIk9ic2VydmFibGUkMiIsICJoYXNTeW1ib2wiLCAibmFtZSIsICJnZXRTeW1ib2wiLCAiU3ltYm9sSXRlcmF0b3IiLCAiU3ltYm9sT2JzZXJ2YWJsZSIsICJTeW1ib2xTcGVjaWVzIiwgImdldE1ldGhvZCIsICJnZXRTcGVjaWVzIiwgImN0b3IiLCAiT2JzZXJ2YWJsZSQxIiwgImlzT2JzZXJ2YWJsZSIsICJob3N0UmVwb3J0RXJyb3IiLCAiZW5xdWV1ZSIsICJjbGVhbnVwU3Vic2NyaXB0aW9uIiwgInN1YnNjcmlwdGlvbiIsICJjbGVhbnVwIiwgInVuc3Vic2NyaWJlIiwgImNsb3NlU3Vic2NyaXB0aW9uIiwgImZsdXNoU3Vic2NyaXB0aW9uIiwgInF1ZXVlIiwgIm5vdGlmeVN1YnNjcmlwdGlvbiIsICJ0eXBlIiwgIm9ic2VydmVyIiwgIm0iLCAib25Ob3RpZnkiLCAiU3Vic2NyaXB0aW9uIiwgInN1YnNjcmliZXIiLCAic2VsZiIsICJzdWJzY3JpcHRpb25PYnNlcnZlciIsICJPYnNlcnZhYmxlIiwgImRvbmUiLCAiQyIsICJoYXNTZWVkIiwgImhhc1ZhbHVlIiwgImZpcnN0IiwgInZhbHVlcyIsICJzb3VyY2VzIiwgImluZGV4IiwgInN0YXJ0TmV4dCIsICJuZXh0IiwgInYiLCAic3Vic2NyaXB0aW9ucyIsICJvdXRlciIsICJpbm5lciIsICJjb21wbGV0ZUlmRG9uZSIsICJzIiwgIm1ldGhvZCIsICJvYnNlcnZhYmxlIiwgIml0ZW0iLCAiaXRlbXMiLCAiemVuT2JzZXJ2YWJsZSIsICJsb2dfXyIsICJnZXRPanNJbml0UmVzdWx0c0RlYnVnT2JqZWN0IiwgImluaXRpYWxpemVPanNGbG93cyIsICJpbml0UGFyYW1zIiwgInJ1bkluaXRGbG93QXNPYnNlcnZhYmxlIiwgImZsb3dOYW1lIiwgImluaXRGbG93IiwgIlBSX0xPQURJTkciLCAiUFJfRVJST1IiLCAidXNlQXN5bmNFZmZlY3QkMiIsICJSZWFjdCIsICJ1c2VBc3luY0VmZmVjdCIsICJlZmZlY3QiLCAiZGVzdHJveSIsICJoYXNEZXN0cm95IiwgIm1vdW50ZWQiLCAibWF5YmVQcm9taXNlIiwgInVzZUFzeW5jRWZmZWN0RXhwb3J0cyIsICJ1c2VBc3luY0VmZmVjdCQxIiwgInVzZVRpbWVvdXRGbiIsICJtcyIsICJyZWFkeSIsICJ0aW1lb3V0IiwgImNhbGxiYWNrIiwgImlzUmVhZHkiLCAic2V0IiwgImNsZWFyIiwgInVzZURlYm91bmNlIiwgImRlcHMiLCAiY2FuY2VsIiwgInJlc2V0IiwgInVzZUR5bmFtaWNQcmV2aWV3IiwgImlzRW5hYmxlZCIsICJwcm9tb0NvZGVJbnB1dCIsICJzZXRQcm9tb0NvZGVJbnB1dCIsICJwcm9tb0NvZGVEZWJvdW5jZWQiLCAic2V0UHJvbW9Db2RlRGVib3VuY2VkIiwgInByZXZpZXdBbXQiLCAic2V0UHJldmlld0FtdCIsICJpc1ByZXZpZXdMb2FkaW5nIiwgInNldElzUHJldmlld0xvYWRpbmciLCAicHJldmlld0Vycm9yIiwgInNldFByZXZpZXdFcnJvciIsICJwcm9tb0NvZGVJbnB1dDIiLCAiaXNNb3VudGVkIiwgInByZXZpZXciLCAidXNlTWFwIiwgImluaXRpYWxNYXAiLCAibWFwIiwgInN0YWJsZUFjdGlvbnMiLCAiZW50cnkiLCAicHJldk1hcCIsICJuZXdNYXAiLCAib21pdCIsICJyZXN0IiwgInV0aWxzIiwgInVzZUNkZUNvbm5lY3Rpb24iLCAibnVtQ2RlQ29ubnMiLCAic2V0TnVtQ2RlQ29ubnMiLCAiY2RlQ29ubnMiLCAiY2RlQ29ubnNTZXR0ZXIiLCAiYW55Q2RlQ29ubiIsICJlbGVtZW50VHlwZSIsICJnZXRFbGVtZW50VHlwZUZyb21JZnJhbWVJZCIsICJpZnJhbWVJZCIsICJFbGVtZW50c0Zvcm0iLCAicHJvcHMiLCAiY2hpbGRyZW4iLCAiY2hlY2tvdXRTZWN1cmVUb2tlbiIsICJjbGFzc05hbWUiLCAib25Gb2N1cyIsICJvbkJsdXIiLCAib25DaGFuZ2UiLCAib25Mb2FkIiwgIm9uTG9hZEVycm9yIiwgIm9uQ2hlY2tvdXRTdGFydGVkIiwgIm9uQ2hlY2tvdXRTdWNjZXNzIiwgIm9uQ2hlY2tvdXRFcnJvciIsICJvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MiLCAiZW5hYmxlRHluYW1pY1ByZXZpZXdzIiwgImN1c3RvbUluaXRQYXJhbXMiLCAiZnJhbWVCYXNlVXJsIiwgInJlZmVyZXIiLCAic2V0UmVmZXJlciIsICJub25jZXMiLCAic2V0Tm9uY2VzIiwgImZvcm1IZWlnaHQiLCAic2V0Rm9ybUhlaWdodCIsICJsb2FkZWQiLCAic2V0TG9hZGVkIiwgInNldEV4dHJhRGF0YSIsICJwcmV2ZW50Q2xvc2UiLCAic2V0UHJldmVudENsb3NlIiwgImlmcmFtZXMiLCAic2V0SWZyYW1lcyIsICJldmVudFRhcmdldHMiLCAic2V0RXZlbnRUYXJnZXRzIiwgInRva2VuaXplZCIsICJzZXRUb2tlbml6ZWQiLCAiY2hlY2tvdXRGaXJlZCIsICJzZXRDaGVja291dEZpcmVkIiwgInNldFNlc3Npb25JZCIsICJzZXRDdXJyZW5jeSIsICJ0b3RhbEFtb3VudEF0b21zIiwgInNldFRvdGFsQW1vdW50QXRvbXMiLCAiY2hlY2tvdXRQYXltZW50TWV0aG9kcyIsICJzZXRDaGVja291dFBheW1lbnRNZXRob2RzIiwgImZvcm1SZWYiLCAiY29ubmVjdFRvQ2RlSWZyYW1lIiwgIm9qc0Zsb3dzSW5pdGlhbGl6YXRpb24iLCAic2V0T2pzRmxvd3NJbml0aWFsaXphdGlvbiIsICJwYXltZW50UmVxdWVzdHMiLCAic2V0UGF5bWVudFJlcXVlc3RzIiwgIm9qc192ZXJzaW9uIiwgImR5bmFtaWNQcmV2aWV3IiwgIm9uTWVzc2FnZSIsICJldmVudFNvdXJjZSIsICJyYXciLCAicHJldk5vbmNlcyIsICJldmVudFBheWxvYWQiLCAiaGVpZ2h0IiwgIm1hdGNoaW5nSWZyYW1lIiwgInByZXZUYXJnZXRzIiwgIm5leHRBY3Rpb25UeXBlIiwgInBheW1lbnRfbWV0aG9kcyIsICJwcm9jZWVkVG9DaGVja291dCIsICJleGlzdGluZ0NDUE1JZCIsICJlcnJNc2ciLCAidG90YWxUb2tlbml6ZWQiLCAiYWxsVG9rZW5pemVkIiwgInByb3ZpZGVyIiwgImNhcmRDcG0iLCAiZWxlbWVudElkMiIsICJzdGFydFBheW1lbnRGbG93RXZlbnQiLCAib2pzRmxvd0NhbGxiYWNrcyIsICJub09wIiwgImdlbmVyYXRlT2pzRmxvd0NvbnRleHQiLCAiY2RlQ29ubmVjdGlvbnMiLCAic3VibWl0UFIiLCAiaW5pdGlhbGl6YXRpb24iLCAiY2FuQXBwbGVQYXkiLCAiY2FuR29vZ2xlUGF5IiwgInVzZXJQYXJhbXMiLCAic3VibWl0Q2FyZCIsICJvbkJlZm9yZVVubG9hZCIsICJyZWdpc3RlcklmcmFtZSIsICJleGlzdGluZ0lmcmFtZSIsICJleGlzdGluZ0lmcmFtZTIiLCAicHJldklmcmFtZXMiLCAiY2hpbGRyZW5Qcm9wcyIsICJFbGVtZW50RnJhbWUiLCAic3ViUGF0aCIsICJoYXNMb2FkZWQiLCAic2V0SGFzTG9hZGVkIiwgImlmcmFtZVJlZiIsICJlbGVtZW50U3R5bGUiLCAiZnJhbWVTdHlsZSIsICJxdWVyeVN0cmluZyIsICJDYXJkQ3ZjRWxlbWVudCIsICJDYXJkRWxlbWVudCIsICJDYXJkRXhwaXJ5RWxlbWVudCIsICJDYXJkTnVtYmVyRWxlbWVudCJdCn0K
|