cdk-nextjs 0.7.12 → 0.7.14
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 +346 -100
- package/.jsii.tabl.json +1 -1
- package/API.md +208 -0
- package/README.md +115 -100
- package/docs/breaking-changes.md +4 -2
- package/docs/development-guide.md +10 -0
- package/docs/harness-coverage.md +16 -6
- package/docs/next-build-output-guide.md +1 -1
- package/lib/adapter/adapter.mjs +4 -1
- package/lib/generated-structs/OptionalNextjsApiProps.d.ts +6 -0
- package/lib/generated-structs/OptionalNextjsApiProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +27 -0
- package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
- package/lib/nextjs-api.d.ts +11 -0
- package/lib/nextjs-api.js +63 -9
- package/lib/nextjs-api.test.js +127 -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.d.ts +92 -2
- package/lib/nextjs-distribution.js +223 -109
- package/lib/nextjs-distribution.test.js +492 -12
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/nextjs-static-assets.test.js +19 -7
- package/lib/root-constructs/nextjs-base-construct.d.ts +7 -0
- package/lib/root-constructs/nextjs-base-construct.js +14 -2
- package/lib/root-constructs/nextjs-global-containers.d.ts +16 -1
- package/lib/root-constructs/nextjs-global-containers.js +5 -2
- package/lib/root-constructs/nextjs-global-functions.d.ts +16 -1
- package/lib/root-constructs/nextjs-global-functions.js +5 -2
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +3 -2
- package/lib/runtime/lambda.mjs +4 -1
- package/lib/runtime/server.mjs +4 -1
- package/lib/utils/viewer-request-functions.d.ts +53 -0
- package/lib/utils/viewer-request-functions.js +172 -0
- package/lib/utils/viewer-request-functions.test.d.ts +1 -0
- package/lib/utils/viewer-request-functions.test.js +43 -0
- package/package.json +4 -1
- package/scripts/e2e-harness/README.md +10 -8
- package/scripts/e2e-harness/app.js +7 -2
- package/scripts/render-diagrams.mjs +121 -0
|
@@ -18,7 +18,7 @@ const base_path_1 = require("./utils/base-path");
|
|
|
18
18
|
* current build id AND are older than `msTtl`
|
|
19
19
|
*/
|
|
20
20
|
class NextjsPostDeploy extends constructs_1.Construct {
|
|
21
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsPostDeploy", version: "0.7.
|
|
21
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsPostDeploy", version: "0.7.14" };
|
|
22
22
|
customResource;
|
|
23
23
|
lambdaFunction;
|
|
24
24
|
props;
|
|
@@ -112,7 +112,7 @@ function isWithin(path, dir) {
|
|
|
112
112
|
* Creates S3 Bucket for public and _next/static assets and deploys them using S3Deployment.
|
|
113
113
|
*/
|
|
114
114
|
class NextjsStaticAssets extends constructs_1.Construct {
|
|
115
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsStaticAssets", version: "0.7.
|
|
115
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsStaticAssets", version: "0.7.14" };
|
|
116
116
|
bucket;
|
|
117
117
|
/**
|
|
118
118
|
* The first of `staticDeployment`, `serviceWorkerDeployment` and
|
|
@@ -273,12 +273,23 @@ describe("NextjsStaticAssets", () => {
|
|
|
273
273
|
writePublicFile();
|
|
274
274
|
expect(() => createStaticAssets({})).not.toThrow(/ELOOP/);
|
|
275
275
|
});
|
|
276
|
+
// Checks the directories this construct staged, not a before/after listing
|
|
277
|
+
// of `os.tmpdir()`: jest runs other files in parallel workers, and any of
|
|
278
|
+
// them that builds a `NextjsStaticAssets` (`test/root-constructs.test.ts`,
|
|
279
|
+
// for one) stages `nextjs-assets-*` directories into the same temp
|
|
280
|
+
// directory while this runs, which the listing counted as leaked.
|
|
276
281
|
it("removes the staging directories when a deployment fails", () => {
|
|
277
282
|
writePublicFile();
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
283
|
+
const proto = nextjs_static_assets_1.NextjsStaticAssets.prototype;
|
|
284
|
+
const stageDirectory = proto.stageDirectory;
|
|
285
|
+
const staged = [];
|
|
286
|
+
jest.spyOn(proto, "stageDirectory").mockImplementation(function (...args) {
|
|
287
|
+
const dir = stageDirectory.apply(this, args);
|
|
288
|
+
if (dir)
|
|
289
|
+
staged.push(dir);
|
|
290
|
+
return dir;
|
|
291
|
+
});
|
|
292
|
+
jest.spyOn(proto, "createDeployment").mockImplementation(() => {
|
|
282
293
|
throw new Error("deployment failed");
|
|
283
294
|
});
|
|
284
295
|
try {
|
|
@@ -287,8 +298,9 @@ describe("NextjsStaticAssets", () => {
|
|
|
287
298
|
finally {
|
|
288
299
|
jest.restoreAllMocks();
|
|
289
300
|
}
|
|
290
|
-
|
|
291
|
-
expect(
|
|
301
|
+
// `.next/static` and `public`, both staged before the first deployment.
|
|
302
|
+
expect(staged).toHaveLength(2);
|
|
303
|
+
expect(staged.filter((dir) => (0, node_fs_1.existsSync)(dir))).toEqual([]);
|
|
292
304
|
});
|
|
293
305
|
it("removes its staging directories once CDK has copied them", () => {
|
|
294
306
|
writePublicFile();
|
|
@@ -359,4 +371,4 @@ describe("NextjsStaticAssets", () => {
|
|
|
359
371
|
});
|
|
360
372
|
});
|
|
361
373
|
});
|
|
362
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXN0YXRpYy1hc3NldHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtc3RhdGljLWFzc2V0cy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0RBQXNEO0FBQ3RELHFDQVNpQjtBQUNqQixxQ0FBaUM7QUFDakMseUNBQWlDO0FBQ2pDLDZDQUF1RDtBQUN2RCx1REFBa0Q7QUFDbEQsK0NBQTRDO0FBQzVDLHFFQUErRTtBQUMvRSwrQ0FBbUU7QUFDbkUsaUVBQTREO0FBRTVELFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7SUFDbEMsSUFBSSxLQUFZLENBQUM7SUFDakIsSUFBSSxjQUFzQixDQUFDO0lBRTNCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLElBQUksaUJBQUcsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzFDLGNBQWMsR0FBRyxJQUFBLHFCQUFXLEVBQUMsSUFBQSxnQkFBSSxFQUFDLElBQUEsZ0JBQU0sR0FBRSxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLFNBQVMsR0FBRyxJQUFBLGdCQUFJLEVBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxRCxJQUFBLG1CQUFTLEVBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBQSx1QkFBYSxFQUFDLElBQUEsZ0JBQUksRUFBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsSUFBQSxnQkFBTSxFQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQyxDQUFD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Q0FBQyw2QkFBNkIsQ0FBQyxDQUN2RSxDQUFDO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUN2RSwwQkFBMEIsQ0FDM0IsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsMEVBQTBFO1FBQzFFLEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxHQUFHLEVBQUU7WUFDOUQsTUFBTSxDQUNKLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQ3hELENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hCLHFFQUFxRTtZQUNyRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDNUIscUJBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLENBQ3ZFLENBQUM7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgcm1TeW5jLFxuICBzeW1saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luYyxcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQXBwLCBBc3NldFN0YWdpbmcsIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hc3NlcnRpb25zXCI7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBCdWNrZXREZXBsb3ltZW50LCBDYWNoZUNvbnRyb2wgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnRcIjtcbmltcG9ydCB7IERJU0FCTEVfQVNTRVRfU1RBR0lOR19DT05URVhUIH0gZnJvbSBcImF3cy1jZGstbGliL2N4LWFwaVwiO1xuaW1wb3J0IHsgTmV4dGpzU3RhdGljQXNzZXRzIH0gZnJvbSBcIi4vbmV4dGpzLXN0YXRpYy1hc3NldHNcIjtcblxuZGVzY3JpYmUoXCJOZXh0anNTdGF0aWNBc3NldHNcIiwgKCkgPT4ge1xuICBsZXQgc3RhY2s6IFN0YWNrO1xuICBsZXQgYnVpbGREaXJlY3Rvcnk6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksIFwiVGVzdFN0YWNrXCIpO1xuICAgIGJ1aWxkRGlyZWN0b3J5ID0gbWtkdGVtcFN5bmMoam9pbih0bXBkaXIoKSwgXCJuZXh0anMtc3RhdGljLWFzc2V0cy1cIikpO1xuICAgIGNvbnN0IHN0YXRpY0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwiLm5leHRcIiwgXCJzdGF0aWNcIik7XG4gICAgbWtkaXJTeW5jKHN0YXRpY0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhqb2luKHN0YXRpY0RpciwgXCJjaHVuay5qc1wiKSwgXCIvLyBjaHVua1wiKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBybVN5bmMoYnVpbGREaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RhdGljQXNzZXRzKHByb3BzOiB7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgZGVzdGluYXRpb25LZXlQcmVmaXg/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyhzdGFjaywgXCJOZXh0anNTdGF0aWNBc3NldHNcIiwge1xuICAgICAgYnVpbGREaXJlY3RvcnksXG4gICAgICBidWlsZElkOiBcInRlc3QtYnVpbGQtaWRcIixcbiAgICAgIGJhc2VQYXRoOiBwcm9wcy5iYXNlUGF0aCxcbiAgICAgIG92ZXJyaWRlczpcbiAgICAgICAgcHJvcHMuZGVzdGluYXRpb25LZXlQcmVmaXggPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGJ1Y2tldERlcGxveW1lbnRQcm9wczoge1xuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBwcm9wcy5kZXN0aW5hdGlvbktleVByZWZpeCxcbiAgICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZGVzY3JpYmUoXCJrZXlQcmVmaXhcIiwgKCkgPT4ge1xuICAgIGl0KFwiaXMgZW1wdHkgd2hlbiBubyBiYXNlUGF0aCBpcyBzZXRcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSkua2V5UHJlZml4KS50b0JlKFwiXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzdHJpcHMgc3Vycm91bmRpbmcgc2xhc2hlcyBmcm9tIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChjcmVhdGVTdGF0aWNBc3NldHMoeyBiYXNlUGF0aDogXCIvYmFzZS9cIiB9KS5rZXlQcmVmaXgpLnRvQmUoXCJiYXNlXCIpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIG92ZXJyaWRlIGlzIHNwcmVhZCBsYXN0IGludG8gQnVja2V0RGVwbG95bWVudCwgc28gaXQgZGVjaWRlcyB3aGVyZVxuICAgIC8vIHRoZSBvYmplY3RzIGFjdHVhbGx5IGxhbmQuIENvbnN1bWVycyByZWFkaW5nIGFzc2V0cyBiYWNrIG91dCBvZiB0aGVcbiAgICAvLyBidWNrZXQgaGF2ZSB0byBzZWUgdGhhdCwgbm90IHRoZSBiYXNlUGF0aCBwcm9wLlxuICAgIGl0KFwicmVmbGVjdHMgYSBkZXN0aW5hdGlvbktleVByZWZpeCBvdmVycmlkZSByYXRoZXIgdGhhbiBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGNyZWF0ZVN0YXRpY0Fzc2V0cyh7XG4gICAgICAgICAgYmFzZVBhdGg6IFwiL2Jhc2VcIixcbiAgICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogXCJicmFuY2gteFwiLFxuICAgICAgICB9KS5rZXlQcmVmaXgsXG4gICAgICApLnRvQmUoXCJicmFuY2gteFwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwiaXMgZW1wdHkgd2hlbiBhbiBvdmVycmlkZSBjbGVhcnMgdGhlIHByZWZpeFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGNyZWF0ZVN0YXRpY0Fzc2V0cyh7IGJhc2VQYXRoOiBcIi9iYXNlXCIsIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBcIlwiIH0pXG4gICAgICAgICAgLmtleVByZWZpeCxcbiAgICAgICkudG9CZShcIlwiKTtcbiAgICB9KTtcblxuICAgIC8vIEEgSlNJSSBsYW5ndWFnZSBiaW5kaW5nLCBvciBhIHByb2dyYW1tYXRpY2FsbHkgYnVpbHQgcHJvcHMgb2JqZWN0LCBjYW5cbiAgICAvLyBtYXRlcmlhbGl6ZSBhbiB1bnNldCBvcHRpb25hbCBmaWVsZCBhcyBhbiBleHBsaWNpdCBgdW5kZWZpbmVkYC4gVHJlYXRpbmdcbiAgICAvLyB0aGF0IGFzIGFuIGludGVudGlvbmFsIFwibW92ZSB0aGUgYXNzZXRzIHRvIHRoZSBidWNrZXQgcm9vdFwiIG92ZXJyaWRlIHdvdWxkXG4gICAgLy8gdXBsb2FkIHRoZW0gdGhlcmUgd2hpbGUgQ2xvdWRGcm9udCBzdGlsbCByZXF1ZXN0ZWQgdGhlbSB1bmRlciBiYXNlUGF0aCxcbiAgICAvLyBmYWlsaW5nIHN5bnRoIHdpdGggYSBrZXkgcHJlZml4IG1pc21hdGNoIHRoYXQgbmFtZXMgbmVpdGhlciB0aGUgb3ZlcnJpZGVcbiAgICAvLyBub3IgdGhlIGNhdXNlLlxuICAgIGl0KFwiZmFsbHMgYmFjayB0byBiYXNlUGF0aCB3aGVuIHRoZSBvdmVycmlkZSBrZXkgaXMgcHJlc2VudCBidXQgdW5kZWZpbmVkXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IG5ldyBOZXh0anNTdGF0aWNBc3NldHMoc3RhY2ssIFwiTmV4dGpzU3RhdGljQXNzZXRzXCIsIHtcbiAgICAgICAgYnVpbGREaXJlY3RvcnksXG4gICAgICAgIGJ1aWxkSWQ6IFwidGVzdC1idWlsZC1pZFwiLFxuICAgICAgICBiYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgICBidWNrZXREZXBsb3ltZW50UHJvcHM6IHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiB1bmRlZmluZWQsXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHN0YXRpY0Fzc2V0cy5rZXlQcmVmaXgpLnRvQmUoXCJiYXNlXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIkNhY2hlLUNvbnRyb2xcIiwgKCkgPT4ge1xuICAgIGNvbnN0IElNTVVUQUJMRSA9IFwicHVibGljLCBtYXgtYWdlPTMxNTM2MDAwLCBpbW11dGFibGVcIjtcblxuICAgIC8qKiBUaGUgZGVwbG95bWVudCByZXNvdXJjZXMnIHByb3BlcnRpZXMsIGJ5IGNvbnN0cnVjdCBJRC4gKi9cbiAgICBmdW5jdGlvbiBkZXBsb3ltZW50cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgICAgXCJDdXN0b206OkNES0J1Y2tldERlcGxveW1lbnRcIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNvdXJjZXMpLm1hcCgoW2xvZ2ljYWxJZCwgcmVzb3VyY2VdKSA9PiBbXG4gICAgICAgICAgbG9naWNhbElkLm1hdGNoKC9OZXh0anNTdGF0aWNBc3NldHMoXFx3Kz8pQ3VzdG9tUmVzb3VyY2UvKSFbMV0sXG4gICAgICAgICAgcmVzb3VyY2UuUHJvcGVydGllcyxcbiAgICAgICAgXSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdyaXRlUHVibGljRmlsZSgpIHtcbiAgICAgIGNvbnN0IHB1YmxpY0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIpO1xuICAgICAgbWtkaXJTeW5jKHB1YmxpY0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4ocHVibGljRGlyLCBcImxvZ28ucG5nXCIpLCBcInBuZ1wiKTtcbiAgICB9XG5cbiAgICAvLyBDbG91ZEZyb250IGFuZCBBUEkgR2F0ZXdheSBzZXJ2ZSB0aGVzZSBzdHJhaWdodCBmcm9tIFMzLCBzbyB0aGVcbiAgICAvLyBvYmplY3QncyBtZXRhZGF0YSBpcyB0aGUgb25seSBDYWNoZS1Db250cm9sIGEgYnJvd3NlciBnZXRzLlxuICAgIGl0KFwidXBsb2FkcyBfbmV4dC9zdGF0aWMgaW1tdXRhYmxlIGFuZCBwdWJsaWMvIHdpdGhvdXQgYSBoZWFkZXJcIiwgKCkgPT4ge1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBleHBlY3Qoc3RhdGljQXNzZXRzLnN0YXRpY0RlcGxveW1lbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3Qoc3RhdGljQXNzZXRzLnB1YmxpY0RlcGxveW1lbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBjb25zdCB7IERlcGxveW1lbnQ6IHN0YXRpY1VwbG9hZCwgUHVibGljRGVwbG95bWVudDogcHVibGljVXBsb2FkIH0gPVxuICAgICAgICBkZXBsb3ltZW50cygpO1xuICAgICAgZXhwZWN0KHN0YXRpY1VwbG9hZC5TeXN0ZW1NZXRhZGF0YSkudG9FcXVhbCh7XG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBJTU1VVEFCTEUsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChwdWJsaWNVcGxvYWQuU3lzdGVtTWV0YWRhdGEpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGZvciAoY29uc3QgdXBsb2FkIG9mIFtzdGF0aWNVcGxvYWQsIHB1YmxpY1VwbG9hZF0pIHtcbiAgICAgICAgZXhwZWN0KHVwbG9hZC5Vc2VyTWV0YWRhdGEpLnRvRXF1YWwoeyBidWlsZF9pZDogXCJ0ZXN0LWJ1aWxkLWlkXCIgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdChcImFwcGxpZXMgYW4gb3ZlcnJpZGRlbiBjYWNoZUNvbnRyb2wgdG8gcHVibGljLyBmaWxlcyBvbmx5XCIsICgpID0+IHtcbiAgICAgIHdyaXRlUHVibGljRmlsZSgpO1xuICAgICAgbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyhzdGFjaywgXCJOZXh0anNTdGF0aWNBc3NldHNcIiwge1xuICAgICAgICBidWlsZERpcmVjdG9yeSxcbiAgICAgICAgYnVpbGRJZDogXCJ0ZXN0LWJ1aWxkLWlkXCIsXG4gICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgIGJ1Y2tldERlcGxveW1lbnRQcm9wczoge1xuICAgICAgICAgICAgY2FjaGVDb250cm9sOiBbQ2FjaGVDb250cm9sLmZyb21TdHJpbmcoXCJwdWJsaWMsIG1heC1hZ2U9MzYwMFwiKV0sXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgeyBEZXBsb3ltZW50OiBzdGF0aWNVcGxvYWQsIFB1YmxpY0RlcGxveW1lbnQ6IHB1YmxpY1VwbG9hZCB9ID1cbiAgICAgICAgZGVwbG95bWVudHMoKTtcbiAgICAgIGV4cGVjdChzdGF0aWNVcGxvYWQuU3lzdGVtTWV0YWRhdGEpLnRvRXF1YWwoe1xuICAgICAgICBcImNhY2hlLWNvbnRyb2xcIjogSU1NVVRBQkxFLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QocHVibGljVXBsb2FkLlN5c3RlbU1ldGFkYXRhKS50b0VxdWFsKHtcbiAgICAgICAgXCJjYWNoZS1jb250cm9sXCI6IFwicHVibGljLCBtYXgtYWdlPTM2MDBcIixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJjcmVhdGVzIG9ubHkgdGhlIF9uZXh0L3N0YXRpYyB1cGxvYWQgd2l0aG91dCBhIHB1YmxpYy8gZGlyZWN0b3J5XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7IGJhc2VQYXRoOiBcIi9iYXNlXCIgfSk7XG5cbiAgICAgIGV4cGVjdChzdGF0aWNBc3NldHMucHVibGljRGVwbG95bWVudCkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHN0YXRpY0Fzc2V0cy5kZXBsb3ltZW50KS50b0JlKHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50KTtcbiAgICAgIGNvbnN0IHVwbG9hZHMgPSBkZXBsb3ltZW50cygpO1xuICAgICAgZXhwZWN0KE9iamVjdC5rZXlzKHVwbG9hZHMpKS50b0VxdWFsKFtcIkRlcGxveW1lbnRcIl0pO1xuICAgICAgZXhwZWN0KHVwbG9hZHMuRGVwbG95bWVudC5EZXN0aW5hdGlvbkJ1Y2tldEtleVByZWZpeCkudG9CZShcImJhc2VcIik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBLZWVwcyB0aGUgc3RhZ2luZyBkaXJlY3Rvcmllcywgd2hpY2ggYXJlIG90aGVyd2lzZSByZW1vdmVkIG9uY2UgQ0RLIGhhc1xuICAgICAqIGNvcGllZCB0aGVtIGludG8gYGNkay5vdXRgLCBzbyBgc3RhZ2VkRGlyYCBjYW4gbG9vayBpbnNpZGUgdGhlbS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZWVwU3RhZ2luZygpIHtcbiAgICAgIHN0YWNrID0gbmV3IFN0YWNrKFxuICAgICAgICBuZXcgQXBwKHsgY29udGV4dDogeyBbRElTQUJMRV9BU1NFVF9TVEFHSU5HX0NPTlRFWFRdOiB0cnVlIH0gfSksXG4gICAgICAgIFwiVGVzdFN0YWNrXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKiBUaGUgZGlyZWN0b3J5IGEgZGVwbG95bWVudCB1cGxvYWRzLCBmb3IgY2hlY2tpbmcgd2hhdCB3YXMgc3RhZ2VkLiAqL1xuICAgIGZ1bmN0aW9uIHN0YWdlZERpcihkZXBsb3ltZW50OiBCdWNrZXREZXBsb3ltZW50KTogc3RyaW5nIHtcbiAgICAgIC8vIFRoZSBkZXBsb3ltZW50J3Mgb3duIHNvdXJjZSBhc3NldCwgbm90IHRoZSBBV1MgQ0xJIGxheWVyJ3MuXG4gICAgICByZXR1cm4gZGVwbG95bWVudC5ub2RlXG4gICAgICAgIC5maW5kQWxsKClcbiAgICAgICAgLmZpbHRlcigoYyk6IGMgaXMgQXNzZXRTdGFnaW5nID0+IGMgaW5zdGFuY2VvZiBBc3NldFN0YWdpbmcpXG4gICAgICAgIC5tYXAoKGMpID0+IGMuc291cmNlUGF0aClcbiAgICAgICAgLmZpbmQoKHBhdGgpID0+IHBhdGguaW5jbHVkZXMoXCJuZXh0anMtYXNzZXRzLVwiKSkhO1xuICAgIH1cblxuICAgIC8vIGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgdGhlIGJ1aWx0IGZpbGUgb3ZlciBhIHB1YmxpYy8gb25lIGF0IHRoZSBzYW1lIHBhdGgsXG4gICAgLy8gYW5kIHRoZSBwdWJsaWMvIG9uZSBldmVyeXdoZXJlIGVsc2UuXG4gICAgaXQoXCJsZWF2ZXMgb3V0IG9ubHkgdGhlIHB1YmxpYy9fbmV4dC9zdGF0aWMgZmlsZXMgYSBidWlsdCBmaWxlIHNoYWRvd3NcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIHdyaXRlUHVibGljRmlsZSgpO1xuICAgICAgY29uc3Qgc2hhZG93RGlyID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJwdWJsaWNcIiwgXCJfbmV4dFwiLCBcInN0YXRpY1wiKTtcbiAgICAgIG1rZGlyU3luYyhzaGFkb3dEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKHNoYWRvd0RpciwgXCJjaHVuay5qc1wiKSwgXCIvLyBzaGFkb3dlZFwiKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihzaGFkb3dEaXIsIFwibGVnYWN5LmpzXCIpLCBcIi8vIHB1YmxpYyBvbmx5XCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3Qgc3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoZXhpc3RzU3luYyhqb2luKHN0YWdlZCwgXCJsb2dvLnBuZ1wiKSkpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QoZXhpc3RzU3luYyhqb2luKHN0YWdlZCwgXCJfbmV4dFwiLCBcInN0YXRpY1wiLCBcImNodW5rLmpzXCIpKSkudG9CZShcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJsZWdhY3kuanNcIikpKS50b0JlKFxuICAgICAgICB0cnVlLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIE5leHQuanMgYW5kIFMzIGtleXMgYXJlIGNhc2Utc2Vuc2l0aXZlLCBldmVuIHdoZXJlIHRoZSBmaWxlc3lzdGVtIGlzbid0LlxuICAgIGl0KFwiZG9lc24ndCB0cmVhdCBhIHB1YmxpYy9fbmV4dC9zdGF0aWMgZmlsZSBhcyBzaGFkb3dlZCBieSBhbm90aGVyIGNhc2VcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIGNvbnN0IHNoYWRvd0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwiX25leHRcIiwgXCJzdGF0aWNcIik7XG4gICAgICBta2RpclN5bmMoc2hhZG93RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihzaGFkb3dEaXIsIFwiQ2h1bmsuanNcIiksIFwiLy8gcHVibGljIG9ubHlcIik7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBjb25zdCBzdGFnZWQgPSBzdGFnZWREaXIoc3RhdGljQXNzZXRzLnB1YmxpY0RlcGxveW1lbnQhKTtcbiAgICAgIGV4cGVjdChyZWFkZGlyU3luYyhqb2luKHN0YWdlZCwgXCJfbmV4dFwiLCBcInN0YXRpY1wiKSkpLnRvRXF1YWwoW1xuICAgICAgICBcIkNodW5rLmpzXCIsXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwidXBsb2FkcyBhIC5uZXh0L3N0YXRpYy9zZXJ2aWNlLXdvcmtlciBmaWxlIHdpdGggdGhlIG90aGVyIGFzc2V0c1wiLCAoKSA9PiB7XG4gICAgICBrZWVwU3RhZ2luZygpO1xuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiLCBcInNlcnZpY2Utd29ya2VyXCIpLFxuICAgICAgICBcIi8vIG5vdCBhIGRpcmVjdG9yeVwiLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSk7XG5cbiAgICAgIGV4cGVjdChzdGF0aWNBc3NldHMuc2VydmljZVdvcmtlckRlcGxveW1lbnQpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGNvbnN0IHN0YWdlZCA9IHN0YWdlZERpcihzdGF0aWNBc3NldHMuc3RhdGljRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KFxuICAgICAgICBleGlzdHNTeW5jKGpvaW4oc3RhZ2VkLCBcIl9uZXh0XCIsIFwic3RhdGljXCIsIFwic2VydmljZS13b3JrZXJcIikpLFxuICAgICAgKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJ1cGxvYWRzIGEgcHVibGljLyBtYWRlIG9ubHkgb2Ygc3ltbGlua3NcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJsb2dvLnBuZ1wiKTtcbiAgICAgIHdyaXRlRmlsZVN5bmModGFyZ2V0LCBcInBuZ1wiKTtcbiAgICAgIG1rZGlyU3luYyhqb2luKGJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiKSk7XG4gICAgICBzeW1saW5rU3luYyh0YXJnZXQsIGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwibG9nby5wbmdcIikpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgZXhwZWN0KHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50KS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gQSBzZXJ2aWNlIHdvcmtlciBrZWVwcyBpdHMgVVJMIGFjcm9zcyBidWlsZHMsIHNvIE5leHQuanMgc2VydmVzIGl0XG4gICAgLy8gcmV2YWxpZGF0ZWQgcmF0aGVyIHRoYW4gaW1tdXRhYmxlLlxuICAgIGl0KFwidXBsb2FkcyBzZXJ2aWNlIHdvcmtlcnMgd2l0aCBtYXgtYWdlPTAsIG11c3QtcmV2YWxpZGF0ZVwiLCAoKSA9PiB7XG4gICAgICBrZWVwU3RhZ2luZygpO1xuICAgICAgY29uc3Qgc3dEaXIgPSBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIsIFwic3RhdGljXCIsIFwic2VydmljZS13b3JrZXJcIik7XG4gICAgICBta2RpclN5bmMoc3dEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKHN3RGlyLCBcInN3LmpzXCIpLCBcIi8vIHN3XCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3QgeyBEZXBsb3ltZW50OiBzdGF0aWNVcGxvYWQsIFNlcnZpY2VXb3JrZXJEZXBsb3ltZW50OiBzd1VwbG9hZCB9ID1cbiAgICAgICAgZGVwbG95bWVudHMoKTtcbiAgICAgIGV4cGVjdChzd1VwbG9hZC5TeXN0ZW1NZXRhZGF0YSkudG9FcXVhbCh7XG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBcInB1YmxpYywgbWF4LWFnZT0wLCBtdXN0LXJldmFsaWRhdGVcIixcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHN0YXRpY1VwbG9hZC5TeXN0ZW1NZXRhZGF0YSkudG9FcXVhbCh7XG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBJTU1VVEFCTEUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN3U3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5zZXJ2aWNlV29ya2VyRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KFxuICAgICAgICBleGlzdHNTeW5jKFxuICAgICAgICAgIGpvaW4oc3dTdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJzZXJ2aWNlLXdvcmtlclwiLCBcInN3LmpzXCIpLFxuICAgICAgICApLFxuICAgICAgKS50b0JlKHRydWUpO1xuICAgICAgY29uc3Qgc3RhdGljU3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGV4aXN0c1N5bmMoam9pbihzdGF0aWNTdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVuay5qc1wiKSksXG4gICAgICApLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGV4aXN0c1N5bmMoam9pbihzdGF0aWNTdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJzZXJ2aWNlLXdvcmtlclwiKSksXG4gICAgICApLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzdGFnZXMgYSBzeW1saW5rZWQgLm5leHQvc3RhdGljXCIsICgpID0+IHtcbiAgICAgIGtlZXBTdGFnaW5nKCk7XG4gICAgICBjb25zdCByZWFsU3RhdGljID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJyZWFsLXN0YXRpY1wiKTtcbiAgICAgIHJlbmFtZVN5bmMoam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiKSwgcmVhbFN0YXRpYyk7XG4gICAgICBzeW1saW5rU3luYyhyZWFsU3RhdGljLCBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIsIFwic3RhdGljXCIpKTtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSk7XG5cbiAgICAgIGNvbnN0IHN0YWdlZCA9IHN0YWdlZERpcihzdGF0aWNBc3NldHMuc3RhdGljRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVuay5qc1wiKSkpLnRvQmUoXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gQ0RLIHVwbG9hZHMgdGhlIGZpbGVzIGEgbGlua2VkIGRpcmVjdG9yeSBob2xkcywgc28gdGhleSBzaGFkb3cgdG9vLlxuICAgIGl0KFwidHJlYXRzIGZpbGVzIHVuZGVyIGEgc3ltbGlua2VkIC5uZXh0L3N0YXRpYyBkaXJlY3RvcnkgYXMgc2hhZG93aW5nXCIsICgpID0+IHtcbiAgICAgIGtlZXBTdGFnaW5nKCk7XG4gICAgICBjb25zdCByZWFsQ2h1bmtzID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJyZWFsLWNodW5rc1wiKTtcbiAgICAgIG1rZGlyU3luYyhyZWFsQ2h1bmtzKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihyZWFsQ2h1bmtzLCBcImEuanNcIiksIFwiLy8gYnVpbHRcIik7XG4gICAgICBzeW1saW5rU3luYyhcbiAgICAgICAgcmVhbENodW5rcyxcbiAgICAgICAgam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiLCBcImNodW5rc1wiKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBzaGFkb3dEaXIgPSBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiLCBcIl9uZXh0XCIsIFwic3RhdGljXCIpO1xuICAgICAgbWtkaXJTeW5jKGpvaW4oc2hhZG93RGlyLCBcImNodW5rc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oc2hhZG93RGlyLCBcImNodW5rc1wiLCBcImEuanNcIiksIFwiLy8gc2hhZG93ZWRcIik7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwibG9nby5wbmdcIiksIFwicG5nXCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3Qgc3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVua3NcIiwgXCJhLmpzXCIpKSxcbiAgICAgICkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBDREsgdXBsb2FkcyBhIGRpcmVjdG9yeSB1bmRlciBldmVyeSBuYW1lIGEgbGluayBnaXZlcyBpdC5cbiAgICBpdChcInRyZWF0cyBmaWxlcyByZWFjaGVkIHRocm91Z2ggYSBzZWNvbmQgbmFtZSBhcyBzaGFkb3dpbmdcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIGNvbnN0IGJ1aWx0U3RhdGljID0gam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiKTtcbiAgICAgIG1rZGlyU3luYyhqb2luKGJ1aWx0U3RhdGljLCBcImNodW5rc1wiKSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oYnVpbHRTdGF0aWMsIFwiY2h1bmtzXCIsIFwiYS5qc1wiKSwgXCIvLyBidWlsdFwiKTtcbiAgICAgIHN5bWxpbmtTeW5jKGpvaW4oYnVpbHRTdGF0aWMsIFwiY2h1bmtzXCIpLCBqb2luKGJ1aWx0U3RhdGljLCBcImFsaWFzXCIpKTtcbiAgICAgIGNvbnN0IHNoYWRvd0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwiX25leHRcIiwgXCJzdGF0aWNcIik7XG4gICAgICBta2RpclN5bmMoam9pbihzaGFkb3dEaXIsIFwiYWxpYXNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKHNoYWRvd0RpciwgXCJhbGlhc1wiLCBcImEuanNcIiksIFwiLy8gc2hhZG93ZWRcIik7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwibG9nby5wbmdcIiksIFwicG5nXCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3Qgc3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoZXhpc3RzU3luYyhqb2luKHN0YWdlZCwgXCJfbmV4dFwiLCBcInN0YXRpY1wiLCBcImFsaWFzXCIsIFwiYS5qc1wiKSkpLnRvQmUoXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwibGVhdmVzIG91dCBhIHNoYWRvd2VkIGZpbGUgdW5kZXIgYSBzeW1saW5rZWQgcHVibGljLyBkaXJlY3RvcnlcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIGNvbnN0IGxpbmtlZCA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwibGlua2VkLXN0YXRpY1wiKTtcbiAgICAgIG1rZGlyU3luYyhsaW5rZWQpO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKGxpbmtlZCwgXCJjaHVuay5qc1wiKSwgXCIvLyBzaGFkb3dlZFwiKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihsaW5rZWQsIFwibGVnYWN5LmpzXCIpLCBcIi8vIHB1YmxpYyBvbmx5XCIpO1xuICAgICAgbWtkaXJTeW5jKGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwiX25leHRcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgc3ltbGlua1N5bmMobGlua2VkLCBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiLCBcIl9uZXh0XCIsIFwic3RhdGljXCIpKTtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSk7XG5cbiAgICAgIGNvbnN0IHN0YWdlZCA9IHN0YWdlZERpcihzdGF0aWNBc3NldHMucHVibGljRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVuay5qc1wiKSkpLnRvQmUoXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChleGlzdHNTeW5jKGpvaW4oc3RhZ2VkLCBcIl9uZXh0XCIsIFwic3RhdGljXCIsIFwibGVnYWN5LmpzXCIpKSkudG9CZShcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcImxpc3RzIGEgLm5leHQvc3RhdGljIGhvbGRpbmcgYSBsaW5rIGxvb3BcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbHRTdGF0aWMgPSBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIsIFwic3RhdGljXCIpO1xuICAgICAgc3ltbGlua1N5bmMoam9pbihidWlsdFN0YXRpYywgXCJsb29wXCIpLCBqb2luKGJ1aWx0U3RhdGljLCBcImxvb3BcIikpO1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG5cbiAgICAgIGV4cGVjdCgoKSA9PiBjcmVhdGVTdGF0aWNBc3NldHMoe30pKS5ub3QudG9UaHJvdygvRUxPT1AvKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVtb3ZlcyB0aGUgc3RhZ2luZyBkaXJlY3RvcmllcyB3aGVuIGEgZGVwbG95bWVudCBmYWlsc1wiLCAoKSA9PiB7XG4gICAgICB3cml0ZVB1YmxpY0ZpbGUoKTtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IG5ldyBTZXQocmVhZGRpclN5bmModG1wZGlyKCkpKTtcbiAgICAgIGplc3RcbiAgICAgICAgLnNweU9uKE5leHRqc1N0YXRpY0Fzc2V0cy5wcm90b3R5cGUgYXMgYW55LCBcImNyZWF0ZURlcGxveW1lbnRcIilcbiAgICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGVwbG95bWVudCBmYWlsZWRcIik7XG4gICAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhwZWN0KCgpID0+IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSkpLnRvVGhyb3coXCJkZXBsb3ltZW50IGZhaWxlZFwiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGplc3QucmVzdG9yZUFsbE1vY2tzKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxlYWtlZCA9IHJlYWRkaXJTeW5jKHRtcGRpcigpKS5maWx0ZXIoXG4gICAgICAgIChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoXCJuZXh0anMtYXNzZXRzLVwiKSAmJiAhYmVmb3JlLmhhcyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBleHBlY3QobGVha2VkKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVtb3ZlcyBpdHMgc3RhZ2luZyBkaXJlY3RvcmllcyBvbmNlIENESyBoYXMgY29waWVkIHRoZW1cIiwgKCkgPT4ge1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBmb3IgKGNvbnN0IHVwbG9hZCBvZiBbXG4gICAgICAgIHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50ISxcbiAgICAgICAgc3RhdGljQXNzZXRzLnB1YmxpY0RlcGxveW1lbnQhLFxuICAgICAgXSkge1xuICAgICAgICBleHBlY3QoZXhpc3RzU3luYyhzdGFnZWREaXIodXBsb2FkKSkpLnRvQmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVGhlIGFzc2V0IG1hbmlmZXN0IHRoZW4gcG9pbnRzIGF0IHRoZSBzdGFnaW5nIGRpcmVjdG9yeSBpdHNlbGYuXG4gICAgaXQoXCJrZWVwcyB0aGVtIHdoZW4gYXNzZXQgc3RhZ2luZyBpcyBkaXNhYmxlZFwiLCAoKSA9PiB7XG4gICAgICBrZWVwU3RhZ2luZygpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50ISkpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJmYWxscyBiYWNrIHRvIHRoZSBwdWJsaWMvIHVwbG9hZCBmb3IgYSBidWlsZCB3aXRob3V0IC5uZXh0L3N0YXRpY1wiLCAoKSA9PiB7XG4gICAgICBybVN5bmMoam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiKSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBleHBlY3Qoc3RhdGljQXNzZXRzLnN0YXRpY0RlcGxveW1lbnQpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChzdGF0aWNBc3NldHMuZGVwbG95bWVudCkudG9CZShzdGF0aWNBc3NldHMucHVibGljRGVwbG95bWVudCk7XG4gICAgICBleHBlY3QoT2JqZWN0LmtleXMoZGVwbG95bWVudHMoKSkpLnRvRXF1YWwoW1wiUHVibGljRGVwbG95bWVudFwiXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiYnVja2V0RGVwbG95bWVudFByb3BzIHRoYXQgd291bGQgYnJlYWsgdGhlIG90aGVyIHVwbG9hZHNcIiwgKCkgPT4ge1xuICAgIGZ1bmN0aW9uIHdpdGhPdmVycmlkZXMoYnVja2V0RGVwbG95bWVudFByb3BzOiBvYmplY3QpIHtcbiAgICAgIHJldHVybiAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzU3RhdGljQXNzZXRzKHN0YWNrLCBcIk5leHRqc1N0YXRpY0Fzc2V0c1wiLCB7XG4gICAgICAgICAgYnVpbGREaXJlY3RvcnksXG4gICAgICAgICAgYnVpbGRJZDogXCJ0ZXN0LWJ1aWxkLWlkXCIsXG4gICAgICAgICAgb3ZlcnJpZGVzOiB7IGJ1Y2tldERlcGxveW1lbnRQcm9wczogYnVja2V0RGVwbG95bWVudFByb3BzIGFzIGFueSB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpdChcInJlamVjdHMgcHJ1bmU6IHRydWVcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHdpdGhPdmVycmlkZXMoeyBwcnVuZTogdHJ1ZSB9KSkudG9UaHJvdygvYHBydW5lOiB0cnVlYC8pO1xuICAgIH0pO1xuXG4gICAgLy8gQ0RLJ3MgVXBkYXRlIHBhdGggZGVsZXRlcyB0aGUgb2xkIHByZWZpeCB3aXRob3V0IGNoZWNraW5nIHRoZSBidWNrZXQnc1xuICAgIC8vIG93bmVyLCByYWNpbmcgdGhlIG90aGVyIHVwbG9hZHMsIHNvIG5vIGJ1Y2tldCBpcyBzYWZlLlxuICAgIGl0KFwicmVqZWN0cyByZXRhaW5PbkRlbGV0ZTogZmFsc2VcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHdpdGhPdmVycmlkZXMoeyByZXRhaW5PbkRlbGV0ZTogZmFsc2UgfSkpLnRvVGhyb3coXG4gICAgICAgIC9gcmV0YWluT25EZWxldGU6IGZhbHNlYC8sXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHR5cGUgcmVxdWlyZXMgYm90aCwgc28gYSB0eXBlZCBjYWxsZXIgYWx3YXlzIHBhc3NlcyB0aGVtLlxuICAgIGl0KFwiaWdub3JlcyBzb3VyY2VzIGFuZCBkZXN0aW5hdGlvbkJ1Y2tldFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBvdGhlciA9IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJPdGhlclwiLCBcIm90aGVyXCIpO1xuICAgICAgbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyhzdGFjaywgXCJOZXh0anNTdGF0aWNBc3NldHNcIiwge1xuICAgICAgICBidWlsZERpcmVjdG9yeSxcbiAgICAgICAgYnVpbGRJZDogXCJ0ZXN0LWJ1aWxkLWlkXCIsXG4gICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgIGJ1Y2tldERlcGxveW1lbnRQcm9wczoge1xuICAgICAgICAgICAgc291cmNlczogW10sXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogb3RoZXIsXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IFtDYWNoZUNvbnRyb2wuZnJvbVN0cmluZyhcInB1YmxpYywgbWF4LWFnZT02MFwiKV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBbdXBsb2FkXSA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcIkN1c3RvbTo6Q0RLQnVja2V0RGVwbG95bWVudFwiKSxcbiAgICAgICk7XG4gICAgICBleHBlY3QodXBsb2FkLlByb3BlcnRpZXMuU291cmNlT2JqZWN0S2V5cykudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHVwbG9hZC5Qcm9wZXJ0aWVzLkRlc3RpbmF0aW9uQnVja2V0TmFtZSkpLnRvQ29udGFpbihcbiAgICAgICAgXCJOZXh0anNTdGF0aWNBc3NldHNCdWNrZXRcIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBBIEpTSUkgYmluZGluZyBjYW4gbWF0ZXJpYWxpemUgYW4gdW5zZXQgZmllbGQgYXMgYW4gZXhwbGljaXQgdW5kZWZpbmVkLlxuICAgIGl0KFwiYWxsb3dzIHRoZSBmaWVsZHMgd2hlbiB0aGV5IGFyZSBleHBsaWNpdGx5IHVuZGVmaW5lZFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHdpdGhPdmVycmlkZXMoeyBwcnVuZTogdW5kZWZpbmVkLCBzb3VyY2VzOiB1bmRlZmluZWQgfSksXG4gICAgICApLm5vdC50b1Rocm93KCk7XG4gICAgICAvLyBOb3QgQ0RLJ3MgZGVmYXVsdCBgcHJ1bmU6IHRydWVgLCBub3IgYSBkZXBsb3ltZW50IHdpdGggbm8gc291cmNlcy5cbiAgICAgIGNvbnN0IFt1cGxvYWRdID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFwiQ3VzdG9tOjpDREtCdWNrZXREZXBsb3ltZW50XCIpLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh1cGxvYWQuUHJvcGVydGllcy5QcnVuZSkudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QodXBsb2FkLlByb3BlcnRpZXMuU291cmNlT2JqZWN0S2V5cykudG9IYXZlTGVuZ3RoKDEpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
374
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXN0YXRpYy1hc3NldHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtc3RhdGljLWFzc2V0cy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0RBQXNEO0FBQ3RELHFDQVNpQjtBQUNqQixxQ0FBaUM7QUFDakMseUNBQWlDO0FBQ2pDLDZDQUF1RDtBQUN2RCx1REFBa0Q7QUFDbEQsK0NBQTRDO0FBQzVDLHFFQUErRTtBQUMvRSwrQ0FBbUU7QUFDbkUsaUVBQTREO0FBRTVELFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7SUFDbEMsSUFBSSxLQUFZLENBQUM7SUFDakIsSUFBSSxjQUFzQixDQUFDO0lBRTNCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLElBQUksaUJBQUcsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzFDLGNBQWMsR0FBRyxJQUFBLHFCQUFXLEVBQUMsSUFBQSxnQkFBSSxFQUFDLElBQUEsZ0JBQU0sR0FBRSxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLFNBQVMsR0FBRyxJQUFBLGdCQUFJLEVBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxRCxJQUFBLG1CQUFTLEVBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBQSx1QkFBYSxFQUFDLElBQUEsZ0JBQUksRUFBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsSUFBQSxnQkFBTSxFQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQyxDQUFD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TSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgcm1TeW5jLFxuICBzeW1saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luYyxcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQXBwLCBBc3NldFN0YWdpbmcsIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hc3NlcnRpb25zXCI7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBCdWNrZXREZXBsb3ltZW50LCBDYWNoZUNvbnRyb2wgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnRcIjtcbmltcG9ydCB7IERJU0FCTEVfQVNTRVRfU1RBR0lOR19DT05URVhUIH0gZnJvbSBcImF3cy1jZGstbGliL2N4LWFwaVwiO1xuaW1wb3J0IHsgTmV4dGpzU3RhdGljQXNzZXRzIH0gZnJvbSBcIi4vbmV4dGpzLXN0YXRpYy1hc3NldHNcIjtcblxuZGVzY3JpYmUoXCJOZXh0anNTdGF0aWNBc3NldHNcIiwgKCkgPT4ge1xuICBsZXQgc3RhY2s6IFN0YWNrO1xuICBsZXQgYnVpbGREaXJlY3Rvcnk6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksIFwiVGVzdFN0YWNrXCIpO1xuICAgIGJ1aWxkRGlyZWN0b3J5ID0gbWtkdGVtcFN5bmMoam9pbih0bXBkaXIoKSwgXCJuZXh0anMtc3RhdGljLWFzc2V0cy1cIikpO1xuICAgIGNvbnN0IHN0YXRpY0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwiLm5leHRcIiwgXCJzdGF0aWNcIik7XG4gICAgbWtkaXJTeW5jKHN0YXRpY0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhqb2luKHN0YXRpY0RpciwgXCJjaHVuay5qc1wiKSwgXCIvLyBjaHVua1wiKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBybVN5bmMoYnVpbGREaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RhdGljQXNzZXRzKHByb3BzOiB7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgZGVzdGluYXRpb25LZXlQcmVmaXg/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyhzdGFjaywgXCJOZXh0anNTdGF0aWNBc3NldHNcIiwge1xuICAgICAgYnVpbGREaXJlY3RvcnksXG4gICAgICBidWlsZElkOiBcInRlc3QtYnVpbGQtaWRcIixcbiAgICAgIGJhc2VQYXRoOiBwcm9wcy5iYXNlUGF0aCxcbiAgICAgIG92ZXJyaWRlczpcbiAgICAgICAgcHJvcHMuZGVzdGluYXRpb25LZXlQcmVmaXggPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGJ1Y2tldERlcGxveW1lbnRQcm9wczoge1xuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBwcm9wcy5kZXN0aW5hdGlvbktleVByZWZpeCxcbiAgICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZGVzY3JpYmUoXCJrZXlQcmVmaXhcIiwgKCkgPT4ge1xuICAgIGl0KFwiaXMgZW1wdHkgd2hlbiBubyBiYXNlUGF0aCBpcyBzZXRcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSkua2V5UHJlZml4KS50b0JlKFwiXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzdHJpcHMgc3Vycm91bmRpbmcgc2xhc2hlcyBmcm9tIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChjcmVhdGVTdGF0aWNBc3NldHMoeyBiYXNlUGF0aDogXCIvYmFzZS9cIiB9KS5rZXlQcmVmaXgpLnRvQmUoXCJiYXNlXCIpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIG92ZXJyaWRlIGlzIHNwcmVhZCBsYXN0IGludG8gQnVja2V0RGVwbG95bWVudCwgc28gaXQgZGVjaWRlcyB3aGVyZVxuICAgIC8vIHRoZSBvYmplY3RzIGFjdHVhbGx5IGxhbmQuIENvbnN1bWVycyByZWFkaW5nIGFzc2V0cyBiYWNrIG91dCBvZiB0aGVcbiAgICAvLyBidWNrZXQgaGF2ZSB0byBzZWUgdGhhdCwgbm90IHRoZSBiYXNlUGF0aCBwcm9wLlxuICAgIGl0KFwicmVmbGVjdHMgYSBkZXN0aW5hdGlvbktleVByZWZpeCBvdmVycmlkZSByYXRoZXIgdGhhbiBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGNyZWF0ZVN0YXRpY0Fzc2V0cyh7XG4gICAgICAgICAgYmFzZVBhdGg6IFwiL2Jhc2VcIixcbiAgICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogXCJicmFuY2gteFwiLFxuICAgICAgICB9KS5rZXlQcmVmaXgsXG4gICAgICApLnRvQmUoXCJicmFuY2gteFwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwiaXMgZW1wdHkgd2hlbiBhbiBvdmVycmlkZSBjbGVhcnMgdGhlIHByZWZpeFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGNyZWF0ZVN0YXRpY0Fzc2V0cyh7IGJhc2VQYXRoOiBcIi9iYXNlXCIsIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBcIlwiIH0pXG4gICAgICAgICAgLmtleVByZWZpeCxcbiAgICAgICkudG9CZShcIlwiKTtcbiAgICB9KTtcblxuICAgIC8vIEEgSlNJSSBsYW5ndWFnZSBiaW5kaW5nLCBvciBhIHByb2dyYW1tYXRpY2FsbHkgYnVpbHQgcHJvcHMgb2JqZWN0LCBjYW5cbiAgICAvLyBtYXRlcmlhbGl6ZSBhbiB1bnNldCBvcHRpb25hbCBmaWVsZCBhcyBhbiBleHBsaWNpdCBgdW5kZWZpbmVkYC4gVHJlYXRpbmdcbiAgICAvLyB0aGF0IGFzIGFuIGludGVudGlvbmFsIFwibW92ZSB0aGUgYXNzZXRzIHRvIHRoZSBidWNrZXQgcm9vdFwiIG92ZXJyaWRlIHdvdWxkXG4gICAgLy8gdXBsb2FkIHRoZW0gdGhlcmUgd2hpbGUgQ2xvdWRGcm9udCBzdGlsbCByZXF1ZXN0ZWQgdGhlbSB1bmRlciBiYXNlUGF0aCxcbiAgICAvLyBmYWlsaW5nIHN5bnRoIHdpdGggYSBrZXkgcHJlZml4IG1pc21hdGNoIHRoYXQgbmFtZXMgbmVpdGhlciB0aGUgb3ZlcnJpZGVcbiAgICAvLyBub3IgdGhlIGNhdXNlLlxuICAgIGl0KFwiZmFsbHMgYmFjayB0byBiYXNlUGF0aCB3aGVuIHRoZSBvdmVycmlkZSBrZXkgaXMgcHJlc2VudCBidXQgdW5kZWZpbmVkXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IG5ldyBOZXh0anNTdGF0aWNBc3NldHMoc3RhY2ssIFwiTmV4dGpzU3RhdGljQXNzZXRzXCIsIHtcbiAgICAgICAgYnVpbGREaXJlY3RvcnksXG4gICAgICAgIGJ1aWxkSWQ6IFwidGVzdC1idWlsZC1pZFwiLFxuICAgICAgICBiYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgICBidWNrZXREZXBsb3ltZW50UHJvcHM6IHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiB1bmRlZmluZWQsXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHN0YXRpY0Fzc2V0cy5rZXlQcmVmaXgpLnRvQmUoXCJiYXNlXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIkNhY2hlLUNvbnRyb2xcIiwgKCkgPT4ge1xuICAgIGNvbnN0IElNTVVUQUJMRSA9IFwicHVibGljLCBtYXgtYWdlPTMxNTM2MDAwLCBpbW11dGFibGVcIjtcblxuICAgIC8qKiBUaGUgZGVwbG95bWVudCByZXNvdXJjZXMnIHByb3BlcnRpZXMsIGJ5IGNvbnN0cnVjdCBJRC4gKi9cbiAgICBmdW5jdGlvbiBkZXBsb3ltZW50cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgICAgXCJDdXN0b206OkNES0J1Y2tldERlcGxveW1lbnRcIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNvdXJjZXMpLm1hcCgoW2xvZ2ljYWxJZCwgcmVzb3VyY2VdKSA9PiBbXG4gICAgICAgICAgbG9naWNhbElkLm1hdGNoKC9OZXh0anNTdGF0aWNBc3NldHMoXFx3Kz8pQ3VzdG9tUmVzb3VyY2UvKSFbMV0sXG4gICAgICAgICAgcmVzb3VyY2UuUHJvcGVydGllcyxcbiAgICAgICAgXSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdyaXRlUHVibGljRmlsZSgpIHtcbiAgICAgIGNvbnN0IHB1YmxpY0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIpO1xuICAgICAgbWtkaXJTeW5jKHB1YmxpY0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4ocHVibGljRGlyLCBcImxvZ28ucG5nXCIpLCBcInBuZ1wiKTtcbiAgICB9XG5cbiAgICAvLyBDbG91ZEZyb250IGFuZCBBUEkgR2F0ZXdheSBzZXJ2ZSB0aGVzZSBzdHJhaWdodCBmcm9tIFMzLCBzbyB0aGVcbiAgICAvLyBvYmplY3QncyBtZXRhZGF0YSBpcyB0aGUgb25seSBDYWNoZS1Db250cm9sIGEgYnJvd3NlciBnZXRzLlxuICAgIGl0KFwidXBsb2FkcyBfbmV4dC9zdGF0aWMgaW1tdXRhYmxlIGFuZCBwdWJsaWMvIHdpdGhvdXQgYSBoZWFkZXJcIiwgKCkgPT4ge1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBleHBlY3Qoc3RhdGljQXNzZXRzLnN0YXRpY0RlcGxveW1lbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3Qoc3RhdGljQXNzZXRzLnB1YmxpY0RlcGxveW1lbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBjb25zdCB7IERlcGxveW1lbnQ6IHN0YXRpY1VwbG9hZCwgUHVibGljRGVwbG95bWVudDogcHVibGljVXBsb2FkIH0gPVxuICAgICAgICBkZXBsb3ltZW50cygpO1xuICAgICAgZXhwZWN0KHN0YXRpY1VwbG9hZC5TeXN0ZW1NZXRhZGF0YSkudG9FcXVhbCh7XG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBJTU1VVEFCTEUsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChwdWJsaWNVcGxvYWQuU3lzdGVtTWV0YWRhdGEpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGZvciAoY29uc3QgdXBsb2FkIG9mIFtzdGF0aWNVcGxvYWQsIHB1YmxpY1VwbG9hZF0pIHtcbiAgICAgICAgZXhwZWN0KHVwbG9hZC5Vc2VyTWV0YWRhdGEpLnRvRXF1YWwoeyBidWlsZF9pZDogXCJ0ZXN0LWJ1aWxkLWlkXCIgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdChcImFwcGxpZXMgYW4gb3ZlcnJpZGRlbiBjYWNoZUNvbnRyb2wgdG8gcHVibGljLyBmaWxlcyBvbmx5XCIsICgpID0+IHtcbiAgICAgIHdyaXRlUHVibGljRmlsZSgpO1xuICAgICAgbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyhzdGFjaywgXCJOZXh0anNTdGF0aWNBc3NldHNcIiwge1xuICAgICAgICBidWlsZERpcmVjdG9yeSxcbiAgICAgICAgYnVpbGRJZDogXCJ0ZXN0LWJ1aWxkLWlkXCIsXG4gICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgIGJ1Y2tldERlcGxveW1lbnRQcm9wczoge1xuICAgICAgICAgICAgY2FjaGVDb250cm9sOiBbQ2FjaGVDb250cm9sLmZyb21TdHJpbmcoXCJwdWJsaWMsIG1heC1hZ2U9MzYwMFwiKV0sXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgeyBEZXBsb3ltZW50OiBzdGF0aWNVcGxvYWQsIFB1YmxpY0RlcGxveW1lbnQ6IHB1YmxpY1VwbG9hZCB9ID1cbiAgICAgICAgZGVwbG95bWVudHMoKTtcbiAgICAgIGV4cGVjdChzdGF0aWNVcGxvYWQuU3lzdGVtTWV0YWRhdGEpLnRvRXF1YWwoe1xuICAgICAgICBcImNhY2hlLWNvbnRyb2xcIjogSU1NVVRBQkxFLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QocHVibGljVXBsb2FkLlN5c3RlbU1ldGFkYXRhKS50b0VxdWFsKHtcbiAgICAgICAgXCJjYWNoZS1jb250cm9sXCI6IFwicHVibGljLCBtYXgtYWdlPTM2MDBcIixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJjcmVhdGVzIG9ubHkgdGhlIF9uZXh0L3N0YXRpYyB1cGxvYWQgd2l0aG91dCBhIHB1YmxpYy8gZGlyZWN0b3J5XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7IGJhc2VQYXRoOiBcIi9iYXNlXCIgfSk7XG5cbiAgICAgIGV4cGVjdChzdGF0aWNBc3NldHMucHVibGljRGVwbG95bWVudCkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHN0YXRpY0Fzc2V0cy5kZXBsb3ltZW50KS50b0JlKHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50KTtcbiAgICAgIGNvbnN0IHVwbG9hZHMgPSBkZXBsb3ltZW50cygpO1xuICAgICAgZXhwZWN0KE9iamVjdC5rZXlzKHVwbG9hZHMpKS50b0VxdWFsKFtcIkRlcGxveW1lbnRcIl0pO1xuICAgICAgZXhwZWN0KHVwbG9hZHMuRGVwbG95bWVudC5EZXN0aW5hdGlvbkJ1Y2tldEtleVByZWZpeCkudG9CZShcImJhc2VcIik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBLZWVwcyB0aGUgc3RhZ2luZyBkaXJlY3Rvcmllcywgd2hpY2ggYXJlIG90aGVyd2lzZSByZW1vdmVkIG9uY2UgQ0RLIGhhc1xuICAgICAqIGNvcGllZCB0aGVtIGludG8gYGNkay5vdXRgLCBzbyBgc3RhZ2VkRGlyYCBjYW4gbG9vayBpbnNpZGUgdGhlbS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZWVwU3RhZ2luZygpIHtcbiAgICAgIHN0YWNrID0gbmV3IFN0YWNrKFxuICAgICAgICBuZXcgQXBwKHsgY29udGV4dDogeyBbRElTQUJMRV9BU1NFVF9TVEFHSU5HX0NPTlRFWFRdOiB0cnVlIH0gfSksXG4gICAgICAgIFwiVGVzdFN0YWNrXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKiBUaGUgZGlyZWN0b3J5IGEgZGVwbG95bWVudCB1cGxvYWRzLCBmb3IgY2hlY2tpbmcgd2hhdCB3YXMgc3RhZ2VkLiAqL1xuICAgIGZ1bmN0aW9uIHN0YWdlZERpcihkZXBsb3ltZW50OiBCdWNrZXREZXBsb3ltZW50KTogc3RyaW5nIHtcbiAgICAgIC8vIFRoZSBkZXBsb3ltZW50J3Mgb3duIHNvdXJjZSBhc3NldCwgbm90IHRoZSBBV1MgQ0xJIGxheWVyJ3MuXG4gICAgICByZXR1cm4gZGVwbG95bWVudC5ub2RlXG4gICAgICAgIC5maW5kQWxsKClcbiAgICAgICAgLmZpbHRlcigoYyk6IGMgaXMgQXNzZXRTdGFnaW5nID0+IGMgaW5zdGFuY2VvZiBBc3NldFN0YWdpbmcpXG4gICAgICAgIC5tYXAoKGMpID0+IGMuc291cmNlUGF0aClcbiAgICAgICAgLmZpbmQoKHBhdGgpID0+IHBhdGguaW5jbHVkZXMoXCJuZXh0anMtYXNzZXRzLVwiKSkhO1xuICAgIH1cblxuICAgIC8vIGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgdGhlIGJ1aWx0IGZpbGUgb3ZlciBhIHB1YmxpYy8gb25lIGF0IHRoZSBzYW1lIHBhdGgsXG4gICAgLy8gYW5kIHRoZSBwdWJsaWMvIG9uZSBldmVyeXdoZXJlIGVsc2UuXG4gICAgaXQoXCJsZWF2ZXMgb3V0IG9ubHkgdGhlIHB1YmxpYy9fbmV4dC9zdGF0aWMgZmlsZXMgYSBidWlsdCBmaWxlIHNoYWRvd3NcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIHdyaXRlUHVibGljRmlsZSgpO1xuICAgICAgY29uc3Qgc2hhZG93RGlyID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJwdWJsaWNcIiwgXCJfbmV4dFwiLCBcInN0YXRpY1wiKTtcbiAgICAgIG1rZGlyU3luYyhzaGFkb3dEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKHNoYWRvd0RpciwgXCJjaHVuay5qc1wiKSwgXCIvLyBzaGFkb3dlZFwiKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihzaGFkb3dEaXIsIFwibGVnYWN5LmpzXCIpLCBcIi8vIHB1YmxpYyBvbmx5XCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3Qgc3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoZXhpc3RzU3luYyhqb2luKHN0YWdlZCwgXCJsb2dvLnBuZ1wiKSkpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QoZXhpc3RzU3luYyhqb2luKHN0YWdlZCwgXCJfbmV4dFwiLCBcInN0YXRpY1wiLCBcImNodW5rLmpzXCIpKSkudG9CZShcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJsZWdhY3kuanNcIikpKS50b0JlKFxuICAgICAgICB0cnVlLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIE5leHQuanMgYW5kIFMzIGtleXMgYXJlIGNhc2Utc2Vuc2l0aXZlLCBldmVuIHdoZXJlIHRoZSBmaWxlc3lzdGVtIGlzbid0LlxuICAgIGl0KFwiZG9lc24ndCB0cmVhdCBhIHB1YmxpYy9fbmV4dC9zdGF0aWMgZmlsZSBhcyBzaGFkb3dlZCBieSBhbm90aGVyIGNhc2VcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIGNvbnN0IHNoYWRvd0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwiX25leHRcIiwgXCJzdGF0aWNcIik7XG4gICAgICBta2RpclN5bmMoc2hhZG93RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihzaGFkb3dEaXIsIFwiQ2h1bmsuanNcIiksIFwiLy8gcHVibGljIG9ubHlcIik7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBjb25zdCBzdGFnZWQgPSBzdGFnZWREaXIoc3RhdGljQXNzZXRzLnB1YmxpY0RlcGxveW1lbnQhKTtcbiAgICAgIGV4cGVjdChyZWFkZGlyU3luYyhqb2luKHN0YWdlZCwgXCJfbmV4dFwiLCBcInN0YXRpY1wiKSkpLnRvRXF1YWwoW1xuICAgICAgICBcIkNodW5rLmpzXCIsXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwidXBsb2FkcyBhIC5uZXh0L3N0YXRpYy9zZXJ2aWNlLXdvcmtlciBmaWxlIHdpdGggdGhlIG90aGVyIGFzc2V0c1wiLCAoKSA9PiB7XG4gICAgICBrZWVwU3RhZ2luZygpO1xuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiLCBcInNlcnZpY2Utd29ya2VyXCIpLFxuICAgICAgICBcIi8vIG5vdCBhIGRpcmVjdG9yeVwiLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSk7XG5cbiAgICAgIGV4cGVjdChzdGF0aWNBc3NldHMuc2VydmljZVdvcmtlckRlcGxveW1lbnQpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGNvbnN0IHN0YWdlZCA9IHN0YWdlZERpcihzdGF0aWNBc3NldHMuc3RhdGljRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KFxuICAgICAgICBleGlzdHNTeW5jKGpvaW4oc3RhZ2VkLCBcIl9uZXh0XCIsIFwic3RhdGljXCIsIFwic2VydmljZS13b3JrZXJcIikpLFxuICAgICAgKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJ1cGxvYWRzIGEgcHVibGljLyBtYWRlIG9ubHkgb2Ygc3ltbGlua3NcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJsb2dvLnBuZ1wiKTtcbiAgICAgIHdyaXRlRmlsZVN5bmModGFyZ2V0LCBcInBuZ1wiKTtcbiAgICAgIG1rZGlyU3luYyhqb2luKGJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiKSk7XG4gICAgICBzeW1saW5rU3luYyh0YXJnZXQsIGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwibG9nby5wbmdcIikpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgZXhwZWN0KHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50KS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gQSBzZXJ2aWNlIHdvcmtlciBrZWVwcyBpdHMgVVJMIGFjcm9zcyBidWlsZHMsIHNvIE5leHQuanMgc2VydmVzIGl0XG4gICAgLy8gcmV2YWxpZGF0ZWQgcmF0aGVyIHRoYW4gaW1tdXRhYmxlLlxuICAgIGl0KFwidXBsb2FkcyBzZXJ2aWNlIHdvcmtlcnMgd2l0aCBtYXgtYWdlPTAsIG11c3QtcmV2YWxpZGF0ZVwiLCAoKSA9PiB7XG4gICAgICBrZWVwU3RhZ2luZygpO1xuICAgICAgY29uc3Qgc3dEaXIgPSBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIsIFwic3RhdGljXCIsIFwic2VydmljZS13b3JrZXJcIik7XG4gICAgICBta2RpclN5bmMoc3dEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKHN3RGlyLCBcInN3LmpzXCIpLCBcIi8vIHN3XCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3QgeyBEZXBsb3ltZW50OiBzdGF0aWNVcGxvYWQsIFNlcnZpY2VXb3JrZXJEZXBsb3ltZW50OiBzd1VwbG9hZCB9ID1cbiAgICAgICAgZGVwbG95bWVudHMoKTtcbiAgICAgIGV4cGVjdChzd1VwbG9hZC5TeXN0ZW1NZXRhZGF0YSkudG9FcXVhbCh7XG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBcInB1YmxpYywgbWF4LWFnZT0wLCBtdXN0LXJldmFsaWRhdGVcIixcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHN0YXRpY1VwbG9hZC5TeXN0ZW1NZXRhZGF0YSkudG9FcXVhbCh7XG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBJTU1VVEFCTEUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN3U3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5zZXJ2aWNlV29ya2VyRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KFxuICAgICAgICBleGlzdHNTeW5jKFxuICAgICAgICAgIGpvaW4oc3dTdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJzZXJ2aWNlLXdvcmtlclwiLCBcInN3LmpzXCIpLFxuICAgICAgICApLFxuICAgICAgKS50b0JlKHRydWUpO1xuICAgICAgY29uc3Qgc3RhdGljU3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGV4aXN0c1N5bmMoam9pbihzdGF0aWNTdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVuay5qc1wiKSksXG4gICAgICApLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGV4aXN0c1N5bmMoam9pbihzdGF0aWNTdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJzZXJ2aWNlLXdvcmtlclwiKSksXG4gICAgICApLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzdGFnZXMgYSBzeW1saW5rZWQgLm5leHQvc3RhdGljXCIsICgpID0+IHtcbiAgICAgIGtlZXBTdGFnaW5nKCk7XG4gICAgICBjb25zdCByZWFsU3RhdGljID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJyZWFsLXN0YXRpY1wiKTtcbiAgICAgIHJlbmFtZVN5bmMoam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiKSwgcmVhbFN0YXRpYyk7XG4gICAgICBzeW1saW5rU3luYyhyZWFsU3RhdGljLCBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIsIFwic3RhdGljXCIpKTtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSk7XG5cbiAgICAgIGNvbnN0IHN0YWdlZCA9IHN0YWdlZERpcihzdGF0aWNBc3NldHMuc3RhdGljRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVuay5qc1wiKSkpLnRvQmUoXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gQ0RLIHVwbG9hZHMgdGhlIGZpbGVzIGEgbGlua2VkIGRpcmVjdG9yeSBob2xkcywgc28gdGhleSBzaGFkb3cgdG9vLlxuICAgIGl0KFwidHJlYXRzIGZpbGVzIHVuZGVyIGEgc3ltbGlua2VkIC5uZXh0L3N0YXRpYyBkaXJlY3RvcnkgYXMgc2hhZG93aW5nXCIsICgpID0+IHtcbiAgICAgIGtlZXBTdGFnaW5nKCk7XG4gICAgICBjb25zdCByZWFsQ2h1bmtzID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJyZWFsLWNodW5rc1wiKTtcbiAgICAgIG1rZGlyU3luYyhyZWFsQ2h1bmtzKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihyZWFsQ2h1bmtzLCBcImEuanNcIiksIFwiLy8gYnVpbHRcIik7XG4gICAgICBzeW1saW5rU3luYyhcbiAgICAgICAgcmVhbENodW5rcyxcbiAgICAgICAgam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiLCBcImNodW5rc1wiKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBzaGFkb3dEaXIgPSBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiLCBcIl9uZXh0XCIsIFwic3RhdGljXCIpO1xuICAgICAgbWtkaXJTeW5jKGpvaW4oc2hhZG93RGlyLCBcImNodW5rc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oc2hhZG93RGlyLCBcImNodW5rc1wiLCBcImEuanNcIiksIFwiLy8gc2hhZG93ZWRcIik7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwibG9nby5wbmdcIiksIFwicG5nXCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3Qgc3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVua3NcIiwgXCJhLmpzXCIpKSxcbiAgICAgICkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBDREsgdXBsb2FkcyBhIGRpcmVjdG9yeSB1bmRlciBldmVyeSBuYW1lIGEgbGluayBnaXZlcyBpdC5cbiAgICBpdChcInRyZWF0cyBmaWxlcyByZWFjaGVkIHRocm91Z2ggYSBzZWNvbmQgbmFtZSBhcyBzaGFkb3dpbmdcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIGNvbnN0IGJ1aWx0U3RhdGljID0gam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiKTtcbiAgICAgIG1rZGlyU3luYyhqb2luKGJ1aWx0U3RhdGljLCBcImNodW5rc1wiKSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oYnVpbHRTdGF0aWMsIFwiY2h1bmtzXCIsIFwiYS5qc1wiKSwgXCIvLyBidWlsdFwiKTtcbiAgICAgIHN5bWxpbmtTeW5jKGpvaW4oYnVpbHRTdGF0aWMsIFwiY2h1bmtzXCIpLCBqb2luKGJ1aWx0U3RhdGljLCBcImFsaWFzXCIpKTtcbiAgICAgIGNvbnN0IHNoYWRvd0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwiX25leHRcIiwgXCJzdGF0aWNcIik7XG4gICAgICBta2RpclN5bmMoam9pbihzaGFkb3dEaXIsIFwiYWxpYXNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKHNoYWRvd0RpciwgXCJhbGlhc1wiLCBcImEuanNcIiksIFwiLy8gc2hhZG93ZWRcIik7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwibG9nby5wbmdcIiksIFwicG5nXCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3Qgc3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoZXhpc3RzU3luYyhqb2luKHN0YWdlZCwgXCJfbmV4dFwiLCBcInN0YXRpY1wiLCBcImFsaWFzXCIsIFwiYS5qc1wiKSkpLnRvQmUoXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwibGVhdmVzIG91dCBhIHNoYWRvd2VkIGZpbGUgdW5kZXIgYSBzeW1saW5rZWQgcHVibGljLyBkaXJlY3RvcnlcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIGNvbnN0IGxpbmtlZCA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwibGlua2VkLXN0YXRpY1wiKTtcbiAgICAgIG1rZGlyU3luYyhsaW5rZWQpO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKGxpbmtlZCwgXCJjaHVuay5qc1wiKSwgXCIvLyBzaGFkb3dlZFwiKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihsaW5rZWQsIFwibGVnYWN5LmpzXCIpLCBcIi8vIHB1YmxpYyBvbmx5XCIpO1xuICAgICAgbWtkaXJTeW5jKGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwiX25leHRcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgc3ltbGlua1N5bmMobGlua2VkLCBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiLCBcIl9uZXh0XCIsIFwic3RhdGljXCIpKTtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSk7XG5cbiAgICAgIGNvbnN0IHN0YWdlZCA9IHN0YWdlZERpcihzdGF0aWNBc3NldHMucHVibGljRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVuay5qc1wiKSkpLnRvQmUoXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChleGlzdHNTeW5jKGpvaW4oc3RhZ2VkLCBcIl9uZXh0XCIsIFwic3RhdGljXCIsIFwibGVnYWN5LmpzXCIpKSkudG9CZShcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcImxpc3RzIGEgLm5leHQvc3RhdGljIGhvbGRpbmcgYSBsaW5rIGxvb3BcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbHRTdGF0aWMgPSBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIsIFwic3RhdGljXCIpO1xuICAgICAgc3ltbGlua1N5bmMoam9pbihidWlsdFN0YXRpYywgXCJsb29wXCIpLCBqb2luKGJ1aWx0U3RhdGljLCBcImxvb3BcIikpO1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG5cbiAgICAgIGV4cGVjdCgoKSA9PiBjcmVhdGVTdGF0aWNBc3NldHMoe30pKS5ub3QudG9UaHJvdygvRUxPT1AvKTtcbiAgICB9KTtcblxuICAgIC8vIENoZWNrcyB0aGUgZGlyZWN0b3JpZXMgdGhpcyBjb25zdHJ1Y3Qgc3RhZ2VkLCBub3QgYSBiZWZvcmUvYWZ0ZXIgbGlzdGluZ1xuICAgIC8vIG9mIGBvcy50bXBkaXIoKWA6IGplc3QgcnVucyBvdGhlciBmaWxlcyBpbiBwYXJhbGxlbCB3b3JrZXJzLCBhbmQgYW55IG9mXG4gICAgLy8gdGhlbSB0aGF0IGJ1aWxkcyBhIGBOZXh0anNTdGF0aWNBc3NldHNgIChgdGVzdC9yb290LWNvbnN0cnVjdHMudGVzdC50c2AsXG4gICAgLy8gZm9yIG9uZSkgc3RhZ2VzIGBuZXh0anMtYXNzZXRzLSpgIGRpcmVjdG9yaWVzIGludG8gdGhlIHNhbWUgdGVtcFxuICAgIC8vIGRpcmVjdG9yeSB3aGlsZSB0aGlzIHJ1bnMsIHdoaWNoIHRoZSBsaXN0aW5nIGNvdW50ZWQgYXMgbGVha2VkLlxuICAgIGl0KFwicmVtb3ZlcyB0aGUgc3RhZ2luZyBkaXJlY3RvcmllcyB3aGVuIGEgZGVwbG95bWVudCBmYWlsc1wiLCAoKSA9PiB7XG4gICAgICB3cml0ZVB1YmxpY0ZpbGUoKTtcbiAgICAgIGNvbnN0IHByb3RvID0gTmV4dGpzU3RhdGljQXNzZXRzLnByb3RvdHlwZSBhcyBhbnk7XG4gICAgICBjb25zdCBzdGFnZURpcmVjdG9yeSA9IHByb3RvLnN0YWdlRGlyZWN0b3J5O1xuICAgICAgY29uc3Qgc3RhZ2VkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgamVzdC5zcHlPbihwcm90bywgXCJzdGFnZURpcmVjdG9yeVwiKS5tb2NrSW1wbGVtZW50YXRpb24oZnVuY3Rpb24gKFxuICAgICAgICB0aGlzOiB1bmtub3duLFxuICAgICAgICAuLi5hcmdzOiB1bmtub3duW11cbiAgICAgICkge1xuICAgICAgICBjb25zdCBkaXIgPSBzdGFnZURpcmVjdG9yeS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgaWYgKGRpcikgc3RhZ2VkLnB1c2goZGlyKTtcbiAgICAgICAgcmV0dXJuIGRpcjtcbiAgICAgIH0pO1xuICAgICAgamVzdC5zcHlPbihwcm90bywgXCJjcmVhdGVEZXBsb3ltZW50XCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImRlcGxveW1lbnQgZmFpbGVkXCIpO1xuICAgICAgfSk7XG4gICAgICB0cnkge1xuICAgICAgICBleHBlY3QoKCkgPT4gY3JlYXRlU3RhdGljQXNzZXRzKHt9KSkudG9UaHJvdyhcImRlcGxveW1lbnQgZmFpbGVkXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgamVzdC5yZXN0b3JlQWxsTW9ja3MoKTtcbiAgICAgIH1cblxuICAgICAgLy8gYC5uZXh0L3N0YXRpY2AgYW5kIGBwdWJsaWNgLCBib3RoIHN0YWdlZCBiZWZvcmUgdGhlIGZpcnN0IGRlcGxveW1lbnQuXG4gICAgICBleHBlY3Qoc3RhZ2VkKS50b0hhdmVMZW5ndGgoMik7XG4gICAgICBleHBlY3Qoc3RhZ2VkLmZpbHRlcigoZGlyKSA9PiBleGlzdHNTeW5jKGRpcikpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVtb3ZlcyBpdHMgc3RhZ2luZyBkaXJlY3RvcmllcyBvbmNlIENESyBoYXMgY29waWVkIHRoZW1cIiwgKCkgPT4ge1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBmb3IgKGNvbnN0IHVwbG9hZCBvZiBbXG4gICAgICAgIHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50ISxcbiAgICAgICAgc3RhdGljQXNzZXRzLnB1YmxpY0RlcGxveW1lbnQhLFxuICAgICAgXSkge1xuICAgICAgICBleHBlY3QoZXhpc3RzU3luYyhzdGFnZWREaXIodXBsb2FkKSkpLnRvQmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVGhlIGFzc2V0IG1hbmlmZXN0IHRoZW4gcG9pbnRzIGF0IHRoZSBzdGFnaW5nIGRpcmVjdG9yeSBpdHNlbGYuXG4gICAgaXQoXCJrZWVwcyB0aGVtIHdoZW4gYXNzZXQgc3RhZ2luZyBpcyBkaXNhYmxlZFwiLCAoKSA9PiB7XG4gICAgICBrZWVwU3RhZ2luZygpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50ISkpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJmYWxscyBiYWNrIHRvIHRoZSBwdWJsaWMvIHVwbG9hZCBmb3IgYSBidWlsZCB3aXRob3V0IC5uZXh0L3N0YXRpY1wiLCAoKSA9PiB7XG4gICAgICBybVN5bmMoam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiKSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBleHBlY3Qoc3RhdGljQXNzZXRzLnN0YXRpY0RlcGxveW1lbnQpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChzdGF0aWNBc3NldHMuZGVwbG95bWVudCkudG9CZShzdGF0aWNBc3NldHMucHVibGljRGVwbG95bWVudCk7XG4gICAgICBleHBlY3QoT2JqZWN0LmtleXMoZGVwbG95bWVudHMoKSkpLnRvRXF1YWwoW1wiUHVibGljRGVwbG95bWVudFwiXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiYnVja2V0RGVwbG95bWVudFByb3BzIHRoYXQgd291bGQgYnJlYWsgdGhlIG90aGVyIHVwbG9hZHNcIiwgKCkgPT4ge1xuICAgIGZ1bmN0aW9uIHdpdGhPdmVycmlkZXMoYnVja2V0RGVwbG95bWVudFByb3BzOiBvYmplY3QpIHtcbiAgICAgIHJldHVybiAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzU3RhdGljQXNzZXRzKHN0YWNrLCBcIk5leHRqc1N0YXRpY0Fzc2V0c1wiLCB7XG4gICAgICAgICAgYnVpbGREaXJlY3RvcnksXG4gICAgICAgICAgYnVpbGRJZDogXCJ0ZXN0LWJ1aWxkLWlkXCIsXG4gICAgICAgICAgb3ZlcnJpZGVzOiB7IGJ1Y2tldERlcGxveW1lbnRQcm9wczogYnVja2V0RGVwbG95bWVudFByb3BzIGFzIGFueSB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpdChcInJlamVjdHMgcHJ1bmU6IHRydWVcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHdpdGhPdmVycmlkZXMoeyBwcnVuZTogdHJ1ZSB9KSkudG9UaHJvdygvYHBydW5lOiB0cnVlYC8pO1xuICAgIH0pO1xuXG4gICAgLy8gQ0RLJ3MgVXBkYXRlIHBhdGggZGVsZXRlcyB0aGUgb2xkIHByZWZpeCB3aXRob3V0IGNoZWNraW5nIHRoZSBidWNrZXQnc1xuICAgIC8vIG93bmVyLCByYWNpbmcgdGhlIG90aGVyIHVwbG9hZHMsIHNvIG5vIGJ1Y2tldCBpcyBzYWZlLlxuICAgIGl0KFwicmVqZWN0cyByZXRhaW5PbkRlbGV0ZTogZmFsc2VcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHdpdGhPdmVycmlkZXMoeyByZXRhaW5PbkRlbGV0ZTogZmFsc2UgfSkpLnRvVGhyb3coXG4gICAgICAgIC9gcmV0YWluT25EZWxldGU6IGZhbHNlYC8sXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHR5cGUgcmVxdWlyZXMgYm90aCwgc28gYSB0eXBlZCBjYWxsZXIgYWx3YXlzIHBhc3NlcyB0aGVtLlxuICAgIGl0KFwiaWdub3JlcyBzb3VyY2VzIGFuZCBkZXN0aW5hdGlvbkJ1Y2tldFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBvdGhlciA9IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJPdGhlclwiLCBcIm90aGVyXCIpO1xuICAgICAgbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyhzdGFjaywgXCJOZXh0anNTdGF0aWNBc3NldHNcIiwge1xuICAgICAgICBidWlsZERpcmVjdG9yeSxcbiAgICAgICAgYnVpbGRJZDogXCJ0ZXN0LWJ1aWxkLWlkXCIsXG4gICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgIGJ1Y2tldERlcGxveW1lbnRQcm9wczoge1xuICAgICAgICAgICAgc291cmNlczogW10sXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogb3RoZXIsXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IFtDYWNoZUNvbnRyb2wuZnJvbVN0cmluZyhcInB1YmxpYywgbWF4LWFnZT02MFwiKV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBbdXBsb2FkXSA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcIkN1c3RvbTo6Q0RLQnVja2V0RGVwbG95bWVudFwiKSxcbiAgICAgICk7XG4gICAgICBleHBlY3QodXBsb2FkLlByb3BlcnRpZXMuU291cmNlT2JqZWN0S2V5cykudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHVwbG9hZC5Qcm9wZXJ0aWVzLkRlc3RpbmF0aW9uQnVja2V0TmFtZSkpLnRvQ29udGFpbihcbiAgICAgICAgXCJOZXh0anNTdGF0aWNBc3NldHNCdWNrZXRcIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBBIEpTSUkgYmluZGluZyBjYW4gbWF0ZXJpYWxpemUgYW4gdW5zZXQgZmllbGQgYXMgYW4gZXhwbGljaXQgdW5kZWZpbmVkLlxuICAgIGl0KFwiYWxsb3dzIHRoZSBmaWVsZHMgd2hlbiB0aGV5IGFyZSBleHBsaWNpdGx5IHVuZGVmaW5lZFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHdpdGhPdmVycmlkZXMoeyBwcnVuZTogdW5kZWZpbmVkLCBzb3VyY2VzOiB1bmRlZmluZWQgfSksXG4gICAgICApLm5vdC50b1Rocm93KCk7XG4gICAgICAvLyBOb3QgQ0RLJ3MgZGVmYXVsdCBgcHJ1bmU6IHRydWVgLCBub3IgYSBkZXBsb3ltZW50IHdpdGggbm8gc291cmNlcy5cbiAgICAgIGNvbnN0IFt1cGxvYWRdID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFwiQ3VzdG9tOjpDREtCdWNrZXREZXBsb3ltZW50XCIpLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh1cGxvYWQuUHJvcGVydGllcy5QcnVuZSkudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QodXBsb2FkLlByb3BlcnRpZXMuU291cmNlT2JqZWN0S2V5cykudG9IYXZlTGVuZ3RoKDEpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -233,6 +233,13 @@ export declare abstract class NextjsBaseConstruct extends Construct {
|
|
|
233
233
|
* infers no ordering between these custom resources on its own.
|
|
234
234
|
*/
|
|
235
235
|
protected createNextjsPostDeploy(distribution?: IDistribution): NextjsPostDeploy;
|
|
236
|
+
/**
|
|
237
|
+
* The `Service-Worker-Allowed` value for `_next/static/service-worker/*`, or
|
|
238
|
+
* `undefined` when the build has no service worker. The app's own
|
|
239
|
+
* `basePath`, as `next build` uses, not `resolvedBasePath`: it is the URL
|
|
240
|
+
* scope the browser checks.
|
|
241
|
+
*/
|
|
242
|
+
protected get serviceWorkerAllowed(): string | undefined;
|
|
236
243
|
private createNextjsBuild;
|
|
237
244
|
private createNextjsCache;
|
|
238
245
|
private createNextjsStaticAssets;
|
|
@@ -15,7 +15,7 @@ const base_path_1 = require("../utils/base-path");
|
|
|
15
15
|
* Base class for all Next.js root constructs
|
|
16
16
|
*/
|
|
17
17
|
class NextjsBaseConstruct extends constructs_1.Construct {
|
|
18
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBaseConstruct", version: "0.7.
|
|
18
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBaseConstruct", version: "0.7.14" };
|
|
19
19
|
nextjsBuild;
|
|
20
20
|
nextjsStaticAssets;
|
|
21
21
|
nextjsCache;
|
|
@@ -222,6 +222,18 @@ class NextjsBaseConstruct extends constructs_1.Construct {
|
|
|
222
222
|
}
|
|
223
223
|
return postDeploy;
|
|
224
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* The `Service-Worker-Allowed` value for `_next/static/service-worker/*`, or
|
|
227
|
+
* `undefined` when the build has no service worker. The app's own
|
|
228
|
+
* `basePath`, as `next build` uses, not `resolvedBasePath`: it is the URL
|
|
229
|
+
* scope the browser checks.
|
|
230
|
+
*/
|
|
231
|
+
get serviceWorkerAllowed() {
|
|
232
|
+
if (!this.nextjsStaticAssets.serviceWorkerDeployment) {
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
return `/${this.nextjsBuild.nextConfigBasePath}`;
|
|
236
|
+
}
|
|
225
237
|
createNextjsBuild() {
|
|
226
238
|
return new nextjs_build_1.NextjsBuild(this, "NextjsBuild", {
|
|
227
239
|
buildCommand: this.baseProps.buildCommand,
|
|
@@ -287,4 +299,4 @@ class NextjsBaseConstruct extends constructs_1.Construct {
|
|
|
287
299
|
}
|
|
288
300
|
}
|
|
289
301
|
exports.NextjsBaseConstruct = NextjsBaseConstruct;
|
|
290
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJhc2UtY29uc3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtYmFzZS1jb25zdHJ1Y3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZDQUFvQztBQUtwQywyQ0FBdUM7QUFDdkMsNENBQXNEO0FBS3RELCtEQUEyRDtBQUMzRCxrREFBb0U7QUFFcEUseUVBSTRDO0FBQzVDLDhEQUcrQjtBQUMvQixrRUFJaUM7QUFDakMsa0RBSzRCO0FBOEg1Qjs7R0FFRztBQUNILE1BQXNCLG1CQUFvQixTQUFRLHNCQUFTOztJQUN6RCxXQUFXLENBQWM7SUFDekIsa0JBQWtCLENBQXFCO0lBQ3ZDLFdBQVcsQ0FBYztJQUlOLFVBQVUsQ0FBYTtJQUMxQyxxRUFBcUU7SUFDbEQsU0FBUyxDQUEyQjtJQUN2RCw0RUFBNEU7SUFDNUUseUVBQXlFO0lBQ3RELGtCQUFrQixDQUFnQztJQUNyRTs7Ozs7T0FLRztJQUNnQixnQkFBZ0IsQ0FBVTtJQUU3QyxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUErQixFQUMvQixVQUFzQjtRQUV0QixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM1Qyx5RUFBeUU7UUFDekUsMkVBQTJFO1FBQzNFLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBQSwyQkFBZSxFQUNyQyxVQUFVLEVBQ1YsS0FBSyxDQUFDLFFBQVEsRUFDZCxJQUFJLENBQUMsV0FBVyxD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QyxDQUFDO0lBQ0wsQ0FBQzs7QUEvVEgsa0RBZ1VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVG9rZW4gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElEaXN0cmlidXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnRcIjtcbmltcG9ydCB7IElUYWJsZVYyIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1keW5hbW9kYlwiO1xuaW1wb3J0IHsgSVZwYyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyBJQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IExPR19QUkVGSVgsIE5leHRqc1R5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPcHRpb25hbE5leHRqc0J1aWxkUHJvcHMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNCdWlsZFByb3BzXCI7XG5pbXBvcnQgeyBPcHRpb25hbE5leHRqc0NhY2hlUHJvcHMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNDYWNoZVByb3BzXCI7XG5pbXBvcnQgeyBPcHRpb25hbE5leHRqc1Bvc3REZXBsb3lQcm9wcyB9IGZyb20gXCIuLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc1Bvc3REZXBsb3lQcm9wc1wiO1xuaW1wb3J0IHsgTmV4dGpzQXBpT3ZlcnJpZGVzIH0gZnJvbSBcIi4uL25leHRqcy1hcGlcIjtcbmltcG9ydCB7IE5leHRqc0J1aWxkIH0gZnJvbSBcIi4uL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGRcIjtcbmltcG9ydCB7IE5leHRqc0NhY2hlLCBOZXh0anNDYWNoZU92ZXJyaWRlcyB9IGZyb20gXCIuLi9uZXh0anMtY2FjaGVcIjtcbmltcG9ydCB7IE5leHRqc0NvbXB1dGVCYXNlUHJvcHMgfSBmcm9tIFwiLi4vbmV4dGpzLWNvbXB1dGUvbmV4dGpzLWNvbXB1dGUtYmFzZS1wcm9wc1wiO1xuaW1wb3J0IHtcbiAgTmV4dGpzRnVuY3Rpb25Hcm91cCxcbiAgTmV4dGpzRnVuY3Rpb25zLFxuICBOZXh0anNGdW5jdGlvbnNPdmVycmlkZXMsXG59IGZyb20gXCIuLi9uZXh0anMtY29tcHV0ZS9uZXh0anMtZnVuY3Rpb25zXCI7XG5pbXBvcnQge1xuICBOZXh0anNQb3N0RGVwbG95LFxuICBOZXh0anNQb3N0RGVwbG95T3ZlcnJpZGVzLFxufSBmcm9tIFwiLi4vbmV4dGpzLXBvc3QtZGVwbG95XCI7XG5pbXBvcnQge1xuICBOZXh0anNTdGF0aWNBc3NldHMsXG4gIE5leHRqc1N0YXRpY0Fzc2V0c092ZXJyaWRlcyxcbiAgTmV4dGpzU3RhdGljQXNzZXRzUHJvcHMsXG59IGZyb20gXCIuLi9uZXh0anMtc3RhdGljLWFzc2V0c1wiO1xuaW1wb3J0IHtcbiAgQXBpR2F0ZXdheVByZWZpeCxcbiAgaXNBc3NldFByZWZpeFVuc2VydmVkLFxuICBwcmVmaXhXaXRoQmFzZVBhdGgsXG4gIHJlc29sdmVCYXNlUGF0aCxcbn0gZnJvbSBcIi4uL3V0aWxzL2Jhc2UtcGF0aFwiO1xuXG4vKipcbiAqIEJhc2Ugb3ZlcnJpZGVzIGZvciB0aGUgcHJvcHMgcGFzc2VkIHRvIGNvbnN0cnVjdHMgd2l0aGluIHJvb3QvdG9wLWxldmVsIE5leHQuanMgY29uc3RydWN0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Jhc2VDb25zdHJ1Y3RPdmVycmlkZXMge1xuICByZWFkb25seSBuZXh0anNCdWlsZFByb3BzPzogT3B0aW9uYWxOZXh0anNCdWlsZFByb3BzO1xuICByZWFkb25seSBuZXh0anNDYWNoZVByb3BzPzogT3B0aW9uYWxOZXh0anNDYWNoZVByb3BzO1xuICByZWFkb25seSBuZXh0anNQb3N0RGVwbG95UHJvcHM/OiBPcHRpb25hbE5leHRqc1Bvc3REZXBsb3lQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzU3RhdGljQXNzZXRzUHJvcHM/OiBOZXh0anNTdGF0aWNBc3NldHNQcm9wcztcbn1cblxuLyoqXG4gKiBCYXNlIG92ZXJyaWRlcyBmb3IgY29uc3RydWN0cyBzaGFyZWQgYmV0d2VlbiBhbGwgcm9vdC90b3AtbGV2ZWwgTmV4dC5qcyBjb25zdHJ1Y3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Jhc2VPdmVycmlkZXMge1xuICByZWFkb25seSBuZXh0anNDYWNoZT86IE5leHRqc0NhY2hlT3ZlcnJpZGVzO1xuICByZWFkb25seSBuZXh0anNQb3N0RGVwbG95PzogTmV4dGpzUG9zdERlcGxveU92ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzU3RhdGljQXNzZXRzPzogTmV4dGpzU3RhdGljQXNzZXRzT3ZlcnJpZGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Jhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBQcmVmaXggdG8gdGhlIFVSSSBwYXRoIHRoZSBhcHAgd2lsbCBiZSBzZXJ2ZWQgYXQuIEFsc28gbmFtZXNwYWNlcyB0aGVcbiAgICogc3RhdGljIGFzc2V0cyBpbiBTMywgc28gaXQgZG91YmxlcyBhcyBhIHdheSB0byBob3N0IG11bHRpcGxlIGFwcHMgb3JcbiAgICogYnJhbmNoZXMgb3V0IG9mIG9uZSBidWNrZXQuXG4gICAqXG4gICAqIEhvdyB0aGlzIHJlbGF0ZXMgdG8gdGhlIGBiYXNlUGF0aGAgaW4geW91ciBhcHAncyBgbmV4dC5jb25maWcuanNgIGRlcGVuZHNcbiAgICogb24gdGhlIGNvbnN0cnVjdCwgYW5kIHN5bnRoIGZhaWxzIG9uIGEgY29tYmluYXRpb24gdGhhdCBjYW4ndCBzZXJ2ZSB0aGVcbiAgICogYXBwOlxuICAgKlxuICAgKiAtIGBOZXh0anNHbG9iYWxGdW5jdGlvbnNgL2BOZXh0anNHbG9iYWxDb250YWluZXJzYDogbGVhdmUgdGhpcyB1bnNldCBhbmQgaXRcbiAgICogICBmb2xsb3dzIHlvdXIgYXBwJ3MgYGJhc2VQYXRoYCwgd2hpY2ggaXMgd2hhdCB5b3Ugd2FudCDigJQgQ2xvdWRGcm9udCBzZXJ2ZXNcbiAgICogICBzdGF0aWMgYXNzZXRzIGZyb20gUzMgdXNpbmcgdGhlIHJlcXVlc3QgcGF0aCBhcyB0aGUgb2JqZWN0IGtleSwgc28gdGhlIHR3b1xuICAgKiAgIGhhdmUgdG8gYmUgaWRlbnRpY2FsIGFuZCBhIG1pc21hdGNoIDQwNHMgYWxsIG9mIHRoZW0uIFNldHRpbmcgYSBkaWZmZXJlbnRcbiAgICogICB2YWx1ZSB0aHJvd3MuXG4gICAqIC0gYE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zYDogbGVhdmUgdGhpcyB1bnNldCBhbmQgaXQgZm9sbG93cyB5b3VyIGFwcCdzXG4gICAqICAgYGJhc2VQYXRoYCBtaW51cyB0aGUgcHJlZml4IEFQSSBHYXRld2F5IHN0cmlwcyBiZWZvcmUgbWF0Y2hpbmcgcmVzb3VyY2VzIOKAlFxuICAgKiAgIHRoZSBzdGFnZSAoYGRlcGxveU9wdGlvbnMuc3RhZ2VOYW1lYCwgZGVmYXVsdCBgcHJvZGApLCBvciB0aGUgYmFzZSBwYXRoXG4gICAqICAgbWFwcGluZyBvZiBhIGN1c3RvbSBkb21haW4gc2V0IGluIGByZXN0QXBpUHJvcHMuZG9tYWluTmFtZWAuIFNvXG4gICAqICAgYGJhc2VQYXRoOiBcIi9wcm9kXCJgIG1vdW50cyBhdCB0aGUgcm9vdCwgYFwiL3Byb2QvYmFzZVwiYCB1bmRlciBgYmFzZWAsIGFuZFxuICAgKiAgIGBcIi9kb2NzXCJgIGJlaGluZCBhIGN1c3RvbSBkb21haW4gbWFwcGVkIGF0IHRoZSByb290IHVuZGVyIGBkb2NzYC4gT24gdGhlXG4gICAqICAgZXhlY3V0ZS1hcGkgZW5kcG9pbnQgYW4gYXBwIGBiYXNlUGF0aGAgdGhhdCBkb2Vzbid0IHN0YXJ0IHdpdGggdGhlIHN0YWdlXG4gICAqICAgd2FybnMsIHNpbmNlIGl0cyBsaW5rcyB3aWxsIG1pc3MgdGhlIHN0YWdlLiBJZiB5b3Ugc2V0IHRoaXMsIHRoZSBhcHAnc1xuICAgKiAgIGBiYXNlUGF0aGAgbXVzdCBlbmQgd2l0aCBpdC4gQSBkb21haW4gYXR0YWNoZWQgbGF0ZXIgd2l0aFxuICAgKiAgIGBhZGREb21haW5OYW1lKClgIGlzIG5vdCBzZWVuIGF0IHN5bnRoOyBzZXQgdGhpcyBleHBsaWNpdGx5IHRoZW4g4oCUIHRvXG4gICAqICAgYFwiL1wiYCB3aGVuIHRoYXQgZG9tYWluJ3MgYmFzZSBwYXRoIG1hcHBpbmcgc3RyaXBzIHlvdXIgYXBwJ3Mgd2hvbGVcbiAgICogICBgYmFzZVBhdGhgLCB3aGljaCBtb3VudHMgZXZlcnkgcmVzb3VyY2UgYXQgdGhlIHJvb3QuXG4gICAqIC0gYE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc2A6IG9ubHkgbmFtZXNwYWNlcyB0aGUgUzMgYnVja2V0LiBUaGUgQUxCIHNlbmRzXG4gICAqICAgZXZlcnkgcGF0aCB0byB0aGUgY29udGFpbmVyLCB3aGljaCBzZXJ2ZXMgaXRzIG93biBzdGF0aWMgYXNzZXRzLCBzbyB0aGlzXG4gICAqICAgaXMgdW5jb25zdHJhaW5lZC5cbiAgICogQGV4YW1wbGUgXCIvbXktYmFzZS1wYXRoXCJcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogQ29tbWFuZCB0byBnZW5lcmF0ZSBvcHRpbWl6ZWQgdmVyc2lvbiBvZiB5b3VyIE5leHQuanMgYXBwIGluIGNvbnRhaW5lcjtcbiAgICogQGRlZmF1bHQgXCJucG0gcnVuIGJ1aWxkXCJcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29tbWFuZD86IHN0cmluZztcbiAgLyoqXG4gICAqIERpcmVjdG9yeSB3aGVyZSB0aGUgTmV4dC5qcyBhcHBsaWNhdGlvbiBpcyBsb2NhdGVkIGZvciBsb2NhbCBidWlsZHMuXG4gICAqIFRoaXMgc2hvdWxkIGNvbnRhaW4gdGhlIHBhY2thZ2UuanNvbiBhbmQgTmV4dC5qcyBhcHBsaWNhdGlvbiBmaWxlcy5cbiAgICogVGhpcyBpcyB3aGVyZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzLmJ1aWxkQ29tbWFuZH0gaXMgcnVuLlxuICAgKiBAZXhhbXBsZSBqb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCJ3ZWJcIikgb3IgXCIvcGF0aC90by9uZXh0anMvYXBwXCJcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkRGlyZWN0b3J5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBTMyBidWNrZXQgZm9yIGNhY2hlIHN0b3JhZ2UuIFdoZW4gcHJvdmlkZWQsIGNkay1uZXh0anNcbiAgICogd2lsbCB1c2UgdGhpcyBidWNrZXQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuXG4gICAqXG4gICAqIFRoZSBidWNrZXQgbXVzdCBiZSBkZWRpY2F0ZWQgdG8gdGhpcyBvbmUgZGVwbG95bWVudC4gRG9uJ3Qgc2hhcmUgaXQgd2l0aFxuICAgKiBhbm90aGVyIGRlcGxveW1lbnQgKGFub3RoZXIgYnJhbmNoLCBzdGFnZSwgb3IgYXBwKTogZXZlcnkgZGVwbG95J3NcbiAgICogcG9zdC1kZXBsb3kgc3RlcCBkZWxldGVzIGV2ZXJ5IG9iamVjdCB1bmRlciBhIHRvcC1sZXZlbCBwcmVmaXggb3RoZXIgdGhhblxuICAgKiB0aGUgY3VycmVudCBgYnVpbGRJZC9gLCB3aGljaCBpbmNsdWRlcyBldmVyeSBvdGhlciBkZXBsb3ltZW50J3MgY2FjaGUuXG4gICAqL1xuICByZWFkb25seSBjYWNoZUJ1Y2tldD86IElCdWNrZXQ7XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBEeW5hbW9EQiB0YWJsZSBmb3IgcmV2YWxpZGF0aW9uIG1ldGFkYXRhLiBXaGVuIHByb3ZpZGVkLFxuICAgKiBjZGstbmV4dGpzIHdpbGwgdXNlIHRoaXMgdGFibGUgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuIFRoZSB0YWJsZVxuICAgKiBtdXN0IGhhdmUgYHBrYCAoU3RyaW5nKSBhcyBwYXJ0aXRpb24ga2V5IGFuZCBgc2tgIChTdHJpbmcpIGFzIHNvcnQga2V5LlxuICAgKiBFbmFibGUgVFRMIG9uIGl0cyBgdHRsYCBhdHRyaWJ1dGUgdG9vOiBlYWNoIHRhZyByZXZhbGlkYXRpb24gd3JpdGVzIGFcbiAgICogcmV2YWxpZGF0aW9uIGxvZyByb3cgdGhhdCBleHBpcmVzIHRocm91Z2ggaXQsIGFuZCB3aXRob3V0IFRUTCB0aG9zZSByb3dzXG4gICAqIGFjY3VtdWxhdGUuXG4gICAqXG4gICAqIFRoZSB0YWJsZSBtdXN0IGJlIGRlZGljYXRlZCB0byB0aGlzIG9uZSBkZXBsb3ltZW50LiBEb24ndCBzaGFyZSBpdCB3aXRoXG4gICAqIGFub3RoZXIgZGVwbG95bWVudCAoYW5vdGhlciBicmFuY2gsIHN0YWdlLCBvciBhcHApOiBldmVyeSBkZXBsb3knc1xuICAgKiBwb3N0LWRlcGxveSBzdGVwIGRlbGV0ZXMgdGhlIGVudHJpZXMgb2YgdGhlIGJ1aWxkIGl0IGxhc3QgcmVjb3JkZWQgaW4gdGhlXG4gICAqIHRhYmxlLCB3aGljaCB3aXRoIGEgc2hhcmVkIHRhYmxlIGlzIGFub3RoZXIgZGVwbG95bWVudCdzIGxpdmUgYnVpbGQuXG4gICAqL1xuICByZWFkb25seSByZXZhbGlkYXRpb25UYWJsZT86IElUYWJsZVYyO1xuICAvKipcbiAgICogU2tpcHMgcnVubmluZyBgbmV4dCBidWlsZGAuIElmIGB0cnVlYCwgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgcnVubmluZ1xuICAgKiBgbmV4dCBidWlsZGAgYmVmb3JlIHRoaXMgY29uc3RydWN0IGlzIHN5bnRoZXNpemVkLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcEJ1aWxkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEJyaW5nIHlvdXIgb3duIFMzIGJ1Y2tldCBmb3Igc3RhdGljIGFzc2V0cy4gV2hlbiBwcm92aWRlZCwgY2RrLW5leHRqc1xuICAgKiB3aWxsIGRlcGxveSBzdGF0aWMgYXNzZXRzIHRvIHRoaXMgYnVja2V0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgKlxuICAgKiBVbmxpa2UgYGNhY2hlQnVja2V0YCwgdGhpcyBvbmUgY2FuIGJlIHNoYXJlZCwgYnV0IG9ubHkgYmV0d2VlbiBkZXBsb3ltZW50c1xuICAgKiB3aXRoIGRpZmZlcmVudCBgYmFzZVBhdGhgcyAoc28gZGlmZmVyZW50IFMzIGtleSBwcmVmaXhlcykuIFBydW5pbmcgb25seVxuICAgKiB0b3VjaGVzIGA8YmFzZVBhdGg+L19uZXh0L2AsIHNvIGl0IGxlYXZlcyB0aGUgb3RoZXJzJyBhc3NldHMgYWxvbmUuIFR3b1xuICAgKiBkZXBsb3ltZW50cyB1bmRlciB0aGUgc2FtZSBwcmVmaXggb3ZlcndyaXRlIGVhY2ggb3RoZXIncyBgcHVibGljL2AgZmlsZXNcbiAgICogYW5kIHBydW5lIGVhY2ggb3RoZXIncyBgX25leHQvYCBhc3NldHMgb25jZSB0aGV5IGFyZSBwYXN0IHRoZSBwcnVuZVxuICAgKiBUVEwgKDMwIGRheXMgYnkgZGVmYXVsdCkuXG4gICAqL1xuICByZWFkb25seSBzdGF0aWNBc3NldHNCdWNrZXQ/OiBJQnVja2V0O1xuICAvKipcbiAgICogQnJpbmcgeW91ciBvd24gVlBDLlxuICAgKiBJZiBwcm92aWRlZCwgd2lsbCBiZSBwYXNzZWQgdmlhIG92ZXJyaWRlcyB0byB0aGUgRUNTIENsdXN0ZXIgKGZvciBjb250YWluZXItYmFzZWQgY29uc3RydWN0cylcbiAgICogb3IgdG8gdGhlIExhbWJkYSBmdW5jdGlvbiAoZm9yIGZ1bmN0aW9uLWJhc2VkIGNvbnN0cnVjdHMpLlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIEVDUyBDbHVzdGVyIHdpbGwgY3JlYXRlIGEgVlBDIGF1dG9tYXRpY2FsbHkgZm9yIGNvbnRhaW5lcnMsXG4gICAqIGFuZCBMYW1iZGEgZnVuY3Rpb25zIHdpbGwgcnVuIG91dHNpZGUgYSBWUEMuXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBJVnBjO1xufVxuXG4vKipcbiAqIFJlcXVpcmVkIGJlY2F1c2UgaWYgd2UgYWRkIGBvdmVycmlkZXNgIG9udG8gYE5leHRqc0Jhc2VQcm9wc2Agd2UgZ2V0IGpzaWlcbiAqIGVycm9yOiBgSW50ZXJmYWNlIC4uLiByZS1kZWNsYXJlcyBtZW1iZXIgXCJvdmVycmlkZXNcImBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh0anNCYXNlQ29uc3RydWN0UHJvcHMgZXh0ZW5kcyBOZXh0anNCYXNlUHJvcHMge1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNCYXNlT3ZlcnJpZGVzO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCBOZXh0LmpzIHJvb3QgY29uc3RydWN0c1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmV4dGpzQmFzZUNvbnN0cnVjdCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIG5leHRqc0J1aWxkOiBOZXh0anNCdWlsZDtcbiAgbmV4dGpzU3RhdGljQXNzZXRzOiBOZXh0anNTdGF0aWNBc3NldHM7XG4gIG5leHRqc0NhY2hlOiBOZXh0anNDYWNoZTtcblxuICBhYnN0cmFjdCBnZXQgdXJsKCk6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmV4dGpzVHlwZTogTmV4dGpzVHlwZTtcbiAgLy8gdXNlIGJhc2VQcm9wcyBpbnN0ZWFkIG9mIHByb3BzIHNvIHRoYXQgY2hpbGQgY2xhc3NlcyBjYW4gdXNlIHByb3BzXG4gIHByb3RlY3RlZCByZWFkb25seSBiYXNlUHJvcHM6IE5leHRqc0Jhc2VDb25zdHJ1Y3RQcm9wcztcbiAgLy8gV2lkZXN0IHNoYXBlIG9mIHRoZSBwZXItYE5leHRqc1R5cGVgIG92ZXJyaWRlcy4gVGhlIHB1YmxpYyBpbnRlcmZhY2UgZWFjaFxuICAvLyByb290IGNvbnN0cnVjdCBhY2NlcHRzIGlzIHdoYXQgYWN0dWFsbHkgZ2F0ZXMgd2hpY2gga2V5cyBhcmUgc2V0dGFibGUuXG4gIHByb3RlY3RlZCByZWFkb25seSBjb25zdHJ1Y3RPdmVycmlkZXM/OiBOZXh0anNCYXNlQ29uc3RydWN0T3ZlcnJpZGVzO1xuICAvKipcbiAgICogVGhlIGBiYXNlUGF0aGAgZXZlcnl0aGluZyBkb3duc3RyZWFtIGlzIGJ1aWx0IGZyb206IHRoZSBgYmFzZVBhdGhgIHByb3Agd2hlblxuICAgKiBzZXQsIG90aGVyd2lzZSB0aGUgYXBwJ3Mgb3duIGBiYXNlUGF0aGAgZm9yIHRoZSBgTmV4dGpzVHlwZWBzIHdoZXJlIHRoZSB0d29cbiAgICogYXJlIG5lY2Vzc2FyaWx5IHRoZSBzYW1lLiBOb3JtYWxpemVkIHRvIGEgYmFyZSBwYXRoIHNlZ21lbnQsIGB1bmRlZmluZWRgIGZvclxuICAgKiBubyBgYmFzZVBhdGhgLiBVc2UgdGhpcyBpbnN0ZWFkIG9mIGBiYXNlUHJvcHMuYmFzZVBhdGhgLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc29sdmVkQmFzZVBhdGg/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBOZXh0anNCYXNlQ29uc3RydWN0UHJvcHMsXG4gICAgbmV4dGpzVHlwZTogTmV4dGpzVHlwZSxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLmJhc2VQcm9wcyA9IHByb3BzO1xuICAgIHRoaXMubmV4dGpzVHlwZSA9IG5leHRqc1R5cGU7XG4gICAgdGhpcy5jb25zdHJ1Y3RPdmVycmlkZXMgPSB0aGlzLmdldENvbnN0cnVjdE92ZXJyaWRlcyhuZXh0anNUeXBlKTtcblxuICAgIHRoaXMubmV4dGpzQnVpbGQgPSB0aGlzLmNyZWF0ZU5leHRqc0J1aWxkKCk7XG4gICAgLy8gQSBiYXNlUGF0aCB0aGF0IGRvZXNuJ3QgbGluZSB1cCB3aXRoIHRoZSBhcHAncyBvd24gZGVwbG95cyBjbGVhbmx5IGFuZFxuICAgIC8vIHRoZW4gNDA0cyBzdGF0aWMgYXNzZXRzLCBzbyByZWNvbmNpbGUgdGhlIHR3byB1cCBmcm9udCBhbmQgZmFpbCBhdCBzeW50aFxuICAgIC8vIG9uIGEgY29tYmluYXRpb24gdGhhdCBjYW4ndCB3b3JrLlxuICAgIHRoaXMucmVzb2x2ZWRCYXNlUGF0aCA9IHJlc29sdmVCYXNlUGF0aChcbiAgICAgIG5leHRqc1R5cGUsXG4gICAgICBwcm9wcy5iYXNlUGF0aCxcbiAgICAgIHRoaXMubmV4dGpzQnVpbGQubmV4dENvbmZpZ0Jhc2VQYXRoLFxuICAgICAgdGhpcy5hcGlHYXRld2F5UHJlZml4KCksXG4gICAgKTtcbiAgICB0aGlzLm5leHRqc0NhY2hlID0gdGhpcy5jcmVhdGVOZXh0anNDYWNoZSgpO1xuICAgIHRoaXMubmV4dGpzU3RhdGljQXNzZXRzID0gdGhpcy5jcmVhdGVOZXh0anNTdGF0aWNBc3NldHMoKTtcbiAgICB0aGlzLnZhbGlkYXRlU3RhdGljQXNzZXRzS2V5UHJlZml4KCk7XG4gICAgdGhpcy53YXJuVW5zZXJ2ZWRBc3NldFByZWZpeCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhcm5zIHdoZW4gYSBwYXRoLXN0eWxlIGBhc3NldFByZWZpeGAgd291bGQgNDA0IGV2ZXJ5IGJ1bmRsZSBvbiB0aGlzXG4gICAqIGBOZXh0anNUeXBlYCDigJQgc2VlIHtAbGluayBpc0Fzc2V0UHJlZml4VW5zZXJ2ZWR9IGZvciB3aGljaCBjb21iaW5hdGlvbnMgdGhvc2VcbiAgICogYXJlIGFuZCB3aHkgYSBwcmVmaXggZXF1YWwgdG8gdGhlIGFwcCdzIGBiYXNlUGF0aGAgaXMgbm90IG9uZSBvZiB0aGVtLlxuICAgKlxuICAgKiBXYXJuIHJhdGhlciB0aGFuIHRocm93OiBpdCBpcyB0aGUgYXBwJ3MgY29uZmlnLCB0aGUgZGVwbG95bWVudCBvdGhlcndpc2VcbiAgICogd29ya3MsIGFuZCBhbiBhYnNvbHV0ZSBgYXNzZXRQcmVmaXhgIChhbHJlYWR5IHJlZHVjZWQgdG8gYFwiXCJgIGJ5XG4gICAqIGByZWxhdGl2ZUFzc2V0UHJlZml4YCkgaXMgdGhlIHN1cHBvcnRlZCB3YXkgdG8gc2VydmUgYXNzZXRzIGZyb21cbiAgICogZWxzZXdoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSB3YXJuVW5zZXJ2ZWRBc3NldFByZWZpeCgpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhaXNBc3NldFByZWZpeFVuc2VydmVkKFxuICAgICAgICB0aGlzLm5leHRqc1R5cGUsXG4gICAgICAgIHRoaXMubmV4dGpzQnVpbGQubmV4dENvbmZpZ0Fzc2V0UHJlZml4LFxuICAgICAgICB0aGlzLm5leHRqc0J1aWxkLm5leHRDb25maWdCYXNlUGF0aCxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYCR7TE9HX1BSRUZJWH0geW91ciBOZXh0LmpzIGFwcCBzZXRzIFxcYGFzc2V0UHJlZml4OiBcIiR7dGhpcy5uZXh0anNCdWlsZC5uZXh0Q29uZmlnQXNzZXRQcmVmaXh9XCJcXGAsIGAgK1xuICAgICAgICBgd2hpY2ggTmV4dGpzVHlwZS4ke3RoaXMubmV4dGpzVHlwZX0gY2Fubm90IHNlcnZlOiB5b3VyIGJ1bmRsZXMgd2lsbCBiZSByZXF1ZXN0ZWQgYXQgYCArXG4gICAgICAgIGBcIiR7dGhpcy5uZXh0anNCdWlsZC5uZXh0Q29uZmlnQXNzZXRQcmVmaXh9L19uZXh0L3N0YXRpYy8uLi5cIiBhbmQgbm90aGluZyBhbnN3ZXJzIHRoZXJlLCBzbyB0aGV5IHdpbGwgNDA0LiBgICtcbiAgICAgICAgXCJEcm9wIGBhc3NldFByZWZpeGAsIHVzZSBhbiBhYnNvbHV0ZSBvbmUgcG9pbnRpbmcgYXQgYSBDRE4geW91IGZyb250IHRoZSBhc3NldHMgYnVja2V0IHdpdGgsIFwiICtcbiAgICAgICAgXCJvciBkZXBsb3kgd2l0aCBOZXh0anNHbG9iYWxGdW5jdGlvbnMvTmV4dGpzR2xvYmFsQ29udGFpbmVycy5cIixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciB0aGUgR2xvYmFsIGBOZXh0anNUeXBlYHMgdGhlIGtleSBwcmVmaXggaXNuJ3QgYSBmcmVlIGNob2ljZTogaXQgaGFzIHRvIGJlXG4gICAqIGBiYXNlUGF0aGAgKHNlZSBgcmVzb2x2ZUJhc2VQYXRoYCkuIEEgYGRlc3RpbmF0aW9uS2V5UHJlZml4YCBvdmVycmlkZSB0aGF0XG4gICAqIG1vdmVzIHRoZSBvYmplY3RzIGVsc2V3aGVyZSBoYXMgbm8gd2F5IHRvIHRlbGwgdGhlIGRpc3RyaWJ1dGlvbiBhYm91dCBpdCDigJRcbiAgICogdW5saWtlIHRoZSBmdW5jdGlvbnMnIGltYWdlIG9wdGltaXplciBhbmQgYE5leHRqc0FwaWAsIHdoaWNoIHJlYWRcbiAgICogYE5leHRqc1N0YXRpY0Fzc2V0cy5rZXlQcmVmaXhgIOKAlCBzbyBmYWlsIGF0IHN5bnRoIHJhdGhlciB0aGFuIDQwNCBldmVyeVxuICAgKiBzdGF0aWMgcmVxdWVzdC5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTdGF0aWNBc3NldHNLZXlQcmVmaXgoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5uZXh0anNUeXBlICE9PSBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlMgJiZcbiAgICAgIHRoaXMubmV4dGpzVHlwZSAhPT0gTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSU1xuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMucmVzb2x2ZWRCYXNlUGF0aCA/PyBcIlwiO1xuICAgIGNvbnN0IGFjdHVhbCA9IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmtleVByZWZpeDtcbiAgICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBzdGF0aWMgYXNzZXRzIGtleSBwcmVmaXggbWlzbWF0Y2ggZm9yIE5leHRqc1R5cGUuJHt0aGlzLm5leHRqc1R5cGV9OiBgICtcbiAgICAgICAgICBgdGhlIGFzc2V0cyBhcmUgdXBsb2FkZWQgdW5kZXIgJHthY3R1YWwgPyBgXCIke2FjdHVhbH1cImAgOiBcInRoZSBidWNrZXQgcm9vdFwifSBgICtcbiAgICAgICAgICBgYnV0IENsb3VkRnJvbnQgd2lsbCByZXF1ZXN0IHRoZW0gdW5kZXIgJHtleHBlY3RlZCA/IGBcIiR7ZXhwZWN0ZWR9XCJgIDogXCJ0aGUgYnVja2V0IHJvb3RcIn0sIGAgK1xuICAgICAgICAgIFwidXNpbmcgdGhlIHJlcXVlc3QgcGF0aCBhcyB0aGUgUzMgb2JqZWN0IGtleSwgc28gZXZlcnkgYF9uZXh0L3N0YXRpY2AgYW5kIGBwdWJsaWMvYCByZXF1ZXN0IHdvdWxkIDQwNC4gXCIgK1xuICAgICAgICAgIFwiRHJvcCB0aGUgYGRlc3RpbmF0aW9uS2V5UHJlZml4YCBvdmVycmlkZSwgb3Igc2V0IGl0IHRvIHRoZSBzYW1lIHZhbHVlIGFzIGBiYXNlUGF0aGAuIFwiICtcbiAgICAgICAgICBcIlRvIG5hbWVzcGFjZSBhIHNoYXJlZCBidWNrZXQsIHVzZSBgYmFzZVBhdGhgIOKAlCBpdCBwcmVmaXhlcyB0aGUga2V5cyBhbmQgdGhlIFVSTHMgdG9nZXRoZXIuXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IEFQSSBHYXRld2F5IHdpbGwgc3RyaXAsIHJlYWQgZnJvbSB0aGUgc2FtZSBgcmVzdEFwaVByb3BzYFxuICAgKiBvdmVycmlkZSBgTmV4dGpzQXBpYCBidWlsZHMgaXRzIGBSZXN0QXBpYCBmcm9tLiBPbmx5IG1lYW5pbmdmdWwgZm9yXG4gICAqIGBSRUdJT05BTF9GVU5DVElPTlNgLCBhbmQgcmVhZCBiZWZvcmUgYE5leHRqc0FwaWAgZXhpc3RzIGJlY2F1c2UgdGhlXG4gICAqIHJlc29sdmVkIGBiYXNlUGF0aGAgYWxzbyBkZWNpZGVzIHRoZSBzdGF0aWMgYXNzZXRzJyBTMyBrZXkgcHJlZml4LlxuICAgKlxuICAgKiBBIGRvbWFpbiBhdHRhY2hlZCBsYXRlciB3aXRoIGBhcGkuYWRkRG9tYWluTmFtZSgpYCBpcyBpbnZpc2libGUgaGVyZSwgdGhlXG4gICAqIHNhbWUgbGltaXRhdGlvbiBgTmV4dGpzQXBpLnVybGAgZG9jdW1lbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhcGlHYXRld2F5UHJlZml4KCk6IEFwaUdhdGV3YXlQcmVmaXgge1xuICAgIC8vIGBvdmVycmlkZXMubmV4dGpzQXBpYCBpcyB0aGUgb25seSB0eXBlZCB3YXkgdG8gcmVhY2ggdGhlIGBSZXN0QXBpYCdzXG4gICAgLy8gcHJvcHM6IGBuZXh0anNSZWdpb25hbEZ1bmN0aW9ucy5uZXh0anNBcGlQcm9wc2AgaXNcbiAgICAvLyBgT3B0aW9uYWxOZXh0anNBcGlQcm9wc2AsIHdoaWNoIGhhcyBubyBgb3ZlcnJpZGVzYC5cbiAgICBjb25zdCBhcGlPdmVycmlkZXMgPSAoXG4gICAgICB0aGlzLmJhc2VQcm9wcy5vdmVycmlkZXMgYXMgeyBuZXh0anNBcGk/OiBOZXh0anNBcGlPdmVycmlkZXMgfSB8IHVuZGVmaW5lZFxuICAgICk/Lm5leHRqc0FwaTtcbiAgICBjb25zdCByZXN0QXBpUHJvcHMgPSBhcGlPdmVycmlkZXM/LnJlc3RBcGlQcm9wcztcbiAgICBjb25zdCBkb21haW5OYW1lID0gcmVzdEFwaVByb3BzPy5kb21haW5OYW1lO1xuICAgIGNvbnN0IHN0cmlwcGVkUHJlZml4ID0gZG9tYWluTmFtZVxuICAgICAgPyAoZG9tYWluTmFtZS5iYXNlUGF0aCA/PyBcIlwiKVxuICAgICAgOiAocmVzdEFwaVByb3BzPy5kZXBsb3lPcHRpb25zPy5zdGFnZU5hbWUgPz8gXCJwcm9kXCIpO1xuICAgIHJldHVybiB7XG4gICAgICBzdHJpcHBlZFByZWZpeDogVG9rZW4uaXNVbnJlc29sdmVkKHN0cmlwcGVkUHJlZml4KVxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IHN0cmlwcGVkUHJlZml4LFxuICAgICAgY3VzdG9tRG9tYWluOiBkb21haW5OYW1lICE9PSB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBjb25zdHJ1Y3Qgb3ZlcnJpZGVzIChpZiBwcmVzZW50KSBvbiBwcm9wcyBmb3IgYW55IGBOZXh0anNUeXBlYFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb25zdHJ1Y3RPdmVycmlkZXMobmV4dGpzVHlwZTogTmV4dGpzVHlwZSkge1xuICAgIGNvbnN0IG5leHRqc1R5cGVUb0tleTogUmVjb3JkPE5leHRqc1R5cGUsIHN0cmluZz4gPSB7XG4gICAgICBbTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSU106IFwibmV4dGpzR2xvYmFsQ29udGFpbmVyc1wiLFxuICAgICAgW05leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OU106IFwibmV4dGpzR2xvYmFsRnVuY3Rpb25zXCIsXG4gICAgICBbTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTXTogXCJuZXh0anNSZWdpb25hbENvbnRhaW5lcnNcIixcbiAgICAgIFtOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OU106IFwibmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNcIixcbiAgICB9O1xuICAgIGNvbnN0IGtleSA9IG5leHRqc1R5cGVUb0tleVtuZXh0anNUeXBlXTtcbiAgICBjb25zdCBvdmVycmlkZXMgPSB0aGlzLmJhc2VQcm9wcy5vdmVycmlkZXMgYXNcbiAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChvdmVycmlkZXMgJiYga2V5IGluIG92ZXJyaWRlcykge1xuICAgICAgcmV0dXJuIG92ZXJyaWRlc1trZXldIGFzIE5leHRqc0Jhc2VDb25zdHJ1Y3RPdmVycmlkZXM7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBgb3ZlcnJpZGVzLm5leHRqc0Z1bmN0aW9uc2AsIHdoaWNoIG9ubHkgdGhlIHR3byBGdW5jdGlvbnMgcm9vdCBjb25zdHJ1Y3RzXG4gICAqIGRlY2xhcmUuIENhc3QgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyB7QGxpbmsgZnVuY3Rpb25Hcm91cHN9LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZnVuY3Rpb25zT3ZlcnJpZGVzKCk6IE5leHRqc0Z1bmN0aW9uc092ZXJyaWRlcyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgb3ZlcnJpZGVzID0gdGhpcy5iYXNlUHJvcHMub3ZlcnJpZGVzIGFzXG4gICAgICB7IG5leHRqc0Z1bmN0aW9ucz86IE5leHRqc0Z1bmN0aW9uc092ZXJyaWRlcyB9IHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBvdmVycmlkZXM/Lm5leHRqc0Z1bmN0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBgZnVuY3Rpb25Hcm91cHNgLCB3aGljaCBvbmx5IHRoZSB0d28gRnVuY3Rpb25zIHJvb3QgY29uc3RydWN0cyBhY2NlcHQg4oCUXG4gICAqIENvbnRhaW5lcnMgZGVwbG95IG9uZSB0YXNrIGRlZmluaXRpb24gYW5kIGhhdmUgbm8gMjUwIE1CIHBhY2thZ2UgbGltaXQgdG9cbiAgICogc3BsaXQgYXJvdW5kLlxuICAgKlxuICAgKiBSZWFkIG9mZiBgYmFzZVByb3BzYCB3aXRoIGEgY2FzdCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzXG4gICAqIHtAbGluayBnZXRDb25zdHJ1Y3RPdmVycmlkZXN9OiBgY3JlYXRlTmV4dGpzQnVpbGRgIGFuZFxuICAgKiBgY3JlYXRlTmV4dGpzRnVuY3Rpb25zYCBhcmUgc2hhcmVkIGhlcmUsIGJ1dCB0aGUgcHJvcCBpcyBkZWNsYXJlZCBvbiB0aGVcbiAgICogc3ViY2xhc3Nlcywgc28gbm90aGluZyB3ZWFrZXIgdGhhbiBhIGNhc3QgY2FuIHNlZSBpdC4gQWRkaW5nIGl0IHRvXG4gICAqIGBOZXh0anNCYXNlUHJvcHNgIHdvdWxkIG9mZmVyIGl0IHRvIENvbnRhaW5lcnMsIHdoZXJlIGl0IGRvZXMgbm90aGluZy5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgZnVuY3Rpb25Hcm91cHMoKTogTmV4dGpzRnVuY3Rpb25Hcm91cFtdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwcm9wcyA9IHRoaXMuYmFzZVByb3BzIGFzIHsgZnVuY3Rpb25Hcm91cHM/OiBOZXh0anNGdW5jdGlvbkdyb3VwW10gfTtcbiAgICByZXR1cm4gcHJvcHMuZnVuY3Rpb25Hcm91cHM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGhlYWx0aCBjaGVjayBwYXRoIGFzIHRoZSBydW5uaW5nIGFwcCBhY3R1YWxseSBzZXJ2ZXMgaXQuXG4gICAqXG4gICAqIEJvdGggY29uc3VtZXJzIG9mIHRoaXMgaGl0IHRoZSBhcHAgZGlyZWN0bHkg4oCUIHRoZSBBTEIgdGFyZ2V0IGdyb3VwIGZvcndhcmRzXG4gICAqIHRoZSBwYXRoIHRvIHRoZSBjb250YWluZXIgdW5jaGFuZ2VkLCBhbmQgdGhlIGNvbnRhaW5lcidzIGB3Z2V0YCBwcm9iZSB0YXJnZXRzXG4gICAqIHRoZSBsb2NhbCBzZXJ2ZXIg4oCUIHNvIHRoZSBwcmVmaXggdGhhdCBtYXR0ZXJzIGlzIHRoZSBhcHAncyBvd24gYGJhc2VQYXRoYCxcbiAgICogbm90IGByZXNvbHZlZEJhc2VQYXRoYCAod2hpY2ggZm9yIGBSRUdJT05BTF9DT05UQUlORVJTYCBpcyBvbmx5IGFuIFMzXG4gICAqIG5hbWVzcGFjZSkuIExlZnQgdW5wcmVmaXhlZCwgYW4gYXBwIHdpdGggYSBgYmFzZVBhdGhgIDQwNHMgZXZlcnkgaGVhbHRoXG4gICAqIGNoZWNrLCBzbyB0aGUgdGFyZ2V0IG5ldmVyIHR1cm5zIGhlYWx0aHkgYW5kIHRoZSBkZXBsb3ltZW50IHJvbGxzIGJhY2suXG4gICAqIGBoZWFsdGhDaGVja1BhdGhgIGlzIHRoZXJlZm9yZSB0aGUgcGF0aCBhcyB0aGUgYXBwIHJvdXRlcyBpdCwgd2l0aG91dFxuICAgKiBgYmFzZVBhdGhgOyBvbmUgdGhhdCBjYXJyaWVzIHRoZSBwcmVmaXggYWxyZWFkeSBnZXRzIGl0IHR3aWNlLCB3aGljaCBpcyB0aGVcbiAgICogMC42LjIgYnJlYWtpbmcgY2hhbmdlIGZvciBhbnlvbmUgd2hvIHByZWZpeGVkIGJ5IGhhbmQgdG8gd29yayBhcm91bmQgdGhpcy5cbiAgICpcbiAgICogVGFrZXMgdGhlIHBhdGggYXMgYW4gYXJndW1lbnQgcmF0aGVyIHRoYW4gcmVhZGluZyBpdCBvZmYgYGJhc2VQcm9wc2A6IG9ubHlcbiAgICogdGhlIHR3byBDb250YWluZXJzIHJvb3QgY29uc3RydWN0cyBkZWNsYXJlIGBoZWFsdGhDaGVja1BhdGhgLCBzaW5jZSB0aGV5J3JlXG4gICAqIHRoZSBvbmx5IG9uZXMgd2l0aCBzb21ldGhpbmcgdG8gaGVhbHRoLWNoZWNrLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVkSGVhbHRoQ2hlY2tQYXRoKGhlYWx0aENoZWNrUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcHJlZml4V2l0aEJhc2VQYXRoKFxuICAgICAgdGhpcy5uZXh0anNCdWlsZC5uZXh0Q29uZmlnQmFzZVBhdGgsXG4gICAgICBoZWFsdGhDaGVja1BhdGgsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29tcHV0ZSBiYXNlIHByb3BzIGZvciBib3RoIExhbWJkYSBmdW5jdGlvbnMgYW5kIGNvbnRhaW5lcnNcbiAgICovXG4gIHByb3RlY3RlZCBjb21wdXRlQmFzZVByb3BzKCk6IE5leHRqc0NvbXB1dGVCYXNlUHJvcHMge1xuICAgIHJldHVybiB7XG4gICAgICBjYWNoZUJ1Y2tldDogdGhpcy5uZXh0anNDYWNoZS5jYWNoZUJ1Y2tldCxcbiAgICAgIHJldmFsaWRhdGlvblRhYmxlOiB0aGlzLm5leHRqc0NhY2hlLnJldmFsaWRhdGlvblRhYmxlLFxuICAgICAgYnVpbGRJZDogdGhpcy5uZXh0anNCdWlsZC5idWlsZElkLFxuICAgICAgbmV4dGpzVHlwZTogdGhpcy5uZXh0anNUeXBlLFxuICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cy5idWNrZXQsXG4gICAgICBzdGF0aWNBc3NldHNLZXlQcmVmaXg6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmtleVByZWZpeCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWZ0ZXIgdGhlIGluaXQgY2FjaGUgYW5kIHN0YXRpYyBhc3NldCB1cGxvYWRzOiBpbnZhbGlkYXRpbmcgdGhlIENETlxuICAgKiBiZWZvcmUgdGhlIG5ldyBmaWxlcyBhcmUgaW4gcGxhY2Ugd291bGQgb25seSByZS1jYWNoZSB0aGUgcmVzcG9uc2VzIHRoZVxuICAgKiBpbnZhbGlkYXRpb24gd2FzIG1lYW50IHRvIGRyb3AsIGFuZCBwcnVuaW5nIGJlZm9yZSB0aGVtIGNvdWxkIGRlbGV0ZSBhblxuICAgKiBvYmplY3QgdGhlIHVwbG9hZCBpcyBhYm91dCB0byByZS10YWcgd2l0aCB0aGlzIGJ1aWxkJ3MgSUQuIENsb3VkRm9ybWF0aW9uXG4gICAqIGluZmVycyBubyBvcmRlcmluZyBiZXR3ZWVuIHRoZXNlIGN1c3RvbSByZXNvdXJjZXMgb24gaXRzIG93bi5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVOZXh0anNQb3N0RGVwbG95KFxuICAgIGRpc3RyaWJ1dGlvbj86IElEaXN0cmlidXRpb24sXG4gICk6IE5leHRqc1Bvc3REZXBsb3kge1xuICAgIGNvbnN0IHBvc3REZXBsb3kgPSBuZXcgTmV4dGpzUG9zdERlcGxveSh0aGlzLCBcIk5leHRqc1Bvc3REZXBsb3lcIiwge1xuICAgICAgYmFzZVBhdGg6IHRoaXMucmVzb2x2ZWRCYXNlUGF0aCxcbiAgICAgIGJ1aWxkSWQ6IHRoaXMubmV4dGpzQnVpbGQuYnVpbGRJZCxcbiAgICAgIGRpc3RyaWJ1dGlvbixcbiAgICAgIGNhY2hlQnVja2V0OiB0aGlzLm5leHRqc0NhY2hlLmNhY2hlQnVja2V0LFxuICAgICAgcmV2YWxpZGF0aW9uVGFibGU6IHRoaXMubmV4dGpzQ2FjaGUucmV2YWxpZGF0aW9uVGFibGUsXG4gICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmJ1Y2tldCxcbiAgICAgIHN0YXRpY0Fzc2V0c0tleVByZWZpeDogdGhpcy5uZXh0anNTdGF0aWNBc3NldHMua2V5UHJlZml4LFxuICAgICAgb3ZlcnJpZGVzOiB0aGlzLmJhc2VQcm9wcy5vdmVycmlkZXM/Lm5leHRqc1Bvc3REZXBsb3ksXG4gICAgICAuLi50aGlzLmNvbnN0cnVjdE92ZXJyaWRlcz8ubmV4dGpzUG9zdERlcGxveVByb3BzLFxuICAgIH0pO1xuICAgIGNvbnN0IHsgc3RhdGljRGVwbG95bWVudCwgc2VydmljZVdvcmtlckRlcGxveW1lbnQsIHB1YmxpY0RlcGxveW1lbnQgfSA9XG4gICAgICB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cztcbiAgICBmb3IgKGNvbnN0IHVwbG9hZCBvZiBbXG4gICAgICB0aGlzLm5leHRqc0NhY2hlLmJ1Y2tldERlcGxveW1lbnQsXG4gICAgICBzdGF0aWNEZXBsb3ltZW50LFxuICAgICAgc2VydmljZVdvcmtlckRlcGxveW1lbnQsXG4gICAgICBwdWJsaWNEZXBsb3ltZW50LFxuICAgIF0pIHtcbiAgICAgIGlmICh1cGxvYWQpIHtcbiAgICAgICAgcG9zdERlcGxveS5ub2RlLmFkZERlcGVuZGVuY3kodXBsb2FkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBvc3REZXBsb3k7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0J1aWxkKCk6IE5leHRqc0J1aWxkIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc0J1aWxkKHRoaXMsIFwiTmV4dGpzQnVpbGRcIiwge1xuICAgICAgYnVpbGRDb21tYW5kOiB0aGlzLmJhc2VQcm9wcy5idWlsZENvbW1hbmQsXG4gICAgICBidWlsZERpcmVjdG9yeTogdGhpcy5iYXNlUHJvcHMuYnVpbGREaXJlY3RvcnksXG4gICAgICBuZXh0anNUeXBlOiB0aGlzLm5leHRqc1R5cGUsXG4gICAgICBza2lwQnVpbGQ6IHRoaXMuYmFzZVByb3BzLnNraXBCdWlsZCxcbiAgICAgIC8vIFRoZSBidWlsZCByZXNvbHZlcyB0aGUgc3BsaXQsIHNpbmNlIG9ubHkgaXQga25vd3MgdGhlIHJvdXRlIHRlbXBsYXRlcztcbiAgICAgIC8vIHRoZSBjb25zdHJ1Y3RzIHJlYWQgdGhlIHJlc3VsdCBiYWNrIG9mZiB0aGUgbWFuaWZlc3QuXG4gICAgICBmdW5jdGlvbkdyb3VwczogdGhpcy5mdW5jdGlvbkdyb3Vwcz8ubWFwKCh7IG5hbWUsIHJvdXRlcyB9KSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICByb3V0ZXMsXG4gICAgICB9KSksXG4gICAgICAvLyBXaGF0IHRoZSBMYW1iZGFzIHdpbGwgcnVuIGRlY2lkZXMgdGhlIGBzaGFycGAgYmluYXJpZXMgc3RhZ2VkIGZvciB0aGVtLlxuICAgICAgYXJjaGl0ZWN0dXJlOiB0aGlzLmZ1bmN0aW9uc092ZXJyaWRlcz8uZnVuY3Rpb25Qcm9wcz8uYXJjaGl0ZWN0dXJlLFxuICAgICAgLi4udGhpcy5jb25zdHJ1Y3RPdmVycmlkZXM/Lm5leHRqc0J1aWxkUHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0NhY2hlKCk6IE5leHRqc0NhY2hlIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc0NhY2hlKHRoaXMsIFwiTmV4dGpzQ2FjaGVcIiwge1xuICAgICAgYnVpbGRJZDogdGhpcy5uZXh0anNCdWlsZC5idWlsZElkLFxuICAgICAgY2FjaGVCdWNrZXQ6IHRoaXMuYmFzZVByb3BzLmNhY2hlQnVja2V0LFxuICAgICAgaW5pdENhY2hlRGlyOiB0aGlzLm5leHRqc0J1aWxkLmluaXRDYWNoZURpcixcbiAgICAgIG92ZXJyaWRlczogdGhpcy5iYXNlUHJvcHMub3ZlcnJpZGVzPy5uZXh0anNDYWNoZSxcbiAgICAgIHJldmFsaWRhdGlvblRhYmxlOiB0aGlzLmJhc2VQcm9wcy5yZXZhbGlkYXRpb25UYWJsZSxcbiAgICAgIC4uLnRoaXMuY29uc3RydWN0T3ZlcnJpZGVzPy5uZXh0anNDYWNoZVByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNTdGF0aWNBc3NldHMoKTogTmV4dGpzU3RhdGljQXNzZXRzIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyh0aGlzLCBcIk5leHRqc1N0YXRpY0Fzc2V0c1wiLCB7XG4gICAgICBidWNrZXQ6IHRoaXMuYmFzZVByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldCxcbiAgICAgIGJ1aWxkRGlyZWN0b3J5OiB0aGlzLmJhc2VQcm9wcy5idWlsZERpcmVjdG9yeSxcbiAgICAgIGJ1aWxkSWQ6IHRoaXMubmV4dGpzQnVpbGQuYnVpbGRJZCxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLnJlc29sdmVkQmFzZVBhdGgsXG4gICAgICBvdmVycmlkZXM6IHRoaXMuYmFzZVByb3BzLm92ZXJyaWRlcz8ubmV4dGpzU3RhdGljQXNzZXRzLFxuICAgICAgLi4udGhpcy5jb25zdHJ1Y3RPdmVycmlkZXM/Lm5leHRqc1N0YXRpY0Fzc2V0c1Byb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBieSBgTmV4dGpzR2xvYmFsRnVuY3Rpb25zYCBhbmQgYE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zYC5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVOZXh0anNGdW5jdGlvbnMoKTogTmV4dGpzRnVuY3Rpb25zIHtcbiAgICAvLyBUaGUgZ2V0dGVyLCBub3QgYSBwYXJhbWV0ZXIsIHNvIHRoZSBidWlsZCBhbmQgdGhlIGZ1bmN0aW9ucyByZWFkIHRoZVxuICAgIC8vIHNhbWUgYGFyY2hpdGVjdHVyZWAuXG4gICAgY29uc3Qgb3ZlcnJpZGVzID0gdGhpcy5mdW5jdGlvbnNPdmVycmlkZXM7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNGdW5jdGlvbnModGhpcywgXCJOZXh0anNGdW5jdGlvbnNcIiwge1xuICAgICAgLi4udGhpcy5jb21wdXRlQmFzZVByb3BzKCksXG4gICAgICBkZXBsb3ltZW50Um9vdHM6IHRoaXMubmV4dGpzQnVpbGQuZGVwbG95bWVudFJvb3RzLFxuICAgICAgYXJjaGl0ZWN0dXJlOiB0aGlzLm5leHRqc0J1aWxkLmFyY2hpdGVjdHVyZSxcbiAgICAgIGZ1bmN0aW9uR3JvdXBzOiB0aGlzLmZ1bmN0aW9uR3JvdXBzLFxuICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICAgICAgZnVuY3Rpb25Qcm9wczoge1xuICAgICAgICAgIC4uLm92ZXJyaWRlcz8uZnVuY3Rpb25Qcm9wcyxcbiAgICAgICAgICAvLyBTcHJlYWQgY29uZGl0aW9uYWxseSByYXRoZXIgdGhhbiBhc3NpZ25lZDogYW4gdW5jb25kaXRpb25hbFxuICAgICAgICAgIC8vIGB2cGM6IHRoaXMuYmFzZVByb3BzLnZwY2Agd3JpdGVzIGB1bmRlZmluZWRgIG92ZXIgYW5cbiAgICAgICAgICAvLyBgb3ZlcnJpZGVzLm5leHRqc0Z1bmN0aW9ucy5mdW5jdGlvblByb3BzLnZwY2AgdGhlIGNvbnN1bWVyIHN1cHBsaWVkLFxuICAgICAgICAgIC8vIHNvIHRoZSBMYW1iZGFzIGRlcGxveSBvdXRzaWRlIHRoZSBWUEMgYW5kIGNhbm5vdCByZWFjaCBhIHByaXZhdGVcbiAgICAgICAgICAvLyBSRFMsIEVsYXN0aUNhY2hlLCBvciBWUEMgZW5kcG9pbnQgLSB3aXRoIG5vdGhpbmcgc2FpZCBhdCBzeW50aC5cbiAgICAgICAgICAuLi4odGhpcy5iYXNlUHJvcHMudnBjID8geyB2cGM6IHRoaXMuYmFzZVByb3BzLnZwYyB9IDoge30pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
302
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJhc2UtY29uc3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtYmFzZS1jb25zdHJ1Y3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZDQUFvQztBQUtwQywyQ0FBdUM7QUFDdkMsNENBQXNEO0FBS3RELCtEQUEyRDtBQUMzRCxrREFBb0U7QUFFcEUseUVBSTRDO0FBQzVDLDhEQUcrQjtBQUMvQixrRUFJaUM7QUFDakMsa0RBSzRCO0FBOEg1Qjs7R0FFRztBQUNILE1BQXNCLG1CQUFvQixTQUFRLHNCQUFTOztJQUN6RCxXQUFXLENBQWM7SUFDekIsa0JBQWtCLENBQXFCO0lBQ3ZDLFdBQVcsQ0FBYztJQUlOLFVBQVUsQ0FBYTtJQUMxQyxxRUFBcUU7SUFDbEQsU0FBUyxDQUEyQjtJQUN2RCw0RUFBNEU7SUFDNUUseUVBQXlFO0lBQ3RELGtCQUFrQixDQUFnQztJQUNyRTs7Ozs7T0FLRztJQUNnQixnQkFBZ0IsQ0FBVTtJQUU3QyxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUErQixFQUMvQixVQUFzQjtRQUV0QixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM1Qyx5RUFBeUU7UUFDekUsMkVBQTJFO1FBQzNFLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBQSwyQkFBZSxFQUNyQyxVQUFVLEVBQ1YsS0FBSyxDQUFDLFFBQVEsRUFDZCxJQUFJLENBQUMsV0FBVyxD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RUFBdUU7b0JBQ3ZFLG1FQUFtRTtvQkFDbkUsa0VBQWtFO29CQUNsRSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDM0Q7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBNVVILGtEQTZVQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRva2VuIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBJRGlzdHJpYnV0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQgeyBJVGFibGVWMiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcbmltcG9ydCB7IElWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgSUJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBMT0dfUFJFRklYLCBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxOZXh0anNCdWlsZFByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzQnVpbGRQcm9wc1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxOZXh0anNDYWNoZVByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzQ2FjaGVQcm9wc1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxOZXh0anNQb3N0RGVwbG95UHJvcHMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNQb3N0RGVwbG95UHJvcHNcIjtcbmltcG9ydCB7IE5leHRqc0FwaU92ZXJyaWRlcyB9IGZyb20gXCIuLi9uZXh0anMtYXBpXCI7XG5pbXBvcnQgeyBOZXh0anNCdWlsZCB9IGZyb20gXCIuLi9uZXh0anMtYnVpbGQvbmV4dGpzLWJ1aWxkXCI7XG5pbXBvcnQgeyBOZXh0anNDYWNoZSwgTmV4dGpzQ2FjaGVPdmVycmlkZXMgfSBmcm9tIFwiLi4vbmV4dGpzLWNhY2hlXCI7XG5pbXBvcnQgeyBOZXh0anNDb21wdXRlQmFzZVByb3BzIH0gZnJvbSBcIi4uL25leHRqcy1jb21wdXRlL25leHRqcy1jb21wdXRlLWJhc2UtcHJvcHNcIjtcbmltcG9ydCB7XG4gIE5leHRqc0Z1bmN0aW9uR3JvdXAsXG4gIE5leHRqc0Z1bmN0aW9ucyxcbiAgTmV4dGpzRnVuY3Rpb25zT3ZlcnJpZGVzLFxufSBmcm9tIFwiLi4vbmV4dGpzLWNvbXB1dGUvbmV4dGpzLWZ1bmN0aW9uc1wiO1xuaW1wb3J0IHtcbiAgTmV4dGpzUG9zdERlcGxveSxcbiAgTmV4dGpzUG9zdERlcGxveU92ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1wb3N0LWRlcGxveVwiO1xuaW1wb3J0IHtcbiAgTmV4dGpzU3RhdGljQXNzZXRzLFxuICBOZXh0anNTdGF0aWNBc3NldHNPdmVycmlkZXMsXG4gIE5leHRqc1N0YXRpY0Fzc2V0c1Byb3BzLFxufSBmcm9tIFwiLi4vbmV4dGpzLXN0YXRpYy1hc3NldHNcIjtcbmltcG9ydCB7XG4gIEFwaUdhdGV3YXlQcmVmaXgsXG4gIGlzQXNzZXRQcmVmaXhVbnNlcnZlZCxcbiAgcHJlZml4V2l0aEJhc2VQYXRoLFxuICByZXNvbHZlQmFzZVBhdGgsXG59IGZyb20gXCIuLi91dGlscy9iYXNlLXBhdGhcIjtcblxuLyoqXG4gKiBCYXNlIG92ZXJyaWRlcyBmb3IgdGhlIHByb3BzIHBhc3NlZCB0byBjb25zdHJ1Y3RzIHdpdGhpbiByb290L3RvcC1sZXZlbCBOZXh0LmpzIGNvbnN0cnVjdHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh0anNCYXNlQ29uc3RydWN0T3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzQnVpbGRQcm9wcz86IE9wdGlvbmFsTmV4dGpzQnVpbGRQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzQ2FjaGVQcm9wcz86IE9wdGlvbmFsTmV4dGpzQ2FjaGVQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzUG9zdERlcGxveVByb3BzPzogT3B0aW9uYWxOZXh0anNQb3N0RGVwbG95UHJvcHM7XG4gIHJlYWRvbmx5IG5leHRqc1N0YXRpY0Fzc2V0c1Byb3BzPzogTmV4dGpzU3RhdGljQXNzZXRzUHJvcHM7XG59XG5cbi8qKlxuICogQmFzZSBvdmVycmlkZXMgZm9yIGNvbnN0cnVjdHMgc2hhcmVkIGJldHdlZW4gYWxsIHJvb3QvdG9wLWxldmVsIE5leHQuanMgY29uc3RydWN0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh0anNCYXNlT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzQ2FjaGU/OiBOZXh0anNDYWNoZU92ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzUG9zdERlcGxveT86IE5leHRqc1Bvc3REZXBsb3lPdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc1N0YXRpY0Fzc2V0cz86IE5leHRqc1N0YXRpY0Fzc2V0c092ZXJyaWRlcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNCYXNlUHJvcHMge1xuICAvKipcbiAgICogUHJlZml4IHRvIHRoZSBVUkkgcGF0aCB0aGUgYXBwIHdpbGwgYmUgc2VydmVkIGF0LiBBbHNvIG5hbWVzcGFjZXMgdGhlXG4gICAqIHN0YXRpYyBhc3NldHMgaW4gUzMsIHNvIGl0IGRvdWJsZXMgYXMgYSB3YXkgdG8gaG9zdCBtdWx0aXBsZSBhcHBzIG9yXG4gICAqIGJyYW5jaGVzIG91dCBvZiBvbmUgYnVja2V0LlxuICAgKlxuICAgKiBIb3cgdGhpcyByZWxhdGVzIHRvIHRoZSBgYmFzZVBhdGhgIGluIHlvdXIgYXBwJ3MgYG5leHQuY29uZmlnLmpzYCBkZXBlbmRzXG4gICAqIG9uIHRoZSBjb25zdHJ1Y3QsIGFuZCBzeW50aCBmYWlscyBvbiBhIGNvbWJpbmF0aW9uIHRoYXQgY2FuJ3Qgc2VydmUgdGhlXG4gICAqIGFwcDpcbiAgICpcbiAgICogLSBgTmV4dGpzR2xvYmFsRnVuY3Rpb25zYC9gTmV4dGpzR2xvYmFsQ29udGFpbmVyc2A6IGxlYXZlIHRoaXMgdW5zZXQgYW5kIGl0XG4gICAqICAgZm9sbG93cyB5b3VyIGFwcCdzIGBiYXNlUGF0aGAsIHdoaWNoIGlzIHdoYXQgeW91IHdhbnQg4oCUIENsb3VkRnJvbnQgc2VydmVzXG4gICAqICAgc3RhdGljIGFzc2V0cyBmcm9tIFMzIHVzaW5nIHRoZSByZXF1ZXN0IHBhdGggYXMgdGhlIG9iamVjdCBrZXksIHNvIHRoZSB0d29cbiAgICogICBoYXZlIHRvIGJlIGlkZW50aWNhbCBhbmQgYSBtaXNtYXRjaCA0MDRzIGFsbCBvZiB0aGVtLiBTZXR0aW5nIGEgZGlmZmVyZW50XG4gICAqICAgdmFsdWUgdGhyb3dzLlxuICAgKiAtIGBOZXh0anNSZWdpb25hbEZ1bmN0aW9uc2A6IGxlYXZlIHRoaXMgdW5zZXQgYW5kIGl0IGZvbGxvd3MgeW91ciBhcHAnc1xuICAgKiAgIGBiYXNlUGF0aGAgbWludXMgdGhlIHByZWZpeCBBUEkgR2F0ZXdheSBzdHJpcHMgYmVmb3JlIG1hdGNoaW5nIHJlc291cmNlcyDigJRcbiAgICogICB0aGUgc3RhZ2UgKGBkZXBsb3lPcHRpb25zLnN0YWdlTmFtZWAsIGRlZmF1bHQgYHByb2RgKSwgb3IgdGhlIGJhc2UgcGF0aFxuICAgKiAgIG1hcHBpbmcgb2YgYSBjdXN0b20gZG9tYWluIHNldCBpbiBgcmVzdEFwaVByb3BzLmRvbWFpbk5hbWVgLiBTb1xuICAgKiAgIGBiYXNlUGF0aDogXCIvcHJvZFwiYCBtb3VudHMgYXQgdGhlIHJvb3QsIGBcIi9wcm9kL2Jhc2VcImAgdW5kZXIgYGJhc2VgLCBhbmRcbiAgICogICBgXCIvZG9jc1wiYCBiZWhpbmQgYSBjdXN0b20gZG9tYWluIG1hcHBlZCBhdCB0aGUgcm9vdCB1bmRlciBgZG9jc2AuIE9uIHRoZVxuICAgKiAgIGV4ZWN1dGUtYXBpIGVuZHBvaW50IGFuIGFwcCBgYmFzZVBhdGhgIHRoYXQgZG9lc24ndCBzdGFydCB3aXRoIHRoZSBzdGFnZVxuICAgKiAgIHdhcm5zLCBzaW5jZSBpdHMgbGlua3Mgd2lsbCBtaXNzIHRoZSBzdGFnZS4gSWYgeW91IHNldCB0aGlzLCB0aGUgYXBwJ3NcbiAgICogICBgYmFzZVBhdGhgIG11c3QgZW5kIHdpdGggaXQuIEEgZG9tYWluIGF0dGFjaGVkIGxhdGVyIHdpdGhcbiAgICogICBgYWRkRG9tYWluTmFtZSgpYCBpcyBub3Qgc2VlbiBhdCBzeW50aDsgc2V0IHRoaXMgZXhwbGljaXRseSB0aGVuIOKAlCB0b1xuICAgKiAgIGBcIi9cImAgd2hlbiB0aGF0IGRvbWFpbidzIGJhc2UgcGF0aCBtYXBwaW5nIHN0cmlwcyB5b3VyIGFwcCdzIHdob2xlXG4gICAqICAgYGJhc2VQYXRoYCwgd2hpY2ggbW91bnRzIGV2ZXJ5IHJlc291cmNlIGF0IHRoZSByb290LlxuICAgKiAtIGBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNgOiBvbmx5IG5hbWVzcGFjZXMgdGhlIFMzIGJ1Y2tldC4gVGhlIEFMQiBzZW5kc1xuICAgKiAgIGV2ZXJ5IHBhdGggdG8gdGhlIGNvbnRhaW5lciwgd2hpY2ggc2VydmVzIGl0cyBvd24gc3RhdGljIGFzc2V0cywgc28gdGhpc1xuICAgKiAgIGlzIHVuY29uc3RyYWluZWQuXG4gICAqIEBleGFtcGxlIFwiL215LWJhc2UtcGF0aFwiXG4gICAqL1xuICByZWFkb25seSBiYXNlUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIENvbW1hbmQgdG8gZ2VuZXJhdGUgb3B0aW1pemVkIHZlcnNpb24gb2YgeW91ciBOZXh0LmpzIGFwcCBpbiBjb250YWluZXI7XG4gICAqIEBkZWZhdWx0IFwibnBtIHJ1biBidWlsZFwiXG4gICAqL1xuICByZWFkb25seSBidWlsZENvbW1hbmQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEaXJlY3Rvcnkgd2hlcmUgdGhlIE5leHQuanMgYXBwbGljYXRpb24gaXMgbG9jYXRlZCBmb3IgbG9jYWwgYnVpbGRzLlxuICAgKiBUaGlzIHNob3VsZCBjb250YWluIHRoZSBwYWNrYWdlLmpzb24gYW5kIE5leHQuanMgYXBwbGljYXRpb24gZmlsZXMuXG4gICAqIFRoaXMgaXMgd2hlcmUge0BsaW5rIE5leHRqc0Jhc2VQcm9wcy5idWlsZENvbW1hbmR9IGlzIHJ1bi5cbiAgICogQGV4YW1wbGUgam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwid2ViXCIpIG9yIFwiL3BhdGgvdG8vbmV4dGpzL2FwcFwiXG4gICAqL1xuICByZWFkb25seSBidWlsZERpcmVjdG9yeTogc3RyaW5nO1xuICAvKipcbiAgICogQnJpbmcgeW91ciBvd24gUzMgYnVja2V0IGZvciBjYWNoZSBzdG9yYWdlLiBXaGVuIHByb3ZpZGVkLCBjZGstbmV4dGpzXG4gICAqIHdpbGwgdXNlIHRoaXMgYnVja2V0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgKlxuICAgKiBUaGUgYnVja2V0IG11c3QgYmUgZGVkaWNhdGVkIHRvIHRoaXMgb25lIGRlcGxveW1lbnQuIERvbid0IHNoYXJlIGl0IHdpdGhcbiAgICogYW5vdGhlciBkZXBsb3ltZW50IChhbm90aGVyIGJyYW5jaCwgc3RhZ2UsIG9yIGFwcCk6IGV2ZXJ5IGRlcGxveSdzXG4gICAqIHBvc3QtZGVwbG95IHN0ZXAgZGVsZXRlcyBldmVyeSBvYmplY3QgdW5kZXIgYSB0b3AtbGV2ZWwgcHJlZml4IG90aGVyIHRoYW5cbiAgICogdGhlIGN1cnJlbnQgYGJ1aWxkSWQvYCwgd2hpY2ggaW5jbHVkZXMgZXZlcnkgb3RoZXIgZGVwbG95bWVudCdzIGNhY2hlLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGVCdWNrZXQ/OiBJQnVja2V0O1xuICAvKipcbiAgICogQnJpbmcgeW91ciBvd24gRHluYW1vREIgdGFibGUgZm9yIHJldmFsaWRhdGlvbiBtZXRhZGF0YS4gV2hlbiBwcm92aWRlZCxcbiAgICogY2RrLW5leHRqcyB3aWxsIHVzZSB0aGlzIHRhYmxlIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLiBUaGUgdGFibGVcbiAgICogbXVzdCBoYXZlIGBwa2AgKFN0cmluZykgYXMgcGFydGl0aW9uIGtleSBhbmQgYHNrYCAoU3RyaW5nKSBhcyBzb3J0IGtleS5cbiAgICogRW5hYmxlIFRUTCBvbiBpdHMgYHR0bGAgYXR0cmlidXRlIHRvbzogZWFjaCB0YWcgcmV2YWxpZGF0aW9uIHdyaXRlcyBhXG4gICAqIHJldmFsaWRhdGlvbiBsb2cgcm93IHRoYXQgZXhwaXJlcyB0aHJvdWdoIGl0LCBhbmQgd2l0aG91dCBUVEwgdGhvc2Ugcm93c1xuICAgKiBhY2N1bXVsYXRlLlxuICAgKlxuICAgKiBUaGUgdGFibGUgbXVzdCBiZSBkZWRpY2F0ZWQgdG8gdGhpcyBvbmUgZGVwbG95bWVudC4gRG9uJ3Qgc2hhcmUgaXQgd2l0aFxuICAgKiBhbm90aGVyIGRlcGxveW1lbnQgKGFub3RoZXIgYnJhbmNoLCBzdGFnZSwgb3IgYXBwKTogZXZlcnkgZGVwbG95J3NcbiAgICogcG9zdC1kZXBsb3kgc3RlcCBkZWxldGVzIHRoZSBlbnRyaWVzIG9mIHRoZSBidWlsZCBpdCBsYXN0IHJlY29yZGVkIGluIHRoZVxuICAgKiB0YWJsZSwgd2hpY2ggd2l0aCBhIHNoYXJlZCB0YWJsZSBpcyBhbm90aGVyIGRlcGxveW1lbnQncyBsaXZlIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmV2YWxpZGF0aW9uVGFibGU/OiBJVGFibGVWMjtcbiAgLyoqXG4gICAqIFNraXBzIHJ1bm5pbmcgYG5leHQgYnVpbGRgLiBJZiBgdHJ1ZWAsIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIHJ1bm5pbmdcbiAgICogYG5leHQgYnVpbGRgIGJlZm9yZSB0aGlzIGNvbnN0cnVjdCBpcyBzeW50aGVzaXplZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNraXBCdWlsZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBTMyBidWNrZXQgZm9yIHN0YXRpYyBhc3NldHMuIFdoZW4gcHJvdmlkZWQsIGNkay1uZXh0anNcbiAgICogd2lsbCBkZXBsb3kgc3RhdGljIGFzc2V0cyB0byB0aGlzIGJ1Y2tldCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICpcbiAgICogVW5saWtlIGBjYWNoZUJ1Y2tldGAsIHRoaXMgb25lIGNhbiBiZSBzaGFyZWQsIGJ1dCBvbmx5IGJldHdlZW4gZGVwbG95bWVudHNcbiAgICogd2l0aCBkaWZmZXJlbnQgYGJhc2VQYXRoYHMgKHNvIGRpZmZlcmVudCBTMyBrZXkgcHJlZml4ZXMpLiBQcnVuaW5nIG9ubHlcbiAgICogdG91Y2hlcyBgPGJhc2VQYXRoPi9fbmV4dC9gLCBzbyBpdCBsZWF2ZXMgdGhlIG90aGVycycgYXNzZXRzIGFsb25lLiBUd29cbiAgICogZGVwbG95bWVudHMgdW5kZXIgdGhlIHNhbWUgcHJlZml4IG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgYHB1YmxpYy9gIGZpbGVzXG4gICAqIGFuZCBwcnVuZSBlYWNoIG90aGVyJ3MgYF9uZXh0L2AgYXNzZXRzIG9uY2UgdGhleSBhcmUgcGFzdCB0aGUgcHJ1bmVcbiAgICogVFRMICgzMCBkYXlzIGJ5IGRlZmF1bHQpLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzQnVja2V0PzogSUJ1Y2tldDtcbiAgLyoqXG4gICAqIEJyaW5nIHlvdXIgb3duIFZQQy5cbiAgICogSWYgcHJvdmlkZWQsIHdpbGwgYmUgcGFzc2VkIHZpYSBvdmVycmlkZXMgdG8gdGhlIEVDUyBDbHVzdGVyIChmb3IgY29udGFpbmVyLWJhc2VkIGNvbnN0cnVjdHMpXG4gICAqIG9yIHRvIHRoZSBMYW1iZGEgZnVuY3Rpb24gKGZvciBmdW5jdGlvbi1iYXNlZCBjb25zdHJ1Y3RzKS5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBFQ1MgQ2x1c3RlciB3aWxsIGNyZWF0ZSBhIFZQQyBhdXRvbWF0aWNhbGx5IGZvciBjb250YWluZXJzLFxuICAgKiBhbmQgTGFtYmRhIGZ1bmN0aW9ucyB3aWxsIHJ1biBvdXRzaWRlIGEgVlBDLlxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogSVZwYztcbn1cblxuLyoqXG4gKiBSZXF1aXJlZCBiZWNhdXNlIGlmIHdlIGFkZCBgb3ZlcnJpZGVzYCBvbnRvIGBOZXh0anNCYXNlUHJvcHNgIHdlIGdldCBqc2lpXG4gKiBlcnJvcjogYEludGVyZmFjZSAuLi4gcmUtZGVjbGFyZXMgbWVtYmVyIFwib3ZlcnJpZGVzXCJgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQmFzZUNvbnN0cnVjdFByb3BzIGV4dGVuZHMgTmV4dGpzQmFzZVByb3BzIHtcbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzQmFzZU92ZXJyaWRlcztcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgTmV4dC5qcyByb290IGNvbnN0cnVjdHNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5leHRqc0Jhc2VDb25zdHJ1Y3QgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBuZXh0anNCdWlsZDogTmV4dGpzQnVpbGQ7XG4gIG5leHRqc1N0YXRpY0Fzc2V0czogTmV4dGpzU3RhdGljQXNzZXRzO1xuICBuZXh0anNDYWNoZTogTmV4dGpzQ2FjaGU7XG5cbiAgYWJzdHJhY3QgZ2V0IHVybCgpOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRqc1R5cGU6IE5leHRqc1R5cGU7XG4gIC8vIHVzZSBiYXNlUHJvcHMgaW5zdGVhZCBvZiBwcm9wcyBzbyB0aGF0IGNoaWxkIGNsYXNzZXMgY2FuIHVzZSBwcm9wc1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmFzZVByb3BzOiBOZXh0anNCYXNlQ29uc3RydWN0UHJvcHM7XG4gIC8vIFdpZGVzdCBzaGFwZSBvZiB0aGUgcGVyLWBOZXh0anNUeXBlYCBvdmVycmlkZXMuIFRoZSBwdWJsaWMgaW50ZXJmYWNlIGVhY2hcbiAgLy8gcm9vdCBjb25zdHJ1Y3QgYWNjZXB0cyBpcyB3aGF0IGFjdHVhbGx5IGdhdGVzIHdoaWNoIGtleXMgYXJlIHNldHRhYmxlLlxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29uc3RydWN0T3ZlcnJpZGVzPzogTmV4dGpzQmFzZUNvbnN0cnVjdE92ZXJyaWRlcztcbiAgLyoqXG4gICAqIFRoZSBgYmFzZVBhdGhgIGV2ZXJ5dGhpbmcgZG93bnN0cmVhbSBpcyBidWlsdCBmcm9tOiB0aGUgYGJhc2VQYXRoYCBwcm9wIHdoZW5cbiAgICogc2V0LCBvdGhlcndpc2UgdGhlIGFwcCdzIG93biBgYmFzZVBhdGhgIGZvciB0aGUgYE5leHRqc1R5cGVgcyB3aGVyZSB0aGUgdHdvXG4gICAqIGFyZSBuZWNlc3NhcmlseSB0aGUgc2FtZS4gTm9ybWFsaXplZCB0byBhIGJhcmUgcGF0aCBzZWdtZW50LCBgdW5kZWZpbmVkYCBmb3JcbiAgICogbm8gYGJhc2VQYXRoYC4gVXNlIHRoaXMgaW5zdGVhZCBvZiBgYmFzZVByb3BzLmJhc2VQYXRoYC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNvbHZlZEJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTmV4dGpzQmFzZUNvbnN0cnVjdFByb3BzLFxuICAgIG5leHRqc1R5cGU6IE5leHRqc1R5cGUsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5iYXNlUHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLm5leHRqc1R5cGUgPSBuZXh0anNUeXBlO1xuICAgIHRoaXMuY29uc3RydWN0T3ZlcnJpZGVzID0gdGhpcy5nZXRDb25zdHJ1Y3RPdmVycmlkZXMobmV4dGpzVHlwZSk7XG5cbiAgICB0aGlzLm5leHRqc0J1aWxkID0gdGhpcy5jcmVhdGVOZXh0anNCdWlsZCgpO1xuICAgIC8vIEEgYmFzZVBhdGggdGhhdCBkb2Vzbid0IGxpbmUgdXAgd2l0aCB0aGUgYXBwJ3Mgb3duIGRlcGxveXMgY2xlYW5seSBhbmRcbiAgICAvLyB0aGVuIDQwNHMgc3RhdGljIGFzc2V0cywgc28gcmVjb25jaWxlIHRoZSB0d28gdXAgZnJvbnQgYW5kIGZhaWwgYXQgc3ludGhcbiAgICAvLyBvbiBhIGNvbWJpbmF0aW9uIHRoYXQgY2FuJ3Qgd29yay5cbiAgICB0aGlzLnJlc29sdmVkQmFzZVBhdGggPSByZXNvbHZlQmFzZVBhdGgoXG4gICAgICBuZXh0anNUeXBlLFxuICAgICAgcHJvcHMuYmFzZVBhdGgsXG4gICAgICB0aGlzLm5leHRqc0J1aWxkLm5leHRDb25maWdCYXNlUGF0aCxcbiAgICAgIHRoaXMuYXBpR2F0ZXdheVByZWZpeCgpLFxuICAgICk7XG4gICAgdGhpcy5uZXh0anNDYWNoZSA9IHRoaXMuY3JlYXRlTmV4dGpzQ2FjaGUoKTtcbiAgICB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cyA9IHRoaXMuY3JlYXRlTmV4dGpzU3RhdGljQXNzZXRzKCk7XG4gICAgdGhpcy52YWxpZGF0ZVN0YXRpY0Fzc2V0c0tleVByZWZpeCgpO1xuICAgIHRoaXMud2FyblVuc2VydmVkQXNzZXRQcmVmaXgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXJucyB3aGVuIGEgcGF0aC1zdHlsZSBgYXNzZXRQcmVmaXhgIHdvdWxkIDQwNCBldmVyeSBidW5kbGUgb24gdGhpc1xuICAgKiBgTmV4dGpzVHlwZWAg4oCUIHNlZSB7QGxpbmsgaXNBc3NldFByZWZpeFVuc2VydmVkfSBmb3Igd2hpY2ggY29tYmluYXRpb25zIHRob3NlXG4gICAqIGFyZSBhbmQgd2h5IGEgcHJlZml4IGVxdWFsIHRvIHRoZSBhcHAncyBgYmFzZVBhdGhgIGlzIG5vdCBvbmUgb2YgdGhlbS5cbiAgICpcbiAgICogV2FybiByYXRoZXIgdGhhbiB0aHJvdzogaXQgaXMgdGhlIGFwcCdzIGNvbmZpZywgdGhlIGRlcGxveW1lbnQgb3RoZXJ3aXNlXG4gICAqIHdvcmtzLCBhbmQgYW4gYWJzb2x1dGUgYGFzc2V0UHJlZml4YCAoYWxyZWFkeSByZWR1Y2VkIHRvIGBcIlwiYCBieVxuICAgKiBgcmVsYXRpdmVBc3NldFByZWZpeGApIGlzIHRoZSBzdXBwb3J0ZWQgd2F5IHRvIHNlcnZlIGFzc2V0cyBmcm9tXG4gICAqIGVsc2V3aGVyZS5cbiAgICovXG4gIHByaXZhdGUgd2FyblVuc2VydmVkQXNzZXRQcmVmaXgoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIWlzQXNzZXRQcmVmaXhVbnNlcnZlZChcbiAgICAgICAgdGhpcy5uZXh0anNUeXBlLFxuICAgICAgICB0aGlzLm5leHRqc0J1aWxkLm5leHRDb25maWdBc3NldFByZWZpeCxcbiAgICAgICAgdGhpcy5uZXh0anNCdWlsZC5uZXh0Q29uZmlnQmFzZVBhdGgsXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGAke0xPR19QUkVGSVh9IHlvdXIgTmV4dC5qcyBhcHAgc2V0cyBcXGBhc3NldFByZWZpeDogXCIke3RoaXMubmV4dGpzQnVpbGQubmV4dENvbmZpZ0Fzc2V0UHJlZml4fVwiXFxgLCBgICtcbiAgICAgICAgYHdoaWNoIE5leHRqc1R5cGUuJHt0aGlzLm5leHRqc1R5cGV9IGNhbm5vdCBzZXJ2ZTogeW91ciBidW5kbGVzIHdpbGwgYmUgcmVxdWVzdGVkIGF0IGAgK1xuICAgICAgICBgXCIke3RoaXMubmV4dGpzQnVpbGQubmV4dENvbmZpZ0Fzc2V0UHJlZml4fS9fbmV4dC9zdGF0aWMvLi4uXCIgYW5kIG5vdGhpbmcgYW5zd2VycyB0aGVyZSwgc28gdGhleSB3aWxsIDQwNC4gYCArXG4gICAgICAgIFwiRHJvcCBgYXNzZXRQcmVmaXhgLCB1c2UgYW4gYWJzb2x1dGUgb25lIHBvaW50aW5nIGF0IGEgQ0ROIHlvdSBmcm9udCB0aGUgYXNzZXRzIGJ1Y2tldCB3aXRoLCBcIiArXG4gICAgICAgIFwib3IgZGVwbG95IHdpdGggTmV4dGpzR2xvYmFsRnVuY3Rpb25zL05leHRqc0dsb2JhbENvbnRhaW5lcnMuXCIsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgdGhlIEdsb2JhbCBgTmV4dGpzVHlwZWBzIHRoZSBrZXkgcHJlZml4IGlzbid0IGEgZnJlZSBjaG9pY2U6IGl0IGhhcyB0byBiZVxuICAgKiBgYmFzZVBhdGhgIChzZWUgYHJlc29sdmVCYXNlUGF0aGApLiBBIGBkZXN0aW5hdGlvbktleVByZWZpeGAgb3ZlcnJpZGUgdGhhdFxuICAgKiBtb3ZlcyB0aGUgb2JqZWN0cyBlbHNld2hlcmUgaGFzIG5vIHdheSB0byB0ZWxsIHRoZSBkaXN0cmlidXRpb24gYWJvdXQgaXQg4oCUXG4gICAqIHVubGlrZSB0aGUgZnVuY3Rpb25zJyBpbWFnZSBvcHRpbWl6ZXIgYW5kIGBOZXh0anNBcGlgLCB3aGljaCByZWFkXG4gICAqIGBOZXh0anNTdGF0aWNBc3NldHMua2V5UHJlZml4YCDigJQgc28gZmFpbCBhdCBzeW50aCByYXRoZXIgdGhhbiA0MDQgZXZlcnlcbiAgICogc3RhdGljIHJlcXVlc3QuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU3RhdGljQXNzZXRzS2V5UHJlZml4KCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMubmV4dGpzVHlwZSAhPT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TICYmXG4gICAgICB0aGlzLm5leHRqc1R5cGUgIT09IE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlNcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhwZWN0ZWQgPSB0aGlzLnJlc29sdmVkQmFzZVBhdGggPz8gXCJcIjtcbiAgICBjb25zdCBhY3R1YWwgPSB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cy5rZXlQcmVmaXg7XG4gICAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gc3RhdGljIGFzc2V0cyBrZXkgcHJlZml4IG1pc21hdGNoIGZvciBOZXh0anNUeXBlLiR7dGhpcy5uZXh0anNUeXBlfTogYCArXG4gICAgICAgICAgYHRoZSBhc3NldHMgYXJlIHVwbG9hZGVkIHVuZGVyICR7YWN0dWFsID8gYFwiJHthY3R1YWx9XCJgIDogXCJ0aGUgYnVja2V0IHJvb3RcIn0gYCArXG4gICAgICAgICAgYGJ1dCBDbG91ZEZyb250IHdpbGwgcmVxdWVzdCB0aGVtIHVuZGVyICR7ZXhwZWN0ZWQgPyBgXCIke2V4cGVjdGVkfVwiYCA6IFwidGhlIGJ1Y2tldCByb290XCJ9LCBgICtcbiAgICAgICAgICBcInVzaW5nIHRoZSByZXF1ZXN0IHBhdGggYXMgdGhlIFMzIG9iamVjdCBrZXksIHNvIGV2ZXJ5IGBfbmV4dC9zdGF0aWNgIGFuZCBgcHVibGljL2AgcmVxdWVzdCB3b3VsZCA0MDQuIFwiICtcbiAgICAgICAgICBcIkRyb3AgdGhlIGBkZXN0aW5hdGlvbktleVByZWZpeGAgb3ZlcnJpZGUsIG9yIHNldCBpdCB0byB0aGUgc2FtZSB2YWx1ZSBhcyBgYmFzZVBhdGhgLiBcIiArXG4gICAgICAgICAgXCJUbyBuYW1lc3BhY2UgYSBzaGFyZWQgYnVja2V0LCB1c2UgYGJhc2VQYXRoYCDigJQgaXQgcHJlZml4ZXMgdGhlIGtleXMgYW5kIHRoZSBVUkxzIHRvZ2V0aGVyLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHByZWZpeCBBUEkgR2F0ZXdheSB3aWxsIHN0cmlwLCByZWFkIGZyb20gdGhlIHNhbWUgYHJlc3RBcGlQcm9wc2BcbiAgICogb3ZlcnJpZGUgYE5leHRqc0FwaWAgYnVpbGRzIGl0cyBgUmVzdEFwaWAgZnJvbS4gT25seSBtZWFuaW5nZnVsIGZvclxuICAgKiBgUkVHSU9OQUxfRlVOQ1RJT05TYCwgYW5kIHJlYWQgYmVmb3JlIGBOZXh0anNBcGlgIGV4aXN0cyBiZWNhdXNlIHRoZVxuICAgKiByZXNvbHZlZCBgYmFzZVBhdGhgIGFsc28gZGVjaWRlcyB0aGUgc3RhdGljIGFzc2V0cycgUzMga2V5IHByZWZpeC5cbiAgICpcbiAgICogQSBkb21haW4gYXR0YWNoZWQgbGF0ZXIgd2l0aCBgYXBpLmFkZERvbWFpbk5hbWUoKWAgaXMgaW52aXNpYmxlIGhlcmUsIHRoZVxuICAgKiBzYW1lIGxpbWl0YXRpb24gYE5leHRqc0FwaS51cmxgIGRvY3VtZW50cy5cbiAgICovXG4gIHByaXZhdGUgYXBpR2F0ZXdheVByZWZpeCgpOiBBcGlHYXRld2F5UHJlZml4IHtcbiAgICAvLyBgb3ZlcnJpZGVzLm5leHRqc0FwaWAgaXMgdGhlIG9ubHkgdHlwZWQgd2F5IHRvIHJlYWNoIHRoZSBgUmVzdEFwaWAnc1xuICAgIC8vIHByb3BzOiBgbmV4dGpzUmVnaW9uYWxGdW5jdGlvbnMubmV4dGpzQXBpUHJvcHNgIGlzXG4gICAgLy8gYE9wdGlvbmFsTmV4dGpzQXBpUHJvcHNgLCB3aGljaCBoYXMgbm8gYG92ZXJyaWRlc2AuXG4gICAgY29uc3QgYXBpT3ZlcnJpZGVzID0gKFxuICAgICAgdGhpcy5iYXNlUHJvcHMub3ZlcnJpZGVzIGFzIHsgbmV4dGpzQXBpPzogTmV4dGpzQXBpT3ZlcnJpZGVzIH0gfCB1bmRlZmluZWRcbiAgICApPy5uZXh0anNBcGk7XG4gICAgY29uc3QgcmVzdEFwaVByb3BzID0gYXBpT3ZlcnJpZGVzPy5yZXN0QXBpUHJvcHM7XG4gICAgY29uc3QgZG9tYWluTmFtZSA9IHJlc3RBcGlQcm9wcz8uZG9tYWluTmFtZTtcbiAgICBjb25zdCBzdHJpcHBlZFByZWZpeCA9IGRvbWFpbk5hbWVcbiAgICAgID8gKGRvbWFpbk5hbWUuYmFzZVBhdGggPz8gXCJcIilcbiAgICAgIDogKHJlc3RBcGlQcm9wcz8uZGVwbG95T3B0aW9ucz8uc3RhZ2VOYW1lID8/IFwicHJvZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RyaXBwZWRQcmVmaXg6IFRva2VuLmlzVW5yZXNvbHZlZChzdHJpcHBlZFByZWZpeClcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBzdHJpcHBlZFByZWZpeCxcbiAgICAgIGN1c3RvbURvbWFpbjogZG9tYWluTmFtZSAhPT0gdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgY29uc3RydWN0IG92ZXJyaWRlcyAoaWYgcHJlc2VudCkgb24gcHJvcHMgZm9yIGFueSBgTmV4dGpzVHlwZWBcbiAgICovXG4gIHByaXZhdGUgZ2V0Q29uc3RydWN0T3ZlcnJpZGVzKG5leHRqc1R5cGU6IE5leHRqc1R5cGUpIHtcbiAgICBjb25zdCBuZXh0anNUeXBlVG9LZXk6IFJlY29yZDxOZXh0anNUeXBlLCBzdHJpbmc+ID0ge1xuICAgICAgW05leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlNdOiBcIm5leHRqc0dsb2JhbENvbnRhaW5lcnNcIixcbiAgICAgIFtOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlNdOiBcIm5leHRqc0dsb2JhbEZ1bmN0aW9uc1wiLFxuICAgICAgW05leHRqc1R5cGUuUkVHSU9OQUxfQ09OVEFJTkVSU106IFwibmV4dGpzUmVnaW9uYWxDb250YWluZXJzXCIsXG4gICAgICBbTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlNdOiBcIm5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zXCIsXG4gICAgfTtcbiAgICBjb25zdCBrZXkgPSBuZXh0anNUeXBlVG9LZXlbbmV4dGpzVHlwZV07XG4gICAgY29uc3Qgb3ZlcnJpZGVzID0gdGhpcy5iYXNlUHJvcHMub3ZlcnJpZGVzIGFzXG4gICAgICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAob3ZlcnJpZGVzICYmIGtleSBpbiBvdmVycmlkZXMpIHtcbiAgICAgIHJldHVybiBvdmVycmlkZXNba2V5XSBhcyBOZXh0anNCYXNlQ29uc3RydWN0T3ZlcnJpZGVzO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogYG92ZXJyaWRlcy5uZXh0anNGdW5jdGlvbnNgLCB3aGljaCBvbmx5IHRoZSB0d28gRnVuY3Rpb25zIHJvb3QgY29uc3RydWN0c1xuICAgKiBkZWNsYXJlLiBDYXN0IGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIGZ1bmN0aW9uR3JvdXBzfS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGZ1bmN0aW9uc092ZXJyaWRlcygpOiBOZXh0anNGdW5jdGlvbnNPdmVycmlkZXMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG92ZXJyaWRlcyA9IHRoaXMuYmFzZVByb3BzLm92ZXJyaWRlcyBhc1xuICAgICAgeyBuZXh0anNGdW5jdGlvbnM/OiBOZXh0anNGdW5jdGlvbnNPdmVycmlkZXMgfSB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gb3ZlcnJpZGVzPy5uZXh0anNGdW5jdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogYGZ1bmN0aW9uR3JvdXBzYCwgd2hpY2ggb25seSB0aGUgdHdvIEZ1bmN0aW9ucyByb290IGNvbnN0cnVjdHMgYWNjZXB0IOKAlFxuICAgKiBDb250YWluZXJzIGRlcGxveSBvbmUgdGFzayBkZWZpbml0aW9uIGFuZCBoYXZlIG5vIDI1MCBNQiBwYWNrYWdlIGxpbWl0IHRvXG4gICAqIHNwbGl0IGFyb3VuZC5cbiAgICpcbiAgICogUmVhZCBvZmYgYGJhc2VQcm9wc2Agd2l0aCBhIGNhc3QgZm9yIHRoZSBzYW1lIHJlYXNvbiBhc1xuICAgKiB7QGxpbmsgZ2V0Q29uc3RydWN0T3ZlcnJpZGVzfTogYGNyZWF0ZU5leHRqc0J1aWxkYCBhbmRcbiAgICogYGNyZWF0ZU5leHRqc0Z1bmN0aW9uc2AgYXJlIHNoYXJlZCBoZXJlLCBidXQgdGhlIHByb3AgaXMgZGVjbGFyZWQgb24gdGhlXG4gICAqIHN1YmNsYXNzZXMsIHNvIG5vdGhpbmcgd2Vha2VyIHRoYW4gYSBjYXN0IGNhbiBzZWUgaXQuIEFkZGluZyBpdCB0b1xuICAgKiBgTmV4dGpzQmFzZVByb3BzYCB3b3VsZCBvZmZlciBpdCB0byBDb250YWluZXJzLCB3aGVyZSBpdCBkb2VzIG5vdGhpbmcuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGZ1bmN0aW9uR3JvdXBzKCk6IE5leHRqc0Z1bmN0aW9uR3JvdXBbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLmJhc2VQcm9wcyBhcyB7IGZ1bmN0aW9uR3JvdXBzPzogTmV4dGpzRnVuY3Rpb25Hcm91cFtdIH07XG4gICAgcmV0dXJuIHByb3BzLmZ1bmN0aW9uR3JvdXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBoZWFsdGggY2hlY2sgcGF0aCBhcyB0aGUgcnVubmluZyBhcHAgYWN0dWFsbHkgc2VydmVzIGl0LlxuICAgKlxuICAgKiBCb3RoIGNvbnN1bWVycyBvZiB0aGlzIGhpdCB0aGUgYXBwIGRpcmVjdGx5IOKAlCB0aGUgQUxCIHRhcmdldCBncm91cCBmb3J3YXJkc1xuICAgKiB0aGUgcGF0aCB0byB0aGUgY29udGFpbmVyIHVuY2hhbmdlZCwgYW5kIHRoZSBjb250YWluZXIncyBgd2dldGAgcHJvYmUgdGFyZ2V0c1xuICAgKiB0aGUgbG9jYWwgc2VydmVyIOKAlCBzbyB0aGUgcHJlZml4IHRoYXQgbWF0dGVycyBpcyB0aGUgYXBwJ3Mgb3duIGBiYXNlUGF0aGAsXG4gICAqIG5vdCBgcmVzb2x2ZWRCYXNlUGF0aGAgKHdoaWNoIGZvciBgUkVHSU9OQUxfQ09OVEFJTkVSU2AgaXMgb25seSBhbiBTM1xuICAgKiBuYW1lc3BhY2UpLiBMZWZ0IHVucHJlZml4ZWQsIGFuIGFwcCB3aXRoIGEgYGJhc2VQYXRoYCA0MDRzIGV2ZXJ5IGhlYWx0aFxuICAgKiBjaGVjaywgc28gdGhlIHRhcmdldCBuZXZlciB0dXJucyBoZWFsdGh5IGFuZCB0aGUgZGVwbG95bWVudCByb2xscyBiYWNrLlxuICAgKiBgaGVhbHRoQ2hlY2tQYXRoYCBpcyB0aGVyZWZvcmUgdGhlIHBhdGggYXMgdGhlIGFwcCByb3V0ZXMgaXQsIHdpdGhvdXRcbiAgICogYGJhc2VQYXRoYDsgb25lIHRoYXQgY2FycmllcyB0aGUgcHJlZml4IGFscmVhZHkgZ2V0cyBpdCB0d2ljZSwgd2hpY2ggaXMgdGhlXG4gICAqIDAuNi4yIGJyZWFraW5nIGNoYW5nZSBmb3IgYW55b25lIHdobyBwcmVmaXhlZCBieSBoYW5kIHRvIHdvcmsgYXJvdW5kIHRoaXMuXG4gICAqXG4gICAqIFRha2VzIHRoZSBwYXRoIGFzIGFuIGFyZ3VtZW50IHJhdGhlciB0aGFuIHJlYWRpbmcgaXQgb2ZmIGBiYXNlUHJvcHNgOiBvbmx5XG4gICAqIHRoZSB0d28gQ29udGFpbmVycyByb290IGNvbnN0cnVjdHMgZGVjbGFyZSBgaGVhbHRoQ2hlY2tQYXRoYCwgc2luY2UgdGhleSdyZVxuICAgKiB0aGUgb25seSBvbmVzIHdpdGggc29tZXRoaW5nIHRvIGhlYWx0aC1jaGVjay5cbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlZEhlYWx0aENoZWNrUGF0aChoZWFsdGhDaGVja1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHByZWZpeFdpdGhCYXNlUGF0aChcbiAgICAgIHRoaXMubmV4dGpzQnVpbGQubmV4dENvbmZpZ0Jhc2VQYXRoLFxuICAgICAgaGVhbHRoQ2hlY2tQYXRoLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbXB1dGUgYmFzZSBwcm9wcyBmb3IgYm90aCBMYW1iZGEgZnVuY3Rpb25zIGFuZCBjb250YWluZXJzXG4gICAqL1xuICBwcm90ZWN0ZWQgY29tcHV0ZUJhc2VQcm9wcygpOiBOZXh0anNDb21wdXRlQmFzZVByb3BzIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2FjaGVCdWNrZXQ6IHRoaXMubmV4dGpzQ2FjaGUuY2FjaGVCdWNrZXQsXG4gICAgICByZXZhbGlkYXRpb25UYWJsZTogdGhpcy5uZXh0anNDYWNoZS5yZXZhbGlkYXRpb25UYWJsZSxcbiAgICAgIGJ1aWxkSWQ6IHRoaXMubmV4dGpzQnVpbGQuYnVpbGRJZCxcbiAgICAgIG5leHRqc1R5cGU6IHRoaXMubmV4dGpzVHlwZSxcbiAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogdGhpcy5uZXh0anNTdGF0aWNBc3NldHMuYnVja2V0LFxuICAgICAgc3RhdGljQXNzZXRzS2V5UHJlZml4OiB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cy5rZXlQcmVmaXgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFmdGVyIHRoZSBpbml0IGNhY2hlIGFuZCBzdGF0aWMgYXNzZXQgdXBsb2FkczogaW52YWxpZGF0aW5nIHRoZSBDRE5cbiAgICogYmVmb3JlIHRoZSBuZXcgZmlsZXMgYXJlIGluIHBsYWNlIHdvdWxkIG9ubHkgcmUtY2FjaGUgdGhlIHJlc3BvbnNlcyB0aGVcbiAgICogaW52YWxpZGF0aW9uIHdhcyBtZWFudCB0byBkcm9wLCBhbmQgcHJ1bmluZyBiZWZvcmUgdGhlbSBjb3VsZCBkZWxldGUgYW5cbiAgICogb2JqZWN0IHRoZSB1cGxvYWQgaXMgYWJvdXQgdG8gcmUtdGFnIHdpdGggdGhpcyBidWlsZCdzIElELiBDbG91ZEZvcm1hdGlvblxuICAgKiBpbmZlcnMgbm8gb3JkZXJpbmcgYmV0d2VlbiB0aGVzZSBjdXN0b20gcmVzb3VyY2VzIG9uIGl0cyBvd24uXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlTmV4dGpzUG9zdERlcGxveShcbiAgICBkaXN0cmlidXRpb24/OiBJRGlzdHJpYnV0aW9uLFxuICApOiBOZXh0anNQb3N0RGVwbG95IHtcbiAgICBjb25zdCBwb3N0RGVwbG95ID0gbmV3IE5leHRqc1Bvc3REZXBsb3kodGhpcywgXCJOZXh0anNQb3N0RGVwbG95XCIsIHtcbiAgICAgIGJhc2VQYXRoOiB0aGlzLnJlc29sdmVkQmFzZVBhdGgsXG4gICAgICBidWlsZElkOiB0aGlzLm5leHRqc0J1aWxkLmJ1aWxkSWQsXG4gICAgICBkaXN0cmlidXRpb24sXG4gICAgICBjYWNoZUJ1Y2tldDogdGhpcy5uZXh0anNDYWNoZS5jYWNoZUJ1Y2tldCxcbiAgICAgIHJldmFsaWRhdGlvblRhYmxlOiB0aGlzLm5leHRqc0NhY2hlLnJldmFsaWRhdGlvblRhYmxlLFxuICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cy5idWNrZXQsXG4gICAgICBzdGF0aWNBc3NldHNLZXlQcmVmaXg6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmtleVByZWZpeCxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5iYXNlUHJvcHMub3ZlcnJpZGVzPy5uZXh0anNQb3N0RGVwbG95LFxuICAgICAgLi4udGhpcy5jb25zdHJ1Y3RPdmVycmlkZXM/Lm5leHRqc1Bvc3REZXBsb3lQcm9wcyxcbiAgICB9KTtcbiAgICBjb25zdCB7IHN0YXRpY0RlcGxveW1lbnQsIHNlcnZpY2VXb3JrZXJEZXBsb3ltZW50LCBwdWJsaWNEZXBsb3ltZW50IH0gPVxuICAgICAgdGhpcy5uZXh0anNTdGF0aWNBc3NldHM7XG4gICAgZm9yIChjb25zdCB1cGxvYWQgb2YgW1xuICAgICAgdGhpcy5uZXh0anNDYWNoZS5idWNrZXREZXBsb3ltZW50LFxuICAgICAgc3RhdGljRGVwbG95bWVudCxcbiAgICAgIHNlcnZpY2VXb3JrZXJEZXBsb3ltZW50LFxuICAgICAgcHVibGljRGVwbG95bWVudCxcbiAgICBdKSB7XG4gICAgICBpZiAodXBsb2FkKSB7XG4gICAgICAgIHBvc3REZXBsb3kubm9kZS5hZGREZXBlbmRlbmN5KHVwbG9hZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwb3N0RGVwbG95O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgU2VydmljZS1Xb3JrZXItQWxsb3dlZGAgdmFsdWUgZm9yIGBfbmV4dC9zdGF0aWMvc2VydmljZS13b3JrZXIvKmAsIG9yXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gdGhlIGJ1aWxkIGhhcyBubyBzZXJ2aWNlIHdvcmtlci4gVGhlIGFwcCdzIG93blxuICAgKiBgYmFzZVBhdGhgLCBhcyBgbmV4dCBidWlsZGAgdXNlcywgbm90IGByZXNvbHZlZEJhc2VQYXRoYDogaXQgaXMgdGhlIFVSTFxuICAgKiBzY29wZSB0aGUgYnJvd3NlciBjaGVja3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNlcnZpY2VXb3JrZXJBbGxvd2VkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cy5zZXJ2aWNlV29ya2VyRGVwbG95bWVudCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGAvJHt0aGlzLm5leHRqc0J1aWxkLm5leHRDb25maWdCYXNlUGF0aH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNCdWlsZCgpOiBOZXh0anNCdWlsZCB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNCdWlsZCh0aGlzLCBcIk5leHRqc0J1aWxkXCIsIHtcbiAgICAgIGJ1aWxkQ29tbWFuZDogdGhpcy5iYXNlUHJvcHMuYnVpbGRDb21tYW5kLFxuICAgICAgYnVpbGREaXJlY3Rvcnk6IHRoaXMuYmFzZVByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgbmV4dGpzVHlwZTogdGhpcy5uZXh0anNUeXBlLFxuICAgICAgc2tpcEJ1aWxkOiB0aGlzLmJhc2VQcm9wcy5za2lwQnVpbGQsXG4gICAgICAvLyBUaGUgYnVpbGQgcmVzb2x2ZXMgdGhlIHNwbGl0LCBzaW5jZSBvbmx5IGl0IGtub3dzIHRoZSByb3V0ZSB0ZW1wbGF0ZXM7XG4gICAgICAvLyB0aGUgY29uc3RydWN0cyByZWFkIHRoZSByZXN1bHQgYmFjayBvZmYgdGhlIG1hbmlmZXN0LlxuICAgICAgZnVuY3Rpb25Hcm91cHM6IHRoaXMuZnVuY3Rpb25Hcm91cHM/Lm1hcCgoeyBuYW1lLCByb3V0ZXMgfSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcm91dGVzLFxuICAgICAgfSkpLFxuICAgICAgLy8gV2hhdCB0aGUgTGFtYmRhcyB3aWxsIHJ1biBkZWNpZGVzIHRoZSBgc2hhcnBgIGJpbmFyaWVzIHN0YWdlZCBmb3IgdGhlbS5cbiAgICAgIGFyY2hpdGVjdHVyZTogdGhpcy5mdW5jdGlvbnNPdmVycmlkZXM/LmZ1bmN0aW9uUHJvcHM/LmFyY2hpdGVjdHVyZSxcbiAgICAgIC4uLnRoaXMuY29uc3RydWN0T3ZlcnJpZGVzPy5uZXh0anNCdWlsZFByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNDYWNoZSgpOiBOZXh0anNDYWNoZSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNDYWNoZSh0aGlzLCBcIk5leHRqc0NhY2hlXCIsIHtcbiAgICAgIGJ1aWxkSWQ6IHRoaXMubmV4dGpzQnVpbGQuYnVpbGRJZCxcbiAgICAgIGNhY2hlQnVja2V0OiB0aGlzLmJhc2VQcm9wcy5jYWNoZUJ1Y2tldCxcbiAgICAgIGluaXRDYWNoZURpcjogdGhpcy5uZXh0anNCdWlsZC5pbml0Q2FjaGVEaXIsXG4gICAgICBvdmVycmlkZXM6IHRoaXMuYmFzZVByb3BzLm92ZXJyaWRlcz8ubmV4dGpzQ2FjaGUsXG4gICAgICByZXZhbGlkYXRpb25UYWJsZTogdGhpcy5iYXNlUHJvcHMucmV2YWxpZGF0aW9uVGFibGUsXG4gICAgICAuLi50aGlzLmNvbnN0cnVjdE92ZXJyaWRlcz8ubmV4dGpzQ2FjaGVQcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTmV4dGpzU3RhdGljQXNzZXRzKCk6IE5leHRqc1N0YXRpY0Fzc2V0cyB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNTdGF0aWNBc3NldHModGhpcywgXCJOZXh0anNTdGF0aWNBc3NldHNcIiwge1xuICAgICAgYnVja2V0OiB0aGlzLmJhc2VQcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQsXG4gICAgICBidWlsZERpcmVjdG9yeTogdGhpcy5iYXNlUHJvcHMuYnVpbGREaXJlY3RvcnksXG4gICAgICBidWlsZElkOiB0aGlzLm5leHRqc0J1aWxkLmJ1aWxkSWQsXG4gICAgICBiYXNlUGF0aDogdGhpcy5yZXNvbHZlZEJhc2VQYXRoLFxuICAgICAgb3ZlcnJpZGVzOiB0aGlzLmJhc2VQcm9wcy5vdmVycmlkZXM/Lm5leHRqc1N0YXRpY0Fzc2V0cyxcbiAgICAgIC4uLnRoaXMuY29uc3RydWN0T3ZlcnJpZGVzPy5uZXh0anNTdGF0aWNBc3NldHNQcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZWQgYnkgYE5leHRqc0dsb2JhbEZ1bmN0aW9uc2AgYW5kIGBOZXh0anNSZWdpb25hbEZ1bmN0aW9uc2AuXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlTmV4dGpzRnVuY3Rpb25zKCk6IE5leHRqc0Z1bmN0aW9ucyB7XG4gICAgLy8gVGhlIGdldHRlciwgbm90IGEgcGFyYW1ldGVyLCBzbyB0aGUgYnVpbGQgYW5kIHRoZSBmdW5jdGlvbnMgcmVhZCB0aGVcbiAgICAvLyBzYW1lIGBhcmNoaXRlY3R1cmVgLlxuICAgIGNvbnN0IG92ZXJyaWRlcyA9IHRoaXMuZnVuY3Rpb25zT3ZlcnJpZGVzO1xuICAgIHJldHVybiBuZXcgTmV4dGpzRnVuY3Rpb25zKHRoaXMsIFwiTmV4dGpzRnVuY3Rpb25zXCIsIHtcbiAgICAgIC4uLnRoaXMuY29tcHV0ZUJhc2VQcm9wcygpLFxuICAgICAgZGVwbG95bWVudFJvb3RzOiB0aGlzLm5leHRqc0J1aWxkLmRlcGxveW1lbnRSb290cyxcbiAgICAgIGFyY2hpdGVjdHVyZTogdGhpcy5uZXh0anNCdWlsZC5hcmNoaXRlY3R1cmUsXG4gICAgICBmdW5jdGlvbkdyb3VwczogdGhpcy5mdW5jdGlvbkdyb3VwcyxcbiAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAuLi5vdmVycmlkZXMsXG4gICAgICAgIGZ1bmN0aW9uUHJvcHM6IHtcbiAgICAgICAgICAuLi5vdmVycmlkZXM/LmZ1bmN0aW9uUHJvcHMsXG4gICAgICAgICAgLy8gU3ByZWFkIGNvbmRpdGlvbmFsbHkgcmF0aGVyIHRoYW4gYXNzaWduZWQ6IGFuIHVuY29uZGl0aW9uYWxcbiAgICAgICAgICAvLyBgdnBjOiB0aGlzLmJhc2VQcm9wcy52cGNgIHdyaXRlcyBgdW5kZWZpbmVkYCBvdmVyIGFuXG4gICAgICAgICAgLy8gYG92ZXJyaWRlcy5uZXh0anNGdW5jdGlvbnMuZnVuY3Rpb25Qcm9wcy52cGNgIHRoZSBjb25zdW1lciBzdXBwbGllZCxcbiAgICAgICAgICAvLyBzbyB0aGUgTGFtYmRhcyBkZXBsb3kgb3V0c2lkZSB0aGUgVlBDIGFuZCBjYW5ub3QgcmVhY2ggYSBwcml2YXRlXG4gICAgICAgICAgLy8gUkRTLCBFbGFzdGlDYWNoZSwgb3IgVlBDIGVuZHBvaW50IC0gd2l0aCBub3RoaW5nIHNhaWQgYXQgc3ludGguXG4gICAgICAgICAgLi4uKHRoaXMuYmFzZVByb3BzLnZwYyA/IHsgdnBjOiB0aGlzLmJhc2VQcm9wcy52cGMgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Distribution } from "aws-cdk-lib/aws-cloudfront";
|
|
1
|
+
import { Distribution, FunctionCode, IKeyValueStore } from "aws-cdk-lib/aws-cloudfront";
|
|
2
2
|
import { ICluster } from "aws-cdk-lib/aws-ecs";
|
|
3
3
|
import { IApplicationLoadBalancer } from "aws-cdk-lib/aws-elasticloadbalancingv2";
|
|
4
4
|
import { Construct } from "constructs";
|
|
@@ -61,6 +61,21 @@ export interface NextjsGlobalContainersProps extends NextjsBaseProps {
|
|
|
61
61
|
* Override props of any construct.
|
|
62
62
|
*/
|
|
63
63
|
readonly overrides?: NextjsGlobalContainersOverrides;
|
|
64
|
+
/**
|
|
65
|
+
* CloudFront Function code run first on every viewer request, static assets
|
|
66
|
+
* included — HTTP Basic auth on a pre-launch site, say. It must define
|
|
67
|
+
* `viewerRequest(event)`, as a function or a `var`/`let`/`const`.
|
|
68
|
+
* @see NextjsDistributionProps.viewerRequestFunctionCode
|
|
69
|
+
* @default - none
|
|
70
|
+
*/
|
|
71
|
+
readonly viewerRequestFunctionCode?: FunctionCode;
|
|
72
|
+
/**
|
|
73
|
+
* A CloudFront KeyValueStore `viewerRequestFunctionCode` can read with
|
|
74
|
+
* `cf.kvs()`, so credentials stay out of the template.
|
|
75
|
+
* @see NextjsDistributionProps.viewerRequestKeyValueStore
|
|
76
|
+
* @default - none
|
|
77
|
+
*/
|
|
78
|
+
readonly viewerRequestKeyValueStore?: IKeyValueStore;
|
|
64
79
|
}
|
|
65
80
|
/**
|
|
66
81
|
* Deploy Next.js globally distributed with containers. Uses [CloudFront
|