@getopenpay/openpay-js-react 0.1.10 → 0.1.11-alpha.6e4e361

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/index.js CHANGED
@@ -1,10 +1,10 @@
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";
1
+ import fn, { createContext as yn, useContext as _n, useRef as se, useCallback as B, useEffect as J, useState as C, useMemo as ee } from "react";
2
2
  import { jsx as V } from "react/jsx-runtime";
3
3
  import { z as n } from "zod";
4
- import { v4 as dt } from "uuid";
5
- import { connectToChild as mt } from "penpal";
4
+ import { v4 as mt } from "uuid";
5
+ import { connectToChild as pt } from "penpal";
6
6
  import me from "chalk";
7
- const pt = mn({
7
+ const ft = yn({
8
8
  formId: "",
9
9
  formHeight: "",
10
10
  referer: void 0,
@@ -12,40 +12,40 @@ const pt = mn({
12
12
  registerIframe: () => {
13
13
  },
14
14
  baseUrl: ""
15
- }), fn = () => {
16
- const e = pn(pt);
15
+ }), gn = () => {
16
+ const e = _n(ft);
17
17
  if (!e)
18
18
  throw new Error("useOpenPayElements must be used within an OpenPayElementsProvider");
19
19
  return e;
20
- }, yn = "https://cde.getopenpay.com", _n = n.object({
20
+ }, hn = "https://cde.getopenpay.com", wn = 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
- }), gn = n.array(_n), hn = n.object({
25
+ }), En = n.array(wn), Cn = n.object({
26
26
  code: n.string(),
27
27
  message: n.string(),
28
28
  path: n.array(n.string())
29
- }), wn = n.array(hn), En = {
29
+ }), bn = n.array(Cn), Sn = {
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 En[t] ?? e;
34
- }, Cn = (e) => {
33
+ return Sn[t] ?? e;
34
+ }, vn = (e) => {
35
35
  try {
36
36
  return typeof JSON.parse(e) == "object";
37
37
  } catch {
38
38
  return !1;
39
39
  }
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
- ${e.map((r) => `- ${r.path.join("/")}: ${r.message}`).join(`
40
+ }, Pn = (e) => e.length === 1 ? Le(e[0].msg) : `Please fix the following errors:
41
+ ${e.map((o) => `• ${Le(o.msg)}`).join(`
42
+ `)}`, kn = (e) => `Encountered the following errors:
43
+ ${e.map((o) => `- ${o.path.join("/")}: ${o.message}`).join(`
44
44
  `)}`, ie = (e) => {
45
45
  if (e instanceof Error)
46
- if (Cn(e.message)) {
46
+ if (vn(e.message)) {
47
47
  const t = JSON.parse(e.message);
48
- return gn.safeParse(t).success ? bn(t) : wn.safeParse(t).success ? Sn(t) : (console.warn(`Encountered unknown stringified JSON object:
48
+ return En.safeParse(t).success ? Pn(t) : bn.safeParse(t).success ? kn(t) : (console.warn(`Encountered unknown stringified JSON object:
49
49
  ${e.message}`), e.message);
50
50
  } else
51
51
  return Le(e.message);
@@ -57,43 +57,43 @@ ${e.message}`), e.message);
57
57
  }
58
58
  else
59
59
  return e + "";
60
- }, re = (e, t) => (...r) => {
60
+ }, oe = (e, t) => (...o) => {
61
61
  try {
62
- return t(...r);
63
- } catch (o) {
64
- console.error(`[form] Error running callback (${e}):`, o);
62
+ return t(...o);
63
+ } catch (r) {
64
+ console.error(`[form] Error running callback (${e}):`, r);
65
65
  return;
66
66
  }
67
- }, R = n.string().trim().min(1, { message: "Cannot be blank" }), O = n.string().trim().optional(), _e = (e) => n.nullable(e.optional());
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 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({
67
+ }, I = n.string().trim().min(1, { message: "Cannot be blank" }), R = n.string().trim().optional(), _e = (e) => n.nullable(e.optional());
68
+ var y = /* @__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))(y || {});
69
+ const yt = n.nativeEnum(y);
70
+ var _t = /* @__PURE__ */ ((e) => (e.CARD_NUMBER = "cardNumber", e.CARD_EXPIRY = "cardExpiry", e.CARD_CVC = "cardCvc", e))(_t || {});
71
+ const gt = n.nativeEnum(_t), ht = n.union([yt, gt]);
72
+ var wt = /* @__PURE__ */ ((e) => (e.CARD = "card", e.CARD_NUMBER = "card-number", e.CARD_EXPIRY = "card-expiry", e.CARD_CVC = "card-cvc", e))(wt || {});
73
+ const On = n.nativeEnum(wt), 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
- }), vn = n.object({
77
+ }), Rn = n.object({
78
78
  id: n.string()
79
79
  });
80
80
  n.object({
81
- cardNumber: O,
82
- expiry: O,
83
- cvc: O
81
+ cardNumber: R,
82
+ expiry: R,
83
+ cvc: R
84
84
  });
85
85
  n.object({
86
- backgroundColor: O,
87
- color: O,
88
- fontFamily: O,
89
- fontSize: O,
90
- fontWeight: O,
91
- margin: O,
92
- padding: O,
93
- letterSpacing: O,
94
- lineHeight: O
86
+ backgroundColor: R,
87
+ color: R,
88
+ fontFamily: R,
89
+ fontSize: R,
90
+ fontWeight: R,
91
+ margin: R,
92
+ padding: R,
93
+ letterSpacing: R,
94
+ lineHeight: R
95
95
  });
96
- const w = n.enum([
96
+ const E = n.enum([
97
97
  // Element -> Form
98
98
  "LAYOUT",
99
99
  "LOADED",
@@ -114,83 +114,83 @@ const w = n.enum([
114
114
  "TOKENIZE",
115
115
  "CHECKOUT",
116
116
  "START_PAYMENT_FLOW"
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,
117
+ ]), In = E.extract(["TOKENIZE_STARTED", "CHECKOUT_STARTED"]), An = n.object({ type: In }), Tn = E.extract(["BLUR", "FOCUS", "CHANGE"]), Mn = n.object({
118
+ type: Tn,
119
+ elementType: gt,
120
120
  errors: n.array(n.string()).optional()
121
- }), An = w.extract(["LOAD_ERROR", "TOKENIZE_ERROR", "CHECKOUT_ERROR"]), Tn = n.object({
122
- type: An,
123
- message: R,
121
+ }), Dn = E.extract(["LOAD_ERROR", "TOKENIZE_ERROR", "CHECKOUT_ERROR"]), Fn = n.object({
122
+ type: Dn,
123
+ message: I,
124
124
  headers: n.record(n.string(), n.string()).optional()
125
- }), Mn = w.extract(["VALIDATION_ERROR"]), Dn = n.object({
126
- type: Mn,
127
- elementType: gt,
125
+ }), Nn = E.extract(["VALIDATION_ERROR"]), jn = n.object({
126
+ type: Nn,
127
+ elementType: ht,
128
128
  errors: n.array(n.string())
129
- }), Fn = n.object({
130
- type: n.literal(w.enum.LAYOUT),
131
- height: R
132
- }), Nn = n.object({
133
- type: n.literal(w.enum.LOADED),
134
- sessionId: R,
129
+ }), Ln = n.object({
130
+ type: n.literal(E.enum.LAYOUT),
131
+ height: I
132
+ }), xn = n.object({
133
+ type: n.literal(E.enum.LOADED),
134
+ sessionId: I,
135
135
  totalAmountAtoms: n.number(),
136
- currency: O,
136
+ currency: R,
137
137
  checkoutPaymentMethods: n.array(Ee)
138
- }), jn = n.object({
139
- type: n.literal(w.enum.PAYMENT_FLOW_STARTED),
138
+ }), $n = n.object({
139
+ type: n.literal(E.enum.PAYMENT_FLOW_STARTED),
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
- }), Ln = n.object({
144
- type: n.literal(w.enum.SETUP_PAYMENT_METHOD_SUCCESS),
143
+ }), Un = n.object({
144
+ type: n.literal(E.enum.SETUP_PAYMENT_METHOD_SUCCESS),
145
145
  paymentMethodId: n.string()
146
146
  }), ce = n.object({
147
- firstName: R,
148
- lastName: R,
149
- email: R,
150
- zipCode: R,
151
- country: R,
152
- promotionCode: O
153
- }), xn = n.object({
154
- email: R,
155
- zipCode: R,
156
- country: R,
157
- promotionCode: O
158
- }), $n = w.extract(["TOKENIZE", "CHECKOUT", "START_PAYMENT_FLOW"]), wt = n.object({
159
- type: $n,
160
- sessionId: R,
147
+ firstName: I,
148
+ lastName: I,
149
+ email: I,
150
+ zipCode: I,
151
+ country: I,
152
+ promotionCode: R
153
+ }), qn = n.object({
154
+ email: I,
155
+ zipCode: I,
156
+ country: I,
157
+ promotionCode: R
158
+ }), zn = E.extract(["TOKENIZE", "CHECKOUT", "START_PAYMENT_FLOW"]), Et = n.object({
159
+ type: zn,
160
+ sessionId: I,
161
161
  checkoutPaymentMethod: Ee,
162
162
  paymentFlowMetadata: n.any().optional(),
163
163
  doNotUseLegacyCCFlow: n.boolean().optional(),
164
- existingCCPMId: O
165
- }).extend(ce.shape), Un = n.object({
166
- type: n.literal(w.enum.TOKENIZE_SUCCESS),
164
+ existingCCPMId: R
165
+ }).extend(ce.shape), Jn = n.object({
166
+ type: n.literal(E.enum.TOKENIZE_SUCCESS),
167
167
  isReadyForCheckout: n.boolean()
168
- }), qn = n.object({
169
- type: n.literal(w.enum.CHECKOUT_SUCCESS),
168
+ }), Hn = n.object({
169
+ type: n.literal(E.enum.CHECKOUT_SUCCESS),
170
170
  invoiceUrls: n.array(n.string()),
171
171
  subscriptionIds: n.array(n.string()),
172
172
  customerId: n.string()
173
- }), zn = n.discriminatedUnion("type", [
174
- On,
175
- In,
176
- Tn,
177
- Dn,
173
+ }), Vn = n.discriminatedUnion("type", [
174
+ An,
175
+ Mn,
178
176
  Fn,
179
- Nn,
180
- wt,
181
- Un,
182
- qn,
183
177
  jn,
184
- Ln
185
- ]), Jn = n.object({
186
- payload: zn,
187
- nonce: R,
188
- formId: R,
189
- elementId: R
178
+ Ln,
179
+ xn,
180
+ Et,
181
+ Jn,
182
+ Hn,
183
+ $n,
184
+ Un
185
+ ]), Kn = n.object({
186
+ payload: Vn,
187
+ nonce: I,
188
+ formId: I,
189
+ elementId: I
190
190
  });
191
191
  n.object({
192
192
  amountAtom: n.number(),
193
- currency: R
193
+ currency: I
194
194
  });
195
195
  n.object({
196
196
  secure_token: n.string(),
@@ -200,22 +200,22 @@ n.object({
200
200
  secure_token: n.string(),
201
201
  existing_cc_pm_id: _e(n.string())
202
202
  });
203
- const Hn = n.object({
204
- payment_methods: n.array(vn)
205
- }), Vn = n.object({
203
+ const Yn = n.object({
204
+ payment_methods: n.array(Rn)
205
+ }), Zn = n.object({
206
206
  elementType: n.string(),
207
207
  errors: n.array(n.string())
208
208
  });
209
209
  n.object({
210
210
  session_id: n.string()
211
211
  });
212
- const Kn = n.object({
212
+ const Bn = n.object({
213
213
  success: n.literal(!1),
214
214
  error_type: n.literal("validation_error"),
215
- errors: n.array(Vn)
216
- }), Yn = n.discriminatedUnion("success", [
215
+ errors: n.array(Zn)
216
+ }), Wn = n.discriminatedUnion("success", [
217
217
  n.object({ success: n.literal(!0) }),
218
- Kn
218
+ Bn
219
219
  ]);
220
220
  n.object({
221
221
  session_id: n.string(),
@@ -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 Zn = n.object({
233
+ const Gn = n.object({
234
234
  status: n.enum([
235
235
  "success",
236
236
  "failure",
237
237
  "cancelled"
238
238
  /* CANCELLED */
239
239
  ])
240
- }), Wn = n.object({
240
+ }), Qn = 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
- }), Et = (e) => {
245
+ }), Ct = (e) => {
246
246
  const t = {};
247
- return Object.entries(e).forEach(([r, o]) => {
247
+ return Object.entries(e).forEach(([o, r]) => {
248
248
  try {
249
- const s = ft.parse(r);
250
- Array.isArray(o) ? t[s] = o : Array.isArray(o._errors) && (t[s] = o._errors);
249
+ const s = yt.parse(o);
250
+ Array.isArray(r) ? t[s] = r : Array.isArray(r._errors) && (t[s] = r._errors);
251
251
  } catch {
252
252
  return;
253
253
  }
254
254
  }), t;
255
- }, Ct = n.object({
255
+ }, bt = n.object({
256
256
  stripe_pk: n.string(),
257
257
  client_secret: n.string(),
258
258
  stripe_pm_id: n.string()
259
- }), Bn = n.object({
259
+ }), Xn = n.object({
260
260
  type: n.string(),
261
261
  client_secret: n.string(),
262
262
  stripe_pk: n.string()
263
- }), Gn = {
263
+ }), eo = {
264
264
  usd: "usd",
265
265
  brl: "brl"
266
266
  }, le = async (e) => {
267
- for (let r = 0; r < 10; r++)
268
- tt() || await bt(500);
267
+ for (let o = 0; o < 10; o++)
268
+ tt() || await St(500);
269
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
- }, Qn = async (e, t) => {
273
- const r = await le(e);
272
+ }, to = async (e, t) => {
273
+ const o = await le(e);
274
274
  return {
275
- elements: r.elements(t),
276
- stripe: r
275
+ elements: o.elements(t),
276
+ stripe: o
277
277
  };
278
- }, Xn = async (e, t, r, o, s) => {
278
+ }, no = async (e, t, o, r, s) => {
279
279
  console.log(s);
280
- const i = await le(e), a = Gn[r.toLowerCase().trim()];
280
+ const i = await le(e), a = eo[o.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",
@@ -285,118 +285,118 @@ const Zn = n.object({
285
285
  total: {
286
286
  label: "Total",
287
287
  amount: t,
288
- pending: o
288
+ pending: r
289
289
  },
290
290
  requestPayerName: !0,
291
291
  requestPayerEmail: !0,
292
292
  disableWallets: []
293
293
  });
294
- }, bt = (e) => new Promise((t) => {
294
+ }, St = (e) => new Promise((t) => {
295
295
  setTimeout(t, e);
296
- }), tt = () => "Stripe" in window, er = async (e) => new Promise((t, r) => {
296
+ }), tt = () => "Stripe" in window, oo = async (e) => new Promise((t, o) => {
297
297
  try {
298
- e.on("paymentmethod", async (o) => {
299
- t(o);
298
+ e.on("paymentmethod", async (r) => {
299
+ t(r);
300
300
  }), e.on("cancel", () => {
301
- r(new Error("Payment cancelled, please click Submit again to pay"));
301
+ o(new Error("Payment cancelled, please click Submit again to pay"));
302
302
  });
303
- } catch (o) {
304
- r(o);
303
+ } catch (r) {
304
+ o(r);
305
305
  }
306
- }), tr = async (e, t) => {
307
- const r = e.nextActionMetadata;
306
+ }), ro = async (e, t) => {
307
+ const o = e.nextActionMetadata;
308
308
  if (!e.paymentFlowMetadata || !e.paymentFlowMetadata.stripePmId)
309
309
  throw new Error(`Invalid payment flow metadata format: ${JSON.stringify(e.paymentFlowMetadata)}`);
310
- if (!r.stripe_pk || !r.client_secret)
311
- throw new Error(`Invalid next action metadata format: ${JSON.stringify(r)}`);
310
+ if (!o.stripe_pk || !o.client_secret)
311
+ throw new Error(`Invalid next action metadata format: ${JSON.stringify(o)}`);
312
312
  if (t.paymentMethod.id !== e.paymentFlowMetadata.stripePmId)
313
313
  throw new Error(`PM ID mismatch: ${t.paymentMethod.id} != ${e.paymentFlowMetadata.stripePmId}`);
314
- const s = await (await le(r.stripe_pk)).confirmCardSetup(r.client_secret, {
314
+ const s = await (await le(o.stripe_pk)).confirmCardSetup(o.client_secret, {
315
315
  payment_method: e.paymentFlowMetadata.stripePmId
316
316
  });
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
- }, nr = async (e, t) => {
320
+ }, so = 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
- const o = await (await le(e.stripe_pk)).confirmCardSetup(e.client_secret, {
323
+ const r = await (await le(e.stripe_pk)).confirmCardSetup(e.client_secret, {
324
324
  payment_method: t.paymentMethod.id
325
325
  });
326
- if (o.error)
327
- throw t.complete("fail"), new Error(`Payment failed: ${o.error.message ?? "unknown"}`);
328
- return t.complete("success"), o;
329
- }, rr = async (e) => {
330
- const t = Ct.parse(e.nextActionMetadata);
331
- await St(t);
332
- }, St = async (e) => {
326
+ if (r.error)
327
+ throw t.complete("fail"), new Error(`Payment failed: ${r.error.message ?? "unknown"}`);
328
+ return t.complete("success"), r;
329
+ }, io = async (e) => {
330
+ const t = bt.parse(e.nextActionMetadata);
331
+ await vt(t);
332
+ }, vt = async (e) => {
333
333
  var s, i, a, c;
334
- const r = await (await le(e.stripe_pk)).confirmCardSetup(e.client_secret, {
334
+ const o = await (await le(e.stripe_pk)).confirmCardSetup(e.client_secret, {
335
335
  payment_method: e.stripe_pm_id
336
- }), o = (s = r.setupIntent) == null ? void 0 : s.status;
337
- if (o === "succeeded")
338
- console.log("[3DS] CONFIRMING PM:", e.stripe_pm_id), console.log("[3DS] Setup intent created:", r.setupIntent);
339
- else throw o === "canceled" ? new Error("Payment cancelled, please click Submit again to pay") : new Error(
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."}`
336
+ }), r = (s = o.setupIntent) == null ? void 0 : s.status;
337
+ if (r === "succeeded")
338
+ console.log("[3DS] CONFIRMING PM:", e.stripe_pm_id), console.log("[3DS] Setup intent created:", o.setupIntent);
339
+ else throw r === "canceled" ? new Error("Payment cancelled, please click Submit again to pay") : new Error(
340
+ `${((i = o.error) == null ? void 0 : i.message) ?? ((c = (a = o.setupIntent) == null ? void 0 : a.last_setup_error) == null ? void 0 : c.message) ?? "Payment failed, please click submit again to pay."}`
341
341
  );
342
- }, or = (e) => JSON.stringify(e), he = (e, t) => Array.from(e.querySelectorAll("[data-opid]") ?? []).reduce((s, i) => {
342
+ }, ao = (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 ?? {}), sr = (e, t, r, o, s, i, a) => {
346
- const c = he(r, {
345
+ }, t ?? {}), co = (e, t, o, r, s, i, a) => {
346
+ const c = he(o, {
347
347
  type: e,
348
348
  sessionId: t,
349
349
  checkoutPaymentMethod: s,
350
350
  paymentFlowMetadata: a,
351
351
  doNotUseLegacyCCFlow: i
352
352
  });
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 = wt.safeParse(c);
353
+ console.log(`[form] Constructing ${e} payload:`, JSON.stringify(c)), (s.provider === "apple_pay" || s.provider === "google_pay" || s.provider === "stripe_link") && (c[y.ZIP_CODE] || (console.log("[form] Overriding empty zip code (only for google pay, apple pay, and stripe link)"), c[y.ZIP_CODE] = "00000"));
354
+ const l = Et.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 = Et(u);
359
- for (const [f, m] of Object.entries(d))
360
- o(f, m, f);
358
+ const d = l.error.format(), u = Ct(d);
359
+ for (const [_, w] of Object.entries(u))
360
+ r(_, w, _);
361
361
  return console.log("[form] Constructed payload in FAIL:", l.data), null;
362
362
  }
363
- }, ir = (e) => {
363
+ }, lo = (e) => {
364
364
  try {
365
- return Jn.parse(e);
365
+ return Kn.parse(e);
366
366
  } catch (t) {
367
367
  throw console.error("Error parsing event payload:", e, t), t;
368
368
  }
369
- }, Ne = (e, t, r, o, s) => {
369
+ }, Ne = (e, t, o, r, s) => {
370
370
  const i = {
371
- payload: o,
372
- nonce: dt(),
371
+ payload: r,
372
+ nonce: mt(),
373
373
  formId: t,
374
- elementId: r
374
+ elementId: o
375
375
  };
376
- console.log(`[form ${t}] Sending event to child ${r}:`, i), e.postMessage(JSON.stringify(i), s);
377
- }, ar = async (e) => {
376
+ console.log(`[form ${t}] Sending event to child ${o}:`, i), e.postMessage(JSON.stringify(i), s);
377
+ }, uo = async (e) => {
378
378
  if (typeof e != "object" || !e) return !1;
379
379
  try {
380
- const t = { type: "ping" }, r = await e.send(t);
381
- if (r !== !0)
382
- throw new Error(`Expected 'true' after ping, got ${JSON.stringify(r)}`);
380
+ const t = { type: "ping" }, o = await e.send(t);
381
+ if (o !== !0)
382
+ throw new Error(`Expected 'true' after ping, got ${JSON.stringify(o)}`);
383
383
  return !0;
384
384
  } catch (t) {
385
385
  return console.error("Invalid CDE connection check:", t), !1;
386
386
  }
387
- }, cr = (e, t) => !!e && t;
388
- async function lr(e) {
389
- const r = await mt({
387
+ }, mo = (e, t) => !!e && t;
388
+ async function po(e) {
389
+ const o = await pt({
390
390
  iframe: e,
391
391
  debug: !0
392
- }).promise, o = await ar(r);
393
- if (!cr(r, o))
392
+ }).promise, r = await uo(o);
393
+ if (!mo(o, r))
394
394
  throw new Error("Got invalid CDE connection object");
395
- return console.log("[OJS] connected to iframe", e.id), r;
395
+ return console.log("[OJS] connected to iframe", e.id), o;
396
396
  }
397
397
  const S = (e) => n.nullable(e.optional());
398
398
  n.string().trim().min(1, { message: "Cannot be blank" });
399
- const ur = n.object({
399
+ const fo = 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()
@@ -409,7 +409,7 @@ const Pt = n.object({
409
409
  currency: S(n.string()),
410
410
  duration: n.string(),
411
411
  duration_in_months: S(n.number())
412
- }), vt = n.object({
412
+ }), kt = 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 Pt = 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
- }), dr = n.record(n.string(), n.any()), mr = n.object({
421
+ }), yo = n.record(n.string(), n.any()), _o = n.object({
422
422
  name: n.string(),
423
- settings: S(dr)
423
+ settings: S(yo)
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
- }), pr = n.object({
428
+ }), go = n.object({
429
429
  quantity: n.number()
430
- }), fr = n.object({
430
+ }), ho = 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(pr),
434
+ subscription_items: n.array(go),
435
435
  trial_start: S(n.string()),
436
436
  trial_end: S(n.string())
437
- }), kt = n.object({
437
+ }), Ot = n.object({
438
438
  amount_atom: n.number()
439
- }), yr = n.object({
439
+ }), wo = 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(kt),
443
+ discount_amount_atoms: n.array(Ot),
444
444
  subscription_item_id: n.string()
445
- }), _r = n.object({
445
+ }), Eo = n.object({
446
446
  coupon: Pt
447
- }), gr = n.object({
447
+ }), Co = n.object({
448
448
  currency: n.string(),
449
- discounts: n.array(_r),
449
+ discounts: n.array(Eo),
450
450
  hosted_invoice_url: S(n.string()),
451
- lines: n.array(yr),
451
+ lines: n.array(wo),
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(kt)
455
+ total_discount_amount_atoms: n.array(Ot)
456
456
  }), nt = n.object({
457
- created: n.array(fr),
458
- invoices: n.array(gr)
459
- }), Ot = n.object({
457
+ created: n.array(ho),
458
+ invoices: n.array(Co)
459
+ }), Rt = n.object({
460
460
  preview: nt,
461
461
  preview_post_trial: S(nt),
462
462
  coupons: n.array(Pt)
463
- }), rt = n.object({
463
+ }), ot = n.object({
464
464
  status: n.literal("open"),
465
465
  token: n.string(),
466
466
  email: S(n.string()),
467
- line_items: n.array(vt),
467
+ line_items: n.array(kt),
468
468
  amount_subtotal_atom: n.number().int(),
469
469
  amount_total_atom: n.number().int(),
470
- brand: mr,
471
- subs_preview: S(Ot),
470
+ brand: _o,
471
+ subs_preview: S(Rt),
472
472
  // Null in setup mode
473
473
  methods_available: n.array(ue)
474
- }), Rt = n.discriminatedUnion("mode", [
474
+ }), It = n.discriminatedUnion("mode", [
475
475
  n.object({
476
476
  mode: n.literal("setup"),
477
477
  currency: n.nullable(n.undefined())
478
- }).extend(rt.shape),
478
+ }).extend(ot.shape),
479
479
  n.object({
480
480
  mode: n.enum(["payment", "subscription"]),
481
481
  currency: n.string()
482
- }).extend(rt.shape)
483
- ]), hr = n.object({
482
+ }).extend(ot.shape)
483
+ ]), bo = n.object({
484
484
  status: n.literal("complete")
485
- }), wr = n.object({
485
+ }), So = n.object({
486
486
  status: n.literal("expired")
487
487
  });
488
- n.union([Rt, hr, wr]);
488
+ n.union([It, bo, So]);
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 It = n.object({
495
+ const At = 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(vt),
507
+ line_items: n.array(kt),
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 Er = n.object({
514
+ const vo = 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 Cr = n.object({
521
+ const Po = 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(Cr);
527
+ n.array(Po);
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 At = n.object({
536
+ const Tt = n.object({
537
537
  required_user_actions: n.array(n.record(n.string(), n.any()))
538
538
  });
539
539
  n.object({
540
- fields: xn,
540
+ fields: qn,
541
541
  checkoutPaymentMethod: ue
542
542
  });
543
543
  n.object({
@@ -545,23 +545,23 @@ n.object({
545
545
  non_cde_form_fields: ce,
546
546
  checkout_payment_method: ue
547
547
  });
548
- const br = n.object({
548
+ const ko = 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 Sr = (e) => e.reduce((t, r) => t + r, 0);
554
- function Pr(e, t) {
555
- var r = Object.setPrototypeOf;
556
- r ? r(e, t) : e.__proto__ = t;
553
+ const Oo = (e) => e.reduce((t, o) => t + o, 0);
554
+ function Ro(e, t) {
555
+ var o = Object.setPrototypeOf;
556
+ o ? o(e, t) : e.__proto__ = t;
557
557
  }
558
- function vr(e, t) {
558
+ function Io(e, t) {
559
559
  t === void 0 && (t = e.constructor);
560
- var r = Error.captureStackTrace;
561
- r && r(e, t);
560
+ var o = Error.captureStackTrace;
561
+ o && o(e, t);
562
562
  }
563
- var kr = /* @__PURE__ */ function() {
564
- var e = function(r, o) {
563
+ var Ao = /* @__PURE__ */ function() {
564
+ var e = function(o, r) {
565
565
  return e = Object.setPrototypeOf || {
566
566
  __proto__: []
567
567
  } instanceof Array && function(s, i) {
@@ -569,104 +569,104 @@ var kr = /* @__PURE__ */ function() {
569
569
  } || function(s, i) {
570
570
  for (var a in i)
571
571
  Object.prototype.hasOwnProperty.call(i, a) && (s[a] = i[a]);
572
- }, e(r, o);
572
+ }, e(o, r);
573
573
  };
574
- return function(t, r) {
575
- if (typeof r != "function" && r !== null) throw new TypeError("Class extends value " + String(r) + " is not a constructor or null");
576
- e(t, r);
577
- function o() {
574
+ return function(t, o) {
575
+ if (typeof o != "function" && o !== null) throw new TypeError("Class extends value " + String(o) + " is not a constructor or null");
576
+ e(t, o);
577
+ function r() {
578
578
  this.constructor = t;
579
579
  }
580
- t.prototype = r === null ? Object.create(r) : (o.prototype = r.prototype, new o());
580
+ t.prototype = o === null ? Object.create(o) : (r.prototype = o.prototype, new r());
581
581
  };
582
- }(), Or = function(e) {
583
- kr(t, e);
584
- function t(r, o) {
585
- var s = this.constructor, i = e.call(this, r, o) || this;
582
+ }(), To = function(e) {
583
+ Ao(t, e);
584
+ function t(o, r) {
585
+ var s = this.constructor, i = e.call(this, o, r) || this;
586
586
  return Object.defineProperty(i, "name", {
587
587
  value: s.name,
588
588
  enumerable: !1,
589
589
  configurable: !0
590
- }), Pr(i, s.prototype), vr(i), i;
590
+ }), Ro(i, s.prototype), Io(i), i;
591
591
  }
592
592
  return t;
593
593
  }(Error);
594
- class Tt extends Or {
594
+ class Mt extends To {
595
595
  constructor(t) {
596
- const r = `[cde-client] Error querying CDE: ${t.message}`;
597
- super(r), this.response = t;
596
+ const o = `[cde-client] Error querying CDE: ${t.message}`;
597
+ super(o), this.response = t;
598
598
  }
599
599
  get originalErrorMessage() {
600
600
  return this.response.message;
601
601
  }
602
602
  }
603
- const x = async (e, t, r) => {
603
+ const x = async (e, t, o) => {
604
604
  console.log("[cde-client] Querying CDE with path and connection:", t.type, e);
605
- const o = await e.send(t);
606
- if (console.log("[cde-client] Got response from CDE:", o), Ir(o))
607
- throw new Tt(o);
608
- if (!Rr(o, r)) {
609
- const s = r.safeParse(o);
610
- throw s.success ? new Error("Invalid state") : (console.error("OJS queryApi got a schema error. Expected schema:", r, "Actual:", o), s.error);
605
+ const r = await e.send(t);
606
+ if (console.log("[cde-client] Got response from CDE:", r), Do(r))
607
+ throw new Mt(r);
608
+ if (!Mo(r, o)) {
609
+ const s = o.safeParse(r);
610
+ throw s.success ? new Error("Invalid state") : (console.error("OJS queryApi got a schema error. Expected schema:", o, "Actual:", r), s.error);
611
611
  }
612
- return o;
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
- const o = Date.now();
615
- for (r = r ?? 5e3; Date.now() - o < r; ) {
612
+ return r;
613
+ }, Mo = (e, t) => t.safeParse(e).success, Do = (e) => fo.safeParse(e).success, Fo = async (e, t) => await x(e, { type: "get_checkout_preview", payload: t }, Rt), W = async (e) => await x(e, { type: "get_prefill", payload: {} }, It), No = async (e, t) => await x(e, { type: "v2_start_payment_flow", payload: t }, Tt), jo = async (e, t) => await x(e, { type: "start_payment_flow_for_cc", payload: t }, ko), Lo = async (e, t) => await x(e, { type: "start_payment_flow_for_pr", payload: t }, Tt), Ce = async (e, t) => await x(e, { type: "confirm_payment_flow", payload: t }, Yn), xo = async (e, t, o) => {
614
+ const r = Date.now();
615
+ for (o = o ?? 5e3; Date.now() - r < o; ) {
616
616
  const s = e.querySelector(`input[data-opid=${t}]`);
617
617
  if (s !== null) {
618
618
  if (!(s instanceof HTMLInputElement))
619
619
  throw new Error(`Invalid state: matched input element had wrong class: ${s.tagName}`);
620
620
  return s;
621
621
  }
622
- await bt(300);
622
+ await St(300);
623
623
  }
624
624
  return console.warn("Cannot find promo code input"), null;
625
- }, Nr = async (e, t, r) => {
626
- const o = await Ar(e, {
625
+ }, $o = async (e, t, o) => {
626
+ const r = await Fo(e, {
627
627
  secure_token: t,
628
- promotion_code: r
629
- }), s = new Set(o.preview.invoices.map((c) => c.currency));
628
+ promotion_code: o
629
+ }), s = new Set(r.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 = Sr(o.preview.invoices.map((c) => c.remaining_amount_atom));
632
+ const i = s.values().next().value ?? "usd", a = Oo(r.preview.invoices.map((c) => c.remaining_amount_atom));
633
633
  return {
634
634
  currency: i,
635
635
  amountAtom: a
636
636
  };
637
- }, Ue = async (e, t, r, o) => {
638
- if (r)
637
+ }, Ue = async (e, t, o, r) => {
638
+ if (o)
639
639
  return { amountAtom: 0, currency: "usd" };
640
640
  {
641
- o = o || void 0;
642
- const s = await Nr(e, t, o);
641
+ r = r || void 0;
642
+ const s = await $o(e, t, r);
643
643
  return { amountAtom: s.amountAtom, currency: s.currency };
644
644
  }
645
- }, jr = async (e, t) => {
645
+ }, Uo = async (e, t) => {
646
646
  if (e.size === 0)
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 }, Yn)
650
+ (r) => x(r, { type: "tokenize_card", payload: t }, Wn)
651
651
  )
652
652
  );
653
- }, ot = async (e, t) => {
653
+ }, rt = async (e, t) => {
654
654
  try {
655
- return await x(e, { type: "checkout_card_elements", payload: t }, It);
656
- } catch (r) {
657
- throw console.error("[cde-client] Error during checkoutCardElements:", r, JSON.stringify(r)), r;
655
+ return await x(e, { type: "checkout_card_elements", payload: t }, At);
656
+ } catch (o) {
657
+ throw console.error("[cde-client] Error during checkoutCardElements:", o, JSON.stringify(o)), o;
658
658
  }
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) => {
659
+ }, qo = async (e, t) => await x(e, { type: "setup_payment_method", payload: t }, vo), Dt = async (e, t) => await x(e, { type: "checkout", payload: t }, At), Ft = 1e3, zo = async (e, t) => {
660
660
  console.log(t);
661
- const o = await mt({
661
+ const r = await pt({
662
662
  iframe: e,
663
663
  debug: !0,
664
- timeout: Dt,
664
+ timeout: Ft,
665
665
  childOrigin: "*"
666
666
  // TODO: use with proper childOrigin
667
667
  }).promise;
668
- return (await x(o, { type: "ping-3ds-status" }, Zn)).status;
669
- }, $r = (e) => {
668
+ return (await x(r, { type: "ping-3ds-status" }, Gn)).status;
669
+ }, Jo = (e) => {
670
670
  if (typeof e != "string") return !1;
671
671
  try {
672
672
  return JSON.parse(e), !0;
@@ -676,184 +676,200 @@ const x = async (e, t, r) => {
676
676
  }, qe = (e) => async (t) => {
677
677
  try {
678
678
  t.flowCallbacks.onCheckoutStarted();
679
- const r = await e(t);
680
- if (r.mode === "setup")
681
- t.flowCallbacks.onSetupPaymentMethodSuccess(r.result.payment_method_id);
682
- else if (r.mode === "checkout")
679
+ const o = await e(t);
680
+ if (o.mode === "setup")
681
+ t.flowCallbacks.onSetupPaymentMethodSuccess(o.result.payment_method_id);
682
+ else if (o.mode === "checkout")
683
683
  t.flowCallbacks.onCheckoutSuccess(
684
- r.result.invoice_urls,
685
- r.result.subscription_ids,
686
- r.result.customer_id
684
+ o.result.invoice_urls,
685
+ o.result.subscription_ids,
686
+ o.result.customer_id
687
687
  );
688
688
  else
689
- throw new Error(`Unhandled mode: ${r}`);
690
- } catch (r) {
691
- throw t.flowCallbacks.onCheckoutError(ie(r)), r;
689
+ throw new Error(`Unhandled mode: ${o}`);
690
+ } catch (o) {
691
+ throw t.flowCallbacks.onCheckoutError(ie(o)), o;
692
692
  }
693
- }, Ft = (e) => async (t) => {
693
+ }, Nt = (e) => async (t) => {
694
694
  try {
695
695
  return await e(t);
696
- } catch (r) {
697
- const { err__: o } = K("init-error-catcher");
698
- return o(r), { isAvailable: !1, reason: ie(r) };
696
+ } catch (o) {
697
+ const { err__: r } = K("init-error-catcher");
698
+ return r(o), { isAvailable: !1, reason: ie(o) };
699
699
  }
700
700
  }, K = (e) => {
701
- const t = (...o) => {
702
- window.console.log(`${me.green.bold("ojs/")}${me.bold.gray(`${e}`)} `, ...o);
703
- }, r = (...o) => {
704
- window.console.error(`${me.red.bold("ojs/")}${me.bold.gray(`${e}`)} `, ...o);
701
+ const t = (...r) => {
702
+ window.console.log(`${me.green.bold("ojs/")}${me.bold.gray(`${e}`)} `, ...r);
703
+ }, o = (...r) => {
704
+ window.console.error(`${me.red.bold("ojs/")}${me.bold.gray(`${e}`)} `, ...r);
705
705
  };
706
706
  return {
707
707
  log: t,
708
- err: r,
708
+ err: o,
709
709
  log__: t,
710
- err__: r
710
+ err__: o
711
711
  };
712
- }, { log__: Lo, err__: Ur } = K("common"), ze = (e) => {
712
+ }, { log__: Ur, err__: Ho } = 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
- }, Nt = (e, t) => {
717
- const r = e.find((o) => t.safeParse(o).success);
718
- if (!r)
719
- throw Ur("No CPMs found for model. All models:", e), new Error("No CPMs found for model");
720
- return t.parse(r);
721
- }, { log__: qr, err__: jt } = K("common-cc"), Je = (e, t) => {
722
- const r = ce.safeParse(e);
723
- if (!r.success) {
724
- const o = r.error.format(), s = Et(o);
716
+ }, jt = (e, t) => {
717
+ const o = e.find((r) => t.safeParse(r).success);
718
+ if (!o)
719
+ throw Ho("No CPMs found for model. All models:", e), new Error("No CPMs found for model");
720
+ return t.parse(o);
721
+ }, { log__: Vo, err__: Lt } = K("common-cc"), Je = (e, t) => {
722
+ const o = ce.safeParse(e);
723
+ if (!o.success) {
724
+ const r = o.error.format(), s = Ct(r);
725
725
  for (const [i, a] of Object.entries(s))
726
726
  t(i, a, i);
727
- throw jt("Got validation errors in non-CDE form fields", s), new Error("Got validation errors in non-CDE form fields");
727
+ throw Lt("Got validation errors in non-CDE form fields", s), new Error("Got validation errors in non-CDE form fields");
728
728
  }
729
- return r.data;
730
- }, zr = (e, t) => {
731
- for (const r of e)
732
- if (r.success === !1)
733
- throw r.errors.forEach((o) => {
734
- const s = gt.safeParse(o.elementType);
729
+ return o.data;
730
+ }, Ko = (e, t) => {
731
+ for (const o of e)
732
+ if (o.success === !1)
733
+ throw o.errors.forEach((r) => {
734
+ const s = ht.safeParse(r.elementType);
735
735
  if (!s.success)
736
- jt(`Unknown field name in onValidationError: ${o.elementType}`);
736
+ Lt(`Unknown field name in onValidationError: ${r.elementType}`);
737
737
  else {
738
738
  const i = s.data;
739
- t(i, o.errors);
739
+ t(i, r.errors);
740
740
  }
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({
741
+ }), Vo(`Error tokenizing card: got validation errors: ${JSON.stringify(o.errors)}`), new Error("Got validation errors while tokenizing card");
742
+ }, st = "ojs-stripe-link-btn", { log__: P, err__: Yo } = K("stripe-link"), Zo = n.object({
743
743
  provider: n.literal("stripe_link"),
744
744
  processor_name: n.literal("stripe"),
745
745
  metadata: n.object({
746
746
  stripe_pk: n.string()
747
747
  })
748
- }), Kr = n.array(
748
+ }), Bo = n.array(
749
749
  n.object({
750
750
  our_existing_pm_id: n.string()
751
751
  })
752
- ).length(1), Yr = Ft(
752
+ ).length(1), Wo = Nt(
753
753
  async ({ context: e, flowCallbacks: t }) => {
754
- var d;
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
- const o = Array.from(e.cdeConnections.values())[0], s = await B(o), i = s.mode === "setup";
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, {
754
+ const o = e.customInitParams.stripeLink;
755
+ P("Checking if there are any CPMs for Stripe PR...");
756
+ const r = jt(e.checkoutPaymentMethods, Zo);
757
+ P("Starting stripe link flow...");
758
+ const s = Array.from(e.cdeConnections.values())[0], i = await W(s), a = i.mode === "setup";
759
+ P("Creating stripe elements...");
760
+ const c = await Ue(s, i.token, a, void 0), { elements: l, stripe: d } = await to(r.metadata.stripe_pk, {
761
761
  mode: "setup",
762
- currency: a.currency,
762
+ currency: c.currency,
763
763
  setup_future_usage: "off_session",
764
764
  paymentMethodCreation: "manual"
765
765
  });
766
- T("Mounting payment element...");
767
- const u = c.create("expressCheckout", {
768
- buttonHeight: (d = e.customInitParams.stripeLink) == null ? void 0 : d.buttonHeight,
766
+ P("Creating express checkout...");
767
+ const u = l.create("expressCheckout", {
768
+ buttonHeight: o == null ? void 0 : o.buttonHeight,
769
769
  paymentMethods: {
770
770
  amazonPay: "never",
771
771
  applePay: "never",
772
772
  googlePay: "never",
773
773
  paypal: "never"
774
774
  }
775
- });
776
- return u.mount(`#${Jr}`), u.on("click", async (f) => {
777
- var m;
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");
775
+ }), _ = () => {
776
+ u.mount(`#${st}`);
777
+ }, w = () => {
778
+ u.unmount();
779
+ };
780
+ return o != null && o.doNotMountOnInit ? P("NOT mounting stripe link button (doNotMountOnInit is true)") : (P("Mounting stripe link button..."), _()), u.on("click", async (g) => {
781
+ if (P("Stripe Link button clicked"), o != null && o.overrideLinkSubmit && !await o.overrideLinkSubmit()) {
782
+ P("Stripe Link submit aborted by overrideLinkSubmit");
780
783
  return;
781
784
  }
782
- f.resolve();
783
- }), u.on("confirm", async (f) => {
784
- T("Stripe Link window confirmed", f);
785
- const m = await l.createPaymentMethod({
786
- elements: c,
785
+ g.resolve();
786
+ }), u.on("confirm", async (g) => {
787
+ P("Stripe Link window confirmed", g);
788
+ const h = await d.createPaymentMethod({
789
+ elements: l,
787
790
  params: {
788
- billing_details: f.billingDetails
791
+ billing_details: g.billingDetails
789
792
  }
790
793
  });
791
- m.error ? (Hr("error", m.error), t.onCheckoutError(m.error.message ?? "Stripe Link unknown error")) : (T("paymentMethod", m.paymentMethod), ae.stripeLink.run({
794
+ h.error ? (Yo("error", h.error), t.onCheckoutError(h.error.message ?? "Stripe Link unknown error")) : (P("paymentMethod", h.paymentMethod), ae.stripeLink.run({
792
795
  context: e,
793
796
  checkoutPaymentMethod: r,
794
797
  nonCdeFormInputs: he(e.formDiv),
795
798
  flowCallbacks: t,
796
- customParams: { stripePM: m.paymentMethod },
799
+ customParams: { stripePM: h.paymentMethod },
797
800
  initResult: { isAvailable: !0 }
798
801
  }));
799
- }), { isAvailable: !0 };
802
+ }), {
803
+ isAvailable: !0,
804
+ controller: {
805
+ mountButton: _,
806
+ dismountButton: w,
807
+ waitForButtonToMount: async () => await Xo(st)
808
+ }
809
+ };
800
810
  }
801
- ), Zr = qe(
811
+ ), Go = qe(
802
812
  async ({
803
813
  context: e,
804
814
  checkoutPaymentMethod: t,
805
- nonCdeFormInputs: r,
806
- flowCallbacks: o,
815
+ nonCdeFormInputs: o,
816
+ flowCallbacks: r,
807
817
  customParams: s
808
818
  }) => {
809
- T("Running Stripe PR flow...");
819
+ P("Running Stripe PR flow...");
810
820
  const i = Array.from(e.cdeConnections.values())[0];
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, {
821
+ P("Merging PM fields with form fields...");
822
+ const a = Qo(o, s.stripePM), c = Je(a, r.onValidationError);
823
+ P("Starting payment flow...");
824
+ const l = await No(i, {
815
825
  payment_provider: t.provider,
816
826
  checkout_payment_method: t,
817
827
  their_existing_pm_id: s.stripePM.id
818
828
  });
819
- T("Start payment flow response", l);
820
- const d = Kr.parse(l.required_user_actions)[0].our_existing_pm_id, f = await B(i);
821
- if (f.mode === "setup") {
822
- T("Doing payment setup...");
823
- const m = await Ce(i, {
824
- secure_token: f.token,
825
- existing_cc_pm_id: d
829
+ P("Start payment flow response", l);
830
+ const u = Bo.parse(l.required_user_actions)[0].our_existing_pm_id, _ = await W(i);
831
+ if (_.mode === "setup") {
832
+ P("Doing payment setup...");
833
+ const w = await Ce(i, {
834
+ secure_token: _.token,
835
+ existing_cc_pm_id: u
826
836
  });
827
- return { mode: "setup", result: ze(m) };
837
+ return { mode: "setup", result: ze(w) };
828
838
  } else {
829
- T("Doing checkout...");
830
- const m = {
831
- secure_token: f.token,
839
+ P("Doing checkout...");
840
+ const w = {
841
+ secure_token: _.token,
832
842
  payment_input: {
833
843
  provider_type: t.provider
834
844
  },
835
- customer_email: c[_.EMAIL],
836
- customer_zip_code: c[_.ZIP_CODE],
837
- customer_country: c[_.COUNTRY],
838
- promotion_code: c[_.PROMOTION_CODE],
839
- line_items: f.line_items,
840
- total_amount_atom: f.amount_total_atom,
845
+ customer_email: c[y.EMAIL],
846
+ customer_zip_code: c[y.ZIP_CODE],
847
+ customer_country: c[y.COUNTRY],
848
+ promotion_code: c[y.PROMOTION_CODE],
849
+ line_items: _.line_items,
850
+ total_amount_atom: _.amount_total_atom,
841
851
  cancel_at_end: !1,
842
852
  checkout_payment_method: t
843
853
  };
844
- return { mode: "checkout", result: await Mt(i, m) };
854
+ return { mode: "checkout", result: await Dt(i, w) };
845
855
  }
846
856
  }
847
- ), Wr = (e, t) => {
848
- var a, c, l, u, d;
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
- 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", 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) => {
857
+ ), Qo = (e, t) => {
858
+ var a, c, l, d, u;
859
+ const o = { ...e }, [r, ...s] = ((c = (a = t.billing_details.name) == null ? void 0 : a.trim()) == null ? void 0 : c.split(/\s+/)) ?? [], i = s.join(" ") || void 0;
860
+ return o[y.FIRST_NAME] = o[y.FIRST_NAME] || r || "_OP_UNKNOWN", o[y.LAST_NAME] = o[y.LAST_NAME] || i || "_OP_UNKNOWN", o[y.EMAIL] = o[y.EMAIL] || // eslint-disable-next-line @typescript-eslint/no-explicit-any
861
+ ((l = t.link) == null ? void 0 : l.email) || t.billing_details.email || "op_unfilled@getopenpay.com", o[y.ZIP_CODE] = o[y.ZIP_CODE] || ((d = t.billing_details.address) == null ? void 0 : d.postal_code) || "00000", o[y.COUNTRY] = o[y.COUNTRY] || ((u = t.billing_details.address) == null ? void 0 : u.country) || "US", P("Final form inputs:", o), o;
862
+ }, Xo = (e) => new Promise((t) => {
863
+ const o = () => {
864
+ const r = document.getElementById(e);
865
+ r ? t(r) : requestAnimationFrame(o);
866
+ };
867
+ o();
868
+ }), er = "@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}", tr = (e) => {
853
869
  const t = document.createElement("template");
854
870
  t.innerHTML = `
855
871
  <style>
856
- ${Br}
872
+ ${er}
857
873
  </style>
858
874
  <div class="overlay">
859
875
  <div class="container">
@@ -862,65 +878,65 @@ const x = async (e, t, r) => {
862
878
  </div>
863
879
  </div>
864
880
  `;
865
- const r = document.createElement("div"), o = r.attachShadow({ mode: "open" });
866
- o.appendChild(t.content.cloneNode(!0));
867
- const s = o.querySelector("#three-ds-iframe"), i = o.querySelector(".cancel-button");
868
- return document.body.appendChild(r), { host: r, iframe: s, cancelButton: i };
881
+ const o = document.createElement("div"), r = o.attachShadow({ mode: "open" });
882
+ r.appendChild(t.content.cloneNode(!0));
883
+ const s = r.querySelector("#three-ds-iframe"), i = r.querySelector(".cancel-button");
884
+ return document.body.appendChild(o), { host: o, iframe: s, cancelButton: i };
869
885
  };
870
- function Qr(e, t, r) {
871
- const o = async () => {
886
+ function nr(e, t, o) {
887
+ const r = async () => {
872
888
  try {
873
889
  console.log("🔄 Polling CDE connection...");
874
- const i = await xr(e, r);
890
+ const i = await zo(e, o);
875
891
  i && (console.log("🟢 CDE connection successful! Stopping polling..."), console.log("➡️ Got status:", i), clearInterval(s), t(i));
876
892
  } catch {
877
893
  }
878
894
  };
879
- o();
880
- const s = setInterval(o, Dt);
895
+ r();
896
+ const s = setInterval(r, Ft);
881
897
  return s;
882
898
  }
883
- function Xr({
899
+ function or({
884
900
  elements: e,
885
901
  pollingInterval: t,
886
- resolve: r
902
+ resolve: o
887
903
  }) {
888
- const o = () => {
889
- clearInterval(t), e.host.remove(), r(ge.CANCELLED);
904
+ const r = () => {
905
+ clearInterval(t), e.host.remove(), o(ge.CANCELLED);
890
906
  };
891
- return e.cancelButton.addEventListener("click", o), () => {
892
- e.cancelButton.removeEventListener("click", o);
907
+ return e.cancelButton.addEventListener("click", r), () => {
908
+ e.cancelButton.removeEventListener("click", r);
893
909
  };
894
910
  }
895
- async function eo({
911
+ async function rr({
896
912
  url: e,
897
913
  baseUrl: t
898
914
  }) {
899
- const r = Gr(e);
900
- return new Promise((o) => {
915
+ const o = tr(e);
916
+ return new Promise((r) => {
901
917
  const s = (c) => {
902
918
  setTimeout(() => {
903
- r.host.remove();
904
- }, 1e3), o(c), a == null || a();
905
- }, i = Qr(r.iframe, s, new URL(t).origin), a = Xr({
906
- elements: r,
919
+ o.host.remove();
920
+ }, 1e3), r(c), a == null || a();
921
+ }, i = nr(o.iframe, s, new URL(t).origin), a = or({
922
+ elements: o,
907
923
  pollingInterval: i,
908
- resolve: o
924
+ resolve: r
909
925
  });
910
926
  });
911
927
  }
912
- const { log__: P, err__: st } = K("common-cc"), { log__: it } = K("stripe-cc"), to = qe(
913
- async ({ context: e, checkoutPaymentMethod: t, nonCdeFormInputs: r, flowCallbacks: o }) => {
914
- var u;
915
- P("├ Running common CC flow...", { checkoutPaymentMethod: t });
916
- const s = Array.from(e.cdeConnections.values())[0], i = await B(s);
917
- P(`├ Validating non-CDE form fields [Mode: ${i.mode}]`);
918
- const a = Je(r, o.onValidationError);
919
- P(`├ Tokenizing card info in CDE [Session: ${e.elementsSessionId}]`);
920
- const c = await jr(e.cdeConnections, {
928
+ const { log__: v, err__: it } = K("common-cc"), { log__: at } = K("stripe-cc"), sr = qe(
929
+ async ({ context: e, checkoutPaymentMethod: t, nonCdeFormInputs: o, flowCallbacks: r }) => {
930
+ var d;
931
+ v("├ Running common CC flow...", { checkoutPaymentMethod: t });
932
+ const s = Array.from(e.cdeConnections.values())[0], i = await W(s);
933
+ v(`├ Validating non-CDE form fields [Mode: ${i.mode}]`);
934
+ const a = Je(o, r.onValidationError);
935
+ v(`├ Tokenizing card info in CDE [Session: ${e.elementsSessionId}]`);
936
+ const c = await Uo(e.cdeConnections, {
921
937
  session_id: e.elementsSessionId
922
938
  });
923
- zr(c, o.onValidationError);
939
+ Ko(c, r.onValidationError);
924
940
  const l = {
925
941
  session_id: e.elementsSessionId,
926
942
  checkout_payment_method: t,
@@ -928,83 +944,83 @@ const { log__: P, err__: st } = K("common-cc"), { log__: it } = K("stripe-cc"),
928
944
  };
929
945
  try {
930
946
  if (i.mode === "setup") {
931
- P(`├ Setting up payment method in CDE [Token: ${i.token}]`);
932
- const d = await Lr(s, l);
933
- return P(`╰ Setup completed successfully [PM ID: ${d.payment_method_id}]`), { mode: "setup", result: d };
947
+ v(`├ Setting up payment method in CDE [Token: ${i.token}]`);
948
+ const u = await qo(s, l);
949
+ return v(`╰ Setup completed successfully [PM ID: ${u.payment_method_id}]`), { mode: "setup", result: u };
934
950
  } else {
935
- P(`├ Initial checkout flow. Checking out card info in CDE [Session: ${e.elementsSessionId}]`);
936
- const d = await ot(s, l);
937
- return P("╰ Checkout completed successfully."), { mode: "checkout", result: d };
951
+ v(`├ Initial checkout flow. Checking out card info in CDE [Session: ${e.elementsSessionId}]`);
952
+ const u = await rt(s, l);
953
+ return v("╰ Checkout completed successfully."), { mode: "checkout", result: u };
938
954
  }
939
- } catch (d) {
940
- if (d instanceof Tt && d.originalErrorMessage === "3DS_REQUIRED") {
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 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
- P(`├ Confirming payment flow [cc_pm_id: ${m.cc_pm_id}]`);
945
- const h = await Ce(s, {
955
+ } catch (u) {
956
+ if (u instanceof Mt && u.originalErrorMessage === "3DS_REQUIRED") {
957
+ v("├ Card requires 3DS, starting non-legacy payment flow"), v("error.response.headers", u.response.headers);
958
+ const _ = ((d = u.response.headers) == null ? void 0 : d["op-should-use-new-flow"]) === "true", w = await jo(s, l);
959
+ if (v(`├ op-should-use-new-flow: ${_}`), v("├ Payment flow result:", w), _ ? await cr(w, e.baseUrl) : await lr(w), i.mode === "setup") {
960
+ v(`├ Confirming payment flow [cc_pm_id: ${w.cc_pm_id}]`);
961
+ const g = await Ce(s, {
946
962
  secure_token: i.token,
947
- existing_cc_pm_id: m.cc_pm_id
963
+ existing_cc_pm_id: w.cc_pm_id
948
964
  });
949
- P("├ Confirm payment flow result received Result:", h);
950
- const C = ze(h);
951
- return P(`╰ Setup completed successfully [PM ID: ${C.payment_method_id}]`), { mode: "setup", result: C };
965
+ v("├ Confirm payment flow result received Result:", g);
966
+ const h = ze(g);
967
+ return v(`╰ Setup completed successfully [PM ID: ${h.payment_method_id}]`), { mode: "setup", result: h };
952
968
  } else {
953
- P(`├ Checking out after 3DS flow [Flow: ${f ? "new" : "legacy"}]`);
954
- const h = await ot(s, {
969
+ v(`├ Checking out after 3DS flow [Flow: ${_ ? "new" : "legacy"}]`);
970
+ const g = await rt(s, {
955
971
  ...l,
956
- existing_cc_pm_id: m.cc_pm_id,
957
- do_not_use_legacy_cc_flow: !f
972
+ existing_cc_pm_id: w.cc_pm_id,
973
+ do_not_use_legacy_cc_flow: !_
958
974
  });
959
- return P("╰ Checkout completed successfully."), { mode: "checkout", result: h };
975
+ return v("╰ Checkout completed successfully."), { mode: "checkout", result: g };
960
976
  }
961
977
  }
962
- throw st("╰ Error checking out card info in CDE"), st(d), d;
978
+ throw it("╰ Error checking out card info in CDE"), it(u), u;
963
979
  }
964
980
  }
965
- ), no = (e) => {
966
- const t = e.required_user_actions.find((r) => r.type === "stripe_3ds");
981
+ ), ir = (e) => {
982
+ const t = e.required_user_actions.find((o) => o.type === "stripe_3ds");
967
983
  if (!t)
968
984
  throw new Error("No stripe 3DS action found");
969
- return Ct.parse(t);
970
- }, ro = (e) => {
971
- const t = e.required_user_actions.find((r) => r.type === "airwallex_payment_consent");
985
+ return bt.parse(t);
986
+ }, ar = (e) => {
987
+ const t = e.required_user_actions.find((o) => o.type === "airwallex_payment_consent");
972
988
  if (!t)
973
989
  throw new Error("No common 3DS action found");
974
- return Wn.parse(t);
975
- }, oo = async (e, t) => {
976
- const r = ro(e);
977
- P(`├ Using common 3DS flow [URL: ${r.redirect_url}]`);
978
- const o = await eo({ url: r.redirect_url, baseUrl: t });
979
- if (P(`╰ 3DS verification completed [Status: ${o}]`), o === ge.CANCELLED)
990
+ return Qn.parse(t);
991
+ }, cr = async (e, t) => {
992
+ const o = ar(e);
993
+ v(`├ Using common 3DS flow [URL: ${o.redirect_url}]`);
994
+ const r = await rr({ url: o.redirect_url, baseUrl: t });
995
+ if (v(`╰ 3DS verification completed [Status: ${r}]`), r === ge.CANCELLED)
980
996
  throw new Error("3DS verification cancelled");
981
- if (o === ge.FAILURE)
997
+ if (r === ge.FAILURE)
982
998
  throw new Error("3DS verification failed");
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({
999
+ }, lr = async (e) => {
1000
+ const t = ir(e);
1001
+ at(`├ Using stripe 3DS flow [Client Secret: ${t.client_secret.substring(0, 8)}...]`), await vt(t), at("╰ Stripe 3DS flow completed successfully");
1002
+ }, { log__: T, err__: ur } = K("stripe-pr"), dr = n.object({
987
1003
  provider: n.union([n.literal("apple_pay"), n.literal("google_pay")]),
988
1004
  processor_name: n.literal("stripe"),
989
1005
  metadata: n.object({
990
1006
  stripe_pk: n.string()
991
1007
  })
992
- }), co = Ft(
1008
+ }), mr = Nt(
993
1009
  async ({ context: e }) => {
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
- const r = Array.from(e.cdeConnections.values())[0], o = await B(r), s = o.mode === "setup";
998
- A("Getting initial preview amount");
999
- const i = await Ue(r, o.token, s, void 0), a = await Xn(
1010
+ T("Checking if there are any CPMs for Stripe PR...");
1011
+ const t = jt(e.checkoutPaymentMethods, dr);
1012
+ T("Initializing Stripe PR flow...");
1013
+ const o = Array.from(e.cdeConnections.values())[0], r = await W(o), s = r.mode === "setup";
1014
+ T("Getting initial preview amount");
1015
+ const i = await Ue(o, r.token, s, void 0), a = await no(
1000
1016
  t.metadata.stripe_pk,
1001
1017
  i.amountAtom,
1002
1018
  i.currency,
1003
1019
  s
1004
1020
  );
1005
- A("Checking if can make payment");
1021
+ T("Checking if can make payment");
1006
1022
  const c = await a.canMakePayment();
1007
- return c === null ? (io("canMakePayment returned null"), { isAvailable: !1, reason: "canMakePayment returned null" }) : (A("Stripe PR flow initialized successfully. Can make payment", c), {
1023
+ return c === null ? (ur("canMakePayment returned null"), { isAvailable: !1, reason: "canMakePayment returned null" }) : (T("Stripe PR flow initialized successfully. Can make payment", c), {
1008
1024
  isAvailable: !0,
1009
1025
  pr: a,
1010
1026
  availableProviders: {
@@ -1013,102 +1029,102 @@ const { log__: P, err__: st } = K("common-cc"), { log__: it } = K("stripe-cc"),
1013
1029
  }
1014
1030
  });
1015
1031
  }
1016
- ), lo = qe(
1032
+ ), pr = qe(
1017
1033
  async ({
1018
1034
  context: e,
1019
1035
  checkoutPaymentMethod: t,
1020
- nonCdeFormInputs: r,
1021
- flowCallbacks: o,
1036
+ nonCdeFormInputs: o,
1037
+ flowCallbacks: r,
1022
1038
  customParams: s,
1023
1039
  initResult: i
1024
1040
  }) => {
1025
- if (A("Running Stripe PR flow..."), s.provider !== t.provider)
1041
+ if (T("Running Stripe PR flow..."), s.provider !== t.provider)
1026
1042
  throw new Error(`Provider mismatch. Expected ${s.provider}, got ${t.provider}`);
1027
1043
  const a = Array.from(e.cdeConnections.values())[0], c = i.pr;
1028
1044
  if (s != null && s.overridePaymentRequest) {
1029
- const C = s.overridePaymentRequest;
1030
- A("Overriding PR amount with", C), mo(c, C.amount, C.pending);
1045
+ const h = s.overridePaymentRequest;
1046
+ T("Overriding PR amount with", h), yr(c, h.amount, h.pending);
1031
1047
  }
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
- fields: d,
1048
+ T("Showing PR dialog..."), c.show();
1049
+ const l = await oo(c);
1050
+ T("Stripe PM added event:", l), T("Merging PM fields with form fields...");
1051
+ const d = fr(o, l), u = Je(d, r.onValidationError);
1052
+ T("PR dialog finished. Starting payment flow...");
1053
+ const _ = await Lo(a, {
1054
+ fields: u,
1039
1055
  checkoutPaymentMethod: t
1040
- }), m = po(f);
1041
- A("Confirming PR with Stripe..."), await nr(m, l);
1042
- const h = await B(a);
1043
- if (h.mode === "setup") {
1044
- A("Confirming payment flow for setup...");
1045
- const C = await Ce(a, {
1046
- secure_token: h.token
1056
+ }), w = _r(_);
1057
+ T("Confirming PR with Stripe..."), await so(w, l);
1058
+ const g = await W(a);
1059
+ if (g.mode === "setup") {
1060
+ T("Confirming payment flow for setup...");
1061
+ const h = await Ce(a, {
1062
+ secure_token: g.token
1047
1063
  });
1048
- return { mode: "setup", result: ze(C) };
1064
+ return { mode: "setup", result: ze(h) };
1049
1065
  } else {
1050
- A("Performing checkout...");
1051
- const C = {
1052
- secure_token: h.token,
1066
+ T("Performing checkout...");
1067
+ const h = {
1068
+ secure_token: g.token,
1053
1069
  payment_input: {
1054
1070
  provider_type: t.provider
1055
1071
  },
1056
- customer_email: d[_.EMAIL],
1057
- customer_zip_code: d[_.ZIP_CODE],
1058
- customer_country: d[_.COUNTRY],
1059
- promotion_code: d[_.PROMOTION_CODE],
1060
- line_items: h.line_items,
1061
- total_amount_atom: h.amount_total_atom,
1072
+ customer_email: u[y.EMAIL],
1073
+ customer_zip_code: u[y.ZIP_CODE],
1074
+ customer_country: u[y.COUNTRY],
1075
+ promotion_code: u[y.PROMOTION_CODE],
1076
+ line_items: g.line_items,
1077
+ total_amount_atom: g.amount_total_atom,
1062
1078
  cancel_at_end: !1,
1063
1079
  checkout_payment_method: t
1064
1080
  };
1065
- return { mode: "checkout", result: await Mt(a, C) };
1081
+ return { mode: "checkout", result: await Dt(a, h) };
1066
1082
  }
1067
1083
  }
1068
- ), uo = (e, t) => {
1069
- var a, c, l, u;
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", A("Final form inputs:", r), r;
1072
- }, mo = (e, t, r) => {
1084
+ ), fr = (e, t) => {
1085
+ var a, c, l, d;
1086
+ const o = { ...e }, [r, ...s] = ((c = (a = t.payerName) == null ? void 0 : a.trim()) == null ? void 0 : c.split(/\s+/)) ?? [], i = s.join(" ") || void 0;
1087
+ return o[y.FIRST_NAME] = o[y.FIRST_NAME] || r || "_OP_UNKNOWN", o[y.LAST_NAME] = o[y.LAST_NAME] || i || "_OP_UNKNOWN", o[y.EMAIL] = o[y.EMAIL] || t.payerEmail || "op_unfilled@getopenpay.com", o[y.ZIP_CODE] = o[y.ZIP_CODE] || ((l = t.shippingAddress) == null ? void 0 : l.postalCode) || "00000", o[y.COUNTRY] = o[y.COUNTRY] || ((d = t.shippingAddress) == null ? void 0 : d.country) || "US", T("Final form inputs:", o), o;
1088
+ }, yr = (e, t, o) => {
1073
1089
  e.update({
1074
1090
  total: {
1075
1091
  amount: t.amountAtom,
1076
1092
  label: "Total",
1077
- pending: r
1093
+ pending: o
1078
1094
  },
1079
1095
  currency: t.currency
1080
1096
  });
1081
- }, po = (e) => {
1097
+ }, _r = (e) => {
1082
1098
  if (e.required_user_actions.length !== 1)
1083
1099
  throw new Error(`Error occurred.
1084
1100
  Details: got ${e.required_user_actions.length} required user actions`);
1085
- return Bn.parse(e.required_user_actions[0]);
1086
- }, at = (e, t, r) => {
1087
- const o = e.filter((s) => s.provider === t);
1088
- if (o.length === 0)
1089
- throw console.error("CPMs list", e), new Error(`No CPMs found with provider '${t}' and processor '${r}'`);
1090
- if (o.length !== 1)
1091
- throw console.error("CPMs list", e), new Error(`More than one CPM found with provider '${t}' and processor '${r}'`);
1092
- return o[0];
1101
+ return Xn.parse(e.required_user_actions[0]);
1102
+ }, ct = (e, t, o) => {
1103
+ const r = e.filter((s) => s.provider === t);
1104
+ if (r.length === 0)
1105
+ throw console.error("CPMs list", e), new Error(`No CPMs found with provider '${t}' and processor '${o}'`);
1106
+ if (r.length !== 1)
1107
+ throw console.error("CPMs list", e), new Error(`More than one CPM found with provider '${t}' and processor '${o}'`);
1108
+ return r[0];
1093
1109
  }, ae = {
1094
1110
  // ✋ Note: For flows that require initialization, please add them to `init-flows.ts`
1095
1111
  // Common
1096
1112
  commonCC: {
1097
- run: to
1113
+ run: sr
1098
1114
  },
1099
1115
  // Stripe
1100
1116
  stripePR: {
1101
- init: co,
1102
- run: lo
1117
+ init: mr,
1118
+ run: pr
1103
1119
  },
1104
1120
  stripeLink: {
1105
- init: Yr,
1106
- run: Zr
1121
+ init: Wo,
1122
+ run: Go
1107
1123
  }
1108
1124
  // 👉 Add more flows here
1109
1125
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1110
1126
  };
1111
- function Lt(e) {
1127
+ function xt(e) {
1112
1128
  return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
1113
1129
  }
1114
1130
  var be = {};
@@ -1116,19 +1132,19 @@ Object.defineProperty(be, "__esModule", {
1116
1132
  value: !0
1117
1133
  });
1118
1134
  be.Observable = void 0;
1119
- const xt = (e) => !!Symbol[e], He = (e) => xt(e) ? Symbol[e] : "@@" + e, fo = He("iterator"), xe = He("observable"), $t = He("species");
1135
+ const $t = (e) => !!Symbol[e], He = (e) => $t(e) ? Symbol[e] : "@@" + e, gr = He("iterator"), xe = He("observable"), Ut = He("species");
1120
1136
  function we(e, t) {
1121
- let r = e[t];
1122
- if (r != null) {
1123
- if (typeof r != "function") throw new TypeError(r + " is not a function");
1124
- return r;
1137
+ let o = e[t];
1138
+ if (o != null) {
1139
+ if (typeof o != "function") throw new TypeError(o + " is not a function");
1140
+ return o;
1125
1141
  }
1126
1142
  }
1127
- function oe(e) {
1143
+ function re(e) {
1128
1144
  let t = e.constructor;
1129
- return t !== void 0 && (t = t[$t], t === null && (t = void 0)), t !== void 0 ? t : Se;
1145
+ return t !== void 0 && (t = t[Ut], t === null && (t = void 0)), t !== void 0 ? t : Se;
1130
1146
  }
1131
- function yo(e) {
1147
+ function hr(e) {
1132
1148
  return e instanceof Se;
1133
1149
  }
1134
1150
  function te(e) {
@@ -1145,91 +1161,91 @@ function fe(e) {
1145
1161
  }
1146
1162
  });
1147
1163
  }
1148
- function Ut(e) {
1164
+ function qt(e) {
1149
1165
  let t = e._cleanup;
1150
1166
  if (t !== void 0 && (e._cleanup = void 0, !!t))
1151
1167
  try {
1152
1168
  if (typeof t == "function")
1153
1169
  t();
1154
1170
  else {
1155
- let r = we(t, "unsubscribe");
1156
- r && r.call(t);
1171
+ let o = we(t, "unsubscribe");
1172
+ o && o.call(t);
1157
1173
  }
1158
- } catch (r) {
1159
- te(r);
1174
+ } catch (o) {
1175
+ te(o);
1160
1176
  }
1161
1177
  }
1162
1178
  function $e(e) {
1163
1179
  e._observer = void 0, e._queue = void 0, e._state = "closed";
1164
1180
  }
1165
- function _o(e) {
1181
+ function wr(e) {
1166
1182
  let t = e._queue;
1167
1183
  if (t) {
1168
1184
  e._queue = void 0, e._state = "ready";
1169
- for (let r = 0; r < t.length && (qt(e, t[r].type, t[r].value), e._state !== "closed"); ++r)
1185
+ for (let o = 0; o < t.length && (zt(e, t[o].type, t[o].value), e._state !== "closed"); ++o)
1170
1186
  ;
1171
1187
  }
1172
1188
  }
1173
- function qt(e, t, r) {
1189
+ function zt(e, t, o) {
1174
1190
  e._state = "running";
1175
- let o = e._observer;
1191
+ let r = e._observer;
1176
1192
  try {
1177
- let s = we(o, t);
1193
+ let s = we(r, t);
1178
1194
  switch (t) {
1179
1195
  case "next":
1180
- s && s.call(o, r);
1196
+ s && s.call(r, o);
1181
1197
  break;
1182
1198
  case "error":
1183
- if ($e(e), s) s.call(o, r);
1184
- else throw r;
1199
+ if ($e(e), s) s.call(r, o);
1200
+ else throw o;
1185
1201
  break;
1186
1202
  case "complete":
1187
- $e(e), s && s.call(o);
1203
+ $e(e), s && s.call(r);
1188
1204
  break;
1189
1205
  }
1190
1206
  } catch (s) {
1191
1207
  te(s);
1192
1208
  }
1193
- e._state === "closed" ? Ut(e) : e._state === "running" && (e._state = "ready");
1209
+ e._state === "closed" ? qt(e) : e._state === "running" && (e._state = "ready");
1194
1210
  }
1195
- function je(e, t, r) {
1211
+ function je(e, t, o) {
1196
1212
  if (e._state !== "closed") {
1197
1213
  if (e._state === "buffering") {
1198
1214
  e._queue.push({
1199
1215
  type: t,
1200
- value: r
1216
+ value: o
1201
1217
  });
1202
1218
  return;
1203
1219
  }
1204
1220
  if (e._state !== "ready") {
1205
1221
  e._state = "buffering", e._queue = [{
1206
1222
  type: t,
1207
- value: r
1208
- }], fe(() => _o(e));
1223
+ value: o
1224
+ }], fe(() => wr(e));
1209
1225
  return;
1210
1226
  }
1211
- qt(e, t, r);
1227
+ zt(e, t, o);
1212
1228
  }
1213
1229
  }
1214
- class go {
1215
- constructor(t, r) {
1230
+ class Er {
1231
+ constructor(t, o) {
1216
1232
  this._cleanup = void 0, this._observer = t, this._queue = void 0, this._state = "initializing";
1217
- let o = this, s = {
1233
+ let r = this, s = {
1218
1234
  get closed() {
1219
- return o._state === "closed";
1235
+ return r._state === "closed";
1220
1236
  },
1221
1237
  next(i) {
1222
- je(o, "next", i);
1238
+ je(r, "next", i);
1223
1239
  },
1224
1240
  error(i) {
1225
- je(o, "error", i);
1241
+ je(r, "error", i);
1226
1242
  },
1227
1243
  complete() {
1228
- je(o, "complete");
1244
+ je(r, "complete");
1229
1245
  }
1230
1246
  };
1231
1247
  try {
1232
- this._cleanup = r.call(void 0, s);
1248
+ this._cleanup = o.call(void 0, s);
1233
1249
  } catch (i) {
1234
1250
  s.error(i);
1235
1251
  }
@@ -1239,7 +1255,7 @@ class go {
1239
1255
  return this._state === "closed";
1240
1256
  }
1241
1257
  unsubscribe() {
1242
- this._state !== "closed" && ($e(this), Ut(this));
1258
+ this._state !== "closed" && ($e(this), qt(this));
1243
1259
  }
1244
1260
  }
1245
1261
  let Se = class ye {
@@ -1253,81 +1269,81 @@ let Se = class ye {
1253
1269
  next: t,
1254
1270
  error: arguments[1],
1255
1271
  complete: arguments[2]
1256
- }), new go(t, this._subscriber);
1272
+ }), new Er(t, this._subscriber);
1257
1273
  }
1258
1274
  forEach(t) {
1259
- return new Promise((r, o) => {
1275
+ return new Promise((o, r) => {
1260
1276
  if (typeof t != "function") {
1261
- o(new TypeError(t + " is not a function"));
1277
+ r(new TypeError(t + " is not a function"));
1262
1278
  return;
1263
1279
  }
1264
1280
  function s() {
1265
- i.unsubscribe(), r();
1281
+ i.unsubscribe(), o();
1266
1282
  }
1267
1283
  let i = this.subscribe({
1268
1284
  next(a) {
1269
1285
  try {
1270
1286
  t(a, s);
1271
1287
  } catch (c) {
1272
- o(c), i.unsubscribe();
1288
+ r(c), i.unsubscribe();
1273
1289
  }
1274
1290
  },
1275
- error: o,
1276
- complete: r
1291
+ error: r,
1292
+ complete: o
1277
1293
  });
1278
1294
  });
1279
1295
  }
1280
1296
  map(t) {
1281
1297
  if (typeof t != "function") throw new TypeError(t + " is not a function");
1282
- let r = oe(this);
1283
- return new r((o) => this.subscribe({
1298
+ let o = re(this);
1299
+ return new o((r) => this.subscribe({
1284
1300
  next(s) {
1285
1301
  try {
1286
1302
  s = t(s);
1287
1303
  } catch (i) {
1288
- return o.error(i);
1304
+ return r.error(i);
1289
1305
  }
1290
- o.next(s);
1306
+ r.next(s);
1291
1307
  },
1292
1308
  error(s) {
1293
- o.error(s);
1309
+ r.error(s);
1294
1310
  },
1295
1311
  complete() {
1296
- o.complete();
1312
+ r.complete();
1297
1313
  }
1298
1314
  }));
1299
1315
  }
1300
1316
  filter(t) {
1301
1317
  if (typeof t != "function") throw new TypeError(t + " is not a function");
1302
- let r = oe(this);
1303
- return new r((o) => this.subscribe({
1318
+ let o = re(this);
1319
+ return new o((r) => this.subscribe({
1304
1320
  next(s) {
1305
1321
  try {
1306
1322
  if (!t(s)) return;
1307
1323
  } catch (i) {
1308
- return o.error(i);
1324
+ return r.error(i);
1309
1325
  }
1310
- o.next(s);
1326
+ r.next(s);
1311
1327
  },
1312
1328
  error(s) {
1313
- o.error(s);
1329
+ r.error(s);
1314
1330
  },
1315
1331
  complete() {
1316
- o.complete();
1332
+ r.complete();
1317
1333
  }
1318
1334
  }));
1319
1335
  }
1320
1336
  reduce(t) {
1321
1337
  if (typeof t != "function") throw new TypeError(t + " is not a function");
1322
- let r = oe(this), o = arguments.length > 1, s = !1, a = arguments[1];
1323
- return new r((c) => this.subscribe({
1338
+ let o = re(this), r = arguments.length > 1, s = !1, a = arguments[1];
1339
+ return new o((c) => this.subscribe({
1324
1340
  next(l) {
1325
- let u = !s;
1326
- if (s = !0, !u || o)
1341
+ let d = !s;
1342
+ if (s = !0, !d || r)
1327
1343
  try {
1328
1344
  a = t(a, l);
1329
- } catch (d) {
1330
- return c.error(d);
1345
+ } catch (u) {
1346
+ return c.error(u);
1331
1347
  }
1332
1348
  else
1333
1349
  a = l;
@@ -1336,29 +1352,29 @@ let Se = class ye {
1336
1352
  c.error(l);
1337
1353
  },
1338
1354
  complete() {
1339
- if (!s && !o) return c.error(new TypeError("Cannot reduce an empty sequence"));
1355
+ if (!s && !r) return c.error(new TypeError("Cannot reduce an empty sequence"));
1340
1356
  c.next(a), c.complete();
1341
1357
  }
1342
1358
  }));
1343
1359
  }
1344
1360
  async all() {
1345
1361
  let t = [];
1346
- return await this.forEach((r) => t.push(r)), t;
1362
+ return await this.forEach((o) => t.push(o)), t;
1347
1363
  }
1348
1364
  concat(...t) {
1349
- let r = oe(this);
1350
- return new r((o) => {
1365
+ let o = re(this);
1366
+ return new o((r) => {
1351
1367
  let s, i = 0;
1352
1368
  function a(c) {
1353
1369
  s = c.subscribe({
1354
1370
  next(l) {
1355
- o.next(l);
1371
+ r.next(l);
1356
1372
  },
1357
1373
  error(l) {
1358
- o.error(l);
1374
+ r.error(l);
1359
1375
  },
1360
1376
  complete() {
1361
- i === t.length ? (s = void 0, o.complete()) : a(r.from(t[i++]));
1377
+ i === t.length ? (s = void 0, r.complete()) : a(o.from(t[i++]));
1362
1378
  }
1363
1379
  });
1364
1380
  }
@@ -1369,39 +1385,39 @@ let Se = class ye {
1369
1385
  }
1370
1386
  flatMap(t) {
1371
1387
  if (typeof t != "function") throw new TypeError(t + " is not a function");
1372
- let r = oe(this);
1373
- return new r((o) => {
1388
+ let o = re(this);
1389
+ return new o((r) => {
1374
1390
  let s = [], i = this.subscribe({
1375
1391
  next(c) {
1376
1392
  if (t)
1377
1393
  try {
1378
1394
  c = t(c);
1379
- } catch (u) {
1380
- return o.error(u);
1395
+ } catch (d) {
1396
+ return r.error(d);
1381
1397
  }
1382
- let l = r.from(c).subscribe({
1383
- next(u) {
1384
- o.next(u);
1398
+ let l = o.from(c).subscribe({
1399
+ next(d) {
1400
+ r.next(d);
1385
1401
  },
1386
- error(u) {
1387
- o.error(u);
1402
+ error(d) {
1403
+ r.error(d);
1388
1404
  },
1389
1405
  complete() {
1390
- let u = s.indexOf(l);
1391
- u >= 0 && s.splice(u, 1), a();
1406
+ let d = s.indexOf(l);
1407
+ d >= 0 && s.splice(d, 1), a();
1392
1408
  }
1393
1409
  });
1394
1410
  s.push(l);
1395
1411
  },
1396
1412
  error(c) {
1397
- o.error(c);
1413
+ r.error(c);
1398
1414
  },
1399
1415
  complete() {
1400
1416
  a();
1401
1417
  }
1402
1418
  });
1403
1419
  function a() {
1404
- i.closed && s.length === 0 && o.complete();
1420
+ i.closed && s.length === 0 && r.complete();
1405
1421
  }
1406
1422
  return () => {
1407
1423
  s.forEach((c) => c.unsubscribe()), i.unsubscribe();
@@ -1412,26 +1428,26 @@ let Se = class ye {
1412
1428
  return this;
1413
1429
  }
1414
1430
  static from(t) {
1415
- let r = typeof this == "function" ? this : ye;
1431
+ let o = typeof this == "function" ? this : ye;
1416
1432
  if (t == null) throw new TypeError(t + " is not an object");
1417
- let o = we(t, xe);
1418
- if (o) {
1419
- let s = o.call(t);
1433
+ let r = we(t, xe);
1434
+ if (r) {
1435
+ let s = r.call(t);
1420
1436
  if (Object(s) !== s) throw new TypeError(s + " is not an object");
1421
- return yo(s) && s.constructor === r ? s : new r((i) => s.subscribe(i));
1437
+ return hr(s) && s.constructor === o ? s : new o((i) => s.subscribe(i));
1422
1438
  }
1423
- if (xt("iterator") && (o = we(t, fo), o))
1424
- return new r((s) => {
1439
+ if ($t("iterator") && (r = we(t, gr), r))
1440
+ return new o((s) => {
1425
1441
  fe(() => {
1426
1442
  if (!s.closed) {
1427
- for (let i of o.call(t))
1443
+ for (let i of r.call(t))
1428
1444
  if (s.next(i), s.closed) return;
1429
1445
  s.complete();
1430
1446
  }
1431
1447
  });
1432
1448
  });
1433
1449
  if (Array.isArray(t))
1434
- return new r((s) => {
1450
+ return new o((s) => {
1435
1451
  fe(() => {
1436
1452
  if (!s.closed) {
1437
1453
  for (let i = 0; i < t.length; ++i)
@@ -1443,18 +1459,18 @@ let Se = class ye {
1443
1459
  throw new TypeError(t + " is not observable");
1444
1460
  }
1445
1461
  static of(...t) {
1446
- let r = typeof this == "function" ? this : ye;
1447
- return new r((o) => {
1462
+ let o = typeof this == "function" ? this : ye;
1463
+ return new o((r) => {
1448
1464
  fe(() => {
1449
- if (!o.closed) {
1465
+ if (!r.closed) {
1450
1466
  for (let s = 0; s < t.length; ++s)
1451
- if (o.next(t[s]), o.closed) return;
1452
- o.complete();
1467
+ if (r.next(t[s]), r.closed) return;
1468
+ r.complete();
1453
1469
  }
1454
1470
  });
1455
1471
  });
1456
1472
  }
1457
- static get [$t]() {
1473
+ static get [Ut]() {
1458
1474
  return this;
1459
1475
  }
1460
1476
  };
@@ -1466,33 +1482,33 @@ Object.defineProperty(Se, Symbol("extensions"), {
1466
1482
  },
1467
1483
  configurable: !0
1468
1484
  });
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
- const r = { context: e, flowCallbacks: t };
1485
+ var Cr = be.Observable;
1486
+ const br = /* @__PURE__ */ xt(Cr), { log__: Sr, err__: vr } = K("init-flows"), Pr = () => ("ojs_init_results" in window || (window.ojs_init_results = {}), window.ojs_init_results), kr = (e, t) => {
1487
+ const o = { context: e, flowCallbacks: t };
1472
1488
  return console.log("[OJS] initializing OJS flows..."), {
1473
1489
  // Stripe PR
1474
- stripePR: ct("stripePR", ae.stripePR.init(r)),
1490
+ stripePR: lt("stripePR", ae.stripePR.init(o)),
1475
1491
  // Stripe Link
1476
- stripeLink: ct("stripeLink", ae.stripeLink.init(r))
1492
+ stripeLink: lt("stripeLink", ae.stripeLink.init(o))
1477
1493
  // 👉 Add initialization flows here
1478
1494
  };
1479
- }, ct = (e, t) => {
1480
- const r = new wo((o) => {
1481
- o.next({ status: "loading" }), t.then((s) => {
1482
- o.next({ status: "loaded", result: s });
1495
+ }, lt = (e, t) => {
1496
+ const o = new br((r) => {
1497
+ r.next({ status: "loading" }), t.then((s) => {
1498
+ r.next({ status: "loaded", result: s });
1483
1499
  }).catch((s) => {
1484
- o.next({ status: "error", message: s.message });
1500
+ r.next({ status: "error", message: s.message });
1485
1501
  });
1486
1502
  });
1487
- return r.subscribe({
1488
- next: (o) => {
1489
- Eo(`${e} flow result`, o), bo()[e] = o;
1503
+ return o.subscribe({
1504
+ next: (r) => {
1505
+ Sr(`${e} flow result`, r), Pr()[e] = r;
1490
1506
  },
1491
- error: (o) => {
1492
- throw Co(`${e} flow initialization error:
1493
- ${JSON.stringify(o)}`), o;
1507
+ error: (r) => {
1508
+ throw vr(`${e} flow initialization error:
1509
+ ${JSON.stringify(r)}`), r;
1494
1510
  }
1495
- }), r;
1511
+ }), o;
1496
1512
  }, pe = {
1497
1513
  isLoading: !0,
1498
1514
  isAvailable: !1,
@@ -1503,216 +1519,216 @@ ${JSON.stringify(o)}`), o;
1503
1519
  and ".isAvailable" to know if a payment request is available.`
1504
1520
  );
1505
1521
  }
1506
- }, lt = {
1522
+ }, ut = {
1507
1523
  isLoading: !1,
1508
1524
  isAvailable: !1,
1509
1525
  startFlow: async () => {
1510
1526
  console.error("startFlow triggered when payment request is not available.");
1511
1527
  }
1512
1528
  };
1513
- var Ve = { exports: {} }, Po = dn;
1514
- function zt(e, t, r) {
1515
- var o = typeof t == "function";
1516
- Po.useEffect(function() {
1529
+ var Ve = { exports: {} }, Or = fn;
1530
+ function Jt(e, t, o) {
1531
+ var r = typeof t == "function";
1532
+ Or.useEffect(function() {
1517
1533
  var s, i = !0, a = e(function() {
1518
1534
  return i;
1519
1535
  });
1520
1536
  return Promise.resolve(a).then(function(c) {
1521
1537
  s = c;
1522
1538
  }), function() {
1523
- i = !1, o && t(s);
1539
+ i = !1, r && t(s);
1524
1540
  };
1525
- }, o ? r : t);
1541
+ }, r ? o : t);
1526
1542
  }
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
- const r = se(!1), o = se(), s = se(e), i = W(() => r.current, []), a = W(() => {
1533
- r.current = !1, o.current && clearTimeout(o.current), o.current = setTimeout(() => {
1534
- r.current = !0, s.current();
1543
+ Ve.exports = Jt;
1544
+ Ve.exports.useAsyncEffect = Jt;
1545
+ var Rr = Ve.exports;
1546
+ const dt = /* @__PURE__ */ xt(Rr);
1547
+ function Ir(e, t = 0) {
1548
+ const o = se(!1), r = se(), s = se(e), i = B(() => o.current, []), a = B(() => {
1549
+ o.current = !1, r.current && clearTimeout(r.current), r.current = setTimeout(() => {
1550
+ o.current = !0, s.current();
1535
1551
  }, t);
1536
- }, [t]), c = W(() => {
1537
- r.current = null, o.current && clearTimeout(o.current);
1552
+ }, [t]), c = B(() => {
1553
+ o.current = null, r.current && clearTimeout(r.current);
1538
1554
  }, []);
1539
1555
  return J(() => {
1540
1556
  s.current = e;
1541
1557
  }, [e]), J(() => (a(), c), [t]), [i, c, a];
1542
1558
  }
1543
- function Oo(e, t = 0, r = []) {
1544
- const [o, s, i] = ko(e, t);
1545
- return J(i, r), [o, s];
1559
+ function Ar(e, t = 0, o = []) {
1560
+ const [r, s, i] = Ir(e, t);
1561
+ return J(i, o), [r, s];
1546
1562
  }
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
- if (!o || !e)
1563
+ const Tr = (e, t, o, r) => {
1564
+ const [s, i] = C(""), [a, c] = C(""), [l, d] = C(null), [u, _] = C(!1), [w, g] = C(null);
1565
+ return dt(async () => {
1566
+ if (!r || !e)
1551
1567
  return;
1552
- const C = await Fr(o, _.PROMOTION_CODE);
1553
- C == null || C.addEventListener("input", () => {
1554
- f(!0), h(null), i(C.value);
1568
+ const h = await xo(r, y.PROMOTION_CODE);
1569
+ h == null || h.addEventListener("input", () => {
1570
+ _(!0), g(null), i(h.value);
1555
1571
  });
1556
- }, [!!o, e]), Oo(
1572
+ }, [!!r, e]), Ar(
1557
1573
  () => {
1558
1574
  e && c(s);
1559
1575
  },
1560
1576
  1e3,
1561
1577
  [s, e]
1562
- ), ut(
1563
- async (C) => {
1578
+ ), dt(
1579
+ async (h) => {
1564
1580
  try {
1565
- if (!t || !r || !e)
1581
+ if (!t || !o || !e)
1566
1582
  return;
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
- } catch (M) {
1570
- C() && (console.error("[useDynamicPreview] Error doing preview", ie(M)), h(ie(M)));
1583
+ const Pe = (await W(t)).mode === "setup", N = await Ue(t, o, Pe, a);
1584
+ console.log("[useDynamicPreview] Querying. Promo code:", a), h() ? (console.log("[useDynamicPreview] Setting preview:", a, N), g(null), d(N)) : console.log("[useDynamicPreview] Discarding:", N);
1585
+ } catch (D) {
1586
+ h() && (console.error("[useDynamicPreview] Error doing preview", ie(D)), g(ie(D)));
1571
1587
  } finally {
1572
- C() && f(!1);
1588
+ h() && _(!1);
1573
1589
  }
1574
1590
  },
1575
- [!t, !r, a, e]
1591
+ [!t, !o, a, e]
1576
1592
  ), {
1577
1593
  amount: l,
1578
- isLoading: d,
1579
- error: m
1594
+ isLoading: u,
1595
+ error: w
1580
1596
  };
1581
- }, Jt = (e = {}) => {
1582
- const [t, r] = E(e), o = ee(
1597
+ }, Ht = (e = {}) => {
1598
+ const [t, o] = C(e), r = ee(
1583
1599
  () => ({
1584
1600
  set: (i, a) => {
1585
- r((c) => ({
1601
+ o((c) => ({
1586
1602
  ...c,
1587
1603
  [i]: a
1588
1604
  }));
1589
1605
  },
1590
1606
  setAll: (i) => {
1591
- r(i);
1607
+ o(i);
1592
1608
  },
1593
1609
  remove: (i) => {
1594
- r((a) => {
1610
+ o((a) => {
1595
1611
  const { [i]: c, ...l } = a;
1596
1612
  return l;
1597
1613
  });
1598
1614
  },
1599
- reset: () => r(e)
1615
+ reset: () => o(e)
1600
1616
  }),
1601
1617
  // eslint-disable-next-line react-hooks/exhaustive-deps
1602
- [r]
1618
+ [o]
1603
1619
  ), s = {
1604
- get: W((i) => t[i], [t]),
1605
- ...o
1620
+ get: B((i) => t[i], [t]),
1621
+ ...r
1606
1622
  };
1607
1623
  return [t, s];
1608
- }, Io = () => {
1609
- const [e, t] = E(0), [r, o] = Jt({
1624
+ }, Mr = () => {
1625
+ const [e, t] = C(0), [o, r] = Ht({
1610
1626
  card: void 0,
1611
1627
  "card-cvc": void 0,
1612
1628
  "card-expiry": void 0,
1613
1629
  "card-number": void 0
1614
- }), s = Object.values(r).filter((i) => i !== void 0)[0] ?? null;
1630
+ }), s = Object.values(o).filter((i) => i !== void 0)[0] ?? null;
1615
1631
  return {
1616
- cdeConns: r,
1632
+ cdeConns: o,
1617
1633
  anyCdeConn: s,
1618
1634
  connectToCdeIframe: async (i, a) => {
1619
- o.set(i, await lr(a)), t(Object.values(r).length);
1635
+ r.set(i, await po(a)), t(Object.values(o).length);
1620
1636
  },
1621
1637
  numCdeConns: e
1622
1638
  };
1623
- }, Ao = (e) => {
1624
- const t = e.replace("ojs-", "").replace("-element", ""), r = Pn.safeParse(t);
1625
- if (!r.success)
1639
+ }, Dr = (e) => {
1640
+ const t = e.replace("ojs-", "").replace("-element", ""), o = On.safeParse(t);
1641
+ if (!o.success)
1626
1642
  throw new Error(
1627
1643
  `Invalid element id: ${e}, it needs to be in the format "ojs-{elementType}-element" (e.g. "ojs-card-number-element")`
1628
1644
  );
1629
- return r.data;
1630
- }, xo = (e) => {
1645
+ return o.data;
1646
+ }, qr = (e) => {
1631
1647
  const {
1632
1648
  children: t,
1633
- checkoutSecureToken: r,
1634
- className: o,
1649
+ checkoutSecureToken: o,
1650
+ className: r,
1635
1651
  onFocus: s,
1636
1652
  onBlur: i,
1637
1653
  onChange: a,
1638
1654
  onLoad: c,
1639
1655
  onLoadError: l,
1640
- onValidationError: u,
1641
- onCheckoutStarted: d,
1642
- onCheckoutSuccess: f,
1643
- onCheckoutError: m,
1644
- onSetupPaymentMethodSuccess: h,
1645
- baseUrl: C,
1646
- enableDynamicPreviews: M,
1647
- customInitParams: ve
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({
1656
+ onValidationError: d,
1657
+ onCheckoutStarted: u,
1658
+ onCheckoutSuccess: _,
1659
+ onCheckoutError: w,
1660
+ onSetupPaymentMethodSuccess: g,
1661
+ baseUrl: h,
1662
+ enableDynamicPreviews: D,
1663
+ customInitParams: Pe
1664
+ } = e, N = h ?? hn, [Vt, Kt] = C(void 0), [Ke, Yt] = C([]), [Zt, Bt] = C("1px"), [ke, Wt] = C(!1), [$, Oe] = C(void 0), [Ye, Y] = C(!1), [Z, Gt] = C([]), [ne, Qt] = C({}), [Ze, de] = C(0), [Be, H] = C(!1), [U, Xt] = C(void 0), [We, en] = C(void 0), [Ge, tn] = C(void 0), [q, nn] = C(void 0), [Re] = C(void 0), G = ee(() => `opjs-form-${mt()}`, []), F = se(null), { cdeConns: Qe, anyCdeConn: Q, connectToCdeIframe: on, numCdeConns: Ie } = Mr(), [rn, sn] = C(null), [Xe, X] = Ht({
1649
1665
  apple_pay: pe,
1650
1666
  google_pay: pe
1651
- });
1667
+ }), [an, cn] = C(null);
1652
1668
  J(() => {
1653
- const p = { version: "0.1.10", release_version: "0.1.10" };
1654
- window.ojs_version = p, console.log("OJS version:", p);
1669
+ const m = { version: "0.1.11", release_version: "0.1.11-alpha.6e4e361" };
1670
+ window.ojs_version = m, console.log("OJS version:", m);
1655
1671
  }, []);
1656
- const sn = Ro(
1657
- M ?? !1,
1672
+ const ln = Tr(
1673
+ D ?? !1,
1658
1674
  Q,
1659
- r,
1660
- D.current
1661
- ), Ae = W(
1662
- (p) => {
1663
- if (p.origin !== N || !p.source) return;
1664
- const F = p.source;
1665
- if (!$r(p.data))
1675
+ o,
1676
+ F.current
1677
+ ), Ae = B(
1678
+ (m) => {
1679
+ if (m.origin !== N || !m.source) return;
1680
+ const M = m.source;
1681
+ if (!Jo(m.data))
1666
1682
  return;
1667
- const I = JSON.parse(p.data), g = ir(I), z = g.elementId;
1668
- if (g.formId !== G || !z) {
1669
- console.warn("[form] Ignoring unknown event:", g);
1683
+ const A = JSON.parse(m.data), p = lo(A), z = p.elementId;
1684
+ if (p.formId !== G || !z) {
1685
+ console.warn("[form] Ignoring unknown event:", p);
1670
1686
  return;
1671
1687
  }
1672
- if (g.nonce in Ke) {
1673
- console.warn("[form] Ignoring duplicate event:", g);
1688
+ if (p.nonce in Ke) {
1689
+ console.warn("[form] Ignoring duplicate event:", p);
1674
1690
  return;
1675
1691
  }
1676
- Kt((k) => [...k, g.nonce]);
1677
- const y = g.payload, v = y.type;
1678
- if (console.log(`[form] Received ${v} event from ${z}:`, g.payload), v === w.enum.LAYOUT) {
1679
- const k = y.height ? `${y.height}px` : "100%";
1680
- Zt(k), console.log(`[form] Element height set to: ${k}`);
1681
- } else if (v === w.enum.FOCUS && s)
1682
- s(g.elementId);
1683
- else if (v === w.enum.BLUR && i)
1684
- i(g.elementId);
1685
- else if (v === w.enum.CHANGE && a)
1686
- a(g.elementId);
1687
- else if (v === w.enum.LOADED) {
1688
- const k = Z.find((b) => b.contentWindow === F);
1689
- if (Y(!1), !k) {
1690
- console.warn("[form] Ignoring LOADED event from unregistered iframe:", g);
1692
+ Yt((O) => [...O, p.nonce]);
1693
+ const f = p.payload, k = f.type;
1694
+ if (console.log(`[form] Received ${k} event from ${z}:`, p.payload), k === E.enum.LAYOUT) {
1695
+ const O = f.height ? `${f.height}px` : "100%";
1696
+ Bt(O), console.log(`[form] Element height set to: ${O}`);
1697
+ } else if (k === E.enum.FOCUS && s)
1698
+ s(p.elementId);
1699
+ else if (k === E.enum.BLUR && i)
1700
+ i(p.elementId);
1701
+ else if (k === E.enum.CHANGE && a)
1702
+ a(p.elementId);
1703
+ else if (k === E.enum.LOADED) {
1704
+ const O = Z.find((b) => b.contentWindow === M);
1705
+ if (Y(!1), !O) {
1706
+ console.warn("[form] Ignoring LOADED event from unregistered iframe:", p);
1691
1707
  return;
1692
1708
  }
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);
1694
- } else if (v === w.enum.TOKENIZE_STARTED)
1709
+ Qt((b) => ({ ...b, [z]: M })), tn(f.totalAmountAtoms), en(f.currency), nn(f.checkoutPaymentMethods), U || Xt(f.sessionId), console.log("[form] Element loaded with prefill data:", f);
1710
+ } else if (k === E.enum.TOKENIZE_STARTED)
1695
1711
  console.log("[form] Tokenization started"), Y(!0);
1696
- else if (v === w.enum.CHECKOUT_STARTED)
1697
- d && d();
1698
- else if (v === w.enum.PAYMENT_FLOW_STARTED) {
1712
+ else if (k === E.enum.CHECKOUT_STARTED)
1713
+ u && u();
1714
+ else if (k === E.enum.PAYMENT_FLOW_STARTED) {
1699
1715
  if (!$)
1700
1716
  throw new Error("extraData not populated");
1701
1717
  if (!Q)
1702
1718
  throw new Error("Not connected to CDE");
1703
1719
  (async () => {
1704
- const b = y.nextActionMetadata.type;
1705
- if (console.log("[form] Confirm payment flow: next actions:", y.nextActionMetadata), b === void 0)
1720
+ const b = f.nextActionMetadata.type;
1721
+ if (console.log("[form] Confirm payment flow: next actions:", f.nextActionMetadata), b === void 0)
1706
1722
  console.log("[form] Confirming payment flow (No-op)");
1707
1723
  else if (b === "stripe_3ds")
1708
- console.log("[form] Confirming payment flow (Stripe 3DS"), await rr(y);
1724
+ console.log("[form] Confirming payment flow (Stripe 3DS"), await io(f);
1709
1725
  else if (b === "stripe_payment_request") {
1710
1726
  if (!Re)
1711
1727
  throw new Error("Stripe PM not set");
1712
- console.log("[form] Confirming payment flow (Stripe PR)"), await tr(y, Re);
1728
+ console.log("[form] Confirming payment flow (Stripe PR)"), await ro(f, Re);
1713
1729
  } else
1714
1730
  throw new Error(`Unknown next action type: ${b}`);
1715
- const j = await B(Q);
1731
+ const j = await W(Q);
1716
1732
  if (j.mode === "setup") {
1717
1733
  const { payment_methods: L } = await Ce(Q, {
1718
1734
  secure_token: j.token,
@@ -1720,7 +1736,7 @@ const Ro = (e, t, r, o) => {
1720
1736
  });
1721
1737
  if (L.length !== 1)
1722
1738
  throw new Error(`Expected exactly one payment method, got ${L.length}`);
1723
- return console.log("[form] PF setup payment method complete:", L), Y(!1), de(0), H(!1), h && h(L[0].id), {
1739
+ return console.log("[form] PF setup payment method complete:", L), Y(!1), de(0), H(!1), g && g(L[0].id), {
1724
1740
  proceedToCheckout: !1
1725
1741
  };
1726
1742
  } else
@@ -1735,46 +1751,46 @@ const Ro = (e, t, r, o) => {
1735
1751
  }
1736
1752
  console.log("[form] Starting checkout from payment flow.");
1737
1753
  let j;
1738
- if ($.checkoutPaymentMethod.provider === "credit_card" && (j = (L = y.startPFMetadata) == null ? void 0 : L.cc_pm_id, !j))
1754
+ if ($.checkoutPaymentMethod.provider === "credit_card" && (j = (L = f.startPFMetadata) == null ? void 0 : L.cc_pm_id, !j))
1739
1755
  throw new Error("CC PM ID not found");
1740
1756
  Ne(
1741
- F,
1757
+ M,
1742
1758
  G,
1743
1759
  z,
1744
1760
  { ...$, type: "CHECKOUT", doNotUseLegacyCCFlow: !0, existingCCPMId: j },
1745
1761
  N
1746
- ), H(!0), Oe(void 0), d && d();
1762
+ ), H(!0), Oe(void 0), u && u();
1747
1763
  }).catch((b) => {
1748
1764
  console.log("[form] Confirmation payment flow error"), console.error(b);
1749
1765
  const j = ie(b);
1750
- Y(!1), H(!1), m && m(j);
1766
+ Y(!1), H(!1), w && w(j);
1751
1767
  });
1752
- } else if (v === w.enum.TOKENIZE_SUCCESS && $) {
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));
1755
- } else if (v === w.enum.CHECKOUT_SUCCESS)
1756
- console.log("[form] Checkout complete:", y), Y(!1), de(0), H(!1), f && f(y.invoiceUrls, y.subscriptionIds, y.customerId);
1757
- else if (v === w.enum.SETUP_PAYMENT_METHOD_SUCCESS)
1758
- console.log("[form] Setup payment method complete:", y), Y(!1), de(0), H(!1), h && h(y.paymentMethodId);
1759
- else if (v === w.enum.LOAD_ERROR)
1760
- console.error("[form] Error loading iframe:", y.message), l && l(y.message);
1761
- else if (v === w.enum.VALIDATION_ERROR) {
1762
- const k = $ == null ? void 0 : $.checkoutPaymentMethod.provider;
1763
- (k === "credit_card" || k === void 0) && (console.error(`[form] Validation error for ${y.elementType}:`, y.errors), u && u(y.elementType, y.errors, z));
1764
- } else if (v === w.enum.TOKENIZE_ERROR || v === w.enum.CHECKOUT_ERROR)
1765
- if (console.error("[form] API error from element:", y.message), y.message === "3DS_REQUIRED") {
1766
- const k = q == null ? void 0 : q.find((b) => b.provider === "credit_card");
1767
- if (!U || !D.current || !u || !k) return;
1768
+ } else if (k === E.enum.TOKENIZE_SUCCESS && $) {
1769
+ const O = Ze + 1, b = O === Object.keys(ne).length;
1770
+ !Be && (b || f.isReadyForCheckout) ? (console.log("[form] Tokenized card is ready for checkout"), Ne(M, G, z, $, N), H(!0), Oe(void 0)) : (console.log(`[form] Element ${z} finished tokenization but card not yet ready for checkout`), de(O));
1771
+ } else if (k === E.enum.CHECKOUT_SUCCESS)
1772
+ console.log("[form] Checkout complete:", f), Y(!1), de(0), H(!1), _ && _(f.invoiceUrls, f.subscriptionIds, f.customerId);
1773
+ else if (k === E.enum.SETUP_PAYMENT_METHOD_SUCCESS)
1774
+ console.log("[form] Setup payment method complete:", f), Y(!1), de(0), H(!1), g && g(f.paymentMethodId);
1775
+ else if (k === E.enum.LOAD_ERROR)
1776
+ console.error("[form] Error loading iframe:", f.message), l && l(f.message);
1777
+ else if (k === E.enum.VALIDATION_ERROR) {
1778
+ const O = $ == null ? void 0 : $.checkoutPaymentMethod.provider;
1779
+ (O === "credit_card" || O === void 0) && (console.error(`[form] Validation error for ${f.elementType}:`, f.errors), d && d(f.elementType, f.errors, z));
1780
+ } else if (k === E.enum.TOKENIZE_ERROR || k === E.enum.CHECKOUT_ERROR)
1781
+ if (console.error("[form] API error from element:", f.message), f.message === "3DS_REQUIRED") {
1782
+ const O = q == null ? void 0 : q.find((b) => b.provider === "credit_card");
1783
+ if (!U || !F.current || !d || !O) return;
1768
1784
  for (const [b, j] of Object.entries(ne)) {
1769
1785
  if (!j) continue;
1770
- const L = sr(
1771
- w.enum.START_PAYMENT_FLOW,
1786
+ const L = co(
1787
+ E.enum.START_PAYMENT_FLOW,
1772
1788
  U,
1773
- D.current,
1774
- u,
1789
+ F.current,
1790
+ d,
1775
1791
  // Only stripe supports frontend 3DS right now,
1776
1792
  // so we pass processor_name: 'stripe' to tell delegator to only use stripe
1777
- { ...k, processor_name: "stripe" },
1793
+ { ...O, processor_name: "stripe" },
1778
1794
  !1
1779
1795
  );
1780
1796
  if (L) {
@@ -1783,7 +1799,7 @@ const Ro = (e, t, r, o) => {
1783
1799
  }
1784
1800
  }
1785
1801
  } else
1786
- Y(!1), H(!1), m && m(y.message);
1802
+ Y(!1), H(!1), w && w(f.message);
1787
1803
  },
1788
1804
  [
1789
1805
  G,
@@ -1793,169 +1809,166 @@ const Ro = (e, t, r, o) => {
1793
1809
  Z,
1794
1810
  ne,
1795
1811
  Ze,
1796
- We,
1812
+ Be,
1797
1813
  i,
1798
1814
  a,
1799
1815
  s,
1800
1816
  l,
1801
- d,
1802
- f,
1803
- h,
1804
- m,
1805
1817
  u,
1818
+ _,
1819
+ g,
1820
+ w,
1821
+ d,
1806
1822
  N,
1807
1823
  Re,
1808
1824
  q,
1809
1825
  Q
1810
1826
  ]
1811
1827
  ), Te = ee(() => {
1812
- const p = () => {
1828
+ const m = () => {
1813
1829
  };
1814
1830
  return {
1815
- onCheckoutError: re("onCheckoutError", m ?? p),
1816
- onCheckoutStarted: re("onCheckoutStarted", d ?? p),
1817
- onCheckoutSuccess: re("onCheckoutSuccess", f ?? p),
1818
- onSetupPaymentMethodSuccess: re("onSetupPaymentMethodSuccess", h ?? p),
1819
- onValidationError: re("onValidationError", u ?? p)
1831
+ onCheckoutError: oe("onCheckoutError", w ?? m),
1832
+ onCheckoutStarted: oe("onCheckoutStarted", u ?? m),
1833
+ onCheckoutSuccess: oe("onCheckoutSuccess", _ ?? m),
1834
+ onSetupPaymentMethodSuccess: oe("onSetupPaymentMethodSuccess", g ?? m),
1835
+ onValidationError: oe("onValidationError", d ?? m)
1820
1836
  };
1821
- }, [m, d, f, h, u]), Me = () => {
1822
- if (console.log(D.current, U, q), !D.current || !U || !q) return null;
1823
- const p = /* @__PURE__ */ new Map();
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) : {
1827
- formDiv: D.current,
1837
+ }, [w, u, _, g, d]), Me = () => {
1838
+ if (console.log(F.current, U, q), !F.current || !U || !q) return null;
1839
+ const m = /* @__PURE__ */ new Map();
1840
+ return Object.entries(Qe).forEach(([A, p]) => {
1841
+ p && m.set(A, p);
1842
+ }), m.size === 0 ? (console.log("[OJS] no CDE connections!"), null) : {
1843
+ formDiv: F.current,
1828
1844
  elementsSessionId: U,
1829
1845
  checkoutPaymentMethods: q,
1830
- cdeConnections: p,
1831
- customInitParams: ve ?? {},
1846
+ cdeConnections: m,
1847
+ customInitParams: Pe ?? {},
1832
1848
  baseUrl: new URL(N).origin
1833
1849
  };
1834
- }, et = (p, F, I) => {
1835
- const g = Me();
1836
- if (!(!g || !D.current))
1850
+ }, et = (m, M, A) => {
1851
+ const p = Me();
1852
+ if (!(!p || !F.current))
1837
1853
  return ae.stripePR.run({
1838
- context: g,
1839
- checkoutPaymentMethod: at(g.checkoutPaymentMethods, p),
1840
- nonCdeFormInputs: he(D.current),
1854
+ context: p,
1855
+ checkoutPaymentMethod: ct(p.checkoutPaymentMethods, m),
1856
+ nonCdeFormInputs: he(F.current),
1841
1857
  flowCallbacks: Te,
1842
- customParams: { provider: p, overridePaymentRequest: I == null ? void 0 : I.overridePaymentRequest },
1843
- initResult: F
1858
+ customParams: { provider: m, overridePaymentRequest: A == null ? void 0 : A.overridePaymentRequest },
1859
+ initResult: M
1844
1860
  });
1845
1861
  };
1846
1862
  J(() => {
1847
1863
  if (rn !== null || (console.log("[OJS] numCdeConns", Ie, Qe), Ie === 0)) return;
1848
1864
  console.log("[OJS] Initializing");
1849
- const p = Me();
1850
- if (!p) return;
1865
+ const m = Me();
1866
+ if (!m) return;
1851
1867
  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")
1868
+ const M = kr(m, Te);
1869
+ sn(M), console.log("[OJS] Subscribe"), M.stripePR.subscribe((A) => {
1870
+ if (console.log("[OJS] setPaymentRequests", A), A.status === "loading")
1855
1871
  X.set("apple_pay", pe), X.set("google_pay", pe);
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;
1872
+ else if (A.status === "error")
1873
+ X.set("apple_pay", ut), X.set("google_pay", ut);
1874
+ else if (A.status === "loaded") {
1875
+ const p = A.result, z = p.isAvailable && p.availableProviders.applePay, Fe = p.isAvailable && p.availableProviders.googlePay;
1860
1876
  X.set("apple_pay", {
1861
1877
  isLoading: !1,
1862
1878
  isAvailable: z,
1863
- startFlow: async (y) => z ? et("apple_pay", g, y) : void 0
1879
+ startFlow: async (f) => z ? et("apple_pay", p, f) : void 0
1864
1880
  }), X.set("google_pay", {
1865
1881
  isLoading: !1,
1866
1882
  isAvailable: Fe,
1867
- startFlow: async (y) => Fe ? et("google_pay", g, y) : void 0
1883
+ startFlow: async (f) => Fe ? et("google_pay", p, f) : void 0
1868
1884
  });
1869
1885
  }
1886
+ M.stripeLink.subscribe((p) => {
1887
+ p.status === "loaded" && p.result.isAvailable && cn(p.result.controller);
1888
+ });
1870
1889
  });
1871
- }, [D.current, U, q, Ie === 0]);
1872
- const an = () => {
1873
- const p = Me();
1874
- !D.current || !U || !Q || !q || !p || ae.commonCC.run({
1875
- context: p,
1876
- checkoutPaymentMethod: at(q, "credit_card"),
1877
- nonCdeFormInputs: he(D.current),
1890
+ }, [F.current, U, q, Ie === 0]);
1891
+ const un = () => {
1892
+ const m = Me();
1893
+ !F.current || !U || !Q || !q || !m || ae.commonCC.run({
1894
+ context: m,
1895
+ checkoutPaymentMethod: ct(q, "credit_card"),
1896
+ nonCdeFormInputs: he(F.current),
1878
1897
  flowCallbacks: Te,
1879
1898
  customParams: void 0,
1880
1899
  // This flow requires no custom params
1881
1900
  initResult: void 0
1882
1901
  // This flow requires no initialization
1883
1902
  });
1884
- }, De = W(
1885
- (p) => {
1886
- Ye && p.preventDefault();
1903
+ }, De = B(
1904
+ (m) => {
1905
+ Ye && m.preventDefault();
1887
1906
  },
1888
1907
  [Ye]
1889
1908
  );
1890
1909
  J(() => {
1891
- if (ke || !D.current) return;
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), () => {
1910
+ if (ke || !F.current) return;
1911
+ Z.length > 0 && Z.length === Object.keys(ne).length && (console.log("[form] All elements loaded"), Wt(!0), c && c(Ge, We));
1912
+ }, [Z, ne, ke, c, Ge, We]), J(() => (Kt(window.location.origin), window.addEventListener("message", Ae), window.addEventListener("beforeunload", De), () => {
1894
1913
  window.removeEventListener("beforeunload", De), window.removeEventListener("message", Ae);
1895
1914
  }), [U, Ae, De]);
1896
- const cn = W(
1897
- async (p) => {
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);
1915
+ const dn = B(
1916
+ async (m) => {
1917
+ const M = Z.find((p) => p.contentWindow === m.contentWindow);
1918
+ if (console.log("[OJS] Calling register iframe. Existing?", M), M) return;
1919
+ Gt((p) => [...p, m]), console.log("[OJS][form] Registering iframe:", m);
1920
+ const A = Dr(m.id);
1921
+ await on(A, m);
1903
1922
  },
1904
1923
  // eslint-disable-next-line react-hooks/exhaustive-deps
1905
1924
  [Z]
1906
- ), ln = {
1925
+ ), mn = {
1907
1926
  formId: G,
1908
- formHeight: Yt,
1909
- referer: Ht,
1910
- checkoutSecureToken: r,
1911
- registerIframe: cn,
1927
+ formHeight: Zt,
1928
+ referer: Vt,
1929
+ checkoutSecureToken: o,
1930
+ registerIframe: dn,
1912
1931
  baseUrl: N
1913
- }, un = {
1914
- submit: an,
1932
+ }, pn = {
1933
+ submit: un,
1915
1934
  applePay: Xe.apple_pay,
1916
1935
  googlePay: Xe.google_pay,
1917
- // stripeLink: {
1918
- // TODO: uncomment if we need stripe elements later.
1919
- // Better if we can make stripe link work in prod without elements.
1920
- // button: stripeElements.isReady ? StripeLinkButton : NoOpElement,
1921
- // authElement: stripeElements.isReady ? StripeLinkAuthElement : NoOpElement,
1922
- // pr: paymentRequests.stripe_link,
1923
- // },
1924
1936
  loaded: ke,
1925
- preview: sn
1937
+ preview: ln,
1938
+ stripeLink: an
1926
1939
  };
1927
- return /* @__PURE__ */ V(pt.Provider, { value: ln, children: /* @__PURE__ */ V("div", { className: o, ref: D, children: t(un) }) });
1928
- }, Pe = (e) => {
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(() => ({
1940
+ return /* @__PURE__ */ V(ft.Provider, { value: mn, children: /* @__PURE__ */ V("div", { className: r, ref: F, children: t(pn) }) });
1941
+ }, ve = (e) => {
1942
+ const { subPath: t, styles: o } = e, { formId: r, referer: s, formHeight: i, checkoutSecureToken: a, registerIframe: c, baseUrl: l } = gn(), [d, u] = C(!1), _ = se(null), w = ee(() => o ? ao(o) : "", [o]), g = ee(() => ({
1930
1943
  border: "none",
1931
1944
  width: "100%",
1932
1945
  height: i
1933
- }), [i]), C = ee(() => {
1946
+ }), [i]), h = ee(() => {
1934
1947
  if (!a || !s) return "";
1935
- const M = new URLSearchParams();
1936
- return M.append("referer", s), M.append("styles", m), M.append("formId", o), M.append("secureToken", a), M.toString();
1937
- }, [m, o, s, a]);
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(
1948
+ const D = new URLSearchParams();
1949
+ return D.append("referer", s), D.append("styles", w), D.append("formId", r), D.append("secureToken", a), D.toString();
1950
+ }, [w, r, s, a]);
1951
+ return J(() => u(!0), []), J(() => {
1952
+ console.log("[OJS] element frame register attempt", !!_.current, !!d), !(!_.current || !d) && c(_.current);
1953
+ }, [d]), a ? /* @__PURE__ */ V(
1941
1954
  "iframe",
1942
1955
  {
1943
1956
  id: `ojs-${t}-element`,
1944
1957
  name: `${t}-element`,
1945
1958
  className: "ojs-iframe",
1946
- src: `${l}/app/v1/${t}-element/?${C}`,
1947
- style: h,
1948
- ref: f
1959
+ src: `${l}/app/v1/${t}-element/?${h}`,
1960
+ style: g,
1961
+ ref: _
1949
1962
  }
1950
1963
  ) : (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" });
1964
+ }, zr = ({ styles: e }) => /* @__PURE__ */ V(ve, { styles: e, subPath: "card-cvc" }), Jr = ({ styles: e }) => /* @__PURE__ */ V(ve, { styles: e, subPath: "card" }), Hr = ({ styles: e }) => /* @__PURE__ */ V(ve, { styles: e, subPath: "card-expiry" }), Vr = ({ styles: e }) => /* @__PURE__ */ V(ve, { styles: e, subPath: "card-number" });
1952
1965
  export {
1953
- $o as CardCvcElement,
1954
- Uo as CardElement,
1955
- qo as CardExpiryElement,
1956
- zo as CardNumberElement,
1957
- xo as ElementsForm,
1958
- _ as FieldName,
1959
- fn as useOpenPayElements
1966
+ zr as CardCvcElement,
1967
+ Jr as CardElement,
1968
+ Hr as CardExpiryElement,
1969
+ Vr as CardNumberElement,
1970
+ qr as ElementsForm,
1971
+ y as FieldName,
1972
+ gn as useOpenPayElements
1960
1973
  };
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
1974
+ //# 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+IHtcbiAgICBjb25zdCBpbml0UGFyYW1zID0gY29udGV4dC5jdXN0b21Jbml0UGFyYW1zLnN0cmlwZUxpbms7XG4gICAgbG9nX18kMyhgQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIGFueSBDUE1zIGZvciBTdHJpcGUgUFIuLi5gKTtcbiAgICBjb25zdCBzdHJpcGVMaW5rQ3BtID0gZmluZENwbU1hdGNoaW5nVHlwZShjb250ZXh0LmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIFN0cmlwZUxpbmtDcG0pO1xuICAgIGxvZ19fJDMoYFN0YXJ0aW5nIHN0cmlwZSBsaW5rIGZsb3cuLi5gKTtcbiAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICBjb25zdCBpc1NldHVwTW9kZSA9IHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiO1xuICAgIGxvZ19fJDMoYENyZWF0aW5nIHN0cmlwZSBlbGVtZW50cy4uLmApO1xuICAgIGNvbnN0IGluaXRpYWxQcmV2aWV3ID0gYXdhaXQgZ2V0Q2hlY2tvdXRQcmV2aWV3QW1vdW50KGFueUNkZUNvbm5lY3Rpb24sIHByZWZpbGwudG9rZW4sIGlzU2V0dXBNb2RlLCB2b2lkIDApO1xuICAgIGNvbnN0IHsgZWxlbWVudHMsIHN0cmlwZSB9ID0gYXdhaXQgY3JlYXRlU3RyaXBlRWxlbWVudHMoc3RyaXBlTGlua0NwbS5tZXRhZGF0YS5zdHJpcGVfcGssIHtcbiAgICAgIG1vZGU6IFwic2V0dXBcIixcbiAgICAgIGN1cnJlbmN5OiBpbml0aWFsUHJldmlldy5jdXJyZW5jeSxcbiAgICAgIHNldHVwX2Z1dHVyZV91c2FnZTogXCJvZmZfc2Vzc2lvblwiLFxuICAgICAgcGF5bWVudE1ldGhvZENyZWF0aW9uOiBcIm1hbnVhbFwiXG4gICAgfSk7XG4gICAgbG9nX18kMyhgQ3JlYXRpbmcgZXhwcmVzcyBjaGVja291dC4uLmApO1xuICAgIGNvbnN0IGV4cHJlc3NDaGVja291dEVsZW1lbnQgPSBlbGVtZW50cy5jcmVhdGUoXCJleHByZXNzQ2hlY2tvdXRcIiwge1xuICAgICAgYnV0dG9uSGVpZ2h0OiBpbml0UGFyYW1zPy5idXR0b25IZWlnaHQsXG4gICAgICBwYXltZW50TWV0aG9kczoge1xuICAgICAgICBhbWF6b25QYXk6IFwibmV2ZXJcIixcbiAgICAgICAgYXBwbGVQYXk6IFwibmV2ZXJcIixcbiAgICAgICAgZ29vZ2xlUGF5OiBcIm5ldmVyXCIsXG4gICAgICAgIHBheXBhbDogXCJuZXZlclwiXG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgbW91bnRCdXR0b24gPSAoKSA9PiB7XG4gICAgICBleHByZXNzQ2hlY2tvdXRFbGVtZW50Lm1vdW50KGAjJHtPSlNfU1RSSVBFX0xJTktfQlROX0lEfWApO1xuICAgIH07XG4gICAgY29uc3QgZGlzbW91bnRCdXR0b24gPSAoKSA9PiB7XG4gICAgICBleHByZXNzQ2hlY2tvdXRFbGVtZW50LnVubW91bnQoKTtcbiAgICB9O1xuICAgIGlmIChpbml0UGFyYW1zPy5kb05vdE1vdW50T25Jbml0KSB7XG4gICAgICBsb2dfXyQzKGBOT1QgbW91bnRpbmcgc3RyaXBlIGxpbmsgYnV0dG9uIChkb05vdE1vdW50T25Jbml0IGlzIHRydWUpYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ19fJDMoYE1vdW50aW5nIHN0cmlwZSBsaW5rIGJ1dHRvbi4uLmApO1xuICAgICAgbW91bnRCdXR0b24oKTtcbiAgICB9XG4gICAgZXhwcmVzc0NoZWNrb3V0RWxlbWVudC5vbihcImNsaWNrXCIsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgbG9nX18kMyhcIlN0cmlwZSBMaW5rIGJ1dHRvbiBjbGlja2VkXCIpO1xuICAgICAgaWYgKGluaXRQYXJhbXM/Lm92ZXJyaWRlTGlua1N1Ym1pdCkge1xuICAgICAgICBjb25zdCBzaG91bGRTdWJtaXQgPSBhd2FpdCBpbml0UGFyYW1zLm92ZXJyaWRlTGlua1N1Ym1pdCgpO1xuICAgICAgICBpZiAoIXNob3VsZFN1Ym1pdCkge1xuICAgICAgICAgIGxvZ19fJDMoXCJTdHJpcGUgTGluayBzdWJtaXQgYWJvcnRlZCBieSBvdmVycmlkZUxpbmtTdWJtaXRcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBldmVudC5yZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgZXhwcmVzc0NoZWNrb3V0RWxlbWVudC5vbihcImNvbmZpcm1cIiwgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICBsb2dfXyQzKFwiU3RyaXBlIExpbmsgd2luZG93IGNvbmZpcm1lZFwiLCBldmVudCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJpcGUuY3JlYXRlUGF5bWVudE1ldGhvZCh7XG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBiaWxsaW5nX2RldGFpbHM6IGV2ZW50LmJpbGxpbmdEZXRhaWxzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICBlcnJfXyQzKFwiZXJyb3JcIiwgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0RXJyb3IocmVzdWx0LmVycm9yLm1lc3NhZ2UgPz8gXCJTdHJpcGUgTGluayB1bmtub3duIGVycm9yXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nX18kMyhcInBheW1lbnRNZXRob2RcIiwgcmVzdWx0LnBheW1lbnRNZXRob2QpO1xuICAgICAgICBPanNGbG93cy5zdHJpcGVMaW5rLnJ1bih7XG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IHN0cmlwZUxpbmtDcG0sXG4gICAgICAgICAgbm9uQ2RlRm9ybUlucHV0czogY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtKGNvbnRleHQuZm9ybURpdiksXG4gICAgICAgICAgZmxvd0NhbGxiYWNrcyxcbiAgICAgICAgICBjdXN0b21QYXJhbXM6IHsgc3RyaXBlUE06IHJlc3VsdC5wYXltZW50TWV0aG9kIH0sXG4gICAgICAgICAgaW5pdFJlc3VsdDogeyBpc0F2YWlsYWJsZTogdHJ1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBpc0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIGNvbnRyb2xsZXI6IHtcbiAgICAgICAgbW91bnRCdXR0b24sXG4gICAgICAgIGRpc21vdW50QnV0dG9uLFxuICAgICAgICB3YWl0Rm9yQnV0dG9uVG9Nb3VudDogYXN5bmMgKCkgPT4gYXdhaXQgZ2V0RWxlbWVudEJ5SWRBc3luYyhPSlNfU1RSSVBFX0xJTktfQlROX0lEKVxuICAgICAgfVxuICAgIH07XG4gIH1cbik7XG5jb25zdCBydW5TdHJpcGVMaW5rRmxvdyA9IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzKFxuICBhc3luYyAoe1xuICAgIGNvbnRleHQsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIG5vbkNkZUZvcm1JbnB1dHMsXG4gICAgZmxvd0NhbGxiYWNrcyxcbiAgICBjdXN0b21QYXJhbXNcbiAgfSkgPT4ge1xuICAgIGxvZ19fJDMoYFJ1bm5pbmcgU3RyaXBlIFBSIGZsb3cuLi5gKTtcbiAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICBsb2dfXyQzKGBNZXJnaW5nIFBNIGZpZWxkcyB3aXRoIGZvcm0gZmllbGRzLi4uYCk7XG4gICAgY29uc3QgbWVyZ2VkSW5wdXRzID0gZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQTShub25DZGVGb3JtSW5wdXRzLCBjdXN0b21QYXJhbXMuc3RyaXBlUE0pO1xuICAgIGNvbnN0IG5vbkNkZUZvcm1GaWVsZHMgPSB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyhtZXJnZWRJbnB1dHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgIGxvZ19fJDMoYFN0YXJ0aW5nIHBheW1lbnQgZmxvdy4uLmApO1xuICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSA9IGF3YWl0IHN0YXJ0UGF5bWVudEZsb3coYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgcGF5bWVudF9wcm92aWRlcjogY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyLFxuICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgIHRoZWlyX2V4aXN0aW5nX3BtX2lkOiBjdXN0b21QYXJhbXMuc3RyaXBlUE0uaWRcbiAgICB9KTtcbiAgICBsb2dfXyQzKFwiU3RhcnQgcGF5bWVudCBmbG93IHJlc3BvbnNlXCIsIHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG4gICAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gU3RyaXBlTGlua1JlcXVpcmVkVXNlckFjdGlvbnMucGFyc2Uoc3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucyk7XG4gICAgY29uc3Qgb3VyRXhpc3RpbmdQbUlkID0gbmV4dEFjdGlvbk1ldGFkYXRhWzBdLm91cl9leGlzdGluZ19wbV9pZDtcbiAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgIGxvZ19fJDMoYERvaW5nIHBheW1lbnQgc2V0dXAuLi5gKTtcbiAgICAgIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBjb25maXJtUGF5bWVudEZsb3coYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW4sXG4gICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBvdXJFeGlzdGluZ1BtSWRcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY3JlYXRlZFBheW1lbnRNZXRob2QgPSBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKGNvbmZpcm1SZXN1bHQpO1xuICAgICAgcmV0dXJuIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQ6IGNyZWF0ZWRQYXltZW50TWV0aG9kIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ19fJDMoYERvaW5nIGNoZWNrb3V0Li4uYCk7XG4gICAgICBjb25zdCBjaGVja291dFJlcXVlc3QgPSB7XG4gICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgcGF5bWVudF9pbnB1dDoge1xuICAgICAgICAgIHByb3ZpZGVyX3R5cGU6IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlclxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21lcl9lbWFpbDogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuRU1BSUxdLFxuICAgICAgICBjdXN0b21lcl96aXBfY29kZTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuWklQX0NPREVdLFxuICAgICAgICBjdXN0b21lcl9jb3VudHJ5OiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5DT1VOVFJZXSxcbiAgICAgICAgcHJvbW90aW9uX2NvZGU6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLlBST01PVElPTl9DT0RFXSxcbiAgICAgICAgbGluZV9pdGVtczogcHJlZmlsbC5saW5lX2l0ZW1zLFxuICAgICAgICB0b3RhbF9hbW91bnRfYXRvbTogcHJlZmlsbC5hbW91bnRfdG90YWxfYXRvbSxcbiAgICAgICAgY2FuY2VsX2F0X2VuZDogZmFsc2UsXG4gICAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2RcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwZXJmb3JtQ2hlY2tvdXQoYW55Q2RlQ29ubmVjdGlvbiwgY2hlY2tvdXRSZXF1ZXN0KTtcbiAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgfVxuICB9XG4pO1xuY29uc3QgZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQTSA9IChmb3JtSW5wdXRzLCBzdHJpcGVQbSkgPT4ge1xuICBjb25zdCBpbnB1dHMgPSB7IC4uLmZvcm1JbnB1dHMgfTtcbiAgY29uc3QgW3BheWVyRmlyc3ROYW1lLCAuLi5wYXllckxhc3ROYW1lUGFydHNdID0gc3RyaXBlUG0uYmlsbGluZ19kZXRhaWxzLm5hbWU/LnRyaW0oKT8uc3BsaXQoL1xccysvKSA/PyBbXTtcbiAgY29uc3QgcGF5ZXJMYXN0TmFtZSA9IHBheWVyTGFzdE5hbWVQYXJ0cy5qb2luKFwiIFwiKSB8fCB2b2lkIDA7XG4gIGlucHV0c1tGaWVsZE5hbWUuRklSU1RfTkFNRV0gPSBpbnB1dHNbRmllbGROYW1lLkZJUlNUX05BTUVdIHx8IHBheWVyRmlyc3ROYW1lIHx8IFwiX09QX1VOS05PV05cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5MQVNUX05BTUVdID0gaW5wdXRzW0ZpZWxkTmFtZS5MQVNUX05BTUVdIHx8IHBheWVyTGFzdE5hbWUgfHwgXCJfT1BfVU5LTk9XTlwiO1xuICBpbnB1dHNbRmllbGROYW1lLkVNQUlMXSA9IGlucHV0c1tGaWVsZE5hbWUuRU1BSUxdIHx8IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHN0cmlwZVBtW1wibGlua1wiXT8uZW1haWwgfHwgc3RyaXBlUG0uYmlsbGluZ19kZXRhaWxzLmVtYWlsIHx8IFwib3BfdW5maWxsZWRAZ2V0b3BlbnBheS5jb21cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gPSBpbnB1dHNbRmllbGROYW1lLlpJUF9DT0RFXSB8fCBzdHJpcGVQbS5iaWxsaW5nX2RldGFpbHMuYWRkcmVzcz8ucG9zdGFsX2NvZGUgfHwgXCIwMDAwMFwiO1xuICBpbnB1dHNbRmllbGROYW1lLkNPVU5UUlldID0gaW5wdXRzW0ZpZWxkTmFtZS5DT1VOVFJZXSB8fCBzdHJpcGVQbS5iaWxsaW5nX2RldGFpbHMuYWRkcmVzcz8uY291bnRyeSB8fCBcIlVTXCI7XG4gIGxvZ19fJDMoYEZpbmFsIGZvcm0gaW5wdXRzOmAsIGlucHV0cyk7XG4gIHJldHVybiBpbnB1dHM7XG59O1xuY29uc3QgZ2V0RWxlbWVudEJ5SWRBc3luYyA9IChpZCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgY29uc3QgZ2V0RWxlbWVudCA9ICgpID0+IHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZXNvbHZlKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZ2V0RWxlbWVudCk7XG4gICAgfVxuICB9O1xuICBnZXRFbGVtZW50KCk7XG59KTtcblxuY29uc3Qgc3R5bGVzID0gXCJAa2V5ZnJhbWVzIGZhZGVJbnswJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlKC45KX10b3tvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlKDEpfX0ub3ZlcmxheXtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt6LWluZGV4OjIxNDc0ODM2NDghaW1wb3J0YW50O2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA4MH0uY29udGFpbmVye21heC13aWR0aDo1MDBweDttYXgtaGVpZ2h0OjYwMHB4O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZC1jb2xvcjojZmZmO3Bvc2l0aW9uOnJlbGF0aXZlO2FuaW1hdGlvbjpmYWRlSW4gLjNzIGVhc2Utb3V0fS5mcmFtZXttYXgtd2lkdGg6NTAwcHg7bWF4LWhlaWdodDo2MDBweDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjpub25lfS5jYW5jZWwtYnV0dG9ue3Bvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjFyZW07Y29sb3I6I2ZmZjtjdXJzb3I6cG9pbnRlcjt0b3A6LTEuNXJlbTtwYWRkaW5nOjA7cmlnaHQ6MH1cIjtcblxuY29uc3QgY3JlYXRlQW5kT3BlbkZyYW1lID0gKHVybCkgPT4ge1xuICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgdGVtcGxhdGUuaW5uZXJIVE1MID0gYFxuICAgIDxzdHlsZT5cbiAgICAgICR7c3R5bGVzfVxuICAgIDwvc3R5bGU+XG4gICAgPGRpdiBjbGFzcz1cIm92ZXJsYXlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idXR0b25cIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGlmcmFtZSBzcmM9XCIke3VybH1cIiBjbGFzcz1cImZyYW1lXCIgaWQ9XCJ0aHJlZS1kcy1pZnJhbWVcIiB0aXRsZT1cIjNEIFNlY3VyZSB2ZXJpZmljYXRpb25cIiBhbGxvdz1cInBheW1lbnRcIj48L2lmcmFtZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuICBjb25zdCBob3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgY29uc3Qgc2hhZG93Um9vdCA9IGhvc3QuYXR0YWNoU2hhZG93KHsgbW9kZTogXCJvcGVuXCIgfSk7XG4gIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQodGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICBjb25zdCBpZnJhbWUgPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXCIjdGhyZWUtZHMtaWZyYW1lXCIpO1xuICBjb25zdCBjYW5jZWxCdXR0b24gPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXCIuY2FuY2VsLWJ1dHRvblwiKTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3N0KTtcbiAgcmV0dXJuIHsgaG9zdCwgaWZyYW1lLCBjYW5jZWxCdXR0b24gfTtcbn07XG5cbmZ1bmN0aW9uIHN0YXJ0UG9sbGluZyhpZnJhbWUsIG9uU3VjY2VzcywgY2hpbGRPcmlnaW4pIHtcbiAgY29uc3QgaGFuZGxlUG9sbGluZyA9IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5sb2coXCLwn5SEIFBvbGxpbmcgQ0RFIGNvbm5lY3Rpb24uLi5cIik7XG4gICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBwaW5nQ2RlRm9yM2RzU3RhdHVzKGlmcmFtZSwgY2hpbGRPcmlnaW4pO1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBjb25zb2xlLmxvZyhcIvCfn6IgQ0RFIGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bCEgU3RvcHBpbmcgcG9sbGluZy4uLlwiKTtcbiAgICAgICAgY29uc29sZS5sb2coXCLinqHvuI8gR290IHN0YXR1czpcIiwgc3RhdHVzKTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChwb2xsaW5nSW50ZXJ2YWwpO1xuICAgICAgICBvblN1Y2Nlc3Moc3RhdHVzKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgIH1cbiAgfTtcbiAgaGFuZGxlUG9sbGluZygpO1xuICBjb25zdCBwb2xsaW5nSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChoYW5kbGVQb2xsaW5nLCBDREVfUE9MTElOR19JTlRFUlZBTCk7XG4gIHJldHVybiBwb2xsaW5nSW50ZXJ2YWw7XG59XG5mdW5jdGlvbiBoYW5kbGVFdmVudHMoe1xuICBlbGVtZW50cyxcbiAgcG9sbGluZ0ludGVydmFsLFxuICByZXNvbHZlXG59KSB7XG4gIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpID0+IHtcbiAgICBjbGVhckludGVydmFsKHBvbGxpbmdJbnRlcnZhbCk7XG4gICAgZWxlbWVudHMuaG9zdC5yZW1vdmUoKTtcbiAgICByZXNvbHZlKFRocmVlRFNTdGF0dXMuQ0FOQ0VMTEVEKTtcbiAgfTtcbiAgZWxlbWVudHMuY2FuY2VsQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDYW5jZWwpO1xuICBjb25zdCBjbGVhbnVwRXZlbnRMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgZWxlbWVudHMuY2FuY2VsQnV0dG9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDYW5jZWwpO1xuICB9O1xuICByZXR1cm4gY2xlYW51cEV2ZW50TGlzdGVuZXJzO1xufVxuYXN5bmMgZnVuY3Rpb24gc3RhcnQzZHNWZXJpZmljYXRpb24oe1xuICB1cmwsXG4gIGJhc2VVcmxcbn0pIHtcbiAgY29uc3QgZWxlbWVudHMgPSBjcmVhdGVBbmRPcGVuRnJhbWUodXJsKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3Qgb25TdWNjZXNzID0gKHN0YXR1cykgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVsZW1lbnRzLmhvc3QucmVtb3ZlKCk7XG4gICAgICB9LCAxZTMpO1xuICAgICAgcmVzb2x2ZShzdGF0dXMpO1xuICAgICAgY2xlYW51cEV2ZW50TGlzdGVuZXJzPy4oKTtcbiAgICB9O1xuICAgIGNvbnN0IHBvbGxpbmdJbnRlcnZhbCA9IHN0YXJ0UG9sbGluZyhlbGVtZW50cy5pZnJhbWUsIG9uU3VjY2VzcywgbmV3IFVSTChiYXNlVXJsKS5vcmlnaW4pO1xuICAgIGNvbnN0IGNsZWFudXBFdmVudExpc3RlbmVycyA9IGhhbmRsZUV2ZW50cyh7XG4gICAgICBlbGVtZW50cyxcbiAgICAgIHBvbGxpbmdJbnRlcnZhbCxcbiAgICAgIHJlc29sdmVcbiAgICB9KTtcbiAgfSk7XG59XG5cbmNvbnN0IHsgbG9nX186IGxvZ19fJDIsIGVycl9fOiBlcnJfXyQyIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImNvbW1vbi1jY1wiKTtcbmNvbnN0IHsgbG9nX186IHN0cmlwZUxvZ19fIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcInN0cmlwZS1jY1wiKTtcbmNvbnN0IHJ1bkNvbW1vbkNjRmxvdyA9IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzKFxuICBhc3luYyAoeyBjb250ZXh0LCBjaGVja291dFBheW1lbnRNZXRob2QsIG5vbkNkZUZvcm1JbnB1dHMsIGZsb3dDYWxsYmFja3MgfSkgPT4ge1xuICAgIGxvZ19fJDIoYOKUnCBSdW5uaW5nIGNvbW1vbiBDQyBmbG93Li4uYCwgeyBjaGVja291dFBheW1lbnRNZXRob2QgfSk7XG4gICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoYW55Q2RlQ29ubmVjdGlvbik7XG4gICAgbG9nX18kMihg4pScIFZhbGlkYXRpbmcgbm9uLUNERSBmb3JtIGZpZWxkcyBbTW9kZTogJHtwcmVmaWxsLm1vZGV9XWApO1xuICAgIGNvbnN0IG5vbkNkZUZvcm1GaWVsZHMgPSB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyhub25DZGVGb3JtSW5wdXRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICBsb2dfXyQyKGDilJwgVG9rZW5pemluZyBjYXJkIGluZm8gaW4gQ0RFIFtTZXNzaW9uOiAke2NvbnRleHQuZWxlbWVudHNTZXNzaW9uSWR9XWApO1xuICAgIGNvbnN0IHRva2VuaXplQ2FyZFJlc3VsdHMgPSBhd2FpdCB0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMsIHtcbiAgICAgIHNlc3Npb25faWQ6IGNvbnRleHQuZWxlbWVudHNTZXNzaW9uSWRcbiAgICB9KTtcbiAgICB2YWxpZGF0ZVRva2VuaXplQ2FyZFJlc3VsdHModG9rZW5pemVDYXJkUmVzdWx0cywgZmxvd0NhbGxiYWNrcy5vblZhbGlkYXRpb25FcnJvcik7XG4gICAgY29uc3QgY29tbW9uQ2hlY2tvdXRQYXJhbXMgPSB7XG4gICAgICBzZXNzaW9uX2lkOiBjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkLFxuICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgIG5vbl9jZGVfZm9ybV9maWVsZHM6IG5vbkNkZUZvcm1GaWVsZHNcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgICAgbG9nX18kMihg4pScIFNldHRpbmcgdXAgcGF5bWVudCBtZXRob2QgaW4gQ0RFIFtUb2tlbjogJHtwcmVmaWxsLnRva2VufV1gKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2V0dXBDaGVja291dChhbnlDZGVDb25uZWN0aW9uLCBjb21tb25DaGVja291dFBhcmFtcyk7XG4gICAgICAgIGxvZ19fJDIoYOKVsCBTZXR1cCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IFtQTSBJRDogJHtyZXN1bHQucGF5bWVudF9tZXRob2RfaWR9XWApO1xuICAgICAgICByZXR1cm4geyBtb2RlOiBcInNldHVwXCIsIHJlc3VsdCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nX18kMihg4pScIEluaXRpYWwgY2hlY2tvdXQgZmxvdy4gQ2hlY2tpbmcgb3V0IGNhcmQgaW5mbyBpbiBDREUgW1Nlc3Npb246ICR7Y29udGV4dC5lbGVtZW50c1Nlc3Npb25JZH1dYCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrb3V0Q2FyZEVsZW1lbnRzKGFueUNkZUNvbm5lY3Rpb24sIGNvbW1vbkNoZWNrb3V0UGFyYW1zKTtcbiAgICAgICAgbG9nX18kMihg4pWwIENoZWNrb3V0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuYCk7XG4gICAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIENkZUVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5vcmlnaW5hbEVycm9yTWVzc2FnZSA9PT0gXCIzRFNfUkVRVUlSRURcIikge1xuICAgICAgICAgIGxvZ19fJDIoYOKUnCBDYXJkIHJlcXVpcmVzIDNEUywgc3RhcnRpbmcgbm9uLWxlZ2FjeSBwYXltZW50IGZsb3dgKTtcbiAgICAgICAgICBsb2dfXyQyKFwiZXJyb3IucmVzcG9uc2UuaGVhZGVyc1wiLCBlcnJvci5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgICAgICBjb25zdCBzaG91bGRVc2VOZXdGbG93ID0gZXJyb3IucmVzcG9uc2UuaGVhZGVycz8uW1wib3Atc2hvdWxkLXVzZS1uZXctZmxvd1wiXSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgICAgY29uc3Qgc3RhcnRQZlJlc3VsdCA9IGF3YWl0IHN0YXJ0UGF5bWVudEZsb3dGb3JDQyhhbnlDZGVDb25uZWN0aW9uLCBjb21tb25DaGVja291dFBhcmFtcyk7XG4gICAgICAgICAgbG9nX18kMihg4pScIG9wLXNob3VsZC11c2UtbmV3LWZsb3c6ICR7c2hvdWxkVXNlTmV3Rmxvd31gKTtcbiAgICAgICAgICBsb2dfXyQyKGDilJwgUGF5bWVudCBmbG93IHJlc3VsdDpgLCBzdGFydFBmUmVzdWx0KTtcbiAgICAgICAgICBpZiAoc2hvdWxkVXNlTmV3Rmxvdykge1xuICAgICAgICAgICAgYXdhaXQgY29tbW9uQ0MzRFNGbG93KHN0YXJ0UGZSZXN1bHQsIGNvbnRleHQuYmFzZVVybCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHN0cmlwZUNDM0RTRmxvdyhzdGFydFBmUmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgICAgICBsb2dfXyQyKGDilJwgQ29uZmlybWluZyBwYXltZW50IGZsb3cgW2NjX3BtX2lkOiAke3N0YXJ0UGZSZXN1bHQuY2NfcG1faWR9XWApO1xuICAgICAgICAgICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IGNvbmZpcm1QYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgICAgICAgZXhpc3RpbmdfY2NfcG1faWQ6IHN0YXJ0UGZSZXN1bHQuY2NfcG1faWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9nX18kMihg4pScIENvbmZpcm0gcGF5bWVudCBmbG93IHJlc3VsdCByZWNlaXZlZCBSZXN1bHQ6YCwgY29uZmlybVJlc3VsdCk7XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkUGF5bWVudE1ldGhvZCA9IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UoY29uZmlybVJlc3VsdCk7XG4gICAgICAgICAgICBsb2dfXyQyKGDilbAgU2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBbUE0gSUQ6ICR7Y3JlYXRlZFBheW1lbnRNZXRob2QucGF5bWVudF9tZXRob2RfaWR9XWApO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQ6IGNyZWF0ZWRQYXltZW50TWV0aG9kIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBDaGVja2luZyBvdXQgYWZ0ZXIgM0RTIGZsb3cgW0Zsb3c6ICR7c2hvdWxkVXNlTmV3RmxvdyA/IFwibmV3XCIgOiBcImxlZ2FjeVwifV1gKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrb3V0Q2FyZEVsZW1lbnRzKGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgICAgICAgICAgLi4uY29tbW9uQ2hlY2tvdXRQYXJhbXMsXG4gICAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBzdGFydFBmUmVzdWx0LmNjX3BtX2lkLFxuICAgICAgICAgICAgICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiAhc2hvdWxkVXNlTmV3Rmxvd1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsb2dfXyQyKGDilbAgQ2hlY2tvdXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5gKTtcbiAgICAgICAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlcnJfXyQyKGDilbAgRXJyb3IgY2hlY2tpbmcgb3V0IGNhcmQgaW5mbyBpbiBDREVgKTtcbiAgICAgIGVycl9fJDIoZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4pO1xuY29uc3QgcGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgY29uc3Qgc3RyaXBlQWN0aW9uID0gcmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLnR5cGUgPT09IFwic3RyaXBlXzNkc1wiKTtcbiAgaWYgKCFzdHJpcGVBY3Rpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzdHJpcGUgM0RTIGFjdGlvbiBmb3VuZFwiKTtcbiAgfVxuICByZXR1cm4gU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhLnBhcnNlKHN0cmlwZUFjdGlvbik7XG59O1xuY29uc3QgcGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgY29uc3QgY29tbW9uQWN0aW9uID0gcmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLnR5cGUgPT09IFwiYWlyd2FsbGV4X3BheW1lbnRfY29uc2VudFwiKTtcbiAgaWYgKCFjb21tb25BY3Rpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb21tb24gM0RTIGFjdGlvbiBmb3VuZFwiKTtcbiAgfVxuICByZXR1cm4gQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhLnBhcnNlKGNvbW1vbkFjdGlvbik7XG59O1xuY29uc3QgY29tbW9uQ0MzRFNGbG93ID0gYXN5bmMgKHN0YXJ0UGZSZXN1bHQsIGJhc2VVcmwpID0+IHtcbiAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gcGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEoc3RhcnRQZlJlc3VsdCk7XG4gIGxvZ19fJDIoYOKUnCBVc2luZyBjb21tb24gM0RTIGZsb3cgW1VSTDogJHtuZXh0QWN0aW9uTWV0YWRhdGEucmVkaXJlY3RfdXJsfV1gKTtcbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgc3RhcnQzZHNWZXJpZmljYXRpb24oeyB1cmw6IG5leHRBY3Rpb25NZXRhZGF0YS5yZWRpcmVjdF91cmwsIGJhc2VVcmwgfSk7XG4gIGxvZ19fJDIoYOKVsCAzRFMgdmVyaWZpY2F0aW9uIGNvbXBsZXRlZCBbU3RhdHVzOiAke3N0YXR1c31dYCk7XG4gIGlmIChzdGF0dXMgPT09IFRocmVlRFNTdGF0dXMuQ0FOQ0VMTEVEKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiM0RTIHZlcmlmaWNhdGlvbiBjYW5jZWxsZWRcIik7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gVGhyZWVEU1N0YXR1cy5GQUlMVVJFKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiM0RTIHZlcmlmaWNhdGlvbiBmYWlsZWRcIik7XG4gIH1cbn07XG5jb25zdCBzdHJpcGVDQzNEU0Zsb3cgPSBhc3luYyAoc3RhcnRQZlJlc3VsdCkgPT4ge1xuICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBwYXJzZVN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YShzdGFydFBmUmVzdWx0KTtcbiAgc3RyaXBlTG9nX18oYOKUnCBVc2luZyBzdHJpcGUgM0RTIGZsb3cgW0NsaWVudCBTZWNyZXQ6ICR7bmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQuc3Vic3RyaW5nKDAsIDgpfS4uLl1gKTtcbiAgYXdhaXQgbGF1bmNoU3RyaXBlM0RTRGlhbG9nRmxvdyhuZXh0QWN0aW9uTWV0YWRhdGEpO1xuICBzdHJpcGVMb2dfXyhcIuKVsCBTdHJpcGUgM0RTIGZsb3cgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVwiKTtcbn07XG5cbmNvbnN0IHsgbG9nX186IGxvZ19fJDEsIGVycl9fOiBlcnJfXyQxIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcInN0cmlwZS1wclwiKTtcbmNvbnN0IFN0cmlwZVByQ3BtID0gei5vYmplY3Qoe1xuICBwcm92aWRlcjogei51bmlvbihbei5saXRlcmFsKFwiYXBwbGVfcGF5XCIpLCB6LmxpdGVyYWwoXCJnb29nbGVfcGF5XCIpXSksXG4gIHByb2Nlc3Nvcl9uYW1lOiB6LmxpdGVyYWwoXCJzdHJpcGVcIiksXG4gIG1ldGFkYXRhOiB6Lm9iamVjdCh7XG4gICAgc3RyaXBlX3BrOiB6LnN0cmluZygpXG4gIH0pXG59KTtcbmNvbnN0IGluaXRTdHJpcGVQckZsb3cgPSBhZGRFcnJvckNhdGNoZXJGb3JJbml0KFxuICBhc3luYyAoeyBjb250ZXh0IH0pID0+IHtcbiAgICBsb2dfXyQxKGBDaGVja2luZyBpZiB0aGVyZSBhcmUgYW55IENQTXMgZm9yIFN0cmlwZSBQUi4uLmApO1xuICAgIGNvbnN0IGNoZWNrb3V0UGF5bWVudE1ldGhvZCA9IGZpbmRDcG1NYXRjaGluZ1R5cGUoY29udGV4dC5jaGVja291dFBheW1lbnRNZXRob2RzLCBTdHJpcGVQckNwbSk7XG4gICAgbG9nX18kMShgSW5pdGlhbGl6aW5nIFN0cmlwZSBQUiBmbG93Li4uYCk7XG4gICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoYW55Q2RlQ29ubmVjdGlvbik7XG4gICAgY29uc3QgaXNTZXR1cE1vZGUgPSBwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIjtcbiAgICBsb2dfXyQxKGBHZXR0aW5nIGluaXRpYWwgcHJldmlldyBhbW91bnRgKTtcbiAgICBjb25zdCBpbml0aWFsUHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0UHJldmlld0Ftb3VudChhbnlDZGVDb25uZWN0aW9uLCBwcmVmaWxsLnRva2VuLCBpc1NldHVwTW9kZSwgdm9pZCAwKTtcbiAgICBjb25zdCBwciA9IGF3YWl0IGNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0KFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLm1ldGFkYXRhLnN0cmlwZV9wayxcbiAgICAgIGluaXRpYWxQcmV2aWV3LmFtb3VudEF0b20sXG4gICAgICBpbml0aWFsUHJldmlldy5jdXJyZW5jeSxcbiAgICAgIGlzU2V0dXBNb2RlXG4gICAgKTtcbiAgICBsb2dfXyQxKGBDaGVja2luZyBpZiBjYW4gbWFrZSBwYXltZW50YCk7XG4gICAgY29uc3QgY2FuTWFrZVBheW1lbnQgPSBhd2FpdCBwci5jYW5NYWtlUGF5bWVudCgpO1xuICAgIGlmIChjYW5NYWtlUGF5bWVudCA9PT0gbnVsbCkge1xuICAgICAgZXJyX18kMShgY2FuTWFrZVBheW1lbnQgcmV0dXJuZWQgbnVsbGApO1xuICAgICAgcmV0dXJuIHsgaXNBdmFpbGFibGU6IGZhbHNlLCByZWFzb246IFwiY2FuTWFrZVBheW1lbnQgcmV0dXJuZWQgbnVsbFwiIH07XG4gICAgfVxuICAgIGxvZ19fJDEoYFN0cmlwZSBQUiBmbG93IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS4gQ2FuIG1ha2UgcGF5bWVudGAsIGNhbk1ha2VQYXltZW50KTtcbiAgICByZXR1cm4ge1xuICAgICAgaXNBdmFpbGFibGU6IHRydWUsXG4gICAgICBwcixcbiAgICAgIGF2YWlsYWJsZVByb3ZpZGVyczoge1xuICAgICAgICBhcHBsZVBheTogY2FuTWFrZVBheW1lbnQuYXBwbGVQYXksXG4gICAgICAgIGdvb2dsZVBheTogY2FuTWFrZVBheW1lbnQuZ29vZ2xlUGF5XG4gICAgICB9XG4gICAgfTtcbiAgfVxuKTtcbmNvbnN0IHJ1blN0cmlwZVByRmxvdyA9IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzKFxuICBhc3luYyAoe1xuICAgIGNvbnRleHQsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIG5vbkNkZUZvcm1JbnB1dHMsXG4gICAgZmxvd0NhbGxiYWNrcyxcbiAgICBjdXN0b21QYXJhbXMsXG4gICAgaW5pdFJlc3VsdFxuICB9KSA9PiB7XG4gICAgbG9nX18kMShgUnVubmluZyBTdHJpcGUgUFIgZmxvdy4uLmApO1xuICAgIGlmIChjdXN0b21QYXJhbXMucHJvdmlkZXIgIT09IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm92aWRlciBtaXNtYXRjaC4gRXhwZWN0ZWQgJHtjdXN0b21QYXJhbXMucHJvdmlkZXJ9LCBnb3QgJHtjaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXJ9YCk7XG4gICAgfVxuICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgIGNvbnN0IHByID0gaW5pdFJlc3VsdC5wcjtcbiAgICBpZiAoY3VzdG9tUGFyYW1zPy5vdmVycmlkZVBheW1lbnRSZXF1ZXN0KSB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGN1c3RvbVBhcmFtcy5vdmVycmlkZVBheW1lbnRSZXF1ZXN0O1xuICAgICAgbG9nX18kMShgT3ZlcnJpZGluZyBQUiBhbW91bnQgd2l0aGAsIG92ZXJyaWRlKTtcbiAgICAgIHVwZGF0ZVByV2l0aEFtb3VudChwciwgb3ZlcnJpZGUuYW1vdW50LCBvdmVycmlkZS5wZW5kaW5nKTtcbiAgICB9XG4gICAgbG9nX18kMShgU2hvd2luZyBQUiBkaWFsb2cuLi5gKTtcbiAgICBwci5zaG93KCk7XG4gICAgY29uc3Qgc3RyaXBlUG1BZGRlZEV2ZW50ID0gYXdhaXQgd2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QocHIpO1xuICAgIGxvZ19fJDEoYFN0cmlwZSBQTSBhZGRlZCBldmVudDpgLCBzdHJpcGVQbUFkZGVkRXZlbnQpO1xuICAgIGxvZ19fJDEoYE1lcmdpbmcgUE0gZmllbGRzIHdpdGggZm9ybSBmaWVsZHMuLi5gKTtcbiAgICBjb25zdCBtZXJnZWRJbnB1dHMgPSBmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBtKG5vbkNkZUZvcm1JbnB1dHMsIHN0cmlwZVBtQWRkZWRFdmVudCk7XG4gICAgY29uc3Qgbm9uQ2RlRm9ybUZpZWxkcyA9IHZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDKG1lcmdlZElucHV0cywgZmxvd0NhbGxiYWNrcy5vblZhbGlkYXRpb25FcnJvcik7XG4gICAgbG9nX18kMShgUFIgZGlhbG9nIGZpbmlzaGVkLiBTdGFydGluZyBwYXltZW50IGZsb3cuLi5gKTtcbiAgICBjb25zdCBzdGFydFBheW1lbnRGbG93UmVzcG9uc2UgPSBhd2FpdCBzdGFydFBheW1lbnRGbG93Rm9yUFIoYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgZmllbGRzOiBub25DZGVGb3JtRmllbGRzLFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kXG4gICAgfSk7XG4gICAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gcGFyc2VQUk5leHRBY3Rpb25NZXRhZGF0YShzdGFydFBheW1lbnRGbG93UmVzcG9uc2UpO1xuICAgIGxvZ19fJDEoYENvbmZpcm1pbmcgUFIgd2l0aCBTdHJpcGUuLi5gKTtcbiAgICBhd2FpdCBjb25maXJtU3RyaXBlUHJQTShuZXh0QWN0aW9uTWV0YWRhdGEsIHN0cmlwZVBtQWRkZWRFdmVudCk7XG4gICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoYW55Q2RlQ29ubmVjdGlvbik7XG4gICAgaWYgKHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICBsb2dfXyQxKGBDb25maXJtaW5nIHBheW1lbnQgZmxvdyBmb3Igc2V0dXAuLi5gKTtcbiAgICAgIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBjb25maXJtUGF5bWVudEZsb3coYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW5cbiAgICAgIH0pO1xuICAgICAgY29uc3QgY3JlYXRlZFBheW1lbnRNZXRob2QgPSBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKGNvbmZpcm1SZXN1bHQpO1xuICAgICAgcmV0dXJuIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQ6IGNyZWF0ZWRQYXltZW50TWV0aG9kIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ19fJDEoYFBlcmZvcm1pbmcgY2hlY2tvdXQuLi5gKTtcbiAgICAgIGNvbnN0IGNoZWNrb3V0UmVxdWVzdCA9IHtcbiAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuLFxuICAgICAgICBwYXltZW50X2lucHV0OiB7XG4gICAgICAgICAgcHJvdmlkZXJfdHlwZTogY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyXG4gICAgICAgIH0sXG4gICAgICAgIGN1c3RvbWVyX2VtYWlsOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5FTUFJTF0sXG4gICAgICAgIGN1c3RvbWVyX3ppcF9jb2RlOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0sXG4gICAgICAgIGN1c3RvbWVyX2NvdW50cnk6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLkNPVU5UUlldLFxuICAgICAgICBwcm9tb3Rpb25fY29kZTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuUFJPTU9USU9OX0NPREVdLFxuICAgICAgICBsaW5lX2l0ZW1zOiBwcmVmaWxsLmxpbmVfaXRlbXMsXG4gICAgICAgIHRvdGFsX2Ftb3VudF9hdG9tOiBwcmVmaWxsLmFtb3VudF90b3RhbF9hdG9tLFxuICAgICAgICBjYW5jZWxfYXRfZW5kOiBmYWxzZSxcbiAgICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IGNoZWNrb3V0UGF5bWVudE1ldGhvZFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBlcmZvcm1DaGVja291dChhbnlDZGVDb25uZWN0aW9uLCBjaGVja291dFJlcXVlc3QpO1xuICAgICAgcmV0dXJuIHsgbW9kZTogXCJjaGVja291dFwiLCByZXN1bHQgfTtcbiAgICB9XG4gIH1cbik7XG5jb25zdCBmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBtID0gKGZvcm1JbnB1dHMsIHN0cmlwZVBtRXZ0KSA9PiB7XG4gIGNvbnN0IGlucHV0cyA9IHsgLi4uZm9ybUlucHV0cyB9O1xuICBjb25zdCBbcGF5ZXJGaXJzdE5hbWUsIC4uLnBheWVyTGFzdE5hbWVQYXJ0c10gPSBzdHJpcGVQbUV2dC5wYXllck5hbWU/LnRyaW0oKT8uc3BsaXQoL1xccysvKSA/PyBbXTtcbiAgY29uc3QgcGF5ZXJMYXN0TmFtZSA9IHBheWVyTGFzdE5hbWVQYXJ0cy5qb2luKFwiIFwiKSB8fCB2b2lkIDA7XG4gIGlucHV0c1tGaWVsZE5hbWUuRklSU1RfTkFNRV0gPSBpbnB1dHNbRmllbGROYW1lLkZJUlNUX05BTUVdIHx8IHBheWVyRmlyc3ROYW1lIHx8IFwiX09QX1VOS05PV05cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5MQVNUX05BTUVdID0gaW5wdXRzW0ZpZWxkTmFtZS5MQVNUX05BTUVdIHx8IHBheWVyTGFzdE5hbWUgfHwgXCJfT1BfVU5LTk9XTlwiO1xuICBpbnB1dHNbRmllbGROYW1lLkVNQUlMXSA9IGlucHV0c1tGaWVsZE5hbWUuRU1BSUxdIHx8IHN0cmlwZVBtRXZ0LnBheWVyRW1haWwgfHwgXCJvcF91bmZpbGxlZEBnZXRvcGVucGF5LmNvbVwiO1xuICBpbnB1dHNbRmllbGROYW1lLlpJUF9DT0RFXSA9IGlucHV0c1tGaWVsZE5hbWUuWklQX0NPREVdIHx8IHN0cmlwZVBtRXZ0LnNoaXBwaW5nQWRkcmVzcz8ucG9zdGFsQ29kZSB8fCBcIjAwMDAwXCI7XG4gIGlucHV0c1tGaWVsZE5hbWUuQ09VTlRSWV0gPSBpbnB1dHNbRmllbGROYW1lLkNPVU5UUlldIHx8IHN0cmlwZVBtRXZ0LnNoaXBwaW5nQWRkcmVzcz8uY291bnRyeSB8fCBcIlVTXCI7XG4gIGxvZ19fJDEoYEZpbmFsIGZvcm0gaW5wdXRzOmAsIGlucHV0cyk7XG4gIHJldHVybiBpbnB1dHM7XG59O1xuY29uc3QgdXBkYXRlUHJXaXRoQW1vdW50ID0gKHByLCBhbW91bnQsIGlzUGVuZGluZykgPT4ge1xuICBwci51cGRhdGUoe1xuICAgIHRvdGFsOiB7XG4gICAgICBhbW91bnQ6IGFtb3VudC5hbW91bnRBdG9tLFxuICAgICAgbGFiZWw6IFwiVG90YWxcIixcbiAgICAgIHBlbmRpbmc6IGlzUGVuZGluZ1xuICAgIH0sXG4gICAgY3VycmVuY3k6IGFtb3VudC5jdXJyZW5jeVxuICB9KTtcbn07XG5jb25zdCBwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhID0gKHJlc3BvbnNlKSA9PiB7XG4gIGlmIChyZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBvY2N1cnJlZC5cbkRldGFpbHM6IGdvdCAke3Jlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5sZW5ndGh9IHJlcXVpcmVkIHVzZXIgYWN0aW9uc2ApO1xuICB9XG4gIHJldHVybiBQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShyZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnNbMF0pO1xufTtcblxuY29uc3QgZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdCA9IChjcG1zLCB3aXRoUHJvdmlkZXIsIHdpdGhQcm9jZXNzb3IpID0+IHtcbiAgY29uc3QgbWF0Y2hlcyA9IGNwbXMuZmlsdGVyKChjcG0pID0+IHtcbiAgICBjb25zdCBtYXRjaGVzUHJvY2Vzc29yID0gdHJ1ZSA7XG4gICAgY29uc3QgbWF0Y2hlc1Byb3ZpZGVyID0gY3BtLnByb3ZpZGVyID09PSB3aXRoUHJvdmlkZXI7XG4gICAgcmV0dXJuIG1hdGNoZXNQcm9jZXNzb3IgJiYgbWF0Y2hlc1Byb3ZpZGVyO1xuICB9KTtcbiAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkNQTXMgbGlzdFwiLCBjcG1zKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIENQTXMgZm91bmQgd2l0aCBwcm92aWRlciAnJHt3aXRoUHJvdmlkZXJ9JyBhbmQgcHJvY2Vzc29yICcke3dpdGhQcm9jZXNzb3J9J2ApO1xuICB9XG4gIGlmIChtYXRjaGVzLmxlbmd0aCAhPT0gMSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJDUE1zIGxpc3RcIiwgY3Btcyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gb25lIENQTSBmb3VuZCB3aXRoIHByb3ZpZGVyICcke3dpdGhQcm92aWRlcn0nIGFuZCBwcm9jZXNzb3IgJyR7d2l0aFByb2Nlc3Nvcn0nYCk7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXNbMF07XG59O1xuY29uc3QgT2pzRmxvd3MgPSB7XG4gIC8vIOKciyBOb3RlOiBGb3IgZmxvd3MgdGhhdCByZXF1aXJlIGluaXRpYWxpemF0aW9uLCBwbGVhc2UgYWRkIHRoZW0gdG8gYGluaXQtZmxvd3MudHNgXG4gIC8vIENvbW1vblxuICBjb21tb25DQzoge1xuICAgIHJ1bjogcnVuQ29tbW9uQ2NGbG93XG4gIH0sXG4gIC8vIFN0cmlwZVxuICBzdHJpcGVQUjoge1xuICAgIGluaXQ6IGluaXRTdHJpcGVQckZsb3csXG4gICAgcnVuOiBydW5TdHJpcGVQckZsb3dcbiAgfSxcbiAgc3RyaXBlTGluazoge1xuICAgIGluaXQ6IGluaXRTdHJpcGVMaW5rRmxvdyxcbiAgICBydW46IHJ1blN0cmlwZUxpbmtGbG93XG4gIH1cbiAgLy8g8J+RiSBBZGQgbW9yZSBmbG93cyBoZXJlXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG59O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RXhwb3J0RnJvbUNqcyAoeCkge1xuXHRyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4O1xufVxuXG52YXIgT2JzZXJ2YWJsZSQyID0ge307XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlJDIsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9ic2VydmFibGUkMi5PYnNlcnZhYmxlID0gdm9pZCAwO1xuXG4vLyA9PT0gU3ltYm9sIFN1cHBvcnQgPT09XG5jb25zdCBoYXNTeW1ib2wgPSBuYW1lID0+IEJvb2xlYW4oU3ltYm9sW25hbWVdKTtcblxuY29uc3QgZ2V0U3ltYm9sID0gbmFtZSA9PiBoYXNTeW1ib2wobmFtZSkgPyBTeW1ib2xbbmFtZV0gOiAnQEAnICsgbmFtZTtcblxuY29uc3QgU3ltYm9sSXRlcmF0b3IgPSBnZXRTeW1ib2woJ2l0ZXJhdG9yJyk7XG5jb25zdCBTeW1ib2xPYnNlcnZhYmxlID0gZ2V0U3ltYm9sKCdvYnNlcnZhYmxlJyk7XG5jb25zdCBTeW1ib2xTcGVjaWVzID0gZ2V0U3ltYm9sKCdzcGVjaWVzJyk7IC8vID09PSBBYnN0cmFjdCBPcGVyYXRpb25zID09PVxuXG5mdW5jdGlvbiBnZXRNZXRob2Qob2JqLCBrZXkpIHtcbiAgbGV0IHZhbHVlID0gb2JqW2tleV07XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKHZhbHVlICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGdldFNwZWNpZXMob2JqKSB7XG4gIGxldCBjdG9yID0gb2JqLmNvbnN0cnVjdG9yO1xuXG4gIGlmIChjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBjdG9yID0gY3RvcltTeW1ib2xTcGVjaWVzXTtcblxuICAgIGlmIChjdG9yID09PSBudWxsKSB7XG4gICAgICBjdG9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjdG9yICE9PSB1bmRlZmluZWQgPyBjdG9yIDogT2JzZXJ2YWJsZSQxO1xufVxuXG5mdW5jdGlvbiBpc09ic2VydmFibGUoeCkge1xuICByZXR1cm4geCBpbnN0YW5jZW9mIE9ic2VydmFibGUkMTsgLy8gU1BFQzogQnJhbmQgY2hlY2tcbn1cblxuZnVuY3Rpb24gaG9zdFJlcG9ydEVycm9yKGUpIHtcbiAgaWYgKGhvc3RSZXBvcnRFcnJvci5sb2cpIHtcbiAgICBob3N0UmVwb3J0RXJyb3IubG9nKGUpO1xuICB9IGVsc2Uge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbnF1ZXVlKGZuKSB7XG4gIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBmbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhvc3RSZXBvcnRFcnJvcihlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikge1xuICBsZXQgY2xlYW51cCA9IHN1YnNjcmlwdGlvbi5fY2xlYW51cDtcbiAgaWYgKGNsZWFudXAgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICBzdWJzY3JpcHRpb24uX2NsZWFudXAgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKCFjbGVhbnVwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIGNsZWFudXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHVuc3Vic2NyaWJlID0gZ2V0TWV0aG9kKGNsZWFudXAsICd1bnN1YnNjcmliZScpO1xuXG4gICAgICBpZiAodW5zdWJzY3JpYmUpIHtcbiAgICAgICAgdW5zdWJzY3JpYmUuY2FsbChjbGVhbnVwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBob3N0UmVwb3J0RXJyb3IoZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvc2VTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB7XG4gIHN1YnNjcmlwdGlvbi5fb2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gIHN1YnNjcmlwdGlvbi5fcXVldWUgPSB1bmRlZmluZWQ7XG4gIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAnY2xvc2VkJztcbn1cblxuZnVuY3Rpb24gZmx1c2hTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB7XG4gIGxldCBxdWV1ZSA9IHN1YnNjcmlwdGlvbi5fcXVldWU7XG5cbiAgaWYgKCFxdWV1ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN1YnNjcmlwdGlvbi5fcXVldWUgPSB1bmRlZmluZWQ7XG4gIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncmVhZHknO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHtcbiAgICBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCBxdWV1ZVtpXS50eXBlLCBxdWV1ZVtpXS52YWx1ZSk7XG4gICAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSkge1xuICBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ3J1bm5pbmcnO1xuICBsZXQgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX29ic2VydmVyO1xuXG4gIHRyeSB7XG4gICAgbGV0IG0gPSBnZXRNZXRob2Qob2JzZXJ2ZXIsIHR5cGUpO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICduZXh0JzpcbiAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlciwgdmFsdWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgICBpZiAobSkgbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7ZWxzZSB0aHJvdyB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2NvbXBsZXRlJzpcbiAgICAgICAgY2xvc2VTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlcik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGhvc3RSZXBvcnRFcnJvcihlKTtcbiAgfVxuXG4gIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnY2xvc2VkJykgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO2Vsc2UgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdydW5uaW5nJykgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdyZWFkeSc7XG59XG5cbmZ1bmN0aW9uIG9uTm90aWZ5KHN1YnNjcmlwdGlvbiwgdHlwZSwgdmFsdWUpIHtcbiAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSByZXR1cm47XG5cbiAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdidWZmZXJpbmcnKSB7XG4gICAgc3Vic2NyaXB0aW9uLl9xdWV1ZS5wdXNoKHtcbiAgICAgIHR5cGUsXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgIT09ICdyZWFkeScpIHtcbiAgICBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ2J1ZmZlcmluZyc7XG4gICAgc3Vic2NyaXB0aW9uLl9xdWV1ZSA9IFt7XG4gICAgICB0eXBlLFxuICAgICAgdmFsdWVcbiAgICB9XTtcbiAgICBlbnF1ZXVlKCgpID0+IGZsdXNoU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG5vdGlmeVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24sIHR5cGUsIHZhbHVlKTtcbn1cblxuY2xhc3MgU3Vic2NyaXB0aW9uIHtcbiAgY29uc3RydWN0b3Iob2JzZXJ2ZXIsIHN1YnNjcmliZXIpIHtcbiAgICAvLyBBU1NFUlQ6IG9ic2VydmVyIGlzIGFuIG9iamVjdFxuICAgIC8vIEFTU0VSVDogc3Vic2NyaWJlciBpcyBjYWxsYWJsZVxuICAgIHRoaXMuX2NsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fb2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICB0aGlzLl9xdWV1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zdGF0ZSA9ICdpbml0aWFsaXppbmcnO1xuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICBsZXQgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIgPSB7XG4gICAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gc2VsZi5fc3RhdGUgPT09ICdjbG9zZWQnO1xuICAgICAgfSxcblxuICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICBvbk5vdGlmeShzZWxmLCAnbmV4dCcsIHZhbHVlKTtcbiAgICAgIH0sXG5cbiAgICAgIGVycm9yKHZhbHVlKSB7XG4gICAgICAgIG9uTm90aWZ5KHNlbGYsICdlcnJvcicsIHZhbHVlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICBvbk5vdGlmeShzZWxmLCAnY29tcGxldGUnKTtcbiAgICAgIH1cblxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fY2xlYW51cCA9IHN1YnNjcmliZXIuY2FsbCh1bmRlZmluZWQsIHN1YnNjcmlwdGlvbk9ic2VydmVyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdWJzY3JpcHRpb25PYnNlcnZlci5lcnJvcihlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc3RhdGUgPT09ICdpbml0aWFsaXppbmcnKSB0aGlzLl9zdGF0ZSA9ICdyZWFkeSc7XG4gIH1cblxuICBnZXQgY2xvc2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZSA9PT0gJ2Nsb3NlZCc7XG4gIH1cblxuICB1bnN1YnNjcmliZSgpIHtcbiAgICBpZiAodGhpcy5fc3RhdGUgIT09ICdjbG9zZWQnKSB7XG4gICAgICBjbG9zZVN1YnNjcmlwdGlvbih0aGlzKTtcbiAgICAgIGNsZWFudXBTdWJzY3JpcHRpb24odGhpcyk7XG4gICAgfVxuICB9XG5cbn1cblxubGV0IE9ic2VydmFibGUkMSA9IGNsYXNzIE9ic2VydmFibGUge1xuICBjb25zdHJ1Y3RvcihzdWJzY3JpYmVyKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE9ic2VydmFibGUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdPYnNlcnZhYmxlIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbicpO1xuICAgIGlmICh0eXBlb2Ygc3Vic2NyaWJlciAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JzZXJ2YWJsZSBpbml0aWFsaXplciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgfVxuXG4gIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgIT09ICdvYmplY3QnIHx8IG9ic2VydmVyID09PSBudWxsKSB7XG4gICAgICBvYnNlcnZlciA9IHtcbiAgICAgICAgbmV4dDogb2JzZXJ2ZXIsXG4gICAgICAgIGVycm9yOiBhcmd1bWVudHNbMV0sXG4gICAgICAgIGNvbXBsZXRlOiBhcmd1bWVudHNbMl1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24ob2JzZXJ2ZXIsIHRoaXMuX3N1YnNjcmliZXIpO1xuICB9XG5cbiAgZm9yRWFjaChmbikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICBsZXQgc3Vic2NyaXB0aW9uID0gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZuKHZhbHVlLCBkb25lKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3I6IHJlamVjdCxcbiAgICAgICAgY29tcGxldGU6IHJlc29sdmVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbWFwKGZuKSB7XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IGZuKHZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgfSxcblxuICAgICAgZXJyb3IoZSkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgfSkpO1xuICB9XG5cbiAgZmlsdGVyKGZuKSB7XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIWZuKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICB9LFxuXG4gICAgICBlcnJvcihlKSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgfSxcblxuICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG5cbiAgICB9KSk7XG4gIH1cblxuICByZWR1Y2UoZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICBsZXQgaGFzU2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxO1xuICAgIGxldCBoYXNWYWx1ZSA9IGZhbHNlO1xuICAgIGxldCBzZWVkID0gYXJndW1lbnRzWzFdO1xuICAgIGxldCBhY2MgPSBzZWVkO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB0aGlzLnN1YnNjcmliZSh7XG4gICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgIGxldCBmaXJzdCA9ICFoYXNWYWx1ZTtcbiAgICAgICAgaGFzVmFsdWUgPSB0cnVlO1xuXG4gICAgICAgIGlmICghZmlyc3QgfHwgaGFzU2VlZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhY2MgPSBmbihhY2MsIHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjYyA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBlcnJvcihlKSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgfSxcblxuICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgIGlmICghaGFzVmFsdWUgJiYgIWhhc1NlZWQpIHJldHVybiBvYnNlcnZlci5lcnJvcihuZXcgVHlwZUVycm9yKCdDYW5ub3QgcmVkdWNlIGFuIGVtcHR5IHNlcXVlbmNlJykpO1xuICAgICAgICBvYnNlcnZlci5uZXh0KGFjYyk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG5cbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyBhbGwoKSB7XG4gICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgIGF3YWl0IHRoaXMuZm9yRWFjaCh2YWx1ZSA9PiB2YWx1ZXMucHVzaCh2YWx1ZSkpO1xuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBjb25jYXQoLi4uc291cmNlcykge1xuICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgbGV0IHN1YnNjcmlwdGlvbjtcbiAgICAgIGxldCBpbmRleCA9IDA7XG5cbiAgICAgIGZ1bmN0aW9uIHN0YXJ0TmV4dChuZXh0KSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbiA9IG5leHQuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0KHYpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQodik7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gc291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhcnROZXh0KEMuZnJvbShzb3VyY2VzW2luZGV4KytdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBzdGFydE5leHQodGhpcyk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZmxhdE1hcChmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICBsZXQgc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgICAgbGV0IG91dGVyID0gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGZuKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IGZuKHZhbHVlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBpbm5lciA9IEMuZnJvbSh2YWx1ZSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICAgIGxldCBpID0gc3Vic2NyaXB0aW9ucy5pbmRleE9mKGlubmVyKTtcbiAgICAgICAgICAgICAgaWYgKGkgPj0gMCkgc3Vic2NyaXB0aW9ucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgIGNvbXBsZXRlSWZEb25lKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goaW5uZXIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICBjb21wbGV0ZUlmRG9uZSgpO1xuICAgICAgICB9XG5cbiAgICAgIH0pO1xuXG4gICAgICBmdW5jdGlvbiBjb21wbGV0ZUlmRG9uZSgpIHtcbiAgICAgICAgaWYgKG91dGVyLmNsb3NlZCAmJiBzdWJzY3JpcHRpb25zLmxlbmd0aCA9PT0gMCkgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgb3V0ZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBbU3ltYm9sT2JzZXJ2YWJsZV0oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgZnJvbSh4KSB7XG4gICAgbGV0IEMgPSB0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBPYnNlcnZhYmxlO1xuICAgIGlmICh4ID09IG51bGwpIHRocm93IG5ldyBUeXBlRXJyb3IoeCArICcgaXMgbm90IGFuIG9iamVjdCcpO1xuICAgIGxldCBtZXRob2QgPSBnZXRNZXRob2QoeCwgU3ltYm9sT2JzZXJ2YWJsZSk7XG5cbiAgICBpZiAobWV0aG9kKSB7XG4gICAgICBsZXQgb2JzZXJ2YWJsZSA9IG1ldGhvZC5jYWxsKHgpO1xuICAgICAgaWYgKE9iamVjdChvYnNlcnZhYmxlKSAhPT0gb2JzZXJ2YWJsZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihvYnNlcnZhYmxlICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAgICBpZiAoaXNPYnNlcnZhYmxlKG9ic2VydmFibGUpICYmIG9ic2VydmFibGUuY29uc3RydWN0b3IgPT09IEMpIHJldHVybiBvYnNlcnZhYmxlO1xuICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IG9ic2VydmFibGUuc3Vic2NyaWJlKG9ic2VydmVyKSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1N5bWJvbCgnaXRlcmF0b3InKSkge1xuICAgICAgbWV0aG9kID0gZ2V0TWV0aG9kKHgsIFN5bWJvbEl0ZXJhdG9yKTtcblxuICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgIGVucXVldWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIG1ldGhvZC5jYWxsKHgpKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoaXRlbSk7XG4gICAgICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICAgIGVucXVldWUoKCkgPT4ge1xuICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh4W2ldKTtcbiAgICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoeCArICcgaXMgbm90IG9ic2VydmFibGUnKTtcbiAgfVxuXG4gIHN0YXRpYyBvZiguLi5pdGVtcykge1xuICAgIGxldCBDID0gdHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogT2JzZXJ2YWJsZTtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgZW5xdWV1ZSgoKSA9PiB7XG4gICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtc1tpXSk7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGdldCBbU3ltYm9sU3BlY2llc10oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxufTtcblxuT2JzZXJ2YWJsZSQyLk9ic2VydmFibGUgPSBPYnNlcnZhYmxlJDE7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoT2JzZXJ2YWJsZSQxLCBTeW1ib2woJ2V4dGVuc2lvbnMnKSwge1xuICB2YWx1ZToge1xuICAgIHN5bWJvbDogU3ltYm9sT2JzZXJ2YWJsZSxcbiAgICBob3N0UmVwb3J0RXJyb3JcbiAgfSxcbiAgY29uZmlndXJhYmxlOiB0cnVlXG59KTtcblxudmFyIHplbk9ic2VydmFibGUgPSBPYnNlcnZhYmxlJDIuT2JzZXJ2YWJsZTtcblxuY29uc3QgT2JzZXJ2YWJsZSA9IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbUNqcyh6ZW5PYnNlcnZhYmxlKTtcblxuY29uc3QgeyBsb2dfXywgZXJyX18gfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiaW5pdC1mbG93c1wiKTtcbmNvbnN0IGdldE9qc0luaXRSZXN1bHRzRGVidWdPYmplY3QgPSAoKSA9PiB7XG4gIGlmICghKFwib2pzX2luaXRfcmVzdWx0c1wiIGluIHdpbmRvdykpIHtcbiAgICB3aW5kb3dbXCJvanNfaW5pdF9yZXN1bHRzXCJdID0ge307XG4gIH1cbiAgcmV0dXJuIHdpbmRvd1tcIm9qc19pbml0X3Jlc3VsdHNcIl07XG59O1xuY29uc3QgaW5pdGlhbGl6ZU9qc0Zsb3dzID0gKGNvbnRleHQsIGZsb3dDYWxsYmFja3MpID0+IHtcbiAgY29uc3QgaW5pdFBhcmFtcyA9IHsgY29udGV4dCwgZmxvd0NhbGxiYWNrcyB9O1xuICBjb25zb2xlLmxvZyhcIltPSlNdIGluaXRpYWxpemluZyBPSlMgZmxvd3MuLi5cIik7XG4gIHJldHVybiB7XG4gICAgLy8gU3RyaXBlIFBSXG4gICAgc3RyaXBlUFI6IHJ1bkluaXRGbG93QXNPYnNlcnZhYmxlKFwic3RyaXBlUFJcIiwgT2pzRmxvd3Muc3RyaXBlUFIuaW5pdChpbml0UGFyYW1zKSksXG4gICAgLy8gU3RyaXBlIExpbmtcbiAgICBzdHJpcGVMaW5rOiBydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZShcInN0cmlwZUxpbmtcIiwgT2pzRmxvd3Muc3RyaXBlTGluay5pbml0KGluaXRQYXJhbXMpKVxuICAgIC8vIPCfkYkgQWRkIGluaXRpYWxpemF0aW9uIGZsb3dzIGhlcmVcbiAgfTtcbn07XG5jb25zdCBydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZSA9IChmbG93TmFtZSwgaW5pdEZsb3cpID0+IHtcbiAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgIG9ic2VydmVyLm5leHQoeyBzdGF0dXM6IFwibG9hZGluZ1wiIH0pO1xuICAgIGluaXRGbG93LnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJsb2FkZWRcIiwgcmVzdWx0IH0pO1xuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgIH0pO1xuICB9KTtcbiAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUoe1xuICAgIG5leHQ6IChyZXN1bHQpID0+IHtcbiAgICAgIGxvZ19fKGAke2Zsb3dOYW1lfSBmbG93IHJlc3VsdGAsIHJlc3VsdCk7XG4gICAgICBnZXRPanNJbml0UmVzdWx0c0RlYnVnT2JqZWN0KClbZmxvd05hbWVdID0gcmVzdWx0O1xuICAgIH0sXG4gICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgZXJyX18oYCR7Zmxvd05hbWV9IGZsb3cgaW5pdGlhbGl6YXRpb24gZXJyb3I6XG4ke0pTT04uc3RyaW5naWZ5KGVycm9yKX1gKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvYnNlcnZhYmxlO1xufTtcblxuY29uc3QgUFJfTE9BRElORyA9IHtcbiAgaXNMb2FkaW5nOiB0cnVlLFxuICBpc0F2YWlsYWJsZTogZmFsc2UsXG4gIHN0YXJ0RmxvdzogYXN5bmMgKCkgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBzdGFydEZsb3cgdHJpZ2dlcmVkIHdoaWxlIHBheW1lbnQgcmVxdWVzdCBpcyBzdGlsbCBub3QgcmVhZHkuIFxuICAgICAgWW91IGNhbiBjaGVjayB0aGUgXCIuaXNMb2FkaW5nXCIgcGFyYW0gdG8ga25vdyB3aGVuIGEgcGF5bWVudCByZXF1ZXN0IGlzIHN0aWxsIGxvYWRpbmcsIFxuICAgICAgYW5kIFwiLmlzQXZhaWxhYmxlXCIgdG8ga25vdyBpZiBhIHBheW1lbnQgcmVxdWVzdCBpcyBhdmFpbGFibGUuYFxuICAgICk7XG4gIH1cbn07XG5jb25zdCBQUl9FUlJPUiA9IHtcbiAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgaXNBdmFpbGFibGU6IGZhbHNlLFxuICBzdGFydEZsb3c6IGFzeW5jICgpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGBzdGFydEZsb3cgdHJpZ2dlcmVkIHdoZW4gcGF5bWVudCByZXF1ZXN0IGlzIG5vdCBhdmFpbGFibGUuYCk7XG4gIH1cbn07XG5cbnZhciB1c2VBc3luY0VmZmVjdCQyID0ge2V4cG9ydHM6IHt9fTtcblxudmFyIFJlYWN0ID0gcmVxdWlyZSQkMDtcblxuZnVuY3Rpb24gdXNlQXN5bmNFZmZlY3QoZWZmZWN0LCBkZXN0cm95LCBpbnB1dHMpIHtcbiAgdmFyIGhhc0Rlc3Ryb3kgPSB0eXBlb2YgZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJztcblxuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXN1bHQ7XG4gICAgdmFyIG1vdW50ZWQgPSB0cnVlO1xuICAgIHZhciBtYXliZVByb21pc2UgPSBlZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG1vdW50ZWQ7XG4gICAgfSk7XG5cbiAgICBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgbW91bnRlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoaGFzRGVzdHJveSkge1xuICAgICAgICBkZXN0cm95KHJlc3VsdCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgaGFzRGVzdHJveSA/IGlucHV0cyA6IGRlc3Ryb3kpO1xufVxuXG51c2VBc3luY0VmZmVjdCQyLmV4cG9ydHMgPSB1c2VBc3luY0VmZmVjdDtcbnVzZUFzeW5jRWZmZWN0JDIuZXhwb3J0cy51c2VBc3luY0VmZmVjdCA9IHVzZUFzeW5jRWZmZWN0O1xuXG52YXIgdXNlQXN5bmNFZmZlY3RFeHBvcnRzID0gdXNlQXN5bmNFZmZlY3QkMi5leHBvcnRzO1xuY29uc3QgdXNlQXN5bmNFZmZlY3QkMSA9IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbUNqcyh1c2VBc3luY0VmZmVjdEV4cG9ydHMpO1xuXG5mdW5jdGlvbiB1c2VUaW1lb3V0Rm4oZm4sIG1zID0gMCkge1xuICBjb25zdCByZWFkeSA9IHVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IHRpbWVvdXQgPSB1c2VSZWYoKTtcbiAgY29uc3QgY2FsbGJhY2sgPSB1c2VSZWYoZm4pO1xuICBjb25zdCBpc1JlYWR5ID0gdXNlQ2FsbGJhY2soKCkgPT4gcmVhZHkuY3VycmVudCwgW10pO1xuICBjb25zdCBzZXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgcmVhZHkuY3VycmVudCA9IGZhbHNlO1xuICAgIHRpbWVvdXQuY3VycmVudCAmJiBjbGVhclRpbWVvdXQodGltZW91dC5jdXJyZW50KTtcbiAgICB0aW1lb3V0LmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlYWR5LmN1cnJlbnQgPSB0cnVlO1xuICAgICAgY2FsbGJhY2suY3VycmVudCgpO1xuICAgIH0sIG1zKTtcbiAgfSwgW21zXSk7XG4gIGNvbnN0IGNsZWFyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHJlYWR5LmN1cnJlbnQgPSBudWxsO1xuICAgIHRpbWVvdXQuY3VycmVudCAmJiBjbGVhclRpbWVvdXQodGltZW91dC5jdXJyZW50KTtcbiAgfSwgW10pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNhbGxiYWNrLmN1cnJlbnQgPSBmbjtcbiAgfSwgW2ZuXSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0KCk7XG4gICAgcmV0dXJuIGNsZWFyO1xuICB9LCBbbXNdKTtcbiAgcmV0dXJuIFtpc1JlYWR5LCBjbGVhciwgc2V0XTtcbn1cblxuZnVuY3Rpb24gdXNlRGVib3VuY2UoZm4sIG1zID0gMCwgZGVwcyA9IFtdKSB7XG4gIGNvbnN0IFtpc1JlYWR5LCBjYW5jZWwsIHJlc2V0XSA9IHVzZVRpbWVvdXRGbihmbiwgbXMpO1xuICB1c2VFZmZlY3QocmVzZXQsIGRlcHMpO1xuICByZXR1cm4gW2lzUmVhZHksIGNhbmNlbF07XG59XG5cbmNvbnN0IHVzZUR5bmFtaWNQcmV2aWV3ID0gKGlzRW5hYmxlZCwgY2RlQ29ubiwgc2VjdXJlVG9rZW4sIGZvcm1EaXYpID0+IHtcbiAgY29uc3QgW3Byb21vQ29kZUlucHV0LCBzZXRQcm9tb0NvZGVJbnB1dF0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW3Byb21vQ29kZURlYm91bmNlZCwgc2V0UHJvbW9Db2RlRGVib3VuY2VkXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbcHJldmlld0FtdCwgc2V0UHJldmlld0FtdF0gPSB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW2lzUHJldmlld0xvYWRpbmcsIHNldElzUHJldmlld0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbcHJldmlld0Vycm9yLCBzZXRQcmV2aWV3RXJyb3JdID0gdXNlU3RhdGUobnVsbCk7XG4gIHVzZUFzeW5jRWZmZWN0JDEoYXN5bmMgKCkgPT4ge1xuICAgIGlmICghZm9ybURpdiB8fCAhaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByb21vQ29kZUlucHV0MiA9IGF3YWl0IHdhaXRGb3JGb3JtRmllbGRJbnB1dChmb3JtRGl2LCBGaWVsZE5hbWUuUFJPTU9USU9OX0NPREUpO1xuICAgIHByb21vQ29kZUlucHV0Mj8uYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsICgpID0+IHtcbiAgICAgIHNldElzUHJldmlld0xvYWRpbmcodHJ1ZSk7XG4gICAgICBzZXRQcmV2aWV3RXJyb3IobnVsbCk7XG4gICAgICBzZXRQcm9tb0NvZGVJbnB1dChwcm9tb0NvZGVJbnB1dDIudmFsdWUpO1xuICAgIH0pO1xuICB9LCBbISFmb3JtRGl2LCBpc0VuYWJsZWRdKTtcbiAgdXNlRGVib3VuY2UoXG4gICAgKCkgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2V0UHJvbW9Db2RlRGVib3VuY2VkKHByb21vQ29kZUlucHV0KTtcbiAgICB9LFxuICAgIDFlMyxcbiAgICBbcHJvbW9Db2RlSW5wdXQsIGlzRW5hYmxlZF1cbiAgKTtcbiAgdXNlQXN5bmNFZmZlY3QkMShcbiAgICBhc3luYyAoaXNNb3VudGVkKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWNkZUNvbm4gfHwgIXNlY3VyZVRva2VuIHx8ICFpc0VuYWJsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoY2RlQ29ubik7XG4gICAgICAgIGNvbnN0IGlzU2V0dXBNb2RlID0gcHJlZmlsbC5tb2RlID09PSBcInNldHVwXCI7XG4gICAgICAgIGNvbnN0IHByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFByZXZpZXdBbW91bnQoY2RlQ29ubiwgc2VjdXJlVG9rZW4sIGlzU2V0dXBNb2RlLCBwcm9tb0NvZGVEZWJvdW5jZWQpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIlt1c2VEeW5hbWljUHJldmlld10gUXVlcnlpbmcuIFByb21vIGNvZGU6XCIsIHByb21vQ29kZURlYm91bmNlZCk7XG4gICAgICAgIGlmIChpc01vdW50ZWQoKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiW3VzZUR5bmFtaWNQcmV2aWV3XSBTZXR0aW5nIHByZXZpZXc6XCIsIHByb21vQ29kZURlYm91bmNlZCwgcHJldmlldyk7XG4gICAgICAgICAgc2V0UHJldmlld0Vycm9yKG51bGwpO1xuICAgICAgICAgIHNldFByZXZpZXdBbXQocHJldmlldyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJbdXNlRHluYW1pY1ByZXZpZXddIERpc2NhcmRpbmc6XCIsIHByZXZpZXcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChpc01vdW50ZWQoKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFt1c2VEeW5hbWljUHJldmlld10gRXJyb3IgZG9pbmcgcHJldmlld2AsIGdldEVycm9yTWVzc2FnZShlKSk7XG4gICAgICAgICAgc2V0UHJldmlld0Vycm9yKGdldEVycm9yTWVzc2FnZShlKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChpc01vdW50ZWQoKSkge1xuICAgICAgICAgIHNldElzUHJldmlld0xvYWRpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbIWNkZUNvbm4sICFzZWN1cmVUb2tlbiwgcHJvbW9Db2RlRGVib3VuY2VkLCBpc0VuYWJsZWRdXG4gICk7XG4gIHJldHVybiB7XG4gICAgYW1vdW50OiBwcmV2aWV3QW10LFxuICAgIGlzTG9hZGluZzogaXNQcmV2aWV3TG9hZGluZyxcbiAgICBlcnJvcjogcHJldmlld0Vycm9yXG4gIH07XG59O1xuXG5jb25zdCB1c2VNYXAgPSAoaW5pdGlhbE1hcCA9IHt9KSA9PiB7XG4gIGNvbnN0IFttYXAsIHNldF0gPSB1c2VTdGF0ZShpbml0aWFsTWFwKTtcbiAgY29uc3Qgc3RhYmxlQWN0aW9ucyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIHNldDogKGtleSwgZW50cnkpID0+IHtcbiAgICAgICAgc2V0KChwcmV2TWFwKSA9PiAoe1xuICAgICAgICAgIC4uLnByZXZNYXAsXG4gICAgICAgICAgW2tleV06IGVudHJ5XG4gICAgICAgIH0pKTtcbiAgICAgIH0sXG4gICAgICBzZXRBbGw6IChuZXdNYXApID0+IHtcbiAgICAgICAgc2V0KG5ld01hcCk7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlOiAoa2V5KSA9PiB7XG4gICAgICAgIHNldCgocHJldk1hcCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgW2tleV06IG9taXQsIC4uLnJlc3QgfSA9IHByZXZNYXA7XG4gICAgICAgICAgcmV0dXJuIHJlc3Q7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHJlc2V0OiAoKSA9PiBzZXQoaW5pdGlhbE1hcClcbiAgICB9KSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgW3NldF1cbiAgKTtcbiAgY29uc3QgdXRpbHMgPSB7XG4gICAgZ2V0OiB1c2VDYWxsYmFjaygoa2V5KSA9PiBtYXBba2V5XSwgW21hcF0pLFxuICAgIC4uLnN0YWJsZUFjdGlvbnNcbiAgfTtcbiAgcmV0dXJuIFttYXAsIHV0aWxzXTtcbn07XG5cbmNvbnN0IHVzZUNkZUNvbm5lY3Rpb24gPSAoKSA9PiB7XG4gIGNvbnN0IFtudW1DZGVDb25ucywgc2V0TnVtQ2RlQ29ubnNdID0gdXNlU3RhdGUoMCk7XG4gIGNvbnN0IFtjZGVDb25ucywgY2RlQ29ubnNTZXR0ZXJdID0gdXNlTWFwKHtcbiAgICBjYXJkOiB2b2lkIDAsXG4gICAgXCJjYXJkLWN2Y1wiOiB2b2lkIDAsXG4gICAgXCJjYXJkLWV4cGlyeVwiOiB2b2lkIDAsXG4gICAgXCJjYXJkLW51bWJlclwiOiB2b2lkIDBcbiAgfSk7XG4gIGNvbnN0IGFueUNkZUNvbm4gPSBPYmplY3QudmFsdWVzKGNkZUNvbm5zKS5maWx0ZXIoKGNkZUNvbm4pID0+IGNkZUNvbm4gIT09IHZvaWQgMClbMF0gPz8gbnVsbDtcbiAgcmV0dXJuIHtcbiAgICBjZGVDb25ucyxcbiAgICBhbnlDZGVDb25uLFxuICAgIGNvbm5lY3RUb0NkZUlmcmFtZTogYXN5bmMgKGVsZW1lbnRUeXBlLCBpZnJhbWUpID0+IHtcbiAgICAgIGNkZUNvbm5zU2V0dGVyLnNldChlbGVtZW50VHlwZSwgYXdhaXQgY3JlYXRlQ2RlQ29ubmVjdGlvbihpZnJhbWUpKTtcbiAgICAgIHNldE51bUNkZUNvbm5zKE9iamVjdC52YWx1ZXMoY2RlQ29ubnMpLmxlbmd0aCk7XG4gICAgfSxcbiAgICBudW1DZGVDb25uc1xuICB9O1xufTtcbmNvbnN0IGdldEVsZW1lbnRUeXBlRnJvbUlmcmFtZUlkID0gKGlmcmFtZUlkKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRUeXBlID0gaWZyYW1lSWQucmVwbGFjZShcIm9qcy1cIiwgXCJcIikucmVwbGFjZShcIi1lbGVtZW50XCIsIFwiXCIpO1xuICBjb25zdCBwYXJzZWQgPSBFbGVtZW50VHlwZS5zYWZlUGFyc2UoZWxlbWVudFR5cGUpO1xuICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgZWxlbWVudCBpZDogJHtpZnJhbWVJZH0sIGl0IG5lZWRzIHRvIGJlIGluIHRoZSBmb3JtYXQgXCJvanMte2VsZW1lbnRUeXBlfS1lbGVtZW50XCIgKGUuZy4gXCJvanMtY2FyZC1udW1iZXItZWxlbWVudFwiKWBcbiAgICApO1xuICB9XG4gIHJldHVybiBwYXJzZWQuZGF0YTtcbn07XG5cbmNvbnN0IEVsZW1lbnRzRm9ybSA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW4sXG4gICAgY2hlY2tvdXRTZWN1cmVUb2tlbixcbiAgICBjbGFzc05hbWUsXG4gICAgb25Gb2N1cyxcbiAgICBvbkJsdXIsXG4gICAgb25DaGFuZ2UsXG4gICAgb25Mb2FkLFxuICAgIG9uTG9hZEVycm9yLFxuICAgIG9uVmFsaWRhdGlvbkVycm9yLFxuICAgIG9uQ2hlY2tvdXRTdGFydGVkLFxuICAgIG9uQ2hlY2tvdXRTdWNjZXNzLFxuICAgIG9uQ2hlY2tvdXRFcnJvcixcbiAgICBvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MsXG4gICAgYmFzZVVybCxcbiAgICBlbmFibGVEeW5hbWljUHJldmlld3MsXG4gICAgY3VzdG9tSW5pdFBhcmFtc1xuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGZyYW1lQmFzZVVybCA9IGJhc2VVcmwgPz8gRlJBTUVfQkFTRV9VUkw7XG4gIGNvbnN0IFtyZWZlcmVyLCBzZXRSZWZlcmVyXSA9IHVzZVN0YXRlKHZvaWQgMCk7XG4gIGNvbnN0IFtub25jZXMsIHNldE5vbmNlc10gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtmb3JtSGVpZ2h0LCBzZXRGb3JtSGVpZ2h0XSA9IHVzZVN0YXRlKFwiMXB4XCIpO1xuICBjb25zdCBbbG9hZGVkLCBzZXRMb2FkZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbZXh0cmFEYXRhLCBzZXRFeHRyYURhdGFdID0gdXNlU3RhdGUodm9pZCAwKTtcbiAgY29uc3QgW3ByZXZlbnRDbG9zZSwgc2V0UHJldmVudENsb3NlXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2lmcmFtZXMsIHNldElmcmFtZXNdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbZXZlbnRUYXJnZXRzLCBzZXRFdmVudFRhcmdldHNdID0gdXNlU3RhdGUoe30pO1xuICBjb25zdCBbdG9rZW5pemVkLCBzZXRUb2tlbml6ZWRdID0gdXNlU3RhdGUoMCk7XG4gIGNvbnN0IFtjaGVja291dEZpcmVkLCBzZXRDaGVja291dEZpcmVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3Nlc3Npb25JZCwgc2V0U2Vzc2lvbklkXSA9IHVzZVN0YXRlKHZvaWQgMCk7XG4gIGNvbnN0IFtjdXJyZW5jeSwgc2V0Q3VycmVuY3ldID0gdXNlU3RhdGUodm9pZCAwKTtcbiAgY29uc3QgW3RvdGFsQW1vdW50QXRvbXMsIHNldFRvdGFsQW1vdW50QXRvbXNdID0gdXNlU3RhdGUodm9pZCAwKTtcbiAgY29uc3QgW2NoZWNrb3V0UGF5bWVudE1ldGhvZHMsIHNldENoZWNrb3V0UGF5bWVudE1ldGhvZHNdID0gdXNlU3RhdGUodm9pZCAwKTtcbiAgY29uc3QgW3N0cmlwZVBtXSA9IHVzZVN0YXRlKHZvaWQgMCk7XG4gIGNvbnN0IGZvcm1JZCA9IHVzZU1lbW8oKCkgPT4gYG9wanMtZm9ybS0ke3Y0KCl9YCwgW10pO1xuICBjb25zdCBmb3JtUmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCB7IGNkZUNvbm5zLCBhbnlDZGVDb25uLCBjb25uZWN0VG9DZGVJZnJhbWUsIG51bUNkZUNvbm5zIH0gPSB1c2VDZGVDb25uZWN0aW9uKCk7XG4gIGNvbnN0IFtvanNGbG93c0luaXRpYWxpemF0aW9uLCBzZXRPanNGbG93c0luaXRpYWxpemF0aW9uXSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbcGF5bWVudFJlcXVlc3RzLCBzZXRQYXltZW50UmVxdWVzdHNdID0gdXNlTWFwKHtcbiAgICBhcHBsZV9wYXk6IFBSX0xPQURJTkcsXG4gICAgZ29vZ2xlX3BheTogUFJfTE9BRElOR1xuICB9KTtcbiAgY29uc3QgW3N0cmlwZUxpbmtDdHJsLCBzZXRTdHJpcGVMaW5rQ3RybF0gPSB1c2VTdGF0ZShudWxsKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvanNfdmVyc2lvbiA9IHsgdmVyc2lvbjogXCIwLjEuMTFcIiwgcmVsZWFzZV92ZXJzaW9uOiBcIjAuMS4xMS1hbHBoYS42ZTRlMzYxXCIgfTtcbiAgICB3aW5kb3dbXCJvanNfdmVyc2lvblwiXSA9IG9qc192ZXJzaW9uO1xuICAgIGNvbnNvbGUubG9nKFwiT0pTIHZlcnNpb246XCIsIG9qc192ZXJzaW9uKTtcbiAgfSwgW10pO1xuICBjb25zdCBkeW5hbWljUHJldmlldyA9IHVzZUR5bmFtaWNQcmV2aWV3KFxuICAgIGVuYWJsZUR5bmFtaWNQcmV2aWV3cyA/PyBmYWxzZSxcbiAgICBhbnlDZGVDb25uLFxuICAgIGNoZWNrb3V0U2VjdXJlVG9rZW4sXG4gICAgZm9ybVJlZi5jdXJyZW50XG4gICk7XG4gIGNvbnN0IG9uTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gZnJhbWVCYXNlVXJsKSByZXR1cm47XG4gICAgICBpZiAoIWV2ZW50LnNvdXJjZSkgcmV0dXJuO1xuICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBldmVudC5zb3VyY2U7XG4gICAgICBpZiAoIWlzSnNvblN0cmluZyhldmVudC5kYXRhKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByYXcgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuICAgICAgY29uc3QgZXZlbnREYXRhID0gcGFyc2VFdmVudFBheWxvYWQocmF3KTtcbiAgICAgIGNvbnN0IGVsZW1lbnRJZCA9IGV2ZW50RGF0YS5lbGVtZW50SWQ7XG4gICAgICBjb25zdCB0YXJnZXRGb3JtSWQgPSBldmVudERhdGEuZm9ybUlkO1xuICAgICAgaWYgKHRhcmdldEZvcm1JZCAhPT0gZm9ybUlkIHx8ICFlbGVtZW50SWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW2Zvcm1dIElnbm9yaW5nIHVua25vd24gZXZlbnQ6XCIsIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudERhdGEubm9uY2UgaW4gbm9uY2VzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltmb3JtXSBJZ25vcmluZyBkdXBsaWNhdGUgZXZlbnQ6XCIsIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNldE5vbmNlcygocHJldk5vbmNlcykgPT4gWy4uLnByZXZOb25jZXMsIGV2ZW50RGF0YS5ub25jZV0pO1xuICAgICAgY29uc3QgZXZlbnRQYXlsb2FkID0gZXZlbnREYXRhLnBheWxvYWQ7XG4gICAgICBjb25zdCBldmVudFR5cGUgPSBldmVudFBheWxvYWQudHlwZTtcbiAgICAgIGNvbnNvbGUubG9nKGBbZm9ybV0gUmVjZWl2ZWQgJHtldmVudFR5cGV9IGV2ZW50IGZyb20gJHtlbGVtZW50SWR9OmAsIGV2ZW50RGF0YS5wYXlsb2FkKTtcbiAgICAgIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLkxBWU9VVCkge1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBldmVudFBheWxvYWQuaGVpZ2h0ID8gYCR7ZXZlbnRQYXlsb2FkLmhlaWdodH1weGAgOiBcIjEwMCVcIjtcbiAgICAgICAgc2V0Rm9ybUhlaWdodChoZWlnaHQpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW2Zvcm1dIEVsZW1lbnQgaGVpZ2h0IHNldCB0bzogJHtoZWlnaHR9YCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uRk9DVVMgJiYgISFvbkZvY3VzKSB7XG4gICAgICAgIG9uRm9jdXMoZXZlbnREYXRhLmVsZW1lbnRJZCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uQkxVUiAmJiAhIW9uQmx1cikge1xuICAgICAgICBvbkJsdXIoZXZlbnREYXRhLmVsZW1lbnRJZCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uQ0hBTkdFICYmICEhb25DaGFuZ2UpIHtcbiAgICAgICAgb25DaGFuZ2UoZXZlbnREYXRhLmVsZW1lbnRJZCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uTE9BREVEKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nSWZyYW1lID0gaWZyYW1lcy5maW5kKChpZnJhbWUpID0+IGlmcmFtZS5jb250ZW50V2luZG93ID09PSBldmVudFNvdXJjZSk7XG4gICAgICAgIHNldFByZXZlbnRDbG9zZShmYWxzZSk7XG4gICAgICAgIGlmICghbWF0Y2hpbmdJZnJhbWUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJbZm9ybV0gSWdub3JpbmcgTE9BREVEIGV2ZW50IGZyb20gdW5yZWdpc3RlcmVkIGlmcmFtZTpcIiwgZXZlbnREYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0RXZlbnRUYXJnZXRzKChwcmV2VGFyZ2V0cykgPT4gKHsgLi4ucHJldlRhcmdldHMsIFtlbGVtZW50SWRdOiBldmVudFNvdXJjZSB9KSk7XG4gICAgICAgIHNldFRvdGFsQW1vdW50QXRvbXMoZXZlbnRQYXlsb2FkLnRvdGFsQW1vdW50QXRvbXMpO1xuICAgICAgICBzZXRDdXJyZW5jeShldmVudFBheWxvYWQuY3VycmVuY3kpO1xuICAgICAgICBzZXRDaGVja291dFBheW1lbnRNZXRob2RzKGV2ZW50UGF5bG9hZC5jaGVja291dFBheW1lbnRNZXRob2RzKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uSWQpIHNldFNlc3Npb25JZChldmVudFBheWxvYWQuc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc29sZS5sb2coYFtmb3JtXSBFbGVtZW50IGxvYWRlZCB3aXRoIHByZWZpbGwgZGF0YTpgLCBldmVudFBheWxvYWQpO1xuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLlRPS0VOSVpFX1NUQVJURUQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gVG9rZW5pemF0aW9uIHN0YXJ0ZWRcIik7XG4gICAgICAgIHNldFByZXZlbnRDbG9zZSh0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5DSEVDS09VVF9TVEFSVEVEKSB7XG4gICAgICAgIGlmIChvbkNoZWNrb3V0U3RhcnRlZCkgb25DaGVja291dFN0YXJ0ZWQoKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5QQVlNRU5UX0ZMT1dfU1RBUlRFRCkge1xuICAgICAgICBpZiAoIWV4dHJhRGF0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZXh0cmFEYXRhIG5vdCBwb3B1bGF0ZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFueUNkZUNvbm4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBjb25uZWN0ZWQgdG8gQ0RFYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29uZmlybVBheW1lbnRGbG93JDEgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV4dEFjdGlvblR5cGUgPSBldmVudFBheWxvYWQubmV4dEFjdGlvbk1ldGFkYXRhW1widHlwZVwiXTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBDb25maXJtIHBheW1lbnQgZmxvdzogbmV4dCBhY3Rpb25zOlwiLCBldmVudFBheWxvYWQubmV4dEFjdGlvbk1ldGFkYXRhKTtcbiAgICAgICAgICBpZiAobmV4dEFjdGlvblR5cGUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gQ29uZmlybWluZyBwYXltZW50IGZsb3cgKE5vLW9wKVwiKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5leHRBY3Rpb25UeXBlID09PSBcInN0cmlwZV8zZHNcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gQ29uZmlybWluZyBwYXltZW50IGZsb3cgKFN0cmlwZSAzRFNcIik7XG4gICAgICAgICAgICBhd2FpdCBjb25maXJtUGF5bWVudEZsb3dGb3IzRFMoZXZlbnRQYXlsb2FkKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5leHRBY3Rpb25UeXBlID09PSBcInN0cmlwZV9wYXltZW50X3JlcXVlc3RcIikge1xuICAgICAgICAgICAgaWYgKCFzdHJpcGVQbSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0cmlwZSBQTSBub3Qgc2V0YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBDb25maXJtaW5nIHBheW1lbnQgZmxvdyAoU3RyaXBlIFBSKVwiKTtcbiAgICAgICAgICAgIGF3YWl0IGNvbmZpcm1QYXltZW50Rmxvd0ZvclN0cmlwZVBSTGVnYWN5KGV2ZW50UGF5bG9hZCwgc3RyaXBlUG0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbmV4dCBhY3Rpb24gdHlwZTogJHtuZXh0QWN0aW9uVHlwZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoYW55Q2RlQ29ubik7XG4gICAgICAgICAgaWYgKHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgICAgICBjb25zdCB7IHBheW1lbnRfbWV0aG9kcyB9ID0gYXdhaXQgY29uZmlybVBheW1lbnRGbG93KGFueUNkZUNvbm4sIHtcbiAgICAgICAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuLFxuICAgICAgICAgICAgICBleGlzdGluZ19jY19wbV9pZDogZXh0cmFEYXRhLmV4aXN0aW5nQ0NQTUlkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChwYXltZW50X21ldGhvZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSBvbmUgcGF5bWVudCBtZXRob2QsIGdvdCAke3BheW1lbnRfbWV0aG9kcy5sZW5ndGh9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBQRiBzZXR1cCBwYXltZW50IG1ldGhvZCBjb21wbGV0ZTpcIiwgcGF5bWVudF9tZXRob2RzKTtcbiAgICAgICAgICAgIHNldFByZXZlbnRDbG9zZShmYWxzZSk7XG4gICAgICAgICAgICBzZXRUb2tlbml6ZWQoMCk7XG4gICAgICAgICAgICBzZXRDaGVja291dEZpcmVkKGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzKHBheW1lbnRfbWV0aG9kc1swXS5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBwcm9jZWVkVG9DaGVja291dDogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHByb2NlZWRUb0NoZWNrb3V0OiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uZmlybVBheW1lbnRGbG93JDEoKS50aGVuKCh7IHByb2NlZWRUb0NoZWNrb3V0IH0pID0+IHtcbiAgICAgICAgICBpZiAoIXByb2NlZWRUb0NoZWNrb3V0KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBOT1QgcHJvY2VlZGluZyB0byBjaGVja291dCBhZnRlciBjb25maXJtYXRpb24uXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBTdGFydGluZyBjaGVja291dCBmcm9tIHBheW1lbnQgZmxvdy5cIik7XG4gICAgICAgICAgbGV0IGV4aXN0aW5nQ0NQTUlkO1xuICAgICAgICAgIGlmIChleHRyYURhdGEuY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyID09PSBcImNyZWRpdF9jYXJkXCIpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nQ0NQTUlkID0gZXZlbnRQYXlsb2FkLnN0YXJ0UEZNZXRhZGF0YT8uY2NfcG1faWQ7XG4gICAgICAgICAgICBpZiAoIWV4aXN0aW5nQ0NQTUlkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ0MgUE0gSUQgbm90IGZvdW5kYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVtaXRFdmVudChcbiAgICAgICAgICAgIGV2ZW50U291cmNlLFxuICAgICAgICAgICAgZm9ybUlkLFxuICAgICAgICAgICAgZWxlbWVudElkLFxuICAgICAgICAgICAgeyAuLi5leHRyYURhdGEsIHR5cGU6IFwiQ0hFQ0tPVVRcIiwgZG9Ob3RVc2VMZWdhY3lDQ0Zsb3c6IHRydWUsIGV4aXN0aW5nQ0NQTUlkIH0sXG4gICAgICAgICAgICBmcmFtZUJhc2VVcmxcbiAgICAgICAgICApO1xuICAgICAgICAgIHNldENoZWNrb3V0RmlyZWQodHJ1ZSk7XG4gICAgICAgICAgc2V0RXh0cmFEYXRhKHZvaWQgMCk7XG4gICAgICAgICAgaWYgKG9uQ2hlY2tvdXRTdGFydGVkKSBvbkNoZWNrb3V0U3RhcnRlZCgpO1xuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIENvbmZpcm1hdGlvbiBwYXltZW50IGZsb3cgZXJyb3JcIik7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICBjb25zdCBlcnJNc2cgPSBnZXRFcnJvck1lc3NhZ2UoZSk7XG4gICAgICAgICAgc2V0UHJldmVudENsb3NlKGZhbHNlKTtcbiAgICAgICAgICBzZXRDaGVja291dEZpcmVkKGZhbHNlKTtcbiAgICAgICAgICBpZiAob25DaGVja291dEVycm9yKSBvbkNoZWNrb3V0RXJyb3IoZXJyTXNnKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uVE9LRU5JWkVfU1VDQ0VTUyAmJiAhIWV4dHJhRGF0YSkge1xuICAgICAgICBjb25zdCB0b3RhbFRva2VuaXplZCA9IHRva2VuaXplZCArIDE7XG4gICAgICAgIGNvbnN0IGFsbFRva2VuaXplZCA9IHRvdGFsVG9rZW5pemVkID09PSBPYmplY3Qua2V5cyhldmVudFRhcmdldHMpLmxlbmd0aDtcbiAgICAgICAgaWYgKCFjaGVja291dEZpcmVkICYmIChhbGxUb2tlbml6ZWQgfHwgZXZlbnRQYXlsb2FkLmlzUmVhZHlGb3JDaGVja291dCkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBUb2tlbml6ZWQgY2FyZCBpcyByZWFkeSBmb3IgY2hlY2tvdXRcIik7XG4gICAgICAgICAgZW1pdEV2ZW50KGV2ZW50U291cmNlLCBmb3JtSWQsIGVsZW1lbnRJZCwgZXh0cmFEYXRhLCBmcmFtZUJhc2VVcmwpO1xuICAgICAgICAgIHNldENoZWNrb3V0RmlyZWQodHJ1ZSk7XG4gICAgICAgICAgc2V0RXh0cmFEYXRhKHZvaWQgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtmb3JtXSBFbGVtZW50ICR7ZWxlbWVudElkfSBmaW5pc2hlZCB0b2tlbml6YXRpb24gYnV0IGNhcmQgbm90IHlldCByZWFkeSBmb3IgY2hlY2tvdXRgKTtcbiAgICAgICAgICBzZXRUb2tlbml6ZWQodG90YWxUb2tlbml6ZWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uQ0hFQ0tPVVRfU1VDQ0VTUykge1xuICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBDaGVja291dCBjb21wbGV0ZTpcIiwgZXZlbnRQYXlsb2FkKTtcbiAgICAgICAgc2V0UHJldmVudENsb3NlKGZhbHNlKTtcbiAgICAgICAgc2V0VG9rZW5pemVkKDApO1xuICAgICAgICBzZXRDaGVja291dEZpcmVkKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uQ2hlY2tvdXRTdWNjZXNzKSB7XG4gICAgICAgICAgb25DaGVja291dFN1Y2Nlc3MoZXZlbnRQYXlsb2FkLmludm9pY2VVcmxzLCBldmVudFBheWxvYWQuc3Vic2NyaXB0aW9uSWRzLCBldmVudFBheWxvYWQuY3VzdG9tZXJJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5TRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIFNldHVwIHBheW1lbnQgbWV0aG9kIGNvbXBsZXRlOlwiLCBldmVudFBheWxvYWQpO1xuICAgICAgICBzZXRQcmV2ZW50Q2xvc2UoZmFsc2UpO1xuICAgICAgICBzZXRUb2tlbml6ZWQoMCk7XG4gICAgICAgIHNldENoZWNrb3V0RmlyZWQoZmFsc2UpO1xuICAgICAgICBpZiAob25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzKSB7XG4gICAgICAgICAgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzKGV2ZW50UGF5bG9hZC5wYXltZW50TWV0aG9kSWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uTE9BRF9FUlJPUikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW2Zvcm1dIEVycm9yIGxvYWRpbmcgaWZyYW1lOlwiLCBldmVudFBheWxvYWQubWVzc2FnZSk7XG4gICAgICAgIGlmIChvbkxvYWRFcnJvcikgb25Mb2FkRXJyb3IoZXZlbnRQYXlsb2FkLm1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLlZBTElEQVRJT05fRVJST1IpIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBleHRyYURhdGE/LmNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcjtcbiAgICAgICAgaWYgKHByb3ZpZGVyID09PSBcImNyZWRpdF9jYXJkXCIgfHwgcHJvdmlkZXIgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtmb3JtXSBWYWxpZGF0aW9uIGVycm9yIGZvciAke2V2ZW50UGF5bG9hZC5lbGVtZW50VHlwZX06YCwgZXZlbnRQYXlsb2FkLmVycm9ycyk7XG4gICAgICAgICAgaWYgKG9uVmFsaWRhdGlvbkVycm9yKSBvblZhbGlkYXRpb25FcnJvcihldmVudFBheWxvYWQuZWxlbWVudFR5cGUsIGV2ZW50UGF5bG9hZC5lcnJvcnMsIGVsZW1lbnRJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5UT0tFTklaRV9FUlJPUiB8fCBldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLkNIRUNLT1VUX0VSUk9SKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbZm9ybV0gQVBJIGVycm9yIGZyb20gZWxlbWVudDpcIiwgZXZlbnRQYXlsb2FkLm1lc3NhZ2UpO1xuICAgICAgICBpZiAoZXZlbnRQYXlsb2FkLm1lc3NhZ2UgPT09IFwiM0RTX1JFUVVJUkVEXCIpIHtcbiAgICAgICAgICBjb25zdCBjYXJkQ3BtID0gY2hlY2tvdXRQYXltZW50TWV0aG9kcz8uZmluZCgoY3BtKSA9PiBjcG0ucHJvdmlkZXIgPT09IFwiY3JlZGl0X2NhcmRcIik7XG4gICAgICAgICAgaWYgKCFzZXNzaW9uSWQgfHwgIWZvcm1SZWYuY3VycmVudCB8fCAhb25WYWxpZGF0aW9uRXJyb3IgfHwgIWNhcmRDcG0pIHJldHVybjtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtlbGVtZW50SWQyLCB0YXJnZXRdIG9mIE9iamVjdC5lbnRyaWVzKGV2ZW50VGFyZ2V0cykpIHtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dFdmVudCA9IGNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZChcbiAgICAgICAgICAgICAgRXZlbnRUeXBlLmVudW0uU1RBUlRfUEFZTUVOVF9GTE9XLFxuICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIGZvcm1SZWYuY3VycmVudCxcbiAgICAgICAgICAgICAgb25WYWxpZGF0aW9uRXJyb3IsXG4gICAgICAgICAgICAgIC8vIE9ubHkgc3RyaXBlIHN1cHBvcnRzIGZyb250ZW5kIDNEUyByaWdodCBub3csXG4gICAgICAgICAgICAgIC8vIHNvIHdlIHBhc3MgcHJvY2Vzc29yX25hbWU6ICdzdHJpcGUnIHRvIHRlbGwgZGVsZWdhdG9yIHRvIG9ubHkgdXNlIHN0cmlwZVxuICAgICAgICAgICAgICB7IC4uLmNhcmRDcG0sIHByb2Nlc3Nvcl9uYW1lOiBcInN0cmlwZVwiIH0sXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFzdGFydFBheW1lbnRGbG93RXZlbnQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2V0Q2hlY2tvdXRGaXJlZCh0cnVlKTtcbiAgICAgICAgICAgIHNldEV4dHJhRGF0YShzdGFydFBheW1lbnRGbG93RXZlbnQpO1xuICAgICAgICAgICAgZW1pdEV2ZW50KHRhcmdldCwgZm9ybUlkLCBlbGVtZW50SWQyLCBzdGFydFBheW1lbnRGbG93RXZlbnQsIGZyYW1lQmFzZVVybCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0UHJldmVudENsb3NlKGZhbHNlKTtcbiAgICAgICAgICBzZXRDaGVja291dEZpcmVkKGZhbHNlKTtcbiAgICAgICAgICBpZiAob25DaGVja291dEVycm9yKSBvbkNoZWNrb3V0RXJyb3IoZXZlbnRQYXlsb2FkLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBmb3JtSWQsXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBub25jZXMsXG4gICAgICBleHRyYURhdGEsXG4gICAgICBpZnJhbWVzLFxuICAgICAgZXZlbnRUYXJnZXRzLFxuICAgICAgdG9rZW5pemVkLFxuICAgICAgY2hlY2tvdXRGaXJlZCxcbiAgICAgIG9uQmx1cixcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIG9uTG9hZEVycm9yLFxuICAgICAgb25DaGVja291dFN0YXJ0ZWQsXG4gICAgICBvbkNoZWNrb3V0U3VjY2VzcyxcbiAgICAgIG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyxcbiAgICAgIG9uQ2hlY2tvdXRFcnJvcixcbiAgICAgIG9uVmFsaWRhdGlvbkVycm9yLFxuICAgICAgZnJhbWVCYXNlVXJsLFxuICAgICAgc3RyaXBlUG0sXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2RzLFxuICAgICAgYW55Q2RlQ29ublxuICAgIF1cbiAgKTtcbiAgY29uc3Qgb2pzRmxvd0NhbGxiYWNrcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IG5vT3AgPSAoKSA9PiB7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgb25DaGVja291dEVycm9yOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dEVycm9yXCIsIG9uQ2hlY2tvdXRFcnJvciA/PyBub09wKSxcbiAgICAgIG9uQ2hlY2tvdXRTdGFydGVkOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dFN0YXJ0ZWRcIiwgb25DaGVja291dFN0YXJ0ZWQgPz8gbm9PcCksXG4gICAgICBvbkNoZWNrb3V0U3VjY2VzczogbWFrZUNhbGxiYWNrU2FmZShcIm9uQ2hlY2tvdXRTdWNjZXNzXCIsIG9uQ2hlY2tvdXRTdWNjZXNzID8/IG5vT3ApLFxuICAgICAgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzXCIsIG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyA/PyBub09wKSxcbiAgICAgIG9uVmFsaWRhdGlvbkVycm9yOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25WYWxpZGF0aW9uRXJyb3JcIiwgb25WYWxpZGF0aW9uRXJyb3IgPz8gbm9PcClcbiAgICB9O1xuICB9LCBbb25DaGVja291dEVycm9yLCBvbkNoZWNrb3V0U3RhcnRlZCwgb25DaGVja291dFN1Y2Nlc3MsIG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2Vzcywgb25WYWxpZGF0aW9uRXJyb3JdKTtcbiAgY29uc3QgZ2VuZXJhdGVPanNGbG93Q29udGV4dCA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhmb3JtUmVmLmN1cnJlbnQsIHNlc3Npb25JZCwgY2hlY2tvdXRQYXltZW50TWV0aG9kcyk7XG4gICAgaWYgKCFmb3JtUmVmLmN1cnJlbnQgfHwgIXNlc3Npb25JZCB8fCAhY2hlY2tvdXRQYXltZW50TWV0aG9kcykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY2RlQ29ubmVjdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIE9iamVjdC5lbnRyaWVzKGNkZUNvbm5zKS5mb3JFYWNoKChbZWxlbWVudFR5cGUsIGNkZUNvbm5dKSA9PiB7XG4gICAgICBpZiAoY2RlQ29ubikge1xuICAgICAgICBjZGVDb25uZWN0aW9ucy5zZXQoZWxlbWVudFR5cGUsIGNkZUNvbm4pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChjZGVDb25uZWN0aW9ucy5zaXplID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltPSlNdIG5vIENERSBjb25uZWN0aW9ucyFcIik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIGZvcm1EaXY6IGZvcm1SZWYuY3VycmVudCxcbiAgICAgIGVsZW1lbnRzU2Vzc2lvbklkOiBzZXNzaW9uSWQsXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2RzLFxuICAgICAgY2RlQ29ubmVjdGlvbnMsXG4gICAgICBjdXN0b21Jbml0UGFyYW1zOiBjdXN0b21Jbml0UGFyYW1zID8/IHt9LFxuICAgICAgYmFzZVVybDogbmV3IFVSTChmcmFtZUJhc2VVcmwpLm9yaWdpblxuICAgIH07XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH07XG4gIGNvbnN0IHN1Ym1pdFBSID0gKHByb3ZpZGVyLCBpbml0UmVzdWx0LCBwYXJhbXMpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gZ2VuZXJhdGVPanNGbG93Q29udGV4dCgpO1xuICAgIGlmICghY29udGV4dCB8fCAhZm9ybVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgcmV0dXJuIE9qc0Zsb3dzLnN0cmlwZVBSLnJ1bih7XG4gICAgICBjb250ZXh0LFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0KGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgcHJvdmlkZXIpLFxuICAgICAgbm9uQ2RlRm9ybUlucHV0czogY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtKGZvcm1SZWYuY3VycmVudCksXG4gICAgICBmbG93Q2FsbGJhY2tzOiBvanNGbG93Q2FsbGJhY2tzLFxuICAgICAgY3VzdG9tUGFyYW1zOiB7IHByb3ZpZGVyLCBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBwYXJhbXM/Lm92ZXJyaWRlUGF5bWVudFJlcXVlc3QgfSxcbiAgICAgIGluaXRSZXN1bHRcbiAgICB9KTtcbiAgfTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAob2pzRmxvd3NJbml0aWFsaXphdGlvbiAhPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnNvbGUubG9nKFwiW09KU10gbnVtQ2RlQ29ubnNcIiwgbnVtQ2RlQ29ubnMsIGNkZUNvbm5zKTtcbiAgICBpZiAobnVtQ2RlQ29ubnMgPT09IDApIHJldHVybjtcbiAgICBjb25zb2xlLmxvZyhcIltPSlNdIEluaXRpYWxpemluZ1wiKTtcbiAgICBjb25zdCBjb250ZXh0ID0gZ2VuZXJhdGVPanNGbG93Q29udGV4dCgpO1xuICAgIGlmICghY29udGV4dCkgcmV0dXJuO1xuICAgIGNvbnNvbGUubG9nKFwiW09KU10gU3RhcnRpbmcgaW5pdFwiKTtcbiAgICBjb25zdCBpbml0aWFsaXphdGlvbiA9IGluaXRpYWxpemVPanNGbG93cyhjb250ZXh0LCBvanNGbG93Q2FsbGJhY2tzKTtcbiAgICBzZXRPanNGbG93c0luaXRpYWxpemF0aW9uKGluaXRpYWxpemF0aW9uKTtcbiAgICBjb25zb2xlLmxvZyhcIltPSlNdIFN1YnNjcmliZVwiKTtcbiAgICBpbml0aWFsaXphdGlvbi5zdHJpcGVQUi5zdWJzY3JpYmUoKHN0YXR1cykgPT4ge1xuICAgICAgY29uc29sZS5sb2coXCJbT0pTXSBzZXRQYXltZW50UmVxdWVzdHNcIiwgc3RhdHVzKTtcbiAgICAgIGlmIChzdGF0dXMuc3RhdHVzID09PSBcImxvYWRpbmdcIikge1xuICAgICAgICBzZXRQYXltZW50UmVxdWVzdHMuc2V0KFwiYXBwbGVfcGF5XCIsIFBSX0xPQURJTkcpO1xuICAgICAgICBzZXRQYXltZW50UmVxdWVzdHMuc2V0KFwiZ29vZ2xlX3BheVwiLCBQUl9MT0FESU5HKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzLnN0YXR1cyA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgIHNldFBheW1lbnRSZXF1ZXN0cy5zZXQoXCJhcHBsZV9wYXlcIiwgUFJfRVJST1IpO1xuICAgICAgICBzZXRQYXltZW50UmVxdWVzdHMuc2V0KFwiZ29vZ2xlX3BheVwiLCBQUl9FUlJPUik7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cy5zdGF0dXMgPT09IFwibG9hZGVkXCIpIHtcbiAgICAgICAgY29uc3QgaW5pdFJlc3VsdCA9IHN0YXR1cy5yZXN1bHQ7XG4gICAgICAgIGNvbnN0IGNhbkFwcGxlUGF5ID0gaW5pdFJlc3VsdC5pc0F2YWlsYWJsZSAmJiBpbml0UmVzdWx0LmF2YWlsYWJsZVByb3ZpZGVycy5hcHBsZVBheTtcbiAgICAgICAgY29uc3QgY2FuR29vZ2xlUGF5ID0gaW5pdFJlc3VsdC5pc0F2YWlsYWJsZSAmJiBpbml0UmVzdWx0LmF2YWlsYWJsZVByb3ZpZGVycy5nb29nbGVQYXk7XG4gICAgICAgIHNldFBheW1lbnRSZXF1ZXN0cy5zZXQoXCJhcHBsZV9wYXlcIiwge1xuICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgaXNBdmFpbGFibGU6IGNhbkFwcGxlUGF5LFxuICAgICAgICAgIHN0YXJ0RmxvdzogYXN5bmMgKHVzZXJQYXJhbXMpID0+IGNhbkFwcGxlUGF5ID8gc3VibWl0UFIoXCJhcHBsZV9wYXlcIiwgaW5pdFJlc3VsdCwgdXNlclBhcmFtcykgOiB2b2lkIDBcbiAgICAgICAgfSk7XG4gICAgICAgIHNldFBheW1lbnRSZXF1ZXN0cy5zZXQoXCJnb29nbGVfcGF5XCIsIHtcbiAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGlzQXZhaWxhYmxlOiBjYW5Hb29nbGVQYXksXG4gICAgICAgICAgc3RhcnRGbG93OiBhc3luYyAodXNlclBhcmFtcykgPT4gY2FuR29vZ2xlUGF5ID8gc3VibWl0UFIoXCJnb29nbGVfcGF5XCIsIGluaXRSZXN1bHQsIHVzZXJQYXJhbXMpIDogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaW5pdGlhbGl6YXRpb24uc3RyaXBlTGluay5zdWJzY3JpYmUoKGluaXQpID0+IHtcbiAgICAgICAgaWYgKGluaXQuc3RhdHVzID09PSBcImxvYWRlZFwiICYmIGluaXQucmVzdWx0LmlzQXZhaWxhYmxlKSB7XG4gICAgICAgICAgc2V0U3RyaXBlTGlua0N0cmwoaW5pdC5yZXN1bHQuY29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LCBbZm9ybVJlZi5jdXJyZW50LCBzZXNzaW9uSWQsIGNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIG51bUNkZUNvbm5zID09PSAwXSk7XG4gIGNvbnN0IHN1Ym1pdENhcmQgPSAoKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGdlbmVyYXRlT2pzRmxvd0NvbnRleHQoKTtcbiAgICBpZiAoIWZvcm1SZWYuY3VycmVudCB8fCAhc2Vzc2lvbklkIHx8ICFhbnlDZGVDb25uIHx8ICFjaGVja291dFBheW1lbnRNZXRob2RzIHx8ICFjb250ZXh0KSByZXR1cm47XG4gICAgT2pzRmxvd3MuY29tbW9uQ0MucnVuKHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IGZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QoY2hlY2tvdXRQYXltZW50TWV0aG9kcywgXCJjcmVkaXRfY2FyZFwiKSxcbiAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IGNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybShmb3JtUmVmLmN1cnJlbnQpLFxuICAgICAgZmxvd0NhbGxiYWNrczogb2pzRmxvd0NhbGxiYWNrcyxcbiAgICAgIGN1c3RvbVBhcmFtczogdm9pZCAwLFxuICAgICAgLy8gVGhpcyBmbG93IHJlcXVpcmVzIG5vIGN1c3RvbSBwYXJhbXNcbiAgICAgIGluaXRSZXN1bHQ6IHZvaWQgMFxuICAgICAgLy8gVGhpcyBmbG93IHJlcXVpcmVzIG5vIGluaXRpYWxpemF0aW9uXG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IG9uQmVmb3JlVW5sb2FkID0gdXNlQ2FsbGJhY2soXG4gICAgKGUpID0+IHtcbiAgICAgIGlmIChwcmV2ZW50Q2xvc2UpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuICAgIFtwcmV2ZW50Q2xvc2VdXG4gICk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGxvYWRlZCB8fCAhZm9ybVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgY29uc3QgYXJlSWZyYW1lc0xvYWRlZCA9IGlmcmFtZXMubGVuZ3RoID4gMCAmJiBpZnJhbWVzLmxlbmd0aCA9PT0gT2JqZWN0LmtleXMoZXZlbnRUYXJnZXRzKS5sZW5ndGg7XG4gICAgaWYgKGFyZUlmcmFtZXNMb2FkZWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIEFsbCBlbGVtZW50cyBsb2FkZWRcIik7XG4gICAgICBzZXRMb2FkZWQodHJ1ZSk7XG4gICAgICBpZiAob25Mb2FkKSBvbkxvYWQodG90YWxBbW91bnRBdG9tcywgY3VycmVuY3kpO1xuICAgIH1cbiAgfSwgW2lmcmFtZXMsIGV2ZW50VGFyZ2V0cywgbG9hZGVkLCBvbkxvYWQsIHRvdGFsQW1vdW50QXRvbXMsIGN1cnJlbmN5XSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0UmVmZXJlcih3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25NZXNzYWdlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBvbkJlZm9yZVVubG9hZCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIG9uQmVmb3JlVW5sb2FkKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBvbk1lc3NhZ2UpO1xuICAgIH07XG4gIH0sIFtzZXNzaW9uSWQsIG9uTWVzc2FnZSwgb25CZWZvcmVVbmxvYWRdKTtcbiAgY29uc3QgcmVnaXN0ZXJJZnJhbWUgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoaWZyYW1lKSA9PiB7XG4gICAgICBjb25zdCBleGlzdGluZ0lmcmFtZSA9IGlmcmFtZXMuZmluZCgoZXhpc3RpbmdJZnJhbWUyKSA9PiBleGlzdGluZ0lmcmFtZTIuY29udGVudFdpbmRvdyA9PT0gaWZyYW1lLmNvbnRlbnRXaW5kb3cpO1xuICAgICAgY29uc29sZS5sb2coXCJbT0pTXSBDYWxsaW5nIHJlZ2lzdGVyIGlmcmFtZS4gRXhpc3Rpbmc/XCIsIGV4aXN0aW5nSWZyYW1lKTtcbiAgICAgIGlmIChleGlzdGluZ0lmcmFtZSkgcmV0dXJuO1xuICAgICAgc2V0SWZyYW1lcygocHJldklmcmFtZXMpID0+IFsuLi5wcmV2SWZyYW1lcywgaWZyYW1lXSk7XG4gICAgICBjb25zb2xlLmxvZyhcIltPSlNdW2Zvcm1dIFJlZ2lzdGVyaW5nIGlmcmFtZTpcIiwgaWZyYW1lKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGVGcm9tSWZyYW1lSWQoaWZyYW1lLmlkKTtcbiAgICAgIGF3YWl0IGNvbm5lY3RUb0NkZUlmcmFtZShlbGVtZW50VHlwZSwgaWZyYW1lKTtcbiAgICB9LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbaWZyYW1lc11cbiAgKTtcbiAgY29uc3QgdmFsdWUgPSB7XG4gICAgZm9ybUlkLFxuICAgIGZvcm1IZWlnaHQsXG4gICAgcmVmZXJlcixcbiAgICBjaGVja291dFNlY3VyZVRva2VuLFxuICAgIHJlZ2lzdGVySWZyYW1lLFxuICAgIGJhc2VVcmw6IGZyYW1lQmFzZVVybFxuICB9O1xuICBjb25zdCBjaGlsZHJlblByb3BzID0ge1xuICAgIHN1Ym1pdDogc3VibWl0Q2FyZCxcbiAgICBhcHBsZVBheTogcGF5bWVudFJlcXVlc3RzLmFwcGxlX3BheSxcbiAgICBnb29nbGVQYXk6IHBheW1lbnRSZXF1ZXN0cy5nb29nbGVfcGF5LFxuICAgIGxvYWRlZCxcbiAgICBwcmV2aWV3OiBkeW5hbWljUHJldmlldyxcbiAgICBzdHJpcGVMaW5rOiBzdHJpcGVMaW5rQ3RybFxuICB9O1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChFbGVtZW50c0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWUsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lLCByZWY6IGZvcm1SZWYsIGNoaWxkcmVuOiBjaGlsZHJlbihjaGlsZHJlblByb3BzKSB9KSB9KTtcbn07XG5cbmNvbnN0IEVsZW1lbnRGcmFtZSA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHN1YlBhdGgsIHN0eWxlcyB9ID0gcHJvcHM7XG4gIGNvbnN0IHsgZm9ybUlkLCByZWZlcmVyLCBmb3JtSGVpZ2h0LCBjaGVja291dFNlY3VyZVRva2VuLCByZWdpc3RlcklmcmFtZSwgYmFzZVVybCB9ID0gdXNlT3BlblBheUVsZW1lbnRzKCk7XG4gIGNvbnN0IFtoYXNMb2FkZWQsIHNldEhhc0xvYWRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IGlmcmFtZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgZWxlbWVudFN0eWxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFzdHlsZXMpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiBjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyhzdHlsZXMpO1xuICB9LCBbc3R5bGVzXSk7XG4gIGNvbnN0IGZyYW1lU3R5bGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgIGhlaWdodDogZm9ybUhlaWdodFxuICAgIH07XG4gIH0sIFtmb3JtSGVpZ2h0XSk7XG4gIGNvbnN0IHF1ZXJ5U3RyaW5nID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFjaGVja291dFNlY3VyZVRva2VuIHx8ICFyZWZlcmVyKSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgcGFyYW1zLmFwcGVuZChcInJlZmVyZXJcIiwgcmVmZXJlcik7XG4gICAgcGFyYW1zLmFwcGVuZChcInN0eWxlc1wiLCBlbGVtZW50U3R5bGUpO1xuICAgIHBhcmFtcy5hcHBlbmQoXCJmb3JtSWRcIiwgZm9ybUlkKTtcbiAgICBwYXJhbXMuYXBwZW5kKFwic2VjdXJlVG9rZW5cIiwgY2hlY2tvdXRTZWN1cmVUb2tlbik7XG4gICAgcmV0dXJuIHBhcmFtcy50b1N0cmluZygpO1xuICB9LCBbZWxlbWVudFN0eWxlLCBmb3JtSWQsIHJlZmVyZXIsIGNoZWNrb3V0U2VjdXJlVG9rZW5dKTtcbiAgdXNlRWZmZWN0KCgpID0+IHNldEhhc0xvYWRlZCh0cnVlKSwgW10pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiW09KU10gZWxlbWVudCBmcmFtZSByZWdpc3RlciBhdHRlbXB0XCIsICEhaWZyYW1lUmVmLmN1cnJlbnQsICEhaGFzTG9hZGVkKTtcbiAgICBpZiAoIWlmcmFtZVJlZi5jdXJyZW50IHx8ICFoYXNMb2FkZWQpIHJldHVybjtcbiAgICByZWdpc3RlcklmcmFtZShpZnJhbWVSZWYuY3VycmVudCk7XG4gIH0sIFtoYXNMb2FkZWRdKTtcbiAgaWYgKCFjaGVja291dFNlY3VyZVRva2VuKSB7XG4gICAgY29uc29sZS5lcnJvcihcIltmb3JtXSBDYW5ub3QgcmVuZGVyIHBhcnRpYWxseSBpbml0aWFsaXplZCBmcmFtZVwiKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcImRpdlwiLCB7fSk7XG4gIH1cbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgXCJpZnJhbWVcIixcbiAgICB7XG4gICAgICBpZDogYG9qcy0ke3N1YlBhdGh9LWVsZW1lbnRgLFxuICAgICAgbmFtZTogYCR7c3ViUGF0aH0tZWxlbWVudGAsXG4gICAgICBjbGFzc05hbWU6IFwib2pzLWlmcmFtZVwiLFxuICAgICAgc3JjOiBgJHtiYXNlVXJsfS9hcHAvdjEvJHtzdWJQYXRofS1lbGVtZW50Lz8ke3F1ZXJ5U3RyaW5nfWAsXG4gICAgICBzdHlsZTogZnJhbWVTdHlsZSxcbiAgICAgIHJlZjogaWZyYW1lUmVmXG4gICAgfVxuICApO1xufTtcblxuY29uc3QgQ2FyZEN2Y0VsZW1lbnQgPSAoeyBzdHlsZXMgfSkgPT4ge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChFbGVtZW50RnJhbWUsIHsgc3R5bGVzLCBzdWJQYXRoOiBcImNhcmQtY3ZjXCIgfSk7XG59O1xuXG5jb25zdCBDYXJkRWxlbWVudCA9ICh7IHN0eWxlcyB9KSA9PiB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KEVsZW1lbnRGcmFtZSwgeyBzdHlsZXMsIHN1YlBhdGg6IFwiY2FyZFwiIH0pO1xufTtcblxuY29uc3QgQ2FyZEV4cGlyeUVsZW1lbnQgPSAoeyBzdHlsZXMgfSkgPT4ge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChFbGVtZW50RnJhbWUsIHsgc3R5bGVzLCBzdWJQYXRoOiBcImNhcmQtZXhwaXJ5XCIgfSk7XG59O1xuXG5jb25zdCBDYXJkTnVtYmVyRWxlbWVudCA9ICh7IHN0eWxlcyB9KSA9PiB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KEVsZW1lbnRGcmFtZSwgeyBzdHlsZXMsIHN1YlBhdGg6IFwiY2FyZC1udW1iZXJcIiB9KTtcbn07XG5cbmV4cG9ydCB7IENhcmRDdmNFbGVtZW50LCBDYXJkRWxlbWVudCwgQ2FyZEV4cGlyeUVsZW1lbnQsIENhcmROdW1iZXJFbGVtZW50LCBFbGVtZW50c0Zvcm0sIEZpZWxkTmFtZSwgdXNlT3BlblBheUVsZW1lbnRzIH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsT0FBT0EsTUFBYyxpQkFBQUMsSUFBZSxjQUFBQyxJQUFZLFVBQUFDLElBQVEsZUFBQUMsR0FBYSxhQUFBQyxHQUFXLFlBQUFDLEdBQVUsV0FBQUMsVUFBZTtBQUN6RyxTQUFTLE9BQUFDLFNBQVc7QUFDcEIsU0FBUyxLQUFBQyxTQUFTO0FBQ2xCLFNBQVMsTUFBQUMsVUFBVTtBQUNuQixTQUFTLGtCQUFBQyxVQUFzQjtBQUMvQixPQUFPQyxRQUFXO0FBRWxCLE1BQU1DLEtBQWtCWixHQUFjO0FBQUEsRUFDcEMsUUFBUTtBQUFBLEVBQ1IsWUFBWTtBQUFBLEVBQ1osU0FBUztBQUFBLEVBQ1QscUJBQXFCO0FBQUEsRUFDckIsZ0JBQWdCLE1BQU07QUFBQSxFQUN0QjtBQUFBLEVBQ0EsU0FBUztBQUNYLENBQUMsR0FFS2EsS0FBcUIsTUFBTTtBQUMvQixRQUFNQyxJQUFVYixHQUFXVyxFQUFlO0FBQzFDLE1BQUksQ0FBQ0U7QUFDSCxVQUFNLElBQUksTUFBTSxtRUFBbUU7QUFFckYsU0FBT0E7QUFDVCxHQUVNQyxLQUFpQiw4QkFFakJDLEtBQTRCUixFQUFFLE9BQU87QUFBQSxFQUN6QyxNQUFNQSxFQUFFLE9BQU87QUFBQSxFQUNmLEtBQUtBLEVBQUUsTUFBTUEsRUFBRSxPQUFPLENBQUM7QUFBQSxFQUN2QixLQUFLQSxFQUFFLE9BQU87QUFBQSxFQUNkLEtBQUtBLEVBQUUsT0FBTztBQUNoQixDQUFDLEdBQ0tTLEtBQWtDVCxFQUFFLE1BQU1RLEVBQXlCLEdBQ25FRSxLQUFnQlYsRUFBRSxPQUFPO0FBQUEsRUFDN0IsTUFBTUEsRUFBRSxPQUFPO0FBQUEsRUFDZixTQUFTQSxFQUFFLE9BQU87QUFBQSxFQUNsQixNQUFNQSxFQUFF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QUdBLENBQU87QUFBQSxNQUNoQixXQUFXO0FBQUEsTUFDWCxLQUFLLEdBQUc1WixDQUFPLFdBQVc0WixDQUFPLGFBQWFNLENBQVc7QUFBQSxNQUN6RCxPQUFPRDtBQUFBLE1BQ1AsS0FBS0Y7QUFBQSxJQUNQO0FBQUEsRUFDRixLQWJFLFFBQVEsTUFBTSxrREFBa0QsR0FDekMsZ0JBQUE3aUIsRUFBSSxPQUFPLENBQUMsQ0FBQztBQWF4QyxHQUVNaWpCLEtBQWlCLENBQUMsRUFBRSxRQUFBemIsRUFBTyxNQUNSLGdCQUFBeEgsRUFBSXlpQixJQUFjLEVBQUUsUUFBQWpiLEdBQVEsU0FBUyxXQUFXLENBQUMsR0FHcEUwYixLQUFjLENBQUMsRUFBRSxRQUFBMWIsRUFBTyxNQUNMLGdCQUFBeEgsRUFBSXlpQixJQUFjLEVBQUUsUUFBQWpiLEdBQVEsU0FBUyxPQUFPLENBQUMsR0FHaEUyYixLQUFvQixDQUFDLEVBQUUsUUFBQTNiLEVBQU8sTUFDWCxnQkFBQXhILEVBQUl5aUIsSUFBYyxFQUFFLFFBQUFqYixHQUFRLFNBQVMsY0FBYyxDQUFDLEdBR3ZFNGIsS0FBb0IsQ0FBQyxFQUFFLFFBQUE1YixFQUFPLE1BQ1gsZ0JBQUF4SCxFQUFJeWlCLElBQWMsRUFBRSxRQUFBamIsR0FBUSxTQUFTLGNBQWMsQ0FBQzsiLAogICJuYW1lcyI6IFsicmVxdWlyZSQkMCIsICJjcmVhdGVDb250ZXh0IiwgInVzZUNvbnRleHQiLCAidXNlUmVmIiwgInVzZUNhbGxiYWNrIiwgInVzZUVmZmVjdCIsICJ1c2VTdGF0ZSIsICJ1c2VNZW1vIiwgImpzeCIsICJ6IiwgInY0IiwgImNvbm5lY3RUb0NoaWxkIiwgImNoYWxrIiwgIkVsZW1lbnRzQ29udGV4dCIsICJ1c2VPcGVuUGF5RWxlbWVudHMiLCAiY29udGV4dCIsICJGUkFNRV9CQVNFX1VSTCIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciQxIiwgIlB5ZGFudGljVmFsaWRhdGlvbkVycm9yUmVzcG9uc2UiLCAiWm9kRmllbGRFcnJvciIsICJab2RGaWVsZEVycm9ycyIsICJNQVBfVE9fSFVNQU5fRlJJRU5ETFlfTE9XRVJDQVNFIiwgImdldEh1bWFuRnJpZW5kbHlNZXNzYWdlIiwgIm9nRXJyb3JNZXNzYWdlIiwgImtleSIsICJpc1N0cmluZ2lmaWVkSnNvbk9iamVjdCIsICJzdHIiLCAiY3JlYXRlTWVzc2FnZUZyb21QeWRhbnRpY1ZhbGlkYXRpb25FcnJvciIsICJyZXNwb25zZSIsICJlcnIiLCAiY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyIsICJlcnJvcnMiLCAiZ2V0RXJyb3JNZXNzYWdlIiwgIm9iaiIsICJlMiIsICJtYWtlQ2FsbGJhY2tTYWZlIiwgImNhbGxiYWNrTmFtZSIsICJmbiIsICJhcmdzIiwgImVycm9yIiwgIlJlcXVpcmVkU3RyaW5nIiwgIk9wdGlvbmFsU3RyaW5nIiwgIm51bGxPclVuZGVmT3IkMSIsICJ6VHlwZSIsICJGaWVsZE5hbWUiLCAiRmllbGROYW1lMiIsICJGaWVsZE5hbWVFbnVtIiwgIlByaXZhdGVGaWVsZE5hbWUiLCAiUHJpdmF0ZUZpZWxkTmFtZTIiLCAiUHJpdmF0ZUZpZWxkTmFtZUVudW0iLCAiQWxsRmllbGROYW1lcyIsICJFbGVtZW50VHlwZUVudW0iLCAiRWxlbWVudFR5cGVFbnVtMiIsICJFbGVtZW50VHlwZSIsICJDaGVja291dFBheW1lbnRNZXRob2QkMSIsICJQYXltZW50TWV0aG9kTWluaW1hbCIsICJFdmVudFR5cGUiLCAiR2VuZXJpY0V2ZW50VHlwZSIsICJHZW5lcmljRXZlbnRQYXlsb2FkIiwgIklucHV0RXZlbnRUeXBlIiwgIklucHV0RXZlbnRQYXlsb2FkIiwgIkVycm9yRXZlbnRUeXBlIiwgIkVycm9yRXZlbnRQYXlsb2FkIiwgIlZhbGlkYXRpb25FcnJvckV2ZW50VHlwZSIsICJWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQiLCAiTGF5b3V0RXZlbnRQYXlsb2FkIiwgIkxvYWRlZEV2ZW50UGF5bG9hZCIsICJQYXltZW50Rmxvd1N0YXJ0ZWRFdmVudFBheWxvYWQiLCAiU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQiLCAiUmVxdWlyZWRGb3JtRmllbGRzIiwgIlBSRm9ybUZpZWxkcyIsICJTdWJtaXRFdmVudFR5cGUiLCAiU3VibWl0RXZlbnRQYXlsb2FkIiwgIlRva2VuaXplU3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQiLCAiRXZlbnRQYXlsb2FkIiwgIkVsZW1lbnRFdmVudCIsICJDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSIsICJGaWVsZFZhbGlkYXRpb25FcnJvciIsICJUb2tlbml6ZUNhcmRFcnJvclJlc3BvbnNlIiwgIlRva2VuaXplQ2FyZFJlc3BvbnNlIiwgIlRocmVlRFNTdGF0dXMiLCAiVGhyZWVEU1N0YXR1czIiLCAiUGluZzNEU1N0YXR1c1Jlc3BvbnNlIiwgIkNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJleHRyYWN0SXNzdWVzUGVyRmllbGQiLCAiaXNzdWVzUGVyRmllbGQiLCAidmFsdWUiLCAiZmllbGROYW1lIiwgIlN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YSIsICJvdXJDdXJyZW5jeVRvVGhlaXJzIiwgImdldExvYWRlZFN0cmlwZSIsICJwdWJsaXNoYWJsZUtleSIsICJpIiwgImlzU3RyaXBlSnNQcmVzZW50IiwgInNsZWVwIiwgImNyZWF0ZVN0cmlwZUVsZW1lbnRzIiwgInN0cmlwZVB1YktleSIsICJlbGVtZW50c09wdGlvbnMiLCAic3RyaXBlIiwgImNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0IiwgInRvdGFsQW1vdW50QXRvbSIsICJjdXJyZW5jeSIsICJpc0Ftb3VudFBlbmRpbmciLCAiaXNMaW5rT25seSIsICJzdHJpcGVDdXJyZW5jeSIsICJ0aW1lb3V0TXMiLCAicmVzb2x2ZSIsICJ3YWl0Rm9yVXNlclRvQWRkUGF5bWVudE1ldGhvZCIsICJwYXltZW50UmVxdWVzdCIsICJyZWplY3QiLCAiZXZ0IiwgImUiLCAiY29uZmlybVBheW1lbnRGbG93Rm9yU3RyaXBlUFJMZWdhY3kiLCAicGF5bG9hZCIsICJzdHJpcGVQbSIsICJuZXh0QWN0aW9uTWV0YWRhdGEiLCAiY29uZmlybVJlc3VsdCIsICJjb25maXJtU3RyaXBlUHJQTSIsICJjb25maXJtUGF5bWVudEZsb3dGb3IzRFMiLCAibGF1bmNoU3RyaXBlM0RTRGlhbG9nRmxvdyIsICJfYSIsICJfYiIsICJfYyIsICJfZCIsICJyZXN1bHRTdGF0dXMiLCAiY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmciLCAic3R5bGVzIiwgImNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybSIsICJmb3JtRGl2IiwgImluaXRpYWxEaWN0IiwgImFjYyIsICJpbnB1dCIsICJjb25zdHJ1Y3RTdWJtaXRFdmVudFBheWxvYWQiLCAiZXZlbnRUeXBlIiwgInNlc3Npb25JZCIsICJvblZhbGlkYXRpb25FcnJvciIsICJjaGVja291dFBheW1lbnRNZXRob2QiLCAiZG9Ob3RVc2VMZWdhY3lDQ0Zsb3ciLCAicGF5bWVudEZsb3dNZXRhZGF0YSIsICJleHRyYURhdGEiLCAiZm9ybWF0dGVkIiwgImlzc3VlcyIsICJwYXJzZUV2ZW50UGF5bG9hZCIsICJldmVudERhdGEiLCAiZW1pdEV2ZW50IiwgInRhcmdldCIsICJmb3JtSWQiLCAiZWxlbWVudElkIiwgImJhc2VVcmwiLCAiZXZlbnQiLCAiY2hlY2tJZlZhbGlkQ2RlQ29ubmVjdGlvbk9iamVjdCIsICJwaW5nIiwgInJlc3VsdCIsICJpc1Jlc3VsdFZhbGlkIiwgImlzVmFsaWQiLCAiY3JlYXRlQ2RlQ29ubmVjdGlvbiIsICJpZnJhbWUiLCAiY29ubmVjdGlvbk9iaiIsICJpc1ZhbGlkT2JqZWN0IiwgIm51bGxPclVuZGVmT3IiLCAiQ0RFUmVzcG9uc2VFcnJvciIsICJDb3Vwb25NaW5pbWFsIiwgIkxpbmVJdGVtIiwgIkJyYW5kU2V0dGluZ3MiLCAiQnJhbmQiLCAiQ2hlY2tvdXRQYXltZW50TWV0aG9kIiwgIlN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsIiwgIlN1YnNjcmlwdGlvbk1pbmltYWwiLCAiSW52b2ljZUl0ZW1EaXNjb3VudEFtb3VudHNNaW5pbWFsIiwgIkludm9pY2VMaW5lSXRlbU1pbmltYWwiLCAiRGlzY291bnRNaW5pbWFsIiwgIkludm9pY2VNaW5pbWFsIiwgIkNyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCIsICJQcmV2aWV3Q2hlY2tvdXRSZXNwb25zZSIsICJfUGF5bWVudEZvcm1QcmVmaWxsQ29tbW9uIiwgIlBheW1lbnRGb3JtUHJlZmlsbCIsICJDb21wbGV0ZWRGb3JtUHJlZmlsbCIsICJFeHBpcmVkRm9ybVByZWZpbGwiLCAiQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UiLCAiU2V0dXBDaGVja291dFJlc3BvbnNlIiwgIlB5ZGFudGljVmFsaWRhdGlvbkVycm9yIiwgIlN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSIsICJTdGFydFBheW1lbnRGbG93Rm9yQ0NSZXNwb25zZSIsICJzdW0iLCAiYXJyIiwgImEiLCAiYiIsICJmaXhQcm90byIsICJwcm90b3R5cGUiLCAic2V0UHJvdG90eXBlT2YiLCAiZml4U3RhY2siLCAiY2FwdHVyZVN0YWNrVHJhY2UiLCAiX19leHRlbmRzIiwgIl9leHRlbmRTdGF0aWNzIiwgImQiLCAicCIsICJfXyIsICJDdXN0b21FcnJvciIsICJfc3VwZXIiLCAibWVzc2FnZSIsICJvcHRpb25zIiwgIl9uZXdUYXJnZXQiLCAiX3RoaXMiLCAiQ2RlRXJyb3IiLCAiZnJpZW5kbHlNZXNzYWdlIiwgInF1ZXJ5Q0RFIiwgImNkZUNvbm4iLCAiZGF0YSIsICJyZXNwb25zZVNjaGVtYSIsICJpc0NERVJlc3BvbnNlRXJyb3IiLCAiY2hlY2tJZkNvbmZvcm1zVG9TY2hlbWEiLCAic2NoZW1hIiwgImdldENoZWNrb3V0UHJldmlldyIsICJyZXF1ZXN0IiwgImdldFByZWZpbGwiLCAic3RhcnRQYXltZW50RmxvdyIsICJzdGFydFBheW1lbnRGbG93Rm9yQ0MiLCAic3RhcnRQYXltZW50Rmxvd0ZvclBSIiwgImNvbmZpcm1QYXltZW50RmxvdyIsICJ3YWl0Rm9yRm9ybUZpZWxkSW5wdXQiLCAid2FpdFRpbWVNcyIsICJzdGFydFdhaXRUaW1lIiwgIm1hdGNoIiwgImdldENoZWNrb3V0VmFsdWUiLCAic2VjdXJlVG9rZW4iLCAicHJvbW9Db2RlIiwgImNoZWNrb3V0UHJldmlldyIsICJjdXJyZW5jaWVzIiwgImludiIsICJhbW91bnRBdG9tIiwgImdldENoZWNrb3V0UHJldmlld0Ftb3VudCIsICJpc1NldHVwTW9kZSIsICJ0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zIiwgImFsbENkZUNvbm5lY3Rpb25zIiwgImNoZWNrb3V0Q2FyZEVsZW1lbnRzIiwgInNldHVwQ2hlY2tvdXQiLCAicGVyZm9ybUNoZWNrb3V0IiwgIkNERV9QT0xMSU5HX0lOVEVSVkFMIiwgInBpbmdDZGVGb3IzZHNTdGF0dXMiLCAiY2hpbGRPcmlnaW4iLCAiaXNKc29uU3RyaW5nIiwgImFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzIiwgInNpbXBsZU9qc0Zsb3ciLCAicGFyYW1zIiwgImZsb3dSZXN1bHQiLCAiYWRkRXJyb3JDYXRjaGVyRm9ySW5pdCIsICJpbml0IiwgImVycl9fIiwgImNyZWF0ZU9qc0Zsb3dMb2dnZXJzIiwgInByZWZpeCIsICJsb2ciLCAibG9nX18kNSIsICJlcnJfXyQ1IiwgInBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UiLCAiZmluZENwbU1hdGNoaW5nVHlwZSIsICJhbGxDUE1zIiwgInpvZE1vZGVsIiwgImNwbSIsICJjcG0yIiwgImxvZ19fJDQiLCAiZXJyX18kNCIsICJ2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyIsICJub25DZGVGb3JtSW5wdXRzIiwgInZhbGlkYXRlVG9rZW5pemVDYXJkUmVzdWx0cyIsICJ0b2tlbml6ZVJlc3VsdHMiLCAidG9rZW5pemVSZXN1bHQiLCAicGFyc2VkIiwgIk9KU19TVFJJUEVfTElOS19CVE5fSUQiLCAibG9nX18kMyIsICJlcnJfXyQzIiwgIlN0cmlwZUxpbmtDcG0iLCAiU3RyaXBlTGlua1JlcXVpcmVkVXNlckFjdGlvbnMiLCAiaW5pdFN0cmlwZUxpbmtGbG93IiwgImZsb3dDYWxsYmFja3MiLCAiaW5pdFBhcmFtcyIsICJzdHJpcGVMaW5rQ3BtIiwgImFueUNkZUNvbm5lY3Rpb24iLCAicHJlZmlsbCIsICJpbml0aWFsUHJldmlldyIsICJlbGVtZW50cyIsICJleHByZXNzQ2hlY2tvdXRFbGVtZW50IiwgIm1vdW50QnV0dG9uIiwgImRpc21vdW50QnV0dG9uIiwgIk9qc0Zsb3dzIiwgImdldEVsZW1lbnRCeUlkQXN5bmMiLCAicnVuU3RyaXBlTGlua0Zsb3ciLCAiY3VzdG9tUGFyYW1zIiwgIm1lcmdlZElucHV0cyIsICJmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBNIiwgIm5vbkNkZUZvcm1GaWVsZHMiLCAic3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlIiwgIm91ckV4aXN0aW5nUG1JZCIsICJjaGVja291dFJlcXVlc3QiLCAiZm9ybUlucHV0cyIsICJfZSIsICJpbnB1dHMiLCAicGF5ZXJGaXJzdE5hbWUiLCAicGF5ZXJMYXN0TmFtZVBhcnRzIiwgInBheWVyTGFzdE5hbWUiLCAiaWQiLCAiZ2V0RWxlbWVudCIsICJlbGVtZW50IiwgImNyZWF0ZUFuZE9wZW5GcmFtZSIsICJ1cmwiLCAidGVtcGxhdGUiLCAiaG9zdCIsICJzaGFkb3dSb290IiwgImNhbmNlbEJ1dHRvbiIsICJzdGFydFBvbGxpbmciLCAib25TdWNjZXNzIiwgImhhbmRsZVBvbGxpbmciLCAic3RhdHVzIiwgInBvbGxpbmdJbnRlcnZhbCIsICJoYW5kbGVFdmVudHMiLCAiaGFuZGxlQ2FuY2VsIiwgInN0YXJ0M2RzVmVyaWZpY2F0aW9uIiwgImNsZWFudXBFdmVudExpc3RlbmVycyIsICJsb2dfXyQyIiwgImVycl9fJDIiLCAic3RyaXBlTG9nX18iLCAicnVuQ29tbW9uQ2NGbG93IiwgInRva2VuaXplQ2FyZFJlc3VsdHMiLCAiY29tbW9uQ2hlY2tvdXRQYXJhbXMiLCAic2hvdWxkVXNlTmV3RmxvdyIsICJzdGFydFBmUmVzdWx0IiwgImNvbW1vbkNDM0RTRmxvdyIsICJzdHJpcGVDQzNEU0Zsb3ciLCAiY3JlYXRlZFBheW1lbnRNZXRob2QiLCAicGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEiLCAic3RyaXBlQWN0aW9uIiwgImFjdGlvbiIsICJwYXJzZUNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJjb21tb25BY3Rpb24iLCAibG9nX18kMSIsICJlcnJfXyQxIiwgIlN0cmlwZVByQ3BtIiwgImluaXRTdHJpcGVQckZsb3ciLCAicHIiLCAiY2FuTWFrZVBheW1lbnQiLCAicnVuU3RyaXBlUHJGbG93IiwgImluaXRSZXN1bHQiLCAib3ZlcnJpZGUiLCAidXBkYXRlUHJXaXRoQW1vdW50IiwgInN0cmlwZVBtQWRkZWRFdmVudCIsICJmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBtIiwgInBhcnNlUFJOZXh0QWN0aW9uTWV0YWRhdGEiLCAic3RyaXBlUG1FdnQiLCAiYW1vdW50IiwgImlzUGVuZGluZyIsICJmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0IiwgImNwbXMiLCAid2l0aFByb3ZpZGVyIiwgIndpdGhQcm9jZXNzb3IiLCAibWF0Y2hlcyIsICJnZXREZWZhdWx0RXhwb3J0RnJvbUNqcyIsICJ4IiwgIk9ic2VydmFibGUkMiIsICJoYXNTeW1ib2wiLCAibmFtZSIsICJnZXRTeW1ib2wiLCAiU3ltYm9sSXRlcmF0b3IiLCAiU3ltYm9sT2JzZXJ2YWJsZSIsICJTeW1ib2xTcGVjaWVzIiwgImdldE1ldGhvZCIsICJnZXRTcGVjaWVzIiwgImN0b3IiLCAiT2JzZXJ2YWJsZSQxIiwgImlzT2JzZXJ2YWJsZSIsICJob3N0UmVwb3J0RXJyb3IiLCAiZW5xdWV1ZSIsICJjbGVhbnVwU3Vic2NyaXB0aW9uIiwgInN1YnNjcmlwdGlvbiIsICJjbGVhbnVwIiwgInVuc3Vic2NyaWJlIiwgImNsb3NlU3Vic2NyaXB0aW9uIiwgImZsdXNoU3Vic2NyaXB0aW9uIiwgInF1ZXVlIiwgIm5vdGlmeVN1YnNjcmlwdGlvbiIsICJ0eXBlIiwgIm9ic2VydmVyIiwgIm0iLCAib25Ob3RpZnkiLCAiU3Vic2NyaXB0aW9uIiwgInN1YnNjcmliZXIiLCAic2VsZiIsICJzdWJzY3JpcHRpb25PYnNlcnZlciIsICJPYnNlcnZhYmxlIiwgImRvbmUiLCAiQyIsICJoYXNTZWVkIiwgImhhc1ZhbHVlIiwgImZpcnN0IiwgInZhbHVlcyIsICJzb3VyY2VzIiwgImluZGV4IiwgInN0YXJ0TmV4dCIsICJuZXh0IiwgInYiLCAic3Vic2NyaXB0aW9ucyIsICJvdXRlciIsICJpbm5lciIsICJjb21wbGV0ZUlmRG9uZSIsICJzIiwgIm1ldGhvZCIsICJvYnNlcnZhYmxlIiwgIml0ZW0iLCAiaXRlbXMiLCAiemVuT2JzZXJ2YWJsZSIsICJsb2dfXyIsICJnZXRPanNJbml0UmVzdWx0c0RlYnVnT2JqZWN0IiwgImluaXRpYWxpemVPanNGbG93cyIsICJydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZSIsICJmbG93TmFtZSIsICJpbml0RmxvdyIsICJQUl9MT0FESU5HIiwgIlBSX0VSUk9SIiwgInVzZUFzeW5jRWZmZWN0JDIiLCAiUmVhY3QiLCAidXNlQXN5bmNFZmZlY3QiLCAiZWZmZWN0IiwgImRlc3Ryb3kiLCAiaGFzRGVzdHJveSIsICJtb3VudGVkIiwgIm1heWJlUHJvbWlzZSIsICJ1c2VBc3luY0VmZmVjdEV4cG9ydHMiLCAidXNlQXN5bmNFZmZlY3QkMSIsICJ1c2VUaW1lb3V0Rm4iLCAibXMiLCAicmVhZHkiLCAidGltZW91dCIsICJjYWxsYmFjayIsICJpc1JlYWR5IiwgInNldCIsICJjbGVhciIsICJ1c2VEZWJvdW5jZSIsICJkZXBzIiwgImNhbmNlbCIsICJyZXNldCIsICJ1c2VEeW5hbWljUHJldmlldyIsICJpc0VuYWJsZWQiLCAicHJvbW9Db2RlSW5wdXQiLCAic2V0UHJvbW9Db2RlSW5wdXQiLCAicHJvbW9Db2RlRGVib3VuY2VkIiwgInNldFByb21vQ29kZURlYm91bmNlZCIsICJwcmV2aWV3QW10IiwgInNldFByZXZpZXdBbXQiLCAiaXNQcmV2aWV3TG9hZGluZyIsICJzZXRJc1ByZXZpZXdMb2FkaW5nIiwgInByZXZpZXdFcnJvciIsICJzZXRQcmV2aWV3RXJyb3IiLCAicHJvbW9Db2RlSW5wdXQyIiwgImlzTW91bnRlZCIsICJwcmV2aWV3IiwgInVzZU1hcCIsICJpbml0aWFsTWFwIiwgIm1hcCIsICJzdGFibGVBY3Rpb25zIiwgImVudHJ5IiwgInByZXZNYXAiLCAibmV3TWFwIiwgIm9taXQiLCAicmVzdCIsICJ1dGlscyIsICJ1c2VDZGVDb25uZWN0aW9uIiwgIm51bUNkZUNvbm5zIiwgInNldE51bUNkZUNvbm5zIiwgImNkZUNvbm5zIiwgImNkZUNvbm5zU2V0dGVyIiwgImFueUNkZUNvbm4iLCAiZWxlbWVudFR5cGUiLCAiZ2V0RWxlbWVudFR5cGVGcm9tSWZyYW1lSWQiLCAiaWZyYW1lSWQiLCAiRWxlbWVudHNGb3JtIiwgInByb3BzIiwgImNoaWxkcmVuIiwgImNoZWNrb3V0U2VjdXJlVG9rZW4iLCAiY2xhc3NOYW1lIiwgIm9uRm9jdXMiLCAib25CbHVyIiwgIm9uQ2hhbmdlIiwgIm9uTG9hZCIsICJvbkxvYWRFcnJvciIsICJvbkNoZWNrb3V0U3RhcnRlZCIsICJvbkNoZWNrb3V0U3VjY2VzcyIsICJvbkNoZWNrb3V0RXJyb3IiLCAib25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzIiwgImVuYWJsZUR5bmFtaWNQcmV2aWV3cyIsICJjdXN0b21Jbml0UGFyYW1zIiwgImZyYW1lQmFzZVVybCIsICJyZWZlcmVyIiwgInNldFJlZmVyZXIiLCAibm9uY2VzIiwgInNldE5vbmNlcyIsICJmb3JtSGVpZ2h0IiwgInNldEZvcm1IZWlnaHQiLCAibG9hZGVkIiwgInNldExvYWRlZCIsICJzZXRFeHRyYURhdGEiLCAicHJldmVudENsb3NlIiwgInNldFByZXZlbnRDbG9zZSIsICJpZnJhbWVzIiwgInNldElmcmFtZXMiLCAiZXZlbnRUYXJnZXRzIiwgInNldEV2ZW50VGFyZ2V0cyIsICJ0b2tlbml6ZWQiLCAic2V0VG9rZW5pemVkIiwgImNoZWNrb3V0RmlyZWQiLCAic2V0Q2hlY2tvdXRGaXJlZCIsICJzZXRTZXNzaW9uSWQiLCAic2V0Q3VycmVuY3kiLCAidG90YWxBbW91bnRBdG9tcyIsICJzZXRUb3RhbEFtb3VudEF0b21zIiwgImNoZWNrb3V0UGF5bWVudE1ldGhvZHMiLCAic2V0Q2hlY2tvdXRQYXltZW50TWV0aG9kcyIsICJmb3JtUmVmIiwgImNvbm5lY3RUb0NkZUlmcmFtZSIsICJvanNGbG93c0luaXRpYWxpemF0aW9uIiwgInNldE9qc0Zsb3dzSW5pdGlhbGl6YXRpb24iLCAicGF5bWVudFJlcXVlc3RzIiwgInNldFBheW1lbnRSZXF1ZXN0cyIsICJzdHJpcGVMaW5rQ3RybCIsICJzZXRTdHJpcGVMaW5rQ3RybCIsICJvanNfdmVyc2lvbiIsICJkeW5hbWljUHJldmlldyIsICJvbk1lc3NhZ2UiLCAiZXZlbnRTb3VyY2UiLCAicmF3IiwgInByZXZOb25jZXMiLCAiZXZlbnRQYXlsb2FkIiwgImhlaWdodCIsICJtYXRjaGluZ0lmcmFtZSIsICJwcmV2VGFyZ2V0cyIsICJuZXh0QWN0aW9uVHlwZSIsICJwYXltZW50X21ldGhvZHMiLCAicHJvY2VlZFRvQ2hlY2tvdXQiLCAiZXhpc3RpbmdDQ1BNSWQiLCAiZXJyTXNnIiwgInRvdGFsVG9rZW5pemVkIiwgImFsbFRva2VuaXplZCIsICJwcm92aWRlciIsICJjYXJkQ3BtIiwgImVsZW1lbnRJZDIiLCAic3RhcnRQYXltZW50Rmxvd0V2ZW50IiwgIm9qc0Zsb3dDYWxsYmFja3MiLCAibm9PcCIsICJnZW5lcmF0ZU9qc0Zsb3dDb250ZXh0IiwgImNkZUNvbm5lY3Rpb25zIiwgInN1Ym1pdFBSIiwgImluaXRpYWxpemF0aW9uIiwgImNhbkFwcGxlUGF5IiwgImNhbkdvb2dsZVBheSIsICJ1c2VyUGFyYW1zIiwgInN1Ym1pdENhcmQiLCAib25CZWZvcmVVbmxvYWQiLCAicmVnaXN0ZXJJZnJhbWUiLCAiZXhpc3RpbmdJZnJhbWUiLCAiZXhpc3RpbmdJZnJhbWUyIiwgInByZXZJZnJhbWVzIiwgImNoaWxkcmVuUHJvcHMiLCAiRWxlbWVudEZyYW1lIiwgInN1YlBhdGgiLCAiaGFzTG9hZGVkIiwgInNldEhhc0xvYWRlZCIsICJpZnJhbWVSZWYiLCAiZWxlbWVudFN0eWxlIiwgImZyYW1lU3R5bGUiLCAicXVlcnlTdHJpbmciLCAiQ2FyZEN2Y0VsZW1lbnQiLCAiQ2FyZEVsZW1lbnQiLCAiQ2FyZEV4cGlyeUVsZW1lbnQiLCAiQ2FyZE51bWJlckVsZW1lbnQiXQp9Cg==