cdk-nextjs 0.7.6 → 0.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +3 -3
- package/.jsii.tabl.json +1 -1
- package/README.md +12 -3
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +31 -13
- package/docs/caching-guide.md +11 -1
- package/docs/harness-coverage.md +2 -1
- package/lib/adapter/aws-cache-store.d.ts +214 -3
- package/lib/adapter/aws-cache-store.js +470 -35
- package/lib/adapter/aws-cache-store.test.js +675 -3
- package/lib/adapter/cache-handler.mjs +421 -30
- package/lib/adapter/use-cache-common.d.ts +53 -1
- package/lib/adapter/use-cache-common.js +121 -14
- package/lib/adapter/use-cache-common.test.js +138 -1
- package/lib/adapter/use-cache-default-handler.js +36 -6
- package/lib/adapter/use-cache-default-handler.mjs +525 -42
- package/lib/adapter/use-cache-handlers.test.js +247 -7
- package/lib/adapter/use-cache-remote-handler.js +9 -7
- package/lib/adapter/use-cache-remote-handler.mjs +516 -40
- package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +2 -1
- package/lib/lambdas/post-deploy/prune-revalidation-table.js +35 -13
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +19 -1
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.js +1 -1
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.js +1 -1
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.js +1 -1
- package/lib/root-constructs/nextjs-global-containers.js +1 -1
- package/lib/root-constructs/nextjs-global-functions.js +1 -1
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +1 -1
- package/lib/runtime/core.js +18 -4
- package/lib/runtime/core.test.js +17 -1
- package/lib/runtime/lambda.mjs +16 -3
- package/lib/runtime/server.mjs +16 -3
- package/lib/runtime/tag-manifest.d.ts +15 -0
- package/lib/runtime/tag-manifest.js +24 -0
- package/lib/runtime/tag-manifest.test.d.ts +1 -0
- package/lib/runtime/tag-manifest.test.js +21 -0
- package/package.json +1 -1
|
@@ -130,6 +130,35 @@ async function textOf(result) {
|
|
|
130
130
|
? new TextDecoder().decode(await (0, use_cache_common_1.readStream)(result.value))
|
|
131
131
|
: undefined;
|
|
132
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* Hold every revalidation log `Query` until `release`; `restore` puts the
|
|
135
|
+
* table back as it was.
|
|
136
|
+
*/
|
|
137
|
+
function holdQueries() {
|
|
138
|
+
let release;
|
|
139
|
+
const held = new Promise((resolve) => (release = resolve));
|
|
140
|
+
const send = dynamoSend.getMockImplementation();
|
|
141
|
+
dynamoSend.mockImplementation(async (command) => {
|
|
142
|
+
if (command instanceof client_dynamodb_1.QueryCommand) {
|
|
143
|
+
await held;
|
|
144
|
+
}
|
|
145
|
+
return send(command);
|
|
146
|
+
});
|
|
147
|
+
return {
|
|
148
|
+
release,
|
|
149
|
+
restore: () => {
|
|
150
|
+
release();
|
|
151
|
+
dynamoSend.mockImplementation(send);
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/** Whether `promise` is still pending once pending I/O has had a turn. */
|
|
156
|
+
async function pending(promise) {
|
|
157
|
+
let settled = false;
|
|
158
|
+
void promise.finally(() => (settled = true));
|
|
159
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
160
|
+
return !settled;
|
|
161
|
+
}
|
|
133
162
|
/** A request's worth of what Next.js does before reading an entry. */
|
|
134
163
|
async function read(handler, key) {
|
|
135
164
|
await handler.refreshTags();
|
|
@@ -170,6 +199,27 @@ describe("cacheHandlers.remote", () => {
|
|
|
170
199
|
// A fresh instance reading the stale object from S3 misses too.
|
|
171
200
|
expect(await read(remoteInstance(), "k")).toBeUndefined();
|
|
172
201
|
});
|
|
202
|
+
it("waits for the revalidation log query", async () => {
|
|
203
|
+
const a = remoteInstance();
|
|
204
|
+
const b = remoteInstance(tagManifest(1000));
|
|
205
|
+
await a.set("k", Promise.resolve(entry("old", { timestamp: Date.now() - 1000 })));
|
|
206
|
+
expect(await read(b, "k")).toBe("old");
|
|
207
|
+
await a.updateTags(["posts"]);
|
|
208
|
+
// An entry read from S3 may predate the instance, so its refresh is
|
|
209
|
+
// waited for even while the instance keeps up.
|
|
210
|
+
const now = jest.spyOn(Date, "now").mockReturnValue(Date.now() + 1000);
|
|
211
|
+
const queries = holdQueries();
|
|
212
|
+
try {
|
|
213
|
+
const answer = read(b, "k");
|
|
214
|
+
expect(await pending(answer)).toBe(true);
|
|
215
|
+
queries.release();
|
|
216
|
+
expect(await answer).toBeUndefined();
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
queries.restore();
|
|
220
|
+
now.mockRestore();
|
|
221
|
+
}
|
|
222
|
+
});
|
|
173
223
|
it("serves a profile-revalidated entry stale, for Next.js to regenerate", async () => {
|
|
174
224
|
const a = remoteInstance();
|
|
175
225
|
await a.set("k", Promise.resolve(entry("old", { timestamp: Date.now() - 1000 })));
|
|
@@ -291,7 +341,8 @@ describe("cacheHandlers.default", () => {
|
|
|
291
341
|
const created = { timestamp: Date.now() - 1000 };
|
|
292
342
|
await a.set("k", Promise.resolve(entry("a", created)));
|
|
293
343
|
await b.set("k", Promise.resolve(entry("b", created)));
|
|
294
|
-
//
|
|
344
|
+
// Created before `b` started, so its first read reads the tag's marker,
|
|
345
|
+
// once.
|
|
295
346
|
expect(await read(b, "k")).toBe("b");
|
|
296
347
|
// What Next.js does for `revalidateTag`: `updateTags` on every handler of
|
|
297
348
|
// the instance that ran it - here, `a`.
|
|
@@ -303,6 +354,183 @@ describe("cacheHandlers.default", () => {
|
|
|
303
354
|
expect(dynamoCalls(client_dynamodb_1.QueryCommand)).toBeGreaterThan(0);
|
|
304
355
|
expect(dynamoCalls(client_dynamodb_1.BatchGetItemCommand)).toBe(0);
|
|
305
356
|
});
|
|
357
|
+
it("waits on no marker read to judge an entry stored since the instance started", async () => {
|
|
358
|
+
const a = defaultInstance();
|
|
359
|
+
const bTags = tagManifest();
|
|
360
|
+
const b = defaultInstance(bTags);
|
|
361
|
+
await b.set("k", Promise.resolve(entry("b")));
|
|
362
|
+
// Hold every marker read: Next.js awaits both answers inside the
|
|
363
|
+
// `'use cache'` lookup, and a path the instance has not served before has
|
|
364
|
+
// implicit tags it has never read.
|
|
365
|
+
let release;
|
|
366
|
+
const held = new Promise((resolve) => (release = resolve));
|
|
367
|
+
const send = dynamoSend.getMockImplementation();
|
|
368
|
+
dynamoSend.mockImplementation(async (command) => {
|
|
369
|
+
if (command instanceof client_dynamodb_1.BatchGetItemCommand) {
|
|
370
|
+
await held;
|
|
371
|
+
}
|
|
372
|
+
return send(command);
|
|
373
|
+
});
|
|
374
|
+
try {
|
|
375
|
+
expect(await b.getExpiration(["_N_T_/new-path"])).toBe(Infinity);
|
|
376
|
+
await b.refreshTags();
|
|
377
|
+
expect(await textOf(await b.get("k", ["_N_T_/new-path"]))).toBe("b");
|
|
378
|
+
// Still read, in the background, so the tags join the rolling re-read.
|
|
379
|
+
expect(dynamoCalls(client_dynamodb_1.BatchGetItemCommand)).toBeGreaterThan(0);
|
|
380
|
+
// Another instance's revalidation still reaches it, through the log.
|
|
381
|
+
await a.updateTags(["posts"]);
|
|
382
|
+
await bTags.refresh();
|
|
383
|
+
expect(await read(b, "k")).toBeUndefined();
|
|
384
|
+
}
|
|
385
|
+
finally {
|
|
386
|
+
release();
|
|
387
|
+
dynamoSend.mockImplementation(send);
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
it("reads the implicit tags first for an entry older than the manifest's knowledge", async () => {
|
|
391
|
+
const b = defaultInstance();
|
|
392
|
+
await b.set("k", Promise.resolve(entry("b", { timestamp: Date.now() - 1000 })));
|
|
393
|
+
await b.set("new", Promise.resolve(entry("new")));
|
|
394
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
395
|
+
rows.set("_N_T_/old-path", {
|
|
396
|
+
sk: { S: "_N_T_/old-path" },
|
|
397
|
+
revalidatedAt: { N: String(Date.now() - 500) },
|
|
398
|
+
});
|
|
399
|
+
// Judged per entry: the new one is not held up by the old one.
|
|
400
|
+
dynamoSend.mockClear();
|
|
401
|
+
expect(await textOf(await b.get("new", ["_N_T_/new-path"]))).toBe("new");
|
|
402
|
+
expect(await textOf(await b.get("k", ["_N_T_/old-path"]))).toBeUndefined();
|
|
403
|
+
expect(dynamoCalls(client_dynamodb_1.BatchGetItemCommand)).toBe(2);
|
|
404
|
+
});
|
|
405
|
+
it("does not hold a read for the revalidation log query", async () => {
|
|
406
|
+
const a = defaultInstance();
|
|
407
|
+
const b = defaultInstance(tagManifest(1000));
|
|
408
|
+
const created = { timestamp: Date.now() - 1000 };
|
|
409
|
+
await b.set("k", Promise.resolve(entry("b", created)));
|
|
410
|
+
expect(await read(b, "k")).toBe("b");
|
|
411
|
+
await a.updateTags(["posts"], { expire: 0 });
|
|
412
|
+
// Next.js awaits `refreshTags` inside the `'use cache'` lookup, so a read
|
|
413
|
+
// that waited for the query would leave the static stage of a staged
|
|
414
|
+
// render. This one answers from what the instance already knew.
|
|
415
|
+
const now = jest.spyOn(Date, "now").mockReturnValue(Date.now() + 1000);
|
|
416
|
+
const queries = holdQueries();
|
|
417
|
+
try {
|
|
418
|
+
expect(await read(b, "k")).toBe("b");
|
|
419
|
+
expect(dynamoCalls(client_dynamodb_1.QueryCommand)).toBeGreaterThan(0);
|
|
420
|
+
queries.release();
|
|
421
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
422
|
+
expect(await read(b, "k")).toBeUndefined();
|
|
423
|
+
}
|
|
424
|
+
finally {
|
|
425
|
+
queries.restore();
|
|
426
|
+
now.mockRestore();
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
it("waits for the revalidation log query after the instance sat idle", async () => {
|
|
430
|
+
const a = defaultInstance();
|
|
431
|
+
const b = defaultInstance(tagManifest(1000));
|
|
432
|
+
const created = { timestamp: Date.now() - 1000 };
|
|
433
|
+
await b.set("k", Promise.resolve(entry("b", created)));
|
|
434
|
+
expect(await read(b, "k")).toBe("b");
|
|
435
|
+
await a.updateTags(["posts"], { expire: 0 });
|
|
436
|
+
// No log query for longer than the interval plus the grace, as for a
|
|
437
|
+
// Lambda frozen between invocations.
|
|
438
|
+
const later = Date.now() + 1000 + aws_cache_store_1.TAG_REFRESH_GRACE_MS + 5000;
|
|
439
|
+
const now = jest.spyOn(Date, "now").mockReturnValue(later);
|
|
440
|
+
const queries = holdQueries();
|
|
441
|
+
try {
|
|
442
|
+
// Answered only once the query returns, and then without the entry the
|
|
443
|
+
// other instance revalidated while this one sat idle.
|
|
444
|
+
const answer = read(b, "k");
|
|
445
|
+
expect(await pending(answer)).toBe(true);
|
|
446
|
+
queries.release();
|
|
447
|
+
expect(await answer).toBeUndefined();
|
|
448
|
+
}
|
|
449
|
+
finally {
|
|
450
|
+
queries.restore();
|
|
451
|
+
now.mockRestore();
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
it("does not wait for the revalidation log query, idle, while it holds no entries", async () => {
|
|
455
|
+
const b = defaultInstance(tagManifest(1000));
|
|
456
|
+
// As for the first `'use cache'` call of a process, which creates the
|
|
457
|
+
// handler inside the render: nothing held, so nothing the query could
|
|
458
|
+
// expire.
|
|
459
|
+
const later = Date.now() + 1000 + aws_cache_store_1.TAG_REFRESH_GRACE_MS + 5000;
|
|
460
|
+
const now = jest.spyOn(Date, "now").mockReturnValue(later);
|
|
461
|
+
const queries = holdQueries();
|
|
462
|
+
try {
|
|
463
|
+
expect(await pending(b.refreshTags())).toBe(false);
|
|
464
|
+
expect(dynamoCalls(client_dynamodb_1.QueryCommand)).toBeGreaterThan(0);
|
|
465
|
+
}
|
|
466
|
+
finally {
|
|
467
|
+
queries.restore();
|
|
468
|
+
now.mockRestore();
|
|
469
|
+
}
|
|
470
|
+
});
|
|
471
|
+
it("does not wait for the revalidation log query, idle, while it holds only expired entries", async () => {
|
|
472
|
+
const b = defaultInstance(tagManifest(1000));
|
|
473
|
+
const created = performance.timeOrigin + performance.now() - 5000;
|
|
474
|
+
await b.set("k", Promise.resolve(entry("b", { timestamp: created, revalidate: 1 })));
|
|
475
|
+
const later = Date.now() + 1000 + aws_cache_store_1.TAG_REFRESH_GRACE_MS + 5000;
|
|
476
|
+
const now = jest.spyOn(Date, "now").mockReturnValue(later);
|
|
477
|
+
const queries = holdQueries();
|
|
478
|
+
try {
|
|
479
|
+
// `get` would drop it: nothing the query could expire.
|
|
480
|
+
expect(await pending(b.refreshTags())).toBe(false);
|
|
481
|
+
}
|
|
482
|
+
finally {
|
|
483
|
+
queries.restore();
|
|
484
|
+
now.mockRestore();
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
it("waits for the revalidation log query when told to ask on every check", async () => {
|
|
488
|
+
const a = defaultInstance();
|
|
489
|
+
const b = defaultInstance(tagManifest(0));
|
|
490
|
+
const created = { timestamp: Date.now() - 1000 };
|
|
491
|
+
await b.set("k", Promise.resolve(entry("b", created)));
|
|
492
|
+
expect(await read(b, "k")).toBe("b");
|
|
493
|
+
await a.updateTags(["posts"], { expire: 0 });
|
|
494
|
+
const queries = holdQueries();
|
|
495
|
+
try {
|
|
496
|
+
const answer = read(b, "k");
|
|
497
|
+
expect(await pending(answer)).toBe(true);
|
|
498
|
+
queries.release();
|
|
499
|
+
expect(await answer).toBeUndefined();
|
|
500
|
+
}
|
|
501
|
+
finally {
|
|
502
|
+
queries.restore();
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
it("reads an entry's tags as it stores it", async () => {
|
|
506
|
+
const b = defaultInstance();
|
|
507
|
+
dynamoSend.mockClear();
|
|
508
|
+
await b.set("k", Promise.resolve(entry("b", { tags: ["posts"] })));
|
|
509
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
510
|
+
expect(dynamoCalls(client_dynamodb_1.BatchGetItemCommand)).toBe(1);
|
|
511
|
+
});
|
|
512
|
+
it("expires an entry stored after a revalidation whose expire it outlives", async () => {
|
|
513
|
+
// Revalidated with a profile before `b` started, outside its log's first
|
|
514
|
+
// lookback: the marker alone knows the entry expires.
|
|
515
|
+
const expiredAt = performance.timeOrigin + performance.now() + 60_000;
|
|
516
|
+
rows.set("posts", {
|
|
517
|
+
sk: { S: "posts" },
|
|
518
|
+
staleAt: { N: String(expiredAt - 120_000) },
|
|
519
|
+
expiredAt: { N: String(expiredAt) },
|
|
520
|
+
});
|
|
521
|
+
const b = defaultInstance();
|
|
522
|
+
await b.set("k", Promise.resolve(entry("b")));
|
|
523
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
524
|
+
const clock = jest
|
|
525
|
+
.spyOn(performance, "now")
|
|
526
|
+
.mockReturnValue(expiredAt - performance.timeOrigin + 1);
|
|
527
|
+
try {
|
|
528
|
+
expect(await textOf(await b.get("k", []))).toBeUndefined();
|
|
529
|
+
}
|
|
530
|
+
finally {
|
|
531
|
+
clock.mockRestore();
|
|
532
|
+
}
|
|
533
|
+
});
|
|
306
534
|
it("waits for the refresh interval before re-reading tags", async () => {
|
|
307
535
|
const b = defaultInstance(tagManifest(60_000));
|
|
308
536
|
await b.set("k", Promise.resolve(entry("b", { timestamp: Date.now() - 1000 })));
|
|
@@ -327,13 +555,25 @@ describe("cacheHandlers.default", () => {
|
|
|
327
555
|
const result = await a.get("k", []);
|
|
328
556
|
expect(result?.revalidate).toBe(-1);
|
|
329
557
|
});
|
|
330
|
-
it("
|
|
558
|
+
it("expires an entry by another instance's revalidatePath", async () => {
|
|
331
559
|
const a = defaultInstance();
|
|
332
|
-
const
|
|
560
|
+
const bTags = tagManifest();
|
|
561
|
+
const b = defaultInstance(bTags);
|
|
562
|
+
await b.set("k", Promise.resolve(entry("b")));
|
|
563
|
+
await b.set("other", Promise.resolve(entry("other")));
|
|
333
564
|
await a.updateTags(["_N_T_/blog/layout"]);
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
expect(await b.
|
|
565
|
+
// From the log, as soon as `b` has read it.
|
|
566
|
+
await bTags.refresh();
|
|
567
|
+
expect(await textOf(await b.get("other", ["_N_T_/other"]))).toBe("other");
|
|
568
|
+
expect(await textOf(await b.get("k", ["_N_T_/", "_N_T_/blog/layout"]))).toBeUndefined();
|
|
569
|
+
});
|
|
570
|
+
it("does not expire an entry by an implicit tag marked only stale", async () => {
|
|
571
|
+
const a = defaultInstance();
|
|
572
|
+
const b = defaultInstance();
|
|
573
|
+
await b.set("k", Promise.resolve(entry("b", { timestamp: Date.now() - 1000 })));
|
|
574
|
+
await a.updateTags(["_N_T_/blog"], { expire: 3600 });
|
|
575
|
+
const result = await b.get("k", ["_N_T_/blog"]);
|
|
576
|
+
expect(result?.revalidate).toBe(900);
|
|
337
577
|
});
|
|
338
578
|
it("stores nothing from a stream that errors, and releases the pending get", async () => {
|
|
339
579
|
const a = defaultInstance();
|
|
@@ -346,4 +586,4 @@ describe("cacheHandlers.default", () => {
|
|
|
346
586
|
expect(await read(a, "k")).toBeUndefined();
|
|
347
587
|
});
|
|
348
588
|
});
|
|
349
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNhY2hlLWhhbmRsZXJzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlci91c2UtY2FjaGUtaGFuZGxlcnMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQUFzRDtBQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBRXRDLDhEQU9rQztBQUNsQyxrREFLNEI7QUFLNUIsdURBSzJCO0FBQzNCLHlEQUFnRDtBQUNoRCwyRUFBMkU7QUFDM0UseUVBQXlFO0FBRXpFLGdFQUFnRTtBQUNoRSxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQWdCLEVBQUUsSUFBYSxFQUFFLEVBQUU7SUFDdkQsTUFBTSxJQUFJLEdBQUcsSUFBaUIsQ0FBQztJQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0FBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQWdCLEVBQUUsRUFBRTtJQUNoRCxJQUFJLE9BQU8sWUFBWSw0QkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSw0QkFBZ0IsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELElBQUksT0FBTyxZQUFZLDRCQUFnQixF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QzFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7UUFDMUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx3RUFBd0UsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN0RixNQUFNLENBQUMsR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLGNBQWMsQ0FBYTtZQUM3QyxLQUFLLENBQUMsVUFBVTtnQkFDZCxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7WUFDL0MsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1zM1wiKTtcbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiKTtcblxuaW1wb3J0IHtcbiAgQXR0cmlidXRlVmFsdWUsXG4gIEJhdGNoR2V0SXRlbUNvbW1hbmQsXG4gIER5bmFtb0RCQ2xpZW50LFxuICBQdXRJdGVtQ29tbWFuZCxcbiAgUXVlcnlDb21tYW5kLFxuICBVcGRhdGVJdGVtQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiO1xuaW1wb3J0IHtcbiAgR2V0T2JqZWN0Q29tbWFuZCxcbiAgTm9TdWNoS2V5LFxuICBQdXRPYmplY3RDb21tYW5kLFxuICBTM0NsaWVudCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuaW1wb3J0IHR5cGUge1xuICBDYWNoZUVudHJ5LFxuICBDYWNoZUhhbmRsZXIsXG59IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL2xpYi9jYWNoZS1oYW5kbGVycy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQ2FjaGVCdWNrZXQsXG4gIFJldmFsaWRhdGlvbkxvZyxcbiAgVGFnTWFya2VyVGFibGUsXG4gIFRyYWNrZWRUYWdNYXJrZXJzLFxufSBmcm9tIFwiLi9hd3MtY2FjaGUtc3RvcmVcIjtcbmltcG9ydCB7IHJlYWRTdHJlYW0gfSBmcm9tIFwiLi91c2UtY2FjaGUtY29tbW9uXCI7XG5pbXBvcnQgeyBjcmVhdGVEZWZhdWx0VXNlQ2FjaGVIYW5kbGVyIH0gZnJvbSBcIi4vdXNlLWNhY2hlLWRlZmF1bHQtaGFuZGxlclwiO1xuaW1wb3J0IHsgY3JlYXRlUmVtb3RlVXNlQ2FjaGVIYW5kbGVyIH0gZnJvbSBcIi4vdXNlLWNhY2hlLXJlbW90ZS1oYW5kbGVyXCI7XG5cbi8qKiBUaGUgaW5wdXQgYW4gYXV0b21vY2tlZCBTREsgY29tbWFuZCB3YXMgY29uc3RydWN0ZWQgd2l0aC4gKi9cbmNvbnN0IGNvbW1hbmRJbnB1dCA9IChjb21tYW5kOiB1bmtub3duLCB0eXBlOiB1bmtub3duKSA9PiB7XG4gIGNvbnN0IG1vY2sgPSB0eXBlIGFzIGplc3QuTW9jaztcbiAgcmV0dXJuIG1vY2subW9jay5jYWxsc1ttb2NrLm1vY2suaW5zdGFuY2VzLmluZGV4T2YoY29tbWFuZCldWzBdO1xufTtcblxuLyoqXG4gKiBTMyBhcyBhIG1hcC4gRXZlcnkgXCJpbnN0YW5jZVwiIGluIHRoZXNlIHRlc3RzIGlzIGEgc2VwYXJhdGUgaGFuZGxlciBvdmVyIHRoZVxuICogc2FtZSBtYXAsIHdoaWNoIGlzIHdoYXQgdGhlIGNhY2hlIGJ1Y2tldCBpcyB0byBzZXBhcmF0ZSBMYW1iZGEgaW5zdGFuY2VzLlxuICovXG5jb25zdCBvYmplY3RzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbmNvbnN0IHMzU2VuZCA9IGplc3QuZm4oYXN5bmMgKGNvbW1hbmQ6IHVua25vd24pID0+IHtcbiAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBQdXRPYmplY3RDb21tYW5kKSB7XG4gICAgY29uc3QgeyBLZXksIEJvZHkgfSA9IGNvbW1hbmRJbnB1dChjb21tYW5kLCBQdXRPYmplY3RDb21tYW5kKTtcbiAgICBvYmplY3RzLnNldChLZXksIEJvZHkpO1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIEdldE9iamVjdENvbW1hbmQpIHtcbiAgICBjb25zdCB7IEtleSB9ID0gY29tbWFuZElucHV0KGNvbW1hbmQsIEdldE9iamVjdENvbW1hbmQpO1xuICAgIGNvbnN0IGJvZHkgPSBvYmplY3RzLmdldChLZXkpO1xuICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBOb1N1Y2hLZXkoeyBtZXNzYWdlOiBcIk5vU3VjaEtleVwiLCAkbWV0YWRhdGE6IHt9IH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgQm9keTogeyB0cmFuc2Zvcm1Ub1N0cmluZzogYXN5bmMgKCkgPT4gYm9keSB9LFxuICAgICAgQ29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxuICAgIH07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwidW5leHBlY3RlZCBTMyBjb21tYW5kXCIpO1xufSk7XG5cbi8qKiBUaGUgcmV2YWxpZGF0aW9uIHRhYmxlJ3MgbWFya2VyIHJvd3MsIGFzIGEgbWFwLiAqL1xuY29uc3Qgcm93cyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT4+KCk7XG4vKiogSXRzIHJldmFsaWRhdGlvbiBsb2cgcm93cywgYnkgc29ydCBrZXkuICovXG5jb25zdCBsb2dSb3dzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPj4oKTtcbmNvbnN0IGR5bmFtb1NlbmQgPSBqZXN0LmZuKGFzeW5jIChjb21tYW5kOiB1bmtub3duKSA9PiB7XG4gIGlmIChjb21tYW5kIGluc3RhbmNlb2YgVXBkYXRlSXRlbUNvbW1hbmQpIHtcbiAgICBjb25zdCB7IEtleSwgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcyB9ID0gY29tbWFuZElucHV0KFxuICAgICAgY29tbWFuZCxcbiAgICAgIFVwZGF0ZUl0ZW1Db21tYW5kLFxuICAgICk7XG4gICAgY29uc3Qgcm93OiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT4gPSByb3dzLmdldChLZXkuc2suUykgPz8ge1xuICAgICAgc2s6IEtleS5zayxcbiAgICB9O1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzKSkge1xuICAgICAgcm93W25hbWUuc2xpY2UoMSldID0gdmFsdWUgYXMgQXR0cmlidXRlVmFsdWU7XG4gICAgfVxuICAgIHJvd3Muc2V0KEtleS5zay5TLCByb3cpO1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIEJhdGNoR2V0SXRlbUNvbW1hbmQpIHtcbiAgICBjb25zdCB7IFJlcXVlc3RJdGVtcyB9ID0gY29tbWFuZElucHV0KGNvbW1hbmQsIEJhdGNoR2V0SXRlbUNvbW1hbmQpO1xuICAgIGNvbnN0IFtbdGFibGUsIHsgS2V5cyB9XV0gPSBPYmplY3QuZW50cmllcyhSZXF1ZXN0SXRlbXMpIGFzIFtcbiAgICAgIHN0cmluZyxcbiAgICAgIHsgS2V5czogeyBzazogeyBTOiBzdHJpbmcgfSB9W10gfSxcbiAgICBdW107XG4gICAgcmV0dXJuIHtcbiAgICAgIFJlc3BvbnNlczoge1xuICAgICAgICBbdGFibGVdOiBLZXlzLm1hcCgoeyBzayB9KSA9PiByb3dzLmdldChzay5TKSkuZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIGlmIChjb21tYW5kIGluc3RhbmNlb2YgUHV0SXRlbUNvbW1hbmQpIHtcbiAgICBjb25zdCB7IEl0ZW0gfSA9IGNvbW1hbmRJbnB1dChjb21tYW5kLCBQdXRJdGVtQ29tbWFuZCk7XG4gICAgbG9nUm93cy5zZXQoSXRlbS5zay5TLCBJdGVtKTtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBRdWVyeUNvbW1hbmQpIHtcbiAgICBjb25zdCB7IEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXMgfSA9IGNvbW1hbmRJbnB1dChjb21tYW5kLCBRdWVyeUNvbW1hbmQpO1xuICAgIGNvbnN0IHNpbmNlID0gRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlc1tcIjpzaW5jZVwiXS5TIGFzIHN0cmluZztcbiAgICByZXR1cm4ge1xuICAgICAgSXRlbXM6IEFycmF5LmZyb20obG9nUm93cy5rZXlzKCkpXG4gICAgICAgIC5maWx0ZXIoKHNrKSA9PiBzayA+PSBzaW5jZSlcbiAgICAgICAgLnNvcnQoKVxuICAgICAgICAubWFwKChzaykgPT4gbG9nUm93cy5nZXQoc2spKSxcbiAgICB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcInVuZXhwZWN0ZWQgRHluYW1vREIgY29tbWFuZFwiKTtcbn0pO1xuXG4oUzNDbGllbnQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHsgc2VuZDogczNTZW5kIH0pKTtcbihEeW5hbW9EQkNsaWVudCBhcyBqZXN0Lk1vY2spLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiAoeyBzZW5kOiBkeW5hbW9TZW5kIH0pKTtcblxuY29uc3QgczNDYWxscyA9ICh0eXBlOiB1bmtub3duKSA9PlxuICBzM1NlbmQubW9jay5jYWxscy5maWx0ZXIoKFtjb21tYW5kXSkgPT4gY29tbWFuZCBpbnN0YW5jZW9mICh0eXBlIGFzIG5ldmVyKSlcbiAgICAubGVuZ3RoO1xuY29uc3QgZHluYW1vQ2FsbHMgPSAodHlwZTogdW5rbm93bikgPT5cbiAgZHluYW1vU2VuZC5tb2NrLmNhbGxzLmZpbHRlcihcbiAgICAoW2NvbW1hbmRdKSA9PiBjb21tYW5kIGluc3RhbmNlb2YgKHR5cGUgYXMgbmV2ZXIpLFxuICApLmxlbmd0aDtcblxuLyoqIE9uZSBjb21wdXRlIGluc3RhbmNlJ3MgdmlldyBvZiB0aGUgc2hhcmVkIHRhYmxlLiAqL1xuZnVuY3Rpb24gdGFnTWFuaWZlc3QocmVmcmVzaEludGVydmFsTXMgPSAwKSB7XG4gIHJldHVybiBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgIG1hcmtlcnM6IG5ldyBUYWdNYXJrZXJUYWJsZShuZXcgRHluYW1vREJDbGllbnQoe30pLCBcInRhYmxlXCIsIFwiYnVpbGRcIiksXG4gICAgbG9nOiBuZXcgUmV2YWxpZGF0aW9uTG9nKG5ldyBEeW5hbW9EQkNsaWVudCh7fSksIFwidGFibGVcIiwgXCJidWlsZFwiKSxcbiAgICByZWZyZXNoSW50ZXJ2YWxNcyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1Y2tldCgpIHtcbiAgcmV0dXJuIG5ldyBDYWNoZUJ1Y2tldChuZXcgUzNDbGllbnQoe30pLCBcImJ1Y2tldFwiKTtcbn1cblxuZnVuY3Rpb24gcmVtb3RlSW5zdGFuY2UodGFncyA9IHRhZ01hbmlmZXN0KCkpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlbW90ZVVzZUNhY2hlSGFuZGxlcih7XG4gICAgYnVja2V0OiBidWNrZXQoKSxcbiAgICBidWlsZElkOiBcImJ1aWxkXCIsXG4gICAgdGFncyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRJbnN0YW5jZSh0YWdzID0gdGFnTWFuaWZlc3QoKSkge1xuICByZXR1cm4gY3JlYXRlRGVmYXVsdFVzZUNhY2hlSGFuZGxlcih7IHRhZ3MgfSk7XG59XG5cbmZ1bmN0aW9uIHN0cmVhbU9mKHRleHQ6IHN0cmluZyk6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgY29udHJvbGxlci5lbnF1ZXVlKG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0ZXh0KSk7XG4gICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVudHJ5KHRleHQ6IHN0cmluZywgZXh0cmE6IFBhcnRpYWw8Q2FjaGVFbnRyeT4gPSB7fSk6IENhY2hlRW50cnkge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiBzdHJlYW1PZih0ZXh0KSxcbiAgICB0YWdzOiBbXCJwb3N0c1wiXSxcbiAgICBzdGFsZTogMzAwLFxuICAgIHRpbWVzdGFtcDogcGVyZm9ybWFuY2UudGltZU9yaWdpbiArIHBlcmZvcm1hbmNlLm5vdygpLFxuICAgIGV4cGlyZTogMzYwMCxcbiAgICByZXZhbGlkYXRlOiA5MDAsXG4gICAgLi4uZXh0cmEsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRleHRPZihyZXN1bHQ6IENhY2hlRW50cnkgfCB1bmRlZmluZWQpIHtcbiAgcmV0dXJuIHJlc3VsdFxuICAgID8gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGF3YWl0IHJlYWRTdHJlYW0ocmVzdWx0LnZhbHVlKSlcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIEEgcmVxdWVzdCdzIHdvcnRoIG9mIHdoYXQgTmV4dC5qcyBkb2VzIGJlZm9yZSByZWFkaW5nIGFuIGVudHJ5LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZChoYW5kbGVyOiBDYWNoZUhhbmRsZXIsIGtleTogc3RyaW5nKSB7XG4gIGF3YWl0IGhhbmRsZXIucmVmcmVzaFRhZ3MoKTtcbiAgcmV0dXJuIHRleHRPZihhd2FpdCBoYW5kbGVyLmdldChrZXksIFtdKSk7XG59XG5cbmJlZm9yZUVhY2goKCkgPT4ge1xuICBvYmplY3RzLmNsZWFyKCk7XG4gIHJvd3MuY2xlYXIoKTtcbiAgbG9nUm93cy5jbGVhcigpO1xufSk7XG5cbmRlc2NyaWJlKFwiY2FjaGVIYW5kbGVycy5yZW1vdGVcIiwgKCkgPT4ge1xuICBpdChcImFuc3dlcnMgZXZlcnkgaW5zdGFuY2UgZnJvbSB0aGUgZW50cnkgYW55IG9uZSBvZiB0aGVtIHN0b3JlZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHJlbW90ZUluc3RhbmNlKCk7XG4gICAgY29uc3QgYiA9IHJlbW90ZUluc3RhbmNlKCk7XG5cbiAgICBhd2FpdCBhLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwiZnJvbS1hXCIpKSk7XG5cbiAgICBleHBlY3QoYXdhaXQgcmVhZChiLCBcImtcIikpLnRvQmUoXCJmcm9tLWFcIik7XG4gICAgZXhwZWN0KEFycmF5LmZyb20ob2JqZWN0cy5rZXlzKCkpKS50b0VxdWFsKFtcbiAgICAgIGV4cGVjdC5zdHJpbmdNYXRjaGluZygvXmJ1aWxkXFwvX3VzZS1jYWNoZVxcL1swLTlhLWZdezY0fVxcLmVudHJ5JC8pLFxuICAgIF0pO1xuICB9KTtcblxuICBpdChcInNlcnZlcyBhIHJlcGVhdCByZWFkIGZyb20gbWVtb3J5XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiID0gcmVtb3RlSW5zdGFuY2UoKTtcbiAgICBhd2FpdCByZW1vdGVJbnN0YW5jZSgpLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwidlwiKSkpO1xuICAgIGF3YWl0IHJlYWQoYiwgXCJrXCIpO1xuICAgIHMzU2VuZC5tb2NrQ2xlYXIoKTtcbiAgICBleHBlY3QoYXdhaXQgcmVhZChiLCBcImtcIikpLnRvQmUoXCJ2XCIpO1xuICAgIGV4cGVjdChzM0NhbGxzKEdldE9iamVjdENvbW1hbmQpKS50b0JlKDApO1xuICB9KTtcblxuICBpdChcImV4cGlyZXMgdGhlIGVudHJ5IG9uIGV2ZXJ5IGluc3RhbmNlIHdoZW4gYSB0YWcgaXMgcmV2YWxpZGF0ZWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSByZW1vdGVJbnN0YW5jZSgpO1xuICAgIGNvbnN0IGIgPSByZW1vdGVJbnN0YW5jZSgpO1xuICAgIGF3YWl0IGEuc2V0KFxuICAgICAgXCJrXCIsXG4gICAgICBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJvbGRcIiwgeyB0aW1lc3RhbXA6IERhdGUubm93KCkgLSAxMDAwIH0pKSxcbiAgICApO1xuICAgIGV4cGVjdChhd2FpdCByZWFkKGEsIFwia1wiKSkudG9CZShcIm9sZFwiKTtcbiAgICBleHBlY3QoYXdhaXQgcmVhZChiLCBcImtcIikpLnRvQmUoXCJvbGRcIik7XG5cbiAgICBhd2FpdCBhLnVwZGF0ZVRhZ3MoW1wicG9zdHNcIl0pO1xuXG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYSwgXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYiwgXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgLy8gQSBmcmVzaCBpbnN0YW5jZSByZWFkaW5nIHRoZSBzdGFsZSBvYmplY3QgZnJvbSBTMyBtaXNzZXMgdG9vLlxuICAgIGV4cGVjdChhd2FpdCByZWFkKHJlbW90ZUluc3RhbmNlKCksIFwia1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICB9KTtcblxuICBpdChcInNlcnZlcyBhIHByb2ZpbGUtcmV2YWxpZGF0ZWQgZW50cnkgc3RhbGUsIGZvciBOZXh0LmpzIHRvIHJlZ2VuZXJhdGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSByZW1vdGVJbnN0YW5jZSgpO1xuICAgIGF3YWl0IGEuc2V0KFxuICAgICAgXCJrXCIsXG4gICAgICBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJvbGRcIiwgeyB0aW1lc3RhbXA6IERhdGUubm93KCkgLSAxMDAwIH0pKSxcbiAgICApO1xuICAgIGF3YWl0IGEudXBkYXRlVGFncyhbXCJwb3N0c1wiXSwgeyBleHBpcmU6IDM2MDAgfSk7XG5cbiAgICBjb25zdCBiID0gcmVtb3RlSW5zdGFuY2UoKTtcbiAgICBhd2FpdCBiLnJlZnJlc2hUYWdzKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYi5nZXQoXCJrXCIsIFtdKTtcbiAgICBleHBlY3QocmVzdWx0Py5yZXZhbGlkYXRlKS50b0JlKC0xKTtcbiAgICBleHBlY3QoYXdhaXQgdGV4dE9mKHJlc3VsdCkpLnRvQmUoXCJvbGRcIik7XG4gIH0pO1xuXG4gIGl0KFwicGlja3MgdXAgYW5vdGhlciBpbnN0YW5jZSdzIHJlZ2VuZXJhdGVkIGVudHJ5IG9uY2UgaXRzIG93biBpcyBzdGFsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHJlbW90ZUluc3RhbmNlKCk7XG4gICAgY29uc3QgYiA9IHJlbW90ZUluc3RhbmNlKCk7XG4gICAgY29uc3QgcGFzdCA9IHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSAtIDEwXzAwMDtcbiAgICBhd2FpdCBhLnNldChcbiAgICAgIFwia1wiLFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwidjFcIiwgeyB0aW1lc3RhbXA6IHBhc3QsIHJldmFsaWRhdGU6IDEgfSkpLFxuICAgICk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYiwgXCJrXCIpKS50b0JlKFwidjFcIik7XG5cbiAgICBhd2FpdCBhLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwidjJcIikpKTtcbiAgICAvLyBgYmAncyBtZW1vcnkgY29weSBpcyBwYXN0IGByZXZhbGlkYXRlYCwgc28gUzMgaXMgYXNrZWQgZm9yIGEgbmV3ZXIgb25lLlxuICAgIGV4cGVjdChhd2FpdCByZWFkKGIsIFwia1wiKSkudG9CZShcInYyXCIpO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IHNlcnZlIGFuIGVudHJ5IHBhc3QgaXRzIGV4cGlyZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGFzdCA9IHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSAtIDEwXzAwMDtcbiAgICBhd2FpdCByZW1vdGVJbnN0YW5jZSgpLnNldChcbiAgICAgIFwia1wiLFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBlbnRyeShcInZcIiwgeyB0aW1lc3RhbXA6IHBhc3QsIHJldmFsaWRhdGU6IDEsIGV4cGlyZTogMiB9KSxcbiAgICAgICksXG4gICAgKTtcbiAgICBleHBlY3QoYXdhaXQgcmVhZChyZW1vdGVJbnN0YW5jZSgpLCBcImtcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoXCJtYWtlcyBhIGdldCB3YWl0IGZvciBhIHBlbmRpbmcgc2V0IG9mIHRoZSBzYW1lIGtleVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHJlbW90ZUluc3RhbmNlKCk7XG4gICAgbGV0IHJlc29sdmU6ICh2YWx1ZTogQ2FjaGVFbnRyeSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIGNvbnN0IHNldCA9IGEuc2V0KFwia1wiLCBuZXcgUHJvbWlzZSgocikgPT4gKHJlc29sdmUgPSByKSkpO1xuICAgIGNvbnN0IGdldCA9IGEuZ2V0KFwia1wiLCBbXSk7XG4gICAgcmVzb2x2ZShlbnRyeShcInZcIikpO1xuICAgIGV4cGVjdChhd2FpdCB0ZXh0T2YoYXdhaXQgZ2V0KSkudG9CZShcInZcIik7XG4gICAgYXdhaXQgc2V0O1xuICB9KTtcblxuICBpdChcInN0b3JlcyBub3RoaW5nIGZyb20gYSBzdHJlYW0gdGhhdCBlcnJvcnNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSByZW1vdGVJbnN0YW5jZSgpO1xuICAgIGNvbnN0IGZhaWxpbmcgPSBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkoWzFdKSk7XG4gICAgICAgIGNvbnRyb2xsZXIuZXJyb3IobmV3IEVycm9yKFwicmVuZGVyIGZhaWxlZFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGF3YWl0IGEuc2V0KFwia1wiLCBQcm9taXNlLnJlc29sdmUoeyAuLi5lbnRyeShcIlwiKSwgdmFsdWU6IGZhaWxpbmcgfSkpO1xuICAgIGV4cGVjdChvYmplY3RzLnNpemUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYSwgXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3Qgc3RvcmUgYW4gZW50cnkgTmV4dC5qcyByZWdlbmVyYXRlcyBvbiBldmVyeSByZWFkXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gcmVtb3RlSW5zdGFuY2UoKTtcbiAgICBhd2FpdCBhLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwidlwiLCB7IGV4cGlyZTogMCB9KSkpO1xuICAgIGV4cGVjdChvYmplY3RzLnNpemUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYSwgXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KFwibmV2ZXIgc2VydmVzIGFuIG9iamVjdCBzdG9yZWQgZm9yIGFub3RoZXIga2V5XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gcmVtb3RlSW5zdGFuY2UoKTtcbiAgICBhd2FpdCBhLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwidlwiKSkpO1xuICAgIGNvbnN0IFtrZXldID0gQXJyYXkuZnJvbShvYmplY3RzLmtleXMoKSk7XG4gICAgb2JqZWN0cy5zZXQoa2V5LCBvYmplY3RzLmdldChrZXkpIS5yZXBsYWNlKCdcImtleVwiOlwia1wiJywgJ1wia2V5XCI6XCJvdGhlclwiJykpO1xuICAgIGNvbnN0IHdhcm4gPSBqZXN0LnNweU9uKGNvbnNvbGUsIFwid2FyblwiKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pO1xuICAgIGV4cGVjdChhd2FpdCByZWFkKHJlbW90ZUluc3RhbmNlKCksIFwia1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIHdhcm4ubW9ja1Jlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyB3b3JraW5nIGZyb20gbWVtb3J5IHdoZW4gUzMgZmFpbHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVycm9yID0gamVzdC5zcHlPbihjb25zb2xlLCBcImVycm9yXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG4gICAgczNTZW5kLm1vY2tSZWplY3RlZFZhbHVlT25jZShuZXcgRXJyb3IoXCJTbG93RG93blwiKSk7XG4gICAgY29uc3QgYSA9IHJlbW90ZUluc3RhbmNlKCk7XG4gICAgYXdhaXQgYS5zZXQoXCJrXCIsIFByb21pc2UucmVzb2x2ZShlbnRyeShcInZcIikpKTtcbiAgICBleHBlY3QoYXdhaXQgcmVhZChhLCBcImtcIikpLnRvQmUoXCJ2XCIpO1xuICAgIHMzU2VuZC5tb2NrUmVqZWN0ZWRWYWx1ZU9uY2UobmV3IEVycm9yKFwiU2xvd0Rvd25cIikpO1xuICAgIGV4cGVjdChhd2FpdCByZWFkKHJlbW90ZUluc3RhbmNlKCksIFwia1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIGVycm9yLm1vY2tSZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KFwiaXMgbWVtb3J5LW9ubHkgd2l0aG91dCBhIGJ1Y2tldFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IGNyZWF0ZVJlbW90ZVVzZUNhY2hlSGFuZGxlcih7XG4gICAgICBidWNrZXQ6IG51bGwsXG4gICAgICBidWlsZElkOiBcImJ1aWxkXCIsXG4gICAgICB0YWdzOiB0YWdNYW5pZmVzdCgpLFxuICAgIH0pO1xuICAgIGF3YWl0IGEuc2V0KFwia1wiLCBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJ2XCIpKSk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYSwgXCJrXCIpKS50b0JlKFwidlwiKTtcbiAgICBleHBlY3QoczNTZW5kKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBpdChcInJlYWRzIGFuIFMzIGVudHJ5J3MgdGFncyBiZWZvcmUgdHJ1c3RpbmcgaXQsIG9uY2UgcGVyIGluc3RhbmNlXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZW1vdGVJbnN0YW5jZSgpLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwidlwiKSkpO1xuICAgIGNvbnN0IGIgPSByZW1vdGVJbnN0YW5jZSh0YWdNYW5pZmVzdCg2MF8wMDApKTtcbiAgICBkeW5hbW9TZW5kLm1vY2tDbGVhcigpO1xuICAgIGF3YWl0IHJlYWQoYiwgXCJrXCIpO1xuICAgIGF3YWl0IHJlYWQoYiwgXCJrXCIpO1xuICAgIGV4cGVjdChkeW5hbW9DYWxscyhCYXRjaEdldEl0ZW1Db21tYW5kKSkudG9CZSgxKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJjYWNoZUhhbmRsZXJzLnJlbW90ZSwgYWNyb3NzIGEgcmV2YWxpZGF0aW9uIGJlZm9yZSBhbiBpbnN0YW5jZSBzdGFydGVkXCIsICgpID0+IHtcbiAgYWZ0ZXJFYWNoKCgpID0+IGplc3QucmVzdG9yZUFsbE1vY2tzKCkpO1xuXG4gIC8vIEEgc3RvcmVzIEsxOyBDIHJldmFsaWRhdGVzIGl0cyB0YWc7IEIgc3RhcnRzIGFmdGVyIEMncyBsb2cgcm93IGlzIGJlaGluZFxuICAvLyBpdHMgY3Vyc29yLCBzdG9yZXMgSzIgd2l0aCB0aGUgc2FtZSB0YWcsIHRoZW4gcmVhZHMgSzEgZnJvbSBTMy5cbiAgaXQoXCJkb2VzIG5vdCBzZXJ2ZSBhbiBvbGRlciBTMyBlbnRyeSBhcyBmcmVzaCBhZnRlciBzdG9yaW5nIGEgbmV3ZXIgb25lIHdpdGggaXRzIHRhZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHJlbW90ZUluc3RhbmNlKCk7XG4gICAgYXdhaXQgYS5zZXQoXG4gICAgICBcImsxXCIsXG4gICAgICBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJiZWZvcmVcIiwgeyB0aW1lc3RhbXA6IERhdGUubm93KCkgLSAxMDAwIH0pKSxcbiAgICApO1xuICAgIGF3YWl0IHJlbW90ZUluc3RhbmNlKCkudXBkYXRlVGFncyhbXCJwb3N0c1wiXSwgeyBleHBpcmU6IDAgfSk7XG5cbiAgICBjb25zdCBsYXRlciA9IERhdGUubm93KCkgKyAxMF8wMDA7XG4gICAgamVzdC5zcHlPbihEYXRlLCBcIm5vd1wiKS5tb2NrUmV0dXJuVmFsdWUobGF0ZXIpO1xuICAgIGNvbnN0IGIgPSByZW1vdGVJbnN0YW5jZSgpO1xuICAgIGF3YWl0IGIuc2V0KFwiazJcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwiYWZ0ZXJcIiwgeyB0aW1lc3RhbXA6IGxhdGVyIH0pKSk7XG5cbiAgICBleHBlY3QoYXdhaXQgcmVhZChiLCBcImsxXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYiwgXCJrMlwiKSkudG9CZShcImFmdGVyXCIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcImNhY2hlSGFuZGxlcnMuZGVmYXVsdFwiLCAoKSA9PiB7XG4gIGl0KFwia2VlcHMgZW50cmllcyBpbiBlYWNoIGluc3RhbmNlJ3MgbWVtb3J5XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gZGVmYXVsdEluc3RhbmNlKCk7XG4gICAgY29uc3QgYiA9IGRlZmF1bHRJbnN0YW5jZSgpO1xuICAgIGF3YWl0IGEuc2V0KFwia1wiLCBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJ2XCIpKSk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYSwgXCJrXCIpKS50b0JlKFwidlwiKTtcbiAgICBleHBlY3QoYXdhaXQgcmVhZChiLCBcImtcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QoczNTZW5kKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBpdChcImV4cGlyZXMgYW4gZW50cnkgb24gYW4gaW5zdGFuY2UgdGhhdCBkaWQgbm90IHJ1biByZXZhbGlkYXRlVGFnXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gZGVmYXVsdEluc3RhbmNlKCk7XG4gICAgY29uc3QgYiA9IGRlZmF1bHRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IGNyZWF0ZWQgPSB7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSAtIDEwMDAgfTtcbiAgICBhd2FpdCBhLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwiYVwiLCBjcmVhdGVkKSkpO1xuICAgIGF3YWl0IGIuc2V0KFwia1wiLCBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJiXCIsIGNyZWF0ZWQpKSk7XG4gICAgLy8gSXRzIGZpcnN0IHJlYWQgb2YgaXRzIG93biBlbnRyeSByZWFkcyB0aGUgdGFnJ3MgbWFya2VyLCBvbmNlLlxuICAgIGV4cGVjdChhd2FpdCByZWFkKGIsIFwia1wiKSkudG9CZShcImJcIik7XG5cbiAgICAvLyBXaGF0IE5leHQuanMgZG9lcyBmb3IgYHJldmFsaWRhdGVUYWdgOiBgdXBkYXRlVGFnc2Agb24gZXZlcnkgaGFuZGxlciBvZlxuICAgIC8vIHRoZSBpbnN0YW5jZSB0aGF0IHJhbiBpdCAtIGhlcmUsIGBhYC5cbiAgICBhd2FpdCBhLnVwZGF0ZVRhZ3MoW1wicG9zdHNcIl0sIHsgZXhwaXJlOiAwIH0pO1xuICAgIGR5bmFtb1NlbmQubW9ja0NsZWFyKCk7XG5cbiAgICBleHBlY3QoYXdhaXQgcmVhZChhLCBcImtcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QoYXdhaXQgcmVhZChiLCBcImtcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAvLyBgYmAgbGVhcm5lZCBvZiBpdCBmcm9tIHRoZSBsb2csIG5vdCBieSByZS1yZWFkaW5nIGl0cyB0YWdzJyBtYXJrZXJzLlxuICAgIGV4cGVjdChkeW5hbW9DYWxscyhRdWVyeUNvbW1hbmQpKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgZXhwZWN0KGR5bmFtb0NhbGxzKEJhdGNoR2V0SXRlbUNvbW1hbmQpKS50b0JlKDApO1xuICB9KTtcblxuICBpdChcIndhaXRzIGZvciB0aGUgcmVmcmVzaCBpbnRlcnZhbCBiZWZvcmUgcmUtcmVhZGluZyB0YWdzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiID0gZGVmYXVsdEluc3RhbmNlKHRhZ01hbmlmZXN0KDYwXzAwMCkpO1xuICAgIGF3YWl0IGIuc2V0KFxuICAgICAgXCJrXCIsXG4gICAgICBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJiXCIsIHsgdGltZXN0YW1wOiBEYXRlLm5vdygpIC0gMTAwMCB9KSksXG4gICAgKTtcbiAgICBhd2FpdCByZWFkKGIsIFwia1wiKTtcbiAgICBhd2FpdCBkZWZhdWx0SW5zdGFuY2UoKS51cGRhdGVUYWdzKFtcInBvc3RzXCJdKTtcbiAgICBkeW5hbW9TZW5kLm1vY2tDbGVhcigpO1xuXG4gICAgLy8gSW5zaWRlIHRoZSB3aW5kb3c6IHN0aWxsIHNlcnZlZCwgYW5kIG5vIHJlYWQgc3BlbnQgb24gaXQuXG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYiwgXCJrXCIpKS50b0JlKFwiYlwiKTtcbiAgICBleHBlY3QoZHluYW1vQ2FsbHMoQmF0Y2hHZXRJdGVtQ29tbWFuZCkpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGR5bmFtb0NhbGxzKFF1ZXJ5Q29tbWFuZCkpLnRvQmUoMCk7XG4gIH0pO1xuXG4gIGl0KFwiZHJvcHMgYW4gZW50cnkgcGFzdCByZXZhbGlkYXRlLCBhcyBOZXh0LmpzJ3MgaW4tbWVtb3J5IGhhbmRsZXIgZG9lc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IGRlZmF1bHRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IHBhc3QgPSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgcGVyZm9ybWFuY2Uubm93KCkgLSAxMF8wMDA7XG4gICAgYXdhaXQgYS5zZXQoXG4gICAgICBcImtcIixcbiAgICAgIFByb21pc2UucmVzb2x2ZShlbnRyeShcInZcIiwgeyB0aW1lc3RhbXA6IHBhc3QsIHJldmFsaWRhdGU6IDEgfSkpLFxuICAgICk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYSwgXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KFwicmVwb3J0cyBzdGFsZSB0YWdzIGFzIHJldmFsaWRhdGUgLTFcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSBkZWZhdWx0SW5zdGFuY2UoKTtcbiAgICBhd2FpdCBhLnNldChcbiAgICAgIFwia1wiLFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwidlwiLCB7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSAtIDEwMDAgfSkpLFxuICAgICk7XG4gICAgYXdhaXQgYS51cGRhdGVUYWdzKFtcInBvc3RzXCJdLCB7IGV4cGlyZTogMzYwMCB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhLmdldChcImtcIiwgW10pO1xuICAgIGV4cGVjdChyZXN1bHQ/LnJldmFsaWRhdGUpLnRvQmUoLTEpO1xuICB9KTtcblxuICBpdChcImFuc3dlcnMgZ2V0RXhwaXJhdGlvbiBmcm9tIGFub3RoZXIgaW5zdGFuY2UncyByZXZhbGlkYXRlUGF0aFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IGRlZmF1bHRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IGIgPSBkZWZhdWx0SW5zdGFuY2UoKTtcbiAgICBhd2FpdCBhLnVwZGF0ZVRhZ3MoW1wiX05fVF8vYmxvZy9sYXlvdXRcIl0pO1xuICAgIGNvbnN0IGV4cGlyYXRpb24gPSBhd2FpdCBiLmdldEV4cGlyYXRpb24oW1wiX05fVF8vXCIsIFwiX05fVF8vYmxvZy9sYXlvdXRcIl0pO1xuICAgIGV4cGVjdChleHBpcmF0aW9uKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgZXhwZWN0KGF3YWl0IGIuZ2V0RXhwaXJhdGlvbihbXCJfTl9UXy9vdGhlclwiXSkpLnRvQmUoMCk7XG4gIH0pO1xuXG4gIGl0KFwic3RvcmVzIG5vdGhpbmcgZnJvbSBhIHN0cmVhbSB0aGF0IGVycm9ycywgYW5kIHJlbGVhc2VzIHRoZSBwZW5kaW5nIGdldFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IGRlZmF1bHRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IGZhaWxpbmcgPSBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICBjb250cm9sbGVyLmVycm9yKG5ldyBFcnJvcihcInJlbmRlciBmYWlsZWRcIikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICBhd2FpdCBhLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKHsgLi4uZW50cnkoXCJcIiksIHZhbHVlOiBmYWlsaW5nIH0pKTtcbiAgICBleHBlY3QoYXdhaXQgcmVhZChhLCBcImtcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
589
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNhY2hlLWhhbmRsZXJzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlci91c2UtY2FjaGUtaGFuZGxlcnMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQUFzRDtBQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBRXRDLDhEQU9rQztBQUNsQyxrREFLNEI7QUFLNUIsdURBTTJCO0FBQzNCLHlEQUFnRDtBQUNoRCwyRUFBMkU7QUFDM0UseUVBQXlFO0FBRXpFLGdFQUFnRTtBQUNoRSxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQWdCLEVBQUUsSUFBYSxFQUFFLEVBQUU7SUFDdkQsTUFBTSxJQUFJLEdBQUcsSUFBaUIsQ0FBQztJQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0FBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQWdCLEVBQUUsRUFBRTtJQUNoRCxJQUFJLE9BQU8sWUFBWSw0QkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSw0QkFBZ0IsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELElBQUksT0FBTyxZQUFZLDRCQUFnQixF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QyxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0VBQXdFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdEYsTUFBTSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUM7UUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQWE7WUFDN0MsS0FBSyxDQUFDLFVBQVU7Z0JBQ2QsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQy9DLENBQUM7U0FDRixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM3QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5qZXN0Lm1vY2soXCJAYXdzLXNkay9jbGllbnQtczNcIik7XG5qZXN0Lm1vY2soXCJAYXdzLXNkay9jbGllbnQtZHluYW1vZGJcIik7XG5cbmltcG9ydCB7XG4gIEF0dHJpYnV0ZVZhbHVlLFxuICBCYXRjaEdldEl0ZW1Db21tYW5kLFxuICBEeW5hbW9EQkNsaWVudCxcbiAgUHV0SXRlbUNvbW1hbmQsXG4gIFF1ZXJ5Q29tbWFuZCxcbiAgVXBkYXRlSXRlbUNvbW1hbmQsXG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtZHluYW1vZGJcIjtcbmltcG9ydCB7XG4gIEdldE9iamVjdENvbW1hbmQsXG4gIE5vU3VjaEtleSxcbiAgUHV0T2JqZWN0Q29tbWFuZCxcbiAgUzNDbGllbnQsXG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ2FjaGVFbnRyeSxcbiAgQ2FjaGVIYW5kbGVyLFxufSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9saWIvY2FjaGUtaGFuZGxlcnMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIENhY2hlQnVja2V0LFxuICBSZXZhbGlkYXRpb25Mb2csXG4gIFRBR19SRUZSRVNIX0dSQUNFX01TLFxuICBUYWdNYXJrZXJUYWJsZSxcbiAgVHJhY2tlZFRhZ01hcmtlcnMsXG59IGZyb20gXCIuL2F3cy1jYWNoZS1zdG9yZVwiO1xuaW1wb3J0IHsgcmVhZFN0cmVhbSB9IGZyb20gXCIuL3VzZS1jYWNoZS1jb21tb25cIjtcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHRVc2VDYWNoZUhhbmRsZXIgfSBmcm9tIFwiLi91c2UtY2FjaGUtZGVmYXVsdC1oYW5kbGVyXCI7XG5pbXBvcnQgeyBjcmVhdGVSZW1vdGVVc2VDYWNoZUhhbmRsZXIgfSBmcm9tIFwiLi91c2UtY2FjaGUtcmVtb3RlLWhhbmRsZXJcIjtcblxuLyoqIFRoZSBpbnB1dCBhbiBhdXRvbW9ja2VkIFNESyBjb21tYW5kIHdhcyBjb25zdHJ1Y3RlZCB3aXRoLiAqL1xuY29uc3QgY29tbWFuZElucHV0ID0gKGNvbW1hbmQ6IHVua25vd24sIHR5cGU6IHVua25vd24pID0+IHtcbiAgY29uc3QgbW9jayA9IHR5cGUgYXMgamVzdC5Nb2NrO1xuICByZXR1cm4gbW9jay5tb2NrLmNhbGxzW21vY2subW9jay5pbnN0YW5jZXMuaW5kZXhPZihjb21tYW5kKV1bMF07XG59O1xuXG4vKipcbiAqIFMzIGFzIGEgbWFwLiBFdmVyeSBcImluc3RhbmNlXCIgaW4gdGhlc2UgdGVzdHMgaXMgYSBzZXBhcmF0ZSBoYW5kbGVyIG92ZXIgdGhlXG4gKiBzYW1lIG1hcCwgd2hpY2ggaXMgd2hhdCB0aGUgY2FjaGUgYnVja2V0IGlzIHRvIHNlcGFyYXRlIExhbWJkYSBpbnN0YW5jZXMuXG4gKi9cbmNvbnN0IG9iamVjdHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuY29uc3QgczNTZW5kID0gamVzdC5mbihhc3luYyAoY29tbWFuZDogdW5rbm93bikgPT4ge1xuICBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFB1dE9iamVjdENvbW1hbmQpIHtcbiAgICBjb25zdCB7IEtleSwgQm9keSB9ID0gY29tbWFuZElucHV0KGNvbW1hbmQsIFB1dE9iamVjdENvbW1hbmQpO1xuICAgIG9iamVjdHMuc2V0KEtleSwgQm9keSk7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGlmIChjb21tYW5kIGluc3RhbmNlb2YgR2V0T2JqZWN0Q29tbWFuZCkge1xuICAgIGNvbnN0IHsgS2V5IH0gPSBjb21tYW5kSW5wdXQoY29tbWFuZCwgR2V0T2JqZWN0Q29tbWFuZCk7XG4gICAgY29uc3QgYm9keSA9IG9iamVjdHMuZ2V0KEtleSk7XG4gICAgaWYgKGJvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IE5vU3VjaEtleSh7IG1lc3NhZ2U6IFwiTm9TdWNoS2V5XCIsICRtZXRhZGF0YToge30gfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBCb2R5OiB7IHRyYW5zZm9ybVRvU3RyaW5nOiBhc3luYyAoKSA9PiBib2R5IH0sXG4gICAgICBDb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgfTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmV4cGVjdGVkIFMzIGNvbW1hbmRcIik7XG59KTtcblxuLyoqIFRoZSByZXZhbGlkYXRpb24gdGFibGUncyBtYXJrZXIgcm93cywgYXMgYSBtYXAuICovXG5jb25zdCByb3dzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPj4oKTtcbi8qKiBJdHMgcmV2YWxpZGF0aW9uIGxvZyByb3dzLCBieSBzb3J0IGtleS4gKi9cbmNvbnN0IGxvZ1Jvd3MgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgQXR0cmlidXRlVmFsdWU+PigpO1xuY29uc3QgZHluYW1vU2VuZCA9IGplc3QuZm4oYXN5bmMgKGNvbW1hbmQ6IHVua25vd24pID0+IHtcbiAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBVcGRhdGVJdGVtQ29tbWFuZCkge1xuICAgIGNvbnN0IHsgS2V5LCBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzIH0gPSBjb21tYW5kSW5wdXQoXG4gICAgICBjb21tYW5kLFxuICAgICAgVXBkYXRlSXRlbUNvbW1hbmQsXG4gICAgKTtcbiAgICBjb25zdCByb3c6IFJlY29yZDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPiA9IHJvd3MuZ2V0KEtleS5zay5TKSA/PyB7XG4gICAgICBzazogS2V5LnNrLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXMpKSB7XG4gICAgICByb3dbbmFtZS5zbGljZSgxKV0gPSB2YWx1ZSBhcyBBdHRyaWJ1dGVWYWx1ZTtcbiAgICB9XG4gICAgcm93cy5zZXQoS2V5LnNrLlMsIHJvdyk7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGlmIChjb21tYW5kIGluc3RhbmNlb2YgQmF0Y2hHZXRJdGVtQ29tbWFuZCkge1xuICAgIGNvbnN0IHsgUmVxdWVzdEl0ZW1zIH0gPSBjb21tYW5kSW5wdXQoY29tbWFuZCwgQmF0Y2hHZXRJdGVtQ29tbWFuZCk7XG4gICAgY29uc3QgW1t0YWJsZSwgeyBLZXlzIH1dXSA9IE9iamVjdC5lbnRyaWVzKFJlcXVlc3RJdGVtcykgYXMgW1xuICAgICAgc3RyaW5nLFxuICAgICAgeyBLZXlzOiB7IHNrOiB7IFM6IHN0cmluZyB9IH1bXSB9LFxuICAgIF1bXTtcbiAgICByZXR1cm4ge1xuICAgICAgUmVzcG9uc2VzOiB7XG4gICAgICAgIFt0YWJsZV06IEtleXMubWFwKCh7IHNrIH0pID0+IHJvd3MuZ2V0KHNrLlMpKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBQdXRJdGVtQ29tbWFuZCkge1xuICAgIGNvbnN0IHsgSXRlbSB9ID0gY29tbWFuZElucHV0KGNvbW1hbmQsIFB1dEl0ZW1Db21tYW5kKTtcbiAgICBsb2dSb3dzLnNldChJdGVtLnNrLlMsIEl0ZW0pO1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFF1ZXJ5Q29tbWFuZCkge1xuICAgIGNvbnN0IHsgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcyB9ID0gY29tbWFuZElucHV0KGNvbW1hbmQsIFF1ZXJ5Q29tbWFuZCk7XG4gICAgY29uc3Qgc2luY2UgPSBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzW1wiOnNpbmNlXCJdLlMgYXMgc3RyaW5nO1xuICAgIHJldHVybiB7XG4gICAgICBJdGVtczogQXJyYXkuZnJvbShsb2dSb3dzLmtleXMoKSlcbiAgICAgICAgLmZpbHRlcigoc2spID0+IHNrID49IHNpbmNlKVxuICAgICAgICAuc29ydCgpXG4gICAgICAgIC5tYXAoKHNrKSA9PiBsb2dSb3dzLmdldChzaykpLFxuICAgIH07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwidW5leHBlY3RlZCBEeW5hbW9EQiBjb21tYW5kXCIpO1xufSk7XG5cbihTM0NsaWVudCBhcyBqZXN0Lk1vY2spLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiAoeyBzZW5kOiBzM1NlbmQgfSkpO1xuKER5bmFtb0RCQ2xpZW50IGFzIGplc3QuTW9jaykubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+ICh7IHNlbmQ6IGR5bmFtb1NlbmQgfSkpO1xuXG5jb25zdCBzM0NhbGxzID0gKHR5cGU6IHVua25vd24pID0+XG4gIHMzU2VuZC5tb2NrLmNhbGxzLmZpbHRlcigoW2NvbW1hbmRdKSA9PiBjb21tYW5kIGluc3RhbmNlb2YgKHR5cGUgYXMgbmV2ZXIpKVxuICAgIC5sZW5ndGg7XG5jb25zdCBkeW5hbW9DYWxscyA9ICh0eXBlOiB1bmtub3duKSA9PlxuICBkeW5hbW9TZW5kLm1vY2suY2FsbHMuZmlsdGVyKFxuICAgIChbY29tbWFuZF0pID0+IGNvbW1hbmQgaW5zdGFuY2VvZiAodHlwZSBhcyBuZXZlciksXG4gICkubGVuZ3RoO1xuXG4vKiogT25lIGNvbXB1dGUgaW5zdGFuY2UncyB2aWV3IG9mIHRoZSBzaGFyZWQgdGFibGUuICovXG5mdW5jdGlvbiB0YWdNYW5pZmVzdChyZWZyZXNoSW50ZXJ2YWxNcyA9IDApIHtcbiAgcmV0dXJuIG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgbWFya2VyczogbmV3IFRhZ01hcmtlclRhYmxlKG5ldyBEeW5hbW9EQkNsaWVudCh7fSksIFwidGFibGVcIiwgXCJidWlsZFwiKSxcbiAgICBsb2c6IG5ldyBSZXZhbGlkYXRpb25Mb2cobmV3IER5bmFtb0RCQ2xpZW50KHt9KSwgXCJ0YWJsZVwiLCBcImJ1aWxkXCIpLFxuICAgIHJlZnJlc2hJbnRlcnZhbE1zLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVja2V0KCkge1xuICByZXR1cm4gbmV3IENhY2hlQnVja2V0KG5ldyBTM0NsaWVudCh7fSksIFwiYnVja2V0XCIpO1xufVxuXG5mdW5jdGlvbiByZW1vdGVJbnN0YW5jZSh0YWdzID0gdGFnTWFuaWZlc3QoKSkge1xuICByZXR1cm4gY3JlYXRlUmVtb3RlVXNlQ2FjaGVIYW5kbGVyKHtcbiAgICBidWNrZXQ6IGJ1Y2tldCgpLFxuICAgIGJ1aWxkSWQ6IFwiYnVpbGRcIixcbiAgICB0YWdzLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEluc3RhbmNlKHRhZ3MgPSB0YWdNYW5pZmVzdCgpKSB7XG4gIHJldHVybiBjcmVhdGVEZWZhdWx0VXNlQ2FjaGVIYW5kbGVyKHsgdGFncyB9KTtcbn1cblxuZnVuY3Rpb24gc3RyZWFtT2YodGV4dDogc3RyaW5nKTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4ge1xuICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHRleHQpKTtcbiAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZW50cnkodGV4dDogc3RyaW5nLCBleHRyYTogUGFydGlhbDxDYWNoZUVudHJ5PiA9IHt9KTogQ2FjaGVFbnRyeSB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHN0cmVhbU9mKHRleHQpLFxuICAgIHRhZ3M6IFtcInBvc3RzXCJdLFxuICAgIHN0YWxlOiAzMDAsXG4gICAgdGltZXN0YW1wOiBwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgcGVyZm9ybWFuY2Uubm93KCksXG4gICAgZXhwaXJlOiAzNjAwLFxuICAgIHJldmFsaWRhdGU6IDkwMCxcbiAgICAuLi5leHRyYSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGV4dE9mKHJlc3VsdDogQ2FjaGVFbnRyeSB8IHVuZGVmaW5lZCkge1xuICByZXR1cm4gcmVzdWx0XG4gICAgPyBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoYXdhaXQgcmVhZFN0cmVhbShyZXN1bHQudmFsdWUpKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEhvbGQgZXZlcnkgcmV2YWxpZGF0aW9uIGxvZyBgUXVlcnlgIHVudGlsIGByZWxlYXNlYDsgYHJlc3RvcmVgIHB1dHMgdGhlXG4gKiB0YWJsZSBiYWNrIGFzIGl0IHdhcy5cbiAqL1xuZnVuY3Rpb24gaG9sZFF1ZXJpZXMoKSB7XG4gIGxldCByZWxlYXNlITogKCkgPT4gdm9pZDtcbiAgY29uc3QgaGVsZCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiAocmVsZWFzZSA9IHJlc29sdmUpKTtcbiAgY29uc3Qgc2VuZCA9IGR5bmFtb1NlbmQuZ2V0TW9ja0ltcGxlbWVudGF0aW9uKCkhO1xuICBkeW5hbW9TZW5kLm1vY2tJbXBsZW1lbnRhdGlvbihhc3luYyAoY29tbWFuZCkgPT4ge1xuICAgIGlmIChjb21tYW5kIGluc3RhbmNlb2YgUXVlcnlDb21tYW5kKSB7XG4gICAgICBhd2FpdCBoZWxkO1xuICAgIH1cbiAgICByZXR1cm4gc2VuZChjb21tYW5kKTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgcmVsZWFzZSxcbiAgICByZXN0b3JlOiAoKSA9PiB7XG4gICAgICByZWxlYXNlKCk7XG4gICAgICBkeW5hbW9TZW5kLm1vY2tJbXBsZW1lbnRhdGlvbihzZW5kKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKiogV2hldGhlciBgcHJvbWlzZWAgaXMgc3RpbGwgcGVuZGluZyBvbmNlIHBlbmRpbmcgSS9PIGhhcyBoYWQgYSB0dXJuLiAqL1xuYXN5bmMgZnVuY3Rpb24gcGVuZGluZyhwcm9taXNlOiBQcm9taXNlPHVua25vd24+KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gIHZvaWQgcHJvbWlzZS5maW5hbGx5KCgpID0+IChzZXR0bGVkID0gdHJ1ZSkpO1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0SW1tZWRpYXRlKHJlc29sdmUpKTtcbiAgcmV0dXJuICFzZXR0bGVkO1xufVxuXG4vKiogQSByZXF1ZXN0J3Mgd29ydGggb2Ygd2hhdCBOZXh0LmpzIGRvZXMgYmVmb3JlIHJlYWRpbmcgYW4gZW50cnkuICovXG5hc3luYyBmdW5jdGlvbiByZWFkKGhhbmRsZXI6IENhY2hlSGFuZGxlciwga2V5OiBzdHJpbmcpIHtcbiAgYXdhaXQgaGFuZGxlci5yZWZyZXNoVGFncygpO1xuICByZXR1cm4gdGV4dE9mKGF3YWl0IGhhbmRsZXIuZ2V0KGtleSwgW10pKTtcbn1cblxuYmVmb3JlRWFjaCgoKSA9PiB7XG4gIG9iamVjdHMuY2xlYXIoKTtcbiAgcm93cy5jbGVhcigpO1xuICBsb2dSb3dzLmNsZWFyKCk7XG59KTtcblxuZGVzY3JpYmUoXCJjYWNoZUhhbmRsZXJzLnJlbW90ZVwiLCAoKSA9PiB7XG4gIGl0KFwiYW5zd2VycyBldmVyeSBpbnN0YW5jZSBmcm9tIHRoZSBlbnRyeSBhbnkgb25lIG9mIHRoZW0gc3RvcmVkXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gcmVtb3RlSW5zdGFuY2UoKTtcbiAgICBjb25zdCBiID0gcmVtb3RlSW5zdGFuY2UoKTtcblxuICAgIGF3YWl0IGEuc2V0KFwia1wiLCBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJmcm9tLWFcIikpKTtcblxuICAgIGV4cGVjdChhd2FpdCByZWFkKGIsIFwia1wiKSkudG9CZShcImZyb20tYVwiKTtcbiAgICBleHBlY3QoQXJyYXkuZnJvbShvYmplY3RzLmtleXMoKSkpLnRvRXF1YWwoW1xuICAgICAgZXhwZWN0LnN0cmluZ01hdGNoaW5nKC9eYnVpbGRcXC9fdXNlLWNhY2hlXFwvWzAtOWEtZl17NjR9XFwuZW50cnkkLyksXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KFwic2VydmVzIGEgcmVwZWF0IHJlYWQgZnJvbSBtZW1vcnlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGIgPSByZW1vdGVJbnN0YW5jZSgpO1xuICAgIGF3YWl0IHJlbW90ZUluc3RhbmNlKCkuc2V0KFwia1wiLCBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJ2XCIpKSk7XG4gICAgYXdhaXQgcmVhZChiLCBcImtcIik7XG4gICAgczNTZW5kLm1vY2tDbGVhcigpO1xuICAgIGV4cGVjdChhd2FpdCByZWFkKGIsIFwia1wiKSkudG9CZShcInZcIik7XG4gICAgZXhwZWN0KHMzQ2FsbHMoR2V0T2JqZWN0Q29tbWFuZCkpLnRvQmUoMCk7XG4gIH0pO1xuXG4gIGl0KFwiZXhwaXJlcyB0aGUgZW50cnkgb24gZXZlcnkgaW5zdGFuY2Ugd2hlbiBhIHRhZyBpcyByZXZhbGlkYXRlZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHJlbW90ZUluc3RhbmNlKCk7XG4gICAgY29uc3QgYiA9IHJlbW90ZUluc3RhbmNlKCk7XG4gICAgYXdhaXQgYS5zZXQoXG4gICAgICBcImtcIixcbiAgICAgIFByb21pc2UucmVzb2x2ZShlbnRyeShcIm9sZFwiLCB7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSAtIDEwMDAgfSkpLFxuICAgICk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYSwgXCJrXCIpKS50b0JlKFwib2xkXCIpO1xuICAgIGV4cGVjdChhd2FpdCByZWFkKGIsIFwia1wiKSkudG9CZShcIm9sZFwiKTtcblxuICAgIGF3YWl0IGEudXBkYXRlVGFncyhbXCJwb3N0c1wiXSk7XG5cbiAgICBleHBlY3QoYXdhaXQgcmVhZChhLCBcImtcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QoYXdhaXQgcmVhZChiLCBcImtcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAvLyBBIGZyZXNoIGluc3RhbmNlIHJlYWRpbmcgdGhlIHN0YWxlIG9iamVjdCBmcm9tIFMzIG1pc3NlcyB0b28uXG4gICAgZXhwZWN0KGF3YWl0IHJlYWQocmVtb3RlSW5zdGFuY2UoKSwgXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KFwid2FpdHMgZm9yIHRoZSByZXZhbGlkYXRpb24gbG9nIHF1ZXJ5XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gcmVtb3RlSW5zdGFuY2UoKTtcbiAgICBjb25zdCBiID0gcmVtb3RlSW5zdGFuY2UodGFnTWFuaWZlc3QoMTAwMCkpO1xuICAgIGF3YWl0IGEuc2V0KFxuICAgICAgXCJrXCIsXG4gICAgICBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJvbGRcIiwgeyB0aW1lc3RhbXA6IERhdGUubm93KCkgLSAxMDAwIH0pKSxcbiAgICApO1xuICAgIGV4cGVjdChhd2FpdCByZWFkKGIsIFwia1wiKSkudG9CZShcIm9sZFwiKTtcbiAgICBhd2FpdCBhLnVwZGF0ZVRhZ3MoW1wicG9zdHNcIl0pO1xuXG4gICAgLy8gQW4gZW50cnkgcmVhZCBmcm9tIFMzIG1heSBwcmVkYXRlIHRoZSBpbnN0YW5jZSwgc28gaXRzIHJlZnJlc2ggaXNcbiAgICAvLyB3YWl0ZWQgZm9yIGV2ZW4gd2hpbGUgdGhlIGluc3RhbmNlIGtlZXBzIHVwLlxuICAgIGNvbnN0IG5vdyA9IGplc3Quc3B5T24oRGF0ZSwgXCJub3dcIikubW9ja1JldHVyblZhbHVlKERhdGUubm93KCkgKyAxMDAwKTtcbiAgICBjb25zdCBxdWVyaWVzID0gaG9sZFF1ZXJpZXMoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYW5zd2VyID0gcmVhZChiLCBcImtcIik7XG4gICAgICBleHBlY3QoYXdhaXQgcGVuZGluZyhhbnN3ZXIpKS50b0JlKHRydWUpO1xuICAgICAgcXVlcmllcy5yZWxlYXNlKCk7XG4gICAgICBleHBlY3QoYXdhaXQgYW5zd2VyKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHF1ZXJpZXMucmVzdG9yZSgpO1xuICAgICAgbm93Lm1vY2tSZXN0b3JlKCk7XG4gICAgfVxuICB9KTtcblxuICBpdChcInNlcnZlcyBhIHByb2ZpbGUtcmV2YWxpZGF0ZWQgZW50cnkgc3RhbGUsIGZvciBOZXh0LmpzIHRvIHJlZ2VuZXJhdGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSByZW1vdGVJbnN0YW5jZSgpO1xuICAgIGF3YWl0IGEuc2V0KFxuICAgICAgXCJrXCIsXG4gICAgICBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJvbGRcIiwgeyB0aW1lc3RhbXA6IERhdGUubm93KCkgLSAxMDAwIH0pKSxcbiAgICApO1xuICAgIGF3YWl0IGEudXBkYXRlVGFncyhbXCJwb3N0c1wiXSwgeyBleHBpcmU6IDM2MDAgfSk7XG5cbiAgICBjb25zdCBiID0gcmVtb3RlSW5zdGFuY2UoKTtcbiAgICBhd2FpdCBiLnJlZnJlc2hUYWdzKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYi5nZXQoXCJrXCIsIFtdKTtcbiAgICBleHBlY3QocmVzdWx0Py5yZXZhbGlkYXRlKS50b0JlKC0xKTtcbiAgICBleHBlY3QoYXdhaXQgdGV4dE9mKHJlc3VsdCkpLnRvQmUoXCJvbGRcIik7XG4gIH0pO1xuXG4gIGl0KFwicGlja3MgdXAgYW5vdGhlciBpbnN0YW5jZSdzIHJlZ2VuZXJhdGVkIGVudHJ5IG9uY2UgaXRzIG93biBpcyBzdGFsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHJlbW90ZUluc3RhbmNlKCk7XG4gICAgY29uc3QgYiA9IHJlbW90ZUluc3RhbmNlKCk7XG4gICAgY29uc3QgcGFzdCA9IHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSAtIDEwXzAwMDtcbiAgICBhd2FpdCBhLnNldChcbiAgICAgIFwia1wiLFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwidjFcIiwgeyB0aW1lc3RhbXA6IHBhc3QsIHJldmFsaWRhdGU6IDEgfSkpLFxuICAgICk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYiwgXCJrXCIpKS50b0JlKFwidjFcIik7XG5cbiAgICBhd2FpdCBhLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwidjJcIikpKTtcbiAgICAvLyBgYmAncyBtZW1vcnkgY29weSBpcyBwYXN0IGByZXZhbGlkYXRlYCwgc28gUzMgaXMgYXNrZWQgZm9yIGEgbmV3ZXIgb25lLlxuICAgIGV4cGVjdChhd2FpdCByZWFkKGIsIFwia1wiKSkudG9CZShcInYyXCIpO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IHNlcnZlIGFuIGVudHJ5IHBhc3QgaXRzIGV4cGlyZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGFzdCA9IHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSAtIDEwXzAwMDtcbiAgICBhd2FpdCByZW1vdGVJbnN0YW5jZSgpLnNldChcbiAgICAgIFwia1wiLFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBlbnRyeShcInZcIiwgeyB0aW1lc3RhbXA6IHBhc3QsIHJldmFsaWRhdGU6IDEsIGV4cGlyZTogMiB9KSxcbiAgICAgICksXG4gICAgKTtcbiAgICBleHBlY3QoYXdhaXQgcmVhZChyZW1vdGVJbnN0YW5jZSgpLCBcImtcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoXCJtYWtlcyBhIGdldCB3YWl0IGZvciBhIHBlbmRpbmcgc2V0IG9mIHRoZSBzYW1lIGtleVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHJlbW90ZUluc3RhbmNlKCk7XG4gICAgbGV0IHJlc29sdmU6ICh2YWx1ZTogQ2FjaGVFbnRyeSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIGNvbnN0IHNldCA9IGEuc2V0KFwia1wiLCBuZXcgUHJvbWlzZSgocikgPT4gKHJlc29sdmUgPSByKSkpO1xuICAgIGNvbnN0IGdldCA9IGEuZ2V0KFwia1wiLCBbXSk7XG4gICAgcmVzb2x2ZShlbnRyeShcInZcIikpO1xuICAgIGV4cGVjdChhd2FpdCB0ZXh0T2YoYXdhaXQgZ2V0KSkudG9CZShcInZcIik7XG4gICAgYXdhaXQgc2V0O1xuICB9KTtcblxuICBpdChcInN0b3JlcyBub3RoaW5nIGZyb20gYSBzdHJlYW0gdGhhdCBlcnJvcnNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSByZW1vdGVJbnN0YW5jZSgpO1xuICAgIGNvbnN0IGZhaWxpbmcgPSBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkoWzFdKSk7XG4gICAgICAgIGNvbnRyb2xsZXIuZXJyb3IobmV3IEVycm9yKFwicmVuZGVyIGZhaWxlZFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGF3YWl0IGEuc2V0KFwia1wiLCBQcm9taXNlLnJlc29sdmUoeyAuLi5lbnRyeShcIlwiKSwgdmFsdWU6IGZhaWxpbmcgfSkpO1xuICAgIGV4cGVjdChvYmplY3RzLnNpemUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYSwgXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3Qgc3RvcmUgYW4gZW50cnkgTmV4dC5qcyByZWdlbmVyYXRlcyBvbiBldmVyeSByZWFkXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gcmVtb3RlSW5zdGFuY2UoKTtcbiAgICBhd2FpdCBhLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwidlwiLCB7IGV4cGlyZTogMCB9KSkpO1xuICAgIGV4cGVjdChvYmplY3RzLnNpemUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYSwgXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KFwibmV2ZXIgc2VydmVzIGFuIG9iamVjdCBzdG9yZWQgZm9yIGFub3RoZXIga2V5XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gcmVtb3RlSW5zdGFuY2UoKTtcbiAgICBhd2FpdCBhLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwidlwiKSkpO1xuICAgIGNvbnN0IFtrZXldID0gQXJyYXkuZnJvbShvYmplY3RzLmtleXMoKSk7XG4gICAgb2JqZWN0cy5zZXQoa2V5LCBvYmplY3RzLmdldChrZXkpIS5yZXBsYWNlKCdcImtleVwiOlwia1wiJywgJ1wia2V5XCI6XCJvdGhlclwiJykpO1xuICAgIGNvbnN0IHdhcm4gPSBqZXN0LnNweU9uKGNvbnNvbGUsIFwid2FyblwiKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pO1xuICAgIGV4cGVjdChhd2FpdCByZWFkKHJlbW90ZUluc3RhbmNlKCksIFwia1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIHdhcm4ubW9ja1Jlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyB3b3JraW5nIGZyb20gbWVtb3J5IHdoZW4gUzMgZmFpbHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVycm9yID0gamVzdC5zcHlPbihjb25zb2xlLCBcImVycm9yXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG4gICAgczNTZW5kLm1vY2tSZWplY3RlZFZhbHVlT25jZShuZXcgRXJyb3IoXCJTbG93RG93blwiKSk7XG4gICAgY29uc3QgYSA9IHJlbW90ZUluc3RhbmNlKCk7XG4gICAgYXdhaXQgYS5zZXQoXCJrXCIsIFByb21pc2UucmVzb2x2ZShlbnRyeShcInZcIikpKTtcbiAgICBleHBlY3QoYXdhaXQgcmVhZChhLCBcImtcIikpLnRvQmUoXCJ2XCIpO1xuICAgIHMzU2VuZC5tb2NrUmVqZWN0ZWRWYWx1ZU9uY2UobmV3IEVycm9yKFwiU2xvd0Rvd25cIikpO1xuICAgIGV4cGVjdChhd2FpdCByZWFkKHJlbW90ZUluc3RhbmNlKCksIFwia1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIGVycm9yLm1vY2tSZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KFwiaXMgbWVtb3J5LW9ubHkgd2l0aG91dCBhIGJ1Y2tldFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IGNyZWF0ZVJlbW90ZVVzZUNhY2hlSGFuZGxlcih7XG4gICAgICBidWNrZXQ6IG51bGwsXG4gICAgICBidWlsZElkOiBcImJ1aWxkXCIsXG4gICAgICB0YWdzOiB0YWdNYW5pZmVzdCgpLFxuICAgIH0pO1xuICAgIGF3YWl0IGEuc2V0KFwia1wiLCBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJ2XCIpKSk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYSwgXCJrXCIpKS50b0JlKFwidlwiKTtcbiAgICBleHBlY3QoczNTZW5kKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBpdChcInJlYWRzIGFuIFMzIGVudHJ5J3MgdGFncyBiZWZvcmUgdHJ1c3RpbmcgaXQsIG9uY2UgcGVyIGluc3RhbmNlXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZW1vdGVJbnN0YW5jZSgpLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwidlwiKSkpO1xuICAgIGNvbnN0IGIgPSByZW1vdGVJbnN0YW5jZSh0YWdNYW5pZmVzdCg2MF8wMDApKTtcbiAgICBkeW5hbW9TZW5kLm1vY2tDbGVhcigpO1xuICAgIGF3YWl0IHJlYWQoYiwgXCJrXCIpO1xuICAgIGF3YWl0IHJlYWQoYiwgXCJrXCIpO1xuICAgIGV4cGVjdChkeW5hbW9DYWxscyhCYXRjaEdldEl0ZW1Db21tYW5kKSkudG9CZSgxKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJjYWNoZUhhbmRsZXJzLnJlbW90ZSwgYWNyb3NzIGEgcmV2YWxpZGF0aW9uIGJlZm9yZSBhbiBpbnN0YW5jZSBzdGFydGVkXCIsICgpID0+IHtcbiAgYWZ0ZXJFYWNoKCgpID0+IGplc3QucmVzdG9yZUFsbE1vY2tzKCkpO1xuXG4gIC8vIEEgc3RvcmVzIEsxOyBDIHJldmFsaWRhdGVzIGl0cyB0YWc7IEIgc3RhcnRzIGFmdGVyIEMncyBsb2cgcm93IGlzIGJlaGluZFxuICAvLyBpdHMgY3Vyc29yLCBzdG9yZXMgSzIgd2l0aCB0aGUgc2FtZSB0YWcsIHRoZW4gcmVhZHMgSzEgZnJvbSBTMy5cbiAgaXQoXCJkb2VzIG5vdCBzZXJ2ZSBhbiBvbGRlciBTMyBlbnRyeSBhcyBmcmVzaCBhZnRlciBzdG9yaW5nIGEgbmV3ZXIgb25lIHdpdGggaXRzIHRhZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IHJlbW90ZUluc3RhbmNlKCk7XG4gICAgYXdhaXQgYS5zZXQoXG4gICAgICBcImsxXCIsXG4gICAgICBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJiZWZvcmVcIiwgeyB0aW1lc3RhbXA6IERhdGUubm93KCkgLSAxMDAwIH0pKSxcbiAgICApO1xuICAgIGF3YWl0IHJlbW90ZUluc3RhbmNlKCkudXBkYXRlVGFncyhbXCJwb3N0c1wiXSwgeyBleHBpcmU6IDAgfSk7XG5cbiAgICBjb25zdCBsYXRlciA9IERhdGUubm93KCkgKyAxMF8wMDA7XG4gICAgamVzdC5zcHlPbihEYXRlLCBcIm5vd1wiKS5tb2NrUmV0dXJuVmFsdWUobGF0ZXIpO1xuICAgIGNvbnN0IGIgPSByZW1vdGVJbnN0YW5jZSgpO1xuICAgIGF3YWl0IGIuc2V0KFwiazJcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwiYWZ0ZXJcIiwgeyB0aW1lc3RhbXA6IGxhdGVyIH0pKSk7XG5cbiAgICBleHBlY3QoYXdhaXQgcmVhZChiLCBcImsxXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYiwgXCJrMlwiKSkudG9CZShcImFmdGVyXCIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcImNhY2hlSGFuZGxlcnMuZGVmYXVsdFwiLCAoKSA9PiB7XG4gIGl0KFwia2VlcHMgZW50cmllcyBpbiBlYWNoIGluc3RhbmNlJ3MgbWVtb3J5XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gZGVmYXVsdEluc3RhbmNlKCk7XG4gICAgY29uc3QgYiA9IGRlZmF1bHRJbnN0YW5jZSgpO1xuICAgIGF3YWl0IGEuc2V0KFwia1wiLCBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJ2XCIpKSk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYSwgXCJrXCIpKS50b0JlKFwidlwiKTtcbiAgICBleHBlY3QoYXdhaXQgcmVhZChiLCBcImtcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QoczNTZW5kKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBpdChcImV4cGlyZXMgYW4gZW50cnkgb24gYW4gaW5zdGFuY2UgdGhhdCBkaWQgbm90IHJ1biByZXZhbGlkYXRlVGFnXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gZGVmYXVsdEluc3RhbmNlKCk7XG4gICAgY29uc3QgYiA9IGRlZmF1bHRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IGNyZWF0ZWQgPSB7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSAtIDEwMDAgfTtcbiAgICBhd2FpdCBhLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwiYVwiLCBjcmVhdGVkKSkpO1xuICAgIGF3YWl0IGIuc2V0KFwia1wiLCBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJiXCIsIGNyZWF0ZWQpKSk7XG4gICAgLy8gQ3JlYXRlZCBiZWZvcmUgYGJgIHN0YXJ0ZWQsIHNvIGl0cyBmaXJzdCByZWFkIHJlYWRzIHRoZSB0YWcncyBtYXJrZXIsXG4gICAgLy8gb25jZS5cbiAgICBleHBlY3QoYXdhaXQgcmVhZChiLCBcImtcIikpLnRvQmUoXCJiXCIpO1xuXG4gICAgLy8gV2hhdCBOZXh0LmpzIGRvZXMgZm9yIGByZXZhbGlkYXRlVGFnYDogYHVwZGF0ZVRhZ3NgIG9uIGV2ZXJ5IGhhbmRsZXIgb2ZcbiAgICAvLyB0aGUgaW5zdGFuY2UgdGhhdCByYW4gaXQgLSBoZXJlLCBgYWAuXG4gICAgYXdhaXQgYS51cGRhdGVUYWdzKFtcInBvc3RzXCJdLCB7IGV4cGlyZTogMCB9KTtcbiAgICBkeW5hbW9TZW5kLm1vY2tDbGVhcigpO1xuXG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYSwgXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYiwgXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgLy8gYGJgIGxlYXJuZWQgb2YgaXQgZnJvbSB0aGUgbG9nLCBub3QgYnkgcmUtcmVhZGluZyBpdHMgdGFncycgbWFya2Vycy5cbiAgICBleHBlY3QoZHluYW1vQ2FsbHMoUXVlcnlDb21tYW5kKSkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIGV4cGVjdChkeW5hbW9DYWxscyhCYXRjaEdldEl0ZW1Db21tYW5kKSkudG9CZSgwKTtcbiAgfSk7XG5cbiAgaXQoXCJ3YWl0cyBvbiBubyBtYXJrZXIgcmVhZCB0byBqdWRnZSBhbiBlbnRyeSBzdG9yZWQgc2luY2UgdGhlIGluc3RhbmNlIHN0YXJ0ZWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSBkZWZhdWx0SW5zdGFuY2UoKTtcbiAgICBjb25zdCBiVGFncyA9IHRhZ01hbmlmZXN0KCk7XG4gICAgY29uc3QgYiA9IGRlZmF1bHRJbnN0YW5jZShiVGFncyk7XG4gICAgYXdhaXQgYi5zZXQoXCJrXCIsIFByb21pc2UucmVzb2x2ZShlbnRyeShcImJcIikpKTtcblxuICAgIC8vIEhvbGQgZXZlcnkgbWFya2VyIHJlYWQ6IE5leHQuanMgYXdhaXRzIGJvdGggYW5zd2VycyBpbnNpZGUgdGhlXG4gICAgLy8gYCd1c2UgY2FjaGUnYCBsb29rdXAsIGFuZCBhIHBhdGggdGhlIGluc3RhbmNlIGhhcyBub3Qgc2VydmVkIGJlZm9yZSBoYXNcbiAgICAvLyBpbXBsaWNpdCB0YWdzIGl0IGhhcyBuZXZlciByZWFkLlxuICAgIGxldCByZWxlYXNlITogKCkgPT4gdm9pZDtcbiAgICBjb25zdCBoZWxkID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IChyZWxlYXNlID0gcmVzb2x2ZSkpO1xuICAgIGNvbnN0IHNlbmQgPSBkeW5hbW9TZW5kLmdldE1vY2tJbXBsZW1lbnRhdGlvbigpITtcbiAgICBkeW5hbW9TZW5kLm1vY2tJbXBsZW1lbnRhdGlvbihhc3luYyAoY29tbWFuZCkgPT4ge1xuICAgICAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBCYXRjaEdldEl0ZW1Db21tYW5kKSB7XG4gICAgICAgIGF3YWl0IGhlbGQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VuZChjb21tYW5kKTtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgZXhwZWN0KGF3YWl0IGIuZ2V0RXhwaXJhdGlvbihbXCJfTl9UXy9uZXctcGF0aFwiXSkpLnRvQmUoSW5maW5pdHkpO1xuICAgICAgYXdhaXQgYi5yZWZyZXNoVGFncygpO1xuICAgICAgZXhwZWN0KGF3YWl0IHRleHRPZihhd2FpdCBiLmdldChcImtcIiwgW1wiX05fVF8vbmV3LXBhdGhcIl0pKSkudG9CZShcImJcIik7XG4gICAgICAvLyBTdGlsbCByZWFkLCBpbiB0aGUgYmFja2dyb3VuZCwgc28gdGhlIHRhZ3Mgam9pbiB0aGUgcm9sbGluZyByZS1yZWFkLlxuICAgICAgZXhwZWN0KGR5bmFtb0NhbGxzKEJhdGNoR2V0SXRlbUNvbW1hbmQpKS50b0JlR3JlYXRlclRoYW4oMCk7XG5cbiAgICAgIC8vIEFub3RoZXIgaW5zdGFuY2UncyByZXZhbGlkYXRpb24gc3RpbGwgcmVhY2hlcyBpdCwgdGhyb3VnaCB0aGUgbG9nLlxuICAgICAgYXdhaXQgYS51cGRhdGVUYWdzKFtcInBvc3RzXCJdKTtcbiAgICAgIGF3YWl0IGJUYWdzLnJlZnJlc2goKTtcbiAgICAgIGV4cGVjdChhd2FpdCByZWFkKGIsIFwia1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZWxlYXNlKCk7XG4gICAgICBkeW5hbW9TZW5kLm1vY2tJbXBsZW1lbnRhdGlvbihzZW5kKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwicmVhZHMgdGhlIGltcGxpY2l0IHRhZ3MgZmlyc3QgZm9yIGFuIGVudHJ5IG9sZGVyIHRoYW4gdGhlIG1hbmlmZXN0J3Mga25vd2xlZGdlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiID0gZGVmYXVsdEluc3RhbmNlKCk7XG4gICAgYXdhaXQgYi5zZXQoXG4gICAgICBcImtcIixcbiAgICAgIFByb21pc2UucmVzb2x2ZShlbnRyeShcImJcIiwgeyB0aW1lc3RhbXA6IERhdGUubm93KCkgLSAxMDAwIH0pKSxcbiAgICApO1xuICAgIGF3YWl0IGIuc2V0KFwibmV3XCIsIFByb21pc2UucmVzb2x2ZShlbnRyeShcIm5ld1wiKSkpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgIHJvd3Muc2V0KFwiX05fVF8vb2xkLXBhdGhcIiwge1xuICAgICAgc2s6IHsgUzogXCJfTl9UXy9vbGQtcGF0aFwiIH0sXG4gICAgICByZXZhbGlkYXRlZEF0OiB7IE46IFN0cmluZyhEYXRlLm5vdygpIC0gNTAwKSB9LFxuICAgIH0pO1xuICAgIC8vIEp1ZGdlZCBwZXIgZW50cnk6IHRoZSBuZXcgb25lIGlzIG5vdCBoZWxkIHVwIGJ5IHRoZSBvbGQgb25lLlxuICAgIGR5bmFtb1NlbmQubW9ja0NsZWFyKCk7XG4gICAgZXhwZWN0KGF3YWl0IHRleHRPZihhd2FpdCBiLmdldChcIm5ld1wiLCBbXCJfTl9UXy9uZXctcGF0aFwiXSkpKS50b0JlKFwibmV3XCIpO1xuICAgIGV4cGVjdChhd2FpdCB0ZXh0T2YoYXdhaXQgYi5nZXQoXCJrXCIsIFtcIl9OX1RfL29sZC1wYXRoXCJdKSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QoZHluYW1vQ2FsbHMoQmF0Y2hHZXRJdGVtQ29tbWFuZCkpLnRvQmUoMik7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgaG9sZCBhIHJlYWQgZm9yIHRoZSByZXZhbGlkYXRpb24gbG9nIHF1ZXJ5XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gZGVmYXVsdEluc3RhbmNlKCk7XG4gICAgY29uc3QgYiA9IGRlZmF1bHRJbnN0YW5jZSh0YWdNYW5pZmVzdCgxMDAwKSk7XG4gICAgY29uc3QgY3JlYXRlZCA9IHsgdGltZXN0YW1wOiBEYXRlLm5vdygpIC0gMTAwMCB9O1xuICAgIGF3YWl0IGIuc2V0KFwia1wiLCBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJiXCIsIGNyZWF0ZWQpKSk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYiwgXCJrXCIpKS50b0JlKFwiYlwiKTtcbiAgICBhd2FpdCBhLnVwZGF0ZVRhZ3MoW1wicG9zdHNcIl0sIHsgZXhwaXJlOiAwIH0pO1xuXG4gICAgLy8gTmV4dC5qcyBhd2FpdHMgYHJlZnJlc2hUYWdzYCBpbnNpZGUgdGhlIGAndXNlIGNhY2hlJ2AgbG9va3VwLCBzbyBhIHJlYWRcbiAgICAvLyB0aGF0IHdhaXRlZCBmb3IgdGhlIHF1ZXJ5IHdvdWxkIGxlYXZlIHRoZSBzdGF0aWMgc3RhZ2Ugb2YgYSBzdGFnZWRcbiAgICAvLyByZW5kZXIuIFRoaXMgb25lIGFuc3dlcnMgZnJvbSB3aGF0IHRoZSBpbnN0YW5jZSBhbHJlYWR5IGtuZXcuXG4gICAgY29uc3Qgbm93ID0gamVzdC5zcHlPbihEYXRlLCBcIm5vd1wiKS5tb2NrUmV0dXJuVmFsdWUoRGF0ZS5ub3coKSArIDEwMDApO1xuICAgIGNvbnN0IHF1ZXJpZXMgPSBob2xkUXVlcmllcygpO1xuICAgIHRyeSB7XG4gICAgICBleHBlY3QoYXdhaXQgcmVhZChiLCBcImtcIikpLnRvQmUoXCJiXCIpO1xuICAgICAgZXhwZWN0KGR5bmFtb0NhbGxzKFF1ZXJ5Q29tbWFuZCkpLnRvQmVHcmVhdGVyVGhhbigwKTtcblxuICAgICAgcXVlcmllcy5yZWxlYXNlKCk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0SW1tZWRpYXRlKHJlc29sdmUpKTtcbiAgICAgIGV4cGVjdChhd2FpdCByZWFkKGIsIFwia1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBxdWVyaWVzLnJlc3RvcmUoKTtcbiAgICAgIG5vdy5tb2NrUmVzdG9yZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoXCJ3YWl0cyBmb3IgdGhlIHJldmFsaWRhdGlvbiBsb2cgcXVlcnkgYWZ0ZXIgdGhlIGluc3RhbmNlIHNhdCBpZGxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gZGVmYXVsdEluc3RhbmNlKCk7XG4gICAgY29uc3QgYiA9IGRlZmF1bHRJbnN0YW5jZSh0YWdNYW5pZmVzdCgxMDAwKSk7XG4gICAgY29uc3QgY3JlYXRlZCA9IHsgdGltZXN0YW1wOiBEYXRlLm5vdygpIC0gMTAwMCB9O1xuICAgIGF3YWl0IGIuc2V0KFwia1wiLCBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJiXCIsIGNyZWF0ZWQpKSk7XG4gICAgZXhwZWN0KGF3YWl0IHJlYWQoYiwgXCJrXCIpKS50b0JlKFwiYlwiKTtcbiAgICBhd2FpdCBhLnVwZGF0ZVRhZ3MoW1wicG9zdHNcIl0sIHsgZXhwaXJlOiAwIH0pO1xuXG4gICAgLy8gTm8gbG9nIHF1ZXJ5IGZvciBsb25nZXIgdGhhbiB0aGUgaW50ZXJ2YWwgcGx1cyB0aGUgZ3JhY2UsIGFzIGZvciBhXG4gICAgLy8gTGFtYmRhIGZyb3plbiBiZXR3ZWVuIGludm9jYXRpb25zLlxuICAgIGNvbnN0IGxhdGVyID0gRGF0ZS5ub3coKSArIDEwMDAgKyBUQUdfUkVGUkVTSF9HUkFDRV9NUyArIDUwMDA7XG4gICAgY29uc3Qgbm93ID0gamVzdC5zcHlPbihEYXRlLCBcIm5vd1wiKS5tb2NrUmV0dXJuVmFsdWUobGF0ZXIpO1xuICAgIGNvbnN0IHF1ZXJpZXMgPSBob2xkUXVlcmllcygpO1xuICAgIHRyeSB7XG4gICAgICAvLyBBbnN3ZXJlZCBvbmx5IG9uY2UgdGhlIHF1ZXJ5IHJldHVybnMsIGFuZCB0aGVuIHdpdGhvdXQgdGhlIGVudHJ5IHRoZVxuICAgICAgLy8gb3RoZXIgaW5zdGFuY2UgcmV2YWxpZGF0ZWQgd2hpbGUgdGhpcyBvbmUgc2F0IGlkbGUuXG4gICAgICBjb25zdCBhbnN3ZXIgPSByZWFkKGIsIFwia1wiKTtcbiAgICAgIGV4cGVjdChhd2FpdCBwZW5kaW5nKGFuc3dlcikpLnRvQmUodHJ1ZSk7XG4gICAgICBxdWVyaWVzLnJlbGVhc2UoKTtcbiAgICAgIGV4cGVjdChhd2FpdCBhbnN3ZXIpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcXVlcmllcy5yZXN0b3JlKCk7XG4gICAgICBub3cubW9ja1Jlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3Qgd2FpdCBmb3IgdGhlIHJldmFsaWRhdGlvbiBsb2cgcXVlcnksIGlkbGUsIHdoaWxlIGl0IGhvbGRzIG5vIGVudHJpZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGIgPSBkZWZhdWx0SW5zdGFuY2UodGFnTWFuaWZlc3QoMTAwMCkpO1xuXG4gICAgLy8gQXMgZm9yIHRoZSBmaXJzdCBgJ3VzZSBjYWNoZSdgIGNhbGwgb2YgYSBwcm9jZXNzLCB3aGljaCBjcmVhdGVzIHRoZVxuICAgIC8vIGhhbmRsZXIgaW5zaWRlIHRoZSByZW5kZXI6IG5vdGhpbmcgaGVsZCwgc28gbm90aGluZyB0aGUgcXVlcnkgY291bGRcbiAgICAvLyBleHBpcmUuXG4gICAgY29uc3QgbGF0ZXIgPSBEYXRlLm5vdygpICsgMTAwMCArIFRBR19SRUZSRVNIX0dSQUNFX01TICsgNTAwMDtcbiAgICBjb25zdCBub3cgPSBqZXN0LnNweU9uKERhdGUsIFwibm93XCIpLm1vY2tSZXR1cm5WYWx1ZShsYXRlcik7XG4gICAgY29uc3QgcXVlcmllcyA9IGhvbGRRdWVyaWVzKCk7XG4gICAgdHJ5IHtcbiAgICAgIGV4cGVjdChhd2FpdCBwZW5kaW5nKGIucmVmcmVzaFRhZ3MoKSkpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KGR5bmFtb0NhbGxzKFF1ZXJ5Q29tbWFuZCkpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcXVlcmllcy5yZXN0b3JlKCk7XG4gICAgICBub3cubW9ja1Jlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3Qgd2FpdCBmb3IgdGhlIHJldmFsaWRhdGlvbiBsb2cgcXVlcnksIGlkbGUsIHdoaWxlIGl0IGhvbGRzIG9ubHkgZXhwaXJlZCBlbnRyaWVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiID0gZGVmYXVsdEluc3RhbmNlKHRhZ01hbmlmZXN0KDEwMDApKTtcbiAgICBjb25zdCBjcmVhdGVkID0gcGVyZm9ybWFuY2UudGltZU9yaWdpbiArIHBlcmZvcm1hbmNlLm5vdygpIC0gNTAwMDtcbiAgICBhd2FpdCBiLnNldChcbiAgICAgIFwia1wiLFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwiYlwiLCB7IHRpbWVzdGFtcDogY3JlYXRlZCwgcmV2YWxpZGF0ZTogMSB9KSksXG4gICAgKTtcblxuICAgIGNvbnN0IGxhdGVyID0gRGF0ZS5ub3coKSArIDEwMDAgKyBUQUdfUkVGUkVTSF9HUkFDRV9NUyArIDUwMDA7XG4gICAgY29uc3Qgbm93ID0gamVzdC5zcHlPbihEYXRlLCBcIm5vd1wiKS5tb2NrUmV0dXJuVmFsdWUobGF0ZXIpO1xuICAgIGNvbnN0IHF1ZXJpZXMgPSBob2xkUXVlcmllcygpO1xuICAgIHRyeSB7XG4gICAgICAvLyBgZ2V0YCB3b3VsZCBkcm9wIGl0OiBub3RoaW5nIHRoZSBxdWVyeSBjb3VsZCBleHBpcmUuXG4gICAgICBleHBlY3QoYXdhaXQgcGVuZGluZyhiLnJlZnJlc2hUYWdzKCkpKS50b0JlKGZhbHNlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcXVlcmllcy5yZXN0b3JlKCk7XG4gICAgICBub3cubW9ja1Jlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwid2FpdHMgZm9yIHRoZSByZXZhbGlkYXRpb24gbG9nIHF1ZXJ5IHdoZW4gdG9sZCB0byBhc2sgb24gZXZlcnkgY2hlY2tcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSBkZWZhdWx0SW5zdGFuY2UoKTtcbiAgICBjb25zdCBiID0gZGVmYXVsdEluc3RhbmNlKHRhZ01hbmlmZXN0KDApKTtcbiAgICBjb25zdCBjcmVhdGVkID0geyB0aW1lc3RhbXA6IERhdGUubm93KCkgLSAxMDAwIH07XG4gICAgYXdhaXQgYi5zZXQoXCJrXCIsIFByb21pc2UucmVzb2x2ZShlbnRyeShcImJcIiwgY3JlYXRlZCkpKTtcbiAgICBleHBlY3QoYXdhaXQgcmVhZChiLCBcImtcIikpLnRvQmUoXCJiXCIpO1xuICAgIGF3YWl0IGEudXBkYXRlVGFncyhbXCJwb3N0c1wiXSwgeyBleHBpcmU6IDAgfSk7XG5cbiAgICBjb25zdCBxdWVyaWVzID0gaG9sZFF1ZXJpZXMoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYW5zd2VyID0gcmVhZChiLCBcImtcIik7XG4gICAgICBleHBlY3QoYXdhaXQgcGVuZGluZyhhbnN3ZXIpKS50b0JlKHRydWUpO1xuICAgICAgcXVlcmllcy5yZWxlYXNlKCk7XG4gICAgICBleHBlY3QoYXdhaXQgYW5zd2VyKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHF1ZXJpZXMucmVzdG9yZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyBhbiBlbnRyeSdzIHRhZ3MgYXMgaXQgc3RvcmVzIGl0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiID0gZGVmYXVsdEluc3RhbmNlKCk7XG4gICAgZHluYW1vU2VuZC5tb2NrQ2xlYXIoKTtcbiAgICBhd2FpdCBiLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwiYlwiLCB7IHRhZ3M6IFtcInBvc3RzXCJdIH0pKSk7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldEltbWVkaWF0ZShyZXNvbHZlKSk7XG4gICAgZXhwZWN0KGR5bmFtb0NhbGxzKEJhdGNoR2V0SXRlbUNvbW1hbmQpKS50b0JlKDEpO1xuICB9KTtcblxuICBpdChcImV4cGlyZXMgYW4gZW50cnkgc3RvcmVkIGFmdGVyIGEgcmV2YWxpZGF0aW9uIHdob3NlIGV4cGlyZSBpdCBvdXRsaXZlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gUmV2YWxpZGF0ZWQgd2l0aCBhIHByb2ZpbGUgYmVmb3JlIGBiYCBzdGFydGVkLCBvdXRzaWRlIGl0cyBsb2cncyBmaXJzdFxuICAgIC8vIGxvb2tiYWNrOiB0aGUgbWFya2VyIGFsb25lIGtub3dzIHRoZSBlbnRyeSBleHBpcmVzLlxuICAgIGNvbnN0IGV4cGlyZWRBdCA9IHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSArIDYwXzAwMDtcbiAgICByb3dzLnNldChcInBvc3RzXCIsIHtcbiAgICAgIHNrOiB7IFM6IFwicG9zdHNcIiB9LFxuICAgICAgc3RhbGVBdDogeyBOOiBTdHJpbmcoZXhwaXJlZEF0IC0gMTIwXzAwMCkgfSxcbiAgICAgIGV4cGlyZWRBdDogeyBOOiBTdHJpbmcoZXhwaXJlZEF0KSB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGIgPSBkZWZhdWx0SW5zdGFuY2UoKTtcbiAgICBhd2FpdCBiLnNldChcImtcIiwgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwiYlwiKSkpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgIGNvbnN0IGNsb2NrID0gamVzdFxuICAgICAgLnNweU9uKHBlcmZvcm1hbmNlLCBcIm5vd1wiKVxuICAgICAgLm1vY2tSZXR1cm5WYWx1ZShleHBpcmVkQXQgLSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgMSk7XG4gICAgdHJ5IHtcbiAgICAgIGV4cGVjdChhd2FpdCB0ZXh0T2YoYXdhaXQgYi5nZXQoXCJrXCIsIFtdKSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xvY2subW9ja1Jlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwid2FpdHMgZm9yIHRoZSByZWZyZXNoIGludGVydmFsIGJlZm9yZSByZS1yZWFkaW5nIHRhZ3NcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGIgPSBkZWZhdWx0SW5zdGFuY2UodGFnTWFuaWZlc3QoNjBfMDAwKSk7XG4gICAgYXdhaXQgYi5zZXQoXG4gICAgICBcImtcIixcbiAgICAgIFByb21pc2UucmVzb2x2ZShlbnRyeShcImJcIiwgeyB0aW1lc3RhbXA6IERhdGUubm93KCkgLSAxMDAwIH0pKSxcbiAgICApO1xuICAgIGF3YWl0IHJlYWQoYiwgXCJrXCIpO1xuICAgIGF3YWl0IGRlZmF1bHRJbnN0YW5jZSgpLnVwZGF0ZVRhZ3MoW1wicG9zdHNcIl0pO1xuICAgIGR5bmFtb1NlbmQubW9ja0NsZWFyKCk7XG5cbiAgICAvLyBJbnNpZGUgdGhlIHdpbmRvdzogc3RpbGwgc2VydmVkLCBhbmQgbm8gcmVhZCBzcGVudCBvbiBpdC5cbiAgICBleHBlY3QoYXdhaXQgcmVhZChiLCBcImtcIikpLnRvQmUoXCJiXCIpO1xuICAgIGV4cGVjdChkeW5hbW9DYWxscyhCYXRjaEdldEl0ZW1Db21tYW5kKSkudG9CZSgwKTtcbiAgICBleHBlY3QoZHluYW1vQ2FsbHMoUXVlcnlDb21tYW5kKSkudG9CZSgwKTtcbiAgfSk7XG5cbiAgaXQoXCJkcm9wcyBhbiBlbnRyeSBwYXN0IHJldmFsaWRhdGUsIGFzIE5leHQuanMncyBpbi1tZW1vcnkgaGFuZGxlciBkb2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gZGVmYXVsdEluc3RhbmNlKCk7XG4gICAgY29uc3QgcGFzdCA9IHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSAtIDEwXzAwMDtcbiAgICBhd2FpdCBhLnNldChcbiAgICAgIFwia1wiLFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKGVudHJ5KFwidlwiLCB7IHRpbWVzdGFtcDogcGFzdCwgcmV2YWxpZGF0ZTogMSB9KSksXG4gICAgKTtcbiAgICBleHBlY3QoYXdhaXQgcmVhZChhLCBcImtcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoXCJyZXBvcnRzIHN0YWxlIHRhZ3MgYXMgcmV2YWxpZGF0ZSAtMVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYSA9IGRlZmF1bHRJbnN0YW5jZSgpO1xuICAgIGF3YWl0IGEuc2V0KFxuICAgICAgXCJrXCIsXG4gICAgICBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJ2XCIsIHsgdGltZXN0YW1wOiBEYXRlLm5vdygpIC0gMTAwMCB9KSksXG4gICAgKTtcbiAgICBhd2FpdCBhLnVwZGF0ZVRhZ3MoW1wicG9zdHNcIl0sIHsgZXhwaXJlOiAzNjAwIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGEuZ2V0KFwia1wiLCBbXSk7XG4gICAgZXhwZWN0KHJlc3VsdD8ucmV2YWxpZGF0ZSkudG9CZSgtMSk7XG4gIH0pO1xuXG4gIGl0KFwiZXhwaXJlcyBhbiBlbnRyeSBieSBhbm90aGVyIGluc3RhbmNlJ3MgcmV2YWxpZGF0ZVBhdGhcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGEgPSBkZWZhdWx0SW5zdGFuY2UoKTtcbiAgICBjb25zdCBiVGFncyA9IHRhZ01hbmlmZXN0KCk7XG4gICAgY29uc3QgYiA9IGRlZmF1bHRJbnN0YW5jZShiVGFncyk7XG4gICAgYXdhaXQgYi5zZXQoXCJrXCIsIFByb21pc2UucmVzb2x2ZShlbnRyeShcImJcIikpKTtcbiAgICBhd2FpdCBiLnNldChcIm90aGVyXCIsIFByb21pc2UucmVzb2x2ZShlbnRyeShcIm90aGVyXCIpKSk7XG4gICAgYXdhaXQgYS51cGRhdGVUYWdzKFtcIl9OX1RfL2Jsb2cvbGF5b3V0XCJdKTtcbiAgICAvLyBGcm9tIHRoZSBsb2csIGFzIHNvb24gYXMgYGJgIGhhcyByZWFkIGl0LlxuICAgIGF3YWl0IGJUYWdzLnJlZnJlc2goKTtcbiAgICBleHBlY3QoYXdhaXQgdGV4dE9mKGF3YWl0IGIuZ2V0KFwib3RoZXJcIiwgW1wiX05fVF8vb3RoZXJcIl0pKSkudG9CZShcIm90aGVyXCIpO1xuICAgIGV4cGVjdChcbiAgICAgIGF3YWl0IHRleHRPZihhd2FpdCBiLmdldChcImtcIiwgW1wiX05fVF8vXCIsIFwiX05fVF8vYmxvZy9sYXlvdXRcIl0pKSxcbiAgICApLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoXCJkb2VzIG5vdCBleHBpcmUgYW4gZW50cnkgYnkgYW4gaW1wbGljaXQgdGFnIG1hcmtlZCBvbmx5IHN0YWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gZGVmYXVsdEluc3RhbmNlKCk7XG4gICAgY29uc3QgYiA9IGRlZmF1bHRJbnN0YW5jZSgpO1xuICAgIGF3YWl0IGIuc2V0KFxuICAgICAgXCJrXCIsXG4gICAgICBQcm9taXNlLnJlc29sdmUoZW50cnkoXCJiXCIsIHsgdGltZXN0YW1wOiBEYXRlLm5vdygpIC0gMTAwMCB9KSksXG4gICAgKTtcbiAgICBhd2FpdCBhLnVwZGF0ZVRhZ3MoW1wiX05fVF8vYmxvZ1wiXSwgeyBleHBpcmU6IDM2MDAgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYi5nZXQoXCJrXCIsIFtcIl9OX1RfL2Jsb2dcIl0pO1xuICAgIGV4cGVjdChyZXN1bHQ/LnJldmFsaWRhdGUpLnRvQmUoOTAwKTtcbiAgfSk7XG5cbiAgaXQoXCJzdG9yZXMgbm90aGluZyBmcm9tIGEgc3RyZWFtIHRoYXQgZXJyb3JzLCBhbmQgcmVsZWFzZXMgdGhlIHBlbmRpbmcgZ2V0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhID0gZGVmYXVsdEluc3RhbmNlKCk7XG4gICAgY29uc3QgZmFpbGluZyA9IG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZXJyb3IobmV3IEVycm9yKFwicmVuZGVyIGZhaWxlZFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGF3YWl0IGEuc2V0KFwia1wiLCBQcm9taXNlLnJlc29sdmUoeyAuLi5lbnRyeShcIlwiKSwgdmFsdWU6IGZhaWxpbmcgfSkpO1xuICAgIGV4cGVjdChhd2FpdCByZWFkKGEsIFwia1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICB9KTtcbn0pO1xuIl19
|