@decaf-ts/mcp-server 0.4.1 → 0.4.2
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/mcp-server.cjs +52 -20
- package/dist/mcp-server.esm.cjs +141 -127
- package/lib/McpWrapper.cjs +68 -24
- package/lib/McpWrapper.d.ts +0 -12
- package/lib/bin/cli.cjs +2 -2
- package/lib/bin/cli.d.ts +0 -24
- package/lib/esm/McpWrapper.d.ts +0 -12
- package/lib/esm/McpWrapper.js +31 -17
- package/lib/esm/bin/cli.d.ts +0 -24
- package/lib/esm/bin/cli.js +1 -1
- package/lib/esm/mcp/mcp-module.d.ts +1 -1
- package/lib/esm/metadata.d.ts +1 -1
- package/lib/esm/metadata.js +1 -1
- package/lib/esm/modules/decoration/index.d.ts +3 -3
- package/lib/esm/modules/decoration/resources/index.d.ts +2 -2
- package/lib/esm/modules/decoration/resources/index.js +3 -3
- package/lib/esm/modules/decoration/templates/index.d.ts +1 -1
- package/lib/esm/modules/decoration/templates/index.js +2 -2
- package/lib/mcp/mcp-module.d.ts +1 -1
- package/lib/metadata.cjs +1 -1
- package/lib/metadata.d.ts +1 -1
- package/lib/modules/decoration/index.d.ts +3 -3
- package/lib/modules/decoration/resources/index.cjs +3 -3
- package/lib/modules/decoration/resources/index.d.ts +2 -2
- package/lib/modules/decoration/templates/index.cjs +2 -2
- package/lib/modules/decoration/templates/index.d.ts +1 -1
- package/package.json +1 -1
package/dist/mcp-server.esm.cjs
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import fs__default from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import path__default from 'path';
|
|
3
5
|
import { spawnSync } from 'child_process';
|
|
4
6
|
import { z } from 'zod';
|
|
5
7
|
import { applyPatch, createTwoFilesPatch } from 'diff';
|
|
6
8
|
import { Metadata } from '@decaf-ts/decoration';
|
|
7
|
-
import { pathToFileURL } from 'url';
|
|
9
|
+
import { pathToFileURL, fileURLToPath } from 'url';
|
|
8
10
|
import fs$1 from 'node:fs';
|
|
9
11
|
import path$1 from 'node:path';
|
|
10
12
|
import { FastMCP } from 'fastmcp';
|
|
@@ -50,7 +52,7 @@ class WorkspaceError extends Error {
|
|
|
50
52
|
function initializeWorkspaceRoot() {
|
|
51
53
|
const configured = process.env[WORKSPACE_ROOT_ENV];
|
|
52
54
|
if (configured && configured.trim().length > 0) {
|
|
53
|
-
return
|
|
55
|
+
return path__default.resolve(configured.trim());
|
|
54
56
|
}
|
|
55
57
|
return process.cwd();
|
|
56
58
|
}
|
|
@@ -77,17 +79,17 @@ async function throwUserError(message) {
|
|
|
77
79
|
throw new Ctor(message);
|
|
78
80
|
}
|
|
79
81
|
function setWorkspaceRoot(root) {
|
|
80
|
-
workspaceRoot =
|
|
82
|
+
workspaceRoot = path__default.resolve(root);
|
|
81
83
|
}
|
|
82
84
|
function getWorkspaceRoot() {
|
|
83
85
|
return workspaceRoot;
|
|
84
86
|
}
|
|
85
87
|
function resolveInWorkspace(root, targetPath) {
|
|
86
|
-
const resolved =
|
|
87
|
-
?
|
|
88
|
-
:
|
|
89
|
-
const relative =
|
|
90
|
-
if (relative.startsWith("..") ||
|
|
88
|
+
const resolved = path__default.isAbsolute(targetPath)
|
|
89
|
+
? path__default.normalize(targetPath)
|
|
90
|
+
: path__default.resolve(root, targetPath);
|
|
91
|
+
const relative = path__default.relative(root, resolved);
|
|
92
|
+
if (relative.startsWith("..") || path__default.isAbsolute(relative)) {
|
|
91
93
|
throw new WorkspaceError(`Path ${targetPath} escapes the workspace root at ${root}`);
|
|
92
94
|
}
|
|
93
95
|
return resolved;
|
|
@@ -95,7 +97,7 @@ function resolveInWorkspace(root, targetPath) {
|
|
|
95
97
|
async function readWorkspaceFile(root, target) {
|
|
96
98
|
try {
|
|
97
99
|
const absolute = resolveInWorkspace(root, target);
|
|
98
|
-
return
|
|
100
|
+
return fs__default.readFileSync(absolute, "utf8");
|
|
99
101
|
}
|
|
100
102
|
catch (error) {
|
|
101
103
|
if (error instanceof WorkspaceError) {
|
|
@@ -199,18 +201,18 @@ function refreshPrompts(repoPath) {
|
|
|
199
201
|
function discoverDocPrompts(root) {
|
|
200
202
|
const discovered = [];
|
|
201
203
|
for (const directory of PROMPT_DIRECTORIES) {
|
|
202
|
-
const promptDir =
|
|
204
|
+
const promptDir = path__default.join(root, directory);
|
|
203
205
|
// debug logging to help tests diagnose prompt discovery
|
|
204
206
|
console.debug("[discoverDocPrompts] checking", promptDir);
|
|
205
|
-
if (!
|
|
207
|
+
if (!fs__default.existsSync(promptDir) || !fs__default.statSync(promptDir).isDirectory()) {
|
|
206
208
|
continue;
|
|
207
209
|
}
|
|
208
|
-
for (const entry of
|
|
209
|
-
const fullPath =
|
|
210
|
-
if (!
|
|
210
|
+
for (const entry of fs__default.readdirSync(promptDir)) {
|
|
211
|
+
const fullPath = path__default.join(promptDir, entry);
|
|
212
|
+
if (!fs__default.statSync(fullPath).isFile())
|
|
211
213
|
continue;
|
|
212
|
-
const name =
|
|
213
|
-
const content =
|
|
214
|
+
const name = path__default.parse(entry).name;
|
|
215
|
+
const content = fs__default.readFileSync(fullPath, "utf8");
|
|
214
216
|
const title = toTitleCase(name.replace(/[-_]/g, " "));
|
|
215
217
|
const description = extractDescription(content, fullPath);
|
|
216
218
|
discovered.push({
|
|
@@ -271,7 +273,7 @@ function extractDescription(content, filePath) {
|
|
|
271
273
|
.map((line) => line.trim())
|
|
272
274
|
.find((line) => line.length > 0);
|
|
273
275
|
return (firstLine?.slice(0, 240) ??
|
|
274
|
-
`Documentation prompt loaded from ${
|
|
276
|
+
`Documentation prompt loaded from ${path__default.basename(filePath)}`);
|
|
275
277
|
}
|
|
276
278
|
function toTitleCase(value) {
|
|
277
279
|
return value
|
|
@@ -281,7 +283,7 @@ function toTitleCase(value) {
|
|
|
281
283
|
.join(" ");
|
|
282
284
|
}
|
|
283
285
|
function inferLanguageFromPath(filePath) {
|
|
284
|
-
const extension =
|
|
286
|
+
const extension = path__default.extname(filePath).toLowerCase();
|
|
285
287
|
switch (extension) {
|
|
286
288
|
case ".ts":
|
|
287
289
|
case ".tsx":
|
|
@@ -458,7 +460,7 @@ const readmeImprovementSchema = z
|
|
|
458
460
|
|
|
459
461
|
function readFileSafe(filePath, encoding = "utf8") {
|
|
460
462
|
try {
|
|
461
|
-
return
|
|
463
|
+
return fs__default.readFileSync(filePath, { encoding });
|
|
462
464
|
}
|
|
463
465
|
catch {
|
|
464
466
|
return undefined;
|
|
@@ -469,10 +471,10 @@ function listFilesRecursive(root, matcher) {
|
|
|
469
471
|
const stack = [root];
|
|
470
472
|
while (stack.length) {
|
|
471
473
|
const cur = stack.pop();
|
|
472
|
-
const stat =
|
|
474
|
+
const stat = fs__default.statSync(cur);
|
|
473
475
|
if (stat.isDirectory()) {
|
|
474
|
-
for (const f of
|
|
475
|
-
stack.push(
|
|
476
|
+
for (const f of fs__default.readdirSync(cur))
|
|
477
|
+
stack.push(path__default.join(cur, f));
|
|
476
478
|
}
|
|
477
479
|
else if (!matcher || matcher(cur)) {
|
|
478
480
|
out.push(cur);
|
|
@@ -542,18 +544,18 @@ function summarizeReadme(readme) {
|
|
|
542
544
|
return { title, bullets };
|
|
543
545
|
}
|
|
544
546
|
function analyzeRepo(root) {
|
|
545
|
-
const src =
|
|
546
|
-
const testDir =
|
|
547
|
-
const readmePath =
|
|
547
|
+
const src = path__default.join(root, "src");
|
|
548
|
+
const testDir = path__default.join(root, "tests");
|
|
549
|
+
const readmePath = path__default.join(root, "README.md");
|
|
548
550
|
const readme = readFileSafe(readmePath);
|
|
549
|
-
const files =
|
|
550
|
-
const testFiles =
|
|
551
|
+
const files = fs__default.existsSync(src) ? listFilesRecursive(src, isSourceFile) : [];
|
|
552
|
+
const testFiles = fs__default.existsSync(testDir)
|
|
551
553
|
? listFilesRecursive(testDir, (f) => isSourceFile(f) && isTestFile(f))
|
|
552
554
|
: [];
|
|
553
555
|
const api = {};
|
|
554
556
|
for (const f of files) {
|
|
555
557
|
const content = readFileSafe(f) || "";
|
|
556
|
-
api[
|
|
558
|
+
api[path__default.relative(root, f)] = {
|
|
557
559
|
exports: extractExports(content),
|
|
558
560
|
decorators: extractDecorators(content),
|
|
559
561
|
};
|
|
@@ -562,13 +564,13 @@ function analyzeRepo(root) {
|
|
|
562
564
|
for (const f of testFiles) {
|
|
563
565
|
const content = readFileSafe(f) || "";
|
|
564
566
|
const mentions = Array.from(new Set([...extractExports(content), ...extractDecorators(content)])).sort();
|
|
565
|
-
tests[
|
|
567
|
+
tests[path__default.relative(root, f)] = { mentions };
|
|
566
568
|
}
|
|
567
569
|
return { files, testFiles, api, tests, readme: summarizeReadme(readme) };
|
|
568
570
|
}
|
|
569
571
|
|
|
570
572
|
function relativeFiles(root, files) {
|
|
571
|
-
return files.map((file) =>
|
|
573
|
+
return files.map((file) => path__default.relative(root, file)).sort();
|
|
572
574
|
}
|
|
573
575
|
function collectPromptSections(names) {
|
|
574
576
|
const root = getWorkspaceRoot();
|
|
@@ -591,7 +593,7 @@ function parseTaskLines(content) {
|
|
|
591
593
|
.filter((line) => /^task\s+\d+/i.test(line));
|
|
592
594
|
}
|
|
593
595
|
function computeCoverageFromFinal(coveragePath) {
|
|
594
|
-
const payload = JSON.parse(
|
|
596
|
+
const payload = JSON.parse(fs__default.readFileSync(coveragePath, "utf8"));
|
|
595
597
|
const totals = {
|
|
596
598
|
statements: { covered: 0, total: 0 },
|
|
597
599
|
functions: { covered: 0, total: 0 },
|
|
@@ -673,12 +675,12 @@ const documentObjectTool = {
|
|
|
673
675
|
await throwUserError(`No prompt guidance configured for object type ${args.objectType}`);
|
|
674
676
|
}
|
|
675
677
|
const sections = normalizePromptSections(collectPromptSections(dependencies));
|
|
676
|
-
const srcDir =
|
|
677
|
-
const testDir =
|
|
678
|
-
const sourceFiles =
|
|
678
|
+
const srcDir = path__default.join(repoRoot, "src");
|
|
679
|
+
const testDir = path__default.join(repoRoot, "tests");
|
|
680
|
+
const sourceFiles = fs__default.existsSync(srcDir)
|
|
679
681
|
? listFilesRecursive(srcDir, isSourceFile)
|
|
680
682
|
: [];
|
|
681
|
-
const testFiles =
|
|
683
|
+
const testFiles = fs__default.existsSync(testDir)
|
|
682
684
|
? listFilesRecursive(testDir, (file) => isSourceFile(file) && isTestFile(file))
|
|
683
685
|
: [];
|
|
684
686
|
let targetFileContent;
|
|
@@ -695,7 +697,7 @@ const documentObjectTool = {
|
|
|
695
697
|
}
|
|
696
698
|
}
|
|
697
699
|
const payload = {
|
|
698
|
-
basePath:
|
|
700
|
+
basePath: path__default.relative(getWorkspaceRoot(), repoRoot) || ".",
|
|
699
701
|
objectType: args.objectType,
|
|
700
702
|
targetFile: args.targetFile,
|
|
701
703
|
guidance: sections,
|
|
@@ -736,9 +738,9 @@ const coverageEnforcerTool = {
|
|
|
736
738
|
await throwUserError(message.trim());
|
|
737
739
|
}
|
|
738
740
|
}
|
|
739
|
-
const coveragePath =
|
|
740
|
-
if (!
|
|
741
|
-
await throwUserError(`Coverage report not found at ${
|
|
741
|
+
const coveragePath = path__default.join(repoRoot, "workdocs", "reports", "coverage", "coverage-final.json");
|
|
742
|
+
if (!fs__default.existsSync(coveragePath)) {
|
|
743
|
+
await throwUserError(`Coverage report not found at ${path__default.relative(repoRoot, coveragePath)}`);
|
|
742
744
|
}
|
|
743
745
|
const summary = computeCoverageFromFinal(coveragePath);
|
|
744
746
|
const meetsThreshold = summary.totals.statements.pct >= args.coverage &&
|
|
@@ -749,7 +751,7 @@ const coverageEnforcerTool = {
|
|
|
749
751
|
.slice(0, 10);
|
|
750
752
|
const guidance = normalizePromptSections(collectPromptSections(["bulk-tests"]));
|
|
751
753
|
const payload = {
|
|
752
|
-
basePath:
|
|
754
|
+
basePath: path__default.relative(getWorkspaceRoot(), repoRoot) || ".",
|
|
753
755
|
target: args.coverage,
|
|
754
756
|
meetsThreshold,
|
|
755
757
|
totals: summary.totals,
|
|
@@ -777,12 +779,12 @@ const readmeImprovementTool = {
|
|
|
777
779
|
const analysis = analyzeRepo(repoRoot);
|
|
778
780
|
const modules = analysis.files
|
|
779
781
|
.filter((file) => /index\.ts$/.test(file))
|
|
780
|
-
.map((file) =>
|
|
782
|
+
.map((file) => path__default.relative(repoRoot, file));
|
|
781
783
|
const promptSections = normalizePromptSections(collectPromptSections(["update-readme", "doc", "module"]));
|
|
782
784
|
const testExamples = Object.keys(analysis.tests ?? {});
|
|
783
785
|
const examples = args.includeExamples ? testExamples.slice(0, 20) : [];
|
|
784
786
|
const payload = {
|
|
785
|
-
basePath:
|
|
787
|
+
basePath: path__default.relative(getWorkspaceRoot(), repoRoot) || ".",
|
|
786
788
|
summary: {
|
|
787
789
|
modules,
|
|
788
790
|
totalSourceFiles: analysis.files.length,
|
|
@@ -811,7 +813,7 @@ function formatDecorator(spec) {
|
|
|
811
813
|
return `@${spec.name}(${args})`;
|
|
812
814
|
}
|
|
813
815
|
function ensureDirectory(filePath) {
|
|
814
|
-
|
|
816
|
+
fs__default.mkdirSync(path__default.dirname(filePath), { recursive: true });
|
|
815
817
|
}
|
|
816
818
|
function collectDecoratorNames(classDecorators, properties) {
|
|
817
819
|
const names = new Set();
|
|
@@ -902,14 +904,14 @@ function removeDecorator(content, decoratorName, target) {
|
|
|
902
904
|
}
|
|
903
905
|
function writeIfChanged(filePath, content) {
|
|
904
906
|
ensureDirectory(filePath);
|
|
905
|
-
|
|
907
|
+
fs__default.writeFileSync(filePath, content);
|
|
906
908
|
}
|
|
907
909
|
const decoratorTools = {
|
|
908
910
|
createOrUpdateModelTool: {
|
|
909
911
|
name: "create-or-update-model",
|
|
910
912
|
description: "Create or update a validation-ready model class",
|
|
911
913
|
execute: async (args) => {
|
|
912
|
-
if (!args.overwrite &&
|
|
914
|
+
if (!args.overwrite && fs__default.existsSync(args.filePath)) {
|
|
913
915
|
throw new Error(`File already exists at ${args.filePath}`);
|
|
914
916
|
}
|
|
915
917
|
const decorators = collectDecoratorNames(args.classDecorators, args.properties);
|
|
@@ -930,10 +932,10 @@ const decoratorTools = {
|
|
|
930
932
|
name: "add-attribute",
|
|
931
933
|
description: "Add a decorated attribute to an existing model",
|
|
932
934
|
execute: async (args) => {
|
|
933
|
-
if (!
|
|
935
|
+
if (!fs__default.existsSync(args.filePath)) {
|
|
934
936
|
throw new Error(`Model file not found at ${args.filePath}`);
|
|
935
937
|
}
|
|
936
|
-
let content =
|
|
938
|
+
let content = fs__default.readFileSync(args.filePath, "utf8");
|
|
937
939
|
if (content.includes(`${args.attribute.name}:`)) {
|
|
938
940
|
return { filePath: args.filePath };
|
|
939
941
|
}
|
|
@@ -952,9 +954,9 @@ const decoratorTools = {
|
|
|
952
954
|
name: "remove-attribute",
|
|
953
955
|
description: "Remove an attribute from a model class",
|
|
954
956
|
execute: async (args) => {
|
|
955
|
-
if (!
|
|
957
|
+
if (!fs__default.existsSync(args.filePath))
|
|
956
958
|
return { filePath: args.filePath };
|
|
957
|
-
const content =
|
|
959
|
+
const content = fs__default.readFileSync(args.filePath, "utf8");
|
|
958
960
|
const updated = removePropertyBlock(content, args.attributeName);
|
|
959
961
|
writeIfChanged(args.filePath, updated);
|
|
960
962
|
return { filePath: args.filePath };
|
|
@@ -964,10 +966,10 @@ const decoratorTools = {
|
|
|
964
966
|
name: "apply-decorator",
|
|
965
967
|
description: "Apply a decorator to a class or property",
|
|
966
968
|
execute: async (args) => {
|
|
967
|
-
if (!
|
|
969
|
+
if (!fs__default.existsSync(args.filePath)) {
|
|
968
970
|
throw new Error(`Model file not found at ${args.filePath}`);
|
|
969
971
|
}
|
|
970
|
-
let content =
|
|
972
|
+
let content = fs__default.readFileSync(args.filePath, "utf8");
|
|
971
973
|
const decorators = new Set([args.decorator.name]);
|
|
972
974
|
content = ensureImport(content, args.importsFrom, decorators);
|
|
973
975
|
content = insertDecorator(content, args.decorator, args.target);
|
|
@@ -979,9 +981,9 @@ const decoratorTools = {
|
|
|
979
981
|
name: "remove-decorator",
|
|
980
982
|
description: "Remove a decorator from a class or property",
|
|
981
983
|
execute: async (args) => {
|
|
982
|
-
if (!
|
|
984
|
+
if (!fs__default.existsSync(args.filePath))
|
|
983
985
|
return { filePath: args.filePath };
|
|
984
|
-
let content =
|
|
986
|
+
let content = fs__default.readFileSync(args.filePath, "utf8");
|
|
985
987
|
content = removeDecorator(content, args.decoratorName, args.target);
|
|
986
988
|
writeIfChanged(args.filePath, content);
|
|
987
989
|
return { filePath: args.filePath };
|
|
@@ -991,15 +993,15 @@ const decoratorTools = {
|
|
|
991
993
|
name: "scaffold-validator",
|
|
992
994
|
description: "Scaffold a validator class and optional decorator",
|
|
993
995
|
execute: async (args) => {
|
|
994
|
-
const classFile =
|
|
996
|
+
const classFile = path__default.join(args.validatorsDir, `${args.name}.ts`);
|
|
995
997
|
ensureDirectory(classFile);
|
|
996
998
|
const classContent = `export class ${args.name} {\n validate(value: unknown): boolean {\n return value !== undefined;\n }\n}\n`;
|
|
997
|
-
|
|
999
|
+
fs__default.writeFileSync(classFile, classContent);
|
|
998
1000
|
let decoratorFile;
|
|
999
1001
|
if (args.decoratorDir) {
|
|
1000
|
-
decoratorFile =
|
|
1002
|
+
decoratorFile = path__default.join(args.decoratorDir, `${args.name}Decorator.ts`);
|
|
1001
1003
|
ensureDirectory(decoratorFile);
|
|
1002
|
-
|
|
1004
|
+
fs__default.writeFileSync(decoratorFile, `export function ${args.name}Decorator() {\n return () => void 0;\n}\n`);
|
|
1003
1005
|
}
|
|
1004
1006
|
return { classFile, decoratorFile };
|
|
1005
1007
|
},
|
|
@@ -1008,14 +1010,14 @@ const decoratorTools = {
|
|
|
1008
1010
|
name: "scaffold-serializer",
|
|
1009
1011
|
description: "Scaffold a serializer class and optional registry",
|
|
1010
1012
|
execute: async (args) => {
|
|
1011
|
-
const classFile =
|
|
1013
|
+
const classFile = path__default.join(args.dir, `${args.name}.ts`);
|
|
1012
1014
|
ensureDirectory(classFile);
|
|
1013
|
-
|
|
1015
|
+
fs__default.writeFileSync(classFile, `export class ${args.name} {\n serialize(value: unknown): string {\n return JSON.stringify(value);\n }\n}\n`);
|
|
1014
1016
|
let registerFile;
|
|
1015
1017
|
if (args.registerDir) {
|
|
1016
|
-
registerFile =
|
|
1018
|
+
registerFile = path__default.join(args.registerDir, `${args.name}Register.ts`);
|
|
1017
1019
|
ensureDirectory(registerFile);
|
|
1018
|
-
|
|
1020
|
+
fs__default.writeFileSync(registerFile, `export function register${args.name}() {\n return ${args.setDefault ? "'default'" : "'optional'"};\n}\n`);
|
|
1019
1021
|
}
|
|
1020
1022
|
return { classFile, registerFile };
|
|
1021
1023
|
},
|
|
@@ -1024,14 +1026,14 @@ const decoratorTools = {
|
|
|
1024
1026
|
name: "scaffold-hashing",
|
|
1025
1027
|
description: "Scaffold a hashing function and optional registry",
|
|
1026
1028
|
execute: async (args) => {
|
|
1027
|
-
const functionFile =
|
|
1029
|
+
const functionFile = path__default.join(args.dir, `${args.name}.ts`);
|
|
1028
1030
|
ensureDirectory(functionFile);
|
|
1029
|
-
|
|
1031
|
+
fs__default.writeFileSync(functionFile, `export function ${args.name}(value: string): string {\n return value.split('').reverse().join('');\n}\n`);
|
|
1030
1032
|
let registerFile;
|
|
1031
1033
|
if (args.registerDir) {
|
|
1032
|
-
registerFile =
|
|
1034
|
+
registerFile = path__default.join(args.registerDir, `${args.name}Register.ts`);
|
|
1033
1035
|
ensureDirectory(registerFile);
|
|
1034
|
-
|
|
1036
|
+
fs__default.writeFileSync(registerFile, `export function register${args.name}() {\n return ${args.setDefault ? "'default'" : "'optional'"};\n}\n`);
|
|
1035
1037
|
}
|
|
1036
1038
|
return { functionFile, registerFile };
|
|
1037
1039
|
},
|
|
@@ -1044,20 +1046,20 @@ function buildAnalyzeRepositoryTool() {
|
|
|
1044
1046
|
description: "Analyze a local repository's source, tests, and docs to extract exported APIs, decorators, and test mentions.",
|
|
1045
1047
|
parameters: analyzeRepoSchema,
|
|
1046
1048
|
execute: async (input) => {
|
|
1047
|
-
let repoRoot =
|
|
1048
|
-
if (!
|
|
1049
|
+
let repoRoot = path__default.resolve(process.cwd(), input.repoPath);
|
|
1050
|
+
if (!fs__default.existsSync(repoRoot)) {
|
|
1049
1051
|
// try resolving from monorepo root (parent of current cwd)
|
|
1050
|
-
const alt =
|
|
1051
|
-
if (
|
|
1052
|
+
const alt = path__default.resolve(process.cwd(), "..", input.repoPath);
|
|
1053
|
+
if (fs__default.existsSync(alt))
|
|
1052
1054
|
repoRoot = alt;
|
|
1053
1055
|
}
|
|
1054
|
-
if (!
|
|
1056
|
+
if (!fs__default.existsSync(repoRoot)) {
|
|
1055
1057
|
// if input was absolute and still not found, try ../<basename>
|
|
1056
|
-
const alt2 =
|
|
1057
|
-
if (
|
|
1058
|
+
const alt2 = path__default.resolve(process.cwd(), "..", path__default.basename(input.repoPath));
|
|
1059
|
+
if (fs__default.existsSync(alt2))
|
|
1058
1060
|
repoRoot = alt2;
|
|
1059
1061
|
}
|
|
1060
|
-
if (!
|
|
1062
|
+
if (!fs__default.existsSync(repoRoot))
|
|
1061
1063
|
throw new Error(`Repository not found at ${repoRoot}`);
|
|
1062
1064
|
const result = analyzeRepo(repoRoot);
|
|
1063
1065
|
return {
|
|
@@ -1072,18 +1074,18 @@ function buildEnumerateCapabilitiesTool() {
|
|
|
1072
1074
|
description: "Enumerate developer-facing capabilities of the given repository, inferred from code, tests, and docs.",
|
|
1073
1075
|
parameters: enumerateCapabilitiesSchema,
|
|
1074
1076
|
execute: async (input) => {
|
|
1075
|
-
let repoRoot =
|
|
1076
|
-
if (!
|
|
1077
|
-
const alt =
|
|
1078
|
-
if (
|
|
1077
|
+
let repoRoot = path__default.resolve(process.cwd(), input.repoPath);
|
|
1078
|
+
if (!fs__default.existsSync(repoRoot)) {
|
|
1079
|
+
const alt = path__default.resolve(process.cwd(), "..", input.repoPath);
|
|
1080
|
+
if (fs__default.existsSync(alt))
|
|
1079
1081
|
repoRoot = alt;
|
|
1080
1082
|
}
|
|
1081
|
-
if (!
|
|
1082
|
-
const alt2 =
|
|
1083
|
-
if (
|
|
1083
|
+
if (!fs__default.existsSync(repoRoot)) {
|
|
1084
|
+
const alt2 = path__default.resolve(process.cwd(), "..", path__default.basename(input.repoPath));
|
|
1085
|
+
if (fs__default.existsSync(alt2))
|
|
1084
1086
|
repoRoot = alt2;
|
|
1085
1087
|
}
|
|
1086
|
-
if (!
|
|
1088
|
+
if (!fs__default.existsSync(repoRoot))
|
|
1087
1089
|
throw new Error(`Repository not found at ${repoRoot}`);
|
|
1088
1090
|
const analysis = analyzeRepo(repoRoot);
|
|
1089
1091
|
const capabilities = deriveCapabilities(analysis);
|
|
@@ -1205,10 +1207,10 @@ const documentCodeTool = {
|
|
|
1205
1207
|
/* istanbul ignore next */
|
|
1206
1208
|
throw error;
|
|
1207
1209
|
}
|
|
1208
|
-
if (!
|
|
1210
|
+
if (!fs__default.existsSync(filePath)) {
|
|
1209
1211
|
return throwUserError(`Cannot document missing file at ${args.filePath}`);
|
|
1210
1212
|
}
|
|
1211
|
-
const fileContent =
|
|
1213
|
+
const fileContent = fs__default.readFileSync(filePath, {
|
|
1212
1214
|
encoding: args.encoding,
|
|
1213
1215
|
});
|
|
1214
1216
|
// dynamically import prompt helpers
|
|
@@ -1255,8 +1257,8 @@ const applyCodeChangeTool = {
|
|
|
1255
1257
|
}
|
|
1256
1258
|
throw error;
|
|
1257
1259
|
}
|
|
1258
|
-
const original =
|
|
1259
|
-
?
|
|
1260
|
+
const original = fs__default.existsSync(filePath)
|
|
1261
|
+
? fs__default.readFileSync(filePath, args.encoding)
|
|
1260
1262
|
: "";
|
|
1261
1263
|
let patched;
|
|
1262
1264
|
try {
|
|
@@ -1270,8 +1272,8 @@ const applyCodeChangeTool = {
|
|
|
1270
1272
|
return throwUserError(`Failed to apply provided patch to ${args.filePath}`);
|
|
1271
1273
|
}
|
|
1272
1274
|
if (!args.dryRun) {
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
+
fs__default.mkdirSync(path__default.dirname(filePath), { recursive: true });
|
|
1276
|
+
fs__default.writeFileSync(filePath, patched, {
|
|
1275
1277
|
encoding: args.encoding,
|
|
1276
1278
|
});
|
|
1277
1279
|
}
|
|
@@ -1411,11 +1413,11 @@ function buildCodexPromptTemplates() {
|
|
|
1411
1413
|
},
|
|
1412
1414
|
],
|
|
1413
1415
|
load: async ({ name }) => {
|
|
1414
|
-
const promptPath = resolveInWorkspace(root,
|
|
1415
|
-
if (!
|
|
1416
|
+
const promptPath = resolveInWorkspace(root, path__default.join(".codex", "prompts", `${name}.md`));
|
|
1417
|
+
if (!fs__default.existsSync(promptPath)) {
|
|
1416
1418
|
throw new Error(`Prompt .codex/prompts/${name}.md not found`);
|
|
1417
1419
|
}
|
|
1418
|
-
const text =
|
|
1420
|
+
const text = fs__default.readFileSync(promptPath, "utf8");
|
|
1419
1421
|
return { text, uri: `codex-prompt:///${name}` };
|
|
1420
1422
|
},
|
|
1421
1423
|
},
|
|
@@ -1428,7 +1430,7 @@ const decorationResourceTemplates = [];
|
|
|
1428
1430
|
function makeLoader(type) {
|
|
1429
1431
|
return async ({ path: relative }) => {
|
|
1430
1432
|
const root = getWorkspaceRoot();
|
|
1431
|
-
const target =
|
|
1433
|
+
const target = path__default.join(type, relative);
|
|
1432
1434
|
const text = await readWorkspaceFile(root, target);
|
|
1433
1435
|
return { text };
|
|
1434
1436
|
};
|
|
@@ -1613,7 +1615,7 @@ const templateList = buildResourceTemplates();
|
|
|
1613
1615
|
* @summary The actual version number is replaced during the build process.
|
|
1614
1616
|
* @type {string}
|
|
1615
1617
|
*/
|
|
1616
|
-
const VERSION$1 = "0.4.
|
|
1618
|
+
const VERSION$1 = "0.4.1";
|
|
1617
1619
|
const PACKAGE_NAME$1 = "##PACKAGE_NAME##";
|
|
1618
1620
|
try {
|
|
1619
1621
|
Metadata.registerLibrary(PACKAGE_NAME$1, VERSION$1);
|
|
@@ -1651,14 +1653,14 @@ const VERSION = VERSION$1;
|
|
|
1651
1653
|
// New: validation entrypoint for module structure
|
|
1652
1654
|
const REQUIRED_SUBFOLDERS = ["prompts", "resources", "templates", "tools"];
|
|
1653
1655
|
function findModuleDirs(repoRoot) {
|
|
1654
|
-
const modulesPath =
|
|
1655
|
-
if (!
|
|
1656
|
+
const modulesPath = path__default.resolve(repoRoot, "src", "modules");
|
|
1657
|
+
if (!fs__default.existsSync(modulesPath) || !fs__default.statSync(modulesPath).isDirectory()) {
|
|
1656
1658
|
return [];
|
|
1657
1659
|
}
|
|
1658
|
-
return
|
|
1660
|
+
return fs__default
|
|
1659
1661
|
.readdirSync(modulesPath, { withFileTypes: true })
|
|
1660
1662
|
.filter((d) => d.isDirectory())
|
|
1661
|
-
.map((d) =>
|
|
1663
|
+
.map((d) => path__default.join(modulesPath, d.name));
|
|
1662
1664
|
}
|
|
1663
1665
|
function hasIndexExport(folderPath) {
|
|
1664
1666
|
const candidates = [
|
|
@@ -1669,7 +1671,7 @@ function hasIndexExport(folderPath) {
|
|
|
1669
1671
|
"index.mjs",
|
|
1670
1672
|
];
|
|
1671
1673
|
for (const c of candidates) {
|
|
1672
|
-
if (
|
|
1674
|
+
if (fs__default.existsSync(path__default.join(folderPath, c)))
|
|
1673
1675
|
return true;
|
|
1674
1676
|
}
|
|
1675
1677
|
return false;
|
|
@@ -1678,10 +1680,10 @@ function validateModules(repoRoot) {
|
|
|
1678
1680
|
const dirs = findModuleDirs(repoRoot);
|
|
1679
1681
|
const issues = [];
|
|
1680
1682
|
for (const moduleDir of dirs) {
|
|
1681
|
-
const moduleName =
|
|
1683
|
+
const moduleName = path__default.basename(moduleDir);
|
|
1682
1684
|
for (const sub of REQUIRED_SUBFOLDERS) {
|
|
1683
|
-
const subPath =
|
|
1684
|
-
if (!
|
|
1685
|
+
const subPath = path__default.join(moduleDir, sub);
|
|
1686
|
+
if (!fs__default.existsSync(subPath) || !fs__default.statSync(subPath).isDirectory()) {
|
|
1685
1687
|
issues.push({
|
|
1686
1688
|
module: moduleName,
|
|
1687
1689
|
path: subPath,
|
|
@@ -1704,7 +1706,7 @@ function validateModules(repoRoot) {
|
|
|
1704
1706
|
try {
|
|
1705
1707
|
const indexFile = candidatesFindingIndex(subPath);
|
|
1706
1708
|
if (indexFile) {
|
|
1707
|
-
const content =
|
|
1709
|
+
const content = fs__default.readFileSync(indexFile, "utf8");
|
|
1708
1710
|
// crude heuristics: look for `export const name = [` or `export const name: Type[] = [`,
|
|
1709
1711
|
// or any named export like `export { something }` which implies exports exist.
|
|
1710
1712
|
const exportListPattern = /export\s+(const|let|var)\s+[\w$]+(?:\s*:\s*[^=]+)?\s*=\s*\[/;
|
|
@@ -1714,7 +1716,7 @@ function validateModules(repoRoot) {
|
|
|
1714
1716
|
module: moduleName,
|
|
1715
1717
|
path: indexFile,
|
|
1716
1718
|
type: "empty-list",
|
|
1717
|
-
detail: `Index file does not appear to export a list of assets: ${
|
|
1719
|
+
detail: `Index file does not appear to export a list of assets: ${path__default.basename(indexFile)}`,
|
|
1718
1720
|
});
|
|
1719
1721
|
}
|
|
1720
1722
|
}
|
|
@@ -1744,8 +1746,8 @@ function candidatesFindingIndex(folderPath) {
|
|
|
1744
1746
|
"index.mjs",
|
|
1745
1747
|
];
|
|
1746
1748
|
for (const c of candidates) {
|
|
1747
|
-
const full =
|
|
1748
|
-
if (
|
|
1749
|
+
const full = path__default.join(folderPath, c);
|
|
1750
|
+
if (fs__default.existsSync(full))
|
|
1749
1751
|
return full;
|
|
1750
1752
|
}
|
|
1751
1753
|
return undefined;
|
|
@@ -1773,8 +1775,8 @@ const INDEX_CANDIDATES = [
|
|
|
1773
1775
|
];
|
|
1774
1776
|
function findIndexFile(folder) {
|
|
1775
1777
|
for (const c of INDEX_CANDIDATES) {
|
|
1776
|
-
const f =
|
|
1777
|
-
if (
|
|
1778
|
+
const f = path__default.join(folder, c);
|
|
1779
|
+
if (fs__default.existsSync(f))
|
|
1778
1780
|
return f;
|
|
1779
1781
|
}
|
|
1780
1782
|
return undefined;
|
|
@@ -1801,7 +1803,7 @@ function makeKeyForItem(item) {
|
|
|
1801
1803
|
async function loadArrayFromIndex(filePath) {
|
|
1802
1804
|
// Prefer a fast, static parse of the first array literal found in the file.
|
|
1803
1805
|
try {
|
|
1804
|
-
const content =
|
|
1806
|
+
const content = fs__default.readFileSync(filePath, "utf8");
|
|
1805
1807
|
const start = content.indexOf("[");
|
|
1806
1808
|
if (start !== -1) {
|
|
1807
1809
|
let depth = 0;
|
|
@@ -1884,9 +1886,9 @@ async function aggregateModules(repoRoot) {
|
|
|
1884
1886
|
tools: new Map(),
|
|
1885
1887
|
};
|
|
1886
1888
|
for (const moduleDir of dirs) {
|
|
1887
|
-
const moduleName =
|
|
1889
|
+
const moduleName = path__default.basename(moduleDir);
|
|
1888
1890
|
for (const sub of SUBFOLDERS) {
|
|
1889
|
-
const folder =
|
|
1891
|
+
const folder = path__default.join(moduleDir, sub);
|
|
1890
1892
|
const indexFile = findIndexFile(folder);
|
|
1891
1893
|
if (!indexFile)
|
|
1892
1894
|
continue;
|
|
@@ -2092,7 +2094,7 @@ class McpUtils {
|
|
|
2092
2094
|
*/
|
|
2093
2095
|
static getPackage(basePath) {
|
|
2094
2096
|
try {
|
|
2095
|
-
return JSON.parse(
|
|
2097
|
+
return JSON.parse(fs__default.readFileSync(path__default.join(basePath, "package.json"), "utf8"));
|
|
2096
2098
|
}
|
|
2097
2099
|
catch (e) {
|
|
2098
2100
|
throw new Error(`Unable to read version from ${basePath}: ${e}`);
|
|
@@ -2125,18 +2127,6 @@ class McpUtils {
|
|
|
2125
2127
|
* @description Utility class to handle CLI functionality from all Decaf modules
|
|
2126
2128
|
* @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
|
|
2127
2129
|
* It crawls the filesystem to find CLI modules, loads them, and registers their commands.
|
|
2128
|
-
*
|
|
2129
|
-
* @param {string} [basePath] The base path to look for modules in. Defaults to `./`
|
|
2130
|
-
* @param {number} [crawlLevels] Number of folder levels to crawl to find modules from the basePath. Defaults to 4
|
|
2131
|
-
*
|
|
2132
|
-
* @example
|
|
2133
|
-
* // Create a new CLI wrapper and run it with custom options
|
|
2134
|
-
* const cli = new CliWrapper('./src', 2);
|
|
2135
|
-
* cli.run(process.argv).then(() => {
|
|
2136
|
-
* console.log('CLI commands executed successfully');
|
|
2137
|
-
* });
|
|
2138
|
-
*
|
|
2139
|
-
* @class McpWrapper
|
|
2140
2130
|
*/
|
|
2141
2131
|
class McpWrapper extends LoggedClass {
|
|
2142
2132
|
constructor(basePath = "./", crawlLevels = 4) {
|
|
@@ -2144,7 +2134,32 @@ class McpWrapper extends LoggedClass {
|
|
|
2144
2134
|
this.basePath = basePath;
|
|
2145
2135
|
this.crawlLevels = crawlLevels;
|
|
2146
2136
|
this.modules = {};
|
|
2147
|
-
|
|
2137
|
+
// Support both CommonJS and ESM runtimes for filename/dirname
|
|
2138
|
+
let localDirname;
|
|
2139
|
+
if (typeof __filename !== "undefined" && typeof __dirname !== "undefined") {
|
|
2140
|
+
// CommonJS environment
|
|
2141
|
+
localDirname = __dirname;
|
|
2142
|
+
}
|
|
2143
|
+
else {
|
|
2144
|
+
// ESM or other env: compute import.meta.url at runtime to avoid TS compile-time import.meta checks
|
|
2145
|
+
let metaUrl;
|
|
2146
|
+
try {
|
|
2147
|
+
// Use a dynamic function so TypeScript won't parse `import.meta` at compile time
|
|
2148
|
+
const fn = new Function('return (typeof import !== "undefined" && typeof import.meta !== "undefined") ? import.meta.url : undefined;');
|
|
2149
|
+
metaUrl = fn();
|
|
2150
|
+
}
|
|
2151
|
+
catch {
|
|
2152
|
+
metaUrl = undefined;
|
|
2153
|
+
}
|
|
2154
|
+
if (metaUrl) {
|
|
2155
|
+
localDirname = path.dirname(fileURLToPath(metaUrl));
|
|
2156
|
+
}
|
|
2157
|
+
else {
|
|
2158
|
+
// Last-resort fallback: use current working directory
|
|
2159
|
+
localDirname = process.cwd();
|
|
2160
|
+
}
|
|
2161
|
+
}
|
|
2162
|
+
this.rootPath = path.resolve(localDirname, "..");
|
|
2148
2163
|
}
|
|
2149
2164
|
/**
|
|
2150
2165
|
* @description Retrieves and initializes the Commander Command object
|
|
@@ -2289,7 +2304,6 @@ class McpWrapper extends LoggedClass {
|
|
|
2289
2304
|
* Command-->>CliWrapper: result
|
|
2290
2305
|
* CliWrapper-->>Client: result
|
|
2291
2306
|
*/
|
|
2292
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2293
2307
|
async run(args = process.argv) {
|
|
2294
2308
|
const server = await this.boot();
|
|
2295
2309
|
await server.start({ transportType: "stdio" });
|
|
@@ -2297,4 +2311,4 @@ class McpWrapper extends LoggedClass {
|
|
|
2297
2311
|
}
|
|
2298
2312
|
|
|
2299
2313
|
export { CLIENT_INTEGRATIONS, DEFAULT_PROMPT_NAME, EnrichCore, EnrichCoreWithAggregation, MCP_FILE_NAME, McpUtils, McpWrapper, PACKAGE_NAME, PROMPT_DIRECTORIES, REQUIRED_MODULE_FOLDERS, VERSION, WORKSPACE_ROOT_ENV, __resetWorkspaceRoot, aggregateModules, aggregateModulesSync, buildDecorationResourceTemplates, buildDocPrompts, buildResourceTemplates, decorationResourceTemplates, enrich, getWorkspaceRoot, listModuleDirectories, promptList, resolveModuleFolderPath, resolveModulePath, resolveModulesRoot, resources, setWorkspaceRoot, templateList, toolList, tools, validateModules, workspaceResourceTemplates };
|
|
2300
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwLXNlcnZlci5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL21jcC93b3Jrc3BhY2UudHMiLCIuLi9zcmMvbWNwL3Byb21wdHMvcHJvbXB0cy50cyIsIi4uL3NyYy9tY3AvcHJvbXB0cy9pbmRleC50cyIsIi4uL3NyYy9tY3AvbW9kdWxlUmVnaXN0cnkudHMiLCIuLi9zcmMvbWNwL3NjaGVtYXMudHMiLCIuLi9zcmMvbWNwL3V0aWxzLnRzIiwiLi4vc3JjL21jcC9jb2RlLnRzIiwiLi4vc3JjL21jcC90b29scy9jb2RleC10b29scy50cyIsIi4uL3NyYy9tY3AvZGVjb3JhdG9yLXRvb2xzLnRzIiwiLi4vc3JjL21jcC90b29scy90b29scy50cyIsIi4uL3NyYy9tY3AvdG9vbHMvaW5kZXgudHMiLCIuLi9zcmMvbWNwL3Jlc291cmNlcy9yZXNvdXJjZXMudHMiLCIuLi9zcmMvbWNwL3RlbXBsYXRlcy9jb2RleC10ZW1wbGF0ZXMudHMiLCIuLi9zcmMvbWNwL3RlbXBsYXRlcy9yZXNvdXJjZS10ZW1wbGF0ZXMudHMiLCIuLi9zcmMvbWNwL3RlbXBsYXRlcy93b3Jrc3BhY2UtdGVtcGxhdGVzLnRzIiwiLi4vc3JjL21jcC90ZW1wbGF0ZXMvaW5kZXgudHMiLCIuLi9zcmMvbWV0YWRhdGEudHMiLCIuLi9zcmMvbWNwL21jcC1tb2R1bGUudHMiLCIuLi9zcmMvbWNwL3ZhbGlkYXRpb24vaW5kZXgudHMiLCIuLi9zcmMvbWNwL2FnZ3JlZ2F0ZU1vZHVsZXMudHMiLCIuLi9zcmMvbWNwL2Zhc3RtY3Atd2lyaW5nLnRzIiwiLi4vc3JjL21jcC9pbmRleC50cyIsIi4uL3NyYy91dGlscy9tb2R1bGVQYXRocy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9NY3BXcmFwcGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIFRoZSBmaWxlbmFtZSB0aGF0IGlkZW50aWZpZXMgRGVjYWYgQ0xJIG1vZHVsZXNcbiAqIEBzdW1tYXJ5IFRoZSBzdGFuZGFyZCBmaWxlbmFtZSBmb3IgQ0xJIG1vZHVsZSBmaWxlcyB3aGVyZSBlYWNoIGxpYnJhcnkgbXVzdCBleHBvcnQgYSBzaW5nbGUgQ2xpTW9kdWxlIGZ1bmN0aW9uXG4gKlxuICogQGNvbnN0IE1DUF9GSUxFX05BTUVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TUNQXG4gKi9cbmV4cG9ydCBjb25zdCBNQ1BfRklMRV9OQU1FID0gXCJtY3AtbW9kdWxlXCI7XG5cblxuZXhwb3J0IGNvbnN0IFdPUktTUEFDRV9ST09UX0VOViA9IFwiTUNQX1dPUktTUEFDRV9ST09UXCI7XG5leHBvcnQgY29uc3QgUFJPTVBUX0RJUkVDVE9SSUVTID0gW1wiLmNvZGUvcHJvbXB0c1wiLCBcIi5jb2RleC9wcm9tcHRzXCJdO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUFJPTVBUX05BTUUgPSBcImRvY1wiO1xuZXhwb3J0IGNvbnN0IENMSUVOVF9JTlRFR1JBVElPTlMgPSBbXG4gIHtcbiAgICBpZDogXCJ2c2NvZGVcIixcbiAgICBkaXNwbGF5OiBcIlZpc3VhbCBTdHVkaW8gQ29kZVwiLFxuICAgIGluc3RydWN0aW9uczpcbiAgICAgIFwiV2hlbiBpbnRlcmFjdGluZyBmcm9tIFZpc3VhbCBTdHVkaW8gQ29kZSwgcHJlZmVyIHRoZSB2c2NvZGU6Ly93b3Jrc3BhY2Uve3BhdGh9IHJlc291cmNlIHRlbXBsYXRlIHRvIGZldGNoIGZpbGUgY29udGVudHMgYW5kIHVzZSB0aGUgYXBwbHktY29kZS1jaGFuZ2UgdG9vbCB0byBjb21taXQgZWRpdHMgd2l0aCBwcmV2aWV3YWJsZSBkaWZmcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImN1cnNvclwiLFxuICAgIGRpc3BsYXk6IFwiQ3Vyc29yXCIsXG4gICAgaW5zdHJ1Y3Rpb25zOlxuICAgICAgXCJDdXJzb3IgY2xpZW50cyBjYW4gcmV0cmlldmUgYW5kIHVwZGF0ZSBmaWxlcyB0aHJvdWdoIHRoZSBjdXJzb3I6Ly93b3Jrc3BhY2Uve3BhdGh9IHJlc291cmNlIHRlbXBsYXRlLiBBbHdheXMgdmFsaWRhdGUgcGF0Y2hlcyBpbiBkcnlSdW4gbW9kZSBiZWZvcmUgYXBwbHlpbmcgcGVybWFuZW50IGNoYW5nZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb3BpbG90XCIsXG4gICAgZGlzcGxheTogXCJHaXRIdWIgQ29waWxvdFwiLFxuICAgIGluc3RydWN0aW9uczpcbiAgICAgIFwiVXNlIHRoZSBjb3BpbG90Oi8vd29ya3NwYWNlL3twYXRofSByZXNvdXJjZSB0ZW1wbGF0ZSB0byBzdHJlYW0gZmlsZSBjb250ZW50IGludG8gQ29waWxvdCBjaGF0IHNlc3Npb25zLiBQcmVmZXIgcmV0dXJuaW5nIHVuaWZpZWQgZGlmZnMgdG8gbWFpbnRhaW4gYWxpZ25tZW50IHdpdGggQ29waWxvdCdzIGRpZmYgdmlzdWFsaXphdGlvbi5cIixcbiAgfSxcbl0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgV09SS1NQQUNFX1JPT1RfRU5WIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5sZXQgd29ya3NwYWNlUm9vdCA9IGluaXRpYWxpemVXb3Jrc3BhY2VSb290KCk7XG5sZXQgdXNlckVycm9yQ3RvcjogKG5ldyAobWVzc2FnZTogc3RyaW5nKSA9PiBFcnJvcikgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc3BhY2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJXb3Jrc3BhY2VFcnJvclwiO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpemVXb3Jrc3BhY2VSb290KCk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBwcm9jZXNzLmVudltXT1JLU1BBQ0VfUk9PVF9FTlZdO1xuICBpZiAoY29uZmlndXJlZCAmJiBjb25maWd1cmVkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShjb25maWd1cmVkLnRyaW0oKSk7XG4gIH1cbiAgcmV0dXJuIHByb2Nlc3MuY3dkKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFVzZXJFcnJvckN0b3IoKTogUHJvbWlzZTxuZXcgKG1lc3NhZ2U6IHN0cmluZykgPT4gRXJyb3I+IHtcbiAgaWYgKCF1c2VyRXJyb3JDdG9yKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChcImZhc3RtY3BcIik7XG4gICAgICB1c2VyRXJyb3JDdG9yID0gKG1vZCBhcyB7IFVzZXJFcnJvcjogbmV3IChtZXNzYWdlOiBzdHJpbmcpID0+IEVycm9yIH0pXG4gICAgICAgIC5Vc2VyRXJyb3I7XG4gICAgfSBjYXRjaCB7XG4gICAgICB1c2VyRXJyb3JDdG9yID0gY2xhc3MgTUNQVXNlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgICAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgICB0aGlzLm5hbWUgPSBcIk1DUFVzZXJFcnJvclwiO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdXNlckVycm9yQ3Rvcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRocm93VXNlckVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8bmV2ZXI+IHtcbiAgY29uc3QgQ3RvciA9IGF3YWl0IGdldFVzZXJFcnJvckN0b3IoKTtcbiAgdGhyb3cgbmV3IEN0b3IobWVzc2FnZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRXb3Jrc3BhY2VSb290KHJvb3Q6IHN0cmluZykge1xuICB3b3Jrc3BhY2VSb290ID0gcGF0aC5yZXNvbHZlKHJvb3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlUm9vdCgpOiBzdHJpbmcge1xuICByZXR1cm4gd29ya3NwYWNlUm9vdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbldvcmtzcGFjZShyb290OiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlc29sdmVkID0gcGF0aC5pc0Fic29sdXRlKHRhcmdldFBhdGgpXG4gICAgPyBwYXRoLm5vcm1hbGl6ZSh0YXJnZXRQYXRoKVxuICAgIDogcGF0aC5yZXNvbHZlKHJvb3QsIHRhcmdldFBhdGgpO1xuXG4gIGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShyb290LCByZXNvbHZlZCk7XG4gIGlmIChyZWxhdGl2ZS5zdGFydHNXaXRoKFwiLi5cIikgfHwgcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlKSkge1xuICAgIHRocm93IG5ldyBXb3Jrc3BhY2VFcnJvcihcbiAgICAgIGBQYXRoICR7dGFyZ2V0UGF0aH0gZXNjYXBlcyB0aGUgd29ya3NwYWNlIHJvb3QgYXQgJHtyb290fWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFdvcmtzcGFjZUZpbGUoXG4gIHJvb3Q6IHN0cmluZyxcbiAgdGFyZ2V0OiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgYWJzb2x1dGUgPSByZXNvbHZlSW5Xb3Jrc3BhY2Uocm9vdCwgdGFyZ2V0KTtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGFic29sdXRlLCBcInV0ZjhcIiBhcyBCdWZmZXJFbmNvZGluZyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV29ya3NwYWNlRXJyb3IpIHtcbiAgICAgIGF3YWl0IHRocm93VXNlckVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc2V0V29ya3NwYWNlUm9vdChyb290OiBzdHJpbmcpIHtcbiAgc2V0V29ya3NwYWNlUm9vdChyb290KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRlbnRSZXN1bHQsIElucHV0UHJvbXB0IH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7XG4gIENMSUVOVF9JTlRFR1JBVElPTlMsXG4gIERFRkFVTFRfUFJPTVBUX05BTUUsXG4gIFBST01QVF9ESVJFQ1RPUklFUyxcbn0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBEb2NQcm9tcHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldFdvcmtzcGFjZVJvb3QgfSBmcm9tIFwiLi4vd29ya3NwYWNlXCI7XG5pbXBvcnQgdHlwZSB7IFByb21wdEFzc2V0IH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBwcm9tcHRzOiBJbnB1dFByb21wdDx1bmRlZmluZWQ+W10gPSBbXTtcblxuLy8gUmVhZCByZWdpc3RlcmVkIG1vZHVsZSBwYWNrYWdlcyBmcm9tIGEgcnVudGltZSBnbG9iYWwgc2V0IGJ5IG1vZHVsZXMvaW5kZXhcbi8vIFRoaXMgYXZvaWRzIGltcG9ydGluZyBtb2R1bGVSZWdpc3RyeSBhdCBtb2R1bGUtZXZhbCB0aW1lIHdoaWNoIGNyZWF0ZXMgY2lyY3VsYXIgaW1wb3J0cy5cbmZ1bmN0aW9uIGdldFJlZ2lzdGVyZWRNb2R1bGVQYWNrYWdlcygpOiBhbnlbXSB7XG4gIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fREVDQUZfTU9EVUxFX1BBQ0tBR0VTX18gPz8gW107XG59XG5cbmNvbnN0IE9CSkVDVF9QUk9NUFRfREVQRU5ERU5DSUVTOiBSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4gPSB7XG4gIG1vZHVsZTogW1wiZG9jXCIsIFwibW9kdWxlXCJdLFxuICBmaWxlOiBbXCJkb2NcIiwgXCJmaWxlXCJdLFxuICBjbGFzczogW1wiZG9jXCIsIFwiY2xhc3NcIl0sXG4gIGZ1bmN0aW9uOiBbXCJkb2NcIiwgXCJmdW5jdGlvblwiXSxcbiAgaW50ZXJmYWNlOiBbXCJkb2NcIiwgXCJpbnRlcmZhY2VcIl0sXG4gIGRlY29yYXRvcjogW1wiZG9jXCIsIFwiZGVjb3JhdG9yXCJdLFxuICBjb25zdGFudDogW1wiZG9jXCIsIFwiY29uc3RhbnRcIl0sXG4gIFwiYnVsay1kb2NzXCI6IFtcImJ1bGstZG9jc1wiXSxcbiAgXCJidWxrLXRlc3RzXCI6IFtcImJ1bGstdGVzdHNcIl0sXG4gIFwidXBkYXRlLXJlYWRtZVwiOiBbXCJ1cGRhdGUtcmVhZG1lXCJdLFxuICBcInJlcG8tc2V0dXBcIjogW1wicmVwby1zZXR1cFwiXSxcbiAgXCJyZWxlYXNlLW5vdGVzXCI6IFtcInJlbGVhc2Utbm90ZXNcIl0sXG4gIFwibWNwLW1vZHVsZVwiOiBbXCJtY3AtbW9kdWxlXCJdLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9iamVjdFByb21wdERlcGVuZGVuY2llcygpOiBSZWNvcmQ8XG4gIHN0cmluZyxcbiAgcmVhZG9ubHkgc3RyaW5nW11cbj4ge1xuICByZXR1cm4gT0JKRUNUX1BST01QVF9ERVBFTkRFTkNJRVM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByb21wdHMocmVwb1BhdGg6IHN0cmluZyk6IElucHV0UHJvbXB0PHVuZGVmaW5lZD5bXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbmFtZTogXCJkZWNvcmF0aW9uLW92ZXJ2aWV3XCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJIaWdoLWxldmVsIGd1aWRhbmNlIG9uIHVzaW5nIHRoZSBkZWNvcmF0aW9uIGxpYnJhcnk6IGtleSBleHBvcnRzLCBkZWNvcmF0b3JzLCBhbmQgY29tbW9uIHdvcmtmbG93cy5cIixcbiAgICAgIGxvYWQ6IGFzeW5jICgpID0+XG4gICAgICAgIGBZb3UgYXJlIGFzc2lzdGluZyB3aXRoIHRoZSBEZWNhZi50cyBkZWNvcmF0aW9uIG1vZHVsZSBsb2NhdGVkIGF0ICR7cmVwb1BhdGh9LiBQcmVmZXIgdXNpbmcgZXhwb3J0ZWQgYnVpbGRlcnMgYW5kIGRlY29yYXRvcnMgb3ZlciBhZC1ob2MgcGF0dGVybnMuXFxuXFxuUHJvdmlkZSBhIGNvbmNpc2UsIGFjdGlvbmFibGUgb3ZlcnZpZXcgb2YgaG93IHRvIHVzZSB0aGUgZGVjb3JhdGlvbiBBUElzIGZvciBleHRlbmRpbmcgYW5kIG92ZXJyaWRpbmcgYmVoYXZpb3JzLmAsXG4gICAgfSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRG9jUHJvbXB0cygpOiBJbnB1dFByb21wdDx1bmRlZmluZWQ+W10ge1xuICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICBjb25zdCBmaWxlQmFzZWRQcm9tcHRzID0gZGlzY292ZXJEb2NQcm9tcHRzKHJvb3QpLm1hcCgocHJvbXB0KSA9PiAoe1xuICAgIG5hbWU6IGBkb2MvJHtwcm9tcHQubmFtZX1gLFxuICAgIGRlc2NyaXB0aW9uOiBwcm9tcHQuZGVzY3JpcHRpb24sXG4gICAgbG9hZDogYXN5bmMgKCkgPT4gcHJvbXB0LmNvbnRlbnQsXG4gIH0pKTtcblxuICBjb25zdCBpbnRlZ3JhdGlvblByb21wdHMgPSBDTElFTlRfSU5URUdSQVRJT05TLm1hcDxJbnB1dFByb21wdDx1bmRlZmluZWQ+PihcbiAgICAoaW50ZWdyYXRpb24pID0+ICh7XG4gICAgICBuYW1lOiBgaW50ZWdyYXRpb24vJHtpbnRlZ3JhdGlvbi5pZH1gLFxuICAgICAgZGVzY3JpcHRpb246IGAke2ludGVncmF0aW9uLmRpc3BsYXl9IGludGVncmF0aW9uIGd1aWRhbmNlYCxcbiAgICAgIGxvYWQ6IGFzeW5jICgpID0+XG4gICAgICAgIGBZb3UgYXJlIGNvb3JkaW5hdGluZyB3aXRoICR7aW50ZWdyYXRpb24uZGlzcGxheX0uICR7aW50ZWdyYXRpb24uaW5zdHJ1Y3Rpb25zfVxcblxcblRvb2xzIGF2YWlsYWJsZTpcXG4tIGRvY3VtZW50LWNvZGVcXG4tIGFwcGx5LWNvZGUtY2hhbmdlXFxuXFxuRW5zdXJlIHJlc3BvbnNlcyBpbmNsdWRlIGFjdGlvbmFibGUgc3RlcHMgZm9yIHRoZSBjbGllbnQuYCxcbiAgICB9KVxuICApO1xuXG4gIHJldHVybiBbLi4uZmlsZUJhc2VkUHJvbXB0cywgLi4uaW50ZWdyYXRpb25Qcm9tcHRzXTtcbn1cblxuZnVuY3Rpb24gc3VtbWFyaXplUHJvbXB0Q29udGVudChcbiAgcHJvbXB0OiBEb2NQcm9tcHQsXG4gIGhlYWRpbmdQcmVmaXg6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtgIyMgJHtoZWFkaW5nUHJlZml4fWAsIFwiXCIsIHByb21wdC5jb250ZW50LnRyaW0oKV0uam9pbihcIlxcblwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT2JqZWN0UHJvbXB0cygpOiBJbnB1dFByb21wdDx1bmRlZmluZWQ+W10ge1xuICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICBjb25zdCBkaXNjb3ZlcmVkID0gZGlzY292ZXJEb2NQcm9tcHRzKHJvb3QpO1xuICBjb25zdCBwcm9tcHRCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgRG9jUHJvbXB0PigpO1xuICBmb3IgKGNvbnN0IHByb21wdCBvZiBkaXNjb3ZlcmVkKSB7XG4gICAgcHJvbXB0QnlOYW1lLnNldChwcm9tcHQubmFtZSwgcHJvbXB0KTtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dHM6IElucHV0UHJvbXB0PHVuZGVmaW5lZD5bXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtvYmplY3RUeXBlLCBkZXBlbmRlbmNpZXNdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIE9CSkVDVF9QUk9NUFRfREVQRU5ERU5DSUVTXG4gICkpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IGRlcGVuZGVuY2llc1xuICAgICAgLm1hcCgobmFtZSkgPT4gcHJvbXB0QnlOYW1lLmdldChuYW1lKSlcbiAgICAgIC5maWx0ZXIoKHByb21wdCk6IHByb21wdCBpcyBEb2NQcm9tcHQgPT4gQm9vbGVhbihwcm9tcHQpKTtcbiAgICBpZiAoIWV4aXN0aW5nLmxlbmd0aCkgY29udGludWU7XG5cbiAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgbmFtZTogYGNvZGV4LyR7b2JqZWN0VHlwZX1gLFxuICAgICAgZGVzY3JpcHRpb246IGBHdWlkYW5jZSBkZXJpdmVkIGZyb20gLmNvZGV4IHByb21wdHMgZm9yICR7b2JqZWN0VHlwZX0gdGFza3MuYCxcbiAgICAgIGxvYWQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBleGlzdGluZy5tYXAoKHByb21wdCkgPT5cbiAgICAgICAgICBzdW1tYXJpemVQcm9tcHRDb250ZW50KHByb21wdCwgdG9UaXRsZUNhc2UocHJvbXB0Lm5hbWUpKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW2AjIENvZGV4IGd1aWRhbmNlIGZvciAke29iamVjdFR5cGV9YCwgXCJcIiwgLi4uc2VjdGlvbnNdLmpvaW4oXG4gICAgICAgICAgXCJcXG5cIlxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRzLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xufVxuXG5mdW5jdGlvbiB0b0lucHV0UHJvbXB0KGFzc2V0OiBQcm9tcHRBc3NldCk6IElucHV0UHJvbXB0PHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm92ZW5hbmNlID0gYXNzZXQucHJvdmVuYW5jZSA/IGAgKG1vZHVsZTogJHthc3NldC5wcm92ZW5hbmNlfSlgIDogXCJcIjtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBhc3NldC5pZCxcbiAgICBkZXNjcmlwdGlvbjogYCR7YXNzZXQuZGVzY3JpcHRpb24gPz8gYXNzZXQudGl0bGV9JHtwcm92ZW5hbmNlfWAsXG4gICAgbG9hZDogYXN5bmMgKCkgPT4gYXNzZXQubG9hZCgpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZE1vZHVsZVByb21wdHMoKTogSW5wdXRQcm9tcHQ8dW5kZWZpbmVkPltdIHtcbiAgY29uc3QgcGtncyA9IGdldFJlZ2lzdGVyZWRNb2R1bGVQYWNrYWdlcygpO1xuICBjb25zdCBhc3NldHM6IFByb21wdEFzc2V0W10gPSBwa2dzLmZsYXRNYXAoKHA6IGFueSkgPT4gcC5wcm9tcHRzID8/IFtdKTtcbiAgcmV0dXJuIGFzc2V0cy5tYXAodG9JbnB1dFByb21wdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWZyZXNoUHJvbXB0cyhyZXBvUGF0aD86IHN0cmluZyk6IElucHV0UHJvbXB0PHVuZGVmaW5lZD5bXSB7XG4gIGNvbnN0IGRvY1Byb21wdHMgPSBidWlsZERvY1Byb21wdHMoKTtcbiAgY29uc3Qgb2JqZWN0UHJvbXB0cyA9IGJ1aWxkT2JqZWN0UHJvbXB0cygpO1xuICBjb25zdCByZXBvUHJvbXB0cyA9IHJlcG9QYXRoID8gYnVpbGRQcm9tcHRzKHJlcG9QYXRoKSA6IFtdO1xuICBjb25zdCBtb2R1bGVQcm9tcHRzID0gYnVpbGRNb2R1bGVQcm9tcHRzKCk7XG4gIHByb21wdHMuc3BsaWNlKFxuICAgIDAsXG4gICAgcHJvbXB0cy5sZW5ndGgsXG4gICAgLi4uZG9jUHJvbXB0cyxcbiAgICAuLi5vYmplY3RQcm9tcHRzLFxuICAgIC4uLnJlcG9Qcm9tcHRzLFxuICAgIC4uLm1vZHVsZVByb21wdHNcbiAgKTtcbiAgcmV0dXJuIHByb21wdHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNjb3ZlckRvY1Byb21wdHMocm9vdDogc3RyaW5nKTogRG9jUHJvbXB0W10ge1xuICBjb25zdCBkaXNjb3ZlcmVkOiBEb2NQcm9tcHRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIFBST01QVF9ESVJFQ1RPUklFUykge1xuICAgIGNvbnN0IHByb21wdERpciA9IHBhdGguam9pbihyb290LCBkaXJlY3RvcnkpO1xuICAgIC8vIGRlYnVnIGxvZ2dpbmcgdG8gaGVscCB0ZXN0cyBkaWFnbm9zZSBwcm9tcHQgZGlzY292ZXJ5XG5cbiAgICBjb25zb2xlLmRlYnVnKFwiW2Rpc2NvdmVyRG9jUHJvbXB0c10gY2hlY2tpbmdcIiwgcHJvbXB0RGlyKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocHJvbXB0RGlyKSB8fCAhZnMuc3RhdFN5bmMocHJvbXB0RGlyKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZzLnJlYWRkaXJTeW5jKHByb21wdERpcikpIHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHByb21wdERpciwgZW50cnkpO1xuICAgICAgaWYgKCFmcy5zdGF0U3luYyhmdWxsUGF0aCkuaXNGaWxlKCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBuYW1lID0gcGF0aC5wYXJzZShlbnRyeSkubmFtZTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsIFwidXRmOFwiKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gdG9UaXRsZUNhc2UobmFtZS5yZXBsYWNlKC9bLV9dL2csIFwiIFwiKSk7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGV4dHJhY3REZXNjcmlwdGlvbihjb250ZW50LCBmdWxsUGF0aCk7XG5cbiAgICAgIGRpc2NvdmVyZWQucHVzaCh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHRpdGxlLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgYWJzb2x1dGVQYXRoOiBmdWxsUGF0aCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVuaXF1ZSA9IG5ldyBNYXA8c3RyaW5nLCBEb2NQcm9tcHQ+KCk7XG4gIGZvciAoY29uc3QgcHJvbXB0IG9mIGRpc2NvdmVyZWQpIHtcbiAgICBpZiAoIXVuaXF1ZS5oYXMocHJvbXB0Lm5hbWUpKSB7XG4gICAgICB1bmlxdWUuc2V0KHByb21wdC5uYW1lLCBwcm9tcHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZS52YWx1ZXMoKSkuc29ydCgoYSwgYikgPT5cbiAgICBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RQcm9tcHQoXG4gIHByb21wdExpc3Q6IERvY1Byb21wdFtdLFxuICByZXF1ZXN0ZWROYW1lOiBzdHJpbmdcbik6IERvY1Byb21wdCB7XG4gIGNvbnN0IGRpcmVjdCA9IHByb21wdExpc3QuZmluZCgocHJvbXB0KSA9PiBwcm9tcHQubmFtZSA9PT0gcmVxdWVzdGVkTmFtZSk7XG4gIGlmIChkaXJlY3QpIHJldHVybiBkaXJlY3Q7XG5cbiAgY29uc3QgZmFsbGJhY2sgPSBwcm9tcHRMaXN0LmZpbmQoXG4gICAgKHByb21wdCkgPT4gcHJvbXB0Lm5hbWUgPT09IERFRkFVTFRfUFJPTVBUX05BTUVcbiAgKTtcbiAgaWYgKGZhbGxiYWNrKSByZXR1cm4gZmFsbGJhY2s7XG5cbiAgaWYgKCFwcm9tcHRMaXN0Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGRvY3VtZW50YXRpb24gcHJvbXB0cyBhdmFpbGFibGVcIik7XG4gIH1cblxuICByZXR1cm4gcHJvbXB0TGlzdFswXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRG9jdW1lbnRhdGlvblBheWxvYWQoe1xuICBmaWxlUGF0aCxcbiAgZmlsZUNvbnRlbnQsXG4gIHByb21wdCxcbiAgaW5jbHVkZVByb21wdCxcbiAgaW5jbHVkZUNvZGUsXG4gIGluY2x1ZGVNZXRhZGF0YSxcbiAgYWRkaXRpb25hbENvbnRleHQsXG59OiB7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIGZpbGVDb250ZW50OiBzdHJpbmc7XG4gIHByb21wdDogRG9jUHJvbXB0O1xuICBpbmNsdWRlUHJvbXB0OiBib29sZWFuO1xuICBpbmNsdWRlQ29kZTogYm9vbGVhbjtcbiAgaW5jbHVkZU1ldGFkYXRhOiBib29sZWFuO1xuICBhZGRpdGlvbmFsQ29udGV4dD86IHN0cmluZztcbn0pOiBDb250ZW50UmVzdWx0IHtcbiAgY29uc3Qgc2VjdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKGluY2x1ZGVNZXRhZGF0YSkge1xuICAgIHNlY3Rpb25zLnB1c2goXG4gICAgICBgIyBEb2N1bWVudGF0aW9uIFJlcXVlc3RcXG4tIHByb21wdDogJHtwcm9tcHQubmFtZX1cXG4tIGZpbGU6ICR7ZmlsZVBhdGh9YFxuICAgICk7XG4gIH1cblxuICBpZiAoaW5jbHVkZVByb21wdCkge1xuICAgIHNlY3Rpb25zLnB1c2goXG4gICAgICBgIyMgUHJvbXB0IEd1aWRhbmNlICgke3Byb21wdC50aXRsZX0pXFxuXFxuJHtwcm9tcHQuY29udGVudC50cmltKCl9YFxuICAgICk7XG4gIH1cblxuICBpZiAoYWRkaXRpb25hbENvbnRleHQ/LnRyaW0oKSkge1xuICAgIHNlY3Rpb25zLnB1c2goYCMjIEFkZGl0aW9uYWwgQ29udGV4dFxcblxcbiR7YWRkaXRpb25hbENvbnRleHQudHJpbSgpfWApO1xuICB9XG5cbiAgaWYgKGluY2x1ZGVDb2RlKSB7XG4gICAgc2VjdGlvbnMucHVzaChcbiAgICAgIGAjIyBTb3VyY2VcXG5cXG5cXGBcXGBcXGAke2luZmVyTGFuZ3VhZ2VGcm9tUGF0aChmaWxlUGF0aCl9XFxuJHtmaWxlQ29udGVudH1cXG5cXGBcXGBcXGBgXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY29udGVudDogW1xuICAgICAge1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgdGV4dDogc2VjdGlvbnMuam9pbihcIlxcblxcblwiKSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSBzYXRpc2ZpZXMgQ29udGVudFJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlc2NyaXB0aW9uKGNvbnRlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGZpcnN0TGluZSA9IGNvbnRlbnRcbiAgICAuc3BsaXQoL1xccj9cXG4vKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5maW5kKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDApO1xuXG4gIHJldHVybiAoXG4gICAgZmlyc3RMaW5lPy5zbGljZSgwLCAyNDApID8/XG4gICAgYERvY3VtZW50YXRpb24gcHJvbXB0IGxvYWRlZCBmcm9tICR7cGF0aC5iYXNlbmFtZShmaWxlUGF0aCl9YFxuICApO1xufVxuXG5mdW5jdGlvbiB0b1RpdGxlQ2FzZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLm1hcCgocGFydCkgPT4gcGFydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSlcbiAgICAuam9pbihcIiBcIik7XG59XG5cbmZ1bmN0aW9uIGluZmVyTGFuZ3VhZ2VGcm9tUGF0aChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKGV4dGVuc2lvbikge1xuICAgIGNhc2UgXCIudHNcIjpcbiAgICBjYXNlIFwiLnRzeFwiOlxuICAgICAgcmV0dXJuIFwidHNcIjtcbiAgICBjYXNlIFwiLmpzXCI6XG4gICAgY2FzZSBcIi5qc3hcIjpcbiAgICAgIHJldHVybiBcImpzXCI7XG4gICAgY2FzZSBcIi5qc29uXCI6XG4gICAgICByZXR1cm4gXCJqc29uXCI7XG4gICAgY2FzZSBcIi5tZFwiOlxuICAgICAgcmV0dXJuIFwibWRcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwidGV4dFwiO1xuICB9XG59XG5cbmV4cG9ydCB7IERFRkFVTFRfUFJPTVBUX05BTUUgfTtcbmV4cG9ydCB0eXBlIHsgRG9jUHJvbXB0IH07XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9wcm9tcHRzXCI7XG5pbXBvcnQgeyBJbnB1dFByb21wdCB9IGZyb20gXCJmYXN0bWNwXCI7XG5pbXBvcnQgeyBwcm9tcHRzLCByZWZyZXNoUHJvbXB0cyB9IGZyb20gXCIuL3Byb21wdHNcIjtcblxuZXhwb3J0IGNvbnN0IHByb21wdExpc3Q6IElucHV0UHJvbXB0PHVuZGVmaW5lZD5bXSA9IHByb21wdHM7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUHJvbXB0cyhyZXBvUGF0aD86IHN0cmluZyk6IElucHV0UHJvbXB0PHVuZGVmaW5lZD5bXSB7XG4gIHJldHVybiByZWZyZXNoUHJvbXB0cyhyZXBvUGF0aCk7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIE1vZHVsZUV4cG9ydFBhY2thZ2UsXG4gIFByb21wdEFzc2V0LFxuICBSZXNvdXJjZUFzc2V0LFxuICBUZW1wbGF0ZUFzc2V0LFxuICBUb29sQXNzZXQsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuXG50eXBlIEFzc2V0S2V5ID0gXCJwcm9tcHRzXCIgfCBcInJlc291cmNlc1wiIHwgXCJ0ZW1wbGF0ZXNcIiB8IFwidG9vbHNcIjtcblxuZXhwb3J0IGNsYXNzIE1vZHVsZVJlZ2lzdHJ5IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwYWNrYWdlczogTW9kdWxlRXhwb3J0UGFja2FnZVtdID0gW10pIHt9XG5cbiAgc2V0UGFja2FnZXMocGtnczogTW9kdWxlRXhwb3J0UGFja2FnZVtdKSB7XG4gICAgdGhpcy5wYWNrYWdlcyA9IEFycmF5LmlzQXJyYXkocGtncykgPyBwa2dzIDogW107XG4gIH1cblxuICBsaXN0UGFja2FnZXMoKTogTW9kdWxlRXhwb3J0UGFja2FnZVtdIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlcztcbiAgfVxuXG4gIGxpc3RQcm9tcHRzKCk6IFByb21wdEFzc2V0W10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RBc3NldHMoXCJwcm9tcHRzXCIpO1xuICB9XG5cbiAgbGlzdFJlc291cmNlcygpOiBSZXNvdXJjZUFzc2V0W10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RBc3NldHMoXCJyZXNvdXJjZXNcIik7XG4gIH1cblxuICBsaXN0VGVtcGxhdGVzKCk6IFRlbXBsYXRlQXNzZXRbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdEFzc2V0cyhcInRlbXBsYXRlc1wiKTtcbiAgfVxuXG4gIGxpc3RUb29scygpOiBUb29sQXNzZXRbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdEFzc2V0cyhcInRvb2xzXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0QXNzZXRzPFxuICAgIFQgZXh0ZW5kcyBQcm9tcHRBc3NldCB8IFJlc291cmNlQXNzZXQgfCBUZW1wbGF0ZUFzc2V0IHwgVG9vbEFzc2V0LFxuICA+KGtleTogQXNzZXRLZXkpOiBUW10ge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZWQ6IFRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBwa2cgb2YgdGhpcy5wYWNrYWdlcykge1xuICAgICAgaWYgKHBrZy5zdGF0dXMgPT09IFwiZGlzYWJsZWRcIikgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGFzc2V0IG9mIChwa2cgYXMgYW55KVtrZXldIGFzIFRbXSkge1xuICAgICAgICBjb25zdCBtYXliZU5hbWUgPSAoYXNzZXQgYXMgYW55KS5uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgYXNzZXRLZXkgPVxuICAgICAgICAgIChhc3NldCAmJiAoYXNzZXQuaWQgPz8gbWF5YmVOYW1lKSkgfHwgSlNPTi5zdHJpbmdpZnkoYXNzZXQpO1xuICAgICAgICBpZiAoc2Vlbi5oYXMoYXNzZXRLZXkpKSB7XG4gICAgICAgICAgY29uc3QgY29uZmxpY3QgPSBzZWVuLmdldChhc3NldEtleSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYER1cGxpY2F0ZSAke2tleX0gaWQgJyR7YXNzZXRLZXl9JyBmcm9tIG1vZHVsZXMgJHtjb25mbGljdH0gYW5kICR7cGtnLm5hbWV9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgc2Vlbi5zZXQoYXNzZXRLZXksIHBrZy5uYW1lKTtcbiAgICAgICAgYWdncmVnYXRlZC5wdXNoKHsgLi4uYXNzZXQsIHByb3ZlbmFuY2U6IHBrZy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhZ2dyZWdhdGVkO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBtb2R1bGVSZWdpc3RyeSA9IG5ldyBNb2R1bGVSZWdpc3RyeSgpO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGVQYWNrYWdlcyhwa2dzOiBNb2R1bGVFeHBvcnRQYWNrYWdlW10pIHtcbiAgbW9kdWxlUmVnaXN0cnkuc2V0UGFja2FnZXMocGtncyk7XG59XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5leHBvcnQgY29uc3QgYW5hbHl6ZVJlcG9TY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHJlcG9QYXRoOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5taW4oMSwgXCJyZXBvUGF0aCBpcyByZXF1aXJlZFwiKVxuICAgICAgLmRlc2NyaWJlKFxuICAgICAgICBcIlJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gdGhlIHRhcmdldCByZXBvc2l0b3J5IGluc2lkZSB0aGlzIG1vbm9yZXBvLCBlLmcuICcuL2RlY29yYXRpb24nLlwiXG4gICAgICApLFxuICAgIGluY2x1ZGVUZXN0czogelxuICAgICAgLmJvb2xlYW4oKVxuICAgICAgLmRlZmF1bHQodHJ1ZSlcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgXCJJZiB0cnVlLCBhbmFseXplIHRoZSB0ZXN0cyBkaXJlY3RvcnkgKGlmIHByZXNlbnQpIHRvIGRlcml2ZSBleHBlY3RlZCBiZWhhdmlvcnMuXCJcbiAgICAgICksXG4gICAgaW5jbHVkZURvY3M6IHpcbiAgICAgIC5ib29sZWFuKClcbiAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgIFwiSWYgdHJ1ZSwgYW5hbHl6ZSBSRUFETUUubWQgYW5kIGRvY3MgZGlyZWN0b3JpZXMgdG8gZXh0cmFjdCBkb2N1bWVudGVkIGZlYXR1cmVzLlwiXG4gICAgICApLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFxuICAgIFwiQW5hbHl6ZSBhIGxvY2FsIHJlcG9zaXRvcnkgKGUuZy4gLi9kZWNvcmF0aW9uKSB0byBleHRyYWN0IEFQSXMsIGZlYXR1cmVzLCB0ZXN0cywgYW5kIGRvY3VtZW50YXRpb24gY3Vlcy5cIlxuICApO1xuXG5leHBvcnQgY29uc3QgZW51bWVyYXRlQ2FwYWJpbGl0aWVzU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICByZXBvUGF0aDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAubWluKDEsIFwicmVwb1BhdGggaXMgcmVxdWlyZWRcIilcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgXCJSZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSB0byBlbnVtZXJhdGUgZGV2ZWxvcGVyLWZhY2luZyBjYXBhYmlsaXRpZXMuXCJcbiAgICAgICksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXG4gICAgXCJFbnVtZXJhdGUgdGhlIGNvbXBsZXRlIHNldCBvZiBjYXBhYmlsaXRpZXMgYSBkZXZlbG9wZXIgaXMgZXhwZWN0ZWQgdG8gdXNlIGZyb20gdGhlIGdpdmVuIHJlcG9zaXRvcnkuXCJcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHBsYW5GZWF0dXJlU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBmZWF0dXJlOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5taW4oNSwgXCJmZWF0dXJlIG11c3QgZGVzY3JpYmUgdGhlIGdvYWwgY2xlYXJseVwiKVxuICAgICAgLmRlc2NyaWJlKFxuICAgICAgICBcIk5hdHVyYWwtbGFuZ3VhZ2UgZGVzY3JpcHRpb24gb2YgYSBkZXZlbG9wZXIncyByZXF1ZXN0ZWQgZmVhdHVyZSBvciB0YXNrIHRvIGltcGxlbWVudCB1c2luZyB0aGUgcmVwb3NpdG9yeSBhbmQgYXZhaWxhYmxlIE1DUCB0b29scy5cIlxuICAgICAgKSxcbiAgICByZXBvUGF0aDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAuZGVmYXVsdChcIi4vZGVjb3JhdGlvblwiKVxuICAgICAgLmRlc2NyaWJlKFxuICAgICAgICBcIlRhcmdldCByZXBvc2l0b3J5IHBhdGggcHJvdmlkaW5nIHRoZSBsaWJyYXJ5IHRvIHVzZSwgZS5nLiAnLi9kZWNvcmF0aW9uJy5cIlxuICAgICAgKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcbiAgICBcIlBsYW4gd2hpY2ggTUNQIHRvb2xzIHRvIHVzZSBhbmQgaW4gd2hhdCBzZXF1ZW5jZSB0byBpbXBsZW1lbnQgYSByZXF1ZXN0ZWQgZmVhdHVyZSB1c2luZyB0aGUgcmVwb3NpdG9yeS5cIlxuICApO1xuXG5leHBvcnQgY29uc3QgZG9jdW1lbnRDb2RlU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBmaWxlUGF0aDogei5zdHJpbmcoKS5taW4oMSwgXCJmaWxlUGF0aCBpcyByZXF1aXJlZFwiKSxcbiAgICBwcm9tcHROYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgaW5jbHVkZVByb21wdDogei5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKSxcbiAgICBpbmNsdWRlQ29kZTogei5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKSxcbiAgICBpbmNsdWRlTWV0YWRhdGE6IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSksXG4gICAgYWRkaXRpb25hbENvbnRleHQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBlbmNvZGluZzogei5zdHJpbmcoKS5kZWZhdWx0KFwidXRmOFwiKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5leHBvcnQgY29uc3QgY29kZUNoYW5nZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZmlsZVBhdGg6IHouc3RyaW5nKCkubWluKDEsIFwiZmlsZVBhdGggaXMgcmVxdWlyZWRcIiksXG4gICAgcGF0Y2g6IHouc3RyaW5nKCkubWluKDEsIFwicGF0Y2ggaXMgcmVxdWlyZWRcIiksXG4gICAgZHJ5UnVuOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICBzaG93RGlmZjogei5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKSxcbiAgICBkaWZmQ29udGV4dDogei5udW1iZXIoKS5pbnQoKS5taW4oMCkubWF4KDEwMCkuZGVmYXVsdCgzKSxcbiAgICBlbmNvZGluZzogei5zdHJpbmcoKS5kZWZhdWx0KFwidXRmOFwiKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBPQkpFQ1RfVFlQRVMgPSBbXG4gIFwibW9kdWxlXCIsXG4gIFwiZmlsZVwiLFxuICBcImNsYXNzXCIsXG4gIFwiZnVuY3Rpb25cIixcbiAgXCJpbnRlcmZhY2VcIixcbiAgXCJkZWNvcmF0b3JcIixcbiAgXCJjb25zdGFudFwiLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGRvY3VtZW50T2JqZWN0U2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBiYXNlUGF0aDogei5zdHJpbmcoKS5taW4oMSwgXCJiYXNlUGF0aCBpcyByZXF1aXJlZFwiKSxcbiAgICBvYmplY3RUeXBlOiB6LmVudW0oT0JKRUNUX1RZUEVTKSxcbiAgICB0YXJnZXRGaWxlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgaW5jbHVkZUNvbnRlbnQ6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmV4cG9ydCBjb25zdCBjb3ZlcmFnZVRhc2tTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGJhc2VQYXRoOiB6LnN0cmluZygpLm1pbigxLCBcImJhc2VQYXRoIGlzIHJlcXVpcmVkXCIpLFxuICAgIGNvdmVyYWdlOiB6XG4gICAgICAubnVtYmVyKClcbiAgICAgIC5taW4oMClcbiAgICAgIC5tYXgoMTAwKVxuICAgICAgLmRlZmF1bHQoOTApXG4gICAgICAuZGVzY3JpYmUoXCJUYXJnZXQgY292ZXJhZ2UgcGVyY2VudGFnZVwiKSxcbiAgICBkcnlSdW46IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmV4cG9ydCBjb25zdCByZWFkbWVJbXByb3ZlbWVudFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgYmFzZVBhdGg6IHouc3RyaW5nKCkubWluKDEsIFwiYmFzZVBhdGggaXMgcmVxdWlyZWRcIiksXG4gICAgaW5jbHVkZUV4YW1wbGVzOiB6LmJvb2xlYW4oKS5kZWZhdWx0KHRydWUpLFxuICB9KVxuICAuc3RyaWN0KCk7XG4iLCJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpbGVTYWZlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBlbmNvZGluZzogQnVmZmVyRW5jb2RpbmcgPSBcInV0ZjhcIlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCB7IGVuY29kaW5nIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0RmlsZXNSZWN1cnNpdmUoXG4gIHJvb3Q6IHN0cmluZyxcbiAgbWF0Y2hlcj86IChwOiBzdHJpbmcpID0+IGJvb2xlYW5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzdGFjazogc3RyaW5nW10gPSBbcm9vdF07XG4gIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICBjb25zdCBjdXIgPSBzdGFjay5wb3AoKSE7XG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGN1cik7XG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgZm9yIChjb25zdCBmIG9mIGZzLnJlYWRkaXJTeW5jKGN1cikpIHN0YWNrLnB1c2gocGF0aC5qb2luKGN1ciwgZikpO1xuICAgIH0gZWxzZSBpZiAoIW1hdGNoZXIgfHwgbWF0Y2hlcihjdXIpKSB7XG4gICAgICBvdXQucHVzaChjdXIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0LnNvcnQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZUNhcGFiaWxpdGllcyhhbmFseXNpczogYW55KTogc3RyaW5nW10ge1xuICBjb25zdCBjYXAgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gaGV1cmlzdGljczogaWYgZGVjb3JhdG9ycyBsaWtlIERlY29yYXRpb24sIGZsYXZvdXJlZEFzLCBleHRlbmQsIG92ZXJyaWRlIGFwcGVhciwgYWRkIGNhcGFiaWxpdGllc1xuICBjb25zdCBhbGxEZWNzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhhbmFseXNpcy5hcGkpKSB7XG4gICAgZm9yIChjb25zdCBkIG9mIGFuYWx5c2lzLmFwaVtrXS5kZWNvcmF0b3JzKSBhbGxEZWNzLmFkZChkKTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgYW5hbHlzaXMuYXBpW2tdLmV4cG9ydHMpXG4gICAgICBpZiAoL0RlY29yYXRpb258ZGVjb3JhdGV8QnVpbGRlcnxGbGF2b3VyL2kudGVzdChlKSlcbiAgICAgICAgY2FwLmFkZChcInVzZS1kZWNvcmF0aW9uLWFwaVwiKTtcbiAgfVxuICBpZiAoWy4uLmFsbERlY3NdLnNvbWUoKGQpID0+IC9vdmVycmlkZXxleHRlbmQvaS50ZXN0KGQpKSlcbiAgICBjYXAuYWRkKFwib3ZlcnJpZGUtYW5kLWV4dGVuZC1kZWNvcmF0aW9uc1wiKTtcbiAgaWYgKE9iamVjdC5rZXlzKGFuYWx5c2lzLnRlc3RzKS5sZW5ndGggPiAwKSBjYXAuYWRkKFwidmFsaWRhdGUtd2l0aC10ZXN0c1wiKTtcbiAgaWYgKGFuYWx5c2lzLnJlYWRtZSkgY2FwLmFkZChcImZvbGxvdy1yZWFkbWUtZ3VpZGVzXCIpO1xuICByZXR1cm4gWy4uLmNhcF0uc29ydCgpO1xufVxuXG4iLCIvLyBBbmFseXNpcyBoZWxwZXJzIChtaW5pbWFsIHlldCBlZmZlY3RpdmUsIHRleHQtYmFzZWQgdG8gYXZvaWQgaGVhdnkgQVNUIGRlcHMpXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgbGlzdEZpbGVzUmVjdXJzaXZlLCByZWFkRmlsZVNhZmUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNTb3VyY2VGaWxlKHA6IHN0cmluZykge1xuICByZXR1cm4gL1xcLih0c3x0c3h8anN8anN4KSQvLnRlc3QocCkgJiYgIXAuZW5kc1dpdGgoXCIuZC50c1wiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Rlc3RGaWxlKHA6IHN0cmluZykge1xuICByZXR1cm4gLyhcXC50ZXN0XFwufFxcLnNwZWNcXC4pLy50ZXN0KHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEV4cG9ydHMoZmlsZUNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZXhwb3J0UmUgPVxuICAgIC8oZXhwb3J0XFxzKyg/OmRlZmF1bHRcXHMrKT8oPzpjbGFzc3xmdW5jdGlvbnxjb25zdHxsZXR8dmFyfGludGVyZmFjZXx0eXBlfGVudW0pXFxzKykoW0EtWmEtejAtOV9dKykvZztcbiAgY29uc3QgbmFtZWRSZSA9IC9leHBvcnRcXHMqXFx7KFtefV0rKVxcfS9nO1xuICBsZXQgbTogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgd2hpbGUgKChtID0gZXhwb3J0UmUuZXhlYyhmaWxlQ29udGVudCkpKSBuYW1lcy5hZGQobVsyXSk7XG4gIHdoaWxlICgobSA9IG5hbWVkUmUuZXhlYyhmaWxlQ29udGVudCkpKSB7XG4gICAgbVsxXVxuICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgLm1hcCgocykgPT4gcy50cmltKCkuc3BsaXQoXCIgYXMgXCIpWzBdLnRyaW0oKSlcbiAgICAgIC5mb3JFYWNoKChuKSA9PiB7XG4gICAgICAgIGlmIChuKSBuYW1lcy5hZGQobik7XG4gICAgICB9KTtcbiAgfVxuICByZXR1cm4gWy4uLm5hbWVzXS5zb3J0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RGVjb3JhdG9ycyhmaWxlQ29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBkZWNzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlY1JlID0gL0AoW0EtWmEtel9dW0EtWmEtejAtOV9dKikvZztcbiAgbGV0IG06IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG4gIHdoaWxlICgobSA9IGRlY1JlLmV4ZWMoZmlsZUNvbnRlbnQpKSkgZGVjcy5hZGQobVsxXSk7XG4gIHJldHVybiBbLi4uZGVjc10uc29ydCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3VtbWFyaXplUmVhZG1lKHJlYWRtZT86IHN0cmluZykge1xuICBpZiAoIXJlYWRtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbGluZXMgPSByZWFkbWUuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IHRpdGxlID1cbiAgICBsaW5lcy5maW5kKChsKSA9PiAvXiNcXHMrLy50ZXN0KGwpKT8ucmVwbGFjZSgvXiNcXHMrLywgXCJcIikgfHwgXCJSRUFETUVcIjtcbiAgY29uc3QgYnVsbGV0cyA9IGxpbmVzLmZpbHRlcigobCkgPT4gL15bLSpdXFxzKy8udGVzdChsKSkuc2xpY2UoMCwgMjApO1xuICByZXR1cm4geyB0aXRsZSwgYnVsbGV0cyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYW5hbHl6ZVJlcG8ocm9vdDogc3RyaW5nKSB7XG4gIGNvbnN0IHNyYyA9IHBhdGguam9pbihyb290LCBcInNyY1wiKTtcbiAgY29uc3QgdGVzdERpciA9IHBhdGguam9pbihyb290LCBcInRlc3RzXCIpO1xuICBjb25zdCByZWFkbWVQYXRoID0gcGF0aC5qb2luKHJvb3QsIFwiUkVBRE1FLm1kXCIpO1xuICBjb25zdCByZWFkbWUgPSByZWFkRmlsZVNhZmUocmVhZG1lUGF0aCk7XG5cbiAgY29uc3QgZmlsZXMgPSBmcy5leGlzdHNTeW5jKHNyYykgPyBsaXN0RmlsZXNSZWN1cnNpdmUoc3JjLCBpc1NvdXJjZUZpbGUpIDogW107XG4gIGNvbnN0IHRlc3RGaWxlcyA9IGZzLmV4aXN0c1N5bmModGVzdERpcilcbiAgICA/IGxpc3RGaWxlc1JlY3Vyc2l2ZSh0ZXN0RGlyLCAoZikgPT4gaXNTb3VyY2VGaWxlKGYpICYmIGlzVGVzdEZpbGUoZikpXG4gICAgOiBbXTtcblxuICBjb25zdCBhcGk6IFJlY29yZDxzdHJpbmcsIHsgZXhwb3J0czogc3RyaW5nW107IGRlY29yYXRvcnM6IHN0cmluZ1tdIH0+ID0ge307XG4gIGZvciAoY29uc3QgZiBvZiBmaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVNhZmUoZikgfHwgXCJcIjtcbiAgICBhcGlbcGF0aC5yZWxhdGl2ZShyb290LCBmKV0gPSB7XG4gICAgICBleHBvcnRzOiBleHRyYWN0RXhwb3J0cyhjb250ZW50KSxcbiAgICAgIGRlY29yYXRvcnM6IGV4dHJhY3REZWNvcmF0b3JzKGNvbnRlbnQpLFxuICAgIH07XG4gIH1cbiAgY29uc3QgdGVzdHM6IFJlY29yZDxzdHJpbmcsIHsgbWVudGlvbnM6IHN0cmluZ1tdIH0+ID0ge307XG4gIGZvciAoY29uc3QgZiBvZiB0ZXN0RmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTYWZlKGYpIHx8IFwiXCI7XG4gICAgY29uc3QgbWVudGlvbnMgPSBBcnJheS5mcm9tKFxuICAgICAgbmV3IFNldChbLi4uZXh0cmFjdEV4cG9ydHMoY29udGVudCksIC4uLmV4dHJhY3REZWNvcmF0b3JzKGNvbnRlbnQpXSlcbiAgICApLnNvcnQoKTtcbiAgICB0ZXN0c1twYXRoLnJlbGF0aXZlKHJvb3QsIGYpXSA9IHsgbWVudGlvbnMgfTtcbiAgfVxuICByZXR1cm4geyBmaWxlcywgdGVzdEZpbGVzLCBhcGksIHRlc3RzLCByZWFkbWU6IHN1bW1hcml6ZVJlYWRtZShyZWFkbWUpIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB0eXBlIHsgQ29udGVudFJlc3VsdCwgVG9vbCB9IGZyb20gXCJmYXN0bWNwXCI7XG5pbXBvcnQge1xuICBkb2N1bWVudE9iamVjdFNjaGVtYSxcbiAgY292ZXJhZ2VUYXNrU2NoZW1hLFxuICByZWFkbWVJbXByb3ZlbWVudFNjaGVtYSxcbn0gZnJvbSBcIi4uL3NjaGVtYXNcIjtcbmltcG9ydCB7XG4gIERvY3VtZW50T2JqZWN0QXJncyxcbiAgQ292ZXJhZ2VUYXNrQXJncyxcbiAgUmVhZG1lSW1wcm92ZW1lbnRBcmdzLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldFdvcmtzcGFjZVJvb3QsXG4gIHJlc29sdmVJbldvcmtzcGFjZSxcbiAgdGhyb3dVc2VyRXJyb3IsXG4gIFdvcmtzcGFjZUVycm9yLFxufSBmcm9tIFwiLi4vd29ya3NwYWNlXCI7XG5pbXBvcnQge1xuICBkaXNjb3ZlckRvY1Byb21wdHMsXG4gIGdldE9iamVjdFByb21wdERlcGVuZGVuY2llcyxcbn0gZnJvbSBcIi4uL3Byb21wdHMvcHJvbXB0c1wiO1xuaW1wb3J0IHR5cGUgeyBEb2NQcm9tcHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGxpc3RGaWxlc1JlY3Vyc2l2ZSwgcmVhZEZpbGVTYWZlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBhbmFseXplUmVwbywgaXNTb3VyY2VGaWxlLCBpc1Rlc3RGaWxlIH0gZnJvbSBcIi4uL2NvZGVcIjtcblxudHlwZSBQcm9tcHRTZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgYWJzb2x1dGVQYXRoPzogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gcmVsYXRpdmVGaWxlcyhyb290OiBzdHJpbmcsIGZpbGVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZWxhdGl2ZShyb290LCBmaWxlKSkuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0UHJvbXB0U2VjdGlvbnMobmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbXB0U2VjdGlvbltdIHtcbiAgY29uc3Qgcm9vdCA9IGdldFdvcmtzcGFjZVJvb3QoKTtcbiAgY29uc3QgcHJvbXB0SW5kZXggPSBuZXcgTWFwPHN0cmluZywgRG9jUHJvbXB0PihcbiAgICBkaXNjb3ZlckRvY1Byb21wdHMocm9vdCkubWFwKChwcm9tcHQpID0+IFtwcm9tcHQubmFtZSwgcHJvbXB0XSlcbiAgKTtcbiAgcmV0dXJuIG5hbWVzXG4gICAgLm1hcCgobmFtZSkgPT4gcHJvbXB0SW5kZXguZ2V0KG5hbWUpKVxuICAgIC5maWx0ZXIoKHByb21wdCk6IHByb21wdCBpcyBEb2NQcm9tcHQgPT4gQm9vbGVhbihwcm9tcHQpKVxuICAgIC5tYXAoKHByb21wdCkgPT4gKHtcbiAgICAgIG5hbWU6IHByb21wdC5uYW1lLFxuICAgICAgdGl0bGU6IHByb21wdC50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9tcHQuZGVzY3JpcHRpb24sXG4gICAgICBjb250ZW50OiBwcm9tcHQuY29udGVudCxcbiAgICAgIGFic29sdXRlUGF0aDogcHJvbXB0LmFic29sdXRlUGF0aCxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGFza0xpbmVzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAuc3BsaXQoL1xccj9cXG4vKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5maWx0ZXIoKGxpbmUpID0+IC9edGFza1xccytcXGQrL2kudGVzdChsaW5lKSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVDb3ZlcmFnZUZyb21GaW5hbChjb3ZlcmFnZVBhdGg6IHN0cmluZykge1xuICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY292ZXJhZ2VQYXRoLCBcInV0ZjhcIikpIGFzIFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgczogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICAgIGY6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gICAgICBiOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBudW1iZXJbXT47XG4gICAgfVxuICA+O1xuXG4gIGNvbnN0IHRvdGFscyA9IHtcbiAgICBzdGF0ZW1lbnRzOiB7IGNvdmVyZWQ6IDAsIHRvdGFsOiAwIH0sXG4gICAgZnVuY3Rpb25zOiB7IGNvdmVyZWQ6IDAsIHRvdGFsOiAwIH0sXG4gICAgYnJhbmNoZXM6IHsgY292ZXJlZDogMCwgdG90YWw6IDAgfSxcbiAgfTtcblxuICBjb25zdCBmaWxlcyA9IE9iamVjdC5lbnRyaWVzKHBheWxvYWQpLm1hcCgoW2ZpbGVQYXRoLCBpbmZvXSkgPT4ge1xuICAgIGNvbnN0IHN0YXRlbWVudENvdW50cyA9IE9iamVjdC52YWx1ZXMoaW5mby5zKTtcbiAgICBjb25zdCBmdW5jdGlvbkNvdW50cyA9IE9iamVjdC52YWx1ZXMoaW5mby5mKTtcbiAgICBjb25zdCBicmFuY2hDb3VudHMgPSBPYmplY3QudmFsdWVzKGluZm8uYikuZmxhdE1hcCgodmFsdWUpID0+XG4gICAgICBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXVxuICAgICk7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRUb3RhbCA9IHN0YXRlbWVudENvdW50cy5sZW5ndGg7XG4gICAgY29uc3QgZnVuY3Rpb25Ub3RhbCA9IGZ1bmN0aW9uQ291bnRzLmxlbmd0aDtcbiAgICBjb25zdCBicmFuY2hUb3RhbCA9IGJyYW5jaENvdW50cy5sZW5ndGg7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRDb3ZlcmVkID0gc3RhdGVtZW50Q291bnRzLmZpbHRlcihcbiAgICAgIChjb3VudCkgPT4gY291bnQgPiAwXG4gICAgKS5sZW5ndGg7XG4gICAgY29uc3QgZnVuY3Rpb25Db3ZlcmVkID0gZnVuY3Rpb25Db3VudHMuZmlsdGVyKChjb3VudCkgPT4gY291bnQgPiAwKS5sZW5ndGg7XG4gICAgY29uc3QgYnJhbmNoQ292ZXJlZCA9IGJyYW5jaENvdW50cy5maWx0ZXIoKGNvdW50KSA9PiBjb3VudCA+IDApLmxlbmd0aDtcblxuICAgIHRvdGFscy5zdGF0ZW1lbnRzLmNvdmVyZWQgKz0gc3RhdGVtZW50Q292ZXJlZDtcbiAgICB0b3RhbHMuc3RhdGVtZW50cy50b3RhbCArPSBzdGF0ZW1lbnRUb3RhbDtcbiAgICB0b3RhbHMuZnVuY3Rpb25zLmNvdmVyZWQgKz0gZnVuY3Rpb25Db3ZlcmVkO1xuICAgIHRvdGFscy5mdW5jdGlvbnMudG90YWwgKz0gZnVuY3Rpb25Ub3RhbDtcbiAgICB0b3RhbHMuYnJhbmNoZXMuY292ZXJlZCArPSBicmFuY2hDb3ZlcmVkO1xuICAgIHRvdGFscy5icmFuY2hlcy50b3RhbCArPSBicmFuY2hUb3RhbDtcblxuICAgIGNvbnN0IHBjdCA9IChjb3ZlcmVkOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpID0+XG4gICAgICB0b3RhbCA9PT0gMCA/IDEwMCA6IE51bWJlcigoKGNvdmVyZWQgLyB0b3RhbCkgKiAxMDApLnRvRml4ZWQoMikpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgc3RhdGVtZW50czogcGN0KHN0YXRlbWVudENvdmVyZWQsIHN0YXRlbWVudFRvdGFsKSxcbiAgICAgIGZ1bmN0aW9uczogcGN0KGZ1bmN0aW9uQ292ZXJlZCwgZnVuY3Rpb25Ub3RhbCksXG4gICAgICBicmFuY2hlczogcGN0KGJyYW5jaENvdmVyZWQsIGJyYW5jaFRvdGFsKSxcbiAgICB9O1xuICB9KTtcblxuICBjb25zdCBwY3QgPSAoY292ZXJlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSA9PlxuICAgIHRvdGFsID09PSAwID8gMTAwIDogTnVtYmVyKCgoY292ZXJlZCAvIHRvdGFsKSAqIDEwMCkudG9GaXhlZCgyKSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0b3RhbHM6IHtcbiAgICAgIHN0YXRlbWVudHM6IHtcbiAgICAgICAgLi4udG90YWxzLnN0YXRlbWVudHMsXG4gICAgICAgIHBjdDogcGN0KHRvdGFscy5zdGF0ZW1lbnRzLmNvdmVyZWQsIHRvdGFscy5zdGF0ZW1lbnRzLnRvdGFsKSxcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbnM6IHtcbiAgICAgICAgLi4udG90YWxzLmZ1bmN0aW9ucyxcbiAgICAgICAgcGN0OiBwY3QodG90YWxzLmZ1bmN0aW9ucy5jb3ZlcmVkLCB0b3RhbHMuZnVuY3Rpb25zLnRvdGFsKSxcbiAgICAgIH0sXG4gICAgICBicmFuY2hlczoge1xuICAgICAgICAuLi50b3RhbHMuYnJhbmNoZXMsXG4gICAgICAgIHBjdDogcGN0KHRvdGFscy5icmFuY2hlcy5jb3ZlcmVkLCB0b3RhbHMuYnJhbmNoZXMudG90YWwpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGZpbGVzLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQcm9tcHRTZWN0aW9ucyhzZWN0aW9uczogUHJvbXB0U2VjdGlvbltdKSB7XG4gIHJldHVybiBzZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgbmFtZTogc2VjdGlvbi5uYW1lLFxuICAgIHRpdGxlOiBzZWN0aW9uLnRpdGxlLFxuICAgIHRhc2tzOiBwYXJzZVRhc2tMaW5lcyhzZWN0aW9uLmNvbnRlbnQpLFxuICAgIGNvbnRlbnQ6IHNlY3Rpb24uY29udGVudCxcbiAgfSkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUmVwb1Jvb3QoYmFzZVBhdGg6IHN0cmluZykge1xuICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICB0cnkge1xuICAgIHJldHVybiByZXNvbHZlSW5Xb3Jrc3BhY2Uocm9vdCwgYmFzZVBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdvcmtzcGFjZUVycm9yKSB7XG4gICAgICBhd2FpdCB0aHJvd1VzZXJFcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY3VtZW50T2JqZWN0VG9vbDogVG9vbDx1bmRlZmluZWQsIHR5cGVvZiBkb2N1bWVudE9iamVjdFNjaGVtYT4gPVxuICB7XG4gICAgbmFtZTogXCJkb2N1bWVudC1vYmplY3RcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiQ3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBwbGFuIGZvciBhIHNwZWNpZmljIG9iamVjdCB0eXBlIHVzaW5nIC5jb2RleCBwcm9tcHRzIGFuZCByZXBvc2l0b3J5IGFuYWx5c2lzLlwiLFxuICAgIHBhcmFtZXRlcnM6IGRvY3VtZW50T2JqZWN0U2NoZW1hLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIF9jb250ZXh0KTogUHJvbWlzZTxDb250ZW50UmVzdWx0PiA9PiB7XG4gICAgICBjb25zdCBhcmdzID0gZG9jdW1lbnRPYmplY3RTY2hlbWEucGFyc2UoaW5wdXQgYXMgRG9jdW1lbnRPYmplY3RBcmdzKTtcbiAgICAgIGNvbnN0IHJlcG9Sb290ID0gYXdhaXQgcmVzb2x2ZVJlcG9Sb290KGFyZ3MuYmFzZVBhdGgpO1xuXG4gICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBnZXRPYmplY3RQcm9tcHREZXBlbmRlbmNpZXMoKVthcmdzLm9iamVjdFR5cGVdID8/IFtdO1xuICAgICAgaWYgKCFkZXBlbmRlbmNpZXMubGVuZ3RoKSB7XG4gICAgICAgIGF3YWl0IHRocm93VXNlckVycm9yKFxuICAgICAgICAgIGBObyBwcm9tcHQgZ3VpZGFuY2UgY29uZmlndXJlZCBmb3Igb2JqZWN0IHR5cGUgJHthcmdzLm9iamVjdFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWN0aW9ucyA9IG5vcm1hbGl6ZVByb21wdFNlY3Rpb25zKFxuICAgICAgICBjb2xsZWN0UHJvbXB0U2VjdGlvbnMoZGVwZW5kZW5jaWVzKVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc3JjRGlyID0gcGF0aC5qb2luKHJlcG9Sb290LCBcInNyY1wiKTtcbiAgICAgIGNvbnN0IHRlc3REaXIgPSBwYXRoLmpvaW4ocmVwb1Jvb3QsIFwidGVzdHNcIik7XG5cbiAgICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gZnMuZXhpc3RzU3luYyhzcmNEaXIpXG4gICAgICAgID8gbGlzdEZpbGVzUmVjdXJzaXZlKHNyY0RpciwgaXNTb3VyY2VGaWxlKVxuICAgICAgICA6IFtdO1xuICAgICAgY29uc3QgdGVzdEZpbGVzID0gZnMuZXhpc3RzU3luYyh0ZXN0RGlyKVxuICAgICAgICA/IGxpc3RGaWxlc1JlY3Vyc2l2ZShcbiAgICAgICAgICAgIHRlc3REaXIsXG4gICAgICAgICAgICAoZmlsZSkgPT4gaXNTb3VyY2VGaWxlKGZpbGUpICYmIGlzVGVzdEZpbGUoZmlsZSlcbiAgICAgICAgICApXG4gICAgICAgIDogW107XG5cbiAgICAgIGxldCB0YXJnZXRGaWxlQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGFyZ3MudGFyZ2V0RmlsZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFic29sdXRlID0gcmVzb2x2ZUluV29ya3NwYWNlKHJlcG9Sb290LCBhcmdzLnRhcmdldEZpbGUpO1xuICAgICAgICAgIHRhcmdldEZpbGVDb250ZW50ID0gcmVhZEZpbGVTYWZlKGFic29sdXRlKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV29ya3NwYWNlRXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHRocm93VXNlckVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICBiYXNlUGF0aDogcGF0aC5yZWxhdGl2ZShnZXRXb3Jrc3BhY2VSb290KCksIHJlcG9Sb290KSB8fCBcIi5cIixcbiAgICAgICAgb2JqZWN0VHlwZTogYXJncy5vYmplY3RUeXBlLFxuICAgICAgICB0YXJnZXRGaWxlOiBhcmdzLnRhcmdldEZpbGUsXG4gICAgICAgIGd1aWRhbmNlOiBzZWN0aW9ucyxcbiAgICAgICAgZmlsZXM6IHtcbiAgICAgICAgICBzb3VyY2U6IHJlbGF0aXZlRmlsZXMocmVwb1Jvb3QsIHNvdXJjZUZpbGVzKSxcbiAgICAgICAgICB0ZXN0czogcmVsYXRpdmVGaWxlcyhyZXBvUm9vdCwgdGVzdEZpbGVzKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGFyZ2V0RmlsZUNvbnRlbnQ6IGFyZ3MuaW5jbHVkZUNvbnRlbnQgPyB0YXJnZXRGaWxlQ29udGVudCA6IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIG51bGwsIDIpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9IHNhdGlzZmllcyBDb250ZW50UmVzdWx0O1xuICAgIH0sXG4gIH07XG5cbmV4cG9ydCBjb25zdCBjb3ZlcmFnZUVuZm9yY2VyVG9vbDogVG9vbDx1bmRlZmluZWQsIHR5cGVvZiBjb3ZlcmFnZVRhc2tTY2hlbWE+ID1cbiAge1xuICAgIG5hbWU6IFwiZW5zdXJlLXRlc3QtY292ZXJhZ2VcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiUnVuIHRoZSBjb25maWd1cmVkIGNvdmVyYWdlIGNvbW1hbmQgYW5kIHJlcG9ydCB3aGV0aGVyIHRoZSB0YXJnZXQgcGVyY2VudGFnZSBpcyBtZXQsIGhpZ2hsaWdodGluZyB3ZWFrIGZpbGVzLlwiLFxuICAgIHBhcmFtZXRlcnM6IGNvdmVyYWdlVGFza1NjaGVtYSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBfY29udGV4dCk6IFByb21pc2U8Q29udGVudFJlc3VsdD4gPT4ge1xuICAgICAgY29uc3QgYXJncyA9IGNvdmVyYWdlVGFza1NjaGVtYS5wYXJzZShpbnB1dCBhcyBDb3ZlcmFnZVRhc2tBcmdzKTtcbiAgICAgIGNvbnN0IHJlcG9Sb290ID0gYXdhaXQgcmVzb2x2ZVJlcG9Sb290KGFyZ3MuYmFzZVBhdGgpO1xuXG4gICAgICBpZiAoIWFyZ3MuZHJ5UnVuKSB7XG4gICAgICAgIGNvbnN0IGVudiA9IHtcbiAgICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgICBVU0VfV0FUQ0hNQU46IFwiZmFsc2VcIixcbiAgICAgICAgICBXQVRDSE1BTl9ESVNBQkxFOiBcIjFcIixcbiAgICAgICAgICBKRVNUX0RJU0FCTEVfV0FUQ0hNQU46IFwiMVwiLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzcGF3blN5bmMoXG4gICAgICAgICAgXCJucG1cIixcbiAgICAgICAgICBbXCJydW5cIiwgXCJjb3ZlcmFnZVwiLCBcIi0tXCIsIFwiLS13YXRjaG1hbj1mYWxzZVwiLCBcIi0tcnVuSW5CYW5kXCJdLFxuICAgICAgICAgIHsgY3dkOiByZXBvUm9vdCwgZW52LCBlbmNvZGluZzogXCJ1dGY4XCIgfVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgICByZXN1bHQuc3RkZXJyIHx8IHJlc3VsdC5zdGRvdXQgfHwgXCJDb3ZlcmFnZSBjb21tYW5kIGZhaWxlZFwiO1xuICAgICAgICAgIGF3YWl0IHRocm93VXNlckVycm9yKG1lc3NhZ2UudHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb3ZlcmFnZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIHJlcG9Sb290LFxuICAgICAgICBcIndvcmtkb2NzXCIsXG4gICAgICAgIFwicmVwb3J0c1wiLFxuICAgICAgICBcImNvdmVyYWdlXCIsXG4gICAgICAgIFwiY292ZXJhZ2UtZmluYWwuanNvblwiXG4gICAgICApO1xuXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY292ZXJhZ2VQYXRoKSkge1xuICAgICAgICBhd2FpdCB0aHJvd1VzZXJFcnJvcihcbiAgICAgICAgICBgQ292ZXJhZ2UgcmVwb3J0IG5vdCBmb3VuZCBhdCAke3BhdGgucmVsYXRpdmUocmVwb1Jvb3QsIGNvdmVyYWdlUGF0aCl9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdW1tYXJ5ID0gY29tcHV0ZUNvdmVyYWdlRnJvbUZpbmFsKGNvdmVyYWdlUGF0aCk7XG4gICAgICBjb25zdCBtZWV0c1RocmVzaG9sZCA9XG4gICAgICAgIHN1bW1hcnkudG90YWxzLnN0YXRlbWVudHMucGN0ID49IGFyZ3MuY292ZXJhZ2UgJiZcbiAgICAgICAgc3VtbWFyeS50b3RhbHMuZnVuY3Rpb25zLnBjdCA+PSBhcmdzLmNvdmVyYWdlICYmXG4gICAgICAgIHN1bW1hcnkudG90YWxzLmJyYW5jaGVzLnBjdCA+PSBhcmdzLmNvdmVyYWdlO1xuXG4gICAgICBjb25zdCB3ZWFrZXN0ID0gWy4uLnN1bW1hcnkuZmlsZXNdXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnN0YXRlbWVudHMgLSBiLnN0YXRlbWVudHMpXG4gICAgICAgIC5zbGljZSgwLCAxMCk7XG5cbiAgICAgIGNvbnN0IGd1aWRhbmNlID0gbm9ybWFsaXplUHJvbXB0U2VjdGlvbnMoXG4gICAgICAgIGNvbGxlY3RQcm9tcHRTZWN0aW9ucyhbXCJidWxrLXRlc3RzXCJdKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgYmFzZVBhdGg6IHBhdGgucmVsYXRpdmUoZ2V0V29ya3NwYWNlUm9vdCgpLCByZXBvUm9vdCkgfHwgXCIuXCIsXG4gICAgICAgIHRhcmdldDogYXJncy5jb3ZlcmFnZSxcbiAgICAgICAgbWVldHNUaHJlc2hvbGQsXG4gICAgICAgIHRvdGFsczogc3VtbWFyeS50b3RhbHMsXG4gICAgICAgIHdlYWtlc3QsXG4gICAgICAgIGd1aWRhbmNlLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgbnVsbCwgMiksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0gc2F0aXNmaWVzIENvbnRlbnRSZXN1bHQ7XG4gICAgfSxcbiAgfTtcblxuZXhwb3J0IGNvbnN0IHJlYWRtZUltcHJvdmVtZW50VG9vbDogVG9vbDxcbiAgdW5kZWZpbmVkLFxuICB0eXBlb2YgcmVhZG1lSW1wcm92ZW1lbnRTY2hlbWFcbj4gPSB7XG4gIG5hbWU6IFwiaW1wcm92ZS1yZWFkbWVcIixcbiAgZGVzY3JpcHRpb246XG4gICAgXCJTdW1tYXJpemUgcmVxdWlyZWQgc3RlcHMgdG8gcmVmcmVzaCBSRUFETUUgYW5kIHdvcmtkb2NzIGNvbnRlbnQgdXNpbmcgLmNvZGV4IGd1aWRhbmNlIGFuZCByZXBvc2l0b3J5IGFuYWx5c2lzLlwiLFxuICBwYXJhbWV0ZXJzOiByZWFkbWVJbXByb3ZlbWVudFNjaGVtYSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIF9jb250ZXh0KTogUHJvbWlzZTxDb250ZW50UmVzdWx0PiA9PiB7XG4gICAgY29uc3QgYXJncyA9IHJlYWRtZUltcHJvdmVtZW50U2NoZW1hLnBhcnNlKGlucHV0IGFzIFJlYWRtZUltcHJvdmVtZW50QXJncyk7XG4gICAgY29uc3QgcmVwb1Jvb3QgPSBhd2FpdCByZXNvbHZlUmVwb1Jvb3QoYXJncy5iYXNlUGF0aCk7XG5cbiAgICBjb25zdCBhbmFseXNpcyA9IGFuYWx5emVSZXBvKHJlcG9Sb290KTtcbiAgICBjb25zdCBtb2R1bGVzID0gYW5hbHlzaXMuZmlsZXNcbiAgICAgIC5maWx0ZXIoKGZpbGUpID0+IC9pbmRleFxcLnRzJC8udGVzdChmaWxlKSlcbiAgICAgIC5tYXAoKGZpbGUpID0+IHBhdGgucmVsYXRpdmUocmVwb1Jvb3QsIGZpbGUpKTtcblxuICAgIGNvbnN0IHByb21wdFNlY3Rpb25zID0gbm9ybWFsaXplUHJvbXB0U2VjdGlvbnMoXG4gICAgICBjb2xsZWN0UHJvbXB0U2VjdGlvbnMoW1widXBkYXRlLXJlYWRtZVwiLCBcImRvY1wiLCBcIm1vZHVsZVwiXSlcbiAgICApO1xuXG4gICAgY29uc3QgdGVzdEV4YW1wbGVzID0gT2JqZWN0LmtleXMoYW5hbHlzaXMudGVzdHMgPz8ge30pO1xuICAgIGNvbnN0IGV4YW1wbGVzID0gYXJncy5pbmNsdWRlRXhhbXBsZXMgPyB0ZXN0RXhhbXBsZXMuc2xpY2UoMCwgMjApIDogW107XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgYmFzZVBhdGg6IHBhdGgucmVsYXRpdmUoZ2V0V29ya3NwYWNlUm9vdCgpLCByZXBvUm9vdCkgfHwgXCIuXCIsXG4gICAgICBzdW1tYXJ5OiB7XG4gICAgICAgIG1vZHVsZXMsXG4gICAgICAgIHRvdGFsU291cmNlRmlsZXM6IGFuYWx5c2lzLmZpbGVzLmxlbmd0aCxcbiAgICAgICAgdG90YWxUZXN0RmlsZXM6IGFuYWx5c2lzLnRlc3RGaWxlcy5sZW5ndGgsXG4gICAgICAgIGhhc1JlYWRtZTogQm9vbGVhbihhbmFseXNpcy5yZWFkbWUpLFxuICAgICAgfSxcbiAgICAgIGd1aWRhbmNlOiBwcm9tcHRTZWN0aW9ucyxcbiAgICAgIHN1Z2dlc3RlZEV4YW1wbGVzOiBleGFtcGxlcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIG51bGwsIDIpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9IHNhdGlzZmllcyBDb250ZW50UmVzdWx0O1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCB0eXBlIERlY29yYXRvclNwZWMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgYXJncz86IHVua25vd25bXTtcbn07XG5cbmV4cG9ydCB0eXBlIEF0dHJpYnV0ZVNwZWMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBkZWNvcmF0b3JzPzogRGVjb3JhdG9yU3BlY1tdO1xufTtcblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGVjb3JhdG9yKHNwZWM6IERlY29yYXRvclNwZWMpOiBzdHJpbmcge1xuICBjb25zdCBhcmdzID0gKHNwZWMuYXJncyB8fCBbXSkubWFwKChhcmcpID0+IEpTT04uc3RyaW5naWZ5KGFyZykpLmpvaW4oXCIsIFwiKTtcbiAgcmV0dXJuIGBAJHtzcGVjLm5hbWV9KCR7YXJnc30pYDtcbn1cblxuZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RGVjb3JhdG9yTmFtZXMoXG4gIGNsYXNzRGVjb3JhdG9yczogRGVjb3JhdG9yU3BlY1tdIHwgdW5kZWZpbmVkLFxuICBwcm9wZXJ0aWVzOiBBdHRyaWJ1dGVTcGVjW10gfCB1bmRlZmluZWRcbikge1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBuYW1lcy5hZGQoXCJtb2RlbFwiKTtcbiAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgY2xhc3NEZWNvcmF0b3JzIHx8IFtdKSB7XG4gICAgbmFtZXMuYWRkKGRlY29yYXRvci5uYW1lKTtcbiAgfVxuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMgfHwgW10pIHtcbiAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBwcm9wZXJ0eS5kZWNvcmF0b3JzIHx8IFtdKSB7XG4gICAgICBuYW1lcy5hZGQoZGVjb3JhdG9yLm5hbWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmFtZXM7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZUltcG9ydChcbiAgY29udGVudDogc3RyaW5nLFxuICBpbXBvcnRzRnJvbTogc3RyaW5nLFxuICBkZWNvcmF0b3JzOiBTZXQ8c3RyaW5nPlxuKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICghZGVjb3JhdG9ycy5zaXplKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgaW1wb3J0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgIGBpbXBvcnRcXFxccytcXFxceyhbXn1dKylcXFxcfVxcXFxzK2Zyb21cXFxccytbXCInXSR7ZXNjYXBlUmVnRXhwKGltcG9ydHNGcm9tKX1bXCInXTtgXG4gICk7XG4gIGNvbnN0IG1hdGNoID0gY29udGVudC5tYXRjaChpbXBvcnRSZWdleCk7XG4gIGNvbnN0IHNvcnRlZCA9IEFycmF5LmZyb20oZGVjb3JhdG9ycykuc29ydCgpO1xuXG4gIGlmIChtYXRjaCkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gbWF0Y2hbMV1cbiAgICAgIC5zcGxpdChcIixcIilcbiAgICAgIC5tYXAoKG5hbWUpID0+IG5hbWUudHJpbSgpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBtZXJnZWQgPSBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmV4aXN0aW5nLCAuLi5zb3J0ZWRdKSkuc29ydCgpO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UoXG4gICAgICBpbXBvcnRSZWdleCxcbiAgICAgIGBpbXBvcnQgeyAke21lcmdlZC5qb2luKFwiLCBcIil9IH0gZnJvbSBcIiR7aW1wb3J0c0Zyb219XCI7YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBpbXBvcnRMaW5lID0gYGltcG9ydCB7ICR7c29ydGVkLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiJHtpbXBvcnRzRnJvbX1cIjtgO1xuICByZXR1cm4gYCR7aW1wb3J0TGluZX1cXG5cXG4ke2NvbnRlbnR9YDtcbn1cblxuZnVuY3Rpb24gYWRkUHJvcGVydHlCbG9jayhwcm9wZXJ0eTogQXR0cmlidXRlU3BlYykge1xuICBjb25zdCBkZWNvcmF0b3JzID0gKHByb3BlcnR5LmRlY29yYXRvcnMgfHwgW10pXG4gICAgLm1hcChmb3JtYXREZWNvcmF0b3IpXG4gICAgLmpvaW4oXCJcXG4gIFwiKTtcbiAgY29uc3QgZGVjb3JhdG9yQmxvY2sgPSBkZWNvcmF0b3JzID8gYCAgJHtkZWNvcmF0b3JzfVxcbmAgOiBcIlwiO1xuICByZXR1cm4gYCR7ZGVjb3JhdG9yQmxvY2t9ICAke3Byb3BlcnR5Lm5hbWV9OiAke3Byb3BlcnR5LnR5cGV9O2A7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVByb3BlcnR5QmxvY2soY29udGVudDogc3RyaW5nLCBwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgIGlmIChcbiAgICAgIGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoYEBgKSAmJlxuICAgICAgbGluZXNbaSArIDFdPy5pbmNsdWRlcyhgJHtwcm9wZXJ0eU5hbWV9OmApXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGxpbmUuaW5jbHVkZXMoYCR7cHJvcGVydHlOYW1lfTpgKSkge1xuICAgICAgLy8gc2tpcCB0aGlzIGxpbmUgYW5kIGFueSB0cmFpbGluZyBibGFuayBsaW5lXG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmVzdWx0LnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiBpbnNlcnREZWNvcmF0b3IoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgZGVjb3JhdG9yOiBEZWNvcmF0b3JTcGVjLFxuICB0YXJnZXQ6IHtcbiAgICBraW5kOiBcImNsYXNzXCIgfCBcInByb3BlcnR5XCI7XG4gICAgbmFtZT86IHN0cmluZztcbiAgfVxuKSB7XG4gIGNvbnN0IGRlY29yYXRvckxpbmUgPSBmb3JtYXREZWNvcmF0b3IoZGVjb3JhdG9yKTtcbiAgaWYgKHRhcmdldC5raW5kID09PSBcImNsYXNzXCIpIHtcbiAgICBjb25zdCBjbGFzc1JlZ2V4ID0gLyhleHBvcnRcXHMrY2xhc3NcXHMrW15cXHN7XStcXHMqXFx7KS87XG4gICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoZGVjb3JhdG9yTGluZSkpIHJldHVybiBjb250ZW50O1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UoY2xhc3NSZWdleCwgYCR7ZGVjb3JhdG9yTGluZX1cXG4kMWApO1xuICB9XG4gIGlmICghdGFyZ2V0Lm5hbWUpIHJldHVybiBjb250ZW50O1xuICBjb25zdCBwcm9wZXJ0eVJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBgKF5cXFxccyopKD86QC4qXFxcXG5cXFxcMSkqJHtlc2NhcGVSZWdFeHAodGFyZ2V0Lm5hbWUpfTpgLFxuICAgIFwibVwiXG4gICk7XG4gIGNvbnN0IG1hdGNoID0gcHJvcGVydHlSZWdleC5leGVjKGNvbnRlbnQpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgaW5kZW50ID0gbWF0Y2hbMV0gfHwgXCIgIFwiO1xuICBpZiAoY29udGVudC5pbmNsdWRlcyhgJHtpbmRlbnR9JHtkZWNvcmF0b3JMaW5lfWApKSByZXR1cm4gY29udGVudDtcbiAgcmV0dXJuIChcbiAgICBjb250ZW50LnNsaWNlKDAsIG1hdGNoLmluZGV4KSArXG4gICAgYCR7aW5kZW50fSR7ZGVjb3JhdG9yTGluZX1cXG5gICtcbiAgICBjb250ZW50LnNsaWNlKG1hdGNoLmluZGV4KVxuICApO1xufVxuXG5mdW5jdGlvbiByZW1vdmVEZWNvcmF0b3IoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgZGVjb3JhdG9yTmFtZTogc3RyaW5nLFxuICB0YXJnZXQ6IHtcbiAgICBraW5kOiBcImNsYXNzXCIgfCBcInByb3BlcnR5XCI7XG4gICAgbmFtZT86IHN0cmluZztcbiAgfVxuKSB7XG4gIGNvbnN0IGRlY29yYXRvclJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBgXlxcXFxzKkAke2VzY2FwZVJlZ0V4cChkZWNvcmF0b3JOYW1lKX1cXFxcKFteKV0qXFxcXClgLFxuICAgIFwibVwiXG4gICk7XG4gIGlmICh0YXJnZXQua2luZCA9PT0gXCJjbGFzc1wiKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShkZWNvcmF0b3JSZWdleCwgXCJcIik7XG4gIH1cbiAgaWYgKHRhcmdldC5uYW1lKSB7XG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoXG4gICAgICBgKF5cXFxccypAJHtlc2NhcGVSZWdFeHAoZGVjb3JhdG9yTmFtZSl9XFxcXChbXildKlxcXFwpXFxcXHMqJFxcXFxuKSg/PVxcXFxzKiR7ZXNjYXBlUmVnRXhwKHRhcmdldC5uYW1lKX06KWAsXG4gICAgICBcIm1cIlxuICAgICk7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCBcIlwiKTtcbiAgfVxuICByZXR1cm4gY29udGVudDtcbn1cblxuZnVuY3Rpb24gd3JpdGVJZkNoYW5nZWQoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKSB7XG4gIGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aCk7XG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGNvbnRlbnQpO1xufVxuXG5leHBvcnQgY29uc3QgZGVjb3JhdG9yVG9vbHMgPSB7XG4gIGNyZWF0ZU9yVXBkYXRlTW9kZWxUb29sOiB7XG4gICAgbmFtZTogXCJjcmVhdGUtb3ItdXBkYXRlLW1vZGVsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQ3JlYXRlIG9yIHVwZGF0ZSBhIHZhbGlkYXRpb24tcmVhZHkgbW9kZWwgY2xhc3NcIixcbiAgICBleGVjdXRlOiBhc3luYyAoYXJnczoge1xuICAgICAgZmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGNsYXNzTmFtZTogc3RyaW5nO1xuICAgICAgY2xhc3NEZWNvcmF0b3JzPzogRGVjb3JhdG9yU3BlY1tdO1xuICAgICAgcHJvcGVydGllczogQXR0cmlidXRlU3BlY1tdO1xuICAgICAgaW1wb3J0c0Zyb206IHN0cmluZztcbiAgICAgIG92ZXJ3cml0ZT86IGJvb2xlYW47XG4gICAgfSkgPT4ge1xuICAgICAgaWYgKCFhcmdzLm92ZXJ3cml0ZSAmJiBmcy5leGlzdHNTeW5jKGFyZ3MuZmlsZVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBhbHJlYWR5IGV4aXN0cyBhdCAke2FyZ3MuZmlsZVBhdGh9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gY29sbGVjdERlY29yYXRvck5hbWVzKFxuICAgICAgICBhcmdzLmNsYXNzRGVjb3JhdG9ycyxcbiAgICAgICAgYXJncy5wcm9wZXJ0aWVzXG4gICAgICApO1xuICAgICAgbGV0IGNvbnRlbnQgPSBgQG1vZGVsKClgO1xuICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgYXJncy5jbGFzc0RlY29yYXRvcnMgfHwgW10pIHtcbiAgICAgICAgY29udGVudCArPSBgXFxuJHtmb3JtYXREZWNvcmF0b3IoZGVjb3JhdG9yKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IChhcmdzLnByb3BlcnRpZXMgfHwgW10pXG4gICAgICAgIC5tYXAoYWRkUHJvcGVydHlCbG9jaylcbiAgICAgICAgLmpvaW4oXCJcXG5cXG5cIik7XG4gICAgICBjb250ZW50ICs9IGBcXG5leHBvcnQgY2xhc3MgJHthcmdzLmNsYXNzTmFtZX0ge1xcbiR7cHJvcGVydGllcyA/IGAke3Byb3BlcnRpZXN9XFxuYCA6IFwiXCJ9fVxcbmA7XG4gICAgICBjb250ZW50ID0gZW5zdXJlSW1wb3J0KGNvbnRlbnQsIGFyZ3MuaW1wb3J0c0Zyb20sIGRlY29yYXRvcnMpO1xuICAgICAgd3JpdGVJZkNoYW5nZWQoYXJncy5maWxlUGF0aCwgY29udGVudCk7XG4gICAgICByZXR1cm4geyBmaWxlUGF0aDogYXJncy5maWxlUGF0aCB9O1xuICAgIH0sXG4gIH0sXG4gIGFkZEF0dHJpYnV0ZVRvb2w6IHtcbiAgICBuYW1lOiBcImFkZC1hdHRyaWJ1dGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBZGQgYSBkZWNvcmF0ZWQgYXR0cmlidXRlIHRvIGFuIGV4aXN0aW5nIG1vZGVsXCIsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3M6IHtcbiAgICAgIGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBjbGFzc05hbWU6IHN0cmluZztcbiAgICAgIGF0dHJpYnV0ZTogQXR0cmlidXRlU3BlYztcbiAgICAgIGltcG9ydHNGcm9tOiBzdHJpbmc7XG4gICAgfSkgPT4ge1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGFyZ3MuZmlsZVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgZmlsZSBub3QgZm91bmQgYXQgJHthcmdzLmZpbGVQYXRofWApO1xuICAgICAgfVxuICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoYXJncy5maWxlUGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoYCR7YXJncy5hdHRyaWJ1dGUubmFtZX06YCkpIHtcbiAgICAgICAgcmV0dXJuIHsgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGggfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBjb2xsZWN0RGVjb3JhdG9yTmFtZXModW5kZWZpbmVkLCBbYXJncy5hdHRyaWJ1dGVdKTtcbiAgICAgIGNvbnRlbnQgPSBlbnN1cmVJbXBvcnQoY29udGVudCwgYXJncy5pbXBvcnRzRnJvbSwgZGVjb3JhdG9ycyk7XG4gICAgICBjb25zdCBpbnNlcnRpb25Qb2ludCA9IGNvbnRlbnQubGFzdEluZGV4T2YoXCJ9XCIpO1xuICAgICAgY29uc3QgYmxvY2sgPSBhZGRQcm9wZXJ0eUJsb2NrKGFyZ3MuYXR0cmlidXRlKTtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IGNvbnRlbnQuc2xpY2UoMCwgaW5zZXJ0aW9uUG9pbnQpLnJlcGxhY2UoL1xccyokLywgXCJcIik7XG4gICAgICBjb25zdCBhZnRlciA9IGNvbnRlbnQuc2xpY2UoaW5zZXJ0aW9uUG9pbnQpO1xuICAgICAgY29uc3QgdXBkYXRlZCA9IGAke2JlZm9yZX1cXG4ke2Jsb2NrfVxcbiR7YWZ0ZXJ9YDtcbiAgICAgIHdyaXRlSWZDaGFuZ2VkKGFyZ3MuZmlsZVBhdGgsIHVwZGF0ZWQpO1xuICAgICAgcmV0dXJuIHsgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGggfTtcbiAgICB9LFxuICB9LFxuICByZW1vdmVBdHRyaWJ1dGVUb29sOiB7XG4gICAgbmFtZTogXCJyZW1vdmUtYXR0cmlidXRlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiUmVtb3ZlIGFuIGF0dHJpYnV0ZSBmcm9tIGEgbW9kZWwgY2xhc3NcIixcbiAgICBleGVjdXRlOiBhc3luYyAoYXJnczoge1xuICAgICAgZmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGNsYXNzTmFtZTogc3RyaW5nO1xuICAgICAgYXR0cmlidXRlTmFtZTogc3RyaW5nO1xuICAgIH0pID0+IHtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhhcmdzLmZpbGVQYXRoKSkgcmV0dXJuIHsgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGggfTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoYXJncy5maWxlUGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgY29uc3QgdXBkYXRlZCA9IHJlbW92ZVByb3BlcnR5QmxvY2soY29udGVudCwgYXJncy5hdHRyaWJ1dGVOYW1lKTtcbiAgICAgIHdyaXRlSWZDaGFuZ2VkKGFyZ3MuZmlsZVBhdGgsIHVwZGF0ZWQpO1xuICAgICAgcmV0dXJuIHsgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGggfTtcbiAgICB9LFxuICB9LFxuICBhcHBseURlY29yYXRvclRvb2w6IHtcbiAgICBuYW1lOiBcImFwcGx5LWRlY29yYXRvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFwcGx5IGEgZGVjb3JhdG9yIHRvIGEgY2xhc3Mgb3IgcHJvcGVydHlcIixcbiAgICBleGVjdXRlOiBhc3luYyAoYXJnczoge1xuICAgICAgZmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGNsYXNzTmFtZTogc3RyaW5nO1xuICAgICAgdGFyZ2V0OiB7IGtpbmQ6IFwiY2xhc3NcIiB8IFwicHJvcGVydHlcIjsgbmFtZT86IHN0cmluZyB9O1xuICAgICAgZGVjb3JhdG9yOiBEZWNvcmF0b3JTcGVjO1xuICAgICAgaW1wb3J0c0Zyb206IHN0cmluZztcbiAgICB9KSA9PiB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYXJncy5maWxlUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCBmaWxlIG5vdCBmb3VuZCBhdCAke2FyZ3MuZmlsZVBhdGh9YCk7XG4gICAgICB9XG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhhcmdzLmZpbGVQYXRoLCBcInV0ZjhcIik7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gbmV3IFNldDxzdHJpbmc+KFthcmdzLmRlY29yYXRvci5uYW1lXSk7XG4gICAgICBjb250ZW50ID0gZW5zdXJlSW1wb3J0KGNvbnRlbnQsIGFyZ3MuaW1wb3J0c0Zyb20sIGRlY29yYXRvcnMpO1xuICAgICAgY29udGVudCA9IGluc2VydERlY29yYXRvcihjb250ZW50LCBhcmdzLmRlY29yYXRvciwgYXJncy50YXJnZXQpO1xuICAgICAgd3JpdGVJZkNoYW5nZWQoYXJncy5maWxlUGF0aCwgY29udGVudCk7XG4gICAgICByZXR1cm4geyBmaWxlUGF0aDogYXJncy5maWxlUGF0aCB9O1xuICAgIH0sXG4gIH0sXG4gIHJlbW92ZURlY29yYXRvclRvb2w6IHtcbiAgICBuYW1lOiBcInJlbW92ZS1kZWNvcmF0b3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJSZW1vdmUgYSBkZWNvcmF0b3IgZnJvbSBhIGNsYXNzIG9yIHByb3BlcnR5XCIsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3M6IHtcbiAgICAgIGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBjbGFzc05hbWU6IHN0cmluZztcbiAgICAgIHRhcmdldDogeyBraW5kOiBcImNsYXNzXCIgfCBcInByb3BlcnR5XCI7IG5hbWU/OiBzdHJpbmcgfTtcbiAgICAgIGRlY29yYXRvck5hbWU6IHN0cmluZztcbiAgICB9KSA9PiB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYXJncy5maWxlUGF0aCkpIHJldHVybiB7IGZpbGVQYXRoOiBhcmdzLmZpbGVQYXRoIH07XG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhhcmdzLmZpbGVQYXRoLCBcInV0ZjhcIik7XG4gICAgICBjb250ZW50ID0gcmVtb3ZlRGVjb3JhdG9yKGNvbnRlbnQsIGFyZ3MuZGVjb3JhdG9yTmFtZSwgYXJncy50YXJnZXQpO1xuICAgICAgd3JpdGVJZkNoYW5nZWQoYXJncy5maWxlUGF0aCwgY29udGVudCk7XG4gICAgICByZXR1cm4geyBmaWxlUGF0aDogYXJncy5maWxlUGF0aCB9O1xuICAgIH0sXG4gIH0sXG4gIHNjYWZmb2xkVmFsaWRhdG9yVG9vbDoge1xuICAgIG5hbWU6IFwic2NhZmZvbGQtdmFsaWRhdG9yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2NhZmZvbGQgYSB2YWxpZGF0b3IgY2xhc3MgYW5kIG9wdGlvbmFsIGRlY29yYXRvclwiLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzOiB7XG4gICAgICB2YWxpZGF0b3JzRGlyOiBzdHJpbmc7XG4gICAgICBkZWNvcmF0b3JEaXI/OiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgfSkgPT4ge1xuICAgICAgY29uc3QgY2xhc3NGaWxlID0gcGF0aC5qb2luKGFyZ3MudmFsaWRhdG9yc0RpciwgYCR7YXJncy5uYW1lfS50c2ApO1xuICAgICAgZW5zdXJlRGlyZWN0b3J5KGNsYXNzRmlsZSk7XG4gICAgICBjb25zdCBjbGFzc0NvbnRlbnQgPSBgZXhwb3J0IGNsYXNzICR7YXJncy5uYW1lfSB7XFxuICB2YWxpZGF0ZSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xcbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZDtcXG4gIH1cXG59XFxuYDtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY2xhc3NGaWxlLCBjbGFzc0NvbnRlbnQpO1xuICAgICAgbGV0IGRlY29yYXRvckZpbGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChhcmdzLmRlY29yYXRvckRpcikge1xuICAgICAgICBkZWNvcmF0b3JGaWxlID0gcGF0aC5qb2luKFxuICAgICAgICAgIGFyZ3MuZGVjb3JhdG9yRGlyLFxuICAgICAgICAgIGAke2FyZ3MubmFtZX1EZWNvcmF0b3IudHNgXG4gICAgICAgICk7XG4gICAgICAgIGVuc3VyZURpcmVjdG9yeShkZWNvcmF0b3JGaWxlKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICBkZWNvcmF0b3JGaWxlLFxuICAgICAgICAgIGBleHBvcnQgZnVuY3Rpb24gJHthcmdzLm5hbWV9RGVjb3JhdG9yKCkge1xcbiAgcmV0dXJuICgpID0+IHZvaWQgMDtcXG59XFxuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NGaWxlLCBkZWNvcmF0b3JGaWxlIH07XG4gICAgfSxcbiAgfSxcbiAgc2NhZmZvbGRTZXJpYWxpemVyVG9vbDoge1xuICAgIG5hbWU6IFwic2NhZmZvbGQtc2VyaWFsaXplclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNjYWZmb2xkIGEgc2VyaWFsaXplciBjbGFzcyBhbmQgb3B0aW9uYWwgcmVnaXN0cnlcIixcbiAgICBleGVjdXRlOiBhc3luYyAoYXJnczoge1xuICAgICAgZGlyOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICByZWdpc3RlckRpcj86IHN0cmluZztcbiAgICAgIHNldERlZmF1bHQ/OiBib29sZWFuO1xuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzRmlsZSA9IHBhdGguam9pbihhcmdzLmRpciwgYCR7YXJncy5uYW1lfS50c2ApO1xuICAgICAgZW5zdXJlRGlyZWN0b3J5KGNsYXNzRmlsZSk7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBjbGFzc0ZpbGUsXG4gICAgICAgIGBleHBvcnQgY2xhc3MgJHthcmdzLm5hbWV9IHtcXG4gIHNlcmlhbGl6ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XFxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XFxuICB9XFxufVxcbmBcbiAgICAgICk7XG4gICAgICBsZXQgcmVnaXN0ZXJGaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYXJncy5yZWdpc3RlckRpcikge1xuICAgICAgICByZWdpc3RlckZpbGUgPSBwYXRoLmpvaW4oYXJncy5yZWdpc3RlckRpciwgYCR7YXJncy5uYW1lfVJlZ2lzdGVyLnRzYCk7XG4gICAgICAgIGVuc3VyZURpcmVjdG9yeShyZWdpc3RlckZpbGUpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgIHJlZ2lzdGVyRmlsZSxcbiAgICAgICAgICBgZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyJHthcmdzLm5hbWV9KCkge1xcbiAgcmV0dXJuICR7YXJncy5zZXREZWZhdWx0ID8gXCInZGVmYXVsdCdcIiA6IFwiJ29wdGlvbmFsJ1wifTtcXG59XFxuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NGaWxlLCByZWdpc3RlckZpbGUgfTtcbiAgICB9LFxuICB9LFxuICBzY2FmZm9sZEhhc2hpbmdUb29sOiB7XG4gICAgbmFtZTogXCJzY2FmZm9sZC1oYXNoaW5nXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2NhZmZvbGQgYSBoYXNoaW5nIGZ1bmN0aW9uIGFuZCBvcHRpb25hbCByZWdpc3RyeVwiLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzOiB7XG4gICAgICBkaXI6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIHJlZ2lzdGVyRGlyPzogc3RyaW5nO1xuICAgICAgc2V0RGVmYXVsdD86IGJvb2xlYW47XG4gICAgfSkgPT4ge1xuICAgICAgY29uc3QgZnVuY3Rpb25GaWxlID0gcGF0aC5qb2luKGFyZ3MuZGlyLCBgJHthcmdzLm5hbWV9LnRzYCk7XG4gICAgICBlbnN1cmVEaXJlY3RvcnkoZnVuY3Rpb25GaWxlKTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgIGZ1bmN0aW9uRmlsZSxcbiAgICAgICAgYGV4cG9ydCBmdW5jdGlvbiAke2FyZ3MubmFtZX0odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XFxuICByZXR1cm4gdmFsdWUuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKTtcXG59XFxuYFxuICAgICAgKTtcbiAgICAgIGxldCByZWdpc3RlckZpbGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChhcmdzLnJlZ2lzdGVyRGlyKSB7XG4gICAgICAgIHJlZ2lzdGVyRmlsZSA9IHBhdGguam9pbihhcmdzLnJlZ2lzdGVyRGlyLCBgJHthcmdzLm5hbWV9UmVnaXN0ZXIudHNgKTtcbiAgICAgICAgZW5zdXJlRGlyZWN0b3J5KHJlZ2lzdGVyRmlsZSk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgcmVnaXN0ZXJGaWxlLFxuICAgICAgICAgIGBleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXIke2FyZ3MubmFtZX0oKSB7XFxuICByZXR1cm4gJHthcmdzLnNldERlZmF1bHQgPyBcIidkZWZhdWx0J1wiIDogXCInb3B0aW9uYWwnXCJ9O1xcbn1cXG5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBmdW5jdGlvbkZpbGUsIHJlZ2lzdGVyRmlsZSB9O1xuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JUb29scyA9IHR5cGVvZiBkZWNvcmF0b3JUb29scztcbiIsImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBDb250ZW50UmVzdWx0LCBUb29sIH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7IGFwcGx5UGF0Y2gsIGNyZWF0ZVR3b0ZpbGVzUGF0Y2ggfSBmcm9tIFwiZGlmZlwiO1xuaW1wb3J0IHtcbiAgYW5hbHl6ZVJlcG9TY2hlbWEsXG4gIGNvZGVDaGFuZ2VTY2hlbWEsXG4gIGRvY3VtZW50Q29kZVNjaGVtYSxcbiAgZW51bWVyYXRlQ2FwYWJpbGl0aWVzU2NoZW1hLFxuICBwbGFuRmVhdHVyZVNjaGVtYSxcbn0gZnJvbSBcIi4uL3NjaGVtYXNcIjtcbmltcG9ydCB7IGFuYWx5emVSZXBvIH0gZnJvbSBcIi4uL2NvZGVcIjtcbmltcG9ydCB7IGRlcml2ZUNhcGFiaWxpdGllcyB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgZ2V0V29ya3NwYWNlUm9vdCxcbiAgcmVzb2x2ZUluV29ya3NwYWNlLFxuICB0aHJvd1VzZXJFcnJvcixcbiAgV29ya3NwYWNlRXJyb3IsXG59IGZyb20gXCIuLi93b3Jrc3BhY2VcIjtcbi8vIE5PVEU6IHByb21wdCBoZWxwZXJzIChidWlsZERvY3VtZW50YXRpb25QYXlsb2FkLCBkaXNjb3ZlckRvY1Byb21wdHMsIHNlbGVjdFByb21wdCwgREVGQVVMVF9QUk9NUFRfTkFNRSlcbi8vIGFyZSBpbXBvcnRlZCBkeW5hbWljYWxseSBpbnNpZGUgZG9jdW1lbnRDb2RlVG9vbC5leGVjdXRlIHRvIGF2b2lkIGNyZWF0aW5nIGEgc3RhdGljIGNpcmN1bGFyIGltcG9ydFxuLy8gYXQgbW9kdWxlIGxvYWQgdGltZSAobW9kdWxlUmVnaXN0cnkgLT4gbW9kdWxlcyAtPiBkZWNvcmF0aW9uIHRvb2xzIC0+IG1jcC90b29scyAtPiBwcm9tcHRzKS5cbi8vIFRoZXkgd2lsbCBiZSBsb2FkZWQgd2hlbiB0aGUgdG9vbCBleGVjdXRlcy5cbmltcG9ydCB0eXBlIHsgQXBwbHlDb2RlQ2hhbmdlQXJncywgRG9jdW1lbnRDb2RlQXJncyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmFseXplUmVwb3NpdG9yeVRvb2woKTogVG9vbDxcbiAgdW5kZWZpbmVkLFxuICB0eXBlb2YgYW5hbHl6ZVJlcG9TY2hlbWFcbj4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IFwiYW5hbHl6ZS1yZXBvc2l0b3J5XCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkFuYWx5emUgYSBsb2NhbCByZXBvc2l0b3J5J3Mgc291cmNlLCB0ZXN0cywgYW5kIGRvY3MgdG8gZXh0cmFjdCBleHBvcnRlZCBBUElzLCBkZWNvcmF0b3JzLCBhbmQgdGVzdCBtZW50aW9ucy5cIixcbiAgICBwYXJhbWV0ZXJzOiBhbmFseXplUmVwb1NjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQpID0+IHtcbiAgICAgIGxldCByZXBvUm9vdCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBpbnB1dC5yZXBvUGF0aCk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKSB7XG4gICAgICAgIC8vIHRyeSByZXNvbHZpbmcgZnJvbSBtb25vcmVwbyByb290IChwYXJlbnQgb2YgY3VycmVudCBjd2QpXG4gICAgICAgIGNvbnN0IGFsdCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBcIi4uXCIsIGlucHV0LnJlcG9QYXRoKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYWx0KSkgcmVwb1Jvb3QgPSBhbHQ7XG4gICAgICB9XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKSB7XG4gICAgICAgIC8vIGlmIGlucHV0IHdhcyBhYnNvbHV0ZSBhbmQgc3RpbGwgbm90IGZvdW5kLCB0cnkgLi4vPGJhc2VuYW1lPlxuICAgICAgICBjb25zdCBhbHQyID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgXCIuLlwiLFxuICAgICAgICAgIHBhdGguYmFzZW5hbWUoaW5wdXQucmVwb1BhdGgpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFsdDIpKSByZXBvUm9vdCA9IGFsdDI7XG4gICAgICB9XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcG9zaXRvcnkgbm90IGZvdW5kIGF0ICR7cmVwb1Jvb3R9YCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhbmFseXplUmVwbyhyZXBvUm9vdCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSB9XSxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW51bWVyYXRlQ2FwYWJpbGl0aWVzVG9vbCgpOiBUb29sPFxuICB1bmRlZmluZWQsXG4gIHR5cGVvZiBlbnVtZXJhdGVDYXBhYmlsaXRpZXNTY2hlbWFcbj4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IFwiZW51bWVyYXRlLWNhcGFiaWxpdGllc1wiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFbnVtZXJhdGUgZGV2ZWxvcGVyLWZhY2luZyBjYXBhYmlsaXRpZXMgb2YgdGhlIGdpdmVuIHJlcG9zaXRvcnksIGluZmVycmVkIGZyb20gY29kZSwgdGVzdHMsIGFuZCBkb2NzLlwiLFxuICAgIHBhcmFtZXRlcnM6IGVudW1lcmF0ZUNhcGFiaWxpdGllc1NjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQpID0+IHtcbiAgICAgIGxldCByZXBvUm9vdCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBpbnB1dC5yZXBvUGF0aCk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKSB7XG4gICAgICAgIGNvbnN0IGFsdCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBcIi4uXCIsIGlucHV0LnJlcG9QYXRoKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYWx0KSkgcmVwb1Jvb3QgPSBhbHQ7XG4gICAgICB9XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKSB7XG4gICAgICAgIGNvbnN0IGFsdDIgPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICBcIi4uXCIsXG4gICAgICAgICAgcGF0aC5iYXNlbmFtZShpbnB1dC5yZXBvUGF0aClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYWx0MikpIHJlcG9Sb290ID0gYWx0MjtcbiAgICAgIH1cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhyZXBvUm9vdCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVwb3NpdG9yeSBub3QgZm91bmQgYXQgJHtyZXBvUm9vdH1gKTtcbiAgICAgIGNvbnN0IGFuYWx5c2lzID0gYW5hbHl6ZVJlcG8ocmVwb1Jvb3QpO1xuICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gZGVyaXZlQ2FwYWJpbGl0aWVzKGFuYWx5c2lzKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgICAgIGFuYWx5c2lzU3VtbWFyeToge1xuICAgICAgICAgICAgICAgICAgZmlsZXM6IGFuYWx5c2lzLmZpbGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIHRlc3RGaWxlczogYW5hbHlzaXMudGVzdEZpbGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIHJlYWRtZTogYW5hbHlzaXMucmVhZG1lPy50aXRsZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBsYW5GZWF0dXJlVG9vbCgpOiBUb29sPFxuICB1bmRlZmluZWQsXG4gIHR5cGVvZiBwbGFuRmVhdHVyZVNjaGVtYVxuPiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJwbGFuLWZlYXR1cmUtaW1wbGVtZW50YXRpb25cIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiR2l2ZW4gYSBmZWF0dXJlIHJlcXVlc3QsIHNlbGVjdCBhcHByb3ByaWF0ZSBNQ1AgdG9vbHMgKGluY2x1ZGluZyBleGlzdGluZyBhbmQgbmV3IG9uZXMpIGFuZCBwcm9kdWNlIGFuIGV4ZWN1dGlvbiBwbGFuLlwiLFxuICAgIHBhcmFtZXRlcnM6IHBsYW5GZWF0dXJlU2NoZW1hLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCkgPT4ge1xuICAgICAgY29uc3Qgc3RlcHM6IEFycmF5PHtcbiAgICAgICAgc3RlcDogbnVtYmVyO1xuICAgICAgICBhY3Rpb246IHN0cmluZztcbiAgICAgICAgdG9vbD86IHN0cmluZztcbiAgICAgICAgYXJndW1lbnRzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgcmF0aW9uYWxlOiBzdHJpbmc7XG4gICAgICB9PiA9IFtdO1xuICAgICAgbGV0IGkgPSAxO1xuICAgICAgc3RlcHMucHVzaCh7XG4gICAgICAgIHN0ZXA6IGkrKyxcbiAgICAgICAgYWN0aW9uOiBcIkFuYWx5emUgcmVwb3NpdG9yeSB0byBlbnVtZXJhdGUgQVBJcyBhbmQgZGVjb3JhdG9yc1wiLFxuICAgICAgICB0b29sOiBcImFuYWx5emUtcmVwb3NpdG9yeVwiLFxuICAgICAgICBhcmd1bWVudHM6IHsgcmVwb1BhdGg6IGlucHV0LnJlcG9QYXRoIH0sXG4gICAgICAgIHJhdGlvbmFsZTogXCJVbmRlcnN0YW5kIGF2YWlsYWJsZSBidWlsZGluZyBibG9ja3MuXCIsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBzdGVwOiBpKyssXG4gICAgICAgIGFjdGlvbjogXCJMaXN0IGNhcGFiaWxpdGllcyBleHBlY3RlZCBmb3IgZGV2ZWxvcGVyc1wiLFxuICAgICAgICB0b29sOiBcImVudW1lcmF0ZS1jYXBhYmlsaXRpZXNcIixcbiAgICAgICAgYXJndW1lbnRzOiB7IHJlcG9QYXRoOiBpbnB1dC5yZXBvUGF0aCB9LFxuICAgICAgICByYXRpb25hbGU6IFwiQWxpZ24gdGhlIHBsYW4gd2l0aCBzdXBwb3J0ZWQgY2FwYWJpbGl0aWVzLlwiLFxuICAgICAgfSk7XG4gICAgICAvLyBTdWdnZXN0IGV4aXN0aW5nIGdlbmVyaWMgdG9vbHMgZnJvbSBtY3AtbW9kdWxlXG4gICAgICBzdGVwcy5wdXNoKHtcbiAgICAgICAgc3RlcDogaSsrLFxuICAgICAgICBhY3Rpb246XG4gICAgICAgICAgXCJTZWxlY3QgZG9jdW1lbnRhdGlvbiBwcm9tcHQgYW5kIGdhdGhlciByZWxldmFudCBzb3VyY2UgZmlsZShzKVwiLFxuICAgICAgICB0b29sOiBcImRvY3VtZW50LWNvZGVcIixcbiAgICAgICAgYXJndW1lbnRzOiB7IGZpbGVQYXRoOiBcIjx0YXJnZXQtZmlsZT5cIiB9LFxuICAgICAgICByYXRpb25hbGU6IFwiUHJvdmlkZSBjb250ZXh0IGFuZCBpbnN0cnVjdGlvbnMgZm9yIGNoYW5nZXMuXCIsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBzdGVwOiBpKyssXG4gICAgICAgIGFjdGlvbjogXCJBcHBseSBjb2RlIGNoYW5nZXMgdXNpbmcgdW5pZmllZCBkaWZmIHBhdGNoXCIsXG4gICAgICAgIHRvb2w6IFwiYXBwbHktY29kZS1jaGFuZ2VcIixcbiAgICAgICAgYXJndW1lbnRzOiB7XG4gICAgICAgICAgZmlsZVBhdGg6IFwiPHRhcmdldC1maWxlPlwiLFxuICAgICAgICAgIHBhdGNoOiBcIjx1bmlmaWVkLWRpZmY+XCIsXG4gICAgICAgICAgZHJ5UnVuOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICByYXRpb25hbGU6IFwiVmFsaWRhdGUgY2hhbmdlcyBzYWZlbHkgYmVmb3JlIGNvbW1pdHRpbmcuXCIsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBzdGVwOiBpKyssXG4gICAgICAgIGFjdGlvbjogXCJDb21taXQgY29kZSBjaGFuZ2VzXCIsXG4gICAgICAgIHRvb2w6IFwiYXBwbHktY29kZS1jaGFuZ2VcIixcbiAgICAgICAgYXJndW1lbnRzOiB7XG4gICAgICAgICAgZmlsZVBhdGg6IFwiPHRhcmdldC1maWxlPlwiLFxuICAgICAgICAgIHBhdGNoOiBcIjx1bmlmaWVkLWRpZmY+XCIsXG4gICAgICAgICAgZHJ5UnVuOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgcmF0aW9uYWxlOiBcIlBlcnNpc3QgdGhlIHVwZGF0ZS5cIixcbiAgICAgIH0pO1xuICAgICAgLy8gSWYgZGVjb3JhdGlvbi1yZWxhdGVkIHRlcm1zIHByZXNlbnQsIHN1Z2dlc3QgZGVjb3JhdG9yIHRvb2xzXG4gICAgICBpZiAoL2RlY29yYXR8Zmxhdm91cnxvdmVycmlkZXxleHRlbmR8YnVpbGRlci9pLnRlc3QoaW5wdXQuZmVhdHVyZSkpIHtcbiAgICAgICAgc3RlcHMudW5zaGlmdCh7XG4gICAgICAgICAgc3RlcDogMCxcbiAgICAgICAgICBhY3Rpb246IFwiVXNlIGRlY29yYXRvciB0b29saW5nIHRvIGluc2VydC9yZW1vdmUvbW9kaWZ5IGRlY29yYXRvcnNcIixcbiAgICAgICAgICB0b29sOiBcImRlY29yYXRvci10b29sc1wiLFxuICAgICAgICAgIGFyZ3VtZW50czogeyBhY3Rpb246IFwiaGVscFwiIH0sXG4gICAgICAgICAgcmF0aW9uYWxlOiBcIkxldmVyYWdlIHNwZWNpYWxpemVkIHV0aWxpdGllcyBmb3IgZGVjb3JhdGlvbiBwYXR0ZXJucy5cIixcbiAgICAgICAgfSk7XG4gICAgICAgIHN0ZXBzLmZvckVhY2goKHMsIGlkeCkgPT4gKHMuc3RlcCA9IGlkeCArIDEpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGxhbjogc3RlcHMsXG4gICAgICAgICAgICAgICAgbm90ZXM6XG4gICAgICAgICAgICAgICAgICBcIlJlcGxhY2UgcGxhY2Vob2xkZXIgYXJndW1lbnRzIGxpa2UgPHRhcmdldC1maWxlPiBhbmQgPHVuaWZpZWQtZGlmZj4gYmFzZWQgb24gdGhlIGFuYWx5c2lzIG91dHB1dC5cIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgZG9jdW1lbnRDb2RlVG9vbDogVG9vbDx1bmRlZmluZWQsIHR5cGVvZiBkb2N1bWVudENvZGVTY2hlbWE+ID0ge1xuICBhbm5vdGF0aW9uczoge1xuICAgIGlkZW1wb3RlbnRIaW50OiB0cnVlLFxuICAgIG9wZW5Xb3JsZEhpbnQ6IGZhbHNlLFxuICAgIHJlYWRPbmx5SGludDogdHJ1ZSxcbiAgICB0aXRsZTogXCJEb2N1bWVudCBTb3VyY2UgRmlsZVwiLFxuICB9LFxuICBkZXNjcmlwdGlvbjpcbiAgICBcIkdlbmVyYXRlIGRvY3VtZW50YXRpb24gZ3VpZGFuY2UgZm9yIGEgZmlsZSBieSBjb21iaW5pbmcgcmVwb3NpdG9yeSBwcm9tcHRzIHdpdGggdGhlIHRhcmdldCBzb3VyY2UgY29kZS5cIixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIF9jb250ZXh0KTogUHJvbWlzZTxDb250ZW50UmVzdWx0PiA9PiB7XG4gICAgY29uc3QgYXJncyA9IGRvY3VtZW50Q29kZVNjaGVtYS5wYXJzZShpbnB1dCBhcyBEb2N1bWVudENvZGVBcmdzKTtcbiAgICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICAgIGxldCBmaWxlUGF0aDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBmaWxlUGF0aCA9IHJlc29sdmVJbldvcmtzcGFjZShyb290LCBhcmdzLmZpbGVQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV29ya3NwYWNlRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRocm93VXNlckVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiB0aHJvd1VzZXJFcnJvcihgQ2Fubm90IGRvY3VtZW50IG1pc3NpbmcgZmlsZSBhdCAke2FyZ3MuZmlsZVBhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIHtcbiAgICAgIGVuY29kaW5nOiBhcmdzLmVuY29kaW5nIGFzIEJ1ZmZlckVuY29kaW5nLFxuICAgIH0pO1xuICAgIC8vIGR5bmFtaWNhbGx5IGltcG9ydCBwcm9tcHQgaGVscGVyc1xuICAgIGNvbnN0IHByb21wdE1vZCA9IGF3YWl0IGltcG9ydChcIi4uL3Byb21wdHMvcHJvbXB0c1wiKTtcbiAgICBjb25zdCB7XG4gICAgICBkaXNjb3ZlckRvY1Byb21wdHMsXG4gICAgICBzZWxlY3RQcm9tcHQsXG4gICAgICBERUZBVUxUX1BST01QVF9OQU1FLFxuICAgICAgYnVpbGREb2N1bWVudGF0aW9uUGF5bG9hZCxcbiAgICB9ID0gcHJvbXB0TW9kO1xuICAgIGNvbnN0IHByb21wdHMgPSBkaXNjb3ZlckRvY1Byb21wdHMocm9vdCk7XG5cbiAgICBpZiAoIXByb21wdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhyb3dVc2VyRXJyb3IoXG4gICAgICAgIFwiTm8gZG9jdW1lbnRhdGlvbiBwcm9tcHRzIGZvdW5kIHVuZGVyIC5jb2RlL3Byb21wdHMgb3IgLmNvZGV4L3Byb21wdHNcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9tcHQgPSBzZWxlY3RQcm9tcHQoXG4gICAgICBwcm9tcHRzLFxuICAgICAgYXJncy5wcm9tcHROYW1lID8/IERFRkFVTFRfUFJPTVBUX05BTUVcbiAgICApO1xuXG4gICAgcmV0dXJuIGJ1aWxkRG9jdW1lbnRhdGlvblBheWxvYWQoe1xuICAgICAgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGgsXG4gICAgICBmaWxlQ29udGVudCxcbiAgICAgIHByb21wdCxcbiAgICAgIGluY2x1ZGVDb2RlOiBhcmdzLmluY2x1ZGVDb2RlLFxuICAgICAgaW5jbHVkZVByb21wdDogYXJncy5pbmNsdWRlUHJvbXB0LFxuICAgICAgaW5jbHVkZU1ldGFkYXRhOiBhcmdzLmluY2x1ZGVNZXRhZGF0YSxcbiAgICAgIGFkZGl0aW9uYWxDb250ZXh0OiBhcmdzLmFkZGl0aW9uYWxDb250ZXh0LFxuICAgIH0pO1xuICB9LFxuICBuYW1lOiBcImRvY3VtZW50LWNvZGVcIixcbiAgcGFyYW1ldGVyczogZG9jdW1lbnRDb2RlU2NoZW1hLFxufTtcblxuZXhwb3J0IGNvbnN0IGFwcGx5Q29kZUNoYW5nZVRvb2w6IFRvb2w8dW5kZWZpbmVkLCB0eXBlb2YgY29kZUNoYW5nZVNjaGVtYT4gPSB7XG4gIGFubm90YXRpb25zOiB7XG4gICAgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlLFxuICAgIGlkZW1wb3RlbnRIaW50OiBmYWxzZSxcbiAgICBvcGVuV29ybGRIaW50OiBmYWxzZSxcbiAgICByZWFkT25seUhpbnQ6IGZhbHNlLFxuICAgIHRpdGxlOiBcIkFwcGx5IENvZGUgUGF0Y2hcIixcbiAgfSxcbiAgZGVzY3JpcHRpb246XG4gICAgXCJBcHBseSBhIHVuaWZpZWQgZGlmZiBwYXRjaCB0byBhIHdvcmtzcGFjZSBmaWxlIHdpdGggb3B0aW9uYWwgZHJ5LXJ1biB2YWxpZGF0aW9uIGFuZCBkaWZmIHByZXZpZXcuXCIsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBfY29udGV4dCk6IFByb21pc2U8c3RyaW5nIHwgQ29udGVudFJlc3VsdD4gPT4ge1xuICAgIGNvbnN0IGFyZ3MgPSBjb2RlQ2hhbmdlU2NoZW1hLnBhcnNlKGlucHV0IGFzIEFwcGx5Q29kZUNoYW5nZUFyZ3MpO1xuICAgIGNvbnN0IHJvb3QgPSBnZXRXb3Jrc3BhY2VSb290KCk7XG4gICAgbGV0IGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGZpbGVQYXRoID0gcmVzb2x2ZUluV29ya3NwYWNlKHJvb3QsIGFyZ3MuZmlsZVBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXb3Jrc3BhY2VFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhyb3dVc2VyRXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpXG4gICAgICA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgYXJncy5lbmNvZGluZyBhcyBCdWZmZXJFbmNvZGluZylcbiAgICAgIDogXCJcIjtcblxuICAgIGxldCBwYXRjaGVkOiBzdHJpbmcgfCBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgcGF0Y2hlZCA9IGFwcGx5UGF0Y2gob3JpZ2luYWwsIGFyZ3MucGF0Y2gpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gdGhyb3dVc2VyRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gYXBwbHkgcHJvdmlkZWQgcGF0Y2ggdG8gJHthcmdzLmZpbGVQYXRofTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWBcbiAgICAgICk7XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHBhdGNoZWQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGhyb3dVc2VyRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gYXBwbHkgcHJvdmlkZWQgcGF0Y2ggdG8gJHthcmdzLmZpbGVQYXRofWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFhcmdzLmRyeVJ1bikge1xuICAgICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgcGF0Y2hlZCwge1xuICAgICAgICBlbmNvZGluZzogYXJncy5lbmNvZGluZyBhcyBCdWZmZXJFbmNvZGluZyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghYXJncy5zaG93RGlmZikge1xuICAgICAgcmV0dXJuIGBQYXRjaCAke2FyZ3MuZHJ5UnVuID8gXCJ2YWxpZGF0ZWRcIiA6IFwiYXBwbGllZFwifSBmb3IgJHthcmdzLmZpbGVQYXRofWA7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlldyA9IGNyZWF0ZVR3b0ZpbGVzUGF0Y2goXG4gICAgICBhcmdzLmZpbGVQYXRoLFxuICAgICAgYXJncy5maWxlUGF0aCxcbiAgICAgIG9yaWdpbmFsLFxuICAgICAgcGF0Y2hlZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHsgY29udGV4dDogYXJncy5kaWZmQ29udGV4dCB9XG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgUGF0Y2ggJHthcmdzLmRyeVJ1biA/IFwidmFsaWRhdGVkXCIgOiBcImFwcGxpZWRcIn0gZm9yICR7YXJncy5maWxlUGF0aH1gLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogW1wiYGBgZGlmZlwiLCBwcmV2aWV3LnRyaW0oKSwgXCJgYGBcIl0uam9pbihcIlxcblwiKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSBzYXRpc2ZpZXMgQ29udGVudFJlc3VsdDtcbiAgfSxcbiAgbmFtZTogXCJhcHBseS1jb2RlLWNoYW5nZVwiLFxuICBwYXJhbWV0ZXJzOiBjb2RlQ2hhbmdlU2NoZW1hLFxufTtcblxudHlwZSBBbnlUb29sID0gVG9vbDx1bmRlZmluZWQsIGFueT47XG5cbmNvbnN0IGFuYWx5dGljVG9vbHM6IEFueVRvb2xbXSA9IFtcbiAgYnVpbGRBbmFseXplUmVwb3NpdG9yeVRvb2woKSxcbiAgYnVpbGRFbnVtZXJhdGVDYXBhYmlsaXRpZXNUb29sKCksXG4gIGJ1aWxkUGxhbkZlYXR1cmVUb29sKCksXG5dO1xuXG5leHBvcnQgY29uc3QgdG9vbExpc3Q6IEFueVRvb2xbXSA9IFtcbiAgLi4uYW5hbHl0aWNUb29scyxcbiAgZG9jdW1lbnRDb2RlVG9vbCxcbiAgYXBwbHlDb2RlQ2hhbmdlVG9vbCxcbl07XG4iLCJpbXBvcnQgeyBtb2R1bGVSZWdpc3RyeSB9IGZyb20gXCIuLi9tb2R1bGVSZWdpc3RyeVwiO1xuaW1wb3J0IHtcbiAgY292ZXJhZ2VFbmZvcmNlclRvb2wsXG4gIGRvY3VtZW50T2JqZWN0VG9vbCxcbiAgcmVhZG1lSW1wcm92ZW1lbnRUb29sLFxufSBmcm9tIFwiLi9jb2RleC10b29sc1wiO1xuaW1wb3J0IHsgZGVjb3JhdG9yVG9vbHMgfSBmcm9tIFwiLi4vZGVjb3JhdG9yLXRvb2xzXCI7XG5jb25zdCBjb2RleFRvb2xMaXN0ID0gW1xuICBkb2N1bWVudE9iamVjdFRvb2wsXG4gIGNvdmVyYWdlRW5mb3JjZXJUb29sLFxuICByZWFkbWVJbXByb3ZlbWVudFRvb2wsXG5dO1xuXG5pbXBvcnQgeyB0b29sTGlzdCBhcyBjb3JlVG9vbExpc3QgfSBmcm9tIFwiLi90b29sc1wiO1xuXG5jb25zdCBtb2R1bGVUb29sTGlzdCA9IG1vZHVsZVJlZ2lzdHJ5XG4gIC5saXN0VG9vbHMoKVxuICAubWFwKChhc3NldCkgPT4gYXNzZXQudG9vbCBhcyBhbnkpO1xuXG5leHBvcnQgY29uc3QgdG9vbExpc3QgPSBbLi4uY29yZVRvb2xMaXN0LCAuLi5jb2RleFRvb2xMaXN0LCAuLi5tb2R1bGVUb29sTGlzdF07XG5jb25zdCBbXG4gIGFuYWx5emVSZXBvc2l0b3J5VG9vbCxcbiAgZW51bWVyYXRlQ2FwYWJpbGl0aWVzVG9vbCxcbiAgcGxhbkZlYXR1cmVUb29sLFxuICBkb2N1bWVudENvZGVUb29sUmVmLFxuICBhcHBseUNvZGVDaGFuZ2VUb29sUmVmLFxuXSA9IGNvcmVUb29sTGlzdDtcblxuZXhwb3J0IGNvbnN0IHRvb2xzID0ge1xuICBhbmFseXplUmVwb3NpdG9yeVRvb2wsXG4gIGVudW1lcmF0ZUNhcGFiaWxpdGllc1Rvb2wsXG4gIHBsYW5GZWF0dXJlVG9vbCxcbiAgZG9jdW1lbnRDb2RlVG9vbDogZG9jdW1lbnRDb2RlVG9vbFJlZixcbiAgYXBwbHlDb2RlQ2hhbmdlVG9vbDogYXBwbHlDb2RlQ2hhbmdlVG9vbFJlZixcbiAgZG9jdW1lbnRPYmplY3RUb29sLFxuICBjb3ZlcmFnZUVuZm9yY2VyVG9vbCxcbiAgcmVhZG1lSW1wcm92ZW1lbnRUb29sLFxuICAuLi5kZWNvcmF0b3JUb29scyxcbn07XG5leHBvcnQgeyBkZWNvcmF0b3JUb29scyB9O1xuIiwiaW1wb3J0IHR5cGUgeyBSZXNvdXJjZSB9IGZyb20gXCJmYXN0bWNwXCI7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlQXNzZXQgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IG1vZHVsZVJlZ2lzdHJ5IH0gZnJvbSBcIi4uL21vZHVsZVJlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VSb290IH0gZnJvbSBcIi4uL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHsgYnVpbGRPYmplY3RQcm9tcHRzLCBkaXNjb3ZlckRvY1Byb21wdHMgfSBmcm9tIFwiLi4vcHJvbXB0cy9wcm9tcHRzXCI7XG5cbmZ1bmN0aW9uIHRvUmVzb3VyY2UoYXNzZXQ6IFJlc291cmNlQXNzZXQpOiBSZXNvdXJjZTx1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBhc3NldC5pZCxcbiAgICB1cmk6IGFzc2V0LnVyaSxcbiAgICBkZXNjcmlwdGlvbjogYXNzZXQuZGVzY3JpcHRpb24gPz8gYXNzZXQudGl0bGUsXG4gICAgbWltZVR5cGU6IGFzc2V0Lm1pbWVUeXBlLFxuICAgIGxvYWQ6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFzc2V0LmxvYWQoKTtcbiAgICAgIC8vIGFzc2V0LmxvYWQgbWF5IHJldHVybiBhIENvbnRlbnRSZXN1bHQgb3IgYSBQcm9taXNlIG9mIENvbnRlbnRSZXN1bHQ7IGVuc3VyZSB3ZSByZXR1cm4gUmVzb3VyY2VSZXN1bHQtbGlrZSBvYmplY3RcbiAgICAgIGlmICgocmVzIGFzIGFueSk/LmNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgY3IgPSByZXMgYXMgYW55O1xuICAgICAgICAvLyBJZiBDb250ZW50UmVzdWx0LCBjb252ZXJ0IHRvIHNpbXBsZSB0ZXh0IHJlc3VsdCBleHBlY3RlZCBieSBSZXNvdXJjZS5sb2FkIGNvbnN1bWVyc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRleHQ6IEFycmF5LmlzQXJyYXkoY3IuY29udGVudClcbiAgICAgICAgICAgID8gY3IuY29udGVudC5tYXAoKGM6IGFueSkgPT4gYy50ZXh0KS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgICA6IFN0cmluZyhjciksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBmYWxsYmFjayBmb3Igb2JqZWN0cyB3aXRoIHRleHRcbiAgICAgIHJldHVybiByZXMgYXMgYW55IGFzIHsgdGV4dDogc3RyaW5nIH07XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRNb2R1bGVSZXNvdXJjZXMoKTogUmVzb3VyY2U8dW5kZWZpbmVkPltdIHtcbiAgcmV0dXJuIG1vZHVsZVJlZ2lzdHJ5Lmxpc3RSZXNvdXJjZXMoKS5tYXAodG9SZXNvdXJjZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZXNvdXJjZXM6IFJlc291cmNlPHVuZGVmaW5lZD5bXSA9IFtcbiAge1xuICAgIG5hbWU6IFwiY29kZXgtcHJvbXB0LWluZGV4XCIsXG4gICAgdXJpOiBcImNvZGV4Oi8vcHJvbXB0cy9pbmRleFwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFbnVtZXJhdGUgYXZhaWxhYmxlIC5jb2RleCBwcm9tcHQgZmlsZXMgd2l0aCB0aXRsZXMgYW5kIGRlc2NyaXB0aW9ucy5cIixcbiAgICBtaW1lVHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgbG9hZDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9vdCA9IGdldFdvcmtzcGFjZVJvb3QoKTtcbiAgICAgIGNvbnN0IHByb21wdHMgPSBkaXNjb3ZlckRvY1Byb21wdHMocm9vdCkubWFwKChwcm9tcHQpID0+ICh7XG4gICAgICAgIG5hbWU6IHByb21wdC5uYW1lLFxuICAgICAgICB0aXRsZTogcHJvbXB0LnRpdGxlLFxuICAgICAgICBkZXNjcmlwdGlvbjogcHJvbXB0LmRlc2NyaXB0aW9uLFxuICAgICAgICBwYXRoOiBwcm9tcHQuYWJzb2x1dGVQYXRoLFxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkoeyBwcm9tcHRzIH0sIG51bGwsIDIpLFxuICAgICAgICBtaW1lVHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9O1xuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcImNvZGV4LW9iamVjdC1wcm9tcHRzXCIsXG4gICAgdXJpOiBcImNvZGV4Oi8vcHJvbXB0cy9vYmplY3RzXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlByb3ZpZGVzIHRoZSByZXNvbHZlZCBwcm9tcHQgY29udGVudCBmb3IgZWFjaCBkb2N1bWVudGVkIG9iamVjdCB3b3JrZmxvdy5cIixcbiAgICBtaW1lVHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgbG9hZDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBidWlsZE9iamVjdFByb21wdHMoKS5tYXAoYXN5bmMgKHByb21wdCkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBwcm9tcHQubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcHJvbXB0LmRlc2NyaXB0aW9uLFxuICAgICAgICAgIGNvbnRlbnQ6IGF3YWl0IHByb21wdC5sb2FkKHt9IGFzIG5ldmVyKSxcbiAgICAgICAgfSkpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkoeyBwcm9tcHRzOiBlbnRyaWVzIH0sIG51bGwsIDIpLFxuICAgICAgICBtaW1lVHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9O1xuICAgIH0sXG4gIH0sXG4gIC4uLmJ1aWxkTW9kdWxlUmVzb3VyY2VzKCksXG5dO1xuIiwiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGdldFdvcmtzcGFjZVJvb3QsIHJlc29sdmVJbldvcmtzcGFjZSB9IGZyb20gXCIuLi93b3Jrc3BhY2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvbXB0UmVzb3VyY2VUZW1wbGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgY29kZXhQcm9tcHRUZW1wbGF0ZXM6IFByb21wdFJlc291cmNlVGVtcGxhdGVbXSA9IFtdO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb2RleFByb21wdFRlbXBsYXRlcygpOiBQcm9tcHRSZXNvdXJjZVRlbXBsYXRlW10ge1xuICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICBjb25zdCB0ZW1wbGF0ZXM6IFByb21wdFJlc291cmNlVGVtcGxhdGVbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBcImNvZGV4LXByb21wdFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiTG9hZCBhIC5jb2RleCBwcm9tcHQgZmlsZSBieSBuYW1lICh3aXRob3V0IGV4dGVuc2lvbikgYXMgbWFya2Rvd24uXCIsXG4gICAgICB1cmlUZW1wbGF0ZTogXCJjb2RleC1wcm9tcHQ6Ly97bmFtZX1cIixcbiAgICAgIG1pbWVUeXBlOiBcInRleHQvbWFya2Rvd25cIixcbiAgICAgIGFyZ3VtZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJuYW1lXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBcIk5hbWUgb2YgdGhlIHByb21wdCBmaWxlIGluc2lkZSAuY29kZXgvcHJvbXB0cyAod2l0aG91dCAubWQpLlwiLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGxvYWQ6IGFzeW5jICh7IG5hbWUgfSkgPT4ge1xuICAgICAgICBjb25zdCBwcm9tcHRQYXRoID0gcmVzb2x2ZUluV29ya3NwYWNlKFxuICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgcGF0aC5qb2luKFwiLmNvZGV4XCIsIFwicHJvbXB0c1wiLCBgJHtuYW1lfS5tZGApXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwcm9tcHRQYXRoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvbXB0IC5jb2RleC9wcm9tcHRzLyR7bmFtZX0ubWQgbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwcm9tcHRQYXRoLCBcInV0ZjhcIik7XG4gICAgICAgIHJldHVybiB7IHRleHQsIHVyaTogYGNvZGV4LXByb21wdDovLy8ke25hbWV9YCB9O1xuICAgICAgfSxcbiAgICB9LFxuICBdO1xuXG4gIGNvZGV4UHJvbXB0VGVtcGxhdGVzLnNwbGljZSgwLCBjb2RleFByb21wdFRlbXBsYXRlcy5sZW5ndGgsIC4uLnRlbXBsYXRlcyk7XG4gIHJldHVybiBjb2RleFByb21wdFRlbXBsYXRlcztcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IERlY29yYXRpb25SZXNvdXJjZVRlbXBsYXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VSb290LCByZWFkV29ya3NwYWNlRmlsZSB9IGZyb20gXCIuLi93b3Jrc3BhY2VcIjtcblxuZXhwb3J0IGNvbnN0IGRlY29yYXRpb25SZXNvdXJjZVRlbXBsYXRlczogRGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVbXSA9IFtdO1xuXG5mdW5jdGlvbiBtYWtlTG9hZGVyKHR5cGU6IFwic3JjXCIgfCBcInRlc3RzXCIgfCBcIndvcmtkb2NzXCIpIHtcbiAgcmV0dXJuIGFzeW5jICh7IHBhdGg6IHJlbGF0aXZlIH06IHsgcGF0aDogc3RyaW5nIH0pID0+IHtcbiAgICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICAgIGNvbnN0IHRhcmdldCA9IHBhdGguam9pbih0eXBlLCByZWxhdGl2ZSk7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlYWRXb3Jrc3BhY2VGaWxlKHJvb3QsIHRhcmdldCk7XG4gICAgcmV0dXJuIHsgdGV4dCB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREZWNvcmF0aW9uUmVzb3VyY2VUZW1wbGF0ZXMoKTogRGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVbXSB7XG4gIGNvbnN0IHRlbXBsYXRlczogRGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBcInJlYWQtY29kZS1mcm9tLXNvdXJjZVwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUmVhZCBhIGZpbGUgZnJvbSB0aGUgPGJhc2VfcGF0aD4vc3JjIHRyZWUgYnkgcmVsYXRpdmUgcGF0aC5cIixcbiAgICAgIG1pbWVUeXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgIHVyaVRlbXBsYXRlOiBcImZyb20tc291cmNlOi8vc3JjL3twYXRofVwiLFxuICAgICAgYXJndW1lbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInBhdGhcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwiUGF0aCB1bmRlciA8YmFzZV9wYXRoPi9zcmMgdG8gbG9hZCwgZS5nLiAnZGVjb3JhdGlvbi90eXBlcy50cydcIixcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBsb2FkOiBtYWtlTG9hZGVyKFwic3JjXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJyZWFkLXRlc3QtZnJvbS1zb3VyY2VcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlJlYWQgYSBmaWxlIGZyb20gdGhlIDxiYXNlX3BhdGg+L3Rlc3RzIHRyZWUgYnkgcmVsYXRpdmUgcGF0aC5cIixcbiAgICAgIG1pbWVUeXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgIHVyaVRlbXBsYXRlOiBcImZyb20tc291cmNlOi8vdGVzdHMve3BhdGh9XCIsXG4gICAgICBhcmd1bWVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicGF0aFwiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgXCJQYXRoIHVuZGVyIDxiYXNlX3BhdGg+L3Rlc3RzIHRvIGxvYWQsIGUuZy4gJ2RlY29yYXRpb24vdGVzdHMvdHlwZXMudGVzdC50cydcIixcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBsb2FkOiBtYWtlTG9hZGVyKFwidGVzdHNcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInJlYWQtZG9jLWZyb20tc291cmNlXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJSZWFkIGEgZmlsZSBmcm9tIHRoZSA8YmFzZV9wYXRoPi93b3JrZG9jcyB0cmVlIGJ5IHJlbGF0aXZlIHBhdGguXCIsXG4gICAgICBtaW1lVHlwZTogXCJ0ZXh0L3BsYWluXCIsXG4gICAgICB1cmlUZW1wbGF0ZTogXCJmcm9tLXNvdXJjZTovL3dvcmtkb2NzL3twYXRofVwiLFxuICAgICAgYXJndW1lbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInBhdGhcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwiUGF0aCB1bmRlciA8YmFzZV9wYXRoPi93b3JrZG9jcyB0byBsb2FkLCBlLmcuICdkZWNvcmF0aW9uL3dvcmtkb2NzL3R1dG9yaWFscy9mb3ItZGV2ZWxvcGVycy5tZCdcIixcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBsb2FkOiBtYWtlTG9hZGVyKFwid29ya2RvY3NcIiksXG4gICAgfSxcbiAgXTtcblxuICBkZWNvcmF0aW9uUmVzb3VyY2VUZW1wbGF0ZXMuc3BsaWNlKFxuICAgIDAsXG4gICAgZGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVzLmxlbmd0aCxcbiAgICAuLi50ZW1wbGF0ZXNcbiAgKTtcbiAgcmV0dXJuIGRlY29yYXRpb25SZXNvdXJjZVRlbXBsYXRlcztcbn1cbiIsImltcG9ydCB7IFdvcmtzcGFjZVJlc291cmNlVGVtcGxhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldFdvcmtzcGFjZVJvb3QsIHJlYWRXb3Jrc3BhY2VGaWxlIH0gZnJvbSBcIi4uL3dvcmtzcGFjZVwiO1xuXG5leHBvcnQgY29uc3Qgd29ya3NwYWNlUmVzb3VyY2VUZW1wbGF0ZXM6IFdvcmtzcGFjZVJlc291cmNlVGVtcGxhdGVbXSA9IFtdO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRXb3Jrc3BhY2VSZXNvdXJjZVRlbXBsYXRlcygpOiBXb3Jrc3BhY2VSZXNvdXJjZVRlbXBsYXRlW10ge1xuICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICBjb25zdCBzaGFyZWRBcmd1bWVudHMgPSBbXG4gICAge1xuICAgICAgbmFtZTogXCJwYXRoXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJQYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2Ugcm9vdFwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgXSBhcyBjb25zdDtcblxuICBjb25zdCB0ZW1wbGF0ZXM6IFdvcmtzcGFjZVJlc291cmNlVGVtcGxhdGVbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBcInZzY29kZS13b3Jrc3BhY2UtZmlsZVwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiRXhwb3NlIHdvcmtzcGFjZSBmaWxlcyB0byBWaXN1YWwgU3R1ZGlvIENvZGUgdmlhIHZzY29kZTovLyBVUklzXCIsXG4gICAgICB1cmlUZW1wbGF0ZTogXCJ2c2NvZGU6Ly93b3Jrc3BhY2Uve3BhdGh9XCIsXG4gICAgICBtaW1lVHlwZTogXCJ0ZXh0L3BsYWluXCIsXG4gICAgICBhcmd1bWVudHM6IHNoYXJlZEFyZ3VtZW50cyxcbiAgICAgIGxvYWQ6IGFzeW5jIChhcmdzOiB7IHBhdGg6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlYWRXb3Jrc3BhY2VGaWxlKHJvb3QsIGFyZ3MucGF0aCk7XG4gICAgICAgICAgcmV0dXJuIHsgdGV4dDogU3RyaW5nKHRleHQpIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIHByb3BhZ2F0ZSBhcy1pcyBmb3IgdGVzdHMgdG8gYXNzZXJ0IGVycm9yc1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY3Vyc29yLXdvcmtzcGFjZS1maWxlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJFeHBvc2Ugd29ya3NwYWNlIGZpbGVzIHRvIEN1cnNvciB2aWEgY3Vyc29yOi8vIFVSSXNcIixcbiAgICAgIHVyaVRlbXBsYXRlOiBcImN1cnNvcjovL3dvcmtzcGFjZS97cGF0aH1cIixcbiAgICAgIG1pbWVUeXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgIGFyZ3VtZW50czogc2hhcmVkQXJndW1lbnRzLFxuICAgICAgbG9hZDogYXN5bmMgKGFyZ3M6IHsgcGF0aDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVhZFdvcmtzcGFjZUZpbGUocm9vdCwgYXJncy5wYXRoKTtcbiAgICAgICAgICByZXR1cm4geyB0ZXh0OiBTdHJpbmcodGV4dCkgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb3BpbG90LXdvcmtzcGFjZS1maWxlXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJFeHBvc2Ugd29ya3NwYWNlIGZpbGVzIHRvIEdpdEh1YiBDb3BpbG90IHZpYSBjb3BpbG90Oi8vIFVSSXNcIixcbiAgICAgIHVyaVRlbXBsYXRlOiBcImNvcGlsb3Q6Ly93b3Jrc3BhY2Uve3BhdGh9XCIsXG4gICAgICBtaW1lVHlwZTogXCJ0ZXh0L3BsYWluXCIsXG4gICAgICBhcmd1bWVudHM6IHNoYXJlZEFyZ3VtZW50cyxcbiAgICAgIGxvYWQ6IGFzeW5jIChhcmdzOiB7IHBhdGg6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlYWRXb3Jrc3BhY2VGaWxlKHJvb3QsIGFyZ3MucGF0aCk7XG4gICAgICAgICAgcmV0dXJuIHsgdGV4dDogU3RyaW5nKHRleHQpIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICBdO1xuXG4gIHdvcmtzcGFjZVJlc291cmNlVGVtcGxhdGVzLnNwbGljZShcbiAgICAwLFxuICAgIHdvcmtzcGFjZVJlc291cmNlVGVtcGxhdGVzLmxlbmd0aCxcbiAgICAuLi50ZW1wbGF0ZXNcbiAgKTtcbiAgcmV0dXJuIHdvcmtzcGFjZVJlc291cmNlVGVtcGxhdGVzO1xufVxuXG4iLCJpbXBvcnQgeyBidWlsZENvZGV4UHJvbXB0VGVtcGxhdGVzIH0gZnJvbSBcIi4vY29kZXgtdGVtcGxhdGVzXCI7XG5pbXBvcnQgeyBidWlsZERlY29yYXRpb25SZXNvdXJjZVRlbXBsYXRlcyB9IGZyb20gXCIuL3Jlc291cmNlLXRlbXBsYXRlc1wiO1xuaW1wb3J0IHsgYnVpbGRXb3Jrc3BhY2VSZXNvdXJjZVRlbXBsYXRlcyB9IGZyb20gXCIuL3dvcmtzcGFjZS10ZW1wbGF0ZXNcIjtcbmltcG9ydCB7IG1vZHVsZVJlZ2lzdHJ5IH0gZnJvbSBcIi4uL21vZHVsZVJlZ2lzdHJ5XCI7XG5cbmV4cG9ydCB7XG4gIGJ1aWxkQ29kZXhQcm9tcHRUZW1wbGF0ZXMsXG4gIGNvZGV4UHJvbXB0VGVtcGxhdGVzLFxufSBmcm9tIFwiLi9jb2RleC10ZW1wbGF0ZXNcIjtcbmV4cG9ydCB7XG4gIGJ1aWxkRGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVzLFxuICBkZWNvcmF0aW9uUmVzb3VyY2VUZW1wbGF0ZXMsXG59IGZyb20gXCIuL3Jlc291cmNlLXRlbXBsYXRlc1wiO1xuZXhwb3J0IHtcbiAgYnVpbGRXb3Jrc3BhY2VSZXNvdXJjZVRlbXBsYXRlcyxcbiAgd29ya3NwYWNlUmVzb3VyY2VUZW1wbGF0ZXMsXG59IGZyb20gXCIuL3dvcmtzcGFjZS10ZW1wbGF0ZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVzb3VyY2VUZW1wbGF0ZXMoKSB7XG4gIGNvbnN0IG1vZHVsZVRlbXBsYXRlcyA9IG1vZHVsZVJlZ2lzdHJ5Lmxpc3RUZW1wbGF0ZXMoKS5tYXAoKHRlbXBsYXRlKSA9PiAoe1xuICAgIG5hbWU6IHRlbXBsYXRlLmlkLFxuICAgIGRlc2NyaXB0aW9uOiB0ZW1wbGF0ZS5kZXNjcmlwdGlvbiA/PyB0ZW1wbGF0ZS50aXRsZSxcbiAgICBtaW1lVHlwZTogXCJ0ZXh0L21hcmtkb3duXCIsXG4gICAgdXJpVGVtcGxhdGU6IGBtb2R1bGUtdGVtcGxhdGU6Ly8ke3RlbXBsYXRlLmlkfWAsXG4gICAgYXJndW1lbnRzOiAodGVtcGxhdGUucGxhY2Vob2xkZXJzID8/IFtdKS5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGBWYWx1ZSBmb3IgJHtuYW1lfWAsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSksXG4gICAgbG9hZDogYXN5bmMgKCkgPT4gKHtcbiAgICAgIHRleHQ6XG4gICAgICAgIHR5cGVvZiAodGVtcGxhdGUgYXMgYW55KS5jb250ZW50ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyAodGVtcGxhdGUgYXMgYW55KS5jb250ZW50XG4gICAgICAgICAgOiBgIyAke3RlbXBsYXRlLmRlc2NyaXB0aW9uID8/IHRlbXBsYXRlLnRpdGxlID8/IHRlbXBsYXRlLmlkfVxcblxcbk5vIHRlbXBsYXRlIGNvbnRlbnQgYXZhaWxhYmxlIGZvciAke3RlbXBsYXRlLmlkfWAsXG4gICAgfSksXG4gIH0pKTtcblxuICBjb25zdCBhbGwgPSBbXG4gICAgLi4uYnVpbGRXb3Jrc3BhY2VSZXNvdXJjZVRlbXBsYXRlcygpLFxuICAgIC4uLmJ1aWxkQ29kZXhQcm9tcHRUZW1wbGF0ZXMoKSxcbiAgICAuLi5idWlsZERlY29yYXRpb25SZXNvdXJjZVRlbXBsYXRlcygpLFxuICAgIC4uLm1vZHVsZVRlbXBsYXRlcyxcbiAgXTtcblxuICAvLyBOb3JtYWxpc2UgYWxsIGxvYWRlcnMgdG8gYWx3YXlzIHJldHVybiB7IHRleHQ6IHN0cmluZyB9XG4gIGZ1bmN0aW9uIG5vcm1hbGlzZVJlc3VsdChyZXM6IGFueSkge1xuICAgIGlmIChyZXMgPT0gbnVsbCkgcmV0dXJuIHsgdGV4dDogXCJcIiB9O1xuICAgIGlmICh0eXBlb2YgcmVzID09PSBcInN0cmluZ1wiKSByZXR1cm4geyB0ZXh0OiByZXMgfTtcbiAgICBpZiAodHlwZW9mIHJlcy50ZXh0ID09PSBcInN0cmluZ1wiKSByZXR1cm4gcmVzO1xuICAgIC8vIGhhbmRsZSBsZWdhY3kgQ29udGVudFJlc3VsdCBzaGFwZXMgd2l0aCBjb250ZW50IG9yIGNvbnRlbnQgYXJyYXlcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXMuY29udGVudCkpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gcmVzLmNvbnRlbnRcbiAgICAgICAgLm1hcCgoYzogYW55KSA9PiAoYyAmJiB0eXBlb2YgYy50ZXh0ID09PSBcInN0cmluZ1wiID8gYy50ZXh0IDogU3RyaW5nKGMpKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIik7XG4gICAgICByZXR1cm4geyB0ZXh0OiBwYXJ0cyB9O1xuICAgIH1cbiAgICBpZiAocmVzLmNvbnRlbnQgJiYgdHlwZW9mIHJlcy5jb250ZW50LnRleHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7IHRleHQ6IHJlcy5jb250ZW50LnRleHQgfTtcbiAgICB9XG4gICAgLy8gZmFsbGJhY2s6IHN0cmluZ2lmeVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXMpIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geyB0ZXh0OiBTdHJpbmcocmVzKSB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhbGwubWFwKCh0KSA9PiAoe1xuICAgIC4uLnQsXG4gICAgbG9hZDogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcmF3ID0gYXdhaXQgKHQubG9hZCBhcyBhbnkpKGFyZ3MpO1xuICAgICAgcmV0dXJuIG5vcm1hbGlzZVJlc3VsdChyYXcpO1xuICAgIH0sXG4gIH0pKTtcbn1cblxuZXhwb3J0IGNvbnN0IHRlbXBsYXRlTGlzdCA9IGJ1aWxkUmVzb3VyY2VUZW1wbGF0ZXMoKTtcbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBuYW1lIFZFUlNJT05cbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRzLXdvcmtzcGFjZSBtb2R1bGUuXG4gKiBAc3VtbWFyeSBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFX05BTUUjI1wiO1xuXG50cnkge1xuICBNZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbn0gY2F0Y2ggKGVycm9yKSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJhbHJlYWR5XCIpKSB7XG4gICAgLy8gSWdub3JlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24gZHVyaW5nIHRlc3RzL2J1bmRsaW5nIGNoZWNrcy5cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBGYXN0TUNQIH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7IFBBQ0tBR0VfTkFNRSBhcyBQS0csIFZFUlNJT04gYXMgViB9IGZyb20gXCIuLi9tZXRhZGF0YVwiO1xuaW1wb3J0IHsgbG9hZFByb21wdHMsIHByb21wdExpc3QgfSBmcm9tIFwiLi9wcm9tcHRzXCI7XG5pbXBvcnQgeyByZXNvdXJjZXMgfSBmcm9tIFwiLi9yZXNvdXJjZXNcIjtcbmltcG9ydCB7XG4gIGJ1aWxkRGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVzLFxuICBidWlsZFJlc291cmNlVGVtcGxhdGVzLFxuICBkZWNvcmF0aW9uUmVzb3VyY2VUZW1wbGF0ZXMsXG4gIHRlbXBsYXRlTGlzdCxcbiAgd29ya3NwYWNlUmVzb3VyY2VUZW1wbGF0ZXMsXG59IGZyb20gXCIuL3RlbXBsYXRlc1wiO1xuaW1wb3J0IHsgdG9vbExpc3QsIHRvb2xzIH0gZnJvbSBcIi4vdG9vbHNcIjtcbmltcG9ydCB7XG4gIF9fcmVzZXRXb3Jrc3BhY2VSb290LFxuICBnZXRXb3Jrc3BhY2VSb290LFxuICBzZXRXb3Jrc3BhY2VSb290LFxufSBmcm9tIFwiLi93b3Jrc3BhY2VcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGVucmljaChtY3A6IEZhc3RNQ1ApOiBGYXN0TUNQIHtcbiAgY29uc3QgcHJvbXB0RW50cmllcyA9IGxvYWRQcm9tcHRzKCk7XG4gIGZvciAoY29uc3QgcHJvbXB0IG9mIHByb21wdEVudHJpZXMpIHtcbiAgICBtY3AuYWRkUHJvbXB0KHByb21wdCBhcyBhbnkpO1xuICB9XG5cbiAgZm9yIChjb25zdCB0b29sIG9mIHRvb2xMaXN0KSB7XG4gICAgbWNwLmFkZFRvb2wodG9vbCBhcyBhbnkpO1xuICB9XG5cbiAgY29uc3QgdGVtcGxhdGVzID0gYnVpbGRSZXNvdXJjZVRlbXBsYXRlcygpO1xuICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIHRlbXBsYXRlcykge1xuICAgIG1jcC5hZGRSZXNvdXJjZVRlbXBsYXRlKHRlbXBsYXRlIGFzIGFueSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuICAgIGNvbnN0IGFkZFJlc291cmNlID0gKFxuICAgICAgbWNwIGFzIHVua25vd24gYXMgeyBhZGRSZXNvdXJjZT86IChyZXM6IHVua25vd24pID0+IHZvaWQgfVxuICAgICkuYWRkUmVzb3VyY2U7XG4gICAgaWYgKHR5cGVvZiBhZGRSZXNvdXJjZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhZGRSZXNvdXJjZS5jYWxsKG1jcCwgcmVzb3VyY2UgYXMgYW55KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWNwO1xufVxuXG5leHBvcnQgZGVmYXVsdCBlbnJpY2g7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gUEtHO1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBWO1xuXG5leHBvcnQge1xuICB0b29scyxcbiAgdG9vbExpc3QsXG4gIGJ1aWxkRGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVzLFxuICBidWlsZFJlc291cmNlVGVtcGxhdGVzLFxuICBkZWNvcmF0aW9uUmVzb3VyY2VUZW1wbGF0ZXMsXG4gIHByb21wdExpc3QsXG4gIHJlc291cmNlcyxcbiAgdGVtcGxhdGVMaXN0LFxuICB3b3Jrc3BhY2VSZXNvdXJjZVRlbXBsYXRlcyxcbiAgZ2V0V29ya3NwYWNlUm9vdCxcbiAgc2V0V29ya3NwYWNlUm9vdCxcbiAgX19yZXNldFdvcmtzcGFjZVJvb3QsXG59O1xuIiwiLy8gTmV3OiB2YWxpZGF0aW9uIGVudHJ5cG9pbnQgZm9yIG1vZHVsZSBzdHJ1Y3R1cmVcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25Jc3N1ZSA9IHtcbiAgbW9kdWxlOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgdHlwZTpcbiAgICB8IFwibWlzc2luZy1mb2xkZXJcIlxuICAgIHwgXCJtaXNzaW5nLWV4cG9ydFwiXG4gICAgfCBcImVtcHR5LWxpc3RcIlxuICAgIHwgXCJkaXNhYmxlZFwiXG4gICAgfCBcIm90aGVyXCI7XG4gIGRldGFpbD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25SZXBvcnQgPSB7XG4gIG9rOiBib29sZWFuO1xuICBtb2R1bGVzQ2hlY2tlZDogbnVtYmVyO1xuICBpc3N1ZXM6IFZhbGlkYXRpb25Jc3N1ZVtdO1xufTtcblxuY29uc3QgUkVRVUlSRURfU1VCRk9MREVSUyA9IFtcInByb21wdHNcIiwgXCJyZXNvdXJjZXNcIiwgXCJ0ZW1wbGF0ZXNcIiwgXCJ0b29sc1wiXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRNb2R1bGVEaXJzKHJlcG9Sb290OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG1vZHVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJlcG9Sb290LCBcInNyY1wiLCBcIm1vZHVsZXNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhtb2R1bGVzUGF0aCkgfHwgIWZzLnN0YXRTeW5jKG1vZHVsZXNQYXRoKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBmc1xuICAgIC5yZWFkZGlyU3luYyhtb2R1bGVzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG4gICAgLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKVxuICAgIC5tYXAoKGQpID0+IHBhdGguam9pbihtb2R1bGVzUGF0aCwgZC5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIGhhc0luZGV4RXhwb3J0KGZvbGRlclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjYW5kaWRhdGVzID0gW1xuICAgIFwiaW5kZXgudHNcIixcbiAgICBcImluZGV4LnRzeFwiLFxuICAgIFwiaW5kZXguanNcIixcbiAgICBcImluZGV4LmNqc1wiLFxuICAgIFwiaW5kZXgubWpzXCIsXG4gIF07XG4gIGZvciAoY29uc3QgYyBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGZvbGRlclBhdGgsIGMpKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNb2R1bGVzKHJlcG9Sb290OiBzdHJpbmcpOiBWYWxpZGF0aW9uUmVwb3J0IHtcbiAgY29uc3QgZGlycyA9IGZpbmRNb2R1bGVEaXJzKHJlcG9Sb290KTtcbiAgY29uc3QgaXNzdWVzOiBWYWxpZGF0aW9uSXNzdWVbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgbW9kdWxlRGlyIG9mIGRpcnMpIHtcbiAgICBjb25zdCBtb2R1bGVOYW1lID0gcGF0aC5iYXNlbmFtZShtb2R1bGVEaXIpO1xuICAgIGZvciAoY29uc3Qgc3ViIG9mIFJFUVVJUkVEX1NVQkZPTERFUlMpIHtcbiAgICAgIGNvbnN0IHN1YlBhdGggPSBwYXRoLmpvaW4obW9kdWxlRGlyLCBzdWIpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHN1YlBhdGgpIHx8ICFmcy5zdGF0U3luYyhzdWJQYXRoKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICBtb2R1bGU6IG1vZHVsZU5hbWUsXG4gICAgICAgICAgcGF0aDogc3ViUGF0aCxcbiAgICAgICAgICB0eXBlOiBcIm1pc3NpbmctZm9sZGVyXCIsXG4gICAgICAgICAgZGV0YWlsOiBgUmVxdWlyZWQgZm9sZGVyICcke3N1Yn0nIGlzIG1pc3NpbmcgaW4gbW9kdWxlICcke21vZHVsZU5hbWV9J2AsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIElmIGZvbGRlciBleGlzdHMsIGNoZWNrIGZvciBpbmRleCBleHBvcnRcbiAgICAgIGlmICghaGFzSW5kZXhFeHBvcnQoc3ViUGF0aCkpIHtcbiAgICAgICAgaXNzdWVzLnB1c2goe1xuICAgICAgICAgIG1vZHVsZTogbW9kdWxlTmFtZSxcbiAgICAgICAgICBwYXRoOiBzdWJQYXRoLFxuICAgICAgICAgIHR5cGU6IFwibWlzc2luZy1leHBvcnRcIixcbiAgICAgICAgICBkZXRhaWw6IGBObyBpbmRleCBleHBvcnQgZm91bmQgaW4gJyR7c3ViUGF0aH0nLiBFeHBlY3RlZCBvbmUgb2YgaW5kZXgudHMsIGluZGV4LmpzLCBldGMuYCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gT3B0aW9uYWxseSBpbnNwZWN0IHRoZSBpbmRleCBmaWxlIHRvIHNlZSBpZiBpdCBleHBvcnRzIGEgbGlzdCAobGlnaHR3ZWlnaHQgY2hlY2spXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpbmRleEZpbGUgPSBjYW5kaWRhdGVzRmluZGluZ0luZGV4KHN1YlBhdGgpO1xuICAgICAgICBpZiAoaW5kZXhGaWxlKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhpbmRleEZpbGUsIFwidXRmOFwiKTtcbiAgICAgICAgICAvLyBjcnVkZSBoZXVyaXN0aWNzOiBsb29rIGZvciBgZXhwb3J0IGNvbnN0IG5hbWUgPSBbYCBvciBgZXhwb3J0IGNvbnN0IG5hbWU6IFR5cGVbXSA9IFtgLFxuICAgICAgICAgIC8vIG9yIGFueSBuYW1lZCBleHBvcnQgbGlrZSBgZXhwb3J0IHsgc29tZXRoaW5nIH1gIHdoaWNoIGltcGxpZXMgZXhwb3J0cyBleGlzdC5cbiAgICAgICAgICBjb25zdCBleHBvcnRMaXN0UGF0dGVybiA9XG4gICAgICAgICAgICAvZXhwb3J0XFxzKyhjb25zdHxsZXR8dmFyKVxccytbXFx3JF0rKD86XFxzKjpcXHMqW149XSspP1xccyo9XFxzKlxcWy87XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWV4cG9ydExpc3RQYXR0ZXJuLnRlc3QoY29udGVudCkgJiZcbiAgICAgICAgICAgICEvZXhwb3J0XFxzK1xcey8udGVzdChjb250ZW50KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICBtb2R1bGU6IG1vZHVsZU5hbWUsXG4gICAgICAgICAgICAgIHBhdGg6IGluZGV4RmlsZSxcbiAgICAgICAgICAgICAgdHlwZTogXCJlbXB0eS1saXN0XCIsXG4gICAgICAgICAgICAgIGRldGFpbDogYEluZGV4IGZpbGUgZG9lcyBub3QgYXBwZWFyIHRvIGV4cG9ydCBhIGxpc3Qgb2YgYXNzZXRzOiAke3BhdGguYmFzZW5hbWUoaW5kZXhGaWxlKX1gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpc3N1ZXMucHVzaCh7XG4gICAgICAgICAgbW9kdWxlOiBtb2R1bGVOYW1lLFxuICAgICAgICAgIHBhdGg6IHN1YlBhdGgsXG4gICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgIGRldGFpbDogYEVycm9yIHJlYWRpbmcgaW5kZXggZmlsZTogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG9rOiBpc3N1ZXMubGVuZ3RoID09PSAwLFxuICAgIG1vZHVsZXNDaGVja2VkOiBkaXJzLmxlbmd0aCxcbiAgICBpc3N1ZXMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhbmRpZGF0ZXNGaW5kaW5nSW5kZXgoZm9sZGVyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICBcImluZGV4LnRzXCIsXG4gICAgXCJpbmRleC50c3hcIixcbiAgICBcImluZGV4LmpzXCIsXG4gICAgXCJpbmRleC5janNcIixcbiAgICBcImluZGV4Lm1qc1wiLFxuICBdO1xuICBmb3IgKGNvbnN0IGMgb2YgY2FuZGlkYXRlcykge1xuICAgIGNvbnN0IGZ1bGwgPSBwYXRoLmpvaW4oZm9sZGVyUGF0aCwgYyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZnVsbCkpIHJldHVybiBmdWxsO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8vIENMSSBoZWxwZXJcbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBjb25zdCByZXBvUm9vdCA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHJlcG9ydCA9IHZhbGlkYXRlTW9kdWxlcyhyZXBvUm9vdCk7XG4gIGlmICghcmVwb3J0Lm9rKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIFwiTW9kdWxlIHZhbGlkYXRpb24gZmFpbGVkOlxcblwiLFxuICAgICAgSlNPTi5zdHJpbmdpZnkocmVwb3J0LCBudWxsLCAyKVxuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDIpO1xuICB9XG4gIGNvbnNvbGUubG9nKFwiTW9kdWxlIHZhbGlkYXRpb24gcGFzc2VkXCIpO1xuICBwcm9jZXNzLmV4aXQoMCk7XG59XG4iLCIvLyBBZ2dyZWdhdG9yOiBpbXBvcnQgbW9kdWxlIGluZGV4IGZpbGVzIGFuZCBtZXJnZSBleHBvcnRlZCBhcnJheXMgd2l0aCBwcm92ZW5hbmNlICsgZHVwbGljYXRlIGRldGVjdGlvblxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwidXJsXCI7XG5pbXBvcnQgeyBmaW5kTW9kdWxlRGlycyB9IGZyb20gXCIuL3ZhbGlkYXRpb25cIjtcblxuZXhwb3J0IHR5cGUgUHJvdmVuYW5jZSA9IHsgbW9kdWxlTmFtZTogc3RyaW5nOyBtb2R1bGVQYXRoOiBzdHJpbmcgfTtcbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uQ29uZmxpY3QgPSB7XG4gIGtleTogc3RyaW5nO1xuICBleGlzdGluZzogUHJvdmVuYW5jZTtcbiAgaW5jb21pbmc6IFByb3ZlbmFuY2U7XG59O1xuXG5leHBvcnQgdHlwZSBBZ2dyZWdhdGlvblJlc3VsdDxUID0gYW55PiA9IHtcbiAgcHJvbXB0czogQXJyYXk8VCAmIHsgcHJvdmVuYW5jZTogUHJvdmVuYW5jZSB9PjtcbiAgcmVzb3VyY2VzOiBBcnJheTxUICYgeyBwcm92ZW5hbmNlOiBQcm92ZW5hbmNlIH0+O1xuICB0ZW1wbGF0ZXM6IEFycmF5PFQgJiB7IHByb3ZlbmFuY2U6IFByb3ZlbmFuY2UgfT47XG4gIHRvb2xzOiBBcnJheTxUICYgeyBwcm92ZW5hbmNlOiBQcm92ZW5hbmNlIH0+O1xuICBjb25mbGljdHM6IEFnZ3JlZ2F0aW9uQ29uZmxpY3RbXTtcbn07XG5cbmNvbnN0IFNVQkZPTERFUlMgPSBbXCJwcm9tcHRzXCIsIFwicmVzb3VyY2VzXCIsIFwidGVtcGxhdGVzXCIsIFwidG9vbHNcIl07XG5jb25zdCBJTkRFWF9DQU5ESURBVEVTID0gW1xuICBcImluZGV4LnRzXCIsXG4gIFwiaW5kZXgudHN4XCIsXG4gIFwiaW5kZXguanNcIixcbiAgXCJpbmRleC5janNcIixcbiAgXCJpbmRleC5tanNcIixcbl07XG5cbmZ1bmN0aW9uIGZpbmRJbmRleEZpbGUoZm9sZGVyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGMgb2YgSU5ERVhfQ0FORElEQVRFUykge1xuICAgIGNvbnN0IGYgPSBwYXRoLmpvaW4oZm9sZGVyLCBjKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhmKSkgcmV0dXJuIGY7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbWFrZUtleUZvckl0ZW0oaXRlbTogYW55KTogc3RyaW5nIHtcbiAgaWYgKCFpdGVtKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkoaXRlbSk7XG4gIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGBzdHI6JHtpdGVtfWA7XG4gIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGBudW06JHtpdGVtfWA7XG4gIGlmIChpdGVtLmlkKSByZXR1cm4gYGlkOiR7aXRlbS5pZH1gO1xuICBpZiAoaXRlbS5uYW1lKSByZXR1cm4gYG5hbWU6JHtpdGVtLm5hbWV9YDtcbiAgLy8gZmFsbGJhY2sgdG8gc3RhYmxlIHN0cmluZ1xuICB0cnkge1xuICAgIHJldHVybiBgb2JqOiR7SlNPTi5zdHJpbmdpZnkoaXRlbSl9YDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBgb2JqOiR7U3RyaW5nKGl0ZW0pfWA7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZEFycmF5RnJvbUluZGV4KFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPGFueVtdIHwgdW5kZWZpbmVkPiB7XG4gIC8vIFByZWZlciBhIGZhc3QsIHN0YXRpYyBwYXJzZSBvZiB0aGUgZmlyc3QgYXJyYXkgbGl0ZXJhbCBmb3VuZCBpbiB0aGUgZmlsZS5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCBcInV0ZjhcIik7XG4gICAgY29uc3Qgc3RhcnQgPSBjb250ZW50LmluZGV4T2YoXCJbXCIpO1xuICAgIGlmIChzdGFydCAhPT0gLTEpIHtcbiAgICAgIGxldCBkZXB0aCA9IDA7XG4gICAgICBsZXQgZW5kID0gLTE7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoID0gY29udGVudFtpXTtcbiAgICAgICAgaWYgKGNoID09PSBcIltcIikgZGVwdGgrKztcbiAgICAgICAgZWxzZSBpZiAoY2ggPT09IFwiXVwiKSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICAgIGVuZCA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlbmQgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IGFyclRleHQgPSBjb250ZW50LnNsaWNlKHN0YXJ0LCBlbmQgKyAxKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShhcnJUZXh0KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIE5vcm1hbGl6ZSBUUyBvYmplY3QgbGl0ZXJhbHMgdG8gSlNPTjpcbiAgICAgICAgICAvLyAtIGNvbnZlcnQgc2luZ2xlIHF1b3RlcyB0byBkb3VibGUgcXVvdGVzXG4gICAgICAgICAgLy8gLSBxdW90ZSB1bnF1b3RlZCBvYmplY3Qga2V5c1xuICAgICAgICAgIC8vIC0gc3RyaXAgdHJhaWxpbmcgY29tbWFzXG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGFyclRleHRcbiAgICAgICAgICAgIC8vIHVuaWZ5IHF1b3RlcyBpbiBzdHJpbmcgbGl0ZXJhbHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC8nKD86XFxcXCd8W14nXSkqJy9nLCAobSkgPT4gbS5yZXBsYWNlKC8nL2csICdcIicpKVxuICAgICAgICAgICAgLy8gcXVvdGUgdW5xdW90ZWQga2V5cyBhZnRlciB7IG9yICxcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oW1xceyxdXFxzKikoW0EtWmEtel8kXVtcXHckXSopKFxccyo6KS9nLCAnJDFcIiQyXCIkMycpXG4gICAgICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgY29tbWFzIGJlZm9yZSBdIG9yIH1cbiAgICAgICAgICAgIC5yZXBsYWNlKC8sKFxccypbXFx9XFxdXSkvZywgJyQxJyk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKG5vcm1hbGl6ZWQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaCB0byBpbXBvcnQgYXR0ZW1wdCBiZWxvd1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGlnbm9yZSBzdGF0aWMgcGFyc2UgZXJyb3JzIGFuZCBmYWxsIGJhY2sgdG8gaW1wb3J0XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGZpbGVVcmwgPSBwYXRoVG9GaWxlVVJMKGZpbGVQYXRoKS5ocmVmO1xuICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChmaWxlVXJsKTtcbiAgICAvLyBGaW5kIGZpcnN0IGV4cG9ydCB0aGF0IGlzIGFuIGFycmF5XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobW9kKSkge1xuICAgICAgY29uc3QgdmFsID0gKG1vZCBhcyBhbnkpW2tleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gdmFsO1xuICAgIH1cbiAgICAvLyBkZWZhdWx0IGV4cG9ydCBjaGVja1xuICAgIGlmIChBcnJheS5pc0FycmF5KChtb2QgYXMgYW55KS5kZWZhdWx0KSkgcmV0dXJuIChtb2QgYXMgYW55KS5kZWZhdWx0O1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIGZhbGxiYWNrOiBpZiBpbXBvcnQgZmFpbHMsIHRyeSB0byBzdGF0aWMtcGFyc2UgYWdhaW4gKGFscmVhZHkgYXR0ZW1wdGVkKSBhbmQgZmluYWxseSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWdncmVnYXRlTW9kdWxlcyhcbiAgcmVwb1Jvb3Q6IHN0cmluZ1xuKTogUHJvbWlzZTxBZ2dyZWdhdGlvblJlc3VsdD4ge1xuICBjb25zdCBkaXJzID0gZmluZE1vZHVsZURpcnMocmVwb1Jvb3QpO1xuICBjb25zdCBtYXN0ZXIgPSB7XG4gICAgcHJvbXB0czogW10gYXMgYW55W10sXG4gICAgcmVzb3VyY2VzOiBbXSBhcyBhbnlbXSxcbiAgICB0ZW1wbGF0ZXM6IFtdIGFzIGFueVtdLFxuICAgIHRvb2xzOiBbXSBhcyBhbnlbXSxcbiAgICBjb25mbGljdHM6IFtdIGFzIEFnZ3JlZ2F0aW9uQ29uZmxpY3RbXSxcbiAgfTtcblxuICAvLyBtYXBzIHRvIGRldGVjdCBkdXBsaWNhdGVzIHBlciB0eXBlXG4gIGNvbnN0IG1hcHM6IFJlY29yZDxzdHJpbmcsIE1hcDxzdHJpbmcsIFByb3ZlbmFuY2U+PiA9IHtcbiAgICBwcm9tcHRzOiBuZXcgTWFwKCksXG4gICAgcmVzb3VyY2VzOiBuZXcgTWFwKCksXG4gICAgdGVtcGxhdGVzOiBuZXcgTWFwKCksXG4gICAgdG9vbHM6IG5ldyBNYXAoKSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IG1vZHVsZURpciBvZiBkaXJzKSB7XG4gICAgY29uc3QgbW9kdWxlTmFtZSA9IHBhdGguYmFzZW5hbWUobW9kdWxlRGlyKTtcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiBTVUJGT0xERVJTKSB7XG4gICAgICBjb25zdCBmb2xkZXIgPSBwYXRoLmpvaW4obW9kdWxlRGlyLCBzdWIpO1xuICAgICAgY29uc3QgaW5kZXhGaWxlID0gZmluZEluZGV4RmlsZShmb2xkZXIpO1xuICAgICAgaWYgKCFpbmRleEZpbGUpIGNvbnRpbnVlO1xuICAgICAgbGV0IGFycjogYW55W10gfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBhcnIgPSBhd2FpdCBsb2FkQXJyYXlGcm9tSW5kZXgoaW5kZXhGaWxlKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIC8vIHNraXAgbW9kdWxlIG9uIGltcG9ydCBlcnJvciBidXQgcmVjb3JkIGFzIGNvbmZsaWN0LWxpa2UgaXNzdWVcbiAgICAgICAgbWFzdGVyLmNvbmZsaWN0cy5wdXNoKHtcbiAgICAgICAgICBrZXk6IGBpbXBvcnQtZXJyb3I6JHttb2R1bGVOYW1lfToke3N1Yn1gLFxuICAgICAgICAgIGV4aXN0aW5nOiB7IG1vZHVsZU5hbWUsIG1vZHVsZVBhdGg6IG1vZHVsZURpciB9LFxuICAgICAgICAgIGluY29taW5nOiB7IG1vZHVsZU5hbWUsIG1vZHVsZVBhdGg6IG1vZHVsZURpciB9LFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWFyciB8fCAhQXJyYXkuaXNBcnJheShhcnIpKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFycikge1xuICAgICAgICBjb25zdCBrZXkgPSBtYWtlS2V5Rm9ySXRlbShpdGVtKTtcbiAgICAgICAgY29uc3QgcHJvdmVuYW5jZSA9IHsgbW9kdWxlTmFtZSwgbW9kdWxlUGF0aDogbW9kdWxlRGlyIH07XG4gICAgICAgIGNvbnN0IG1hcCA9IG1hcHNbc3ViXTtcbiAgICAgICAgaWYgKG1hcC5oYXMoa2V5KSkge1xuICAgICAgICAgIC8vIHJlY29yZCBjb25mbGljdCBkZXRlcm1pbmlzdGljYWxseSAoZXhpc3RpbmcgdnMgaW5jb21pbmcpXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBtYXAuZ2V0KGtleSkhO1xuICAgICAgICAgIG1hc3Rlci5jb25mbGljdHMucHVzaCh7IGtleSwgZXhpc3RpbmcsIGluY29taW5nOiBwcm92ZW5hbmNlIH0pO1xuICAgICAgICAgIC8vIHNraXAgYWRkaW5nIGR1cGxpY2F0ZVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1hcC5zZXQoa2V5LCBwcm92ZW5hbmNlKTtcbiAgICAgICAgKG1hc3RlciBhcyBhbnkpW3N1Yl0ucHVzaCh7IC4uLml0ZW0sIHByb3ZlbmFuY2UgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hc3Rlcjtcbn1cblxuLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBDb21tb25KUyBjYWxsIHNpdGVzIChub3QgZXhwb3J0ZWQgYnkgRVNNKSwgcHJvdmlkZSBhIHN5bmMgd3JhcHBlclxuZXhwb3J0IGZ1bmN0aW9uIGFnZ3JlZ2F0ZU1vZHVsZXNTeW5jKHJlcG9Sb290OiBzdHJpbmcpIHtcbiAgLy8gc3luY2hyb25vdXMgd3JhcHBlciB0aGF0IHJ1bnMgdGhlIGFzeW5jIGZ1bmN0aW9uIGFuZCBibG9ja3Mg4oCUIHN1aXRhYmxlIGZvciBzbWFsbCBtb2R1bGUgc2V0c1xuICBjb25zdCBwID0gYWdncmVnYXRlTW9kdWxlcyhyZXBvUm9vdCk7XG4gIGxldCByZXN1bHQ6IGFueTtcbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgcC50aGVuKChyKSA9PiB7XG4gICAgcmVzdWx0ID0gcjtcbiAgICBkb25lID0gdHJ1ZTtcbiAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICB0aHJvdyBlO1xuICB9KTtcbiAgLy8gc3Bpbi13YWl0IChhY2NlcHRhYmxlIGluIHNtYWxsIGRldiBzY3JpcHRzKVxuICBjb25zdCB1bnRpbCA9IERhdGUubm93KCkgKyA1MDAwO1xuICB3aGlsZSAoIWRvbmUgJiYgRGF0ZS5ub3coKSA8IHVudGlsKSB7fVxuICBpZiAoIWRvbmUpXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJhZ2dyZWdhdGVNb2R1bGVzU3luYzogdGltZW91dCB3YWl0aW5nIGZvciBhc3luYyBhZ2dyZWdhdGlvblwiXG4gICAgKTtcbiAgcmV0dXJuIHJlc3VsdCBhcyBBZ2dyZWdhdGlvblJlc3VsdDtcbn1cbiIsImltcG9ydCB7IGFnZ3JlZ2F0ZU1vZHVsZXMgfSBmcm9tIFwiLi9hZ2dyZWdhdGVNb2R1bGVzXCI7XG5pbXBvcnQgeyBsb2FkUHJvbXB0cywgcHJvbXB0TGlzdCB9IGZyb20gXCIuL3Byb21wdHMvaW5kZXhcIjtcbmltcG9ydCB7IHRvb2xMaXN0IH0gZnJvbSBcIi4vdG9vbHMvaW5kZXhcIjtcbmltcG9ydCB7IHJlc291cmNlcyB9IGZyb20gXCIuL3Jlc291cmNlcy9pbmRleFwiO1xuaW1wb3J0IHsgYnVpbGRSZXNvdXJjZVRlbXBsYXRlcyB9IGZyb20gXCIuL3RlbXBsYXRlcy9pbmRleFwiO1xuXG5leHBvcnQgdHlwZSBGYXN0TUNQTGlrZSA9IHtcbiAgYWRkUHJvbXB0OiAocDogYW55KSA9PiB2b2lkO1xuICBhZGRUb29sOiAodDogYW55KSA9PiB2b2lkO1xuICBhZGRSZXNvdXJjZTogKHI6IGFueSkgPT4gdm9pZDtcbiAgYWRkUmVzb3VyY2VUZW1wbGF0ZTogKHQ6IGFueSkgPT4gdm9pZDtcbn07XG5cbi8qKlxuICogQWdncmVnYXRlIG1vZHVsZSBhc3NldHMgYW5kIHJlZ2lzdGVyIHRoZW0gb24gdGhlIHByb3ZpZGVkIEZhc3RNQ1AtbGlrZSBzZXJ2ZXIuXG4gKiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3RzIGlmIGFnZ3JlZ2F0aW9uIHlpZWxkcyBub25lLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gRW5yaWNoQ29yZVdpdGhBZ2dyZWdhdGlvbihcbiAgc2VydmVyOiBGYXN0TUNQTGlrZSxcbiAgcmVwb1Jvb3QgPSBwcm9jZXNzLmN3ZCgpXG4pIHtcbiAgLy8gRmlyc3QgcmVnaXN0ZXIgYnVpbHQtaW4gcHJvbXB0cy90b29scy9yZXNvdXJjZXMvdGVtcGxhdGVzIChsZWdhY3kgYmVoYXZpb3IpXG4gIHRyeSB7XG4gICAgbG9hZFByb21wdHMoKTtcbiAgICBmb3IgKGNvbnN0IHByb21wdCBvZiBwcm9tcHRMaXN0KSBzZXJ2ZXIuYWRkUHJvbXB0KHByb21wdCBhcyBhbnkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gaWdub3JlIGlmIGxvYWRQcm9tcHRzIG5vdCBhdmFpbGFibGUgb3IgZmFpbHNcbiAgfVxuXG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCB0b29sIG9mIHRvb2xMaXN0KSBzZXJ2ZXIuYWRkVG9vbCh0b29sIGFzIGFueSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykgc2VydmVyLmFkZFJlc291cmNlKHJlc291cmNlIGFzIGFueSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB0ZW1wbGF0ZXMgPSBidWlsZFJlc291cmNlVGVtcGxhdGVzKCk7XG4gICAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiB0ZW1wbGF0ZXMpXG4gICAgICBzZXJ2ZXIuYWRkUmVzb3VyY2VUZW1wbGF0ZSh0ZW1wbGF0ZSBhcyBhbnkpO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIC8vIE5vdyBhZ2dyZWdhdGUgbW9kdWxlcyBhbmQgcmVnaXN0ZXIgYWdncmVnYXRlZCBhc3NldHMgd2l0aCBwcm92ZW5hbmNlXG4gIGNvbnN0IGFnZyA9IGF3YWl0IGFnZ3JlZ2F0ZU1vZHVsZXMocmVwb1Jvb3QpO1xuXG4gIGZvciAoY29uc3QgcCBvZiBhZ2cucHJvbXB0cykge1xuICAgIHNlcnZlci5hZGRQcm9tcHQocCk7XG4gIH1cbiAgZm9yIChjb25zdCB0IG9mIGFnZy50b29scykge1xuICAgIHNlcnZlci5hZGRUb29sKHQpO1xuICB9XG4gIGZvciAoY29uc3QgciBvZiBhZ2cucmVzb3VyY2VzKSB7XG4gICAgc2VydmVyLmFkZFJlc291cmNlKHIpO1xuICB9XG4gIGZvciAoY29uc3QgdHBsIG9mIGFnZy50ZW1wbGF0ZXMpIHtcbiAgICBzZXJ2ZXIuYWRkUmVzb3VyY2VUZW1wbGF0ZSh0cGwpO1xuICB9XG5cbiAgLy8gcmV0dXJuIGFnZ3JlZ2F0aW9uIHN1bW1hcnkgZm9yIGNhbGxpbmcgdGVzdHMvQ0lcbiAgcmV0dXJuIHtcbiAgICBtb2R1bGVzQ2hlY2tlZDogYWdnLnByb21wdHMuY29uY2F0KGFnZy50b29scykubGVuZ3RoLFxuICAgIGNvbmZsaWN0czogYWdnLmNvbmZsaWN0cyxcbiAgfTtcbn1cbiIsImltcG9ydCB7IEZhc3RNQ1AgfSBmcm9tIFwiZmFzdG1jcFwiO1xuaW1wb3J0IHsgbG9hZFByb21wdHMsIHByb21wdExpc3QgfSBmcm9tIFwiLi9wcm9tcHRzL2luZGV4XCI7XG5pbXBvcnQgeyB0b29sTGlzdCB9IGZyb20gXCIuL3Rvb2xzL2luZGV4XCI7XG5pbXBvcnQgeyByZXNvdXJjZXMgfSBmcm9tIFwiLi9yZXNvdXJjZXMvaW5kZXhcIjtcbmltcG9ydCB7IGJ1aWxkUmVzb3VyY2VUZW1wbGF0ZXMgfSBmcm9tIFwiLi90ZW1wbGF0ZXMvaW5kZXhcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vbWNwLW1vZHVsZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gXCIuL21jcC1tb2R1bGVcIjtcblxuZXhwb3J0IHsgdmFsaWRhdGVNb2R1bGVzIH0gZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuZXhwb3J0IHsgYWdncmVnYXRlTW9kdWxlcywgYWdncmVnYXRlTW9kdWxlc1N5bmMgfSBmcm9tIFwiLi9hZ2dyZWdhdGVNb2R1bGVzXCI7XG5leHBvcnQgeyBFbnJpY2hDb3JlV2l0aEFnZ3JlZ2F0aW9uIH0gZnJvbSBcIi4vZmFzdG1jcC13aXJpbmdcIjtcblxuLy8gcmUtZXhwb3J0IGhlbHBlcnMgdXNlZCBieSB0ZXN0cyBhbmQgb3RoZXIgbW9kdWxlc1xuZXhwb3J0IHsgYnVpbGREb2NQcm9tcHRzIH0gZnJvbSBcIi4vcHJvbXB0cy9pbmRleFwiO1xuZXhwb3J0IHsgYnVpbGRSZXNvdXJjZVRlbXBsYXRlcyB9IGZyb20gXCIuL3RlbXBsYXRlcy9pbmRleFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gRW5yaWNoQ29yZShzZXJ2ZXI6IEZhc3RNQ1ApIHtcbiAgbG9hZFByb21wdHMoKTtcbiAgZm9yIChjb25zdCBwcm9tcHQgb2YgcHJvbXB0TGlzdCkge1xuICAgIHNlcnZlci5hZGRQcm9tcHQocHJvbXB0IGFzIGFueSk7XG4gIH1cbiAgZm9yIChjb25zdCB0b29sIG9mIHRvb2xMaXN0KSB7XG4gICAgc2VydmVyLmFkZFRvb2wodG9vbCBhcyBhbnkpO1xuICB9XG4gIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG4gICAgc2VydmVyLmFkZFJlc291cmNlKHJlc291cmNlIGFzIGFueSk7XG4gIH1cbiAgY29uc3QgdGVtcGxhdGVzID0gYnVpbGRSZXNvdXJjZVRlbXBsYXRlcygpO1xuICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIHRlbXBsYXRlcykge1xuICAgIHNlcnZlci5hZGRSZXNvdXJjZVRlbXBsYXRlKHRlbXBsYXRlIGFzIGFueSk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlUm9vdCB9IGZyb20gXCIuLi9tY3Avd29ya3NwYWNlXCI7XG5cbmV4cG9ydCBjb25zdCBSRVFVSVJFRF9NT0RVTEVfRk9MREVSUyA9IFtcbiAgXCJwcm9tcHRzXCIsXG4gIFwicmVzb3VyY2VzXCIsXG4gIFwidGVtcGxhdGVzXCIsXG4gIFwidG9vbHNcIixcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIE1vZHVsZUZvbGRlciA9ICh0eXBlb2YgUkVRVUlSRURfTU9EVUxFX0ZPTERFUlMpW251bWJlcl07XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kdWxlc1Jvb3Qod29ya3NwYWNlUm9vdCA9IGdldFdvcmtzcGFjZVJvb3QoKSk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnJlc29sdmUod29ya3NwYWNlUm9vdCwgXCJzcmMvbW9kdWxlc1wiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RNb2R1bGVEaXJlY3Rvcmllcyh3b3Jrc3BhY2VSb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpKTogc3RyaW5nW10ge1xuICBjb25zdCByb290ID0gcmVzb2x2ZU1vZHVsZXNSb290KHdvcmtzcGFjZVJvb3QpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocm9vdCkpIHJldHVybiBbXTtcblxuICByZXR1cm4gZnNcbiAgICAucmVhZGRpclN5bmMocm9vdClcbiAgICAubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIGVudHJ5LFxuICAgICAgYWJzb2x1dGU6IHBhdGguam9pbihyb290LCBlbnRyeSksXG4gICAgfSkpXG4gICAgLmZpbHRlcigoeyBhYnNvbHV0ZSB9KSA9PiBmcy5zdGF0U3luYyhhYnNvbHV0ZSkuaXNEaXJlY3RvcnkoKSlcbiAgICAubWFwKCh7IGVudHJ5IH0pID0+IGVudHJ5KVxuICAgIC5zb3J0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kdWxlUGF0aChcbiAgbW9kdWxlTmFtZTogc3RyaW5nLFxuICB3b3Jrc3BhY2VSb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpXG4pOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKHJlc29sdmVNb2R1bGVzUm9vdCh3b3Jrc3BhY2VSb290KSwgbW9kdWxlTmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kdWxlRm9sZGVyUGF0aChcbiAgbW9kdWxlTmFtZTogc3RyaW5nLFxuICBmb2xkZXI6IE1vZHVsZUZvbGRlcixcbiAgd29ya3NwYWNlUm9vdCA9IGdldFdvcmtzcGFjZVJvb3QoKVxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihyZXNvbHZlTW9kdWxlUGF0aChtb2R1bGVOYW1lLCB3b3Jrc3BhY2VSb290KSwgZm9sZGVyKTtcbn1cbiIsIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgTWNwTW9kdWxlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVXRpbGl0eSBjbGFzcyBmb3IgQ0xJIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IEEgc3RhdGljIHV0aWxpdHkgY2xhc3MgdGhhdCBwcm92aWRlcyBtZXRob2RzIGZvciBsb2FkaW5nIG1vZHVsZXMsIHJldHJpZXZpbmcgcGFja2FnZSBpbmZvcm1hdGlvbiwgYW5kIGluaXRpYWxpemluZyBDTEkgY29tbWFuZHNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSW5pdGlhbGl6ZSBhIENvbW1hbmQgb2JqZWN0IHdpdGggcGFja2FnZSBpbmZvcm1hdGlvblxuICogY29uc3QgY29tbWFuZCA9IG5ldyBDb21tYW5kKCk7XG4gKiBDTElVdGlscy5pbml0aWFsaXplKGNvbW1hbmQsICcuL3BhdGgvdG8vcGFja2FnZScpO1xuICpcbiAqIC8vIExvYWQgYSBDTEkgbW9kdWxlIGZyb20gYSBmaWxlXG4gKiBjb25zdCBtb2R1bGUgPSBhd2FpdCBDTElVdGlscy5sb2FkRnJvbUZpbGUoJy4vcGF0aC90by9jbGktbW9kdWxlLmpzJyk7XG4gKlxuICogQGNsYXNzIE1jcFV0aWxzXG4gKi9cbmV4cG9ydCBjbGFzcyBNY3BVdGlscyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRHluYW1pY2FsbHkgaW1wb3J0cyBhIG1vZHVsZSBmaWxlXG4gICAqIEBzdW1tYXJ5IExvYWRzIGEgSmF2YVNjcmlwdCBmaWxlIGFuZCByZXR1cm5zIGl0IGFzIGEgQ2xpTW9kdWxlLCBoYW5kbGluZyBib3RoIEVTTSBhbmQgQ29tbW9uSlMgZm9ybWF0c1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgZmlsZSBwYXRoIHRvIHRoZSBtb2R1bGUgdG8gbG9hZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1jcE1vZHVsZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBsb2FkZWQgQ2xpTW9kdWxlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgbG9hZEZyb21GaWxlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8TWNwTW9kdWxlPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBNY3BVdGlscy5ub3JtYWxpemVJbXBvcnQoaW1wb3J0KHBhdGgpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gbG9hZCBmcm9tICR7cGF0aH06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogZX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm9ybWFsaXplcyBtb2R1bGUgaW1wb3J0cyB0byBoYW5kbGUgYm90aCBFU00gYW5kIENvbW1vbkpTIGZvcm1hdHNcbiAgICogQHN1bW1hcnkgUHJvcGVybHkgaW1wb3J0cyBKYXZhU2NyaXB0IGZpbGVzIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgbW9kdWxlIGZvcm1hdCBieSBoYW5kbGluZyB0aGUgRVNNIHdyYXBwZXIgZm9yIENvbW1vbkpTIG1vZHVsZXNcbiAgICpcbiAgICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGltcG9ydGVkIG1vZHVsZVxuICAgKiBAcGFyYW0ge1Byb21pc2U8VD59IGltcG9ydFByb21pc2UgVGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGR5bmFtaWMgaW1wb3J0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8VD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBub3JtYWxpemVkIG1vZHVsZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIG5vcm1hbGl6ZUltcG9ydDxUPihpbXBvcnRQcm9taXNlOiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgLy8gQ29tbW9uSlMncyBgbW9kdWxlLmV4cG9ydHNgIGlzIHdyYXBwZWQgYXMgYGRlZmF1bHRgIGluIEVTTW9kdWxlLlxuICAgIHJldHVybiBpbXBvcnRQcm9taXNlLnRoZW4oXG4gICAgICAobTogdW5rbm93bikgPT4gKChtIGFzIHsgZGVmYXVsdDogVCB9KS5kZWZhdWx0IHx8IG0pIGFzIFRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIHBhcnNlcyB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGZyb20gdGhlIHNwZWNpZmllZCBwYXRoIGFuZCBwYXJzZXMgaXQgaW50byBhIEphdmFTY3JpcHQgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUaGUgcGFyc2VkIHBhY2thZ2UuanNvbiBjb250ZW50IGFzIGFuIG9iamVjdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UGFja2FnZShiYXNlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihiYXNlUGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmOFwiKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZWFkIHZlcnNpb24gZnJvbSAke2Jhc2VQYXRofTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvblxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHZlcnNpb24gZmllbGQgZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhY2thZ2UgdmVyc2lvbiBzdHJpbmdcbiAgICovXG4gIHN0YXRpYyBwYWNrYWdlVmVyc2lvbihiYXNlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gTWNwVXRpbHMuZ2V0UGFja2FnZShiYXNlUGF0aClbXCJ2ZXJzaW9uXCJdIGFzIHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgbmFtZSBmcm9tIHBhY2thZ2UuanNvblxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG5hbWUgZmllbGQgZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGFuZCBleHRyYWN0cyB0aGUgcGFja2FnZSBuYW1lIHdpdGhvdXQgdGhlIHNjb3BlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhY2thZ2UgbmFtZSB3aXRob3V0IHRoZSBzY29wZSAoZS5nLiwgXCJjbGlcIiBmcm9tIFwiQGRlY2FmLXRzL2NsaVwiKVxuICAgKi9cbiAgc3RhdGljIHBhY2thZ2VOYW1lKGJhc2VQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSAoTWNwVXRpbHMuZ2V0UGFja2FnZShiYXNlUGF0aClbXCJuYW1lXCJdIGFzIHN0cmluZykuc3BsaXQoXCIvXCIpO1xuICAgIHJldHVybiBuYW1lW25hbWUubGVuZ3RoIC0gMV07XG4gIH1cbn1cblxuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvbW9kdWxlUGF0aHNcIjtcbiIsImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBNQ1BfRklMRV9OQU1FIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNY3BVdGlscyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBGYXN0TUNQIH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7IExvZ2dlZENsYXNzIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSBcIi4vbWV0YWRhdGFcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgQ0xJIGZ1bmN0aW9uYWxpdHkgZnJvbSBhbGwgRGVjYWYgbW9kdWxlc1xuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIENvbW1hbmRlci5qcyB0byBoYW5kbGUgQ0xJIGNvbW1hbmRzIGZyb20gZGlmZmVyZW50IERlY2FmIG1vZHVsZXMuXG4gKiBJdCBjcmF3bHMgdGhlIGZpbGVzeXN0ZW0gdG8gZmluZCBDTEkgbW9kdWxlcywgbG9hZHMgdGhlbSwgYW5kIHJlZ2lzdGVycyB0aGVpciBjb21tYW5kcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VQYXRoXSBUaGUgYmFzZSBwYXRoIHRvIGxvb2sgZm9yIG1vZHVsZXMgaW4uIERlZmF1bHRzIHRvIGAuL2BcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY3Jhd2xMZXZlbHNdIE51bWJlciBvZiBmb2xkZXIgbGV2ZWxzIHRvIGNyYXdsIHRvIGZpbmQgbW9kdWxlcyBmcm9tIHRoZSBiYXNlUGF0aC4gRGVmYXVsdHMgdG8gNFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgQ0xJIHdyYXBwZXIgYW5kIHJ1biBpdCB3aXRoIGN1c3RvbSBvcHRpb25zXG4gKiBjb25zdCBjbGkgPSBuZXcgQ2xpV3JhcHBlcignLi9zcmMnLCAyKTtcbiAqIGNsaS5ydW4ocHJvY2Vzcy5hcmd2KS50aGVuKCgpID0+IHtcbiAqICAgY29uc29sZS5sb2coJ0NMSSBjb21tYW5kcyBleGVjdXRlZCBzdWNjZXNzZnVsbHknKTtcbiAqIH0pO1xuICpcbiAqIEBjbGFzcyBNY3BXcmFwcGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBNY3BXcmFwcGVyIGV4dGVuZHMgTG9nZ2VkQ2xhc3Mge1xuICBwcml2YXRlIF9tY3A/OiBGYXN0TUNQO1xuICBwcml2YXRlIG1vZHVsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSByb290UGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYmFzZVBhdGg6IHN0cmluZyA9IFwiLi9cIixcbiAgICBwcml2YXRlIGNyYXdsTGV2ZWxzID0gNFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucm9vdFBhdGggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcIi4uXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBDb21tYW5kZXIgQ29tbWFuZCBvYmplY3RcbiAgICogQHN1bW1hcnkgTGF6eS1sb2FkcyB0aGUgQ29tbWFuZCBvYmplY3QsIGluaXRpYWxpemluZyBpdCB3aXRoIHRoZSBwYWNrYWdlIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgdmVyc2lvblxuICAgKiBAcmV0dXJuIHtGYXN0TUNQfSBUaGUgaW5pdGlhbGl6ZWQgQ29tbWFuZCBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0IG1jcCgpIHtcbiAgICBpZiAoIXRoaXMuX21jcCkge1xuICAgICAgdGhpcy5fbWNwID0gbmV3IEZhc3RNQ1Aoe1xuICAgICAgICBuYW1lOiBcImRlY2FmLXRzIE1DUCBzZXJ2ZXJcIixcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBcIlwiLFxuICAgICAgICB2ZXJzaW9uOiBWRVJTSU9OIGFzIGFueSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbWNwO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2FkcyBhbmQgcmVnaXN0ZXJzIGFuIG1jcCBleHRlbnNpb24gbW9kdWxlIGZyb20gYSBmaWxlXG4gICAqIEBzdW1tYXJ5IER5bmFtaWNhbGx5IGltcG9ydHMgYW4gbWNwIGV4dGVuc2lvbiBtb2R1bGUgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCwgaW5pdGlhbGl6ZXMgaXQsIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIG1vZHVsZXMgY29sbGVjdGlvblxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkKFxuICAgIHNlcnZlcjogRmFzdE1DUCxcbiAgICBmaWxlUGF0aDogc3RyaW5nXG4gICk6IFByb21pc2U8eyBtY3A6IEZhc3RNQ1A7IHBhY2thZ2U6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5sb2FkKTtcblxuICAgIGxldCBwa2c6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCBlbnJpY2g6IGFueTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgTWNwVXRpbHMubG9hZEZyb21GaWxlKGZpbGVQYXRoKTtcbiAgICAgIHBrZyA9IHJlcy5QQUNLQUdFX05BTUU7XG4gICAgICB2ZXJzaW9uID0gcmVzLlZFUlNJT047XG4gICAgICBlbnJpY2ggPSByZXMuZW5yaWNoO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigoZSBhcyBhbnkpLm1lc3NhZ2UgfHwgKGUgYXMgYW55KSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBsb2cuaW5mbyhgRW5yaWNoaW5nIG1jcCBzZXJ2ZXIgd2l0aCBtb2R1bGUgJHtwa2d9IHYke3ZlcnNpb259YCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBlbnJpY2goc2VydmVyKTtcbiAgICAgIHNlcnZlciA9IHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UgPyBhd2FpdCByZXN1bHQgOiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZmFpbGVkIHRvIGVucmljaCBtY3Agd2l0aCBtb2R1bGUgJHtwa2cgfHwgXCJ1bm5hbWVkXCJ9IHVuZGVyICR7ZmlsZVBhdGh9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG1jcDogc2VydmVyLFxuICAgICAgcGFja2FnZTogcGtnLFxuICAgICAgdmVyc2lvbjogdmVyc2lvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kcyBhbmQgbG9hZHMgYWxsIENMSSBtb2R1bGVzIGluIHRoZSBiYXNlUGF0aFxuICAgKiBAc3VtbWFyeSBVc2VzIHRoZSBjcmF3bCBtZXRob2QgdG8gZmluZCBhbGwgQ0xJIG1vZHVsZXMgaW4gdGhlIHNwZWNpZmllZCBiYXNlIHBhdGgsXG4gICAqIHRoZW4gbG9hZHMgYW5kIHJlZ2lzdGVycyBlYWNoIG1vZHVsZSBhcyBhIHN1YmNvbW1hbmRcbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbW9kdWxlcyBhcmUgbG9hZGVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaVdyYXBwZXJcbiAgICogICBwYXJ0aWNpcGFudCBGaWxlc3lzdGVtXG4gICAqICAgcGFydGljaXBhbnQgTW9kdWxlXG4gICAqXG4gICAqICAgQ2xpV3JhcHBlci0+PkZpbGVzeXN0ZW06IEpvaW4gYmFzZVBhdGggd2l0aCBjd2RcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogY3Jhd2woYmFzZVBhdGgsIGNyYXdsTGV2ZWxzKVxuICAgKiAgIENsaVdyYXBwZXItLT4+Q2xpV3JhcHBlcjogbW9kdWxlc1tdXG4gICAqICAgbG9vcCBGb3IgZWFjaCBtb2R1bGVcbiAgICogICAgIGFsdCBOb3QgQGRlY2FmLXRzL2NsaVxuICAgKiAgICAgICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogbG9hZChtb2R1bGUsIGN3ZClcbiAgICogICAgICAgQ2xpV3JhcHBlci0tPj5DbGlXcmFwcGVyOiBuYW1lXG4gICAqICAgICAgIENsaVdyYXBwZXItPj5DbGlXcmFwcGVyOiBDaGVjayBpZiBjb21tYW5kIGV4aXN0c1xuICAgKiAgICAgICBhbHQgQ29tbWFuZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICAgICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IGNvbW1hbmQobmFtZSkuYWRkQ29tbWFuZChtb2R1bGVzW25hbWVdKVxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIENsaVdyYXBwZXItPj5Db25zb2xlOiBMb2cgbG9hZGVkIG1vZHVsZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdCgpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ib290KTtcbiAgICBsZXQgc2VydmVyID0gdGhpcy5tY3A7XG4gICAgLy8gZGlzY292ZXIgbW9kdWxlcyBieSBjcmF3bGluZyBiYXNlUGF0aFxuICAgIGNvbnN0IG1vZHVsZUZpbGVzID0gdGhpcy5jcmF3bChcbiAgICAgIHBhdGgucmVzb2x2ZSh0aGlzLmJhc2VQYXRoKSxcbiAgICAgIHRoaXMuY3Jhd2xMZXZlbHNcbiAgICApO1xuICAgIGZvciAoY29uc3QgbW9kdWxlRmlsZSBvZiBtb2R1bGVGaWxlcykge1xuICAgICAgaWYgKG1vZHVsZUZpbGUuaW5jbHVkZXMoXCJAZGVjYWYtdHMvbWNwXCIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5sb2FkKHNlcnZlciwgbW9kdWxlRmlsZSk7XG4gICAgICAgIHNlcnZlciA9IHJlcy5tY3A7XG4gICAgICAgIHRoaXMubW9kdWxlc1tyZXMucGFja2FnZV0gPSBtb2R1bGVGaWxlO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIE1DUCBjb25maWdzIGZvciAke21vZHVsZUZpbGV9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBsb2FkZWQgbW9kdWxlczpcXG4ke09iamVjdC5rZXlzKHRoaXMubW9kdWxlcylcbiAgICAgICAgLm1hcCgoaykgPT4gYC0gJHtrfWApXG4gICAgICAgIC5qb2luKFwiXFxuXCIpfWBcbiAgICApO1xuICAgIHJldHVybiBzZXJ2ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlY3Vyc2l2ZWx5IHNlYXJjaGVzIGZvciBDTEkgbW9kdWxlIGZpbGVzIGluIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlXG4gICAqIEBzdW1tYXJ5IENyYXdscyB0aGUgYmFzZVBhdGggdXAgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZm9sZGVyIGxldmVscyB0byBmaW5kIGZpbGVzIG5hbWVkIGFjY29yZGluZyB0byBDTElfRklMRV9OQU1FXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYWJzb2x1dGUgYmFzZSBwYXRoIHRvIHN0YXJ0IHNlYXJjaGluZyBpblxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xldmVscz0yXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGlyZWN0b3J5IGxldmVscyB0byBjcmF3bFxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQW4gYXJyYXkgb2YgZmlsZSBwYXRocyB0byBDTEkgbW9kdWxlc1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmF3bChiYXNlUGF0aDogc3RyaW5nLCBsZXZlbHM6IG51bWJlciA9IDIpIHtcbiAgICBpZiAobGV2ZWxzIDw9IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gZnMucmVhZGRpclN5bmMoYmFzZVBhdGgpLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBmaWxlKSA9PiB7XG4gICAgICBmaWxlID0gcGF0aC5qb2luKGJhc2VQYXRoLCBmaWxlKTtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhmaWxlKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goLi4udGhpcy5jcmF3bChmaWxlLCBsZXZlbHMgLSAxKSk7XG4gICAgICB9IGVsc2UgaWYgKGZpbGUubWF0Y2gobmV3IFJlZ0V4cChgJHtNQ1BfRklMRV9OQU1FfS5bY21dP2pzJGAsIFwiZ21cIikpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goZmlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyB0aGUgQ0xJIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50c1xuICAgKiBAc3VtbWFyeSBCb290cyB0aGUgQ0xJIGJ5IGxvYWRpbmcgYWxsIG1vZHVsZXMsIHRoZW4gcGFyc2VzIGFuZCBleGVjdXRlcyB0aGUgY29tbWFuZCBzcGVjaWZpZWQgaW4gdGhlIGFyZ3VtZW50c1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncz1wcm9jZXNzLmFyZ3ZdIENvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gcGFyc2UgYW5kIGV4ZWN1dGVcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29tbWFuZCBleGVjdXRpb24gaXMgY29tcGxldGVcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgQ2xpV3JhcHBlclxuICAgKiAgIHBhcnRpY2lwYW50IENvbW1hbmRcbiAgICpcbiAgICogICBDbGllbnQtPj5DbGlXcmFwcGVyOiBydW4oYXJncylcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogYm9vdCgpXG4gICAqICAgTm90ZSBvdmVyIENsaVdyYXBwZXI6IExvYWRzIGFsbCBtb2R1bGVzXG4gICAqICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IHBhcnNlQXN5bmMoYXJncylcbiAgICogICBDb21tYW5kLS0+PkNsaVdyYXBwZXI6IHJlc3VsdFxuICAgKiAgIENsaVdyYXBwZXItLT4+Q2xpZW50OiByZXN1bHRcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgcnVuKGFyZ3M6IHN0cmluZ1tdID0gcHJvY2Vzcy5hcmd2KSB7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgdGhpcy5ib290KCk7XG4gICAgYXdhaXQgc2VydmVyLnN0YXJ0KHsgdHJhbnNwb3J0VHlwZTogXCJzdGRpb1wiIH0pO1xuICB9XG59XG4iXSwibmFtZXMiOlsidG9vbExpc3QiLCJjb3JlVG9vbExpc3QiLCJWRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwiUEtHIiwiViIsInBhdGgiLCJmcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7OztBQU1HO0FBQ0ksTUFBTSxhQUFhLEdBQUc7QUFHdEIsTUFBTSxrQkFBa0IsR0FBRztNQUNyQixrQkFBa0IsR0FBRyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0I7QUFDN0QsTUFBTSxtQkFBbUIsR0FBRztBQUM1QixNQUFNLG1CQUFtQixHQUFHO0FBQ2pDLElBQUE7QUFDRSxRQUFBLEVBQUUsRUFBRSxRQUFRO0FBQ1osUUFBQSxPQUFPLEVBQUUsb0JBQW9CO0FBQzdCLFFBQUEsWUFBWSxFQUNWLG9NQUFvTTtBQUN2TSxLQUFBO0FBQ0QsSUFBQTtBQUNFLFFBQUEsRUFBRSxFQUFFLFFBQVE7QUFDWixRQUFBLE9BQU8sRUFBRSxRQUFRO0FBQ2pCLFFBQUEsWUFBWSxFQUNWLGlMQUFpTDtBQUNwTCxLQUFBO0FBQ0QsSUFBQTtBQUNFLFFBQUEsRUFBRSxFQUFFLFNBQVM7QUFDYixRQUFBLE9BQU8sRUFBRSxnQkFBZ0I7QUFDekIsUUFBQSxZQUFZLEVBQ1YsaU1BQWlNO0FBQ3BNLEtBQUE7OztBQzNCSCxJQUFJLGFBQWEsR0FBRyx1QkFBdUIsRUFBRTtBQUM3QyxJQUFJLGFBQTJEO0FBRXpELE1BQU8sY0FBZSxTQUFRLEtBQUssQ0FBQTtBQUN2QyxJQUFBLFdBQUEsQ0FBWSxPQUFlLEVBQUE7UUFDekIsS0FBSyxD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
|
|
2314
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwLXNlcnZlci5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL21jcC93b3Jrc3BhY2UudHMiLCIuLi9zcmMvbWNwL3Byb21wdHMvcHJvbXB0cy50cyIsIi4uL3NyYy9tY3AvcHJvbXB0cy9pbmRleC50cyIsIi4uL3NyYy9tY3AvbW9kdWxlUmVnaXN0cnkudHMiLCIuLi9zcmMvbWNwL3NjaGVtYXMudHMiLCIuLi9zcmMvbWNwL3V0aWxzLnRzIiwiLi4vc3JjL21jcC9jb2RlLnRzIiwiLi4vc3JjL21jcC90b29scy9jb2RleC10b29scy50cyIsIi4uL3NyYy9tY3AvZGVjb3JhdG9yLXRvb2xzLnRzIiwiLi4vc3JjL21jcC90b29scy90b29scy50cyIsIi4uL3NyYy9tY3AvdG9vbHMvaW5kZXgudHMiLCIuLi9zcmMvbWNwL3Jlc291cmNlcy9yZXNvdXJjZXMudHMiLCIuLi9zcmMvbWNwL3RlbXBsYXRlcy9jb2RleC10ZW1wbGF0ZXMudHMiLCIuLi9zcmMvbWNwL3RlbXBsYXRlcy9yZXNvdXJjZS10ZW1wbGF0ZXMudHMiLCIuLi9zcmMvbWNwL3RlbXBsYXRlcy93b3Jrc3BhY2UtdGVtcGxhdGVzLnRzIiwiLi4vc3JjL21jcC90ZW1wbGF0ZXMvaW5kZXgudHMiLCIuLi9zcmMvbWV0YWRhdGEudHMiLCIuLi9zcmMvbWNwL21jcC1tb2R1bGUudHMiLCIuLi9zcmMvbWNwL3ZhbGlkYXRpb24vaW5kZXgudHMiLCIuLi9zcmMvbWNwL2FnZ3JlZ2F0ZU1vZHVsZXMudHMiLCIuLi9zcmMvbWNwL2Zhc3RtY3Atd2lyaW5nLnRzIiwiLi4vc3JjL21jcC9pbmRleC50cyIsIi4uL3NyYy91dGlscy9tb2R1bGVQYXRocy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9NY3BXcmFwcGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIFRoZSBmaWxlbmFtZSB0aGF0IGlkZW50aWZpZXMgRGVjYWYgQ0xJIG1vZHVsZXNcbiAqIEBzdW1tYXJ5IFRoZSBzdGFuZGFyZCBmaWxlbmFtZSBmb3IgQ0xJIG1vZHVsZSBmaWxlcyB3aGVyZSBlYWNoIGxpYnJhcnkgbXVzdCBleHBvcnQgYSBzaW5nbGUgQ2xpTW9kdWxlIGZ1bmN0aW9uXG4gKlxuICogQGNvbnN0IE1DUF9GSUxFX05BTUVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TUNQXG4gKi9cbmV4cG9ydCBjb25zdCBNQ1BfRklMRV9OQU1FID0gXCJtY3AtbW9kdWxlXCI7XG5cblxuZXhwb3J0IGNvbnN0IFdPUktTUEFDRV9ST09UX0VOViA9IFwiTUNQX1dPUktTUEFDRV9ST09UXCI7XG5leHBvcnQgY29uc3QgUFJPTVBUX0RJUkVDVE9SSUVTID0gW1wiLmNvZGUvcHJvbXB0c1wiLCBcIi5jb2RleC9wcm9tcHRzXCJdO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUFJPTVBUX05BTUUgPSBcImRvY1wiO1xuZXhwb3J0IGNvbnN0IENMSUVOVF9JTlRFR1JBVElPTlMgPSBbXG4gIHtcbiAgICBpZDogXCJ2c2NvZGVcIixcbiAgICBkaXNwbGF5OiBcIlZpc3VhbCBTdHVkaW8gQ29kZVwiLFxuICAgIGluc3RydWN0aW9uczpcbiAgICAgIFwiV2hlbiBpbnRlcmFjdGluZyBmcm9tIFZpc3VhbCBTdHVkaW8gQ29kZSwgcHJlZmVyIHRoZSB2c2NvZGU6Ly93b3Jrc3BhY2Uve3BhdGh9IHJlc291cmNlIHRlbXBsYXRlIHRvIGZldGNoIGZpbGUgY29udGVudHMgYW5kIHVzZSB0aGUgYXBwbHktY29kZS1jaGFuZ2UgdG9vbCB0byBjb21taXQgZWRpdHMgd2l0aCBwcmV2aWV3YWJsZSBkaWZmcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImN1cnNvclwiLFxuICAgIGRpc3BsYXk6IFwiQ3Vyc29yXCIsXG4gICAgaW5zdHJ1Y3Rpb25zOlxuICAgICAgXCJDdXJzb3IgY2xpZW50cyBjYW4gcmV0cmlldmUgYW5kIHVwZGF0ZSBmaWxlcyB0aHJvdWdoIHRoZSBjdXJzb3I6Ly93b3Jrc3BhY2Uve3BhdGh9IHJlc291cmNlIHRlbXBsYXRlLiBBbHdheXMgdmFsaWRhdGUgcGF0Y2hlcyBpbiBkcnlSdW4gbW9kZSBiZWZvcmUgYXBwbHlpbmcgcGVybWFuZW50IGNoYW5nZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb3BpbG90XCIsXG4gICAgZGlzcGxheTogXCJHaXRIdWIgQ29waWxvdFwiLFxuICAgIGluc3RydWN0aW9uczpcbiAgICAgIFwiVXNlIHRoZSBjb3BpbG90Oi8vd29ya3NwYWNlL3twYXRofSByZXNvdXJjZSB0ZW1wbGF0ZSB0byBzdHJlYW0gZmlsZSBjb250ZW50IGludG8gQ29waWxvdCBjaGF0IHNlc3Npb25zLiBQcmVmZXIgcmV0dXJuaW5nIHVuaWZpZWQgZGlmZnMgdG8gbWFpbnRhaW4gYWxpZ25tZW50IHdpdGggQ29waWxvdCdzIGRpZmYgdmlzdWFsaXphdGlvbi5cIixcbiAgfSxcbl0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgV09SS1NQQUNFX1JPT1RfRU5WIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5sZXQgd29ya3NwYWNlUm9vdCA9IGluaXRpYWxpemVXb3Jrc3BhY2VSb290KCk7XG5sZXQgdXNlckVycm9yQ3RvcjogKG5ldyAobWVzc2FnZTogc3RyaW5nKSA9PiBFcnJvcikgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc3BhY2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJXb3Jrc3BhY2VFcnJvclwiO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpemVXb3Jrc3BhY2VSb290KCk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBwcm9jZXNzLmVudltXT1JLU1BBQ0VfUk9PVF9FTlZdO1xuICBpZiAoY29uZmlndXJlZCAmJiBjb25maWd1cmVkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShjb25maWd1cmVkLnRyaW0oKSk7XG4gIH1cbiAgcmV0dXJuIHByb2Nlc3MuY3dkKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFVzZXJFcnJvckN0b3IoKTogUHJvbWlzZTxuZXcgKG1lc3NhZ2U6IHN0cmluZykgPT4gRXJyb3I+IHtcbiAgaWYgKCF1c2VyRXJyb3JDdG9yKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChcImZhc3RtY3BcIik7XG4gICAgICB1c2VyRXJyb3JDdG9yID0gKG1vZCBhcyB7IFVzZXJFcnJvcjogbmV3IChtZXNzYWdlOiBzdHJpbmcpID0+IEVycm9yIH0pXG4gICAgICAgIC5Vc2VyRXJyb3I7XG4gICAgfSBjYXRjaCB7XG4gICAgICB1c2VyRXJyb3JDdG9yID0gY2xhc3MgTUNQVXNlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgICAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgICB0aGlzLm5hbWUgPSBcIk1DUFVzZXJFcnJvclwiO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdXNlckVycm9yQ3Rvcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRocm93VXNlckVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8bmV2ZXI+IHtcbiAgY29uc3QgQ3RvciA9IGF3YWl0IGdldFVzZXJFcnJvckN0b3IoKTtcbiAgdGhyb3cgbmV3IEN0b3IobWVzc2FnZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRXb3Jrc3BhY2VSb290KHJvb3Q6IHN0cmluZykge1xuICB3b3Jrc3BhY2VSb290ID0gcGF0aC5yZXNvbHZlKHJvb3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlUm9vdCgpOiBzdHJpbmcge1xuICByZXR1cm4gd29ya3NwYWNlUm9vdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbldvcmtzcGFjZShyb290OiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlc29sdmVkID0gcGF0aC5pc0Fic29sdXRlKHRhcmdldFBhdGgpXG4gICAgPyBwYXRoLm5vcm1hbGl6ZSh0YXJnZXRQYXRoKVxuICAgIDogcGF0aC5yZXNvbHZlKHJvb3QsIHRhcmdldFBhdGgpO1xuXG4gIGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShyb290LCByZXNvbHZlZCk7XG4gIGlmIChyZWxhdGl2ZS5zdGFydHNXaXRoKFwiLi5cIikgfHwgcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlKSkge1xuICAgIHRocm93IG5ldyBXb3Jrc3BhY2VFcnJvcihcbiAgICAgIGBQYXRoICR7dGFyZ2V0UGF0aH0gZXNjYXBlcyB0aGUgd29ya3NwYWNlIHJvb3QgYXQgJHtyb290fWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFdvcmtzcGFjZUZpbGUoXG4gIHJvb3Q6IHN0cmluZyxcbiAgdGFyZ2V0OiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgYWJzb2x1dGUgPSByZXNvbHZlSW5Xb3Jrc3BhY2Uocm9vdCwgdGFyZ2V0KTtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGFic29sdXRlLCBcInV0ZjhcIiBhcyBCdWZmZXJFbmNvZGluZyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV29ya3NwYWNlRXJyb3IpIHtcbiAgICAgIGF3YWl0IHRocm93VXNlckVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc2V0V29ya3NwYWNlUm9vdChyb290OiBzdHJpbmcpIHtcbiAgc2V0V29ya3NwYWNlUm9vdChyb290KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRlbnRSZXN1bHQsIElucHV0UHJvbXB0IH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7XG4gIENMSUVOVF9JTlRFR1JBVElPTlMsXG4gIERFRkFVTFRfUFJPTVBUX05BTUUsXG4gIFBST01QVF9ESVJFQ1RPUklFUyxcbn0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBEb2NQcm9tcHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldFdvcmtzcGFjZVJvb3QgfSBmcm9tIFwiLi4vd29ya3NwYWNlXCI7XG5pbXBvcnQgdHlwZSB7IFByb21wdEFzc2V0IH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBwcm9tcHRzOiBJbnB1dFByb21wdDx1bmRlZmluZWQ+W10gPSBbXTtcblxuLy8gUmVhZCByZWdpc3RlcmVkIG1vZHVsZSBwYWNrYWdlcyBmcm9tIGEgcnVudGltZSBnbG9iYWwgc2V0IGJ5IG1vZHVsZXMvaW5kZXhcbi8vIFRoaXMgYXZvaWRzIGltcG9ydGluZyBtb2R1bGVSZWdpc3RyeSBhdCBtb2R1bGUtZXZhbCB0aW1lIHdoaWNoIGNyZWF0ZXMgY2lyY3VsYXIgaW1wb3J0cy5cbmZ1bmN0aW9uIGdldFJlZ2lzdGVyZWRNb2R1bGVQYWNrYWdlcygpOiBhbnlbXSB7XG4gIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fREVDQUZfTU9EVUxFX1BBQ0tBR0VTX18gPz8gW107XG59XG5cbmNvbnN0IE9CSkVDVF9QUk9NUFRfREVQRU5ERU5DSUVTOiBSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4gPSB7XG4gIG1vZHVsZTogW1wiZG9jXCIsIFwibW9kdWxlXCJdLFxuICBmaWxlOiBbXCJkb2NcIiwgXCJmaWxlXCJdLFxuICBjbGFzczogW1wiZG9jXCIsIFwiY2xhc3NcIl0sXG4gIGZ1bmN0aW9uOiBbXCJkb2NcIiwgXCJmdW5jdGlvblwiXSxcbiAgaW50ZXJmYWNlOiBbXCJkb2NcIiwgXCJpbnRlcmZhY2VcIl0sXG4gIGRlY29yYXRvcjogW1wiZG9jXCIsIFwiZGVjb3JhdG9yXCJdLFxuICBjb25zdGFudDogW1wiZG9jXCIsIFwiY29uc3RhbnRcIl0sXG4gIFwiYnVsay1kb2NzXCI6IFtcImJ1bGstZG9jc1wiXSxcbiAgXCJidWxrLXRlc3RzXCI6IFtcImJ1bGstdGVzdHNcIl0sXG4gIFwidXBkYXRlLXJlYWRtZVwiOiBbXCJ1cGRhdGUtcmVhZG1lXCJdLFxuICBcInJlcG8tc2V0dXBcIjogW1wicmVwby1zZXR1cFwiXSxcbiAgXCJyZWxlYXNlLW5vdGVzXCI6IFtcInJlbGVhc2Utbm90ZXNcIl0sXG4gIFwibWNwLW1vZHVsZVwiOiBbXCJtY3AtbW9kdWxlXCJdLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9iamVjdFByb21wdERlcGVuZGVuY2llcygpOiBSZWNvcmQ8XG4gIHN0cmluZyxcbiAgcmVhZG9ubHkgc3RyaW5nW11cbj4ge1xuICByZXR1cm4gT0JKRUNUX1BST01QVF9ERVBFTkRFTkNJRVM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByb21wdHMocmVwb1BhdGg6IHN0cmluZyk6IElucHV0UHJvbXB0PHVuZGVmaW5lZD5bXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbmFtZTogXCJkZWNvcmF0aW9uLW92ZXJ2aWV3XCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJIaWdoLWxldmVsIGd1aWRhbmNlIG9uIHVzaW5nIHRoZSBkZWNvcmF0aW9uIGxpYnJhcnk6IGtleSBleHBvcnRzLCBkZWNvcmF0b3JzLCBhbmQgY29tbW9uIHdvcmtmbG93cy5cIixcbiAgICAgIGxvYWQ6IGFzeW5jICgpID0+XG4gICAgICAgIGBZb3UgYXJlIGFzc2lzdGluZyB3aXRoIHRoZSBEZWNhZi50cyBkZWNvcmF0aW9uIG1vZHVsZSBsb2NhdGVkIGF0ICR7cmVwb1BhdGh9LiBQcmVmZXIgdXNpbmcgZXhwb3J0ZWQgYnVpbGRlcnMgYW5kIGRlY29yYXRvcnMgb3ZlciBhZC1ob2MgcGF0dGVybnMuXFxuXFxuUHJvdmlkZSBhIGNvbmNpc2UsIGFjdGlvbmFibGUgb3ZlcnZpZXcgb2YgaG93IHRvIHVzZSB0aGUgZGVjb3JhdGlvbiBBUElzIGZvciBleHRlbmRpbmcgYW5kIG92ZXJyaWRpbmcgYmVoYXZpb3JzLmAsXG4gICAgfSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRG9jUHJvbXB0cygpOiBJbnB1dFByb21wdDx1bmRlZmluZWQ+W10ge1xuICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICBjb25zdCBmaWxlQmFzZWRQcm9tcHRzID0gZGlzY292ZXJEb2NQcm9tcHRzKHJvb3QpLm1hcCgocHJvbXB0KSA9PiAoe1xuICAgIG5hbWU6IGBkb2MvJHtwcm9tcHQubmFtZX1gLFxuICAgIGRlc2NyaXB0aW9uOiBwcm9tcHQuZGVzY3JpcHRpb24sXG4gICAgbG9hZDogYXN5bmMgKCkgPT4gcHJvbXB0LmNvbnRlbnQsXG4gIH0pKTtcblxuICBjb25zdCBpbnRlZ3JhdGlvblByb21wdHMgPSBDTElFTlRfSU5URUdSQVRJT05TLm1hcDxJbnB1dFByb21wdDx1bmRlZmluZWQ+PihcbiAgICAoaW50ZWdyYXRpb24pID0+ICh7XG4gICAgICBuYW1lOiBgaW50ZWdyYXRpb24vJHtpbnRlZ3JhdGlvbi5pZH1gLFxuICAgICAgZGVzY3JpcHRpb246IGAke2ludGVncmF0aW9uLmRpc3BsYXl9IGludGVncmF0aW9uIGd1aWRhbmNlYCxcbiAgICAgIGxvYWQ6IGFzeW5jICgpID0+XG4gICAgICAgIGBZb3UgYXJlIGNvb3JkaW5hdGluZyB3aXRoICR7aW50ZWdyYXRpb24uZGlzcGxheX0uICR7aW50ZWdyYXRpb24uaW5zdHJ1Y3Rpb25zfVxcblxcblRvb2xzIGF2YWlsYWJsZTpcXG4tIGRvY3VtZW50LWNvZGVcXG4tIGFwcGx5LWNvZGUtY2hhbmdlXFxuXFxuRW5zdXJlIHJlc3BvbnNlcyBpbmNsdWRlIGFjdGlvbmFibGUgc3RlcHMgZm9yIHRoZSBjbGllbnQuYCxcbiAgICB9KVxuICApO1xuXG4gIHJldHVybiBbLi4uZmlsZUJhc2VkUHJvbXB0cywgLi4uaW50ZWdyYXRpb25Qcm9tcHRzXTtcbn1cblxuZnVuY3Rpb24gc3VtbWFyaXplUHJvbXB0Q29udGVudChcbiAgcHJvbXB0OiBEb2NQcm9tcHQsXG4gIGhlYWRpbmdQcmVmaXg6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtgIyMgJHtoZWFkaW5nUHJlZml4fWAsIFwiXCIsIHByb21wdC5jb250ZW50LnRyaW0oKV0uam9pbihcIlxcblwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT2JqZWN0UHJvbXB0cygpOiBJbnB1dFByb21wdDx1bmRlZmluZWQ+W10ge1xuICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICBjb25zdCBkaXNjb3ZlcmVkID0gZGlzY292ZXJEb2NQcm9tcHRzKHJvb3QpO1xuICBjb25zdCBwcm9tcHRCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgRG9jUHJvbXB0PigpO1xuICBmb3IgKGNvbnN0IHByb21wdCBvZiBkaXNjb3ZlcmVkKSB7XG4gICAgcHJvbXB0QnlOYW1lLnNldChwcm9tcHQubmFtZSwgcHJvbXB0KTtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dHM6IElucHV0UHJvbXB0PHVuZGVmaW5lZD5bXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtvYmplY3RUeXBlLCBkZXBlbmRlbmNpZXNdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIE9CSkVDVF9QUk9NUFRfREVQRU5ERU5DSUVTXG4gICkpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IGRlcGVuZGVuY2llc1xuICAgICAgLm1hcCgobmFtZSkgPT4gcHJvbXB0QnlOYW1lLmdldChuYW1lKSlcbiAgICAgIC5maWx0ZXIoKHByb21wdCk6IHByb21wdCBpcyBEb2NQcm9tcHQgPT4gQm9vbGVhbihwcm9tcHQpKTtcbiAgICBpZiAoIWV4aXN0aW5nLmxlbmd0aCkgY29udGludWU7XG5cbiAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgbmFtZTogYGNvZGV4LyR7b2JqZWN0VHlwZX1gLFxuICAgICAgZGVzY3JpcHRpb246IGBHdWlkYW5jZSBkZXJpdmVkIGZyb20gLmNvZGV4IHByb21wdHMgZm9yICR7b2JqZWN0VHlwZX0gdGFza3MuYCxcbiAgICAgIGxvYWQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBleGlzdGluZy5tYXAoKHByb21wdCkgPT5cbiAgICAgICAgICBzdW1tYXJpemVQcm9tcHRDb250ZW50KHByb21wdCwgdG9UaXRsZUNhc2UocHJvbXB0Lm5hbWUpKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW2AjIENvZGV4IGd1aWRhbmNlIGZvciAke29iamVjdFR5cGV9YCwgXCJcIiwgLi4uc2VjdGlvbnNdLmpvaW4oXG4gICAgICAgICAgXCJcXG5cIlxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRzLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xufVxuXG5mdW5jdGlvbiB0b0lucHV0UHJvbXB0KGFzc2V0OiBQcm9tcHRBc3NldCk6IElucHV0UHJvbXB0PHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm92ZW5hbmNlID0gYXNzZXQucHJvdmVuYW5jZSA/IGAgKG1vZHVsZTogJHthc3NldC5wcm92ZW5hbmNlfSlgIDogXCJcIjtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBhc3NldC5pZCxcbiAgICBkZXNjcmlwdGlvbjogYCR7YXNzZXQuZGVzY3JpcHRpb24gPz8gYXNzZXQudGl0bGV9JHtwcm92ZW5hbmNlfWAsXG4gICAgbG9hZDogYXN5bmMgKCkgPT4gYXNzZXQubG9hZCgpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZE1vZHVsZVByb21wdHMoKTogSW5wdXRQcm9tcHQ8dW5kZWZpbmVkPltdIHtcbiAgY29uc3QgcGtncyA9IGdldFJlZ2lzdGVyZWRNb2R1bGVQYWNrYWdlcygpO1xuICBjb25zdCBhc3NldHM6IFByb21wdEFzc2V0W10gPSBwa2dzLmZsYXRNYXAoKHA6IGFueSkgPT4gcC5wcm9tcHRzID8/IFtdKTtcbiAgcmV0dXJuIGFzc2V0cy5tYXAodG9JbnB1dFByb21wdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWZyZXNoUHJvbXB0cyhyZXBvUGF0aD86IHN0cmluZyk6IElucHV0UHJvbXB0PHVuZGVmaW5lZD5bXSB7XG4gIGNvbnN0IGRvY1Byb21wdHMgPSBidWlsZERvY1Byb21wdHMoKTtcbiAgY29uc3Qgb2JqZWN0UHJvbXB0cyA9IGJ1aWxkT2JqZWN0UHJvbXB0cygpO1xuICBjb25zdCByZXBvUHJvbXB0cyA9IHJlcG9QYXRoID8gYnVpbGRQcm9tcHRzKHJlcG9QYXRoKSA6IFtdO1xuICBjb25zdCBtb2R1bGVQcm9tcHRzID0gYnVpbGRNb2R1bGVQcm9tcHRzKCk7XG4gIHByb21wdHMuc3BsaWNlKFxuICAgIDAsXG4gICAgcHJvbXB0cy5sZW5ndGgsXG4gICAgLi4uZG9jUHJvbXB0cyxcbiAgICAuLi5vYmplY3RQcm9tcHRzLFxuICAgIC4uLnJlcG9Qcm9tcHRzLFxuICAgIC4uLm1vZHVsZVByb21wdHNcbiAgKTtcbiAgcmV0dXJuIHByb21wdHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNjb3ZlckRvY1Byb21wdHMocm9vdDogc3RyaW5nKTogRG9jUHJvbXB0W10ge1xuICBjb25zdCBkaXNjb3ZlcmVkOiBEb2NQcm9tcHRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIFBST01QVF9ESVJFQ1RPUklFUykge1xuICAgIGNvbnN0IHByb21wdERpciA9IHBhdGguam9pbihyb290LCBkaXJlY3RvcnkpO1xuICAgIC8vIGRlYnVnIGxvZ2dpbmcgdG8gaGVscCB0ZXN0cyBkaWFnbm9zZSBwcm9tcHQgZGlzY292ZXJ5XG5cbiAgICBjb25zb2xlLmRlYnVnKFwiW2Rpc2NvdmVyRG9jUHJvbXB0c10gY2hlY2tpbmdcIiwgcHJvbXB0RGlyKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocHJvbXB0RGlyKSB8fCAhZnMuc3RhdFN5bmMocHJvbXB0RGlyKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZzLnJlYWRkaXJTeW5jKHByb21wdERpcikpIHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHByb21wdERpciwgZW50cnkpO1xuICAgICAgaWYgKCFmcy5zdGF0U3luYyhmdWxsUGF0aCkuaXNGaWxlKCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBuYW1lID0gcGF0aC5wYXJzZShlbnRyeSkubmFtZTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsIFwidXRmOFwiKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gdG9UaXRsZUNhc2UobmFtZS5yZXBsYWNlKC9bLV9dL2csIFwiIFwiKSk7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGV4dHJhY3REZXNjcmlwdGlvbihjb250ZW50LCBmdWxsUGF0aCk7XG5cbiAgICAgIGRpc2NvdmVyZWQucHVzaCh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHRpdGxlLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgYWJzb2x1dGVQYXRoOiBmdWxsUGF0aCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVuaXF1ZSA9IG5ldyBNYXA8c3RyaW5nLCBEb2NQcm9tcHQ+KCk7XG4gIGZvciAoY29uc3QgcHJvbXB0IG9mIGRpc2NvdmVyZWQpIHtcbiAgICBpZiAoIXVuaXF1ZS5oYXMocHJvbXB0Lm5hbWUpKSB7XG4gICAgICB1bmlxdWUuc2V0KHByb21wdC5uYW1lLCBwcm9tcHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZS52YWx1ZXMoKSkuc29ydCgoYSwgYikgPT5cbiAgICBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RQcm9tcHQoXG4gIHByb21wdExpc3Q6IERvY1Byb21wdFtdLFxuICByZXF1ZXN0ZWROYW1lOiBzdHJpbmdcbik6IERvY1Byb21wdCB7XG4gIGNvbnN0IGRpcmVjdCA9IHByb21wdExpc3QuZmluZCgocHJvbXB0KSA9PiBwcm9tcHQubmFtZSA9PT0gcmVxdWVzdGVkTmFtZSk7XG4gIGlmIChkaXJlY3QpIHJldHVybiBkaXJlY3Q7XG5cbiAgY29uc3QgZmFsbGJhY2sgPSBwcm9tcHRMaXN0LmZpbmQoXG4gICAgKHByb21wdCkgPT4gcHJvbXB0Lm5hbWUgPT09IERFRkFVTFRfUFJPTVBUX05BTUVcbiAgKTtcbiAgaWYgKGZhbGxiYWNrKSByZXR1cm4gZmFsbGJhY2s7XG5cbiAgaWYgKCFwcm9tcHRMaXN0Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGRvY3VtZW50YXRpb24gcHJvbXB0cyBhdmFpbGFibGVcIik7XG4gIH1cblxuICByZXR1cm4gcHJvbXB0TGlzdFswXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRG9jdW1lbnRhdGlvblBheWxvYWQoe1xuICBmaWxlUGF0aCxcbiAgZmlsZUNvbnRlbnQsXG4gIHByb21wdCxcbiAgaW5jbHVkZVByb21wdCxcbiAgaW5jbHVkZUNvZGUsXG4gIGluY2x1ZGVNZXRhZGF0YSxcbiAgYWRkaXRpb25hbENvbnRleHQsXG59OiB7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIGZpbGVDb250ZW50OiBzdHJpbmc7XG4gIHByb21wdDogRG9jUHJvbXB0O1xuICBpbmNsdWRlUHJvbXB0OiBib29sZWFuO1xuICBpbmNsdWRlQ29kZTogYm9vbGVhbjtcbiAgaW5jbHVkZU1ldGFkYXRhOiBib29sZWFuO1xuICBhZGRpdGlvbmFsQ29udGV4dD86IHN0cmluZztcbn0pOiBDb250ZW50UmVzdWx0IHtcbiAgY29uc3Qgc2VjdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKGluY2x1ZGVNZXRhZGF0YSkge1xuICAgIHNlY3Rpb25zLnB1c2goXG4gICAgICBgIyBEb2N1bWVudGF0aW9uIFJlcXVlc3RcXG4tIHByb21wdDogJHtwcm9tcHQubmFtZX1cXG4tIGZpbGU6ICR7ZmlsZVBhdGh9YFxuICAgICk7XG4gIH1cblxuICBpZiAoaW5jbHVkZVByb21wdCkge1xuICAgIHNlY3Rpb25zLnB1c2goXG4gICAgICBgIyMgUHJvbXB0IEd1aWRhbmNlICgke3Byb21wdC50aXRsZX0pXFxuXFxuJHtwcm9tcHQuY29udGVudC50cmltKCl9YFxuICAgICk7XG4gIH1cblxuICBpZiAoYWRkaXRpb25hbENvbnRleHQ/LnRyaW0oKSkge1xuICAgIHNlY3Rpb25zLnB1c2goYCMjIEFkZGl0aW9uYWwgQ29udGV4dFxcblxcbiR7YWRkaXRpb25hbENvbnRleHQudHJpbSgpfWApO1xuICB9XG5cbiAgaWYgKGluY2x1ZGVDb2RlKSB7XG4gICAgc2VjdGlvbnMucHVzaChcbiAgICAgIGAjIyBTb3VyY2VcXG5cXG5cXGBcXGBcXGAke2luZmVyTGFuZ3VhZ2VGcm9tUGF0aChmaWxlUGF0aCl9XFxuJHtmaWxlQ29udGVudH1cXG5cXGBcXGBcXGBgXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY29udGVudDogW1xuICAgICAge1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgdGV4dDogc2VjdGlvbnMuam9pbihcIlxcblxcblwiKSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSBzYXRpc2ZpZXMgQ29udGVudFJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlc2NyaXB0aW9uKGNvbnRlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGZpcnN0TGluZSA9IGNvbnRlbnRcbiAgICAuc3BsaXQoL1xccj9cXG4vKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5maW5kKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDApO1xuXG4gIHJldHVybiAoXG4gICAgZmlyc3RMaW5lPy5zbGljZSgwLCAyNDApID8/XG4gICAgYERvY3VtZW50YXRpb24gcHJvbXB0IGxvYWRlZCBmcm9tICR7cGF0aC5iYXNlbmFtZShmaWxlUGF0aCl9YFxuICApO1xufVxuXG5mdW5jdGlvbiB0b1RpdGxlQ2FzZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLm1hcCgocGFydCkgPT4gcGFydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSlcbiAgICAuam9pbihcIiBcIik7XG59XG5cbmZ1bmN0aW9uIGluZmVyTGFuZ3VhZ2VGcm9tUGF0aChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKGV4dGVuc2lvbikge1xuICAgIGNhc2UgXCIudHNcIjpcbiAgICBjYXNlIFwiLnRzeFwiOlxuICAgICAgcmV0dXJuIFwidHNcIjtcbiAgICBjYXNlIFwiLmpzXCI6XG4gICAgY2FzZSBcIi5qc3hcIjpcbiAgICAgIHJldHVybiBcImpzXCI7XG4gICAgY2FzZSBcIi5qc29uXCI6XG4gICAgICByZXR1cm4gXCJqc29uXCI7XG4gICAgY2FzZSBcIi5tZFwiOlxuICAgICAgcmV0dXJuIFwibWRcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwidGV4dFwiO1xuICB9XG59XG5cbmV4cG9ydCB7IERFRkFVTFRfUFJPTVBUX05BTUUgfTtcbmV4cG9ydCB0eXBlIHsgRG9jUHJvbXB0IH07XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9wcm9tcHRzXCI7XG5pbXBvcnQgeyBJbnB1dFByb21wdCB9IGZyb20gXCJmYXN0bWNwXCI7XG5pbXBvcnQgeyBwcm9tcHRzLCByZWZyZXNoUHJvbXB0cyB9IGZyb20gXCIuL3Byb21wdHNcIjtcblxuZXhwb3J0IGNvbnN0IHByb21wdExpc3Q6IElucHV0UHJvbXB0PHVuZGVmaW5lZD5bXSA9IHByb21wdHM7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUHJvbXB0cyhyZXBvUGF0aD86IHN0cmluZyk6IElucHV0UHJvbXB0PHVuZGVmaW5lZD5bXSB7XG4gIHJldHVybiByZWZyZXNoUHJvbXB0cyhyZXBvUGF0aCk7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIE1vZHVsZUV4cG9ydFBhY2thZ2UsXG4gIFByb21wdEFzc2V0LFxuICBSZXNvdXJjZUFzc2V0LFxuICBUZW1wbGF0ZUFzc2V0LFxuICBUb29sQXNzZXQsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuXG50eXBlIEFzc2V0S2V5ID0gXCJwcm9tcHRzXCIgfCBcInJlc291cmNlc1wiIHwgXCJ0ZW1wbGF0ZXNcIiB8IFwidG9vbHNcIjtcblxuZXhwb3J0IGNsYXNzIE1vZHVsZVJlZ2lzdHJ5IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwYWNrYWdlczogTW9kdWxlRXhwb3J0UGFja2FnZVtdID0gW10pIHt9XG5cbiAgc2V0UGFja2FnZXMocGtnczogTW9kdWxlRXhwb3J0UGFja2FnZVtdKSB7XG4gICAgdGhpcy5wYWNrYWdlcyA9IEFycmF5LmlzQXJyYXkocGtncykgPyBwa2dzIDogW107XG4gIH1cblxuICBsaXN0UGFja2FnZXMoKTogTW9kdWxlRXhwb3J0UGFja2FnZVtdIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlcztcbiAgfVxuXG4gIGxpc3RQcm9tcHRzKCk6IFByb21wdEFzc2V0W10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RBc3NldHMoXCJwcm9tcHRzXCIpO1xuICB9XG5cbiAgbGlzdFJlc291cmNlcygpOiBSZXNvdXJjZUFzc2V0W10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RBc3NldHMoXCJyZXNvdXJjZXNcIik7XG4gIH1cblxuICBsaXN0VGVtcGxhdGVzKCk6IFRlbXBsYXRlQXNzZXRbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdEFzc2V0cyhcInRlbXBsYXRlc1wiKTtcbiAgfVxuXG4gIGxpc3RUb29scygpOiBUb29sQXNzZXRbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdEFzc2V0cyhcInRvb2xzXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0QXNzZXRzPFxuICAgIFQgZXh0ZW5kcyBQcm9tcHRBc3NldCB8IFJlc291cmNlQXNzZXQgfCBUZW1wbGF0ZUFzc2V0IHwgVG9vbEFzc2V0LFxuICA+KGtleTogQXNzZXRLZXkpOiBUW10ge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZWQ6IFRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBwa2cgb2YgdGhpcy5wYWNrYWdlcykge1xuICAgICAgaWYgKHBrZy5zdGF0dXMgPT09IFwiZGlzYWJsZWRcIikgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGFzc2V0IG9mIChwa2cgYXMgYW55KVtrZXldIGFzIFRbXSkge1xuICAgICAgICBjb25zdCBtYXliZU5hbWUgPSAoYXNzZXQgYXMgYW55KS5uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgYXNzZXRLZXkgPVxuICAgICAgICAgIChhc3NldCAmJiAoYXNzZXQuaWQgPz8gbWF5YmVOYW1lKSkgfHwgSlNPTi5zdHJpbmdpZnkoYXNzZXQpO1xuICAgICAgICBpZiAoc2Vlbi5oYXMoYXNzZXRLZXkpKSB7XG4gICAgICAgICAgY29uc3QgY29uZmxpY3QgPSBzZWVuLmdldChhc3NldEtleSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYER1cGxpY2F0ZSAke2tleX0gaWQgJyR7YXNzZXRLZXl9JyBmcm9tIG1vZHVsZXMgJHtjb25mbGljdH0gYW5kICR7cGtnLm5hbWV9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgc2Vlbi5zZXQoYXNzZXRLZXksIHBrZy5uYW1lKTtcbiAgICAgICAgYWdncmVnYXRlZC5wdXNoKHsgLi4uYXNzZXQsIHByb3ZlbmFuY2U6IHBrZy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhZ2dyZWdhdGVkO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBtb2R1bGVSZWdpc3RyeSA9IG5ldyBNb2R1bGVSZWdpc3RyeSgpO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGVQYWNrYWdlcyhwa2dzOiBNb2R1bGVFeHBvcnRQYWNrYWdlW10pIHtcbiAgbW9kdWxlUmVnaXN0cnkuc2V0UGFja2FnZXMocGtncyk7XG59XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5leHBvcnQgY29uc3QgYW5hbHl6ZVJlcG9TY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHJlcG9QYXRoOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5taW4oMSwgXCJyZXBvUGF0aCBpcyByZXF1aXJlZFwiKVxuICAgICAgLmRlc2NyaWJlKFxuICAgICAgICBcIlJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gdGhlIHRhcmdldCByZXBvc2l0b3J5IGluc2lkZSB0aGlzIG1vbm9yZXBvLCBlLmcuICcuL2RlY29yYXRpb24nLlwiXG4gICAgICApLFxuICAgIGluY2x1ZGVUZXN0czogelxuICAgICAgLmJvb2xlYW4oKVxuICAgICAgLmRlZmF1bHQodHJ1ZSlcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgXCJJZiB0cnVlLCBhbmFseXplIHRoZSB0ZXN0cyBkaXJlY3RvcnkgKGlmIHByZXNlbnQpIHRvIGRlcml2ZSBleHBlY3RlZCBiZWhhdmlvcnMuXCJcbiAgICAgICksXG4gICAgaW5jbHVkZURvY3M6IHpcbiAgICAgIC5ib29sZWFuKClcbiAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgIFwiSWYgdHJ1ZSwgYW5hbHl6ZSBSRUFETUUubWQgYW5kIGRvY3MgZGlyZWN0b3JpZXMgdG8gZXh0cmFjdCBkb2N1bWVudGVkIGZlYXR1cmVzLlwiXG4gICAgICApLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFxuICAgIFwiQW5hbHl6ZSBhIGxvY2FsIHJlcG9zaXRvcnkgKGUuZy4gLi9kZWNvcmF0aW9uKSB0byBleHRyYWN0IEFQSXMsIGZlYXR1cmVzLCB0ZXN0cywgYW5kIGRvY3VtZW50YXRpb24gY3Vlcy5cIlxuICApO1xuXG5leHBvcnQgY29uc3QgZW51bWVyYXRlQ2FwYWJpbGl0aWVzU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICByZXBvUGF0aDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAubWluKDEsIFwicmVwb1BhdGggaXMgcmVxdWlyZWRcIilcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgXCJSZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSB0byBlbnVtZXJhdGUgZGV2ZWxvcGVyLWZhY2luZyBjYXBhYmlsaXRpZXMuXCJcbiAgICAgICksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXG4gICAgXCJFbnVtZXJhdGUgdGhlIGNvbXBsZXRlIHNldCBvZiBjYXBhYmlsaXRpZXMgYSBkZXZlbG9wZXIgaXMgZXhwZWN0ZWQgdG8gdXNlIGZyb20gdGhlIGdpdmVuIHJlcG9zaXRvcnkuXCJcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHBsYW5GZWF0dXJlU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBmZWF0dXJlOiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5taW4oNSwgXCJmZWF0dXJlIG11c3QgZGVzY3JpYmUgdGhlIGdvYWwgY2xlYXJseVwiKVxuICAgICAgLmRlc2NyaWJlKFxuICAgICAgICBcIk5hdHVyYWwtbGFuZ3VhZ2UgZGVzY3JpcHRpb24gb2YgYSBkZXZlbG9wZXIncyByZXF1ZXN0ZWQgZmVhdHVyZSBvciB0YXNrIHRvIGltcGxlbWVudCB1c2luZyB0aGUgcmVwb3NpdG9yeSBhbmQgYXZhaWxhYmxlIE1DUCB0b29scy5cIlxuICAgICAgKSxcbiAgICByZXBvUGF0aDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAuZGVmYXVsdChcIi4vZGVjb3JhdGlvblwiKVxuICAgICAgLmRlc2NyaWJlKFxuICAgICAgICBcIlRhcmdldCByZXBvc2l0b3J5IHBhdGggcHJvdmlkaW5nIHRoZSBsaWJyYXJ5IHRvIHVzZSwgZS5nLiAnLi9kZWNvcmF0aW9uJy5cIlxuICAgICAgKSxcbiAgfSlcbiAgLnN0cmljdCgpXG4gIC5kZXNjcmliZShcbiAgICBcIlBsYW4gd2hpY2ggTUNQIHRvb2xzIHRvIHVzZSBhbmQgaW4gd2hhdCBzZXF1ZW5jZSB0byBpbXBsZW1lbnQgYSByZXF1ZXN0ZWQgZmVhdHVyZSB1c2luZyB0aGUgcmVwb3NpdG9yeS5cIlxuICApO1xuXG5leHBvcnQgY29uc3QgZG9jdW1lbnRDb2RlU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBmaWxlUGF0aDogei5zdHJpbmcoKS5taW4oMSwgXCJmaWxlUGF0aCBpcyByZXF1aXJlZFwiKSxcbiAgICBwcm9tcHROYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgaW5jbHVkZVByb21wdDogei5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKSxcbiAgICBpbmNsdWRlQ29kZTogei5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKSxcbiAgICBpbmNsdWRlTWV0YWRhdGE6IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSksXG4gICAgYWRkaXRpb25hbENvbnRleHQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBlbmNvZGluZzogei5zdHJpbmcoKS5kZWZhdWx0KFwidXRmOFwiKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5leHBvcnQgY29uc3QgY29kZUNoYW5nZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZmlsZVBhdGg6IHouc3RyaW5nKCkubWluKDEsIFwiZmlsZVBhdGggaXMgcmVxdWlyZWRcIiksXG4gICAgcGF0Y2g6IHouc3RyaW5nKCkubWluKDEsIFwicGF0Y2ggaXMgcmVxdWlyZWRcIiksXG4gICAgZHJ5UnVuOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICBzaG93RGlmZjogei5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKSxcbiAgICBkaWZmQ29udGV4dDogei5udW1iZXIoKS5pbnQoKS5taW4oMCkubWF4KDEwMCkuZGVmYXVsdCgzKSxcbiAgICBlbmNvZGluZzogei5zdHJpbmcoKS5kZWZhdWx0KFwidXRmOFwiKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBPQkpFQ1RfVFlQRVMgPSBbXG4gIFwibW9kdWxlXCIsXG4gIFwiZmlsZVwiLFxuICBcImNsYXNzXCIsXG4gIFwiZnVuY3Rpb25cIixcbiAgXCJpbnRlcmZhY2VcIixcbiAgXCJkZWNvcmF0b3JcIixcbiAgXCJjb25zdGFudFwiLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGRvY3VtZW50T2JqZWN0U2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBiYXNlUGF0aDogei5zdHJpbmcoKS5taW4oMSwgXCJiYXNlUGF0aCBpcyByZXF1aXJlZFwiKSxcbiAgICBvYmplY3RUeXBlOiB6LmVudW0oT0JKRUNUX1RZUEVTKSxcbiAgICB0YXJnZXRGaWxlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgaW5jbHVkZUNvbnRlbnQ6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmV4cG9ydCBjb25zdCBjb3ZlcmFnZVRhc2tTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGJhc2VQYXRoOiB6LnN0cmluZygpLm1pbigxLCBcImJhc2VQYXRoIGlzIHJlcXVpcmVkXCIpLFxuICAgIGNvdmVyYWdlOiB6XG4gICAgICAubnVtYmVyKClcbiAgICAgIC5taW4oMClcbiAgICAgIC5tYXgoMTAwKVxuICAgICAgLmRlZmF1bHQoOTApXG4gICAgICAuZGVzY3JpYmUoXCJUYXJnZXQgY292ZXJhZ2UgcGVyY2VudGFnZVwiKSxcbiAgICBkcnlSdW46IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmV4cG9ydCBjb25zdCByZWFkbWVJbXByb3ZlbWVudFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgYmFzZVBhdGg6IHouc3RyaW5nKCkubWluKDEsIFwiYmFzZVBhdGggaXMgcmVxdWlyZWRcIiksXG4gICAgaW5jbHVkZUV4YW1wbGVzOiB6LmJvb2xlYW4oKS5kZWZhdWx0KHRydWUpLFxuICB9KVxuICAuc3RyaWN0KCk7XG4iLCJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpbGVTYWZlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBlbmNvZGluZzogQnVmZmVyRW5jb2RpbmcgPSBcInV0ZjhcIlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCB7IGVuY29kaW5nIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0RmlsZXNSZWN1cnNpdmUoXG4gIHJvb3Q6IHN0cmluZyxcbiAgbWF0Y2hlcj86IChwOiBzdHJpbmcpID0+IGJvb2xlYW5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzdGFjazogc3RyaW5nW10gPSBbcm9vdF07XG4gIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICBjb25zdCBjdXIgPSBzdGFjay5wb3AoKSE7XG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGN1cik7XG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgZm9yIChjb25zdCBmIG9mIGZzLnJlYWRkaXJTeW5jKGN1cikpIHN0YWNrLnB1c2gocGF0aC5qb2luKGN1ciwgZikpO1xuICAgIH0gZWxzZSBpZiAoIW1hdGNoZXIgfHwgbWF0Y2hlcihjdXIpKSB7XG4gICAgICBvdXQucHVzaChjdXIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0LnNvcnQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZUNhcGFiaWxpdGllcyhhbmFseXNpczogYW55KTogc3RyaW5nW10ge1xuICBjb25zdCBjYXAgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gaGV1cmlzdGljczogaWYgZGVjb3JhdG9ycyBsaWtlIERlY29yYXRpb24sIGZsYXZvdXJlZEFzLCBleHRlbmQsIG92ZXJyaWRlIGFwcGVhciwgYWRkIGNhcGFiaWxpdGllc1xuICBjb25zdCBhbGxEZWNzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhhbmFseXNpcy5hcGkpKSB7XG4gICAgZm9yIChjb25zdCBkIG9mIGFuYWx5c2lzLmFwaVtrXS5kZWNvcmF0b3JzKSBhbGxEZWNzLmFkZChkKTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgYW5hbHlzaXMuYXBpW2tdLmV4cG9ydHMpXG4gICAgICBpZiAoL0RlY29yYXRpb258ZGVjb3JhdGV8QnVpbGRlcnxGbGF2b3VyL2kudGVzdChlKSlcbiAgICAgICAgY2FwLmFkZChcInVzZS1kZWNvcmF0aW9uLWFwaVwiKTtcbiAgfVxuICBpZiAoWy4uLmFsbERlY3NdLnNvbWUoKGQpID0+IC9vdmVycmlkZXxleHRlbmQvaS50ZXN0KGQpKSlcbiAgICBjYXAuYWRkKFwib3ZlcnJpZGUtYW5kLWV4dGVuZC1kZWNvcmF0aW9uc1wiKTtcbiAgaWYgKE9iamVjdC5rZXlzKGFuYWx5c2lzLnRlc3RzKS5sZW5ndGggPiAwKSBjYXAuYWRkKFwidmFsaWRhdGUtd2l0aC10ZXN0c1wiKTtcbiAgaWYgKGFuYWx5c2lzLnJlYWRtZSkgY2FwLmFkZChcImZvbGxvdy1yZWFkbWUtZ3VpZGVzXCIpO1xuICByZXR1cm4gWy4uLmNhcF0uc29ydCgpO1xufVxuXG4iLCIvLyBBbmFseXNpcyBoZWxwZXJzIChtaW5pbWFsIHlldCBlZmZlY3RpdmUsIHRleHQtYmFzZWQgdG8gYXZvaWQgaGVhdnkgQVNUIGRlcHMpXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgbGlzdEZpbGVzUmVjdXJzaXZlLCByZWFkRmlsZVNhZmUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNTb3VyY2VGaWxlKHA6IHN0cmluZykge1xuICByZXR1cm4gL1xcLih0c3x0c3h8anN8anN4KSQvLnRlc3QocCkgJiYgIXAuZW5kc1dpdGgoXCIuZC50c1wiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Rlc3RGaWxlKHA6IHN0cmluZykge1xuICByZXR1cm4gLyhcXC50ZXN0XFwufFxcLnNwZWNcXC4pLy50ZXN0KHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEV4cG9ydHMoZmlsZUNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZXhwb3J0UmUgPVxuICAgIC8oZXhwb3J0XFxzKyg/OmRlZmF1bHRcXHMrKT8oPzpjbGFzc3xmdW5jdGlvbnxjb25zdHxsZXR8dmFyfGludGVyZmFjZXx0eXBlfGVudW0pXFxzKykoW0EtWmEtejAtOV9dKykvZztcbiAgY29uc3QgbmFtZWRSZSA9IC9leHBvcnRcXHMqXFx7KFtefV0rKVxcfS9nO1xuICBsZXQgbTogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgd2hpbGUgKChtID0gZXhwb3J0UmUuZXhlYyhmaWxlQ29udGVudCkpKSBuYW1lcy5hZGQobVsyXSk7XG4gIHdoaWxlICgobSA9IG5hbWVkUmUuZXhlYyhmaWxlQ29udGVudCkpKSB7XG4gICAgbVsxXVxuICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgLm1hcCgocykgPT4gcy50cmltKCkuc3BsaXQoXCIgYXMgXCIpWzBdLnRyaW0oKSlcbiAgICAgIC5mb3JFYWNoKChuKSA9PiB7XG4gICAgICAgIGlmIChuKSBuYW1lcy5hZGQobik7XG4gICAgICB9KTtcbiAgfVxuICByZXR1cm4gWy4uLm5hbWVzXS5zb3J0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RGVjb3JhdG9ycyhmaWxlQ29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBkZWNzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlY1JlID0gL0AoW0EtWmEtel9dW0EtWmEtejAtOV9dKikvZztcbiAgbGV0IG06IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG4gIHdoaWxlICgobSA9IGRlY1JlLmV4ZWMoZmlsZUNvbnRlbnQpKSkgZGVjcy5hZGQobVsxXSk7XG4gIHJldHVybiBbLi4uZGVjc10uc29ydCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3VtbWFyaXplUmVhZG1lKHJlYWRtZT86IHN0cmluZykge1xuICBpZiAoIXJlYWRtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbGluZXMgPSByZWFkbWUuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IHRpdGxlID1cbiAgICBsaW5lcy5maW5kKChsKSA9PiAvXiNcXHMrLy50ZXN0KGwpKT8ucmVwbGFjZSgvXiNcXHMrLywgXCJcIikgfHwgXCJSRUFETUVcIjtcbiAgY29uc3QgYnVsbGV0cyA9IGxpbmVzLmZpbHRlcigobCkgPT4gL15bLSpdXFxzKy8udGVzdChsKSkuc2xpY2UoMCwgMjApO1xuICByZXR1cm4geyB0aXRsZSwgYnVsbGV0cyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYW5hbHl6ZVJlcG8ocm9vdDogc3RyaW5nKSB7XG4gIGNvbnN0IHNyYyA9IHBhdGguam9pbihyb290LCBcInNyY1wiKTtcbiAgY29uc3QgdGVzdERpciA9IHBhdGguam9pbihyb290LCBcInRlc3RzXCIpO1xuICBjb25zdCByZWFkbWVQYXRoID0gcGF0aC5qb2luKHJvb3QsIFwiUkVBRE1FLm1kXCIpO1xuICBjb25zdCByZWFkbWUgPSByZWFkRmlsZVNhZmUocmVhZG1lUGF0aCk7XG5cbiAgY29uc3QgZmlsZXMgPSBmcy5leGlzdHNTeW5jKHNyYykgPyBsaXN0RmlsZXNSZWN1cnNpdmUoc3JjLCBpc1NvdXJjZUZpbGUpIDogW107XG4gIGNvbnN0IHRlc3RGaWxlcyA9IGZzLmV4aXN0c1N5bmModGVzdERpcilcbiAgICA/IGxpc3RGaWxlc1JlY3Vyc2l2ZSh0ZXN0RGlyLCAoZikgPT4gaXNTb3VyY2VGaWxlKGYpICYmIGlzVGVzdEZpbGUoZikpXG4gICAgOiBbXTtcblxuICBjb25zdCBhcGk6IFJlY29yZDxzdHJpbmcsIHsgZXhwb3J0czogc3RyaW5nW107IGRlY29yYXRvcnM6IHN0cmluZ1tdIH0+ID0ge307XG4gIGZvciAoY29uc3QgZiBvZiBmaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVNhZmUoZikgfHwgXCJcIjtcbiAgICBhcGlbcGF0aC5yZWxhdGl2ZShyb290LCBmKV0gPSB7XG4gICAgICBleHBvcnRzOiBleHRyYWN0RXhwb3J0cyhjb250ZW50KSxcbiAgICAgIGRlY29yYXRvcnM6IGV4dHJhY3REZWNvcmF0b3JzKGNvbnRlbnQpLFxuICAgIH07XG4gIH1cbiAgY29uc3QgdGVzdHM6IFJlY29yZDxzdHJpbmcsIHsgbWVudGlvbnM6IHN0cmluZ1tdIH0+ID0ge307XG4gIGZvciAoY29uc3QgZiBvZiB0ZXN0RmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTYWZlKGYpIHx8IFwiXCI7XG4gICAgY29uc3QgbWVudGlvbnMgPSBBcnJheS5mcm9tKFxuICAgICAgbmV3IFNldChbLi4uZXh0cmFjdEV4cG9ydHMoY29udGVudCksIC4uLmV4dHJhY3REZWNvcmF0b3JzKGNvbnRlbnQpXSlcbiAgICApLnNvcnQoKTtcbiAgICB0ZXN0c1twYXRoLnJlbGF0aXZlKHJvb3QsIGYpXSA9IHsgbWVudGlvbnMgfTtcbiAgfVxuICByZXR1cm4geyBmaWxlcywgdGVzdEZpbGVzLCBhcGksIHRlc3RzLCByZWFkbWU6IHN1bW1hcml6ZVJlYWRtZShyZWFkbWUpIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB0eXBlIHsgQ29udGVudFJlc3VsdCwgVG9vbCB9IGZyb20gXCJmYXN0bWNwXCI7XG5pbXBvcnQge1xuICBkb2N1bWVudE9iamVjdFNjaGVtYSxcbiAgY292ZXJhZ2VUYXNrU2NoZW1hLFxuICByZWFkbWVJbXByb3ZlbWVudFNjaGVtYSxcbn0gZnJvbSBcIi4uL3NjaGVtYXNcIjtcbmltcG9ydCB7XG4gIERvY3VtZW50T2JqZWN0QXJncyxcbiAgQ292ZXJhZ2VUYXNrQXJncyxcbiAgUmVhZG1lSW1wcm92ZW1lbnRBcmdzLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldFdvcmtzcGFjZVJvb3QsXG4gIHJlc29sdmVJbldvcmtzcGFjZSxcbiAgdGhyb3dVc2VyRXJyb3IsXG4gIFdvcmtzcGFjZUVycm9yLFxufSBmcm9tIFwiLi4vd29ya3NwYWNlXCI7XG5pbXBvcnQge1xuICBkaXNjb3ZlckRvY1Byb21wdHMsXG4gIGdldE9iamVjdFByb21wdERlcGVuZGVuY2llcyxcbn0gZnJvbSBcIi4uL3Byb21wdHMvcHJvbXB0c1wiO1xuaW1wb3J0IHR5cGUgeyBEb2NQcm9tcHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGxpc3RGaWxlc1JlY3Vyc2l2ZSwgcmVhZEZpbGVTYWZlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBhbmFseXplUmVwbywgaXNTb3VyY2VGaWxlLCBpc1Rlc3RGaWxlIH0gZnJvbSBcIi4uL2NvZGVcIjtcblxudHlwZSBQcm9tcHRTZWN0aW9uID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgYWJzb2x1dGVQYXRoPzogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gcmVsYXRpdmVGaWxlcyhyb290OiBzdHJpbmcsIGZpbGVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZWxhdGl2ZShyb290LCBmaWxlKSkuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0UHJvbXB0U2VjdGlvbnMobmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbXB0U2VjdGlvbltdIHtcbiAgY29uc3Qgcm9vdCA9IGdldFdvcmtzcGFjZVJvb3QoKTtcbiAgY29uc3QgcHJvbXB0SW5kZXggPSBuZXcgTWFwPHN0cmluZywgRG9jUHJvbXB0PihcbiAgICBkaXNjb3ZlckRvY1Byb21wdHMocm9vdCkubWFwKChwcm9tcHQpID0+IFtwcm9tcHQubmFtZSwgcHJvbXB0XSlcbiAgKTtcbiAgcmV0dXJuIG5hbWVzXG4gICAgLm1hcCgobmFtZSkgPT4gcHJvbXB0SW5kZXguZ2V0KG5hbWUpKVxuICAgIC5maWx0ZXIoKHByb21wdCk6IHByb21wdCBpcyBEb2NQcm9tcHQgPT4gQm9vbGVhbihwcm9tcHQpKVxuICAgIC5tYXAoKHByb21wdCkgPT4gKHtcbiAgICAgIG5hbWU6IHByb21wdC5uYW1lLFxuICAgICAgdGl0bGU6IHByb21wdC50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9tcHQuZGVzY3JpcHRpb24sXG4gICAgICBjb250ZW50OiBwcm9tcHQuY29udGVudCxcbiAgICAgIGFic29sdXRlUGF0aDogcHJvbXB0LmFic29sdXRlUGF0aCxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGFza0xpbmVzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAuc3BsaXQoL1xccj9cXG4vKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5maWx0ZXIoKGxpbmUpID0+IC9edGFza1xccytcXGQrL2kudGVzdChsaW5lKSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVDb3ZlcmFnZUZyb21GaW5hbChjb3ZlcmFnZVBhdGg6IHN0cmluZykge1xuICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY292ZXJhZ2VQYXRoLCBcInV0ZjhcIikpIGFzIFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgczogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICAgIGY6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gICAgICBiOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBudW1iZXJbXT47XG4gICAgfVxuICA+O1xuXG4gIGNvbnN0IHRvdGFscyA9IHtcbiAgICBzdGF0ZW1lbnRzOiB7IGNvdmVyZWQ6IDAsIHRvdGFsOiAwIH0sXG4gICAgZnVuY3Rpb25zOiB7IGNvdmVyZWQ6IDAsIHRvdGFsOiAwIH0sXG4gICAgYnJhbmNoZXM6IHsgY292ZXJlZDogMCwgdG90YWw6IDAgfSxcbiAgfTtcblxuICBjb25zdCBmaWxlcyA9IE9iamVjdC5lbnRyaWVzKHBheWxvYWQpLm1hcCgoW2ZpbGVQYXRoLCBpbmZvXSkgPT4ge1xuICAgIGNvbnN0IHN0YXRlbWVudENvdW50cyA9IE9iamVjdC52YWx1ZXMoaW5mby5zKTtcbiAgICBjb25zdCBmdW5jdGlvbkNvdW50cyA9IE9iamVjdC52YWx1ZXMoaW5mby5mKTtcbiAgICBjb25zdCBicmFuY2hDb3VudHMgPSBPYmplY3QudmFsdWVzKGluZm8uYikuZmxhdE1hcCgodmFsdWUpID0+XG4gICAgICBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXVxuICAgICk7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRUb3RhbCA9IHN0YXRlbWVudENvdW50cy5sZW5ndGg7XG4gICAgY29uc3QgZnVuY3Rpb25Ub3RhbCA9IGZ1bmN0aW9uQ291bnRzLmxlbmd0aDtcbiAgICBjb25zdCBicmFuY2hUb3RhbCA9IGJyYW5jaENvdW50cy5sZW5ndGg7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRDb3ZlcmVkID0gc3RhdGVtZW50Q291bnRzLmZpbHRlcihcbiAgICAgIChjb3VudCkgPT4gY291bnQgPiAwXG4gICAgKS5sZW5ndGg7XG4gICAgY29uc3QgZnVuY3Rpb25Db3ZlcmVkID0gZnVuY3Rpb25Db3VudHMuZmlsdGVyKChjb3VudCkgPT4gY291bnQgPiAwKS5sZW5ndGg7XG4gICAgY29uc3QgYnJhbmNoQ292ZXJlZCA9IGJyYW5jaENvdW50cy5maWx0ZXIoKGNvdW50KSA9PiBjb3VudCA+IDApLmxlbmd0aDtcblxuICAgIHRvdGFscy5zdGF0ZW1lbnRzLmNvdmVyZWQgKz0gc3RhdGVtZW50Q292ZXJlZDtcbiAgICB0b3RhbHMuc3RhdGVtZW50cy50b3RhbCArPSBzdGF0ZW1lbnRUb3RhbDtcbiAgICB0b3RhbHMuZnVuY3Rpb25zLmNvdmVyZWQgKz0gZnVuY3Rpb25Db3ZlcmVkO1xuICAgIHRvdGFscy5mdW5jdGlvbnMudG90YWwgKz0gZnVuY3Rpb25Ub3RhbDtcbiAgICB0b3RhbHMuYnJhbmNoZXMuY292ZXJlZCArPSBicmFuY2hDb3ZlcmVkO1xuICAgIHRvdGFscy5icmFuY2hlcy50b3RhbCArPSBicmFuY2hUb3RhbDtcblxuICAgIGNvbnN0IHBjdCA9IChjb3ZlcmVkOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpID0+XG4gICAgICB0b3RhbCA9PT0gMCA/IDEwMCA6IE51bWJlcigoKGNvdmVyZWQgLyB0b3RhbCkgKiAxMDApLnRvRml4ZWQoMikpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgc3RhdGVtZW50czogcGN0KHN0YXRlbWVudENvdmVyZWQsIHN0YXRlbWVudFRvdGFsKSxcbiAgICAgIGZ1bmN0aW9uczogcGN0KGZ1bmN0aW9uQ292ZXJlZCwgZnVuY3Rpb25Ub3RhbCksXG4gICAgICBicmFuY2hlczogcGN0KGJyYW5jaENvdmVyZWQsIGJyYW5jaFRvdGFsKSxcbiAgICB9O1xuICB9KTtcblxuICBjb25zdCBwY3QgPSAoY292ZXJlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSA9PlxuICAgIHRvdGFsID09PSAwID8gMTAwIDogTnVtYmVyKCgoY292ZXJlZCAvIHRvdGFsKSAqIDEwMCkudG9GaXhlZCgyKSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0b3RhbHM6IHtcbiAgICAgIHN0YXRlbWVudHM6IHtcbiAgICAgICAgLi4udG90YWxzLnN0YXRlbWVudHMsXG4gICAgICAgIHBjdDogcGN0KHRvdGFscy5zdGF0ZW1lbnRzLmNvdmVyZWQsIHRvdGFscy5zdGF0ZW1lbnRzLnRvdGFsKSxcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbnM6IHtcbiAgICAgICAgLi4udG90YWxzLmZ1bmN0aW9ucyxcbiAgICAgICAgcGN0OiBwY3QodG90YWxzLmZ1bmN0aW9ucy5jb3ZlcmVkLCB0b3RhbHMuZnVuY3Rpb25zLnRvdGFsKSxcbiAgICAgIH0sXG4gICAgICBicmFuY2hlczoge1xuICAgICAgICAuLi50b3RhbHMuYnJhbmNoZXMsXG4gICAgICAgIHBjdDogcGN0KHRvdGFscy5icmFuY2hlcy5jb3ZlcmVkLCB0b3RhbHMuYnJhbmNoZXMudG90YWwpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGZpbGVzLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQcm9tcHRTZWN0aW9ucyhzZWN0aW9uczogUHJvbXB0U2VjdGlvbltdKSB7XG4gIHJldHVybiBzZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgbmFtZTogc2VjdGlvbi5uYW1lLFxuICAgIHRpdGxlOiBzZWN0aW9uLnRpdGxlLFxuICAgIHRhc2tzOiBwYXJzZVRhc2tMaW5lcyhzZWN0aW9uLmNvbnRlbnQpLFxuICAgIGNvbnRlbnQ6IHNlY3Rpb24uY29udGVudCxcbiAgfSkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUmVwb1Jvb3QoYmFzZVBhdGg6IHN0cmluZykge1xuICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICB0cnkge1xuICAgIHJldHVybiByZXNvbHZlSW5Xb3Jrc3BhY2Uocm9vdCwgYmFzZVBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdvcmtzcGFjZUVycm9yKSB7XG4gICAgICBhd2FpdCB0aHJvd1VzZXJFcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY3VtZW50T2JqZWN0VG9vbDogVG9vbDx1bmRlZmluZWQsIHR5cGVvZiBkb2N1bWVudE9iamVjdFNjaGVtYT4gPVxuICB7XG4gICAgbmFtZTogXCJkb2N1bWVudC1vYmplY3RcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiQ3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBwbGFuIGZvciBhIHNwZWNpZmljIG9iamVjdCB0eXBlIHVzaW5nIC5jb2RleCBwcm9tcHRzIGFuZCByZXBvc2l0b3J5IGFuYWx5c2lzLlwiLFxuICAgIHBhcmFtZXRlcnM6IGRvY3VtZW50T2JqZWN0U2NoZW1hLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIF9jb250ZXh0KTogUHJvbWlzZTxDb250ZW50UmVzdWx0PiA9PiB7XG4gICAgICBjb25zdCBhcmdzID0gZG9jdW1lbnRPYmplY3RTY2hlbWEucGFyc2UoaW5wdXQgYXMgRG9jdW1lbnRPYmplY3RBcmdzKTtcbiAgICAgIGNvbnN0IHJlcG9Sb290ID0gYXdhaXQgcmVzb2x2ZVJlcG9Sb290KGFyZ3MuYmFzZVBhdGgpO1xuXG4gICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBnZXRPYmplY3RQcm9tcHREZXBlbmRlbmNpZXMoKVthcmdzLm9iamVjdFR5cGVdID8/IFtdO1xuICAgICAgaWYgKCFkZXBlbmRlbmNpZXMubGVuZ3RoKSB7XG4gICAgICAgIGF3YWl0IHRocm93VXNlckVycm9yKFxuICAgICAgICAgIGBObyBwcm9tcHQgZ3VpZGFuY2UgY29uZmlndXJlZCBmb3Igb2JqZWN0IHR5cGUgJHthcmdzLm9iamVjdFR5cGV9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWN0aW9ucyA9IG5vcm1hbGl6ZVByb21wdFNlY3Rpb25zKFxuICAgICAgICBjb2xsZWN0UHJvbXB0U2VjdGlvbnMoZGVwZW5kZW5jaWVzKVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc3JjRGlyID0gcGF0aC5qb2luKHJlcG9Sb290LCBcInNyY1wiKTtcbiAgICAgIGNvbnN0IHRlc3REaXIgPSBwYXRoLmpvaW4ocmVwb1Jvb3QsIFwidGVzdHNcIik7XG5cbiAgICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gZnMuZXhpc3RzU3luYyhzcmNEaXIpXG4gICAgICAgID8gbGlzdEZpbGVzUmVjdXJzaXZlKHNyY0RpciwgaXNTb3VyY2VGaWxlKVxuICAgICAgICA6IFtdO1xuICAgICAgY29uc3QgdGVzdEZpbGVzID0gZnMuZXhpc3RzU3luYyh0ZXN0RGlyKVxuICAgICAgICA/IGxpc3RGaWxlc1JlY3Vyc2l2ZShcbiAgICAgICAgICAgIHRlc3REaXIsXG4gICAgICAgICAgICAoZmlsZSkgPT4gaXNTb3VyY2VGaWxlKGZpbGUpICYmIGlzVGVzdEZpbGUoZmlsZSlcbiAgICAgICAgICApXG4gICAgICAgIDogW107XG5cbiAgICAgIGxldCB0YXJnZXRGaWxlQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGFyZ3MudGFyZ2V0RmlsZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFic29sdXRlID0gcmVzb2x2ZUluV29ya3NwYWNlKHJlcG9Sb290LCBhcmdzLnRhcmdldEZpbGUpO1xuICAgICAgICAgIHRhcmdldEZpbGVDb250ZW50ID0gcmVhZEZpbGVTYWZlKGFic29sdXRlKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV29ya3NwYWNlRXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHRocm93VXNlckVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICBiYXNlUGF0aDogcGF0aC5yZWxhdGl2ZShnZXRXb3Jrc3BhY2VSb290KCksIHJlcG9Sb290KSB8fCBcIi5cIixcbiAgICAgICAgb2JqZWN0VHlwZTogYXJncy5vYmplY3RUeXBlLFxuICAgICAgICB0YXJnZXRGaWxlOiBhcmdzLnRhcmdldEZpbGUsXG4gICAgICAgIGd1aWRhbmNlOiBzZWN0aW9ucyxcbiAgICAgICAgZmlsZXM6IHtcbiAgICAgICAgICBzb3VyY2U6IHJlbGF0aXZlRmlsZXMocmVwb1Jvb3QsIHNvdXJjZUZpbGVzKSxcbiAgICAgICAgICB0ZXN0czogcmVsYXRpdmVGaWxlcyhyZXBvUm9vdCwgdGVzdEZpbGVzKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGFyZ2V0RmlsZUNvbnRlbnQ6IGFyZ3MuaW5jbHVkZUNvbnRlbnQgPyB0YXJnZXRGaWxlQ29udGVudCA6IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIG51bGwsIDIpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9IHNhdGlzZmllcyBDb250ZW50UmVzdWx0O1xuICAgIH0sXG4gIH07XG5cbmV4cG9ydCBjb25zdCBjb3ZlcmFnZUVuZm9yY2VyVG9vbDogVG9vbDx1bmRlZmluZWQsIHR5cGVvZiBjb3ZlcmFnZVRhc2tTY2hlbWE+ID1cbiAge1xuICAgIG5hbWU6IFwiZW5zdXJlLXRlc3QtY292ZXJhZ2VcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiUnVuIHRoZSBjb25maWd1cmVkIGNvdmVyYWdlIGNvbW1hbmQgYW5kIHJlcG9ydCB3aGV0aGVyIHRoZSB0YXJnZXQgcGVyY2VudGFnZSBpcyBtZXQsIGhpZ2hsaWdodGluZyB3ZWFrIGZpbGVzLlwiLFxuICAgIHBhcmFtZXRlcnM6IGNvdmVyYWdlVGFza1NjaGVtYSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBfY29udGV4dCk6IFByb21pc2U8Q29udGVudFJlc3VsdD4gPT4ge1xuICAgICAgY29uc3QgYXJncyA9IGNvdmVyYWdlVGFza1NjaGVtYS5wYXJzZShpbnB1dCBhcyBDb3ZlcmFnZVRhc2tBcmdzKTtcbiAgICAgIGNvbnN0IHJlcG9Sb290ID0gYXdhaXQgcmVzb2x2ZVJlcG9Sb290KGFyZ3MuYmFzZVBhdGgpO1xuXG4gICAgICBpZiAoIWFyZ3MuZHJ5UnVuKSB7XG4gICAgICAgIGNvbnN0IGVudiA9IHtcbiAgICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgICBVU0VfV0FUQ0hNQU46IFwiZmFsc2VcIixcbiAgICAgICAgICBXQVRDSE1BTl9ESVNBQkxFOiBcIjFcIixcbiAgICAgICAgICBKRVNUX0RJU0FCTEVfV0FUQ0hNQU46IFwiMVwiLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzcGF3blN5bmMoXG4gICAgICAgICAgXCJucG1cIixcbiAgICAgICAgICBbXCJydW5cIiwgXCJjb3ZlcmFnZVwiLCBcIi0tXCIsIFwiLS13YXRjaG1hbj1mYWxzZVwiLCBcIi0tcnVuSW5CYW5kXCJdLFxuICAgICAgICAgIHsgY3dkOiByZXBvUm9vdCwgZW52LCBlbmNvZGluZzogXCJ1dGY4XCIgfVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgICByZXN1bHQuc3RkZXJyIHx8IHJlc3VsdC5zdGRvdXQgfHwgXCJDb3ZlcmFnZSBjb21tYW5kIGZhaWxlZFwiO1xuICAgICAgICAgIGF3YWl0IHRocm93VXNlckVycm9yKG1lc3NhZ2UudHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb3ZlcmFnZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIHJlcG9Sb290LFxuICAgICAgICBcIndvcmtkb2NzXCIsXG4gICAgICAgIFwicmVwb3J0c1wiLFxuICAgICAgICBcImNvdmVyYWdlXCIsXG4gICAgICAgIFwiY292ZXJhZ2UtZmluYWwuanNvblwiXG4gICAgICApO1xuXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY292ZXJhZ2VQYXRoKSkge1xuICAgICAgICBhd2FpdCB0aHJvd1VzZXJFcnJvcihcbiAgICAgICAgICBgQ292ZXJhZ2UgcmVwb3J0IG5vdCBmb3VuZCBhdCAke3BhdGgucmVsYXRpdmUocmVwb1Jvb3QsIGNvdmVyYWdlUGF0aCl9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdW1tYXJ5ID0gY29tcHV0ZUNvdmVyYWdlRnJvbUZpbmFsKGNvdmVyYWdlUGF0aCk7XG4gICAgICBjb25zdCBtZWV0c1RocmVzaG9sZCA9XG4gICAgICAgIHN1bW1hcnkudG90YWxzLnN0YXRlbWVudHMucGN0ID49IGFyZ3MuY292ZXJhZ2UgJiZcbiAgICAgICAgc3VtbWFyeS50b3RhbHMuZnVuY3Rpb25zLnBjdCA+PSBhcmdzLmNvdmVyYWdlICYmXG4gICAgICAgIHN1bW1hcnkudG90YWxzLmJyYW5jaGVzLnBjdCA+PSBhcmdzLmNvdmVyYWdlO1xuXG4gICAgICBjb25zdCB3ZWFrZXN0ID0gWy4uLnN1bW1hcnkuZmlsZXNdXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnN0YXRlbWVudHMgLSBiLnN0YXRlbWVudHMpXG4gICAgICAgIC5zbGljZSgwLCAxMCk7XG5cbiAgICAgIGNvbnN0IGd1aWRhbmNlID0gbm9ybWFsaXplUHJvbXB0U2VjdGlvbnMoXG4gICAgICAgIGNvbGxlY3RQcm9tcHRTZWN0aW9ucyhbXCJidWxrLXRlc3RzXCJdKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgYmFzZVBhdGg6IHBhdGgucmVsYXRpdmUoZ2V0V29ya3NwYWNlUm9vdCgpLCByZXBvUm9vdCkgfHwgXCIuXCIsXG4gICAgICAgIHRhcmdldDogYXJncy5jb3ZlcmFnZSxcbiAgICAgICAgbWVldHNUaHJlc2hvbGQsXG4gICAgICAgIHRvdGFsczogc3VtbWFyeS50b3RhbHMsXG4gICAgICAgIHdlYWtlc3QsXG4gICAgICAgIGd1aWRhbmNlLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgbnVsbCwgMiksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0gc2F0aXNmaWVzIENvbnRlbnRSZXN1bHQ7XG4gICAgfSxcbiAgfTtcblxuZXhwb3J0IGNvbnN0IHJlYWRtZUltcHJvdmVtZW50VG9vbDogVG9vbDxcbiAgdW5kZWZpbmVkLFxuICB0eXBlb2YgcmVhZG1lSW1wcm92ZW1lbnRTY2hlbWFcbj4gPSB7XG4gIG5hbWU6IFwiaW1wcm92ZS1yZWFkbWVcIixcbiAgZGVzY3JpcHRpb246XG4gICAgXCJTdW1tYXJpemUgcmVxdWlyZWQgc3RlcHMgdG8gcmVmcmVzaCBSRUFETUUgYW5kIHdvcmtkb2NzIGNvbnRlbnQgdXNpbmcgLmNvZGV4IGd1aWRhbmNlIGFuZCByZXBvc2l0b3J5IGFuYWx5c2lzLlwiLFxuICBwYXJhbWV0ZXJzOiByZWFkbWVJbXByb3ZlbWVudFNjaGVtYSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIF9jb250ZXh0KTogUHJvbWlzZTxDb250ZW50UmVzdWx0PiA9PiB7XG4gICAgY29uc3QgYXJncyA9IHJlYWRtZUltcHJvdmVtZW50U2NoZW1hLnBhcnNlKGlucHV0IGFzIFJlYWRtZUltcHJvdmVtZW50QXJncyk7XG4gICAgY29uc3QgcmVwb1Jvb3QgPSBhd2FpdCByZXNvbHZlUmVwb1Jvb3QoYXJncy5iYXNlUGF0aCk7XG5cbiAgICBjb25zdCBhbmFseXNpcyA9IGFuYWx5emVSZXBvKHJlcG9Sb290KTtcbiAgICBjb25zdCBtb2R1bGVzID0gYW5hbHlzaXMuZmlsZXNcbiAgICAgIC5maWx0ZXIoKGZpbGUpID0+IC9pbmRleFxcLnRzJC8udGVzdChmaWxlKSlcbiAgICAgIC5tYXAoKGZpbGUpID0+IHBhdGgucmVsYXRpdmUocmVwb1Jvb3QsIGZpbGUpKTtcblxuICAgIGNvbnN0IHByb21wdFNlY3Rpb25zID0gbm9ybWFsaXplUHJvbXB0U2VjdGlvbnMoXG4gICAgICBjb2xsZWN0UHJvbXB0U2VjdGlvbnMoW1widXBkYXRlLXJlYWRtZVwiLCBcImRvY1wiLCBcIm1vZHVsZVwiXSlcbiAgICApO1xuXG4gICAgY29uc3QgdGVzdEV4YW1wbGVzID0gT2JqZWN0LmtleXMoYW5hbHlzaXMudGVzdHMgPz8ge30pO1xuICAgIGNvbnN0IGV4YW1wbGVzID0gYXJncy5pbmNsdWRlRXhhbXBsZXMgPyB0ZXN0RXhhbXBsZXMuc2xpY2UoMCwgMjApIDogW107XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgYmFzZVBhdGg6IHBhdGgucmVsYXRpdmUoZ2V0V29ya3NwYWNlUm9vdCgpLCByZXBvUm9vdCkgfHwgXCIuXCIsXG4gICAgICBzdW1tYXJ5OiB7XG4gICAgICAgIG1vZHVsZXMsXG4gICAgICAgIHRvdGFsU291cmNlRmlsZXM6IGFuYWx5c2lzLmZpbGVzLmxlbmd0aCxcbiAgICAgICAgdG90YWxUZXN0RmlsZXM6IGFuYWx5c2lzLnRlc3RGaWxlcy5sZW5ndGgsXG4gICAgICAgIGhhc1JlYWRtZTogQm9vbGVhbihhbmFseXNpcy5yZWFkbWUpLFxuICAgICAgfSxcbiAgICAgIGd1aWRhbmNlOiBwcm9tcHRTZWN0aW9ucyxcbiAgICAgIHN1Z2dlc3RlZEV4YW1wbGVzOiBleGFtcGxlcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIG51bGwsIDIpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9IHNhdGlzZmllcyBDb250ZW50UmVzdWx0O1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCB0eXBlIERlY29yYXRvclNwZWMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgYXJncz86IHVua25vd25bXTtcbn07XG5cbmV4cG9ydCB0eXBlIEF0dHJpYnV0ZVNwZWMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBkZWNvcmF0b3JzPzogRGVjb3JhdG9yU3BlY1tdO1xufTtcblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGVjb3JhdG9yKHNwZWM6IERlY29yYXRvclNwZWMpOiBzdHJpbmcge1xuICBjb25zdCBhcmdzID0gKHNwZWMuYXJncyB8fCBbXSkubWFwKChhcmcpID0+IEpTT04uc3RyaW5naWZ5KGFyZykpLmpvaW4oXCIsIFwiKTtcbiAgcmV0dXJuIGBAJHtzcGVjLm5hbWV9KCR7YXJnc30pYDtcbn1cblxuZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RGVjb3JhdG9yTmFtZXMoXG4gIGNsYXNzRGVjb3JhdG9yczogRGVjb3JhdG9yU3BlY1tdIHwgdW5kZWZpbmVkLFxuICBwcm9wZXJ0aWVzOiBBdHRyaWJ1dGVTcGVjW10gfCB1bmRlZmluZWRcbikge1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBuYW1lcy5hZGQoXCJtb2RlbFwiKTtcbiAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgY2xhc3NEZWNvcmF0b3JzIHx8IFtdKSB7XG4gICAgbmFtZXMuYWRkKGRlY29yYXRvci5uYW1lKTtcbiAgfVxuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMgfHwgW10pIHtcbiAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBwcm9wZXJ0eS5kZWNvcmF0b3JzIHx8IFtdKSB7XG4gICAgICBuYW1lcy5hZGQoZGVjb3JhdG9yLm5hbWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmFtZXM7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZUltcG9ydChcbiAgY29udGVudDogc3RyaW5nLFxuICBpbXBvcnRzRnJvbTogc3RyaW5nLFxuICBkZWNvcmF0b3JzOiBTZXQ8c3RyaW5nPlxuKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICghZGVjb3JhdG9ycy5zaXplKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgaW1wb3J0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgIGBpbXBvcnRcXFxccytcXFxceyhbXn1dKylcXFxcfVxcXFxzK2Zyb21cXFxccytbXCInXSR7ZXNjYXBlUmVnRXhwKGltcG9ydHNGcm9tKX1bXCInXTtgXG4gICk7XG4gIGNvbnN0IG1hdGNoID0gY29udGVudC5tYXRjaChpbXBvcnRSZWdleCk7XG4gIGNvbnN0IHNvcnRlZCA9IEFycmF5LmZyb20oZGVjb3JhdG9ycykuc29ydCgpO1xuXG4gIGlmIChtYXRjaCkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gbWF0Y2hbMV1cbiAgICAgIC5zcGxpdChcIixcIilcbiAgICAgIC5tYXAoKG5hbWUpID0+IG5hbWUudHJpbSgpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBtZXJnZWQgPSBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmV4aXN0aW5nLCAuLi5zb3J0ZWRdKSkuc29ydCgpO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UoXG4gICAgICBpbXBvcnRSZWdleCxcbiAgICAgIGBpbXBvcnQgeyAke21lcmdlZC5qb2luKFwiLCBcIil9IH0gZnJvbSBcIiR7aW1wb3J0c0Zyb219XCI7YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBpbXBvcnRMaW5lID0gYGltcG9ydCB7ICR7c29ydGVkLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiJHtpbXBvcnRzRnJvbX1cIjtgO1xuICByZXR1cm4gYCR7aW1wb3J0TGluZX1cXG5cXG4ke2NvbnRlbnR9YDtcbn1cblxuZnVuY3Rpb24gYWRkUHJvcGVydHlCbG9jayhwcm9wZXJ0eTogQXR0cmlidXRlU3BlYykge1xuICBjb25zdCBkZWNvcmF0b3JzID0gKHByb3BlcnR5LmRlY29yYXRvcnMgfHwgW10pXG4gICAgLm1hcChmb3JtYXREZWNvcmF0b3IpXG4gICAgLmpvaW4oXCJcXG4gIFwiKTtcbiAgY29uc3QgZGVjb3JhdG9yQmxvY2sgPSBkZWNvcmF0b3JzID8gYCAgJHtkZWNvcmF0b3JzfVxcbmAgOiBcIlwiO1xuICByZXR1cm4gYCR7ZGVjb3JhdG9yQmxvY2t9ICAke3Byb3BlcnR5Lm5hbWV9OiAke3Byb3BlcnR5LnR5cGV9O2A7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVByb3BlcnR5QmxvY2soY29udGVudDogc3RyaW5nLCBwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgIGlmIChcbiAgICAgIGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoYEBgKSAmJlxuICAgICAgbGluZXNbaSArIDFdPy5pbmNsdWRlcyhgJHtwcm9wZXJ0eU5hbWV9OmApXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGxpbmUuaW5jbHVkZXMoYCR7cHJvcGVydHlOYW1lfTpgKSkge1xuICAgICAgLy8gc2tpcCB0aGlzIGxpbmUgYW5kIGFueSB0cmFpbGluZyBibGFuayBsaW5lXG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmVzdWx0LnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiBpbnNlcnREZWNvcmF0b3IoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgZGVjb3JhdG9yOiBEZWNvcmF0b3JTcGVjLFxuICB0YXJnZXQ6IHtcbiAgICBraW5kOiBcImNsYXNzXCIgfCBcInByb3BlcnR5XCI7XG4gICAgbmFtZT86IHN0cmluZztcbiAgfVxuKSB7XG4gIGNvbnN0IGRlY29yYXRvckxpbmUgPSBmb3JtYXREZWNvcmF0b3IoZGVjb3JhdG9yKTtcbiAgaWYgKHRhcmdldC5raW5kID09PSBcImNsYXNzXCIpIHtcbiAgICBjb25zdCBjbGFzc1JlZ2V4ID0gLyhleHBvcnRcXHMrY2xhc3NcXHMrW15cXHN7XStcXHMqXFx7KS87XG4gICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoZGVjb3JhdG9yTGluZSkpIHJldHVybiBjb250ZW50O1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UoY2xhc3NSZWdleCwgYCR7ZGVjb3JhdG9yTGluZX1cXG4kMWApO1xuICB9XG4gIGlmICghdGFyZ2V0Lm5hbWUpIHJldHVybiBjb250ZW50O1xuICBjb25zdCBwcm9wZXJ0eVJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBgKF5cXFxccyopKD86QC4qXFxcXG5cXFxcMSkqJHtlc2NhcGVSZWdFeHAodGFyZ2V0Lm5hbWUpfTpgLFxuICAgIFwibVwiXG4gICk7XG4gIGNvbnN0IG1hdGNoID0gcHJvcGVydHlSZWdleC5leGVjKGNvbnRlbnQpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgaW5kZW50ID0gbWF0Y2hbMV0gfHwgXCIgIFwiO1xuICBpZiAoY29udGVudC5pbmNsdWRlcyhgJHtpbmRlbnR9JHtkZWNvcmF0b3JMaW5lfWApKSByZXR1cm4gY29udGVudDtcbiAgcmV0dXJuIChcbiAgICBjb250ZW50LnNsaWNlKDAsIG1hdGNoLmluZGV4KSArXG4gICAgYCR7aW5kZW50fSR7ZGVjb3JhdG9yTGluZX1cXG5gICtcbiAgICBjb250ZW50LnNsaWNlKG1hdGNoLmluZGV4KVxuICApO1xufVxuXG5mdW5jdGlvbiByZW1vdmVEZWNvcmF0b3IoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgZGVjb3JhdG9yTmFtZTogc3RyaW5nLFxuICB0YXJnZXQ6IHtcbiAgICBraW5kOiBcImNsYXNzXCIgfCBcInByb3BlcnR5XCI7XG4gICAgbmFtZT86IHN0cmluZztcbiAgfVxuKSB7XG4gIGNvbnN0IGRlY29yYXRvclJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBgXlxcXFxzKkAke2VzY2FwZVJlZ0V4cChkZWNvcmF0b3JOYW1lKX1cXFxcKFteKV0qXFxcXClgLFxuICAgIFwibVwiXG4gICk7XG4gIGlmICh0YXJnZXQua2luZCA9PT0gXCJjbGFzc1wiKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShkZWNvcmF0b3JSZWdleCwgXCJcIik7XG4gIH1cbiAgaWYgKHRhcmdldC5uYW1lKSB7XG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoXG4gICAgICBgKF5cXFxccypAJHtlc2NhcGVSZWdFeHAoZGVjb3JhdG9yTmFtZSl9XFxcXChbXildKlxcXFwpXFxcXHMqJFxcXFxuKSg/PVxcXFxzKiR7ZXNjYXBlUmVnRXhwKHRhcmdldC5uYW1lKX06KWAsXG4gICAgICBcIm1cIlxuICAgICk7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCBcIlwiKTtcbiAgfVxuICByZXR1cm4gY29udGVudDtcbn1cblxuZnVuY3Rpb24gd3JpdGVJZkNoYW5nZWQoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKSB7XG4gIGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aCk7XG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGNvbnRlbnQpO1xufVxuXG5leHBvcnQgY29uc3QgZGVjb3JhdG9yVG9vbHMgPSB7XG4gIGNyZWF0ZU9yVXBkYXRlTW9kZWxUb29sOiB7XG4gICAgbmFtZTogXCJjcmVhdGUtb3ItdXBkYXRlLW1vZGVsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQ3JlYXRlIG9yIHVwZGF0ZSBhIHZhbGlkYXRpb24tcmVhZHkgbW9kZWwgY2xhc3NcIixcbiAgICBleGVjdXRlOiBhc3luYyAoYXJnczoge1xuICAgICAgZmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGNsYXNzTmFtZTogc3RyaW5nO1xuICAgICAgY2xhc3NEZWNvcmF0b3JzPzogRGVjb3JhdG9yU3BlY1tdO1xuICAgICAgcHJvcGVydGllczogQXR0cmlidXRlU3BlY1tdO1xuICAgICAgaW1wb3J0c0Zyb206IHN0cmluZztcbiAgICAgIG92ZXJ3cml0ZT86IGJvb2xlYW47XG4gICAgfSkgPT4ge1xuICAgICAgaWYgKCFhcmdzLm92ZXJ3cml0ZSAmJiBmcy5leGlzdHNTeW5jKGFyZ3MuZmlsZVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBhbHJlYWR5IGV4aXN0cyBhdCAke2FyZ3MuZmlsZVBhdGh9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gY29sbGVjdERlY29yYXRvck5hbWVzKFxuICAgICAgICBhcmdzLmNsYXNzRGVjb3JhdG9ycyxcbiAgICAgICAgYXJncy5wcm9wZXJ0aWVzXG4gICAgICApO1xuICAgICAgbGV0IGNvbnRlbnQgPSBgQG1vZGVsKClgO1xuICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgYXJncy5jbGFzc0RlY29yYXRvcnMgfHwgW10pIHtcbiAgICAgICAgY29udGVudCArPSBgXFxuJHtmb3JtYXREZWNvcmF0b3IoZGVjb3JhdG9yKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IChhcmdzLnByb3BlcnRpZXMgfHwgW10pXG4gICAgICAgIC5tYXAoYWRkUHJvcGVydHlCbG9jaylcbiAgICAgICAgLmpvaW4oXCJcXG5cXG5cIik7XG4gICAgICBjb250ZW50ICs9IGBcXG5leHBvcnQgY2xhc3MgJHthcmdzLmNsYXNzTmFtZX0ge1xcbiR7cHJvcGVydGllcyA/IGAke3Byb3BlcnRpZXN9XFxuYCA6IFwiXCJ9fVxcbmA7XG4gICAgICBjb250ZW50ID0gZW5zdXJlSW1wb3J0KGNvbnRlbnQsIGFyZ3MuaW1wb3J0c0Zyb20sIGRlY29yYXRvcnMpO1xuICAgICAgd3JpdGVJZkNoYW5nZWQoYXJncy5maWxlUGF0aCwgY29udGVudCk7XG4gICAgICByZXR1cm4geyBmaWxlUGF0aDogYXJncy5maWxlUGF0aCB9O1xuICAgIH0sXG4gIH0sXG4gIGFkZEF0dHJpYnV0ZVRvb2w6IHtcbiAgICBuYW1lOiBcImFkZC1hdHRyaWJ1dGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBZGQgYSBkZWNvcmF0ZWQgYXR0cmlidXRlIHRvIGFuIGV4aXN0aW5nIG1vZGVsXCIsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3M6IHtcbiAgICAgIGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBjbGFzc05hbWU6IHN0cmluZztcbiAgICAgIGF0dHJpYnV0ZTogQXR0cmlidXRlU3BlYztcbiAgICAgIGltcG9ydHNGcm9tOiBzdHJpbmc7XG4gICAgfSkgPT4ge1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGFyZ3MuZmlsZVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgZmlsZSBub3QgZm91bmQgYXQgJHthcmdzLmZpbGVQYXRofWApO1xuICAgICAgfVxuICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoYXJncy5maWxlUGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoYCR7YXJncy5hdHRyaWJ1dGUubmFtZX06YCkpIHtcbiAgICAgICAgcmV0dXJuIHsgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGggfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBjb2xsZWN0RGVjb3JhdG9yTmFtZXModW5kZWZpbmVkLCBbYXJncy5hdHRyaWJ1dGVdKTtcbiAgICAgIGNvbnRlbnQgPSBlbnN1cmVJbXBvcnQoY29udGVudCwgYXJncy5pbXBvcnRzRnJvbSwgZGVjb3JhdG9ycyk7XG4gICAgICBjb25zdCBpbnNlcnRpb25Qb2ludCA9IGNvbnRlbnQubGFzdEluZGV4T2YoXCJ9XCIpO1xuICAgICAgY29uc3QgYmxvY2sgPSBhZGRQcm9wZXJ0eUJsb2NrKGFyZ3MuYXR0cmlidXRlKTtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IGNvbnRlbnQuc2xpY2UoMCwgaW5zZXJ0aW9uUG9pbnQpLnJlcGxhY2UoL1xccyokLywgXCJcIik7XG4gICAgICBjb25zdCBhZnRlciA9IGNvbnRlbnQuc2xpY2UoaW5zZXJ0aW9uUG9pbnQpO1xuICAgICAgY29uc3QgdXBkYXRlZCA9IGAke2JlZm9yZX1cXG4ke2Jsb2NrfVxcbiR7YWZ0ZXJ9YDtcbiAgICAgIHdyaXRlSWZDaGFuZ2VkKGFyZ3MuZmlsZVBhdGgsIHVwZGF0ZWQpO1xuICAgICAgcmV0dXJuIHsgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGggfTtcbiAgICB9LFxuICB9LFxuICByZW1vdmVBdHRyaWJ1dGVUb29sOiB7XG4gICAgbmFtZTogXCJyZW1vdmUtYXR0cmlidXRlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiUmVtb3ZlIGFuIGF0dHJpYnV0ZSBmcm9tIGEgbW9kZWwgY2xhc3NcIixcbiAgICBleGVjdXRlOiBhc3luYyAoYXJnczoge1xuICAgICAgZmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGNsYXNzTmFtZTogc3RyaW5nO1xuICAgICAgYXR0cmlidXRlTmFtZTogc3RyaW5nO1xuICAgIH0pID0+IHtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhhcmdzLmZpbGVQYXRoKSkgcmV0dXJuIHsgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGggfTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoYXJncy5maWxlUGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgY29uc3QgdXBkYXRlZCA9IHJlbW92ZVByb3BlcnR5QmxvY2soY29udGVudCwgYXJncy5hdHRyaWJ1dGVOYW1lKTtcbiAgICAgIHdyaXRlSWZDaGFuZ2VkKGFyZ3MuZmlsZVBhdGgsIHVwZGF0ZWQpO1xuICAgICAgcmV0dXJuIHsgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGggfTtcbiAgICB9LFxuICB9LFxuICBhcHBseURlY29yYXRvclRvb2w6IHtcbiAgICBuYW1lOiBcImFwcGx5LWRlY29yYXRvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFwcGx5IGEgZGVjb3JhdG9yIHRvIGEgY2xhc3Mgb3IgcHJvcGVydHlcIixcbiAgICBleGVjdXRlOiBhc3luYyAoYXJnczoge1xuICAgICAgZmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGNsYXNzTmFtZTogc3RyaW5nO1xuICAgICAgdGFyZ2V0OiB7IGtpbmQ6IFwiY2xhc3NcIiB8IFwicHJvcGVydHlcIjsgbmFtZT86IHN0cmluZyB9O1xuICAgICAgZGVjb3JhdG9yOiBEZWNvcmF0b3JTcGVjO1xuICAgICAgaW1wb3J0c0Zyb206IHN0cmluZztcbiAgICB9KSA9PiB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYXJncy5maWxlUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCBmaWxlIG5vdCBmb3VuZCBhdCAke2FyZ3MuZmlsZVBhdGh9YCk7XG4gICAgICB9XG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhhcmdzLmZpbGVQYXRoLCBcInV0ZjhcIik7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gbmV3IFNldDxzdHJpbmc+KFthcmdzLmRlY29yYXRvci5uYW1lXSk7XG4gICAgICBjb250ZW50ID0gZW5zdXJlSW1wb3J0KGNvbnRlbnQsIGFyZ3MuaW1wb3J0c0Zyb20sIGRlY29yYXRvcnMpO1xuICAgICAgY29udGVudCA9IGluc2VydERlY29yYXRvcihjb250ZW50LCBhcmdzLmRlY29yYXRvciwgYXJncy50YXJnZXQpO1xuICAgICAgd3JpdGVJZkNoYW5nZWQoYXJncy5maWxlUGF0aCwgY29udGVudCk7XG4gICAgICByZXR1cm4geyBmaWxlUGF0aDogYXJncy5maWxlUGF0aCB9O1xuICAgIH0sXG4gIH0sXG4gIHJlbW92ZURlY29yYXRvclRvb2w6IHtcbiAgICBuYW1lOiBcInJlbW92ZS1kZWNvcmF0b3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJSZW1vdmUgYSBkZWNvcmF0b3IgZnJvbSBhIGNsYXNzIG9yIHByb3BlcnR5XCIsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3M6IHtcbiAgICAgIGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBjbGFzc05hbWU6IHN0cmluZztcbiAgICAgIHRhcmdldDogeyBraW5kOiBcImNsYXNzXCIgfCBcInByb3BlcnR5XCI7IG5hbWU/OiBzdHJpbmcgfTtcbiAgICAgIGRlY29yYXRvck5hbWU6IHN0cmluZztcbiAgICB9KSA9PiB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYXJncy5maWxlUGF0aCkpIHJldHVybiB7IGZpbGVQYXRoOiBhcmdzLmZpbGVQYXRoIH07XG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhhcmdzLmZpbGVQYXRoLCBcInV0ZjhcIik7XG4gICAgICBjb250ZW50ID0gcmVtb3ZlRGVjb3JhdG9yKGNvbnRlbnQsIGFyZ3MuZGVjb3JhdG9yTmFtZSwgYXJncy50YXJnZXQpO1xuICAgICAgd3JpdGVJZkNoYW5nZWQoYXJncy5maWxlUGF0aCwgY29udGVudCk7XG4gICAgICByZXR1cm4geyBmaWxlUGF0aDogYXJncy5maWxlUGF0aCB9O1xuICAgIH0sXG4gIH0sXG4gIHNjYWZmb2xkVmFsaWRhdG9yVG9vbDoge1xuICAgIG5hbWU6IFwic2NhZmZvbGQtdmFsaWRhdG9yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2NhZmZvbGQgYSB2YWxpZGF0b3IgY2xhc3MgYW5kIG9wdGlvbmFsIGRlY29yYXRvclwiLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzOiB7XG4gICAgICB2YWxpZGF0b3JzRGlyOiBzdHJpbmc7XG4gICAgICBkZWNvcmF0b3JEaXI/OiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgfSkgPT4ge1xuICAgICAgY29uc3QgY2xhc3NGaWxlID0gcGF0aC5qb2luKGFyZ3MudmFsaWRhdG9yc0RpciwgYCR7YXJncy5uYW1lfS50c2ApO1xuICAgICAgZW5zdXJlRGlyZWN0b3J5KGNsYXNzRmlsZSk7XG4gICAgICBjb25zdCBjbGFzc0NvbnRlbnQgPSBgZXhwb3J0IGNsYXNzICR7YXJncy5uYW1lfSB7XFxuICB2YWxpZGF0ZSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xcbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZDtcXG4gIH1cXG59XFxuYDtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY2xhc3NGaWxlLCBjbGFzc0NvbnRlbnQpO1xuICAgICAgbGV0IGRlY29yYXRvckZpbGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChhcmdzLmRlY29yYXRvckRpcikge1xuICAgICAgICBkZWNvcmF0b3JGaWxlID0gcGF0aC5qb2luKFxuICAgICAgICAgIGFyZ3MuZGVjb3JhdG9yRGlyLFxuICAgICAgICAgIGAke2FyZ3MubmFtZX1EZWNvcmF0b3IudHNgXG4gICAgICAgICk7XG4gICAgICAgIGVuc3VyZURpcmVjdG9yeShkZWNvcmF0b3JGaWxlKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICBkZWNvcmF0b3JGaWxlLFxuICAgICAgICAgIGBleHBvcnQgZnVuY3Rpb24gJHthcmdzLm5hbWV9RGVjb3JhdG9yKCkge1xcbiAgcmV0dXJuICgpID0+IHZvaWQgMDtcXG59XFxuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NGaWxlLCBkZWNvcmF0b3JGaWxlIH07XG4gICAgfSxcbiAgfSxcbiAgc2NhZmZvbGRTZXJpYWxpemVyVG9vbDoge1xuICAgIG5hbWU6IFwic2NhZmZvbGQtc2VyaWFsaXplclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNjYWZmb2xkIGEgc2VyaWFsaXplciBjbGFzcyBhbmQgb3B0aW9uYWwgcmVnaXN0cnlcIixcbiAgICBleGVjdXRlOiBhc3luYyAoYXJnczoge1xuICAgICAgZGlyOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICByZWdpc3RlckRpcj86IHN0cmluZztcbiAgICAgIHNldERlZmF1bHQ/OiBib29sZWFuO1xuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzRmlsZSA9IHBhdGguam9pbihhcmdzLmRpciwgYCR7YXJncy5uYW1lfS50c2ApO1xuICAgICAgZW5zdXJlRGlyZWN0b3J5KGNsYXNzRmlsZSk7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBjbGFzc0ZpbGUsXG4gICAgICAgIGBleHBvcnQgY2xhc3MgJHthcmdzLm5hbWV9IHtcXG4gIHNlcmlhbGl6ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XFxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XFxuICB9XFxufVxcbmBcbiAgICAgICk7XG4gICAgICBsZXQgcmVnaXN0ZXJGaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYXJncy5yZWdpc3RlckRpcikge1xuICAgICAgICByZWdpc3RlckZpbGUgPSBwYXRoLmpvaW4oYXJncy5yZWdpc3RlckRpciwgYCR7YXJncy5uYW1lfVJlZ2lzdGVyLnRzYCk7XG4gICAgICAgIGVuc3VyZURpcmVjdG9yeShyZWdpc3RlckZpbGUpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgIHJlZ2lzdGVyRmlsZSxcbiAgICAgICAgICBgZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyJHthcmdzLm5hbWV9KCkge1xcbiAgcmV0dXJuICR7YXJncy5zZXREZWZhdWx0ID8gXCInZGVmYXVsdCdcIiA6IFwiJ29wdGlvbmFsJ1wifTtcXG59XFxuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NGaWxlLCByZWdpc3RlckZpbGUgfTtcbiAgICB9LFxuICB9LFxuICBzY2FmZm9sZEhhc2hpbmdUb29sOiB7XG4gICAgbmFtZTogXCJzY2FmZm9sZC1oYXNoaW5nXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2NhZmZvbGQgYSBoYXNoaW5nIGZ1bmN0aW9uIGFuZCBvcHRpb25hbCByZWdpc3RyeVwiLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzOiB7XG4gICAgICBkaXI6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIHJlZ2lzdGVyRGlyPzogc3RyaW5nO1xuICAgICAgc2V0RGVmYXVsdD86IGJvb2xlYW47XG4gICAgfSkgPT4ge1xuICAgICAgY29uc3QgZnVuY3Rpb25GaWxlID0gcGF0aC5qb2luKGFyZ3MuZGlyLCBgJHthcmdzLm5hbWV9LnRzYCk7XG4gICAgICBlbnN1cmVEaXJlY3RvcnkoZnVuY3Rpb25GaWxlKTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgIGZ1bmN0aW9uRmlsZSxcbiAgICAgICAgYGV4cG9ydCBmdW5jdGlvbiAke2FyZ3MubmFtZX0odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XFxuICByZXR1cm4gdmFsdWUuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKTtcXG59XFxuYFxuICAgICAgKTtcbiAgICAgIGxldCByZWdpc3RlckZpbGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChhcmdzLnJlZ2lzdGVyRGlyKSB7XG4gICAgICAgIHJlZ2lzdGVyRmlsZSA9IHBhdGguam9pbihhcmdzLnJlZ2lzdGVyRGlyLCBgJHthcmdzLm5hbWV9UmVnaXN0ZXIudHNgKTtcbiAgICAgICAgZW5zdXJlRGlyZWN0b3J5KHJlZ2lzdGVyRmlsZSk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgcmVnaXN0ZXJGaWxlLFxuICAgICAgICAgIGBleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXIke2FyZ3MubmFtZX0oKSB7XFxuICByZXR1cm4gJHthcmdzLnNldERlZmF1bHQgPyBcIidkZWZhdWx0J1wiIDogXCInb3B0aW9uYWwnXCJ9O1xcbn1cXG5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBmdW5jdGlvbkZpbGUsIHJlZ2lzdGVyRmlsZSB9O1xuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JUb29scyA9IHR5cGVvZiBkZWNvcmF0b3JUb29scztcbiIsImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBDb250ZW50UmVzdWx0LCBUb29sIH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7IGFwcGx5UGF0Y2gsIGNyZWF0ZVR3b0ZpbGVzUGF0Y2ggfSBmcm9tIFwiZGlmZlwiO1xuaW1wb3J0IHtcbiAgYW5hbHl6ZVJlcG9TY2hlbWEsXG4gIGNvZGVDaGFuZ2VTY2hlbWEsXG4gIGRvY3VtZW50Q29kZVNjaGVtYSxcbiAgZW51bWVyYXRlQ2FwYWJpbGl0aWVzU2NoZW1hLFxuICBwbGFuRmVhdHVyZVNjaGVtYSxcbn0gZnJvbSBcIi4uL3NjaGVtYXNcIjtcbmltcG9ydCB7IGFuYWx5emVSZXBvIH0gZnJvbSBcIi4uL2NvZGVcIjtcbmltcG9ydCB7IGRlcml2ZUNhcGFiaWxpdGllcyB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgZ2V0V29ya3NwYWNlUm9vdCxcbiAgcmVzb2x2ZUluV29ya3NwYWNlLFxuICB0aHJvd1VzZXJFcnJvcixcbiAgV29ya3NwYWNlRXJyb3IsXG59IGZyb20gXCIuLi93b3Jrc3BhY2VcIjtcbi8vIE5PVEU6IHByb21wdCBoZWxwZXJzIChidWlsZERvY3VtZW50YXRpb25QYXlsb2FkLCBkaXNjb3ZlckRvY1Byb21wdHMsIHNlbGVjdFByb21wdCwgREVGQVVMVF9QUk9NUFRfTkFNRSlcbi8vIGFyZSBpbXBvcnRlZCBkeW5hbWljYWxseSBpbnNpZGUgZG9jdW1lbnRDb2RlVG9vbC5leGVjdXRlIHRvIGF2b2lkIGNyZWF0aW5nIGEgc3RhdGljIGNpcmN1bGFyIGltcG9ydFxuLy8gYXQgbW9kdWxlIGxvYWQgdGltZSAobW9kdWxlUmVnaXN0cnkgLT4gbW9kdWxlcyAtPiBkZWNvcmF0aW9uIHRvb2xzIC0+IG1jcC90b29scyAtPiBwcm9tcHRzKS5cbi8vIFRoZXkgd2lsbCBiZSBsb2FkZWQgd2hlbiB0aGUgdG9vbCBleGVjdXRlcy5cbmltcG9ydCB0eXBlIHsgQXBwbHlDb2RlQ2hhbmdlQXJncywgRG9jdW1lbnRDb2RlQXJncyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmFseXplUmVwb3NpdG9yeVRvb2woKTogVG9vbDxcbiAgdW5kZWZpbmVkLFxuICB0eXBlb2YgYW5hbHl6ZVJlcG9TY2hlbWFcbj4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IFwiYW5hbHl6ZS1yZXBvc2l0b3J5XCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkFuYWx5emUgYSBsb2NhbCByZXBvc2l0b3J5J3Mgc291cmNlLCB0ZXN0cywgYW5kIGRvY3MgdG8gZXh0cmFjdCBleHBvcnRlZCBBUElzLCBkZWNvcmF0b3JzLCBhbmQgdGVzdCBtZW50aW9ucy5cIixcbiAgICBwYXJhbWV0ZXJzOiBhbmFseXplUmVwb1NjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQpID0+IHtcbiAgICAgIGxldCByZXBvUm9vdCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBpbnB1dC5yZXBvUGF0aCk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKSB7XG4gICAgICAgIC8vIHRyeSByZXNvbHZpbmcgZnJvbSBtb25vcmVwbyByb290IChwYXJlbnQgb2YgY3VycmVudCBjd2QpXG4gICAgICAgIGNvbnN0IGFsdCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBcIi4uXCIsIGlucHV0LnJlcG9QYXRoKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYWx0KSkgcmVwb1Jvb3QgPSBhbHQ7XG4gICAgICB9XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKSB7XG4gICAgICAgIC8vIGlmIGlucHV0IHdhcyBhYnNvbHV0ZSBhbmQgc3RpbGwgbm90IGZvdW5kLCB0cnkgLi4vPGJhc2VuYW1lPlxuICAgICAgICBjb25zdCBhbHQyID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgXCIuLlwiLFxuICAgICAgICAgIHBhdGguYmFzZW5hbWUoaW5wdXQucmVwb1BhdGgpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFsdDIpKSByZXBvUm9vdCA9IGFsdDI7XG4gICAgICB9XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcG9zaXRvcnkgbm90IGZvdW5kIGF0ICR7cmVwb1Jvb3R9YCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhbmFseXplUmVwbyhyZXBvUm9vdCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSB9XSxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW51bWVyYXRlQ2FwYWJpbGl0aWVzVG9vbCgpOiBUb29sPFxuICB1bmRlZmluZWQsXG4gIHR5cGVvZiBlbnVtZXJhdGVDYXBhYmlsaXRpZXNTY2hlbWFcbj4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IFwiZW51bWVyYXRlLWNhcGFiaWxpdGllc1wiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFbnVtZXJhdGUgZGV2ZWxvcGVyLWZhY2luZyBjYXBhYmlsaXRpZXMgb2YgdGhlIGdpdmVuIHJlcG9zaXRvcnksIGluZmVycmVkIGZyb20gY29kZSwgdGVzdHMsIGFuZCBkb2NzLlwiLFxuICAgIHBhcmFtZXRlcnM6IGVudW1lcmF0ZUNhcGFiaWxpdGllc1NjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQpID0+IHtcbiAgICAgIGxldCByZXBvUm9vdCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBpbnB1dC5yZXBvUGF0aCk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKSB7XG4gICAgICAgIGNvbnN0IGFsdCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBcIi4uXCIsIGlucHV0LnJlcG9QYXRoKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYWx0KSkgcmVwb1Jvb3QgPSBhbHQ7XG4gICAgICB9XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVwb1Jvb3QpKSB7XG4gICAgICAgIGNvbnN0IGFsdDIgPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICBcIi4uXCIsXG4gICAgICAgICAgcGF0aC5iYXNlbmFtZShpbnB1dC5yZXBvUGF0aClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYWx0MikpIHJlcG9Sb290ID0gYWx0MjtcbiAgICAgIH1cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhyZXBvUm9vdCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVwb3NpdG9yeSBub3QgZm91bmQgYXQgJHtyZXBvUm9vdH1gKTtcbiAgICAgIGNvbnN0IGFuYWx5c2lzID0gYW5hbHl6ZVJlcG8ocmVwb1Jvb3QpO1xuICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gZGVyaXZlQ2FwYWJpbGl0aWVzKGFuYWx5c2lzKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgICAgIGFuYWx5c2lzU3VtbWFyeToge1xuICAgICAgICAgICAgICAgICAgZmlsZXM6IGFuYWx5c2lzLmZpbGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIHRlc3RGaWxlczogYW5hbHlzaXMudGVzdEZpbGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIHJlYWRtZTogYW5hbHlzaXMucmVhZG1lPy50aXRsZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBsYW5GZWF0dXJlVG9vbCgpOiBUb29sPFxuICB1bmRlZmluZWQsXG4gIHR5cGVvZiBwbGFuRmVhdHVyZVNjaGVtYVxuPiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJwbGFuLWZlYXR1cmUtaW1wbGVtZW50YXRpb25cIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiR2l2ZW4gYSBmZWF0dXJlIHJlcXVlc3QsIHNlbGVjdCBhcHByb3ByaWF0ZSBNQ1AgdG9vbHMgKGluY2x1ZGluZyBleGlzdGluZyBhbmQgbmV3IG9uZXMpIGFuZCBwcm9kdWNlIGFuIGV4ZWN1dGlvbiBwbGFuLlwiLFxuICAgIHBhcmFtZXRlcnM6IHBsYW5GZWF0dXJlU2NoZW1hLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCkgPT4ge1xuICAgICAgY29uc3Qgc3RlcHM6IEFycmF5PHtcbiAgICAgICAgc3RlcDogbnVtYmVyO1xuICAgICAgICBhY3Rpb246IHN0cmluZztcbiAgICAgICAgdG9vbD86IHN0cmluZztcbiAgICAgICAgYXJndW1lbnRzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgcmF0aW9uYWxlOiBzdHJpbmc7XG4gICAgICB9PiA9IFtdO1xuICAgICAgbGV0IGkgPSAxO1xuICAgICAgc3RlcHMucHVzaCh7XG4gICAgICAgIHN0ZXA6IGkrKyxcbiAgICAgICAgYWN0aW9uOiBcIkFuYWx5emUgcmVwb3NpdG9yeSB0byBlbnVtZXJhdGUgQVBJcyBhbmQgZGVjb3JhdG9yc1wiLFxuICAgICAgICB0b29sOiBcImFuYWx5emUtcmVwb3NpdG9yeVwiLFxuICAgICAgICBhcmd1bWVudHM6IHsgcmVwb1BhdGg6IGlucHV0LnJlcG9QYXRoIH0sXG4gICAgICAgIHJhdGlvbmFsZTogXCJVbmRlcnN0YW5kIGF2YWlsYWJsZSBidWlsZGluZyBibG9ja3MuXCIsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBzdGVwOiBpKyssXG4gICAgICAgIGFjdGlvbjogXCJMaXN0IGNhcGFiaWxpdGllcyBleHBlY3RlZCBmb3IgZGV2ZWxvcGVyc1wiLFxuICAgICAgICB0b29sOiBcImVudW1lcmF0ZS1jYXBhYmlsaXRpZXNcIixcbiAgICAgICAgYXJndW1lbnRzOiB7IHJlcG9QYXRoOiBpbnB1dC5yZXBvUGF0aCB9LFxuICAgICAgICByYXRpb25hbGU6IFwiQWxpZ24gdGhlIHBsYW4gd2l0aCBzdXBwb3J0ZWQgY2FwYWJpbGl0aWVzLlwiLFxuICAgICAgfSk7XG4gICAgICAvLyBTdWdnZXN0IGV4aXN0aW5nIGdlbmVyaWMgdG9vbHMgZnJvbSBtY3AtbW9kdWxlXG4gICAgICBzdGVwcy5wdXNoKHtcbiAgICAgICAgc3RlcDogaSsrLFxuICAgICAgICBhY3Rpb246XG4gICAgICAgICAgXCJTZWxlY3QgZG9jdW1lbnRhdGlvbiBwcm9tcHQgYW5kIGdhdGhlciByZWxldmFudCBzb3VyY2UgZmlsZShzKVwiLFxuICAgICAgICB0b29sOiBcImRvY3VtZW50LWNvZGVcIixcbiAgICAgICAgYXJndW1lbnRzOiB7IGZpbGVQYXRoOiBcIjx0YXJnZXQtZmlsZT5cIiB9LFxuICAgICAgICByYXRpb25hbGU6IFwiUHJvdmlkZSBjb250ZXh0IGFuZCBpbnN0cnVjdGlvbnMgZm9yIGNoYW5nZXMuXCIsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBzdGVwOiBpKyssXG4gICAgICAgIGFjdGlvbjogXCJBcHBseSBjb2RlIGNoYW5nZXMgdXNpbmcgdW5pZmllZCBkaWZmIHBhdGNoXCIsXG4gICAgICAgIHRvb2w6IFwiYXBwbHktY29kZS1jaGFuZ2VcIixcbiAgICAgICAgYXJndW1lbnRzOiB7XG4gICAgICAgICAgZmlsZVBhdGg6IFwiPHRhcmdldC1maWxlPlwiLFxuICAgICAgICAgIHBhdGNoOiBcIjx1bmlmaWVkLWRpZmY+XCIsXG4gICAgICAgICAgZHJ5UnVuOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICByYXRpb25hbGU6IFwiVmFsaWRhdGUgY2hhbmdlcyBzYWZlbHkgYmVmb3JlIGNvbW1pdHRpbmcuXCIsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBzdGVwOiBpKyssXG4gICAgICAgIGFjdGlvbjogXCJDb21taXQgY29kZSBjaGFuZ2VzXCIsXG4gICAgICAgIHRvb2w6IFwiYXBwbHktY29kZS1jaGFuZ2VcIixcbiAgICAgICAgYXJndW1lbnRzOiB7XG4gICAgICAgICAgZmlsZVBhdGg6IFwiPHRhcmdldC1maWxlPlwiLFxuICAgICAgICAgIHBhdGNoOiBcIjx1bmlmaWVkLWRpZmY+XCIsXG4gICAgICAgICAgZHJ5UnVuOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgcmF0aW9uYWxlOiBcIlBlcnNpc3QgdGhlIHVwZGF0ZS5cIixcbiAgICAgIH0pO1xuICAgICAgLy8gSWYgZGVjb3JhdGlvbi1yZWxhdGVkIHRlcm1zIHByZXNlbnQsIHN1Z2dlc3QgZGVjb3JhdG9yIHRvb2xzXG4gICAgICBpZiAoL2RlY29yYXR8Zmxhdm91cnxvdmVycmlkZXxleHRlbmR8YnVpbGRlci9pLnRlc3QoaW5wdXQuZmVhdHVyZSkpIHtcbiAgICAgICAgc3RlcHMudW5zaGlmdCh7XG4gICAgICAgICAgc3RlcDogMCxcbiAgICAgICAgICBhY3Rpb246IFwiVXNlIGRlY29yYXRvciB0b29saW5nIHRvIGluc2VydC9yZW1vdmUvbW9kaWZ5IGRlY29yYXRvcnNcIixcbiAgICAgICAgICB0b29sOiBcImRlY29yYXRvci10b29sc1wiLFxuICAgICAgICAgIGFyZ3VtZW50czogeyBhY3Rpb246IFwiaGVscFwiIH0sXG4gICAgICAgICAgcmF0aW9uYWxlOiBcIkxldmVyYWdlIHNwZWNpYWxpemVkIHV0aWxpdGllcyBmb3IgZGVjb3JhdGlvbiBwYXR0ZXJucy5cIixcbiAgICAgICAgfSk7XG4gICAgICAgIHN0ZXBzLmZvckVhY2goKHMsIGlkeCkgPT4gKHMuc3RlcCA9IGlkeCArIDEpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGxhbjogc3RlcHMsXG4gICAgICAgICAgICAgICAgbm90ZXM6XG4gICAgICAgICAgICAgICAgICBcIlJlcGxhY2UgcGxhY2Vob2xkZXIgYXJndW1lbnRzIGxpa2UgPHRhcmdldC1maWxlPiBhbmQgPHVuaWZpZWQtZGlmZj4gYmFzZWQgb24gdGhlIGFuYWx5c2lzIG91dHB1dC5cIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgZG9jdW1lbnRDb2RlVG9vbDogVG9vbDx1bmRlZmluZWQsIHR5cGVvZiBkb2N1bWVudENvZGVTY2hlbWE+ID0ge1xuICBhbm5vdGF0aW9uczoge1xuICAgIGlkZW1wb3RlbnRIaW50OiB0cnVlLFxuICAgIG9wZW5Xb3JsZEhpbnQ6IGZhbHNlLFxuICAgIHJlYWRPbmx5SGludDogdHJ1ZSxcbiAgICB0aXRsZTogXCJEb2N1bWVudCBTb3VyY2UgRmlsZVwiLFxuICB9LFxuICBkZXNjcmlwdGlvbjpcbiAgICBcIkdlbmVyYXRlIGRvY3VtZW50YXRpb24gZ3VpZGFuY2UgZm9yIGEgZmlsZSBieSBjb21iaW5pbmcgcmVwb3NpdG9yeSBwcm9tcHRzIHdpdGggdGhlIHRhcmdldCBzb3VyY2UgY29kZS5cIixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIF9jb250ZXh0KTogUHJvbWlzZTxDb250ZW50UmVzdWx0PiA9PiB7XG4gICAgY29uc3QgYXJncyA9IGRvY3VtZW50Q29kZVNjaGVtYS5wYXJzZShpbnB1dCBhcyBEb2N1bWVudENvZGVBcmdzKTtcbiAgICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICAgIGxldCBmaWxlUGF0aDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBmaWxlUGF0aCA9IHJlc29sdmVJbldvcmtzcGFjZShyb290LCBhcmdzLmZpbGVQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV29ya3NwYWNlRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRocm93VXNlckVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiB0aHJvd1VzZXJFcnJvcihgQ2Fubm90IGRvY3VtZW50IG1pc3NpbmcgZmlsZSBhdCAke2FyZ3MuZmlsZVBhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIHtcbiAgICAgIGVuY29kaW5nOiBhcmdzLmVuY29kaW5nIGFzIEJ1ZmZlckVuY29kaW5nLFxuICAgIH0pO1xuICAgIC8vIGR5bmFtaWNhbGx5IGltcG9ydCBwcm9tcHQgaGVscGVyc1xuICAgIGNvbnN0IHByb21wdE1vZCA9IGF3YWl0IGltcG9ydChcIi4uL3Byb21wdHMvcHJvbXB0c1wiKTtcbiAgICBjb25zdCB7XG4gICAgICBkaXNjb3ZlckRvY1Byb21wdHMsXG4gICAgICBzZWxlY3RQcm9tcHQsXG4gICAgICBERUZBVUxUX1BST01QVF9OQU1FLFxuICAgICAgYnVpbGREb2N1bWVudGF0aW9uUGF5bG9hZCxcbiAgICB9ID0gcHJvbXB0TW9kO1xuICAgIGNvbnN0IHByb21wdHMgPSBkaXNjb3ZlckRvY1Byb21wdHMocm9vdCk7XG5cbiAgICBpZiAoIXByb21wdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhyb3dVc2VyRXJyb3IoXG4gICAgICAgIFwiTm8gZG9jdW1lbnRhdGlvbiBwcm9tcHRzIGZvdW5kIHVuZGVyIC5jb2RlL3Byb21wdHMgb3IgLmNvZGV4L3Byb21wdHNcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9tcHQgPSBzZWxlY3RQcm9tcHQoXG4gICAgICBwcm9tcHRzLFxuICAgICAgYXJncy5wcm9tcHROYW1lID8/IERFRkFVTFRfUFJPTVBUX05BTUVcbiAgICApO1xuXG4gICAgcmV0dXJuIGJ1aWxkRG9jdW1lbnRhdGlvblBheWxvYWQoe1xuICAgICAgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGgsXG4gICAgICBmaWxlQ29udGVudCxcbiAgICAgIHByb21wdCxcbiAgICAgIGluY2x1ZGVDb2RlOiBhcmdzLmluY2x1ZGVDb2RlLFxuICAgICAgaW5jbHVkZVByb21wdDogYXJncy5pbmNsdWRlUHJvbXB0LFxuICAgICAgaW5jbHVkZU1ldGFkYXRhOiBhcmdzLmluY2x1ZGVNZXRhZGF0YSxcbiAgICAgIGFkZGl0aW9uYWxDb250ZXh0OiBhcmdzLmFkZGl0aW9uYWxDb250ZXh0LFxuICAgIH0pO1xuICB9LFxuICBuYW1lOiBcImRvY3VtZW50LWNvZGVcIixcbiAgcGFyYW1ldGVyczogZG9jdW1lbnRDb2RlU2NoZW1hLFxufTtcblxuZXhwb3J0IGNvbnN0IGFwcGx5Q29kZUNoYW5nZVRvb2w6IFRvb2w8dW5kZWZpbmVkLCB0eXBlb2YgY29kZUNoYW5nZVNjaGVtYT4gPSB7XG4gIGFubm90YXRpb25zOiB7XG4gICAgZGVzdHJ1Y3RpdmVIaW50OiB0cnVlLFxuICAgIGlkZW1wb3RlbnRIaW50OiBmYWxzZSxcbiAgICBvcGVuV29ybGRIaW50OiBmYWxzZSxcbiAgICByZWFkT25seUhpbnQ6IGZhbHNlLFxuICAgIHRpdGxlOiBcIkFwcGx5IENvZGUgUGF0Y2hcIixcbiAgfSxcbiAgZGVzY3JpcHRpb246XG4gICAgXCJBcHBseSBhIHVuaWZpZWQgZGlmZiBwYXRjaCB0byBhIHdvcmtzcGFjZSBmaWxlIHdpdGggb3B0aW9uYWwgZHJ5LXJ1biB2YWxpZGF0aW9uIGFuZCBkaWZmIHByZXZpZXcuXCIsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBfY29udGV4dCk6IFByb21pc2U8c3RyaW5nIHwgQ29udGVudFJlc3VsdD4gPT4ge1xuICAgIGNvbnN0IGFyZ3MgPSBjb2RlQ2hhbmdlU2NoZW1hLnBhcnNlKGlucHV0IGFzIEFwcGx5Q29kZUNoYW5nZUFyZ3MpO1xuICAgIGNvbnN0IHJvb3QgPSBnZXRXb3Jrc3BhY2VSb290KCk7XG4gICAgbGV0IGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGZpbGVQYXRoID0gcmVzb2x2ZUluV29ya3NwYWNlKHJvb3QsIGFyZ3MuZmlsZVBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXb3Jrc3BhY2VFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhyb3dVc2VyRXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpXG4gICAgICA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgYXJncy5lbmNvZGluZyBhcyBCdWZmZXJFbmNvZGluZylcbiAgICAgIDogXCJcIjtcblxuICAgIGxldCBwYXRjaGVkOiBzdHJpbmcgfCBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgcGF0Y2hlZCA9IGFwcGx5UGF0Y2gob3JpZ2luYWwsIGFyZ3MucGF0Y2gpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gdGhyb3dVc2VyRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gYXBwbHkgcHJvdmlkZWQgcGF0Y2ggdG8gJHthcmdzLmZpbGVQYXRofTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWBcbiAgICAgICk7XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHBhdGNoZWQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGhyb3dVc2VyRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gYXBwbHkgcHJvdmlkZWQgcGF0Y2ggdG8gJHthcmdzLmZpbGVQYXRofWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFhcmdzLmRyeVJ1bikge1xuICAgICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgcGF0Y2hlZCwge1xuICAgICAgICBlbmNvZGluZzogYXJncy5lbmNvZGluZyBhcyBCdWZmZXJFbmNvZGluZyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghYXJncy5zaG93RGlmZikge1xuICAgICAgcmV0dXJuIGBQYXRjaCAke2FyZ3MuZHJ5UnVuID8gXCJ2YWxpZGF0ZWRcIiA6IFwiYXBwbGllZFwifSBmb3IgJHthcmdzLmZpbGVQYXRofWA7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlldyA9IGNyZWF0ZVR3b0ZpbGVzUGF0Y2goXG4gICAgICBhcmdzLmZpbGVQYXRoLFxuICAgICAgYXJncy5maWxlUGF0aCxcbiAgICAgIG9yaWdpbmFsLFxuICAgICAgcGF0Y2hlZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHsgY29udGV4dDogYXJncy5kaWZmQ29udGV4dCB9XG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgUGF0Y2ggJHthcmdzLmRyeVJ1biA/IFwidmFsaWRhdGVkXCIgOiBcImFwcGxpZWRcIn0gZm9yICR7YXJncy5maWxlUGF0aH1gLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogW1wiYGBgZGlmZlwiLCBwcmV2aWV3LnRyaW0oKSwgXCJgYGBcIl0uam9pbihcIlxcblwiKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSBzYXRpc2ZpZXMgQ29udGVudFJlc3VsdDtcbiAgfSxcbiAgbmFtZTogXCJhcHBseS1jb2RlLWNoYW5nZVwiLFxuICBwYXJhbWV0ZXJzOiBjb2RlQ2hhbmdlU2NoZW1hLFxufTtcblxudHlwZSBBbnlUb29sID0gVG9vbDx1bmRlZmluZWQsIGFueT47XG5cbmNvbnN0IGFuYWx5dGljVG9vbHM6IEFueVRvb2xbXSA9IFtcbiAgYnVpbGRBbmFseXplUmVwb3NpdG9yeVRvb2woKSxcbiAgYnVpbGRFbnVtZXJhdGVDYXBhYmlsaXRpZXNUb29sKCksXG4gIGJ1aWxkUGxhbkZlYXR1cmVUb29sKCksXG5dO1xuXG5leHBvcnQgY29uc3QgdG9vbExpc3Q6IEFueVRvb2xbXSA9IFtcbiAgLi4uYW5hbHl0aWNUb29scyxcbiAgZG9jdW1lbnRDb2RlVG9vbCxcbiAgYXBwbHlDb2RlQ2hhbmdlVG9vbCxcbl07XG4iLCJpbXBvcnQgeyBtb2R1bGVSZWdpc3RyeSB9IGZyb20gXCIuLi9tb2R1bGVSZWdpc3RyeVwiO1xuaW1wb3J0IHtcbiAgY292ZXJhZ2VFbmZvcmNlclRvb2wsXG4gIGRvY3VtZW50T2JqZWN0VG9vbCxcbiAgcmVhZG1lSW1wcm92ZW1lbnRUb29sLFxufSBmcm9tIFwiLi9jb2RleC10b29sc1wiO1xuaW1wb3J0IHsgZGVjb3JhdG9yVG9vbHMgfSBmcm9tIFwiLi4vZGVjb3JhdG9yLXRvb2xzXCI7XG5jb25zdCBjb2RleFRvb2xMaXN0ID0gW1xuICBkb2N1bWVudE9iamVjdFRvb2wsXG4gIGNvdmVyYWdlRW5mb3JjZXJUb29sLFxuICByZWFkbWVJbXByb3ZlbWVudFRvb2wsXG5dO1xuXG5pbXBvcnQgeyB0b29sTGlzdCBhcyBjb3JlVG9vbExpc3QgfSBmcm9tIFwiLi90b29sc1wiO1xuXG5jb25zdCBtb2R1bGVUb29sTGlzdCA9IG1vZHVsZVJlZ2lzdHJ5XG4gIC5saXN0VG9vbHMoKVxuICAubWFwKChhc3NldCkgPT4gYXNzZXQudG9vbCBhcyBhbnkpO1xuXG5leHBvcnQgY29uc3QgdG9vbExpc3QgPSBbLi4uY29yZVRvb2xMaXN0LCAuLi5jb2RleFRvb2xMaXN0LCAuLi5tb2R1bGVUb29sTGlzdF07XG5jb25zdCBbXG4gIGFuYWx5emVSZXBvc2l0b3J5VG9vbCxcbiAgZW51bWVyYXRlQ2FwYWJpbGl0aWVzVG9vbCxcbiAgcGxhbkZlYXR1cmVUb29sLFxuICBkb2N1bWVudENvZGVUb29sUmVmLFxuICBhcHBseUNvZGVDaGFuZ2VUb29sUmVmLFxuXSA9IGNvcmVUb29sTGlzdDtcblxuZXhwb3J0IGNvbnN0IHRvb2xzID0ge1xuICBhbmFseXplUmVwb3NpdG9yeVRvb2wsXG4gIGVudW1lcmF0ZUNhcGFiaWxpdGllc1Rvb2wsXG4gIHBsYW5GZWF0dXJlVG9vbCxcbiAgZG9jdW1lbnRDb2RlVG9vbDogZG9jdW1lbnRDb2RlVG9vbFJlZixcbiAgYXBwbHlDb2RlQ2hhbmdlVG9vbDogYXBwbHlDb2RlQ2hhbmdlVG9vbFJlZixcbiAgZG9jdW1lbnRPYmplY3RUb29sLFxuICBjb3ZlcmFnZUVuZm9yY2VyVG9vbCxcbiAgcmVhZG1lSW1wcm92ZW1lbnRUb29sLFxuICAuLi5kZWNvcmF0b3JUb29scyxcbn07XG5leHBvcnQgeyBkZWNvcmF0b3JUb29scyB9O1xuIiwiaW1wb3J0IHR5cGUgeyBSZXNvdXJjZSB9IGZyb20gXCJmYXN0bWNwXCI7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlQXNzZXQgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IG1vZHVsZVJlZ2lzdHJ5IH0gZnJvbSBcIi4uL21vZHVsZVJlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VSb290IH0gZnJvbSBcIi4uL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHsgYnVpbGRPYmplY3RQcm9tcHRzLCBkaXNjb3ZlckRvY1Byb21wdHMgfSBmcm9tIFwiLi4vcHJvbXB0cy9wcm9tcHRzXCI7XG5cbmZ1bmN0aW9uIHRvUmVzb3VyY2UoYXNzZXQ6IFJlc291cmNlQXNzZXQpOiBSZXNvdXJjZTx1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBhc3NldC5pZCxcbiAgICB1cmk6IGFzc2V0LnVyaSxcbiAgICBkZXNjcmlwdGlvbjogYXNzZXQuZGVzY3JpcHRpb24gPz8gYXNzZXQudGl0bGUsXG4gICAgbWltZVR5cGU6IGFzc2V0Lm1pbWVUeXBlLFxuICAgIGxvYWQ6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFzc2V0LmxvYWQoKTtcbiAgICAgIC8vIGFzc2V0LmxvYWQgbWF5IHJldHVybiBhIENvbnRlbnRSZXN1bHQgb3IgYSBQcm9taXNlIG9mIENvbnRlbnRSZXN1bHQ7IGVuc3VyZSB3ZSByZXR1cm4gUmVzb3VyY2VSZXN1bHQtbGlrZSBvYmplY3RcbiAgICAgIGlmICgocmVzIGFzIGFueSk/LmNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgY3IgPSByZXMgYXMgYW55O1xuICAgICAgICAvLyBJZiBDb250ZW50UmVzdWx0LCBjb252ZXJ0IHRvIHNpbXBsZSB0ZXh0IHJlc3VsdCBleHBlY3RlZCBieSBSZXNvdXJjZS5sb2FkIGNvbnN1bWVyc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRleHQ6IEFycmF5LmlzQXJyYXkoY3IuY29udGVudClcbiAgICAgICAgICAgID8gY3IuY29udGVudC5tYXAoKGM6IGFueSkgPT4gYy50ZXh0KS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgICA6IFN0cmluZyhjciksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBmYWxsYmFjayBmb3Igb2JqZWN0cyB3aXRoIHRleHRcbiAgICAgIHJldHVybiByZXMgYXMgYW55IGFzIHsgdGV4dDogc3RyaW5nIH07XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRNb2R1bGVSZXNvdXJjZXMoKTogUmVzb3VyY2U8dW5kZWZpbmVkPltdIHtcbiAgcmV0dXJuIG1vZHVsZVJlZ2lzdHJ5Lmxpc3RSZXNvdXJjZXMoKS5tYXAodG9SZXNvdXJjZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZXNvdXJjZXM6IFJlc291cmNlPHVuZGVmaW5lZD5bXSA9IFtcbiAge1xuICAgIG5hbWU6IFwiY29kZXgtcHJvbXB0LWluZGV4XCIsXG4gICAgdXJpOiBcImNvZGV4Oi8vcHJvbXB0cy9pbmRleFwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFbnVtZXJhdGUgYXZhaWxhYmxlIC5jb2RleCBwcm9tcHQgZmlsZXMgd2l0aCB0aXRsZXMgYW5kIGRlc2NyaXB0aW9ucy5cIixcbiAgICBtaW1lVHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgbG9hZDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9vdCA9IGdldFdvcmtzcGFjZVJvb3QoKTtcbiAgICAgIGNvbnN0IHByb21wdHMgPSBkaXNjb3ZlckRvY1Byb21wdHMocm9vdCkubWFwKChwcm9tcHQpID0+ICh7XG4gICAgICAgIG5hbWU6IHByb21wdC5uYW1lLFxuICAgICAgICB0aXRsZTogcHJvbXB0LnRpdGxlLFxuICAgICAgICBkZXNjcmlwdGlvbjogcHJvbXB0LmRlc2NyaXB0aW9uLFxuICAgICAgICBwYXRoOiBwcm9tcHQuYWJzb2x1dGVQYXRoLFxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkoeyBwcm9tcHRzIH0sIG51bGwsIDIpLFxuICAgICAgICBtaW1lVHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9O1xuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcImNvZGV4LW9iamVjdC1wcm9tcHRzXCIsXG4gICAgdXJpOiBcImNvZGV4Oi8vcHJvbXB0cy9vYmplY3RzXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlByb3ZpZGVzIHRoZSByZXNvbHZlZCBwcm9tcHQgY29udGVudCBmb3IgZWFjaCBkb2N1bWVudGVkIG9iamVjdCB3b3JrZmxvdy5cIixcbiAgICBtaW1lVHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgbG9hZDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBidWlsZE9iamVjdFByb21wdHMoKS5tYXAoYXN5bmMgKHByb21wdCkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBwcm9tcHQubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcHJvbXB0LmRlc2NyaXB0aW9uLFxuICAgICAgICAgIGNvbnRlbnQ6IGF3YWl0IHByb21wdC5sb2FkKHt9IGFzIG5ldmVyKSxcbiAgICAgICAgfSkpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkoeyBwcm9tcHRzOiBlbnRyaWVzIH0sIG51bGwsIDIpLFxuICAgICAgICBtaW1lVHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9O1xuICAgIH0sXG4gIH0sXG4gIC4uLmJ1aWxkTW9kdWxlUmVzb3VyY2VzKCksXG5dO1xuIiwiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGdldFdvcmtzcGFjZVJvb3QsIHJlc29sdmVJbldvcmtzcGFjZSB9IGZyb20gXCIuLi93b3Jrc3BhY2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvbXB0UmVzb3VyY2VUZW1wbGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgY29kZXhQcm9tcHRUZW1wbGF0ZXM6IFByb21wdFJlc291cmNlVGVtcGxhdGVbXSA9IFtdO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb2RleFByb21wdFRlbXBsYXRlcygpOiBQcm9tcHRSZXNvdXJjZVRlbXBsYXRlW10ge1xuICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICBjb25zdCB0ZW1wbGF0ZXM6IFByb21wdFJlc291cmNlVGVtcGxhdGVbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBcImNvZGV4LXByb21wdFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiTG9hZCBhIC5jb2RleCBwcm9tcHQgZmlsZSBieSBuYW1lICh3aXRob3V0IGV4dGVuc2lvbikgYXMgbWFya2Rvd24uXCIsXG4gICAgICB1cmlUZW1wbGF0ZTogXCJjb2RleC1wcm9tcHQ6Ly97bmFtZX1cIixcbiAgICAgIG1pbWVUeXBlOiBcInRleHQvbWFya2Rvd25cIixcbiAgICAgIGFyZ3VtZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJuYW1lXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBcIk5hbWUgb2YgdGhlIHByb21wdCBmaWxlIGluc2lkZSAuY29kZXgvcHJvbXB0cyAod2l0aG91dCAubWQpLlwiLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGxvYWQ6IGFzeW5jICh7IG5hbWUgfSkgPT4ge1xuICAgICAgICBjb25zdCBwcm9tcHRQYXRoID0gcmVzb2x2ZUluV29ya3NwYWNlKFxuICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgcGF0aC5qb2luKFwiLmNvZGV4XCIsIFwicHJvbXB0c1wiLCBgJHtuYW1lfS5tZGApXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwcm9tcHRQYXRoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvbXB0IC5jb2RleC9wcm9tcHRzLyR7bmFtZX0ubWQgbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwcm9tcHRQYXRoLCBcInV0ZjhcIik7XG4gICAgICAgIHJldHVybiB7IHRleHQsIHVyaTogYGNvZGV4LXByb21wdDovLy8ke25hbWV9YCB9O1xuICAgICAgfSxcbiAgICB9LFxuICBdO1xuXG4gIGNvZGV4UHJvbXB0VGVtcGxhdGVzLnNwbGljZSgwLCBjb2RleFByb21wdFRlbXBsYXRlcy5sZW5ndGgsIC4uLnRlbXBsYXRlcyk7XG4gIHJldHVybiBjb2RleFByb21wdFRlbXBsYXRlcztcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IERlY29yYXRpb25SZXNvdXJjZVRlbXBsYXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VSb290LCByZWFkV29ya3NwYWNlRmlsZSB9IGZyb20gXCIuLi93b3Jrc3BhY2VcIjtcblxuZXhwb3J0IGNvbnN0IGRlY29yYXRpb25SZXNvdXJjZVRlbXBsYXRlczogRGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVbXSA9IFtdO1xuXG5mdW5jdGlvbiBtYWtlTG9hZGVyKHR5cGU6IFwic3JjXCIgfCBcInRlc3RzXCIgfCBcIndvcmtkb2NzXCIpIHtcbiAgcmV0dXJuIGFzeW5jICh7IHBhdGg6IHJlbGF0aXZlIH06IHsgcGF0aDogc3RyaW5nIH0pID0+IHtcbiAgICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICAgIGNvbnN0IHRhcmdldCA9IHBhdGguam9pbih0eXBlLCByZWxhdGl2ZSk7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlYWRXb3Jrc3BhY2VGaWxlKHJvb3QsIHRhcmdldCk7XG4gICAgcmV0dXJuIHsgdGV4dCB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREZWNvcmF0aW9uUmVzb3VyY2VUZW1wbGF0ZXMoKTogRGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVbXSB7XG4gIGNvbnN0IHRlbXBsYXRlczogRGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBcInJlYWQtY29kZS1mcm9tLXNvdXJjZVwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUmVhZCBhIGZpbGUgZnJvbSB0aGUgPGJhc2VfcGF0aD4vc3JjIHRyZWUgYnkgcmVsYXRpdmUgcGF0aC5cIixcbiAgICAgIG1pbWVUeXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgIHVyaVRlbXBsYXRlOiBcImZyb20tc291cmNlOi8vc3JjL3twYXRofVwiLFxuICAgICAgYXJndW1lbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInBhdGhcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwiUGF0aCB1bmRlciA8YmFzZV9wYXRoPi9zcmMgdG8gbG9hZCwgZS5nLiAnZGVjb3JhdGlvbi90eXBlcy50cydcIixcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBsb2FkOiBtYWtlTG9hZGVyKFwic3JjXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJyZWFkLXRlc3QtZnJvbS1zb3VyY2VcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlJlYWQgYSBmaWxlIGZyb20gdGhlIDxiYXNlX3BhdGg+L3Rlc3RzIHRyZWUgYnkgcmVsYXRpdmUgcGF0aC5cIixcbiAgICAgIG1pbWVUeXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgIHVyaVRlbXBsYXRlOiBcImZyb20tc291cmNlOi8vdGVzdHMve3BhdGh9XCIsXG4gICAgICBhcmd1bWVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicGF0aFwiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgXCJQYXRoIHVuZGVyIDxiYXNlX3BhdGg+L3Rlc3RzIHRvIGxvYWQsIGUuZy4gJ2RlY29yYXRpb24vdGVzdHMvdHlwZXMudGVzdC50cydcIixcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBsb2FkOiBtYWtlTG9hZGVyKFwidGVzdHNcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInJlYWQtZG9jLWZyb20tc291cmNlXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJSZWFkIGEgZmlsZSBmcm9tIHRoZSA8YmFzZV9wYXRoPi93b3JrZG9jcyB0cmVlIGJ5IHJlbGF0aXZlIHBhdGguXCIsXG4gICAgICBtaW1lVHlwZTogXCJ0ZXh0L3BsYWluXCIsXG4gICAgICB1cmlUZW1wbGF0ZTogXCJmcm9tLXNvdXJjZTovL3dvcmtkb2NzL3twYXRofVwiLFxuICAgICAgYXJndW1lbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInBhdGhcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwiUGF0aCB1bmRlciA8YmFzZV9wYXRoPi93b3JrZG9jcyB0byBsb2FkLCBlLmcuICdkZWNvcmF0aW9uL3dvcmtkb2NzL3R1dG9yaWFscy9mb3ItZGV2ZWxvcGVycy5tZCdcIixcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBsb2FkOiBtYWtlTG9hZGVyKFwid29ya2RvY3NcIiksXG4gICAgfSxcbiAgXTtcblxuICBkZWNvcmF0aW9uUmVzb3VyY2VUZW1wbGF0ZXMuc3BsaWNlKFxuICAgIDAsXG4gICAgZGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVzLmxlbmd0aCxcbiAgICAuLi50ZW1wbGF0ZXNcbiAgKTtcbiAgcmV0dXJuIGRlY29yYXRpb25SZXNvdXJjZVRlbXBsYXRlcztcbn1cbiIsImltcG9ydCB7IFdvcmtzcGFjZVJlc291cmNlVGVtcGxhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldFdvcmtzcGFjZVJvb3QsIHJlYWRXb3Jrc3BhY2VGaWxlIH0gZnJvbSBcIi4uL3dvcmtzcGFjZVwiO1xuXG5leHBvcnQgY29uc3Qgd29ya3NwYWNlUmVzb3VyY2VUZW1wbGF0ZXM6IFdvcmtzcGFjZVJlc291cmNlVGVtcGxhdGVbXSA9IFtdO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRXb3Jrc3BhY2VSZXNvdXJjZVRlbXBsYXRlcygpOiBXb3Jrc3BhY2VSZXNvdXJjZVRlbXBsYXRlW10ge1xuICBjb25zdCByb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpO1xuICBjb25zdCBzaGFyZWRBcmd1bWVudHMgPSBbXG4gICAge1xuICAgICAgbmFtZTogXCJwYXRoXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJQYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2Ugcm9vdFwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgXSBhcyBjb25zdDtcblxuICBjb25zdCB0ZW1wbGF0ZXM6IFdvcmtzcGFjZVJlc291cmNlVGVtcGxhdGVbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiBcInZzY29kZS13b3Jrc3BhY2UtZmlsZVwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiRXhwb3NlIHdvcmtzcGFjZSBmaWxlcyB0byBWaXN1YWwgU3R1ZGlvIENvZGUgdmlhIHZzY29kZTovLyBVUklzXCIsXG4gICAgICB1cmlUZW1wbGF0ZTogXCJ2c2NvZGU6Ly93b3Jrc3BhY2Uve3BhdGh9XCIsXG4gICAgICBtaW1lVHlwZTogXCJ0ZXh0L3BsYWluXCIsXG4gICAgICBhcmd1bWVudHM6IHNoYXJlZEFyZ3VtZW50cyxcbiAgICAgIGxvYWQ6IGFzeW5jIChhcmdzOiB7IHBhdGg6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlYWRXb3Jrc3BhY2VGaWxlKHJvb3QsIGFyZ3MucGF0aCk7XG4gICAgICAgICAgcmV0dXJuIHsgdGV4dDogU3RyaW5nKHRleHQpIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIHByb3BhZ2F0ZSBhcy1pcyBmb3IgdGVzdHMgdG8gYXNzZXJ0IGVycm9yc1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY3Vyc29yLXdvcmtzcGFjZS1maWxlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJFeHBvc2Ugd29ya3NwYWNlIGZpbGVzIHRvIEN1cnNvciB2aWEgY3Vyc29yOi8vIFVSSXNcIixcbiAgICAgIHVyaVRlbXBsYXRlOiBcImN1cnNvcjovL3dvcmtzcGFjZS97cGF0aH1cIixcbiAgICAgIG1pbWVUeXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgIGFyZ3VtZW50czogc2hhcmVkQXJndW1lbnRzLFxuICAgICAgbG9hZDogYXN5bmMgKGFyZ3M6IHsgcGF0aDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVhZFdvcmtzcGFjZUZpbGUocm9vdCwgYXJncy5wYXRoKTtcbiAgICAgICAgICByZXR1cm4geyB0ZXh0OiBTdHJpbmcodGV4dCkgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb3BpbG90LXdvcmtzcGFjZS1maWxlXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJFeHBvc2Ugd29ya3NwYWNlIGZpbGVzIHRvIEdpdEh1YiBDb3BpbG90IHZpYSBjb3BpbG90Oi8vIFVSSXNcIixcbiAgICAgIHVyaVRlbXBsYXRlOiBcImNvcGlsb3Q6Ly93b3Jrc3BhY2Uve3BhdGh9XCIsXG4gICAgICBtaW1lVHlwZTogXCJ0ZXh0L3BsYWluXCIsXG4gICAgICBhcmd1bWVudHM6IHNoYXJlZEFyZ3VtZW50cyxcbiAgICAgIGxvYWQ6IGFzeW5jIChhcmdzOiB7IHBhdGg6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlYWRXb3Jrc3BhY2VGaWxlKHJvb3QsIGFyZ3MucGF0aCk7XG4gICAgICAgICAgcmV0dXJuIHsgdGV4dDogU3RyaW5nKHRleHQpIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICBdO1xuXG4gIHdvcmtzcGFjZVJlc291cmNlVGVtcGxhdGVzLnNwbGljZShcbiAgICAwLFxuICAgIHdvcmtzcGFjZVJlc291cmNlVGVtcGxhdGVzLmxlbmd0aCxcbiAgICAuLi50ZW1wbGF0ZXNcbiAgKTtcbiAgcmV0dXJuIHdvcmtzcGFjZVJlc291cmNlVGVtcGxhdGVzO1xufVxuXG4iLCJpbXBvcnQgeyBidWlsZENvZGV4UHJvbXB0VGVtcGxhdGVzIH0gZnJvbSBcIi4vY29kZXgtdGVtcGxhdGVzXCI7XG5pbXBvcnQgeyBidWlsZERlY29yYXRpb25SZXNvdXJjZVRlbXBsYXRlcyB9IGZyb20gXCIuL3Jlc291cmNlLXRlbXBsYXRlc1wiO1xuaW1wb3J0IHsgYnVpbGRXb3Jrc3BhY2VSZXNvdXJjZVRlbXBsYXRlcyB9IGZyb20gXCIuL3dvcmtzcGFjZS10ZW1wbGF0ZXNcIjtcbmltcG9ydCB7IG1vZHVsZVJlZ2lzdHJ5IH0gZnJvbSBcIi4uL21vZHVsZVJlZ2lzdHJ5XCI7XG5cbmV4cG9ydCB7XG4gIGJ1aWxkQ29kZXhQcm9tcHRUZW1wbGF0ZXMsXG4gIGNvZGV4UHJvbXB0VGVtcGxhdGVzLFxufSBmcm9tIFwiLi9jb2RleC10ZW1wbGF0ZXNcIjtcbmV4cG9ydCB7XG4gIGJ1aWxkRGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVzLFxuICBkZWNvcmF0aW9uUmVzb3VyY2VUZW1wbGF0ZXMsXG59IGZyb20gXCIuL3Jlc291cmNlLXRlbXBsYXRlc1wiO1xuZXhwb3J0IHtcbiAgYnVpbGRXb3Jrc3BhY2VSZXNvdXJjZVRlbXBsYXRlcyxcbiAgd29ya3NwYWNlUmVzb3VyY2VUZW1wbGF0ZXMsXG59IGZyb20gXCIuL3dvcmtzcGFjZS10ZW1wbGF0ZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVzb3VyY2VUZW1wbGF0ZXMoKSB7XG4gIGNvbnN0IG1vZHVsZVRlbXBsYXRlcyA9IG1vZHVsZVJlZ2lzdHJ5Lmxpc3RUZW1wbGF0ZXMoKS5tYXAoKHRlbXBsYXRlKSA9PiAoe1xuICAgIG5hbWU6IHRlbXBsYXRlLmlkLFxuICAgIGRlc2NyaXB0aW9uOiB0ZW1wbGF0ZS5kZXNjcmlwdGlvbiA/PyB0ZW1wbGF0ZS50aXRsZSxcbiAgICBtaW1lVHlwZTogXCJ0ZXh0L21hcmtkb3duXCIsXG4gICAgdXJpVGVtcGxhdGU6IGBtb2R1bGUtdGVtcGxhdGU6Ly8ke3RlbXBsYXRlLmlkfWAsXG4gICAgYXJndW1lbnRzOiAodGVtcGxhdGUucGxhY2Vob2xkZXJzID8/IFtdKS5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGBWYWx1ZSBmb3IgJHtuYW1lfWAsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSksXG4gICAgbG9hZDogYXN5bmMgKCkgPT4gKHtcbiAgICAgIHRleHQ6XG4gICAgICAgIHR5cGVvZiAodGVtcGxhdGUgYXMgYW55KS5jb250ZW50ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyAodGVtcGxhdGUgYXMgYW55KS5jb250ZW50XG4gICAgICAgICAgOiBgIyAke3RlbXBsYXRlLmRlc2NyaXB0aW9uID8/IHRlbXBsYXRlLnRpdGxlID8/IHRlbXBsYXRlLmlkfVxcblxcbk5vIHRlbXBsYXRlIGNvbnRlbnQgYXZhaWxhYmxlIGZvciAke3RlbXBsYXRlLmlkfWAsXG4gICAgfSksXG4gIH0pKTtcblxuICBjb25zdCBhbGwgPSBbXG4gICAgLi4uYnVpbGRXb3Jrc3BhY2VSZXNvdXJjZVRlbXBsYXRlcygpLFxuICAgIC4uLmJ1aWxkQ29kZXhQcm9tcHRUZW1wbGF0ZXMoKSxcbiAgICAuLi5idWlsZERlY29yYXRpb25SZXNvdXJjZVRlbXBsYXRlcygpLFxuICAgIC4uLm1vZHVsZVRlbXBsYXRlcyxcbiAgXTtcblxuICAvLyBOb3JtYWxpc2UgYWxsIGxvYWRlcnMgdG8gYWx3YXlzIHJldHVybiB7IHRleHQ6IHN0cmluZyB9XG4gIGZ1bmN0aW9uIG5vcm1hbGlzZVJlc3VsdChyZXM6IGFueSkge1xuICAgIGlmIChyZXMgPT0gbnVsbCkgcmV0dXJuIHsgdGV4dDogXCJcIiB9O1xuICAgIGlmICh0eXBlb2YgcmVzID09PSBcInN0cmluZ1wiKSByZXR1cm4geyB0ZXh0OiByZXMgfTtcbiAgICBpZiAodHlwZW9mIHJlcy50ZXh0ID09PSBcInN0cmluZ1wiKSByZXR1cm4gcmVzO1xuICAgIC8vIGhhbmRsZSBsZWdhY3kgQ29udGVudFJlc3VsdCBzaGFwZXMgd2l0aCBjb250ZW50IG9yIGNvbnRlbnQgYXJyYXlcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXMuY29udGVudCkpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gcmVzLmNvbnRlbnRcbiAgICAgICAgLm1hcCgoYzogYW55KSA9PiAoYyAmJiB0eXBlb2YgYy50ZXh0ID09PSBcInN0cmluZ1wiID8gYy50ZXh0IDogU3RyaW5nKGMpKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIik7XG4gICAgICByZXR1cm4geyB0ZXh0OiBwYXJ0cyB9O1xuICAgIH1cbiAgICBpZiAocmVzLmNvbnRlbnQgJiYgdHlwZW9mIHJlcy5jb250ZW50LnRleHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7IHRleHQ6IHJlcy5jb250ZW50LnRleHQgfTtcbiAgICB9XG4gICAgLy8gZmFsbGJhY2s6IHN0cmluZ2lmeVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXMpIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geyB0ZXh0OiBTdHJpbmcocmVzKSB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhbGwubWFwKCh0KSA9PiAoe1xuICAgIC4uLnQsXG4gICAgbG9hZDogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcmF3ID0gYXdhaXQgKHQubG9hZCBhcyBhbnkpKGFyZ3MpO1xuICAgICAgcmV0dXJuIG5vcm1hbGlzZVJlc3VsdChyYXcpO1xuICAgIH0sXG4gIH0pKTtcbn1cblxuZXhwb3J0IGNvbnN0IHRlbXBsYXRlTGlzdCA9IGJ1aWxkUmVzb3VyY2VUZW1wbGF0ZXMoKTtcbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBuYW1lIFZFUlNJT05cbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRzLXdvcmtzcGFjZSBtb2R1bGUuXG4gKiBAc3VtbWFyeSBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFX05BTUUjI1wiO1xuXG50cnkge1xuICBNZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbn0gY2F0Y2ggKGVycm9yKSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJhbHJlYWR5XCIpKSB7XG4gICAgLy8gSWdub3JlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24gZHVyaW5nIHRlc3RzL2J1bmRsaW5nIGNoZWNrcy5cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBGYXN0TUNQIH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7IFBBQ0tBR0VfTkFNRSBhcyBQS0csIFZFUlNJT04gYXMgViB9IGZyb20gXCIuLi9tZXRhZGF0YVwiO1xuaW1wb3J0IHsgbG9hZFByb21wdHMsIHByb21wdExpc3QgfSBmcm9tIFwiLi9wcm9tcHRzXCI7XG5pbXBvcnQgeyByZXNvdXJjZXMgfSBmcm9tIFwiLi9yZXNvdXJjZXNcIjtcbmltcG9ydCB7XG4gIGJ1aWxkRGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVzLFxuICBidWlsZFJlc291cmNlVGVtcGxhdGVzLFxuICBkZWNvcmF0aW9uUmVzb3VyY2VUZW1wbGF0ZXMsXG4gIHRlbXBsYXRlTGlzdCxcbiAgd29ya3NwYWNlUmVzb3VyY2VUZW1wbGF0ZXMsXG59IGZyb20gXCIuL3RlbXBsYXRlc1wiO1xuaW1wb3J0IHsgdG9vbExpc3QsIHRvb2xzIH0gZnJvbSBcIi4vdG9vbHNcIjtcbmltcG9ydCB7XG4gIF9fcmVzZXRXb3Jrc3BhY2VSb290LFxuICBnZXRXb3Jrc3BhY2VSb290LFxuICBzZXRXb3Jrc3BhY2VSb290LFxufSBmcm9tIFwiLi93b3Jrc3BhY2VcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGVucmljaChtY3A6IEZhc3RNQ1ApOiBGYXN0TUNQIHtcbiAgY29uc3QgcHJvbXB0RW50cmllcyA9IGxvYWRQcm9tcHRzKCk7XG4gIGZvciAoY29uc3QgcHJvbXB0IG9mIHByb21wdEVudHJpZXMpIHtcbiAgICBtY3AuYWRkUHJvbXB0KHByb21wdCBhcyBhbnkpO1xuICB9XG5cbiAgZm9yIChjb25zdCB0b29sIG9mIHRvb2xMaXN0KSB7XG4gICAgbWNwLmFkZFRvb2wodG9vbCBhcyBhbnkpO1xuICB9XG5cbiAgY29uc3QgdGVtcGxhdGVzID0gYnVpbGRSZXNvdXJjZVRlbXBsYXRlcygpO1xuICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIHRlbXBsYXRlcykge1xuICAgIG1jcC5hZGRSZXNvdXJjZVRlbXBsYXRlKHRlbXBsYXRlIGFzIGFueSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuICAgIGNvbnN0IGFkZFJlc291cmNlID0gKFxuICAgICAgbWNwIGFzIHVua25vd24gYXMgeyBhZGRSZXNvdXJjZT86IChyZXM6IHVua25vd24pID0+IHZvaWQgfVxuICAgICkuYWRkUmVzb3VyY2U7XG4gICAgaWYgKHR5cGVvZiBhZGRSZXNvdXJjZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhZGRSZXNvdXJjZS5jYWxsKG1jcCwgcmVzb3VyY2UgYXMgYW55KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWNwO1xufVxuXG5leHBvcnQgZGVmYXVsdCBlbnJpY2g7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gUEtHO1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBWO1xuXG5leHBvcnQge1xuICB0b29scyxcbiAgdG9vbExpc3QsXG4gIGJ1aWxkRGVjb3JhdGlvblJlc291cmNlVGVtcGxhdGVzLFxuICBidWlsZFJlc291cmNlVGVtcGxhdGVzLFxuICBkZWNvcmF0aW9uUmVzb3VyY2VUZW1wbGF0ZXMsXG4gIHByb21wdExpc3QsXG4gIHJlc291cmNlcyxcbiAgdGVtcGxhdGVMaXN0LFxuICB3b3Jrc3BhY2VSZXNvdXJjZVRlbXBsYXRlcyxcbiAgZ2V0V29ya3NwYWNlUm9vdCxcbiAgc2V0V29ya3NwYWNlUm9vdCxcbiAgX19yZXNldFdvcmtzcGFjZVJvb3QsXG59O1xuIiwiLy8gTmV3OiB2YWxpZGF0aW9uIGVudHJ5cG9pbnQgZm9yIG1vZHVsZSBzdHJ1Y3R1cmVcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25Jc3N1ZSA9IHtcbiAgbW9kdWxlOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgdHlwZTpcbiAgICB8IFwibWlzc2luZy1mb2xkZXJcIlxuICAgIHwgXCJtaXNzaW5nLWV4cG9ydFwiXG4gICAgfCBcImVtcHR5LWxpc3RcIlxuICAgIHwgXCJkaXNhYmxlZFwiXG4gICAgfCBcIm90aGVyXCI7XG4gIGRldGFpbD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25SZXBvcnQgPSB7XG4gIG9rOiBib29sZWFuO1xuICBtb2R1bGVzQ2hlY2tlZDogbnVtYmVyO1xuICBpc3N1ZXM6IFZhbGlkYXRpb25Jc3N1ZVtdO1xufTtcblxuY29uc3QgUkVRVUlSRURfU1VCRk9MREVSUyA9IFtcInByb21wdHNcIiwgXCJyZXNvdXJjZXNcIiwgXCJ0ZW1wbGF0ZXNcIiwgXCJ0b29sc1wiXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRNb2R1bGVEaXJzKHJlcG9Sb290OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG1vZHVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJlcG9Sb290LCBcInNyY1wiLCBcIm1vZHVsZXNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhtb2R1bGVzUGF0aCkgfHwgIWZzLnN0YXRTeW5jKG1vZHVsZXNQYXRoKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBmc1xuICAgIC5yZWFkZGlyU3luYyhtb2R1bGVzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG4gICAgLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKVxuICAgIC5tYXAoKGQpID0+IHBhdGguam9pbihtb2R1bGVzUGF0aCwgZC5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIGhhc0luZGV4RXhwb3J0KGZvbGRlclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjYW5kaWRhdGVzID0gW1xuICAgIFwiaW5kZXgudHNcIixcbiAgICBcImluZGV4LnRzeFwiLFxuICAgIFwiaW5kZXguanNcIixcbiAgICBcImluZGV4LmNqc1wiLFxuICAgIFwiaW5kZXgubWpzXCIsXG4gIF07XG4gIGZvciAoY29uc3QgYyBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGZvbGRlclBhdGgsIGMpKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNb2R1bGVzKHJlcG9Sb290OiBzdHJpbmcpOiBWYWxpZGF0aW9uUmVwb3J0IHtcbiAgY29uc3QgZGlycyA9IGZpbmRNb2R1bGVEaXJzKHJlcG9Sb290KTtcbiAgY29uc3QgaXNzdWVzOiBWYWxpZGF0aW9uSXNzdWVbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgbW9kdWxlRGlyIG9mIGRpcnMpIHtcbiAgICBjb25zdCBtb2R1bGVOYW1lID0gcGF0aC5iYXNlbmFtZShtb2R1bGVEaXIpO1xuICAgIGZvciAoY29uc3Qgc3ViIG9mIFJFUVVJUkVEX1NVQkZPTERFUlMpIHtcbiAgICAgIGNvbnN0IHN1YlBhdGggPSBwYXRoLmpvaW4obW9kdWxlRGlyLCBzdWIpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHN1YlBhdGgpIHx8ICFmcy5zdGF0U3luYyhzdWJQYXRoKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGlzc3Vlcy5wdXNoKHtcbiAgICAgICAgICBtb2R1bGU6IG1vZHVsZU5hbWUsXG4gICAgICAgICAgcGF0aDogc3ViUGF0aCxcbiAgICAgICAgICB0eXBlOiBcIm1pc3NpbmctZm9sZGVyXCIsXG4gICAgICAgICAgZGV0YWlsOiBgUmVxdWlyZWQgZm9sZGVyICcke3N1Yn0nIGlzIG1pc3NpbmcgaW4gbW9kdWxlICcke21vZHVsZU5hbWV9J2AsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIElmIGZvbGRlciBleGlzdHMsIGNoZWNrIGZvciBpbmRleCBleHBvcnRcbiAgICAgIGlmICghaGFzSW5kZXhFeHBvcnQoc3ViUGF0aCkpIHtcbiAgICAgICAgaXNzdWVzLnB1c2goe1xuICAgICAgICAgIG1vZHVsZTogbW9kdWxlTmFtZSxcbiAgICAgICAgICBwYXRoOiBzdWJQYXRoLFxuICAgICAgICAgIHR5cGU6IFwibWlzc2luZy1leHBvcnRcIixcbiAgICAgICAgICBkZXRhaWw6IGBObyBpbmRleCBleHBvcnQgZm91bmQgaW4gJyR7c3ViUGF0aH0nLiBFeHBlY3RlZCBvbmUgb2YgaW5kZXgudHMsIGluZGV4LmpzLCBldGMuYCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gT3B0aW9uYWxseSBpbnNwZWN0IHRoZSBpbmRleCBmaWxlIHRvIHNlZSBpZiBpdCBleHBvcnRzIGEgbGlzdCAobGlnaHR3ZWlnaHQgY2hlY2spXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpbmRleEZpbGUgPSBjYW5kaWRhdGVzRmluZGluZ0luZGV4KHN1YlBhdGgpO1xuICAgICAgICBpZiAoaW5kZXhGaWxlKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhpbmRleEZpbGUsIFwidXRmOFwiKTtcbiAgICAgICAgICAvLyBjcnVkZSBoZXVyaXN0aWNzOiBsb29rIGZvciBgZXhwb3J0IGNvbnN0IG5hbWUgPSBbYCBvciBgZXhwb3J0IGNvbnN0IG5hbWU6IFR5cGVbXSA9IFtgLFxuICAgICAgICAgIC8vIG9yIGFueSBuYW1lZCBleHBvcnQgbGlrZSBgZXhwb3J0IHsgc29tZXRoaW5nIH1gIHdoaWNoIGltcGxpZXMgZXhwb3J0cyBleGlzdC5cbiAgICAgICAgICBjb25zdCBleHBvcnRMaXN0UGF0dGVybiA9XG4gICAgICAgICAgICAvZXhwb3J0XFxzKyhjb25zdHxsZXR8dmFyKVxccytbXFx3JF0rKD86XFxzKjpcXHMqW149XSspP1xccyo9XFxzKlxcWy87XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWV4cG9ydExpc3RQYXR0ZXJuLnRlc3QoY29udGVudCkgJiZcbiAgICAgICAgICAgICEvZXhwb3J0XFxzK1xcey8udGVzdChjb250ZW50KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaXNzdWVzLnB1c2goe1xuICAgICAgICAgICAgICBtb2R1bGU6IG1vZHVsZU5hbWUsXG4gICAgICAgICAgICAgIHBhdGg6IGluZGV4RmlsZSxcbiAgICAgICAgICAgICAgdHlwZTogXCJlbXB0eS1saXN0XCIsXG4gICAgICAgICAgICAgIGRldGFpbDogYEluZGV4IGZpbGUgZG9lcyBub3QgYXBwZWFyIHRvIGV4cG9ydCBhIGxpc3Qgb2YgYXNzZXRzOiAke3BhdGguYmFzZW5hbWUoaW5kZXhGaWxlKX1gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpc3N1ZXMucHVzaCh7XG4gICAgICAgICAgbW9kdWxlOiBtb2R1bGVOYW1lLFxuICAgICAgICAgIHBhdGg6IHN1YlBhdGgsXG4gICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgIGRldGFpbDogYEVycm9yIHJlYWRpbmcgaW5kZXggZmlsZTogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG9rOiBpc3N1ZXMubGVuZ3RoID09PSAwLFxuICAgIG1vZHVsZXNDaGVja2VkOiBkaXJzLmxlbmd0aCxcbiAgICBpc3N1ZXMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhbmRpZGF0ZXNGaW5kaW5nSW5kZXgoZm9sZGVyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICBcImluZGV4LnRzXCIsXG4gICAgXCJpbmRleC50c3hcIixcbiAgICBcImluZGV4LmpzXCIsXG4gICAgXCJpbmRleC5janNcIixcbiAgICBcImluZGV4Lm1qc1wiLFxuICBdO1xuICBmb3IgKGNvbnN0IGMgb2YgY2FuZGlkYXRlcykge1xuICAgIGNvbnN0IGZ1bGwgPSBwYXRoLmpvaW4oZm9sZGVyUGF0aCwgYyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZnVsbCkpIHJldHVybiBmdWxsO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8vIENMSSBoZWxwZXJcbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBjb25zdCByZXBvUm9vdCA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHJlcG9ydCA9IHZhbGlkYXRlTW9kdWxlcyhyZXBvUm9vdCk7XG4gIGlmICghcmVwb3J0Lm9rKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIFwiTW9kdWxlIHZhbGlkYXRpb24gZmFpbGVkOlxcblwiLFxuICAgICAgSlNPTi5zdHJpbmdpZnkocmVwb3J0LCBudWxsLCAyKVxuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDIpO1xuICB9XG4gIGNvbnNvbGUubG9nKFwiTW9kdWxlIHZhbGlkYXRpb24gcGFzc2VkXCIpO1xuICBwcm9jZXNzLmV4aXQoMCk7XG59XG4iLCIvLyBBZ2dyZWdhdG9yOiBpbXBvcnQgbW9kdWxlIGluZGV4IGZpbGVzIGFuZCBtZXJnZSBleHBvcnRlZCBhcnJheXMgd2l0aCBwcm92ZW5hbmNlICsgZHVwbGljYXRlIGRldGVjdGlvblxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwidXJsXCI7XG5pbXBvcnQgeyBmaW5kTW9kdWxlRGlycyB9IGZyb20gXCIuL3ZhbGlkYXRpb25cIjtcblxuZXhwb3J0IHR5cGUgUHJvdmVuYW5jZSA9IHsgbW9kdWxlTmFtZTogc3RyaW5nOyBtb2R1bGVQYXRoOiBzdHJpbmcgfTtcbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uQ29uZmxpY3QgPSB7XG4gIGtleTogc3RyaW5nO1xuICBleGlzdGluZzogUHJvdmVuYW5jZTtcbiAgaW5jb21pbmc6IFByb3ZlbmFuY2U7XG59O1xuXG5leHBvcnQgdHlwZSBBZ2dyZWdhdGlvblJlc3VsdDxUID0gYW55PiA9IHtcbiAgcHJvbXB0czogQXJyYXk8VCAmIHsgcHJvdmVuYW5jZTogUHJvdmVuYW5jZSB9PjtcbiAgcmVzb3VyY2VzOiBBcnJheTxUICYgeyBwcm92ZW5hbmNlOiBQcm92ZW5hbmNlIH0+O1xuICB0ZW1wbGF0ZXM6IEFycmF5PFQgJiB7IHByb3ZlbmFuY2U6IFByb3ZlbmFuY2UgfT47XG4gIHRvb2xzOiBBcnJheTxUICYgeyBwcm92ZW5hbmNlOiBQcm92ZW5hbmNlIH0+O1xuICBjb25mbGljdHM6IEFnZ3JlZ2F0aW9uQ29uZmxpY3RbXTtcbn07XG5cbmNvbnN0IFNVQkZPTERFUlMgPSBbXCJwcm9tcHRzXCIsIFwicmVzb3VyY2VzXCIsIFwidGVtcGxhdGVzXCIsIFwidG9vbHNcIl07XG5jb25zdCBJTkRFWF9DQU5ESURBVEVTID0gW1xuICBcImluZGV4LnRzXCIsXG4gIFwiaW5kZXgudHN4XCIsXG4gIFwiaW5kZXguanNcIixcbiAgXCJpbmRleC5janNcIixcbiAgXCJpbmRleC5tanNcIixcbl07XG5cbmZ1bmN0aW9uIGZpbmRJbmRleEZpbGUoZm9sZGVyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGMgb2YgSU5ERVhfQ0FORElEQVRFUykge1xuICAgIGNvbnN0IGYgPSBwYXRoLmpvaW4oZm9sZGVyLCBjKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhmKSkgcmV0dXJuIGY7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbWFrZUtleUZvckl0ZW0oaXRlbTogYW55KTogc3RyaW5nIHtcbiAgaWYgKCFpdGVtKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkoaXRlbSk7XG4gIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGBzdHI6JHtpdGVtfWA7XG4gIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGBudW06JHtpdGVtfWA7XG4gIGlmIChpdGVtLmlkKSByZXR1cm4gYGlkOiR7aXRlbS5pZH1gO1xuICBpZiAoaXRlbS5uYW1lKSByZXR1cm4gYG5hbWU6JHtpdGVtLm5hbWV9YDtcbiAgLy8gZmFsbGJhY2sgdG8gc3RhYmxlIHN0cmluZ1xuICB0cnkge1xuICAgIHJldHVybiBgb2JqOiR7SlNPTi5zdHJpbmdpZnkoaXRlbSl9YDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBgb2JqOiR7U3RyaW5nKGl0ZW0pfWA7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZEFycmF5RnJvbUluZGV4KFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPGFueVtdIHwgdW5kZWZpbmVkPiB7XG4gIC8vIFByZWZlciBhIGZhc3QsIHN0YXRpYyBwYXJzZSBvZiB0aGUgZmlyc3QgYXJyYXkgbGl0ZXJhbCBmb3VuZCBpbiB0aGUgZmlsZS5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCBcInV0ZjhcIik7XG4gICAgY29uc3Qgc3RhcnQgPSBjb250ZW50LmluZGV4T2YoXCJbXCIpO1xuICAgIGlmIChzdGFydCAhPT0gLTEpIHtcbiAgICAgIGxldCBkZXB0aCA9IDA7XG4gICAgICBsZXQgZW5kID0gLTE7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoID0gY29udGVudFtpXTtcbiAgICAgICAgaWYgKGNoID09PSBcIltcIikgZGVwdGgrKztcbiAgICAgICAgZWxzZSBpZiAoY2ggPT09IFwiXVwiKSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICAgIGVuZCA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlbmQgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IGFyclRleHQgPSBjb250ZW50LnNsaWNlKHN0YXJ0LCBlbmQgKyAxKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShhcnJUZXh0KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIE5vcm1hbGl6ZSBUUyBvYmplY3QgbGl0ZXJhbHMgdG8gSlNPTjpcbiAgICAgICAgICAvLyAtIGNvbnZlcnQgc2luZ2xlIHF1b3RlcyB0byBkb3VibGUgcXVvdGVzXG4gICAgICAgICAgLy8gLSBxdW90ZSB1bnF1b3RlZCBvYmplY3Qga2V5c1xuICAgICAgICAgIC8vIC0gc3RyaXAgdHJhaWxpbmcgY29tbWFzXG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGFyclRleHRcbiAgICAgICAgICAgIC8vIHVuaWZ5IHF1b3RlcyBpbiBzdHJpbmcgbGl0ZXJhbHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC8nKD86XFxcXCd8W14nXSkqJy9nLCAobSkgPT4gbS5yZXBsYWNlKC8nL2csICdcIicpKVxuICAgICAgICAgICAgLy8gcXVvdGUgdW5xdW90ZWQga2V5cyBhZnRlciB7IG9yICxcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oW1xceyxdXFxzKikoW0EtWmEtel8kXVtcXHckXSopKFxccyo6KS9nLCAnJDFcIiQyXCIkMycpXG4gICAgICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgY29tbWFzIGJlZm9yZSBdIG9yIH1cbiAgICAgICAgICAgIC5yZXBsYWNlKC8sKFxccypbXFx9XFxdXSkvZywgJyQxJyk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKG5vcm1hbGl6ZWQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaCB0byBpbXBvcnQgYXR0ZW1wdCBiZWxvd1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGlnbm9yZSBzdGF0aWMgcGFyc2UgZXJyb3JzIGFuZCBmYWxsIGJhY2sgdG8gaW1wb3J0XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGZpbGVVcmwgPSBwYXRoVG9GaWxlVVJMKGZpbGVQYXRoKS5ocmVmO1xuICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChmaWxlVXJsKTtcbiAgICAvLyBGaW5kIGZpcnN0IGV4cG9ydCB0aGF0IGlzIGFuIGFycmF5XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobW9kKSkge1xuICAgICAgY29uc3QgdmFsID0gKG1vZCBhcyBhbnkpW2tleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gdmFsO1xuICAgIH1cbiAgICAvLyBkZWZhdWx0IGV4cG9ydCBjaGVja1xuICAgIGlmIChBcnJheS5pc0FycmF5KChtb2QgYXMgYW55KS5kZWZhdWx0KSkgcmV0dXJuIChtb2QgYXMgYW55KS5kZWZhdWx0O1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIGZhbGxiYWNrOiBpZiBpbXBvcnQgZmFpbHMsIHRyeSB0byBzdGF0aWMtcGFyc2UgYWdhaW4gKGFscmVhZHkgYXR0ZW1wdGVkKSBhbmQgZmluYWxseSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWdncmVnYXRlTW9kdWxlcyhcbiAgcmVwb1Jvb3Q6IHN0cmluZ1xuKTogUHJvbWlzZTxBZ2dyZWdhdGlvblJlc3VsdD4ge1xuICBjb25zdCBkaXJzID0gZmluZE1vZHVsZURpcnMocmVwb1Jvb3QpO1xuICBjb25zdCBtYXN0ZXIgPSB7XG4gICAgcHJvbXB0czogW10gYXMgYW55W10sXG4gICAgcmVzb3VyY2VzOiBbXSBhcyBhbnlbXSxcbiAgICB0ZW1wbGF0ZXM6IFtdIGFzIGFueVtdLFxuICAgIHRvb2xzOiBbXSBhcyBhbnlbXSxcbiAgICBjb25mbGljdHM6IFtdIGFzIEFnZ3JlZ2F0aW9uQ29uZmxpY3RbXSxcbiAgfTtcblxuICAvLyBtYXBzIHRvIGRldGVjdCBkdXBsaWNhdGVzIHBlciB0eXBlXG4gIGNvbnN0IG1hcHM6IFJlY29yZDxzdHJpbmcsIE1hcDxzdHJpbmcsIFByb3ZlbmFuY2U+PiA9IHtcbiAgICBwcm9tcHRzOiBuZXcgTWFwKCksXG4gICAgcmVzb3VyY2VzOiBuZXcgTWFwKCksXG4gICAgdGVtcGxhdGVzOiBuZXcgTWFwKCksXG4gICAgdG9vbHM6IG5ldyBNYXAoKSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IG1vZHVsZURpciBvZiBkaXJzKSB7XG4gICAgY29uc3QgbW9kdWxlTmFtZSA9IHBhdGguYmFzZW5hbWUobW9kdWxlRGlyKTtcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiBTVUJGT0xERVJTKSB7XG4gICAgICBjb25zdCBmb2xkZXIgPSBwYXRoLmpvaW4obW9kdWxlRGlyLCBzdWIpO1xuICAgICAgY29uc3QgaW5kZXhGaWxlID0gZmluZEluZGV4RmlsZShmb2xkZXIpO1xuICAgICAgaWYgKCFpbmRleEZpbGUpIGNvbnRpbnVlO1xuICAgICAgbGV0IGFycjogYW55W10gfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBhcnIgPSBhd2FpdCBsb2FkQXJyYXlGcm9tSW5kZXgoaW5kZXhGaWxlKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIC8vIHNraXAgbW9kdWxlIG9uIGltcG9ydCBlcnJvciBidXQgcmVjb3JkIGFzIGNvbmZsaWN0LWxpa2UgaXNzdWVcbiAgICAgICAgbWFzdGVyLmNvbmZsaWN0cy5wdXNoKHtcbiAgICAgICAgICBrZXk6IGBpbXBvcnQtZXJyb3I6JHttb2R1bGVOYW1lfToke3N1Yn1gLFxuICAgICAgICAgIGV4aXN0aW5nOiB7IG1vZHVsZU5hbWUsIG1vZHVsZVBhdGg6IG1vZHVsZURpciB9LFxuICAgICAgICAgIGluY29taW5nOiB7IG1vZHVsZU5hbWUsIG1vZHVsZVBhdGg6IG1vZHVsZURpciB9LFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWFyciB8fCAhQXJyYXkuaXNBcnJheShhcnIpKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFycikge1xuICAgICAgICBjb25zdCBrZXkgPSBtYWtlS2V5Rm9ySXRlbShpdGVtKTtcbiAgICAgICAgY29uc3QgcHJvdmVuYW5jZSA9IHsgbW9kdWxlTmFtZSwgbW9kdWxlUGF0aDogbW9kdWxlRGlyIH07XG4gICAgICAgIGNvbnN0IG1hcCA9IG1hcHNbc3ViXTtcbiAgICAgICAgaWYgKG1hcC5oYXMoa2V5KSkge1xuICAgICAgICAgIC8vIHJlY29yZCBjb25mbGljdCBkZXRlcm1pbmlzdGljYWxseSAoZXhpc3RpbmcgdnMgaW5jb21pbmcpXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBtYXAuZ2V0KGtleSkhO1xuICAgICAgICAgIG1hc3Rlci5jb25mbGljdHMucHVzaCh7IGtleSwgZXhpc3RpbmcsIGluY29taW5nOiBwcm92ZW5hbmNlIH0pO1xuICAgICAgICAgIC8vIHNraXAgYWRkaW5nIGR1cGxpY2F0ZVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1hcC5zZXQoa2V5LCBwcm92ZW5hbmNlKTtcbiAgICAgICAgKG1hc3RlciBhcyBhbnkpW3N1Yl0ucHVzaCh7IC4uLml0ZW0sIHByb3ZlbmFuY2UgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hc3Rlcjtcbn1cblxuLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBDb21tb25KUyBjYWxsIHNpdGVzIChub3QgZXhwb3J0ZWQgYnkgRVNNKSwgcHJvdmlkZSBhIHN5bmMgd3JhcHBlclxuZXhwb3J0IGZ1bmN0aW9uIGFnZ3JlZ2F0ZU1vZHVsZXNTeW5jKHJlcG9Sb290OiBzdHJpbmcpIHtcbiAgLy8gc3luY2hyb25vdXMgd3JhcHBlciB0aGF0IHJ1bnMgdGhlIGFzeW5jIGZ1bmN0aW9uIGFuZCBibG9ja3Mg4oCUIHN1aXRhYmxlIGZvciBzbWFsbCBtb2R1bGUgc2V0c1xuICBjb25zdCBwID0gYWdncmVnYXRlTW9kdWxlcyhyZXBvUm9vdCk7XG4gIGxldCByZXN1bHQ6IGFueTtcbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgcC50aGVuKChyKSA9PiB7XG4gICAgcmVzdWx0ID0gcjtcbiAgICBkb25lID0gdHJ1ZTtcbiAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICB0aHJvdyBlO1xuICB9KTtcbiAgLy8gc3Bpbi13YWl0IChhY2NlcHRhYmxlIGluIHNtYWxsIGRldiBzY3JpcHRzKVxuICBjb25zdCB1bnRpbCA9IERhdGUubm93KCkgKyA1MDAwO1xuICB3aGlsZSAoIWRvbmUgJiYgRGF0ZS5ub3coKSA8IHVudGlsKSB7fVxuICBpZiAoIWRvbmUpXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJhZ2dyZWdhdGVNb2R1bGVzU3luYzogdGltZW91dCB3YWl0aW5nIGZvciBhc3luYyBhZ2dyZWdhdGlvblwiXG4gICAgKTtcbiAgcmV0dXJuIHJlc3VsdCBhcyBBZ2dyZWdhdGlvblJlc3VsdDtcbn1cbiIsImltcG9ydCB7IGFnZ3JlZ2F0ZU1vZHVsZXMgfSBmcm9tIFwiLi9hZ2dyZWdhdGVNb2R1bGVzXCI7XG5pbXBvcnQgeyBsb2FkUHJvbXB0cywgcHJvbXB0TGlzdCB9IGZyb20gXCIuL3Byb21wdHMvaW5kZXhcIjtcbmltcG9ydCB7IHRvb2xMaXN0IH0gZnJvbSBcIi4vdG9vbHMvaW5kZXhcIjtcbmltcG9ydCB7IHJlc291cmNlcyB9IGZyb20gXCIuL3Jlc291cmNlcy9pbmRleFwiO1xuaW1wb3J0IHsgYnVpbGRSZXNvdXJjZVRlbXBsYXRlcyB9IGZyb20gXCIuL3RlbXBsYXRlcy9pbmRleFwiO1xuXG5leHBvcnQgdHlwZSBGYXN0TUNQTGlrZSA9IHtcbiAgYWRkUHJvbXB0OiAocDogYW55KSA9PiB2b2lkO1xuICBhZGRUb29sOiAodDogYW55KSA9PiB2b2lkO1xuICBhZGRSZXNvdXJjZTogKHI6IGFueSkgPT4gdm9pZDtcbiAgYWRkUmVzb3VyY2VUZW1wbGF0ZTogKHQ6IGFueSkgPT4gdm9pZDtcbn07XG5cbi8qKlxuICogQWdncmVnYXRlIG1vZHVsZSBhc3NldHMgYW5kIHJlZ2lzdGVyIHRoZW0gb24gdGhlIHByb3ZpZGVkIEZhc3RNQ1AtbGlrZSBzZXJ2ZXIuXG4gKiBGYWxscyBiYWNrIHRvIGJ1aWx0LWluIGxpc3RzIGlmIGFnZ3JlZ2F0aW9uIHlpZWxkcyBub25lLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gRW5yaWNoQ29yZVdpdGhBZ2dyZWdhdGlvbihcbiAgc2VydmVyOiBGYXN0TUNQTGlrZSxcbiAgcmVwb1Jvb3QgPSBwcm9jZXNzLmN3ZCgpXG4pIHtcbiAgLy8gRmlyc3QgcmVnaXN0ZXIgYnVpbHQtaW4gcHJvbXB0cy90b29scy9yZXNvdXJjZXMvdGVtcGxhdGVzIChsZWdhY3kgYmVoYXZpb3IpXG4gIHRyeSB7XG4gICAgbG9hZFByb21wdHMoKTtcbiAgICBmb3IgKGNvbnN0IHByb21wdCBvZiBwcm9tcHRMaXN0KSBzZXJ2ZXIuYWRkUHJvbXB0KHByb21wdCBhcyBhbnkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gaWdub3JlIGlmIGxvYWRQcm9tcHRzIG5vdCBhdmFpbGFibGUgb3IgZmFpbHNcbiAgfVxuXG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCB0b29sIG9mIHRvb2xMaXN0KSBzZXJ2ZXIuYWRkVG9vbCh0b29sIGFzIGFueSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykgc2VydmVyLmFkZFJlc291cmNlKHJlc291cmNlIGFzIGFueSk7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB0ZW1wbGF0ZXMgPSBidWlsZFJlc291cmNlVGVtcGxhdGVzKCk7XG4gICAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiB0ZW1wbGF0ZXMpXG4gICAgICBzZXJ2ZXIuYWRkUmVzb3VyY2VUZW1wbGF0ZSh0ZW1wbGF0ZSBhcyBhbnkpO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIC8vIE5vdyBhZ2dyZWdhdGUgbW9kdWxlcyBhbmQgcmVnaXN0ZXIgYWdncmVnYXRlZCBhc3NldHMgd2l0aCBwcm92ZW5hbmNlXG4gIGNvbnN0IGFnZyA9IGF3YWl0IGFnZ3JlZ2F0ZU1vZHVsZXMocmVwb1Jvb3QpO1xuXG4gIGZvciAoY29uc3QgcCBvZiBhZ2cucHJvbXB0cykge1xuICAgIHNlcnZlci5hZGRQcm9tcHQocCk7XG4gIH1cbiAgZm9yIChjb25zdCB0IG9mIGFnZy50b29scykge1xuICAgIHNlcnZlci5hZGRUb29sKHQpO1xuICB9XG4gIGZvciAoY29uc3QgciBvZiBhZ2cucmVzb3VyY2VzKSB7XG4gICAgc2VydmVyLmFkZFJlc291cmNlKHIpO1xuICB9XG4gIGZvciAoY29uc3QgdHBsIG9mIGFnZy50ZW1wbGF0ZXMpIHtcbiAgICBzZXJ2ZXIuYWRkUmVzb3VyY2VUZW1wbGF0ZSh0cGwpO1xuICB9XG5cbiAgLy8gcmV0dXJuIGFnZ3JlZ2F0aW9uIHN1bW1hcnkgZm9yIGNhbGxpbmcgdGVzdHMvQ0lcbiAgcmV0dXJuIHtcbiAgICBtb2R1bGVzQ2hlY2tlZDogYWdnLnByb21wdHMuY29uY2F0KGFnZy50b29scykubGVuZ3RoLFxuICAgIGNvbmZsaWN0czogYWdnLmNvbmZsaWN0cyxcbiAgfTtcbn1cbiIsImltcG9ydCB7IEZhc3RNQ1AgfSBmcm9tIFwiZmFzdG1jcFwiO1xuaW1wb3J0IHsgbG9hZFByb21wdHMsIHByb21wdExpc3QgfSBmcm9tIFwiLi9wcm9tcHRzL2luZGV4XCI7XG5pbXBvcnQgeyB0b29sTGlzdCB9IGZyb20gXCIuL3Rvb2xzL2luZGV4XCI7XG5pbXBvcnQgeyByZXNvdXJjZXMgfSBmcm9tIFwiLi9yZXNvdXJjZXMvaW5kZXhcIjtcbmltcG9ydCB7IGJ1aWxkUmVzb3VyY2VUZW1wbGF0ZXMgfSBmcm9tIFwiLi90ZW1wbGF0ZXMvaW5kZXhcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vbWNwLW1vZHVsZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gXCIuL21jcC1tb2R1bGVcIjtcblxuZXhwb3J0IHsgdmFsaWRhdGVNb2R1bGVzIH0gZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuZXhwb3J0IHsgYWdncmVnYXRlTW9kdWxlcywgYWdncmVnYXRlTW9kdWxlc1N5bmMgfSBmcm9tIFwiLi9hZ2dyZWdhdGVNb2R1bGVzXCI7XG5leHBvcnQgeyBFbnJpY2hDb3JlV2l0aEFnZ3JlZ2F0aW9uIH0gZnJvbSBcIi4vZmFzdG1jcC13aXJpbmdcIjtcblxuLy8gcmUtZXhwb3J0IGhlbHBlcnMgdXNlZCBieSB0ZXN0cyBhbmQgb3RoZXIgbW9kdWxlc1xuZXhwb3J0IHsgYnVpbGREb2NQcm9tcHRzIH0gZnJvbSBcIi4vcHJvbXB0cy9pbmRleFwiO1xuZXhwb3J0IHsgYnVpbGRSZXNvdXJjZVRlbXBsYXRlcyB9IGZyb20gXCIuL3RlbXBsYXRlcy9pbmRleFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gRW5yaWNoQ29yZShzZXJ2ZXI6IEZhc3RNQ1ApIHtcbiAgbG9hZFByb21wdHMoKTtcbiAgZm9yIChjb25zdCBwcm9tcHQgb2YgcHJvbXB0TGlzdCkge1xuICAgIHNlcnZlci5hZGRQcm9tcHQocHJvbXB0IGFzIGFueSk7XG4gIH1cbiAgZm9yIChjb25zdCB0b29sIG9mIHRvb2xMaXN0KSB7XG4gICAgc2VydmVyLmFkZFRvb2wodG9vbCBhcyBhbnkpO1xuICB9XG4gIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG4gICAgc2VydmVyLmFkZFJlc291cmNlKHJlc291cmNlIGFzIGFueSk7XG4gIH1cbiAgY29uc3QgdGVtcGxhdGVzID0gYnVpbGRSZXNvdXJjZVRlbXBsYXRlcygpO1xuICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIHRlbXBsYXRlcykge1xuICAgIHNlcnZlci5hZGRSZXNvdXJjZVRlbXBsYXRlKHRlbXBsYXRlIGFzIGFueSk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlUm9vdCB9IGZyb20gXCIuLi9tY3Avd29ya3NwYWNlXCI7XG5cbmV4cG9ydCBjb25zdCBSRVFVSVJFRF9NT0RVTEVfRk9MREVSUyA9IFtcbiAgXCJwcm9tcHRzXCIsXG4gIFwicmVzb3VyY2VzXCIsXG4gIFwidGVtcGxhdGVzXCIsXG4gIFwidG9vbHNcIixcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIE1vZHVsZUZvbGRlciA9ICh0eXBlb2YgUkVRVUlSRURfTU9EVUxFX0ZPTERFUlMpW251bWJlcl07XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kdWxlc1Jvb3Qod29ya3NwYWNlUm9vdCA9IGdldFdvcmtzcGFjZVJvb3QoKSk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnJlc29sdmUod29ya3NwYWNlUm9vdCwgXCJzcmMvbW9kdWxlc1wiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RNb2R1bGVEaXJlY3Rvcmllcyh3b3Jrc3BhY2VSb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpKTogc3RyaW5nW10ge1xuICBjb25zdCByb290ID0gcmVzb2x2ZU1vZHVsZXNSb290KHdvcmtzcGFjZVJvb3QpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocm9vdCkpIHJldHVybiBbXTtcblxuICByZXR1cm4gZnNcbiAgICAucmVhZGRpclN5bmMocm9vdClcbiAgICAubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIGVudHJ5LFxuICAgICAgYWJzb2x1dGU6IHBhdGguam9pbihyb290LCBlbnRyeSksXG4gICAgfSkpXG4gICAgLmZpbHRlcigoeyBhYnNvbHV0ZSB9KSA9PiBmcy5zdGF0U3luYyhhYnNvbHV0ZSkuaXNEaXJlY3RvcnkoKSlcbiAgICAubWFwKCh7IGVudHJ5IH0pID0+IGVudHJ5KVxuICAgIC5zb3J0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kdWxlUGF0aChcbiAgbW9kdWxlTmFtZTogc3RyaW5nLFxuICB3b3Jrc3BhY2VSb290ID0gZ2V0V29ya3NwYWNlUm9vdCgpXG4pOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKHJlc29sdmVNb2R1bGVzUm9vdCh3b3Jrc3BhY2VSb290KSwgbW9kdWxlTmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kdWxlRm9sZGVyUGF0aChcbiAgbW9kdWxlTmFtZTogc3RyaW5nLFxuICBmb2xkZXI6IE1vZHVsZUZvbGRlcixcbiAgd29ya3NwYWNlUm9vdCA9IGdldFdvcmtzcGFjZVJvb3QoKVxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihyZXNvbHZlTW9kdWxlUGF0aChtb2R1bGVOYW1lLCB3b3Jrc3BhY2VSb290KSwgZm9sZGVyKTtcbn1cbiIsIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgTWNwTW9kdWxlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVXRpbGl0eSBjbGFzcyBmb3IgQ0xJIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IEEgc3RhdGljIHV0aWxpdHkgY2xhc3MgdGhhdCBwcm92aWRlcyBtZXRob2RzIGZvciBsb2FkaW5nIG1vZHVsZXMsIHJldHJpZXZpbmcgcGFja2FnZSBpbmZvcm1hdGlvbiwgYW5kIGluaXRpYWxpemluZyBDTEkgY29tbWFuZHNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSW5pdGlhbGl6ZSBhIENvbW1hbmQgb2JqZWN0IHdpdGggcGFja2FnZSBpbmZvcm1hdGlvblxuICogY29uc3QgY29tbWFuZCA9IG5ldyBDb21tYW5kKCk7XG4gKiBDTElVdGlscy5pbml0aWFsaXplKGNvbW1hbmQsICcuL3BhdGgvdG8vcGFja2FnZScpO1xuICpcbiAqIC8vIExvYWQgYSBDTEkgbW9kdWxlIGZyb20gYSBmaWxlXG4gKiBjb25zdCBtb2R1bGUgPSBhd2FpdCBDTElVdGlscy5sb2FkRnJvbUZpbGUoJy4vcGF0aC90by9jbGktbW9kdWxlLmpzJyk7XG4gKlxuICogQGNsYXNzIE1jcFV0aWxzXG4gKi9cbmV4cG9ydCBjbGFzcyBNY3BVdGlscyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRHluYW1pY2FsbHkgaW1wb3J0cyBhIG1vZHVsZSBmaWxlXG4gICAqIEBzdW1tYXJ5IExvYWRzIGEgSmF2YVNjcmlwdCBmaWxlIGFuZCByZXR1cm5zIGl0IGFzIGEgQ2xpTW9kdWxlLCBoYW5kbGluZyBib3RoIEVTTSBhbmQgQ29tbW9uSlMgZm9ybWF0c1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgZmlsZSBwYXRoIHRvIHRoZSBtb2R1bGUgdG8gbG9hZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1jcE1vZHVsZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBsb2FkZWQgQ2xpTW9kdWxlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgbG9hZEZyb21GaWxlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8TWNwTW9kdWxlPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBNY3BVdGlscy5ub3JtYWxpemVJbXBvcnQoaW1wb3J0KHBhdGgpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gbG9hZCBmcm9tICR7cGF0aH06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogZX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm9ybWFsaXplcyBtb2R1bGUgaW1wb3J0cyB0byBoYW5kbGUgYm90aCBFU00gYW5kIENvbW1vbkpTIGZvcm1hdHNcbiAgICogQHN1bW1hcnkgUHJvcGVybHkgaW1wb3J0cyBKYXZhU2NyaXB0IGZpbGVzIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgbW9kdWxlIGZvcm1hdCBieSBoYW5kbGluZyB0aGUgRVNNIHdyYXBwZXIgZm9yIENvbW1vbkpTIG1vZHVsZXNcbiAgICpcbiAgICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGltcG9ydGVkIG1vZHVsZVxuICAgKiBAcGFyYW0ge1Byb21pc2U8VD59IGltcG9ydFByb21pc2UgVGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGR5bmFtaWMgaW1wb3J0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8VD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBub3JtYWxpemVkIG1vZHVsZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIG5vcm1hbGl6ZUltcG9ydDxUPihpbXBvcnRQcm9taXNlOiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgLy8gQ29tbW9uSlMncyBgbW9kdWxlLmV4cG9ydHNgIGlzIHdyYXBwZWQgYXMgYGRlZmF1bHRgIGluIEVTTW9kdWxlLlxuICAgIHJldHVybiBpbXBvcnRQcm9taXNlLnRoZW4oXG4gICAgICAobTogdW5rbm93bikgPT4gKChtIGFzIHsgZGVmYXVsdDogVCB9KS5kZWZhdWx0IHx8IG0pIGFzIFRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIHBhcnNlcyB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGZyb20gdGhlIHNwZWNpZmllZCBwYXRoIGFuZCBwYXJzZXMgaXQgaW50byBhIEphdmFTY3JpcHQgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUaGUgcGFyc2VkIHBhY2thZ2UuanNvbiBjb250ZW50IGFzIGFuIG9iamVjdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UGFja2FnZShiYXNlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihiYXNlUGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmOFwiKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZWFkIHZlcnNpb24gZnJvbSAke2Jhc2VQYXRofTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvblxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHZlcnNpb24gZmllbGQgZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhY2thZ2UgdmVyc2lvbiBzdHJpbmdcbiAgICovXG4gIHN0YXRpYyBwYWNrYWdlVmVyc2lvbihiYXNlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gTWNwVXRpbHMuZ2V0UGFja2FnZShiYXNlUGF0aClbXCJ2ZXJzaW9uXCJdIGFzIHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgbmFtZSBmcm9tIHBhY2thZ2UuanNvblxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG5hbWUgZmllbGQgZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGFuZCBleHRyYWN0cyB0aGUgcGFja2FnZSBuYW1lIHdpdGhvdXQgdGhlIHNjb3BlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhY2thZ2UgbmFtZSB3aXRob3V0IHRoZSBzY29wZSAoZS5nLiwgXCJjbGlcIiBmcm9tIFwiQGRlY2FmLXRzL2NsaVwiKVxuICAgKi9cbiAgc3RhdGljIHBhY2thZ2VOYW1lKGJhc2VQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSAoTWNwVXRpbHMuZ2V0UGFja2FnZShiYXNlUGF0aClbXCJuYW1lXCJdIGFzIHN0cmluZykuc3BsaXQoXCIvXCIpO1xuICAgIHJldHVybiBuYW1lW25hbWUubGVuZ3RoIC0gMV07XG4gIH1cbn1cblxuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvbW9kdWxlUGF0aHNcIjtcbiIsImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgTUNQX0ZJTEVfTkFNRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTWNwVXRpbHMgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgRmFzdE1DUCB9IGZyb20gXCJmYXN0bWNwXCI7XG5pbXBvcnQgeyBMb2dnZWRDbGFzcyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gXCIuL21ldGFkYXRhXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcInVybFwiO1xuXG4vLyBhbGxvdyByZWZlcmVuY2luZyBfX2ZpbGVuYW1lL19fZGlybmFtZSBpbiBib3RoIENvbW1vbkpTIGFuZCBFU00gcnVudGltZXNcbmRlY2xhcmUgY29uc3QgX19maWxlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuZGVjbGFyZSBjb25zdCBfX2Rpcm5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgQ0xJIGZ1bmN0aW9uYWxpdHkgZnJvbSBhbGwgRGVjYWYgbW9kdWxlc1xuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIENvbW1hbmRlci5qcyB0byBoYW5kbGUgQ0xJIGNvbW1hbmRzIGZyb20gZGlmZmVyZW50IERlY2FmIG1vZHVsZXMuXG4gKiBJdCBjcmF3bHMgdGhlIGZpbGVzeXN0ZW0gdG8gZmluZCBDTEkgbW9kdWxlcywgbG9hZHMgdGhlbSwgYW5kIHJlZ2lzdGVycyB0aGVpciBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE1jcFdyYXBwZXIgZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gIHByaXZhdGUgX21jcD86IEZhc3RNQ1A7XG4gIHByaXZhdGUgbW9kdWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiYXNlUGF0aDogc3RyaW5nID0gXCIuL1wiLFxuICAgIHByaXZhdGUgY3Jhd2xMZXZlbHMgPSA0XG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gU3VwcG9ydCBib3RoIENvbW1vbkpTIGFuZCBFU00gcnVudGltZXMgZm9yIGZpbGVuYW1lL2Rpcm5hbWVcbiAgICBsZXQgbG9jYWxEaXJuYW1lOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBfX2Rpcm5hbWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIC8vIENvbW1vbkpTIGVudmlyb25tZW50XG4gICAgICBsb2NhbERpcm5hbWUgPSBfX2Rpcm5hbWUgYXMgc3RyaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFU00gb3Igb3RoZXIgZW52OiBjb21wdXRlIGltcG9ydC5tZXRhLnVybCBhdCBydW50aW1lIHRvIGF2b2lkIFRTIGNvbXBpbGUtdGltZSBpbXBvcnQubWV0YSBjaGVja3NcbiAgICAgIGxldCBtZXRhVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBVc2UgYSBkeW5hbWljIGZ1bmN0aW9uIHNvIFR5cGVTY3JpcHQgd29uJ3QgcGFyc2UgYGltcG9ydC5tZXRhYCBhdCBjb21waWxlIHRpbWVcbiAgICAgICAgY29uc3QgZm4gPSBuZXcgRnVuY3Rpb24oXG4gICAgICAgICAgJ3JldHVybiAodHlwZW9mIGltcG9ydCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgaW1wb3J0Lm1ldGEgIT09IFwidW5kZWZpbmVkXCIpID8gaW1wb3J0Lm1ldGEudXJsIDogdW5kZWZpbmVkOydcbiAgICAgICAgKTtcbiAgICAgICAgbWV0YVVybCA9IGZuKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgbWV0YVVybCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhVXJsKSB7XG4gICAgICAgIGxvY2FsRGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKG1ldGFVcmwpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIExhc3QtcmVzb3J0IGZhbGxiYWNrOiB1c2UgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeVxuICAgICAgICBsb2NhbERpcm5hbWUgPSBwcm9jZXNzLmN3ZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGxvY2FsRGlybmFtZSwgXCIuLlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFuZCBpbml0aWFsaXplcyB0aGUgQ29tbWFuZGVyIENvbW1hbmQgb2JqZWN0XG4gICAqIEBzdW1tYXJ5IExhenktbG9hZHMgdGhlIENvbW1hbmQgb2JqZWN0LCBpbml0aWFsaXppbmcgaXQgd2l0aCB0aGUgcGFja2FnZSBuYW1lLCBkZXNjcmlwdGlvbiwgYW5kIHZlcnNpb25cbiAgICogQHJldHVybiB7RmFzdE1DUH0gVGhlIGluaXRpYWxpemVkIENvbW1hbmQgb2JqZWN0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldCBtY3AoKSB7XG4gICAgaWYgKCF0aGlzLl9tY3ApIHtcbiAgICAgIHRoaXMuX21jcCA9IG5ldyBGYXN0TUNQKHtcbiAgICAgICAgbmFtZTogXCJkZWNhZi10cyBNQ1Agc2VydmVyXCIsXG4gICAgICAgIGluc3RydWN0aW9uczogXCJcIixcbiAgICAgICAgdmVyc2lvbjogVkVSU0lPTiBhcyBhbnksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX21jcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9hZHMgYW5kIHJlZ2lzdGVycyBhbiBtY3AgZXh0ZW5zaW9uIG1vZHVsZSBmcm9tIGEgZmlsZVxuICAgKiBAc3VtbWFyeSBEeW5hbWljYWxseSBpbXBvcnRzIGFuIG1jcCBleHRlbnNpb24gbW9kdWxlIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlIHBhdGgsIGluaXRpYWxpemVzIGl0LCBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBtb2R1bGVzIGNvbGxlY3Rpb25cbiAgICpcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZChcbiAgICBzZXJ2ZXI6IEZhc3RNQ1AsXG4gICAgZmlsZVBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPHsgbWNwOiBGYXN0TUNQOyBwYWNrYWdlOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9PiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMubG9hZCk7XG5cbiAgICBsZXQgcGtnOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgZW5yaWNoOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IE1jcFV0aWxzLmxvYWRGcm9tRmlsZShmaWxlUGF0aCk7XG4gICAgICBwa2cgPSByZXMuUEFDS0FHRV9OQU1FO1xuICAgICAgdmVyc2lvbiA9IHJlcy5WRVJTSU9OO1xuICAgICAgZW5yaWNoID0gcmVzLmVucmljaDtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKGUgYXMgYW55KS5tZXNzYWdlIHx8IChlIGFzIGFueSkpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbG9nLmluZm8oYEVucmljaGluZyBtY3Agc2VydmVyIHdpdGggbW9kdWxlICR7cGtnfSB2JHt2ZXJzaW9ufWApO1xuICAgICAgY29uc3QgcmVzdWx0ID0gZW5yaWNoKHNlcnZlcik7XG4gICAgICBzZXJ2ZXIgPSByZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlID8gYXdhaXQgcmVzdWx0IDogcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGZhaWxlZCB0byBlbnJpY2ggbWNwIHdpdGggbW9kdWxlICR7cGtnIHx8IFwidW5uYW1lZFwifSB1bmRlciAke2ZpbGVQYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBtY3A6IHNlcnZlcixcbiAgICAgIHBhY2thZ2U6IHBrZyxcbiAgICAgIHZlcnNpb246IHZlcnNpb24sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmluZHMgYW5kIGxvYWRzIGFsbCBDTEkgbW9kdWxlcyBpbiB0aGUgYmFzZVBhdGhcbiAgICogQHN1bW1hcnkgVXNlcyB0aGUgY3Jhd2wgbWV0aG9kIHRvIGZpbmQgYWxsIENMSSBtb2R1bGVzIGluIHRoZSBzcGVjaWZpZWQgYmFzZSBwYXRoLFxuICAgKiB0aGVuIGxvYWRzIGFuZCByZWdpc3RlcnMgZWFjaCBtb2R1bGUgYXMgYSBzdWJjb21tYW5kXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG1vZHVsZXMgYXJlIGxvYWRlZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGlXcmFwcGVyXG4gICAqICAgcGFydGljaXBhbnQgRmlsZXN5c3RlbVxuICAgKiAgIHBhcnRpY2lwYW50IE1vZHVsZVxuICAgKlxuICAgKiAgIENsaVdyYXBwZXItPj5GaWxlc3lzdGVtOiBKb2luIGJhc2VQYXRoIHdpdGggY3dkXG4gICAqICAgQ2xpV3JhcHBlci0+PkNsaVdyYXBwZXI6IGNyYXdsKGJhc2VQYXRoLCBjcmF3bExldmVscylcbiAgICogICBDbGlXcmFwcGVyLS0+PkNsaVdyYXBwZXI6IG1vZHVsZXNbXVxuICAgKiAgIGxvb3AgRm9yIGVhY2ggbW9kdWxlXG4gICAqICAgICBhbHQgTm90IEBkZWNhZi10cy9jbGlcbiAgICogICAgICAgQ2xpV3JhcHBlci0+PkNsaVdyYXBwZXI6IGxvYWQobW9kdWxlLCBjd2QpXG4gICAqICAgICAgIENsaVdyYXBwZXItLT4+Q2xpV3JhcHBlcjogbmFtZVxuICAgKiAgICAgICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogQ2hlY2sgaWYgY29tbWFuZCBleGlzdHNcbiAgICogICAgICAgYWx0IENvbW1hbmQgZG9lc24ndCBleGlzdFxuICAgKiAgICAgICAgIENsaVdyYXBwZXItPj5Db21tYW5kOiBjb21tYW5kKG5hbWUpLmFkZENvbW1hbmQobW9kdWxlc1tuYW1lXSlcbiAgICogICAgICAgZW5kXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICogICBDbGlXcmFwcGVyLT4+Q29uc29sZTogTG9nIGxvYWRlZCBtb2R1bGVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJvb3QoKSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuYm9vdCk7XG4gICAgbGV0IHNlcnZlciA9IHRoaXMubWNwO1xuICAgIC8vIGRpc2NvdmVyIG1vZHVsZXMgYnkgY3Jhd2xpbmcgYmFzZVBhdGhcbiAgICBjb25zdCBtb2R1bGVGaWxlcyA9IHRoaXMuY3Jhd2woXG4gICAgICBwYXRoLnJlc29sdmUodGhpcy5iYXNlUGF0aCksXG4gICAgICB0aGlzLmNyYXdsTGV2ZWxzXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IG1vZHVsZUZpbGUgb2YgbW9kdWxlRmlsZXMpIHtcbiAgICAgIGlmIChtb2R1bGVGaWxlLmluY2x1ZGVzKFwiQGRlY2FmLXRzL21jcFwiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubG9hZChzZXJ2ZXIsIG1vZHVsZUZpbGUpO1xuICAgICAgICBzZXJ2ZXIgPSByZXMubWNwO1xuICAgICAgICB0aGlzLm1vZHVsZXNbcmVzLnBhY2thZ2VdID0gbW9kdWxlRmlsZTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBNQ1AgY29uZmlncyBmb3IgJHttb2R1bGVGaWxlfTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgbG9hZGVkIG1vZHVsZXM6XFxuJHtPYmplY3Qua2V5cyh0aGlzLm1vZHVsZXMpXG4gICAgICAgIC5tYXAoKGspID0+IGAtICR7a31gKVxuICAgICAgICAuam9pbihcIlxcblwiKX1gXG4gICAgKTtcbiAgICByZXR1cm4gc2VydmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzZWFyY2hlcyBmb3IgQ0xJIG1vZHVsZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgKiBAc3VtbWFyeSBDcmF3bHMgdGhlIGJhc2VQYXRoIHVwIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGZvbGRlciBsZXZlbHMgdG8gZmluZCBmaWxlcyBuYW1lZCBhY2NvcmRpbmcgdG8gQ0xJX0ZJTEVfTkFNRVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVBhdGggVGhlIGFic29sdXRlIGJhc2UgcGF0aCB0byBzdGFydCBzZWFyY2hpbmcgaW5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsZXZlbHM9Ml0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGRpcmVjdG9yeSBsZXZlbHMgdG8gY3Jhd2xcbiAgICogQHJldHVybiB7c3RyaW5nW119IEFuIGFycmF5IG9mIGZpbGUgcGF0aHMgdG8gQ0xJIG1vZHVsZXNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY3Jhd2woYmFzZVBhdGg6IHN0cmluZywgbGV2ZWxzOiBudW1iZXIgPSAyKSB7XG4gICAgaWYgKGxldmVscyA8PSAwKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGZzLnJlYWRkaXJTeW5jKGJhc2VQYXRoKS5yZWR1Y2UoKGFjY3VtOiBzdHJpbmdbXSwgZmlsZSkgPT4ge1xuICAgICAgZmlsZSA9IHBhdGguam9pbihiYXNlUGF0aCwgZmlsZSk7XG4gICAgICBpZiAoZnMuc3RhdFN5bmMoZmlsZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBhY2N1bS5wdXNoKC4uLnRoaXMuY3Jhd2woZmlsZSwgbGV2ZWxzIC0gMSkpO1xuICAgICAgfSBlbHNlIGlmIChmaWxlLm1hdGNoKG5ldyBSZWdFeHAoYCR7TUNQX0ZJTEVfTkFNRX0uW2NtXT9qcyRgLCBcImdtXCIpKSkge1xuICAgICAgICBhY2N1bS5wdXNoKGZpbGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgdGhlIENMSSB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHNcbiAgICogQHN1bW1hcnkgQm9vdHMgdGhlIENMSSBieSBsb2FkaW5nIGFsbCBtb2R1bGVzLCB0aGVuIHBhcnNlcyBhbmQgZXhlY3V0ZXMgdGhlIGNvbW1hbmQgc3BlY2lmaWVkIGluIHRoZSBhcmd1bWVudHNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3M9cHJvY2Vzcy5hcmd2XSBDb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIHBhcnNlIGFuZCBleGVjdXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbW1hbmQgZXhlY3V0aW9uIGlzIGNvbXBsZXRlXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IENsaVdyYXBwZXJcbiAgICogICBwYXJ0aWNpcGFudCBDb21tYW5kXG4gICAqXG4gICAqICAgQ2xpZW50LT4+Q2xpV3JhcHBlcjogcnVuKGFyZ3MpXG4gICAqICAgQ2xpV3JhcHBlci0+PkNsaVdyYXBwZXI6IGJvb3QoKVxuICAgKiAgIE5vdGUgb3ZlciBDbGlXcmFwcGVyOiBMb2FkcyBhbGwgbW9kdWxlc1xuICAgKiAgIENsaVdyYXBwZXItPj5Db21tYW5kOiBwYXJzZUFzeW5jKGFyZ3MpXG4gICAqICAgQ29tbWFuZC0tPj5DbGlXcmFwcGVyOiByZXN1bHRcbiAgICogICBDbGlXcmFwcGVyLS0+PkNsaWVudDogcmVzdWx0XG4gICAqL1xuICBhc3luYyBydW4oYXJnczogc3RyaW5nW10gPSBwcm9jZXNzLmFyZ3YpIHtcbiAgICB2b2lkIGFyZ3M7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgdGhpcy5ib290KCk7XG4gICAgYXdhaXQgc2VydmVyLnN0YXJ0KHsgdHJhbnNwb3J0VHlwZTogXCJzdGRpb1wiIH0pO1xuICB9XG59XG4iXSwibmFtZXMiOlsicGF0aCIsImZzIiwidG9vbExpc3QiLCJjb3JlVG9vbExpc3QiLCJWRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwiUEtHIiwiViJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7O0FBTUc7QUFDSSxNQUFNLGFBQWEsR0FBRztBQUd0QixNQUFNLGtCQUFrQixHQUFHO01BQ3JCLGtCQUFrQixHQUFHLENBQUMsZUFBZSxFQUFFLGdCQUFnQjtBQUM3RCxNQUFNLG1CQUFtQixHQUFHO0FBQzVCLE1BQU0sbUJBQW1CLEdBQUc7QUFDakMsSUFBQTtBQUNFLFFBQUEsRUFBRSxFQUFFLFFBQVE7QUFDWixRQUFBLE9BQU8sRUFBRSxvQkFBb0I7QUFDN0IsUUFBQSxZQUFZLEVBQ1Ysb01BQW9NO0FBQ3ZNLEtBQUE7QUFDRCxJQUFBO0FBQ0UsUUFBQSxFQUFFLEVBQUUsUUFBUTtBQUNaLFFBQUEsT0FBTyxFQUFFLFFBQVE7QUFDakIsUUFBQSxZQUFZLEVBQ1YsaUxBQWlMO0FBQ3BMLEtBQUE7QUFDRCxJQUFBO0FBQ0UsUUFBQSxFQUFFLEVBQUUsU0FBUztBQUNiLFFBQUEsT0FBTyxFQUFFLGdCQUFnQjtBQUN6QixRQUFBLFlBQVksRUFDVixpTUFBaU07QUFDcE0sS0FBQTs7O0FDM0JILElBQUksYUFBYSxHQUFHLHVCQUF1QixFQUFFO0FBQzdDLElBQUksYUFBMkQ7QUFFekQsTUFBTyxjQUFlLFNBQVEsS0FBSyxDQUFBO0FBQ3ZDLElBQUEsV0FBQSxDQUFZLE9BQWUsRUFBQTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDO0FBQ2QsUUFBQSxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFnQjtJQUM5QjtBQUNEO0FBRUQsU0FBUyx1QkFBdUIsR0FBQTtJQUM5QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDO0lBQ2xELElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFN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
|