experimental-agent 0.0.2 → 0.0.4
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/README.md +13 -2
- package/dist/agent-workflow.d.mts +11 -3
- package/dist/agent-workflow.d.ts +11 -3
- package/dist/agent-workflow.js +1921 -1144
- package/dist/agent-workflow.mjs +7 -3
- package/dist/chunk-3ODWQVIA.mjs +12 -0
- package/dist/chunk-64THY7Y7.mjs +155 -0
- package/dist/chunk-GSRJYPWF.mjs +284 -0
- package/dist/chunk-HJGPUEFC.mjs +42 -0
- package/dist/chunk-JCPQQWIK.mjs +2057 -0
- package/dist/chunk-JEE2FQ4O.mjs +844 -0
- package/dist/chunk-T7PMZLOX.mjs +79 -0
- package/dist/chunk-TQRCSTCF.mjs +103 -0
- package/dist/chunk-VBLZWXVE.mjs +318 -0
- package/dist/{types-DPXFq_r6.d.ts → client-6g79J0s3.d.mts} +866 -31
- package/dist/{types-DPXFq_r6.d.mts → client-6g79J0s3.d.ts} +866 -31
- package/dist/client-SREKHM6I.mjs +15 -0
- package/dist/client.d.mts +37 -0
- package/dist/client.d.ts +37 -0
- package/dist/client.js +58 -0
- package/dist/client.mjs +30 -0
- package/dist/{client-HUG4HT5L.mjs → handler-36FM5H35.mjs} +4 -5
- package/dist/index.d.mts +3 -4
- package/dist/index.d.ts +3 -4
- package/dist/index.js +3102 -1438
- package/dist/index.mjs +720 -147
- package/dist/lifecycle-workflow.d.mts +3 -10
- package/dist/lifecycle-workflow.d.ts +3 -10
- package/dist/lifecycle-workflow.js +170 -1246
- package/dist/lifecycle-workflow.mjs +5 -41
- package/dist/local-fs-handlers-P4WGW3QY.mjs +235 -0
- package/dist/next/loader.d.mts +14 -0
- package/dist/next/loader.d.ts +14 -0
- package/dist/next/loader.js +206 -0
- package/dist/next/loader.mjs +103 -0
- package/dist/next.d.mts +34 -0
- package/dist/next.d.ts +34 -0
- package/dist/next.js +329 -0
- package/dist/next.mjs +224 -0
- package/dist/process-manager-JAKAXROL.mjs +10 -0
- package/dist/{client-4Y3UPWFR.mjs → sandbox-QAPGBVYM.mjs} +4 -3
- package/dist/storage-Q376OZH3.mjs +20 -0
- package/dist/{vercel-2CFDMEHB.mjs → vercel-LLXAHKVJ.mjs} +3 -1
- package/dist/vercel-sdk-VHKEX2GQ.mjs +8 -0
- package/package.json +32 -19
- package/dist/chunk-24DJSI7C.mjs +0 -374
- package/dist/chunk-4RGMKC2M.mjs +0 -755
- package/dist/chunk-6ICYKNCC.mjs +0 -284
- package/dist/chunk-PGYYQ3WZ.mjs +0 -1088
- package/dist/client-BBpD9kKL.d.ts +0 -193
- package/dist/client-BGJViybU.d.mts +0 -193
- package/dist/lifecycle-workflow-steps-HHN46ZAD.mjs +0 -20
- package/dist/local-BYPFRMLZ.mjs +0 -282
- package/dist/process-manager-H2HF6G4G.mjs +0 -153
- package/dist/sandbox-BFA4ECEQ.mjs +0 -10
- package/dist/storage-2U2QFNWI.mjs +0 -27
- /package/dist/{chunk-36X6L7SK.mjs → chunk-TAXLUVIC.mjs} +0 -0
package/dist/index.mjs
CHANGED
|
@@ -1,97 +1,518 @@
|
|
|
1
|
-
import "./chunk-
|
|
1
|
+
import "./chunk-TAXLUVIC.mjs";
|
|
2
|
+
import {
|
|
3
|
+
STORAGE_RPC_METHODS,
|
|
4
|
+
handleStorageRpc
|
|
5
|
+
} from "./chunk-VBLZWXVE.mjs";
|
|
2
6
|
import {
|
|
3
7
|
getSandbox
|
|
4
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-JEE2FQ4O.mjs";
|
|
5
9
|
import {
|
|
6
10
|
agentMessageHook,
|
|
7
11
|
agentWorkflow,
|
|
12
|
+
approvalHook,
|
|
8
13
|
assembleUIMessages,
|
|
9
|
-
|
|
10
|
-
|
|
14
|
+
builtInTools,
|
|
15
|
+
builtinToolNames,
|
|
16
|
+
computeSessionUsage,
|
|
17
|
+
normalizeSkillsDirs,
|
|
18
|
+
resolveApiUrl
|
|
19
|
+
} from "./chunk-JCPQQWIK.mjs";
|
|
20
|
+
import "./chunk-TQRCSTCF.mjs";
|
|
21
|
+
import "./chunk-64THY7Y7.mjs";
|
|
11
22
|
import {
|
|
12
|
-
|
|
13
|
-
|
|
23
|
+
DEFAULT_NAMESPACE,
|
|
24
|
+
LOCAL_STORAGE_VERSION,
|
|
25
|
+
getStorage
|
|
26
|
+
} from "./chunk-GSRJYPWF.mjs";
|
|
14
27
|
import {
|
|
15
28
|
MessageNotFoundError,
|
|
16
29
|
SandboxError,
|
|
17
30
|
SandboxNotFoundError,
|
|
18
31
|
SessionError,
|
|
19
32
|
SessionNotFoundError,
|
|
20
|
-
StorageError
|
|
21
|
-
|
|
22
|
-
|
|
33
|
+
StorageError
|
|
34
|
+
} from "./chunk-HJGPUEFC.mjs";
|
|
35
|
+
import "./chunk-3ODWQVIA.mjs";
|
|
23
36
|
|
|
24
37
|
// src/client.ts
|
|
25
38
|
import { all } from "better-all";
|
|
26
39
|
import * as errore from "errore";
|
|
27
40
|
import equal from "fast-deep-equal";
|
|
28
|
-
import { ulid } from "ulid";
|
|
41
|
+
import { ulid as ulid2 } from "ulid";
|
|
29
42
|
import { getRun, start } from "workflow/api";
|
|
30
43
|
|
|
31
|
-
// src/
|
|
44
|
+
// src/rpc-dispatch.ts
|
|
32
45
|
import { z } from "zod";
|
|
33
|
-
function
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
function handleOverrideResult(res) {
|
|
47
|
+
if (res === null) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
if (res.ok) {
|
|
51
|
+
return { result: res.result };
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
error: { code: "HANDLER_ERROR", message: res.error },
|
|
55
|
+
status: 400
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async function dispatch(method, params, context, name) {
|
|
59
|
+
const {
|
|
60
|
+
tools,
|
|
61
|
+
hooks,
|
|
62
|
+
needsApproval,
|
|
63
|
+
storageConfig,
|
|
64
|
+
getStorageInstance,
|
|
65
|
+
getStorageHandlers,
|
|
66
|
+
rpc,
|
|
67
|
+
overrides
|
|
68
|
+
} = context;
|
|
69
|
+
switch (method) {
|
|
70
|
+
case "tools.list": {
|
|
71
|
+
const defaultHandler = () => {
|
|
72
|
+
const toolsMap = tools ?? {};
|
|
73
|
+
const result = Object.entries(toolsMap).map(([name2, t]) => ({
|
|
74
|
+
name: name2,
|
|
75
|
+
description: t.description,
|
|
76
|
+
inputSchema: schemaToJsonSchema(t.inputSchema)
|
|
77
|
+
}));
|
|
78
|
+
return { result };
|
|
79
|
+
};
|
|
80
|
+
const override = overrides?.["tools.list"];
|
|
81
|
+
try {
|
|
82
|
+
const overrideResult = await override?.({});
|
|
83
|
+
if (overrideResult) {
|
|
84
|
+
const handled = handleOverrideResult(overrideResult);
|
|
85
|
+
if (handled) {
|
|
86
|
+
return handled;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return defaultHandler();
|
|
90
|
+
} catch (e) {
|
|
91
|
+
return {
|
|
92
|
+
error: {
|
|
93
|
+
code: "HANDLER_ERROR",
|
|
94
|
+
message: e instanceof Error ? e.message : String(e)
|
|
95
|
+
},
|
|
96
|
+
status: 500
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
case "tools.needsApproval": {
|
|
101
|
+
const p = params;
|
|
102
|
+
const defaultHandler = async () => {
|
|
103
|
+
const toolsMap = tools ?? {};
|
|
104
|
+
const toolDef = toolsMap[p.toolName];
|
|
105
|
+
if (toolDef?.needsApproval != null) {
|
|
106
|
+
if (typeof toolDef.needsApproval === "boolean") {
|
|
107
|
+
return { result: toolDef.needsApproval };
|
|
108
|
+
}
|
|
109
|
+
const result2 = await toolDef.needsApproval(p.input, {
|
|
110
|
+
toolCallId: p.toolCallId,
|
|
111
|
+
messages: p.messages,
|
|
112
|
+
experimental_context: void 0
|
|
113
|
+
});
|
|
114
|
+
return { result: result2 };
|
|
115
|
+
}
|
|
116
|
+
if (!needsApproval) {
|
|
117
|
+
return { result: false };
|
|
118
|
+
}
|
|
119
|
+
const entry = needsApproval[p.toolName];
|
|
120
|
+
if (entry == null) {
|
|
121
|
+
return { result: false };
|
|
122
|
+
}
|
|
123
|
+
if (typeof entry === "boolean") {
|
|
124
|
+
return { result: entry };
|
|
125
|
+
}
|
|
126
|
+
const result = await entry(p.input, {
|
|
127
|
+
toolCallId: p.toolCallId,
|
|
128
|
+
messages: p.messages,
|
|
129
|
+
experimental_context: void 0
|
|
130
|
+
});
|
|
131
|
+
return { result };
|
|
132
|
+
};
|
|
133
|
+
const override = overrides?.["tools.needsApproval"];
|
|
134
|
+
try {
|
|
135
|
+
const overrideResult = await override?.(p);
|
|
136
|
+
if (overrideResult) {
|
|
137
|
+
const handled = handleOverrideResult(overrideResult);
|
|
138
|
+
if (handled) {
|
|
139
|
+
return handled;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return await defaultHandler();
|
|
143
|
+
} catch (e) {
|
|
144
|
+
return {
|
|
145
|
+
error: {
|
|
146
|
+
code: "NEEDS_APPROVAL_ERROR",
|
|
147
|
+
message: e instanceof Error ? e.message : String(e)
|
|
148
|
+
},
|
|
149
|
+
status: 500
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
case "hook.tool.before": {
|
|
154
|
+
const p = params;
|
|
155
|
+
const defaultHandler = async (hookParams) => {
|
|
156
|
+
if (!hooks?.["tool.before"]) {
|
|
157
|
+
return {};
|
|
158
|
+
}
|
|
159
|
+
const hookResult = await hooks["tool.before"](hookParams);
|
|
160
|
+
return hookResult ?? {};
|
|
161
|
+
};
|
|
162
|
+
const override = overrides?.["hook.tool.before"];
|
|
163
|
+
try {
|
|
164
|
+
let currentParams = p;
|
|
165
|
+
let merged = {};
|
|
166
|
+
const overrideResult = await override?.(p);
|
|
167
|
+
if (overrideResult?.ok) {
|
|
168
|
+
merged = { ...merged, ...overrideResult.result };
|
|
169
|
+
if (merged.stop) {
|
|
170
|
+
return { result: merged };
|
|
171
|
+
}
|
|
172
|
+
if (overrideResult.result.input !== void 0) {
|
|
173
|
+
currentParams = {
|
|
174
|
+
...currentParams,
|
|
175
|
+
input: overrideResult.result.input
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const defaultResult = await defaultHandler(currentParams);
|
|
180
|
+
merged = { ...merged, ...defaultResult };
|
|
181
|
+
return { result: merged };
|
|
182
|
+
} catch (e) {
|
|
183
|
+
return {
|
|
184
|
+
error: {
|
|
185
|
+
code: "HOOK_ERROR",
|
|
186
|
+
message: e instanceof Error ? e.message : String(e)
|
|
187
|
+
},
|
|
188
|
+
status: 500
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
case "hook.tool.after": {
|
|
193
|
+
const p = params;
|
|
194
|
+
const defaultHandler = async (hookParams) => {
|
|
195
|
+
if (!hooks?.["tool.after"]) {
|
|
196
|
+
return {};
|
|
197
|
+
}
|
|
198
|
+
const hookResult = await hooks["tool.after"](hookParams);
|
|
199
|
+
return hookResult ?? {};
|
|
200
|
+
};
|
|
201
|
+
const override = overrides?.["hook.tool.after"];
|
|
202
|
+
try {
|
|
203
|
+
let currentParams = p;
|
|
204
|
+
let merged = {};
|
|
205
|
+
const overrideResult = await override?.(p);
|
|
206
|
+
if (overrideResult?.ok) {
|
|
207
|
+
merged = { ...merged, ...overrideResult.result };
|
|
208
|
+
if (merged.stop) {
|
|
209
|
+
return { result: merged };
|
|
210
|
+
}
|
|
211
|
+
if (overrideResult.result.result !== void 0) {
|
|
212
|
+
currentParams = {
|
|
213
|
+
...currentParams,
|
|
214
|
+
result: overrideResult.result.result
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const defaultResult = await defaultHandler(currentParams);
|
|
219
|
+
merged = { ...merged, ...defaultResult };
|
|
220
|
+
return { result: merged };
|
|
221
|
+
} catch (e) {
|
|
222
|
+
return {
|
|
223
|
+
error: {
|
|
224
|
+
code: "HOOK_ERROR",
|
|
225
|
+
message: e instanceof Error ? e.message : String(e)
|
|
226
|
+
},
|
|
227
|
+
status: 500
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
case "tools.execute": {
|
|
232
|
+
const p = params;
|
|
233
|
+
const defaultHandler = async () => {
|
|
234
|
+
const toolsMap = tools ?? {};
|
|
235
|
+
const toolDef = toolsMap[p.name];
|
|
236
|
+
if (!toolDef) {
|
|
237
|
+
return {
|
|
238
|
+
error: {
|
|
239
|
+
code: "TOOL_NOT_FOUND",
|
|
240
|
+
message: `Unknown tool: ${p.name}`
|
|
241
|
+
},
|
|
242
|
+
status: 400
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
const execute = toolDef.execute;
|
|
246
|
+
if (!execute) {
|
|
247
|
+
return {
|
|
248
|
+
error: {
|
|
249
|
+
code: "NO_EXECUTE",
|
|
250
|
+
message: `Tool ${p.name} has no execute function`
|
|
251
|
+
},
|
|
252
|
+
status: 400
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const sandboxInstance = getSandbox({
|
|
256
|
+
sandboxRecord: p.sandboxRecord,
|
|
257
|
+
storageConfig,
|
|
258
|
+
storage: getStorageInstance(),
|
|
259
|
+
rpc
|
|
260
|
+
});
|
|
261
|
+
const toolContext = {
|
|
262
|
+
session: p.session,
|
|
263
|
+
sandbox: sandboxInstance,
|
|
264
|
+
storage: getStorageInstance(),
|
|
265
|
+
context: p.context
|
|
266
|
+
};
|
|
267
|
+
let toolInput = p.input;
|
|
268
|
+
const beforeResult = await dispatch(
|
|
269
|
+
"hook.tool.before",
|
|
270
|
+
{
|
|
271
|
+
name: p.name,
|
|
272
|
+
input: toolInput,
|
|
273
|
+
context: toolContext
|
|
274
|
+
},
|
|
275
|
+
context,
|
|
276
|
+
name
|
|
277
|
+
);
|
|
278
|
+
if ("error" in beforeResult) {
|
|
279
|
+
return beforeResult;
|
|
280
|
+
}
|
|
281
|
+
const beforeHook = beforeResult.result;
|
|
282
|
+
if (beforeHook.stop) {
|
|
283
|
+
return {
|
|
284
|
+
error: {
|
|
285
|
+
code: "HOOK_STOPPED",
|
|
286
|
+
message: "tool.before hook stopped execution"
|
|
287
|
+
},
|
|
288
|
+
status: 400
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
if (beforeHook.input !== void 0) {
|
|
292
|
+
toolInput = beforeHook.input;
|
|
293
|
+
}
|
|
294
|
+
let result = await execute(toolInput, {
|
|
295
|
+
experimental_context: toolContext,
|
|
296
|
+
toolCallId: "rpc",
|
|
297
|
+
messages: []
|
|
298
|
+
});
|
|
299
|
+
const afterResult = await dispatch(
|
|
300
|
+
"hook.tool.after",
|
|
301
|
+
{
|
|
302
|
+
name: p.name,
|
|
303
|
+
input: toolInput,
|
|
304
|
+
result,
|
|
305
|
+
context: toolContext
|
|
306
|
+
},
|
|
307
|
+
context,
|
|
308
|
+
name
|
|
309
|
+
);
|
|
310
|
+
if ("error" in afterResult) {
|
|
311
|
+
return afterResult;
|
|
312
|
+
}
|
|
313
|
+
const afterHook = afterResult.result;
|
|
314
|
+
if (afterHook.stop) {
|
|
315
|
+
return {
|
|
316
|
+
error: {
|
|
317
|
+
code: "HOOK_STOPPED",
|
|
318
|
+
message: "tool.after hook stopped execution"
|
|
319
|
+
},
|
|
320
|
+
status: 400
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
if (afterHook.result !== void 0) {
|
|
324
|
+
result = afterHook.result;
|
|
325
|
+
}
|
|
326
|
+
return { result };
|
|
327
|
+
};
|
|
328
|
+
const override = overrides?.["tools.execute"];
|
|
329
|
+
try {
|
|
330
|
+
const overrideResult = await override?.(p);
|
|
331
|
+
if (overrideResult) {
|
|
332
|
+
const handled = handleOverrideResult(overrideResult);
|
|
333
|
+
if (handled) {
|
|
334
|
+
return handled;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return await defaultHandler();
|
|
338
|
+
} catch (e) {
|
|
339
|
+
return {
|
|
340
|
+
error: {
|
|
341
|
+
code: "EXECUTE_ERROR",
|
|
342
|
+
message: e instanceof Error ? e.message : String(e)
|
|
343
|
+
},
|
|
344
|
+
status: 500
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
default: {
|
|
349
|
+
const methodName = method;
|
|
350
|
+
if (!STORAGE_RPC_METHODS.includes(methodName)) {
|
|
351
|
+
return {
|
|
352
|
+
error: {
|
|
353
|
+
code: "UNKNOWN_METHOD",
|
|
354
|
+
message: `Unknown RPC method: ${method}`
|
|
355
|
+
},
|
|
356
|
+
status: 400
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
const defaultHandler = async () => {
|
|
360
|
+
return await handleStorageRequest({
|
|
361
|
+
config: storageConfig,
|
|
362
|
+
request: { method, params },
|
|
363
|
+
name: name ?? storageConfig.name ?? "default",
|
|
364
|
+
getStorageHandlers
|
|
365
|
+
});
|
|
366
|
+
};
|
|
367
|
+
const override = overrides?.[methodName];
|
|
368
|
+
try {
|
|
369
|
+
const overrideResult = await override?.(params);
|
|
370
|
+
if (overrideResult) {
|
|
371
|
+
const handled = handleOverrideResult(overrideResult);
|
|
372
|
+
if (handled) {
|
|
373
|
+
return handled;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return await defaultHandler();
|
|
377
|
+
} catch (e) {
|
|
378
|
+
return {
|
|
379
|
+
error: {
|
|
380
|
+
code: "STORAGE_ERROR",
|
|
381
|
+
message: e instanceof Error ? e.message : String(e)
|
|
382
|
+
},
|
|
383
|
+
status: 500
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
async function handleStorageRequest({
|
|
390
|
+
config,
|
|
391
|
+
request,
|
|
392
|
+
name,
|
|
393
|
+
getStorageHandlers
|
|
394
|
+
}) {
|
|
395
|
+
switch (config.type) {
|
|
396
|
+
case "local": {
|
|
397
|
+
const handlers = await getStorageHandlers(name);
|
|
398
|
+
const { handleStorageRpc: handleStorageRpc2 } = await import("./handler-36FM5H35.mjs");
|
|
399
|
+
return handleStorageRpc2(request, handlers);
|
|
400
|
+
}
|
|
401
|
+
case "vercel": {
|
|
402
|
+
const { getVercelStorageConfig } = await import("./vercel-LLXAHKVJ.mjs");
|
|
403
|
+
const resolved = await getVercelStorageConfig();
|
|
404
|
+
return await proxyStorageRequest({
|
|
405
|
+
url: resolved.url,
|
|
406
|
+
headers: { ...resolved.headers, "x-agent-name": name },
|
|
407
|
+
request
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
case "custom": {
|
|
411
|
+
return await proxyStorageRequest({
|
|
412
|
+
url: resolveApiUrl({ api: config.url }),
|
|
413
|
+
headers: { ...config.headers, "x-agent-name": name },
|
|
414
|
+
request
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
default: {
|
|
418
|
+
config;
|
|
419
|
+
throw new Error(
|
|
420
|
+
`Unknown storage type: ${config.type}`
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
async function proxyStorageRequest({
|
|
426
|
+
url,
|
|
427
|
+
headers,
|
|
428
|
+
request
|
|
429
|
+
}) {
|
|
430
|
+
const response = await fetch(url, {
|
|
431
|
+
method: "POST",
|
|
432
|
+
headers: {
|
|
433
|
+
"Content-Type": "application/json",
|
|
434
|
+
...headers
|
|
435
|
+
},
|
|
436
|
+
body: JSON.stringify(request)
|
|
437
|
+
});
|
|
438
|
+
if (!response.ok) {
|
|
439
|
+
return {
|
|
440
|
+
error: {
|
|
441
|
+
code: "PROXY_ERROR",
|
|
442
|
+
message: `Storage proxy failed: ${response.status} ${response.statusText}`
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
return response.json();
|
|
45
447
|
}
|
|
46
|
-
function
|
|
47
|
-
|
|
448
|
+
function schemaToJsonSchema(schema) {
|
|
449
|
+
if (!schema) {
|
|
450
|
+
return void 0;
|
|
451
|
+
}
|
|
452
|
+
if (typeof schema === "object" && schema !== null && "_def" in schema && typeof schema._def === "object") {
|
|
453
|
+
return z.toJSONSchema(schema);
|
|
454
|
+
}
|
|
455
|
+
if (typeof schema === "object" && schema !== null) {
|
|
456
|
+
const s = schema;
|
|
457
|
+
if (Symbol.for("vercel.ai.schema") in s && "jsonSchema" in s) {
|
|
458
|
+
return s.jsonSchema;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
if (typeof schema === "object" && schema !== null && ("type" in schema || "properties" in schema)) {
|
|
462
|
+
return schema;
|
|
463
|
+
}
|
|
464
|
+
return void 0;
|
|
48
465
|
}
|
|
49
466
|
|
|
50
467
|
// src/utils/message.ts
|
|
468
|
+
import { ulid } from "ulid";
|
|
51
469
|
function toMessageAndParts({
|
|
52
470
|
sessionId,
|
|
53
471
|
id,
|
|
54
472
|
input,
|
|
55
|
-
generateId,
|
|
56
473
|
defaultRole
|
|
57
474
|
}) {
|
|
58
|
-
const messageId = id ??
|
|
475
|
+
const messageId = id ?? `message_${ulid()}`;
|
|
59
476
|
if (typeof input === "string") {
|
|
477
|
+
const now2 = Date.now();
|
|
60
478
|
return {
|
|
61
479
|
message: {
|
|
62
480
|
id: messageId,
|
|
63
481
|
sessionId,
|
|
64
482
|
role: defaultRole,
|
|
65
|
-
createdAt:
|
|
66
|
-
|
|
483
|
+
createdAt: now2,
|
|
484
|
+
startedAt: null,
|
|
485
|
+
completedAt: null,
|
|
67
486
|
interruptedAt: null,
|
|
68
|
-
|
|
487
|
+
usage: null
|
|
69
488
|
},
|
|
70
489
|
parts: [
|
|
71
490
|
{
|
|
72
491
|
sessionId,
|
|
73
492
|
messageId,
|
|
74
|
-
id:
|
|
493
|
+
id: `part_${ulid()}`,
|
|
75
494
|
index: 0,
|
|
76
495
|
part: { type: "text", text: input }
|
|
77
496
|
}
|
|
78
497
|
]
|
|
79
498
|
};
|
|
80
499
|
}
|
|
500
|
+
const now = Date.now();
|
|
81
501
|
return {
|
|
82
502
|
message: {
|
|
83
503
|
sessionId,
|
|
84
504
|
id: messageId,
|
|
85
|
-
createdAt:
|
|
86
|
-
|
|
505
|
+
createdAt: now,
|
|
506
|
+
startedAt: null,
|
|
507
|
+
completedAt: null,
|
|
87
508
|
interruptedAt: null,
|
|
88
|
-
|
|
509
|
+
usage: null,
|
|
89
510
|
role: input.role ?? defaultRole
|
|
90
511
|
},
|
|
91
512
|
parts: input.parts.map((part, index) => ({
|
|
92
513
|
sessionId,
|
|
93
514
|
messageId,
|
|
94
|
-
id:
|
|
515
|
+
id: `part_${ulid()}`,
|
|
95
516
|
index,
|
|
96
517
|
part
|
|
97
518
|
}))
|
|
@@ -100,16 +521,52 @@ function toMessageAndParts({
|
|
|
100
521
|
|
|
101
522
|
// src/client.ts
|
|
102
523
|
var agent = (options) => {
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
524
|
+
const agentSecret = process.env.AGENT_SECRET;
|
|
525
|
+
if (!agentSecret) {
|
|
526
|
+
throw new Error(
|
|
527
|
+
"AGENT_SECRET env var is required. Use withAgent() or set it manually."
|
|
528
|
+
);
|
|
529
|
+
}
|
|
530
|
+
const baseStorageConfig = options.storage ?? { type: "vercel" };
|
|
531
|
+
const storageConfig = {
|
|
532
|
+
...baseStorageConfig,
|
|
533
|
+
name: options.name ?? baseStorageConfig.name
|
|
534
|
+
};
|
|
535
|
+
let _storage = null;
|
|
536
|
+
const getStorageInstance = () => {
|
|
537
|
+
if (!_storage) {
|
|
538
|
+
_storage = getStorage({
|
|
539
|
+
config: storageConfig,
|
|
540
|
+
rpc: agentObj.rpc
|
|
541
|
+
});
|
|
542
|
+
}
|
|
543
|
+
return _storage;
|
|
544
|
+
};
|
|
545
|
+
let storageHandlersPromise = null;
|
|
546
|
+
const getStorageHandlers = (name) => {
|
|
547
|
+
if (storageConfig.type !== "local") {
|
|
548
|
+
return Promise.reject(
|
|
549
|
+
new Error("Storage handlers only available for local storage")
|
|
550
|
+
);
|
|
551
|
+
}
|
|
552
|
+
if (!storageHandlersPromise) {
|
|
553
|
+
storageHandlersPromise = (async () => {
|
|
554
|
+
const { join } = await import("node:path");
|
|
555
|
+
const { createFilesystemHandlers } = await import("./local-fs-handlers-P4WGW3QY.mjs");
|
|
556
|
+
const basePath = storageConfig.path ?? ".agent-storage";
|
|
557
|
+
const fullPath = join(basePath, name, LOCAL_STORAGE_VERSION);
|
|
558
|
+
return createFilesystemHandlers(fullPath);
|
|
559
|
+
})();
|
|
560
|
+
}
|
|
561
|
+
return storageHandlersPromise;
|
|
562
|
+
};
|
|
106
563
|
const sandbox = async (sandboxId, opts) => {
|
|
107
|
-
const existingRecord = await
|
|
564
|
+
const existingRecord = await getStorageInstance().sandbox.get(sandboxId);
|
|
108
565
|
if (existingRecord instanceof Error) {
|
|
109
566
|
if (!(existingRecord instanceof SandboxNotFoundError)) {
|
|
110
567
|
throw existingRecord;
|
|
111
568
|
}
|
|
112
|
-
const sandboxRecord = await
|
|
569
|
+
const sandboxRecord = await getStorageInstance().sandbox.set({
|
|
113
570
|
id: sandboxId,
|
|
114
571
|
tags: opts?.tags ?? null,
|
|
115
572
|
acquiringLockAt: null,
|
|
@@ -121,34 +578,40 @@ var agent = (options) => {
|
|
|
121
578
|
if (sandboxRecord instanceof Error) {
|
|
122
579
|
throw sandboxRecord;
|
|
123
580
|
}
|
|
124
|
-
return getSandbox({
|
|
581
|
+
return getSandbox({
|
|
582
|
+
storageConfig,
|
|
583
|
+
sandboxRecord,
|
|
584
|
+
storage: getStorageInstance(),
|
|
585
|
+
rpc: agentObj.rpc
|
|
586
|
+
});
|
|
125
587
|
}
|
|
126
588
|
const newConfig = opts?.config ?? existingRecord.config;
|
|
127
589
|
if (!equal(existingRecord.config, newConfig)) {
|
|
128
|
-
|
|
129
|
-
reason: "sandbox config changes are not supported"
|
|
130
|
-
});
|
|
590
|
+
console.warn("sandbox config changes are not supported");
|
|
131
591
|
}
|
|
132
|
-
return getSandbox({
|
|
592
|
+
return getSandbox({
|
|
593
|
+
storageConfig,
|
|
594
|
+
sandboxRecord: existingRecord,
|
|
595
|
+
storage: getStorageInstance(),
|
|
596
|
+
rpc: agentObj.rpc
|
|
597
|
+
});
|
|
133
598
|
};
|
|
134
|
-
|
|
599
|
+
const agentObj = {
|
|
135
600
|
session: async (sessionId, sessionOptions) => {
|
|
136
|
-
let session = await
|
|
601
|
+
let session = await getStorageInstance().session.get(sessionId);
|
|
137
602
|
const sandboxInput = sessionOptions?.sandbox ?? options.sandbox;
|
|
138
603
|
const sandboxId = typeof sandboxInput === "string" ? sandboxInput : (
|
|
139
604
|
// biome-ignore lint/style/noNestedTernary: ok
|
|
140
|
-
session instanceof Error ?
|
|
605
|
+
session instanceof Error ? `sandbox_${ulid2()}` : session.sandboxId ?? `sandbox_${ulid2()}`
|
|
141
606
|
);
|
|
142
607
|
const sandboxPromise = sandbox(
|
|
143
608
|
sandboxId,
|
|
144
609
|
typeof sandboxInput === "string" ? void 0 : { config: sandboxInput }
|
|
145
610
|
);
|
|
146
611
|
const existingSession = session instanceof Error ? null : session;
|
|
147
|
-
const mcpConfig = options.mcp || sessionOptions?.mcp ? { ...options.mcp, ...sessionOptions?.mcp } : null;
|
|
148
612
|
const skillsDir = sessionOptions?.skillsDir ?? existingSession?.skillsDir ?? options.skillsDir ?? null;
|
|
149
613
|
if (session instanceof Error) {
|
|
150
614
|
if (session instanceof SessionNotFoundError) {
|
|
151
|
-
const instructions = sessionOptions?.instructions ?? options.instructions ?? null;
|
|
152
615
|
const model = sessionOptions?.model ?? options.model ?? null;
|
|
153
616
|
if (!model) {
|
|
154
617
|
throw new SessionError({
|
|
@@ -156,19 +619,20 @@ var agent = (options) => {
|
|
|
156
619
|
reason: "Model is not set"
|
|
157
620
|
});
|
|
158
621
|
}
|
|
159
|
-
session = await
|
|
622
|
+
session = await getStorageInstance().session.set({
|
|
160
623
|
id: sessionId,
|
|
161
624
|
createdAt: Date.now(),
|
|
162
625
|
updatedAt: Date.now(),
|
|
163
626
|
lastMessageId: null,
|
|
164
627
|
runId: null,
|
|
165
628
|
tags: sessionOptions?.tags ?? null,
|
|
166
|
-
|
|
629
|
+
system: sessionOptions?.system ?? options.system ?? null,
|
|
167
630
|
model,
|
|
168
|
-
mcp: mcpConfig ? serializeMcpConfig(mcpConfig) : null,
|
|
169
631
|
sandboxId,
|
|
170
632
|
skillsDir: skillsDir ? normalizeSkillsDirs(skillsDir) : null,
|
|
171
|
-
hookToken: null
|
|
633
|
+
hookToken: null,
|
|
634
|
+
activeTools: sessionOptions?.activeTools ?? options.activeTools ?? null,
|
|
635
|
+
generation: options.generation || sessionOptions?.generation ? { ...options.generation, ...sessionOptions?.generation } : null
|
|
172
636
|
});
|
|
173
637
|
} else {
|
|
174
638
|
throw session;
|
|
@@ -177,46 +641,73 @@ var agent = (options) => {
|
|
|
177
641
|
const updated = {
|
|
178
642
|
...session,
|
|
179
643
|
...sessionOptions,
|
|
180
|
-
mcp: mcpConfig ? serializeMcpConfig(mcpConfig) : session.mcp,
|
|
181
644
|
sandboxId,
|
|
182
645
|
skillsDir: skillsDir ? normalizeSkillsDirs(skillsDir) : null
|
|
183
646
|
};
|
|
184
647
|
if (!equal(updated, session)) {
|
|
185
|
-
session = await
|
|
648
|
+
session = await getStorageInstance().session.set(updated);
|
|
186
649
|
if (session instanceof Error) {
|
|
187
650
|
throw session;
|
|
188
651
|
}
|
|
189
652
|
}
|
|
190
653
|
}
|
|
191
654
|
const interruptCurrentMessage = async () => {
|
|
192
|
-
const
|
|
193
|
-
if (
|
|
194
|
-
return
|
|
195
|
-
}
|
|
196
|
-
if (!currentSession.lastMessageId) {
|
|
197
|
-
return void 0;
|
|
198
|
-
}
|
|
199
|
-
const message = await storage.message.get(currentSession.lastMessageId);
|
|
200
|
-
if (message instanceof Error) {
|
|
201
|
-
return message;
|
|
655
|
+
const messagesResult = await getStorageInstance().message.list(sessionId);
|
|
656
|
+
if (messagesResult instanceof Error) {
|
|
657
|
+
return messagesResult;
|
|
202
658
|
}
|
|
203
|
-
|
|
204
|
-
|
|
659
|
+
const now = Date.now();
|
|
660
|
+
const pendingAssistantMessages = messagesResult.items.filter(
|
|
661
|
+
(m) => m.role === "assistant" && m.completedAt === null && m.interruptedAt === null
|
|
662
|
+
);
|
|
663
|
+
const results = await Promise.all(
|
|
664
|
+
pendingAssistantMessages.map(
|
|
665
|
+
(m) => getStorageInstance().message.set({ ...m, interruptedAt: now })
|
|
666
|
+
)
|
|
667
|
+
);
|
|
668
|
+
for (const result of results) {
|
|
669
|
+
if (result instanceof Error) {
|
|
670
|
+
return result;
|
|
671
|
+
}
|
|
205
672
|
}
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
673
|
+
for (const m of pendingAssistantMessages) {
|
|
674
|
+
const partsResult = await getStorageInstance().part.listByMessage(
|
|
675
|
+
m.id
|
|
676
|
+
);
|
|
677
|
+
if (partsResult instanceof Error) {
|
|
678
|
+
continue;
|
|
679
|
+
}
|
|
680
|
+
for (const p of partsResult.items) {
|
|
681
|
+
if (p.part && "state" in p.part && p.part.state === "approval-requested" && "approval" in p.part) {
|
|
682
|
+
const approval = p.part.approval;
|
|
683
|
+
if (approval?.id) {
|
|
684
|
+
await getStorageInstance().part.set({
|
|
685
|
+
...p,
|
|
686
|
+
part: {
|
|
687
|
+
...p.part,
|
|
688
|
+
state: "approval-responded",
|
|
689
|
+
approval: {
|
|
690
|
+
...approval,
|
|
691
|
+
approved: false,
|
|
692
|
+
reason: "interrupted"
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
});
|
|
696
|
+
await approvalHook.resume(approval.id, {
|
|
697
|
+
approved: false,
|
|
698
|
+
reason: "interrupted"
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
}
|
|
212
703
|
}
|
|
213
704
|
return void 0;
|
|
214
705
|
};
|
|
215
706
|
return {
|
|
216
707
|
send: async ({
|
|
217
708
|
input,
|
|
218
|
-
|
|
219
|
-
|
|
709
|
+
interruptIfStreaming,
|
|
710
|
+
context
|
|
220
711
|
}) => {
|
|
221
712
|
if (interruptIfStreaming) {
|
|
222
713
|
const interruptResult = await interruptCurrentMessage();
|
|
@@ -231,8 +722,7 @@ var agent = (options) => {
|
|
|
231
722
|
const { message, parts } = toMessageAndParts({
|
|
232
723
|
sessionId,
|
|
233
724
|
input: i,
|
|
234
|
-
defaultRole: "user"
|
|
235
|
-
generateId: () => generateId("message")
|
|
725
|
+
defaultRole: "user"
|
|
236
726
|
});
|
|
237
727
|
newMessages.push(message);
|
|
238
728
|
newParts.push(...parts);
|
|
@@ -241,47 +731,56 @@ var agent = (options) => {
|
|
|
241
731
|
const { message, parts } = toMessageAndParts({
|
|
242
732
|
sessionId,
|
|
243
733
|
input,
|
|
244
|
-
defaultRole: "user"
|
|
245
|
-
generateId: () => generateId("message")
|
|
734
|
+
defaultRole: "user"
|
|
246
735
|
});
|
|
247
736
|
newMessages.push(message);
|
|
248
737
|
newParts.push(...parts);
|
|
249
738
|
}
|
|
250
|
-
const assistantMessageId =
|
|
739
|
+
const assistantMessageId = `message_${ulid2()}`;
|
|
740
|
+
const baseTime = Date.now();
|
|
741
|
+
const assistantMessageCreatedAt = baseTime + newMessages.length;
|
|
251
742
|
newMessages.push({
|
|
252
743
|
id: assistantMessageId,
|
|
253
744
|
sessionId,
|
|
254
745
|
role: "assistant",
|
|
255
|
-
createdAt:
|
|
746
|
+
createdAt: assistantMessageCreatedAt,
|
|
747
|
+
startedAt: null,
|
|
256
748
|
completedAt: null,
|
|
257
749
|
interruptedAt: null,
|
|
258
|
-
|
|
750
|
+
usage: null
|
|
259
751
|
});
|
|
260
|
-
const session2 = await
|
|
752
|
+
const session2 = await getStorageInstance().session.get(sessionId);
|
|
261
753
|
if (session2 instanceof Error) {
|
|
262
754
|
throw session2;
|
|
263
755
|
}
|
|
264
756
|
const agentInput = {
|
|
265
757
|
storageConfig,
|
|
266
|
-
sessionId
|
|
758
|
+
sessionId,
|
|
759
|
+
rpc: agentObj.rpc
|
|
267
760
|
};
|
|
268
761
|
const event = {
|
|
269
762
|
assistantMessageId,
|
|
270
|
-
hookToken: crypto.randomUUID()
|
|
763
|
+
hookToken: crypto.randomUUID(),
|
|
764
|
+
createdAt: assistantMessageCreatedAt,
|
|
765
|
+
context: context ?? {}
|
|
271
766
|
};
|
|
272
767
|
return await errore.tryAsync({
|
|
273
768
|
try: async () => {
|
|
274
769
|
await all({
|
|
275
770
|
async saveMessages() {
|
|
276
|
-
const baseTime = Date.now();
|
|
277
771
|
await Promise.all(
|
|
278
772
|
newMessages.map(
|
|
279
|
-
(m, i) =>
|
|
773
|
+
(m, i) => getStorageInstance().message.set({
|
|
774
|
+
...m,
|
|
775
|
+
createdAt: baseTime + i
|
|
776
|
+
})
|
|
280
777
|
)
|
|
281
778
|
);
|
|
282
779
|
},
|
|
283
780
|
async saveParts() {
|
|
284
|
-
await Promise.all(
|
|
781
|
+
await Promise.all(
|
|
782
|
+
newParts.map(getStorageInstance().part.set)
|
|
783
|
+
);
|
|
285
784
|
},
|
|
286
785
|
async resumeOrStartAgentWorkflow() {
|
|
287
786
|
if (session2.runId) {
|
|
@@ -295,7 +794,7 @@ var agent = (options) => {
|
|
|
295
794
|
},
|
|
296
795
|
async updateSession() {
|
|
297
796
|
await this.$.resumeOrStartAgentWorkflow;
|
|
298
|
-
const result = await
|
|
797
|
+
const result = await getStorageInstance().session.set({
|
|
299
798
|
...session2,
|
|
300
799
|
updatedAt: Date.now(),
|
|
301
800
|
lastMessageId: assistantMessageId,
|
|
@@ -321,7 +820,7 @@ var agent = (options) => {
|
|
|
321
820
|
});
|
|
322
821
|
},
|
|
323
822
|
stream: async (opts) => {
|
|
324
|
-
const session2 = await
|
|
823
|
+
const session2 = await getStorageInstance().session.get(sessionId);
|
|
325
824
|
if (session2 instanceof Error) {
|
|
326
825
|
return session2;
|
|
327
826
|
}
|
|
@@ -343,8 +842,8 @@ var agent = (options) => {
|
|
|
343
842
|
},
|
|
344
843
|
ui: async () => {
|
|
345
844
|
const [messagesResult, partsResult] = await Promise.all([
|
|
346
|
-
|
|
347
|
-
|
|
845
|
+
getStorageInstance().message.list(sessionId),
|
|
846
|
+
getStorageInstance().part.listBySession(sessionId)
|
|
348
847
|
]);
|
|
349
848
|
if (messagesResult instanceof Error) {
|
|
350
849
|
return messagesResult;
|
|
@@ -356,28 +855,33 @@ var agent = (options) => {
|
|
|
356
855
|
messages: messagesResult.items,
|
|
357
856
|
parts: partsResult.items
|
|
358
857
|
});
|
|
359
|
-
const
|
|
360
|
-
const isStreaming =
|
|
361
|
-
const streamingMessageId = isStreaming ?
|
|
362
|
-
|
|
858
|
+
const lastStartedAssistant = messagesResult.items.filter((m) => m.role === "assistant" && m.startedAt !== null).at(-1);
|
|
859
|
+
const isStreaming = lastStartedAssistant && lastStartedAssistant.completedAt === null && lastStartedAssistant.interruptedAt === null;
|
|
860
|
+
const streamingMessageId = isStreaming ? lastStartedAssistant.id : null;
|
|
861
|
+
const usage = computeSessionUsage(messagesResult.items);
|
|
862
|
+
return {
|
|
863
|
+
messages,
|
|
864
|
+
streamingMessageId,
|
|
865
|
+
usage
|
|
866
|
+
};
|
|
363
867
|
},
|
|
364
868
|
tag: {
|
|
365
869
|
list: async () => {
|
|
366
|
-
const session2 = await
|
|
870
|
+
const session2 = await getStorageInstance().session.get(sessionId);
|
|
367
871
|
if (session2 instanceof Error) {
|
|
368
872
|
return session2;
|
|
369
873
|
}
|
|
370
874
|
return session2.tags ?? {};
|
|
371
875
|
},
|
|
372
876
|
get: async (key) => {
|
|
373
|
-
const session2 = await
|
|
877
|
+
const session2 = await getStorageInstance().session.get(sessionId);
|
|
374
878
|
if (session2 instanceof Error) {
|
|
375
879
|
return session2;
|
|
376
880
|
}
|
|
377
881
|
return session2.tags?.[key];
|
|
378
882
|
},
|
|
379
883
|
set: async (key, value) => {
|
|
380
|
-
const result = await
|
|
884
|
+
const result = await getStorageInstance().session.tag.set({
|
|
381
885
|
sessionId,
|
|
382
886
|
tags: { [key]: value }
|
|
383
887
|
});
|
|
@@ -387,7 +891,7 @@ var agent = (options) => {
|
|
|
387
891
|
return void 0;
|
|
388
892
|
},
|
|
389
893
|
setMany: async (tags) => {
|
|
390
|
-
const result = await
|
|
894
|
+
const result = await getStorageInstance().session.tag.set({
|
|
391
895
|
sessionId,
|
|
392
896
|
tags
|
|
393
897
|
});
|
|
@@ -398,56 +902,125 @@ var agent = (options) => {
|
|
|
398
902
|
}
|
|
399
903
|
},
|
|
400
904
|
sandbox: await sandboxPromise,
|
|
401
|
-
interrupt: interruptCurrentMessage
|
|
905
|
+
interrupt: interruptCurrentMessage,
|
|
906
|
+
resolveApproval: async ({
|
|
907
|
+
approvalId,
|
|
908
|
+
approved,
|
|
909
|
+
reason
|
|
910
|
+
}) => {
|
|
911
|
+
const partsResult = await getStorageInstance().part.listBySession(sessionId);
|
|
912
|
+
if (partsResult instanceof Error) {
|
|
913
|
+
return partsResult;
|
|
914
|
+
}
|
|
915
|
+
const targetPart = partsResult.items.find(
|
|
916
|
+
(p) => p.part && "approval" in p.part && p.part.approval?.id === approvalId
|
|
917
|
+
);
|
|
918
|
+
if (!targetPart) {
|
|
919
|
+
return new SessionError({
|
|
920
|
+
id: sessionId,
|
|
921
|
+
reason: `Approval ${approvalId} not found`
|
|
922
|
+
});
|
|
923
|
+
}
|
|
924
|
+
const updatedPart = {
|
|
925
|
+
...targetPart,
|
|
926
|
+
part: {
|
|
927
|
+
...targetPart.part,
|
|
928
|
+
state: "approval-responded",
|
|
929
|
+
approval: { id: approvalId, approved, reason }
|
|
930
|
+
}
|
|
931
|
+
};
|
|
932
|
+
const setResult = await getStorageInstance().part.set(
|
|
933
|
+
updatedPart
|
|
934
|
+
);
|
|
935
|
+
if (setResult instanceof Error) {
|
|
936
|
+
return setResult;
|
|
937
|
+
}
|
|
938
|
+
try {
|
|
939
|
+
await approvalHook.resume(approvalId, { approved, reason });
|
|
940
|
+
} catch {
|
|
941
|
+
}
|
|
942
|
+
return void 0;
|
|
943
|
+
},
|
|
944
|
+
usage: async () => {
|
|
945
|
+
const messagesResult = await getStorageInstance().message.list(sessionId);
|
|
946
|
+
if (messagesResult instanceof Error) {
|
|
947
|
+
return messagesResult;
|
|
948
|
+
}
|
|
949
|
+
return computeSessionUsage(messagesResult.items);
|
|
950
|
+
}
|
|
402
951
|
};
|
|
403
952
|
},
|
|
404
953
|
sandbox,
|
|
405
|
-
storage
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
954
|
+
get storage() {
|
|
955
|
+
return getStorageInstance();
|
|
956
|
+
},
|
|
957
|
+
/**
|
|
958
|
+
* RPC handler for agent operations.
|
|
959
|
+
* Handles tools.list, tools.execute, storage RPC, and hooks.
|
|
960
|
+
*
|
|
961
|
+
* Called internally by the `rpc` step function during workflow execution.
|
|
962
|
+
* Can also be exposed via HTTP for external access if needed.
|
|
963
|
+
*/
|
|
964
|
+
handler: async (input, overrides) => {
|
|
965
|
+
const isRequest = input instanceof Request;
|
|
966
|
+
let method;
|
|
967
|
+
let params;
|
|
968
|
+
let name;
|
|
969
|
+
if (isRequest) {
|
|
970
|
+
const secret = input.headers.get("x-agent-secret");
|
|
971
|
+
if (secret !== agentSecret) {
|
|
972
|
+
return Response.json(
|
|
973
|
+
{ error: { code: "UNAUTHORIZED", message: "Invalid secret" } },
|
|
974
|
+
{ status: 401 }
|
|
975
|
+
);
|
|
976
|
+
}
|
|
977
|
+
let body;
|
|
978
|
+
try {
|
|
979
|
+
body = await input.json();
|
|
980
|
+
} catch {
|
|
981
|
+
return Response.json(
|
|
982
|
+
{
|
|
983
|
+
error: { code: "INVALID_REQUEST", message: "Invalid JSON body" }
|
|
984
|
+
},
|
|
985
|
+
{ status: 400 }
|
|
986
|
+
);
|
|
987
|
+
}
|
|
988
|
+
method = body.method;
|
|
989
|
+
params = body.params;
|
|
990
|
+
name = input.headers.get("x-agent-name") ?? DEFAULT_NAMESPACE;
|
|
991
|
+
} else {
|
|
992
|
+
method = input.method;
|
|
993
|
+
params = input.params;
|
|
994
|
+
name = input.name ?? DEFAULT_NAMESPACE;
|
|
434
995
|
}
|
|
435
|
-
const
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
996
|
+
const dispatchContext = {
|
|
997
|
+
tools: options.tools,
|
|
998
|
+
hooks: options.hooks,
|
|
999
|
+
needsApproval: options.needsApproval,
|
|
1000
|
+
storageConfig,
|
|
1001
|
+
getStorageInstance,
|
|
1002
|
+
getStorageHandlers,
|
|
1003
|
+
rpc: agentObj.rpc,
|
|
1004
|
+
overrides
|
|
1005
|
+
};
|
|
1006
|
+
const result = await dispatch(method, params, dispatchContext, name);
|
|
1007
|
+
if (!isRequest) {
|
|
1008
|
+
return result;
|
|
448
1009
|
}
|
|
1010
|
+
const status = "error" in result ? result.status ?? 500 : 200;
|
|
1011
|
+
return Response.json(
|
|
1012
|
+
"error" in result ? { error: result.error } : { result: result.result },
|
|
1013
|
+
{ status }
|
|
1014
|
+
);
|
|
1015
|
+
},
|
|
1016
|
+
tools: { ...builtInTools, ...options.tools },
|
|
1017
|
+
rpc: () => {
|
|
1018
|
+
throw new Error(
|
|
1019
|
+
"rpc not configured. Ensure withAgent is set up in next.config.ts"
|
|
1020
|
+
);
|
|
449
1021
|
}
|
|
450
1022
|
};
|
|
1023
|
+
return agentObj;
|
|
451
1024
|
};
|
|
452
1025
|
export {
|
|
453
1026
|
MessageNotFoundError,
|
|
@@ -456,7 +1029,7 @@ export {
|
|
|
456
1029
|
SessionNotFoundError,
|
|
457
1030
|
StorageError,
|
|
458
1031
|
agent,
|
|
459
|
-
|
|
460
|
-
|
|
1032
|
+
builtinToolNames,
|
|
1033
|
+
handleStorageRpc
|
|
461
1034
|
};
|
|
462
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaWVudC50cyIsICIuLi9zcmMvbWNwL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy9tZXNzYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEdhdGV3YXlNb2RlbElkLCBVSU1lc3NhZ2UgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IGFsbCB9IGZyb20gXCJiZXR0ZXItYWxsXCI7XG5pbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuaW1wb3J0IGVxdWFsIGZyb20gXCJmYXN0LWRlZXAtZXF1YWxcIjtcbmltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHsgZ2V0UnVuLCBzdGFydCB9IGZyb20gXCJ3b3JrZmxvdy9hcGlcIjtcbmltcG9ydCB7XG4gIHR5cGUgQWdlbnRJbnB1dCxcbiAgdHlwZSBBZ2VudE1lc3NhZ2VJbnB1dCxcbiAgYWdlbnRNZXNzYWdlSG9vayxcbiAgYWdlbnRXb3JrZmxvdyxcbn0gZnJvbSBcIi4vYWdlbnQtd29ya2Zsb3dcIjtcbmltcG9ydCB7XG4gIFNhbmRib3hFcnJvcixcbiAgU2FuZGJveE5vdEZvdW5kRXJyb3IsXG4gIFNlc3Npb25FcnJvcixcbiAgU2Vzc2lvbk5vdEZvdW5kRXJyb3IsXG59IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgdHlwZSBNY3BDb25maWcsIHR5cGUgTWNwU2VuZE9wdGlvbnMsIHNlcmlhbGl6ZU1jcENvbmZpZyB9IGZyb20gXCIuL21jcFwiO1xuaW1wb3J0IHsgZ2V0U2FuZGJveCB9IGZyb20gXCIuL3NhbmRib3hcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZVNraWxsc0RpcnMgfSBmcm9tIFwiLi9za2lsbHMvcGFyc2VyXCI7XG5pbXBvcnQgdHlwZSB7IFNraWxsc0RpciB9IGZyb20gXCIuL3NraWxscy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0U3RvcmFnZSxcbiAgdHlwZSBNZXNzYWdlLFxuICB0eXBlIFBhcnQsXG4gIHR5cGUgU2Vzc2lvbixcbiAgdHlwZSBTdG9yYWdlQ29uZmlnLFxufSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hDb25maWcgfSBmcm9tIFwiLi9zdG9yYWdlL3JwY1wiO1xuaW1wb3J0IHsgdG9NZXNzYWdlQW5kUGFydHMgfSBmcm9tIFwiLi91dGlscy9tZXNzYWdlXCI7XG5pbXBvcnQgeyBhc3NlbWJsZVVJTWVzc2FnZXMgfSBmcm9tIFwiLi91dGlscy91aVwiO1xuXG5leHBvcnQgdHlwZSBTZW5kSW5wdXQgPVxuICB8IHN0cmluZ1xuICB8IHsgcm9sZT86IFVJTWVzc2FnZVtcInJvbGVcIl07IHBhcnRzOiBVSU1lc3NhZ2VbXCJwYXJ0c1wiXTsgaWQ/OiBzdHJpbmcgfTtcblxuZXhwb3J0IHR5cGUgU2Vzc2lvbk9wdGlvbnM8XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogbmVlZGVkIGZvciBnZW5lcmljIGRlZmF1bHRcbiAgVE1jcCBleHRlbmRzIE1jcENvbmZpZyA9IHt9LFxuICBUVGFncyBleHRlbmRzIFRhZ3NTY2hlbWEgPSBUYWdzU2NoZW1hXG4+ID0ge1xuICBtb2RlbD86IEdhdGV3YXlNb2RlbElkO1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIHNhbmRib3g/OiBTYW5kYm94Q29uZmlnIHwgc3RyaW5nO1xuICB0YWdzPzogVFRhZ3M7XG4gIHNraWxsc0Rpcj86IFNraWxsc0RpcjtcbiAgbWNwPzogVE1jcDtcbn07XG5cbmV4cG9ydCB0eXBlIE1jcFRvb2xDYWxsQm9keSA9IHtcbiAgc2VydmVyOiBzdHJpbmc7XG4gIHRvb2w6IHN0cmluZztcbiAgaW5wdXQ6IHVua25vd247XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBtZXNzYWdlSWQ6IHN0cmluZztcbiAgaG9va1Rva2VuOiBzdHJpbmc7XG59O1xuXG4vLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IG5lZWRlZCBmb3IgZ2VuZXJpYyBkZWZhdWx0XG5leHBvcnQgdHlwZSBBZ2VudE9wdGlvbnM8VE1jcCBleHRlbmRzIE1jcENvbmZpZyA9IHt9PiA9IHtcbiAgc3RvcmFnZT86IFN0b3JhZ2VDb25maWc7XG4gIGdlbmVyYXRlSWQ/OiAoXG4gICAgcmVzb3VyY2U6IFwic2Vzc2lvblwiIHwgXCJtZXNzYWdlXCIgfCBcInBhcnRcIiB8IFwic2FuZGJveFwiIHwgXCJjb21tYW5kXCJcbiAgKSA9PiBzdHJpbmc7XG59ICYgU2Vzc2lvbk9wdGlvbnM8VE1jcD47XG5cbmV4cG9ydCB0eXBlIFRhZ3NTY2hlbWEgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiBuZWVkZWQgZm9yIGdlbmVyaWMgZGVmYXVsdFxuZXhwb3J0IGNvbnN0IGFnZW50ID0gPFRNY3AgZXh0ZW5kcyBNY3BDb25maWcgPSB7fT4oXG4gIG9wdGlvbnM6IEFnZW50T3B0aW9uczxUTWNwPlxuKSA9PiB7XG4gIGNvbnN0IHN0b3JhZ2VDb25maWcgPSBvcHRpb25zLnN0b3JhZ2UgPz8geyB0eXBlOiBcInZlcmNlbFwiIH07XG4gIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHN0b3JhZ2VDb25maWcpO1xuICBjb25zdCBnZW5lcmF0ZUlkID1cbiAgICBvcHRpb25zLmdlbmVyYXRlSWQgPz8gKChyZXNvdXJjZSkgPT4gYCR7cmVzb3VyY2V9XyR7dWxpZCgpfWApO1xuXG4gIGNvbnN0IHNhbmRib3ggPSBhc3luYyA8VFRhZ3MgZXh0ZW5kcyBUYWdzU2NoZW1hID0gVGFnc1NjaGVtYT4oXG4gICAgc2FuZGJveElkOiBzdHJpbmcsXG4gICAgb3B0cz86IHsgY29uZmlnPzogU2FuZGJveENvbmZpZzsgdGFncz86IFRUYWdzIH1cbiAgKSA9PiB7XG4gICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KHNhbmRib3hJZCk7XG5cbiAgICBpZiAoZXhpc3RpbmdSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKCEoZXhpc3RpbmdSZWNvcmQgaW5zdGFuY2VvZiBTYW5kYm94Tm90Rm91bmRFcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXhpc3RpbmdSZWNvcmQ7XG4gICAgICB9XG4gICAgICBjb25zdCBzYW5kYm94UmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgIGlkOiBzYW5kYm94SWQsXG4gICAgICAgIHRhZ3M6IG9wdHM/LnRhZ3MgPz8gbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgIGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgbGFzdEFjdGl2aXR5QXQ6IERhdGUubm93KCksXG4gICAgICAgIGNvbmZpZzogb3B0cz8uY29uZmlnID8/XG4gICAgICAgICAgKHR5cGVvZiBvcHRpb25zLnNhbmRib3ggPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IG9wdGlvbnMuc2FuZGJveCkgPz8geyB0eXBlOiBcInZlcmNlbFwiIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChzYW5kYm94UmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgc2FuZGJveFJlY29yZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBnZXRTYW5kYm94PFRUYWdzPih7IHN0b3JhZ2VDb25maWcsIHNhbmRib3hSZWNvcmQgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29uZmlnID0gb3B0cz8uY29uZmlnID8/IGV4aXN0aW5nUmVjb3JkLmNvbmZpZztcbiAgICBpZiAoIWVxdWFsKGV4aXN0aW5nUmVjb3JkLmNvbmZpZywgbmV3Q29uZmlnKSkge1xuICAgICAgdGhyb3cgbmV3IFNhbmRib3hFcnJvcih7XG4gICAgICAgIHJlYXNvbjogXCJzYW5kYm94IGNvbmZpZyBjaGFuZ2VzIGFyZSBub3Qgc3VwcG9ydGVkXCIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0U2FuZGJveDxUVGFncz4oeyBzdG9yYWdlQ29uZmlnLCBzYW5kYm94UmVjb3JkOiBleGlzdGluZ1JlY29yZCB9KTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHNlc3Npb246IGFzeW5jIDxcbiAgICAgIFRUYWdzIGV4dGVuZHMgVGFnc1NjaGVtYSA9IFRhZ3NTY2hlbWEsXG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IG5lZWRlZCBmb3IgZ2VuZXJpYyBkZWZhdWx0XG4gICAgICBUTWNwT3ZlcnJpZGUgZXh0ZW5kcyBNY3BDb25maWcgPSB7fVxuICAgID4oXG4gICAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICAgIHNlc3Npb25PcHRpb25zPzogU2Vzc2lvbk9wdGlvbnM8VE1jcCAmIFRNY3BPdmVycmlkZSwgVFRhZ3M+XG4gICAgKSA9PiB7XG4gICAgICBsZXQgc2Vzc2lvbiA9IGF3YWl0IHN0b3JhZ2Uuc2Vzc2lvbi5nZXQoc2Vzc2lvbklkKTtcblxuICAgICAgLyoqXG4gICAgICAgKiBub3JtYWxpemUgc2FuZGJveCBpbnB1dCB0byBhIHNhbmRib3ggSUQgYW5kIGNvbmZpZ1xuICAgICAgICovXG4gICAgICBjb25zdCBzYW5kYm94SW5wdXQgPSBzZXNzaW9uT3B0aW9ucz8uc2FuZGJveCA/PyBvcHRpb25zLnNhbmRib3g7XG4gICAgICBjb25zdCBzYW5kYm94SWQgPVxuICAgICAgICB0eXBlb2Ygc2FuZGJveElucHV0ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBzYW5kYm94SW5wdXRcbiAgICAgICAgICA6IC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTmVzdGVkVGVybmFyeTogb2tcbiAgICAgICAgICBzZXNzaW9uIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICA/IGdlbmVyYXRlSWQoXCJzYW5kYm94XCIpXG4gICAgICAgICAgOiBzZXNzaW9uLnNhbmRib3hJZCA/PyBnZW5lcmF0ZUlkKFwic2FuZGJveFwiKTtcbiAgICAgIGNvbnN0IHNhbmRib3hQcm9taXNlID0gc2FuZGJveChcbiAgICAgICAgc2FuZGJveElkLFxuICAgICAgICB0eXBlb2Ygc2FuZGJveElucHV0ID09PSBcInN0cmluZ1wiID8gdW5kZWZpbmVkIDogeyBjb25maWc6IHNhbmRib3hJbnB1dCB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBleGlzdGluZ1Nlc3Npb24gPSBzZXNzaW9uIGluc3RhbmNlb2YgRXJyb3IgPyBudWxsIDogc2Vzc2lvbjtcbiAgICAgIGNvbnN0IG1jcENvbmZpZyA9XG4gICAgICAgIG9wdGlvbnMubWNwIHx8IHNlc3Npb25PcHRpb25zPy5tY3BcbiAgICAgICAgICA/IHsgLi4ub3B0aW9ucy5tY3AsIC4uLnNlc3Npb25PcHRpb25zPy5tY3AgfVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgIGNvbnN0IHNraWxsc0RpciA9XG4gICAgICAgIHNlc3Npb25PcHRpb25zPy5za2lsbHNEaXIgPz9cbiAgICAgICAgZXhpc3RpbmdTZXNzaW9uPy5za2lsbHNEaXIgPz9cbiAgICAgICAgb3B0aW9ucy5za2lsbHNEaXIgPz9cbiAgICAgICAgbnVsbDtcblxuICAgICAgaWYgKHNlc3Npb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIFNlc3Npb25Ob3RGb3VuZEVycm9yKSB7XG4gICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID1cbiAgICAgICAgICAgIHNlc3Npb25PcHRpb25zPy5pbnN0cnVjdGlvbnMgPz8gb3B0aW9ucy5pbnN0cnVjdGlvbnMgPz8gbnVsbDtcbiAgICAgICAgICBjb25zdCBtb2RlbCA9IHNlc3Npb25PcHRpb25zPy5tb2RlbCA/PyBvcHRpb25zLm1vZGVsID8/IG51bGw7XG4gICAgICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogXCJNb2RlbCBpcyBub3Qgc2V0XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2Vzc2lvbiA9IGF3YWl0IHN0b3JhZ2Uuc2Vzc2lvbi5zZXQoe1xuICAgICAgICAgICAgaWQ6IHNlc3Npb25JZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGxhc3RNZXNzYWdlSWQ6IG51bGwsXG4gICAgICAgICAgICBydW5JZDogbnVsbCxcbiAgICAgICAgICAgIHRhZ3M6IHNlc3Npb25PcHRpb25zPy50YWdzID8/IG51bGwsXG4gICAgICAgICAgICBpbnN0cnVjdGlvbnMsXG4gICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgIG1jcDogbWNwQ29uZmlnID8gc2VyaWFsaXplTWNwQ29uZmlnKG1jcENvbmZpZykgOiBudWxsLFxuICAgICAgICAgICAgc2FuZGJveElkLFxuICAgICAgICAgICAgc2tpbGxzRGlyOiBza2lsbHNEaXIgPyBub3JtYWxpemVTa2lsbHNEaXJzKHNraWxsc0RpcikgOiBudWxsLFxuICAgICAgICAgICAgaG9va1Rva2VuOiBudWxsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHNlc3Npb247XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGlzIGlzIGFuIGV4aXN0aW5nIHNlc3Npb24uIHdlIGNvbXBhcmUgdGhlIG9wdGlvbnMgYW5kIHVwZGF0ZSB0aGUgc2Vzc2lvbiBpZiBuZWNlc3NhcnkuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCB1cGRhdGVkOiBTZXNzaW9uID0ge1xuICAgICAgICAgIC4uLnNlc3Npb24sXG4gICAgICAgICAgLi4uc2Vzc2lvbk9wdGlvbnMsXG4gICAgICAgICAgbWNwOiBtY3BDb25maWcgPyBzZXJpYWxpemVNY3BDb25maWcobWNwQ29uZmlnKSA6IHNlc3Npb24ubWNwLFxuICAgICAgICAgIHNhbmRib3hJZCxcbiAgICAgICAgICBza2lsbHNEaXI6IHNraWxsc0RpciA/IG5vcm1hbGl6ZVNraWxsc0RpcnMoc2tpbGxzRGlyKSA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICAgIGlmICghZXF1YWwodXBkYXRlZCwgc2Vzc2lvbikpIHtcbiAgICAgICAgICBzZXNzaW9uID0gYXdhaXQgc3RvcmFnZS5zZXNzaW9uLnNldCh1cGRhdGVkKTtcbiAgICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBzZXNzaW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpbnRlcnJ1cHRDdXJyZW50TWVzc2FnZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFNlc3Npb24gPSBhd2FpdCBzdG9yYWdlLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgIGlmIChjdXJyZW50U2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnRTZXNzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3VycmVudFNlc3Npb24ubGFzdE1lc3NhZ2VJZCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHN0b3JhZ2UubWVzc2FnZS5nZXQoY3VycmVudFNlc3Npb24ubGFzdE1lc3NhZ2VJZCk7XG4gICAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5jb21wbGV0ZWRBdCAhPT0gbnVsbCB8fCBtZXNzYWdlLmludGVycnVwdGVkQXQgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UubWVzc2FnZS5zZXQoe1xuICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgaW50ZXJydXB0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlbmQ6IGFzeW5jICh7XG4gICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgbWNwQ29udGV4dCxcbiAgICAgICAgICBpbnRlcnJ1cHRJZlN0cmVhbWluZyxcbiAgICAgICAgfToge1xuICAgICAgICAgIGlucHV0OiBTZW5kSW5wdXQgfCBTZW5kSW5wdXRbXTtcbiAgICAgICAgICBtY3BDb250ZXh0PzogTWNwU2VuZE9wdGlvbnM8VE1jcCAmIFRNY3BPdmVycmlkZT47XG4gICAgICAgICAgaW50ZXJydXB0SWZTdHJlYW1pbmc/OiBib29sZWFuO1xuICAgICAgICB9KSA9PiB7XG4gICAgICAgICAgaWYgKGludGVycnVwdElmU3RyZWFtaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcnJ1cHRSZXN1bHQgPSBhd2FpdCBpbnRlcnJ1cHRDdXJyZW50TWVzc2FnZSgpO1xuICAgICAgICAgICAgaWYgKGludGVycnVwdFJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpbnRlcnJ1cHRSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG5ld01lc3NhZ2VzOiBNZXNzYWdlW10gPSBbXTtcbiAgICAgICAgICBjb25zdCBuZXdQYXJ0czogUGFydFtdID0gW107XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaW5wdXQpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBwYXJ0cyB9ID0gdG9NZXNzYWdlQW5kUGFydHMoe1xuICAgICAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICBpbnB1dDogaSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0Um9sZTogXCJ1c2VyXCIsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVJZDogKCkgPT4gZ2VuZXJhdGVJZChcIm1lc3NhZ2VcIiksXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIG5ld01lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgIG5ld1BhcnRzLnB1c2goLi4ucGFydHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIHBhcnRzIH0gPSB0b01lc3NhZ2VBbmRQYXJ0cyh7XG4gICAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgIGRlZmF1bHRSb2xlOiBcInVzZXJcIixcbiAgICAgICAgICAgICAgZ2VuZXJhdGVJZDogKCkgPT4gZ2VuZXJhdGVJZChcIm1lc3NhZ2VcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5ld01lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICBuZXdQYXJ0cy5wdXNoKC4uLnBhcnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogd2UgYWxzbyBwcmUtY3JlYXRlIHRoZSBhc3Npc3RhbnQgbWVzc2FnZVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGNvbnN0IGFzc2lzdGFudE1lc3NhZ2VJZCA9IGdlbmVyYXRlSWQoXCJtZXNzYWdlXCIpO1xuICAgICAgICAgIG5ld01lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgICAgaWQ6IGFzc2lzdGFudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogbnVsbCxcbiAgICAgICAgICAgIGludGVycnVwdGVkQXQ6IG51bGwsXG4gICAgICAgICAgICBtY3BDb250ZXh0LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3Qgc2Vzc2lvbjIgPSBhd2FpdCBzdG9yYWdlLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgICAgaWYgKHNlc3Npb24yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IHNlc3Npb24yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFnZW50SW5wdXQ6IEFnZW50SW5wdXQgPSB7XG4gICAgICAgICAgICBzdG9yYWdlQ29uZmlnLFxuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgZXZlbnQ6IEFnZW50TWVzc2FnZUlucHV0ID0ge1xuICAgICAgICAgICAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgaG9va1Rva2VuOiBjcnlwdG8ucmFuZG9tVVVJRCgpLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgICAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCBhbGwoe1xuICAgICAgICAgICAgICAgIGFzeW5jIHNhdmVNZXNzYWdlcygpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICBuZXdNZXNzYWdlcy5tYXAoKG0sIGkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS5tZXNzYWdlLnNldCh7IC4uLm0sIGNyZWF0ZWRBdDogYmFzZVRpbWUgKyBpIH0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhc3luYyBzYXZlUGFydHMoKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChuZXdQYXJ0cy5tYXAoc3RvcmFnZS5wYXJ0LnNldCkpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgcmVzdW1lT3JTdGFydEFnZW50V29ya2Zsb3coKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbjIucnVuSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYWdlbnRNZXNzYWdlSG9vay5yZXN1bWUoc2Vzc2lvbklkLCBldmVudCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydFJlc3VsdCA9IGF3YWl0IHN0YXJ0KGFnZW50V29ya2Zsb3csIFtcbiAgICAgICAgICAgICAgICAgICAgICB7IGlucHV0OiBhZ2VudElucHV0LCBldmVudCB9LFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbjIucnVuSWQgPSBzdGFydFJlc3VsdC5ydW5JZDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFzeW5jIHVwZGF0ZVNlc3Npb24oKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiQucmVzdW1lT3JTdGFydEFnZW50V29ya2Zsb3c7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLnNlc3Npb24uc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2Vzc2lvbjIsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgbGFzdE1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICBob29rVG9rZW46IGV2ZW50Lmhvb2tUb2tlbixcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2F0Y2g6IChlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbkVycm9yKHtcbiAgICAgICAgICAgICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogYGZhaWxlZCB0byBzZW5kOiAke1N0cmluZyhlKX1gLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc3RyZWFtOiBhc3luYyAob3B0cz86IHsgbWVzc2FnZUlkPzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc3RvcmFnZS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuICAgICAgICAgIGlmIChzZXNzaW9uIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBvcHRzPy5tZXNzYWdlSWQgPz8gc2Vzc2lvbi5sYXN0TWVzc2FnZUlkO1xuICAgICAgICAgIGlmICghbWVzc2FnZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogXCJObyBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzZXNzaW9uLnJ1bklkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogXCJObyBydW4gYXNzb2NpYXRlZCB3aXRoIHNlc3Npb25cIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBydW4gPSBnZXRSdW4oc2Vzc2lvbi5ydW5JZCk7XG4gICAgICAgICAgcmV0dXJuIHJ1bi5nZXRSZWFkYWJsZSh7IG5hbWVzcGFjZTogbWVzc2FnZUlkIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVpOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgW21lc3NhZ2VzUmVzdWx0LCBwYXJ0c1Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICBzdG9yYWdlLm1lc3NhZ2UubGlzdChzZXNzaW9uSWQpLFxuICAgICAgICAgICAgc3RvcmFnZS5wYXJ0Lmxpc3RCeVNlc3Npb24oc2Vzc2lvbklkKSxcbiAgICAgICAgICBdKTtcblxuICAgICAgICAgIGlmIChtZXNzYWdlc1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZXNSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwYXJ0c1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFydHNSZXN1bHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBhc3NlbWJsZVVJTWVzc2FnZXMoe1xuICAgICAgICAgICAgbWVzc2FnZXM6IG1lc3NhZ2VzUmVzdWx0Lml0ZW1zLFxuICAgICAgICAgICAgcGFydHM6IHBhcnRzUmVzdWx0Lml0ZW1zLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgbGFzdE1lc3NhZ2UgPSBtZXNzYWdlc1Jlc3VsdC5pdGVtcy5hdCgtMSk7XG4gICAgICAgICAgY29uc3QgaXNTdHJlYW1pbmcgPVxuICAgICAgICAgICAgbGFzdE1lc3NhZ2U/LnJvbGUgPT09IFwiYXNzaXN0YW50XCIgJiZcbiAgICAgICAgICAgIGxhc3RNZXNzYWdlLmNvbXBsZXRlZEF0ID09PSBudWxsICYmXG4gICAgICAgICAgICBsYXN0TWVzc2FnZS5pbnRlcnJ1cHRlZEF0ID09PSBudWxsO1xuICAgICAgICAgIGNvbnN0IHN0cmVhbWluZ01lc3NhZ2VJZCA9IGlzU3RyZWFtaW5nID8gbGFzdE1lc3NhZ2UuaWQgOiBudWxsO1xuXG4gICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZXMsIHN0cmVhbWluZ01lc3NhZ2VJZCB9O1xuICAgICAgICB9LFxuICAgICAgICB0YWc6IHtcbiAgICAgICAgICBsaXN0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc3RvcmFnZS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuICAgICAgICAgICAgaWYgKHNlc3Npb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoc2Vzc2lvbi50YWdzID8/IHt9KSBhcyBUVGFncztcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdldDogYXN5bmMgKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc3RvcmFnZS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuICAgICAgICAgICAgaWYgKHNlc3Npb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLnRhZ3M/LltrZXkgYXMgc3RyaW5nXSBhc1xuICAgICAgICAgICAgICB8IFRUYWdzW3R5cGVvZiBrZXldXG4gICAgICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0OiBhc3luYyAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLnNlc3Npb24udGFnLnNldCh7XG4gICAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgdGFnczogeyBba2V5XTogdmFsdWUgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0TWFueTogYXN5bmMgKHRhZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLnNlc3Npb24udGFnLnNldCh7XG4gICAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgdGFnczogdGFncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNhbmRib3g6IGF3YWl0IHNhbmRib3hQcm9taXNlLFxuXG4gICAgICAgIGludGVycnVwdDogaW50ZXJydXB0Q3VycmVudE1lc3NhZ2UsXG4gICAgICB9O1xuICAgIH0sXG4gICAgc2FuZGJveCxcbiAgICBzdG9yYWdlLFxuICAgIGhhbmRsZU1jcFRvb2xDYWxsOiBhc3luYyAoXG4gICAgICBib2R5OiBNY3BUb29sQ2FsbEJvZHksXG4gICAgICBoYW5kbGVyczogUmVjb3JkPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIChvcHRzOiB7XG4gICAgICAgICAgaW5wdXQ6IHVua25vd247XG4gICAgICAgICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgICBib2R5OiBNY3BUb29sQ2FsbEJvZHk7XG4gICAgICAgIH0pID0+IFByb21pc2U8dW5rbm93bj5cbiAgICAgID5cbiAgICApOiBQcm9taXNlPFxuICAgICAgeyByZXN1bHQ6IHVua25vd24gfSB8IHsgZXJyb3I6IHsgY29kZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfSB9XG4gICAgPiA9PiB7XG4gICAgICBjb25zdCB7IHNlcnZlciwgdG9vbCwgaW5wdXQsIHNlc3Npb25JZCwgbWVzc2FnZUlkLCBob29rVG9rZW4gfSA9IGJvZHk7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXJLZXkgPSBgJHtzZXJ2ZXJ9LyR7dG9vbH1gO1xuICAgICAgY29uc3QgaGFuZGxlciA9IGhhbmRsZXJzW2hhbmRsZXJLZXldO1xuICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIGNvZGU6IFwiSEFORExFUl9OT1RfRk9VTkRcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBObyBoYW5kbGVyIGZvciAke2hhbmRsZXJLZXl9YCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc3RvcmFnZS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuICAgICAgaWYgKHNlc3Npb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB7IGNvZGU6IFwiU0VTU0lPTl9OT1RfRk9VTkRcIiwgbWVzc2FnZTogXCJTZXNzaW9uIG5vdCBmb3VuZFwiIH0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghc2Vzc2lvbi5ob29rVG9rZW4gfHwgc2Vzc2lvbi5ob29rVG9rZW4gIT09IGhvb2tUb2tlbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB7IGNvZGU6IFwiSU5WQUxJRF9UT0tFTlwiLCBtZXNzYWdlOiBcIkludmFsaWQgaG9vayB0b2tlblwiIH0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCBzdG9yYWdlLm1lc3NhZ2UuZ2V0KG1lc3NhZ2VJZCk7XG4gICAgICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHsgY29kZTogXCJNRVNTQUdFX05PVF9GT1VORFwiLCBtZXNzYWdlOiBcIk1lc3NhZ2Ugbm90IGZvdW5kXCIgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWNwQ29udGV4dCA9IG1lc3NhZ2UubWNwQ29udGV4dCBhcyBNY3BTZW5kT3B0aW9uczxUTWNwPiB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHNlcnZlckNvbnRleHQgPSBtY3BDb250ZXh0Py5bc2VydmVyIGFzIGtleW9mIHR5cGVvZiBtY3BDb250ZXh0XTtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSAoc2VydmVyQ29udGV4dD8uaGVhZGVycyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcih7IGlucHV0LCBoZWFkZXJzLCBib2R5IH0pO1xuICAgICAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJFWEVDVVRJT05fRVJST1JcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59O1xuIiwgImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmV4cG9ydCB0eXBlIE1jcFRvb2xEZWYgPSB7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGlucHV0U2NoZW1hOiB6LlpvZFR5cGU7XG4gIG91dHB1dFNjaGVtYT86IHouWm9kVHlwZTtcbn07XG5cbmV4cG9ydCB0eXBlIE1jcFNlcnZlckRlZjxcbiAgVFRvb2xzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgTWNwVG9vbERlZj4gPSBSZWNvcmQ8c3RyaW5nLCBNY3BUb29sRGVmPixcbiAgVEhlYWRlcnMgZXh0ZW5kcyB6LlpvZFR5cGUgPSB6LlpvZFR5cGUsXG4+ID0ge1xuICB1cmw6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGhlYWRlcnNTY2hlbWE/OiBUSGVhZGVycztcbiAgdG9vbHM6IFRUb29scztcbn07XG5cbmV4cG9ydCB0eXBlIE1jcENvbmZpZyA9IFJlY29yZDxzdHJpbmcsIE1jcFNlcnZlckRlZj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVNY3BDb25maWcobWNwOiBNY3BDb25maWcpOiBNY3BTZXJ2ZXJTY2hlbWFbXSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhtY3ApLm1hcCgoW25hbWUsIHNlcnZlcl0pID0+ICh7XG4gICAgbmFtZSxcbiAgICB1cmw6IHNlcnZlci51cmwsXG4gICAgZGVzY3JpcHRpb246IHNlcnZlci5kZXNjcmlwdGlvbixcbiAgICB0b29sczogT2JqZWN0LmVudHJpZXMoc2VydmVyLnRvb2xzKS5tYXAoKFt0b29sTmFtZSwgdG9vbF0pID0+ICh7XG4gICAgICBuYW1lOiB0b29sTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0b29sLmRlc2NyaXB0aW9uLFxuICAgICAgaW5wdXRTY2hlbWE6IHoudG9KU09OU2NoZW1hKHRvb2wuaW5wdXRTY2hlbWEpLFxuICAgICAgb3V0cHV0U2NoZW1hOiB0b29sLm91dHB1dFNjaGVtYVxuICAgICAgICA/IHoudG9KU09OU2NoZW1hKHRvb2wub3V0cHV0U2NoZW1hKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KSksXG4gIH0pKTtcbn1cblxuZXhwb3J0IHR5cGUgTWNwVG9vbFNjaGVtYSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBpbnB1dFNjaGVtYTogdW5rbm93bjtcbiAgb3V0cHV0U2NoZW1hPzogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIE1jcFNlcnZlclNjaGVtYSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHRvb2xzOiBNY3BUb29sU2NoZW1hW107XG59O1xuXG50eXBlIEV4dHJhY3RIZWFkZXJzPFQ+ID1cbiAgVCBleHRlbmRzIE1jcFNlcnZlckRlZjxpbmZlciBfVFRvb2xzLCBpbmZlciBUSGVhZGVycz5cbiAgICA/IFRIZWFkZXJzIGV4dGVuZHMgei5ab2RUeXBlXG4gICAgICA/IHouaW5mZXI8VEhlYWRlcnM+XG4gICAgICA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbnR5cGUgSGFzUmVxdWlyZWRIZWFkZXJzPFQgZXh0ZW5kcyBNY3BTZXJ2ZXJEZWY+ID0gVCBleHRlbmRzIHtcbiAgaGVhZGVyc1NjaGVtYTogei5ab2RUeXBlO1xufVxuICA/IHRydWVcbiAgOiBmYWxzZTtcblxudHlwZSBTZXJ2ZXJTZW5kT3B0aW9uczxUIGV4dGVuZHMgTWNwU2VydmVyRGVmPiA9XG4gIEhhc1JlcXVpcmVkSGVhZGVyczxUPiBleHRlbmRzIHRydWVcbiAgICA/XG4gICAgICAgIHwgeyBoZWFkZXJzOiBFeHRyYWN0SGVhZGVyczxUPjsgZGlzYWJsZWQ/OiBmYWxzZSB9XG4gICAgICAgIHwgeyBkaXNhYmxlZDogdHJ1ZTsgaGVhZGVycz86IEV4dHJhY3RIZWFkZXJzPFQ+IH1cbiAgICA6IHsgaGVhZGVycz86IEV4dHJhY3RIZWFkZXJzPFQ+OyBkaXNhYmxlZD86IGJvb2xlYW4gfTtcblxuZXhwb3J0IHR5cGUgTWNwU2VuZE9wdGlvbnM8VE1jcCBleHRlbmRzIE1jcENvbmZpZz4gPSB7XG4gIFtLIGluIGtleW9mIFRNY3BdPzogU2VydmVyU2VuZE9wdGlvbnM8VE1jcFtLXT47XG59O1xuXG5leHBvcnQgdHlwZSBNY3BUb29sQ2FsbFJlcXVlc3QgPSB7XG4gIHNlcnZlcjogc3RyaW5nO1xuICB0b29sOiBzdHJpbmc7XG4gIGlucHV0OiB1bmtub3duO1xuICBtZXNzYWdlSWQ6IHN0cmluZztcbiAgbWNwVG9rZW46IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIE1jcFRvb2xDYWxsU3VjY2Vzc1Jlc3BvbnNlPFQgPSB1bmtub3duPiA9IHtcbiAgcmVzdWx0OiBUO1xufTtcblxuZXhwb3J0IHR5cGUgTWNwVG9vbENhbGxFcnJvclJlc3BvbnNlID0ge1xuICBlcnJvcjogeyBjb2RlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9O1xufTtcblxuZXhwb3J0IHR5cGUgTWNwVG9vbENhbGxSZXNwb25zZTxUID0gdW5rbm93bj4gPVxuICB8IE1jcFRvb2xDYWxsU3VjY2Vzc1Jlc3BvbnNlPFQ+XG4gIHwgTWNwVG9vbENhbGxFcnJvclJlc3BvbnNlO1xuXG50eXBlIEV4dHJhY3RJbnB1dDxUIGV4dGVuZHMgTWNwVG9vbERlZj4gPSBUIGV4dGVuZHMgeyBpbnB1dFNjaGVtYTogaW5mZXIgUyB9XG4gID8gUyBleHRlbmRzIHouWm9kVHlwZVxuICAgID8gei5pbmZlcjxTPlxuICAgIDogdW5rbm93blxuICA6IHVua25vd247XG5cbnR5cGUgSGFuZGxlckZvclRvb2w8XG4gIFRTZXJ2ZXIgZXh0ZW5kcyBNY3BTZXJ2ZXJEZWYsXG4gIFRUb29sIGV4dGVuZHMgTWNwVG9vbERlZixcbj4gPSAob3B0czoge1xuICBpbnB1dDogRXh0cmFjdElucHV0PFRUb29sPjtcbiAgaGVhZGVyczogRXh0cmFjdEhlYWRlcnM8VFNlcnZlcj47XG59KSA9PiBQcm9taXNlPHVua25vd24+O1xuXG50eXBlIEJ1aWxkSGFuZGxlcnM8VE1jcCBleHRlbmRzIE1jcENvbmZpZz4gPSB7XG4gIFtLIGluIGtleW9mIFRNY3AgJiBzdHJpbmddOiB7XG4gICAgW1QgaW4ga2V5b2YgVE1jcFtLXVtcInRvb2xzXCJdICYgc3RyaW5nXToge1xuICAgICAga2V5OiBgJHtLfS8ke1R9YDtcbiAgICAgIGhhbmRsZXI6IEhhbmRsZXJGb3JUb29sPFRNY3BbS10sIFRNY3BbS11bXCJ0b29sc1wiXVtUXT47XG4gICAgfTtcbiAgfVtrZXlvZiBUTWNwW0tdW1widG9vbHNcIl0gJiBzdHJpbmddO1xufVtrZXlvZiBUTWNwICYgc3RyaW5nXTtcblxudHlwZSBVbmlvblRvSW50ZXJzZWN0aW9uPFU+ID0gKFxuICBVIGV4dGVuZHMgdW5rbm93blxuICAgID8gKGs6IFUpID0+IHZvaWRcbiAgICA6IG5ldmVyXG4pIGV4dGVuZHMgKGs6IGluZmVyIEkpID0+IHZvaWRcbiAgPyBJXG4gIDogbmV2ZXI7XG5cbnR5cGUgSGFuZGxlcnNGcm9tVW5pb248VT4gPSBVbmlvblRvSW50ZXJzZWN0aW9uPFxuICBVIGV4dGVuZHMgeyBrZXk6IGluZmVyIEs7IGhhbmRsZXI6IGluZmVyIEggfVxuICAgID8gSyBleHRlbmRzIHN0cmluZ1xuICAgICAgPyB7IFtQIGluIEtdOiBIIH1cbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyXG4+O1xuXG5leHBvcnQgdHlwZSBNY3BUb29sQ2FsbEhhbmRsZXJzPFRNY3AgZXh0ZW5kcyBNY3BDb25maWc+ID0gSGFuZGxlcnNGcm9tVW5pb248XG4gIEJ1aWxkSGFuZGxlcnM8VE1jcD5cbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBtY3A8XG4gIFRIZWFkZXJzIGV4dGVuZHMgei5ab2RUeXBlLFxuICBUVG9vbHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBNY3BUb29sRGVmPixcbj4ob3B0czoge1xuICB1cmw6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGhlYWRlcnNTY2hlbWE/OiBUSGVhZGVycztcbiAgdG9vbHM6IFRUb29scztcbn0pOiBNY3BTZXJ2ZXJEZWY8VFRvb2xzLCBUSGVhZGVycz4ge1xuICByZXR1cm4gb3B0cztcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFVJTWVzc2FnZSB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudE9wdGlvbnMsIFNlbmRJbnB1dCB9IGZyb20gXCIuLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUGFydCB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b01lc3NhZ2VBbmRQYXJ0cyh7XG4gIHNlc3Npb25JZCxcbiAgaWQsXG4gIGlucHV0LFxuICBnZW5lcmF0ZUlkLFxuICBkZWZhdWx0Um9sZSxcbn06IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBpbnB1dDogU2VuZElucHV0O1xuICBnZW5lcmF0ZUlkOiBOb25OdWxsYWJsZTxBZ2VudE9wdGlvbnNbXCJnZW5lcmF0ZUlkXCJdPjtcbiAgZGVmYXVsdFJvbGU6IFVJTWVzc2FnZVtcInJvbGVcIl07XG59KTogeyBtZXNzYWdlOiBNZXNzYWdlOyBwYXJ0czogUGFydFtdIH0ge1xuICBjb25zdCBtZXNzYWdlSWQgPSBpZCA/PyBnZW5lcmF0ZUlkKFwibWVzc2FnZVwiKTtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB7XG4gICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgcm9sZTogZGVmYXVsdFJvbGUsXG4gICAgICAgIGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgY29tcGxldGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgIGludGVycnVwdGVkQXQ6IG51bGwsXG4gICAgICAgIG1jcENvbnRleHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgcGFydHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgaWQ6IGdlbmVyYXRlSWQoXCJwYXJ0XCIpLFxuICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgIHBhcnQ6IHsgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGlucHV0IH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlOiB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBpZDogbWVzc2FnZUlkLFxuICAgICAgY3JlYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgY29tcGxldGVkQXQ6IERhdGUubm93KCksXG4gICAgICBpbnRlcnJ1cHRlZEF0OiBudWxsLFxuICAgICAgbWNwQ29udGV4dDogbnVsbCxcbiAgICAgIHJvbGU6IGlucHV0LnJvbGUgPz8gZGVmYXVsdFJvbGUsXG4gICAgfSxcbiAgICBwYXJ0czogaW5wdXQucGFydHMubWFwKChwYXJ0LCBpbmRleCkgPT4gKHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIG1lc3NhZ2VJZCxcbiAgICAgIGlkOiBnZW5lcmF0ZUlkKFwicGFydFwiKSxcbiAgICAgIGluZGV4LFxuICAgICAgcGFydCxcbiAgICB9KSksXG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxTQUFTLFdBQVc7QUFDcEIsWUFBWSxZQUFZO0FBQ3hCLE9BQU8sV0FBVztBQUNsQixTQUFTLFlBQVk7QUFDckIsU0FBUyxRQUFRLGFBQWE7OztBQ0w5QixTQUFTLFNBQVM7QUFvQlgsU0FBUyxtQkFBbUJBLE1BQW1DO0FBQ3BFLFNBQU8sT0FBTyxRQUFRQSxJQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxNQUFNLE9BQU87QUFBQSxJQUNsRDtBQUFBLElBQ0EsS0FBSyxPQUFPO0FBQUEsSUFDWixhQUFhLE9BQU87QUFBQSxJQUNwQixPQUFPLE9BQU8sUUFBUSxPQUFPLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksT0FBTztBQUFBLE1BQzdELE1BQU07QUFBQSxNQUNOLGFBQWEsS0FBSztBQUFBLE1BQ2xCLGFBQWEsRUFBRSxhQUFhLEtBQUssV0FBVztBQUFBLE1BQzVDLGNBQWMsS0FBSyxlQUNmLEVBQUUsYUFBYSxLQUFLLFlBQVksSUFDaEM7QUFBQSxJQUNOLEVBQUU7QUFBQSxFQUNKLEVBQUU7QUFDSjtBQXVHTyxTQUFTLElBR2QsTUFLaUM7QUFDakMsU0FBTztBQUNUOzs7QUMvSU8sU0FBUyxrQkFBa0I7QUFBQSxFQUNoQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixHQU13QztBQUN0QyxRQUFNLFlBQVksTUFBTSxXQUFXLFNBQVM7QUFDNUMsTUFBSSxPQUFPLFVBQVUsVUFB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
|
|
1035
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaWVudC50cyIsICIuLi9zcmMvcnBjLWRpc3BhdGNoLnRzIiwgIi4uL3NyYy91dGlscy9tZXNzYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7XG4gIEdhdGV3YXlNb2RlbElkLFxuICBJbmZlclRvb2xJbnB1dCxcbiAgSW5mZXJVSVRvb2xzLFxuICBNb2RlbE1lc3NhZ2UsXG4gIFRvb2xTZXQsXG4gIFVJRGF0YVR5cGVzLFxuICBVSU1lc3NhZ2UsXG4gIFVJTWVzc2FnZUNodW5rLFxufSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IGFsbCB9IGZyb20gXCJiZXR0ZXItYWxsXCI7XG5pbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuaW1wb3J0IGVxdWFsIGZyb20gXCJmYXN0LWRlZXAtZXF1YWxcIjtcbmltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHsgZ2V0UnVuLCBzdGFydCB9IGZyb20gXCJ3b3JrZmxvdy9hcGlcIjtcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7XG4gIHR5cGUgQWdlbnRJbnB1dCxcbiAgdHlwZSBBZ2VudE1lc3NhZ2VJbnB1dCxcbiAgYWdlbnRNZXNzYWdlSG9vayxcbiAgYWdlbnRXb3JrZmxvdyxcbiAgYXBwcm92YWxIb29rLFxufSBmcm9tIFwiLi9hZ2VudC13b3JrZmxvd1wiO1xuaW1wb3J0IHtcbiAgU2FuZGJveE5vdEZvdW5kRXJyb3IsXG4gIFNlc3Npb25FcnJvcixcbiAgU2Vzc2lvbk5vdEZvdW5kRXJyb3IsXG59IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0aW9uT3B0aW9ucyB9IGZyb20gXCIuL2dlbmVyYXRpb25cIjtcbmltcG9ydCB7XG4gIHR5cGUgRGlzcGF0Y2hDb250ZXh0LFxuICBkaXNwYXRjaCxcbiAgdHlwZSBIb29rVG9vbEFmdGVyUGFyYW1zLFxuICB0eXBlIEhvb2tUb29sQWZ0ZXJSZXN1bHQsXG4gIHR5cGUgSG9va1Rvb2xCZWZvcmVQYXJhbXMsXG4gIHR5cGUgSG9va1Rvb2xCZWZvcmVSZXN1bHQsXG4gIHR5cGUgVG9vbE1ldGFkYXRhLFxuICB0eXBlIFRvb2xzRXhlY3V0ZVBhcmFtcyxcbiAgdHlwZSBUb29sc05lZWRzQXBwcm92YWxQYXJhbXMsXG4gIHR5cGUgVG9vbHNOZWVkc0FwcHJvdmFsUmVzdWx0LFxufSBmcm9tIFwiLi9ycGMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7IGdldFNhbmRib3ggfSBmcm9tIFwiLi9zYW5kYm94XCI7XG5pbXBvcnQgeyBub3JtYWxpemVTa2lsbHNEaXJzIH0gZnJvbSBcIi4vc2tpbGxzL3BhcnNlclwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbHNEaXIgfSBmcm9tIFwiLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgU3RvcmFnZSBhcyBBZ2VudFN0b3JhZ2UsXG4gIERFRkFVTFRfTkFNRVNQQUNFLFxuICBnZXRTdG9yYWdlLFxuICBMT0NBTF9TVE9SQUdFX1ZFUlNJT04sXG4gIHR5cGUgTWVzc2FnZSxcbiAgdHlwZSBQYXJ0LFxuICB0eXBlIFNhbmRib3hDb25maWcsXG4gIHR5cGUgU2Vzc2lvbixcbiAgdHlwZSBTdG9yYWdlQ29uZmlnLFxuICB0eXBlIEhhbmRsZXJzIGFzIFN0b3JhZ2VIYW5kbGVycyxcbiAgdHlwZSBTdG9yYWdlTWV0aG9kcyxcbn0gZnJvbSBcIi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgdHlwZSBCdWlsdEluVG9vbE5hbWUsIGJ1aWx0SW5Ub29scywgdHlwZSBUb29sQ29udGV4dCB9IGZyb20gXCIuL3Rvb2xzXCI7XG5pbXBvcnQgeyB0b01lc3NhZ2VBbmRQYXJ0cyB9IGZyb20gXCIuL3V0aWxzL21lc3NhZ2VcIjtcbmltcG9ydCB7IGFzc2VtYmxlVUlNZXNzYWdlcyB9IGZyb20gXCIuL3V0aWxzL3VpXCI7XG5pbXBvcnQgeyBjb21wdXRlU2Vzc2lvblVzYWdlLCB0eXBlIFNlc3Npb25Vc2FnZSB9IGZyb20gXCIuL3V0aWxzL3VzYWdlXCI7XG5cbmV4cG9ydCB0eXBlIFNlbmRJbnB1dCA9XG4gIHwgc3RyaW5nXG4gIHwgeyByb2xlPzogVUlNZXNzYWdlW1wicm9sZVwiXTsgcGFydHM6IFVJTWVzc2FnZVtcInBhcnRzXCJdOyBpZD86IHN0cmluZyB9O1xuXG4vKipcbiAqIEluZmVyIGEgdHlwZWQgVUlNZXNzYWdlIGZyb20gYW4gYWdlbnQgaW5zdGFuY2UuXG4gKiBUb29sIHBhcnRzIGFyZSBkaXNjcmltaW5hdGVkIGJ5IGB0eXBlOiBcInRvb2wtJHtuYW1lfVwiYCB3aXRoIHR5cGVkIGlucHV0L291dHB1dC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IG15QWdlbnQgPSBhZ2VudCh7IHRvb2xzOiB7IG15VG9vbDogdG9vbCh7Li4ufSkgfSB9KTtcbiAqIHR5cGUgTXlNZXNzYWdlID0gSW5mZXJVSU1lc3NhZ2U8dHlwZW9mIG15QWdlbnQ+O1xuICogLy8gTXlNZXNzYWdlLnBhcnRzIGluY2x1ZGVzIHsgdHlwZTogXCJ0b29sLW15VG9vbFwiOyBpbnB1dDogTXlJbnB1dDsgb3V0cHV0OiBNeU91dHB1dDsgLi4uIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBJbmZlclVJTWVzc2FnZTxBPiA9IEEgZXh0ZW5kcyB7IHRvb2xzOiBpbmZlciBUIGV4dGVuZHMgVG9vbFNldCB9XG4gID8gVUlNZXNzYWdlPHVua25vd24sIFVJRGF0YVR5cGVzLCBJbmZlclVJVG9vbHM8VD4+XG4gIDogVUlNZXNzYWdlO1xuXG50eXBlIFRvb2xOYW1lPFRvb2xzPiA9IEV4dHJhY3Q8a2V5b2YgVG9vbHMsIHN0cmluZz4gfCBCdWlsdEluVG9vbE5hbWU7XG5cbnR5cGUgVG9vbElucHV0PFRvb2xzLCBLPiA9IEsgZXh0ZW5kcyBCdWlsdEluVG9vbE5hbWVcbiAgPyBJbmZlclRvb2xJbnB1dDwodHlwZW9mIGJ1aWx0SW5Ub29scylbS10+XG4gIDogSyBleHRlbmRzIGtleW9mIFRvb2xzXG4gICAgPyBUb29sc1tLXSBleHRlbmRzIGltcG9ydChcImFpXCIpLlRvb2xcbiAgICAgID8gSW5mZXJUb29sSW5wdXQ8VG9vbHNbS10+XG4gICAgICA6IHVua25vd25cbiAgICA6IHVua25vd247XG5cbmV4cG9ydCB0eXBlIE5lZWRzQXBwcm92YWxNYXA8VG9vbHM+ID0ge1xuICBbSyBpbiBUb29sTmFtZTxUb29scz5dPzpcbiAgICB8IGJvb2xlYW5cbiAgICB8ICgoXG4gICAgICAgIGlucHV0OiBUb29sSW5wdXQ8VG9vbHMsIEs+LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdG9vbENhbGxJZDogc3RyaW5nO1xuICAgICAgICAgIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDogdW5rbm93bjtcbiAgICAgICAgfVxuICAgICAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik7XG59O1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IHBlci1zZXNzaW9uLCBvdmVycmlkaW5nIGFnZW50LWxldmVsIGRlZmF1bHRzLlxuICovXG5leHBvcnQgdHlwZSBTZXNzaW9uT3B0aW9uczxcbiAgVG9vbHMgZXh0ZW5kcyBUb29sU2V0LFxuICBUVGFncyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+LFxuPiA9IHtcbiAgLyoqIFRoZSBBSSBtb2RlbCB0byB1c2UuICovXG4gIG1vZGVsPzogR2F0ZXdheU1vZGVsSWQ7XG4gIC8qKiBTeXN0ZW0gcHJvbXB0IGZvciB0aGUgQUkgbW9kZWwuICovXG4gIHN5c3RlbT86IHN0cmluZztcbiAgLyoqIFNhbmRib3ggY29uZmlndXJhdGlvbiBvciBJRC4gSWYgc3RyaW5nLCB1c2VzIGFzIHNhbmRib3ggSUQgd2l0aCBpdHMgY29uZmlnLiAqL1xuICBzYW5kYm94PzogU2FuZGJveENvbmZpZyB8IHN0cmluZztcbiAgLyoqIEtleS12YWx1ZSBtZXRhZGF0YSB0YWdzIGZvciB0aGUgc2Vzc2lvbi4gKi9cbiAgdGFncz86IFRUYWdzO1xuICAvKiogRGlyZWN0b3J5IGNvbnRhaW5pbmcgc2tpbGwgZGVmaW5pdGlvbnMgZm9yIHRoZSBhZ2VudC4gKi9cbiAgc2tpbGxzRGlyPzogU2tpbGxzRGlyO1xuICAvKipcbiAgICogTmFtZXMgb2YgdG9vbHMgdG8gYWN0aXZhdGUgZm9yIHRoaXMgc2Vzc2lvbi5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgYWxsIGFnZW50LWxldmVsIHRvb2xzIGFyZSBhY3RpdmUuXG4gICAqIFVzZSB0aGlzIHRvIHJlc3RyaWN0IHdoaWNoIHRvb2xzIGFyZSBhdmFpbGFibGUgcGVyLXNlc3Npb24uXG4gICAqL1xuICBhY3RpdmVUb29scz86IChFeHRyYWN0PGtleW9mIFRvb2xzLCBzdHJpbmc+IHwgQnVpbHRJblRvb2xOYW1lKVtdO1xuICAvKiogR2VuZXJhdGlvbiBvcHRpb25zICh0ZW1wZXJhdHVyZSwgbWF4U3RlcHMsIGV0Yy4pLiBPdmVycmlkZXMgYWdlbnQtbGV2ZWwgZGVmYXVsdHMuICovXG4gIGdlbmVyYXRpb24/OiBHZW5lcmF0aW9uT3B0aW9ucztcbn07XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBjcmVhdGluZyBhbiBhZ2VudCBpbnN0YW5jZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IG15QWdlbnQgPSBhZ2VudCh7XG4gKiAgIG1vZGVsOiBcImFudGhyb3BpYy9jbGF1ZGUtb3B1cy00LjVcIixcbiAqICAgc3lzdGVtOiBcIllvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudC4uLlwiLFxuICogICB0YWdzU2NoZW1hOiB6Lm9iamVjdCh7IHVzZXJJZDogei5zdHJpbmcoKSB9KSxcbiAqICAgY29udGV4dFNjaGVtYTogei5vYmplY3QoeyBhdXRoVG9rZW46IHouc3RyaW5nKCkgfSksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBBZ2VudE9wdGlvbnM8XG4gIFRvb2xzIGV4dGVuZHMgVG9vbFNldCxcbiAgVFRhZ3MgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbiAgVENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbj4gPSB7XG4gIC8qKlxuICAgKiBBZ2VudCBuYW1lLiBVc2VkIHRvIGlzb2xhdGUgc3RvcmFnZSBkYXRhIC0gZGlmZmVyZW50IG5hbWVzIGhhdmUgc2VwYXJhdGUgZGF0YS5cbiAgICogQGRlZmF1bHQgXCJkZWZhdWx0XCJcbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdG9yYWdlIGJhY2tlbmQgY29uZmlndXJhdGlvbi5cbiAgICogLSBgeyB0eXBlOiBcImxvY2FsXCIgfWAgLSBmaWxlc3lzdGVtIHN0b3JhZ2UgKGRldilcbiAgICogLSBgeyB0eXBlOiBcInZlcmNlbFwiIH1gIC0gVmVyY2VsIG1hbmFnZWQgc3RvcmFnZSAocHJvZClcbiAgICogLSBgeyB0eXBlOiBcImN1c3RvbVwiLCB1cmw6IFwiLi4uXCIgfWAgLSBjdXN0b20gSFRUUCBiYWNrZW5kXG4gICAqIEBkZWZhdWx0IHsgdHlwZTogXCJ2ZXJjZWxcIiB9XG4gICAqL1xuICBzdG9yYWdlPzogU3RvcmFnZUNvbmZpZztcbiAgLyoqXG4gICAqIEN1c3RvbSB0b29scyBhdmFpbGFibGUgdG8gdGhlIGFnZW50LlxuICAgKiBUaGVzZSBhcmUgZXhwb3NlZCB2aWEgdGhlIFJQQyBoYW5kbGVyIGFuZCBjYWxsZWQgb3ZlciBIVFRQLlxuICAgKi9cbiAgdG9vbHM/OiBUb29scztcbiAgLyoqXG4gICAqIEhvb2tzIGZvciBpbnRlcmNlcHRpbmcgYWdlbnQgb3BlcmF0aW9ucy5cbiAgICovXG4gIGhvb2tzPzogQWdlbnRIb29rcztcbiAgLyoqXG4gICAqIFNjaGVtYSBmb3Igc2Vzc2lvbiB0YWdzLiBBbGwgc2Vzc2lvbnMgc2hhcmUgdGhpcyBzY2hlbWEuXG4gICAqIFRhZ3MgYXJlIHBlcnNpc3RlZCBpbiBzdG9yYWdlIGFuZCBzdXJ2aXZlIGFjcm9zcyByZXF1ZXN0cy5cbiAgICovXG4gIHRhZ3NTY2hlbWE/OiB6LlpvZFR5cGU8VFRhZ3M+O1xuICAvKipcbiAgICogU2NoZW1hIGZvciB0cmFuc2llbnQgdG9vbCBjb250ZXh0LiBQYXNzZWQgcGVyLXJlcXVlc3QgdmlhIHNlbmQoKS5cbiAgICogTk9UIHBlcnNpc3RlZCAtIHVzZSBmb3Igc2VjcmV0cyBsaWtlIGF1dGggdG9rZW5zLlxuICAgKi9cbiAgY29udGV4dFNjaGVtYT86IHouWm9kVHlwZTxUQ29udGV4dD47XG4gIC8qKlxuICAgKiBBcHByb3ZhbCBydWxlcyBmb3IgdG9vbHMgeW91IGRvbid0IG93biAoYnVpbHQtaW4gb3IgdGhpcmQtcGFydHkpLlxuICAgKiBNYXBzIHRvb2wgbmFtZXMgdG8gYSBib29sZWFuIG9yIGEgZnVuY3Rpb24gdGhhdCBkZWNpZGVzIHdoZXRoZXIgdG8gYXNrLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBuZWVkc0FwcHJvdmFsOiB7XG4gICAqICAgQmFzaDogKGlucHV0KSA9PiBpbnB1dC5jb21tYW5kLnN0YXJ0c1dpdGgoXCJybVwiKSxcbiAgICogICBXcml0ZTogdHJ1ZSxcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIG5lZWRzQXBwcm92YWw/OiBOZWVkc0FwcHJvdmFsTWFwPFRvb2xzPjtcbn0gJiBPbWl0PFNlc3Npb25PcHRpb25zPFRvb2xzLCBUVGFncz4sIFwidGFnc1wiPjtcblxuLyoqXG4gKiBCYXNlIHR5cGUgZm9yIHNlc3Npb24vc2FuZGJveCB0YWdzLiBVc2VkIGZvciBnZW5lcmljIGNvbnN0cmFpbnRzLlxuICogRm9yIGFnZW50LWxldmVsIHRhZyB2YWxpZGF0aW9uLCB1c2UgYHRhZ3NTY2hlbWFgIG9wdGlvbiB3aXRoIGEgem9kIHNjaGVtYS5cbiAqL1xuZXhwb3J0IHR5cGUgVGFnc1NjaGVtYSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIEhvb2tzIGZvciBpbnRlcmNlcHRpbmcgYWdlbnQgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgQWdlbnRIb29rcyA9IHtcbiAgLyoqIENhbGxlZCBiZWZvcmUgYSB0b29sIGlzIGV4ZWN1dGVkLiBDYW4gbW9kaWZ5IGlucHV0IG9yIHRocm93IHRvIGJsb2NrLiAqL1xuICBcInRvb2wuYmVmb3JlXCI/OiAob3B0czoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBpbnB1dDogdW5rbm93bjtcbiAgICBjb250ZXh0OiBUb29sQ29udGV4dDtcbiAgfSkgPT4gUHJvbWlzZTx1bmRlZmluZWQgfCB7IGlucHV0OiB1bmtub3duIH0+O1xuICAvKiogQ2FsbGVkIGFmdGVyIGEgdG9vbCBpcyBleGVjdXRlZC4gQ2FuIG1vZGlmeSByZXN1bHQuICovXG4gIFwidG9vbC5hZnRlclwiPzogKG9wdHM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaW5wdXQ6IHVua25vd247XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgcmVzdWx0OiB1bmtub3duIH0+O1xufTtcblxuLyoqXG4gKiBSUEMgcmVxdWVzdCBib2R5IGZvciBhZ2VudCBoYW5kbGVyLlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiBvbiBgbWV0aG9kYCBmb3IgdHlwZS1zYWZlIHBhcmFtcy5cbiAqL1xuZXhwb3J0IHR5cGUgQWdlbnRScGNSZXF1ZXN0ID0ge1xuICBbSyBpbiBrZXlvZiBBZ2VudFJwY01ldGhvZHNdOiB7XG4gICAgbWV0aG9kOiBLO1xuICAgIHBhcmFtczogQWdlbnRScGNNZXRob2RzW0tdW1wicGFyYW1zXCJdO1xuICB9O1xufVtrZXlvZiBBZ2VudFJwY01ldGhvZHNdO1xuXG4vKipcbiAqIFJQQyByZXNwb25zZSB0eXBlIGZvciBkaXNwYXRjaC5cbiAqL1xuZXhwb3J0IHR5cGUgUnBjUmVzdWx0PFQgPSB1bmtub3duPiA9XG4gIHwgeyByZXN1bHQ6IFQgfVxuICB8IHsgZXJyb3I6IHsgY29kZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfTsgc3RhdHVzPzogbnVtYmVyIH07XG5cbi8qKlxuICogRGlyZWN0IFJQQyBwYXlsb2FkIGZvciBzdGVwIGZ1bmN0aW9uIGNhbGxzIChubyBIVFRQKS5cbiAqL1xuZXhwb3J0IHR5cGUgUnBjUGF5bG9hZCA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHBhcmFtczogdW5rbm93bjtcbn07XG5cbi8qKlxuICogQWxsIFJQQyBtZXRob2RzIGF2YWlsYWJsZSBvbiB0aGUgYWdlbnQgaGFuZGxlci5cbiAqIENvbWJpbmVzIHRvb2xzIG1ldGhvZHMsIGhvb2tzLCBhbmQgc3RvcmFnZSBtZXRob2RzLlxuICovXG5leHBvcnQgdHlwZSBBZ2VudFJwY01ldGhvZHMgPSB7XG4gIFwidG9vbHMubGlzdFwiOiB7IHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+OyByZXN1bHQ6IFRvb2xNZXRhZGF0YVtdIH07XG4gIFwidG9vbHMuZXhlY3V0ZVwiOiB7IHBhcmFtczogVG9vbHNFeGVjdXRlUGFyYW1zOyByZXN1bHQ6IHVua25vd24gfTtcbiAgXCJ0b29scy5uZWVkc0FwcHJvdmFsXCI6IHtcbiAgICBwYXJhbXM6IFRvb2xzTmVlZHNBcHByb3ZhbFBhcmFtcztcbiAgICByZXN1bHQ6IFRvb2xzTmVlZHNBcHByb3ZhbFJlc3VsdDtcbiAgfTtcbiAgXCJob29rLnRvb2wuYmVmb3JlXCI6IHtcbiAgICBwYXJhbXM6IEhvb2tUb29sQmVmb3JlUGFyYW1zO1xuICAgIHJlc3VsdDogSG9va1Rvb2xCZWZvcmVSZXN1bHQ7XG4gIH07XG4gIFwiaG9vay50b29sLmFmdGVyXCI6IHtcbiAgICBwYXJhbXM6IEhvb2tUb29sQWZ0ZXJQYXJhbXM7XG4gICAgcmVzdWx0OiBIb29rVG9vbEFmdGVyUmVzdWx0O1xuICB9O1xufSAmIFN0b3JhZ2VNZXRob2RzO1xuXG5leHBvcnQgdHlwZSBBZ2VudFJwY01ldGhvZE5hbWUgPSBrZXlvZiBBZ2VudFJwY01ldGhvZHM7XG5cbi8qKlxuICogUmVzdWx0IHR5cGUgZm9yIFJQQyBvdmVycmlkZSBoYW5kbGVycy5cbiAqIC0gYHsgb2s6IHRydWU7IHJlc3VsdDogVCB9YCAtIHJldHVybiB0aGlzIHJlc3VsdFxuICogLSBgeyBvazogZmFsc2U7IGVycm9yOiBzdHJpbmcgfWAgLSByZXR1cm4gdGhpcyBlcnJvclxuICogLSBgbnVsbGAgLSB1c2UgZGVmYXVsdCBoYW5kbGVyXG4gKi9cbmV4cG9ydCB0eXBlIEFnZW50UnBjUmVzdWx0PFQ+ID1cbiAgfCB7IG9rOiB0cnVlOyByZXN1bHQ6IFQgfVxuICB8IHsgb2s6IGZhbHNlOyBlcnJvcjogc3RyaW5nIH1cbiAgfCBudWxsO1xuXG4vKipcbiAqIE92ZXJyaWRlIGhhbmRsZXJzIGZvciBhZ2VudCBSUEMgbWV0aG9kcy5cbiAqIEVhY2ggbWV0aG9kIGNhbiBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbi5cbiAqIFJldHVybiBgbnVsbGAgdG8gZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXIuXG4gKi9cbmV4cG9ydCB0eXBlIEFnZW50UnBjT3ZlcnJpZGVzID0ge1xuICBbSyBpbiBBZ2VudFJwY01ldGhvZE5hbWVdPzogKFxuICAgIHBhcmFtczogQWdlbnRScGNNZXRob2RzW0tdW1wicGFyYW1zXCJdXG4gICkgPT4gUHJvbWlzZTxBZ2VudFJwY1Jlc3VsdDxBZ2VudFJwY01ldGhvZHNbS11bXCJyZXN1bHRcIl0+Pjtcbn07XG5cbmV4cG9ydCBjb25zdCBhZ2VudCA9IDxcbiAgVG9vbHMgZXh0ZW5kcyB7fSxcbiAgVFRhZ3MgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbiAgVENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbj4oXG4gIG9wdGlvbnM6IEFnZW50T3B0aW9uczxUb29scywgVFRhZ3MsIFRDb250ZXh0PlxuKSA9PiB7XG4gIGNvbnN0IGFnZW50U2VjcmV0ID0gcHJvY2Vzcy5lbnYuQUdFTlRfU0VDUkVUO1xuICBpZiAoIWFnZW50U2VjcmV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBR0VOVF9TRUNSRVQgZW52IHZhciBpcyByZXF1aXJlZC4gVXNlIHdpdGhBZ2VudCgpIG9yIHNldCBpdCBtYW51YWxseS5cIlxuICAgICk7XG4gIH1cblxuICBjb25zdCBiYXNlU3RvcmFnZUNvbmZpZyA9IG9wdGlvbnMuc3RvcmFnZSA/PyB7IHR5cGU6IFwidmVyY2VsXCIgfTtcbiAgY29uc3Qgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZyA9IHtcbiAgICAuLi5iYXNlU3RvcmFnZUNvbmZpZyxcbiAgICBuYW1lOiBvcHRpb25zLm5hbWUgPz8gYmFzZVN0b3JhZ2VDb25maWcubmFtZSxcbiAgfTtcblxuICAvKipcbiAgICogU3RvcmFnZSBpcyBpbml0aWFsaXplZCBsYXppbHkuXG4gICAqIFVzZXMgYWdlbnRPYmoucnBjIHdoaWNoIGlzIHdpcmVkIHVwIGJ5IHRoZSBsb2FkZXIgY2FsbGluZyBfX2luaXRBZ2VudC5cbiAgICovXG4gIGxldCBfc3RvcmFnZTogQWdlbnRTdG9yYWdlIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IGdldFN0b3JhZ2VJbnN0YW5jZSA9ICgpOiBBZ2VudFN0b3JhZ2UgPT4ge1xuICAgIGlmICghX3N0b3JhZ2UpIHtcbiAgICAgIF9zdG9yYWdlID0gZ2V0U3RvcmFnZSh7XG4gICAgICAgIGNvbmZpZzogc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgcnBjOiBhZ2VudE9iai5ycGMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIF9zdG9yYWdlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBMYXp5LWluaXRpYWxpemVkIHN0b3JhZ2UgaGFuZGxlcnMgZm9yIGxvY2FsIHN0b3JhZ2UuXG4gICAqIENyZWF0ZWQgb24gZmlyc3Qgc3RvcmFnZSBSUEMgcmVxdWVzdC5cbiAgICovXG4gIGxldCBzdG9yYWdlSGFuZGxlcnNQcm9taXNlOiBQcm9taXNlPFN0b3JhZ2VIYW5kbGVycz4gfCBudWxsID0gbnVsbDtcbiAgY29uc3QgZ2V0U3RvcmFnZUhhbmRsZXJzID0gKG5hbWU6IHN0cmluZyk6IFByb21pc2U8U3RvcmFnZUhhbmRsZXJzPiA9PiB7XG4gICAgaWYgKHN0b3JhZ2VDb25maWcudHlwZSAhPT0gXCJsb2NhbFwiKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFuZGxlcnMgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHN0b3JhZ2VcIilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghc3RvcmFnZUhhbmRsZXJzUHJvbWlzZSkge1xuICAgICAgc3RvcmFnZUhhbmRsZXJzUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuICAgICAgICBjb25zdCB7IGNyZWF0ZUZpbGVzeXN0ZW1IYW5kbGVycyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgIFwiLi9zdG9yYWdlL2JpbmRpbmdzL2xvY2FsLWZzLWhhbmRsZXJzXCJcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBzdG9yYWdlQ29uZmlnLnBhdGggPz8gXCIuYWdlbnQtc3RvcmFnZVwiO1xuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4oYmFzZVBhdGgsIG5hbWUsIExPQ0FMX1NUT1JBR0VfVkVSU0lPTik7XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWxlc3lzdGVtSGFuZGxlcnMoZnVsbFBhdGgpO1xuICAgICAgfSkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0b3JhZ2VIYW5kbGVyc1Byb21pc2U7XG4gIH07XG5cbiAgY29uc3Qgc2FuZGJveCA9IGFzeW5jIChcbiAgICBzYW5kYm94SWQ6IHN0cmluZyxcbiAgICBvcHRzPzogeyBjb25maWc/OiBTYW5kYm94Q29uZmlnOyB0YWdzPzogVFRhZ3MgfVxuICApID0+IHtcbiAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNhbmRib3guZ2V0KHNhbmRib3hJZCk7XG5cbiAgICBpZiAoZXhpc3RpbmdSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKCEoZXhpc3RpbmdSZWNvcmQgaW5zdGFuY2VvZiBTYW5kYm94Tm90Rm91bmRFcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXhpc3RpbmdSZWNvcmQ7XG4gICAgICB9XG4gICAgICBjb25zdCBzYW5kYm94UmVjb3JkID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2FuZGJveC5zZXQoe1xuICAgICAgICBpZDogc2FuZGJveElkLFxuICAgICAgICB0YWdzOiBvcHRzPy50YWdzID8/IG51bGwsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICBjcmVhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgIGxhc3RBY3Rpdml0eUF0OiBEYXRlLm5vdygpLFxuICAgICAgICBjb25maWc6IG9wdHM/LmNvbmZpZyA/P1xuICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucy5zYW5kYm94ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBvcHRpb25zLnNhbmRib3gpID8/IHsgdHlwZTogXCJ2ZXJjZWxcIiB9LFxuICAgICAgfSk7XG4gICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IHNhbmRib3hSZWNvcmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0U2FuZGJveDxUVGFncz4oe1xuICAgICAgICBzdG9yYWdlQ29uZmlnLFxuICAgICAgICBzYW5kYm94UmVjb3JkLFxuICAgICAgICBzdG9yYWdlOiBnZXRTdG9yYWdlSW5zdGFuY2UoKSxcbiAgICAgICAgcnBjOiBhZ2VudE9iai5ycGMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb25maWcgPSBvcHRzPy5jb25maWcgPz8gZXhpc3RpbmdSZWNvcmQuY29uZmlnO1xuICAgIGlmICghZXF1YWwoZXhpc3RpbmdSZWNvcmQuY29uZmlnLCBuZXdDb25maWcpKSB7XG4gICAgICAvLyB0aHJvdyBuZXcgU2FuZGJveEVycm9yKHtcbiAgICAgIC8vICAgcmVhc29uOiBcInNhbmRib3ggY29uZmlnIGNoYW5nZXMgYXJlIG5vdCBzdXBwb3J0ZWRcIixcbiAgICAgIC8vIH0pO1xuICAgICAgY29uc29sZS53YXJuKFwic2FuZGJveCBjb25maWcgY2hhbmdlcyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0U2FuZGJveDxUVGFncz4oe1xuICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgIHNhbmRib3hSZWNvcmQ6IGV4aXN0aW5nUmVjb3JkLFxuICAgICAgc3RvcmFnZTogZ2V0U3RvcmFnZUluc3RhbmNlKCksXG4gICAgICBycGM6IGFnZW50T2JqLnJwYyxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBhZ2VudE9iaiA9IHtcbiAgICBzZXNzaW9uOiBhc3luYyAoXG4gICAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICAgIHNlc3Npb25PcHRpb25zPzogU2Vzc2lvbk9wdGlvbnM8VG9vbHMsIFRUYWdzPlxuICAgICkgPT4ge1xuICAgICAgbGV0IHNlc3Npb24gPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuXG4gICAgICAvKipcbiAgICAgICAqIG5vcm1hbGl6ZSBzYW5kYm94IGlucHV0IHRvIGEgc2FuZGJveCBJRCBhbmQgY29uZmlnXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHNhbmRib3hJbnB1dCA9IHNlc3Npb25PcHRpb25zPy5zYW5kYm94ID8/IG9wdGlvbnMuc2FuZGJveDtcbiAgICAgIGNvbnN0IHNhbmRib3hJZCA9XG4gICAgICAgIHR5cGVvZiBzYW5kYm94SW5wdXQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IHNhbmRib3hJbnB1dFxuICAgICAgICAgIDogLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9OZXN0ZWRUZXJuYXJ5OiBva1xuICAgICAgICAgICAgc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IGBzYW5kYm94XyR7dWxpZCgpfWBcbiAgICAgICAgICAgIDogKHNlc3Npb24uc2FuZGJveElkID8/IGBzYW5kYm94XyR7dWxpZCgpfWApO1xuICAgICAgY29uc3Qgc2FuZGJveFByb21pc2UgPSBzYW5kYm94KFxuICAgICAgICBzYW5kYm94SWQsXG4gICAgICAgIHR5cGVvZiBzYW5kYm94SW5wdXQgPT09IFwic3RyaW5nXCIgPyB1bmRlZmluZWQgOiB7IGNvbmZpZzogc2FuZGJveElucHV0IH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nU2Vzc2lvbiA9IHNlc3Npb24gaW5zdGFuY2VvZiBFcnJvciA/IG51bGwgOiBzZXNzaW9uO1xuICAgICAgY29uc3Qgc2tpbGxzRGlyID1cbiAgICAgICAgc2Vzc2lvbk9wdGlvbnM/LnNraWxsc0RpciA/P1xuICAgICAgICBleGlzdGluZ1Nlc3Npb24/LnNraWxsc0RpciA/P1xuICAgICAgICBvcHRpb25zLnNraWxsc0RpciA/P1xuICAgICAgICBudWxsO1xuXG4gICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGlmIChzZXNzaW9uIGluc3RhbmNlb2YgU2Vzc2lvbk5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBtb2RlbCA9IHNlc3Npb25PcHRpb25zPy5tb2RlbCA/PyBvcHRpb25zLm1vZGVsID8/IG51bGw7XG4gICAgICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogXCJNb2RlbCBpcyBub3Qgc2V0XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2Vzc2lvbiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uc2V0KHtcbiAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICBsYXN0TWVzc2FnZUlkOiBudWxsLFxuICAgICAgICAgICAgcnVuSWQ6IG51bGwsXG4gICAgICAgICAgICB0YWdzOiBzZXNzaW9uT3B0aW9ucz8udGFncyA/PyBudWxsLFxuICAgICAgICAgICAgc3lzdGVtOiBzZXNzaW9uT3B0aW9ucz8uc3lzdGVtID8/IG9wdGlvbnMuc3lzdGVtID8/IG51bGwsXG4gICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgIHNhbmRib3hJZCxcbiAgICAgICAgICAgIHNraWxsc0Rpcjogc2tpbGxzRGlyID8gbm9ybWFsaXplU2tpbGxzRGlycyhza2lsbHNEaXIpIDogbnVsbCxcbiAgICAgICAgICAgIGhvb2tUb2tlbjogbnVsbCxcbiAgICAgICAgICAgIGFjdGl2ZVRvb2xzOlxuICAgICAgICAgICAgICBzZXNzaW9uT3B0aW9ucz8uYWN0aXZlVG9vbHMgPz8gb3B0aW9ucy5hY3RpdmVUb29scyA/PyBudWxsLFxuICAgICAgICAgICAgZ2VuZXJhdGlvbjpcbiAgICAgICAgICAgICAgb3B0aW9ucy5nZW5lcmF0aW9uIHx8IHNlc3Npb25PcHRpb25zPy5nZW5lcmF0aW9uXG4gICAgICAgICAgICAgICAgPyB7IC4uLm9wdGlvbnMuZ2VuZXJhdGlvbiwgLi4uc2Vzc2lvbk9wdGlvbnM/LmdlbmVyYXRpb24gfVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBzZXNzaW9uO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKipcbiAgICAgICAgICogdGhpcyBpcyBhbiBleGlzdGluZyBzZXNzaW9uLiB3ZSBjb21wYXJlIHRoZSBvcHRpb25zIGFuZCB1cGRhdGUgdGhlIHNlc3Npb24gaWYgbmVjZXNzYXJ5LlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgdXBkYXRlZDogU2Vzc2lvbiA9IHtcbiAgICAgICAgICAuLi5zZXNzaW9uLFxuICAgICAgICAgIC4uLnNlc3Npb25PcHRpb25zLFxuICAgICAgICAgIHNhbmRib3hJZCxcbiAgICAgICAgICBza2lsbHNEaXI6IHNraWxsc0RpciA/IG5vcm1hbGl6ZVNraWxsc0RpcnMoc2tpbGxzRGlyKSA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICAgIGlmICghZXF1YWwodXBkYXRlZCwgc2Vzc2lvbikpIHtcbiAgICAgICAgICBzZXNzaW9uID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi5zZXQodXBkYXRlZCk7XG4gICAgICAgICAgaWYgKHNlc3Npb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgc2Vzc2lvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBJbnRlcnJ1cHRzIGFsbCBwZW5kaW5nIGFzc2lzdGFudCBtZXNzYWdlcyAoYm90aCBzdHJlYW1pbmcgYW5kIHF1ZXVlZCkuXG4gICAgICAgKiBBIG1lc3NhZ2UgaXMgY29uc2lkZXJlZCBwZW5kaW5nIGlmIGNvbXBsZXRlZEF0ID09PSBudWxsICYmIGludGVycnVwdGVkQXQgPT09IG51bGwuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGludGVycnVwdEN1cnJlbnRNZXNzYWdlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlc1Jlc3VsdCA9XG4gICAgICAgICAgYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkubWVzc2FnZS5saXN0KHNlc3Npb25JZCk7XG4gICAgICAgIGlmIChtZXNzYWdlc1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0Fzc2lzdGFudE1lc3NhZ2VzID0gbWVzc2FnZXNSZXN1bHQuaXRlbXMuZmlsdGVyKFxuICAgICAgICAgIChtKSA9PlxuICAgICAgICAgICAgbS5yb2xlID09PSBcImFzc2lzdGFudFwiICYmXG4gICAgICAgICAgICBtLmNvbXBsZXRlZEF0ID09PSBudWxsICYmXG4gICAgICAgICAgICBtLmludGVycnVwdGVkQXQgPT09IG51bGxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgcGVuZGluZ0Fzc2lzdGFudE1lc3NhZ2VzLm1hcCgobSkgPT5cbiAgICAgICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2Uuc2V0KHsgLi4ubSwgaW50ZXJydXB0ZWRBdDogbm93IH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXV0by1yZWplY3QgYW55IHBlbmRpbmcgYXBwcm92YWwgaG9va3Mgc28gdGhlIHdvcmtmbG93IHVuYmxvY2tzXG4gICAgICAgIGZvciAoY29uc3QgbSBvZiBwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMpIHtcbiAgICAgICAgICBjb25zdCBwYXJ0c1Jlc3VsdCA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnBhcnQubGlzdEJ5TWVzc2FnZShcbiAgICAgICAgICAgIG0uaWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwYXJ0c1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBwIG9mIHBhcnRzUmVzdWx0Lml0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHAucGFydCAmJlxuICAgICAgICAgICAgICBcInN0YXRlXCIgaW4gcC5wYXJ0ICYmXG4gICAgICAgICAgICAgIChwLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiICYmXG4gICAgICAgICAgICAgIFwiYXBwcm92YWxcIiBpbiBwLnBhcnRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCBhcHByb3ZhbCA9IChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IHsgaWQ6IHN0cmluZyB9IH0pXG4gICAgICAgICAgICAgICAgLmFwcHJvdmFsO1xuICAgICAgICAgICAgICBpZiAoYXBwcm92YWw/LmlkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5zZXQoe1xuICAgICAgICAgICAgICAgICAgLi4ucCxcbiAgICAgICAgICAgICAgICAgIHBhcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucC5wYXJ0LFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogXCJhcHByb3ZhbC1yZXNwb25kZWRcIixcbiAgICAgICAgICAgICAgICAgICAgYXBwcm92YWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5hcHByb3ZhbCxcbiAgICAgICAgICAgICAgICAgICAgICBhcHByb3ZlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBcImludGVycnVwdGVkXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0gYXMgUGFydCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBwcm92YWxIb29rLnJlc3VtZShhcHByb3ZhbC5pZCwge1xuICAgICAgICAgICAgICAgICAgYXBwcm92ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgcmVhc29uOiBcImludGVycnVwdGVkXCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VuZDogYXN5bmMgKHtcbiAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICBpbnRlcnJ1cHRJZlN0cmVhbWluZyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICB9OiB7XG4gICAgICAgICAgaW5wdXQ6IFNlbmRJbnB1dCB8IFNlbmRJbnB1dFtdO1xuICAgICAgICAgIGludGVycnVwdElmU3RyZWFtaW5nPzogYm9vbGVhbjtcbiAgICAgICAgICBjb250ZXh0PzogVENvbnRleHQ7XG4gICAgICAgIH0pID0+IHtcbiAgICAgICAgICBpZiAoaW50ZXJydXB0SWZTdHJlYW1pbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVycnVwdFJlc3VsdCA9IGF3YWl0IGludGVycnVwdEN1cnJlbnRNZXNzYWdlKCk7XG4gICAgICAgICAgICBpZiAoaW50ZXJydXB0UmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGludGVycnVwdFJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbmV3TWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IG5ld1BhcnRzOiBQYXJ0W10gPSBbXTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBpbnB1dCkge1xuICAgICAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIHBhcnRzIH0gPSB0b01lc3NhZ2VBbmRQYXJ0cyh7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgIGlucHV0OiBpLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRSb2xlOiBcInVzZXJcIixcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgbmV3TWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgbmV3UGFydHMucHVzaCguLi5wYXJ0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgcGFydHMgfSA9IHRvTWVzc2FnZUFuZFBhcnRzKHtcbiAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgZGVmYXVsdFJvbGU6IFwidXNlclwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXdNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgbmV3UGFydHMucHVzaCguLi5wYXJ0cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIHdlIGFsc28gcHJlLWNyZWF0ZSB0aGUgYXNzaXN0YW50IG1lc3NhZ2VcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCBhc3Npc3RhbnRNZXNzYWdlSWQgPSBgbWVzc2FnZV8ke3VsaWQoKX1gO1xuICAgICAgICAgIGNvbnN0IGJhc2VUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0ID0gYmFzZVRpbWUgKyBuZXdNZXNzYWdlcy5sZW5ndGg7XG4gICAgICAgICAgbmV3TWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICBpZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogYXNzaXN0YW50TWVzc2FnZUNyZWF0ZWRBdCxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogbnVsbCxcbiAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBudWxsLFxuICAgICAgICAgICAgaW50ZXJydXB0ZWRBdDogbnVsbCxcbiAgICAgICAgICAgIHVzYWdlOiBudWxsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3Qgc2Vzc2lvbjIgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuICAgICAgICAgIGlmIChzZXNzaW9uMiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBzZXNzaW9uMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhZ2VudElucHV0OiBBZ2VudElucHV0ID0ge1xuICAgICAgICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIHJwYzogYWdlbnRPYmoucnBjLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgZXZlbnQ6IEFnZW50TWVzc2FnZUlucHV0ID0ge1xuICAgICAgICAgICAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgaG9va1Rva2VuOiBjcnlwdG8ucmFuZG9tVVVJRCgpLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0LFxuICAgICAgICAgICAgY29udGV4dDogY29udGV4dCA/PyB7fSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgYWxsKHtcbiAgICAgICAgICAgICAgICBhc3luYyBzYXZlTWVzc2FnZXMoKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgbmV3TWVzc2FnZXMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2Uuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGJhc2VUaW1lICsgaSxcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgc2F2ZVBhcnRzKCkge1xuICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgIG5ld1BhcnRzLm1hcChnZXRTdG9yYWdlSW5zdGFuY2UoKS5wYXJ0LnNldClcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhc3luYyByZXN1bWVPclN0YXJ0QWdlbnRXb3JrZmxvdygpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uMi5ydW5JZCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhZ2VudE1lc3NhZ2VIb29rLnJlc3VtZShzZXNzaW9uSWQsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0UmVzdWx0ID0gYXdhaXQgc3RhcnQoYWdlbnRXb3JrZmxvdywgW1xuICAgICAgICAgICAgICAgICAgICAgIHsgaW5wdXQ6IGFnZW50SW5wdXQsIGV2ZW50IH0sXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uMi5ydW5JZCA9IHN0YXJ0UmVzdWx0LnJ1bklkO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgdXBkYXRlU2Vzc2lvbigpIHtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuJC5yZXN1bWVPclN0YXJ0QWdlbnRXb3JrZmxvdztcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2Vzc2lvbjIsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgbGFzdE1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICBob29rVG9rZW46IGV2ZW50Lmhvb2tUb2tlbixcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2F0Y2g6IChlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbkVycm9yKHtcbiAgICAgICAgICAgICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogYGZhaWxlZCB0byBzZW5kOiAke1N0cmluZyhlKX1gLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc3RyZWFtOiBhc3luYyAob3B0cz86IHsgbWVzc2FnZUlkPzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi5nZXQoc2Vzc2lvbklkKTtcbiAgICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUlkID0gb3B0cz8ubWVzc2FnZUlkID8/IHNlc3Npb24ubGFzdE1lc3NhZ2VJZDtcbiAgICAgICAgICBpZiAoIW1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uRXJyb3Ioe1xuICAgICAgICAgICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgICAgICAgICByZWFzb246IFwiTm8gbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvblwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc2Vzc2lvbi5ydW5JZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uRXJyb3Ioe1xuICAgICAgICAgICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgICAgICAgICByZWFzb246IFwiTm8gcnVuIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcnVuID0gZ2V0UnVuKHNlc3Npb24ucnVuSWQpO1xuICAgICAgICAgIHJldHVybiBydW4uZ2V0UmVhZGFibGU8VUlNZXNzYWdlQ2h1bms+KHsgbmFtZXNwYWNlOiBtZXNzYWdlSWQgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdWk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBbbWVzc2FnZXNSZXN1bHQsIHBhcnRzUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2UubGlzdChzZXNzaW9uSWQpLFxuICAgICAgICAgICAgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5saXN0QnlTZXNzaW9uKHNlc3Npb25JZCksXG4gICAgICAgICAgXSk7XG5cbiAgICAgICAgICBpZiAobWVzc2FnZXNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGFydHNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnRzUmVzdWx0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYXNzZW1ibGVVSU1lc3NhZ2VzKHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlc1Jlc3VsdC5pdGVtcyxcbiAgICAgICAgICAgIHBhcnRzOiBwYXJ0c1Jlc3VsdC5pdGVtcyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGxhc3RTdGFydGVkQXNzaXN0YW50ID0gbWVzc2FnZXNSZXN1bHQuaXRlbXNcbiAgICAgICAgICAgIC5maWx0ZXIoKG0pID0+IG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJiBtLnN0YXJ0ZWRBdCAhPT0gbnVsbClcbiAgICAgICAgICAgIC5hdCgtMSk7XG4gICAgICAgICAgY29uc3QgaXNTdHJlYW1pbmcgPVxuICAgICAgICAgICAgbGFzdFN0YXJ0ZWRBc3Npc3RhbnQgJiZcbiAgICAgICAgICAgIGxhc3RTdGFydGVkQXNzaXN0YW50LmNvbXBsZXRlZEF0ID09PSBudWxsICYmXG4gICAgICAgICAgICBsYXN0U3RhcnRlZEFzc2lzdGFudC5pbnRlcnJ1cHRlZEF0ID09PSBudWxsO1xuICAgICAgICAgIGNvbnN0IHN0cmVhbWluZ01lc3NhZ2VJZCA9IGlzU3RyZWFtaW5nXG4gICAgICAgICAgICA/IGxhc3RTdGFydGVkQXNzaXN0YW50LmlkXG4gICAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgICBjb25zdCB1c2FnZSA9IGNvbXB1dGVTZXNzaW9uVXNhZ2UobWVzc2FnZXNSZXN1bHQuaXRlbXMpO1xuXG4gICAgICAgICAgdHlwZSBUeXBlZE1lc3NhZ2UgPSBVSU1lc3NhZ2U8XG4gICAgICAgICAgICB1bmtub3duLFxuICAgICAgICAgICAgVUlEYXRhVHlwZXMsXG4gICAgICAgICAgICBJbmZlclVJVG9vbHM8dHlwZW9mIGJ1aWx0SW5Ub29scyAmIFRvb2xzPlxuICAgICAgICAgID47XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlcyBhcyB1bmtub3duIGFzIFR5cGVkTWVzc2FnZVtdLFxuICAgICAgICAgICAgc3RyZWFtaW5nTWVzc2FnZUlkLFxuICAgICAgICAgICAgdXNhZ2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdGFnOiB7XG4gICAgICAgICAgbGlzdDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChzZXNzaW9uLnRhZ3MgPz8ge30pIGFzIFRUYWdzO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0OiBhc3luYyA8SyBleHRlbmRzIGtleW9mIFRUYWdzICYgc3RyaW5nPihcbiAgICAgICAgICAgIGtleTogS1xuICAgICAgICAgICk6IFByb21pc2U8VFRhZ3NbS10gfCB1bmRlZmluZWQgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNlc3Npb24udGFncz8uW2tleV0gYXMgVFRhZ3NbS10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IGFzeW5jIDxLIGV4dGVuZHMga2V5b2YgVFRhZ3MgJiBzdHJpbmc+KFxuICAgICAgICAgICAga2V5OiBLLFxuICAgICAgICAgICAgdmFsdWU6IFRUYWdzW0tdXG4gICAgICAgICAgKTogUHJvbWlzZTx1bmRlZmluZWQgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi50YWcuc2V0KHtcbiAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICB0YWdzOiB7IFtrZXldOiB2YWx1ZSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXRNYW55OiBhc3luYyAodGFnczogUGFydGlhbDxUVGFncz4pOiBQcm9taXNlPHVuZGVmaW5lZCB8IEVycm9yPiA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLnRhZy5zZXQoe1xuICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHRhZ3M6IHRhZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzYW5kYm94OiBhd2FpdCBzYW5kYm94UHJvbWlzZSxcblxuICAgICAgICBpbnRlcnJ1cHQ6IGludGVycnVwdEN1cnJlbnRNZXNzYWdlLFxuXG4gICAgICAgIHJlc29sdmVBcHByb3ZhbDogYXN5bmMgKHtcbiAgICAgICAgICBhcHByb3ZhbElkLFxuICAgICAgICAgIGFwcHJvdmVkLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgfToge1xuICAgICAgICAgIGFwcHJvdmFsSWQ6IHN0cmluZztcbiAgICAgICAgICBhcHByb3ZlZDogYm9vbGVhbjtcbiAgICAgICAgICByZWFzb24/OiBzdHJpbmc7XG4gICAgICAgIH0pOiBQcm9taXNlPHVuZGVmaW5lZCB8IEVycm9yPiA9PiB7XG4gICAgICAgICAgY29uc3QgcGFydHNSZXN1bHQgPVxuICAgICAgICAgICAgYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5saXN0QnlTZXNzaW9uKHNlc3Npb25JZCk7XG4gICAgICAgICAgaWYgKHBhcnRzUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0c1Jlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0YXJnZXRQYXJ0ID0gcGFydHNSZXN1bHQuaXRlbXMuZmluZChcbiAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICBwLnBhcnQgJiZcbiAgICAgICAgICAgICAgXCJhcHByb3ZhbFwiIGluIHAucGFydCAmJlxuICAgICAgICAgICAgICAocC5wYXJ0IGFzIHsgYXBwcm92YWw/OiB7IGlkOiBzdHJpbmcgfSB9KS5hcHByb3ZhbD8uaWQgPT09XG4gICAgICAgICAgICAgICAgYXBwcm92YWxJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCF0YXJnZXRQYXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogYEFwcHJvdmFsICR7YXBwcm92YWxJZH0gbm90IGZvdW5kYCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRQYXJ0ID0ge1xuICAgICAgICAgICAgLi4udGFyZ2V0UGFydCxcbiAgICAgICAgICAgIHBhcnQ6IHtcbiAgICAgICAgICAgICAgLi4udGFyZ2V0UGFydC5wYXJ0LFxuICAgICAgICAgICAgICBzdGF0ZTogXCJhcHByb3ZhbC1yZXNwb25kZWRcIiBhcyBjb25zdCxcbiAgICAgICAgICAgICAgYXBwcm92YWw6IHsgaWQ6IGFwcHJvdmFsSWQsIGFwcHJvdmVkLCByZWFzb24gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBzZXRSZXN1bHQgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5wYXJ0LnNldChcbiAgICAgICAgICAgIHVwZGF0ZWRQYXJ0IGFzIFBhcnRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzZXRSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHNldFJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGaXJlIHRoZSBhcHByb3ZhbCBob29rIHRvIHJlc3VtZSB0aGUgc3VzcGVuZGVkIHdvcmtmbG93LlxuICAgICAgICAgIC8vIEZvciBzdWItdG9vbCBhcHByb3ZhbHMgKGZyb20gdGhlIEphdmFTY3JpcHQgdG9vbCksIHRoZXJlJ3Mgbm9cbiAgICAgICAgICAvLyBzdXNwZW5kZWQgaG9vayBcdTIwMTQgcG9sbGluZyBoYW5kbGVzIGl0LiBTd2FsbG93IHRoZSBlcnJvci5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgYXBwcm92YWxIb29rLnJlc3VtZShhcHByb3ZhbElkLCB7IGFwcHJvdmVkLCByZWFzb24gfSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBObyBob29rIHJlZ2lzdGVyZWQgZm9yIHRoaXMgYXBwcm92YWxJZCAoZS5nLiBKUyBzdWItdG9vbCBhcHByb3ZhbClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVzYWdlOiBhc3luYyAoKTogUHJvbWlzZTxTZXNzaW9uVXNhZ2UgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzUmVzdWx0ID1cbiAgICAgICAgICAgIGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2UubGlzdChzZXNzaW9uSWQpO1xuICAgICAgICAgIGlmIChtZXNzYWdlc1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZXNSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb21wdXRlU2Vzc2lvblVzYWdlKG1lc3NhZ2VzUmVzdWx0Lml0ZW1zKTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBzYW5kYm94LFxuICAgIGdldCBzdG9yYWdlKCkge1xuICAgICAgcmV0dXJuIGdldFN0b3JhZ2VJbnN0YW5jZSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSUEMgaGFuZGxlciBmb3IgYWdlbnQgb3BlcmF0aW9ucy5cbiAgICAgKiBIYW5kbGVzIHRvb2xzLmxpc3QsIHRvb2xzLmV4ZWN1dGUsIHN0b3JhZ2UgUlBDLCBhbmQgaG9va3MuXG4gICAgICpcbiAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSBieSB0aGUgYHJwY2Agc3RlcCBmdW5jdGlvbiBkdXJpbmcgd29ya2Zsb3cgZXhlY3V0aW9uLlxuICAgICAqIENhbiBhbHNvIGJlIGV4cG9zZWQgdmlhIEhUVFAgZm9yIGV4dGVybmFsIGFjY2VzcyBpZiBuZWVkZWQuXG4gICAgICovXG4gICAgaGFuZGxlcjogYXN5bmMgKFxuICAgICAgaW5wdXQ6IFJlcXVlc3QgfCBScGNQYXlsb2FkLFxuICAgICAgb3ZlcnJpZGVzPzogQWdlbnRScGNPdmVycmlkZXNcbiAgICApOiBQcm9taXNlPFJlc3BvbnNlIHwgUnBjUmVzdWx0PiA9PiB7XG4gICAgICBjb25zdCBpc1JlcXVlc3QgPSBpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3Q7XG5cbiAgICAgIGxldCBtZXRob2Q6IHN0cmluZztcbiAgICAgIGxldCBwYXJhbXM6IHVua25vd247XG4gICAgICBsZXQgbmFtZTogc3RyaW5nO1xuXG4gICAgICBpZiAoaXNSZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IHNlY3JldCA9IGlucHV0LmhlYWRlcnMuZ2V0KFwieC1hZ2VudC1zZWNyZXRcIik7XG4gICAgICAgIGlmIChzZWNyZXQgIT09IGFnZW50U2VjcmV0KSB7XG4gICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oXG4gICAgICAgICAgICB7IGVycm9yOiB7IGNvZGU6IFwiVU5BVVRIT1JJWkVEXCIsIG1lc3NhZ2U6IFwiSW52YWxpZCBzZWNyZXRcIiB9IH0sXG4gICAgICAgICAgICB7IHN0YXR1czogNDAxIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJvZHk6IEFnZW50UnBjUmVxdWVzdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBib2R5ID0gYXdhaXQgaW5wdXQuanNvbigpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuanNvbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3I6IHsgY29kZTogXCJJTlZBTElEX1JFUVVFU1RcIiwgbWVzc2FnZTogXCJJbnZhbGlkIEpTT04gYm9keVwiIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBzdGF0dXM6IDQwMCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1ldGhvZCA9IGJvZHkubWV0aG9kO1xuICAgICAgICBwYXJhbXMgPSBib2R5LnBhcmFtcztcbiAgICAgICAgbmFtZSA9IGlucHV0LmhlYWRlcnMuZ2V0KFwieC1hZ2VudC1uYW1lXCIpID8/IERFRkFVTFRfTkFNRVNQQUNFO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0aG9kID0gaW5wdXQubWV0aG9kO1xuICAgICAgICBwYXJhbXMgPSBpbnB1dC5wYXJhbXM7XG4gICAgICAgIG5hbWUgPSBpbnB1dC5uYW1lID8/IERFRkFVTFRfTkFNRVNQQUNFO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkaXNwYXRjaENvbnRleHQ6IERpc3BhdGNoQ29udGV4dCA9IHtcbiAgICAgICAgdG9vbHM6IG9wdGlvbnMudG9vbHMgYXMgVG9vbFNldCB8IHVuZGVmaW5lZCxcbiAgICAgICAgaG9va3M6IG9wdGlvbnMuaG9va3MsXG4gICAgICAgIG5lZWRzQXBwcm92YWw6XG4gICAgICAgICAgb3B0aW9ucy5uZWVkc0FwcHJvdmFsIGFzIERpc3BhdGNoQ29udGV4dFtcIm5lZWRzQXBwcm92YWxcIl0sXG4gICAgICAgIHN0b3JhZ2VDb25maWcsXG4gICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSxcbiAgICAgICAgZ2V0U3RvcmFnZUhhbmRsZXJzLFxuICAgICAgICBycGM6IGFnZW50T2JqLnJwYyxcbiAgICAgICAgb3ZlcnJpZGVzLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGlzcGF0Y2gobWV0aG9kLCBwYXJhbXMsIGRpc3BhdGNoQ29udGV4dCwgbmFtZSk7XG5cbiAgICAgIGlmICghaXNSZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YXR1cyA9IFwiZXJyb3JcIiBpbiByZXN1bHQgPyAocmVzdWx0LnN0YXR1cyA/PyA1MDApIDogMjAwO1xuICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oXG4gICAgICAgIFwiZXJyb3JcIiBpbiByZXN1bHQgPyB7IGVycm9yOiByZXN1bHQuZXJyb3IgfSA6IHsgcmVzdWx0OiByZXN1bHQucmVzdWx0IH0sXG4gICAgICAgIHsgc3RhdHVzIH1cbiAgICAgICk7XG4gICAgfSxcblxuICAgIHRvb2xzOiB7IC4uLmJ1aWx0SW5Ub29scywgLi4ub3B0aW9ucy50b29scyB9IGFzIHR5cGVvZiBidWlsdEluVG9vbHMgJiBUb29scyxcblxuICAgIHJwYzogKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJycGMgbm90IGNvbmZpZ3VyZWQuIEVuc3VyZSB3aXRoQWdlbnQgaXMgc2V0IHVwIGluIG5leHQuY29uZmlnLnRzXCJcbiAgICAgICk7XG4gICAgfSkgYXMgKHBhcmFtczogUnBjUGF5bG9hZCkgPT4gUHJvbWlzZTxScGNSZXN1bHQ+LFxuICB9O1xuXG4gIHJldHVybiBhZ2VudE9iajtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNywgVG9vbCwgVG9vbFNldCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRScGNPdmVycmlkZXMsIEFnZW50UnBjUmVzdWx0LCBScGNSZXN1bHQgfSBmcm9tIFwiLi9jbGllbnRcIjtcbmltcG9ydCB7IGdldFNhbmRib3ggfSBmcm9tIFwiLi9zYW5kYm94XCI7XG5pbXBvcnQgdHlwZSB7XG4gIFN0b3JhZ2UgYXMgQWdlbnRTdG9yYWdlLFxuICBNZXRob2ROYW1lLFxuICBScGNGbixcbiAgUnBjUmVxdWVzdCxcbiAgUnBjUmVzcG9uc2UsXG4gIFNhbmRib3hSZWNvcmQsXG4gIFNlc3Npb24sXG4gIFN0b3JhZ2VDb25maWcsXG4gIEhhbmRsZXJzIGFzIFN0b3JhZ2VIYW5kbGVycyxcbn0gZnJvbSBcIi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgU1RPUkFHRV9SUENfTUVUSE9EUyB9IGZyb20gXCIuL3N0b3JhZ2VcIjtcbmltcG9ydCB7IHJlc29sdmVBcGlVcmwsIHR5cGUgVG9vbENvbnRleHQgfSBmcm9tIFwiLi90b29sc1wiO1xuXG5leHBvcnQgdHlwZSBUb29sTWV0YWRhdGEgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGlucHV0U2NoZW1hPzogSlNPTlNjaGVtYTc7XG59O1xuXG5leHBvcnQgdHlwZSBUb29sc0V4ZWN1dGVQYXJhbXMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaW5wdXQ6IHVua25vd247XG4gIHNlc3Npb246IFNlc3Npb247XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQ7XG4gIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcblxuZXhwb3J0IHR5cGUgSG9va1Rvb2xCZWZvcmVQYXJhbXMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaW5wdXQ6IHVua25vd247XG4gIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xufTtcblxuZXhwb3J0IHR5cGUgSG9va1Rvb2xCZWZvcmVSZXN1bHQgPSB7XG4gIGlucHV0PzogdW5rbm93bjtcbiAgc3RvcD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBIb29rVG9vbEFmdGVyUGFyYW1zID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGlucHV0OiB1bmtub3duO1xuICByZXN1bHQ6IHVua25vd247XG4gIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xufTtcblxuZXhwb3J0IHR5cGUgSG9va1Rvb2xBZnRlclJlc3VsdCA9IHtcbiAgcmVzdWx0PzogdW5rbm93bjtcbiAgc3RvcD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUb29sc05lZWRzQXBwcm92YWxQYXJhbXMgPSB7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG4gIGlucHV0OiB1bmtub3duO1xuICB0b29sQ2FsbElkOiBzdHJpbmc7XG4gIG1lc3NhZ2VzOiB1bmtub3duW107XG59O1xuXG5leHBvcnQgdHlwZSBUb29sc05lZWRzQXBwcm92YWxSZXN1bHQgPSBib29sZWFuO1xuXG50eXBlIEFnZW50SG9va3MgPSB7XG4gIFwidG9vbC5iZWZvcmVcIj86IChvcHRzOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlucHV0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgaW5wdXQ6IHVua25vd24gfT47XG4gIFwidG9vbC5hZnRlclwiPzogKG9wdHM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaW5wdXQ6IHVua25vd247XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgcmVzdWx0OiB1bmtub3duIH0+O1xufTtcblxudHlwZSBOZWVkc0FwcHJvdmFsRW50cnkgPVxuICB8IGJvb2xlYW5cbiAgfCAoKFxuICAgICAgaW5wdXQ6IHVua25vd24sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgICAgICAgbWVzc2FnZXM6IHVua25vd25bXTtcbiAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHVua25vd247XG4gICAgICB9XG4gICAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik7XG5cbmV4cG9ydCB0eXBlIERpc3BhdGNoQ29udGV4dCA9IHtcbiAgdG9vbHM6IFRvb2xTZXQgfCB1bmRlZmluZWQ7XG4gIGhvb2tzOiBBZ2VudEhvb2tzIHwgdW5kZWZpbmVkO1xuICBuZWVkc0FwcHJvdmFsOiBSZWNvcmQ8c3RyaW5nLCBOZWVkc0FwcHJvdmFsRW50cnk+IHwgdW5kZWZpbmVkO1xuICBzdG9yYWdlQ29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICBnZXRTdG9yYWdlSW5zdGFuY2U6ICgpID0+IEFnZW50U3RvcmFnZTtcbiAgZ2V0U3RvcmFnZUhhbmRsZXJzOiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFN0b3JhZ2VIYW5kbGVycz47XG4gIHJwYzogUnBjRm47XG4gIG92ZXJyaWRlcz86IEFnZW50UnBjT3ZlcnJpZGVzO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvdmVycmlkZSByZXN1bHQgdG8gUnBjUmVzdWx0LCBvciBudWxsIHRvIGZhbGwgdGhyb3VnaC5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlT3ZlcnJpZGVSZXN1bHQ8VD4ocmVzOiBBZ2VudFJwY1Jlc3VsdDxUPik6IFJwY1Jlc3VsdDxUPiB8IG51bGwge1xuICBpZiAocmVzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHJlcy5vaykge1xuICAgIHJldHVybiB7IHJlc3VsdDogcmVzLnJlc3VsdCB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgZXJyb3I6IHsgY29kZTogXCJIQU5ETEVSX0VSUk9SXCIsIG1lc3NhZ2U6IHJlcy5lcnJvciB9LFxuICAgIHN0YXR1czogNDAwLFxuICB9O1xufVxuXG4vKipcbiAqIEludGVybmFsIGRpc3BhdGNoIGZ1bmN0aW9uLiBSZXR1cm5zIFJwY1Jlc3VsdCwgbm90IFJlc3BvbnNlLlxuICogRW5hYmxlcyByZWN1cnNpdmUgY2FsbHMgZm9yIGhvb2tzIHdpdGhvdXQgSlNPTiByb3VuZC10cmlwcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc3BhdGNoKFxuICBtZXRob2Q6IHN0cmluZyxcbiAgcGFyYW1zOiB1bmtub3duLFxuICBjb250ZXh0OiBEaXNwYXRjaENvbnRleHQsXG4gIG5hbWU/OiBzdHJpbmdcbik6IFByb21pc2U8UnBjUmVzdWx0PiB7XG4gIGNvbnN0IHtcbiAgICB0b29scyxcbiAgICBob29rcyxcbiAgICBuZWVkc0FwcHJvdmFsLFxuICAgIHN0b3JhZ2VDb25maWcsXG4gICAgZ2V0U3RvcmFnZUluc3RhbmNlLFxuICAgIGdldFN0b3JhZ2VIYW5kbGVycyxcbiAgICBycGMsXG4gICAgb3ZlcnJpZGVzLFxuICB9ID0gY29udGV4dDtcblxuICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgIGNhc2UgXCJ0b29scy5saXN0XCI6IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRIYW5kbGVyID0gKCk6IFJwY1Jlc3VsdDxUb29sTWV0YWRhdGFbXT4gPT4ge1xuICAgICAgICBjb25zdCB0b29sc01hcCA9IHRvb2xzID8/ICh7fSBhcyBUb29sU2V0KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXModG9vbHNNYXApLm1hcCgoW25hbWUsIHRdKSA9PiAoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICh0IGFzIFRvb2wpLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiBzY2hlbWFUb0pzb25TY2hlbWEoKHQgYXMgVG9vbCkuaW5wdXRTY2hlbWEpLFxuICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBvdmVycmlkZXM/LltcInRvb2xzLmxpc3RcIl07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG92ZXJyaWRlUmVzdWx0ID0gYXdhaXQgb3ZlcnJpZGU/Lih7fSk7XG4gICAgICAgIGlmIChvdmVycmlkZVJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZWQgPSBoYW5kbGVPdmVycmlkZVJlc3VsdChvdmVycmlkZVJlc3VsdCk7XG4gICAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmYXVsdEhhbmRsZXIoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJIQU5ETEVSX0VSUk9SXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlIFwidG9vbHMubmVlZHNBcHByb3ZhbFwiOiB7XG4gICAgICBjb25zdCBwID0gcGFyYW1zIGFzIFRvb2xzTmVlZHNBcHByb3ZhbFBhcmFtcztcblxuICAgICAgY29uc3QgZGVmYXVsdEhhbmRsZXIgPSBhc3luYyAoKTogUHJvbWlzZTxScGNSZXN1bHQ8Ym9vbGVhbj4+ID0+IHtcbiAgICAgICAgLy8gMS4gUGVyLXRvb2wgbmVlZHNBcHByb3ZhbCBvbiBjdXN0b20gdG9vbHMgdGFrZXMgcHJpb3JpdHlcbiAgICAgICAgY29uc3QgdG9vbHNNYXAgPSB0b29scyA/PyAoe30gYXMgVG9vbFNldCk7XG4gICAgICAgIGNvbnN0IHRvb2xEZWYgPSB0b29sc01hcFtwLnRvb2xOYW1lXSBhcyBUb29sIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodG9vbERlZj8ubmVlZHNBcHByb3ZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0b29sRGVmLm5lZWRzQXBwcm92YWwgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IHRvb2xEZWYubmVlZHNBcHByb3ZhbCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b29sRGVmLm5lZWRzQXBwcm92YWwocC5pbnB1dCwge1xuICAgICAgICAgICAgdG9vbENhbGxJZDogcC50b29sQ2FsbElkLFxuICAgICAgICAgICAgbWVzc2FnZXM6IHAubWVzc2FnZXMgYXMgbmV2ZXJbXSxcbiAgICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB1bmRlZmluZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBBZ2VudC1sZXZlbCBuZWVkc0FwcHJvdmFsIG1hcFxuICAgICAgICBpZiAoIW5lZWRzQXBwcm92YWwpIHtcbiAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cnkgPSBuZWVkc0FwcHJvdmFsW3AudG9vbE5hbWVdO1xuICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogZW50cnkgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnRyeShwLmlucHV0LCB7XG4gICAgICAgICAgdG9vbENhbGxJZDogcC50b29sQ2FsbElkLFxuICAgICAgICAgIG1lc3NhZ2VzOiBwLm1lc3NhZ2VzLFxuICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVzPy5bXCJ0b29scy5uZWVkc0FwcHJvdmFsXCJdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IGF3YWl0IG92ZXJyaWRlPy4ocCk7XG4gICAgICAgIGlmIChvdmVycmlkZVJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZWQgPSBoYW5kbGVPdmVycmlkZVJlc3VsdChvdmVycmlkZVJlc3VsdCk7XG4gICAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgZGVmYXVsdEhhbmRsZXIoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJORUVEU19BUFBST1ZBTF9FUlJPUlwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSBcImhvb2sudG9vbC5iZWZvcmVcIjoge1xuICAgICAgY29uc3QgcCA9IHBhcmFtcyBhcyBIb29rVG9vbEJlZm9yZVBhcmFtcztcblxuICAgICAgY29uc3QgZGVmYXVsdEhhbmRsZXIgPSBhc3luYyAoXG4gICAgICAgIGhvb2tQYXJhbXM6IEhvb2tUb29sQmVmb3JlUGFyYW1zXG4gICAgICApOiBQcm9taXNlPEhvb2tUb29sQmVmb3JlUmVzdWx0PiA9PiB7XG4gICAgICAgIGlmICghaG9va3M/LltcInRvb2wuYmVmb3JlXCJdKSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhvb2tSZXN1bHQgPSBhd2FpdCBob29rc1tcInRvb2wuYmVmb3JlXCJdKGhvb2tQYXJhbXMpO1xuICAgICAgICByZXR1cm4gaG9va1Jlc3VsdCA/PyB7fTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVzPy5bXCJob29rLnRvb2wuYmVmb3JlXCJdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgY3VycmVudFBhcmFtcyA9IHA7XG4gICAgICAgIGxldCBtZXJnZWQ6IEhvb2tUb29sQmVmb3JlUmVzdWx0ID0ge307XG5cbiAgICAgICAgY29uc3Qgb3ZlcnJpZGVSZXN1bHQgPSBhd2FpdCBvdmVycmlkZT8uKHApO1xuICAgICAgICBpZiAob3ZlcnJpZGVSZXN1bHQ/Lm9rKSB7XG4gICAgICAgICAgbWVyZ2VkID0geyAuLi5tZXJnZWQsIC4uLm92ZXJyaWRlUmVzdWx0LnJlc3VsdCB9O1xuICAgICAgICAgIGlmIChtZXJnZWQuc3RvcCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiBtZXJnZWQgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG92ZXJyaWRlUmVzdWx0LnJlc3VsdC5pbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjdXJyZW50UGFyYW1zID0ge1xuICAgICAgICAgICAgICAuLi5jdXJyZW50UGFyYW1zLFxuICAgICAgICAgICAgICBpbnB1dDogb3ZlcnJpZGVSZXN1bHQucmVzdWx0LmlucHV0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZhdWx0UmVzdWx0ID0gYXdhaXQgZGVmYXVsdEhhbmRsZXIoY3VycmVudFBhcmFtcyk7XG4gICAgICAgIG1lcmdlZCA9IHsgLi4ubWVyZ2VkLCAuLi5kZWZhdWx0UmVzdWx0IH07XG5cbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiBtZXJnZWQgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJIT09LX0VSUk9SXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlIFwiaG9vay50b29sLmFmdGVyXCI6IHtcbiAgICAgIGNvbnN0IHAgPSBwYXJhbXMgYXMgSG9va1Rvb2xBZnRlclBhcmFtcztcblxuICAgICAgY29uc3QgZGVmYXVsdEhhbmRsZXIgPSBhc3luYyAoXG4gICAgICAgIGhvb2tQYXJhbXM6IEhvb2tUb29sQWZ0ZXJQYXJhbXNcbiAgICAgICk6IFByb21pc2U8SG9va1Rvb2xBZnRlclJlc3VsdD4gPT4ge1xuICAgICAgICBpZiAoIWhvb2tzPy5bXCJ0b29sLmFmdGVyXCJdKSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhvb2tSZXN1bHQgPSBhd2FpdCBob29rc1tcInRvb2wuYWZ0ZXJcIl0oaG9va1BhcmFtcyk7XG4gICAgICAgIHJldHVybiBob29rUmVzdWx0ID8/IHt9O1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBvdmVycmlkZXM/LltcImhvb2sudG9vbC5hZnRlclwiXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGN1cnJlbnRQYXJhbXMgPSBwO1xuICAgICAgICBsZXQgbWVyZ2VkOiBIb29rVG9vbEFmdGVyUmVzdWx0ID0ge307XG5cbiAgICAgICAgY29uc3Qgb3ZlcnJpZGVSZXN1bHQgPSBhd2FpdCBvdmVycmlkZT8uKHApO1xuICAgICAgICBpZiAob3ZlcnJpZGVSZXN1bHQ/Lm9rKSB7XG4gICAgICAgICAgbWVyZ2VkID0geyAuLi5tZXJnZWQsIC4uLm92ZXJyaWRlUmVzdWx0LnJlc3VsdCB9O1xuICAgICAgICAgIGlmIChtZXJnZWQuc3RvcCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiBtZXJnZWQgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG92ZXJyaWRlUmVzdWx0LnJlc3VsdC5yZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY3VycmVudFBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgLi4uY3VycmVudFBhcmFtcyxcbiAgICAgICAgICAgICAgcmVzdWx0OiBvdmVycmlkZVJlc3VsdC5yZXN1bHQucmVzdWx0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZhdWx0UmVzdWx0ID0gYXdhaXQgZGVmYXVsdEhhbmRsZXIoY3VycmVudFBhcmFtcyk7XG4gICAgICAgIG1lcmdlZCA9IHsgLi4ubWVyZ2VkLCAuLi5kZWZhdWx0UmVzdWx0IH07XG5cbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiBtZXJnZWQgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJIT09LX0VSUk9SXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlIFwidG9vbHMuZXhlY3V0ZVwiOiB7XG4gICAgICBjb25zdCBwID0gcGFyYW1zIGFzIFRvb2xzRXhlY3V0ZVBhcmFtcztcblxuICAgICAgY29uc3QgZGVmYXVsdEhhbmRsZXIgPSBhc3luYyAoKTogUHJvbWlzZTxScGNSZXN1bHQ+ID0+IHtcbiAgICAgICAgY29uc3QgdG9vbHNNYXAgPSB0b29scyA/PyAoe30gYXMgVG9vbFNldCk7XG4gICAgICAgIGNvbnN0IHRvb2xEZWYgPSB0b29sc01hcFtwLm5hbWUgYXMga2V5b2YgdHlwZW9mIHRvb2xzTWFwXTtcbiAgICAgICAgaWYgKCF0b29sRGVmKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgIGNvZGU6IFwiVE9PTF9OT1RfRk9VTkRcIixcbiAgICAgICAgICAgICAgbWVzc2FnZTogYFVua25vd24gdG9vbDogJHtwLm5hbWV9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhlY3V0ZSA9ICh0b29sRGVmIGFzIFRvb2wpLmV4ZWN1dGU7XG4gICAgICAgIGlmICghZXhlY3V0ZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICBjb2RlOiBcIk5PX0VYRUNVVEVcIixcbiAgICAgICAgICAgICAgbWVzc2FnZTogYFRvb2wgJHtwLm5hbWV9IGhhcyBubyBleGVjdXRlIGZ1bmN0aW9uYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2FuZGJveEluc3RhbmNlID0gZ2V0U2FuZGJveCh7XG4gICAgICAgICAgc2FuZGJveFJlY29yZDogcC5zYW5kYm94UmVjb3JkLFxuICAgICAgICAgIHN0b3JhZ2VDb25maWcsXG4gICAgICAgICAgc3RvcmFnZTogZ2V0U3RvcmFnZUluc3RhbmNlKCksXG4gICAgICAgICAgcnBjLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0b29sQ29udGV4dDogVG9vbENvbnRleHQgPSB7XG4gICAgICAgICAgc2Vzc2lvbjogcC5zZXNzaW9uLFxuICAgICAgICAgIHNhbmRib3g6IHNhbmRib3hJbnN0YW5jZSxcbiAgICAgICAgICBzdG9yYWdlOiBnZXRTdG9yYWdlSW5zdGFuY2UoKSxcbiAgICAgICAgICBjb250ZXh0OiBwLmNvbnRleHQsXG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHRvb2xJbnB1dCA9IHAuaW5wdXQ7XG5cbiAgICAgICAgY29uc3QgYmVmb3JlUmVzdWx0ID0gYXdhaXQgZGlzcGF0Y2goXG4gICAgICAgICAgXCJob29rLnRvb2wuYmVmb3JlXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgIGNvbnRleHQ6IHRvb2xDb250ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBuYW1lXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcImVycm9yXCIgaW4gYmVmb3JlUmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIGJlZm9yZVJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiZWZvcmVIb29rID0gYmVmb3JlUmVzdWx0LnJlc3VsdCBhcyBIb29rVG9vbEJlZm9yZVJlc3VsdDtcbiAgICAgICAgaWYgKGJlZm9yZUhvb2suc3RvcCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICBjb2RlOiBcIkhPT0tfU1RPUFBFRFwiLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBcInRvb2wuYmVmb3JlIGhvb2sgc3RvcHBlZCBleGVjdXRpb25cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChiZWZvcmVIb29rLmlucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0b29sSW5wdXQgPSBiZWZvcmVIb29rLmlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUodG9vbElucHV0IGFzIG5ldmVyLCB7XG4gICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHRvb2xDb250ZXh0LFxuICAgICAgICAgIHRvb2xDYWxsSWQ6IFwicnBjXCIsXG4gICAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBhZnRlclJlc3VsdCA9IGF3YWl0IGRpc3BhdGNoKFxuICAgICAgICAgIFwiaG9vay50b29sLmFmdGVyXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIGNvbnRleHQ6IHRvb2xDb250ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBuYW1lXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcImVycm9yXCIgaW4gYWZ0ZXJSZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gYWZ0ZXJSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWZ0ZXJIb29rID0gYWZ0ZXJSZXN1bHQucmVzdWx0IGFzIEhvb2tUb29sQWZ0ZXJSZXN1bHQ7XG4gICAgICAgIGlmIChhZnRlckhvb2suc3RvcCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICBjb2RlOiBcIkhPT0tfU1RPUFBFRFwiLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBcInRvb2wuYWZ0ZXIgaG9vayBzdG9wcGVkIGV4ZWN1dGlvblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFmdGVySG9vay5yZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc3VsdCA9IGFmdGVySG9vay5yZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVzPy5bXCJ0b29scy5leGVjdXRlXCJdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IGF3YWl0IG92ZXJyaWRlPy4ocCk7XG4gICAgICAgIGlmIChvdmVycmlkZVJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZWQgPSBoYW5kbGVPdmVycmlkZVJlc3VsdChvdmVycmlkZVJlc3VsdCk7XG4gICAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgZGVmYXVsdEhhbmRsZXIoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJFWEVDVVRFX0VSUk9SXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCBtZXRob2ROYW1lID0gbWV0aG9kIGFzIE1ldGhvZE5hbWU7XG4gICAgICBpZiAoIVNUT1JBR0VfUlBDX01FVEhPRFMuaW5jbHVkZXMobWV0aG9kTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJVTktOT1dOX01FVEhPRFwiLFxuICAgICAgICAgICAgbWVzc2FnZTogYFVua25vd24gUlBDIG1ldGhvZDogJHttZXRob2R9YCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWZhdWx0SGFuZGxlciA9IGFzeW5jICgpOiBQcm9taXNlPFJwY1Jlc3VsdD4gPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgaGFuZGxlU3RvcmFnZVJlcXVlc3Qoe1xuICAgICAgICAgIGNvbmZpZzogc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgICByZXF1ZXN0OiB7IG1ldGhvZCwgcGFyYW1zIH0sXG4gICAgICAgICAgbmFtZTogbmFtZSA/PyBzdG9yYWdlQ29uZmlnLm5hbWUgPz8gXCJkZWZhdWx0XCIsXG4gICAgICAgICAgZ2V0U3RvcmFnZUhhbmRsZXJzLFxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVzPy5bbWV0aG9kTmFtZV0gYXNcbiAgICAgICAgfCAoKHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTxBZ2VudFJwY1Jlc3VsdDx1bmtub3duPj4pXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IGF3YWl0IG92ZXJyaWRlPy4ocGFyYW1zKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlUmVzdWx0KSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlZCA9IGhhbmRsZU92ZXJyaWRlUmVzdWx0KG92ZXJyaWRlUmVzdWx0KTtcbiAgICAgICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBkZWZhdWx0SGFuZGxlcigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBjb2RlOiBcIlNUT1JBR0VfRVJST1JcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1czogNTAwLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJvdXRlcyBzdG9yYWdlIFJQQyByZXF1ZXN0cyBiYXNlZCBvbiBzdG9yYWdlIGNvbmZpZyB0eXBlLlxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVTdG9yYWdlUmVxdWVzdCh7XG4gIGNvbmZpZyxcbiAgcmVxdWVzdCxcbiAgbmFtZSxcbiAgZ2V0U3RvcmFnZUhhbmRsZXJzLFxufToge1xuICBjb25maWc6IFN0b3JhZ2VDb25maWc7XG4gIHJlcXVlc3Q6IFJwY1JlcXVlc3Q7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2V0U3RvcmFnZUhhbmRsZXJzOiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFN0b3JhZ2VIYW5kbGVycz47XG59KTogUHJvbWlzZTxScGNSZXNwb25zZT4ge1xuICBzd2l0Y2ggKGNvbmZpZy50eXBlKSB7XG4gICAgY2FzZSBcImxvY2FsXCI6IHtcbiAgICAgIGNvbnN0IGhhbmRsZXJzID0gYXdhaXQgZ2V0U3RvcmFnZUhhbmRsZXJzKG5hbWUpO1xuICAgICAgY29uc3QgeyBoYW5kbGVTdG9yYWdlUnBjIH0gPSBhd2FpdCBpbXBvcnQoXCIuL3N0b3JhZ2UvaGFuZGxlclwiKTtcbiAgICAgIHJldHVybiBoYW5kbGVTdG9yYWdlUnBjKHJlcXVlc3QsIGhhbmRsZXJzKTtcbiAgICB9XG4gICAgY2FzZSBcInZlcmNlbFwiOiB7XG4gICAgICBjb25zdCB7IGdldFZlcmNlbFN0b3JhZ2VDb25maWcgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgXCIuL3N0b3JhZ2UvYmluZGluZ3MvdmVyY2VsXCJcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGdldFZlcmNlbFN0b3JhZ2VDb25maWcoKTtcbiAgICAgIHJldHVybiBhd2FpdCBwcm94eVN0b3JhZ2VSZXF1ZXN0KHtcbiAgICAgICAgdXJsOiByZXNvbHZlZC51cmwsXG4gICAgICAgIGhlYWRlcnM6IHsgLi4ucmVzb2x2ZWQuaGVhZGVycywgXCJ4LWFnZW50LW5hbWVcIjogbmFtZSB9LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2UgXCJjdXN0b21cIjoge1xuICAgICAgcmV0dXJuIGF3YWl0IHByb3h5U3RvcmFnZVJlcXVlc3Qoe1xuICAgICAgICB1cmw6IHJlc29sdmVBcGlVcmwoeyBhcGk6IGNvbmZpZy51cmwgfSksXG4gICAgICAgIGhlYWRlcnM6IHsgLi4uY29uZmlnLmhlYWRlcnMsIFwieC1hZ2VudC1uYW1lXCI6IG5hbWUgfSxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25maWcgc2F0aXNmaWVzIG5ldmVyO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5rbm93biBzdG9yYWdlIHR5cGU6ICR7KGNvbmZpZyBhcyB7IHR5cGU6IHN0cmluZyB9KS50eXBlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUHJveGllcyBhIHN0b3JhZ2UgUlBDIHJlcXVlc3QgdG8gYW4gZXh0ZXJuYWwgVVJMLlxuICovXG5hc3luYyBmdW5jdGlvbiBwcm94eVN0b3JhZ2VSZXF1ZXN0KHtcbiAgdXJsLFxuICBoZWFkZXJzLFxuICByZXF1ZXN0LFxufToge1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJlcXVlc3Q6IFJwY1JlcXVlc3Q7XG59KTogUHJvbWlzZTxScGNSZXNwb25zZT4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgaGVhZGVyczoge1xuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAuLi5oZWFkZXJzLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdCksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogXCJQUk9YWV9FUlJPUlwiLFxuICAgICAgICBtZXNzYWdlOiBgU3RvcmFnZSBwcm94eSBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxScGNSZXNwb25zZT47XG59XG5cbmZ1bmN0aW9uIHNjaGVtYVRvSnNvblNjaGVtYShzY2hlbWE6IHVua25vd24pOiBKU09OU2NoZW1hNyB8IHVuZGVmaW5lZCB7XG4gIGlmICghc2NoZW1hKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgc2NoZW1hICE9PSBudWxsICYmXG4gICAgXCJfZGVmXCIgaW4gc2NoZW1hICYmXG4gICAgdHlwZW9mIChzY2hlbWEgYXMgei5ab2RUeXBlKS5fZGVmID09PSBcIm9iamVjdFwiXG4gICkge1xuICAgIHJldHVybiB6LnRvSlNPTlNjaGVtYShzY2hlbWEgYXMgei5ab2RUeXBlKSBhcyBKU09OU2NoZW1hNztcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiICYmIHNjaGVtYSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHMgPSBzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKFN5bWJvbC5mb3IoXCJ2ZXJjZWwuYWkuc2NoZW1hXCIpIGluIHMgJiYgXCJqc29uU2NoZW1hXCIgaW4gcykge1xuICAgICAgcmV0dXJuIHMuanNvblNjaGVtYSBhcyBKU09OU2NoZW1hNztcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHNjaGVtYSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHNjaGVtYSAhPT0gbnVsbCAmJlxuICAgIChcInR5cGVcIiBpbiBzY2hlbWEgfHwgXCJwcm9wZXJ0aWVzXCIgaW4gc2NoZW1hKVxuICApIHtcbiAgICByZXR1cm4gc2NoZW1hIGFzIEpTT05TY2hlbWE3O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFVJTWVzc2FnZSB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgdHlwZSB7IFNlbmRJbnB1dCB9IGZyb20gXCIuLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUGFydCB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b01lc3NhZ2VBbmRQYXJ0cyh7XG4gIHNlc3Npb25JZCxcbiAgaWQsXG4gIGlucHV0LFxuICBkZWZhdWx0Um9sZSxcbn06IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBpbnB1dDogU2VuZElucHV0O1xuICBkZWZhdWx0Um9sZTogVUlNZXNzYWdlW1wicm9sZVwiXTtcbn0pOiB7IG1lc3NhZ2U6IE1lc3NhZ2U7IHBhcnRzOiBQYXJ0W10gfSB7XG4gIGNvbnN0IG1lc3NhZ2VJZCA9IGlkID8/IGBtZXNzYWdlXyR7dWxpZCgpfWA7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB7XG4gICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgcm9sZTogZGVmYXVsdFJvbGUsXG4gICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICBzdGFydGVkQXQ6IG51bGwsXG4gICAgICAgIGNvbXBsZXRlZEF0OiBudWxsLFxuICAgICAgICBpbnRlcnJ1cHRlZEF0OiBudWxsLFxuICAgICAgICB1c2FnZTogbnVsbCxcbiAgICAgIH0sXG4gICAgICBwYXJ0czogW1xuICAgICAgICB7XG4gICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICBpZDogYHBhcnRfJHt1bGlkKCl9YCxcbiAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICBwYXJ0OiB7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBpbnB1dCB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIHJldHVybiB7XG4gICAgbWVzc2FnZToge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgc3RhcnRlZEF0OiBudWxsLFxuICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICBpbnRlcnJ1cHRlZEF0OiBudWxsLFxuICAgICAgdXNhZ2U6IG51bGwsXG4gICAgICByb2xlOiBpbnB1dC5yb2xlID8/IGRlZmF1bHRSb2xlLFxuICAgIH0sXG4gICAgcGFydHM6IGlucHV0LnBhcnRzLm1hcCgocGFydCwgaW5kZXgpID0+ICh7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBtZXNzYWdlSWQsXG4gICAgICBpZDogYHBhcnRfJHt1bGlkKCl9YCxcbiAgICAgIGluZGV4LFxuICAgICAgcGFydCxcbiAgICB9KSksXG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVUEsU0FBUyxXQUFXO0FBQ3BCLFlBQVksWUFBWTtBQUN4QixPQUFPLFdBQVc7QUFDbEIsU0FBUyxRQUFBQSxhQUFZO0FBQ3JCLFNBQVMsUUFBUSxhQUFhOzs7QUNiOUIsU0FBUyxTQUFTO0FBc0dsQixTQUFTLHFCQUF3QixLQUE2QztBQUM1RSxNQUFJLFFBQVEsTUFBTTtBQUNoQixXQUFPO0FBQUEsRUFDVDtBQUNBLE1BQUksSUFBSSxJQUFJO0FBQ1YsV0FBTyxFQUFFLFFBQVEsSUFBSSxPQUFPO0FBQUEsRUFDOUI7QUFDQSxTQUFPO0FBQUEsSUFDTCxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsU0FBUyxJQUFJLE1BQU07QUFBQSxJQUNuRCxRQUFRO0FBQUEsRUFDVjtB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QUNBO0FBQUEsUUFDQSxLQUFLLFNBQVM7QUFBQSxRQUNkO0FBQUEsTUFDRjtBQUVBLFlBQU0sU0FBUyxNQUFNLFNBQVMsUUFBUSxRQUFRLGlCQUFpQixJQUFJO0FBRW5FLFVBQUksQ0FBQyxXQUFXO0FBQ2QsZUFBTztBQUFBLE1BQ1Q7QUFFQSxZQUFNLFNBQVMsV0FBVyxTQUFVLE9BQU8sVUFBVSxNQUFPO0FBQzVELGFBQU8sU0FBUztBQUFBLFFBQ2QsV0FBVyxTQUFTLEVBQUUsT0FBTyxPQUFPLE1BQU0sSUFBSSxFQUFFLFFBQVEsT0FBTyxPQUFPO0FBQUEsUUFDdEUsRUFBRSxPQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0Y7QUFBQSxJQUVBLE9BQU8sRUFBRSxHQUFHLGNBQWMsR0FBRyxRQUFRLE1BQU07QUFBQSxJQUUzQyxLQUFNLE1BQU07QUFDVixZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJ1bGlkIiwgIm5hbWUiLCAicmVzdWx0IiwgImhhbmRsZVN0b3JhZ2VScGMiLCAibm93IiwgInVsaWQiLCAic2Vzc2lvbiJdCn0K
|