@openai/agents-realtime 0.8.4 → 0.9.0

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.
@@ -0,0 +1,637 @@
1
+ var U = Object.defineProperty;
2
+ var j = (t, s, e) => s in t ? U(t, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[s] = e;
3
+ var o = (t, s, e) => j(t, typeof s != "symbol" ? s + "" : s, e);
4
+ import { Capability as _, requireBoundSession as N, UserError as b, tool as m, object as y, string as p, applyPatchTool as K, withSandboxSpan as w, isRecord as L, encodeUint8ArrayToBase64 as H, ApplyPatchOperation as z, number as d, boolean as P, prompt as T, Agent as X, SANDBOX_AGENT_BRAND as q, cloneManifest as G, Manifest as Y, normalizeUser as J } from "./index-B8JqVS66.mjs";
5
+ function V(t) {
6
+ return t ? !(typeof t == "object" && t && "constructor" in t && typeof t.constructor == "function" ? t.constructor.name : "").includes("ChatCompletions") : !0;
7
+ }
8
+ function Q(t) {
9
+ return $(t);
10
+ }
11
+ function $(t) {
12
+ return t ? !(typeof t == "object" && t && "constructor" in t && typeof t.constructor == "function" ? t.constructor.name : "").includes("ChatCompletions") : !1;
13
+ }
14
+ class Z {
15
+ }
16
+ class ee extends Z {
17
+ constructor(e = 0.9, i = 24e4) {
18
+ super();
19
+ o(this, "thresholdRatio");
20
+ o(this, "fallbackThreshold");
21
+ this.thresholdRatio = e, this.fallbackThreshold = i;
22
+ }
23
+ compactThreshold(e) {
24
+ if (!e)
25
+ return this.fallbackThreshold;
26
+ const i = u.forModel(e);
27
+ return i ? Math.floor(i.contextWindow * this.thresholdRatio) : this.fallbackThreshold;
28
+ }
29
+ }
30
+ class u {
31
+ constructor(s) {
32
+ o(this, "contextWindow");
33
+ this.contextWindow = s;
34
+ }
35
+ static forModel(s) {
36
+ for (const e of ie(s)) {
37
+ if (ne.has(e))
38
+ return new u(1047576);
39
+ if (re.has(e))
40
+ return new u(4e5);
41
+ if (oe.has(e))
42
+ return new u(2e5);
43
+ if (ae.has(e))
44
+ return new u(128e3);
45
+ }
46
+ }
47
+ }
48
+ class te extends _ {
49
+ constructor(e = new ee()) {
50
+ super();
51
+ o(this, "type", "compaction");
52
+ o(this, "policy");
53
+ this.policy = e;
54
+ }
55
+ samplingParams(e) {
56
+ if (e.modelInstance && !V(e.modelInstance))
57
+ return {};
58
+ const i = typeof e.model == "string" ? e.model : void 0;
59
+ return {
60
+ context_management: [
61
+ {
62
+ type: "compaction",
63
+ compact_threshold: this.policy.compactThreshold(i)
64
+ }
65
+ ]
66
+ };
67
+ }
68
+ processContext(e) {
69
+ let i = -1;
70
+ for (let n = 0; n < e.length; n += 1)
71
+ e[n].type === "compaction" && (i = n);
72
+ return i === -1 ? e : e.slice(i);
73
+ }
74
+ }
75
+ function se(t = {}) {
76
+ return new te(t.policy);
77
+ }
78
+ function ie(t) {
79
+ const s = t.trim();
80
+ if (!s)
81
+ return [];
82
+ const i = (s.includes("/") ? s.slice(s.lastIndexOf("/") + 1) : s).toLowerCase(), n = i.replace(/-\d{4}-\d{2}-\d{2}$/u, "");
83
+ return [.../* @__PURE__ */ new Set([i, n])];
84
+ }
85
+ const ne = /* @__PURE__ */ new Set([
86
+ "gpt-5.4",
87
+ "gpt-5.4-2026-03-05",
88
+ "gpt-5.4-pro",
89
+ "gpt-5.4-pro-2026-03-05",
90
+ "gpt-4.1",
91
+ "gpt-4.1-2025-04-14",
92
+ "gpt-4.1-mini",
93
+ "gpt-4.1-mini-2025-04-14",
94
+ "gpt-4.1-nano",
95
+ "gpt-4.1-nano-2025-04-14"
96
+ ]), re = /* @__PURE__ */ new Set([
97
+ "gpt-5",
98
+ "gpt-5-codex",
99
+ "gpt-5-mini",
100
+ "gpt-5-nano",
101
+ "gpt-5-pro",
102
+ "gpt-5.1",
103
+ "gpt-5.1-codex",
104
+ "gpt-5.1-codex-max",
105
+ "gpt-5.1-codex-mini",
106
+ "gpt-5.2",
107
+ "gpt-5.2-codex",
108
+ "gpt-5.2-codex-cyber",
109
+ "gpt-5.2-pro",
110
+ "gpt-5.3-codex",
111
+ "gpt-5.3-codex-spark",
112
+ "gpt-5.4-mini",
113
+ "gpt-5.4-nano"
114
+ ]), oe = /* @__PURE__ */ new Set([
115
+ "codex-mini-latest",
116
+ "o1",
117
+ "o1-2024-12-17",
118
+ "o1-pro",
119
+ "o3",
120
+ "o3-2025-04-16",
121
+ "o3-mini",
122
+ "o3-pro",
123
+ "o3-deep-research",
124
+ "o4-mini",
125
+ "o4-mini-2025-04-16",
126
+ "o4-mini-deep-research"
127
+ ]), ae = /* @__PURE__ */ new Set([
128
+ "gpt-4o",
129
+ "gpt-4o-2024-08-06",
130
+ "gpt-4o-mini",
131
+ "gpt-4o-mini-2024-07-18",
132
+ "gpt-5-chat-latest",
133
+ "gpt-5.1-chat-latest",
134
+ "gpt-5.2-chat-latest",
135
+ "gpt-5.3-chat-latest"
136
+ ]), le = {
137
+ type: "object",
138
+ properties: {
139
+ patch: {
140
+ type: "string",
141
+ description: "A freeform apply_patch payload wrapped in *** Begin Patch and *** End Patch."
142
+ },
143
+ operation: {
144
+ type: "object",
145
+ description: "A single structured apply_patch operation."
146
+ },
147
+ operations: {
148
+ type: "array",
149
+ items: { type: "object" },
150
+ description: "Structured apply_patch operations to apply in order."
151
+ },
152
+ command: {
153
+ type: "array",
154
+ description: 'Optional ["apply_patch", patch] command tuple form.'
155
+ },
156
+ type: {
157
+ type: "string",
158
+ enum: ["create_file", "update_file", "delete_file"],
159
+ description: "The patch operation to apply."
160
+ },
161
+ path: {
162
+ type: "string",
163
+ description: "The sandbox file path to patch."
164
+ },
165
+ diff: {
166
+ type: "string",
167
+ description: "The V4A patch diff for create_file and update_file operations."
168
+ },
169
+ moveTo: {
170
+ type: "string",
171
+ description: "Optional destination path for update_file move operations."
172
+ }
173
+ },
174
+ required: [],
175
+ additionalProperties: !0
176
+ }, k = "*** Begin Patch", D = "*** End Patch", x = "*** Add File: ", I = "*** Delete File: ", v = "*** Update File: ", M = "*** Move to: ";
177
+ function A(t) {
178
+ if (t instanceof Error)
179
+ return t.message || t.toString();
180
+ try {
181
+ return JSON.stringify(t);
182
+ } catch {
183
+ return String(t);
184
+ }
185
+ }
186
+ function ce(t) {
187
+ if (typeof t == "string")
188
+ return t;
189
+ const s = t.image;
190
+ if (typeof s == "string")
191
+ return s;
192
+ if (!L(s))
193
+ return "No image data was returned by the sandbox session.";
194
+ const e = s;
195
+ return typeof e.url == "string" ? e.url : typeof e.fileId == "string" ? `OpenAI file reference: ${e.fileId}` : typeof e.data == "string" ? `data:${typeof e.mediaType == "string" ? e.mediaType : "application/octet-stream"};base64,${e.data}` : e.data instanceof Uint8Array ? `data:${typeof e.mediaType == "string" ? e.mediaType : "application/octet-stream"};base64,${H(e.data)}` : "No image data was returned by the sandbox session.";
196
+ }
197
+ function pe(t, s) {
198
+ const e = A(s);
199
+ if (/not found/iu.test(e))
200
+ return `image path \`${t}\` was not found`;
201
+ if (/not a file/iu.test(e))
202
+ return `image path \`${t}\` is not a file`;
203
+ if (/exceeds the 10 MB limit|exceeded the allowed size/iu.test(e))
204
+ return `image path \`${t}\` exceeded the allowed size of 10MB; resize or compress the image and try again`;
205
+ if (/unsupported image format|not a supported image/iu.test(e))
206
+ return `image path \`${t}\` is not a supported image file`;
207
+ const i = s instanceof Error ? s.name : typeof s;
208
+ return `unable to read image at \`${t}\`: ${i}`;
209
+ }
210
+ function ue(t) {
211
+ const s = t.trimStart();
212
+ if (s.startsWith(k))
213
+ return f(s);
214
+ let e;
215
+ try {
216
+ e = JSON.parse(t);
217
+ } catch (i) {
218
+ return {
219
+ ok: !1,
220
+ error: `Invalid apply_patch JSON: ${A(i)}`
221
+ };
222
+ }
223
+ return de(e);
224
+ }
225
+ function de(t) {
226
+ if (typeof t == "string")
227
+ return f(t);
228
+ if (Array.isArray(t))
229
+ return h(t);
230
+ if (!L(t))
231
+ return {
232
+ ok: !1,
233
+ error: "apply_patch input must be an object or array."
234
+ };
235
+ if (typeof t.patch == "string")
236
+ return f(t.patch);
237
+ if (Array.isArray(t.command)) {
238
+ const [s, e] = t.command;
239
+ if (s === "apply_patch" && typeof e == "string")
240
+ return f(e);
241
+ }
242
+ return Array.isArray(t.operations) ? h(t.operations) : t.operation !== void 0 ? h([t.operation]) : h([t]);
243
+ }
244
+ function h(t) {
245
+ const s = [];
246
+ for (const e of t) {
247
+ const i = z.safeParse(e);
248
+ if (!i.success)
249
+ return {
250
+ ok: !1,
251
+ error: `Invalid apply_patch operation: ${i.error.message}`
252
+ };
253
+ s.push(i.data);
254
+ }
255
+ return s.length === 0 ? { ok: !1, error: "apply_patch input must include an operation." } : { ok: !0, operations: s };
256
+ }
257
+ function f(t) {
258
+ const s = t.split(/\r?\n/);
259
+ if (s.at(-1) === "" && s.pop(), s[0] !== k)
260
+ return {
261
+ ok: !1,
262
+ error: `apply_patch input must start with "${k}".`
263
+ };
264
+ if (s.length < 2 || s.at(-1) !== D)
265
+ return {
266
+ ok: !1,
267
+ error: `apply_patch input must end with "${D}".`
268
+ };
269
+ const e = [];
270
+ let i = 1;
271
+ for (; i < s.length - 1; ) {
272
+ const n = s[i];
273
+ let r;
274
+ if (n.startsWith(x))
275
+ r = he(s, i);
276
+ else if (n.startsWith(I))
277
+ r = fe(s, i);
278
+ else if (n.startsWith(v))
279
+ r = me(s, i);
280
+ else
281
+ return {
282
+ ok: !1,
283
+ error: `Invalid apply_patch file operation header: ${n}`
284
+ };
285
+ if ("error" in r)
286
+ return { ok: !1, error: r.error };
287
+ e.push(r.operation), i = r.nextIndex;
288
+ }
289
+ return e.length === 0 ? {
290
+ ok: !1,
291
+ error: "apply_patch input must include at least one file operation."
292
+ } : { ok: !0, operations: e };
293
+ }
294
+ function he(t, s) {
295
+ const e = g(t[s], x);
296
+ if (!e)
297
+ return { error: `Missing path in apply_patch header: ${t[s]}` };
298
+ s += 1;
299
+ const i = [];
300
+ for (; s < t.length - 1 && !S(t[s]); ) {
301
+ const n = t[s];
302
+ if (!n.startsWith("+"))
303
+ return { error: `Invalid Add File line: ${n}` };
304
+ i.push(n), s += 1;
305
+ }
306
+ return i.length === 0 ? {
307
+ error: `Add File patch for ${e} must include at least one + line.`
308
+ } : {
309
+ operation: {
310
+ type: "create_file",
311
+ path: e,
312
+ diff: F(i)
313
+ },
314
+ nextIndex: s
315
+ };
316
+ }
317
+ function fe(t, s) {
318
+ const e = g(t[s], I);
319
+ return e ? (s += 1, s < t.length - 1 && !S(t[s]) ? { error: `Delete File patch for ${e} must not include a diff.` } : {
320
+ operation: {
321
+ type: "delete_file",
322
+ path: e
323
+ },
324
+ nextIndex: s
325
+ }) : { error: `Missing path in apply_patch header: ${t[s]}` };
326
+ }
327
+ function me(t, s) {
328
+ const e = g(t[s], v);
329
+ if (!e)
330
+ return { error: `Missing path in apply_patch header: ${t[s]}` };
331
+ s += 1;
332
+ let i;
333
+ if (s < t.length - 1 && t[s].startsWith(M)) {
334
+ const r = g(t[s], M);
335
+ if (!r)
336
+ return { error: `Missing path in apply_patch header: ${t[s]}` };
337
+ i = r, s += 1;
338
+ }
339
+ const n = [];
340
+ for (; s < t.length - 1 && !S(t[s]); )
341
+ n.push(t[s]), s += 1;
342
+ return n.length === 0 && !i ? { error: `Update File patch for ${e} must include a hunk.` } : {
343
+ operation: {
344
+ type: "update_file",
345
+ path: e,
346
+ diff: n.length > 0 ? F(n) : "",
347
+ ...i ? { moveTo: i } : {}
348
+ },
349
+ nextIndex: s
350
+ };
351
+ }
352
+ function g(t, s) {
353
+ const e = t.slice(s.length).trim();
354
+ return e || null;
355
+ }
356
+ function S(t) {
357
+ return t.startsWith(x) || t.startsWith(I) || t.startsWith(v);
358
+ }
359
+ function F(t) {
360
+ return `${t.join(`
361
+ `)}
362
+ `;
363
+ }
364
+ async function ye(t, s, e) {
365
+ let i;
366
+ try {
367
+ switch (s.type) {
368
+ case "create_file":
369
+ i = await t.createFile(s, { runContext: e });
370
+ break;
371
+ case "update_file":
372
+ i = await t.updateFile(s, { runContext: e });
373
+ break;
374
+ case "delete_file":
375
+ i = await t.deleteFile(s, { runContext: e });
376
+ break;
377
+ default:
378
+ return "Unsupported apply_patch operation.";
379
+ }
380
+ } catch (n) {
381
+ return `Failed to apply patch: ${A(n)}`;
382
+ }
383
+ return (i == null ? void 0 : i.status) === "failed" ? i.output ? `Patch failed: ${i.output}` : "Patch failed." : (i == null ? void 0 : i.output) ?? "Patch applied.";
384
+ }
385
+ async function ge(t, s, e) {
386
+ const i = [];
387
+ for (const n of s) {
388
+ const r = await ye(t, n, e);
389
+ r && i.push(r);
390
+ }
391
+ return i.join(`
392
+ `) || "Patch applied.";
393
+ }
394
+ function be(t) {
395
+ return {
396
+ type: "function",
397
+ name: "apply_patch",
398
+ description: "Applies a create, update, move, or delete file patch in the sandbox workspace. Accepts a freeform patch string or structured apply_patch operations.",
399
+ parameters: le,
400
+ strict: !1,
401
+ deferLoading: !1,
402
+ needsApproval: async () => !1,
403
+ isEnabled: async () => !0,
404
+ invoke: async (e, i) => {
405
+ const n = ue(i);
406
+ return n.ok ? await ge(t, n.operations, e) : n.error;
407
+ }
408
+ };
409
+ }
410
+ class we extends _ {
411
+ constructor(e = {}) {
412
+ super();
413
+ o(this, "type", "filesystem");
414
+ o(this, "configureTools");
415
+ this.configureTools = e.configureTools;
416
+ }
417
+ tools() {
418
+ var l;
419
+ const e = N(this.type, this._session), i = (l = e.createEditor) == null ? void 0 : l.call(e, this._runAs);
420
+ if (!i)
421
+ throw new b("Filesystem sandbox sessions must provide createEditor().");
422
+ const n = [], r = async (a) => {
423
+ if (!e.viewImage)
424
+ throw new b("Filesystem sandbox sessions must provide viewImage().");
425
+ try {
426
+ return await w("sandbox.view_image", {
427
+ path: a,
428
+ run_as: this._runAs
429
+ }, async () => await e.viewImage({
430
+ path: a,
431
+ runAs: this._runAs
432
+ }));
433
+ } catch (c) {
434
+ return pe(a, c);
435
+ }
436
+ };
437
+ return $(this._modelInstance) ? n.push(m({
438
+ name: "view_image",
439
+ description: "Returns an image output from a local path in the sandbox workspace.",
440
+ parameters: y({
441
+ path: p().describe("Local filesystem path to an image file")
442
+ }),
443
+ execute: async ({ path: a }) => await r(a)
444
+ })) : n.push(m({
445
+ name: "view_image",
446
+ description: "Returns an image from a local path in the sandbox workspace as a data URL or reference string.",
447
+ parameters: y({
448
+ path: p().describe("Local filesystem path to an image file")
449
+ }),
450
+ execute: async ({ path: a }) => ce(await r(a))
451
+ })), Q(this._modelInstance) ? n.push(K({
452
+ name: "apply_patch",
453
+ editor: i
454
+ })) : n.push(be(i)), this.configureTools ? this.configureTools([...n]) : n;
455
+ }
456
+ }
457
+ function ke(t = {}) {
458
+ return new we(t);
459
+ }
460
+ const _e = 1e4, Te = 250, xe = [
461
+ "When using the shell:",
462
+ "- Use `exec_command` for shell execution.",
463
+ "- If available, use `write_stdin` to interact with or poll running sessions.",
464
+ "- To interrupt a long-running process via `write_stdin`, start it with `tty=true` and send Ctrl-C (`\\u0003`).",
465
+ "- Prefer `rg` and `rg --files` for text/file discovery when available.",
466
+ "- Avoid using Python scripts just to print large file chunks."
467
+ ].join(`
468
+ `);
469
+ class Ie extends _ {
470
+ constructor(e = {}) {
471
+ super();
472
+ o(this, "type", "shell");
473
+ o(this, "configureTools");
474
+ this.configureTools = e.configureTools;
475
+ }
476
+ tools() {
477
+ var n;
478
+ const e = N(this.type, this._session);
479
+ if (!e.execCommand)
480
+ throw new b("Shell sandbox sessions must provide execCommand().");
481
+ const i = [
482
+ m({
483
+ name: "exec_command",
484
+ description: "Runs a command in a PTY, returning output or a session ID for ongoing interaction.",
485
+ parameters: y({
486
+ cmd: p().min(1).describe("Shell command to execute."),
487
+ workdir: p().optional().describe("Optional working directory to run the command in; defaults to the turn cwd."),
488
+ shell: p().optional().describe("Shell binary to launch. Defaults to the user's default shell."),
489
+ login: P().default(!0).describe("Whether to run the shell with -l/-i semantics. Defaults to true."),
490
+ tty: P().default(!1).describe("Whether to allocate a TTY for the command. Defaults to false (plain pipes); set to true to open a PTY and access TTY process."),
491
+ yield_time_ms: d().int().min(0).default(_e).describe("How long to wait (in milliseconds) for output before yielding."),
492
+ max_output_tokens: d().int().min(1).optional().describe("Maximum number of tokens to return. Excess output will be truncated.")
493
+ }),
494
+ execute: async ({ cmd: r, workdir: l, shell: a, login: c, tty: E, yield_time_ms: B, max_output_tokens: R }) => await w("sandbox.exec", {
495
+ cmd: r,
496
+ workdir: l,
497
+ shell: a,
498
+ login: c,
499
+ tty: E,
500
+ run_as: this._runAs
501
+ }, async () => await e.execCommand({
502
+ cmd: r,
503
+ workdir: l,
504
+ shell: a,
505
+ login: c,
506
+ tty: E,
507
+ yieldTimeMs: B,
508
+ maxOutputTokens: R,
509
+ runAs: this._runAs
510
+ }))
511
+ })
512
+ ];
513
+ return (n = e.supportsPty) != null && n.call(e) && e.writeStdin && i.push(m({
514
+ name: "write_stdin",
515
+ description: "Writes characters to an existing unified exec session and returns recent output.",
516
+ parameters: y({
517
+ session_id: d().int().describe("Identifier of the running unified exec session."),
518
+ chars: p().default("").describe("Bytes to write to stdin (may be empty to poll)."),
519
+ yield_time_ms: d().int().min(0).default(Te).describe("How long to wait (in milliseconds) for output before yielding."),
520
+ max_output_tokens: d().int().min(1).optional().describe("Maximum number of tokens to return. Excess output will be truncated.")
521
+ }),
522
+ execute: async ({ session_id: r, chars: l, yield_time_ms: a, max_output_tokens: c }) => await w("sandbox.write_stdin", {
523
+ session_id: r
524
+ }, async () => await e.writeStdin({
525
+ sessionId: r,
526
+ chars: l,
527
+ yieldTimeMs: a,
528
+ maxOutputTokens: c
529
+ }))
530
+ })), this.configureTools ? this.configureTools([...i]) : i;
531
+ }
532
+ instructions() {
533
+ return xe;
534
+ }
535
+ }
536
+ function ve(t = {}) {
537
+ return new Ie(t);
538
+ }
539
+ T`
540
+ A skill is a set of local instructions to follow that is stored in a \`SKILL.md\` file. Below is the list of skills that can be used. Each entry includes a name, description, and file path so you can open the source for full instructions when using a specific skill.
541
+ `;
542
+ T`
543
+ ### How to use skills
544
+ - Discovery: The list above is the skills available in this session (name + description + file path). Skill bodies live on disk at the listed paths.
545
+ - Trigger rules: If the user names a skill (with \`$SkillName\` or plain text) OR the task clearly matches a skill's description shown above, you must use that skill for that turn. Multiple mentions mean use them all. Do not carry skills across turns unless re-mentioned.
546
+ - Missing/blocked: If a named skill isn't in the list or the path can't be read, say so briefly and continue with the best fallback.
547
+ - How to use a skill (progressive disclosure):
548
+ 1) After deciding to use a skill, open its \`SKILL.md\`. Read only enough to follow the workflow.
549
+ 2) If \`SKILL.md\` points to extra folders such as \`references/\`, load only the specific files needed for the request; don't bulk-load everything.
550
+ 3) If \`scripts/\` exist, prefer running or patching them instead of retyping large code blocks.
551
+ 4) If \`assets/\` or templates exist, reuse them instead of recreating from scratch.
552
+ - Coordination and sequencing:
553
+ - If multiple skills apply, choose the minimal set that covers the request and state the order you'll use them.
554
+ - Announce which skill(s) you're using and why (one short line). If you skip an obvious skill, say why.
555
+ - Context hygiene:
556
+ - Keep context small: summarize long sections instead of pasting them; only load extra files when needed.
557
+ - Avoid deep reference-chasing: prefer opening only files directly linked from \`SKILL.md\` unless you're blocked.
558
+ - When variants exist (frameworks, providers, domains), pick only the relevant reference file(s) and note that choice.
559
+ - Safety and fallback: If a skill can't be applied cleanly (missing files, unclear instructions), state the issue, pick the next-best approach, and continue.
560
+ `;
561
+ T`
562
+ ### How to use skills
563
+ - Discovery: The list above is the skill index available in this session (name + description + workspace path). In lazy mode, those paths are loaded on demand instead of being present up front.
564
+ - Trigger rules: If the user names a skill (with \`$SkillName\` or plain text) OR the task clearly matches a skill's description shown above, you must use that skill for that turn. Multiple mentions mean use them all. Do not carry skills across turns unless re-mentioned.
565
+ - Missing/blocked: If a named skill isn't in the list or the path can't be read, say so briefly and continue with the best fallback.
566
+ - How to use a skill (progressive disclosure):
567
+ 1) After deciding to use a lazy skill, call \`load_skill\` for that skill first, then open its \`SKILL.md\`.
568
+ 2) If \`SKILL.md\` points to extra folders such as \`references/\`, load only the specific files needed for the request; don't bulk-load everything.
569
+ 3) If \`scripts/\` exist, prefer running or patching them instead of retyping large code blocks.
570
+ 4) If \`assets/\` or templates exist, reuse them instead of recreating from scratch.
571
+ - Coordination and sequencing:
572
+ - If multiple skills apply, choose the minimal set that covers the request and state the order you'll use them.
573
+ - Announce which skill(s) you're using and why (one short line). If you skip an obvious skill, say why.
574
+ - Context hygiene:
575
+ - Keep context small: summarize long sections instead of pasting them; only load extra files when needed.
576
+ - Avoid deep reference-chasing: prefer opening only files directly linked from \`SKILL.md\` unless you're blocked.
577
+ - When variants exist (frameworks, providers, domains), pick only the relevant reference file(s) and note that choice.
578
+ - Safety and fallback: If a skill can't be applied cleanly (missing files, unclear instructions), state the issue, pick the next-best approach, and continue.
579
+ `;
580
+ function Ae() {
581
+ return [ke(), ve(), se()];
582
+ }
583
+ const Se = {
584
+ default: Ae
585
+ };
586
+ var C, O;
587
+ class W extends (O = X, C = q, O) {
588
+ constructor(e) {
589
+ super(e);
590
+ o(this, C, !0);
591
+ o(this, "defaultManifest");
592
+ o(this, "baseInstructions");
593
+ o(this, "capabilities");
594
+ o(this, "runAs");
595
+ o(this, "runtimeManifest");
596
+ if (e.baseInstructions !== void 0 && typeof e.baseInstructions != "string" && typeof e.baseInstructions != "function")
597
+ throw new TypeError("SandboxAgent baseInstructions must be a string or function.");
598
+ this.defaultManifest = e.defaultManifest ? G(e.defaultManifest) : void 0, this.baseInstructions = e.baseInstructions, this.capabilities = e.capabilities ?? Se.default(), this.runAs = Ee(e.runAs), this.runtimeManifest = this.defaultManifest ?? new Y();
599
+ }
600
+ clone(e) {
601
+ return new W({
602
+ name: e.name ?? this.name,
603
+ instructions: e.instructions ?? this.instructions,
604
+ prompt: e.prompt ?? this.prompt,
605
+ handoffDescription: e.handoffDescription ?? this.handoffDescription,
606
+ handoffs: e.handoffs ?? this.handoffs,
607
+ model: e.model ?? this.model,
608
+ modelSettings: e.modelSettings ?? this.modelSettings,
609
+ tools: e.tools ?? this.tools,
610
+ mcpServers: e.mcpServers ?? this.mcpServers,
611
+ inputGuardrails: e.inputGuardrails ?? this.inputGuardrails,
612
+ outputGuardrails: e.outputGuardrails ?? this.outputGuardrails,
613
+ outputType: e.outputType ?? this.outputType,
614
+ toolUseBehavior: e.toolUseBehavior ?? this.toolUseBehavior,
615
+ resetToolChoice: e.resetToolChoice ?? this.resetToolChoice,
616
+ defaultManifest: e.defaultManifest ?? this.defaultManifest,
617
+ baseInstructions: e.baseInstructions ?? this.baseInstructions,
618
+ capabilities: e.capabilities ?? this.capabilities,
619
+ runAs: e.runAs ?? this.runAs
620
+ });
621
+ }
622
+ }
623
+ function Ee(t) {
624
+ if (t !== void 0) {
625
+ if (typeof t == "string") {
626
+ const s = t.trim();
627
+ if (!s)
628
+ throw new TypeError("SandboxAgent runAs must be non-empty.");
629
+ return s;
630
+ }
631
+ return J(t);
632
+ }
633
+ }
634
+ export {
635
+ W as SandboxAgent
636
+ };
637
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtQzhNN1MyNVYubWpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvY2FwYWJpbGl0aWVzL3RyYW5zcG9ydC5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvY2FwYWJpbGl0aWVzL2NvbXBhY3Rpb24ubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9maWxlc3lzdGVtLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3Qvc2FuZGJveC9jYXBhYmlsaXRpZXMvc2hlbGwubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9za2lsbHMubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9pbmRleC5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvYWdlbnQubWpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1Jlc3BvbnNlc0NvbXBhY3Rpb25UcmFuc3BvcnQobW9kZWxJbnN0YW5jZSkge1xuICAgIGlmICghbW9kZWxJbnN0YW5jZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgIG1vZGVsSW5zdGFuY2UgJiZcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyBpbiBtb2RlbEluc3RhbmNlICYmXG4gICAgICAgIHR5cGVvZiBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIDogJyc7XG4gICAgcmV0dXJuICFjb25zdHJ1Y3Rvck5hbWUuaW5jbHVkZXMoJ0NoYXRDb21wbGV0aW9ucycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzQXBwbHlQYXRjaFRyYW5zcG9ydChtb2RlbEluc3RhbmNlKSB7XG4gICAgcmV0dXJuIHN1cHBvcnRzU3RydWN0dXJlZFRvb2xPdXRwdXRUcmFuc3BvcnQobW9kZWxJbnN0YW5jZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNTdHJ1Y3R1cmVkVG9vbE91dHB1dFRyYW5zcG9ydChtb2RlbEluc3RhbmNlKSB7XG4gICAgaWYgKCFtb2RlbEluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgIG1vZGVsSW5zdGFuY2UgJiZcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyBpbiBtb2RlbEluc3RhbmNlICYmXG4gICAgICAgIHR5cGVvZiBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIDogJyc7XG4gICAgcmV0dXJuICFjb25zdHJ1Y3Rvck5hbWUuaW5jbHVkZXMoJ0NoYXRDb21wbGV0aW9ucycpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhbnNwb3J0Lm1qcy5tYXAiLCJpbXBvcnQgeyBDYXBhYmlsaXR5IH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmltcG9ydCB7IHN1cHBvcnRzUmVzcG9uc2VzQ29tcGFjdGlvblRyYW5zcG9ydCB9IGZyb20gXCIuL3RyYW5zcG9ydC5tanNcIjtcbmV4cG9ydCBjbGFzcyBDb21wYWN0aW9uUG9saWN5IHtcbn1cbmV4cG9ydCBjbGFzcyBTdGF0aWNDb21wYWN0aW9uUG9saWN5IGV4dGVuZHMgQ29tcGFjdGlvblBvbGljeSB7XG4gICAgdGhyZXNob2xkO1xuICAgIGNvbnN0cnVjdG9yKHRocmVzaG9sZCA9IDI0MDAwMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRocmVzaG9sZCA9IHRocmVzaG9sZDtcbiAgICB9XG4gICAgY29tcGFjdFRocmVzaG9sZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhyZXNob2xkO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBEeW5hbWljQ29tcGFjdGlvblBvbGljeSBleHRlbmRzIENvbXBhY3Rpb25Qb2xpY3kge1xuICAgIHRocmVzaG9sZFJhdGlvO1xuICAgIGZhbGxiYWNrVGhyZXNob2xkO1xuICAgIGNvbnN0cnVjdG9yKHRocmVzaG9sZFJhdGlvID0gMC45LCBmYWxsYmFja1RocmVzaG9sZCA9IDI0MDAwMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRocmVzaG9sZFJhdGlvID0gdGhyZXNob2xkUmF0aW87XG4gICAgICAgIHRoaXMuZmFsbGJhY2tUaHJlc2hvbGQgPSBmYWxsYmFja1RocmVzaG9sZDtcbiAgICB9XG4gICAgY29tcGFjdFRocmVzaG9sZChtb2RlbCkge1xuICAgICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWxsYmFja1RocmVzaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2RlbEluZm8gPSBDb21wYWN0aW9uTW9kZWxJbmZvLmZvck1vZGVsKG1vZGVsKTtcbiAgICAgICAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZhbGxiYWNrVGhyZXNob2xkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKG1vZGVsSW5mby5jb250ZXh0V2luZG93ICogdGhpcy50aHJlc2hvbGRSYXRpbyk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBhY3Rpb25Nb2RlbEluZm8ge1xuICAgIGNvbnRleHRXaW5kb3c7XG4gICAgY29uc3RydWN0b3IoY29udGV4dFdpbmRvdykge1xuICAgICAgICB0aGlzLmNvbnRleHRXaW5kb3cgPSBjb250ZXh0V2luZG93O1xuICAgIH1cbiAgICBzdGF0aWMgZm9yTW9kZWwobW9kZWwpIHtcbiAgICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgZ2V0U2FuZGJveENvbXBhY3Rpb25Nb2RlbENhbmRpZGF0ZXMobW9kZWwpKSB7XG4gICAgICAgICAgICBpZiAoU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMU0uaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25Nb2RlbEluZm8oMTA0NzU3Nik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoU0FOREJPWF9DT05URVhUX1dJTkRPV1NfNDAwSy5oYXMoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbk1vZGVsSW5mbyg0MDAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzIwMEsuaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25Nb2RlbEluZm8oMjAwMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18xMjhLLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uTW9kZWxJbmZvKDEyODAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5jbGFzcyBDb21wYWN0aW9uQ2FwYWJpbGl0eSBleHRlbmRzIENhcGFiaWxpdHkge1xuICAgIHR5cGUgPSAnY29tcGFjdGlvbic7XG4gICAgcG9saWN5O1xuICAgIGNvbnN0cnVjdG9yKHBvbGljeSA9IG5ldyBEeW5hbWljQ29tcGFjdGlvblBvbGljeSgpKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIH1cbiAgICBzYW1wbGluZ1BhcmFtcyhzYW1wbGluZ1BhcmFtcykge1xuICAgICAgICBpZiAoc2FtcGxpbmdQYXJhbXMubW9kZWxJbnN0YW5jZSAmJlxuICAgICAgICAgICAgIXN1cHBvcnRzUmVzcG9uc2VzQ29tcGFjdGlvblRyYW5zcG9ydChzYW1wbGluZ1BhcmFtcy5tb2RlbEluc3RhbmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdHlwZW9mIHNhbXBsaW5nUGFyYW1zLm1vZGVsID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBzYW1wbGluZ1BhcmFtcy5tb2RlbFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZXh0X21hbmFnZW1lbnQ6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb21wYWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgY29tcGFjdF90aHJlc2hvbGQ6IHRoaXMucG9saWN5LmNvbXBhY3RUaHJlc2hvbGQobW9kZWwpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwcm9jZXNzQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGxldCBsYXN0Q29tcGFjdGlvbkluZGV4ID0gLTE7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZXh0Lmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRbaW5kZXhdLnR5cGUgPT09ICdjb21wYWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGxhc3RDb21wYWN0aW9uSW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdENvbXBhY3Rpb25JbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0LnNsaWNlKGxhc3RDb21wYWN0aW9uSW5kZXgpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wYWN0aW9uKGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkNhcGFiaWxpdHkoYXJncy5wb2xpY3kpO1xufVxuZnVuY3Rpb24gZ2V0U2FuZGJveENvbXBhY3Rpb25Nb2RlbENhbmRpZGF0ZXMobW9kZWwpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbW9kZWwudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHdpdGhvdXRQcm92aWRlclByZWZpeCA9IHRyaW1tZWQuaW5jbHVkZXMoJy8nKVxuICAgICAgICA/IHRyaW1tZWQuc2xpY2UodHJpbW1lZC5sYXN0SW5kZXhPZignLycpICsgMSlcbiAgICAgICAgOiB0cmltbWVkO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB3aXRob3V0UHJvdmlkZXJQcmVmaXgudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB3aXRob3V0UGlubmVkRGF0ZSA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvLVxcZHs0fS1cXGR7Mn0tXFxkezJ9JC91LCAnJyk7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KFtub3JtYWxpemVkLCB3aXRob3V0UGlubmVkRGF0ZV0pXTtcbn1cbmNvbnN0IFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzFNID0gbmV3IFNldChbXG4gICAgJ2dwdC01LjQnLFxuICAgICdncHQtNS40LTIwMjYtMDMtMDUnLFxuICAgICdncHQtNS40LXBybycsXG4gICAgJ2dwdC01LjQtcHJvLTIwMjYtMDMtMDUnLFxuICAgICdncHQtNC4xJyxcbiAgICAnZ3B0LTQuMS0yMDI1LTA0LTE0JyxcbiAgICAnZ3B0LTQuMS1taW5pJyxcbiAgICAnZ3B0LTQuMS1taW5pLTIwMjUtMDQtMTQnLFxuICAgICdncHQtNC4xLW5hbm8nLFxuICAgICdncHQtNC4xLW5hbm8tMjAyNS0wNC0xNCcsXG5dKTtcbmNvbnN0IFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzQwMEsgPSBuZXcgU2V0KFtcbiAgICAnZ3B0LTUnLFxuICAgICdncHQtNS1jb2RleCcsXG4gICAgJ2dwdC01LW1pbmknLFxuICAgICdncHQtNS1uYW5vJyxcbiAgICAnZ3B0LTUtcHJvJyxcbiAgICAnZ3B0LTUuMScsXG4gICAgJ2dwdC01LjEtY29kZXgnLFxuICAgICdncHQtNS4xLWNvZGV4LW1heCcsXG4gICAgJ2dwdC01LjEtY29kZXgtbWluaScsXG4gICAgJ2dwdC01LjInLFxuICAgICdncHQtNS4yLWNvZGV4JyxcbiAgICAnZ3B0LTUuMi1jb2RleC1jeWJlcicsXG4gICAgJ2dwdC01LjItcHJvJyxcbiAgICAnZ3B0LTUuMy1jb2RleCcsXG4gICAgJ2dwdC01LjMtY29kZXgtc3BhcmsnLFxuICAgICdncHQtNS40LW1pbmknLFxuICAgICdncHQtNS40LW5hbm8nLFxuXSk7XG5jb25zdCBTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18yMDBLID0gbmV3IFNldChbXG4gICAgJ2NvZGV4LW1pbmktbGF0ZXN0JyxcbiAgICAnbzEnLFxuICAgICdvMS0yMDI0LTEyLTE3JyxcbiAgICAnbzEtcHJvJyxcbiAgICAnbzMnLFxuICAgICdvMy0yMDI1LTA0LTE2JyxcbiAgICAnbzMtbWluaScsXG4gICAgJ28zLXBybycsXG4gICAgJ28zLWRlZXAtcmVzZWFyY2gnLFxuICAgICdvNC1taW5pJyxcbiAgICAnbzQtbWluaS0yMDI1LTA0LTE2JyxcbiAgICAnbzQtbWluaS1kZWVwLXJlc2VhcmNoJyxcbl0pO1xuY29uc3QgU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMTI4SyA9IG5ldyBTZXQoW1xuICAgICdncHQtNG8nLFxuICAgICdncHQtNG8tMjAyNC0wOC0wNicsXG4gICAgJ2dwdC00by1taW5pJyxcbiAgICAnZ3B0LTRvLW1pbmktMjAyNC0wNy0xOCcsXG4gICAgJ2dwdC01LWNoYXQtbGF0ZXN0JyxcbiAgICAnZ3B0LTUuMS1jaGF0LWxhdGVzdCcsXG4gICAgJ2dwdC01LjItY2hhdC1sYXRlc3QnLFxuICAgICdncHQtNS4zLWNoYXQtbGF0ZXN0Jyxcbl0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcGFjdGlvbi5tanMubWFwIiwiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBVc2VyRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzLm1qc1wiO1xuaW1wb3J0IHsgYXBwbHlQYXRjaFRvb2wsIHRvb2wsIH0gZnJvbSBcIi4uLy4uL3Rvb2wubWpzXCI7XG5pbXBvcnQgeyBBcHBseVBhdGNoT3BlcmF0aW9uIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3Byb3RvY29sLm1qc1wiO1xuaW1wb3J0IHsgZW5jb2RlVWludDhBcnJheVRvQmFzZTY0IH0gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2U2NC5tanNcIjtcbmltcG9ydCB7IHdpdGhTYW5kYm94U3BhbiB9IGZyb20gXCIuLi9ydW50aW1lL3NwYW5zLm1qc1wiO1xuaW1wb3J0IHsgaXNSZWNvcmQgfSBmcm9tIFwiLi4vc2hhcmVkL3R5cGVHdWFyZHMubWpzXCI7XG5pbXBvcnQgeyBDYXBhYmlsaXR5LCByZXF1aXJlQm91bmRTZXNzaW9uLCB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5pbXBvcnQgeyBzdXBwb3J0c0FwcGx5UGF0Y2hUcmFuc3BvcnQsIHN1cHBvcnRzU3RydWN0dXJlZFRvb2xPdXRwdXRUcmFuc3BvcnQsIH0gZnJvbSBcIi4vdHJhbnNwb3J0Lm1qc1wiO1xuY29uc3QgYXBwbHlQYXRjaEZ1bmN0aW9uUGFyYW1ldGVycyA9IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHBhdGNoOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQSBmcmVlZm9ybSBhcHBseV9wYXRjaCBwYXlsb2FkIHdyYXBwZWQgaW4gKioqIEJlZ2luIFBhdGNoIGFuZCAqKiogRW5kIFBhdGNoLicsXG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbjoge1xuICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Egc2luZ2xlIHN0cnVjdHVyZWQgYXBwbHlfcGF0Y2ggb3BlcmF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbnM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICBpdGVtczogeyB0eXBlOiAnb2JqZWN0JyB9LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTdHJ1Y3R1cmVkIGFwcGx5X3BhdGNoIG9wZXJhdGlvbnMgdG8gYXBwbHkgaW4gb3JkZXIuJyxcbiAgICAgICAgfSxcbiAgICAgICAgY29tbWFuZDoge1xuICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnT3B0aW9uYWwgW1wiYXBwbHlfcGF0Y2hcIiwgcGF0Y2hdIGNvbW1hbmQgdHVwbGUgZm9ybS4nLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGVudW06IFsnY3JlYXRlX2ZpbGUnLCAndXBkYXRlX2ZpbGUnLCAnZGVsZXRlX2ZpbGUnXSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBhdGNoIG9wZXJhdGlvbiB0byBhcHBseS4nLFxuICAgICAgICB9LFxuICAgICAgICBwYXRoOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHNhbmRib3ggZmlsZSBwYXRoIHRvIHBhdGNoLicsXG4gICAgICAgIH0sXG4gICAgICAgIGRpZmY6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgVjRBIHBhdGNoIGRpZmYgZm9yIGNyZWF0ZV9maWxlIGFuZCB1cGRhdGVfZmlsZSBvcGVyYXRpb25zLicsXG4gICAgICAgIH0sXG4gICAgICAgIG1vdmVUbzoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ09wdGlvbmFsIGRlc3RpbmF0aW9uIHBhdGggZm9yIHVwZGF0ZV9maWxlIG1vdmUgb3BlcmF0aW9ucy4nLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFtdLFxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlLFxufTtcbmNvbnN0IEJFR0lOX1BBVENIID0gJyoqKiBCZWdpbiBQYXRjaCc7XG5jb25zdCBFTkRfUEFUQ0ggPSAnKioqIEVuZCBQYXRjaCc7XG5jb25zdCBBRERfRklMRSA9ICcqKiogQWRkIEZpbGU6ICc7XG5jb25zdCBERUxFVEVfRklMRSA9ICcqKiogRGVsZXRlIEZpbGU6ICc7XG5jb25zdCBVUERBVEVfRklMRSA9ICcqKiogVXBkYXRlIEZpbGU6ICc7XG5jb25zdCBNT1ZFX1RPID0gJyoqKiBNb3ZlIHRvOiAnO1xuZnVuY3Rpb24gdG9FcnJvck1lc3NhZ2UoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCBlcnJvci50b1N0cmluZygpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoZXJyb3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckltYWdlRm9yVGV4dFRyYW5zcG9ydChvdXRwdXQpIHtcbiAgICBpZiAodHlwZW9mIG91dHB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG4gICAgY29uc3QgaW1hZ2UgPSBvdXRwdXQuaW1hZ2U7XG4gICAgaWYgKHR5cGVvZiBpbWFnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGltYWdlO1xuICAgIH1cbiAgICBpZiAoIWlzUmVjb3JkKGltYWdlKSkge1xuICAgICAgICByZXR1cm4gJ05vIGltYWdlIGRhdGEgd2FzIHJldHVybmVkIGJ5IHRoZSBzYW5kYm94IHNlc3Npb24uJztcbiAgICB9XG4gICAgY29uc3QgaW1hZ2VSZWNvcmQgPSBpbWFnZTtcbiAgICBpZiAodHlwZW9mIGltYWdlUmVjb3JkLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGltYWdlUmVjb3JkLnVybDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpbWFnZVJlY29yZC5maWxlSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBgT3BlbkFJIGZpbGUgcmVmZXJlbmNlOiAke2ltYWdlUmVjb3JkLmZpbGVJZH1gO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGltYWdlUmVjb3JkLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHR5cGVvZiBpbWFnZVJlY29yZC5tZWRpYVR5cGUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IGltYWdlUmVjb3JkLm1lZGlhVHlwZVxuICAgICAgICAgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgICAgICAgcmV0dXJuIGBkYXRhOiR7bWVkaWFUeXBlfTtiYXNlNjQsJHtpbWFnZVJlY29yZC5kYXRhfWA7XG4gICAgfVxuICAgIGlmIChpbWFnZVJlY29yZC5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSB0eXBlb2YgaW1hZ2VSZWNvcmQubWVkaWFUeXBlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBpbWFnZVJlY29yZC5tZWRpYVR5cGVcbiAgICAgICAgICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gICAgICAgIHJldHVybiBgZGF0YToke21lZGlhVHlwZX07YmFzZTY0LCR7ZW5jb2RlVWludDhBcnJheVRvQmFzZTY0KGltYWdlUmVjb3JkLmRhdGEpfWA7XG4gICAgfVxuICAgIHJldHVybiAnTm8gaW1hZ2UgZGF0YSB3YXMgcmV0dXJuZWQgYnkgdGhlIHNhbmRib3ggc2Vzc2lvbi4nO1xufVxuZnVuY3Rpb24gcmVuZGVyVmlld0ltYWdlRXJyb3IocGF0aCwgZXJyb3IpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdG9FcnJvck1lc3NhZ2UoZXJyb3IpO1xuICAgIGlmICgvbm90IGZvdW5kL2l1LnRlc3QobWVzc2FnZSkpIHtcbiAgICAgICAgcmV0dXJuIGBpbWFnZSBwYXRoIFxcYCR7cGF0aH1cXGAgd2FzIG5vdCBmb3VuZGA7XG4gICAgfVxuICAgIGlmICgvbm90IGEgZmlsZS9pdS50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybiBgaW1hZ2UgcGF0aCBcXGAke3BhdGh9XFxgIGlzIG5vdCBhIGZpbGVgO1xuICAgIH1cbiAgICBpZiAoL2V4Y2VlZHMgdGhlIDEwIE1CIGxpbWl0fGV4Y2VlZGVkIHRoZSBhbGxvd2VkIHNpemUvaXUudGVzdChtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm4gYGltYWdlIHBhdGggXFxgJHtwYXRofVxcYCBleGNlZWRlZCB0aGUgYWxsb3dlZCBzaXplIG9mIDEwTUI7IHJlc2l6ZSBvciBjb21wcmVzcyB0aGUgaW1hZ2UgYW5kIHRyeSBhZ2FpbmA7XG4gICAgfVxuICAgIGlmICgvdW5zdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0fG5vdCBhIHN1cHBvcnRlZCBpbWFnZS9pdS50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybiBgaW1hZ2UgcGF0aCBcXGAke3BhdGh9XFxgIGlzIG5vdCBhIHN1cHBvcnRlZCBpbWFnZSBmaWxlYDtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogdHlwZW9mIGVycm9yO1xuICAgIHJldHVybiBgdW5hYmxlIHRvIHJlYWQgaW1hZ2UgYXQgXFxgJHtwYXRofVxcYDogJHtuYW1lfWA7XG59XG5mdW5jdGlvbiBwYXJzZUFwcGx5UGF0Y2hJbnB1dChyYXdJbnB1dCkge1xuICAgIGNvbnN0IHRyaW1tZWRJbnB1dCA9IHJhd0lucHV0LnRyaW1TdGFydCgpO1xuICAgIGlmICh0cmltbWVkSW5wdXQuc3RhcnRzV2l0aChCRUdJTl9QQVRDSCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRnJlZWZvcm1QYXRjaCh0cmltbWVkSW5wdXQpO1xuICAgIH1cbiAgICBsZXQgcGF5bG9hZDtcbiAgICB0cnkge1xuICAgICAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShyYXdJbnB1dCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGBJbnZhbGlkIGFwcGx5X3BhdGNoIEpTT046ICR7dG9FcnJvck1lc3NhZ2UoZXJyb3IpfWAsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUFwcGx5UGF0Y2hQYXlsb2FkKHBheWxvYWQpO1xufVxuZnVuY3Rpb24gcGFyc2VBcHBseVBhdGNoUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcGFyc2VGcmVlZm9ybVBhdGNoKHBheWxvYWQpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhwYXlsb2FkKTtcbiAgICB9XG4gICAgaWYgKCFpc1JlY29yZChwYXlsb2FkKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6ICdhcHBseV9wYXRjaCBpbnB1dCBtdXN0IGJlIGFuIG9iamVjdCBvciBhcnJheS4nLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBheWxvYWQucGF0Y2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZyZWVmb3JtUGF0Y2gocGF5bG9hZC5wYXRjaCk7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQuY29tbWFuZCkpIHtcbiAgICAgICAgY29uc3QgW2NvbW1hbmROYW1lLCBwYXRjaF0gPSBwYXlsb2FkLmNvbW1hbmQ7XG4gICAgICAgIGlmIChjb21tYW5kTmFtZSA9PT0gJ2FwcGx5X3BhdGNoJyAmJiB0eXBlb2YgcGF0Y2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGcmVlZm9ybVBhdGNoKHBhdGNoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkLm9wZXJhdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cnVjdHVyZWRPcGVyYXRpb25zKHBheWxvYWQub3BlcmF0aW9ucyk7XG4gICAgfVxuICAgIGlmIChwYXlsb2FkLm9wZXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cnVjdHVyZWRPcGVyYXRpb25zKFtwYXlsb2FkLm9wZXJhdGlvbl0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhbcGF5bG9hZF0pO1xufVxuZnVuY3Rpb24gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhwYXlsb2Fkcykge1xuICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBheWxvYWQgb2YgcGF5bG9hZHMpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gQXBwbHlQYXRjaE9wZXJhdGlvbi5zYWZlUGFyc2UocGF5bG9hZCk7XG4gICAgICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBgSW52YWxpZCBhcHBseV9wYXRjaCBvcGVyYXRpb246ICR7cGFyc2VkLmVycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgb3BlcmF0aW9ucy5wdXNoKHBhcnNlZC5kYXRhKTtcbiAgICB9XG4gICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6ICdhcHBseV9wYXRjaCBpbnB1dCBtdXN0IGluY2x1ZGUgYW4gb3BlcmF0aW9uLicgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIG9wZXJhdGlvbnMgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlRnJlZWZvcm1QYXRjaChyYXdQYXRjaCkge1xuICAgIGNvbnN0IGxpbmVzID0gcmF3UGF0Y2guc3BsaXQoL1xccj9cXG4vKTtcbiAgICBpZiAobGluZXMuYXQoLTEpID09PSAnJykge1xuICAgICAgICBsaW5lcy5wb3AoKTtcbiAgICB9XG4gICAgaWYgKGxpbmVzWzBdICE9PSBCRUdJTl9QQVRDSCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGBhcHBseV9wYXRjaCBpbnB1dCBtdXN0IHN0YXJ0IHdpdGggXCIke0JFR0lOX1BBVENIfVwiLmAsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChsaW5lcy5sZW5ndGggPCAyIHx8IGxpbmVzLmF0KC0xKSAhPT0gRU5EX1BBVENIKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogYGFwcGx5X3BhdGNoIGlucHV0IG11c3QgZW5kIHdpdGggXCIke0VORF9QQVRDSH1cIi5gLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBvcGVyYXRpb25zID0gW107XG4gICAgbGV0IGluZGV4ID0gMTtcbiAgICB3aGlsZSAoaW5kZXggPCBsaW5lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpbmRleF07XG4gICAgICAgIGxldCBwYXJzZWQ7XG4gICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoQUREX0ZJTEUpKSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBwYXJzZUFkZEZpbGVQYXRjaChsaW5lcywgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChERUxFVEVfRklMRSkpIHtcbiAgICAgICAgICAgIHBhcnNlZCA9IHBhcnNlRGVsZXRlRmlsZVBhdGNoKGxpbmVzLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKFVQREFURV9GSUxFKSkge1xuICAgICAgICAgICAgcGFyc2VkID0gcGFyc2VVcGRhdGVGaWxlUGF0Y2gobGluZXMsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBgSW52YWxpZCBhcHBseV9wYXRjaCBmaWxlIG9wZXJhdGlvbiBoZWFkZXI6ICR7bGluZX1gLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2Vycm9yJyBpbiBwYXJzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IHBhcnNlZC5lcnJvciB9O1xuICAgICAgICB9XG4gICAgICAgIG9wZXJhdGlvbnMucHVzaChwYXJzZWQub3BlcmF0aW9uKTtcbiAgICAgICAgaW5kZXggPSBwYXJzZWQubmV4dEluZGV4O1xuICAgIH1cbiAgICBpZiAob3BlcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiAnYXBwbHlfcGF0Y2ggaW5wdXQgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBmaWxlIG9wZXJhdGlvbi4nLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBvazogdHJ1ZSwgb3BlcmF0aW9ucyB9O1xufVxuZnVuY3Rpb24gcGFyc2VBZGRGaWxlUGF0Y2gobGluZXMsIGluZGV4KSB7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlUGF0Y2hIZWFkZXIobGluZXNbaW5kZXhdLCBBRERfRklMRSk7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgTWlzc2luZyBwYXRoIGluIGFwcGx5X3BhdGNoIGhlYWRlcjogJHtsaW5lc1tpbmRleF19YCB9O1xuICAgIH1cbiAgICBpbmRleCArPSAxO1xuICAgIGNvbnN0IGRpZmZMaW5lcyA9IFtdO1xuICAgIHdoaWxlIChpbmRleCA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgIWlzRmlsZU9wZXJhdGlvbkhlYWRlcihsaW5lc1tpbmRleF0pKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpbmRleF07XG4gICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKCcrJykpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBgSW52YWxpZCBBZGQgRmlsZSBsaW5lOiAke2xpbmV9YCB9O1xuICAgICAgICB9XG4gICAgICAgIGRpZmZMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICBpbmRleCArPSAxO1xuICAgIH1cbiAgICBpZiAoZGlmZkxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3I6IGBBZGQgRmlsZSBwYXRjaCBmb3IgJHtwYXRofSBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lICsgbGluZS5gLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBvcGVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICdjcmVhdGVfZmlsZScsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgZGlmZjogam9pbkRpZmYoZGlmZkxpbmVzKSxcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dEluZGV4OiBpbmRleCxcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VEZWxldGVGaWxlUGF0Y2gobGluZXMsIGluZGV4KSB7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlUGF0Y2hIZWFkZXIobGluZXNbaW5kZXhdLCBERUxFVEVfRklMRSk7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgTWlzc2luZyBwYXRoIGluIGFwcGx5X3BhdGNoIGhlYWRlcjogJHtsaW5lc1tpbmRleF19YCB9O1xuICAgIH1cbiAgICBpbmRleCArPSAxO1xuICAgIGlmIChpbmRleCA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgIWlzRmlsZU9wZXJhdGlvbkhlYWRlcihsaW5lc1tpbmRleF0pKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgRGVsZXRlIEZpbGUgcGF0Y2ggZm9yICR7cGF0aH0gbXVzdCBub3QgaW5jbHVkZSBhIGRpZmYuYCB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBvcGVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICdkZWxldGVfZmlsZScsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICB9LFxuICAgICAgICBuZXh0SW5kZXg6IGluZGV4LFxuICAgIH07XG59XG5mdW5jdGlvbiBwYXJzZVVwZGF0ZUZpbGVQYXRjaChsaW5lcywgaW5kZXgpIHtcbiAgICBjb25zdCBwYXRoID0gcGFyc2VQYXRjaEhlYWRlcihsaW5lc1tpbmRleF0sIFVQREFURV9GSUxFKTtcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGBNaXNzaW5nIHBhdGggaW4gYXBwbHlfcGF0Y2ggaGVhZGVyOiAke2xpbmVzW2luZGV4XX1gIH07XG4gICAgfVxuICAgIGluZGV4ICs9IDE7XG4gICAgbGV0IG1vdmVUbztcbiAgICBpZiAoaW5kZXggPCBsaW5lcy5sZW5ndGggLSAxICYmIGxpbmVzW2luZGV4XS5zdGFydHNXaXRoKE1PVkVfVE8pKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZE1vdmVUbyA9IHBhcnNlUGF0Y2hIZWFkZXIobGluZXNbaW5kZXhdLCBNT1ZFX1RPKTtcbiAgICAgICAgaWYgKCFwYXJzZWRNb3ZlVG8pIHtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBgTWlzc2luZyBwYXRoIGluIGFwcGx5X3BhdGNoIGhlYWRlcjogJHtsaW5lc1tpbmRleF19YCB9O1xuICAgICAgICB9XG4gICAgICAgIG1vdmVUbyA9IHBhcnNlZE1vdmVUbztcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICB9XG4gICAgY29uc3QgZGlmZkxpbmVzID0gW107XG4gICAgd2hpbGUgKGluZGV4IDwgbGluZXMubGVuZ3RoIC0gMSAmJiAhaXNGaWxlT3BlcmF0aW9uSGVhZGVyKGxpbmVzW2luZGV4XSkpIHtcbiAgICAgICAgZGlmZkxpbmVzLnB1c2gobGluZXNbaW5kZXhdKTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICB9XG4gICAgaWYgKGRpZmZMaW5lcy5sZW5ndGggPT09IDAgJiYgIW1vdmVUbykge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYFVwZGF0ZSBGaWxlIHBhdGNoIGZvciAke3BhdGh9IG11c3QgaW5jbHVkZSBhIGh1bmsuYCB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBvcGVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICd1cGRhdGVfZmlsZScsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgZGlmZjogZGlmZkxpbmVzLmxlbmd0aCA+IDAgPyBqb2luRGlmZihkaWZmTGluZXMpIDogJycsXG4gICAgICAgICAgICAuLi4obW92ZVRvID8geyBtb3ZlVG8gfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dEluZGV4OiBpbmRleCxcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VQYXRjaEhlYWRlcihsaW5lLCBwcmVmaXgpIHtcbiAgICBjb25zdCBwYXRoID0gbGluZS5zbGljZShwcmVmaXgubGVuZ3RoKS50cmltKCk7XG4gICAgcmV0dXJuIHBhdGggPyBwYXRoIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRmlsZU9wZXJhdGlvbkhlYWRlcihsaW5lKSB7XG4gICAgcmV0dXJuIChsaW5lLnN0YXJ0c1dpdGgoQUREX0ZJTEUpIHx8XG4gICAgICAgIGxpbmUuc3RhcnRzV2l0aChERUxFVEVfRklMRSkgfHxcbiAgICAgICAgbGluZS5zdGFydHNXaXRoKFVQREFURV9GSUxFKSk7XG59XG5mdW5jdGlvbiBqb2luRGlmZihsaW5lcykge1xuICAgIHJldHVybiBgJHtsaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xufVxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYXRjaE9wZXJhdGlvbihlZGl0b3IsIG9wZXJhdGlvbiwgcnVuQ29udGV4dCkge1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgICAgc3dpdGNoIChvcGVyYXRpb24udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY3JlYXRlX2ZpbGUnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGVkaXRvci5jcmVhdGVGaWxlKG9wZXJhdGlvbiwgeyBydW5Db250ZXh0IH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndXBkYXRlX2ZpbGUnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGVkaXRvci51cGRhdGVGaWxlKG9wZXJhdGlvbiwgeyBydW5Db250ZXh0IH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGVsZXRlX2ZpbGUnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGVkaXRvci5kZWxldGVGaWxlKG9wZXJhdGlvbiwgeyBydW5Db250ZXh0IH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1Vuc3VwcG9ydGVkIGFwcGx5X3BhdGNoIG9wZXJhdGlvbi4nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gYEZhaWxlZCB0byBhcHBseSBwYXRjaDogJHt0b0Vycm9yTWVzc2FnZShlcnJvcil9YDtcbiAgICB9XG4gICAgaWYgKHJlc3VsdD8uc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgICAgICByZXR1cm4gcmVzdWx0Lm91dHB1dCA/IGBQYXRjaCBmYWlsZWQ6ICR7cmVzdWx0Lm91dHB1dH1gIDogJ1BhdGNoIGZhaWxlZC4nO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0Py5vdXRwdXQgPz8gJ1BhdGNoIGFwcGxpZWQuJztcbn1cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5UGF0Y2hPcGVyYXRpb25zKGVkaXRvciwgb3BlcmF0aW9ucywgcnVuQ29udGV4dCkge1xuICAgIGNvbnN0IG91dHB1dHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGFwcGx5UGF0Y2hPcGVyYXRpb24oZWRpdG9yLCBvcGVyYXRpb24sIHJ1bkNvbnRleHQpO1xuICAgICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgICAgICBvdXRwdXRzLnB1c2gob3V0cHV0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0cy5qb2luKCdcXG4nKSB8fCAnUGF0Y2ggYXBwbGllZC4nO1xufVxuZnVuY3Rpb24gYXBwbHlQYXRjaEZ1bmN0aW9uVG9vbChlZGl0b3IpIHtcbiAgICBjb25zdCBmYWxsYmFja1Rvb2wgPSB7XG4gICAgICAgIHR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgIG5hbWU6ICdhcHBseV9wYXRjaCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQXBwbGllcyBhIGNyZWF0ZSwgdXBkYXRlLCBtb3ZlLCBvciBkZWxldGUgZmlsZSBwYXRjaCBpbiB0aGUgc2FuZGJveCB3b3Jrc3BhY2UuIEFjY2VwdHMgYSBmcmVlZm9ybSBwYXRjaCBzdHJpbmcgb3Igc3RydWN0dXJlZCBhcHBseV9wYXRjaCBvcGVyYXRpb25zLicsXG4gICAgICAgIHBhcmFtZXRlcnM6IGFwcGx5UGF0Y2hGdW5jdGlvblBhcmFtZXRlcnMsXG4gICAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICAgIGRlZmVyTG9hZGluZzogZmFsc2UsXG4gICAgICAgIG5lZWRzQXBwcm92YWw6IGFzeW5jICgpID0+IGZhbHNlLFxuICAgICAgICBpc0VuYWJsZWQ6IGFzeW5jICgpID0+IHRydWUsXG4gICAgICAgIGludm9rZTogYXN5bmMgKHJ1bkNvbnRleHQsIGlucHV0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUFwcGx5UGF0Y2hJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZC5vaykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWQuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXBwbHlQYXRjaE9wZXJhdGlvbnMoZWRpdG9yLCBwYXJzZWQub3BlcmF0aW9ucywgcnVuQ29udGV4dCk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gZmFsbGJhY2tUb29sO1xufVxuY2xhc3MgRmlsZXN5c3RlbUNhcGFiaWxpdHkgZXh0ZW5kcyBDYXBhYmlsaXR5IHtcbiAgICB0eXBlID0gJ2ZpbGVzeXN0ZW0nO1xuICAgIGNvbmZpZ3VyZVRvb2xzO1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZVRvb2xzID0gYXJncy5jb25maWd1cmVUb29scztcbiAgICB9XG4gICAgdG9vbHMoKSB7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSByZXF1aXJlQm91bmRTZXNzaW9uKHRoaXMudHlwZSwgdGhpcy5fc2Vzc2lvbik7XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IHNlc3Npb24uY3JlYXRlRWRpdG9yPy4odGhpcy5fcnVuQXMpO1xuICAgICAgICBpZiAoIWVkaXRvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcignRmlsZXN5c3RlbSBzYW5kYm94IHNlc3Npb25zIG11c3QgcHJvdmlkZSBjcmVhdGVFZGl0b3IoKS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b29scyA9IFtdO1xuICAgICAgICBjb25zdCB2aWV3SW1hZ2UgPSBhc3luYyAocGF0aCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzZXNzaW9uLnZpZXdJbWFnZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ0ZpbGVzeXN0ZW0gc2FuZGJveCBzZXNzaW9ucyBtdXN0IHByb3ZpZGUgdmlld0ltYWdlKCkuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB3aXRoU2FuZGJveFNwYW4oJ3NhbmRib3gudmlld19pbWFnZScsIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcnVuX2FzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICB9LCBhc3luYyAoKSA9PiBhd2FpdCBzZXNzaW9uLnZpZXdJbWFnZSh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHJ1bkFzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyVmlld0ltYWdlRXJyb3IocGF0aCwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc3VwcG9ydHNTdHJ1Y3R1cmVkVG9vbE91dHB1dFRyYW5zcG9ydCh0aGlzLl9tb2RlbEluc3RhbmNlKSkge1xuICAgICAgICAgICAgdG9vbHMucHVzaCh0b29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndmlld19pbWFnZScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSZXR1cm5zIGFuIGltYWdlIG91dHB1dCBmcm9tIGEgbG9jYWwgcGF0aCBpbiB0aGUgc2FuZGJveCB3b3Jrc3BhY2UuJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ0xvY2FsIGZpbGVzeXN0ZW0gcGF0aCB0byBhbiBpbWFnZSBmaWxlJyksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCwgfSkgPT4gYXdhaXQgdmlld0ltYWdlKHBhdGgpLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdG9vbHMucHVzaCh0b29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndmlld19pbWFnZScsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSZXR1cm5zIGFuIGltYWdlIGZyb20gYSBsb2NhbCBwYXRoIGluIHRoZSBzYW5kYm94IHdvcmtzcGFjZSBhcyBhIGRhdGEgVVJMIG9yIHJlZmVyZW5jZSBzdHJpbmcuJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHouc3RyaW5nKCkuZGVzY3JpYmUoJ0xvY2FsIGZpbGVzeXN0ZW0gcGF0aCB0byBhbiBpbWFnZSBmaWxlJyksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGF0aCB9KSA9PiByZW5kZXJJbWFnZUZvclRleHRUcmFuc3BvcnQoYXdhaXQgdmlld0ltYWdlKHBhdGgpKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VwcG9ydHNBcHBseVBhdGNoVHJhbnNwb3J0KHRoaXMuX21vZGVsSW5zdGFuY2UpKSB7XG4gICAgICAgICAgICB0b29scy5wdXNoKGFwcGx5UGF0Y2hUb29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnYXBwbHlfcGF0Y2gnLFxuICAgICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRvb2xzLnB1c2goYXBwbHlQYXRjaEZ1bmN0aW9uVG9vbChlZGl0b3IpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmVUb29scyA/IHRoaXMuY29uZmlndXJlVG9vbHMoWy4uLnRvb2xzXSkgOiB0b29scztcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZmlsZXN5c3RlbShhcmdzID0ge30pIHtcbiAgICByZXR1cm4gbmV3IEZpbGVzeXN0ZW1DYXBhYmlsaXR5KGFyZ3MpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsZXN5c3RlbS5tanMubWFwIiwiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBVc2VyRXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzLm1qc1wiO1xuaW1wb3J0IHsgdG9vbCB9IGZyb20gXCIuLi8uLi90b29sLm1qc1wiO1xuaW1wb3J0IHsgd2l0aFNhbmRib3hTcGFuIH0gZnJvbSBcIi4uL3J1bnRpbWUvc3BhbnMubWpzXCI7XG5pbXBvcnQgeyBDYXBhYmlsaXR5LCByZXF1aXJlQm91bmRTZXNzaW9uLCB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5jb25zdCBERUZBVUxUX0VYRUNfWUlFTERfVElNRV9NUyA9IDEwXzAwMDtcbmNvbnN0IERFRkFVTFRfV1JJVEVfU1RESU5fWUlFTERfVElNRV9NUyA9IDI1MDtcbmNvbnN0IFNIRUxMX0lOU1RSVUNUSU9OUyA9IFtcbiAgICAnV2hlbiB1c2luZyB0aGUgc2hlbGw6JyxcbiAgICAnLSBVc2UgYGV4ZWNfY29tbWFuZGAgZm9yIHNoZWxsIGV4ZWN1dGlvbi4nLFxuICAgICctIElmIGF2YWlsYWJsZSwgdXNlIGB3cml0ZV9zdGRpbmAgdG8gaW50ZXJhY3Qgd2l0aCBvciBwb2xsIHJ1bm5pbmcgc2Vzc2lvbnMuJyxcbiAgICAnLSBUbyBpbnRlcnJ1cHQgYSBsb25nLXJ1bm5pbmcgcHJvY2VzcyB2aWEgYHdyaXRlX3N0ZGluYCwgc3RhcnQgaXQgd2l0aCBgdHR5PXRydWVgIGFuZCBzZW5kIEN0cmwtQyAoYFxcXFx1MDAwM2ApLicsXG4gICAgJy0gUHJlZmVyIGByZ2AgYW5kIGByZyAtLWZpbGVzYCBmb3IgdGV4dC9maWxlIGRpc2NvdmVyeSB3aGVuIGF2YWlsYWJsZS4nLFxuICAgICctIEF2b2lkIHVzaW5nIFB5dGhvbiBzY3JpcHRzIGp1c3QgdG8gcHJpbnQgbGFyZ2UgZmlsZSBjaHVua3MuJyxcbl0uam9pbignXFxuJyk7XG5jbGFzcyBTaGVsbENhcGFiaWxpdHkgZXh0ZW5kcyBDYXBhYmlsaXR5IHtcbiAgICB0eXBlID0gJ3NoZWxsJztcbiAgICBjb25maWd1cmVUb29scztcbiAgICBjb25zdHJ1Y3RvcihhcmdzID0ge30pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmVUb29scyA9IGFyZ3MuY29uZmlndXJlVG9vbHM7XG4gICAgfVxuICAgIHRvb2xzKCkge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gcmVxdWlyZUJvdW5kU2Vzc2lvbih0aGlzLnR5cGUsIHRoaXMuX3Nlc3Npb24pO1xuICAgICAgICBpZiAoIXNlc3Npb24uZXhlY0NvbW1hbmQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ1NoZWxsIHNhbmRib3ggc2Vzc2lvbnMgbXVzdCBwcm92aWRlIGV4ZWNDb21tYW5kKCkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9vbHMgPSBbXG4gICAgICAgICAgICB0b29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZXhlY19jb21tYW5kJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1J1bnMgYSBjb21tYW5kIGluIGEgUFRZLCByZXR1cm5pbmcgb3V0cHV0IG9yIGEgc2Vzc2lvbiBJRCBmb3Igb25nb2luZyBpbnRlcmFjdGlvbi4nLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHoub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgY21kOiB6LnN0cmluZygpLm1pbigxKS5kZXNjcmliZSgnU2hlbGwgY29tbWFuZCB0byBleGVjdXRlLicpLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZGlyOiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ09wdGlvbmFsIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHJ1biB0aGUgY29tbWFuZCBpbjsgZGVmYXVsdHMgdG8gdGhlIHR1cm4gY3dkLicpLFxuICAgICAgICAgICAgICAgICAgICBzaGVsbDogelxuICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKFwiU2hlbGwgYmluYXJ5IHRvIGxhdW5jaC4gRGVmYXVsdHMgdG8gdGhlIHVzZXIncyBkZWZhdWx0IHNoZWxsLlwiKSxcbiAgICAgICAgICAgICAgICAgICAgbG9naW46IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ1doZXRoZXIgdG8gcnVuIHRoZSBzaGVsbCB3aXRoIC1sLy1pIHNlbWFudGljcy4gRGVmYXVsdHMgdG8gdHJ1ZS4nKSxcbiAgICAgICAgICAgICAgICAgICAgdHR5OiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnV2hldGhlciB0byBhbGxvY2F0ZSBhIFRUWSBmb3IgdGhlIGNvbW1hbmQuIERlZmF1bHRzIHRvIGZhbHNlIChwbGFpbiBwaXBlcyk7IHNldCB0byB0cnVlIHRvIG9wZW4gYSBQVFkgYW5kIGFjY2VzcyBUVFkgcHJvY2Vzcy4nKSxcbiAgICAgICAgICAgICAgICAgICAgeWllbGRfdGltZV9tczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5taW4oMClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0KERFRkFVTFRfRVhFQ19ZSUVMRF9USU1FX01TKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdIb3cgbG9uZyB0byB3YWl0IChpbiBtaWxsaXNlY29uZHMpIGZvciBvdXRwdXQgYmVmb3JlIHlpZWxkaW5nLicpLFxuICAgICAgICAgICAgICAgICAgICBtYXhfb3V0cHV0X3Rva2VuczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5taW4oMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ01heGltdW0gbnVtYmVyIG9mIHRva2VucyB0byByZXR1cm4uIEV4Y2VzcyBvdXRwdXQgd2lsbCBiZSB0cnVuY2F0ZWQuJyksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgY21kLCB3b3JrZGlyLCBzaGVsbCwgbG9naW4sIHR0eSwgeWllbGRfdGltZV9tcywgbWF4X291dHB1dF90b2tlbnMsIH0pID0+IGF3YWl0IHdpdGhTYW5kYm94U3Bhbignc2FuZGJveC5leGVjJywge1xuICAgICAgICAgICAgICAgICAgICBjbWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtkaXIsXG4gICAgICAgICAgICAgICAgICAgIHNoZWxsLFxuICAgICAgICAgICAgICAgICAgICBsb2dpbixcbiAgICAgICAgICAgICAgICAgICAgdHR5LFxuICAgICAgICAgICAgICAgICAgICBydW5fYXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgICAgIH0sIGFzeW5jICgpID0+IGF3YWl0IHNlc3Npb24uZXhlY0NvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICBjbWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtkaXIsXG4gICAgICAgICAgICAgICAgICAgIHNoZWxsLFxuICAgICAgICAgICAgICAgICAgICBsb2dpbixcbiAgICAgICAgICAgICAgICAgICAgdHR5LFxuICAgICAgICAgICAgICAgICAgICB5aWVsZFRpbWVNczogeWllbGRfdGltZV9tcyxcbiAgICAgICAgICAgICAgICAgICAgbWF4T3V0cHV0VG9rZW5zOiBtYXhfb3V0cHV0X3Rva2VucyxcbiAgICAgICAgICAgICAgICAgICAgcnVuQXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuICAgICAgICBpZiAoc2Vzc2lvbi5zdXBwb3J0c1B0eT8uKCkgJiYgc2Vzc2lvbi53cml0ZVN0ZGluKSB7XG4gICAgICAgICAgICB0b29scy5wdXNoKHRvb2woe1xuICAgICAgICAgICAgICAgIG5hbWU6ICd3cml0ZV9zdGRpbicsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXcml0ZXMgY2hhcmFjdGVycyB0byBhbiBleGlzdGluZyB1bmlmaWVkIGV4ZWMgc2Vzc2lvbiBhbmQgcmV0dXJucyByZWNlbnQgb3V0cHV0LicsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkOiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5pbnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdJZGVudGlmaWVyIG9mIHRoZSBydW5uaW5nIHVuaWZpZWQgZXhlYyBzZXNzaW9uLicpLFxuICAgICAgICAgICAgICAgICAgICBjaGFyczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCgnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnQnl0ZXMgdG8gd3JpdGUgdG8gc3RkaW4gKG1heSBiZSBlbXB0eSB0byBwb2xsKS4nKSxcbiAgICAgICAgICAgICAgICAgICAgeWllbGRfdGltZV9tczogelxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5taW4oMClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0KERFRkFVTFRfV1JJVEVfU1RESU5fWUlFTERfVElNRV9NUylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnSG93IGxvbmcgdG8gd2FpdCAoaW4gbWlsbGlzZWNvbmRzKSBmb3Igb3V0cHV0IGJlZm9yZSB5aWVsZGluZy4nKSxcbiAgICAgICAgICAgICAgICAgICAgbWF4X291dHB1dF90b2tlbnM6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmludCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWluKDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdNYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdG8gcmV0dXJuLiBFeGNlc3Mgb3V0cHV0IHdpbGwgYmUgdHJ1bmNhdGVkLicpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHNlc3Npb25faWQsIGNoYXJzLCB5aWVsZF90aW1lX21zLCBtYXhfb3V0cHV0X3Rva2VucywgfSkgPT4gYXdhaXQgd2l0aFNhbmRib3hTcGFuKCdzYW5kYm94LndyaXRlX3N0ZGluJywge1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkLFxuICAgICAgICAgICAgICAgIH0sIGFzeW5jICgpID0+IGF3YWl0IHNlc3Npb24ud3JpdGVTdGRpbih7XG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbl9pZCxcbiAgICAgICAgICAgICAgICAgICAgY2hhcnMsXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkVGltZU1zOiB5aWVsZF90aW1lX21zLFxuICAgICAgICAgICAgICAgICAgICBtYXhPdXRwdXRUb2tlbnM6IG1heF9vdXRwdXRfdG9rZW5zLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmVUb29scyA/IHRoaXMuY29uZmlndXJlVG9vbHMoWy4uLnRvb2xzXSkgOiB0b29scztcbiAgICB9XG4gICAgaW5zdHJ1Y3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gU0hFTExfSU5TVFJVQ1RJT05TO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbChhcmdzID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFNoZWxsQ2FwYWJpbGl0eShhcmdzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNoZWxsLm1qcy5tYXAiLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IHRvb2wgfSBmcm9tIFwiLi4vLi4vdG9vbC5tanNcIjtcbmltcG9ydCB7IGRpciwgZmlsZSwgaXNEaXIsIGlzRGlyZWN0b3J5TGlrZUVudHJ5LCB9IGZyb20gXCIuLi9lbnRyaWVzL2luZGV4Lm1qc1wiO1xuaW1wb3J0IHsgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5tanNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aCB9IGZyb20gXCIuLi9tYW5pZmVzdC5tanNcIjtcbmltcG9ydCB7IHByb21wdCB9IGZyb20gXCIuLi9ydW50aW1lL3Byb21wdHMubWpzXCI7XG5pbXBvcnQgeyBDYXBhYmlsaXR5LCByZXF1aXJlQm91bmRTZXNzaW9uIH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmNsYXNzIFNraWxsc0NhcGFiaWxpdHkgZXh0ZW5kcyBDYXBhYmlsaXR5IHtcbiAgICB0eXBlID0gJ3NraWxscyc7XG4gICAgc2tpbGxzO1xuICAgIGZyb207XG4gICAgbGF6eUZyb207XG4gICAgaW5kZXg7XG4gICAgc2tpbGxzUGF0aDtcbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2tpbGxzID0gYXJncy5za2lsbHMgPz8gW107XG4gICAgICAgIHRoaXMuZnJvbSA9IGFyZ3MuZnJvbTtcbiAgICAgICAgdGhpcy5sYXp5RnJvbSA9IGFyZ3MubGF6eUZyb207XG4gICAgICAgIHRoaXMuaW5kZXggPSBhcmdzLmluZGV4O1xuICAgICAgICB0aGlzLnNraWxsc1BhdGggPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgoYXJncy5za2lsbHNQYXRoID8/ICcuYWdlbnRzJyk7XG4gICAgICAgIHZhbGlkYXRlU2tpbGxzQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICB9XG4gICAgdG9vbHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXp5RnJvbSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSByZXF1aXJlQm91bmRTZXNzaW9uKHRoaXMudHlwZSwgdGhpcy5fc2Vzc2lvbik7XG4gICAgICAgIGlmICghc2Vzc2lvbi5wYXRoRXhpc3RzIHx8ICFzZXNzaW9uLm1hdGVyaWFsaXplRW50cnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoJ1NraWxscyBzYW5kYm94IHNlc3Npb25zIG11c3QgcHJvdmlkZSBwYXRoRXhpc3RzKCkgYW5kIG1hdGVyaWFsaXplRW50cnkoKS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdG9vbCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2xvYWRfc2tpbGwnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTG9hZCBhIHNpbmdsZSBsYXppbHkgY29uZmlndXJlZCBza2lsbCBpbnRvIHRoZSBzYW5kYm94IHNvIGl0cyBTS0lMTC5tZCwgc2NyaXB0cywgcmVmZXJlbmNlcywgYW5kIGFzc2V0cyBjYW4gYmUgcmVhZCBmcm9tIHRoZSB3b3Jrc3BhY2UuJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHNraWxsX25hbWU6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1pbigxKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdOYW1lIG9mIHRoZSBsYXppbHkgY29uZmlndXJlZCBza2lsbCB0byBtYXRlcmlhbGl6ZS4nKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBleGVjdXRlOiBhc3luYyAoeyBza2lsbF9uYW1lLCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcmVzb2x2ZUxhenlTa2lsbE1hdGNoKHRoaXMsIHNraWxsX25hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGl2ZVNraWxsUGF0aCA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChtYXRjaC5wYXRoID8/IG1hdGNoLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblBhdGggPSBqb2luUmVsYXRpdmVQYXRocyh0aGlzLnNraWxsc1BhdGgsIHJlbGF0aXZlU2tpbGxQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tpbGxNYXJrZG93blBhdGggPSBqb2luUmVsYXRpdmVQYXRocyhkZXN0aW5hdGlvblBhdGgsICdTS0lMTC5tZCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXdhaXQgc2Vzc2lvbi5wYXRoRXhpc3RzKHNraWxsTWFya2Rvd25QYXRoLCB0aGlzLl9ydW5BcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnYWxyZWFkeV9sb2FkZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraWxsX25hbWU6IG1hdGNoLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZXNzaW9uLm1hdGVyaWFsaXplRW50cnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnk6IHJlc29sdmVMYXp5U2tpbGxFbnRyeSh0aGlzLmxhenlGcm9tLnNvdXJjZSwgcmVsYXRpdmVTa2lsbFBhdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuQXM6IHRoaXMuX3J1bkFzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ2xvYWRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lsbF9uYW1lOiBtYXRjaC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZGVzdGluYXRpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgcHJvY2Vzc01hbmlmZXN0KG1hbmlmZXN0KSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUGF0aHMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG1hbmlmZXN0LmVudHJpZXMpLm1hcCgocGF0aCkgPT4gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHBhdGgpKSk7XG4gICAgICAgIGlmICh0aGlzLmxhenlGcm9tKSB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGFwcyA9IFsuLi5leGlzdGluZ1BhdGhzXVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhdGgpID0+IHBhdGhzT3ZlcmxhcChwYXRoLCB0aGlzLnNraWxsc1BhdGgpKVxuICAgICAgICAgICAgICAgIC5zb3J0KCk7XG4gICAgICAgICAgICBpZiAob3ZlcmxhcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYHNraWxscyBsYXp5RnJvbSBwYXRoIG92ZXJsYXBzIGV4aXN0aW5nIG1hbmlmZXN0IGVudHJpZXM6ICR7b3ZlcmxhcHMuam9pbignLCAnKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mcm9tKSB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGFwID0gWy4uLmV4aXN0aW5nUGF0aHNdLmZpbmQoKHBhdGgpID0+IHBhdGhzT3ZlcmxhcChwYXRoLCB0aGlzLnNraWxsc1BhdGgpKTtcbiAgICAgICAgICAgIGlmIChvdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgc2tpbGxzIHBhdGggb3ZlcmxhcHMgZXhpc3RpbmcgbWFuaWZlc3QgZW50cmllczogJHtvdmVybGFwfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWFuaWZlc3QuZW50cmllc1t0aGlzLnNraWxsc1BhdGhdID0gdGhpcy5mcm9tO1xuICAgICAgICAgICAgcmV0dXJuIG1hbmlmZXN0O1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgc2tpbGwgb2YgdGhpcy5za2lsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNraWxsUGF0aCA9IGpvaW5SZWxhdGl2ZVBhdGhzKHRoaXMuc2tpbGxzUGF0aCwgc2tpbGwubmFtZSk7XG4gICAgICAgICAgICBjb25zdCBvdmVybGFwID0gWy4uLmV4aXN0aW5nUGF0aHNdLmZpbmQoKHBhdGgpID0+IHBhdGhzT3ZlcmxhcChwYXRoLCBza2lsbFBhdGgpKTtcbiAgICAgICAgICAgIGlmIChvdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgc2tpbGwgcGF0aCBvdmVybGFwcyBleGlzdGluZyBtYW5pZmVzdCBlbnRyaWVzOiAke3NraWxsUGF0aH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hbmlmZXN0LmVudHJpZXNbc2tpbGxQYXRoXSA9IHJlbmRlclNraWxsRGVzY3JpcHRvcihza2lsbCk7XG4gICAgICAgICAgICBleGlzdGluZ1BhdGhzLmFkZChza2lsbFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICB9XG4gICAgYXN5bmMgaW5zdHJ1Y3Rpb25zKG1hbmlmZXN0KSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gcmVzb2x2ZVNraWxsc01ldGFkYXRhKHRoaXMsIGF3YWl0IHRoaXMucmVzb2x2ZVJ1bnRpbWVNZXRhZGF0YShtYW5pZmVzdCkpO1xuICAgICAgICBpZiAobWV0YWRhdGEubGVuZ3RoID09PSAwICYmIHRoaXMuZnJvbSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlbmRlclNraWxsc0Rpc2NvdmVyeUluc3RydWN0aW9ucyh0aGlzLnNraWxsc1BhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZW5kZXJTa2lsbHNJbnN0cnVjdGlvbnMoe1xuICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICBsYXp5OiBCb29sZWFuKHRoaXMubGF6eUZyb20pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgcmVzb2x2ZVJ1bnRpbWVNZXRhZGF0YShfbWFuaWZlc3QpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZyb20gfHwgIXRoaXMuX3Nlc3Npb24/Lmxpc3REaXIgfHwgIXRoaXMuX3Nlc3Npb24ucmVhZEZpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZW50cmllcztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVudHJpZXMgPSBhd2FpdCB0aGlzLl9zZXNzaW9uLmxpc3REaXIoe1xuICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMuc2tpbGxzUGF0aCxcbiAgICAgICAgICAgICAgICBydW5BczogdGhpcy5fcnVuQXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkudHlwZSAhPT0gJ2RpcicpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb250ZW50O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYXdhaXQgdGhpcy5fc2Vzc2lvbi5yZWFkRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGpvaW5SZWxhdGl2ZVBhdGhzKGVudHJ5LnBhdGgsICdTS0lMTC5tZCcpLFxuICAgICAgICAgICAgICAgICAgICBydW5BczogdGhpcy5fcnVuQXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtYXJrZG93biA9IHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gY29udGVudFxuICAgICAgICAgICAgICAgIDogbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnQpO1xuICAgICAgICAgICAgY29uc3QgZnJvbnRtYXR0ZXIgPSBwYXJzZVNraWxsRnJvbnRtYXR0ZXIobWFya2Rvd24pO1xuICAgICAgICAgICAgbWV0YWRhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogZnJvbnRtYXR0ZXIubmFtZSA/PyBlbnRyeS5uYW1lLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBmcm9udG1hdHRlci5kZXNjcmlwdGlvbiA/PyAnTm8gZGVzY3JpcHRpb24gcHJvdmlkZWQuJyxcbiAgICAgICAgICAgICAgICBwYXRoOiBlbnRyeS5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBza2lsbHMoYXJncykge1xuICAgIHJldHVybiBuZXcgU2tpbGxzQ2FwYWJpbGl0eShhcmdzKTtcbn1cbmNvbnN0IFNLSUxMU19TRUNUSU9OX0lOVFJPID0gcHJvbXB0IGBcbkEgc2tpbGwgaXMgYSBzZXQgb2YgbG9jYWwgaW5zdHJ1Y3Rpb25zIHRvIGZvbGxvdyB0aGF0IGlzIHN0b3JlZCBpbiBhIFxcYFNLSUxMLm1kXFxgIGZpbGUuIEJlbG93IGlzIHRoZSBsaXN0IG9mIHNraWxscyB0aGF0IGNhbiBiZSB1c2VkLiBFYWNoIGVudHJ5IGluY2x1ZGVzIGEgbmFtZSwgZGVzY3JpcHRpb24sIGFuZCBmaWxlIHBhdGggc28geW91IGNhbiBvcGVuIHRoZSBzb3VyY2UgZm9yIGZ1bGwgaW5zdHJ1Y3Rpb25zIHdoZW4gdXNpbmcgYSBzcGVjaWZpYyBza2lsbC5cbmA7XG5jb25zdCBIT1dfVE9fVVNFX1NLSUxMU19TRUNUSU9OID0gcHJvbXB0IGBcbiMjIyBIb3cgdG8gdXNlIHNraWxsc1xuLSBEaXNjb3Zlcnk6IFRoZSBsaXN0IGFib3ZlIGlzIHRoZSBza2lsbHMgYXZhaWxhYmxlIGluIHRoaXMgc2Vzc2lvbiAobmFtZSArIGRlc2NyaXB0aW9uICsgZmlsZSBwYXRoKS4gU2tpbGwgYm9kaWVzIGxpdmUgb24gZGlzayBhdCB0aGUgbGlzdGVkIHBhdGhzLlxuLSBUcmlnZ2VyIHJ1bGVzOiBJZiB0aGUgdXNlciBuYW1lcyBhIHNraWxsICh3aXRoIFxcYCRTa2lsbE5hbWVcXGAgb3IgcGxhaW4gdGV4dCkgT1IgdGhlIHRhc2sgY2xlYXJseSBtYXRjaGVzIGEgc2tpbGwncyBkZXNjcmlwdGlvbiBzaG93biBhYm92ZSwgeW91IG11c3QgdXNlIHRoYXQgc2tpbGwgZm9yIHRoYXQgdHVybi4gTXVsdGlwbGUgbWVudGlvbnMgbWVhbiB1c2UgdGhlbSBhbGwuIERvIG5vdCBjYXJyeSBza2lsbHMgYWNyb3NzIHR1cm5zIHVubGVzcyByZS1tZW50aW9uZWQuXG4tIE1pc3NpbmcvYmxvY2tlZDogSWYgYSBuYW1lZCBza2lsbCBpc24ndCBpbiB0aGUgbGlzdCBvciB0aGUgcGF0aCBjYW4ndCBiZSByZWFkLCBzYXkgc28gYnJpZWZseSBhbmQgY29udGludWUgd2l0aCB0aGUgYmVzdCBmYWxsYmFjay5cbi0gSG93IHRvIHVzZSBhIHNraWxsIChwcm9ncmVzc2l2ZSBkaXNjbG9zdXJlKTpcbiAgMSkgQWZ0ZXIgZGVjaWRpbmcgdG8gdXNlIGEgc2tpbGwsIG9wZW4gaXRzIFxcYFNLSUxMLm1kXFxgLiBSZWFkIG9ubHkgZW5vdWdoIHRvIGZvbGxvdyB0aGUgd29ya2Zsb3cuXG4gIDIpIElmIFxcYFNLSUxMLm1kXFxgIHBvaW50cyB0byBleHRyYSBmb2xkZXJzIHN1Y2ggYXMgXFxgcmVmZXJlbmNlcy9cXGAsIGxvYWQgb25seSB0aGUgc3BlY2lmaWMgZmlsZXMgbmVlZGVkIGZvciB0aGUgcmVxdWVzdDsgZG9uJ3QgYnVsay1sb2FkIGV2ZXJ5dGhpbmcuXG4gIDMpIElmIFxcYHNjcmlwdHMvXFxgIGV4aXN0LCBwcmVmZXIgcnVubmluZyBvciBwYXRjaGluZyB0aGVtIGluc3RlYWQgb2YgcmV0eXBpbmcgbGFyZ2UgY29kZSBibG9ja3MuXG4gIDQpIElmIFxcYGFzc2V0cy9cXGAgb3IgdGVtcGxhdGVzIGV4aXN0LCByZXVzZSB0aGVtIGluc3RlYWQgb2YgcmVjcmVhdGluZyBmcm9tIHNjcmF0Y2guXG4tIENvb3JkaW5hdGlvbiBhbmQgc2VxdWVuY2luZzpcbiAgLSBJZiBtdWx0aXBsZSBza2lsbHMgYXBwbHksIGNob29zZSB0aGUgbWluaW1hbCBzZXQgdGhhdCBjb3ZlcnMgdGhlIHJlcXVlc3QgYW5kIHN0YXRlIHRoZSBvcmRlciB5b3UnbGwgdXNlIHRoZW0uXG4gIC0gQW5ub3VuY2Ugd2hpY2ggc2tpbGwocykgeW91J3JlIHVzaW5nIGFuZCB3aHkgKG9uZSBzaG9ydCBsaW5lKS4gSWYgeW91IHNraXAgYW4gb2J2aW91cyBza2lsbCwgc2F5IHdoeS5cbi0gQ29udGV4dCBoeWdpZW5lOlxuICAtIEtlZXAgY29udGV4dCBzbWFsbDogc3VtbWFyaXplIGxvbmcgc2VjdGlvbnMgaW5zdGVhZCBvZiBwYXN0aW5nIHRoZW07IG9ubHkgbG9hZCBleHRyYSBmaWxlcyB3aGVuIG5lZWRlZC5cbiAgLSBBdm9pZCBkZWVwIHJlZmVyZW5jZS1jaGFzaW5nOiBwcmVmZXIgb3BlbmluZyBvbmx5IGZpbGVzIGRpcmVjdGx5IGxpbmtlZCBmcm9tIFxcYFNLSUxMLm1kXFxgIHVubGVzcyB5b3UncmUgYmxvY2tlZC5cbiAgLSBXaGVuIHZhcmlhbnRzIGV4aXN0IChmcmFtZXdvcmtzLCBwcm92aWRlcnMsIGRvbWFpbnMpLCBwaWNrIG9ubHkgdGhlIHJlbGV2YW50IHJlZmVyZW5jZSBmaWxlKHMpIGFuZCBub3RlIHRoYXQgY2hvaWNlLlxuLSBTYWZldHkgYW5kIGZhbGxiYWNrOiBJZiBhIHNraWxsIGNhbid0IGJlIGFwcGxpZWQgY2xlYW5seSAobWlzc2luZyBmaWxlcywgdW5jbGVhciBpbnN0cnVjdGlvbnMpLCBzdGF0ZSB0aGUgaXNzdWUsIHBpY2sgdGhlIG5leHQtYmVzdCBhcHByb2FjaCwgYW5kIGNvbnRpbnVlLlxuYDtcbmNvbnN0IEhPV19UT19VU0VfTEFaWV9TS0lMTFNfU0VDVElPTiA9IHByb21wdCBgXG4jIyMgSG93IHRvIHVzZSBza2lsbHNcbi0gRGlzY292ZXJ5OiBUaGUgbGlzdCBhYm92ZSBpcyB0aGUgc2tpbGwgaW5kZXggYXZhaWxhYmxlIGluIHRoaXMgc2Vzc2lvbiAobmFtZSArIGRlc2NyaXB0aW9uICsgd29ya3NwYWNlIHBhdGgpLiBJbiBsYXp5IG1vZGUsIHRob3NlIHBhdGhzIGFyZSBsb2FkZWQgb24gZGVtYW5kIGluc3RlYWQgb2YgYmVpbmcgcHJlc2VudCB1cCBmcm9udC5cbi0gVHJpZ2dlciBydWxlczogSWYgdGhlIHVzZXIgbmFtZXMgYSBza2lsbCAod2l0aCBcXGAkU2tpbGxOYW1lXFxgIG9yIHBsYWluIHRleHQpIE9SIHRoZSB0YXNrIGNsZWFybHkgbWF0Y2hlcyBhIHNraWxsJ3MgZGVzY3JpcHRpb24gc2hvd24gYWJvdmUsIHlvdSBtdXN0IHVzZSB0aGF0IHNraWxsIGZvciB0aGF0IHR1cm4uIE11bHRpcGxlIG1lbnRpb25zIG1lYW4gdXNlIHRoZW0gYWxsLiBEbyBub3QgY2Fycnkgc2tpbGxzIGFjcm9zcyB0dXJucyB1bmxlc3MgcmUtbWVudGlvbmVkLlxuLSBNaXNzaW5nL2Jsb2NrZWQ6IElmIGEgbmFtZWQgc2tpbGwgaXNuJ3QgaW4gdGhlIGxpc3Qgb3IgdGhlIHBhdGggY2FuJ3QgYmUgcmVhZCwgc2F5IHNvIGJyaWVmbHkgYW5kIGNvbnRpbnVlIHdpdGggdGhlIGJlc3QgZmFsbGJhY2suXG4tIEhvdyB0byB1c2UgYSBza2lsbCAocHJvZ3Jlc3NpdmUgZGlzY2xvc3VyZSk6XG4gIDEpIEFmdGVyIGRlY2lkaW5nIHRvIHVzZSBhIGxhenkgc2tpbGwsIGNhbGwgXFxgbG9hZF9za2lsbFxcYCBmb3IgdGhhdCBza2lsbCBmaXJzdCwgdGhlbiBvcGVuIGl0cyBcXGBTS0lMTC5tZFxcYC5cbiAgMikgSWYgXFxgU0tJTEwubWRcXGAgcG9pbnRzIHRvIGV4dHJhIGZvbGRlcnMgc3VjaCBhcyBcXGByZWZlcmVuY2VzL1xcYCwgbG9hZCBvbmx5IHRoZSBzcGVjaWZpYyBmaWxlcyBuZWVkZWQgZm9yIHRoZSByZXF1ZXN0OyBkb24ndCBidWxrLWxvYWQgZXZlcnl0aGluZy5cbiAgMykgSWYgXFxgc2NyaXB0cy9cXGAgZXhpc3QsIHByZWZlciBydW5uaW5nIG9yIHBhdGNoaW5nIHRoZW0gaW5zdGVhZCBvZiByZXR5cGluZyBsYXJnZSBjb2RlIGJsb2Nrcy5cbiAgNCkgSWYgXFxgYXNzZXRzL1xcYCBvciB0ZW1wbGF0ZXMgZXhpc3QsIHJldXNlIHRoZW0gaW5zdGVhZCBvZiByZWNyZWF0aW5nIGZyb20gc2NyYXRjaC5cbi0gQ29vcmRpbmF0aW9uIGFuZCBzZXF1ZW5jaW5nOlxuICAtIElmIG11bHRpcGxlIHNraWxscyBhcHBseSwgY2hvb3NlIHRoZSBtaW5pbWFsIHNldCB0aGF0IGNvdmVycyB0aGUgcmVxdWVzdCBhbmQgc3RhdGUgdGhlIG9yZGVyIHlvdSdsbCB1c2UgdGhlbS5cbiAgLSBBbm5vdW5jZSB3aGljaCBza2lsbChzKSB5b3UncmUgdXNpbmcgYW5kIHdoeSAob25lIHNob3J0IGxpbmUpLiBJZiB5b3Ugc2tpcCBhbiBvYnZpb3VzIHNraWxsLCBzYXkgd2h5LlxuLSBDb250ZXh0IGh5Z2llbmU6XG4gIC0gS2VlcCBjb250ZXh0IHNtYWxsOiBzdW1tYXJpemUgbG9uZyBzZWN0aW9ucyBpbnN0ZWFkIG9mIHBhc3RpbmcgdGhlbTsgb25seSBsb2FkIGV4dHJhIGZpbGVzIHdoZW4gbmVlZGVkLlxuICAtIEF2b2lkIGRlZXAgcmVmZXJlbmNlLWNoYXNpbmc6IHByZWZlciBvcGVuaW5nIG9ubHkgZmlsZXMgZGlyZWN0bHkgbGlua2VkIGZyb20gXFxgU0tJTEwubWRcXGAgdW5sZXNzIHlvdSdyZSBibG9ja2VkLlxuICAtIFdoZW4gdmFyaWFudHMgZXhpc3QgKGZyYW1ld29ya3MsIHByb3ZpZGVycywgZG9tYWlucyksIHBpY2sgb25seSB0aGUgcmVsZXZhbnQgcmVmZXJlbmNlIGZpbGUocykgYW5kIG5vdGUgdGhhdCBjaG9pY2UuXG4tIFNhZmV0eSBhbmQgZmFsbGJhY2s6IElmIGEgc2tpbGwgY2FuJ3QgYmUgYXBwbGllZCBjbGVhbmx5IChtaXNzaW5nIGZpbGVzLCB1bmNsZWFyIGluc3RydWN0aW9ucyksIHN0YXRlIHRoZSBpc3N1ZSwgcGljayB0aGUgbmV4dC1iZXN0IGFwcHJvYWNoLCBhbmQgY29udGludWUuXG5gO1xuZnVuY3Rpb24gdmFsaWRhdGVTa2lsbHNDYXBhYmlsaXR5KGNhcGFiaWxpdHkpIHtcbiAgICBjb25zdCBjb25maWd1cmVkU291cmNlcyA9IFtcbiAgICAgICAgY2FwYWJpbGl0eS5za2lsbHMubGVuZ3RoID4gMCxcbiAgICAgICAgQm9vbGVhbihjYXBhYmlsaXR5LmZyb20pLFxuICAgICAgICBCb29sZWFuKGNhcGFiaWxpdHkubGF6eUZyb20pLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICBpZiAoY29uZmlndXJlZFNvdXJjZXMgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcignc2tpbGxzIGNhcGFiaWxpdHkgcmVxdWlyZXMgYHNraWxsc2AsIGBmcm9tYCwgb3IgYGxhenlGcm9tYC4nKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZ3VyZWRTb3VyY2VzID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKCdza2lsbHMgY2FwYWJpbGl0eSBhY2NlcHRzIG9ubHkgb25lIG9mIGBza2lsbHNgLCBgZnJvbWAsIG9yIGBsYXp5RnJvbWAuJyk7XG4gICAgfVxuICAgIGlmIChjYXBhYmlsaXR5LmZyb20gJiYgIWlzRGlyZWN0b3J5TGlrZUVudHJ5KGNhcGFiaWxpdHkuZnJvbSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcignc2tpbGxzIGZyb20gbXVzdCBiZSBhIGRpcmVjdG9yeS1saWtlIGVudHJ5IHN1Y2ggYXMgZGlyLCBnaXRfcmVwbywgb3IgbW91bnQuJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlZW5Ta2lsbE5hbWVzID0gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3Qgc2tpbGwgb2YgY2FwYWJpbGl0eS5za2lsbHMpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgoc2tpbGwubmFtZSk7XG4gICAgICAgIGlmIChzZWVuU2tpbGxOYW1lcy5oYXMobm9ybWFsaXplZE5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKGBkdXBsaWNhdGUgc2tpbGwgbmFtZTogJHtza2lsbC5uYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIHNlZW5Ta2lsbE5hbWVzLmFkZChub3JtYWxpemVkTmFtZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVuZGVyU2tpbGxEZXNjcmlwdG9yKHNraWxsKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB7XG4gICAgICAgICdTS0lMTC5tZCc6IG5vcm1hbGl6ZVNraWxsQ29udGVudChza2lsbC5jb250ZW50KSxcbiAgICB9O1xuICAgIGlmIChza2lsbC5zY3JpcHRzICYmIE9iamVjdC5rZXlzKHNraWxsLnNjcmlwdHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2hpbGRyZW4uc2NyaXB0cyA9IGRpcih7XG4gICAgICAgICAgICBjaGlsZHJlbjogc2tpbGwuc2NyaXB0cyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChza2lsbC5yZWZlcmVuY2VzICYmIE9iamVjdC5rZXlzKHNraWxsLnJlZmVyZW5jZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2hpbGRyZW4ucmVmZXJlbmNlcyA9IGRpcih7XG4gICAgICAgICAgICBjaGlsZHJlbjogc2tpbGwucmVmZXJlbmNlcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChza2lsbC5hc3NldHMgJiYgT2JqZWN0LmtleXMoc2tpbGwuYXNzZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNoaWxkcmVuLmFzc2V0cyA9IGRpcih7XG4gICAgICAgICAgICBjaGlsZHJlbjogc2tpbGwuYXNzZXRzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRpcih7XG4gICAgICAgIGNoaWxkcmVuLFxuICAgIH0pO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplU2tpbGxDb250ZW50KGNvbnRlbnQpIHtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnIHx8IGNvbnRlbnQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIHJldHVybiBmaWxlKHtcbiAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVTa2lsbHNNZXRhZGF0YShjYXBhYmlsaXR5LCBydW50aW1lTWV0YWRhdGEgPSBbXSkge1xuICAgIGlmIChjYXBhYmlsaXR5LnNraWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBjYXBhYmlsaXR5LnNraWxsc1xuICAgICAgICAgICAgLm1hcCgoc2tpbGwpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBza2lsbC5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHNraWxsLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcGF0aDogam9pblJlbGF0aXZlUGF0aHMoY2FwYWJpbGl0eS5za2lsbHNQYXRoLCBza2lsbC5uYW1lKSxcbiAgICAgICAgfSkpXG4gICAgICAgICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQubmFtZS5sb2NhbGVDb21wYXJlKHJpZ2h0Lm5hbWUpKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlndXJlZEluZGV4ID0gcmVzb2x2ZUxhenlTa2lsbEluZGV4KGNhcGFiaWxpdHkubGF6eUZyb20pID8/XG4gICAgICAgIGNhcGFiaWxpdHkuaW5kZXggPz9cbiAgICAgICAgKHJ1bnRpbWVNZXRhZGF0YS5sZW5ndGggPiAwID8gcnVudGltZU1ldGFkYXRhIDogdW5kZWZpbmVkKSA/P1xuICAgICAgICBkZXJpdmVJbmRleEZyb21EaXJFbnRyeShjYXBhYmlsaXR5LmZyb20pO1xuICAgIHJldHVybiBjb25maWd1cmVkSW5kZXhcbiAgICAgICAgLm1hcCgoc2tpbGwpID0+ICh7XG4gICAgICAgIC4uLnNraWxsLFxuICAgICAgICBwYXRoOiBqb2luUmVsYXRpdmVQYXRocyhjYXBhYmlsaXR5LnNraWxsc1BhdGgsIHNraWxsLnBhdGggPz8gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHNraWxsLm5hbWUpKSxcbiAgICB9KSlcbiAgICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0Lm5hbWUubG9jYWxlQ29tcGFyZShyaWdodC5uYW1lKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTa2lsbEZyb250bWF0dGVyKG1hcmtkb3duKSB7XG4gICAgY29uc3QgbGluZXMgPSBtYXJrZG93bi5zcGxpdCgvXFxyP1xcbi8pO1xuICAgIGlmIChsaW5lc1swXT8udHJpbSgpICE9PSAnLS0tJykge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGVuZEluZGV4ID0gbGluZXMuZmluZEluZGV4KChsaW5lLCBpbmRleCkgPT4gaW5kZXggPiAwICYmIGxpbmUudHJpbSgpID09PSAnLS0tJyk7XG4gICAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IG1ldGFkYXRhID0ge307XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzLnNsaWNlKDEsIGVuZEluZGV4KSkge1xuICAgICAgICBjb25zdCBzdHJpcHBlZCA9IGxpbmUudHJpbSgpO1xuICAgICAgICBjb25zdCBkZWxpbWl0ZXJJbmRleCA9IHN0cmlwcGVkLmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKCFzdHJpcHBlZCB8fCBzdHJpcHBlZC5zdGFydHNXaXRoKCcjJykgfHwgZGVsaW1pdGVySW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSBzdHJpcHBlZC5zbGljZSgwLCBkZWxpbWl0ZXJJbmRleCkudHJpbSgpO1xuICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHN0cmlwcGVkLnNsaWNlKGRlbGltaXRlckluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbWV0YWRhdGFba2V5XSA9IHVucXVvdGVGcm9udG1hdHRlclZhbHVlKHJhd1ZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xufVxuZnVuY3Rpb24gdW5xdW90ZUZyb250bWF0dGVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID49IDIgJiZcbiAgICAgICAgdmFsdWVbMF0gPT09IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdICYmXG4gICAgICAgICh2YWx1ZVswXSA9PT0gJ1wiJyB8fCB2YWx1ZVswXSA9PT0gXCInXCIpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zbGljZSgxLCAtMSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5U2tpbGxJbmRleChsYXp5U291cmNlKSB7XG4gICAgaWYgKCFsYXp5U291cmNlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChsYXp5U291cmNlLmluZGV4KSB7XG4gICAgICAgIHJldHVybiBsYXp5U291cmNlLmluZGV4O1xuICAgIH1cbiAgICBjb25zdCBkZXJpdmVkSW5kZXggPSBkZXJpdmVJbmRleEZyb21EaXJFbnRyeShsYXp5U291cmNlLnNvdXJjZSk7XG4gICAgcmV0dXJuIGRlcml2ZWRJbmRleC5sZW5ndGggPiAwID8gZGVyaXZlZEluZGV4IDogdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gZGVyaXZlSW5kZXhGcm9tRGlyRW50cnkoZW50cnkpIHtcbiAgICBpZiAoIWVudHJ5IHx8ICFpc0RpcihlbnRyeSkgfHwgIWVudHJ5LmNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGVudHJ5LmNoaWxkcmVuKVxuICAgICAgICAuZmlsdGVyKChbLCBjaGlsZF0pID0+IGNoaWxkLnR5cGUgPT09ICdkaXInKVxuICAgICAgICAubWFwKChbbmFtZSwgY2hpbGRdKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogY2hpbGQuZGVzY3JpcHRpb24gPz8gJ05vIGRlc2NyaXB0aW9uIHByb3ZpZGVkLicsXG4gICAgfSkpO1xufVxuZnVuY3Rpb24gcmVuZGVyU2tpbGxzRGlzY292ZXJ5SW5zdHJ1Y3Rpb25zKHNraWxsc1BhdGgpIHtcbiAgICByZXR1cm4gcHJvbXB0IGBcbiMjIFNraWxsc1xuJHtTS0lMTFNfU0VDVElPTl9JTlRST31cblxuIyMjIFNraWxsIHNvdXJjZVxuLSBTa2lsbHMgYXJlIG1hdGVyaWFsaXplZCB1bmRlciAke3NraWxsc1BhdGh9LiBEaXNjb3ZlciBhdmFpbGFibGUgc2tpbGxzIGJ5IGluc3BlY3RpbmcgY2hpbGQgZGlyZWN0b3JpZXMgYW5kIHRoZWlyIFNLSUxMLm1kIGZpbGVzIGF0IHJ1bnRpbWUuXG5cbiR7SE9XX1RPX1VTRV9TS0lMTFNfU0VDVElPTn1cbmA7XG59XG5mdW5jdGlvbiByZW5kZXJTa2lsbHNJbnN0cnVjdGlvbnMoYXJncykge1xuICAgIGNvbnN0IGF2YWlsYWJsZVNraWxscyA9IGFyZ3MubWV0YWRhdGFcbiAgICAgICAgLm1hcCgoc2tpbGwpID0+IGAtICR7c2tpbGwubmFtZX06ICR7c2tpbGwuZGVzY3JpcHRpb259IChmaWxlOiAke3NraWxsLnBhdGggPz8gc2tpbGwubmFtZX0pYClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIGNvbnN0IGxhenlMb2FkaW5nSW5zdHJ1Y3Rpb25zID0gYXJncy5sYXp5XG4gICAgICAgID8gcHJvbXB0IGBcbiMjIyBMYXp5IGxvYWRpbmdcbi0gVGhlc2Ugc2tpbGxzIGFyZSBpbmRleGVkIGZvciBwbGFubmluZywgYnV0IHRoZXkgYXJlIG5vdCBtYXRlcmlhbGl6ZWQgaW4gdGhlIHdvcmtzcGFjZSB5ZXQuXG4tIENhbGwgXFxgbG9hZF9za2lsbFxcYCB3aXRoIGEgc2luZ2xlIHNraWxsIG5hbWUgZnJvbSB0aGUgbGlzdCBiZWZvcmUgcmVhZGluZyBpdHMgXFxgU0tJTEwubWRcXGAgb3Igb3RoZXIgZmlsZXMgZnJvbSB0aGUgd29ya3NwYWNlLlxuLSBcXGBsb2FkX3NraWxsXFxgIHN0YWdlcyBleGFjdGx5IG9uZSBza2lsbCB1bmRlciB0aGUgbGlzdGVkIHBhdGguIElmIHlvdSBuZWVkIG1vcmUgdGhhbiBvbmUgc2tpbGwsIGNhbGwgaXQgbXVsdGlwbGUgdGltZXMuXG5gXG4gICAgICAgIDogJyc7XG4gICAgY29uc3QgdXNhZ2VJbnN0cnVjdGlvbnMgPSBhcmdzLmxhenlcbiAgICAgICAgPyBIT1dfVE9fVVNFX0xBWllfU0tJTExTX1NFQ1RJT05cbiAgICAgICAgOiBIT1dfVE9fVVNFX1NLSUxMU19TRUNUSU9OO1xuICAgIGNvbnN0IGxhenlMb2FkaW5nU2VjdGlvbiA9IGxhenlMb2FkaW5nSW5zdHJ1Y3Rpb25zXG4gICAgICAgID8gYCR7bGF6eUxvYWRpbmdJbnN0cnVjdGlvbnN9XFxuXFxuYFxuICAgICAgICA6ICcnO1xuICAgIHJldHVybiBwcm9tcHQgYFxuIyMgU2tpbGxzXG4ke1NLSUxMU19TRUNUSU9OX0lOVFJPfVxuXG4jIyMgQXZhaWxhYmxlIHNraWxsc1xuJHthdmFpbGFibGVTa2lsbHN9XG5cbiR7bGF6eUxvYWRpbmdTZWN0aW9ufSR7dXNhZ2VJbnN0cnVjdGlvbnN9XG5gO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenlTa2lsbE1hdGNoKGNhcGFiaWxpdHksIHNraWxsTmFtZSkge1xuICAgIGNvbnN0IGluZGV4ID0gcmVzb2x2ZUxhenlTa2lsbEluZGV4KGNhcGFiaWxpdHkubGF6eUZyb20pID8/IGNhcGFiaWxpdHkuaW5kZXggPz8gW107XG4gICAgY29uc3QgbWF0Y2hlcyA9IGluZGV4LmZpbHRlcigoc2tpbGwpID0+IHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHNraWxsLnBhdGggPz8gc2tpbGwubmFtZSk7XG4gICAgICAgIGNvbnN0IHBhdGhCYXNlTmFtZSA9IHJlbGF0aXZlUGF0aC5zcGxpdCgnLycpLnBvcCgpID8/IHJlbGF0aXZlUGF0aDtcbiAgICAgICAgcmV0dXJuIChza2lsbC5uYW1lID09PSBza2lsbE5hbWUgfHxcbiAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9PT0gc2tpbGxOYW1lIHx8XG4gICAgICAgICAgICBwYXRoQmFzZU5hbWUgPT09IHNraWxsTmFtZSk7XG4gICAgfSk7XG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYGxhenkgc2tpbGwgbm90IGZvdW5kOiAke3NraWxsTmFtZX1gKTtcbiAgICB9XG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKGBsYXp5IHNraWxsIG5hbWUgaXMgYW1iaWd1b3VzOiAke3NraWxsTmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXNbMF07XG59XG5mdW5jdGlvbiBqb2luUmVsYXRpdmVQYXRocyhsZWZ0LCByaWdodCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRMZWZ0ID0gbm9ybWFsaXplUmVsYXRpdmVQYXRoKGxlZnQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSaWdodCA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChyaWdodCk7XG4gICAgaWYgKCFub3JtYWxpemVkTGVmdCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZFJpZ2h0O1xuICAgIH1cbiAgICBpZiAoIW5vcm1hbGl6ZWRSaWdodCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZExlZnQ7XG4gICAgfVxuICAgIHJldHVybiBgJHtub3JtYWxpemVkTGVmdH0vJHtub3JtYWxpemVkUmlnaHR9YDtcbn1cbmZ1bmN0aW9uIGpvaW5Tb3VyY2VQYXRoKHNvdXJjZVJvb3QsIHJlbGF0aXZlUGF0aCkge1xuICAgIGNvbnN0IHRyaW1tZWRSb290ID0gc291cmNlUm9vdC5yZXBsYWNlKC9bXFxcXC9dKyQvLCAnJyk7XG4gICAgaWYgKCF0cmltbWVkUm9vdCkge1xuICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dHJpbW1lZFJvb3R9LyR7cmVsYXRpdmVQYXRofWA7XG59XG5mdW5jdGlvbiByZXNvbHZlTGF6eVNraWxsRW50cnkoc291cmNlLCByZWxhdGl2ZVNraWxsUGF0aCkge1xuICAgIGlmIChzb3VyY2UudHlwZSA9PT0gJ2xvY2FsX2RpcicpIHtcbiAgICAgICAgaWYgKCFzb3VyY2Uuc3JjKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKCdMYXp5IHNraWxsIGxvY2FsX2RpciBzb3VyY2VzIHJlcXVpcmUgYSBjb25jcmV0ZSBzcmMgdmFsdWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNvdXJjZSxcbiAgICAgICAgICAgIHR5cGU6ICdsb2NhbF9kaXInLFxuICAgICAgICAgICAgc3JjOiBqb2luU291cmNlUGF0aChzb3VyY2Uuc3JjLCByZWxhdGl2ZVNraWxsUGF0aCksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChzb3VyY2UudHlwZSA9PT0gJ2dpdF9yZXBvJykge1xuICAgICAgICBjb25zdCBiYXNlU3VicGF0aCA9IHNvdXJjZS5zdWJwYXRoXG4gICAgICAgICAgICA/IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChzb3VyY2Uuc3VicGF0aClcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zb3VyY2UsXG4gICAgICAgICAgICB0eXBlOiAnZ2l0X3JlcG8nLFxuICAgICAgICAgICAgc3VicGF0aDogam9pblJlbGF0aXZlUGF0aHMoYmFzZVN1YnBhdGgsIHJlbGF0aXZlU2tpbGxQYXRoKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHNvdXJjZS50eXBlID09PSAnZGlyJykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHJlYWREaXJDaGlsZChzb3VyY2UsIHJlbGF0aXZlU2tpbGxQYXRoKTtcbiAgICAgICAgaWYgKCFjaGlsZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgbGF6eSBza2lsbCBzb3VyY2UgcGF0aCBub3QgZm91bmQ6ICR7cmVsYXRpdmVTa2lsbFBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKGBMYXp5IHNraWxsIHNvdXJjZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0OiAke3NvdXJjZS50eXBlfWApO1xufVxuZnVuY3Rpb24gcmVhZERpckNoaWxkKHNvdXJjZSwgcmVsYXRpdmVTa2lsbFBhdGgpIHtcbiAgICBsZXQgY3VycmVudCA9IHNvdXJjZTtcbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygbm9ybWFsaXplUmVsYXRpdmVQYXRoKHJlbGF0aXZlU2tpbGxQYXRoKS5zcGxpdCgnLycpKSB7XG4gICAgICAgIGlmICghc2VnbWVudCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjdXJyZW50IHx8ICFpc0RpcihjdXJyZW50KSB8fCAhY3VycmVudC5jaGlsZHJlbikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZHJlbltzZWdtZW50XTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG59XG5mdW5jdGlvbiBwYXRoc092ZXJsYXAobGVmdCwgcmlnaHQpIHtcbiAgICByZXR1cm4gKGxlZnQgPT09IHJpZ2h0IHx8XG4gICAgICAgIGxlZnQuc3RhcnRzV2l0aChgJHtyaWdodH0vYCkgfHxcbiAgICAgICAgcmlnaHQuc3RhcnRzV2l0aChgJHtsZWZ0fS9gKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1za2lsbHMubWpzLm1hcCIsImltcG9ydCB7IGNvbXBhY3Rpb24gfSBmcm9tIFwiLi9jb21wYWN0aW9uLm1qc1wiO1xuaW1wb3J0IHsgZmlsZXN5c3RlbSB9IGZyb20gXCIuL2ZpbGVzeXN0ZW0ubWpzXCI7XG5pbXBvcnQgeyBzaGVsbCB9IGZyb20gXCIuL3NoZWxsLm1qc1wiO1xuZXhwb3J0IHsgQ2FwYWJpbGl0eSB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5leHBvcnQgeyBDb21wYWN0aW9uTW9kZWxJbmZvLCBDb21wYWN0aW9uUG9saWN5LCBEeW5hbWljQ29tcGFjdGlvblBvbGljeSwgU3RhdGljQ29tcGFjdGlvblBvbGljeSwgY29tcGFjdGlvbiwgfSBmcm9tIFwiLi9jb21wYWN0aW9uLm1qc1wiO1xuZXhwb3J0IHsgZmlsZXN5c3RlbSB9IGZyb20gXCIuL2ZpbGVzeXN0ZW0ubWpzXCI7XG5leHBvcnQgeyBtZW1vcnkgfSBmcm9tIFwiLi9tZW1vcnkubWpzXCI7XG5leHBvcnQgeyBJbk1lbW9yeU1lbW9yeVN0b3JlIH0gZnJvbSBcIi4uL21lbW9yeS9zdG9yYWdlLm1qc1wiO1xuZXhwb3J0IHsgc2hlbGwgfSBmcm9tIFwiLi9zaGVsbC5tanNcIjtcbmV4cG9ydCB7IHNraWxscyB9IGZyb20gXCIuL3NraWxscy5tanNcIjtcbmZ1bmN0aW9uIGRlZmF1bHRDYXBhYmlsaXRpZXMoKSB7XG4gICAgcmV0dXJuIFtmaWxlc3lzdGVtKCksIHNoZWxsKCksIGNvbXBhY3Rpb24oKV07XG59XG5leHBvcnQgY29uc3QgQ2FwYWJpbGl0aWVzID0ge1xuICAgIGRlZmF1bHQ6IGRlZmF1bHRDYXBhYmlsaXRpZXMsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcCIsImltcG9ydCB7IEFnZW50IH0gZnJvbSBcIi4uL2FnZW50Lm1qc1wiO1xuaW1wb3J0IHsgU0FOREJPWF9BR0VOVF9CUkFORCB9IGZyb20gXCIuL2JyYW5kLm1qc1wiO1xuaW1wb3J0IHsgQ2FwYWJpbGl0aWVzIH0gZnJvbSBcIi4vY2FwYWJpbGl0aWVzL2luZGV4Lm1qc1wiO1xuaW1wb3J0IHsgY2xvbmVNYW5pZmVzdCwgTWFuaWZlc3QgfSBmcm9tIFwiLi9tYW5pZmVzdC5tanNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZVVzZXIgfSBmcm9tIFwiLi91c2Vycy5tanNcIjtcbmV4cG9ydCBjbGFzcyBTYW5kYm94QWdlbnQgZXh0ZW5kcyBBZ2VudCB7XG4gICAgW1NBTkRCT1hfQUdFTlRfQlJBTkRdID0gdHJ1ZTtcbiAgICBkZWZhdWx0TWFuaWZlc3Q7XG4gICAgYmFzZUluc3RydWN0aW9ucztcbiAgICBjYXBhYmlsaXRpZXM7XG4gICAgcnVuQXM7XG4gICAgcnVudGltZU1hbmlmZXN0O1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLmJhc2VJbnN0cnVjdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIGNvbmZpZy5iYXNlSW5zdHJ1Y3Rpb25zICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgdHlwZW9mIGNvbmZpZy5iYXNlSW5zdHJ1Y3Rpb25zICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTYW5kYm94QWdlbnQgYmFzZUluc3RydWN0aW9ucyBtdXN0IGJlIGEgc3RyaW5nIG9yIGZ1bmN0aW9uLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVmYXVsdE1hbmlmZXN0ID0gY29uZmlnLmRlZmF1bHRNYW5pZmVzdFxuICAgICAgICAgICAgPyBjbG9uZU1hbmlmZXN0KGNvbmZpZy5kZWZhdWx0TWFuaWZlc3QpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5iYXNlSW5zdHJ1Y3Rpb25zID0gY29uZmlnLmJhc2VJbnN0cnVjdGlvbnM7XG4gICAgICAgIHRoaXMuY2FwYWJpbGl0aWVzID0gY29uZmlnLmNhcGFiaWxpdGllcyA/PyBDYXBhYmlsaXRpZXMuZGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnJ1bkFzID0gbm9ybWFsaXplUnVuQXMoY29uZmlnLnJ1bkFzKTtcbiAgICAgICAgdGhpcy5ydW50aW1lTWFuaWZlc3QgPSB0aGlzLmRlZmF1bHRNYW5pZmVzdCA/PyBuZXcgTWFuaWZlc3QoKTtcbiAgICB9XG4gICAgY2xvbmUoY29uZmlnKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEFnZW50KHtcbiAgICAgICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lID8/IHRoaXMubmFtZSxcbiAgICAgICAgICAgIGluc3RydWN0aW9uczogY29uZmlnLmluc3RydWN0aW9ucyA/PyB0aGlzLmluc3RydWN0aW9ucyxcbiAgICAgICAgICAgIHByb21wdDogY29uZmlnLnByb21wdCA/PyB0aGlzLnByb21wdCxcbiAgICAgICAgICAgIGhhbmRvZmZEZXNjcmlwdGlvbjogY29uZmlnLmhhbmRvZmZEZXNjcmlwdGlvbiA/PyB0aGlzLmhhbmRvZmZEZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGhhbmRvZmZzOiBjb25maWcuaGFuZG9mZnMgPz8gdGhpcy5oYW5kb2ZmcyxcbiAgICAgICAgICAgIG1vZGVsOiBjb25maWcubW9kZWwgPz8gdGhpcy5tb2RlbCxcbiAgICAgICAgICAgIG1vZGVsU2V0dGluZ3M6IGNvbmZpZy5tb2RlbFNldHRpbmdzID8/IHRoaXMubW9kZWxTZXR0aW5ncyxcbiAgICAgICAgICAgIHRvb2xzOiBjb25maWcudG9vbHMgPz8gdGhpcy50b29scyxcbiAgICAgICAgICAgIG1jcFNlcnZlcnM6IGNvbmZpZy5tY3BTZXJ2ZXJzID8/IHRoaXMubWNwU2VydmVycyxcbiAgICAgICAgICAgIGlucHV0R3VhcmRyYWlsczogY29uZmlnLmlucHV0R3VhcmRyYWlscyA/PyB0aGlzLmlucHV0R3VhcmRyYWlscyxcbiAgICAgICAgICAgIG91dHB1dEd1YXJkcmFpbHM6IGNvbmZpZy5vdXRwdXRHdWFyZHJhaWxzID8/IHRoaXMub3V0cHV0R3VhcmRyYWlscyxcbiAgICAgICAgICAgIG91dHB1dFR5cGU6IGNvbmZpZy5vdXRwdXRUeXBlID8/IHRoaXMub3V0cHV0VHlwZSxcbiAgICAgICAgICAgIHRvb2xVc2VCZWhhdmlvcjogY29uZmlnLnRvb2xVc2VCZWhhdmlvciA/PyB0aGlzLnRvb2xVc2VCZWhhdmlvcixcbiAgICAgICAgICAgIHJlc2V0VG9vbENob2ljZTogY29uZmlnLnJlc2V0VG9vbENob2ljZSA/PyB0aGlzLnJlc2V0VG9vbENob2ljZSxcbiAgICAgICAgICAgIGRlZmF1bHRNYW5pZmVzdDogY29uZmlnLmRlZmF1bHRNYW5pZmVzdCA/PyB0aGlzLmRlZmF1bHRNYW5pZmVzdCxcbiAgICAgICAgICAgIGJhc2VJbnN0cnVjdGlvbnM6IGNvbmZpZy5iYXNlSW5zdHJ1Y3Rpb25zID8/IHRoaXMuYmFzZUluc3RydWN0aW9ucyxcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogY29uZmlnLmNhcGFiaWxpdGllcyA/PyB0aGlzLmNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIHJ1bkFzOiBjb25maWcucnVuQXMgPz8gdGhpcy5ydW5BcyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplUnVuQXMocnVuQXMpIHtcbiAgICBpZiAocnVuQXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJ1bkFzID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gcnVuQXMudHJpbSgpO1xuICAgICAgICBpZiAoIXRyaW1tZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1NhbmRib3hBZ2VudCBydW5BcyBtdXN0IGJlIG5vbi1lbXB0eS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJpbW1lZDtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVVzZXIocnVuQXMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWdlbnQubWpzLm1hcCJdLCJuYW1lcyI6WyJzdXBwb3J0c1Jlc3BvbnNlc0NvbXBhY3Rpb25UcmFuc3BvcnQiLCJtb2RlbEluc3RhbmNlIiwic3VwcG9ydHNBcHBseVBhdGNoVHJhbnNwb3J0Iiwic3VwcG9ydHNTdHJ1Y3R1cmVkVG9vbE91dHB1dFRyYW5zcG9ydCIsIkNvbXBhY3Rpb25Qb2xpY3kiLCJEeW5hbWljQ29tcGFjdGlvblBvbGljeSIsInRocmVzaG9sZFJhdGlvIiwiZmFsbGJhY2tUaHJlc2hvbGQiLCJfX3B1YmxpY0ZpZWxkIiwibW9kZWwiLCJtb2RlbEluZm8iLCJDb21wYWN0aW9uTW9kZWxJbmZvIiwiY29udGV4dFdpbmRvdyIsImNhbmRpZGF0ZSIsImdldFNhbmRib3hDb21wYWN0aW9uTW9kZWxDYW5kaWRhdGVzIiwiU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMU0iLCJTQU5EQk9YX0NPTlRFWFRfV0lORE9XU180MDBLIiwiU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMjAwSyIsIlNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzEyOEsiLCJDb21wYWN0aW9uQ2FwYWJpbGl0eSIsIkNhcGFiaWxpdHkiLCJwb2xpY3kiLCJzYW1wbGluZ1BhcmFtcyIsImNvbnRleHQiLCJsYXN0Q29tcGFjdGlvbkluZGV4IiwiaW5kZXgiLCJjb21wYWN0aW9uIiwiYXJncyIsInRyaW1tZWQiLCJub3JtYWxpemVkIiwid2l0aG91dFBpbm5lZERhdGUiLCJhcHBseVBhdGNoRnVuY3Rpb25QYXJhbWV0ZXJzIiwiQkVHSU5fUEFUQ0giLCJFTkRfUEFUQ0giLCJBRERfRklMRSIsIkRFTEVURV9GSUxFIiwiVVBEQVRFX0ZJTEUiLCJNT1ZFX1RPIiwidG9FcnJvck1lc3NhZ2UiLCJlcnJvciIsInJlbmRlckltYWdlRm9yVGV4dFRyYW5zcG9ydCIsIm91dHB1dCIsImltYWdlIiwiaXNSZWNvcmQiLCJpbWFnZVJlY29yZCIsImVuY29kZVVpbnQ4QXJyYXlUb0Jhc2U2NCIsInJlbmRlclZpZXdJbWFnZUVycm9yIiwicGF0aCIsIm1lc3NhZ2UiLCJuYW1lIiwicGFyc2VBcHBseVBhdGNoSW5wdXQiLCJyYXdJbnB1dCIsInRyaW1tZWRJbnB1dCIsInBhcnNlRnJlZWZvcm1QYXRjaCIsInBheWxvYWQiLCJwYXJzZUFwcGx5UGF0Y2hQYXlsb2FkIiwicGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyIsImNvbW1hbmROYW1lIiwicGF0Y2giLCJwYXlsb2FkcyIsIm9wZXJhdGlvbnMiLCJwYXJzZWQiLCJBcHBseVBhdGNoT3BlcmF0aW9uIiwicmF3UGF0Y2giLCJsaW5lcyIsImxpbmUiLCJwYXJzZUFkZEZpbGVQYXRjaCIsInBhcnNlRGVsZXRlRmlsZVBhdGNoIiwicGFyc2VVcGRhdGVGaWxlUGF0Y2giLCJwYXJzZVBhdGNoSGVhZGVyIiwiZGlmZkxpbmVzIiwiaXNGaWxlT3BlcmF0aW9uSGVhZGVyIiwiam9pbkRpZmYiLCJtb3ZlVG8iLCJwYXJzZWRNb3ZlVG8iLCJwcmVmaXgiLCJhcHBseVBhdGNoT3BlcmF0aW9uIiwiZWRpdG9yIiwib3BlcmF0aW9uIiwicnVuQ29udGV4dCIsInJlc3VsdCIsImFwcGx5UGF0Y2hPcGVyYXRpb25zIiwib3V0cHV0cyIsImFwcGx5UGF0Y2hGdW5jdGlvblRvb2wiLCJpbnB1dCIsIkZpbGVzeXN0ZW1DYXBhYmlsaXR5Iiwic2Vzc2lvbiIsInJlcXVpcmVCb3VuZFNlc3Npb24iLCJfYSIsIlVzZXJFcnJvciIsInRvb2xzIiwidmlld0ltYWdlIiwid2l0aFNhbmRib3hTcGFuIiwidG9vbCIsInoub2JqZWN0Iiwiei5zdHJpbmciLCJhcHBseVBhdGNoVG9vbCIsImZpbGVzeXN0ZW0iLCJERUZBVUxUX0VYRUNfWUlFTERfVElNRV9NUyIsIkRFRkFVTFRfV1JJVEVfU1RESU5fWUlFTERfVElNRV9NUyIsIlNIRUxMX0lOU1RSVUNUSU9OUyIsIlNoZWxsQ2FwYWJpbGl0eSIsInpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJpbmciLCJ6XG4gICAgICAgICAgICAgICAgICAgICAgICAuYm9vbGVhbiIsInpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5udW1iZXIiLCJjbWQiLCJ3b3JrZGlyIiwic2hlbGwiLCJsb2dpbiIsInR0eSIsInlpZWxkX3RpbWVfbXMiLCJtYXhfb3V0cHV0X3Rva2VucyIsInNlc3Npb25faWQiLCJjaGFycyIsInByb21wdCIsImRlZmF1bHRDYXBhYmlsaXRpZXMiLCJDYXBhYmlsaXRpZXMiLCJTYW5kYm94QWdlbnQiLCJfYiIsIkFnZW50IiwiU0FOREJPWF9BR0VOVF9CUkFORCIsImNvbmZpZyIsImNsb25lTWFuaWZlc3QiLCJub3JtYWxpemVSdW5BcyIsIk1hbmlmZXN0IiwicnVuQXMiLCJub3JtYWxpemVVc2VyIl0sIm1hcHBpbmdzIjoiOzs7O0FBQU8sU0FBU0EsRUFBcUNDLEdBQWU7QUFDaEUsU0FBS0EsSUFTRSxFQU5pQixPQUFPQSxLQUFrQixZQUM3Q0EsS0FDQSxpQkFBaUJBLEtBQ2pCLE9BQU9BLEVBQWMsZUFBZ0IsYUFDbkNBLEVBQWMsWUFBWSxPQUMxQixJQUNrQixTQUFTLGlCQUFpQixJQVJ2QztBQVNmO0FBQ08sU0FBU0MsRUFBNEJELEdBQWU7QUFDdkQsU0FBT0UsRUFBc0NGLENBQWE7QUFDOUQ7QUFDTyxTQUFTRSxFQUFzQ0YsR0FBZTtBQUNqRSxTQUFLQSxJQVNFLEVBTmlCLE9BQU9BLEtBQWtCLFlBQzdDQSxLQUNBLGlCQUFpQkEsS0FDakIsT0FBT0EsRUFBYyxlQUFnQixhQUNuQ0EsRUFBYyxZQUFZLE9BQzFCLElBQ2tCLFNBQVMsaUJBQWlCLElBUnZDO0FBU2Y7QUN4Qk8sTUFBTUcsRUFBaUI7QUFDOUI7QUFXTyxNQUFNQyxXQUFnQ0QsRUFBaUI7QUFBQSxFQUcxRCxZQUFZRSxJQUFpQixLQUFLQyxJQUFvQixNQUFRO0FBQzFELFVBQUs7QUFIVCxJQUFBQyxFQUFBO0FBQ0EsSUFBQUEsRUFBQTtBQUdJLFNBQUssaUJBQWlCRixHQUN0QixLQUFLLG9CQUFvQkM7QUFBQSxFQUM3QjtBQUFBLEVBQ0EsaUJBQWlCRSxHQUFPO0FBQ3BCLFFBQUksQ0FBQ0E7QUFDRCxhQUFPLEtBQUs7QUFFaEIsVUFBTUMsSUFBWUMsRUFBb0IsU0FBU0YsQ0FBSztBQUNwRCxXQUFLQyxJQUdFLEtBQUssTUFBTUEsRUFBVSxnQkFBZ0IsS0FBSyxjQUFjLElBRnBELEtBQUs7QUFBQSxFQUdwQjtBQUNKO0FBQ08sTUFBTUMsRUFBb0I7QUFBQSxFQUU3QixZQUFZQyxHQUFlO0FBRDNCLElBQUFKLEVBQUE7QUFFSSxTQUFLLGdCQUFnQkk7QUFBQSxFQUN6QjtBQUFBLEVBQ0EsT0FBTyxTQUFTSCxHQUFPO0FBQ25CLGVBQVdJLEtBQWFDLEdBQW9DTCxDQUFLLEdBQUc7QUFDaEUsVUFBSU0sR0FBMkIsSUFBSUYsQ0FBUztBQUN4QyxlQUFPLElBQUlGLEVBQW9CLE9BQU87QUFFMUMsVUFBSUssR0FBNkIsSUFBSUgsQ0FBUztBQUMxQyxlQUFPLElBQUlGLEVBQW9CLEdBQU07QUFFekMsVUFBSU0sR0FBNkIsSUFBSUosQ0FBUztBQUMxQyxlQUFPLElBQUlGLEVBQW9CLEdBQU07QUFFekMsVUFBSU8sR0FBNkIsSUFBSUwsQ0FBUztBQUMxQyxlQUFPLElBQUlGLEVBQW9CLEtBQU07QUFBQSxJQUU3QztBQUFBLEVBRUo7QUFDSjtBQUNBLE1BQU1RLFdBQTZCQyxFQUFXO0FBQUEsRUFHMUMsWUFBWUMsSUFBUyxJQUFJaEIsTUFBMkI7QUFDaEQsVUFBSztBQUhULElBQUFHLEVBQUEsY0FBTztBQUNQLElBQUFBLEVBQUE7QUFHSSxTQUFLLFNBQVNhO0FBQUEsRUFDbEI7QUFBQSxFQUNBLGVBQWVDLEdBQWdCO0FBQzNCLFFBQUlBLEVBQWUsaUJBQ2YsQ0FBQ3RCLEVBQXFDc0IsRUFBZSxhQUFhO0FBQ2xFLGFBQU8sQ0FBQTtBQUVYLFVBQU1iLElBQVEsT0FBT2EsRUFBZSxTQUFVLFdBQ3hDQSxFQUFlLFFBQ2Y7QUFDTixXQUFPO0FBQUEsTUFDSCxvQkFBb0I7QUFBQSxRQUNoQjtBQUFBLFVBQ0ksTUFBTTtBQUFBLFVBQ04sbUJBQW1CLEtBQUssT0FBTyxpQkFBaUJiLENBQUs7QUFBQSxRQUN6RTtBQUFBLE1BQ0E7QUFBQSxJQUNBO0FBQUEsRUFDSTtBQUFBLEVBQ0EsZUFBZWMsR0FBUztBQUNwQixRQUFJQyxJQUFzQjtBQUMxQixhQUFTQyxJQUFRLEdBQUdBLElBQVFGLEVBQVEsUUFBUUUsS0FBUztBQUNqRCxNQUFJRixFQUFRRSxDQUFLLEVBQUUsU0FBUyxpQkFDeEJELElBQXNCQztBQUc5QixXQUFJRCxNQUF3QixLQUNqQkQsSUFFSkEsRUFBUSxNQUFNQyxDQUFtQjtBQUFBLEVBQzVDO0FBQ0o7QUFDTyxTQUFTRSxHQUFXQyxJQUFPLElBQUk7QUFDbEMsU0FBTyxJQUFJUixHQUFxQlEsRUFBSyxNQUFNO0FBQy9DO0FBQ0EsU0FBU2IsR0FBb0NMLEdBQU87QUFDaEQsUUFBTW1CLElBQVVuQixFQUFNLEtBQUk7QUFDMUIsTUFBSSxDQUFDbUI7QUFDRCxXQUFPLENBQUE7QUFLWCxRQUFNQyxLQUh3QkQsRUFBUSxTQUFTLEdBQUcsSUFDNUNBLEVBQVEsTUFBTUEsRUFBUSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQzFDQSxHQUNtQyxZQUFXLEdBQzlDRSxJQUFvQkQsRUFBVyxRQUFRLHdCQUF3QixFQUFFO0FBQ3ZFLFNBQU8sQ0FBQyxHQUFHLG9CQUFJLElBQUksQ0FBQ0EsR0FBWUMsQ0FBaUIsQ0FBQyxDQUFDO0FBQ3ZEO0FBQ0EsTUFBTWYsS0FBNkIsb0JBQUksSUFBSTtBQUFBLEVBQ3ZDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0osQ0FBQyxHQUNLQyxLQUErQixvQkFBSSxJQUFJO0FBQUEsRUFDekM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0osQ0FBQyxHQUNLQyxLQUErQixvQkFBSSxJQUFJO0FBQUEsRUFDekM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNKLENBQUMsR0FDS0MsS0FBK0Isb0JBQUksSUFBSTtBQUFBLEVBQ3pDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNKLENBQUMsR0N6SkthLEtBQStCO0FBQUEsRUFDakMsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUFBLElBQ1IsT0FBTztBQUFBLE1BQ0gsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLElBQ3pCO0FBQUEsSUFDUSxXQUFXO0FBQUEsTUFDUCxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsSUFDekI7QUFBQSxJQUNRLFlBQVk7QUFBQSxNQUNSLE1BQU07QUFBQSxNQUNOLE9BQU8sRUFBRSxNQUFNLFNBQVE7QUFBQSxNQUN2QixhQUFhO0FBQUEsSUFDekI7QUFBQSxJQUNRLFNBQVM7QUFBQSxNQUNMLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxJQUN6QjtBQUFBLElBQ1EsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sTUFBTSxDQUFDLGVBQWUsZUFBZSxhQUFhO0FBQUEsTUFDbEQsYUFBYTtBQUFBLElBQ3pCO0FBQUEsSUFDUSxNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsSUFDekI7QUFBQSxJQUNRLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxJQUN6QjtBQUFBLElBQ1EsUUFBUTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLElBQ3pCO0FBQUEsRUFDQTtBQUFBLEVBQ0ksVUFBVSxDQUFBO0FBQUEsRUFDVixzQkFBc0I7QUFDMUIsR0FDTUMsSUFBYyxtQkFDZEMsSUFBWSxpQkFDWkMsSUFBVyxrQkFDWEMsSUFBYyxxQkFDZEMsSUFBYyxxQkFDZEMsSUFBVTtBQUNoQixTQUFTQyxFQUFlQyxHQUFPO0FBQzNCLE1BQUlBLGFBQWlCO0FBQ2pCLFdBQU9BLEVBQU0sV0FBV0EsRUFBTSxTQUFRO0FBRTFDLE1BQUk7QUFDQSxXQUFPLEtBQUssVUFBVUEsQ0FBSztBQUFBLEVBQy9CLFFBQ007QUFDRixXQUFPLE9BQU9BLENBQUs7QUFBQSxFQUN2QjtBQUNKO0FBQ0EsU0FBU0MsR0FBNEJDLEdBQVE7QUFDekMsTUFBSSxPQUFPQSxLQUFXO0FBQ2xCLFdBQU9BO0FBRVgsUUFBTUMsSUFBUUQsRUFBTztBQUNyQixNQUFJLE9BQU9DLEtBQVU7QUFDakIsV0FBT0E7QUFFWCxNQUFJLENBQUNDLEVBQVNELENBQUs7QUFDZixXQUFPO0FBRVgsUUFBTUUsSUFBY0Y7QUFDcEIsU0FBSSxPQUFPRSxFQUFZLE9BQVEsV0FDcEJBLEVBQVksTUFFbkIsT0FBT0EsRUFBWSxVQUFXLFdBQ3ZCLDBCQUEwQkEsRUFBWSxNQUFNLEtBRW5ELE9BQU9BLEVBQVksUUFBUyxXQUlyQixRQUhXLE9BQU9BLEVBQVksYUFBYyxXQUM3Q0EsRUFBWSxZQUNaLDBCQUNrQixXQUFXQSxFQUFZLElBQUksS0FFbkRBLEVBQVksZ0JBQWdCLGFBSXJCLFFBSFcsT0FBT0EsRUFBWSxhQUFjLFdBQzdDQSxFQUFZLFlBQ1osMEJBQ2tCLFdBQVdDLEVBQXlCRCxFQUFZLElBQUksQ0FBQyxLQUUxRTtBQUNYO0FBQ0EsU0FBU0UsR0FBcUJDLEdBQU1SLEdBQU87QUFDdkMsUUFBTVMsSUFBVVYsRUFBZUMsQ0FBSztBQUNwQyxNQUFJLGNBQWMsS0FBS1MsQ0FBTztBQUMxQixXQUFPLGdCQUFnQkQsQ0FBSTtBQUUvQixNQUFJLGVBQWUsS0FBS0MsQ0FBTztBQUMzQixXQUFPLGdCQUFnQkQsQ0FBSTtBQUUvQixNQUFJLHNEQUFzRCxLQUFLQyxDQUFPO0FBQ2xFLFdBQU8sZ0JBQWdCRCxDQUFJO0FBRS9CLE1BQUksbURBQW1ELEtBQUtDLENBQU87QUFDL0QsV0FBTyxnQkFBZ0JELENBQUk7QUFFL0IsUUFBTUUsSUFBT1YsYUFBaUIsUUFBUUEsRUFBTSxPQUFPLE9BQU9BO0FBQzFELFNBQU8sNkJBQTZCUSxDQUFJLE9BQU9FLENBQUk7QUFDdkQ7QUFDQSxTQUFTQyxHQUFxQkMsR0FBVTtBQUNwQyxRQUFNQyxJQUFlRCxFQUFTLFVBQVM7QUFDdkMsTUFBSUMsRUFBYSxXQUFXcEIsQ0FBVztBQUNuQyxXQUFPcUIsRUFBbUJELENBQVk7QUFFMUMsTUFBSUU7QUFDSixNQUFJO0FBQ0EsSUFBQUEsSUFBVSxLQUFLLE1BQU1ILENBQVE7QUFBQSxFQUNqQyxTQUNPWixHQUFPO0FBQ1YsV0FBTztBQUFBLE1BQ0gsSUFBSTtBQUFBLE1BQ0osT0FBTyw2QkFBNkJELEVBQWVDLENBQUssQ0FBQztBQUFBLElBQ3JFO0FBQUEsRUFDSTtBQUNBLFNBQU9nQixHQUF1QkQsQ0FBTztBQUN6QztBQUNBLFNBQVNDLEdBQXVCRCxHQUFTO0FBQ3JDLE1BQUksT0FBT0EsS0FBWTtBQUNuQixXQUFPRCxFQUFtQkMsQ0FBTztBQUVyQyxNQUFJLE1BQU0sUUFBUUEsQ0FBTztBQUNyQixXQUFPRSxFQUEwQkYsQ0FBTztBQUU1QyxNQUFJLENBQUNYLEVBQVNXLENBQU87QUFDakIsV0FBTztBQUFBLE1BQ0gsSUFBSTtBQUFBLE1BQ0osT0FBTztBQUFBLElBQ25CO0FBRUksTUFBSSxPQUFPQSxFQUFRLFNBQVU7QUFDekIsV0FBT0QsRUFBbUJDLEVBQVEsS0FBSztBQUUzQyxNQUFJLE1BQU0sUUFBUUEsRUFBUSxPQUFPLEdBQUc7QUFDaEMsVUFBTSxDQUFDRyxHQUFhQyxDQUFLLElBQUlKLEVBQVE7QUFDckMsUUFBSUcsTUFBZ0IsaUJBQWlCLE9BQU9DLEtBQVU7QUFDbEQsYUFBT0wsRUFBbUJLLENBQUs7QUFBQSxFQUV2QztBQUNBLFNBQUksTUFBTSxRQUFRSixFQUFRLFVBQVUsSUFDekJFLEVBQTBCRixFQUFRLFVBQVUsSUFFbkRBLEVBQVEsY0FBYyxTQUNmRSxFQUEwQixDQUFDRixFQUFRLFNBQVMsQ0FBQyxJQUVqREUsRUFBMEIsQ0FBQ0YsQ0FBTyxDQUFDO0FBQzlDO0FBQ0EsU0FBU0UsRUFBMEJHLEdBQVU7QUFDekMsUUFBTUMsSUFBYSxDQUFBO0FBQ25CLGFBQVdOLEtBQVdLLEdBQVU7QUFDNUIsVUFBTUUsSUFBU0MsRUFBb0IsVUFBVVIsQ0FBTztBQUNwRCxRQUFJLENBQUNPLEVBQU87QUFDUixhQUFPO0FBQUEsUUFDSCxJQUFJO0FBQUEsUUFDSixPQUFPLGtDQUFrQ0EsRUFBTyxNQUFNLE9BQU87QUFBQSxNQUM3RTtBQUVRLElBQUFELEVBQVcsS0FBS0MsRUFBTyxJQUFJO0FBQUEsRUFDL0I7QUFDQSxTQUFJRCxFQUFXLFdBQVcsSUFDZixFQUFFLElBQUksSUFBTyxPQUFPLCtDQUE4QyxJQUV0RSxFQUFFLElBQUksSUFBTSxZQUFBQSxFQUFVO0FBQ2pDO0FBQ0EsU0FBU1AsRUFBbUJVLEdBQVU7QUFDbEMsUUFBTUMsSUFBUUQsRUFBUyxNQUFNLE9BQU87QUFJcEMsTUFISUMsRUFBTSxHQUFHLEVBQUUsTUFBTSxNQUNqQkEsRUFBTSxJQUFHLEdBRVRBLEVBQU0sQ0FBQyxNQUFNaEM7QUFDYixXQUFPO0FBQUEsTUFDSCxJQUFJO0FBQUEsTUFDSixPQUFPLHNDQUFzQ0EsQ0FBVztBQUFBLElBQ3BFO0FBRUksTUFBSWdDLEVBQU0sU0FBUyxLQUFLQSxFQUFNLEdBQUcsRUFBRSxNQUFNL0I7QUFDckMsV0FBTztBQUFBLE1BQ0gsSUFBSTtBQUFBLE1BQ0osT0FBTyxvQ0FBb0NBLENBQVM7QUFBQSxJQUNoRTtBQUVJLFFBQU0yQixJQUFhLENBQUE7QUFDbkIsTUFBSW5DLElBQVE7QUFDWixTQUFPQSxJQUFRdUMsRUFBTSxTQUFTLEtBQUc7QUFDN0IsVUFBTUMsSUFBT0QsRUFBTXZDLENBQUs7QUFDeEIsUUFBSW9DO0FBQ0osUUFBSUksRUFBSyxXQUFXL0IsQ0FBUTtBQUN4QixNQUFBMkIsSUFBU0ssR0FBa0JGLEdBQU92QyxDQUFLO0FBQUEsYUFFbEN3QyxFQUFLLFdBQVc5QixDQUFXO0FBQ2hDLE1BQUEwQixJQUFTTSxHQUFxQkgsR0FBT3ZDLENBQUs7QUFBQSxhQUVyQ3dDLEVBQUssV0FBVzdCLENBQVc7QUFDaEMsTUFBQXlCLElBQVNPLEdBQXFCSixHQUFPdkMsQ0FBSztBQUFBO0FBRzFDLGFBQU87QUFBQSxRQUNILElBQUk7QUFBQSxRQUNKLE9BQU8sOENBQThDd0MsQ0FBSTtBQUFBLE1BQ3pFO0FBRVEsUUFBSSxXQUFXSjtBQUNYLGFBQU8sRUFBRSxJQUFJLElBQU8sT0FBT0EsRUFBTyxNQUFLO0FBRTNDLElBQUFELEVBQVcsS0FBS0MsRUFBTyxTQUFTLEdBQ2hDcEMsSUFBUW9DLEVBQU87QUFBQSxFQUNuQjtBQUNBLFNBQUlELEVBQVcsV0FBVyxJQUNmO0FBQUEsSUFDSCxJQUFJO0FBQUEsSUFDSixPQUFPO0FBQUEsRUFDbkIsSUFFVyxFQUFFLElBQUksSUFBTSxZQUFBQSxFQUFVO0FBQ2pDO0FBQ0EsU0FBU00sR0FBa0JGLEdBQU92QyxHQUFPO0FBQ3JDLFFBQU1zQixJQUFPc0IsRUFBaUJMLEVBQU12QyxDQUFLLEdBQUdTLENBQVE7QUFDcEQsTUFBSSxDQUFDYTtBQUNELFdBQU8sRUFBRSxPQUFPLHVDQUF1Q2lCLEVBQU12QyxDQUFLLENBQUMsR0FBRTtBQUV6RSxFQUFBQSxLQUFTO0FBQ1QsUUFBTTZDLElBQVksQ0FBQTtBQUNsQixTQUFPN0MsSUFBUXVDLEVBQU0sU0FBUyxLQUFLLENBQUNPLEVBQXNCUCxFQUFNdkMsQ0FBSyxDQUFDLEtBQUc7QUFDckUsVUFBTXdDLElBQU9ELEVBQU12QyxDQUFLO0FBQ3hCLFFBQUksQ0FBQ3dDLEVBQUssV0FBVyxHQUFHO0FBQ3BCLGFBQU8sRUFBRSxPQUFPLDBCQUEwQkEsQ0FBSSxHQUFFO0FBRXBELElBQUFLLEVBQVUsS0FBS0wsQ0FBSSxHQUNuQnhDLEtBQVM7QUFBQSxFQUNiO0FBQ0EsU0FBSTZDLEVBQVUsV0FBVyxJQUNkO0FBQUEsSUFDSCxPQUFPLHNCQUFzQnZCLENBQUk7QUFBQSxFQUM3QyxJQUVXO0FBQUEsSUFDSCxXQUFXO0FBQUEsTUFDUCxNQUFNO0FBQUEsTUFDTixNQUFBQTtBQUFBLE1BQ0EsTUFBTXlCLEVBQVNGLENBQVM7QUFBQSxJQUNwQztBQUFBLElBQ1EsV0FBVzdDO0FBQUEsRUFDbkI7QUFDQTtBQUNBLFNBQVMwQyxHQUFxQkgsR0FBT3ZDLEdBQU87QUFDeEMsUUFBTXNCLElBQU9zQixFQUFpQkwsRUFBTXZDLENBQUssR0FBR1UsQ0FBVztBQUN2RCxTQUFLWSxLQUdMdEIsS0FBUyxHQUNMQSxJQUFRdUMsRUFBTSxTQUFTLEtBQUssQ0FBQ08sRUFBc0JQLEVBQU12QyxDQUFLLENBQUMsSUFDeEQsRUFBRSxPQUFPLHlCQUF5QnNCLENBQUksNEJBQTJCLElBRXJFO0FBQUEsSUFDSCxXQUFXO0FBQUEsTUFDUCxNQUFNO0FBQUEsTUFDTixNQUFBQTtBQUFBLElBQ1o7QUFBQSxJQUNRLFdBQVd0QjtBQUFBLEVBQ25CLEtBWmUsRUFBRSxPQUFPLHVDQUF1Q3VDLEVBQU12QyxDQUFLLENBQUMsR0FBRTtBQWE3RTtBQUNBLFNBQVMyQyxHQUFxQkosR0FBT3ZDLEdBQU87QUFDeEMsUUFBTXNCLElBQU9zQixFQUFpQkwsRUFBTXZDLENBQUssR0FBR1csQ0FBVztBQUN2RCxNQUFJLENBQUNXO0FBQ0QsV0FBTyxFQUFFLE9BQU8sdUNBQXVDaUIsRUFBTXZDLENBQUssQ0FBQyxHQUFFO0FBRXpFLEVBQUFBLEtBQVM7QUFDVCxNQUFJZ0Q7QUFDSixNQUFJaEQsSUFBUXVDLEVBQU0sU0FBUyxLQUFLQSxFQUFNdkMsQ0FBSyxFQUFFLFdBQVdZLENBQU8sR0FBRztBQUM5RCxVQUFNcUMsSUFBZUwsRUFBaUJMLEVBQU12QyxDQUFLLEdBQUdZLENBQU87QUFDM0QsUUFBSSxDQUFDcUM7QUFDRCxhQUFPLEVBQUUsT0FBTyx1Q0FBdUNWLEVBQU12QyxDQUFLLENBQUMsR0FBRTtBQUV6RSxJQUFBZ0QsSUFBU0MsR0FDVGpELEtBQVM7QUFBQSxFQUNiO0FBQ0EsUUFBTTZDLElBQVksQ0FBQTtBQUNsQixTQUFPN0MsSUFBUXVDLEVBQU0sU0FBUyxLQUFLLENBQUNPLEVBQXNCUCxFQUFNdkMsQ0FBSyxDQUFDO0FBQ2xFLElBQUE2QyxFQUFVLEtBQUtOLEVBQU12QyxDQUFLLENBQUMsR0FDM0JBLEtBQVM7QUFFYixTQUFJNkMsRUFBVSxXQUFXLEtBQUssQ0FBQ0csSUFDcEIsRUFBRSxPQUFPLHlCQUF5QjFCLENBQUksd0JBQXVCLElBRWpFO0FBQUEsSUFDSCxXQUFXO0FBQUEsTUFDUCxNQUFNO0FBQUEsTUFDTixNQUFBQTtBQUFBLE1BQ0EsTUFBTXVCLEVBQVUsU0FBUyxJQUFJRSxFQUFTRixDQUFTLElBQUk7QUFBQSxNQUNuRCxHQUFJRyxJQUFTLEVBQUUsUUFBQUEsRUFBTSxJQUFLO0lBQ3RDO0FBQUEsSUFDUSxXQUFXaEQ7QUFBQSxFQUNuQjtBQUNBO0FBQ0EsU0FBUzRDLEVBQWlCSixHQUFNVSxHQUFRO0FBQ3BDLFFBQU01QixJQUFPa0IsRUFBSyxNQUFNVSxFQUFPLE1BQU0sRUFBRSxLQUFJO0FBQzNDLFNBQU81QixLQUFjO0FBQ3pCO0FBQ0EsU0FBU3dCLEVBQXNCTixHQUFNO0FBQ2pDLFNBQVFBLEVBQUssV0FBVy9CLENBQVEsS0FDNUIrQixFQUFLLFdBQVc5QixDQUFXLEtBQzNCOEIsRUFBSyxXQUFXN0IsQ0FBVztBQUNuQztBQUNBLFNBQVNvQyxFQUFTUixHQUFPO0FBQ3JCLFNBQU8sR0FBR0EsRUFBTSxLQUFLO0FBQUEsQ0FBSSxDQUFDO0FBQUE7QUFDOUI7QUFDQSxlQUFlWSxHQUFvQkMsR0FBUUMsR0FBV0MsR0FBWTtBQUM5RCxNQUFJQztBQUNKLE1BQUk7QUFDQSxZQUFRRixFQUFVLE1BQUk7QUFBQSxNQUNsQixLQUFLO0FBQ0QsUUFBQUUsSUFBUyxNQUFNSCxFQUFPLFdBQVdDLEdBQVcsRUFBRSxZQUFBQyxFQUFVLENBQUU7QUFDMUQ7QUFBQSxNQUNKLEtBQUs7QUFDRCxRQUFBQyxJQUFTLE1BQU1ILEVBQU8sV0FBV0MsR0FBVyxFQUFFLFlBQUFDLEVBQVUsQ0FBRTtBQUMxRDtBQUFBLE1BQ0osS0FBSztBQUNELFFBQUFDLElBQVMsTUFBTUgsRUFBTyxXQUFXQyxHQUFXLEVBQUUsWUFBQUMsRUFBVSxDQUFFO0FBQzFEO0FBQUEsTUFDSjtBQUNJLGVBQU87QUFBQSxJQUN2QjtBQUFBLEVBQ0ksU0FDT3hDLEdBQU87QUFDVixXQUFPLDBCQUEwQkQsRUFBZUMsQ0FBSyxDQUFDO0FBQUEsRUFDMUQ7QUFDQSxVQUFJeUMsS0FBQSxnQkFBQUEsRUFBUSxZQUFXLFdBQ1pBLEVBQU8sU0FBUyxpQkFBaUJBLEVBQU8sTUFBTSxLQUFLLG1CQUV2REEsS0FBQSxnQkFBQUEsRUFBUSxXQUFVO0FBQzdCO0FBQ0EsZUFBZUMsR0FBcUJKLEdBQVFqQixHQUFZbUIsR0FBWTtBQUNoRSxRQUFNRyxJQUFVLENBQUE7QUFDaEIsYUFBV0osS0FBYWxCLEdBQVk7QUFDaEMsVUFBTW5CLElBQVMsTUFBTW1DLEdBQW9CQyxHQUFRQyxHQUFXQyxDQUFVO0FBQ3RFLElBQUl0QyxLQUNBeUMsRUFBUSxLQUFLekMsQ0FBTTtBQUFBLEVBRTNCO0FBQ0EsU0FBT3lDLEVBQVEsS0FBSztBQUFBLENBQUksS0FBSztBQUNqQztBQUNBLFNBQVNDLEdBQXVCTixHQUFRO0FBa0JwQyxTQWpCcUI7QUFBQSxJQUNqQixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixhQUFhO0FBQUEsSUFDYixZQUFZOUM7QUFBQSxJQUNaLFFBQVE7QUFBQSxJQUNSLGNBQWM7QUFBQSxJQUNkLGVBQWUsWUFBWTtBQUFBLElBQzNCLFdBQVcsWUFBWTtBQUFBLElBQ3ZCLFFBQVEsT0FBT2dELEdBQVlLLE1BQVU7QUFDakMsWUFBTXZCLElBQVNYLEdBQXFCa0MsQ0FBSztBQUN6QyxhQUFLdkIsRUFBTyxLQUdMLE1BQU1vQixHQUFxQkosR0FBUWhCLEVBQU8sWUFBWWtCLENBQVUsSUFGNURsQixFQUFPO0FBQUEsSUFHdEI7QUFBQSxFQUNSO0FBRUE7QUFDQSxNQUFNd0IsV0FBNkJqRSxFQUFXO0FBQUEsRUFHMUMsWUFBWU8sSUFBTyxJQUFJO0FBQ25CLFVBQUs7QUFIVCxJQUFBbkIsRUFBQSxjQUFPO0FBQ1AsSUFBQUEsRUFBQTtBQUdJLFNBQUssaUJBQWlCbUIsRUFBSztBQUFBLEVBQy9CO0FBQUEsRUFDQSxRQUFROztBQUNKLFVBQU0yRCxJQUFVQyxFQUFvQixLQUFLLE1BQU0sS0FBSyxRQUFRLEdBQ3REVixLQUFTVyxJQUFBRixFQUFRLGlCQUFSLGdCQUFBRSxFQUFBLEtBQUFGLEdBQXVCLEtBQUs7QUFDM0MsUUFBSSxDQUFDVDtBQUNELFlBQU0sSUFBSVksRUFBVSwwREFBMEQ7QUFFbEYsVUFBTUMsSUFBUSxDQUFBLEdBQ1JDLElBQVksT0FBTzVDLE1BQVM7QUFDOUIsVUFBSSxDQUFDdUMsRUFBUTtBQUNULGNBQU0sSUFBSUcsRUFBVSx1REFBdUQ7QUFFL0UsVUFBSTtBQUNBLGVBQU8sTUFBTUcsRUFBZ0Isc0JBQXNCO0FBQUEsVUFDL0MsTUFBQTdDO0FBQUEsVUFDQSxRQUFRLEtBQUs7QUFBQSxRQUNqQyxHQUFtQixZQUFZLE1BQU11QyxFQUFRLFVBQVU7QUFBQSxVQUNuQyxNQUFBdkM7QUFBQSxVQUNBLE9BQU8sS0FBSztBQUFBLFFBQ2hDLENBQWlCLENBQUM7QUFBQSxNQUNOLFNBQ09SLEdBQU87QUFDVixlQUFPTyxHQUFxQkMsR0FBTVIsQ0FBSztBQUFBLE1BQzNDO0FBQUEsSUFDSjtBQUNBLFdBQUlwQyxFQUFzQyxLQUFLLGNBQWMsSUFDekR1RixFQUFNLEtBQUtHLEVBQUs7QUFBQSxNQUNaLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLFlBQVlDLEVBQVM7QUFBQSxRQUNqQixNQUFNQyxFQUFRLEVBQUcsU0FBUyx3Q0FBd0M7QUFBQSxNQUN0RixDQUFpQjtBQUFBLE1BQ0QsU0FBUyxPQUFPLEVBQUUsTUFBQWhELEVBQUksTUFBUSxNQUFNNEMsRUFBVTVDLENBQUk7QUFBQSxJQUNsRSxDQUFhLENBQUMsSUFHRjJDLEVBQU0sS0FBS0csRUFBSztBQUFBLE1BQ1osTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsWUFBWUMsRUFBUztBQUFBLFFBQ2pCLE1BQU1DLEVBQVEsRUFBRyxTQUFTLHdDQUF3QztBQUFBLE1BQ3RGLENBQWlCO0FBQUEsTUFDRCxTQUFTLE9BQU8sRUFBRSxNQUFBaEQsRUFBSSxNQUFPUCxHQUE0QixNQUFNbUQsRUFBVTVDLENBQUksQ0FBQztBQUFBLElBQzlGLENBQWEsQ0FBQyxHQUVGN0MsRUFBNEIsS0FBSyxjQUFjLElBQy9Dd0YsRUFBTSxLQUFLTSxFQUFlO0FBQUEsTUFDdEIsTUFBTTtBQUFBLE1BQ04sUUFBQW5CO0FBQUEsSUFDaEIsQ0FBYSxDQUFDLElBR0ZhLEVBQU0sS0FBS1AsR0FBdUJOLENBQU0sQ0FBQyxHQUV0QyxLQUFLLGlCQUFpQixLQUFLLGVBQWUsQ0FBQyxHQUFHYSxDQUFLLENBQUMsSUFBSUE7QUFBQSxFQUNuRTtBQUNKO0FBQ08sU0FBU08sR0FBV3RFLElBQU8sSUFBSTtBQUNsQyxTQUFPLElBQUkwRCxHQUFxQjFELENBQUk7QUFDeEM7QUNyYkEsTUFBTXVFLEtBQTZCLEtBQzdCQyxLQUFvQyxLQUNwQ0MsS0FBcUI7QUFBQSxFQUN2QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0osRUFBRSxLQUFLO0FBQUEsQ0FBSTtBQUNYLE1BQU1DLFdBQXdCakYsRUFBVztBQUFBLEVBR3JDLFlBQVlPLElBQU8sSUFBSTtBQUNuQixVQUFLO0FBSFQsSUFBQW5CLEVBQUEsY0FBTztBQUNQLElBQUFBLEVBQUE7QUFHSSxTQUFLLGlCQUFpQm1CLEVBQUs7QUFBQSxFQUMvQjtBQUFBLEVBQ0EsUUFBUTs7QUFDSixVQUFNMkQsSUFBVUMsRUFBb0IsS0FBSyxNQUFNLEtBQUssUUFBUTtBQUM1RCxRQUFJLENBQUNELEVBQVE7QUFDVCxZQUFNLElBQUlHLEVBQVUsb0RBQW9EO0FBRTVFLFVBQU1DLElBQVE7QUFBQSxNQUNWRyxFQUFLO0FBQUEsUUFDRCxNQUFNO0FBQUEsUUFDTixhQUFhO0FBQUEsUUFDYixZQUFZQyxFQUFTO0FBQUEsVUFDakIsS0FBS0MsRUFBUSxFQUFHLElBQUksQ0FBQyxFQUFFLFNBQVMsMkJBQTJCO0FBQUEsVUFDM0QsU0FBU08sRUFDRSxFQUNOLFNBQVEsRUFDUixTQUFTLDZFQUE2RTtBQUFBLFVBQzNGLE9BQU9BLEVBQ0ksRUFDTixTQUFRLEVBQ1IsU0FBUywrREFBK0Q7QUFBQSxVQUM3RSxPQUFPQyxFQUNLLEVBQ1AsUUFBUSxFQUFJLEVBQ1osU0FBUyxrRUFBa0U7QUFBQSxVQUNoRixLQUFLQSxFQUNPLEVBQ1AsUUFBUSxFQUFLLEVBQ2IsU0FBUywrSEFBK0g7QUFBQSxVQUM3SSxlQUFlQyxFQUNKLEVBQ04sSUFBRyxFQUNILElBQUksQ0FBQyxFQUNMLFFBQVFOLEVBQTBCLEVBQ2xDLFNBQVMsZ0VBQWdFO0FBQUEsVUFDOUUsbUJBQW1CTSxFQUNSLEVBQ04sSUFBRyxFQUNILElBQUksQ0FBQyxFQUNMLFNBQVEsRUFDUixTQUFTLHNFQUFzRTtBQUFBLFFBQ3hHLENBQWlCO0FBQUEsUUFDRCxTQUFTLE9BQU8sRUFBRSxLQUFBQyxHQUFLLFNBQUFDLEdBQVMsT0FBQUMsR0FBTyxPQUFBQyxHQUFPLEtBQUFDLEdBQUssZUFBQUMsR0FBZSxtQkFBQUMsRUFBaUIsTUFBUSxNQUFNbkIsRUFBZ0IsZ0JBQWdCO0FBQUEsVUFDN0gsS0FBQWE7QUFBQSxVQUNBLFNBQUFDO0FBQUEsVUFDQSxPQUFBQztBQUFBLFVBQ0EsT0FBQUM7QUFBQSxVQUNBLEtBQUFDO0FBQUEsVUFDQSxRQUFRLEtBQUs7QUFBQSxRQUNqQyxHQUFtQixZQUFZLE1BQU12QixFQUFRLFlBQVk7QUFBQSxVQUNyQyxLQUFBbUI7QUFBQSxVQUNBLFNBQUFDO0FBQUEsVUFDQSxPQUFBQztBQUFBLFVBQ0EsT0FBQUM7QUFBQSxVQUNBLEtBQUFDO0FBQUEsVUFDQSxhQUFhQztBQUFBLFVBQ2IsaUJBQWlCQztBQUFBLFVBQ2pCLE9BQU8sS0FBSztBQUFBLFFBQ2hDLENBQWlCLENBQUM7QUFBQSxNQUNsQixDQUFhO0FBQUEsSUFDYjtBQUNRLFlBQUl2QixJQUFBRixFQUFRLGdCQUFSLFFBQUFFLEVBQUEsS0FBQUYsTUFBMkJBLEVBQVEsY0FDbkNJLEVBQU0sS0FBS0csRUFBSztBQUFBLE1BQ1osTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsWUFBWUMsRUFBUztBQUFBLFFBQ2pCLFlBQVlVLEVBQ0QsRUFDTixJQUFHLEVBQ0gsU0FBUyxpREFBaUQ7QUFBQSxRQUMvRCxPQUFPRixFQUNJLEVBQ04sUUFBUSxFQUFFLEVBQ1YsU0FBUyxpREFBaUQ7QUFBQSxRQUMvRCxlQUFlRSxFQUNKLEVBQ04sSUFBRyxFQUNILElBQUksQ0FBQyxFQUNMLFFBQVFMLEVBQWlDLEVBQ3pDLFNBQVMsZ0VBQWdFO0FBQUEsUUFDOUUsbUJBQW1CSyxFQUNSLEVBQ04sSUFBRyxFQUNILElBQUksQ0FBQyxFQUNMLFNBQVEsRUFDUixTQUFTLHNFQUFzRTtBQUFBLE1BQ3hHLENBQWlCO0FBQUEsTUFDRCxTQUFTLE9BQU8sRUFBRSxZQUFBUSxHQUFZLE9BQUFDLEdBQU8sZUFBQUgsR0FBZSxtQkFBQUMsRUFBaUIsTUFBUSxNQUFNbkIsRUFBZ0IsdUJBQXVCO0FBQUEsUUFDdEgsWUFBQW9CO0FBQUEsTUFDcEIsR0FBbUIsWUFBWSxNQUFNMUIsRUFBUSxXQUFXO0FBQUEsUUFDcEMsV0FBVzBCO0FBQUEsUUFDWCxPQUFBQztBQUFBLFFBQ0EsYUFBYUg7QUFBQSxRQUNiLGlCQUFpQkM7QUFBQSxNQUNyQyxDQUFpQixDQUFDO0FBQUEsSUFDbEIsQ0FBYSxDQUFDLEdBRUMsS0FBSyxpQkFBaUIsS0FBSyxlQUFlLENBQUMsR0FBR3JCLENBQUssQ0FBQyxJQUFJQTtBQUFBLEVBQ25FO0FBQUEsRUFDQSxlQUFlO0FBQ1gsV0FBT1U7QUFBQSxFQUNYO0FBQ0o7QUFDTyxTQUFTTyxHQUFNaEYsSUFBTyxJQUFJO0FBQzdCLFNBQU8sSUFBSTBFLEdBQWdCMUUsQ0FBSTtBQUNuQztBQzhCNkJ1RjtBQUFBO0FBQUE7QUFHS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtQktBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FDdkt2QyxTQUFTQyxLQUFzQjtBQUMzQixTQUFPLENBQUNsQixHQUFVLEdBQUlVLEdBQUssR0FBSWpGLEdBQVUsQ0FBRTtBQUMvQztBQUNPLE1BQU0wRixLQUFlO0FBQUEsRUFDeEIsU0FBU0Q7QUFDYjs7QUNWTyxNQUFNRSxXQUFxQkMsSUFBQUMsR0FDN0IvQixJQUFBZ0MsR0FENkJGLEdBQU07QUFBQSxFQU9wQyxZQUFZRyxHQUFRO0FBQ2hCLFVBQU1BLENBQU07QUFQaEIsSUFBQWpILEVBQUEsTUFBQ2dGLEdBQXVCO0FBQ3hCLElBQUFoRixFQUFBO0FBQ0EsSUFBQUEsRUFBQTtBQUNBLElBQUFBLEVBQUE7QUFDQSxJQUFBQSxFQUFBO0FBQ0EsSUFBQUEsRUFBQTtBQUdRLFFBQUFpSCxFQUFPLHFCQUFxQixVQUM1QixPQUFPQSxFQUFPLG9CQUFxQixZQUNuQyxPQUFPQSxFQUFPLG9CQUFxQjtBQUNuQyxZQUFNLElBQUksVUFBVSw2REFBNkQ7QUFFckYsU0FBSyxrQkFBa0JBLEVBQU8sa0JBQ3hCQyxFQUFjRCxFQUFPLGVBQWUsSUFDcEMsUUFDTixLQUFLLG1CQUFtQkEsRUFBTyxrQkFDL0IsS0FBSyxlQUFlQSxFQUFPLGdCQUFnQkwsR0FBYSxRQUFPLEdBQy9ELEtBQUssUUFBUU8sR0FBZUYsRUFBTyxLQUFLLEdBQ3hDLEtBQUssa0JBQWtCLEtBQUssbUJBQW1CLElBQUlHLEVBQVE7QUFBQSxFQUMvRDtBQUFBLEVBQ0EsTUFBTUgsR0FBUTtBQUNWLFdBQU8sSUFBSUosRUFBYTtBQUFBLE1BQ3BCLE1BQU1JLEVBQU8sUUFBUSxLQUFLO0FBQUEsTUFDMUIsY0FBY0EsRUFBTyxnQkFBZ0IsS0FBSztBQUFBLE1BQzFDLFFBQVFBLEVBQU8sVUFBVSxLQUFLO0FBQUEsTUFDOUIsb0JBQW9CQSxFQUFPLHNCQUFzQixLQUFLO0FBQUEsTUFDdEQsVUFBVUEsRUFBTyxZQUFZLEtBQUs7QUFBQSxNQUNsQyxPQUFPQSxFQUFPLFNBQVMsS0FBSztBQUFBLE1BQzVCLGVBQWVBLEVBQU8saUJBQWlCLEtBQUs7QUFBQSxNQUM1QyxPQUFPQSxFQUFPLFNBQVMsS0FBSztBQUFBLE1BQzVCLFlBQVlBLEVBQU8sY0FBYyxLQUFLO0FBQUEsTUFDdEMsaUJBQWlCQSxFQUFPLG1CQUFtQixLQUFLO0FBQUEsTUFDaEQsa0JBQWtCQSxFQUFPLG9CQUFvQixLQUFLO0FBQUEsTUFDbEQsWUFBWUEsRUFBTyxjQUFjLEtBQUs7QUFBQSxNQUN0QyxpQkFBaUJBLEVBQU8sbUJBQW1CLEtBQUs7QUFBQSxNQUNoRCxpQkFBaUJBLEVBQU8sbUJBQW1CLEtBQUs7QUFBQSxNQUNoRCxpQkFBaUJBLEVBQU8sbUJBQW1CLEtBQUs7QUFBQSxNQUNoRCxrQkFBa0JBLEVBQU8sb0JBQW9CLEtBQUs7QUFBQSxNQUNsRCxjQUFjQSxFQUFPLGdCQUFnQixLQUFLO0FBQUEsTUFDMUMsT0FBT0EsRUFBTyxTQUFTLEtBQUs7QUFBQSxJQUN4QyxDQUFTO0FBQUEsRUFDTDtBQUNKO0FBQ0EsU0FBU0UsR0FBZUUsR0FBTztBQUMzQixNQUFJQSxNQUFVLFFBR2Q7QUFBQSxRQUFJLE9BQU9BLEtBQVUsVUFBVTtBQUMzQixZQUFNakcsSUFBVWlHLEVBQU0sS0FBSTtBQUMxQixVQUFJLENBQUNqRztBQUNELGNBQU0sSUFBSSxVQUFVLHVDQUF1QztBQUUvRCxhQUFPQTtBQUFBLElBQ1g7QUFDQSxXQUFPa0csRUFBY0QsQ0FBSztBQUFBO0FBQzlCOyJ9