@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.
- package/dist/bundle/agent-C8M7S25V.mjs +637 -0
- package/dist/bundle/index-B8JqVS66.mjs +21955 -0
- package/dist/bundle/openai-realtime-agents.mjs +18 -16570
- package/dist/bundle/openai-realtime-agents.umd.js +1635 -29
- package/dist/metadata.js +2 -2
- package/dist/metadata.mjs +2 -2
- package/package.json +2 -2
|
@@ -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/PyB0aGlzLmNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIHJ1bkFzOiBjb25maWcucnVuQXMgPz8gdGhpcy5ydW5BcyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplUnVuQXMocnVuQXMpIHtcbiAgICBpZiAocnVuQXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJ1bkFzID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gcnVuQXMudHJpbSgpO1xuICAgICAgICBpZiAoIXRyaW1tZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1NhbmRib3hBZ2VudCBydW5BcyBtdXN0IGJlIG5vbi1lbXB0eS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJpbW1lZDtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVVzZXIocnVuQXMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWdlbnQubWpzLm1hcCJdLCJuYW1lcyI6WyJzdXBwb3J0c1Jlc3BvbnNlc0NvbXBhY3Rpb25UcmFuc3BvcnQiLCJtb2RlbEluc3RhbmNlIiwic3VwcG9ydHNBcHBseVBhdGNoVHJhbnNwb3J0Iiwic3VwcG9ydHNTdHJ1Y3R1cmVkVG9vbE91dHB1dFRyYW5zcG9ydCIsIkNvbXBhY3Rpb25Qb2xpY3kiLCJEeW5hbWljQ29tcGFjdGlvblBvbGljeSIsInRocmVzaG9sZFJhdGlvIiwiZmFsbGJhY2tUaHJlc2hvbGQiLCJfX3B1YmxpY0ZpZWxkIiwibW9kZWwiLCJtb2RlbEluZm8iLCJDb21wYWN0aW9uTW9kZWxJbmZvIiwiY29udGV4dFdpbmRvdyIsImNhbmRpZGF0ZSIsImdldFNhbmRib3hDb21wYWN0aW9uTW9kZWxDYW5kaWRhdGVzIiwiU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMU0iLCJTQU5EQk9YX0NPTlRFWFRfV0lORE9XU180MDBLIiwiU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMjAwSyIsIlNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzEyOEsiLCJDb21wYWN0aW9uQ2FwYWJpbGl0eSIsIkNhcGFiaWxpdHkiLCJwb2xpY3kiLCJzYW1wbGluZ1BhcmFtcyIsImNvbnRleHQiLCJsYXN0Q29tcGFjdGlvbkluZGV4IiwiaW5kZXgiLCJjb21wYWN0aW9uIiwiYXJncyIsInRyaW1tZWQiLCJub3JtYWxpemVkIiwid2l0aG91dFBpbm5lZERhdGUiLCJhcHBseVBhdGNoRnVuY3Rpb25QYXJhbWV0ZXJzIiwiQkVHSU5fUEFUQ0giLCJFTkRfUEFUQ0giLCJBRERfRklMRSIsIkRFTEVURV9GSUxFIiwiVVBEQVRFX0ZJTEUiLCJNT1ZFX1RPIiwidG9FcnJvck1lc3NhZ2UiLCJlcnJvciIsInJlbmRlckltYWdlRm9yVGV4dFRyYW5zcG9ydCIsIm91dHB1dCIsImltYWdlIiwiaXNSZWNvcmQiLCJpbWFnZVJlY29yZCIsImVuY29kZVVpbnQ4QXJyYXlUb0Jhc2U2NCIsInJlbmRlclZpZXdJbWFnZUVycm9yIiwicGF0aCIsIm1lc3NhZ2UiLCJuYW1lIiwicGFyc2VBcHBseVBhdGNoSW5wdXQiLCJyYXdJbnB1dCIsInRyaW1tZWRJbnB1dCIsInBhcnNlRnJlZWZvcm1QYXRjaCIsInBheWxvYWQiLCJwYXJzZUFwcGx5UGF0Y2hQYXlsb2FkIiwicGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyIsImNvbW1hbmROYW1lIiwicGF0Y2giLCJwYXlsb2FkcyIsIm9wZXJhdGlvbnMiLCJwYXJzZWQiLCJBcHBseVBhdGNoT3BlcmF0aW9uIiwicmF3UGF0Y2giLCJsaW5lcyIsImxpbmUiLCJwYXJzZUFkZEZpbGVQYXRjaCIsInBhcnNlRGVsZXRlRmlsZVBhdGNoIiwicGFyc2VVcGRhdGVGaWxlUGF0Y2giLCJwYXJzZVBhdGNoSGVhZGVyIiwiZGlmZkxpbmVzIiwiaXNGaWxlT3BlcmF0aW9uSGVhZGVyIiwiam9pbkRpZmYiLCJtb3ZlVG8iLCJwYXJzZWRNb3ZlVG8iLCJwcmVmaXgiLCJhcHBseVBhdGNoT3BlcmF0aW9uIiwiZWRpdG9yIiwib3BlcmF0aW9uIiwicnVuQ29udGV4dCIsInJlc3VsdCIsImFwcGx5UGF0Y2hPcGVyYXRpb25zIiwib3V0cHV0cyIsImFwcGx5UGF0Y2hGdW5jdGlvblRvb2wiLCJpbnB1dCIsIkZpbGVzeXN0ZW1DYXBhYmlsaXR5Iiwic2Vzc2lvbiIsInJlcXVpcmVCb3VuZFNlc3Npb24iLCJfYSIsIlVzZXJFcnJvciIsInRvb2xzIiwidmlld0ltYWdlIiwid2l0aFNhbmRib3hTcGFuIiwidG9vbCIsInoub2JqZWN0Iiwiei5zdHJpbmciLCJhcHBseVBhdGNoVG9vbCIsImZpbGVzeXN0ZW0iLCJERUZBVUxUX0VYRUNfWUlFTERfVElNRV9NUyIsIkRFRkFVTFRfV1JJVEVfU1RESU5fWUlFTERfVElNRV9NUyIsIlNIRUxMX0lOU1RSVUNUSU9OUyIsIlNoZWxsQ2FwYWJpbGl0eSIsInpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJpbmciLCJ6XG4gICAgICAgICAgICAgICAgICAgICAgICAuYm9vbGVhbiIsInpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5udW1iZXIiLCJjbWQiLCJ3b3JrZGlyIiwic2hlbGwiLCJsb2dpbiIsInR0eSIsInlpZWxkX3RpbWVfbXMiLCJtYXhfb3V0cHV0X3Rva2VucyIsInNlc3Npb25faWQiLCJjaGFycyIsInByb21wdCIsImRlZmF1bHRDYXBhYmlsaXRpZXMiLCJDYXBhYmlsaXRpZXMiLCJTYW5kYm94QWdlbnQiLCJfYiIsIkFnZW50IiwiU0FOREJPWF9BR0VOVF9CUkFORCIsImNvbmZpZyIsImNsb25lTWFuaWZlc3QiLCJub3JtYWxpemVSdW5BcyIsIk1hbmlmZXN0IiwicnVuQXMiLCJub3JtYWxpemVVc2VyIl0sIm1hcHBpbmdzIjoiOzs7O0FBQU8sU0FBU0EsRUFBcUNDLEdBQWU7QUFDaEUsU0FBS0EsSUFTRSxFQU5pQixPQUFPQSxLQUFrQixZQUM3Q0EsS0FDQSxpQkFBaUJBLEtBQ2pCLE9BQU9BLEVBQWMsZUFBZ0IsYUFDbkNBLEVBQWMsWUFBWSxPQUMxQixJQUNrQixTQUFTLGlCQUFpQixJQVJ2QztBQVNmO0FBQ08sU0FBU0MsRUFBNEJELEdBQWU7QUFDdkQsU0FBT0UsRUFBc0NGLENBQWE7QUFDOUQ7QUFDTyxTQUFTRSxFQUFzQ0YsR0FBZTtBQUNqRSxTQUFLQSxJQVNFLEVBTmlCLE9BQU9BLEtBQWtCLFlBQzdDQSxLQUNBLGlCQUFpQkEsS0FDakIsT0FBT0EsRUFBYyxlQUFnQixhQUNuQ0EsRUFBYyxZQUFZLE9BQzFCLElBQ2tCLFNBQVMsaUJBQWlCLElBUnZDO0FBU2Y7QUN4Qk8sTUFBTUcsRUFBaUI7QUFDOUI7QUFXTyxNQUFNQyxXQUFnQ0QsRUFBaUI7QUFBQSxFQUcxRCxZQUFZRSxJQUFpQixLQUFLQyxJQUFvQixNQUFRO0FBQzFELFVBQUs7QUFIVCxJQUFBQyxFQUFBO0FBQ0EsSUFBQUEsRUFBQTtBQUdJLFNBQUssaUJBQWlCRixHQUN0QixLQUFLLG9CQUFvQkM7QUFBQSxFQUM3QjtBQUFBLEVBQ0EsaUJBQWlCRSxHQUFPO0FBQ3BCLFFBQUksQ0FBQ0E7QUFDRCxhQUFPLEtBQUs7QUFFaEIsVUFBTUMsSUFBWUMsRUFBb0IsU0FBU0YsQ0FBSztBQUNwRCxXQUFLQyxJQUdFLEtBQUssTUFBTUEsRUFBVSxnQkFBZ0IsS0FBSyxjQUFjLElBRnBELEtBQUs7QUFBQSxFQUdw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
|