wxt 0.2.5 → 0.3.0
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/dist/browser.d.ts +10 -0
- package/dist/browser.js +7 -0
- package/dist/cli.cjs +141 -117
- package/dist/index.cjs +133 -109
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.js +110 -86
- package/dist/index.js.map +1 -1
- package/package.json +5 -2
package/dist/cli.cjs
CHANGED
|
@@ -27,25 +27,39 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
27
27
|
var import_cac = __toESM(require("cac"), 1);
|
|
28
28
|
|
|
29
29
|
// package.json
|
|
30
|
-
var version = "0.
|
|
30
|
+
var version = "0.3.0";
|
|
31
31
|
|
|
32
32
|
// src/core/utils/getInternalConfig.ts
|
|
33
|
-
var
|
|
34
|
-
var
|
|
33
|
+
var import_node_path4 = __toESM(require("path"), 1);
|
|
34
|
+
var vite2 = __toESM(require("vite"), 1);
|
|
35
35
|
var import_consola = require("consola");
|
|
36
36
|
|
|
37
37
|
// src/core/utils/entrypoints.ts
|
|
38
|
+
var import_node_path2 = __toESM(require("path"), 1);
|
|
39
|
+
|
|
40
|
+
// src/core/utils/paths.ts
|
|
38
41
|
var import_node_path = __toESM(require("path"), 1);
|
|
42
|
+
var vite = __toESM(require("vite"), 1);
|
|
43
|
+
function normalizePath2(path5) {
|
|
44
|
+
return vite.normalizePath(path5);
|
|
45
|
+
}
|
|
46
|
+
function unnormalizePath(path5) {
|
|
47
|
+
return import_node_path.default.normalize(path5);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// src/core/utils/entrypoints.ts
|
|
39
51
|
function getEntrypointName(entrypointsDir, inputPath) {
|
|
40
|
-
const relativePath =
|
|
41
|
-
const name = relativePath.split(/[
|
|
52
|
+
const relativePath = import_node_path2.default.relative(entrypointsDir, inputPath);
|
|
53
|
+
const name = relativePath.split(/[\.\/\\]/, 2)[0];
|
|
42
54
|
return name;
|
|
43
55
|
}
|
|
44
56
|
function getEntrypointOutputFile(entrypoint, ext) {
|
|
45
|
-
return (0,
|
|
57
|
+
return (0, import_node_path2.resolve)(entrypoint.outputDir, `${entrypoint.name}${ext}`);
|
|
46
58
|
}
|
|
47
59
|
function getEntrypointBundlePath(entrypoint, outDir, ext) {
|
|
48
|
-
return (
|
|
60
|
+
return normalizePath2(
|
|
61
|
+
(0, import_node_path2.relative)(outDir, getEntrypointOutputFile(entrypoint, ext))
|
|
62
|
+
);
|
|
49
63
|
}
|
|
50
64
|
|
|
51
65
|
// src/core/vite-plugins/devHtmlPrerender.ts
|
|
@@ -199,7 +213,7 @@ function download(config) {
|
|
|
199
213
|
}
|
|
200
214
|
|
|
201
215
|
// src/core/vite-plugins/multipageMove.ts
|
|
202
|
-
var
|
|
216
|
+
var import_node_path3 = require("path");
|
|
203
217
|
var import_fs_extra = __toESM(require("fs-extra"), 1);
|
|
204
218
|
function multipageMove(entrypoints, config) {
|
|
205
219
|
return {
|
|
@@ -207,7 +221,7 @@ function multipageMove(entrypoints, config) {
|
|
|
207
221
|
async writeBundle(_, bundle) {
|
|
208
222
|
for (const oldBundlePath in bundle) {
|
|
209
223
|
const entrypoint = entrypoints.find(
|
|
210
|
-
(entry) => !!entry.inputPath.endsWith(oldBundlePath)
|
|
224
|
+
(entry) => !!normalizePath2(entry.inputPath).endsWith(oldBundlePath)
|
|
211
225
|
);
|
|
212
226
|
if (entrypoint == null) {
|
|
213
227
|
config.logger.debug("No entrypoint found for", oldBundlePath);
|
|
@@ -216,7 +230,7 @@ function multipageMove(entrypoints, config) {
|
|
|
216
230
|
const newBundlePath = getEntrypointBundlePath(
|
|
217
231
|
entrypoint,
|
|
218
232
|
config.outDir,
|
|
219
|
-
(0,
|
|
233
|
+
(0, import_node_path3.extname)(oldBundlePath)
|
|
220
234
|
);
|
|
221
235
|
if (newBundlePath === oldBundlePath) {
|
|
222
236
|
config.logger.debug(
|
|
@@ -225,9 +239,9 @@ function multipageMove(entrypoints, config) {
|
|
|
225
239
|
);
|
|
226
240
|
continue;
|
|
227
241
|
}
|
|
228
|
-
const oldAbsPath = (0,
|
|
229
|
-
const newAbsPath = (0,
|
|
230
|
-
await (0, import_fs_extra.ensureDir)((0,
|
|
242
|
+
const oldAbsPath = (0, import_node_path3.resolve)(config.outDir, oldBundlePath);
|
|
243
|
+
const newAbsPath = (0, import_node_path3.resolve)(config.outDir, newBundlePath);
|
|
244
|
+
await (0, import_fs_extra.ensureDir)((0, import_node_path3.dirname)(newAbsPath));
|
|
231
245
|
await import_fs_extra.default.move(oldAbsPath, newAbsPath, { overwrite: true });
|
|
232
246
|
const renamedChunk = {
|
|
233
247
|
...bundle[oldBundlePath],
|
|
@@ -248,11 +262,8 @@ var import_vite = require("vite");
|
|
|
248
262
|
function getUnimportOptions(config) {
|
|
249
263
|
const defaultOptions = {
|
|
250
264
|
debugLog: config.logger.debug,
|
|
251
|
-
imports: [
|
|
252
|
-
|
|
253
|
-
{ name: "defineConfig", from: "wxt" }
|
|
254
|
-
],
|
|
255
|
-
presets: [{ package: "wxt/client" }],
|
|
265
|
+
imports: [{ name: "defineConfig", from: "wxt" }],
|
|
266
|
+
presets: [{ package: "wxt/client" }, { package: "wxt/browser" }],
|
|
256
267
|
warn: config.logger.warn,
|
|
257
268
|
dirs: ["./components/*", "./composables/*", "./hooks/*", "./utils/*"]
|
|
258
269
|
};
|
|
@@ -300,7 +311,7 @@ function virtualEntrypoin(type, config) {
|
|
|
300
311
|
const index = id.indexOf(virtualId);
|
|
301
312
|
if (index === -1)
|
|
302
313
|
return;
|
|
303
|
-
const inputPath = id.substring(index + virtualId.length);
|
|
314
|
+
const inputPath = normalizePath2(id.substring(index + virtualId.length));
|
|
304
315
|
return resolvedVirtualId + inputPath;
|
|
305
316
|
},
|
|
306
317
|
async load(id) {
|
|
@@ -381,7 +392,7 @@ function getGlobals(config) {
|
|
|
381
392
|
{
|
|
382
393
|
name: "__BROWSER__",
|
|
383
394
|
value: config.browser,
|
|
384
|
-
type: `
|
|
395
|
+
type: `string`
|
|
385
396
|
},
|
|
386
397
|
{
|
|
387
398
|
name: "__IS_CHROME__",
|
|
@@ -419,12 +430,12 @@ function getGlobals(config) {
|
|
|
419
430
|
// src/core/utils/getInternalConfig.ts
|
|
420
431
|
var import_c12 = require("c12");
|
|
421
432
|
async function getInternalConfig(config, command) {
|
|
422
|
-
const root = config.root ?
|
|
433
|
+
const root = config.root ? import_node_path4.default.resolve(config.root) : process.cwd();
|
|
423
434
|
const mode = config.mode ?? (command === "build" ? "production" : "development");
|
|
424
435
|
const browser = config.browser ?? "chrome";
|
|
425
436
|
const manifestVersion = config.manifestVersion ?? (browser == "firefox" ? 2 : 3);
|
|
426
|
-
const outBaseDir =
|
|
427
|
-
const outDir =
|
|
437
|
+
const outBaseDir = import_node_path4.default.resolve(root, ".output");
|
|
438
|
+
const outDir = import_node_path4.default.resolve(outBaseDir, `${browser}-mv${manifestVersion}`);
|
|
428
439
|
const logger = config.logger ?? import_consola.consola;
|
|
429
440
|
const baseConfig = {
|
|
430
441
|
root,
|
|
@@ -457,22 +468,22 @@ async function getInternalConfig(config, command) {
|
|
|
457
468
|
});
|
|
458
469
|
userConfig = loaded.config ?? {};
|
|
459
470
|
}
|
|
460
|
-
const merged =
|
|
471
|
+
const merged = vite2.mergeConfig(
|
|
461
472
|
baseConfig,
|
|
462
473
|
userConfig
|
|
463
474
|
);
|
|
464
|
-
const srcDir = userConfig.srcDir ? (0,
|
|
465
|
-
const entrypointsDir = (0,
|
|
475
|
+
const srcDir = userConfig.srcDir ? (0, import_node_path4.resolve)(root, userConfig.srcDir) : root;
|
|
476
|
+
const entrypointsDir = (0, import_node_path4.resolve)(
|
|
466
477
|
srcDir,
|
|
467
478
|
userConfig.entrypointsDir ?? "entrypoints"
|
|
468
479
|
);
|
|
469
|
-
const publicDir = (0,
|
|
470
|
-
const wxtDir = (0,
|
|
471
|
-
const typesDir = (0,
|
|
480
|
+
const publicDir = (0, import_node_path4.resolve)(root, userConfig.publicDir ?? "public");
|
|
481
|
+
const wxtDir = (0, import_node_path4.resolve)(srcDir, ".wxt");
|
|
482
|
+
const typesDir = (0, import_node_path4.resolve)(wxtDir, "types");
|
|
472
483
|
const env = { mode, browser, manifestVersion, command };
|
|
473
484
|
const userManifest = await resolveManifestConfig(env, userConfig.manifest);
|
|
474
485
|
const inlineManifest = await resolveManifestConfig(env, config.manifest);
|
|
475
|
-
const manifest =
|
|
486
|
+
const manifest = vite2.mergeConfig(userManifest, inlineManifest);
|
|
476
487
|
const finalConfig = {
|
|
477
488
|
...merged,
|
|
478
489
|
srcDir,
|
|
@@ -534,7 +545,7 @@ async function resolveManifestConfig(env, manifest) {
|
|
|
534
545
|
|
|
535
546
|
// src/index.ts
|
|
536
547
|
var import_picocolors3 = __toESM(require("picocolors"), 1);
|
|
537
|
-
var
|
|
548
|
+
var vite6 = __toESM(require("vite"), 1);
|
|
538
549
|
|
|
539
550
|
// src/core/utils/arrays.ts
|
|
540
551
|
function every(array, predicate) {
|
|
@@ -607,11 +618,12 @@ function detectDevChanges(changedFiles, currentOutput) {
|
|
|
607
618
|
}
|
|
608
619
|
function findEffectedSteps(changedFile, currentOutput) {
|
|
609
620
|
const changes = [];
|
|
610
|
-
const changedPath = changedFile[1];
|
|
621
|
+
const changedPath = normalizePath2(changedFile[1]);
|
|
611
622
|
const isChunkEffected = (chunk) => (
|
|
612
623
|
// If it's an HTML file with the same path, is is effected because HTML files need to be pre-rendered
|
|
613
|
-
//
|
|
624
|
+
// fileName is normalized, relative bundle path
|
|
614
625
|
chunk.type === "asset" && changedPath.endsWith(chunk.fileName) || // If it's a chunk that depends on the changed file, it is effected
|
|
626
|
+
// moduleIds are absolute, normalized paths
|
|
615
627
|
chunk.type === "chunk" && chunk.moduleIds.includes(changedPath)
|
|
616
628
|
);
|
|
617
629
|
for (const step of currentOutput.steps) {
|
|
@@ -630,10 +642,10 @@ function findEffectedSteps(changedFile, currentOutput) {
|
|
|
630
642
|
// src/index.ts
|
|
631
643
|
var import_async_mutex = require("async-mutex");
|
|
632
644
|
var import_consola2 = require("consola");
|
|
633
|
-
var
|
|
645
|
+
var import_node_path7 = require("path");
|
|
634
646
|
|
|
635
647
|
// src/core/build/buildEntrypoints.ts
|
|
636
|
-
var
|
|
648
|
+
var vite3 = __toESM(require("vite"), 1);
|
|
637
649
|
|
|
638
650
|
// src/core/utils/removeEmptyDirs.ts
|
|
639
651
|
var import_fs_extra4 = __toESM(require("fs-extra"), 1);
|
|
@@ -654,9 +666,20 @@ async function removeEmptyDirs(dir) {
|
|
|
654
666
|
}
|
|
655
667
|
|
|
656
668
|
// src/core/build/buildEntrypoints.ts
|
|
657
|
-
var
|
|
658
|
-
var import_fs_extra5 = __toESM(require("fs-extra"), 1);
|
|
669
|
+
var import_fs_extra6 = __toESM(require("fs-extra"), 1);
|
|
659
670
|
var import_path6 = require("path");
|
|
671
|
+
|
|
672
|
+
// src/core/utils/public.ts
|
|
673
|
+
var import_fs_extra5 = __toESM(require("fs-extra"), 1);
|
|
674
|
+
var import_fast_glob = __toESM(require("fast-glob"), 1);
|
|
675
|
+
async function getPublicFiles(config) {
|
|
676
|
+
if (!await import_fs_extra5.default.exists(config.publicDir))
|
|
677
|
+
return [];
|
|
678
|
+
const files = await (0, import_fast_glob.default)("**/*", { cwd: config.publicDir });
|
|
679
|
+
return files.map(unnormalizePath);
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// src/core/build/buildEntrypoints.ts
|
|
660
683
|
async function buildEntrypoints(groups, config) {
|
|
661
684
|
const steps = [];
|
|
662
685
|
for (const group of groups) {
|
|
@@ -695,11 +718,11 @@ async function buildSingleEntrypoint(entrypoint, config) {
|
|
|
695
718
|
}
|
|
696
719
|
}
|
|
697
720
|
};
|
|
698
|
-
const entryConfig =
|
|
721
|
+
const entryConfig = vite3.mergeConfig(
|
|
699
722
|
libMode,
|
|
700
723
|
config.vite
|
|
701
724
|
);
|
|
702
|
-
const result = await
|
|
725
|
+
const result = await vite3.build(entryConfig);
|
|
703
726
|
return {
|
|
704
727
|
entrypoints: entrypoint,
|
|
705
728
|
chunks: getBuildOutputChunks(result)
|
|
@@ -725,11 +748,11 @@ async function buildMultipleEntrypoints(entrypoints, config) {
|
|
|
725
748
|
}
|
|
726
749
|
}
|
|
727
750
|
};
|
|
728
|
-
const entryConfig =
|
|
751
|
+
const entryConfig = vite3.mergeConfig(
|
|
729
752
|
multiPage,
|
|
730
753
|
config.vite
|
|
731
754
|
);
|
|
732
|
-
const result = await
|
|
755
|
+
const result = await vite3.build(entryConfig);
|
|
733
756
|
return {
|
|
734
757
|
entrypoints,
|
|
735
758
|
chunks: getBuildOutputChunks(result)
|
|
@@ -743,21 +766,21 @@ function getBuildOutputChunks(result) {
|
|
|
743
766
|
return result.output;
|
|
744
767
|
}
|
|
745
768
|
async function copyPublicDirectory(config) {
|
|
769
|
+
const files = await getPublicFiles(config);
|
|
770
|
+
if (files.length === 0)
|
|
771
|
+
return [];
|
|
746
772
|
const publicAssets = [];
|
|
747
|
-
if (!await import_fs_extra5.default.exists(config.publicDir))
|
|
748
|
-
return publicAssets;
|
|
749
|
-
const files = await (0, import_fast_glob.default)("**/*", { cwd: config.publicDir });
|
|
750
773
|
for (const file of files) {
|
|
751
774
|
const srcPath = (0, import_path6.resolve)(config.publicDir, file);
|
|
752
775
|
const outPath = (0, import_path6.resolve)(config.outDir, file);
|
|
753
|
-
await
|
|
754
|
-
await
|
|
776
|
+
await import_fs_extra6.default.ensureDir((0, import_path6.dirname)(outPath));
|
|
777
|
+
await import_fs_extra6.default.copyFile(srcPath, outPath);
|
|
755
778
|
publicAssets.push({
|
|
756
779
|
type: "asset",
|
|
757
780
|
fileName: file,
|
|
758
781
|
name: file,
|
|
759
782
|
needsCodeReference: false,
|
|
760
|
-
source: await
|
|
783
|
+
source: await import_fs_extra6.default.readFile(srcPath)
|
|
761
784
|
});
|
|
762
785
|
}
|
|
763
786
|
return publicAssets;
|
|
@@ -765,7 +788,7 @@ async function copyPublicDirectory(config) {
|
|
|
765
788
|
|
|
766
789
|
// src/core/build/findEntrypoints.ts
|
|
767
790
|
var import_path8 = require("path");
|
|
768
|
-
var
|
|
791
|
+
var import_fs_extra8 = __toESM(require("fs-extra"), 1);
|
|
769
792
|
var import_picomatch = __toESM(require("picomatch"), 1);
|
|
770
793
|
var import_linkedom2 = require("linkedom");
|
|
771
794
|
var import_json5 = __toESM(require("json5"), 1);
|
|
@@ -773,7 +796,7 @@ var import_json5 = __toESM(require("json5"), 1);
|
|
|
773
796
|
// src/core/utils/importTsFile.ts
|
|
774
797
|
var import_jiti = __toESM(require("jiti"), 1);
|
|
775
798
|
var import_unimport2 = require("unimport");
|
|
776
|
-
var
|
|
799
|
+
var import_fs_extra7 = __toESM(require("fs-extra"), 1);
|
|
777
800
|
var import_path7 = require("path");
|
|
778
801
|
var import_babel = __toESM(require("jiti/dist/babel"), 1);
|
|
779
802
|
|
|
@@ -791,14 +814,14 @@ function removeImportStatements(text) {
|
|
|
791
814
|
// src/core/utils/importTsFile.ts
|
|
792
815
|
async function importTsFile(path5, config) {
|
|
793
816
|
config.logger.debug("Loading file metadata:", path5);
|
|
817
|
+
const normalPath = normalizePath2(path5);
|
|
794
818
|
const unimport2 = (0, import_unimport2.createUnimport)({
|
|
795
819
|
...getUnimportOptions(config),
|
|
796
820
|
// Only allow specific imports, not all from the project
|
|
797
|
-
imports: [{ name: "*", as: "browser", from: "webextension-polyfill" }],
|
|
798
821
|
dirs: []
|
|
799
822
|
});
|
|
800
823
|
await unimport2.init();
|
|
801
|
-
const text = await
|
|
824
|
+
const text = await import_fs_extra7.default.readFile(path5, "utf-8");
|
|
802
825
|
const textNoImports = removeImportStatements(text);
|
|
803
826
|
const { code } = await unimport2.injectImports(textNoImports);
|
|
804
827
|
config.logger.debug(
|
|
@@ -815,7 +838,7 @@ async function importTsFile(path5, config) {
|
|
|
815
838
|
)
|
|
816
839
|
},
|
|
817
840
|
transform(opts) {
|
|
818
|
-
if (opts.filename ===
|
|
841
|
+
if (opts.filename === normalPath)
|
|
819
842
|
return (0, import_babel.default)({ ...opts, source: code });
|
|
820
843
|
else
|
|
821
844
|
return (0, import_babel.default)(opts);
|
|
@@ -908,7 +931,7 @@ ${JSON.stringify(
|
|
|
908
931
|
}
|
|
909
932
|
async function getPopupEntrypoint(config, path5) {
|
|
910
933
|
const options = {};
|
|
911
|
-
const content = await
|
|
934
|
+
const content = await import_fs_extra8.default.readFile(path5, "utf-8");
|
|
912
935
|
const { document } = (0, import_linkedom2.parseHTML)(content);
|
|
913
936
|
const title = document.querySelector("title");
|
|
914
937
|
if (title != null)
|
|
@@ -938,7 +961,7 @@ async function getPopupEntrypoint(config, path5) {
|
|
|
938
961
|
}
|
|
939
962
|
async function getOptionsEntrypoint(config, path5) {
|
|
940
963
|
const options = {};
|
|
941
|
-
const content = await
|
|
964
|
+
const content = await import_fs_extra8.default.readFile(path5, "utf-8");
|
|
942
965
|
const { document } = (0, import_linkedom2.parseHTML)(content);
|
|
943
966
|
const openInTabContent = document.querySelector("meta[name='manifest.open_in_tab']")?.getAttribute("content");
|
|
944
967
|
if (openInTabContent) {
|
|
@@ -1033,10 +1056,10 @@ var PATH_GLOB_TO_TYPE_MAP = {
|
|
|
1033
1056
|
|
|
1034
1057
|
// src/core/build/generateTypesDir.ts
|
|
1035
1058
|
var import_unimport3 = require("unimport");
|
|
1036
|
-
var
|
|
1059
|
+
var import_fs_extra9 = __toESM(require("fs-extra"), 1);
|
|
1037
1060
|
var import_path9 = require("path");
|
|
1038
1061
|
async function generateTypesDir(entrypoints, config) {
|
|
1039
|
-
await
|
|
1062
|
+
await import_fs_extra9.default.ensureDir(config.typesDir);
|
|
1040
1063
|
const references = [];
|
|
1041
1064
|
references.push(await writeImportsDeclarationFile(config));
|
|
1042
1065
|
references.push(await writePathsDeclarationFile(entrypoints, config));
|
|
@@ -1048,7 +1071,7 @@ async function writeImportsDeclarationFile(config) {
|
|
|
1048
1071
|
const filePath = (0, import_path9.resolve)(config.typesDir, "imports.d.ts");
|
|
1049
1072
|
const unimport2 = (0, import_unimport3.createUnimport)(getUnimportOptions(config));
|
|
1050
1073
|
await unimport2.scanImportsFromDir(void 0, { cwd: config.srcDir });
|
|
1051
|
-
await
|
|
1074
|
+
await import_fs_extra9.default.writeFile(
|
|
1052
1075
|
filePath,
|
|
1053
1076
|
["// Generated by wxt", await unimport2.generateTypeDeclarations()].join(
|
|
1054
1077
|
"\n"
|
|
@@ -1058,28 +1081,34 @@ async function writeImportsDeclarationFile(config) {
|
|
|
1058
1081
|
}
|
|
1059
1082
|
async function writePathsDeclarationFile(entrypoints, config) {
|
|
1060
1083
|
const filePath = (0, import_path9.resolve)(config.typesDir, "paths.d.ts");
|
|
1061
|
-
const unions = entrypoints.map(
|
|
1062
|
-
|
|
1084
|
+
const unions = entrypoints.map(
|
|
1085
|
+
(entry) => getEntrypointBundlePath(
|
|
1063
1086
|
entry,
|
|
1064
1087
|
config.outDir,
|
|
1065
1088
|
entry.inputPath.endsWith(".html") ? ".html" : ".js"
|
|
1066
|
-
)
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1089
|
+
)
|
|
1090
|
+
).concat(await getPublicFiles(config)).map(normalizePath2).map((path5) => ` | "/${path5}"`).sort().join("\n");
|
|
1091
|
+
const template = `// Generated by wxt
|
|
1092
|
+
import "wxt/browser";
|
|
1093
|
+
|
|
1094
|
+
declare module "wxt/browser" {
|
|
1095
|
+
type PublicPath =
|
|
1096
|
+
{{ union }}
|
|
1097
|
+
export interface ProjectRuntime extends Runtime.Static {
|
|
1098
|
+
getURL(path: PublicPath): string;
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
`;
|
|
1102
|
+
await import_fs_extra9.default.writeFile(
|
|
1070
1103
|
filePath,
|
|
1071
|
-
|
|
1072
|
-
"// Generated by wxt",
|
|
1073
|
-
"type EntrypointPath =",
|
|
1074
|
-
...unions.length === 0 ? [" never"] : unions
|
|
1075
|
-
].join("\n") + "\n"
|
|
1104
|
+
template.replace("{{ union }}", unions || " | never")
|
|
1076
1105
|
);
|
|
1077
1106
|
return filePath;
|
|
1078
1107
|
}
|
|
1079
1108
|
async function writeGlobalsDeclarationFile(config) {
|
|
1080
1109
|
const filePath = (0, import_path9.resolve)(config.typesDir, "globals.d.ts");
|
|
1081
1110
|
const globals = getGlobals(config);
|
|
1082
|
-
await
|
|
1111
|
+
await import_fs_extra9.default.writeFile(
|
|
1083
1112
|
filePath,
|
|
1084
1113
|
[
|
|
1085
1114
|
"// Generated by wxt",
|
|
@@ -1095,13 +1124,13 @@ async function writeGlobalsDeclarationFile(config) {
|
|
|
1095
1124
|
async function writeMainDeclarationFile(references, config) {
|
|
1096
1125
|
const dir = config.wxtDir;
|
|
1097
1126
|
const filePath = (0, import_path9.resolve)(dir, "wxt.d.ts");
|
|
1098
|
-
await
|
|
1127
|
+
await import_fs_extra9.default.writeFile(
|
|
1099
1128
|
filePath,
|
|
1100
1129
|
[
|
|
1101
1130
|
"// Generated by wxt",
|
|
1102
1131
|
`/// <reference types="vite/client" />`,
|
|
1103
1132
|
...references.map(
|
|
1104
|
-
(ref) => `/// <reference types="./${(0, import_path9.relative)(dir, ref)}" />`
|
|
1133
|
+
(ref) => `/// <reference types="./${normalizePath2((0, import_path9.relative)(dir, ref))}" />`
|
|
1105
1134
|
)
|
|
1106
1135
|
].join("\n") + "\n"
|
|
1107
1136
|
);
|
|
@@ -1109,7 +1138,7 @@ async function writeMainDeclarationFile(references, config) {
|
|
|
1109
1138
|
}
|
|
1110
1139
|
async function writeTsConfigFile(mainReference, config) {
|
|
1111
1140
|
const dir = config.wxtDir;
|
|
1112
|
-
await
|
|
1141
|
+
await import_fs_extra9.default.writeFile(
|
|
1113
1142
|
(0, import_path9.resolve)(dir, "tsconfig.json"),
|
|
1114
1143
|
`{
|
|
1115
1144
|
"compilerOptions": {
|
|
@@ -1120,37 +1149,32 @@ async function writeTsConfigFile(mainReference, config) {
|
|
|
1120
1149
|
"esModuleInterop": true,
|
|
1121
1150
|
"forceConsistentCasingInFileNames": true,
|
|
1122
1151
|
"resolveJsonModule": true,
|
|
1123
|
-
|
|
1124
|
-
/* Type Checking */
|
|
1125
1152
|
"strict": true,
|
|
1126
|
-
|
|
1127
|
-
/* Completeness */
|
|
1153
|
+
"lib": ["DOM", "WebWorker"],
|
|
1128
1154
|
"skipLibCheck": true,
|
|
1129
|
-
|
|
1130
|
-
/* Aliases */
|
|
1131
|
-
"baseUrl": "${(0, import_path9.relative)(dir, config.root)}",
|
|
1155
|
+
"baseUrl": "${normalizePath2((0, import_path9.relative)(dir, config.root))}",
|
|
1132
1156
|
"paths": {
|
|
1133
1157
|
"@@": ["."],
|
|
1134
1158
|
"@@/*": ["./*"],
|
|
1135
1159
|
"~~": ["."],
|
|
1136
1160
|
"~~/*": ["./*"],
|
|
1137
|
-
"@": ["${(0, import_path9.relative)(config.root, config.srcDir)}"],
|
|
1138
|
-
"@/*": ["${(0, import_path9.relative)(config.root, config.srcDir)}/*"],
|
|
1139
|
-
"~": ["${(0, import_path9.relative)(config.root, config.srcDir)}"],
|
|
1140
|
-
"~/*": ["${(0, import_path9.relative)(config.root, config.srcDir)}/*"]
|
|
1161
|
+
"@": ["${normalizePath2((0, import_path9.relative)(config.root, config.srcDir))}"],
|
|
1162
|
+
"@/*": ["${normalizePath2((0, import_path9.relative)(config.root, config.srcDir))}/*"],
|
|
1163
|
+
"~": ["${normalizePath2((0, import_path9.relative)(config.root, config.srcDir))}"],
|
|
1164
|
+
"~/*": ["${normalizePath2((0, import_path9.relative)(config.root, config.srcDir))}/*"]
|
|
1141
1165
|
}
|
|
1142
1166
|
},
|
|
1143
1167
|
"include": [
|
|
1144
|
-
"${(0, import_path9.relative)(dir, config.root)}/**/*",
|
|
1145
|
-
"./${(0, import_path9.relative)(dir, mainReference)}"
|
|
1168
|
+
"${normalizePath2((0, import_path9.relative)(dir, config.root))}/**/*",
|
|
1169
|
+
"./${normalizePath2((0, import_path9.relative)(dir, mainReference))}"
|
|
1146
1170
|
],
|
|
1147
|
-
"exclude": ["${(0, import_path9.relative)(dir, config.outBaseDir)}"]
|
|
1171
|
+
"exclude": ["${normalizePath2((0, import_path9.relative)(dir, config.outBaseDir))}"]
|
|
1148
1172
|
}`
|
|
1149
1173
|
);
|
|
1150
1174
|
}
|
|
1151
1175
|
|
|
1152
1176
|
// src/core/utils/manifest.ts
|
|
1153
|
-
var
|
|
1177
|
+
var import_fs_extra11 = __toESM(require("fs-extra"), 1);
|
|
1154
1178
|
var import_path10 = require("path");
|
|
1155
1179
|
|
|
1156
1180
|
// src/core/utils/ContentSecurityPolicy.ts
|
|
@@ -1235,12 +1259,12 @@ function mapWxtOptionsToContentScript(options) {
|
|
|
1235
1259
|
}
|
|
1236
1260
|
|
|
1237
1261
|
// src/core/utils/package.ts
|
|
1238
|
-
var
|
|
1239
|
-
var
|
|
1262
|
+
var import_node_path5 = require("path");
|
|
1263
|
+
var import_fs_extra10 = __toESM(require("fs-extra"), 1);
|
|
1240
1264
|
async function getPackageJson(config) {
|
|
1241
|
-
const file = (0,
|
|
1265
|
+
const file = (0, import_node_path5.resolve)(config.root, "package.json");
|
|
1242
1266
|
try {
|
|
1243
|
-
return await
|
|
1267
|
+
return await import_fs_extra10.default.readJson(file);
|
|
1244
1268
|
} catch (err) {
|
|
1245
1269
|
config.logger.debug(
|
|
1246
1270
|
`Failed to read package.json at: ${file}. Returning undefined.`
|
|
@@ -1252,8 +1276,8 @@ async function getPackageJson(config) {
|
|
|
1252
1276
|
// src/core/utils/manifest.ts
|
|
1253
1277
|
async function writeManifest(manifest, output, config) {
|
|
1254
1278
|
const str = config.mode === "production" ? JSON.stringify(manifest) : JSON.stringify(manifest, null, 2);
|
|
1255
|
-
await
|
|
1256
|
-
await
|
|
1279
|
+
await import_fs_extra11.default.ensureDir(config.outDir);
|
|
1280
|
+
await import_fs_extra11.default.writeFile((0, import_path10.resolve)(config.outDir, "manifest.json"), str, "utf-8");
|
|
1257
1281
|
output.publicAssets.unshift({
|
|
1258
1282
|
type: "asset",
|
|
1259
1283
|
fileName: "manifest.json",
|
|
@@ -1534,8 +1558,8 @@ function addHostPermission(manifest, hostPermission) {
|
|
|
1534
1558
|
|
|
1535
1559
|
// src/core/build.ts
|
|
1536
1560
|
var import_picocolors2 = __toESM(require("picocolors"), 1);
|
|
1537
|
-
var
|
|
1538
|
-
var
|
|
1561
|
+
var vite4 = __toESM(require("vite"), 1);
|
|
1562
|
+
var import_fs_extra13 = __toESM(require("fs-extra"), 1);
|
|
1539
1563
|
|
|
1540
1564
|
// src/core/utils/groupEntrypoints.ts
|
|
1541
1565
|
function groupEntrypoints(entrypoints) {
|
|
@@ -1586,9 +1610,9 @@ function formatDuration(duration) {
|
|
|
1586
1610
|
var import_path11 = require("path");
|
|
1587
1611
|
|
|
1588
1612
|
// src/core/log/printFileList.ts
|
|
1589
|
-
var
|
|
1613
|
+
var import_node_path6 = __toESM(require("path"), 1);
|
|
1590
1614
|
var import_picocolors = __toESM(require("picocolors"), 1);
|
|
1591
|
-
var
|
|
1615
|
+
var import_fs_extra12 = __toESM(require("fs-extra"), 1);
|
|
1592
1616
|
var import_filesize = require("filesize");
|
|
1593
1617
|
|
|
1594
1618
|
// src/core/log/printTable.ts
|
|
@@ -1623,12 +1647,12 @@ async function printFileList(log, baseDir, files) {
|
|
|
1623
1647
|
const fileRows = await Promise.all(
|
|
1624
1648
|
files.map(async (file, i) => {
|
|
1625
1649
|
const parts = [
|
|
1626
|
-
|
|
1627
|
-
|
|
1650
|
+
import_node_path6.default.relative(process.cwd(), baseDir) + import_node_path6.default.sep,
|
|
1651
|
+
import_node_path6.default.relative(baseDir, file)
|
|
1628
1652
|
];
|
|
1629
1653
|
const prefix = i === files.length - 1 ? " \u2514\u2500" : " \u251C\u2500";
|
|
1630
1654
|
const color = getChunkColor(file);
|
|
1631
|
-
const stats = await
|
|
1655
|
+
const stats = await import_fs_extra12.default.lstat(file);
|
|
1632
1656
|
totalSize += stats.size;
|
|
1633
1657
|
const size = String((0, import_filesize.filesize)(stats.size));
|
|
1634
1658
|
return [
|
|
@@ -1688,12 +1712,12 @@ async function buildInternal(config) {
|
|
|
1688
1712
|
const target = `${config.browser}-mv${config.manifestVersion}`;
|
|
1689
1713
|
config.logger.info(
|
|
1690
1714
|
`${verb} ${import_picocolors2.default.cyan(target)} for ${import_picocolors2.default.cyan(config.mode)} with ${import_picocolors2.default.green(
|
|
1691
|
-
`Vite ${
|
|
1715
|
+
`Vite ${vite4.version}`
|
|
1692
1716
|
)}`
|
|
1693
1717
|
);
|
|
1694
1718
|
const startTime = Date.now();
|
|
1695
|
-
await
|
|
1696
|
-
await
|
|
1719
|
+
await import_fs_extra13.default.rm(config.outDir, { recursive: true, force: true });
|
|
1720
|
+
await import_fs_extra13.default.ensureDir(config.outDir);
|
|
1697
1721
|
const entrypoints = await findEntrypoints(config);
|
|
1698
1722
|
const groups = groupEntrypoints(entrypoints);
|
|
1699
1723
|
const { output } = await rebuild(config, groups, void 0);
|
|
@@ -1742,7 +1766,7 @@ async function rebuild(config, entrypointGroups, existingOutput = {
|
|
|
1742
1766
|
}
|
|
1743
1767
|
|
|
1744
1768
|
// src/core/server.ts
|
|
1745
|
-
var
|
|
1769
|
+
var vite5 = __toESM(require("vite"), 1);
|
|
1746
1770
|
|
|
1747
1771
|
// src/core/runners/createWebExtRunner.ts
|
|
1748
1772
|
function createWebExtRunner() {
|
|
@@ -1821,8 +1845,8 @@ async function getServerInfo() {
|
|
|
1821
1845
|
}
|
|
1822
1846
|
async function setupServer(serverInfo, config) {
|
|
1823
1847
|
const runner = createWebExtRunner();
|
|
1824
|
-
const viteServer = await
|
|
1825
|
-
|
|
1848
|
+
const viteServer = await vite5.createServer(
|
|
1849
|
+
vite5.mergeConfig(serverInfo, config.vite)
|
|
1826
1850
|
);
|
|
1827
1851
|
const start = async () => {
|
|
1828
1852
|
await viteServer.listen(server.port);
|
|
@@ -1895,7 +1919,7 @@ async function build2(config) {
|
|
|
1895
1919
|
async function createServer2(config) {
|
|
1896
1920
|
const serverInfo = await getServerInfo();
|
|
1897
1921
|
const getLatestInternalConfig = () => {
|
|
1898
|
-
const viteConfig =
|
|
1922
|
+
const viteConfig = vite6.mergeConfig(
|
|
1899
1923
|
serverInfo.viteServerConfig,
|
|
1900
1924
|
config?.vite ?? {}
|
|
1901
1925
|
);
|
|
@@ -1921,11 +1945,11 @@ async function createServer2(config) {
|
|
|
1921
1945
|
if (changes.type === "no-change")
|
|
1922
1946
|
return;
|
|
1923
1947
|
internalConfig.logger.info(
|
|
1924
|
-
`Changed: ${Array.from(new Set(fileChanges.map((change) => change[1]))).map((file) => import_picocolors3.default.dim((0,
|
|
1948
|
+
`Changed: ${Array.from(new Set(fileChanges.map((change) => change[1]))).map((file) => import_picocolors3.default.dim((0, import_node_path7.relative)(internalConfig.root, file))).join(", ")}`
|
|
1925
1949
|
);
|
|
1926
1950
|
const rebuiltNames = changes.rebuildGroups.flat().map((entry) => {
|
|
1927
1951
|
return import_picocolors3.default.cyan(
|
|
1928
|
-
(0,
|
|
1952
|
+
(0, import_node_path7.relative)(internalConfig.outDir, getEntrypointOutputFile(entry, ""))
|
|
1929
1953
|
);
|
|
1930
1954
|
}).join(import_picocolors3.default.dim(", "));
|
|
1931
1955
|
internalConfig = await getLatestInternalConfig();
|
|
@@ -2042,34 +2066,34 @@ var publish = defineCommand(
|
|
|
2042
2066
|
|
|
2043
2067
|
// src/core/zip.ts
|
|
2044
2068
|
var import_zip_dir = __toESM(require("zip-dir"), 1);
|
|
2045
|
-
var
|
|
2046
|
-
var
|
|
2069
|
+
var import_node_path8 = require("path");
|
|
2070
|
+
var import_fs_extra14 = __toESM(require("fs-extra"), 1);
|
|
2047
2071
|
var import_minimatch = require("minimatch");
|
|
2048
2072
|
async function zipExtension(config, buildOutput) {
|
|
2049
2073
|
const start = Date.now();
|
|
2050
2074
|
config.logger.info("Zipping extension...");
|
|
2051
2075
|
const zipFiles = [];
|
|
2052
2076
|
const projectName = config.zip.name ?? kebabCaseAlphanumeric(
|
|
2053
|
-
(await getPackageJson(config))?.name || (0,
|
|
2077
|
+
(await getPackageJson(config))?.name || (0, import_node_path8.dirname)(process.cwd())
|
|
2054
2078
|
);
|
|
2055
2079
|
const applyTemplate = (template) => template.replaceAll("{{name}}", projectName).replaceAll("{{browser}}", config.browser).replaceAll(
|
|
2056
2080
|
"{{version}}",
|
|
2057
2081
|
buildOutput.manifest.version_name ?? buildOutput.manifest.version
|
|
2058
2082
|
).replaceAll("{{manifestVersion}}", `mv${config.manifestVersion}`);
|
|
2059
|
-
await
|
|
2083
|
+
await import_fs_extra14.default.ensureDir(config.outBaseDir);
|
|
2060
2084
|
const outZipFilename = applyTemplate(config.zip.artifactTemplate);
|
|
2061
|
-
const outZipPath = (0,
|
|
2085
|
+
const outZipPath = (0, import_node_path8.resolve)(config.outBaseDir, outZipFilename);
|
|
2062
2086
|
await (0, import_zip_dir.default)(config.outDir, {
|
|
2063
2087
|
saveTo: outZipPath
|
|
2064
2088
|
});
|
|
2065
2089
|
zipFiles.push(outZipPath);
|
|
2066
2090
|
if (config.browser === "firefox") {
|
|
2067
2091
|
const sourcesZipFilename = applyTemplate(config.zip.sourcesTemplate);
|
|
2068
|
-
const sourcesZipPath = (0,
|
|
2092
|
+
const sourcesZipPath = (0, import_node_path8.resolve)(config.outBaseDir, sourcesZipFilename);
|
|
2069
2093
|
await (0, import_zip_dir.default)(config.zip.sourcesRoot, {
|
|
2070
2094
|
saveTo: sourcesZipPath,
|
|
2071
2095
|
filter(path5) {
|
|
2072
|
-
const relativePath = (0,
|
|
2096
|
+
const relativePath = (0, import_node_path8.relative)(config.zip.sourcesRoot, path5);
|
|
2073
2097
|
const matchedPattern = config.zip.ignoredSources.find(
|
|
2074
2098
|
(pattern) => (0, import_minimatch.minimatch)(relativePath, pattern)
|
|
2075
2099
|
);
|
|
@@ -2111,4 +2135,4 @@ cli.command("prepare [root]", "prepare").option("-c, --config <file>", "use spec
|
|
|
2111
2135
|
cli.command("publish [root]", "publish to stores").action(publish);
|
|
2112
2136
|
cli.command("init [directory]", "initialize a new project").action(init);
|
|
2113
2137
|
cli.parse();
|
|
2114
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaS9pbmRleC50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ2V0SW50ZXJuYWxDb25maWcudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZW50cnlwb2ludHMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2Rldkh0bWxQcmVyZW5kZXIudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2RldlNlcnZlckdsb2JhbHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvbmV0d29yay50cyIsICIuLi9zcmMvY29yZS91dGlscy9wcm9taXNlcy50cyIsICIuLi9zcmMvY29yZS92aXRlLXBsdWdpbnMvZG93bmxvYWQudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL211bHRpcGFnZU1vdmUudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL3VuaW1wb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2F1dG8taW1wb3J0cy50cyIsICIuLi9zcmMvY29yZS92aXRlLXBsdWdpbnMvdmlydHVhbEVudHJ5cG9pbnQudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL3RzY29uZmlnUGF0aHMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL25vb3BCYWNrZ3JvdW5kLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2NyZWF0ZUZzQ2FjaGUudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ2xvYmFscy50cyIsICIuLi9zcmMvaW5kZXgudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvYXJyYXlzLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2RldGVjdERldkNoYW5nZXMudHMiLCAiLi4vc3JjL2NvcmUvYnVpbGQvYnVpbGRFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9yZW1vdmVFbXB0eURpcnMudHMiLCAiLi4vc3JjL2NvcmUvYnVpbGQvZmluZEVudHJ5cG9pbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2ltcG9ydFRzRmlsZS50cyIsICIuLi9zcmMvY29yZS91dGlscy9zdHJpbmdzLnRzIiwgIi4uL3NyYy9jb3JlL2J1aWxkL2dlbmVyYXRlVHlwZXNEaXIudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvbWFuaWZlc3QudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvQ29udGVudFNlY3VyaXR5UG9saWN5LnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2NvbnRlbnQtc2NyaXB0cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9wYWNrYWdlLnRzIiwgIi4uL3NyYy9jb3JlL2J1aWxkLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2dyb3VwRW50cnlwb2ludHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZm9ybWF0RHVyYXRpb24udHMiLCAiLi4vc3JjL2NvcmUvbG9nL3ByaW50QnVpbGRTdW1tYXJ5LnRzIiwgIi4uL3NyYy9jb3JlL2xvZy9wcmludEZpbGVMaXN0LnRzIiwgIi4uL3NyYy9jb3JlL2xvZy9wcmludFRhYmxlLnRzIiwgIi4uL3NyYy9jb3JlL3NlcnZlci50cyIsICIuLi9zcmMvY29yZS9ydW5uZXJzL2NyZWF0ZVdlYkV4dFJ1bm5lci50cyIsICIuLi9zcmMvY2xpL3V0aWxzL2RlZmluZUNvbW1hbmQudHMiLCAiLi4vc3JjL2NvcmUvbG9nL3ByaW50SGVhZGVyLnRzIiwgIi4uL3NyYy9jbGkvY29tbWFuZHMvYnVpbGQudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9kZXYudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9pbml0LnRzIiwgIi4uL3NyYy9jbGkvY29tbWFuZHMvcHJlcGFyZS50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL3B1Ymxpc2gudHMiLCAiLi4vc3JjL2NvcmUvemlwLnRzIiwgIi4uL3NyYy9jbGkvY29tbWFuZHMvemlwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCBjYWMgZnJvbSAnY2FjJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0ICogYXMgY29tbWFuZHMgZnJvbSAnLi9jb21tYW5kcyc7XG5cbmNvbnN0IGNsaSA9IGNhYygnd3h0Jyk7XG5jbGkuaGVscCgpO1xuY2xpLnZlcnNpb24odmVyc2lvbik7XG5cbi8vIERFVlxuY2xpXG4gIC5jb21tYW5kKCdbcm9vdF0nLCAnc3RhcnQgZGV2IHNlcnZlcicpXG4gIC5vcHRpb24oJy1jLCAtLWNvbmZpZyA8ZmlsZT4nLCAndXNlIHNwZWNpZmllZCBjb25maWcgZmlsZScpXG4gIC5vcHRpb24oJy1tLCAtLW1vZGUgPG1vZGU+JywgJ3NldCBlbnYgbW9kZScpXG4gIC5vcHRpb24oJy1iLCAtLWJyb3dzZXIgPGJyb3dzZXI+JywgJ3NwZWNpZnkgYSBicm93c2VyJylcbiAgLm9wdGlvbignLS1tdjMnLCAndGFyZ2V0IG1hbmlmZXN0IHYzJylcbiAgLm9wdGlvbignLS1tdjInLCAndGFyZ2V0IG1hbmlmZXN0IHYyJylcbiAgLmFjdGlvbihjb21tYW5kcy5kZXYpO1xuXG4vLyBCVUlMRFxuY2xpXG4gIC5jb21tYW5kKCdidWlsZCBbcm9vdF0nLCAnYnVpbGQgZm9yIHByb2R1Y3Rpb24nKVxuICAub3B0aW9uKCctYywgLS1jb25maWcgPGZpbGU+JywgJ3VzZSBzcGVjaWZpZWQgY29uZmlnIGZpbGUnKVxuICAub3B0aW9uKCctbSwgLS1tb2RlIDxtb2RlPicsICdzZXQgZW52IG1vZGUnKVxuICAub3B0aW9uKCctYiwgLS1icm93c2VyIDxicm93c2VyPicsICdzcGVjaWZ5IGEgYnJvd3NlcicpXG4gIC5vcHRpb24oJy0tbXYzJywgJ3RhcmdldCBtYW5pZmVzdCB2MycpXG4gIC5vcHRpb24oJy0tbXYyJywgJ3RhcmdldCBtYW5pZmVzdCB2MicpXG4gIC5hY3Rpb24oY29tbWFuZHMuYnVpbGQpO1xuXG4vLyBaSVBcbmNsaVxuICAuY29tbWFuZCgnemlwIFtyb290XScsICdidWlsZCBmb3IgcHJvZHVjdGlvbiBhbmQgemlwIG91dHB1dCcpXG4gIC5vcHRpb24oJy1jLCAtLWNvbmZpZyA8ZmlsZT4nLCAndXNlIHNwZWNpZmllZCBjb25maWcgZmlsZScpXG4gIC5vcHRpb24oJy1tLCAtLW1vZGUgPG1vZGU+JywgJ3NldCBlbnYgbW9kZScpXG4gIC5vcHRpb24oJy1iLCAtLWJyb3dzZXIgPGJyb3dzZXI+JywgJ3NwZWNpZnkgYSBicm93c2VyJylcbiAgLm9wdGlvbignLS1tdjMnLCAndGFyZ2V0IG1hbmlmZXN0IHYzJylcbiAgLm9wdGlvbignLS1tdjInLCAndGFyZ2V0IG1hbmlmZXN0IHYyJylcbiAgLmFjdGlvbihjb21tYW5kcy56aXApO1xuXG4vLyBQUkVQQVJFXG5jbGlcbiAgLmNvbW1hbmQoJ3ByZXBhcmUgW3Jvb3RdJywgJ3ByZXBhcmUnKVxuICAub3B0aW9uKCctYywgLS1jb25maWcgPGZpbGU+JywgJ3VzZSBzcGVjaWZpZWQgY29uZmlnIGZpbGUnKVxuICAuYWN0aW9uKGNvbW1hbmRzLnByZXBhcmUpO1xuXG4vLyBQVUJMSVNIXG5jbGkuY29tbWFuZCgncHVibGlzaCBbcm9vdF0nLCAncHVibGlzaCB0byBzdG9yZXMnKS5hY3Rpb24oY29tbWFuZHMucHVibGlzaCk7XG5cbi8vIElOSVRcbmNsaVxuICAuY29tbWFuZCgnaW5pdCBbZGlyZWN0b3J5XScsICdpbml0aWFsaXplIGEgbmV3IHByb2plY3QnKVxuICAuYWN0aW9uKGNvbW1hbmRzLmluaXQpO1xuXG5jbGkucGFyc2UoKTtcbiIsICJ7XG4gIFwibmFtZVwiOiBcInd4dFwiLFxuICBcInR5cGVcIjogXCJtb2R1bGVcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMC4yLjVcIixcbiAgXCJkZXNjcmlwdGlvblwiOiBcIk5leHQgZ2VuIGZyYW1ld29yayBmb3IgZGV2ZWxvcGluZyB3ZWIgZXh0ZW5zaW9uc1wiLFxuICBcImVuZ2luZXNcIjoge1xuICAgIFwibm9kZVwiOiBcIj49MTguMTYuMFwiLFxuICAgIFwicG5wbVwiOiBcIj49OFwiXG4gIH0sXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vYWtsaW5rZXIxL3d4dFwiXG4gIH0sXG4gIFwia2V5d29yZHNcIjogW1xuICAgIFwidml0ZVwiLFxuICAgIFwiY2hyb21lXCIsXG4gICAgXCJ3ZWJcIixcbiAgICBcImV4dGVuc2lvblwiLFxuICAgIFwiYnJvd3NlclwiLFxuICAgIFwiYnVuZGxlclwiLFxuICAgIFwiZnJhbWV3b3JrXCJcbiAgXSxcbiAgXCJhdXRob3JcIjoge1xuICAgIFwibmFtZVwiOiBcIkFhcm9uIEtsaW5rZXJcIixcbiAgICBcImVtYWlsXCI6IFwiYWFyb25rbGlua2VyMSt3eHRAZ21haWwuY29tXCJcbiAgfSxcbiAgXCJsaWNlbnNlXCI6IFwiTUlUXCIsXG4gIFwiZmlsZXNcIjogW1xuICAgIFwiZGlzdFwiXG4gIF0sXG4gIFwiYmluXCI6IFwiZGlzdC9jbGkuY2pzXCIsXG4gIFwibWFpblwiOiBcIi4vZGlzdC9pbmRleC5janNcIixcbiAgXCJtb2R1bGVcIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9pbmRleC5kLnRzXCIsXG4gIFwiZXhwb3J0c1wiOiB7XG4gICAgXCIuXCI6IHtcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9pbmRleC5janNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2luZGV4LmpzXCIsXG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIlxuICAgIH0sXG4gICAgXCIuL2NsaWVudFwiOiB7XG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvY2xpZW50LmNqc1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvY2xpZW50LmpzXCIsXG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2NsaWVudC5kLnRzXCJcbiAgICB9XG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJ3eHRcIjogXCJ0c3ggc3JjL2NsaS9pbmRleC50c1wiLFxuICAgIFwiYnVpbGRcIjogXCJ0c3ggc2NyaXB0cy9idWlsZC50c1wiLFxuICAgIFwiZm9ybWF0XCI6IFwicHJldHRpZXIgLS13cml0ZSAuXCIsXG4gICAgXCJmb3JtYXQ6Y2hlY2tcIjogXCJwcmV0dGllciAtLXdyaXRlIC5cIixcbiAgICBcImNvbXBpbGVcIjogXCJ0c2MgLS1ub0VtaXRcIixcbiAgICBcInRlc3RcIjogXCJ2aXRlc3RcIixcbiAgICBcInRlc3Q6Y292ZXJhZ2VcIjogXCJ2aXRlc3QgcnVuIC0tY292ZXJhZ2VcIixcbiAgICBcInByZXBhcmVcIjogXCJzaW1wbGUtZ2l0LWhvb2tzXCIsXG4gICAgXCJwcmVwdWJsaXNoXCI6IFwicG5wbSAtcyBidWlsZFwiLFxuICAgIFwiZG9jczpkZXZcIjogXCJ2aXRlcHJlc3MgZGV2IGRvY3NcIixcbiAgICBcImRvY3M6YnVpbGRcIjogXCJ2aXRlcHJlc3MgYnVpbGQgZG9jc1wiLFxuICAgIFwiZG9jczpwcmV2aWV3XCI6IFwidml0ZXByZXNzIHByZXZpZXcgZG9jc1wiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB0eXBlcy93ZWJleHRlbnNpb24tcG9seWZpbGxcIjogXCJeMC4xMC4wXCIsXG4gICAgXCJAd2ViZXh0LWNvcmUvZmFrZS1icm93c2VyXCI6IFwiXjEuMi4yXCIsXG4gICAgXCJAd2ViZXh0LWNvcmUvbWF0Y2gtcGF0dGVybnNcIjogXCJeMS4wLjFcIixcbiAgICBcImFzeW5jLW11dGV4XCI6IFwiXjAuNC4wXCIsXG4gICAgXCJjMTJcIjogXCJeMS40LjJcIixcbiAgICBcImNhY1wiOiBcIl42LjcuMTRcIixcbiAgICBcImNvbnNvbGFcIjogXCJeMy4xLjBcIixcbiAgICBcImZhc3QtZ2xvYlwiOiBcIl4zLjIuMTJcIixcbiAgICBcImZpbGVzaXplXCI6IFwiXjEwLjAuN1wiLFxuICAgIFwiZnMtZXh0cmFcIjogXCJeMTEuMS4xXCIsXG4gICAgXCJnZXQtcG9ydFwiOiBcIl43LjAuMFwiLFxuICAgIFwiaml0aVwiOiBcIl4xLjE4LjJcIixcbiAgICBcImpzb241XCI6IFwiXjIuMi4zXCIsXG4gICAgXCJsaW5rZWRvbVwiOiBcIl4wLjE0LjI2XCIsXG4gICAgXCJtaW5pbWF0Y2hcIjogXCJeOS4wLjNcIixcbiAgICBcInBpY29jb2xvcnNcIjogXCJeMS4wLjBcIixcbiAgICBcInBpY29tYXRjaFwiOiBcIl4yLjMuMVwiLFxuICAgIFwidW5pbXBvcnRcIjogXCJeMy4wLjhcIixcbiAgICBcInZpdGVcIjogXCJeNC4zLjlcIixcbiAgICBcInZpdGUtdHNjb25maWctcGF0aHNcIjogXCJeNC4yLjBcIixcbiAgICBcIndlYi1leHRcIjogXCJeNy42LjJcIixcbiAgICBcIndlYmV4dGVuc2lvbi1wb2x5ZmlsbFwiOiBcIl4wLjEwLjBcIixcbiAgICBcInppcC1kaXJcIjogXCJeMi4wLjBcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAZmFrZXItanMvZmFrZXJcIjogXCJeOC4wLjJcIixcbiAgICBcIkB0eXBlcy9mcy1leHRyYVwiOiBcIl4xMS4wLjFcIixcbiAgICBcIkB0eXBlcy9sb2Rhc2gubWVyZ2VcIjogXCJeNC42LjdcIixcbiAgICBcIkB0eXBlcy9ub2RlXCI6IFwiXjIwLjMuMVwiLFxuICAgIFwiQHR5cGVzL3BpY29tYXRjaFwiOiBcIl4yLjMuMFwiLFxuICAgIFwiQHZpdGVzdC9jb3ZlcmFnZS12OFwiOiBcIl4wLjMyLjJcIixcbiAgICBcImxvZGFzaC5tZXJnZVwiOiBcIl40LjYuMlwiLFxuICAgIFwibnBtLXJ1bi1hbGxcIjogXCJeNC4xLjVcIixcbiAgICBcIm9yYVwiOiBcIl42LjMuMVwiLFxuICAgIFwicHJldHRpZXJcIjogXCJeMi44LjhcIixcbiAgICBcInByZXR0eS1xdWlja1wiOiBcIl4zLjEuM1wiLFxuICAgIFwic2ltcGxlLWdpdC1ob29rc1wiOiBcIl4yLjguMVwiLFxuICAgIFwidHN1cFwiOiBcIl43LjAuMFwiLFxuICAgIFwidHN4XCI6IFwiXjMuMTIuN1wiLFxuICAgIFwidHlwZXNjcmlwdFwiOiBcIl41LjEuM1wiLFxuICAgIFwidml0ZXByZXNzXCI6IFwiMS4wLjAtYmV0YS41XCIsXG4gICAgXCJ2aXRlc3RcIjogXCJeMC4zMi40XCIsXG4gICAgXCJ2aXRlc3QtbW9jay1leHRlbmRlZFwiOiBcIl4xLjEuNFwiLFxuICAgIFwid2ViZXh0ZW5zaW9uLXBvbHlmaWxsXCI6IFwiXjAuMTAuMFwiXG4gIH0sXG4gIFwicGVlckRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJ3ZWJleHRlbnNpb24tcG9seWZpbGxcIjogXCI+PTAuMTAuMFwiXG4gIH0sXG4gIFwicGFja2FnZU1hbmFnZXJcIjogXCJwbnBtQDguNi4zXCIsXG4gIFwic2ltcGxlLWdpdC1ob29rc1wiOiB7XG4gICAgXCJwcmUtY29tbWl0XCI6IFwicG5wbSBwcmV0dHktcXVpY2sgLS1zdGFnZWRcIlxuICB9LFxuICBcInBucG1cIjoge1xuICAgIFwicGVlckRlcGVuZGVuY3lSdWxlc1wiOiB7XG4gICAgICBcImlnbm9yZU1pc3NpbmdcIjogW1xuICAgICAgICBcIkBhbGdvbGlhL2NsaWVudC1zZWFyY2hcIixcbiAgICAgICAgXCJzZWFyY2gtaW5zaWdodHNcIlxuICAgICAgXSxcbiAgICAgIFwiYWxsb3dBbnlcIjogW1xuICAgICAgICBcIm5vZGUtZmV0Y2hcIlxuICAgICAgXVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIENvbmZpZ0VudixcbiAgRXh0ZW5zaW9uUnVubmVyQ29uZmlnLFxuICBJbmxpbmVDb25maWcsXG4gIEludGVybmFsQ29uZmlnLFxuICBVc2VyQ29uZmlnLFxuICBVc2VyTWFuaWZlc3QsXG4gIFVzZXJNYW5pZmVzdEZuLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgcGF0aCwgeyByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgKiBhcyBwbHVnaW5zIGZyb20gJy4uL3ZpdGUtcGx1Z2lucyc7XG5pbXBvcnQgeyBjcmVhdGVGc0NhY2hlIH0gZnJvbSAnLi9jcmVhdGVGc0NhY2hlJztcbmltcG9ydCB7IGdldEdsb2JhbHMgfSBmcm9tICcuL2dsb2JhbHMnO1xuaW1wb3J0IHsgbG9hZENvbmZpZyB9IGZyb20gJ2MxMic7XG5cbi8qKlxuICogR2l2ZW4gYW4gaW5saW5lIGNvbmZpZywgZGlzY292ZXIgdGhlIGNvbmZpZyBmaWxlIGlmIG5lY2Vzc2FyeSwgbWVyZ2UgdGhlIHJlc3VsdHMsIHJlc29sdmUgYW55XG4gKiByZWxhdGl2ZSBwYXRocywgYW5kIGFwcGx5IGFueSBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEludGVybmFsQ29uZmlnKFxuICBjb25maWc6IElubGluZUNvbmZpZyxcbiAgY29tbWFuZDogJ2J1aWxkJyB8ICdzZXJ2ZScsXG4pOiBQcm9taXNlPEludGVybmFsQ29uZmlnPiB7XG4gIC8vIEFwcGx5IGRlZmF1bHRzIHRvIGEgYmFzZSBjb25maWdcbiAgY29uc3Qgcm9vdCA9IGNvbmZpZy5yb290ID8gcGF0aC5yZXNvbHZlKGNvbmZpZy5yb290KSA6IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IG1vZGUgPVxuICAgIGNvbmZpZy5tb2RlID8/IChjb21tYW5kID09PSAnYnVpbGQnID8gJ3Byb2R1Y3Rpb24nIDogJ2RldmVsb3BtZW50Jyk7XG4gIGNvbnN0IGJyb3dzZXIgPSBjb25maWcuYnJvd3NlciA/PyAnY2hyb21lJztcbiAgY29uc3QgbWFuaWZlc3RWZXJzaW9uID1cbiAgICBjb25maWcubWFuaWZlc3RWZXJzaW9uID8/IChicm93c2VyID09ICdmaXJlZm94JyA/IDIgOiAzKTtcbiAgY29uc3Qgb3V0QmFzZURpciA9IHBhdGgucmVzb2x2ZShyb290LCAnLm91dHB1dCcpO1xuICBjb25zdCBvdXREaXIgPSBwYXRoLnJlc29sdmUob3V0QmFzZURpciwgYCR7YnJvd3Nlcn0tbXYke21hbmlmZXN0VmVyc2lvbn1gKTtcbiAgY29uc3QgbG9nZ2VyID0gY29uZmlnLmxvZ2dlciA/PyBjb25zb2xhO1xuXG4gIGNvbnN0IGJhc2VDb25maWc6IEludGVybmFsQ29uZmlnTm9Vc2VyRGlycyA9IHtcbiAgICByb290LFxuICAgIG91dERpcixcbiAgICBvdXRCYXNlRGlyLFxuICAgIHN0b3JlSWRzOiBjb25maWcuc3RvcmVJZHMgPz8ge30sXG4gICAgYnJvd3NlcixcbiAgICBtYW5pZmVzdFZlcnNpb24sXG4gICAgbW9kZSxcbiAgICBjb21tYW5kLFxuICAgIGxvZ2dlcixcbiAgICB2aXRlOiBjb25maWcudml0ZSA/PyB7fSxcbiAgICBpbXBvcnRzOiBjb25maWcuaW1wb3J0cyA/PyB7fSxcbiAgICBydW5uZXJDb25maWc6IGF3YWl0IGxvYWRDb25maWc8RXh0ZW5zaW9uUnVubmVyQ29uZmlnPih7XG4gICAgICBuYW1lOiAnd2ViLWV4dCcsXG4gICAgICBjd2Q6IHJvb3QsXG4gICAgICBnbG9iYWxSYzogdHJ1ZSxcbiAgICAgIHJjRmlsZTogJy53ZWJleHRyYycsXG4gICAgICBvdmVycmlkZXM6IGNvbmZpZy5ydW5uZXIsXG4gICAgfSksXG4gIH07XG5cbiAgLy8gTG9hZCB1c2VyIGNvbmZpZyBmcm9tIGZpbGVcbiAgbGV0IHVzZXJDb25maWc6IFVzZXJDb25maWcgPSB7XG4gICAgbW9kZSxcbiAgfTtcbiAgaWYgKGNvbmZpZy5jb25maWdGaWxlICE9PSBmYWxzZSkge1xuICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRDb25maWc8VXNlckNvbmZpZz4oe1xuICAgICAgbmFtZTogJ3d4dCcsXG4gICAgICBjd2Q6IHJvb3QsXG4gICAgICByY0ZpbGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHVzZXJDb25maWcgPSBsb2FkZWQuY29uZmlnID8/IHt9O1xuICB9XG5cbiAgLy8gTWVyZ2UgaW5saW5lIGFuZCB1c2VyIGNvbmZpZ3NcbiAgY29uc3QgbWVyZ2VkID0gdml0ZS5tZXJnZUNvbmZpZyhcbiAgICBiYXNlQ29uZmlnLFxuICAgIHVzZXJDb25maWcsXG4gICkgYXMgSW50ZXJuYWxDb25maWdOb1VzZXJEaXJzO1xuXG4gIC8vIEFwcGx5IHVzZXIgY29uZmlnIGFuZCBjcmVhdGUgZmluYWwgY29uZmlnXG4gIGNvbnN0IHNyY0RpciA9IHVzZXJDb25maWcuc3JjRGlyID8gcmVzb2x2ZShyb290LCB1c2VyQ29uZmlnLnNyY0RpcikgOiByb290O1xuICBjb25zdCBlbnRyeXBvaW50c0RpciA9IHJlc29sdmUoXG4gICAgc3JjRGlyLFxuICAgIHVzZXJDb25maWcuZW50cnlwb2ludHNEaXIgPz8gJ2VudHJ5cG9pbnRzJyxcbiAgKTtcbiAgY29uc3QgcHVibGljRGlyID0gcmVzb2x2ZShzcmNEaXIsIHVzZXJDb25maWcucHVibGljRGlyID8/ICdwdWJsaWMnKTtcbiAgY29uc3Qgd3h0RGlyID0gcmVzb2x2ZShzcmNEaXIsICcud3h0Jyk7XG4gIGNvbnN0IHR5cGVzRGlyID0gcmVzb2x2ZSh3eHREaXIsICd0eXBlcycpO1xuXG4gIC8vIE1lcmdlIG1hbmlmZXN0IHNvdXJjZXNcbiAgY29uc3QgZW52OiBDb25maWdFbnYgPSB7IG1vZGUsIGJyb3dzZXIsIG1hbmlmZXN0VmVyc2lvbiwgY29tbWFuZCB9O1xuICBjb25zdCB1c2VyTWFuaWZlc3QgPSBhd2FpdCByZXNvbHZlTWFuaWZlc3RDb25maWcoZW52LCB1c2VyQ29uZmlnLm1hbmlmZXN0KTtcbiAgY29uc3QgaW5saW5lTWFuaWZlc3QgPSBhd2FpdCByZXNvbHZlTWFuaWZlc3RDb25maWcoZW52LCBjb25maWcubWFuaWZlc3QpO1xuICBjb25zdCBtYW5pZmVzdCA9IHZpdGUubWVyZ2VDb25maWcodXNlck1hbmlmZXN0LCBpbmxpbmVNYW5pZmVzdCk7XG5cbiAgY29uc3QgZmluYWxDb25maWc6IEludGVybmFsQ29uZmlnID0ge1xuICAgIC4uLm1lcmdlZCxcbiAgICBzcmNEaXIsXG4gICAgZW50cnlwb2ludHNEaXIsXG4gICAgcHVibGljRGlyLFxuICAgIHd4dERpcjogd3h0RGlyLFxuICAgIHR5cGVzRGlyLFxuICAgIGZzQ2FjaGU6IGNyZWF0ZUZzQ2FjaGUod3h0RGlyKSxcbiAgICBtYW5pZmVzdCxcbiAgICB6aXA6IHtcbiAgICAgIHNvdXJjZXNUZW1wbGF0ZTogJ3t7bmFtZX19LXt7dmVyc2lvbn19LXNvdXJjZXMuemlwJyxcbiAgICAgIGFydGlmYWN0VGVtcGxhdGU6ICd7e25hbWV9fS17e3ZlcnNpb259fS17e2Jyb3dzZXJ9fS56aXAnLFxuICAgICAgc291cmNlc1Jvb3Q6IHJvb3QsXG4gICAgICAuLi51c2VyQ29uZmlnLnppcCxcbiAgICAgIC4uLmNvbmZpZy56aXAsXG4gICAgICBpZ25vcmVkU291cmNlczogW1xuICAgICAgICAnKiovbm9kZV9tb2R1bGVzJyxcbiAgICAgICAgLy8gV1hUIGZpbGVzXG4gICAgICAgICcqKi93ZWItZXh0LmNvbmZpZy50cycsXG4gICAgICAgIC8vIEhpZGRlbiBmaWxlc1xuICAgICAgICAnKiovLionLFxuICAgICAgICAvLyBUZXN0c1xuICAgICAgICAnKiovX190ZXN0c19fLyoqJyxcbiAgICAgICAgJyoqLyouKyh0ZXN0fHNwZWMpLj8oY3xtKSsoanx0KXM/KHgpJyxcbiAgICAgICAgLy8gVXNlciBjb25maWdcbiAgICAgICAgLi4uKHVzZXJDb25maWcuemlwPy5pZ25vcmVkU291cmNlcyA/PyBbXSksXG4gICAgICAgIC4uLihjb25maWcuemlwPy5pZ25vcmVkU291cmNlcyA/PyBbXSksXG4gICAgICBdLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gQ3VzdG9taXplIHRoZSBkZWZhdWx0IHZpdGUgY29uZmlnXG4gIGZpbmFsQ29uZmlnLnZpdGUucm9vdCA9IHJvb3Q7XG4gIGZpbmFsQ29uZmlnLnZpdGUuY29uZmlnRmlsZSA9IGZhbHNlO1xuICBmaW5hbENvbmZpZy52aXRlLmxvZ0xldmVsID0gJ3dhcm4nO1xuXG4gIGZpbmFsQ29uZmlnLnZpdGUuYnVpbGQgPz89IHt9O1xuICBmaW5hbENvbmZpZy52aXRlLmJ1aWxkLm91dERpciA9IG91dERpcjtcbiAgZmluYWxDb25maWcudml0ZS5idWlsZC5lbXB0eU91dERpciA9IGZhbHNlO1xuXG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucyA/Pz0gW107XG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMuZG93bmxvYWQoZmluYWxDb25maWcpKTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy5kZXZIdG1sUHJlcmVuZGVyKGZpbmFsQ29uZmlnKSk7XG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMudW5pbXBvcnQoZmluYWxDb25maWcpKTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2goXG4gICAgcGx1Z2lucy52aXJ0dWFsRW50cnlwb2luKCdiYWNrZ3JvdW5kJywgZmluYWxDb25maWcpLFxuICApO1xuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMucHVzaChcbiAgICBwbHVnaW5zLnZpcnR1YWxFbnRyeXBvaW4oJ2NvbnRlbnQtc2NyaXB0JywgZmluYWxDb25maWcpLFxuICApO1xuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMucHVzaChwbHVnaW5zLmRldlNlcnZlckdsb2JhbHMoZmluYWxDb25maWcpKTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy50c2NvbmZpZ1BhdGhzKGZpbmFsQ29uZmlnKSk7XG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMubm9vcEJhY2tncm91bmQoKSk7XG5cbiAgZmluYWxDb25maWcudml0ZS5kZWZpbmUgPz89IHt9O1xuICBnZXRHbG9iYWxzKGZpbmFsQ29uZmlnKS5mb3JFYWNoKChnbG9iYWwpID0+IHtcbiAgICBmaW5hbENvbmZpZy52aXRlLmRlZmluZSFbZ2xvYmFsLm5hbWVdID0gSlNPTi5zdHJpbmdpZnkoZ2xvYmFsLnZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZpbmFsQ29uZmlnO1xufVxuXG4vKipcbiAqIEhlbHBlciB0eXBlIGZvciBkZWZpbmluZyBhIGJhc2UgY29uZmlnLCBzaW5jZSB1c2VyLWNvbmZpZ3VyYWJsZSBkaXJlY3RvcmllcyBtdXN0IGJlIHNldCBhZnRlclxuICogcmVhZGluZyBpbiB0aGUgdXNlciBjb25maWcuXG4gKi9cbnR5cGUgSW50ZXJuYWxDb25maWdOb1VzZXJEaXJzID0gT21pdDxcbiAgSW50ZXJuYWxDb25maWcsXG4gIHwgJ3NyY0RpcidcbiAgfCAncHVibGljRGlyJ1xuICB8ICdlbnRyeXBvaW50c0RpcidcbiAgfCAnd3h0RGlyJ1xuICB8ICd0eXBlc0RpcidcbiAgfCAnZnNDYWNoZSdcbiAgfCAnbWFuaWZlc3QnXG4gIHwgJ3ppcCdcbj47XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVNYW5pZmVzdENvbmZpZyhcbiAgZW52OiBDb25maWdFbnYsXG4gIG1hbmlmZXN0OiBVc2VyTWFuaWZlc3QgfCBQcm9taXNlPFVzZXJNYW5pZmVzdD4gfCBVc2VyTWFuaWZlc3RGbiB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8VXNlck1hbmlmZXN0PiB7XG4gIHJldHVybiBhd2FpdCAodHlwZW9mIG1hbmlmZXN0ID09PSAnZnVuY3Rpb24nXG4gICAgPyBtYW5pZmVzdChlbnYpXG4gICAgOiBtYW5pZmVzdCA/PyB7fSk7XG59XG4iLCAiaW1wb3J0IHsgRW50cnlwb2ludCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBwYXRoLCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudHJ5cG9pbnROYW1lKFxuICBlbnRyeXBvaW50c0Rpcjogc3RyaW5nLFxuICBpbnB1dFBhdGg6IHN0cmluZyxcbiAgLy8gdHlwZTogRW50cnlwb2ludFsndHlwZSddLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShlbnRyeXBvaW50c0RpciwgaW5wdXRQYXRoKTtcbiAgLy8gR3JhYiB0aGUgc3RyaW5nIHVwIHRvIHRoZSBmaXJzdCAuIG9yIC9cbiAgY29uc3QgbmFtZSA9IHJlbGF0aXZlUGF0aC5zcGxpdCgvW1xcLlxcL10vLCAyKVswXTtcblxuICByZXR1cm4gbmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudHJ5cG9pbnRPdXRwdXRGaWxlKFxuICBlbnRyeXBvaW50OiBFbnRyeXBvaW50LFxuICBleHQ6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIHJldHVybiByZXNvbHZlKGVudHJ5cG9pbnQub3V0cHV0RGlyLCBgJHtlbnRyeXBvaW50Lm5hbWV9JHtleHR9YCk7XG59XG5cbi8qKlxuICogUmV0dXJuJ3MgdGhlIGVudHJ5cG9pbnQncyBvdXRwdXQgcGF0aCByZWxhdGl2ZSB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gVXNlZCBmb3IgcGF0aHMgaW4gdGhlXG4gKiBtYW5pZmVzdCBhbmQgcm9sbHVwJ3MgYnVuZGxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gIGVudHJ5cG9pbnQ6IEVudHJ5cG9pbnQsXG4gIG91dERpcjogc3RyaW5nLFxuICBleHQ6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIHJldHVybiByZWxhdGl2ZShvdXREaXIsIGdldEVudHJ5cG9pbnRPdXRwdXRGaWxlKGVudHJ5cG9pbnQsIGV4dCkpO1xufVxuIiwgImltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnROYW1lIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgcGFyc2VIVE1MIH0gZnJvbSAnbGlua2Vkb20nO1xuaW1wb3J0IHsgZGlybmFtZSwgaXNBYnNvbHV0ZSwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcblxuLyoqXG4gKiBQcmUtcmVuZGVycyB0aGUgSFRNTCBlbnRyeXBvaW50cyB3aGVuIGJ1aWxkaW5nIHRoZSBleHRlbnNpb24gdG8gY29ubmVjdCB0byB0aGUgZGV2IHNlcnZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldkh0bWxQcmVyZW5kZXIoY29uZmlnOiBJbnRlcm5hbENvbmZpZyk6IHZpdGUuUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBhcHBseTogJ2J1aWxkJyxcbiAgICBuYW1lOiAnd3h0OmRldi1odG1sLXByZXJlbmRlcicsXG4gICAgY29uZmlnKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzb2x2ZToge1xuICAgICAgICAgIGFsaWFzOiB7XG4gICAgICAgICAgICAnQHd4dC9yZWxvYWQtaHRtbCc6IHJlc29sdmUoXG4gICAgICAgICAgICAgIGNvbmZpZy5yb290LFxuICAgICAgICAgICAgICAnbm9kZV9tb2R1bGVzL3d4dC9kaXN0L3ZpcnR1YWwtbW9kdWxlcy9yZWxvYWQtaHRtbC5qcycsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gICAgYXN5bmMgdHJhbnNmb3JtKGh0bWwsIGlkKSB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSBjb25maWcuc2VydmVyO1xuICAgICAgaWYgKGNvbmZpZy5jb21tYW5kICE9PSAnc2VydmUnIHx8IHNlcnZlciA9PSBudWxsIHx8ICFpZC5lbmRzV2l0aCgnLmh0bWwnKSlcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFVybCA9IGAke3NlcnZlci5vcmlnaW59JHtpZH1gO1xuICAgICAgY29uc3QgbmFtZSA9IGdldEVudHJ5cG9pbnROYW1lKGNvbmZpZy5lbnRyeXBvaW50c0RpciwgaWQpO1xuICAgICAgY29uc3QgdXJsID0gYCR7c2VydmVyLm9yaWdpbn0vJHtuYW1lfS5odG1sYDtcbiAgICAgIGNvbnN0IHNlcnZlckh0bWwgPSBhd2FpdCBzZXJ2ZXIudHJhbnNmb3JtSW5kZXhIdG1sKFxuICAgICAgICB1cmwsXG4gICAgICAgIGh0bWwsXG4gICAgICAgIG9yaWdpbmFsVXJsLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgZG9jdW1lbnQgfSA9IHBhcnNlSFRNTChzZXJ2ZXJIdG1sKTtcblxuICAgICAgY29uc3QgcG9pbnRUb0RldlNlcnZlciA9IChxdWVyeVNlbGVjdG9yOiBzdHJpbmcsIGF0dHI6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5U2VsZWN0b3IpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBjb25zdCBzcmMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgICAgICAgICBpZiAoIXNyYykgcmV0dXJuO1xuXG4gICAgICAgICAgaWYgKGlzQWJzb2x1dGUoc3JjKSkge1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ciwgc2VydmVyLm9yaWdpbiArIHNyYyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzcmMuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgICAgICBjb25zdCBhYnMgPSByZXNvbHZlKGRpcm5hbWUoaWQpLCBzcmMpO1xuICAgICAgICAgICAgY29uc3QgcGF0aG5hbWUgPSByZWxhdGl2ZShjb25maWcucm9vdCwgYWJzKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHIsIGAke3NlcnZlci5vcmlnaW59LyR7cGF0aG5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBwb2ludFRvRGV2U2VydmVyKCdzY3JpcHRbdHlwZT1tb2R1bGVdJywgJ3NyYycpO1xuICAgICAgcG9pbnRUb0RldlNlcnZlcignbGlua1tyZWw9c3R5bGVzaGVldF0nLCAnaHJlZicpO1xuXG4gICAgICAvLyBBZGQgYSBzY3JpcHQgdG8gYWRkIHBhZ2UgcmVsb2FkaW5nXG4gICAgICBjb25zdCByZWxvYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgcmVsb2FkZXIuc3JjID0gJ0B3eHQvcmVsb2FkLWh0bWwnO1xuICAgICAgcmVsb2FkZXIudHlwZSA9ICdtb2R1bGUnO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChyZWxvYWRlcik7XG5cbiAgICAgIGNvbnN0IG5ld0h0bWwgPSBkb2N1bWVudC50b1N0cmluZygpO1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnVHJhbnNmb3JtZWQgJyArIGlkKTtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoJ09sZCBIVE1MOlxcbicgKyBodG1sKTtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoJ05ldyBIVE1MOlxcbicgKyBuZXdIdG1sKTtcbiAgICAgIHJldHVybiBuZXdIdG1sO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBEZWZpbmVzIGdsb2JhbCBjb25zdGFudHMgYWJvdXQgdGhlIGRldiBzZXJ2ZXIuIEhlbHBzIHNjcmlwdHMgY29ubmVjdCB0byB0aGUgc2VydmVyJ3Mgd2ViIHNvY2tldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldlNlcnZlckdsb2JhbHMoaW50ZXJuYWxDb25maWc6IEludGVybmFsQ29uZmlnKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd3h0OmRldi1zZXJ2ZXItZ2xvYmFscycsXG4gICAgY29uZmlnKCkge1xuICAgICAgaWYgKGludGVybmFsQ29uZmlnLnNlcnZlciA9PSBudWxsIHx8IGludGVybmFsQ29uZmlnLmNvbW1hbmQgPT0gJ2J1aWxkJylcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZWZpbmU6IHtcbiAgICAgICAgICBfX0RFVl9TRVJWRVJfUFJPVE9DT0xfXzogSlNPTi5zdHJpbmdpZnkoJ3dzOicpLFxuICAgICAgICAgIF9fREVWX1NFUlZFUl9IT1NUTkFNRV9fOiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGludGVybmFsQ29uZmlnLnNlcnZlci5ob3N0bmFtZSxcbiAgICAgICAgICApLFxuICAgICAgICAgIF9fREVWX1NFUlZFUl9QT1JUX186IEpTT04uc3RyaW5naWZ5KGludGVybmFsQ29uZmlnLnNlcnZlci5wb3J0KSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgZG5zIGZyb20gJ25vZGU6ZG5zJztcbmltcG9ydCB7IHdpdGhUaW1lb3V0IH0gZnJvbSAnLi9wcm9taXNlcyc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcblxuZnVuY3Rpb24gaXNPZmZsaW5lKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBpc09mZmxpbmUgPSBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzKSA9PiB7XG4gICAgZG5zLnJlc29sdmUoJ2dvb2dsZS5jb20nLCAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyID09IG51bGwpIHtcbiAgICAgICAgcmVzKGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcyh0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB3aXRoVGltZW91dChpc09mZmxpbmUsIDFlMykuY2F0Y2goKCkgPT4gdHJ1ZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc09ubGluZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgb2ZmbGluZSA9IGF3YWl0IGlzT2ZmbGluZSgpO1xuICByZXR1cm4gIW9mZmxpbmU7XG59XG5cbi8qKlxuICogRmV0Y2hlcyBhIFVSTCB3aXRoIGEgc2ltcGxlIEdFVCByZXF1ZXN0LiBHcmFicyBpdCBmcm9tIGNhY2hlIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIG9yIHRocm93cyBhblxuICogZXJyb3IgaWYgaXQgY2FuJ3QgYmUgcmVzb2x2ZWQgdmlhIHRoZSBuZXR3b3JrIG9yIGNhY2hlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDYWNoZWQoXG4gIHVybDogc3RyaW5nLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZyA9ICcnO1xuXG4gIGlmIChhd2FpdCBpc09ubGluZSgpKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICBpZiAocmVzLnN0YXR1cyA8IDMwMCkge1xuICAgICAgY29udGVudCA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICBhd2FpdCBjb25maWcuZnNDYWNoZS5zZXQodXJsLCBjb250ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYEZhaWxlZCB0byBkb3dubG9hZCBcIiR7dXJsfVwiLCBmYWxsaW5nIGJhY2sgdG8gY2FjaGUuLi5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbnRlbnQpIGNvbnRlbnQgPSAoYXdhaXQgY29uZmlnLmZzQ2FjaGUuZ2V0KHVybCkpID8/ICcnO1xuICBpZiAoIWNvbnRlbnQpXG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgT2ZmbGluZSBhbmQgXCIke3VybH1cIiBoYXMgbm90IGJlZW4gY2FjaGVkLiBUcnkgYWdhaW4gd2hlbiBvbmxpbmUuYCxcbiAgICApO1xuXG4gIHJldHVybiBjb250ZW50O1xufVxuIiwgIi8qKlxuICogQWRkIGEgdGltZW91dCB0byBhIHByb21pc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoVGltZW91dDxUPihcbiAgcHJvbWlzZTogUHJvbWlzZTxUPixcbiAgZHVyYXRpb246IG51bWJlcixcbik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmVqKGBQcm9taXNlIHRpbWVkIG91dCBhZnRlciAke2R1cmF0aW9ufW1zYCk7XG4gICAgfSwgZHVyYXRpb24pO1xuICAgIHByb21pc2VcbiAgICAgIC50aGVuKHJlcylcbiAgICAgIC5jYXRjaChyZWopXG4gICAgICAuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQodGltZW91dCkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBEb24ndCB1c2UgaW4gcHJvZHVjdGlvbiwganVzdCBmb3IgdGVzdGluZyBhbmQgc2xvd2luZyB0aGluZ3MgZG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMpID0+IHNldFRpbWVvdXQocmVzLCBtcykpO1xufVxuIiwgImltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBmZXRjaENhY2hlZCB9IGZyb20gJy4uL3V0aWxzL25ldHdvcmsnO1xuXG4vKipcbiAqIERvd25sb2FkcyBhbnkgVVJMIGltcG9ydHMsIGxpa2UgR29vZ2xlIEFuYWx5dGljcywgaW50byB2aXJ0dWFsIG1vZHVsZXMgc28gdGhleSBhcmUgYnVuZGxlZCB3aXRoXG4gKiB0aGUgZXh0ZW5zaW9uIGluc3RlYWQgb2YgZGVwZW5kaW5nIG9uIHJlbW90ZSBjb2RlIGF0IHJ1bnRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCBcInVybDpodHRwczovL2dvb2dsZS10YWdtYW5hZ2VyLmNvbS9ndGFnP2lkPVhZWlwiO1xuICovXG5leHBvcnQgZnVuY3Rpb24gZG93bmxvYWQoY29uZmlnOiBJbnRlcm5hbENvbmZpZyk6IFBsdWdpbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3d4dDpkb3dubG9hZCcsXG4gICAgcmVzb2x2ZUlkKGlkKSB7XG4gICAgICBpZiAoaWQuc3RhcnRzV2l0aCgndXJsOicpKSByZXR1cm4gJ1xcMCcgKyBpZDtcbiAgICB9LFxuICAgIGFzeW5jIGxvYWQoaWQpIHtcbiAgICAgIGlmICghaWQuc3RhcnRzV2l0aCgnXFwwdXJsOicpKSByZXR1cm47XG5cbiAgICAgIC8vIExvYWQgZmlsZSBmcm9tIG5ldHdvcmsgb3IgY2FjaGVcbiAgICAgIGNvbnN0IHVybCA9IGlkLnJlcGxhY2UoJ1xcMHVybDonLCAnJyk7XG4gICAgICByZXR1cm4gYXdhaXQgZmV0Y2hDYWNoZWQodXJsLCBjb25maWcpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEVudHJ5cG9pbnQsIEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZGlybmFtZSwgZXh0bmFtZSwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aCB9IGZyb20gJy4uL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCBmcywgeyBlbnN1cmVEaXIgfSBmcm9tICdmcy1leHRyYSc7XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgSFRNTCBmaWxlcyBvdXRwdXQgYnkgYSBtdWx0aXBhZ2UgYnVpbGQgYXJlIGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uLiBUaGlzIGRvZXMgdHdvXG4gKiB0aGluZ3M6XG4gKlxuICogMS4gTW92ZXMgdGhlIEhNVEwgZmlsZXMgdG8gdGhlaXIgZmluYWwgbG9jYXRpb24gYXQgYDxvdXREaXI+LzxlbnRyeXBvaW50Lm5hbWU+Lmh0bWxgLlxuICogMi4gVXBkYXRlcyB0aGUgYnVuZGxlIHNvIGl0IHN1bW1hcml6ZXMgdGhlIGZpbGVzIGNvcnJlY3RseSBpbiB0aGUgcmV0dXJuZWQgYnVpbGQgb3V0cHV0LlxuICpcbiAqIEFzc2V0cyAoSlMgYW5kIENTUykgYXJlIG91dHB1dCB0byB0aGUgYDxvdXREaXI+L2Fzc2V0c2AgZGlyZWN0b3J5LCBhbmQgZG9uJ3QgbmVlZCB0byBiZSBtb2RpZmllZC5cbiAqIEhUTUwgZmlsZXMgYWNjZXNzIHRoZW0gdmlhIGFic29sdXRlIFVSTHMsIHNvIHdlIGRvbid0IG5lZWQgdG8gdXBkYXRlIGFueSBpbXBvcnQgcGF0aHMgaW4gdGhlIEhUTUxcbiAqIGZpbGVzIGVpdGhlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGFnZU1vdmUoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiB2aXRlLlBsdWdpbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3d4dDptdWx0aXBhZ2UtbW92ZScsXG4gICAgYXN5bmMgd3JpdGVCdW5kbGUoXywgYnVuZGxlKSB7XG4gICAgICBmb3IgKGNvbnN0IG9sZEJ1bmRsZVBhdGggaW4gYnVuZGxlKSB7XG4gICAgICAgIC8vIG9sZEJ1bmRsZVBhdGggPSAnZW50cnlwb2ludHMvcG9wdXAuaHRtbCcgb3IgJ2VudHJ5cG9pbnRzL28gcHRpb25zL2luZGV4Lmh0bWwnXG5cbiAgICAgICAgLy8gRmluZCBhIG1hdGNoaW5nIGVudHJ5cG9pbnQgLSBvbGRCdW5kbGVQYXRoIGlzIHRoZSBzYW1lIGFzIGVuZCBlbmQgb2YgdGhlIGlucHV0IHBhdGguXG4gICAgICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBlbnRyeXBvaW50cy5maW5kKFxuICAgICAgICAgIChlbnRyeSkgPT4gISFlbnRyeS5pbnB1dFBhdGguZW5kc1dpdGgob2xkQnVuZGxlUGF0aCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlbnRyeXBvaW50ID09IG51bGwpIHtcbiAgICAgICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCdObyBlbnRyeXBvaW50IGZvdW5kIGZvcicsIG9sZEJ1bmRsZVBhdGgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBuZXcgYnVuZGxlIHBhdGhcbiAgICAgICAgY29uc3QgbmV3QnVuZGxlUGF0aCA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgICAgIGVudHJ5cG9pbnQsXG4gICAgICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICAgICBleHRuYW1lKG9sZEJ1bmRsZVBhdGgpLFxuICAgICAgICApO1xuICAgICAgICBpZiAobmV3QnVuZGxlUGF0aCA9PT0gb2xkQnVuZGxlUGF0aCkge1xuICAgICAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAnSFRNTCBmaWxlIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24nLFxuICAgICAgICAgICAgb2xkQnVuZGxlUGF0aCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTW92ZSBmaWxlIGFuZCB1cGRhdGUgYnVuZGxlXG4gICAgICAgIC8vIERvIHRoaXMgaW5zaWRlIGEgbXV0ZXggbG9jayBzbyBpdCBvbmx5IHJ1bnMgb25lIGF0IGEgdGltZSBmb3IgY29uY3VycmVudCBtdWx0aXBhZ2UgYnVpbGRzXG4gICAgICAgIGNvbnN0IG9sZEFic1BhdGggPSByZXNvbHZlKGNvbmZpZy5vdXREaXIsIG9sZEJ1bmRsZVBhdGgpO1xuICAgICAgICBjb25zdCBuZXdBYnNQYXRoID0gcmVzb2x2ZShjb25maWcub3V0RGlyLCBuZXdCdW5kbGVQYXRoKTtcbiAgICAgICAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUobmV3QWJzUGF0aCkpO1xuICAgICAgICBhd2FpdCBmcy5tb3ZlKG9sZEFic1BhdGgsIG5ld0Fic1BhdGgsIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlbmFtZWRDaHVuayA9IHtcbiAgICAgICAgICAuLi5idW5kbGVbb2xkQnVuZGxlUGF0aF0sXG4gICAgICAgICAgZmlsZU5hbWU6IG5ld0J1bmRsZVBhdGgsXG4gICAgICAgIH07XG4gICAgICAgIGRlbGV0ZSBidW5kbGVbb2xkQnVuZGxlUGF0aF07XG4gICAgICAgIGJ1bmRsZVtuZXdCdW5kbGVQYXRoXSA9IHJlbmFtZWRDaHVuaztcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZVVuaW1wb3J0IH0gZnJvbSAndW5pbXBvcnQnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRVbmltcG9ydE9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9hdXRvLWltcG9ydHMnO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBleHRuYW1lIH0gZnJvbSAncGF0aCc7XG5cbmNvbnN0IEVOQUJMRURfRVhURU5TSU9OUzogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHVuZGVmaW5lZD4gPSB7XG4gICcuanMnOiB0cnVlLFxuICAnLmpzeCc6IHRydWUsXG4gICcudHMnOiB0cnVlLFxuICAnLnRzeCc6IHRydWUsXG4gICcudnVlJzogdHJ1ZSxcbiAgJy5zdmVsdGUnOiB0cnVlLFxufTtcblxuLyoqXG4gKiBJbmplY3QgYW55IGdsb2JhbCBpbXBvcnRzIGRlZmluZWQgYnkgdW5pbXBvcnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaW1wb3J0KGNvbmZpZzogSW50ZXJuYWxDb25maWcpOiBQbHVnaW4ge1xuICBjb25zdCBvcHRpb25zID0gZ2V0VW5pbXBvcnRPcHRpb25zKGNvbmZpZyk7XG4gIGNvbnN0IHVuaW1wb3J0ID0gY3JlYXRlVW5pbXBvcnQob3B0aW9ucyk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd3h0OnVuaW1wb3J0JyxcbiAgICBhc3luYyBjb25maWcoKSB7XG4gICAgICBhd2FpdCB1bmltcG9ydC5zY2FuSW1wb3J0c0Zyb21EaXIodW5kZWZpbmVkLCB7IGN3ZDogY29uZmlnLnNyY0RpciB9KTtcbiAgICB9LFxuICAgIGFzeW5jIHRyYW5zZm9ybShjb2RlLCBpZCkge1xuICAgICAgY29uc3QgZXh0ID0gZXh0bmFtZShpZCk7XG4gICAgICBpZiAoRU5BQkxFRF9FWFRFTlNJT05TW2V4dF0pIHJldHVybiB1bmltcG9ydC5pbmplY3RJbXBvcnRzKGNvZGUsIGlkKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IFVuaW1wb3J0T3B0aW9ucyB9IGZyb20gJ3VuaW1wb3J0JztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgbWVyZ2VDb25maWcgfSBmcm9tICd2aXRlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaW1wb3J0T3B0aW9ucyhcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFBhcnRpYWw8VW5pbXBvcnRPcHRpb25zPiB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zOiBQYXJ0aWFsPFVuaW1wb3J0T3B0aW9ucz4gPSB7XG4gICAgZGVidWdMb2c6IGNvbmZpZy5sb2dnZXIuZGVidWcsXG4gICAgaW1wb3J0czogW1xuICAgICAgeyBuYW1lOiAnKicsIGFzOiAnYnJvd3NlcicsIGZyb206ICd3ZWJleHRlbnNpb24tcG9seWZpbGwnIH0sXG4gICAgICB7IG5hbWU6ICdkZWZpbmVDb25maWcnLCBmcm9tOiAnd3h0JyB9LFxuICAgIF0sXG4gICAgcHJlc2V0czogW3sgcGFja2FnZTogJ3d4dC9jbGllbnQnIH1dLFxuICAgIHdhcm46IGNvbmZpZy5sb2dnZXIud2FybixcbiAgICBkaXJzOiBbJy4vY29tcG9uZW50cy8qJywgJy4vY29tcG9zYWJsZXMvKicsICcuL2hvb2tzLyonLCAnLi91dGlscy8qJ10sXG4gIH07XG5cbiAgcmV0dXJuIG1lcmdlQ29uZmlnKFxuICAgIGRlZmF1bHRPcHRpb25zLFxuICAgIGNvbmZpZy5pbXBvcnRzLFxuICApIGFzIFBhcnRpYWw8VW5pbXBvcnRPcHRpb25zPjtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEVudHJ5cG9pbnQsIEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcblxuLyoqXG4gKiBXcmFwcyBhIHVzZXIncyBlbnRyeXBvaW50IHdpdGggYSB2aXR1YWwgdmVyc2lvbiB3aXRoIGFkZGl0aW9uYWwgbG9naWMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aXJ0dWFsRW50cnlwb2luKFxuICB0eXBlOiBFbnRyeXBvaW50Wyd0eXBlJ10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQbHVnaW4ge1xuICBjb25zdCB2aXJ0dWFsSWQgPSBgdmlydHVhbDp3eHQtJHt0eXBlfT9gO1xuICBjb25zdCByZXNvbHZlZFZpcnR1YWxJZCA9IGBcXDAke3ZpcnR1YWxJZH1gO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogYHd4dDp2aXJ0dWFsLWVudHJ5cG9pbnRgLFxuICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgLy8gSWQgZG9lc24ndCBzdGFydCB3aXRoIHByZWZpeCwgaXQgbG9va3MgbGlrZSB0aGlzOlxuICAgICAgLy8gL3BhdGgvdG8vcHJvamVjdC92aXJ0dWFsOmJhY2tncm91bmQ/L3BhdGgvdG8vcHJvamVjdC9lbnRyeXBvaW50cy9iYWNrZ3JvdW5kLnRzXG4gICAgICBjb25zdCBpbmRleCA9IGlkLmluZGV4T2YodmlydHVhbElkKTtcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybjtcblxuICAgICAgY29uc3QgaW5wdXRQYXRoID0gaWQuc3Vic3RyaW5nKGluZGV4ICsgdmlydHVhbElkLmxlbmd0aCk7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRWaXJ0dWFsSWQgKyBpbnB1dFBhdGg7XG4gICAgfSxcbiAgICBhc3luYyBsb2FkKGlkKSB7XG4gICAgICBpZiAoIWlkLnN0YXJ0c1dpdGgocmVzb2x2ZWRWaXJ0dWFsSWQpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGlucHV0UGF0aCA9IGlkLnJlcGxhY2UocmVzb2x2ZWRWaXJ0dWFsSWQsICcnKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgICAgIHJlc29sdmUoXG4gICAgICAgICAgY29uZmlnLnJvb3QsXG4gICAgICAgICAgYG5vZGVfbW9kdWxlcy93eHQvZGlzdC92aXJ0dWFsLW1vZHVsZXMvJHt0eXBlfS1lbnRyeXBvaW50LmpzYCxcbiAgICAgICAgKSxcbiAgICAgICAgJ3V0Zi04JyxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZShgdmlydHVhbDp1c2VyLSR7dHlwZX1gLCBpbnB1dFBhdGgpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgcGF0aHMgZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0c2NvbmZpZ1BhdGhzKGNvbmZpZzogSW50ZXJuYWxDb25maWcpIHtcbiAgY29uc3QgZm46IHR5cGVvZiBwYXRocyA9XG4gICAgdHlwZW9mIHBhdGhzID09PSAnZnVuY3Rpb24nID8gcGF0aHMgOiAocGF0aHMgYXMgYW55KS5kZWZhdWx0O1xuICByZXR1cm4gZm4oe1xuICAgIHJvb3Q6IGNvbmZpZy5yb290LFxuICB9KTtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcblxuLyoqXG4gKiBJbiBkZXYgbW9kZSwgaWYgdGhlcmUncyBub3QgYSBiYWNrZ3JvdW5kIHNjcmlwdCBsaXN0ZWQsIHdlIG5lZWQgdG8gYWRkIG9uZS5cbiAqXG4gKiBUaGlzIGRlZmluZSdzIGEgdmlydHVhbCBtb2R1bGUgdGhhdCBpcyBiYXNpY2FsbHkganVzdCBhIG5vb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub29wQmFja2dyb3VuZCgpOiBQbHVnaW4ge1xuICBjb25zdCB2aXJ0dWFsTW9kdWxlSWQgPSBWSVJUVUFMX05PT1BfQkFDS0dST1VORF9NT0RVTEVfSUQ7XG4gIGNvbnN0IHJlc29sdmVkVmlydHVhbE1vZHVsZUlkID0gJ1xcMCcgKyB2aXJ0dWFsTW9kdWxlSWQ7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3d4dDpub29wLWJhY2tncm91bmQnLFxuICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgaWYgKGlkID09PSB2aXJ0dWFsTW9kdWxlSWQpIHJldHVybiByZXNvbHZlZFZpcnR1YWxNb2R1bGVJZDtcbiAgICB9LFxuICAgIGxvYWQoaWQpIHtcbiAgICAgIGlmIChpZCA9PT0gcmVzb2x2ZWRWaXJ0dWFsTW9kdWxlSWQpIHtcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyBkZWZpbmVCYWNrZ3JvdW5kIH0gZnJvbSAnd3h0L2NsaWVudCc7XFxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQmFja2dyb3VuZCgoKSA9PiB2b2lkIDApYDtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgVklSVFVBTF9OT09QX0JBQ0tHUk9VTkRfTU9EVUxFX0lEID0gJ3ZpcnR1YWw6dXNlci1iYWNrZ3JvdW5kJztcbiIsICJpbXBvcnQgZnMsIHsgZW5zdXJlRGlyIH0gZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgRnNDYWNoZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGRpcm5hbWUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcblxuLyoqXG4gKiBBIGJhc2ljIGZpbGUgc3lzdGVtIGNhY2hlIHN0b3JlZCBhdCBgPHNyY0Rpcj4vLnd4dC9jYWNoZS88a2V5PmAuIEp1c3QgY2FjaGVzIGEgc3RyaW5nIGluIGFcbiAqIGZpbGUgZm9yIHRoZSBnaXZlbiBrZXkuXG4gKlxuICogQHBhcmFtIHNyY0RpciBBYnNvbHV0ZSBwYXRoIHRvIHNvdXJjZSBkaXJlY3RvcnkuIFNlZSBgSW50ZXJuYWxDb25maWcuc3JjRGlyYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnNDYWNoZSh3eHREaXI6IHN0cmluZyk6IEZzQ2FjaGUge1xuICBjb25zdCBnZXRQYXRoID0gKGtleTogc3RyaW5nKSA9PlxuICAgIHJlc29sdmUod3h0RGlyLCAnY2FjaGUnLCBlbmNvZGVVUklDb21wb25lbnQoa2V5KSk7XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGtleSk7XG4gICAgICBhd2FpdCBlbnN1cmVEaXIoZGlybmFtZShwYXRoKSk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aCwgdmFsdWUsICd1dGYtOCcpO1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGtleSk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZnMucmVhZEZpbGUocGF0aCwgJ3V0Zi04Jyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFscyhcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYW55OyB0eXBlOiBzdHJpbmcgfT4ge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG5hbWU6ICdfX01BTklGRVNUX1ZFUlNJT05fXycsXG4gICAgICB2YWx1ZTogY29uZmlnLm1hbmlmZXN0VmVyc2lvbixcbiAgICAgIHR5cGU6IGAyIHwgM2AsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19CUk9XU0VSX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5icm93c2VyLFxuICAgICAgdHlwZTogYFwiY2hyb21pdW1cIiB8IFwiZmlyZWZveFwiYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdfX0lTX0NIUk9NRV9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlciA9PT0gJ2Nocm9tZScsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19JU19GSVJFRk9YX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19JU19TQUZBUklfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdzYWZhcmknLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfRURHRV9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlciA9PT0gJ2VkZ2UnLFxuICAgICAgdHlwZTogYGJvb2xlYW5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfT1BFUkFfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdvcGVyYScsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19DT01NQU5EX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5jb21tYW5kLFxuICAgICAgdHlwZTogYFwiYnVpbGRcIiB8IFwic2VydmVcImAsXG4gICAgfSxcbiAgXTtcbn1cbiIsICJpbXBvcnQgeyBCdWlsZE91dHB1dCwgV3h0RGV2U2VydmVyLCBJbmxpbmVDb25maWcgfSBmcm9tICcuL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0SW50ZXJuYWxDb25maWcgfSBmcm9tICcuL2NvcmUvdXRpbHMvZ2V0SW50ZXJuYWxDb25maWcnO1xuaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IGRldGVjdERldkNoYW5nZXMgfSBmcm9tICcuL2NvcmUvdXRpbHMvZGV0ZWN0RGV2Q2hhbmdlcyc7XG5pbXBvcnQgeyBNdXRleCB9IGZyb20gJ2FzeW5jLW11dGV4JztcbmltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcbmltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRPdXRwdXRGaWxlIH0gZnJvbSAnLi9jb3JlL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IGJ1aWxkSW50ZXJuYWwsIHJlYnVpbGQgfSBmcm9tICcuL2NvcmUvYnVpbGQnO1xuaW1wb3J0IHtcbiAgZ2V0U2VydmVySW5mbyxcbiAgcmVsb2FkQ29udGVudFNjcmlwdHMsXG4gIHJlbG9hZEh0bWxQYWdlcyxcbiAgc2V0dXBTZXJ2ZXIsXG59IGZyb20gJy4vY29yZS9zZXJ2ZXInO1xuXG5leHBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS90eXBlcy9leHRlcm5hbCc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvdXRpbHMvZGVmaW5lQ29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS91dGlscy9kZWZpbmVSdW5uZXJDb25maWcnO1xuXG4vKipcbiAqIEJ1bmRsZXMgdGhlIGV4dGVuc2lvbiBmb3IgcHJvZHVjdGlvbi4gUmV0dXJucyBhIHByb21pc2Ugb2YgdGhlIGJ1aWxkIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGNvbmZpZzogSW5saW5lQ29uZmlnKTogUHJvbWlzZTxCdWlsZE91dHB1dD4ge1xuICBjb25zdCBpbnRlcm5hbENvbmZpZyA9IGF3YWl0IGdldEludGVybmFsQ29uZmlnKGNvbmZpZywgJ2J1aWxkJyk7XG4gIHJldHVybiBhd2FpdCBidWlsZEludGVybmFsKGludGVybmFsQ29uZmlnKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlcnZlcihcbiAgY29uZmlnPzogSW5saW5lQ29uZmlnLFxuKTogUHJvbWlzZTxXeHREZXZTZXJ2ZXI+IHtcbiAgY29uc3Qgc2VydmVySW5mbyA9IGF3YWl0IGdldFNlcnZlckluZm8oKTtcblxuICBjb25zdCBnZXRMYXRlc3RJbnRlcm5hbENvbmZpZyA9ICgpID0+IHtcbiAgICBjb25zdCB2aXRlQ29uZmlnOiB2aXRlLklubGluZUNvbmZpZyA9IHZpdGUubWVyZ2VDb25maWcoXG4gICAgICBzZXJ2ZXJJbmZvLnZpdGVTZXJ2ZXJDb25maWcsXG4gICAgICBjb25maWc/LnZpdGUgPz8ge30sXG4gICAgKTtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxDb25maWcoeyAuLi5jb25maWcsIHZpdGU6IHZpdGVDb25maWcgfSwgJ3NlcnZlJyk7XG4gIH07XG5cbiAgbGV0IGludGVybmFsQ29uZmlnID0gYXdhaXQgZ2V0TGF0ZXN0SW50ZXJuYWxDb25maWcoKTtcbiAgY29uc3Qgc2VydmVyID0gYXdhaXQgc2V0dXBTZXJ2ZXIoc2VydmVySW5mbywgaW50ZXJuYWxDb25maWcpO1xuICBpbnRlcm5hbENvbmZpZy5zZXJ2ZXIgPSBzZXJ2ZXI7XG5cbiAgY29uc3QgZmlsZUNoYW5nZWRNdXRleCA9IG5ldyBNdXRleCgpO1xuICBjb25zdCBjaGFuZ2VRdWV1ZTogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gPSBbXTtcblxuICBzZXJ2ZXIud3Mub24oJ3d4dDpiYWNrZ3JvdW5kLWluaXRpYWxpemVkJywgKCkgPT4ge1xuICAgIC8vIFJlZ2lzdGVyIGNvbnRlbnQgc2NyaXB0cyBmb3IgdGhlIGZpcnN0IHRpbWUgc2luY2UgdGhleSdyZSBub3QgbGlzdGVkIGluIHRoZSBtYW5pZmVzdFxuICAgIHJlbG9hZENvbnRlbnRTY3JpcHRzKHNlcnZlci5jdXJyZW50T3V0cHV0LnN0ZXBzLCBpbnRlcm5hbENvbmZpZywgc2VydmVyKTtcbiAgfSk7XG5cbiAgc2VydmVyLndhdGNoZXIub24oJ2FsbCcsIGFzeW5jIChldmVudCwgcGF0aCwgX3N0YXRzKSA9PiB7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChpbnRlcm5hbENvbmZpZy5vdXRCYXNlRGlyKSkgcmV0dXJuO1xuICAgIGNoYW5nZVF1ZXVlLnB1c2goW2V2ZW50LCBwYXRoXSk7XG5cbiAgICBhd2FpdCBmaWxlQ2hhbmdlZE11dGV4LnJ1bkV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlQ2hhbmdlcyA9IGNoYW5nZVF1ZXVlLnNwbGljZSgwLCBjaGFuZ2VRdWV1ZS5sZW5ndGgpO1xuICAgICAgaWYgKGZpbGVDaGFuZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBjaGFuZ2VzID0gZGV0ZWN0RGV2Q2hhbmdlcyhmaWxlQ2hhbmdlcywgc2VydmVyLmN1cnJlbnRPdXRwdXQpO1xuICAgICAgaWYgKGNoYW5nZXMudHlwZSA9PT0gJ25vLWNoYW5nZScpIHJldHVybjtcblxuICAgICAgLy8gTG9nIHRoZSBlbnRyeXBvaW50cyB0aGF0IHdlcmUgZWZmZWN0ZWRcbiAgICAgIGludGVybmFsQ29uZmlnLmxvZ2dlci5pbmZvKFxuICAgICAgICBgQ2hhbmdlZDogJHtBcnJheS5mcm9tKG5ldyBTZXQoZmlsZUNoYW5nZXMubWFwKChjaGFuZ2UpID0+IGNoYW5nZVsxXSkpKVxuICAgICAgICAgIC5tYXAoKGZpbGUpID0+IHBjLmRpbShyZWxhdGl2ZShpbnRlcm5hbENvbmZpZy5yb290LCBmaWxlKSkpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCByZWJ1aWx0TmFtZXMgPSBjaGFuZ2VzLnJlYnVpbGRHcm91cHNcbiAgICAgICAgLmZsYXQoKVxuICAgICAgICAubWFwKChlbnRyeSkgPT4ge1xuICAgICAgICAgIHJldHVybiBwYy5jeWFuKFxuICAgICAgICAgICAgcmVsYXRpdmUoaW50ZXJuYWxDb25maWcub3V0RGlyLCBnZXRFbnRyeXBvaW50T3V0cHV0RmlsZShlbnRyeSwgJycpKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihwYy5kaW0oJywgJykpO1xuXG4gICAgICAvLyBHZXQgbGF0ZXN0IGNvbmZpZyBhbmQgUmVidWlsZCBncm91cHMgd2l0aCBjaGFuZ2VzXG4gICAgICBpbnRlcm5hbENvbmZpZyA9IGF3YWl0IGdldExhdGVzdEludGVybmFsQ29uZmlnKCk7XG4gICAgICBpbnRlcm5hbENvbmZpZy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgICBjb25zdCB7IG91dHB1dDogbmV3T3V0cHV0IH0gPSBhd2FpdCByZWJ1aWxkKFxuICAgICAgICBpbnRlcm5hbENvbmZpZyxcbiAgICAgICAgLy8gVE9ETzogdGhpcyBleGNsdWRlcyBuZXcgZW50cnlwb2ludHMsIHNvIHRoZXkncmUgbm90IGJ1aWx0IHVudGlsIHRoZSBkZXYgY29tbWFuZCBpcyByZXN0YXJ0ZWRcbiAgICAgICAgY2hhbmdlcy5yZWJ1aWxkR3JvdXBzLFxuICAgICAgICBjaGFuZ2VzLmNhY2hlZE91dHB1dCxcbiAgICAgICk7XG4gICAgICBzZXJ2ZXIuY3VycmVudE91dHB1dCA9IG5ld091dHB1dDtcblxuICAgICAgLy8gUGVyZm9ybSByZWxvYWRzXG4gICAgICBzd2l0Y2ggKGNoYW5nZXMudHlwZSkge1xuICAgICAgICBjYXNlICdleHRlbnNpb24tcmVsb2FkJzpcbiAgICAgICAgICBzZXJ2ZXIucmVsb2FkRXh0ZW5zaW9uKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2h0bWwtcmVsb2FkJzpcbiAgICAgICAgICByZWxvYWRIdG1sUGFnZXMoY2hhbmdlcy5yZWJ1aWxkR3JvdXBzLCBzZXJ2ZXIsIGludGVybmFsQ29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29udGVudC1zY3JpcHQtcmVsb2FkJzpcbiAgICAgICAgICByZWxvYWRDb250ZW50U2NyaXB0cyhjaGFuZ2VzLmNoYW5nZWRTdGVwcywgaW50ZXJuYWxDb25maWcsIHNlcnZlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zb2xhLnN1Y2Nlc3MoYFJlbG9hZGVkOiAke3JlYnVpbHROYW1lc31gKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHNlcnZlcjtcbn1cbiIsICIvKipcbiAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgYWxsIGVsZW1lbnRzIG9mIHRoZSBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KFxuICBhcnJheTogVFtdLFxuICBwcmVkaWNhdGU6IChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspXG4gICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaV0sIGkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuIiwgImltcG9ydCB7IEJ1aWxkT3V0cHV0LCBCdWlsZFN0ZXBPdXRwdXQsIEVudHJ5cG9pbnRHcm91cCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBldmVyeSB9IGZyb20gJy4vYXJyYXlzJztcblxuLyoqXG4gKiBDb21wYXJlIHRoZSBjaGFuZ2VkIGZpbGVzIHZzIHRoZSBidWlsZCBvdXRwdXQgYW5kIGRldGVybWluZSB3aGF0IGtpbmQgb2YgcmVsb2FkIG5lZWRzIHRvIGhhcHBlbjpcbiAqXG4gKiAtIERvIG5vdGhpbmdcbiAqICAgLSBDU1Mgb3IgSlMgZmlsZSBhc3NvY2lhdGVkIHdpdGggYW4gSFRNTCBwYWdlIGlzIGNoYW5nZWQgLSB0aGlzIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSBieSB0aGVcbiAqICAgICBkZXYgc2VydmVyXG4gKiAgIC0gQ2hhbmdlIGlzbid0IHVzZWQgYnkgYW55IG9mIHRoZSBlbnRyeXBvaW50c1xuICogLSBSZWxvYWQgQ29udGVudCBzY3JpcHRcbiAqICAgLSBDU1Mgb3IgSlMgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBjb250ZW50IHNjcmlwdFxuICogICAtIEJhY2tncm91bmQgc2NyaXB0IHdpbGwgYmUgdG9sZCB0byByZWxvYWQgdGhlIGNvbnRlbnQgc2NyaXB0XG4gKiAtIFJlbG9hZCBIVE1MIGZpbGVcbiAqICAgLSBIVE1MIGZpbGUgaXRzZWxmIGlzIHNhdmVkIC0gSE1SIGRvZXNuJ3QgaGFuZGxlIHRoaXMgYmVjYXVzZSB0aGUgSFRNTCBwYWdlcyBhcmUgcHJlLXJlbmRlcmVkXG4gKiAgIC0gQ2hyb21lIGlzIE9LIHJlbG9hZGluZyB0aGUgcGFnZSB3aGVuIHRoZSBIVE1MIGZpbGUgaXMgY2hhbmdlZCB3aXRob3V0IHJlbG9hZGluZyB0aGUgd2hvbGVcbiAqICAgICBleHRlbnNpb24uIE5vdCBzdXJlIGFib3V0IGZpcmVmb3gsIHRoaXMgbWlnaHQgbmVlZCB0byBjaGFuZ2UgdG8gYW4gZXh0ZW5zaW9uIHJlbG9hZFxuICogLSBSZWxvYWQgZXh0ZW5zaW9uXG4gKiAgIC0gQmFja2dyb3VuZCBzY3JpcHQgaXMgY2hhbmdlZFxuICogICAtIE1hbmlmZXN0IGlzIGRpZmZlcmVudFxuICogLSBSZXN0YXJ0IGJyb3dzZXJcbiAqICAgLSBDb25maWcgZmlsZSBjaGFuZ2VkICh3eHQuY29uZmlnLnRzLCAuZW52LCB3ZWItZXh0LmNvbmZpZy50cywgZXRjKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0RGV2Q2hhbmdlcyhcbiAgY2hhbmdlZEZpbGVzOiBbZXZlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nXVtdLFxuICBjdXJyZW50T3V0cHV0OiBCdWlsZE91dHB1dCB8IHVuZGVmaW5lZCxcbik6IERldk1vZGVDaGFuZ2Uge1xuICBpZiAoY3VycmVudE91dHB1dCA9PSBudWxsKSByZXR1cm4geyB0eXBlOiAnbm8tY2hhbmdlJyB9O1xuXG4gIGNvbnN0IGNoYW5nZWRTdGVwcyA9IG5ldyBTZXQoXG4gICAgY2hhbmdlZEZpbGVzLmZsYXRNYXAoKGNoYW5nZWRGaWxlKSA9PlxuICAgICAgZmluZEVmZmVjdGVkU3RlcHMoY2hhbmdlZEZpbGUsIGN1cnJlbnRPdXRwdXQpLFxuICAgICksXG4gICk7XG4gIGlmIChjaGFuZ2VkU3RlcHMuc2l6ZSA9PT0gMCkgcmV0dXJuIHsgdHlwZTogJ25vLWNoYW5nZScgfTtcblxuICBjb25zdCB1bmNoYW5nZWRPdXRwdXQ6IEJ1aWxkT3V0cHV0ID0ge1xuICAgIG1hbmlmZXN0OiBjdXJyZW50T3V0cHV0Lm1hbmlmZXN0LFxuICAgIHN0ZXBzOiBbXSxcbiAgICBwdWJsaWNBc3NldHM6IFtdLFxuICB9O1xuICBjb25zdCBjaGFuZ2VkT3V0cHV0OiBCdWlsZE91dHB1dCA9IHtcbiAgICBtYW5pZmVzdDogY3VycmVudE91dHB1dC5tYW5pZmVzdCxcbiAgICBzdGVwczogW10sXG4gICAgcHVibGljQXNzZXRzOiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IHN0ZXAgb2YgY3VycmVudE91dHB1dC5zdGVwcykge1xuICAgIGlmIChjaGFuZ2VkU3RlcHMuaGFzKHN0ZXApKSB7XG4gICAgICBjaGFuZ2VkT3V0cHV0LnN0ZXBzLnB1c2goc3RlcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuY2hhbmdlZE91dHB1dC5zdGVwcy5wdXNoKHN0ZXApO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGFzc2V0IG9mIGN1cnJlbnRPdXRwdXQucHVibGljQXNzZXRzKSB7XG4gICAgaWYgKGNoYW5nZWRTdGVwcy5oYXMoYXNzZXQpKSB7XG4gICAgICBjaGFuZ2VkT3V0cHV0LnB1YmxpY0Fzc2V0cy5wdXNoKGFzc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5jaGFuZ2VkT3V0cHV0LnB1YmxpY0Fzc2V0cy5wdXNoKGFzc2V0KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc09ubHlIdG1sQ2hhbmdlcyA9XG4gICAgY2hhbmdlZEZpbGVzLmxlbmd0aCA+IDAgJiZcbiAgICBldmVyeShjaGFuZ2VkRmlsZXMsIChbXywgZmlsZV0pID0+IGZpbGUuZW5kc1dpdGgoJy5odG1sJykpO1xuICBpZiAoaXNPbmx5SHRtbENoYW5nZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2h0bWwtcmVsb2FkJyxcbiAgICAgIGNhY2hlZE91dHB1dDogdW5jaGFuZ2VkT3V0cHV0LFxuICAgICAgcmVidWlsZEdyb3VwczogY2hhbmdlZE91dHB1dC5zdGVwcy5tYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBpc09ubHlDb250ZW50U2NyaXB0cyA9XG4gICAgY2hhbmdlZE91dHB1dC5zdGVwcy5sZW5ndGggPiAwICYmXG4gICAgZXZlcnkoXG4gICAgICBjaGFuZ2VkT3V0cHV0LnN0ZXBzLmZsYXRNYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgICAgKGVudHJ5KSA9PiBlbnRyeS50eXBlID09PSAnY29udGVudC1zY3JpcHQnLFxuICAgICk7XG4gIGlmIChpc09ubHlDb250ZW50U2NyaXB0cykge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnY29udGVudC1zY3JpcHQtcmVsb2FkJyxcbiAgICAgIGNhY2hlZE91dHB1dDogdW5jaGFuZ2VkT3V0cHV0LFxuICAgICAgY2hhbmdlZFN0ZXBzOiBjaGFuZ2VkT3V0cHV0LnN0ZXBzLFxuICAgICAgcmVidWlsZEdyb3VwczogY2hhbmdlZE91dHB1dC5zdGVwcy5tYXAoKHN0ZXApID0+IHN0ZXAuZW50cnlwb2ludHMpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdleHRlbnNpb24tcmVsb2FkJyxcbiAgICBjYWNoZWRPdXRwdXQ6IHVuY2hhbmdlZE91dHB1dCxcbiAgICByZWJ1aWxkR3JvdXBzOiBjaGFuZ2VkT3V0cHV0LnN0ZXBzLm1hcCgoc3RlcCkgPT4gc3RlcC5lbnRyeXBvaW50cyksXG4gIH07XG59XG5cbi8qKlxuICogRm9yIGEgc2luZ2xlIGNoYW5nZSwgcmV0dXJuIGFsbCB0aGUgc3RlcCBvZiB0aGUgYnVpbGQgb3V0cHV0IHRoYXQgd2VyZSBlZmZlY3RlZCBieSBpdC5cbiAqL1xuZnVuY3Rpb24gZmluZEVmZmVjdGVkU3RlcHMoXG4gIGNoYW5nZWRGaWxlOiBbZXZlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nXSxcbiAgY3VycmVudE91dHB1dDogQnVpbGRPdXRwdXQsXG4pOiBEZXRlY3RlZENoYW5nZVtdIHtcbiAgY29uc3QgY2hhbmdlczogRGV0ZWN0ZWRDaGFuZ2VbXSA9IFtdO1xuICBjb25zdCBjaGFuZ2VkUGF0aCA9IGNoYW5nZWRGaWxlWzFdO1xuXG4gIGNvbnN0IGlzQ2h1bmtFZmZlY3RlZCA9IChcbiAgICBjaHVuazogdml0ZS5Sb2xsdXAuT3V0cHV0Q2h1bmsgfCB2aXRlLlJvbGx1cC5PdXRwdXRBc3NldCxcbiAgKTogYm9vbGVhbiA9PlxuICAgIC8vIElmIGl0J3MgYW4gSFRNTCBmaWxlIHdpdGggdGhlIHNhbWUgcGF0aCwgaXMgaXMgZWZmZWN0ZWQgYmVjYXVzZSBIVE1MIGZpbGVzIG5lZWQgdG8gYmUgcHJlLXJlbmRlcmVkXG4gICAgLy8gVE9ETzogdXNlIGJ1bmRsZSBwYXRoIHRvIHN1cHBvcnQgYDxuYW1lPi9pbmRleC5odG1sYD9cbiAgICAoY2h1bmsudHlwZSA9PT0gJ2Fzc2V0JyAmJiBjaGFuZ2VkUGF0aC5lbmRzV2l0aChjaHVuay5maWxlTmFtZSkpIHx8XG4gICAgLy8gSWYgaXQncyBhIGNodW5rIHRoYXQgZGVwZW5kcyBvbiB0aGUgY2hhbmdlZCBmaWxlLCBpdCBpcyBlZmZlY3RlZFxuICAgIChjaHVuay50eXBlID09PSAnY2h1bmsnICYmIGNodW5rLm1vZHVsZUlkcy5pbmNsdWRlcyhjaGFuZ2VkUGF0aCkpO1xuXG4gIGZvciAoY29uc3Qgc3RlcCBvZiBjdXJyZW50T3V0cHV0LnN0ZXBzKSB7XG4gICAgY29uc3QgZWZmZWN0ZWRDaHVuayA9IHN0ZXAuY2h1bmtzLmZpbmQoKGNodW5rKSA9PiBpc0NodW5rRWZmZWN0ZWQoY2h1bmspKTtcbiAgICBpZiAoZWZmZWN0ZWRDaHVuaykgY2hhbmdlcy5wdXNoKHN0ZXApO1xuICB9XG5cbiAgY29uc3QgZWZmZWN0ZWRBc3NldCA9IGN1cnJlbnRPdXRwdXQucHVibGljQXNzZXRzLmZpbmQoKGNodW5rKSA9PlxuICAgIGlzQ2h1bmtFZmZlY3RlZChjaHVuayksXG4gICk7XG4gIGlmIChlZmZlY3RlZEFzc2V0KSBjaGFuZ2VzLnB1c2goZWZmZWN0ZWRBc3NldCk7XG5cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBmaWxlcyBjaGFuZ2VkLCB3aGF0IG5lZWRzIHJlYnVpbHQsIGFuZCB0aGUgdHlwZSBvZiByZWxvYWQgdGhhdCBpc1xuICogcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIERldk1vZGVDaGFuZ2UgPVxuICB8IE5vQ2hhbmdlXG4gIHwgSHRtbFJlbG9hZFxuICB8IEV4dGVuc2lvblJlbG9hZFxuICB8IENvbnRlbnRTY3JpcHRSZWxvYWQ7XG4vLyB8IEJyb3dzZXJSZXN0YXJ0XG5cbmludGVyZmFjZSBOb0NoYW5nZSB7XG4gIHR5cGU6ICduby1jaGFuZ2UnO1xufVxuXG5pbnRlcmZhY2UgUmVidWlsZENoYW5nZSB7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBlbnRyeXBvaW50cyB0aGF0IG5lZWQgcmVidWlsdC5cbiAgICovXG4gIHJlYnVpbGRHcm91cHM6IEVudHJ5cG9pbnRHcm91cFtdO1xuICAvKipcbiAgICogVGhlIHByZXZpb3VzIG91dHB1dCBzdHJpcHBlZCBvZiBhbnkgZmlsZXMgYXJlIGdvaW5nIHRvIGNoYW5nZS5cbiAgICovXG4gIGNhY2hlZE91dHB1dDogQnVpbGRPdXRwdXQ7XG59XG5cbmludGVyZmFjZSBIdG1sUmVsb2FkIGV4dGVuZHMgUmVidWlsZENoYW5nZSB7XG4gIHR5cGU6ICdodG1sLXJlbG9hZCc7XG59XG5cbmludGVyZmFjZSBFeHRlbnNpb25SZWxvYWQgZXh0ZW5kcyBSZWJ1aWxkQ2hhbmdlIHtcbiAgdHlwZTogJ2V4dGVuc2lvbi1yZWxvYWQnO1xufVxuXG4vLyBpbnRlcmZhY2UgQnJvd3NlclJlc3RhcnQgZXh0ZW5kcyBSZWJ1aWxkQ2hhbmdlIHtcbi8vICAgdHlwZTogJ2Jyb3dzZXItcmVzdGFydCc7XG4vLyB9XG5cbmludGVyZmFjZSBDb250ZW50U2NyaXB0UmVsb2FkIGV4dGVuZHMgUmVidWlsZENoYW5nZSB7XG4gIHR5cGU6ICdjb250ZW50LXNjcmlwdC1yZWxvYWQnO1xuICBjaGFuZ2VkU3RlcHM6IEJ1aWxkU3RlcE91dHB1dFtdO1xufVxuXG4vKipcbiAqIFdoZW4gZmlndXJpbmcgb3V0IHdoYXQgbmVlZHMgcmVsb2FkZWQsIHRoaXMgc3RvcmVzIHRoZSBzdGVwIHRoYXQgd2FzIGNoYW5nZWQsIG9yIHRoZSBwdWJsaWNcbiAqIGRpcmVjdG9yeSBhc3NldCB0aGF0IHdhcyBjaGFuZ2VkLiBJdCBkb2Vzbid0IGtub3cgd2hhdCB0eXBlIG9mIGNoYW5nZSBpcyByZXF1aXJlZCB5ZXQuIEp1c3QgYW5cbiAqIGludGVybWVkaWF0ZSB0eXBlLlxuICovXG50eXBlIERldGVjdGVkQ2hhbmdlID0gQnVpbGRTdGVwT3V0cHV0IHwgdml0ZS5Sb2xsdXAuT3V0cHV0QXNzZXQ7XG4iLCAiaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7XG4gIEJ1aWxkT3V0cHV0LFxuICBCdWlsZFN0ZXBPdXRwdXQsXG4gIEVudHJ5cG9pbnQsXG4gIEVudHJ5cG9pbnRHcm91cCxcbiAgSW50ZXJuYWxDb25maWcsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSAnLi4vdml0ZS1wbHVnaW5zJztcbmltcG9ydCB7IHJlbW92ZUVtcHR5RGlycyB9IGZyb20gJy4uL3V0aWxzL3JlbW92ZUVtcHR5RGlycyc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aCB9IGZyb20gJy4uL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCBnbG9iIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgZGlybmFtZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRFbnRyeXBvaW50cyhcbiAgZ3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8T21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4+IHtcbiAgY29uc3Qgc3RlcHM6IEJ1aWxkU3RlcE91dHB1dFtdID0gW107XG4gIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgY29uc3Qgc3RlcCA9IEFycmF5LmlzQXJyYXkoZ3JvdXApXG4gICAgICA/IGF3YWl0IGJ1aWxkTXVsdGlwbGVFbnRyeXBvaW50cyhncm91cCwgY29uZmlnKVxuICAgICAgOiBhd2FpdCBidWlsZFNpbmdsZUVudHJ5cG9pbnQoZ3JvdXAsIGNvbmZpZyk7XG4gICAgc3RlcHMucHVzaChzdGVwKTtcbiAgfVxuICBjb25zdCBwdWJsaWNBc3NldHMgPSBhd2FpdCBjb3B5UHVibGljRGlyZWN0b3J5KGNvbmZpZyk7XG5cbiAgLy8gUmVtb3ZlIGFueSBlbXB0eSBkaXJlY3RvcmllcyBmcm9tIG1vdmluZyBvdXRwdXRzIGFyb3VuZFxuICBhd2FpdCByZW1vdmVFbXB0eURpcnMoY29uZmlnLm91dERpcik7XG5cbiAgcmV0dXJuIHsgcHVibGljQXNzZXRzLCBzdGVwcyB9O1xufVxuXG4vKipcbiAqIFVzZSBWaXRlJ3MgbGliIG1vZGUgKyBJSUZFIGZvcm1hdCB0byBidW5kbGUgdGhlIGVudHJ5cG9pbnQgdG8gYSBzaW5nbGUgZmlsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRTaW5nbGVFbnRyeXBvaW50KFxuICBlbnRyeXBvaW50OiBFbnRyeXBvaW50LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZFN0ZXBPdXRwdXQ+IHtcbiAgLy8gU2hvdWxkIHRoaXMgZW50cnlwb2ludCBiZSB3cmFwcGVkIGJ5IHRoZSB2aXRlLXBsdWdpbnMvdmlydHVhbEVudHJ5cG9pbnQgcGx1Z2luP1xuICBjb25zdCBpc1ZpcnR1YWwgPSBbJ2JhY2tncm91bmQnLCAnY29udGVudC1zY3JpcHQnXS5pbmNsdWRlcyhlbnRyeXBvaW50LnR5cGUpO1xuICBjb25zdCBlbnRyeSA9IGlzVmlydHVhbFxuICAgID8gYHZpcnR1YWw6d3h0LSR7ZW50cnlwb2ludC50eXBlfT8ke2VudHJ5cG9pbnQuaW5wdXRQYXRofWBcbiAgICA6IGVudHJ5cG9pbnQuaW5wdXRQYXRoO1xuXG4gIGNvbnN0IGxpYk1vZGU6IHZpdGUuVXNlckNvbmZpZyA9IHtcbiAgICBidWlsZDoge1xuICAgICAgbGliOiB7XG4gICAgICAgIGVudHJ5LFxuICAgICAgICBmb3JtYXRzOiBbJ2lpZmUnXSxcbiAgICAgICAgbmFtZTogJ18nLFxuICAgICAgICBmaWxlTmFtZTogZW50cnlwb2ludC5uYW1lLFxuICAgICAgfSxcbiAgICAgIHJvbGx1cE9wdGlvbnM6IHtcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgLy8gVGhlcmUncyBvbmx5IGEgc2luZ2xlIG91dHB1dCBmb3IgdGhpcyBidWlsZCwgc28gd2UgdXNlIHRoZSBkZXNpcmVkIGJ1bmRsZSBwYXRoIGZvciB0aGVcbiAgICAgICAgICAvLyBlbnRyeSBvdXRwdXQgKGxpa2UgXCJjb250ZW50LXNjcmlwdHMvb3ZlcmxheS5qc1wiKVxuICAgICAgICAgIGVudHJ5RmlsZU5hbWVzOiBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgICAgIGVudHJ5cG9pbnQsXG4gICAgICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICAgICAgJy5qcycsXG4gICAgICAgICAgKSxcbiAgICAgICAgICAvLyBPdXRwdXQgY29udGVudCBzY3JpcHQgQ1NTIHRvIGFzc2V0cy8gd2l0aCBhIGhhc2ggdG8gcHJldmVudCBjb25mbGljdHMuIERlZmF1bHRzIHRvXG4gICAgICAgICAgLy8gXCJbbmFtZV0uW2V4dF1cIiBpbiBsaWIgbW9kZSwgd2hpY2ggdXN1YWxseSByZXN1bHRzIGluIFwic3R5bGUuY3NzXCIuIFRoYXQgbWVhbnMgbXVsdGlwbGVcbiAgICAgICAgICAvLyBjb250ZW50IHNjcmlwdHMgd2l0aCBzdHlsZXMgd291bGQgb3ZlcndyaXRlIGVhY2ggb3RoZXIgaWYgaXQgd2VyZW4ndCBjaGFuZ2VkIGJlbG93LlxuICAgICAgICAgIGFzc2V0RmlsZU5hbWVzOiBgYXNzZXRzLyR7ZW50cnlwb2ludC5uYW1lfS5bZXh0XWAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG4gIGNvbnN0IGVudHJ5Q29uZmlnID0gdml0ZS5tZXJnZUNvbmZpZyhcbiAgICBsaWJNb2RlLFxuICAgIGNvbmZpZy52aXRlLFxuICApIGFzIHZpdGUuSW5saW5lQ29uZmlnO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZpdGUuYnVpbGQoZW50cnlDb25maWcpO1xuICByZXR1cm4ge1xuICAgIGVudHJ5cG9pbnRzOiBlbnRyeXBvaW50LFxuICAgIGNodW5rczogZ2V0QnVpbGRPdXRwdXRDaHVua3MocmVzdWx0KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBVc2UgVml0ZSdzIG11bHRpcGFnZSBidWlsZCB0byBidW5kbGUgYWxsIHRoZSBlbnRyeXBvaW50cyBpbiBhIHNpbmdsZSBzdGVwLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZE11bHRpcGxlRW50cnlwb2ludHMoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPEJ1aWxkU3RlcE91dHB1dD4ge1xuICBjb25zdCBtdWx0aVBhZ2U6IHZpdGUuVXNlckNvbmZpZyA9IHtcbiAgICBwbHVnaW5zOiBbcGx1Z2lucy5tdWx0aXBhZ2VNb3ZlKGVudHJ5cG9pbnRzLCBjb25maWcpXSxcbiAgICBidWlsZDoge1xuICAgICAgcm9sbHVwT3B0aW9uczoge1xuICAgICAgICBpbnB1dDogZW50cnlwb2ludHMucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KChpbnB1dCwgZW50cnkpID0+IHtcbiAgICAgICAgICBpbnB1dFtlbnRyeS5uYW1lXSA9IGVudHJ5LmlucHV0UGF0aDtcbiAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH0sIHt9KSxcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgLy8gSW5jbHVkZSBhIGhhc2ggdG8gcHJldmVudCBjb25mbGljdHNcbiAgICAgICAgICBjaHVua0ZpbGVOYW1lczogJ2NodW5rcy9bbmFtZV0tW2hhc2hdLmpzJyxcbiAgICAgICAgICAvLyBJbmNsdWRlIGEgaGFzaCB0byBwcmV2ZW50IGNvbmZsaWN0c1xuICAgICAgICAgIGVudHJ5RmlsZU5hbWVzOiAnY2h1bmtzL1tuYW1lXS1baGFzaF0uanMnLFxuICAgICAgICAgIC8vIFdlIGNhbid0IGNvbnRyb2wgdGhlIFwibmFtZVwiLCBzbyB3ZSBuZWVkIGEgaGFzaCB0byBwcmV2ZW50IGNvbmZsaWN0c1xuICAgICAgICAgIGFzc2V0RmlsZU5hbWVzOiAnYXNzZXRzL1tuYW1lXS1baGFzaF0uW2V4dF0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IGVudHJ5Q29uZmlnID0gdml0ZS5tZXJnZUNvbmZpZyhcbiAgICBtdWx0aVBhZ2UsXG4gICAgY29uZmlnLnZpdGUsXG4gICkgYXMgdml0ZS5Vc2VyQ29uZmlnO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZpdGUuYnVpbGQoZW50cnlDb25maWcpO1xuICByZXR1cm4ge1xuICAgIGVudHJ5cG9pbnRzLFxuICAgIGNodW5rczogZ2V0QnVpbGRPdXRwdXRDaHVua3MocmVzdWx0KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0QnVpbGRPdXRwdXRDaHVua3MoXG4gIHJlc3VsdDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiB2aXRlLmJ1aWxkPj4sXG4pOiBCdWlsZFN0ZXBPdXRwdXRbJ2NodW5rcyddIHtcbiAgaWYgKCdvbicgaW4gcmVzdWx0KSB0aHJvdyBFcnJvcignd3h0IGRvZXMgbm90IHN1cHBvcnQgdml0ZSB3YXRjaCBtb2RlLicpO1xuICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSByZXR1cm4gcmVzdWx0LmZsYXRNYXAoKHsgb3V0cHV0IH0pID0+IG91dHB1dCk7XG4gIHJldHVybiByZXN1bHQub3V0cHV0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3B5UHVibGljRGlyZWN0b3J5KFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxCdWlsZE91dHB1dFsncHVibGljQXNzZXRzJ10+IHtcbiAgY29uc3QgcHVibGljQXNzZXRzOiBCdWlsZE91dHB1dFsncHVibGljQXNzZXRzJ10gPSBbXTtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKGNvbmZpZy5wdWJsaWNEaXIpKSkgcmV0dXJuIHB1YmxpY0Fzc2V0cztcblxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2IoJyoqLyonLCB7IGN3ZDogY29uZmlnLnB1YmxpY0RpciB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBzcmNQYXRoID0gcmVzb2x2ZShjb25maWcucHVibGljRGlyLCBmaWxlKTtcbiAgICBjb25zdCBvdXRQYXRoID0gcmVzb2x2ZShjb25maWcub3V0RGlyLCBmaWxlKTtcblxuICAgIGF3YWl0IGZzLmVuc3VyZURpcihkaXJuYW1lKG91dFBhdGgpKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmNQYXRoLCBvdXRQYXRoKTtcbiAgICBwdWJsaWNBc3NldHMucHVzaCh7XG4gICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgZmlsZU5hbWU6IGZpbGUsXG4gICAgICBuYW1lOiBmaWxlLFxuICAgICAgbmVlZHNDb2RlUmVmZXJlbmNlOiBmYWxzZSxcbiAgICAgIHNvdXJjZTogYXdhaXQgZnMucmVhZEZpbGUoc3JjUGF0aCksXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHVibGljQXNzZXRzO1xufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUVtcHR5RGlycyhkaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBmaWxlKTtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCByZW1vdmVFbXB0eURpcnMoZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucm1kaXIoZGlyKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gbm9vcCBvbiBmYWlsdXJlIC0gdGhpcyBtZWFucyB0aGUgZGlyZWN0b3J5IHdhcyBub3QgZW1wdHkuXG4gIH1cbn1cbiIsICJpbXBvcnQgeyByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtcbiAgQmFja2dyb3VuZEVudHJ5cG9pbnQsXG4gIEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbixcbiAgQ29udGVudFNjcmlwdERlZmluaXRpb24sXG4gIENvbnRlbnRTY3JpcHRFbnRyeXBvaW50LFxuICBFbnRyeXBvaW50LFxuICBJbnRlcm5hbENvbmZpZyxcbiAgT3B0aW9uc0VudHJ5cG9pbnQsXG4gIFBvcHVwRW50cnlwb2ludCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBwaWNvbWF0Y2ggZnJvbSAncGljb21hdGNoJztcbmltcG9ydCB7IHBhcnNlSFRNTCB9IGZyb20gJ2xpbmtlZG9tJztcbmltcG9ydCBKU09ONSBmcm9tICdqc29uNSc7XG5pbXBvcnQgeyBpbXBvcnRUc0ZpbGUgfSBmcm9tICcuLi91dGlscy9pbXBvcnRUc0ZpbGUnO1xuaW1wb3J0IGdsb2IgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnROYW1lIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgVklSVFVBTF9OT09QX0JBQ0tHUk9VTkRfTU9EVUxFX0lEIH0gZnJvbSAnLi4vdml0ZS1wbHVnaW5zL25vb3BCYWNrZ3JvdW5kJztcblxuLyoqXG4gKiBSZXR1cm4gZW50cnlwb2ludHMgYW5kIHRoZWlyIGNvbmZpZ3VyYXRpb24gYnkgbG9va2luZyB0aHJvdWdoIHRoZSBwcm9qZWN0J3MgZmlsZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRW50cnlwb2ludHMoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPEVudHJ5cG9pbnRbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gYXdhaXQgZ2xvYignKiovKicsIHtcbiAgICBjd2Q6IGNvbmZpZy5lbnRyeXBvaW50c0RpcixcbiAgfSk7XG4gIC8vIEVuc3VyZSBjb25zaXN0ZW50IG91dHB1dFxuICByZWxhdGl2ZVBhdGhzLnNvcnQoKTtcblxuICBjb25zdCBwYXRoR2xvYnMgPSBPYmplY3Qua2V5cyhQQVRIX0dMT0JfVE9fVFlQRV9NQVApO1xuICBjb25zdCBleGlzdGluZ05hbWVzOiBSZWNvcmQ8c3RyaW5nLCBFbnRyeXBvaW50IHwgdW5kZWZpbmVkPiA9IHt9O1xuXG4gIGNvbnN0IGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10gPSBbXTtcbiAgbGV0IGhhc0JhY2tncm91bmQgPSBmYWxzZTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVsYXRpdmVQYXRocy5tYXAoYXN5bmMgKHJlbGF0aXZlUGF0aCkgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgY29uc3QgbWF0Y2hpbmdHbG9iID0gcGF0aEdsb2JzLmZpbmQoKGdsb2IpID0+XG4gICAgICAgIHBpY29tYXRjaC5pc01hdGNoKHJlbGF0aXZlUGF0aCwgZ2xvYiksXG4gICAgICApO1xuXG4gICAgICBpZiAobWF0Y2hpbmdHbG9iID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgICBgJHtyZWxhdGl2ZVBhdGh9IGRvZXMgbm90IG1hdGNoIGFueSBrbm93biBlbnRyeXBvaW50LiBLbm93biBlbnRyeXBvaW50czpcXG4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgUEFUSF9HTE9CX1RPX1RZUEVfTUFQLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlID0gUEFUSF9HTE9CX1RPX1RZUEVfTUFQW21hdGNoaW5nR2xvYl07XG4gICAgICBpZiAodHlwZSA9PT0gJ2lnbm9yZWQnKSByZXR1cm47XG5cbiAgICAgIGxldCBlbnRyeXBvaW50OiBFbnRyeXBvaW50O1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3BvcHVwJzpcbiAgICAgICAgICBlbnRyeXBvaW50ID0gYXdhaXQgZ2V0UG9wdXBFbnRyeXBvaW50KGNvbmZpZywgcGF0aCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ29wdGlvbnMnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSBhd2FpdCBnZXRPcHRpb25zRW50cnlwb2ludChjb25maWcsIHBhdGgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdiYWNrZ3JvdW5kJzpcbiAgICAgICAgICBlbnRyeXBvaW50ID0gYXdhaXQgZ2V0QmFja2dyb3VuZEVudHJ5cG9pbnQoY29uZmlnLCBwYXRoKTtcbiAgICAgICAgICBoYXNCYWNrZ3JvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29udGVudC1zY3JpcHQnOlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSBhd2FpdCBnZXRDb250ZW50U2NyaXB0RW50cnlwb2ludChcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIGdldEVudHJ5cG9pbnROYW1lKGNvbmZpZy5lbnRyeXBvaW50c0RpciwgcGF0aCksXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZW50cnlwb2ludCA9IHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBuYW1lOiBnZXRFbnRyeXBvaW50TmFtZShjb25maWcuZW50cnlwb2ludHNEaXIsIHBhdGgpLFxuICAgICAgICAgICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgICAgICAgICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICAgICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdpdGhTYW1lTmFtZSA9IGV4aXN0aW5nTmFtZXNbZW50cnlwb2ludC5uYW1lXTtcbiAgICAgIGlmICh3aXRoU2FtZU5hbWUpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIGVudHJ5cG9pbnRzIHdpdGggdGhlIG5hbWUgXCIke1xuICAgICAgICAgICAgZW50cnlwb2ludC5uYW1lXG4gICAgICAgICAgfVwiIGRldGVjdGVkLCBidXQgb25seSBvbmUgaXMgYWxsb3dlZDogJHtbXG4gICAgICAgICAgICByZWxhdGl2ZShjb25maWcucm9vdCwgd2l0aFNhbWVOYW1lLmlucHV0UGF0aCksXG4gICAgICAgICAgICByZWxhdGl2ZShjb25maWcucm9vdCwgZW50cnlwb2ludC5pbnB1dFBhdGgpLFxuICAgICAgICAgIF0uam9pbignLCAnKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZW50cnlwb2ludHMucHVzaChlbnRyeXBvaW50KTtcbiAgICAgIGV4aXN0aW5nTmFtZXNbZW50cnlwb2ludC5uYW1lXSA9IGVudHJ5cG9pbnQ7XG4gICAgfSksXG4gICk7XG4gIGlmIChjb25maWcuY29tbWFuZCA9PT0gJ3NlcnZlJyAmJiAhaGFzQmFja2dyb3VuZCkge1xuICAgIGVudHJ5cG9pbnRzLnB1c2goXG4gICAgICBhd2FpdCBnZXRCYWNrZ3JvdW5kRW50cnlwb2ludChjb25maWcsIFZJUlRVQUxfTk9PUF9CQUNLR1JPVU5EX01PRFVMRV9JRCksXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZW50cnlwb2ludHM7XG59XG5cbi8qKlxuICogQHBhcmFtIHBhdGggQWJzb2x1dGUgcGF0aCB0byB0aGUgcG9wdXAgSFRNTCBmaWxlLlxuICogQHBhcmFtIGNvbnRlbnQgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0IHRoZSBwYXRoLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQb3B1cEVudHJ5cG9pbnQoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4gIHBhdGg6IHN0cmluZyxcbik6IFByb21pc2U8UG9wdXBFbnRyeXBvaW50PiB7XG4gIGNvbnN0IG9wdGlvbnM6IFBvcHVwRW50cnlwb2ludFsnb3B0aW9ucyddID0ge307XG5cbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICBjb25zdCB7IGRvY3VtZW50IH0gPSBwYXJzZUhUTUwoY29udGVudCk7XG5cbiAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpO1xuICBpZiAodGl0bGUgIT0gbnVsbCkgb3B0aW9ucy5kZWZhdWx0VGl0bGUgPSB0aXRsZS50ZXh0Q29udGVudCA/PyB1bmRlZmluZWQ7XG5cbiAgY29uc3QgZGVmYXVsdEljb25Db250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3QuZGVmYXVsdF9pY29uJ11cIilcbiAgICA/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICBpZiAoZGVmYXVsdEljb25Db250ZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIG9wdGlvbnMuZGVmYXVsdEljb24gPSBKU09ONS5wYXJzZShkZWZhdWx0SWNvbkNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uZmlnLmxvZ2dlci5mYXRhbChcbiAgICAgICAgYEZhaWxlZCB0byBwYXJzZSBkZWZhdWx0X2ljb24gbWV0YSB0YWcgY29udGVudCBhcyBKU09ONS4gY29udGVudD0ke2RlZmF1bHRJY29uQ29udGVudH1gLFxuICAgICAgICBlcnIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG12MktleUNvbnRlbnQgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdtYW5pZmVzdC50eXBlJ11cIilcbiAgICA/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICBpZiAobXYyS2V5Q29udGVudCkge1xuICAgIG9wdGlvbnMubXYyS2V5ID1cbiAgICAgIG12MktleUNvbnRlbnQgPT09ICdwYWdlX2FjdGlvbicgPyAncGFnZV9hY3Rpb24nIDogJ2Jyb3dzZXJfYWN0aW9uJztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3BvcHVwJyxcbiAgICBuYW1lOiAncG9wdXAnLFxuICAgIG9wdGlvbnMsXG4gICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgIG91dHB1dERpcjogY29uZmlnLm91dERpcixcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBvcHRpb25zIEhUTUwgZmlsZS5cbiAqIEBwYXJhbSBjb250ZW50IFN0cmluZyBjb250ZW50cyBvZiB0aGUgZmlsZSBhdCB0aGUgcGF0aC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T3B0aW9uc0VudHJ5cG9pbnQoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4gIHBhdGg6IHN0cmluZyxcbik6IFByb21pc2U8T3B0aW9uc0VudHJ5cG9pbnQ+IHtcbiAgY29uc3Qgb3B0aW9uczogT3B0aW9uc0VudHJ5cG9pbnRbJ29wdGlvbnMnXSA9IHt9O1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgeyBkb2N1bWVudCB9ID0gcGFyc2VIVE1MKGNvbnRlbnQpO1xuXG4gIGNvbnN0IG9wZW5JblRhYkNvbnRlbnQgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdtYW5pZmVzdC5vcGVuX2luX3RhYiddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKG9wZW5JblRhYkNvbnRlbnQpIHtcbiAgICBvcHRpb25zLm9wZW5JblRhYiA9IG9wZW5JblRhYkNvbnRlbnQgPT09ICd0cnVlJztcbiAgfVxuXG4gIGNvbnN0IGNocm9tZVN0eWxlQ29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0LmNocm9tZV9zdHlsZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGNocm9tZVN0eWxlQ29udGVudCkge1xuICAgIG9wdGlvbnMuY2hyb21lU3R5bGUgPSBjaHJvbWVTdHlsZUNvbnRlbnQgPT09ICd0cnVlJztcbiAgfVxuXG4gIGNvbnN0IGJyb3dzZXJTdHlsZUNvbnRlbnQgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdtYW5pZmVzdC5icm93c2VyX3N0eWxlJ11cIilcbiAgICA/LmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICBpZiAoYnJvd3NlclN0eWxlQ29udGVudCkge1xuICAgIG9wdGlvbnMuYnJvd3NlclN0eWxlID0gYnJvd3NlclN0eWxlQ29udGVudCA9PT0gJ3RydWUnO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnb3B0aW9ucycsXG4gICAgbmFtZTogJ29wdGlvbnMnLFxuICAgIG9wdGlvbnMsXG4gICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgIG91dHB1dERpcjogY29uZmlnLm91dERpcixcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBiYWNrZ3JvdW5kJ3MgVFMgZmlsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QmFja2dyb3VuZEVudHJ5cG9pbnQoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4gIHBhdGg6IHN0cmluZyxcbik6IFByb21pc2U8QmFja2dyb3VuZEVudHJ5cG9pbnQ+IHtcbiAgbGV0IG9wdGlvbnM6IE9taXQ8QmFja2dyb3VuZFNjcmlwdERlZmludGl0aW9uLCAnbWFpbic+ID0ge307XG4gIGlmIChwYXRoICE9PSBWSVJUVUFMX05PT1BfQkFDS0dST1VORF9NT0RVTEVfSUQpIHtcbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gYXdhaXQgaW1wb3J0VHNGaWxlPEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbj4oXG4gICAgICBwYXRoLFxuICAgICAgY29uZmlnLFxuICAgICk7XG4gICAgaWYgKGRlZmF1bHRFeHBvcnQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0JhY2tncm91bmQgc2NyaXB0IGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGV4cG9ydCcpO1xuICAgIH1cbiAgICBjb25zdCB7IG1haW46IF8sIC4uLm1vZHVsZU9wdGlvbnMgfSA9IGRlZmF1bHRFeHBvcnQ7XG4gICAgb3B0aW9ucyA9IG1vZHVsZU9wdGlvbnM7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnYmFja2dyb3VuZCcsXG4gICAgbmFtZTogJ2JhY2tncm91bmQnLFxuICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICBvdXRwdXREaXI6IGNvbmZpZy5vdXREaXIsXG4gICAgb3B0aW9uczogb3B0aW9ucyxcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gcGF0aCBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBjb250ZW50IHNjcmlwdCdzIFRTIGZpbGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENvbnRlbnRTY3JpcHRFbnRyeXBvaW50KFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhdGg6IHN0cmluZyxcbik6IFByb21pc2U8Q29udGVudFNjcmlwdEVudHJ5cG9pbnQ+IHtcbiAgY29uc3QgeyBtYWluOiBfLCAuLi5vcHRpb25zIH0gPSBhd2FpdCBpbXBvcnRUc0ZpbGU8Q29udGVudFNjcmlwdERlZmluaXRpb24+KFxuICAgIHBhdGgsXG4gICAgY29uZmlnLFxuICApO1xuICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgdGhyb3cgRXJyb3IoYENvbnRlbnQgc2NyaXB0ICR7bmFtZX0gZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgZXhwb3J0YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnY29udGVudC1zY3JpcHQnLFxuICAgIG5hbWU6IGdldEVudHJ5cG9pbnROYW1lKGNvbmZpZy5lbnRyeXBvaW50c0RpciwgcGF0aCksXG4gICAgaW5wdXRQYXRoOiBwYXRoLFxuICAgIG91dHB1dERpcjogcmVzb2x2ZShjb25maWcub3V0RGlyLCAnY29udGVudC1zY3JpcHRzJyksXG4gICAgb3B0aW9ucyxcbiAgfTtcbn1cblxuY29uc3QgUEFUSF9HTE9CX1RPX1RZUEVfTUFQOiBSZWNvcmQ8c3RyaW5nLCBFbnRyeXBvaW50Wyd0eXBlJ10gfCAnaWdub3JlZCc+ID0ge1xuICAnc2FuZGJveC5odG1sJzogJ3NhbmRib3gnLFxuICAnc2FuZGJveC9pbmRleC5odG1sJzogJ3NhbmRib3gnLFxuICAnKi5zYW5kYm94Lmh0bWwnOiAnc2FuZGJveCcsXG4gICcqLnNhbmRib3gvaW5kZXguaHRtbCc6ICdzYW5kYm94JyxcblxuICAnYm9va21hcmtzLmh0bWwnOiAnYm9va21hcmtzJyxcbiAgJ2Jvb2ttYXJrcy9pbmRleC5odG1sJzogJ2Jvb2ttYXJrcycsXG5cbiAgJ2hpc3RvcnkuaHRtbCc6ICdoaXN0b3J5JyxcbiAgJ2hpc3RvcnkvaW5kZXguaHRtbCc6ICdoaXN0b3J5JyxcblxuICAnbmV3dGFiLmh0bWwnOiAnbmV3dGFiJyxcbiAgJ25ld3RhYi9pbmRleC5odG1sJzogJ25ld3RhYicsXG5cbiAgJ3NpZGVwYW5lbC5odG1sJzogJ3NpZGVwYW5lbCcsXG4gICdzaWRlcGFuZWwvaW5kZXguaHRtbCc6ICdzaWRlcGFuZWwnLFxuICAnKi5zaWRlcGFuZWwuaHRtbCc6ICdzaWRlcGFuZWwnLFxuICAnKi5zaWRlcGFuZWwvaW5kZXguaHRtbCc6ICdzaWRlcGFuZWwnLFxuXG4gICdkZXZ0b29scy5odG1sJzogJ2RldnRvb2xzJyxcbiAgJ2RldnRvb2xzL2luZGV4Lmh0bWwnOiAnZGV2dG9vbHMnLFxuXG4gICdiYWNrZ3JvdW5kLnRzJzogJ2JhY2tncm91bmQnLFxuICBbVklSVFVBTF9OT09QX0JBQ0tHUk9VTkRfTU9EVUxFX0lEXTogJ2JhY2tncm91bmQnLFxuXG4gICdjb250ZW50LnRzPyh4KSc6ICdjb250ZW50LXNjcmlwdCcsXG4gICdjb250ZW50L2luZGV4LnRzPyh4KSc6ICdjb250ZW50LXNjcmlwdCcsXG4gICcqLmNvbnRlbnQudHM/KHgpJzogJ2NvbnRlbnQtc2NyaXB0JyxcbiAgJyouY29udGVudC9pbmRleC50cz8oeCknOiAnY29udGVudC1zY3JpcHQnLFxuXG4gICdwb3B1cC5odG1sJzogJ3BvcHVwJyxcbiAgJ3BvcHVwL2luZGV4Lmh0bWwnOiAncG9wdXAnLFxuXG4gICdvcHRpb25zLmh0bWwnOiAnb3B0aW9ucycsXG4gICdvcHRpb25zL2luZGV4Lmh0bWwnOiAnb3B0aW9ucycsXG5cbiAgJyouaHRtbCc6ICd1bmxpc3RlZC1wYWdlJyxcbiAgJyovaW5kZXguaHRtbCc6ICd1bmxpc3RlZC1wYWdlJyxcbiAgJyoudHMnOiAndW5saXN0ZWQtc2NyaXB0JyxcblxuICAvLyBEb24ndCB3YXJuIGFib3V0IGFueSBmaWxlcyBpbiBzdWJkaXJlY3RvcmllcywgbGlrZSBDU1Mgb3IgSlMgZW50cnlwb2ludHMgZm9yIEhUTUwgZmlsZXNcbiAgJyovKic6ICdpZ25vcmVkJyxcbn07XG4iLCAiaW1wb3J0IGNyZWF0ZUpJVEkgZnJvbSAnaml0aSc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVVuaW1wb3J0IH0gZnJvbSAndW5pbXBvcnQnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB0cmFuc2Zvcm0gZnJvbSAnaml0aS9kaXN0L2JhYmVsJztcbmltcG9ydCB7IGdldFVuaW1wb3J0T3B0aW9ucyB9IGZyb20gJy4vYXV0by1pbXBvcnRzJztcbmltcG9ydCB7IHJlbW92ZUltcG9ydFN0YXRlbWVudHMgfSBmcm9tICcuL3N0cmluZ3MnO1xuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgZGVmYXVsdCBleHBvcnQgb2YgYSBgcGF0aGAuXG4gKlxuICogSXQgd29ya3MgYnk6XG4gKlxuICogMS4gUmVhZGluZyB0aGUgZmlsZSB0ZXh0XG4gKiAyLiBTdHJpcHBpbmcgYWxsIGltcG9ydHMgZnJvbSBpdCB2aWEgcmVnZXhcbiAqIDMuIEF1dG8taW1wb3J0IG9ubHkgdGhlIGNsaWVudCBoZWxwZXIgZnVuY3Rpb25zXG4gKlxuICogVGhpcyBwcmV2ZW50cyByZXNvbHZpbmcgaW1wb3J0cyBvZiBpbXBvcnRzLCBzcGVlZGluZyB0aGluZ3MgdXAgYW5kIHByZXZlbnRpbmcgXCJ4eHggaXMgbm90XG4gKiBkZWZpbmVkXCIgZXJyb3JzLlxuICpcbiAqIERvd25zaWRlIGlzIHRoYXQgY29kZSBjYW5ub3QgYmUgZXhlY3V0ZWQgb3V0c2lkZSBvZiB0aGUgbWFpbiBmdWNudGlvbiBmb3IgdGhlIGVudHJ5cG9pbnQsXG4gKiBvdGhlcndpc2UgeW91IHdpbGwgc2VlIFwieHh4IGlzIG5vdCBkZWZpbmVkXCIgZXJyb3JzIGZvciBhbnkgaW1wb3J0cyB1c2VkIG91dHNpZGUgb2YgbWFpbiBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFRzRmlsZTxUPihcbiAgcGF0aDogc3RyaW5nLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbmZpZy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgZmlsZSBtZXRhZGF0YTonLCBwYXRoKTtcblxuICBjb25zdCB1bmltcG9ydCA9IGNyZWF0ZVVuaW1wb3J0KHtcbiAgICAuLi5nZXRVbmltcG9ydE9wdGlvbnMoY29uZmlnKSxcbiAgICAvLyBPbmx5IGFsbG93IHNwZWNpZmljIGltcG9ydHMsIG5vdCBhbGwgZnJvbSB0aGUgcHJvamVjdFxuICAgIGltcG9ydHM6IFt7IG5hbWU6ICcqJywgYXM6ICdicm93c2VyJywgZnJvbTogJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCcgfV0sXG4gICAgZGlyczogW10sXG4gIH0pO1xuICBhd2FpdCB1bmltcG9ydC5pbml0KCk7XG5cbiAgY29uc3QgdGV4dCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICBjb25zdCB0ZXh0Tm9JbXBvcnRzID0gcmVtb3ZlSW1wb3J0U3RhdGVtZW50cyh0ZXh0KTtcbiAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB1bmltcG9ydC5pbmplY3RJbXBvcnRzKHRleHROb0ltcG9ydHMpO1xuICBjb25maWcubG9nZ2VyLmRlYnVnKFxuICAgIFsnVGV4dDonLCB0ZXh0LCAnTm8gaW1wb3J0czonLCB0ZXh0Tm9JbXBvcnRzLCAnQ29kZTonLCBjb2RlXS5qb2luKCdcXG4nKSxcbiAgKTtcblxuICBjb25zdCBqaXRpID0gY3JlYXRlSklUSShfX2ZpbGVuYW1lLCB7XG4gICAgY2FjaGU6IGZhbHNlLFxuICAgIGVzbVJlc29sdmU6IHRydWUsXG4gICAgaW50ZXJvcERlZmF1bHQ6IHRydWUsXG4gICAgYWxpYXM6IHtcbiAgICAgICd3ZWJleHRlbnNpb24tcG9seWZpbGwnOiByZXNvbHZlKFxuICAgICAgICBjb25maWcucm9vdCxcbiAgICAgICAgJ25vZGVfbW9kdWxlcy93eHQvZGlzdC92aXJ0dWFsLW1vZHVsZXMvZmFrZS1icm93c2VyLmpzJyxcbiAgICAgICksXG4gICAgfSxcbiAgICB0cmFuc2Zvcm0ob3B0cykge1xuICAgICAgaWYgKG9wdHMuZmlsZW5hbWUgPT09IHBhdGgpIHJldHVybiB0cmFuc2Zvcm0oeyAuLi5vcHRzLCBzb3VyY2U6IGNvZGUgfSk7XG4gICAgICBlbHNlIHJldHVybiB0cmFuc2Zvcm0ob3B0cyk7XG4gICAgfSxcbiAgfSk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgaml0aShwYXRoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uZmlnLmxvZ2dlci5lcnJvcihlcnIpO1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBrZWJhYkNhc2VBbHBoYW51bWVyaWMoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvW15hLXowLTktXFxzXS9nLCAnJykgLy8gUmVtb3ZlIGFsbCBub24tYWxwaGFudW1lcmljLCBub24taHlwaGVuIGNoYXJhY3RlcnNcbiAgICAucmVwbGFjZSgvXFxzKy9nLCAnLScpOyAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIGh5cGhlbnNcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGltcG9ydCBzdGF0ZW1lbnRzIGZyb20gdGhlIHRvcCBvZiBhIGZpbGUuIEtlZXBzIGltcG9ydC5tZXRhIGFuZCBpbmxpbmUsIGFzeW5jIGBpbXBvcnQoKWBcbiAqIGNhbGxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSW1wb3J0U3RhdGVtZW50cyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKFxuICAgIC8oaW1wb3J0XFxzP1t7XFx3XVtcXHNcXFNdKj9mcm9tXFxzP1tcIiddW1xcc1xcU10qP1tcIiddOz98aW1wb3J0XFxzP1tcIiddW1xcc1xcU10qP1tcIiddOz8pL2dtLFxuICAgICcnLFxuICApO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZVVuaW1wb3J0IH0gZnJvbSAndW5pbXBvcnQnO1xuaW1wb3J0IHsgRW50cnlwb2ludCwgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgZ2V0VW5pbXBvcnRPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvYXV0by1pbXBvcnRzJztcbmltcG9ydCB7IGdldEdsb2JhbHMgfSBmcm9tICcuLi91dGlscy9nbG9iYWxzJztcblxuLyoqXG4gKiBHZW5lcmF0ZSBhbmQgd3JpdGUgYWxsIHRoZSBmaWxlcyBpbnNpZGUgdGhlIGBJbnRlcm5hbENvbmZpZy50eXBlc0RpcmAgZGlyZWN0b3J5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUeXBlc0RpcihcbiAgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5lbnN1cmVEaXIoY29uZmlnLnR5cGVzRGlyKTtcblxuICBjb25zdCByZWZlcmVuY2VzOiBzdHJpbmdbXSA9IFtdO1xuICByZWZlcmVuY2VzLnB1c2goYXdhaXQgd3JpdGVJbXBvcnRzRGVjbGFyYXRpb25GaWxlKGNvbmZpZykpO1xuICByZWZlcmVuY2VzLnB1c2goYXdhaXQgd3JpdGVQYXRoc0RlY2xhcmF0aW9uRmlsZShlbnRyeXBvaW50cywgY29uZmlnKSk7XG4gIHJlZmVyZW5jZXMucHVzaChhd2FpdCB3cml0ZUdsb2JhbHNEZWNsYXJhdGlvbkZpbGUoY29uZmlnKSk7XG5cbiAgY29uc3QgbWFpblJlZmVyZW5jZSA9IGF3YWl0IHdyaXRlTWFpbkRlY2xhcmF0aW9uRmlsZShyZWZlcmVuY2VzLCBjb25maWcpO1xuICBhd2FpdCB3cml0ZVRzQ29uZmlnRmlsZShtYWluUmVmZXJlbmNlLCBjb25maWcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUltcG9ydHNEZWNsYXJhdGlvbkZpbGUoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnR5cGVzRGlyLCAnaW1wb3J0cy5kLnRzJyk7XG4gIGNvbnN0IHVuaW1wb3J0ID0gY3JlYXRlVW5pbXBvcnQoZ2V0VW5pbXBvcnRPcHRpb25zKGNvbmZpZykpO1xuXG4gIC8vIExvYWQgcHJvamVjdCBpbXBvcnRzIGludG8gdW5pbXBvcnQgbWVtb3J5IHNvIHRoZXkgYXJlIG91dHB1dCB2aWEgZ2VuZXJhdGVUeXBlRGVjbGFyYXRpb25zXG4gIGF3YWl0IHVuaW1wb3J0LnNjYW5JbXBvcnRzRnJvbURpcih1bmRlZmluZWQsIHsgY3dkOiBjb25maWcuc3JjRGlyIH0pO1xuXG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICBbJy8vIEdlbmVyYXRlZCBieSB3eHQnLCBhd2FpdCB1bmltcG9ydC5nZW5lcmF0ZVR5cGVEZWNsYXJhdGlvbnMoKV0uam9pbihcbiAgICAgICdcXG4nLFxuICAgICkgKyAnXFxuJyxcbiAgKTtcblxuICByZXR1cm4gZmlsZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUGF0aHNEZWNsYXJhdGlvbkZpbGUoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoY29uZmlnLnR5cGVzRGlyLCAncGF0aHMuZC50cycpO1xuICBjb25zdCB1bmlvbnMgPSBlbnRyeXBvaW50c1xuICAgIC5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICAgIGVudHJ5LFxuICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICBlbnRyeS5pbnB1dFBhdGguZW5kc1dpdGgoJy5odG1sJykgPyAnLmh0bWwnIDogJy5qcycsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGAgIHwgXCIvJHtwYXRofVwiYDtcbiAgICB9KVxuICAgIC5zb3J0KCk7XG5cbiAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgIGZpbGVQYXRoLFxuICAgIFtcbiAgICAgICcvLyBHZW5lcmF0ZWQgYnkgd3h0JyxcbiAgICAgICd0eXBlIEVudHJ5cG9pbnRQYXRoID0nLFxuICAgICAgLi4uKHVuaW9ucy5sZW5ndGggPT09IDAgPyBbJyAgbmV2ZXInXSA6IHVuaW9ucyksXG4gICAgXS5qb2luKCdcXG4nKSArICdcXG4nLFxuICApO1xuXG4gIHJldHVybiBmaWxlUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVHbG9iYWxzRGVjbGFyYXRpb25GaWxlKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGNvbmZpZy50eXBlc0RpciwgJ2dsb2JhbHMuZC50cycpO1xuICBjb25zdCBnbG9iYWxzID0gZ2V0R2xvYmFscyhjb25maWcpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgZmlsZVBhdGgsXG4gICAgW1xuICAgICAgJy8vIEdlbmVyYXRlZCBieSB3eHQnLFxuICAgICAgJ2V4cG9ydCB7fScsXG4gICAgICAnZGVjbGFyZSBnbG9iYWwgeycsXG4gICAgICAuLi5nbG9iYWxzLm1hcCgoZ2xvYmFsKSA9PiBgICBjb25zdCAke2dsb2JhbC5uYW1lfTogJHtnbG9iYWwudHlwZX07YCksXG4gICAgICAnfScsXG4gICAgXS5qb2luKCdcXG4nKSArICdcXG4nLFxuICAgICd1dGYtOCcsXG4gICk7XG4gIHJldHVybiBmaWxlUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVNYWluRGVjbGFyYXRpb25GaWxlKFxuICByZWZlcmVuY2VzOiBzdHJpbmdbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRpciA9IGNvbmZpZy53eHREaXI7XG4gIGNvbnN0IGZpbGVQYXRoID0gcmVzb2x2ZShkaXIsICd3eHQuZC50cycpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgZmlsZVBhdGgsXG4gICAgW1xuICAgICAgJy8vIEdlbmVyYXRlZCBieSB3eHQnLFxuICAgICAgYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwidml0ZS9jbGllbnRcIiAvPmAsXG4gICAgICAuLi5yZWZlcmVuY2VzLm1hcChcbiAgICAgICAgKHJlZikgPT4gYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi8ke3JlbGF0aXZlKGRpciwgcmVmKX1cIiAvPmAsXG4gICAgICApLFxuICAgIF0uam9pbignXFxuJykgKyAnXFxuJyxcbiAgKTtcbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVRzQ29uZmlnRmlsZShcbiAgbWFpblJlZmVyZW5jZTogc3RyaW5nLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIGNvbnN0IGRpciA9IGNvbmZpZy53eHREaXI7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICByZXNvbHZlKGRpciwgJ3RzY29uZmlnLmpzb24nKSxcbiAgICBge1xuICBcImNvbXBpbGVyT3B0aW9uc1wiOiB7XG4gICAgXCJ0YXJnZXRcIjogXCJFU05leHRcIixcbiAgICBcIm1vZHVsZVwiOiBcIkVTTmV4dFwiLFxuICAgIFwibW9kdWxlUmVzb2x1dGlvblwiOiBcIkJ1bmRsZXJcIixcbiAgICBcIm5vRW1pdFwiOiB0cnVlLFxuICAgIFwiZXNNb2R1bGVJbnRlcm9wXCI6IHRydWUsXG4gICAgXCJmb3JjZUNvbnNpc3RlbnRDYXNpbmdJbkZpbGVOYW1lc1wiOiB0cnVlLFxuICAgIFwicmVzb2x2ZUpzb25Nb2R1bGVcIjogdHJ1ZSxcblxuICAgIC8qIFR5cGUgQ2hlY2tpbmcgKi9cbiAgICBcInN0cmljdFwiOiB0cnVlLFxuXG4gICAgLyogQ29tcGxldGVuZXNzICovXG4gICAgXCJza2lwTGliQ2hlY2tcIjogdHJ1ZSxcblxuICAgIC8qIEFsaWFzZXMgKi9cbiAgICBcImJhc2VVcmxcIjogXCIke3JlbGF0aXZlKGRpciwgY29uZmlnLnJvb3QpfVwiLFxuICAgIFwicGF0aHNcIjoge1xuICAgICAgXCJAQFwiOiBbXCIuXCJdLFxuICAgICAgXCJAQC8qXCI6IFtcIi4vKlwiXSxcbiAgICAgIFwifn5cIjogW1wiLlwiXSxcbiAgICAgIFwifn4vKlwiOiBbXCIuLypcIl0sXG4gICAgICBcIkBcIjogW1wiJHtyZWxhdGl2ZShjb25maWcucm9vdCwgY29uZmlnLnNyY0Rpcil9XCJdLFxuICAgICAgXCJALypcIjogW1wiJHtyZWxhdGl2ZShjb25maWcucm9vdCwgY29uZmlnLnNyY0Rpcil9LypcIl0sXG4gICAgICBcIn5cIjogW1wiJHtyZWxhdGl2ZShjb25maWcucm9vdCwgY29uZmlnLnNyY0Rpcil9XCJdLFxuICAgICAgXCJ+LypcIjogW1wiJHtyZWxhdGl2ZShjb25maWcucm9vdCwgY29uZmlnLnNyY0Rpcil9LypcIl1cbiAgICB9XG4gIH0sXG4gIFwiaW5jbHVkZVwiOiBbXG4gICAgXCIke3JlbGF0aXZlKGRpciwgY29uZmlnLnJvb3QpfS8qKi8qXCIsXG4gICAgXCIuLyR7cmVsYXRpdmUoZGlyLCBtYWluUmVmZXJlbmNlKX1cIlxuICBdLFxuICBcImV4Y2x1ZGVcIjogW1wiJHtyZWxhdGl2ZShkaXIsIGNvbmZpZy5vdXRCYXNlRGlyKX1cIl1cbn1gLFxuICApO1xufVxuIiwgImltcG9ydCB7IEVudHJ5cG9pbnQgfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBNYW5pZmVzdCB9IGZyb20gJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCc7XG5pbXBvcnQge1xuICBCYWNrZ3JvdW5kRW50cnlwb2ludCxcbiAgQnVpbGRPdXRwdXQsXG4gIENvbnRlbnRTY3JpcHRFbnRyeXBvaW50LFxuICBJbnRlcm5hbENvbmZpZyxcbiAgT3B0aW9uc0VudHJ5cG9pbnQsXG4gIFBvcHVwRW50cnlwb2ludCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoIH0gZnJvbSAnLi9lbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBDb250ZW50U2VjdXJpdHlQb2xpY3kgfSBmcm9tICcuL0NvbnRlbnRTZWN1cml0eVBvbGljeSc7XG5pbXBvcnQge1xuICBoYXNoQ29udGVudFNjcmlwdE9wdGlvbnMsXG4gIG1hcFd4dE9wdGlvbnNUb0NvbnRlbnRTY3JpcHQsXG59IGZyb20gJy4vY29udGVudC1zY3JpcHRzJztcbmltcG9ydCB7IGdldFBhY2thZ2VKc29uIH0gZnJvbSAnLi9wYWNrYWdlJztcblxuLyoqXG4gKiBXcml0ZXMgdGhlIG1hbmlmZXN0IHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGFuZCB0aGUgYnVpbGQgb3V0cHV0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVNYW5pZmVzdChcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBvdXRwdXQ6IEJ1aWxkT3V0cHV0LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHN0ciA9XG4gICAgY29uZmlnLm1vZGUgPT09ICdwcm9kdWN0aW9uJ1xuICAgICAgPyBKU09OLnN0cmluZ2lmeShtYW5pZmVzdClcbiAgICAgIDogSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QsIG51bGwsIDIpO1xuXG4gIGF3YWl0IGZzLmVuc3VyZURpcihjb25maWcub3V0RGlyKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHJlc29sdmUoY29uZmlnLm91dERpciwgJ21hbmlmZXN0Lmpzb24nKSwgc3RyLCAndXRmLTgnKTtcblxuICBvdXRwdXQucHVibGljQXNzZXRzLnVuc2hpZnQoe1xuICAgIHR5cGU6ICdhc3NldCcsXG4gICAgZmlsZU5hbWU6ICdtYW5pZmVzdC5qc29uJyxcbiAgICBuYW1lOiAnbWFuaWZlc3QnLFxuICAgIG5lZWRzQ29kZVJlZmVyZW5jZTogZmFsc2UsXG4gICAgc291cmNlOiBzdHIsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgbWFuaWZlc3QgYmFzZWQgb24gdGhlIGNvbmZpZyBhbmQgZW50cnlwb2ludHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1haW5mZXN0KFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBidWlsZE91dHB1dDogT21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0PiB7XG4gIGNvbnN0IHBrZyA9IGF3YWl0IGdldFBhY2thZ2VKc29uKGNvbmZpZyk7XG5cbiAgY29uc3QgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0ID0gT2JqZWN0LmFzc2lnbihcbiAgICB7XG4gICAgICBtYW5pZmVzdF92ZXJzaW9uOiBjb25maWcubWFuaWZlc3RWZXJzaW9uLFxuICAgICAgbmFtZTogcGtnPy5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHBrZz8uZGVzY3JpcHRpb24sXG4gICAgICB2ZXJzaW9uOiBwa2c/LnZlcnNpb24gJiYgc2ltcGxpZnlWZXJzaW9uKHBrZy52ZXJzaW9uKSxcbiAgICAgIC8vIE9ubHkgYWRkIHRoZSB2ZXJzaW9uIG5hbWUgdG8gY2hyb21pdW0gYW5kIGlmIHRoZSB1c2VyIGhhc24ndCBzcGVjaWZpZWQgYSBjdXN0b20gdmVyc2lvbi5cbiAgICAgIHZlcnNpb25fbmFtZTpcbiAgICAgICAgY29uZmlnLmJyb3dzZXIgIT09ICdmaXJlZm94JyAmJiAhY29uZmlnLm1hbmlmZXN0LnZlcnNpb25cbiAgICAgICAgICA/IHBrZz8udmVyc2lvblxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgc2hvcnRfbmFtZTogcGtnPy5zaG9ydE5hbWUsXG4gICAgfSxcbiAgICBjb25maWcubWFuaWZlc3QsXG4gICk7XG5cbiAgYWRkRW50cnlwb2ludHMobWFuaWZlc3QsIGVudHJ5cG9pbnRzLCBidWlsZE91dHB1dCwgY29uZmlnKTtcblxuICBpZiAoY29uZmlnLmNvbW1hbmQgPT09ICdzZXJ2ZScpIGFkZERldk1vZGVDc3AobWFuaWZlc3QsIGNvbmZpZyk7XG4gIGlmIChjb25maWcuY29tbWFuZCA9PT0gJ3NlcnZlJykgYWRkRGV2TW9kZVBlcm1pc3Npb25zKG1hbmlmZXN0LCBjb25maWcpO1xuXG4gIC8vIFRPRE86IHRyYW5zZm9ybSBtYW5pZmVzdCBoZXJlLlxuXG4gIGlmIChtYW5pZmVzdC5uYW1lID09IG51bGwpXG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBcIk1hbmlmZXN0ICduYW1lJyBpcyBtaXNzaW5nLiBFaXRoZXI6XFxuMS4gU2V0IHRoZSBuYW1lIGluIHlvdXIgPHJvb3Q+L3BhY2thZ2UuanNvblxcbjIuIFNldCBhIG5hbWUgdmlhIHRoZSBtYW5pZmVzdCBvcHRpb24gaW4geW91ciB3eHQuY29uZmlnLnRzXCIsXG4gICAgKTtcbiAgaWYgKG1hbmlmZXN0LnZlcnNpb24gPT0gbnVsbCkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgXCJNYW5pZmVzdCAndmVyc2lvbicgaXMgbWlzc2luZy4gRWl0aGVyOlxcbjEuIEFkZCBhIHZlcnNpb24gaW4geW91ciA8cm9vdD4vcGFja2FnZS5qc29uXFxuMi4gUGFzcyB0aGUgdmVyc2lvbiB2aWEgdGhlIG1hbmlmZXN0IG9wdGlvbiBpbiB5b3VyIHd4dC5jb25maWcudHNcIixcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG1hbmlmZXN0O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgc3VmZml4ZXMgZnJvbSB0aGUgdmVyc2lvbiwgbGlrZSBYLlkuWi1hbHBoYTEgKHdoaWNoIGJyb3NlcnMgZG9uJ3QgYWxsb3cpLCBzbyBpdCdzIGFcbiAqIHNpbXBsZSB2ZXJzaW9uIG51bWJlciwgbGlrZSBYIG9yIFguWSBvciBYLlkuWiwgd2hpY2ggYnJvd3NlcnMgYWxsb3cuXG4gKi9cbmZ1bmN0aW9uIHNpbXBsaWZ5VmVyc2lvbih2ZXJzaW9uTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gUmVnZXggYWRhcHRlZCBmcm9tIGhlcmU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvTW96aWxsYS9BZGQtb25zL1dlYkV4dGVuc2lvbnMvbWFuaWZlc3QuanNvbi92ZXJzaW9uI3ZlcnNpb25fZm9ybWF0XG4gIGNvbnN0IHZlcnNpb24gPSAvXigoMHxbMS05XVswLTldezAsOH0pKFsuXSgwfFsxLTldWzAtOV17MCw4fSkpezAsM30pLiokLy5leGVjKFxuICAgIHZlcnNpb25OYW1lLFxuICApPy5bMV07XG5cbiAgaWYgKHZlcnNpb24gPT0gbnVsbClcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDYW5ub3Qgc2ltcGxpZnkgcGFja2FnZS5qc29uIHZlcnNpb24gXCIke3ZlcnNpb25OYW1lfVwiIHRvIGEgdmFsaWQgZXh0ZW5zaW9uIHZlcnNpb24sIFwiWC5ZLlpcImAsXG4gICAgKTtcblxuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZnVuY3Rpb24gYWRkRW50cnlwb2ludHMoXG4gIG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCxcbiAgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSxcbiAgYnVpbGRPdXRwdXQ6IE9taXQ8QnVpbGRPdXRwdXQsICdtYW5pZmVzdCc+LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogdm9pZCB7XG4gIGNvbnN0IGVudHJpZXNCeVR5cGUgPSBlbnRyeXBvaW50cy5yZWR1Y2U8XG4gICAgUGFydGlhbDxSZWNvcmQ8RW50cnlwb2ludFsndHlwZSddLCBFbnRyeXBvaW50W10+PlxuICA+KChtYXAsIGVudHJ5cG9pbnQpID0+IHtcbiAgICBtYXBbZW50cnlwb2ludC50eXBlXSA/Pz0gW107XG4gICAgbWFwW2VudHJ5cG9pbnQudHlwZV0/LnB1c2goZW50cnlwb2ludCk7XG4gICAgcmV0dXJuIG1hcDtcbiAgfSwge30pO1xuXG4gIGNvbnN0IGJhY2tncm91bmQgPSBlbnRyaWVzQnlUeXBlWydiYWNrZ3JvdW5kJ10/LlswXSBhc1xuICAgIHwgQmFja2dyb3VuZEVudHJ5cG9pbnRcbiAgICB8IHVuZGVmaW5lZDtcbiAgY29uc3QgYm9va21hcmtzID0gZW50cmllc0J5VHlwZVsnYm9va21hcmtzJ10/LlswXTtcbiAgY29uc3QgY29udGVudFNjcmlwdHMgPSBlbnRyaWVzQnlUeXBlWydjb250ZW50LXNjcmlwdCddIGFzXG4gICAgfCBDb250ZW50U2NyaXB0RW50cnlwb2ludFtdXG4gICAgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGRldnRvb2xzID0gZW50cmllc0J5VHlwZVsnZGV2dG9vbHMnXT8uWzBdO1xuICBjb25zdCBoaXN0b3J5ID0gZW50cmllc0J5VHlwZVsnaGlzdG9yeSddPy5bMF07XG4gIGNvbnN0IG5ld3RhYiA9IGVudHJpZXNCeVR5cGVbJ25ld3RhYiddPy5bMF07XG4gIGNvbnN0IG9wdGlvbnMgPSBlbnRyaWVzQnlUeXBlWydvcHRpb25zJ10/LlswXSBhc1xuICAgIHwgT3B0aW9uc0VudHJ5cG9pbnRcbiAgICB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcG9wdXAgPSBlbnRyaWVzQnlUeXBlWydwb3B1cCddPy5bMF0gYXMgUG9wdXBFbnRyeXBvaW50IHwgdW5kZWZpbmVkO1xuICBjb25zdCBzYW5kYm94ZXMgPSBlbnRyaWVzQnlUeXBlWydzYW5kYm94J107XG4gIGNvbnN0IHNpZGVwYW5lbHMgPSBlbnRyaWVzQnlUeXBlWydzaWRlcGFuZWwnXTtcblxuICBpZiAoYmFja2dyb3VuZCkge1xuICAgIGNvbnN0IHNjcmlwdCA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGJhY2tncm91bmQsIGNvbmZpZy5vdXREaXIsICcuanMnKTtcbiAgICBpZiAobWFuaWZlc3QubWFuaWZlc3RfdmVyc2lvbiA9PT0gMykge1xuICAgICAgbWFuaWZlc3QuYmFja2dyb3VuZCA9IHtcbiAgICAgICAgdHlwZTogYmFja2dyb3VuZC5vcHRpb25zLnR5cGUsXG4gICAgICAgIHNlcnZpY2Vfd29ya2VyOiBzY3JpcHQsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW5pZmVzdC5iYWNrZ3JvdW5kID0ge1xuICAgICAgICBwZXJzaXN0ZW50OiBiYWNrZ3JvdW5kLm9wdGlvbnMucGVyc2lzdGVudCxcbiAgICAgICAgc2NyaXB0czogW3NjcmlwdF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChib29rbWFya3MpIHtcbiAgICBpZiAoY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94Jykge1xuICAgICAgY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICAnQm9va21hcmtzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3guIGNocm9tZV91cmxfb3ZlcnJpZGVzLmJvb2ttYXJrcyB3YXMgbm90IGFkZGVkIHRvIHRoZSBtYW5pZmVzdCcsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcyA/Pz0ge307XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBib29rbWFya3MgaXMgdW50eXBlZCBpbiB3ZWJleHRlbnNpb24tcG9seWZpbGwsIGJ1dCBzdXBwb3J0ZWQgYnkgY2hyb21lXG4gICAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcy5ib29rbWFya3MgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgYm9va21hcmtzLFxuICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICAnLmh0bWwnLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaGlzdG9yeSkge1xuICAgIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgICdCb29rbWFya3MgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgRmlyZWZveC4gY2hyb21lX3VybF9vdmVycmlkZXMuaGlzdG9yeSB3YXMgbm90IGFkZGVkIHRvIHRoZSBtYW5pZmVzdCcsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcyA/Pz0ge307XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBoaXN0b3J5IGlzIHVudHlwZWQgaW4gd2ViZXh0ZW5zaW9uLXBvbHlmaWxsLCBidXQgc3VwcG9ydGVkIGJ5IGNocm9tZVxuICAgICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMuaGlzdG9yeSA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgICBoaXN0b3J5LFxuICAgICAgICBjb25maWcub3V0RGlyLFxuICAgICAgICAnLmh0bWwnLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAobmV3dGFiKSB7XG4gICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMgPz89IHt9O1xuICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzLm5ld3RhYiA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgbmV3dGFiLFxuICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICcuaHRtbCcsXG4gICAgKTtcbiAgfVxuXG4gIGlmIChwb3B1cCkge1xuICAgIGNvbnN0IGRlZmF1bHRfcG9wdXAgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgIHBvcHVwLFxuICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICcuaHRtbCcsXG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25zOiBNYW5pZmVzdC5BY3Rpb25NYW5pZmVzdCA9IHtcbiAgICAgIGRlZmF1bHRfaWNvbjogcG9wdXAub3B0aW9ucy5kZWZhdWx0SWNvbixcbiAgICAgIGRlZmF1bHRfdGl0bGU6IHBvcHVwLm9wdGlvbnMuZGVmYXVsdFRpdGxlLFxuICAgIH07XG4gICAgaWYgKG1hbmlmZXN0Lm1hbmlmZXN0X3ZlcnNpb24gPT09IDMpIHtcbiAgICAgIG1hbmlmZXN0LmFjdGlvbiA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgZGVmYXVsdF9wb3B1cCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0W3BvcHVwLm9wdGlvbnMubXYyS2V5ID8/ICdicm93c2VyX2FjdGlvbiddID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkZWZhdWx0X3BvcHVwLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoZGV2dG9vbHMpIHtcbiAgICBtYW5pZmVzdC5kZXZ0b29sc19wYWdlID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICBkZXZ0b29scyxcbiAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAnLmh0bWwnLFxuICAgICk7XG4gIH1cblxuICBpZiAob3B0aW9ucykge1xuICAgIGNvbnN0IHBhZ2UgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChvcHRpb25zLCBjb25maWcub3V0RGlyLCAnLmh0bWwnKTtcbiAgICBtYW5pZmVzdC5vcHRpb25zX3VpID0ge1xuICAgICAgb3Blbl9pbl90YWI6IG9wdGlvbnMub3B0aW9ucy5vcGVuSW5UYWIsXG4gICAgICBicm93c2VyX3N0eWxlOlxuICAgICAgICBjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnID8gb3B0aW9ucy5vcHRpb25zLmJyb3dzZXJTdHlsZSA6IHVuZGVmaW5lZCxcbiAgICAgIGNocm9tZV9zdHlsZTpcbiAgICAgICAgY29uZmlnLmJyb3dzZXIgIT09ICdmaXJlZm94JyA/IG9wdGlvbnMub3B0aW9ucy5jaHJvbWVTdHlsZSA6IHVuZGVmaW5lZCxcbiAgICAgIHBhZ2UsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChzYW5kYm94ZXM/Lmxlbmd0aCkge1xuICAgIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgICdTYW5kYm94ZWQgcGFnZXMgbm90IHN1cHBvcnRlZCBieSBGaXJlZm94LiBzYW5kYm94LnBhZ2VzIHdhcyBub3QgYWRkZWQgdG8gdGhlIG1hbmlmZXN0JyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHNhbmRib3ggbm90IHR5cGVkXG4gICAgICBtYW5pZmVzdC5zYW5kYm94ID0ge1xuICAgICAgICBwYWdlczogc2FuZGJveGVzLm1hcCgoZW50cnkpID0+XG4gICAgICAgICAgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoZW50cnksIGNvbmZpZy5vdXREaXIsICcuaHRtbCcpLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2lkZXBhbmVscz8ubGVuZ3RoKSB7XG4gICAgY29uc3QgZGVmYXVsdFNpZGVwYW5lbCA9XG4gICAgICBzaWRlcGFuZWxzLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5uYW1lID09PSAnc2lkZXBhbmVsJykgPz8gc2lkZXBhbmVsc1swXTtcbiAgICBjb25zdCBwYWdlID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICBkZWZhdWx0U2lkZXBhbmVsLFxuICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICcuaHRtbCcsXG4gICAgKTtcblxuICAgIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICBtYW5pZmVzdC5zaWRlYmFyX2FjdGlvbiA9IHtcbiAgICAgICAgLy8gVE9ETzogQWRkIG9wdGlvbnMgdG8gc2lkZSBwYW5lbFxuICAgICAgICAvLyAuLi5kZWZhdWx0U2lkZXBhbmVsLm9wdGlvbnMsXG4gICAgICAgIGRlZmF1bHRfcGFuZWw6IHBhZ2UsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLm1hbmlmZXN0VmVyc2lvbiA9PT0gMykge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogVW50eXBlZFxuICAgICAgbWFuaWZlc3Quc2lkZV9wYW5lbCA9IHtcbiAgICAgICAgZGVmYXVsdF9wYXRoOiBwYWdlLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnLmxvZ2dlci53YXJuKFxuICAgICAgICAnU2lkZSBwYW5lbCBub3Qgc3VwcG9ydGVkIGJ5IENocm9taXVtIHVzaW5nIE1WMi4gc2lkZV9wYW5lbC5kZWZhdWx0X3BhdGggd2FzIG5vdCBhZGRlZCB0byB0aGUgbWFuaWZlc3QnLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29udGVudFNjcmlwdHM/Lmxlbmd0aCkge1xuICAgIC8vIERvbid0IGFkZCBjb250ZW50IHNjcmlwdHMgdG8gdGhlIG1hbmlmZXN0IGluIGRldiBtb2RlIGZvciBNVjMgLSB0aGV5J3JlIG1hbmFnZWQgYW5kIHJlbG9hZGVkXG4gICAgLy8gYXQgcnVudGltZVxuICAgIGlmIChjb25maWcuY29tbWFuZCA9PT0gJ3NlcnZlJyAmJiBjb25maWcubWFuaWZlc3RWZXJzaW9uID09PSAzKSB7XG4gICAgICBjb25zdCBob3N0UGVybWlzc2lvbnMgPSBuZXcgU2V0PHN0cmluZz4obWFuaWZlc3QuaG9zdF9wZXJtaXNzaW9ucyA/PyBbXSk7XG4gICAgICBjb250ZW50U2NyaXB0cy5mb3JFYWNoKChzY3JpcHQpID0+IHtcbiAgICAgICAgc2NyaXB0Lm9wdGlvbnMubWF0Y2hlcy5mb3JFYWNoKChtYXRjaFBhdHRlcm4pID0+IHtcbiAgICAgICAgICBob3N0UGVybWlzc2lvbnMuYWRkKG1hdGNoUGF0dGVybik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBob3N0UGVybWlzc2lvbnMuZm9yRWFjaCgocGVybWlzc2lvbikgPT5cbiAgICAgICAgYWRkSG9zdFBlcm1pc3Npb24obWFuaWZlc3QsIHBlcm1pc3Npb24pLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaGFzaFRvRW50cnlwb2ludHNNYXAgPSBjb250ZW50U2NyaXB0cy5yZWR1Y2UoKG1hcCwgc2NyaXB0KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBoYXNoQ29udGVudFNjcmlwdE9wdGlvbnMoc2NyaXB0Lm9wdGlvbnMpO1xuICAgICAgICBpZiAobWFwLmhhcyhoYXNoKSkgbWFwLmdldChoYXNoKT8ucHVzaChzY3JpcHQpO1xuICAgICAgICBlbHNlIG1hcC5zZXQoaGFzaCwgW3NjcmlwdF0pO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgfSwgbmV3IE1hcDxzdHJpbmcsIENvbnRlbnRTY3JpcHRFbnRyeXBvaW50W10+KCkpO1xuXG4gICAgICBtYW5pZmVzdC5jb250ZW50X3NjcmlwdHMgPSBBcnJheS5mcm9tKGhhc2hUb0VudHJ5cG9pbnRzTWFwLmVudHJpZXMoKSkubWFwKFxuICAgICAgICAoWywgc2NyaXB0c10pID0+ICh7XG4gICAgICAgICAgLi4ubWFwV3h0T3B0aW9uc1RvQ29udGVudFNjcmlwdChzY3JpcHRzWzBdLm9wdGlvbnMpLFxuICAgICAgICAgIC8vIFRPT0Q6IFNvcnRpbmcgY3NzIGFuZCBqcyBhcnJheXMgaGVyZSBzbyB3ZSBnZXQgY29uc2lzdGVudCB0ZXN0IHJlc3VsdHMuLi4gYnV0IHdlXG4gICAgICAgICAgLy8gc2hvdWxkbid0IGhhdmUgdG8uIFdoZXJlIGlzIHRoZSBpbmNvbnNpc3RlbmN5IGNvbWluZyBmcm9tP1xuICAgICAgICAgIGNzczogZ2V0Q29udGVudFNjcmlwdENzc0ZpbGVzKHNjcmlwdHMsIGJ1aWxkT3V0cHV0KT8uc29ydCgpLFxuICAgICAgICAgIGpzOiBzY3JpcHRzXG4gICAgICAgICAgICAubWFwKChlbnRyeSkgPT5cbiAgICAgICAgICAgICAgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoZW50cnksIGNvbmZpZy5vdXREaXIsICcuanMnKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zb3J0KCksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRGV2TW9kZUNzcChcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogdm9pZCB7XG4gIGNvbnN0IHBlcm1pc3Npb24gPSBgaHR0cDovLyR7Y29uZmlnLnNlcnZlcj8uaG9zdG5hbWUgPz8gJyd9LypgO1xuICBjb25zdCBhbGxvd2VkQ3NwID0gY29uZmlnLnNlcnZlcj8ub3JpZ2luID8/ICdodHRwOi8vbG9jYWxob3N0OionO1xuXG4gIGlmIChtYW5pZmVzdC5tYW5pZmVzdF92ZXJzaW9uID09PSAzKSB7XG4gICAgYWRkSG9zdFBlcm1pc3Npb24obWFuaWZlc3QsIHBlcm1pc3Npb24pO1xuICB9IGVsc2Uge1xuICAgIGFkZFBlcm1pc3Npb24obWFuaWZlc3QsIHBlcm1pc3Npb24pO1xuICB9XG5cbiAgY29uc3QgY3NwID0gbmV3IENvbnRlbnRTZWN1cml0eVBvbGljeShcbiAgICBtYW5pZmVzdC5tYW5pZmVzdF92ZXJzaW9uID09PSAzXG4gICAgICA/IC8vIEB0cy1leHBlY3QtZXJyb3I6IGV4dGVuc2lvbl9wYWdlcyBpcyBub3QgdHlwZWRcbiAgICAgICAgbWFuaWZlc3QuY29udGVudF9zZWN1cml0eV9wb2xpY3k/LmV4dGVuc2lvbl9wYWdlcyA/P1xuICAgICAgICBcInNjcmlwdC1zcmMgJ3NlbGYnICd3YXNtLXVuc2FmZS1ldmFsJzsgb2JqZWN0LXNyYyAnc2VsZic7XCIgLy8gZGVmYXVsdCBDU1AgZm9yIE1WM1xuICAgICAgOiBtYW5pZmVzdC5jb250ZW50X3NlY3VyaXR5X3BvbGljeSA/P1xuICAgICAgICBcInNjcmlwdC1zcmMgJ3NlbGYnOyBvYmplY3Qtc3JjICdzZWxmJztcIiwgLy8gZGVmYXVsdCBDU1AgZm9yIE1WMlxuICApO1xuXG4gIGlmIChjb25maWcuc2VydmVyKSBjc3AuYWRkKCdzY3JpcHQtc3JjJywgYWxsb3dlZENzcCk7XG5cbiAgaWYgKG1hbmlmZXN0Lm1hbmlmZXN0X3ZlcnNpb24gPT09IDMpIHtcbiAgICBtYW5pZmVzdC5jb250ZW50X3NlY3VyaXR5X3BvbGljeSA/Pz0ge307XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogZXh0ZW5zaW9uX3BhZ2VzIGlzIG5vdCB0eXBlZFxuICAgIG1hbmlmZXN0LmNvbnRlbnRfc2VjdXJpdHlfcG9saWN5LmV4dGVuc2lvbl9wYWdlcyA9IGNzcC50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIG1hbmlmZXN0LmNvbnRlbnRfc2VjdXJpdHlfcG9saWN5ID0gY3NwLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRGV2TW9kZVBlcm1pc3Npb25zKFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pIHtcbiAgLy8gRm9yIHJlbG9hZGluZyB0aGUgcGFnZVxuICBhZGRQZXJtaXNzaW9uKG1hbmlmZXN0LCAndGFicycpO1xuXG4gIC8vIEZvciByZWdpc3RlcmluZyBjb250ZW50IHNjcmlwdHNcbiAgaWYgKGNvbmZpZy5tYW5pZmVzdFZlcnNpb24gPT09IDMpIGFkZFBlcm1pc3Npb24obWFuaWZlc3QsICdzY3JpcHRpbmcnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBidW5kbGUgcGF0aHMgdG8gQ1NTIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBhIGxpc3Qgb2YgY29udGVudCBzY3JpcHRzLCBvciB1bmRlZmluZWQgaWZcbiAqIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgQ1NTLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udGVudFNjcmlwdENzc0ZpbGVzKFxuICBjb250ZW50U2NyaXB0czogQ29udGVudFNjcmlwdEVudHJ5cG9pbnRbXSxcbiAgYnVpbGRPdXRwdXQ6IE9taXQ8QnVpbGRPdXRwdXQsICdtYW5pZmVzdCc+LFxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBjc3M6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3QgYWxsQ2h1bmtzID0gYnVpbGRPdXRwdXQuc3RlcHMuZmxhdE1hcCgoc3RlcCkgPT4gc3RlcC5jaHVua3MpO1xuXG4gIGNvbnRlbnRTY3JpcHRzLmZvckVhY2goKHNjcmlwdCkgPT4ge1xuICAgIC8vIFRPRE86IG9wdGltaXplIGFuZCByZW1vdmUgbG9vcCB3aXRoIGEgbWFwXG4gICAgY29uc3QgcmVsYXRlZENzcyA9IGFsbENodW5rcy5maW5kKFxuICAgICAgKGNodW5rKSA9PiBjaHVuay5maWxlTmFtZSA9PT0gYGFzc2V0cy8ke3NjcmlwdC5uYW1lfS5jc3NgLFxuICAgICk7XG4gICAgaWYgKHJlbGF0ZWRDc3MpIGNzcy5wdXNoKHJlbGF0ZWRDc3MuZmlsZU5hbWUpO1xuICB9KTtcblxuICBpZiAoY3NzLmxlbmd0aCA+IDApIHJldHVybiBjc3M7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFkZFBlcm1pc3Npb24oXG4gIG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCxcbiAgcGVybWlzc2lvbjogc3RyaW5nLFxuKTogdm9pZCB7XG4gIG1hbmlmZXN0LnBlcm1pc3Npb25zID8/PSBbXTtcbiAgaWYgKG1hbmlmZXN0LnBlcm1pc3Npb25zLmluY2x1ZGVzKHBlcm1pc3Npb24pKSByZXR1cm47XG4gIG1hbmlmZXN0LnBlcm1pc3Npb25zLnB1c2gocGVybWlzc2lvbik7XG59XG5cbmZ1bmN0aW9uIGFkZEhvc3RQZXJtaXNzaW9uKFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIGhvc3RQZXJtaXNzaW9uOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgbWFuaWZlc3QuaG9zdF9wZXJtaXNzaW9ucyA/Pz0gW107XG4gIGlmIChtYW5pZmVzdC5ob3N0X3Blcm1pc3Npb25zLmluY2x1ZGVzKGhvc3RQZXJtaXNzaW9uKSkgcmV0dXJuO1xuICBtYW5pZmVzdC5ob3N0X3Blcm1pc3Npb25zLnB1c2goaG9zdFBlcm1pc3Npb24pO1xufVxuIiwgIi8qKlxuICogRGlyZWN0aXZlIG5hbWVzIHRoYXQgbWFrZSB1cCBDU1BzLiBUaGVyZSBhcmUgbW9yZSwgdGhpcyBpcyBhbGwgSSBuZWVkIGZvciB0aGUgcGx1Z2luLlxuICovXG5leHBvcnQgdHlwZSBDc3BEaXJlY3RpdmUgPSAnZGVmYXVsdC1zcmMnIHwgJ3NjcmlwdC1zcmMnIHwgJ29iamVjdC1zcmMnO1xuXG5leHBvcnQgY2xhc3MgQ29udGVudFNlY3VyaXR5UG9saWN5IHtcbiAgcHJpdmF0ZSBzdGF0aWMgRElSRUNUSVZFX09SREVSOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCB1bmRlZmluZWQ+ID0ge1xuICAgICdkZWZhdWx0LXNyYyc6IDAsXG4gICAgJ3NjcmlwdC1zcmMnOiAxLFxuICAgICdvYmplY3Qtc3JjJzogMixcbiAgfTtcblxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG5cbiAgY29uc3RydWN0b3IoY3NwPzogc3RyaW5nKSB7XG4gICAgaWYgKGNzcCkge1xuICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjc3Auc3BsaXQoJzsnKS5tYXAoKHNlY3Rpb24pID0+IHNlY3Rpb24udHJpbSgpKTtcbiAgICAgIHRoaXMuZGF0YSA9IHNlY3Rpb25zLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+KChkYXRhLCBzZWN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IFtrZXksIC4uLnZhbHVlc10gPSBzZWN0aW9uLnNwbGl0KCcgJykubWFwKChpdGVtKSA9PiBpdGVtLnRyaW0oKSk7XG4gICAgICAgIGlmIChrZXkpIGRhdGFba2V5XSA9IHZhbHVlcztcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9LCB7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YSA9IHt9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYSBzZXQgb2YgdmFsdWVzIGFyZSBsaXN0ZWQgdW5kZXIgYSBkaXJlY3RpdmUuXG4gICAqL1xuICBhZGQoZGlyZWN0aXZlOiBDc3BEaXJlY3RpdmUsIC4uLm5ld1ZhbHVlczogc3RyaW5nW10pOiBDb250ZW50U2VjdXJpdHlQb2xpY3kge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZGF0YVtkaXJlY3RpdmVdID8/IFtdO1xuICAgIG5ld1ZhbHVlcy5mb3JFYWNoKChuZXdWYWx1ZSkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZXMuaW5jbHVkZXMobmV3VmFsdWUpKSB2YWx1ZXMucHVzaChuZXdWYWx1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5kYXRhW2RpcmVjdGl2ZV0gPSB2YWx1ZXM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpcmVjdGl2ZXMgPSBPYmplY3QuZW50cmllcyh0aGlzLmRhdGEpLnNvcnQoKFtsXSwgW3JdKSA9PiB7XG4gICAgICBjb25zdCBsbyA9IENvbnRlbnRTZWN1cml0eVBvbGljeS5ESVJFQ1RJVkVfT1JERVJbbF0gPz8gMjtcbiAgICAgIGNvbnN0IHJvID0gQ29udGVudFNlY3VyaXR5UG9saWN5LkRJUkVDVElWRV9PUkRFUltyXSA/PyAyO1xuICAgICAgcmV0dXJuIGxvIC0gcm87XG4gICAgfSk7XG4gICAgcmV0dXJuIGRpcmVjdGl2ZXMubWFwKChlbnRyeSkgPT4gZW50cnkuZmxhdCgpLmpvaW4oJyAnKSkuam9pbignOyAnKSArICc7JztcbiAgfVxufVxuIiwgImltcG9ydCB7IE1hbmlmZXN0IH0gZnJvbSAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJztcbmltcG9ydCB7IENvbnRlbnRTY3JpcHRFbnRyeXBvaW50IH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIFJldHVybnMgYSB1bmlxdWUgYW5kIGNvbnNpc3RlbnQgc3RyaW5nIGhhc2ggYmFzZWQgb24gYSBjb250ZW50IHNjcmlwdHMgb3B0aW9ucy5cbiAqXG4gKiBJdCBpcyBhYmxlIHRvIHJlY29nbml6ZSBkZWZhdWx0IHZhbHVlcyxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hDb250ZW50U2NyaXB0T3B0aW9ucyhcbiAgb3B0aW9uczogQ29udGVudFNjcmlwdEVudHJ5cG9pbnRbJ29wdGlvbnMnXSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHdpdGhEZWZhdWx0czogQ29udGVudFNjcmlwdEVudHJ5cG9pbnRbJ29wdGlvbnMnXSA9IHtcbiAgICBleGNsdWRlR2xvYnM6IFtdLFxuICAgIGV4Y2x1ZGVNYXRjaGVzOiBbXSxcbiAgICBpbmNsdWRlR2xvYnM6IFtdLFxuICAgIG1hdGNoQWJvdXRCbGFuazogZmFsc2UsXG4gICAgbWF0Y2hPcmlnaW5Bc0ZhbGxiYWNrOiBmYWxzZSxcbiAgICBydW5BdDogJ2RvY3VtZW50X2lkbGUnLFxuICAgIGFsbEZyYW1lczogZmFsc2UsXG4gICAgd29ybGQ6ICdJU09MQVRFRCcsXG4gICAgLy8gVE9ETzogc3RyaXAgdW5kZWZpbmVkIGZpZWxkcyBmcm9tIG9wdGlvbnMgb2JqZWN0IHRvIGltcHJvdmUgY29udGVudCBzY3JpcHQgZ3JvdXBpbmcuXG4gICAgLi4ub3B0aW9ucyxcbiAgfTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHdpdGhEZWZhdWx0cylcbiAgICAgIC8vIFNvcnQgYW55IGFycmF5cyBzbyB0aGVpciB2YWx1ZXMgYXJlIGNvbnNpc3RlbnRcbiAgICAgIC5tYXA8W3N0cmluZywgdW5rbm93bl0+KChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW2tleSwgdmFsdWUuc29ydCgpXTtcbiAgICAgICAgZWxzZSByZXR1cm4gW2tleSwgdmFsdWVdO1xuICAgICAgfSlcbiAgICAgIC8vIFNvcnQgYWxsIHRoZSBmaWVsZHMgYWxwaGFiZXRpY2FsbHlcbiAgICAgIC5zb3J0KChsLCByKSA9PiBsWzBdLmxvY2FsZUNvbXBhcmUoclswXSkpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwV3h0T3B0aW9uc1RvQ29udGVudFNjcmlwdChcbiAgb3B0aW9uczogQ29udGVudFNjcmlwdEVudHJ5cG9pbnRbJ29wdGlvbnMnXSxcbik6IE9taXQ8TWFuaWZlc3QuQ29udGVudFNjcmlwdCwgJ2pzJyB8ICdjc3MnPiB7XG4gIHJldHVybiB7XG4gICAgbWF0Y2hlczogb3B0aW9ucy5tYXRjaGVzLFxuICAgIGFsbF9mcmFtZXM6IG9wdGlvbnMuYWxsRnJhbWVzLFxuICAgIG1hdGNoX2Fib3V0X2JsYW5rOiBvcHRpb25zLm1hdGNoQWJvdXRCbGFuayxcbiAgICBleGNsdWRlX2dsb2JzOiBvcHRpb25zLmV4Y2x1ZGVHbG9icyxcbiAgICBleGNsdWRlX21hdGNoZXM6IG9wdGlvbnMuZXhjbHVkZU1hdGNoZXMsXG4gICAgaW5jbHVkZV9nbG9iczogb3B0aW9ucy5pbmNsdWRlR2xvYnMsXG4gICAgcnVuX2F0OiBvcHRpb25zLnJ1bkF0LFxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogdW50eXBlZCBjaHJvbWUgb3B0aW9uc1xuICAgIG1hdGNoX29yaWdpbl9hc19mYWxsYmFjazogb3B0aW9ucy5tYXRjaE9yaWdpbkFzRmFsbGJhY2ssXG4gICAgd29ybGQ6IG9wdGlvbnMud29ybGQsXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5cbi8qKlxuICogUmVhZCB0aGUgcHJvamVjdCdzIHBhY2thZ2UuanNvbi5cbiAqXG4gKiBUT0RPOiBsb29rIGluIHJvb3QgYW5kIHVwIGRpcmVjdG9yaWVzIHVudGlsIGl0J3MgZm91bmRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VKc29uKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIGFueT4+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGZpbGUgPSByZXNvbHZlKGNvbmZpZy5yb290LCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRKc29uKGZpbGUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25maWcubG9nZ2VyLmRlYnVnKFxuICAgICAgYEZhaWxlZCB0byByZWFkIHBhY2thZ2UuanNvbiBhdDogJHtmaWxlfS4gUmV0dXJuaW5nIHVuZGVmaW5lZC5gLFxuICAgICk7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTWFuaWZlc3QgfSBmcm9tICd3ZWJleHRlbnNpb24tcG9seWZpbGwnO1xuaW1wb3J0IHsgQnVpbGRPdXRwdXQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGJ1aWxkRW50cnlwb2ludHMgfSBmcm9tICcuL2J1aWxkL2J1aWxkRW50cnlwb2ludHMnO1xuaW1wb3J0IHsgZmluZEVudHJ5cG9pbnRzIH0gZnJvbSAnLi9idWlsZC9maW5kRW50cnlwb2ludHMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUeXBlc0RpciB9IGZyb20gJy4vYnVpbGQvZ2VuZXJhdGVUeXBlc0Rpcic7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZywgRW50cnlwb2ludEdyb3VwIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU1haW5mZXN0LCB3cml0ZU1hbmlmZXN0IH0gZnJvbSAnLi91dGlscy9tYW5pZmVzdCc7XG5pbXBvcnQgcGMgZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGdyb3VwRW50cnlwb2ludHMgfSBmcm9tICcuL3V0aWxzL2dyb3VwRW50cnlwb2ludHMnO1xuaW1wb3J0IHsgZm9ybWF0RHVyYXRpb24gfSBmcm9tICcuL3V0aWxzL2Zvcm1hdER1cmF0aW9uJztcbmltcG9ydCB7IHByaW50QnVpbGRTdW1tYXJ5IH0gZnJvbSAnLi9sb2cvcHJpbnRCdWlsZFN1bW1hcnknO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZXh0ZW5zaW9uIGJhc2VkIG9uIGFuIGludGVybmFsIGNvbmZpZy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uOlxuICogMS4gQ2xlYW5zIHRoZSBvdXRwdXQgZGlyZWN0b3J5XG4gKiAyLiBFeGVjdXRlcyB0aGUgcmVidWlsZCBmdW5jdGlvbiB3aXRoIGEgYmxhbmsgcHJldmlvdXMgb3V0cHV0IHNvIGV2ZXJ5dGhpbmcgaXMgYnVpbHQgKHNlZVxuICogICAgYHJlYnVpbGRgIGZvciBtb3JlIGRldGFpbHMpXG4gKiAzLiBQcmludHMgdGhlIHN1bW1hcnlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSW50ZXJuYWwoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPEJ1aWxkT3V0cHV0PiB7XG4gIGNvbnN0IHZlcmIgPSBjb25maWcuY29tbWFuZCA9PT0gJ3NlcnZlJyA/ICdQcmUtcmVuZGVyaW5nJyA6ICdCdWlsZGluZyc7XG4gIGNvbnN0IHRhcmdldCA9IGAke2NvbmZpZy5icm93c2VyfS1tdiR7Y29uZmlnLm1hbmlmZXN0VmVyc2lvbn1gO1xuICBjb25maWcubG9nZ2VyLmluZm8oXG4gICAgYCR7dmVyYn0gJHtwYy5jeWFuKHRhcmdldCl9IGZvciAke3BjLmN5YW4oY29uZmlnLm1vZGUpfSB3aXRoICR7cGMuZ3JlZW4oXG4gICAgICBgVml0ZSAke3ZpdGUudmVyc2lvbn1gLFxuICAgICl9YCxcbiAgKTtcbiAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAvLyBDbGVhbnVwXG4gIGF3YWl0IGZzLnJtKGNvbmZpZy5vdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMuZW5zdXJlRGlyKGNvbmZpZy5vdXREaXIpO1xuXG4gIGNvbnN0IGVudHJ5cG9pbnRzID0gYXdhaXQgZmluZEVudHJ5cG9pbnRzKGNvbmZpZyk7XG4gIGNvbnN0IGdyb3VwcyA9IGdyb3VwRW50cnlwb2ludHMoZW50cnlwb2ludHMpO1xuICBjb25zdCB7IG91dHB1dCB9ID0gYXdhaXQgcmVidWlsZChjb25maWcsIGdyb3VwcywgdW5kZWZpbmVkKTtcblxuICAvLyBQb3N0LWJ1aWxkXG4gIGNvbmZpZy5sb2dnZXIuc3VjY2VzcyhcbiAgICBgQnVpbHQgZXh0ZW5zaW9uIGluICR7Zm9ybWF0RHVyYXRpb24oRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9YCxcbiAgKTtcbiAgYXdhaXQgcHJpbnRCdWlsZFN1bW1hcnkob3V0cHV0LCBjb25maWcpO1xuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBjb25maWd1cmF0aW9uLCBsaXN0IG9mIGVudHJ5cG9pbnRzLCBhbmQgYW4gZXhpc3RpbmcsIHBhcnRpYWwgb3V0cHV0LCBidWlsZCB0aGVcbiAqIGVudHJ5cG9pbnRzIGFuZCBtZXJnZSB0aGUgbmV3IG91dHB1dCB3aXRoIHRoZSBleGlzdGluZyBvdXRwdXQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsOlxuICogMS4gR2VuZXJhdGUgdGhlIC53eHQgZGlyZWN0b3J5J3MgdHlwZXNcbiAqIDIuIEJ1aWxkIHRoZSBgZW50cnlwb2ludEdyb3Vwc2AgKGFuZCBjb3BpZXMgcHVibGljIGZpbGVzKVxuICogMy4gR2VuZXJhdGUgdGhlIGxhdGVzdCBtYW5pZmVzdCBmb3IgYWxsIGVudHJ5cG9pbnRzXG4gKiA0LiBXcml0ZSB0aGUgbmV3IG1hbmlmZXN0IHRvIHRoZSBmaWxlIHN5c3RlbVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVidWlsZChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgZW50cnlwb2ludEdyb3VwczogRW50cnlwb2ludEdyb3VwW10sXG4gIGV4aXN0aW5nT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPiA9IHtcbiAgICBzdGVwczogW10sXG4gICAgcHVibGljQXNzZXRzOiBbXSxcbiAgfSxcbik6IFByb21pc2U8eyBvdXRwdXQ6IEJ1aWxkT3V0cHV0OyBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QgfT4ge1xuICAvLyBVcGRhdGUgdHlwZXMgZGlyZWN0b3J5IHdpdGggbmV3IGZpbGVzIGFuZCB0eXBlc1xuICBjb25zdCBhbGxFbnRyeXBvaW50cyA9IGF3YWl0IGZpbmRFbnRyeXBvaW50cyhjb25maWcpO1xuICBhd2FpdCBnZW5lcmF0ZVR5cGVzRGlyKGFsbEVudHJ5cG9pbnRzLCBjb25maWcpLmNhdGNoKChlcnIpID0+IHtcbiAgICBjb25maWcubG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byB1cGRhdGUgLnd4dCBkaXJlY3Rvcnk6JywgZXJyKTtcbiAgICAvLyBUaHJvdyB0aGUgZXJyb3IgaWYgZG9pbmcgYSByZWd1bGFyIGJ1aWxkLCBkb24ndCBmb3IgZGV2IG1vZGUuXG4gICAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnYnVpbGQnKSB0aHJvdyBlcnI7XG4gIH0pO1xuXG4gIC8vIEJ1aWxkIGFuZCBtZXJnZSB0aGUgb3V0cHV0c1xuICBjb25zdCBuZXdPdXRwdXQgPSBhd2FpdCBidWlsZEVudHJ5cG9pbnRzKGVudHJ5cG9pbnRHcm91cHMsIGNvbmZpZyk7XG4gIGNvbnN0IG1lcmdlZE91dHB1dDogT21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4gPSB7XG4gICAgc3RlcHM6IFsuLi5leGlzdGluZ091dHB1dC5zdGVwcywgLi4ubmV3T3V0cHV0LnN0ZXBzXSxcbiAgICBwdWJsaWNBc3NldHM6IFsuLi5leGlzdGluZ091dHB1dC5wdWJsaWNBc3NldHMsIC4uLm5ld091dHB1dC5wdWJsaWNBc3NldHNdLFxuICB9O1xuXG4gIGNvbnN0IG5ld01hbmlmZXN0ID0gYXdhaXQgZ2VuZXJhdGVNYWluZmVzdChcbiAgICBhbGxFbnRyeXBvaW50cyxcbiAgICBtZXJnZWRPdXRwdXQsXG4gICAgY29uZmlnLFxuICApO1xuICBjb25zdCBmaW5hbE91dHB1dDogQnVpbGRPdXRwdXQgPSB7XG4gICAgbWFuaWZlc3Q6IG5ld01hbmlmZXN0LFxuICAgIC4uLm5ld091dHB1dCxcbiAgfTtcblxuICAvLyBXcml0ZSBtYW5pZmVzdFxuICBhd2FpdCB3cml0ZU1hbmlmZXN0KG5ld01hbmlmZXN0LCBmaW5hbE91dHB1dCwgY29uZmlnKTtcblxuICByZXR1cm4ge1xuICAgIG91dHB1dDoge1xuICAgICAgbWFuaWZlc3Q6IG5ld01hbmlmZXN0LFxuICAgICAgc3RlcHM6IFsuLi5leGlzdGluZ091dHB1dC5zdGVwcywgLi4uZmluYWxPdXRwdXQuc3RlcHNdLFxuICAgICAgcHVibGljQXNzZXRzOiBbXG4gICAgICAgIC4uLmV4aXN0aW5nT3V0cHV0LnB1YmxpY0Fzc2V0cyxcbiAgICAgICAgLi4uZmluYWxPdXRwdXQucHVibGljQXNzZXRzLFxuICAgICAgXSxcbiAgICB9LFxuICAgIG1hbmlmZXN0OiBuZXdNYW5pZmVzdCxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBFbnRyeXBvaW50IH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgRW50cnlwb2ludEdyb3VwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIEVudHJ5cG9pbnRzIGNhbiBiZSBidWlsZCBpbiBncm91cHMuIEhUTUwgcGFnZXMgY2FuIGFsbCBiZSBidWlsdCB0b2dldGhlciBpbiBhIHNpbmdsZSBzdGVwLCB3aGlsZVxuICogY29udGVudCBzY3JpcHRzIG11c3QgYmUgYnVpbGQgaW5kaXZpZHVhbGx5LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZW50cnlwb2ludHMgcHV0IGludG8gdGhlc2UgdHlwZXMgb2YgZ3JvdXBzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBFbnRyeXBvaW50cyhlbnRyeXBvaW50czogRW50cnlwb2ludFtdKTogRW50cnlwb2ludEdyb3VwW10ge1xuICBjb25zdCBncm91cEluZGV4TWFwOiBQYXJ0aWFsPFJlY29yZDxHcm91cCwgbnVtYmVyPj4gPSB7fTtcbiAgY29uc3QgZ3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cnlwb2ludHMpIHtcbiAgICBjb25zdCBncm91cCA9IEVOVFJZX1RZUEVfVE9fR1JPVVBfTUFQW2VudHJ5LnR5cGVdO1xuICAgIGlmIChncm91cCA9PT0gJ25vLWdyb3VwJykge1xuICAgICAgZ3JvdXBzLnB1c2goZW50cnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZ3JvdXBJbmRleCA9IGdyb3VwSW5kZXhNYXBbZ3JvdXBdO1xuICAgICAgaWYgKGdyb3VwSW5kZXggPT0gbnVsbCkge1xuICAgICAgICBncm91cEluZGV4ID0gZ3JvdXBzLnB1c2goW10pIC0gMTtcbiAgICAgICAgZ3JvdXBJbmRleE1hcFtncm91cF0gPSBncm91cEluZGV4O1xuICAgICAgfVxuICAgICAgKGdyb3Vwc1tncm91cEluZGV4XSBhcyBFbnRyeXBvaW50W10pLnB1c2goZW50cnkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBncm91cHM7XG59XG5cbmNvbnN0IEVOVFJZX1RZUEVfVE9fR1JPVVBfTUFQOiBSZWNvcmQ8RW50cnlwb2ludFsndHlwZSddLCBHcm91cD4gPSB7XG4gIHNhbmRib3g6ICdzYW5kYm94LXBhZ2UnLFxuXG4gIHBvcHVwOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICBuZXd0YWI6ICdleHRlbnNpb24tcGFnZScsXG4gIGhpc3Rvcnk6ICdleHRlbnNpb24tcGFnZScsXG4gIG9wdGlvbnM6ICdleHRlbnNpb24tcGFnZScsXG4gIGRldnRvb2xzOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICBib29rbWFya3M6ICdleHRlbnNpb24tcGFnZScsXG4gIHNpZGVwYW5lbDogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgJ3VubGlzdGVkLXBhZ2UnOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuXG4gIGJhY2tncm91bmQ6ICduby1ncm91cCcsXG4gICdjb250ZW50LXNjcmlwdCc6ICduby1ncm91cCcsXG4gICd1bmxpc3RlZC1zY3JpcHQnOiAnbm8tZ3JvdXAnLFxufTtcblxudHlwZSBHcm91cCA9ICdleHRlbnNpb24tcGFnZScgfCAnc2FuZGJveC1wYWdlJyB8ICduby1ncm91cCc7XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZHVyYXRpb24gPCAxZTMpIHJldHVybiBgJHtkdXJhdGlvbn0gbXNgO1xuICBpZiAoZHVyYXRpb24gPCAxMGUzKSByZXR1cm4gYCR7KGR1cmF0aW9uIC8gMWUzKS50b0ZpeGVkKDMpfSBzYDtcbiAgaWYgKGR1cmF0aW9uIDwgNjBlMykgcmV0dXJuIGAkeyhkdXJhdGlvbiAvIDFlMykudG9GaXhlZCgxKX0gc2A7XG4gIHJldHVybiBgJHsoZHVyYXRpb24gLyAxZTMpLnRvRml4ZWQoMCl9IHNgO1xufVxuIiwgImltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IEJ1aWxkT3V0cHV0LCBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHByaW50RmlsZUxpc3QgfSBmcm9tICcuL3ByaW50RmlsZUxpc3QnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJpbnRCdWlsZFN1bW1hcnkoXG4gIG91dHB1dDogQnVpbGRPdXRwdXQsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pIHtcbiAgY29uc3QgY2h1bmtzID0gW1xuICAgIC4uLm91dHB1dC5zdGVwcy5mbGF0TWFwKChzdGVwKSA9PiBzdGVwLmNodW5rcyksXG4gICAgLi4ub3V0cHV0LnB1YmxpY0Fzc2V0cyxcbiAgXS5zb3J0KChsLCByKSA9PiB7XG4gICAgY29uc3QgbFdlaWdodCA9IGdldENodW5rU29ydFdlaWdodChsLmZpbGVOYW1lKTtcbiAgICBjb25zdCByV2VpZ2h0ID0gZ2V0Q2h1bmtTb3J0V2VpZ2h0KHIuZmlsZU5hbWUpO1xuICAgIGNvbnN0IGRpZmYgPSBsV2VpZ2h0IC0gcldlaWdodDtcbiAgICBpZiAoZGlmZiAhPT0gMCkgcmV0dXJuIGRpZmY7XG4gICAgcmV0dXJuIGwuZmlsZU5hbWUubG9jYWxlQ29tcGFyZShyLmZpbGVOYW1lKTtcbiAgfSk7XG5cbiAgY29uc3QgZmlsZXMgPSBjaHVua3MubWFwKChjaHVuaykgPT4gcmVzb2x2ZShjb25maWcub3V0RGlyLCBjaHVuay5maWxlTmFtZSkpO1xuICBhd2FpdCBwcmludEZpbGVMaXN0KGNvbmZpZy5sb2dnZXIubG9nLCBjb25maWcub3V0RGlyLCBmaWxlcyk7XG59XG5cbmNvbnN0IERFRkFVTFRfU09SVF9XRUlHSFQgPSAxMDA7XG5jb25zdCBDSFVOS19TT1JUX1dFSUdIVFM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gICdtYW5pZmVzdC5qc29uJzogMCxcbiAgJy5odG1sJzogMSxcbiAgJy5qcy5tYXAnOiAyLFxuICAnLmpzJzogMixcbiAgJy5jc3MnOiAzLFxufTtcbmZ1bmN0aW9uIGdldENodW5rU29ydFdlaWdodChmaWxlbmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0LmVudHJpZXMoQ0hVTktfU09SVF9XRUlHSFRTKS5maW5kKChba2V5XSkgPT5cbiAgICAgIGZpbGVuYW1lLmVuZHNXaXRoKGtleSksXG4gICAgKT8uWzFdID8/IERFRkFVTFRfU09SVF9XRUlHSFRcbiAgKTtcbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGZpbGVzaXplIH0gZnJvbSAnZmlsZXNpemUnO1xuaW1wb3J0IHsgcHJpbnRUYWJsZSB9IGZyb20gJy4vcHJpbnRUYWJsZSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmludEZpbGVMaXN0KFxuICBsb2c6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQsXG4gIGJhc2VEaXI6IHN0cmluZyxcbiAgZmlsZXM6IHN0cmluZ1tdLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCB0b3RhbFNpemUgPSAwO1xuXG4gIGNvbnN0IGZpbGVSb3dzOiBzdHJpbmdbXVtdID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgZmlsZXMubWFwKGFzeW5jIChmaWxlLCBpKSA9PiB7XG4gICAgICBjb25zdCBwYXJ0cyA9IFtcbiAgICAgICAgcGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBiYXNlRGlyKSArIHBhdGguc2VwLFxuICAgICAgICBwYXRoLnJlbGF0aXZlKGJhc2VEaXIsIGZpbGUpLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHByZWZpeCA9IGkgPT09IGZpbGVzLmxlbmd0aCAtIDEgPyAnICBcdTI1MTRcdTI1MDAnIDogJyAgXHUyNTFDXHUyNTAwJztcbiAgICAgIGNvbnN0IGNvbG9yID0gZ2V0Q2h1bmtDb2xvcihmaWxlKTtcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMubHN0YXQoZmlsZSk7XG4gICAgICB0b3RhbFNpemUgKz0gc3RhdHMuc2l6ZTtcbiAgICAgIGNvbnN0IHNpemUgPSBTdHJpbmcoZmlsZXNpemUoc3RhdHMuc2l6ZSkpO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgYCR7cGMuZ3JheShwcmVmaXgpfSAke3BjLmRpbShwYXJ0c1swXSl9JHtjb2xvcihwYXJ0c1sxXSl9YCxcbiAgICAgICAgcGMuZGltKHNpemUpLFxuICAgICAgXTtcbiAgICB9KSxcbiAgKTtcblxuICBwcmludFRhYmxlKGxvZywgZmlsZVJvd3MpO1xuXG4gIGxvZyhgJHtwYy5jeWFuKCdcdTAzQTMgVG90YWwgc2l6ZTonKX0gJHtTdHJpbmcoZmlsZXNpemUodG90YWxTaXplKSl9YCk7XG59XG5cbmNvbnN0IERFRkFVTFRfQ09MT1IgPSBwYy5ibHVlO1xuY29uc3QgQ0hVTktfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCAodGV4dDogc3RyaW5nKSA9PiBzdHJpbmc+ID0ge1xuICAnLmpzLm1hcCc6IHBjLmdyYXksXG4gICcuaHRtbCc6IHBjLmdyZWVuLFxuICAnLmNzcyc6IHBjLm1hZ2VudGEsXG4gICcuanMnOiBwYy5jeWFuLFxuICAnLnppcCc6IHBjLnllbGxvdyxcbn07XG5mdW5jdGlvbiBnZXRDaHVua0NvbG9yKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIChcbiAgICBPYmplY3QuZW50cmllcyhDSFVOS19DT0xPUlMpLmZpbmQoKFtrZXldKSA9PiBmaWxlbmFtZS5lbmRzV2l0aChrZXkpKT8uWzFdID8/XG4gICAgREVGQVVMVF9DT0xPUlxuICApO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBwcmludFRhYmxlKFxuICBsb2c6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQsXG4gIHJvd3M6IHN0cmluZ1tdW10sXG4gIGdhcCA9IDIsXG4pOiB2b2lkIHtcbiAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgY29sdW1uV2lkdGhzID0gcm93cy5yZWR1Y2UoXG4gICAgKHdpZHRocywgcm93KSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWF4KHdpZHRocy5sZW5ndGgsIHJvdy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgd2lkdGhzW2ldID0gTWF0aC5tYXgocm93W2ldPy5sZW5ndGggPz8gMCwgd2lkdGhzW2ldID8/IDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdpZHRocztcbiAgICB9LFxuICAgIHJvd3NbMF0ubWFwKChjb2x1bW4pID0+IGNvbHVtbi5sZW5ndGgpLFxuICApO1xuXG4gIGxldCBzdHIgPSAnJztcbiAgcm93cy5mb3JFYWNoKChyb3csIGkpID0+IHtcbiAgICByb3cuZm9yRWFjaCgoY29sLCBqKSA9PiB7XG4gICAgICBzdHIgKz0gY29sLnBhZEVuZChjb2x1bW5XaWR0aHNbal0sICcgJyk7XG4gICAgICBpZiAoaiAhPT0gcm93Lmxlbmd0aCAtIDEpIHN0ciArPSAnJy5wYWRFbmQoZ2FwLCAnICcpO1xuICAgIH0pO1xuICAgIGlmIChpICE9PSByb3dzLmxlbmd0aCAtIDEpIHN0ciArPSAnXFxuJztcbiAgfSk7XG5cbiAgbG9nKHN0cik7XG59XG4iLCAiaW1wb3J0IHtcbiAgQnVpbGRTdGVwT3V0cHV0LFxuICBFbnRyeXBvaW50R3JvdXAsXG4gIEludGVybmFsQ29uZmlnLFxuICBXeHREZXZTZXJ2ZXIsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IFNjcmlwdGluZyB9IGZyb20gJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aCB9IGZyb20gJy4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgZ2V0Q29udGVudFNjcmlwdENzc0ZpbGVzIH0gZnJvbSAnLi91dGlscy9tYW5pZmVzdCc7XG5pbXBvcnQgeyBjcmVhdGVXZWJFeHRSdW5uZXIgfSBmcm9tICcuL3J1bm5lcnMvY3JlYXRlV2ViRXh0UnVubmVyJztcbmltcG9ydCB7IGJ1aWxkSW50ZXJuYWwgfSBmcm9tICcuL2J1aWxkJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNlcnZlckluZm8oKTogUHJvbWlzZTxTZXJ2ZXJJbmZvPiB7XG4gIGNvbnN0IHsgZGVmYXVsdDogZ2V0UG9ydCwgcG9ydE51bWJlcnMgfSA9IGF3YWl0IGltcG9ydCgnZ2V0LXBvcnQnKTtcbiAgY29uc3QgcG9ydCA9IGF3YWl0IGdldFBvcnQoeyBwb3J0OiBwb3J0TnVtYmVycygzMDAwLCAzMDEwKSB9KTtcbiAgY29uc3QgaG9zdG5hbWUgPSAnbG9jYWxob3N0JztcbiAgY29uc3Qgb3JpZ2luID0gYGh0dHA6Ly8ke2hvc3RuYW1lfToke3BvcnR9YDtcbiAgY29uc3Qgc2VydmVyQ29uZmlnOiB2aXRlLklubGluZUNvbmZpZyA9IHtcbiAgICBzZXJ2ZXI6IHtcbiAgICAgIG9yaWdpbixcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcG9ydCxcbiAgICBob3N0bmFtZSxcbiAgICBvcmlnaW4sXG4gICAgdml0ZVNlcnZlckNvbmZpZzogc2VydmVyQ29uZmlnLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZXJ2ZXIoXG4gIHNlcnZlckluZm86IFNlcnZlckluZm8sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPFd4dERldlNlcnZlcj4ge1xuICBjb25zdCBydW5uZXIgPSBjcmVhdGVXZWJFeHRSdW5uZXIoKTtcblxuICBjb25zdCB2aXRlU2VydmVyID0gYXdhaXQgdml0ZS5jcmVhdGVTZXJ2ZXIoXG4gICAgdml0ZS5tZXJnZUNvbmZpZyhzZXJ2ZXJJbmZvLCBjb25maWcudml0ZSksXG4gICk7XG5cbiAgY29uc3Qgc3RhcnQgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdml0ZVNlcnZlci5saXN0ZW4oc2VydmVyLnBvcnQpO1xuICAgIGNvbmZpZy5sb2dnZXIuc3VjY2VzcyhgU3RhcnRlZCBkZXYgc2VydmVyIEAgJHtzZXJ2ZXJJbmZvLm9yaWdpbn1gKTtcblxuICAgIHNlcnZlci5jdXJyZW50T3V0cHV0ID0gYXdhaXQgYnVpbGRJbnRlcm5hbChjb25maWcpO1xuICAgIGNvbmZpZy5sb2dnZXIuaW5mbygnT3BlbmluZyBicm93c2VyLi4uJyk7XG4gICAgYXdhaXQgcnVubmVyLm9wZW5Ccm93c2VyKGNvbmZpZyk7XG4gICAgY29uZmlnLmxvZ2dlci5zdWNjZXNzKCdPcGVuZWQhJyk7XG4gIH07XG5cbiAgY29uc3QgcmVsb2FkRXh0ZW5zaW9uID0gKCkgPT4ge1xuICAgIHZpdGVTZXJ2ZXIud3Muc2VuZCgnd3h0OnJlbG9hZC1leHRlbnNpb24nKTtcbiAgfTtcbiAgY29uc3QgcmVsb2FkUGFnZSA9IChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAvLyBDYW4ndCB1c2UgVml0ZSdzIGJ1aWx0LWluIFwiZnVsbC1yZWxvYWRcIiBldmVudCBiZWNhdXNlIGl0IGRvZXNuJ3QgbGlrZSBvdXIgcGF0aHMsIGl0IGV4cGVjdHNcbiAgICAvLyBwYXRocyBlbmRpbmcgaW4gXCIvaW5kZXguaHRtbFwiXG4gICAgdml0ZVNlcnZlci53cy5zZW5kKCd3eHQ6cmVsb2FkLXBhZ2UnLCBwYXRoKTtcbiAgfTtcbiAgY29uc3QgcmVsb2FkQ29udGVudFNjcmlwdCA9IChcbiAgICBjb250ZW50U2NyaXB0OiBPbWl0PFNjcmlwdGluZy5SZWdpc3RlcmVkQ29udGVudFNjcmlwdCwgJ2lkJz4sXG4gICkgPT4ge1xuICAgIHZpdGVTZXJ2ZXIud3Muc2VuZCgnd3h0OnJlbG9hZC1jb250ZW50LXNjcmlwdCcsIGNvbnRlbnRTY3JpcHQpO1xuICB9O1xuXG4gIGNvbnN0IHNlcnZlcjogV3h0RGV2U2VydmVyID0ge1xuICAgIC4uLnZpdGVTZXJ2ZXIsXG4gICAgc3RhcnQsXG4gICAgY3VycmVudE91dHB1dDoge1xuICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgbWFuaWZlc3RfdmVyc2lvbjogMyxcbiAgICAgICAgbmFtZTogJycsXG4gICAgICAgIHZlcnNpb246ICcnLFxuICAgICAgfSxcbiAgICAgIHB1YmxpY0Fzc2V0czogW10sXG4gICAgICBzdGVwczogW10sXG4gICAgfSxcbiAgICBwb3J0OiBzZXJ2ZXJJbmZvLnBvcnQsXG4gICAgaG9zdG5hbWU6IHNlcnZlckluZm8uaG9zdG5hbWUsXG4gICAgb3JpZ2luOiBzZXJ2ZXJJbmZvLm9yaWdpbixcbiAgICByZWxvYWRFeHRlbnNpb24sXG4gICAgcmVsb2FkUGFnZSxcbiAgICByZWxvYWRDb250ZW50U2NyaXB0LFxuICB9O1xuXG4gIHJldHVybiBzZXJ2ZXI7XG59XG5cbi8qKlxuICogRnJvbSB0aGUgc2VydmVyLCB0ZWxsIHRoZSBjbGllbnQgdG8gcmVsb2FkIGNvbnRlbnQgc2NyaXB0cyBmcm9tIHRoZSBwcm92aWRlZCBidWlsZCBzdGVwIG91dHB1dHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWxvYWRDb250ZW50U2NyaXB0cyhcbiAgc3RlcHM6IEJ1aWxkU3RlcE91dHB1dFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBzZXJ2ZXI6IFd4dERldlNlcnZlcixcbikge1xuICBpZiAoY29uZmlnLm1hbmlmZXN0VmVyc2lvbiA9PT0gMykge1xuICAgIHN0ZXBzLmZvckVhY2goKHN0ZXApID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gc3RlcC5lbnRyeXBvaW50cztcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSB8fCBlbnRyeS50eXBlICE9PSAnY29udGVudC1zY3JpcHQnKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGpzID0gW2dldEVudHJ5cG9pbnRCdW5kbGVQYXRoKGVudHJ5LCBjb25maWcub3V0RGlyLCAnLmpzJyldO1xuICAgICAgY29uc3QgY3NzID0gZ2V0Q29udGVudFNjcmlwdENzc0ZpbGVzKFtlbnRyeV0sIHNlcnZlci5jdXJyZW50T3V0cHV0KTtcblxuICAgICAgc2VydmVyLnJlbG9hZENvbnRlbnRTY3JpcHQoe1xuICAgICAgICAuLi5lbnRyeS5vcHRpb25zLFxuICAgICAgICBqcyxcbiAgICAgICAgY3NzLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgc2VydmVyLnJlbG9hZEV4dGVuc2lvbigpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxvYWRIdG1sUGFnZXMoXG4gIGdyb3VwczogRW50cnlwb2ludEdyb3VwW10sXG4gIHNlcnZlcjogV3h0RGV2U2VydmVyLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIGdyb3Vwcy5mbGF0KCkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICBjb25zdCBwYXRoID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoZW50cnksIGNvbmZpZy5vdXREaXIsICcuaHRtbCcpO1xuICAgIHNlcnZlci5yZWxvYWRQYWdlKHBhdGgpO1xuICB9KTtcbn1cblxuaW50ZXJmYWNlIFNlcnZlckluZm8ge1xuICBwb3J0OiBudW1iZXI7XG4gIGhvc3RuYW1lOiBzdHJpbmc7XG4gIG9yaWdpbjogc3RyaW5nO1xuICB2aXRlU2VydmVyQ29uZmlnOiB2aXRlLklubGluZUNvbmZpZztcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFdlYkV4dFJ1bkluc3RhbmNlIH0gZnJvbSAnd2ViLWV4dCc7XG5pbXBvcnQgeyBFeHRlbnNpb25SdW5uZXIgfSBmcm9tICcuL0V4dGVuc2lvblJ1bm5lcic7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGBFeHRlbnNpb25SdW5uZXJgIGJhY2tlZCBieSBgd2ViLWV4dGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJFeHRSdW5uZXIoKTogRXh0ZW5zaW9uUnVubmVyIHtcbiAgbGV0IHJ1bm5lcjogV2ViRXh0UnVuSW5zdGFuY2UgfCB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBvcGVuQnJvd3Nlcihjb25maWcpIHtcbiAgICAgIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ3NhZmFyaScpIHtcbiAgICAgICAgY29uZmlnLmxvZ2dlci53YXJuKCdDYW5ub3Qgb3BlbiBzYWZhcmkgYXV0b21hdGljYWxseS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgdGhlIHBsdWdpbidzIGxvZ2dlciBpbnN0ZWFkIG9mIHdlYi1leHQncyBidWlsdC1pbiBvbmUuXG4gICAgICBjb25zdCB3ZWJFeHRMb2dnZXIgPSBhd2FpdCBpbXBvcnQoJ3dlYi1leHQvdXRpbC9sb2dnZXInKTtcbiAgICAgIHdlYkV4dExvZ2dlci5jb25zb2xlU3RyZWFtLndyaXRlID0gKHsgbGV2ZWwsIG1zZywgbmFtZSB9KSA9PiB7XG4gICAgICAgIGlmIChsZXZlbCA+PSBFUlJPUl9MT0dfTEVWRUwpIGNvbmZpZy5sb2dnZXIuZXJyb3IobmFtZSwgbXNnKTtcbiAgICAgICAgaWYgKGxldmVsID49IFdBUk5fTE9HX0xFVkVMKSBjb25maWcubG9nZ2VyLndhcm4obXNnKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHd4dFVzZXJDb25maWcgPSBjb25maWcucnVubmVyQ29uZmlnLmNvbmZpZztcbiAgICAgIGNvbnN0IHVzZXJDb25maWcgPSB7XG4gICAgICAgIGNvbnNvbGU6IHd4dFVzZXJDb25maWc/Lm9wZW5Db25zb2xlLFxuICAgICAgICBkZXZ0b29sczogd3h0VXNlckNvbmZpZz8ub3BlbkRldnRvb2xzLFxuICAgICAgICBzdGFydFVybDogd3h0VXNlckNvbmZpZz8uc3RhcnRVcmxzLFxuICAgICAgICAuLi4oY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94J1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBmaXJlZm94OiB3eHRVc2VyQ29uZmlnPy5iaW5hcmllcz8uZmlyZWZveCxcbiAgICAgICAgICAgICAgZmlyZWZveFByb2ZpbGU6IHd4dFVzZXJDb25maWc/LmZpcmVmb3hQcm9maWxlLFxuICAgICAgICAgICAgICBwcmVmczogd3h0VXNlckNvbmZpZz8uZmlyZWZveFByZWZzLFxuICAgICAgICAgICAgICBhcmdzOiB3eHRVc2VyQ29uZmlnPy5maXJlZm94QXJncyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgY2hyb21pdW1CaW5hcnk6IHd4dFVzZXJDb25maWc/LmJpbmFyaWVzPy5bY29uZmlnLmJyb3dzZXJdLFxuICAgICAgICAgICAgICBjaHJvbWl1bVByb2ZpbGU6IHd4dFVzZXJDb25maWc/LmNocm9taXVtUHJvZmlsZSxcbiAgICAgICAgICAgICAgYXJnczogd3h0VXNlckNvbmZpZz8uY2hyb21pdW1BcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5hbENvbmZpZyA9IHtcbiAgICAgICAgLi4udXNlckNvbmZpZyxcbiAgICAgICAgdGFyZ2V0OiBjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnID8gJ2ZpcmVmb3gtZGVza3RvcCcgOiAnY2hyb21pdW0nLFxuICAgICAgICBzb3VyY2VEaXI6IGNvbmZpZy5vdXREaXIsXG4gICAgICAgIC8vIFdYVCBoYW5kbGVzIHJlbG9hZHMsIHNvIGRpc2FibGUgYXV0by1yZWxvYWQgYmVoYXZpb3JzIGluIHdlYi1leHRcbiAgICAgICAgbm9SZWxvYWQ6IHRydWUsXG4gICAgICAgIG5vSW5wdXQ6IHRydWUsXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgLy8gRG9uJ3QgY2FsbCBgcHJvY2Vzcy5leGl0KDApYCBhZnRlciBzdGFydGluZyB3ZWItZXh0XG4gICAgICAgIHNob3VsZEV4aXRQcm9ncmFtOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCd3ZWItZXh0IGNvbmZpZzonLCBmaW5hbENvbmZpZyk7XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCd3ZWItZXh0IG9wdGlvbnM6Jywgb3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IHdlYkV4dCA9IGF3YWl0IGltcG9ydCgnd2ViLWV4dCcpO1xuICAgICAgcnVubmVyID0gYXdhaXQgd2ViRXh0LmRlZmF1bHQuY21kLnJ1bihmaW5hbENvbmZpZywgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGNsb3NlQnJvd3NlcigpIHtcbiAgICAgIHJldHVybiBhd2FpdCBydW5uZXI/LmV4aXQoKTtcbiAgICB9LFxuICB9O1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS93ZWItZXh0L2Jsb2IvZTM3ZTYwYTI3Mzg0NzhmNTEyZjEyNTVjNTM3MTMzMzIxZjMwMTc3MS9zcmMvdXRpbC9sb2dnZXIuanMjTDEyXG5jb25zdCBXQVJOX0xPR19MRVZFTCA9IDQwO1xuY29uc3QgRVJST1JfTE9HX0xFVkVMID0gNTA7XG4iLCAiaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuaW1wb3J0IHsgcHJpbnRIZWFkZXIgfSBmcm9tICcuLi8uLi9jb3JlL2xvZy9wcmludEhlYWRlcic7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvZm9ybWF0RHVyYXRpb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29tbWFuZDxUQXJncyBleHRlbmRzIGFueVtdPihcbiAgY2I6ICguLi5hcmdzOiBUQXJncykgPT4gdm9pZCB8IGJvb2xlYW4gfCBQcm9taXNlPHZvaWQgfCBib29sZWFuPixcbikge1xuICByZXR1cm4gYXN5bmMgKC4uLmFyZ3M6IFRBcmdzKSA9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0cnkge1xuICAgICAgcHJpbnRIZWFkZXIoKTtcblxuICAgICAgY29uc3Qgb25nb2luZyA9IGF3YWl0IGNiKC4uLmFyZ3MpO1xuXG4gICAgICBpZiAoIW9uZ29pbmcpXG4gICAgICAgIGNvbnNvbGEuc3VjY2VzcyhcbiAgICAgICAgICBgRmluaXNoZWQgaW4gJHtmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gLFxuICAgICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sYS5mYWlsKFxuICAgICAgICBgQ29tbWFuZCBmYWlsZWQgYWZ0ZXIgJHtmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGEuZXJyb3IoZXJyKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH07XG59XG4iLCAiaW1wb3J0IHBjIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50SGVhZGVyKCkge1xuICBjb25zb2xlLmxvZygpO1xuICBjb25zb2xhLmxvZyhgJHtwYy5ncmF5KCdXWFQnKX0gJHtwYy5ncmF5KHBjLmJvbGQodmVyc2lvbikpfWApO1xufVxuIiwgImltcG9ydCAqIGFzIHd4dCBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5cbmV4cG9ydCBjb25zdCBidWlsZCA9IGRlZmluZUNvbW1hbmQ8XG4gIFtcbiAgICByb290OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IHtcbiAgICAgIG1vZGU/OiBzdHJpbmc7XG4gICAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgICBicm93c2VyPzogd3h0LlRhcmdldEJyb3dzZXI7XG4gICAgICBtdjM/OiBib29sZWFuO1xuICAgICAgbXYyPzogYm9vbGVhbjtcbiAgICB9LFxuICBdXG4+KGFzeW5jIChyb290LCBmbGFncykgPT4ge1xuICBjb25zdCBtb2RlID0gZmxhZ3MubW9kZSA/PyAncHJvZHVjdGlvbic7XG4gIGNvbnN0IGNsaUNvbmZpZzogd3h0LklubGluZUNvbmZpZyA9IHtcbiAgICByb290LFxuICAgIG1vZGUsXG4gICAgYnJvd3NlcjogZmxhZ3MuYnJvd3NlcixcbiAgICBtYW5pZmVzdFZlcnNpb246IGZsYWdzLm12MyA/IDMgOiBmbGFncy5tdjIgPyAyIDogdW5kZWZpbmVkLFxuICAgIGNvbmZpZ0ZpbGU6IGZsYWdzLmNvbmZpZyxcbiAgfTtcblxuICBhd2FpdCB3eHQuYnVpbGQoY2xpQ29uZmlnKTtcbn0pO1xuIiwgImltcG9ydCAqIGFzIHd4dCBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5cbmV4cG9ydCBjb25zdCBkZXYgPSBkZWZpbmVDb21tYW5kPFxuICBbXG4gICAgcm9vdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiB7XG4gICAgICBtb2RlPzogc3RyaW5nO1xuICAgICAgY29uZmlnPzogc3RyaW5nO1xuICAgICAgYnJvd3Nlcj86IHd4dC5UYXJnZXRCcm93c2VyO1xuICAgICAgbXYzPzogYm9vbGVhbjtcbiAgICAgIG12Mj86IGJvb2xlYW47XG4gICAgfSxcbiAgXVxuPihhc3luYyAocm9vdCwgZmxhZ3MpID0+IHtcbiAgY29uc3QgbW9kZSA9IGZsYWdzLm1vZGUgPz8gJ2RldmVsb3BtZW50JztcbiAgY29uc3QgY2xpQ29uZmlnOiB3eHQuSW5saW5lQ29uZmlnID0ge1xuICAgIHJvb3QsXG4gICAgbW9kZSxcbiAgICBicm93c2VyOiBmbGFncy5icm93c2VyLFxuICAgIG1hbmlmZXN0VmVyc2lvbjogZmxhZ3MubXYzID8gMyA6IGZsYWdzLm12MiA/IDIgOiB1bmRlZmluZWQsXG4gICAgY29uZmlnRmlsZTogZmxhZ3MuY29uZmlnLFxuICB9O1xuXG4gIGNvbnN0IHNlcnZlciA9IGF3YWl0IHd4dC5jcmVhdGVTZXJ2ZXIoY2xpQ29uZmlnKTtcbiAgYXdhaXQgc2VydmVyLnN0YXJ0KCk7XG5cbiAgcmV0dXJuIHRydWU7XG59KTtcbiIsICJpbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5cbmV4cG9ydCBjb25zdCBpbml0ID0gZGVmaW5lQ29tbWFuZDxbZGlyZWN0b3J5Pzogc3RyaW5nXT4oYXN5bmMgKGRpcmVjdG9yeSkgPT4ge1xuICBjb25zb2xhLndhcm4oJ3d4dCBpbml0OiBOb3QgaW1wbGVtZW50ZWQnKTtcbn0pO1xuIiwgImltcG9ydCB7IGdldEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9nZXRJbnRlcm5hbENvbmZpZyc7XG5pbXBvcnQgeyBmaW5kRW50cnlwb2ludHMgfSBmcm9tICcuLi8uLi9jb3JlL2J1aWxkL2ZpbmRFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVR5cGVzRGlyIH0gZnJvbSAnLi4vLi4vY29yZS9idWlsZC9nZW5lcmF0ZVR5cGVzRGlyJztcbmltcG9ydCB7IGRlZmluZUNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9kZWZpbmVDb21tYW5kJztcbmltcG9ydCAqIGFzIHd4dCBmcm9tICcuLi8uLic7XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlID0gZGVmaW5lQ29tbWFuZDxcbiAgW1xuICAgIHJvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczoge1xuICAgICAgY29uZmlnPzogc3RyaW5nO1xuICAgIH0sXG4gIF1cbj4oYXN5bmMgKHJvb3QsIGZsYWdzKSA9PiB7XG4gIGNvbnN0IGNsaUNvbmZpZzogd3h0LklubGluZUNvbmZpZyA9IHtcbiAgICByb290LFxuICAgIGNvbmZpZ0ZpbGU6IGZsYWdzLmNvbmZpZyxcbiAgfTtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgZ2V0SW50ZXJuYWxDb25maWcoY2xpQ29uZmlnLCAnYnVpbGQnKTtcblxuICBjb25maWcubG9nZ2VyLmluZm8oJ0dlbmVyYXRpbmcgdHlwZXMuLi4nKTtcblxuICBjb25zdCBlbnRyeXBvaW50cyA9IGF3YWl0IGZpbmRFbnRyeXBvaW50cyhjb25maWcpO1xuICBhd2FpdCBnZW5lcmF0ZVR5cGVzRGlyKGVudHJ5cG9pbnRzLCBjb25maWcpO1xufSk7XG4iLCAiaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuXG5leHBvcnQgY29uc3QgcHVibGlzaCA9IGRlZmluZUNvbW1hbmQoXG4gIGFzeW5jIChyb290OiBhbnksIHsgY29uZmlnOiBjb25maWdGaWxlIH06IGFueSkgPT4ge1xuICAgIGNvbnNvbGEud2Fybignd3h0IHB1Ymxpc2g6IE5vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuKTtcbiIsICJpbXBvcnQgeyBCdWlsZE91dHB1dCwgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB6aXBkaXIgZnJvbSAnemlwLWRpcic7XG5pbXBvcnQgeyBkaXJuYW1lLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsga2ViYWJDYXNlQWxwaGFudW1lcmljIH0gZnJvbSAnLi91dGlscy9zdHJpbmdzJztcbmltcG9ydCB7IGdldFBhY2thZ2VKc29uIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlJztcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gJ21pbmltYXRjaCc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiB9IGZyb20gJy4vdXRpbHMvZm9ybWF0RHVyYXRpb24nO1xuaW1wb3J0IHsgcHJpbnRGaWxlTGlzdCB9IGZyb20gJy4vbG9nL3ByaW50RmlsZUxpc3QnO1xuXG4vKipcbiAqIFppcCB0aGUgZXh0ZW5zaW9uIGZvciBkaXN0cmlidXRpb24uIERvZXMgbm90IGJ1aWxkLCBqdXN0IHppcHMgdGhlIG91dHB1dCB0aGF0IHNob3VsZCBleGlzdCBmb3JcbiAqIHRoZSBnaXZlbiBjb25maWcuXG4gKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgWklQIGZpbGVzIHRoYXQgd2VyZSBjcmVhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gemlwRXh0ZW5zaW9uKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBidWlsZE91dHB1dDogQnVpbGRPdXRwdXQsXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgY29uZmlnLmxvZ2dlci5pbmZvKCdaaXBwaW5nIGV4dGVuc2lvbi4uLicpO1xuICBjb25zdCB6aXBGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCBwcm9qZWN0TmFtZSA9XG4gICAgY29uZmlnLnppcC5uYW1lID8/XG4gICAga2ViYWJDYXNlQWxwaGFudW1lcmljKFxuICAgICAgKGF3YWl0IGdldFBhY2thZ2VKc29uKGNvbmZpZykpPy5uYW1lIHx8IGRpcm5hbWUocHJvY2Vzcy5jd2QoKSksXG4gICAgKTtcbiAgY29uc3QgYXBwbHlUZW1wbGF0ZSA9ICh0ZW1wbGF0ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgdGVtcGxhdGVcbiAgICAgIC5yZXBsYWNlQWxsKCd7e25hbWV9fScsIHByb2plY3ROYW1lKVxuICAgICAgLnJlcGxhY2VBbGwoJ3t7YnJvd3Nlcn19JywgY29uZmlnLmJyb3dzZXIpXG4gICAgICAucmVwbGFjZUFsbChcbiAgICAgICAgJ3t7dmVyc2lvbn19JyxcbiAgICAgICAgYnVpbGRPdXRwdXQubWFuaWZlc3QudmVyc2lvbl9uYW1lID8/IGJ1aWxkT3V0cHV0Lm1hbmlmZXN0LnZlcnNpb24sXG4gICAgICApXG4gICAgICAucmVwbGFjZUFsbCgne3ttYW5pZmVzdFZlcnNpb259fScsIGBtdiR7Y29uZmlnLm1hbmlmZXN0VmVyc2lvbn1gKTtcblxuICBhd2FpdCBmcy5lbnN1cmVEaXIoY29uZmlnLm91dEJhc2VEaXIpO1xuXG4gIC8vIFpJUCBvdXRwdXQgZGlyZWN0b3J5XG5cbiAgY29uc3Qgb3V0WmlwRmlsZW5hbWUgPSBhcHBseVRlbXBsYXRlKGNvbmZpZy56aXAuYXJ0aWZhY3RUZW1wbGF0ZSk7XG4gIGNvbnN0IG91dFppcFBhdGggPSByZXNvbHZlKGNvbmZpZy5vdXRCYXNlRGlyLCBvdXRaaXBGaWxlbmFtZSk7XG4gIGF3YWl0IHppcGRpcihjb25maWcub3V0RGlyLCB7XG4gICAgc2F2ZVRvOiBvdXRaaXBQYXRoLFxuICB9KTtcbiAgemlwRmlsZXMucHVzaChvdXRaaXBQYXRoKTtcblxuICAvLyBaSVAgc291cmNlcyBmb3IgRmlyZWZveFxuXG4gIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgY29uc3Qgc291cmNlc1ppcEZpbGVuYW1lID0gYXBwbHlUZW1wbGF0ZShjb25maWcuemlwLnNvdXJjZXNUZW1wbGF0ZSk7XG4gICAgY29uc3Qgc291cmNlc1ppcFBhdGggPSByZXNvbHZlKGNvbmZpZy5vdXRCYXNlRGlyLCBzb3VyY2VzWmlwRmlsZW5hbWUpO1xuICAgIGF3YWl0IHppcGRpcihjb25maWcuemlwLnNvdXJjZXNSb290LCB7XG4gICAgICBzYXZlVG86IHNvdXJjZXNaaXBQYXRoLFxuICAgICAgZmlsdGVyKHBhdGgpIHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUoY29uZmlnLnppcC5zb3VyY2VzUm9vdCwgcGF0aCk7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRQYXR0ZXJuID0gY29uZmlnLnppcC5pZ25vcmVkU291cmNlcy5maW5kKChwYXR0ZXJuKSA9PlxuICAgICAgICAgIG1pbmltYXRjaChyZWxhdGl2ZVBhdGgsIHBhdHRlcm4pLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbWF0Y2hlZFBhdHRlcm4gPT0gbnVsbDtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgemlwRmlsZXMucHVzaChzb3VyY2VzWmlwUGF0aCk7XG4gIH1cblxuICBjb25maWcubG9nZ2VyLnN1Y2Nlc3MoXG4gICAgYFppcHBlZCBleHRlbnNpb24gaW4gJHtmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnQpfWAsXG4gICk7XG4gIGF3YWl0IHByaW50RmlsZUxpc3QoY29uZmlnLmxvZ2dlci5sb2csIGNvbmZpZy5vdXRCYXNlRGlyLCB6aXBGaWxlcyk7XG5cbiAgcmV0dXJuIHppcEZpbGVzO1xufVxuIiwgImltcG9ydCAqIGFzIHd4dCBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBidWlsZEludGVybmFsIH0gZnJvbSAnLi4vLi4vY29yZS9idWlsZCc7XG5pbXBvcnQgeyBnZXRJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvZ2V0SW50ZXJuYWxDb25maWcnO1xuaW1wb3J0IHsgemlwRXh0ZW5zaW9uIH0gZnJvbSAnLi4vLi4vY29yZS96aXAnO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuXG5leHBvcnQgY29uc3QgemlwID0gZGVmaW5lQ29tbWFuZDxcbiAgW1xuICAgIHJvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczoge1xuICAgICAgbW9kZT86IHN0cmluZztcbiAgICAgIGNvbmZpZz86IHN0cmluZztcbiAgICAgIGJyb3dzZXI/OiB3eHQuVGFyZ2V0QnJvd3NlcjtcbiAgICAgIG12Mz86IGJvb2xlYW47XG4gICAgICBtdjI/OiBib29sZWFuO1xuICAgIH0sXG4gIF1cbj4oYXN5bmMgKHJvb3QsIGZsYWdzKSA9PiB7XG4gIGNvbnN0IG1vZGUgPSBmbGFncy5tb2RlID8/ICdwcm9kdWN0aW9uJztcbiAgY29uc3QgY2xpQ29uZmlnOiB3eHQuSW5saW5lQ29uZmlnID0ge1xuICAgIHJvb3QsXG4gICAgbW9kZSxcbiAgICBicm93c2VyOiBmbGFncy5icm93c2VyLFxuICAgIG1hbmlmZXN0VmVyc2lvbjogZmxhZ3MubXYzID8gMyA6IGZsYWdzLm12MiA/IDIgOiB1bmRlZmluZWQsXG4gICAgY29uZmlnRmlsZTogZmxhZ3MuY29uZmlnLFxuICB9O1xuXG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGdldEludGVybmFsQ29uZmlnKGNsaUNvbmZpZywgJ2J1aWxkJyk7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IGJ1aWxkSW50ZXJuYWwoY29uZmlnKTtcbiAgYXdhaXQgemlwRXh0ZW5zaW9uKGNvbmZpZywgb3V0cHV0KTtcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxpQkFBZ0I7OztBQ0NkLGNBQVc7OztBQ01iLElBQUFBLG9CQUE4QjtBQUM5QixXQUFzQjtBQUN0QixxQkFBd0I7OztBQ1Z4Qix1QkFBd0M7QUFFakMsU0FBUyxrQkFDZCxnQkFDQSxXQUVRO0FBQ1IsUUFBTSxlQUFlLGlCQUFBQyxRQUFLLFNBQVMsZ0JBQWdCLFNBQVM7QUFFNUQsUUFBTSxPQUFPLGFBQWEsTUFBTSxVQUFVLENBQUMsRUFBRSxDQUFD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SUFBTSxVQUFNLFdBQUFDLFNBQUksS0FBSztBQUNyQixJQUFJLEtBQUs7QUFDVCxJQUFJLFFBQVEsT0FBTztBQUduQixJQUNHLFFBQVEsVUFBVSxrQkFBa0IsRUFDcEMsT0FBTyx1QkFBdUIsMkJBQTJCLEVBQ3pELE9BQU8scUJBQXFCLGNBQWMsRUFDMUMsT0FBTywyQkFBMkIsbUJBQW1CLEVBQ3JELE9BQU8sU0FBUyxvQkFBb0IsRUFDcEMsT0FBTyxTQUFTLG9CQUFvQixFQUNwQyxPQUFnQixHQUFHO0FBR3RCLElBQ0csUUFBUSxnQkFBZ0Isc0JBQXNCLEVBQzlDLE9BQU8sdUJBQXVCLDJCQUEyQixFQUN6RCxPQUFPLHFCQUFxQixjQUFjLEVBQzFDLE9BQU8sMkJBQTJCLG1CQUFtQixFQUNyRCxPQUFPLFNBQVMsb0JBQW9CLEVBQ3BDLE9BQU8sU0FBUyxvQkFBb0IsRUFDcEMsT0FBZ0JDLE1BQUs7QUFHeEIsSUFDRyxRQUFRLGNBQWMscUNBQXFDLEVBQzNELE9BQU8sdUJBQXVCLDJCQUEyQixFQUN6RCxPQUFPLHFCQUFxQixjQUFjLEVBQzFDLE9BQU8sMkJBQTJCLG1CQUFtQixFQUNyRCxPQUFPLFNBQVMsb0JBQW9CLEVBQ3BDLE9BQU8sU0FBUyxvQkFBb0IsRUFDcEMsT0FBZ0IsR0FBRztBQUd0QixJQUNHLFFBQVEsa0JBQWtCLFNBQVMsRUFDbkMsT0FBTyx1QkFBdUIsMkJBQTJCLEVBQ3pELE9BQWdCLE9BQU87QUFHMUIsSUFBSSxRQUFRLGtCQUFrQixtQkFBbUIsRUFBRSxPQUFnQixPQUFPO0FBRzFFLElBQ0csUUFBUSxvQkFBb0IsMEJBQTBCLEVBQ3RELE9BQWdCLElBQUk7QUFFdkIsSUFBSSxNQUFNOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfbm9kZV9wYXRoIiwgInBhdGgiLCAiaXNPZmZsaW5lIiwgImRucyIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImZzIiwgImltcG9ydF9wYXRoIiwgInVuaW1wb3J0IiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJmcyIsICJwYXRocyIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImltcG9ydF9waWNvY29sb3JzIiwgInZpdGUiLCAiaW1wb3J0X2NvbnNvbGEiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJ2aXRlIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJmcyIsICJwYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJmcyIsICJnbG9iIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfbGlua2Vkb20iLCAiaW1wb3J0X3VuaW1wb3J0IiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJwYXRoIiwgInVuaW1wb3J0IiwgImZzIiwgImNyZWF0ZUpJVEkiLCAidHJhbnNmb3JtIiwgImltcG9ydF9mYXN0X2dsb2IiLCAiZ2xvYiIsICJwYXRoIiwgInBpY29tYXRjaCIsICJmcyIsICJKU09ONSIsICJpbXBvcnRfdW5pbXBvcnQiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImZzIiwgInVuaW1wb3J0IiwgInBhdGgiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImZzIiwgImZzIiwgInZlcnNpb24iLCAib3B0aW9ucyIsICJpbXBvcnRfcGljb2NvbG9ycyIsICJ2aXRlIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJwYXRoIiwgImZzIiwgInBjIiwgInBjIiwgImZzIiwgInZpdGUiLCAicGF0aCIsICJidWlsZCIsICJjcmVhdGVTZXJ2ZXIiLCAicGF0aCIsICJwYyIsICJpbXBvcnRfY29uc29sYSIsICJpbXBvcnRfcGljb2NvbG9ycyIsICJpbXBvcnRfY29uc29sYSIsICJwYyIsICJidWlsZCIsICJjcmVhdGVTZXJ2ZXIiLCAiaW1wb3J0X2NvbnNvbGEiLCAiaW1wb3J0X2NvbnNvbGEiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiZnMiLCAiemlwZGlyIiwgInBhdGgiLCAiY2FjIiwgImJ1aWxkIl0KfQo=
|
|
2138
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaS9pbmRleC50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ2V0SW50ZXJuYWxDb25maWcudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZW50cnlwb2ludHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvcGF0aHMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2Rldkh0bWxQcmVyZW5kZXIudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL2RldlNlcnZlckdsb2JhbHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvbmV0d29yay50cyIsICIuLi9zcmMvY29yZS91dGlscy9wcm9taXNlcy50cyIsICIuLi9zcmMvY29yZS92aXRlLXBsdWdpbnMvZG93bmxvYWQudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL211bHRpcGFnZU1vdmUudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL3VuaW1wb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2F1dG8taW1wb3J0cy50cyIsICIuLi9zcmMvY29yZS92aXRlLXBsdWdpbnMvdmlydHVhbEVudHJ5cG9pbnQudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL3RzY29uZmlnUGF0aHMudHMiLCAiLi4vc3JjL2NvcmUvdml0ZS1wbHVnaW5zL25vb3BCYWNrZ3JvdW5kLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2NyZWF0ZUZzQ2FjaGUudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvZ2xvYmFscy50cyIsICIuLi9zcmMvaW5kZXgudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvYXJyYXlzLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2RldGVjdERldkNoYW5nZXMudHMiLCAiLi4vc3JjL2NvcmUvYnVpbGQvYnVpbGRFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9yZW1vdmVFbXB0eURpcnMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvcHVibGljLnRzIiwgIi4uL3NyYy9jb3JlL2J1aWxkL2ZpbmRFbnRyeXBvaW50cy50cyIsICIuLi9zcmMvY29yZS91dGlscy9pbXBvcnRUc0ZpbGUudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvc3RyaW5ncy50cyIsICIuLi9zcmMvY29yZS9idWlsZC9nZW5lcmF0ZVR5cGVzRGlyLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL21hbmlmZXN0LnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL0NvbnRlbnRTZWN1cml0eVBvbGljeS50cyIsICIuLi9zcmMvY29yZS91dGlscy9jb250ZW50LXNjcmlwdHMudHMiLCAiLi4vc3JjL2NvcmUvdXRpbHMvcGFja2FnZS50cyIsICIuLi9zcmMvY29yZS9idWlsZC50cyIsICIuLi9zcmMvY29yZS91dGlscy9ncm91cEVudHJ5cG9pbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3V0aWxzL2Zvcm1hdER1cmF0aW9uLnRzIiwgIi4uL3NyYy9jb3JlL2xvZy9wcmludEJ1aWxkU3VtbWFyeS50cyIsICIuLi9zcmMvY29yZS9sb2cvcHJpbnRGaWxlTGlzdC50cyIsICIuLi9zcmMvY29yZS9sb2cvcHJpbnRUYWJsZS50cyIsICIuLi9zcmMvY29yZS9zZXJ2ZXIudHMiLCAiLi4vc3JjL2NvcmUvcnVubmVycy9jcmVhdGVXZWJFeHRSdW5uZXIudHMiLCAiLi4vc3JjL2NsaS91dGlscy9kZWZpbmVDb21tYW5kLnRzIiwgIi4uL3NyYy9jb3JlL2xvZy9wcmludEhlYWRlci50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL2J1aWxkLnRzIiwgIi4uL3NyYy9jbGkvY29tbWFuZHMvZGV2LnRzIiwgIi4uL3NyYy9jbGkvY29tbWFuZHMvaW5pdC50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL3ByZXBhcmUudHMiLCAiLi4vc3JjL2NsaS9jb21tYW5kcy9wdWJsaXNoLnRzIiwgIi4uL3NyYy9jb3JlL3ppcC50cyIsICIuLi9zcmMvY2xpL2NvbW1hbmRzL3ppcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgY2FjIGZyb20gJ2NhYyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCAqIGFzIGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMnO1xuXG5jb25zdCBjbGkgPSBjYWMoJ3d4dCcpO1xuY2xpLmhlbHAoKTtcbmNsaS52ZXJzaW9uKHZlcnNpb24pO1xuXG4vLyBERVZcbmNsaVxuICAuY29tbWFuZCgnW3Jvb3RdJywgJ3N0YXJ0IGRldiBzZXJ2ZXInKVxuICAub3B0aW9uKCctYywgLS1jb25maWcgPGZpbGU+JywgJ3VzZSBzcGVjaWZpZWQgY29uZmlnIGZpbGUnKVxuICAub3B0aW9uKCctbSwgLS1tb2RlIDxtb2RlPicsICdzZXQgZW52IG1vZGUnKVxuICAub3B0aW9uKCctYiwgLS1icm93c2VyIDxicm93c2VyPicsICdzcGVjaWZ5IGEgYnJvd3NlcicpXG4gIC5vcHRpb24oJy0tbXYzJywgJ3RhcmdldCBtYW5pZmVzdCB2MycpXG4gIC5vcHRpb24oJy0tbXYyJywgJ3RhcmdldCBtYW5pZmVzdCB2MicpXG4gIC5hY3Rpb24oY29tbWFuZHMuZGV2KTtcblxuLy8gQlVJTERcbmNsaVxuICAuY29tbWFuZCgnYnVpbGQgW3Jvb3RdJywgJ2J1aWxkIGZvciBwcm9kdWN0aW9uJylcbiAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxmaWxlPicsICd1c2Ugc3BlY2lmaWVkIGNvbmZpZyBmaWxlJylcbiAgLm9wdGlvbignLW0sIC0tbW9kZSA8bW9kZT4nLCAnc2V0IGVudiBtb2RlJylcbiAgLm9wdGlvbignLWIsIC0tYnJvd3NlciA8YnJvd3Nlcj4nLCAnc3BlY2lmeSBhIGJyb3dzZXInKVxuICAub3B0aW9uKCctLW12MycsICd0YXJnZXQgbWFuaWZlc3QgdjMnKVxuICAub3B0aW9uKCctLW12MicsICd0YXJnZXQgbWFuaWZlc3QgdjInKVxuICAuYWN0aW9uKGNvbW1hbmRzLmJ1aWxkKTtcblxuLy8gWklQXG5jbGlcbiAgLmNvbW1hbmQoJ3ppcCBbcm9vdF0nLCAnYnVpbGQgZm9yIHByb2R1Y3Rpb24gYW5kIHppcCBvdXRwdXQnKVxuICAub3B0aW9uKCctYywgLS1jb25maWcgPGZpbGU+JywgJ3VzZSBzcGVjaWZpZWQgY29uZmlnIGZpbGUnKVxuICAub3B0aW9uKCctbSwgLS1tb2RlIDxtb2RlPicsICdzZXQgZW52IG1vZGUnKVxuICAub3B0aW9uKCctYiwgLS1icm93c2VyIDxicm93c2VyPicsICdzcGVjaWZ5IGEgYnJvd3NlcicpXG4gIC5vcHRpb24oJy0tbXYzJywgJ3RhcmdldCBtYW5pZmVzdCB2MycpXG4gIC5vcHRpb24oJy0tbXYyJywgJ3RhcmdldCBtYW5pZmVzdCB2MicpXG4gIC5hY3Rpb24oY29tbWFuZHMuemlwKTtcblxuLy8gUFJFUEFSRVxuY2xpXG4gIC5jb21tYW5kKCdwcmVwYXJlIFtyb290XScsICdwcmVwYXJlJylcbiAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxmaWxlPicsICd1c2Ugc3BlY2lmaWVkIGNvbmZpZyBmaWxlJylcbiAgLmFjdGlvbihjb21tYW5kcy5wcmVwYXJlKTtcblxuLy8gUFVCTElTSFxuY2xpLmNvbW1hbmQoJ3B1Ymxpc2ggW3Jvb3RdJywgJ3B1Ymxpc2ggdG8gc3RvcmVzJykuYWN0aW9uKGNvbW1hbmRzLnB1Ymxpc2gpO1xuXG4vLyBJTklUXG5jbGlcbiAgLmNvbW1hbmQoJ2luaXQgW2RpcmVjdG9yeV0nLCAnaW5pdGlhbGl6ZSBhIG5ldyBwcm9qZWN0JylcbiAgLmFjdGlvbihjb21tYW5kcy5pbml0KTtcblxuY2xpLnBhcnNlKCk7XG4iLCAie1xuICBcIm5hbWVcIjogXCJ3eHRcIixcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwidmVyc2lvblwiOiBcIjAuMy4wXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJOZXh0IGdlbiBmcmFtZXdvcmsgZm9yIGRldmVsb3Bpbmcgd2ViIGV4dGVuc2lvbnNcIixcbiAgXCJlbmdpbmVzXCI6IHtcbiAgICBcIm5vZGVcIjogXCI+PTE4LjE2LjBcIixcbiAgICBcInBucG1cIjogXCI+PThcIlxuICB9LFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2FrbGlua2VyMS93eHRcIlxuICB9LFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcInZpdGVcIixcbiAgICBcImNocm9tZVwiLFxuICAgIFwid2ViXCIsXG4gICAgXCJleHRlbnNpb25cIixcbiAgICBcImJyb3dzZXJcIixcbiAgICBcImJ1bmRsZXJcIixcbiAgICBcImZyYW1ld29ya1wiXG4gIF0sXG4gIFwiYXV0aG9yXCI6IHtcbiAgICBcIm5hbWVcIjogXCJBYXJvbiBLbGlua2VyXCIsXG4gICAgXCJlbWFpbFwiOiBcImFhcm9ua2xpbmtlcjErd3h0QGdtYWlsLmNvbVwiXG4gIH0sXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImRpc3RcIlxuICBdLFxuICBcImJpblwiOiBcImRpc3QvY2xpLmNqc1wiLFxuICBcIm1haW5cIjogXCIuL2Rpc3QvaW5kZXguY2pzXCIsXG4gIFwibW9kdWxlXCI6IFwiLi9kaXN0L2luZGV4LmpzXCIsXG4gIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvaW5kZXguY2pzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9pbmRleC5qc1wiLFxuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9pbmRleC5kLnRzXCJcbiAgICB9LFxuICAgIFwiLi9jbGllbnRcIjoge1xuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvY2xpZW50LmpzXCIsXG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2NsaWVudC5kLnRzXCJcbiAgICB9LFxuICAgIFwiLi9icm93c2VyXCI6IHtcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2Jyb3dzZXIuanNcIixcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvYnJvd3Nlci5kLnRzXCJcbiAgICB9XG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJ3eHRcIjogXCJ0c3ggc3JjL2NsaS9pbmRleC50c1wiLFxuICAgIFwiYnVpbGRcIjogXCJ0c3ggc2NyaXB0cy9idWlsZC50c1wiLFxuICAgIFwiZm9ybWF0XCI6IFwicHJldHRpZXIgLS13cml0ZSAuXCIsXG4gICAgXCJmb3JtYXQ6Y2hlY2tcIjogXCJwcmV0dGllciAtLXdyaXRlIC5cIixcbiAgICBcImNvbXBpbGVcIjogXCJ0c2MgLS1ub0VtaXRcIixcbiAgICBcInRlc3RcIjogXCJ2aXRlc3RcIixcbiAgICBcInRlc3Q6Y292ZXJhZ2VcIjogXCJ2aXRlc3QgcnVuIC0tY292ZXJhZ2VcIixcbiAgICBcInByZXBhcmVcIjogXCJzaW1wbGUtZ2l0LWhvb2tzXCIsXG4gICAgXCJwcmVwdWJsaXNoXCI6IFwicG5wbSAtcyBidWlsZFwiLFxuICAgIFwiZG9jczpkZXZcIjogXCJ2aXRlcHJlc3MgZGV2IGRvY3NcIixcbiAgICBcImRvY3M6YnVpbGRcIjogXCJ2aXRlcHJlc3MgYnVpbGQgZG9jc1wiLFxuICAgIFwiZG9jczpwcmV2aWV3XCI6IFwidml0ZXByZXNzIHByZXZpZXcgZG9jc1wiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB0eXBlcy93ZWJleHRlbnNpb24tcG9seWZpbGxcIjogXCJeMC4xMC4wXCIsXG4gICAgXCJAd2ViZXh0LWNvcmUvZmFrZS1icm93c2VyXCI6IFwiXjEuMi4yXCIsXG4gICAgXCJAd2ViZXh0LWNvcmUvbWF0Y2gtcGF0dGVybnNcIjogXCJeMS4wLjFcIixcbiAgICBcImFzeW5jLW11dGV4XCI6IFwiXjAuNC4wXCIsXG4gICAgXCJjMTJcIjogXCJeMS40LjJcIixcbiAgICBcImNhY1wiOiBcIl42LjcuMTRcIixcbiAgICBcImNvbnNvbGFcIjogXCJeMy4xLjBcIixcbiAgICBcImZhc3QtZ2xvYlwiOiBcIl4zLjIuMTJcIixcbiAgICBcImZpbGVzaXplXCI6IFwiXjEwLjAuN1wiLFxuICAgIFwiZnMtZXh0cmFcIjogXCJeMTEuMS4xXCIsXG4gICAgXCJnZXQtcG9ydFwiOiBcIl43LjAuMFwiLFxuICAgIFwiaml0aVwiOiBcIl4xLjE4LjJcIixcbiAgICBcImpzb241XCI6IFwiXjIuMi4zXCIsXG4gICAgXCJsaW5rZWRvbVwiOiBcIl4wLjE0LjI2XCIsXG4gICAgXCJtaW5pbWF0Y2hcIjogXCJeOS4wLjNcIixcbiAgICBcInBpY29jb2xvcnNcIjogXCJeMS4wLjBcIixcbiAgICBcInBpY29tYXRjaFwiOiBcIl4yLjMuMVwiLFxuICAgIFwidW5pbXBvcnRcIjogXCJeMy4wLjhcIixcbiAgICBcInZpdGVcIjogXCJeNC4zLjlcIixcbiAgICBcInZpdGUtdHNjb25maWctcGF0aHNcIjogXCJeNC4yLjBcIixcbiAgICBcIndlYi1leHRcIjogXCJeNy42LjJcIixcbiAgICBcIndlYmV4dGVuc2lvbi1wb2x5ZmlsbFwiOiBcIl4wLjEwLjBcIixcbiAgICBcInppcC1kaXJcIjogXCJeMi4wLjBcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAZmFrZXItanMvZmFrZXJcIjogXCJeOC4wLjJcIixcbiAgICBcIkB0eXBlcy9mcy1leHRyYVwiOiBcIl4xMS4wLjFcIixcbiAgICBcIkB0eXBlcy9sb2Rhc2gubWVyZ2VcIjogXCJeNC42LjdcIixcbiAgICBcIkB0eXBlcy9ub2RlXCI6IFwiXjIwLjMuMVwiLFxuICAgIFwiQHR5cGVzL3BpY29tYXRjaFwiOiBcIl4yLjMuMFwiLFxuICAgIFwiQHZpdGVzdC9jb3ZlcmFnZS12OFwiOiBcIl4wLjMyLjJcIixcbiAgICBcImxvZGFzaC5tZXJnZVwiOiBcIl40LjYuMlwiLFxuICAgIFwibnBtLXJ1bi1hbGxcIjogXCJeNC4xLjVcIixcbiAgICBcIm9yYVwiOiBcIl42LjMuMVwiLFxuICAgIFwicHJldHRpZXJcIjogXCJeMi44LjhcIixcbiAgICBcInByZXR0eS1xdWlja1wiOiBcIl4zLjEuM1wiLFxuICAgIFwic2ltcGxlLWdpdC1ob29rc1wiOiBcIl4yLjguMVwiLFxuICAgIFwidHN1cFwiOiBcIl43LjAuMFwiLFxuICAgIFwidHN4XCI6IFwiXjMuMTIuN1wiLFxuICAgIFwidHlwZXNjcmlwdFwiOiBcIl41LjEuM1wiLFxuICAgIFwidml0ZXByZXNzXCI6IFwiMS4wLjAtYmV0YS41XCIsXG4gICAgXCJ2aXRlc3RcIjogXCJeMC4zMi40XCIsXG4gICAgXCJ2aXRlc3QtbW9jay1leHRlbmRlZFwiOiBcIl4xLjEuNFwiLFxuICAgIFwid2ViZXh0ZW5zaW9uLXBvbHlmaWxsXCI6IFwiXjAuMTAuMFwiXG4gIH0sXG4gIFwicGVlckRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJ3ZWJleHRlbnNpb24tcG9seWZpbGxcIjogXCI+PTAuMTAuMFwiXG4gIH0sXG4gIFwicGFja2FnZU1hbmFnZXJcIjogXCJwbnBtQDguNi4zXCIsXG4gIFwic2ltcGxlLWdpdC1ob29rc1wiOiB7XG4gICAgXCJwcmUtY29tbWl0XCI6IFwicG5wbSBwcmV0dHktcXVpY2sgLS1zdGFnZWRcIlxuICB9LFxuICBcInBucG1cIjoge1xuICAgIFwicGVlckRlcGVuZGVuY3lSdWxlc1wiOiB7XG4gICAgICBcImlnbm9yZU1pc3NpbmdcIjogW1xuICAgICAgICBcIkBhbGdvbGlhL2NsaWVudC1zZWFyY2hcIixcbiAgICAgICAgXCJzZWFyY2gtaW5zaWdodHNcIlxuICAgICAgXSxcbiAgICAgIFwiYWxsb3dBbnlcIjogW1xuICAgICAgICBcIm5vZGUtZmV0Y2hcIlxuICAgICAgXVxuICAgIH1cbiAgfVxufSIsICJpbXBvcnQge1xuICBDb25maWdFbnYsXG4gIEV4dGVuc2lvblJ1bm5lckNvbmZpZyxcbiAgSW5saW5lQ29uZmlnLFxuICBJbnRlcm5hbENvbmZpZyxcbiAgVXNlckNvbmZpZyxcbiAgVXNlck1hbmlmZXN0LFxuICBVc2VyTWFuaWZlc3RGbixcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHBhdGgsIHsgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuaW1wb3J0ICogYXMgcGx1Z2lucyBmcm9tICcuLi92aXRlLXBsdWdpbnMnO1xuaW1wb3J0IHsgY3JlYXRlRnNDYWNoZSB9IGZyb20gJy4vY3JlYXRlRnNDYWNoZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxzIH0gZnJvbSAnLi9nbG9iYWxzJztcbmltcG9ydCB7IGxvYWRDb25maWcgfSBmcm9tICdjMTInO1xuXG4vKipcbiAqIEdpdmVuIGFuIGlubGluZSBjb25maWcsIGRpc2NvdmVyIHRoZSBjb25maWcgZmlsZSBpZiBuZWNlc3NhcnksIG1lcmdlIHRoZSByZXN1bHRzLCByZXNvbHZlIGFueVxuICogcmVsYXRpdmUgcGF0aHMsIGFuZCBhcHBseSBhbnkgZGVmYXVsdHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRJbnRlcm5hbENvbmZpZyhcbiAgY29uZmlnOiBJbmxpbmVDb25maWcsXG4gIGNvbW1hbmQ6ICdidWlsZCcgfCAnc2VydmUnLFxuKTogUHJvbWlzZTxJbnRlcm5hbENvbmZpZz4ge1xuICAvLyBBcHBseSBkZWZhdWx0cyB0byBhIGJhc2UgY29uZmlnXG4gIGNvbnN0IHJvb3QgPSBjb25maWcucm9vdCA/IHBhdGgucmVzb2x2ZShjb25maWcucm9vdCkgOiBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCBtb2RlID1cbiAgICBjb25maWcubW9kZSA/PyAoY29tbWFuZCA9PT0gJ2J1aWxkJyA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCcpO1xuICBjb25zdCBicm93c2VyID0gY29uZmlnLmJyb3dzZXIgPz8gJ2Nocm9tZSc7XG4gIGNvbnN0IG1hbmlmZXN0VmVyc2lvbiA9XG4gICAgY29uZmlnLm1hbmlmZXN0VmVyc2lvbiA/PyAoYnJvd3NlciA9PSAnZmlyZWZveCcgPyAyIDogMyk7XG4gIGNvbnN0IG91dEJhc2VEaXIgPSBwYXRoLnJlc29sdmUocm9vdCwgJy5vdXRwdXQnKTtcbiAgY29uc3Qgb3V0RGlyID0gcGF0aC5yZXNvbHZlKG91dEJhc2VEaXIsIGAke2Jyb3dzZXJ9LW12JHttYW5pZmVzdFZlcnNpb259YCk7XG4gIGNvbnN0IGxvZ2dlciA9IGNvbmZpZy5sb2dnZXIgPz8gY29uc29sYTtcblxuICBjb25zdCBiYXNlQ29uZmlnOiBJbnRlcm5hbENvbmZpZ05vVXNlckRpcnMgPSB7XG4gICAgcm9vdCxcbiAgICBvdXREaXIsXG4gICAgb3V0QmFzZURpcixcbiAgICBzdG9yZUlkczogY29uZmlnLnN0b3JlSWRzID8/IHt9LFxuICAgIGJyb3dzZXIsXG4gICAgbWFuaWZlc3RWZXJzaW9uLFxuICAgIG1vZGUsXG4gICAgY29tbWFuZCxcbiAgICBsb2dnZXIsXG4gICAgdml0ZTogY29uZmlnLnZpdGUgPz8ge30sXG4gICAgaW1wb3J0czogY29uZmlnLmltcG9ydHMgPz8ge30sXG4gICAgcnVubmVyQ29uZmlnOiBhd2FpdCBsb2FkQ29uZmlnPEV4dGVuc2lvblJ1bm5lckNvbmZpZz4oe1xuICAgICAgbmFtZTogJ3dlYi1leHQnLFxuICAgICAgY3dkOiByb290LFxuICAgICAgZ2xvYmFsUmM6IHRydWUsXG4gICAgICByY0ZpbGU6ICcud2ViZXh0cmMnLFxuICAgICAgb3ZlcnJpZGVzOiBjb25maWcucnVubmVyLFxuICAgIH0pLFxuICB9O1xuXG4gIC8vIExvYWQgdXNlciBjb25maWcgZnJvbSBmaWxlXG4gIGxldCB1c2VyQ29uZmlnOiBVc2VyQ29uZmlnID0ge1xuICAgIG1vZGUsXG4gIH07XG4gIGlmIChjb25maWcuY29uZmlnRmlsZSAhPT0gZmFsc2UpIHtcbiAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkQ29uZmlnPFVzZXJDb25maWc+KHtcbiAgICAgIG5hbWU6ICd3eHQnLFxuICAgICAgY3dkOiByb290LFxuICAgICAgcmNGaWxlOiBmYWxzZSxcbiAgICB9KTtcbiAgICB1c2VyQ29uZmlnID0gbG9hZGVkLmNvbmZpZyA/PyB7fTtcbiAgfVxuXG4gIC8vIE1lcmdlIGlubGluZSBhbmQgdXNlciBjb25maWdzXG4gIGNvbnN0IG1lcmdlZCA9IHZpdGUubWVyZ2VDb25maWcoXG4gICAgYmFzZUNvbmZpZyxcbiAgICB1c2VyQ29uZmlnLFxuICApIGFzIEludGVybmFsQ29uZmlnTm9Vc2VyRGlycztcblxuICAvLyBBcHBseSB1c2VyIGNvbmZpZyBhbmQgY3JlYXRlIGZpbmFsIGNvbmZpZ1xuICBjb25zdCBzcmNEaXIgPSB1c2VyQ29uZmlnLnNyY0RpciA/IHJlc29sdmUocm9vdCwgdXNlckNvbmZpZy5zcmNEaXIpIDogcm9vdDtcbiAgY29uc3QgZW50cnlwb2ludHNEaXIgPSByZXNvbHZlKFxuICAgIHNyY0RpcixcbiAgICB1c2VyQ29uZmlnLmVudHJ5cG9pbnRzRGlyID8/ICdlbnRyeXBvaW50cycsXG4gICk7XG4gIGNvbnN0IHB1YmxpY0RpciA9IHJlc29sdmUocm9vdCwgdXNlckNvbmZpZy5wdWJsaWNEaXIgPz8gJ3B1YmxpYycpO1xuICBjb25zdCB3eHREaXIgPSByZXNvbHZlKHNyY0RpciwgJy53eHQnKTtcbiAgY29uc3QgdHlwZXNEaXIgPSByZXNvbHZlKHd4dERpciwgJ3R5cGVzJyk7XG5cbiAgLy8gTWVyZ2UgbWFuaWZlc3Qgc291cmNlc1xuICBjb25zdCBlbnY6IENvbmZpZ0VudiA9IHsgbW9kZSwgYnJvd3NlciwgbWFuaWZlc3RWZXJzaW9uLCBjb21tYW5kIH07XG4gIGNvbnN0IHVzZXJNYW5pZmVzdCA9IGF3YWl0IHJlc29sdmVNYW5pZmVzdENvbmZpZyhlbnYsIHVzZXJDb25maWcubWFuaWZlc3QpO1xuICBjb25zdCBpbmxpbmVNYW5pZmVzdCA9IGF3YWl0IHJlc29sdmVNYW5pZmVzdENvbmZpZyhlbnYsIGNvbmZpZy5tYW5pZmVzdCk7XG4gIGNvbnN0IG1hbmlmZXN0ID0gdml0ZS5tZXJnZUNvbmZpZyh1c2VyTWFuaWZlc3QsIGlubGluZU1hbmlmZXN0KTtcblxuICBjb25zdCBmaW5hbENvbmZpZzogSW50ZXJuYWxDb25maWcgPSB7XG4gICAgLi4ubWVyZ2VkLFxuICAgIHNyY0RpcixcbiAgICBlbnRyeXBvaW50c0RpcixcbiAgICBwdWJsaWNEaXIsXG4gICAgd3h0RGlyOiB3eHREaXIsXG4gICAgdHlwZXNEaXIsXG4gICAgZnNDYWNoZTogY3JlYXRlRnNDYWNoZSh3eHREaXIpLFxuICAgIG1hbmlmZXN0LFxuICAgIHppcDoge1xuICAgICAgc291cmNlc1RlbXBsYXRlOiAne3tuYW1lfX0te3t2ZXJzaW9ufX0tc291cmNlcy56aXAnLFxuICAgICAgYXJ0aWZhY3RUZW1wbGF0ZTogJ3t7bmFtZX19LXt7dmVyc2lvbn19LXt7YnJvd3Nlcn19LnppcCcsXG4gICAgICBzb3VyY2VzUm9vdDogcm9vdCxcbiAgICAgIC4uLnVzZXJDb25maWcuemlwLFxuICAgICAgLi4uY29uZmlnLnppcCxcbiAgICAgIGlnbm9yZWRTb3VyY2VzOiBbXG4gICAgICAgICcqKi9ub2RlX21vZHVsZXMnLFxuICAgICAgICAvLyBXWFQgZmlsZXNcbiAgICAgICAgJyoqL3dlYi1leHQuY29uZmlnLnRzJyxcbiAgICAgICAgLy8gSGlkZGVuIGZpbGVzXG4gICAgICAgICcqKi8uKicsXG4gICAgICAgIC8vIFRlc3RzXG4gICAgICAgICcqKi9fX3Rlc3RzX18vKionLFxuICAgICAgICAnKiovKi4rKHRlc3R8c3BlYykuPyhjfG0pKyhqfHQpcz8oeCknLFxuICAgICAgICAvLyBVc2VyIGNvbmZpZ1xuICAgICAgICAuLi4odXNlckNvbmZpZy56aXA/Lmlnbm9yZWRTb3VyY2VzID8/IFtdKSxcbiAgICAgICAgLi4uKGNvbmZpZy56aXA/Lmlnbm9yZWRTb3VyY2VzID8/IFtdKSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfTtcblxuICAvLyBDdXN0b21pemUgdGhlIGRlZmF1bHQgdml0ZSBjb25maWdcbiAgZmluYWxDb25maWcudml0ZS5yb290ID0gcm9vdDtcbiAgZmluYWxDb25maWcudml0ZS5jb25maWdGaWxlID0gZmFsc2U7XG4gIGZpbmFsQ29uZmlnLnZpdGUubG9nTGV2ZWwgPSAnd2Fybic7XG5cbiAgZmluYWxDb25maWcudml0ZS5idWlsZCA/Pz0ge307XG4gIGZpbmFsQ29uZmlnLnZpdGUuYnVpbGQub3V0RGlyID0gb3V0RGlyO1xuICBmaW5hbENvbmZpZy52aXRlLmJ1aWxkLmVtcHR5T3V0RGlyID0gZmFsc2U7XG5cbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zID8/PSBbXTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy5kb3dubG9hZChmaW5hbENvbmZpZykpO1xuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMucHVzaChwbHVnaW5zLmRldkh0bWxQcmVyZW5kZXIoZmluYWxDb25maWcpKTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy51bmltcG9ydChmaW5hbENvbmZpZykpO1xuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMucHVzaChcbiAgICBwbHVnaW5zLnZpcnR1YWxFbnRyeXBvaW4oJ2JhY2tncm91bmQnLCBmaW5hbENvbmZpZyksXG4gICk7XG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucy5wdXNoKFxuICAgIHBsdWdpbnMudmlydHVhbEVudHJ5cG9pbignY29udGVudC1zY3JpcHQnLCBmaW5hbENvbmZpZyksXG4gICk7XG4gIGZpbmFsQ29uZmlnLnZpdGUucGx1Z2lucy5wdXNoKHBsdWdpbnMuZGV2U2VydmVyR2xvYmFscyhmaW5hbENvbmZpZykpO1xuICBmaW5hbENvbmZpZy52aXRlLnBsdWdpbnMucHVzaChwbHVnaW5zLnRzY29uZmlnUGF0aHMoZmluYWxDb25maWcpKTtcbiAgZmluYWxDb25maWcudml0ZS5wbHVnaW5zLnB1c2gocGx1Z2lucy5ub29wQmFja2dyb3VuZCgpKTtcblxuICBmaW5hbENvbmZpZy52aXRlLmRlZmluZSA/Pz0ge307XG4gIGdldEdsb2JhbHMoZmluYWxDb25maWcpLmZvckVhY2goKGdsb2JhbCkgPT4ge1xuICAgIGZpbmFsQ29uZmlnLnZpdGUuZGVmaW5lIVtnbG9iYWwubmFtZV0gPSBKU09OLnN0cmluZ2lmeShnbG9iYWwudmFsdWUpO1xuICB9KTtcblxuICByZXR1cm4gZmluYWxDb25maWc7XG59XG5cbi8qKlxuICogSGVscGVyIHR5cGUgZm9yIGRlZmluaW5nIGEgYmFzZSBjb25maWcsIHNpbmNlIHVzZXItY29uZmlndXJhYmxlIGRpcmVjdG9yaWVzIG11c3QgYmUgc2V0IGFmdGVyXG4gKiByZWFkaW5nIGluIHRoZSB1c2VyIGNvbmZpZy5cbiAqL1xudHlwZSBJbnRlcm5hbENvbmZpZ05vVXNlckRpcnMgPSBPbWl0PFxuICBJbnRlcm5hbENvbmZpZyxcbiAgfCAnc3JjRGlyJ1xuICB8ICdwdWJsaWNEaXInXG4gIHwgJ2VudHJ5cG9pbnRzRGlyJ1xuICB8ICd3eHREaXInXG4gIHwgJ3R5cGVzRGlyJ1xuICB8ICdmc0NhY2hlJ1xuICB8ICdtYW5pZmVzdCdcbiAgfCAnemlwJ1xuPjtcblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU1hbmlmZXN0Q29uZmlnKFxuICBlbnY6IENvbmZpZ0VudixcbiAgbWFuaWZlc3Q6IFVzZXJNYW5pZmVzdCB8IFByb21pc2U8VXNlck1hbmlmZXN0PiB8IFVzZXJNYW5pZmVzdEZuIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxVc2VyTWFuaWZlc3Q+IHtcbiAgcmV0dXJuIGF3YWl0ICh0eXBlb2YgbWFuaWZlc3QgPT09ICdmdW5jdGlvbidcbiAgICA/IG1hbmlmZXN0KGVudilcbiAgICA6IG1hbmlmZXN0ID8/IHt9KTtcbn1cbiIsICJpbXBvcnQgeyBFbnRyeXBvaW50IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHBhdGgsIHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgbm9ybWFsaXplUGF0aCB9IGZyb20gJy4vcGF0aHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW50cnlwb2ludE5hbWUoXG4gIGVudHJ5cG9pbnRzRGlyOiBzdHJpbmcsXG4gIGlucHV0UGF0aDogc3RyaW5nLFxuICAvLyB0eXBlOiBFbnRyeXBvaW50Wyd0eXBlJ10sXG4pOiBzdHJpbmcge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGVudHJ5cG9pbnRzRGlyLCBpbnB1dFBhdGgpO1xuICAvLyBHcmFiIHRoZSBzdHJpbmcgdXAgdG8gdGhlIGZpcnN0IC4gb3IgLyBvciBcXFxcXG4gIGNvbnN0IG5hbWUgPSByZWxhdGl2ZVBhdGguc3BsaXQoL1tcXC5cXC9cXFxcXS8sIDIpWzBdO1xuXG4gIHJldHVybiBuYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW50cnlwb2ludE91dHB1dEZpbGUoXG4gIGVudHJ5cG9pbnQ6IEVudHJ5cG9pbnQsXG4gIGV4dDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc29sdmUoZW50cnlwb2ludC5vdXRwdXREaXIsIGAke2VudHJ5cG9pbnQubmFtZX0ke2V4dH1gKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4ncyB0aGUgZW50cnlwb2ludCdzIG91dHB1dCBwYXRoIHJlbGF0aXZlIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiBVc2VkIGZvciBwYXRocyBpbiB0aGVcbiAqIG1hbmlmZXN0IGFuZCByb2xsdXAncyBidW5kbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgZW50cnlwb2ludDogRW50cnlwb2ludCxcbiAgb3V0RGlyOiBzdHJpbmcsXG4gIGV4dDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZVBhdGgoXG4gICAgcmVsYXRpdmUob3V0RGlyLCBnZXRFbnRyeXBvaW50T3V0cHV0RmlsZShlbnRyeXBvaW50LCBleHQpKSxcbiAgKTtcbn1cbiIsICJpbXBvcnQgbm9kZVBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5cbi8qKlxuICogQ29udmVydHMgc3lzdGVtIHBhdGhzIHRvIG5vcm1hbGl6ZWQgYnVuZGxlciBwYXRoLiBPbiB3aW5kb3dzIGFuZCB1bml4LCB0aGlzIHJldHVybnMgcGF0aHMgd2l0aCAvXG4gKiBpbnN0ZWFkIG9mIFxcLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdml0ZS5ub3JtYWxpemVQYXRoKHBhdGgpO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgbm9ybWFsaXplZCBwYXRoLCBjb252ZXJ0IGl0IHRvIHRoZSBzeXN0ZW0gcGF0aCBzdHlsZS4gT24gV2luZG93cywgc3dpdGNoIHRvIFxcLCBvdGhlcndpc2UgdXNlIC8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bm5vcm1hbGl6ZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vZGVQYXRoLm5vcm1hbGl6ZShwYXRoKTtcbn1cbiIsICJpbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50TmFtZSB9IGZyb20gJy4uL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IHBhcnNlSFRNTCB9IGZyb20gJ2xpbmtlZG9tJztcbmltcG9ydCB7IGRpcm5hbWUsIGlzQWJzb2x1dGUsIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5cbi8qKlxuICogUHJlLXJlbmRlcnMgdGhlIEhUTUwgZW50cnlwb2ludHMgd2hlbiBidWlsZGluZyB0aGUgZXh0ZW5zaW9uIHRvIGNvbm5lY3QgdG8gdGhlIGRldiBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXZIdG1sUHJlcmVuZGVyKGNvbmZpZzogSW50ZXJuYWxDb25maWcpOiB2aXRlLlBsdWdpbiB7XG4gIHJldHVybiB7XG4gICAgYXBwbHk6ICdidWlsZCcsXG4gICAgbmFtZTogJ3d4dDpkZXYtaHRtbC1wcmVyZW5kZXInLFxuICAgIGNvbmZpZygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgICBhbGlhczoge1xuICAgICAgICAgICAgJ0B3eHQvcmVsb2FkLWh0bWwnOiByZXNvbHZlKFxuICAgICAgICAgICAgICBjb25maWcucm9vdCxcbiAgICAgICAgICAgICAgJ25vZGVfbW9kdWxlcy93eHQvZGlzdC92aXJ0dWFsLW1vZHVsZXMvcmVsb2FkLWh0bWwuanMnLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuICAgIGFzeW5jIHRyYW5zZm9ybShodG1sLCBpZCkge1xuICAgICAgY29uc3Qgc2VydmVyID0gY29uZmlnLnNlcnZlcjtcbiAgICAgIGlmIChjb25maWcuY29tbWFuZCAhPT0gJ3NlcnZlJyB8fCBzZXJ2ZXIgPT0gbnVsbCB8fCAhaWQuZW5kc1dpdGgoJy5odG1sJykpXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY29uc3Qgb3JpZ2luYWxVcmwgPSBgJHtzZXJ2ZXIub3JpZ2lufSR7aWR9YDtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRFbnRyeXBvaW50TmFtZShjb25maWcuZW50cnlwb2ludHNEaXIsIGlkKTtcbiAgICAgIGNvbnN0IHVybCA9IGAke3NlcnZlci5vcmlnaW59LyR7bmFtZX0uaHRtbGA7XG4gICAgICBjb25zdCBzZXJ2ZXJIdG1sID0gYXdhaXQgc2VydmVyLnRyYW5zZm9ybUluZGV4SHRtbChcbiAgICAgICAgdXJsLFxuICAgICAgICBodG1sLFxuICAgICAgICBvcmlnaW5hbFVybCxcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGRvY3VtZW50IH0gPSBwYXJzZUhUTUwoc2VydmVySHRtbCk7XG5cbiAgICAgIGNvbnN0IHBvaW50VG9EZXZTZXJ2ZXIgPSAocXVlcnlTZWxlY3Rvcjogc3RyaW5nLCBhdHRyOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3JjID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cik7XG4gICAgICAgICAgaWYgKCFzcmMpIHJldHVybjtcblxuICAgICAgICAgIGlmIChpc0Fic29sdXRlKHNyYykpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHIsIHNlcnZlci5vcmlnaW4gKyBzcmMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3JjLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgICAgY29uc3QgYWJzID0gcmVzb2x2ZShkaXJuYW1lKGlkKSwgc3JjKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGhuYW1lID0gcmVsYXRpdmUoY29uZmlnLnJvb3QsIGFicyk7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLCBgJHtzZXJ2ZXIub3JpZ2lufS8ke3BhdGhuYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgcG9pbnRUb0RldlNlcnZlcignc2NyaXB0W3R5cGU9bW9kdWxlXScsICdzcmMnKTtcbiAgICAgIHBvaW50VG9EZXZTZXJ2ZXIoJ2xpbmtbcmVsPXN0eWxlc2hlZXRdJywgJ2hyZWYnKTtcblxuICAgICAgLy8gQWRkIGEgc2NyaXB0IHRvIGFkZCBwYWdlIHJlbG9hZGluZ1xuICAgICAgY29uc3QgcmVsb2FkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgIHJlbG9hZGVyLnNyYyA9ICdAd3h0L3JlbG9hZC1odG1sJztcbiAgICAgIHJlbG9hZGVyLnR5cGUgPSAnbW9kdWxlJztcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocmVsb2FkZXIpO1xuXG4gICAgICBjb25zdCBuZXdIdG1sID0gZG9jdW1lbnQudG9TdHJpbmcoKTtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoJ1RyYW5zZm9ybWVkICcgKyBpZCk7XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCdPbGQgSFRNTDpcXG4nICsgaHRtbCk7XG4gICAgICBjb25maWcubG9nZ2VyLmRlYnVnKCdOZXcgSFRNTDpcXG4nICsgbmV3SHRtbCk7XG4gICAgICByZXR1cm4gbmV3SHRtbDtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogRGVmaW5lcyBnbG9iYWwgY29uc3RhbnRzIGFib3V0IHRoZSBkZXYgc2VydmVyLiBIZWxwcyBzY3JpcHRzIGNvbm5lY3QgdG8gdGhlIHNlcnZlcidzIHdlYiBzb2NrZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXZTZXJ2ZXJHbG9iYWxzKGludGVybmFsQ29uZmlnOiBJbnRlcm5hbENvbmZpZyk6IFBsdWdpbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3d4dDpkZXYtc2VydmVyLWdsb2JhbHMnLFxuICAgIGNvbmZpZygpIHtcbiAgICAgIGlmIChpbnRlcm5hbENvbmZpZy5zZXJ2ZXIgPT0gbnVsbCB8fCBpbnRlcm5hbENvbmZpZy5jb21tYW5kID09ICdidWlsZCcpXG4gICAgICAgIHJldHVybjtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVmaW5lOiB7XG4gICAgICAgICAgX19ERVZfU0VSVkVSX1BST1RPQ09MX186IEpTT04uc3RyaW5naWZ5KCd3czonKSxcbiAgICAgICAgICBfX0RFVl9TRVJWRVJfSE9TVE5BTUVfXzogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBpbnRlcm5hbENvbmZpZy5zZXJ2ZXIuaG9zdG5hbWUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBfX0RFVl9TRVJWRVJfUE9SVF9fOiBKU09OLnN0cmluZ2lmeShpbnRlcm5hbENvbmZpZy5zZXJ2ZXIucG9ydCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IGRucyBmcm9tICdub2RlOmRucyc7XG5pbXBvcnQgeyB3aXRoVGltZW91dCB9IGZyb20gJy4vcHJvbWlzZXMnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5cbmZ1bmN0aW9uIGlzT2ZmbGluZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgaXNPZmZsaW5lID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlcykgPT4ge1xuICAgIGRucy5yZXNvbHZlKCdnb29nbGUuY29tJywgKGVycikgPT4ge1xuICAgICAgaWYgKGVyciA9PSBudWxsKSB7XG4gICAgICAgIHJlcyhmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXModHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gd2l0aFRpbWVvdXQoaXNPZmZsaW5lLCAxZTMpLmNhdGNoKCgpID0+IHRydWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNPbmxpbmUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IG9mZmxpbmUgPSBhd2FpdCBpc09mZmxpbmUoKTtcbiAgcmV0dXJuICFvZmZsaW5lO1xufVxuXG4vKipcbiAqIEZldGNoZXMgYSBVUkwgd2l0aCBhIHNpbXBsZSBHRVQgcmVxdWVzdC4gR3JhYnMgaXQgZnJvbSBjYWNoZSBpZiBpdCBkb2Vzbid0IGV4aXN0LCBvciB0aHJvd3MgYW5cbiAqIGVycm9yIGlmIGl0IGNhbid0IGJlIHJlc29sdmVkIHZpYSB0aGUgbmV0d29yayBvciBjYWNoZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoQ2FjaGVkKFxuICB1cmw6IHN0cmluZyxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxldCBjb250ZW50OiBzdHJpbmcgPSAnJztcblxuICBpZiAoYXdhaXQgaXNPbmxpbmUoKSkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKHJlcy5zdGF0dXMgPCAzMDApIHtcbiAgICAgIGNvbnRlbnQgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgYXdhaXQgY29uZmlnLmZzQ2FjaGUuc2V0KHVybCwgY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gZG93bmxvYWQgXCIke3VybH1cIiwgZmFsbGluZyBiYWNrIHRvIGNhY2hlLi4uYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250ZW50KSBjb250ZW50ID0gKGF3YWl0IGNvbmZpZy5mc0NhY2hlLmdldCh1cmwpKSA/PyAnJztcbiAgaWYgKCFjb250ZW50KVxuICAgIHRocm93IEVycm9yKFxuICAgICAgYE9mZmxpbmUgYW5kIFwiJHt1cmx9XCIgaGFzIG5vdCBiZWVuIGNhY2hlZC4gVHJ5IGFnYWluIHdoZW4gb25saW5lLmAsXG4gICAgKTtcblxuICByZXR1cm4gY29udGVudDtcbn1cbiIsICIvKipcbiAqIEFkZCBhIHRpbWVvdXQgdG8gYSBwcm9taXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFRpbWVvdXQ8VD4oXG4gIHByb21pc2U6IFByb21pc2U8VD4sXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlaihgUHJvbWlzZSB0aW1lZCBvdXQgYWZ0ZXIgJHtkdXJhdGlvbn1tc2ApO1xuICAgIH0sIGR1cmF0aW9uKTtcbiAgICBwcm9taXNlXG4gICAgICAudGhlbihyZXMpXG4gICAgICAuY2F0Y2gocmVqKVxuICAgICAgLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgRG9uJ3QgdXNlIGluIHByb2R1Y3Rpb24sIGp1c3QgZm9yIHRlc3RpbmcgYW5kIHNsb3dpbmcgdGhpbmdzIGRvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzKSA9PiBzZXRUaW1lb3V0KHJlcywgbXMpKTtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZmV0Y2hDYWNoZWQgfSBmcm9tICcuLi91dGlscy9uZXR3b3JrJztcblxuLyoqXG4gKiBEb3dubG9hZHMgYW55IFVSTCBpbXBvcnRzLCBsaWtlIEdvb2dsZSBBbmFseXRpY3MsIGludG8gdmlydHVhbCBtb2R1bGVzIHNvIHRoZXkgYXJlIGJ1bmRsZWQgd2l0aFxuICogdGhlIGV4dGVuc2lvbiBpbnN0ZWFkIG9mIGRlcGVuZGluZyBvbiByZW1vdGUgY29kZSBhdCBydW50aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgXCJ1cmw6aHR0cHM6Ly9nb29nbGUtdGFnbWFuYWdlci5jb20vZ3RhZz9pZD1YWVpcIjtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkKGNvbmZpZzogSW50ZXJuYWxDb25maWcpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6ZG93bmxvYWQnLFxuICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgaWYgKGlkLnN0YXJ0c1dpdGgoJ3VybDonKSkgcmV0dXJuICdcXDAnICsgaWQ7XG4gICAgfSxcbiAgICBhc3luYyBsb2FkKGlkKSB7XG4gICAgICBpZiAoIWlkLnN0YXJ0c1dpdGgoJ1xcMHVybDonKSkgcmV0dXJuO1xuXG4gICAgICAvLyBMb2FkIGZpbGUgZnJvbSBuZXR3b3JrIG9yIGNhY2hlXG4gICAgICBjb25zdCB1cmwgPSBpZC5yZXBsYWNlKCdcXDB1cmw6JywgJycpO1xuICAgICAgcmV0dXJuIGF3YWl0IGZldGNoQ2FjaGVkKHVybCwgY29uZmlnKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBFbnRyeXBvaW50LCBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGRpcm5hbWUsIGV4dG5hbWUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGggfSBmcm9tICcuLi91dGlscy9lbnRyeXBvaW50cyc7XG5pbXBvcnQgZnMsIHsgZW5zdXJlRGlyIH0gZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgbm9ybWFsaXplUGF0aCB9IGZyb20gJy4uL3V0aWxzL3BhdGhzJztcblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBIVE1MIGZpbGVzIG91dHB1dCBieSBhIG11bHRpcGFnZSBidWlsZCBhcmUgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uIFRoaXMgZG9lcyB0d29cbiAqIHRoaW5nczpcbiAqXG4gKiAxLiBNb3ZlcyB0aGUgSE1UTCBmaWxlcyB0byB0aGVpciBmaW5hbCBsb2NhdGlvbiBhdCBgPG91dERpcj4vPGVudHJ5cG9pbnQubmFtZT4uaHRtbGAuXG4gKiAyLiBVcGRhdGVzIHRoZSBidW5kbGUgc28gaXQgc3VtbWFyaXplcyB0aGUgZmlsZXMgY29ycmVjdGx5IGluIHRoZSByZXR1cm5lZCBidWlsZCBvdXRwdXQuXG4gKlxuICogQXNzZXRzIChKUyBhbmQgQ1NTKSBhcmUgb3V0cHV0IHRvIHRoZSBgPG91dERpcj4vYXNzZXRzYCBkaXJlY3RvcnksIGFuZCBkb24ndCBuZWVkIHRvIGJlIG1vZGlmaWVkLlxuICogSFRNTCBmaWxlcyBhY2Nlc3MgdGhlbSB2aWEgYWJzb2x1dGUgVVJMcywgc28gd2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgYW55IGltcG9ydCBwYXRocyBpbiB0aGUgSFRNTFxuICogZmlsZXMgZWl0aGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwYWdlTW92ZShcbiAgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IHZpdGUuUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnd3h0Om11bHRpcGFnZS1tb3ZlJyxcbiAgICBhc3luYyB3cml0ZUJ1bmRsZShfLCBidW5kbGUpIHtcbiAgICAgIGZvciAoY29uc3Qgb2xkQnVuZGxlUGF0aCBpbiBidW5kbGUpIHtcbiAgICAgICAgLy8gb2xkQnVuZGxlUGF0aCA9ICdlbnRyeXBvaW50cy9wb3B1cC5odG1sJyBvciAnZW50cnlwb2ludHMvb3B0aW9ucy9pbmRleC5odG1sJ1xuXG4gICAgICAgIC8vIEZpbmQgYSBtYXRjaGluZyBlbnRyeXBvaW50IC0gb2xkQnVuZGxlUGF0aCBpcyB0aGUgc2FtZSBhcyBlbmQgZW5kIG9mIHRoZSBpbnB1dCBwYXRoLlxuICAgICAgICBjb25zdCBlbnRyeXBvaW50ID0gZW50cnlwb2ludHMuZmluZChcbiAgICAgICAgICAoZW50cnkpID0+ICEhbm9ybWFsaXplUGF0aChlbnRyeS5pbnB1dFBhdGgpLmVuZHNXaXRoKG9sZEJ1bmRsZVBhdGgpLFxuICAgICAgICApO1xuICAgICAgICBpZiAoZW50cnlwb2ludCA9PSBudWxsKSB7XG4gICAgICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygnTm8gZW50cnlwb2ludCBmb3VuZCBmb3InLCBvbGRCdW5kbGVQYXRoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgbmV3IGJ1bmRsZSBwYXRoXG4gICAgICAgIGNvbnN0IG5ld0J1bmRsZVBhdGggPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgICAgICBlbnRyeXBvaW50LFxuICAgICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICAgZXh0bmFtZShvbGRCdW5kbGVQYXRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG5ld0J1bmRsZVBhdGggPT09IG9sZEJ1bmRsZVBhdGgpIHtcbiAgICAgICAgICBjb25maWcubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgJ0hUTUwgZmlsZSBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uJyxcbiAgICAgICAgICAgIG9sZEJ1bmRsZVBhdGgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgZmlsZSBhbmQgdXBkYXRlIGJ1bmRsZVxuICAgICAgICAvLyBEbyB0aGlzIGluc2lkZSBhIG11dGV4IGxvY2sgc28gaXQgb25seSBydW5zIG9uZSBhdCBhIHRpbWUgZm9yIGNvbmN1cnJlbnQgbXVsdGlwYWdlIGJ1aWxkc1xuICAgICAgICBjb25zdCBvbGRBYnNQYXRoID0gcmVzb2x2ZShjb25maWcub3V0RGlyLCBvbGRCdW5kbGVQYXRoKTtcbiAgICAgICAgY29uc3QgbmV3QWJzUGF0aCA9IHJlc29sdmUoY29uZmlnLm91dERpciwgbmV3QnVuZGxlUGF0aCk7XG4gICAgICAgIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKG5ld0Fic1BhdGgpKTtcbiAgICAgICAgYXdhaXQgZnMubW92ZShvbGRBYnNQYXRoLCBuZXdBYnNQYXRoLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcblxuICAgICAgICBjb25zdCByZW5hbWVkQ2h1bmsgPSB7XG4gICAgICAgICAgLi4uYnVuZGxlW29sZEJ1bmRsZVBhdGhdLFxuICAgICAgICAgIGZpbGVOYW1lOiBuZXdCdW5kbGVQYXRoLFxuICAgICAgICB9O1xuICAgICAgICBkZWxldGUgYnVuZGxlW29sZEJ1bmRsZVBhdGhdO1xuICAgICAgICBidW5kbGVbbmV3QnVuZGxlUGF0aF0gPSByZW5hbWVkQ2h1bms7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVVbmltcG9ydCB9IGZyb20gJ3VuaW1wb3J0JztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0VW5pbXBvcnRPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvYXV0by1pbXBvcnRzJztcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgZXh0bmFtZSB9IGZyb20gJ3BhdGgnO1xuXG5jb25zdCBFTkFCTEVEX0VYVEVOU0lPTlM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCB1bmRlZmluZWQ+ID0ge1xuICAnLmpzJzogdHJ1ZSxcbiAgJy5qc3gnOiB0cnVlLFxuICAnLnRzJzogdHJ1ZSxcbiAgJy50c3gnOiB0cnVlLFxuICAnLnZ1ZSc6IHRydWUsXG4gICcuc3ZlbHRlJzogdHJ1ZSxcbn07XG5cbi8qKlxuICogSW5qZWN0IGFueSBnbG9iYWwgaW1wb3J0cyBkZWZpbmVkIGJ5IHVuaW1wb3J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmltcG9ydChjb25maWc6IEludGVybmFsQ29uZmlnKTogUGx1Z2luIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGdldFVuaW1wb3J0T3B0aW9ucyhjb25maWcpO1xuICBjb25zdCB1bmltcG9ydCA9IGNyZWF0ZVVuaW1wb3J0KG9wdGlvbnMpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3d4dDp1bmltcG9ydCcsXG4gICAgYXN5bmMgY29uZmlnKCkge1xuICAgICAgYXdhaXQgdW5pbXBvcnQuc2NhbkltcG9ydHNGcm9tRGlyKHVuZGVmaW5lZCwgeyBjd2Q6IGNvbmZpZy5zcmNEaXIgfSk7XG4gICAgfSxcbiAgICBhc3luYyB0cmFuc2Zvcm0oY29kZSwgaWQpIHtcbiAgICAgIGNvbnN0IGV4dCA9IGV4dG5hbWUoaWQpO1xuICAgICAgaWYgKEVOQUJMRURfRVhURU5TSU9OU1tleHRdKSByZXR1cm4gdW5pbXBvcnQuaW5qZWN0SW1wb3J0cyhjb2RlLCBpZCk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBVbmltcG9ydE9wdGlvbnMgfSBmcm9tICd1bmltcG9ydCc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG1lcmdlQ29uZmlnIH0gZnJvbSAndml0ZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmltcG9ydE9wdGlvbnMoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQYXJ0aWFsPFVuaW1wb3J0T3B0aW9ucz4ge1xuICBjb25zdCBkZWZhdWx0T3B0aW9uczogUGFydGlhbDxVbmltcG9ydE9wdGlvbnM+ID0ge1xuICAgIGRlYnVnTG9nOiBjb25maWcubG9nZ2VyLmRlYnVnLFxuICAgIGltcG9ydHM6IFt7IG5hbWU6ICdkZWZpbmVDb25maWcnLCBmcm9tOiAnd3h0JyB9XSxcbiAgICBwcmVzZXRzOiBbeyBwYWNrYWdlOiAnd3h0L2NsaWVudCcgfSwgeyBwYWNrYWdlOiAnd3h0L2Jyb3dzZXInIH1dLFxuICAgIHdhcm46IGNvbmZpZy5sb2dnZXIud2FybixcbiAgICBkaXJzOiBbJy4vY29tcG9uZW50cy8qJywgJy4vY29tcG9zYWJsZXMvKicsICcuL2hvb2tzLyonLCAnLi91dGlscy8qJ10sXG4gIH07XG5cbiAgcmV0dXJuIG1lcmdlQ29uZmlnKFxuICAgIGRlZmF1bHRPcHRpb25zLFxuICAgIGNvbmZpZy5pbXBvcnRzLFxuICApIGFzIFBhcnRpYWw8VW5pbXBvcnRPcHRpb25zPjtcbn1cbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IEVudHJ5cG9pbnQsIEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICcuLi91dGlscy9wYXRocyc7XG5cbi8qKlxuICogV3JhcHMgYSB1c2VyJ3MgZW50cnlwb2ludCB3aXRoIGEgdml0dWFsIHZlcnNpb24gd2l0aCBhZGRpdGlvbmFsIGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmlydHVhbEVudHJ5cG9pbihcbiAgdHlwZTogRW50cnlwb2ludFsndHlwZSddLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUGx1Z2luIHtcbiAgY29uc3QgdmlydHVhbElkID0gYHZpcnR1YWw6d3h0LSR7dHlwZX0/YDtcbiAgY29uc3QgcmVzb2x2ZWRWaXJ0dWFsSWQgPSBgXFwwJHt2aXJ0dWFsSWR9YDtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IGB3eHQ6dmlydHVhbC1lbnRyeXBvaW50YCxcbiAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgIC8vIElkIGRvZXNuJ3Qgc3RhcnQgd2l0aCBwcmVmaXgsIGl0IGxvb2tzIGxpa2UgdGhpczpcbiAgICAgIC8vIC9wYXRoL3RvL3Byb2plY3QvdmlydHVhbDpiYWNrZ3JvdW5kPy9wYXRoL3RvL3Byb2plY3QvZW50cnlwb2ludHMvYmFja2dyb3VuZC50c1xuICAgICAgY29uc3QgaW5kZXggPSBpZC5pbmRleE9mKHZpcnR1YWxJZCk7XG4gICAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGlucHV0UGF0aCA9IG5vcm1hbGl6ZVBhdGgoaWQuc3Vic3RyaW5nKGluZGV4ICsgdmlydHVhbElkLmxlbmd0aCkpO1xuICAgICAgcmV0dXJuIHJlc29sdmVkVmlydHVhbElkICsgaW5wdXRQYXRoO1xuICAgIH0sXG4gICAgYXN5bmMgbG9hZChpZCkge1xuICAgICAgaWYgKCFpZC5zdGFydHNXaXRoKHJlc29sdmVkVmlydHVhbElkKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBpbnB1dFBhdGggPSBpZC5yZXBsYWNlKHJlc29sdmVkVmlydHVhbElkLCAnJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICByZXNvbHZlKFxuICAgICAgICAgIGNvbmZpZy5yb290LFxuICAgICAgICAgIGBub2RlX21vZHVsZXMvd3h0L2Rpc3QvdmlydHVhbC1tb2R1bGVzLyR7dHlwZX0tZW50cnlwb2ludC5qc2AsXG4gICAgICAgICksXG4gICAgICAgICd1dGYtOCcsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoYHZpcnR1YWw6dXNlci0ke3R5cGV9YCwgaW5wdXRQYXRoKTtcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHBhdGhzIGZyb20gJ3ZpdGUtdHNjb25maWctcGF0aHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHNjb25maWdQYXRocyhjb25maWc6IEludGVybmFsQ29uZmlnKSB7XG4gIGNvbnN0IGZuOiB0eXBlb2YgcGF0aHMgPVxuICAgIHR5cGVvZiBwYXRocyA9PT0gJ2Z1bmN0aW9uJyA/IHBhdGhzIDogKHBhdGhzIGFzIGFueSkuZGVmYXVsdDtcbiAgcmV0dXJuIGZuKHtcbiAgICByb290OiBjb25maWcucm9vdCxcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAndml0ZSc7XG5cbi8qKlxuICogSW4gZGV2IG1vZGUsIGlmIHRoZXJlJ3Mgbm90IGEgYmFja2dyb3VuZCBzY3JpcHQgbGlzdGVkLCB3ZSBuZWVkIHRvIGFkZCBvbmUuXG4gKlxuICogVGhpcyBkZWZpbmUncyBhIHZpcnR1YWwgbW9kdWxlIHRoYXQgaXMgYmFzaWNhbGx5IGp1c3QgYSBub29wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9vcEJhY2tncm91bmQoKTogUGx1Z2luIHtcbiAgY29uc3QgdmlydHVhbE1vZHVsZUlkID0gVklSVFVBTF9OT09QX0JBQ0tHUk9VTkRfTU9EVUxFX0lEO1xuICBjb25zdCByZXNvbHZlZFZpcnR1YWxNb2R1bGVJZCA9ICdcXDAnICsgdmlydHVhbE1vZHVsZUlkO1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3eHQ6bm9vcC1iYWNrZ3JvdW5kJyxcbiAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgIGlmIChpZCA9PT0gdmlydHVhbE1vZHVsZUlkKSByZXR1cm4gcmVzb2x2ZWRWaXJ0dWFsTW9kdWxlSWQ7XG4gICAgfSxcbiAgICBsb2FkKGlkKSB7XG4gICAgICBpZiAoaWQgPT09IHJlc29sdmVkVmlydHVhbE1vZHVsZUlkKSB7XG4gICAgICAgIHJldHVybiBgaW1wb3J0IHsgZGVmaW5lQmFja2dyb3VuZCB9IGZyb20gJ3d4dC9jbGllbnQnO1xcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUJhY2tncm91bmQoKCkgPT4gdm9pZCAwKWA7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IFZJUlRVQUxfTk9PUF9CQUNLR1JPVU5EX01PRFVMRV9JRCA9ICd2aXJ0dWFsOnVzZXItYmFja2dyb3VuZCc7XG4iLCAiaW1wb3J0IGZzLCB7IGVuc3VyZURpciB9IGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IEZzQ2FjaGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5cbi8qKlxuICogQSBiYXNpYyBmaWxlIHN5c3RlbSBjYWNoZSBzdG9yZWQgYXQgYDxzcmNEaXI+Ly53eHQvY2FjaGUvPGtleT5gLiBKdXN0IGNhY2hlcyBhIHN0cmluZyBpbiBhXG4gKiBmaWxlIGZvciB0aGUgZ2l2ZW4ga2V5LlxuICpcbiAqIEBwYXJhbSBzcmNEaXIgQWJzb2x1dGUgcGF0aCB0byBzb3VyY2UgZGlyZWN0b3J5LiBTZWUgYEludGVybmFsQ29uZmlnLnNyY0RpcmBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZzQ2FjaGUod3h0RGlyOiBzdHJpbmcpOiBGc0NhY2hlIHtcbiAgY29uc3QgZ2V0UGF0aCA9IChrZXk6IHN0cmluZykgPT5cbiAgICByZXNvbHZlKHd4dERpciwgJ2NhY2hlJywgZW5jb2RlVVJJQ29tcG9uZW50KGtleSkpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChrZXkpO1xuICAgICAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUocGF0aCkpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGgsIHZhbHVlLCAndXRmLTgnKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChrZXkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbHMoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGFueTsgdHlwZTogc3RyaW5nIH0+IHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBuYW1lOiAnX19NQU5JRkVTVF9WRVJTSU9OX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5tYW5pZmVzdFZlcnNpb24sXG4gICAgICB0eXBlOiBgMiB8IDNgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fQlJPV1NFUl9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlcixcbiAgICAgIHR5cGU6IGBzdHJpbmdgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ19fSVNfQ0hST01FX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5icm93c2VyID09PSAnY2hyb21lJyxcbiAgICAgIHR5cGU6IGBib29sZWFuYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdfX0lTX0ZJUkVGT1hfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmJyb3dzZXIgPT09ICdmaXJlZm94JyxcbiAgICAgIHR5cGU6IGBib29sZWFuYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdfX0lTX1NBRkFSSV9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlciA9PT0gJ3NhZmFyaScsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19JU19FREdFX18nLFxuICAgICAgdmFsdWU6IGNvbmZpZy5icm93c2VyID09PSAnZWRnZScsXG4gICAgICB0eXBlOiBgYm9vbGVhbmAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnX19JU19PUEVSQV9fJyxcbiAgICAgIHZhbHVlOiBjb25maWcuYnJvd3NlciA9PT0gJ29wZXJhJyxcbiAgICAgIHR5cGU6IGBib29sZWFuYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdfX0NPTU1BTkRfXycsXG4gICAgICB2YWx1ZTogY29uZmlnLmNvbW1hbmQsXG4gICAgICB0eXBlOiBgXCJidWlsZFwiIHwgXCJzZXJ2ZVwiYCxcbiAgICB9LFxuICBdO1xufVxuIiwgImltcG9ydCB7IEJ1aWxkT3V0cHV0LCBXeHREZXZTZXJ2ZXIsIElubGluZUNvbmZpZyB9IGZyb20gJy4vY29yZS90eXBlcyc7XG5pbXBvcnQgeyBnZXRJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4vY29yZS91dGlscy9nZXRJbnRlcm5hbENvbmZpZyc7XG5pbXBvcnQgcGMgZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgZGV0ZWN0RGV2Q2hhbmdlcyB9IGZyb20gJy4vY29yZS91dGlscy9kZXRlY3REZXZDaGFuZ2VzJztcbmltcG9ydCB7IE11dGV4IH0gZnJvbSAnYXN5bmMtbXV0ZXgnO1xuaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludE91dHB1dEZpbGUgfSBmcm9tICcuL2NvcmUvdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgYnVpbGRJbnRlcm5hbCwgcmVidWlsZCB9IGZyb20gJy4vY29yZS9idWlsZCc7XG5pbXBvcnQge1xuICBnZXRTZXJ2ZXJJbmZvLFxuICByZWxvYWRDb250ZW50U2NyaXB0cyxcbiAgcmVsb2FkSHRtbFBhZ2VzLFxuICBzZXR1cFNlcnZlcixcbn0gZnJvbSAnLi9jb3JlL3NlcnZlcic7XG5cbmV4cG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi9wYWNrYWdlLmpzb24nO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3R5cGVzL2V4dGVybmFsJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS91dGlscy9kZWZpbmVDb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3V0aWxzL2RlZmluZVJ1bm5lckNvbmZpZyc7XG5cbi8qKlxuICogQnVuZGxlcyB0aGUgZXh0ZW5zaW9uIGZvciBwcm9kdWN0aW9uLiBSZXR1cm5zIGEgcHJvbWlzZSBvZiB0aGUgYnVpbGQgcmVzdWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGQoY29uZmlnOiBJbmxpbmVDb25maWcpOiBQcm9taXNlPEJ1aWxkT3V0cHV0PiB7XG4gIGNvbnN0IGludGVybmFsQ29uZmlnID0gYXdhaXQgZ2V0SW50ZXJuYWxDb25maWcoY29uZmlnLCAnYnVpbGQnKTtcbiAgcmV0dXJuIGF3YWl0IGJ1aWxkSW50ZXJuYWwoaW50ZXJuYWxDb25maWcpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkZXYgc2VydmVyLCBwcmUtYnVpbGRzIGFsbCB0aGUgZmlsZXMgdGhhdCBuZWVkIHRvIGV4aXN0IHRvIGxvYWQgdGhlIGV4dGVuc2lvbiwgYW5kIG9wZW5cbiAqIHRoZSBicm93c2VyIHdpdGggdGhlIGV4dGVuc2lvbiBpbnN0YWxsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTZXJ2ZXIoXG4gIGNvbmZpZz86IElubGluZUNvbmZpZyxcbik6IFByb21pc2U8V3h0RGV2U2VydmVyPiB7XG4gIGNvbnN0IHNlcnZlckluZm8gPSBhd2FpdCBnZXRTZXJ2ZXJJbmZvKCk7XG5cbiAgY29uc3QgZ2V0TGF0ZXN0SW50ZXJuYWxDb25maWcgPSAoKSA9PiB7XG4gICAgY29uc3Qgdml0ZUNvbmZpZzogdml0ZS5JbmxpbmVDb25maWcgPSB2aXRlLm1lcmdlQ29uZmlnKFxuICAgICAgc2VydmVySW5mby52aXRlU2VydmVyQ29uZmlnLFxuICAgICAgY29uZmlnPy52aXRlID8/IHt9LFxuICAgICk7XG4gICAgcmV0dXJuIGdldEludGVybmFsQ29uZmlnKHsgLi4uY29uZmlnLCB2aXRlOiB2aXRlQ29uZmlnIH0sICdzZXJ2ZScpO1xuICB9O1xuXG4gIGxldCBpbnRlcm5hbENvbmZpZyA9IGF3YWl0IGdldExhdGVzdEludGVybmFsQ29uZmlnKCk7XG4gIGNvbnN0IHNlcnZlciA9IGF3YWl0IHNldHVwU2VydmVyKHNlcnZlckluZm8sIGludGVybmFsQ29uZmlnKTtcbiAgaW50ZXJuYWxDb25maWcuc2VydmVyID0gc2VydmVyO1xuXG4gIGNvbnN0IGZpbGVDaGFuZ2VkTXV0ZXggPSBuZXcgTXV0ZXgoKTtcbiAgY29uc3QgY2hhbmdlUXVldWU6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+ID0gW107XG5cbiAgc2VydmVyLndzLm9uKCd3eHQ6YmFja2dyb3VuZC1pbml0aWFsaXplZCcsICgpID0+IHtcbiAgICAvLyBSZWdpc3RlciBjb250ZW50IHNjcmlwdHMgZm9yIHRoZSBmaXJzdCB0aW1lIHNpbmNlIHRoZXkncmUgbm90IGxpc3RlZCBpbiB0aGUgbWFuaWZlc3RcbiAgICByZWxvYWRDb250ZW50U2NyaXB0cyhzZXJ2ZXIuY3VycmVudE91dHB1dC5zdGVwcywgaW50ZXJuYWxDb25maWcsIHNlcnZlcik7XG4gIH0pO1xuXG4gIHNlcnZlci53YXRjaGVyLm9uKCdhbGwnLCBhc3luYyAoZXZlbnQsIHBhdGgsIF9zdGF0cykgPT4ge1xuICAgIC8vIEhlcmUsIFwicGF0aFwiIGlzIGEgbm9uLW5vcm1hbGl6ZWQgcGF0aCAoaWU6IEM6XFxcXHVzZXJzXFxcXC4uLiBpbnN0ZWFkIG9mIEM6L3VzZXJzLy4uLilcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKGludGVybmFsQ29uZmlnLm91dEJhc2VEaXIpKSByZXR1cm47XG4gICAgY2hhbmdlUXVldWUucHVzaChbZXZlbnQsIHBhdGhdKTtcblxuICAgIGF3YWl0IGZpbGVDaGFuZ2VkTXV0ZXgucnVuRXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVDaGFuZ2VzID0gY2hhbmdlUXVldWUuc3BsaWNlKDAsIGNoYW5nZVF1ZXVlLmxlbmd0aCk7XG4gICAgICBpZiAoZmlsZUNoYW5nZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBkZXRlY3REZXZDaGFuZ2VzKGZpbGVDaGFuZ2VzLCBzZXJ2ZXIuY3VycmVudE91dHB1dCk7XG4gICAgICBpZiAoY2hhbmdlcy50eXBlID09PSAnbm8tY2hhbmdlJykgcmV0dXJuO1xuXG4gICAgICAvLyBMb2cgdGhlIGVudHJ5cG9pbnRzIHRoYXQgd2VyZSBlZmZlY3RlZFxuICAgICAgaW50ZXJuYWxDb25maWcubG9nZ2VyLmluZm8oXG4gICAgICAgIGBDaGFuZ2VkOiAke0FycmF5LmZyb20obmV3IFNldChmaWxlQ2hhbmdlcy5tYXAoKGNoYW5nZSkgPT4gY2hhbmdlWzFdKSkpXG4gICAgICAgICAgLm1hcCgoZmlsZSkgPT4gcGMuZGltKHJlbGF0aXZlKGludGVybmFsQ29uZmlnLnJvb3QsIGZpbGUpKSlcbiAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlYnVpbHROYW1lcyA9IGNoYW5nZXMucmVidWlsZEdyb3Vwc1xuICAgICAgICAuZmxhdCgpXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHBjLmN5YW4oXG4gICAgICAgICAgICByZWxhdGl2ZShpbnRlcm5hbENvbmZpZy5vdXREaXIsIGdldEVudHJ5cG9pbnRPdXRwdXRGaWxlKGVudHJ5LCAnJykpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKHBjLmRpbSgnLCAnKSk7XG5cbiAgICAgIC8vIEdldCBsYXRlc3QgY29uZmlnIGFuZCBSZWJ1aWxkIGdyb3VwcyB3aXRoIGNoYW5nZXNcbiAgICAgIGludGVybmFsQ29uZmlnID0gYXdhaXQgZ2V0TGF0ZXN0SW50ZXJuYWxDb25maWcoKTtcbiAgICAgIGludGVybmFsQ29uZmlnLnNlcnZlciA9IHNlcnZlcjtcbiAgICAgIGNvbnN0IHsgb3V0cHV0OiBuZXdPdXRwdXQgfSA9IGF3YWl0IHJlYnVpbGQoXG4gICAgICAgIGludGVybmFsQ29uZmlnLFxuICAgICAgICAvLyBUT0RPOiB0aGlzIGV4Y2x1ZGVzIG5ldyBlbnRyeXBvaW50cywgc28gdGhleSdyZSBub3QgYnVpbHQgdW50aWwgdGhlIGRldiBjb21tYW5kIGlzIHJlc3RhcnRlZFxuICAgICAgICBjaGFuZ2VzLnJlYnVpbGRHcm91cHMsXG4gICAgICAgIGNoYW5nZXMuY2FjaGVkT3V0cHV0LFxuICAgICAgKTtcbiAgICAgIHNlcnZlci5jdXJyZW50T3V0cHV0ID0gbmV3T3V0cHV0O1xuXG4gICAgICAvLyBQZXJmb3JtIHJlbG9hZHNcbiAgICAgIHN3aXRjaCAoY2hhbmdlcy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2V4dGVuc2lvbi1yZWxvYWQnOlxuICAgICAgICAgIHNlcnZlci5yZWxvYWRFeHRlbnNpb24oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaHRtbC1yZWxvYWQnOlxuICAgICAgICAgIHJlbG9hZEh0bWxQYWdlcyhjaGFuZ2VzLnJlYnVpbGRHcm91cHMsIHNlcnZlciwgaW50ZXJuYWxDb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjb250ZW50LXNjcmlwdC1yZWxvYWQnOlxuICAgICAgICAgIHJlbG9hZENvbnRlbnRTY3JpcHRzKGNoYW5nZXMuY2hhbmdlZFN0ZXBzLCBpbnRlcm5hbENvbmZpZywgc2VydmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnNvbGEuc3VjY2VzcyhgUmVsb2FkZWQ6ICR7cmVidWlsdE5hbWVzfWApO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gc2VydmVyO1xufVxuIiwgIi8qKlxuICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBhbGwgZWxlbWVudHMgb2YgdGhlIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZlcnk8VD4oXG4gIGFycmF5OiBUW10sXG4gIHByZWRpY2F0ZTogKGl0ZW06IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKylcbiAgICBpZiAoIXByZWRpY2F0ZShhcnJheVtpXSwgaSkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG4iLCAiaW1wb3J0IHsgQnVpbGRPdXRwdXQsIEJ1aWxkU3RlcE91dHB1dCwgRW50cnlwb2ludEdyb3VwIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7IGV2ZXJ5IH0gZnJvbSAnLi9hcnJheXMnO1xuaW1wb3J0IHsgbm9ybWFsaXplUGF0aCB9IGZyb20gJy4vcGF0aHMnO1xuXG4vKipcbiAqIENvbXBhcmUgdGhlIGNoYW5nZWQgZmlsZXMgdnMgdGhlIGJ1aWxkIG91dHB1dCBhbmQgZGV0ZXJtaW5lIHdoYXQga2luZCBvZiByZWxvYWQgbmVlZHMgdG8gaGFwcGVuOlxuICpcbiAqIC0gRG8gbm90aGluZ1xuICogICAtIENTUyBvciBKUyBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhbiBIVE1MIHBhZ2UgaXMgY2hhbmdlZCAtIHRoaXMgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZVxuICogICAgIGRldiBzZXJ2ZXJcbiAqICAgLSBDaGFuZ2UgaXNuJ3QgdXNlZCBieSBhbnkgb2YgdGhlIGVudHJ5cG9pbnRzXG4gKiAtIFJlbG9hZCBDb250ZW50IHNjcmlwdFxuICogICAtIENTUyBvciBKUyBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRlbnQgc2NyaXB0XG4gKiAgIC0gQmFja2dyb3VuZCBzY3JpcHQgd2lsbCBiZSB0b2xkIHRvIHJlbG9hZCB0aGUgY29udGVudCBzY3JpcHRcbiAqIC0gUmVsb2FkIEhUTUwgZmlsZVxuICogICAtIEhUTUwgZmlsZSBpdHNlbGYgaXMgc2F2ZWQgLSBITVIgZG9lc24ndCBoYW5kbGUgdGhpcyBiZWNhdXNlIHRoZSBIVE1MIHBhZ2VzIGFyZSBwcmUtcmVuZGVyZWRcbiAqICAgLSBDaHJvbWUgaXMgT0sgcmVsb2FkaW5nIHRoZSBwYWdlIHdoZW4gdGhlIEhUTUwgZmlsZSBpcyBjaGFuZ2VkIHdpdGhvdXQgcmVsb2FkaW5nIHRoZSB3aG9sZVxuICogICAgIGV4dGVuc2lvbi4gTm90IHN1cmUgYWJvdXQgZmlyZWZveCwgdGhpcyBtaWdodCBuZWVkIHRvIGNoYW5nZSB0byBhbiBleHRlbnNpb24gcmVsb2FkXG4gKiAtIFJlbG9hZCBleHRlbnNpb25cbiAqICAgLSBCYWNrZ3JvdW5kIHNjcmlwdCBpcyBjaGFuZ2VkXG4gKiAgIC0gTWFuaWZlc3QgaXMgZGlmZmVyZW50XG4gKiAtIFJlc3RhcnQgYnJvd3NlclxuICogICAtIENvbmZpZyBmaWxlIGNoYW5nZWQgKHd4dC5jb25maWcudHMsIC5lbnYsIHdlYi1leHQuY29uZmlnLnRzLCBldGMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3REZXZDaGFuZ2VzKFxuICBjaGFuZ2VkRmlsZXM6IFtldmVudDogc3RyaW5nLCBwYXRoOiBzdHJpbmddW10sXG4gIGN1cnJlbnRPdXRwdXQ6IEJ1aWxkT3V0cHV0IHwgdW5kZWZpbmVkLFxuKTogRGV2TW9kZUNoYW5nZSB7XG4gIGlmIChjdXJyZW50T3V0cHV0ID09IG51bGwpIHJldHVybiB7IHR5cGU6ICduby1jaGFuZ2UnIH07XG5cbiAgY29uc3QgY2hhbmdlZFN0ZXBzID0gbmV3IFNldChcbiAgICBjaGFuZ2VkRmlsZXMuZmxhdE1hcCgoY2hhbmdlZEZpbGUpID0+XG4gICAgICBmaW5kRWZmZWN0ZWRTdGVwcyhjaGFuZ2VkRmlsZSwgY3VycmVudE91dHB1dCksXG4gICAgKSxcbiAgKTtcbiAgaWYgKGNoYW5nZWRTdGVwcy5zaXplID09PSAwKSByZXR1cm4geyB0eXBlOiAnbm8tY2hhbmdlJyB9O1xuXG4gIGNvbnN0IHVuY2hhbmdlZE91dHB1dDogQnVpbGRPdXRwdXQgPSB7XG4gICAgbWFuaWZlc3Q6IGN1cnJlbnRPdXRwdXQubWFuaWZlc3QsXG4gICAgc3RlcHM6IFtdLFxuICAgIHB1YmxpY0Fzc2V0czogW10sXG4gIH07XG4gIGNvbnN0IGNoYW5nZWRPdXRwdXQ6IEJ1aWxkT3V0cHV0ID0ge1xuICAgIG1hbmlmZXN0OiBjdXJyZW50T3V0cHV0Lm1hbmlmZXN0LFxuICAgIHN0ZXBzOiBbXSxcbiAgICBwdWJsaWNBc3NldHM6IFtdLFxuICB9O1xuXG4gIGZvciAoY29uc3Qgc3RlcCBvZiBjdXJyZW50T3V0cHV0LnN0ZXBzKSB7XG4gICAgaWYgKGNoYW5nZWRTdGVwcy5oYXMoc3RlcCkpIHtcbiAgICAgIGNoYW5nZWRPdXRwdXQuc3RlcHMucHVzaChzdGVwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5jaGFuZ2VkT3V0cHV0LnN0ZXBzLnB1c2goc3RlcCk7XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgYXNzZXQgb2YgY3VycmVudE91dHB1dC5wdWJsaWNBc3NldHMpIHtcbiAgICBpZiAoY2hhbmdlZFN0ZXBzLmhhcyhhc3NldCkpIHtcbiAgICAgIGNoYW5nZWRPdXRwdXQucHVibGljQXNzZXRzLnB1c2goYXNzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bmNoYW5nZWRPdXRwdXQucHVibGljQXNzZXRzLnB1c2goYXNzZXQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGlzT25seUh0bWxDaGFuZ2VzID1cbiAgICBjaGFuZ2VkRmlsZXMubGVuZ3RoID4gMCAmJlxuICAgIGV2ZXJ5KGNoYW5nZWRGaWxlcywgKFtfLCBmaWxlXSkgPT4gZmlsZS5lbmRzV2l0aCgnLmh0bWwnKSk7XG4gIGlmIChpc09ubHlIdG1sQ2hhbmdlcykge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnaHRtbC1yZWxvYWQnLFxuICAgICAgY2FjaGVkT3V0cHV0OiB1bmNoYW5nZWRPdXRwdXQsXG4gICAgICByZWJ1aWxkR3JvdXBzOiBjaGFuZ2VkT3V0cHV0LnN0ZXBzLm1hcCgoc3RlcCkgPT4gc3RlcC5lbnRyeXBvaW50cyksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGlzT25seUNvbnRlbnRTY3JpcHRzID1cbiAgICBjaGFuZ2VkT3V0cHV0LnN0ZXBzLmxlbmd0aCA+IDAgJiZcbiAgICBldmVyeShcbiAgICAgIGNoYW5nZWRPdXRwdXQuc3RlcHMuZmxhdE1hcCgoc3RlcCkgPT4gc3RlcC5lbnRyeXBvaW50cyksXG4gICAgICAoZW50cnkpID0+IGVudHJ5LnR5cGUgPT09ICdjb250ZW50LXNjcmlwdCcsXG4gICAgKTtcbiAgaWYgKGlzT25seUNvbnRlbnRTY3JpcHRzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdjb250ZW50LXNjcmlwdC1yZWxvYWQnLFxuICAgICAgY2FjaGVkT3V0cHV0OiB1bmNoYW5nZWRPdXRwdXQsXG4gICAgICBjaGFuZ2VkU3RlcHM6IGNoYW5nZWRPdXRwdXQuc3RlcHMsXG4gICAgICByZWJ1aWxkR3JvdXBzOiBjaGFuZ2VkT3V0cHV0LnN0ZXBzLm1hcCgoc3RlcCkgPT4gc3RlcC5lbnRyeXBvaW50cyksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2V4dGVuc2lvbi1yZWxvYWQnLFxuICAgIGNhY2hlZE91dHB1dDogdW5jaGFuZ2VkT3V0cHV0LFxuICAgIHJlYnVpbGRHcm91cHM6IGNoYW5nZWRPdXRwdXQuc3RlcHMubWFwKChzdGVwKSA9PiBzdGVwLmVudHJ5cG9pbnRzKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBGb3IgYSBzaW5nbGUgY2hhbmdlLCByZXR1cm4gYWxsIHRoZSBzdGVwIG9mIHRoZSBidWlsZCBvdXRwdXQgdGhhdCB3ZXJlIGVmZmVjdGVkIGJ5IGl0LlxuICovXG5mdW5jdGlvbiBmaW5kRWZmZWN0ZWRTdGVwcyhcbiAgY2hhbmdlZEZpbGU6IFtldmVudDogc3RyaW5nLCBwYXRoOiBzdHJpbmddLFxuICBjdXJyZW50T3V0cHV0OiBCdWlsZE91dHB1dCxcbik6IERldGVjdGVkQ2hhbmdlW10ge1xuICBjb25zdCBjaGFuZ2VzOiBEZXRlY3RlZENoYW5nZVtdID0gW107XG4gIGNvbnN0IGNoYW5nZWRQYXRoID0gbm9ybWFsaXplUGF0aChjaGFuZ2VkRmlsZVsxXSk7XG5cbiAgY29uc3QgaXNDaHVua0VmZmVjdGVkID0gKFxuICAgIGNodW5rOiB2aXRlLlJvbGx1cC5PdXRwdXRDaHVuayB8IHZpdGUuUm9sbHVwLk91dHB1dEFzc2V0LFxuICApOiBib29sZWFuID0+XG4gICAgLy8gSWYgaXQncyBhbiBIVE1MIGZpbGUgd2l0aCB0aGUgc2FtZSBwYXRoLCBpcyBpcyBlZmZlY3RlZCBiZWNhdXNlIEhUTUwgZmlsZXMgbmVlZCB0byBiZSBwcmUtcmVuZGVyZWRcbiAgICAvLyBmaWxlTmFtZSBpcyBub3JtYWxpemVkLCByZWxhdGl2ZSBidW5kbGUgcGF0aFxuICAgIChjaHVuay50eXBlID09PSAnYXNzZXQnICYmIGNoYW5nZWRQYXRoLmVuZHNXaXRoKGNodW5rLmZpbGVOYW1lKSkgfHxcbiAgICAvLyBJZiBpdCdzIGEgY2h1bmsgdGhhdCBkZXBlbmRzIG9uIHRoZSBjaGFuZ2VkIGZpbGUsIGl0IGlzIGVmZmVjdGVkXG4gICAgLy8gbW9kdWxlSWRzIGFyZSBhYnNvbHV0ZSwgbm9ybWFsaXplZCBwYXRoc1xuICAgIChjaHVuay50eXBlID09PSAnY2h1bmsnICYmIGNodW5rLm1vZHVsZUlkcy5pbmNsdWRlcyhjaGFuZ2VkUGF0aCkpO1xuXG4gIGZvciAoY29uc3Qgc3RlcCBvZiBjdXJyZW50T3V0cHV0LnN0ZXBzKSB7XG4gICAgY29uc3QgZWZmZWN0ZWRDaHVuayA9IHN0ZXAuY2h1bmtzLmZpbmQoKGNodW5rKSA9PiBpc0NodW5rRWZmZWN0ZWQoY2h1bmspKTtcbiAgICBpZiAoZWZmZWN0ZWRDaHVuaykgY2hhbmdlcy5wdXNoKHN0ZXApO1xuICB9XG5cbiAgY29uc3QgZWZmZWN0ZWRBc3NldCA9IGN1cnJlbnRPdXRwdXQucHVibGljQXNzZXRzLmZpbmQoKGNodW5rKSA9PlxuICAgIGlzQ2h1bmtFZmZlY3RlZChjaHVuayksXG4gICk7XG4gIGlmIChlZmZlY3RlZEFzc2V0KSBjaGFuZ2VzLnB1c2goZWZmZWN0ZWRBc3NldCk7XG5cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBmaWxlcyBjaGFuZ2VkLCB3aGF0IG5lZWRzIHJlYnVpbHQsIGFuZCB0aGUgdHlwZSBvZiByZWxvYWQgdGhhdCBpc1xuICogcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIERldk1vZGVDaGFuZ2UgPVxuICB8IE5vQ2hhbmdlXG4gIHwgSHRtbFJlbG9hZFxuICB8IEV4dGVuc2lvblJlbG9hZFxuICB8IENvbnRlbnRTY3JpcHRSZWxvYWQ7XG4vLyB8IEJyb3dzZXJSZXN0YXJ0XG5cbmludGVyZmFjZSBOb0NoYW5nZSB7XG4gIHR5cGU6ICduby1jaGFuZ2UnO1xufVxuXG5pbnRlcmZhY2UgUmVidWlsZENoYW5nZSB7XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBlbnRyeXBvaW50cyB0aGF0IG5lZWQgcmVidWlsdC5cbiAgICovXG4gIHJlYnVpbGRHcm91cHM6IEVudHJ5cG9pbnRHcm91cFtdO1xuICAvKipcbiAgICogVGhlIHByZXZpb3VzIG91dHB1dCBzdHJpcHBlZCBvZiBhbnkgZmlsZXMgYXJlIGdvaW5nIHRvIGNoYW5nZS5cbiAgICovXG4gIGNhY2hlZE91dHB1dDogQnVpbGRPdXRwdXQ7XG59XG5cbmludGVyZmFjZSBIdG1sUmVsb2FkIGV4dGVuZHMgUmVidWlsZENoYW5nZSB7XG4gIHR5cGU6ICdodG1sLXJlbG9hZCc7XG59XG5cbmludGVyZmFjZSBFeHRlbnNpb25SZWxvYWQgZXh0ZW5kcyBSZWJ1aWxkQ2hhbmdlIHtcbiAgdHlwZTogJ2V4dGVuc2lvbi1yZWxvYWQnO1xufVxuXG4vLyBpbnRlcmZhY2UgQnJvd3NlclJlc3RhcnQgZXh0ZW5kcyBSZWJ1aWxkQ2hhbmdlIHtcbi8vICAgdHlwZTogJ2Jyb3dzZXItcmVzdGFydCc7XG4vLyB9XG5cbmludGVyZmFjZSBDb250ZW50U2NyaXB0UmVsb2FkIGV4dGVuZHMgUmVidWlsZENoYW5nZSB7XG4gIHR5cGU6ICdjb250ZW50LXNjcmlwdC1yZWxvYWQnO1xuICBjaGFuZ2VkU3RlcHM6IEJ1aWxkU3RlcE91dHB1dFtdO1xufVxuXG4vKipcbiAqIFdoZW4gZmlndXJpbmcgb3V0IHdoYXQgbmVlZHMgcmVsb2FkZWQsIHRoaXMgc3RvcmVzIHRoZSBzdGVwIHRoYXQgd2FzIGNoYW5nZWQsIG9yIHRoZSBwdWJsaWNcbiAqIGRpcmVjdG9yeSBhc3NldCB0aGF0IHdhcyBjaGFuZ2VkLiBJdCBkb2Vzbid0IGtub3cgd2hhdCB0eXBlIG9mIGNoYW5nZSBpcyByZXF1aXJlZCB5ZXQuIEp1c3QgYW5cbiAqIGludGVybWVkaWF0ZSB0eXBlLlxuICovXG50eXBlIERldGVjdGVkQ2hhbmdlID0gQnVpbGRTdGVwT3V0cHV0IHwgdml0ZS5Sb2xsdXAuT3V0cHV0QXNzZXQ7XG4iLCAiaW1wb3J0ICogYXMgdml0ZSBmcm9tICd2aXRlJztcbmltcG9ydCB7XG4gIEJ1aWxkT3V0cHV0LFxuICBCdWlsZFN0ZXBPdXRwdXQsXG4gIEVudHJ5cG9pbnQsXG4gIEVudHJ5cG9pbnRHcm91cCxcbiAgSW50ZXJuYWxDb25maWcsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSAnLi4vdml0ZS1wbHVnaW5zJztcbmltcG9ydCB7IHJlbW92ZUVtcHR5RGlycyB9IGZyb20gJy4uL3V0aWxzL3JlbW92ZUVtcHR5RGlycyc7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aCB9IGZyb20gJy4uL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBnZXRQdWJsaWNGaWxlcyB9IGZyb20gJy4uL3V0aWxzL3B1YmxpYyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEVudHJ5cG9pbnRzKFxuICBncm91cHM6IEVudHJ5cG9pbnRHcm91cFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPj4ge1xuICBjb25zdCBzdGVwczogQnVpbGRTdGVwT3V0cHV0W10gPSBbXTtcbiAgZm9yIChjb25zdCBncm91cCBvZiBncm91cHMpIHtcbiAgICBjb25zdCBzdGVwID0gQXJyYXkuaXNBcnJheShncm91cClcbiAgICAgID8gYXdhaXQgYnVpbGRNdWx0aXBsZUVudHJ5cG9pbnRzKGdyb3VwLCBjb25maWcpXG4gICAgICA6IGF3YWl0IGJ1aWxkU2luZ2xlRW50cnlwb2ludChncm91cCwgY29uZmlnKTtcbiAgICBzdGVwcy5wdXNoKHN0ZXApO1xuICB9XG4gIGNvbnN0IHB1YmxpY0Fzc2V0cyA9IGF3YWl0IGNvcHlQdWJsaWNEaXJlY3RvcnkoY29uZmlnKTtcblxuICAvLyBSZW1vdmUgYW55IGVtcHR5IGRpcmVjdG9yaWVzIGZyb20gbW92aW5nIG91dHB1dHMgYXJvdW5kXG4gIGF3YWl0IHJlbW92ZUVtcHR5RGlycyhjb25maWcub3V0RGlyKTtcblxuICByZXR1cm4geyBwdWJsaWNBc3NldHMsIHN0ZXBzIH07XG59XG5cbi8qKlxuICogVXNlIFZpdGUncyBsaWIgbW9kZSArIElJRkUgZm9ybWF0IHRvIGJ1bmRsZSB0aGUgZW50cnlwb2ludCB0byBhIHNpbmdsZSBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZFNpbmdsZUVudHJ5cG9pbnQoXG4gIGVudHJ5cG9pbnQ6IEVudHJ5cG9pbnQsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPEJ1aWxkU3RlcE91dHB1dD4ge1xuICAvLyBTaG91bGQgdGhpcyBlbnRyeXBvaW50IGJlIHdyYXBwZWQgYnkgdGhlIHZpdGUtcGx1Z2lucy92aXJ0dWFsRW50cnlwb2ludCBwbHVnaW4/XG4gIGNvbnN0IGlzVmlydHVhbCA9IFsnYmFja2dyb3VuZCcsICdjb250ZW50LXNjcmlwdCddLmluY2x1ZGVzKGVudHJ5cG9pbnQudHlwZSk7XG4gIGNvbnN0IGVudHJ5ID0gaXNWaXJ0dWFsXG4gICAgPyBgdmlydHVhbDp3eHQtJHtlbnRyeXBvaW50LnR5cGV9PyR7ZW50cnlwb2ludC5pbnB1dFBhdGh9YFxuICAgIDogZW50cnlwb2ludC5pbnB1dFBhdGg7XG5cbiAgY29uc3QgbGliTW9kZTogdml0ZS5Vc2VyQ29uZmlnID0ge1xuICAgIGJ1aWxkOiB7XG4gICAgICBsaWI6IHtcbiAgICAgICAgZW50cnksXG4gICAgICAgIGZvcm1hdHM6IFsnaWlmZSddLFxuICAgICAgICBuYW1lOiAnXycsXG4gICAgICAgIGZpbGVOYW1lOiBlbnRyeXBvaW50Lm5hbWUsXG4gICAgICB9LFxuICAgICAgcm9sbHVwT3B0aW9uczoge1xuICAgICAgICBvdXRwdXQ6IHtcbiAgICAgICAgICAvLyBUaGVyZSdzIG9ubHkgYSBzaW5nbGUgb3V0cHV0IGZvciB0aGlzIGJ1aWxkLCBzbyB3ZSB1c2UgdGhlIGRlc2lyZWQgYnVuZGxlIHBhdGggZm9yIHRoZVxuICAgICAgICAgIC8vIGVudHJ5IG91dHB1dCAobGlrZSBcImNvbnRlbnQtc2NyaXB0cy9vdmVybGF5LmpzXCIpXG4gICAgICAgICAgZW50cnlGaWxlTmFtZXM6IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgICAgICAgZW50cnlwb2ludCxcbiAgICAgICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICAgICAnLmpzJyxcbiAgICAgICAgICApLFxuICAgICAgICAgIC8vIE91dHB1dCBjb250ZW50IHNjcmlwdCBDU1MgdG8gYXNzZXRzLyB3aXRoIGEgaGFzaCB0byBwcmV2ZW50IGNvbmZsaWN0cy4gRGVmYXVsdHMgdG9cbiAgICAgICAgICAvLyBcIltuYW1lXS5bZXh0XVwiIGluIGxpYiBtb2RlLCB3aGljaCB1c3VhbGx5IHJlc3VsdHMgaW4gXCJzdHlsZS5jc3NcIi4gVGhhdCBtZWFucyBtdWx0aXBsZVxuICAgICAgICAgIC8vIGNvbnRlbnQgc2NyaXB0cyB3aXRoIHN0eWxlcyB3b3VsZCBvdmVyd3JpdGUgZWFjaCBvdGhlciBpZiBpdCB3ZXJlbid0IGNoYW5nZWQgYmVsb3cuXG4gICAgICAgICAgYXNzZXRGaWxlTmFtZXM6IGBhc3NldHMvJHtlbnRyeXBvaW50Lm5hbWV9LltleHRdYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgY29uc3QgZW50cnlDb25maWcgPSB2aXRlLm1lcmdlQ29uZmlnKFxuICAgIGxpYk1vZGUsXG4gICAgY29uZmlnLnZpdGUsXG4gICkgYXMgdml0ZS5JbmxpbmVDb25maWc7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdml0ZS5idWlsZChlbnRyeUNvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgZW50cnlwb2ludHM6IGVudHJ5cG9pbnQsXG4gICAgY2h1bmtzOiBnZXRCdWlsZE91dHB1dENodW5rcyhyZXN1bHQpLFxuICB9O1xufVxuXG4vKipcbiAqIFVzZSBWaXRlJ3MgbXVsdGlwYWdlIGJ1aWxkIHRvIGJ1bmRsZSBhbGwgdGhlIGVudHJ5cG9pbnRzIGluIGEgc2luZ2xlIHN0ZXAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkTXVsdGlwbGVFbnRyeXBvaW50cyhcbiAgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRbXSxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8QnVpbGRTdGVwT3V0cHV0PiB7XG4gIGNvbnN0IG11bHRpUGFnZTogdml0ZS5Vc2VyQ29uZmlnID0ge1xuICAgIHBsdWdpbnM6IFtwbHVnaW5zLm11bHRpcGFnZU1vdmUoZW50cnlwb2ludHMsIGNvbmZpZyldLFxuICAgIGJ1aWxkOiB7XG4gICAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICAgIGlucHV0OiBlbnRyeXBvaW50cy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKGlucHV0LCBlbnRyeSkgPT4ge1xuICAgICAgICAgIGlucHV0W2VudHJ5Lm5hbWVdID0gZW50cnkuaW5wdXRQYXRoO1xuICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfSwge30pLFxuICAgICAgICBvdXRwdXQ6IHtcbiAgICAgICAgICAvLyBJbmNsdWRlIGEgaGFzaCB0byBwcmV2ZW50IGNvbmZsaWN0c1xuICAgICAgICAgIGNodW5rRmlsZU5hbWVzOiAnY2h1bmtzL1tuYW1lXS1baGFzaF0uanMnLFxuICAgICAgICAgIC8vIEluY2x1ZGUgYSBoYXNoIHRvIHByZXZlbnQgY29uZmxpY3RzXG4gICAgICAgICAgZW50cnlGaWxlTmFtZXM6ICdjaHVua3MvW25hbWVdLVtoYXNoXS5qcycsXG4gICAgICAgICAgLy8gV2UgY2FuJ3QgY29udHJvbCB0aGUgXCJuYW1lXCIsIHNvIHdlIG5lZWQgYSBoYXNoIHRvIHByZXZlbnQgY29uZmxpY3RzXG4gICAgICAgICAgYXNzZXRGaWxlTmFtZXM6ICdhc3NldHMvW25hbWVdLVtoYXNoXS5bZXh0XScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgZW50cnlDb25maWcgPSB2aXRlLm1lcmdlQ29uZmlnKFxuICAgIG11bHRpUGFnZSxcbiAgICBjb25maWcudml0ZSxcbiAgKSBhcyB2aXRlLlVzZXJDb25maWc7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdml0ZS5idWlsZChlbnRyeUNvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgZW50cnlwb2ludHMsXG4gICAgY2h1bmtzOiBnZXRCdWlsZE91dHB1dENodW5rcyhyZXN1bHQpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRCdWlsZE91dHB1dENodW5rcyhcbiAgcmVzdWx0OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHZpdGUuYnVpbGQ+Pixcbik6IEJ1aWxkU3RlcE91dHB1dFsnY2h1bmtzJ10ge1xuICBpZiAoJ29uJyBpbiByZXN1bHQpIHRocm93IEVycm9yKCd3eHQgZG9lcyBub3Qgc3VwcG9ydCB2aXRlIHdhdGNoIG1vZGUuJyk7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHJldHVybiByZXN1bHQuZmxhdE1hcCgoeyBvdXRwdXQgfSkgPT4gb3V0cHV0KTtcbiAgcmV0dXJuIHJlc3VsdC5vdXRwdXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcHlQdWJsaWNEaXJlY3RvcnkoXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPEJ1aWxkT3V0cHV0WydwdWJsaWNBc3NldHMnXT4ge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGdldFB1YmxpY0ZpbGVzKGNvbmZpZyk7XG4gIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBwdWJsaWNBc3NldHM6IEJ1aWxkT3V0cHV0WydwdWJsaWNBc3NldHMnXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBzcmNQYXRoID0gcmVzb2x2ZShjb25maWcucHVibGljRGlyLCBmaWxlKTtcbiAgICBjb25zdCBvdXRQYXRoID0gcmVzb2x2ZShjb25maWcub3V0RGlyLCBmaWxlKTtcblxuICAgIGF3YWl0IGZzLmVuc3VyZURpcihkaXJuYW1lKG91dFBhdGgpKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmNQYXRoLCBvdXRQYXRoKTtcbiAgICBwdWJsaWNBc3NldHMucHVzaCh7XG4gICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgZmlsZU5hbWU6IGZpbGUsXG4gICAgICBuYW1lOiBmaWxlLFxuICAgICAgbmVlZHNDb2RlUmVmZXJlbmNlOiBmYWxzZSxcbiAgICAgIHNvdXJjZTogYXdhaXQgZnMucmVhZEZpbGUoc3JjUGF0aCksXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHVibGljQXNzZXRzO1xufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUVtcHR5RGlycyhkaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBmaWxlKTtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBhd2FpdCByZW1vdmVFbXB0eURpcnMoZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucm1kaXIoZGlyKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gbm9vcCBvbiBmYWlsdXJlIC0gdGhpcyBtZWFucyB0aGUgZGlyZWN0b3J5IHdhcyBub3QgZW1wdHkuXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgZ2xvYiBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgdW5ub3JtYWxpemVQYXRoIH0gZnJvbSAnLi9wYXRocyc7XG5cbi8qKlxuICogR2V0IGFsbCB0aGUgZmlsZXMgaW4gdGhlIHByb2plY3QncyBwdWJsaWMgZGlyZWN0b3J5LiBSZXR1cm5lZCBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlXG4gKiBgY29uZmlnLnB1YmxpY0RpcmAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQdWJsaWNGaWxlcyhcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKGNvbmZpZy5wdWJsaWNEaXIpKSkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZ2xvYignKiovKicsIHsgY3dkOiBjb25maWcucHVibGljRGlyIH0pO1xuICByZXR1cm4gZmlsZXMubWFwKHVubm9ybWFsaXplUGF0aCk7XG59XG4iLCAiaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIEJhY2tncm91bmRFbnRyeXBvaW50LFxuICBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24sXG4gIENvbnRlbnRTY3JpcHREZWZpbml0aW9uLFxuICBDb250ZW50U2NyaXB0RW50cnlwb2ludCxcbiAgRW50cnlwb2ludCxcbiAgSW50ZXJuYWxDb25maWcsXG4gIE9wdGlvbnNFbnRyeXBvaW50LFxuICBQb3B1cEVudHJ5cG9pbnQsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgcGljb21hdGNoIGZyb20gJ3BpY29tYXRjaCc7XG5pbXBvcnQgeyBwYXJzZUhUTUwgfSBmcm9tICdsaW5rZWRvbSc7XG5pbXBvcnQgSlNPTjUgZnJvbSAnanNvbjUnO1xuaW1wb3J0IHsgaW1wb3J0VHNGaWxlIH0gZnJvbSAnLi4vdXRpbHMvaW1wb3J0VHNGaWxlJztcbmltcG9ydCBnbG9iIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBnZXRFbnRyeXBvaW50TmFtZSB9IGZyb20gJy4uL3V0aWxzL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IFZJUlRVQUxfTk9PUF9CQUNLR1JPVU5EX01PRFVMRV9JRCB9IGZyb20gJy4uL3ZpdGUtcGx1Z2lucy9ub29wQmFja2dyb3VuZCc7XG5cbi8qKlxuICogUmV0dXJuIGVudHJ5cG9pbnRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9uIGJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUgcHJvamVjdCdzIGZpbGVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZEVudHJ5cG9pbnRzKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxFbnRyeXBvaW50W10+IHtcbiAgY29uc3QgcmVsYXRpdmVQYXRocyA9IGF3YWl0IGdsb2IoJyoqLyonLCB7XG4gICAgY3dkOiBjb25maWcuZW50cnlwb2ludHNEaXIsXG4gIH0pO1xuICAvLyBFbnN1cmUgY29uc2lzdGVudCBvdXRwdXRcbiAgcmVsYXRpdmVQYXRocy5zb3J0KCk7XG5cbiAgY29uc3QgcGF0aEdsb2JzID0gT2JqZWN0LmtleXMoUEFUSF9HTE9CX1RPX1RZUEVfTUFQKTtcbiAgY29uc3QgZXhpc3RpbmdOYW1lczogUmVjb3JkPHN0cmluZywgRW50cnlwb2ludCB8IHVuZGVmaW5lZD4gPSB7fTtcblxuICBjb25zdCBlbnRyeXBvaW50czogRW50cnlwb2ludFtdID0gW107XG4gIGxldCBoYXNCYWNrZ3JvdW5kID0gZmFsc2U7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHJlbGF0aXZlUGF0aHMubWFwKGFzeW5jIChyZWxhdGl2ZVBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKGNvbmZpZy5lbnRyeXBvaW50c0RpciwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIGNvbnN0IG1hdGNoaW5nR2xvYiA9IHBhdGhHbG9icy5maW5kKChnbG9iKSA9PlxuICAgICAgICBwaWNvbWF0Y2guaXNNYXRjaChyZWxhdGl2ZVBhdGgsIGdsb2IpLFxuICAgICAgKTtcblxuICAgICAgaWYgKG1hdGNoaW5nR2xvYiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYCR7cmVsYXRpdmVQYXRofSBkb2VzIG5vdCBtYXRjaCBhbnkga25vd24gZW50cnlwb2ludC4gS25vd24gZW50cnlwb2ludHM6XFxuJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIFBBVEhfR0xPQl9UT19UWVBFX01BUCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHlwZSA9IFBBVEhfR0xPQl9UT19UWVBFX01BUFttYXRjaGluZ0dsb2JdO1xuICAgICAgaWYgKHR5cGUgPT09ICdpZ25vcmVkJykgcmV0dXJuO1xuXG4gICAgICBsZXQgZW50cnlwb2ludDogRW50cnlwb2ludDtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdwb3B1cCc6XG4gICAgICAgICAgZW50cnlwb2ludCA9IGF3YWl0IGdldFBvcHVwRW50cnlwb2ludChjb25maWcsIHBhdGgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdvcHRpb25zJzpcbiAgICAgICAgICBlbnRyeXBvaW50ID0gYXdhaXQgZ2V0T3B0aW9uc0VudHJ5cG9pbnQoY29uZmlnLCBwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYmFja2dyb3VuZCc6XG4gICAgICAgICAgZW50cnlwb2ludCA9IGF3YWl0IGdldEJhY2tncm91bmRFbnRyeXBvaW50KGNvbmZpZywgcGF0aCk7XG4gICAgICAgICAgaGFzQmFja2dyb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NvbnRlbnQtc2NyaXB0JzpcbiAgICAgICAgICBlbnRyeXBvaW50ID0gYXdhaXQgZ2V0Q29udGVudFNjcmlwdEVudHJ5cG9pbnQoXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBnZXRFbnRyeXBvaW50TmFtZShjb25maWcuZW50cnlwb2ludHNEaXIsIHBhdGgpLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGVudHJ5cG9pbnQgPSB7XG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbmFtZTogZ2V0RW50cnlwb2ludE5hbWUoY29uZmlnLmVudHJ5cG9pbnRzRGlyLCBwYXRoKSxcbiAgICAgICAgICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICAgICAgICAgIG91dHB1dERpcjogY29uZmlnLm91dERpcixcbiAgICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3aXRoU2FtZU5hbWUgPSBleGlzdGluZ05hbWVzW2VudHJ5cG9pbnQubmFtZV07XG4gICAgICBpZiAod2l0aFNhbWVOYW1lKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBNdWx0aXBsZSBlbnRyeXBvaW50cyB3aXRoIHRoZSBuYW1lIFwiJHtcbiAgICAgICAgICAgIGVudHJ5cG9pbnQubmFtZVxuICAgICAgICAgIH1cIiBkZXRlY3RlZCwgYnV0IG9ubHkgb25lIGlzIGFsbG93ZWQ6ICR7W1xuICAgICAgICAgICAgcmVsYXRpdmUoY29uZmlnLnJvb3QsIHdpdGhTYW1lTmFtZS5pbnB1dFBhdGgpLFxuICAgICAgICAgICAgcmVsYXRpdmUoY29uZmlnLnJvb3QsIGVudHJ5cG9pbnQuaW5wdXRQYXRoKSxcbiAgICAgICAgICBdLmpvaW4oJywgJyl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGVudHJ5cG9pbnRzLnB1c2goZW50cnlwb2ludCk7XG4gICAgICBleGlzdGluZ05hbWVzW2VudHJ5cG9pbnQubmFtZV0gPSBlbnRyeXBvaW50O1xuICAgIH0pLFxuICApO1xuICBpZiAoY29uZmlnLmNvbW1hbmQgPT09ICdzZXJ2ZScgJiYgIWhhc0JhY2tncm91bmQpIHtcbiAgICBlbnRyeXBvaW50cy5wdXNoKFxuICAgICAgYXdhaXQgZ2V0QmFja2dyb3VuZEVudHJ5cG9pbnQoY29uZmlnLCBWSVJUVUFMX05PT1BfQkFDS0dST1VORF9NT0RVTEVfSUQpLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGVudHJ5cG9pbnRzO1xufVxuXG4vKipcbiAqIEBwYXJhbSBwYXRoIEFic29sdXRlIHBhdGggdG8gdGhlIHBvcHVwIEhUTUwgZmlsZS5cbiAqIEBwYXJhbSBjb250ZW50IFN0cmluZyBjb250ZW50cyBvZiB0aGUgZmlsZSBhdCB0aGUgcGF0aC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UG9wdXBFbnRyeXBvaW50KFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPFBvcHVwRW50cnlwb2ludD4ge1xuICBjb25zdCBvcHRpb25zOiBQb3B1cEVudHJ5cG9pbnRbJ29wdGlvbnMnXSA9IHt9O1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgeyBkb2N1bWVudCB9ID0gcGFyc2VIVE1MKGNvbnRlbnQpO1xuXG4gIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKTtcbiAgaWYgKHRpdGxlICE9IG51bGwpIG9wdGlvbnMuZGVmYXVsdFRpdGxlID0gdGl0bGUudGV4dENvbnRlbnQgPz8gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGRlZmF1bHRJY29uQ29udGVudCA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J21hbmlmZXN0LmRlZmF1bHRfaWNvbiddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGRlZmF1bHRJY29uQ29udGVudCkge1xuICAgIHRyeSB7XG4gICAgICBvcHRpb25zLmRlZmF1bHRJY29uID0gSlNPTjUucGFyc2UoZGVmYXVsdEljb25Db250ZW50KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZmF0YWwoXG4gICAgICAgIGBGYWlsZWQgdG8gcGFyc2UgZGVmYXVsdF9pY29uIG1ldGEgdGFnIGNvbnRlbnQgYXMgSlNPTjUuIGNvbnRlbnQ9JHtkZWZhdWx0SWNvbkNvbnRlbnR9YCxcbiAgICAgICAgZXJyLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtdjJLZXlDb250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3QudHlwZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKG12MktleUNvbnRlbnQpIHtcbiAgICBvcHRpb25zLm12MktleSA9XG4gICAgICBtdjJLZXlDb250ZW50ID09PSAncGFnZV9hY3Rpb24nID8gJ3BhZ2VfYWN0aW9uJyA6ICdicm93c2VyX2FjdGlvbic7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdwb3B1cCcsXG4gICAgbmFtZTogJ3BvcHVwJyxcbiAgICBvcHRpb25zLFxuICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICBvdXRwdXREaXI6IGNvbmZpZy5vdXREaXIsXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHBhdGggQWJzb2x1dGUgcGF0aCB0byB0aGUgb3B0aW9ucyBIVE1MIGZpbGUuXG4gKiBAcGFyYW0gY29udGVudCBTdHJpbmcgY29udGVudHMgb2YgdGhlIGZpbGUgYXQgdGhlIHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE9wdGlvbnNFbnRyeXBvaW50KFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPE9wdGlvbnNFbnRyeXBvaW50PiB7XG4gIGNvbnN0IG9wdGlvbnM6IE9wdGlvbnNFbnRyeXBvaW50WydvcHRpb25zJ10gPSB7fTtcblxuICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aCwgJ3V0Zi04Jyk7XG4gIGNvbnN0IHsgZG9jdW1lbnQgfSA9IHBhcnNlSFRNTChjb250ZW50KTtcblxuICBjb25zdCBvcGVuSW5UYWJDb250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3Qub3Blbl9pbl90YWInXVwiKVxuICAgID8uZ2V0QXR0cmlidXRlKCdjb250ZW50Jyk7XG4gIGlmIChvcGVuSW5UYWJDb250ZW50KSB7XG4gICAgb3B0aW9ucy5vcGVuSW5UYWIgPSBvcGVuSW5UYWJDb250ZW50ID09PSAndHJ1ZSc7XG4gIH1cblxuICBjb25zdCBjaHJvbWVTdHlsZUNvbnRlbnQgPSBkb2N1bWVudFxuICAgIC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdtYW5pZmVzdC5jaHJvbWVfc3R5bGUnXVwiKVxuICAgID8uZ2V0QXR0cmlidXRlKCdjb250ZW50Jyk7XG4gIGlmIChjaHJvbWVTdHlsZUNvbnRlbnQpIHtcbiAgICBvcHRpb25zLmNocm9tZVN0eWxlID0gY2hyb21lU3R5bGVDb250ZW50ID09PSAndHJ1ZSc7XG4gIH1cblxuICBjb25zdCBicm93c2VyU3R5bGVDb250ZW50ID0gZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nbWFuaWZlc3QuYnJvd3Nlcl9zdHlsZSddXCIpXG4gICAgPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKTtcbiAgaWYgKGJyb3dzZXJTdHlsZUNvbnRlbnQpIHtcbiAgICBvcHRpb25zLmJyb3dzZXJTdHlsZSA9IGJyb3dzZXJTdHlsZUNvbnRlbnQgPT09ICd0cnVlJztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ29wdGlvbnMnLFxuICAgIG5hbWU6ICdvcHRpb25zJyxcbiAgICBvcHRpb25zLFxuICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICBvdXRwdXREaXI6IGNvbmZpZy5vdXREaXIsXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHBhdGggQWJzb2x1dGUgcGF0aCB0byB0aGUgYmFja2dyb3VuZCdzIFRTIGZpbGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEJhY2tncm91bmRFbnRyeXBvaW50KFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPEJhY2tncm91bmRFbnRyeXBvaW50PiB7XG4gIGxldCBvcHRpb25zOiBPbWl0PEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbiwgJ21haW4nPiA9IHt9O1xuICBpZiAocGF0aCAhPT0gVklSVFVBTF9OT09QX0JBQ0tHUk9VTkRfTU9EVUxFX0lEKSB7XG4gICAgY29uc3QgZGVmYXVsdEV4cG9ydCA9IGF3YWl0IGltcG9ydFRzRmlsZTxCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24+KFxuICAgICAgcGF0aCxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuICAgIGlmIChkZWZhdWx0RXhwb3J0ID09IG51bGwpIHtcbiAgICAgIHRocm93IEVycm9yKCdCYWNrZ3JvdW5kIHNjcmlwdCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBleHBvcnQnKTtcbiAgICB9XG4gICAgY29uc3QgeyBtYWluOiBfLCAuLi5tb2R1bGVPcHRpb25zIH0gPSBkZWZhdWx0RXhwb3J0O1xuICAgIG9wdGlvbnMgPSBtb2R1bGVPcHRpb25zO1xuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2JhY2tncm91bmQnLFxuICAgIG5hbWU6ICdiYWNrZ3JvdW5kJyxcbiAgICBpbnB1dFBhdGg6IHBhdGgsXG4gICAgb3V0cHV0RGlyOiBjb25maWcub3V0RGlyLFxuICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHBhdGggQWJzb2x1dGUgcGF0aCB0byB0aGUgY29udGVudCBzY3JpcHQncyBUUyBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDb250ZW50U2NyaXB0RW50cnlwb2ludChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbiAgbmFtZTogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPENvbnRlbnRTY3JpcHRFbnRyeXBvaW50PiB7XG4gIGNvbnN0IHsgbWFpbjogXywgLi4ub3B0aW9ucyB9ID0gYXdhaXQgaW1wb3J0VHNGaWxlPENvbnRlbnRTY3JpcHREZWZpbml0aW9uPihcbiAgICBwYXRoLFxuICAgIGNvbmZpZyxcbiAgKTtcbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgIHRocm93IEVycm9yKGBDb250ZW50IHNjcmlwdCAke25hbWV9IGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGV4cG9ydGApO1xuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2NvbnRlbnQtc2NyaXB0JyxcbiAgICBuYW1lOiBnZXRFbnRyeXBvaW50TmFtZShjb25maWcuZW50cnlwb2ludHNEaXIsIHBhdGgpLFxuICAgIGlucHV0UGF0aDogcGF0aCxcbiAgICBvdXRwdXREaXI6IHJlc29sdmUoY29uZmlnLm91dERpciwgJ2NvbnRlbnQtc2NyaXB0cycpLFxuICAgIG9wdGlvbnMsXG4gIH07XG59XG5cbmNvbnN0IFBBVEhfR0xPQl9UT19UWVBFX01BUDogUmVjb3JkPHN0cmluZywgRW50cnlwb2ludFsndHlwZSddIHwgJ2lnbm9yZWQnPiA9IHtcbiAgJ3NhbmRib3guaHRtbCc6ICdzYW5kYm94JyxcbiAgJ3NhbmRib3gvaW5kZXguaHRtbCc6ICdzYW5kYm94JyxcbiAgJyouc2FuZGJveC5odG1sJzogJ3NhbmRib3gnLFxuICAnKi5zYW5kYm94L2luZGV4Lmh0bWwnOiAnc2FuZGJveCcsXG5cbiAgJ2Jvb2ttYXJrcy5odG1sJzogJ2Jvb2ttYXJrcycsXG4gICdib29rbWFya3MvaW5kZXguaHRtbCc6ICdib29rbWFya3MnLFxuXG4gICdoaXN0b3J5Lmh0bWwnOiAnaGlzdG9yeScsXG4gICdoaXN0b3J5L2luZGV4Lmh0bWwnOiAnaGlzdG9yeScsXG5cbiAgJ25ld3RhYi5odG1sJzogJ25ld3RhYicsXG4gICduZXd0YWIvaW5kZXguaHRtbCc6ICduZXd0YWInLFxuXG4gICdzaWRlcGFuZWwuaHRtbCc6ICdzaWRlcGFuZWwnLFxuICAnc2lkZXBhbmVsL2luZGV4Lmh0bWwnOiAnc2lkZXBhbmVsJyxcbiAgJyouc2lkZXBhbmVsLmh0bWwnOiAnc2lkZXBhbmVsJyxcbiAgJyouc2lkZXBhbmVsL2luZGV4Lmh0bWwnOiAnc2lkZXBhbmVsJyxcblxuICAnZGV2dG9vbHMuaHRtbCc6ICdkZXZ0b29scycsXG4gICdkZXZ0b29scy9pbmRleC5odG1sJzogJ2RldnRvb2xzJyxcblxuICAnYmFja2dyb3VuZC50cyc6ICdiYWNrZ3JvdW5kJyxcbiAgW1ZJUlRVQUxfTk9PUF9CQUNLR1JPVU5EX01PRFVMRV9JRF06ICdiYWNrZ3JvdW5kJyxcblxuICAnY29udGVudC50cz8oeCknOiAnY29udGVudC1zY3JpcHQnLFxuICAnY29udGVudC9pbmRleC50cz8oeCknOiAnY29udGVudC1zY3JpcHQnLFxuICAnKi5jb250ZW50LnRzPyh4KSc6ICdjb250ZW50LXNjcmlwdCcsXG4gICcqLmNvbnRlbnQvaW5kZXgudHM/KHgpJzogJ2NvbnRlbnQtc2NyaXB0JyxcblxuICAncG9wdXAuaHRtbCc6ICdwb3B1cCcsXG4gICdwb3B1cC9pbmRleC5odG1sJzogJ3BvcHVwJyxcblxuICAnb3B0aW9ucy5odG1sJzogJ29wdGlvbnMnLFxuICAnb3B0aW9ucy9pbmRleC5odG1sJzogJ29wdGlvbnMnLFxuXG4gICcqLmh0bWwnOiAndW5saXN0ZWQtcGFnZScsXG4gICcqL2luZGV4Lmh0bWwnOiAndW5saXN0ZWQtcGFnZScsXG4gICcqLnRzJzogJ3VubGlzdGVkLXNjcmlwdCcsXG5cbiAgLy8gRG9uJ3Qgd2FybiBhYm91dCBhbnkgZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMsIGxpa2UgQ1NTIG9yIEpTIGVudHJ5cG9pbnRzIGZvciBIVE1MIGZpbGVzXG4gICcqLyonOiAnaWdub3JlZCcsXG59O1xuIiwgImltcG9ydCBjcmVhdGVKSVRJIGZyb20gJ2ppdGknO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVVbmltcG9ydCB9IGZyb20gJ3VuaW1wb3J0JztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgdHJhbnNmb3JtIGZyb20gJ2ppdGkvZGlzdC9iYWJlbCc7XG5pbXBvcnQgeyBnZXRVbmltcG9ydE9wdGlvbnMgfSBmcm9tICcuL2F1dG8taW1wb3J0cyc7XG5pbXBvcnQgeyByZW1vdmVJbXBvcnRTdGF0ZW1lbnRzIH0gZnJvbSAnLi9zdHJpbmdzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICcuL3BhdGhzJztcblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZyb20gdGhlIGRlZmF1bHQgZXhwb3J0IG9mIGEgYHBhdGhgLlxuICpcbiAqIEl0IHdvcmtzIGJ5OlxuICpcbiAqIDEuIFJlYWRpbmcgdGhlIGZpbGUgdGV4dFxuICogMi4gU3RyaXBwaW5nIGFsbCBpbXBvcnRzIGZyb20gaXQgdmlhIHJlZ2V4XG4gKiAzLiBBdXRvLWltcG9ydCBvbmx5IHRoZSBjbGllbnQgaGVscGVyIGZ1bmN0aW9uc1xuICpcbiAqIFRoaXMgcHJldmVudHMgcmVzb2x2aW5nIGltcG9ydHMgb2YgaW1wb3J0cywgc3BlZWRpbmcgdGhpbmdzIHVwIGFuZCBwcmV2ZW50aW5nIFwieHh4IGlzIG5vdFxuICogZGVmaW5lZFwiIGVycm9ycy5cbiAqXG4gKiBEb3duc2lkZSBpcyB0aGF0IGNvZGUgY2Fubm90IGJlIGV4ZWN1dGVkIG91dHNpZGUgb2YgdGhlIG1haW4gZnVjbnRpb24gZm9yIHRoZSBlbnRyeXBvaW50LFxuICogb3RoZXJ3aXNlIHlvdSB3aWxsIHNlZSBcInh4eCBpcyBub3QgZGVmaW5lZFwiIGVycm9ycyBmb3IgYW55IGltcG9ydHMgdXNlZCBvdXRzaWRlIG9mIG1haW4gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRUc0ZpbGU8VD4oXG4gIHBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8VD4ge1xuICBjb25maWcubG9nZ2VyLmRlYnVnKCdMb2FkaW5nIGZpbGUgbWV0YWRhdGE6JywgcGF0aCk7XG4gIC8vIEpJVEkgJiBCYWJlbCB1c2VzIG5vcm1hbGl6ZWQgcGF0aHMuXG4gIGNvbnN0IG5vcm1hbFBhdGggPSBub3JtYWxpemVQYXRoKHBhdGgpO1xuXG4gIGNvbnN0IHVuaW1wb3J0ID0gY3JlYXRlVW5pbXBvcnQoe1xuICAgIC4uLmdldFVuaW1wb3J0T3B0aW9ucyhjb25maWcpLFxuICAgIC8vIE9ubHkgYWxsb3cgc3BlY2lmaWMgaW1wb3J0cywgbm90IGFsbCBmcm9tIHRoZSBwcm9qZWN0XG4gICAgZGlyczogW10sXG4gIH0pO1xuICBhd2FpdCB1bmltcG9ydC5pbml0KCk7XG5cbiAgY29uc3QgdGV4dCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICBjb25zdCB0ZXh0Tm9JbXBvcnRzID0gcmVtb3ZlSW1wb3J0U3RhdGVtZW50cyh0ZXh0KTtcbiAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB1bmltcG9ydC5pbmplY3RJbXBvcnRzKHRleHROb0ltcG9ydHMpO1xuICBjb25maWcubG9nZ2VyLmRlYnVnKFxuICAgIFsnVGV4dDonLCB0ZXh0LCAnTm8gaW1wb3J0czonLCB0ZXh0Tm9JbXBvcnRzLCAnQ29kZTonLCBjb2RlXS5qb2luKCdcXG4nKSxcbiAgKTtcblxuICBjb25zdCBqaXRpID0gY3JlYXRlSklUSShfX2ZpbGVuYW1lLCB7XG4gICAgY2FjaGU6IGZhbHNlLFxuICAgIGVzbVJlc29sdmU6IHRydWUsXG4gICAgaW50ZXJvcERlZmF1bHQ6IHRydWUsXG4gICAgYWxpYXM6IHtcbiAgICAgICd3ZWJleHRlbnNpb24tcG9seWZpbGwnOiByZXNvbHZlKFxuICAgICAgICBjb25maWcucm9vdCxcbiAgICAgICAgJ25vZGVfbW9kdWxlcy93eHQvZGlzdC92aXJ0dWFsLW1vZHVsZXMvZmFrZS1icm93c2VyLmpzJyxcbiAgICAgICksXG4gICAgfSxcbiAgICB0cmFuc2Zvcm0ob3B0cykge1xuICAgICAgaWYgKG9wdHMuZmlsZW5hbWUgPT09IG5vcm1hbFBhdGgpXG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0oeyAuLi5vcHRzLCBzb3VyY2U6IGNvZGUgfSk7XG4gICAgICBlbHNlIHJldHVybiB0cmFuc2Zvcm0ob3B0cyk7XG4gICAgfSxcbiAgfSk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgaml0aShwYXRoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uZmlnLmxvZ2dlci5lcnJvcihlcnIpO1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBrZWJhYkNhc2VBbHBoYW51bWVyaWMoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvW15hLXowLTktXFxzXS9nLCAnJykgLy8gUmVtb3ZlIGFsbCBub24tYWxwaGFudW1lcmljLCBub24taHlwaGVuIGNoYXJhY3RlcnNcbiAgICAucmVwbGFjZSgvXFxzKy9nLCAnLScpOyAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIGh5cGhlbnNcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGltcG9ydCBzdGF0ZW1lbnRzIGZyb20gdGhlIHRvcCBvZiBhIGZpbGUuIEtlZXBzIGltcG9ydC5tZXRhIGFuZCBpbmxpbmUsIGFzeW5jIGBpbXBvcnQoKWBcbiAqIGNhbGxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSW1wb3J0U3RhdGVtZW50cyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKFxuICAgIC8oaW1wb3J0XFxzP1t7XFx3XVtcXHNcXFNdKj9mcm9tXFxzP1tcIiddW1xcc1xcU10qP1tcIiddOz98aW1wb3J0XFxzP1tcIiddW1xcc1xcU10qP1tcIiddOz8pL2dtLFxuICAgICcnLFxuICApO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZVVuaW1wb3J0IH0gZnJvbSAndW5pbXBvcnQnO1xuaW1wb3J0IHsgRW50cnlwb2ludCwgSW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZW50cnlwb2ludHMnO1xuaW1wb3J0IHsgZ2V0VW5pbXBvcnRPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvYXV0by1pbXBvcnRzJztcbmltcG9ydCB7IGdldEdsb2JhbHMgfSBmcm9tICcuLi91dGlscy9nbG9iYWxzJztcbmltcG9ydCB7IGdldFB1YmxpY0ZpbGVzIH0gZnJvbSAnLi4vdXRpbHMvcHVibGljJztcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICcuLi91dGlscy9wYXRocyc7XG5cbi8qKlxuICogR2VuZXJhdGUgYW5kIHdyaXRlIGFsbCB0aGUgZmlsZXMgaW5zaWRlIHRoZSBgSW50ZXJuYWxDb25maWcudHlwZXNEaXJgIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHlwZXNEaXIoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMuZW5zdXJlRGlyKGNvbmZpZy50eXBlc0Rpcik7XG5cbiAgY29uc3QgcmVmZXJlbmNlczogc3RyaW5nW10gPSBbXTtcbiAgcmVmZXJlbmNlcy5wdXNoKGF3YWl0IHdyaXRlSW1wb3J0c0RlY2xhcmF0aW9uRmlsZShjb25maWcpKTtcbiAgcmVmZXJlbmNlcy5wdXNoKGF3YWl0IHdyaXRlUGF0aHNEZWNsYXJhdGlvbkZpbGUoZW50cnlwb2ludHMsIGNvbmZpZykpO1xuICByZWZlcmVuY2VzLnB1c2goYXdhaXQgd3JpdGVHbG9iYWxzRGVjbGFyYXRpb25GaWxlKGNvbmZpZykpO1xuXG4gIGNvbnN0IG1haW5SZWZlcmVuY2UgPSBhd2FpdCB3cml0ZU1haW5EZWNsYXJhdGlvbkZpbGUocmVmZXJlbmNlcywgY29uZmlnKTtcbiAgYXdhaXQgd3JpdGVUc0NvbmZpZ0ZpbGUobWFpblJlZmVyZW5jZSwgY29uZmlnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVJbXBvcnRzRGVjbGFyYXRpb25GaWxlKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGNvbmZpZy50eXBlc0RpciwgJ2ltcG9ydHMuZC50cycpO1xuICBjb25zdCB1bmltcG9ydCA9IGNyZWF0ZVVuaW1wb3J0KGdldFVuaW1wb3J0T3B0aW9ucyhjb25maWcpKTtcblxuICAvLyBMb2FkIHByb2plY3QgaW1wb3J0cyBpbnRvIHVuaW1wb3J0IG1lbW9yeSBzbyB0aGV5IGFyZSBvdXRwdXQgdmlhIGdlbmVyYXRlVHlwZURlY2xhcmF0aW9uc1xuICBhd2FpdCB1bmltcG9ydC5zY2FuSW1wb3J0c0Zyb21EaXIodW5kZWZpbmVkLCB7IGN3ZDogY29uZmlnLnNyY0RpciB9KTtcblxuICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgZmlsZVBhdGgsXG4gICAgWycvLyBHZW5lcmF0ZWQgYnkgd3h0JywgYXdhaXQgdW5pbXBvcnQuZ2VuZXJhdGVUeXBlRGVjbGFyYXRpb25zKCldLmpvaW4oXG4gICAgICAnXFxuJyxcbiAgICApICsgJ1xcbicsXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVBhdGhzRGVjbGFyYXRpb25GaWxlKFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGNvbmZpZy50eXBlc0RpciwgJ3BhdGhzLmQudHMnKTtcbiAgY29uc3QgdW5pb25zID0gZW50cnlwb2ludHNcbiAgICAubWFwKChlbnRyeSkgPT5cbiAgICAgIGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgICBlbnRyeSxcbiAgICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICAgZW50cnkuaW5wdXRQYXRoLmVuZHNXaXRoKCcuaHRtbCcpID8gJy5odG1sJyA6ICcuanMnLFxuICAgICAgKSxcbiAgICApXG4gICAgLmNvbmNhdChhd2FpdCBnZXRQdWJsaWNGaWxlcyhjb25maWcpKVxuICAgIC5tYXAobm9ybWFsaXplUGF0aClcbiAgICAubWFwKChwYXRoKSA9PiBgICAgIHwgXCIvJHtwYXRofVwiYClcbiAgICAuc29ydCgpXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gYC8vIEdlbmVyYXRlZCBieSB3eHRcbmltcG9ydCBcInd4dC9icm93c2VyXCI7XG5cbmRlY2xhcmUgbW9kdWxlIFwid3h0L2Jyb3dzZXJcIiB7XG4gIHR5cGUgUHVibGljUGF0aCA9XG57eyB1bmlvbiB9fVxuICBleHBvcnQgaW50ZXJmYWNlIFByb2plY3RSdW50aW1lIGV4dGVuZHMgUnVudGltZS5TdGF0aWMge1xuICAgIGdldFVSTChwYXRoOiBQdWJsaWNQYXRoKTogc3RyaW5nO1xuICB9XG59XG5gO1xuXG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICB0ZW1wbGF0ZS5yZXBsYWNlKCd7eyB1bmlvbiB9fScsIHVuaW9ucyB8fCAnICAgIHwgbmV2ZXInKSxcbiAgKTtcblxuICByZXR1cm4gZmlsZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlR2xvYmFsc0RlY2xhcmF0aW9uRmlsZShcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcmVzb2x2ZShjb25maWcudHlwZXNEaXIsICdnbG9iYWxzLmQudHMnKTtcbiAgY29uc3QgZ2xvYmFscyA9IGdldEdsb2JhbHMoY29uZmlnKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgIGZpbGVQYXRoLFxuICAgIFtcbiAgICAgICcvLyBHZW5lcmF0ZWQgYnkgd3h0JyxcbiAgICAgICdleHBvcnQge30nLFxuICAgICAgJ2RlY2xhcmUgZ2xvYmFsIHsnLFxuICAgICAgLi4uZ2xvYmFscy5tYXAoKGdsb2JhbCkgPT4gYCAgY29uc3QgJHtnbG9iYWwubmFtZX06ICR7Z2xvYmFsLnR5cGV9O2ApLFxuICAgICAgJ30nLFxuICAgIF0uam9pbignXFxuJykgKyAnXFxuJyxcbiAgICAndXRmLTgnLFxuICApO1xuICByZXR1cm4gZmlsZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTWFpbkRlY2xhcmF0aW9uRmlsZShcbiAgcmVmZXJlbmNlczogc3RyaW5nW10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkaXIgPSBjb25maWcud3h0RGlyO1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmUoZGlyLCAnd3h0LmQudHMnKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgIGZpbGVQYXRoLFxuICAgIFtcbiAgICAgICcvLyBHZW5lcmF0ZWQgYnkgd3h0JyxcbiAgICAgIGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cInZpdGUvY2xpZW50XCIgLz5gLFxuICAgICAgLi4ucmVmZXJlbmNlcy5tYXAoXG4gICAgICAgIChyZWYpID0+XG4gICAgICAgICAgYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi8ke25vcm1hbGl6ZVBhdGgocmVsYXRpdmUoZGlyLCByZWYpKX1cIiAvPmAsXG4gICAgICApLFxuICAgIF0uam9pbignXFxuJykgKyAnXFxuJyxcbiAgKTtcbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVRzQ29uZmlnRmlsZShcbiAgbWFpblJlZmVyZW5jZTogc3RyaW5nLFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuKSB7XG4gIGNvbnN0IGRpciA9IGNvbmZpZy53eHREaXI7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICByZXNvbHZlKGRpciwgJ3RzY29uZmlnLmpzb24nKSxcbiAgICBge1xuICBcImNvbXBpbGVyT3B0aW9uc1wiOiB7XG4gICAgXCJ0YXJnZXRcIjogXCJFU05leHRcIixcbiAgICBcIm1vZHVsZVwiOiBcIkVTTmV4dFwiLFxuICAgIFwibW9kdWxlUmVzb2x1dGlvblwiOiBcIkJ1bmRsZXJcIixcbiAgICBcIm5vRW1pdFwiOiB0cnVlLFxuICAgIFwiZXNNb2R1bGVJbnRlcm9wXCI6IHRydWUsXG4gICAgXCJmb3JjZUNvbnNpc3RlbnRDYXNpbmdJbkZpbGVOYW1lc1wiOiB0cnVlLFxuICAgIFwicmVzb2x2ZUpzb25Nb2R1bGVcIjogdHJ1ZSxcbiAgICBcInN0cmljdFwiOiB0cnVlLFxuICAgIFwibGliXCI6IFtcIkRPTVwiLCBcIldlYldvcmtlclwiXSxcbiAgICBcInNraXBMaWJDaGVja1wiOiB0cnVlLFxuICAgIFwiYmFzZVVybFwiOiBcIiR7bm9ybWFsaXplUGF0aChyZWxhdGl2ZShkaXIsIGNvbmZpZy5yb290KSl9XCIsXG4gICAgXCJwYXRoc1wiOiB7XG4gICAgICBcIkBAXCI6IFtcIi5cIl0sXG4gICAgICBcIkBALypcIjogW1wiLi8qXCJdLFxuICAgICAgXCJ+flwiOiBbXCIuXCJdLFxuICAgICAgXCJ+fi8qXCI6IFtcIi4vKlwiXSxcbiAgICAgIFwiQFwiOiBbXCIke25vcm1hbGl6ZVBhdGgocmVsYXRpdmUoY29uZmlnLnJvb3QsIGNvbmZpZy5zcmNEaXIpKX1cIl0sXG4gICAgICBcIkAvKlwiOiBbXCIke25vcm1hbGl6ZVBhdGgocmVsYXRpdmUoY29uZmlnLnJvb3QsIGNvbmZpZy5zcmNEaXIpKX0vKlwiXSxcbiAgICAgIFwiflwiOiBbXCIke25vcm1hbGl6ZVBhdGgocmVsYXRpdmUoY29uZmlnLnJvb3QsIGNvbmZpZy5zcmNEaXIpKX1cIl0sXG4gICAgICBcIn4vKlwiOiBbXCIke25vcm1hbGl6ZVBhdGgocmVsYXRpdmUoY29uZmlnLnJvb3QsIGNvbmZpZy5zcmNEaXIpKX0vKlwiXVxuICAgIH1cbiAgfSxcbiAgXCJpbmNsdWRlXCI6IFtcbiAgICBcIiR7bm9ybWFsaXplUGF0aChyZWxhdGl2ZShkaXIsIGNvbmZpZy5yb290KSl9LyoqLypcIixcbiAgICBcIi4vJHtub3JtYWxpemVQYXRoKHJlbGF0aXZlKGRpciwgbWFpblJlZmVyZW5jZSkpfVwiXG4gIF0sXG4gIFwiZXhjbHVkZVwiOiBbXCIke25vcm1hbGl6ZVBhdGgocmVsYXRpdmUoZGlyLCBjb25maWcub3V0QmFzZURpcikpfVwiXVxufWAsXG4gICk7XG59XG4iLCAiaW1wb3J0IHsgRW50cnlwb2ludCB9IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IE1hbmlmZXN0IH0gZnJvbSAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJztcbmltcG9ydCB7XG4gIEJhY2tncm91bmRFbnRyeXBvaW50LFxuICBCdWlsZE91dHB1dCxcbiAgQ29udGVudFNjcmlwdEVudHJ5cG9pbnQsXG4gIEludGVybmFsQ29uZmlnLFxuICBPcHRpb25zRW50cnlwb2ludCxcbiAgUG9wdXBFbnRyeXBvaW50LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGggfSBmcm9tICcuL2VudHJ5cG9pbnRzJztcbmltcG9ydCB7IENvbnRlbnRTZWN1cml0eVBvbGljeSB9IGZyb20gJy4vQ29udGVudFNlY3VyaXR5UG9saWN5JztcbmltcG9ydCB7XG4gIGhhc2hDb250ZW50U2NyaXB0T3B0aW9ucyxcbiAgbWFwV3h0T3B0aW9uc1RvQ29udGVudFNjcmlwdCxcbn0gZnJvbSAnLi9jb250ZW50LXNjcmlwdHMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUpzb24gfSBmcm9tICcuL3BhY2thZ2UnO1xuXG4vKipcbiAqIFdyaXRlcyB0aGUgbWFuaWZlc3QgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkgYW5kIHRoZSBidWlsZCBvdXRwdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZU1hbmlmZXN0KFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIG91dHB1dDogQnVpbGRPdXRwdXQsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RyID1cbiAgICBjb25maWcubW9kZSA9PT0gJ3Byb2R1Y3Rpb24nXG4gICAgICA/IEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0KVxuICAgICAgOiBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMik7XG5cbiAgYXdhaXQgZnMuZW5zdXJlRGlyKGNvbmZpZy5vdXREaXIpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUocmVzb2x2ZShjb25maWcub3V0RGlyLCAnbWFuaWZlc3QuanNvbicpLCBzdHIsICd1dGYtOCcpO1xuXG4gIG91dHB1dC5wdWJsaWNBc3NldHMudW5zaGlmdCh7XG4gICAgdHlwZTogJ2Fzc2V0JyxcbiAgICBmaWxlTmFtZTogJ21hbmlmZXN0Lmpzb24nLFxuICAgIG5hbWU6ICdtYW5pZmVzdCcsXG4gICAgbmVlZHNDb2RlUmVmZXJlbmNlOiBmYWxzZSxcbiAgICBzb3VyY2U6IHN0cixcbiAgfSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBtYW5pZmVzdCBiYXNlZCBvbiB0aGUgY29uZmlnIGFuZCBlbnRyeXBvaW50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTWFpbmZlc3QoXG4gIGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10sXG4gIGJ1aWxkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPixcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8TWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3Q+IHtcbiAgY29uc3QgcGtnID0gYXdhaXQgZ2V0UGFja2FnZUpzb24oY29uZmlnKTtcblxuICBjb25zdCBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QgPSBPYmplY3QuYXNzaWduKFxuICAgIHtcbiAgICAgIG1hbmlmZXN0X3ZlcnNpb246IGNvbmZpZy5tYW5pZmVzdFZlcnNpb24sXG4gICAgICBuYW1lOiBwa2c/Lm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogcGtnPy5kZXNjcmlwdGlvbixcbiAgICAgIHZlcnNpb246IHBrZz8udmVyc2lvbiAmJiBzaW1wbGlmeVZlcnNpb24ocGtnLnZlcnNpb24pLFxuICAgICAgLy8gT25seSBhZGQgdGhlIHZlcnNpb24gbmFtZSB0byBjaHJvbWl1bSBhbmQgaWYgdGhlIHVzZXIgaGFzbid0IHNwZWNpZmllZCBhIGN1c3RvbSB2ZXJzaW9uLlxuICAgICAgdmVyc2lvbl9uYW1lOlxuICAgICAgICBjb25maWcuYnJvd3NlciAhPT0gJ2ZpcmVmb3gnICYmICFjb25maWcubWFuaWZlc3QudmVyc2lvblxuICAgICAgICAgID8gcGtnPy52ZXJzaW9uXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBzaG9ydF9uYW1lOiBwa2c/LnNob3J0TmFtZSxcbiAgICB9LFxuICAgIGNvbmZpZy5tYW5pZmVzdCxcbiAgKTtcblxuICBhZGRFbnRyeXBvaW50cyhtYW5pZmVzdCwgZW50cnlwb2ludHMsIGJ1aWxkT3V0cHV0LCBjb25maWcpO1xuXG4gIGlmIChjb25maWcuY29tbWFuZCA9PT0gJ3NlcnZlJykgYWRkRGV2TW9kZUNzcChtYW5pZmVzdCwgY29uZmlnKTtcbiAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnKSBhZGREZXZNb2RlUGVybWlzc2lvbnMobWFuaWZlc3QsIGNvbmZpZyk7XG5cbiAgLy8gVE9ETzogdHJhbnNmb3JtIG1hbmlmZXN0IGhlcmUuXG5cbiAgaWYgKG1hbmlmZXN0Lm5hbWUgPT0gbnVsbClcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIFwiTWFuaWZlc3QgJ25hbWUnIGlzIG1pc3NpbmcuIEVpdGhlcjpcXG4xLiBTZXQgdGhlIG5hbWUgaW4geW91ciA8cm9vdD4vcGFja2FnZS5qc29uXFxuMi4gU2V0IGEgbmFtZSB2aWEgdGhlIG1hbmlmZXN0IG9wdGlvbiBpbiB5b3VyIHd4dC5jb25maWcudHNcIixcbiAgICApO1xuICBpZiAobWFuaWZlc3QudmVyc2lvbiA9PSBudWxsKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBcIk1hbmlmZXN0ICd2ZXJzaW9uJyBpcyBtaXNzaW5nLiBFaXRoZXI6XFxuMS4gQWRkIGEgdmVyc2lvbiBpbiB5b3VyIDxyb290Pi9wYWNrYWdlLmpzb25cXG4yLiBQYXNzIHRoZSB2ZXJzaW9uIHZpYSB0aGUgbWFuaWZlc3Qgb3B0aW9uIGluIHlvdXIgd3h0LmNvbmZpZy50c1wiLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbWFuaWZlc3Q7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBzdWZmaXhlcyBmcm9tIHRoZSB2ZXJzaW9uLCBsaWtlIFguWS5aLWFscGhhMSAod2hpY2ggYnJvc2VycyBkb24ndCBhbGxvdyksIHNvIGl0J3MgYVxuICogc2ltcGxlIHZlcnNpb24gbnVtYmVyLCBsaWtlIFggb3IgWC5ZIG9yIFguWS5aLCB3aGljaCBicm93c2VycyBhbGxvdy5cbiAqL1xuZnVuY3Rpb24gc2ltcGxpZnlWZXJzaW9uKHZlcnNpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZWdleCBhZGFwdGVkIGZyb20gaGVyZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Nb3ppbGxhL0FkZC1vbnMvV2ViRXh0ZW5zaW9ucy9tYW5pZmVzdC5qc29uL3ZlcnNpb24jdmVyc2lvbl9mb3JtYXRcbiAgY29uc3QgdmVyc2lvbiA9IC9eKCgwfFsxLTldWzAtOV17MCw4fSkoWy5dKDB8WzEtOV1bMC05XXswLDh9KSl7MCwzfSkuKiQvLmV4ZWMoXG4gICAgdmVyc2lvbk5hbWUsXG4gICk/LlsxXTtcblxuICBpZiAodmVyc2lvbiA9PSBudWxsKVxuICAgIHRocm93IEVycm9yKFxuICAgICAgYENhbm5vdCBzaW1wbGlmeSBwYWNrYWdlLmpzb24gdmVyc2lvbiBcIiR7dmVyc2lvbk5hbWV9XCIgdG8gYSB2YWxpZCBleHRlbnNpb24gdmVyc2lvbiwgXCJYLlkuWlwiYCxcbiAgICApO1xuXG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5mdW5jdGlvbiBhZGRFbnRyeXBvaW50cyhcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBlbnRyeXBvaW50czogRW50cnlwb2ludFtdLFxuICBidWlsZE91dHB1dDogT21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiB2b2lkIHtcbiAgY29uc3QgZW50cmllc0J5VHlwZSA9IGVudHJ5cG9pbnRzLnJlZHVjZTxcbiAgICBQYXJ0aWFsPFJlY29yZDxFbnRyeXBvaW50Wyd0eXBlJ10sIEVudHJ5cG9pbnRbXT4+XG4gID4oKG1hcCwgZW50cnlwb2ludCkgPT4ge1xuICAgIG1hcFtlbnRyeXBvaW50LnR5cGVdID8/PSBbXTtcbiAgICBtYXBbZW50cnlwb2ludC50eXBlXT8ucHVzaChlbnRyeXBvaW50KTtcbiAgICByZXR1cm4gbWFwO1xuICB9LCB7fSk7XG5cbiAgY29uc3QgYmFja2dyb3VuZCA9IGVudHJpZXNCeVR5cGVbJ2JhY2tncm91bmQnXT8uWzBdIGFzXG4gICAgfCBCYWNrZ3JvdW5kRW50cnlwb2ludFxuICAgIHwgdW5kZWZpbmVkO1xuICBjb25zdCBib29rbWFya3MgPSBlbnRyaWVzQnlUeXBlWydib29rbWFya3MnXT8uWzBdO1xuICBjb25zdCBjb250ZW50U2NyaXB0cyA9IGVudHJpZXNCeVR5cGVbJ2NvbnRlbnQtc2NyaXB0J10gYXNcbiAgICB8IENvbnRlbnRTY3JpcHRFbnRyeXBvaW50W11cbiAgICB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZGV2dG9vbHMgPSBlbnRyaWVzQnlUeXBlWydkZXZ0b29scyddPy5bMF07XG4gIGNvbnN0IGhpc3RvcnkgPSBlbnRyaWVzQnlUeXBlWydoaXN0b3J5J10/LlswXTtcbiAgY29uc3QgbmV3dGFiID0gZW50cmllc0J5VHlwZVsnbmV3dGFiJ10/LlswXTtcbiAgY29uc3Qgb3B0aW9ucyA9IGVudHJpZXNCeVR5cGVbJ29wdGlvbnMnXT8uWzBdIGFzXG4gICAgfCBPcHRpb25zRW50cnlwb2ludFxuICAgIHwgdW5kZWZpbmVkO1xuICBjb25zdCBwb3B1cCA9IGVudHJpZXNCeVR5cGVbJ3BvcHVwJ10/LlswXSBhcyBQb3B1cEVudHJ5cG9pbnQgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHNhbmRib3hlcyA9IGVudHJpZXNCeVR5cGVbJ3NhbmRib3gnXTtcbiAgY29uc3Qgc2lkZXBhbmVscyA9IGVudHJpZXNCeVR5cGVbJ3NpZGVwYW5lbCddO1xuXG4gIGlmIChiYWNrZ3JvdW5kKSB7XG4gICAgY29uc3Qgc2NyaXB0ID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoYmFja2dyb3VuZCwgY29uZmlnLm91dERpciwgJy5qcycpO1xuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdF92ZXJzaW9uID09PSAzKSB7XG4gICAgICBtYW5pZmVzdC5iYWNrZ3JvdW5kID0ge1xuICAgICAgICB0eXBlOiBiYWNrZ3JvdW5kLm9wdGlvbnMudHlwZSxcbiAgICAgICAgc2VydmljZV93b3JrZXI6IHNjcmlwdCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0LmJhY2tncm91bmQgPSB7XG4gICAgICAgIHBlcnNpc3RlbnQ6IGJhY2tncm91bmQub3B0aW9ucy5wZXJzaXN0ZW50LFxuICAgICAgICBzY3JpcHRzOiBbc2NyaXB0XSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKGJvb2ttYXJrcykge1xuICAgIGlmIChjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgICdCb29rbWFya3MgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgRmlyZWZveC4gY2hyb21lX3VybF9vdmVycmlkZXMuYm9va21hcmtzIHdhcyBub3QgYWRkZWQgdG8gdGhlIG1hbmlmZXN0JyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzID8/PSB7fTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGJvb2ttYXJrcyBpcyB1bnR5cGVkIGluIHdlYmV4dGVuc2lvbi1wb2x5ZmlsbCwgYnV0IHN1cHBvcnRlZCBieSBjaHJvbWVcbiAgICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzLmJvb2ttYXJrcyA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgICBib29rbWFya3MsXG4gICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICcuaHRtbCcsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoaXN0b3J5KSB7XG4gICAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgJ0Jvb2ttYXJrcyBhcmUgbm90IHN1cHBvcnRlZCBieSBGaXJlZm94LiBjaHJvbWVfdXJsX292ZXJyaWRlcy5oaXN0b3J5IHdhcyBub3QgYWRkZWQgdG8gdGhlIG1hbmlmZXN0JyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hbmlmZXN0LmNocm9tZV91cmxfb3ZlcnJpZGVzID8/PSB7fTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGhpc3RvcnkgaXMgdW50eXBlZCBpbiB3ZWJleHRlbnNpb24tcG9seWZpbGwsIGJ1dCBzdXBwb3J0ZWQgYnkgY2hyb21lXG4gICAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcy5oaXN0b3J5ID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICAgIGhpc3RvcnksXG4gICAgICAgIGNvbmZpZy5vdXREaXIsXG4gICAgICAgICcuaHRtbCcsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChuZXd0YWIpIHtcbiAgICBtYW5pZmVzdC5jaHJvbWVfdXJsX292ZXJyaWRlcyA/Pz0ge307XG4gICAgbWFuaWZlc3QuY2hyb21lX3VybF9vdmVycmlkZXMubmV3dGFiID0gZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoXG4gICAgICBuZXd0YWIsXG4gICAgICBjb25maWcub3V0RGlyLFxuICAgICAgJy5odG1sJyxcbiAgICApO1xuICB9XG5cbiAgaWYgKHBvcHVwKSB7XG4gICAgY29uc3QgZGVmYXVsdF9wb3B1cCA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKFxuICAgICAgcG9wdXAsXG4gICAgICBjb25maWcub3V0RGlyLFxuICAgICAgJy5odG1sJyxcbiAgICApO1xuICAgIGNvbnN0IG9wdGlvbnM6IE1hbmlmZXN0LkFjdGlvbk1hbmlmZXN0ID0ge1xuICAgICAgZGVmYXVsdF9pY29uOiBwb3B1cC5vcHRpb25zLmRlZmF1bHRJY29uLFxuICAgICAgZGVmYXVsdF90aXRsZTogcG9wdXAub3B0aW9ucy5kZWZhdWx0VGl0bGUsXG4gICAgfTtcbiAgICBpZiAobWFuaWZlc3QubWFuaWZlc3RfdmVyc2lvbiA9PT0gMykge1xuICAgICAgbWFuaWZlc3QuYWN0aW9uID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkZWZhdWx0X3BvcHVwLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuaWZlc3RbcG9wdXAub3B0aW9ucy5tdjJLZXkgPz8gJ2Jyb3dzZXJfYWN0aW9uJ10gPSB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGRlZmF1bHRfcG9wdXAsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZXZ0b29scykge1xuICAgIG1hbmlmZXN0LmRldnRvb2xzX3BhZ2UgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgIGRldnRvb2xzLFxuICAgICAgY29uZmlnLm91dERpcixcbiAgICAgICcuaHRtbCcsXG4gICAgKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgY29uc3QgcGFnZSA9IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoKG9wdGlvbnMsIGNvbmZpZy5vdXREaXIsICcuaHRtbCcpO1xuICAgIG1hbmlmZXN0Lm9wdGlvbnNfdWkgPSB7XG4gICAgICBvcGVuX2luX3RhYjogb3B0aW9ucy5vcHRpb25zLm9wZW5JblRhYixcbiAgICAgIGJyb3dzZXJfc3R5bGU6XG4gICAgICAgIGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcgPyBvcHRpb25zLm9wdGlvbnMuYnJvd3NlclN0eWxlIDogdW5kZWZpbmVkLFxuICAgICAgY2hyb21lX3N0eWxlOlxuICAgICAgICBjb25maWcuYnJvd3NlciAhPT0gJ2ZpcmVmb3gnID8gb3B0aW9ucy5vcHRpb25zLmNocm9tZVN0eWxlIDogdW5kZWZpbmVkLFxuICAgICAgcGFnZSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHNhbmRib3hlcz8ubGVuZ3RoKSB7XG4gICAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcpIHtcbiAgICAgIGNvbmZpZy5sb2dnZXIud2FybihcbiAgICAgICAgJ1NhbmRib3hlZCBwYWdlcyBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3guIHNhbmRib3gucGFnZXMgd2FzIG5vdCBhZGRlZCB0byB0aGUgbWFuaWZlc3QnLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogc2FuZGJveCBub3QgdHlwZWRcbiAgICAgIG1hbmlmZXN0LnNhbmRib3ggPSB7XG4gICAgICAgIHBhZ2VzOiBzYW5kYm94ZXMubWFwKChlbnRyeSkgPT5cbiAgICAgICAgICBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChlbnRyeSwgY29uZmlnLm91dERpciwgJy5odG1sJyksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaWRlcGFuZWxzPy5sZW5ndGgpIHtcbiAgICBjb25zdCBkZWZhdWx0U2lkZXBhbmVsID1cbiAgICAgIHNpZGVwYW5lbHMuZmluZCgoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09ICdzaWRlcGFuZWwnKSA/PyBzaWRlcGFuZWxzWzBdO1xuICAgIGNvbnN0IHBhZ2UgPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChcbiAgICAgIGRlZmF1bHRTaWRlcGFuZWwsXG4gICAgICBjb25maWcub3V0RGlyLFxuICAgICAgJy5odG1sJyxcbiAgICApO1xuXG4gICAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcpIHtcbiAgICAgIG1hbmlmZXN0LnNpZGViYXJfYWN0aW9uID0ge1xuICAgICAgICAvLyBUT0RPOiBBZGQgb3B0aW9ucyB0byBzaWRlIHBhbmVsXG4gICAgICAgIC8vIC4uLmRlZmF1bHRTaWRlcGFuZWwub3B0aW9ucyxcbiAgICAgICAgZGVmYXVsdF9wYW5lbDogcGFnZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChjb25maWcubWFuaWZlc3RWZXJzaW9uID09PSAzKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBVbnR5cGVkXG4gICAgICBtYW5pZmVzdC5zaWRlX3BhbmVsID0ge1xuICAgICAgICBkZWZhdWx0X3BhdGg6IHBhZ2UsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcubG9nZ2VyLndhcm4oXG4gICAgICAgICdTaWRlIHBhbmVsIG5vdCBzdXBwb3J0ZWQgYnkgQ2hyb21pdW0gdXNpbmcgTVYyLiBzaWRlX3BhbmVsLmRlZmF1bHRfcGF0aCB3YXMgbm90IGFkZGVkIHRvIHRoZSBtYW5pZmVzdCcsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb250ZW50U2NyaXB0cz8ubGVuZ3RoKSB7XG4gICAgLy8gRG9uJ3QgYWRkIGNvbnRlbnQgc2NyaXB0cyB0byB0aGUgbWFuaWZlc3QgaW4gZGV2IG1vZGUgZm9yIE1WMyAtIHRoZXkncmUgbWFuYWdlZCBhbmQgcmVsb2FkZWRcbiAgICAvLyBhdCBydW50aW1lXG4gICAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnICYmIGNvbmZpZy5tYW5pZmVzdFZlcnNpb24gPT09IDMpIHtcbiAgICAgIGNvbnN0IGhvc3RQZXJtaXNzaW9ucyA9IG5ldyBTZXQ8c3RyaW5nPihtYW5pZmVzdC5ob3N0X3Blcm1pc3Npb25zID8/IFtdKTtcbiAgICAgIGNvbnRlbnRTY3JpcHRzLmZvckVhY2goKHNjcmlwdCkgPT4ge1xuICAgICAgICBzY3JpcHQub3B0aW9ucy5tYXRjaGVzLmZvckVhY2goKG1hdGNoUGF0dGVybikgPT4ge1xuICAgICAgICAgIGhvc3RQZXJtaXNzaW9ucy5hZGQobWF0Y2hQYXR0ZXJuKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGhvc3RQZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PlxuICAgICAgICBhZGRIb3N0UGVybWlzc2lvbihtYW5pZmVzdCwgcGVybWlzc2lvbiksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBoYXNoVG9FbnRyeXBvaW50c01hcCA9IGNvbnRlbnRTY3JpcHRzLnJlZHVjZSgobWFwLCBzY3JpcHQpID0+IHtcbiAgICAgICAgY29uc3QgaGFzaCA9IGhhc2hDb250ZW50U2NyaXB0T3B0aW9ucyhzY3JpcHQub3B0aW9ucyk7XG4gICAgICAgIGlmIChtYXAuaGFzKGhhc2gpKSBtYXAuZ2V0KGhhc2gpPy5wdXNoKHNjcmlwdCk7XG4gICAgICAgIGVsc2UgbWFwLnNldChoYXNoLCBbc2NyaXB0XSk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgICB9LCBuZXcgTWFwPHN0cmluZywgQ29udGVudFNjcmlwdEVudHJ5cG9pbnRbXT4oKSk7XG5cbiAgICAgIG1hbmlmZXN0LmNvbnRlbnRfc2NyaXB0cyA9IEFycmF5LmZyb20oaGFzaFRvRW50cnlwb2ludHNNYXAuZW50cmllcygpKS5tYXAoXG4gICAgICAgIChbLCBzY3JpcHRzXSkgPT4gKHtcbiAgICAgICAgICAuLi5tYXBXeHRPcHRpb25zVG9Db250ZW50U2NyaXB0KHNjcmlwdHNbMF0ub3B0aW9ucyksXG4gICAgICAgICAgLy8gVE9PRDogU29ydGluZyBjc3MgYW5kIGpzIGFycmF5cyBoZXJlIHNvIHdlIGdldCBjb25zaXN0ZW50IHRlc3QgcmVzdWx0cy4uLiBidXQgd2VcbiAgICAgICAgICAvLyBzaG91bGRuJ3QgaGF2ZSB0by4gV2hlcmUgaXMgdGhlIGluY29uc2lzdGVuY3kgY29taW5nIGZyb20/XG4gICAgICAgICAgY3NzOiBnZXRDb250ZW50U2NyaXB0Q3NzRmlsZXMoc2NyaXB0cywgYnVpbGRPdXRwdXQpPy5zb3J0KCksXG4gICAgICAgICAganM6IHNjcmlwdHNcbiAgICAgICAgICAgIC5tYXAoKGVudHJ5KSA9PlxuICAgICAgICAgICAgICBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChlbnRyeSwgY29uZmlnLm91dERpciwgJy5qcycpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnNvcnQoKSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGREZXZNb2RlQ3NwKFxuICBtYW5pZmVzdDogTWFuaWZlc3QuV2ViRXh0ZW5zaW9uTWFuaWZlc3QsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiB2b2lkIHtcbiAgY29uc3QgcGVybWlzc2lvbiA9IGBodHRwOi8vJHtjb25maWcuc2VydmVyPy5ob3N0bmFtZSA/PyAnJ30vKmA7XG4gIGNvbnN0IGFsbG93ZWRDc3AgPSBjb25maWcuc2VydmVyPy5vcmlnaW4gPz8gJ2h0dHA6Ly9sb2NhbGhvc3Q6Kic7XG5cbiAgaWYgKG1hbmlmZXN0Lm1hbmlmZXN0X3ZlcnNpb24gPT09IDMpIHtcbiAgICBhZGRIb3N0UGVybWlzc2lvbihtYW5pZmVzdCwgcGVybWlzc2lvbik7XG4gIH0gZWxzZSB7XG4gICAgYWRkUGVybWlzc2lvbihtYW5pZmVzdCwgcGVybWlzc2lvbik7XG4gIH1cblxuICBjb25zdCBjc3AgPSBuZXcgQ29udGVudFNlY3VyaXR5UG9saWN5KFxuICAgIG1hbmlmZXN0Lm1hbmlmZXN0X3ZlcnNpb24gPT09IDNcbiAgICAgID8gLy8gQHRzLWV4cGVjdC1lcnJvcjogZXh0ZW5zaW9uX3BhZ2VzIGlzIG5vdCB0eXBlZFxuICAgICAgICBtYW5pZmVzdC5jb250ZW50X3NlY3VyaXR5X3BvbGljeT8uZXh0ZW5zaW9uX3BhZ2VzID8/XG4gICAgICAgIFwic2NyaXB0LXNyYyAnc2VsZicgJ3dhc20tdW5zYWZlLWV2YWwnOyBvYmplY3Qtc3JjICdzZWxmJztcIiAvLyBkZWZhdWx0IENTUCBmb3IgTVYzXG4gICAgICA6IG1hbmlmZXN0LmNvbnRlbnRfc2VjdXJpdHlfcG9saWN5ID8/XG4gICAgICAgIFwic2NyaXB0LXNyYyAnc2VsZic7IG9iamVjdC1zcmMgJ3NlbGYnO1wiLCAvLyBkZWZhdWx0IENTUCBmb3IgTVYyXG4gICk7XG5cbiAgaWYgKGNvbmZpZy5zZXJ2ZXIpIGNzcC5hZGQoJ3NjcmlwdC1zcmMnLCBhbGxvd2VkQ3NwKTtcblxuICBpZiAobWFuaWZlc3QubWFuaWZlc3RfdmVyc2lvbiA9PT0gMykge1xuICAgIG1hbmlmZXN0LmNvbnRlbnRfc2VjdXJpdHlfcG9saWN5ID8/PSB7fTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBleHRlbnNpb25fcGFnZXMgaXMgbm90IHR5cGVkXG4gICAgbWFuaWZlc3QuY29udGVudF9zZWN1cml0eV9wb2xpY3kuZXh0ZW5zaW9uX3BhZ2VzID0gY3NwLnRvU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgbWFuaWZlc3QuY29udGVudF9zZWN1cml0eV9wb2xpY3kgPSBjc3AudG9TdHJpbmcoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGREZXZNb2RlUGVybWlzc2lvbnMoXG4gIG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbikge1xuICAvLyBGb3IgcmVsb2FkaW5nIHRoZSBwYWdlXG4gIGFkZFBlcm1pc3Npb24obWFuaWZlc3QsICd0YWJzJyk7XG5cbiAgLy8gRm9yIHJlZ2lzdGVyaW5nIGNvbnRlbnQgc2NyaXB0c1xuICBpZiAoY29uZmlnLm1hbmlmZXN0VmVyc2lvbiA9PT0gMykgYWRkUGVybWlzc2lvbihtYW5pZmVzdCwgJ3NjcmlwdGluZycpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGJ1bmRsZSBwYXRocyB0byBDU1MgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGEgbGlzdCBvZiBjb250ZW50IHNjcmlwdHMsIG9yIHVuZGVmaW5lZCBpZlxuICogdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCBDU1MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250ZW50U2NyaXB0Q3NzRmlsZXMoXG4gIGNvbnRlbnRTY3JpcHRzOiBDb250ZW50U2NyaXB0RW50cnlwb2ludFtdLFxuICBidWlsZE91dHB1dDogT21pdDxCdWlsZE91dHB1dCwgJ21hbmlmZXN0Jz4sXG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNzczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCBhbGxDaHVua3MgPSBidWlsZE91dHB1dC5zdGVwcy5mbGF0TWFwKChzdGVwKSA9PiBzdGVwLmNodW5rcyk7XG5cbiAgY29udGVudFNjcmlwdHMuZm9yRWFjaCgoc2NyaXB0KSA9PiB7XG4gICAgLy8gVE9ETzogb3B0aW1pemUgYW5kIHJlbW92ZSBsb29wIHdpdGggYSBtYXBcbiAgICBjb25zdCByZWxhdGVkQ3NzID0gYWxsQ2h1bmtzLmZpbmQoXG4gICAgICAoY2h1bmspID0+IGNodW5rLmZpbGVOYW1lID09PSBgYXNzZXRzLyR7c2NyaXB0Lm5hbWV9LmNzc2AsXG4gICAgKTtcbiAgICBpZiAocmVsYXRlZENzcykgY3NzLnB1c2gocmVsYXRlZENzcy5maWxlTmFtZSk7XG4gIH0pO1xuXG4gIGlmIChjc3MubGVuZ3RoID4gMCkgcmV0dXJuIGNzcztcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYWRkUGVybWlzc2lvbihcbiAgbWFuaWZlc3Q6IE1hbmlmZXN0LldlYkV4dGVuc2lvbk1hbmlmZXN0LFxuICBwZXJtaXNzaW9uOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgbWFuaWZlc3QucGVybWlzc2lvbnMgPz89IFtdO1xuICBpZiAobWFuaWZlc3QucGVybWlzc2lvbnMuaW5jbHVkZXMocGVybWlzc2lvbikpIHJldHVybjtcbiAgbWFuaWZlc3QucGVybWlzc2lvbnMucHVzaChwZXJtaXNzaW9uKTtcbn1cblxuZnVuY3Rpb24gYWRkSG9zdFBlcm1pc3Npb24oXG4gIG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCxcbiAgaG9zdFBlcm1pc3Npb246IHN0cmluZyxcbik6IHZvaWQge1xuICBtYW5pZmVzdC5ob3N0X3Blcm1pc3Npb25zID8/PSBbXTtcbiAgaWYgKG1hbmlmZXN0Lmhvc3RfcGVybWlzc2lvbnMuaW5jbHVkZXMoaG9zdFBlcm1pc3Npb24pKSByZXR1cm47XG4gIG1hbmlmZXN0Lmhvc3RfcGVybWlzc2lvbnMucHVzaChob3N0UGVybWlzc2lvbik7XG59XG4iLCAiLyoqXG4gKiBEaXJlY3RpdmUgbmFtZXMgdGhhdCBtYWtlIHVwIENTUHMuIFRoZXJlIGFyZSBtb3JlLCB0aGlzIGlzIGFsbCBJIG5lZWQgZm9yIHRoZSBwbHVnaW4uXG4gKi9cbmV4cG9ydCB0eXBlIENzcERpcmVjdGl2ZSA9ICdkZWZhdWx0LXNyYycgfCAnc2NyaXB0LXNyYycgfCAnb2JqZWN0LXNyYyc7XG5cbmV4cG9ydCBjbGFzcyBDb250ZW50U2VjdXJpdHlQb2xpY3kge1xuICBwcml2YXRlIHN0YXRpYyBESVJFQ1RJVkVfT1JERVI6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHVuZGVmaW5lZD4gPSB7XG4gICAgJ2RlZmF1bHQtc3JjJzogMCxcbiAgICAnc2NyaXB0LXNyYyc6IDEsXG4gICAgJ29iamVjdC1zcmMnOiAyLFxuICB9O1xuXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcblxuICBjb25zdHJ1Y3Rvcihjc3A/OiBzdHJpbmcpIHtcbiAgICBpZiAoY3NwKSB7XG4gICAgICBjb25zdCBzZWN0aW9ucyA9IGNzcC5zcGxpdCgnOycpLm1hcCgoc2VjdGlvbikgPT4gc2VjdGlvbi50cmltKCkpO1xuICAgICAgdGhpcy5kYXRhID0gc2VjdGlvbnMucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPj4oKGRhdGEsIHNlY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3QgW2tleSwgLi4udmFsdWVzXSA9IHNlY3Rpb24uc3BsaXQoJyAnKS5tYXAoKGl0ZW0pID0+IGl0ZW0udHJpbSgpKTtcbiAgICAgICAgaWYgKGtleSkgZGF0YVtrZXldID0gdmFsdWVzO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0sIHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID0ge307XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhIHNldCBvZiB2YWx1ZXMgYXJlIGxpc3RlZCB1bmRlciBhIGRpcmVjdGl2ZS5cbiAgICovXG4gIGFkZChkaXJlY3RpdmU6IENzcERpcmVjdGl2ZSwgLi4ubmV3VmFsdWVzOiBzdHJpbmdbXSk6IENvbnRlbnRTZWN1cml0eVBvbGljeSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5kYXRhW2RpcmVjdGl2ZV0gPz8gW107XG4gICAgbmV3VmFsdWVzLmZvckVhY2goKG5ld1ZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlcy5pbmNsdWRlcyhuZXdWYWx1ZSkpIHZhbHVlcy5wdXNoKG5ld1ZhbHVlKTtcbiAgICB9KTtcbiAgICB0aGlzLmRhdGFbZGlyZWN0aXZlXSA9IHZhbHVlcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyZWN0aXZlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuZGF0YSkuc29ydCgoW2xdLCBbcl0pID0+IHtcbiAgICAgIGNvbnN0IGxvID0gQ29udGVudFNlY3VyaXR5UG9saWN5LkRJUkVDVElWRV9PUkRFUltsXSA/PyAyO1xuICAgICAgY29uc3Qgcm8gPSBDb250ZW50U2VjdXJpdHlQb2xpY3kuRElSRUNUSVZFX09SREVSW3JdID8/IDI7XG4gICAgICByZXR1cm4gbG8gLSBybztcbiAgICB9KTtcbiAgICByZXR1cm4gZGlyZWN0aXZlcy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5mbGF0KCkuam9pbignICcpKS5qb2luKCc7ICcpICsgJzsnO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTWFuaWZlc3QgfSBmcm9tICd3ZWJleHRlbnNpb24tcG9seWZpbGwnO1xuaW1wb3J0IHsgQ29udGVudFNjcmlwdEVudHJ5cG9pbnQgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogUmV0dXJucyBhIHVuaXF1ZSBhbmQgY29uc2lzdGVudCBzdHJpbmcgaGFzaCBiYXNlZCBvbiBhIGNvbnRlbnQgc2NyaXB0cyBvcHRpb25zLlxuICpcbiAqIEl0IGlzIGFibGUgdG8gcmVjb2duaXplIGRlZmF1bHQgdmFsdWVzLFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaENvbnRlbnRTY3JpcHRPcHRpb25zKFxuICBvcHRpb25zOiBDb250ZW50U2NyaXB0RW50cnlwb2ludFsnb3B0aW9ucyddLFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgd2l0aERlZmF1bHRzOiBDb250ZW50U2NyaXB0RW50cnlwb2ludFsnb3B0aW9ucyddID0ge1xuICAgIGV4Y2x1ZGVHbG9iczogW10sXG4gICAgZXhjbHVkZU1hdGNoZXM6IFtdLFxuICAgIGluY2x1ZGVHbG9iczogW10sXG4gICAgbWF0Y2hBYm91dEJsYW5rOiBmYWxzZSxcbiAgICBtYXRjaE9yaWdpbkFzRmFsbGJhY2s6IGZhbHNlLFxuICAgIHJ1bkF0OiAnZG9jdW1lbnRfaWRsZScsXG4gICAgYWxsRnJhbWVzOiBmYWxzZSxcbiAgICB3b3JsZDogJ0lTT0xBVEVEJyxcbiAgICAvLyBUT0RPOiBzdHJpcCB1bmRlZmluZWQgZmllbGRzIGZyb20gb3B0aW9ucyBvYmplY3QgdG8gaW1wcm92ZSBjb250ZW50IHNjcmlwdCBncm91cGluZy5cbiAgICAuLi5vcHRpb25zLFxuICB9O1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMod2l0aERlZmF1bHRzKVxuICAgICAgLy8gU29ydCBhbnkgYXJyYXlzIHNvIHRoZWlyIHZhbHVlcyBhcmUgY29uc2lzdGVudFxuICAgICAgLm1hcDxbc3RyaW5nLCB1bmtub3duXT4oKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBba2V5LCB2YWx1ZS5zb3J0KCldO1xuICAgICAgICBlbHNlIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgICB9KVxuICAgICAgLy8gU29ydCBhbGwgdGhlIGZpZWxkcyBhbHBoYWJldGljYWxseVxuICAgICAgLnNvcnQoKGwsIHIpID0+IGxbMF0ubG9jYWxlQ29tcGFyZShyWzBdKSksXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBXeHRPcHRpb25zVG9Db250ZW50U2NyaXB0KFxuICBvcHRpb25zOiBDb250ZW50U2NyaXB0RW50cnlwb2ludFsnb3B0aW9ucyddLFxuKTogT21pdDxNYW5pZmVzdC5Db250ZW50U2NyaXB0LCAnanMnIHwgJ2Nzcyc+IHtcbiAgcmV0dXJuIHtcbiAgICBtYXRjaGVzOiBvcHRpb25zLm1hdGNoZXMsXG4gICAgYWxsX2ZyYW1lczogb3B0aW9ucy5hbGxGcmFtZXMsXG4gICAgbWF0Y2hfYWJvdXRfYmxhbms6IG9wdGlvbnMubWF0Y2hBYm91dEJsYW5rLFxuICAgIGV4Y2x1ZGVfZ2xvYnM6IG9wdGlvbnMuZXhjbHVkZUdsb2JzLFxuICAgIGV4Y2x1ZGVfbWF0Y2hlczogb3B0aW9ucy5leGNsdWRlTWF0Y2hlcyxcbiAgICBpbmNsdWRlX2dsb2JzOiBvcHRpb25zLmluY2x1ZGVHbG9icyxcbiAgICBydW5fYXQ6IG9wdGlvbnMucnVuQXQsXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiB1bnR5cGVkIGNocm9tZSBvcHRpb25zXG4gICAgbWF0Y2hfb3JpZ2luX2FzX2ZhbGxiYWNrOiBvcHRpb25zLm1hdGNoT3JpZ2luQXNGYWxsYmFjayxcbiAgICB3b3JsZDogb3B0aW9ucy53b3JsZCxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcblxuLyoqXG4gKiBSZWFkIHRoZSBwcm9qZWN0J3MgcGFja2FnZS5qc29uLlxuICpcbiAqIFRPRE86IGxvb2sgaW4gcm9vdCBhbmQgdXAgZGlyZWN0b3JpZXMgdW50aWwgaXQncyBmb3VuZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUpzb24oXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pOiBQcm9taXNlPFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYW55Pj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZmlsZSA9IHJlc29sdmUoY29uZmlnLnJvb3QsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMucmVhZEpzb24oZmlsZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoXG4gICAgICBgRmFpbGVkIHRvIHJlYWQgcGFja2FnZS5qc29uIGF0OiAke2ZpbGV9LiBSZXR1cm5pbmcgdW5kZWZpbmVkLmAsXG4gICAgKTtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBNYW5pZmVzdCB9IGZyb20gJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCc7XG5pbXBvcnQgeyBCdWlsZE91dHB1dCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgYnVpbGRFbnRyeXBvaW50cyB9IGZyb20gJy4vYnVpbGQvYnVpbGRFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBmaW5kRW50cnlwb2ludHMgfSBmcm9tICcuL2J1aWxkL2ZpbmRFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVR5cGVzRGlyIH0gZnJvbSAnLi9idWlsZC9nZW5lcmF0ZVR5cGVzRGlyJztcbmltcG9ydCB7IEludGVybmFsQ29uZmlnLCBFbnRyeXBvaW50R3JvdXAgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdlbmVyYXRlTWFpbmZlc3QsIHdyaXRlTWFuaWZlc3QgfSBmcm9tICcuL3V0aWxzL21hbmlmZXN0JztcbmltcG9ydCBwYyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCAqIGFzIHZpdGUgZnJvbSAndml0ZSc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgZ3JvdXBFbnRyeXBvaW50cyB9IGZyb20gJy4vdXRpbHMvZ3JvdXBFbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiB9IGZyb20gJy4vdXRpbHMvZm9ybWF0RHVyYXRpb24nO1xuaW1wb3J0IHsgcHJpbnRCdWlsZFN1bW1hcnkgfSBmcm9tICcuL2xvZy9wcmludEJ1aWxkU3VtbWFyeSc7XG5cbi8qKlxuICogQnVpbGRzIHRoZSBleHRlbnNpb24gYmFzZWQgb24gYW4gaW50ZXJuYWwgY29uZmlnLlxuICpcbiAqIFRoaXMgZnVuY3Rpb246XG4gKiAxLiBDbGVhbnMgdGhlIG91dHB1dCBkaXJlY3RvcnlcbiAqIDIuIEV4ZWN1dGVzIHRoZSByZWJ1aWxkIGZ1bmN0aW9uIHdpdGggYSBibGFuayBwcmV2aW91cyBvdXRwdXQgc28gZXZlcnl0aGluZyBpcyBidWlsdCAoc2VlXG4gKiAgICBgcmVidWlsZGAgZm9yIG1vcmUgZGV0YWlscylcbiAqIDMuIFByaW50cyB0aGUgc3VtbWFyeVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJbnRlcm5hbChcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8QnVpbGRPdXRwdXQ+IHtcbiAgY29uc3QgdmVyYiA9IGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnID8gJ1ByZS1yZW5kZXJpbmcnIDogJ0J1aWxkaW5nJztcbiAgY29uc3QgdGFyZ2V0ID0gYCR7Y29uZmlnLmJyb3dzZXJ9LW12JHtjb25maWcubWFuaWZlc3RWZXJzaW9ufWA7XG4gIGNvbmZpZy5sb2dnZXIuaW5mbyhcbiAgICBgJHt2ZXJifSAke3BjLmN5YW4odGFyZ2V0KX0gZm9yICR7cGMuY3lhbihjb25maWcubW9kZSl9IHdpdGggJHtwYy5ncmVlbihcbiAgICAgIGBWaXRlICR7dml0ZS52ZXJzaW9ufWAsXG4gICAgKX1gLFxuICApO1xuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gIC8vIENsZWFudXBcbiAgYXdhaXQgZnMucm0oY29uZmlnLm91dERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5lbnN1cmVEaXIoY29uZmlnLm91dERpcik7XG5cbiAgY29uc3QgZW50cnlwb2ludHMgPSBhd2FpdCBmaW5kRW50cnlwb2ludHMoY29uZmlnKTtcbiAgY29uc3QgZ3JvdXBzID0gZ3JvdXBFbnRyeXBvaW50cyhlbnRyeXBvaW50cyk7XG4gIGNvbnN0IHsgb3V0cHV0IH0gPSBhd2FpdCByZWJ1aWxkKGNvbmZpZywgZ3JvdXBzLCB1bmRlZmluZWQpO1xuXG4gIC8vIFBvc3QtYnVpbGRcbiAgY29uZmlnLmxvZ2dlci5zdWNjZXNzKFxuICAgIGBCdWlsdCBleHRlbnNpb24gaW4gJHtmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKX1gLFxuICApO1xuICBhd2FpdCBwcmludEJ1aWxkU3VtbWFyeShvdXRwdXQsIGNvbmZpZyk7XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGNvbmZpZ3VyYXRpb24sIGxpc3Qgb2YgZW50cnlwb2ludHMsIGFuZCBhbiBleGlzdGluZywgcGFydGlhbCBvdXRwdXQsIGJ1aWxkIHRoZVxuICogZW50cnlwb2ludHMgYW5kIG1lcmdlIHRoZSBuZXcgb3V0cHV0IHdpdGggdGhlIGV4aXN0aW5nIG91dHB1dC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGw6XG4gKiAxLiBHZW5lcmF0ZSB0aGUgLnd4dCBkaXJlY3RvcnkncyB0eXBlc1xuICogMi4gQnVpbGQgdGhlIGBlbnRyeXBvaW50R3JvdXBzYCAoYW5kIGNvcGllcyBwdWJsaWMgZmlsZXMpXG4gKiAzLiBHZW5lcmF0ZSB0aGUgbGF0ZXN0IG1hbmlmZXN0IGZvciBhbGwgZW50cnlwb2ludHNcbiAqIDQuIFdyaXRlIHRoZSBuZXcgbWFuaWZlc3QgdG8gdGhlIGZpbGUgc3lzdGVtXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWJ1aWxkKFxuICBjb25maWc6IEludGVybmFsQ29uZmlnLFxuICBlbnRyeXBvaW50R3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXSxcbiAgZXhpc3RpbmdPdXRwdXQ6IE9taXQ8QnVpbGRPdXRwdXQsICdtYW5pZmVzdCc+ID0ge1xuICAgIHN0ZXBzOiBbXSxcbiAgICBwdWJsaWNBc3NldHM6IFtdLFxuICB9LFxuKTogUHJvbWlzZTx7IG91dHB1dDogQnVpbGRPdXRwdXQ7IG1hbmlmZXN0OiBNYW5pZmVzdC5XZWJFeHRlbnNpb25NYW5pZmVzdCB9PiB7XG4gIC8vIFVwZGF0ZSB0eXBlcyBkaXJlY3Rvcnkgd2l0aCBuZXcgZmlsZXMgYW5kIHR5cGVzXG4gIGNvbnN0IGFsbEVudHJ5cG9pbnRzID0gYXdhaXQgZmluZEVudHJ5cG9pbnRzKGNvbmZpZyk7XG4gIGF3YWl0IGdlbmVyYXRlVHlwZXNEaXIoYWxsRW50cnlwb2ludHMsIGNvbmZpZykuY2F0Y2goKGVycikgPT4ge1xuICAgIGNvbmZpZy5sb2dnZXIud2FybignRmFpbGVkIHRvIHVwZGF0ZSAud3h0IGRpcmVjdG9yeTonLCBlcnIpO1xuICAgIC8vIFRocm93IHRoZSBlcnJvciBpZiBkb2luZyBhIHJlZ3VsYXIgYnVpbGQsIGRvbid0IGZvciBkZXYgbW9kZS5cbiAgICBpZiAoY29uZmlnLmNvbW1hbmQgPT09ICdidWlsZCcpIHRocm93IGVycjtcbiAgfSk7XG5cbiAgLy8gQnVpbGQgYW5kIG1lcmdlIHRoZSBvdXRwdXRzXG4gIGNvbnN0IG5ld091dHB1dCA9IGF3YWl0IGJ1aWxkRW50cnlwb2ludHMoZW50cnlwb2ludEdyb3VwcywgY29uZmlnKTtcbiAgY29uc3QgbWVyZ2VkT3V0cHV0OiBPbWl0PEJ1aWxkT3V0cHV0LCAnbWFuaWZlc3QnPiA9IHtcbiAgICBzdGVwczogWy4uLmV4aXN0aW5nT3V0cHV0LnN0ZXBzLCAuLi5uZXdPdXRwdXQuc3RlcHNdLFxuICAgIHB1YmxpY0Fzc2V0czogWy4uLmV4aXN0aW5nT3V0cHV0LnB1YmxpY0Fzc2V0cywgLi4ubmV3T3V0cHV0LnB1YmxpY0Fzc2V0c10sXG4gIH07XG5cbiAgY29uc3QgbmV3TWFuaWZlc3QgPSBhd2FpdCBnZW5lcmF0ZU1haW5mZXN0KFxuICAgIGFsbEVudHJ5cG9pbnRzLFxuICAgIG1lcmdlZE91dHB1dCxcbiAgICBjb25maWcsXG4gICk7XG4gIGNvbnN0IGZpbmFsT3V0cHV0OiBCdWlsZE91dHB1dCA9IHtcbiAgICBtYW5pZmVzdDogbmV3TWFuaWZlc3QsXG4gICAgLi4ubmV3T3V0cHV0LFxuICB9O1xuXG4gIC8vIFdyaXRlIG1hbmlmZXN0XG4gIGF3YWl0IHdyaXRlTWFuaWZlc3QobmV3TWFuaWZlc3QsIGZpbmFsT3V0cHV0LCBjb25maWcpO1xuXG4gIHJldHVybiB7XG4gICAgb3V0cHV0OiB7XG4gICAgICBtYW5pZmVzdDogbmV3TWFuaWZlc3QsXG4gICAgICBzdGVwczogWy4uLmV4aXN0aW5nT3V0cHV0LnN0ZXBzLCAuLi5maW5hbE91dHB1dC5zdGVwc10sXG4gICAgICBwdWJsaWNBc3NldHM6IFtcbiAgICAgICAgLi4uZXhpc3RpbmdPdXRwdXQucHVibGljQXNzZXRzLFxuICAgICAgICAuLi5maW5hbE91dHB1dC5wdWJsaWNBc3NldHMsXG4gICAgICBdLFxuICAgIH0sXG4gICAgbWFuaWZlc3Q6IG5ld01hbmlmZXN0LFxuICB9O1xufVxuIiwgImltcG9ydCB7IEVudHJ5cG9pbnQgfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBFbnRyeXBvaW50R3JvdXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogRW50cnlwb2ludHMgY2FuIGJlIGJ1aWxkIGluIGdyb3Vwcy4gSFRNTCBwYWdlcyBjYW4gYWxsIGJlIGJ1aWx0IHRvZ2V0aGVyIGluIGEgc2luZ2xlIHN0ZXAsIHdoaWxlXG4gKiBjb250ZW50IHNjcmlwdHMgbXVzdCBiZSBidWlsZCBpbmRpdmlkdWFsbHkuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlbnRyeXBvaW50cyBwdXQgaW50byB0aGVzZSB0eXBlcyBvZiBncm91cHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cEVudHJ5cG9pbnRzKGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50W10pOiBFbnRyeXBvaW50R3JvdXBbXSB7XG4gIGNvbnN0IGdyb3VwSW5kZXhNYXA6IFBhcnRpYWw8UmVjb3JkPEdyb3VwLCBudW1iZXI+PiA9IHt9O1xuICBjb25zdCBncm91cHM6IEVudHJ5cG9pbnRHcm91cFtdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyeXBvaW50cykge1xuICAgIGNvbnN0IGdyb3VwID0gRU5UUllfVFlQRV9UT19HUk9VUF9NQVBbZW50cnkudHlwZV07XG4gICAgaWYgKGdyb3VwID09PSAnbm8tZ3JvdXAnKSB7XG4gICAgICBncm91cHMucHVzaChlbnRyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBncm91cEluZGV4ID0gZ3JvdXBJbmRleE1hcFtncm91cF07XG4gICAgICBpZiAoZ3JvdXBJbmRleCA9PSBudWxsKSB7XG4gICAgICAgIGdyb3VwSW5kZXggPSBncm91cHMucHVzaChbXSkgLSAxO1xuICAgICAgICBncm91cEluZGV4TWFwW2dyb3VwXSA9IGdyb3VwSW5kZXg7XG4gICAgICB9XG4gICAgICAoZ3JvdXBzW2dyb3VwSW5kZXhdIGFzIEVudHJ5cG9pbnRbXSkucHVzaChlbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdyb3Vwcztcbn1cblxuY29uc3QgRU5UUllfVFlQRV9UT19HUk9VUF9NQVA6IFJlY29yZDxFbnRyeXBvaW50Wyd0eXBlJ10sIEdyb3VwPiA9IHtcbiAgc2FuZGJveDogJ3NhbmRib3gtcGFnZScsXG5cbiAgcG9wdXA6ICdleHRlbnNpb24tcGFnZScsXG4gIG5ld3RhYjogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgaGlzdG9yeTogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgb3B0aW9uczogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgZGV2dG9vbHM6ICdleHRlbnNpb24tcGFnZScsXG4gIGJvb2ttYXJrczogJ2V4dGVuc2lvbi1wYWdlJyxcbiAgc2lkZXBhbmVsOiAnZXh0ZW5zaW9uLXBhZ2UnLFxuICAndW5saXN0ZWQtcGFnZSc6ICdleHRlbnNpb24tcGFnZScsXG5cbiAgYmFja2dyb3VuZDogJ25vLWdyb3VwJyxcbiAgJ2NvbnRlbnQtc2NyaXB0JzogJ25vLWdyb3VwJyxcbiAgJ3VubGlzdGVkLXNjcmlwdCc6ICduby1ncm91cCcsXG59O1xuXG50eXBlIEdyb3VwID0gJ2V4dGVuc2lvbi1wYWdlJyB8ICdzYW5kYm94LXBhZ2UnIHwgJ25vLWdyb3VwJztcbiIsICJleHBvcnQgZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24oZHVyYXRpb246IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChkdXJhdGlvbiA8IDFlMykgcmV0dXJuIGAke2R1cmF0aW9ufSBtc2A7XG4gIGlmIChkdXJhdGlvbiA8IDEwZTMpIHJldHVybiBgJHsoZHVyYXRpb24gLyAxZTMpLnRvRml4ZWQoMyl9IHNgO1xuICBpZiAoZHVyYXRpb24gPCA2MGUzKSByZXR1cm4gYCR7KGR1cmF0aW9uIC8gMWUzKS50b0ZpeGVkKDEpfSBzYDtcbiAgcmV0dXJuIGAkeyhkdXJhdGlvbiAvIDFlMykudG9GaXhlZCgwKX0gc2A7XG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQnVpbGRPdXRwdXQsIEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgcHJpbnRGaWxlTGlzdCB9IGZyb20gJy4vcHJpbnRGaWxlTGlzdCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmludEJ1aWxkU3VtbWFyeShcbiAgb3V0cHV0OiBCdWlsZE91dHB1dCxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbikge1xuICBjb25zdCBjaHVua3MgPSBbXG4gICAgLi4ub3V0cHV0LnN0ZXBzLmZsYXRNYXAoKHN0ZXApID0+IHN0ZXAuY2h1bmtzKSxcbiAgICAuLi5vdXRwdXQucHVibGljQXNzZXRzLFxuICBdLnNvcnQoKGwsIHIpID0+IHtcbiAgICBjb25zdCBsV2VpZ2h0ID0gZ2V0Q2h1bmtTb3J0V2VpZ2h0KGwuZmlsZU5hbWUpO1xuICAgIGNvbnN0IHJXZWlnaHQgPSBnZXRDaHVua1NvcnRXZWlnaHQoci5maWxlTmFtZSk7XG4gICAgY29uc3QgZGlmZiA9IGxXZWlnaHQgLSByV2VpZ2h0O1xuICAgIGlmIChkaWZmICE9PSAwKSByZXR1cm4gZGlmZjtcbiAgICByZXR1cm4gbC5maWxlTmFtZS5sb2NhbGVDb21wYXJlKHIuZmlsZU5hbWUpO1xuICB9KTtcblxuICBjb25zdCBmaWxlcyA9IGNodW5rcy5tYXAoKGNodW5rKSA9PiByZXNvbHZlKGNvbmZpZy5vdXREaXIsIGNodW5rLmZpbGVOYW1lKSk7XG4gIGF3YWl0IHByaW50RmlsZUxpc3QoY29uZmlnLmxvZ2dlci5sb2csIGNvbmZpZy5vdXREaXIsIGZpbGVzKTtcbn1cblxuY29uc3QgREVGQVVMVF9TT1JUX1dFSUdIVCA9IDEwMDtcbmNvbnN0IENIVU5LX1NPUlRfV0VJR0hUUzogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgJ21hbmlmZXN0Lmpzb24nOiAwLFxuICAnLmh0bWwnOiAxLFxuICAnLmpzLm1hcCc6IDIsXG4gICcuanMnOiAyLFxuICAnLmNzcyc6IDMsXG59O1xuZnVuY3Rpb24gZ2V0Q2h1bmtTb3J0V2VpZ2h0KGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIChcbiAgICBPYmplY3QuZW50cmllcyhDSFVOS19TT1JUX1dFSUdIVFMpLmZpbmQoKFtrZXldKSA9PlxuICAgICAgZmlsZW5hbWUuZW5kc1dpdGgoa2V5KSxcbiAgICApPy5bMV0gPz8gREVGQVVMVF9TT1JUX1dFSUdIVFxuICApO1xufVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcGMgZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgZmlsZXNpemUgfSBmcm9tICdmaWxlc2l6ZSc7XG5pbXBvcnQgeyBwcmludFRhYmxlIH0gZnJvbSAnLi9wcmludFRhYmxlJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByaW50RmlsZUxpc3QoXG4gIGxvZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZCxcbiAgYmFzZURpcjogc3RyaW5nLFxuICBmaWxlczogc3RyaW5nW10sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IHRvdGFsU2l6ZSA9IDA7XG5cbiAgY29uc3QgZmlsZVJvd3M6IHN0cmluZ1tdW10gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUsIGkpID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgICBwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGJhc2VEaXIpICsgcGF0aC5zZXAsXG4gICAgICAgIHBhdGgucmVsYXRpdmUoYmFzZURpciwgZmlsZSksXG4gICAgICBdO1xuICAgICAgY29uc3QgcHJlZml4ID0gaSA9PT0gZmlsZXMubGVuZ3RoIC0gMSA/ICcgIFx1MjUxNFx1MjUwMCcgOiAnICBcdTI1MUNcdTI1MDAnO1xuICAgICAgY29uc3QgY29sb3IgPSBnZXRDaHVua0NvbG9yKGZpbGUpO1xuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5sc3RhdChmaWxlKTtcbiAgICAgIHRvdGFsU2l6ZSArPSBzdGF0cy5zaXplO1xuICAgICAgY29uc3Qgc2l6ZSA9IFN0cmluZyhmaWxlc2l6ZShzdGF0cy5zaXplKSk7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBgJHtwYy5ncmF5KHByZWZpeCl9ICR7cGMuZGltKHBhcnRzWzBdKX0ke2NvbG9yKHBhcnRzWzFdKX1gLFxuICAgICAgICBwYy5kaW0oc2l6ZSksXG4gICAgICBdO1xuICAgIH0pLFxuICApO1xuXG4gIHByaW50VGFibGUobG9nLCBmaWxlUm93cyk7XG5cbiAgbG9nKGAke3BjLmN5YW4oJ1x1MDNBMyBUb3RhbCBzaXplOicpfSAke1N0cmluZyhmaWxlc2l6ZSh0b3RhbFNpemUpKX1gKTtcbn1cblxuY29uc3QgREVGQVVMVF9DT0xPUiA9IHBjLmJsdWU7XG5jb25zdCBDSFVOS19DT0xPUlM6IFJlY29yZDxzdHJpbmcsICh0ZXh0OiBzdHJpbmcpID0+IHN0cmluZz4gPSB7XG4gICcuanMubWFwJzogcGMuZ3JheSxcbiAgJy5odG1sJzogcGMuZ3JlZW4sXG4gICcuY3NzJzogcGMubWFnZW50YSxcbiAgJy5qcyc6IHBjLmN5YW4sXG4gICcuemlwJzogcGMueWVsbG93LFxufTtcbmZ1bmN0aW9uIGdldENodW5rQ29sb3IoZmlsZW5hbWU6IHN0cmluZykge1xuICByZXR1cm4gKFxuICAgIE9iamVjdC5lbnRyaWVzKENIVU5LX0NPTE9SUykuZmluZCgoW2tleV0pID0+IGZpbGVuYW1lLmVuZHNXaXRoKGtleSkpPy5bMV0gPz9cbiAgICBERUZBVUxUX0NPTE9SXG4gICk7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIHByaW50VGFibGUoXG4gIGxvZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZCxcbiAgcm93czogc3RyaW5nW11bXSxcbiAgZ2FwID0gMixcbik6IHZvaWQge1xuICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBjb2x1bW5XaWR0aHMgPSByb3dzLnJlZHVjZShcbiAgICAod2lkdGhzLCByb3cpID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5tYXgod2lkdGhzLmxlbmd0aCwgcm93Lmxlbmd0aCk7IGkrKykge1xuICAgICAgICB3aWR0aHNbaV0gPSBNYXRoLm1heChyb3dbaV0/Lmxlbmd0aCA/PyAwLCB3aWR0aHNbaV0gPz8gMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2lkdGhzO1xuICAgIH0sXG4gICAgcm93c1swXS5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmxlbmd0aCksXG4gICk7XG5cbiAgbGV0IHN0ciA9ICcnO1xuICByb3dzLmZvckVhY2goKHJvdywgaSkgPT4ge1xuICAgIHJvdy5mb3JFYWNoKChjb2wsIGopID0+IHtcbiAgICAgIHN0ciArPSBjb2wucGFkRW5kKGNvbHVtbldpZHRoc1tqXSwgJyAnKTtcbiAgICAgIGlmIChqICE9PSByb3cubGVuZ3RoIC0gMSkgc3RyICs9ICcnLnBhZEVuZChnYXAsICcgJyk7XG4gICAgfSk7XG4gICAgaWYgKGkgIT09IHJvd3MubGVuZ3RoIC0gMSkgc3RyICs9ICdcXG4nO1xuICB9KTtcblxuICBsb2coc3RyKTtcbn1cbiIsICJpbXBvcnQge1xuICBCdWlsZFN0ZXBPdXRwdXQsXG4gIEVudHJ5cG9pbnRHcm91cCxcbiAgSW50ZXJuYWxDb25maWcsXG4gIFd4dERldlNlcnZlcixcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB2aXRlIGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgU2NyaXB0aW5nIH0gZnJvbSAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJztcbmltcG9ydCB7IGdldEVudHJ5cG9pbnRCdW5kbGVQYXRoIH0gZnJvbSAnLi91dGlscy9lbnRyeXBvaW50cyc7XG5pbXBvcnQgeyBnZXRDb250ZW50U2NyaXB0Q3NzRmlsZXMgfSBmcm9tICcuL3V0aWxzL21hbmlmZXN0JztcbmltcG9ydCB7IGNyZWF0ZVdlYkV4dFJ1bm5lciB9IGZyb20gJy4vcnVubmVycy9jcmVhdGVXZWJFeHRSdW5uZXInO1xuaW1wb3J0IHsgYnVpbGRJbnRlcm5hbCB9IGZyb20gJy4vYnVpbGQnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VydmVySW5mbygpOiBQcm9taXNlPFNlcnZlckluZm8+IHtcbiAgY29uc3QgeyBkZWZhdWx0OiBnZXRQb3J0LCBwb3J0TnVtYmVycyB9ID0gYXdhaXQgaW1wb3J0KCdnZXQtcG9ydCcpO1xuICBjb25zdCBwb3J0ID0gYXdhaXQgZ2V0UG9ydCh7IHBvcnQ6IHBvcnROdW1iZXJzKDMwMDAsIDMwMTApIH0pO1xuICBjb25zdCBob3N0bmFtZSA9ICdsb2NhbGhvc3QnO1xuICBjb25zdCBvcmlnaW4gPSBgaHR0cDovLyR7aG9zdG5hbWV9OiR7cG9ydH1gO1xuICBjb25zdCBzZXJ2ZXJDb25maWc6IHZpdGUuSW5saW5lQ29uZmlnID0ge1xuICAgIHNlcnZlcjoge1xuICAgICAgb3JpZ2luLFxuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBwb3J0LFxuICAgIGhvc3RuYW1lLFxuICAgIG9yaWdpbixcbiAgICB2aXRlU2VydmVyQ29uZmlnOiBzZXJ2ZXJDb25maWcsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlcnZlcihcbiAgc2VydmVySW5mbzogU2VydmVySW5mbyxcbiAgY29uZmlnOiBJbnRlcm5hbENvbmZpZyxcbik6IFByb21pc2U8V3h0RGV2U2VydmVyPiB7XG4gIGNvbnN0IHJ1bm5lciA9IGNyZWF0ZVdlYkV4dFJ1bm5lcigpO1xuXG4gIGNvbnN0IHZpdGVTZXJ2ZXIgPSBhd2FpdCB2aXRlLmNyZWF0ZVNlcnZlcihcbiAgICB2aXRlLm1lcmdlQ29uZmlnKHNlcnZlckluZm8sIGNvbmZpZy52aXRlKSxcbiAgKTtcblxuICBjb25zdCBzdGFydCA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB2aXRlU2VydmVyLmxpc3RlbihzZXJ2ZXIucG9ydCk7XG4gICAgY29uZmlnLmxvZ2dlci5zdWNjZXNzKGBTdGFydGVkIGRldiBzZXJ2ZXIgQCAke3NlcnZlckluZm8ub3JpZ2lufWApO1xuXG4gICAgc2VydmVyLmN1cnJlbnRPdXRwdXQgPSBhd2FpdCBidWlsZEludGVybmFsKGNvbmZpZyk7XG4gICAgY29uZmlnLmxvZ2dlci5pbmZvKCdPcGVuaW5nIGJyb3dzZXIuLi4nKTtcbiAgICBhd2FpdCBydW5uZXIub3BlbkJyb3dzZXIoY29uZmlnKTtcbiAgICBjb25maWcubG9nZ2VyLnN1Y2Nlc3MoJ09wZW5lZCEnKTtcbiAgfTtcblxuICBjb25zdCByZWxvYWRFeHRlbnNpb24gPSAoKSA9PiB7XG4gICAgdml0ZVNlcnZlci53cy5zZW5kKCd3eHQ6cmVsb2FkLWV4dGVuc2lvbicpO1xuICB9O1xuICBjb25zdCByZWxvYWRQYWdlID0gKHBhdGg6IHN0cmluZykgPT4ge1xuICAgIC8vIENhbid0IHVzZSBWaXRlJ3MgYnVpbHQtaW4gXCJmdWxsLXJlbG9hZFwiIGV2ZW50IGJlY2F1c2UgaXQgZG9lc24ndCBsaWtlIG91ciBwYXRocywgaXQgZXhwZWN0c1xuICAgIC8vIHBhdGhzIGVuZGluZyBpbiBcIi9pbmRleC5odG1sXCJcbiAgICB2aXRlU2VydmVyLndzLnNlbmQoJ3d4dDpyZWxvYWQtcGFnZScsIHBhdGgpO1xuICB9O1xuICBjb25zdCByZWxvYWRDb250ZW50U2NyaXB0ID0gKFxuICAgIGNvbnRlbnRTY3JpcHQ6IE9taXQ8U2NyaXB0aW5nLlJlZ2lzdGVyZWRDb250ZW50U2NyaXB0LCAnaWQnPixcbiAgKSA9PiB7XG4gICAgdml0ZVNlcnZlci53cy5zZW5kKCd3eHQ6cmVsb2FkLWNvbnRlbnQtc2NyaXB0JywgY29udGVudFNjcmlwdCk7XG4gIH07XG5cbiAgY29uc3Qgc2VydmVyOiBXeHREZXZTZXJ2ZXIgPSB7XG4gICAgLi4udml0ZVNlcnZlcixcbiAgICBzdGFydCxcbiAgICBjdXJyZW50T3V0cHV0OiB7XG4gICAgICBtYW5pZmVzdDoge1xuICAgICAgICBtYW5pZmVzdF92ZXJzaW9uOiAzLFxuICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgdmVyc2lvbjogJycsXG4gICAgICB9LFxuICAgICAgcHVibGljQXNzZXRzOiBbXSxcbiAgICAgIHN0ZXBzOiBbXSxcbiAgICB9LFxuICAgIHBvcnQ6IHNlcnZlckluZm8ucG9ydCxcbiAgICBob3N0bmFtZTogc2VydmVySW5mby5ob3N0bmFtZSxcbiAgICBvcmlnaW46IHNlcnZlckluZm8ub3JpZ2luLFxuICAgIHJlbG9hZEV4dGVuc2lvbixcbiAgICByZWxvYWRQYWdlLFxuICAgIHJlbG9hZENvbnRlbnRTY3JpcHQsXG4gIH07XG5cbiAgcmV0dXJuIHNlcnZlcjtcbn1cblxuLyoqXG4gKiBGcm9tIHRoZSBzZXJ2ZXIsIHRlbGwgdGhlIGNsaWVudCB0byByZWxvYWQgY29udGVudCBzY3JpcHRzIGZyb20gdGhlIHByb3ZpZGVkIGJ1aWxkIHN0ZXAgb3V0cHV0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZENvbnRlbnRTY3JpcHRzKFxuICBzdGVwczogQnVpbGRTdGVwT3V0cHV0W10sXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4gIHNlcnZlcjogV3h0RGV2U2VydmVyLFxuKSB7XG4gIGlmIChjb25maWcubWFuaWZlc3RWZXJzaW9uID09PSAzKSB7XG4gICAgc3RlcHMuZm9yRWFjaCgoc3RlcCkgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSBzdGVwLmVudHJ5cG9pbnRzO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZW50cnkpIHx8IGVudHJ5LnR5cGUgIT09ICdjb250ZW50LXNjcmlwdCcpIHJldHVybjtcblxuICAgICAgY29uc3QganMgPSBbZ2V0RW50cnlwb2ludEJ1bmRsZVBhdGgoZW50cnksIGNvbmZpZy5vdXREaXIsICcuanMnKV07XG4gICAgICBjb25zdCBjc3MgPSBnZXRDb250ZW50U2NyaXB0Q3NzRmlsZXMoW2VudHJ5XSwgc2VydmVyLmN1cnJlbnRPdXRwdXQpO1xuXG4gICAgICBzZXJ2ZXIucmVsb2FkQ29udGVudFNjcmlwdCh7XG4gICAgICAgIC4uLmVudHJ5Lm9wdGlvbnMsXG4gICAgICAgIGpzLFxuICAgICAgICBjc3MsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBzZXJ2ZXIucmVsb2FkRXh0ZW5zaW9uKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZEh0bWxQYWdlcyhcbiAgZ3JvdXBzOiBFbnRyeXBvaW50R3JvdXBbXSxcbiAgc2VydmVyOiBXeHREZXZTZXJ2ZXIsXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4pIHtcbiAgZ3JvdXBzLmZsYXQoKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBnZXRFbnRyeXBvaW50QnVuZGxlUGF0aChlbnRyeSwgY29uZmlnLm91dERpciwgJy5odG1sJyk7XG4gICAgc2VydmVyLnJlbG9hZFBhZ2UocGF0aCk7XG4gIH0pO1xufVxuXG5pbnRlcmZhY2UgU2VydmVySW5mbyB7XG4gIHBvcnQ6IG51bWJlcjtcbiAgaG9zdG5hbWU6IHN0cmluZztcbiAgb3JpZ2luOiBzdHJpbmc7XG4gIHZpdGVTZXJ2ZXJDb25maWc6IHZpdGUuSW5saW5lQ29uZmlnO1xufVxuIiwgImltcG9ydCB0eXBlIHsgV2ViRXh0UnVuSW5zdGFuY2UgfSBmcm9tICd3ZWItZXh0JztcbmltcG9ydCB7IEV4dGVuc2lvblJ1bm5lciB9IGZyb20gJy4vRXh0ZW5zaW9uUnVubmVyJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gYEV4dGVuc2lvblJ1bm5lcmAgYmFja2VkIGJ5IGB3ZWItZXh0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYkV4dFJ1bm5lcigpOiBFeHRlbnNpb25SdW5uZXIge1xuICBsZXQgcnVubmVyOiBXZWJFeHRSdW5JbnN0YW5jZSB8IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIG9wZW5Ccm93c2VyKGNvbmZpZykge1xuICAgICAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnc2FmYXJpJykge1xuICAgICAgICBjb25maWcubG9nZ2VyLndhcm4oJ0Nhbm5vdCBvcGVuIHNhZmFyaSBhdXRvbWF0aWNhbGx5LicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB0aGUgcGx1Z2luJ3MgbG9nZ2VyIGluc3RlYWQgb2Ygd2ViLWV4dCdzIGJ1aWx0LWluIG9uZS5cbiAgICAgIGNvbnN0IHdlYkV4dExvZ2dlciA9IGF3YWl0IGltcG9ydCgnd2ViLWV4dC91dGlsL2xvZ2dlcicpO1xuICAgICAgd2ViRXh0TG9nZ2VyLmNvbnNvbGVTdHJlYW0ud3JpdGUgPSAoeyBsZXZlbCwgbXNnLCBuYW1lIH0pID0+IHtcbiAgICAgICAgaWYgKGxldmVsID49IEVSUk9SX0xPR19MRVZFTCkgY29uZmlnLmxvZ2dlci5lcnJvcihuYW1lLCBtc2cpO1xuICAgICAgICBpZiAobGV2ZWwgPj0gV0FSTl9MT0dfTEVWRUwpIGNvbmZpZy5sb2dnZXIud2Fybihtc2cpO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgd3h0VXNlckNvbmZpZyA9IGNvbmZpZy5ydW5uZXJDb25maWcuY29uZmlnO1xuICAgICAgY29uc3QgdXNlckNvbmZpZyA9IHtcbiAgICAgICAgY29uc29sZTogd3h0VXNlckNvbmZpZz8ub3BlbkNvbnNvbGUsXG4gICAgICAgIGRldnRvb2xzOiB3eHRVc2VyQ29uZmlnPy5vcGVuRGV2dG9vbHMsXG4gICAgICAgIHN0YXJ0VXJsOiB3eHRVc2VyQ29uZmlnPy5zdGFydFVybHMsXG4gICAgICAgIC4uLihjb25maWcuYnJvd3NlciA9PT0gJ2ZpcmVmb3gnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGZpcmVmb3g6IHd4dFVzZXJDb25maWc/LmJpbmFyaWVzPy5maXJlZm94LFxuICAgICAgICAgICAgICBmaXJlZm94UHJvZmlsZTogd3h0VXNlckNvbmZpZz8uZmlyZWZveFByb2ZpbGUsXG4gICAgICAgICAgICAgIHByZWZzOiB3eHRVc2VyQ29uZmlnPy5maXJlZm94UHJlZnMsXG4gICAgICAgICAgICAgIGFyZ3M6IHd4dFVzZXJDb25maWc/LmZpcmVmb3hBcmdzLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBjaHJvbWl1bUJpbmFyeTogd3h0VXNlckNvbmZpZz8uYmluYXJpZXM/Lltjb25maWcuYnJvd3Nlcl0sXG4gICAgICAgICAgICAgIGNocm9taXVtUHJvZmlsZTogd3h0VXNlckNvbmZpZz8uY2hyb21pdW1Qcm9maWxlLFxuICAgICAgICAgICAgICBhcmdzOiB3eHRVc2VyQ29uZmlnPy5jaHJvbWl1bUFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmFsQ29uZmlnID0ge1xuICAgICAgICAuLi51c2VyQ29uZmlnLFxuICAgICAgICB0YXJnZXQ6IGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcgPyAnZmlyZWZveC1kZXNrdG9wJyA6ICdjaHJvbWl1bScsXG4gICAgICAgIHNvdXJjZURpcjogY29uZmlnLm91dERpcixcbiAgICAgICAgLy8gV1hUIGhhbmRsZXMgcmVsb2Fkcywgc28gZGlzYWJsZSBhdXRvLXJlbG9hZCBiZWhhdmlvcnMgaW4gd2ViLWV4dFxuICAgICAgICBub1JlbG9hZDogdHJ1ZSxcbiAgICAgICAgbm9JbnB1dDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAvLyBEb24ndCBjYWxsIGBwcm9jZXNzLmV4aXQoMClgIGFmdGVyIHN0YXJ0aW5nIHdlYi1leHRcbiAgICAgICAgc2hvdWxkRXhpdFByb2dyYW06IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoJ3dlYi1leHQgY29uZmlnOicsIGZpbmFsQ29uZmlnKTtcbiAgICAgIGNvbmZpZy5sb2dnZXIuZGVidWcoJ3dlYi1leHQgb3B0aW9uczonLCBvcHRpb25zKTtcblxuICAgICAgY29uc3Qgd2ViRXh0ID0gYXdhaXQgaW1wb3J0KCd3ZWItZXh0Jyk7XG4gICAgICBydW5uZXIgPSBhd2FpdCB3ZWJFeHQuZGVmYXVsdC5jbWQucnVuKGZpbmFsQ29uZmlnLCBvcHRpb25zKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJ1bm5lcj8uZXhpdCgpO1xuICAgIH0sXG4gIH07XG59XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3dlYi1leHQvYmxvYi9lMzdlNjBhMjczODQ3OGY1MTJmMTI1NWM1MzcxMzMzMjFmMzAxNzcxL3NyYy91dGlsL2xvZ2dlci5qcyNMMTJcbmNvbnN0IFdBUk5fTE9HX0xFVkVMID0gNDA7XG5jb25zdCBFUlJPUl9MT0dfTEVWRUwgPSA1MDtcbiIsICJpbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgeyBwcmludEhlYWRlciB9IGZyb20gJy4uLy4uL2NvcmUvbG9nL3ByaW50SGVhZGVyJztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9mb3JtYXREdXJhdGlvbic7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb21tYW5kPFRBcmdzIGV4dGVuZHMgYW55W10+KFxuICBjYjogKC4uLmFyZ3M6IFRBcmdzKSA9PiB2b2lkIHwgYm9vbGVhbiB8IFByb21pc2U8dm9pZCB8IGJvb2xlYW4+LFxuKSB7XG4gIHJldHVybiBhc3luYyAoLi4uYXJnczogVEFyZ3MpID0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHRyeSB7XG4gICAgICBwcmludEhlYWRlcigpO1xuXG4gICAgICBjb25zdCBvbmdvaW5nID0gYXdhaXQgY2IoLi4uYXJncyk7XG5cbiAgICAgIGlmICghb25nb2luZylcbiAgICAgICAgY29uc29sYS5zdWNjZXNzKFxuICAgICAgICAgIGBGaW5pc2hlZCBpbiAke2Zvcm1hdER1cmF0aW9uKERhdGUubm93KCkgLSBzdGFydFRpbWUpfWAsXG4gICAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xhLmZhaWwoXG4gICAgICAgIGBDb21tYW5kIGZhaWxlZCBhZnRlciAke2Zvcm1hdER1cmF0aW9uKERhdGUubm93KCkgLSBzdGFydFRpbWUpfWAsXG4gICAgICApO1xuICAgICAgY29uc29sYS5lcnJvcihlcnIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfTtcbn1cbiIsICJpbXBvcnQgcGMgZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgY29uc29sYSB9IGZyb20gJ2NvbnNvbGEnO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRIZWFkZXIoKSB7XG4gIGNvbnNvbGUubG9nKCk7XG4gIGNvbnNvbGEubG9nKGAke3BjLmdyYXkoJ1dYVCcpfSAke3BjLmdyYXkocGMuYm9sZCh2ZXJzaW9uKSl9YCk7XG59XG4iLCAiaW1wb3J0ICogYXMgd3h0IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IGRlZmluZUNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9kZWZpbmVDb21tYW5kJztcblxuZXhwb3J0IGNvbnN0IGJ1aWxkID0gZGVmaW5lQ29tbWFuZDxcbiAgW1xuICAgIHJvb3Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmbGFnczoge1xuICAgICAgbW9kZT86IHN0cmluZztcbiAgICAgIGNvbmZpZz86IHN0cmluZztcbiAgICAgIGJyb3dzZXI/OiB3eHQuVGFyZ2V0QnJvd3NlcjtcbiAgICAgIG12Mz86IGJvb2xlYW47XG4gICAgICBtdjI/OiBib29sZWFuO1xuICAgIH0sXG4gIF1cbj4oYXN5bmMgKHJvb3QsIGZsYWdzKSA9PiB7XG4gIGNvbnN0IG1vZGUgPSBmbGFncy5tb2RlID8/ICdwcm9kdWN0aW9uJztcbiAgY29uc3QgY2xpQ29uZmlnOiB3eHQuSW5saW5lQ29uZmlnID0ge1xuICAgIHJvb3QsXG4gICAgbW9kZSxcbiAgICBicm93c2VyOiBmbGFncy5icm93c2VyLFxuICAgIG1hbmlmZXN0VmVyc2lvbjogZmxhZ3MubXYzID8gMyA6IGZsYWdzLm12MiA/IDIgOiB1bmRlZmluZWQsXG4gICAgY29uZmlnRmlsZTogZmxhZ3MuY29uZmlnLFxuICB9O1xuXG4gIGF3YWl0IHd4dC5idWlsZChjbGlDb25maWcpO1xufSk7XG4iLCAiaW1wb3J0ICogYXMgd3h0IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IGRlZmluZUNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9kZWZpbmVDb21tYW5kJztcblxuZXhwb3J0IGNvbnN0IGRldiA9IGRlZmluZUNvbW1hbmQ8XG4gIFtcbiAgICByb290OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZmxhZ3M6IHtcbiAgICAgIG1vZGU/OiBzdHJpbmc7XG4gICAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgICBicm93c2VyPzogd3h0LlRhcmdldEJyb3dzZXI7XG4gICAgICBtdjM/OiBib29sZWFuO1xuICAgICAgbXYyPzogYm9vbGVhbjtcbiAgICB9LFxuICBdXG4+KGFzeW5jIChyb290LCBmbGFncykgPT4ge1xuICBjb25zdCBtb2RlID0gZmxhZ3MubW9kZSA/PyAnZGV2ZWxvcG1lbnQnO1xuICBjb25zdCBjbGlDb25maWc6IHd4dC5JbmxpbmVDb25maWcgPSB7XG4gICAgcm9vdCxcbiAgICBtb2RlLFxuICAgIGJyb3dzZXI6IGZsYWdzLmJyb3dzZXIsXG4gICAgbWFuaWZlc3RWZXJzaW9uOiBmbGFncy5tdjMgPyAzIDogZmxhZ3MubXYyID8gMiA6IHVuZGVmaW5lZCxcbiAgICBjb25maWdGaWxlOiBmbGFncy5jb25maWcsXG4gIH07XG5cbiAgY29uc3Qgc2VydmVyID0gYXdhaXQgd3h0LmNyZWF0ZVNlcnZlcihjbGlDb25maWcpO1xuICBhd2FpdCBzZXJ2ZXIuc3RhcnQoKTtcblxuICByZXR1cm4gdHJ1ZTtcbn0pO1xuIiwgImltcG9ydCB7IGNvbnNvbGEgfSBmcm9tICdjb25zb2xhJztcbmltcG9ydCB7IGRlZmluZUNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9kZWZpbmVDb21tYW5kJztcblxuZXhwb3J0IGNvbnN0IGluaXQgPSBkZWZpbmVDb21tYW5kPFtkaXJlY3Rvcnk/OiBzdHJpbmddPihhc3luYyAoZGlyZWN0b3J5KSA9PiB7XG4gIGNvbnNvbGEud2Fybignd3h0IGluaXQ6IE5vdCBpbXBsZW1lbnRlZCcpO1xufSk7XG4iLCAiaW1wb3J0IHsgZ2V0SW50ZXJuYWxDb25maWcgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2dldEludGVybmFsQ29uZmlnJztcbmltcG9ydCB7IGZpbmRFbnRyeXBvaW50cyB9IGZyb20gJy4uLy4uL2NvcmUvYnVpbGQvZmluZEVudHJ5cG9pbnRzJztcbmltcG9ydCB7IGdlbmVyYXRlVHlwZXNEaXIgfSBmcm9tICcuLi8uLi9jb3JlL2J1aWxkL2dlbmVyYXRlVHlwZXNEaXInO1xuaW1wb3J0IHsgZGVmaW5lQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2RlZmluZUNvbW1hbmQnO1xuaW1wb3J0ICogYXMgd3h0IGZyb20gJy4uLy4uJztcblxuZXhwb3J0IGNvbnN0IHByZXBhcmUgPSBkZWZpbmVDb21tYW5kPFxuICBbXG4gICAgcm9vdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiB7XG4gICAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgfSxcbiAgXVxuPihhc3luYyAocm9vdCwgZmxhZ3MpID0+IHtcbiAgY29uc3QgY2xpQ29uZmlnOiB3eHQuSW5saW5lQ29uZmlnID0ge1xuICAgIHJvb3QsXG4gICAgY29uZmlnRmlsZTogZmxhZ3MuY29uZmlnLFxuICB9O1xuICBjb25zdCBjb25maWcgPSBhd2FpdCBnZXRJbnRlcm5hbENvbmZpZyhjbGlDb25maWcsICdidWlsZCcpO1xuXG4gIGNvbmZpZy5sb2dnZXIuaW5mbygnR2VuZXJhdGluZyB0eXBlcy4uLicpO1xuXG4gIGNvbnN0IGVudHJ5cG9pbnRzID0gYXdhaXQgZmluZEVudHJ5cG9pbnRzKGNvbmZpZyk7XG4gIGF3YWl0IGdlbmVyYXRlVHlwZXNEaXIoZW50cnlwb2ludHMsIGNvbmZpZyk7XG59KTtcbiIsICJpbXBvcnQgeyBjb25zb2xhIH0gZnJvbSAnY29uc29sYSc7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5cbmV4cG9ydCBjb25zdCBwdWJsaXNoID0gZGVmaW5lQ29tbWFuZChcbiAgYXN5bmMgKHJvb3Q6IGFueSwgeyBjb25maWc6IGNvbmZpZ0ZpbGUgfTogYW55KSA9PiB7XG4gICAgY29uc29sYS53YXJuKCd3eHQgcHVibGlzaDogTm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG4pO1xuIiwgImltcG9ydCB7IEJ1aWxkT3V0cHV0LCBJbnRlcm5hbENvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHppcGRpciBmcm9tICd6aXAtZGlyJztcbmltcG9ydCB7IGRpcm5hbWUsIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBrZWJhYkNhc2VBbHBoYW51bWVyaWMgfSBmcm9tICcuL3V0aWxzL3N0cmluZ3MnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUpzb24gfSBmcm9tICcuL3V0aWxzL3BhY2thZ2UnO1xuaW1wb3J0IHsgbWluaW1hdGNoIH0gZnJvbSAnbWluaW1hdGNoJztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uIH0gZnJvbSAnLi91dGlscy9mb3JtYXREdXJhdGlvbic7XG5pbXBvcnQgeyBwcmludEZpbGVMaXN0IH0gZnJvbSAnLi9sb2cvcHJpbnRGaWxlTGlzdCc7XG5cbi8qKlxuICogWmlwIHRoZSBleHRlbnNpb24gZm9yIGRpc3RyaWJ1dGlvbi4gRG9lcyBub3QgYnVpbGQsIGp1c3QgemlwcyB0aGUgb3V0cHV0IHRoYXQgc2hvdWxkIGV4aXN0IGZvclxuICogdGhlIGdpdmVuIGNvbmZpZy5cbiAqXG4gKiBSZXR1cm5zIGEgbGlzdCBvZiBaSVAgZmlsZXMgdGhhdCB3ZXJlIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB6aXBFeHRlbnNpb24oXG4gIGNvbmZpZzogSW50ZXJuYWxDb25maWcsXG4gIGJ1aWxkT3V0cHV0OiBCdWlsZE91dHB1dCxcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICBjb25maWcubG9nZ2VyLmluZm8oJ1ppcHBpbmcgZXh0ZW5zaW9uLi4uJyk7XG4gIGNvbnN0IHppcEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0IHByb2plY3ROYW1lID1cbiAgICBjb25maWcuemlwLm5hbWUgPz9cbiAgICBrZWJhYkNhc2VBbHBoYW51bWVyaWMoXG4gICAgICAoYXdhaXQgZ2V0UGFja2FnZUpzb24oY29uZmlnKSk/Lm5hbWUgfHwgZGlybmFtZShwcm9jZXNzLmN3ZCgpKSxcbiAgICApO1xuICBjb25zdCBhcHBseVRlbXBsYXRlID0gKHRlbXBsYXRlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgICB0ZW1wbGF0ZVxuICAgICAgLnJlcGxhY2VBbGwoJ3t7bmFtZX19JywgcHJvamVjdE5hbWUpXG4gICAgICAucmVwbGFjZUFsbCgne3ticm93c2VyfX0nLCBjb25maWcuYnJvd3NlcilcbiAgICAgIC5yZXBsYWNlQWxsKFxuICAgICAgICAne3t2ZXJzaW9ufX0nLFxuICAgICAgICBidWlsZE91dHB1dC5tYW5pZmVzdC52ZXJzaW9uX25hbWUgPz8gYnVpbGRPdXRwdXQubWFuaWZlc3QudmVyc2lvbixcbiAgICAgIClcbiAgICAgIC5yZXBsYWNlQWxsKCd7e21hbmlmZXN0VmVyc2lvbn19JywgYG12JHtjb25maWcubWFuaWZlc3RWZXJzaW9ufWApO1xuXG4gIGF3YWl0IGZzLmVuc3VyZURpcihjb25maWcub3V0QmFzZURpcik7XG5cbiAgLy8gWklQIG91dHB1dCBkaXJlY3RvcnlcblxuICBjb25zdCBvdXRaaXBGaWxlbmFtZSA9IGFwcGx5VGVtcGxhdGUoY29uZmlnLnppcC5hcnRpZmFjdFRlbXBsYXRlKTtcbiAgY29uc3Qgb3V0WmlwUGF0aCA9IHJlc29sdmUoY29uZmlnLm91dEJhc2VEaXIsIG91dFppcEZpbGVuYW1lKTtcbiAgYXdhaXQgemlwZGlyKGNvbmZpZy5vdXREaXIsIHtcbiAgICBzYXZlVG86IG91dFppcFBhdGgsXG4gIH0pO1xuICB6aXBGaWxlcy5wdXNoKG91dFppcFBhdGgpO1xuXG4gIC8vIFpJUCBzb3VyY2VzIGZvciBGaXJlZm94XG5cbiAgaWYgKGNvbmZpZy5icm93c2VyID09PSAnZmlyZWZveCcpIHtcbiAgICBjb25zdCBzb3VyY2VzWmlwRmlsZW5hbWUgPSBhcHBseVRlbXBsYXRlKGNvbmZpZy56aXAuc291cmNlc1RlbXBsYXRlKTtcbiAgICBjb25zdCBzb3VyY2VzWmlwUGF0aCA9IHJlc29sdmUoY29uZmlnLm91dEJhc2VEaXIsIHNvdXJjZXNaaXBGaWxlbmFtZSk7XG4gICAgYXdhaXQgemlwZGlyKGNvbmZpZy56aXAuc291cmNlc1Jvb3QsIHtcbiAgICAgIHNhdmVUbzogc291cmNlc1ppcFBhdGgsXG4gICAgICBmaWx0ZXIocGF0aCkge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShjb25maWcuemlwLnNvdXJjZXNSb290LCBwYXRoKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZFBhdHRlcm4gPSBjb25maWcuemlwLmlnbm9yZWRTb3VyY2VzLmZpbmQoKHBhdHRlcm4pID0+XG4gICAgICAgICAgbWluaW1hdGNoKHJlbGF0aXZlUGF0aCwgcGF0dGVybiksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtYXRjaGVkUGF0dGVybiA9PSBudWxsO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB6aXBGaWxlcy5wdXNoKHNvdXJjZXNaaXBQYXRoKTtcbiAgfVxuXG4gIGNvbmZpZy5sb2dnZXIuc3VjY2VzcyhcbiAgICBgWmlwcGVkIGV4dGVuc2lvbiBpbiAke2Zvcm1hdER1cmF0aW9uKERhdGUubm93KCkgLSBzdGFydCl9YCxcbiAgKTtcbiAgYXdhaXQgcHJpbnRGaWxlTGlzdChjb25maWcubG9nZ2VyLmxvZywgY29uZmlnLm91dEJhc2VEaXIsIHppcEZpbGVzKTtcblxuICByZXR1cm4gemlwRmlsZXM7XG59XG4iLCAiaW1wb3J0ICogYXMgd3h0IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IGJ1aWxkSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9jb3JlL2J1aWxkJztcbmltcG9ydCB7IGdldEludGVybmFsQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9nZXRJbnRlcm5hbENvbmZpZyc7XG5pbXBvcnQgeyB6aXBFeHRlbnNpb24gfSBmcm9tICcuLi8uLi9jb3JlL3ppcCc7XG5pbXBvcnQgeyBkZWZpbmVDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZGVmaW5lQ29tbWFuZCc7XG5cbmV4cG9ydCBjb25zdCB6aXAgPSBkZWZpbmVDb21tYW5kPFxuICBbXG4gICAgcm9vdDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiB7XG4gICAgICBtb2RlPzogc3RyaW5nO1xuICAgICAgY29uZmlnPzogc3RyaW5nO1xuICAgICAgYnJvd3Nlcj86IHd4dC5UYXJnZXRCcm93c2VyO1xuICAgICAgbXYzPzogYm9vbGVhbjtcbiAgICAgIG12Mj86IGJvb2xlYW47XG4gICAgfSxcbiAgXVxuPihhc3luYyAocm9vdCwgZmxhZ3MpID0+IHtcbiAgY29uc3QgbW9kZSA9IGZsYWdzLm1vZGUgPz8gJ3Byb2R1Y3Rpb24nO1xuICBjb25zdCBjbGlDb25maWc6IHd4dC5JbmxpbmVDb25maWcgPSB7XG4gICAgcm9vdCxcbiAgICBtb2RlLFxuICAgIGJyb3dzZXI6IGZsYWdzLmJyb3dzZXIsXG4gICAgbWFuaWZlc3RWZXJzaW9uOiBmbGFncy5tdjMgPyAzIDogZmxhZ3MubXYyID8gMiA6IHVuZGVmaW5lZCxcbiAgICBjb25maWdGaWxlOiBmbGFncy5jb25maWcsXG4gIH07XG5cbiAgY29uc3QgY29uZmlnID0gYXdhaXQgZ2V0SW50ZXJuYWxDb25maWcoY2xpQ29uZmlnLCAnYnVpbGQnKTtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgYnVpbGRJbnRlcm5hbChjb25maWcpO1xuICBhd2FpdCB6aXBFeHRlbnNpb24oY29uZmlnLCBvdXRwdXQpO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLGlCQUFnQjs7O0FDQ2QsY0FBVzs7O0FDTWIsSUFBQUEsb0JBQThCO0FBQzlCLElBQUFDLFFBQXNCO0FBQ3RCLHFCQUF3Qjs7O0FDVnhCLElBQUFDLG9CQUF3Qzs7O0FDRHhDLHVCQUFxQjtBQUNyQixXQUFzQjtBQU1mLFNBQVNDLGVBQWNDLE9BQXNCO0FBQ2xELFNBQVksbUJBQWNBLEtBQUk7QUFDaEM7QUFLTyxTQUFTLGdCQUFnQkEsT0FBc0I7QUFDcEQsU0FBTyxpQkFBQUMsUUFBUyxVQUFVRCxLQUFJO0FBQ2hDOzs7QURaTyxTQUFTLGtCQUNkLGdCQUNBLFdBRVE7QUFDUixRQUFNLGVBQWUsa0JBQUFFLFFBQUssU0FBUyxnQkFBZ0IsU0FBUztBQUU1RCxRQUFNLE9BQU8sYUFBYSxNQUFNLFlBQVksQ0FBQyxFQUFFLENBQUM7QUFFaEQsU0FBTztBQUNUO0FBRU8sU0FBUyx3QkFDZCxZQUNBLEtBQ1E7QUFDUixhQUFPLDJCQUFRLFdBQVcsV0FBVyxHQUFHLFdBQVcsSUFBSSxHQUFHLEdBQUcsRUFBRTtBQUNqRTtBQU1PLFNBQVMsd0JBQ2QsWUFDQSxRQUNBLEtBQ1E7QUFDUixTQUFPQztBQUFBLFFBQ0wsNEJBQVMsUUFBUSx3QkFBd0IsWUFBWSxHQUFHLENBQUM7QUFBQSxFQUMzRDtBQUNGOzs7QUVoQ0Esc0JBQTBCO0FBQzFCLGtCQUF1RDtBQUtoRCxTQUFTLGlCQUFpQixRQUFxQztBQUNwRSxTQUFPO0FBQUEsSUFDTCxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixTQUFTO0FBQ1AsYUFBTztBQUFBLFFBQ0wsU0FBUztBQUFBLFVBQ1AsT0FBTztBQUFBLFlBQ0wsd0JBQW9CO0FBQUEsY0FDbEIsT0FBTztBQUFBLGNBQ1A7QUFB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QUFxQixjQUFjLEVBQzFDLE9BQU8sMkJBQTJCLG1CQUFtQixFQUNyRCxPQUFPLFNBQVMsb0JBQW9CLEVBQ3BDLE9BQU8sU0FBUyxvQkFBb0IsRUFDcEMsT0FBZ0IsR0FBRztBQUd0QixJQUNHLFFBQVEsZ0JBQWdCLHNCQUFzQixFQUM5QyxPQUFPLHVCQUF1QiwyQkFBMkIsRUFDekQsT0FBTyxxQkFBcUIsY0FBYyxFQUMxQyxPQUFPLDJCQUEyQixtQkFBbUIsRUFDckQsT0FBTyxTQUFTLG9CQUFvQixFQUNwQyxPQUFPLFNBQVMsb0JBQW9CLEVBQ3BDLE9BQWdCQyxNQUFLO0FBR3hCLElBQ0csUUFBUSxjQUFjLHFDQUFxQyxFQUMzRCxPQUFPLHVCQUF1QiwyQkFBMkIsRUFDekQsT0FBTyxxQkFBcUIsY0FBYyxFQUMxQyxPQUFPLDJCQUEyQixtQkFBbUIsRUFDckQsT0FBTyxTQUFTLG9CQUFvQixFQUNwQyxPQUFPLFNBQVMsb0JBQW9CLEVBQ3BDLE9BQWdCLEdBQUc7QUFHdEIsSUFDRyxRQUFRLGtCQUFrQixTQUFTLEVBQ25DLE9BQU8sdUJBQXVCLDJCQUEyQixFQUN6RCxPQUFnQixPQUFPO0FBRzFCLElBQUksUUFBUSxrQkFBa0IsbUJBQW1CLEVBQUUsT0FBZ0IsT0FBTztBQUcxRSxJQUNHLFFBQVEsb0JBQW9CLDBCQUEwQixFQUN0RCxPQUFnQixJQUFJO0FBRXZCLElBQUksTUFBTTsiLAogICJuYW1lcyI6IFsiaW1wb3J0X25vZGVfcGF0aCIsICJ2aXRlIiwgImltcG9ydF9ub2RlX3BhdGgiLCAibm9ybWFsaXplUGF0aCIsICJwYXRoIiwgIm5vZGVQYXRoIiwgInBhdGgiLCAibm9ybWFsaXplUGF0aCIsICJpc09mZmxpbmUiLCAiZG5zIiwgImltcG9ydF9ub2RlX3BhdGgiLCAibm9ybWFsaXplUGF0aCIsICJmcyIsICJpbXBvcnRfcGF0aCIsICJ1bmltcG9ydCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAibm9ybWFsaXplUGF0aCIsICJmcyIsICJwYXRocyIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImltcG9ydF9waWNvY29sb3JzIiwgInZpdGUiLCAibm9ybWFsaXplUGF0aCIsICJpbXBvcnRfY29uc29sYSIsICJpbXBvcnRfbm9kZV9wYXRoIiwgInZpdGUiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImZzIiwgInBhdGgiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJmcyIsICJnbG9iIiwgImZzIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfbGlua2Vkb20iLCAiaW1wb3J0X3VuaW1wb3J0IiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJwYXRoIiwgIm5vcm1hbGl6ZVBhdGgiLCAidW5pbXBvcnQiLCAiZnMiLCAiY3JlYXRlSklUSSIsICJ0cmFuc2Zvcm0iLCAiaW1wb3J0X2Zhc3RfZ2xvYiIsICJnbG9iIiwgInBhdGgiLCAicGljb21hdGNoIiwgImZzIiwgIkpTT041IiwgImltcG9ydF91bmltcG9ydCIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAiZnMiLCAidW5pbXBvcnQiLCAibm9ybWFsaXplUGF0aCIsICJwYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJpbXBvcnRfcGF0aCIsICJpbXBvcnRfbm9kZV9wYXRoIiwgImltcG9ydF9mc19leHRyYSIsICJmcyIsICJmcyIsICJ2ZXJzaW9uIiwgIm9wdGlvbnMiLCAiaW1wb3J0X3BpY29jb2xvcnMiLCAidml0ZSIsICJpbXBvcnRfZnNfZXh0cmEiLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJpbXBvcnRfZnNfZXh0cmEiLCAicGF0aCIsICJmcyIsICJwYyIsICJwYyIsICJmcyIsICJ2aXRlIiwgInBhdGgiLCAiYnVpbGQiLCAiY3JlYXRlU2VydmVyIiwgInBhdGgiLCAicGMiLCAiaW1wb3J0X2NvbnNvbGEiLCAiaW1wb3J0X3BpY29jb2xvcnMiLCAiaW1wb3J0X2NvbnNvbGEiLCAicGMiLCAiYnVpbGQiLCAiY3JlYXRlU2VydmVyIiwgImltcG9ydF9jb25zb2xhIiwgImltcG9ydF9jb25zb2xhIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X2ZzX2V4dHJhIiwgImZzIiwgInppcGRpciIsICJwYXRoIiwgImNhYyIsICJidWlsZCJdCn0K
|