jsii-pacmak 1.57.0 → 1.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/jsii-pacmak.d.ts +1 -0
- package/bin/jsii-pacmak.d.ts.map +1 -0
- package/bin/jsii-pacmak.js +10 -10
- package/bin/jsii-pacmak.js.map +1 -0
- package/lib/builder.d.ts +1 -0
- package/lib/builder.d.ts.map +1 -0
- package/lib/builder.js +2 -2
- package/lib/builder.js.map +1 -0
- package/lib/dependency-graph.d.ts +1 -0
- package/lib/dependency-graph.d.ts.map +1 -0
- package/lib/dependency-graph.js +7 -11
- package/lib/dependency-graph.js.map +1 -0
- package/lib/generator.d.ts +1 -0
- package/lib/generator.d.ts.map +1 -0
- package/lib/generator.js +4 -6
- package/lib/generator.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +12 -7
- package/lib/index.js.map +1 -0
- package/lib/logging.d.ts +1 -0
- package/lib/logging.d.ts.map +1 -0
- package/lib/logging.js +1 -1
- package/lib/logging.js.map +1 -0
- package/lib/markdown.d.ts +1 -0
- package/lib/markdown.d.ts.map +1 -0
- package/lib/markdown.js +5 -9
- package/lib/markdown.js.map +1 -0
- package/lib/naming-util.d.ts +1 -0
- package/lib/naming-util.d.ts.map +1 -0
- package/lib/naming-util.js +1 -1
- package/lib/naming-util.js.map +1 -0
- package/lib/npm-modules.d.ts +1 -0
- package/lib/npm-modules.d.ts.map +1 -0
- package/lib/npm-modules.js +8 -9
- package/lib/npm-modules.js.map +1 -0
- package/lib/packaging.d.ts +1 -0
- package/lib/packaging.d.ts.map +1 -0
- package/lib/packaging.js +3 -4
- package/lib/packaging.js.map +1 -0
- package/lib/target.d.ts +1 -0
- package/lib/target.d.ts.map +1 -0
- package/lib/target.js +5 -7
- package/lib/target.js.map +1 -0
- package/lib/targets/_utils.d.ts +1 -0
- package/lib/targets/_utils.d.ts.map +1 -0
- package/lib/targets/_utils.js +4 -5
- package/lib/targets/_utils.js.map +1 -0
- package/lib/targets/dotnet/dotnetdocgenerator.d.ts +1 -0
- package/lib/targets/dotnet/dotnetdocgenerator.d.ts.map +1 -0
- package/lib/targets/dotnet/dotnetdocgenerator.js +8 -10
- package/lib/targets/dotnet/dotnetdocgenerator.js.map +1 -0
- package/lib/targets/dotnet/dotnetgenerator.d.ts +1 -0
- package/lib/targets/dotnet/dotnetgenerator.d.ts.map +1 -0
- package/lib/targets/dotnet/dotnetgenerator.js +11 -19
- package/lib/targets/dotnet/dotnetgenerator.js.map +1 -0
- package/lib/targets/dotnet/dotnetruntimegenerator.d.ts +1 -0
- package/lib/targets/dotnet/dotnetruntimegenerator.d.ts.map +1 -0
- package/lib/targets/dotnet/dotnetruntimegenerator.js +2 -3
- package/lib/targets/dotnet/dotnetruntimegenerator.js.map +1 -0
- package/lib/targets/dotnet/dotnettyperesolver.d.ts +1 -0
- package/lib/targets/dotnet/dotnettyperesolver.d.ts.map +1 -0
- package/lib/targets/dotnet/dotnettyperesolver.js +10 -14
- package/lib/targets/dotnet/dotnettyperesolver.js.map +1 -0
- package/lib/targets/dotnet/filegenerator.d.ts +1 -0
- package/lib/targets/dotnet/filegenerator.d.ts.map +1 -0
- package/lib/targets/dotnet/filegenerator.js +5 -5
- package/lib/targets/dotnet/filegenerator.js.map +1 -0
- package/lib/targets/dotnet/nameutils.d.ts +1 -0
- package/lib/targets/dotnet/nameutils.d.ts.map +1 -0
- package/lib/targets/dotnet/nameutils.js +3 -3
- package/lib/targets/dotnet/nameutils.js.map +1 -0
- package/lib/targets/dotnet.d.ts +1 -0
- package/lib/targets/dotnet.d.ts.map +1 -0
- package/lib/targets/dotnet.js +8 -8
- package/lib/targets/dotnet.js.map +1 -0
- package/lib/targets/go/comparators.d.ts +1 -0
- package/lib/targets/go/comparators.d.ts.map +1 -0
- package/lib/targets/go/comparators.js +1 -1
- package/lib/targets/go/comparators.js.map +1 -0
- package/lib/targets/go/dependencies.d.ts +1 -0
- package/lib/targets/go/dependencies.d.ts.map +1 -0
- package/lib/targets/go/dependencies.js +1 -1
- package/lib/targets/go/dependencies.js.map +1 -0
- package/lib/targets/go/documentation.d.ts +2 -0
- package/lib/targets/go/documentation.d.ts.map +1 -0
- package/lib/targets/go/documentation.js +10 -1
- package/lib/targets/go/documentation.js.map +1 -0
- package/lib/targets/go/emit-context.d.ts +1 -0
- package/lib/targets/go/emit-context.d.ts.map +1 -0
- package/lib/targets/go/emit-context.js +1 -1
- package/lib/targets/go/emit-context.js.map +1 -0
- package/lib/targets/go/package.d.ts +5 -5
- package/lib/targets/go/package.d.ts.map +1 -0
- package/lib/targets/go/package.js +26 -28
- package/lib/targets/go/package.js.map +1 -0
- package/lib/targets/go/readme-file.d.ts +4 -2
- package/lib/targets/go/readme-file.d.ts.map +1 -0
- package/lib/targets/go/readme-file.js +7 -13
- package/lib/targets/go/readme-file.js.map +1 -0
- package/lib/targets/go/runtime/class-constructor.d.ts +1 -0
- package/lib/targets/go/runtime/class-constructor.d.ts.map +1 -0
- package/lib/targets/go/runtime/class-constructor.js +6 -6
- package/lib/targets/go/runtime/class-constructor.js.map +1 -0
- package/lib/targets/go/runtime/constants.d.ts +1 -0
- package/lib/targets/go/runtime/constants.d.ts.map +1 -0
- package/lib/targets/go/runtime/constants.js +1 -1
- package/lib/targets/go/runtime/constants.js.map +1 -0
- package/lib/targets/go/runtime/emit-arguments.d.ts +1 -0
- package/lib/targets/go/runtime/emit-arguments.d.ts.map +1 -0
- package/lib/targets/go/runtime/emit-arguments.js +3 -3
- package/lib/targets/go/runtime/emit-arguments.js.map +1 -0
- package/lib/targets/go/runtime/function-call.d.ts +1 -0
- package/lib/targets/go/runtime/function-call.d.ts.map +1 -0
- package/lib/targets/go/runtime/function-call.js +2 -3
- package/lib/targets/go/runtime/function-call.js.map +1 -0
- package/lib/targets/go/runtime/index.d.ts +1 -0
- package/lib/targets/go/runtime/index.d.ts.map +1 -0
- package/lib/targets/go/runtime/index.js +7 -3
- package/lib/targets/go/runtime/index.js.map +1 -0
- package/lib/targets/go/runtime/method-call.d.ts +1 -0
- package/lib/targets/go/runtime/method-call.d.ts.map +1 -0
- package/lib/targets/go/runtime/method-call.js +5 -5
- package/lib/targets/go/runtime/method-call.js.map +1 -0
- package/lib/targets/go/runtime/property-access.d.ts +1 -0
- package/lib/targets/go/runtime/property-access.d.ts.map +1 -0
- package/lib/targets/go/runtime/property-access.js +5 -5
- package/lib/targets/go/runtime/property-access.js.map +1 -0
- package/lib/targets/go/runtime/util.d.ts +1 -0
- package/lib/targets/go/runtime/util.d.ts.map +1 -0
- package/lib/targets/go/runtime/util.js +1 -1
- package/lib/targets/go/runtime/util.js.map +1 -0
- package/lib/targets/go/types/class.d.ts +1 -0
- package/lib/targets/go/types/class.d.ts.map +1 -0
- package/lib/targets/go/types/class.js +11 -17
- package/lib/targets/go/types/class.js.map +1 -0
- package/lib/targets/go/types/enum.d.ts +1 -0
- package/lib/targets/go/types/enum.d.ts.map +1 -0
- package/lib/targets/go/types/enum.js +1 -1
- package/lib/targets/go/types/enum.js.map +1 -0
- package/lib/targets/go/types/go-type-reference.d.ts +1 -0
- package/lib/targets/go/types/go-type-reference.d.ts.map +1 -0
- package/lib/targets/go/types/go-type-reference.js +10 -14
- package/lib/targets/go/types/go-type-reference.js.map +1 -0
- package/lib/targets/go/types/go-type.d.ts +1 -0
- package/lib/targets/go/types/go-type.d.ts.map +1 -0
- package/lib/targets/go/types/go-type.js +1 -1
- package/lib/targets/go/types/go-type.js.map +1 -0
- package/lib/targets/go/types/index.d.ts +1 -0
- package/lib/targets/go/types/index.d.ts.map +1 -0
- package/lib/targets/go/types/index.js +7 -3
- package/lib/targets/go/types/index.js.map +1 -0
- package/lib/targets/go/types/interface.d.ts +1 -0
- package/lib/targets/go/types/interface.d.ts.map +1 -0
- package/lib/targets/go/types/interface.js +8 -11
- package/lib/targets/go/types/interface.js.map +1 -0
- package/lib/targets/go/types/struct.d.ts +1 -0
- package/lib/targets/go/types/struct.d.ts.map +1 -0
- package/lib/targets/go/types/struct.js +2 -2
- package/lib/targets/go/types/struct.js.map +1 -0
- package/lib/targets/go/types/type-member.d.ts +1 -0
- package/lib/targets/go/types/type-member.d.ts.map +1 -0
- package/lib/targets/go/types/type-member.js +13 -15
- package/lib/targets/go/types/type-member.js.map +1 -0
- package/lib/targets/go/util.d.ts +1 -0
- package/lib/targets/go/util.d.ts.map +1 -0
- package/lib/targets/go/util.js +5 -8
- package/lib/targets/go/util.js.map +1 -0
- package/lib/targets/go/version-file.d.ts +1 -0
- package/lib/targets/go/version-file.d.ts.map +1 -0
- package/lib/targets/go/version-file.js +1 -1
- package/lib/targets/go/version-file.js.map +1 -0
- package/lib/targets/go.d.ts +1 -0
- package/lib/targets/go.d.ts.map +1 -0
- package/lib/targets/go.js +4 -4
- package/lib/targets/go.js.map +1 -0
- package/lib/targets/index.d.ts +1 -0
- package/lib/targets/index.d.ts.map +1 -0
- package/lib/targets/index.js +3 -3
- package/lib/targets/index.js.map +1 -0
- package/lib/targets/java.d.ts +1 -0
- package/lib/targets/java.d.ts.map +1 -0
- package/lib/targets/java.js +70 -84
- package/lib/targets/java.js.map +1 -0
- package/lib/targets/js.d.ts +1 -0
- package/lib/targets/js.d.ts.map +1 -0
- package/lib/targets/js.js +2 -2
- package/lib/targets/js.js.map +1 -0
- package/lib/targets/python/requirements-dev.txt +2 -3
- package/lib/targets/python/type-name.d.ts +1 -0
- package/lib/targets/python/type-name.d.ts.map +1 -0
- package/lib/targets/python/type-name.js +63 -62
- package/lib/targets/python/type-name.js.map +1 -0
- package/lib/targets/python/util.d.ts +1 -0
- package/lib/targets/python/util.d.ts.map +1 -0
- package/lib/targets/python/util.js +1 -1
- package/lib/targets/python/util.js.map +1 -0
- package/lib/targets/python.d.ts +1 -0
- package/lib/targets/python.d.ts.map +1 -0
- package/lib/targets/python.js +108 -108
- package/lib/targets/python.js.map +1 -0
- package/lib/targets/version-utils.d.ts +1 -0
- package/lib/targets/version-utils.d.ts.map +1 -0
- package/lib/targets/version-utils.js +6 -7
- package/lib/targets/version-utils.js.map +1 -0
- package/lib/timer.d.ts +1 -0
- package/lib/timer.d.ts.map +1 -0
- package/lib/timer.js +1 -1
- package/lib/timer.js.map +1 -0
- package/lib/toposort.d.ts +1 -0
- package/lib/toposort.d.ts.map +1 -0
- package/lib/toposort.js +1 -1
- package/lib/toposort.js.map +1 -0
- package/lib/util.d.ts +1 -0
- package/lib/util.d.ts.map +1 -0
- package/lib/util.js +15 -18
- package/lib/util.js.map +1 -0
- package/lib/version.d.ts +3 -2
- package/lib/version.d.ts.map +1 -0
- package/lib/version.js +4 -4
- package/lib/version.js.map +1 -0
- package/package.json +16 -23
package/lib/targets/python.js
CHANGED
|
@@ -35,7 +35,11 @@ class Python extends target_1.Target {
|
|
|
35
35
|
// Create a fresh virtual env
|
|
36
36
|
const venv = await fs.mkdtemp(path.join(sourceDir, '.env-'));
|
|
37
37
|
const venvBin = path.join(venv, process.platform === 'win32' ? 'Scripts' : 'bin');
|
|
38
|
-
|
|
38
|
+
// On Windows, there is usually no python3.exe (the GitHub action workers will have a python3
|
|
39
|
+
// shim, but using this actually results in a WinError with Python 3.7 and 3.8 where venv will
|
|
40
|
+
// fail to copy the python binary if it's not invoked as python.exe). More on this particular
|
|
41
|
+
// issue can be read here: https://bugs.python.org/issue43749
|
|
42
|
+
await (0, util_1.shell)(process.platform === 'win32' ? 'python' : 'python3', [
|
|
39
43
|
'-m',
|
|
40
44
|
'venv',
|
|
41
45
|
'--system-site-packages',
|
|
@@ -48,22 +52,22 @@ class Python extends target_1.Target {
|
|
|
48
52
|
};
|
|
49
53
|
const python = path.join(venvBin, 'python');
|
|
50
54
|
// Install the necessary things
|
|
51
|
-
await util_1.shell(python, ['-m', 'pip', 'install', '--no-input', '-r', requirementsFile], {
|
|
55
|
+
await (0, util_1.shell)(python, ['-m', 'pip', 'install', '--no-input', '-r', requirementsFile], {
|
|
52
56
|
cwd: sourceDir,
|
|
53
57
|
env,
|
|
54
58
|
retry: { maxAttempts: 5 },
|
|
55
59
|
});
|
|
56
60
|
// Actually package up our code, both as a sdist and a wheel for publishing.
|
|
57
|
-
await util_1.shell(python, ['setup.py', 'sdist', '--dist-dir', outDir], {
|
|
61
|
+
await (0, util_1.shell)(python, ['setup.py', 'sdist', '--dist-dir', outDir], {
|
|
58
62
|
cwd: sourceDir,
|
|
59
63
|
env,
|
|
60
64
|
});
|
|
61
|
-
await util_1.shell(python, ['-m', 'pip', 'wheel', '--no-deps', '--wheel-dir', outDir, sourceDir], {
|
|
65
|
+
await (0, util_1.shell)(python, ['-m', 'pip', 'wheel', '--no-deps', '--wheel-dir', outDir, sourceDir], {
|
|
62
66
|
cwd: sourceDir,
|
|
63
67
|
env,
|
|
64
68
|
retry: { maxAttempts: 5 },
|
|
65
69
|
});
|
|
66
|
-
await util_1.shell(python, ['-m', 'twine', 'check', path.join(outDir, '*')], {
|
|
70
|
+
await (0, util_1.shell)(python, ['-m', 'twine', 'check', path.join(outDir, '*')], {
|
|
67
71
|
cwd: sourceDir,
|
|
68
72
|
env,
|
|
69
73
|
});
|
|
@@ -74,14 +78,14 @@ const pythonModuleNameToFilename = (name) => {
|
|
|
74
78
|
return path.join(...name.split('.'));
|
|
75
79
|
};
|
|
76
80
|
const toPythonMethodName = (name, protectedItem = false) => {
|
|
77
|
-
let value = util_2.toPythonIdentifier(codemaker_1.toSnakeCase(name));
|
|
81
|
+
let value = (0, util_2.toPythonIdentifier)((0, codemaker_1.toSnakeCase)(name));
|
|
78
82
|
if (protectedItem) {
|
|
79
83
|
value = `_${value}`;
|
|
80
84
|
}
|
|
81
85
|
return value;
|
|
82
86
|
};
|
|
83
87
|
const toPythonPropertyName = (name, constant = false, protectedItem = false) => {
|
|
84
|
-
let value = util_2.toPythonIdentifier(codemaker_1.toSnakeCase(name));
|
|
88
|
+
let value = (0, util_2.toPythonIdentifier)((0, codemaker_1.toSnakeCase)(name));
|
|
85
89
|
if (constant) {
|
|
86
90
|
value = value.toUpperCase();
|
|
87
91
|
}
|
|
@@ -102,7 +106,7 @@ const toPythonPropertyName = (name, constant = false, protectedItem = false) =>
|
|
|
102
106
|
* omitted when generating a name for a parameter that **is** lifted.
|
|
103
107
|
*/
|
|
104
108
|
function toPythonParameterName(name, liftedParamNames = new Set()) {
|
|
105
|
-
let result = util_2.toPythonIdentifier(codemaker_1.toSnakeCase(name));
|
|
109
|
+
let result = (0, util_2.toPythonIdentifier)((0, codemaker_1.toSnakeCase)(name));
|
|
106
110
|
while (liftedParamNames.has(result)) {
|
|
107
111
|
result += '_';
|
|
108
112
|
}
|
|
@@ -245,7 +249,7 @@ class BasePythonClassType {
|
|
|
245
249
|
return dependencies;
|
|
246
250
|
}
|
|
247
251
|
requiredImports(context) {
|
|
248
|
-
return type_name_1.mergePythonImports(...this.bases.map((base) => type_name_1.toTypeName(base).requiredImports(context)), ...this.members.map((mem) => mem.requiredImports(context)));
|
|
252
|
+
return (0, type_name_1.mergePythonImports)(...this.bases.map((base) => (0, type_name_1.toTypeName)(base).requiredImports(context)), ...this.members.map((mem) => mem.requiredImports(context)));
|
|
249
253
|
}
|
|
250
254
|
addMember(member) {
|
|
251
255
|
this.members.push(member);
|
|
@@ -307,24 +311,22 @@ class BaseMethod {
|
|
|
307
311
|
this.parent = opts.parent;
|
|
308
312
|
}
|
|
309
313
|
get apiLocation() {
|
|
310
|
-
var _a;
|
|
311
314
|
return {
|
|
312
315
|
api: 'member',
|
|
313
316
|
fqn: this.parent.fqn,
|
|
314
|
-
memberName:
|
|
317
|
+
memberName: this.jsName ?? '',
|
|
315
318
|
};
|
|
316
319
|
}
|
|
317
320
|
requiredImports(context) {
|
|
318
|
-
return type_name_1.mergePythonImports(type_name_1.toTypeName(this.returns).requiredImports(context), ...this.parameters.map((param) => type_name_1.toTypeName(param).requiredImports(context)), ...liftedProperties(this.liftedProp));
|
|
321
|
+
return (0, type_name_1.mergePythonImports)((0, type_name_1.toTypeName)(this.returns).requiredImports(context), ...this.parameters.map((param) => (0, type_name_1.toTypeName)(param).requiredImports(context)), ...liftedProperties(this.liftedProp));
|
|
319
322
|
function* liftedProperties(struct) {
|
|
320
|
-
var _a, _b;
|
|
321
323
|
if (struct == null) {
|
|
322
324
|
return;
|
|
323
325
|
}
|
|
324
|
-
for (const prop of
|
|
325
|
-
yield type_name_1.toTypeName(prop.type).requiredImports(context);
|
|
326
|
+
for (const prop of struct.properties ?? []) {
|
|
327
|
+
yield (0, type_name_1.toTypeName)(prop.type).requiredImports(context);
|
|
326
328
|
}
|
|
327
|
-
for (const base of
|
|
329
|
+
for (const base of struct.interfaces ?? []) {
|
|
328
330
|
const iface = context.resolver.dereference(base);
|
|
329
331
|
for (const imports of liftedProperties(iface)) {
|
|
330
332
|
yield imports;
|
|
@@ -333,16 +335,15 @@ class BaseMethod {
|
|
|
333
335
|
}
|
|
334
336
|
}
|
|
335
337
|
emit(code, context, opts) {
|
|
336
|
-
|
|
337
|
-
const
|
|
338
|
-
const returnType = type_name_1.toTypeName(this.returns).pythonType(context);
|
|
338
|
+
const { renderAbstract = true, forceEmitBody = false } = opts ?? {};
|
|
339
|
+
const returnType = (0, type_name_1.toTypeName)(this.returns).pythonType(context);
|
|
339
340
|
// We cannot (currently?) blindly use the names given to us by the JSII for
|
|
340
341
|
// initializers, because our keyword lifting will allow two names to clash.
|
|
341
342
|
// This can hopefully be removed once we get https://github.com/aws/jsii/issues/288
|
|
342
343
|
// resolved, so build up a list of all of the prop names so we can check against
|
|
343
344
|
// them later.
|
|
344
345
|
const liftedPropNames = new Set();
|
|
345
|
-
if (
|
|
346
|
+
if (this.liftedProp?.properties != null) {
|
|
346
347
|
for (const prop of this.liftedProp.properties) {
|
|
347
348
|
liftedPropNames.add(toPythonParameterName(prop.name));
|
|
348
349
|
}
|
|
@@ -357,7 +358,7 @@ class BaseMethod {
|
|
|
357
358
|
// This can hopefully be removed once we get https://github.com/aws/jsii/issues/288
|
|
358
359
|
// resolved.
|
|
359
360
|
const paramName = toPythonParameterName(param.name, liftedPropNames);
|
|
360
|
-
const paramType = type_name_1.toTypeName(param).pythonType({
|
|
361
|
+
const paramType = (0, type_name_1.toTypeName)(param).pythonType({
|
|
361
362
|
...context,
|
|
362
363
|
parameterType: true,
|
|
363
364
|
});
|
|
@@ -390,7 +391,7 @@ class BaseMethod {
|
|
|
390
391
|
// Iterate over all of our props, and reflect them into our params.
|
|
391
392
|
for (const prop of liftedProperties) {
|
|
392
393
|
const paramName = toPythonParameterName(prop.prop.name);
|
|
393
|
-
const paramType = type_name_1.toTypeName(prop.prop).pythonType({
|
|
394
|
+
const paramType = (0, type_name_1.toTypeName)(prop.prop).pythonType({
|
|
394
395
|
...context,
|
|
395
396
|
parameterType: true,
|
|
396
397
|
});
|
|
@@ -413,7 +414,7 @@ class BaseMethod {
|
|
|
413
414
|
pythonParams.pop();
|
|
414
415
|
const lastParameter = this.parameters.slice(-1)[0];
|
|
415
416
|
const paramName = toPythonParameterName(lastParameter.name);
|
|
416
|
-
const paramType = type_name_1.toTypeName(lastParameter.type).pythonType(context);
|
|
417
|
+
const paramType = (0, type_name_1.toTypeName)(lastParameter.type).pythonType(context);
|
|
417
418
|
pythonParams.push(`*${paramName}: ${paramType}`);
|
|
418
419
|
}
|
|
419
420
|
const decorators = new Array();
|
|
@@ -459,7 +460,7 @@ class BaseMethod {
|
|
|
459
460
|
emitAutoProps(code, context, liftedPropNames) {
|
|
460
461
|
const lastParameter = this.parameters.slice(-1)[0];
|
|
461
462
|
const argName = toPythonParameterName(lastParameter.name, liftedPropNames);
|
|
462
|
-
const typeName = type_name_1.toTypeName(lastParameter.type).pythonType({
|
|
463
|
+
const typeName = (0, type_name_1.toTypeName)(lastParameter.type).pythonType({
|
|
463
464
|
...context,
|
|
464
465
|
typeAnnotation: false,
|
|
465
466
|
});
|
|
@@ -480,7 +481,7 @@ class BaseMethod {
|
|
|
480
481
|
throw new Error('Parent not known.');
|
|
481
482
|
}
|
|
482
483
|
if (this.isStatic) {
|
|
483
|
-
jsiiMethodParams.push(type_name_1.toTypeName(this.parent).pythonType({
|
|
484
|
+
jsiiMethodParams.push((0, type_name_1.toTypeName)(this.parent).pythonType({
|
|
484
485
|
...context,
|
|
485
486
|
typeAnnotation: false,
|
|
486
487
|
}));
|
|
@@ -557,11 +558,11 @@ class BaseProperty {
|
|
|
557
558
|
return { api: 'member', fqn: this.parent.fqn, memberName: this.jsName };
|
|
558
559
|
}
|
|
559
560
|
requiredImports(context) {
|
|
560
|
-
return type_name_1.toTypeName(this.type).requiredImports(context);
|
|
561
|
+
return (0, type_name_1.toTypeName)(this.type).requiredImports(context);
|
|
561
562
|
}
|
|
562
563
|
emit(code, context, opts) {
|
|
563
|
-
const { renderAbstract = true, forceEmitBody = false } = opts
|
|
564
|
-
const pythonType = type_name_1.toTypeName(this.type).pythonType(context);
|
|
564
|
+
const { renderAbstract = true, forceEmitBody = false } = opts ?? {};
|
|
565
|
+
const pythonType = (0, type_name_1.toTypeName)(this.type).pythonType(context);
|
|
565
566
|
// "# type: ignore[misc]" is needed because mypy cannot check decorated things
|
|
566
567
|
code.line(`@${this.decorator} # type: ignore[misc]`);
|
|
567
568
|
code.line(`@jsii.member(jsii_name="${this.jsName}")`);
|
|
@@ -609,7 +610,7 @@ class Interface extends BasePythonClassType {
|
|
|
609
610
|
// Then, we have to emit a Proxy class which implements our proxy interface.
|
|
610
611
|
const proxyBases = this.bases.map((b) =>
|
|
611
612
|
// "# type: ignore[misc]" because MyPy cannot check dynamic base classes (naturally)
|
|
612
|
-
`jsii.proxy_for(${type_name_1.toTypeName(b).pythonType({
|
|
613
|
+
`jsii.proxy_for(${(0, type_name_1.toTypeName)(b).pythonType({
|
|
613
614
|
...context,
|
|
614
615
|
typeAnnotation: false,
|
|
615
616
|
})}) # type: ignore[misc]`);
|
|
@@ -639,7 +640,7 @@ class Interface extends BasePythonClassType {
|
|
|
639
640
|
}
|
|
640
641
|
}
|
|
641
642
|
getClassParams(context) {
|
|
642
|
-
const params = this.bases.map((b) => type_name_1.toTypeName(b).pythonType({ ...context, typeAnnotation: false }));
|
|
643
|
+
const params = this.bases.map((b) => (0, type_name_1.toTypeName)(b).pythonType({ ...context, typeAnnotation: false }));
|
|
643
644
|
params.push('typing_extensions.Protocol');
|
|
644
645
|
return params;
|
|
645
646
|
}
|
|
@@ -697,10 +698,10 @@ class Struct extends BasePythonClassType {
|
|
|
697
698
|
}
|
|
698
699
|
}
|
|
699
700
|
requiredImports(context) {
|
|
700
|
-
return type_name_1.mergePythonImports(super.requiredImports(context), ...this.allMembers.map((mem) => mem.requiredImports(context)));
|
|
701
|
+
return (0, type_name_1.mergePythonImports)(super.requiredImports(context), ...this.allMembers.map((mem) => mem.requiredImports(context)));
|
|
701
702
|
}
|
|
702
703
|
getClassParams(context) {
|
|
703
|
-
return this.bases.map((b) => type_name_1.toTypeName(b).pythonType({ ...context, typeAnnotation: false }));
|
|
704
|
+
return this.bases.map((b) => (0, type_name_1.toTypeName)(b).pythonType({ ...context, typeAnnotation: false }));
|
|
704
705
|
}
|
|
705
706
|
/**
|
|
706
707
|
* Find all fields (inherited as well)
|
|
@@ -726,7 +727,7 @@ class Struct extends BasePythonClassType {
|
|
|
726
727
|
// Re-type struct arguments that were passed as "dict"
|
|
727
728
|
for (const member of members.filter((m) => m.isStruct(this.generator))) {
|
|
728
729
|
// Note that "None" is NOT an instance of dict (that's convenient!)
|
|
729
|
-
const typeName = type_name_1.toTypeName(member.type.type).pythonType({
|
|
730
|
+
const typeName = (0, type_name_1.toTypeName)(member.type.type).pythonType({
|
|
730
731
|
...context,
|
|
731
732
|
typeAnnotation: false,
|
|
732
733
|
});
|
|
@@ -815,7 +816,7 @@ class StructField {
|
|
|
815
816
|
return !!this.type.optional;
|
|
816
817
|
}
|
|
817
818
|
requiredImports(context) {
|
|
818
|
-
return type_name_1.toTypeName(this.type).requiredImports(context);
|
|
819
|
+
return (0, type_name_1.toTypeName)(this.type).requiredImports(context);
|
|
819
820
|
}
|
|
820
821
|
isStruct(generator) {
|
|
821
822
|
return isStruct(generator.reflectAssembly.system, this.type.type);
|
|
@@ -831,7 +832,7 @@ class StructField {
|
|
|
831
832
|
* Return the Python type annotation for this type
|
|
832
833
|
*/
|
|
833
834
|
typeAnnotation(context) {
|
|
834
|
-
return type_name_1.toTypeName(this.type).pythonType(context);
|
|
835
|
+
return (0, type_name_1.toTypeName)(this.type).pythonType(context);
|
|
835
836
|
}
|
|
836
837
|
emitDocString(code) {
|
|
837
838
|
this.generator.emitDocString(code, this.apiLocation, this.docs, {
|
|
@@ -880,13 +881,13 @@ class Class extends BasePythonClassType {
|
|
|
880
881
|
return dependencies;
|
|
881
882
|
}
|
|
882
883
|
requiredImports(context) {
|
|
883
|
-
return type_name_1.mergePythonImports(super.requiredImports(context), // Takes care of base & members
|
|
884
|
-
...this.interfaces.map((base) => type_name_1.toTypeName(base).requiredImports(context)));
|
|
884
|
+
return (0, type_name_1.mergePythonImports)(super.requiredImports(context), // Takes care of base & members
|
|
885
|
+
...this.interfaces.map((base) => (0, type_name_1.toTypeName)(base).requiredImports(context)));
|
|
885
886
|
}
|
|
886
887
|
emit(code, context) {
|
|
887
888
|
// First we emit our implments decorator
|
|
888
889
|
if (this.interfaces.length > 0) {
|
|
889
|
-
const interfaces = this.interfaces.map((b) => type_name_1.toTypeName(b).pythonType({ ...context, typeAnnotation: false }));
|
|
890
|
+
const interfaces = this.interfaces.map((b) => (0, type_name_1.toTypeName)(b).pythonType({ ...context, typeAnnotation: false }));
|
|
890
891
|
code.line(`@jsii.implements(${interfaces.join(', ')})`);
|
|
891
892
|
}
|
|
892
893
|
// Then we do our normal class logic for emitting our members.
|
|
@@ -899,7 +900,7 @@ class Class extends BasePythonClassType {
|
|
|
899
900
|
const proxyBases = [this.pythonName];
|
|
900
901
|
for (const base of this.abstractBases) {
|
|
901
902
|
// "# type: ignore[misc]" because MyPy cannot check dynamic base classes (naturally)
|
|
902
|
-
proxyBases.push(`jsii.proxy_for(${type_name_1.toTypeName(base).pythonType({
|
|
903
|
+
proxyBases.push(`jsii.proxy_for(${(0, type_name_1.toTypeName)(base).pythonType({
|
|
903
904
|
...context,
|
|
904
905
|
typeAnnotation: false,
|
|
905
906
|
})}) # type: ignore[misc]`);
|
|
@@ -934,7 +935,7 @@ class Class extends BasePythonClassType {
|
|
|
934
935
|
}
|
|
935
936
|
}
|
|
936
937
|
getClassParams(context) {
|
|
937
|
-
const params = this.bases.map((b) => type_name_1.toTypeName(b).pythonType({ ...context, typeAnnotation: false }));
|
|
938
|
+
const params = this.bases.map((b) => (0, type_name_1.toTypeName)(b).pythonType({ ...context, typeAnnotation: false }));
|
|
938
939
|
const metaclass = this.abstract ? 'JSIIAbstractClass' : 'JSIIMeta';
|
|
939
940
|
params.push(`metaclass=jsii.${metaclass}`);
|
|
940
941
|
params.push(`jsii_type="${this.fqn}"`);
|
|
@@ -1057,20 +1058,34 @@ class PythonModule {
|
|
|
1057
1058
|
}
|
|
1058
1059
|
addPythonModule(pyMod) {
|
|
1059
1060
|
assert(!this.loadAssembly, 'PythonModule.addPythonModule CANNOT be called on assembly-loading modules (it would cause a load cycle)!');
|
|
1060
|
-
|
|
1061
|
+
assert(pyMod.pythonName.startsWith(`${this.pythonName}.`), `Attempted to register ${pyMod.pythonName} as a child module of ${this.pythonName}, but the names don't match!`);
|
|
1062
|
+
const [firstLevel, ...rest] = pyMod.pythonName
|
|
1063
|
+
.substring(this.pythonName.length + 1)
|
|
1064
|
+
.split('.');
|
|
1065
|
+
if (rest.length === 0) {
|
|
1066
|
+
// This is a direct child module...
|
|
1067
|
+
this.modules.push(pyMod);
|
|
1068
|
+
}
|
|
1069
|
+
else {
|
|
1070
|
+
// This is a nested child module, so we delegate to the directly nested module...
|
|
1071
|
+
const parent = this.modules.find((m) => m.pythonName === `${this.pythonName}.${firstLevel}`);
|
|
1072
|
+
if (!parent) {
|
|
1073
|
+
throw new Error(`Attempted to register ${pyMod.pythonName} within ${this.pythonName}, but ${this.pythonName}.${firstLevel} wasn't registered yet!`);
|
|
1074
|
+
}
|
|
1075
|
+
parent.addPythonModule(pyMod);
|
|
1076
|
+
}
|
|
1061
1077
|
}
|
|
1062
1078
|
requiredImports(context) {
|
|
1063
|
-
return type_name_1.mergePythonImports(...this.members.map((mem) => mem.requiredImports(context)));
|
|
1079
|
+
return (0, type_name_1.mergePythonImports)(...this.members.map((mem) => mem.requiredImports(context)));
|
|
1064
1080
|
}
|
|
1065
1081
|
emit(code, context) {
|
|
1066
|
-
var _a;
|
|
1067
1082
|
this.emitModuleDocumentation(code);
|
|
1068
1083
|
const resolver = this.fqn
|
|
1069
1084
|
? context.resolver.bind(this.fqn, this.pythonName)
|
|
1070
1085
|
: context.resolver;
|
|
1071
1086
|
context = {
|
|
1072
1087
|
...context,
|
|
1073
|
-
submodule:
|
|
1088
|
+
submodule: this.fqn ?? context.submodule,
|
|
1074
1089
|
resolver,
|
|
1075
1090
|
};
|
|
1076
1091
|
// Before we write anything else, we need to write out our module headers, this
|
|
@@ -1156,20 +1171,11 @@ class PythonModule {
|
|
|
1156
1171
|
code.line('# Loading modules to ensure their types are registered with the jsii runtime library');
|
|
1157
1172
|
for (const module of this.modules.sort((l, r) => l.pythonName.localeCompare(r.pythonName))) {
|
|
1158
1173
|
// Rather than generating an absolute import like
|
|
1159
|
-
// "import jsii_calc.submodule
|
|
1160
|
-
//
|
|
1161
|
-
//
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
const assemblyName = type_name_1.toPythonFqn(module.assembly.name, module.assembly).pythonFqn;
|
|
1165
|
-
const submodule = module.pythonName
|
|
1166
|
-
.replace(`${assemblyName}.`, '')
|
|
1167
|
-
.split('.');
|
|
1168
|
-
const submodulePath = submodule
|
|
1169
|
-
.slice(0, submodule.length - 1)
|
|
1170
|
-
.join('.');
|
|
1171
|
-
const submoduleName = submodule[submodule.length - 1];
|
|
1172
|
-
code.line(`from .${submodulePath} import ${submoduleName}`);
|
|
1174
|
+
// "import jsii_calc.submodule" this builds a relative import like
|
|
1175
|
+
// "from . import submodule". This enables distributing python packages
|
|
1176
|
+
// and using the generated modules in the same codebase.
|
|
1177
|
+
const submodule = module.pythonName.substring(this.pythonName.length + 1);
|
|
1178
|
+
code.line(`from . import ${submodule}`);
|
|
1173
1179
|
}
|
|
1174
1180
|
}
|
|
1175
1181
|
}
|
|
@@ -1228,10 +1234,10 @@ class PythonModule {
|
|
|
1228
1234
|
}
|
|
1229
1235
|
}
|
|
1230
1236
|
emitDependencyImports(code) {
|
|
1231
|
-
var _a;
|
|
1232
1237
|
// Collect all the (direct) dependencies' ._jsii packages.
|
|
1233
|
-
const deps = Object.keys(
|
|
1234
|
-
.map((dep) =>
|
|
1238
|
+
const deps = Object.keys(this.assembly.dependencies ?? {})
|
|
1239
|
+
.map((dep) => this.assembly.dependencyClosure?.[dep]?.targets?.python?.module ??
|
|
1240
|
+
(0, util_2.die)(`No Python target was configrued for the dependency "${dep}".`))
|
|
1235
1241
|
.map((mod) => `${mod}._jsii`)
|
|
1236
1242
|
.sort();
|
|
1237
1243
|
// Now actually write the import statements...
|
|
@@ -1309,7 +1315,6 @@ class Package {
|
|
|
1309
1315
|
this.data.get(module.pythonName).push({ filename, data });
|
|
1310
1316
|
}
|
|
1311
1317
|
write(code, context) {
|
|
1312
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
1313
1318
|
const modules = [...this.modules.values()].sort((a, b) => a.pythonName.localeCompare(b.pythonName));
|
|
1314
1319
|
const scripts = new Array();
|
|
1315
1320
|
// Iterate over all of our modules, and write them out to disk.
|
|
@@ -1335,14 +1340,15 @@ class Package {
|
|
|
1335
1340
|
}
|
|
1336
1341
|
// Compute our list of dependencies
|
|
1337
1342
|
const dependencies = [];
|
|
1338
|
-
for (const [depName, version] of Object.entries(
|
|
1343
|
+
for (const [depName, version] of Object.entries(this.metadata.dependencies ?? {})) {
|
|
1339
1344
|
const depInfo = this.metadata.dependencyClosure[depName];
|
|
1340
|
-
dependencies.push(`${depInfo.targets.python.distName}${version_utils_1.toPythonVersionRange(version)}`);
|
|
1345
|
+
dependencies.push(`${depInfo.targets.python.distName}${(0, version_utils_1.toPythonVersionRange)(version)}`);
|
|
1341
1346
|
}
|
|
1342
1347
|
// Need to always write this file as the build process depends on it.
|
|
1343
1348
|
// Make up some contents if we don't have anything useful to say.
|
|
1344
1349
|
code.openFile('README.md');
|
|
1345
|
-
code.line(
|
|
1350
|
+
code.line(this.rootModule?.moduleDocumentation ??
|
|
1351
|
+
`${this.name}\n${'='.repeat(this.name.length)}`);
|
|
1346
1352
|
code.closeFile('README.md');
|
|
1347
1353
|
// Strip " (build abcdef)" from the jsii version
|
|
1348
1354
|
const jsiiVersionSimple = this.metadata.jsiiVersion.replace(/ .*$/, '');
|
|
@@ -1366,9 +1372,9 @@ class Package {
|
|
|
1366
1372
|
package_dir: { '': 'src' },
|
|
1367
1373
|
packages: modules.map((m) => m.pythonName),
|
|
1368
1374
|
package_data: packageData,
|
|
1369
|
-
python_requires: '
|
|
1375
|
+
python_requires: '~=3.7',
|
|
1370
1376
|
install_requires: [
|
|
1371
|
-
`jsii${version_utils_1.toPythonVersionRange(`^${jsiiVersionSimple}`)}`,
|
|
1377
|
+
`jsii${(0, version_utils_1.toPythonVersionRange)(`^${jsiiVersionSimple}`)}`,
|
|
1372
1378
|
'publication>=0.0.3',
|
|
1373
1379
|
]
|
|
1374
1380
|
.concat(dependencies)
|
|
@@ -1378,15 +1384,15 @@ class Package {
|
|
|
1378
1384
|
'Operating System :: OS Independent',
|
|
1379
1385
|
'Programming Language :: JavaScript',
|
|
1380
1386
|
'Programming Language :: Python :: 3 :: Only',
|
|
1381
|
-
'Programming Language :: Python :: 3.6',
|
|
1382
1387
|
'Programming Language :: Python :: 3.7',
|
|
1383
1388
|
'Programming Language :: Python :: 3.8',
|
|
1384
1389
|
'Programming Language :: Python :: 3.9',
|
|
1390
|
+
'Programming Language :: Python :: 3.10',
|
|
1385
1391
|
'Typing :: Typed',
|
|
1386
1392
|
],
|
|
1387
1393
|
scripts,
|
|
1388
1394
|
};
|
|
1389
|
-
switch (
|
|
1395
|
+
switch (this.metadata.docs?.stability) {
|
|
1390
1396
|
case spec.Stability.Experimental:
|
|
1391
1397
|
setupKwargs.classifiers.push('Development Status :: 4 - Beta');
|
|
1392
1398
|
break;
|
|
@@ -1399,10 +1405,10 @@ class Package {
|
|
|
1399
1405
|
default:
|
|
1400
1406
|
// No 'Development Status' trove classifier for you!
|
|
1401
1407
|
}
|
|
1402
|
-
if (
|
|
1408
|
+
if (spdxLicenseList[this.metadata.license]?.osiApproved) {
|
|
1403
1409
|
setupKwargs.classifiers.push('License :: OSI Approved');
|
|
1404
1410
|
}
|
|
1405
|
-
const additionalClassifiers =
|
|
1411
|
+
const additionalClassifiers = this.metadata.targets?.python?.classifiers;
|
|
1406
1412
|
if (additionalClassifiers != null) {
|
|
1407
1413
|
if (!Array.isArray(additionalClassifiers)) {
|
|
1408
1414
|
throw new Error(`The "jsii.targets.python.classifiers" value must be an array of strings if provided, but found ${JSON.stringify(additionalClassifiers, null, 2)}`);
|
|
@@ -1421,7 +1427,7 @@ class Package {
|
|
|
1421
1427
|
'Typing',
|
|
1422
1428
|
];
|
|
1423
1429
|
if (reservedClassifiers.includes(parts[0])) {
|
|
1424
|
-
logging_1.warn(`Classifiers starting with ${reservedClassifiers
|
|
1430
|
+
(0, logging_1.warn)(`Classifiers starting with ${reservedClassifiers
|
|
1425
1431
|
.map((x) => `"${x} ::"`)
|
|
1426
1432
|
.join(', ')} are automatically set and should not be manually configured`);
|
|
1427
1433
|
}
|
|
@@ -1458,7 +1464,7 @@ class Package {
|
|
|
1458
1464
|
const buildTools = fs
|
|
1459
1465
|
.readFileSync(requirementsFile, { encoding: 'utf-8' })
|
|
1460
1466
|
.split('\n')
|
|
1461
|
-
.map((line) =>
|
|
1467
|
+
.map((line) => /^\s*(.+)\s*#\s*build-system\s*$/.exec(line)?.[1]?.trim())
|
|
1462
1468
|
.reduce((buildTools, entry) => (entry ? [...buildTools, entry] : buildTools), new Array());
|
|
1463
1469
|
code.line(`requires = [${buildTools.map((x) => `"${x}"`).join(', ')}]`);
|
|
1464
1470
|
code.line('build-backend = "setuptools.build_meta"');
|
|
@@ -1548,7 +1554,7 @@ class TypeResolver {
|
|
|
1548
1554
|
this.findModule(assemblyName).targets.python.module,
|
|
1549
1555
|
];
|
|
1550
1556
|
for (const part of qualifiedIdentifiers) {
|
|
1551
|
-
fqnParts.push(util_2.toPythonIdentifier(part));
|
|
1557
|
+
fqnParts.push((0, util_2.toPythonIdentifier)(part));
|
|
1552
1558
|
}
|
|
1553
1559
|
return fqnParts.join('.');
|
|
1554
1560
|
}
|
|
@@ -1563,7 +1569,6 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1563
1569
|
}
|
|
1564
1570
|
// eslint-disable-next-line complexity
|
|
1565
1571
|
emitDocString(code, apiLocation, docs, options = {}) {
|
|
1566
|
-
var _a, _b, _c, _d;
|
|
1567
1572
|
if ((!docs || Object.keys(docs).length === 0) && !options.arguments) {
|
|
1568
1573
|
return;
|
|
1569
1574
|
}
|
|
@@ -1572,7 +1577,7 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1572
1577
|
}
|
|
1573
1578
|
const lines = new Array();
|
|
1574
1579
|
if (docs.summary) {
|
|
1575
|
-
lines.push(markdown_1.md2rst(_utils_1.renderSummary(docs)));
|
|
1580
|
+
lines.push((0, markdown_1.md2rst)((0, _utils_1.renderSummary)(docs)));
|
|
1576
1581
|
brk();
|
|
1577
1582
|
}
|
|
1578
1583
|
else {
|
|
@@ -1587,7 +1592,7 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1587
1592
|
if (doBrk) {
|
|
1588
1593
|
brk();
|
|
1589
1594
|
}
|
|
1590
|
-
const contentLines = markdown_1.md2rst(content).split('\n');
|
|
1595
|
+
const contentLines = (0, markdown_1.md2rst)(content).split('\n');
|
|
1591
1596
|
if (contentLines.length <= 1) {
|
|
1592
1597
|
lines.push(`:${heading}: ${contentLines.join('')}`.trim());
|
|
1593
1598
|
}
|
|
@@ -1604,10 +1609,10 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1604
1609
|
}
|
|
1605
1610
|
if (docs.remarks) {
|
|
1606
1611
|
brk();
|
|
1607
|
-
lines.push(...markdown_1.md2rst(this.convertMarkdown(
|
|
1612
|
+
lines.push(...(0, markdown_1.md2rst)(this.convertMarkdown(docs.remarks ?? '', apiLocation)).split('\n'));
|
|
1608
1613
|
brk();
|
|
1609
1614
|
}
|
|
1610
|
-
if (
|
|
1615
|
+
if (options.arguments?.length ?? 0 > 0) {
|
|
1611
1616
|
brk();
|
|
1612
1617
|
for (const param of options.arguments) {
|
|
1613
1618
|
// Add a line for every argument. Even if there is no description, we need
|
|
@@ -1634,7 +1639,7 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1634
1639
|
if (docs.subclassable) {
|
|
1635
1640
|
block('subclassable', 'Yes');
|
|
1636
1641
|
}
|
|
1637
|
-
for (const [k, v] of Object.entries(
|
|
1642
|
+
for (const [k, v] of Object.entries(docs.custom ?? {})) {
|
|
1638
1643
|
block(k, v, false);
|
|
1639
1644
|
}
|
|
1640
1645
|
if (docs.example) {
|
|
@@ -1669,11 +1674,11 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1669
1674
|
}
|
|
1670
1675
|
}
|
|
1671
1676
|
convertExample(example, apiLoc) {
|
|
1672
|
-
const translated = this.rosetta.translateExample(apiLoc, example, jsii_rosetta_1.TargetLanguage.PYTHON, jsii_rosetta_1.enforcesStrictMode(this.assembly));
|
|
1677
|
+
const translated = this.rosetta.translateExample(apiLoc, example, jsii_rosetta_1.TargetLanguage.PYTHON, (0, jsii_rosetta_1.enforcesStrictMode)(this.assembly));
|
|
1673
1678
|
return translated.source;
|
|
1674
1679
|
}
|
|
1675
1680
|
convertMarkdown(markdown, apiLoc) {
|
|
1676
|
-
return this.rosetta.translateSnippetsInMarkdown(apiLoc, markdown, jsii_rosetta_1.TargetLanguage.PYTHON, jsii_rosetta_1.enforcesStrictMode(this.assembly));
|
|
1681
|
+
return this.rosetta.translateSnippetsInMarkdown(apiLoc, markdown, jsii_rosetta_1.TargetLanguage.PYTHON, (0, jsii_rosetta_1.enforcesStrictMode)(this.assembly));
|
|
1677
1682
|
}
|
|
1678
1683
|
getPythonType(fqn) {
|
|
1679
1684
|
const type = this.types.get(fqn);
|
|
@@ -1686,7 +1691,7 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1686
1691
|
return path.join('src', pythonModuleNameToFilename(this.getAssemblyModuleName(assm)));
|
|
1687
1692
|
}
|
|
1688
1693
|
onBeginAssembly(assm, _fingerprint) {
|
|
1689
|
-
this.package = new Package(assm.targets.python.distName, version_utils_1.toReleaseVersion(assm.version, index_1.TargetName.PYTHON), assm);
|
|
1694
|
+
this.package = new Package(assm.targets.python.distName, (0, version_utils_1.toReleaseVersion)(assm.version, index_1.TargetName.PYTHON), assm);
|
|
1690
1695
|
// This is the '<packagename>._jsii' module for this assembly
|
|
1691
1696
|
const assemblyModule = new PythonModule(this.getAssemblyModuleName(assm), undefined, {
|
|
1692
1697
|
assembly: assm,
|
|
@@ -1710,17 +1715,17 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1710
1715
|
* Will be called for assembly root, namespaces and submodules (anything that contains other types, based on its FQN)
|
|
1711
1716
|
*/
|
|
1712
1717
|
onBeginNamespace(ns) {
|
|
1713
|
-
var _a, _b;
|
|
1714
1718
|
// 'ns' contains something like '@scope/jsii-calc-base-of-base'
|
|
1715
1719
|
const submoduleLike = ns === this.assembly.name
|
|
1716
1720
|
? this.assembly
|
|
1717
|
-
:
|
|
1721
|
+
: this.assembly.submodules?.[ns];
|
|
1718
1722
|
const readmeLocation = { api: 'moduleReadme', moduleFqn: ns };
|
|
1719
|
-
const module = new PythonModule(type_name_1.toPackageName(ns, this.assembly), ns, {
|
|
1723
|
+
const module = new PythonModule((0, type_name_1.toPackageName)(ns, this.assembly), ns, {
|
|
1720
1724
|
assembly: this.assembly,
|
|
1721
1725
|
assemblyFilename: this.getAssemblyFileName(),
|
|
1722
1726
|
package: this.package,
|
|
1723
|
-
moduleDocumentation:
|
|
1727
|
+
moduleDocumentation: submoduleLike?.readme
|
|
1728
|
+
? this.convertMarkdown(submoduleLike.readme?.markdown, readmeLocation).trim()
|
|
1724
1729
|
: undefined,
|
|
1725
1730
|
});
|
|
1726
1731
|
this.package.addModule(module);
|
|
@@ -1742,11 +1747,10 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1742
1747
|
}
|
|
1743
1748
|
}
|
|
1744
1749
|
onBeginClass(cls, abstract) {
|
|
1745
|
-
|
|
1746
|
-
const klass = new Class(this, util_2.toPythonIdentifier(cls.name), cls, cls.fqn, {
|
|
1750
|
+
const klass = new Class(this, (0, util_2.toPythonIdentifier)(cls.name), cls, cls.fqn, {
|
|
1747
1751
|
abstract,
|
|
1748
1752
|
bases: cls.base ? [this.findType(cls.base)] : undefined,
|
|
1749
|
-
interfaces:
|
|
1753
|
+
interfaces: cls.interfaces?.map((base) => this.findType(base)),
|
|
1750
1754
|
abstractBases: abstract ? this.getAbstractBases(cls) : [],
|
|
1751
1755
|
}, cls.docs);
|
|
1752
1756
|
if (cls.initializer !== undefined) {
|
|
@@ -1802,13 +1806,12 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1802
1806
|
this.onProperty(cls, prop);
|
|
1803
1807
|
}
|
|
1804
1808
|
onBeginInterface(ifc) {
|
|
1805
|
-
var _a, _b;
|
|
1806
1809
|
let iface;
|
|
1807
1810
|
if (ifc.datatype) {
|
|
1808
|
-
iface = new Struct(this, util_2.toPythonIdentifier(ifc.name), ifc, ifc.fqn, { bases:
|
|
1811
|
+
iface = new Struct(this, (0, util_2.toPythonIdentifier)(ifc.name), ifc, ifc.fqn, { bases: ifc.interfaces?.map((base) => this.findType(base)) }, ifc.docs);
|
|
1809
1812
|
}
|
|
1810
1813
|
else {
|
|
1811
|
-
iface = new Interface(this, util_2.toPythonIdentifier(ifc.name), ifc, ifc.fqn, { bases:
|
|
1814
|
+
iface = new Interface(this, (0, util_2.toPythonIdentifier)(ifc.name), ifc, ifc.fqn, { bases: ifc.interfaces?.map((base) => this.findType(base)) }, ifc.docs);
|
|
1812
1815
|
}
|
|
1813
1816
|
this.addPythonType(iface);
|
|
1814
1817
|
}
|
|
@@ -1830,10 +1833,10 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1830
1833
|
this.getPythonType(ifc.fqn).addMember(ifaceProperty);
|
|
1831
1834
|
}
|
|
1832
1835
|
onBeginEnum(enm) {
|
|
1833
|
-
this.addPythonType(new Enum(this, util_2.toPythonIdentifier(enm.name), enm, enm.fqn, {}, enm.docs));
|
|
1836
|
+
this.addPythonType(new Enum(this, (0, util_2.toPythonIdentifier)(enm.name), enm, enm.fqn, {}, enm.docs));
|
|
1834
1837
|
}
|
|
1835
1838
|
onEnumMember(enm, member) {
|
|
1836
|
-
this.getPythonType(enm.fqn).addMember(new EnumMember(this, util_2.toPythonIdentifier(member.name), member.name, member.docs, enm));
|
|
1839
|
+
this.getPythonType(enm.fqn).addMember(new EnumMember(this, (0, util_2.toPythonIdentifier)(member.name), member.name, member.docs, enm));
|
|
1837
1840
|
}
|
|
1838
1841
|
onInterfaceMethodOverload(_ifc, _overload, _originalMethod) {
|
|
1839
1842
|
throw new Error('Unhandled Type: InterfaceMethodOverload');
|
|
@@ -1865,11 +1868,10 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1865
1868
|
this.types.set(type.fqn, type);
|
|
1866
1869
|
}
|
|
1867
1870
|
getliftedProp(method) {
|
|
1868
|
-
var _a, _b;
|
|
1869
1871
|
// If there are parameters to this method, and if the last parameter's type is
|
|
1870
1872
|
// a datatype interface, then we want to lift the members of that last paramter
|
|
1871
1873
|
// as keyword arguments to this function.
|
|
1872
|
-
if (
|
|
1874
|
+
if (method.parameters?.length ?? 0 >= 1) {
|
|
1873
1875
|
const lastParameter = method.parameters.slice(-1)[0];
|
|
1874
1876
|
if (!lastParameter.variadic &&
|
|
1875
1877
|
spec.isNamedTypeReference(lastParameter.type)) {
|
|
@@ -1906,13 +1908,13 @@ function onelineDescription(docs) {
|
|
|
1906
1908
|
}
|
|
1907
1909
|
const parts = [];
|
|
1908
1910
|
if (docs.summary) {
|
|
1909
|
-
parts.push(markdown_1.md2rst(_utils_1.renderSummary(docs)));
|
|
1911
|
+
parts.push((0, markdown_1.md2rst)((0, _utils_1.renderSummary)(docs)));
|
|
1910
1912
|
}
|
|
1911
1913
|
if (docs.remarks) {
|
|
1912
|
-
parts.push(markdown_1.md2rst(docs.remarks));
|
|
1914
|
+
parts.push((0, markdown_1.md2rst)(docs.remarks));
|
|
1913
1915
|
}
|
|
1914
1916
|
if (docs.default) {
|
|
1915
|
-
parts.push(`Default: ${markdown_1.md2rst(docs.default)}`);
|
|
1917
|
+
parts.push(`Default: ${(0, markdown_1.md2rst)(docs.default)}`);
|
|
1916
1918
|
}
|
|
1917
1919
|
return parts.join(' ').replace(/\s+/g, ' ');
|
|
1918
1920
|
}
|
|
@@ -1925,7 +1927,7 @@ function isStruct(typeSystem, ref) {
|
|
|
1925
1927
|
return false;
|
|
1926
1928
|
}
|
|
1927
1929
|
const type = typeSystem.tryFindFqn(ref.fqn);
|
|
1928
|
-
return !!(
|
|
1930
|
+
return !!(type?.isInterfaceType() && type?.isDataType());
|
|
1929
1931
|
}
|
|
1930
1932
|
/**
|
|
1931
1933
|
* Appends `_` at the end of `name` until it no longer conflicts with any of the
|
|
@@ -2018,7 +2020,7 @@ function assignCallResult(code, variable, funct, params) {
|
|
|
2018
2020
|
function assignDictionary(code, variable, elements, trailing, compact = false) {
|
|
2019
2021
|
const space = compact ? '' : ' ';
|
|
2020
2022
|
const prefix = `${variable}${space}=${space}{`;
|
|
2021
|
-
const suffix = `}${trailing
|
|
2023
|
+
const suffix = `}${trailing ?? ''}`;
|
|
2022
2024
|
if (elements.length === 0) {
|
|
2023
2025
|
code.line(`${prefix}${suffix}`);
|
|
2024
2026
|
return;
|
|
@@ -2043,7 +2045,6 @@ function assignDictionary(code, variable, elements, trailing, compact = false) {
|
|
|
2043
2045
|
code.unindent(suffix);
|
|
2044
2046
|
}
|
|
2045
2047
|
function emitList(code, prefix, elements, suffix, opts) {
|
|
2046
|
-
var _a;
|
|
2047
2048
|
if (elements.length === 0) {
|
|
2048
2049
|
code.line(`${prefix}${suffix}`);
|
|
2049
2050
|
return;
|
|
@@ -2059,7 +2060,7 @@ function emitList(code, prefix, elements, suffix, opts) {
|
|
|
2059
2060
|
code.line(`${prefix}${elements.join(join)}${suffix}`);
|
|
2060
2061
|
return;
|
|
2061
2062
|
}
|
|
2062
|
-
const [before, after] =
|
|
2063
|
+
const [before, after] = opts?.ifMulti ?? ['', ''];
|
|
2063
2064
|
code.indent(`${prefix}${before}`);
|
|
2064
2065
|
if (elements.length === 1) {
|
|
2065
2066
|
code.line(elements[0]);
|
|
@@ -2086,15 +2087,14 @@ function totalSizeOf(strings, join) {
|
|
|
2086
2087
|
};
|
|
2087
2088
|
}
|
|
2088
2089
|
function nestedContext(context, fqn) {
|
|
2089
|
-
var _a;
|
|
2090
2090
|
return {
|
|
2091
2091
|
...context,
|
|
2092
2092
|
surroundingTypeFqns: fqn != null
|
|
2093
|
-
? [...(
|
|
2093
|
+
? [...(context.surroundingTypeFqns ?? []), fqn]
|
|
2094
2094
|
: context.surroundingTypeFqns,
|
|
2095
2095
|
};
|
|
2096
2096
|
}
|
|
2097
|
-
const isDeprecated = (x) =>
|
|
2097
|
+
const isDeprecated = (x) => x.docs?.deprecated !== undefined;
|
|
2098
2098
|
/**
|
|
2099
2099
|
* Last component of a .-separated name
|
|
2100
2100
|
*/
|
|
@@ -2102,4 +2102,4 @@ function lastComponent(n) {
|
|
|
2102
2102
|
const parts = n.split('.');
|
|
2103
2103
|
return parts[parts.length - 1];
|
|
2104
2104
|
}
|
|
2105
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHl0aG9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQW1DO0FBQ25DLGlDQUFpQztBQUNqQyx5Q0FBbUQ7QUFDbkQsMkRBQTJEO0FBQzNELCtCQUErQjtBQUUvQiwrQ0FLc0I7QUFDdEIsNkJBQTZCO0FBRTdCLDRDQUEyRDtBQUMzRCx3Q0FBa0M7QUFDbEMsMENBQXFDO0FBQ3JDLHNDQUFrRDtBQUNsRCxrQ0FBZ0M7QUFDaEMscUNBQTZEO0FBQzdELGtEQU80QjtBQUM1Qix3Q0FBd0Q7QUFDeEQsbURBQXlFO0FBRXpFLG1DQUFxQztBQUVyQyxvR0FBb0c7QUFDcEcsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFckQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUNuQyxTQUFTLEVBQ1QsUUFBUSxFQUNSLHNCQUFzQixDQUN2QixDQUFDO0FBRUYsMkVBQTJFO0FBQzNFLCtGQUErRjtBQUMvRixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUUvQixNQUFxQixNQUFPLFNBQVEsZUFBTTtJQUd4QyxZQUFtQixPQUFzQjtRQUN2QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFZixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFjLEVBQUUsT0FBZTtRQUN2RCxNQUFNLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQWlCLEVBQUUsTUFBYztRQUNsRCw2QkFBNkI7UUFDN0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FB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QUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHNwZWMgZnJvbSAnQGpzaWkvc3BlYyc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IENvZGVNYWtlciwgdG9TbmFrZUNhc2UgfSBmcm9tICdjb2RlbWFrZXInO1xuaW1wb3J0ICogYXMgZXNjYXBlU3RyaW5nUmVnZXhwIGZyb20gJ2VzY2FwZS1zdHJpbmctcmVnZXhwJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHJlZmxlY3QgZnJvbSAnanNpaS1yZWZsZWN0JztcbmltcG9ydCB7XG4gIFRhcmdldExhbmd1YWdlLFxuICBSb3NldHRhLFxuICBlbmZvcmNlc1N0cmljdE1vZGUsXG4gIEFwaUxvY2F0aW9uLFxufSBmcm9tICdqc2lpLXJvc2V0dGEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgR2VuZXJhdG9yLCBHZW5lcmF0b3JPcHRpb25zIH0gZnJvbSAnLi4vZ2VuZXJhdG9yJztcbmltcG9ydCB7IHdhcm4gfSBmcm9tICcuLi9sb2dnaW5nJztcbmltcG9ydCB7IG1kMnJzdCB9IGZyb20gJy4uL21hcmtkb3duJztcbmltcG9ydCB7IFRhcmdldCwgVGFyZ2V0T3B0aW9ucyB9IGZyb20gJy4uL3RhcmdldCc7XG5pbXBvcnQgeyBzaGVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgcmVuZGVyU3VtbWFyeSwgUHJvcGVydHlEZWZpbml0aW9uIH0gZnJvbSAnLi9fdXRpbHMnO1xuaW1wb3J0IHtcbiAgTmFtaW5nQ29udGV4dCxcbiAgdG9UeXBlTmFtZSxcbiAgUHl0aG9uSW1wb3J0cyxcbiAgbWVyZ2VQeXRob25JbXBvcnRzLFxuICB0b1BhY2thZ2VOYW1lLFxuICB0b1B5dGhvbkZxbixcbn0gZnJvbSAnLi9weXRob24vdHlwZS1uYW1lJztcbmltcG9ydCB7IGRpZSwgdG9QeXRob25JZGVudGlmaWVyIH0gZnJvbSAnLi9weXRob24vdXRpbCc7XG5pbXBvcnQgeyB0b1B5dGhvblZlcnNpb25SYW5nZSwgdG9SZWxlYXNlVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi11dGlscyc7XG5cbmltcG9ydCB7IFRhcmdldE5hbWUgfSBmcm9tICcuL2luZGV4JztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXMsQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3Qgc3BkeExpY2Vuc2VMaXN0ID0gcmVxdWlyZSgnc3BkeC1saWNlbnNlLWxpc3QnKTtcblxuY29uc3QgcmVxdWlyZW1lbnRzRmlsZSA9IHBhdGgucmVzb2x2ZShcbiAgX19kaXJuYW1lLFxuICAncHl0aG9uJyxcbiAgJ3JlcXVpcmVtZW50cy1kZXYudHh0Jyxcbik7XG5cbi8vIHdlIHVzZSBzaW5nbGUtcXVvdGVzIGZvciBtdWx0aS1saW5lIHN0cmluZ3MgdG8gYWxsb3cgZXhhbXBsZXMgd2l0aGluIHRoZVxuLy8gZG9jc3RyaW5ncyB0aGVtc2VsdmVzIHRvIGluY2x1ZGUgZG91YmxlLXF1b3RlcyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjU2OSlcbmNvbnN0IERPQ1NUUklOR19RVU9URVMgPSBcIicnJ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQeXRob24gZXh0ZW5kcyBUYXJnZXQge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3I7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFRhcmdldE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuZ2VuZXJhdG9yID0gbmV3IFB5dGhvbkdlbmVyYXRvcihvcHRpb25zLnJvc2V0dGEpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdlbmVyYXRlQ29kZShvdXREaXI6IHN0cmluZywgdGFyYmFsbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuZ2VuZXJhdGVDb2RlKG91dERpciwgdGFyYmFsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYnVpbGQoc291cmNlRGlyOiBzdHJpbmcsIG91dERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ3JlYXRlIGEgZnJlc2ggdmlydHVhbCBlbnZcbiAgICBjb25zdCB2ZW52ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4oc291cmNlRGlyLCAnLmVudi0nKSk7XG4gICAgY29uc3QgdmVudkJpbiA9IHBhdGguam9pbihcbiAgICAgIHZlbnYsXG4gICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ1NjcmlwdHMnIDogJ2JpbicsXG4gICAgKTtcbiAgICBhd2FpdCBzaGVsbCgncHl0aG9uMycsIFtcbiAgICAgICctbScsXG4gICAgICAndmVudicsXG4gICAgICAnLS1zeXN0ZW0tc2l0ZS1wYWNrYWdlcycsIC8vIEFsbG93IHVzaW5nIGdsb2JhbGx5IGluc3RhbGxlZCBwYWNrYWdlcyAoc2F2ZXMgdGltZSAmIGRpc2sgc3BhY2UpXG4gICAgICB2ZW52LFxuICAgIF0pO1xuICAgIGNvbnN0IGVudiA9IHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgUEFUSDogYCR7dmVudkJpbn06JHtwcm9jZXNzLmVudi5QQVRIfWAsXG4gICAgICBWSVJUVUFMX0VOVjogdmVudixcbiAgICB9O1xuICAgIGNvbnN0IHB5dGhvbiA9IHBhdGguam9pbih2ZW52QmluLCAncHl0aG9uJyk7XG5cbiAgICAvLyBJbnN0YWxsIHRoZSBuZWNlc3NhcnkgdGhpbmdzXG4gICAgYXdhaXQgc2hlbGwoXG4gICAgICBweXRob24sXG4gICAgICBbJy1tJywgJ3BpcCcsICdpbnN0YWxsJywgJy0tbm8taW5wdXQnLCAnLXInLCByZXF1aXJlbWVudHNGaWxlXSxcbiAgICAgIHtcbiAgICAgICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgICAgIGVudixcbiAgICAgICAgcmV0cnk6IHsgbWF4QXR0ZW1wdHM6IDUgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEFjdHVhbGx5IHBhY2thZ2UgdXAgb3VyIGNvZGUsIGJvdGggYXMgYSBzZGlzdCBhbmQgYSB3aGVlbCBmb3IgcHVibGlzaGluZy5cbiAgICBhd2FpdCBzaGVsbChweXRob24sIFsnc2V0dXAucHknLCAnc2Rpc3QnLCAnLS1kaXN0LWRpcicsIG91dERpcl0sIHtcbiAgICAgIGN3ZDogc291cmNlRGlyLFxuICAgICAgZW52LFxuICAgIH0pO1xuICAgIGF3YWl0IHNoZWxsKFxuICAgICAgcHl0aG9uLFxuICAgICAgWyctbScsICdwaXAnLCAnd2hlZWwnLCAnLS1uby1kZXBzJywgJy0td2hlZWwtZGlyJywgb3V0RGlyLCBzb3VyY2VEaXJdLFxuICAgICAge1xuICAgICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgICAgZW52LFxuICAgICAgICByZXRyeTogeyBtYXhBdHRlbXB0czogNSB9LFxuICAgICAgfSxcbiAgICApO1xuICAgIGF3YWl0IHNoZWxsKHB5dGhvbiwgWyctbScsICd0d2luZScsICdjaGVjaycsIHBhdGguam9pbihvdXREaXIsICcqJyldLCB7XG4gICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgIGVudixcbiAgICB9KTtcbiAgfVxufVxuXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyNcbi8vICMgQ09ERSBHRU5FUkFUT1IgI1xuLy8gIyMjIyMjIyMjIyMjIyMjIyMjXG5cbmludGVyZmFjZSBFbWl0Q29udGV4dCBleHRlbmRzIE5hbWluZ0NvbnRleHQge1xuICAvKiogQGRlcHJlY2F0ZWQgVGhlIFR5cGVSZXNvbHZlciAqL1xuICByZWFkb25seSByZXNvbHZlcjogVHlwZVJlc29sdmVyO1xufVxuXG5jb25zdCBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gcGF0aC5qb2luKC4uLm5hbWUuc3BsaXQoJy4nKSk7XG59O1xuXG5jb25zdCB0b1B5dGhvbk1ldGhvZE5hbWUgPSAobmFtZTogc3RyaW5nLCBwcm90ZWN0ZWRJdGVtID0gZmFsc2UpOiBzdHJpbmcgPT4ge1xuICBsZXQgdmFsdWUgPSB0b1B5dGhvbklkZW50aWZpZXIodG9TbmFrZUNhc2UobmFtZSkpO1xuICBpZiAocHJvdGVjdGVkSXRlbSkge1xuICAgIHZhbHVlID0gYF8ke3ZhbHVlfWA7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuY29uc3QgdG9QeXRob25Qcm9wZXJ0eU5hbWUgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgY29uc3RhbnQgPSBmYWxzZSxcbiAgcHJvdGVjdGVkSXRlbSA9IGZhbHNlLFxuKTogc3RyaW5nID0+IHtcbiAgbGV0IHZhbHVlID0gdG9QeXRob25JZGVudGlmaWVyKHRvU25ha2VDYXNlKG5hbWUpKTtcblxuICBpZiAoY29uc3RhbnQpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICBpZiAocHJvdGVjdGVkSXRlbSkge1xuICAgIHZhbHVlID0gYF8ke3ZhbHVlfWA7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgZ2l2ZW4gc2lnbmF0dXJlJ3MgcGFyYW1ldGVyIG5hbWUgdG8gd2hhdCBzaG91bGQgYmUgZW1pdHRlZCBpbiBQeXRob24uIEl0IHNsdWdpZmllcyB0aGVcbiAqIHBvc2l0aW9uYWwgcGFyYW1ldGVyIG5hbWVzIHRoYXQgY29sbGlkZSB3aXRoIGEgbGlmdGVkIHByb3AgYnkgYXBwZW5kaW5nIHRyYWlsaW5nIGBfYC4gVGhlcmUgaXMgbm9cbiAqIHJpc2sgb2YgY29uZmxpY3Rpbmcgd2l0aCBhbiBvdGhlciBwb3NpdGlvbmFsIHBhcmFtZXRlciB0aGF0IGVuZHMgd2l0aCBhIGBfYCBjaGFyYWN0ZXIgYmVjYXVzZVxuICogdGhpcyBpcyBwcm9oaWJpdGVkIGJ5IHRoZSBganNpaWAgY29tcGlsZXIgKHBhcmFtZXRlciBuYW1lcyBNVVNUIGJlIGNhbWVsQ2FzZSwgYW5kIG9ubHkgYSBzaW5nbGVcbiAqIGBfYCBpcyBwZXJtaXR0ZWQgd2hlbiBpdCBpcyBvbiAqKmxlYWRpbmcqKiBwb3NpdGlvbilcbiAqXG4gKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0aGF0IG5lZWRzIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0gbGlmdGVkUGFyYW1OYW1lcyAgdGhlIGxpc3Qgb2YgXCJsaWZ0ZWRcIiBrZXl3b3JkIHBhcmFtZXRlcnMgaW4gdGhpcyBzaWduYXR1cmUuIFRoaXMgbXVzdCBiZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQgd2hlbiBnZW5lcmF0aW5nIGEgbmFtZSBmb3IgYSBwYXJhbWV0ZXIgdGhhdCAqKmlzKiogbGlmdGVkLlxuICovXG5mdW5jdGlvbiB0b1B5dGhvblBhcmFtZXRlck5hbWUoXG4gIG5hbWU6IHN0cmluZyxcbiAgbGlmdGVkUGFyYW1OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpLFxuKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9IHRvUHl0aG9uSWRlbnRpZmllcih0b1NuYWtlQ2FzZShuYW1lKSk7XG5cbiAgd2hpbGUgKGxpZnRlZFBhcmFtTmFtZXMuaGFzKHJlc3VsdCkpIHtcbiAgICByZXN1bHQgKz0gJ18nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3Qgc2V0RGlmZmVyZW5jZSA9IDxUPihzZXRBOiBTZXQ8VD4sIHNldEI6IFNldDxUPik6IFNldDxUPiA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQ8VD4oKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIHNldEEpIHtcbiAgICBpZiAoIXNldEIuaGFzKGl0ZW0pKSB7XG4gICAgICByZXN1bHQuYWRkKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBQcmVwYXJlIHB5dGhvbiBtZW1iZXJzIGZvciBlbWlzc2lvbi5cbiAqXG4gKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lLCB0aGV5IHdpbGwgYWxsIG1hcCB0byB0aGUgc2FtZSBweXRob25cbiAqIG5hbWUsIHNvIHdlIHdpbGwgZmlsdGVyIGFsbCBkZXByZWNhdGVkIG1lbWJlcnMgYW5kIGV4cGVjdCB0aGF0IHRoZXJlIHdpbGwgYmUgb25seSBvbmVcbiAqIGxlZnQuXG4gKlxuICogUmV0dXJucyB0aGUgbWVtYmVycyBpbiBhIHNvcnRlZCBsaXN0LlxuICovXG5mdW5jdGlvbiBwcmVwYXJlTWVtYmVycyhtZW1iZXJzOiBQeXRob25CYXNlW10sIHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpIHtcbiAgLy8gY3JlYXRlIGEgbWFwIGZyb20gcHl0aG9uIG5hbWUgdG8gbGlzdCBvZiBtZW1iZXJzXG4gIGNvbnN0IG1hcDogeyBbcHl0aG9uTmFtZTogc3RyaW5nXTogUHl0aG9uQmFzZVtdIH0gPSB7fTtcbiAgZm9yIChjb25zdCBtIG9mIG1lbWJlcnMpIHtcbiAgICBsZXQgbGlzdCA9IG1hcFttLnB5dGhvbk5hbWVdO1xuICAgIGlmICghbGlzdCkge1xuICAgICAgbGlzdCA9IG1hcFttLnB5dGhvbk5hbWVdID0gW107XG4gICAgfVxuXG4gICAgbGlzdC5wdXNoKG0pO1xuICB9XG5cbiAgLy8gbm93IHJldHVybiBhbGwgdGhlIG1lbWJlcnNcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFB5dGhvbkJhc2U+KCk7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgbGlzdF0gb2YgT2JqZWN0LmVudHJpZXMobWFwKSkge1xuICAgIGxldCBtZW1iZXI7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGlmIHdlIGhhdmUgYSBzaW5nbGUgbWVtYmVyIGZvciB0aGlzIG5vcm1hbGl6ZWQgbmFtZSwgdGhlbiB1c2UgaXRcbiAgICAgIG1lbWJlciA9IGxpc3RbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHdlIGZvdW5kIG1vcmUgdGhhbiBvbmUgbWVtYmVyIHdpdGggdGhlIHNhbWUgcHl0aG9uIG5hbWUsIGZpbHRlciBhbGxcbiAgICAgIC8vIGRlcHJlY2F0ZWQgdmVyc2lvbnMgYW5kIGNoZWNrIHRoYXQgd2UgYXJlIGxlZnQgd2l0aCBleGFjdGx5IG9uZS5cbiAgICAgIC8vIG90aGVyd2lzZSwgdGhleSB3aWxsIG92ZXJ3cml0ZSBlYWNoIG90aGVyXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yNTA4XG4gICAgICBjb25zdCBub25EZXByZWNhdGVkID0gbGlzdC5maWx0ZXIoKHgpID0+ICFpc0RlcHJlY2F0ZWQoeCkpO1xuICAgICAgaWYgKG5vbkRlcHJlY2F0ZWQubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIG5vbi1kZXByZWNhdGVkIG1lbWJlcnMgd2hpY2ggbWFwIHRvIHRoZSBQeXRob24gbmFtZSBcIiR7bmFtZX1cImAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChub25EZXByZWNhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIG1lbWJlcnMgd2hpY2ggbWFwIHRvIHRoZSBQeXRob24gbmFtZSBcIiR7bmFtZX1cIiwgYnV0IGFsbCBvZiB0aGVtIGFyZSBkZXByZWNhdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbWVtYmVyID0gbm9uRGVwcmVjYXRlZFswXTtcbiAgICB9XG5cbiAgICByZXQucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcmV0dXJuIHNvcnRNZW1iZXJzKHJldCwgcmVzb2x2ZXIpO1xufVxuXG5jb25zdCBzb3J0TWVtYmVycyA9IChcbiAgbWVtYmVyczogUHl0aG9uQmFzZVtdLFxuICByZXNvbHZlcjogVHlwZVJlc29sdmVyLFxuKTogUHl0aG9uQmFzZVtdID0+IHtcbiAgbGV0IHNvcnRhYmxlID0gbmV3IEFycmF5PHtcbiAgICBtZW1iZXI6IFB5dGhvbkJhc2UgJiBJU29ydGFibGVUeXBlO1xuICAgIGRlcGVuZHNPbjogU2V0PFB5dGhvblR5cGU+O1xuICB9PigpO1xuICBjb25zdCBzb3J0ZWQgPSBuZXcgQXJyYXk8UHl0aG9uQmFzZT4oKTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8UHl0aG9uQmFzZT4oKTtcblxuICAvLyBUaGUgZmlyc3QgdGhpbmcgd2Ugd2FudCB0byBkbywgaXMgcHVzaCBhbnkgaXRlbSB3aGljaCBpcyBub3Qgc29ydGFibGUgdG8gdGhlIHZlcnlcbiAgLy8gZnJvbnQgb2YgdGhlIGxpc3QuIFRoaXMgd2lsbCBiZSB0aGluZ3MgbGlrZSBtZXRob2RzLCBwcm9wZXJ0aWVzLCBldGMuXG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIG1lbWJlcnMpIHtcbiAgICBpZiAoIWlzU29ydGFibGVUeXBlKG1lbWJlcikpIHtcbiAgICAgIHNvcnRlZC5wdXNoKG1lbWJlcik7XG4gICAgICBzZWVuLmFkZChtZW1iZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3J0YWJsZS5wdXNoKHsgbWVtYmVyLCBkZXBlbmRzT246IG5ldyBTZXQobWVtYmVyLmRlcGVuZHNPbihyZXNvbHZlcikpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB0aGF0IHdlJ3ZlIHB1bGxlZCBvdXQgZXZlcnl0aGluZyB0aGF0IGNvdWxkbid0IHBvc3NpYmx5IGhhdmUgZGVwZW5kZW5jaWVzLFxuICAvLyB3ZSB3aWxsIGdvIHRocm91Z2ggdGhlIHJlbWFpbmluZyBpdGVtcywgYW5kIHB1bGwgb2ZmIGFueSBpdGVtcyB3aGljaCBoYXZlIG5vXG4gIC8vIGRlcGVuZGVuY2llcyB0aGF0IHdlIGhhdmVuJ3QgYWxyZWFkeSBzb3J0ZWQuXG4gIHdoaWxlIChzb3J0YWJsZS5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCB7IG1lbWJlciwgZGVwZW5kc09uIH0gb2Ygc29ydGFibGUpIHtcbiAgICAgIGNvbnN0IGRpZmYgPSBzZXREaWZmZXJlbmNlKGRlcGVuZHNPbiwgc2Vlbik7XG4gICAgICBpZiAoWy4uLmRpZmZdLmZpbmQoKGRlcCkgPT4gIShkZXAgaW5zdGFuY2VvZiBQeXRob25Nb2R1bGUpKSA9PSBudWxsKSB7XG4gICAgICAgIHNvcnRlZC5wdXNoKG1lbWJlcik7XG4gICAgICAgIHNlZW4uYWRkKG1lbWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGVmdG92ZXIgPSBzb3J0YWJsZS5maWx0ZXIoKHsgbWVtYmVyIH0pID0+ICFzZWVuLmhhcyhtZW1iZXIpKTtcbiAgICBpZiAobGVmdG92ZXIubGVuZ3RoID09PSBzb3J0YWJsZS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBzb3J0IG1lbWJlcnMgKGNpcmN1bGFyIGRlcGVuZGVuY3k/KS4gTGVmdG92ZXI6ICR7bGVmdG92ZXJcbiAgICAgICAgICAubWFwKChsbykgPT4gbG8ubWVtYmVyLnB5dGhvbk5hbWUpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvcnRhYmxlID0gbGVmdG92ZXI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNvcnRlZDtcbn07XG5cbmludGVyZmFjZSBQeXRob25CYXNlIHtcbiAgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkb2NzPzogc3BlYy5Eb2NzO1xuXG4gIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCwgb3B0cz86IGFueSk6IHZvaWQ7XG5cbiAgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cztcbn1cblxuaW50ZXJmYWNlIFB5dGhvblR5cGUgZXh0ZW5kcyBQeXRob25CYXNlIHtcbiAgLy8gVGhlIEpTSUkgRlFOIGZvciB0aGlzIGl0ZW0sIGlmIHRoaXMgaXRlbSBkb2Vzbid0IGV4aXN0IGFzIGEgSlNJSSB0eXBlLCB0aGVuIGl0XG4gIC8vIGRvZXNuJ3QgaGF2ZSBhIEZRTiBhbmQgaXQgc2hvdWxkIGJlIG51bGw7XG4gIHJlYWRvbmx5IGZxbj86IHN0cmluZztcblxuICBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIElTb3J0YWJsZVR5cGUge1xuICBkZXBlbmRzT24ocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFB5dGhvblR5cGVbXTtcbn1cblxuZnVuY3Rpb24gaXNTb3J0YWJsZVR5cGUoYXJnOiB1bmtub3duKTogYXJnIGlzIElTb3J0YWJsZVR5cGUge1xuICByZXR1cm4gKGFyZyBhcyBQYXJ0aWFsPElTb3J0YWJsZVR5cGU+KS5kZXBlbmRzT24gIT09IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIFB5dGhvblR5cGVPcHRzIHtcbiAgYmFzZXM/OiBzcGVjLlR5cGVSZWZlcmVuY2VbXTtcbn1cblxuYWJzdHJhY3QgY2xhc3MgQmFzZVB5dGhvbkNsYXNzVHlwZSBpbXBsZW1lbnRzIFB5dGhvblR5cGUsIElTb3J0YWJsZVR5cGUge1xuICBwcm90ZWN0ZWQgYmFzZXM6IHNwZWMuVHlwZVJlZmVyZW5jZVtdO1xuICBwcm90ZWN0ZWQgbWVtYmVyczogUHl0aG9uQmFzZVtdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VwYXJhdGVNZW1iZXJzOiBib29sZWFuID0gdHJ1ZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHNwZWM6IHNwZWMuVHlwZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZnFuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0czogUHl0aG9uVHlwZU9wdHMsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgY29uc3QgeyBiYXNlcyA9IFtdIH0gPSBvcHRzO1xuXG4gICAgdGhpcy5iYXNlcyA9IGJhc2VzO1xuICAgIHRoaXMubWVtYmVycyA9IFtdO1xuICB9XG5cbiAgcHVibGljIGRlcGVuZHNPbihyZXNvbHZlcjogVHlwZVJlc29sdmVyKTogUHl0aG9uVHlwZVtdIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXk8UHl0aG9uVHlwZT4oKTtcbiAgICBjb25zdCBwYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQodGhpcy5mcW4hKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmV0dXJuIGFueSBiYXNlcyB0aGF0IGFyZSBpbiB0aGUgc2FtZSBtb2R1bGUgYXQgdGhlIHNhbWUgbGV2ZWwgb2ZcbiAgICAvLyBuZXN0aW5nLlxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGJhc2Ugb2YgdGhpcy5iYXNlcykge1xuICAgICAgaWYgKHNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UoYmFzZSkpIHtcbiAgICAgICAgaWYgKHJlc29sdmVyLmlzSW5Nb2R1bGUoYmFzZSkpIHtcbiAgICAgICAgICAvLyBHaXZlbiBhIGJhc2UsIHdlIG5lZWQgdG8gbG9jYXRlIHRoZSBiYXNlJ3MgcGFyZW50IHRoYXQgaXMgdGhlIHNhbWUgYXNcbiAgICAgICAgICAvLyBvdXIgcGFyZW50LCBiZWNhdXNlIHdlIG9ubHkgY2FyZSBhYm91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYXQgdGhlXG4gICAgICAgICAgLy8gc2FtZSBsZXZlbCBvZiBvdXIgb3duLlxuICAgICAgICAgIC8vIFRPRE86IFdlIG1pZ2h0IG5lZWQgdG8gcmVjdXJzZSBpbnRvIG91ciBtZW1iZXJzIHRvIGFsc28gZmluZCB0aGVpclxuICAgICAgICAgIC8vICAgICAgIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICBsZXQgYmFzZUl0ZW0gPSByZXNvbHZlci5nZXRUeXBlKGJhc2UpO1xuICAgICAgICAgIGxldCBiYXNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGJhc2UpO1xuICAgICAgICAgIHdoaWxlIChiYXNlUGFyZW50ICE9PSBwYXJlbnQpIHtcbiAgICAgICAgICAgIGJhc2VJdGVtID0gYmFzZVBhcmVudDtcbiAgICAgICAgICAgIGJhc2VQYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQoYmFzZUl0ZW0uZnFuISk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzZWVuLmhhcyhiYXNlSXRlbS5mcW4hKSkge1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYmFzZUl0ZW0pO1xuICAgICAgICAgICAgc2Vlbi5hZGQoYmFzZUl0ZW0uZnFuISk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgLi4udGhpcy5iYXNlcy5tYXAoKGJhc2UpID0+IHRvVHlwZU5hbWUoYmFzZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpKSxcbiAgICAgIC4uLnRoaXMubWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKSB7XG4gICAgdGhpcy5tZW1iZXJzLnB1c2gobWVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIGlmICghdGhpcy5mcW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBtYWtlIGFwaUxvY2F0aW9uIGZvciAke3RoaXMucHl0aG9uTmFtZX0sIGRvZXMgbm90IGhhdmUgRlFOYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7IGFwaTogJ3R5cGUnLCBmcW46IHRoaXMuZnFuIH07XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29udGV4dCA9IG5lc3RlZENvbnRleHQoY29udGV4dCwgdGhpcy5mcW4pO1xuXG4gICAgY29uc3QgY2xhc3NQYXJhbXMgPSB0aGlzLmdldENsYXNzUGFyYW1zKGNvbnRleHQpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5weXRob25OYW1lLCBjbGFzc1BhcmFtcyk7XG5cbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgICB0cmFpbGluZ05ld0xpbmU6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5ib3VuZFJlc29sdmVyKGNvbnRleHQucmVzb2x2ZXIpO1xuICAgICAgbGV0IHNob3VsZFNlcGFyYXRlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwcmVwYXJlTWVtYmVycyh0aGlzLm1lbWJlcnMsIHJlc29sdmVyKSkge1xuICAgICAgICBpZiAoc2hvdWxkU2VwYXJhdGUpIHtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGRTZXBhcmF0ZSA9IHRoaXMuc2VwYXJhdGVNZW1iZXJzO1xuICAgICAgICBtZW1iZXIuZW1pdChjb2RlLCB7IC4uLmNvbnRleHQsIHJlc29sdmVyIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGlmICh0aGlzLmZxbiAhPSBudWxsKSB7XG4gICAgICBjb250ZXh0LmVtaXR0ZWRUeXBlcy5hZGQodGhpcy5mcW4pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBib3VuZFJlc29sdmVyKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBUeXBlUmVzb2x2ZXIge1xuICAgIGlmICh0aGlzLmZxbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlci5iaW5kKHRoaXMuZnFuKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgQmFzZU1ldGhvZE9wdHMge1xuICBhYnN0cmFjdD86IGJvb2xlYW47XG4gIGxpZnRlZFByb3A/OiBzcGVjLkludGVyZmFjZVR5cGU7XG4gIHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG59XG5cbmludGVyZmFjZSBCYXNlTWV0aG9kRW1pdE9wdHMge1xuICByZW5kZXJBYnN0cmFjdD86IGJvb2xlYW47XG4gIGZvcmNlRW1pdEJvZHk/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlTWV0aG9kIGltcGxlbWVudHMgUHl0aG9uQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhYnN0cmFjdDogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBjbGFzc0FzRmlyc3RQYXJhbWV0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJldHVybkZyb21KU0lJTWV0aG9kOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxpZnRlZFByb3A/OiBzcGVjLkludGVyZmFjZVR5cGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBqc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtZXRlcnM6IHNwZWMuUGFyYW1ldGVyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXR1cm5zOiBzcGVjLk9wdGlvbmFsVmFsdWUgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNTdGF0aWM6IGJvb2xlYW4sXG4gICAgb3B0czogQmFzZU1ldGhvZE9wdHMsXG4gICkge1xuICAgIHRoaXMuYWJzdHJhY3QgPSAhIW9wdHMuYWJzdHJhY3Q7XG4gICAgdGhpcy5saWZ0ZWRQcm9wID0gb3B0cy5saWZ0ZWRQcm9wO1xuICAgIHRoaXMucGFyZW50ID0gb3B0cy5wYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUxvY2F0aW9uKCk6IEFwaUxvY2F0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogdGhpcy5wYXJlbnQuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogdGhpcy5qc05hbWUgPz8gJycsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgdG9UeXBlTmFtZSh0aGlzLnJldHVybnMpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgIC4uLnRoaXMucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PlxuICAgICAgICB0b1R5cGVOYW1lKHBhcmFtKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCksXG4gICAgICApLFxuICAgICAgLi4ubGlmdGVkUHJvcGVydGllcyh0aGlzLmxpZnRlZFByb3ApLFxuICAgICk7XG5cbiAgICBmdW5jdGlvbiogbGlmdGVkUHJvcGVydGllcyhcbiAgICAgIHN0cnVjdDogc3BlYy5JbnRlcmZhY2VUeXBlIHwgdW5kZWZpbmVkLFxuICAgICk6IEl0ZXJhYmxlSXRlcmF0b3I8UHl0aG9uSW1wb3J0cz4ge1xuICAgICAgaWYgKHN0cnVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBzdHJ1Y3QucHJvcGVydGllcyA/PyBbXSkge1xuICAgICAgICB5aWVsZCB0b1R5cGVOYW1lKHByb3AudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBiYXNlIG9mIHN0cnVjdC5pbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IGlmYWNlID0gY29udGV4dC5yZXNvbHZlci5kZXJlZmVyZW5jZShiYXNlKSBhcyBzcGVjLkludGVyZmFjZVR5cGU7XG4gICAgICAgIGZvciAoY29uc3QgaW1wb3J0cyBvZiBsaWZ0ZWRQcm9wZXJ0aWVzKGlmYWNlKSkge1xuICAgICAgICAgIHlpZWxkIGltcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZW1pdChcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgb3B0cz86IEJhc2VNZXRob2RFbWl0T3B0cyxcbiAgKSB7XG4gICAgY29uc3QgeyByZW5kZXJBYnN0cmFjdCA9IHRydWUsIGZvcmNlRW1pdEJvZHkgPSBmYWxzZSB9ID0gb3B0cyA/PyB7fTtcblxuICAgIGNvbnN0IHJldHVyblR5cGU6IHN0cmluZyA9IHRvVHlwZU5hbWUodGhpcy5yZXR1cm5zKS5weXRob25UeXBlKGNvbnRleHQpO1xuXG4gICAgLy8gV2UgY2Fubm90IChjdXJyZW50bHk/KSBibGluZGx5IHVzZSB0aGUgbmFtZXMgZ2l2ZW4gdG8gdXMgYnkgdGhlIEpTSUkgZm9yXG4gICAgLy8gaW5pdGlhbGl6ZXJzLCBiZWNhdXNlIG91ciBrZXl3b3JkIGxpZnRpbmcgd2lsbCBhbGxvdyB0d28gbmFtZXMgdG8gY2xhc2guXG4gICAgLy8gVGhpcyBjYW4gaG9wZWZ1bGx5IGJlIHJlbW92ZWQgb25jZSB3ZSBnZXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yODhcbiAgICAvLyByZXNvbHZlZCwgc28gYnVpbGQgdXAgYSBsaXN0IG9mIGFsbCBvZiB0aGUgcHJvcCBuYW1lcyBzbyB3ZSBjYW4gY2hlY2sgYWdhaW5zdFxuICAgIC8vIHRoZW0gbGF0ZXIuXG4gICAgY29uc3QgbGlmdGVkUHJvcE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgaWYgKHRoaXMubGlmdGVkUHJvcD8ucHJvcGVydGllcyAhPSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5saWZ0ZWRQcm9wLnByb3BlcnRpZXMpIHtcbiAgICAgICAgbGlmdGVkUHJvcE5hbWVzLmFkZCh0b1B5dGhvblBhcmFtZXRlck5hbWUocHJvcC5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2UgbmVlZCB0byB0dXJuIGEgbGlzdCBvZiBKU0lJIHBhcmFtZXRlcnMsIGludG8gUHl0aG9uIHN0eWxlIGFyZ3VtZW50cyB3aXRoXG4gICAgLy8gZ3JhZHVhbCB0eXBpbmcsIHNvIHdlJ2xsIGhhdmUgdG8gaXRlcmF0ZSBvdmVyIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMsIGFuZFxuICAgIC8vIGJ1aWxkIHRoZSBsaXN0LCBjb252ZXJ0aW5nIGFzIHdlIGdvLlxuICAgIGNvbnN0IHB5dGhvblBhcmFtczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHRoaXMucGFyYW1ldGVycykge1xuICAgICAgLy8gV2UgY2Fubm90IChjdXJyZW50bHk/KSBibGluZGx5IHVzZSB0aGUgbmFtZXMgZ2l2ZW4gdG8gdXMgYnkgdGhlIEpTSUkgZm9yXG4gICAgICAvLyBpbml0aWFsaXplcnMsIGJlY2F1c2Ugb3VyIGtleXdvcmQgbGlmdGluZyB3aWxsIGFsbG93IHR3byBuYW1lcyB0byBjbGFzaC5cbiAgICAgIC8vIFRoaXMgY2FuIGhvcGVmdWxseSBiZSByZW1vdmVkIG9uY2Ugd2UgZ2V0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjg4XG4gICAgICAvLyByZXNvbHZlZC5cbiAgICAgIGNvbnN0IHBhcmFtTmFtZTogc3RyaW5nID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKFxuICAgICAgICBwYXJhbS5uYW1lLFxuICAgICAgICBsaWZ0ZWRQcm9wTmFtZXMsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBwYXJhbVR5cGUgPSB0b1R5cGVOYW1lKHBhcmFtKS5weXRob25UeXBlKHtcbiAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgcGFyYW1ldGVyVHlwZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGFyYW1EZWZhdWx0ID0gcGFyYW0ub3B0aW9uYWwgPyAnID0gTm9uZScgOiAnJztcblxuICAgICAgcHl0aG9uUGFyYW1zLnB1c2goYCR7cGFyYW1OYW1lfTogJHtwYXJhbVR5cGV9JHtwYXJhbURlZmF1bHR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jdW1lbnRhYmxlQXJnczogRG9jdW1lbnRhYmxlQXJndW1lbnRbXSA9IHRoaXMucGFyYW1ldGVyc1xuICAgICAgLm1hcChcbiAgICAgICAgKHApID0+XG4gICAgICAgICAgKHtcbiAgICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICAgIGRvY3M6IHAuZG9jcyxcbiAgICAgICAgICAgIGRlZmluaW5nVHlwZTogdGhpcy5wYXJlbnQsXG4gICAgICAgICAgfSBhcyBEb2N1bWVudGFibGVBcmd1bWVudCksXG4gICAgICApXG4gICAgICAvLyBJZiB0aGVyZSdzIGxpZnRlZFByb3BzLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgc3RydWN0IGFuZCBpdCB3b24ndCBiZSBfYWN0dWFsbHlfIGVtaXR0ZWQuXG4gICAgICAuZmlsdGVyKChfLCBpbmRleCkgPT5cbiAgICAgICAgdGhpcy5saWZ0ZWRQcm9wICE9IG51bGwgPyBpbmRleCA8IHRoaXMucGFyYW1ldGVycy5sZW5ndGggLSAxIDogdHJ1ZSxcbiAgICAgIClcbiAgICAgIC5tYXAoKHBhcmFtKSA9PiAoe1xuICAgICAgICAuLi5wYXJhbSxcbiAgICAgICAgbmFtZTogdG9QeXRob25QYXJhbWV0ZXJOYW1lKHBhcmFtLm5hbWUsIGxpZnRlZFByb3BOYW1lcyksXG4gICAgICB9KSk7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGEgbGlmdGVkIHBhcmFtZXRlciwgdGhlbiB3ZSdsbCBkcm9wIHRoZSBsYXN0IGFyZ3VtZW50IHRvIG91ciBwYXJhbXNcbiAgICAvLyBhbmQgdGhlbiB3ZSdsbCBsaWZ0IGFsbCBvZiB0aGUgcGFyYW1zIG9mIHRoZSBsaWZ0ZWQgdHlwZSBhcyBrZXl3b3JkIGFyZ3VtZW50c1xuICAgIC8vIHRvIHRoZSBmdW5jdGlvbi5cbiAgICBpZiAodGhpcy5saWZ0ZWRQcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFJlbW92ZSBvdXIgbGFzdCBpdGVtLlxuICAgICAgcHl0aG9uUGFyYW1zLnBvcCgpO1xuICAgICAgY29uc3QgbGlmdGVkUHJvcGVydGllcyA9IHRoaXMuZ2V0TGlmdGVkUHJvcGVydGllcyhjb250ZXh0LnJlc29sdmVyKTtcblxuICAgICAgaWYgKGxpZnRlZFByb3BlcnRpZXMubGVuZ3RoID49IDEpIHtcbiAgICAgICAgLy8gQWxsIG9mIHRoZXNlIHBhcmFtZXRlcnMgYXJlIGtleXdvcmQgb25seSBhcmd1bWVudHMsIHNvIHdlJ2xsIG1hcmsgdGhlbVxuICAgICAgICAvLyBhcyBzdWNoLlxuICAgICAgICBweXRob25QYXJhbXMucHVzaCgnKicpO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgb2Ygb3VyIHByb3BzLCBhbmQgcmVmbGVjdCB0aGVtIGludG8gb3VyIHBhcmFtcy5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGxpZnRlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSB0b1B5dGhvblBhcmFtZXRlck5hbWUocHJvcC5wcm9wLm5hbWUpO1xuICAgICAgICAgIGNvbnN0IHBhcmFtVHlwZSA9IHRvVHlwZU5hbWUocHJvcC5wcm9wKS5weXRob25UeXBlKHtcbiAgICAgICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgICAgICBwYXJhbWV0ZXJUeXBlOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHBhcmFtRGVmYXVsdCA9IHByb3AucHJvcC5vcHRpb25hbCA/ICcgPSBOb25lJyA6ICcnO1xuXG4gICAgICAgICAgcHl0aG9uUGFyYW1zLnB1c2goYCR7cGFyYW1OYW1lfTogJHtwYXJhbVR5cGV9JHtwYXJhbURlZmF1bHR9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRG9jdW1lbnQgdGhlbSBhcyBrZXl3b3JkIGFyZ3VtZW50c1xuICAgICAgZG9jdW1lbnRhYmxlQXJncy5wdXNoKFxuICAgICAgICAuLi5saWZ0ZWRQcm9wZXJ0aWVzLm1hcChcbiAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgIG5hbWU6IHAucHJvcC5uYW1lLFxuICAgICAgICAgICAgICBkb2NzOiBwLnByb3AuZG9jcyxcbiAgICAgICAgICAgICAgZGVmaW5pbmdUeXBlOiBwLmRlZmluaW5nVHlwZSxcbiAgICAgICAgICAgIH0gYXMgRG9jdW1lbnRhYmxlQXJndW1lbnQpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCA+PSAxICYmXG4gICAgICB0aGlzLnBhcmFtZXRlcnNbdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCAtIDFdLnZhcmlhZGljXG4gICAgKSB7XG4gICAgICAvLyBBbm90aGVyIHNpdHVhdGlvbiB3ZSBjb3VsZCBiZSBpbiwgaXMgdGhhdCBpbnN0ZWFkIG9mIGhhdmluZyBhIHBsYWluIHBhcmFtZXRlclxuICAgICAgLy8gd2UgaGF2ZSBhIHZhcmlhZGljIHBhcmFtZXRlciB3aGVyZSB3ZSBuZWVkIHRvIGV4cGFuZCB0aGUgbGFzdCBwYXJhbWV0ZXIgYXMgYVxuICAgICAgLy8gKmFyZ3MuXG4gICAgICBweXRob25QYXJhbXMucG9wKCk7XG5cbiAgICAgIGNvbnN0IGxhc3RQYXJhbWV0ZXIgPSB0aGlzLnBhcmFtZXRlcnMuc2xpY2UoLTEpWzBdO1xuICAgICAgY29uc3QgcGFyYW1OYW1lID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKGxhc3RQYXJhbWV0ZXIubmFtZSk7XG4gICAgICBjb25zdCBwYXJhbVR5cGUgPSB0b1R5cGVOYW1lKGxhc3RQYXJhbWV0ZXIudHlwZSkucHl0aG9uVHlwZShjb250ZXh0KTtcblxuICAgICAgcHl0aG9uUGFyYW1zLnB1c2goYCoke3BhcmFtTmFtZX06ICR7cGFyYW1UeXBlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY29yYXRvcnMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgaWYgKHRoaXMuanNOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBuZWVkZWQgYmVjYXVzZSBteXB5IGRvZXMgbm90IGtub3cgaG93IHRvIGNoZWNrIGRlY29yYXRlZCBkZWNsYXJhdGlvbnNcbiAgICAgIGRlY29yYXRvcnMucHVzaChgQGpzaWkubWVtYmVyKGpzaWlfbmFtZT1cIiR7dGhpcy5qc05hbWV9XCIpYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVjb3JhdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaChgQCR7dGhpcy5kZWNvcmF0b3J9YCk7XG4gICAgfVxuXG4gICAgaWYgKHJlbmRlckFic3RyYWN0ICYmIHRoaXMuYWJzdHJhY3QpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaCgnQGFiYy5hYnN0cmFjdG1ldGhvZCcpO1xuICAgIH1cblxuICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBuZWVkZWQgYmVjYXVzZSBteXB5IGRvZXMgbm90IGtub3cgaG93IHRvIGNoZWNrIGRlY29yYXRlZCBkZWNsYXJhdGlvbnNcbiAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnNcbiAgICAgICAgLmpvaW4oJyAjIHR5cGU6IGlnbm9yZVttaXNjXVxcbicpXG4gICAgICAgIC5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgY29kZS5saW5lKGRlY29yYXRvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHl0aG9uUGFyYW1zLnVuc2hpZnQoXG4gICAgICBzbHVnaWZ5QXNOZWVkZWQoXG4gICAgICAgIHRoaXMuaW1wbGljaXRQYXJhbWV0ZXIsXG4gICAgICAgIHB5dGhvblBhcmFtcy5tYXAoKHBhcmFtKSA9PiBwYXJhbS5zcGxpdCgnOicpWzBdLnRyaW0oKSksXG4gICAgICApLFxuICAgICk7XG5cbiAgICBvcGVuU2lnbmF0dXJlKFxuICAgICAgY29kZSxcbiAgICAgICdkZWYnLFxuICAgICAgdGhpcy5weXRob25OYW1lLFxuICAgICAgcHl0aG9uUGFyYW1zLFxuICAgICAgZmFsc2UsXG4gICAgICByZXR1cm5UeXBlLFxuICAgICk7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGFyZ3VtZW50czogZG9jdW1lbnRhYmxlQXJncyxcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBtZXRob2QtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRCb2R5KFxuICAgICAgY29kZSxcbiAgICAgIGNvbnRleHQsXG4gICAgICByZW5kZXJBYnN0cmFjdCxcbiAgICAgIGZvcmNlRW1pdEJvZHksXG4gICAgICBsaWZ0ZWRQcm9wTmFtZXMsXG4gICAgICBweXRob25QYXJhbXNbMF0sXG4gICAgICByZXR1cm5UeXBlLFxuICAgICk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRCb2R5KFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICByZW5kZXJBYnN0cmFjdDogYm9vbGVhbixcbiAgICBmb3JjZUVtaXRCb2R5OiBib29sZWFuLFxuICAgIGxpZnRlZFByb3BOYW1lczogU2V0PHN0cmluZz4sXG4gICAgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyxcbiAgICByZXR1cm5UeXBlOiBzdHJpbmcsXG4gICkge1xuICAgIGlmIChcbiAgICAgICghdGhpcy5zaG91bGRFbWl0Qm9keSAmJiAhZm9yY2VFbWl0Qm9keSkgfHxcbiAgICAgIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KVxuICAgICkge1xuICAgICAgY29kZS5saW5lKCcuLi4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubGlmdGVkUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZW1pdEF1dG9Qcm9wcyhjb2RlLCBjb250ZXh0LCBsaWZ0ZWRQcm9wTmFtZXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXRKc2lpTWV0aG9kQ2FsbChcbiAgICAgICAgY29kZSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgbGlmdGVkUHJvcE5hbWVzLFxuICAgICAgICBpbXBsaWNpdFBhcmFtZXRlcixcbiAgICAgICAgcmV0dXJuVHlwZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0QXV0b1Byb3BzKFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICBsaWZ0ZWRQcm9wTmFtZXM6IFNldDxzdHJpbmc+LFxuICApIHtcbiAgICBjb25zdCBsYXN0UGFyYW1ldGVyID0gdGhpcy5wYXJhbWV0ZXJzLnNsaWNlKC0xKVswXTtcbiAgICBjb25zdCBhcmdOYW1lID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKGxhc3RQYXJhbWV0ZXIubmFtZSwgbGlmdGVkUHJvcE5hbWVzKTtcbiAgICBjb25zdCB0eXBlTmFtZSA9IHRvVHlwZU5hbWUobGFzdFBhcmFtZXRlci50eXBlKS5weXRob25UeXBlKHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBwcm9wZXJ0aWVzLCB3aGljaCBhcmUgbWFuZGF0b3J5LCB0aGVzZSBhcmUgdGhlXG4gICAgLy8gb25lcyB3ZSB3aWxsIHNwZWNpZml5IHRvIHN0YXJ0IHdpdGggaW4gb3VyIGRpY3Rpb25hcnkgbGl0ZXJhbC5cbiAgICBjb25zdCBsaWZ0ZWRQcm9wcyA9IHRoaXMuZ2V0TGlmdGVkUHJvcGVydGllcyhjb250ZXh0LnJlc29sdmVyKS5tYXAoXG4gICAgICAocCkgPT4gbmV3IFN0cnVjdEZpZWxkKHRoaXMuZ2VuZXJhdG9yLCBwLnByb3AsIHAuZGVmaW5pbmdUeXBlKSxcbiAgICApO1xuICAgIGNvbnN0IGFzc2lnbm1lbnRzID0gbGlmdGVkUHJvcHNcbiAgICAgIC5tYXAoKHApID0+IHAucHl0aG9uTmFtZSlcbiAgICAgIC5tYXAoKHYpID0+IGAke3Z9PSR7dn1gKTtcblxuICAgIGFzc2lnbkNhbGxSZXN1bHQoY29kZSwgYXJnTmFtZSwgdHlwZU5hbWUsIGFzc2lnbm1lbnRzKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEpzaWlNZXRob2RDYWxsKFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICBsaWZ0ZWRQcm9wTmFtZXM6IFNldDxzdHJpbmc+LFxuICAgIGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcsXG4gICAgcmV0dXJuVHlwZTogc3RyaW5nLFxuICApIHtcbiAgICBjb25zdCBtZXRob2RQcmVmaXg6IHN0cmluZyA9IHRoaXMucmV0dXJuRnJvbUpTSUlNZXRob2QgPyAncmV0dXJuICcgOiAnJztcblxuICAgIGNvbnN0IGpzaWlNZXRob2RQYXJhbXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHRoaXMuY2xhc3NBc0ZpcnN0UGFyYW1ldGVyKSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBub3Qga25vd24uJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1N0YXRpYykge1xuICAgICAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goXG4gICAgICAgICAgdG9UeXBlTmFtZSh0aGlzLnBhcmVudCkucHl0aG9uVHlwZSh7XG4gICAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNpbmcgdGhlIGR5bmFtaWMgY2xhc3Mgb2YgYHNlbGZgLlxuICAgICAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goYCR7aW1wbGljaXRQYXJhbWV0ZXJ9Ll9fY2xhc3NfX2ApO1xuICAgICAgfVxuICAgIH1cbiAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goaW1wbGljaXRQYXJhbWV0ZXIpO1xuICAgIGlmICh0aGlzLmpzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goYFwiJHt0aGlzLmpzTmFtZX1cImApO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBsYXN0IGFyZyBpcyB2YXJpYWRpYywgZXhwYW5kIHRoZSB0dXBsZVxuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHRoaXMucGFyYW1ldGVycykge1xuICAgICAgbGV0IGV4cHIgPSB0b1B5dGhvblBhcmFtZXRlck5hbWUocGFyYW0ubmFtZSwgbGlmdGVkUHJvcE5hbWVzKTtcbiAgICAgIGlmIChwYXJhbS52YXJpYWRpYykge1xuICAgICAgICBleHByID0gYCoke2V4cHJ9YDtcbiAgICAgIH1cbiAgICAgIHBhcmFtcy5wdXNoKGV4cHIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gYGpzaWkuJHt0aGlzLmpzaWlNZXRob2R9KCR7anNpaU1ldGhvZFBhcmFtcy5qb2luKFxuICAgICAgJywgJyxcbiAgICApfSwgWyR7cGFyYW1zLmpvaW4oJywgJyl9XSlgO1xuICAgIGNvZGUubGluZShcbiAgICAgIGAke21ldGhvZFByZWZpeH0ke1xuICAgICAgICB0aGlzLnJldHVybkZyb21KU0lJTWV0aG9kICYmIHJldHVyblR5cGVcbiAgICAgICAgICA/IGB0eXBpbmcuY2FzdCgke3JldHVyblR5cGV9LCAke3ZhbHVlfSlgXG4gICAgICAgICAgOiB2YWx1ZVxuICAgICAgfWAsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGlmdGVkUHJvcGVydGllcyhyZXNvbHZlcjogVHlwZVJlc29sdmVyKTogUHJvcGVydHlEZWZpbml0aW9uW10ge1xuICAgIGNvbnN0IGxpZnRlZFByb3BlcnRpZXM6IFByb3BlcnR5RGVmaW5pdGlvbltdID0gW107XG5cbiAgICBjb25zdCBzdGFjayA9IFt0aGlzLmxpZnRlZFByb3BdO1xuICAgIGNvbnN0IGtub3duSWZhY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qga25vd25Qcm9wcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoXG4gICAgICBsZXQgY3VycmVudCA9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICBjdXJyZW50ICE9IG51bGw7XG4gICAgICBjdXJyZW50ID0gc3RhY2suc2hpZnQoKVxuICAgICkge1xuICAgICAga25vd25JZmFjZXMuYWRkKGN1cnJlbnQuZnFuKTtcblxuICAgICAgLy8gQWRkIGFueSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBpbnRlcmZhY2UgZGVwZW5kcyBvbiwgdG8gdGhlIGxpc3QuXG4gICAgICBpZiAoY3VycmVudC5pbnRlcmZhY2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZmFjZSBvZiBjdXJyZW50LmludGVyZmFjZXMpIHtcbiAgICAgICAgICBpZiAoa25vd25JZmFjZXMuaGFzKGlmYWNlKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YWNrLnB1c2gocmVzb2x2ZXIuZGVyZWZlcmVuY2UoaWZhY2UpIGFzIHNwZWMuSW50ZXJmYWNlVHlwZSk7XG4gICAgICAgICAga25vd25JZmFjZXMuYWRkKGlmYWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgaW50ZXJmYWNlIHRvIG91ciBsaXN0IG9mIHByb3BlcnRpZXMuXG4gICAgICBpZiAoY3VycmVudC5wcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGN1cnJlbnQucHJvcGVydGllcykge1xuICAgICAgICAgIGlmIChrbm93blByb3BzLmhhcyhwcm9wLm5hbWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGlmdGVkUHJvcGVydGllcy5wdXNoKHsgcHJvcCwgZGVmaW5pbmdUeXBlOiBjdXJyZW50IH0pO1xuICAgICAgICAgIGtub3duUHJvcHMuYWRkKHByb3AubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGlmdGVkUHJvcGVydGllcztcbiAgfVxufVxuXG5pbnRlcmZhY2UgQmFzZVByb3BlcnR5T3B0cyB7XG4gIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgaXNTdGF0aWM/OiBib29sZWFuO1xuICBwYXJlbnQ6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xufVxuXG5pbnRlcmZhY2UgQmFzZVByb3BlcnR5RW1pdE9wdHMge1xuICByZW5kZXJBYnN0cmFjdD86IGJvb2xlYW47XG4gIGZvcmNlRW1pdEJvZHk/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlUHJvcGVydHkgaW1wbGVtZW50cyBQeXRob25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFic3RyYWN0OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNTdGF0aWM6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpU2V0TWV0aG9kITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1tdXRhYmxlOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGpzTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHlwZTogc3BlYy5PcHRpb25hbFZhbHVlLFxuICAgIHB1YmxpYyByZWFkb25seSBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICAgb3B0czogQmFzZVByb3BlcnR5T3B0cyxcbiAgKSB7XG4gICAgY29uc3QgeyBhYnN0cmFjdCA9IGZhbHNlLCBpbW11dGFibGUgPSBmYWxzZSwgaXNTdGF0aWMgPSBmYWxzZSB9ID0gb3B0cztcblxuICAgIHRoaXMuYWJzdHJhY3QgPSBhYnN0cmFjdDtcbiAgICB0aGlzLmltbXV0YWJsZSA9IGltbXV0YWJsZTtcbiAgICB0aGlzLmlzU3RhdGljID0gaXNTdGF0aWM7XG4gICAgdGhpcy5wYXJlbnQgPSBvcHRzLnBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIHJldHVybiB7IGFwaTogJ21lbWJlcicsIGZxbjogdGhpcy5wYXJlbnQuZnFuLCBtZW1iZXJOYW1lOiB0aGlzLmpzTmFtZSB9O1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB0b1R5cGVOYW1lKHRoaXMudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIG9wdHM/OiBCYXNlUHJvcGVydHlFbWl0T3B0cyxcbiAgKSB7XG4gICAgY29uc3QgeyByZW5kZXJBYnN0cmFjdCA9IHRydWUsIGZvcmNlRW1pdEJvZHkgPSBmYWxzZSB9ID0gb3B0cyA/PyB7fTtcbiAgICBjb25zdCBweXRob25UeXBlID0gdG9UeXBlTmFtZSh0aGlzLnR5cGUpLnB5dGhvblR5cGUoY29udGV4dCk7XG5cbiAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgaXMgbmVlZGVkIGJlY2F1c2UgbXlweSBjYW5ub3QgY2hlY2sgZGVjb3JhdGVkIHRoaW5nc1xuICAgIGNvZGUubGluZShgQCR7dGhpcy5kZWNvcmF0b3J9ICMgdHlwZTogaWdub3JlW21pc2NdYCk7XG4gICAgY29kZS5saW5lKGBAanNpaS5tZW1iZXIoanNpaV9uYW1lPVwiJHt0aGlzLmpzTmFtZX1cIilgKTtcbiAgICBpZiAocmVuZGVyQWJzdHJhY3QgJiYgdGhpcy5hYnN0cmFjdCkge1xuICAgICAgY29kZS5saW5lKCdAYWJjLmFic3RyYWN0bWV0aG9kJyk7XG4gICAgfVxuICAgIG9wZW5TaWduYXR1cmUoXG4gICAgICBjb2RlLFxuICAgICAgJ2RlZicsXG4gICAgICB0aGlzLnB5dGhvbk5hbWUsXG4gICAgICBbdGhpcy5pbXBsaWNpdFBhcmFtZXRlcl0sXG4gICAgICB0cnVlLFxuICAgICAgcHl0aG9uVHlwZSxcbiAgICApO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgcHJvcC0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgICh0aGlzLnNob3VsZEVtaXRCb2R5IHx8IGZvcmNlRW1pdEJvZHkpICYmXG4gICAgICAoIXJlbmRlckFic3RyYWN0IHx8ICF0aGlzLmFic3RyYWN0KVxuICAgICkge1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgcmV0dXJuIHR5cGluZy5jYXN0KCR7cHl0aG9uVHlwZX0sIGpzaWkuJHt0aGlzLmpzaWlHZXRNZXRob2R9KCR7dGhpcy5pbXBsaWNpdFBhcmFtZXRlcn0sIFwiJHt0aGlzLmpzTmFtZX1cIikpYCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgfVxuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgaWYgKCF0aGlzLmltbXV0YWJsZSkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGBAJHt0aGlzLnB5dGhvbk5hbWV9LnNldHRlciR7XG4gICAgICAgICAgdGhpcy5pc1N0YXRpYyA/ICcgIyB0eXBlOiBpZ25vcmVbbm8tcmVkZWZdJyA6ICcnXG4gICAgICAgIH1gLFxuICAgICAgKTtcbiAgICAgIGlmIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KSB7XG4gICAgICAgIGNvZGUubGluZSgnQGFiYy5hYnN0cmFjdG1ldGhvZCcpO1xuICAgICAgfVxuICAgICAgb3BlblNpZ25hdHVyZShcbiAgICAgICAgY29kZSxcbiAgICAgICAgJ2RlZicsXG4gICAgICAgIHRoaXMucHl0aG9uTmFtZSxcbiAgICAgICAgW3RoaXMuaW1wbGljaXRQYXJhbWV0ZXIsIGB2YWx1ZTogJHtweXRob25UeXBlfWBdLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgJ05vbmUnLFxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgKHRoaXMuc2hvdWxkRW1pdEJvZHkgfHwgZm9yY2VFbWl0Qm9keSkgJiZcbiAgICAgICAgKCFyZW5kZXJBYnN0cmFjdCB8fCAhdGhpcy5hYnN0cmFjdClcbiAgICAgICkge1xuICAgICAgICBjb2RlLmxpbmUoXG4gICAgICAgICAgYGpzaWkuJHt0aGlzLmpzaWlTZXRNZXRob2R9KCR7dGhpcy5pbXBsaWNpdFBhcmFtZXRlcn0sIFwiJHt0aGlzLmpzTmFtZX1cIiwgdmFsdWUpYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgICB9XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgSW50ZXJmYWNlIGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSB7XG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG4gICAgZW1pdExpc3QoY29kZSwgJ0Bqc2lpLmludGVyZmFjZSgnLCBbYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgXSwgJyknKTtcblxuICAgIC8vIEZpcnN0IHdlIGRvIG91ciBub3JtYWwgY2xhc3MgbG9naWMgZm9yIGVtaXR0aW5nIG91ciBtZW1iZXJzLlxuICAgIHN1cGVyLmVtaXQoY29kZSwgY29udGV4dCk7XG5cbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoKTtcblxuICAgIC8vIFRoZW4sIHdlIGhhdmUgdG8gZW1pdCBhIFByb3h5IGNsYXNzIHdoaWNoIGltcGxlbWVudHMgb3VyIHByb3h5IGludGVyZmFjZS5cbiAgICBjb25zdCBwcm94eUJhc2VzOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKFxuICAgICAgKGIpID0+XG4gICAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBiZWNhdXNlIE15UHkgY2Fubm90IGNoZWNrIGR5bmFtaWMgYmFzZSBjbGFzc2VzIChuYXR1cmFsbHkpXG4gICAgICAgIGBqc2lpLnByb3h5X2Zvcigke3RvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7XG4gICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgICAgIH0pfSkgIyB0eXBlOiBpZ25vcmVbbWlzY11gLFxuICAgICk7XG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnByb3h5Q2xhc3NOYW1lLCBwcm94eUJhc2VzKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgICB0cmFpbGluZ05ld0xpbmU6IHRydWUsXG4gICAgfSk7XG4gICAgY29kZS5saW5lKGBfX2pzaWlfdHlwZV9fOiB0eXBpbmcuQ2xhc3NWYXJbc3RyXSA9IFwiJHt0aGlzLmZxbn1cImApO1xuXG4gICAgaWYgKHRoaXMubWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLm1lbWJlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VwYXJhdGVNZW1iZXJzKSB7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgbWVtYmVyLmVtaXQoY29kZSwgY29udGV4dCwgeyBmb3JjZUVtaXRCb2R5OiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICAnIyBBZGRpbmcgYSBcIl9fanNpaV9wcm94eV9jbGFzc19fKCk6IHR5cGluZy5UeXBlXCIgZnVuY3Rpb24gdG8gdGhlIGludGVyZmFjZScsXG4gICAgKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICBgdHlwaW5nLmNhc3QodHlwaW5nLkFueSwgJHt0aGlzLnB5dGhvbk5hbWV9KS5fX2pzaWlfcHJveHlfY2xhc3NfXyA9IGxhbWJkYSA6ICR7dGhpcy5wcm94eUNsYXNzTmFtZX1gLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5mcW4gIT0gbnVsbCkge1xuICAgICAgY29udGV4dC5lbWl0dGVkVHlwZXMuYWRkKHRoaXMuZnFuKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKChiKSA9PlxuICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICk7XG5cbiAgICBwYXJhbXMucHVzaCgndHlwaW5nX2V4dGVuc2lvbnMuUHJvdG9jb2wnKTtcblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBwcm94eUNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXyR7dGhpcy5weXRob25OYW1lfVByb3h5YDtcbiAgfVxufVxuXG5jbGFzcyBJbnRlcmZhY2VNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnaW52b2tlJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gZmFsc2U7XG59XG5cbmNsYXNzIEludGVyZmFjZVByb3BlcnR5IGV4dGVuZHMgQmFzZVByb3BlcnR5IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nID0gJ2J1aWx0aW5zLnByb3BlcnR5JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpR2V0TWV0aG9kOiBzdHJpbmcgPSAnZ2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2Q6IHN0cmluZyA9ICdzZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuY2xhc3MgU3RydWN0IGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSB7XG4gIHByb3RlY3RlZCBkaXJlY3RNZW1iZXJzID0gbmV3IEFycmF5PFN0cnVjdEZpZWxkPigpO1xuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKTogdm9pZCB7XG4gICAgaWYgKCEobWVtYmVyIGluc3RhbmNlb2YgU3RydWN0RmllbGQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYWRkIFN0cnVjdEZpZWxkIHRvIFN0cnVjdCcpO1xuICAgIH1cbiAgICB0aGlzLmRpcmVjdE1lbWJlcnMucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcbiAgICBjb25zdCBiYXNlSW50ZXJmYWNlcyA9IHRoaXMuZ2V0Q2xhc3NQYXJhbXMoY29udGV4dCk7XG5cbiAgICBjb2RlLmluZGVudCgnQGpzaWkuZGF0YV90eXBlKCcpO1xuICAgIGNvZGUubGluZShganNpaV90eXBlPSR7SlNPTi5zdHJpbmdpZnkodGhpcy5mcW4pfSxgKTtcbiAgICBlbWl0TGlzdChjb2RlLCAnanNpaV9zdHJ1Y3RfYmFzZXM9WycsIGJhc2VJbnRlcmZhY2VzLCAnXSwnKTtcbiAgICBhc3NpZ25EaWN0aW9uYXJ5KGNvZGUsICduYW1lX21hcHBpbmcnLCB0aGlzLnByb3BlcnR5TWFwKCksICcsJywgdHJ1ZSk7XG4gICAgY29kZS51bmluZGVudCgnKScpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5weXRob25OYW1lLCBiYXNlSW50ZXJmYWNlcyk7XG4gICAgdGhpcy5lbWl0Q29uc3RydWN0b3IoY29kZSwgY29udGV4dCk7XG5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLmFsbE1lbWJlcnMpIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgdGhpcy5lbWl0R2V0dGVyKG1lbWJlciwgY29kZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0TWFnaWNNZXRob2RzKGNvZGUpO1xuXG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBpZiAodGhpcy5mcW4gIT0gbnVsbCkge1xuICAgICAgY29udGV4dC5lbWl0dGVkVHlwZXMuYWRkKHRoaXMuZnFuKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIHN1cGVyLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgIC4uLnRoaXMuYWxsTWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlcy5tYXAoKGIpID0+XG4gICAgICB0b1R5cGVOYW1lKGIpLnB5dGhvblR5cGUoeyAuLi5jb250ZXh0LCB0eXBlQW5ub3RhdGlvbjogZmFsc2UgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFsbCBmaWVsZHMgKGluaGVyaXRlZCBhcyB3ZWxsKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgYWxsTWVtYmVycygpOiBTdHJ1Y3RGaWVsZFtdIHtcbiAgICByZXR1cm4gdGhpcy50aGlzSW50ZXJmYWNlLmFsbFByb3BlcnRpZXMubWFwKFxuICAgICAgKHgpID0+IG5ldyBTdHJ1Y3RGaWVsZCh0aGlzLmdlbmVyYXRvciwgeC5zcGVjLCB4LmRlZmluaW5nVHlwZS5zcGVjKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdGhpc0ludGVyZmFjZSgpIHtcbiAgICBpZiAodGhpcy5mcW4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGUU4gbm90IHNldCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0b3IucmVmbGVjdEFzc2VtYmx5LnN5c3RlbS5maW5kSW50ZXJmYWNlKHRoaXMuZnFuKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0cnVjdG9yKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCBtZW1iZXJzID0gdGhpcy5hbGxNZW1iZXJzO1xuXG4gICAgY29uc3Qga3dhcmdzID0gbWVtYmVycy5tYXAoKG0pID0+IG0uY29uc3RydWN0b3JEZWNsKGNvbnRleHQpKTtcblxuICAgIGNvbnN0IGltcGxpY2l0UGFyYW1ldGVyID0gc2x1Z2lmeUFzTmVlZGVkKFxuICAgICAgJ3NlbGYnLFxuICAgICAgbWVtYmVycy5tYXAoKG0pID0+IG0ucHl0aG9uTmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBjb25zdHJ1Y3RvckFyZ3VtZW50cyA9XG4gICAgICBrd2FyZ3MubGVuZ3RoID4gMFxuICAgICAgICA/IFtpbXBsaWNpdFBhcmFtZXRlciwgJyonLCAuLi5rd2FyZ3NdXG4gICAgICAgIDogW2ltcGxpY2l0UGFyYW1ldGVyXTtcblxuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2RlZicsICdfX2luaXRfXycsIGNvbnN0cnVjdG9yQXJndW1lbnRzLCBmYWxzZSwgJ05vbmUnKTtcbiAgICB0aGlzLmVtaXRDb25zdHJ1Y3RvckRvY3N0cmluZyhjb2RlKTtcblxuICAgIC8vIFJlLXR5cGUgc3RydWN0IGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGFzIFwiZGljdFwiXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5maWx0ZXIoKG0pID0+IG0uaXNTdHJ1Y3QodGhpcy5nZW5lcmF0b3IpKSkge1xuICAgICAgLy8gTm90ZSB0aGF0IFwiTm9uZVwiIGlzIE5PVCBhbiBpbnN0YW5jZSBvZiBkaWN0ICh0aGF0J3MgY29udmVuaWVudCEpXG4gICAgICBjb25zdCB0eXBlTmFtZSA9IHRvVHlwZU5hbWUobWVtYmVyLnR5cGUudHlwZSkucHl0aG9uVHlwZSh7XG4gICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgY29kZS5vcGVuQmxvY2soYGlmIGlzaW5zdGFuY2UoJHttZW1iZXIucHl0aG9uTmFtZX0sIGRpY3QpYCk7XG4gICAgICBjb2RlLmxpbmUoYCR7bWVtYmVyLnB5dGhvbk5hbWV9ID0gJHt0eXBlTmFtZX0oKioke21lbWJlci5weXRob25OYW1lfSlgKTtcbiAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH1cblxuICAgIC8vIFJlcXVpcmVkIHByb3BlcnRpZXMsIHRob3NlIHdpbGwgYWx3YXlzIGJlIHB1dCBpbnRvIHRoZSBkaWN0XG4gICAgYXNzaWduRGljdGlvbmFyeShcbiAgICAgIGNvZGUsXG4gICAgICBgJHtpbXBsaWNpdFBhcmFtZXRlcn0uX3ZhbHVlczogdHlwaW5nLkRpY3Rbc3RyLCB0eXBpbmcuQW55XWAsXG4gICAgICBtZW1iZXJzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICFtLm9wdGlvbmFsKVxuICAgICAgICAubWFwKFxuICAgICAgICAgIChtZW1iZXIpID0+XG4gICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9OiAke21lbWJlci5weXRob25OYW1lfWAsXG4gICAgICAgICksXG4gICAgKTtcblxuICAgIC8vIE9wdGlvbmFsIHByb3BlcnRpZXMsIHdpbGwgb25seSBiZSBwdXQgaW50byB0aGUgZGljdCBpZiB0aGV5J3JlIG5vdCBOb25lXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5maWx0ZXIoKG0pID0+IG0ub3B0aW9uYWwpKSB7XG4gICAgICBjb2RlLm9wZW5CbG9jayhgaWYgJHttZW1iZXIucHl0aG9uTmFtZX0gaXMgbm90IE5vbmVgKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYCR7aW1wbGljaXRQYXJhbWV0ZXJ9Ll92YWx1ZXNbXCIke21lbWJlci5weXRob25OYW1lfVwiXSA9ICR7bWVtYmVyLnB5dGhvbk5hbWV9YCxcbiAgICAgICk7XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0cnVjdG9yRG9jc3RyaW5nKGNvZGU6IENvZGVNYWtlcikge1xuICAgIGNvbnN0IGFyZ3M6IERvY3VtZW50YWJsZUFyZ3VtZW50W10gPSB0aGlzLmFsbE1lbWJlcnMubWFwKChtKSA9PiAoe1xuICAgICAgbmFtZTogbS5weXRob25OYW1lLFxuICAgICAgZG9jczogbS5kb2NzLFxuICAgICAgZGVmaW5pbmdUeXBlOiB0aGlzLnNwZWMsXG4gICAgfSkpO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBhcmd1bWVudHM6IGFyZ3MsXG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgY2xhc3MtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEdldHRlcihcbiAgICBtZW1iZXI6IFN0cnVjdEZpZWxkLFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgKSB7XG4gICAgY29uc3QgcHl0aG9uVHlwZSA9IG1lbWJlci50eXBlQW5ub3RhdGlvbihjb250ZXh0KTtcblxuICAgIGNvZGUubGluZSgnQGJ1aWx0aW5zLnByb3BlcnR5Jyk7XG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnZGVmJywgbWVtYmVyLnB5dGhvbk5hbWUsIFsnc2VsZiddLCB0cnVlLCBweXRob25UeXBlKTtcbiAgICBtZW1iZXIuZW1pdERvY1N0cmluZyhjb2RlKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICBgcmVzdWx0ID0gc2VsZi5fdmFsdWVzLmdldCgke0pTT04uc3RyaW5naWZ5KG1lbWJlci5weXRob25OYW1lKX0pYCxcbiAgICApO1xuICAgIGlmICghbWVtYmVyLm9wdGlvbmFsKSB7XG4gICAgICAvLyBBZGQgYW4gYXNzZXJ0aW9uIHRvIG1heWUgTXlQWSBoYXBweSFcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYGFzc2VydCByZXN1bHQgaXMgbm90IE5vbmUsIFwiUmVxdWlyZWQgcHJvcGVydHkgJyR7bWVtYmVyLnB5dGhvbk5hbWV9JyBpcyBtaXNzaW5nXCJgLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29kZS5saW5lKGByZXR1cm4gdHlwaW5nLmNhc3QoJHtweXRob25UeXBlfSwgcmVzdWx0KWApO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TWFnaWNNZXRob2RzKGNvZGU6IENvZGVNYWtlcikge1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCdkZWYgX19lcV9fKHNlbGYsIHJoczogdHlwaW5nLkFueSkgLT4gYnVpbHRpbnMuYm9vbCcpO1xuICAgIGNvZGUubGluZShcbiAgICAgICdyZXR1cm4gaXNpbnN0YW5jZShyaHMsIHNlbGYuX19jbGFzc19fKSBhbmQgcmhzLl92YWx1ZXMgPT0gc2VsZi5fdmFsdWVzJyxcbiAgICApO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5vcGVuQmxvY2soJ2RlZiBfX25lX18oc2VsZiwgcmhzOiB0eXBpbmcuQW55KSAtPiBidWlsdGlucy5ib29sJyk7XG4gICAgY29kZS5saW5lKCdyZXR1cm4gbm90IChyaHMgPT0gc2VsZiknKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCdkZWYgX19yZXByX18oc2VsZikgLT4gc3RyJyk7XG4gICAgY29kZS5pbmRlbnQoYHJldHVybiBcIiR7dGhpcy5weXRob25OYW1lfSglcylcIiAlIFwiLCBcIi5qb2luKGApO1xuICAgIGNvZGUubGluZSgnayArIFwiPVwiICsgcmVwcih2KSBmb3IgaywgdiBpbiBzZWxmLl92YWx1ZXMuaXRlbXMoKScpO1xuICAgIGNvZGUudW5pbmRlbnQoJyknKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvcGVydHlNYXAoKSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLmFsbE1lbWJlcnMpIHtcbiAgICAgIHJldC5wdXNoKFxuICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9OiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIG1lbWJlci5qc2lpTmFtZSxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxufVxuXG5jbGFzcyBTdHJ1Y3RGaWVsZCBpbXBsZW1lbnRzIFB5dGhvbkJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkganNpaU5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRvY3M/OiBzcGVjLkRvY3M7XG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBzcGVjLk9wdGlvbmFsVmFsdWU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgcHVibGljIHJlYWRvbmx5IHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWZpbmluZ1R5cGU6IHNwZWMuVHlwZSxcbiAgKSB7XG4gICAgdGhpcy5weXRob25OYW1lID0gdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lKTtcbiAgICB0aGlzLmpzaWlOYW1lID0gcHJvcC5uYW1lO1xuICAgIHRoaXMudHlwZSA9IHByb3A7XG4gICAgdGhpcy5kb2NzID0gcHJvcC5kb2NzO1xuICB9XG5cbiAgcHVibGljIGdldCBhcGlMb2NhdGlvbigpOiBBcGlMb2NhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IHRoaXMuZGVmaW5pbmdUeXBlLmZxbixcbiAgICAgIG1lbWJlck5hbWU6IHRoaXMuanNpaU5hbWUsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3B0aW9uYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy50eXBlLm9wdGlvbmFsO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB0b1R5cGVOYW1lKHRoaXMudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGlzU3RydWN0KGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzU3RydWN0KGdlbmVyYXRvci5yZWZsZWN0QXNzZW1ibHkuc3lzdGVtLCB0aGlzLnR5cGUudHlwZSk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3JEZWNsKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3Qgb3B0ID0gdGhpcy5vcHRpb25hbCA/ICcgPSBOb25lJyA6ICcnO1xuICAgIHJldHVybiBgJHt0aGlzLnB5dGhvbk5hbWV9OiAke3RoaXMudHlwZUFubm90YXRpb24oe1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIHBhcmFtZXRlclR5cGU6IHRydWUsXG4gICAgfSl9JHtvcHR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIFB5dGhvbiB0eXBlIGFubm90YXRpb24gZm9yIHRoaXMgdHlwZVxuICAgKi9cbiAgcHVibGljIHR5cGVBbm5vdGF0aW9uKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgcmV0dXJuIHRvVHlwZU5hbWUodGhpcy50eXBlKS5weXRob25UeXBlKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGVtaXREb2NTdHJpbmcoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBwcm9wLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3QgcmVzb2x2ZWRUeXBlID0gdGhpcy50eXBlQW5ub3RhdGlvbihjb250ZXh0KTtcbiAgICBjb2RlLmxpbmUoYCR7dGhpcy5weXRob25OYW1lfTogJHtyZXNvbHZlZFR5cGV9YCk7XG4gICAgdGhpcy5lbWl0RG9jU3RyaW5nKGNvZGUpO1xuICB9XG59XG5cbmludGVyZmFjZSBDbGFzc09wdHMgZXh0ZW5kcyBQeXRob25UeXBlT3B0cyB7XG4gIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgaW50ZXJmYWNlcz86IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlW107XG4gIGFic3RyYWN0QmFzZXM/OiBzcGVjLkNsYXNzVHlwZVtdO1xufVxuXG5jbGFzcyBDbGFzcyBleHRlbmRzIEJhc2VQeXRob25DbGFzc1R5cGUgaW1wbGVtZW50cyBJU29ydGFibGVUeXBlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYnN0cmFjdDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBhYnN0cmFjdEJhc2VzOiBzcGVjLkNsYXNzVHlwZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVyZmFjZXM6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlW107XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzcGVjOiBzcGVjLlR5cGUsXG4gICAgZnFuOiBzdHJpbmcsXG4gICAgb3B0czogQ2xhc3NPcHRzLFxuICAgIGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgc3VwZXIoZ2VuZXJhdG9yLCBuYW1lLCBzcGVjLCBmcW4sIG9wdHMsIGRvY3MpO1xuXG4gICAgY29uc3QgeyBhYnN0cmFjdCA9IGZhbHNlLCBpbnRlcmZhY2VzID0gW10sIGFic3RyYWN0QmFzZXMgPSBbXSB9ID0gb3B0cztcblxuICAgIHRoaXMuYWJzdHJhY3QgPSBhYnN0cmFjdDtcbiAgICB0aGlzLmludGVyZmFjZXMgPSBpbnRlcmZhY2VzO1xuICAgIHRoaXMuYWJzdHJhY3RCYXNlcyA9IGFic3RyYWN0QmFzZXM7XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kc09uKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBQeXRob25UeXBlW10ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llczogUHl0aG9uVHlwZVtdID0gc3VwZXIuZGVwZW5kc09uKHJlc29sdmVyKTtcbiAgICBjb25zdCBwYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQodGhpcy5mcW4hKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmV0dXJuIGFueSBpZmFjZXMgdGhhdCBhcmUgaW4gdGhlIHNhbWUgbW9kdWxlIGF0IHRoZSBzYW1lIGxldmVsIG9mXG4gICAgLy8gbmVzdGluZy5cbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBpZmFjZSBvZiB0aGlzLmludGVyZmFjZXMpIHtcbiAgICAgIGlmIChyZXNvbHZlci5pc0luTW9kdWxlKGlmYWNlKSkge1xuICAgICAgICAvLyBHaXZlbiBhIGlmYWNlLCB3ZSBuZWVkIHRvIGxvY2F0ZSB0aGUgaWZhY2VzJ3MgcGFyZW50IHRoYXQgaXMgdGhlIHNhbWVcbiAgICAgICAgLy8gYXMgb3VyIHBhcmVudCwgYmVjYXVzZSB3ZSBvbmx5IGNhcmUgYWJvdXQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGF0IHRoZVxuICAgICAgICAvLyBzYW1lIGxldmVsIG9mIG91ciBvd24uXG4gICAgICAgIC8vIFRPRE86IFdlIG1pZ2h0IG5lZWQgdG8gcmVjdXJzZSBpbnRvIG91ciBtZW1iZXJzIHRvIGFsc28gZmluZCB0aGVpclxuICAgICAgICAvLyAgICAgICBkZXBlbmRlbmNpZXMuXG4gICAgICAgIGxldCBpZmFjZUl0ZW0gPSByZXNvbHZlci5nZXRUeXBlKGlmYWNlKTtcbiAgICAgICAgbGV0IGlmYWNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGlmYWNlKTtcbiAgICAgICAgd2hpbGUgKGlmYWNlUGFyZW50ICE9PSBwYXJlbnQpIHtcbiAgICAgICAgICBpZmFjZUl0ZW0gPSBpZmFjZVBhcmVudDtcbiAgICAgICAgICBpZmFjZVBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudChpZmFjZUl0ZW0uZnFuISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNlZW4uaGFzKGlmYWNlSXRlbS5mcW4hKSkge1xuICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGlmYWNlSXRlbSk7XG4gICAgICAgICAgc2Vlbi5hZGQoaWZhY2VJdGVtLmZxbiEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgc3VwZXIucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLCAvLyBUYWtlcyBjYXJlIG9mIGJhc2UgJiBtZW1iZXJzXG4gICAgICAuLi50aGlzLmludGVyZmFjZXMubWFwKChiYXNlKSA9PlxuICAgICAgICB0b1R5cGVOYW1lKGJhc2UpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICAvLyBGaXJzdCB3ZSBlbWl0IG91ciBpbXBsbWVudHMgZGVjb3JhdG9yXG4gICAgaWYgKHRoaXMuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpbnRlcmZhY2VzOiBzdHJpbmdbXSA9IHRoaXMuaW50ZXJmYWNlcy5tYXAoKGIpID0+XG4gICAgICAgIHRvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7IC4uLmNvbnRleHQsIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSB9KSxcbiAgICAgICk7XG4gICAgICBjb2RlLmxpbmUoYEBqc2lpLmltcGxlbWVudHMoJHtpbnRlcmZhY2VzLmpvaW4oJywgJyl9KWApO1xuICAgIH1cblxuICAgIC8vIFRoZW4gd2UgZG8gb3VyIG5vcm1hbCBjbGFzcyBsb2dpYyBmb3IgZW1pdHRpbmcgb3VyIG1lbWJlcnMuXG4gICAgc3VwZXIuZW1pdChjb2RlLCBjb250ZXh0KTtcblxuICAgIC8vIFRoZW4sIGlmIG91ciBjbGFzcyBpcyBBYnN0cmFjdCwgd2UgaGF2ZSB0byBnbyB0aHJvdWdoIGFuZCByZWRvIGFsbCBvZlxuICAgIC8vIHRoaXMgbG9naWMsIGV4Y2VwdCBvbmx5IGVtaXRpbmcgYWJzdHJhY3QgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBhcyBub25cbiAgICAvLyBhYnN0cmFjdCwgYW5kIHN1YmNsYXNzaW5nIG91ciBpbml0aWFsIGNsYXNzLlxuICAgIGlmICh0aGlzLmFic3RyYWN0KSB7XG4gICAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG5cbiAgICAgIGNvbnN0IHByb3h5QmFzZXMgPSBbdGhpcy5weXRob25OYW1lXTtcbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiB0aGlzLmFic3RyYWN0QmFzZXMpIHtcbiAgICAgICAgLy8gXCIjIHR5cGU6IGlnbm9yZVttaXNjXVwiIGJlY2F1c2UgTXlQeSBjYW5ub3QgY2hlY2sgZHluYW1pYyBiYXNlIGNsYXNzZXMgKG5hdHVyYWxseSlcbiAgICAgICAgcHJveHlCYXNlcy5wdXNoKFxuICAgICAgICAgIGBqc2lpLnByb3h5X2Zvcigke3RvVHlwZU5hbWUoYmFzZSkucHl0aG9uVHlwZSh7XG4gICAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgICAgICAgIH0pfSkgIyB0eXBlOiBpZ25vcmVbbWlzY11gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnByb3h5Q2xhc3NOYW1lLCBwcm94eUJhc2VzKTtcblxuICAgICAgLy8gRmlsdGVyIG91ciBsaXN0IG9mIG1lbWJlcnMgdG8gKm9ubHkqIGJlIGFic3RyYWN0IG1lbWJlcnMsIGFuZCBub3QgYW55XG4gICAgICAvLyBvdGhlciB0eXBlcy5cbiAgICAgIGNvbnN0IGFic3RyYWN0TWVtYmVycyA9IHRoaXMubWVtYmVycy5maWx0ZXIoXG4gICAgICAgIChtKSA9PlxuICAgICAgICAgIChtIGluc3RhbmNlb2YgQmFzZU1ldGhvZCB8fCBtIGluc3RhbmNlb2YgQmFzZVByb3BlcnR5KSAmJiBtLmFic3RyYWN0LFxuICAgICAgKTtcbiAgICAgIGlmIChhYnN0cmFjdE1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBhYnN0cmFjdE1lbWJlcnMpIHtcbiAgICAgICAgICBpZiAodGhpcy5zZXBhcmF0ZU1lbWJlcnMpIHtcbiAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lbWJlci5lbWl0KGNvZGUsIGNvbnRleHQsIHsgcmVuZGVyQWJzdHJhY3Q6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICAgIH1cblxuICAgICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgJyMgQWRkaW5nIGEgXCJfX2pzaWlfcHJveHlfY2xhc3NfXygpOiB0eXBpbmcuVHlwZVwiIGZ1bmN0aW9uIHRvIHRoZSBhYnN0cmFjdCBjbGFzcycsXG4gICAgICApO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgdHlwaW5nLmNhc3QodHlwaW5nLkFueSwgJHt0aGlzLnB5dGhvbk5hbWV9KS5fX2pzaWlfcHJveHlfY2xhc3NfXyA9IGxhbWJkYSA6ICR7dGhpcy5wcm94eUNsYXNzTmFtZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKChiKSA9PlxuICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICk7XG4gICAgY29uc3QgbWV0YWNsYXNzOiBzdHJpbmcgPSB0aGlzLmFic3RyYWN0ID8gJ0pTSUlBYnN0cmFjdENsYXNzJyA6ICdKU0lJTWV0YSc7XG5cbiAgICBwYXJhbXMucHVzaChgbWV0YWNsYXNzPWpzaWkuJHttZXRhY2xhc3N9YCk7XG4gICAgcGFyYW1zLnB1c2goYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgKTtcblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBwcm94eUNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXyR7dGhpcy5weXRob25OYW1lfVByb3h5YDtcbiAgfVxufVxuXG5jbGFzcyBTdGF0aWNNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcj86IHN0cmluZyA9ICdidWlsdGlucy5jbGFzc21ldGhvZCc7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ2Nscyc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnc2ludm9rZSc7XG59XG5cbmNsYXNzIEluaXRpYWxpemVyIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2NyZWF0ZSc7XG4gIHByb3RlY3RlZCByZWFkb25seSBjbGFzc0FzRmlyc3RQYXJhbWV0ZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmV0dXJuRnJvbUpTSUlNZXRob2Q6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuY2xhc3MgTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2ludm9rZSc7XG59XG5cbmNsYXNzIEFzeW5jTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2FpbnZva2UnO1xufVxuXG5jbGFzcyBTdGF0aWNQcm9wZXJ0eSBleHRlbmRzIEJhc2VQcm9wZXJ0eSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I6IHN0cmluZyA9ICdqc2lpLnB5dGhvbi5jbGFzc3Byb3BlcnR5JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnY2xzJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2Q6IHN0cmluZyA9ICdzZ2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2Q6IHN0cmluZyA9ICdzc2V0Jztcbn1cblxuY2xhc3MgUHJvcGVydHkgZXh0ZW5kcyBCYXNlUHJvcGVydHkge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVjb3JhdG9yOiBzdHJpbmcgPSAnYnVpbHRpbnMucHJvcGVydHknO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdzZWxmJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2Q6IHN0cmluZyA9ICdnZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaVNldE1ldGhvZDogc3RyaW5nID0gJ3NldCc7XG59XG5cbmNsYXNzIEVudW0gZXh0ZW5kcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcGFyYXRlTWVtYmVycyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG4gICAgZW1pdExpc3QoY29kZSwgJ0Bqc2lpLmVudW0oJywgW2Bqc2lpX3R5cGU9XCIke3RoaXMuZnFufVwiYF0sICcpJyk7XG4gICAgcmV0dXJuIHN1cGVyLmVtaXQoY29kZSwgY29udGV4dCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoX2NvbnRleHQ6IEVtaXRDb250ZXh0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ2VudW0uRW51bSddO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBzdXBlci5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gIH1cbn1cblxuY2xhc3MgRW51bU1lbWJlciBpbXBsZW1lbnRzIFB5dGhvbkJhc2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmFsdWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgdGhpcy5weXRob25OYW1lID0gcHl0aG9uTmFtZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUxvY2F0aW9uKCk6IEFwaUxvY2F0aW9uIHtcbiAgICByZXR1cm4geyBhcGk6ICdtZW1iZXInLCBmcW46IHRoaXMucGFyZW50LmZxbiwgbWVtYmVyTmFtZTogdGhpcy52YWx1ZSB9O1xuICB9XG5cbiAgcHVibGljIGRlcGVuZHNPbk1vZHVsZXMoKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQ8c3RyaW5nPigpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBfY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb2RlLmxpbmUoYCR7dGhpcy5weXRob25OYW1lfSA9IFwiJHt0aGlzLnZhbHVlfVwiYCk7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBlbnVtLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKF9jb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgTW9kdWxlT3B0cyB7XG4gIHJlYWRvbmx5IGFzc2VtYmx5OiBzcGVjLkFzc2VtYmx5O1xuICByZWFkb25seSBhc3NlbWJseUZpbGVuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvYWRBc3NlbWJseT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHBhY2thZ2U/OiBQYWNrYWdlO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jc3RyaW5nIHRvIGVtaXQgYXQgdGhlIHRvcCBvZiB0aGlzIG1vZHVsZSwgaWYgYW55LlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWxlRG9jdW1lbnRhdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQeXRob24gbW9kdWxlXG4gKlxuICogV2lsbCBiZSBjYWxsZWQgZm9yIGpzaWkgc3VibW9kdWxlcyBhbmQgbmFtZXNwYWNlcy5cbiAqL1xuY2xhc3MgUHl0aG9uTW9kdWxlIGltcGxlbWVudHMgUHl0aG9uVHlwZSB7XG4gIC8qKlxuICAgKiBDb252ZXJ0ZWQgdG8gcHV0IG9uIHRoZSBtb2R1bGVcbiAgICpcbiAgICogVGhlIGZvcm1hdCBpcyBpbiBtYXJrZG93biwgd2l0aCBjb2RlIHNhbXBsZXMgY29udmVydGVkIGZyb20gVFMgdG8gUHl0aG9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1vZHVsZURvY3VtZW50YXRpb24/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhc3NlbWJseTogc3BlYy5Bc3NlbWJseTtcbiAgcHJpdmF0ZSByZWFkb25seSBhc3NlbWJseUZpbGVuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEFzc2VtYmx5OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbWJlcnMgPSBuZXcgQXJyYXk8UHl0aG9uQmFzZT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZXMgPSBuZXcgQXJyYXk8UHl0aG9uTW9kdWxlPigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBmcW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRzOiBNb2R1bGVPcHRzLFxuICApIHtcbiAgICB0aGlzLmFzc2VtYmx5ID0gb3B0cy5hc3NlbWJseTtcbiAgICB0aGlzLmFzc2VtYmx5RmlsZW5hbWUgPSBvcHRzLmFzc2VtYmx5RmlsZW5hbWU7XG4gICAgdGhpcy5sb2FkQXNzZW1ibHkgPSAhIW9wdHMubG9hZEFzc2VtYmx5O1xuICAgIHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbiA9IG9wdHMubW9kdWxlRG9jdW1lbnRhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKSB7XG4gICAgdGhpcy5tZW1iZXJzLnB1c2gobWVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRQeXRob25Nb2R1bGUocHlNb2Q6IFB5dGhvbk1vZHVsZSkge1xuICAgIGFzc2VydChcbiAgICAgICF0aGlzLmxvYWRBc3NlbWJseSxcbiAgICAgICdQeXRob25Nb2R1bGUuYWRkUHl0aG9uTW9kdWxlIENBTk5PVCBiZSBjYWxsZWQgb24gYXNzZW1ibHktbG9hZGluZyBtb2R1bGVzIChpdCB3b3VsZCBjYXVzZSBhIGxvYWQgY3ljbGUpIScsXG4gICAgKTtcbiAgICB0aGlzLm1vZHVsZXMucHVzaChweU1vZCk7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIC4uLnRoaXMubWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICB0aGlzLmVtaXRNb2R1bGVEb2N1bWVudGF0aW9uKGNvZGUpO1xuXG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmZxblxuICAgICAgPyBjb250ZXh0LnJlc29sdmVyLmJpbmQodGhpcy5mcW4sIHRoaXMucHl0aG9uTmFtZSlcbiAgICAgIDogY29udGV4dC5yZXNvbHZlcjtcbiAgICBjb250ZXh0ID0ge1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIHN1Ym1vZHVsZTogdGhpcy5mcW4gPz8gY29udGV4dC5zdWJtb2R1bGUsXG4gICAgICByZXNvbHZlcixcbiAgICB9O1xuXG4gICAgLy8gQmVmb3JlIHdlIHdyaXRlIGFueXRoaW5nIGVsc2UsIHdlIG5lZWQgdG8gd3JpdGUgb3V0IG91ciBtb2R1bGUgaGVhZGVycywgdGhpc1xuICAgIC8vIGlzIHdoZXJlIHdlIGhhbmRsZSBzdHVmZiBsaWtlIGltcG9ydHMsIGFueSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiwgZXRjLlxuICAgIGNvZGUubGluZSgnaW1wb3J0IGFiYycpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGJ1aWx0aW5zJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgZGF0ZXRpbWUnKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBlbnVtJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgdHlwaW5nJyk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQganNpaScpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IHB1YmxpY2F0aW9uJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgdHlwaW5nX2V4dGVuc2lvbnMnKTtcblxuICAgIC8vIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIG91dCB0aGUga2VybmVsIGxvYWQgbGluZS5cbiAgICBpZiAodGhpcy5sb2FkQXNzZW1ibHkpIHtcbiAgICAgIHRoaXMuZW1pdERlcGVuZGVuY3lJbXBvcnRzKGNvZGUpO1xuXG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGVtaXRMaXN0KFxuICAgICAgICBjb2RlLFxuICAgICAgICAnX19qc2lpX2Fzc2VtYmx5X18gPSBqc2lpLkpTSUlBc3NlbWJseS5sb2FkKCcsXG4gICAgICAgIFtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5Lm5hbWUpLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkudmVyc2lvbiksXG4gICAgICAgICAgJ19fbmFtZV9fWzA6LTZdJyxcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5RmlsZW5hbWUpfWAsXG4gICAgICAgIF0sXG4gICAgICAgICcpJyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZW4gd2UgbXVzdCBpbXBvcnQgdGhlIC5fanNpaSBzdWJwYWNrYWdlLlxuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBsZXQgZGlzdGFuY2VGcm9tUm9vdCA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgY3VyciA9IHRoaXMuZnFuITtcbiAgICAgICAgY3VyciAhPT0gdGhpcy5hc3NlbWJseS5uYW1lO1xuICAgICAgICBjdXJyID0gY3Vyci5zdWJzdHJpbmcoMCwgY3Vyci5sYXN0SW5kZXhPZignLicpKVxuICAgICAgKSB7XG4gICAgICAgIGRpc3RhbmNlRnJvbVJvb3QrKztcbiAgICAgIH1cbiAgICAgIGNvZGUubGluZShgZnJvbSAkeycuJy5yZXBlYXQoZGlzdGFuY2VGcm9tUm9vdCArIDEpfV9qc2lpIGltcG9ydCAqYCk7XG5cbiAgICAgIHRoaXMuZW1pdFJlcXVpcmVkSW1wb3J0cyhjb2RlLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IGFsbCBvZiBvdXIgbWVtYmVycy5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwcmVwYXJlTWVtYmVycyh0aGlzLm1lbWJlcnMsIHJlc29sdmVyKSkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIG1lbWJlci5lbWl0KGNvZGUsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFdoYXRldmVyIG5hbWVzIHdlJ3ZlIGV4cG9ydGVkLCB3ZSdsbCB3cml0ZSBvdXQgb3VyIF9fYWxsX18gdGhhdCBsaXN0cyB0aGVtLlxuICAgIC8vXG4gICAgLy8gX19hbGxfXyBpcyBub3JtYWxseSB1c2VkIGZvciB3aGVuIHVzZXJzIHdyaXRlIGBmcm9tIGxpYnJhcnkgaW1wb3J0ICpgLCBidXQgd2UgYWxzb1xuICAgIC8vIHVzZSBpdCB3aXRoIHRoZSBgcHVibGljYXRpb25gIG1vZHVsZSB0byBoaWRlIGV2ZXJ5dGhpbmcgdGhhdCdzIE5PVCBpbiB0aGUgbGlzdC5cbiAgICAvL1xuICAgIC8vIE5vcm1hbGx5IGFkZGluZyBzdWJtb2R1bGVzIHRvIGBfX2FsbF9fYCBoYXMgdGhlIChuZWdhdGl2ZT8pIHNpZGUtZWZmZWN0XG4gICAgLy8gdGhhdCBhbGwgc3VibW9kdWxlcyBnZXQgbG9hZGVkIHdoZW4gdGhlIHVzZXIgZG9lcyBgaW1wb3J0ICpgLCBidXQgd2VcbiAgICAvLyBhbHJlYWR5IGxvYWQgc3VibW9kdWxlcyBhbnl3YXkgc28gaXQgZG9lc24ndCBtYWtlIGEgZGlmZmVyZW5jZSwgYW5kIGluIGNvbWJpbmF0aW9uXG4gICAgLy8gd2l0aCB0aGUgYHB1YmxpY2F0aW9uYCBtb2R1bGUgTk9UIGhhdmluZyB0aGVtIGluIHRoaXMgbGlzdCBoaWRlcyBhbnkgc3VibW9kdWxlc1xuICAgIC8vIHdlIGltcG9ydCBhcyBwYXJ0IG9mIHR5cGVjaGVja2luZy5cbiAgICBjb25zdCBleHBvcnRlZE1lbWJlcnMgPSBbXG4gICAgICAuLi50aGlzLm1lbWJlcnMubWFwKChtKSA9PiBgXCIke20ucHl0aG9uTmFtZX1cImApLFxuICAgICAgLi4udGhpcy5tb2R1bGVzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+IHRoaXMuaXNEaXJlY3RDaGlsZChtKSlcbiAgICAgICAgLm1hcCgobSkgPT4gYFwiJHtsYXN0Q29tcG9uZW50KG0ucHl0aG9uTmFtZSl9XCJgKSxcbiAgICBdO1xuICAgIGlmICh0aGlzLmxvYWRBc3NlbWJseSkge1xuICAgICAgZXhwb3J0ZWRNZW1iZXJzLnB1c2goJ1wiX19qc2lpX2Fzc2VtYmx5X19cIicpO1xuICAgIH1cblxuICAgIC8vIERlY2xhcmUgdGhlIGxpc3Qgb2YgXCJwdWJsaWNcIiBtZW1iZXJzIHRoaXMgbW9kdWxlIGV4cG9ydHNcbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgIH1cbiAgICBjb2RlLmxpbmUoKTtcblxuICAgIGlmIChleHBvcnRlZE1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5pbmRlbnQoJ19fYWxsX18gPSBbJyk7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBleHBvcnRlZE1lbWJlcnMuc29ydCgpKSB7XG4gICAgICAgIC8vIFdyaXRpbmcgb25lIGJ5IGxpbmUgbWlnaHQgYmUgX2EgbG90XyBvZiBsaW5lcywgYnV0IGl0J2xsIG1ha2UgcmV2aWV3aW5nIGNoYW5nZXMgdG8gdGhlIGxpc3QgZWFzaWVyLiBUcnVzdCBtZS5cbiAgICAgICAgY29kZS5saW5lKGAke21lbWJlcn0sYCk7XG4gICAgICB9XG4gICAgICBjb2RlLnVuaW5kZW50KCddJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgnX19hbGxfXzogdHlwaW5nLkxpc3RbdHlwaW5nLkFueV0gPSBbXScpO1xuICAgIH1cblxuICAgIC8vIE5leHQgdXAsIHdlJ2xsIHVzZSBwdWJsaWNhdGlvbiB0byBlbnN1cmUgdGhhdCBhbGwgb2YgdGhlIG5vbi1wdWJsaWMgbmFtZXNcbiAgICAvLyBnZXQgaGlkZGVuIGZyb20gZGlyKCksIHRhYi1jb21wbGV0ZSwgZXRjLlxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgncHVibGljYXRpb24ucHVibGlzaCgpJyk7XG5cbiAgICAvLyBGaW5hbGx5LCB3ZSdsbCBsb2FkIGFsbCByZWdpc3RlcmVkIHB5dGhvbiBtb2R1bGVzXG4gICAgaWYgKHRoaXMubW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgJyMgTG9hZGluZyBtb2R1bGVzIHRvIGVuc3VyZSB0aGVpciB0eXBlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBqc2lpIHJ1bnRpbWUgbGlicmFyeScsXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgdGhpcy5tb2R1bGVzLnNvcnQoKGwsIHIpID0+XG4gICAgICAgIGwucHl0aG9uTmFtZS5sb2NhbGVDb21wYXJlKHIucHl0aG9uTmFtZSksXG4gICAgICApKSB7XG4gICAgICAgIC8vIFJhdGhlciB0aGFuIGdlbmVyYXRpbmcgYW4gYWJzb2x1dGUgaW1wb3J0IGxpa2VcbiAgICAgICAgLy8gXCJpbXBvcnQganNpaV9jYWxjLnN1Ym1vZHVsZS5uZXN0ZWRfc3VibW9kdWxlLmRlZXBseV9uZXN0ZWRcIlxuICAgICAgICAvLyB0aGlzIGJ1aWxkcyBhIHJlbGF0aXZlIGltcG9ydCBsaWtlXG4gICAgICAgIC8vIFwiZnJvbSAuc3VibW9kdWxlLm5lc3RlZF9zdWJtb2R1bGUgaW1wb3J0IGRlZXBseV9uZXN0ZWRcIlxuICAgICAgICAvLyBUaGlzIGVuYWJsZXMgZGlzdHJpYnV0aW5nIHB5dGhvbiBwYWNrYWdlcyBhbmQgdXNpbmcgdGhlXG4gICAgICAgIC8vIGdlbmVyYXRlZCBtb2R1bGVzIGluIHRoZSBzYW1lIGNvZGViYXNlLlxuICAgICAgICBjb25zdCBhc3NlbWJseU5hbWUgPSB0b1B5dGhvbkZxbihcbiAgICAgICAgICBtb2R1bGUuYXNzZW1ibHkubmFtZSxcbiAgICAgICAgICBtb2R1bGUuYXNzZW1ibHksXG4gICAgICAgICkucHl0aG9uRnFuO1xuXG4gICAgICAgIGNvbnN0IHN1Ym1vZHVsZSA9IG1vZHVsZS5weXRob25OYW1lXG4gICAgICAgICAgLnJlcGxhY2UoYCR7YXNzZW1ibHlOYW1lfS5gLCAnJylcbiAgICAgICAgICAuc3BsaXQoJy4nKTtcblxuICAgICAgICBjb25zdCBzdWJtb2R1bGVQYXRoID0gc3VibW9kdWxlXG4gICAgICAgICAgLnNsaWNlKDAsIHN1Ym1vZHVsZS5sZW5ndGggLSAxKVxuICAgICAgICAgIC5qb2luKCcuJyk7XG4gICAgICAgIGNvbnN0IHN1Ym1vZHVsZU5hbWUgPSBzdWJtb2R1bGVbc3VibW9kdWxlLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb2RlLmxpbmUoYGZyb20gLiR7c3VibW9kdWxlUGF0aH0gaW1wb3J0ICR7c3VibW9kdWxlTmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdCB0aGUgYmluIHNjcmlwdHMgaWYgYmluIHNlY3Rpb24gZGVmaW5lZC5cbiAgICovXG4gIHB1YmxpYyBlbWl0QmluU2NyaXB0cyhjb2RlOiBDb2RlTWFrZXIpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2NyaXB0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgaWYgKHRoaXMubG9hZEFzc2VtYmx5KSB7XG4gICAgICBpZiAodGhpcy5hc3NlbWJseS5iaW4gIT0gbnVsbCkge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXModGhpcy5hc3NlbWJseS5iaW4pKSB7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0X2ZpbGUgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAnc3JjJyxcbiAgICAgICAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKHRoaXMucHl0aG9uTmFtZSksXG4gICAgICAgICAgICAnYmluJyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2RlLm9wZW5GaWxlKHNjcmlwdF9maWxlKTtcbiAgICAgICAgICBjb2RlLmxpbmUoJyMhL3Vzci9iaW4vZW52IHB5dGhvbicpO1xuICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICAgIGNvZGUubGluZSgnaW1wb3J0IGpzaWknKTtcbiAgICAgICAgICBjb2RlLmxpbmUoJ2ltcG9ydCBzeXMnKTtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgICBlbWl0TGlzdChcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAnX19qc2lpX2Fzc2VtYmx5X18gPSBqc2lpLkpTSUlBc3NlbWJseS5sb2FkKCcsXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkubmFtZSksXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkudmVyc2lvbiksXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMucHl0aG9uTmFtZS5yZXBsYWNlKCcuX2pzaWknLCAnJykpLFxuICAgICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5RmlsZW5hbWUpfWAsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgJyknLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgZW1pdExpc3QoXG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgJ19fanNpaV9hc3NlbWJseV9fLmludm9rZUJpblNjcmlwdCgnLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5Lm5hbWUpLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuYW1lKSxcbiAgICAgICAgICAgICAgJ3N5cy5hcmd2WzE6XScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgJyknLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29kZS5jbG9zZUZpbGUoc2NyaXB0X2ZpbGUpO1xuICAgICAgICAgIHNjcmlwdHMucHVzaChzY3JpcHRfZmlsZS5yZXBsYWNlKC9cXFxcL2csICcvJykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0RpcmVjdENoaWxkKHB5TW9kOiBQeXRob25Nb2R1bGUpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnB5dGhvbk5hbWUgPT09IHB5TW9kLnB5dGhvbk5hbWUgfHxcbiAgICAgICFweU1vZC5weXRob25OYW1lLnN0YXJ0c1dpdGgoYCR7dGhpcy5weXRob25OYW1lfS5gKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBNdXN0IGluY2x1ZGUgb25seSBvbmUgbW9yZSBjb21wb25lbnRcbiAgICByZXR1cm4gIXB5TW9kLnB5dGhvbk5hbWVcbiAgICAgIC5zdWJzdHJpbmcodGhpcy5weXRob25OYW1lLmxlbmd0aCArIDEpXG4gICAgICAuaW5jbHVkZXMoJy4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IHRoZSBSRUFETUUgYXMgbW9kdWxlIGRvY3N0cmluZyBpZiB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBtb2R1bGUgKGl0IGxvYWRzIHRoZSBhc3NlbWJseSlcbiAgICovXG4gIHByaXZhdGUgZW1pdE1vZHVsZURvY3VtZW50YXRpb24oY29kZTogQ29kZU1ha2VyKSB7XG4gICAgaWYgKHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbikge1xuICAgICAgY29kZS5saW5lKERPQ1NUUklOR19RVU9URVMpO1xuICAgICAgY29kZS5saW5lKHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbik7XG4gICAgICBjb2RlLmxpbmUoRE9DU1RSSU5HX1FVT1RFUyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RGVwZW5kZW5jeUltcG9ydHMoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgLy8gQ29sbGVjdCBhbGwgdGhlIChkaXJlY3QpIGRlcGVuZGVuY2llcycgLl9qc2lpIHBhY2thZ2VzLlxuICAgIGNvbnN0IGRlcHMgPSBPYmplY3Qua2V5cyh0aGlzLmFzc2VtYmx5LmRlcGVuZGVuY2llcyA/PyB7fSlcbiAgICAgIC5tYXAoXG4gICAgICAgIChkZXApID0+XG4gICAgICAgICAgdGhpcy5hc3NlbWJseS5kZXBlbmRlbmN5Q2xvc3VyZT8uW2RlcF0/LnRhcmdldHM/LnB5dGhvbj8ubW9kdWxlID8/XG4gICAgICAgICAgZGllKGBObyBQeXRob24gdGFyZ2V0IHdhcyBjb25maWdydWVkIGZvciB0aGUgZGVwZW5kZW5jeSBcIiR7ZGVwfVwiLmApLFxuICAgICAgKVxuICAgICAgLm1hcCgobW9kKSA9PiBgJHttb2R9Ll9qc2lpYClcbiAgICAgIC5zb3J0KCk7XG5cbiAgICAvLyBOb3cgYWN0dWFsbHkgd3JpdGUgdGhlIGltcG9ydCBzdGF0ZW1lbnRzLi4uXG4gICAgaWYgKGRlcHMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBmb3IgKGNvbnN0IG1vZHVsZU5hbWUgb2YgZGVwcykge1xuICAgICAgICBjb2RlLmxpbmUoYGltcG9ydCAke21vZHVsZU5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVxdWlyZWRJbXBvcnRzKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCByZXF1aXJlZEltcG9ydHMgPSB0aGlzLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KTtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRJbXBvcnRzKVxuICAgICAgLm1hcCgoW3NvdXJjZVBhY2thZ2UsIGl0ZW1zXSkgPT4gdG9JbXBvcnRTdGF0ZW1lbnRzKHNvdXJjZVBhY2thZ2UsIGl0ZW1zKSlcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGVsdCkgPT4gWy4uLmFjYywgLi4uZWx0XSxcbiAgICAgICAgbmV3IEFycmF5PHsgZW1pdDogKCkgPT4gdm9pZDsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9PigpLFxuICAgICAgKVxuICAgICAgLnNvcnQoaW1wb3J0Q29tcGFyYXRvcik7XG5cbiAgICBpZiAoc3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgICAgc3RhdGVtZW50LmVtaXQoY29kZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JbXBvcnRTdGF0ZW1lbnRzKFxuICAgICAgc291cmNlUGtnOiBzdHJpbmcsXG4gICAgICBpdGVtczogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbiAgICApOiBBcnJheTx7IGVtaXQ6IChjb2RlOiBDb2RlTWFrZXIpID0+IHZvaWQ7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PHtcbiAgICAgICAgZW1pdDogKGNvZGU6IENvZGVNYWtlcikgPT4gdm9pZDtcbiAgICAgICAgY29tcGFyaXNvbkJhc2U6IHN0cmluZztcbiAgICAgIH0+KCk7XG4gICAgICBpZiAoaXRlbXMuaGFzKCcnKSkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgY29tcGFyaXNvbkJhc2U6IGBpbXBvcnQgJHtzb3VyY2VQa2d9YCxcbiAgICAgICAgICBlbWl0KGNvZGUpIHtcbiAgICAgICAgICAgIGNvZGUubGluZSh0aGlzLmNvbXBhcmlzb25CYXNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBpZWNlTWVhbCA9IEFycmF5LmZyb20oaXRlbXMpXG4gICAgICAgIC5maWx0ZXIoKGkpID0+IGkgIT09ICcnKVxuICAgICAgICAuc29ydCgpO1xuICAgICAgaWYgKHBpZWNlTWVhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBjb21wYXJpc29uQmFzZTogYGZyb20gJHtzb3VyY2VQa2d9IGltcG9ydGAsXG4gICAgICAgICAgZW1pdDogKGNvZGUpID0+XG4gICAgICAgICAgICBlbWl0TGlzdChjb2RlLCBgZnJvbSAke3NvdXJjZVBrZ30gaW1wb3J0IGAsIHBpZWNlTWVhbCwgJycsIHtcbiAgICAgICAgICAgICAgaWZNdWx0aTogWycoJywgJyknXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW1wb3J0Q29tcGFyYXRvcihcbiAgICAgIGxlZnQ6IHsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9LFxuICAgICAgcmlnaHQ6IHsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9LFxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBsZWZ0LmNvbXBhcmlzb25CYXNlLnN0YXJ0c1dpdGgoJ2ltcG9ydCcpID09PVxuICAgICAgICByaWdodC5jb21wYXJpc29uQmFzZS5zdGFydHNXaXRoKCdpbXBvcnQnKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBsZWZ0LmNvbXBhcmlzb25CYXNlLmxvY2FsZUNvbXBhcmUocmlnaHQuY29tcGFyaXNvbkJhc2UpO1xuICAgICAgfVxuICAgICAgLy8gV2Ugd2FudCBcImZyb20gLmZvbyBpbXBvcnQgKC4uLilcIiB0byBiZSAqYWZ0ZXIqIFwiaW1wb3J0IGJhclwiXG4gICAgICByZXR1cm4gcmlnaHQuY29tcGFyaXNvbkJhc2UubG9jYWxlQ29tcGFyZShsZWZ0LmNvbXBhcmlzb25CYXNlKTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIFBhY2thZ2VEYXRhIHtcbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgZGF0YTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5jbGFzcyBQYWNrYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBQeXRob25Nb2R1bGUgdGhhdCByZXByZXNlbnRzIHRoZSByb290IG1vZHVsZSBvZiB0aGUgcGFja2FnZVxuICAgKi9cbiAgcHVibGljIHJvb3RNb2R1bGU/OiBQeXRob25Nb2R1bGU7XG5cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG1ldGFkYXRhOiBzcGVjLkFzc2VtYmx5O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBQeXRob25Nb2R1bGU+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBQYWNrYWdlRGF0YVtdPigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgbWV0YWRhdGE6IHNwZWMuQXNzZW1ibHkpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICB9XG5cbiAgcHVibGljIGFkZE1vZHVsZShtb2R1bGU6IFB5dGhvbk1vZHVsZSkge1xuICAgIHRoaXMubW9kdWxlcy5zZXQobW9kdWxlLnB5dGhvbk5hbWUsIG1vZHVsZSk7XG5cbiAgICAvLyBUaGlzIGlzIHRoZSBtb2R1bGUgdGhhdCByZXByZXNlbnRzIHRoZSBhc3NlbWJseVxuICAgIGlmIChtb2R1bGUuZnFuID09PSB0aGlzLm1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSA9IG1vZHVsZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWRkRGF0YShcbiAgICBtb2R1bGU6IFB5dGhvbk1vZHVsZSxcbiAgICBmaWxlbmFtZTogc3RyaW5nLFxuICAgIGRhdGE6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEuaGFzKG1vZHVsZS5weXRob25OYW1lKSkge1xuICAgICAgdGhpcy5kYXRhLnNldChtb2R1bGUucHl0aG9uTmFtZSwgW10pO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YS5nZXQobW9kdWxlLnB5dGhvbk5hbWUpIS5wdXNoKHsgZmlsZW5hbWUsIGRhdGEgfSk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGUoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IG1vZHVsZXMgPSBbLi4udGhpcy5tb2R1bGVzLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5weXRob25OYW1lLmxvY2FsZUNvbXBhcmUoYi5weXRob25OYW1lKSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2NyaXB0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIG9mIG91ciBtb2R1bGVzLCBhbmQgd3JpdGUgdGhlbSBvdXQgdG8gZGlzay5cbiAgICBmb3IgKGNvbnN0IG1vZCBvZiBtb2R1bGVzKSB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbihcbiAgICAgICAgJ3NyYycsXG4gICAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKG1vZC5weXRob25OYW1lKSxcbiAgICAgICAgJ19faW5pdF9fLnB5JyxcbiAgICAgICk7XG5cbiAgICAgIGNvZGUub3BlbkZpbGUoZmlsZW5hbWUpO1xuICAgICAgbW9kLmVtaXQoY29kZSwgY29udGV4dCk7XG4gICAgICBjb2RlLmNsb3NlRmlsZShmaWxlbmFtZSk7XG5cbiAgICAgIHNjcmlwdHMucHVzaCguLi5tb2QuZW1pdEJpblNjcmlwdHMoY29kZSkpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvdXIgcGFja2FnZSBkYXRhLlxuICAgIGNvbnN0IHBhY2thZ2VEYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFttb2QsIHBkYXRhXSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGZvciAoY29uc3QgZGF0YSBvZiBwZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5kYXRhICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICdzcmMnLFxuICAgICAgICAgICAgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUobW9kKSxcbiAgICAgICAgICAgIGRhdGEuZmlsZW5hbWUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvZGUub3BlbkZpbGUoZmlsZXBhdGgpO1xuICAgICAgICAgIGNvZGUubGluZShkYXRhLmRhdGEpO1xuICAgICAgICAgIGNvZGUuY2xvc2VGaWxlKGZpbGVwYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwYWNrYWdlRGF0YVttb2RdID0gcGRhdGEubWFwKChwZCkgPT4gcGQuZmlsZW5hbWUpO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGUgb3VyIGxpc3Qgb2YgZGVwZW5kZW5jaWVzXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2RlcE5hbWUsIHZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgdGhpcy5tZXRhZGF0YS5kZXBlbmRlbmNpZXMgPz8ge30sXG4gICAgKSkge1xuICAgICAgY29uc3QgZGVwSW5mbyA9IHRoaXMubWV0YWRhdGEuZGVwZW5kZW5jeUNsb3N1cmUhW2RlcE5hbWVdO1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICAgIGAke2RlcEluZm8udGFyZ2V0cyEucHl0aG9uIS5kaXN0TmFtZX0ke3RvUHl0aG9uVmVyc2lvblJhbmdlKHZlcnNpb24pfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE5lZWQgdG8gYWx3YXlzIHdyaXRlIHRoaXMgZmlsZSBhcyB0aGUgYnVpbGQgcHJvY2VzcyBkZXBlbmRzIG9uIGl0LlxuICAgIC8vIE1ha2UgdXAgc29tZSBjb250ZW50cyBpZiB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHVzZWZ1bCB0byBzYXkuXG4gICAgY29kZS5vcGVuRmlsZSgnUkVBRE1FLm1kJyk7XG4gICAgY29kZS5saW5lKFxuICAgICAgdGhpcy5yb290TW9kdWxlPy5tb2R1bGVEb2N1bWVudGF0aW9uID8/XG4gICAgICAgIGAke3RoaXMubmFtZX1cXG4keyc9Jy5yZXBlYXQodGhpcy5uYW1lLmxlbmd0aCl9YCxcbiAgICApO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdSRUFETUUubWQnKTtcblxuICAgIC8vIFN0cmlwIFwiIChidWlsZCBhYmNkZWYpXCIgZnJvbSB0aGUganNpaSB2ZXJzaW9uXG4gICAgY29uc3QganNpaVZlcnNpb25TaW1wbGUgPSB0aGlzLm1ldGFkYXRhLmpzaWlWZXJzaW9uLnJlcGxhY2UoLyAuKiQvLCAnJyk7XG5cbiAgICBjb25zdCBzZXR1cEt3YXJncyA9IHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLm1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgbGljZW5zZTogdGhpcy5tZXRhZGF0YS5saWNlbnNlLFxuICAgICAgdXJsOiB0aGlzLm1ldGFkYXRhLmhvbWVwYWdlLFxuICAgICAgbG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGU6ICd0ZXh0L21hcmtkb3duJyxcbiAgICAgIGF1dGhvcjpcbiAgICAgICAgdGhpcy5tZXRhZGF0YS5hdXRob3IubmFtZSArXG4gICAgICAgICh0aGlzLm1ldGFkYXRhLmF1dGhvci5lbWFpbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBgPCR7dGhpcy5tZXRhZGF0YS5hdXRob3IuZW1haWx9PmBcbiAgICAgICAgICA6ICcnKSxcbiAgICAgIGJkaXN0X3doZWVsOiB7XG4gICAgICAgIHVuaXZlcnNhbDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBwcm9qZWN0X3VybHM6IHtcbiAgICAgICAgU291cmNlOiB0aGlzLm1ldGFkYXRhLnJlcG9zaXRvcnkudXJsLFxuICAgICAgfSxcbiAgICAgIHBhY2thZ2VfZGlyOiB7ICcnOiAnc3JjJyB9LFxuICAgICAgcGFja2FnZXM6IG1vZHVsZXMubWFwKChtKSA9PiBtLnB5dGhvbk5hbWUpLFxuICAgICAgcGFja2FnZV9kYXRhOiBwYWNrYWdlRGF0YSxcbiAgICAgIHB5dGhvbl9yZXF1aXJlczogJz49My42JyxcbiAgICAgIGluc3RhbGxfcmVxdWlyZXM6IFtcbiAgICAgICAgYGpzaWkke3RvUHl0aG9uVmVyc2lvblJhbmdlKGBeJHtqc2lpVmVyc2lvblNpbXBsZX1gKX1gLFxuICAgICAgICAncHVibGljYXRpb24+PTAuMC4zJyxcbiAgICAgIF1cbiAgICAgICAgLmNvbmNhdChkZXBlbmRlbmNpZXMpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICBjbGFzc2lmaWVyczogW1xuICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsXG4gICAgICAgICdPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IEphdmFTY3JpcHQnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMgOjogT25seScsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy42JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjcnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuOCcsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy45JyxcbiAgICAgICAgJ1R5cGluZyA6OiBUeXBlZCcsXG4gICAgICBdLFxuICAgICAgc2NyaXB0cyxcbiAgICB9O1xuXG4gICAgc3dpdGNoICh0aGlzLm1ldGFkYXRhLmRvY3M/LnN0YWJpbGl0eSkge1xuICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5FeHBlcmltZW50YWw6XG4gICAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA0IC0gQmV0YScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuU3RhYmxlOlxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKFxuICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlJyxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LkRlcHJlY2F0ZWQ6XG4gICAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA3IC0gSW5hY3RpdmUnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gTm8gJ0RldmVsb3BtZW50IFN0YXR1cycgdHJvdmUgY2xhc3NpZmllciBmb3IgeW91IVxuICAgIH1cblxuICAgIGlmIChzcGR4TGljZW5zZUxpc3RbdGhpcy5tZXRhZGF0YS5saWNlbnNlXT8ub3NpQXBwcm92ZWQpIHtcbiAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goJ0xpY2Vuc2UgOjogT1NJIEFwcHJvdmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWRkaXRpb25hbENsYXNzaWZpZXJzID0gdGhpcy5tZXRhZGF0YS50YXJnZXRzPy5weXRob24/LmNsYXNzaWZpZXJzO1xuICAgIGlmIChhZGRpdGlvbmFsQ2xhc3NpZmllcnMgIT0gbnVsbCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFkZGl0aW9uYWxDbGFzc2lmaWVycykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgXCJqc2lpLnRhcmdldHMucHl0aG9uLmNsYXNzaWZpZXJzXCIgdmFsdWUgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIGlmIHByb3ZpZGVkLCBidXQgZm91bmQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGFkZGl0aW9uYWxDbGFzc2lmaWVycyxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIGRpc2NvdXJhZ2UgdXNpbmcgdGhvc2Ugc2luY2Ugd2UgYXV0b21hdGljYWxseSBzZXQgYSB2YWx1ZSBmb3IgdGhlbVxuICAgICAgZm9yIChsZXQgY2xhc3NpZmllciBvZiBhZGRpdGlvbmFsQ2xhc3NpZmllcnMuc29ydCgpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGhlIFwianNpaS50YXJnZXRzLnB5dGhvbi5jbGFzc2lmaWVyc1wiIHZhbHVlIGNhbiBvbmx5IGNvbnRhaW4gc3RyaW5ncywgYnV0IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIGNsYXNzaWZpZXIsXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSdsbCBzcGxpdCBvbiBgOjpgIGFuZCByZS1qb2luIGxhdGVyIHNvIGNsYXNzaWZpZXJzIGFyZSBcIm5vcm1hbGl6ZWRcIiB0byBhIHN0YW5kYXJkIHNwYWNpbmdcbiAgICAgICAgY29uc3QgcGFydHMgPSBjbGFzc2lmaWVyLnNwbGl0KCc6OicpLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpO1xuICAgICAgICBjb25zdCByZXNlcnZlZENsYXNzaWZpZXJzID0gW1xuICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMnLFxuICAgICAgICAgICdMaWNlbnNlJyxcbiAgICAgICAgICAnT3BlcmF0aW5nIFN5c3RlbScsXG4gICAgICAgICAgJ1R5cGluZycsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChyZXNlcnZlZENsYXNzaWZpZXJzLmluY2x1ZGVzKHBhcnRzWzBdKSkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBgQ2xhc3NpZmllcnMgc3RhcnRpbmcgd2l0aCAke3Jlc2VydmVkQ2xhc3NpZmllcnNcbiAgICAgICAgICAgICAgLm1hcCgoeCkgPT4gYFwiJHt4fSA6OlwiYClcbiAgICAgICAgICAgICAgLmpvaW4oXG4gICAgICAgICAgICAgICAgJywgJyxcbiAgICAgICAgICAgICAgKX0gYXJlIGF1dG9tYXRpY2FsbHkgc2V0IGFuZCBzaG91bGQgbm90IGJlIG1hbnVhbGx5IGNvbmZpZ3VyZWRgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2xhc3NpZmllciA9IHBhcnRzLmpvaW4oJyA6OiAnKTtcbiAgICAgICAgaWYgKHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLmluY2x1ZGVzKGNsYXNzaWZpZXIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc2V0dXBLd2FyZ3MuY2xhc3NpZmllcnMucHVzaChjbGFzc2lmaWVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSBOZWVkIGEgc2V0dXAucHkgdG8gbWFrZSB0aGlzIFBhY2thZ2UsIGFjdHVhbGx5IGEgUGFja2FnZS5cbiAgICBjb2RlLm9wZW5GaWxlKCdzZXR1cC5weScpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGpzb24nKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBzZXR1cHRvb2xzJyk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdrd2FyZ3MgPSBqc29uLmxvYWRzKCcpO1xuICAgIGNvZGUubGluZSgnICAgIFwiXCJcIicpO1xuICAgIGNvZGUubGluZShKU09OLnN0cmluZ2lmeShzZXR1cEt3YXJncywgbnVsbCwgNCkpO1xuICAgIGNvZGUubGluZSgnXCJcIlwiJyk7XG4gICAgY29kZS5saW5lKCcpJyk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5vcGVuQmxvY2soJ3dpdGggb3BlbihcIlJFQURNRS5tZFwiLCBlbmNvZGluZz1cInV0ZjhcIikgYXMgZnAnKTtcbiAgICBjb2RlLmxpbmUoJ2t3YXJnc1tcImxvbmdfZGVzY3JpcHRpb25cIl0gPSBmcC5yZWFkKCknKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoJ3NldHVwdG9vbHMuc2V0dXAoKiprd2FyZ3MpJyk7XG4gICAgY29kZS5jbG9zZUZpbGUoJ3NldHVwLnB5Jyk7XG5cbiAgICAvLyBCZWNhdXNlIHdlJ3JlIGdvb2QgY2l0aXplbnMsIHdlJ3JlIGdvaW5nIHRvIGdvIGFoZWFkIGFuZCBzdXBwb3J0IHB5cHJvamVjdC50b21sXG4gICAgLy8gYXMgd2VsbC5cbiAgICAvLyBUT0RPOiBNaWdodCBiZSBlYXNpZXIgdG8ganVzdCB1c2UgYSBUT01MIGxpYnJhcnkgdG8gd3JpdGUgdGhpcyBvdXQuXG4gICAgY29kZS5vcGVuRmlsZSgncHlwcm9qZWN0LnRvbWwnKTtcbiAgICBjb2RlLmxpbmUoJ1tidWlsZC1zeXN0ZW1dJyk7XG4gICAgY29uc3QgYnVpbGRUb29scyA9IGZzXG4gICAgICAucmVhZEZpbGVTeW5jKHJlcXVpcmVtZW50c0ZpbGUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSlcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGxpbmUpID0+IC9eXFxzKiguKylcXHMqI1xccypidWlsZC1zeXN0ZW1cXHMqJC8uZXhlYyhsaW5lKT8uWzFdPy50cmltKCkpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYnVpbGRUb29scywgZW50cnkpID0+IChlbnRyeSA/IFsuLi5idWlsZFRvb2xzLCBlbnRyeV0gOiBidWlsZFRvb2xzKSxcbiAgICAgICAgbmV3IEFycmF5PHN0cmluZz4oKSxcbiAgICAgICk7XG4gICAgY29kZS5saW5lKGByZXF1aXJlcyA9IFske2J1aWxkVG9vbHMubWFwKCh4KSA9PiBgXCIke3h9XCJgKS5qb2luKCcsICcpfV1gKTtcbiAgICBjb2RlLmxpbmUoJ2J1aWxkLWJhY2tlbmQgPSBcInNldHVwdG9vbHMuYnVpbGRfbWV0YVwiJyk7XG4gICAgY29kZS5jbG9zZUZpbGUoJ3B5cHJvamVjdC50b21sJyk7XG5cbiAgICAvLyBXZSBhbHNvIG5lZWQgdG8gd3JpdGUgb3V0IGEgTUFOSUZFU1QuaW4gdG8gZW5zdXJlIHRoYXQgYWxsIG9mIG91ciByZXF1aXJlZFxuICAgIC8vIGZpbGVzIGFyZSBpbmNsdWRlZC5cbiAgICBjb2RlLm9wZW5GaWxlKCdNQU5JRkVTVC5pbicpO1xuICAgIGNvZGUubGluZSgnaW5jbHVkZSBweXByb2plY3QudG9tbCcpO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdNQU5JRkVTVC5pbicpO1xuICB9XG59XG5cbnR5cGUgRmluZE1vZHVsZUNhbGxiYWNrID0gKGZxbjogc3RyaW5nKSA9PiBzcGVjLkFzc2VtYmx5Q29uZmlndXJhdGlvbjtcbnR5cGUgRmluZFR5cGVDYWxsYmFjayA9IChmcW46IHN0cmluZykgPT4gc3BlYy5UeXBlO1xuXG5jbGFzcyBUeXBlUmVzb2x2ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGVzOiBNYXA8c3RyaW5nLCBQeXRob25UeXBlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBib3VuZFRvPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGJvdW5kUmUhOiBSZWdFeHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlTmFtZT86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVSZSE6IFJlZ0V4cDtcbiAgcHJpdmF0ZSByZWFkb25seSBmaW5kTW9kdWxlOiBGaW5kTW9kdWxlQ2FsbGJhY2s7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmluZFR5cGU6IEZpbmRUeXBlQ2FsbGJhY2s7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHR5cGVzOiBNYXA8c3RyaW5nLCBQeXRob25UeXBlPixcbiAgICBmaW5kTW9kdWxlOiBGaW5kTW9kdWxlQ2FsbGJhY2ssXG4gICAgZmluZFR5cGU6IEZpbmRUeXBlQ2FsbGJhY2ssXG4gICAgYm91bmRUbz86IHN0cmluZyxcbiAgICBtb2R1bGVOYW1lPzogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLnR5cGVzID0gdHlwZXM7XG4gICAgdGhpcy5maW5kTW9kdWxlID0gZmluZE1vZHVsZTtcbiAgICB0aGlzLmZpbmRUeXBlID0gZmluZFR5cGU7XG4gICAgdGhpcy5tb2R1bGVOYW1lID0gbW9kdWxlTmFtZTtcbiAgICB0aGlzLmJvdW5kVG8gPSBib3VuZFRvICE9PSB1bmRlZmluZWQgPyB0aGlzLnRvUHl0aG9uRlFOKGJvdW5kVG8pIDogYm91bmRUbztcblxuICAgIGlmICh0aGlzLm1vZHVsZU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5tb2R1bGVSZSA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeKCR7ZXNjYXBlU3RyaW5nUmVnZXhwKHRoaXMubW9kdWxlTmFtZSl9KVxcXFwuKC4rKSRgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ib3VuZFRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYm91bmRSZSA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeKCR7ZXNjYXBlU3RyaW5nUmVnZXhwKHRoaXMuYm91bmRUbyl9KVxcXFwuKC4rKSRgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYmluZChmcW46IHN0cmluZywgbW9kdWxlTmFtZT86IHN0cmluZyk6IFR5cGVSZXNvbHZlciB7XG4gICAgcmV0dXJuIG5ldyBUeXBlUmVzb2x2ZXIoXG4gICAgICB0aGlzLnR5cGVzLFxuICAgICAgdGhpcy5maW5kTW9kdWxlLFxuICAgICAgdGhpcy5maW5kVHlwZSxcbiAgICAgIGZxbixcbiAgICAgIG1vZHVsZU5hbWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG1vZHVsZU5hbWUuc3RhcnRzV2l0aCgnLicpXG4gICAgICAgICAgPyBgJHt0aGlzLm1vZHVsZU5hbWV9JHttb2R1bGVOYW1lfWBcbiAgICAgICAgICA6IG1vZHVsZU5hbWVcbiAgICAgICAgOiB0aGlzLm1vZHVsZU5hbWUsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0luTW9kdWxlKHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHl0aG9uVHlwZSA9XG4gICAgICB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0aGlzLnRvUHl0aG9uRlFOKHR5cGVSZWYuZnFuKSA6IHR5cGVSZWY7XG4gICAgcmV0dXJuIHRoaXMubW9kdWxlUmUudGVzdChweXRob25UeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0luTmFtZXNwYWNlKHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHl0aG9uVHlwZSA9XG4gICAgICB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0aGlzLnRvUHl0aG9uRlFOKHR5cGVSZWYuZnFuKSA6IHR5cGVSZWY7XG4gICAgcmV0dXJuIHRoaXMuYm91bmRSZS50ZXN0KHB5dGhvblR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmVudCh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyk6IFB5dGhvblR5cGUge1xuICAgIGNvbnN0IGZxbiA9IHR5cGVvZiB0eXBlUmVmICE9PSAnc3RyaW5nJyA/IHR5cGVSZWYuZnFuIDogdHlwZVJlZjtcbiAgICBjb25zdCBtYXRjaGVzID0gL14oLispXFwuW14uXSskLy5leGVjKGZxbik7XG4gICAgaWYgKG1hdGNoZXMgPT0gbnVsbCB8fCAhQXJyYXkuaXNBcnJheShtYXRjaGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEZRTjogJHtmcW59YCk7XG4gICAgfVxuICAgIGNvbnN0IFssIHBhcmVudEZRTl0gPSBtYXRjaGVzO1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMudHlwZXMuZ2V0KHBhcmVudEZRTik7XG5cbiAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgcGFyZW50OiAgJHtwYXJlbnRGUU59YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWZpbmluZ1B5dGhvbk1vZHVsZShcbiAgICB0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBmcW4gPSB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0eXBlUmVmLmZxbiA6IHR5cGVSZWY7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy50eXBlcy5nZXQoZnFuKTtcblxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIGxldCBtb2QgPSBwYXJlbnQ7XG4gICAgICB3aGlsZSAoIShtb2QgaW5zdGFuY2VvZiBQeXRob25Nb2R1bGUpKSB7XG4gICAgICAgIG1vZCA9IHRoaXMuZ2V0UGFyZW50KG1vZC5mcW4hKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtb2QucHl0aG9uTmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaGVzID0gL14oW14uXSspXFwuLy5leGVjKGZxbik7XG4gICAgaWYgKG1hdGNoZXMgPT0gbnVsbCB8fCAhQXJyYXkuaXNBcnJheShtYXRjaGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEZRTjogJHtmcW59YCk7XG4gICAgfVxuICAgIGNvbnN0IFssIGFzc21dID0gbWF0Y2hlcztcbiAgICByZXR1cm4gdGhpcy5maW5kTW9kdWxlKGFzc20pLnRhcmdldHMhLnB5dGhvbiEubW9kdWxlO1xuICB9XG5cbiAgcHVibGljIGdldFR5cGUodHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UpOiBQeXRob25UeXBlIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlcy5nZXQodHlwZVJlZi5mcW4pO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9jYXRlIHR5cGU6IFwiJHt0eXBlUmVmLmZxbn1cImApO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgcHVibGljIGRlcmVmZXJlbmNlKHR5cGVSZWY6IHN0cmluZyB8IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlKTogc3BlYy5UeXBlIHtcbiAgICBpZiAodHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0eXBlUmVmID0gdHlwZVJlZi5mcW47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmRUeXBlKHR5cGVSZWYpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b1B5dGhvbkZRTihmcW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgW2Fzc2VtYmx5TmFtZSwgLi4ucXVhbGlmaWVkSWRlbnRpZmllcnNdID0gZnFuLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgZnFuUGFydHM6IHN0cmluZ1tdID0gW1xuICAgICAgdGhpcy5maW5kTW9kdWxlKGFzc2VtYmx5TmFtZSkudGFyZ2V0cyEucHl0aG9uIS5tb2R1bGUsXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBxdWFsaWZpZWRJZGVudGlmaWVycykge1xuICAgICAgZnFuUGFydHMucHVzaCh0b1B5dGhvbklkZW50aWZpZXIocGFydCkpO1xuICAgIH1cblxuICAgIHJldHVybiBmcW5QYXJ0cy5qb2luKCcuJyk7XG4gIH1cbn1cblxuY2xhc3MgUHl0aG9uR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHtcbiAgcHJpdmF0ZSBwYWNrYWdlITogUGFja2FnZTtcbiAgcHJpdmF0ZSByb290TW9kdWxlPzogUHl0aG9uTW9kdWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGVzOiBNYXA8c3RyaW5nLCBQeXRob25UeXBlPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3NldHRhOiBSb3NldHRhLFxuICAgIG9wdGlvbnM6IEdlbmVyYXRvck9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICB0aGlzLmNvZGUub3BlbkJsb2NrRm9ybWF0dGVyID0gKHMpID0+IGAke3N9OmA7XG4gICAgdGhpcy5jb2RlLmNsb3NlQmxvY2tGb3JtYXR0ZXIgPSAoX3MpID0+IGZhbHNlO1xuXG4gICAgdGhpcy50eXBlcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIHB1YmxpYyBlbWl0RG9jU3RyaW5nKFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBhcGlMb2NhdGlvbjogQXBpTG9jYXRpb24sXG4gICAgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGFyZ3VtZW50cz86IERvY3VtZW50YWJsZUFyZ3VtZW50W107XG4gICAgICBkb2N1bWVudGFibGVJdGVtPzogc3RyaW5nO1xuICAgICAgdHJhaWxpbmdOZXdMaW5lPzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIGlmICgoIWRvY3MgfHwgT2JqZWN0LmtleXMoZG9jcykubGVuZ3RoID09PSAwKSAmJiAhb3B0aW9ucy5hcmd1bWVudHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFkb2NzKSB7XG4gICAgICBkb2NzID0ge307XG4gICAgfVxuXG4gICAgY29uc3QgbGluZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgaWYgKGRvY3Muc3VtbWFyeSkge1xuICAgICAgbGluZXMucHVzaChtZDJyc3QocmVuZGVyU3VtbWFyeShkb2NzKSkpO1xuICAgICAgYnJrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJyaygpIHtcbiAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAwICYmIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYmxvY2soaGVhZGluZzogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGRvQnJrID0gdHJ1ZSkge1xuICAgICAgaWYgKGRvQnJrKSB7XG4gICAgICAgIGJyaygpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udGVudExpbmVzID0gbWQycnN0KGNvbnRlbnQpLnNwbGl0KCdcXG4nKTtcbiAgICAgIGlmIChjb250ZW50TGluZXMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgbGluZXMucHVzaChgOiR7aGVhZGluZ306ICR7Y29udGVudExpbmVzLmpvaW4oJycpfWAudHJpbSgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goYDoke2hlYWRpbmd9OmApO1xuICAgICAgICBicmsoKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGNvbnRlbnRMaW5lcykge1xuICAgICAgICAgIGxpbmVzLnB1c2gobGluZS50cmltKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZG9CcmspIHtcbiAgICAgICAgYnJrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRvY3MucmVtYXJrcykge1xuICAgICAgYnJrKCk7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAuLi5tZDJyc3QodGhpcy5jb252ZXJ0TWFya2Rvd24oZG9jcy5yZW1hcmtzID8/ICcnLCBhcGlMb2NhdGlvbikpLnNwbGl0KFxuICAgICAgICAgICdcXG4nLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIGJyaygpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmFyZ3VtZW50cz8ubGVuZ3RoID8/IDAgPiAwKSB7XG4gICAgICBicmsoKTtcbiAgICAgIGZvciAoY29uc3QgcGFyYW0gb2Ygb3B0aW9ucy5hcmd1bWVudHMhKSB7XG4gICAgICAgIC8vIEFkZCBhIGxpbmUgZm9yIGV2ZXJ5IGFyZ3VtZW50LiBFdmVuIGlmIHRoZXJlIGlzIG5vIGRlc2NyaXB0aW9uLCB3ZSBuZWVkXG4gICAgICAgIC8vIHRoZSBkb2NzdHJpbmcgc28gdGhhdCB0aGUgU3BoaW54IGV4dGVuc2lvbiBjYW4gYWRkIHRoZSB0eXBlIGFubm90YXRpb25zLlxuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGA6cGFyYW0gJHt0b1B5dGhvblBhcmFtZXRlck5hbWUocGFyYW0ubmFtZSl9OiAke29uZWxpbmVEZXNjcmlwdGlvbihcbiAgICAgICAgICAgIHBhcmFtLmRvY3MsXG4gICAgICAgICAgKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJrKCk7XG4gICAgfVxuXG4gICAgaWYgKGRvY3MuZGVmYXVsdCkge1xuICAgICAgYmxvY2soJ2RlZmF1bHQnLCBkb2NzLmRlZmF1bHQpO1xuICAgIH1cbiAgICBpZiAoZG9jcy5yZXR1cm5zKSB7XG4gICAgICBibG9jaygncmV0dXJuJywgZG9jcy5yZXR1cm5zKTtcbiAgICB9XG4gICAgaWYgKGRvY3MuZGVwcmVjYXRlZCkge1xuICAgICAgYmxvY2soJ2RlcHJlY2F0ZWQnLCBkb2NzLmRlcHJlY2F0ZWQpO1xuICAgIH1cbiAgICBpZiAoZG9jcy5zZWUpIHtcbiAgICAgIGJsb2NrKCdzZWUnLCBkb2NzLnNlZSwgZmFsc2UpO1xuICAgIH1cbiAgICBpZiAoZG9jcy5zdGFiaWxpdHkgJiYgc2hvdWxkTWVudGlvblN0YWJpbGl0eShkb2NzLnN0YWJpbGl0eSkpIHtcbiAgICAgIGJsb2NrKCdzdGFiaWxpdHknLCBkb2NzLnN0YWJpbGl0eSwgZmFsc2UpO1xuICAgIH1cbiAgICBpZiAoZG9jcy5zdWJjbGFzc2FibGUpIHtcbiAgICAgIGJsb2NrKCdzdWJjbGFzc2FibGUnLCAnWWVzJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoZG9jcy5jdXN0b20gPz8ge30pKSB7XG4gICAgICBibG9jayhrLCB2LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKGRvY3MuZXhhbXBsZSkge1xuICAgICAgYnJrKCk7XG4gICAgICBsaW5lcy5wdXNoKCdFeGFtcGxlOjonKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgY29uc3QgZXhhbXBsZVRleHQgPSB0aGlzLmNvbnZlcnRFeGFtcGxlKGRvY3MuZXhhbXBsZSwgYXBpTG9jYXRpb24pO1xuXG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZXhhbXBsZVRleHQuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgICAke2xpbmV9YCk7XG4gICAgICB9XG4gICAgICBicmsoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9PT0gJycpIHtcbiAgICAgIGxpbmVzLnBvcCgpO1xuICAgIH1cblxuICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb2RlLmxpbmUoYCR7RE9DU1RSSU5HX1FVT1RFU30ke2xpbmVzWzBdfSR7RE9DU1RSSU5HX1FVT1RFU31gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZS5saW5lKGAke0RPQ1NUUklOR19RVU9URVN9JHtsaW5lc1swXX1gKTtcbiAgICAgIGxpbmVzLnNwbGljZSgwLCAxKTtcblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGNvZGUubGluZShsaW5lKTtcbiAgICAgIH1cblxuICAgICAgY29kZS5saW5lKERPQ1NUUklOR19RVU9URVMpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50cmFpbGluZ05ld0xpbmUpIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjb252ZXJ0RXhhbXBsZShleGFtcGxlOiBzdHJpbmcsIGFwaUxvYzogQXBpTG9jYXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnJvc2V0dGEudHJhbnNsYXRlRXhhbXBsZShcbiAgICAgIGFwaUxvYyxcbiAgICAgIGV4YW1wbGUsXG4gICAgICBUYXJnZXRMYW5ndWFnZS5QWVRIT04sXG4gICAgICBlbmZvcmNlc1N0cmljdE1vZGUodGhpcy5hc3NlbWJseSksXG4gICAgKTtcbiAgICByZXR1cm4gdHJhbnNsYXRlZC5zb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgY29udmVydE1hcmtkb3duKG1hcmtkb3duOiBzdHJpbmcsIGFwaUxvYzogQXBpTG9jYXRpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJvc2V0dGEudHJhbnNsYXRlU25pcHBldHNJbk1hcmtkb3duKFxuICAgICAgYXBpTG9jLFxuICAgICAgbWFya2Rvd24sXG4gICAgICBUYXJnZXRMYW5ndWFnZS5QWVRIT04sXG4gICAgICBlbmZvcmNlc1N0cmljdE1vZGUodGhpcy5hc3NlbWJseSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQeXRob25UeXBlKGZxbjogc3RyaW5nKTogUHl0aG9uVHlwZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZXMuZ2V0KGZxbik7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBsb2NhdGUgdHlwZTogXCIke2Zxbn1cImApO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEFzc2VtYmx5T3V0cHV0RGlyKGFzc206IHNwZWMuQXNzZW1ibHkpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKFxuICAgICAgJ3NyYycsXG4gICAgICBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZSh0aGlzLmdldEFzc2VtYmx5TW9kdWxlTmFtZShhc3NtKSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luQXNzZW1ibHkoYXNzbTogc3BlYy5Bc3NlbWJseSwgX2ZpbmdlcnByaW50OiBib29sZWFuKSB7XG4gICAgdGhpcy5wYWNrYWdlID0gbmV3IFBhY2thZ2UoXG4gICAgICBhc3NtLnRhcmdldHMhLnB5dGhvbiEuZGlzdE5hbWUsXG4gICAgICB0b1JlbGVhc2VWZXJzaW9uKGFzc20udmVyc2lvbiwgVGFyZ2V0TmFtZS5QWVRIT04pLFxuICAgICAgYXNzbSxcbiAgICApO1xuXG4gICAgLy8gVGhpcyBpcyB0aGUgJzxwYWNrYWdlbmFtZT4uX2pzaWknIG1vZHVsZSBmb3IgdGhpcyBhc3NlbWJseVxuICAgIGNvbnN0IGFzc2VtYmx5TW9kdWxlID0gbmV3IFB5dGhvbk1vZHVsZShcbiAgICAgIHRoaXMuZ2V0QXNzZW1ibHlNb2R1bGVOYW1lKGFzc20pLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBhc3NlbWJseTogYXNzbSxcbiAgICAgICAgYXNzZW1ibHlGaWxlbmFtZTogdGhpcy5nZXRBc3NlbWJseUZpbGVOYW1lKCksXG4gICAgICAgIGxvYWRBc3NlbWJseTogdHJ1ZSxcbiAgICAgICAgcGFja2FnZTogdGhpcy5wYWNrYWdlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5wYWNrYWdlLmFkZE1vZHVsZShhc3NlbWJseU1vZHVsZSk7XG4gICAgdGhpcy5wYWNrYWdlLmFkZERhdGEoYXNzZW1ibHlNb2R1bGUsIHRoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kQXNzZW1ibHkoYXNzbTogc3BlYy5Bc3NlbWJseSwgX2ZpbmdlcnByaW50OiBib29sZWFuKSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSBuZXcgVHlwZVJlc29sdmVyKFxuICAgICAgdGhpcy50eXBlcyxcbiAgICAgIChmcW46IHN0cmluZykgPT4gdGhpcy5maW5kTW9kdWxlKGZxbiksXG4gICAgICAoZnFuOiBzdHJpbmcpID0+IHRoaXMuZmluZFR5cGUoZnFuKSxcbiAgICApO1xuICAgIHRoaXMucGFja2FnZS53cml0ZSh0aGlzLmNvZGUsIHtcbiAgICAgIGFzc2VtYmx5OiBhc3NtLFxuICAgICAgZW1pdHRlZFR5cGVzOiBuZXcgU2V0KCksXG4gICAgICByZXNvbHZlcixcbiAgICAgIHN1Ym1vZHVsZTogYXNzbS5uYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpbGwgYmUgY2FsbGVkIGZvciBhc3NlbWJseSByb290LCBuYW1lc3BhY2VzIGFuZCBzdWJtb2R1bGVzIChhbnl0aGluZyB0aGF0IGNvbnRhaW5zIG90aGVyIHR5cGVzLCBiYXNlZCBvbiBpdHMgRlFOKVxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQmVnaW5OYW1lc3BhY2UobnM6IHN0cmluZykge1xuICAgIC8vICducycgY29udGFpbnMgc29tZXRoaW5nIGxpa2UgJ0BzY29wZS9qc2lpLWNhbGMtYmFzZS1vZi1iYXNlJ1xuICAgIGNvbnN0IHN1Ym1vZHVsZUxpa2UgPVxuICAgICAgbnMgPT09IHRoaXMuYXNzZW1ibHkubmFtZVxuICAgICAgICA/IHRoaXMuYXNzZW1ibHlcbiAgICAgICAgOiB0aGlzLmFzc2VtYmx5LnN1Ym1vZHVsZXM/Lltuc107XG5cbiAgICBjb25zdCByZWFkbWVMb2NhdGlvbjogQXBpTG9jYXRpb24gPSB7IGFwaTogJ21vZHVsZVJlYWRtZScsIG1vZHVsZUZxbjogbnMgfTtcblxuICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBQeXRob25Nb2R1bGUodG9QYWNrYWdlTmFtZShucywgdGhpcy5hc3NlbWJseSksIG5zLCB7XG4gICAgICBhc3NlbWJseTogdGhpcy5hc3NlbWJseSxcbiAgICAgIGFzc2VtYmx5RmlsZW5hbWU6IHRoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpLFxuICAgICAgcGFja2FnZTogdGhpcy5wYWNrYWdlLFxuICAgICAgbW9kdWxlRG9jdW1lbnRhdGlvbjogc3VibW9kdWxlTGlrZT8ucmVhZG1lXG4gICAgICAgID8gdGhpcy5jb252ZXJ0TWFya2Rvd24oXG4gICAgICAgICAgICBzdWJtb2R1bGVMaWtlLnJlYWRtZT8ubWFya2Rvd24sXG4gICAgICAgICAgICByZWFkbWVMb2NhdGlvbixcbiAgICAgICAgICApLnRyaW0oKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIHRoaXMucGFja2FnZS5hZGRNb2R1bGUobW9kdWxlKTtcbiAgICB0aGlzLnR5cGVzLnNldChucywgbW9kdWxlKTtcbiAgICBpZiAobnMgPT09IHRoaXMuYXNzZW1ibHkubmFtZSkge1xuICAgICAgLy8gVGhpcyBhcHBsaWVzIHJlY3Vyc2l2ZWx5IHRvIHN1Ym1vZHVsZXMsIHNvIG5vIG5lZWQgdG8gZHVwbGljYXRlIVxuICAgICAgdGhpcy5wYWNrYWdlLmFkZERhdGEobW9kdWxlLCAncHkudHlwZWQnLCAnJyk7XG4gICAgfVxuXG4gICAgaWYgKG5zID09PSB0aGlzLmFzc2VtYmx5Lm5hbWUpIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSA9IG1vZHVsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb290TW9kdWxlIS5hZGRQeXRob25Nb2R1bGUobW9kdWxlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmROYW1lc3BhY2UobnM6IHN0cmluZykge1xuICAgIGlmIChucyA9PT0gdGhpcy5hc3NlbWJseS5uYW1lKSB7XG4gICAgICBkZWxldGUgdGhpcy5yb290TW9kdWxlO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luQ2xhc3MoY2xzOiBzcGVjLkNsYXNzVHlwZSwgYWJzdHJhY3Q6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBrbGFzcyA9IG5ldyBDbGFzcyhcbiAgICAgIHRoaXMsXG4gICAgICB0b1B5dGhvbklkZW50aWZpZXIoY2xzLm5hbWUpLFxuICAgICAgY2xzLFxuICAgICAgY2xzLmZxbixcbiAgICAgIHtcbiAgICAgICAgYWJzdHJhY3QsXG4gICAgICAgIGJhc2VzOiBjbHMuYmFzZSA/IFt0aGlzLmZpbmRUeXBlKGNscy5iYXNlKV0gOiB1bmRlZmluZWQsXG4gICAgICAgIGludGVyZmFjZXM6IGNscy5pbnRlcmZhY2VzPy5tYXAoKGJhc2UpID0+IHRoaXMuZmluZFR5cGUoYmFzZSkpLFxuICAgICAgICBhYnN0cmFjdEJhc2VzOiBhYnN0cmFjdCA/IHRoaXMuZ2V0QWJzdHJhY3RCYXNlcyhjbHMpIDogW10sXG4gICAgICB9LFxuICAgICAgY2xzLmRvY3MsXG4gICAgKTtcblxuICAgIGlmIChjbHMuaW5pdGlhbGl6ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzID0gW10gfSA9IGNscy5pbml0aWFsaXplcjtcblxuICAgICAga2xhc3MuYWRkTWVtYmVyKFxuICAgICAgICBuZXcgSW5pdGlhbGl6ZXIoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICAnX19pbml0X18nLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBjbHMuaW5pdGlhbGl6ZXIuZG9jcyxcbiAgICAgICAgICBmYWxzZSwgLy8gTmV2ZXIgc3RhdGljXG4gICAgICAgICAgeyBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AoY2xzLmluaXRpYWxpemVyKSwgcGFyZW50OiBjbHMgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRQeXRob25UeXBlKGtsYXNzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY01ldGhvZChjbHM6IHNwZWMuQ2xhc3NUeXBlLCBtZXRob2Q6IHNwZWMuTWV0aG9kKSB7XG4gICAgY29uc3QgeyBwYXJhbWV0ZXJzID0gW10gfSA9IG1ldGhvZDtcblxuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShjbHMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgU3RhdGljTWV0aG9kKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbk1ldGhvZE5hbWUobWV0aG9kLm5hbWUpLFxuICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgbWV0aG9kLnJldHVybnMsXG4gICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICB0cnVlLCAvLyBBbHdheXMgc3RhdGljXG4gICAgICAgIHtcbiAgICAgICAgICBhYnN0cmFjdDogbWV0aG9kLmFic3RyYWN0LFxuICAgICAgICAgIGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChtZXRob2QpLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShjbHMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgU3RhdGljUHJvcGVydHkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uUHJvcGVydHlOYW1lKHByb3AubmFtZSwgcHJvcC5jb25zdCksXG4gICAgICAgIHByb3AubmFtZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgcHJvcC5kb2NzLFxuICAgICAgICB7XG4gICAgICAgICAgYWJzdHJhY3Q6IHByb3AuYWJzdHJhY3QsXG4gICAgICAgICAgaW1tdXRhYmxlOiBwcm9wLmltbXV0YWJsZSxcbiAgICAgICAgICBpc1N0YXRpYzogcHJvcC5zdGF0aWMsXG4gICAgICAgICAgcGFyZW50OiBjbHMsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBtZXRob2Q7XG5cbiAgICBpZiAobWV0aG9kLmFzeW5jKSB7XG4gICAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgICBuZXcgQXN5bmNNZXRob2QoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0b1B5dGhvbk1ldGhvZE5hbWUobWV0aG9kLm5hbWUsIG1ldGhvZC5wcm90ZWN0ZWQpLFxuICAgICAgICAgIG1ldGhvZC5uYW1lLFxuICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgbWV0aG9kLnJldHVybnMsXG4gICAgICAgICAgbWV0aG9kLmRvY3MsXG4gICAgICAgICAgISFtZXRob2Quc3RhdGljLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFic3RyYWN0OiBtZXRob2QuYWJzdHJhY3QsXG4gICAgICAgICAgICBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AobWV0aG9kKSxcbiAgICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgICBuZXcgTWV0aG9kKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lLCBtZXRob2QucHJvdGVjdGVkKSxcbiAgICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICAgICEhbWV0aG9kLnN0YXRpYyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhYnN0cmFjdDogbWV0aG9kLmFic3RyYWN0LFxuICAgICAgICAgICAgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKG1ldGhvZCksXG4gICAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Qcm9wZXJ0eShjbHM6IHNwZWMuQ2xhc3NUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgIG5ldyBQcm9wZXJ0eShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lLCBwcm9wLmNvbnN0LCBwcm9wLnByb3RlY3RlZCksXG4gICAgICAgIHByb3AubmFtZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgcHJvcC5kb2NzLFxuICAgICAgICB7XG4gICAgICAgICAgYWJzdHJhY3Q6IHByb3AuYWJzdHJhY3QsXG4gICAgICAgICAgaW1tdXRhYmxlOiBwcm9wLmltbXV0YWJsZSxcbiAgICAgICAgICBpc1N0YXRpYzogcHJvcC5zdGF0aWMsXG4gICAgICAgICAgcGFyZW50OiBjbHMsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25VbmlvblByb3BlcnR5KFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgcHJvcDogc3BlYy5Qcm9wZXJ0eSxcbiAgICBfdW5pb246IHNwZWMuVW5pb25UeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICB0aGlzLm9uUHJvcGVydHkoY2xzLCBwcm9wKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luSW50ZXJmYWNlKGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlKSB7XG4gICAgbGV0IGlmYWNlOiBJbnRlcmZhY2UgfCBTdHJ1Y3Q7XG5cbiAgICBpZiAoaWZjLmRhdGF0eXBlKSB7XG4gICAgICBpZmFjZSA9IG5ldyBTdHJ1Y3QoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uSWRlbnRpZmllcihpZmMubmFtZSksXG4gICAgICAgIGlmYyxcbiAgICAgICAgaWZjLmZxbixcbiAgICAgICAgeyBiYXNlczogaWZjLmludGVyZmFjZXM/Lm1hcCgoYmFzZSkgPT4gdGhpcy5maW5kVHlwZShiYXNlKSkgfSxcbiAgICAgICAgaWZjLmRvY3MsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZmFjZSA9IG5ldyBJbnRlcmZhY2UoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uSWRlbnRpZmllcihpZmMubmFtZSksXG4gICAgICAgIGlmYyxcbiAgICAgICAgaWZjLmZxbixcbiAgICAgICAgeyBiYXNlczogaWZjLmludGVyZmFjZXM/Lm1hcCgoYmFzZSkgPT4gdGhpcy5maW5kVHlwZShiYXNlKSkgfSxcbiAgICAgICAgaWZjLmRvY3MsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYWRkUHl0aG9uVHlwZShpZmFjZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmRJbnRlcmZhY2UoX2lmYzogc3BlYy5JbnRlcmZhY2VUeXBlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlTWV0aG9kKGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlLCBtZXRob2Q6IHNwZWMuTWV0aG9kKSB7XG4gICAgY29uc3QgeyBwYXJhbWV0ZXJzID0gW10gfSA9IG1ldGhvZDtcblxuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShpZmMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgSW50ZXJmYWNlTWV0aG9kKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbk1ldGhvZE5hbWUobWV0aG9kLm5hbWUsIG1ldGhvZC5wcm90ZWN0ZWQpLFxuICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgbWV0aG9kLnJldHVybnMsXG4gICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICAhIW1ldGhvZC5zdGF0aWMsXG4gICAgICAgIHsgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKG1ldGhvZCksIHBhcmVudDogaWZjIH0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VQcm9wZXJ0eShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIGxldCBpZmFjZVByb3BlcnR5OiBJbnRlcmZhY2VQcm9wZXJ0eSB8IFN0cnVjdEZpZWxkO1xuXG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgaWZhY2VQcm9wZXJ0eSA9IG5ldyBTdHJ1Y3RGaWVsZCh0aGlzLCBwcm9wLCBpZmMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZmFjZVByb3BlcnR5ID0gbmV3IEludGVyZmFjZVByb3BlcnR5KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvblByb3BlcnR5TmFtZShwcm9wLm5hbWUsIHByb3AuY29uc3QsIHByb3AucHJvdGVjdGVkKSxcbiAgICAgICAgcHJvcC5uYW1lLFxuICAgICAgICBwcm9wLFxuICAgICAgICBwcm9wLmRvY3MsXG4gICAgICAgIHsgaW1tdXRhYmxlOiBwcm9wLmltbXV0YWJsZSwgaXNTdGF0aWM6IHByb3Auc3RhdGljLCBwYXJlbnQ6IGlmYyB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmdldFB5dGhvblR5cGUoaWZjLmZxbikuYWRkTWVtYmVyKGlmYWNlUHJvcGVydHkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5FbnVtKGVubTogc3BlYy5FbnVtVHlwZSkge1xuICAgIHRoaXMuYWRkUHl0aG9uVHlwZShcbiAgICAgIG5ldyBFbnVtKHRoaXMsIHRvUHl0aG9uSWRlbnRpZmllcihlbm0ubmFtZSksIGVubSwgZW5tLmZxbiwge30sIGVubS5kb2NzKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW51bU1lbWJlcihlbm06IHNwZWMuRW51bVR5cGUsIG1lbWJlcjogc3BlYy5FbnVtTWVtYmVyKSB7XG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGVubS5mcW4pLmFkZE1lbWJlcihcbiAgICAgIG5ldyBFbnVtTWVtYmVyKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbklkZW50aWZpZXIobWVtYmVyLm5hbWUpLFxuICAgICAgICBtZW1iZXIubmFtZSxcbiAgICAgICAgbWVtYmVyLmRvY3MsXG4gICAgICAgIGVubSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZE92ZXJsb2FkKFxuICAgIF9pZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IEludGVyZmFjZU1ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2RPdmVybG9hZChcbiAgICBfY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IE1ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2RPdmVybG9hZChcbiAgICBfY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IFN0YXRpY01ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcml2YXRlIGdldEFzc2VtYmx5TW9kdWxlTmFtZShhc3NtOiBzcGVjLkFzc2VtYmx5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7YXNzbS50YXJnZXRzIS5weXRob24hLm1vZHVsZX0uX2pzaWlgO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXJlbnRGUU4oZnFuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG0gPSAvXiguKylcXC5bXi5dKyQvLmV4ZWMoZnFuKTtcblxuICAgIGlmIChtID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVybWluZSBwYXJlbnQgRlFOIG9mOiAke2Zxbn1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbVsxXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyZW50KGZxbjogc3RyaW5nKTogUHl0aG9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHl0aG9uVHlwZSh0aGlzLmdldFBhcmVudEZRTihmcW4pKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUHl0aG9uVHlwZSh0eXBlOiBQeXRob25UeXBlKSB7XG4gICAgaWYgKHR5cGUuZnFuID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBhIFB5dGhvbiB0eXBlIHdpdGhvdXQgYSBGUU4uJyk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRQYXJlbnQodHlwZS5mcW4pLmFkZE1lbWJlcih0eXBlKTtcbiAgICB0aGlzLnR5cGVzLnNldCh0eXBlLmZxbiwgdHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldGxpZnRlZFByb3AoXG4gICAgbWV0aG9kOiBzcGVjLk1ldGhvZCB8IHNwZWMuSW5pdGlhbGl6ZXIsXG4gICk6IHNwZWMuSW50ZXJmYWNlVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gSWYgdGhlcmUgYXJlIHBhcmFtZXRlcnMgdG8gdGhpcyBtZXRob2QsIGFuZCBpZiB0aGUgbGFzdCBwYXJhbWV0ZXIncyB0eXBlIGlzXG4gICAgLy8gYSBkYXRhdHlwZSBpbnRlcmZhY2UsIHRoZW4gd2Ugd2FudCB0byBsaWZ0IHRoZSBtZW1iZXJzIG9mIHRoYXQgbGFzdCBwYXJhbXRlclxuICAgIC8vIGFzIGtleXdvcmQgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24uXG4gICAgaWYgKG1ldGhvZC5wYXJhbWV0ZXJzPy5sZW5ndGggPz8gMCA+PSAxKSB7XG4gICAgICBjb25zdCBsYXN0UGFyYW1ldGVyID0gbWV0aG9kLnBhcmFtZXRlcnMhLnNsaWNlKC0xKVswXTtcbiAgICAgIGlmIChcbiAgICAgICAgIWxhc3RQYXJhbWV0ZXIudmFyaWFkaWMgJiZcbiAgICAgICAgc3BlYy5pc05hbWVkVHlwZVJlZmVyZW5jZShsYXN0UGFyYW1ldGVyLnR5cGUpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbGFzdFBhcmFtZXRlclR5cGUgPSB0aGlzLmZpbmRUeXBlKGxhc3RQYXJhbWV0ZXIudHlwZS5mcW4pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc3BlYy5pc0ludGVyZmFjZVR5cGUobGFzdFBhcmFtZXRlclR5cGUpICYmXG4gICAgICAgICAgbGFzdFBhcmFtZXRlclR5cGUuZGF0YXR5cGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGxhc3RQYXJhbWV0ZXJUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWJzdHJhY3RCYXNlcyhjbHM6IHNwZWMuQ2xhc3NUeXBlKTogc3BlYy5DbGFzc1R5cGVbXSB7XG4gICAgY29uc3QgYWJzdHJhY3RCYXNlczogc3BlYy5DbGFzc1R5cGVbXSA9IFtdO1xuXG4gICAgaWYgKGNscy5iYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLmZpbmRUeXBlKGNscy5iYXNlKTtcblxuICAgICAgaWYgKCFzcGVjLmlzQ2xhc3NUeXBlKGJhc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNsYXNzIGluaGVyaXRlbmNlIHRoYXQgaXNuJ3QgYSBjbGFzcz9cIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChiYXNlLmFic3RyYWN0KSB7XG4gICAgICAgIGFic3RyYWN0QmFzZXMucHVzaChiYXNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWJzdHJhY3RCYXNlcztcbiAgfVxufVxuXG4vKipcbiAqIFBvc2l0aW9uYWwgYXJndW1lbnQgb3Iga2V5d29yZCBwYXJhbWV0ZXJcbiAqL1xuaW50ZXJmYWNlIERvY3VtZW50YWJsZUFyZ3VtZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZWZpbmluZ1R5cGU6IHNwZWMuVHlwZTtcbiAgZG9jcz86IHNwZWMuRG9jcztcbn1cblxuLyoqXG4gKiBSZW5kZXIgYSBvbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB0aGUgZ2l2ZW4gZG9jcywgdXNlZCBmb3IgbWV0aG9kIGFyZ3VtZW50cyBhbmQgaW5saW5lZCBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG9uZWxpbmVEZXNjcmlwdGlvbihkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQpIHtcbiAgLy8gT25seSBjb25zaWRlciBhIHN1YnNldCBvZiBmaWVsZHMgaGVyZSwgd2UgZG9uJ3QgaGF2ZSBhIGxvdCBvZiBmb3JtYXR0aW5nIHNwYWNlXG4gIGlmICghZG9jcyB8fCBPYmplY3Qua2V5cyhkb2NzKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJy0nO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBbXTtcbiAgaWYgKGRvY3Muc3VtbWFyeSkge1xuICAgIHBhcnRzLnB1c2gobWQycnN0KHJlbmRlclN1bW1hcnkoZG9jcykpKTtcbiAgfVxuICBpZiAoZG9jcy5yZW1hcmtzKSB7XG4gICAgcGFydHMucHVzaChtZDJyc3QoZG9jcy5yZW1hcmtzKSk7XG4gIH1cbiAgaWYgKGRvY3MuZGVmYXVsdCkge1xuICAgIHBhcnRzLnB1c2goYERlZmF1bHQ6ICR7bWQycnN0KGRvY3MuZGVmYXVsdCl9YCk7XG4gIH1cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKS5yZXBsYWNlKC9cXHMrL2csICcgJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZE1lbnRpb25TdGFiaWxpdHkoczogc3BlYy5TdGFiaWxpdHkpIHtcbiAgLy8gRG9uJ3QgcmVuZGVyIFwic3RhYmxlXCIgb3IgXCJleHRlcm5hbFwiLCB0aG9zZSBhcmUgYm90aCBzdGFibGUgYnkgaW1wbGljYXRpb24uXG4gIHJldHVybiBzID09PSBzcGVjLlN0YWJpbGl0eS5EZXByZWNhdGVkIHx8IHMgPT09IHNwZWMuU3RhYmlsaXR5LkV4cGVyaW1lbnRhbDtcbn1cblxuZnVuY3Rpb24gaXNTdHJ1Y3QoXG4gIHR5cGVTeXN0ZW06IHJlZmxlY3QuVHlwZVN5c3RlbSxcbiAgcmVmOiBzcGVjLlR5cGVSZWZlcmVuY2UsXG4pOiBib29sZWFuIHtcbiAgaWYgKCFzcGVjLmlzTmFtZWRUeXBlUmVmZXJlbmNlKHJlZikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgdHlwZSA9IHR5cGVTeXN0ZW0udHJ5RmluZEZxbihyZWYuZnFuKTtcbiAgcmV0dXJuICEhKHR5cGU/LmlzSW50ZXJmYWNlVHlwZSgpICYmIHR5cGU/LmlzRGF0YVR5cGUoKSk7XG59XG5cbi8qKlxuICogQXBwZW5kcyBgX2AgYXQgdGhlIGVuZCBvZiBgbmFtZWAgdW50aWwgaXQgbm8gbG9uZ2VyIGNvbmZsaWN0cyB3aXRoIGFueSBvZiB0aGVcbiAqIGVudHJpZXMgaW4gYGluVXNlYC5cbiAqXG4gKiBAcGFyYW0gbmFtZSAgdGhlIG5hbWUgdG8gYmUgc2x1Z2lmaWVkLlxuICogQHBhcmFtIGluVXNlIHRoZSBuYW1lcyB0aGF0IGFyZSBhbHJlYWR5IGJlaW5nIHVzZWQuXG4gKlxuICogQHJldHVybnMgdGhlIHNsdWdpZmllZCBuYW1lLlxuICovXG5mdW5jdGlvbiBzbHVnaWZ5QXNOZWVkZWQobmFtZTogc3RyaW5nLCBpblVzZTogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBpblVzZVNldCA9IG5ldyBTZXQoaW5Vc2UpO1xuICB3aGlsZSAoaW5Vc2VTZXQuaGFzKG5hbWUpKSB7XG4gICAgbmFtZSA9IGAke25hbWV9X2A7XG4gIH1cbiAgcmV0dXJuIG5hbWU7XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBCRUhPTEQ6IEhlbHBlcnMgdG8gb3V0cHV0IGNvZGUgdGhhdCBsb29rcyBsaWtlIHdoYXQgQmxhY2sgd291bGQgZm9ybWF0IGludG8uLi5cbi8vXG4vLyBAc2VlIGh0dHBzOi8vYmxhY2sucmVhZHRoZWRvY3MuaW8vZW4vc3RhYmxlL3RoZV9ibGFja19jb2RlX3N0eWxlLmh0bWxcblxuY29uc3QgVEFSR0VUX0xJTkVfTEVOR1RIID0gODg7XG5cbmZ1bmN0aW9uIG9wZW5TaWduYXR1cmUoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAga2V5d29yZDogJ2NsYXNzJyxcbiAgbmFtZTogc3RyaW5nLFxuICBwYXJhbXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogdm9pZDtcbmZ1bmN0aW9uIG9wZW5TaWduYXR1cmUoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAga2V5d29yZDogJ2RlZicsXG4gIG5hbWU6IHN0cmluZyxcbiAgcGFyYW1zOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdHJhaWxpbmdDb21tYTogYm9vbGVhbixcbiAgcmV0dXJuVHlwZTogc3RyaW5nLFxuKTogdm9pZDtcbmZ1bmN0aW9uIG9wZW5TaWduYXR1cmUoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAga2V5d29yZDogJ2NsYXNzJyB8ICdkZWYnLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhcmFtczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHRyYWlsaW5nQ29tbWEgPSBmYWxzZSxcbiAgcmV0dXJuVHlwZT86IHN0cmluZyxcbikge1xuICBjb25zdCBwcmVmaXggPSBgJHtrZXl3b3JkfSAke25hbWV9YDtcbiAgY29uc3Qgc3VmZml4ID0gcmV0dXJuVHlwZSA/IGAgLT4gJHtyZXR1cm5UeXBlfWAgOiAnJztcbiAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICBjb2RlLm9wZW5CbG9jayhgJHtwcmVmaXh9JHtyZXR1cm5UeXBlID8gJygpJyA6ICcnfSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGpvaW4gPSAnLCAnO1xuICBjb25zdCB7IGVsZW1lbnRzU2l6ZSwgam9pblNpemUgfSA9IHRvdGFsU2l6ZU9mKHBhcmFtcywgam9pbik7XG5cbiAgY29uc3QgaGFzQ29tbWVudHMgPSAhcGFyYW1zLnNvbWUoKHBhcmFtKSA9PiAvIyAuKyQvLmV4ZWMocGFyYW0pKTtcblxuICBpZiAoXG4gICAgaGFzQ29tbWVudHMgJiZcbiAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgICAgcHJlZml4Lmxlbmd0aCArXG4gICAgICAgIGVsZW1lbnRzU2l6ZSArXG4gICAgICAgIGpvaW5TaXplICtcbiAgICAgICAgc3VmZml4Lmxlbmd0aCArXG4gICAgICAgIDJcbiAgKSB7XG4gICAgY29kZS5vcGVuQmxvY2soYCR7cHJlZml4fSgke3BhcmFtcy5qb2luKGpvaW4pfSkke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb2RlLmluZGVudChgJHtwcmVmaXh9KGApO1xuICBpZiAoXG4gICAgIWhhc0NvbW1lbnRzICYmXG4gICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICAgIGVsZW1lbnRzU2l6ZSArXG4gICAgICAgIGpvaW5TaXplICtcbiAgICAgICAgKHRyYWlsaW5nQ29tbWEgPyAxIDogMClcbiAgKSB7XG4gICAgY29kZS5saW5lKGAke3BhcmFtcy5qb2luKGpvaW4pfSR7dHJhaWxpbmdDb21tYSA/ICcsJyA6ICcnfWApO1xuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG4gICAgICBjb2RlLmxpbmUocGFyYW0ucmVwbGFjZSgvKFxccyojIC4rKT8kLywgJywkMScpKTtcbiAgICB9XG4gIH1cbiAgY29kZS51bmluZGVudChmYWxzZSk7XG4gIGNvZGUub3BlbkJsb2NrKGApJHtzdWZmaXh9YCk7XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkNhbGxSZXN1bHQoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAgdmFyaWFibGU6IHN0cmluZyxcbiAgZnVuY3Q6IHN0cmluZyxcbiAgcGFyYW1zOiByZWFkb25seSBzdHJpbmdbXSxcbikge1xuICBjb25zdCBwcmVmaXggPSBgJHt2YXJpYWJsZX0gPSAke2Z1bmN0fShgO1xuICBjb25zdCBzdWZmaXggPSAnKSc7XG5cbiAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGpvaW4gPSAnLCAnO1xuICBjb25zdCB7IGVsZW1lbnRzU2l6ZSwgam9pblNpemUgfSA9IHRvdGFsU2l6ZU9mKHBhcmFtcywgam9pbik7XG5cbiAgaWYgKFxuICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgIHByZWZpeC5sZW5ndGggK1xuICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgIGpvaW5TaXplICtcbiAgICAgIHN1ZmZpeC5sZW5ndGhcbiAgKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke3BhcmFtcy5qb2luKGpvaW4pfSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvZGUuaW5kZW50KHByZWZpeCk7XG4gIGlmIChUQVJHRVRfTElORV9MRU5HVEggPiBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggKyBlbGVtZW50c1NpemUgKyBqb2luU2l6ZSkge1xuICAgIGNvZGUubGluZShwYXJhbXMuam9pbihqb2luKSk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcbiAgICAgIGNvZGUubGluZShgJHtwYXJhbX0sYCk7XG4gICAgfVxuICB9XG4gIGNvZGUudW5pbmRlbnQoc3VmZml4KTtcbn1cblxuZnVuY3Rpb24gYXNzaWduRGljdGlvbmFyeShcbiAgY29kZTogQ29kZU1ha2VyLFxuICB2YXJpYWJsZTogc3RyaW5nLFxuICBlbGVtZW50czogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHRyYWlsaW5nPzogc3RyaW5nLFxuICBjb21wYWN0ID0gZmFsc2UsXG4pOiB2b2lkIHtcbiAgY29uc3Qgc3BhY2UgPSBjb21wYWN0ID8gJycgOiAnICc7XG5cbiAgY29uc3QgcHJlZml4ID0gYCR7dmFyaWFibGV9JHtzcGFjZX09JHtzcGFjZX17YDtcbiAgY29uc3Qgc3VmZml4ID0gYH0ke3RyYWlsaW5nID8/ICcnfWA7XG5cbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNvbXBhY3QpIHtcbiAgICBjb25zdCBqb2luID0gJywgJztcbiAgICBjb25zdCB7IGVsZW1lbnRzU2l6ZSwgam9pblNpemUgfSA9IHRvdGFsU2l6ZU9mKGVsZW1lbnRzLCBqb2luKTtcbiAgICBpZiAoXG4gICAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgICAgcHJlZml4Lmxlbmd0aCArXG4gICAgICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICAgIGVsZW1lbnRzU2l6ZSArXG4gICAgICAgIGpvaW5TaXplICtcbiAgICAgICAgc3VmZml4Lmxlbmd0aFxuICAgICkge1xuICAgICAgY29kZS5saW5lKGAke3ByZWZpeH0ke2VsZW1lbnRzLmpvaW4oam9pbil9JHtzdWZmaXh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgY29kZS5pbmRlbnQocHJlZml4KTtcbiAgZm9yIChjb25zdCBlbHQgb2YgZWxlbWVudHMpIHtcbiAgICBjb2RlLmxpbmUoYCR7ZWx0fSxgKTtcbiAgfVxuICBjb2RlLnVuaW5kZW50KHN1ZmZpeCk7XG59XG5cbmZ1bmN0aW9uIGVtaXRMaXN0KFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIHByZWZpeDogc3RyaW5nLFxuICBlbGVtZW50czogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHN1ZmZpeDogc3RyaW5nLFxuICBvcHRzPzogeyBpZk11bHRpOiBbc3RyaW5nLCBzdHJpbmddIH0sXG4pIHtcbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgam9pbiA9ICcsICc7XG4gIGNvbnN0IHsgZWxlbWVudHNTaXplLCBqb2luU2l6ZSB9ID0gdG90YWxTaXplT2YoZWxlbWVudHMsIGpvaW4pO1xuICBpZiAoXG4gICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgcHJlZml4Lmxlbmd0aCArXG4gICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgam9pblNpemUgK1xuICAgICAgc3VmZml4Lmxlbmd0aFxuICApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7ZWxlbWVudHMuam9pbihqb2luKX0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBbYmVmb3JlLCBhZnRlcl0gPSBvcHRzPy5pZk11bHRpID8/IFsnJywgJyddO1xuXG4gIGNvZGUuaW5kZW50KGAke3ByZWZpeH0ke2JlZm9yZX1gKTtcbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvZGUubGluZShlbGVtZW50c1swXSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKFxuICAgICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArIGVsZW1lbnRzU2l6ZSArIGpvaW5TaXplXG4gICAgKSB7XG4gICAgICBjb2RlLmxpbmUoZWxlbWVudHMuam9pbihqb2luKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgZWx0IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgIGNvZGUubGluZShgJHtlbHR9LGApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb2RlLnVuaW5kZW50KGAke2FmdGVyfSR7c3VmZml4fWApO1xufVxuXG5mdW5jdGlvbiB0b3RhbFNpemVPZihzdHJpbmdzOiByZWFkb25seSBzdHJpbmdbXSwgam9pbjogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgZWxlbWVudHNTaXplOiBzdHJpbmdzXG4gICAgICAubWFwKChzdHIpID0+IHN0ci5sZW5ndGgpXG4gICAgICAucmVkdWNlKChhY2MsIGVsdCkgPT4gYWNjICsgZWx0LCAwKSxcbiAgICBqb2luU2l6ZTogc3RyaW5ncy5sZW5ndGggPiAxID8gam9pbi5sZW5ndGggKiAoc3RyaW5ncy5sZW5ndGggLSAxKSA6IDAsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5lc3RlZENvbnRleHQoXG4gIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICBmcW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IEVtaXRDb250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5jb250ZXh0LFxuICAgIHN1cnJvdW5kaW5nVHlwZUZxbnM6XG4gICAgICBmcW4gIT0gbnVsbFxuICAgICAgICA/IFsuLi4oY29udGV4dC5zdXJyb3VuZGluZ1R5cGVGcW5zID8/IFtdKSwgZnFuXVxuICAgICAgICA6IGNvbnRleHQuc3Vycm91bmRpbmdUeXBlRnFucyxcbiAgfTtcbn1cblxuY29uc3QgaXNEZXByZWNhdGVkID0gKHg6IFB5dGhvbkJhc2UpID0+IHguZG9jcz8uZGVwcmVjYXRlZCAhPT0gdW5kZWZpbmVkO1xuXG4vKipcbiAqIExhc3QgY29tcG9uZW50IG9mIGEgLi1zZXBhcmF0ZWQgbmFtZVxuICovXG5mdW5jdGlvbiBsYXN0Q29tcG9uZW50KG46IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IG4uc3BsaXQoJy4nKTtcbiAgcmV0dXJuIHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xufVxuIl19
|
|
2105
|
+
//# sourceMappingURL=python.js.map
|