cdk-nextjs 0.7.10 → 0.7.12
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 +76 -22
- package/.jsii.tabl.json +1 -1
- package/API.md +59 -3
- package/README.md +2 -2
- package/docs/breaking-changes.md +32 -0
- package/docs/harness-coverage.md +1 -1
- package/docs/next-build-output-guide.md +1 -1
- package/docs/nextjs-private-apis.md +128 -0
- package/lib/adapter/adapter.mjs +276 -24
- package/lib/adapter/build-outputs.d.ts +1 -1
- package/lib/adapter/build-outputs.js +29 -13
- package/lib/adapter/build-outputs.test.js +35 -7
- package/lib/adapter/cache-handler.d.ts +1 -1
- package/lib/adapter/cache-handler.js +1 -1
- package/lib/adapter/cache-kinds.d.ts +12 -1
- package/lib/adapter/cache-kinds.js +16 -4
- package/lib/adapter/init-cache.js +7 -7
- package/lib/adapter/local-file-cache-handler.d.ts +1 -1
- package/lib/adapter/local-file-cache-handler.js +1 -1
- package/lib/adapter/memory-cache-handler.d.ts +2 -2
- package/lib/adapter/memory-cache-handler.js +1 -1
- package/lib/adapter/s3-cache-handler.d.ts +2 -2
- package/lib/adapter/s3-cache-handler.js +1 -1
- package/lib/adapter/use-cache-common.d.ts +1 -1
- package/lib/adapter/use-cache-common.js +1 -1
- package/lib/adapter/use-cache-common.test.js +1 -1
- package/lib/adapter/use-cache-default-handler.d.ts +1 -1
- package/lib/adapter/use-cache-default-handler.js +1 -1
- package/lib/adapter/use-cache-handlers.test.js +1 -1
- package/lib/adapter/use-cache-remote-handler.d.ts +1 -1
- package/lib/adapter/use-cache-remote-handler.js +1 -1
- package/lib/cdk-nextjs-version.d.ts +10 -0
- package/lib/cdk-nextjs-version.js +15 -0
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.js +7 -6
- package/lib/nextjs-build/nextjs-build.test.js +16 -3
- 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 +5 -5
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.d.ts +74 -5
- package/lib/nextjs-static-assets.js +276 -41
- package/lib/nextjs-static-assets.test.js +286 -1
- package/lib/root-constructs/nextjs-base-construct.d.ts +5 -4
- package/lib/root-constructs/nextjs-base-construct.js +17 -8
- 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.test.js +17 -8
- package/lib/runtime/dispatch.js +4 -5
- package/lib/runtime/image-utils.d.ts +1 -0
- package/lib/runtime/image-utils.js +2 -1
- package/lib/runtime/image-utils.test.js +17 -1
- package/lib/runtime/image.js +47 -33
- package/lib/runtime/image.test.js +47 -26
- package/lib/runtime/lambda.mjs +281 -37
- package/lib/runtime/manifest.d.ts +34 -8
- package/lib/runtime/manifest.js +7 -5
- package/lib/runtime/server.mjs +281 -37
- package/package.json +1 -1
- package/scripts/capture-adapter-fixture.mjs +13 -1
- package/scripts/zero-config-build.mjs +5 -1
|
@@ -19,21 +19,14 @@ const request_1 = require("./http/request");
|
|
|
19
19
|
const response_1 = require("./http/response");
|
|
20
20
|
const sink_1 = require("./http/sink");
|
|
21
21
|
const image_1 = require("./image");
|
|
22
|
+
const cdk_nextjs_version_1 = require("../cdk-nextjs-version");
|
|
22
23
|
const next_modules_1 = require("./next-modules");
|
|
23
24
|
const PNG = Buffer.from("optimized-bytes");
|
|
24
25
|
const ETAG = "abc123";
|
|
25
|
-
/**
|
|
26
|
-
function stage(
|
|
26
|
+
/** A deployment root, which the dist dir the image cache uses sits under. */
|
|
27
|
+
function stage() {
|
|
27
28
|
const root = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), "cdk-nextjs-image-"));
|
|
28
29
|
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(root, ".next"));
|
|
29
|
-
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(root, ".next/required-server-files.json"), JSON.stringify({
|
|
30
|
-
config: {
|
|
31
|
-
basePath: "",
|
|
32
|
-
experimental: {},
|
|
33
|
-
images: { ...image_config_js_1.imageConfigDefault, localPatterns: undefined },
|
|
34
|
-
...extraConfig,
|
|
35
|
-
},
|
|
36
|
-
}));
|
|
37
30
|
return root;
|
|
38
31
|
}
|
|
39
32
|
/** The app's `cacheHandler`, reduced to a map: what the S3 handler is to it. */
|
|
@@ -61,22 +54,24 @@ const s3Hit = {
|
|
|
61
54
|
/** An optimizer over {@link MapCacheHandler}, as the adapter configures one. */
|
|
62
55
|
function optimizerFor(options = {}) {
|
|
63
56
|
const via = new image_1.RuntimeImageOptimizer({
|
|
64
|
-
deploymentRoot: stage(
|
|
65
|
-
|
|
66
|
-
cacheMaxMemorySize: 0,
|
|
67
|
-
...(options.images
|
|
68
|
-
? {
|
|
69
|
-
images: {
|
|
70
|
-
...image_config_js_1.imageConfigDefault,
|
|
71
|
-
localPatterns: undefined,
|
|
72
|
-
...options.images,
|
|
73
|
-
},
|
|
74
|
-
}
|
|
75
|
-
: {}),
|
|
76
|
-
}),
|
|
57
|
+
deploymentRoot: stage(),
|
|
58
|
+
// Just the fields `loadImageRuntime` reads.
|
|
77
59
|
manifest: {
|
|
60
|
+
cdkNextjsVersion: cdk_nextjs_version_1.CDK_NEXTJS_VERSION,
|
|
78
61
|
relativeProjectDir: "",
|
|
79
|
-
config: {
|
|
62
|
+
config: {
|
|
63
|
+
basePath: "",
|
|
64
|
+
assetPrefix: "",
|
|
65
|
+
distDir: ".next",
|
|
66
|
+
experimental: {},
|
|
67
|
+
images: {
|
|
68
|
+
...image_config_js_1.imageConfigDefault,
|
|
69
|
+
localPatterns: undefined,
|
|
70
|
+
...options.images,
|
|
71
|
+
},
|
|
72
|
+
cacheHandler: "../node_modules/cdk-nextjs/lib/adapter/cache-handler.mjs",
|
|
73
|
+
cacheMaxMemorySize: 0,
|
|
74
|
+
},
|
|
80
75
|
},
|
|
81
76
|
bucket: options.bucket ?? "assets",
|
|
82
77
|
bucketKeyPrefix: "",
|
|
@@ -187,6 +182,12 @@ describe("RuntimeImageOptimizer.isEnabled", () => {
|
|
|
187
182
|
expect(withImages({ unoptimized: true }).isEnabled()).toBe(false);
|
|
188
183
|
expect(withImages({ loader: "custom", loaderFile: "./loader.js" }).isEnabled()).toBe(false);
|
|
189
184
|
});
|
|
185
|
+
it("names a manifest from an older cdk-nextjs instead of a TypeError", () => {
|
|
186
|
+
const via = optimizerFor();
|
|
187
|
+
const { manifest } = via.options;
|
|
188
|
+
manifest.cdkNextjsVersion = "0.6.2";
|
|
189
|
+
expect(() => via.isEnabled()).toThrow(/written by cdk-nextjs 0\.6\.2/);
|
|
190
|
+
});
|
|
190
191
|
});
|
|
191
192
|
describe("RuntimeImageOptimizer response", () => {
|
|
192
193
|
it("answers with the headers next start sends", async () => {
|
|
@@ -289,6 +290,26 @@ describe("RuntimeImageOptimizer sources", () => {
|
|
|
289
290
|
cacheControl: "public, max-age=120",
|
|
290
291
|
});
|
|
291
292
|
});
|
|
293
|
+
// `next start` passes on the file's own header, which sets how long the
|
|
294
|
+
// optimized image is kept.
|
|
295
|
+
it("hands the optimizer the S3 object's Cache-Control", async () => {
|
|
296
|
+
const send = jest.fn(async () => ({
|
|
297
|
+
Body: (async function* () {
|
|
298
|
+
yield Buffer.from("s3-bytes");
|
|
299
|
+
})(),
|
|
300
|
+
ContentType: "image/png",
|
|
301
|
+
CacheControl: "public, max-age=31536000, immutable",
|
|
302
|
+
ETag: '"abc"',
|
|
303
|
+
}));
|
|
304
|
+
const { head } = await request("/_next/static/media/logo.png", {
|
|
305
|
+
via: optimizerFor({ s3: { send } }),
|
|
306
|
+
});
|
|
307
|
+
expect(head.statusCode).toBe(200);
|
|
308
|
+
expect(image_optimizer_js_1.imageOptimizer.mock.lastCall[0]).toMatchObject({
|
|
309
|
+
buffer: Buffer.from("s3-bytes"),
|
|
310
|
+
cacheControl: "public, max-age=31536000, immutable",
|
|
311
|
+
});
|
|
312
|
+
});
|
|
292
313
|
// `NextjsRegionalContainers`: the file is on disk, and a GetObject for it is
|
|
293
314
|
// a wasted round trip.
|
|
294
315
|
it("goes straight to the app's routes when there is no bucket", async () => {
|
|
@@ -391,7 +412,7 @@ describe("RuntimeImageOptimizer cache", () => {
|
|
|
391
412
|
expect(other.head.headers["x-nextjs-cache"]).toBe("HIT");
|
|
392
413
|
expect(image_optimizer_js_1.imageOptimizer).toHaveBeenCalledTimes(1);
|
|
393
414
|
});
|
|
394
|
-
//
|
|
415
|
+
// The manifest names it relative to the dist dir.
|
|
395
416
|
it("loads the app's cacheHandler from where next start would", async () => {
|
|
396
417
|
await request("/photos/cached.png", { via: optimizerFor() });
|
|
397
418
|
expect(imported).toMatch(/^file:\/\/.*\/node_modules\/cdk-nextjs\/lib\/adapter\/cache-handler\.mjs$/);
|
|
@@ -444,4 +465,4 @@ describe("RuntimeImageOptimizer cache", () => {
|
|
|
444
465
|
}
|
|
445
466
|
});
|
|
446
467
|
});
|
|
447
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2ltYWdlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ2hDLGlGQUFpRjtBQUNqRix5RUFBeUU7QUFDekUsSUFBSSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQ0FBcUMsQ0FBQztJQUM1RCxjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtDQUMxQixDQUFDLENBQUMsQ0FBQztBQUVKLHFDQUFnRTtBQUNoRSx5Q0FBZ0Q7QUFDaEQscUNBQWlDO0FBQ2pDLHlDQUFpQztBQUNqQyw2Q0FBdUM7QUFFdkMsNEVBQXFFO0FBQ3JFLDBFQUEwRTtBQUMxRSw0Q0FBcUQ7QUFDckQsOENBQW1FO0FBQ25FLHNDQUF5QztBQUN6QyxtQ0FJaUI7QUFFakIsaURBQTZDO0FBRTdDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUMzQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUM7QUFFdEIsaUZBQWlGO0FBQ2pGLFNBQVMsS0FBSyxDQUFDLGNBQXVDLEVBQUU7SUFDdEQsTUFBTSxJQUFJLEdBQUcsSUFBQSxxQkFBVyxFQUFDLElBQUEsZ0JBQUksRUFBQyxJQUFBLGdCQUFNLEdBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDOUQsSUFBQSxtQkFBUyxFQUFDLElBQUEsZ0JBQUksRUFBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMvQixJQUFBLHVCQUFhLEVBQ1gsSUFBQSxnQkFBSSxFQUFDLElBQUksRUFBRSxrQ0FBa0MsQ0FBQyxFQUM5QyxJQUFJLENBQUMsU0FBUyxDQUFD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QUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO2dCQUFTLENBQUM7WUFDVCxlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1zM1wiKTtcbi8vIFRoZSByZWFsIG1vZHVsZSwgd2l0aCB0aGUgb25lIHN0ZXAgdGhhdCBuZWVkcyBgc2hhcnBgIHN0dWJiZWQgb3V0OiB0aGVzZSB0ZXN0c1xuLy8gYXJlIGFib3V0IHRoZSByZXNwb25zZSBgaGFuZGxlYCB3cml0ZXMsIG5vdCBhYm91dCBvcHRpbWl6aW5nIGFuIGltYWdlLlxuamVzdC5tb2NrKFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIiwgKCkgPT4gKHtcbiAgLi4uamVzdC5yZXF1aXJlQWN0dWFsKFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIiksXG4gIGltYWdlT3B0aW1pemVyOiBqZXN0LmZuKCksXG59KSk7XG5cbmltcG9ydCB7IG1rZGlyU3luYywgbWtkdGVtcFN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVIZWFkZXJWYWx1ZSB9IGZyb20gXCJub2RlOmh0dHBcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgV3JpdGFibGUgfSBmcm9tIFwibm9kZTpzdHJlYW1cIjtcbmltcG9ydCB7IFMzQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuaW1wb3J0IHsgaW1hZ2VPcHRpbWl6ZXIgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIjtcbmltcG9ydCB7IGltYWdlQ29uZmlnRGVmYXVsdCB9IGZyb20gXCJuZXh0L2Rpc3Qvc2hhcmVkL2xpYi9pbWFnZS1jb25maWcuanNcIjtcbmltcG9ydCB7IFNoaW1JbmNvbWluZ01lc3NhZ2UgfSBmcm9tIFwiLi9odHRwL3JlcXVlc3RcIjtcbmltcG9ydCB7IFJlc3BvbnNlSGVhZCwgU2hpbVNlcnZlclJlc3BvbnNlIH0gZnJvbSBcIi4vaHR0cC9yZXNwb25zZVwiO1xuaW1wb3J0IHsgcGlwZVRvU2luayB9IGZyb20gXCIuL2h0dHAvc2lua1wiO1xuaW1wb3J0IHtcbiAgSW1hZ2VPcHRpbWl6ZXJPcHRpb25zLFxuICBuZXdJbWFnZVJlc3BvbnNlQ2FjaGUsXG4gIFJ1bnRpbWVJbWFnZU9wdGltaXplcixcbn0gZnJvbSBcIi4vaW1hZ2VcIjtcbmltcG9ydCB7IEFkYXB0ZXJNYW5pZmVzdCB9IGZyb20gXCIuL21hbmlmZXN0XCI7XG5pbXBvcnQgeyB1c2VOZXh0RnJvbSB9IGZyb20gXCIuL25leHQtbW9kdWxlc1wiO1xuXG5jb25zdCBQTkcgPSBCdWZmZXIuZnJvbShcIm9wdGltaXplZC1ieXRlc1wiKTtcbmNvbnN0IEVUQUcgPSBcImFiYzEyM1wiO1xuXG4vKiogSnVzdCB3aGF0IGBsb2FkSW1hZ2VSdW50aW1lYCByZWFkczogd2hlcmUgYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBpcy4gKi9cbmZ1bmN0aW9uIHN0YWdlKGV4dHJhQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9KTogc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IG1rZHRlbXBTeW5jKGpvaW4odG1wZGlyKCksIFwiY2RrLW5leHRqcy1pbWFnZS1cIikpO1xuICBta2RpclN5bmMoam9pbihyb290LCBcIi5uZXh0XCIpKTtcbiAgd3JpdGVGaWxlU3luYyhcbiAgICBqb2luKHJvb3QsIFwiLm5leHQvcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25cIiksXG4gICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGJhc2VQYXRoOiBcIlwiLFxuICAgICAgICBleHBlcmltZW50YWw6IHt9LFxuICAgICAgICBpbWFnZXM6IHsgLi4uaW1hZ2VDb25maWdEZWZhdWx0LCBsb2NhbFBhdHRlcm5zOiB1bmRlZmluZWQgfSxcbiAgICAgICAgLi4uZXh0cmFDb25maWcsXG4gICAgICB9LFxuICAgIH0pLFxuICApO1xuICByZXR1cm4gcm9vdDtcbn1cblxuLyoqIFRoZSBhcHAncyBgY2FjaGVIYW5kbGVyYCwgcmVkdWNlZCB0byBhIG1hcDogd2hhdCB0aGUgUzMgaGFuZGxlciBpcyB0byBpdC4gKi9cbmNsYXNzIE1hcENhY2hlSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuICBwdWJsaWMgc3RhdGljIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBNYXBDYWNoZUhhbmRsZXIub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cbiAgcHVibGljIGFzeW5jIGdldChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBNYXBDYWNoZUhhbmRsZXIuZW50cmllcy5nZXQoa2V5KSA/PyBudWxsO1xuICB9XG4gIHB1YmxpYyBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgTWFwQ2FjaGVIYW5kbGVyLmVudHJpZXMuc2V0KGtleSwgeyB2YWx1ZSwgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpIH0pO1xuICB9XG59XG5cbmxldCBpbXBvcnRlZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5jb25zdCBzM0hpdCA9IHtcbiAgc2VuZDogYXN5bmMgKCkgPT4gKHtcbiAgICBCb2R5OiBbQnVmZmVyLmZyb20oXCJ1cHN0cmVhbS1ieXRlc1wiKV0sXG4gICAgQ29udGVudFR5cGU6IFwiaW1hZ2UvcG5nXCIsXG4gICAgRVRhZzogJ1widXBzdHJlYW1cIicsXG4gIH0pLFxufSBhcyB1bmtub3duIGFzIFMzQ2xpZW50O1xuXG4vKiogQW4gb3B0aW1pemVyIG92ZXIge0BsaW5rIE1hcENhY2hlSGFuZGxlcn0sIGFzIHRoZSBhZGFwdGVyIGNvbmZpZ3VyZXMgb25lLiAqL1xuZnVuY3Rpb24gb3B0aW1pemVyRm9yKFxuICBvcHRpb25zOiB7XG4gICAgaW1hZ2VzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZmV0Y2hJbnRlcm5hbD86IEltYWdlT3B0aW1pemVyT3B0aW9uc1tcImZldGNoSW50ZXJuYWxcIl07XG4gICAgaW1wb3J0TW9kdWxlPzogSW1hZ2VPcHRpbWl6ZXJPcHRpb25zW1wiaW1wb3J0TW9kdWxlXCJdO1xuICAgIHMzPzogUzNDbGllbnQ7XG4gICAgYnVja2V0Pzogc3RyaW5nO1xuICB9ID0ge30sXG4pOiBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIge1xuICBjb25zdCB2aWEgPSBuZXcgUnVudGltZUltYWdlT3B0aW1pemVyKHtcbiAgICBkZXBsb3ltZW50Um9vdDogc3RhZ2Uoe1xuICAgICAgY2FjaGVIYW5kbGVyOiBcIi4uL25vZGVfbW9kdWxlcy9jZGstbmV4dGpzL2xpYi9hZGFwdGVyL2NhY2hlLWhhbmRsZXIubWpzXCIsXG4gICAgICBjYWNoZU1heE1lbW9yeVNpemU6IDAsXG4gICAgICAuLi4ob3B0aW9ucy5pbWFnZXNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBpbWFnZXM6IHtcbiAgICAgICAgICAgICAgLi4uaW1hZ2VDb25maWdEZWZhdWx0LFxuICAgICAgICAgICAgICBsb2NhbFBhdHRlcm5zOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIC4uLm9wdGlvbnMuaW1hZ2VzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH0pLFxuICAgIG1hbmlmZXN0OiB7XG4gICAgICByZWxhdGl2ZVByb2plY3REaXI6IFwiXCIsXG4gICAgICBjb25maWc6IHsgZGlzdERpcjogXCIubmV4dFwiIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIEFkYXB0ZXJNYW5pZmVzdCxcbiAgICBidWNrZXQ6IG9wdGlvbnMuYnVja2V0ID8/IFwiYXNzZXRzXCIsXG4gICAgYnVja2V0S2V5UHJlZml4OiBcIlwiLFxuICAgIGZldGNoSW50ZXJuYWw6XG4gICAgICBvcHRpb25zLmZldGNoSW50ZXJuYWwgPz9cbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgZmV0Y2hJbnRlcm5hbFwiKTtcbiAgICAgIH0pLFxuICAgIGltcG9ydE1vZHVsZTpcbiAgICAgIG9wdGlvbnMuaW1wb3J0TW9kdWxlID8/XG4gICAgICAoYXN5bmMgKHVybCkgPT4ge1xuICAgICAgICBpbXBvcnRlZCA9IHVybDtcbiAgICAgICAgcmV0dXJuIHsgZGVmYXVsdDogTWFwQ2FjaGVIYW5kbGVyIH07XG4gICAgICB9KSxcbiAgfSk7XG4gICh2aWEgYXMgdW5rbm93biBhcyB7IHMzOiBTM0NsaWVudCB9KS5zMyA9IG9wdGlvbnMuczMgPz8gczNIaXQ7XG4gIHJldHVybiB2aWE7XG59XG5cbmxldCBvcHRpbWl6ZXI6IFJ1bnRpbWVJbWFnZU9wdGltaXplcjtcblxuYmVmb3JlQWxsKCgpID0+IHtcbiAgdXNlTmV4dEZyb20oam9pbihfX2Rpcm5hbWUsIFwiLi4vLi5cIikpO1xuICBvcHRpbWl6ZXIgPSBvcHRpbWl6ZXJGb3IoKTtcbn0pO1xuXG5iZWZvcmVFYWNoKCgpID0+IHtcbiAgTWFwQ2FjaGVIYW5kbGVyLmVudHJpZXMuY2xlYXIoKTtcbiAgaW1wb3J0ZWQgPSB1bmRlZmluZWQ7XG4gIChpbWFnZU9wdGltaXplciBhcyBqZXN0Lk1vY2spLm1vY2tDbGVhcigpO1xuICAoaW1hZ2VPcHRpbWl6ZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgYnVmZmVyOiBQTkcsXG4gICAgY29udGVudFR5cGU6IFwiaW1hZ2Uvd2VicFwiLFxuICAgIG1heEFnZTogNjAsXG4gICAgZXRhZzogRVRBRyxcbiAgfSk7XG59KTtcblxuaW50ZXJmYWNlIEFuc3dlciB7XG4gIHJlYWRvbmx5IGhlYWQ6IFJlc3BvbnNlSGVhZDtcbiAgcmVhZG9ubHkgYm9keTogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0KFxuICBzcmM6IHN0cmluZyxcbiAgaW5pdDoge1xuICAgIG1ldGhvZD86IHN0cmluZztcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICB2aWE/OiBSdW50aW1lSW1hZ2VPcHRpbWl6ZXI7XG4gICAgd2FpdFVudGlsPzogKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHZvaWQ7XG4gIH0gPSB7fSxcbik6IFByb21pc2U8QW5zd2VyPiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoXG4gICAgYGh0dHBzOi8vc2hvcC5leGFtcGxlLnRlc3QvX25leHQvaW1hZ2U/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNyYyl9Jnc9NjQwJnE9NzVgLFxuICApO1xuICBjb25zdCByZXEgPSBuZXcgU2hpbUluY29taW5nTWVzc2FnZSh7XG4gICAgbWV0aG9kOiBpbml0Lm1ldGhvZCA/PyBcIkdFVFwiLFxuICAgIHVybDogYCR7dXJsLnBhdGhuYW1lfSR7dXJsLnNlYXJjaH1gLFxuICAgIGhlYWRlcnM6IHsgYWNjZXB0OiBcImltYWdlL3dlYnBcIiwgLi4uaW5pdC5oZWFkZXJzIH0sXG4gIH0pO1xuICBjb25zdCByZXMgPSBuZXcgU2hpbVNlcnZlclJlc3BvbnNlKCk7XG4gIGxldCBoZWFkOiBSZXNwb25zZUhlYWQgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcbiAgY29uc3QgZG9uZSA9IHBpcGVUb1NpbmsoXG4gICAgcmVxLFxuICAgIHJlcyxcbiAgICB7XG4gICAgICBiZWdpbihyZXNwb25zZUhlYWQpIHtcbiAgICAgICAgaGVhZCA9IHJlc3BvbnNlSGVhZDtcbiAgICAgICAgcmV0dXJuIG5ldyBXcml0YWJsZSh7XG4gICAgICAgICAgd3JpdGUoY2h1bmssIF9lbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNodW5rcy5wdXNoKEJ1ZmZlci5mcm9tKGNodW5rKSk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHsgY29tcHJlc3M6IGZhbHNlIH0sXG4gICk7XG4gIGNvbnN0IHBlbmRpbmc6IEFycmF5PFByb21pc2U8dW5rbm93bj4+ID0gW107XG4gIGF3YWl0IChpbml0LnZpYSA/PyBvcHRpbWl6ZXIpLmhhbmRsZShcbiAgICByZXEsXG4gICAgcmVzLFxuICAgIHVybCxcbiAgICBpbml0LndhaXRVbnRpbCA/PyAoKHByb21pc2UpID0+IHBlbmRpbmcucHVzaChwcm9taXNlKSksXG4gICk7XG4gIGF3YWl0IGRvbmU7XG4gIC8vIFNldHRsZWQsIG5vdCBhd2FpdGVkOiB0aGUgcnVudGltZSBsb2dzIGEgcmVqZWN0aW9uIHJhdGhlciB0aGFuIGZhaWxpbmcgb24gaXQuXG4gIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwZW5kaW5nKTtcbiAgcmV0dXJuIHsgaGVhZDogaGVhZCEsIGJvZHk6IEJ1ZmZlci5jb25jYXQoY2h1bmtzKS50b1N0cmluZygpIH07XG59XG5cbmRlc2NyaWJlKFwibmV3SW1hZ2VSZXNwb25zZUNhY2hlXCIsICgpID0+IHtcbiAgdHlwZSBSZXNwb25zZUNhY2hlQ2xhc3MgPSBQYXJhbWV0ZXJzPHR5cGVvZiBuZXdJbWFnZVJlc3BvbnNlQ2FjaGU+WzBdO1xuXG4gIC8qKiBuZXh0IDwgMTYuMy44J3MgYFJlc3BvbnNlQ2FjaGVgOiBgKG1pbmltYWxfbW9kZSwgbWF4U2l6ZSwgdHRsKWAuICovXG4gIGNsYXNzIExlZ2FjeVJlc3BvbnNlQ2FjaGUge1xuICAgIHJlYWRvbmx5IG1pbmltYWxfbW9kZTogdW5rbm93bjtcbiAgICBjb25zdHJ1Y3RvcihtaW5pbWFsTW9kZTogdW5rbm93bikge1xuICAgICAgdGhpcy5taW5pbWFsX21vZGUgPSBtaW5pbWFsTW9kZTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIG5leHQgPj0gMTYuMy44J3M6IGAoeyBtaW5pbWFsTW9kZSwgcm91dGUsIC4uLiB9KWAsIHRocm93aW5nIHdpdGhvdXQgYSByb3V0ZS5cbiAgICogVGhlIGZpZWxkIGlzIHJlbmFtZWQgaGVyZSB0byBzaG93IHRoZSBjaG9pY2UgZG9lc24ndCBkZXBlbmQgb24gaXQuXG4gICAqL1xuICBjbGFzcyBSb3V0ZVJlc3BvbnNlQ2FjaGUge1xuICAgIHJlYWRvbmx5IG1vZGU6IHVua25vd247XG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgbWluaW1hbE1vZGUsXG4gICAgICByb3V0ZSxcbiAgICB9OiB7XG4gICAgICBtaW5pbWFsTW9kZTogYm9vbGVhbjtcbiAgICAgIHJvdXRlPzogdW5rbm93bjtcbiAgICB9KSB7XG4gICAgICBpZiAoIXJvdXRlKSB0aHJvdyBuZXcgRXJyb3IoXCJSZXNwb25zZSBjYWNoZSByZXF1aXJlcyBhIHNvdXJjZSByb3V0ZVwiKTtcbiAgICAgIHRoaXMubW9kZSA9IG1pbmltYWxNb2RlO1xuICAgIH1cbiAgfVxuICBjb25zdCBjb25zdHJ1Y3QgPSAoUmVzcG9uc2VDYWNoZTogbmV3IChhcmc6IG5ldmVyKSA9PiBvYmplY3QpID0+XG4gICAgbmV3SW1hZ2VSZXNwb25zZUNhY2hlKFxuICAgICAgUmVzcG9uc2VDYWNoZSBhcyB1bmtub3duIGFzIFJlc3BvbnNlQ2FjaGVDbGFzcyxcbiAgICApIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgaXQoXCJwYXNzZXMgeyBtaW5pbWFsTW9kZSwgcm91dGU6ICdpbWFnZScgfSB0byBhIG5leHQgdGhhdCB0YWtlcyBpdFwiLCAoKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBjb25zdHJ1Y3QoUm91dGVSZXNwb25zZUNhY2hlKTtcbiAgICBleHBlY3QoY2FjaGUpLnRvQmVJbnN0YW5jZU9mKFJvdXRlUmVzcG9uc2VDYWNoZSk7XG4gICAgZXhwZWN0KGNhY2hlLm1vZGUpLnRvQmUoZmFsc2UpO1xuICB9KTtcblxuICAvLyBCeSB3aGF0IHRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzLCBub3QgdGhlIHZlcnNpb246IGEgY2FuYXJ5IGN1dCBiZWZvcmVcbiAgLy8gMTYuMy44J3MgY2hhbmdlIHJlYWRzIGFzIG5ld2VyIHRoYW4gaXQuXG4gIGl0KFwicGFzc2VzIG1pbmltYWxNb2RlIGFsb25lIHRvIGEgbmV4dCB0aGF0IHRvb2sgdGhlIG9wdGlvbnMgYXMgbWluaW1hbE1vZGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNhY2hlID0gY29uc3RydWN0KExlZ2FjeVJlc3BvbnNlQ2FjaGUpO1xuICAgIGV4cGVjdChjYWNoZSkudG9CZUluc3RhbmNlT2YoTGVnYWN5UmVzcG9uc2VDYWNoZSk7XG4gICAgZXhwZWN0KGNhY2hlLm1pbmltYWxfbW9kZSkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KFwicmV0aHJvd3MgYSBjb25zdHJ1Y3RvciBlcnJvciB0aGF0IGlzbid0IHRoZSBtaXNzaW5nIHJvdXRlXCIsICgpID0+IHtcbiAgICBjbGFzcyBCcm9rZW5SZXNwb25zZUNhY2hlIHtcbiAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJib29tXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBleHBlY3QoKCkgPT4gY29uc3RydWN0KEJyb2tlblJlc3BvbnNlQ2FjaGUpKS50b1Rocm93KFwiYm9vbVwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJSdW50aW1lSW1hZ2VPcHRpbWl6ZXIuaXNFbmFibGVkXCIsICgpID0+IHtcbiAgY29uc3Qgd2l0aEltYWdlcyA9IChpbWFnZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PlxuICAgIG9wdGltaXplckZvcih7IGltYWdlcyB9KTtcblxuICAvLyBXaGVyZSBgbmV4dCBzdGFydGAgYW5zd2VycyA0MDQgcmF0aGVyIHRoYW4gb3B0aW1pemUuXG4gIGl0KFwiaXMgb2ZmIGZvciBpbWFnZXMudW5vcHRpbWl6ZWQgYW5kIGZvciBhIG5vbi1kZWZhdWx0IGxvYWRlclwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHdpdGhJbWFnZXMoe30pLmlzRW5hYmxlZCgpKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdCh3aXRoSW1hZ2VzKHsgdW5vcHRpbWl6ZWQ6IHRydWUgfSkuaXNFbmFibGVkKCkpLnRvQmUoZmFsc2UpO1xuICAgIGV4cGVjdChcbiAgICAgIHdpdGhJbWFnZXMoeyBsb2FkZXI6IFwiY3VzdG9tXCIsIGxvYWRlckZpbGU6IFwiLi9sb2FkZXIuanNcIiB9KS5pc0VuYWJsZWQoKSxcbiAgICApLnRvQmUoZmFsc2UpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlJ1bnRpbWVJbWFnZU9wdGltaXplciByZXNwb25zZVwiLCAoKSA9PiB7XG4gIGl0KFwiYW5zd2VycyB3aXRoIHRoZSBoZWFkZXJzIG5leHQgc3RhcnQgc2VuZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCwgYm9keSB9ID0gYXdhaXQgcmVxdWVzdChcIi9waG90b3MvbG9nby5wbmdcIik7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgIGV4cGVjdChoZWFkLmhlYWRlcnMpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgXCJjYWNoZS1jb250cm9sXCI6IFwicHVibGljLCBtYXgtYWdlPTYwLCBtdXN0LXJldmFsaWRhdGVcIixcbiAgICAgIFwiY29udGVudC10eXBlXCI6IFwiaW1hZ2Uvd2VicFwiLFxuICAgICAgXCJjb250ZW50LWxlbmd0aFwiOiBTdHJpbmcoUE5HLmxlbmd0aCksXG4gICAgICBcImNvbnRlbnQtZGlzcG9zaXRpb25cIjogJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPVwibG9nby53ZWJwXCInLFxuICAgICAgXCJjb250ZW50LXNlY3VyaXR5LXBvbGljeVwiOiBpbWFnZUNvbmZpZ0RlZmF1bHQuY29udGVudFNlY3VyaXR5UG9saWN5LFxuICAgICAgZXRhZzogRVRBRyxcbiAgICAgIHZhcnk6IFwiQWNjZXB0XCIsXG4gICAgICBcIngtbmV4dGpzLWNhY2hlXCI6IFwiTUlTU1wiLFxuICAgIH0pO1xuICAgIGV4cGVjdChib2R5KS50b0JlKFBORy50b1N0cmluZygpKTtcbiAgfSk7XG5cbiAgLy8gQ29udGVudC1oYXNoZWQsIHNvIHRoZSBuYW1lIGNoYW5nZXMgd2hlbmV2ZXIgdGhlIGJ5dGVzIGRvLlxuICBpdChcImNhY2hlcyBhIHN0YXRpY2FsbHkgaW1wb3J0ZWQgaW1hZ2UgZm9yIGEgeWVhciwgaW1tdXRhYmxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGhlYWQgfSA9IGF3YWl0IHJlcXVlc3QoXCIvX25leHQvc3RhdGljL21lZGlhL2xvZ28uM2YyYTFjLnBuZ1wiKTtcbiAgICBleHBlY3QoaGVhZC5oZWFkZXJzW1wiY2FjaGUtY29udHJvbFwiXSkudG9CZShcbiAgICAgIFwicHVibGljLCBtYXgtYWdlPTMxNTM2MDAwMCwgaW1tdXRhYmxlXCIsXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gYHdyaXRlSGVhZGAgcmVqZWN0cyBhIGhlYWRlciB2YWx1ZSBvdXRzaWRlIGxhdGluMSB3aXRoIEVSUl9JTlZBTElEX0NIQVIsXG4gIC8vIGFuZCB0aGUgTGFtYmRhIHNpbmsgd3JpdGVzIHRoZSBoZWFkIHRocm91Z2ggaXQuXG4gIGl0KFwiZW5jb2RlcyBhIG5vbi1sYXRpbjEgZmlsZW5hbWUgcmF0aGVyIHRoYW4gc2VuZGluZyBpdCByYXdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCB9ID0gYXdhaXQgcmVxdWVzdChcIi/DvG1sYXV0LeWGmeecny5wbmdcIik7XG4gICAgY29uc3QgZGlzcG9zaXRpb24gPSBoZWFkLmhlYWRlcnNbXCJjb250ZW50LWRpc3Bvc2l0aW9uXCJdO1xuICAgIGV4cGVjdChkaXNwb3NpdGlvbikudG9NYXRjaCgvXmF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiW15cIl0qXCI7IGZpbGVuYW1lXFwqPS8pO1xuICAgIGV4cGVjdChkaXNwb3NpdGlvbikudG9Db250YWluKFxuICAgICAgYGZpbGVuYW1lKj1VVEYtOCcnJHtlbmNvZGVVUklDb21wb25lbnQoXCLDvG1sYXV0LeWGmeecny53ZWJwXCIpfWAsXG4gICAgKTtcbiAgICBleHBlY3QoKCkgPT5cbiAgICAgIHZhbGlkYXRlSGVhZGVyVmFsdWUoXCJDb250ZW50LURpc3Bvc2l0aW9uXCIsIGRpc3Bvc2l0aW9uKSxcbiAgICApLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIGl0LmVhY2goW1xuICAgIFtcInRoZSBleGFjdCB0YWdcIiwgRVRBR10sXG4gICAgW1wiYSB3ZWFrIGZvcm0gb2YgaXRcIiwgYFcvJHtFVEFHfWBdLFxuICAgIFtcImEgbGlzdCBjb250YWluaW5nIGl0XCIsIGBcIm90aGVyXCIsICR7RVRBR31gXSxcbiAgICBbXCJhIHdpbGRjYXJkXCIsIFwiKlwiXSxcbiAgXSkoXCJhbnN3ZXJzIDMwNCB0byBJZi1Ob25lLU1hdGNoIHdpdGggJXNcIiwgYXN5bmMgKF9uYW1lLCBpZk5vbmVNYXRjaCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCwgYm9keSB9ID0gYXdhaXQgcmVxdWVzdChcIi9sb2dvLnBuZ1wiLCB7XG4gICAgICBoZWFkZXJzOiB7IFwiaWYtbm9uZS1tYXRjaFwiOiBpZk5vbmVNYXRjaCB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMzA0KTtcbiAgICBleHBlY3QoaGVhZC5oZWFkZXJzLmV0YWcpLnRvQmUoRVRBRyk7XG4gICAgZXhwZWN0KGhlYWQuaGVhZGVyc1tcImNhY2hlLWNvbnRyb2xcIl0pLnRvQmUoXG4gICAgICBcInB1YmxpYywgbWF4LWFnZT02MCwgbXVzdC1yZXZhbGlkYXRlXCIsXG4gICAgKTtcbiAgICBleHBlY3QoYm9keSkudG9CZShcIlwiKTtcbiAgfSk7XG5cbiAgaXQoXCJhbnN3ZXJzIDIwMCB0byBhbiBJZi1Ob25lLU1hdGNoIHRoYXQgZG9lcyBub3QgbWF0Y2hcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCB9ID0gYXdhaXQgcmVxdWVzdChcIi9sb2dvLnBuZ1wiLCB7XG4gICAgICBoZWFkZXJzOiB7IFwiaWYtbm9uZS1tYXRjaFwiOiAnXCJvdGhlclwiJyB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgfSk7XG5cbiAgaXQoXCJzZW5kcyB0aGUgaGVhZGVycyBidXQgbm8gYm9keSB0byBIRUFEXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGhlYWQsIGJvZHkgfSA9IGF3YWl0IHJlcXVlc3QoXCIvbG9nby5wbmdcIiwgeyBtZXRob2Q6IFwiSEVBRFwiIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgICBleHBlY3QoaGVhZC5oZWFkZXJzW1wiY29udGVudC1sZW5ndGhcIl0pLnRvQmUoU3RyaW5nKFBORy5sZW5ndGgpKTtcbiAgICBleHBlY3QoYm9keSkudG9CZShcIlwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJSdW50aW1lSW1hZ2VPcHRpbWl6ZXIgc291cmNlc1wiLCAoKSA9PiB7XG4gIC8vIGBuZXh0IHN0YXJ0YCBmZXRjaGVzIGEgcmVtb3RlIHNvdXJjZSBvbmx5IHdoZW4gYHJlbW90ZVBhdHRlcm5zYCBvciBgZG9tYWluc2BcbiAgLy8gYWxsb3cgaXQ7IHRoZSBzdGFnZSdzIGNvbmZpZyBhbGxvd3Mgbm9uZS4gQW55dGhpbmcgZWxzZSB3b3VsZCBtYWtlIHRoZVxuICAvLyBvcHRpbWl6ZXIgYW4gb3BlbiBwcm94eSBpbnRvIHdoYXRldmVyIGl0IGNhbiByZWFjaC5cbiAgaXQuZWFjaChbXG4gICAgW1wiYW5vdGhlciBvcmlnaW5cIiwgXCJodHRwczovL2V2aWwuZXhhbXBsZS50ZXN0L3gucG5nXCJdLFxuICAgIFtcImluc3RhbmNlIG1ldGFkYXRhXCIsIFwiaHR0cDovLzE2OS4yNTQuMTY5LjI1NC9sYXRlc3QvbWV0YS1kYXRhL1wiXSxcbiAgICBbXCJhIHByb3RvY29sLXJlbGF0aXZlIHVybFwiLCBcIi8vZXZpbC5leGFtcGxlLnRlc3QveC5wbmdcIl0sXG4gIF0pKFwicmVqZWN0cyBhIHJlbW90ZSBzb3VyY2UgdGhhdCBpcyBub3QgYWxsb3dlZDogJXNcIiwgYXN5bmMgKF9uYW1lLCBzcmMpID0+IHtcbiAgICBjb25zdCB7IGhlYWQsIGJvZHkgfSA9IGF3YWl0IHJlcXVlc3Qoc3JjKTtcbiAgICBleHBlY3QoaGVhZC5zdGF0dXNDb2RlKS50b0JlKDQwMCk7XG4gICAgZXhwZWN0KGJvZHkpLnRvTWF0Y2goL1widXJsXCIgcGFyYW1ldGVyLyk7XG4gICAgZXhwZWN0KGltYWdlT3B0aW1pemVyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBmdW5jdGlvbiB3aXRoUzNNaXNzKFxuICAgIGZldGNoSW50ZXJuYWw/OiBJbWFnZU9wdGltaXplck9wdGlvbnNbXCJmZXRjaEludGVybmFsXCJdLFxuICApOiBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIge1xuICAgIHJldHVybiBvcHRpbWl6ZXJGb3Ioe1xuICAgICAgZmV0Y2hJbnRlcm5hbCxcbiAgICAgIHMzOiB7XG4gICAgICAgIHNlbmQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIm1pc3NpbmdcIiksIHsgbmFtZTogXCJOb1N1Y2hLZXlcIiB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBTM0NsaWVudCxcbiAgICB9KTtcbiAgfVxuXG4gIGl0KFwiZmFsbHMgYmFjayB0byB0aGUgYXBwJ3Mgcm91dGVzIGZvciBhIHNvdXJjZSBTMyBoYXMgbm8gZmlsZSBmb3JcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZldGNoSW50ZXJuYWwgPSBqZXN0LmZuKGFzeW5jICgpID0+ICh7XG4gICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiY29udGVudC10eXBlXCI6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBcInB1YmxpYywgbWF4LWFnZT0xMjBcIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBCdWZmZXIuZnJvbShcInJvdXRlLWJ5dGVzXCIpLFxuICAgIH0pKTtcbiAgICBjb25zdCB7IGhlYWQgfSA9IGF3YWl0IHJlcXVlc3QoXCIvYXBpL2F2YXRhcj9pZD00MlwiLCB7XG4gICAgICB2aWE6IHdpdGhTM01pc3MoZmV0Y2hJbnRlcm5hbCksXG4gICAgfSk7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgIGV4cGVjdChmZXRjaEludGVybmFsKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIFwiL2FwaS9hdmF0YXI/aWQ9NDJcIixcbiAgICAgIGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgaW1hZ2VDb25maWdEZWZhdWx0Lm1heGltdW1SZXNwb25zZUJvZHksXG4gICAgKTtcbiAgICBleHBlY3QoKGltYWdlT3B0aW1pemVyIGFzIGplc3QuTW9jaykubW9jay5sYXN0Q2FsbFswXSkudG9NYXRjaE9iamVjdCh7XG4gICAgICBidWZmZXI6IEJ1ZmZlci5mcm9tKFwicm91dGUtYnl0ZXNcIiksXG4gICAgICBjb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICAgIGNhY2hlQ29udHJvbDogXCJwdWJsaWMsIG1heC1hZ2U9MTIwXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIGBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNgOiB0aGUgZmlsZSBpcyBvbiBkaXNrLCBhbmQgYSBHZXRPYmplY3QgZm9yIGl0IGlzXG4gIC8vIGEgd2FzdGVkIHJvdW5kIHRyaXAuXG4gIGl0KFwiZ29lcyBzdHJhaWdodCB0byB0aGUgYXBwJ3Mgcm91dGVzIHdoZW4gdGhlcmUgaXMgbm8gYnVja2V0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzZW5kID0gamVzdC5mbigpO1xuICAgIGNvbnN0IGZldGNoSW50ZXJuYWwgPSBqZXN0LmZuKGFzeW5jICgpID0+ICh7XG4gICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICBoZWFkZXJzOiB7IFwiY29udGVudC10eXBlXCI6IFwiaW1hZ2UvcG5nXCIgfSxcbiAgICAgIGJvZHk6IEJ1ZmZlci5mcm9tKFwiZGlzay1ieXRlc1wiKSxcbiAgICB9KSk7XG4gICAgY29uc3QgeyBoZWFkIH0gPSBhd2FpdCByZXF1ZXN0KFwiL2xvZ28ucG5nXCIsIHtcbiAgICAgIHZpYTogb3B0aW1pemVyRm9yKHtcbiAgICAgICAgYnVja2V0OiBcIlwiLFxuICAgICAgICBmZXRjaEludGVybmFsLFxuICAgICAgICBzMzogeyBzZW5kIH0gYXMgdW5rbm93biBhcyBTM0NsaWVudCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgICBleHBlY3Qoc2VuZCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICBleHBlY3QoZmV0Y2hJbnRlcm5hbCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICBcIi9sb2dvLnBuZ1wiLFxuICAgICAgZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICBpbWFnZUNvbmZpZ0RlZmF1bHQubWF4aW11bVJlc3BvbnNlQm9keSxcbiAgICApO1xuICB9KTtcblxuICBpdChcImFuc3dlcnMgNDAwIHdoZW4gdGhlIHJvdXRlIHNlbmRzIG5vIGJvZHlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCB9ID0gYXdhaXQgcmVxdWVzdChcIi9hcGkvYXZhdGFyP2lkPTQyXCIsIHtcbiAgICAgIHZpYTogd2l0aFMzTWlzcyhhc3luYyAoKSA9PiAoe1xuICAgICAgICBzdGF0dXNDb2RlOiA0MDQsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiBCdWZmZXIuYWxsb2MoMCksXG4gICAgICB9KSksXG4gICAgfSk7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSg0MDApO1xuICB9KTtcblxuICBpdChcImFuc3dlcnMgYW4gZXhwbGljaXQgNTAyIGZvciBhIHNvdXJjZSBzZXJ2ZWQgYnkgYW5vdGhlciBmdW5jdGlvbkdyb3VwcyBncm91cFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3IgPSBqZXN0LnNweU9uKGNvbnNvbGUsIFwiZXJyb3JcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBoZWFkLCBib2R5IH0gPSBhd2FpdCByZXF1ZXN0KFwiL2FwaS9hdmF0YXI/aWQ9NDJcIiwge1xuICAgICAgICB2aWE6IHdpdGhTM01pc3MoYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiAwLFxuICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgIGJvZHk6IEJ1ZmZlci5hbGxvYygwKSxcbiAgICAgICAgICBvdGhlckdyb3VwOiBcImF2YXRhcnNcIixcbiAgICAgICAgfSkpLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoaGVhZC5zdGF0dXNDb2RlKS50b0JlKDUwMik7XG4gICAgICBleHBlY3QoYm9keSkudG9NYXRjaCgvYW5vdGhlciBmdW5jdGlvbkdyb3VwcyBncm91cC8pO1xuICAgICAgZXhwZWN0KGltYWdlT3B0aW1pemVyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlcnJvci5tb2NrUmVzdG9yZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gYGltYWdlcy5tYXhpbXVtUmVzcG9uc2VCb2R5YCwgd2hpY2ggYG5leHQgc3RhcnRgIGVuZm9yY2VzIG9uIGxvY2FsXG4gIC8vIHNvdXJjZXMgdG9vOiBwYXN0IGl0LCB0aGUgc291cmNlIGlzIG5vdCByZWFkIGludG8gbWVtb3J5LlxuICBpdChcImFuc3dlcnMgNDEzIGZvciBhIHJvdXRlIHJlc3BvbnNlIG92ZXIgbWF4aW11bVJlc3BvbnNlQm9keVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBoZWFkIH0gPSBhd2FpdCByZXF1ZXN0KFwiL2FwaS9leHBvcnRcIiwge1xuICAgICAgdmlhOiB3aXRoUzNNaXNzKGFzeW5jICgpID0+ICh7XG4gICAgICAgIHN0YXR1c0NvZGU6IDAsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiBCdWZmZXIuYWxsb2MoMCksXG4gICAgICAgIHRvb0xhcmdlOiB0cnVlLFxuICAgICAgfSkpLFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoNDEzKTtcbiAgICBleHBlY3QoaW1hZ2VPcHRpbWl6ZXIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KFwiYW5zd2VycyA0MTMgZm9yIGFuIFMzIG9iamVjdCBvdmVyIG1heGltdW1SZXNwb25zZUJvZHlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCB9ID0gYXdhaXQgcmVxdWVzdChcIi92aWRlby5tcDRcIiwge1xuICAgICAgdmlhOiBvcHRpbWl6ZXJGb3Ioe1xuICAgICAgICBpbWFnZXM6IHsgbWF4aW11bVJlc3BvbnNlQm9keTogMTAgfSxcbiAgICAgICAgczM6IHtcbiAgICAgICAgICBzZW5kOiBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgQm9keTogW0J1ZmZlci5mcm9tKFwibmV2ZXIgcmVhZFwiKV0sXG4gICAgICAgICAgICBDb250ZW50TGVuZ3RoOiAxMSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIFMzQ2xpZW50LFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSg0MTMpO1xuICAgIGV4cGVjdChpbWFnZU9wdGltaXplcikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJSdW50aW1lSW1hZ2VPcHRpbWl6ZXIgY2FjaGVcIiwgKCkgPT4ge1xuICBpdChcIm9wdGltaXplcyBvbmNlLCB0aGVuIGFuc3dlcnMgZnJvbSB0aGUgY2FjaGUgaGFuZGxlclwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdmlhID0gb3B0aW1pemVyRm9yKCk7XG4gICAgY29uc3QgZmlyc3QgPSBhd2FpdCByZXF1ZXN0KFwiL3Bob3Rvcy9jYWNoZWQucG5nXCIsIHsgdmlhIH0pO1xuICAgIGV4cGVjdChmaXJzdC5oZWFkLmhlYWRlcnNbXCJ4LW5leHRqcy1jYWNoZVwiXSkudG9CZShcIk1JU1NcIik7XG4gICAgZXhwZWN0KGZpcnN0LmJvZHkpLnRvQmUoUE5HLnRvU3RyaW5nKCkpO1xuXG4gICAgY29uc3Qgc2Vjb25kID0gYXdhaXQgcmVxdWVzdChcIi9waG90b3MvY2FjaGVkLnBuZ1wiLCB7IHZpYSB9KTtcbiAgICBleHBlY3Qoc2Vjb25kLmhlYWQuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgIGV4cGVjdChzZWNvbmQuaGVhZC5oZWFkZXJzW1wieC1uZXh0anMtY2FjaGVcIl0pLnRvQmUoXCJISVRcIik7XG4gICAgZXhwZWN0KHNlY29uZC5ib2R5KS50b0JlKFBORy50b1N0cmluZygpKTtcbiAgICBleHBlY3Qoc2Vjb25kLmhlYWQuaGVhZGVycy5ldGFnKS50b0JlKEVUQUcpO1xuICAgIGV4cGVjdChpbWFnZU9wdGltaXplcikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuXG4gICAgLy8gVGhlIGVudHJ5IGBuZXh0IHN0YXJ0YCB3b3VsZCBoYXZlIHdyaXR0ZW4uXG4gICAgY29uc3QgW2VudHJ5XSA9IFsuLi5NYXBDYWNoZUhhbmRsZXIuZW50cmllcy52YWx1ZXMoKV0gYXMgQXJyYXk8e1xuICAgICAgdmFsdWU6IHsga2luZDogc3RyaW5nOyBleHRlbnNpb246IHN0cmluZyB9O1xuICAgIH0+O1xuICAgIGV4cGVjdChlbnRyeS52YWx1ZSkudG9NYXRjaE9iamVjdCh7IGtpbmQ6IFwiSU1BR0VcIiwgZXh0ZW5zaW9uOiBcIndlYnBcIiB9KTtcbiAgfSk7XG5cbiAgLy8gQW5vdGhlciBpbnN0YW5jZTogbm90aGluZyBpbiBtZW1vcnksIHNvIHRoZSBoaXQgaXMgdGhlIGNhY2hlIGhhbmRsZXIncy5cbiAgaXQoXCJzaGFyZXMgdGhlIG9wdGltaXplZCBpbWFnZSBhY3Jvc3MgaW5zdGFuY2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZXF1ZXN0KFwiL3Bob3Rvcy9zaGFyZWQucG5nXCIsIHsgdmlhOiBvcHRpbWl6ZXJGb3IoKSB9KTtcbiAgICBjb25zdCBvdGhlciA9IGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL3NoYXJlZC5wbmdcIiwgeyB2aWE6IG9wdGltaXplckZvcigpIH0pO1xuICAgIGV4cGVjdChvdGhlci5oZWFkLmhlYWRlcnNbXCJ4LW5leHRqcy1jYWNoZVwiXSkudG9CZShcIkhJVFwiKTtcbiAgICBleHBlY3QoaW1hZ2VPcHRpbWl6ZXIpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgfSk7XG5cbiAgLy8gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBuYW1lcyBpdCByZWxhdGl2ZSB0byB0aGUgZGlzdCBkaXIuXG4gIGl0KFwibG9hZHMgdGhlIGFwcCdzIGNhY2hlSGFuZGxlciBmcm9tIHdoZXJlIG5leHQgc3RhcnQgd291bGRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL2NhY2hlZC5wbmdcIiwgeyB2aWE6IG9wdGltaXplckZvcigpIH0pO1xuICAgIGV4cGVjdChpbXBvcnRlZCkudG9NYXRjaChcbiAgICAgIC9eZmlsZTpcXC9cXC8uKlxcL25vZGVfbW9kdWxlc1xcL2Nkay1uZXh0anNcXC9saWJcXC9hZGFwdGVyXFwvY2FjaGUtaGFuZGxlclxcLm1qcyQvLFxuICAgICk7XG4gICAgZXhwZWN0KE1hcENhY2hlSGFuZGxlci5vcHRpb25zKS50b01hdGNoT2JqZWN0KHsgZGV2OiBmYWxzZSB9KTtcbiAgfSk7XG5cbiAgLy8gQSB0cmFuc2llbnQgZmFpbHVyZSBsb2FkaW5nIHRoZSBjYWNoZUhhbmRsZXIgKEVNRklMRSBpbiBhIGNvbGQtc3RhcnRcbiAgLy8gYnVyc3QpIG11c3Qgbm90IGZhaWwgZXZlcnkgbGF0ZXIgaW1hZ2UgcmVxdWVzdCBvbiB0aGUgaW5zdGFuY2UuXG4gIGl0KFwicmV0cmllcyBsb2FkaW5nIHRoZSBjYWNoZUhhbmRsZXIgYWZ0ZXIgYSBmYWlsZWQgbG9hZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3IgPSBqZXN0LnNweU9uKGNvbnNvbGUsIFwiZXJyb3JcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW1wb3J0TW9kdWxlID0gamVzdFxuICAgICAgICAuZm4oKVxuICAgICAgICAubW9ja1JlamVjdGVkVmFsdWVPbmNlKG5ldyBFcnJvcihcIkVNRklMRVwiKSlcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKHsgZGVmYXVsdDogTWFwQ2FjaGVIYW5kbGVyIH0pO1xuICAgICAgY29uc3QgdmlhID0gb3B0aW1pemVyRm9yKHsgaW1wb3J0TW9kdWxlIH0pO1xuICAgICAgZXhwZWN0KFxuICAgICAgICAoYXdhaXQgcmVxdWVzdChcIi9waG90b3MvcmV0cnkucG5nXCIsIHsgdmlhIH0pKS5oZWFkLnN0YXR1c0NvZGUsXG4gICAgICApLnRvQmUoNTAwKTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgKGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL3JldHJ5LnBuZ1wiLCB7IHZpYSB9KSkuaGVhZC5zdGF0dXNDb2RlLFxuICAgICAgKS50b0JlKDIwMCk7XG4gICAgICBleHBlY3QoaW1wb3J0TW9kdWxlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVycm9yLm1vY2tSZXN0b3JlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBUaGUgd3JpdGUgb2YgYSBmcmVzaCBpbWFnZSBnb2VzIHRvIGB3YWl0VW50aWxgLCBub3QgaW4gZnJvbnQgb2YgdGhlXG4gIC8vIHJlc3BvbnNlOiB0aGUgaW1hZ2UgaXMgc2VudCBiZWZvcmUgdGhlIGNhY2hlIGhhbmRsZXIgaGFzIGl0LlxuICBpdChcIndyaXRlcyBhIG1pc3MgdG8gdGhlIGNhY2hlIGFmdGVyIGFuc3dlcmluZywgdGhyb3VnaCB3YWl0VW50aWxcIiwgYXN5bmMgKCkgPT4ge1xuICAgIC8vIEEgd3JpdGUgdGhhdCBjYW4ndCBmaW5pc2ggdW50aWwgcmVsZWFzZWQ6IGlmIHRoZSByZXNwb25zZSB3YWl0ZWQgb24gaXQsXG4gICAgLy8gYHJlcXVlc3RgIHdvdWxkIG5ldmVyIHJldHVybi5cbiAgICBsZXQgcmVsZWFzZSE6ICgpID0+IHZvaWQ7XG4gICAgY29uc3QgZ2F0ZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiAocmVsZWFzZSA9IHJlc29sdmUpKTtcbiAgICBjb25zdCBzZXQgPSBNYXBDYWNoZUhhbmRsZXIucHJvdG90eXBlLnNldDtcbiAgICBNYXBDYWNoZUhhbmRsZXIucHJvdG90eXBlLnNldCA9IGFzeW5jIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBhd2FpdCBnYXRlO1xuICAgICAgcmV0dXJuIHNldC5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBlbmRpbmc6IEFycmF5PFByb21pc2U8dW5rbm93bj4+ID0gW107XG4gICAgICBjb25zdCBmaXJzdCA9IGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL2RlZmVycmVkLnBuZ1wiLCB7XG4gICAgICAgIHZpYTogb3B0aW1pemVyRm9yKCksXG4gICAgICAgIHdhaXRVbnRpbDogKHByb21pc2UpID0+IHBlbmRpbmcucHVzaChwcm9taXNlKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGZpcnN0LmhlYWQuaGVhZGVyc1tcIngtbmV4dGpzLWNhY2hlXCJdKS50b0JlKFwiTUlTU1wiKTtcbiAgICAgIGV4cGVjdChNYXBDYWNoZUhhbmRsZXIuZW50cmllcy5zaXplKS50b0JlKDApO1xuXG4gICAgICByZWxlYXNlKCk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChwZW5kaW5nKTtcbiAgICAgIGV4cGVjdChNYXBDYWNoZUhhbmRsZXIuZW50cmllcy5zaXplKS50b0JlKDEpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBNYXBDYWNoZUhhbmRsZXIucHJvdG90eXBlLnNldCA9IHNldDtcbiAgICB9XG4gIH0pO1xufSk7XG4iXX0=
|
|
468
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2ltYWdlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ2hDLGlGQUFpRjtBQUNqRix5RUFBeUU7QUFDekUsSUFBSSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQ0FBcUMsQ0FBQztJQUM1RCxjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtDQUMxQixDQUFDLENBQUMsQ0FBQztBQUVKLHFDQUFpRDtBQUNqRCx5Q0FBZ0Q7QUFDaEQscUNBQWlDO0FBQ2pDLHlDQUFpQztBQUNqQyw2Q0FBdUM7QUFFdkMsNEVBQXFFO0FBQ3JFLDBFQUEwRTtBQUMxRSw0Q0FBcUQ7QUFDckQsOENBQW1FO0FBQ25FLHNDQUF5QztBQUN6QyxtQ0FJaUI7QUFDakIsOERBQTJEO0FBRTNELGlEQUE2QztBQUU3QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDM0MsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDO0FBRXRCLDZFQUE2RTtBQUM3RSxTQUFTLEtBQUs7SUFDWixNQUFNLElBQUksR0FBRyxJQUFBLHFCQUFXLEVBQUMsSUFBQSxnQkFBSSxFQUFDLElBQUEsZ0JBQU0sR0FBRSxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUM5RCxJQUFBLG1CQUFTLEVBQUMsSUFBQSxnQkFBSSxFQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixNQUFNLGVBQWU7SUFDWixNQUFNLENBQVUsT0FBTyxHQUFHLElBQUks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QyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1zM1wiKTtcbi8vIFRoZSByZWFsIG1vZHVsZSwgd2l0aCB0aGUgb25lIHN0ZXAgdGhhdCBuZWVkcyBgc2hhcnBgIHN0dWJiZWQgb3V0OiB0aGVzZSB0ZXN0c1xuLy8gYXJlIGFib3V0IHRoZSByZXNwb25zZSBgaGFuZGxlYCB3cml0ZXMsIG5vdCBhYm91dCBvcHRpbWl6aW5nIGFuIGltYWdlLlxuamVzdC5tb2NrKFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIiwgKCkgPT4gKHtcbiAgLi4uamVzdC5yZXF1aXJlQWN0dWFsKFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIiksXG4gIGltYWdlT3B0aW1pemVyOiBqZXN0LmZuKCksXG59KSk7XG5cbmltcG9ydCB7IG1rZGlyU3luYywgbWtkdGVtcFN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVIZWFkZXJWYWx1ZSB9IGZyb20gXCJub2RlOmh0dHBcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgV3JpdGFibGUgfSBmcm9tIFwibm9kZTpzdHJlYW1cIjtcbmltcG9ydCB7IFMzQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuaW1wb3J0IHsgaW1hZ2VPcHRpbWl6ZXIgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIjtcbmltcG9ydCB7IGltYWdlQ29uZmlnRGVmYXVsdCB9IGZyb20gXCJuZXh0L2Rpc3Qvc2hhcmVkL2xpYi9pbWFnZS1jb25maWcuanNcIjtcbmltcG9ydCB7IFNoaW1JbmNvbWluZ01lc3NhZ2UgfSBmcm9tIFwiLi9odHRwL3JlcXVlc3RcIjtcbmltcG9ydCB7IFJlc3BvbnNlSGVhZCwgU2hpbVNlcnZlclJlc3BvbnNlIH0gZnJvbSBcIi4vaHR0cC9yZXNwb25zZVwiO1xuaW1wb3J0IHsgcGlwZVRvU2luayB9IGZyb20gXCIuL2h0dHAvc2lua1wiO1xuaW1wb3J0IHtcbiAgSW1hZ2VPcHRpbWl6ZXJPcHRpb25zLFxuICBuZXdJbWFnZVJlc3BvbnNlQ2FjaGUsXG4gIFJ1bnRpbWVJbWFnZU9wdGltaXplcixcbn0gZnJvbSBcIi4vaW1hZ2VcIjtcbmltcG9ydCB7IENES19ORVhUSlNfVkVSU0lPTiB9IGZyb20gXCIuLi9jZGstbmV4dGpzLXZlcnNpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXJNYW5pZmVzdCB9IGZyb20gXCIuL21hbmlmZXN0XCI7XG5pbXBvcnQgeyB1c2VOZXh0RnJvbSB9IGZyb20gXCIuL25leHQtbW9kdWxlc1wiO1xuXG5jb25zdCBQTkcgPSBCdWZmZXIuZnJvbShcIm9wdGltaXplZC1ieXRlc1wiKTtcbmNvbnN0IEVUQUcgPSBcImFiYzEyM1wiO1xuXG4vKiogQSBkZXBsb3ltZW50IHJvb3QsIHdoaWNoIHRoZSBkaXN0IGRpciB0aGUgaW1hZ2UgY2FjaGUgdXNlcyBzaXRzIHVuZGVyLiAqL1xuZnVuY3Rpb24gc3RhZ2UoKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IG1rZHRlbXBTeW5jKGpvaW4odG1wZGlyKCksIFwiY2RrLW5leHRqcy1pbWFnZS1cIikpO1xuICBta2RpclN5bmMoam9pbihyb290LCBcIi5uZXh0XCIpKTtcbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8qKiBUaGUgYXBwJ3MgYGNhY2hlSGFuZGxlcmAsIHJlZHVjZWQgdG8gYSBtYXA6IHdoYXQgdGhlIFMzIGhhbmRsZXIgaXMgdG8gaXQuICovXG5jbGFzcyBNYXBDYWNoZUhhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcbiAgcHVibGljIHN0YXRpYyBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgTWFwQ2FjaGVIYW5kbGVyLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG4gIHB1YmxpYyBhc3luYyBnZXQoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gTWFwQ2FjaGVIYW5kbGVyLmVudHJpZXMuZ2V0KGtleSkgPz8gbnVsbDtcbiAgfVxuICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIE1hcENhY2hlSGFuZGxlci5lbnRyaWVzLnNldChrZXksIHsgdmFsdWUsIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSB9KTtcbiAgfVxufVxuXG5sZXQgaW1wb3J0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuY29uc3QgczNIaXQgPSB7XG4gIHNlbmQ6IGFzeW5jICgpID0+ICh7XG4gICAgQm9keTogW0J1ZmZlci5mcm9tKFwidXBzdHJlYW0tYnl0ZXNcIildLFxuICAgIENvbnRlbnRUeXBlOiBcImltYWdlL3BuZ1wiLFxuICAgIEVUYWc6ICdcInVwc3RyZWFtXCInLFxuICB9KSxcbn0gYXMgdW5rbm93biBhcyBTM0NsaWVudDtcblxuLyoqIEFuIG9wdGltaXplciBvdmVyIHtAbGluayBNYXBDYWNoZUhhbmRsZXJ9LCBhcyB0aGUgYWRhcHRlciBjb25maWd1cmVzIG9uZS4gKi9cbmZ1bmN0aW9uIG9wdGltaXplckZvcihcbiAgb3B0aW9uczoge1xuICAgIGltYWdlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGZldGNoSW50ZXJuYWw/OiBJbWFnZU9wdGltaXplck9wdGlvbnNbXCJmZXRjaEludGVybmFsXCJdO1xuICAgIGltcG9ydE1vZHVsZT86IEltYWdlT3B0aW1pemVyT3B0aW9uc1tcImltcG9ydE1vZHVsZVwiXTtcbiAgICBzMz86IFMzQ2xpZW50O1xuICAgIGJ1Y2tldD86IHN0cmluZztcbiAgfSA9IHt9LFxuKTogUnVudGltZUltYWdlT3B0aW1pemVyIHtcbiAgY29uc3QgdmlhID0gbmV3IFJ1bnRpbWVJbWFnZU9wdGltaXplcih7XG4gICAgZGVwbG95bWVudFJvb3Q6IHN0YWdlKCksXG4gICAgLy8gSnVzdCB0aGUgZmllbGRzIGBsb2FkSW1hZ2VSdW50aW1lYCByZWFkcy5cbiAgICBtYW5pZmVzdDoge1xuICAgICAgY2RrTmV4dGpzVmVyc2lvbjogQ0RLX05FWFRKU19WRVJTSU9OLFxuICAgICAgcmVsYXRpdmVQcm9qZWN0RGlyOiBcIlwiLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGJhc2VQYXRoOiBcIlwiLFxuICAgICAgICBhc3NldFByZWZpeDogXCJcIixcbiAgICAgICAgZGlzdERpcjogXCIubmV4dFwiLFxuICAgICAgICBleHBlcmltZW50YWw6IHt9LFxuICAgICAgICBpbWFnZXM6IHtcbiAgICAgICAgICAuLi5pbWFnZUNvbmZpZ0RlZmF1bHQsXG4gICAgICAgICAgbG9jYWxQYXR0ZXJuczogdW5kZWZpbmVkLFxuICAgICAgICAgIC4uLm9wdGlvbnMuaW1hZ2VzLFxuICAgICAgICB9LFxuICAgICAgICBjYWNoZUhhbmRsZXI6XG4gICAgICAgICAgXCIuLi9ub2RlX21vZHVsZXMvY2RrLW5leHRqcy9saWIvYWRhcHRlci9jYWNoZS1oYW5kbGVyLm1qc1wiLFxuICAgICAgICBjYWNoZU1heE1lbW9yeVNpemU6IDAsXG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBBZGFwdGVyTWFuaWZlc3QsXG4gICAgYnVja2V0OiBvcHRpb25zLmJ1Y2tldCA/PyBcImFzc2V0c1wiLFxuICAgIGJ1Y2tldEtleVByZWZpeDogXCJcIixcbiAgICBmZXRjaEludGVybmFsOlxuICAgICAgb3B0aW9ucy5mZXRjaEludGVybmFsID8/XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGZldGNoSW50ZXJuYWxcIik7XG4gICAgICB9KSxcbiAgICBpbXBvcnRNb2R1bGU6XG4gICAgICBvcHRpb25zLmltcG9ydE1vZHVsZSA/P1xuICAgICAgKGFzeW5jICh1cmwpID0+IHtcbiAgICAgICAgaW1wb3J0ZWQgPSB1cmw7XG4gICAgICAgIHJldHVybiB7IGRlZmF1bHQ6IE1hcENhY2hlSGFuZGxlciB9O1xuICAgICAgfSksXG4gIH0pO1xuICAodmlhIGFzIHVua25vd24gYXMgeyBzMzogUzNDbGllbnQgfSkuczMgPSBvcHRpb25zLnMzID8/IHMzSGl0O1xuICByZXR1cm4gdmlhO1xufVxuXG5sZXQgb3B0aW1pemVyOiBSdW50aW1lSW1hZ2VPcHRpbWl6ZXI7XG5cbmJlZm9yZUFsbCgoKSA9PiB7XG4gIHVzZU5leHRGcm9tKGpvaW4oX19kaXJuYW1lLCBcIi4uLy4uXCIpKTtcbiAgb3B0aW1pemVyID0gb3B0aW1pemVyRm9yKCk7XG59KTtcblxuYmVmb3JlRWFjaCgoKSA9PiB7XG4gIE1hcENhY2hlSGFuZGxlci5lbnRyaWVzLmNsZWFyKCk7XG4gIGltcG9ydGVkID0gdW5kZWZpbmVkO1xuICAoaW1hZ2VPcHRpbWl6ZXIgYXMgamVzdC5Nb2NrKS5tb2NrQ2xlYXIoKTtcbiAgKGltYWdlT3B0aW1pemVyIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgIGJ1ZmZlcjogUE5HLFxuICAgIGNvbnRlbnRUeXBlOiBcImltYWdlL3dlYnBcIixcbiAgICBtYXhBZ2U6IDYwLFxuICAgIGV0YWc6IEVUQUcsXG4gIH0pO1xufSk7XG5cbmludGVyZmFjZSBBbnN3ZXIge1xuICByZWFkb25seSBoZWFkOiBSZXNwb25zZUhlYWQ7XG4gIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdChcbiAgc3JjOiBzdHJpbmcsXG4gIGluaXQ6IHtcbiAgICBtZXRob2Q/OiBzdHJpbmc7XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgdmlhPzogUnVudGltZUltYWdlT3B0aW1pemVyO1xuICAgIHdhaXRVbnRpbD86IChwcm9taXNlOiBQcm9taXNlPHVua25vd24+KSA9PiB2b2lkO1xuICB9ID0ge30sXG4pOiBQcm9taXNlPEFuc3dlcj4ge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKFxuICAgIGBodHRwczovL3Nob3AuZXhhbXBsZS50ZXN0L19uZXh0L2ltYWdlP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChzcmMpfSZ3PTY0MCZxPTc1YCxcbiAgKTtcbiAgY29uc3QgcmVxID0gbmV3IFNoaW1JbmNvbWluZ01lc3NhZ2Uoe1xuICAgIG1ldGhvZDogaW5pdC5tZXRob2QgPz8gXCJHRVRcIixcbiAgICB1cmw6IGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9YCxcbiAgICBoZWFkZXJzOiB7IGFjY2VwdDogXCJpbWFnZS93ZWJwXCIsIC4uLmluaXQuaGVhZGVycyB9LFxuICB9KTtcbiAgY29uc3QgcmVzID0gbmV3IFNoaW1TZXJ2ZXJSZXNwb25zZSgpO1xuICBsZXQgaGVhZDogUmVzcG9uc2VIZWFkIHwgdW5kZWZpbmVkO1xuICBjb25zdCBjaHVua3M6IEJ1ZmZlcltdID0gW107XG4gIGNvbnN0IGRvbmUgPSBwaXBlVG9TaW5rKFxuICAgIHJlcSxcbiAgICByZXMsXG4gICAge1xuICAgICAgYmVnaW4ocmVzcG9uc2VIZWFkKSB7XG4gICAgICAgIGhlYWQgPSByZXNwb25zZUhlYWQ7XG4gICAgICAgIHJldHVybiBuZXcgV3JpdGFibGUoe1xuICAgICAgICAgIHdyaXRlKGNodW5rLCBfZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGNvbXByZXNzOiBmYWxzZSB9LFxuICApO1xuICBjb25zdCBwZW5kaW5nOiBBcnJheTxQcm9taXNlPHVua25vd24+PiA9IFtdO1xuICBhd2FpdCAoaW5pdC52aWEgPz8gb3B0aW1pemVyKS5oYW5kbGUoXG4gICAgcmVxLFxuICAgIHJlcyxcbiAgICB1cmwsXG4gICAgaW5pdC53YWl0VW50aWwgPz8gKChwcm9taXNlKSA9PiBwZW5kaW5nLnB1c2gocHJvbWlzZSkpLFxuICApO1xuICBhd2FpdCBkb25lO1xuICAvLyBTZXR0bGVkLCBub3QgYXdhaXRlZDogdGhlIHJ1bnRpbWUgbG9ncyBhIHJlamVjdGlvbiByYXRoZXIgdGhhbiBmYWlsaW5nIG9uIGl0LlxuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocGVuZGluZyk7XG4gIHJldHVybiB7IGhlYWQ6IGhlYWQhLCBib2R5OiBCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoKSB9O1xufVxuXG5kZXNjcmliZShcIm5ld0ltYWdlUmVzcG9uc2VDYWNoZVwiLCAoKSA9PiB7XG4gIHR5cGUgUmVzcG9uc2VDYWNoZUNsYXNzID0gUGFyYW1ldGVyczx0eXBlb2YgbmV3SW1hZ2VSZXNwb25zZUNhY2hlPlswXTtcblxuICAvKiogbmV4dCA8IDE2LjMuOCdzIGBSZXNwb25zZUNhY2hlYDogYChtaW5pbWFsX21vZGUsIG1heFNpemUsIHR0bClgLiAqL1xuICBjbGFzcyBMZWdhY3lSZXNwb25zZUNhY2hlIHtcbiAgICByZWFkb25seSBtaW5pbWFsX21vZGU6IHVua25vd247XG4gICAgY29uc3RydWN0b3IobWluaW1hbE1vZGU6IHVua25vd24pIHtcbiAgICAgIHRoaXMubWluaW1hbF9tb2RlID0gbWluaW1hbE1vZGU7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBuZXh0ID49IDE2LjMuOCdzOiBgKHsgbWluaW1hbE1vZGUsIHJvdXRlLCAuLi4gfSlgLCB0aHJvd2luZyB3aXRob3V0IGEgcm91dGUuXG4gICAqIFRoZSBmaWVsZCBpcyByZW5hbWVkIGhlcmUgdG8gc2hvdyB0aGUgY2hvaWNlIGRvZXNuJ3QgZGVwZW5kIG9uIGl0LlxuICAgKi9cbiAgY2xhc3MgUm91dGVSZXNwb25zZUNhY2hlIHtcbiAgICByZWFkb25seSBtb2RlOiB1bmtub3duO1xuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgIG1pbmltYWxNb2RlLFxuICAgICAgcm91dGUsXG4gICAgfToge1xuICAgICAgbWluaW1hbE1vZGU6IGJvb2xlYW47XG4gICAgICByb3V0ZT86IHVua25vd247XG4gICAgfSkge1xuICAgICAgaWYgKCFyb3V0ZSkgdGhyb3cgbmV3IEVycm9yKFwiUmVzcG9uc2UgY2FjaGUgcmVxdWlyZXMgYSBzb3VyY2Ugcm91dGVcIik7XG4gICAgICB0aGlzLm1vZGUgPSBtaW5pbWFsTW9kZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY29uc3RydWN0ID0gKFJlc3BvbnNlQ2FjaGU6IG5ldyAoYXJnOiBuZXZlcikgPT4gb2JqZWN0KSA9PlxuICAgIG5ld0ltYWdlUmVzcG9uc2VDYWNoZShcbiAgICAgIFJlc3BvbnNlQ2FjaGUgYXMgdW5rbm93biBhcyBSZXNwb25zZUNhY2hlQ2xhc3MsXG4gICAgKSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIGl0KFwicGFzc2VzIHsgbWluaW1hbE1vZGUsIHJvdXRlOiAnaW1hZ2UnIH0gdG8gYSBuZXh0IHRoYXQgdGFrZXMgaXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNhY2hlID0gY29uc3RydWN0KFJvdXRlUmVzcG9uc2VDYWNoZSk7XG4gICAgZXhwZWN0KGNhY2hlKS50b0JlSW5zdGFuY2VPZihSb3V0ZVJlc3BvbnNlQ2FjaGUpO1xuICAgIGV4cGVjdChjYWNoZS5tb2RlKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgLy8gQnkgd2hhdCB0aGUgY29uc3RydWN0b3IgYWNjZXB0cywgbm90IHRoZSB2ZXJzaW9uOiBhIGNhbmFyeSBjdXQgYmVmb3JlXG4gIC8vIDE2LjMuOCdzIGNoYW5nZSByZWFkcyBhcyBuZXdlciB0aGFuIGl0LlxuICBpdChcInBhc3NlcyBtaW5pbWFsTW9kZSBhbG9uZSB0byBhIG5leHQgdGhhdCB0b29rIHRoZSBvcHRpb25zIGFzIG1pbmltYWxNb2RlXCIsICgpID0+IHtcbiAgICBjb25zdCBjYWNoZSA9IGNvbnN0cnVjdChMZWdhY3lSZXNwb25zZUNhY2hlKTtcbiAgICBleHBlY3QoY2FjaGUpLnRvQmVJbnN0YW5jZU9mKExlZ2FjeVJlc3BvbnNlQ2FjaGUpO1xuICAgIGV4cGVjdChjYWNoZS5taW5pbWFsX21vZGUpLnRvQmUoZmFsc2UpO1xuICB9KTtcblxuICBpdChcInJldGhyb3dzIGEgY29uc3RydWN0b3IgZXJyb3IgdGhhdCBpc24ndCB0aGUgbWlzc2luZyByb3V0ZVwiLCAoKSA9PiB7XG4gICAgY2xhc3MgQnJva2VuUmVzcG9uc2VDYWNoZSB7XG4gICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYm9vbVwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZXhwZWN0KCgpID0+IGNvbnN0cnVjdChCcm9rZW5SZXNwb25zZUNhY2hlKSkudG9UaHJvdyhcImJvb21cIik7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiUnVudGltZUltYWdlT3B0aW1pemVyLmlzRW5hYmxlZFwiLCAoKSA9PiB7XG4gIGNvbnN0IHdpdGhJbWFnZXMgPSAoaW1hZ2VzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT5cbiAgICBvcHRpbWl6ZXJGb3IoeyBpbWFnZXMgfSk7XG5cbiAgLy8gV2hlcmUgYG5leHQgc3RhcnRgIGFuc3dlcnMgNDA0IHJhdGhlciB0aGFuIG9wdGltaXplLlxuICBpdChcImlzIG9mZiBmb3IgaW1hZ2VzLnVub3B0aW1pemVkIGFuZCBmb3IgYSBub24tZGVmYXVsdCBsb2FkZXJcIiwgKCkgPT4ge1xuICAgIGV4cGVjdCh3aXRoSW1hZ2VzKHt9KS5pc0VuYWJsZWQoKSkudG9CZSh0cnVlKTtcbiAgICBleHBlY3Qod2l0aEltYWdlcyh7IHVub3B0aW1pemVkOiB0cnVlIH0pLmlzRW5hYmxlZCgpKS50b0JlKGZhbHNlKTtcbiAgICBleHBlY3QoXG4gICAgICB3aXRoSW1hZ2VzKHsgbG9hZGVyOiBcImN1c3RvbVwiLCBsb2FkZXJGaWxlOiBcIi4vbG9hZGVyLmpzXCIgfSkuaXNFbmFibGVkKCksXG4gICAgKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoXCJuYW1lcyBhIG1hbmlmZXN0IGZyb20gYW4gb2xkZXIgY2RrLW5leHRqcyBpbnN0ZWFkIG9mIGEgVHlwZUVycm9yXCIsICgpID0+IHtcbiAgICBjb25zdCB2aWEgPSBvcHRpbWl6ZXJGb3IoKTtcbiAgICBjb25zdCB7IG1hbmlmZXN0IH0gPSAoXG4gICAgICB2aWEgYXMgdW5rbm93biBhcyB7IG9wdGlvbnM6IHsgbWFuaWZlc3Q6IHsgY2RrTmV4dGpzVmVyc2lvbjogc3RyaW5nIH0gfSB9XG4gICAgKS5vcHRpb25zO1xuICAgIG1hbmlmZXN0LmNka05leHRqc1ZlcnNpb24gPSBcIjAuNi4yXCI7XG4gICAgZXhwZWN0KCgpID0+IHZpYS5pc0VuYWJsZWQoKSkudG9UaHJvdygvd3JpdHRlbiBieSBjZGstbmV4dGpzIDBcXC42XFwuMi8pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlJ1bnRpbWVJbWFnZU9wdGltaXplciByZXNwb25zZVwiLCAoKSA9PiB7XG4gIGl0KFwiYW5zd2VycyB3aXRoIHRoZSBoZWFkZXJzIG5leHQgc3RhcnQgc2VuZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCwgYm9keSB9ID0gYXdhaXQgcmVxdWVzdChcIi9waG90b3MvbG9nby5wbmdcIik7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgIGV4cGVjdChoZWFkLmhlYWRlcnMpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgXCJjYWNoZS1jb250cm9sXCI6IFwicHVibGljLCBtYXgtYWdlPTYwLCBtdXN0LXJldmFsaWRhdGVcIixcbiAgICAgIFwiY29udGVudC10eXBlXCI6IFwiaW1hZ2Uvd2VicFwiLFxuICAgICAgXCJjb250ZW50LWxlbmd0aFwiOiBTdHJpbmcoUE5HLmxlbmd0aCksXG4gICAgICBcImNvbnRlbnQtZGlzcG9zaXRpb25cIjogJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPVwibG9nby53ZWJwXCInLFxuICAgICAgXCJjb250ZW50LXNlY3VyaXR5LXBvbGljeVwiOiBpbWFnZUNvbmZpZ0RlZmF1bHQuY29udGVudFNlY3VyaXR5UG9saWN5LFxuICAgICAgZXRhZzogRVRBRyxcbiAgICAgIHZhcnk6IFwiQWNjZXB0XCIsXG4gICAgICBcIngtbmV4dGpzLWNhY2hlXCI6IFwiTUlTU1wiLFxuICAgIH0pO1xuICAgIGV4cGVjdChib2R5KS50b0JlKFBORy50b1N0cmluZygpKTtcbiAgfSk7XG5cbiAgLy8gQ29udGVudC1oYXNoZWQsIHNvIHRoZSBuYW1lIGNoYW5nZXMgd2hlbmV2ZXIgdGhlIGJ5dGVzIGRvLlxuICBpdChcImNhY2hlcyBhIHN0YXRpY2FsbHkgaW1wb3J0ZWQgaW1hZ2UgZm9yIGEgeWVhciwgaW1tdXRhYmxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGhlYWQgfSA9IGF3YWl0IHJlcXVlc3QoXCIvX25leHQvc3RhdGljL21lZGlhL2xvZ28uM2YyYTFjLnBuZ1wiKTtcbiAgICBleHBlY3QoaGVhZC5oZWFkZXJzW1wiY2FjaGUtY29udHJvbFwiXSkudG9CZShcbiAgICAgIFwicHVibGljLCBtYXgtYWdlPTMxNTM2MDAwMCwgaW1tdXRhYmxlXCIsXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gYHdyaXRlSGVhZGAgcmVqZWN0cyBhIGhlYWRlciB2YWx1ZSBvdXRzaWRlIGxhdGluMSB3aXRoIEVSUl9JTlZBTElEX0NIQVIsXG4gIC8vIGFuZCB0aGUgTGFtYmRhIHNpbmsgd3JpdGVzIHRoZSBoZWFkIHRocm91Z2ggaXQuXG4gIGl0KFwiZW5jb2RlcyBhIG5vbi1sYXRpbjEgZmlsZW5hbWUgcmF0aGVyIHRoYW4gc2VuZGluZyBpdCByYXdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCB9ID0gYXdhaXQgcmVxdWVzdChcIi/DvG1sYXV0LeWGmeecny5wbmdcIik7XG4gICAgY29uc3QgZGlzcG9zaXRpb24gPSBoZWFkLmhlYWRlcnNbXCJjb250ZW50LWRpc3Bvc2l0aW9uXCJdO1xuICAgIGV4cGVjdChkaXNwb3NpdGlvbikudG9NYXRjaCgvXmF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiW15cIl0qXCI7IGZpbGVuYW1lXFwqPS8pO1xuICAgIGV4cGVjdChkaXNwb3NpdGlvbikudG9Db250YWluKFxuICAgICAgYGZpbGVuYW1lKj1VVEYtOCcnJHtlbmNvZGVVUklDb21wb25lbnQoXCLDvG1sYXV0LeWGmeecny53ZWJwXCIpfWAsXG4gICAgKTtcbiAgICBleHBlY3QoKCkgPT5cbiAgICAgIHZhbGlkYXRlSGVhZGVyVmFsdWUoXCJDb250ZW50LURpc3Bvc2l0aW9uXCIsIGRpc3Bvc2l0aW9uKSxcbiAgICApLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIGl0LmVhY2goW1xuICAgIFtcInRoZSBleGFjdCB0YWdcIiwgRVRBR10sXG4gICAgW1wiYSB3ZWFrIGZvcm0gb2YgaXRcIiwgYFcvJHtFVEFHfWBdLFxuICAgIFtcImEgbGlzdCBjb250YWluaW5nIGl0XCIsIGBcIm90aGVyXCIsICR7RVRBR31gXSxcbiAgICBbXCJhIHdpbGRjYXJkXCIsIFwiKlwiXSxcbiAgXSkoXCJhbnN3ZXJzIDMwNCB0byBJZi1Ob25lLU1hdGNoIHdpdGggJXNcIiwgYXN5bmMgKF9uYW1lLCBpZk5vbmVNYXRjaCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCwgYm9keSB9ID0gYXdhaXQgcmVxdWVzdChcIi9sb2dvLnBuZ1wiLCB7XG4gICAgICBoZWFkZXJzOiB7IFwiaWYtbm9uZS1tYXRjaFwiOiBpZk5vbmVNYXRjaCB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMzA0KTtcbiAgICBleHBlY3QoaGVhZC5oZWFkZXJzLmV0YWcpLnRvQmUoRVRBRyk7XG4gICAgZXhwZWN0KGhlYWQuaGVhZGVyc1tcImNhY2hlLWNvbnRyb2xcIl0pLnRvQmUoXG4gICAgICBcInB1YmxpYywgbWF4LWFnZT02MCwgbXVzdC1yZXZhbGlkYXRlXCIsXG4gICAgKTtcbiAgICBleHBlY3QoYm9keSkudG9CZShcIlwiKTtcbiAgfSk7XG5cbiAgaXQoXCJhbnN3ZXJzIDIwMCB0byBhbiBJZi1Ob25lLU1hdGNoIHRoYXQgZG9lcyBub3QgbWF0Y2hcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCB9ID0gYXdhaXQgcmVxdWVzdChcIi9sb2dvLnBuZ1wiLCB7XG4gICAgICBoZWFkZXJzOiB7IFwiaWYtbm9uZS1tYXRjaFwiOiAnXCJvdGhlclwiJyB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgfSk7XG5cbiAgaXQoXCJzZW5kcyB0aGUgaGVhZGVycyBidXQgbm8gYm9keSB0byBIRUFEXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGhlYWQsIGJvZHkgfSA9IGF3YWl0IHJlcXVlc3QoXCIvbG9nby5wbmdcIiwgeyBtZXRob2Q6IFwiSEVBRFwiIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgICBleHBlY3QoaGVhZC5oZWFkZXJzW1wiY29udGVudC1sZW5ndGhcIl0pLnRvQmUoU3RyaW5nKFBORy5sZW5ndGgpKTtcbiAgICBleHBlY3QoYm9keSkudG9CZShcIlwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJSdW50aW1lSW1hZ2VPcHRpbWl6ZXIgc291cmNlc1wiLCAoKSA9PiB7XG4gIC8vIGBuZXh0IHN0YXJ0YCBmZXRjaGVzIGEgcmVtb3RlIHNvdXJjZSBvbmx5IHdoZW4gYHJlbW90ZVBhdHRlcm5zYCBvciBgZG9tYWluc2BcbiAgLy8gYWxsb3cgaXQ7IHRoZSBzdGFnZSdzIGNvbmZpZyBhbGxvd3Mgbm9uZS4gQW55dGhpbmcgZWxzZSB3b3VsZCBtYWtlIHRoZVxuICAvLyBvcHRpbWl6ZXIgYW4gb3BlbiBwcm94eSBpbnRvIHdoYXRldmVyIGl0IGNhbiByZWFjaC5cbiAgaXQuZWFjaChbXG4gICAgW1wiYW5vdGhlciBvcmlnaW5cIiwgXCJodHRwczovL2V2aWwuZXhhbXBsZS50ZXN0L3gucG5nXCJdLFxuICAgIFtcImluc3RhbmNlIG1ldGFkYXRhXCIsIFwiaHR0cDovLzE2OS4yNTQuMTY5LjI1NC9sYXRlc3QvbWV0YS1kYXRhL1wiXSxcbiAgICBbXCJhIHByb3RvY29sLXJlbGF0aXZlIHVybFwiLCBcIi8vZXZpbC5leGFtcGxlLnRlc3QveC5wbmdcIl0sXG4gIF0pKFwicmVqZWN0cyBhIHJlbW90ZSBzb3VyY2UgdGhhdCBpcyBub3QgYWxsb3dlZDogJXNcIiwgYXN5bmMgKF9uYW1lLCBzcmMpID0+IHtcbiAgICBjb25zdCB7IGhlYWQsIGJvZHkgfSA9IGF3YWl0IHJlcXVlc3Qoc3JjKTtcbiAgICBleHBlY3QoaGVhZC5zdGF0dXNDb2RlKS50b0JlKDQwMCk7XG4gICAgZXhwZWN0KGJvZHkpLnRvTWF0Y2goL1widXJsXCIgcGFyYW1ldGVyLyk7XG4gICAgZXhwZWN0KGltYWdlT3B0aW1pemVyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBmdW5jdGlvbiB3aXRoUzNNaXNzKFxuICAgIGZldGNoSW50ZXJuYWw/OiBJbWFnZU9wdGltaXplck9wdGlvbnNbXCJmZXRjaEludGVybmFsXCJdLFxuICApOiBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIge1xuICAgIHJldHVybiBvcHRpbWl6ZXJGb3Ioe1xuICAgICAgZmV0Y2hJbnRlcm5hbCxcbiAgICAgIHMzOiB7XG4gICAgICAgIHNlbmQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIm1pc3NpbmdcIiksIHsgbmFtZTogXCJOb1N1Y2hLZXlcIiB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBTM0NsaWVudCxcbiAgICB9KTtcbiAgfVxuXG4gIGl0KFwiZmFsbHMgYmFjayB0byB0aGUgYXBwJ3Mgcm91dGVzIGZvciBhIHNvdXJjZSBTMyBoYXMgbm8gZmlsZSBmb3JcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZldGNoSW50ZXJuYWwgPSBqZXN0LmZuKGFzeW5jICgpID0+ICh7XG4gICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiY29udGVudC10eXBlXCI6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBcInB1YmxpYywgbWF4LWFnZT0xMjBcIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBCdWZmZXIuZnJvbShcInJvdXRlLWJ5dGVzXCIpLFxuICAgIH0pKTtcbiAgICBjb25zdCB7IGhlYWQgfSA9IGF3YWl0IHJlcXVlc3QoXCIvYXBpL2F2YXRhcj9pZD00MlwiLCB7XG4gICAgICB2aWE6IHdpdGhTM01pc3MoZmV0Y2hJbnRlcm5hbCksXG4gICAgfSk7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgIGV4cGVjdChmZXRjaEludGVybmFsKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIFwiL2FwaS9hdmF0YXI/aWQ9NDJcIixcbiAgICAgIGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgaW1hZ2VDb25maWdEZWZhdWx0Lm1heGltdW1SZXNwb25zZUJvZHksXG4gICAgKTtcbiAgICBleHBlY3QoKGltYWdlT3B0aW1pemVyIGFzIGplc3QuTW9jaykubW9jay5sYXN0Q2FsbFswXSkudG9NYXRjaE9iamVjdCh7XG4gICAgICBidWZmZXI6IEJ1ZmZlci5mcm9tKFwicm91dGUtYnl0ZXNcIiksXG4gICAgICBjb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICAgIGNhY2hlQ29udHJvbDogXCJwdWJsaWMsIG1heC1hZ2U9MTIwXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIGBuZXh0IHN0YXJ0YCBwYXNzZXMgb24gdGhlIGZpbGUncyBvd24gaGVhZGVyLCB3aGljaCBzZXRzIGhvdyBsb25nIHRoZVxuICAvLyBvcHRpbWl6ZWQgaW1hZ2UgaXMga2VwdC5cbiAgaXQoXCJoYW5kcyB0aGUgb3B0aW1pemVyIHRoZSBTMyBvYmplY3QncyBDYWNoZS1Db250cm9sXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzZW5kID0gamVzdC5mbihhc3luYyAoKSA9PiAoe1xuICAgICAgQm9keTogKGFzeW5jIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkIEJ1ZmZlci5mcm9tKFwiczMtYnl0ZXNcIik7XG4gICAgICB9KSgpLFxuICAgICAgQ29udGVudFR5cGU6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICBDYWNoZUNvbnRyb2w6IFwicHVibGljLCBtYXgtYWdlPTMxNTM2MDAwLCBpbW11dGFibGVcIixcbiAgICAgIEVUYWc6ICdcImFiY1wiJyxcbiAgICB9KSk7XG4gICAgY29uc3QgeyBoZWFkIH0gPSBhd2FpdCByZXF1ZXN0KFwiL19uZXh0L3N0YXRpYy9tZWRpYS9sb2dvLnBuZ1wiLCB7XG4gICAgICB2aWE6IG9wdGltaXplckZvcih7IHMzOiB7IHNlbmQgfSBhcyB1bmtub3duIGFzIFMzQ2xpZW50IH0pLFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgICBleHBlY3QoKGltYWdlT3B0aW1pemVyIGFzIGplc3QuTW9jaykubW9jay5sYXN0Q2FsbFswXSkudG9NYXRjaE9iamVjdCh7XG4gICAgICBidWZmZXI6IEJ1ZmZlci5mcm9tKFwiczMtYnl0ZXNcIiksXG4gICAgICBjYWNoZUNvbnRyb2w6IFwicHVibGljLCBtYXgtYWdlPTMxNTM2MDAwLCBpbW11dGFibGVcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gYE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc2A6IHRoZSBmaWxlIGlzIG9uIGRpc2ssIGFuZCBhIEdldE9iamVjdCBmb3IgaXQgaXNcbiAgLy8gYSB3YXN0ZWQgcm91bmQgdHJpcC5cbiAgaXQoXCJnb2VzIHN0cmFpZ2h0IHRvIHRoZSBhcHAncyByb3V0ZXMgd2hlbiB0aGVyZSBpcyBubyBidWNrZXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNlbmQgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgZmV0Y2hJbnRlcm5hbCA9IGplc3QuZm4oYXN5bmMgKCkgPT4gKHtcbiAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgIGhlYWRlcnM6IHsgXCJjb250ZW50LXR5cGVcIjogXCJpbWFnZS9wbmdcIiB9LFxuICAgICAgYm9keTogQnVmZmVyLmZyb20oXCJkaXNrLWJ5dGVzXCIpLFxuICAgIH0pKTtcbiAgICBjb25zdCB7IGhlYWQgfSA9IGF3YWl0IHJlcXVlc3QoXCIvbG9nby5wbmdcIiwge1xuICAgICAgdmlhOiBvcHRpbWl6ZXJGb3Ioe1xuICAgICAgICBidWNrZXQ6IFwiXCIsXG4gICAgICAgIGZldGNoSW50ZXJuYWwsXG4gICAgICAgIHMzOiB7IHNlbmQgfSBhcyB1bmtub3duIGFzIFMzQ2xpZW50LFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgIGV4cGVjdChzZW5kKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGV4cGVjdChmZXRjaEludGVybmFsKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIFwiL2xvZ28ucG5nXCIsXG4gICAgICBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgIGltYWdlQ29uZmlnRGVmYXVsdC5tYXhpbXVtUmVzcG9uc2VCb2R5LFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwiYW5zd2VycyA0MDAgd2hlbiB0aGUgcm91dGUgc2VuZHMgbm8gYm9keVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBoZWFkIH0gPSBhd2FpdCByZXF1ZXN0KFwiL2FwaS9hdmF0YXI/aWQ9NDJcIiwge1xuICAgICAgdmlhOiB3aXRoUzNNaXNzKGFzeW5jICgpID0+ICh7XG4gICAgICAgIHN0YXR1c0NvZGU6IDQwNCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGJvZHk6IEJ1ZmZlci5hbGxvYygwKSxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgICBleHBlY3QoaGVhZC5zdGF0dXNDb2RlKS50b0JlKDQwMCk7XG4gIH0pO1xuXG4gIGl0KFwiYW5zd2VycyBhbiBleHBsaWNpdCA1MDIgZm9yIGEgc291cmNlIHNlcnZlZCBieSBhbm90aGVyIGZ1bmN0aW9uR3JvdXBzIGdyb3VwXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlcnJvciA9IGplc3Quc3B5T24oY29uc29sZSwgXCJlcnJvclwiKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGhlYWQsIGJvZHkgfSA9IGF3YWl0IHJlcXVlc3QoXCIvYXBpL2F2YXRhcj9pZD00MlwiLCB7XG4gICAgICAgIHZpYTogd2l0aFMzTWlzcyhhc3luYyAoKSA9PiAoe1xuICAgICAgICAgIHN0YXR1c0NvZGU6IDAsXG4gICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgYm9keTogQnVmZmVyLmFsbG9jKDApLFxuICAgICAgICAgIG90aGVyR3JvdXA6IFwiYXZhdGFyc1wiLFxuICAgICAgICB9KSksXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoNTAyKTtcbiAgICAgIGV4cGVjdChib2R5KS50b01hdGNoKC9hbm90aGVyIGZ1bmN0aW9uR3JvdXBzIGdyb3VwLyk7XG4gICAgICBleHBlY3QoaW1hZ2VPcHRpbWl6ZXIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVycm9yLm1vY2tSZXN0b3JlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBgaW1hZ2VzLm1heGltdW1SZXNwb25zZUJvZHlgLCB3aGljaCBgbmV4dCBzdGFydGAgZW5mb3JjZXMgb24gbG9jYWxcbiAgLy8gc291cmNlcyB0b286IHBhc3QgaXQsIHRoZSBzb3VyY2UgaXMgbm90IHJlYWQgaW50byBtZW1vcnkuXG4gIGl0KFwiYW5zd2VycyA0MTMgZm9yIGEgcm91dGUgcmVzcG9uc2Ugb3ZlciBtYXhpbXVtUmVzcG9uc2VCb2R5XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGhlYWQgfSA9IGF3YWl0IHJlcXVlc3QoXCIvYXBpL2V4cG9ydFwiLCB7XG4gICAgICB2aWE6IHdpdGhTM01pc3MoYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgc3RhdHVzQ29kZTogMCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGJvZHk6IEJ1ZmZlci5hbGxvYygwKSxcbiAgICAgICAgdG9vTGFyZ2U6IHRydWUsXG4gICAgICB9KSksXG4gICAgfSk7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSg0MTMpO1xuICAgIGV4cGVjdChpbWFnZU9wdGltaXplcikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoXCJhbnN3ZXJzIDQxMyBmb3IgYW4gUzMgb2JqZWN0IG92ZXIgbWF4aW11bVJlc3BvbnNlQm9keVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBoZWFkIH0gPSBhd2FpdCByZXF1ZXN0KFwiL3ZpZGVvLm1wNFwiLCB7XG4gICAgICB2aWE6IG9wdGltaXplckZvcih7XG4gICAgICAgIGltYWdlczogeyBtYXhpbXVtUmVzcG9uc2VCb2R5OiAxMCB9LFxuICAgICAgICBzMzoge1xuICAgICAgICAgIHNlbmQ6IGFzeW5jICgpID0+ICh7XG4gICAgICAgICAgICBCb2R5OiBbQnVmZmVyLmZyb20oXCJuZXZlciByZWFkXCIpXSxcbiAgICAgICAgICAgIENvbnRlbnRMZW5ndGg6IDExLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgUzNDbGllbnQsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBleHBlY3QoaGVhZC5zdGF0dXNDb2RlKS50b0JlKDQxMyk7XG4gICAgZXhwZWN0KGltYWdlT3B0aW1pemVyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlJ1bnRpbWVJbWFnZU9wdGltaXplciBjYWNoZVwiLCAoKSA9PiB7XG4gIGl0KFwib3B0aW1pemVzIG9uY2UsIHRoZW4gYW5zd2VycyBmcm9tIHRoZSBjYWNoZSBoYW5kbGVyXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB2aWEgPSBvcHRpbWl6ZXJGb3IoKTtcbiAgICBjb25zdCBmaXJzdCA9IGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL2NhY2hlZC5wbmdcIiwgeyB2aWEgfSk7XG4gICAgZXhwZWN0KGZpcnN0LmhlYWQuaGVhZGVyc1tcIngtbmV4dGpzLWNhY2hlXCJdKS50b0JlKFwiTUlTU1wiKTtcbiAgICBleHBlY3QoZmlyc3QuYm9keSkudG9CZShQTkcudG9TdHJpbmcoKSk7XG5cbiAgICBjb25zdCBzZWNvbmQgPSBhd2FpdCByZXF1ZXN0KFwiL3Bob3Rvcy9jYWNoZWQucG5nXCIsIHsgdmlhIH0pO1xuICAgIGV4cGVjdChzZWNvbmQuaGVhZC5zdGF0dXNDb2RlKS50b0JlKDIwMCk7XG4gICAgZXhwZWN0KHNlY29uZC5oZWFkLmhlYWRlcnNbXCJ4LW5leHRqcy1jYWNoZVwiXSkudG9CZShcIkhJVFwiKTtcbiAgICBleHBlY3Qoc2Vjb25kLmJvZHkpLnRvQmUoUE5HLnRvU3RyaW5nKCkpO1xuICAgIGV4cGVjdChzZWNvbmQuaGVhZC5oZWFkZXJzLmV0YWcpLnRvQmUoRVRBRyk7XG4gICAgZXhwZWN0KGltYWdlT3B0aW1pemVyKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG5cbiAgICAvLyBUaGUgZW50cnkgYG5leHQgc3RhcnRgIHdvdWxkIGhhdmUgd3JpdHRlbi5cbiAgICBjb25zdCBbZW50cnldID0gWy4uLk1hcENhY2hlSGFuZGxlci5lbnRyaWVzLnZhbHVlcygpXSBhcyBBcnJheTx7XG4gICAgICB2YWx1ZTogeyBraW5kOiBzdHJpbmc7IGV4dGVuc2lvbjogc3RyaW5nIH07XG4gICAgfT47XG4gICAgZXhwZWN0KGVudHJ5LnZhbHVlKS50b01hdGNoT2JqZWN0KHsga2luZDogXCJJTUFHRVwiLCBleHRlbnNpb246IFwid2VicFwiIH0pO1xuICB9KTtcblxuICAvLyBBbm90aGVyIGluc3RhbmNlOiBub3RoaW5nIGluIG1lbW9yeSwgc28gdGhlIGhpdCBpcyB0aGUgY2FjaGUgaGFuZGxlcidzLlxuICBpdChcInNoYXJlcyB0aGUgb3B0aW1pemVkIGltYWdlIGFjcm9zcyBpbnN0YW5jZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL3NoYXJlZC5wbmdcIiwgeyB2aWE6IG9wdGltaXplckZvcigpIH0pO1xuICAgIGNvbnN0IG90aGVyID0gYXdhaXQgcmVxdWVzdChcIi9waG90b3Mvc2hhcmVkLnBuZ1wiLCB7IHZpYTogb3B0aW1pemVyRm9yKCkgfSk7XG4gICAgZXhwZWN0KG90aGVyLmhlYWQuaGVhZGVyc1tcIngtbmV4dGpzLWNhY2hlXCJdKS50b0JlKFwiSElUXCIpO1xuICAgIGV4cGVjdChpbWFnZU9wdGltaXplcikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICB9KTtcblxuICAvLyBUaGUgbWFuaWZlc3QgbmFtZXMgaXQgcmVsYXRpdmUgdG8gdGhlIGRpc3QgZGlyLlxuICBpdChcImxvYWRzIHRoZSBhcHAncyBjYWNoZUhhbmRsZXIgZnJvbSB3aGVyZSBuZXh0IHN0YXJ0IHdvdWxkXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZXF1ZXN0KFwiL3Bob3Rvcy9jYWNoZWQucG5nXCIsIHsgdmlhOiBvcHRpbWl6ZXJGb3IoKSB9KTtcbiAgICBleHBlY3QoaW1wb3J0ZWQpLnRvTWF0Y2goXG4gICAgICAvXmZpbGU6XFwvXFwvLipcXC9ub2RlX21vZHVsZXNcXC9jZGstbmV4dGpzXFwvbGliXFwvYWRhcHRlclxcL2NhY2hlLWhhbmRsZXJcXC5tanMkLyxcbiAgICApO1xuICAgIGV4cGVjdChNYXBDYWNoZUhhbmRsZXIub3B0aW9ucykudG9NYXRjaE9iamVjdCh7IGRldjogZmFsc2UgfSk7XG4gIH0pO1xuXG4gIC8vIEEgdHJhbnNpZW50IGZhaWx1cmUgbG9hZGluZyB0aGUgY2FjaGVIYW5kbGVyIChFTUZJTEUgaW4gYSBjb2xkLXN0YXJ0XG4gIC8vIGJ1cnN0KSBtdXN0IG5vdCBmYWlsIGV2ZXJ5IGxhdGVyIGltYWdlIHJlcXVlc3Qgb24gdGhlIGluc3RhbmNlLlxuICBpdChcInJldHJpZXMgbG9hZGluZyB0aGUgY2FjaGVIYW5kbGVyIGFmdGVyIGEgZmFpbGVkIGxvYWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVycm9yID0gamVzdC5zcHlPbihjb25zb2xlLCBcImVycm9yXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGltcG9ydE1vZHVsZSA9IGplc3RcbiAgICAgICAgLmZuKClcbiAgICAgICAgLm1vY2tSZWplY3RlZFZhbHVlT25jZShuZXcgRXJyb3IoXCJFTUZJTEVcIikpXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZSh7IGRlZmF1bHQ6IE1hcENhY2hlSGFuZGxlciB9KTtcbiAgICAgIGNvbnN0IHZpYSA9IG9wdGltaXplckZvcih7IGltcG9ydE1vZHVsZSB9KTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgKGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL3JldHJ5LnBuZ1wiLCB7IHZpYSB9KSkuaGVhZC5zdGF0dXNDb2RlLFxuICAgICAgKS50b0JlKDUwMCk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIChhd2FpdCByZXF1ZXN0KFwiL3Bob3Rvcy9yZXRyeS5wbmdcIiwgeyB2aWEgfSkpLmhlYWQuc3RhdHVzQ29kZSxcbiAgICAgICkudG9CZSgyMDApO1xuICAgICAgZXhwZWN0KGltcG9ydE1vZHVsZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlcnJvci5tb2NrUmVzdG9yZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gVGhlIHdyaXRlIG9mIGEgZnJlc2ggaW1hZ2UgZ29lcyB0byBgd2FpdFVudGlsYCwgbm90IGluIGZyb250IG9mIHRoZVxuICAvLyByZXNwb25zZTogdGhlIGltYWdlIGlzIHNlbnQgYmVmb3JlIHRoZSBjYWNoZSBoYW5kbGVyIGhhcyBpdC5cbiAgaXQoXCJ3cml0ZXMgYSBtaXNzIHRvIHRoZSBjYWNoZSBhZnRlciBhbnN3ZXJpbmcsIHRocm91Z2ggd2FpdFVudGlsXCIsIGFzeW5jICgpID0+IHtcbiAgICAvLyBBIHdyaXRlIHRoYXQgY2FuJ3QgZmluaXNoIHVudGlsIHJlbGVhc2VkOiBpZiB0aGUgcmVzcG9uc2Ugd2FpdGVkIG9uIGl0LFxuICAgIC8vIGByZXF1ZXN0YCB3b3VsZCBuZXZlciByZXR1cm4uXG4gICAgbGV0IHJlbGVhc2UhOiAoKSA9PiB2b2lkO1xuICAgIGNvbnN0IGdhdGUgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gKHJlbGVhc2UgPSByZXNvbHZlKSk7XG4gICAgY29uc3Qgc2V0ID0gTWFwQ2FjaGVIYW5kbGVyLnByb3RvdHlwZS5zZXQ7XG4gICAgTWFwQ2FjaGVIYW5kbGVyLnByb3RvdHlwZS5zZXQgPSBhc3luYyBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgYXdhaXQgZ2F0ZTtcbiAgICAgIHJldHVybiBzZXQuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwZW5kaW5nOiBBcnJheTxQcm9taXNlPHVua25vd24+PiA9IFtdO1xuICAgICAgY29uc3QgZmlyc3QgPSBhd2FpdCByZXF1ZXN0KFwiL3Bob3Rvcy9kZWZlcnJlZC5wbmdcIiwge1xuICAgICAgICB2aWE6IG9wdGltaXplckZvcigpLFxuICAgICAgICB3YWl0VW50aWw6IChwcm9taXNlKSA9PiBwZW5kaW5nLnB1c2gocHJvbWlzZSksXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChmaXJzdC5oZWFkLmhlYWRlcnNbXCJ4LW5leHRqcy1jYWNoZVwiXSkudG9CZShcIk1JU1NcIik7XG4gICAgICBleHBlY3QoTWFwQ2FjaGVIYW5kbGVyLmVudHJpZXMuc2l6ZSkudG9CZSgwKTtcblxuICAgICAgcmVsZWFzZSgpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocGVuZGluZyk7XG4gICAgICBleHBlY3QoTWFwQ2FjaGVIYW5kbGVyLmVudHJpZXMuc2l6ZSkudG9CZSgxKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgTWFwQ2FjaGVIYW5kbGVyLnByb3RvdHlwZS5zZXQgPSBzZXQ7XG4gICAgfVxuICB9KTtcbn0pO1xuIl19
|