@getopenpay/openpay-js 0.1.6-alpha.7c15e03 → 0.1.7

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.es.js CHANGED
@@ -1,70 +1,71 @@
1
- import { z as r } from "zod";
2
- import { v4 as Ze } from "uuid";
3
- import { connectToChild as Se } from "penpal";
4
- const Je = "https://cde.getopenpay.com", We = r.object({
5
- type: r.string(),
6
- loc: r.array(r.string()),
7
- msg: r.string(),
8
- url: r.string()
9
- }), Qe = r.array(We), Xe = r.object({
10
- code: r.string(),
11
- message: r.string(),
12
- path: r.array(r.string())
13
- }), et = r.array(Xe), tt = {
1
+ import { z as t } from "zod";
2
+ import { v4 as Te } from "uuid";
3
+ import { connectToChild as se } from "penpal";
4
+ import T from "chalk";
5
+ const Ie = "https://cde.getopenpay.com", je = t.object({
6
+ type: t.string(),
7
+ loc: t.array(t.string()),
8
+ msg: t.string(),
9
+ url: t.string()
10
+ }), Fe = t.array(je), Me = t.object({
11
+ code: t.string(),
12
+ message: t.string(),
13
+ path: t.array(t.string())
14
+ }), Le = t.array(Me), De = {
14
15
  "failed to fetch": "Connection error: please double check if you are connected to the internet, then try again"
15
- }, Q = (t) => {
16
- const e = t.toLowerCase().trim();
17
- return tt[e] ?? t;
18
- }, nt = (t) => {
16
+ }, V = (n) => {
17
+ const e = n.toLowerCase().trim();
18
+ return De[e] ?? n;
19
+ }, Ne = (n) => {
19
20
  try {
20
- return typeof JSON.parse(t) == "object";
21
+ return typeof JSON.parse(n) == "object";
21
22
  } catch {
22
23
  return !1;
23
24
  }
24
- }, rt = (t) => t.length === 1 ? Q(t[0].msg) : `Please fix the following errors:
25
- ${t.map((n) => `• ${Q(n.msg)}`).join(`
26
- `)}`, ot = (t) => `Encountered the following errors:
27
- ${t.map((n) => `- ${n.path.join("/")}: ${n.message}`).join(`
28
- `)}`, Pe = (t) => {
29
- if (t instanceof Error)
30
- if (nt(t.message)) {
31
- const e = JSON.parse(t.message);
32
- return Qe.safeParse(e).success ? rt(e) : et.safeParse(e).success ? ot(e) : t.message;
25
+ }, xe = (n) => n.length === 1 ? V(n[0].msg) : `Please fix the following errors:
26
+ ${n.map((r) => `• ${V(r.msg)}`).join(`
27
+ `)}`, Ue = (n) => `Encountered the following errors:
28
+ ${n.map((r) => `- ${r.path.join("/")}: ${r.message}`).join(`
29
+ `)}`, ie = (n) => {
30
+ if (n instanceof Error)
31
+ if (Ne(n.message)) {
32
+ const e = JSON.parse(n.message);
33
+ return Fe.safeParse(e).success ? xe(e) : Le.safeParse(e).success ? Ue(e) : n.message;
33
34
  } else
34
- return Q(t.message);
35
- if (typeof t == "object")
35
+ return V(n.message);
36
+ if (typeof n == "object")
36
37
  try {
37
- return JSON.stringify(t);
38
+ return JSON.stringify(n);
38
39
  } catch (e) {
39
40
  return e + "";
40
41
  }
41
42
  else
42
- return t + "";
43
- }, T = (t, e) => (...n) => {
43
+ return n + "";
44
+ }, k = (n, e) => (...r) => {
44
45
  try {
45
- return e(...n);
46
+ return e(...r);
46
47
  } catch {
47
48
  return;
48
49
  }
49
- }, y = r.string().trim().min(1, { message: "Cannot be blank" }), h = r.string().trim().optional(), q = (t) => r.nullable(t.optional());
50
- var P = /* @__PURE__ */ ((t) => (t.FIRST_NAME = "firstName", t.LAST_NAME = "lastName", t.EMAIL = "email", t.ZIP_CODE = "zipCode", t.CITY = "city", t.STATE = "state", t.COUNTRY = "country", t.ADDRESS = "address", t.PHONE = "phone", t.PROMOTION_CODE = "promotionCode", t))(P || {});
51
- const Oe = r.nativeEnum(P);
52
- var ke = /* @__PURE__ */ ((t) => (t.CARD_NUMBER = "cardNumber", t.CARD_EXPIRY = "cardExpiry", t.CARD_CVC = "cardCvc", t))(ke || {});
53
- const Re = r.nativeEnum(ke), Ae = r.union([Oe, Re]);
54
- var Te = /* @__PURE__ */ ((t) => (t.CARD = "card", t.CARD_NUMBER = "card-number", t.CARD_EXPIRY = "card-expiry", t.CARD_CVC = "card-cvc", t))(Te || {});
55
- const st = r.nativeEnum(Te), H = r.object({
56
- provider: r.string(),
57
- processor_name: q(r.string()),
58
- metadata: q(r.record(r.string(), r.any()))
59
- }), it = r.object({
60
- id: r.string()
50
+ }, y = t.string().trim().min(1, { message: "Cannot be blank" }), h = t.string().trim().optional(), M = (n) => t.nullable(n.optional());
51
+ var f = /* @__PURE__ */ ((n) => (n.FIRST_NAME = "firstName", n.LAST_NAME = "lastName", n.EMAIL = "email", n.ZIP_CODE = "zipCode", n.CITY = "city", n.STATE = "state", n.COUNTRY = "country", n.ADDRESS = "address", n.PHONE = "phone", n.PROMOTION_CODE = "promotionCode", n))(f || {});
52
+ const ae = t.nativeEnum(f);
53
+ var ce = /* @__PURE__ */ ((n) => (n.CARD_NUMBER = "cardNumber", n.CARD_EXPIRY = "cardExpiry", n.CARD_CVC = "cardCvc", n))(ce || {});
54
+ const le = t.nativeEnum(ce), ue = t.union([ae, le]);
55
+ var de = /* @__PURE__ */ ((n) => (n.CARD = "card", n.CARD_NUMBER = "card-number", n.CARD_EXPIRY = "card-expiry", n.CARD_CVC = "card-cvc", n))(de || {});
56
+ const $e = t.nativeEnum(de), N = t.object({
57
+ provider: t.string(),
58
+ processor_name: M(t.string()),
59
+ metadata: M(t.record(t.string(), t.any()))
60
+ }), qe = t.object({
61
+ id: t.string()
61
62
  });
62
- r.object({
63
+ t.object({
63
64
  cardNumber: h,
64
65
  expiry: h,
65
66
  cvc: h
66
67
  });
67
- r.object({
68
+ t.object({
68
69
  backgroundColor: h,
69
70
  color: h,
70
71
  fontFamily: h,
@@ -75,7 +76,7 @@ r.object({
75
76
  letterSpacing: h,
76
77
  lineHeight: h
77
78
  });
78
- const b = r.enum([
79
+ const w = t.enum([
79
80
  // Element -> Form
80
81
  "LAYOUT",
81
82
  "LOADED",
@@ -96,163 +97,163 @@ const b = r.enum([
96
97
  "TOKENIZE",
97
98
  "CHECKOUT",
98
99
  "START_PAYMENT_FLOW"
99
- ]), at = b.extract(["TOKENIZE_STARTED", "CHECKOUT_STARTED"]), ct = r.object({ type: at }), lt = b.extract(["BLUR", "FOCUS", "CHANGE"]), ut = r.object({
100
- type: lt,
101
- elementType: Re,
102
- errors: r.array(r.string()).optional()
103
- }), dt = b.extract(["LOAD_ERROR", "TOKENIZE_ERROR", "CHECKOUT_ERROR"]), mt = r.object({
104
- type: dt,
100
+ ]), ze = w.extract(["TOKENIZE_STARTED", "CHECKOUT_STARTED"]), Ve = t.object({ type: ze }), He = w.extract(["BLUR", "FOCUS", "CHANGE"]), Ke = t.object({
101
+ type: He,
102
+ elementType: le,
103
+ errors: t.array(t.string()).optional()
104
+ }), Be = w.extract(["LOAD_ERROR", "TOKENIZE_ERROR", "CHECKOUT_ERROR"]), Ye = t.object({
105
+ type: Be,
105
106
  message: y,
106
- headers: r.record(r.string(), r.string()).optional()
107
- }), ft = b.extract(["VALIDATION_ERROR"]), pt = r.object({
108
- type: ft,
109
- elementType: Ae,
110
- errors: r.array(r.string())
111
- }), ht = r.object({
112
- type: r.literal(b.enum.LAYOUT),
107
+ headers: t.record(t.string(), t.string()).optional()
108
+ }), Ze = w.extract(["VALIDATION_ERROR"]), Ge = t.object({
109
+ type: Ze,
110
+ elementType: ue,
111
+ errors: t.array(t.string())
112
+ }), Je = t.object({
113
+ type: t.literal(w.enum.LAYOUT),
113
114
  height: y
114
- }), yt = r.object({
115
- type: r.literal(b.enum.LOADED),
115
+ }), We = t.object({
116
+ type: t.literal(w.enum.LOADED),
116
117
  sessionId: y,
117
- totalAmountAtoms: r.number(),
118
+ totalAmountAtoms: t.number(),
118
119
  currency: h,
119
- checkoutPaymentMethods: r.array(H)
120
- }), gt = r.object({
121
- type: r.literal(b.enum.PAYMENT_FLOW_STARTED),
122
- nextActionMetadata: r.record(r.string(), r.any()),
123
- paymentFlowMetadata: r.any().optional(),
124
- startPFMetadata: r.optional(r.record(r.string(), r.any()))
125
- }), _t = r.object({
126
- type: r.literal(b.enum.SETUP_PAYMENT_METHOD_SUCCESS),
127
- paymentMethodId: r.string()
128
- }), M = r.object({
120
+ checkoutPaymentMethods: t.array(N)
121
+ }), Qe = t.object({
122
+ type: t.literal(w.enum.PAYMENT_FLOW_STARTED),
123
+ nextActionMetadata: t.record(t.string(), t.any()),
124
+ paymentFlowMetadata: t.any().optional(),
125
+ startPFMetadata: t.optional(t.record(t.string(), t.any()))
126
+ }), Xe = t.object({
127
+ type: t.literal(w.enum.SETUP_PAYMENT_METHOD_SUCCESS),
128
+ paymentMethodId: t.string()
129
+ }), A = t.object({
129
130
  firstName: y,
130
131
  lastName: y,
131
132
  email: y,
132
133
  zipCode: y,
133
134
  country: y,
134
135
  promotionCode: h
135
- }), bt = r.object({
136
+ }), et = t.object({
136
137
  email: y,
137
138
  zipCode: y,
138
139
  country: y,
139
140
  promotionCode: h
140
- }), wt = b.extract(["TOKENIZE", "CHECKOUT", "START_PAYMENT_FLOW"]), Et = r.object({
141
- type: wt,
141
+ }), tt = w.extract(["TOKENIZE", "CHECKOUT", "START_PAYMENT_FLOW"]), nt = t.object({
142
+ type: tt,
142
143
  sessionId: y,
143
- checkoutPaymentMethod: H,
144
- paymentFlowMetadata: r.any().optional(),
145
- doNotUseLegacyCCFlow: r.boolean().optional(),
144
+ checkoutPaymentMethod: N,
145
+ paymentFlowMetadata: t.any().optional(),
146
+ doNotUseLegacyCCFlow: t.boolean().optional(),
146
147
  existingCCPMId: h
147
- }).extend(M.shape), Ct = r.object({
148
- type: r.literal(b.enum.TOKENIZE_SUCCESS),
149
- isReadyForCheckout: r.boolean()
150
- }), vt = r.object({
151
- type: r.literal(b.enum.CHECKOUT_SUCCESS),
152
- invoiceUrls: r.array(r.string()),
153
- subscriptionIds: r.array(r.string()),
154
- customerId: r.string()
155
- }), St = r.discriminatedUnion("type", [
156
- ct,
157
- ut,
158
- mt,
159
- pt,
160
- ht,
161
- yt,
162
- Et,
163
- Ct,
164
- vt,
165
- gt,
166
- _t
167
- ]), Pt = r.object({
168
- payload: St,
148
+ }).extend(A.shape), rt = t.object({
149
+ type: t.literal(w.enum.TOKENIZE_SUCCESS),
150
+ isReadyForCheckout: t.boolean()
151
+ }), ot = t.object({
152
+ type: t.literal(w.enum.CHECKOUT_SUCCESS),
153
+ invoiceUrls: t.array(t.string()),
154
+ subscriptionIds: t.array(t.string()),
155
+ customerId: t.string()
156
+ }), st = t.discriminatedUnion("type", [
157
+ Ve,
158
+ Ke,
159
+ Ye,
160
+ Ge,
161
+ Je,
162
+ We,
163
+ nt,
164
+ rt,
165
+ ot,
166
+ Qe,
167
+ Xe
168
+ ]), it = t.object({
169
+ payload: st,
169
170
  nonce: y,
170
171
  formId: y,
171
172
  elementId: y
172
173
  });
173
- r.object({
174
- amountAtom: r.number(),
174
+ t.object({
175
+ amountAtom: t.number(),
175
176
  currency: y
176
177
  });
177
- r.object({
178
- secure_token: r.string(),
179
- promotion_code: r.string().optional()
178
+ t.object({
179
+ secure_token: t.string(),
180
+ promotion_code: t.string().optional()
180
181
  });
181
- r.object({
182
- secure_token: r.string(),
183
- existing_cc_pm_id: q(r.string())
182
+ t.object({
183
+ secure_token: t.string(),
184
+ existing_cc_pm_id: M(t.string())
184
185
  });
185
- const Ot = r.object({
186
- payment_methods: r.array(it)
187
- }), kt = r.object({
188
- elementType: r.string(),
189
- errors: r.array(r.string())
186
+ const at = t.object({
187
+ payment_methods: t.array(qe)
188
+ }), ct = t.object({
189
+ elementType: t.string(),
190
+ errors: t.array(t.string())
190
191
  });
191
- r.object({
192
- session_id: r.string()
192
+ t.object({
193
+ session_id: t.string()
193
194
  });
194
- const Rt = r.object({
195
- success: r.literal(!1),
196
- error_type: r.literal("validation_error"),
197
- errors: r.array(kt)
198
- }), At = r.discriminatedUnion("success", [
199
- r.object({ success: r.literal(!0) }),
200
- Rt
195
+ const lt = t.object({
196
+ success: t.literal(!1),
197
+ error_type: t.literal("validation_error"),
198
+ errors: t.array(ct)
199
+ }), ut = t.discriminatedUnion("success", [
200
+ t.object({ success: t.literal(!0) }),
201
+ lt
201
202
  ]);
202
- r.object({
203
- session_id: r.string(),
204
- checkout_payment_method: H,
205
- non_cde_form_fields: M,
206
- do_not_use_legacy_cc_flow: r.boolean().optional(),
207
- existing_cc_pm_id: q(r.string())
203
+ t.object({
204
+ session_id: t.string(),
205
+ checkout_payment_method: N,
206
+ non_cde_form_fields: A,
207
+ do_not_use_legacy_cc_flow: t.boolean().optional(),
208
+ existing_cc_pm_id: M(t.string())
208
209
  });
209
- r.object({
210
- session_id: r.string(),
211
- checkout_payment_method: H,
212
- non_cde_form_fields: M
210
+ t.object({
211
+ session_id: t.string(),
212
+ checkout_payment_method: N,
213
+ non_cde_form_fields: A
213
214
  });
214
- var B = /* @__PURE__ */ ((t) => (t.SUCCESS = "success", t.FAILURE = "failure", t.CANCELLED = "cancelled", t))(B || {});
215
- const Tt = r.object({
216
- status: r.enum([
215
+ var L = /* @__PURE__ */ ((n) => (n.SUCCESS = "success", n.FAILURE = "failure", n.CANCELLED = "cancelled", n))(L || {});
216
+ const dt = t.object({
217
+ status: t.enum([
217
218
  "success",
218
219
  "failure",
219
220
  "cancelled"
220
221
  /* CANCELLED */
221
222
  ])
222
- }), jt = r.object({
223
- type: r.string(),
224
- redirect_url: r.string(),
225
- initial_intent_id: r.string(),
226
- consent_id: r.string()
227
- }), It = (t) => {
223
+ }), mt = t.object({
224
+ type: t.string(),
225
+ redirect_url: t.string(),
226
+ initial_intent_id: t.string(),
227
+ consent_id: t.string()
228
+ }), pt = (n) => {
228
229
  const e = {};
229
- return Object.entries(t).forEach(([n, o]) => {
230
+ return Object.entries(n).forEach(([r, o]) => {
230
231
  try {
231
- const s = Oe.parse(n);
232
+ const s = ae.parse(r);
232
233
  Array.isArray(o) ? e[s] = o : Array.isArray(o._errors) && (e[s] = o._errors);
233
234
  } catch {
234
235
  return;
235
236
  }
236
237
  }), e;
237
- }, Ft = r.object({
238
- stripe_pk: r.string(),
239
- client_secret: r.string(),
240
- stripe_pm_id: r.string()
241
- }), Mt = r.object({
242
- type: r.string(),
243
- client_secret: r.string(),
244
- stripe_pk: r.string()
245
- }), Dt = {
238
+ }, ft = t.object({
239
+ stripe_pk: t.string(),
240
+ client_secret: t.string(),
241
+ stripe_pm_id: t.string()
242
+ }), ht = t.object({
243
+ type: t.string(),
244
+ client_secret: t.string(),
245
+ stripe_pk: t.string()
246
+ }), yt = {
246
247
  usd: "usd",
247
248
  brl: "brl"
248
- }, oe = async (t) => {
249
- for (let n = 0; n < 10; n++)
250
- ae() || await Lt(500);
251
- if (!ae())
249
+ }, B = async (n) => {
250
+ for (let r = 0; r < 10; r++)
251
+ G() || await gt(500);
252
+ if (!G())
252
253
  throw new Error("Stripe JS not found.");
253
- return new Stripe(t);
254
- }, xt = async (t, e, n, o, s) => {
255
- const i = await oe(t), a = Dt[n.toLowerCase().trim()];
254
+ return new Stripe(n);
255
+ }, _t = async (n, e, r, o, s) => {
256
+ const i = await B(n), a = yt[r.toLowerCase().trim()];
256
257
  return i.paymentRequest({
257
258
  // TODO: replace this with stripe account country as soon as we support it
258
259
  country: "US",
@@ -266,802 +267,533 @@ const Tt = r.object({
266
267
  requestPayerEmail: !0,
267
268
  disableWallets: []
268
269
  });
269
- }, Lt = (t) => new Promise((e) => {
270
- setTimeout(e, t);
271
- }), ae = () => "Stripe" in window, Nt = async (t) => new Promise((e, n) => {
270
+ }, gt = (n) => new Promise((e) => {
271
+ setTimeout(e, n);
272
+ }), G = () => "Stripe" in window, wt = async (n) => new Promise((e, r) => {
272
273
  try {
273
- t.on("paymentmethod", async (o) => {
274
+ n.on("paymentmethod", async (o) => {
274
275
  e(o);
275
- }), t.on("cancel", () => {
276
- n(new Error("Payment cancelled, please click Submit again to pay"));
276
+ }), n.on("cancel", () => {
277
+ r(new Error("Payment cancelled, please click Submit again to pay"));
277
278
  });
278
279
  } catch (o) {
279
- n(o);
280
+ r(o);
280
281
  }
281
- }), $t = async (t, e) => {
282
- if (!t.stripe_pk || !t.client_secret)
283
- throw new Error(`Invalid next action metadata format: ${JSON.stringify(t)}`);
284
- const o = await (await oe(t.stripe_pk)).confirmCardSetup(t.client_secret, {
282
+ }), Et = async (n, e) => {
283
+ if (!n.stripe_pk || !n.client_secret)
284
+ throw new Error(`Invalid next action metadata format: ${JSON.stringify(n)}`);
285
+ const o = await (await B(n.stripe_pk)).confirmCardSetup(n.client_secret, {
285
286
  payment_method: e.paymentMethod.id
286
287
  });
287
288
  if (o.error)
288
289
  throw e.complete("fail"), new Error(`Payment failed: ${o.error.message ?? "unknown"}`);
289
- e.complete("success");
290
- }, Ut = async (t) => {
290
+ return e.complete("success"), o;
291
+ }, bt = async (n) => {
291
292
  var s, i, a, c;
292
- const n = await (await oe(t.stripe_pk)).confirmCardSetup(t.client_secret, {
293
- payment_method: t.stripe_pm_id
294
- }), o = (s = n.setupIntent) == null ? void 0 : s.status;
293
+ const r = await (await B(n.stripe_pk)).confirmCardSetup(n.client_secret, {
294
+ payment_method: n.stripe_pm_id
295
+ }), o = (s = r.setupIntent) == null ? void 0 : s.status;
295
296
  if (o !== "succeeded") throw o === "canceled" ? new Error("Payment cancelled, please click Submit again to pay") : new Error(
296
- `${((i = n.error) == null ? void 0 : i.message) ?? ((c = (a = n.setupIntent) == null ? void 0 : a.last_setup_error) == null ? void 0 : c.message) ?? "Payment failed, please click submit again to pay."}`
297
+ `${((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."}`
297
298
  );
298
- }, qt = (t) => JSON.stringify(t), Bt = (t, e) => Array.from(t.querySelectorAll("[data-opid]") ?? []).reduce((s, i) => {
299
+ }, Ct = (n) => JSON.stringify(n), St = (n, e) => Array.from(n.querySelectorAll("[data-opid]") ?? []).reduce((s, i) => {
299
300
  const a = i.getAttribute("data-opid");
300
301
  return a ? { ...s, [a]: i.value } : s;
301
- }, {}), zt = (t) => {
302
+ }, {}), Pt = (n) => {
302
303
  try {
303
- return Pt.parse(t);
304
+ return it.parse(n);
304
305
  } catch (e) {
305
306
  throw e;
306
307
  }
307
- }, Vt = (t, e, n, o, s) => {
308
+ }, vt = (n, e, r, o, s) => {
308
309
  const i = {
309
310
  payload: o,
310
- nonce: Ze(),
311
+ nonce: Te(),
311
312
  formId: e,
312
- elementId: n
313
+ elementId: r
313
314
  };
314
- t.postMessage(JSON.stringify(i), s);
315
- }, Ht = async (t) => {
316
- if (typeof t != "object" || !t) return !1;
315
+ n.postMessage(JSON.stringify(i), s);
316
+ }, kt = async (n) => {
317
+ if (typeof n != "object" || !n) return !1;
317
318
  try {
318
- const e = { type: "ping" }, n = await t.send(e);
319
- if (n !== !0)
320
- throw new Error(`Expected 'true' after ping, got ${JSON.stringify(n)}`);
319
+ const e = { type: "ping" }, r = await n.send(e);
320
+ if (r !== !0)
321
+ throw new Error(`Expected 'true' after ping, got ${JSON.stringify(r)}`);
321
322
  return !0;
322
323
  } catch {
323
324
  return !1;
324
325
  }
325
- }, Yt = (t, e) => !!t && e, m = (t) => r.nullable(t.optional());
326
- r.string().trim().min(1, { message: "Cannot be blank" });
327
- const Gt = r.object({
328
- cde_response_type: r.literal("error"),
329
- message: r.string(),
330
- headers: r.record(r.string(), r.string()).optional()
331
- }), Kt = r.enum(["usd", "brl"]), je = r.object({
332
- name: r.string(),
333
- amount_atom_off: m(r.number()),
334
- percent_off: m(r.number()),
335
- currency: m(r.string()),
336
- duration: r.string(),
337
- duration_in_months: m(r.number())
338
- }), Ie = r.object({
339
- amount_subtotal_atom: r.number().int(),
340
- amount_total_atom: r.number().int(),
341
- currency: r.string(),
342
- description: m(r.string()),
343
- price_id: r.string(),
344
- billing_interval: m(r.string()),
345
- billing_interval_count: m(r.number().int()),
346
- quantity: r.number().int()
347
- }), Zt = r.record(r.string(), r.any()), Jt = r.object({
348
- name: r.string(),
349
- settings: m(Zt)
350
- }), Y = r.object({
351
- provider: r.string(),
352
- processor_name: m(r.string()),
353
- metadata: m(r.record(r.string(), r.any()))
354
- }), Wt = r.object({
355
- quantity: r.number()
356
- }), Qt = r.object({
357
- id: m(r.string()),
358
- billing_interval: m(r.string()),
359
- billing_interval_count: m(r.number().int()),
360
- subscription_items: r.array(Wt),
361
- trial_start: m(r.string()),
362
- trial_end: m(r.string())
363
- }), Fe = r.object({
364
- amount_atom: r.number()
365
- }), Xt = r.object({
366
- amount_atom: r.number(),
367
- amount_atom_considering_discount_applied: r.number(),
368
- currency: r.string(),
369
- discount_amount_atoms: r.array(Fe),
370
- subscription_item_id: r.string()
371
- }), en = r.object({
372
- coupon: je
373
- }), tn = r.object({
374
- currency: r.string(),
375
- discounts: r.array(en),
376
- hosted_invoice_url: m(r.string()),
377
- lines: r.array(Xt),
378
- remaining_amount_atom: r.number(),
379
- tax_amount_atom: r.number(),
380
- total_amount_atom: r.number(),
381
- total_discount_amount_atoms: r.array(Fe)
382
- }), ce = r.object({
383
- created: r.array(Qt),
384
- invoices: r.array(tn)
385
- }), Me = r.object({
386
- preview: ce,
387
- preview_post_trial: m(ce),
388
- coupons: r.array(je)
389
- }), le = r.object({
390
- status: r.literal("open"),
391
- token: r.string(),
392
- email: m(r.string()),
393
- line_items: r.array(Ie),
394
- amount_subtotal_atom: r.number().int(),
395
- amount_total_atom: r.number().int(),
396
- brand: Jt,
397
- subs_preview: m(Me),
326
+ }, Rt = (n, e) => !!n && e, m = (n) => t.nullable(n.optional());
327
+ t.string().trim().min(1, { message: "Cannot be blank" });
328
+ const Ot = t.object({
329
+ cde_response_type: t.literal("error"),
330
+ message: t.string(),
331
+ headers: t.record(t.string(), t.string()).optional()
332
+ });
333
+ t.enum(["usd", "brl"]);
334
+ const me = t.object({
335
+ name: t.string(),
336
+ amount_atom_off: m(t.number()),
337
+ percent_off: m(t.number()),
338
+ currency: m(t.string()),
339
+ duration: t.string(),
340
+ duration_in_months: m(t.number())
341
+ }), pe = t.object({
342
+ amount_subtotal_atom: t.number().int(),
343
+ amount_total_atom: t.number().int(),
344
+ currency: t.string(),
345
+ description: m(t.string()),
346
+ price_id: t.string(),
347
+ billing_interval: m(t.string()),
348
+ billing_interval_count: m(t.number().int()),
349
+ quantity: t.number().int()
350
+ }), At = t.record(t.string(), t.any()), Tt = t.object({
351
+ name: t.string(),
352
+ settings: m(At)
353
+ }), x = t.object({
354
+ provider: t.string(),
355
+ processor_name: m(t.string()),
356
+ metadata: m(t.record(t.string(), t.any()))
357
+ }), It = t.object({
358
+ quantity: t.number()
359
+ }), jt = t.object({
360
+ id: m(t.string()),
361
+ billing_interval: m(t.string()),
362
+ billing_interval_count: m(t.number().int()),
363
+ subscription_items: t.array(It),
364
+ trial_start: m(t.string()),
365
+ trial_end: m(t.string())
366
+ }), fe = t.object({
367
+ amount_atom: t.number()
368
+ }), Ft = t.object({
369
+ amount_atom: t.number(),
370
+ amount_atom_considering_discount_applied: t.number(),
371
+ currency: t.string(),
372
+ discount_amount_atoms: t.array(fe),
373
+ subscription_item_id: t.string()
374
+ }), Mt = t.object({
375
+ coupon: me
376
+ }), Lt = t.object({
377
+ currency: t.string(),
378
+ discounts: t.array(Mt),
379
+ hosted_invoice_url: m(t.string()),
380
+ lines: t.array(Ft),
381
+ remaining_amount_atom: t.number(),
382
+ tax_amount_atom: t.number(),
383
+ total_amount_atom: t.number(),
384
+ total_discount_amount_atoms: t.array(fe)
385
+ }), J = t.object({
386
+ created: t.array(jt),
387
+ invoices: t.array(Lt)
388
+ }), he = t.object({
389
+ preview: J,
390
+ preview_post_trial: m(J),
391
+ coupons: t.array(me)
392
+ }), W = t.object({
393
+ status: t.literal("open"),
394
+ token: t.string(),
395
+ email: m(t.string()),
396
+ line_items: t.array(pe),
397
+ amount_subtotal_atom: t.number().int(),
398
+ amount_total_atom: t.number().int(),
399
+ brand: Tt,
400
+ subs_preview: m(he),
398
401
  // Null in setup mode
399
- methods_available: r.array(Y)
400
- }), De = r.discriminatedUnion("mode", [
401
- r.object({
402
- mode: r.literal("setup"),
403
- currency: r.nullable(r.undefined())
404
- }).extend(le.shape),
405
- r.object({
406
- mode: r.enum(["payment", "subscription"]),
407
- currency: Kt
408
- }).extend(le.shape)
409
- ]), nn = r.object({
410
- status: r.literal("complete")
411
- }), rn = r.object({
412
- status: r.literal("expired")
402
+ methods_available: t.array(x)
403
+ }), ye = t.discriminatedUnion("mode", [
404
+ t.object({
405
+ mode: t.literal("setup"),
406
+ currency: t.nullable(t.undefined())
407
+ }).extend(W.shape),
408
+ t.object({
409
+ mode: t.enum(["payment", "subscription"]),
410
+ currency: t.string()
411
+ }).extend(W.shape)
412
+ ]), Dt = t.object({
413
+ status: t.literal("complete")
414
+ }), Nt = t.object({
415
+ status: t.literal("expired")
413
416
  });
414
- r.union([De, nn, rn]);
415
- r.object({
416
- logo: r.string(),
417
- icon: r.string(),
418
- primary_color: r.string(),
419
- secondary_color: r.string()
417
+ t.union([ye, Dt, Nt]);
418
+ t.object({
419
+ logo: t.string(),
420
+ icon: t.string(),
421
+ primary_color: t.string(),
422
+ secondary_color: t.string()
420
423
  });
421
- const xe = r.object({
422
- invoice_urls: r.array(r.string()),
423
- subscription_ids: r.array(r.string()),
424
- customer_id: r.string()
424
+ const _e = t.object({
425
+ invoice_urls: t.array(t.string()),
426
+ subscription_ids: t.array(t.string()),
427
+ customer_id: t.string()
425
428
  });
426
- r.object({
427
- secure_token: r.string(),
428
- payment_input: r.any(),
429
+ t.object({
430
+ secure_token: t.string(),
431
+ payment_input: t.any(),
429
432
  // Should follow AnyPaymentInput from CDE
430
- customer_email: r.string(),
431
- customer_zip_code: r.string(),
432
- customer_country: r.string(),
433
- line_items: r.array(Ie),
434
- total_amount_atom: r.number().int(),
435
- cancel_at_end: r.boolean(),
436
- checkout_payment_method: Y,
437
- promotion_code: r.string().optional(),
438
- do_not_use_legacy_cc_flow: r.boolean().optional()
433
+ customer_email: t.string(),
434
+ customer_zip_code: t.string(),
435
+ customer_country: t.string(),
436
+ line_items: t.array(pe),
437
+ total_amount_atom: t.number().int(),
438
+ cancel_at_end: t.boolean(),
439
+ checkout_payment_method: x,
440
+ promotion_code: t.string().optional(),
441
+ do_not_use_legacy_cc_flow: t.boolean().optional()
439
442
  });
440
- const on = r.object({
441
- payment_method_id: r.string()
443
+ const xt = t.object({
444
+ payment_method_id: t.string()
442
445
  });
443
- r.object({
444
- id: r.string(),
445
- return_url: r.string()
446
+ t.object({
447
+ id: t.string(),
448
+ return_url: t.string()
446
449
  });
447
- const sn = r.object({
448
- type: r.string(),
449
- loc: r.array(r.string()),
450
- msg: r.string(),
451
- url: r.string()
450
+ const Ut = t.object({
451
+ type: t.string(),
452
+ loc: t.array(t.string()),
453
+ msg: t.string(),
454
+ url: t.string()
452
455
  });
453
- r.array(sn);
454
- const an = r.object({
455
- required_user_actions: r.array(r.record(r.string(), r.any()))
456
+ t.array(Ut);
457
+ const $t = t.object({
458
+ required_user_actions: t.array(t.record(t.string(), t.any()))
456
459
  });
457
- r.object({
458
- fields: bt,
459
- checkoutPaymentMethod: Y
460
+ t.object({
461
+ fields: et,
462
+ checkoutPaymentMethod: x
460
463
  });
461
- r.object({
462
- session_id: r.string(),
463
- non_cde_form_fields: M,
464
- checkout_payment_method: Y
464
+ t.object({
465
+ session_id: t.string(),
466
+ non_cde_form_fields: A,
467
+ checkout_payment_method: x
465
468
  });
466
- const cn = r.object({
467
- required_user_actions: r.array(r.record(r.string(), r.any())),
468
- cc_pm_id: r.string()
469
+ const qt = t.object({
470
+ required_user_actions: t.array(t.record(t.string(), t.any())),
471
+ cc_pm_id: t.string()
469
472
  });
470
- r.record(r.any());
471
- const ln = (t) => t.reduce((e, n) => e + n, 0);
472
- function un(t, e) {
473
- var n = Object.setPrototypeOf;
474
- n ? n(t, e) : t.__proto__ = e;
473
+ t.record(t.any());
474
+ const zt = (n) => n.reduce((e, r) => e + r, 0);
475
+ function Vt(n, e) {
476
+ var r = Object.setPrototypeOf;
477
+ r ? r(n, e) : n.__proto__ = e;
475
478
  }
476
- function dn(t, e) {
477
- e === void 0 && (e = t.constructor);
478
- var n = Error.captureStackTrace;
479
- n && n(t, e);
479
+ function Ht(n, e) {
480
+ e === void 0 && (e = n.constructor);
481
+ var r = Error.captureStackTrace;
482
+ r && r(n, e);
480
483
  }
481
- var mn = /* @__PURE__ */ function() {
482
- var t = function(n, o) {
483
- return t = Object.setPrototypeOf || {
484
+ var Kt = /* @__PURE__ */ function() {
485
+ var n = function(r, o) {
486
+ return n = Object.setPrototypeOf || {
484
487
  __proto__: []
485
488
  } instanceof Array && function(s, i) {
486
489
  s.__proto__ = i;
487
490
  } || function(s, i) {
488
491
  for (var a in i)
489
492
  Object.prototype.hasOwnProperty.call(i, a) && (s[a] = i[a]);
490
- }, t(n, o);
493
+ }, n(r, o);
491
494
  };
492
- return function(e, n) {
493
- if (typeof n != "function" && n !== null) throw new TypeError("Class extends value " + String(n) + " is not a constructor or null");
494
- t(e, n);
495
+ return function(e, r) {
496
+ if (typeof r != "function" && r !== null) throw new TypeError("Class extends value " + String(r) + " is not a constructor or null");
497
+ n(e, r);
495
498
  function o() {
496
499
  this.constructor = e;
497
500
  }
498
- e.prototype = n === null ? Object.create(n) : (o.prototype = n.prototype, new o());
501
+ e.prototype = r === null ? Object.create(r) : (o.prototype = r.prototype, new o());
499
502
  };
500
- }(), fn = function(t) {
501
- mn(e, t);
502
- function e(n, o) {
503
- var s = this.constructor, i = t.call(this, n, o) || this;
503
+ }(), Bt = function(n) {
504
+ Kt(e, n);
505
+ function e(r, o) {
506
+ var s = this.constructor, i = n.call(this, r, o) || this;
504
507
  return Object.defineProperty(i, "name", {
505
508
  value: s.name,
506
509
  enumerable: !1,
507
510
  configurable: !0
508
- }), un(i, s.prototype), dn(i), i;
511
+ }), Vt(i, s.prototype), Ht(i), i;
509
512
  }
510
513
  return e;
511
514
  }(Error);
512
- class Le extends fn {
515
+ class ge extends Bt {
513
516
  constructor(e) {
514
- const n = `[cde-client] Error querying CDE: ${e.message}`;
515
- super(n), this.response = e;
517
+ const r = `[cde-client] Error querying CDE: ${e.message}`;
518
+ super(r), this.response = e;
516
519
  }
517
520
  get originalErrorMessage() {
518
521
  return this.response.message;
519
522
  }
520
523
  }
521
- const v = async (t, e, n) => {
522
- const o = await t.send(e);
523
- if (hn(o))
524
- throw new Le(o);
525
- if (!pn(o, n)) {
526
- const s = n.safeParse(o);
524
+ const C = async (n, e, r) => {
525
+ const o = await n.send(e);
526
+ if (Zt(o))
527
+ throw new ge(o);
528
+ if (!Yt(o, r)) {
529
+ const s = r.safeParse(o);
527
530
  throw s.success ? new Error("Invalid state") : s.error;
528
531
  }
529
532
  return o;
530
- }, pn = (t, e) => e.safeParse(t).success, hn = (t) => Gt.safeParse(t).success, yn = async (t, e) => await v(t, { type: "get_checkout_preview", payload: e }, Me), se = async (t) => await v(t, { type: "get_prefill", payload: {} }, De), gn = async (t, e) => await v(t, { type: "start_payment_flow_for_cc", payload: e }, cn), _n = async (t, e) => await v(t, { type: "start_payment_flow_for_pr", payload: e }, an), Ne = async (t, e) => await v(t, { type: "confirm_payment_flow", payload: e }, Ot), bn = async (t, e, n) => {
531
- const o = await yn(t, {
533
+ }, Yt = (n, e) => e.safeParse(n).success, Zt = (n) => Ot.safeParse(n).success, Gt = async (n, e) => await C(n, { type: "get_checkout_preview", payload: e }, he), Y = async (n) => await C(n, { type: "get_prefill", payload: {} }, ye), Jt = async (n, e) => await C(n, { type: "start_payment_flow_for_cc", payload: e }, qt), Wt = async (n, e) => await C(n, { type: "start_payment_flow_for_pr", payload: e }, $t), we = async (n, e) => await C(n, { type: "confirm_payment_flow", payload: e }, at), Qt = async (n, e, r) => {
534
+ const o = await Gt(n, {
532
535
  secure_token: e,
533
- promotion_code: n
536
+ promotion_code: r
534
537
  }), s = new Set(o.preview.invoices.map((c) => c.currency));
535
538
  if (s.size !== 1)
536
539
  throw new Error(`Expected exactly one currency, got ${s.size}`);
537
- const i = s.values().next().value ?? "usd", a = ln(o.preview.invoices.map((c) => c.remaining_amount_atom));
540
+ const i = s.values().next().value ?? "usd", a = zt(o.preview.invoices.map((c) => c.remaining_amount_atom));
538
541
  return {
539
542
  currency: i,
540
543
  amountAtom: a
541
544
  };
542
- }, wn = async (t, e, n, o) => {
543
- if (n)
545
+ }, Xt = async (n, e, r, o) => {
546
+ if (r)
544
547
  return { amountAtom: 0, currency: "usd" };
545
548
  {
546
549
  o = o || void 0;
547
- const s = await bn(t, e, o);
550
+ const s = await Qt(n, e, o);
548
551
  return { amountAtom: s.amountAtom, currency: s.currency };
549
552
  }
550
- }, En = async (t, e) => {
551
- if (t.size === 0)
553
+ }, en = async (n, e) => {
554
+ if (n.size === 0)
552
555
  throw new Error("No CDE connections found");
553
556
  return await Promise.all(
554
- Array.from(t.values()).map(
555
- (o) => v(o, { type: "tokenize_card", payload: e }, At)
557
+ Array.from(n.values()).map(
558
+ (o) => C(o, { type: "tokenize_card", payload: e }, ut)
556
559
  )
557
560
  );
558
- }, ue = async (t, e) => {
561
+ }, Q = async (n, e) => {
559
562
  try {
560
- return await v(t, { type: "checkout_card_elements", payload: e }, xe);
561
- } catch (n) {
562
- throw n;
563
+ return await C(n, { type: "checkout_card_elements", payload: e }, _e);
564
+ } catch (r) {
565
+ throw r;
563
566
  }
564
- }, Cn = async (t, e) => await v(t, { type: "setup_payment_method", payload: e }, on), vn = async (t, e) => await v(t, { type: "checkout", payload: e }, xe), $e = 1e3, Sn = async (t, e) => {
565
- const o = await Se({
566
- iframe: t,
567
+ }, tn = async (n, e) => await C(n, { type: "setup_payment_method", payload: e }, xt), nn = async (n, e) => await C(n, { type: "checkout", payload: e }, _e), Ee = 1e3, rn = async (n, e) => {
568
+ const o = await se({
569
+ iframe: n,
567
570
  debug: !0,
568
- timeout: $e,
569
- childOrigin: e
571
+ timeout: Ee,
572
+ childOrigin: "*"
573
+ // TODO: use with proper childOrigin
570
574
  }).promise;
571
- return (await v(o, { type: "ping-3ds-status" }, Tt)).status;
572
- }, Pn = "@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}", On = (t) => {
575
+ return (await C(o, { type: "ping-3ds-status" }, dt)).status;
576
+ }, on = "@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}", sn = (n) => {
573
577
  const e = document.createElement("template");
574
578
  e.innerHTML = `
575
579
  <style>
576
- ${Pn}
580
+ ${on}
577
581
  </style>
578
582
  <div class="overlay">
579
583
  <div class="container">
580
584
  <button class="cancel-button">Cancel</button>
581
- <iframe src="${t}" class="frame" id="three-ds-iframe" title="3D Secure verification" allow="payment"></iframe>
585
+ <iframe src="${n}" class="frame" id="three-ds-iframe" title="3D Secure verification" allow="payment"></iframe>
582
586
  </div>
583
587
  </div>
584
588
  `;
585
- const n = document.createElement("div"), o = n.attachShadow({ mode: "open" });
589
+ const r = document.createElement("div"), o = r.attachShadow({ mode: "open" });
586
590
  o.appendChild(e.content.cloneNode(!0));
587
591
  const s = o.querySelector("#three-ds-iframe"), i = o.querySelector(".cancel-button");
588
- return document.body.appendChild(n), { host: n, iframe: s, cancelButton: i };
592
+ return document.body.appendChild(r), { host: r, iframe: s, cancelButton: i };
589
593
  };
590
- function kn(t, e, n) {
594
+ function an(n, e, r) {
591
595
  const o = async () => {
592
596
  try {
593
- const i = await Sn(t, n);
597
+ const i = await rn(n, r);
594
598
  i && (clearInterval(s), e(i));
595
599
  } catch {
596
600
  }
597
601
  };
598
602
  o();
599
- const s = setInterval(o, $e);
603
+ const s = setInterval(o, Ee);
600
604
  return s;
601
605
  }
602
- function Rn({
603
- elements: t,
606
+ function cn({
607
+ elements: n,
604
608
  pollingInterval: e,
605
- resolve: n
609
+ resolve: r
606
610
  }) {
607
611
  const o = () => {
608
- clearInterval(e), t.host.remove(), n(B.CANCELLED);
612
+ clearInterval(e), n.host.remove(), r(L.CANCELLED);
609
613
  };
610
- return t.cancelButton.addEventListener("click", o), () => {
611
- t.cancelButton.removeEventListener("click", o);
614
+ return n.cancelButton.addEventListener("click", o), () => {
615
+ n.cancelButton.removeEventListener("click", o);
612
616
  };
613
617
  }
614
- async function An({
615
- url: t,
618
+ async function ln({
619
+ url: n,
616
620
  baseUrl: e
617
621
  }) {
618
- const n = On(t);
622
+ const r = sn(n);
619
623
  return new Promise((o) => {
620
624
  const s = (c) => {
621
625
  setTimeout(() => {
622
- n.host.remove();
626
+ r.host.remove();
623
627
  }, 1e3), o(c), a == null || a();
624
- }, i = kn(n.iframe, s, new URL(e).origin), a = Rn({
625
- elements: n,
628
+ }, i = an(r.iframe, s, new URL(e).origin), a = cn({
629
+ elements: r,
626
630
  pollingInterval: i,
627
631
  resolve: o
628
632
  });
629
633
  });
630
634
  }
631
- const Z = 10, de = (t = 0) => (e) => `\x1B[${e + t}m`, me = (t = 0) => (e) => `\x1B[${38 + t};5;${e}m`, fe = (t = 0) => (e, n, o) => `\x1B[${38 + t};2;${e};${n};${o}m`, u = {
632
- modifier: {
633
- reset: [0, 0],
634
- // 21 isn't widely supported and 22 does the same thing
635
- bold: [1, 22],
636
- dim: [2, 22],
637
- italic: [3, 23],
638
- underline: [4, 24],
639
- overline: [53, 55],
640
- inverse: [7, 27],
641
- hidden: [8, 28],
642
- strikethrough: [9, 29]
643
- },
644
- color: {
645
- black: [30, 39],
646
- red: [31, 39],
647
- green: [32, 39],
648
- yellow: [33, 39],
649
- blue: [34, 39],
650
- magenta: [35, 39],
651
- cyan: [36, 39],
652
- white: [37, 39],
653
- // Bright color
654
- blackBright: [90, 39],
655
- gray: [90, 39],
656
- // Alias of `blackBright`
657
- grey: [90, 39],
658
- // Alias of `blackBright`
659
- redBright: [91, 39],
660
- greenBright: [92, 39],
661
- yellowBright: [93, 39],
662
- blueBright: [94, 39],
663
- magentaBright: [95, 39],
664
- cyanBright: [96, 39],
665
- whiteBright: [97, 39]
666
- },
667
- bgColor: {
668
- bgBlack: [40, 49],
669
- bgRed: [41, 49],
670
- bgGreen: [42, 49],
671
- bgYellow: [43, 49],
672
- bgBlue: [44, 49],
673
- bgMagenta: [45, 49],
674
- bgCyan: [46, 49],
675
- bgWhite: [47, 49],
676
- // Bright color
677
- bgBlackBright: [100, 49],
678
- bgGray: [100, 49],
679
- // Alias of `bgBlackBright`
680
- bgGrey: [100, 49],
681
- // Alias of `bgBlackBright`
682
- bgRedBright: [101, 49],
683
- bgGreenBright: [102, 49],
684
- bgYellowBright: [103, 49],
685
- bgBlueBright: [104, 49],
686
- bgMagentaBright: [105, 49],
687
- bgCyanBright: [106, 49],
688
- bgWhiteBright: [107, 49]
689
- }
690
- };
691
- Object.keys(u.modifier);
692
- const Tn = Object.keys(u.color), jn = Object.keys(u.bgColor);
693
- [...Tn, ...jn];
694
- function In() {
695
- const t = /* @__PURE__ */ new Map();
696
- for (const [e, n] of Object.entries(u)) {
697
- for (const [o, s] of Object.entries(n))
698
- u[o] = {
699
- open: `\x1B[${s[0]}m`,
700
- close: `\x1B[${s[1]}m`
701
- }, n[o] = u[o], t.set(s[0], s[1]);
702
- Object.defineProperty(u, e, {
703
- value: n,
704
- enumerable: !1
705
- });
706
- }
707
- return Object.defineProperty(u, "codes", {
708
- value: t,
709
- enumerable: !1
710
- }), u.color.close = "\x1B[39m", u.bgColor.close = "\x1B[49m", u.color.ansi = de(), u.color.ansi256 = me(), u.color.ansi16m = fe(), u.bgColor.ansi = de(Z), u.bgColor.ansi256 = me(Z), u.bgColor.ansi16m = fe(Z), Object.defineProperties(u, {
711
- rgbToAnsi256: {
712
- value(e, n, o) {
713
- return e === n && n === o ? e < 8 ? 16 : e > 248 ? 231 : Math.round((e - 8) / 247 * 24) + 232 : 16 + 36 * Math.round(e / 255 * 5) + 6 * Math.round(n / 255 * 5) + Math.round(o / 255 * 5);
714
- },
715
- enumerable: !1
716
- },
717
- hexToRgb: {
718
- value(e) {
719
- const n = /[a-f\d]{6}|[a-f\d]{3}/i.exec(e.toString(16));
720
- if (!n)
721
- return [0, 0, 0];
722
- let [o] = n;
723
- o.length === 3 && (o = [...o].map((i) => i + i).join(""));
724
- const s = Number.parseInt(o, 16);
725
- return [
726
- /* eslint-disable no-bitwise */
727
- s >> 16 & 255,
728
- s >> 8 & 255,
729
- s & 255
730
- /* eslint-enable no-bitwise */
731
- ];
732
- },
733
- enumerable: !1
734
- },
735
- hexToAnsi256: {
736
- value: (e) => u.rgbToAnsi256(...u.hexToRgb(e)),
737
- enumerable: !1
738
- },
739
- ansi256ToAnsi: {
740
- value(e) {
741
- if (e < 8)
742
- return 30 + e;
743
- if (e < 16)
744
- return 90 + (e - 8);
745
- let n, o, s;
746
- if (e >= 232)
747
- n = ((e - 232) * 10 + 8) / 255, o = n, s = n;
748
- else {
749
- e -= 16;
750
- const c = e % 36;
751
- n = Math.floor(e / 36) / 5, o = Math.floor(c / 6) / 5, s = c % 6 / 5;
752
- }
753
- const i = Math.max(n, o, s) * 2;
754
- if (i === 0)
755
- return 30;
756
- let a = 30 + (Math.round(s) << 2 | Math.round(o) << 1 | Math.round(n));
757
- return i === 2 && (a += 60), a;
758
- },
759
- enumerable: !1
760
- },
761
- rgbToAnsi: {
762
- value: (e, n, o) => u.ansi256ToAnsi(u.rgbToAnsi256(e, n, o)),
763
- enumerable: !1
764
- },
765
- hexToAnsi: {
766
- value: (e) => u.ansi256ToAnsi(u.hexToAnsi256(e)),
767
- enumerable: !1
768
- }
769
- }), u;
770
- }
771
- const C = In(), x = (() => {
772
- if (navigator.userAgentData) {
773
- const t = navigator.userAgentData.brands.find(({ brand: e }) => e === "Chromium");
774
- if (t && t.version > 93)
775
- return 3;
776
- }
777
- return /\b(Chrome|Chromium)\//.test(navigator.userAgent) ? 1 : 0;
778
- })(), pe = x !== 0 && {
779
- level: x,
780
- hasBasic: !0,
781
- has256: x >= 2,
782
- has16m: x >= 3
783
- }, Fn = {
784
- stdout: pe,
785
- stderr: pe
786
- };
787
- function Mn(t, e, n) {
788
- let o = t.indexOf(e);
789
- if (o === -1)
790
- return t;
791
- const s = e.length;
792
- let i = 0, a = "";
793
- do
794
- a += t.slice(i, o) + e + n, i = o + s, o = t.indexOf(e, i);
795
- while (o !== -1);
796
- return a += t.slice(i), a;
797
- }
798
- function Dn(t, e, n, o) {
799
- let s = 0, i = "";
800
- do {
801
- const a = t[o - 1] === "\r";
802
- i += t.slice(s, a ? o - 1 : o) + e + (a ? `\r
803
- ` : `
804
- `) + n, s = o + 1, o = t.indexOf(`
805
- `, s);
806
- } while (o !== -1);
807
- return i += t.slice(s), i;
808
- }
809
- const { stdout: he, stderr: ye } = Fn, X = Symbol("GENERATOR"), k = Symbol("STYLER"), F = Symbol("IS_EMPTY"), ge = [
810
- "ansi",
811
- "ansi",
812
- "ansi256",
813
- "ansi16m"
814
- ], R = /* @__PURE__ */ Object.create(null), xn = (t, e = {}) => {
815
- if (e.level && !(Number.isInteger(e.level) && e.level >= 0 && e.level <= 3))
816
- throw new Error("The `level` option should be an integer from 0 to 3");
817
- const n = he ? he.level : 0;
818
- t.level = e.level === void 0 ? n : e.level;
819
- }, Ln = (t) => {
820
- const e = (...n) => n.join(" ");
821
- return xn(e, t), Object.setPrototypeOf(e, D.prototype), e;
822
- };
823
- function D(t) {
824
- return Ln(t);
825
- }
826
- Object.setPrototypeOf(D.prototype, Function.prototype);
827
- for (const [t, e] of Object.entries(C))
828
- R[t] = {
829
- get() {
830
- const n = z(this, te(e.open, e.close, this[k]), this[F]);
831
- return Object.defineProperty(this, t, { value: n }), n;
832
- }
833
- };
834
- R.visible = {
835
- get() {
836
- const t = z(this, this[k], !0);
837
- return Object.defineProperty(this, "visible", { value: t }), t;
838
- }
839
- };
840
- const ee = (t, e, n, ...o) => t === "rgb" ? e === "ansi16m" ? C[n].ansi16m(...o) : e === "ansi256" ? C[n].ansi256(C.rgbToAnsi256(...o)) : C[n].ansi(C.rgbToAnsi(...o)) : t === "hex" ? ee("rgb", e, n, ...C.hexToRgb(...o)) : C[n][t](...o), Nn = ["rgb", "hex", "ansi256"];
841
- for (const t of Nn) {
842
- R[t] = {
843
- get() {
844
- const { level: n } = this;
845
- return function(...o) {
846
- const s = te(ee(t, ge[n], "color", ...o), C.color.close, this[k]);
847
- return z(this, s, this[F]);
848
- };
849
- }
850
- };
851
- const e = "bg" + t[0].toUpperCase() + t.slice(1);
852
- R[e] = {
853
- get() {
854
- const { level: n } = this;
855
- return function(...o) {
856
- const s = te(ee(t, ge[n], "bgColor", ...o), C.bgColor.close, this[k]);
857
- return z(this, s, this[F]);
858
- };
859
- }
860
- };
861
- }
862
- const $n = Object.defineProperties(() => {
863
- }, {
864
- ...R,
865
- level: {
866
- enumerable: !0,
867
- get() {
868
- return this[X].level;
869
- },
870
- set(t) {
871
- this[X].level = t;
872
- }
873
- }
874
- }), te = (t, e, n) => {
875
- let o, s;
876
- return n === void 0 ? (o = t, s = e) : (o = n.openAll + t, s = e + n.closeAll), {
877
- open: t,
878
- close: e,
879
- openAll: o,
880
- closeAll: s,
881
- parent: n
882
- };
883
- }, z = (t, e, n) => {
884
- const o = (...s) => Un(o, s.length === 1 ? "" + s[0] : s.join(" "));
885
- return Object.setPrototypeOf(o, $n), o[X] = t, o[k] = e, o[F] = n, o;
886
- }, Un = (t, e) => {
887
- if (t.level <= 0 || !e)
888
- return t[F] ? "" : e;
889
- let n = t[k];
890
- if (n === void 0)
891
- return e;
892
- const { openAll: o, closeAll: s } = n;
893
- if (e.includes("\x1B"))
894
- for (; n !== void 0; )
895
- e = Mn(e, n.close, n.open), n = n.parent;
896
- const i = e.indexOf(`
897
- `);
898
- return i !== -1 && (e = Dn(e, s, o, i)), o + e + s;
899
- };
900
- Object.defineProperties(D.prototype, R);
901
- const L = D();
902
- D({ level: ye ? ye.level : 0 });
903
- const Ue = (t) => async (e) => {
635
+ const be = (n) => async (e) => {
904
636
  try {
905
637
  e.flowCallbacks.onCheckoutStarted();
906
- const n = await t(e);
907
- if (n.mode === "setup")
908
- e.flowCallbacks.onSetupPaymentMethodSuccess(n.result.payment_method_id);
909
- else if (n.mode === "checkout")
638
+ const r = await n(e);
639
+ if (r.mode === "setup")
640
+ e.flowCallbacks.onSetupPaymentMethodSuccess(r.result.payment_method_id);
641
+ else if (r.mode === "checkout")
910
642
  e.flowCallbacks.onCheckoutSuccess(
911
- n.result.invoice_urls,
912
- n.result.subscription_ids,
913
- n.result.customer_id
643
+ r.result.invoice_urls,
644
+ r.result.subscription_ids,
645
+ r.result.customer_id
914
646
  );
915
647
  else
916
- throw new Error(`Unhandled mode: ${n}`);
917
- } catch (n) {
918
- throw e.flowCallbacks.onCheckoutError(Pe(n)), n;
648
+ throw new Error(`Unhandled mode: ${r}`);
649
+ } catch (r) {
650
+ throw e.flowCallbacks.onCheckoutError(ie(r)), r;
919
651
  }
920
- }, qn = (t) => async (e) => {
652
+ }, un = (n) => async (e) => {
921
653
  try {
922
- return await t(e);
923
- } catch (n) {
924
- const { err__: o } = O("init-error-catcher");
925
- return o(n), { isAvailable: !1, reason: Pe(n) };
654
+ return await n(e);
655
+ } catch (r) {
656
+ const { err__: o } = P("init-error-catcher");
657
+ return o(r), { isAvailable: !1, reason: ie(r) };
926
658
  }
927
- }, O = (t) => {
659
+ }, P = (n) => {
928
660
  const e = (...o) => {
929
- window.console.log(`${L.green.bold("ojs/")}${L.bold.gray(`${t}`)} `, ...o);
930
- }, n = (...o) => {
931
- window.console.error(`${L.red.bold("ojs/")}${L.bold.gray(`${t}`)} `, ...o);
661
+ window.console.log(`${T.green.bold("ojs/")}${T.bold.gray(`${n}`)} `, ...o);
662
+ }, r = (...o) => {
663
+ window.console.error(`${T.red.bold("ojs/")}${T.bold.gray(`${n}`)} `, ...o);
932
664
  };
933
665
  return {
934
666
  log: e,
935
- err: n,
667
+ err: r,
936
668
  log__: e,
937
- err__: n
669
+ err__: r
938
670
  };
939
- }, { log__: Bn, err__: qe } = O("common-cc"), Be = (t, e) => {
940
- const n = M.safeParse(t);
941
- if (!n.success) {
942
- const o = n.error.format(), s = It(o);
671
+ }, { log__: dn, err__: Ce } = P("common-cc"), Se = (n, e) => {
672
+ const r = A.safeParse(n);
673
+ if (!r.success) {
674
+ const o = r.error.format(), s = pt(o);
943
675
  for (const [i, a] of Object.entries(s))
944
676
  e(i, a, i);
945
- throw qe("Got validation errors in non-CDE form fields", s), new Error("Got validation errors in non-CDE form fields");
946
- }
947
- return n.data;
948
- }, zn = (t, e) => {
949
- for (const n of t)
950
- if (n.success === !1)
951
- throw n.errors.forEach((o) => {
952
- const s = Ae.safeParse(o.elementType);
677
+ throw Ce("Got validation errors in non-CDE form fields", s), new Error("Got validation errors in non-CDE form fields");
678
+ }
679
+ return r.data;
680
+ }, mn = (n, e) => {
681
+ for (const r of n)
682
+ if (r.success === !1)
683
+ throw r.errors.forEach((o) => {
684
+ const s = ue.safeParse(o.elementType);
953
685
  if (!s.success)
954
- qe(`Unknown field name in onValidationError: ${o.elementType}`);
686
+ Ce(`Unknown field name in onValidationError: ${o.elementType}`);
955
687
  else {
956
688
  const i = s.data;
957
689
  e(i, o.errors);
958
690
  }
959
- }), Bn(`Error tokenizing card: got validation errors: ${JSON.stringify(n.errors)}`), new Error("Got validation errors while tokenizing card");
960
- }, { err__: J } = O("commmon"), ze = (t) => {
961
- if (t.payment_methods.length !== 1)
962
- throw new Error(`Expected exactly one payment method, got ${t.payment_methods.length}`);
963
- return { payment_method_id: t.payment_methods[0].id };
964
- }, Vn = (t, e) => {
965
- const n = t.find((o) => e.safeParse(o).success);
966
- if (!n)
967
- throw J(`No CPMs found for model ${e}`), J(t), J("zodModel"), new Error(`No CPMs found for model ${e}`);
968
- return e.parse(n);
969
- }, { log__: p, err__: _e } = O("common-cc"), { log__: be } = O("stripe-cc"), Hn = Ue(
970
- async ({ context: t, checkoutPaymentMethod: e, nonCdeFormInputs: n, flowCallbacks: o }) => {
971
- var l;
691
+ }), dn(`Error tokenizing card: got validation errors: ${JSON.stringify(r.errors)}`), new Error("Got validation errors while tokenizing card");
692
+ }, { err__: q } = P("commmon"), Pe = (n) => {
693
+ if (n.payment_methods.length !== 1)
694
+ throw new Error(`Expected exactly one payment method, got ${n.payment_methods.length}`);
695
+ return { payment_method_id: n.payment_methods[0].id };
696
+ }, pn = (n, e) => {
697
+ const r = n.find((o) => e.safeParse(o).success);
698
+ if (!r)
699
+ throw q(`No CPMs found for model ${e}`), q(n), q("zodModel"), new Error(`No CPMs found for model ${e}`);
700
+ return e.parse(r);
701
+ }, { log__: p, err__: X } = P("common-cc"), { log__: ee } = P("stripe-cc"), fn = be(
702
+ async ({ context: n, checkoutPaymentMethod: e, nonCdeFormInputs: r, flowCallbacks: o }) => {
703
+ var u;
972
704
  p("├ Running common CC flow...", { checkoutPaymentMethod: e });
973
- const s = Array.from(t.cdeConnections.values())[0], i = await se(s);
705
+ const s = Array.from(n.cdeConnections.values())[0], i = await Y(s);
974
706
  p(`├ Validating non-CDE form fields [Mode: ${i.mode}]`);
975
- const a = Be(n, o.onValidationError);
976
- p(`├ Tokenizing card info in CDE [Session: ${t.elementsSessionId}]`);
977
- const c = await En(t.cdeConnections, {
978
- session_id: t.elementsSessionId
707
+ const a = Se(r, o.onValidationError);
708
+ p(`├ Tokenizing card info in CDE [Session: ${n.elementsSessionId}]`);
709
+ const c = await en(n.cdeConnections, {
710
+ session_id: n.elementsSessionId
979
711
  });
980
- zn(c, o.onValidationError);
981
- const d = {
982
- session_id: t.elementsSessionId,
712
+ mn(c, o.onValidationError);
713
+ const l = {
714
+ session_id: n.elementsSessionId,
983
715
  checkout_payment_method: e,
984
716
  non_cde_form_fields: a
985
717
  };
986
718
  try {
987
719
  if (i.mode === "setup") {
988
720
  p(`├ Setting up payment method in CDE [Token: ${i.token}]`);
989
- const f = await Cn(s, d);
990
- return p(`╰ Setup completed successfully [PM ID: ${f.payment_method_id}]`), { mode: "setup", result: f };
721
+ const d = await tn(s, l);
722
+ return p(`╰ Setup completed successfully [PM ID: ${d.payment_method_id}]`), { mode: "setup", result: d };
991
723
  } else {
992
- p(`├ Initial checkout flow. Checking out card info in CDE [Session: ${t.elementsSessionId}]`);
993
- const f = await ue(s, d);
994
- return p("╰ Checkout completed successfully."), { mode: "checkout", result: f };
724
+ p(`├ Initial checkout flow. Checking out card info in CDE [Session: ${n.elementsSessionId}]`);
725
+ const d = await Q(s, l);
726
+ return p("╰ Checkout completed successfully."), { mode: "checkout", result: d };
995
727
  }
996
- } catch (f) {
997
- if (f instanceof Le && f.originalErrorMessage === "3DS_REQUIRED") {
728
+ } catch (d) {
729
+ if (d instanceof ge && d.originalErrorMessage === "3DS_REQUIRED") {
998
730
  p("├ Card requires 3DS, starting non-legacy payment flow");
999
- const S = ((l = f.response.headers) == null ? void 0 : l["op-should-use-new-flow"]) === "true", _ = await gn(s, d);
1000
- if (p(`├ op-should-use-new-flow: ${S}`), p("├ Payment flow result:", _), S ? await Kn(_, t.baseUrl) : await Zn(_), i.mode === "setup") {
1001
- p(`├ Confirming payment flow [cc_pm_id: ${_.cc_pm_id}]`);
1002
- const w = await Ne(s, {
731
+ const S = ((u = d.response.headers) == null ? void 0 : u["op-should-use-new-flow"]) === "true", g = await Jt(s, l);
732
+ if (p(`├ op-should-use-new-flow: ${S}`), p("├ Payment flow result:", g), S ? await _n(g, n.baseUrl) : await gn(g), i.mode === "setup") {
733
+ p(`├ Confirming payment flow [cc_pm_id: ${g.cc_pm_id}]`);
734
+ const E = await we(s, {
1003
735
  secure_token: i.token,
1004
- existing_cc_pm_id: _.cc_pm_id
736
+ existing_cc_pm_id: g.cc_pm_id
1005
737
  });
1006
- p("├ Confirm payment flow result received Result:", w);
1007
- const E = ze(w);
1008
- return p(`╰ Setup completed successfully [PM ID: ${E.payment_method_id}]`), { mode: "setup", result: E };
738
+ p("├ Confirm payment flow result received Result:", E);
739
+ const b = Pe(E);
740
+ return p(`╰ Setup completed successfully [PM ID: ${b.payment_method_id}]`), { mode: "setup", result: b };
1009
741
  } else {
1010
742
  p(`├ Checking out after 3DS flow [Flow: ${S ? "new" : "legacy"}]`);
1011
- const w = await ue(s, {
1012
- ...d,
1013
- existing_cc_pm_id: _.cc_pm_id,
743
+ const E = await Q(s, {
744
+ ...l,
745
+ existing_cc_pm_id: g.cc_pm_id,
1014
746
  do_not_use_legacy_cc_flow: !S
1015
747
  });
1016
- return p("╰ Checkout completed successfully."), { mode: "checkout", result: w };
748
+ return p("╰ Checkout completed successfully."), { mode: "checkout", result: E };
1017
749
  }
1018
750
  }
1019
- throw _e("╰ Error checking out card info in CDE"), _e(f), f;
751
+ throw X("╰ Error checking out card info in CDE"), X(d), d;
1020
752
  }
1021
753
  }
1022
- ), Yn = (t) => {
1023
- const e = t.required_user_actions.find((n) => n.type === "stripe_3ds");
754
+ ), hn = (n) => {
755
+ const e = n.required_user_actions.find((r) => r.type === "stripe_3ds");
1024
756
  if (!e)
1025
757
  throw new Error("No stripe 3DS action found");
1026
- return Ft.parse(e);
1027
- }, Gn = (t) => {
1028
- const e = t.required_user_actions.find((n) => n.type === "airwallex_payment_consent");
758
+ return ft.parse(e);
759
+ }, yn = (n) => {
760
+ const e = n.required_user_actions.find((r) => r.type === "airwallex_payment_consent");
1029
761
  if (!e)
1030
762
  throw new Error("No common 3DS action found");
1031
- return jt.parse(e);
1032
- }, Kn = async (t, e) => {
1033
- const n = Gn(t);
1034
- p(`├ Using common 3DS flow [URL: ${n.redirect_url}]`);
1035
- const o = await An({ url: n.redirect_url, baseUrl: e });
1036
- if (p(`╰ 3DS verification completed [Status: ${o}]`), o === B.CANCELLED)
763
+ return mt.parse(e);
764
+ }, _n = async (n, e) => {
765
+ const r = yn(n);
766
+ p(`├ Using common 3DS flow [URL: ${r.redirect_url}]`);
767
+ const o = await ln({ url: r.redirect_url, baseUrl: e });
768
+ if (p(`╰ 3DS verification completed [Status: ${o}]`), o === L.CANCELLED)
1037
769
  throw new Error("3DS verification cancelled");
1038
- if (o === B.FAILURE)
770
+ if (o === L.FAILURE)
1039
771
  throw new Error("3DS verification failed");
1040
- }, Zn = async (t) => {
1041
- const e = Yn(t);
1042
- be(`├ Using stripe 3DS flow [Client Secret: ${e.client_secret.substring(0, 8)}...]`), await Ut(e), be("╰ Stripe 3DS flow completed successfully");
1043
- }, { log__: g, err__: Jn } = O("stripe-pr"), Wn = r.object({
1044
- provider: r.union([r.literal("apple_pay"), r.literal("google_pay")]),
1045
- processor_name: r.literal("stripe"),
1046
- metadata: r.object({
1047
- stripe_pk: r.string()
772
+ }, gn = async (n) => {
773
+ const e = hn(n);
774
+ ee(`├ Using stripe 3DS flow [Client Secret: ${e.client_secret.substring(0, 8)}...]`), await bt(e), ee("╰ Stripe 3DS flow completed successfully");
775
+ }, { log__: _, err__: wn } = P("stripe-pr"), En = t.object({
776
+ provider: t.union([t.literal("apple_pay"), t.literal("google_pay")]),
777
+ processor_name: t.literal("stripe"),
778
+ metadata: t.object({
779
+ stripe_pk: t.string()
1048
780
  })
1049
- }), Qn = qn(
1050
- async ({ context: t }) => {
1051
- g("Checking if there are any CPMs for Stripe PR...");
1052
- const e = Vn(t.checkoutPaymentMethods, Wn);
1053
- g("Initializing Stripe PR flow...");
1054
- const n = Array.from(t.cdeConnections.values())[0], o = await se(n), s = o.mode === "setup";
1055
- g("Getting initial preview amount");
1056
- const i = await wn(n, o.token, s, void 0), a = await xt(
781
+ }), bn = un(
782
+ async ({ context: n }) => {
783
+ _("Checking if there are any CPMs for Stripe PR...");
784
+ const e = pn(n.checkoutPaymentMethods, En);
785
+ _("Initializing Stripe PR flow...");
786
+ const r = Array.from(n.cdeConnections.values())[0], o = await Y(r), s = o.mode === "setup";
787
+ _("Getting initial preview amount");
788
+ const i = await Xt(r, o.token, s, void 0), a = await _t(
1057
789
  e.metadata.stripe_pk,
1058
790
  i.amountAtom,
1059
791
  i.currency,
1060
792
  s
1061
793
  );
1062
- g("Checking if can make payment");
794
+ _("Checking if can make payment");
1063
795
  const c = await a.canMakePayment();
1064
- return c === null ? (Jn("canMakePayment returned null"), { isAvailable: !1, reason: "canMakePayment returned null" }) : (g("Stripe PR flow initialized successfully. Can make payment", c), {
796
+ return c === null ? (wn("canMakePayment returned null"), { isAvailable: !1, reason: "canMakePayment returned null" }) : (_("Stripe PR flow initialized successfully. Can make payment", c), {
1065
797
  isAvailable: !0,
1066
798
  pr: a,
1067
799
  availableProviders: {
@@ -1070,217 +802,218 @@ const Ue = (t) => async (e) => {
1070
802
  }
1071
803
  });
1072
804
  }
1073
- ), Xn = Ue(
805
+ ), Cn = be(
1074
806
  async ({
1075
- context: t,
807
+ context: n,
1076
808
  checkoutPaymentMethod: e,
1077
- nonCdeFormInputs: n,
809
+ nonCdeFormInputs: r,
1078
810
  flowCallbacks: o,
1079
811
  customParams: s,
1080
812
  initResult: i
1081
813
  }) => {
1082
- if (g("Running Stripe PR flow..."), s.provider !== e.provider)
814
+ if (_("Running Stripe PR flow..."), s.provider !== e.provider)
1083
815
  throw new Error(`Provider mismatch. Expected ${s.provider}, got ${e.provider}`);
1084
- const a = Array.from(t.cdeConnections.values())[0], c = i.pr;
1085
- g("Validating non-CDE form fields");
1086
- const d = er(n), l = Be(d, o.onValidationError);
816
+ const a = Array.from(n.cdeConnections.values())[0], c = i.pr;
1087
817
  if (s != null && s.overridePaymentRequest) {
1088
- const E = s.overridePaymentRequest;
1089
- g("Overriding PR amount with", E), tr(c, E.amount, E.pending);
818
+ const b = s.overridePaymentRequest;
819
+ _("Overriding PR amount with", b), Pn(c, b.amount, b.pending);
1090
820
  }
1091
- g("Showing PR dialog..."), c.show();
1092
- const f = await Nt(c);
1093
- g("PR dialog finished. Starting payment flow...");
1094
- const S = await _n(a, {
1095
- fields: l,
821
+ _("Showing PR dialog..."), c.show();
822
+ const l = await wt(c);
823
+ _("Stripe PM added event:", l), _("Merging PM fields with form fields...");
824
+ const u = Sn(r, l), d = Se(u, o.onValidationError);
825
+ _("PR dialog finished. Starting payment flow...");
826
+ const S = await Wt(a, {
827
+ fields: d,
1096
828
  checkoutPaymentMethod: e
1097
- }), _ = nr(S);
1098
- g("Confirming PR with Stripe..."), await $t(_, f);
1099
- const w = await se(a);
1100
- if (w.mode === "setup") {
1101
- g("Confirming payment flow for setup...");
1102
- const E = await Ne(a, {
1103
- secure_token: w.token
829
+ }), g = vn(S);
830
+ _("Confirming PR with Stripe..."), await Et(g, l);
831
+ const E = await Y(a);
832
+ if (E.mode === "setup") {
833
+ _("Confirming payment flow for setup...");
834
+ const b = await we(a, {
835
+ secure_token: E.token
1104
836
  });
1105
- return { mode: "setup", result: ze(E) };
837
+ return { mode: "setup", result: Pe(b) };
1106
838
  } else {
1107
- g("Performing checkout...");
1108
- const E = {
1109
- secure_token: w.token,
839
+ _("Performing checkout...");
840
+ const b = {
841
+ secure_token: E.token,
1110
842
  payment_input: {
1111
843
  provider_type: e.provider
1112
844
  },
1113
- customer_email: l[P.EMAIL],
1114
- customer_zip_code: l[P.ZIP_CODE],
1115
- customer_country: l[P.COUNTRY],
1116
- promotion_code: l[P.PROMOTION_CODE],
1117
- line_items: w.line_items,
1118
- total_amount_atom: w.amount_total_atom,
845
+ customer_email: d[f.EMAIL],
846
+ customer_zip_code: d[f.ZIP_CODE],
847
+ customer_country: d[f.COUNTRY],
848
+ promotion_code: d[f.PROMOTION_CODE],
849
+ line_items: E.line_items,
850
+ total_amount_atom: E.amount_total_atom,
1119
851
  cancel_at_end: !1,
1120
852
  checkout_payment_method: e
1121
853
  };
1122
- return { mode: "checkout", result: await vn(a, E) };
854
+ return { mode: "checkout", result: await nn(a, b) };
1123
855
  }
1124
856
  }
1125
- ), er = (t) => {
1126
- const e = { ...t };
1127
- return e[P.ZIP_CODE] || (g("Overriding empty zip code (only for google pay and apple pay)"), e[P.ZIP_CODE] = "00000"), e;
1128
- }, tr = (t, e, n) => {
1129
- t.update({
857
+ ), Sn = (n, e) => {
858
+ var a, c, l, u;
859
+ const r = { ...n }, [o, ...s] = ((c = (a = e.payerName) == null ? void 0 : a.trim()) == null ? void 0 : c.split(/\s+/)) ?? [], i = s.join(" ") || void 0;
860
+ return r[f.FIRST_NAME] = r[f.FIRST_NAME] || o || "_OP_UNKNOWN", r[f.LAST_NAME] = r[f.LAST_NAME] || i || "_OP_UNKNOWN", r[f.EMAIL] = r[f.EMAIL] || e.payerEmail || "op_unfilled@getopenpay.com", r[f.ZIP_CODE] = r[f.ZIP_CODE] || ((l = e.shippingAddress) == null ? void 0 : l.postalCode) || "00000", r[f.COUNTRY] = r[f.COUNTRY] || ((u = e.shippingAddress) == null ? void 0 : u.country) || "US", _("Final form inputs:", r), r;
861
+ }, Pn = (n, e, r) => {
862
+ n.update({
1130
863
  total: {
1131
864
  amount: e.amountAtom,
1132
865
  label: "Total",
1133
- pending: n
866
+ pending: r
1134
867
  },
1135
868
  currency: e.currency
1136
869
  });
1137
- }, nr = (t) => {
1138
- if (t.required_user_actions.length !== 1)
870
+ }, vn = (n) => {
871
+ if (n.required_user_actions.length !== 1)
1139
872
  throw new Error(`Error occurred.
1140
- Details: got ${t.required_user_actions.length} required user actions`);
1141
- return Mt.parse(t.required_user_actions[0]);
1142
- }, we = (t, e, n) => {
1143
- const o = t.filter((s) => s.provider === e);
873
+ Details: got ${n.required_user_actions.length} required user actions`);
874
+ return ht.parse(n.required_user_actions[0]);
875
+ }, te = (n, e, r) => {
876
+ const o = n.filter((s) => s.provider === e);
1144
877
  if (o.length === 0)
1145
- throw new Error(`No CPMs found with provider '${e}' and processor '${n}'`);
878
+ throw new Error(`No CPMs found with provider '${e}' and processor '${r}'`);
1146
879
  if (o.length !== 1)
1147
- throw new Error(`More than one CPM found with provider '${e}' and processor '${n}'`);
880
+ throw new Error(`More than one CPM found with provider '${e}' and processor '${r}'`);
1148
881
  return o[0];
1149
- }, N = {
882
+ }, I = {
1150
883
  // ✋ Note: For flows that require initialization, please add them to `init-flows.ts`
1151
884
  // Stripe
1152
885
  commonCC: {
1153
- run: Hn
886
+ run: fn
1154
887
  },
1155
888
  stripePR: {
1156
- init: Qn,
1157
- run: Xn
889
+ init: bn,
890
+ run: Cn
1158
891
  }
1159
892
  // 👉 Add more flows here
1160
893
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1161
894
  };
1162
- function rr(t) {
1163
- return t && t.__esModule && Object.prototype.hasOwnProperty.call(t, "default") ? t.default : t;
895
+ function kn(n) {
896
+ return n && n.__esModule && Object.prototype.hasOwnProperty.call(n, "default") ? n.default : n;
1164
897
  }
1165
- var G = {};
1166
- Object.defineProperty(G, "__esModule", {
898
+ var U = {};
899
+ Object.defineProperty(U, "__esModule", {
1167
900
  value: !0
1168
901
  });
1169
- G.Observable = void 0;
1170
- const Ve = (t) => !!Symbol[t], ie = (t) => Ve(t) ? Symbol[t] : "@@" + t, or = ie("iterator"), ne = ie("observable"), He = ie("species");
1171
- function V(t, e) {
1172
- let n = t[e];
1173
- if (n != null) {
1174
- if (typeof n != "function") throw new TypeError(n + " is not a function");
1175
- return n;
902
+ U.Observable = void 0;
903
+ const ve = (n) => !!Symbol[n], Z = (n) => ve(n) ? Symbol[n] : "@@" + n, Rn = Z("iterator"), H = Z("observable"), ke = Z("species");
904
+ function D(n, e) {
905
+ let r = n[e];
906
+ if (r != null) {
907
+ if (typeof r != "function") throw new TypeError(r + " is not a function");
908
+ return r;
1176
909
  }
1177
910
  }
1178
- function j(t) {
1179
- let e = t.constructor;
1180
- return e !== void 0 && (e = e[He], e === null && (e = void 0)), e !== void 0 ? e : K;
911
+ function R(n) {
912
+ let e = n.constructor;
913
+ return e !== void 0 && (e = e[ke], e === null && (e = void 0)), e !== void 0 ? e : $;
1181
914
  }
1182
- function sr(t) {
1183
- return t instanceof K;
915
+ function On(n) {
916
+ return n instanceof $;
1184
917
  }
1185
- function A(t) {
1186
- A.log ? A.log(t) : setTimeout(() => {
1187
- throw t;
918
+ function v(n) {
919
+ v.log ? v.log(n) : setTimeout(() => {
920
+ throw n;
1188
921
  });
1189
922
  }
1190
- function $(t) {
923
+ function j(n) {
1191
924
  Promise.resolve().then(() => {
1192
925
  try {
1193
- t();
926
+ n();
1194
927
  } catch (e) {
1195
- A(e);
928
+ v(e);
1196
929
  }
1197
930
  });
1198
931
  }
1199
- function Ye(t) {
1200
- let e = t._cleanup;
1201
- if (e !== void 0 && (t._cleanup = void 0, !!e))
932
+ function Re(n) {
933
+ let e = n._cleanup;
934
+ if (e !== void 0 && (n._cleanup = void 0, !!e))
1202
935
  try {
1203
936
  if (typeof e == "function")
1204
937
  e();
1205
938
  else {
1206
- let n = V(e, "unsubscribe");
1207
- n && n.call(e);
939
+ let r = D(e, "unsubscribe");
940
+ r && r.call(e);
1208
941
  }
1209
- } catch (n) {
1210
- A(n);
942
+ } catch (r) {
943
+ v(r);
1211
944
  }
1212
945
  }
1213
- function re(t) {
1214
- t._observer = void 0, t._queue = void 0, t._state = "closed";
946
+ function K(n) {
947
+ n._observer = void 0, n._queue = void 0, n._state = "closed";
1215
948
  }
1216
- function ir(t) {
1217
- let e = t._queue;
949
+ function An(n) {
950
+ let e = n._queue;
1218
951
  if (e) {
1219
- t._queue = void 0, t._state = "ready";
1220
- for (let n = 0; n < e.length && (Ge(t, e[n].type, e[n].value), t._state !== "closed"); ++n)
952
+ n._queue = void 0, n._state = "ready";
953
+ for (let r = 0; r < e.length && (Oe(n, e[r].type, e[r].value), n._state !== "closed"); ++r)
1221
954
  ;
1222
955
  }
1223
956
  }
1224
- function Ge(t, e, n) {
1225
- t._state = "running";
1226
- let o = t._observer;
957
+ function Oe(n, e, r) {
958
+ n._state = "running";
959
+ let o = n._observer;
1227
960
  try {
1228
- let s = V(o, e);
961
+ let s = D(o, e);
1229
962
  switch (e) {
1230
963
  case "next":
1231
- s && s.call(o, n);
964
+ s && s.call(o, r);
1232
965
  break;
1233
966
  case "error":
1234
- if (re(t), s) s.call(o, n);
1235
- else throw n;
967
+ if (K(n), s) s.call(o, r);
968
+ else throw r;
1236
969
  break;
1237
970
  case "complete":
1238
- re(t), s && s.call(o);
971
+ K(n), s && s.call(o);
1239
972
  break;
1240
973
  }
1241
974
  } catch (s) {
1242
- A(s);
975
+ v(s);
1243
976
  }
1244
- t._state === "closed" ? Ye(t) : t._state === "running" && (t._state = "ready");
977
+ n._state === "closed" ? Re(n) : n._state === "running" && (n._state = "ready");
1245
978
  }
1246
- function W(t, e, n) {
1247
- if (t._state !== "closed") {
1248
- if (t._state === "buffering") {
1249
- t._queue.push({
979
+ function z(n, e, r) {
980
+ if (n._state !== "closed") {
981
+ if (n._state === "buffering") {
982
+ n._queue.push({
1250
983
  type: e,
1251
- value: n
984
+ value: r
1252
985
  });
1253
986
  return;
1254
987
  }
1255
- if (t._state !== "ready") {
1256
- t._state = "buffering", t._queue = [{
988
+ if (n._state !== "ready") {
989
+ n._state = "buffering", n._queue = [{
1257
990
  type: e,
1258
- value: n
1259
- }], $(() => ir(t));
991
+ value: r
992
+ }], j(() => An(n));
1260
993
  return;
1261
994
  }
1262
- Ge(t, e, n);
995
+ Oe(n, e, r);
1263
996
  }
1264
997
  }
1265
- class ar {
1266
- constructor(e, n) {
998
+ class Tn {
999
+ constructor(e, r) {
1267
1000
  this._cleanup = void 0, this._observer = e, this._queue = void 0, this._state = "initializing";
1268
1001
  let o = this, s = {
1269
1002
  get closed() {
1270
1003
  return o._state === "closed";
1271
1004
  },
1272
1005
  next(i) {
1273
- W(o, "next", i);
1006
+ z(o, "next", i);
1274
1007
  },
1275
1008
  error(i) {
1276
- W(o, "error", i);
1009
+ z(o, "error", i);
1277
1010
  },
1278
1011
  complete() {
1279
- W(o, "complete");
1012
+ z(o, "complete");
1280
1013
  }
1281
1014
  };
1282
1015
  try {
1283
- this._cleanup = n.call(void 0, s);
1016
+ this._cleanup = r.call(void 0, s);
1284
1017
  } catch (i) {
1285
1018
  s.error(i);
1286
1019
  }
@@ -1290,12 +1023,12 @@ class ar {
1290
1023
  return this._state === "closed";
1291
1024
  }
1292
1025
  unsubscribe() {
1293
- this._state !== "closed" && (re(this), Ye(this));
1026
+ this._state !== "closed" && (K(this), Re(this));
1294
1027
  }
1295
1028
  }
1296
- let K = class U {
1029
+ let $ = class F {
1297
1030
  constructor(e) {
1298
- if (!(this instanceof U)) throw new TypeError("Observable cannot be called as a function");
1031
+ if (!(this instanceof F)) throw new TypeError("Observable cannot be called as a function");
1299
1032
  if (typeof e != "function") throw new TypeError("Observable initializer must be a function");
1300
1033
  this._subscriber = e;
1301
1034
  }
@@ -1304,16 +1037,16 @@ let K = class U {
1304
1037
  next: e,
1305
1038
  error: arguments[1],
1306
1039
  complete: arguments[2]
1307
- }), new ar(e, this._subscriber);
1040
+ }), new Tn(e, this._subscriber);
1308
1041
  }
1309
1042
  forEach(e) {
1310
- return new Promise((n, o) => {
1043
+ return new Promise((r, o) => {
1311
1044
  if (typeof e != "function") {
1312
1045
  o(new TypeError(e + " is not a function"));
1313
1046
  return;
1314
1047
  }
1315
1048
  function s() {
1316
- i.unsubscribe(), n();
1049
+ i.unsubscribe(), r();
1317
1050
  }
1318
1051
  let i = this.subscribe({
1319
1052
  next(a) {
@@ -1324,14 +1057,14 @@ let K = class U {
1324
1057
  }
1325
1058
  },
1326
1059
  error: o,
1327
- complete: n
1060
+ complete: r
1328
1061
  });
1329
1062
  });
1330
1063
  }
1331
1064
  map(e) {
1332
1065
  if (typeof e != "function") throw new TypeError(e + " is not a function");
1333
- let n = j(this);
1334
- return new n((o) => this.subscribe({
1066
+ let r = R(this);
1067
+ return new r((o) => this.subscribe({
1335
1068
  next(s) {
1336
1069
  try {
1337
1070
  s = e(s);
@@ -1350,8 +1083,8 @@ let K = class U {
1350
1083
  }
1351
1084
  filter(e) {
1352
1085
  if (typeof e != "function") throw new TypeError(e + " is not a function");
1353
- let n = j(this);
1354
- return new n((o) => this.subscribe({
1086
+ let r = R(this);
1087
+ return new r((o) => this.subscribe({
1355
1088
  next(s) {
1356
1089
  try {
1357
1090
  if (!e(s)) return;
@@ -1370,21 +1103,21 @@ let K = class U {
1370
1103
  }
1371
1104
  reduce(e) {
1372
1105
  if (typeof e != "function") throw new TypeError(e + " is not a function");
1373
- let n = j(this), o = arguments.length > 1, s = !1, a = arguments[1];
1374
- return new n((c) => this.subscribe({
1375
- next(d) {
1376
- let l = !s;
1377
- if (s = !0, !l || o)
1106
+ let r = R(this), o = arguments.length > 1, s = !1, a = arguments[1];
1107
+ return new r((c) => this.subscribe({
1108
+ next(l) {
1109
+ let u = !s;
1110
+ if (s = !0, !u || o)
1378
1111
  try {
1379
- a = e(a, d);
1380
- } catch (f) {
1381
- return c.error(f);
1112
+ a = e(a, l);
1113
+ } catch (d) {
1114
+ return c.error(d);
1382
1115
  }
1383
1116
  else
1384
- a = d;
1117
+ a = l;
1385
1118
  },
1386
- error(d) {
1387
- c.error(d);
1119
+ error(l) {
1120
+ c.error(l);
1388
1121
  },
1389
1122
  complete() {
1390
1123
  if (!s && !o) return c.error(new TypeError("Cannot reduce an empty sequence"));
@@ -1394,22 +1127,22 @@ let K = class U {
1394
1127
  }
1395
1128
  async all() {
1396
1129
  let e = [];
1397
- return await this.forEach((n) => e.push(n)), e;
1130
+ return await this.forEach((r) => e.push(r)), e;
1398
1131
  }
1399
1132
  concat(...e) {
1400
- let n = j(this);
1401
- return new n((o) => {
1133
+ let r = R(this);
1134
+ return new r((o) => {
1402
1135
  let s, i = 0;
1403
1136
  function a(c) {
1404
1137
  s = c.subscribe({
1405
- next(d) {
1406
- o.next(d);
1138
+ next(l) {
1139
+ o.next(l);
1407
1140
  },
1408
- error(d) {
1409
- o.error(d);
1141
+ error(l) {
1142
+ o.error(l);
1410
1143
  },
1411
1144
  complete() {
1412
- i === e.length ? (s = void 0, o.complete()) : a(n.from(e[i++]));
1145
+ i === e.length ? (s = void 0, o.complete()) : a(r.from(e[i++]));
1413
1146
  }
1414
1147
  });
1415
1148
  }
@@ -1420,29 +1153,29 @@ let K = class U {
1420
1153
  }
1421
1154
  flatMap(e) {
1422
1155
  if (typeof e != "function") throw new TypeError(e + " is not a function");
1423
- let n = j(this);
1424
- return new n((o) => {
1156
+ let r = R(this);
1157
+ return new r((o) => {
1425
1158
  let s = [], i = this.subscribe({
1426
1159
  next(c) {
1427
1160
  if (e)
1428
1161
  try {
1429
1162
  c = e(c);
1430
- } catch (l) {
1431
- return o.error(l);
1163
+ } catch (u) {
1164
+ return o.error(u);
1432
1165
  }
1433
- let d = n.from(c).subscribe({
1434
- next(l) {
1435
- o.next(l);
1166
+ let l = r.from(c).subscribe({
1167
+ next(u) {
1168
+ o.next(u);
1436
1169
  },
1437
- error(l) {
1438
- o.error(l);
1170
+ error(u) {
1171
+ o.error(u);
1439
1172
  },
1440
1173
  complete() {
1441
- let l = s.indexOf(d);
1442
- l >= 0 && s.splice(l, 1), a();
1174
+ let u = s.indexOf(l);
1175
+ u >= 0 && s.splice(u, 1), a();
1443
1176
  }
1444
1177
  });
1445
- s.push(d);
1178
+ s.push(l);
1446
1179
  },
1447
1180
  error(c) {
1448
1181
  o.error(c);
@@ -1459,21 +1192,21 @@ let K = class U {
1459
1192
  };
1460
1193
  });
1461
1194
  }
1462
- [ne]() {
1195
+ [H]() {
1463
1196
  return this;
1464
1197
  }
1465
1198
  static from(e) {
1466
- let n = typeof this == "function" ? this : U;
1199
+ let r = typeof this == "function" ? this : F;
1467
1200
  if (e == null) throw new TypeError(e + " is not an object");
1468
- let o = V(e, ne);
1201
+ let o = D(e, H);
1469
1202
  if (o) {
1470
1203
  let s = o.call(e);
1471
1204
  if (Object(s) !== s) throw new TypeError(s + " is not an object");
1472
- return sr(s) && s.constructor === n ? s : new n((i) => s.subscribe(i));
1205
+ return On(s) && s.constructor === r ? s : new r((i) => s.subscribe(i));
1473
1206
  }
1474
- if (Ve("iterator") && (o = V(e, or), o))
1475
- return new n((s) => {
1476
- $(() => {
1207
+ if (ve("iterator") && (o = D(e, Rn), o))
1208
+ return new r((s) => {
1209
+ j(() => {
1477
1210
  if (!s.closed) {
1478
1211
  for (let i of o.call(e))
1479
1212
  if (s.next(i), s.closed) return;
@@ -1482,8 +1215,8 @@ let K = class U {
1482
1215
  });
1483
1216
  });
1484
1217
  if (Array.isArray(e))
1485
- return new n((s) => {
1486
- $(() => {
1218
+ return new r((s) => {
1219
+ j(() => {
1487
1220
  if (!s.closed) {
1488
1221
  for (let i = 0; i < e.length; ++i)
1489
1222
  if (s.next(e[i]), s.closed) return;
@@ -1494,9 +1227,9 @@ let K = class U {
1494
1227
  throw new TypeError(e + " is not observable");
1495
1228
  }
1496
1229
  static of(...e) {
1497
- let n = typeof this == "function" ? this : U;
1498
- return new n((o) => {
1499
- $(() => {
1230
+ let r = typeof this == "function" ? this : F;
1231
+ return new r((o) => {
1232
+ j(() => {
1500
1233
  if (!o.closed) {
1501
1234
  for (let s = 0; s < e.length; ++s)
1502
1235
  if (o.next(e[s]), o.closed) return;
@@ -1505,52 +1238,52 @@ let K = class U {
1505
1238
  });
1506
1239
  });
1507
1240
  }
1508
- static get [He]() {
1241
+ static get [ke]() {
1509
1242
  return this;
1510
1243
  }
1511
1244
  };
1512
- G.Observable = K;
1513
- Object.defineProperty(K, Symbol("extensions"), {
1245
+ U.Observable = $;
1246
+ Object.defineProperty($, Symbol("extensions"), {
1514
1247
  value: {
1515
- symbol: ne,
1516
- hostReportError: A
1248
+ symbol: H,
1249
+ hostReportError: v
1517
1250
  },
1518
1251
  configurable: !0
1519
1252
  });
1520
- var cr = G.Observable;
1521
- const lr = /* @__PURE__ */ rr(cr), { log__: ur, err__: dr } = O("init-flows"), mr = (t) => ({
1253
+ var In = U.Observable;
1254
+ const jn = /* @__PURE__ */ kn(In), { log__: Fn, err__: Mn } = P("init-flows"), Ln = (n) => ({
1522
1255
  // Stripe PR
1523
- stripePR: fr("stripePR", N.stripePR.init({ context: t }))
1256
+ stripePR: Dn("stripePR", I.stripePR.init({ context: n }))
1524
1257
  // 👉 Add initialization flows here
1525
- }), fr = (t, e) => {
1526
- const n = new lr((o) => {
1258
+ }), Dn = (n, e) => {
1259
+ const r = new jn((o) => {
1527
1260
  o.next({ status: "loading" }), e.then((s) => {
1528
1261
  o.next({ status: "loaded", result: s });
1529
1262
  }).catch((s) => {
1530
1263
  o.next({ status: "error", message: s.message });
1531
1264
  });
1532
1265
  });
1533
- return n.subscribe({
1266
+ return r.subscribe({
1534
1267
  next: (o) => {
1535
- ur(`${t} flow result`, o);
1268
+ Fn(`${n} flow result`, o);
1536
1269
  },
1537
1270
  error: (o) => {
1538
- throw dr(`${t} flow initialization error:
1271
+ throw Mn(`${n} flow initialization error:
1539
1272
  ${JSON.stringify(o)}`), o;
1540
1273
  }
1541
- }), n;
1542
- }, Ee = {
1274
+ }), r;
1275
+ }, ne = {
1543
1276
  isLoading: !0,
1544
1277
  isAvailable: !1,
1545
1278
  startFlow: async () => {
1546
1279
  }
1547
- }, Ce = {
1280
+ }, re = {
1548
1281
  isLoading: !1,
1549
1282
  isAvailable: !1,
1550
1283
  startFlow: async () => {
1551
1284
  }
1552
1285
  };
1553
- class pr {
1286
+ class Nn {
1554
1287
  constructor(e) {
1555
1288
  this.formInstance = e, this.config = e.config, this.formId = e.formId, this.eventTargets = {}, this.nonces = /* @__PURE__ */ new Set();
1556
1289
  }
@@ -1560,9 +1293,9 @@ class pr {
1560
1293
  throw new Error("No source found");
1561
1294
  if (e.origin !== ((c = this.formInstance.config._frameUrl) == null ? void 0 : c.origin) || typeof e.data == "object" && e.data.penpal)
1562
1295
  return;
1563
- const n = zt(JSON.parse(e.data));
1564
- if (!this.validateEvent(n)) return;
1565
- const { elementId: s, payload: i } = n;
1296
+ const r = Pt(JSON.parse(e.data));
1297
+ if (!this.validateEvent(r)) return;
1298
+ const { elementId: s, payload: i } = r;
1566
1299
  switch (i.type) {
1567
1300
  case "LAYOUT":
1568
1301
  this.handleLayoutEvent(i);
@@ -1591,26 +1324,26 @@ class pr {
1591
1324
  return e.formId !== this.formInstance.formId || !e.elementId || this.nonces.has(e.nonce) ? !1 : (this.nonces.add(e.nonce), !0);
1592
1325
  }
1593
1326
  handleLayoutEvent(e) {
1594
- const n = e.height ? `${e.height}px` : "100%";
1595
- this.formInstance.setFormHeight(n);
1327
+ const r = e.height ? `${e.height}px` : "100%";
1328
+ this.formInstance.setFormHeight(r);
1596
1329
  }
1597
- handleFocusEvent(e, n) {
1598
- this.config.onFocus && this.config.onFocus(e, n);
1330
+ handleFocusEvent(e, r) {
1331
+ this.config.onFocus && this.config.onFocus(e, r);
1599
1332
  }
1600
- handleBlurEvent(e, n) {
1601
- this.config.onBlur && this.config.onBlur(e, n);
1333
+ handleBlurEvent(e, r) {
1334
+ this.config.onBlur && this.config.onBlur(e, r);
1602
1335
  }
1603
- handleChangeEvent(e, n, o) {
1604
- this.config.onChange && this.config.onChange(e, n, o);
1336
+ handleChangeEvent(e, r, o) {
1337
+ this.config.onChange && this.config.onChange(e, r, o);
1605
1338
  }
1606
- async handleLoadedEvent(e, n, o) {
1607
- this.eventTargets[n] = e, this.formInstance.onCdeLoaded(o), this.config.onLoad && this.config.onLoad(o.totalAmountAtoms, o.currency);
1339
+ async handleLoadedEvent(e, r, o) {
1340
+ this.eventTargets[r] = e, this.formInstance.onCdeLoaded(o), this.config.onLoad && this.config.onLoad(o.totalAmountAtoms, o.currency);
1608
1341
  }
1609
1342
  handleLoadErrorEvent(e) {
1610
1343
  this.formInstance.config.onLoadError && this.formInstance.config.onLoadError(e.message);
1611
1344
  }
1612
- handleValidationErrorEvent(e, n) {
1613
- this.formInstance.config.onValidationError && this.formInstance.config.onValidationError(e.elementType, e.errors, n);
1345
+ handleValidationErrorEvent(e, r) {
1346
+ this.formInstance.config.onValidationError && this.formInstance.config.onValidationError(e.elementType, e.errors, r);
1614
1347
  }
1615
1348
  // async handleErrorEvent(payload: ErrorEventPayload) {
1616
1349
  // if (payload.message === '3DS_REQUIRED') {
@@ -1699,26 +1432,26 @@ class pr {
1699
1432
  // break;
1700
1433
  // }
1701
1434
  // }
1702
- postEventToFrame(e, n, o) {
1703
- Vt(e, this.formId, n, o, this.config.baseUrl);
1435
+ postEventToFrame(e, r, o) {
1436
+ vt(e, this.formId, r, o, this.config.baseUrl);
1704
1437
  }
1705
1438
  }
1706
- async function hr(t, e) {
1707
- const o = await Se({
1708
- iframe: t,
1709
- debug: !0,
1439
+ async function xn(n, e) {
1440
+ const o = await se({
1441
+ iframe: n,
1442
+ debug: !1,
1710
1443
  childOrigin: e
1711
- }).promise, s = await Ht(o);
1712
- if (!Yt(o, s))
1444
+ }).promise, s = await kt(o);
1445
+ if (!Rt(o, s))
1713
1446
  throw new Error("Got invalid CDE connection object");
1714
1447
  return o;
1715
1448
  }
1716
- class yr {
1449
+ class Un {
1717
1450
  constructor() {
1718
1451
  this.connections = /* @__PURE__ */ new Map();
1719
1452
  }
1720
- addConnection(e, n) {
1721
- this.connections.set(e, n);
1453
+ addConnection(e, r) {
1454
+ this.connections.set(e, r);
1722
1455
  }
1723
1456
  getConnection() {
1724
1457
  const e = this.connections.values().next().value;
@@ -1730,51 +1463,51 @@ class yr {
1730
1463
  return this.connections;
1731
1464
  }
1732
1465
  }
1733
- const I = class I {
1466
+ const O = class O {
1734
1467
  constructor(e) {
1735
1468
  this.tryInitOjsFlows = () => {
1736
- this.ojsFlowsInitialization === null && this.cdeLoadedPayload && this.connectionManager.getAllConnections().size !== 0 && (this.ojsFlowsInitialization = mr(this.createOjsFlowContext()), this.ojsFlowsInitialization.stripePR.subscribe((n) => this.onStripePRStatusChange(n)));
1737
- }, this.onCdeLoaded = (n) => {
1738
- this.cdeLoadedPayload || (this.cdeLoadedPayload = n, this.tryInitOjsFlows());
1739
- }, this.onStripePRStatusChange = (n) => {
1740
- var o, s, i, a, c, d;
1741
- if (n.status === "loading")
1742
- (s = (o = this.config).onPaymentRequestLoad) == null || s.call(o, { apple_pay: Ee, google_pay: Ee });
1743
- else if (n.status === "error")
1744
- (a = (i = this.config).onPaymentRequestLoad) == null || a.call(i, { apple_pay: Ce, google_pay: Ce });
1745
- else if (n.status === "loaded") {
1746
- const l = n.result, f = l.isAvailable && l.availableProviders.applePay, S = l.isAvailable && l.availableProviders.googlePay;
1747
- (d = (c = this.config).onPaymentRequestLoad) == null || d.call(c, {
1469
+ this.ojsFlowsInitialization === null && this.cdeLoadedPayload && this.connectionManager.getAllConnections().size !== 0 && (this.ojsFlowsInitialization = Ln(this.createOjsFlowContext()), this.ojsFlowsInitialization.stripePR.subscribe((r) => this.onStripePRStatusChange(r)));
1470
+ }, this.onCdeLoaded = (r) => {
1471
+ this.cdeLoadedPayload || (this.cdeLoadedPayload = r, this.tryInitOjsFlows());
1472
+ }, this.onStripePRStatusChange = (r) => {
1473
+ var o, s, i, a, c, l;
1474
+ if (r.status === "loading")
1475
+ (s = (o = this.config).onPaymentRequestLoad) == null || s.call(o, { apple_pay: ne, google_pay: ne });
1476
+ else if (r.status === "error")
1477
+ (a = (i = this.config).onPaymentRequestLoad) == null || a.call(i, { apple_pay: re, google_pay: re });
1478
+ else if (r.status === "loaded") {
1479
+ const u = r.result, d = u.isAvailable && u.availableProviders.applePay, S = u.isAvailable && u.availableProviders.googlePay;
1480
+ (l = (c = this.config).onPaymentRequestLoad) == null || l.call(c, {
1748
1481
  apple_pay: {
1749
1482
  isLoading: !1,
1750
- isAvailable: f,
1751
- startFlow: async (_) => f ? this.submitPaymentRequest("apple_pay", l, _) : void 0
1483
+ isAvailable: d,
1484
+ startFlow: async (g) => d ? this.submitPaymentRequest("apple_pay", u, g) : void 0
1752
1485
  },
1753
1486
  google_pay: {
1754
1487
  isLoading: !1,
1755
1488
  isAvailable: S,
1756
- startFlow: async (_) => S ? this.submitPaymentRequest("google_pay", l, _) : void 0
1489
+ startFlow: async (g) => S ? this.submitPaymentRequest("google_pay", u, g) : void 0
1757
1490
  }
1758
1491
  });
1759
1492
  }
1760
- }, this.submitPaymentRequest = (n, o, s) => {
1493
+ }, this.submitPaymentRequest = (r, o, s) => {
1761
1494
  const i = this.createOjsFlowContext();
1762
- return N.stripePR.run({
1495
+ return I.stripePR.run({
1763
1496
  context: i,
1764
- checkoutPaymentMethod: we(i.checkoutPaymentMethods, n),
1497
+ checkoutPaymentMethod: te(i.checkoutPaymentMethods, r),
1765
1498
  nonCdeFormInputs: this.getNonCdeFormInputs(),
1766
1499
  flowCallbacks: this.createOjsFlowCallbacks(),
1767
- customParams: { provider: n, overridePaymentRequest: s == null ? void 0 : s.overridePaymentRequest },
1500
+ customParams: { provider: r, overridePaymentRequest: s == null ? void 0 : s.overridePaymentRequest },
1768
1501
  initResult: o
1769
1502
  });
1770
- }, I.assignAsSingleton(this), this.config = { ...e, baseUrl: e.baseUrl ?? "https://cde.getopenpay.com" }, this.elements = null, this.formId = `opjs-form-${window.crypto.randomUUID()}`, this.referer = window.location.origin, this.formTarget = e.formTarget ?? "body", this.formProperties = { height: "1px" }, this.cdeLoadedPayload = null, this.ojsFlowsInitialization = null, this.checkoutFired = !1, this.connectionManager = new yr(), this.eventHandler = new pr(this), this.ojsVersion = "0.1.6", window.addEventListener("message", this.eventHandler.handleMessage.bind(this.eventHandler));
1503
+ }, O.assignAsSingleton(this), this.config = { ...e, baseUrl: e.baseUrl ?? "https://cde.getopenpay.com" }, this.elements = null, this.formId = `opjs-form-${window.crypto.randomUUID()}`, this.referer = window.location.origin, this.formTarget = e.formTarget ?? "body", this.formProperties = { height: "1px" }, this.cdeLoadedPayload = null, this.ojsFlowsInitialization = null, this.checkoutFired = !1, this.connectionManager = new Un(), this.eventHandler = new Nn(this), this.ojsVersion = "0.1.7", window.addEventListener("message", this.eventHandler.handleMessage.bind(this.eventHandler));
1771
1504
  }
1772
1505
  /**
1773
1506
  * Assign the instance to the window as a singleton
1774
1507
  * @param form - The OpenPayForm instance
1775
1508
  */
1776
1509
  static assignAsSingleton(e) {
1777
- if (I.getInstance())
1510
+ if (O.getInstance())
1778
1511
  throw new Error("OpenPay instance already exists. Only one instance is allowed.");
1779
1512
  window.ojs = e;
1780
1513
  }
@@ -1789,34 +1522,34 @@ const I = class I {
1789
1522
  return this.connectionManager;
1790
1523
  }
1791
1524
  setFormHeight(e) {
1792
- this.formProperties.height = e, this.elements && Object.values(this.elements).forEach((n) => {
1793
- n.node.style.height = e;
1525
+ this.formProperties.height = e, this.elements && Object.values(this.elements).forEach((r) => {
1526
+ r.node.style.height = e;
1794
1527
  });
1795
1528
  }
1796
- createElement(e, n = {}) {
1529
+ createElement(e, r = {}) {
1797
1530
  if (!this.config) throw new Error("OpenPay form not initialized");
1798
- const o = st.parse(e), s = document.createElement("iframe"), i = this.buildQueryString(n);
1531
+ const o = $e.parse(e), s = document.createElement("iframe"), i = this.buildQueryString(r);
1799
1532
  s.name = `${o}-element`;
1800
1533
  const a = new URL(`/app/v1/${s.name}`, this.config.baseUrl);
1801
1534
  a.search = i.toString(), s.src = a.href, this.config._frameUrl = a, s.style.border = "none", s.style.width = "100%";
1802
1535
  const c = {
1803
1536
  type: o,
1804
1537
  node: s,
1805
- mount: (d) => {
1806
- var l;
1807
- return (l = document.querySelector(d)) == null ? void 0 : l.appendChild(s);
1538
+ mount: (l) => {
1539
+ var u;
1540
+ return (u = document.querySelector(l)) == null ? void 0 : u.appendChild(s);
1808
1541
  }
1809
1542
  };
1810
1543
  return this.connectToElement(c), this.elements ? this.elements[o] = c : this.elements = { [o]: c }, c;
1811
1544
  }
1812
1545
  buildQueryString(e) {
1813
- const n = new URLSearchParams();
1814
- return n.append("referer", this.referer), n.append("formId", this.formId), e.styles && n.append("styles", qt(e.styles)), n.append("secureToken", this.config.checkoutSecureToken), n;
1546
+ const r = new URLSearchParams();
1547
+ return r.append("referer", this.referer), r.append("formId", this.formId), e.styles && r.append("styles", Ct(e.styles)), r.append("secureToken", this.config.checkoutSecureToken), r;
1815
1548
  }
1816
1549
  connectToElement(e) {
1817
- hr(e.node).then((n) => {
1818
- this.connectionManager.addConnection(e.type, n), this.tryInitOjsFlows();
1819
- }).catch((n) => {
1550
+ xn(e.node).then((r) => {
1551
+ this.connectionManager.addConnection(e.type, r), this.tryInitOjsFlows();
1552
+ }).catch((r) => {
1820
1553
  });
1821
1554
  }
1822
1555
  getFormDiv() {
@@ -1829,7 +1562,7 @@ const I = class I {
1829
1562
  if (e.size === 0)
1830
1563
  throw new Error("No CDE connections found");
1831
1564
  return {
1832
- baseUrl: new URL(this.config.baseUrl ?? Je).origin,
1565
+ baseUrl: new URL(this.config.baseUrl ?? Ie).origin,
1833
1566
  formDiv: this.getFormDiv(),
1834
1567
  elementsSessionId: this.cdeLoadedPayload.sessionId,
1835
1568
  checkoutPaymentMethods: this.cdeLoadedPayload.checkoutPaymentMethods,
@@ -1837,27 +1570,27 @@ const I = class I {
1837
1570
  };
1838
1571
  }
1839
1572
  getNonCdeFormInputs() {
1840
- return Bt(this.getFormDiv());
1573
+ return St(this.getFormDiv());
1841
1574
  }
1842
1575
  createOjsFlowCallbacks() {
1843
1576
  const e = () => {
1844
1577
  };
1845
1578
  return {
1846
- onCheckoutError: T("onCheckoutError", this.config.onCheckoutError ?? e),
1847
- onCheckoutStarted: T("onCheckoutStarted", this.config.onCheckoutStarted ?? e),
1848
- onCheckoutSuccess: T("onCheckoutSuccess", this.config.onCheckoutSuccess ?? e),
1849
- onSetupPaymentMethodSuccess: T(
1579
+ onCheckoutError: k("onCheckoutError", this.config.onCheckoutError ?? e),
1580
+ onCheckoutStarted: k("onCheckoutStarted", this.config.onCheckoutStarted ?? e),
1581
+ onCheckoutSuccess: k("onCheckoutSuccess", this.config.onCheckoutSuccess ?? e),
1582
+ onSetupPaymentMethodSuccess: k(
1850
1583
  "onSetupPaymentMethodSuccess",
1851
1584
  this.config.onSetupPaymentMethodSuccess ?? e
1852
1585
  ),
1853
- onValidationError: T("onValidationError", this.config.onValidationError ?? e)
1586
+ onValidationError: k("onValidationError", this.config.onValidationError ?? e)
1854
1587
  };
1855
1588
  }
1856
1589
  submit() {
1857
1590
  const e = this.createOjsFlowContext();
1858
- N.commonCC.run({
1591
+ I.commonCC.run({
1859
1592
  context: e,
1860
- checkoutPaymentMethod: we(e.checkoutPaymentMethods, "credit_card"),
1593
+ checkoutPaymentMethod: te(e.checkoutPaymentMethods, "credit_card"),
1861
1594
  nonCdeFormInputs: this.getNonCdeFormInputs(),
1862
1595
  flowCallbacks: this.createOjsFlowCallbacks(),
1863
1596
  customParams: void 0,
@@ -1875,10 +1608,10 @@ const I = class I {
1875
1608
  window.removeEventListener("message", this.eventHandler.handleMessage.bind(this.eventHandler));
1876
1609
  }
1877
1610
  };
1878
- I.ojsFlows = N;
1879
- let ve = I;
1611
+ O.ojsFlows = I;
1612
+ let oe = O;
1880
1613
  export {
1881
- P as FieldName,
1882
- ve as OpenPayForm
1614
+ f as FieldName,
1615
+ oe as OpenPayForm
1883
1616
  };
1884
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXguZXMuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IGNvbm5lY3RUb0NoaWxkIH0gZnJvbSAncGVucGFsJztcblxuY29uc3QgRlJBTUVfQkFTRV9VUkwgPSBcImh0dHBzOi8vY2RlLmdldG9wZW5wYXkuY29tXCI7XG5cbmNvbnN0IFB5ZGFudGljVmFsaWRhdGlvbkVycm9yJDEgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHouc3RyaW5nKCksXG4gIGxvYzogei5hcnJheSh6LnN0cmluZygpKSxcbiAgbXNnOiB6LnN0cmluZygpLFxuICB1cmw6IHouc3RyaW5nKClcbn0pO1xuY29uc3QgUHlkYW50aWNWYWxpZGF0aW9uRXJyb3JSZXNwb25zZSA9IHouYXJyYXkoUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSk7XG5jb25zdCBab2RGaWVsZEVycm9yID0gei5vYmplY3Qoe1xuICBjb2RlOiB6LnN0cmluZygpLFxuICBtZXNzYWdlOiB6LnN0cmluZygpLFxuICBwYXRoOiB6LmFycmF5KHouc3RyaW5nKCkpXG59KTtcbmNvbnN0IFpvZEZpZWxkRXJyb3JzID0gei5hcnJheShab2RGaWVsZEVycm9yKTtcbmNvbnN0IE1BUF9UT19IVU1BTl9GUklFTkRMWV9MT1dFUkNBU0UgPSB7XG4gIFwiZmFpbGVkIHRvIGZldGNoXCI6IGBDb25uZWN0aW9uIGVycm9yOiBwbGVhc2UgZG91YmxlIGNoZWNrIGlmIHlvdSBhcmUgY29ubmVjdGVkIHRvIHRoZSBpbnRlcm5ldCwgdGhlbiB0cnkgYWdhaW5gXG59O1xuY29uc3QgZ2V0SHVtYW5GcmllbmRseU1lc3NhZ2UgPSAob2dFcnJvck1lc3NhZ2UpID0+IHtcbiAgY29uc3Qga2V5ID0gb2dFcnJvck1lc3NhZ2UudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIHJldHVybiBNQVBfVE9fSFVNQU5fRlJJRU5ETFlfTE9XRVJDQVNFW2tleV0gPz8gb2dFcnJvck1lc3NhZ2U7XG59O1xuY29uc3QgaXNTdHJpbmdpZmllZEpzb25PYmplY3QgPSAoc3RyKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIHJldHVybiB0eXBlb2YgcGFyc2VkID09PSBcIm9iamVjdFwiO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuY29uc3QgY3JlYXRlTWVzc2FnZUZyb21QeWRhbnRpY1ZhbGlkYXRpb25FcnJvciA9IChyZXNwb25zZSkgPT4ge1xuICBpZiAocmVzcG9uc2UubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGdldEh1bWFuRnJpZW5kbHlNZXNzYWdlKHJlc3BvbnNlWzBdLm1zZyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYnVsbGV0ZWQgPSByZXNwb25zZS5tYXAoKGVycikgPT4gYOKAoiAke2dldEh1bWFuRnJpZW5kbHlNZXNzYWdlKGVyci5tc2cpfWApLmpvaW4oXCJcXG5cIik7XG4gICAgcmV0dXJuIGAke2BQbGVhc2UgZml4IHRoZSBmb2xsb3dpbmcgZXJyb3JzOmB9XG4ke2J1bGxldGVkfWA7XG4gIH1cbn07XG5jb25zdCBjcmVhdGVNZXNzYWdlRnJvbVpvZEZpZWxkRXJyb3JzID0gKGVycm9ycykgPT4ge1xuICBjb25zdCBsaXN0T2ZFcnJvcnMgPSBlcnJvcnMubWFwKChlcnIpID0+IGAtICR7ZXJyLnBhdGguam9pbihcIi9cIil9OiAke2Vyci5tZXNzYWdlfWApLmpvaW4oXCJcXG5cIik7XG4gIHJldHVybiBgRW5jb3VudGVyZWQgdGhlIGZvbGxvd2luZyBlcnJvcnM6XG4ke2xpc3RPZkVycm9yc31gO1xufTtcbmNvbnN0IGdldEVycm9yTWVzc2FnZSA9IChlKSA9PiB7XG4gIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBpZiAoaXNTdHJpbmdpZmllZEpzb25PYmplY3QoZS5tZXNzYWdlKSkge1xuICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShlLm1lc3NhZ2UpO1xuICAgICAgaWYgKFB5ZGFudGljVmFsaWRhdGlvbkVycm9yUmVzcG9uc2Uuc2FmZVBhcnNlKG9iaikuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUZyb21QeWRhbnRpY1ZhbGlkYXRpb25FcnJvcihvYmopO1xuICAgICAgfSBlbHNlIGlmIChab2RGaWVsZEVycm9ycy5zYWZlUGFyc2Uob2JqKS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVNZXNzYWdlRnJvbVpvZEZpZWxkRXJyb3JzKG9iaik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZS5tZXNzYWdlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0SHVtYW5GcmllbmRseU1lc3NhZ2UoZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlKTtcbiAgICB9IGNhdGNoIChlMikge1xuICAgICAgcmV0dXJuIGUyICsgXCJcIjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGUgKyBcIlwiO1xuICB9XG59O1xuY29uc3QgbWFrZUNhbGxiYWNrU2FmZSA9IChjYWxsYmFja05hbWUsIGZuKSA9PiB7XG4gIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgUmVxdWlyZWRTdHJpbmcgPSB6LnN0cmluZygpLnRyaW0oKS5taW4oMSwgeyBtZXNzYWdlOiBgQ2Fubm90IGJlIGJsYW5rYCB9KTtcbmNvbnN0IE9wdGlvbmFsU3RyaW5nID0gei5zdHJpbmcoKS50cmltKCkub3B0aW9uYWwoKTtcbmNvbnN0IG51bGxPclVuZGVmT3IkMSA9ICh6VHlwZSkgPT4gei5udWxsYWJsZSh6VHlwZS5vcHRpb25hbCgpKTtcbnZhciBGaWVsZE5hbWUgPSAvKiBAX19QVVJFX18gKi8gKChGaWVsZE5hbWUyKSA9PiB7XG4gIEZpZWxkTmFtZTJbXCJGSVJTVF9OQU1FXCJdID0gXCJmaXJzdE5hbWVcIjtcbiAgRmllbGROYW1lMltcIkxBU1RfTkFNRVwiXSA9IFwibGFzdE5hbWVcIjtcbiAgRmllbGROYW1lMltcIkVNQUlMXCJdID0gXCJlbWFpbFwiO1xuICBGaWVsZE5hbWUyW1wiWklQX0NPREVcIl0gPSBcInppcENvZGVcIjtcbiAgRmllbGROYW1lMltcIkNJVFlcIl0gPSBcImNpdHlcIjtcbiAgRmllbGROYW1lMltcIlNUQVRFXCJdID0gXCJzdGF0ZVwiO1xuICBGaWVsZE5hbWUyW1wiQ09VTlRSWVwiXSA9IFwiY291bnRyeVwiO1xuICBGaWVsZE5hbWUyW1wiQUREUkVTU1wiXSA9IFwiYWRkcmVzc1wiO1xuICBGaWVsZE5hbWUyW1wiUEhPTkVcIl0gPSBcInBob25lXCI7XG4gIEZpZWxkTmFtZTJbXCJQUk9NT1RJT05fQ09ERVwiXSA9IFwicHJvbW90aW9uQ29kZVwiO1xuICByZXR1cm4gRmllbGROYW1lMjtcbn0pKEZpZWxkTmFtZSB8fCB7fSk7XG5jb25zdCBGaWVsZE5hbWVFbnVtID0gei5uYXRpdmVFbnVtKEZpZWxkTmFtZSk7XG52YXIgUHJpdmF0ZUZpZWxkTmFtZSA9IC8qIEBfX1BVUkVfXyAqLyAoKFByaXZhdGVGaWVsZE5hbWUyKSA9PiB7XG4gIFByaXZhdGVGaWVsZE5hbWUyW1wiQ0FSRF9OVU1CRVJcIl0gPSBcImNhcmROdW1iZXJcIjtcbiAgUHJpdmF0ZUZpZWxkTmFtZTJbXCJDQVJEX0VYUElSWVwiXSA9IFwiY2FyZEV4cGlyeVwiO1xuICBQcml2YXRlRmllbGROYW1lMltcIkNBUkRfQ1ZDXCJdID0gXCJjYXJkQ3ZjXCI7XG4gIHJldHVybiBQcml2YXRlRmllbGROYW1lMjtcbn0pKFByaXZhdGVGaWVsZE5hbWUgfHwge30pO1xuY29uc3QgUHJpdmF0ZUZpZWxkTmFtZUVudW0gPSB6Lm5hdGl2ZUVudW0oUHJpdmF0ZUZpZWxkTmFtZSk7XG5jb25zdCBBbGxGaWVsZE5hbWVzID0gei51bmlvbihbRmllbGROYW1lRW51bSwgUHJpdmF0ZUZpZWxkTmFtZUVudW1dKTtcbnZhciBFbGVtZW50VHlwZUVudW0gPSAvKiBAX19QVVJFX18gKi8gKChFbGVtZW50VHlwZUVudW0yKSA9PiB7XG4gIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEXCJdID0gXCJjYXJkXCI7XG4gIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEX05VTUJFUlwiXSA9IFwiY2FyZC1udW1iZXJcIjtcbiAgRWxlbWVudFR5cGVFbnVtMltcIkNBUkRfRVhQSVJZXCJdID0gXCJjYXJkLWV4cGlyeVwiO1xuICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRF9DVkNcIl0gPSBcImNhcmQtY3ZjXCI7XG4gIHJldHVybiBFbGVtZW50VHlwZUVudW0yO1xufSkoRWxlbWVudFR5cGVFbnVtIHx8IHt9KTtcbmNvbnN0IEVsZW1lbnRUeXBlID0gei5uYXRpdmVFbnVtKEVsZW1lbnRUeXBlRW51bSk7XG5jb25zdCBDaGVja291dFBheW1lbnRNZXRob2QkMSA9IHoub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHouc3RyaW5nKCksXG4gIHByb2Nlc3Nvcl9uYW1lOiBudWxsT3JVbmRlZk9yJDEoei5zdHJpbmcoKSksXG4gIG1ldGFkYXRhOiBudWxsT3JVbmRlZk9yJDEoei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkpXG59KTtcbmNvbnN0IFBheW1lbnRNZXRob2RNaW5pbWFsID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKVxufSk7XG56Lm9iamVjdCh7XG4gIGNhcmROdW1iZXI6IE9wdGlvbmFsU3RyaW5nLFxuICBleHBpcnk6IE9wdGlvbmFsU3RyaW5nLFxuICBjdmM6IE9wdGlvbmFsU3RyaW5nXG59KTtcbnoub2JqZWN0KHtcbiAgYmFja2dyb3VuZENvbG9yOiBPcHRpb25hbFN0cmluZyxcbiAgY29sb3I6IE9wdGlvbmFsU3RyaW5nLFxuICBmb250RmFtaWx5OiBPcHRpb25hbFN0cmluZyxcbiAgZm9udFNpemU6IE9wdGlvbmFsU3RyaW5nLFxuICBmb250V2VpZ2h0OiBPcHRpb25hbFN0cmluZyxcbiAgbWFyZ2luOiBPcHRpb25hbFN0cmluZyxcbiAgcGFkZGluZzogT3B0aW9uYWxTdHJpbmcsXG4gIGxldHRlclNwYWNpbmc6IE9wdGlvbmFsU3RyaW5nLFxuICBsaW5lSGVpZ2h0OiBPcHRpb25hbFN0cmluZ1xufSk7XG5jb25zdCBFdmVudFR5cGUgPSB6LmVudW0oW1xuICAvLyBFbGVtZW50IC0+IEZvcm1cbiAgXCJMQVlPVVRcIixcbiAgXCJMT0FERURcIixcbiAgXCJCTFVSXCIsXG4gIFwiRk9DVVNcIixcbiAgXCJDSEFOR0VcIixcbiAgXCJUT0tFTklaRV9TVEFSVEVEXCIsXG4gIFwiQ0hFQ0tPVVRfU1RBUlRFRFwiLFxuICBcIlBBWU1FTlRfRkxPV19TVEFSVEVEXCIsXG4gIFwiVE9LRU5JWkVfU1VDQ0VTU1wiLFxuICBcIkNIRUNLT1VUX1NVQ0NFU1NcIixcbiAgXCJMT0FEX0VSUk9SXCIsXG4gIFwiVkFMSURBVElPTl9FUlJPUlwiLFxuICBcIlRPS0VOSVpFX0VSUk9SXCIsXG4gIFwiQ0hFQ0tPVVRfRVJST1JcIixcbiAgXCJTRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTXCIsXG4gIC8vIEZvcm0gLT4gRWxlbWVudFxuICBcIlRPS0VOSVpFXCIsXG4gIFwiQ0hFQ0tPVVRcIixcbiAgXCJTVEFSVF9QQVlNRU5UX0ZMT1dcIlxuXSk7XG5jb25zdCBHZW5lcmljRXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiVE9LRU5JWkVfU1RBUlRFRFwiLCBcIkNIRUNLT1VUX1NUQVJURURcIl0pO1xuY29uc3QgR2VuZXJpY0V2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHsgdHlwZTogR2VuZXJpY0V2ZW50VHlwZSB9KTtcbmNvbnN0IElucHV0RXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiQkxVUlwiLCBcIkZPQ1VTXCIsIFwiQ0hBTkdFXCJdKTtcbmNvbnN0IElucHV0RXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBJbnB1dEV2ZW50VHlwZSxcbiAgZWxlbWVudFR5cGU6IFByaXZhdGVGaWVsZE5hbWVFbnVtLFxuICBlcnJvcnM6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKVxufSk7XG5jb25zdCBFcnJvckV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIkxPQURfRVJST1JcIiwgXCJUT0tFTklaRV9FUlJPUlwiLCBcIkNIRUNLT1VUX0VSUk9SXCJdKTtcbmNvbnN0IEVycm9yRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBFcnJvckV2ZW50VHlwZSxcbiAgbWVzc2FnZTogUmVxdWlyZWRTdHJpbmcsXG4gIGhlYWRlcnM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKClcbn0pO1xuY29uc3QgVmFsaWRhdGlvbkVycm9yRXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiVkFMSURBVElPTl9FUlJPUlwiXSk7XG5jb25zdCBWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IFZhbGlkYXRpb25FcnJvckV2ZW50VHlwZSxcbiAgZWxlbWVudFR5cGU6IEFsbEZpZWxkTmFtZXMsXG4gIGVycm9yczogei5hcnJheSh6LnN0cmluZygpKVxufSk7XG5jb25zdCBMYXlvdXRFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5MQVlPVVQpLFxuICBoZWlnaHQ6IFJlcXVpcmVkU3RyaW5nXG59KTtcbmNvbnN0IExvYWRlZEV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5saXRlcmFsKEV2ZW50VHlwZS5lbnVtLkxPQURFRCksXG4gIHNlc3Npb25JZDogUmVxdWlyZWRTdHJpbmcsXG4gIHRvdGFsQW1vdW50QXRvbXM6IHoubnVtYmVyKCksXG4gIGN1cnJlbmN5OiBPcHRpb25hbFN0cmluZyxcbiAgY2hlY2tvdXRQYXltZW50TWV0aG9kczogei5hcnJheShDaGVja291dFBheW1lbnRNZXRob2QkMSlcbn0pO1xuY29uc3QgUGF5bWVudEZsb3dTdGFydGVkRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uUEFZTUVOVF9GTE9XX1NUQVJURUQpLFxuICBuZXh0QWN0aW9uTWV0YWRhdGE6IHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpLFxuICBwYXltZW50Rmxvd01ldGFkYXRhOiB6LmFueSgpLm9wdGlvbmFsKCksXG4gIHN0YXJ0UEZNZXRhZGF0YTogei5vcHRpb25hbCh6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSlcbn0pO1xuY29uc3QgU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5TRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTKSxcbiAgcGF5bWVudE1ldGhvZElkOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IFJlcXVpcmVkRm9ybUZpZWxkcyA9IHoub2JqZWN0KHtcbiAgW1wiZmlyc3ROYW1lXCIgLyogRklSU1RfTkFNRSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJsYXN0TmFtZVwiIC8qIExBU1RfTkFNRSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJlbWFpbFwiIC8qIEVNQUlMICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcInppcENvZGVcIiAvKiBaSVBfQ09ERSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJjb3VudHJ5XCIgLyogQ09VTlRSWSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJwcm9tb3Rpb25Db2RlXCIgLyogUFJPTU9USU9OX0NPREUgKi9dOiBPcHRpb25hbFN0cmluZ1xufSk7XG5jb25zdCBQUkZvcm1GaWVsZHMgPSB6Lm9iamVjdCh7XG4gIFtcImVtYWlsXCIgLyogRU1BSUwgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wiemlwQ29kZVwiIC8qIFpJUF9DT0RFICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcImNvdW50cnlcIiAvKiBDT1VOVFJZICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcInByb21vdGlvbkNvZGVcIiAvKiBQUk9NT1RJT05fQ09ERSAqL106IE9wdGlvbmFsU3RyaW5nXG59KTtcbmNvbnN0IFN1Ym1pdEV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIlRPS0VOSVpFXCIsIFwiQ0hFQ0tPVVRcIiwgXCJTVEFSVF9QQVlNRU5UX0ZMT1dcIl0pO1xuY29uc3QgU3VibWl0RXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBTdWJtaXRFdmVudFR5cGUsXG4gIHNlc3Npb25JZDogUmVxdWlyZWRTdHJpbmcsXG4gIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gIHBheW1lbnRGbG93TWV0YWRhdGE6IHouYW55KCkub3B0aW9uYWwoKSxcbiAgZG9Ob3RVc2VMZWdhY3lDQ0Zsb3c6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGV4aXN0aW5nQ0NQTUlkOiBPcHRpb25hbFN0cmluZ1xufSkuZXh0ZW5kKFJlcXVpcmVkRm9ybUZpZWxkcy5zaGFwZSk7XG5jb25zdCBUb2tlbml6ZVN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5UT0tFTklaRV9TVUNDRVNTKSxcbiAgaXNSZWFkeUZvckNoZWNrb3V0OiB6LmJvb2xlYW4oKVxufSk7XG5jb25zdCBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5DSEVDS09VVF9TVUNDRVNTKSxcbiAgaW52b2ljZVVybHM6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gIHN1YnNjcmlwdGlvbklkczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgY3VzdG9tZXJJZDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBFdmVudFBheWxvYWQgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICBHZW5lcmljRXZlbnRQYXlsb2FkLFxuICBJbnB1dEV2ZW50UGF5bG9hZCxcbiAgRXJyb3JFdmVudFBheWxvYWQsXG4gIFZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCxcbiAgTGF5b3V0RXZlbnRQYXlsb2FkLFxuICBMb2FkZWRFdmVudFBheWxvYWQsXG4gIFN1Ym1pdEV2ZW50UGF5bG9hZCxcbiAgVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkLFxuICBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQsXG4gIFBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCxcbiAgU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWRcbl0pO1xuY29uc3QgRWxlbWVudEV2ZW50ID0gei5vYmplY3Qoe1xuICBwYXlsb2FkOiBFdmVudFBheWxvYWQsXG4gIG5vbmNlOiBSZXF1aXJlZFN0cmluZyxcbiAgZm9ybUlkOiBSZXF1aXJlZFN0cmluZyxcbiAgZWxlbWVudElkOiBSZXF1aXJlZFN0cmluZ1xufSk7XG56Lm9iamVjdCh7XG4gIGFtb3VudEF0b206IHoubnVtYmVyKCksXG4gIGN1cnJlbmN5OiBSZXF1aXJlZFN0cmluZ1xufSk7XG56Lm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogei5zdHJpbmcoKSxcbiAgcHJvbW90aW9uX2NvZGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKVxufSk7XG56Lm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogei5zdHJpbmcoKSxcbiAgZXhpc3RpbmdfY2NfcG1faWQ6IG51bGxPclVuZGVmT3IkMSh6LnN0cmluZygpKVxufSk7XG5jb25zdCBDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcGF5bWVudF9tZXRob2RzOiB6LmFycmF5KFBheW1lbnRNZXRob2RNaW5pbWFsKVxufSk7XG5jb25zdCBGaWVsZFZhbGlkYXRpb25FcnJvciA9IHoub2JqZWN0KHtcbiAgZWxlbWVudFR5cGU6IHouc3RyaW5nKCksXG4gIGVycm9yczogei5hcnJheSh6LnN0cmluZygpKVxufSk7XG56Lm9iamVjdCh7XG4gIHNlc3Npb25faWQ6IHouc3RyaW5nKClcbn0pO1xuY29uc3QgVG9rZW5pemVDYXJkRXJyb3JSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgc3VjY2Vzczogei5saXRlcmFsKGZhbHNlKSxcbiAgZXJyb3JfdHlwZTogei5saXRlcmFsKFwidmFsaWRhdGlvbl9lcnJvclwiKSxcbiAgZXJyb3JzOiB6LmFycmF5KEZpZWxkVmFsaWRhdGlvbkVycm9yKVxufSk7XG5jb25zdCBUb2tlbml6ZUNhcmRSZXNwb25zZSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwic3VjY2Vzc1wiLCBbXG4gIHoub2JqZWN0KHsgc3VjY2Vzczogei5saXRlcmFsKHRydWUpIH0pLFxuICBUb2tlbml6ZUNhcmRFcnJvclJlc3BvbnNlXG5dKTtcbnoub2JqZWN0KHtcbiAgc2Vzc2lvbl9pZDogei5zdHJpbmcoKSxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxLFxuICBub25fY2RlX2Zvcm1fZmllbGRzOiBSZXF1aXJlZEZvcm1GaWVsZHMsXG4gIGRvX25vdF91c2VfbGVnYWN5X2NjX2Zsb3c6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGV4aXN0aW5nX2NjX3BtX2lkOiBudWxsT3JVbmRlZk9yJDEoei5zdHJpbmcoKSlcbn0pO1xuei5vYmplY3Qoe1xuICBzZXNzaW9uX2lkOiB6LnN0cmluZygpLFxuICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gIG5vbl9jZGVfZm9ybV9maWVsZHM6IFJlcXVpcmVkRm9ybUZpZWxkc1xufSk7XG52YXIgVGhyZWVEU1N0YXR1cyA9IC8qIEBfX1BVUkVfXyAqLyAoKFRocmVlRFNTdGF0dXMyKSA9PiB7XG4gIFRocmVlRFNTdGF0dXMyW1wiU1VDQ0VTU1wiXSA9IFwic3VjY2Vzc1wiO1xuICBUaHJlZURTU3RhdHVzMltcIkZBSUxVUkVcIl0gPSBcImZhaWx1cmVcIjtcbiAgVGhyZWVEU1N0YXR1czJbXCJDQU5DRUxMRURcIl0gPSBcImNhbmNlbGxlZFwiO1xuICByZXR1cm4gVGhyZWVEU1N0YXR1czI7XG59KShUaHJlZURTU3RhdHVzIHx8IHt9KTtcbmNvbnN0IFBpbmczRFNTdGF0dXNSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LmVudW0oW1wic3VjY2Vzc1wiIC8qIFNVQ0NFU1MgKi8sIFwiZmFpbHVyZVwiIC8qIEZBSUxVUkUgKi8sIFwiY2FuY2VsbGVkXCIgLyogQ0FOQ0VMTEVEICovXSlcbn0pO1xuY29uc3QgQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LnN0cmluZygpLFxuICByZWRpcmVjdF91cmw6IHouc3RyaW5nKCksXG4gIGluaXRpYWxfaW50ZW50X2lkOiB6LnN0cmluZygpLFxuICBjb25zZW50X2lkOiB6LnN0cmluZygpXG59KTtcblxuY29uc3QgZXh0cmFjdElzc3Vlc1BlckZpZWxkID0gKGVycm9yKSA9PiB7XG4gIGNvbnN0IGlzc3Vlc1BlckZpZWxkID0ge307XG4gIE9iamVjdC5lbnRyaWVzKGVycm9yKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gRmllbGROYW1lRW51bS5wYXJzZShrZXkpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGlzc3Vlc1BlckZpZWxkW2ZpZWxkTmFtZV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5fZXJyb3JzKSkge1xuICAgICAgICBpc3N1ZXNQZXJGaWVsZFtmaWVsZE5hbWVdID0gdmFsdWUuX2Vycm9ycztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gaXNzdWVzUGVyRmllbGQ7XG59O1xuXG5jb25zdCBTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSB6Lm9iamVjdCh7XG4gIHN0cmlwZV9wazogei5zdHJpbmcoKSxcbiAgY2xpZW50X3NlY3JldDogei5zdHJpbmcoKSxcbiAgc3RyaXBlX3BtX2lkOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IFBheW1lbnRSZXF1ZXN0TmV4dEFjdGlvbk1ldGFkYXRhID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LnN0cmluZygpLFxuICBjbGllbnRfc2VjcmV0OiB6LnN0cmluZygpLFxuICBzdHJpcGVfcGs6IHouc3RyaW5nKClcbn0pO1xuY29uc3Qgb3VyQ3VycmVuY3lUb1RoZWlycyA9IHtcbiAgdXNkOiBcInVzZFwiLFxuICBicmw6IFwiYnJsXCJcbn07XG5jb25zdCBnZXRMb2FkZWRTdHJpcGUgPSBhc3luYyAocHVibGlzaGFibGVLZXkpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgaWYgKCFpc1N0cmlwZUpzUHJlc2VudCgpKSB7XG4gICAgICBhd2FpdCBzbGVlcCg1MDApO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU3RyaXBlSnNQcmVzZW50KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFN0cmlwZSBKUyBub3QgZm91bmQuYCk7XG4gIH1cbiAgY29uc3Qgc3RyaXBlID0gbmV3IFN0cmlwZShwdWJsaXNoYWJsZUtleSk7XG4gIHJldHVybiBzdHJpcGU7XG59O1xuY29uc3QgY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QgPSBhc3luYyAoc3RyaXBlUHViS2V5LCB0b3RhbEFtb3VudEF0b20sIGN1cnJlbmN5LCBpc0Ftb3VudFBlbmRpbmcsIGlzTGlua09ubHkpID0+IHtcbiAgY29uc3Qgc3RyaXBlID0gYXdhaXQgZ2V0TG9hZGVkU3RyaXBlKHN0cmlwZVB1YktleSk7XG4gIGNvbnN0IHN0cmlwZUN1cnJlbmN5ID0gb3VyQ3VycmVuY3lUb1RoZWlyc1tjdXJyZW5jeS50b0xvd2VyQ2FzZSgpLnRyaW0oKV07XG4gIGNvbnN0IHBheW1lbnRSZXF1ZXN0ID0gc3RyaXBlLnBheW1lbnRSZXF1ZXN0KHtcbiAgICAvLyBUT0RPOiByZXBsYWNlIHRoaXMgd2l0aCBzdHJpcGUgYWNjb3VudCBjb3VudHJ5IGFzIHNvb24gYXMgd2Ugc3VwcG9ydCBpdFxuICAgIGNvdW50cnk6IFwiVVNcIixcbiAgICBjdXJyZW5jeTogc3RyaXBlQ3VycmVuY3ksXG4gICAgdG90YWw6IHtcbiAgICAgIGxhYmVsOiBcIlRvdGFsXCIsXG4gICAgICBhbW91bnQ6IHRvdGFsQW1vdW50QXRvbSxcbiAgICAgIHBlbmRpbmc6IGlzQW1vdW50UGVuZGluZ1xuICAgIH0sXG4gICAgcmVxdWVzdFBheWVyTmFtZTogdHJ1ZSxcbiAgICByZXF1ZXN0UGF5ZXJFbWFpbDogdHJ1ZSxcbiAgICBkaXNhYmxlV2FsbGV0czogW10gXG4gIH0pO1xuICByZXR1cm4gcGF5bWVudFJlcXVlc3Q7XG59O1xuY29uc3Qgc2xlZXAgPSAodGltZW91dE1zKSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dE1zKTtcbiAgfSk7XG59O1xuY29uc3QgaXNTdHJpcGVKc1ByZXNlbnQgPSAoKSA9PiB7XG4gIHJldHVybiBcIlN0cmlwZVwiIGluIHdpbmRvdztcbn07XG5jb25zdCB3YWl0Rm9yVXNlclRvQWRkUGF5bWVudE1ldGhvZCA9IGFzeW5jIChwYXltZW50UmVxdWVzdCkgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBwYXltZW50UmVxdWVzdC5vbihcInBheW1lbnRtZXRob2RcIiwgYXN5bmMgKGV2dCkgPT4ge1xuICAgICAgICByZXNvbHZlKGV2dCk7XG4gICAgICB9KTtcbiAgICAgIHBheW1lbnRSZXF1ZXN0Lm9uKFwiY2FuY2VsXCIsICgpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgUGF5bWVudCBjYW5jZWxsZWQsIHBsZWFzZSBjbGljayBTdWJtaXQgYWdhaW4gdG8gcGF5YCkpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVqZWN0KGUpO1xuICAgIH1cbiAgfSk7XG59O1xuY29uc3QgY29uZmlybVN0cmlwZVByUE0gPSBhc3luYyAobmV4dEFjdGlvbk1ldGFkYXRhLCBzdHJpcGVQbSkgPT4ge1xuICBpZiAoIW5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcGsgfHwgIW5leHRBY3Rpb25NZXRhZGF0YS5jbGllbnRfc2VjcmV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG5leHQgYWN0aW9uIG1ldGFkYXRhIGZvcm1hdDogJHtKU09OLnN0cmluZ2lmeShuZXh0QWN0aW9uTWV0YWRhdGEpfWApO1xuICB9XG4gIGNvbnN0IHN0cmlwZSA9IGF3YWl0IGdldExvYWRlZFN0cmlwZShuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrKTtcbiAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IHN0cmlwZS5jb25maXJtQ2FyZFNldHVwKG5leHRBY3Rpb25NZXRhZGF0YS5jbGllbnRfc2VjcmV0LCB7XG4gICAgcGF5bWVudF9tZXRob2Q6IHN0cmlwZVBtLnBheW1lbnRNZXRob2QuaWRcbiAgfSk7XG4gIGlmIChjb25maXJtUmVzdWx0LmVycm9yKSB7XG4gICAgc3RyaXBlUG0uY29tcGxldGUoXCJmYWlsXCIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgUGF5bWVudCBmYWlsZWQ6ICR7Y29uZmlybVJlc3VsdC5lcnJvci5tZXNzYWdlID8/IGB1bmtub3duYH1gKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJpcGVQbS5jb21wbGV0ZShcInN1Y2Nlc3NcIik7XG4gIH1cbn07XG5jb25zdCBsYXVuY2hTdHJpcGUzRFNEaWFsb2dGbG93ID0gYXN5bmMgKG5leHRBY3Rpb25NZXRhZGF0YSkgPT4ge1xuICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUobmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wayk7XG4gIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBzdHJpcGUuY29uZmlybUNhcmRTZXR1cChuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCwge1xuICAgIHBheW1lbnRfbWV0aG9kOiBuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BtX2lkXG4gIH0pO1xuICBjb25zdCByZXN1bHRTdGF0dXMgPSBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50Py5zdGF0dXM7XG4gIGlmIChyZXN1bHRTdGF0dXMgPT09IFwic3VjY2VlZGVkXCIpIDsgZWxzZSBpZiAocmVzdWx0U3RhdHVzID09PSBcImNhbmNlbGVkXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBheW1lbnQgY2FuY2VsbGVkLCBwbGVhc2UgY2xpY2sgU3VibWl0IGFnYWluIHRvIHBheWApO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2NvbmZpcm1SZXN1bHQuZXJyb3I/Lm1lc3NhZ2UgPz8gY29uZmlybVJlc3VsdC5zZXR1cEludGVudD8ubGFzdF9zZXR1cF9lcnJvcj8ubWVzc2FnZSA/PyBcIlBheW1lbnQgZmFpbGVkLCBwbGVhc2UgY2xpY2sgc3VibWl0IGFnYWluIHRvIHBheS5cIn1gXG4gICAgKTtcbiAgfVxufTtcblxuY29uc3QgY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmcgPSAoc3R5bGVzKSA9PiB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRTdHlsZXMgPSBKU09OLnN0cmluZ2lmeShzdHlsZXMpO1xuICByZXR1cm4gc2VyaWFsaXplZFN0eWxlcztcbn07XG5cbmNvbnN0IGNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybSA9IChmb3JtRGl2LCBpbml0aWFsRGljdCkgPT4ge1xuICBjb25zdCBpbmNsdWRlZElucHV0cyA9IEFycmF5LmZyb20oZm9ybURpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtb3BpZF1cIikgPz8gW10pO1xuICBjb25zdCBleHRyYURhdGEgPSBpbmNsdWRlZElucHV0cy5yZWR1Y2UoKGFjYywgaW5wdXQpID0+IHtcbiAgICBjb25zdCBrZXkgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW9waWRcIik7XG4gICAgaWYgKCFrZXkpIHJldHVybiBhY2M7XG4gICAgcmV0dXJuIHsgLi4uYWNjLCBba2V5XTogaW5wdXQudmFsdWUgfTtcbiAgfSwge30pO1xuICByZXR1cm4gZXh0cmFEYXRhO1xufTtcbmNvbnN0IHBhcnNlRXZlbnRQYXlsb2FkID0gKGV2ZW50RGF0YSkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBFbGVtZW50RXZlbnQucGFyc2UoZXZlbnREYXRhKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbmNvbnN0IGVtaXRFdmVudCA9ICh0YXJnZXQsIGZvcm1JZCwgZWxlbWVudElkLCBwYXlsb2FkLCBiYXNlVXJsKSA9PiB7XG4gIGNvbnN0IGV2ZW50ID0ge1xuICAgIHBheWxvYWQsXG4gICAgbm9uY2U6IHY0KCksXG4gICAgZm9ybUlkLFxuICAgIGVsZW1lbnRJZFxuICB9O1xuICB0YXJnZXQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZXZlbnQpLCBiYXNlVXJsKTtcbn07XG5cbmNvbnN0IGNoZWNrSWZWYWxpZENkZUNvbm5lY3Rpb25PYmplY3QgPSBhc3luYyAob2JqKSA9PiB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8ICFvYmopIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaW5nID0geyB0eXBlOiBcInBpbmdcIiB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9iai5zZW5kKHBpbmcpO1xuICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJ3RydWUnIGFmdGVyIHBpbmcsIGdvdCAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuY29uc3QgaXNSZXN1bHRWYWxpZCA9IChvYmosIGlzVmFsaWQpID0+IHtcbiAgcmV0dXJuICEhb2JqICYmIGlzVmFsaWQ7XG59O1xuXG5jb25zdCBudWxsT3JVbmRlZk9yID0gKHpUeXBlKSA9PiB6Lm51bGxhYmxlKHpUeXBlLm9wdGlvbmFsKCkpO1xuei5zdHJpbmcoKS50cmltKCkubWluKDEsIHsgbWVzc2FnZTogYENhbm5vdCBiZSBibGFua2AgfSk7XG5jb25zdCBDREVSZXNwb25zZUVycm9yID0gei5vYmplY3Qoe1xuICBjZGVfcmVzcG9uc2VfdHlwZTogei5saXRlcmFsKFwiZXJyb3JcIiksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCksXG4gIGhlYWRlcnM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKClcbn0pO1xuY29uc3QgQ3VycmVuY3lFbnVtID0gei5lbnVtKFtcInVzZFwiLCBcImJybFwiXSk7XG5jb25zdCBDb3Vwb25NaW5pbWFsID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLFxuICBhbW91bnRfYXRvbV9vZmY6IG51bGxPclVuZGVmT3Ioei5udW1iZXIoKSksXG4gIHBlcmNlbnRfb2ZmOiBudWxsT3JVbmRlZk9yKHoubnVtYmVyKCkpLFxuICBjdXJyZW5jeTogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgZHVyYXRpb246IHouc3RyaW5nKCksXG4gIGR1cmF0aW9uX2luX21vbnRoczogbnVsbE9yVW5kZWZPcih6Lm51bWJlcigpKVxufSk7XG5jb25zdCBMaW5lSXRlbSA9IHoub2JqZWN0KHtcbiAgYW1vdW50X3N1YnRvdGFsX2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGFtb3VudF90b3RhbF9hdG9tOiB6Lm51bWJlcigpLmludCgpLFxuICBjdXJyZW5jeTogei5zdHJpbmcoKSxcbiAgZGVzY3JpcHRpb246IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIHByaWNlX2lkOiB6LnN0cmluZygpLFxuICBiaWxsaW5nX2ludGVydmFsOiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICBiaWxsaW5nX2ludGVydmFsX2NvdW50OiBudWxsT3JVbmRlZk9yKHoubnVtYmVyKCkuaW50KCkpLFxuICBxdWFudGl0eTogei5udW1iZXIoKS5pbnQoKVxufSk7XG5jb25zdCBCcmFuZFNldHRpbmdzID0gei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSk7XG5jb25zdCBCcmFuZCA9IHoub2JqZWN0KHtcbiAgbmFtZTogei5zdHJpbmcoKSxcbiAgc2V0dGluZ3M6IG51bGxPclVuZGVmT3IoQnJhbmRTZXR0aW5ncylcbn0pO1xuY29uc3QgQ2hlY2tvdXRQYXltZW50TWV0aG9kID0gei5vYmplY3Qoe1xuICBwcm92aWRlcjogei5zdHJpbmcoKSxcbiAgcHJvY2Vzc29yX25hbWU6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIG1ldGFkYXRhOiBudWxsT3JVbmRlZk9yKHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKVxufSk7XG5jb25zdCBTdWJzY3JpcHRpb25JdGVtTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgcXVhbnRpdHk6IHoubnVtYmVyKClcbn0pO1xuY29uc3QgU3Vic2NyaXB0aW9uTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgaWQ6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGJpbGxpbmdfaW50ZXJ2YWw6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGJpbGxpbmdfaW50ZXJ2YWxfY291bnQ6IG51bGxPclVuZGVmT3Ioei5udW1iZXIoKS5pbnQoKSksXG4gIHN1YnNjcmlwdGlvbl9pdGVtczogei5hcnJheShTdWJzY3JpcHRpb25JdGVtTWluaW1hbCksXG4gIHRyaWFsX3N0YXJ0OiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICB0cmlhbF9lbmQ6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSlcbn0pO1xuY29uc3QgSW52b2ljZUl0ZW1EaXNjb3VudEFtb3VudHNNaW5pbWFsID0gei5vYmplY3Qoe1xuICBhbW91bnRfYXRvbTogei5udW1iZXIoKVxufSk7XG5jb25zdCBJbnZvaWNlTGluZUl0ZW1NaW5pbWFsID0gei5vYmplY3Qoe1xuICBhbW91bnRfYXRvbTogei5udW1iZXIoKSxcbiAgYW1vdW50X2F0b21fY29uc2lkZXJpbmdfZGlzY291bnRfYXBwbGllZDogei5udW1iZXIoKSxcbiAgY3VycmVuY3k6IHouc3RyaW5nKCksXG4gIGRpc2NvdW50X2Ftb3VudF9hdG9tczogei5hcnJheShJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwpLFxuICBzdWJzY3JpcHRpb25faXRlbV9pZDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBEaXNjb3VudE1pbmltYWwgPSB6Lm9iamVjdCh7XG4gIGNvdXBvbjogQ291cG9uTWluaW1hbFxufSk7XG5jb25zdCBJbnZvaWNlTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgY3VycmVuY3k6IHouc3RyaW5nKCksXG4gIGRpc2NvdW50czogei5hcnJheShEaXNjb3VudE1pbmltYWwpLFxuICBob3N0ZWRfaW52b2ljZV91cmw6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGxpbmVzOiB6LmFycmF5KEludm9pY2VMaW5lSXRlbU1pbmltYWwpLFxuICByZW1haW5pbmdfYW1vdW50X2F0b206IHoubnVtYmVyKCksXG4gIHRheF9hbW91bnRfYXRvbTogei5udW1iZXIoKSxcbiAgdG90YWxfYW1vdW50X2F0b206IHoubnVtYmVyKCksXG4gIHRvdGFsX2Rpc2NvdW50X2Ftb3VudF9hdG9tczogei5hcnJheShJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwpXG59KTtcbmNvbnN0IENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgY3JlYXRlZDogei5hcnJheShTdWJzY3JpcHRpb25NaW5pbWFsKSxcbiAgaW52b2ljZXM6IHouYXJyYXkoSW52b2ljZU1pbmltYWwpXG59KTtcbmNvbnN0IFByZXZpZXdDaGVja291dFJlc3BvbnNlID0gei5vYmplY3Qoe1xuICBwcmV2aWV3OiBDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwsXG4gIHByZXZpZXdfcG9zdF90cmlhbDogbnVsbE9yVW5kZWZPcihDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwpLFxuICBjb3Vwb25zOiB6LmFycmF5KENvdXBvbk1pbmltYWwpXG59KTtcbmNvbnN0IF9QYXltZW50Rm9ybVByZWZpbGxDb21tb24gPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5saXRlcmFsKFwib3BlblwiKSxcbiAgdG9rZW46IHouc3RyaW5nKCksXG4gIGVtYWlsOiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICBsaW5lX2l0ZW1zOiB6LmFycmF5KExpbmVJdGVtKSxcbiAgYW1vdW50X3N1YnRvdGFsX2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGFtb3VudF90b3RhbF9hdG9tOiB6Lm51bWJlcigpLmludCgpLFxuICBicmFuZDogQnJhbmQsXG4gIHN1YnNfcHJldmlldzogbnVsbE9yVW5kZWZPcihQcmV2aWV3Q2hlY2tvdXRSZXNwb25zZSksXG4gIC8vIE51bGwgaW4gc2V0dXAgbW9kZVxuICBtZXRob2RzX2F2YWlsYWJsZTogei5hcnJheShDaGVja291dFBheW1lbnRNZXRob2QpXG59KTtcbmNvbnN0IFBheW1lbnRGb3JtUHJlZmlsbCA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwibW9kZVwiLCBbXG4gIHoub2JqZWN0KHtcbiAgICBtb2RlOiB6LmxpdGVyYWwoXCJzZXR1cFwiKSxcbiAgICBjdXJyZW5jeTogei5udWxsYWJsZSh6LnVuZGVmaW5lZCgpKVxuICB9KS5leHRlbmQoX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbi5zaGFwZSksXG4gIHoub2JqZWN0KHtcbiAgICBtb2RlOiB6LmVudW0oW1wicGF5bWVudFwiLCBcInN1YnNjcmlwdGlvblwiXSksXG4gICAgY3VycmVuY3k6IEN1cnJlbmN5RW51bVxuICB9KS5leHRlbmQoX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbi5zaGFwZSlcbl0pO1xuY29uc3QgQ29tcGxldGVkRm9ybVByZWZpbGwgPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5saXRlcmFsKFwiY29tcGxldGVcIilcbn0pO1xuY29uc3QgRXhwaXJlZEZvcm1QcmVmaWxsID0gei5vYmplY3Qoe1xuICBzdGF0dXM6IHoubGl0ZXJhbChcImV4cGlyZWRcIilcbn0pO1xuei51bmlvbihbUGF5bWVudEZvcm1QcmVmaWxsLCBDb21wbGV0ZWRGb3JtUHJlZmlsbCwgRXhwaXJlZEZvcm1QcmVmaWxsXSk7XG56Lm9iamVjdCh7XG4gIGxvZ286IHouc3RyaW5nKCksXG4gIGljb246IHouc3RyaW5nKCksXG4gIHByaW1hcnlfY29sb3I6IHouc3RyaW5nKCksXG4gIHNlY29uZGFyeV9jb2xvcjogei5zdHJpbmcoKVxufSk7XG5jb25zdCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgaW52b2ljZV91cmxzOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBzdWJzY3JpcHRpb25faWRzOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBjdXN0b21lcl9pZDogei5zdHJpbmcoKVxufSk7XG56Lm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogei5zdHJpbmcoKSxcbiAgcGF5bWVudF9pbnB1dDogei5hbnkoKSxcbiAgLy8gU2hvdWxkIGZvbGxvdyBBbnlQYXltZW50SW5wdXQgZnJvbSBDREVcbiAgY3VzdG9tZXJfZW1haWw6IHouc3RyaW5nKCksXG4gIGN1c3RvbWVyX3ppcF9jb2RlOiB6LnN0cmluZygpLFxuICBjdXN0b21lcl9jb3VudHJ5OiB6LnN0cmluZygpLFxuICBsaW5lX2l0ZW1zOiB6LmFycmF5KExpbmVJdGVtKSxcbiAgdG90YWxfYW1vdW50X2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGNhbmNlbF9hdF9lbmQ6IHouYm9vbGVhbigpLFxuICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICBwcm9tb3Rpb25fY29kZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpXG59KTtcbmNvbnN0IFNldHVwQ2hlY2tvdXRSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcGF5bWVudF9tZXRob2RfaWQ6IHouc3RyaW5nKClcbn0pO1xuei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgcmV0dXJuX3VybDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5zdHJpbmcoKSxcbiAgbG9jOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBtc2c6IHouc3RyaW5nKCksXG4gIHVybDogei5zdHJpbmcoKVxufSk7XG56LmFycmF5KFB5ZGFudGljVmFsaWRhdGlvbkVycm9yKTtcbmNvbnN0IFN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcmVxdWlyZWRfdXNlcl9hY3Rpb25zOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKVxufSk7XG56Lm9iamVjdCh7XG4gIGZpZWxkczogUFJGb3JtRmllbGRzLFxuICBjaGVja291dFBheW1lbnRNZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZFxufSk7XG56Lm9iamVjdCh7XG4gIHNlc3Npb25faWQ6IHouc3RyaW5nKCksXG4gIG5vbl9jZGVfZm9ybV9maWVsZHM6IFJlcXVpcmVkRm9ybUZpZWxkcyxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZFxufSk7XG5jb25zdCBTdGFydFBheW1lbnRGbG93Rm9yQ0NSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcmVxdWlyZWRfdXNlcl9hY3Rpb25zOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKSxcbiAgY2NfcG1faWQ6IHouc3RyaW5nKClcbn0pO1xuei5yZWNvcmQoei5hbnkoKSk7XG5cbmNvbnN0IHN1bSA9IChhcnIpID0+IHtcbiAgcmV0dXJuIGFyci5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbn07XG5cbmZ1bmN0aW9uIGZpeFByb3RvKHRhcmdldCwgcHJvdG90eXBlKSB7XG4gIHZhciBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiAgc2V0UHJvdG90eXBlT2YgPyBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvdHlwZSkgOiB0YXJnZXQuX19wcm90b19fID0gcHJvdG90eXBlO1xufVxuZnVuY3Rpb24gZml4U3RhY2sodGFyZ2V0LCBmbikge1xuICBpZiAoZm4gPT09IHZvaWQgMCkge1xuICAgIGZuID0gdGFyZ2V0LmNvbnN0cnVjdG9yO1xuICB9XG5cbiAgdmFyIGNhcHR1cmVTdGFja1RyYWNlID0gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U7XG4gIGNhcHR1cmVTdGFja1RyYWNlICYmIGNhcHR1cmVTdGFja1RyYWNlKHRhcmdldCwgZm4pO1xufVxuXG52YXIgX19leHRlbmRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICBfX3Byb3RvX186IFtdXG4gICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuXG4gICAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgICBmdW5jdGlvbiBfXygpIHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgIH1cblxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbn0oKTtcblxudmFyIEN1c3RvbUVycm9yID0gZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoQ3VzdG9tRXJyb3IsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gQ3VzdG9tRXJyb3IobWVzc2FnZSwgb3B0aW9ucykge1xuICAgIHZhciBfbmV3VGFyZ2V0ID0gdGhpcy5jb25zdHJ1Y3RvcjtcblxuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UsIG9wdGlvbnMpIHx8IHRoaXM7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX3RoaXMsICduYW1lJywge1xuICAgICAgdmFsdWU6IF9uZXdUYXJnZXQubmFtZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgZml4UHJvdG8oX3RoaXMsIF9uZXdUYXJnZXQucHJvdG90eXBlKTtcbiAgICBmaXhTdGFjayhfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIEN1c3RvbUVycm9yO1xufShFcnJvcik7XG5cbmNsYXNzIENkZUVycm9yIGV4dGVuZHMgQ3VzdG9tRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xuICAgIGNvbnN0IGZyaWVuZGx5TWVzc2FnZSA9IGBbY2RlLWNsaWVudF0gRXJyb3IgcXVlcnlpbmcgQ0RFOiAke3Jlc3BvbnNlLm1lc3NhZ2V9YDtcbiAgICBzdXBlcihmcmllbmRseU1lc3NhZ2UpO1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgfVxuICBnZXQgb3JpZ2luYWxFcnJvck1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2UubWVzc2FnZTtcbiAgfVxufVxuY29uc3QgcXVlcnlDREUgPSBhc3luYyAoY2RlQ29ubiwgZGF0YSwgcmVzcG9uc2VTY2hlbWEpID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjZGVDb25uLnNlbmQoZGF0YSk7XG4gIGlmIChpc0NERVJlc3BvbnNlRXJyb3IocmVzcG9uc2UpKSB7XG4gICAgdGhyb3cgbmV3IENkZUVycm9yKHJlc3BvbnNlKTtcbiAgfVxuICBpZiAoIWNoZWNrSWZDb25mb3Jtc1RvU2NoZW1hKHJlc3BvbnNlLCByZXNwb25zZVNjaGVtYSkpIHtcbiAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UocmVzcG9uc2UpO1xuICAgIGlmIChyZXN1bHQuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdGF0ZVwiKTtcbiAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlO1xufTtcbmNvbnN0IGNoZWNrSWZDb25mb3Jtc1RvU2NoZW1hID0gKHZhbHVlLCBzY2hlbWEpID0+IHtcbiAgcmV0dXJuIHNjaGVtYS5zYWZlUGFyc2UodmFsdWUpLnN1Y2Nlc3M7XG59O1xuY29uc3QgaXNDREVSZXNwb25zZUVycm9yID0gKHJlc3BvbnNlKSA9PiB7XG4gIHJldHVybiBDREVSZXNwb25zZUVycm9yLnNhZmVQYXJzZShyZXNwb25zZSkuc3VjY2Vzcztcbn07XG5jb25zdCBnZXRDaGVja291dFByZXZpZXcgPSBhc3luYyAoY2RlQ29ubiwgcmVxdWVzdCkgPT4ge1xuICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcImdldF9jaGVja291dF9wcmV2aWV3XCIsIHBheWxvYWQ6IHJlcXVlc3QgfSwgUHJldmlld0NoZWNrb3V0UmVzcG9uc2UpO1xufTtcbmNvbnN0IGdldFByZWZpbGwgPSBhc3luYyAoY2RlQ29ubikgPT4ge1xuICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcImdldF9wcmVmaWxsXCIsIHBheWxvYWQ6IHt9IH0sIFBheW1lbnRGb3JtUHJlZmlsbCk7XG59O1xuY29uc3Qgc3RhcnRQYXltZW50Rmxvd0ZvckNDID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJzdGFydF9wYXltZW50X2Zsb3dfZm9yX2NjXCIsIHBheWxvYWQgfSwgU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UpO1xufTtcbmNvbnN0IHN0YXJ0UGF5bWVudEZsb3dGb3JQUiA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic3RhcnRfcGF5bWVudF9mbG93X2Zvcl9wclwiLCBwYXlsb2FkIH0sIFN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG59O1xuY29uc3QgY29uZmlybVBheW1lbnRGbG93ID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJjb25maXJtX3BheW1lbnRfZmxvd1wiLCBwYXlsb2FkIH0sIENvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKTtcbn07XG5jb25zdCBnZXRDaGVja291dFZhbHVlID0gYXN5bmMgKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBwcm9tb0NvZGUpID0+IHtcbiAgY29uc3QgY2hlY2tvdXRQcmV2aWV3ID0gYXdhaXQgZ2V0Q2hlY2tvdXRQcmV2aWV3KGNkZUNvbm4sIHtcbiAgICBzZWN1cmVfdG9rZW46IHNlY3VyZVRva2VuLFxuICAgIHByb21vdGlvbl9jb2RlOiBwcm9tb0NvZGVcbiAgfSk7XG4gIGNvbnN0IGN1cnJlbmNpZXMgPSBuZXcgU2V0KGNoZWNrb3V0UHJldmlldy5wcmV2aWV3Lmludm9pY2VzLm1hcCgoaW52KSA9PiBpbnYuY3VycmVuY3kpKTtcbiAgaWYgKGN1cnJlbmNpZXMuc2l6ZSAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSBvbmUgY3VycmVuY3ksIGdvdCAke2N1cnJlbmNpZXMuc2l6ZX1gKTtcbiAgfVxuICBjb25zdCBjdXJyZW5jeSA9IGN1cnJlbmNpZXMudmFsdWVzKCkubmV4dCgpLnZhbHVlID8/IFwidXNkXCI7XG4gIGNvbnN0IGFtb3VudEF0b20gPSBzdW0oY2hlY2tvdXRQcmV2aWV3LnByZXZpZXcuaW52b2ljZXMubWFwKChpbnYpID0+IGludi5yZW1haW5pbmdfYW1vdW50X2F0b20pKTtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW5jeSxcbiAgICBhbW91bnRBdG9tXG4gIH07XG59O1xuY29uc3QgZ2V0Q2hlY2tvdXRQcmV2aWV3QW1vdW50ID0gYXN5bmMgKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBpc1NldHVwTW9kZSwgcHJvbW9Db2RlKSA9PiB7XG4gIGlmIChpc1NldHVwTW9kZSkge1xuICAgIHJldHVybiB7IGFtb3VudEF0b206IDAsIGN1cnJlbmN5OiBcInVzZFwiIH07XG4gIH0gZWxzZSB7XG4gICAgcHJvbW9Db2RlID0gIXByb21vQ29kZSA/IHZvaWQgMCA6IHByb21vQ29kZTtcbiAgICBjb25zdCBjaGVja291dFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFZhbHVlKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBwcm9tb0NvZGUpO1xuICAgIHJldHVybiB7IGFtb3VudEF0b206IGNoZWNrb3V0UHJldmlldy5hbW91bnRBdG9tLCBjdXJyZW5jeTogY2hlY2tvdXRQcmV2aWV3LmN1cnJlbmN5IH07XG4gIH1cbn07XG5jb25zdCB0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zID0gYXN5bmMgKGFsbENkZUNvbm5lY3Rpb25zLCBwYXlsb2FkKSA9PiB7XG4gIGlmIChhbGxDZGVDb25uZWN0aW9ucy5zaXplID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQ0RFIGNvbm5lY3Rpb25zIGZvdW5kXCIpO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIEFycmF5LmZyb20oYWxsQ2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpLm1hcChcbiAgICAgIChjZGVDb25uKSA9PiBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwidG9rZW5pemVfY2FyZFwiLCBwYXlsb2FkIH0sIFRva2VuaXplQ2FyZFJlc3BvbnNlKVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHJlc3BvbnNlcztcbn07XG5jb25zdCBjaGVja291dENhcmRFbGVtZW50cyA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJjaGVja291dF9jYXJkX2VsZW1lbnRzXCIsIHBheWxvYWQgfSwgQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuY29uc3Qgc2V0dXBDaGVja291dCA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic2V0dXBfcGF5bWVudF9tZXRob2RcIiwgcGF5bG9hZCB9LCBTZXR1cENoZWNrb3V0UmVzcG9uc2UpO1xufTtcbmNvbnN0IHBlcmZvcm1DaGVja291dCA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiY2hlY2tvdXRcIiwgcGF5bG9hZCB9LCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSk7XG59O1xuY29uc3QgQ0RFX1BPTExJTkdfSU5URVJWQUwgPSAxZTM7XG5jb25zdCBwaW5nQ2RlRm9yM2RzU3RhdHVzID0gYXN5bmMgKGlmcmFtZSwgY2hpbGRPcmlnaW4pID0+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3RUb0NoaWxkKHtcbiAgICBpZnJhbWUsXG4gICAgZGVidWc6IHRydWUsXG4gICAgdGltZW91dDogQ0RFX1BPTExJTkdfSU5URVJWQUwsXG4gICAgY2hpbGRPcmlnaW5cbiAgfSk7XG4gIGNvbnN0IGNvbm5lY3Rpb25PYmogPSBhd2FpdCBjb25uZWN0aW9uLnByb21pc2U7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5Q0RFKGNvbm5lY3Rpb25PYmosIHsgdHlwZTogXCJwaW5nLTNkcy1zdGF0dXNcIiB9LCBQaW5nM0RTU3RhdHVzUmVzcG9uc2UpO1xuICByZXR1cm4gcmVzdWx0LnN0YXR1cztcbn07XG5cbmNvbnN0IHN0eWxlcyQyID0gXCJAa2V5ZnJhbWVzIGZhZGVJbnswJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlKC45KX10b3tvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlKDEpfX0ub3ZlcmxheXtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt6LWluZGV4OjIxNDc0ODM2NDghaW1wb3J0YW50O2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA4MH0uY29udGFpbmVye21heC13aWR0aDo1MDBweDttYXgtaGVpZ2h0OjYwMHB4O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZC1jb2xvcjojZmZmO3Bvc2l0aW9uOnJlbGF0aXZlO2FuaW1hdGlvbjpmYWRlSW4gLjNzIGVhc2Utb3V0fS5mcmFtZXttYXgtd2lkdGg6NTAwcHg7bWF4LWhlaWdodDo2MDBweDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjpub25lfS5jYW5jZWwtYnV0dG9ue3Bvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjFyZW07Y29sb3I6I2ZmZjtjdXJzb3I6cG9pbnRlcjt0b3A6LTEuNXJlbTtwYWRkaW5nOjA7cmlnaHQ6MH1cIjtcblxuY29uc3QgY3JlYXRlQW5kT3BlbkZyYW1lID0gKHVybCkgPT4ge1xuICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgdGVtcGxhdGUuaW5uZXJIVE1MID0gYFxuICAgIDxzdHlsZT5cbiAgICAgICR7c3R5bGVzJDJ9XG4gICAgPC9zdHlsZT5cbiAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8aWZyYW1lIHNyYz1cIiR7dXJsfVwiIGNsYXNzPVwiZnJhbWVcIiBpZD1cInRocmVlLWRzLWlmcmFtZVwiIHRpdGxlPVwiM0QgU2VjdXJlIHZlcmlmaWNhdGlvblwiIGFsbG93PVwicGF5bWVudFwiPjwvaWZyYW1lPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjb25zdCBzaGFkb3dSb290ID0gaG9zdC5hdHRhY2hTaGFkb3coeyBtb2RlOiBcIm9wZW5cIiB9KTtcbiAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5jb250ZW50LmNsb25lTm9kZSh0cnVlKSk7XG4gIGNvbnN0IGlmcmFtZSA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIiN0aHJlZS1kcy1pZnJhbWVcIik7XG4gIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIi5jYW5jZWwtYnV0dG9uXCIpO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhvc3QpO1xuICByZXR1cm4geyBob3N0LCBpZnJhbWUsIGNhbmNlbEJ1dHRvbiB9O1xufTtcblxuZnVuY3Rpb24gc3RhcnRQb2xsaW5nKGlmcmFtZSwgb25TdWNjZXNzLCBjaGlsZE9yaWdpbikge1xuICBjb25zdCBoYW5kbGVQb2xsaW5nID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBwaW5nQ2RlRm9yM2RzU3RhdHVzKGlmcmFtZSwgY2hpbGRPcmlnaW4pO1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBjbGVhckludGVydmFsKHBvbGxpbmdJbnRlcnZhbCk7XG4gICAgICAgIG9uU3VjY2VzcyhzdGF0dXMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgfVxuICB9O1xuICBoYW5kbGVQb2xsaW5nKCk7XG4gIGNvbnN0IHBvbGxpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKGhhbmRsZVBvbGxpbmcsIENERV9QT0xMSU5HX0lOVEVSVkFMKTtcbiAgcmV0dXJuIHBvbGxpbmdJbnRlcnZhbDtcbn1cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50cyh7XG4gIGVsZW1lbnRzLFxuICBwb2xsaW5nSW50ZXJ2YWwsXG4gIHJlc29sdmVcbn0pIHtcbiAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4ge1xuICAgIGNsZWFySW50ZXJ2YWwocG9sbGluZ0ludGVydmFsKTtcbiAgICBlbGVtZW50cy5ob3N0LnJlbW92ZSgpO1xuICAgIHJlc29sdmUoVGhyZWVEU1N0YXR1cy5DQU5DRUxMRUQpO1xuICB9O1xuICBlbGVtZW50cy5jYW5jZWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNhbmNlbCk7XG4gIGNvbnN0IGNsZWFudXBFdmVudExpc3RlbmVycyA9ICgpID0+IHtcbiAgICBlbGVtZW50cy5jYW5jZWxCdXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNhbmNlbCk7XG4gIH07XG4gIHJldHVybiBjbGVhbnVwRXZlbnRMaXN0ZW5lcnM7XG59XG5hc3luYyBmdW5jdGlvbiBzdGFydDNkc1ZlcmlmaWNhdGlvbih7XG4gIHVybCxcbiAgYmFzZVVybFxufSkge1xuICBjb25zdCBlbGVtZW50cyA9IGNyZWF0ZUFuZE9wZW5GcmFtZSh1cmwpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoc3RhdHVzKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWxlbWVudHMuaG9zdC5yZW1vdmUoKTtcbiAgICAgIH0sIDFlMyk7XG4gICAgICByZXNvbHZlKHN0YXR1cyk7XG4gICAgICBjbGVhbnVwRXZlbnRMaXN0ZW5lcnM/LigpO1xuICAgIH07XG4gICAgY29uc3QgcG9sbGluZ0ludGVydmFsID0gc3RhcnRQb2xsaW5nKGVsZW1lbnRzLmlmcmFtZSwgb25TdWNjZXNzLCBuZXcgVVJMKGJhc2VVcmwpLm9yaWdpbik7XG4gICAgY29uc3QgY2xlYW51cEV2ZW50TGlzdGVuZXJzID0gaGFuZGxlRXZlbnRzKHtcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgcG9sbGluZ0ludGVydmFsLFxuICAgICAgcmVzb2x2ZVxuICAgIH0pO1xuICB9KTtcbn1cblxuY29uc3QgQU5TSV9CQUNLR1JPVU5EX09GRlNFVCA9IDEwO1xuXG5jb25zdCB3cmFwQW5zaTE2ID0gKG9mZnNldCA9IDApID0+IGNvZGUgPT4gYFxcdTAwMUJbJHtjb2RlICsgb2Zmc2V0fW1gO1xuXG5jb25zdCB3cmFwQW5zaTI1NiA9IChvZmZzZXQgPSAwKSA9PiBjb2RlID0+IGBcXHUwMDFCWyR7MzggKyBvZmZzZXR9OzU7JHtjb2RlfW1gO1xuXG5jb25zdCB3cmFwQW5zaTE2bSA9IChvZmZzZXQgPSAwKSA9PiAocmVkLCBncmVlbiwgYmx1ZSkgPT4gYFxcdTAwMUJbJHszOCArIG9mZnNldH07Mjske3JlZH07JHtncmVlbn07JHtibHVlfW1gO1xuXG5jb25zdCBzdHlsZXMkMSA9IHtcblx0bW9kaWZpZXI6IHtcblx0XHRyZXNldDogWzAsIDBdLFxuXHRcdC8vIDIxIGlzbid0IHdpZGVseSBzdXBwb3J0ZWQgYW5kIDIyIGRvZXMgdGhlIHNhbWUgdGhpbmdcblx0XHRib2xkOiBbMSwgMjJdLFxuXHRcdGRpbTogWzIsIDIyXSxcblx0XHRpdGFsaWM6IFszLCAyM10sXG5cdFx0dW5kZXJsaW5lOiBbNCwgMjRdLFxuXHRcdG92ZXJsaW5lOiBbNTMsIDU1XSxcblx0XHRpbnZlcnNlOiBbNywgMjddLFxuXHRcdGhpZGRlbjogWzgsIDI4XSxcblx0XHRzdHJpa2V0aHJvdWdoOiBbOSwgMjldLFxuXHR9LFxuXHRjb2xvcjoge1xuXHRcdGJsYWNrOiBbMzAsIDM5XSxcblx0XHRyZWQ6IFszMSwgMzldLFxuXHRcdGdyZWVuOiBbMzIsIDM5XSxcblx0XHR5ZWxsb3c6IFszMywgMzldLFxuXHRcdGJsdWU6IFszNCwgMzldLFxuXHRcdG1hZ2VudGE6IFszNSwgMzldLFxuXHRcdGN5YW46IFszNiwgMzldLFxuXHRcdHdoaXRlOiBbMzcsIDM5XSxcblxuXHRcdC8vIEJyaWdodCBjb2xvclxuXHRcdGJsYWNrQnJpZ2h0OiBbOTAsIDM5XSxcblx0XHRncmF5OiBbOTAsIDM5XSwgLy8gQWxpYXMgb2YgYGJsYWNrQnJpZ2h0YFxuXHRcdGdyZXk6IFs5MCwgMzldLCAvLyBBbGlhcyBvZiBgYmxhY2tCcmlnaHRgXG5cdFx0cmVkQnJpZ2h0OiBbOTEsIDM5XSxcblx0XHRncmVlbkJyaWdodDogWzkyLCAzOV0sXG5cdFx0eWVsbG93QnJpZ2h0OiBbOTMsIDM5XSxcblx0XHRibHVlQnJpZ2h0OiBbOTQsIDM5XSxcblx0XHRtYWdlbnRhQnJpZ2h0OiBbOTUsIDM5XSxcblx0XHRjeWFuQnJpZ2h0OiBbOTYsIDM5XSxcblx0XHR3aGl0ZUJyaWdodDogWzk3LCAzOV0sXG5cdH0sXG5cdGJnQ29sb3I6IHtcblx0XHRiZ0JsYWNrOiBbNDAsIDQ5XSxcblx0XHRiZ1JlZDogWzQxLCA0OV0sXG5cdFx0YmdHcmVlbjogWzQyLCA0OV0sXG5cdFx0YmdZZWxsb3c6IFs0MywgNDldLFxuXHRcdGJnQmx1ZTogWzQ0LCA0OV0sXG5cdFx0YmdNYWdlbnRhOiBbNDUsIDQ5XSxcblx0XHRiZ0N5YW46IFs0NiwgNDldLFxuXHRcdGJnV2hpdGU6IFs0NywgNDldLFxuXG5cdFx0Ly8gQnJpZ2h0IGNvbG9yXG5cdFx0YmdCbGFja0JyaWdodDogWzEwMCwgNDldLFxuXHRcdGJnR3JheTogWzEwMCwgNDldLCAvLyBBbGlhcyBvZiBgYmdCbGFja0JyaWdodGBcblx0XHRiZ0dyZXk6IFsxMDAsIDQ5XSwgLy8gQWxpYXMgb2YgYGJnQmxhY2tCcmlnaHRgXG5cdFx0YmdSZWRCcmlnaHQ6IFsxMDEsIDQ5XSxcblx0XHRiZ0dyZWVuQnJpZ2h0OiBbMTAyLCA0OV0sXG5cdFx0YmdZZWxsb3dCcmlnaHQ6IFsxMDMsIDQ5XSxcblx0XHRiZ0JsdWVCcmlnaHQ6IFsxMDQsIDQ5XSxcblx0XHRiZ01hZ2VudGFCcmlnaHQ6IFsxMDUsIDQ5XSxcblx0XHRiZ0N5YW5CcmlnaHQ6IFsxMDYsIDQ5XSxcblx0XHRiZ1doaXRlQnJpZ2h0OiBbMTA3LCA0OV0sXG5cdH0sXG59O1xuXG5PYmplY3Qua2V5cyhzdHlsZXMkMS5tb2RpZmllcik7XG5jb25zdCBmb3JlZ3JvdW5kQ29sb3JOYW1lcyA9IE9iamVjdC5rZXlzKHN0eWxlcyQxLmNvbG9yKTtcbmNvbnN0IGJhY2tncm91bmRDb2xvck5hbWVzID0gT2JqZWN0LmtleXMoc3R5bGVzJDEuYmdDb2xvcik7XG5bLi4uZm9yZWdyb3VuZENvbG9yTmFtZXMsIC4uLmJhY2tncm91bmRDb2xvck5hbWVzXTtcblxuZnVuY3Rpb24gYXNzZW1ibGVTdHlsZXMoKSB7XG5cdGNvbnN0IGNvZGVzID0gbmV3IE1hcCgpO1xuXG5cdGZvciAoY29uc3QgW2dyb3VwTmFtZSwgZ3JvdXBdIG9mIE9iamVjdC5lbnRyaWVzKHN0eWxlcyQxKSkge1xuXHRcdGZvciAoY29uc3QgW3N0eWxlTmFtZSwgc3R5bGVdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwKSkge1xuXHRcdFx0c3R5bGVzJDFbc3R5bGVOYW1lXSA9IHtcblx0XHRcdFx0b3BlbjogYFxcdTAwMUJbJHtzdHlsZVswXX1tYCxcblx0XHRcdFx0Y2xvc2U6IGBcXHUwMDFCWyR7c3R5bGVbMV19bWAsXG5cdFx0XHR9O1xuXG5cdFx0XHRncm91cFtzdHlsZU5hbWVdID0gc3R5bGVzJDFbc3R5bGVOYW1lXTtcblxuXHRcdFx0Y29kZXMuc2V0KHN0eWxlWzBdLCBzdHlsZVsxXSk7XG5cdFx0fVxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHN0eWxlcyQxLCBncm91cE5hbWUsIHtcblx0XHRcdHZhbHVlOiBncm91cCxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdH0pO1xuXHR9XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHN0eWxlcyQxLCAnY29kZXMnLCB7XG5cdFx0dmFsdWU6IGNvZGVzLFxuXHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHR9KTtcblxuXHRzdHlsZXMkMS5jb2xvci5jbG9zZSA9ICdcXHUwMDFCWzM5bSc7XG5cdHN0eWxlcyQxLmJnQ29sb3IuY2xvc2UgPSAnXFx1MDAxQls0OW0nO1xuXG5cdHN0eWxlcyQxLmNvbG9yLmFuc2kgPSB3cmFwQW5zaTE2KCk7XG5cdHN0eWxlcyQxLmNvbG9yLmFuc2kyNTYgPSB3cmFwQW5zaTI1NigpO1xuXHRzdHlsZXMkMS5jb2xvci5hbnNpMTZtID0gd3JhcEFuc2kxNm0oKTtcblx0c3R5bGVzJDEuYmdDb2xvci5hbnNpID0gd3JhcEFuc2kxNihBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUKTtcblx0c3R5bGVzJDEuYmdDb2xvci5hbnNpMjU2ID0gd3JhcEFuc2kyNTYoQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG5cdHN0eWxlcyQxLmJnQ29sb3IuYW5zaTE2bSA9IHdyYXBBbnNpMTZtKEFOU0lfQkFDS0dST1VORF9PRkZTRVQpO1xuXG5cdC8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL1FpeC0vY29sb3ItY29udmVydC9ibG9iLzNmMGUwZDRlOTJlMjM1Nzk2Y2NiMTdmNmU4NWM3MjA5NGE2NTFmNDkvY29udmVyc2lvbnMuanNcblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc3R5bGVzJDEsIHtcblx0XHRyZ2JUb0Fuc2kyNTY6IHtcblx0XHRcdHZhbHVlKHJlZCwgZ3JlZW4sIGJsdWUpIHtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBleHRlbmRlZCBncmV5c2NhbGUgcGFsZXR0ZSBoZXJlLCB3aXRoIHRoZSBleGNlcHRpb24gb2Zcblx0XHRcdFx0Ly8gYmxhY2sgYW5kIHdoaXRlLiBub3JtYWwgcGFsZXR0ZSBvbmx5IGhhcyA0IGdyZXlzY2FsZSBzaGFkZXMuXG5cdFx0XHRcdGlmIChyZWQgPT09IGdyZWVuICYmIGdyZWVuID09PSBibHVlKSB7XG5cdFx0XHRcdFx0aWYgKHJlZCA8IDgpIHtcblx0XHRcdFx0XHRcdHJldHVybiAxNjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocmVkID4gMjQ4KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gMjMxO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBNYXRoLnJvdW5kKCgocmVkIC0gOCkgLyAyNDcpICogMjQpICsgMjMyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIDE2XG5cdFx0XHRcdFx0KyAoMzYgKiBNYXRoLnJvdW5kKHJlZCAvIDI1NSAqIDUpKVxuXHRcdFx0XHRcdCsgKDYgKiBNYXRoLnJvdW5kKGdyZWVuIC8gMjU1ICogNSkpXG5cdFx0XHRcdFx0KyBNYXRoLnJvdW5kKGJsdWUgLyAyNTUgKiA1KTtcblx0XHRcdH0sXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHRcdGhleFRvUmdiOiB7XG5cdFx0XHR2YWx1ZShoZXgpIHtcblx0XHRcdFx0Y29uc3QgbWF0Y2hlcyA9IC9bYS1mXFxkXXs2fXxbYS1mXFxkXXszfS9pLmV4ZWMoaGV4LnRvU3RyaW5nKDE2KSk7XG5cdFx0XHRcdGlmICghbWF0Y2hlcykge1xuXHRcdFx0XHRcdHJldHVybiBbMCwgMCwgMF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgW2NvbG9yU3RyaW5nXSA9IG1hdGNoZXM7XG5cblx0XHRcdFx0aWYgKGNvbG9yU3RyaW5nLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0XHRcdGNvbG9yU3RyaW5nID0gWy4uLmNvbG9yU3RyaW5nXS5tYXAoY2hhcmFjdGVyID0+IGNoYXJhY3RlciArIGNoYXJhY3Rlcikuam9pbignJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpbnRlZ2VyID0gTnVtYmVyLnBhcnNlSW50KGNvbG9yU3RyaW5nLCAxNik7XG5cblx0XHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG5cdFx0XHRcdFx0KGludGVnZXIgPj4gMTYpICYgMHhGRixcblx0XHRcdFx0XHQoaW50ZWdlciA+PiA4KSAmIDB4RkYsXG5cdFx0XHRcdFx0aW50ZWdlciAmIDB4RkYsXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1iaXR3aXNlICovXG5cdFx0XHRcdF07XG5cdFx0XHR9LFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRoZXhUb0Fuc2kyNTY6IHtcblx0XHRcdHZhbHVlOiBoZXggPT4gc3R5bGVzJDEucmdiVG9BbnNpMjU2KC4uLnN0eWxlcyQxLmhleFRvUmdiKGhleCkpLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRhbnNpMjU2VG9BbnNpOiB7XG5cdFx0XHR2YWx1ZShjb2RlKSB7XG5cdFx0XHRcdGlmIChjb2RlIDwgOCkge1xuXHRcdFx0XHRcdHJldHVybiAzMCArIGNvZGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY29kZSA8IDE2KSB7XG5cdFx0XHRcdFx0cmV0dXJuIDkwICsgKGNvZGUgLSA4KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCByZWQ7XG5cdFx0XHRcdGxldCBncmVlbjtcblx0XHRcdFx0bGV0IGJsdWU7XG5cblx0XHRcdFx0aWYgKGNvZGUgPj0gMjMyKSB7XG5cdFx0XHRcdFx0cmVkID0gKCgoY29kZSAtIDIzMikgKiAxMCkgKyA4KSAvIDI1NTtcblx0XHRcdFx0XHRncmVlbiA9IHJlZDtcblx0XHRcdFx0XHRibHVlID0gcmVkO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvZGUgLT0gMTY7XG5cblx0XHRcdFx0XHRjb25zdCByZW1haW5kZXIgPSBjb2RlICUgMzY7XG5cblx0XHRcdFx0XHRyZWQgPSBNYXRoLmZsb29yKGNvZGUgLyAzNikgLyA1O1xuXHRcdFx0XHRcdGdyZWVuID0gTWF0aC5mbG9vcihyZW1haW5kZXIgLyA2KSAvIDU7XG5cdFx0XHRcdFx0Ymx1ZSA9IChyZW1haW5kZXIgJSA2KSAvIDU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IE1hdGgubWF4KHJlZCwgZ3JlZW4sIGJsdWUpICogMjtcblxuXHRcdFx0XHRpZiAodmFsdWUgPT09IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gMzA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuXHRcdFx0XHRsZXQgcmVzdWx0ID0gMzAgKyAoKE1hdGgucm91bmQoYmx1ZSkgPDwgMikgfCAoTWF0aC5yb3VuZChncmVlbikgPDwgMSkgfCBNYXRoLnJvdW5kKHJlZCkpO1xuXG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gMikge1xuXHRcdFx0XHRcdHJlc3VsdCArPSA2MDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRyZ2JUb0Fuc2k6IHtcblx0XHRcdHZhbHVlOiAocmVkLCBncmVlbiwgYmx1ZSkgPT4gc3R5bGVzJDEuYW5zaTI1NlRvQW5zaShzdHlsZXMkMS5yZ2JUb0Fuc2kyNTYocmVkLCBncmVlbiwgYmx1ZSkpLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0fSxcblx0XHRoZXhUb0Fuc2k6IHtcblx0XHRcdHZhbHVlOiBoZXggPT4gc3R5bGVzJDEuYW5zaTI1NlRvQW5zaShzdHlsZXMkMS5oZXhUb0Fuc2kyNTYoaGV4KSksXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHR9LFxuXHR9KTtcblxuXHRyZXR1cm4gc3R5bGVzJDE7XG59XG5cbmNvbnN0IGFuc2lTdHlsZXMgPSBhc3NlbWJsZVN0eWxlcygpO1xuXG4vKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cblxuY29uc3QgbGV2ZWwgPSAoKCkgPT4ge1xuXHRpZiAobmF2aWdhdG9yLnVzZXJBZ2VudERhdGEpIHtcblx0XHRjb25zdCBicmFuZCA9IG5hdmlnYXRvci51c2VyQWdlbnREYXRhLmJyYW5kcy5maW5kKCh7YnJhbmR9KSA9PiBicmFuZCA9PT0gJ0Nocm9taXVtJyk7XG5cdFx0aWYgKGJyYW5kICYmIGJyYW5kLnZlcnNpb24gPiA5Mykge1xuXHRcdFx0cmV0dXJuIDM7XG5cdFx0fVxuXHR9XG5cblx0aWYgKC9cXGIoQ2hyb21lfENocm9taXVtKVxcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0cmV0dXJuIDA7XG59KSgpO1xuXG5jb25zdCBjb2xvclN1cHBvcnQgPSBsZXZlbCAhPT0gMCAmJiB7XG5cdGxldmVsLFxuXHRoYXNCYXNpYzogdHJ1ZSxcblx0aGFzMjU2OiBsZXZlbCA+PSAyLFxuXHRoYXMxNm06IGxldmVsID49IDMsXG59O1xuXG5jb25zdCBzdXBwb3J0c0NvbG9yID0ge1xuXHRzdGRvdXQ6IGNvbG9yU3VwcG9ydCxcblx0c3RkZXJyOiBjb2xvclN1cHBvcnQsXG59O1xuXG4vLyBUT0RPOiBXaGVuIHRhcmdldGluZyBOb2RlLmpzIDE2LCB1c2UgYFN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbGAuXG5mdW5jdGlvbiBzdHJpbmdSZXBsYWNlQWxsKHN0cmluZywgc3Vic3RyaW5nLCByZXBsYWNlcikge1xuXHRsZXQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihzdWJzdHJpbmcpO1xuXHRpZiAoaW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fVxuXG5cdGNvbnN0IHN1YnN0cmluZ0xlbmd0aCA9IHN1YnN0cmluZy5sZW5ndGg7XG5cdGxldCBlbmRJbmRleCA9IDA7XG5cdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXHRkbyB7XG5cdFx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4LCBpbmRleCkgKyBzdWJzdHJpbmcgKyByZXBsYWNlcjtcblx0XHRlbmRJbmRleCA9IGluZGV4ICsgc3Vic3RyaW5nTGVuZ3RoO1xuXHRcdGluZGV4ID0gc3RyaW5nLmluZGV4T2Yoc3Vic3RyaW5nLCBlbmRJbmRleCk7XG5cdH0gd2hpbGUgKGluZGV4ICE9PSAtMSk7XG5cblx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4KTtcblx0cmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXgoc3RyaW5nLCBwcmVmaXgsIHBvc3RmaXgsIGluZGV4KSB7XG5cdGxldCBlbmRJbmRleCA9IDA7XG5cdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXHRkbyB7XG5cdFx0Y29uc3QgZ290Q1IgPSBzdHJpbmdbaW5kZXggLSAxXSA9PT0gJ1xccic7XG5cdFx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnNsaWNlKGVuZEluZGV4LCAoZ290Q1IgPyBpbmRleCAtIDEgOiBpbmRleCkpICsgcHJlZml4ICsgKGdvdENSID8gJ1xcclxcbicgOiAnXFxuJykgKyBwb3N0Zml4O1xuXHRcdGVuZEluZGV4ID0gaW5kZXggKyAxO1xuXHRcdGluZGV4ID0gc3RyaW5nLmluZGV4T2YoJ1xcbicsIGVuZEluZGV4KTtcblx0fSB3aGlsZSAoaW5kZXggIT09IC0xKTtcblxuXHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc2xpY2UoZW5kSW5kZXgpO1xuXHRyZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbmNvbnN0IHtzdGRvdXQ6IHN0ZG91dENvbG9yLCBzdGRlcnI6IHN0ZGVyckNvbG9yfSA9IHN1cHBvcnRzQ29sb3I7XG5cbmNvbnN0IEdFTkVSQVRPUiA9IFN5bWJvbCgnR0VORVJBVE9SJyk7XG5jb25zdCBTVFlMRVIgPSBTeW1ib2woJ1NUWUxFUicpO1xuY29uc3QgSVNfRU1QVFkgPSBTeW1ib2woJ0lTX0VNUFRZJyk7XG5cbi8vIGBzdXBwb3J0c0NvbG9yLmxldmVsYCDihpIgYGFuc2lTdHlsZXMuY29sb3JbbmFtZV1gIG1hcHBpbmdcbmNvbnN0IGxldmVsTWFwcGluZyA9IFtcblx0J2Fuc2knLFxuXHQnYW5zaScsXG5cdCdhbnNpMjU2Jyxcblx0J2Fuc2kxNm0nLFxuXTtcblxuY29uc3Qgc3R5bGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuY29uc3QgYXBwbHlPcHRpb25zID0gKG9iamVjdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG5cdGlmIChvcHRpb25zLmxldmVsICYmICEoTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLmxldmVsKSAmJiBvcHRpb25zLmxldmVsID49IDAgJiYgb3B0aW9ucy5sZXZlbCA8PSAzKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVGhlIGBsZXZlbGAgb3B0aW9uIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMCB0byAzJyk7XG5cdH1cblxuXHQvLyBEZXRlY3QgbGV2ZWwgaWYgbm90IHNldCBtYW51YWxseVxuXHRjb25zdCBjb2xvckxldmVsID0gc3Rkb3V0Q29sb3IgPyBzdGRvdXRDb2xvci5sZXZlbCA6IDA7XG5cdG9iamVjdC5sZXZlbCA9IG9wdGlvbnMubGV2ZWwgPT09IHVuZGVmaW5lZCA/IGNvbG9yTGV2ZWwgOiBvcHRpb25zLmxldmVsO1xufTtcblxuY29uc3QgY2hhbGtGYWN0b3J5ID0gb3B0aW9ucyA9PiB7XG5cdGNvbnN0IGNoYWxrID0gKC4uLnN0cmluZ3MpID0+IHN0cmluZ3Muam9pbignICcpO1xuXHRhcHBseU9wdGlvbnMoY2hhbGssIG9wdGlvbnMpO1xuXG5cdE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFsaywgY3JlYXRlQ2hhbGsucHJvdG90eXBlKTtcblxuXHRyZXR1cm4gY2hhbGs7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVDaGFsayhvcHRpb25zKSB7XG5cdHJldHVybiBjaGFsa0ZhY3Rvcnkob3B0aW9ucyk7XG59XG5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihjcmVhdGVDaGFsay5wcm90b3R5cGUsIEZ1bmN0aW9uLnByb3RvdHlwZSk7XG5cbmZvciAoY29uc3QgW3N0eWxlTmFtZSwgc3R5bGVdIG9mIE9iamVjdC5lbnRyaWVzKGFuc2lTdHlsZXMpKSB7XG5cdHN0eWxlc1tzdHlsZU5hbWVdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRoaXMsIGNyZWF0ZVN0eWxlcihzdHlsZS5vcGVuLCBzdHlsZS5jbG9zZSwgdGhpc1tTVFlMRVJdKSwgdGhpc1tJU19FTVBUWV0pO1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHN0eWxlTmFtZSwge3ZhbHVlOiBidWlsZGVyfSk7XG5cdFx0XHRyZXR1cm4gYnVpbGRlcjtcblx0XHR9LFxuXHR9O1xufVxuXG5zdHlsZXMudmlzaWJsZSA9IHtcblx0Z2V0KCkge1xuXHRcdGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRoaXMsIHRoaXNbU1RZTEVSXSwgdHJ1ZSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd2aXNpYmxlJywge3ZhbHVlOiBidWlsZGVyfSk7XG5cdFx0cmV0dXJuIGJ1aWxkZXI7XG5cdH0sXG59O1xuXG5jb25zdCBnZXRNb2RlbEFuc2kgPSAobW9kZWwsIGxldmVsLCB0eXBlLCAuLi5hcmd1bWVudHNfKSA9PiB7XG5cdGlmIChtb2RlbCA9PT0gJ3JnYicpIHtcblx0XHRpZiAobGV2ZWwgPT09ICdhbnNpMTZtJykge1xuXHRcdFx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV0uYW5zaTE2bSguLi5hcmd1bWVudHNfKTtcblx0XHR9XG5cblx0XHRpZiAobGV2ZWwgPT09ICdhbnNpMjU2Jykge1xuXHRcdFx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV0uYW5zaTI1NihhbnNpU3R5bGVzLnJnYlRvQW5zaTI1NiguLi5hcmd1bWVudHNfKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV0uYW5zaShhbnNpU3R5bGVzLnJnYlRvQW5zaSguLi5hcmd1bWVudHNfKSk7XG5cdH1cblxuXHRpZiAobW9kZWwgPT09ICdoZXgnKSB7XG5cdFx0cmV0dXJuIGdldE1vZGVsQW5zaSgncmdiJywgbGV2ZWwsIHR5cGUsIC4uLmFuc2lTdHlsZXMuaGV4VG9SZ2IoLi4uYXJndW1lbnRzXykpO1xuXHR9XG5cblx0cmV0dXJuIGFuc2lTdHlsZXNbdHlwZV1bbW9kZWxdKC4uLmFyZ3VtZW50c18pO1xufTtcblxuY29uc3QgdXNlZE1vZGVscyA9IFsncmdiJywgJ2hleCcsICdhbnNpMjU2J107XG5cbmZvciAoY29uc3QgbW9kZWwgb2YgdXNlZE1vZGVscykge1xuXHRzdHlsZXNbbW9kZWxdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IHtsZXZlbH0gPSB0aGlzO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICguLi5hcmd1bWVudHNfKSB7XG5cdFx0XHRcdGNvbnN0IHN0eWxlciA9IGNyZWF0ZVN0eWxlcihnZXRNb2RlbEFuc2kobW9kZWwsIGxldmVsTWFwcGluZ1tsZXZlbF0sICdjb2xvcicsIC4uLmFyZ3VtZW50c18pLCBhbnNpU3R5bGVzLmNvbG9yLmNsb3NlLCB0aGlzW1NUWUxFUl0pO1xuXHRcdFx0XHRyZXR1cm4gY3JlYXRlQnVpbGRlcih0aGlzLCBzdHlsZXIsIHRoaXNbSVNfRU1QVFldKTtcblx0XHRcdH07XG5cdFx0fSxcblx0fTtcblxuXHRjb25zdCBiZ01vZGVsID0gJ2JnJyArIG1vZGVsWzBdLnRvVXBwZXJDYXNlKCkgKyBtb2RlbC5zbGljZSgxKTtcblx0c3R5bGVzW2JnTW9kZWxdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IHtsZXZlbH0gPSB0aGlzO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICguLi5hcmd1bWVudHNfKSB7XG5cdFx0XHRcdGNvbnN0IHN0eWxlciA9IGNyZWF0ZVN0eWxlcihnZXRNb2RlbEFuc2kobW9kZWwsIGxldmVsTWFwcGluZ1tsZXZlbF0sICdiZ0NvbG9yJywgLi4uYXJndW1lbnRzXyksIGFuc2lTdHlsZXMuYmdDb2xvci5jbG9zZSwgdGhpc1tTVFlMRVJdKTtcblx0XHRcdFx0cmV0dXJuIGNyZWF0ZUJ1aWxkZXIodGhpcywgc3R5bGVyLCB0aGlzW0lTX0VNUFRZXSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdH07XG59XG5cbmNvbnN0IHByb3RvID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoKCkgPT4ge30sIHtcblx0Li4uc3R5bGVzLFxuXHRsZXZlbDoge1xuXHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHRoaXNbR0VORVJBVE9SXS5sZXZlbDtcblx0XHR9LFxuXHRcdHNldChsZXZlbCkge1xuXHRcdFx0dGhpc1tHRU5FUkFUT1JdLmxldmVsID0gbGV2ZWw7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBjcmVhdGVTdHlsZXIgPSAob3BlbiwgY2xvc2UsIHBhcmVudCkgPT4ge1xuXHRsZXQgb3BlbkFsbDtcblx0bGV0IGNsb3NlQWxsO1xuXHRpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRvcGVuQWxsID0gb3Blbjtcblx0XHRjbG9zZUFsbCA9IGNsb3NlO1xuXHR9IGVsc2Uge1xuXHRcdG9wZW5BbGwgPSBwYXJlbnQub3BlbkFsbCArIG9wZW47XG5cdFx0Y2xvc2VBbGwgPSBjbG9zZSArIHBhcmVudC5jbG9zZUFsbDtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0b3Blbixcblx0XHRjbG9zZSxcblx0XHRvcGVuQWxsLFxuXHRcdGNsb3NlQWxsLFxuXHRcdHBhcmVudCxcblx0fTtcbn07XG5cbmNvbnN0IGNyZWF0ZUJ1aWxkZXIgPSAoc2VsZiwgX3N0eWxlciwgX2lzRW1wdHkpID0+IHtcblx0Ly8gU2luZ2xlIGFyZ3VtZW50IGlzIGhvdCBwYXRoLCBpbXBsaWNpdCBjb2VyY2lvbiBpcyBmYXN0ZXIgdGhhbiBhbnl0aGluZ1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW1wbGljaXQtY29lcmNpb25cblx0Y29uc3QgYnVpbGRlciA9ICguLi5hcmd1bWVudHNfKSA9PiBhcHBseVN0eWxlKGJ1aWxkZXIsIChhcmd1bWVudHNfLmxlbmd0aCA9PT0gMSkgPyAoJycgKyBhcmd1bWVudHNfWzBdKSA6IGFyZ3VtZW50c18uam9pbignICcpKTtcblxuXHQvLyBXZSBhbHRlciB0aGUgcHJvdG90eXBlIGJlY2F1c2Ugd2UgbXVzdCByZXR1cm4gYSBmdW5jdGlvbiwgYnV0IHRoZXJlIGlzXG5cdC8vIG5vIHdheSB0byBjcmVhdGUgYSBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IHByb3RvdHlwZVxuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YoYnVpbGRlciwgcHJvdG8pO1xuXG5cdGJ1aWxkZXJbR0VORVJBVE9SXSA9IHNlbGY7XG5cdGJ1aWxkZXJbU1RZTEVSXSA9IF9zdHlsZXI7XG5cdGJ1aWxkZXJbSVNfRU1QVFldID0gX2lzRW1wdHk7XG5cblx0cmV0dXJuIGJ1aWxkZXI7XG59O1xuXG5jb25zdCBhcHBseVN0eWxlID0gKHNlbGYsIHN0cmluZykgPT4ge1xuXHRpZiAoc2VsZi5sZXZlbCA8PSAwIHx8ICFzdHJpbmcpIHtcblx0XHRyZXR1cm4gc2VsZltJU19FTVBUWV0gPyAnJyA6IHN0cmluZztcblx0fVxuXG5cdGxldCBzdHlsZXIgPSBzZWxmW1NUWUxFUl07XG5cblx0aWYgKHN0eWxlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fVxuXG5cdGNvbnN0IHtvcGVuQWxsLCBjbG9zZUFsbH0gPSBzdHlsZXI7XG5cdGlmIChzdHJpbmcuaW5jbHVkZXMoJ1xcdTAwMUInKSkge1xuXHRcdHdoaWxlIChzdHlsZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gUmVwbGFjZSBhbnkgaW5zdGFuY2VzIGFscmVhZHkgcHJlc2VudCB3aXRoIGEgcmUtb3BlbmluZyBjb2RlXG5cdFx0XHQvLyBvdGhlcndpc2Ugb25seSB0aGUgcGFydCBvZiB0aGUgc3RyaW5nIHVudGlsIHNhaWQgY2xvc2luZyBjb2RlXG5cdFx0XHQvLyB3aWxsIGJlIGNvbG9yZWQsIGFuZCB0aGUgcmVzdCB3aWxsIHNpbXBseSBiZSAncGxhaW4nLlxuXHRcdFx0c3RyaW5nID0gc3RyaW5nUmVwbGFjZUFsbChzdHJpbmcsIHN0eWxlci5jbG9zZSwgc3R5bGVyLm9wZW4pO1xuXG5cdFx0XHRzdHlsZXIgPSBzdHlsZXIucGFyZW50O1xuXHRcdH1cblx0fVxuXG5cdC8vIFdlIGNhbiBtb3ZlIGJvdGggbmV4dCBhY3Rpb25zIG91dCBvZiBsb29wLCBiZWNhdXNlIHJlbWFpbmluZyBhY3Rpb25zIGluIGxvb3Agd29uJ3QgaGF2ZVxuXHQvLyBhbnkvdmlzaWJsZSBlZmZlY3Qgb24gcGFydHMgd2UgYWRkIGhlcmUuIENsb3NlIHRoZSBzdHlsaW5nIGJlZm9yZSBhIGxpbmVicmVhayBhbmQgcmVvcGVuXG5cdC8vIGFmdGVyIG5leHQgbGluZSB0byBmaXggYSBibGVlZCBpc3N1ZSBvbiBtYWNPUzogaHR0cHM6Ly9naXRodWIuY29tL2NoYWxrL2NoYWxrL3B1bGwvOTJcblx0Y29uc3QgbGZJbmRleCA9IHN0cmluZy5pbmRleE9mKCdcXG4nKTtcblx0aWYgKGxmSW5kZXggIT09IC0xKSB7XG5cdFx0c3RyaW5nID0gc3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4KHN0cmluZywgY2xvc2VBbGwsIG9wZW5BbGwsIGxmSW5kZXgpO1xuXHR9XG5cblx0cmV0dXJuIG9wZW5BbGwgKyBzdHJpbmcgKyBjbG9zZUFsbDtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNyZWF0ZUNoYWxrLnByb3RvdHlwZSwgc3R5bGVzKTtcblxuY29uc3QgY2hhbGsgPSBjcmVhdGVDaGFsaygpO1xuY3JlYXRlQ2hhbGsoe2xldmVsOiBzdGRlcnJDb2xvciA/IHN0ZGVyckNvbG9yLmxldmVsIDogMH0pO1xuXG5jb25zdCBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyA9IChzaW1wbGVPanNGbG93KSA9PiB7XG4gIHJldHVybiBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uQ2hlY2tvdXRTdGFydGVkKCk7XG4gICAgICBjb25zdCBmbG93UmVzdWx0ID0gYXdhaXQgc2ltcGxlT2pzRmxvdyhwYXJhbXMpO1xuICAgICAgaWYgKGZsb3dSZXN1bHQubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyhmbG93UmVzdWx0LnJlc3VsdC5wYXltZW50X21ldGhvZF9pZCk7XG4gICAgICB9IGVsc2UgaWYgKGZsb3dSZXN1bHQubW9kZSA9PT0gXCJjaGVja291dFwiKSB7XG4gICAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uQ2hlY2tvdXRTdWNjZXNzKFxuICAgICAgICAgIGZsb3dSZXN1bHQucmVzdWx0Lmludm9pY2VfdXJscyxcbiAgICAgICAgICBmbG93UmVzdWx0LnJlc3VsdC5zdWJzY3JpcHRpb25faWRzLFxuICAgICAgICAgIGZsb3dSZXN1bHQucmVzdWx0LmN1c3RvbWVyX2lkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBtb2RlOiAke2Zsb3dSZXN1bHR9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uQ2hlY2tvdXRFcnJvcihnZXRFcnJvck1lc3NhZ2UoZXJyb3IpKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcbn07XG5jb25zdCBhZGRFcnJvckNhdGNoZXJGb3JJbml0ID0gKGluaXQpID0+IHtcbiAgcmV0dXJuIGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGluaXQocGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgeyBlcnJfXyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJpbml0LWVycm9yLWNhdGNoZXJcIik7XG4gICAgICBlcnJfXyhlcnJvcik7XG4gICAgICByZXR1cm4geyBpc0F2YWlsYWJsZTogZmFsc2UsIHJlYXNvbjogZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSB9O1xuICAgIH1cbiAgfTtcbn07XG5jb25zdCBjcmVhdGVPanNGbG93TG9nZ2VycyA9IChwcmVmaXgpID0+IHtcbiAgY29uc3QgbG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICB3aW5kb3dbXCJjb25zb2xlXCJdLmxvZyhgJHtjaGFsay5ncmVlbi5ib2xkKFwib2pzL1wiKX0ke2NoYWxrLmJvbGQuZ3JheShgJHtwcmVmaXh9YCl9XHRgLCAuLi5hcmdzKTtcbiAgfTtcbiAgY29uc3QgZXJyID0gKC4uLmFyZ3MpID0+IHtcbiAgICB3aW5kb3dbXCJjb25zb2xlXCJdLmVycm9yKGAke2NoYWxrLnJlZC5ib2xkKFwib2pzL1wiKX0ke2NoYWxrLmJvbGQuZ3JheShgJHtwcmVmaXh9YCl9XHRgLCAuLi5hcmdzKTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBsb2csXG4gICAgZXJyLFxuICAgIGxvZ19fOiBsb2csXG4gICAgZXJyX186IGVyclxuICB9O1xufTtcblxuY29uc3QgeyBsb2dfXzogbG9nX18kMywgZXJyX186IGVycl9fJDQgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiY29tbW9uLWNjXCIpO1xuY29uc3QgdmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0MgPSAobm9uQ2RlRm9ybUlucHV0cywgb25WYWxpZGF0aW9uRXJyb3IpID0+IHtcbiAgY29uc3QgcGF5bG9hZCA9IFJlcXVpcmVkRm9ybUZpZWxkcy5zYWZlUGFyc2Uobm9uQ2RlRm9ybUlucHV0cyk7XG4gIGlmICghcGF5bG9hZC5zdWNjZXNzKSB7XG4gICAgY29uc3QgZm9ybWF0dGVkID0gcGF5bG9hZC5lcnJvci5mb3JtYXQoKTtcbiAgICBjb25zdCBpc3N1ZXMgPSBleHRyYWN0SXNzdWVzUGVyRmllbGQoZm9ybWF0dGVkKTtcbiAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIGVycm9yc10gb2YgT2JqZWN0LmVudHJpZXMoaXNzdWVzKSkge1xuICAgICAgb25WYWxpZGF0aW9uRXJyb3IoZmllbGROYW1lLCBlcnJvcnMsIGZpZWxkTmFtZSk7XG4gICAgfVxuICAgIGVycl9fJDQoYEdvdCB2YWxpZGF0aW9uIGVycm9ycyBpbiBub24tQ0RFIGZvcm0gZmllbGRzYCwgaXNzdWVzKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJHb3QgdmFsaWRhdGlvbiBlcnJvcnMgaW4gbm9uLUNERSBmb3JtIGZpZWxkc1wiKTtcbiAgfVxuICByZXR1cm4gcGF5bG9hZC5kYXRhO1xufTtcbmNvbnN0IHZhbGlkYXRlVG9rZW5pemVDYXJkUmVzdWx0cyA9ICh0b2tlbml6ZVJlc3VsdHMsIG9uVmFsaWRhdGlvbkVycm9yKSA9PiB7XG4gIGZvciAoY29uc3QgdG9rZW5pemVSZXN1bHQgb2YgdG9rZW5pemVSZXN1bHRzKSB7XG4gICAgaWYgKHRva2VuaXplUmVzdWx0LnN1Y2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgICB0b2tlbml6ZVJlc3VsdC5lcnJvcnMuZm9yRWFjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gQWxsRmllbGROYW1lcy5zYWZlUGFyc2UoZXJyb3IuZWxlbWVudFR5cGUpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgZXJyX18kNChgVW5rbm93biBmaWVsZCBuYW1lIGluIG9uVmFsaWRhdGlvbkVycm9yOiAke2Vycm9yLmVsZW1lbnRUeXBlfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHBhcnNlZC5kYXRhO1xuICAgICAgICAgIG9uVmFsaWRhdGlvbkVycm9yKGZpZWxkTmFtZSwgZXJyb3IuZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsb2dfXyQzKGBFcnJvciB0b2tlbml6aW5nIGNhcmQ6IGdvdCB2YWxpZGF0aW9uIGVycm9yczogJHtKU09OLnN0cmluZ2lmeSh0b2tlbml6ZVJlc3VsdC5lcnJvcnMpfWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR290IHZhbGlkYXRpb24gZXJyb3JzIHdoaWxlIHRva2VuaXppbmcgY2FyZFwiKTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IHsgZXJyX186IGVycl9fJDMgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiY29tbW1vblwiKTtcbmNvbnN0IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UgPSAocmVzcG9uc2UpID0+IHtcbiAgaWYgKHJlc3BvbnNlLnBheW1lbnRfbWV0aG9kcy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgb25lIHBheW1lbnQgbWV0aG9kLCBnb3QgJHtyZXNwb25zZS5wYXltZW50X21ldGhvZHMubGVuZ3RofWApO1xuICB9XG4gIHJldHVybiB7IHBheW1lbnRfbWV0aG9kX2lkOiByZXNwb25zZS5wYXltZW50X21ldGhvZHNbMF0uaWQgfTtcbn07XG5jb25zdCBmaW5kQ3BtTWF0Y2hpbmdUeXBlID0gKGFsbENQTXMsIHpvZE1vZGVsKSA9PiB7XG4gIGNvbnN0IGNwbSA9IGFsbENQTXMuZmluZCgoY3BtMikgPT4gem9kTW9kZWwuc2FmZVBhcnNlKGNwbTIpLnN1Y2Nlc3MpO1xuICBpZiAoIWNwbSkge1xuICAgIGVycl9fJDMoYE5vIENQTXMgZm91bmQgZm9yIG1vZGVsICR7em9kTW9kZWx9YCk7XG4gICAgZXJyX18kMyhhbGxDUE1zKTtcbiAgICBlcnJfXyQzKGB6b2RNb2RlbGApO1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ1BNcyBmb3VuZCBmb3IgbW9kZWwgJHt6b2RNb2RlbH1gKTtcbiAgfVxuICByZXR1cm4gem9kTW9kZWwucGFyc2UoY3BtKTtcbn07XG5cbmNvbnN0IHsgbG9nX186IGxvZ19fJDIsIGVycl9fOiBlcnJfXyQyIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImNvbW1vbi1jY1wiKTtcbmNvbnN0IHsgbG9nX186IHN0cmlwZUxvZ19fIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcInN0cmlwZS1jY1wiKTtcbmNvbnN0IHJ1bkNvbW1vbkNjRmxvdyA9IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzKFxuICBhc3luYyAoeyBjb250ZXh0LCBjaGVja291dFBheW1lbnRNZXRob2QsIG5vbkNkZUZvcm1JbnB1dHMsIGZsb3dDYWxsYmFja3MgfSkgPT4ge1xuICAgIGxvZ19fJDIoYOKUnCBSdW5uaW5nIGNvbW1vbiBDQyBmbG93Li4uYCwgeyBjaGVja291dFBheW1lbnRNZXRob2QgfSk7XG4gICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoYW55Q2RlQ29ubmVjdGlvbik7XG4gICAgbG9nX18kMihg4pScIFZhbGlkYXRpbmcgbm9uLUNERSBmb3JtIGZpZWxkcyBbTW9kZTogJHtwcmVmaWxsLm1vZGV9XWApO1xuICAgIGNvbnN0IG5vbkNkZUZvcm1GaWVsZHMgPSB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyhub25DZGVGb3JtSW5wdXRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICBsb2dfXyQyKGDilJwgVG9rZW5pemluZyBjYXJkIGluZm8gaW4gQ0RFIFtTZXNzaW9uOiAke2NvbnRleHQuZWxlbWVudHNTZXNzaW9uSWR9XWApO1xuICAgIGNvbnN0IHRva2VuaXplQ2FyZFJlc3VsdHMgPSBhd2FpdCB0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMsIHtcbiAgICAgIHNlc3Npb25faWQ6IGNvbnRleHQuZWxlbWVudHNTZXNzaW9uSWRcbiAgICB9KTtcbiAgICB2YWxpZGF0ZVRva2VuaXplQ2FyZFJlc3VsdHModG9rZW5pemVDYXJkUmVzdWx0cywgZmxvd0NhbGxiYWNrcy5vblZhbGlkYXRpb25FcnJvcik7XG4gICAgY29uc3QgY29tbW9uQ2hlY2tvdXRQYXJhbXMgPSB7XG4gICAgICBzZXNzaW9uX2lkOiBjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkLFxuICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgIG5vbl9jZGVfZm9ybV9maWVsZHM6IG5vbkNkZUZvcm1GaWVsZHNcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgICAgbG9nX18kMihg4pScIFNldHRpbmcgdXAgcGF5bWVudCBtZXRob2QgaW4gQ0RFIFtUb2tlbjogJHtwcmVmaWxsLnRva2VufV1gKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2V0dXBDaGVja291dChhbnlDZGVDb25uZWN0aW9uLCBjb21tb25DaGVja291dFBhcmFtcyk7XG4gICAgICAgIGxvZ19fJDIoYOKVsCBTZXR1cCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IFtQTSBJRDogJHtyZXN1bHQucGF5bWVudF9tZXRob2RfaWR9XWApO1xuICAgICAgICByZXR1cm4geyBtb2RlOiBcInNldHVwXCIsIHJlc3VsdCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nX18kMihg4pScIEluaXRpYWwgY2hlY2tvdXQgZmxvdy4gQ2hlY2tpbmcgb3V0IGNhcmQgaW5mbyBpbiBDREUgW1Nlc3Npb246ICR7Y29udGV4dC5lbGVtZW50c1Nlc3Npb25JZH1dYCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrb3V0Q2FyZEVsZW1lbnRzKGFueUNkZUNvbm5lY3Rpb24sIGNvbW1vbkNoZWNrb3V0UGFyYW1zKTtcbiAgICAgICAgbG9nX18kMihg4pWwIENoZWNrb3V0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuYCk7XG4gICAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIENkZUVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5vcmlnaW5hbEVycm9yTWVzc2FnZSA9PT0gXCIzRFNfUkVRVUlSRURcIikge1xuICAgICAgICAgIGxvZ19fJDIoYOKUnCBDYXJkIHJlcXVpcmVzIDNEUywgc3RhcnRpbmcgbm9uLWxlZ2FjeSBwYXltZW50IGZsb3dgKTtcbiAgICAgICAgICBjb25zdCBzaG91bGRVc2VOZXdGbG93ID0gZXJyb3IucmVzcG9uc2UuaGVhZGVycz8uW1wib3Atc2hvdWxkLXVzZS1uZXctZmxvd1wiXSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgICAgY29uc3Qgc3RhcnRQZlJlc3VsdCA9IGF3YWl0IHN0YXJ0UGF5bWVudEZsb3dGb3JDQyhhbnlDZGVDb25uZWN0aW9uLCBjb21tb25DaGVja291dFBhcmFtcyk7XG4gICAgICAgICAgbG9nX18kMihg4pScIG9wLXNob3VsZC11c2UtbmV3LWZsb3c6ICR7c2hvdWxkVXNlTmV3Rmxvd31gKTtcbiAgICAgICAgICBsb2dfXyQyKGDilJwgUGF5bWVudCBmbG93IHJlc3VsdDpgLCBzdGFydFBmUmVzdWx0KTtcbiAgICAgICAgICBpZiAoc2hvdWxkVXNlTmV3Rmxvdykge1xuICAgICAgICAgICAgYXdhaXQgY29tbW9uQ0MzRFNGbG93KHN0YXJ0UGZSZXN1bHQsIGNvbnRleHQuYmFzZVVybCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHN0cmlwZUNDM0RTRmxvdyhzdGFydFBmUmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgICAgICBsb2dfXyQyKGDilJwgQ29uZmlybWluZyBwYXltZW50IGZsb3cgW2NjX3BtX2lkOiAke3N0YXJ0UGZSZXN1bHQuY2NfcG1faWR9XWApO1xuICAgICAgICAgICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IGNvbmZpcm1QYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgICAgICAgZXhpc3RpbmdfY2NfcG1faWQ6IHN0YXJ0UGZSZXN1bHQuY2NfcG1faWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9nX18kMihg4pScIENvbmZpcm0gcGF5bWVudCBmbG93IHJlc3VsdCByZWNlaXZlZCBSZXN1bHQ6YCwgY29uZmlybVJlc3VsdCk7XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkUGF5bWVudE1ldGhvZCA9IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UoY29uZmlybVJlc3VsdCk7XG4gICAgICAgICAgICBsb2dfXyQyKGDilbAgU2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBbUE0gSUQ6ICR7Y3JlYXRlZFBheW1lbnRNZXRob2QucGF5bWVudF9tZXRob2RfaWR9XWApO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQ6IGNyZWF0ZWRQYXltZW50TWV0aG9kIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBDaGVja2luZyBvdXQgYWZ0ZXIgM0RTIGZsb3cgW0Zsb3c6ICR7c2hvdWxkVXNlTmV3RmxvdyA/IFwibmV3XCIgOiBcImxlZ2FjeVwifV1gKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrb3V0Q2FyZEVsZW1lbnRzKGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgICAgICAgICAgLi4uY29tbW9uQ2hlY2tvdXRQYXJhbXMsXG4gICAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBzdGFydFBmUmVzdWx0LmNjX3BtX2lkLFxuICAgICAgICAgICAgICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiAhc2hvdWxkVXNlTmV3Rmxvd1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsb2dfXyQyKGDilbAgQ2hlY2tvdXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5gKTtcbiAgICAgICAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlcnJfXyQyKGDilbAgRXJyb3IgY2hlY2tpbmcgb3V0IGNhcmQgaW5mbyBpbiBDREVgKTtcbiAgICAgIGVycl9fJDIoZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4pO1xuY29uc3QgcGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgY29uc3Qgc3RyaXBlQWN0aW9uID0gcmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLnR5cGUgPT09IFwic3RyaXBlXzNkc1wiKTtcbiAgaWYgKCFzdHJpcGVBY3Rpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzdHJpcGUgM0RTIGFjdGlvbiBmb3VuZFwiKTtcbiAgfVxuICByZXR1cm4gU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhLnBhcnNlKHN0cmlwZUFjdGlvbik7XG59O1xuY29uc3QgcGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgY29uc3QgY29tbW9uQWN0aW9uID0gcmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLnR5cGUgPT09IFwiYWlyd2FsbGV4X3BheW1lbnRfY29uc2VudFwiKTtcbiAgaWYgKCFjb21tb25BY3Rpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb21tb24gM0RTIGFjdGlvbiBmb3VuZFwiKTtcbiAgfVxuICByZXR1cm4gQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhLnBhcnNlKGNvbW1vbkFjdGlvbik7XG59O1xuY29uc3QgY29tbW9uQ0MzRFNGbG93ID0gYXN5bmMgKHN0YXJ0UGZSZXN1bHQsIGJhc2VVcmwpID0+IHtcbiAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gcGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEoc3RhcnRQZlJlc3VsdCk7XG4gIGxvZ19fJDIoYOKUnCBVc2luZyBjb21tb24gM0RTIGZsb3cgW1VSTDogJHtuZXh0QWN0aW9uTWV0YWRhdGEucmVkaXJlY3RfdXJsfV1gKTtcbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgc3RhcnQzZHNWZXJpZmljYXRpb24oeyB1cmw6IG5leHRBY3Rpb25NZXRhZGF0YS5yZWRpcmVjdF91cmwsIGJhc2VVcmwgfSk7XG4gIGxvZ19fJDIoYOKVsCAzRFMgdmVyaWZpY2F0aW9uIGNvbXBsZXRlZCBbU3RhdHVzOiAke3N0YXR1c31dYCk7XG4gIGlmIChzdGF0dXMgPT09IFRocmVlRFNTdGF0dXMuQ0FOQ0VMTEVEKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiM0RTIHZlcmlmaWNhdGlvbiBjYW5jZWxsZWRcIik7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gVGhyZWVEU1N0YXR1cy5GQUlMVVJFKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiM0RTIHZlcmlmaWNhdGlvbiBmYWlsZWRcIik7XG4gIH1cbn07XG5jb25zdCBzdHJpcGVDQzNEU0Zsb3cgPSBhc3luYyAoc3RhcnRQZlJlc3VsdCkgPT4ge1xuICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBwYXJzZVN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YShzdGFydFBmUmVzdWx0KTtcbiAgc3RyaXBlTG9nX18oYOKUnCBVc2luZyBzdHJpcGUgM0RTIGZsb3cgW0NsaWVudCBTZWNyZXQ6ICR7bmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQuc3Vic3RyaW5nKDAsIDgpfS4uLl1gKTtcbiAgYXdhaXQgbGF1bmNoU3RyaXBlM0RTRGlhbG9nRmxvdyhuZXh0QWN0aW9uTWV0YWRhdGEpO1xuICBzdHJpcGVMb2dfXyhcIuKVsCBTdHJpcGUgM0RTIGZsb3cgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVwiKTtcbn07XG5cbmNvbnN0IHsgbG9nX186IGxvZ19fJDEsIGVycl9fOiBlcnJfXyQxIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcInN0cmlwZS1wclwiKTtcbmNvbnN0IFN0cmlwZVByQ3BtID0gei5vYmplY3Qoe1xuICBwcm92aWRlcjogei51bmlvbihbei5saXRlcmFsKFwiYXBwbGVfcGF5XCIpLCB6LmxpdGVyYWwoXCJnb29nbGVfcGF5XCIpXSksXG4gIHByb2Nlc3Nvcl9uYW1lOiB6LmxpdGVyYWwoXCJzdHJpcGVcIiksXG4gIG1ldGFkYXRhOiB6Lm9iamVjdCh7XG4gICAgc3RyaXBlX3BrOiB6LnN0cmluZygpXG4gIH0pXG59KTtcbmNvbnN0IGluaXRTdHJpcGVQckZsb3cgPSBhZGRFcnJvckNhdGNoZXJGb3JJbml0KFxuICBhc3luYyAoeyBjb250ZXh0IH0pID0+IHtcbiAgICBsb2dfXyQxKGBDaGVja2luZyBpZiB0aGVyZSBhcmUgYW55IENQTXMgZm9yIFN0cmlwZSBQUi4uLmApO1xuICAgIGNvbnN0IGNoZWNrb3V0UGF5bWVudE1ldGhvZCA9IGZpbmRDcG1NYXRjaGluZ1R5cGUoY29udGV4dC5jaGVja291dFBheW1lbnRNZXRob2RzLCBTdHJpcGVQckNwbSk7XG4gICAgbG9nX18kMShgSW5pdGlhbGl6aW5nIFN0cmlwZSBQUiBmbG93Li4uYCk7XG4gICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgY29uc3QgcHJlZmlsbCA9IGF3YWl0IGdldFByZWZpbGwoYW55Q2RlQ29ubmVjdGlvbik7XG4gICAgY29uc3QgaXNTZXR1cE1vZGUgPSBwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIjtcbiAgICBsb2dfXyQxKGBHZXR0aW5nIGluaXRpYWwgcHJldmlldyBhbW91bnRgKTtcbiAgICBjb25zdCBpbml0aWFsUHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0UHJldmlld0Ftb3VudChhbnlDZGVDb25uZWN0aW9uLCBwcmVmaWxsLnRva2VuLCBpc1NldHVwTW9kZSwgdm9pZCAwKTtcbiAgICBjb25zdCBwciA9IGF3YWl0IGNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0KFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLm1ldGFkYXRhLnN0cmlwZV9wayxcbiAgICAgIGluaXRpYWxQcmV2aWV3LmFtb3VudEF0b20sXG4gICAgICBpbml0aWFsUHJldmlldy5jdXJyZW5jeSxcbiAgICAgIGlzU2V0dXBNb2RlXG4gICAgKTtcbiAgICBsb2dfXyQxKGBDaGVja2luZyBpZiBjYW4gbWFrZSBwYXltZW50YCk7XG4gICAgY29uc3QgY2FuTWFrZVBheW1lbnQgPSBhd2FpdCBwci5jYW5NYWtlUGF5bWVudCgpO1xuICAgIGlmIChjYW5NYWtlUGF5bWVudCA9PT0gbnVsbCkge1xuICAgICAgZXJyX18kMShgY2FuTWFrZVBheW1lbnQgcmV0dXJuZWQgbnVsbGApO1xuICAgICAgcmV0dXJuIHsgaXNBdmFpbGFibGU6IGZhbHNlLCByZWFzb246IFwiY2FuTWFrZVBheW1lbnQgcmV0dXJuZWQgbnVsbFwiIH07XG4gICAgfVxuICAgIGxvZ19fJDEoYFN0cmlwZSBQUiBmbG93IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS4gQ2FuIG1ha2UgcGF5bWVudGAsIGNhbk1ha2VQYXltZW50KTtcbiAgICByZXR1cm4ge1xuICAgICAgaXNBdmFpbGFibGU6IHRydWUsXG4gICAgICBwcixcbiAgICAgIGF2YWlsYWJsZVByb3ZpZGVyczoge1xuICAgICAgICBhcHBsZVBheTogY2FuTWFrZVBheW1lbnQuYXBwbGVQYXksXG4gICAgICAgIGdvb2dsZVBheTogY2FuTWFrZVBheW1lbnQuZ29vZ2xlUGF5XG4gICAgICB9XG4gICAgfTtcbiAgfVxuKTtcbmNvbnN0IHJ1blN0cmlwZVByRmxvdyA9IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzKFxuICBhc3luYyAoe1xuICAgIGNvbnRleHQsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIG5vbkNkZUZvcm1JbnB1dHMsXG4gICAgZmxvd0NhbGxiYWNrcyxcbiAgICBjdXN0b21QYXJhbXMsXG4gICAgaW5pdFJlc3VsdFxuICB9KSA9PiB7XG4gICAgbG9nX18kMShgUnVubmluZyBTdHJpcGUgUFIgZmxvdy4uLmApO1xuICAgIGlmIChjdXN0b21QYXJhbXMucHJvdmlkZXIgIT09IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm92aWRlciBtaXNtYXRjaC4gRXhwZWN0ZWQgJHtjdXN0b21QYXJhbXMucHJvdmlkZXJ9LCBnb3QgJHtjaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXJ9YCk7XG4gICAgfVxuICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgIGNvbnN0IHByID0gaW5pdFJlc3VsdC5wcjtcbiAgICBsb2dfXyQxKGBWYWxpZGF0aW5nIG5vbi1DREUgZm9ybSBmaWVsZHNgKTtcbiAgICBjb25zdCBjbGVhbmVkRm9ybUlucHV0cyA9IG92ZXJyaWRlRW1wdHlaaXBDb2RlKG5vbkNkZUZvcm1JbnB1dHMpO1xuICAgIGNvbnN0IG5vbkNkZUZvcm1GaWVsZHMgPSB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyhjbGVhbmVkRm9ybUlucHV0cywgZmxvd0NhbGxiYWNrcy5vblZhbGlkYXRpb25FcnJvcik7XG4gICAgaWYgKGN1c3RvbVBhcmFtcz8ub3ZlcnJpZGVQYXltZW50UmVxdWVzdCkge1xuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBjdXN0b21QYXJhbXMub3ZlcnJpZGVQYXltZW50UmVxdWVzdDtcbiAgICAgIGxvZ19fJDEoYE92ZXJyaWRpbmcgUFIgYW1vdW50IHdpdGhgLCBvdmVycmlkZSk7XG4gICAgICB1cGRhdGVQcldpdGhBbW91bnQocHIsIG92ZXJyaWRlLmFtb3VudCwgb3ZlcnJpZGUucGVuZGluZyk7XG4gICAgfVxuICAgIGxvZ19fJDEoYFNob3dpbmcgUFIgZGlhbG9nLi4uYCk7XG4gICAgcHIuc2hvdygpO1xuICAgIGNvbnN0IHN0cmlwZVBtQWRkZWRFdmVudCA9IGF3YWl0IHdhaXRGb3JVc2VyVG9BZGRQYXltZW50TWV0aG9kKHByKTtcbiAgICBsb2dfXyQxKGBQUiBkaWFsb2cgZmluaXNoZWQuIFN0YXJ0aW5nIHBheW1lbnQgZmxvdy4uLmApO1xuICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSA9IGF3YWl0IHN0YXJ0UGF5bWVudEZsb3dGb3JQUihhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICBmaWVsZHM6IG5vbkNkZUZvcm1GaWVsZHMsXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2RcbiAgICB9KTtcbiAgICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhKHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG4gICAgbG9nX18kMShgQ29uZmlybWluZyBQUiB3aXRoIFN0cmlwZS4uLmApO1xuICAgIGF3YWl0IGNvbmZpcm1TdHJpcGVQclBNKG5leHRBY3Rpb25NZXRhZGF0YSwgc3RyaXBlUG1BZGRlZEV2ZW50KTtcbiAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgIGxvZ19fJDEoYENvbmZpcm1pbmcgcGF5bWVudCBmbG93IGZvciBzZXR1cC4uLmApO1xuICAgICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IGNvbmZpcm1QYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlblxuICAgICAgfSk7XG4gICAgICBjb25zdCBjcmVhdGVkUGF5bWVudE1ldGhvZCA9IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UoY29uZmlybVJlc3VsdCk7XG4gICAgICByZXR1cm4geyBtb2RlOiBcInNldHVwXCIsIHJlc3VsdDogY3JlYXRlZFBheW1lbnRNZXRob2QgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nX18kMShgUGVyZm9ybWluZyBjaGVja291dC4uLmApO1xuICAgICAgY29uc3QgY2hlY2tvdXRSZXF1ZXN0ID0ge1xuICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW4sXG4gICAgICAgIHBheW1lbnRfaW5wdXQ6IHtcbiAgICAgICAgICBwcm92aWRlcl90eXBlOiBjaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXJcbiAgICAgICAgfSxcbiAgICAgICAgY3VzdG9tZXJfZW1haWw6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLkVNQUlMXSxcbiAgICAgICAgY3VzdG9tZXJfemlwX2NvZGU6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLlpJUF9DT0RFXSxcbiAgICAgICAgY3VzdG9tZXJfY291bnRyeTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuQ09VTlRSWV0sXG4gICAgICAgIHByb21vdGlvbl9jb2RlOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5QUk9NT1RJT05fQ09ERV0sXG4gICAgICAgIGxpbmVfaXRlbXM6IHByZWZpbGwubGluZV9pdGVtcyxcbiAgICAgICAgdG90YWxfYW1vdW50X2F0b206IHByZWZpbGwuYW1vdW50X3RvdGFsX2F0b20sXG4gICAgICAgIGNhbmNlbF9hdF9lbmQ6IGZhbHNlLFxuICAgICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogY2hlY2tvdXRQYXltZW50TWV0aG9kXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGVyZm9ybUNoZWNrb3V0KGFueUNkZUNvbm5lY3Rpb24sIGNoZWNrb3V0UmVxdWVzdCk7XG4gICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdCB9O1xuICAgIH1cbiAgfVxuKTtcbmNvbnN0IG92ZXJyaWRlRW1wdHlaaXBDb2RlID0gKGZvcm1JbnB1dHMpID0+IHtcbiAgY29uc3QgbmV3Rm9ybUlucHV0cyA9IHsgLi4uZm9ybUlucHV0cyB9O1xuICBpZiAoIW5ld0Zvcm1JbnB1dHNbRmllbGROYW1lLlpJUF9DT0RFXSkge1xuICAgIGxvZ19fJDEoYE92ZXJyaWRpbmcgZW1wdHkgemlwIGNvZGUgKG9ubHkgZm9yIGdvb2dsZSBwYXkgYW5kIGFwcGxlIHBheSlgKTtcbiAgICBuZXdGb3JtSW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gPSBcIjAwMDAwXCI7XG4gIH1cbiAgcmV0dXJuIG5ld0Zvcm1JbnB1dHM7XG59O1xuY29uc3QgdXBkYXRlUHJXaXRoQW1vdW50ID0gKHByLCBhbW91bnQsIGlzUGVuZGluZykgPT4ge1xuICBwci51cGRhdGUoe1xuICAgIHRvdGFsOiB7XG4gICAgICBhbW91bnQ6IGFtb3VudC5hbW91bnRBdG9tLFxuICAgICAgbGFiZWw6IFwiVG90YWxcIixcbiAgICAgIHBlbmRpbmc6IGlzUGVuZGluZ1xuICAgIH0sXG4gICAgY3VycmVuY3k6IGFtb3VudC5jdXJyZW5jeVxuICB9KTtcbn07XG5jb25zdCBwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhID0gKHJlc3BvbnNlKSA9PiB7XG4gIGlmIChyZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBvY2N1cnJlZC5cbkRldGFpbHM6IGdvdCAke3Jlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5sZW5ndGh9IHJlcXVpcmVkIHVzZXIgYWN0aW9uc2ApO1xuICB9XG4gIHJldHVybiBQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShyZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnNbMF0pO1xufTtcblxuY29uc3QgZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdCA9IChjcG1zLCB3aXRoUHJvdmlkZXIsIHdpdGhQcm9jZXNzb3IpID0+IHtcbiAgY29uc3QgbWF0Y2hlcyA9IGNwbXMuZmlsdGVyKChjcG0pID0+IHtcbiAgICBjb25zdCBtYXRjaGVzUHJvY2Vzc29yID0gdHJ1ZSA7XG4gICAgY29uc3QgbWF0Y2hlc1Byb3ZpZGVyID0gY3BtLnByb3ZpZGVyID09PSB3aXRoUHJvdmlkZXI7XG4gICAgcmV0dXJuIG1hdGNoZXNQcm9jZXNzb3IgJiYgbWF0Y2hlc1Byb3ZpZGVyO1xuICB9KTtcbiAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBDUE1zIGZvdW5kIHdpdGggcHJvdmlkZXIgJyR7d2l0aFByb3ZpZGVyfScgYW5kIHByb2Nlc3NvciAnJHt3aXRoUHJvY2Vzc29yfSdgKTtcbiAgfVxuICBpZiAobWF0Y2hlcy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiBvbmUgQ1BNIGZvdW5kIHdpdGggcHJvdmlkZXIgJyR7d2l0aFByb3ZpZGVyfScgYW5kIHByb2Nlc3NvciAnJHt3aXRoUHJvY2Vzc29yfSdgKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlc1swXTtcbn07XG5jb25zdCBPanNGbG93cyA9IHtcbiAgLy8g4pyLIE5vdGU6IEZvciBmbG93cyB0aGF0IHJlcXVpcmUgaW5pdGlhbGl6YXRpb24sIHBsZWFzZSBhZGQgdGhlbSB0byBgaW5pdC1mbG93cy50c2BcbiAgLy8gU3RyaXBlXG4gIGNvbW1vbkNDOiB7XG4gICAgcnVuOiBydW5Db21tb25DY0Zsb3dcbiAgfSxcbiAgc3RyaXBlUFI6IHtcbiAgICBpbml0OiBpbml0U3RyaXBlUHJGbG93LFxuICAgIHJ1bjogcnVuU3RyaXBlUHJGbG93XG4gIH1cbiAgLy8g8J+RiSBBZGQgbW9yZSBmbG93cyBoZXJlXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG59O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RXhwb3J0RnJvbUNqcyAoeCkge1xuXHRyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4O1xufVxuXG52YXIgT2JzZXJ2YWJsZSQyID0ge307XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlJDIsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9ic2VydmFibGUkMi5PYnNlcnZhYmxlID0gdm9pZCAwO1xuXG4vLyA9PT0gU3ltYm9sIFN1cHBvcnQgPT09XG5jb25zdCBoYXNTeW1ib2wgPSBuYW1lID0+IEJvb2xlYW4oU3ltYm9sW25hbWVdKTtcblxuY29uc3QgZ2V0U3ltYm9sID0gbmFtZSA9PiBoYXNTeW1ib2wobmFtZSkgPyBTeW1ib2xbbmFtZV0gOiAnQEAnICsgbmFtZTtcblxuY29uc3QgU3ltYm9sSXRlcmF0b3IgPSBnZXRTeW1ib2woJ2l0ZXJhdG9yJyk7XG5jb25zdCBTeW1ib2xPYnNlcnZhYmxlID0gZ2V0U3ltYm9sKCdvYnNlcnZhYmxlJyk7XG5jb25zdCBTeW1ib2xTcGVjaWVzID0gZ2V0U3ltYm9sKCdzcGVjaWVzJyk7IC8vID09PSBBYnN0cmFjdCBPcGVyYXRpb25zID09PVxuXG5mdW5jdGlvbiBnZXRNZXRob2Qob2JqLCBrZXkpIHtcbiAgbGV0IHZhbHVlID0gb2JqW2tleV07XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKHZhbHVlICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGdldFNwZWNpZXMob2JqKSB7XG4gIGxldCBjdG9yID0gb2JqLmNvbnN0cnVjdG9yO1xuXG4gIGlmIChjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBjdG9yID0gY3RvcltTeW1ib2xTcGVjaWVzXTtcblxuICAgIGlmIChjdG9yID09PSBudWxsKSB7XG4gICAgICBjdG9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjdG9yICE9PSB1bmRlZmluZWQgPyBjdG9yIDogT2JzZXJ2YWJsZSQxO1xufVxuXG5mdW5jdGlvbiBpc09ic2VydmFibGUoeCkge1xuICByZXR1cm4geCBpbnN0YW5jZW9mIE9ic2VydmFibGUkMTsgLy8gU1BFQzogQnJhbmQgY2hlY2tcbn1cblxuZnVuY3Rpb24gaG9zdFJlcG9ydEVycm9yKGUpIHtcbiAgaWYgKGhvc3RSZXBvcnRFcnJvci5sb2cpIHtcbiAgICBob3N0UmVwb3J0RXJyb3IubG9nKGUpO1xuICB9IGVsc2Uge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbnF1ZXVlKGZuKSB7XG4gIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBmbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhvc3RSZXBvcnRFcnJvcihlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikge1xuICBsZXQgY2xlYW51cCA9IHN1YnNjcmlwdGlvbi5fY2xlYW51cDtcbiAgaWYgKGNsZWFudXAgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICBzdWJzY3JpcHRpb24uX2NsZWFudXAgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKCFjbGVhbnVwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIGNsZWFudXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHVuc3Vic2NyaWJlID0gZ2V0TWV0aG9kKGNsZWFudXAsICd1bnN1YnNjcmliZScpO1xuXG4gICAgICBpZiAodW5zdWJzY3JpYmUpIHtcbiAgICAgICAgdW5zdWJzY3JpYmUuY2FsbChjbGVhbnVwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBob3N0UmVwb3J0RXJyb3IoZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvc2VTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB7XG4gIHN1YnNjcmlwdGlvbi5fb2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gIHN1YnNjcmlwdGlvbi5fcXVldWUgPSB1bmRlZmluZWQ7XG4gIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAnY2xvc2VkJztcbn1cblxuZnVuY3Rpb24gZmx1c2hTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB7XG4gIGxldCBxdWV1ZSA9IHN1YnNjcmlwdGlvbi5fcXVldWU7XG5cbiAgaWYgKCFxdWV1ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN1YnNjcmlwdGlvbi5fcXVldWUgPSB1bmRlZmluZWQ7XG4gIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncmVhZHknO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHtcbiAgICBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCBxdWV1ZVtpXS50eXBlLCBxdWV1ZVtpXS52YWx1ZSk7XG4gICAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSkge1xuICBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ3J1bm5pbmcnO1xuICBsZXQgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX29ic2VydmVyO1xuXG4gIHRyeSB7XG4gICAgbGV0IG0gPSBnZXRNZXRob2Qob2JzZXJ2ZXIsIHR5cGUpO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICduZXh0JzpcbiAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlciwgdmFsdWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgICBpZiAobSkgbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7ZWxzZSB0aHJvdyB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2NvbXBsZXRlJzpcbiAgICAgICAgY2xvc2VTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlcik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGhvc3RSZXBvcnRFcnJvcihlKTtcbiAgfVxuXG4gIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnY2xvc2VkJykgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO2Vsc2UgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdydW5uaW5nJykgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdyZWFkeSc7XG59XG5cbmZ1bmN0aW9uIG9uTm90aWZ5KHN1YnNjcmlwdGlvbiwgdHlwZSwgdmFsdWUpIHtcbiAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSByZXR1cm47XG5cbiAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdidWZmZXJpbmcnKSB7XG4gICAgc3Vic2NyaXB0aW9uLl9xdWV1ZS5wdXNoKHtcbiAgICAgIHR5cGUsXG4gICAgICB2YWx1ZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgIT09ICdyZWFkeScpIHtcbiAgICBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ2J1ZmZlcmluZyc7XG4gICAgc3Vic2NyaXB0aW9uLl9xdWV1ZSA9IFt7XG4gICAgICB0eXBlLFxuICAgICAgdmFsdWVcbiAgICB9XTtcbiAgICBlbnF1ZXVlKCgpID0+IGZsdXNoU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG5vdGlmeVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24sIHR5cGUsIHZhbHVlKTtcbn1cblxuY2xhc3MgU3Vic2NyaXB0aW9uIHtcbiAgY29uc3RydWN0b3Iob2JzZXJ2ZXIsIHN1YnNjcmliZXIpIHtcbiAgICAvLyBBU1NFUlQ6IG9ic2VydmVyIGlzIGFuIG9iamVjdFxuICAgIC8vIEFTU0VSVDogc3Vic2NyaWJlciBpcyBjYWxsYWJsZVxuICAgIHRoaXMuX2NsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fb2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICB0aGlzLl9xdWV1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zdGF0ZSA9ICdpbml0aWFsaXppbmcnO1xuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICBsZXQgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIgPSB7XG4gICAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gc2VsZi5fc3RhdGUgPT09ICdjbG9zZWQnO1xuICAgICAgfSxcblxuICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICBvbk5vdGlmeShzZWxmLCAnbmV4dCcsIHZhbHVlKTtcbiAgICAgIH0sXG5cbiAgICAgIGVycm9yKHZhbHVlKSB7XG4gICAgICAgIG9uTm90aWZ5KHNlbGYsICdlcnJvcicsIHZhbHVlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICBvbk5vdGlmeShzZWxmLCAnY29tcGxldGUnKTtcbiAgICAgIH1cblxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fY2xlYW51cCA9IHN1YnNjcmliZXIuY2FsbCh1bmRlZmluZWQsIHN1YnNjcmlwdGlvbk9ic2VydmVyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdWJzY3JpcHRpb25PYnNlcnZlci5lcnJvcihlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc3RhdGUgPT09ICdpbml0aWFsaXppbmcnKSB0aGlzLl9zdGF0ZSA9ICdyZWFkeSc7XG4gIH1cblxuICBnZXQgY2xvc2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZSA9PT0gJ2Nsb3NlZCc7XG4gIH1cblxuICB1bnN1YnNjcmliZSgpIHtcbiAgICBpZiAodGhpcy5fc3RhdGUgIT09ICdjbG9zZWQnKSB7XG4gICAgICBjbG9zZVN1YnNjcmlwdGlvbih0aGlzKTtcbiAgICAgIGNsZWFudXBTdWJzY3JpcHRpb24odGhpcyk7XG4gICAgfVxuICB9XG5cbn1cblxubGV0IE9ic2VydmFibGUkMSA9IGNsYXNzIE9ic2VydmFibGUge1xuICBjb25zdHJ1Y3RvcihzdWJzY3JpYmVyKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE9ic2VydmFibGUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdPYnNlcnZhYmxlIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbicpO1xuICAgIGlmICh0eXBlb2Ygc3Vic2NyaWJlciAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JzZXJ2YWJsZSBpbml0aWFsaXplciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgfVxuXG4gIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgIT09ICdvYmplY3QnIHx8IG9ic2VydmVyID09PSBudWxsKSB7XG4gICAgICBvYnNlcnZlciA9IHtcbiAgICAgICAgbmV4dDogb2JzZXJ2ZXIsXG4gICAgICAgIGVycm9yOiBhcmd1bWVudHNbMV0sXG4gICAgICAgIGNvbXBsZXRlOiBhcmd1bWVudHNbMl1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24ob2JzZXJ2ZXIsIHRoaXMuX3N1YnNjcmliZXIpO1xuICB9XG5cbiAgZm9yRWFjaChmbikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICBsZXQgc3Vic2NyaXB0aW9uID0gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZuKHZhbHVlLCBkb25lKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3I6IHJlamVjdCxcbiAgICAgICAgY29tcGxldGU6IHJlc29sdmVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbWFwKGZuKSB7XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IGZuKHZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgfSxcblxuICAgICAgZXJyb3IoZSkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgfSkpO1xuICB9XG5cbiAgZmlsdGVyKGZuKSB7XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIWZuKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICB9LFxuXG4gICAgICBlcnJvcihlKSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgfSxcblxuICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG5cbiAgICB9KSk7XG4gIH1cblxuICByZWR1Y2UoZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICBsZXQgaGFzU2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxO1xuICAgIGxldCBoYXNWYWx1ZSA9IGZhbHNlO1xuICAgIGxldCBzZWVkID0gYXJndW1lbnRzWzFdO1xuICAgIGxldCBhY2MgPSBzZWVkO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB0aGlzLnN1YnNjcmliZSh7XG4gICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgIGxldCBmaXJzdCA9ICFoYXNWYWx1ZTtcbiAgICAgICAgaGFzVmFsdWUgPSB0cnVlO1xuXG4gICAgICAgIGlmICghZmlyc3QgfHwgaGFzU2VlZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhY2MgPSBmbihhY2MsIHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjYyA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBlcnJvcihlKSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgfSxcblxuICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgIGlmICghaGFzVmFsdWUgJiYgIWhhc1NlZWQpIHJldHVybiBvYnNlcnZlci5lcnJvcihuZXcgVHlwZUVycm9yKCdDYW5ub3QgcmVkdWNlIGFuIGVtcHR5IHNlcXVlbmNlJykpO1xuICAgICAgICBvYnNlcnZlci5uZXh0KGFjYyk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG5cbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyBhbGwoKSB7XG4gICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgIGF3YWl0IHRoaXMuZm9yRWFjaCh2YWx1ZSA9PiB2YWx1ZXMucHVzaCh2YWx1ZSkpO1xuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBjb25jYXQoLi4uc291cmNlcykge1xuICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgbGV0IHN1YnNjcmlwdGlvbjtcbiAgICAgIGxldCBpbmRleCA9IDA7XG5cbiAgICAgIGZ1bmN0aW9uIHN0YXJ0TmV4dChuZXh0KSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbiA9IG5leHQuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0KHYpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQodik7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gc291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhcnROZXh0KEMuZnJvbShzb3VyY2VzW2luZGV4KytdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBzdGFydE5leHQodGhpcyk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZmxhdE1hcChmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICBsZXQgc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgICAgbGV0IG91dGVyID0gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGZuKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IGZuKHZhbHVlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBpbm5lciA9IEMuZnJvbSh2YWx1ZSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICAgIGxldCBpID0gc3Vic2NyaXB0aW9ucy5pbmRleE9mKGlubmVyKTtcbiAgICAgICAgICAgICAgaWYgKGkgPj0gMCkgc3Vic2NyaXB0aW9ucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgIGNvbXBsZXRlSWZEb25lKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goaW5uZXIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICBjb21wbGV0ZUlmRG9uZSgpO1xuICAgICAgICB9XG5cbiAgICAgIH0pO1xuXG4gICAgICBmdW5jdGlvbiBjb21wbGV0ZUlmRG9uZSgpIHtcbiAgICAgICAgaWYgKG91dGVyLmNsb3NlZCAmJiBzdWJzY3JpcHRpb25zLmxlbmd0aCA9PT0gMCkgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgb3V0ZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBbU3ltYm9sT2JzZXJ2YWJsZV0oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgZnJvbSh4KSB7XG4gICAgbGV0IEMgPSB0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBPYnNlcnZhYmxlO1xuICAgIGlmICh4ID09IG51bGwpIHRocm93IG5ldyBUeXBlRXJyb3IoeCArICcgaXMgbm90IGFuIG9iamVjdCcpO1xuICAgIGxldCBtZXRob2QgPSBnZXRNZXRob2QoeCwgU3ltYm9sT2JzZXJ2YWJsZSk7XG5cbiAgICBpZiAobWV0aG9kKSB7XG4gICAgICBsZXQgb2JzZXJ2YWJsZSA9IG1ldGhvZC5jYWxsKHgpO1xuICAgICAgaWYgKE9iamVjdChvYnNlcnZhYmxlKSAhPT0gb2JzZXJ2YWJsZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihvYnNlcnZhYmxlICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAgICBpZiAoaXNPYnNlcnZhYmxlKG9ic2VydmFibGUpICYmIG9ic2VydmFibGUuY29uc3RydWN0b3IgPT09IEMpIHJldHVybiBvYnNlcnZhYmxlO1xuICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IG9ic2VydmFibGUuc3Vic2NyaWJlKG9ic2VydmVyKSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1N5bWJvbCgnaXRlcmF0b3InKSkge1xuICAgICAgbWV0aG9kID0gZ2V0TWV0aG9kKHgsIFN5bWJvbEl0ZXJhdG9yKTtcblxuICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgIGVucXVldWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIG1ldGhvZC5jYWxsKHgpKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoaXRlbSk7XG4gICAgICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICAgIGVucXVldWUoKCkgPT4ge1xuICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh4W2ldKTtcbiAgICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoeCArICcgaXMgbm90IG9ic2VydmFibGUnKTtcbiAgfVxuXG4gIHN0YXRpYyBvZiguLi5pdGVtcykge1xuICAgIGxldCBDID0gdHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogT2JzZXJ2YWJsZTtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgZW5xdWV1ZSgoKSA9PiB7XG4gICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtc1tpXSk7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGdldCBbU3ltYm9sU3BlY2llc10oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxufTtcblxuT2JzZXJ2YWJsZSQyLk9ic2VydmFibGUgPSBPYnNlcnZhYmxlJDE7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoT2JzZXJ2YWJsZSQxLCBTeW1ib2woJ2V4dGVuc2lvbnMnKSwge1xuICB2YWx1ZToge1xuICAgIHN5bWJvbDogU3ltYm9sT2JzZXJ2YWJsZSxcbiAgICBob3N0UmVwb3J0RXJyb3JcbiAgfSxcbiAgY29uZmlndXJhYmxlOiB0cnVlXG59KTtcblxudmFyIHplbk9ic2VydmFibGUgPSBPYnNlcnZhYmxlJDIuT2JzZXJ2YWJsZTtcblxuY29uc3QgT2JzZXJ2YWJsZSA9IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbUNqcyh6ZW5PYnNlcnZhYmxlKTtcblxuY29uc3QgeyBsb2dfXywgZXJyX18gfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiaW5pdC1mbG93c1wiKTtcbmNvbnN0IGluaXRpYWxpemVPanNGbG93cyA9IChjb250ZXh0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgLy8gU3RyaXBlIFBSXG4gICAgc3RyaXBlUFI6IHJ1bkluaXRGbG93QXNPYnNlcnZhYmxlKFwic3RyaXBlUFJcIiwgT2pzRmxvd3Muc3RyaXBlUFIuaW5pdCh7IGNvbnRleHQgfSkpXG4gICAgLy8g8J+RiSBBZGQgaW5pdGlhbGl6YXRpb24gZmxvd3MgaGVyZVxuICB9O1xufTtcbmNvbnN0IHJ1bkluaXRGbG93QXNPYnNlcnZhYmxlID0gKGZsb3dOYW1lLCBpbml0RmxvdykgPT4ge1xuICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJsb2FkaW5nXCIgfSk7XG4gICAgaW5pdEZsb3cudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImxvYWRlZFwiLCByZXN1bHQgfSk7XG4gICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImVycm9yXCIsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfSk7XG4gIH0pO1xuICBvYnNlcnZhYmxlLnN1YnNjcmliZSh7XG4gICAgbmV4dDogKHJlc3VsdCkgPT4ge1xuICAgICAgbG9nX18oYCR7Zmxvd05hbWV9IGZsb3cgcmVzdWx0YCwgcmVzdWx0KTtcbiAgICB9LFxuICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgIGVycl9fKGAke2Zsb3dOYW1lfSBmbG93IGluaXRpYWxpemF0aW9uIGVycm9yOlxuJHtKU09OLnN0cmluZ2lmeShlcnJvcil9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb2JzZXJ2YWJsZTtcbn07XG5cbmNvbnN0IFBSX0xPQURJTkcgPSB7XG4gIGlzTG9hZGluZzogdHJ1ZSxcbiAgaXNBdmFpbGFibGU6IGZhbHNlLFxuICBzdGFydEZsb3c6IGFzeW5jICgpID0+IHtcbiAgfVxufTtcbmNvbnN0IFBSX0VSUk9SID0ge1xuICBpc0xvYWRpbmc6IGZhbHNlLFxuICBpc0F2YWlsYWJsZTogZmFsc2UsXG4gIHN0YXJ0RmxvdzogYXN5bmMgKCkgPT4ge1xuICB9XG59O1xuXG5jbGFzcyBPcGVuUGF5Rm9ybUV2ZW50SGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKGZvcm1JbnN0YW5jZSkge1xuICAgIHRoaXMuZm9ybUluc3RhbmNlID0gZm9ybUluc3RhbmNlO1xuICAgIHRoaXMuY29uZmlnID0gZm9ybUluc3RhbmNlLmNvbmZpZztcbiAgICB0aGlzLmZvcm1JZCA9IGZvcm1JbnN0YW5jZS5mb3JtSWQ7XG4gICAgdGhpcy5ldmVudFRhcmdldHMgPSB7fTtcbiAgICB0aGlzLm5vbmNlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIH1cbiAgaGFuZGxlTWVzc2FnZShldmVudCkge1xuICAgIGlmICghZXZlbnQuc291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdXJjZSBmb3VuZGApO1xuICAgIH1cbiAgICBpZiAoZXZlbnQub3JpZ2luICE9PSB0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcuX2ZyYW1lVXJsPy5vcmlnaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBldmVudC5kYXRhID09PSBcIm9iamVjdFwiICYmIGV2ZW50LmRhdGFbXCJwZW5wYWxcIl0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXZlbnREYXRhID0gcGFyc2VFdmVudFBheWxvYWQoSlNPTi5wYXJzZShldmVudC5kYXRhKSk7XG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVFdmVudChldmVudERhdGEpO1xuICAgIGlmICghaXNWYWxpZCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgZWxlbWVudElkLCBwYXlsb2FkIH0gPSBldmVudERhdGE7XG4gICAgY29uc3QgZXZlbnRUeXBlID0gcGF5bG9hZC50eXBlO1xuICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlIFwiTEFZT1VUXCI6XG4gICAgICAgIHRoaXMuaGFuZGxlTGF5b3V0RXZlbnQocGF5bG9hZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkZPQ1VTXCI6XG4gICAgICAgIHRoaXMuaGFuZGxlRm9jdXNFdmVudChlbGVtZW50SWQsIHBheWxvYWQuZWxlbWVudFR5cGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJCTFVSXCI6XG4gICAgICAgIHRoaXMuaGFuZGxlQmx1ckV2ZW50KGVsZW1lbnRJZCwgcGF5bG9hZC5lbGVtZW50VHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkNIQU5HRVwiOlxuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZUV2ZW50KGVsZW1lbnRJZCwgcGF5bG9hZC5lbGVtZW50VHlwZSwgcGF5bG9hZC5lcnJvcnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJMT0FERURcIjpcbiAgICAgICAgdGhpcy5oYW5kbGVMb2FkZWRFdmVudChldmVudC5zb3VyY2UsIGVsZW1lbnRJZCwgcGF5bG9hZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkxPQURfRVJST1JcIjpcbiAgICAgICAgdGhpcy5oYW5kbGVMb2FkRXJyb3JFdmVudChwYXlsb2FkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiVkFMSURBVElPTl9FUlJPUlwiOlxuICAgICAgICB0aGlzLmhhbmRsZVZhbGlkYXRpb25FcnJvckV2ZW50KHBheWxvYWQsIGVsZW1lbnRJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB2YWxpZGF0ZUV2ZW50KGV2ZW50RGF0YSkge1xuICAgIGlmIChldmVudERhdGEuZm9ybUlkICE9PSB0aGlzLmZvcm1JbnN0YW5jZS5mb3JtSWQgfHwgIWV2ZW50RGF0YS5lbGVtZW50SWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMubm9uY2VzLmhhcyhldmVudERhdGEubm9uY2UpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMubm9uY2VzLmFkZChldmVudERhdGEubm9uY2UpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGhhbmRsZUxheW91dEV2ZW50KHBheWxvYWQpIHtcbiAgICBjb25zdCBoZWlnaHQgPSBwYXlsb2FkLmhlaWdodCA/IGAke3BheWxvYWQuaGVpZ2h0fXB4YCA6IFwiMTAwJVwiO1xuICAgIHRoaXMuZm9ybUluc3RhbmNlLnNldEZvcm1IZWlnaHQoaGVpZ2h0KTtcbiAgfVxuICBoYW5kbGVGb2N1c0V2ZW50KGVsZW1lbnRJZCwgZmllbGQpIHtcbiAgICBpZiAodGhpcy5jb25maWcub25Gb2N1cykgdGhpcy5jb25maWcub25Gb2N1cyhlbGVtZW50SWQsIGZpZWxkKTtcbiAgfVxuICBoYW5kbGVCbHVyRXZlbnQoZWxlbWVudElkLCBmaWVsZCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkJsdXIpIHRoaXMuY29uZmlnLm9uQmx1cihlbGVtZW50SWQsIGZpZWxkKTtcbiAgfVxuICBoYW5kbGVDaGFuZ2VFdmVudChlbGVtZW50SWQsIGZpZWxkLCBlcnJvcnMpIHtcbiAgICBpZiAodGhpcy5jb25maWcub25DaGFuZ2UpIHRoaXMuY29uZmlnLm9uQ2hhbmdlKGVsZW1lbnRJZCwgZmllbGQsIGVycm9ycyk7XG4gIH1cbiAgYXN5bmMgaGFuZGxlTG9hZGVkRXZlbnQoc291cmNlLCBlbGVtZW50SWQsIHBheWxvYWQpIHtcbiAgICB0aGlzLmV2ZW50VGFyZ2V0c1tlbGVtZW50SWRdID0gc291cmNlO1xuICAgIHRoaXMuZm9ybUluc3RhbmNlLm9uQ2RlTG9hZGVkKHBheWxvYWQpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkxvYWQpIHtcbiAgICAgIHRoaXMuY29uZmlnLm9uTG9hZChwYXlsb2FkLnRvdGFsQW1vdW50QXRvbXMsIHBheWxvYWQuY3VycmVuY3kpO1xuICAgIH1cbiAgfVxuICBoYW5kbGVMb2FkRXJyb3JFdmVudChwYXlsb2FkKSB7XG4gICAgaWYgKHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5vbkxvYWRFcnJvcikgdGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uTG9hZEVycm9yKHBheWxvYWQubWVzc2FnZSk7XG4gIH1cbiAgaGFuZGxlVmFsaWRhdGlvbkVycm9yRXZlbnQocGF5bG9hZCwgZWxlbWVudElkKSB7XG4gICAgaWYgKHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvcikge1xuICAgICAgdGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yKHBheWxvYWQuZWxlbWVudFR5cGUsIHBheWxvYWQuZXJyb3JzLCBlbGVtZW50SWQpO1xuICAgIH1cbiAgfVxuICAvLyBhc3luYyBoYW5kbGVFcnJvckV2ZW50KHBheWxvYWQ6IEVycm9yRXZlbnRQYXlsb2FkKSB7XG4gIC8vICAgaWYgKHBheWxvYWQubWVzc2FnZSA9PT0gJzNEU19SRVFVSVJFRCcpIHtcbiAgLy8gICAgIGNvbnN0IHRocmVlRFNVcmwgPSBwYXlsb2FkLmhlYWRlcnM/LlsneC0zZHMtYXV0aC11cmwnXSA/PyBTSU1VTEFURV8zRFNfVVJMO1xuICAvLyAgICAgLy8gVGhpcyB3aWxsIG9wZW4gYSBwb3B1cCBhbmQgcHJvY2VzcyB0aGUgM0RTIGZsb3dcbiAgLy8gICAgIC8vIHdpbGwgcmV0dXJuIGEgc3RhdHVzIGBzdWNjZXNzYCB8IGBmYWlsdXJlYCB8IGBjYW5jZWxsZWRgIHdoaWNoIHdlIGNhbiBjb250aW51ZSB3aXRoXG4gIC8vICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBzdGFydDNkc1ZlcmlmaWNhdGlvbih7IHVybDogdGhyZWVEU1VybCwgYmFzZVVybDogdGhpcy5jb25maWcuYmFzZVVybCEgfSk7XG4gIC8vICAgICBjb25zb2xlLmxvZygn8J+UkCAzRFMgc3RhdHVzOicsIHN0YXR1cyk7XG4gIC8vICAgICAvLyBUT0RPOiBjb250aW51ZSB3aXRoIHN0YXR1c1xuICAvLyAgICAgY29uc3QgY2FyZENwbSA9IHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0UGF5bWVudE1ldGhvZHM/LmZpbmQoKGNwbSkgPT4gY3BtLnByb3ZpZGVyID09PSAnY3JlZGl0X2NhcmQnKTtcbiAgLy8gICAgIGlmICghdGhpcy5mb3JtSW5zdGFuY2Uuc2Vzc2lvbklkIHx8ICF0aGlzLmZvcm1JbnN0YW5jZS5mb3JtVGFyZ2V0IHx8ICF0aGlzLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvciB8fCAhY2FyZENwbSlcbiAgLy8gICAgICAgcmV0dXJuO1xuICAvLyAgICAgZm9yIChjb25zdCBbZWxlbWVudElkLCB0YXJnZXRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZXZlbnRUYXJnZXRzKSkge1xuICAvLyAgICAgICBpZiAoIXRhcmdldCkgY29udGludWU7XG4gIC8vICAgICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dFdmVudCA9IGNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZChcbiAgLy8gICAgICAgICBFdmVudFR5cGUuZW51bS5TVEFSVF9QQVlNRU5UX0ZMT1csXG4gIC8vICAgICAgICAgdGhpcy5mb3JtSW5zdGFuY2Uuc2Vzc2lvbklkLFxuICAvLyAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keSxcbiAgLy8gICAgICAgICB0aGlzLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvcixcbiAgLy8gICAgICAgICB7IC4uLmNhcmRDcG0sIHByb2Nlc3Nvcl9uYW1lOiAnc3RyaXBlJyB9LFxuICAvLyAgICAgICAgIGZhbHNlXG4gIC8vICAgICAgICk7XG4gIC8vICAgICAgIGlmICghc3RhcnRQYXltZW50Rmxvd0V2ZW50KSBjb250aW51ZTtcbiAgLy8gICAgICAgdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRGaXJlZCA9IHRydWU7XG4gIC8vICAgICAgIHRoaXMudG9rZW5pemVkRGF0YSA9IHN0YXJ0UGF5bWVudEZsb3dFdmVudDtcbiAgLy8gICAgICAgdGhpcy5wb3N0RXZlbnRUb0ZyYW1lKHRhcmdldCwgZWxlbWVudElkLCBzdGFydFBheW1lbnRGbG93RXZlbnQpO1xuICAvLyAgICAgICBicmVhaztcbiAgLy8gICAgIH1cbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRGaXJlZCA9IGZhbHNlO1xuICAvLyAgICAgaWYgKHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5vbkNoZWNrb3V0RXJyb3IpIHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5vbkNoZWNrb3V0RXJyb3IocGF5bG9hZC5tZXNzYWdlKTtcbiAgLy8gICB9XG4gIC8vIH1cbiAgLy8gaGFuZGxlRm9ybVN1Ym1pdCgpIHtcbiAgLy8gICBpZiAoXG4gIC8vICAgICAhdGhpcy5mb3JtSW5zdGFuY2Uuc2Vzc2lvbklkIHx8XG4gIC8vICAgICAhdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRQYXltZW50TWV0aG9kcz8ubGVuZ3RoIHx8XG4gIC8vICAgICAhdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3JcbiAgLy8gICApIHtcbiAgLy8gICAgIHJldHVybjtcbiAgLy8gICB9XG4gIC8vICAgY29uc3QgY2FyZENwbSA9IHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMuZmluZCgoY3BtKSA9PiBjcG0ucHJvdmlkZXIgPT09ICdjcmVkaXRfY2FyZCcpO1xuICAvLyAgIGlmICghY2FyZENwbSkge1xuICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdDYXJkIG5vdCBhdmFpbGFibGUgYXMgYSBwYXltZW50IG1ldGhvZCBpbiBjaGVja291dCcpO1xuICAvLyAgIH1cbiAgLy8gICBjb25zdCB0b2tlbml6ZURhdGEgPSBjb25zdHJ1Y3RTdWJtaXRFdmVudFBheWxvYWQoXG4gIC8vICAgICBFdmVudFR5cGUuZW51bS5UT0tFTklaRSxcbiAgLy8gICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCEsXG4gIC8vICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZm9ybUluc3RhbmNlLmZvcm1UYXJnZXQpID8/IGRvY3VtZW50LmJvZHksXG4gIC8vICAgICB0aGlzLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvcixcbiAgLy8gICAgIGNhcmRDcG0sXG4gIC8vICAgICBmYWxzZVxuICAvLyAgICk7XG4gIC8vICAgaWYgKCF0b2tlbml6ZURhdGEpIHtcbiAgLy8gICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgY29uc3RydWN0aW5nIHRva2VuaXplIGRhdGEnKTtcbiAgLy8gICB9XG4gIC8vICAgZm9yIChjb25zdCBbZWxlbWVudElkLCB0YXJnZXRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZXZlbnRUYXJnZXRzKSkge1xuICAvLyAgICAgaWYgKCF0YXJnZXQpIGNvbnRpbnVlO1xuICAvLyAgICAgdGhpcy5wb3N0RXZlbnRUb0ZyYW1lKHRhcmdldCwgZWxlbWVudElkLCB0b2tlbml6ZURhdGEpO1xuICAvLyAgIH1cbiAgLy8gICB0aGlzLnRva2VuaXplZERhdGEgPSB0b2tlbml6ZURhdGE7XG4gIC8vIH1cbiAgLy8gYXN5bmMgb25Vc2VyQ29tcGxldGVQYXltZW50UmVxdWVzdFVJKFxuICAvLyAgIHN0cmlwZVBtOiBQYXltZW50UmVxdWVzdFBheW1lbnRNZXRob2RFdmVudCxcbiAgLy8gICBjaGVja291dFBheW1lbnRNZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZFxuICAvLyApOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gICBpZiAoIXRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yIHx8ICF0aGlzLmZvcm1JbnN0YW5jZS5zZXNzaW9uSWQgfHwgIXRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMpXG4gIC8vICAgICByZXR1cm47XG4gIC8vICAgZm9yIChjb25zdCBbZWxlbWVudElkLCBlbGVtZW50XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmV2ZW50VGFyZ2V0cyA/PyB7fSkpIHtcbiAgLy8gICAgIGNvbnN0IHBheW1lbnRGbG93TWV0YWRhdGEgPSB7IHN0cmlwZVBtSWQ6IHN0cmlwZVBtLnBheW1lbnRNZXRob2QuaWQgfTtcbiAgLy8gICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dFdmVudCA9IGNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZChcbiAgLy8gICAgICAgRXZlbnRUeXBlLmVudW0uU1RBUlRfUEFZTUVOVF9GTE9XLFxuICAvLyAgICAgICB0aGlzLmZvcm1JbnN0YW5jZS5zZXNzaW9uSWQsXG4gIC8vICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keSxcbiAgLy8gICAgICAgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IsXG4gIC8vICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgLy8gICAgICAgZmFsc2UsXG4gIC8vICAgICAgIHBheW1lbnRGbG93TWV0YWRhdGFcbiAgLy8gICAgICk7XG4gIC8vICAgICBpZiAoIXN0YXJ0UGF5bWVudEZsb3dFdmVudCkgY29udGludWU7XG4gIC8vICAgICB0aGlzLnN0cmlwZVBtID0gc3RyaXBlUG07XG4gIC8vICAgICB0aGlzLmZvcm1JbnN0YW5jZS5jaGVja291dEZpcmVkID0gdHJ1ZTtcbiAgLy8gICAgIHRoaXMuc2V0VG9rZW5pemVkRGF0YShzdGFydFBheW1lbnRGbG93RXZlbnQpO1xuICAvLyAgICAgdGhpcy5wb3N0RXZlbnRUb0ZyYW1lKGVsZW1lbnQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgLy8gICAgIC8vIGVtaXRFdmVudChlbGVtZW50Lm5vZGUuY29udGVudFdpbmRvdyEsIHRoaXMuZm9ybUlkLCBlbGVtZW50SWQsIHN0YXJ0UGF5bWVudEZsb3dFdmVudCwgdGhpcy5jb25maWcuYmFzZVVybCEpO1xuICAvLyAgICAgYnJlYWs7XG4gIC8vICAgfVxuICAvLyB9XG4gIHBvc3RFdmVudFRvRnJhbWUoc291cmNlLCBlbGVtZW50SWQsIGRhdGEpIHtcbiAgICBlbWl0RXZlbnQoc291cmNlLCB0aGlzLmZvcm1JZCwgZWxlbWVudElkLCBkYXRhLCB0aGlzLmNvbmZpZy5iYXNlVXJsKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVDb25uZWN0aW9uKGlmcmFtZSwgY2hpbGRPcmlnaW4pIHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3RUb0NoaWxkKHtcbiAgICBpZnJhbWUsXG4gICAgZGVidWc6IHRydWUsXG4gICAgY2hpbGRPcmlnaW5cbiAgfSk7XG4gIGNvbnN0IGNvbm5lY3Rpb25PYmogPSBhd2FpdCBjb25uZWN0aW9uLnByb21pc2U7XG4gIGNvbnN0IGlzVmFsaWRPYmplY3QgPSBhd2FpdCBjaGVja0lmVmFsaWRDZGVDb25uZWN0aW9uT2JqZWN0KGNvbm5lY3Rpb25PYmopO1xuICBpZiAoIWlzUmVzdWx0VmFsaWQoY29ubmVjdGlvbk9iaiwgaXNWYWxpZE9iamVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEdvdCBpbnZhbGlkIENERSBjb25uZWN0aW9uIG9iamVjdGApO1xuICB9XG4gIHJldHVybiBjb25uZWN0aW9uT2JqO1xufVxuY2xhc3MgQ29ubmVjdGlvbk1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgfVxuICBhZGRDb25uZWN0aW9uKGlkLCBjb25uZWN0aW9uKSB7XG4gICAgdGhpcy5jb25uZWN0aW9ucy5zZXQoaWQsIGNvbm5lY3Rpb24pO1xuICB9XG4gIGdldENvbm5lY3Rpb24oKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvbnMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbiBub3QgZm91bmRcIik7XG4gICAgfVxuICAgIHJldHVybiBjb25uZWN0aW9uO1xuICB9XG4gIGdldEFsbENvbm5lY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25zO1xuICB9XG59XG5cbmNsYXNzIE9wZW5QYXlGb3JtIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy50cnlJbml0T2pzRmxvd3MgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vanNGbG93c0luaXRpYWxpemF0aW9uICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5jZGVMb2FkZWRQYXlsb2FkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyLmdldEFsbENvbm5lY3Rpb25zKCkuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm9qc0Zsb3dzSW5pdGlhbGl6YXRpb24gPSBpbml0aWFsaXplT2pzRmxvd3ModGhpcy5jcmVhdGVPanNGbG93Q29udGV4dCgpKTtcbiAgICAgIHRoaXMub2pzRmxvd3NJbml0aWFsaXphdGlvbi5zdHJpcGVQUi5zdWJzY3JpYmUoKHN0YXR1cykgPT4gdGhpcy5vblN0cmlwZVBSU3RhdHVzQ2hhbmdlKHN0YXR1cykpO1xuICAgIH07XG4gICAgdGhpcy5vbkNkZUxvYWRlZCA9IChwYXlsb2FkKSA9PiB7XG4gICAgICBpZiAodGhpcy5jZGVMb2FkZWRQYXlsb2FkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2RlTG9hZGVkUGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgICB0aGlzLnRyeUluaXRPanNGbG93cygpO1xuICAgIH07XG4gICAgdGhpcy5vblN0cmlwZVBSU3RhdHVzQ2hhbmdlID0gKGluaXRTdGF0dXMpID0+IHtcbiAgICAgIGlmIChpbml0U3RhdHVzLnN0YXR1cyA9PT0gXCJsb2FkaW5nXCIpIHtcbiAgICAgICAgdGhpcy5jb25maWcub25QYXltZW50UmVxdWVzdExvYWQ/Lih7IGFwcGxlX3BheTogUFJfTE9BRElORywgZ29vZ2xlX3BheTogUFJfTE9BRElORyB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaW5pdFN0YXR1cy5zdGF0dXMgPT09IFwiZXJyb3JcIikge1xuICAgICAgICB0aGlzLmNvbmZpZy5vblBheW1lbnRSZXF1ZXN0TG9hZD8uKHsgYXBwbGVfcGF5OiBQUl9FUlJPUiwgZ29vZ2xlX3BheTogUFJfRVJST1IgfSk7XG4gICAgICB9IGVsc2UgaWYgKGluaXRTdGF0dXMuc3RhdHVzID09PSBcImxvYWRlZFwiKSB7XG4gICAgICAgIGNvbnN0IGluaXRSZXN1bHQgPSBpbml0U3RhdHVzLnJlc3VsdDtcbiAgICAgICAgY29uc3QgY2FuQXBwbGVQYXkgPSBpbml0UmVzdWx0LmlzQXZhaWxhYmxlICYmIGluaXRSZXN1bHQuYXZhaWxhYmxlUHJvdmlkZXJzLmFwcGxlUGF5O1xuICAgICAgICBjb25zdCBjYW5Hb29nbGVQYXkgPSBpbml0UmVzdWx0LmlzQXZhaWxhYmxlICYmIGluaXRSZXN1bHQuYXZhaWxhYmxlUHJvdmlkZXJzLmdvb2dsZVBheTtcbiAgICAgICAgdGhpcy5jb25maWcub25QYXltZW50UmVxdWVzdExvYWQ/Lih7XG4gICAgICAgICAgYXBwbGVfcGF5OiB7XG4gICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaXNBdmFpbGFibGU6IGNhbkFwcGxlUGF5LFxuICAgICAgICAgICAgc3RhcnRGbG93OiBhc3luYyAodXNlclBhcmFtcykgPT4gY2FuQXBwbGVQYXkgPyB0aGlzLnN1Ym1pdFBheW1lbnRSZXF1ZXN0KFwiYXBwbGVfcGF5XCIsIGluaXRSZXN1bHQsIHVzZXJQYXJhbXMpIDogdm9pZCAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBnb29nbGVfcGF5OiB7XG4gICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaXNBdmFpbGFibGU6IGNhbkdvb2dsZVBheSxcbiAgICAgICAgICAgIHN0YXJ0RmxvdzogYXN5bmMgKHVzZXJQYXJhbXMpID0+IGNhbkdvb2dsZVBheSA/IHRoaXMuc3VibWl0UGF5bWVudFJlcXVlc3QoXCJnb29nbGVfcGF5XCIsIGluaXRSZXN1bHQsIHVzZXJQYXJhbXMpIDogdm9pZCAwXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuc3VibWl0UGF5bWVudFJlcXVlc3QgPSAocHJvdmlkZXIsIGluaXRSZXN1bHQsIHBhcmFtcykgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY3JlYXRlT2pzRmxvd0NvbnRleHQoKTtcbiAgICAgIHJldHVybiBPanNGbG93cy5zdHJpcGVQUi5ydW4oe1xuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IGZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QoY29udGV4dC5jaGVja291dFBheW1lbnRNZXRob2RzLCBwcm92aWRlciksXG4gICAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IHRoaXMuZ2V0Tm9uQ2RlRm9ybUlucHV0cygpLFxuICAgICAgICBmbG93Q2FsbGJhY2tzOiB0aGlzLmNyZWF0ZU9qc0Zsb3dDYWxsYmFja3MoKSxcbiAgICAgICAgY3VzdG9tUGFyYW1zOiB7IHByb3ZpZGVyLCBvdmVycmlkZVBheW1lbnRSZXF1ZXN0OiBwYXJhbXM/Lm92ZXJyaWRlUGF5bWVudFJlcXVlc3QgfSxcbiAgICAgICAgaW5pdFJlc3VsdFxuICAgICAgfSk7XG4gICAgfTtcbiAgICBPcGVuUGF5Rm9ybS5hc3NpZ25Bc1NpbmdsZXRvbih0aGlzKTtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uY29uZmlnLCBiYXNlVXJsOiBjb25maWcuYmFzZVVybCA/PyBcImh0dHBzOi8vY2RlLmdldG9wZW5wYXkuY29tXCIgfTtcbiAgICB0aGlzLmVsZW1lbnRzID0gbnVsbDtcbiAgICB0aGlzLmZvcm1JZCA9IGBvcGpzLWZvcm0tJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xuICAgIHRoaXMucmVmZXJlciA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gICAgdGhpcy5mb3JtVGFyZ2V0ID0gY29uZmlnLmZvcm1UYXJnZXQgPz8gXCJib2R5XCI7XG4gICAgdGhpcy5mb3JtUHJvcGVydGllcyA9IHsgaGVpZ2h0OiBcIjFweFwiIH07XG4gICAgdGhpcy5jZGVMb2FkZWRQYXlsb2FkID0gbnVsbDtcbiAgICB0aGlzLm9qc0Zsb3dzSW5pdGlhbGl6YXRpb24gPSBudWxsO1xuICAgIHRoaXMuY2hlY2tvdXRGaXJlZCA9IGZhbHNlO1xuICAgIHRoaXMuY29ubmVjdGlvbk1hbmFnZXIgPSBuZXcgQ29ubmVjdGlvbk1hbmFnZXIoKTtcbiAgICB0aGlzLmV2ZW50SGFuZGxlciA9IG5ldyBPcGVuUGF5Rm9ybUV2ZW50SGFuZGxlcih0aGlzKTtcbiAgICB0aGlzLm9qc1ZlcnNpb24gPSBcIjAuMS42XCI7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuZXZlbnRIYW5kbGVyLmhhbmRsZU1lc3NhZ2UuYmluZCh0aGlzLmV2ZW50SGFuZGxlcikpO1xuICB9XG4gIHN0YXRpYyB7XG4gICAgdGhpcy5vanNGbG93cyA9IE9qc0Zsb3dzO1xuICB9XG4gIC8qKlxuICAgKiBBc3NpZ24gdGhlIGluc3RhbmNlIHRvIHRoZSB3aW5kb3cgYXMgYSBzaW5nbGV0b25cbiAgICogQHBhcmFtIGZvcm0gLSBUaGUgT3BlblBheUZvcm0gaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3NpZ25Bc1NpbmdsZXRvbihmb3JtKSB7XG4gICAgaWYgKE9wZW5QYXlGb3JtLmdldEluc3RhbmNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk9wZW5QYXkgaW5zdGFuY2UgYWxyZWFkeSBleGlzdHMuIE9ubHkgb25lIGluc3RhbmNlIGlzIGFsbG93ZWQuXCIpO1xuICAgIH1cbiAgICB3aW5kb3dbXCJvanNcIl0gPSBmb3JtO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBPcGVuUGF5Rm9ybVxuICAgKiBAcmV0dXJucyBUaGUgT3BlblBheUZvcm0gaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICByZXR1cm4gd2luZG93W1wib2pzXCJdID8/IG51bGw7XG4gIH1cbiAgZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbk1hbmFnZXI7XG4gIH1cbiAgc2V0Rm9ybUhlaWdodChoZWlnaHQpIHtcbiAgICB0aGlzLmZvcm1Qcm9wZXJ0aWVzLmhlaWdodCA9IGhlaWdodDtcbiAgICBpZiAodGhpcy5lbGVtZW50cykge1xuICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLmVsZW1lbnRzKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIGVsZW1lbnQubm9kZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgY3JlYXRlRWxlbWVudChlbGVtZW50VmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghdGhpcy5jb25maWcpIHRocm93IG5ldyBFcnJvcihcIk9wZW5QYXkgZm9ybSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgY29uc3QgdHlwZSA9IEVsZW1lbnRUeXBlLnBhcnNlKGVsZW1lbnRWYWx1ZSk7XG4gICAgY29uc3QgZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gdGhpcy5idWlsZFF1ZXJ5U3RyaW5nKG9wdGlvbnMpO1xuICAgIGZyYW1lLm5hbWUgPSBgJHt0eXBlfS1lbGVtZW50YDtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGAvYXBwL3YxLyR7ZnJhbWUubmFtZX1gLCB0aGlzLmNvbmZpZy5iYXNlVXJsKTtcbiAgICB1cmwuc2VhcmNoID0gcXVlcnlTdHJpbmcudG9TdHJpbmcoKTtcbiAgICBmcmFtZS5zcmMgPSB1cmwuaHJlZjtcbiAgICB0aGlzLmNvbmZpZy5fZnJhbWVVcmwgPSB1cmw7XG4gICAgZnJhbWUuc3R5bGUuYm9yZGVyID0gXCJub25lXCI7XG4gICAgZnJhbWUuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcbiAgICBjb25zdCBlbGVtZW50ID0ge1xuICAgICAgdHlwZSxcbiAgICAgIG5vZGU6IGZyYW1lLFxuICAgICAgbW91bnQ6IChzZWxlY3RvcikgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik/LmFwcGVuZENoaWxkKGZyYW1lKVxuICAgIH07XG4gICAgdGhpcy5jb25uZWN0VG9FbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmICh0aGlzLmVsZW1lbnRzKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW3R5cGVdID0gZWxlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50cyA9IHsgW3R5cGVdOiBlbGVtZW50IH07XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG4gIGJ1aWxkUXVlcnlTdHJpbmcob3B0aW9ucykge1xuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIHF1ZXJ5U3RyaW5nLmFwcGVuZChcInJlZmVyZXJcIiwgdGhpcy5yZWZlcmVyKTtcbiAgICBxdWVyeVN0cmluZy5hcHBlbmQoXCJmb3JtSWRcIiwgdGhpcy5mb3JtSWQpO1xuICAgIGlmIChvcHRpb25zLnN0eWxlcykge1xuICAgICAgcXVlcnlTdHJpbmcuYXBwZW5kKFwic3R5bGVzXCIsIGNvbnZlcnRTdHlsZXNUb1F1ZXJ5U3RyaW5nKG9wdGlvbnMuc3R5bGVzKSk7XG4gICAgfVxuICAgIHF1ZXJ5U3RyaW5nLmFwcGVuZChcInNlY3VyZVRva2VuXCIsIHRoaXMuY29uZmlnLmNoZWNrb3V0U2VjdXJlVG9rZW4pO1xuICAgIHJldHVybiBxdWVyeVN0cmluZztcbiAgfVxuICBjb25uZWN0VG9FbGVtZW50KGVsZW1lbnQpIHtcbiAgICBjcmVhdGVDb25uZWN0aW9uKGVsZW1lbnQubm9kZSkudGhlbigoY29ubikgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uTWFuYWdlci5hZGRDb25uZWN0aW9uKGVsZW1lbnQudHlwZSwgY29ubik7XG4gICAgICB0aGlzLnRyeUluaXRPanNGbG93cygpO1xuICAgIH0pLmNhdGNoKChlcnIpID0+IHZvaWQgMCk7XG4gIH1cbiAgZ2V0Rm9ybURpdigpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmZvcm1UYXJnZXQpID8/IGRvY3VtZW50LmJvZHk7XG4gIH1cbiAgY3JlYXRlT2pzRmxvd0NvbnRleHQoKSB7XG4gICAgY29uc3QgY2RlQ29ubmVjdGlvbnMgPSB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyLmdldEFsbENvbm5lY3Rpb25zKCk7XG4gICAgaWYgKCF0aGlzLmNkZUxvYWRlZFBheWxvYWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlcXVlc3RlZCBjb250ZXh0IHdoaWxlIENERSBub3QgeWV0IGxvYWRlZFwiKTtcbiAgICB9XG4gICAgaWYgKGNkZUNvbm5lY3Rpb25zLnNpemUgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIENERSBjb25uZWN0aW9ucyBmb3VuZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VVcmw6IG5ldyBVUkwodGhpcy5jb25maWcuYmFzZVVybCA/PyBGUkFNRV9CQVNFX1VSTCkub3JpZ2luLFxuICAgICAgZm9ybURpdjogdGhpcy5nZXRGb3JtRGl2KCksXG4gICAgICBlbGVtZW50c1Nlc3Npb25JZDogdGhpcy5jZGVMb2FkZWRQYXlsb2FkLnNlc3Npb25JZCxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZHM6IHRoaXMuY2RlTG9hZGVkUGF5bG9hZC5jaGVja291dFBheW1lbnRNZXRob2RzLFxuICAgICAgY2RlQ29ubmVjdGlvbnNcbiAgICB9O1xuICB9XG4gIGdldE5vbkNkZUZvcm1JbnB1dHMoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybSh0aGlzLmdldEZvcm1EaXYoKSk7XG4gIH1cbiAgY3JlYXRlT2pzRmxvd0NhbGxiYWNrcygpIHtcbiAgICBjb25zdCBub09wID0gKCkgPT4ge1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uQ2hlY2tvdXRFcnJvcjogbWFrZUNhbGxiYWNrU2FmZShcIm9uQ2hlY2tvdXRFcnJvclwiLCB0aGlzLmNvbmZpZy5vbkNoZWNrb3V0RXJyb3IgPz8gbm9PcCksXG4gICAgICBvbkNoZWNrb3V0U3RhcnRlZDogbWFrZUNhbGxiYWNrU2FmZShcIm9uQ2hlY2tvdXRTdGFydGVkXCIsIHRoaXMuY29uZmlnLm9uQ2hlY2tvdXRTdGFydGVkID8/IG5vT3ApLFxuICAgICAgb25DaGVja291dFN1Y2Nlc3M6IG1ha2VDYWxsYmFja1NhZmUoXCJvbkNoZWNrb3V0U3VjY2Vzc1wiLCB0aGlzLmNvbmZpZy5vbkNoZWNrb3V0U3VjY2VzcyA/PyBub09wKSxcbiAgICAgIG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzczogbWFrZUNhbGxiYWNrU2FmZShcbiAgICAgICAgXCJvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3NcIixcbiAgICAgICAgdGhpcy5jb25maWcub25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzID8/IG5vT3BcbiAgICAgICksXG4gICAgICBvblZhbGlkYXRpb25FcnJvcjogbWFrZUNhbGxiYWNrU2FmZShcIm9uVmFsaWRhdGlvbkVycm9yXCIsIHRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yID8/IG5vT3ApXG4gICAgfTtcbiAgfVxuICBzdWJtaXQoKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuY3JlYXRlT2pzRmxvd0NvbnRleHQoKTtcbiAgICBPanNGbG93cy5jb21tb25DQy5ydW4oe1xuICAgICAgY29udGV4dCxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdChjb250ZXh0LmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIFwiY3JlZGl0X2NhcmRcIiksXG4gICAgICBub25DZGVGb3JtSW5wdXRzOiB0aGlzLmdldE5vbkNkZUZvcm1JbnB1dHMoKSxcbiAgICAgIGZsb3dDYWxsYmFja3M6IHRoaXMuY3JlYXRlT2pzRmxvd0NhbGxiYWNrcygpLFxuICAgICAgY3VzdG9tUGFyYW1zOiB2b2lkIDAsXG4gICAgICAvLyBUaGlzIGZsb3cgcmVxdWlyZXMgbm8gY3VzdG9tIHBhcmFtc1xuICAgICAgaW5pdFJlc3VsdDogdm9pZCAwXG4gICAgICAvLyBUaGlzIGZsb3cgcmVxdWlyZXMgbm8gaW5pdGlhbGl6YXRpb25cbiAgICB9KTtcbiAgfVxuICBvblBheW1lbnRSZXF1ZXN0RXJyb3IoZXJyTXNnKSB7XG4gICAgdGhpcy5jaGVja291dEZpcmVkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uQ2hlY2tvdXRFcnJvcikgdGhpcy5jb25maWcub25DaGVja291dEVycm9yKGVyck1zZyk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmVsZW1lbnRzID8/IHt9KSkge1xuICAgICAgZWxlbWVudC5ub2RlLnJlbW92ZSgpO1xuICAgIH1cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5ldmVudEhhbmRsZXIuaGFuZGxlTWVzc2FnZS5iaW5kKHRoaXMuZXZlbnRIYW5kbGVyKSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRmllbGROYW1lLCBPcGVuUGF5Rm9ybSB9OyJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsS0FBQUEsU0FBUztBQUNsQixTQUFTLE1BQUFDLFVBQVU7QUFDbkIsU0FBUyxrQkFBQUMsVUFBc0I7QUFFL0IsTUFBTUMsS0FBaUIsOEJBRWpCQyxLQUE0QkosRUFBRSxPQUFPO0FBQUEsRUFDekMsTUFBTUEsRUFBRSxPQUFPO0FBQUEsRUFDZixLQUFLQSxFQUFFLE1BQU1BLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDdkIsS0FBS0EsRUFBRSxPQUFPO0FBQUEsRUFDZCxLQUFLQSxFQUFFLE9BQU87QUFDaEIsQ0FBQyxHQUNLSyxLQUFrQ0wsRUFBRSxNQUFNSSxFQUF5QixHQUNuRUUsS0FBZ0JOLEVBQUUsT0FBTztBQUFBLEVBQzdCLE1BQU1BLEVBQUUsT0FBTztBQUFBLEVBQ2YsU0FBU0EsRUFBRSxPQUFPO0FBQUEsRUFDbEIsTUFBTUEsRUFBRSxNQUFNQSxFQUFFLE9BQU8sQ0FBQztBQUMxQixDQUFDLEdBQ0tPLEtBQWlCUCxFQUFFLE1BQU1NLEVBQWEsR0FDdENFLEtBQWtDO0FBQUEsRUFDdEMsbUJBQW1CO0FBQ3JCLEdBQ01DLElBQTBCLENBQUNDLE1BQW1CO0FBQ2xELFFBQU1DLElBQU1ELEVBQWUsWUFBWSxFQUFFLEtBQUs7QUFDOUMsU0FBT0YsR0FBZ0NHLENBQUcsS0FBS0Q7QUFDakQsR0FDTUUsS0FBMEIsQ0FBQ0MsTUFBUTtBQUN2QyxNQUFJO0FBRUYsV0FBTyxPQURRLEtBQUss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QXNCbUksR0FBUTtBQUM1QixTQUFLLGdCQUFnQixJQUNqQixLQUFLLE9BQU8sbUJBQWlCLEtBQUssT0FBTyxnQkFBZ0JBLENBQU07QUFBQSxFQUNyRTtBQUFBLEVBQ0EsVUFBVTtBQUNSLGVBQVdSLEtBQVcsT0FBTyxPQUFPLEtBQUssWUFBWSxDQUFDLENBQUM7QUFDckQsTUFBQUEsRUFBUSxLQUFLLE9BQU87QUFFdEIsV0FBTyxvQkFBb0IsV0FBVyxLQUFLLGFBQWEsY0FBYyxLQUFLLEtBQUssWUFBWSxDQUFDO0FBQUEsRUFDL0Y7QUFDRjtBQWxJSVYsRUFBSyxXQUFXckU7QUF4RXBCLElBQU13RixLQUFObkI7IiwKICAibmFtZXMiOiBbInoiLCAidjQiLCAiY29ubmVjdFRvQ2hpbGQiLCAiRlJBTUVfQkFTRV9VUkwiLCAiUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlIiwgIlpvZEZpZWxkRXJyb3IiLCAiWm9kRmllbGRFcnJvcnMiLCAiTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRSIsICJnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZSIsICJvZ0Vycm9yTWVzc2FnZSIsICJrZXkiLCAiaXNTdHJpbmdpZmllZEpzb25PYmplY3QiLCAic3RyIiwgImNyZWF0ZU1lc3NhZ2VGcm9tUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IiLCAicmVzcG9uc2UiLCAiZXJyIiwgImNyZWF0ZU1lc3NhZ2VGcm9tWm9kRmllbGRFcnJvcnMiLCAiZXJyb3JzIiwgImdldEVycm9yTWVzc2FnZSIsICJlIiwgIm9iaiIsICJlMiIsICJtYWtlQ2FsbGJhY2tTYWZlIiwgImNhbGxiYWNrTmFtZSIsICJmbiIsICJhcmdzIiwgIlJlcXVpcmVkU3RyaW5nIiwgIk9wdGlvbmFsU3RyaW5nIiwgIm51bGxPclVuZGVmT3IkMSIsICJ6VHlwZSIsICJGaWVsZE5hbWUiLCAiRmllbGROYW1lMiIsICJGaWVsZE5hbWVFbnVtIiwgIlByaXZhdGVGaWVsZE5hbWUiLCAiUHJpdmF0ZUZpZWxkTmFtZTIiLCAiUHJpdmF0ZUZpZWxkTmFtZUVudW0iLCAiQWxsRmllbGROYW1lcyIsICJFbGVtZW50VHlwZUVudW0iLCAiRWxlbWVudFR5cGVFbnVtMiIsICJFbGVtZW50VHlwZSIsICJDaGVja291dFBheW1lbnRNZXRob2QkMSIsICJQYXltZW50TWV0aG9kTWluaW1hbCIsICJFdmVudFR5cGUiLCAiR2VuZXJpY0V2ZW50VHlwZSIsICJHZW5lcmljRXZlbnRQYXlsb2FkIiwgIklucHV0RXZlbnRUeXBlIiwgIklucHV0RXZlbnRQYXlsb2FkIiwgIkVycm9yRXZlbnRUeXBlIiwgIkVycm9yRXZlbnRQYXlsb2FkIiwgIlZhbGlkYXRpb25FcnJvckV2ZW50VHlwZSIsICJWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQiLCAiTGF5b3V0RXZlbnRQYXlsb2FkIiwgIkxvYWRlZEV2ZW50UGF5bG9hZCIsICJQYXltZW50Rmxvd1N0YXJ0ZWRFdmVudFBheWxvYWQiLCAiU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQiLCAiUmVxdWlyZWRGb3JtRmllbGRzIiwgIlBSRm9ybUZpZWxkcyIsICJTdWJtaXRFdmVudFR5cGUiLCAiU3VibWl0RXZlbnRQYXlsb2FkIiwgIlRva2VuaXplU3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQiLCAiRXZlbnRQYXlsb2FkIiwgIkVsZW1lbnRFdmVudCIsICJDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSIsICJGaWVsZFZhbGlkYXRpb25FcnJvciIsICJUb2tlbml6ZUNhcmRFcnJvclJlc3BvbnNlIiwgIlRva2VuaXplQ2FyZFJlc3BvbnNlIiwgIlRocmVlRFNTdGF0dXMiLCAiVGhyZWVEU1N0YXR1czIiLCAiUGluZzNEU1N0YXR1c1Jlc3BvbnNlIiwgIkNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJleHRyYWN0SXNzdWVzUGVyRmllbGQiLCAiZXJyb3IiLCAiaXNzdWVzUGVyRmllbGQiLCAidmFsdWUiLCAiZmllbGROYW1lIiwgIlN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YSIsICJvdXJDdXJyZW5jeVRvVGhlaXJzIiwgImdldExvYWRlZFN0cmlwZSIsICJwdWJsaXNoYWJsZUtleSIsICJpIiwgImlzU3RyaXBlSnNQcmVzZW50IiwgInNsZWVwIiwgImNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0IiwgInN0cmlwZVB1YktleSIsICJ0b3RhbEFtb3VudEF0b20iLCAiY3VycmVuY3kiLCAiaXNBbW91bnRQZW5kaW5nIiwgImlzTGlua09ubHkiLCAic3RyaXBlIiwgInN0cmlwZUN1cnJlbmN5IiwgInRpbWVvdXRNcyIsICJyZXNvbHZlIiwgIndhaXRGb3JVc2VyVG9BZGRQYXltZW50TWV0aG9kIiwgInBheW1lbnRSZXF1ZXN0IiwgInJlamVjdCIsICJldnQiLCAiY29uZmlybVN0cmlwZVByUE0iLCAibmV4dEFjdGlvbk1ldGFkYXRhIiwgInN0cmlwZVBtIiwgImNvbmZpcm1SZXN1bHQiLCAibGF1bmNoU3RyaXBlM0RTRGlhbG9nRmxvdyIsICJfYSIsICJfYiIsICJfYyIsICJfZCIsICJyZXN1bHRTdGF0dXMiLCAiY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmciLCAic3R5bGVzIiwgImNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybSIsICJmb3JtRGl2IiwgImluaXRpYWxEaWN0IiwgImFjYyIsICJpbnB1dCIsICJwYXJzZUV2ZW50UGF5bG9hZCIsICJldmVudERhdGEiLCAiZW1pdEV2ZW50IiwgInRhcmdldCIsICJmb3JtSWQiLCAiZWxlbWVudElkIiwgInBheWxvYWQiLCAiYmFzZVVybCIsICJldmVudCIsICJjaGVja0lmVmFsaWRDZGVDb25uZWN0aW9uT2JqZWN0IiwgInBpbmciLCAicmVzdWx0IiwgImlzUmVzdWx0VmFsaWQiLCAiaXNWYWxpZCIsICJudWxsT3JVbmRlZk9yIiwgIkNERVJlc3BvbnNlRXJyb3IiLCAiQ3VycmVuY3lFbnVtIiwgIkNvdXBvbk1pbmltYWwiLCAiTGluZUl0ZW0iLCAiQnJhbmRTZXR0aW5ncyIsICJCcmFuZCIsICJDaGVja291dFBheW1lbnRNZXRob2QiLCAiU3Vic2NyaXB0aW9uSXRlbU1pbmltYWwiLCAiU3Vic2NyaXB0aW9uTWluaW1hbCIsICJJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwiLCAiSW52b2ljZUxpbmVJdGVtTWluaW1hbCIsICJEaXNjb3VudE1pbmltYWwiLCAiSW52b2ljZU1pbmltYWwiLCAiQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2VNaW5pbWFsIiwgIlByZXZpZXdDaGVja291dFJlc3BvbnNlIiwgIl9QYXltZW50Rm9ybVByZWZpbGxDb21tb24iLCAiUGF5bWVudEZvcm1QcmVmaWxsIiwgIkNvbXBsZXRlZEZvcm1QcmVmaWxsIiwgIkV4cGlyZWRGb3JtUHJlZmlsbCIsICJDaGVja291dFN1Y2Nlc3NSZXNwb25zZSIsICJTZXR1cENoZWNrb3V0UmVzcG9uc2UiLCAiUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IiLCAiU3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlIiwgIlN0YXJ0UGF5bWVudEZsb3dGb3JDQ1Jlc3BvbnNlIiwgInN1bSIsICJhcnIiLCAiYSIsICJiIiwgImZpeFByb3RvIiwgInByb3RvdHlwZSIsICJzZXRQcm90b3R5cGVPZiIsICJmaXhTdGFjayIsICJjYXB0dXJlU3RhY2tUcmFjZSIsICJfX2V4dGVuZHMiLCAiX2V4dGVuZFN0YXRpY3MiLCAiZCIsICJwIiwgIl9fIiwgIkN1c3RvbUVycm9yIiwgIl9zdXBlciIsICJtZXNzYWdlIiwgIm9wdGlvbnMiLCAiX25ld1RhcmdldCIsICJfdGhpcyIsICJDZGVFcnJvciIsICJmcmllbmRseU1lc3NhZ2UiLCAicXVlcnlDREUiLCAiY2RlQ29ubiIsICJkYXRhIiwgInJlc3BvbnNlU2NoZW1hIiwgImlzQ0RFUmVzcG9uc2VFcnJvciIsICJjaGVja0lmQ29uZm9ybXNUb1NjaGVtYSIsICJzY2hlbWEiLCAiZ2V0Q2hlY2tvdXRQcmV2aWV3IiwgInJlcXVlc3QiLCAiZ2V0UHJlZmlsbCIsICJzdGFydFBheW1lbnRGbG93Rm9yQ0MiLCAic3RhcnRQYXltZW50Rmxvd0ZvclBSIiwgImNvbmZpcm1QYXltZW50RmxvdyIsICJnZXRDaGVja291dFZhbHVlIiwgInNlY3VyZVRva2VuIiwgInByb21vQ29kZSIsICJjaGVja291dFByZXZpZXciLCAiY3VycmVuY2llcyIsICJpbnYiLCAiYW1vdW50QXRvbSIsICJnZXRDaGVja291dFByZXZpZXdBbW91bnQiLCAiaXNTZXR1cE1vZGUiLCAidG9rZW5pemVDYXJkT25BbGxDb25uZWN0aW9ucyIsICJhbGxDZGVDb25uZWN0aW9ucyIsICJjaGVja291dENhcmRFbGVtZW50cyIsICJzZXR1cENoZWNrb3V0IiwgInBlcmZvcm1DaGVja291dCIsICJDREVfUE9MTElOR19JTlRFUlZBTCIsICJwaW5nQ2RlRm9yM2RzU3RhdHVzIiwgImlmcmFtZSIsICJjaGlsZE9yaWdpbiIsICJjb25uZWN0aW9uT2JqIiwgInN0eWxlcyQyIiwgImNyZWF0ZUFuZE9wZW5GcmFtZSIsICJ1cmwiLCAidGVtcGxhdGUiLCAiaG9zdCIsICJzaGFkb3dSb290IiwgImNhbmNlbEJ1dHRvbiIsICJzdGFydFBvbGxpbmciLCAib25TdWNjZXNzIiwgImhhbmRsZVBvbGxpbmciLCAic3RhdHVzIiwgInBvbGxpbmdJbnRlcnZhbCIsICJoYW5kbGVFdmVudHMiLCAiZWxlbWVudHMiLCAiaGFuZGxlQ2FuY2VsIiwgInN0YXJ0M2RzVmVyaWZpY2F0aW9uIiwgImNsZWFudXBFdmVudExpc3RlbmVycyIsICJBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUIiwgIndyYXBBbnNpMTYiLCAib2Zmc2V0IiwgImNvZGUiLCAid3JhcEFuc2kyNTYiLCAid3JhcEFuc2kxNm0iLCAicmVkIiwgImdyZWVuIiwgImJsdWUiLCAic3R5bGVzJDEiLCAiZm9yZWdyb3VuZENvbG9yTmFtZXMiLCAiYmFja2dyb3VuZENvbG9yTmFtZXMiLCAiYXNzZW1ibGVTdHlsZXMiLCAiY29kZXMiLCAiZ3JvdXBOYW1lIiwgImdyb3VwIiwgInN0eWxlTmFtZSIsICJzdHlsZSIsICJoZXgiLCAibWF0Y2hlcyIsICJjb2xvclN0cmluZyIsICJjaGFyYWN0ZXIiLCAiaW50ZWdlciIsICJyZW1haW5kZXIiLCAiYW5zaVN0eWxlcyIsICJsZXZlbCIsICJicmFuZCIsICJjb2xvclN1cHBvcnQiLCAic3VwcG9ydHNDb2xvciIsICJzdHJpbmdSZXBsYWNlQWxsIiwgInN0cmluZyIsICJzdWJzdHJpbmciLCAicmVwbGFjZXIiLCAiaW5kZXgiLCAic3Vic3RyaW5nTGVuZ3RoIiwgImVuZEluZGV4IiwgInJldHVyblZhbHVlIiwgInN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleCIsICJwcmVmaXgiLCAicG9zdGZpeCIsICJnb3RDUiIsICJzdGRvdXRDb2xvciIsICJzdGRlcnJDb2xvciIsICJHRU5FUkFUT1IiLCAiU1RZTEVSIiwgIklTX0VNUFRZIiwgImxldmVsTWFwcGluZyIsICJhcHBseU9wdGlvbnMiLCAib2JqZWN0IiwgImNvbG9yTGV2ZWwiLCAiY2hhbGtGYWN0b3J5IiwgImNoYWxrIiwgInN0cmluZ3MiLCAiY3JlYXRlQ2hhbGsiLCAiYnVpbGRlciIsICJjcmVhdGVCdWlsZGVyIiwgImNyZWF0ZVN0eWxlciIsICJnZXRNb2RlbEFuc2kiLCAibW9kZWwiLCAidHlwZSIsICJhcmd1bWVudHNfIiwgInVzZWRNb2RlbHMiLCAic3R5bGVyIiwgImJnTW9kZWwiLCAicHJvdG8iLCAib3BlbiIsICJjbG9zZSIsICJwYXJlbnQiLCAib3BlbkFsbCIsICJjbG9zZUFsbCIsICJzZWxmIiwgIl9zdHlsZXIiLCAiX2lzRW1wdHkiLCAiYXBwbHlTdHlsZSIsICJsZkluZGV4IiwgImFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzIiwgInNpbXBsZU9qc0Zsb3ciLCAicGFyYW1zIiwgImZsb3dSZXN1bHQiLCAiYWRkRXJyb3JDYXRjaGVyRm9ySW5pdCIsICJpbml0IiwgImVycl9fIiwgImNyZWF0ZU9qc0Zsb3dMb2dnZXJzIiwgImxvZyIsICJsb2dfXyQzIiwgImVycl9fJDQiLCAidmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0MiLCAibm9uQ2RlRm9ybUlucHV0cyIsICJvblZhbGlkYXRpb25FcnJvciIsICJmb3JtYXR0ZWQiLCAiaXNzdWVzIiwgInZhbGlkYXRlVG9rZW5pemVDYXJkUmVzdWx0cyIsICJ0b2tlbml6ZVJlc3VsdHMiLCAidG9rZW5pemVSZXN1bHQiLCAicGFyc2VkIiwgImVycl9fJDMiLCAicGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSIsICJmaW5kQ3BtTWF0Y2hpbmdUeXBlIiwgImFsbENQTXMiLCAiem9kTW9kZWwiLCAiY3BtIiwgImNwbTIiLCAibG9nX18kMiIsICJlcnJfXyQyIiwgInN0cmlwZUxvZ19fIiwgInJ1bkNvbW1vbkNjRmxvdyIsICJjb250ZXh0IiwgImNoZWNrb3V0UGF5bWVudE1ldGhvZCIsICJmbG93Q2FsbGJhY2tzIiwgImFueUNkZUNvbm5lY3Rpb24iLCAicHJlZmlsbCIsICJub25DZGVGb3JtRmllbGRzIiwgInRva2VuaXplQ2FyZFJlc3VsdHMiLCAiY29tbW9uQ2hlY2tvdXRQYXJhbXMiLCAic2hvdWxkVXNlTmV3RmxvdyIsICJzdGFydFBmUmVzdWx0IiwgImNvbW1vbkNDM0RTRmxvdyIsICJzdHJpcGVDQzNEU0Zsb3ciLCAiY3JlYXRlZFBheW1lbnRNZXRob2QiLCAicGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEiLCAic3RyaXBlQWN0aW9uIiwgImFjdGlvbiIsICJwYXJzZUNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJjb21tb25BY3Rpb24iLCAibG9nX18kMSIsICJlcnJfXyQxIiwgIlN0cmlwZVByQ3BtIiwgImluaXRTdHJpcGVQckZsb3ciLCAiaW5pdGlhbFByZXZpZXciLCAicHIiLCAiY2FuTWFrZVBheW1lbnQiLCAicnVuU3RyaXBlUHJGbG93IiwgImN1c3RvbVBhcmFtcyIsICJpbml0UmVzdWx0IiwgImNsZWFuZWRGb3JtSW5wdXRzIiwgIm92ZXJyaWRlRW1wdHlaaXBDb2RlIiwgIm92ZXJyaWRlIiwgInVwZGF0ZVByV2l0aEFtb3VudCIsICJzdHJpcGVQbUFkZGVkRXZlbnQiLCAic3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlIiwgInBhcnNlUFJOZXh0QWN0aW9uTWV0YWRhdGEiLCAiY2hlY2tvdXRSZXF1ZXN0IiwgImZvcm1JbnB1dHMiLCAibmV3Rm9ybUlucHV0cyIsICJhbW91bnQiLCAiaXNQZW5kaW5nIiwgImZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QiLCAiY3BtcyIsICJ3aXRoUHJvdmlkZXIiLCAid2l0aFByb2Nlc3NvciIsICJPanNGbG93cyIsICJnZXREZWZhdWx0RXhwb3J0RnJvbUNqcyIsICJ4IiwgIk9ic2VydmFibGUkMiIsICJoYXNTeW1ib2wiLCAibmFtZSIsICJnZXRTeW1ib2wiLCAiU3ltYm9sSXRlcmF0b3IiLCAiU3ltYm9sT2JzZXJ2YWJsZSIsICJTeW1ib2xTcGVjaWVzIiwgImdldE1ldGhvZCIsICJnZXRTcGVjaWVzIiwgImN0b3IiLCAiT2JzZXJ2YWJsZSQxIiwgImlzT2JzZXJ2YWJsZSIsICJob3N0UmVwb3J0RXJyb3IiLCAiZW5xdWV1ZSIsICJjbGVhbnVwU3Vic2NyaXB0aW9uIiwgInN1YnNjcmlwdGlvbiIsICJjbGVhbnVwIiwgInVuc3Vic2NyaWJlIiwgImNsb3NlU3Vic2NyaXB0aW9uIiwgImZsdXNoU3Vic2NyaXB0aW9uIiwgInF1ZXVlIiwgIm5vdGlmeVN1YnNjcmlwdGlvbiIsICJvYnNlcnZlciIsICJtIiwgIm9uTm90aWZ5IiwgIlN1YnNjcmlwdGlvbiIsICJzdWJzY3JpYmVyIiwgInN1YnNjcmlwdGlvbk9ic2VydmVyIiwgIk9ic2VydmFibGUiLCAiZG9uZSIsICJDIiwgImhhc1NlZWQiLCAiaGFzVmFsdWUiLCAiZmlyc3QiLCAidmFsdWVzIiwgInNvdXJjZXMiLCAic3RhcnROZXh0IiwgIm5leHQiLCAidiIsICJzdWJzY3JpcHRpb25zIiwgIm91dGVyIiwgImlubmVyIiwgImNvbXBsZXRlSWZEb25lIiwgInMiLCAibWV0aG9kIiwgIm9ic2VydmFibGUiLCAiaXRlbSIsICJpdGVtcyIsICJ6ZW5PYnNlcnZhYmxlIiwgImxvZ19fIiwgImluaXRpYWxpemVPanNGbG93cyIsICJydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZSIsICJmbG93TmFtZSIsICJpbml0RmxvdyIsICJQUl9MT0FESU5HIiwgIlBSX0VSUk9SIiwgIk9wZW5QYXlGb3JtRXZlbnRIYW5kbGVyIiwgImZvcm1JbnN0YW5jZSIsICJoZWlnaHQiLCAiZmllbGQiLCAic291cmNlIiwgImNyZWF0ZUNvbm5lY3Rpb24iLCAiaXNWYWxpZE9iamVjdCIsICJDb25uZWN0aW9uTWFuYWdlciIsICJpZCIsICJjb25uZWN0aW9uIiwgIl9PcGVuUGF5Rm9ybSIsICJjb25maWciLCAiaW5pdFN0YXR1cyIsICJfZSIsICJfZiIsICJjYW5BcHBsZVBheSIsICJjYW5Hb29nbGVQYXkiLCAidXNlclBhcmFtcyIsICJwcm92aWRlciIsICJmb3JtIiwgImVsZW1lbnQiLCAiZWxlbWVudFZhbHVlIiwgImZyYW1lIiwgInF1ZXJ5U3RyaW5nIiwgInNlbGVjdG9yIiwgImNvbm4iLCAiY2RlQ29ubmVjdGlvbnMiLCAibm9PcCIsICJlcnJNc2ciLCAiT3BlblBheUZvcm0iXQp9Cg==
1617
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXguZXMuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IGNvbm5lY3RUb0NoaWxkIH0gZnJvbSAncGVucGFsJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5cbmNvbnN0IEZSQU1FX0JBU0VfVVJMID0gXCJodHRwczovL2NkZS5nZXRvcGVucGF5LmNvbVwiO1xuXG5jb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciQxID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LnN0cmluZygpLFxuICBsb2M6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gIG1zZzogei5zdHJpbmcoKSxcbiAgdXJsOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IFB5ZGFudGljVmFsaWRhdGlvbkVycm9yUmVzcG9uc2UgPSB6LmFycmF5KFB5ZGFudGljVmFsaWRhdGlvbkVycm9yJDEpO1xuY29uc3QgWm9kRmllbGRFcnJvciA9IHoub2JqZWN0KHtcbiAgY29kZTogei5zdHJpbmcoKSxcbiAgbWVzc2FnZTogei5zdHJpbmcoKSxcbiAgcGF0aDogei5hcnJheSh6LnN0cmluZygpKVxufSk7XG5jb25zdCBab2RGaWVsZEVycm9ycyA9IHouYXJyYXkoWm9kRmllbGRFcnJvcik7XG5jb25zdCBNQVBfVE9fSFVNQU5fRlJJRU5ETFlfTE9XRVJDQVNFID0ge1xuICBcImZhaWxlZCB0byBmZXRjaFwiOiBgQ29ubmVjdGlvbiBlcnJvcjogcGxlYXNlIGRvdWJsZSBjaGVjayBpZiB5b3UgYXJlIGNvbm5lY3RlZCB0byB0aGUgaW50ZXJuZXQsIHRoZW4gdHJ5IGFnYWluYFxufTtcbmNvbnN0IGdldEh1bWFuRnJpZW5kbHlNZXNzYWdlID0gKG9nRXJyb3JNZXNzYWdlKSA9PiB7XG4gIGNvbnN0IGtleSA9IG9nRXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICByZXR1cm4gTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRVtrZXldID8/IG9nRXJyb3JNZXNzYWdlO1xufTtcbmNvbnN0IGlzU3RyaW5naWZpZWRKc29uT2JqZWN0ID0gKHN0cikgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3RyKTtcbiAgICByZXR1cm4gdHlwZW9mIHBhcnNlZCA9PT0gXCJvYmplY3RcIjtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcbmNvbnN0IGNyZWF0ZU1lc3NhZ2VGcm9tUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IgPSAocmVzcG9uc2UpID0+IHtcbiAgaWYgKHJlc3BvbnNlLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZShyZXNwb25zZVswXS5tc2cpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGJ1bGxldGVkID0gcmVzcG9uc2UubWFwKChlcnIpID0+IGDigKIgJHtnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZShlcnIubXNnKX1gKS5qb2luKFwiXFxuXCIpO1xuICAgIHJldHVybiBgJHtgUGxlYXNlIGZpeCB0aGUgZm9sbG93aW5nIGVycm9yczpgfVxuJHtidWxsZXRlZH1gO1xuICB9XG59O1xuY29uc3QgY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyA9IChlcnJvcnMpID0+IHtcbiAgY29uc3QgbGlzdE9mRXJyb3JzID0gZXJyb3JzLm1hcCgoZXJyKSA9PiBgLSAke2Vyci5wYXRoLmpvaW4oXCIvXCIpfTogJHtlcnIubWVzc2FnZX1gKS5qb2luKFwiXFxuXCIpO1xuICByZXR1cm4gYEVuY291bnRlcmVkIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxuJHtsaXN0T2ZFcnJvcnN9YDtcbn07XG5jb25zdCBnZXRFcnJvck1lc3NhZ2UgPSAoZSkgPT4ge1xuICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgaWYgKGlzU3RyaW5naWZpZWRKc29uT2JqZWN0KGUubWVzc2FnZSkpIHtcbiAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UoZS5tZXNzYWdlKTtcbiAgICAgIGlmIChQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlLnNhZmVQYXJzZShvYmopLnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2VGcm9tUHlkYW50aWNWYWxpZGF0aW9uRXJyb3Iob2JqKTtcbiAgICAgIH0gZWxzZSBpZiAoWm9kRmllbGRFcnJvcnMuc2FmZVBhcnNlKG9iaikuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyhvYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGUubWVzc2FnZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldEh1bWFuRnJpZW5kbHlNZXNzYWdlKGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSk7XG4gICAgfSBjYXRjaCAoZTIpIHtcbiAgICAgIHJldHVybiBlMiArIFwiXCI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBlICsgXCJcIjtcbiAgfVxufTtcbmNvbnN0IG1ha2VDYWxsYmFja1NhZmUgPSAoY2FsbGJhY2tOYW1lLCBmbikgPT4ge1xuICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgfTtcbn07XG5cbmNvbnN0IFJlcXVpcmVkU3RyaW5nID0gei5zdHJpbmcoKS50cmltKCkubWluKDEsIHsgbWVzc2FnZTogYENhbm5vdCBiZSBibGFua2AgfSk7XG5jb25zdCBPcHRpb25hbFN0cmluZyA9IHouc3RyaW5nKCkudHJpbSgpLm9wdGlvbmFsKCk7XG5jb25zdCBudWxsT3JVbmRlZk9yJDEgPSAoelR5cGUpID0+IHoubnVsbGFibGUoelR5cGUub3B0aW9uYWwoKSk7XG52YXIgRmllbGROYW1lID0gLyogQF9fUFVSRV9fICovICgoRmllbGROYW1lMikgPT4ge1xuICBGaWVsZE5hbWUyW1wiRklSU1RfTkFNRVwiXSA9IFwiZmlyc3ROYW1lXCI7XG4gIEZpZWxkTmFtZTJbXCJMQVNUX05BTUVcIl0gPSBcImxhc3ROYW1lXCI7XG4gIEZpZWxkTmFtZTJbXCJFTUFJTFwiXSA9IFwiZW1haWxcIjtcbiAgRmllbGROYW1lMltcIlpJUF9DT0RFXCJdID0gXCJ6aXBDb2RlXCI7XG4gIEZpZWxkTmFtZTJbXCJDSVRZXCJdID0gXCJjaXR5XCI7XG4gIEZpZWxkTmFtZTJbXCJTVEFURVwiXSA9IFwic3RhdGVcIjtcbiAgRmllbGROYW1lMltcIkNPVU5UUllcIl0gPSBcImNvdW50cnlcIjtcbiAgRmllbGROYW1lMltcIkFERFJFU1NcIl0gPSBcImFkZHJlc3NcIjtcbiAgRmllbGROYW1lMltcIlBIT05FXCJdID0gXCJwaG9uZVwiO1xuICBGaWVsZE5hbWUyW1wiUFJPTU9USU9OX0NPREVcIl0gPSBcInByb21vdGlvbkNvZGVcIjtcbiAgcmV0dXJuIEZpZWxkTmFtZTI7XG59KShGaWVsZE5hbWUgfHwge30pO1xuY29uc3QgRmllbGROYW1lRW51bSA9IHoubmF0aXZlRW51bShGaWVsZE5hbWUpO1xudmFyIFByaXZhdGVGaWVsZE5hbWUgPSAvKiBAX19QVVJFX18gKi8gKChQcml2YXRlRmllbGROYW1lMikgPT4ge1xuICBQcml2YXRlRmllbGROYW1lMltcIkNBUkRfTlVNQkVSXCJdID0gXCJjYXJkTnVtYmVyXCI7XG4gIFByaXZhdGVGaWVsZE5hbWUyW1wiQ0FSRF9FWFBJUllcIl0gPSBcImNhcmRFeHBpcnlcIjtcbiAgUHJpdmF0ZUZpZWxkTmFtZTJbXCJDQVJEX0NWQ1wiXSA9IFwiY2FyZEN2Y1wiO1xuICByZXR1cm4gUHJpdmF0ZUZpZWxkTmFtZTI7XG59KShQcml2YXRlRmllbGROYW1lIHx8IHt9KTtcbmNvbnN0IFByaXZhdGVGaWVsZE5hbWVFbnVtID0gei5uYXRpdmVFbnVtKFByaXZhdGVGaWVsZE5hbWUpO1xuY29uc3QgQWxsRmllbGROYW1lcyA9IHoudW5pb24oW0ZpZWxkTmFtZUVudW0sIFByaXZhdGVGaWVsZE5hbWVFbnVtXSk7XG52YXIgRWxlbWVudFR5cGVFbnVtID0gLyogQF9fUFVSRV9fICovICgoRWxlbWVudFR5cGVFbnVtMikgPT4ge1xuICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRFwiXSA9IFwiY2FyZFwiO1xuICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRF9OVU1CRVJcIl0gPSBcImNhcmQtbnVtYmVyXCI7XG4gIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEX0VYUElSWVwiXSA9IFwiY2FyZC1leHBpcnlcIjtcbiAgRWxlbWVudFR5cGVFbnVtMltcIkNBUkRfQ1ZDXCJdID0gXCJjYXJkLWN2Y1wiO1xuICByZXR1cm4gRWxlbWVudFR5cGVFbnVtMjtcbn0pKEVsZW1lbnRUeXBlRW51bSB8fCB7fSk7XG5jb25zdCBFbGVtZW50VHlwZSA9IHoubmF0aXZlRW51bShFbGVtZW50VHlwZUVudW0pO1xuY29uc3QgQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEgPSB6Lm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6LnN0cmluZygpLFxuICBwcm9jZXNzb3JfbmFtZTogbnVsbE9yVW5kZWZPciQxKHouc3RyaW5nKCkpLFxuICBtZXRhZGF0YTogbnVsbE9yVW5kZWZPciQxKHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKVxufSk7XG5jb25zdCBQYXltZW50TWV0aG9kTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKClcbn0pO1xuei5vYmplY3Qoe1xuICBjYXJkTnVtYmVyOiBPcHRpb25hbFN0cmluZyxcbiAgZXhwaXJ5OiBPcHRpb25hbFN0cmluZyxcbiAgY3ZjOiBPcHRpb25hbFN0cmluZ1xufSk7XG56Lm9iamVjdCh7XG4gIGJhY2tncm91bmRDb2xvcjogT3B0aW9uYWxTdHJpbmcsXG4gIGNvbG9yOiBPcHRpb25hbFN0cmluZyxcbiAgZm9udEZhbWlseTogT3B0aW9uYWxTdHJpbmcsXG4gIGZvbnRTaXplOiBPcHRpb25hbFN0cmluZyxcbiAgZm9udFdlaWdodDogT3B0aW9uYWxTdHJpbmcsXG4gIG1hcmdpbjogT3B0aW9uYWxTdHJpbmcsXG4gIHBhZGRpbmc6IE9wdGlvbmFsU3RyaW5nLFxuICBsZXR0ZXJTcGFjaW5nOiBPcHRpb25hbFN0cmluZyxcbiAgbGluZUhlaWdodDogT3B0aW9uYWxTdHJpbmdcbn0pO1xuY29uc3QgRXZlbnRUeXBlID0gei5lbnVtKFtcbiAgLy8gRWxlbWVudCAtPiBGb3JtXG4gIFwiTEFZT1VUXCIsXG4gIFwiTE9BREVEXCIsXG4gIFwiQkxVUlwiLFxuICBcIkZPQ1VTXCIsXG4gIFwiQ0hBTkdFXCIsXG4gIFwiVE9LRU5JWkVfU1RBUlRFRFwiLFxuICBcIkNIRUNLT1VUX1NUQVJURURcIixcbiAgXCJQQVlNRU5UX0ZMT1dfU1RBUlRFRFwiLFxuICBcIlRPS0VOSVpFX1NVQ0NFU1NcIixcbiAgXCJDSEVDS09VVF9TVUNDRVNTXCIsXG4gIFwiTE9BRF9FUlJPUlwiLFxuICBcIlZBTElEQVRJT05fRVJST1JcIixcbiAgXCJUT0tFTklaRV9FUlJPUlwiLFxuICBcIkNIRUNLT1VUX0VSUk9SXCIsXG4gIFwiU0VUVVBfUEFZTUVOVF9NRVRIT0RfU1VDQ0VTU1wiLFxuICAvLyBGb3JtIC0+IEVsZW1lbnRcbiAgXCJUT0tFTklaRVwiLFxuICBcIkNIRUNLT1VUXCIsXG4gIFwiU1RBUlRfUEFZTUVOVF9GTE9XXCJcbl0pO1xuY29uc3QgR2VuZXJpY0V2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIlRPS0VOSVpFX1NUQVJURURcIiwgXCJDSEVDS09VVF9TVEFSVEVEXCJdKTtcbmNvbnN0IEdlbmVyaWNFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7IHR5cGU6IEdlbmVyaWNFdmVudFR5cGUgfSk7XG5jb25zdCBJbnB1dEV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIkJMVVJcIiwgXCJGT0NVU1wiLCBcIkNIQU5HRVwiXSk7XG5jb25zdCBJbnB1dEV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogSW5wdXRFdmVudFR5cGUsXG4gIGVsZW1lbnRUeXBlOiBQcml2YXRlRmllbGROYW1lRW51bSxcbiAgZXJyb3JzOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKClcbn0pO1xuY29uc3QgRXJyb3JFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJMT0FEX0VSUk9SXCIsIFwiVE9LRU5JWkVfRVJST1JcIiwgXCJDSEVDS09VVF9FUlJPUlwiXSk7XG5jb25zdCBFcnJvckV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogRXJyb3JFdmVudFR5cGUsXG4gIG1lc3NhZ2U6IFJlcXVpcmVkU3RyaW5nLFxuICBoZWFkZXJzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpXG59KTtcbmNvbnN0IFZhbGlkYXRpb25FcnJvckV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIlZBTElEQVRJT05fRVJST1JcIl0pO1xuY29uc3QgVmFsaWRhdGlvbkVycm9yRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBWYWxpZGF0aW9uRXJyb3JFdmVudFR5cGUsXG4gIGVsZW1lbnRUeXBlOiBBbGxGaWVsZE5hbWVzLFxuICBlcnJvcnM6IHouYXJyYXkoei5zdHJpbmcoKSlcbn0pO1xuY29uc3QgTGF5b3V0RXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uTEFZT1VUKSxcbiAgaGVpZ2h0OiBSZXF1aXJlZFN0cmluZ1xufSk7XG5jb25zdCBMb2FkZWRFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5MT0FERUQpLFxuICBzZXNzaW9uSWQ6IFJlcXVpcmVkU3RyaW5nLFxuICB0b3RhbEFtb3VudEF0b21zOiB6Lm51bWJlcigpLFxuICBjdXJyZW5jeTogT3B0aW9uYWxTdHJpbmcsXG4gIGNoZWNrb3V0UGF5bWVudE1ldGhvZHM6IHouYXJyYXkoQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEpXG59KTtcbmNvbnN0IFBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5saXRlcmFsKEV2ZW50VHlwZS5lbnVtLlBBWU1FTlRfRkxPV19TVEFSVEVEKSxcbiAgbmV4dEFjdGlvbk1ldGFkYXRhOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSxcbiAgcGF5bWVudEZsb3dNZXRhZGF0YTogei5hbnkoKS5vcHRpb25hbCgpLFxuICBzdGFydFBGTWV0YWRhdGE6IHoub3B0aW9uYWwoei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkpXG59KTtcbmNvbnN0IFNldHVwQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uU0VUVVBfUEFZTUVOVF9NRVRIT0RfU1VDQ0VTUyksXG4gIHBheW1lbnRNZXRob2RJZDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBSZXF1aXJlZEZvcm1GaWVsZHMgPSB6Lm9iamVjdCh7XG4gIFtcImZpcnN0TmFtZVwiIC8qIEZJUlNUX05BTUUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wibGFzdE5hbWVcIiAvKiBMQVNUX05BTUUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wiZW1haWxcIiAvKiBFTUFJTCAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJ6aXBDb2RlXCIgLyogWklQX0NPREUgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wiY291bnRyeVwiIC8qIENPVU5UUlkgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wicHJvbW90aW9uQ29kZVwiIC8qIFBST01PVElPTl9DT0RFICovXTogT3B0aW9uYWxTdHJpbmdcbn0pO1xuY29uc3QgUFJGb3JtRmllbGRzID0gei5vYmplY3Qoe1xuICBbXCJlbWFpbFwiIC8qIEVNQUlMICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcInppcENvZGVcIiAvKiBaSVBfQ09ERSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJjb3VudHJ5XCIgLyogQ09VTlRSWSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJwcm9tb3Rpb25Db2RlXCIgLyogUFJPTU9USU9OX0NPREUgKi9dOiBPcHRpb25hbFN0cmluZ1xufSk7XG5jb25zdCBTdWJtaXRFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJUT0tFTklaRVwiLCBcIkNIRUNLT1VUXCIsIFwiU1RBUlRfUEFZTUVOVF9GTE9XXCJdKTtcbmNvbnN0IFN1Ym1pdEV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogU3VibWl0RXZlbnRUeXBlLFxuICBzZXNzaW9uSWQ6IFJlcXVpcmVkU3RyaW5nLFxuICBjaGVja291dFBheW1lbnRNZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxLFxuICBwYXltZW50Rmxvd01ldGFkYXRhOiB6LmFueSgpLm9wdGlvbmFsKCksXG4gIGRvTm90VXNlTGVnYWN5Q0NGbG93OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBleGlzdGluZ0NDUE1JZDogT3B0aW9uYWxTdHJpbmdcbn0pLmV4dGVuZChSZXF1aXJlZEZvcm1GaWVsZHMuc2hhcGUpO1xuY29uc3QgVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uVE9LRU5JWkVfU1VDQ0VTUyksXG4gIGlzUmVhZHlGb3JDaGVja291dDogei5ib29sZWFuKClcbn0pO1xuY29uc3QgQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uQ0hFQ0tPVVRfU1VDQ0VTUyksXG4gIGludm9pY2VVcmxzOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBzdWJzY3JpcHRpb25JZHM6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gIGN1c3RvbWVySWQ6IHouc3RyaW5nKClcbn0pO1xuY29uc3QgRXZlbnRQYXlsb2FkID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgR2VuZXJpY0V2ZW50UGF5bG9hZCxcbiAgSW5wdXRFdmVudFBheWxvYWQsXG4gIEVycm9yRXZlbnRQYXlsb2FkLFxuICBWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQsXG4gIExheW91dEV2ZW50UGF5bG9hZCxcbiAgTG9hZGVkRXZlbnRQYXlsb2FkLFxuICBTdWJtaXRFdmVudFBheWxvYWQsXG4gIFRva2VuaXplU3VjY2Vzc0V2ZW50UGF5bG9hZCxcbiAgQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkLFxuICBQYXltZW50Rmxvd1N0YXJ0ZWRFdmVudFBheWxvYWQsXG4gIFNldHVwQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkXG5dKTtcbmNvbnN0IEVsZW1lbnRFdmVudCA9IHoub2JqZWN0KHtcbiAgcGF5bG9hZDogRXZlbnRQYXlsb2FkLFxuICBub25jZTogUmVxdWlyZWRTdHJpbmcsXG4gIGZvcm1JZDogUmVxdWlyZWRTdHJpbmcsXG4gIGVsZW1lbnRJZDogUmVxdWlyZWRTdHJpbmdcbn0pO1xuei5vYmplY3Qoe1xuICBhbW91bnRBdG9tOiB6Lm51bWJlcigpLFxuICBjdXJyZW5jeTogUmVxdWlyZWRTdHJpbmdcbn0pO1xuei5vYmplY3Qoe1xuICBzZWN1cmVfdG9rZW46IHouc3RyaW5nKCksXG4gIHByb21vdGlvbl9jb2RlOiB6LnN0cmluZygpLm9wdGlvbmFsKClcbn0pO1xuei5vYmplY3Qoe1xuICBzZWN1cmVfdG9rZW46IHouc3RyaW5nKCksXG4gIGV4aXN0aW5nX2NjX3BtX2lkOiBudWxsT3JVbmRlZk9yJDEoei5zdHJpbmcoKSlcbn0pO1xuY29uc3QgQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHBheW1lbnRfbWV0aG9kczogei5hcnJheShQYXltZW50TWV0aG9kTWluaW1hbClcbn0pO1xuY29uc3QgRmllbGRWYWxpZGF0aW9uRXJyb3IgPSB6Lm9iamVjdCh7XG4gIGVsZW1lbnRUeXBlOiB6LnN0cmluZygpLFxuICBlcnJvcnM6IHouYXJyYXkoei5zdHJpbmcoKSlcbn0pO1xuei5vYmplY3Qoe1xuICBzZXNzaW9uX2lkOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IFRva2VuaXplQ2FyZEVycm9yUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHN1Y2Nlc3M6IHoubGl0ZXJhbChmYWxzZSksXG4gIGVycm9yX3R5cGU6IHoubGl0ZXJhbChcInZhbGlkYXRpb25fZXJyb3JcIiksXG4gIGVycm9yczogei5hcnJheShGaWVsZFZhbGlkYXRpb25FcnJvcilcbn0pO1xuY29uc3QgVG9rZW5pemVDYXJkUmVzcG9uc2UgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInN1Y2Nlc3NcIiwgW1xuICB6Lm9iamVjdCh7IHN1Y2Nlc3M6IHoubGl0ZXJhbCh0cnVlKSB9KSxcbiAgVG9rZW5pemVDYXJkRXJyb3JSZXNwb25zZVxuXSk7XG56Lm9iamVjdCh7XG4gIHNlc3Npb25faWQ6IHouc3RyaW5nKCksXG4gIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2QkMSxcbiAgbm9uX2NkZV9mb3JtX2ZpZWxkczogUmVxdWlyZWRGb3JtRmllbGRzLFxuICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBleGlzdGluZ19jY19wbV9pZDogbnVsbE9yVW5kZWZPciQxKHouc3RyaW5nKCkpXG59KTtcbnoub2JqZWN0KHtcbiAgc2Vzc2lvbl9pZDogei5zdHJpbmcoKSxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxLFxuICBub25fY2RlX2Zvcm1fZmllbGRzOiBSZXF1aXJlZEZvcm1GaWVsZHNcbn0pO1xudmFyIFRocmVlRFNTdGF0dXMgPSAvKiBAX19QVVJFX18gKi8gKChUaHJlZURTU3RhdHVzMikgPT4ge1xuICBUaHJlZURTU3RhdHVzMltcIlNVQ0NFU1NcIl0gPSBcInN1Y2Nlc3NcIjtcbiAgVGhyZWVEU1N0YXR1czJbXCJGQUlMVVJFXCJdID0gXCJmYWlsdXJlXCI7XG4gIFRocmVlRFNTdGF0dXMyW1wiQ0FOQ0VMTEVEXCJdID0gXCJjYW5jZWxsZWRcIjtcbiAgcmV0dXJuIFRocmVlRFNTdGF0dXMyO1xufSkoVGhyZWVEU1N0YXR1cyB8fCB7fSk7XG5jb25zdCBQaW5nM0RTU3RhdHVzUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5lbnVtKFtcInN1Y2Nlc3NcIiAvKiBTVUNDRVNTICovLCBcImZhaWx1cmVcIiAvKiBGQUlMVVJFICovLCBcImNhbmNlbGxlZFwiIC8qIENBTkNFTExFRCAqL10pXG59KTtcbmNvbnN0IENvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5zdHJpbmcoKSxcbiAgcmVkaXJlY3RfdXJsOiB6LnN0cmluZygpLFxuICBpbml0aWFsX2ludGVudF9pZDogei5zdHJpbmcoKSxcbiAgY29uc2VudF9pZDogei5zdHJpbmcoKVxufSk7XG5cbmNvbnN0IGV4dHJhY3RJc3N1ZXNQZXJGaWVsZCA9IChlcnJvcikgPT4ge1xuICBjb25zdCBpc3N1ZXNQZXJGaWVsZCA9IHt9O1xuICBPYmplY3QuZW50cmllcyhlcnJvcikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IEZpZWxkTmFtZUVudW0ucGFyc2Uoa2V5KTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBpc3N1ZXNQZXJGaWVsZFtmaWVsZE5hbWVdID0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUuX2Vycm9ycykpIHtcbiAgICAgICAgaXNzdWVzUGVyRmllbGRbZmllbGROYW1lXSA9IHZhbHVlLl9lcnJvcnM7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGlzc3Vlc1BlckZpZWxkO1xufTtcblxuY29uc3QgU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gei5vYmplY3Qoe1xuICBzdHJpcGVfcGs6IHouc3RyaW5nKCksXG4gIGNsaWVudF9zZWNyZXQ6IHouc3RyaW5nKCksXG4gIHN0cmlwZV9wbV9pZDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YSA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5zdHJpbmcoKSxcbiAgY2xpZW50X3NlY3JldDogei5zdHJpbmcoKSxcbiAgc3RyaXBlX3BrOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IG91ckN1cnJlbmN5VG9UaGVpcnMgPSB7XG4gIHVzZDogXCJ1c2RcIixcbiAgYnJsOiBcImJybFwiXG59O1xuY29uc3QgZ2V0TG9hZGVkU3RyaXBlID0gYXN5bmMgKHB1Ymxpc2hhYmxlS2V5KSA9PiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgIGlmICghaXNTdHJpcGVKc1ByZXNlbnQoKSkge1xuICAgICAgYXdhaXQgc2xlZXAoNTAwKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFpc1N0cmlwZUpzUHJlc2VudCgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTdHJpcGUgSlMgbm90IGZvdW5kLmApO1xuICB9XG4gIGNvbnN0IHN0cmlwZSA9IG5ldyBTdHJpcGUocHVibGlzaGFibGVLZXkpO1xuICByZXR1cm4gc3RyaXBlO1xufTtcbmNvbnN0IGNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0ID0gYXN5bmMgKHN0cmlwZVB1YktleSwgdG90YWxBbW91bnRBdG9tLCBjdXJyZW5jeSwgaXNBbW91bnRQZW5kaW5nLCBpc0xpbmtPbmx5KSA9PiB7XG4gIGNvbnN0IHN0cmlwZSA9IGF3YWl0IGdldExvYWRlZFN0cmlwZShzdHJpcGVQdWJLZXkpO1xuICBjb25zdCBzdHJpcGVDdXJyZW5jeSA9IG91ckN1cnJlbmN5VG9UaGVpcnNbY3VycmVuY3kudG9Mb3dlckNhc2UoKS50cmltKCldO1xuICBjb25zdCBwYXltZW50UmVxdWVzdCA9IHN0cmlwZS5wYXltZW50UmVxdWVzdCh7XG4gICAgLy8gVE9ETzogcmVwbGFjZSB0aGlzIHdpdGggc3RyaXBlIGFjY291bnQgY291bnRyeSBhcyBzb29uIGFzIHdlIHN1cHBvcnQgaXRcbiAgICBjb3VudHJ5OiBcIlVTXCIsXG4gICAgY3VycmVuY3k6IHN0cmlwZUN1cnJlbmN5LFxuICAgIHRvdGFsOiB7XG4gICAgICBsYWJlbDogXCJUb3RhbFwiLFxuICAgICAgYW1vdW50OiB0b3RhbEFtb3VudEF0b20sXG4gICAgICBwZW5kaW5nOiBpc0Ftb3VudFBlbmRpbmdcbiAgICB9LFxuICAgIHJlcXVlc3RQYXllck5hbWU6IHRydWUsXG4gICAgcmVxdWVzdFBheWVyRW1haWw6IHRydWUsXG4gICAgZGlzYWJsZVdhbGxldHM6IFtdIFxuICB9KTtcbiAgcmV0dXJuIHBheW1lbnRSZXF1ZXN0O1xufTtcbmNvbnN0IHNsZWVwID0gKHRpbWVvdXRNcykgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXRNcyk7XG4gIH0pO1xufTtcbmNvbnN0IGlzU3RyaXBlSnNQcmVzZW50ID0gKCkgPT4ge1xuICByZXR1cm4gXCJTdHJpcGVcIiBpbiB3aW5kb3c7XG59O1xuY29uc3Qgd2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QgPSBhc3luYyAocGF5bWVudFJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgcGF5bWVudFJlcXVlc3Qub24oXCJwYXltZW50bWV0aG9kXCIsIGFzeW5jIChldnQpID0+IHtcbiAgICAgICAgcmVzb2x2ZShldnQpO1xuICAgICAgfSk7XG4gICAgICBwYXltZW50UmVxdWVzdC5vbihcImNhbmNlbFwiLCAoKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFBheW1lbnQgY2FuY2VsbGVkLCBwbGVhc2UgY2xpY2sgU3VibWl0IGFnYWluIHRvIHBheWApKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChlKTtcbiAgICB9XG4gIH0pO1xufTtcbmNvbnN0IGNvbmZpcm1TdHJpcGVQclBNID0gYXN5bmMgKG5leHRBY3Rpb25NZXRhZGF0YSwgc3RyaXBlUG0pID0+IHtcbiAgaWYgKCFuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrIHx8ICFuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBuZXh0IGFjdGlvbiBtZXRhZGF0YSBmb3JtYXQ6ICR7SlNPTi5zdHJpbmdpZnkobmV4dEFjdGlvbk1ldGFkYXRhKX1gKTtcbiAgfVxuICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUobmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wayk7XG4gIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBzdHJpcGUuY29uZmlybUNhcmRTZXR1cChuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCwge1xuICAgIHBheW1lbnRfbWV0aG9kOiBzdHJpcGVQbS5wYXltZW50TWV0aG9kLmlkXG4gIH0pO1xuICBpZiAoY29uZmlybVJlc3VsdC5lcnJvcikge1xuICAgIHN0cmlwZVBtLmNvbXBsZXRlKFwiZmFpbFwiKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBheW1lbnQgZmFpbGVkOiAke2NvbmZpcm1SZXN1bHQuZXJyb3IubWVzc2FnZSA/PyBgdW5rbm93bmB9YCk7XG4gIH0gZWxzZSB7XG4gICAgc3RyaXBlUG0uY29tcGxldGUoXCJzdWNjZXNzXCIpO1xuICB9XG4gIHJldHVybiBjb25maXJtUmVzdWx0O1xufTtcbmNvbnN0IGxhdW5jaFN0cmlwZTNEU0RpYWxvZ0Zsb3cgPSBhc3luYyAobmV4dEFjdGlvbk1ldGFkYXRhKSA9PiB7XG4gIGNvbnN0IHN0cmlwZSA9IGF3YWl0IGdldExvYWRlZFN0cmlwZShuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrKTtcbiAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IHN0cmlwZS5jb25maXJtQ2FyZFNldHVwKG5leHRBY3Rpb25NZXRhZGF0YS5jbGllbnRfc2VjcmV0LCB7XG4gICAgcGF5bWVudF9tZXRob2Q6IG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcG1faWRcbiAgfSk7XG4gIGNvbnN0IHJlc3VsdFN0YXR1cyA9IGNvbmZpcm1SZXN1bHQuc2V0dXBJbnRlbnQ/LnN0YXR1cztcbiAgaWYgKHJlc3VsdFN0YXR1cyA9PT0gXCJzdWNjZWVkZWRcIikgOyBlbHNlIGlmIChyZXN1bHRTdGF0dXMgPT09IFwiY2FuY2VsZWRcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGF5bWVudCBjYW5jZWxsZWQsIHBsZWFzZSBjbGljayBTdWJtaXQgYWdhaW4gdG8gcGF5YCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7Y29uZmlybVJlc3VsdC5lcnJvcj8ubWVzc2FnZSA/PyBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50Py5sYXN0X3NldHVwX2Vycm9yPy5tZXNzYWdlID8/IFwiUGF5bWVudCBmYWlsZWQsIHBsZWFzZSBjbGljayBzdWJtaXQgYWdhaW4gdG8gcGF5LlwifWBcbiAgICApO1xuICB9XG59O1xuXG5jb25zdCBjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyA9IChzdHlsZXMpID0+IHtcbiAgY29uc3Qgc2VyaWFsaXplZFN0eWxlcyA9IEpTT04uc3RyaW5naWZ5KHN0eWxlcyk7XG4gIHJldHVybiBzZXJpYWxpemVkU3R5bGVzO1xufTtcblxuY29uc3QgY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtID0gKGZvcm1EaXYsIGluaXRpYWxEaWN0KSA9PiB7XG4gIGNvbnN0IGluY2x1ZGVkSW5wdXRzID0gQXJyYXkuZnJvbShmb3JtRGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1vcGlkXVwiKSA/PyBbXSk7XG4gIGNvbnN0IGV4dHJhRGF0YSA9IGluY2x1ZGVkSW5wdXRzLnJlZHVjZSgoYWNjLCBpbnB1dCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGlucHV0LmdldEF0dHJpYnV0ZShcImRhdGEtb3BpZFwiKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIGFjYztcbiAgICByZXR1cm4geyAuLi5hY2MsIFtrZXldOiBpbnB1dC52YWx1ZSB9O1xuICB9LCB7fSk7XG4gIHJldHVybiBleHRyYURhdGE7XG59O1xuY29uc3QgcGFyc2VFdmVudFBheWxvYWQgPSAoZXZlbnREYXRhKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEVsZW1lbnRFdmVudC5wYXJzZShldmVudERhdGEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuY29uc3QgZW1pdEV2ZW50ID0gKHRhcmdldCwgZm9ybUlkLCBlbGVtZW50SWQsIHBheWxvYWQsIGJhc2VVcmwpID0+IHtcbiAgY29uc3QgZXZlbnQgPSB7XG4gICAgcGF5bG9hZCxcbiAgICBub25jZTogdjQoKSxcbiAgICBmb3JtSWQsXG4gICAgZWxlbWVudElkXG4gIH07XG4gIHRhcmdldC5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShldmVudCksIGJhc2VVcmwpO1xufTtcblxuY29uc3QgY2hlY2tJZlZhbGlkQ2RlQ29ubmVjdGlvbk9iamVjdCA9IGFzeW5jIChvYmopID0+IHtcbiAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgfHwgIW9iaikgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IHBpbmcgPSB7IHR5cGU6IFwicGluZ1wiIH07XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb2JqLnNlbmQocGluZyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAndHJ1ZScgYWZ0ZXIgcGluZywgZ290ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5jb25zdCBpc1Jlc3VsdFZhbGlkID0gKG9iaiwgaXNWYWxpZCkgPT4ge1xuICByZXR1cm4gISFvYmogJiYgaXNWYWxpZDtcbn07XG5cbmNvbnN0IG51bGxPclVuZGVmT3IgPSAoelR5cGUpID0+IHoubnVsbGFibGUoelR5cGUub3B0aW9uYWwoKSk7XG56LnN0cmluZygpLnRyaW0oKS5taW4oMSwgeyBtZXNzYWdlOiBgQ2Fubm90IGJlIGJsYW5rYCB9KTtcbmNvbnN0IENERVJlc3BvbnNlRXJyb3IgPSB6Lm9iamVjdCh7XG4gIGNkZV9yZXNwb25zZV90eXBlOiB6LmxpdGVyYWwoXCJlcnJvclwiKSxcbiAgbWVzc2FnZTogei5zdHJpbmcoKSxcbiAgaGVhZGVyczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKVxufSk7XG56LmVudW0oW1widXNkXCIsIFwiYnJsXCJdKTtcbmNvbnN0IENvdXBvbk1pbmltYWwgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCksXG4gIGFtb3VudF9hdG9tX29mZjogbnVsbE9yVW5kZWZPcih6Lm51bWJlcigpKSxcbiAgcGVyY2VudF9vZmY6IG51bGxPclVuZGVmT3Ioei5udW1iZXIoKSksXG4gIGN1cnJlbmN5OiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICBkdXJhdGlvbjogei5zdHJpbmcoKSxcbiAgZHVyYXRpb25faW5fbW9udGhzOiBudWxsT3JVbmRlZk9yKHoubnVtYmVyKCkpXG59KTtcbmNvbnN0IExpbmVJdGVtID0gei5vYmplY3Qoe1xuICBhbW91bnRfc3VidG90YWxfYXRvbTogei5udW1iZXIoKS5pbnQoKSxcbiAgYW1vdW50X3RvdGFsX2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGN1cnJlbmN5OiB6LnN0cmluZygpLFxuICBkZXNjcmlwdGlvbjogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgcHJpY2VfaWQ6IHouc3RyaW5nKCksXG4gIGJpbGxpbmdfaW50ZXJ2YWw6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGJpbGxpbmdfaW50ZXJ2YWxfY291bnQ6IG51bGxPclVuZGVmT3Ioei5udW1iZXIoKS5pbnQoKSksXG4gIHF1YW50aXR5OiB6Lm51bWJlcigpLmludCgpXG59KTtcbmNvbnN0IEJyYW5kU2V0dGluZ3MgPSB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKTtcbmNvbnN0IEJyYW5kID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLFxuICBzZXR0aW5nczogbnVsbE9yVW5kZWZPcihCcmFuZFNldHRpbmdzKVxufSk7XG5jb25zdCBDaGVja291dFBheW1lbnRNZXRob2QgPSB6Lm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6LnN0cmluZygpLFxuICBwcm9jZXNzb3JfbmFtZTogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgbWV0YWRhdGE6IG51bGxPclVuZGVmT3Ioei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkpXG59KTtcbmNvbnN0IFN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsID0gei5vYmplY3Qoe1xuICBxdWFudGl0eTogei5udW1iZXIoKVxufSk7XG5jb25zdCBTdWJzY3JpcHRpb25NaW5pbWFsID0gei5vYmplY3Qoe1xuICBpZDogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgYmlsbGluZ19pbnRlcnZhbDogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgYmlsbGluZ19pbnRlcnZhbF9jb3VudDogbnVsbE9yVW5kZWZPcih6Lm51bWJlcigpLmludCgpKSxcbiAgc3Vic2NyaXB0aW9uX2l0ZW1zOiB6LmFycmF5KFN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsKSxcbiAgdHJpYWxfc3RhcnQ6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIHRyaWFsX2VuZDogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKVxufSk7XG5jb25zdCBJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwgPSB6Lm9iamVjdCh7XG4gIGFtb3VudF9hdG9tOiB6Lm51bWJlcigpXG59KTtcbmNvbnN0IEludm9pY2VMaW5lSXRlbU1pbmltYWwgPSB6Lm9iamVjdCh7XG4gIGFtb3VudF9hdG9tOiB6Lm51bWJlcigpLFxuICBhbW91bnRfYXRvbV9jb25zaWRlcmluZ19kaXNjb3VudF9hcHBsaWVkOiB6Lm51bWJlcigpLFxuICBjdXJyZW5jeTogei5zdHJpbmcoKSxcbiAgZGlzY291bnRfYW1vdW50X2F0b21zOiB6LmFycmF5KEludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbCksXG4gIHN1YnNjcmlwdGlvbl9pdGVtX2lkOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IERpc2NvdW50TWluaW1hbCA9IHoub2JqZWN0KHtcbiAgY291cG9uOiBDb3Vwb25NaW5pbWFsXG59KTtcbmNvbnN0IEludm9pY2VNaW5pbWFsID0gei5vYmplY3Qoe1xuICBjdXJyZW5jeTogei5zdHJpbmcoKSxcbiAgZGlzY291bnRzOiB6LmFycmF5KERpc2NvdW50TWluaW1hbCksXG4gIGhvc3RlZF9pbnZvaWNlX3VybDogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgbGluZXM6IHouYXJyYXkoSW52b2ljZUxpbmVJdGVtTWluaW1hbCksXG4gIHJlbWFpbmluZ19hbW91bnRfYXRvbTogei5udW1iZXIoKSxcbiAgdGF4X2Ftb3VudF9hdG9tOiB6Lm51bWJlcigpLFxuICB0b3RhbF9hbW91bnRfYXRvbTogei5udW1iZXIoKSxcbiAgdG90YWxfZGlzY291bnRfYW1vdW50X2F0b21zOiB6LmFycmF5KEludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbClcbn0pO1xuY29uc3QgQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2VNaW5pbWFsID0gei5vYmplY3Qoe1xuICBjcmVhdGVkOiB6LmFycmF5KFN1YnNjcmlwdGlvbk1pbmltYWwpLFxuICBpbnZvaWNlczogei5hcnJheShJbnZvaWNlTWluaW1hbClcbn0pO1xuY29uc3QgUHJldmlld0NoZWNrb3V0UmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHByZXZpZXc6IENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCxcbiAgcHJldmlld19wb3N0X3RyaWFsOiBudWxsT3JVbmRlZk9yKENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCksXG4gIGNvdXBvbnM6IHouYXJyYXkoQ291cG9uTWluaW1hbClcbn0pO1xuY29uc3QgX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbiA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LmxpdGVyYWwoXCJvcGVuXCIpLFxuICB0b2tlbjogei5zdHJpbmcoKSxcbiAgZW1haWw6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGxpbmVfaXRlbXM6IHouYXJyYXkoTGluZUl0ZW0pLFxuICBhbW91bnRfc3VidG90YWxfYXRvbTogei5udW1iZXIoKS5pbnQoKSxcbiAgYW1vdW50X3RvdGFsX2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGJyYW5kOiBCcmFuZCxcbiAgc3Vic19wcmV2aWV3OiBudWxsT3JVbmRlZk9yKFByZXZpZXdDaGVja291dFJlc3BvbnNlKSxcbiAgLy8gTnVsbCBpbiBzZXR1cCBtb2RlXG4gIG1ldGhvZHNfYXZhaWxhYmxlOiB6LmFycmF5KENoZWNrb3V0UGF5bWVudE1ldGhvZClcbn0pO1xuY29uc3QgUGF5bWVudEZvcm1QcmVmaWxsID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJtb2RlXCIsIFtcbiAgei5vYmplY3Qoe1xuICAgIG1vZGU6IHoubGl0ZXJhbChcInNldHVwXCIpLFxuICAgIGN1cnJlbmN5OiB6Lm51bGxhYmxlKHoudW5kZWZpbmVkKCkpXG4gIH0pLmV4dGVuZChfUGF5bWVudEZvcm1QcmVmaWxsQ29tbW9uLnNoYXBlKSxcbiAgei5vYmplY3Qoe1xuICAgIG1vZGU6IHouZW51bShbXCJwYXltZW50XCIsIFwic3Vic2NyaXB0aW9uXCJdKSxcbiAgICBjdXJyZW5jeTogei5zdHJpbmcoKVxuICB9KS5leHRlbmQoX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbi5zaGFwZSlcbl0pO1xuY29uc3QgQ29tcGxldGVkRm9ybVByZWZpbGwgPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5saXRlcmFsKFwiY29tcGxldGVcIilcbn0pO1xuY29uc3QgRXhwaXJlZEZvcm1QcmVmaWxsID0gei5vYmplY3Qoe1xuICBzdGF0dXM6IHoubGl0ZXJhbChcImV4cGlyZWRcIilcbn0pO1xuei51bmlvbihbUGF5bWVudEZvcm1QcmVmaWxsLCBDb21wbGV0ZWRGb3JtUHJlZmlsbCwgRXhwaXJlZEZvcm1QcmVmaWxsXSk7XG56Lm9iamVjdCh7XG4gIGxvZ286IHouc3RyaW5nKCksXG4gIGljb246IHouc3RyaW5nKCksXG4gIHByaW1hcnlfY29sb3I6IHouc3RyaW5nKCksXG4gIHNlY29uZGFyeV9jb2xvcjogei5zdHJpbmcoKVxufSk7XG5jb25zdCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgaW52b2ljZV91cmxzOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBzdWJzY3JpcHRpb25faWRzOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBjdXN0b21lcl9pZDogei5zdHJpbmcoKVxufSk7XG56Lm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogei5zdHJpbmcoKSxcbiAgcGF5bWVudF9pbnB1dDogei5hbnkoKSxcbiAgLy8gU2hvdWxkIGZvbGxvdyBBbnlQYXltZW50SW5wdXQgZnJvbSBDREVcbiAgY3VzdG9tZXJfZW1haWw6IHouc3RyaW5nKCksXG4gIGN1c3RvbWVyX3ppcF9jb2RlOiB6LnN0cmluZygpLFxuICBjdXN0b21lcl9jb3VudHJ5OiB6LnN0cmluZygpLFxuICBsaW5lX2l0ZW1zOiB6LmFycmF5KExpbmVJdGVtKSxcbiAgdG90YWxfYW1vdW50X2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGNhbmNlbF9hdF9lbmQ6IHouYm9vbGVhbigpLFxuICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICBwcm9tb3Rpb25fY29kZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBkb19ub3RfdXNlX2xlZ2FjeV9jY19mbG93OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpXG59KTtcbmNvbnN0IFNldHVwQ2hlY2tvdXRSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcGF5bWVudF9tZXRob2RfaWQ6IHouc3RyaW5nKClcbn0pO1xuei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgcmV0dXJuX3VybDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5zdHJpbmcoKSxcbiAgbG9jOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBtc2c6IHouc3RyaW5nKCksXG4gIHVybDogei5zdHJpbmcoKVxufSk7XG56LmFycmF5KFB5ZGFudGljVmFsaWRhdGlvbkVycm9yKTtcbmNvbnN0IFN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcmVxdWlyZWRfdXNlcl9hY3Rpb25zOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKVxufSk7XG56Lm9iamVjdCh7XG4gIGZpZWxkczogUFJGb3JtRmllbGRzLFxuICBjaGVja291dFBheW1lbnRNZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZFxufSk7XG56Lm9iamVjdCh7XG4gIHNlc3Npb25faWQ6IHouc3RyaW5nKCksXG4gIG5vbl9jZGVfZm9ybV9maWVsZHM6IFJlcXVpcmVkRm9ybUZpZWxkcyxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZFxufSk7XG5jb25zdCBTdGFydFBheW1lbnRGbG93Rm9yQ0NSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcmVxdWlyZWRfdXNlcl9hY3Rpb25zOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKSxcbiAgY2NfcG1faWQ6IHouc3RyaW5nKClcbn0pO1xuei5yZWNvcmQoei5hbnkoKSk7XG5cbmNvbnN0IHN1bSA9IChhcnIpID0+IHtcbiAgcmV0dXJuIGFyci5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbn07XG5cbmZ1bmN0aW9uIGZpeFByb3RvKHRhcmdldCwgcHJvdG90eXBlKSB7XG4gIHZhciBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiAgc2V0UHJvdG90eXBlT2YgPyBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvdHlwZSkgOiB0YXJnZXQuX19wcm90b19fID0gcHJvdG90eXBlO1xufVxuZnVuY3Rpb24gZml4U3RhY2sodGFyZ2V0LCBmbikge1xuICBpZiAoZm4gPT09IHZvaWQgMCkge1xuICAgIGZuID0gdGFyZ2V0LmNvbnN0cnVjdG9yO1xuICB9XG5cbiAgdmFyIGNhcHR1cmVTdGFja1RyYWNlID0gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U7XG4gIGNhcHR1cmVTdGFja1RyYWNlICYmIGNhcHR1cmVTdGFja1RyYWNlKHRhcmdldCwgZm4pO1xufVxuXG52YXIgX19leHRlbmRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICBfX3Byb3RvX186IFtdXG4gICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuXG4gICAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgICBmdW5jdGlvbiBfXygpIHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgIH1cblxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbn0oKTtcblxudmFyIEN1c3RvbUVycm9yID0gZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoQ3VzdG9tRXJyb3IsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gQ3VzdG9tRXJyb3IobWVzc2FnZSwgb3B0aW9ucykge1xuICAgIHZhciBfbmV3VGFyZ2V0ID0gdGhpcy5jb25zdHJ1Y3RvcjtcblxuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UsIG9wdGlvbnMpIHx8IHRoaXM7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX3RoaXMsICduYW1lJywge1xuICAgICAgdmFsdWU6IF9uZXdUYXJnZXQubmFtZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgZml4UHJvdG8oX3RoaXMsIF9uZXdUYXJnZXQucHJvdG90eXBlKTtcbiAgICBmaXhTdGFjayhfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIEN1c3RvbUVycm9yO1xufShFcnJvcik7XG5cbmNsYXNzIENkZUVycm9yIGV4dGVuZHMgQ3VzdG9tRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xuICAgIGNvbnN0IGZyaWVuZGx5TWVzc2FnZSA9IGBbY2RlLWNsaWVudF0gRXJyb3IgcXVlcnlpbmcgQ0RFOiAke3Jlc3BvbnNlLm1lc3NhZ2V9YDtcbiAgICBzdXBlcihmcmllbmRseU1lc3NhZ2UpO1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgfVxuICBnZXQgb3JpZ2luYWxFcnJvck1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2UubWVzc2FnZTtcbiAgfVxufVxuY29uc3QgcXVlcnlDREUgPSBhc3luYyAoY2RlQ29ubiwgZGF0YSwgcmVzcG9uc2VTY2hlbWEpID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjZGVDb25uLnNlbmQoZGF0YSk7XG4gIGlmIChpc0NERVJlc3BvbnNlRXJyb3IocmVzcG9uc2UpKSB7XG4gICAgdGhyb3cgbmV3IENkZUVycm9yKHJlc3BvbnNlKTtcbiAgfVxuICBpZiAoIWNoZWNrSWZDb25mb3Jtc1RvU2NoZW1hKHJlc3BvbnNlLCByZXNwb25zZVNjaGVtYSkpIHtcbiAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UocmVzcG9uc2UpO1xuICAgIGlmIChyZXN1bHQuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdGF0ZVwiKTtcbiAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlO1xufTtcbmNvbnN0IGNoZWNrSWZDb25mb3Jtc1RvU2NoZW1hID0gKHZhbHVlLCBzY2hlbWEpID0+IHtcbiAgcmV0dXJuIHNjaGVtYS5zYWZlUGFyc2UodmFsdWUpLnN1Y2Nlc3M7XG59O1xuY29uc3QgaXNDREVSZXNwb25zZUVycm9yID0gKHJlc3BvbnNlKSA9PiB7XG4gIHJldHVybiBDREVSZXNwb25zZUVycm9yLnNhZmVQYXJzZShyZXNwb25zZSkuc3VjY2Vzcztcbn07XG5jb25zdCBnZXRDaGVja291dFByZXZpZXcgPSBhc3luYyAoY2RlQ29ubiwgcmVxdWVzdCkgPT4ge1xuICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcImdldF9jaGVja291dF9wcmV2aWV3XCIsIHBheWxvYWQ6IHJlcXVlc3QgfSwgUHJldmlld0NoZWNrb3V0UmVzcG9uc2UpO1xufTtcbmNvbnN0IGdldFByZWZpbGwgPSBhc3luYyAoY2RlQ29ubikgPT4ge1xuICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcImdldF9wcmVmaWxsXCIsIHBheWxvYWQ6IHt9IH0sIFBheW1lbnRGb3JtUHJlZmlsbCk7XG59O1xuY29uc3Qgc3RhcnRQYXltZW50Rmxvd0ZvckNDID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJzdGFydF9wYXltZW50X2Zsb3dfZm9yX2NjXCIsIHBheWxvYWQgfSwgU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UpO1xufTtcbmNvbnN0IHN0YXJ0UGF5bWVudEZsb3dGb3JQUiA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic3RhcnRfcGF5bWVudF9mbG93X2Zvcl9wclwiLCBwYXlsb2FkIH0sIFN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG59O1xuY29uc3QgY29uZmlybVBheW1lbnRGbG93ID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJjb25maXJtX3BheW1lbnRfZmxvd1wiLCBwYXlsb2FkIH0sIENvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKTtcbn07XG5jb25zdCBnZXRDaGVja291dFZhbHVlID0gYXN5bmMgKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBwcm9tb0NvZGUpID0+IHtcbiAgY29uc3QgY2hlY2tvdXRQcmV2aWV3ID0gYXdhaXQgZ2V0Q2hlY2tvdXRQcmV2aWV3KGNkZUNvbm4sIHtcbiAgICBzZWN1cmVfdG9rZW46IHNlY3VyZVRva2VuLFxuICAgIHByb21vdGlvbl9jb2RlOiBwcm9tb0NvZGVcbiAgfSk7XG4gIGNvbnN0IGN1cnJlbmNpZXMgPSBuZXcgU2V0KGNoZWNrb3V0UHJldmlldy5wcmV2aWV3Lmludm9pY2VzLm1hcCgoaW52KSA9PiBpbnYuY3VycmVuY3kpKTtcbiAgaWYgKGN1cnJlbmNpZXMuc2l6ZSAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSBvbmUgY3VycmVuY3ksIGdvdCAke2N1cnJlbmNpZXMuc2l6ZX1gKTtcbiAgfVxuICBjb25zdCBjdXJyZW5jeSA9IGN1cnJlbmNpZXMudmFsdWVzKCkubmV4dCgpLnZhbHVlID8/IFwidXNkXCI7XG4gIGNvbnN0IGFtb3VudEF0b20gPSBzdW0oY2hlY2tvdXRQcmV2aWV3LnByZXZpZXcuaW52b2ljZXMubWFwKChpbnYpID0+IGludi5yZW1haW5pbmdfYW1vdW50X2F0b20pKTtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW5jeSxcbiAgICBhbW91bnRBdG9tXG4gIH07XG59O1xuY29uc3QgZ2V0Q2hlY2tvdXRQcmV2aWV3QW1vdW50ID0gYXN5bmMgKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBpc1NldHVwTW9kZSwgcHJvbW9Db2RlKSA9PiB7XG4gIGlmIChpc1NldHVwTW9kZSkge1xuICAgIHJldHVybiB7IGFtb3VudEF0b206IDAsIGN1cnJlbmN5OiBcInVzZFwiIH07XG4gIH0gZWxzZSB7XG4gICAgcHJvbW9Db2RlID0gIXByb21vQ29kZSA/IHZvaWQgMCA6IHByb21vQ29kZTtcbiAgICBjb25zdCBjaGVja291dFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFZhbHVlKGNkZUNvbm4sIHNlY3VyZVRva2VuLCBwcm9tb0NvZGUpO1xuICAgIHJldHVybiB7IGFtb3VudEF0b206IGNoZWNrb3V0UHJldmlldy5hbW91bnRBdG9tLCBjdXJyZW5jeTogY2hlY2tvdXRQcmV2aWV3LmN1cnJlbmN5IH07XG4gIH1cbn07XG5jb25zdCB0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zID0gYXN5bmMgKGFsbENkZUNvbm5lY3Rpb25zLCBwYXlsb2FkKSA9PiB7XG4gIGlmIChhbGxDZGVDb25uZWN0aW9ucy5zaXplID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQ0RFIGNvbm5lY3Rpb25zIGZvdW5kXCIpO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIEFycmF5LmZyb20oYWxsQ2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpLm1hcChcbiAgICAgIChjZGVDb25uKSA9PiBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwidG9rZW5pemVfY2FyZFwiLCBwYXlsb2FkIH0sIFRva2VuaXplQ2FyZFJlc3BvbnNlKVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHJlc3BvbnNlcztcbn07XG5jb25zdCBjaGVja291dENhcmRFbGVtZW50cyA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJjaGVja291dF9jYXJkX2VsZW1lbnRzXCIsIHBheWxvYWQgfSwgQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuY29uc3Qgc2V0dXBDaGVja291dCA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic2V0dXBfcGF5bWVudF9tZXRob2RcIiwgcGF5bG9hZCB9LCBTZXR1cENoZWNrb3V0UmVzcG9uc2UpO1xufTtcbmNvbnN0IHBlcmZvcm1DaGVja291dCA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiY2hlY2tvdXRcIiwgcGF5bG9hZCB9LCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSk7XG59O1xuY29uc3QgQ0RFX1BPTExJTkdfSU5URVJWQUwgPSAxZTM7XG5jb25zdCBwaW5nQ2RlRm9yM2RzU3RhdHVzID0gYXN5bmMgKGlmcmFtZSwgY2hpbGRPcmlnaW4pID0+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3RUb0NoaWxkKHtcbiAgICBpZnJhbWUsXG4gICAgZGVidWc6IHRydWUsXG4gICAgdGltZW91dDogQ0RFX1BPTExJTkdfSU5URVJWQUwsXG4gICAgY2hpbGRPcmlnaW46IFwiKlwiXG4gICAgLy8gVE9ETzogdXNlIHdpdGggcHJvcGVyIGNoaWxkT3JpZ2luXG4gIH0pO1xuICBjb25zdCBjb25uZWN0aW9uT2JqID0gYXdhaXQgY29ubmVjdGlvbi5wcm9taXNlO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeUNERShjb25uZWN0aW9uT2JqLCB7IHR5cGU6IFwicGluZy0zZHMtc3RhdHVzXCIgfSwgUGluZzNEU1N0YXR1c1Jlc3BvbnNlKTtcbiAgcmV0dXJuIHJlc3VsdC5zdGF0dXM7XG59O1xuXG5jb25zdCBzdHlsZXMgPSBcIkBrZXlmcmFtZXMgZmFkZUluezAle29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGUoLjkpfXRve29wYWNpdHk6MTt0cmFuc2Zvcm06c2NhbGUoMSl9fS5vdmVybGF5e3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3otaW5kZXg6MjE0NzQ4MzY0OCFpbXBvcnRhbnQ7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtY29sb3I6IzAwMDAwMDgwfS5jb250YWluZXJ7bWF4LXdpZHRoOjUwMHB4O21heC1oZWlnaHQ6NjAwcHg7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7cG9zaXRpb246cmVsYXRpdmU7YW5pbWF0aW9uOmZhZGVJbiAuM3MgZWFzZS1vdXR9LmZyYW1le21heC13aWR0aDo1MDBweDttYXgtaGVpZ2h0OjYwMHB4O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyOm5vbmV9LmNhbmNlbC1idXR0b257cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXI6bm9uZTtmb250LXNpemU6MXJlbTtjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyO3RvcDotMS41cmVtO3BhZGRpbmc6MDtyaWdodDowfVwiO1xuXG5jb25zdCBjcmVhdGVBbmRPcGVuRnJhbWUgPSAodXJsKSA9PiB7XG4gIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBgXG4gICAgPHN0eWxlPlxuICAgICAgJHtzdHlsZXN9XG4gICAgPC9zdHlsZT5cbiAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8aWZyYW1lIHNyYz1cIiR7dXJsfVwiIGNsYXNzPVwiZnJhbWVcIiBpZD1cInRocmVlLWRzLWlmcmFtZVwiIHRpdGxlPVwiM0QgU2VjdXJlIHZlcmlmaWNhdGlvblwiIGFsbG93PVwicGF5bWVudFwiPjwvaWZyYW1lPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjb25zdCBzaGFkb3dSb290ID0gaG9zdC5hdHRhY2hTaGFkb3coeyBtb2RlOiBcIm9wZW5cIiB9KTtcbiAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5jb250ZW50LmNsb25lTm9kZSh0cnVlKSk7XG4gIGNvbnN0IGlmcmFtZSA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIiN0aHJlZS1kcy1pZnJhbWVcIik7XG4gIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIi5jYW5jZWwtYnV0dG9uXCIpO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhvc3QpO1xuICByZXR1cm4geyBob3N0LCBpZnJhbWUsIGNhbmNlbEJ1dHRvbiB9O1xufTtcblxuZnVuY3Rpb24gc3RhcnRQb2xsaW5nKGlmcmFtZSwgb25TdWNjZXNzLCBjaGlsZE9yaWdpbikge1xuICBjb25zdCBoYW5kbGVQb2xsaW5nID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBwaW5nQ2RlRm9yM2RzU3RhdHVzKGlmcmFtZSwgY2hpbGRPcmlnaW4pO1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBjbGVhckludGVydmFsKHBvbGxpbmdJbnRlcnZhbCk7XG4gICAgICAgIG9uU3VjY2VzcyhzdGF0dXMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgfVxuICB9O1xuICBoYW5kbGVQb2xsaW5nKCk7XG4gIGNvbnN0IHBvbGxpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKGhhbmRsZVBvbGxpbmcsIENERV9QT0xMSU5HX0lOVEVSVkFMKTtcbiAgcmV0dXJuIHBvbGxpbmdJbnRlcnZhbDtcbn1cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50cyh7XG4gIGVsZW1lbnRzLFxuICBwb2xsaW5nSW50ZXJ2YWwsXG4gIHJlc29sdmVcbn0pIHtcbiAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4ge1xuICAgIGNsZWFySW50ZXJ2YWwocG9sbGluZ0ludGVydmFsKTtcbiAgICBlbGVtZW50cy5ob3N0LnJlbW92ZSgpO1xuICAgIHJlc29sdmUoVGhyZWVEU1N0YXR1cy5DQU5DRUxMRUQpO1xuICB9O1xuICBlbGVtZW50cy5jYW5jZWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNhbmNlbCk7XG4gIGNvbnN0IGNsZWFudXBFdmVudExpc3RlbmVycyA9ICgpID0+IHtcbiAgICBlbGVtZW50cy5jYW5jZWxCdXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNhbmNlbCk7XG4gIH07XG4gIHJldHVybiBjbGVhbnVwRXZlbnRMaXN0ZW5lcnM7XG59XG5hc3luYyBmdW5jdGlvbiBzdGFydDNkc1ZlcmlmaWNhdGlvbih7XG4gIHVybCxcbiAgYmFzZVVybFxufSkge1xuICBjb25zdCBlbGVtZW50cyA9IGNyZWF0ZUFuZE9wZW5GcmFtZSh1cmwpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoc3RhdHVzKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWxlbWVudHMuaG9zdC5yZW1vdmUoKTtcbiAgICAgIH0sIDFlMyk7XG4gICAgICByZXNvbHZlKHN0YXR1cyk7XG4gICAgICBjbGVhbnVwRXZlbnRMaXN0ZW5lcnM/LigpO1xuICAgIH07XG4gICAgY29uc3QgcG9sbGluZ0ludGVydmFsID0gc3RhcnRQb2xsaW5nKGVsZW1lbnRzLmlmcmFtZSwgb25TdWNjZXNzLCBuZXcgVVJMKGJhc2VVcmwpLm9yaWdpbik7XG4gICAgY29uc3QgY2xlYW51cEV2ZW50TGlzdGVuZXJzID0gaGFuZGxlRXZlbnRzKHtcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgcG9sbGluZ0ludGVydmFsLFxuICAgICAgcmVzb2x2ZVxuICAgIH0pO1xuICB9KTtcbn1cblxuY29uc3QgYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMgPSAoc2ltcGxlT2pzRmxvdykgPT4ge1xuICByZXR1cm4gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBwYXJhbXMuZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0U3RhcnRlZCgpO1xuICAgICAgY29uc3QgZmxvd1Jlc3VsdCA9IGF3YWl0IHNpbXBsZU9qc0Zsb3cocGFyYW1zKTtcbiAgICAgIGlmIChmbG93UmVzdWx0Lm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICBwYXJhbXMuZmxvd0NhbGxiYWNrcy5vblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MoZmxvd1Jlc3VsdC5yZXN1bHQucGF5bWVudF9tZXRob2RfaWQpO1xuICAgICAgfSBlbHNlIGlmIChmbG93UmVzdWx0Lm1vZGUgPT09IFwiY2hlY2tvdXRcIikge1xuICAgICAgICBwYXJhbXMuZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0U3VjY2VzcyhcbiAgICAgICAgICBmbG93UmVzdWx0LnJlc3VsdC5pbnZvaWNlX3VybHMsXG4gICAgICAgICAgZmxvd1Jlc3VsdC5yZXN1bHQuc3Vic2NyaXB0aW9uX2lkcyxcbiAgICAgICAgICBmbG93UmVzdWx0LnJlc3VsdC5jdXN0b21lcl9pZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgbW9kZTogJHtmbG93UmVzdWx0fWApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBwYXJhbXMuZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0RXJyb3IoZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG59O1xuY29uc3QgYWRkRXJyb3JDYXRjaGVyRm9ySW5pdCA9IChpbml0KSA9PiB7XG4gIHJldHVybiBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBpbml0KHBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHsgZXJyX18gfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiaW5pdC1lcnJvci1jYXRjaGVyXCIpO1xuICAgICAgZXJyX18oZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgaXNBdmFpbGFibGU6IGZhbHNlLCByZWFzb246IGdldEVycm9yTWVzc2FnZShlcnJvcikgfTtcbiAgICB9XG4gIH07XG59O1xuY29uc3QgY3JlYXRlT2pzRmxvd0xvZ2dlcnMgPSAocHJlZml4KSA9PiB7XG4gIGNvbnN0IGxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgd2luZG93W1wiY29uc29sZVwiXS5sb2coYCR7Y2hhbGsuZ3JlZW4uYm9sZChcIm9qcy9cIil9JHtjaGFsay5ib2xkLmdyYXkoYCR7cHJlZml4fWApfVx0YCwgLi4uYXJncyk7XG4gIH07XG4gIGNvbnN0IGVyciA9ICguLi5hcmdzKSA9PiB7XG4gICAgd2luZG93W1wiY29uc29sZVwiXS5lcnJvcihgJHtjaGFsay5yZWQuYm9sZChcIm9qcy9cIil9JHtjaGFsay5ib2xkLmdyYXkoYCR7cHJlZml4fWApfVx0YCwgLi4uYXJncyk7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbG9nLFxuICAgIGVycixcbiAgICBsb2dfXzogbG9nLFxuICAgIGVycl9fOiBlcnJcbiAgfTtcbn07XG5cbmNvbnN0IHsgbG9nX186IGxvZ19fJDMsIGVycl9fOiBlcnJfXyQ0IH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImNvbW1vbi1jY1wiKTtcbmNvbnN0IHZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDID0gKG5vbkNkZUZvcm1JbnB1dHMsIG9uVmFsaWRhdGlvbkVycm9yKSA9PiB7XG4gIGNvbnN0IHBheWxvYWQgPSBSZXF1aXJlZEZvcm1GaWVsZHMuc2FmZVBhcnNlKG5vbkNkZUZvcm1JbnB1dHMpO1xuICBpZiAoIXBheWxvYWQuc3VjY2Vzcykge1xuICAgIGNvbnN0IGZvcm1hdHRlZCA9IHBheWxvYWQuZXJyb3IuZm9ybWF0KCk7XG4gICAgY29uc3QgaXNzdWVzID0gZXh0cmFjdElzc3Vlc1BlckZpZWxkKGZvcm1hdHRlZCk7XG4gICAgZm9yIChjb25zdCBbZmllbGROYW1lLCBlcnJvcnNdIG9mIE9iamVjdC5lbnRyaWVzKGlzc3VlcykpIHtcbiAgICAgIG9uVmFsaWRhdGlvbkVycm9yKGZpZWxkTmFtZSwgZXJyb3JzLCBmaWVsZE5hbWUpO1xuICAgIH1cbiAgICBlcnJfXyQ0KGBHb3QgdmFsaWRhdGlvbiBlcnJvcnMgaW4gbm9uLUNERSBmb3JtIGZpZWxkc2AsIGlzc3Vlcyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiR290IHZhbGlkYXRpb24gZXJyb3JzIGluIG5vbi1DREUgZm9ybSBmaWVsZHNcIik7XG4gIH1cbiAgcmV0dXJuIHBheWxvYWQuZGF0YTtcbn07XG5jb25zdCB2YWxpZGF0ZVRva2VuaXplQ2FyZFJlc3VsdHMgPSAodG9rZW5pemVSZXN1bHRzLCBvblZhbGlkYXRpb25FcnJvcikgPT4ge1xuICBmb3IgKGNvbnN0IHRva2VuaXplUmVzdWx0IG9mIHRva2VuaXplUmVzdWx0cykge1xuICAgIGlmICh0b2tlbml6ZVJlc3VsdC5zdWNjZXNzID09PSBmYWxzZSkge1xuICAgICAgdG9rZW5pemVSZXN1bHQuZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEFsbEZpZWxkTmFtZXMuc2FmZVBhcnNlKGVycm9yLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgICAgIGVycl9fJDQoYFVua25vd24gZmllbGQgbmFtZSBpbiBvblZhbGlkYXRpb25FcnJvcjogJHtlcnJvci5lbGVtZW50VHlwZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBwYXJzZWQuZGF0YTtcbiAgICAgICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9yLmVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbG9nX18kMyhgRXJyb3IgdG9rZW5pemluZyBjYXJkOiBnb3QgdmFsaWRhdGlvbiBlcnJvcnM6ICR7SlNPTi5zdHJpbmdpZnkodG9rZW5pemVSZXN1bHQuZXJyb3JzKX1gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkdvdCB2YWxpZGF0aW9uIGVycm9ycyB3aGlsZSB0b2tlbml6aW5nIGNhcmRcIik7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCB7IGVycl9fOiBlcnJfXyQzIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImNvbW1tb25cIik7XG5jb25zdCBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlID0gKHJlc3BvbnNlKSA9PiB7XG4gIGlmIChyZXNwb25zZS5wYXltZW50X21ldGhvZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IG9uZSBwYXltZW50IG1ldGhvZCwgZ290ICR7cmVzcG9uc2UucGF5bWVudF9tZXRob2RzLmxlbmd0aH1gKTtcbiAgfVxuICByZXR1cm4geyBwYXltZW50X21ldGhvZF9pZDogcmVzcG9uc2UucGF5bWVudF9tZXRob2RzWzBdLmlkIH07XG59O1xuY29uc3QgZmluZENwbU1hdGNoaW5nVHlwZSA9IChhbGxDUE1zLCB6b2RNb2RlbCkgPT4ge1xuICBjb25zdCBjcG0gPSBhbGxDUE1zLmZpbmQoKGNwbTIpID0+IHpvZE1vZGVsLnNhZmVQYXJzZShjcG0yKS5zdWNjZXNzKTtcbiAgaWYgKCFjcG0pIHtcbiAgICBlcnJfXyQzKGBObyBDUE1zIGZvdW5kIGZvciBtb2RlbCAke3pvZE1vZGVsfWApO1xuICAgIGVycl9fJDMoYWxsQ1BNcyk7XG4gICAgZXJyX18kMyhgem9kTW9kZWxgKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIENQTXMgZm91bmQgZm9yIG1vZGVsICR7em9kTW9kZWx9YCk7XG4gIH1cbiAgcmV0dXJuIHpvZE1vZGVsLnBhcnNlKGNwbSk7XG59O1xuXG5jb25zdCB7IGxvZ19fOiBsb2dfXyQyLCBlcnJfXzogZXJyX18kMiB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJjb21tb24tY2NcIik7XG5jb25zdCB7IGxvZ19fOiBzdHJpcGVMb2dfXyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJzdHJpcGUtY2NcIik7XG5jb25zdCBydW5Db21tb25DY0Zsb3cgPSBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyhcbiAgYXN5bmMgKHsgY29udGV4dCwgY2hlY2tvdXRQYXltZW50TWV0aG9kLCBub25DZGVGb3JtSW5wdXRzLCBmbG93Q2FsbGJhY2tzIH0pID0+IHtcbiAgICBsb2dfXyQyKGDilJwgUnVubmluZyBjb21tb24gQ0MgZmxvdy4uLmAsIHsgY2hlY2tvdXRQYXltZW50TWV0aG9kIH0pO1xuICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgIGxvZ19fJDIoYOKUnCBWYWxpZGF0aW5nIG5vbi1DREUgZm9ybSBmaWVsZHMgW01vZGU6ICR7cHJlZmlsbC5tb2RlfV1gKTtcbiAgICBjb25zdCBub25DZGVGb3JtRmllbGRzID0gdmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0Mobm9uQ2RlRm9ybUlucHV0cywgZmxvd0NhbGxiYWNrcy5vblZhbGlkYXRpb25FcnJvcik7XG4gICAgbG9nX18kMihg4pScIFRva2VuaXppbmcgY2FyZCBpbmZvIGluIENERSBbU2Vzc2lvbjogJHtjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkfV1gKTtcbiAgICBjb25zdCB0b2tlbml6ZUNhcmRSZXN1bHRzID0gYXdhaXQgdG9rZW5pemVDYXJkT25BbGxDb25uZWN0aW9ucyhjb250ZXh0LmNkZUNvbm5lY3Rpb25zLCB7XG4gICAgICBzZXNzaW9uX2lkOiBjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkXG4gICAgfSk7XG4gICAgdmFsaWRhdGVUb2tlbml6ZUNhcmRSZXN1bHRzKHRva2VuaXplQ2FyZFJlc3VsdHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgIGNvbnN0IGNvbW1vbkNoZWNrb3V0UGFyYW1zID0ge1xuICAgICAgc2Vzc2lvbl9pZDogY29udGV4dC5lbGVtZW50c1Nlc3Npb25JZCxcbiAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2QsXG4gICAgICBub25fY2RlX2Zvcm1fZmllbGRzOiBub25DZGVGb3JtRmllbGRzXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgaWYgKHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgIGxvZ19fJDIoYOKUnCBTZXR0aW5nIHVwIHBheW1lbnQgbWV0aG9kIGluIENERSBbVG9rZW46ICR7cHJlZmlsbC50b2tlbn1dYCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNldHVwQ2hlY2tvdXQoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICBsb2dfXyQyKGDilbAgU2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBbUE0gSUQ6ICR7cmVzdWx0LnBheW1lbnRfbWV0aG9kX2lkfV1gKTtcbiAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ19fJDIoYOKUnCBJbml0aWFsIGNoZWNrb3V0IGZsb3cuIENoZWNraW5nIG91dCBjYXJkIGluZm8gaW4gQ0RFIFtTZXNzaW9uOiAke2NvbnRleHQuZWxlbWVudHNTZXNzaW9uSWR9XWApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja291dENhcmRFbGVtZW50cyhhbnlDZGVDb25uZWN0aW9uLCBjb21tb25DaGVja291dFBhcmFtcyk7XG4gICAgICAgIGxvZ19fJDIoYOKVsCBDaGVja291dCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LmApO1xuICAgICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDZGVFcnJvcikge1xuICAgICAgICBpZiAoZXJyb3Iub3JpZ2luYWxFcnJvck1lc3NhZ2UgPT09IFwiM0RTX1JFUVVJUkVEXCIpIHtcbiAgICAgICAgICBsb2dfXyQyKGDilJwgQ2FyZCByZXF1aXJlcyAzRFMsIHN0YXJ0aW5nIG5vbi1sZWdhY3kgcGF5bWVudCBmbG93YCk7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkVXNlTmV3RmxvdyA9IGVycm9yLnJlc3BvbnNlLmhlYWRlcnM/LltcIm9wLXNob3VsZC11c2UtbmV3LWZsb3dcIl0gPT09IFwidHJ1ZVwiO1xuICAgICAgICAgIGNvbnN0IHN0YXJ0UGZSZXN1bHQgPSBhd2FpdCBzdGFydFBheW1lbnRGbG93Rm9yQ0MoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICAgIGxvZ19fJDIoYOKUnCBvcC1zaG91bGQtdXNlLW5ldy1mbG93OiAke3Nob3VsZFVzZU5ld0Zsb3d9YCk7XG4gICAgICAgICAgbG9nX18kMihg4pScIFBheW1lbnQgZmxvdyByZXN1bHQ6YCwgc3RhcnRQZlJlc3VsdCk7XG4gICAgICAgICAgaWYgKHNob3VsZFVzZU5ld0Zsb3cpIHtcbiAgICAgICAgICAgIGF3YWl0IGNvbW1vbkNDM0RTRmxvdyhzdGFydFBmUmVzdWx0LCBjb250ZXh0LmJhc2VVcmwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBzdHJpcGVDQzNEU0Zsb3coc3RhcnRQZlJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICAgICAgbG9nX18kMihg4pScIENvbmZpcm1pbmcgcGF5bWVudCBmbG93IFtjY19wbV9pZDogJHtzdGFydFBmUmVzdWx0LmNjX3BtX2lkfV1gKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBjb25maXJtUGF5bWVudEZsb3coYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW4sXG4gICAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBzdGFydFBmUmVzdWx0LmNjX3BtX2lkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBDb25maXJtIHBheW1lbnQgZmxvdyByZXN1bHQgcmVjZWl2ZWQgUmVzdWx0OmAsIGNvbmZpcm1SZXN1bHQpO1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlZFBheW1lbnRNZXRob2QgPSBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKGNvbmZpcm1SZXN1bHQpO1xuICAgICAgICAgICAgbG9nX18kMihg4pWwIFNldHVwIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgW1BNIElEOiAke2NyZWF0ZWRQYXltZW50TWV0aG9kLnBheW1lbnRfbWV0aG9kX2lkfV1gKTtcbiAgICAgICAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiBjcmVhdGVkUGF5bWVudE1ldGhvZCB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dfXyQyKGDilJwgQ2hlY2tpbmcgb3V0IGFmdGVyIDNEUyBmbG93IFtGbG93OiAke3Nob3VsZFVzZU5ld0Zsb3cgPyBcIm5ld1wiIDogXCJsZWdhY3lcIn1dYCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja291dENhcmRFbGVtZW50cyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgICAgICAgIC4uLmNvbW1vbkNoZWNrb3V0UGFyYW1zLFxuICAgICAgICAgICAgICBleGlzdGluZ19jY19wbV9pZDogc3RhcnRQZlJlc3VsdC5jY19wbV9pZCxcbiAgICAgICAgICAgICAgZG9fbm90X3VzZV9sZWdhY3lfY2NfZmxvdzogIXNob3VsZFVzZU5ld0Zsb3dcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9nX18kMihg4pWwIENoZWNrb3V0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuYCk7XG4gICAgICAgICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZXJyX18kMihg4pWwIEVycm9yIGNoZWNraW5nIG91dCBjYXJkIGluZm8gaW4gQ0RFYCk7XG4gICAgICBlcnJfXyQyKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuKTtcbmNvbnN0IHBhcnNlU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gKHJlc3BvbnNlKSA9PiB7XG4gIGNvbnN0IHN0cmlwZUFjdGlvbiA9IHJlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5maW5kKChhY3Rpb24pID0+IGFjdGlvbi50eXBlID09PSBcInN0cmlwZV8zZHNcIik7XG4gIGlmICghc3RyaXBlQWN0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc3RyaXBlIDNEUyBhY3Rpb24gZm91bmRcIik7XG4gIH1cbiAgcmV0dXJuIFN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShzdHJpcGVBY3Rpb24pO1xufTtcbmNvbnN0IHBhcnNlQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gKHJlc3BvbnNlKSA9PiB7XG4gIGNvbnN0IGNvbW1vbkFjdGlvbiA9IHJlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5maW5kKChhY3Rpb24pID0+IGFjdGlvbi50eXBlID09PSBcImFpcndhbGxleF9wYXltZW50X2NvbnNlbnRcIik7XG4gIGlmICghY29tbW9uQWN0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29tbW9uIDNEUyBhY3Rpb24gZm91bmRcIik7XG4gIH1cbiAgcmV0dXJuIENvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShjb21tb25BY3Rpb24pO1xufTtcbmNvbnN0IGNvbW1vbkNDM0RTRmxvdyA9IGFzeW5jIChzdGFydFBmUmVzdWx0LCBiYXNlVXJsKSA9PiB7XG4gIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBhcnNlQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhKHN0YXJ0UGZSZXN1bHQpO1xuICBsb2dfXyQyKGDilJwgVXNpbmcgY29tbW9uIDNEUyBmbG93IFtVUkw6ICR7bmV4dEFjdGlvbk1ldGFkYXRhLnJlZGlyZWN0X3VybH1dYCk7XG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHN0YXJ0M2RzVmVyaWZpY2F0aW9uKHsgdXJsOiBuZXh0QWN0aW9uTWV0YWRhdGEucmVkaXJlY3RfdXJsLCBiYXNlVXJsIH0pO1xuICBsb2dfXyQyKGDilbAgM0RTIHZlcmlmaWNhdGlvbiBjb21wbGV0ZWQgW1N0YXR1czogJHtzdGF0dXN9XWApO1xuICBpZiAoc3RhdHVzID09PSBUaHJlZURTU3RhdHVzLkNBTkNFTExFRCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIjNEUyB2ZXJpZmljYXRpb24gY2FuY2VsbGVkXCIpO1xuICB9XG4gIGlmIChzdGF0dXMgPT09IFRocmVlRFNTdGF0dXMuRkFJTFVSRSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIjNEUyB2ZXJpZmljYXRpb24gZmFpbGVkXCIpO1xuICB9XG59O1xuY29uc3Qgc3RyaXBlQ0MzRFNGbG93ID0gYXN5bmMgKHN0YXJ0UGZSZXN1bHQpID0+IHtcbiAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gcGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEoc3RhcnRQZlJlc3VsdCk7XG4gIHN0cmlwZUxvZ19fKGDilJwgVXNpbmcgc3RyaXBlIDNEUyBmbG93IFtDbGllbnQgU2VjcmV0OiAke25leHRBY3Rpb25NZXRhZGF0YS5jbGllbnRfc2VjcmV0LnN1YnN0cmluZygwLCA4KX0uLi5dYCk7XG4gIGF3YWl0IGxhdW5jaFN0cmlwZTNEU0RpYWxvZ0Zsb3cobmV4dEFjdGlvbk1ldGFkYXRhKTtcbiAgc3RyaXBlTG9nX18oXCLilbAgU3RyaXBlIDNEUyBmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcIik7XG59O1xuXG5jb25zdCB7IGxvZ19fOiBsb2dfXyQxLCBlcnJfXzogZXJyX18kMSB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJzdHJpcGUtcHJcIik7XG5jb25zdCBTdHJpcGVQckNwbSA9IHoub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHoudW5pb24oW3oubGl0ZXJhbChcImFwcGxlX3BheVwiKSwgei5saXRlcmFsKFwiZ29vZ2xlX3BheVwiKV0pLFxuICBwcm9jZXNzb3JfbmFtZTogei5saXRlcmFsKFwic3RyaXBlXCIpLFxuICBtZXRhZGF0YTogei5vYmplY3Qoe1xuICAgIHN0cmlwZV9wazogei5zdHJpbmcoKVxuICB9KVxufSk7XG5jb25zdCBpbml0U3RyaXBlUHJGbG93ID0gYWRkRXJyb3JDYXRjaGVyRm9ySW5pdChcbiAgYXN5bmMgKHsgY29udGV4dCB9KSA9PiB7XG4gICAgbG9nX18kMShgQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIGFueSBDUE1zIGZvciBTdHJpcGUgUFIuLi5gKTtcbiAgICBjb25zdCBjaGVja291dFBheW1lbnRNZXRob2QgPSBmaW5kQ3BtTWF0Y2hpbmdUeXBlKGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgU3RyaXBlUHJDcG0pO1xuICAgIGxvZ19fJDEoYEluaXRpYWxpemluZyBTdHJpcGUgUFIgZmxvdy4uLmApO1xuICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgIGNvbnN0IGlzU2V0dXBNb2RlID0gcHJlZmlsbC5tb2RlID09PSBcInNldHVwXCI7XG4gICAgbG9nX18kMShgR2V0dGluZyBpbml0aWFsIHByZXZpZXcgYW1vdW50YCk7XG4gICAgY29uc3QgaW5pdGlhbFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFByZXZpZXdBbW91bnQoYW55Q2RlQ29ubmVjdGlvbiwgcHJlZmlsbC50b2tlbiwgaXNTZXR1cE1vZGUsIHZvaWQgMCk7XG4gICAgY29uc3QgcHIgPSBhd2FpdCBjcmVhdGVTdHJpcGVQYXltZW50UmVxdWVzdChcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZC5tZXRhZGF0YS5zdHJpcGVfcGssXG4gICAgICBpbml0aWFsUHJldmlldy5hbW91bnRBdG9tLFxuICAgICAgaW5pdGlhbFByZXZpZXcuY3VycmVuY3ksXG4gICAgICBpc1NldHVwTW9kZVxuICAgICk7XG4gICAgbG9nX18kMShgQ2hlY2tpbmcgaWYgY2FuIG1ha2UgcGF5bWVudGApO1xuICAgIGNvbnN0IGNhbk1ha2VQYXltZW50ID0gYXdhaXQgcHIuY2FuTWFrZVBheW1lbnQoKTtcbiAgICBpZiAoY2FuTWFrZVBheW1lbnQgPT09IG51bGwpIHtcbiAgICAgIGVycl9fJDEoYGNhbk1ha2VQYXltZW50IHJldHVybmVkIG51bGxgKTtcbiAgICAgIHJldHVybiB7IGlzQXZhaWxhYmxlOiBmYWxzZSwgcmVhc29uOiBcImNhbk1ha2VQYXltZW50IHJldHVybmVkIG51bGxcIiB9O1xuICAgIH1cbiAgICBsb2dfXyQxKGBTdHJpcGUgUFIgZmxvdyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuIENhbiBtYWtlIHBheW1lbnRgLCBjYW5NYWtlUGF5bWVudCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQXZhaWxhYmxlOiB0cnVlLFxuICAgICAgcHIsXG4gICAgICBhdmFpbGFibGVQcm92aWRlcnM6IHtcbiAgICAgICAgYXBwbGVQYXk6IGNhbk1ha2VQYXltZW50LmFwcGxlUGF5LFxuICAgICAgICBnb29nbGVQYXk6IGNhbk1ha2VQYXltZW50Lmdvb2dsZVBheVxuICAgICAgfVxuICAgIH07XG4gIH1cbik7XG5jb25zdCBydW5TdHJpcGVQckZsb3cgPSBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyhcbiAgYXN5bmMgKHtcbiAgICBjb250ZXh0LFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICBub25DZGVGb3JtSW5wdXRzLFxuICAgIGZsb3dDYWxsYmFja3MsXG4gICAgY3VzdG9tUGFyYW1zLFxuICAgIGluaXRSZXN1bHRcbiAgfSkgPT4ge1xuICAgIGxvZ19fJDEoYFJ1bm5pbmcgU3RyaXBlIFBSIGZsb3cuLi5gKTtcbiAgICBpZiAoY3VzdG9tUGFyYW1zLnByb3ZpZGVyICE9PSBjaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvdmlkZXIgbWlzbWF0Y2guIEV4cGVjdGVkICR7Y3VzdG9tUGFyYW1zLnByb3ZpZGVyfSwgZ290ICR7Y2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyfWApO1xuICAgIH1cbiAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICBjb25zdCBwciA9IGluaXRSZXN1bHQucHI7XG4gICAgaWYgKGN1c3RvbVBhcmFtcz8ub3ZlcnJpZGVQYXltZW50UmVxdWVzdCkge1xuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBjdXN0b21QYXJhbXMub3ZlcnJpZGVQYXltZW50UmVxdWVzdDtcbiAgICAgIGxvZ19fJDEoYE92ZXJyaWRpbmcgUFIgYW1vdW50IHdpdGhgLCBvdmVycmlkZSk7XG4gICAgICB1cGRhdGVQcldpdGhBbW91bnQocHIsIG92ZXJyaWRlLmFtb3VudCwgb3ZlcnJpZGUucGVuZGluZyk7XG4gICAgfVxuICAgIGxvZ19fJDEoYFNob3dpbmcgUFIgZGlhbG9nLi4uYCk7XG4gICAgcHIuc2hvdygpO1xuICAgIGNvbnN0IHN0cmlwZVBtQWRkZWRFdmVudCA9IGF3YWl0IHdhaXRGb3JVc2VyVG9BZGRQYXltZW50TWV0aG9kKHByKTtcbiAgICBsb2dfXyQxKGBTdHJpcGUgUE0gYWRkZWQgZXZlbnQ6YCwgc3RyaXBlUG1BZGRlZEV2ZW50KTtcbiAgICBsb2dfXyQxKGBNZXJnaW5nIFBNIGZpZWxkcyB3aXRoIGZvcm0gZmllbGRzLi4uYCk7XG4gICAgY29uc3QgbWVyZ2VkSW5wdXRzID0gZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQbShub25DZGVGb3JtSW5wdXRzLCBzdHJpcGVQbUFkZGVkRXZlbnQpO1xuICAgIGNvbnN0IG5vbkNkZUZvcm1GaWVsZHMgPSB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyhtZXJnZWRJbnB1dHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgIGxvZ19fJDEoYFBSIGRpYWxvZyBmaW5pc2hlZC4gU3RhcnRpbmcgcGF5bWVudCBmbG93Li4uYCk7XG4gICAgY29uc3Qgc3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlID0gYXdhaXQgc3RhcnRQYXltZW50Rmxvd0ZvclBSKGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgIGZpZWxkczogbm9uQ2RlRm9ybUZpZWxkcyxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZFxuICAgIH0pO1xuICAgIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBhcnNlUFJOZXh0QWN0aW9uTWV0YWRhdGEoc3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlKTtcbiAgICBsb2dfXyQxKGBDb25maXJtaW5nIFBSIHdpdGggU3RyaXBlLi4uYCk7XG4gICAgYXdhaXQgY29uZmlybVN0cmlwZVByUE0obmV4dEFjdGlvbk1ldGFkYXRhLCBzdHJpcGVQbUFkZGVkRXZlbnQpO1xuICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgbG9nX18kMShgQ29uZmlybWluZyBwYXltZW50IGZsb3cgZm9yIHNldHVwLi4uYCk7XG4gICAgICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgY29uZmlybVBheW1lbnRGbG93KGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRQYXltZW50TWV0aG9kID0gcGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZShjb25maXJtUmVzdWx0KTtcbiAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiBjcmVhdGVkUGF5bWVudE1ldGhvZCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dfXyQxKGBQZXJmb3JtaW5nIGNoZWNrb3V0Li4uYCk7XG4gICAgICBjb25zdCBjaGVja291dFJlcXVlc3QgPSB7XG4gICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgcGF5bWVudF9pbnB1dDoge1xuICAgICAgICAgIHByb3ZpZGVyX3R5cGU6IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlclxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21lcl9lbWFpbDogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuRU1BSUxdLFxuICAgICAgICBjdXN0b21lcl96aXBfY29kZTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuWklQX0NPREVdLFxuICAgICAgICBjdXN0b21lcl9jb3VudHJ5OiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5DT1VOVFJZXSxcbiAgICAgICAgcHJvbW90aW9uX2NvZGU6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLlBST01PVElPTl9DT0RFXSxcbiAgICAgICAgbGluZV9pdGVtczogcHJlZmlsbC5saW5lX2l0ZW1zLFxuICAgICAgICB0b3RhbF9hbW91bnRfYXRvbTogcHJlZmlsbC5hbW91bnRfdG90YWxfYXRvbSxcbiAgICAgICAgY2FuY2VsX2F0X2VuZDogZmFsc2UsXG4gICAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2RcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwZXJmb3JtQ2hlY2tvdXQoYW55Q2RlQ29ubmVjdGlvbiwgY2hlY2tvdXRSZXF1ZXN0KTtcbiAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgfVxuICB9XG4pO1xuY29uc3QgZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQbSA9IChmb3JtSW5wdXRzLCBzdHJpcGVQbUV2dCkgPT4ge1xuICBjb25zdCBpbnB1dHMgPSB7IC4uLmZvcm1JbnB1dHMgfTtcbiAgY29uc3QgW3BheWVyRmlyc3ROYW1lLCAuLi5wYXllckxhc3ROYW1lUGFydHNdID0gc3RyaXBlUG1FdnQucGF5ZXJOYW1lPy50cmltKCk/LnNwbGl0KC9cXHMrLykgPz8gW107XG4gIGNvbnN0IHBheWVyTGFzdE5hbWUgPSBwYXllckxhc3ROYW1lUGFydHMuam9pbihcIiBcIikgfHwgdm9pZCAwO1xuICBpbnB1dHNbRmllbGROYW1lLkZJUlNUX05BTUVdID0gaW5wdXRzW0ZpZWxkTmFtZS5GSVJTVF9OQU1FXSB8fCBwYXllckZpcnN0TmFtZSB8fCBcIl9PUF9VTktOT1dOXCI7XG4gIGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSB8fCBwYXllckxhc3ROYW1lIHx8IFwiX09QX1VOS05PV05cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5FTUFJTF0gPSBpbnB1dHNbRmllbGROYW1lLkVNQUlMXSB8fCBzdHJpcGVQbUV2dC5wYXllckVtYWlsIHx8IFwib3BfdW5maWxsZWRAZ2V0b3BlbnBheS5jb21cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gPSBpbnB1dHNbRmllbGROYW1lLlpJUF9DT0RFXSB8fCBzdHJpcGVQbUV2dC5zaGlwcGluZ0FkZHJlc3M/LnBvc3RhbENvZGUgfHwgXCIwMDAwMFwiO1xuICBpbnB1dHNbRmllbGROYW1lLkNPVU5UUlldID0gaW5wdXRzW0ZpZWxkTmFtZS5DT1VOVFJZXSB8fCBzdHJpcGVQbUV2dC5zaGlwcGluZ0FkZHJlc3M/LmNvdW50cnkgfHwgXCJVU1wiO1xuICBsb2dfXyQxKGBGaW5hbCBmb3JtIGlucHV0czpgLCBpbnB1dHMpO1xuICByZXR1cm4gaW5wdXRzO1xufTtcbmNvbnN0IHVwZGF0ZVByV2l0aEFtb3VudCA9IChwciwgYW1vdW50LCBpc1BlbmRpbmcpID0+IHtcbiAgcHIudXBkYXRlKHtcbiAgICB0b3RhbDoge1xuICAgICAgYW1vdW50OiBhbW91bnQuYW1vdW50QXRvbSxcbiAgICAgIGxhYmVsOiBcIlRvdGFsXCIsXG4gICAgICBwZW5kaW5nOiBpc1BlbmRpbmdcbiAgICB9LFxuICAgIGN1cnJlbmN5OiBhbW91bnQuY3VycmVuY3lcbiAgfSk7XG59O1xuY29uc3QgcGFyc2VQUk5leHRBY3Rpb25NZXRhZGF0YSA9IChyZXNwb25zZSkgPT4ge1xuICBpZiAocmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igb2NjdXJyZWQuXG5EZXRhaWxzOiBnb3QgJHtyZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMubGVuZ3RofSByZXF1aXJlZCB1c2VyIGFjdGlvbnNgKTtcbiAgfVxuICByZXR1cm4gUGF5bWVudFJlcXVlc3ROZXh0QWN0aW9uTWV0YWRhdGEucGFyc2UocmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zWzBdKTtcbn07XG5cbmNvbnN0IGZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QgPSAoY3Btcywgd2l0aFByb3ZpZGVyLCB3aXRoUHJvY2Vzc29yKSA9PiB7XG4gIGNvbnN0IG1hdGNoZXMgPSBjcG1zLmZpbHRlcigoY3BtKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlc1Byb2Nlc3NvciA9IHRydWUgO1xuICAgIGNvbnN0IG1hdGNoZXNQcm92aWRlciA9IGNwbS5wcm92aWRlciA9PT0gd2l0aFByb3ZpZGVyO1xuICAgIHJldHVybiBtYXRjaGVzUHJvY2Vzc29yICYmIG1hdGNoZXNQcm92aWRlcjtcbiAgfSk7XG4gIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ1BNcyBmb3VuZCB3aXRoIHByb3ZpZGVyICcke3dpdGhQcm92aWRlcn0nIGFuZCBwcm9jZXNzb3IgJyR7d2l0aFByb2Nlc3Nvcn0nYCk7XG4gIH1cbiAgaWYgKG1hdGNoZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gb25lIENQTSBmb3VuZCB3aXRoIHByb3ZpZGVyICcke3dpdGhQcm92aWRlcn0nIGFuZCBwcm9jZXNzb3IgJyR7d2l0aFByb2Nlc3Nvcn0nYCk7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXNbMF07XG59O1xuY29uc3QgT2pzRmxvd3MgPSB7XG4gIC8vIOKciyBOb3RlOiBGb3IgZmxvd3MgdGhhdCByZXF1aXJlIGluaXRpYWxpemF0aW9uLCBwbGVhc2UgYWRkIHRoZW0gdG8gYGluaXQtZmxvd3MudHNgXG4gIC8vIFN0cmlwZVxuICBjb21tb25DQzoge1xuICAgIHJ1bjogcnVuQ29tbW9uQ2NGbG93XG4gIH0sXG4gIHN0cmlwZVBSOiB7XG4gICAgaW5pdDogaW5pdFN0cmlwZVByRmxvdyxcbiAgICBydW46IHJ1blN0cmlwZVByRmxvd1xuICB9XG4gIC8vIPCfkYkgQWRkIG1vcmUgZmxvd3MgaGVyZVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcblx0cmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDtcbn1cblxudmFyIE9ic2VydmFibGUkMiA9IHt9O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoT2JzZXJ2YWJsZSQyLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYnNlcnZhYmxlJDIuT2JzZXJ2YWJsZSA9IHZvaWQgMDtcblxuLy8gPT09IFN5bWJvbCBTdXBwb3J0ID09PVxuY29uc3QgaGFzU3ltYm9sID0gbmFtZSA9PiBCb29sZWFuKFN5bWJvbFtuYW1lXSk7XG5cbmNvbnN0IGdldFN5bWJvbCA9IG5hbWUgPT4gaGFzU3ltYm9sKG5hbWUpID8gU3ltYm9sW25hbWVdIDogJ0BAJyArIG5hbWU7XG5cbmNvbnN0IFN5bWJvbEl0ZXJhdG9yID0gZ2V0U3ltYm9sKCdpdGVyYXRvcicpO1xuY29uc3QgU3ltYm9sT2JzZXJ2YWJsZSA9IGdldFN5bWJvbCgnb2JzZXJ2YWJsZScpO1xuY29uc3QgU3ltYm9sU3BlY2llcyA9IGdldFN5bWJvbCgnc3BlY2llcycpOyAvLyA9PT0gQWJzdHJhY3QgT3BlcmF0aW9ucyA9PT1cblxuZnVuY3Rpb24gZ2V0TWV0aG9kKG9iaiwga2V5KSB7XG4gIGxldCB2YWx1ZSA9IG9ialtrZXldO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcih2YWx1ZSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBnZXRTcGVjaWVzKG9iaikge1xuICBsZXQgY3RvciA9IG9iai5jb25zdHJ1Y3RvcjtcblxuICBpZiAoY3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY3RvciA9IGN0b3JbU3ltYm9sU3BlY2llc107XG5cbiAgICBpZiAoY3RvciA9PT0gbnVsbCkge1xuICAgICAgY3RvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3RvciAhPT0gdW5kZWZpbmVkID8gY3RvciA6IE9ic2VydmFibGUkMTtcbn1cblxuZnVuY3Rpb24gaXNPYnNlcnZhYmxlKHgpIHtcbiAgcmV0dXJuIHggaW5zdGFuY2VvZiBPYnNlcnZhYmxlJDE7IC8vIFNQRUM6IEJyYW5kIGNoZWNrXG59XG5cbmZ1bmN0aW9uIGhvc3RSZXBvcnRFcnJvcihlKSB7XG4gIGlmIChob3N0UmVwb3J0RXJyb3IubG9nKSB7XG4gICAgaG9zdFJlcG9ydEVycm9yLmxvZyhlKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5xdWV1ZShmbikge1xuICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgZm4oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBob3N0UmVwb3J0RXJyb3IoZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgbGV0IGNsZWFudXAgPSBzdWJzY3JpcHRpb24uX2NsZWFudXA7XG4gIGlmIChjbGVhbnVwID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgc3Vic2NyaXB0aW9uLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuXG4gIGlmICghY2xlYW51cCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiBjbGVhbnVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB1bnN1YnNjcmliZSA9IGdldE1ldGhvZChjbGVhbnVwLCAndW5zdWJzY3JpYmUnKTtcblxuICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgIHVuc3Vic2NyaWJlLmNhbGwoY2xlYW51cCk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikge1xuICBzdWJzY3JpcHRpb24uX29ic2VydmVyID0gdW5kZWZpbmVkO1xuICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gdW5kZWZpbmVkO1xuICBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ2Nsb3NlZCc7XG59XG5cbmZ1bmN0aW9uIGZsdXNoU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikge1xuICBsZXQgcXVldWUgPSBzdWJzY3JpcHRpb24uX3F1ZXVlO1xuXG4gIGlmICghcXVldWUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gdW5kZWZpbmVkO1xuICBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ3JlYWR5JztcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgbm90aWZ5U3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgcXVldWVbaV0udHlwZSwgcXVldWVbaV0udmFsdWUpO1xuICAgIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnY2xvc2VkJykgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm90aWZ5U3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgdHlwZSwgdmFsdWUpIHtcbiAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdydW5uaW5nJztcbiAgbGV0IG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vYnNlcnZlcjtcblxuICB0cnkge1xuICAgIGxldCBtID0gZ2V0TWV0aG9kKG9ic2VydmVyLCB0eXBlKTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbmV4dCc6XG4gICAgICAgIGlmIChtKSBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgY2xvc2VTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlciwgdmFsdWUpO2Vsc2UgdGhyb3cgdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIGlmIChtKSBtLmNhbGwob2JzZXJ2ZXIpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBob3N0UmVwb3J0RXJyb3IoZSk7XG4gIH1cblxuICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtlbHNlIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAncnVubmluZycpIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncmVhZHknO1xufVxuXG5mdW5jdGlvbiBvbk5vdGlmeShzdWJzY3JpcHRpb24sIHR5cGUsIHZhbHVlKSB7XG4gIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnY2xvc2VkJykgcmV0dXJuO1xuXG4gIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnYnVmZmVyaW5nJykge1xuICAgIHN1YnNjcmlwdGlvbi5fcXVldWUucHVzaCh7XG4gICAgICB0eXBlLFxuICAgICAgdmFsdWVcbiAgICB9KTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlICE9PSAncmVhZHknKSB7XG4gICAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdidWZmZXJpbmcnO1xuICAgIHN1YnNjcmlwdGlvbi5fcXVldWUgPSBbe1xuICAgICAgdHlwZSxcbiAgICAgIHZhbHVlXG4gICAgfV07XG4gICAgZW5xdWV1ZSgoKSA9PiBmbHVzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSk7XG59XG5cbmNsYXNzIFN1YnNjcmlwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG9ic2VydmVyLCBzdWJzY3JpYmVyKSB7XG4gICAgLy8gQVNTRVJUOiBvYnNlcnZlciBpcyBhbiBvYmplY3RcbiAgICAvLyBBU1NFUlQ6IHN1YnNjcmliZXIgaXMgY2FsbGFibGVcbiAgICB0aGlzLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX29ic2VydmVyID0gb2JzZXJ2ZXI7XG4gICAgdGhpcy5fcXVldWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3RhdGUgPSAnaW5pdGlhbGl6aW5nJztcbiAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgbGV0IHN1YnNjcmlwdGlvbk9ic2VydmVyID0ge1xuICAgICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX3N0YXRlID09PSAnY2xvc2VkJztcbiAgICAgIH0sXG5cbiAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgb25Ob3RpZnkoc2VsZiwgJ25leHQnLCB2YWx1ZSk7XG4gICAgICB9LFxuXG4gICAgICBlcnJvcih2YWx1ZSkge1xuICAgICAgICBvbk5vdGlmeShzZWxmLCAnZXJyb3InLCB2YWx1ZSk7XG4gICAgICB9LFxuXG4gICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgb25Ob3RpZnkoc2VsZiwgJ2NvbXBsZXRlJyk7XG4gICAgICB9XG5cbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2NsZWFudXAgPSBzdWJzY3JpYmVyLmNhbGwodW5kZWZpbmVkLCBzdWJzY3JpcHRpb25PYnNlcnZlcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSAnaW5pdGlhbGl6aW5nJykgdGhpcy5fc3RhdGUgPSAncmVhZHknO1xuICB9XG5cbiAgZ2V0IGNsb3NlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUgPT09ICdjbG9zZWQnO1xuICB9XG5cbiAgdW5zdWJzY3JpYmUoKSB7XG4gICAgaWYgKHRoaXMuX3N0YXRlICE9PSAnY2xvc2VkJykge1xuICAgICAgY2xvc2VTdWJzY3JpcHRpb24odGhpcyk7XG4gICAgICBjbGVhbnVwU3Vic2NyaXB0aW9uKHRoaXMpO1xuICAgIH1cbiAgfVxuXG59XG5cbmxldCBPYnNlcnZhYmxlJDEgPSBjbGFzcyBPYnNlcnZhYmxlIHtcbiAgY29uc3RydWN0b3Ioc3Vic2NyaWJlcikge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JzZXJ2YWJsZSBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24nKTtcbiAgICBpZiAodHlwZW9mIHN1YnNjcmliZXIgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ09ic2VydmFibGUgaW5pdGlhbGl6ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgdGhpcy5fc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG4gIH1cblxuICBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSAnb2JqZWN0JyB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgb2JzZXJ2ZXIgPSB7XG4gICAgICAgIG5leHQ6IG9ic2VydmVyLFxuICAgICAgICBlcnJvcjogYXJndW1lbnRzWzFdLFxuICAgICAgICBjb21wbGV0ZTogYXJndW1lbnRzWzJdXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKG9ic2VydmVyLCB0aGlzLl9zdWJzY3JpYmVyKTtcbiAgfVxuXG4gIGZvckVhY2goZm4pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHN1YnNjcmlwdGlvbiA9IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmbih2YWx1ZSwgZG9uZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICAgIGNvbXBsZXRlOiByZXNvbHZlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG1hcChmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB0aGlzLnN1YnNjcmliZSh7XG4gICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFsdWUgPSBmbih2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0sXG5cbiAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICB9LFxuXG4gICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgIH0pKTtcbiAgfVxuXG4gIGZpbHRlcihmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB0aGlzLnN1YnNjcmliZSh7XG4gICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFmbih2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgfSxcblxuICAgICAgZXJyb3IoZSkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgfSkpO1xuICB9XG5cbiAgcmVkdWNlKGZuKSB7XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgbGV0IGhhc1NlZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMTtcbiAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICBsZXQgc2VlZCA9IGFyZ3VtZW50c1sxXTtcbiAgICBsZXQgYWNjID0gc2VlZDtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICBsZXQgZmlyc3QgPSAhaGFzVmFsdWU7XG4gICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIWZpcnN0IHx8IGhhc1NlZWQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYWNjID0gZm4oYWNjLCB2YWx1ZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY2MgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZXJyb3IoZSkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICBpZiAoIWhhc1ZhbHVlICYmICFoYXNTZWVkKSByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IobmV3IFR5cGVFcnJvcignQ2Fubm90IHJlZHVjZSBhbiBlbXB0eSBzZXF1ZW5jZScpKTtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChhY2MpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgYWxsKCkge1xuICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICBhd2FpdCB0aGlzLmZvckVhY2godmFsdWUgPT4gdmFsdWVzLnB1c2godmFsdWUpKTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgY29uY2F0KC4uLnNvdXJjZXMpIHtcbiAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgIGxldCBzdWJzY3JpcHRpb247XG4gICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICBmdW5jdGlvbiBzdGFydE5leHQobmV4dCkge1xuICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXh0LnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dCh2KSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHYpO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXJ0TmV4dChDLmZyb20oc291cmNlc1tpbmRleCsrXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgc3RhcnROZXh0KHRoaXMpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZsYXRNYXAoZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgbGV0IHN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICAgIGxldCBvdXRlciA9IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgIGlmIChmbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBmbih2YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgaW5uZXIgPSBDLmZyb20odmFsdWUpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgICAgICBsZXQgaSA9IHN1YnNjcmlwdGlvbnMuaW5kZXhPZihpbm5lcik7XG4gICAgICAgICAgICAgIGlmIChpID49IDApIHN1YnNjcmlwdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICBjb21wbGV0ZUlmRG9uZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKGlubmVyKTtcbiAgICAgICAgfSxcblxuICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgY29tcGxldGVJZkRvbmUoKTtcbiAgICAgICAgfVxuXG4gICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gY29tcGxldGVJZkRvbmUoKSB7XG4gICAgICAgIGlmIChvdXRlci5jbG9zZWQgJiYgc3Vic2NyaXB0aW9ucy5sZW5ndGggPT09IDApIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIG91dGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgW1N5bWJvbE9ic2VydmFibGVdKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc3RhdGljIGZyb20oeCkge1xuICAgIGxldCBDID0gdHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogT2JzZXJ2YWJsZTtcbiAgICBpZiAoeCA9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKHggKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICBsZXQgbWV0aG9kID0gZ2V0TWV0aG9kKHgsIFN5bWJvbE9ic2VydmFibGUpO1xuXG4gICAgaWYgKG1ldGhvZCkge1xuICAgICAgbGV0IG9ic2VydmFibGUgPSBtZXRob2QuY2FsbCh4KTtcbiAgICAgIGlmIChPYmplY3Qob2JzZXJ2YWJsZSkgIT09IG9ic2VydmFibGUpIHRocm93IG5ldyBUeXBlRXJyb3Iob2JzZXJ2YWJsZSArICcgaXMgbm90IGFuIG9iamVjdCcpO1xuICAgICAgaWYgKGlzT2JzZXJ2YWJsZShvYnNlcnZhYmxlKSAmJiBvYnNlcnZhYmxlLmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiBvYnNlcnZhYmxlLnN1YnNjcmliZShvYnNlcnZlcikpO1xuICAgIH1cblxuICAgIGlmIChoYXNTeW1ib2woJ2l0ZXJhdG9yJykpIHtcbiAgICAgIG1ldGhvZCA9IGdldE1ldGhvZCh4LCBTeW1ib2xJdGVyYXRvcik7XG5cbiAgICAgIGlmIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcblxuICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBtZXRob2QuY2FsbCh4KSkge1xuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW0pO1xuICAgICAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeFtpXSk7XG4gICAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHggKyAnIGlzIG5vdCBvYnNlcnZhYmxlJyk7XG4gIH1cblxuICBzdGF0aWMgb2YoLi4uaXRlbXMpIHtcbiAgICBsZXQgQyA9IHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IE9ic2VydmFibGU7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgIGVucXVldWUoKCkgPT4ge1xuICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoaXRlbXNbaV0pO1xuICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgW1N5bWJvbFNwZWNpZXNdKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbn07XG5cbk9ic2VydmFibGUkMi5PYnNlcnZhYmxlID0gT2JzZXJ2YWJsZSQxO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KE9ic2VydmFibGUkMSwgU3ltYm9sKCdleHRlbnNpb25zJyksIHtcbiAgdmFsdWU6IHtcbiAgICBzeW1ib2w6IFN5bWJvbE9ic2VydmFibGUsXG4gICAgaG9zdFJlcG9ydEVycm9yXG4gIH0sXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG5cbnZhciB6ZW5PYnNlcnZhYmxlID0gT2JzZXJ2YWJsZSQyLk9ic2VydmFibGU7XG5cbmNvbnN0IE9ic2VydmFibGUgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoemVuT2JzZXJ2YWJsZSk7XG5cbmNvbnN0IHsgbG9nX18sIGVycl9fIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImluaXQtZmxvd3NcIik7XG5jb25zdCBpbml0aWFsaXplT2pzRmxvd3MgPSAoY29udGV4dCkgPT4ge1xuICByZXR1cm4ge1xuICAgIC8vIFN0cmlwZSBQUlxuICAgIHN0cmlwZVBSOiBydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZShcInN0cmlwZVBSXCIsIE9qc0Zsb3dzLnN0cmlwZVBSLmluaXQoeyBjb250ZXh0IH0pKVxuICAgIC8vIPCfkYkgQWRkIGluaXRpYWxpemF0aW9uIGZsb3dzIGhlcmVcbiAgfTtcbn07XG5jb25zdCBydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZSA9IChmbG93TmFtZSwgaW5pdEZsb3cpID0+IHtcbiAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgIG9ic2VydmVyLm5leHQoeyBzdGF0dXM6IFwibG9hZGluZ1wiIH0pO1xuICAgIGluaXRGbG93LnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJsb2FkZWRcIiwgcmVzdWx0IH0pO1xuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgIH0pO1xuICB9KTtcbiAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUoe1xuICAgIG5leHQ6IChyZXN1bHQpID0+IHtcbiAgICAgIGxvZ19fKGAke2Zsb3dOYW1lfSBmbG93IHJlc3VsdGAsIHJlc3VsdCk7XG4gICAgfSxcbiAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICBlcnJfXyhgJHtmbG93TmFtZX0gZmxvdyBpbml0aWFsaXphdGlvbiBlcnJvcjpcbiR7SlNPTi5zdHJpbmdpZnkoZXJyb3IpfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG9ic2VydmFibGU7XG59O1xuXG5jb25zdCBQUl9MT0FESU5HID0ge1xuICBpc0xvYWRpbmc6IHRydWUsXG4gIGlzQXZhaWxhYmxlOiBmYWxzZSxcbiAgc3RhcnRGbG93OiBhc3luYyAoKSA9PiB7XG4gIH1cbn07XG5jb25zdCBQUl9FUlJPUiA9IHtcbiAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgaXNBdmFpbGFibGU6IGZhbHNlLFxuICBzdGFydEZsb3c6IGFzeW5jICgpID0+IHtcbiAgfVxufTtcblxuY2xhc3MgT3BlblBheUZvcm1FdmVudEhhbmRsZXIge1xuICBjb25zdHJ1Y3Rvcihmb3JtSW5zdGFuY2UpIHtcbiAgICB0aGlzLmZvcm1JbnN0YW5jZSA9IGZvcm1JbnN0YW5jZTtcbiAgICB0aGlzLmNvbmZpZyA9IGZvcm1JbnN0YW5jZS5jb25maWc7XG4gICAgdGhpcy5mb3JtSWQgPSBmb3JtSW5zdGFuY2UuZm9ybUlkO1xuICAgIHRoaXMuZXZlbnRUYXJnZXRzID0ge307XG4gICAgdGhpcy5ub25jZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICB9XG4gIGhhbmRsZU1lc3NhZ2UoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50LnNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgZm91bmRgKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gdGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLl9mcmFtZVVybD8ub3JpZ2luKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBldmVudC5kYXRhW1wicGVucGFsXCJdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50RGF0YSA9IHBhcnNlRXZlbnRQYXlsb2FkKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpO1xuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlRXZlbnQoZXZlbnREYXRhKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybjtcbiAgICBjb25zdCB7IGVsZW1lbnRJZCwgcGF5bG9hZCB9ID0gZXZlbnREYXRhO1xuICAgIGNvbnN0IGV2ZW50VHlwZSA9IHBheWxvYWQudHlwZTtcbiAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgY2FzZSBcIkxBWU9VVFwiOlxuICAgICAgICB0aGlzLmhhbmRsZUxheW91dEV2ZW50KHBheWxvYWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJGT0NVU1wiOlxuICAgICAgICB0aGlzLmhhbmRsZUZvY3VzRXZlbnQoZWxlbWVudElkLCBwYXlsb2FkLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQkxVUlwiOlxuICAgICAgICB0aGlzLmhhbmRsZUJsdXJFdmVudChlbGVtZW50SWQsIHBheWxvYWQuZWxlbWVudFR5cGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJDSEFOR0VcIjpcbiAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VFdmVudChlbGVtZW50SWQsIHBheWxvYWQuZWxlbWVudFR5cGUsIHBheWxvYWQuZXJyb3JzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiTE9BREVEXCI6XG4gICAgICAgIHRoaXMuaGFuZGxlTG9hZGVkRXZlbnQoZXZlbnQuc291cmNlLCBlbGVtZW50SWQsIHBheWxvYWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJMT0FEX0VSUk9SXCI6XG4gICAgICAgIHRoaXMuaGFuZGxlTG9hZEVycm9yRXZlbnQocGF5bG9hZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlZBTElEQVRJT05fRVJST1JcIjpcbiAgICAgICAgdGhpcy5oYW5kbGVWYWxpZGF0aW9uRXJyb3JFdmVudChwYXlsb2FkLCBlbGVtZW50SWQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdmFsaWRhdGVFdmVudChldmVudERhdGEpIHtcbiAgICBpZiAoZXZlbnREYXRhLmZvcm1JZCAhPT0gdGhpcy5mb3JtSW5zdGFuY2UuZm9ybUlkIHx8ICFldmVudERhdGEuZWxlbWVudElkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm5vbmNlcy5oYXMoZXZlbnREYXRhLm5vbmNlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm5vbmNlcy5hZGQoZXZlbnREYXRhLm5vbmNlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBoYW5kbGVMYXlvdXRFdmVudChwYXlsb2FkKSB7XG4gICAgY29uc3QgaGVpZ2h0ID0gcGF5bG9hZC5oZWlnaHQgPyBgJHtwYXlsb2FkLmhlaWdodH1weGAgOiBcIjEwMCVcIjtcbiAgICB0aGlzLmZvcm1JbnN0YW5jZS5zZXRGb3JtSGVpZ2h0KGhlaWdodCk7XG4gIH1cbiAgaGFuZGxlRm9jdXNFdmVudChlbGVtZW50SWQsIGZpZWxkKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uRm9jdXMpIHRoaXMuY29uZmlnLm9uRm9jdXMoZWxlbWVudElkLCBmaWVsZCk7XG4gIH1cbiAgaGFuZGxlQmx1ckV2ZW50KGVsZW1lbnRJZCwgZmllbGQpIHtcbiAgICBpZiAodGhpcy5jb25maWcub25CbHVyKSB0aGlzLmNvbmZpZy5vbkJsdXIoZWxlbWVudElkLCBmaWVsZCk7XG4gIH1cbiAgaGFuZGxlQ2hhbmdlRXZlbnQoZWxlbWVudElkLCBmaWVsZCwgZXJyb3JzKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uQ2hhbmdlKSB0aGlzLmNvbmZpZy5vbkNoYW5nZShlbGVtZW50SWQsIGZpZWxkLCBlcnJvcnMpO1xuICB9XG4gIGFzeW5jIGhhbmRsZUxvYWRlZEV2ZW50KHNvdXJjZSwgZWxlbWVudElkLCBwYXlsb2FkKSB7XG4gICAgdGhpcy5ldmVudFRhcmdldHNbZWxlbWVudElkXSA9IHNvdXJjZTtcbiAgICB0aGlzLmZvcm1JbnN0YW5jZS5vbkNkZUxvYWRlZChwYXlsb2FkKTtcbiAgICBpZiAodGhpcy5jb25maWcub25Mb2FkKSB7XG4gICAgICB0aGlzLmNvbmZpZy5vbkxvYWQocGF5bG9hZC50b3RhbEFtb3VudEF0b21zLCBwYXlsb2FkLmN1cnJlbmN5KTtcbiAgICB9XG4gIH1cbiAgaGFuZGxlTG9hZEVycm9yRXZlbnQocGF5bG9hZCkge1xuICAgIGlmICh0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcub25Mb2FkRXJyb3IpIHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5vbkxvYWRFcnJvcihwYXlsb2FkLm1lc3NhZ2UpO1xuICB9XG4gIGhhbmRsZVZhbGlkYXRpb25FcnJvckV2ZW50KHBheWxvYWQsIGVsZW1lbnRJZCkge1xuICAgIGlmICh0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcub25WYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvcihwYXlsb2FkLmVsZW1lbnRUeXBlLCBwYXlsb2FkLmVycm9ycywgZWxlbWVudElkKTtcbiAgICB9XG4gIH1cbiAgLy8gYXN5bmMgaGFuZGxlRXJyb3JFdmVudChwYXlsb2FkOiBFcnJvckV2ZW50UGF5bG9hZCkge1xuICAvLyAgIGlmIChwYXlsb2FkLm1lc3NhZ2UgPT09ICczRFNfUkVRVUlSRUQnKSB7XG4gIC8vICAgICBjb25zdCB0aHJlZURTVXJsID0gcGF5bG9hZC5oZWFkZXJzPy5bJ3gtM2RzLWF1dGgtdXJsJ10gPz8gU0lNVUxBVEVfM0RTX1VSTDtcbiAgLy8gICAgIC8vIFRoaXMgd2lsbCBvcGVuIGEgcG9wdXAgYW5kIHByb2Nlc3MgdGhlIDNEUyBmbG93XG4gIC8vICAgICAvLyB3aWxsIHJldHVybiBhIHN0YXR1cyBgc3VjY2Vzc2AgfCBgZmFpbHVyZWAgfCBgY2FuY2VsbGVkYCB3aGljaCB3ZSBjYW4gY29udGludWUgd2l0aFxuICAvLyAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgc3RhcnQzZHNWZXJpZmljYXRpb24oeyB1cmw6IHRocmVlRFNVcmwsIGJhc2VVcmw6IHRoaXMuY29uZmlnLmJhc2VVcmwhIH0pO1xuICAvLyAgICAgY29uc29sZS5sb2coJ/CflJAgM0RTIHN0YXR1czonLCBzdGF0dXMpO1xuICAvLyAgICAgLy8gVE9ETzogY29udGludWUgd2l0aCBzdGF0dXNcbiAgLy8gICAgIGNvbnN0IGNhcmRDcG0gPSB0aGlzLmZvcm1JbnN0YW5jZS5jaGVja291dFBheW1lbnRNZXRob2RzPy5maW5kKChjcG0pID0+IGNwbS5wcm92aWRlciA9PT0gJ2NyZWRpdF9jYXJkJyk7XG4gIC8vICAgICBpZiAoIXRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCB8fCAhdGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCB8fCAhdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgfHwgIWNhcmRDcG0pXG4gIC8vICAgICAgIHJldHVybjtcbiAgLy8gICAgIGZvciAoY29uc3QgW2VsZW1lbnRJZCwgdGFyZ2V0XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmV2ZW50VGFyZ2V0cykpIHtcbiAgLy8gICAgICAgaWYgKCF0YXJnZXQpIGNvbnRpbnVlO1xuICAvLyAgICAgICBjb25zdCBzdGFydFBheW1lbnRGbG93RXZlbnQgPSBjb25zdHJ1Y3RTdWJtaXRFdmVudFBheWxvYWQoXG4gIC8vICAgICAgICAgRXZlbnRUeXBlLmVudW0uU1RBUlRfUEFZTUVOVF9GTE9XLFxuICAvLyAgICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCxcbiAgLy8gICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZm9ybUluc3RhbmNlLmZvcm1UYXJnZXQpID8/IGRvY3VtZW50LmJvZHksXG4gIC8vICAgICAgICAgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IsXG4gIC8vICAgICAgICAgeyAuLi5jYXJkQ3BtLCBwcm9jZXNzb3JfbmFtZTogJ3N0cmlwZScgfSxcbiAgLy8gICAgICAgICBmYWxzZVxuICAvLyAgICAgICApO1xuICAvLyAgICAgICBpZiAoIXN0YXJ0UGF5bWVudEZsb3dFdmVudCkgY29udGludWU7XG4gIC8vICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0RmlyZWQgPSB0cnVlO1xuICAvLyAgICAgICB0aGlzLnRva2VuaXplZERhdGEgPSBzdGFydFBheW1lbnRGbG93RXZlbnQ7XG4gIC8vICAgICAgIHRoaXMucG9zdEV2ZW50VG9GcmFtZSh0YXJnZXQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgLy8gICAgICAgYnJlYWs7XG4gIC8vICAgICB9XG4gIC8vICAgfSBlbHNlIHtcbiAgLy8gICAgIHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0RmlyZWQgPSBmYWxzZTtcbiAgLy8gICAgIGlmICh0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcub25DaGVja291dEVycm9yKSB0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcub25DaGVja291dEVycm9yKHBheWxvYWQubWVzc2FnZSk7XG4gIC8vICAgfVxuICAvLyB9XG4gIC8vIGhhbmRsZUZvcm1TdWJtaXQoKSB7XG4gIC8vICAgaWYgKFxuICAvLyAgICAgIXRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCB8fFxuICAvLyAgICAgIXRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0UGF5bWVudE1ldGhvZHM/Lmxlbmd0aCB8fFxuICAvLyAgICAgIXRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yXG4gIC8vICAgKSB7XG4gIC8vICAgICByZXR1cm47XG4gIC8vICAgfVxuICAvLyAgIGNvbnN0IGNhcmRDcG0gPSB0aGlzLmZvcm1JbnN0YW5jZS5jaGVja291dFBheW1lbnRNZXRob2RzLmZpbmQoKGNwbSkgPT4gY3BtLnByb3ZpZGVyID09PSAnY3JlZGl0X2NhcmQnKTtcbiAgLy8gICBpZiAoIWNhcmRDcG0pIHtcbiAgLy8gICAgIHRocm93IG5ldyBFcnJvcignQ2FyZCBub3QgYXZhaWxhYmxlIGFzIGEgcGF5bWVudCBtZXRob2QgaW4gY2hlY2tvdXQnKTtcbiAgLy8gICB9XG4gIC8vICAgY29uc3QgdG9rZW5pemVEYXRhID0gY29uc3RydWN0U3VibWl0RXZlbnRQYXlsb2FkKFxuICAvLyAgICAgRXZlbnRUeXBlLmVudW0uVE9LRU5JWkUsXG4gIC8vICAgICB0aGlzLmZvcm1JbnN0YW5jZS5zZXNzaW9uSWQhLFxuICAvLyAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmZvcm1JbnN0YW5jZS5mb3JtVGFyZ2V0KSA/PyBkb2N1bWVudC5ib2R5LFxuICAvLyAgICAgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IsXG4gIC8vICAgICBjYXJkQ3BtLFxuICAvLyAgICAgZmFsc2VcbiAgLy8gICApO1xuICAvLyAgIGlmICghdG9rZW5pemVEYXRhKSB7XG4gIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGNvbnN0cnVjdGluZyB0b2tlbml6ZSBkYXRhJyk7XG4gIC8vICAgfVxuICAvLyAgIGZvciAoY29uc3QgW2VsZW1lbnRJZCwgdGFyZ2V0XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmV2ZW50VGFyZ2V0cykpIHtcbiAgLy8gICAgIGlmICghdGFyZ2V0KSBjb250aW51ZTtcbiAgLy8gICAgIHRoaXMucG9zdEV2ZW50VG9GcmFtZSh0YXJnZXQsIGVsZW1lbnRJZCwgdG9rZW5pemVEYXRhKTtcbiAgLy8gICB9XG4gIC8vICAgdGhpcy50b2tlbml6ZWREYXRhID0gdG9rZW5pemVEYXRhO1xuICAvLyB9XG4gIC8vIGFzeW5jIG9uVXNlckNvbXBsZXRlUGF5bWVudFJlcXVlc3RVSShcbiAgLy8gICBzdHJpcGVQbTogUGF5bWVudFJlcXVlc3RQYXltZW50TWV0aG9kRXZlbnQsXG4gIC8vICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2RcbiAgLy8gKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vICAgaWYgKCF0aGlzLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvciB8fCAhdGhpcy5mb3JtSW5zdGFuY2Uuc2Vzc2lvbklkIHx8ICF0aGlzLmZvcm1JbnN0YW5jZS5jaGVja291dFBheW1lbnRNZXRob2RzKVxuICAvLyAgICAgcmV0dXJuO1xuICAvLyAgIGZvciAoY29uc3QgW2VsZW1lbnRJZCwgZWxlbWVudF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ldmVudFRhcmdldHMgPz8ge30pKSB7XG4gIC8vICAgICBjb25zdCBwYXltZW50Rmxvd01ldGFkYXRhID0geyBzdHJpcGVQbUlkOiBzdHJpcGVQbS5wYXltZW50TWV0aG9kLmlkIH07XG4gIC8vICAgICBjb25zdCBzdGFydFBheW1lbnRGbG93RXZlbnQgPSBjb25zdHJ1Y3RTdWJtaXRFdmVudFBheWxvYWQoXG4gIC8vICAgICAgIEV2ZW50VHlwZS5lbnVtLlNUQVJUX1BBWU1FTlRfRkxPVyxcbiAgLy8gICAgICAgdGhpcy5mb3JtSW5zdGFuY2Uuc2Vzc2lvbklkLFxuICAvLyAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZm9ybUluc3RhbmNlLmZvcm1UYXJnZXQpID8/IGRvY3VtZW50LmJvZHksXG4gIC8vICAgICAgIHRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yLFxuICAvLyAgICAgICBjaGVja291dFBheW1lbnRNZXRob2QsXG4gIC8vICAgICAgIGZhbHNlLFxuICAvLyAgICAgICBwYXltZW50Rmxvd01ldGFkYXRhXG4gIC8vICAgICApO1xuICAvLyAgICAgaWYgKCFzdGFydFBheW1lbnRGbG93RXZlbnQpIGNvbnRpbnVlO1xuICAvLyAgICAgdGhpcy5zdHJpcGVQbSA9IHN0cmlwZVBtO1xuICAvLyAgICAgdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRGaXJlZCA9IHRydWU7XG4gIC8vICAgICB0aGlzLnNldFRva2VuaXplZERhdGEoc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgLy8gICAgIHRoaXMucG9zdEV2ZW50VG9GcmFtZShlbGVtZW50LCBlbGVtZW50SWQsIHN0YXJ0UGF5bWVudEZsb3dFdmVudCk7XG4gIC8vICAgICAvLyBlbWl0RXZlbnQoZWxlbWVudC5ub2RlLmNvbnRlbnRXaW5kb3chLCB0aGlzLmZvcm1JZCwgZWxlbWVudElkLCBzdGFydFBheW1lbnRGbG93RXZlbnQsIHRoaXMuY29uZmlnLmJhc2VVcmwhKTtcbiAgLy8gICAgIGJyZWFrO1xuICAvLyAgIH1cbiAgLy8gfVxuICBwb3N0RXZlbnRUb0ZyYW1lKHNvdXJjZSwgZWxlbWVudElkLCBkYXRhKSB7XG4gICAgZW1pdEV2ZW50KHNvdXJjZSwgdGhpcy5mb3JtSWQsIGVsZW1lbnRJZCwgZGF0YSwgdGhpcy5jb25maWcuYmFzZVVybCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ29ubmVjdGlvbihpZnJhbWUsIGNoaWxkT3JpZ2luKSB7XG4gIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0VG9DaGlsZCh7XG4gICAgaWZyYW1lLFxuICAgIGRlYnVnOiBmYWxzZSxcbiAgICBjaGlsZE9yaWdpblxuICB9KTtcbiAgY29uc3QgY29ubmVjdGlvbk9iaiA9IGF3YWl0IGNvbm5lY3Rpb24ucHJvbWlzZTtcbiAgY29uc3QgaXNWYWxpZE9iamVjdCA9IGF3YWl0IGNoZWNrSWZWYWxpZENkZUNvbm5lY3Rpb25PYmplY3QoY29ubmVjdGlvbk9iaik7XG4gIGlmICghaXNSZXN1bHRWYWxpZChjb25uZWN0aW9uT2JqLCBpc1ZhbGlkT2JqZWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgR290IGludmFsaWQgQ0RFIGNvbm5lY3Rpb24gb2JqZWN0YCk7XG4gIH1cbiAgcmV0dXJuIGNvbm5lY3Rpb25PYmo7XG59XG5jbGFzcyBDb25uZWN0aW9uTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICB9XG4gIGFkZENvbm5lY3Rpb24oaWQsIGNvbm5lY3Rpb24pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25zLnNldChpZCwgY29ubmVjdGlvbik7XG4gIH1cbiAgZ2V0Q29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9ucy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgaWYgKCFjb25uZWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uIG5vdCBmb3VuZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gIH1cbiAgZ2V0QWxsQ29ubmVjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbnM7XG4gIH1cbn1cblxuY2xhc3MgT3BlblBheUZvcm0ge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLnRyeUluaXRPanNGbG93cyA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9qc0Zsb3dzSW5pdGlhbGl6YXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmNkZUxvYWRlZFBheWxvYWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbk1hbmFnZXIuZ2V0QWxsQ29ubmVjdGlvbnMoKS5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMub2pzRmxvd3NJbml0aWFsaXphdGlvbiA9IGluaXRpYWxpemVPanNGbG93cyh0aGlzLmNyZWF0ZU9qc0Zsb3dDb250ZXh0KCkpO1xuICAgICAgdGhpcy5vanNGbG93c0luaXRpYWxpemF0aW9uLnN0cmlwZVBSLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB0aGlzLm9uU3RyaXBlUFJTdGF0dXNDaGFuZ2Uoc3RhdHVzKSk7XG4gICAgfTtcbiAgICB0aGlzLm9uQ2RlTG9hZGVkID0gKHBheWxvYWQpID0+IHtcbiAgICAgIGlmICh0aGlzLmNkZUxvYWRlZFBheWxvYWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5jZGVMb2FkZWRQYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgIHRoaXMudHJ5SW5pdE9qc0Zsb3dzKCk7XG4gICAgfTtcbiAgICB0aGlzLm9uU3RyaXBlUFJTdGF0dXNDaGFuZ2UgPSAoaW5pdFN0YXR1cykgPT4ge1xuICAgICAgaWYgKGluaXRTdGF0dXMuc3RhdHVzID09PSBcImxvYWRpbmdcIikge1xuICAgICAgICB0aGlzLmNvbmZpZy5vblBheW1lbnRSZXF1ZXN0TG9hZD8uKHsgYXBwbGVfcGF5OiBQUl9MT0FESU5HLCBnb29nbGVfcGF5OiBQUl9MT0FESU5HIH0pO1xuICAgICAgfSBlbHNlIGlmIChpbml0U3RhdHVzLnN0YXR1cyA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uUGF5bWVudFJlcXVlc3RMb2FkPy4oeyBhcHBsZV9wYXk6IFBSX0VSUk9SLCBnb29nbGVfcGF5OiBQUl9FUlJPUiB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaW5pdFN0YXR1cy5zdGF0dXMgPT09IFwibG9hZGVkXCIpIHtcbiAgICAgICAgY29uc3QgaW5pdFJlc3VsdCA9IGluaXRTdGF0dXMucmVzdWx0O1xuICAgICAgICBjb25zdCBjYW5BcHBsZVBheSA9IGluaXRSZXN1bHQuaXNBdmFpbGFibGUgJiYgaW5pdFJlc3VsdC5hdmFpbGFibGVQcm92aWRlcnMuYXBwbGVQYXk7XG4gICAgICAgIGNvbnN0IGNhbkdvb2dsZVBheSA9IGluaXRSZXN1bHQuaXNBdmFpbGFibGUgJiYgaW5pdFJlc3VsdC5hdmFpbGFibGVQcm92aWRlcnMuZ29vZ2xlUGF5O1xuICAgICAgICB0aGlzLmNvbmZpZy5vblBheW1lbnRSZXF1ZXN0TG9hZD8uKHtcbiAgICAgICAgICBhcHBsZV9wYXk6IHtcbiAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBpc0F2YWlsYWJsZTogY2FuQXBwbGVQYXksXG4gICAgICAgICAgICBzdGFydEZsb3c6IGFzeW5jICh1c2VyUGFyYW1zKSA9PiBjYW5BcHBsZVBheSA/IHRoaXMuc3VibWl0UGF5bWVudFJlcXVlc3QoXCJhcHBsZV9wYXlcIiwgaW5pdFJlc3VsdCwgdXNlclBhcmFtcykgOiB2b2lkIDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdvb2dsZV9wYXk6IHtcbiAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBpc0F2YWlsYWJsZTogY2FuR29vZ2xlUGF5LFxuICAgICAgICAgICAgc3RhcnRGbG93OiBhc3luYyAodXNlclBhcmFtcykgPT4gY2FuR29vZ2xlUGF5ID8gdGhpcy5zdWJtaXRQYXltZW50UmVxdWVzdChcImdvb2dsZV9wYXlcIiwgaW5pdFJlc3VsdCwgdXNlclBhcmFtcykgOiB2b2lkIDBcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5zdWJtaXRQYXltZW50UmVxdWVzdCA9IChwcm92aWRlciwgaW5pdFJlc3VsdCwgcGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVPanNGbG93Q29udGV4dCgpO1xuICAgICAgcmV0dXJuIE9qc0Zsb3dzLnN0cmlwZVBSLnJ1bih7XG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdChjb250ZXh0LmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIHByb3ZpZGVyKSxcbiAgICAgICAgbm9uQ2RlRm9ybUlucHV0czogdGhpcy5nZXROb25DZGVGb3JtSW5wdXRzKCksXG4gICAgICAgIGZsb3dDYWxsYmFja3M6IHRoaXMuY3JlYXRlT2pzRmxvd0NhbGxiYWNrcygpLFxuICAgICAgICBjdXN0b21QYXJhbXM6IHsgcHJvdmlkZXIsIG92ZXJyaWRlUGF5bWVudFJlcXVlc3Q6IHBhcmFtcz8ub3ZlcnJpZGVQYXltZW50UmVxdWVzdCB9LFxuICAgICAgICBpbml0UmVzdWx0XG4gICAgICB9KTtcbiAgICB9O1xuICAgIE9wZW5QYXlGb3JtLmFzc2lnbkFzU2luZ2xldG9uKHRoaXMpO1xuICAgIHRoaXMuY29uZmlnID0geyAuLi5jb25maWcsIGJhc2VVcmw6IGNvbmZpZy5iYXNlVXJsID8/IFwiaHR0cHM6Ly9jZGUuZ2V0b3BlbnBheS5jb21cIiB9O1xuICAgIHRoaXMuZWxlbWVudHMgPSBudWxsO1xuICAgIHRoaXMuZm9ybUlkID0gYG9wanMtZm9ybS0ke3dpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gICAgdGhpcy5yZWZlcmVyID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICB0aGlzLmZvcm1UYXJnZXQgPSBjb25maWcuZm9ybVRhcmdldCA/PyBcImJvZHlcIjtcbiAgICB0aGlzLmZvcm1Qcm9wZXJ0aWVzID0geyBoZWlnaHQ6IFwiMXB4XCIgfTtcbiAgICB0aGlzLmNkZUxvYWRlZFBheWxvYWQgPSBudWxsO1xuICAgIHRoaXMub2pzRmxvd3NJbml0aWFsaXphdGlvbiA9IG51bGw7XG4gICAgdGhpcy5jaGVja291dEZpcmVkID0gZmFsc2U7XG4gICAgdGhpcy5jb25uZWN0aW9uTWFuYWdlciA9IG5ldyBDb25uZWN0aW9uTWFuYWdlcigpO1xuICAgIHRoaXMuZXZlbnRIYW5kbGVyID0gbmV3IE9wZW5QYXlGb3JtRXZlbnRIYW5kbGVyKHRoaXMpO1xuICAgIHRoaXMub2pzVmVyc2lvbiA9IFwiMC4xLjdcIjtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5ldmVudEhhbmRsZXIuaGFuZGxlTWVzc2FnZS5iaW5kKHRoaXMuZXZlbnRIYW5kbGVyKSk7XG4gIH1cbiAgc3RhdGljIHtcbiAgICB0aGlzLm9qc0Zsb3dzID0gT2pzRmxvd3M7XG4gIH1cbiAgLyoqXG4gICAqIEFzc2lnbiB0aGUgaW5zdGFuY2UgdG8gdGhlIHdpbmRvdyBhcyBhIHNpbmdsZXRvblxuICAgKiBAcGFyYW0gZm9ybSAtIFRoZSBPcGVuUGF5Rm9ybSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGFzc2lnbkFzU2luZ2xldG9uKGZvcm0pIHtcbiAgICBpZiAoT3BlblBheUZvcm0uZ2V0SW5zdGFuY2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT3BlblBheSBpbnN0YW5jZSBhbHJlYWR5IGV4aXN0cy4gT25seSBvbmUgaW5zdGFuY2UgaXMgYWxsb3dlZC5cIik7XG4gICAgfVxuICAgIHdpbmRvd1tcIm9qc1wiXSA9IGZvcm07XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIE9wZW5QYXlGb3JtXG4gICAqIEByZXR1cm5zIFRoZSBPcGVuUGF5Rm9ybSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgIHJldHVybiB3aW5kb3dbXCJvanNcIl0gPz8gbnVsbDtcbiAgfVxuICBnZXRDb25uZWN0aW9uTWFuYWdlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uTWFuYWdlcjtcbiAgfVxuICBzZXRGb3JtSGVpZ2h0KGhlaWdodCkge1xuICAgIHRoaXMuZm9ybVByb3BlcnRpZXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGlmICh0aGlzLmVsZW1lbnRzKSB7XG4gICAgICBPYmplY3QudmFsdWVzKHRoaXMuZWxlbWVudHMpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgZWxlbWVudC5ub2RlLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjcmVhdGVFbGVtZW50KGVsZW1lbnRWYWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZykgdGhyb3cgbmV3IEVycm9yKFwiT3BlblBheSBmb3JtIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICBjb25zdCB0eXBlID0gRWxlbWVudFR5cGUucGFyc2UoZWxlbWVudFZhbHVlKTtcbiAgICBjb25zdCBmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSB0aGlzLmJ1aWxkUXVlcnlTdHJpbmcob3B0aW9ucyk7XG4gICAgZnJhbWUubmFtZSA9IGAke3R5cGV9LWVsZW1lbnRgO1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYC9hcHAvdjEvJHtmcmFtZS5uYW1lfWAsIHRoaXMuY29uZmlnLmJhc2VVcmwpO1xuICAgIHVybC5zZWFyY2ggPSBxdWVyeVN0cmluZy50b1N0cmluZygpO1xuICAgIGZyYW1lLnNyYyA9IHVybC5ocmVmO1xuICAgIHRoaXMuY29uZmlnLl9mcmFtZVVybCA9IHVybDtcbiAgICBmcmFtZS5zdHlsZS5ib3JkZXIgPSBcIm5vbmVcIjtcbiAgICBmcmFtZS5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB7XG4gICAgICB0eXBlLFxuICAgICAgbm9kZTogZnJhbWUsXG4gICAgICBtb3VudDogKHNlbGVjdG9yKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKT8uYXBwZW5kQ2hpbGQoZnJhbWUpXG4gICAgfTtcbiAgICB0aGlzLmNvbm5lY3RUb0VsZW1lbnQoZWxlbWVudCk7XG4gICAgaWYgKHRoaXMuZWxlbWVudHMpIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbdHlwZV0gPSBlbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVsZW1lbnRzID0geyBbdHlwZV06IGVsZW1lbnQgfTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbiAgYnVpbGRRdWVyeVN0cmluZyhvcHRpb25zKSB7XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgcXVlcnlTdHJpbmcuYXBwZW5kKFwicmVmZXJlclwiLCB0aGlzLnJlZmVyZXIpO1xuICAgIHF1ZXJ5U3RyaW5nLmFwcGVuZChcImZvcm1JZFwiLCB0aGlzLmZvcm1JZCk7XG4gICAgaWYgKG9wdGlvbnMuc3R5bGVzKSB7XG4gICAgICBxdWVyeVN0cmluZy5hcHBlbmQoXCJzdHlsZXNcIiwgY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmcob3B0aW9ucy5zdHlsZXMpKTtcbiAgICB9XG4gICAgcXVlcnlTdHJpbmcuYXBwZW5kKFwic2VjdXJlVG9rZW5cIiwgdGhpcy5jb25maWcuY2hlY2tvdXRTZWN1cmVUb2tlbik7XG4gICAgcmV0dXJuIHF1ZXJ5U3RyaW5nO1xuICB9XG4gIGNvbm5lY3RUb0VsZW1lbnQoZWxlbWVudCkge1xuICAgIGNyZWF0ZUNvbm5lY3Rpb24oZWxlbWVudC5ub2RlKS50aGVuKChjb25uKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyLmFkZENvbm5lY3Rpb24oZWxlbWVudC50eXBlLCBjb25uKTtcbiAgICAgIHRoaXMudHJ5SW5pdE9qc0Zsb3dzKCk7XG4gICAgfSkuY2F0Y2goKGVycikgPT4gdm9pZCAwKTtcbiAgfVxuICBnZXRGb3JtRGl2KCkge1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keTtcbiAgfVxuICBjcmVhdGVPanNGbG93Q29udGV4dCgpIHtcbiAgICBjb25zdCBjZGVDb25uZWN0aW9ucyA9IHRoaXMuY29ubmVjdGlvbk1hbmFnZXIuZ2V0QWxsQ29ubmVjdGlvbnMoKTtcbiAgICBpZiAoIXRoaXMuY2RlTG9hZGVkUGF5bG9hZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVxdWVzdGVkIGNvbnRleHQgd2hpbGUgQ0RFIG5vdCB5ZXQgbG9hZGVkXCIpO1xuICAgIH1cbiAgICBpZiAoY2RlQ29ubmVjdGlvbnMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQ0RFIGNvbm5lY3Rpb25zIGZvdW5kXCIpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYmFzZVVybDogbmV3IFVSTCh0aGlzLmNvbmZpZy5iYXNlVXJsID8/IEZSQU1FX0JBU0VfVVJMKS5vcmlnaW4sXG4gICAgICBmb3JtRGl2OiB0aGlzLmdldEZvcm1EaXYoKSxcbiAgICAgIGVsZW1lbnRzU2Vzc2lvbklkOiB0aGlzLmNkZUxvYWRlZFBheWxvYWQuc2Vzc2lvbklkLFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kczogdGhpcy5jZGVMb2FkZWRQYXlsb2FkLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsXG4gICAgICBjZGVDb25uZWN0aW9uc1xuICAgIH07XG4gIH1cbiAgZ2V0Tm9uQ2RlRm9ybUlucHV0cygpIHtcbiAgICByZXR1cm4gY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtKHRoaXMuZ2V0Rm9ybURpdigpKTtcbiAgfVxuICBjcmVhdGVPanNGbG93Q2FsbGJhY2tzKCkge1xuICAgIGNvbnN0IG5vT3AgPSAoKSA9PiB7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgb25DaGVja291dEVycm9yOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dEVycm9yXCIsIHRoaXMuY29uZmlnLm9uQ2hlY2tvdXRFcnJvciA/PyBub09wKSxcbiAgICAgIG9uQ2hlY2tvdXRTdGFydGVkOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dFN0YXJ0ZWRcIiwgdGhpcy5jb25maWcub25DaGVja291dFN0YXJ0ZWQgPz8gbm9PcCksXG4gICAgICBvbkNoZWNrb3V0U3VjY2VzczogbWFrZUNhbGxiYWNrU2FmZShcIm9uQ2hlY2tvdXRTdWNjZXNzXCIsIHRoaXMuY29uZmlnLm9uQ2hlY2tvdXRTdWNjZXNzID8/IG5vT3ApLFxuICAgICAgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzOiBtYWtlQ2FsbGJhY2tTYWZlKFxuICAgICAgICBcIm9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2Vzc1wiLFxuICAgICAgICB0aGlzLmNvbmZpZy5vblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MgPz8gbm9PcFxuICAgICAgKSxcbiAgICAgIG9uVmFsaWRhdGlvbkVycm9yOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25WYWxpZGF0aW9uRXJyb3JcIiwgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgPz8gbm9PcClcbiAgICB9O1xuICB9XG4gIHN1Ym1pdCgpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVPanNGbG93Q29udGV4dCgpO1xuICAgIE9qc0Zsb3dzLmNvbW1vbkNDLnJ1bih7XG4gICAgICBjb250ZXh0LFxuICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0KGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgXCJjcmVkaXRfY2FyZFwiKSxcbiAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IHRoaXMuZ2V0Tm9uQ2RlRm9ybUlucHV0cygpLFxuICAgICAgZmxvd0NhbGxiYWNrczogdGhpcy5jcmVhdGVPanNGbG93Q2FsbGJhY2tzKCksXG4gICAgICBjdXN0b21QYXJhbXM6IHZvaWQgMCxcbiAgICAgIC8vIFRoaXMgZmxvdyByZXF1aXJlcyBubyBjdXN0b20gcGFyYW1zXG4gICAgICBpbml0UmVzdWx0OiB2b2lkIDBcbiAgICAgIC8vIFRoaXMgZmxvdyByZXF1aXJlcyBubyBpbml0aWFsaXphdGlvblxuICAgIH0pO1xuICB9XG4gIG9uUGF5bWVudFJlcXVlc3RFcnJvcihlcnJNc2cpIHtcbiAgICB0aGlzLmNoZWNrb3V0RmlyZWQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5jb25maWcub25DaGVja291dEVycm9yKSB0aGlzLmNvbmZpZy5vbkNoZWNrb3V0RXJyb3IoZXJyTXNnKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBPYmplY3QudmFsdWVzKHRoaXMuZWxlbWVudHMgPz8ge30pKSB7XG4gICAgICBlbGVtZW50Lm5vZGUucmVtb3ZlKCk7XG4gICAgfVxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLmV2ZW50SGFuZGxlci5oYW5kbGVNZXNzYWdlLmJpbmQodGhpcy5ldmVudEhhbmRsZXIpKTtcbiAgfVxufVxuXG5leHBvcnQgeyBGaWVsZE5hbWUsIE9wZW5QYXlGb3JtIH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFBQSxTQUFTO0FBQ2xCLFNBQVMsTUFBQUMsVUFBVTtBQUNuQixTQUFTLGtCQUFBQyxVQUFzQjtBQUMvQixPQUFPQyxPQUFXO0FBRWxCLE1BQU1DLEtBQWlCLDhCQUVqQkMsS0FBNEJMLEVBQUUsT0FBTztBQUFBLEVBQ3pDLE1BQU1BLEVBQUUsT0FBTztBQUFBLEVBQ2YsS0FBS0EsRUFBRSxNQUFNQSxFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ3ZCLEtBQUtBLEVBQUUsT0FBTztBQUFBLEVBQ2QsS0FBS0EsRUFBRSxPQUFPO0FBQ2hCLENBQUMsR0FDS00sS0FBa0NOLEVBQUUsTUFBTUssRUFBeUIsR0FDbkVFLEtBQWdCUCxFQUFFLE9BQU87QUFBQSxFQUM3QixNQUFNQSxFQUFFLE9B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a0JBQWtCLEtBQUssb0JBQW9CO0FBQUEsTUFDM0MsZUFBZSxLQUFLLHVCQUF1QjtBQUFBLE1BQzNDLGNBQWM7QUFBQTtBQUFBLE1BRWQsWUFBWTtBQUFBO0FBQUEsSUFFZCxDQUFDO0FBQUEsRUFDSDtBQUFBLEVBQ0Esc0JBQXNCMkksR0FBUTtBQUM1QixTQUFLLGdCQUFnQixJQUNqQixLQUFLLE9BQU8sbUJBQWlCLEtBQUssT0FBTyxnQkFBZ0JBLENBQU07QUFBQSxFQUNyRTtBQUFBLEVBQ0EsVUFBVTtBQUNSLGVBQVdSLEtBQVcsT0FBTyxPQUFPLEtBQUssWUFBWSxDQUFDLENBQUM7QUFDckQsTUFBQUEsRUFBUSxLQUFLLE9BQU87QUFFdEIsV0FBTyxvQkFBb0IsV0FBVyxLQUFLLGFBQWEsY0FBYyxLQUFLLEtBQUssWUFBWSxDQUFDO0FBQUEsRUFDL0Y7QUFDRjtBQWxJSVYsRUFBSyxXQUFXeEU7QUF4RXBCLElBQU0yRixLQUFObkI7IiwKICAibmFtZXMiOiBbInoiLCAidjQiLCAiY29ubmVjdFRvQ2hpbGQiLCAiY2hhbGsiLCAiRlJBTUVfQkFTRV9VUkwiLCAiUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlIiwgIlpvZEZpZWxkRXJyb3IiLCAiWm9kRmllbGRFcnJvcnMiLCAiTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRSIsICJnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZSIsICJvZ0Vycm9yTWVzc2FnZSIsICJrZXkiLCAiaXNTdHJpbmdpZmllZEpzb25PYmplY3QiLCAic3RyIiwgImNyZWF0ZU1lc3NhZ2VGcm9tUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IiLCAicmVzcG9uc2UiLCAiZXJyIiwgImNyZWF0ZU1lc3NhZ2VGcm9tWm9kRmllbGRFcnJvcnMiLCAiZXJyb3JzIiwgImdldEVycm9yTWVzc2FnZSIsICJlIiwgIm9iaiIsICJlMiIsICJtYWtlQ2FsbGJhY2tTYWZlIiwgImNhbGxiYWNrTmFtZSIsICJmbiIsICJhcmdzIiwgIlJlcXVpcmVkU3RyaW5nIiwgIk9wdGlvbmFsU3RyaW5nIiwgIm51bGxPclVuZGVmT3IkMSIsICJ6VHlwZSIsICJGaWVsZE5hbWUiLCAiRmllbGROYW1lMiIsICJGaWVsZE5hbWVFbnVtIiwgIlByaXZhdGVGaWVsZE5hbWUiLCAiUHJpdmF0ZUZpZWxkTmFtZTIiLCAiUHJpdmF0ZUZpZWxkTmFtZUVudW0iLCAiQWxsRmllbGROYW1lcyIsICJFbGVtZW50VHlwZUVudW0iLCAiRWxlbWVudFR5cGVFbnVtMiIsICJFbGVtZW50VHlwZSIsICJDaGVja291dFBheW1lbnRNZXRob2QkMSIsICJQYXltZW50TWV0aG9kTWluaW1hbCIsICJFdmVudFR5cGUiLCAiR2VuZXJpY0V2ZW50VHlwZSIsICJHZW5lcmljRXZlbnRQYXlsb2FkIiwgIklucHV0RXZlbnRUeXBlIiwgIklucHV0RXZlbnRQYXlsb2FkIiwgIkVycm9yRXZlbnRUeXBlIiwgIkVycm9yRXZlbnRQYXlsb2FkIiwgIlZhbGlkYXRpb25FcnJvckV2ZW50VHlwZSIsICJWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQiLCAiTGF5b3V0RXZlbnRQYXlsb2FkIiwgIkxvYWRlZEV2ZW50UGF5bG9hZCIsICJQYXltZW50Rmxvd1N0YXJ0ZWRFdmVudFBheWxvYWQiLCAiU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQiLCAiUmVxdWlyZWRGb3JtRmllbGRzIiwgIlBSRm9ybUZpZWxkcyIsICJTdWJtaXRFdmVudFR5cGUiLCAiU3VibWl0RXZlbnRQYXlsb2FkIiwgIlRva2VuaXplU3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQiLCAiRXZlbnRQYXlsb2FkIiwgIkVsZW1lbnRFdmVudCIsICJDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSIsICJGaWVsZFZhbGlkYXRpb25FcnJvciIsICJUb2tlbml6ZUNhcmRFcnJvclJlc3BvbnNlIiwgIlRva2VuaXplQ2FyZFJlc3BvbnNlIiwgIlRocmVlRFNTdGF0dXMiLCAiVGhyZWVEU1N0YXR1czIiLCAiUGluZzNEU1N0YXR1c1Jlc3BvbnNlIiwgIkNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJleHRyYWN0SXNzdWVzUGVyRmllbGQiLCAiZXJyb3IiLCAiaXNzdWVzUGVyRmllbGQiLCAidmFsdWUiLCAiZmllbGROYW1lIiwgIlN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YSIsICJvdXJDdXJyZW5jeVRvVGhlaXJzIiwgImdldExvYWRlZFN0cmlwZSIsICJwdWJsaXNoYWJsZUtleSIsICJpIiwgImlzU3RyaXBlSnNQcmVzZW50IiwgInNsZWVwIiwgImNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0IiwgInN0cmlwZVB1YktleSIsICJ0b3RhbEFtb3VudEF0b20iLCAiY3VycmVuY3kiLCAiaXNBbW91bnRQZW5kaW5nIiwgImlzTGlua09ubHkiLCAic3RyaXBlIiwgInN0cmlwZUN1cnJlbmN5IiwgInRpbWVvdXRNcyIsICJyZXNvbHZlIiwgIndhaXRGb3JVc2VyVG9BZGRQYXltZW50TWV0aG9kIiwgInBheW1lbnRSZXF1ZXN0IiwgInJlamVjdCIsICJldnQiLCAiY29uZmlybVN0cmlwZVByUE0iLCAibmV4dEFjdGlvbk1ldGFkYXRhIiwgInN0cmlwZVBtIiwgImNvbmZpcm1SZXN1bHQiLCAibGF1bmNoU3RyaXBlM0RTRGlhbG9nRmxvdyIsICJfYSIsICJfYiIsICJfYyIsICJfZCIsICJyZXN1bHRTdGF0dXMiLCAiY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmciLCAic3R5bGVzIiwgImNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybSIsICJmb3JtRGl2IiwgImluaXRpYWxEaWN0IiwgImFjYyIsICJpbnB1dCIsICJwYXJzZUV2ZW50UGF5bG9hZCIsICJldmVudERhdGEiLCAiZW1pdEV2ZW50IiwgInRhcmdldCIsICJmb3JtSWQiLCAiZWxlbWVudElkIiwgInBheWxvYWQiLCAiYmFzZVVybCIsICJldmVudCIsICJjaGVja0lmVmFsaWRDZGVDb25uZWN0aW9uT2JqZWN0IiwgInBpbmciLCAicmVzdWx0IiwgImlzUmVzdWx0VmFsaWQiLCAiaXNWYWxpZCIsICJudWxsT3JVbmRlZk9yIiwgIkNERVJlc3BvbnNlRXJyb3IiLCAiQ291cG9uTWluaW1hbCIsICJMaW5lSXRlbSIsICJCcmFuZFNldHRpbmdzIiwgIkJyYW5kIiwgIkNoZWNrb3V0UGF5bWVudE1ldGhvZCIsICJTdWJzY3JpcHRpb25JdGVtTWluaW1hbCIsICJTdWJzY3JpcHRpb25NaW5pbWFsIiwgIkludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbCIsICJJbnZvaWNlTGluZUl0ZW1NaW5pbWFsIiwgIkRpc2NvdW50TWluaW1hbCIsICJJbnZvaWNlTWluaW1hbCIsICJDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwiLCAiUHJldmlld0NoZWNrb3V0UmVzcG9uc2UiLCAiX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbiIsICJQYXltZW50Rm9ybVByZWZpbGwiLCAiQ29tcGxldGVkRm9ybVByZWZpbGwiLCAiRXhwaXJlZEZvcm1QcmVmaWxsIiwgIkNoZWNrb3V0U3VjY2Vzc1Jlc3BvbnNlIiwgIlNldHVwQ2hlY2tvdXRSZXNwb25zZSIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciIsICJTdGFydFBheW1lbnRGbG93UmVzcG9uc2UiLCAiU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UiLCAic3VtIiwgImFyciIsICJhIiwgImIiLCAiZml4UHJvdG8iLCAicHJvdG90eXBlIiwgInNldFByb3RvdHlwZU9mIiwgImZpeFN0YWNrIiwgImNhcHR1cmVTdGFja1RyYWNlIiwgIl9fZXh0ZW5kcyIsICJfZXh0ZW5kU3RhdGljcyIsICJkIiwgInAiLCAiX18iLCAiQ3VzdG9tRXJyb3IiLCAiX3N1cGVyIiwgIm1lc3NhZ2UiLCAib3B0aW9ucyIsICJfbmV3VGFyZ2V0IiwgIl90aGlzIiwgIkNkZUVycm9yIiwgImZyaWVuZGx5TWVzc2FnZSIsICJxdWVyeUNERSIsICJjZGVDb25uIiwgImRhdGEiLCAicmVzcG9uc2VTY2hlbWEiLCAiaXNDREVSZXNwb25zZUVycm9yIiwgImNoZWNrSWZDb25mb3Jtc1RvU2NoZW1hIiwgInNjaGVtYSIsICJnZXRDaGVja291dFByZXZpZXciLCAicmVxdWVzdCIsICJnZXRQcmVmaWxsIiwgInN0YXJ0UGF5bWVudEZsb3dGb3JDQyIsICJzdGFydFBheW1lbnRGbG93Rm9yUFIiLCAiY29uZmlybVBheW1lbnRGbG93IiwgImdldENoZWNrb3V0VmFsdWUiLCAic2VjdXJlVG9rZW4iLCAicHJvbW9Db2RlIiwgImNoZWNrb3V0UHJldmlldyIsICJjdXJyZW5jaWVzIiwgImludiIsICJhbW91bnRBdG9tIiwgImdldENoZWNrb3V0UHJldmlld0Ftb3VudCIsICJpc1NldHVwTW9kZSIsICJ0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zIiwgImFsbENkZUNvbm5lY3Rpb25zIiwgImNoZWNrb3V0Q2FyZEVsZW1lbnRzIiwgInNldHVwQ2hlY2tvdXQiLCAicGVyZm9ybUNoZWNrb3V0IiwgIkNERV9QT0xMSU5HX0lOVEVSVkFMIiwgInBpbmdDZGVGb3IzZHNTdGF0dXMiLCAiaWZyYW1lIiwgImNoaWxkT3JpZ2luIiwgImNvbm5lY3Rpb25PYmoiLCAiY3JlYXRlQW5kT3BlbkZyYW1lIiwgInVybCIsICJ0ZW1wbGF0ZSIsICJob3N0IiwgInNoYWRvd1Jvb3QiLCAiY2FuY2VsQnV0dG9uIiwgInN0YXJ0UG9sbGluZyIsICJvblN1Y2Nlc3MiLCAiaGFuZGxlUG9sbGluZyIsICJzdGF0dXMiLCAicG9sbGluZ0ludGVydmFsIiwgImhhbmRsZUV2ZW50cyIsICJlbGVtZW50cyIsICJoYW5kbGVDYW5jZWwiLCAic3RhcnQzZHNWZXJpZmljYXRpb24iLCAiY2xlYW51cEV2ZW50TGlzdGVuZXJzIiwgImFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzIiwgInNpbXBsZU9qc0Zsb3ciLCAicGFyYW1zIiwgImZsb3dSZXN1bHQiLCAiYWRkRXJyb3JDYXRjaGVyRm9ySW5pdCIsICJpbml0IiwgImVycl9fIiwgImNyZWF0ZU9qc0Zsb3dMb2dnZXJzIiwgInByZWZpeCIsICJsb2ciLCAibG9nX18kMyIsICJlcnJfXyQ0IiwgInZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDIiwgIm5vbkNkZUZvcm1JbnB1dHMiLCAib25WYWxpZGF0aW9uRXJyb3IiLCAiZm9ybWF0dGVkIiwgImlzc3VlcyIsICJ2YWxpZGF0ZVRva2VuaXplQ2FyZFJlc3VsdHMiLCAidG9rZW5pemVSZXN1bHRzIiwgInRva2VuaXplUmVzdWx0IiwgInBhcnNlZCIsICJlcnJfXyQzIiwgInBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UiLCAiZmluZENwbU1hdGNoaW5nVHlwZSIsICJhbGxDUE1zIiwgInpvZE1vZGVsIiwgImNwbSIsICJjcG0yIiwgImxvZ19fJDIiLCAiZXJyX18kMiIsICJzdHJpcGVMb2dfXyIsICJydW5Db21tb25DY0Zsb3ciLCAiY29udGV4dCIsICJjaGVja291dFBheW1lbnRNZXRob2QiLCAiZmxvd0NhbGxiYWNrcyIsICJhbnlDZGVDb25uZWN0aW9uIiwgInByZWZpbGwiLCAibm9uQ2RlRm9ybUZpZWxkcyIsICJ0b2tlbml6ZUNhcmRSZXN1bHRzIiwgImNvbW1vbkNoZWNrb3V0UGFyYW1zIiwgInNob3VsZFVzZU5ld0Zsb3ciLCAic3RhcnRQZlJlc3VsdCIsICJjb21tb25DQzNEU0Zsb3ciLCAic3RyaXBlQ0MzRFNGbG93IiwgImNyZWF0ZWRQYXltZW50TWV0aG9kIiwgInBhcnNlU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgInN0cmlwZUFjdGlvbiIsICJhY3Rpb24iLCAicGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEiLCAiY29tbW9uQWN0aW9uIiwgImxvZ19fJDEiLCAiZXJyX18kMSIsICJTdHJpcGVQckNwbSIsICJpbml0U3RyaXBlUHJGbG93IiwgImluaXRpYWxQcmV2aWV3IiwgInByIiwgImNhbk1ha2VQYXltZW50IiwgInJ1blN0cmlwZVByRmxvdyIsICJjdXN0b21QYXJhbXMiLCAiaW5pdFJlc3VsdCIsICJvdmVycmlkZSIsICJ1cGRhdGVQcldpdGhBbW91bnQiLCAic3RyaXBlUG1BZGRlZEV2ZW50IiwgIm1lcmdlZElucHV0cyIsICJmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBtIiwgInN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSIsICJwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhIiwgImNoZWNrb3V0UmVxdWVzdCIsICJmb3JtSW5wdXRzIiwgInN0cmlwZVBtRXZ0IiwgImlucHV0cyIsICJwYXllckZpcnN0TmFtZSIsICJwYXllckxhc3ROYW1lUGFydHMiLCAicGF5ZXJMYXN0TmFtZSIsICJhbW91bnQiLCAiaXNQZW5kaW5nIiwgImZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QiLCAiY3BtcyIsICJ3aXRoUHJvdmlkZXIiLCAid2l0aFByb2Nlc3NvciIsICJtYXRjaGVzIiwgIk9qc0Zsb3dzIiwgImdldERlZmF1bHRFeHBvcnRGcm9tQ2pzIiwgIngiLCAiT2JzZXJ2YWJsZSQyIiwgImhhc1N5bWJvbCIsICJuYW1lIiwgImdldFN5bWJvbCIsICJTeW1ib2xJdGVyYXRvciIsICJTeW1ib2xPYnNlcnZhYmxlIiwgIlN5bWJvbFNwZWNpZXMiLCAiZ2V0TWV0aG9kIiwgImdldFNwZWNpZXMiLCAiY3RvciIsICJPYnNlcnZhYmxlJDEiLCAiaXNPYnNlcnZhYmxlIiwgImhvc3RSZXBvcnRFcnJvciIsICJlbnF1ZXVlIiwgImNsZWFudXBTdWJzY3JpcHRpb24iLCAic3Vic2NyaXB0aW9uIiwgImNsZWFudXAiLCAidW5zdWJzY3JpYmUiLCAiY2xvc2VTdWJzY3JpcHRpb24iLCAiZmx1c2hTdWJzY3JpcHRpb24iLCAicXVldWUiLCAibm90aWZ5U3Vic2NyaXB0aW9uIiwgInR5cGUiLCAib2JzZXJ2ZXIiLCAibSIsICJvbk5vdGlmeSIsICJTdWJzY3JpcHRpb24iLCAic3Vic2NyaWJlciIsICJzZWxmIiwgInN1YnNjcmlwdGlvbk9ic2VydmVyIiwgIk9ic2VydmFibGUiLCAiZG9uZSIsICJDIiwgImhhc1NlZWQiLCAiaGFzVmFsdWUiLCAiZmlyc3QiLCAidmFsdWVzIiwgInNvdXJjZXMiLCAiaW5kZXgiLCAic3RhcnROZXh0IiwgIm5leHQiLCAidiIsICJzdWJzY3JpcHRpb25zIiwgIm91dGVyIiwgImlubmVyIiwgImNvbXBsZXRlSWZEb25lIiwgInMiLCAibWV0aG9kIiwgIm9ic2VydmFibGUiLCAiaXRlbSIsICJpdGVtcyIsICJ6ZW5PYnNlcnZhYmxlIiwgImxvZ19fIiwgImluaXRpYWxpemVPanNGbG93cyIsICJydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZSIsICJmbG93TmFtZSIsICJpbml0RmxvdyIsICJQUl9MT0FESU5HIiwgIlBSX0VSUk9SIiwgIk9wZW5QYXlGb3JtRXZlbnRIYW5kbGVyIiwgImZvcm1JbnN0YW5jZSIsICJoZWlnaHQiLCAiZmllbGQiLCAic291cmNlIiwgImNyZWF0ZUNvbm5lY3Rpb24iLCAiaXNWYWxpZE9iamVjdCIsICJDb25uZWN0aW9uTWFuYWdlciIsICJpZCIsICJjb25uZWN0aW9uIiwgIl9PcGVuUGF5Rm9ybSIsICJjb25maWciLCAiaW5pdFN0YXR1cyIsICJfZSIsICJfZiIsICJjYW5BcHBsZVBheSIsICJjYW5Hb29nbGVQYXkiLCAidXNlclBhcmFtcyIsICJwcm92aWRlciIsICJmb3JtIiwgImVsZW1lbnQiLCAiZWxlbWVudFZhbHVlIiwgImZyYW1lIiwgInF1ZXJ5U3RyaW5nIiwgInNlbGVjdG9yIiwgImNvbm4iLCAiY2RlQ29ubmVjdGlvbnMiLCAibm9PcCIsICJlcnJNc2ciLCAiT3BlblBheUZvcm0iXQp9Cg==