cdk-nextjs 0.7.6 → 0.7.8
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/adapter-runtime.md +1 -1
- package/docs/caching-guide.md +11 -1
- package/docs/harness-coverage.md +154 -73
- package/lib/adapter/adapter.mjs +12 -3
- package/lib/adapter/aws-cache-store.d.ts +221 -3
- package/lib/adapter/aws-cache-store.js +481 -35
- package/lib/adapter/aws-cache-store.test.js +706 -3
- package/lib/adapter/cache-handler.d.ts +5 -3
- package/lib/adapter/cache-handler.js +16 -10
- package/lib/adapter/cache-handler.mjs +517 -49
- package/lib/adapter/cache-handler.test.js +44 -1
- package/lib/adapter/cache-utils.d.ts +22 -0
- package/lib/adapter/cache-utils.js +44 -1
- package/lib/adapter/function-groups.js +17 -4
- package/lib/adapter/function-groups.test.js +33 -1
- package/lib/adapter/memory-cache-handler.d.ts +5 -1
- package/lib/adapter/memory-cache-handler.js +6 -2
- package/lib/adapter/s3-cache-handler.d.ts +12 -1
- package/lib/adapter/s3-cache-handler.js +30 -8
- package/lib/adapter/s3-cache-handler.test.js +84 -2
- package/lib/adapter/use-cache-common.d.ts +66 -1
- package/lib/adapter/use-cache-common.js +142 -19
- package/lib/adapter/use-cache-common.test.js +174 -1
- package/lib/adapter/use-cache-default-handler.js +36 -6
- package/lib/adapter/use-cache-default-handler.mjs +553 -47
- 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 +542 -45
- 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 +20 -4
- package/lib/runtime/core.test.js +17 -1
- package/lib/runtime/image-utils.d.ts +8 -9
- package/lib/runtime/image-utils.js +16 -1
- package/lib/runtime/image-utils.test.js +13 -1
- package/lib/runtime/image.js +9 -3
- package/lib/runtime/lambda.mjs +66 -18
- package/lib/runtime/server.mjs +66 -18
- package/lib/runtime/tag-manifest.d.ts +40 -0
- package/lib/runtime/tag-manifest.js +59 -0
- package/lib/runtime/tag-manifest.test.d.ts +1 -0
- package/lib/runtime/tag-manifest.test.js +47 -0
- package/package.json +3 -3
- package/scripts/e2e-deploy.sh +7 -2
- package/scripts/e2e-harness/README.md +72 -35
- package/scripts/e2e-harness/screen.mjs +148 -7
- package/scripts/playwright-install-deps.sh +40 -0
|
@@ -3,9 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
/* eslint-disable import/no-extraneous-dependencies */
|
|
4
4
|
jest.mock("@aws-sdk/client-s3");
|
|
5
5
|
jest.mock("@aws-sdk/client-dynamodb");
|
|
6
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
6
7
|
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
7
8
|
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
8
9
|
const aws_cache_store_1 = require("./aws-cache-store");
|
|
10
|
+
const tag_manifest_1 = require("../runtime/tag-manifest");
|
|
9
11
|
/** The input an automocked SDK command was constructed with. */
|
|
10
12
|
const commandInput = (command, type) => {
|
|
11
13
|
const mock = type;
|
|
@@ -352,6 +354,706 @@ describe("CacheBucket", () => {
|
|
|
352
354
|
});
|
|
353
355
|
});
|
|
354
356
|
describe("TrackedTagMarkers", () => {
|
|
357
|
+
it("never counts a render the runtime caught up as behind", async () => {
|
|
358
|
+
let clock = 1_000_000;
|
|
359
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
360
|
+
markers: { read: jest.fn() },
|
|
361
|
+
log: { query: jest.fn() },
|
|
362
|
+
refreshIntervalMs: 1000,
|
|
363
|
+
clock: () => clock,
|
|
364
|
+
});
|
|
365
|
+
// Just short of the line as the request came in: `catchUp` lets it go.
|
|
366
|
+
clock += 1000 + aws_cache_store_1.TAG_REFRESH_GRACE_MS;
|
|
367
|
+
expect(markers.behind).toBe(false);
|
|
368
|
+
await markers.catchUp(async () => {
|
|
369
|
+
// However long the render takes, its lookups never wait: waiting is
|
|
370
|
+
// what the catch-up before it was for.
|
|
371
|
+
clock += 100;
|
|
372
|
+
expect(markers.behind).toBe(true);
|
|
373
|
+
expect(markers.behindInRender).toBe(false);
|
|
374
|
+
clock += 60_000;
|
|
375
|
+
expect(markers.behindInRender).toBe(false);
|
|
376
|
+
});
|
|
377
|
+
// Outside it - a route handler alongside, in a container - it waits.
|
|
378
|
+
expect(markers.behindInRender).toBe(true);
|
|
379
|
+
});
|
|
380
|
+
it("runs handler work outside the request, still caught up", async () => {
|
|
381
|
+
const global = globalThis;
|
|
382
|
+
(0, tag_manifest_1.captureOutsideRequest)();
|
|
383
|
+
try {
|
|
384
|
+
let clock = 1_000_000;
|
|
385
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
386
|
+
markers: { read: jest.fn() },
|
|
387
|
+
log: { query: jest.fn() },
|
|
388
|
+
refreshIntervalMs: 1000,
|
|
389
|
+
clock: () => clock,
|
|
390
|
+
});
|
|
391
|
+
// Stands in for Next.js's request store, which its `Date.now()` patch
|
|
392
|
+
// reads to decide whether the call ends a static stage.
|
|
393
|
+
const request = new node_async_hooks_1.AsyncLocalStorage();
|
|
394
|
+
clock += 1000 + aws_cache_store_1.TAG_REFRESH_GRACE_MS;
|
|
395
|
+
await request.run("page render", () => markers.catchUp(async () => {
|
|
396
|
+
clock += 100;
|
|
397
|
+
expect(markers.outsideRender(() => ({
|
|
398
|
+
store: request.getStore(),
|
|
399
|
+
behindInRender: markers.behindInRender,
|
|
400
|
+
}))).toEqual({ store: undefined, behindInRender: false });
|
|
401
|
+
}));
|
|
402
|
+
// A route handler, not caught up, is still behind once outside.
|
|
403
|
+
expect(markers.outsideRender(() => markers.behindInRender)).toBe(true);
|
|
404
|
+
}
|
|
405
|
+
finally {
|
|
406
|
+
delete global[tag_manifest_1.OUTSIDE_REQUEST_SYMBOL];
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
it("gives a render no grace when catchUp, holding nothing, did not catch up", async () => {
|
|
410
|
+
let clock = 1_000_000;
|
|
411
|
+
let held = false;
|
|
412
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
413
|
+
markers: { read: jest.fn() },
|
|
414
|
+
log: {
|
|
415
|
+
query: jest.fn(async () => ({ rows: [], truncated: false })),
|
|
416
|
+
},
|
|
417
|
+
refreshIntervalMs: 1000,
|
|
418
|
+
clock: () => clock,
|
|
419
|
+
});
|
|
420
|
+
markers.judgeEntriesOf(() => (held ? 0 : Infinity), () => held);
|
|
421
|
+
clock += 1000 + aws_cache_store_1.TAG_REFRESH_GRACE_MS + 100;
|
|
422
|
+
await markers.catchUp(async () => {
|
|
423
|
+
// Another request stores an entry before this render's first lookup.
|
|
424
|
+
held = true;
|
|
425
|
+
expect(markers.behindInRender).toBe(true);
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
it("starts a refresh for a page that is not behind, without waiting for it", async () => {
|
|
429
|
+
let clock = 1_000_000;
|
|
430
|
+
let release;
|
|
431
|
+
const query = jest.fn(() => new Promise((resolve) => (release = () => resolve({ rows: [], truncated: false }))));
|
|
432
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
433
|
+
markers: { read: jest.fn() },
|
|
434
|
+
log: { query },
|
|
435
|
+
refreshIntervalMs: 1000,
|
|
436
|
+
clock: () => clock,
|
|
437
|
+
});
|
|
438
|
+
markers.judgeEntriesOf(() => 0);
|
|
439
|
+
clock += 1000;
|
|
440
|
+
expect(markers.behind).toBe(false);
|
|
441
|
+
// A page that reads no cache still keeps the instance current.
|
|
442
|
+
await expect(markers.catchUp(async () => "page")).resolves.toBe("page");
|
|
443
|
+
expect(query).toHaveBeenCalledTimes(1);
|
|
444
|
+
release();
|
|
445
|
+
});
|
|
446
|
+
it("catches up on the log without waiting for the rolling re-read", async () => {
|
|
447
|
+
let clock = 1_000_000;
|
|
448
|
+
let release;
|
|
449
|
+
const read = jest.fn(async (tags) => {
|
|
450
|
+
if (read.mock.calls.length > 1) {
|
|
451
|
+
await new Promise((resolve) => (release = resolve));
|
|
452
|
+
}
|
|
453
|
+
return new Map(tags.map((tag) => [tag, {}]));
|
|
454
|
+
});
|
|
455
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
456
|
+
markers: { read },
|
|
457
|
+
log: {
|
|
458
|
+
query: jest.fn(async () => ({ rows: [], truncated: false })),
|
|
459
|
+
},
|
|
460
|
+
refreshIntervalMs: 1000,
|
|
461
|
+
resyncIntervalMs: 1000,
|
|
462
|
+
random: () => 0,
|
|
463
|
+
clock: () => clock,
|
|
464
|
+
});
|
|
465
|
+
markers.judgeEntriesOf(() => 0);
|
|
466
|
+
await markers.ensure(["posts"]);
|
|
467
|
+
// Due for its re-read, and behind, as after a quiet spell.
|
|
468
|
+
clock += 5000;
|
|
469
|
+
expect(markers.behind).toBe(true);
|
|
470
|
+
let rendered = false;
|
|
471
|
+
await markers.catchUp(async () => (rendered = true));
|
|
472
|
+
// A throttled `BatchGetItem` would otherwise hold the page.
|
|
473
|
+
expect(rendered).toBe(true);
|
|
474
|
+
expect(read).toHaveBeenCalledTimes(2);
|
|
475
|
+
// Nor does a lookup of the tracked tag wait on it.
|
|
476
|
+
let ensured = false;
|
|
477
|
+
void markers.ensure(["posts"]).then(() => (ensured = true));
|
|
478
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
479
|
+
expect(ensured).toBe(true);
|
|
480
|
+
// Still in flight an interval later: not read a second time meanwhile.
|
|
481
|
+
clock += 1000;
|
|
482
|
+
await markers.refresh();
|
|
483
|
+
expect(read).toHaveBeenCalledTimes(2);
|
|
484
|
+
release();
|
|
485
|
+
});
|
|
486
|
+
it("gives a route handler, which no catch-up precedes, no grace more", async () => {
|
|
487
|
+
let clock = 1_000_000;
|
|
488
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
489
|
+
markers: { read: jest.fn() },
|
|
490
|
+
log: { query: jest.fn() },
|
|
491
|
+
refreshIntervalMs: 1000,
|
|
492
|
+
clock: () => clock,
|
|
493
|
+
});
|
|
494
|
+
clock += 1000 + aws_cache_store_1.TAG_REFRESH_GRACE_MS + 100;
|
|
495
|
+
expect(markers.behindInRender).toBe(true);
|
|
496
|
+
});
|
|
497
|
+
it("reads again only once, however many forgets land meanwhile", async () => {
|
|
498
|
+
let clock = 1_000_000;
|
|
499
|
+
const releases = [];
|
|
500
|
+
const read = jest.fn(async () => {
|
|
501
|
+
await new Promise((resolve) => releases.push(resolve));
|
|
502
|
+
return new Map([["posts", { revalidatedAt: 1 }]]);
|
|
503
|
+
});
|
|
504
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
505
|
+
markers: { read },
|
|
506
|
+
log: {
|
|
507
|
+
query: jest.fn(async () => ({ rows: [], truncated: false })),
|
|
508
|
+
},
|
|
509
|
+
refreshIntervalMs: 0,
|
|
510
|
+
clock: () => clock,
|
|
511
|
+
});
|
|
512
|
+
markers.judgeEntriesOf(() => 0);
|
|
513
|
+
const forget = async () => {
|
|
514
|
+
clock += aws_cache_store_1.MAX_REVALIDATION_LOG_GAP_MS + 1;
|
|
515
|
+
await markers.refresh();
|
|
516
|
+
};
|
|
517
|
+
const ensuring = markers.ensure(["posts"]);
|
|
518
|
+
await forget();
|
|
519
|
+
releases.shift()();
|
|
520
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
521
|
+
await forget();
|
|
522
|
+
releases.shift()();
|
|
523
|
+
await ensuring;
|
|
524
|
+
// A truncated log forgets on every query: waiting for a read no forget
|
|
525
|
+
// overtook would keep the requests waiting on this one for as long.
|
|
526
|
+
expect(read).toHaveBeenCalledTimes(2);
|
|
527
|
+
expect(markers.get("posts")).toEqual({ revalidatedAt: 1 });
|
|
528
|
+
});
|
|
529
|
+
it("reads again what a read from before a forget found", async () => {
|
|
530
|
+
let clock = 1_000_000;
|
|
531
|
+
let release;
|
|
532
|
+
const held = new Promise((resolve) => (release = resolve));
|
|
533
|
+
let revalidatedAt;
|
|
534
|
+
const read = jest.fn(async () => {
|
|
535
|
+
await held;
|
|
536
|
+
return new Map(revalidatedAt === undefined ? [] : [["posts", { revalidatedAt }]]);
|
|
537
|
+
});
|
|
538
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
539
|
+
markers: { read },
|
|
540
|
+
log: {
|
|
541
|
+
query: jest.fn(async () => ({ rows: [], truncated: false })),
|
|
542
|
+
},
|
|
543
|
+
refreshIntervalMs: 0,
|
|
544
|
+
clock: () => clock,
|
|
545
|
+
});
|
|
546
|
+
markers.judgeEntriesOf(() => 0);
|
|
547
|
+
// A background read in flight as the sandbox froze, past the log's TTL.
|
|
548
|
+
const ensuring = markers.ensure(["posts"]);
|
|
549
|
+
clock += aws_cache_store_1.MAX_REVALIDATION_LOG_GAP_MS + 1;
|
|
550
|
+
await markers.refresh();
|
|
551
|
+
// Read again once the stale read returns: tracked, its marker would
|
|
552
|
+
// vouch for every entry with the tag, revalidated during the freeze or
|
|
553
|
+
// not; untracked, the request waiting on it would judge by nothing.
|
|
554
|
+
revalidatedAt = (0, aws_cache_store_1.markerClock)();
|
|
555
|
+
release();
|
|
556
|
+
await ensuring;
|
|
557
|
+
expect(read).toHaveBeenCalledTimes(2);
|
|
558
|
+
expect(markers.get("posts")).toEqual({ revalidatedAt });
|
|
559
|
+
});
|
|
560
|
+
it("moves completeSince past what it forgets", async () => {
|
|
561
|
+
let clock = 1_000_000;
|
|
562
|
+
const later = (0, aws_cache_store_1.markerClock)() + 60_000;
|
|
563
|
+
const rows = ["a", "b"].map((tag, i) => ({
|
|
564
|
+
sk: `${String(clock).padStart(15, "0")}#${tag}`,
|
|
565
|
+
at: clock,
|
|
566
|
+
tag,
|
|
567
|
+
marker: { revalidatedAt: later + i },
|
|
568
|
+
}));
|
|
569
|
+
const query = jest.fn(async () => ({ rows, truncated: false }));
|
|
570
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
571
|
+
markers: { read: jest.fn() },
|
|
572
|
+
log: { query },
|
|
573
|
+
refreshIntervalMs: 0,
|
|
574
|
+
maxTrackedTags: 1,
|
|
575
|
+
clock: () => clock,
|
|
576
|
+
});
|
|
577
|
+
// An entry store holding something older than every row.
|
|
578
|
+
markers.judgeEntriesOf(() => 0);
|
|
579
|
+
const start = markers.completeSince;
|
|
580
|
+
expect(start).toBeLessThanOrEqual((0, aws_cache_store_1.markerClock)());
|
|
581
|
+
// Untracked tags' rows are known from the log alone, as far as they fit.
|
|
582
|
+
await markers.refresh();
|
|
583
|
+
expect(markers.state(["b"], later)).toBe("expired");
|
|
584
|
+
// "a" was dropped for space, and with it what it knew.
|
|
585
|
+
expect(markers.state(["a"], later)).toBe("fresh");
|
|
586
|
+
expect(markers.completeSince).toBe(later);
|
|
587
|
+
// Forgetting everything moves it to now, or past what it forgot: "b".
|
|
588
|
+
clock += aws_cache_store_1.MAX_REVALIDATION_LOG_GAP_MS + 1;
|
|
589
|
+
await markers.refresh();
|
|
590
|
+
expect(markers.completeSince).toBe(later + 1);
|
|
591
|
+
});
|
|
592
|
+
it("moves completeSince past a row it lets go of with no entry held", async () => {
|
|
593
|
+
const clock = 1_000_000;
|
|
594
|
+
const revalidatedAt = (0, aws_cache_store_1.markerClock)() + 60_000;
|
|
595
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
596
|
+
markers: { read: jest.fn() },
|
|
597
|
+
log: {
|
|
598
|
+
query: jest.fn(async () => ({
|
|
599
|
+
rows: [
|
|
600
|
+
{
|
|
601
|
+
sk: `${String(clock).padStart(15, "0")}#posts`,
|
|
602
|
+
at: clock,
|
|
603
|
+
tag: "posts",
|
|
604
|
+
marker: { revalidatedAt },
|
|
605
|
+
},
|
|
606
|
+
],
|
|
607
|
+
truncated: false,
|
|
608
|
+
})),
|
|
609
|
+
},
|
|
610
|
+
refreshIntervalMs: 0,
|
|
611
|
+
clock: () => clock,
|
|
612
|
+
});
|
|
613
|
+
markers.judgeEntriesOf(() => Infinity);
|
|
614
|
+
await markers.refresh();
|
|
615
|
+
// An entry whose generation started before the revalidation, stored once
|
|
616
|
+
// the row is gone, is older than `completeSince`, and so read first.
|
|
617
|
+
expect(markers.state(["posts"], revalidatedAt - 1)).toBe("fresh");
|
|
618
|
+
expect(markers.completeSince).toBe(revalidatedAt);
|
|
619
|
+
});
|
|
620
|
+
it("prunes a profile's row, and moves completeSince to its expiredAt once past", async () => {
|
|
621
|
+
const clock = 1_000_000;
|
|
622
|
+
const staleAt = (0, aws_cache_store_1.markerClock)() + 1000;
|
|
623
|
+
const expiredAt = staleAt + 60_000;
|
|
624
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
625
|
+
markers: { read: jest.fn() },
|
|
626
|
+
log: {
|
|
627
|
+
query: jest.fn(async () => ({
|
|
628
|
+
rows: [
|
|
629
|
+
{
|
|
630
|
+
sk: `${String(clock).padStart(15, "0")}#posts`,
|
|
631
|
+
at: clock,
|
|
632
|
+
tag: "posts",
|
|
633
|
+
marker: { staleAt, expiredAt },
|
|
634
|
+
},
|
|
635
|
+
],
|
|
636
|
+
truncated: false,
|
|
637
|
+
})),
|
|
638
|
+
},
|
|
639
|
+
refreshIntervalMs: 0,
|
|
640
|
+
clock: () => clock,
|
|
641
|
+
});
|
|
642
|
+
markers.judgeEntriesOf(() => staleAt + 1);
|
|
643
|
+
await markers.refresh();
|
|
644
|
+
expect(markers.state(["posts"], staleAt - 1)).toBe("fresh");
|
|
645
|
+
expect(markers.completeSince).toBe(staleAt);
|
|
646
|
+
const now = jest
|
|
647
|
+
.spyOn(performance, "now")
|
|
648
|
+
.mockReturnValue(expiredAt - performance.timeOrigin);
|
|
649
|
+
try {
|
|
650
|
+
expect(markers.completeSince).toBe(expiredAt);
|
|
651
|
+
}
|
|
652
|
+
finally {
|
|
653
|
+
now.mockRestore();
|
|
654
|
+
}
|
|
655
|
+
});
|
|
656
|
+
it("queues a pruned row's future expiredAt once, however often the lookback returns it", async () => {
|
|
657
|
+
let clock = 1_000_000;
|
|
658
|
+
const staleAt = (0, aws_cache_store_1.markerClock)() + 1000;
|
|
659
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
660
|
+
markers: { read: jest.fn() },
|
|
661
|
+
log: {
|
|
662
|
+
query: jest.fn(async () => ({
|
|
663
|
+
rows: [
|
|
664
|
+
{
|
|
665
|
+
sk: `${String(1_000_000).padStart(15, "0")}#posts`,
|
|
666
|
+
at: 1_000_000,
|
|
667
|
+
tag: "posts",
|
|
668
|
+
marker: { staleAt, expiredAt: staleAt + 60_000 },
|
|
669
|
+
},
|
|
670
|
+
],
|
|
671
|
+
truncated: false,
|
|
672
|
+
})),
|
|
673
|
+
},
|
|
674
|
+
refreshIntervalMs: 0,
|
|
675
|
+
clock: () => clock,
|
|
676
|
+
});
|
|
677
|
+
markers.judgeEntriesOf(() => staleAt + 1);
|
|
678
|
+
for (let i = 0; i < 3; i++) {
|
|
679
|
+
await markers.refresh();
|
|
680
|
+
clock += 1000;
|
|
681
|
+
}
|
|
682
|
+
// Pruned rows are not marked applied, so each query applies it again.
|
|
683
|
+
expect(markers.laterFloors).toHaveLength(1);
|
|
684
|
+
});
|
|
685
|
+
it("merges future expiredAts past its bound without moving completeSince early", async () => {
|
|
686
|
+
const at = (0, aws_cache_store_1.markerClock)();
|
|
687
|
+
const expiries = new Map([
|
|
688
|
+
["a", at + 60_000],
|
|
689
|
+
["b", at + 60_010],
|
|
690
|
+
["c", at + 120_000],
|
|
691
|
+
]);
|
|
692
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
693
|
+
markers: {
|
|
694
|
+
read: jest.fn(async (tags) => new Map(tags.map((tag) => [
|
|
695
|
+
tag,
|
|
696
|
+
{ staleAt: at - 1000, expiredAt: expiries.get(tag) },
|
|
697
|
+
]))),
|
|
698
|
+
},
|
|
699
|
+
log: { query: jest.fn() },
|
|
700
|
+
maxTrackedTags: 1,
|
|
701
|
+
});
|
|
702
|
+
const start = markers.completeSince;
|
|
703
|
+
// "a", then "b", dropped for space: two expiredAts past a bound of one.
|
|
704
|
+
for (const tag of ["a", "b", "c"]) {
|
|
705
|
+
await markers.ensure([tag]);
|
|
706
|
+
}
|
|
707
|
+
expect(markers.completeSince).toBe(start);
|
|
708
|
+
const now = jest.spyOn(performance, "now");
|
|
709
|
+
try {
|
|
710
|
+
now.mockReturnValue(at + 59_999 - performance.timeOrigin);
|
|
711
|
+
expect(markers.completeSince).toBe(start);
|
|
712
|
+
// Merged: "b"'s from "a"'s, 10 ms early.
|
|
713
|
+
now.mockReturnValue(at + 60_000 - performance.timeOrigin);
|
|
714
|
+
expect(markers.completeSince).toBe(at + 60_010);
|
|
715
|
+
}
|
|
716
|
+
finally {
|
|
717
|
+
now.mockRestore();
|
|
718
|
+
}
|
|
719
|
+
});
|
|
720
|
+
it("does not join a near expiredAt to far ones past its bound", async () => {
|
|
721
|
+
const at = (0, aws_cache_store_1.markerClock)();
|
|
722
|
+
const year = 365 * 24 * 60 * 60 * 1000;
|
|
723
|
+
const expiries = new Map([
|
|
724
|
+
["a", at + year],
|
|
725
|
+
["b", at + year + 10],
|
|
726
|
+
["c", at + 60_000],
|
|
727
|
+
]);
|
|
728
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
729
|
+
markers: {
|
|
730
|
+
read: jest.fn(async (tags) => new Map(tags.map((tag) => [
|
|
731
|
+
tag,
|
|
732
|
+
{ staleAt: at - 1000, expiredAt: expiries.get(tag) },
|
|
733
|
+
]))),
|
|
734
|
+
},
|
|
735
|
+
log: { query: jest.fn() },
|
|
736
|
+
maxTrackedTags: 2,
|
|
737
|
+
});
|
|
738
|
+
for (const tag of ["a", "b", "c", "d", "e"]) {
|
|
739
|
+
await markers.ensure([tag]);
|
|
740
|
+
}
|
|
741
|
+
const now = jest
|
|
742
|
+
.spyOn(performance, "now")
|
|
743
|
+
.mockReturnValue(at + 60_000 - performance.timeOrigin);
|
|
744
|
+
try {
|
|
745
|
+
// "a" and "b" are merged, not "c" into "a": `completeSince` a year
|
|
746
|
+
// early would have every held entry read its markers first until then.
|
|
747
|
+
expect(markers.completeSince).toBe(at + 60_000);
|
|
748
|
+
}
|
|
749
|
+
finally {
|
|
750
|
+
now.mockRestore();
|
|
751
|
+
}
|
|
752
|
+
});
|
|
753
|
+
it("merges the closest future expiredAts past its bound", async () => {
|
|
754
|
+
const at = (0, aws_cache_store_1.markerClock)();
|
|
755
|
+
const expiries = new Map([
|
|
756
|
+
["a", at + 60_000],
|
|
757
|
+
["b", at + 120_000],
|
|
758
|
+
["c", at + 60_010],
|
|
759
|
+
]);
|
|
760
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
761
|
+
markers: {
|
|
762
|
+
read: jest.fn(async (tags) => new Map(tags.map((tag) => [
|
|
763
|
+
tag,
|
|
764
|
+
{ staleAt: at - 1000, expiredAt: expiries.get(tag) },
|
|
765
|
+
]))),
|
|
766
|
+
},
|
|
767
|
+
log: { query: jest.fn() },
|
|
768
|
+
maxTrackedTags: 2,
|
|
769
|
+
});
|
|
770
|
+
// "a", "b", then "c" dropped for space: three expiredAts past a bound of
|
|
771
|
+
// two, and "c" is 10 ms from "a".
|
|
772
|
+
for (const tag of ["a", "b", "c", "d", "e"]) {
|
|
773
|
+
await markers.ensure([tag]);
|
|
774
|
+
}
|
|
775
|
+
const start = markers.completeSince;
|
|
776
|
+
const now = jest.spyOn(performance, "now");
|
|
777
|
+
try {
|
|
778
|
+
now.mockReturnValue(at + 59_999 - performance.timeOrigin);
|
|
779
|
+
expect(markers.completeSince).toBe(start);
|
|
780
|
+
now.mockReturnValue(at + 60_000 - performance.timeOrigin);
|
|
781
|
+
expect(markers.completeSince).toBe(at + 60_010);
|
|
782
|
+
now.mockReturnValue(at + 119_999 - performance.timeOrigin);
|
|
783
|
+
expect(markers.completeSince).toBe(at + 60_010);
|
|
784
|
+
now.mockReturnValue(at + 120_000 - performance.timeOrigin);
|
|
785
|
+
expect(markers.completeSince).toBe(at + 120_000);
|
|
786
|
+
}
|
|
787
|
+
finally {
|
|
788
|
+
now.mockRestore();
|
|
789
|
+
}
|
|
790
|
+
});
|
|
791
|
+
it("catches up only for an entry store holding entries, and not when every check asks anyway", async () => {
|
|
792
|
+
let clock = 1_000_000;
|
|
793
|
+
const instance = (refreshIntervalMs) => {
|
|
794
|
+
const query = jest.fn(async () => ({ rows: [], truncated: false }));
|
|
795
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
796
|
+
markers: { read: jest.fn() },
|
|
797
|
+
log: { query },
|
|
798
|
+
refreshIntervalMs,
|
|
799
|
+
clock: () => clock,
|
|
800
|
+
});
|
|
801
|
+
return { markers, query };
|
|
802
|
+
};
|
|
803
|
+
const noStore = instance(1000);
|
|
804
|
+
const everyCheck = instance(0);
|
|
805
|
+
everyCheck.markers.judgeEntriesOf(() => Infinity);
|
|
806
|
+
// A store, but holding nothing a refresh could expire.
|
|
807
|
+
const emptyStore = instance(1000);
|
|
808
|
+
emptyStore.markers.judgeEntriesOf(() => Infinity);
|
|
809
|
+
const store = instance(1000);
|
|
810
|
+
store.markers.judgeEntriesOf(() => 0);
|
|
811
|
+
clock += 60_000;
|
|
812
|
+
for (const { markers } of [noStore, everyCheck, emptyStore, store]) {
|
|
813
|
+
expect(markers.behind).toBe(true);
|
|
814
|
+
await markers.catchUp(async () => { });
|
|
815
|
+
}
|
|
816
|
+
expect(noStore.query).not.toHaveBeenCalled();
|
|
817
|
+
expect(everyCheck.query).not.toHaveBeenCalled();
|
|
818
|
+
expect(emptyStore.query).not.toHaveBeenCalled();
|
|
819
|
+
expect(store.query).toHaveBeenCalledTimes(1);
|
|
820
|
+
});
|
|
821
|
+
it("moves completeSince to a dropped marker's future expiredAt only once it is past", async () => {
|
|
822
|
+
const at = (0, aws_cache_store_1.markerClock)();
|
|
823
|
+
const read = jest.fn(async (tags) => new Map(tags.map((tag) => [
|
|
824
|
+
tag,
|
|
825
|
+
{ staleAt: at - 1000, expiredAt: at + 60_000 },
|
|
826
|
+
])));
|
|
827
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
828
|
+
markers: { read },
|
|
829
|
+
log: { query: jest.fn() },
|
|
830
|
+
maxTrackedTags: 1,
|
|
831
|
+
});
|
|
832
|
+
const start = markers.completeSince;
|
|
833
|
+
await markers.ensure(["a"]);
|
|
834
|
+
// "a" is dropped for space: a year-long `expire` would otherwise keep
|
|
835
|
+
// every entry reading its markers first for as long.
|
|
836
|
+
await markers.ensure(["b"]);
|
|
837
|
+
expect(markers.completeSince).toBe(start);
|
|
838
|
+
const clock = jest
|
|
839
|
+
.spyOn(performance, "now")
|
|
840
|
+
.mockReturnValue(at + 60_001 - performance.timeOrigin);
|
|
841
|
+
try {
|
|
842
|
+
expect(markers.completeSince).toBe(at + 60_000);
|
|
843
|
+
}
|
|
844
|
+
finally {
|
|
845
|
+
clock.mockRestore();
|
|
846
|
+
}
|
|
847
|
+
});
|
|
848
|
+
it("keeps only the log rows that could apply to an entry held", async () => {
|
|
849
|
+
let clock = 1_000_000;
|
|
850
|
+
const later = (0, aws_cache_store_1.markerClock)() + 60_000;
|
|
851
|
+
const rows = ["old", "new"].map((tag, i) => ({
|
|
852
|
+
sk: `${String(clock).padStart(15, "0")}#${tag}`,
|
|
853
|
+
at: clock,
|
|
854
|
+
tag,
|
|
855
|
+
marker: { revalidatedAt: i === 0 ? 1 : later },
|
|
856
|
+
}));
|
|
857
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
858
|
+
markers: { read: jest.fn() },
|
|
859
|
+
log: {
|
|
860
|
+
query: jest.fn(async () => ({ rows, truncated: false })),
|
|
861
|
+
},
|
|
862
|
+
refreshIntervalMs: 0,
|
|
863
|
+
maxTrackedTags: 1,
|
|
864
|
+
clock: () => clock,
|
|
865
|
+
});
|
|
866
|
+
let oldest = 2;
|
|
867
|
+
markers.judgeEntriesOf(() => oldest);
|
|
868
|
+
const start = markers.completeSince;
|
|
869
|
+
// "old" can expire nothing held, so it takes no room, and "new" is
|
|
870
|
+
// kept without dropping anything for space.
|
|
871
|
+
await markers.refresh();
|
|
872
|
+
expect(markers.state(["new"], later - 1)).toBe("expired");
|
|
873
|
+
expect(markers.completeSince).toBe(start);
|
|
874
|
+
// Once every entry held is newer than it, "new" goes too, taking
|
|
875
|
+
// `completeSince` no further than the oldest entry held.
|
|
876
|
+
oldest = later;
|
|
877
|
+
clock += 1000;
|
|
878
|
+
await markers.refresh();
|
|
879
|
+
expect(markers.state(["new"], later - 1)).toBe("fresh");
|
|
880
|
+
expect(markers.completeSince).toBe(later);
|
|
881
|
+
});
|
|
882
|
+
it("scans the entry stores once a minute, pruning only when the oldest moves", async () => {
|
|
883
|
+
let clock = 1_000_000;
|
|
884
|
+
const later = (0, aws_cache_store_1.markerClock)() + 60_000;
|
|
885
|
+
const rows = [
|
|
886
|
+
{
|
|
887
|
+
sk: `${String(clock).padStart(15, "0")}#new`,
|
|
888
|
+
at: clock,
|
|
889
|
+
tag: "new",
|
|
890
|
+
marker: { revalidatedAt: later },
|
|
891
|
+
},
|
|
892
|
+
];
|
|
893
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
894
|
+
markers: { read: jest.fn() },
|
|
895
|
+
// The row leaves the lookback after the first query: only the prune
|
|
896
|
+
// can let it go.
|
|
897
|
+
log: {
|
|
898
|
+
query: jest
|
|
899
|
+
.fn()
|
|
900
|
+
.mockResolvedValueOnce({ rows, truncated: false })
|
|
901
|
+
.mockResolvedValue({ rows: [], truncated: false }),
|
|
902
|
+
},
|
|
903
|
+
refreshIntervalMs: 0,
|
|
904
|
+
clock: () => clock,
|
|
905
|
+
});
|
|
906
|
+
let bound = 2;
|
|
907
|
+
let exact = 2;
|
|
908
|
+
const oldest = jest.fn((scan) => (scan ? exact : bound));
|
|
909
|
+
markers.judgeEntriesOf(oldest);
|
|
910
|
+
const prune = jest.spyOn(markers, "pruneLogged");
|
|
911
|
+
await markers.refresh();
|
|
912
|
+
expect(oldest).toHaveBeenLastCalledWith(true);
|
|
913
|
+
expect(prune).toHaveBeenCalledTimes(1);
|
|
914
|
+
// Within the minute: the bound, and no prune while it stays put.
|
|
915
|
+
clock += 1000;
|
|
916
|
+
exact = later;
|
|
917
|
+
await markers.refresh();
|
|
918
|
+
expect(oldest).toHaveBeenLastCalledWith(false);
|
|
919
|
+
expect(prune).toHaveBeenCalledTimes(1);
|
|
920
|
+
expect(markers.state(["new"], later - 1)).toBe("expired");
|
|
921
|
+
// The minute's scan finds every entry newer than the row: it goes.
|
|
922
|
+
clock += 60_000;
|
|
923
|
+
await markers.refresh();
|
|
924
|
+
expect(oldest).toHaveBeenLastCalledWith(true);
|
|
925
|
+
expect(prune).toHaveBeenCalledTimes(2);
|
|
926
|
+
expect(markers.state(["new"], later - 1)).toBe("fresh");
|
|
927
|
+
expect(markers.completeSince).toBe(later);
|
|
928
|
+
// An entry set since moves the bound back: nothing to prune.
|
|
929
|
+
clock += 1000;
|
|
930
|
+
bound = 1;
|
|
931
|
+
await markers.refresh();
|
|
932
|
+
expect(prune).toHaveBeenCalledTimes(2);
|
|
933
|
+
});
|
|
934
|
+
it("waits for a fresh query rather than one started before a freeze", async () => {
|
|
935
|
+
let clock = 1_000_000;
|
|
936
|
+
const queries = [];
|
|
937
|
+
const query = jest.fn(() => new Promise((resolve) => queries.push(() => resolve({ rows: [], truncated: false }))));
|
|
938
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
939
|
+
markers: { read: jest.fn() },
|
|
940
|
+
log: { query },
|
|
941
|
+
refreshIntervalMs: 1000,
|
|
942
|
+
clock: () => clock,
|
|
943
|
+
canFreeze: true,
|
|
944
|
+
});
|
|
945
|
+
markers.judgeEntriesOf(() => 0);
|
|
946
|
+
clock += 1000;
|
|
947
|
+
// Started, not waited for, and then the sandbox froze.
|
|
948
|
+
void markers.refresh();
|
|
949
|
+
clock += 60_000;
|
|
950
|
+
expect(markers.behind).toBe(true);
|
|
951
|
+
let caughtUp = false;
|
|
952
|
+
const catchUp = markers
|
|
953
|
+
.catchUp(async () => { })
|
|
954
|
+
.then(() => (caughtUp = true));
|
|
955
|
+
queries.shift()();
|
|
956
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
957
|
+
expect(caughtUp).toBe(false);
|
|
958
|
+
expect(query).toHaveBeenCalledTimes(2);
|
|
959
|
+
queries.shift()();
|
|
960
|
+
await catchUp;
|
|
961
|
+
expect(markers.behind).toBe(false);
|
|
962
|
+
});
|
|
963
|
+
describe("with a refresh in flight", () => {
|
|
964
|
+
let clock;
|
|
965
|
+
beforeEach(() => {
|
|
966
|
+
clock = 1_000_000;
|
|
967
|
+
jest.useFakeTimers({ doNotFake: ["setImmediate", "nextTick"] });
|
|
968
|
+
});
|
|
969
|
+
afterEach(() => jest.useRealTimers());
|
|
970
|
+
/** Move the clock and the timers on together: no freeze. */
|
|
971
|
+
const run = (ms) => {
|
|
972
|
+
for (let step = 0; step < ms; step += 250) {
|
|
973
|
+
clock += 250;
|
|
974
|
+
jest.advanceTimersByTime(250);
|
|
975
|
+
}
|
|
976
|
+
};
|
|
977
|
+
const instance = (fails = false, canFreeze = true) => {
|
|
978
|
+
const queries = [];
|
|
979
|
+
const query = jest.fn(() => new Promise((resolve, reject) => queries.push(() => fails
|
|
980
|
+
? reject(new Error("throttled"))
|
|
981
|
+
: resolve({ rows: [], truncated: false }))));
|
|
982
|
+
const markers = new aws_cache_store_1.TrackedTagMarkers({
|
|
983
|
+
markers: { read: jest.fn() },
|
|
984
|
+
log: { query },
|
|
985
|
+
refreshIntervalMs: 1000,
|
|
986
|
+
clock: () => clock,
|
|
987
|
+
canFreeze,
|
|
988
|
+
});
|
|
989
|
+
markers.judgeEntriesOf(() => 0);
|
|
990
|
+
return { markers, query, queries };
|
|
991
|
+
};
|
|
992
|
+
it("waits for a fresh query after a freeze, even once the late tick has run", async () => {
|
|
993
|
+
const { markers, query, queries } = instance();
|
|
994
|
+
clock += 1000;
|
|
995
|
+
void markers.refresh();
|
|
996
|
+
clock += 60_000;
|
|
997
|
+
// After the thaw the overdue tick can run before any request does.
|
|
998
|
+
jest.advanceTimersByTime(250);
|
|
999
|
+
let caughtUp = false;
|
|
1000
|
+
const catchUp = markers
|
|
1001
|
+
.catchUp(async () => { })
|
|
1002
|
+
.then(() => (caughtUp = true));
|
|
1003
|
+
queries.shift()();
|
|
1004
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
1005
|
+
// What the first query knew predates the freeze.
|
|
1006
|
+
expect(markers.behind).toBe(true);
|
|
1007
|
+
expect(caughtUp).toBe(false);
|
|
1008
|
+
expect(query).toHaveBeenCalledTimes(2);
|
|
1009
|
+
queries.shift()();
|
|
1010
|
+
await catchUp;
|
|
1011
|
+
expect(markers.behind).toBe(false);
|
|
1012
|
+
});
|
|
1013
|
+
it("in a container, which is never frozen, waits only for the query in flight", async () => {
|
|
1014
|
+
const { markers, query, queries } = instance(false, false);
|
|
1015
|
+
clock += 1000;
|
|
1016
|
+
void markers.refresh();
|
|
1017
|
+
// A long stall, not a freeze: no timer to tell them apart, none needed.
|
|
1018
|
+
clock += 60_000;
|
|
1019
|
+
const catchUp = markers.catchUp(async () => { });
|
|
1020
|
+
queries.shift()();
|
|
1021
|
+
await catchUp;
|
|
1022
|
+
expect(query).toHaveBeenCalledTimes(1);
|
|
1023
|
+
expect(markers.behind).toBe(false);
|
|
1024
|
+
});
|
|
1025
|
+
it("is caught up once the catch-up's slow query returns, the process running throughout", async () => {
|
|
1026
|
+
for (const fails of [false, true]) {
|
|
1027
|
+
const { markers, queries } = instance(fails);
|
|
1028
|
+
clock += 60_000;
|
|
1029
|
+
expect(markers.behind).toBe(true);
|
|
1030
|
+
const catchUp = markers.catchUp(async () => { });
|
|
1031
|
+
run(3000);
|
|
1032
|
+
queries.shift()();
|
|
1033
|
+
await catchUp;
|
|
1034
|
+
// Or the first `'use cache'` lookup would wait for another query,
|
|
1035
|
+
// inside the render: one request, two waits.
|
|
1036
|
+
expect(markers.behind).toBe(false);
|
|
1037
|
+
}
|
|
1038
|
+
});
|
|
1039
|
+
it("waits only for a slow query in flight, the process running throughout", async () => {
|
|
1040
|
+
const { markers, query, queries } = instance();
|
|
1041
|
+
clock += 60_000;
|
|
1042
|
+
const first = markers.catchUp(async () => { });
|
|
1043
|
+
run(2500);
|
|
1044
|
+
// Past the grace into the query, but the query is as fresh as any.
|
|
1045
|
+
let caughtUp = false;
|
|
1046
|
+
const second = markers
|
|
1047
|
+
.catchUp(async () => { })
|
|
1048
|
+
.then(() => (caughtUp = true));
|
|
1049
|
+
queries.shift()();
|
|
1050
|
+
await first;
|
|
1051
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
1052
|
+
expect(caughtUp).toBe(true);
|
|
1053
|
+
await second;
|
|
1054
|
+
expect(query).toHaveBeenCalledTimes(1);
|
|
1055
|
+
});
|
|
1056
|
+
});
|
|
355
1057
|
it("does not skip a row for an untracked tag that its first read missed", async () => {
|
|
356
1058
|
// The writer puts the log row and the marker at the same time, and the
|
|
357
1059
|
// marker read is eventually consistent: `refresh` can see the row, then
|
|
@@ -379,12 +1081,13 @@ describe("TrackedTagMarkers", () => {
|
|
|
379
1081
|
clock: () => clock,
|
|
380
1082
|
random: () => 0,
|
|
381
1083
|
});
|
|
382
|
-
|
|
1084
|
+
markers.judgeEntriesOf(() => 0);
|
|
383
1085
|
await markers.ensure(["other"]);
|
|
384
1086
|
clock += 1000;
|
|
385
1087
|
await markers.refresh();
|
|
1088
|
+
// The row seen before the read is applied to what the read found.
|
|
386
1089
|
await markers.ensure(["posts"]);
|
|
387
|
-
expect(markers.get("posts")).toEqual({});
|
|
1090
|
+
expect(markers.get("posts")).toEqual({ revalidatedAt });
|
|
388
1091
|
clock += 1000;
|
|
389
1092
|
await markers.refresh();
|
|
390
1093
|
expect(query).toHaveBeenCalledTimes(2);
|
|
@@ -393,4 +1096,4 @@ describe("TrackedTagMarkers", () => {
|
|
|
393
1096
|
expect(read).toHaveBeenCalledTimes(2);
|
|
394
1097
|
});
|
|
395
1098
|
});
|
|
396
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWNhY2hlLXN0b3JlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlci9hd3MtY2FjaGUtc3RvcmUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQUFzRDtBQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBRXRDLDhEQU1rQztBQUNsQyxrREFLNEI7QUFDNUIsdURBaUIyQjtBQUUzQixnRUFBZ0U7QUFDaEUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUFnQixFQUFFLElBQWEsRUFBRSxFQUFFO0lBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQWlCLENBQUM7SUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDLENBQUM7QUFFRixRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0lBQ3JDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDeEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLE9BQU8sQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNaLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixHQUFHLFFBQVEsQ0FBQztRQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxHQUFHLE9BQU8sQ0FBQztR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LElBQUk7WUFDdkIsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUs7WUFDbEIsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gscURBQXFEO1FBQ3JELE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFaEMsS0FBSyxJQUFJLElBQUksQ0FBQztRQUNkLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFekMsS0FBSyxJQUFJLElBQUksQ0FBQztRQUNkLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDeEQsZ0RBQWdEO1FBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5qZXN0Lm1vY2soXCJAYXdzLXNkay9jbGllbnQtczNcIik7XG5qZXN0Lm1vY2soXCJAYXdzLXNkay9jbGllbnQtZHluYW1vZGJcIik7XG5cbmltcG9ydCB7XG4gIEJhdGNoR2V0SXRlbUNvbW1hbmQsXG4gIER5bmFtb0RCQ2xpZW50LFxuICBQdXRJdGVtQ29tbWFuZCxcbiAgUXVlcnlDb21tYW5kLFxuICBVcGRhdGVJdGVtQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiO1xuaW1wb3J0IHtcbiAgR2V0T2JqZWN0Q29tbWFuZCxcbiAgTm9TdWNoS2V5LFxuICBQdXRPYmplY3RDb21tYW5kLFxuICBTM0NsaWVudCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuaW1wb3J0IHtcbiAgYnVpbGRTM0tleSxcbiAgQ2FjaGVCdWNrZXQsXG4gIGhhc2hlZFRhZyxcbiAgbWFya2VyRm9yLFxuICBtYXJrZXJTdGF0ZSxcbiAgbWFya2VyVXBkYXRlLFxuICBtZXJnZU1hcmtlcnMsXG4gIHJlc29sdmVBd3NDYWNoZUNvbmZpZyxcbiAgUkVWQUxJREFUSU9OX0xPR19NQVhfUEFHRVMsXG4gIFJFVkFMSURBVElPTl9MT0dfVFRMX01TLFxuICBSZXZhbGlkYXRpb25Mb2csXG4gIFJldmFsaWRhdGlvbkxvZ1JvdyxcbiAgVGFnTWFya2VyLFxuICBUYWdNYXJrZXJUYWJsZSxcbiAgVHJhY2tlZFRhZ01hcmtlcnMsXG4gIHVzZUNhY2hlUzNLZXksXG59IGZyb20gXCIuL2F3cy1jYWNoZS1zdG9yZVwiO1xuXG4vKiogVGhlIGlucHV0IGFuIGF1dG9tb2NrZWQgU0RLIGNvbW1hbmQgd2FzIGNvbnN0cnVjdGVkIHdpdGguICovXG5jb25zdCBjb21tYW5kSW5wdXQgPSAoY29tbWFuZDogdW5rbm93biwgdHlwZTogdW5rbm93bikgPT4ge1xuICBjb25zdCBtb2NrID0gdHlwZSBhcyBqZXN0Lk1vY2s7XG4gIHJldHVybiBtb2NrLm1vY2suY2FsbHNbbW9jay5tb2NrLmluc3RhbmNlcy5pbmRleE9mKGNvbW1hbmQpXVswXTtcbn07XG5cbmRlc2NyaWJlKFwicmVzb2x2ZUF3c0NhY2hlQ29uZmlnXCIsICgpID0+IHtcbiAgY29uc3QgZW52ID0gcHJvY2Vzcy5lbnY7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHByb2Nlc3MuZW52ID0geyAuLi5lbnYgfTtcbiAgfSk7XG4gIGFmdGVyQWxsKCgpID0+IHtcbiAgICBwcm9jZXNzLmVudiA9IGVudjtcbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyB0aGUgZW52aXJvbm1lbnQgdGhlIGNvbnN0cnVjdHMgc2V0XCIsICgpID0+IHtcbiAgICBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0NBQ0hFX0JVQ0tFVF9OQU1FID0gXCJidWNrZXRcIjtcbiAgICBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FID0gXCJ0YWJsZVwiO1xuICAgIHByb2Nlc3MuZW52LkNES19ORVhUSlNfQlVJTERfSUQgPSBcImJ1aWxkXCI7XG4gICAgcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiA9IFwiZXUtd2VzdC0xXCI7XG4gICAgZXhwZWN0KHJlc29sdmVBd3NDYWNoZUNvbmZpZygpKS50b0VxdWFsKHtcbiAgICAgIGJ1Y2tldE5hbWU6IFwiYnVja2V0XCIsXG4gICAgICB0YWJsZU5hbWU6IFwidGFibGVcIixcbiAgICAgIGJ1aWxkSWQ6IFwiYnVpbGRcIixcbiAgICAgIHJlZ2lvbjogXCJldS13ZXN0LTFcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJyZXBvcnRzIHdoYXQgaXMgdW5zZXQgYXMgZW1wdHlcIiwgKCkgPT4ge1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0NBQ0hFX0JVQ0tFVF9OQU1FO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0JVSUxEX0lEO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5BV1NfUkVHSU9OO1xuICAgIGV4cGVjdChyZXNvbHZlQXdzQ2FjaGVDb25maWcoKSkudG9FcXVhbCh7XG4gICAgICBidWNrZXROYW1lOiBcIlwiLFxuICAgICAgdGFibGVOYW1lOiBcIlwiLFxuICAgICAgYnVpbGRJZDogXCJcIixcbiAgICAgIHJlZ2lvbjogXCJ1cy1lYXN0LTFcIixcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJTMyBrZXlzXCIsICgpID0+IHtcbiAgaXQoXCJrZWVwcyB0aGUgaW5jcmVtZW50YWwgY2FjaGUncyB7YnVpbGRJZH0ve2tleX0uanNvbiBjb252ZW50aW9uXCIsICgpID0+IHtcbiAgICBleHBlY3QoYnVpbGRTM0tleShcImJcIiwgXCIvXCIpKS50b0JlKFwiYi9pbmRleC5qc29uXCIpO1xuICAgIGV4cGVjdChidWlsZFMzS2V5KFwiYlwiLCBcIlwiKSkudG9CZShcImIvaW5kZXguanNvblwiKTtcbiAgICBleHBlY3QoYnVpbGRTM0tleShcImJcIiwgXCIvYmxvZy9wb3N0XCIpKS50b0JlKFwiYi9ibG9nL3Bvc3QuanNvblwiKTtcbiAgICBleHBlY3QoYnVpbGRTM0tleShcImJcIiwgXCJhYmMxMjNcIikpLnRvQmUoXCJiL2FiYzEyMy5qc29uXCIpO1xuICB9KTtcblxuICBpdChcInB1dHMgJ3VzZSBjYWNoZScgZW50cmllcyB3aGVyZSBubyBpbmNyZW1lbnRhbCBrZXkgY2FuIGxhbmRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IHVzZUNhY2hlUzNLZXkoXCJiXCIsIFwiZlwiLnJlcGVhdCg2NCkpO1xuICAgIGV4cGVjdChrZXkpLnRvQmUoYGIvX3VzZS1jYWNoZS8ke1wiZlwiLnJlcGVhdCg2NCl9LmVudHJ5YCk7XG4gICAgLy8gRXZlbiBhIHJvdXRlIHNwZWxsZWQgbGlrZSB0aGUgdXNlLWNhY2hlIGtleSBnZXRzIGAuanNvbmAgYXBwZW5kZWQuXG4gICAgZXhwZWN0KGJ1aWxkUzNLZXkoXCJiXCIsIGAvX3VzZS1jYWNoZS8ke1wiZlwiLnJlcGVhdCg2NCl9LmVudHJ5YCkpLm5vdC50b0JlKFxuICAgICAga2V5LFxuICAgICk7XG4gICAgZXhwZWN0KGtleS5lbmRzV2l0aChcIi5qc29uXCIpKS50b0JlKGZhbHNlKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJ0YWcgbWFya2Vyc1wiLCAoKSA9PiB7XG4gIGl0KFwid3JpdGVzIHdoYXQgbWFya2VyRm9yIGFwcGxpZXMgbG9jYWxseVwiLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBkdXJhdGlvbnMgb2YgW3VuZGVmaW5lZCwge30sIHsgZXhwaXJlOiA2MCB9XSkge1xuICAgICAgY29uc3QgdXBkYXRlID0gbWFya2VyVXBkYXRlKDEwMDAsIGR1cmF0aW9ucyk7XG4gICAgICBjb25zdCBsb2NhbCA9IG1hcmtlckZvcigxMDAwLCBkdXJhdGlvbnMpO1xuICAgICAgY29uc3Qgd3JpdHRlbjogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICB1cGRhdGUuRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcyEsXG4gICAgICApKSB7XG4gICAgICAgIHdyaXR0ZW5bbmFtZS5zbGljZSgxKV0gPSBOdW1iZXIodmFsdWUuTik7XG4gICAgICB9XG4gICAgICBleHBlY3Qod3JpdHRlbikudG9FcXVhbChsb2NhbCk7XG4gICAgfVxuICAgIGV4cGVjdChtYXJrZXJGb3IoMTAwMCwgeyBleHBpcmU6IDYwIH0pKS50b0VxdWFsKHtcbiAgICAgIHN0YWxlQXQ6IDEwMDAsXG4gICAgICBleHBpcmVkQXQ6IDYxMDAwLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcImtlZXBzIGFuIGVhcmxpZXIgZXhwaXJlZEF0IGEgcHJvZmlsZSB3aXRoIG5vIGV4cGlyZSBsZWF2ZXNcIiwgKCkgPT4ge1xuICAgIC8vIFRoZSByb3cga2VlcHMgaXQgKGBTRVQgc3RhbGVBdGAgb25seSksIHNvIGFuIGluc3RhbmNlIGxlYXJuaW5nIG9mIHRoZVxuICAgIC8vIHNlY29uZCByZXZhbGlkYXRpb24gZnJvbSB0aGUgbG9nIGhhcyB0byBrZWVwIGl0IHRvby5cbiAgICBjb25zdCBmaXJzdCA9IG1hcmtlckZvcigxMDAwLCB7IGV4cGlyZTogNjAgfSk7XG4gICAgY29uc3Qgc2Vjb25kID0gbWFya2VyRm9yKDIwMDAsIHt9KTtcbiAgICBleHBlY3QobWVyZ2VNYXJrZXJzKGZpcnN0LCBzZWNvbmQpKS50b0VxdWFsKHtcbiAgICAgIHN0YWxlQXQ6IDIwMDAsXG4gICAgICBleHBpcmVkQXQ6IDYxMDAwLFxuICAgIH0pO1xuICAgIGV4cGVjdChtZXJnZU1hcmtlcnMoc2Vjb25kLCBmaXJzdCkpLnRvRXF1YWwoe1xuICAgICAgc3RhbGVBdDogMjAwMCxcbiAgICAgIGV4cGlyZWRBdDogNjEwMDAsXG4gICAgfSk7XG4gICAgLy8gQSBuZXdlciBgZXhwaXJlYCBzdGlsbCByZXBsYWNlcyBpdC5cbiAgICBleHBlY3QobWVyZ2VNYXJrZXJzKGZpcnN0LCBtYXJrZXJGb3IoMjAwMCwgeyBleHBpcmU6IDEgfSkpKS50b0VxdWFsKHtcbiAgICAgIHN0YWxlQXQ6IDIwMDAsXG4gICAgICBleHBpcmVkQXQ6IDMwMDAsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwianVkZ2VzIGFuIGVudHJ5IHRoZSB3YXkgdGhlIGluY3JlbWVudGFsIGNhY2hlIGFsd2F5cyBoYXNcIiwgKCkgPT4ge1xuICAgIC8vIEV4cGlyZWQgb3V0cmlnaHQgYWZ0ZXIgY3JlYXRpb24uXG4gICAgZXhwZWN0KG1hcmtlclN0YXRlKHsgcmV2YWxpZGF0ZWRBdDogMjAgfSwgMTAsIDMwKSkudG9CZShcImV4cGlyZWRcIik7XG4gICAgLy8gUmV2YWxpZGF0ZWQgYmVmb3JlIHRoZSBlbnRyeSB3YXMgY3JlYXRlZDogbm8gZWZmZWN0LlxuICAgIGV4cGVjdChtYXJrZXJTdGF0ZSh7IHJldmFsaWRhdGVkQXQ6IDUgfSwgMTAsIDMwKSkudG9CZShcImZyZXNoXCIpO1xuICAgIC8vIEEgcHJvZmlsZTogc3RhbGUgbm93LCBleHBpcmVkIG9uY2UgYGV4cGlyZWRBdGAgcGFzc2VzLlxuICAgIGV4cGVjdChtYXJrZXJTdGF0ZSh7IHN0YWxlQXQ6IDIwLCBleHBpcmVkQXQ6IDUwIH0sIDEwLCAzMCkpLnRvQmUoXCJzdGFsZVwiKTtcbiAgICBleHBlY3QobWFya2VyU3RhdGUoeyBzdGFsZUF0OiAyMCwgZXhwaXJlZEF0OiA1MCB9LCAxMCwgNjApKS50b0JlKFwiZXhwaXJlZFwiKTtcbiAgICAvLyBgZXhwaXJlOiAwYDogc3RhbGUgYW5kIGV4cGlyZWQgYXQgb25jZS5cbiAgICBleHBlY3QobWFya2VyU3RhdGUoeyBzdGFsZUF0OiAyMCwgZXhwaXJlZEF0OiAyMCB9LCAxMCwgMzApKS50b0JlKFwiZXhwaXJlZFwiKTtcbiAgICBleHBlY3QobWFya2VyU3RhdGUoe30sIDEwLCAzMCkpLnRvQmUoXCJmcmVzaFwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJUYWdNYXJrZXJUYWJsZVwiLCAoKSA9PiB7XG4gIGNvbnN0IHNlbmQgPSBqZXN0LmZuKCk7XG4gIGxldCB0YWJsZTogVGFnTWFya2VyVGFibGU7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICAoRHluYW1vREJDbGllbnQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHsgc2VuZCB9KSk7XG4gICAgdGFibGUgPSBuZXcgVGFnTWFya2VyVGFibGUobmV3IER5bmFtb0RCQ2xpZW50KHt9KSwgXCJ0YmxcIiwgXCJidWlsZFwiKTtcbiAgfSk7XG5cbiAgaXQoXCJ3cml0ZXMgdGhlIG1hcmtlciByb3cgdW5kZXIgdGhlIGJ1aWxkXCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHt9KTtcbiAgICBhd2FpdCB0YWJsZS53cml0ZShcInBvc3RzXCIsIDEwMDAsIHsgZXhwaXJlOiAxIH0pO1xuICAgIGNvbnN0IGlucHV0ID0gY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgVXBkYXRlSXRlbUNvbW1hbmQpO1xuICAgIGV4cGVjdChpbnB1dCkudG9FcXVhbCh7XG4gICAgICBUYWJsZU5hbWU6IFwidGJsXCIsXG4gICAgICBLZXk6IHsgcGs6IHsgUzogXCJidWlsZFwiIH0sIHNrOiB7IFM6IFwicG9zdHNcIiB9IH0sXG4gICAgICBVcGRhdGVFeHByZXNzaW9uOiBcIlNFVCBzdGFsZUF0ID0gOnN0YWxlQXQsIGV4cGlyZWRBdCA9IDpleHBpcmVkQXRcIixcbiAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgXCI6c3RhbGVBdFwiOiB7IE46IFwiMTAwMFwiIH0sXG4gICAgICAgIFwiOmV4cGlyZWRBdFwiOiB7IE46IFwiMjAwMFwiIH0sXG4gICAgICB9LFxuICAgICAgUmV0dXJuVmFsdWVzOiBcIkFMTF9ORVdcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyBtYXJrZXJzIGluIGJhdGNoZXMgb2YgMTAwIGFuZCBwYXJzZXMgdGhlbVwiLCBhc3luYyAoKSA9PiB7XG4gICAgc2VuZC5tb2NrSW1wbGVtZW50YXRpb24oKGNvbW1hbmQ6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IHsgUmVxdWVzdEl0ZW1zIH0gPSBjb21tYW5kSW5wdXQoY29tbWFuZCwgQmF0Y2hHZXRJdGVtQ29tbWFuZCk7XG4gICAgICBjb25zdCBrZXlzID0gUmVxdWVzdEl0ZW1zLnRibC5LZXlzIGFzIHsgc2s6IHsgUzogc3RyaW5nIH0gfVtdO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIFJlc3BvbnNlczoge1xuICAgICAgICAgIHRibDoga2V5c1xuICAgICAgICAgICAgLmZpbHRlcigoeyBzayB9KSA9PiBzay5TLmVuZHNXaXRoKFwiMFwiKSlcbiAgICAgICAgICAgIC5tYXAoKHsgc2sgfSkgPT4gKHsgc2ssIHJldmFsaWRhdGVkQXQ6IHsgTjogXCI3XCIgfSB9KSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCB0YWdzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTUwIH0sIChfLCBpKSA9PiBgdCR7aX1gKTtcbiAgICBjb25zdCBtYXJrZXJzID0gYXdhaXQgdGFibGUucmVhZChbLi4udGFncywgXCJ0MFwiXSk7XG4gICAgZXhwZWN0KHNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgICBleHBlY3QobWFya2Vycy5zaXplKS50b0JlKDE1KTtcbiAgICBleHBlY3QobWFya2Vycy5nZXQoXCJ0MTBcIikpLnRvRXF1YWwoe1xuICAgICAgcmV2YWxpZGF0ZWRBdDogNyxcbiAgICAgIHN0YWxlQXQ6IHVuZGVmaW5lZCxcbiAgICAgIGV4cGlyZWRBdDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcImtleXMgYSB0YWcgcGFzdCB0aGUgc29ydCBrZXkgbGltaXQgYnkgaXRzIGhhc2gsIGFuZCByZWFkcyBpdCBiYWNrIGFzIHRoZSB0YWdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIC8vIGByZXZhbGlkYXRlUGF0aGAgb24gYSBsb25nIHBhdGg6IGFuIGltcGxpY2l0IHRhZyBpcyBhcyBsb25nIGFzIHRoZSBwYXRoLlxuICAgIGNvbnN0IHRhZyA9IGBfTl9UXy8ke1wicFwiLnJlcGVhdCgxMTAwKX1gO1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe30pO1xuICAgIGF3YWl0IHRhYmxlLndyaXRlKHRhZywgMTAwMCwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCB3cml0dGVuID0gY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgVXBkYXRlSXRlbUNvbW1hbmQpO1xuICAgIGV4cGVjdCh3cml0dGVuLktleS5zay5TKS50b0JlKGhhc2hlZFRhZyh0YWcpKTtcbiAgICBleHBlY3QoaGFzaGVkVGFnKHRhZykpLnRvTWF0Y2goL14jWzAtOWEtZl17NjR9JC8pO1xuXG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICBzZW5kLm1vY2tJbXBsZW1lbnRhdGlvbigoY29tbWFuZDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgeyBSZXF1ZXN0SXRlbXMgfSA9IGNvbW1hbmRJbnB1dChjb21tYW5kLCBCYXRjaEdldEl0ZW1Db21tYW5kKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBSZXNwb25zZXM6IHtcbiAgICAgICAgICB0Ymw6IFJlcXVlc3RJdGVtcy50YmwuS2V5cy5tYXAoKHsgc2sgfTogeyBzazogdW5rbm93biB9KSA9PiAoe1xuICAgICAgICAgICAgc2ssXG4gICAgICAgICAgICByZXZhbGlkYXRlZEF0OiB7IE46IFwiN1wiIH0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgbWFya2VycyA9IGF3YWl0IHRhYmxlLnJlYWQoW3RhZywgXCJzaG9ydFwiXSk7XG4gICAgZXhwZWN0KFsuLi5tYXJrZXJzLmtleXMoKV0uc29ydCgpKS50b0VxdWFsKFtcInNob3J0XCIsIHRhZ10uc29ydCgpKTtcbiAgfSk7XG5cbiAgLy8gQSByZWFkLWJhY2sgYWZ0ZXIgdGhlIHdyaXRlIGlzIGV2ZW50dWFsbHkgY29uc2lzdGVudCwgc28gaXQgY2FuIHJldHVyblxuICAvLyB0aGUgbWFya2VyIGZyb20gYmVmb3JlIGl0OiB0aGUgd3JpdGVyIHRyYWNrcyB3aGF0IHRoZSB3cml0ZSByZXR1cm5lZC5cbiAgaXQoXCJyZXR1cm5zIHRoZSByb3cgYXMgdGhlIHdyaXRlIGxlZnQgaXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHtcbiAgICAgIEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2s6IHsgUzogXCJwb3N0c1wiIH0sXG4gICAgICAgIHJldmFsaWRhdGVkQXQ6IHsgTjogXCI1MDAwXCIgfSxcbiAgICAgICAgc3RhbGVBdDogeyBOOiBcIjEwXCIgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KGF3YWl0IHRhYmxlLndyaXRlKFwicG9zdHNcIiwgNTAwMCwgdW5kZWZpbmVkKSkudG9FcXVhbCh7XG4gICAgICByZXZhbGlkYXRlZEF0OiA1MDAwLFxuICAgICAgc3RhbGVBdDogMTAsXG4gICAgICBleHBpcmVkQXQ6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7fSk7XG4gICAgZXhwZWN0KGF3YWl0IHRhYmxlLndyaXRlKFwicG9zdHNcIiwgNjAwMCwgdW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpO1xuICB9KTtcblxuICBpdChcImFza3MgYWdhaW4gZm9yIHVucHJvY2Vzc2VkIGtleXMsIGFuZCBnaXZlcyB1cCBhZnRlciB0aHJlZSB0cmllc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdW5wcm9jZXNzZWQgPSB7XG4gICAgICBVbnByb2Nlc3NlZEtleXM6IHtcbiAgICAgICAgdGJsOiB7IEtleXM6IFt7IHBrOiB7IFM6IFwiYnVpbGRcIiB9LCBzazogeyBTOiBcImFcIiB9IH1dIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UodW5wcm9jZXNzZWQpLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7XG4gICAgICBSZXNwb25zZXM6IHsgdGJsOiBbeyBzazogeyBTOiBcImFcIiB9LCBzdGFsZUF0OiB7IE46IFwiM1wiIH0gfV0gfSxcbiAgICB9KTtcbiAgICBleHBlY3QoKGF3YWl0IHRhYmxlLnJlYWQoW1wiYVwiXSkpLmdldChcImFcIik/LnN0YWxlQXQpLnRvQmUoMyk7XG5cbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHVucHJvY2Vzc2VkKTtcbiAgICBhd2FpdCBleHBlY3QodGFibGUucmVhZChbXCJhXCJdKSkucmVqZWN0cy50b1Rocm93KC91bnJlYWQgYWZ0ZXIgcmV0cnlpbmcvKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJSZXZhbGlkYXRpb25Mb2dcIiwgKCkgPT4ge1xuICBjb25zdCBzZW5kID0gamVzdC5mbigpO1xuICBsZXQgbG9nOiBSZXZhbGlkYXRpb25Mb2c7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICAoRHluYW1vREJDbGllbnQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHsgc2VuZCB9KSk7XG4gICAgbG9nID0gbmV3IFJldmFsaWRhdGlvbkxvZyhuZXcgRHluYW1vREJDbGllbnQoe30pLCBcInRibFwiLCBcImJ1aWxkXCIpO1xuICB9KTtcblxuICBpdChcInB1dHMgb25lIHJvdyBwZXIgcmV2YWxpZGF0aW9uIHVuZGVyIHRoZSBidWlsZCdzIGxvZywgd2l0aCBhIFRUTFwiLCBhc3luYyAoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSk7XG4gICAgY29uc3QgYXQgPSAxXzcyN18wMDBfMDAwXzEyMztcbiAgICBhd2FpdCBsb2cucHV0KFwidXNlciM0MlwiLCBhdCwgeyBzdGFsZUF0OiA1LCBleHBpcmVkQXQ6IDYgfSk7XG4gICAgZXhwZWN0KGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIFB1dEl0ZW1Db21tYW5kKSkudG9FcXVhbCh7XG4gICAgICBUYWJsZU5hbWU6IFwidGJsXCIsXG4gICAgICBJdGVtOiB7XG4gICAgICAgIHBrOiB7IFM6IFwiYnVpbGQjbG9nXCIgfSxcbiAgICAgICAgc2s6IHsgUzogXCIwMDE3MjcwMDAwMDAxMjMjdXNlciM0MlwiIH0sXG4gICAgICAgIHR0bDogeyBOOiBTdHJpbmcoTWF0aC5jZWlsKChhdCArIFJFVkFMSURBVElPTl9MT0dfVFRMX01TKSAvIDEwMDApKSB9LFxuICAgICAgICBzdGFsZUF0OiB7IE46IFwiNVwiIH0sXG4gICAgICAgIGV4cGlyZWRBdDogeyBOOiBcIjZcIiB9LFxuICAgICAgfSxcbiAgICAgIENvbmRpdGlvbkV4cHJlc3Npb246IFwiYXR0cmlidXRlX25vdF9leGlzdHMoc2spXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwibW92ZXMgYSByb3cgdG8gdGhlIG5leHQgbWlsbGlzZWNvbmQgcmF0aGVyIHRoYW4gb3ZlcndyaXRlIGFub3RoZXIgcmV2YWxpZGF0aW9uXCIsIGFzeW5jICgpID0+IHtcbiAgICAvLyBgdXBkYXRlVGFnKCd4JylgIGFuZCBgcmV2YWxpZGF0ZVRhZygneCcsICdtYXgnKWAgaW4gb25lIG1pbGxpc2Vjb25kLlxuICAgIGNvbnN0IHRha2VuID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJ0YWtlblwiKSwge1xuICAgICAgbmFtZTogXCJDb25kaXRpb25hbENoZWNrRmFpbGVkRXhjZXB0aW9uXCIsXG4gICAgfSk7XG4gICAgc2VuZC5tb2NrUmVqZWN0ZWRWYWx1ZU9uY2UodGFrZW4pLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7fSk7XG4gICAgYXdhaXQgbG9nLnB1dChcInhcIiwgMTAwMC41LCB7IHJldmFsaWRhdGVkQXQ6IDUgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgc2VuZC5tb2NrLmNhbGxzLm1hcChcbiAgICAgICAgKFtjb21tYW5kXSkgPT4gY29tbWFuZElucHV0KGNvbW1hbmQsIFB1dEl0ZW1Db21tYW5kKS5JdGVtLnNrLlMsXG4gICAgICApLFxuICAgICkudG9FcXVhbChbXCIwMDAwMDAwMDAwMDEwMDAjeFwiLCBcIjAwMDAwMDAwMDAwMTAwMSN4XCJdKTtcbiAgfSk7XG5cbiAgaXQoXCJnaXZlcyB1cCBhZnRlciBhIGJvdW5kZWQgbnVtYmVyIG9mIGNvbGxpc2lvbnMsIGFuZCBvbiBvdGhlciBlcnJvcnMgYXQgb25jZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFrZW4gPSBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcInRha2VuXCIpLCB7XG4gICAgICBuYW1lOiBcIkNvbmRpdGlvbmFsQ2hlY2tGYWlsZWRFeGNlcHRpb25cIixcbiAgICB9KTtcbiAgICBzZW5kLm1vY2tSZWplY3RlZFZhbHVlKHRha2VuKTtcbiAgICBhd2FpdCBleHBlY3QobG9nLnB1dChcInhcIiwgMTAwMCwge30pKS5yZWplY3RzLnRvQmUodGFrZW4pO1xuICAgIGV4cGVjdChzZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoNSk7XG5cbiAgICBzZW5kLm1vY2tSZXNldCgpO1xuICAgIGNvbnN0IHRocm90dGxlZCA9IG5ldyBFcnJvcihcInRocm90dGxlZFwiKTtcbiAgICBzZW5kLm1vY2tSZWplY3RlZFZhbHVlKHRocm90dGxlZCk7XG4gICAgYXdhaXQgZXhwZWN0KGxvZy5wdXQoXCJ4XCIsIDEwMDAsIHt9KSkucmVqZWN0cy50b0JlKHRocm90dGxlZCk7XG4gICAgZXhwZWN0KHNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgfSk7XG5cbiAgaXQoXCJxdWVyaWVzIGZyb20gYSB6ZXJvLXBhZGRlZCBjdXJzb3IgYW5kIHBhcnNlcyB0aGUgdGFnIGFmdGVyIGl0XCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kXG4gICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHtcbiAgICAgICAgSXRlbXM6IFtcbiAgICAgICAgICB7IHNrOiB7IFM6IFwiMDAwMDAwMDAwMDAxMDAwI2FcIiB9LCByZXZhbGlkYXRlZEF0OiB7IE46IFwiN1wiIH0gfSxcbiAgICAgICAgICB7IHNrOiB7IFM6IFwibm90IGEgbG9nIHJvd1wiIH0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgTGFzdEV2YWx1YXRlZEtleTogeyBwazogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sIHNrOiB7IFM6IFwieFwiIH0gfSxcbiAgICAgIH0pXG4gICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHtcbiAgICAgICAgSXRlbXM6IFt7IHNrOiB7IFM6IFwiMDAwMDAwMDAwMDAyMDAwI3VzZXIjNDJcIiB9LCBzdGFsZUF0OiB7IE46IFwiOFwiIH0gfV0sXG4gICAgICB9KTtcbiAgICBjb25zdCB7IHJvd3MsIHRydW5jYXRlZCB9ID0gYXdhaXQgbG9nLnF1ZXJ5KDk5OS41KTtcblxuICAgIGNvbnN0IGZpcnN0ID0gY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgUXVlcnlDb21tYW5kKTtcbiAgICBleHBlY3QoZmlyc3QpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgVGFibGVOYW1lOiBcInRibFwiLFxuICAgICAgS2V5Q29uZGl0aW9uRXhwcmVzc2lvbjogXCJwayA9IDpwayBBTkQgc2sgPj0gOnNpbmNlXCIsXG4gICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgIFwiOnBrXCI6IHsgUzogXCJidWlsZCNsb2dcIiB9LFxuICAgICAgICBcIjpzaW5jZVwiOiB7IFM6IFwiMDAwMDAwMDAwMDAwOTk5XCIgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1sxXVswXSwgUXVlcnlDb21tYW5kKS5FeGNsdXNpdmVTdGFydEtleSxcbiAgICApLnRvRXF1YWwoeyBwazogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sIHNrOiB7IFM6IFwieFwiIH0gfSk7XG4gICAgZXhwZWN0KHRydW5jYXRlZCkudG9CZShmYWxzZSk7XG4gICAgZXhwZWN0KHJvd3MpLnRvRXF1YWwoW1xuICAgICAge1xuICAgICAgICBzazogXCIwMDAwMDAwMDAwMDEwMDAjYVwiLFxuICAgICAgICBhdDogMTAwMCxcbiAgICAgICAgdGFnOiBcImFcIixcbiAgICAgICAgbWFya2VyOiB7IHJldmFsaWRhdGVkQXQ6IDcsIHN0YWxlQXQ6IHVuZGVmaW5lZCwgZXhwaXJlZEF0OiB1bmRlZmluZWQgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNrOiBcIjAwMDAwMDAwMDAwMjAwMCN1c2VyIzQyXCIsXG4gICAgICAgIGF0OiAyMDAwLFxuICAgICAgICB0YWc6IFwidXNlciM0MlwiLFxuICAgICAgICBtYXJrZXI6IHsgcmV2YWxpZGF0ZWRBdDogdW5kZWZpbmVkLCBzdGFsZUF0OiA4LCBleHBpcmVkQXQ6IHVuZGVmaW5lZCB9LFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoXCJoYXNoZXMgYSB0YWcgdG9vIGxvbmcgZm9yIHRoZSBzb3J0IGtleSwgY2FycnlpbmcgaXQgaW4gbG9uZ1RhZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFnID0gYF9OX1RfLyR7XCJwXCIucmVwZWF0KDExMDApfWA7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSk7XG4gICAgYXdhaXQgbG9nLnB1dCh0YWcsIDEwMDAsIHsgcmV2YWxpZGF0ZWRBdDogNSB9KTtcbiAgICBjb25zdCB7IEl0ZW0gfSA9IGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIFB1dEl0ZW1Db21tYW5kKTtcbiAgICBleHBlY3QoSXRlbS5zay5TKS50b0JlKGAwMDAwMDAwMDAwMDEwMDAjJHtoYXNoZWRUYWcodGFnKX1gKTtcbiAgICBleHBlY3QoSXRlbS5sb25nVGFnKS50b0VxdWFsKHsgUzogdGFnIH0pO1xuXG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IEl0ZW1zOiBbeyAuLi5JdGVtIH1dIH0pO1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgbG9nLnF1ZXJ5KDApO1xuICAgIGV4cGVjdChyb3dzLm1hcCgocm93KSA9PiByb3cudGFnKSkudG9FcXVhbChbdGFnXSk7XG4gIH0pO1xuXG4gIGl0KFwic3RvcHMgYWZ0ZXIgaXRzIHBhZ2UgYm91bmQgYW5kIHNheXMgc29cIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgSXRlbXM6IFtdLFxuICAgICAgTGFzdEV2YWx1YXRlZEtleTogeyBwazogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sIHNrOiB7IFM6IFwieFwiIH0gfSxcbiAgICB9KTtcbiAgICBleHBlY3QoKGF3YWl0IGxvZy5xdWVyeSgwKSkudHJ1bmNhdGVkKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChzZW5kKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoUkVWQUxJREFUSU9OX0xPR19NQVhfUEFHRVMpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIkNhY2hlQnVja2V0XCIsICgpID0+IHtcbiAgY29uc3Qgc2VuZCA9IGplc3QuZm4oKTtcbiAgbGV0IGJ1Y2tldDogQ2FjaGVCdWNrZXQ7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzZXQoKTtcbiAgICAoUzNDbGllbnQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHsgc2VuZCB9KSk7XG4gICAgYnVja2V0ID0gbmV3IENhY2hlQnVja2V0KG5ldyBTM0NsaWVudCh7fSksIFwiYmt0XCIpO1xuICB9KTtcblxuICBpdChcInJlYWRzIGFuIG9iamVjdCBhcyB0ZXh0XCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IHsgdHJhbnNmb3JtVG9TdHJpbmc6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShcInt9XCIpIH0sXG4gICAgICBDb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgfSk7XG4gICAgZXhwZWN0KGF3YWl0IGJ1Y2tldC5nZXQoXCJrXCIpKS50b0JlKFwie31cIik7XG4gICAgZXhwZWN0KGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIEdldE9iamVjdENvbW1hbmQpKS50b0VxdWFsKHtcbiAgICAgIEJ1Y2tldDogXCJia3RcIixcbiAgICAgIEtleTogXCJrXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwiYW5zd2VycyBhIG1pc3Npbmcgb2JqZWN0IG9yIGJvZHkgd2l0aCB1bmRlZmluZWQsIGFuZCB0aHJvd3MgdGhlIHJlc3RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1JlamVjdGVkVmFsdWVPbmNlKFxuICAgICAgbmV3IE5vU3VjaEtleSh7IG1lc3NhZ2U6IFwibWlzc2luZ1wiLCAkbWV0YWRhdGE6IHt9IH0pLFxuICAgICk7XG4gICAgZXhwZWN0KGF3YWl0IGJ1Y2tldC5nZXQoXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBCb2R5OiBudWxsIH0pO1xuICAgIGV4cGVjdChhd2FpdCBidWNrZXQuZ2V0KFwia1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIHNlbmQubW9ja1JlamVjdGVkVmFsdWVPbmNlKG5ldyBFcnJvcihcIkFjY2Vzc0RlbmllZFwiKSk7XG4gICAgYXdhaXQgZXhwZWN0KGJ1Y2tldC5nZXQoXCJrXCIpKS5yZWplY3RzLnRvVGhyb3coXCJBY2Nlc3NEZW5pZWRcIik7XG4gIH0pO1xuXG4gIGl0KFwid3JpdGVzIEpTT05cIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe30pO1xuICAgIGF3YWl0IGJ1Y2tldC5wdXRKc29uKFwia1wiLCBcInt9XCIpO1xuICAgIGV4cGVjdChjb21tYW5kSW5wdXQoc2VuZC5tb2NrLmNhbGxzWzBdWzBdLCBQdXRPYmplY3RDb21tYW5kKSkudG9FcXVhbCh7XG4gICAgICBCdWNrZXQ6IFwiYmt0XCIsXG4gICAgICBLZXk6IFwia1wiLFxuICAgICAgQm9keTogXCJ7fVwiLFxuICAgICAgQ29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlRyYWNrZWRUYWdNYXJrZXJzXCIsICgpID0+IHtcbiAgaXQoXCJkb2VzIG5vdCBza2lwIGEgcm93IGZvciBhbiB1bnRyYWNrZWQgdGFnIHRoYXQgaXRzIGZpcnN0IHJlYWQgbWlzc2VkXCIsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUaGUgd3JpdGVyIHB1dHMgdGhlIGxvZyByb3cgYW5kIHRoZSBtYXJrZXIgYXQgdGhlIHNhbWUgdGltZSwgYW5kIHRoZVxuICAgIC8vIG1hcmtlciByZWFkIGlzIGV2ZW50dWFsbHkgY29uc2lzdGVudDogYHJlZnJlc2hgIGNhbiBzZWUgdGhlIHJvdywgdGhlblxuICAgIC8vIGBlbnN1cmVgIHJlYWQgdGhlIG1hcmtlciBmcm9tIGJlZm9yZSBpdC4gTWFya2VkIGFwcGxpZWQgd2hpbGUgdGhlIHRhZ1xuICAgIC8vIHdhcyB1bnRyYWNrZWQsIHRoZSByb3cgd2FzIHNraXBwZWQgYnkgZXZlcnkgcXVlcnkgdGhlIGxvb2tiYWNrIHJldHVybmVkXG4gICAgLy8gaXQgdG8sIGFuZCB0aGUgaW5zdGFuY2Ugc2VydmVkIHRoZSBzdGFsZSBlbnRyeSB1bnRpbCB0aGUgcm9sbGluZyByZS1yZWFkLlxuICAgIGxldCBjbG9jayA9IDFfMDAwXzAwMDtcbiAgICBjb25zdCByZXZhbGlkYXRlZEF0ID0gOTk5XzAwMDtcbiAgICBjb25zdCByb3c6IFJldmFsaWRhdGlvbkxvZ1JvdyA9IHtcbiAgICAgIHNrOiBgJHtTdHJpbmcoY2xvY2spLnBhZFN0YXJ0KDE1LCBcIjBcIil9I3Bvc3RzYCxcbiAgICAgIGF0OiBjbG9jayxcbiAgICAgIHRhZzogXCJwb3N0c1wiLFxuICAgICAgbWFya2VyOiB7IHJldmFsaWRhdGVkQXQgfSxcbiAgICB9O1xuICAgIGNvbnN0IHF1ZXJ5ID0gamVzdC5mbihhc3luYyAoc2luY2U6IG51bWJlcikgPT4gKHtcbiAgICAgIHJvd3M6IFtyb3ddLmZpbHRlcigocikgPT4gci5hdCA+PSBzaW5jZSksXG4gICAgICB0cnVuY2F0ZWQ6IGZhbHNlLFxuICAgIH0pKTtcbiAgICAvLyBBIHJlcGxpY2EgdGhhdCBoYXMgbm90IHNlZW4gdGhlIHdyaXRlIHlldC5cbiAgICBjb25zdCByZWFkID0gamVzdC5mbihhc3luYyAoKSA9PiBuZXcgTWFwPHN0cmluZywgVGFnTWFya2VyPigpKTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZCB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHsgcXVlcnkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgICAgcmFuZG9tOiAoKSA9PiAwLFxuICAgIH0pO1xuICAgIC8vIFNvbWV0aGluZyB0cmFja2VkLCBzbyB0aGUgcmVmcmVzaCBxdWVyaWVzIHRoZSBsb2cuXG4gICAgYXdhaXQgbWFya2Vycy5lbnN1cmUoW1wib3RoZXJcIl0pO1xuXG4gICAgY2xvY2sgKz0gMTAwMDtcbiAgICBhd2FpdCBtYXJrZXJzLnJlZnJlc2goKTtcbiAgICBhd2FpdCBtYXJrZXJzLmVuc3VyZShbXCJwb3N0c1wiXSk7XG4gICAgZXhwZWN0KG1hcmtlcnMuZ2V0KFwicG9zdHNcIikpLnRvRXF1YWwoe30pO1xuXG4gICAgY2xvY2sgKz0gMTAwMDtcbiAgICBhd2FpdCBtYXJrZXJzLnJlZnJlc2goKTtcbiAgICBleHBlY3QocXVlcnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgICBleHBlY3QobWFya2Vycy5nZXQoXCJwb3N0c1wiKSkudG9FcXVhbCh7IHJldmFsaWRhdGVkQXQgfSk7XG4gICAgLy8gT25seSB0aGUgb25lIHJlYWQgZWFjaCB0YWcncyBmaXJzdCB1c2UgY29zdHMuXG4gICAgZXhwZWN0KHJlYWQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
1099
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWNhY2hlLXN0b3JlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlci9hd3MtY2FjaGUtc3RvcmUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQUFzRDtBQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBRXRDLHVEQUFxRDtBQUNyRCw4REFNa0M7QUFDbEMsa0RBSzRCO0FBQzVCLHVEQW9CMkI7QUFDM0IsMERBR2lDO0FBRWpDLGdFQUFnRTtBQUNoRSxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQWdCLEVBQUUsSUFBYSxFQUFFLEVBQUU7SUFDdkQsTUFBTSxJQUFJLEdBQUcsSUFBaUIsQ0FBQztJQUMvQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLENBQUMsQ0FBQztBQUVGLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUU7SUFDckMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUN4QixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsT0FBTyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDSCxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ1osT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsR0FBRyxFQUFFO1FBQ2xELE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLEdBQUcsUUFBUSxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxHQUFHLENB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LEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDeEQsZ0RBQWdEO1FBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5qZXN0Lm1vY2soXCJAYXdzLXNkay9jbGllbnQtczNcIik7XG5qZXN0Lm1vY2soXCJAYXdzLXNkay9jbGllbnQtZHluYW1vZGJcIik7XG5cbmltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlIH0gZnJvbSBcIm5vZGU6YXN5bmNfaG9va3NcIjtcbmltcG9ydCB7XG4gIEJhdGNoR2V0SXRlbUNvbW1hbmQsXG4gIER5bmFtb0RCQ2xpZW50LFxuICBQdXRJdGVtQ29tbWFuZCxcbiAgUXVlcnlDb21tYW5kLFxuICBVcGRhdGVJdGVtQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiO1xuaW1wb3J0IHtcbiAgR2V0T2JqZWN0Q29tbWFuZCxcbiAgTm9TdWNoS2V5LFxuICBQdXRPYmplY3RDb21tYW5kLFxuICBTM0NsaWVudCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuaW1wb3J0IHtcbiAgYnVpbGRTM0tleSxcbiAgQ2FjaGVCdWNrZXQsXG4gIGhhc2hlZFRhZyxcbiAgbWFya2VyQ2xvY2ssXG4gIG1hcmtlckZvcixcbiAgbWFya2VyU3RhdGUsXG4gIG1hcmtlclVwZGF0ZSxcbiAgbWVyZ2VNYXJrZXJzLFxuICByZXNvbHZlQXdzQ2FjaGVDb25maWcsXG4gIE1BWF9SRVZBTElEQVRJT05fTE9HX0dBUF9NUyxcbiAgUkVWQUxJREFUSU9OX0xPR19NQVhfUEFHRVMsXG4gIFJFVkFMSURBVElPTl9MT0dfVFRMX01TLFxuICBUQUdfUkVGUkVTSF9HUkFDRV9NUyxcbiAgUmV2YWxpZGF0aW9uTG9nLFxuICBSZXZhbGlkYXRpb25Mb2dSb3csXG4gIFRhZ01hcmtlcixcbiAgVGFnTWFya2VyVGFibGUsXG4gIFRyYWNrZWRUYWdNYXJrZXJzLFxuICB1c2VDYWNoZVMzS2V5LFxufSBmcm9tIFwiLi9hd3MtY2FjaGUtc3RvcmVcIjtcbmltcG9ydCB7XG4gIGNhcHR1cmVPdXRzaWRlUmVxdWVzdCxcbiAgT1VUU0lERV9SRVFVRVNUX1NZTUJPTCxcbn0gZnJvbSBcIi4uL3J1bnRpbWUvdGFnLW1hbmlmZXN0XCI7XG5cbi8qKiBUaGUgaW5wdXQgYW4gYXV0b21vY2tlZCBTREsgY29tbWFuZCB3YXMgY29uc3RydWN0ZWQgd2l0aC4gKi9cbmNvbnN0IGNvbW1hbmRJbnB1dCA9IChjb21tYW5kOiB1bmtub3duLCB0eXBlOiB1bmtub3duKSA9PiB7XG4gIGNvbnN0IG1vY2sgPSB0eXBlIGFzIGplc3QuTW9jaztcbiAgcmV0dXJuIG1vY2subW9jay5jYWxsc1ttb2NrLm1vY2suaW5zdGFuY2VzLmluZGV4T2YoY29tbWFuZCldWzBdO1xufTtcblxuZGVzY3JpYmUoXCJyZXNvbHZlQXdzQ2FjaGVDb25maWdcIiwgKCkgPT4ge1xuICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudjtcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgcHJvY2Vzcy5lbnYgPSB7IC4uLmVudiB9O1xuICB9KTtcbiAgYWZ0ZXJBbGwoKCkgPT4ge1xuICAgIHByb2Nlc3MuZW52ID0gZW52O1xuICB9KTtcblxuICBpdChcInJlYWRzIHRoZSBlbnZpcm9ubWVudCB0aGUgY29uc3RydWN0cyBzZXRcIiwgKCkgPT4ge1xuICAgIHByb2Nlc3MuZW52LkNES19ORVhUSlNfQ0FDSEVfQlVDS0VUX05BTUUgPSBcImJ1Y2tldFwiO1xuICAgIHByb2Nlc3MuZW52LkNES19ORVhUSlNfUkVWQUxJREFUSU9OX1RBQkxFX05BTUUgPSBcInRhYmxlXCI7XG4gICAgcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19CVUlMRF9JRCA9IFwiYnVpbGRcIjtcbiAgICBwcm9jZXNzLmVudi5BV1NfUkVHSU9OID0gXCJldS13ZXN0LTFcIjtcbiAgICBleHBlY3QocmVzb2x2ZUF3c0NhY2hlQ29uZmlnKCkpLnRvRXF1YWwoe1xuICAgICAgYnVja2V0TmFtZTogXCJidWNrZXRcIixcbiAgICAgIHRhYmxlTmFtZTogXCJ0YWJsZVwiLFxuICAgICAgYnVpbGRJZDogXCJidWlsZFwiLFxuICAgICAgcmVnaW9uOiBcImV1LXdlc3QtMVwiLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcInJlcG9ydHMgd2hhdCBpcyB1bnNldCBhcyBlbXB0eVwiLCAoKSA9PiB7XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNES19ORVhUSlNfQ0FDSEVfQlVDS0VUX05BTUU7XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNES19ORVhUSlNfUkVWQUxJREFUSU9OX1RBQkxFX05BTUU7XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNES19ORVhUSlNfQlVJTERfSUQ7XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkFXU19SRUdJT047XG4gICAgZXhwZWN0KHJlc29sdmVBd3NDYWNoZUNvbmZpZygpKS50b0VxdWFsKHtcbiAgICAgIGJ1Y2tldE5hbWU6IFwiXCIsXG4gICAgICB0YWJsZU5hbWU6IFwiXCIsXG4gICAgICBidWlsZElkOiBcIlwiLFxuICAgICAgcmVnaW9uOiBcInVzLWVhc3QtMVwiLFxuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlMzIGtleXNcIiwgKCkgPT4ge1xuICBpdChcImtlZXBzIHRoZSBpbmNyZW1lbnRhbCBjYWNoZSdzIHtidWlsZElkfS97a2V5fS5qc29uIGNvbnZlbnRpb25cIiwgKCkgPT4ge1xuICAgIGV4cGVjdChidWlsZFMzS2V5KFwiYlwiLCBcIi9cIikpLnRvQmUoXCJiL2luZGV4Lmpzb25cIik7XG4gICAgZXhwZWN0KGJ1aWxkUzNLZXkoXCJiXCIsIFwiXCIpKS50b0JlKFwiYi9pbmRleC5qc29uXCIpO1xuICAgIGV4cGVjdChidWlsZFMzS2V5KFwiYlwiLCBcIi9ibG9nL3Bvc3RcIikpLnRvQmUoXCJiL2Jsb2cvcG9zdC5qc29uXCIpO1xuICAgIGV4cGVjdChidWlsZFMzS2V5KFwiYlwiLCBcImFiYzEyM1wiKSkudG9CZShcImIvYWJjMTIzLmpzb25cIik7XG4gIH0pO1xuXG4gIGl0KFwicHV0cyAndXNlIGNhY2hlJyBlbnRyaWVzIHdoZXJlIG5vIGluY3JlbWVudGFsIGtleSBjYW4gbGFuZFwiLCAoKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gdXNlQ2FjaGVTM0tleShcImJcIiwgXCJmXCIucmVwZWF0KDY0KSk7XG4gICAgZXhwZWN0KGtleSkudG9CZShgYi9fdXNlLWNhY2hlLyR7XCJmXCIucmVwZWF0KDY0KX0uZW50cnlgKTtcbiAgICAvLyBFdmVuIGEgcm91dGUgc3BlbGxlZCBsaWtlIHRoZSB1c2UtY2FjaGUga2V5IGdldHMgYC5qc29uYCBhcHBlbmRlZC5cbiAgICBleHBlY3QoYnVpbGRTM0tleShcImJcIiwgYC9fdXNlLWNhY2hlLyR7XCJmXCIucmVwZWF0KDY0KX0uZW50cnlgKSkubm90LnRvQmUoXG4gICAgICBrZXksXG4gICAgKTtcbiAgICBleHBlY3Qoa2V5LmVuZHNXaXRoKFwiLmpzb25cIikpLnRvQmUoZmFsc2UpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcInRhZyBtYXJrZXJzXCIsICgpID0+IHtcbiAgaXQoXCJ3cml0ZXMgd2hhdCBtYXJrZXJGb3IgYXBwbGllcyBsb2NhbGx5XCIsICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IGR1cmF0aW9ucyBvZiBbdW5kZWZpbmVkLCB7fSwgeyBleHBpcmU6IDYwIH1dKSB7XG4gICAgICBjb25zdCB1cGRhdGUgPSBtYXJrZXJVcGRhdGUoMTAwMCwgZHVyYXRpb25zKTtcbiAgICAgIGNvbnN0IGxvY2FsID0gbWFya2VyRm9yKDEwMDAsIGR1cmF0aW9ucyk7XG4gICAgICBjb25zdCB3cml0dGVuOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgIHVwZGF0ZS5FeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzISxcbiAgICAgICkpIHtcbiAgICAgICAgd3JpdHRlbltuYW1lLnNsaWNlKDEpXSA9IE51bWJlcih2YWx1ZS5OKTtcbiAgICAgIH1cbiAgICAgIGV4cGVjdCh3cml0dGVuKS50b0VxdWFsKGxvY2FsKTtcbiAgICB9XG4gICAgZXhwZWN0KG1hcmtlckZvcigxMDAwLCB7IGV4cGlyZTogNjAgfSkpLnRvRXF1YWwoe1xuICAgICAgc3RhbGVBdDogMTAwMCxcbiAgICAgIGV4cGlyZWRBdDogNjEwMDAsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwia2VlcHMgYW4gZWFybGllciBleHBpcmVkQXQgYSBwcm9maWxlIHdpdGggbm8gZXhwaXJlIGxlYXZlc1wiLCAoKSA9PiB7XG4gICAgLy8gVGhlIHJvdyBrZWVwcyBpdCAoYFNFVCBzdGFsZUF0YCBvbmx5KSwgc28gYW4gaW5zdGFuY2UgbGVhcm5pbmcgb2YgdGhlXG4gICAgLy8gc2Vjb25kIHJldmFsaWRhdGlvbiBmcm9tIHRoZSBsb2cgaGFzIHRvIGtlZXAgaXQgdG9vLlxuICAgIGNvbnN0IGZpcnN0ID0gbWFya2VyRm9yKDEwMDAsIHsgZXhwaXJlOiA2MCB9KTtcbiAgICBjb25zdCBzZWNvbmQgPSBtYXJrZXJGb3IoMjAwMCwge30pO1xuICAgIGV4cGVjdChtZXJnZU1hcmtlcnMoZmlyc3QsIHNlY29uZCkpLnRvRXF1YWwoe1xuICAgICAgc3RhbGVBdDogMjAwMCxcbiAgICAgIGV4cGlyZWRBdDogNjEwMDAsXG4gICAgfSk7XG4gICAgZXhwZWN0KG1lcmdlTWFya2VycyhzZWNvbmQsIGZpcnN0KSkudG9FcXVhbCh7XG4gICAgICBzdGFsZUF0OiAyMDAwLFxuICAgICAgZXhwaXJlZEF0OiA2MTAwMCxcbiAgICB9KTtcbiAgICAvLyBBIG5ld2VyIGBleHBpcmVgIHN0aWxsIHJlcGxhY2VzIGl0LlxuICAgIGV4cGVjdChtZXJnZU1hcmtlcnMoZmlyc3QsIG1hcmtlckZvcigyMDAwLCB7IGV4cGlyZTogMSB9KSkpLnRvRXF1YWwoe1xuICAgICAgc3RhbGVBdDogMjAwMCxcbiAgICAgIGV4cGlyZWRBdDogMzAwMCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJqdWRnZXMgYW4gZW50cnkgdGhlIHdheSB0aGUgaW5jcmVtZW50YWwgY2FjaGUgYWx3YXlzIGhhc1wiLCAoKSA9PiB7XG4gICAgLy8gRXhwaXJlZCBvdXRyaWdodCBhZnRlciBjcmVhdGlvbi5cbiAgICBleHBlY3QobWFya2VyU3RhdGUoeyByZXZhbGlkYXRlZEF0OiAyMCB9LCAxMCwgMzApKS50b0JlKFwiZXhwaXJlZFwiKTtcbiAgICAvLyBSZXZhbGlkYXRlZCBiZWZvcmUgdGhlIGVudHJ5IHdhcyBjcmVhdGVkOiBubyBlZmZlY3QuXG4gICAgZXhwZWN0KG1hcmtlclN0YXRlKHsgcmV2YWxpZGF0ZWRBdDogNSB9LCAxMCwgMzApKS50b0JlKFwiZnJlc2hcIik7XG4gICAgLy8gQSBwcm9maWxlOiBzdGFsZSBub3csIGV4cGlyZWQgb25jZSBgZXhwaXJlZEF0YCBwYXNzZXMuXG4gICAgZXhwZWN0KG1hcmtlclN0YXRlKHsgc3RhbGVBdDogMjAsIGV4cGlyZWRBdDogNTAgfSwgMTAsIDMwKSkudG9CZShcInN0YWxlXCIpO1xuICAgIGV4cGVjdChtYXJrZXJTdGF0ZSh7IHN0YWxlQXQ6IDIwLCBleHBpcmVkQXQ6IDUwIH0sIDEwLCA2MCkpLnRvQmUoXCJleHBpcmVkXCIpO1xuICAgIC8vIGBleHBpcmU6IDBgOiBzdGFsZSBhbmQgZXhwaXJlZCBhdCBvbmNlLlxuICAgIGV4cGVjdChtYXJrZXJTdGF0ZSh7IHN0YWxlQXQ6IDIwLCBleHBpcmVkQXQ6IDIwIH0sIDEwLCAzMCkpLnRvQmUoXCJleHBpcmVkXCIpO1xuICAgIGV4cGVjdChtYXJrZXJTdGF0ZSh7fSwgMTAsIDMwKSkudG9CZShcImZyZXNoXCIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlRhZ01hcmtlclRhYmxlXCIsICgpID0+IHtcbiAgY29uc3Qgc2VuZCA9IGplc3QuZm4oKTtcbiAgbGV0IHRhYmxlOiBUYWdNYXJrZXJUYWJsZTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNldCgpO1xuICAgIChEeW5hbW9EQkNsaWVudCBhcyBqZXN0Lk1vY2spLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiAoeyBzZW5kIH0pKTtcbiAgICB0YWJsZSA9IG5ldyBUYWdNYXJrZXJUYWJsZShuZXcgRHluYW1vREJDbGllbnQoe30pLCBcInRibFwiLCBcImJ1aWxkXCIpO1xuICB9KTtcblxuICBpdChcIndyaXRlcyB0aGUgbWFya2VyIHJvdyB1bmRlciB0aGUgYnVpbGRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe30pO1xuICAgIGF3YWl0IHRhYmxlLndyaXRlKFwicG9zdHNcIiwgMTAwMCwgeyBleHBpcmU6IDEgfSk7XG4gICAgY29uc3QgaW5wdXQgPSBjb21tYW5kSW5wdXQoc2VuZC5tb2NrLmNhbGxzWzBdWzBdLCBVcGRhdGVJdGVtQ29tbWFuZCk7XG4gICAgZXhwZWN0KGlucHV0KS50b0VxdWFsKHtcbiAgICAgIFRhYmxlTmFtZTogXCJ0YmxcIixcbiAgICAgIEtleTogeyBwazogeyBTOiBcImJ1aWxkXCIgfSwgc2s6IHsgUzogXCJwb3N0c1wiIH0gfSxcbiAgICAgIFVwZGF0ZUV4cHJlc3Npb246IFwiU0VUIHN0YWxlQXQgPSA6c3RhbGVBdCwgZXhwaXJlZEF0ID0gOmV4cGlyZWRBdFwiLFxuICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICBcIjpzdGFsZUF0XCI6IHsgTjogXCIxMDAwXCIgfSxcbiAgICAgICAgXCI6ZXhwaXJlZEF0XCI6IHsgTjogXCIyMDAwXCIgfSxcbiAgICAgIH0sXG4gICAgICBSZXR1cm5WYWx1ZXM6IFwiQUxMX05FV1wiLFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcInJlYWRzIG1hcmtlcnMgaW4gYmF0Y2hlcyBvZiAxMDAgYW5kIHBhcnNlcyB0aGVtXCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kLm1vY2tJbXBsZW1lbnRhdGlvbigoY29tbWFuZDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgeyBSZXF1ZXN0SXRlbXMgfSA9IGNvbW1hbmRJbnB1dChjb21tYW5kLCBCYXRjaEdldEl0ZW1Db21tYW5kKTtcbiAgICAgIGNvbnN0IGtleXMgPSBSZXF1ZXN0SXRlbXMudGJsLktleXMgYXMgeyBzazogeyBTOiBzdHJpbmcgfSB9W107XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgUmVzcG9uc2VzOiB7XG4gICAgICAgICAgdGJsOiBrZXlzXG4gICAgICAgICAgICAuZmlsdGVyKCh7IHNrIH0pID0+IHNrLlMuZW5kc1dpdGgoXCIwXCIpKVxuICAgICAgICAgICAgLm1hcCgoeyBzayB9KSA9PiAoeyBzaywgcmV2YWxpZGF0ZWRBdDogeyBOOiBcIjdcIiB9IH0pKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHRhZ3MgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxNTAgfSwgKF8sIGkpID0+IGB0JHtpfWApO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBhd2FpdCB0YWJsZS5yZWFkKFsuLi50YWdzLCBcInQwXCJdKTtcbiAgICBleHBlY3Qoc2VuZCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgIGV4cGVjdChtYXJrZXJzLnNpemUpLnRvQmUoMTUpO1xuICAgIGV4cGVjdChtYXJrZXJzLmdldChcInQxMFwiKSkudG9FcXVhbCh7XG4gICAgICByZXZhbGlkYXRlZEF0OiA3LFxuICAgICAgc3RhbGVBdDogdW5kZWZpbmVkLFxuICAgICAgZXhwaXJlZEF0OiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwia2V5cyBhIHRhZyBwYXN0IHRoZSBzb3J0IGtleSBsaW1pdCBieSBpdHMgaGFzaCwgYW5kIHJlYWRzIGl0IGJhY2sgYXMgdGhlIHRhZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gYHJldmFsaWRhdGVQYXRoYCBvbiBhIGxvbmcgcGF0aDogYW4gaW1wbGljaXQgdGFnIGlzIGFzIGxvbmcgYXMgdGhlIHBhdGguXG4gICAgY29uc3QgdGFnID0gYF9OX1RfLyR7XCJwXCIucmVwZWF0KDExMDApfWA7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSk7XG4gICAgYXdhaXQgdGFibGUud3JpdGUodGFnLCAxMDAwLCB1bmRlZmluZWQpO1xuICAgIGNvbnN0IHdyaXR0ZW4gPSBjb21tYW5kSW5wdXQoc2VuZC5tb2NrLmNhbGxzWzBdWzBdLCBVcGRhdGVJdGVtQ29tbWFuZCk7XG4gICAgZXhwZWN0KHdyaXR0ZW4uS2V5LnNrLlMpLnRvQmUoaGFzaGVkVGFnKHRhZykpO1xuICAgIGV4cGVjdChoYXNoZWRUYWcodGFnKSkudG9NYXRjaCgvXiNbMC05YS1mXXs2NH0kLyk7XG5cbiAgICBzZW5kLm1vY2tSZXNldCgpO1xuICAgIHNlbmQubW9ja0ltcGxlbWVudGF0aW9uKChjb21tYW5kOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCB7IFJlcXVlc3RJdGVtcyB9ID0gY29tbWFuZElucHV0KGNvbW1hbmQsIEJhdGNoR2V0SXRlbUNvbW1hbmQpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIFJlc3BvbnNlczoge1xuICAgICAgICAgIHRibDogUmVxdWVzdEl0ZW1zLnRibC5LZXlzLm1hcCgoeyBzayB9OiB7IHNrOiB1bmtub3duIH0pID0+ICh7XG4gICAgICAgICAgICBzayxcbiAgICAgICAgICAgIHJldmFsaWRhdGVkQXQ6IHsgTjogXCI3XCIgfSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBtYXJrZXJzID0gYXdhaXQgdGFibGUucmVhZChbdGFnLCBcInNob3J0XCJdKTtcbiAgICBleHBlY3QoWy4uLm1hcmtlcnMua2V5cygpXS5zb3J0KCkpLnRvRXF1YWwoW1wic2hvcnRcIiwgdGFnXS5zb3J0KCkpO1xuICB9KTtcblxuICAvLyBBIHJlYWQtYmFjayBhZnRlciB0aGUgd3JpdGUgaXMgZXZlbnR1YWxseSBjb25zaXN0ZW50LCBzbyBpdCBjYW4gcmV0dXJuXG4gIC8vIHRoZSBtYXJrZXIgZnJvbSBiZWZvcmUgaXQ6IHRoZSB3cml0ZXIgdHJhY2tzIHdoYXQgdGhlIHdyaXRlIHJldHVybmVkLlxuICBpdChcInJldHVybnMgdGhlIHJvdyBhcyB0aGUgd3JpdGUgbGVmdCBpdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2Uoe1xuICAgICAgQXR0cmlidXRlczoge1xuICAgICAgICBzazogeyBTOiBcInBvc3RzXCIgfSxcbiAgICAgICAgcmV2YWxpZGF0ZWRBdDogeyBOOiBcIjUwMDBcIiB9LFxuICAgICAgICBzdGFsZUF0OiB7IE46IFwiMTBcIiB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBleHBlY3QoYXdhaXQgdGFibGUud3JpdGUoXCJwb3N0c1wiLCA1MDAwLCB1bmRlZmluZWQpKS50b0VxdWFsKHtcbiAgICAgIHJldmFsaWRhdGVkQXQ6IDUwMDAsXG4gICAgICBzdGFsZUF0OiAxMCxcbiAgICAgIGV4cGlyZWRBdDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHt9KTtcbiAgICBleHBlY3QoYXdhaXQgdGFibGUud3JpdGUoXCJwb3N0c1wiLCA2MDAwLCB1bmRlZmluZWQpKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0KFwiYXNrcyBhZ2FpbiBmb3IgdW5wcm9jZXNzZWQga2V5cywgYW5kIGdpdmVzIHVwIGFmdGVyIHRocmVlIHRyaWVzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB1bnByb2Nlc3NlZCA9IHtcbiAgICAgIFVucHJvY2Vzc2VkS2V5czoge1xuICAgICAgICB0Ymw6IHsgS2V5czogW3sgcGs6IHsgUzogXCJidWlsZFwiIH0sIHNrOiB7IFM6IFwiYVwiIH0gfV0gfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh1bnByb2Nlc3NlZCkubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHtcbiAgICAgIFJlc3BvbnNlczogeyB0Ymw6IFt7IHNrOiB7IFM6IFwiYVwiIH0sIHN0YWxlQXQ6IHsgTjogXCIzXCIgfSB9XSB9LFxuICAgIH0pO1xuICAgIGV4cGVjdCgoYXdhaXQgdGFibGUucmVhZChbXCJhXCJdKSkuZ2V0KFwiYVwiKT8uc3RhbGVBdCkudG9CZSgzKTtcblxuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUodW5wcm9jZXNzZWQpO1xuICAgIGF3YWl0IGV4cGVjdCh0YWJsZS5yZWFkKFtcImFcIl0pKS5yZWplY3RzLnRvVGhyb3coL3VucmVhZCBhZnRlciByZXRyeWluZy8pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlJldmFsaWRhdGlvbkxvZ1wiLCAoKSA9PiB7XG4gIGNvbnN0IHNlbmQgPSBqZXN0LmZuKCk7XG4gIGxldCBsb2c6IFJldmFsaWRhdGlvbkxvZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNldCgpO1xuICAgIChEeW5hbW9EQkNsaWVudCBhcyBqZXN0Lk1vY2spLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiAoeyBzZW5kIH0pKTtcbiAgICBsb2cgPSBuZXcgUmV2YWxpZGF0aW9uTG9nKG5ldyBEeW5hbW9EQkNsaWVudCh7fSksIFwidGJsXCIsIFwiYnVpbGRcIik7XG4gIH0pO1xuXG4gIGl0KFwicHV0cyBvbmUgcm93IHBlciByZXZhbGlkYXRpb24gdW5kZXIgdGhlIGJ1aWxkJ3MgbG9nLCB3aXRoIGEgVFRMXCIsIGFzeW5jICgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHt9KTtcbiAgICBjb25zdCBhdCA9IDFfNzI3XzAwMF8wMDBfMTIzO1xuICAgIGF3YWl0IGxvZy5wdXQoXCJ1c2VyIzQyXCIsIGF0LCB7IHN0YWxlQXQ6IDUsIGV4cGlyZWRBdDogNiB9KTtcbiAgICBleHBlY3QoY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgUHV0SXRlbUNvbW1hbmQpKS50b0VxdWFsKHtcbiAgICAgIFRhYmxlTmFtZTogXCJ0YmxcIixcbiAgICAgIEl0ZW06IHtcbiAgICAgICAgcGs6IHsgUzogXCJidWlsZCNsb2dcIiB9LFxuICAgICAgICBzazogeyBTOiBcIjAwMTcyNzAwMDAwMDEyMyN1c2VyIzQyXCIgfSxcbiAgICAgICAgdHRsOiB7IE46IFN0cmluZyhNYXRoLmNlaWwoKGF0ICsgUkVWQUxJREFUSU9OX0xPR19UVExfTVMpIC8gMTAwMCkpIH0sXG4gICAgICAgIHN0YWxlQXQ6IHsgTjogXCI1XCIgfSxcbiAgICAgICAgZXhwaXJlZEF0OiB7IE46IFwiNlwiIH0sXG4gICAgICB9LFxuICAgICAgQ29uZGl0aW9uRXhwcmVzc2lvbjogXCJhdHRyaWJ1dGVfbm90X2V4aXN0cyhzaylcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJtb3ZlcyBhIHJvdyB0byB0aGUgbmV4dCBtaWxsaXNlY29uZCByYXRoZXIgdGhhbiBvdmVyd3JpdGUgYW5vdGhlciByZXZhbGlkYXRpb25cIiwgYXN5bmMgKCkgPT4ge1xuICAgIC8vIGB1cGRhdGVUYWcoJ3gnKWAgYW5kIGByZXZhbGlkYXRlVGFnKCd4JywgJ21heCcpYCBpbiBvbmUgbWlsbGlzZWNvbmQuXG4gICAgY29uc3QgdGFrZW4gPSBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcInRha2VuXCIpLCB7XG4gICAgICBuYW1lOiBcIkNvbmRpdGlvbmFsQ2hlY2tGYWlsZWRFeGNlcHRpb25cIixcbiAgICB9KTtcbiAgICBzZW5kLm1vY2tSZWplY3RlZFZhbHVlT25jZSh0YWtlbikubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHt9KTtcbiAgICBhd2FpdCBsb2cucHV0KFwieFwiLCAxMDAwLjUsIHsgcmV2YWxpZGF0ZWRBdDogNSB9KTtcbiAgICBleHBlY3QoXG4gICAgICBzZW5kLm1vY2suY2FsbHMubWFwKFxuICAgICAgICAoW2NvbW1hbmRdKSA9PiBjb21tYW5kSW5wdXQoY29tbWFuZCwgUHV0SXRlbUNvbW1hbmQpLkl0ZW0uc2suUyxcbiAgICAgICksXG4gICAgKS50b0VxdWFsKFtcIjAwMDAwMDAwMDAwMTAwMCN4XCIsIFwiMDAwMDAwMDAwMDAxMDAxI3hcIl0pO1xuICB9KTtcblxuICBpdChcImdpdmVzIHVwIGFmdGVyIGEgYm91bmRlZCBudW1iZXIgb2YgY29sbGlzaW9ucywgYW5kIG9uIG90aGVyIGVycm9ycyBhdCBvbmNlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWtlbiA9IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwidGFrZW5cIiksIHtcbiAgICAgIG5hbWU6IFwiQ29uZGl0aW9uYWxDaGVja0ZhaWxlZEV4Y2VwdGlvblwiLFxuICAgIH0pO1xuICAgIHNlbmQubW9ja1JlamVjdGVkVmFsdWUodGFrZW4pO1xuICAgIGF3YWl0IGV4cGVjdChsb2cucHV0KFwieFwiLCAxMDAwLCB7fSkpLnJlamVjdHMudG9CZSh0YWtlbik7XG4gICAgZXhwZWN0KHNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcyg1KTtcblxuICAgIHNlbmQubW9ja1Jlc2V0KCk7XG4gICAgY29uc3QgdGhyb3R0bGVkID0gbmV3IEVycm9yKFwidGhyb3R0bGVkXCIpO1xuICAgIHNlbmQubW9ja1JlamVjdGVkVmFsdWUodGhyb3R0bGVkKTtcbiAgICBhd2FpdCBleHBlY3QobG9nLnB1dChcInhcIiwgMTAwMCwge30pKS5yZWplY3RzLnRvQmUodGhyb3R0bGVkKTtcbiAgICBleHBlY3Qoc2VuZCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICB9KTtcblxuICBpdChcInF1ZXJpZXMgZnJvbSBhIHplcm8tcGFkZGVkIGN1cnNvciBhbmQgcGFyc2VzIHRoZSB0YWcgYWZ0ZXIgaXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmRcbiAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2Uoe1xuICAgICAgICBJdGVtczogW1xuICAgICAgICAgIHsgc2s6IHsgUzogXCIwMDAwMDAwMDAwMDEwMDAjYVwiIH0sIHJldmFsaWRhdGVkQXQ6IHsgTjogXCI3XCIgfSB9LFxuICAgICAgICAgIHsgc2s6IHsgUzogXCJub3QgYSBsb2cgcm93XCIgfSB9LFxuICAgICAgICBdLFxuICAgICAgICBMYXN0RXZhbHVhdGVkS2V5OiB7IHBrOiB7IFM6IFwiYnVpbGQjbG9nXCIgfSwgc2s6IHsgUzogXCJ4XCIgfSB9LFxuICAgICAgfSlcbiAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2Uoe1xuICAgICAgICBJdGVtczogW3sgc2s6IHsgUzogXCIwMDAwMDAwMDAwMDIwMDAjdXNlciM0MlwiIH0sIHN0YWxlQXQ6IHsgTjogXCI4XCIgfSB9XSxcbiAgICAgIH0pO1xuICAgIGNvbnN0IHsgcm93cywgdHJ1bmNhdGVkIH0gPSBhd2FpdCBsb2cucXVlcnkoOTk5LjUpO1xuXG4gICAgY29uc3QgZmlyc3QgPSBjb21tYW5kSW5wdXQoc2VuZC5tb2NrLmNhbGxzWzBdWzBdLCBRdWVyeUNvbW1hbmQpO1xuICAgIGV4cGVjdChmaXJzdCkudG9NYXRjaE9iamVjdCh7XG4gICAgICBUYWJsZU5hbWU6IFwidGJsXCIsXG4gICAgICBLZXlDb25kaXRpb25FeHByZXNzaW9uOiBcInBrID0gOnBrIEFORCBzayA+PSA6c2luY2VcIixcbiAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgXCI6cGtcIjogeyBTOiBcImJ1aWxkI2xvZ1wiIH0sXG4gICAgICAgIFwiOnNpbmNlXCI6IHsgUzogXCIwMDAwMDAwMDAwMDA5OTlcIiB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICBjb21tYW5kSW5wdXQoc2VuZC5tb2NrLmNhbGxzWzFdWzBdLCBRdWVyeUNvbW1hbmQpLkV4Y2x1c2l2ZVN0YXJ0S2V5LFxuICAgICkudG9FcXVhbCh7IHBrOiB7IFM6IFwiYnVpbGQjbG9nXCIgfSwgc2s6IHsgUzogXCJ4XCIgfSB9KTtcbiAgICBleHBlY3QodHJ1bmNhdGVkKS50b0JlKGZhbHNlKTtcbiAgICBleHBlY3Qocm93cykudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIHNrOiBcIjAwMDAwMDAwMDAwMTAwMCNhXCIsXG4gICAgICAgIGF0OiAxMDAwLFxuICAgICAgICB0YWc6IFwiYVwiLFxuICAgICAgICBtYXJrZXI6IHsgcmV2YWxpZGF0ZWRBdDogNywgc3RhbGVBdDogdW5kZWZpbmVkLCBleHBpcmVkQXQ6IHVuZGVmaW5lZCB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2s6IFwiMDAwMDAwMDAwMDAyMDAwI3VzZXIjNDJcIixcbiAgICAgICAgYXQ6IDIwMDAsXG4gICAgICAgIHRhZzogXCJ1c2VyIzQyXCIsXG4gICAgICAgIG1hcmtlcjogeyByZXZhbGlkYXRlZEF0OiB1bmRlZmluZWQsIHN0YWxlQXQ6IDgsIGV4cGlyZWRBdDogdW5kZWZpbmVkIH0sXG4gICAgICB9LFxuICAgIF0pO1xuICB9KTtcblxuICBpdChcImhhc2hlcyBhIHRhZyB0b28gbG9uZyBmb3IgdGhlIHNvcnQga2V5LCBjYXJyeWluZyBpdCBpbiBsb25nVGFnXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWcgPSBgX05fVF8vJHtcInBcIi5yZXBlYXQoMTEwMCl9YDtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHt9KTtcbiAgICBhd2FpdCBsb2cucHV0KHRhZywgMTAwMCwgeyByZXZhbGlkYXRlZEF0OiA1IH0pO1xuICAgIGNvbnN0IHsgSXRlbSB9ID0gY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgUHV0SXRlbUNvbW1hbmQpO1xuICAgIGV4cGVjdChJdGVtLnNrLlMpLnRvQmUoYDAwMDAwMDAwMDAwMTAwMCMke2hhc2hlZFRhZyh0YWcpfWApO1xuICAgIGV4cGVjdChJdGVtLmxvbmdUYWcpLnRvRXF1YWwoeyBTOiB0YWcgfSk7XG5cbiAgICBzZW5kLm1vY2tSZXNldCgpO1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgSXRlbXM6IFt7IC4uLkl0ZW0gfV0gfSk7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCBsb2cucXVlcnkoMCk7XG4gICAgZXhwZWN0KHJvd3MubWFwKChyb3cpID0+IHJvdy50YWcpKS50b0VxdWFsKFt0YWddKTtcbiAgfSk7XG5cbiAgaXQoXCJzdG9wcyBhZnRlciBpdHMgcGFnZSBib3VuZCBhbmQgc2F5cyBzb1wiLCBhc3luYyAoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICBJdGVtczogW10sXG4gICAgICBMYXN0RXZhbHVhdGVkS2V5OiB7IHBrOiB7IFM6IFwiYnVpbGQjbG9nXCIgfSwgc2s6IHsgUzogXCJ4XCIgfSB9LFxuICAgIH0pO1xuICAgIGV4cGVjdCgoYXdhaXQgbG9nLnF1ZXJ5KDApKS50cnVuY2F0ZWQpLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KHNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcyhSRVZBTElEQVRJT05fTE9HX01BWF9QQUdFUyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiQ2FjaGVCdWNrZXRcIiwgKCkgPT4ge1xuICBjb25zdCBzZW5kID0gamVzdC5mbigpO1xuICBsZXQgYnVja2V0OiBDYWNoZUJ1Y2tldDtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBzZW5kLm1vY2tSZXNldCgpO1xuICAgIChTM0NsaWVudCBhcyBqZXN0Lk1vY2spLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiAoeyBzZW5kIH0pKTtcbiAgICBidWNrZXQgPSBuZXcgQ2FjaGVCdWNrZXQobmV3IFMzQ2xpZW50KHt9KSwgXCJia3RcIik7XG4gIH0pO1xuXG4gIGl0KFwicmVhZHMgYW4gb2JqZWN0IGFzIHRleHRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHNlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogeyB0cmFuc2Zvcm1Ub1N0cmluZzogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKFwie31cIikgfSxcbiAgICAgIENvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICB9KTtcbiAgICBleHBlY3QoYXdhaXQgYnVja2V0LmdldChcImtcIikpLnRvQmUoXCJ7fVwiKTtcbiAgICBleHBlY3QoY29tbWFuZElucHV0KHNlbmQubW9jay5jYWxsc1swXVswXSwgR2V0T2JqZWN0Q29tbWFuZCkpLnRvRXF1YWwoe1xuICAgICAgQnVja2V0OiBcImJrdFwiLFxuICAgICAgS2V5OiBcImtcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJhbnN3ZXJzIGEgbWlzc2luZyBvYmplY3Qgb3IgYm9keSB3aXRoIHVuZGVmaW5lZCwgYW5kIHRocm93cyB0aGUgcmVzdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVqZWN0ZWRWYWx1ZU9uY2UoXG4gICAgICBuZXcgTm9TdWNoS2V5KHsgbWVzc2FnZTogXCJtaXNzaW5nXCIsICRtZXRhZGF0YToge30gfSksXG4gICAgKTtcbiAgICBleHBlY3QoYXdhaXQgYnVja2V0LmdldChcImtcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBzZW5kLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IEJvZHk6IG51bGwgfSk7XG4gICAgZXhwZWN0KGF3YWl0IGJ1Y2tldC5nZXQoXCJrXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgc2VuZC5tb2NrUmVqZWN0ZWRWYWx1ZU9uY2UobmV3IEVycm9yKFwiQWNjZXNzRGVuaWVkXCIpKTtcbiAgICBhd2FpdCBleHBlY3QoYnVja2V0LmdldChcImtcIikpLnJlamVjdHMudG9UaHJvdyhcIkFjY2Vzc0RlbmllZFwiKTtcbiAgfSk7XG5cbiAgaXQoXCJ3cml0ZXMgSlNPTlwiLCBhc3luYyAoKSA9PiB7XG4gICAgc2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSk7XG4gICAgYXdhaXQgYnVja2V0LnB1dEpzb24oXCJrXCIsIFwie31cIik7XG4gICAgZXhwZWN0KGNvbW1hbmRJbnB1dChzZW5kLm1vY2suY2FsbHNbMF1bMF0sIFB1dE9iamVjdENvbW1hbmQpKS50b0VxdWFsKHtcbiAgICAgIEJ1Y2tldDogXCJia3RcIixcbiAgICAgIEtleTogXCJrXCIsXG4gICAgICBCb2R5OiBcInt9XCIsXG4gICAgICBDb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiVHJhY2tlZFRhZ01hcmtlcnNcIiwgKCkgPT4ge1xuICBpdChcIm5ldmVyIGNvdW50cyBhIHJlbmRlciB0aGUgcnVudGltZSBjYXVnaHQgdXAgYXMgYmVoaW5kXCIsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQ6IGplc3QuZm4oKSB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHsgcXVlcnk6IGplc3QuZm4oKSB9IGFzIHVua25vd24gYXMgUmV2YWxpZGF0aW9uTG9nLFxuICAgICAgcmVmcmVzaEludGVydmFsTXM6IDEwMDAsXG4gICAgICBjbG9jazogKCkgPT4gY2xvY2ssXG4gICAgfSk7XG4gICAgLy8gSnVzdCBzaG9ydCBvZiB0aGUgbGluZSBhcyB0aGUgcmVxdWVzdCBjYW1lIGluOiBgY2F0Y2hVcGAgbGV0cyBpdCBnby5cbiAgICBjbG9jayArPSAxMDAwICsgVEFHX1JFRlJFU0hfR1JBQ0VfTVM7XG4gICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kKS50b0JlKGZhbHNlKTtcbiAgICBhd2FpdCBtYXJrZXJzLmNhdGNoVXAoYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gSG93ZXZlciBsb25nIHRoZSByZW5kZXIgdGFrZXMsIGl0cyBsb29rdXBzIG5ldmVyIHdhaXQ6IHdhaXRpbmcgaXNcbiAgICAgIC8vIHdoYXQgdGhlIGNhdGNoLXVwIGJlZm9yZSBpdCB3YXMgZm9yLlxuICAgICAgY2xvY2sgKz0gMTAwO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kSW5SZW5kZXIpLnRvQmUoZmFsc2UpO1xuICAgICAgY2xvY2sgKz0gNjBfMDAwO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kSW5SZW5kZXIpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuICAgIC8vIE91dHNpZGUgaXQgLSBhIHJvdXRlIGhhbmRsZXIgYWxvbmdzaWRlLCBpbiBhIGNvbnRhaW5lciAtIGl0IHdhaXRzLlxuICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZEluUmVuZGVyKS50b0JlKHRydWUpO1xuICB9KTtcblxuICBpdChcInJ1bnMgaGFuZGxlciB3b3JrIG91dHNpZGUgdGhlIHJlcXVlc3QsIHN0aWxsIGNhdWdodCB1cFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcyBhcyB7IFtPVVRTSURFX1JFUVVFU1RfU1lNQk9MXT86IHVua25vd24gfTtcbiAgICBjYXB0dXJlT3V0c2lkZVJlcXVlc3QoKTtcbiAgICB0cnkge1xuICAgICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICAgIG1hcmtlcnM6IHsgcmVhZDogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgICAgbG9nOiB7IHF1ZXJ5OiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgICAgcmVmcmVzaEludGVydmFsTXM6IDEwMDAsXG4gICAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICAgIH0pO1xuICAgICAgLy8gU3RhbmRzIGluIGZvciBOZXh0LmpzJ3MgcmVxdWVzdCBzdG9yZSwgd2hpY2ggaXRzIGBEYXRlLm5vdygpYCBwYXRjaFxuICAgICAgLy8gcmVhZHMgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIGNhbGwgZW5kcyBhIHN0YXRpYyBzdGFnZS5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8c3RyaW5nPigpO1xuICAgICAgY2xvY2sgKz0gMTAwMCArIFRBR19SRUZSRVNIX0dSQUNFX01TO1xuICAgICAgYXdhaXQgcmVxdWVzdC5ydW4oXCJwYWdlIHJlbmRlclwiLCAoKSA9PlxuICAgICAgICBtYXJrZXJzLmNhdGNoVXAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNsb2NrICs9IDEwMDtcbiAgICAgICAgICBleHBlY3QoXG4gICAgICAgICAgICBtYXJrZXJzLm91dHNpZGVSZW5kZXIoKCkgPT4gKHtcbiAgICAgICAgICAgICAgc3RvcmU6IHJlcXVlc3QuZ2V0U3RvcmUoKSxcbiAgICAgICAgICAgICAgYmVoaW5kSW5SZW5kZXI6IG1hcmtlcnMuYmVoaW5kSW5SZW5kZXIsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgKS50b0VxdWFsKHsgc3RvcmU6IHVuZGVmaW5lZCwgYmVoaW5kSW5SZW5kZXI6IGZhbHNlIH0pO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICAvLyBBIHJvdXRlIGhhbmRsZXIsIG5vdCBjYXVnaHQgdXAsIGlzIHN0aWxsIGJlaGluZCBvbmNlIG91dHNpZGUuXG4gICAgICBleHBlY3QobWFya2Vycy5vdXRzaWRlUmVuZGVyKCgpID0+IG1hcmtlcnMuYmVoaW5kSW5SZW5kZXIpKS50b0JlKHRydWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkZWxldGUgZ2xvYmFsW09VVFNJREVfUkVRVUVTVF9TWU1CT0xdO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoXCJnaXZlcyBhIHJlbmRlciBubyBncmFjZSB3aGVuIGNhdGNoVXAsIGhvbGRpbmcgbm90aGluZywgZGlkIG5vdCBjYXRjaCB1cFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGxldCBoZWxkID0gZmFsc2U7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQ6IGplc3QuZm4oKSB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHsgcm93czogW10sIHRydW5jYXRlZDogZmFsc2UgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoXG4gICAgICAoKSA9PiAoaGVsZCA/IDAgOiBJbmZpbml0eSksXG4gICAgICAoKSA9PiBoZWxkLFxuICAgICk7XG4gICAgY2xvY2sgKz0gMTAwMCArIFRBR19SRUZSRVNIX0dSQUNFX01TICsgMTAwO1xuICAgIGF3YWl0IG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiB7XG4gICAgICAvLyBBbm90aGVyIHJlcXVlc3Qgc3RvcmVzIGFuIGVudHJ5IGJlZm9yZSB0aGlzIHJlbmRlcidzIGZpcnN0IGxvb2t1cC5cbiAgICAgIGhlbGQgPSB0cnVlO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kSW5SZW5kZXIpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic3RhcnRzIGEgcmVmcmVzaCBmb3IgYSBwYWdlIHRoYXQgaXMgbm90IGJlaGluZCwgd2l0aG91dCB3YWl0aW5nIGZvciBpdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGxldCByZWxlYXNlITogKCkgPT4gdm9pZDtcbiAgICBjb25zdCBxdWVyeSA9IGplc3QuZm4oXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgUHJvbWlzZTx7IHJvd3M6IFJldmFsaWRhdGlvbkxvZ1Jvd1tdOyB0cnVuY2F0ZWQ6IGJvb2xlYW4gfT4oXG4gICAgICAgICAgKHJlc29sdmUpID0+XG4gICAgICAgICAgICAocmVsZWFzZSA9ICgpID0+IHJlc29sdmUoeyByb3dzOiBbXSwgdHJ1bmNhdGVkOiBmYWxzZSB9KSksXG4gICAgICAgICksXG4gICAgKTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZDogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeSB9IGFzIHVua25vd24gYXMgUmV2YWxpZGF0aW9uTG9nLFxuICAgICAgcmVmcmVzaEludGVydmFsTXM6IDEwMDAsXG4gICAgICBjbG9jazogKCkgPT4gY2xvY2ssXG4gICAgfSk7XG4gICAgbWFya2Vycy5qdWRnZUVudHJpZXNPZigoKSA9PiAwKTtcbiAgICBjbG9jayArPSAxMDAwO1xuICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZShmYWxzZSk7XG4gICAgLy8gQSBwYWdlIHRoYXQgcmVhZHMgbm8gY2FjaGUgc3RpbGwga2VlcHMgdGhlIGluc3RhbmNlIGN1cnJlbnQuXG4gICAgYXdhaXQgZXhwZWN0KG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiBcInBhZ2VcIikpLnJlc29sdmVzLnRvQmUoXCJwYWdlXCIpO1xuICAgIGV4cGVjdChxdWVyeSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgIHJlbGVhc2UoKTtcbiAgfSk7XG5cbiAgaXQoXCJjYXRjaGVzIHVwIG9uIHRoZSBsb2cgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgcm9sbGluZyByZS1yZWFkXCIsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgbGV0IHJlbGVhc2UhOiAoKSA9PiB2b2lkO1xuICAgIGNvbnN0IHJlYWQgPSBqZXN0LmZuKGFzeW5jICh0YWdzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgaWYgKHJlYWQubW9jay5jYWxscy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiAocmVsZWFzZSA9IHJlc29sdmUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTWFwPHN0cmluZywgVGFnTWFya2VyPih0YWdzLm1hcCgodGFnKSA9PiBbdGFnLCB7fV0pKTtcbiAgICB9KTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZCB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHsgcm93czogW10sIHRydW5jYXRlZDogZmFsc2UgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgcmVzeW5jSW50ZXJ2YWxNczogMTAwMCxcbiAgICAgIHJhbmRvbTogKCkgPT4gMCxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICB9KTtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IDApO1xuICAgIGF3YWl0IG1hcmtlcnMuZW5zdXJlKFtcInBvc3RzXCJdKTtcbiAgICAvLyBEdWUgZm9yIGl0cyByZS1yZWFkLCBhbmQgYmVoaW5kLCBhcyBhZnRlciBhIHF1aWV0IHNwZWxsLlxuICAgIGNsb2NrICs9IDUwMDA7XG4gICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kKS50b0JlKHRydWUpO1xuICAgIGxldCByZW5kZXJlZCA9IGZhbHNlO1xuICAgIGF3YWl0IG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiAocmVuZGVyZWQgPSB0cnVlKSk7XG4gICAgLy8gQSB0aHJvdHRsZWQgYEJhdGNoR2V0SXRlbWAgd291bGQgb3RoZXJ3aXNlIGhvbGQgdGhlIHBhZ2UuXG4gICAgZXhwZWN0KHJlbmRlcmVkKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChyZWFkKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG5cbiAgICAvLyBOb3IgZG9lcyBhIGxvb2t1cCBvZiB0aGUgdHJhY2tlZCB0YWcgd2FpdCBvbiBpdC5cbiAgICBsZXQgZW5zdXJlZCA9IGZhbHNlO1xuICAgIHZvaWQgbWFya2Vycy5lbnN1cmUoW1wicG9zdHNcIl0pLnRoZW4oKCkgPT4gKGVuc3VyZWQgPSB0cnVlKSk7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldEltbWVkaWF0ZShyZXNvbHZlKSk7XG4gICAgZXhwZWN0KGVuc3VyZWQpLnRvQmUodHJ1ZSk7XG5cbiAgICAvLyBTdGlsbCBpbiBmbGlnaHQgYW4gaW50ZXJ2YWwgbGF0ZXI6IG5vdCByZWFkIGEgc2Vjb25kIHRpbWUgbWVhbndoaWxlLlxuICAgIGNsb2NrICs9IDEwMDA7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgZXhwZWN0KHJlYWQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgICByZWxlYXNlKCk7XG4gIH0pO1xuXG4gIGl0KFwiZ2l2ZXMgYSByb3V0ZSBoYW5kbGVyLCB3aGljaCBubyBjYXRjaC11cCBwcmVjZWRlcywgbm8gZ3JhY2UgbW9yZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7IHF1ZXJ5OiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIGNsb2NrICs9IDEwMDAgKyBUQUdfUkVGUkVTSF9HUkFDRV9NUyArIDEwMDtcbiAgICBleHBlY3QobWFya2Vycy5iZWhpbmRJblJlbmRlcikudG9CZSh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyBhZ2FpbiBvbmx5IG9uY2UsIGhvd2V2ZXIgbWFueSBmb3JnZXRzIGxhbmQgbWVhbndoaWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgY29uc3QgcmVsZWFzZXM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gICAgY29uc3QgcmVhZCA9IGplc3QuZm4oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHJlbGVhc2VzLnB1c2gocmVzb2x2ZSkpO1xuICAgICAgcmV0dXJuIG5ldyBNYXA8c3RyaW5nLCBUYWdNYXJrZXI+KFtbXCJwb3N0c1wiLCB7IHJldmFsaWRhdGVkQXQ6IDEgfV1dKTtcbiAgICB9KTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZCB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHsgcm93czogW10sIHRydW5jYXRlZDogZmFsc2UgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoKCkgPT4gMCk7XG4gICAgY29uc3QgZm9yZ2V0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY2xvY2sgKz0gTUFYX1JFVkFMSURBVElPTl9MT0dfR0FQX01TICsgMTtcbiAgICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIH07XG4gICAgY29uc3QgZW5zdXJpbmcgPSBtYXJrZXJzLmVuc3VyZShbXCJwb3N0c1wiXSk7XG4gICAgYXdhaXQgZm9yZ2V0KCk7XG4gICAgcmVsZWFzZXMuc2hpZnQoKSEoKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0SW1tZWRpYXRlKHJlc29sdmUpKTtcbiAgICBhd2FpdCBmb3JnZXQoKTtcbiAgICByZWxlYXNlcy5zaGlmdCgpISgpO1xuICAgIGF3YWl0IGVuc3VyaW5nO1xuICAgIC8vIEEgdHJ1bmNhdGVkIGxvZyBmb3JnZXRzIG9uIGV2ZXJ5IHF1ZXJ5OiB3YWl0aW5nIGZvciBhIHJlYWQgbm8gZm9yZ2V0XG4gICAgLy8gb3ZlcnRvb2sgd291bGQga2VlcCB0aGUgcmVxdWVzdHMgd2FpdGluZyBvbiB0aGlzIG9uZSBmb3IgYXMgbG9uZy5cbiAgICBleHBlY3QocmVhZCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgIGV4cGVjdChtYXJrZXJzLmdldChcInBvc3RzXCIpKS50b0VxdWFsKHsgcmV2YWxpZGF0ZWRBdDogMSB9KTtcbiAgfSk7XG5cbiAgaXQoXCJyZWFkcyBhZ2FpbiB3aGF0IGEgcmVhZCBmcm9tIGJlZm9yZSBhIGZvcmdldCBmb3VuZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGxldCByZWxlYXNlITogKCkgPT4gdm9pZDtcbiAgICBjb25zdCBoZWxkID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IChyZWxlYXNlID0gcmVzb2x2ZSkpO1xuICAgIGxldCByZXZhbGlkYXRlZEF0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVhZCA9IGplc3QuZm4oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgaGVsZDtcbiAgICAgIHJldHVybiBuZXcgTWFwPHN0cmluZywgVGFnTWFya2VyPihcbiAgICAgICAgcmV2YWxpZGF0ZWRBdCA9PT0gdW5kZWZpbmVkID8gW10gOiBbW1wicG9zdHNcIiwgeyByZXZhbGlkYXRlZEF0IH1dXSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7XG4gICAgICAgIHF1ZXJ5OiBqZXN0LmZuKGFzeW5jICgpID0+ICh7IHJvd3M6IFtdLCB0cnVuY2F0ZWQ6IGZhbHNlIH0pKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICByZWZyZXNoSW50ZXJ2YWxNczogMCxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICB9KTtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IDApO1xuICAgIC8vIEEgYmFja2dyb3VuZCByZWFkIGluIGZsaWdodCBhcyB0aGUgc2FuZGJveCBmcm96ZSwgcGFzdCB0aGUgbG9nJ3MgVFRMLlxuICAgIGNvbnN0IGVuc3VyaW5nID0gbWFya2Vycy5lbnN1cmUoW1wicG9zdHNcIl0pO1xuICAgIGNsb2NrICs9IE1BWF9SRVZBTElEQVRJT05fTE9HX0dBUF9NUyArIDE7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG5cbiAgICAvLyBSZWFkIGFnYWluIG9uY2UgdGhlIHN0YWxlIHJlYWQgcmV0dXJuczogdHJhY2tlZCwgaXRzIG1hcmtlciB3b3VsZFxuICAgIC8vIHZvdWNoIGZvciBldmVyeSBlbnRyeSB3aXRoIHRoZSB0YWcsIHJldmFsaWRhdGVkIGR1cmluZyB0aGUgZnJlZXplIG9yXG4gICAgLy8gbm90OyB1bnRyYWNrZWQsIHRoZSByZXF1ZXN0IHdhaXRpbmcgb24gaXQgd291bGQganVkZ2UgYnkgbm90aGluZy5cbiAgICByZXZhbGlkYXRlZEF0ID0gbWFya2VyQ2xvY2soKTtcbiAgICByZWxlYXNlKCk7XG4gICAgYXdhaXQgZW5zdXJpbmc7XG4gICAgZXhwZWN0KHJlYWQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgICBleHBlY3QobWFya2Vycy5nZXQoXCJwb3N0c1wiKSkudG9FcXVhbCh7IHJldmFsaWRhdGVkQXQgfSk7XG4gIH0pO1xuXG4gIGl0KFwibW92ZXMgY29tcGxldGVTaW5jZSBwYXN0IHdoYXQgaXQgZm9yZ2V0c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IGxhdGVyID0gbWFya2VyQ2xvY2soKSArIDYwXzAwMDtcbiAgICBjb25zdCByb3dzOiBSZXZhbGlkYXRpb25Mb2dSb3dbXSA9IFtcImFcIiwgXCJiXCJdLm1hcCgodGFnLCBpKSA9PiAoe1xuICAgICAgc2s6IGAke1N0cmluZyhjbG9jaykucGFkU3RhcnQoMTUsIFwiMFwiKX0jJHt0YWd9YCxcbiAgICAgIGF0OiBjbG9jayxcbiAgICAgIHRhZyxcbiAgICAgIG1hcmtlcjogeyByZXZhbGlkYXRlZEF0OiBsYXRlciArIGkgfSxcbiAgICB9KSk7XG4gICAgY29uc3QgcXVlcnkgPSBqZXN0LmZuKGFzeW5jICgpID0+ICh7IHJvd3MsIHRydW5jYXRlZDogZmFsc2UgfSkpO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7IHF1ZXJ5IH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICByZWZyZXNoSW50ZXJ2YWxNczogMCxcbiAgICAgIG1heFRyYWNrZWRUYWdzOiAxLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIC8vIEFuIGVudHJ5IHN0b3JlIGhvbGRpbmcgc29tZXRoaW5nIG9sZGVyIHRoYW4gZXZlcnkgcm93LlxuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoKCkgPT4gMCk7XG4gICAgY29uc3Qgc3RhcnQgPSBtYXJrZXJzLmNvbXBsZXRlU2luY2U7XG4gICAgZXhwZWN0KHN0YXJ0KS50b0JlTGVzc1RoYW5PckVxdWFsKG1hcmtlckNsb2NrKCkpO1xuXG4gICAgLy8gVW50cmFja2VkIHRhZ3MnIHJvd3MgYXJlIGtub3duIGZyb20gdGhlIGxvZyBhbG9uZSwgYXMgZmFyIGFzIHRoZXkgZml0LlxuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChtYXJrZXJzLnN0YXRlKFtcImJcIl0sIGxhdGVyKSkudG9CZShcImV4cGlyZWRcIik7XG4gICAgLy8gXCJhXCIgd2FzIGRyb3BwZWQgZm9yIHNwYWNlLCBhbmQgd2l0aCBpdCB3aGF0IGl0IGtuZXcuXG4gICAgZXhwZWN0KG1hcmtlcnMuc3RhdGUoW1wiYVwiXSwgbGF0ZXIpKS50b0JlKFwiZnJlc2hcIik7XG4gICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShsYXRlcik7XG5cbiAgICAvLyBGb3JnZXR0aW5nIGV2ZXJ5dGhpbmcgbW92ZXMgaXQgdG8gbm93LCBvciBwYXN0IHdoYXQgaXQgZm9yZ290OiBcImJcIi5cbiAgICBjbG9jayArPSBNQVhfUkVWQUxJREFUSU9OX0xPR19HQVBfTVMgKyAxO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUobGF0ZXIgKyAxKTtcbiAgfSk7XG5cbiAgaXQoXCJtb3ZlcyBjb21wbGV0ZVNpbmNlIHBhc3QgYSByb3cgaXQgbGV0cyBnbyBvZiB3aXRoIG5vIGVudHJ5IGhlbGRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IHJldmFsaWRhdGVkQXQgPSBtYXJrZXJDbG9jaygpICsgNjBfMDAwO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7XG4gICAgICAgIHF1ZXJ5OiBqZXN0LmZuKGFzeW5jICgpID0+ICh7XG4gICAgICAgICAgcm93czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzazogYCR7U3RyaW5nKGNsb2NrKS5wYWRTdGFydCgxNSwgXCIwXCIpfSNwb3N0c2AsXG4gICAgICAgICAgICAgIGF0OiBjbG9jayxcbiAgICAgICAgICAgICAgdGFnOiBcInBvc3RzXCIsXG4gICAgICAgICAgICAgIG1hcmtlcjogeyByZXZhbGlkYXRlZEF0IH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdHJ1bmNhdGVkOiBmYWxzZSxcbiAgICAgICAgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoKCkgPT4gSW5maW5pdHkpO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIC8vIEFuIGVudHJ5IHdob3NlIGdlbmVyYXRpb24gc3RhcnRlZCBiZWZvcmUgdGhlIHJldmFsaWRhdGlvbiwgc3RvcmVkIG9uY2VcbiAgICAvLyB0aGUgcm93IGlzIGdvbmUsIGlzIG9sZGVyIHRoYW4gYGNvbXBsZXRlU2luY2VgLCBhbmQgc28gcmVhZCBmaXJzdC5cbiAgICBleHBlY3QobWFya2Vycy5zdGF0ZShbXCJwb3N0c1wiXSwgcmV2YWxpZGF0ZWRBdCAtIDEpKS50b0JlKFwiZnJlc2hcIik7XG4gICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShyZXZhbGlkYXRlZEF0KTtcbiAgfSk7XG5cbiAgaXQoXCJwcnVuZXMgYSBwcm9maWxlJ3Mgcm93LCBhbmQgbW92ZXMgY29tcGxldGVTaW5jZSB0byBpdHMgZXhwaXJlZEF0IG9uY2UgcGFzdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgY29uc3Qgc3RhbGVBdCA9IG1hcmtlckNsb2NrKCkgKyAxMDAwO1xuICAgIGNvbnN0IGV4cGlyZWRBdCA9IHN0YWxlQXQgKyA2MF8wMDA7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQ6IGplc3QuZm4oKSB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICByb3dzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNrOiBgJHtTdHJpbmcoY2xvY2spLnBhZFN0YXJ0KDE1LCBcIjBcIil9I3Bvc3RzYCxcbiAgICAgICAgICAgICAgYXQ6IGNsb2NrLFxuICAgICAgICAgICAgICB0YWc6IFwicG9zdHNcIixcbiAgICAgICAgICAgICAgbWFya2VyOiB7IHN0YWxlQXQsIGV4cGlyZWRBdCB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRydW5jYXRlZDogZmFsc2UsXG4gICAgICAgIH0pKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICByZWZyZXNoSW50ZXJ2YWxNczogMCxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICB9KTtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IHN0YWxlQXQgKyAxKTtcbiAgICBhd2FpdCBtYXJrZXJzLnJlZnJlc2goKTtcbiAgICBleHBlY3QobWFya2Vycy5zdGF0ZShbXCJwb3N0c1wiXSwgc3RhbGVBdCAtIDEpKS50b0JlKFwiZnJlc2hcIik7XG4gICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShzdGFsZUF0KTtcblxuICAgIGNvbnN0IG5vdyA9IGplc3RcbiAgICAgIC5zcHlPbihwZXJmb3JtYW5jZSwgXCJub3dcIilcbiAgICAgIC5tb2NrUmV0dXJuVmFsdWUoZXhwaXJlZEF0IC0gcGVyZm9ybWFuY2UudGltZU9yaWdpbik7XG4gICAgdHJ5IHtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoZXhwaXJlZEF0KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbm93Lm1vY2tSZXN0b3JlKCk7XG4gICAgfVxuICB9KTtcblxuICBpdChcInF1ZXVlcyBhIHBydW5lZCByb3cncyBmdXR1cmUgZXhwaXJlZEF0IG9uY2UsIGhvd2V2ZXIgb2Z0ZW4gdGhlIGxvb2tiYWNrIHJldHVybnMgaXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjbG9jayA9IDFfMDAwXzAwMDtcbiAgICBjb25zdCBzdGFsZUF0ID0gbWFya2VyQ2xvY2soKSArIDEwMDA7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQ6IGplc3QuZm4oKSB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICByb3dzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNrOiBgJHtTdHJpbmcoMV8wMDBfMDAwKS5wYWRTdGFydCgxNSwgXCIwXCIpfSNwb3N0c2AsXG4gICAgICAgICAgICAgIGF0OiAxXzAwMF8wMDAsXG4gICAgICAgICAgICAgIHRhZzogXCJwb3N0c1wiLFxuICAgICAgICAgICAgICBtYXJrZXI6IHsgc3RhbGVBdCwgZXhwaXJlZEF0OiBzdGFsZUF0ICsgNjBfMDAwIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdHJ1bmNhdGVkOiBmYWxzZSxcbiAgICAgICAgfSkpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAwLFxuICAgICAgY2xvY2s6ICgpID0+IGNsb2NrLFxuICAgIH0pO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2YoKCkgPT4gc3RhbGVBdCArIDEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICBhd2FpdCBtYXJrZXJzLnJlZnJlc2goKTtcbiAgICAgIGNsb2NrICs9IDEwMDA7XG4gICAgfVxuICAgIC8vIFBydW5lZCByb3dzIGFyZSBub3QgbWFya2VkIGFwcGxpZWQsIHNvIGVhY2ggcXVlcnkgYXBwbGllcyBpdCBhZ2Fpbi5cbiAgICBleHBlY3QoXG4gICAgICAobWFya2VycyBhcyB1bmtub3duIGFzIHsgbGF0ZXJGbG9vcnM6IHVua25vd25bXSB9KS5sYXRlckZsb29ycyxcbiAgICApLnRvSGF2ZUxlbmd0aCgxKTtcbiAgfSk7XG5cbiAgaXQoXCJtZXJnZXMgZnV0dXJlIGV4cGlyZWRBdHMgcGFzdCBpdHMgYm91bmQgd2l0aG91dCBtb3ZpbmcgY29tcGxldGVTaW5jZSBlYXJseVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYXQgPSBtYXJrZXJDbG9jaygpO1xuICAgIGNvbnN0IGV4cGlyaWVzID0gbmV3IE1hcChbXG4gICAgICBbXCJhXCIsIGF0ICsgNjBfMDAwXSxcbiAgICAgIFtcImJcIiwgYXQgKyA2MF8wMTBdLFxuICAgICAgW1wiY1wiLCBhdCArIDEyMF8wMDBdLFxuICAgIF0pO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2Vyczoge1xuICAgICAgICByZWFkOiBqZXN0LmZuKFxuICAgICAgICAgIGFzeW5jICh0YWdzOiBzdHJpbmdbXSkgPT5cbiAgICAgICAgICAgIG5ldyBNYXA8c3RyaW5nLCBUYWdNYXJrZXI+KFxuICAgICAgICAgICAgICB0YWdzLm1hcCgodGFnKSA9PiBbXG4gICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgIHsgc3RhbGVBdDogYXQgLSAxMDAwLCBleHBpcmVkQXQ6IGV4cGlyaWVzLmdldCh0YWcpIH0sXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeTogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICBtYXhUcmFja2VkVGFnczogMSxcbiAgICB9KTtcbiAgICBjb25zdCBzdGFydCA9IG1hcmtlcnMuY29tcGxldGVTaW5jZTtcbiAgICAvLyBcImFcIiwgdGhlbiBcImJcIiwgZHJvcHBlZCBmb3Igc3BhY2U6IHR3byBleHBpcmVkQXRzIHBhc3QgYSBib3VuZCBvZiBvbmUuXG4gICAgZm9yIChjb25zdCB0YWcgb2YgW1wiYVwiLCBcImJcIiwgXCJjXCJdKSB7XG4gICAgICBhd2FpdCBtYXJrZXJzLmVuc3VyZShbdGFnXSk7XG4gICAgfVxuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoc3RhcnQpO1xuXG4gICAgY29uc3Qgbm93ID0gamVzdC5zcHlPbihwZXJmb3JtYW5jZSwgXCJub3dcIik7XG4gICAgdHJ5IHtcbiAgICAgIG5vdy5tb2NrUmV0dXJuVmFsdWUoYXQgKyA1OV85OTkgLSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luKTtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoc3RhcnQpO1xuICAgICAgLy8gTWVyZ2VkOiBcImJcIidzIGZyb20gXCJhXCIncywgMTAgbXMgZWFybHkuXG4gICAgICBub3cubW9ja1JldHVyblZhbHVlKGF0ICsgNjBfMDAwIC0gcGVyZm9ybWFuY2UudGltZU9yaWdpbik7XG4gICAgICBleHBlY3QobWFya2Vycy5jb21wbGV0ZVNpbmNlKS50b0JlKGF0ICsgNjBfMDEwKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbm93Lm1vY2tSZXN0b3JlKCk7XG4gICAgfVxuICB9KTtcblxuICBpdChcImRvZXMgbm90IGpvaW4gYSBuZWFyIGV4cGlyZWRBdCB0byBmYXIgb25lcyBwYXN0IGl0cyBib3VuZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYXQgPSBtYXJrZXJDbG9jaygpO1xuICAgIGNvbnN0IHllYXIgPSAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgIGNvbnN0IGV4cGlyaWVzID0gbmV3IE1hcChbXG4gICAgICBbXCJhXCIsIGF0ICsgeWVhcl0sXG4gICAgICBbXCJiXCIsIGF0ICsgeWVhciArIDEwXSxcbiAgICAgIFtcImNcIiwgYXQgKyA2MF8wMDBdLFxuICAgIF0pO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2Vyczoge1xuICAgICAgICByZWFkOiBqZXN0LmZuKFxuICAgICAgICAgIGFzeW5jICh0YWdzOiBzdHJpbmdbXSkgPT5cbiAgICAgICAgICAgIG5ldyBNYXA8c3RyaW5nLCBUYWdNYXJrZXI+KFxuICAgICAgICAgICAgICB0YWdzLm1hcCgodGFnKSA9PiBbXG4gICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgIHsgc3RhbGVBdDogYXQgLSAxMDAwLCBleHBpcmVkQXQ6IGV4cGlyaWVzLmdldCh0YWcpIH0sXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeTogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICBtYXhUcmFja2VkVGFnczogMixcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBbXCJhXCIsIFwiYlwiLCBcImNcIiwgXCJkXCIsIFwiZVwiXSkge1xuICAgICAgYXdhaXQgbWFya2Vycy5lbnN1cmUoW3RhZ10pO1xuICAgIH1cbiAgICBjb25zdCBub3cgPSBqZXN0XG4gICAgICAuc3B5T24ocGVyZm9ybWFuY2UsIFwibm93XCIpXG4gICAgICAubW9ja1JldHVyblZhbHVlKGF0ICsgNjBfMDAwIC0gcGVyZm9ybWFuY2UudGltZU9yaWdpbik7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFwiYVwiIGFuZCBcImJcIiBhcmUgbWVyZ2VkLCBub3QgXCJjXCIgaW50byBcImFcIjogYGNvbXBsZXRlU2luY2VgIGEgeWVhclxuICAgICAgLy8gZWFybHkgd291bGQgaGF2ZSBldmVyeSBoZWxkIGVudHJ5IHJlYWQgaXRzIG1hcmtlcnMgZmlyc3QgdW50aWwgdGhlbi5cbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoYXQgKyA2MF8wMDApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBub3cubW9ja1Jlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwibWVyZ2VzIHRoZSBjbG9zZXN0IGZ1dHVyZSBleHBpcmVkQXRzIHBhc3QgaXRzIGJvdW5kXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhdCA9IG1hcmtlckNsb2NrKCk7XG4gICAgY29uc3QgZXhwaXJpZXMgPSBuZXcgTWFwKFtcbiAgICAgIFtcImFcIiwgYXQgKyA2MF8wMDBdLFxuICAgICAgW1wiYlwiLCBhdCArIDEyMF8wMDBdLFxuICAgICAgW1wiY1wiLCBhdCArIDYwXzAxMF0sXG4gICAgXSk7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7XG4gICAgICAgIHJlYWQ6IGplc3QuZm4oXG4gICAgICAgICAgYXN5bmMgKHRhZ3M6IHN0cmluZ1tdKSA9PlxuICAgICAgICAgICAgbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oXG4gICAgICAgICAgICAgIHRhZ3MubWFwKCh0YWcpID0+IFtcbiAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgeyBzdGFsZUF0OiBhdCAtIDEwMDAsIGV4cGlyZWRBdDogZXhwaXJpZXMuZ2V0KHRhZykgfSxcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7IHF1ZXJ5OiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgIG1heFRyYWNrZWRUYWdzOiAyLFxuICAgIH0pO1xuICAgIC8vIFwiYVwiLCBcImJcIiwgdGhlbiBcImNcIiBkcm9wcGVkIGZvciBzcGFjZTogdGhyZWUgZXhwaXJlZEF0cyBwYXN0IGEgYm91bmQgb2ZcbiAgICAvLyB0d28sIGFuZCBcImNcIiBpcyAxMCBtcyBmcm9tIFwiYVwiLlxuICAgIGZvciAoY29uc3QgdGFnIG9mIFtcImFcIiwgXCJiXCIsIFwiY1wiLCBcImRcIiwgXCJlXCJdKSB7XG4gICAgICBhd2FpdCBtYXJrZXJzLmVuc3VyZShbdGFnXSk7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0ID0gbWFya2Vycy5jb21wbGV0ZVNpbmNlO1xuXG4gICAgY29uc3Qgbm93ID0gamVzdC5zcHlPbihwZXJmb3JtYW5jZSwgXCJub3dcIik7XG4gICAgdHJ5IHtcbiAgICAgIG5vdy5tb2NrUmV0dXJuVmFsdWUoYXQgKyA1OV85OTkgLSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luKTtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoc3RhcnQpO1xuICAgICAgbm93Lm1vY2tSZXR1cm5WYWx1ZShhdCArIDYwXzAwMCAtIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4pO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShhdCArIDYwXzAxMCk7XG4gICAgICBub3cubW9ja1JldHVyblZhbHVlKGF0ICsgMTE5Xzk5OSAtIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4pO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShhdCArIDYwXzAxMCk7XG4gICAgICBub3cubW9ja1JldHVyblZhbHVlKGF0ICsgMTIwXzAwMCAtIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4pO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuY29tcGxldGVTaW5jZSkudG9CZShhdCArIDEyMF8wMDApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBub3cubW9ja1Jlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwiY2F0Y2hlcyB1cCBvbmx5IGZvciBhbiBlbnRyeSBzdG9yZSBob2xkaW5nIGVudHJpZXMsIGFuZCBub3Qgd2hlbiBldmVyeSBjaGVjayBhc2tzIGFueXdheVwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IGluc3RhbmNlID0gKHJlZnJlc2hJbnRlcnZhbE1zOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gamVzdC5mbihhc3luYyAoKSA9PiAoeyByb3dzOiBbXSwgdHJ1bmNhdGVkOiBmYWxzZSB9KSk7XG4gICAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgICBsb2c6IHsgcXVlcnkgfSBhcyB1bmtub3duIGFzIFJldmFsaWRhdGlvbkxvZyxcbiAgICAgICAgcmVmcmVzaEludGVydmFsTXMsXG4gICAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgbWFya2VycywgcXVlcnkgfTtcbiAgICB9O1xuICAgIGNvbnN0IG5vU3RvcmUgPSBpbnN0YW5jZSgxMDAwKTtcbiAgICBjb25zdCBldmVyeUNoZWNrID0gaW5zdGFuY2UoMCk7XG4gICAgZXZlcnlDaGVjay5tYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IEluZmluaXR5KTtcbiAgICAvLyBBIHN0b3JlLCBidXQgaG9sZGluZyBub3RoaW5nIGEgcmVmcmVzaCBjb3VsZCBleHBpcmUuXG4gICAgY29uc3QgZW1wdHlTdG9yZSA9IGluc3RhbmNlKDEwMDApO1xuICAgIGVtcHR5U3RvcmUubWFya2Vycy5qdWRnZUVudHJpZXNPZigoKSA9PiBJbmZpbml0eSk7XG4gICAgY29uc3Qgc3RvcmUgPSBpbnN0YW5jZSgxMDAwKTtcbiAgICBzdG9yZS5tYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IDApO1xuICAgIGNsb2NrICs9IDYwXzAwMDtcbiAgICBmb3IgKGNvbnN0IHsgbWFya2VycyB9IG9mIFtub1N0b3JlLCBldmVyeUNoZWNrLCBlbXB0eVN0b3JlLCBzdG9yZV0pIHtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZSh0cnVlKTtcbiAgICAgIGF3YWl0IG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiB7fSk7XG4gICAgfVxuICAgIGV4cGVjdChub1N0b3JlLnF1ZXJ5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGV4cGVjdChldmVyeUNoZWNrLnF1ZXJ5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGV4cGVjdChlbXB0eVN0b3JlLnF1ZXJ5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGV4cGVjdChzdG9yZS5xdWVyeSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICB9KTtcblxuICBpdChcIm1vdmVzIGNvbXBsZXRlU2luY2UgdG8gYSBkcm9wcGVkIG1hcmtlcidzIGZ1dHVyZSBleHBpcmVkQXQgb25seSBvbmNlIGl0IGlzIHBhc3RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGF0ID0gbWFya2VyQ2xvY2soKTtcbiAgICBjb25zdCByZWFkID0gamVzdC5mbihcbiAgICAgIGFzeW5jICh0YWdzOiBzdHJpbmdbXSkgPT5cbiAgICAgICAgbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oXG4gICAgICAgICAgdGFncy5tYXAoKHRhZykgPT4gW1xuICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgeyBzdGFsZUF0OiBhdCAtIDEwMDAsIGV4cGlyZWRBdDogYXQgKyA2MF8wMDAgfSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICApO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeTogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICBtYXhUcmFja2VkVGFnczogMSxcbiAgICB9KTtcbiAgICBjb25zdCBzdGFydCA9IG1hcmtlcnMuY29tcGxldGVTaW5jZTtcbiAgICBhd2FpdCBtYXJrZXJzLmVuc3VyZShbXCJhXCJdKTtcbiAgICAvLyBcImFcIiBpcyBkcm9wcGVkIGZvciBzcGFjZTogYSB5ZWFyLWxvbmcgYGV4cGlyZWAgd291bGQgb3RoZXJ3aXNlIGtlZXBcbiAgICAvLyBldmVyeSBlbnRyeSByZWFkaW5nIGl0cyBtYXJrZXJzIGZpcnN0IGZvciBhcyBsb25nLlxuICAgIGF3YWl0IG1hcmtlcnMuZW5zdXJlKFtcImJcIl0pO1xuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoc3RhcnQpO1xuXG4gICAgY29uc3QgY2xvY2sgPSBqZXN0XG4gICAgICAuc3B5T24ocGVyZm9ybWFuY2UsIFwibm93XCIpXG4gICAgICAubW9ja1JldHVyblZhbHVlKGF0ICsgNjBfMDAxIC0gcGVyZm9ybWFuY2UudGltZU9yaWdpbik7XG4gICAgdHJ5IHtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUoYXQgKyA2MF8wMDApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbG9jay5tb2NrUmVzdG9yZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyBvbmx5IHRoZSBsb2cgcm93cyB0aGF0IGNvdWxkIGFwcGx5IHRvIGFuIGVudHJ5IGhlbGRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjbG9jayA9IDFfMDAwXzAwMDtcbiAgICBjb25zdCBsYXRlciA9IG1hcmtlckNsb2NrKCkgKyA2MF8wMDA7XG4gICAgY29uc3Qgcm93czogUmV2YWxpZGF0aW9uTG9nUm93W10gPSBbXCJvbGRcIiwgXCJuZXdcIl0ubWFwKCh0YWcsIGkpID0+ICh7XG4gICAgICBzazogYCR7U3RyaW5nKGNsb2NrKS5wYWRTdGFydCgxNSwgXCIwXCIpfSMke3RhZ31gLFxuICAgICAgYXQ6IGNsb2NrLFxuICAgICAgdGFnLFxuICAgICAgbWFya2VyOiB7IHJldmFsaWRhdGVkQXQ6IGkgPT09IDAgPyAxIDogbGF0ZXIgfSxcbiAgICB9KSk7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQ6IGplc3QuZm4oKSB9IGFzIHVua25vd24gYXMgVGFnTWFya2VyVGFibGUsXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3QuZm4oYXN5bmMgKCkgPT4gKHsgcm93cywgdHJ1bmNhdGVkOiBmYWxzZSB9KSksXG4gICAgICB9IGFzIHVua25vd24gYXMgUmV2YWxpZGF0aW9uTG9nLFxuICAgICAgcmVmcmVzaEludGVydmFsTXM6IDAsXG4gICAgICBtYXhUcmFja2VkVGFnczogMSxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICB9KTtcbiAgICBsZXQgb2xkZXN0ID0gMjtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IG9sZGVzdCk7XG4gICAgY29uc3Qgc3RhcnQgPSBtYXJrZXJzLmNvbXBsZXRlU2luY2U7XG5cbiAgICAvLyBcIm9sZFwiIGNhbiBleHBpcmUgbm90aGluZyBoZWxkLCBzbyBpdCB0YWtlcyBubyByb29tLCBhbmQgXCJuZXdcIiBpc1xuICAgIC8vIGtlcHQgd2l0aG91dCBkcm9wcGluZyBhbnl0aGluZyBmb3Igc3BhY2UuXG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgZXhwZWN0KG1hcmtlcnMuc3RhdGUoW1wibmV3XCJdLCBsYXRlciAtIDEpKS50b0JlKFwiZXhwaXJlZFwiKTtcbiAgICBleHBlY3QobWFya2Vycy5jb21wbGV0ZVNpbmNlKS50b0JlKHN0YXJ0KTtcblxuICAgIC8vIE9uY2UgZXZlcnkgZW50cnkgaGVsZCBpcyBuZXdlciB0aGFuIGl0LCBcIm5ld1wiIGdvZXMgdG9vLCB0YWtpbmdcbiAgICAvLyBgY29tcGxldGVTaW5jZWAgbm8gZnVydGhlciB0aGFuIHRoZSBvbGRlc3QgZW50cnkgaGVsZC5cbiAgICBvbGRlc3QgPSBsYXRlcjtcbiAgICBjbG9jayArPSAxMDAwO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChtYXJrZXJzLnN0YXRlKFtcIm5ld1wiXSwgbGF0ZXIgLSAxKSkudG9CZShcImZyZXNoXCIpO1xuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUobGF0ZXIpO1xuICB9KTtcblxuICBpdChcInNjYW5zIHRoZSBlbnRyeSBzdG9yZXMgb25jZSBhIG1pbnV0ZSwgcHJ1bmluZyBvbmx5IHdoZW4gdGhlIG9sZGVzdCBtb3Zlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IGxhdGVyID0gbWFya2VyQ2xvY2soKSArIDYwXzAwMDtcbiAgICBjb25zdCByb3dzOiBSZXZhbGlkYXRpb25Mb2dSb3dbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgc2s6IGAke1N0cmluZyhjbG9jaykucGFkU3RhcnQoMTUsIFwiMFwiKX0jbmV3YCxcbiAgICAgICAgYXQ6IGNsb2NrLFxuICAgICAgICB0YWc6IFwibmV3XCIsXG4gICAgICAgIG1hcmtlcjogeyByZXZhbGlkYXRlZEF0OiBsYXRlciB9LFxuICAgICAgfSxcbiAgICBdO1xuICAgIGNvbnN0IG1hcmtlcnMgPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgbWFya2VyczogeyByZWFkOiBqZXN0LmZuKCkgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgLy8gVGhlIHJvdyBsZWF2ZXMgdGhlIGxvb2tiYWNrIGFmdGVyIHRoZSBmaXJzdCBxdWVyeTogb25seSB0aGUgcHJ1bmVcbiAgICAgIC8vIGNhbiBsZXQgaXQgZ28uXG4gICAgICBsb2c6IHtcbiAgICAgICAgcXVlcnk6IGplc3RcbiAgICAgICAgICAuZm4oKVxuICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyByb3dzLCB0cnVuY2F0ZWQ6IGZhbHNlIH0pXG4gICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKHsgcm93czogW10sIHRydW5jYXRlZDogZmFsc2UgfSksXG4gICAgICB9IGFzIHVua25vd24gYXMgUmV2YWxpZGF0aW9uTG9nLFxuICAgICAgcmVmcmVzaEludGVydmFsTXM6IDAsXG4gICAgICBjbG9jazogKCkgPT4gY2xvY2ssXG4gICAgfSk7XG4gICAgbGV0IGJvdW5kID0gMjtcbiAgICBsZXQgZXhhY3QgPSAyO1xuICAgIGNvbnN0IG9sZGVzdCA9IGplc3QuZm4oKHNjYW46IGJvb2xlYW4pID0+IChzY2FuID8gZXhhY3QgOiBib3VuZCkpO1xuICAgIG1hcmtlcnMuanVkZ2VFbnRyaWVzT2Yob2xkZXN0KTtcbiAgICBjb25zdCBwcnVuZSA9IGplc3Quc3B5T24oXG4gICAgICBtYXJrZXJzIGFzIHVua25vd24gYXMgeyBwcnVuZUxvZ2dlZDogKG9sZGVzdDogbnVtYmVyKSA9PiB2b2lkIH0sXG4gICAgICBcInBydW5lTG9nZ2VkXCIsXG4gICAgKTtcblxuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChvbGRlc3QpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCh0cnVlKTtcbiAgICBleHBlY3QocHJ1bmUpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcblxuICAgIC8vIFdpdGhpbiB0aGUgbWludXRlOiB0aGUgYm91bmQsIGFuZCBubyBwcnVuZSB3aGlsZSBpdCBzdGF5cyBwdXQuXG4gICAgY2xvY2sgKz0gMTAwMDtcbiAgICBleGFjdCA9IGxhdGVyO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChvbGRlc3QpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aChmYWxzZSk7XG4gICAgZXhwZWN0KHBydW5lKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgZXhwZWN0KG1hcmtlcnMuc3RhdGUoW1wibmV3XCJdLCBsYXRlciAtIDEpKS50b0JlKFwiZXhwaXJlZFwiKTtcblxuICAgIC8vIFRoZSBtaW51dGUncyBzY2FuIGZpbmRzIGV2ZXJ5IGVudHJ5IG5ld2VyIHRoYW4gdGhlIHJvdzogaXQgZ29lcy5cbiAgICBjbG9jayArPSA2MF8wMDA7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgZXhwZWN0KG9sZGVzdCkudG9IYXZlQmVlbkxhc3RDYWxsZWRXaXRoKHRydWUpO1xuICAgIGV4cGVjdChwcnVuZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgIGV4cGVjdChtYXJrZXJzLnN0YXRlKFtcIm5ld1wiXSwgbGF0ZXIgLSAxKSkudG9CZShcImZyZXNoXCIpO1xuICAgIGV4cGVjdChtYXJrZXJzLmNvbXBsZXRlU2luY2UpLnRvQmUobGF0ZXIpO1xuXG4gICAgLy8gQW4gZW50cnkgc2V0IHNpbmNlIG1vdmVzIHRoZSBib3VuZCBiYWNrOiBub3RoaW5nIHRvIHBydW5lLlxuICAgIGNsb2NrICs9IDEwMDA7XG4gICAgYm91bmQgPSAxO1xuICAgIGF3YWl0IG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGV4cGVjdChwcnVuZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICB9KTtcblxuICBpdChcIndhaXRzIGZvciBhIGZyZXNoIHF1ZXJ5IHJhdGhlciB0aGFuIG9uZSBzdGFydGVkIGJlZm9yZSBhIGZyZWV6ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNsb2NrID0gMV8wMDBfMDAwO1xuICAgIGNvbnN0IHF1ZXJpZXM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gICAgY29uc3QgcXVlcnkgPSBqZXN0LmZuKFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IFByb21pc2U8eyByb3dzOiBSZXZhbGlkYXRpb25Mb2dSb3dbXTsgdHJ1bmNhdGVkOiBib29sZWFuIH0+KFxuICAgICAgICAgIChyZXNvbHZlKSA9PlxuICAgICAgICAgICAgcXVlcmllcy5wdXNoKCgpID0+IHJlc29sdmUoeyByb3dzOiBbXSwgdHJ1bmNhdGVkOiBmYWxzZSB9KSksXG4gICAgICAgICksXG4gICAgKTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgIG1hcmtlcnM6IHsgcmVhZDogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgIGxvZzogeyBxdWVyeSB9IGFzIHVua25vd24gYXMgUmV2YWxpZGF0aW9uTG9nLFxuICAgICAgcmVmcmVzaEludGVydmFsTXM6IDEwMDAsXG4gICAgICBjbG9jazogKCkgPT4gY2xvY2ssXG4gICAgICBjYW5GcmVlemU6IHRydWUsXG4gICAgfSk7XG4gICAgbWFya2Vycy5qdWRnZUVudHJpZXNPZigoKSA9PiAwKTtcbiAgICBjbG9jayArPSAxMDAwO1xuICAgIC8vIFN0YXJ0ZWQsIG5vdCB3YWl0ZWQgZm9yLCBhbmQgdGhlbiB0aGUgc2FuZGJveCBmcm96ZS5cbiAgICB2b2lkIG1hcmtlcnMucmVmcmVzaCgpO1xuICAgIGNsb2NrICs9IDYwXzAwMDtcbiAgICBleHBlY3QobWFya2Vycy5iZWhpbmQpLnRvQmUodHJ1ZSk7XG5cbiAgICBsZXQgY2F1Z2h0VXAgPSBmYWxzZTtcbiAgICBjb25zdCBjYXRjaFVwID0gbWFya2Vyc1xuICAgICAgLmNhdGNoVXAoYXN5bmMgKCkgPT4ge30pXG4gICAgICAudGhlbigoKSA9PiAoY2F1Z2h0VXAgPSB0cnVlKSk7XG4gICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgIGV4cGVjdChjYXVnaHRVcCkudG9CZShmYWxzZSk7XG4gICAgZXhwZWN0KHF1ZXJ5KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgIGF3YWl0IGNhdGNoVXA7XG4gICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJ3aXRoIGEgcmVmcmVzaCBpbiBmbGlnaHRcIiwgKCkgPT4ge1xuICAgIGxldCBjbG9jazogbnVtYmVyO1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgICBqZXN0LnVzZUZha2VUaW1lcnMoeyBkb05vdEZha2U6IFtcInNldEltbWVkaWF0ZVwiLCBcIm5leHRUaWNrXCJdIH0pO1xuICAgIH0pO1xuICAgIGFmdGVyRWFjaCgoKSA9PiBqZXN0LnVzZVJlYWxUaW1lcnMoKSk7XG5cbiAgICAvKiogTW92ZSB0aGUgY2xvY2sgYW5kIHRoZSB0aW1lcnMgb24gdG9nZXRoZXI6IG5vIGZyZWV6ZS4gKi9cbiAgICBjb25zdCBydW4gPSAobXM6IG51bWJlcikgPT4ge1xuICAgICAgZm9yIChsZXQgc3RlcCA9IDA7IHN0ZXAgPCBtczsgc3RlcCArPSAyNTApIHtcbiAgICAgICAgY2xvY2sgKz0gMjUwO1xuICAgICAgICBqZXN0LmFkdmFuY2VUaW1lcnNCeVRpbWUoMjUwKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGluc3RhbmNlID0gKGZhaWxzID0gZmFsc2UsIGNhbkZyZWV6ZSA9IHRydWUpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJpZXM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gICAgICBjb25zdCBxdWVyeSA9IGplc3QuZm4oXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IFByb21pc2U8eyByb3dzOiBSZXZhbGlkYXRpb25Mb2dSb3dbXTsgdHJ1bmNhdGVkOiBib29sZWFuIH0+KFxuICAgICAgICAgICAgKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICAgICAgICAgICAgcXVlcmllcy5wdXNoKCgpID0+XG4gICAgICAgICAgICAgICAgZmFpbHNcbiAgICAgICAgICAgICAgICAgID8gcmVqZWN0KG5ldyBFcnJvcihcInRocm90dGxlZFwiKSlcbiAgICAgICAgICAgICAgICAgIDogcmVzb2x2ZSh7IHJvd3M6IFtdLCB0cnVuY2F0ZWQ6IGZhbHNlIH0pLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICApO1xuICAgICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICAgIG1hcmtlcnM6IHsgcmVhZDogamVzdC5mbigpIH0gYXMgdW5rbm93biBhcyBUYWdNYXJrZXJUYWJsZSxcbiAgICAgICAgbG9nOiB7IHF1ZXJ5IH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICAgIHJlZnJlc2hJbnRlcnZhbE1zOiAxMDAwLFxuICAgICAgICBjbG9jazogKCkgPT4gY2xvY2ssXG4gICAgICAgIGNhbkZyZWV6ZSxcbiAgICAgIH0pO1xuICAgICAgbWFya2Vycy5qdWRnZUVudHJpZXNPZigoKSA9PiAwKTtcbiAgICAgIHJldHVybiB7IG1hcmtlcnMsIHF1ZXJ5LCBxdWVyaWVzIH07XG4gICAgfTtcblxuICAgIGl0KFwid2FpdHMgZm9yIGEgZnJlc2ggcXVlcnkgYWZ0ZXIgYSBmcmVlemUsIGV2ZW4gb25jZSB0aGUgbGF0ZSB0aWNrIGhhcyBydW5cIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBtYXJrZXJzLCBxdWVyeSwgcXVlcmllcyB9ID0gaW5zdGFuY2UoKTtcbiAgICAgIGNsb2NrICs9IDEwMDA7XG4gICAgICB2b2lkIG1hcmtlcnMucmVmcmVzaCgpO1xuICAgICAgY2xvY2sgKz0gNjBfMDAwO1xuICAgICAgLy8gQWZ0ZXIgdGhlIHRoYXcgdGhlIG92ZXJkdWUgdGljayBjYW4gcnVuIGJlZm9yZSBhbnkgcmVxdWVzdCBkb2VzLlxuICAgICAgamVzdC5hZHZhbmNlVGltZXJzQnlUaW1lKDI1MCk7XG5cbiAgICAgIGxldCBjYXVnaHRVcCA9IGZhbHNlO1xuICAgICAgY29uc3QgY2F0Y2hVcCA9IG1hcmtlcnNcbiAgICAgICAgLmNhdGNoVXAoYXN5bmMgKCkgPT4ge30pXG4gICAgICAgIC50aGVuKCgpID0+IChjYXVnaHRVcCA9IHRydWUpKTtcbiAgICAgIHF1ZXJpZXMuc2hpZnQoKSEoKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgICAgLy8gV2hhdCB0aGUgZmlyc3QgcXVlcnkga25ldyBwcmVkYXRlcyB0aGUgZnJlZXplLlxuICAgICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KGNhdWdodFVwKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdChxdWVyeSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgICAgYXdhaXQgY2F0Y2hVcDtcbiAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdChcImluIGEgY29udGFpbmVyLCB3aGljaCBpcyBuZXZlciBmcm96ZW4sIHdhaXRzIG9ubHkgZm9yIHRoZSBxdWVyeSBpbiBmbGlnaHRcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBtYXJrZXJzLCBxdWVyeSwgcXVlcmllcyB9ID0gaW5zdGFuY2UoZmFsc2UsIGZhbHNlKTtcbiAgICAgIGNsb2NrICs9IDEwMDA7XG4gICAgICB2b2lkIG1hcmtlcnMucmVmcmVzaCgpO1xuICAgICAgLy8gQSBsb25nIHN0YWxsLCBub3QgYSBmcmVlemU6IG5vIHRpbWVyIHRvIHRlbGwgdGhlbSBhcGFydCwgbm9uZSBuZWVkZWQuXG4gICAgICBjbG9jayArPSA2MF8wMDA7XG5cbiAgICAgIGNvbnN0IGNhdGNoVXAgPSBtYXJrZXJzLmNhdGNoVXAoYXN5bmMgKCkgPT4ge30pO1xuICAgICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgICAgYXdhaXQgY2F0Y2hVcDtcbiAgICAgIGV4cGVjdChxdWVyeSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgZXhwZWN0KG1hcmtlcnMuYmVoaW5kKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KFwiaXMgY2F1Z2h0IHVwIG9uY2UgdGhlIGNhdGNoLXVwJ3Mgc2xvdyBxdWVyeSByZXR1cm5zLCB0aGUgcHJvY2VzcyBydW5uaW5nIHRocm91Z2hvdXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBmYWlscyBvZiBbZmFsc2UsIHRydWVdKSB7XG4gICAgICAgIGNvbnN0IHsgbWFya2VycywgcXVlcmllcyB9ID0gaW5zdGFuY2UoZmFpbHMpO1xuICAgICAgICBjbG9jayArPSA2MF8wMDA7XG4gICAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZSh0cnVlKTtcbiAgICAgICAgY29uc3QgY2F0Y2hVcCA9IG1hcmtlcnMuY2F0Y2hVcChhc3luYyAoKSA9PiB7fSk7XG4gICAgICAgIHJ1bigzMDAwKTtcbiAgICAgICAgcXVlcmllcy5zaGlmdCgpISgpO1xuICAgICAgICBhd2FpdCBjYXRjaFVwO1xuICAgICAgICAvLyBPciB0aGUgZmlyc3QgYCd1c2UgY2FjaGUnYCBsb29rdXAgd291bGQgd2FpdCBmb3IgYW5vdGhlciBxdWVyeSxcbiAgICAgICAgLy8gaW5zaWRlIHRoZSByZW5kZXI6IG9uZSByZXF1ZXN0LCB0d28gd2FpdHMuXG4gICAgICAgIGV4cGVjdChtYXJrZXJzLmJlaGluZCkudG9CZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdChcIndhaXRzIG9ubHkgZm9yIGEgc2xvdyBxdWVyeSBpbiBmbGlnaHQsIHRoZSBwcm9jZXNzIHJ1bm5pbmcgdGhyb3VnaG91dFwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IG1hcmtlcnMsIHF1ZXJ5LCBxdWVyaWVzIH0gPSBpbnN0YW5jZSgpO1xuICAgICAgY2xvY2sgKz0gNjBfMDAwO1xuICAgICAgY29uc3QgZmlyc3QgPSBtYXJrZXJzLmNhdGNoVXAoYXN5bmMgKCkgPT4ge30pO1xuICAgICAgcnVuKDI1MDApO1xuICAgICAgLy8gUGFzdCB0aGUgZ3JhY2UgaW50byB0aGUgcXVlcnksIGJ1dCB0aGUgcXVlcnkgaXMgYXMgZnJlc2ggYXMgYW55LlxuICAgICAgbGV0IGNhdWdodFVwID0gZmFsc2U7XG4gICAgICBjb25zdCBzZWNvbmQgPSBtYXJrZXJzXG4gICAgICAgIC5jYXRjaFVwKGFzeW5jICgpID0+IHt9KVxuICAgICAgICAudGhlbigoKSA9PiAoY2F1Z2h0VXAgPSB0cnVlKSk7XG4gICAgICBxdWVyaWVzLnNoaWZ0KCkhKCk7XG4gICAgICBhd2FpdCBmaXJzdDtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRJbW1lZGlhdGUocmVzb2x2ZSkpO1xuICAgICAgZXhwZWN0KGNhdWdodFVwKS50b0JlKHRydWUpO1xuICAgICAgYXdhaXQgc2Vjb25kO1xuICAgICAgZXhwZWN0KHF1ZXJ5KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3Qgc2tpcCBhIHJvdyBmb3IgYW4gdW50cmFja2VkIHRhZyB0aGF0IGl0cyBmaXJzdCByZWFkIG1pc3NlZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGhlIHdyaXRlciBwdXRzIHRoZSBsb2cgcm93IGFuZCB0aGUgbWFya2VyIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCB0aGVcbiAgICAvLyBtYXJrZXIgcmVhZCBpcyBldmVudHVhbGx5IGNvbnNpc3RlbnQ6IGByZWZyZXNoYCBjYW4gc2VlIHRoZSByb3csIHRoZW5cbiAgICAvLyBgZW5zdXJlYCByZWFkIHRoZSBtYXJrZXIgZnJvbSBiZWZvcmUgaXQuIE1hcmtlZCBhcHBsaWVkIHdoaWxlIHRoZSB0YWdcbiAgICAvLyB3YXMgdW50cmFja2VkLCB0aGUgcm93IHdhcyBza2lwcGVkIGJ5IGV2ZXJ5IHF1ZXJ5IHRoZSBsb29rYmFjayByZXR1cm5lZFxuICAgIC8vIGl0IHRvLCBhbmQgdGhlIGluc3RhbmNlIHNlcnZlZCB0aGUgc3RhbGUgZW50cnkgdW50aWwgdGhlIHJvbGxpbmcgcmUtcmVhZC5cbiAgICBsZXQgY2xvY2sgPSAxXzAwMF8wMDA7XG4gICAgY29uc3QgcmV2YWxpZGF0ZWRBdCA9IDk5OV8wMDA7XG4gICAgY29uc3Qgcm93OiBSZXZhbGlkYXRpb25Mb2dSb3cgPSB7XG4gICAgICBzazogYCR7U3RyaW5nKGNsb2NrKS5wYWRTdGFydCgxNSwgXCIwXCIpfSNwb3N0c2AsXG4gICAgICBhdDogY2xvY2ssXG4gICAgICB0YWc6IFwicG9zdHNcIixcbiAgICAgIG1hcmtlcjogeyByZXZhbGlkYXRlZEF0IH0sXG4gICAgfTtcbiAgICBjb25zdCBxdWVyeSA9IGplc3QuZm4oYXN5bmMgKHNpbmNlOiBudW1iZXIpID0+ICh7XG4gICAgICByb3dzOiBbcm93XS5maWx0ZXIoKHIpID0+IHIuYXQgPj0gc2luY2UpLFxuICAgICAgdHJ1bmNhdGVkOiBmYWxzZSxcbiAgICB9KSk7XG4gICAgLy8gQSByZXBsaWNhIHRoYXQgaGFzIG5vdCBzZWVuIHRoZSB3cml0ZSB5ZXQuXG4gICAgY29uc3QgcmVhZCA9IGplc3QuZm4oYXN5bmMgKCkgPT4gbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oKSk7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICBtYXJrZXJzOiB7IHJlYWQgfSBhcyB1bmtub3duIGFzIFRhZ01hcmtlclRhYmxlLFxuICAgICAgbG9nOiB7IHF1ZXJ5IH0gYXMgdW5rbm93biBhcyBSZXZhbGlkYXRpb25Mb2csXG4gICAgICByZWZyZXNoSW50ZXJ2YWxNczogMTAwMCxcbiAgICAgIGNsb2NrOiAoKSA9PiBjbG9jayxcbiAgICAgIHJhbmRvbTogKCkgPT4gMCxcbiAgICB9KTtcbiAgICBtYXJrZXJzLmp1ZGdlRW50cmllc09mKCgpID0+IDApO1xuICAgIGF3YWl0IG1hcmtlcnMuZW5zdXJlKFtcIm90aGVyXCJdKTtcblxuICAgIGNsb2NrICs9IDEwMDA7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgLy8gVGhlIHJvdyBzZWVuIGJlZm9yZSB0aGUgcmVhZCBpcyBhcHBsaWVkIHRvIHdoYXQgdGhlIHJlYWQgZm91bmQuXG4gICAgYXdhaXQgbWFya2Vycy5lbnN1cmUoW1wicG9zdHNcIl0pO1xuICAgIGV4cGVjdChtYXJrZXJzLmdldChcInBvc3RzXCIpKS50b0VxdWFsKHsgcmV2YWxpZGF0ZWRBdCB9KTtcblxuICAgIGNsb2NrICs9IDEwMDA7XG4gICAgYXdhaXQgbWFya2Vycy5yZWZyZXNoKCk7XG4gICAgZXhwZWN0KHF1ZXJ5KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgZXhwZWN0KG1hcmtlcnMuZ2V0KFwicG9zdHNcIikpLnRvRXF1YWwoeyByZXZhbGlkYXRlZEF0IH0pO1xuICAgIC8vIE9ubHkgdGhlIG9uZSByZWFkIGVhY2ggdGFnJ3MgZmlyc3QgdXNlIGNvc3RzLlxuICAgIGV4cGVjdChyZWFkKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gIH0pO1xufSk7XG4iXX0=
|