experimental-agent 0.0.3 → 0.0.5

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.
Files changed (38) hide show
  1. package/dist/agent-workflow.d.mts +1 -1
  2. package/dist/agent-workflow.d.ts +1 -1
  3. package/dist/agent-workflow.js +739 -319
  4. package/dist/agent-workflow.mjs +1 -1
  5. package/dist/chunk-2IIWVPZB.mjs +334 -0
  6. package/dist/{chunk-TQRCSTCF.mjs → chunk-CQB6AOJ7.mjs} +2 -2
  7. package/dist/{chunk-UFVWOC5L.mjs → chunk-CRDAPJEY.mjs} +3 -3
  8. package/dist/chunk-GJETDXOU.mjs +361 -0
  9. package/dist/chunk-M2XPBOZD.mjs +1980 -0
  10. package/dist/chunk-ZWP7RQZT.mjs +1239 -0
  11. package/dist/{client-SREKHM6I.mjs → client-5C4CNU6H.mjs} +1 -1
  12. package/dist/{client-BlSrVoPI.d.mts → client-9A8NO6x9.d.mts} +268 -7
  13. package/dist/{client-BlSrVoPI.d.ts → client-9A8NO6x9.d.ts} +268 -7
  14. package/dist/{handler-36FM5H35.mjs → handler-SZDTM3MC.mjs} +1 -1
  15. package/dist/index.d.mts +2 -2
  16. package/dist/index.d.ts +2 -2
  17. package/dist/index.js +875 -341
  18. package/dist/index.mjs +96 -24
  19. package/dist/lifecycle-workflow.d.mts +1 -1
  20. package/dist/lifecycle-workflow.d.ts +1 -1
  21. package/dist/lifecycle-workflow.js +97 -4
  22. package/dist/lifecycle-workflow.mjs +1 -1
  23. package/dist/local-fs-handlers-BZVA3XAU.mjs +277 -0
  24. package/dist/next/loader.js +3 -3
  25. package/dist/next/loader.mjs +1 -1
  26. package/dist/next.js +6 -3
  27. package/dist/next.mjs +5 -2
  28. package/dist/{sandbox-QAPGBVYM.mjs → sandbox-M24R3JLM.mjs} +2 -2
  29. package/dist/{storage-Q376OZH3.mjs → storage-TMZQJ2OQ.mjs} +2 -2
  30. package/dist/vercel-WGN2NY3D.mjs +20 -0
  31. package/dist/{vercel-sdk-VHKEX2GQ.mjs → vercel-sdk-UKBD5JDI.mjs} +2 -2
  32. package/package.json +2 -2
  33. package/dist/chunk-GSRJYPWF.mjs +0 -284
  34. package/dist/chunk-JEE2FQ4O.mjs +0 -844
  35. package/dist/chunk-VBLZWXVE.mjs +0 -318
  36. package/dist/chunk-ZASQBPOI.mjs +0 -2057
  37. package/dist/local-fs-handlers-P4WGW3QY.mjs +0 -235
  38. package/dist/vercel-LLXAHKVJ.mjs +0 -20
@@ -0,0 +1,361 @@
1
+ // src/storage/rpc.ts
2
+ import { z } from "zod";
3
+ var VercelLifecycleConfigSchema = z.object({
4
+ pollIntervalMs: z.number().optional(),
5
+ stopAfterInactiveMs: z.number().optional(),
6
+ snapshotBeforeTimeoutMs: z.number().optional(),
7
+ snapshotId: z.string().optional(),
8
+ autoStart: z.boolean().optional()
9
+ });
10
+ var NetworkPolicySchema = z.union([
11
+ z.literal("allow-all"),
12
+ z.literal("deny-all"),
13
+ z.object({
14
+ allow: z.array(z.string()).optional(),
15
+ subnets: z.object({
16
+ allow: z.array(z.string()).optional(),
17
+ deny: z.array(z.string()).optional()
18
+ }).optional()
19
+ })
20
+ ]).optional();
21
+ var SandboxConfigSchema = z.discriminatedUnion("type", [
22
+ z.object({
23
+ type: z.literal("vercel"),
24
+ resources: z.object({ vcpus: z.number() }).optional(),
25
+ ports: z.array(z.number()).optional(),
26
+ lifecycle: VercelLifecycleConfigSchema.optional(),
27
+ networkPolicy: NetworkPolicySchema
28
+ }),
29
+ z.object({
30
+ type: z.literal("local"),
31
+ path: z.string().optional()
32
+ }),
33
+ z.object({
34
+ type: z.literal("custom"),
35
+ url: z.string(),
36
+ headers: z.record(z.string(), z.string()).optional()
37
+ })
38
+ ]);
39
+ var GenerationSchema = z.object({
40
+ maxSteps: z.number().optional(),
41
+ temperature: z.number().optional(),
42
+ topK: z.number().optional(),
43
+ topP: z.number().optional(),
44
+ frequencyPenalty: z.number().optional(),
45
+ presencePenalty: z.number().optional(),
46
+ maxOutputTokens: z.number().optional(),
47
+ headers: z.record(z.string(), z.string()).optional()
48
+ });
49
+ var SessionSchema = z.object({
50
+ id: z.string(),
51
+ createdAt: z.number(),
52
+ updatedAt: z.number(),
53
+ runId: z.string().nullable(),
54
+ lastMessageId: z.string().nullable(),
55
+ tags: z.record(z.string(), z.unknown()).nullable(),
56
+ system: z.string().nullable(),
57
+ model: z.string().nullable(),
58
+ sandboxId: z.string().nullable(),
59
+ skillsDir: z.array(z.string()).nullable(),
60
+ hookToken: z.string().nullable(),
61
+ activeTools: z.array(z.string()).nullable(),
62
+ generation: GenerationSchema.nullable().default(null)
63
+ });
64
+ var StepUsageSchema = z.object({
65
+ stepIndex: z.number(),
66
+ model: z.string(),
67
+ inputTokens: z.number(),
68
+ outputTokens: z.number(),
69
+ totalTokens: z.number(),
70
+ cacheReadTokens: z.number(),
71
+ cacheWriteTokens: z.number(),
72
+ reasoningTokens: z.number()
73
+ });
74
+ var UsageSummarySchema = z.object({
75
+ model: z.string(),
76
+ inputTokens: z.number(),
77
+ outputTokens: z.number(),
78
+ totalTokens: z.number(),
79
+ cacheReadTokens: z.number(),
80
+ cacheWriteTokens: z.number(),
81
+ reasoningTokens: z.number(),
82
+ stepCount: z.number()
83
+ });
84
+ var MessageUsageSchema = z.object({
85
+ steps: z.array(StepUsageSchema),
86
+ summary: UsageSummarySchema
87
+ });
88
+ var MessageSchema = z.object({
89
+ id: z.string(),
90
+ sessionId: z.string(),
91
+ role: z.enum(["user", "assistant", "system"]),
92
+ createdAt: z.number(),
93
+ startedAt: z.number().nullable(),
94
+ completedAt: z.number().nullable(),
95
+ interruptedAt: z.number().nullable(),
96
+ usage: MessageUsageSchema.nullable()
97
+ });
98
+ var PartSchema = z.object({
99
+ id: z.string(),
100
+ messageId: z.string(),
101
+ sessionId: z.string(),
102
+ index: z.number(),
103
+ part: z.unknown()
104
+ });
105
+ var CommandResultSchema = z.object({
106
+ stdout: z.string(),
107
+ stderr: z.string(),
108
+ exitCode: z.number(),
109
+ completedAt: z.number()
110
+ });
111
+ var SandboxRecordSchema = z.object({
112
+ id: z.string(),
113
+ config: SandboxConfigSchema,
114
+ tags: z.record(z.string(), z.unknown()).nullable(),
115
+ createdAt: z.number().nullable(),
116
+ lastActivityAt: z.number().nullable(),
117
+ acquiringLockId: z.string().nullable(),
118
+ acquiringLockAt: z.number().nullable(),
119
+ providerMetadata: z.discriminatedUnion("provider", [
120
+ z.object({
121
+ provider: z.literal("vercel"),
122
+ sandboxId: z.string().nullable(),
123
+ snapshotId: z.string().nullable()
124
+ })
125
+ ]).optional()
126
+ });
127
+ var CommandBaseSchema = z.object({
128
+ id: z.string(),
129
+ sessionId: z.string(),
130
+ command: z.string(),
131
+ args: z.array(z.string()).optional(),
132
+ startedAt: z.number()
133
+ });
134
+ var CommandSchema = z.discriminatedUnion("status", [
135
+ CommandBaseSchema.extend({ status: z.literal("running") }),
136
+ CommandBaseSchema.extend({
137
+ status: z.literal("completed"),
138
+ result: CommandResultSchema
139
+ }),
140
+ CommandBaseSchema.extend({
141
+ status: z.literal("killed"),
142
+ result: CommandResultSchema.optional()
143
+ }),
144
+ CommandBaseSchema.extend({
145
+ status: z.literal("failed"),
146
+ result: CommandResultSchema
147
+ })
148
+ ]);
149
+ function ListResultSchema(itemSchema) {
150
+ return z.object({
151
+ items: z.array(itemSchema),
152
+ nextCursor: z.string().nullable()
153
+ });
154
+ }
155
+ var SetupSnapshotSchema = z.object({
156
+ key: z.string(),
157
+ snapshotId: z.string().nullable(),
158
+ createdAt: z.number(),
159
+ lastUsedAt: z.number().nullable(),
160
+ acquiringLockId: z.string().nullable(),
161
+ acquiringLockAt: z.number().nullable()
162
+ });
163
+ var methods = {
164
+ "session.get": {
165
+ params: z.object({ id: z.string() }),
166
+ result: SessionSchema.nullable()
167
+ },
168
+ "session.set": {
169
+ params: SessionSchema,
170
+ result: SessionSchema
171
+ },
172
+ "session.list": {
173
+ params: z.object({
174
+ tags: z.record(z.string(), z.unknown()).optional(),
175
+ order: z.enum([
176
+ "createdAt_asc",
177
+ "createdAt_desc",
178
+ "updatedAt_asc",
179
+ "updatedAt_desc"
180
+ ]).optional(),
181
+ cursor: z.string().optional(),
182
+ limit: z.number().optional()
183
+ }),
184
+ result: ListResultSchema(SessionSchema)
185
+ },
186
+ "session.listBySandbox": {
187
+ params: z.object({
188
+ sandboxId: z.string(),
189
+ tags: z.record(z.string(), z.unknown()).optional(),
190
+ order: z.enum([
191
+ "createdAt_asc",
192
+ "createdAt_desc",
193
+ "updatedAt_asc",
194
+ "updatedAt_desc"
195
+ ]).optional(),
196
+ cursor: z.string().optional(),
197
+ limit: z.number().optional()
198
+ }),
199
+ result: ListResultSchema(SessionSchema)
200
+ },
201
+ "session.tag.set": {
202
+ params: z.object({
203
+ sessionId: z.string(),
204
+ tags: z.record(z.string(), z.unknown())
205
+ }),
206
+ result: SessionSchema
207
+ },
208
+ "message.get": {
209
+ params: z.object({ id: z.string() }),
210
+ result: MessageSchema.nullable()
211
+ },
212
+ "message.set": {
213
+ params: MessageSchema,
214
+ result: MessageSchema
215
+ },
216
+ "message.list": {
217
+ params: z.object({
218
+ sessionId: z.string(),
219
+ cursor: z.string().optional(),
220
+ limit: z.number().optional()
221
+ }),
222
+ result: ListResultSchema(MessageSchema)
223
+ },
224
+ "part.listByMessage": {
225
+ params: z.object({
226
+ messageId: z.string(),
227
+ cursor: z.string().optional(),
228
+ limit: z.number().optional()
229
+ }),
230
+ result: ListResultSchema(PartSchema)
231
+ },
232
+ "part.listBySession": {
233
+ params: z.object({
234
+ sessionId: z.string(),
235
+ cursor: z.string().optional(),
236
+ limit: z.number().optional()
237
+ }),
238
+ result: ListResultSchema(PartSchema)
239
+ },
240
+ "part.set": {
241
+ params: PartSchema,
242
+ result: PartSchema
243
+ },
244
+ "part.delete": {
245
+ params: z.object({ id: z.string() }),
246
+ result: z.void()
247
+ },
248
+ "sandbox.get": {
249
+ params: z.object({ key: z.string() }),
250
+ result: SandboxRecordSchema.nullable()
251
+ },
252
+ "sandbox.getBySession": {
253
+ params: z.object({ sessionId: z.string() }),
254
+ result: SandboxRecordSchema.nullable()
255
+ },
256
+ "sandbox.set": {
257
+ params: SandboxRecordSchema,
258
+ result: z.void()
259
+ },
260
+ "sandbox.list": {
261
+ params: z.object({
262
+ tags: z.record(z.string(), z.unknown()).optional(),
263
+ order: z.enum([
264
+ "createdAt_asc",
265
+ "createdAt_desc",
266
+ "lastActivityAt_asc",
267
+ "lastActivityAt_desc"
268
+ ]).optional(),
269
+ cursor: z.string().optional(),
270
+ limit: z.number().optional()
271
+ }),
272
+ result: ListResultSchema(SandboxRecordSchema)
273
+ },
274
+ "sandbox.tag.set": {
275
+ params: z.object({
276
+ sandboxId: z.string(),
277
+ tags: z.record(z.string(), z.unknown())
278
+ }),
279
+ result: SandboxRecordSchema
280
+ },
281
+ "command.get": {
282
+ params: z.object({ id: z.string() }),
283
+ result: CommandSchema.nullable()
284
+ },
285
+ "command.set": {
286
+ params: CommandSchema,
287
+ result: CommandSchema
288
+ },
289
+ "command.list": {
290
+ params: z.object({
291
+ sessionId: z.string(),
292
+ includeFinished: z.boolean().optional(),
293
+ cursor: z.string().optional(),
294
+ limit: z.number().optional()
295
+ }),
296
+ result: ListResultSchema(CommandSchema)
297
+ },
298
+ "setup.get": {
299
+ params: z.object({ key: z.string() }),
300
+ result: SetupSnapshotSchema.nullable()
301
+ },
302
+ "setup.set": {
303
+ params: SetupSnapshotSchema,
304
+ result: z.void()
305
+ },
306
+ "setup.acquireLock": {
307
+ params: z.object({
308
+ key: z.string(),
309
+ lockId: z.string(),
310
+ lockTimeoutMs: z.number()
311
+ }),
312
+ result: SetupSnapshotSchema.nullable()
313
+ },
314
+ "sandbox.acquireLock": {
315
+ params: z.object({
316
+ record: SandboxRecordSchema,
317
+ lockTimeoutMs: z.number()
318
+ }),
319
+ result: SandboxRecordSchema.nullable()
320
+ }
321
+ };
322
+ var STORAGE_RPC_METHODS = Object.keys(methods);
323
+
324
+ // src/storage/handler.ts
325
+ async function handleStorageRpc(body, handlers) {
326
+ const { method, params } = body;
327
+ if (!(method in methods)) {
328
+ return {
329
+ error: { code: "METHOD_NOT_FOUND", message: `Unknown method: ${method}` }
330
+ };
331
+ }
332
+ const methodName = method;
333
+ const schema = methods[methodName].params;
334
+ const parsed = schema.safeParse(params);
335
+ if (!parsed.success) {
336
+ return {
337
+ error: {
338
+ code: "INVALID_PARAMS",
339
+ message: parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join(", ")
340
+ }
341
+ };
342
+ }
343
+ try {
344
+ const handler = handlers[methodName];
345
+ const result = await handler(parsed.data);
346
+ return { result };
347
+ } catch (e) {
348
+ return {
349
+ error: {
350
+ code: "INTERNAL_ERROR",
351
+ message: e instanceof Error ? e.message : String(e)
352
+ }
353
+ };
354
+ }
355
+ }
356
+
357
+ export {
358
+ STORAGE_RPC_METHODS,
359
+ handleStorageRpc
360
+ };
361
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3N0b3JhZ2UvcnBjLnRzIiwgIi4uL3NyYy9zdG9yYWdlL2hhbmRsZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmNvbnN0IFZlcmNlbExpZmVjeWNsZUNvbmZpZ1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgcG9sbEludGVydmFsTXM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgc3RvcEFmdGVySW5hY3RpdmVNczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBzbmFwc2hvdElkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGF1dG9TdGFydDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbn0pO1xuXG5jb25zdCBOZXR3b3JrUG9saWN5U2NoZW1hID0gelxuICAudW5pb24oW1xuICAgIHoubGl0ZXJhbChcImFsbG93LWFsbFwiKSxcbiAgICB6LmxpdGVyYWwoXCJkZW55LWFsbFwiKSxcbiAgICB6Lm9iamVjdCh7XG4gICAgICBhbGxvdzogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgc3VibmV0czogelxuICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICBhbGxvdzogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgICAgIGRlbnk6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgICAgfSlcbiAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgfSksXG4gIF0pXG4gIC5vcHRpb25hbCgpO1xuXG5leHBvcnQgdHlwZSBOZXR3b3JrUG9saWN5ID0gei5pbmZlcjx0eXBlb2YgTmV0d29ya1BvbGljeVNjaGVtYT47XG5cbmV4cG9ydCBjb25zdCBTYW5kYm94Q29uZmlnU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbChcInZlcmNlbFwiKSxcbiAgICByZXNvdXJjZXM6IHoub2JqZWN0KHsgdmNwdXM6IHoubnVtYmVyKCkgfSkub3B0aW9uYWwoKSxcbiAgICBwb3J0czogei5hcnJheSh6Lm51bWJlcigpKS5vcHRpb25hbCgpLFxuICAgIGxpZmVjeWNsZTogVmVyY2VsTGlmZWN5Y2xlQ29uZmlnU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgbmV0d29ya1BvbGljeTogTmV0d29ya1BvbGljeVNjaGVtYSxcbiAgfSksXG4gIHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJsb2NhbFwiKSxcbiAgICBwYXRoOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIH0pLFxuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwiY3VzdG9tXCIpLFxuICAgIHVybDogei5zdHJpbmcoKSxcbiAgICBoZWFkZXJzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICB9KSxcbl0pO1xuXG5leHBvcnQgdHlwZSBTYW5kYm94Q29uZmlnID0gei5pbmZlcjx0eXBlb2YgU2FuZGJveENvbmZpZ1NjaGVtYT47XG5cbmNvbnN0IEdlbmVyYXRpb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG1heFN0ZXBzOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRlbXBlcmF0dXJlOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRvcEs6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdG9wUDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBmcmVxdWVuY3lQZW5hbHR5OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHByZXNlbmNlUGVuYWx0eTogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBtYXhPdXRwdXRUb2tlbnM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgaGVhZGVyczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU2Vzc2lvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKSxcbiAgdXBkYXRlZEF0OiB6Lm51bWJlcigpLFxuICBydW5JZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBsYXN0TWVzc2FnZUlkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5udWxsYWJsZSgpLFxuICBzeXN0ZW06IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgbW9kZWw6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgc2FuZGJveElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHNraWxsc0Rpcjogei5hcnJheSh6LnN0cmluZygpKS5udWxsYWJsZSgpLFxuICBob29rVG9rZW46IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgYWN0aXZlVG9vbHM6IHouYXJyYXkoei5zdHJpbmcoKSkubnVsbGFibGUoKSxcbiAgZ2VuZXJhdGlvbjogR2VuZXJhdGlvblNjaGVtYS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFN0ZXBVc2FnZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3RlcEluZGV4OiB6Lm51bWJlcigpLFxuICBtb2RlbDogei5zdHJpbmcoKSxcbiAgaW5wdXRUb2tlbnM6IHoubnVtYmVyKCksXG4gIG91dHB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgdG90YWxUb2tlbnM6IHoubnVtYmVyKCksXG4gIGNhY2hlUmVhZFRva2Vuczogei5udW1iZXIoKSxcbiAgY2FjaGVXcml0ZVRva2Vuczogei5udW1iZXIoKSxcbiAgcmVhc29uaW5nVG9rZW5zOiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBVc2FnZVN1bW1hcnlTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG1vZGVsOiB6LnN0cmluZygpLFxuICBpbnB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgb3V0cHV0VG9rZW5zOiB6Lm51bWJlcigpLFxuICB0b3RhbFRva2Vuczogei5udW1iZXIoKSxcbiAgY2FjaGVSZWFkVG9rZW5zOiB6Lm51bWJlcigpLFxuICBjYWNoZVdyaXRlVG9rZW5zOiB6Lm51bWJlcigpLFxuICByZWFzb25pbmdUb2tlbnM6IHoubnVtYmVyKCksXG4gIHN0ZXBDb3VudDogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgTWVzc2FnZVVzYWdlU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdGVwczogei5hcnJheShTdGVwVXNhZ2VTY2hlbWEpLFxuICBzdW1tYXJ5OiBVc2FnZVN1bW1hcnlTY2hlbWEsXG59KTtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVVzYWdlID0gei5pbmZlcjx0eXBlb2YgTWVzc2FnZVVzYWdlU2NoZW1hPjtcbmV4cG9ydCB0eXBlIFVzYWdlU3VtbWFyeSA9IHouaW5mZXI8dHlwZW9mIFVzYWdlU3VtbWFyeVNjaGVtYT47XG5leHBvcnQgdHlwZSBTdGVwVXNhZ2UgPSB6LmluZmVyPHR5cGVvZiBTdGVwVXNhZ2VTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgTWVzc2FnZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgcm9sZTogei5lbnVtKFtcInVzZXJcIiwgXCJhc3Npc3RhbnRcIiwgXCJzeXN0ZW1cIl0pLFxuICBjcmVhdGVkQXQ6IHoubnVtYmVyKCksXG4gIHN0YXJ0ZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBjb21wbGV0ZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBpbnRlcnJ1cHRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIHVzYWdlOiBNZXNzYWdlVXNhZ2VTY2hlbWEubnVsbGFibGUoKSxcbn0pO1xuXG4vKipcbiAqIFRoZSBgcGFydGAgZmllbGQgY29ycmVzcG9uZHMgdG8gYFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl1gIGZyb20gdGhlIGBhaWAgcGFja2FnZS5cbiAqIFdlIHVzZSBgei51bmtub3duKClgIGJlY2F1c2UgdGhlIGV4YWN0IHNoYXBlIHZhcmllcyBieSBwYXJ0IHR5cGUgKHRleHQsIHRvb2wtY2FsbCxcbiAqIHRvb2wtcmVzdWx0LCBldGMuKSBhbmQgbWF5IGV2b2x2ZSB3aXRoIHRoZSBBSSBTREsuIFRoZSBSUEMgbGF5ZXIganVzdCBwYXNzZXMgaXQgdGhyb3VnaC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBhcnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBtZXNzYWdlSWQ6IHouc3RyaW5nKCksXG4gIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgaW5kZXg6IHoubnVtYmVyKCksXG4gIHBhcnQ6IHoudW5rbm93bigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBDb21tYW5kUmVzdWx0U2NoZW1hID0gei5vYmplY3Qoe1xuICBzdGRvdXQ6IHouc3RyaW5nKCksXG4gIHN0ZGVycjogei5zdHJpbmcoKSxcbiAgZXhpdENvZGU6IHoubnVtYmVyKCksXG4gIGNvbXBsZXRlZEF0OiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBTYW5kYm94UmVjb3JkU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgY29uZmlnOiBTYW5kYm94Q29uZmlnU2NoZW1hLFxuICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkubnVsbGFibGUoKSxcbiAgY3JlYXRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGxhc3RBY3Rpdml0eUF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGFjcXVpcmluZ0xvY2tJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBhY3F1aXJpbmdMb2NrQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgcHJvdmlkZXJNZXRhZGF0YTogelxuICAgIC5kaXNjcmltaW5hdGVkVW5pb24oXCJwcm92aWRlclwiLCBbXG4gICAgICB6Lm9iamVjdCh7XG4gICAgICAgIHByb3ZpZGVyOiB6LmxpdGVyYWwoXCJ2ZXJjZWxcIiksXG4gICAgICAgIHNhbmRib3hJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgICBzbmFwc2hvdElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICB9KSxcbiAgICBdKVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmNvbnN0IENvbW1hbmRCYXNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICBjb21tYW5kOiB6LnN0cmluZygpLFxuICBhcmdzOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gIHN0YXJ0ZWRBdDogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgQ29tbWFuZFNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwic3RhdHVzXCIsIFtcbiAgQ29tbWFuZEJhc2VTY2hlbWEuZXh0ZW5kKHsgc3RhdHVzOiB6LmxpdGVyYWwoXCJydW5uaW5nXCIpIH0pLFxuICBDb21tYW5kQmFzZVNjaGVtYS5leHRlbmQoe1xuICAgIHN0YXR1czogei5saXRlcmFsKFwiY29tcGxldGVkXCIpLFxuICAgIHJlc3VsdDogQ29tbWFuZFJlc3VsdFNjaGVtYSxcbiAgfSksXG4gIENvbW1hbmRCYXNlU2NoZW1hLmV4dGVuZCh7XG4gICAgc3RhdHVzOiB6LmxpdGVyYWwoXCJraWxsZWRcIiksXG4gICAgcmVzdWx0OiBDb21tYW5kUmVzdWx0U2NoZW1hLm9wdGlvbmFsKCksXG4gIH0pLFxuICBDb21tYW5kQmFzZVNjaGVtYS5leHRlbmQoe1xuICAgIHN0YXR1czogei5saXRlcmFsKFwiZmFpbGVkXCIpLFxuICAgIHJlc3VsdDogQ29tbWFuZFJlc3VsdFNjaGVtYSxcbiAgfSksXG5dKTtcblxuZnVuY3Rpb24gTGlzdFJlc3VsdFNjaGVtYTxUIGV4dGVuZHMgei5ab2RUeXBlQW55PihpdGVtU2NoZW1hOiBUKSB7XG4gIHJldHVybiB6Lm9iamVjdCh7XG4gICAgaXRlbXM6IHouYXJyYXkoaXRlbVNjaGVtYSksXG4gICAgbmV4dEN1cnNvcjogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IFNldHVwU25hcHNob3RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGtleTogei5zdHJpbmcoKSxcbiAgc25hcHNob3RJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBjcmVhdGVkQXQ6IHoubnVtYmVyKCksXG4gIGxhc3RVc2VkQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgYWNxdWlyaW5nTG9ja0lkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIGFjcXVpcmluZ0xvY2tBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxufSk7XG5cbmNvbnN0IG1ldGhvZHMgPSB7XG4gIFwic2Vzc2lvbi5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IFNlc3Npb25TY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJzZXNzaW9uLnNldFwiOiB7XG4gICAgcGFyYW1zOiBTZXNzaW9uU2NoZW1hLFxuICAgIHJlc3VsdDogU2Vzc2lvblNjaGVtYSxcbiAgfSxcbiAgXCJzZXNzaW9uLmxpc3RcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgdGFnczogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLm9wdGlvbmFsKCksXG4gICAgICBvcmRlcjogelxuICAgICAgICAuZW51bShbXG4gICAgICAgICAgXCJjcmVhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJjcmVhdGVkQXRfZGVzY1wiLFxuICAgICAgICAgIFwidXBkYXRlZEF0X2FzY1wiLFxuICAgICAgICAgIFwidXBkYXRlZEF0X2Rlc2NcIixcbiAgICAgICAgXSlcbiAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKFNlc3Npb25TY2hlbWEpLFxuICB9LFxuICBcInNlc3Npb24ubGlzdEJ5U2FuZGJveFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzYW5kYm94SWQ6IHouc3RyaW5nKCksXG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICAgIG9yZGVyOiB6XG4gICAgICAgIC5lbnVtKFtcbiAgICAgICAgICBcImNyZWF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcImNyZWF0ZWRBdF9kZXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfZGVzY1wiLFxuICAgICAgICBdKVxuICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoU2Vzc2lvblNjaGVtYSksXG4gIH0sXG4gIFwic2Vzc2lvbi50YWcuc2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IFNlc3Npb25TY2hlbWEsXG4gIH0sXG4gIFwibWVzc2FnZS5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IE1lc3NhZ2VTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJtZXNzYWdlLnNldFwiOiB7XG4gICAgcGFyYW1zOiBNZXNzYWdlU2NoZW1hLFxuICAgIHJlc3VsdDogTWVzc2FnZVNjaGVtYSxcbiAgfSxcbiAgXCJtZXNzYWdlLmxpc3RcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShNZXNzYWdlU2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0Lmxpc3RCeU1lc3NhZ2VcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgbWVzc2FnZUlkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShQYXJ0U2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShQYXJ0U2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0LnNldFwiOiB7XG4gICAgcGFyYW1zOiBQYXJ0U2NoZW1hLFxuICAgIHJlc3VsdDogUGFydFNjaGVtYSxcbiAgfSxcbiAgXCJwYXJ0LmRlbGV0ZVwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogei52b2lkKCksXG4gIH0sXG4gIFwic2FuZGJveC5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBrZXk6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwic2FuZGJveC5nZXRCeVNlc3Npb25cIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBzZXNzaW9uSWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwic2FuZGJveC5zZXRcIjoge1xuICAgIHBhcmFtczogU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgICByZXN1bHQ6IHoudm9pZCgpLFxuICB9LFxuICBcInNhbmRib3gubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICAgIG9yZGVyOiB6XG4gICAgICAgIC5lbnVtKFtcbiAgICAgICAgICBcImNyZWF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcImNyZWF0ZWRBdF9kZXNjXCIsXG4gICAgICAgICAgXCJsYXN0QWN0aXZpdHlBdF9hc2NcIixcbiAgICAgICAgICBcImxhc3RBY3Rpdml0eUF0X2Rlc2NcIixcbiAgICAgICAgXSlcbiAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKFNhbmRib3hSZWNvcmRTY2hlbWEpLFxuICB9LFxuICBcInNhbmRib3gudGFnLnNldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzYW5kYm94SWQ6IHouc3RyaW5nKCksXG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLFxuICB9LFxuICBcImNvbW1hbmQuZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsgaWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBDb21tYW5kU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwiY29tbWFuZC5zZXRcIjoge1xuICAgIHBhcmFtczogQ29tbWFuZFNjaGVtYSxcbiAgICByZXN1bHQ6IENvbW1hbmRTY2hlbWEsXG4gIH0sXG4gIFwiY29tbWFuZC5saXN0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIGluY2x1ZGVGaW5pc2hlZDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoQ29tbWFuZFNjaGVtYSksXG4gIH0sXG4gIFwic2V0dXAuZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsga2V5OiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2V0dXBTbmFwc2hvdFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNldHVwLnNldFwiOiB7XG4gICAgcGFyYW1zOiBTZXR1cFNuYXBzaG90U2NoZW1hLFxuICAgIHJlc3VsdDogei52b2lkKCksXG4gIH0sXG4gIFwic2V0dXAuYWNxdWlyZUxvY2tcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAga2V5OiB6LnN0cmluZygpLFxuICAgICAgbG9ja0lkOiB6LnN0cmluZygpLFxuICAgICAgbG9ja1RpbWVvdXRNczogei5udW1iZXIoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IFNldHVwU25hcHNob3RTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJzYW5kYm94LmFjcXVpcmVMb2NrXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHJlY29yZDogU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgICAgIGxvY2tUaW1lb3V0TXM6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgeyBtZXRob2RzIH07XG5leHBvcnQgdHlwZSBTdG9yYWdlTWV0aG9kcyA9IHR5cGVvZiBtZXRob2RzO1xuZXhwb3J0IHR5cGUgTWV0aG9kTmFtZSA9IGtleW9mIFN0b3JhZ2VNZXRob2RzO1xuZXhwb3J0IGNvbnN0IFNUT1JBR0VfUlBDX01FVEhPRFMgPSBPYmplY3Qua2V5cyhtZXRob2RzKSBhcyBNZXRob2ROYW1lW107XG4iLCAiaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgdHlwZSBNZXRob2ROYW1lLCBtZXRob2RzLCB0eXBlIFN0b3JhZ2VNZXRob2RzIH0gZnJvbSBcIi4vcnBjXCI7XG5cbmV4cG9ydCB0eXBlIEhhbmRsZXJzID0ge1xuICBbSyBpbiBNZXRob2ROYW1lXTogKFxuICAgIHBhcmFtczogei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tLXVtcInBhcmFtc1wiXT5cbiAgKSA9PiBQcm9taXNlPHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbS11bXCJyZXN1bHRcIl0+Pjtcbn07XG5cbmV4cG9ydCB0eXBlIFJwY1JlcXVlc3QgPSB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBwYXJhbXM6IHVua25vd247XG59O1xuXG5leHBvcnQgdHlwZSBScGNTdWNjZXNzUmVzcG9uc2U8VCA9IHVua25vd24+ID0ge1xuICByZXN1bHQ6IFQ7XG59O1xuXG5leHBvcnQgdHlwZSBScGNFcnJvclJlc3BvbnNlID0ge1xuICBlcnJvcjogeyBjb2RlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9O1xufTtcblxuZXhwb3J0IHR5cGUgUnBjUmVzcG9uc2U8VCA9IHVua25vd24+ID0gUnBjU3VjY2Vzc1Jlc3BvbnNlPFQ+IHwgUnBjRXJyb3JSZXNwb25zZTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVN0b3JhZ2VScGMoXG4gIGJvZHk6IFJwY1JlcXVlc3QsXG4gIGhhbmRsZXJzOiBIYW5kbGVyc1xuKTogUHJvbWlzZTxScGNSZXNwb25zZT4ge1xuICBjb25zdCB7IG1ldGhvZCwgcGFyYW1zIH0gPSBib2R5O1xuXG4gIGlmICghKG1ldGhvZCBpbiBtZXRob2RzKSkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogeyBjb2RlOiBcIk1FVEhPRF9OT1RfRk9VTkRcIiwgbWVzc2FnZTogYFVua25vd24gbWV0aG9kOiAke21ldGhvZH1gIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IG1ldGhvZE5hbWUgPSBtZXRob2QgYXMgTWV0aG9kTmFtZTtcbiAgY29uc3Qgc2NoZW1hID0gbWV0aG9kc1ttZXRob2ROYW1lXS5wYXJhbXM7XG4gIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5zYWZlUGFyc2UocGFyYW1zKTtcblxuICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIGNvZGU6IFwiSU5WQUxJRF9QQVJBTVNcIixcbiAgICAgICAgbWVzc2FnZTogcGFyc2VkLmVycm9yLmlzc3Vlc1xuICAgICAgICAgIC5tYXAoKGkpID0+IGAke2kucGF0aC5qb2luKFwiLlwiKX06ICR7aS5tZXNzYWdlfWApXG4gICAgICAgICAgLmpvaW4oXCIsIFwiKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgaGFuZGxlciA9IGhhbmRsZXJzW21ldGhvZE5hbWVdIGFzIChcbiAgICAgIHBhcmFtczogdW5rbm93blxuICAgICkgPT4gUHJvbWlzZTx1bmtub3duPjtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKHBhcnNlZC5kYXRhKTtcbiAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBcIklOVEVSTkFMX0VSUk9SXCIsXG4gICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMsU0FBUztBQUVsQixJQUFNLDhCQUE4QixFQUFFLE9BQU87QUFBQSxFQUMzQyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsU0FBUztBQUFBLEVBQ3BDLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsRUFDekMseUJBQXlCLEVBQUUsT0FBTyxFQUFFLFNBQVM7QUFBQSxFQUM3QyxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVM7QUFBQSxFQUNoQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFNBQVM7QUFDbEMsQ0FBQztBQUVELElBQU0sc0JBQXNCLEVBQ3pCLE1BQU07QUFBQSxFQUNMLEVBQUUsUUFBUSxXQUFXO0FBQUEsRUFDckIsRUFBRSxRQUFRLFVBQVU7QUFBQSxFQUNwQixFQUFFLE9BQU87QUFBQSxJQUNQLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUztBQUFBLElBQ3BDLFNBQVMsRUFDTixPQUFPO0FBQUEsTUFDTixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVM7QUFBQSxNQUNwQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVM7QUFBQSxJQUNyQyxDQUFDLEVBQ0EsU0FBUztBQUFBLEVBQ2QsQ0FBQztBQUNILENBQUMsRUFDQSxTQUFTO0FBSUwsSUFBTSxzQkFBc0IsRUFBRSxtQkFBbUIsUUFBUTtBQUFBLEVBQzlELEVBQUUsT0FBTztBQUFBLElB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QWE7QUFBQSxJQUNYLFFBQVE7QUFBQSxJQUNSLFFBQVEsRUFBRSxLQUFLO0FBQUEsRUFDakI7QUFBQSxFQUNBLHFCQUFxQjtBQUFBLElBQ25CLFFBQVEsRUFBRSxPQUFPO0FBQUEsTUFDZixLQUFLLEVBQUUsT0FBTztBQUFBLE1BQ2QsUUFBUSxFQUFFLE9BQU87QUFBQSxNQUNqQixlQUFlLEVBQUUsT0FBTztBQUFBLElBQzFCLENBQUM7QUFBQSxJQUNELFFBQVEsb0JBQW9CLFNBQVM7QUFBQSxFQUN2QztBQUFBLEVBQ0EsdUJBQXVCO0FBQUEsSUFDckIsUUFBUSxFQUFFLE9BQU87QUFBQSxNQUNmLFFBQVE7QUFBQSxNQUNSLGVBQWUsRUFBRSxPQUFPO0FBQUEsSUFDMUIsQ0FBQztBQUFBLElBQ0QsUUFBUSxvQkFBb0IsU0FBUztBQUFBLEVBQ3ZDO0FBQ0Y7QUFLTyxJQUFNLHNCQUFzQixPQUFPLEtBQUssT0FBTzs7O0FDdFZ0RCxlQUFzQixpQkFDcEIsTUFDQSxVQUNzQjtBQUN0QixRQUFNLEVBQUUsUUFBUSxPQUFPLElBQUk7QUFFM0IsTUFBSSxFQUFFLFVBQVUsVUFBVTtBQUN4QixXQUFPO0FBQUEsTUFDTCxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsU0FBUyxtQkFBbUIsTUFBTSxHQUFHO0FBQUEsSUFDMUU7QUFBQSxFQUNGO0FBRUEsUUFBTSxhQUFhO0FBQ25CLFFBQU0sU0FBUyxRQUFRLFVBQVUsRUFBRTtBQUNuQyxRQUFNLFNBQVMsT0FBTyxVQUFVLE1BQU07QUFFdEMsTUFBSSxDQUFDLE9BQU8sU0FBUztBQUNuQixXQUFPO0FBQUEsTUFDTCxPQUFPO0FBQUEsUUFDTCxNQUFNO0FBQUEsUUFDTixTQUFTLE9BQU8sTUFBTSxPQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsS0FBSyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQzlDLEtBQUssSUFBSTtBQUFBLE1BQ2Q7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE1BQUk7QUFDRixVQUFNLFVBQVUsU0FBUyxVQUFVO0FBR25DLFVBQU0sU0FBUyxNQUFNLFFBQVEsT0FBTyxJQUFJO0FBQ3hDLFdBQU8sRUFBRSxPQUFPO0FBQUEsRUFDbEIsU0FBUyxHQUFHO0FBQ1YsV0FBTztBQUFBLE1BQ0wsT0FBTztBQUFBLFFBQ0wsTUFBTTtBQUFBLFFBQ04sU0FBUyxhQUFhLFFBQVEsRUFBRSxVQUFVLE9BQU8sQ0FBQztBQUFBLE1BQ3BEO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K