@nikovirtala/projen-constructs 0.2.157 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +1077 -818
- package/.kiro/steering/product.md +1 -1
- package/.kiro/steering/tech.md +6 -4
- package/API.md +9711 -5492
- package/docs/api/assets/highlight.css +1 -1
- package/docs/api/assets/main.js +1 -1
- package/docs/api/assets/search.js +1 -1
- package/docs/api/assets/style.css +18 -3
- package/docs/api/classes/AwsCdkConstructLibraryProject.html +997 -162
- package/docs/api/classes/AwsCdkTypeScriptAppProject.html +1015 -157
- package/docs/api/classes/Bundler.html +267 -17
- package/docs/api/classes/Colima.html +221 -16
- package/docs/api/classes/Homebrew.html +244 -16
- package/docs/api/classes/JsiiProject.html +983 -150
- package/docs/api/classes/LambdaFunctionCodeBundle.html +222 -16
- package/docs/api/classes/LambdaFunctionCodeBundler.html +222 -16
- package/docs/api/classes/LambdaFunctionConstructGenerator.html +243 -16
- package/docs/api/classes/LocalStack.html +222 -16
- package/docs/api/classes/Mise.html +233 -16
- package/docs/api/classes/ProjectGenerator.html +229 -19
- package/docs/api/classes/TypeDoc.html +246 -19
- package/docs/api/classes/TypeScriptProject.html +983 -150
- package/docs/api/classes/Vitest.html +295 -16
- package/docs/api/enums/CommentStyle.html +74 -8
- package/docs/api/enums/CoverageProvider.html +65 -6
- package/docs/api/enums/CoverageReporter.html +72 -7
- package/docs/api/enums/EntryPointStrategy.html +74 -8
- package/docs/api/enums/Environment.html +79 -9
- package/docs/api/enums/LogLevel.html +79 -9
- package/docs/api/enums/Pool.html +75 -8
- package/docs/api/enums/ProjectType.html +149 -27
- package/docs/api/enums/Visibility.html +69 -7
- package/docs/api/functions/applyDefaults.html +41 -1
- package/docs/api/functions/convertToPosixPath.html +40 -1
- package/docs/api/functions/renderBundleName.html +40 -1
- package/docs/api/functions/toJson_TypeDocConfiguration.html +42 -2
- package/docs/api/hierarchy.html +29 -1
- package/docs/api/index.html +60 -2
- package/docs/api/interfaces/AwsCdkConstructLibraryProjectOptions.html +2404 -770
- package/docs/api/interfaces/AwsCdkTypeScriptAppProjectOptions.html +2302 -740
- package/docs/api/interfaces/Bundle.html +57 -2
- package/docs/api/interfaces/BundlerOptions.html +60 -2
- package/docs/api/interfaces/BundlingOptions.html +84 -2
- package/docs/api/interfaces/Component.html +70 -7
- package/docs/api/interfaces/ComponentOptions.html +66 -6
- package/docs/api/interfaces/HomebrewOptions.html +51 -2
- package/docs/api/interfaces/JsiiProjectOptions.html +2263 -713
- package/docs/api/interfaces/LambdaFunctionCodeBundleOptions.html +63 -2
- package/docs/api/interfaces/LambdaFunctionCodeBundlerOptions.html +57 -2
- package/docs/api/interfaces/LambdaFunctionConstructGeneratorOptions.html +72 -2
- package/docs/api/interfaces/LocalStackOptions.html +60 -2
- package/docs/api/interfaces/MiseOptions.html +51 -2
- package/docs/api/interfaces/ProjectGeneratorOptions.html +136 -20
- package/docs/api/interfaces/TypeDocConfiguration.html +469 -96
- package/docs/api/interfaces/TypeDocOptions.html +62 -5
- package/docs/api/interfaces/TypeScriptProjectOptions.html +2032 -638
- package/docs/api/interfaces/ValidationOptions.html +70 -7
- package/docs/api/interfaces/VitestConfigOptions.html +268 -57
- package/docs/api/interfaces/VitestOptions.html +71 -7
- package/docs/api/modules.html +52 -1
- package/docs/api/variables/defaultOptions.html +40 -1
- package/docs/api/variables/defaults.html +48 -1
- package/docs/api/variables/projectDefaultOptions.html +120 -1
- package/lib/bundle-vitest-define-config.js +37 -4
- package/lib/components/bundle-lambda-function-code.js +43 -9
- package/lib/components/colima.js +6 -4
- package/lib/components/homebrew.js +10 -4
- package/lib/components/lambda-function-construct-generator.js +47 -6
- package/lib/components/localstack.js +2 -4
- package/lib/components/mise.js +2 -4
- package/lib/components/typedoc.js +11 -4
- package/lib/components/vitest.d.ts +1 -1
- package/lib/components/vitest.js +58 -6
- package/lib/config.d.ts +52 -6
- package/lib/config.js +87 -10
- package/lib/errors.js +7 -1
- package/lib/project-generator.js +46 -9
- package/lib/project-type.d.ts +0 -8
- package/lib/project-type.js +1 -9
- package/lib/projects/awscdk-construct-library-options.generated.d.ts +72 -18
- package/lib/projects/awscdk-construct-library-options.generated.js +1 -1
- package/lib/projects/awscdk-construct-library.generated.d.ts +1 -1
- package/lib/projects/awscdk-construct-library.generated.js +2 -4
- package/lib/projects/awscdk-typescript-app-options.generated.d.ts +63 -17
- package/lib/projects/awscdk-typescript-app-options.generated.js +1 -1
- package/lib/projects/awscdk-typescript-app.generated.d.ts +1 -1
- package/lib/projects/awscdk-typescript-app.generated.js +2 -4
- package/lib/projects/jsii-options.generated.d.ts +72 -10
- package/lib/projects/jsii-options.generated.js +1 -1
- package/lib/projects/jsii.generated.d.ts +1 -1
- package/lib/projects/jsii.generated.js +2 -4
- package/lib/projects/typescript-options.generated.d.ts +63 -9
- package/lib/projects/typescript-options.generated.js +1 -1
- package/lib/projects/typescript.generated.d.ts +1 -1
- package/lib/projects/typescript.generated.js +2 -4
- package/lib/utils.d.ts +8 -0
- package/lib/utils.js +11 -2
- package/node_modules/@jsii/spec/lib/assembly-utils.js +36 -3
- package/node_modules/@jsii/spec/lib/validators.js +1 -1
- package/node_modules/@jsii/spec/package.json +4 -4
- package/package.json +19 -20
- package/pnpm-workspace.yaml +8 -0
- package/lib/components/vitest-bundled-define-config.d.ts +0 -1
- package/lib/components/vitest-bundled-define-config.js +0 -6
- package/lib/vitest-define-config-entry.d.ts +0 -1
- package/lib/vitest-define-config-entry.js +0 -6
package/lib/project-generator.js
CHANGED
|
@@ -1,12 +1,44 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
3
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
36
|
exports.ProjectGenerator = void 0;
|
|
5
37
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
38
|
const node_fs_1 = require("node:fs");
|
|
7
39
|
const node_path_1 = require("node:path");
|
|
8
40
|
const jsii_struct_builder_1 = require("@mrgrain/jsii-struct-builder");
|
|
9
|
-
const projen = require("projen");
|
|
41
|
+
const projen = __importStar(require("projen"));
|
|
10
42
|
const errors_1 = require("./errors");
|
|
11
43
|
/**
|
|
12
44
|
* Default components applied to all generated projects
|
|
@@ -31,13 +63,14 @@ function getDefaultComponents() {
|
|
|
31
63
|
* opening/closing blocks, and flushing accumulated content.
|
|
32
64
|
*/
|
|
33
65
|
class CodeBuffer {
|
|
66
|
+
indent;
|
|
67
|
+
lines = [];
|
|
68
|
+
indentLevel = 0;
|
|
34
69
|
/**
|
|
35
70
|
* @param indent - String to use for each indentation level (default: single space)
|
|
36
71
|
*/
|
|
37
72
|
constructor(indent = " ") {
|
|
38
73
|
this.indent = indent;
|
|
39
|
-
this.lines = [];
|
|
40
|
-
this.indentLevel = 0;
|
|
41
74
|
}
|
|
42
75
|
/**
|
|
43
76
|
* Returns all accumulated lines and resets the buffer
|
|
@@ -101,6 +134,8 @@ class CodeBuffer {
|
|
|
101
134
|
* Uses JSII manifest introspection to validate base classes and options interfaces.
|
|
102
135
|
*/
|
|
103
136
|
class TypeScriptClassRenderer {
|
|
137
|
+
buffer;
|
|
138
|
+
jsiiManifest;
|
|
104
139
|
/**
|
|
105
140
|
* @param indent - Number of spaces per indentation level (default: 4)
|
|
106
141
|
*/
|
|
@@ -303,7 +338,8 @@ class TypeScriptClassRenderer {
|
|
|
303
338
|
*/
|
|
304
339
|
renderExport(optionsInterface) {
|
|
305
340
|
const optionsFileName = this.getOptionsFileName(optionsInterface);
|
|
306
|
-
|
|
341
|
+
/* type-only re-export, required by `isolatedModules` */
|
|
342
|
+
this.buffer.line(`export type { ${optionsInterface} } from "./${optionsFileName}.generated";`);
|
|
307
343
|
}
|
|
308
344
|
/**
|
|
309
345
|
* Renders the class declaration and constructor
|
|
@@ -384,6 +420,10 @@ class TypeScriptClassRenderer {
|
|
|
384
420
|
* with opinionated defaults and component integration.
|
|
385
421
|
*/
|
|
386
422
|
class ProjectGenerator extends projen.Component {
|
|
423
|
+
options;
|
|
424
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.ProjectGenerator", version: "0.3.0" };
|
|
425
|
+
renderer;
|
|
426
|
+
static enumGenerated = false;
|
|
387
427
|
/**
|
|
388
428
|
* @param project - Projen project instance
|
|
389
429
|
* @param options - Generator configuration
|
|
@@ -768,9 +808,6 @@ class ProjectGenerator extends projen.Component {
|
|
|
768
808
|
}
|
|
769
809
|
}
|
|
770
810
|
exports.ProjectGenerator = ProjectGenerator;
|
|
771
|
-
_a = JSII_RTTI_SYMBOL_1;
|
|
772
|
-
ProjectGenerator[_a] = { fqn: "@nikovirtala/projen-constructs.ProjectGenerator", version: "0.2.157" };
|
|
773
|
-
ProjectGenerator.enumGenerated = false;
|
|
774
811
|
/**
|
|
775
812
|
* Text file for generated TypeScript class code
|
|
776
813
|
*
|
|
@@ -791,4 +828,4 @@ class TypeScriptClassFile extends projen.TextFile {
|
|
|
791
828
|
this.addLine(content);
|
|
792
829
|
}
|
|
793
830
|
}
|
|
794
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvamVjdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxQ0FBdUM7QUFDdkMseUNBQW1EO0FBRW5ELHNFQUFvRTtBQUVwRSxpQ0FBaUM7QUFDakMscUNBTWtCO0FBR2xCOztHQUVHO0FBQ0gsU0FBUyxvQkFBb0I7SUFDekIsT0FBTztRQUNILEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRTtRQUNyRDtZQUNJLGNBQWMsRUFBRSxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNO1lBQ3JELGVBQWUsRUFBRTtnQkFDYixJQUFJLEVBQUUsZUFBZTtnQkFDckIsSUFBSSxFQUFFLDhDQUE4QztnQkFDcEQsSUFBSSxFQUFFLHNCQUFzQjthQUMvQjtTQUNKO0tBQ0osQ0FBQztBQUNOLENBQUM7QUErR0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVU7SUFJWjs7T0FFRztJQUNILFlBQTZCLFNBQVMsR0FBRztRQUFaLFdBQU0sR0FBTixNQUFNLENBQU07UUFOakMsVUFBSyxHQUFhLEVBQUUsQ0FBQztRQUNyQixnQkFBVyxHQUFHLENBQUMsQ0FBQztJQUtvQixDQUFDO0lBRTdDOzs7O09BSUc7SUFDSCxLQUFLO1FBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksQ0FBQyxJQUFhO1FBQ2QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksQ0FBQyxJQUFhO1FBQ2QsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsSUFBYTtRQUNmLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksZ0NBQXVCLEVBQUUsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLO1FBQ1QsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztDQUNKO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sdUJBQXVCO0lBSXpCOztPQUVHO0lBQ0gsWUFBWSxNQUFNLEdBQUcsQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNqRCw4REFBOEQ7UUFDOUQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDakUsTUFBTSxVQUFVLEdBQUcsSUFBQSxtQkFBTyxFQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBQSxzQkFBWSxFQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxPQUFnQztRQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXBCLHlEQUF5RDtRQUN6RCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksU0FBUyxDQUFDO1FBQ2xELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkUsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFaEUsc0VBQXNFO1FBQ3RFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUVoRSxnRUFBZ0U7UUFDaEUsTUFBTSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUUvRCwyQ0FBMkM7UUFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFMUYsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSCxpQkFBaUIsQ0FBQyxXQUF3QjtRQUN0QyxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEMseUVBQXlFO1FBQ3pFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLG9DQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxVQUFVLFNBQVMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sVUFBVSxHQUFHLEdBQUcsWUFBWSxTQUFTLENBQUM7UUFFNUMsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLG9DQUEyQixDQUFDLDBDQUEwQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksb0NBQTJCLENBQUMsaURBQWlELFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNLLHVCQUF1QixDQUFDLFVBQXVCO1FBQ25ELE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQztRQUNqQyxNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUM7UUFFcEMsS0FBSyxNQUFNLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUN6QixzRkFBc0Y7WUFDdEYsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXZCLDREQUE0RDtZQUM1RCxNQUFNLEtBQUssR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQUMsQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzlELGdGQUFnRjtnQkFDaEYsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUMsZUFBZSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BHLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsRUFBRSxZQUFZLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDM0QsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLDBEQUEwRDtnQkFDMUQsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkMsQ0FBQztZQUNELGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBRUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNLLGNBQWMsQ0FBQyxPQUFnQyxFQUFFLGdCQUF3QjtRQUM3RSxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztRQUUvQyx3R0FBd0c7UUFDeEcsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFbEUsK0JBQStCO1FBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTdDLG9DQUFvQztRQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2RSw0RUFBNEU7UUFDNUUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQ2hFLEtBQUssTUFBTSxDQUFDLElBQUksVUFBVSxFQUFFLENBQUM7WUFDekIsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDNUMsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5QyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixhQUFhLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7UUFDTCxDQUFDO1FBRUQsOEJBQThCO1FBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWhELG1GQUFtRjtRQUNuRixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssZUFBZSxZQUFZLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzRSxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSyxhQUFhLENBQUMsV0FBd0I7UUFDMUMsT0FBTyxrQkFBa0IsV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxhQUFhLENBQUMsT0FBaUM7UUFDbkQsaUZBQWlGO1FBQ2pGLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNELE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QyxJQUFJLFdBQVcsS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUVILEtBQUssTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7WUFDOUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hELCtFQUErRTtZQUMvRSxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzlDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzdFLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFlBQVksQ0FBQyxnQkFBd0I7UUFDekMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxnQkFBZ0IsY0FBYyxlQUFlLGNBQWMsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLFdBQVcsQ0FDZixPQUFnQyxFQUNoQyxnQkFBd0IsRUFDeEIsZUFBdUIsRUFDdkIsV0FBcUIsRUFDckIsY0FBc0I7UUFFdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxPQUFPLENBQUMsSUFBSSx3REFBd0QsQ0FBQyxDQUFDO1FBQzdGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHlGQUF5RixDQUFDLENBQUM7UUFDNUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLE9BQU8sQ0FBQyxJQUFJLFlBQVksT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNLLGlCQUFpQixDQUNyQixPQUFnQyxFQUNoQyxnQkFBd0IsRUFDeEIsZUFBdUIsRUFDdkIsV0FBcUIsRUFDckIsY0FBc0I7UUFFdEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0VBQStFLENBQUMsQ0FBQztRQUNsRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsZUFBZSxLQUFLLFVBQVUsa0JBQWtCLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLGNBQWMsSUFBSSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsa0JBQWtCLENBQUMsZ0JBQXdCO1FBQ3ZDLE1BQU0sT0FBTyxHQUEyQjtZQUNwQyx3QkFBd0IsRUFBRSxvQkFBb0I7WUFDOUMsa0JBQWtCLEVBQUUsY0FBYztZQUNsQyxpQ0FBaUMsRUFBRSwrQkFBK0I7WUFDbEUsb0NBQW9DLEVBQUUsa0NBQWtDO1NBQzNFLENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZFLENBQUM7Q0FDSjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSxnQkFBaUIsU0FBUSxNQUFNLENBQUMsU0FBUztJQUlsRDs7O09BR0c7SUFDSCxZQUNJLE9BQWdCLEVBQ0MsT0FBZ0M7UUFFakQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRkUsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7UUFHakQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHVCQUF1QixFQUFFLENBQUM7UUFFOUMsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUMvQixnQkFBZ0IsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFDLENBQUM7UUFFRCw4RUFBOEU7UUFDOUUsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUNsRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1RSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVsRTs7K0ZBRXVGO1FBQ3ZGLE1BQU0sTUFBTSxHQUFHLElBQUksa0NBQVksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDL0QsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixRQUFRLEVBQUUsZUFBZTtZQUN6QixpQkFBaUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7U0FDeEMsQ0FBQzthQUNHLEtBQUssQ0FBQyw0QkFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUNyQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLHNEQUFzRDtRQUN0RCxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxvREFBb0Q7UUFDcEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFaEQsS0FBSyxNQUFNLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTVGLHdDQUF3QztZQUN4QyxNQUFNLENBQUMsR0FBRyxDQUFDO2dCQUNQLElBQUk7Z0JBQ0osSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUU7Z0JBQzFDLFFBQVEsRUFBRSxJQUFJO2dCQUNkLElBQUksRUFBRTtvQkFDRixPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksWUFBWTtvQkFDcEQsT0FBTyxFQUFFLE1BQU07aUJBQ2xCO2FBQ0osQ0FBQyxDQUFDO1lBRUgsdURBQXVEO1lBQ3ZELElBQUksQ0FBQyxDQUFDLGVBQWUsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDO29CQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDeEQsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDdEQsTUFBTSxDQUFDLEdBQUcsQ0FBQzs0QkFDUCxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUk7NEJBQ3RCLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFOzRCQUM5QixRQUFRLEVBQUUsSUFBSTs0QkFDZCxJQUFJLEVBQUU7Z0NBQ0YsT0FBTyxFQUFFLFdBQVcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksZ0JBQWdCO2dDQUNyRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksZ0JBQWdCOzZCQUM5RDt5QkFDSixDQUFDLENBQUM7b0JBQ1AsQ0FBQztnQkFDTCxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2Isb0VBQW9FO29CQUNwRSxPQUFPLENBQUMsSUFBSSxDQUNSLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ1gsT0FBTyxFQUFFLDBDQUEwQzt3QkFDbkQsU0FBUyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSTt3QkFDaEMsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7cUJBQ2hFLENBQUMsQ0FDTCxDQUFDO2dCQUNOLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELHlDQUF5QztRQUN6QyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssbUJBQW1CLENBQUMsT0FBZ0I7UUFDeEMsT0FBTyxPQUFrRCxDQUFDO0lBQzlELENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSyxrQkFBa0IsQ0FBQyxnQkFBd0I7UUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLDZCQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sR0FBRyxHQUFHLElBQUksZUFBZSxlQUFlLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsYUFBYTtRQUNULE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVuRCxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFO1lBQ2xFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJO1NBQzFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxHQUFXO1FBQzlCLElBQUksQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxPQUFPLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLENBQUM7UUFDL0MsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNMLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSywyQkFBMkIsQ0FBQyxTQUFvQjtRQUNwRCxtREFBbUQ7UUFDbkQsSUFBSSxhQUEyQyxDQUFDO1FBQ2hELElBQUksT0FBTyxTQUFTLENBQUMsZUFBZSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hELGFBQWEsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEQsQ0FBQzthQUFNLElBQUksU0FBUyxDQUFDLGVBQWUsSUFBSSxPQUFPLFNBQVMsQ0FBQyxlQUFlLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEYsYUFBYSxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUM7UUFDOUMsQ0FBQztRQUVELG1DQUFtQztRQUNuQyxJQUFJLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN0QixPQUFPO2dCQUNILElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtnQkFDeEIsR0FBRyxFQUFFLGFBQWEsQ0FBQyxJQUFJO2dCQUN2QixJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUk7YUFDM0IsQ0FBQztRQUNOLENBQUM7UUFFRCxzQ0FBc0M7UUFDdEMsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFdkQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMzQyxNQUFNLElBQUksaUNBQXdCLENBQUMsWUFBWSxFQUFFLHNDQUFzQyxDQUFDLENBQUM7UUFDN0YsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFJLFNBQW1GO2FBQ25HLFdBQVcsQ0FBQztRQUNqQixJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUMsQ0FBQyx3Q0FBd0M7UUFDekQsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7UUFFMUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2QsT0FBTyxJQUFJLENBQUMsQ0FBQyxrQ0FBa0M7UUFDbkQsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqRCxNQUFNLElBQUksR0FBSSxXQUEyRCxFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7UUFFekYsaURBQWlEO1FBQ2pELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1FBQzNDLE1BQU0sV0FBVyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDN0UsTUFBTSxZQUFZLEdBQUcsYUFBYSxFQUFFLElBQUksSUFBSSxXQUFXLENBQUM7UUFFeEQsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxhQUFxQjtRQUMxQywyQkFBMkI7UUFDM0IsTUFBTSxNQUFNLEdBQUcsa0NBQWtDLGFBQWEsRUFBRSxDQUFDO1FBQ2pFLElBQUksQ0FBQztZQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMzQyxJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUM5QixPQUFPLE1BQU0sQ0FBQztZQUNsQixDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYiwwRUFBMEU7WUFDMUUsT0FBTyxDQUFDLElBQUksQ0FDUixJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNYLE9BQU8sRUFBRSw0QkFBNEI7Z0JBQ3JDLFNBQVMsRUFBRSxhQUFhO2dCQUN4QixLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNoRSxDQUFDLENBQ0wsQ0FBQztRQUNOLENBQUM7UUFFRCw4Q0FBOEM7UUFDOUMsTUFBTSxlQUFlLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQzlELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV4RCxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQztnQkFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25ELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQ2xELElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQzt3QkFDcEMsT0FBTyxHQUFHLENBQUM7b0JBQ2YsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2IsOERBQThEO2dCQUM5RCxPQUFPLENBQUMsSUFBSSxDQUNSLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ1gsT0FBTyxFQUFFLHNDQUFzQztvQkFDL0MsT0FBTyxFQUFFLEdBQUc7b0JBQ1osS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7aUJBQ2hFLENBQUMsQ0FDTCxDQUFDO1lBQ04sQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLElBQUksaUNBQXdCLENBQUMsYUFBYSxFQUFFLDBDQUEwQyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCLENBQUMsZUFBdUI7UUFDNUMsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxRQUFRLENBQUM7UUFDcEIsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLElBQUEsbUJBQU8sRUFBQyxlQUFlLENBQUMsQ0FBQztRQUU5QyxLQUFLLE1BQU0sS0FBSyxJQUFJLFdBQVcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUEsbUJBQU8sRUFBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFbEQsb0NBQW9DO1lBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLFNBQVM7WUFDYixDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLHlDQUF5QztnQkFDekMsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDO2dCQUM1QixLQUFLLE1BQU0sV0FBVyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO29CQUMvQyxNQUFNLE9BQU8sR0FBRyxJQUFBLG1CQUFPLEVBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUVoRCxvQ0FBb0M7b0JBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7d0JBQ3BDLFNBQVM7b0JBQ2IsQ0FBQztvQkFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFBLGdCQUFJLEVBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDckMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDM0IsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUMzQyxxQkFBcUI7Z0JBQ3JCLElBQUksVUFBVSxDQUFDLElBQUEsZ0JBQUksRUFBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN2QyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM3QixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxrQkFBa0IsQ0FBQyxHQUFXO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxXQUFXLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUVwRSxxQkFBcUI7UUFDckIsSUFBSSxXQUFXLEtBQUssZ0NBQWdDLEVBQUUsQ0FBQztZQUNuRCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNsQyxDQUFDO1FBRUQsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQztZQUNELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLGVBQWUsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUEsbUJBQU8sRUFBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLDBCQUFpQixDQUFDLFdBQVcsRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNyRyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssdUJBQXVCLENBQUMsV0FBbUI7UUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBQSxzQkFBWSxFQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWU7UUFDbkIsTUFBTSxRQUFRLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM3QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBQSxzQkFBWSxFQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNLLHVCQUF1QjtRQUMzQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUVqRCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFDM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQixLQUFLLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDM0QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLHFGQUFxRixDQUFDLENBQUM7UUFDbEcsS0FBSyxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ2xELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO1FBQ2hGLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEIsS0FBSyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBRXhDLEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakQsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0QixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxRQUFRLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQztZQUM1QyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWhCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFO1lBQ3JELFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSztTQUNSLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNLLG9CQUFvQjtRQUN4QixNQUFNLFlBQVksR0FBb0MsRUFBRSxDQUFDO1FBQ3pELE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDO1FBRW5DLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQy9FLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDeEIsU0FBUztZQUNiLENBQUM7WUFFRCxNQUFNLFNBQVMsR0FBRyxJQUlqQixDQUFDO1lBRUYsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3JCLFNBQVM7WUFDYixDQUFDO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLFNBQVM7WUFDYixDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDNUMsU0FBUztZQUNiLENBQUM7WUFFRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0MsTUFBTSxRQUFRLEdBQUcsU0FBUztpQkFDckIsT0FBTyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUM7aUJBQzFCLFdBQVcsRUFBRTtpQkFDYixPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sS0FBSyxHQUFHLEdBQUcsTUFBTSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxJQUFJLFNBQVMsQ0FBQztZQUVsRCxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUFDLFNBQXdELEVBQUUsU0FBaUI7UUFDM0YsSUFBSSxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDNUIsT0FBTyxTQUFTLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsSUFBSSxXQUFXLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztRQUNqQyxPQUFPLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM1QixPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUN6QyxNQUFNO1lBQ1YsQ0FBQztZQUNELFdBQVcsR0FBSSxRQUE4QixDQUFDLElBQUksQ0FBQztRQUN2RCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQzs7QUFsY0wsNENBbWNDOzs7QUFqY2tCLDhCQUFhLEdBQUcsS0FBSyxDQUFDO0FBbWN6Qzs7Ozs7R0FLRztBQUNILE1BQU0sbUJBQW9CLFNBQVEsTUFBTSxDQUFDLFFBQVE7SUFDN0M7Ozs7O09BS0c7SUFDSCxZQUFZLE9BQWdCLEVBQUUsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsVUFBNkIsRUFBRTtRQUM1RixLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsQyx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IEFzc2VtYmx5IH0gZnJvbSBcIkBqc2lpL3NwZWNcIjtcbmltcG9ydCB7IFByb2plblN0cnVjdCwgU3RydWN0IH0gZnJvbSBcIkBtcmdyYWluL2pzaWktc3RydWN0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgU291cmNlQ29kZU9wdGlvbnMsIHR5cGVzY3JpcHQgfSBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgKiBhcyBwcm9qZW4gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnRSZXNvbHV0aW9uRXJyb3IsXG4gICAgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yLFxuICAgIEludmFsaWRGaWxlUGF0aEVycm9yLFxuICAgIEludmFsaWRJbmRlbnRMZXZlbEVycm9yLFxuICAgIE1hbmlmZXN0TG9hZEVycm9yLFxufSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdFR5cGUgfSBmcm9tIFwiLi9wcm9qZWN0LXR5cGVcIjtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbXBvbmVudHMgYXBwbGllZCB0byBhbGwgZ2VuZXJhdGVkIHByb2plY3RzXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRDb21wb25lbnRzKCk6IENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgICB7IGNvbXBvbmVudENsYXNzOiByZXF1aXJlKFwiLi9jb21wb25lbnRzL21pc2VcIikuTWlzZSB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBjb21wb25lbnRDbGFzczogcmVxdWlyZShcIi4vY29tcG9uZW50cy92aXRlc3RcIikuVml0ZXN0LFxuICAgICAgICAgICAgb3B0aW9uc1Byb3BlcnR5OiB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJ2aXRlc3RPcHRpb25zXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJAbmlrb3ZpcnRhbGEvcHJvamVuLWNvbnN0cnVjdHMuVml0ZXN0T3B0aW9uc1wiLFxuICAgICAgICAgICAgICAgIGRvY3M6IFwiVml0ZXN0IGNvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgXTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIGNvbXBvbmVudCB0byBiZSBpbnRlZ3JhdGVkIGludG8gYSBnZW5lcmF0ZWQgcHJvamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50IGNsYXNzIHJlZmVyZW5jZVxuICAgICAqXG4gICAgICogQGpzaWkgaWdub3JlXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tcG9uZW50Q2xhc3M6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjb21wb25lbnQgY2xhc3NcbiAgICAgKlxuICAgICAqIE9wdGlvbmFsIC0gYXV0by1kZXRlY3RlZCBieSBzZWFyY2hpbmcgSlNJSSBtYW5pZmVzdHMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZnFuPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9ucyBwcm9wZXJ0eSBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBPcHRpb25hbCAtIGF1dG8tZGV0ZWN0ZWQgZnJvbSBjb21wb25lbnQgY29uc3RydWN0b3IuXG4gICAgICogU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgb3B0aW9ucyBwcm9wZXJ0eSBnZW5lcmF0aW9uLlxuICAgICAqIFNldCB0byBzdHJpbmcgb3Igb2JqZWN0IHRvIGN1c3RvbWl6ZSB0aGUgcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBvcHRpb25zUHJvcGVydHk/OiBzdHJpbmcgfCBDb21wb25lbnRPcHRpb25zIHwgZmFsc2U7XG59XG5cbi8qKlxuICogT3B0aW9ucyBwcm9wZXJ0eSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgb3B0aW9ucyBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lIChvcHRpb25hbCwgYXV0by1kZXRlY3RlZCBmcm9tIGNvbXBvbmVudCBjb25zdHJ1Y3RvcilcbiAgICAgKi9cbiAgICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gc3VtbWFyeSAob3B0aW9uYWwsIGF1dG8tZGV0ZWN0ZWQgZnJvbSBjb21wb25lbnQgY29uc3RydWN0b3IpXG4gICAgICovXG4gICAgcmVhZG9ubHkgZG9jcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBQcm9qZWN0R2VuZXJhdG9yIGNvbXBvbmVudFxuICpcbiAqIENvbmZpZ3VyZXMgdGhlIGdlbmVyYXRpb24gb2YgYSBUeXBlU2NyaXB0IHByb2plY3QgY2xhc3MgdGhhdCBleHRlbmRzIGEgUHJvamVuIGJhc2UgY2xhc3NcbiAqIHdpdGggc3RhbmRhcmQgY29uZmlndXJhdGlvbiBhbmQgY29tcG9uZW50IGludGVncmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RHZW5lcmF0b3JPcHRpb25zIGV4dGVuZHMgU291cmNlQ29kZU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGdlbmVyYXRlZCBjbGFzcyAoZS5nLiwgXCJUeXBlU2NyaXB0UHJvamVjdFwiKVxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbnMgaW50ZXJmYWNlIHdpbGwgYmUgbmFtZWQgYCR7bmFtZX1PcHRpb25zYC5cbiAgICAgKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBQcm9qZWN0IHR5cGUgaWRlbnRpZmllclxuICAgICAqXG4gICAgICogU3BlY2lmaWVzIHdoaWNoIFByb2plbiBiYXNlIGNsYXNzIHRvIGV4dGVuZCBhbmQgd2hpY2ggZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIGFwcGx5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgUHJvamVjdFR5cGUuVFlQRVNDUklQVFxuICAgICAqIEBleGFtcGxlIFByb2plY3RUeXBlLkpTSUlcbiAgICAgKi9cbiAgICByZWFkb25seSBwcm9qZWN0VHlwZTogUHJvamVjdFR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBPdXRwdXQgZmlsZSBwYXRoIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzXG4gICAgICpcbiAgICAgKiBNdXN0IGNvbnRhaW4gYSBkaXJlY3Rvcnkgc2VwYXJhdG9yLiBUaGUgb3B0aW9ucyBpbnRlcmZhY2Ugd2lsbCBiZSBnZW5lcmF0ZWRcbiAgICAgKiBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd2l0aCBhIFwiLmdlbmVyYXRlZC50c1wiIHN1ZmZpeC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIFwic3JjL3Byb2plY3RzL3R5cGVzY3JpcHQuZ2VuZXJhdGVkLnRzXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50cyB0byBpbnRlZ3JhdGUgaW50byB0aGUgcHJvamVjdFxuICAgICAqXG4gICAgICogRWFjaCBjb21wb25lbnQgd2lsbCBiZSBpbnN0YW50aWF0ZWQgZHVyaW5nIHByb2plY3QgY29uc3RydWN0aW9uIGFuZCBjYW4gYmVcbiAgICAgKiBjb25maWd1cmVkIHZpYSBhbiBvcHRpb25hbCBvcHRpb25zIHByb3BlcnR5IGluIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgW3sgY29tcG9uZW50OiBNaXNlIH0sIHsgY29tcG9uZW50OiBWaXRlc3QsIG9wdGlvbnNQcm9wZXJ0eTogeyBuYW1lOiBcInZpdGVzdE9wdGlvbnNcIiwgdHlwZTogXCIuLi5cIiwgZG9jczogXCIuLi5cIiB9IH1dXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tcG9uZW50cz86IENvbXBvbmVudFtdO1xuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyB0byBleHRlbmQgdGhlIGJhc2Ugb3B0aW9ucyB3aXRoIGN1c3RvbSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvXG4gICAgICogeW91ciBwcm9qZWN0IHR5cGUuXG4gICAgICpcbiAgICAgKiBAanNpaSBpZ25vcmVcbiAgICAgKi9cbiAgICByZWFkb25seSBhZGRpdGlvbmFsT3B0aW9ucz86IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogUHJvcGVydHkgbmFtZXMgdG8gb21pdCBmcm9tIHRoZSBiYXNlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyB0byBoaWRlIGJhc2UgY2xhc3Mgb3B0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgY29uZmlndXJhYmxlXG4gICAgICogaW4gdGhlIGdlbmVyYXRlZCBwcm9qZWN0IHR5cGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgb21pdE9wdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBCdWZmZXIgZm9yIGJ1aWxkaW5nIGluZGVudGVkIGNvZGUgd2l0aCBhdXRvbWF0aWMgbGluZSBtYW5hZ2VtZW50XG4gKlxuICogTWFpbnRhaW5zIGluZGVudGF0aW9uIGxldmVsIGFuZCBwcm92aWRlcyBtZXRob2RzIGZvciBhZGRpbmcgbGluZXMsXG4gKiBvcGVuaW5nL2Nsb3NpbmcgYmxvY2tzLCBhbmQgZmx1c2hpbmcgYWNjdW11bGF0ZWQgY29udGVudC5cbiAqL1xuY2xhc3MgQ29kZUJ1ZmZlciB7XG4gICAgcHJpdmF0ZSBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIGluZGVudExldmVsID0gMDtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpbmRlbnQgLSBTdHJpbmcgdG8gdXNlIGZvciBlYWNoIGluZGVudGF0aW9uIGxldmVsIChkZWZhdWx0OiBzaW5nbGUgc3BhY2UpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBpbmRlbnQgPSBcIiBcIikge31cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGFjY3VtdWxhdGVkIGxpbmVzIGFuZCByZXNldHMgdGhlIGJ1ZmZlclxuICAgICAqXG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY29kZSBsaW5lcyB3aXRoIHByb3BlciBpbmRlbnRhdGlvblxuICAgICAqL1xuICAgIGZsdXNoKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMubGluZXM7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpbmUgb2YgY29kZSBhdCB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvZGUgLSBDb2RlIHRvIGFkZCAob3B0aW9uYWwsIGFkZHMgYmxhbmsgbGluZSBpZiBvbWl0dGVkKVxuICAgICAqL1xuICAgIGxpbmUoY29kZT86IHN0cmluZykge1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLmluZGVudC5yZXBlYXQodGhpcy5pbmRlbnRMZXZlbCk7XG4gICAgICAgIHRoaXMubGluZXMucHVzaCgocHJlZml4ICsgKGNvZGUgPz8gXCJcIikpLnRyaW1FbmQoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSBuZXcgaW5kZW50YXRpb24gYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gT3B0aW9uYWwgY29kZSB0byBhZGQgYmVmb3JlIGluY3JlYXNpbmcgaW5kZW50IChlLmcuLCBvcGVuaW5nIGJyYWNlKVxuICAgICAqL1xuICAgIG9wZW4oY29kZT86IHN0cmluZykge1xuICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgdGhpcy5saW5lKGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwrKztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gT3B0aW9uYWwgY29kZSB0byBhZGQgYWZ0ZXIgZGVjcmVhc2luZyBpbmRlbnQgKGUuZy4sIGNsb3NpbmcgYnJhY2UpXG4gICAgICogQHRocm93cyB7SW52YWxpZEluZGVudExldmVsRXJyb3J9IFdoZW4gYXR0ZW1wdGluZyB0byBkZWNyZWFzZSBpbmRlbnQgYmVsb3cgemVyb1xuICAgICAqL1xuICAgIGNsb3NlKGNvZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZW50TGV2ZWwgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSW5kZW50TGV2ZWxFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwtLTtcbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMubGluZShjb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGluaXRpYWwgc3RhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxpbmVzID0gW107XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwgPSAwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIFR5cGVTY3JpcHQgY2xhc3MgY29kZSBmcm9tIFByb2plY3RHZW5lcmF0b3Igb3B0aW9uc1xuICpcbiAqIEdlbmVyYXRlcyBhIGNvbXBsZXRlIFR5cGVTY3JpcHQgY2xhc3MgZmlsZSBpbmNsdWRpbmcgaW1wb3J0cywgb3B0aW9ucyBpbnRlcmZhY2UgZXhwb3J0LFxuICogY2xhc3MgZGVjbGFyYXRpb24sIGFuZCBjb25zdHJ1Y3RvciB3aXRoIGNvbXBvbmVudCBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBVc2VzIEpTSUkgbWFuaWZlc3QgaW50cm9zcGVjdGlvbiB0byB2YWxpZGF0ZSBiYXNlIGNsYXNzZXMgYW5kIG9wdGlvbnMgaW50ZXJmYWNlcy5cbiAqL1xuY2xhc3MgVHlwZVNjcmlwdENsYXNzUmVuZGVyZXIge1xuICAgIHByaXZhdGUgYnVmZmVyOiBDb2RlQnVmZmVyO1xuICAgIHB1YmxpYyBqc2lpTWFuaWZlc3Q6IEFzc2VtYmx5O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGluZGVudCAtIE51bWJlciBvZiBzcGFjZXMgcGVyIGluZGVudGF0aW9uIGxldmVsIChkZWZhdWx0OiA0KVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGluZGVudCA9IDQpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgQ29kZUJ1ZmZlcihcIiBcIi5yZXBlYXQoaW5kZW50KSk7XG4gICAgICAgIC8qIExvYWQgUHJvamVuJ3MgSlNJSSBtYW5pZmVzdCBmb3IgYmFzZSBjbGFzcyBpbnRyb3NwZWN0aW9uICovXG4gICAgICAgIGNvbnN0IHByb2plblBhY2thZ2VKc29uID0gcmVxdWlyZS5yZXNvbHZlKFwicHJvamVuL3BhY2thZ2UuanNvblwiKTtcbiAgICAgICAgY29uc3QgcHJvamVuUm9vdCA9IGRpcm5hbWUocHJvamVuUGFja2FnZUpzb24pO1xuICAgICAgICBjb25zdCBqc2lpUGF0aCA9IGpvaW4ocHJvamVuUm9vdCwgXCIuanNpaVwiKTtcbiAgICAgICAgdGhpcy5qc2lpTWFuaWZlc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhqc2lpUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBjb21wbGV0ZSBUeXBlU2NyaXB0IGNsYXNzIGNvZGUgZnJvbSBvcHRpb25zXG4gICAgICpcbiAgICAgKiBPcmNoZXN0cmF0ZXMgdGhlIHJlbmRlcmluZyBwcm9jZXNzOiBkZXJpdmVzIG5hbWVzLCBleHRyYWN0cyBjb21wb25lbnQgY29uZmlndXJhdGlvbixcbiAgICAgKiBidWlsZHMgaW1wb3J0IHN0YXRlbWVudHMsIGFuZCByZW5kZXJzIHRoZSBjbGFzcyBzdHJ1Y3R1cmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHJldHVybnMgQ29tcGxldGUgVHlwZVNjcmlwdCBjbGFzcyBjb2RlIGFzIGEgc3RyaW5nXG4gICAgICovXG4gICAgcmVuZGVyKG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgdGhpcy5idWZmZXIuZmx1c2goKTtcblxuICAgICAgICAvKiBEZXJpdmUgaW50ZXJmYWNlIGFuZCB0eXBlIG5hbWVzIGZyb20gdGhlIGNsYXNzIG5hbWUgKi9cbiAgICAgICAgY29uc3Qgb3B0aW9uc0ludGVyZmFjZSA9IGAke29wdGlvbnMubmFtZX1PcHRpb25zYDtcbiAgICAgICAgY29uc3QgYmFzZU9wdGlvbnNGcW4gPSB0aGlzLmdldEJhc2VPcHRpb25zRnFuKG9wdGlvbnMucHJvamVjdFR5cGUpO1xuICAgICAgICBjb25zdCBiYXNlT3B0aW9uc1R5cGUgPSBiYXNlT3B0aW9uc0Zxbi5yZXBsYWNlKC9ecHJvamVuXFwuLywgXCJcIik7XG5cbiAgICAgICAgLyogVXNlIHByb3ZpZGVkIGNvbXBvbmVudHMgb3IgZmFsbCBiYWNrIHRvIGRlZmF1bHRzIChNaXNlICsgVml0ZXN0KSAqL1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gb3B0aW9ucy5jb21wb25lbnRzID8/IGdldERlZmF1bHRDb21wb25lbnRzKCk7XG5cbiAgICAgICAgLyogRXh0cmFjdCBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmb3IgY29uc3RydWN0b3IgZ2VuZXJhdGlvbiAqL1xuICAgICAgICBjb25zdCB7IGRlc3RydWN0dXJlLCBjb21wb25lbnRBcnJheSB9ID0gdGhpcy5leHRyYWN0Q29tcG9uZW50T3B0aW9ucyhjb21wb25lbnRzKTtcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IHRoaXMuZXh0cmFjdEltcG9ydHMob3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZSk7XG5cbiAgICAgICAgLyogUmVuZGVyIGFsbCBzZWN0aW9ucyBvZiB0aGUgY2xhc3MgZmlsZSAqL1xuICAgICAgICB0aGlzLnJlbmRlckltcG9ydHMoaW1wb3J0cyk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJFeHBvcnQob3B0aW9uc0ludGVyZmFjZSk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJDbGFzcyhvcHRpb25zLCBvcHRpb25zSW50ZXJmYWNlLCBiYXNlT3B0aW9uc1R5cGUsIGRlc3RydWN0dXJlLCBjb21wb25lbnRBcnJheSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmZsdXNoKCkuam9pbihcIlxcblwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXJpdmVzIHRoZSBmdWxseSBxdWFsaWZpZWQgb3B0aW9ucyBpbnRlcmZhY2UgbmFtZSBmcm9tIHByb2plY3QgdHlwZVxuICAgICAqXG4gICAgICogVHJhbnNmb3JtcyBwcm9qZWN0IHR5cGUgaW50byB0aGUgY29ycmVzcG9uZGluZyBQcm9qZW4gb3B0aW9ucyBpbnRlcmZhY2UgbmFtZVxuICAgICAqIGJ5IGFwcGVuZGluZyBcIk9wdGlvbnNcIiBzdWZmaXggYW5kIHByZWZpeGluZyB3aXRoIFwicHJvamVuLlwiIG5hbWVzcGFjZS5cbiAgICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgYmFzZSBjbGFzcyBleGlzdHMgaW4gUHJvamVuJ3MgSlNJSSBtYW5pZmVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0VHlwZSAtIFByb2plY3QgdHlwZSBpZGVudGlmaWVyXG4gICAgICogQHJldHVybnMgRnVsbHkgcXVhbGlmaWVkIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWVcbiAgICAgKiBAdGhyb3dzIHtJbnZhbGlkQmFzZUNsYXNzRm9ybWF0RXJyb3J9IFdoZW4gcHJvamVjdFR5cGUgZm9ybWF0IGlzIGludmFsaWQgb3IgY2xhc3Mgbm90IGZvdW5kXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGdldEJhc2VPcHRpb25zRnFuKFByb2plY3RUeXBlLlRZUEVTQ1JJUFQpIC8vIFwicHJvamVuLnR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RPcHRpb25zXCJcbiAgICAgKiBnZXRCYXNlT3B0aW9uc0ZxbihQcm9qZWN0VHlwZS5KU0lJKSAvLyBcInByb2plbi5jZGsuSnNpaVByb2plY3RPcHRpb25zXCJcbiAgICAgKi9cbiAgICBnZXRCYXNlT3B0aW9uc0Zxbihwcm9qZWN0VHlwZTogUHJvamVjdFR5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBiYXNlQ2xhc3MgPSBwcm9qZWN0VHlwZS52YWx1ZU9mKCk7XG4gICAgICAgIC8qIFZhbGlkYXRlIGJhc2UgY2xhc3MgZm9ybWF0OiBtdXN0IGNvbnRhaW4gbW9kdWxlLkNsYXNzTmFtZSBzdHJ1Y3R1cmUgKi9cbiAgICAgICAgaWYgKCFiYXNlQ2xhc3MuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yKGJhc2VDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNlQ2xhc3NGcW4gPSBgcHJvamVuLiR7YmFzZUNsYXNzfWA7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNGcW4gPSBgJHtiYXNlQ2xhc3NGcW59T3B0aW9uc2A7XG5cbiAgICAgICAgLyogVmFsaWRhdGUgYmFzZSBjbGFzcyBleGlzdHMgaW4gSlNJSSBtYW5pZmVzdCAqL1xuICAgICAgICBpZiAoIXRoaXMuanNpaU1hbmlmZXN0LnR5cGVzPy5bYmFzZUNsYXNzRnFuXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRCYXNlQ2xhc3NGb3JtYXRFcnJvcihgQmFzZSBjbGFzcyBub3QgZm91bmQgaW4gSlNJSSBtYW5pZmVzdDogJHtiYXNlQ2xhc3NGcW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBWYWxpZGF0ZSBvcHRpb25zIGludGVyZmFjZSBleGlzdHMgaW4gSlNJSSBtYW5pZmVzdCAqL1xuICAgICAgICBpZiAoIXRoaXMuanNpaU1hbmlmZXN0LnR5cGVzPy5bb3B0aW9uc0Zxbl0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQmFzZUNsYXNzRm9ybWF0RXJyb3IoYE9wdGlvbnMgaW50ZXJmYWNlIG5vdCBmb3VuZCBpbiBKU0lJIG1hbmlmZXN0OiAke29wdGlvbnNGcW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9uc0ZxbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmb3IgY29uc3RydWN0b3IgY29kZSBnZW5lcmF0aW9uXG4gICAgICpcbiAgICAgKiBUcmFuc2Zvcm1zIGNvbXBvbmVudCBjb25maWd1cmF0aW9ucyBpbnRvOlxuICAgICAqIDEuIERlc3RydWN0dXJlIGxpc3Q6IHZhcmlhYmxlIG5hbWVzIHRvIGV4dHJhY3QgZnJvbSBvcHRpb25zXG4gICAgICogMi4gQ29tcG9uZW50IGFycmF5OiBjb2RlIHN0cmluZyBmb3IgYXBwbHlEZWZhdWx0cygpIGNhbGxcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb21wb25lbnRzIC0gQ29tcG9uZW50IGNvbmZpZ3VyYXRpb25zXG4gICAgICogQHJldHVybnMgT2JqZWN0IHdpdGggZGVzdHJ1Y3R1cmUgYXJyYXkgYW5kIGNvbXBvbmVudEFycmF5IGNvZGUgc3RyaW5nXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIElucHV0OiBbeyBjb21wb25lbnQ6IFZpdGVzdCwgb3B0aW9uc1Byb3BlcnR5OiB7IG5hbWU6IFwidml0ZXN0T3B0aW9uc1wiLCAuLi4gfSB9XVxuICAgICAqIE91dHB1dDoge1xuICAgICAqICAgZGVzdHJ1Y3R1cmU6IFtcInZpdGVzdFwiLCBcInZpdGVzdE9wdGlvbnNcIl0sXG4gICAgICogICBjb21wb25lbnRBcnJheTogXCJbeyBjb21wb25lbnQ6IFZpdGVzdCwgZW5hYmxlZDogdml0ZXN0LCBvcHRpb25zOiB2aXRlc3RPcHRpb25zIH1dXCJcbiAgICAgKiB9XG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0Q29tcG9uZW50T3B0aW9ucyhjb21wb25lbnRzOiBDb21wb25lbnRbXSk6IHsgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdOyBjb21wb25lbnRBcnJheTogc3RyaW5nIH0ge1xuICAgICAgICBjb25zdCBkZXN0cnVjdHVyZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIC8qIENvbnZlcnQgY29tcG9uZW50IGNsYXNzIG5hbWUgdG8gY2FtZWxDYXNlIHZhcmlhYmxlIG5hbWUgKGUuZy4sIFZpdGVzdCAtPiB2aXRlc3QpICovXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gYy5jb21wb25lbnRDbGFzcy5uYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgYy5jb21wb25lbnRDbGFzcy5uYW1lLnNsaWNlKDEpO1xuICAgICAgICAgICAgZGVzdHJ1Y3R1cmUucHVzaChuYW1lKTtcblxuICAgICAgICAgICAgLyogQnVpbGQgY29tcG9uZW50IGNvbmZpZyBvYmplY3QgZm9yIGFwcGx5RGVmYXVsdHMoKSBjYWxsICovXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFtgY29tcG9uZW50OiAke2MuY29tcG9uZW50Q2xhc3MubmFtZX1gXTtcbiAgICAgICAgICAgIGlmIChjLm9wdGlvbnNQcm9wZXJ0eSAmJiB0eXBlb2YgYy5vcHRpb25zUHJvcGVydHkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgICAgLyogQ29tcG9uZW50IGhhcyBjb25maWd1cmFibGUgb3B0aW9ucyAtIGluY2x1ZGUgYm90aCBlbmFibGVkIGZsYWcgYW5kIG9wdGlvbnMgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVvZiBjLm9wdGlvbnNQcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIiA/IGMub3B0aW9uc1Byb3BlcnR5IDogYy5vcHRpb25zUHJvcGVydHkubmFtZTtcbiAgICAgICAgICAgICAgICBkZXN0cnVjdHVyZS5wdXNoKHByb3BOYW1lKTtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbmFibGVkOiAke25hbWV9YCwgYG9wdGlvbnM6ICR7cHJvcE5hbWV9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8qIENvbXBvbmVudCBoYXMgbm8gb3B0aW9ucyAtIG9ubHkgaW5jbHVkZSBlbmFibGVkIGZsYWcgKi9cbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbmFibGVkOiAke25hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnRQYXJ0cy5wdXNoKGB7ICR7cGFydHMuam9pbihcIiwgXCIpfSB9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBkZXN0cnVjdHVyZSwgY29tcG9uZW50QXJyYXk6IGBbJHtjb21wb25lbnRQYXJ0cy5qb2luKFwiLCBcIil9XWAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgaW1wb3J0IHN0YXRlbWVudHMgbWFwIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzXG4gICAgICpcbiAgICAgKiBDb2xsZWN0cyBhbGwgcmVxdWlyZWQgaW1wb3J0czpcbiAgICAgKiAtIFByb2plbiBiYXNlIG1vZHVsZSAodHlwZXNjcmlwdCwgY2RrLCBhd3NjZGspXG4gICAgICogLSBDb25maWcgdXRpbGl0aWVzIChhcHBseURlZmF1bHRzLCBkZWZhdWx0T3B0aW9ucylcbiAgICAgKiAtIENvbXBvbmVudCBjbGFzc2VzXG4gICAgICogLSBVdGlsaXR5IGZ1bmN0aW9ucyAoZGVlcE1lcmdlKVxuICAgICAqIC0gR2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlICh0eXBlLW9ubHkgaW1wb3J0KVxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gTmFtZSBvZiB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHJldHVybnMgTWFwIG9mIG1vZHVsZSBwYXRocyB0byBzZXRzIG9mIGltcG9ydGVkIG5hbWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0SW1wb3J0cyhvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nKTogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+IHtcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICAgICAgICAvKiBFeHRyYWN0IGJhc2UgbW9kdWxlIG5hbWUgZnJvbSBwcm9qZWN0VHlwZSAoZS5nLiwgXCJ0eXBlc2NyaXB0XCIgZnJvbSBcInR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RcIikgKi9cbiAgICAgICAgY29uc3QgYmFzZU1vZHVsZSA9IG9wdGlvbnMucHJvamVjdFR5cGUudmFsdWVPZigpLnNwbGl0KFwiLlwiKVswXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVOYW1lID0gdGhpcy5nZXRPcHRpb25zRmlsZU5hbWUob3B0aW9uc0ludGVyZmFjZSk7XG5cbiAgICAgICAgLyogUHJvamVuIGJhc2UgbW9kdWxlIGltcG9ydCAqL1xuICAgICAgICBpbXBvcnRzLnNldChcInByb2plblwiLCBuZXcgU2V0KFtiYXNlTW9kdWxlXSkpO1xuXG4gICAgICAgIC8qIENvbmZpZ3VyYXRpb24gdXRpbGl0aWVzIGltcG9ydCAqL1xuICAgICAgICBpbXBvcnRzLnNldChcIi4uL2NvbmZpZ1wiLCBuZXcgU2V0KFtcImFwcGx5RGVmYXVsdHNcIiwgXCJkZWZhdWx0T3B0aW9uc1wiXSkpO1xuXG4gICAgICAgIC8qIENvbXBvbmVudCBjbGFzcyBpbXBvcnRzIC0gZGVyaXZlIG1vZHVsZSBwYXRoIGZyb20gY29tcG9uZW50IGNsYXNzIG5hbWUgKi9cbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IG9wdGlvbnMuY29tcG9uZW50cyA/PyBnZXREZWZhdWx0Q29tcG9uZW50cygpO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGMuY29tcG9uZW50Q2xhc3MubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSBgLi4vY29tcG9uZW50cy8ke2NvbXBvbmVudE5hbWUudG9Mb3dlckNhc2UoKX1gO1xuICAgICAgICAgICAgaWYgKCFpbXBvcnRzLmhhcyhtb2R1bGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIGltcG9ydHMuc2V0KG1vZHVsZVBhdGgsIG5ldyBTZXQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtb2R1bGVJbXBvcnRzID0gaW1wb3J0cy5nZXQobW9kdWxlUGF0aCk7XG4gICAgICAgICAgICBpZiAobW9kdWxlSW1wb3J0cykge1xuICAgICAgICAgICAgICAgIG1vZHVsZUltcG9ydHMuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyogVXRpbGl0eSBmdW5jdGlvbnMgaW1wb3J0ICovXG4gICAgICAgIGltcG9ydHMuc2V0KFwiLi4vdXRpbHNcIiwgbmV3IFNldChbXCJkZWVwTWVyZ2VcIl0pKTtcblxuICAgICAgICAvKiBHZW5lcmF0ZWQgb3B0aW9ucyBpbnRlcmZhY2UgaW1wb3J0ICh0eXBlLW9ubHkgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzKSAqL1xuICAgICAgICBpbXBvcnRzLnNldChgLi8ke29wdGlvbnNGaWxlTmFtZX0uZ2VuZXJhdGVkYCwgbmV3IFNldChbb3B0aW9uc0ludGVyZmFjZV0pKTtcblxuICAgICAgICByZXR1cm4gaW1wb3J0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXJpdmVzIHRoZSBjb25maWcgcGF0aCBmb3IgYWNjZXNzaW5nIGRlZmF1bHQgb3B0aW9uc1xuICAgICAqXG4gICAgICogVHJhbnNmb3JtcyBwcm9qZWN0IHR5cGUgaW50byB0aGUgY29ycmVzcG9uZGluZyBwYXRoIGluIHRoZSBkZWZhdWx0T3B0aW9uc1xuICAgICAqIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGV4cG9ydGVkIGZyb20gY29uZmlnLnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2plY3RUeXBlIC0gUHJvamVjdCB0eXBlIGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJucyBDb25maWcgcGF0aCBmb3IgYWNjZXNzaW5nIGRlZmF1bHQgb3B0aW9uc1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBnZXRDb25maWdQYXRoKFByb2plY3RUeXBlLlRZUEVTQ1JJUFQpIC8vIFwiZGVmYXVsdE9wdGlvbnMudHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFwiXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRDb25maWdQYXRoKHByb2plY3RUeXBlOiBQcm9qZWN0VHlwZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZGVmYXVsdE9wdGlvbnMuJHtwcm9qZWN0VHlwZS52YWx1ZU9mKCl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGltcG9ydCBzdGF0ZW1lbnRzIGluIHNvcnRlZCBvcmRlclxuICAgICAqXG4gICAgICogU29ydHMgaW1wb3J0cyB3aXRoIGV4dGVybmFsIHBhY2thZ2VzIGZpcnN0LCB0aGVuIHJlbGF0aXZlIGltcG9ydHMuXG4gICAgICogVXNlcyB0eXBlLW9ubHkgaW1wb3J0cyBmb3IgZ2VuZXJhdGVkIGZpbGVzIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbXBvcnRzIC0gTWFwIG9mIG1vZHVsZSBwYXRocyB0byBpbXBvcnRlZCBuYW1lc1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVuZGVySW1wb3J0cyhpbXBvcnRzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4pIHtcbiAgICAgICAgLyogU29ydCBtb2R1bGVzOiBleHRlcm5hbCBwYWNrYWdlcyBmaXJzdCwgdGhlbiByZWxhdGl2ZSBpbXBvcnRzIGFscGhhYmV0aWNhbGx5ICovXG4gICAgICAgIGNvbnN0IHNvcnRlZE1vZHVsZXMgPSBBcnJheS5mcm9tKGltcG9ydHMua2V5cygpKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhSXNSZWxhdGl2ZSA9IGEuc3RhcnRzV2l0aChcIi5cIik7XG4gICAgICAgICAgICBjb25zdCBiSXNSZWxhdGl2ZSA9IGIuc3RhcnRzV2l0aChcIi5cIik7XG4gICAgICAgICAgICBpZiAoYUlzUmVsYXRpdmUgIT09IGJJc1JlbGF0aXZlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFJc1JlbGF0aXZlID8gMSA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBtb2Qgb2Ygc29ydGVkTW9kdWxlcykge1xuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBBcnJheS5mcm9tKGltcG9ydHMuZ2V0KG1vZCkgfHwgW10pLnNvcnQoKTtcbiAgICAgICAgICAgIC8qIFVzZSB0eXBlLW9ubHkgaW1wb3J0IGZvciBnZW5lcmF0ZWQgZmlsZXMgdG8gcHJldmVudCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgKi9cbiAgICAgICAgICAgIGNvbnN0IGlzVHlwZU9ubHkgPSBtb2QuaW5jbHVkZXMoXCIuZ2VuZXJhdGVkXCIpO1xuICAgICAgICAgICAgY29uc3QgaW1wb3J0U3RtdCA9IGlzVHlwZU9ubHkgPyBcImltcG9ydCB0eXBlXCIgOiBcImltcG9ydFwiO1xuICAgICAgICAgICAgdGhpcy5idWZmZXIubGluZShgJHtpbXBvcnRTdG10fSB7ICR7bmFtZXMuam9pbihcIiwgXCIpfSB9IGZyb20gXCIke21vZH1cIjtgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgcmUtZXhwb3J0IHN0YXRlbWVudCBmb3IgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBvcHRpb25zIGludGVyZmFjZSB0byBleHBvcnRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckV4cG9ydChvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVOYW1lID0gdGhpcy5nZXRPcHRpb25zRmlsZU5hbWUob3B0aW9uc0ludGVyZmFjZSk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYGV4cG9ydCB7ICR7b3B0aW9uc0ludGVyZmFjZX0gfSBmcm9tIFwiLi8ke29wdGlvbnNGaWxlTmFtZX0uZ2VuZXJhdGVkXCI7YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgY2xhc3MgZGVjbGFyYXRpb24gYW5kIGNvbnN0cnVjdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqIEBwYXJhbSBiYXNlT3B0aW9uc1R5cGUgLSBCYXNlIG9wdGlvbnMgdHlwZSB3aXRob3V0IFwicHJvamVuLlwiIHByZWZpeFxuICAgICAqIEBwYXJhbSBkZXN0cnVjdHVyZSAtIFZhcmlhYmxlIG5hbWVzIHRvIGRlc3RydWN0dXJlIGZyb20gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBjb21wb25lbnRBcnJheSAtIENvZGUgc3RyaW5nIGZvciBjb21wb25lbnQgYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckNsYXNzKFxuICAgICAgICBvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgICAgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nLFxuICAgICAgICBiYXNlT3B0aW9uc1R5cGU6IHN0cmluZyxcbiAgICAgICAgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdLFxuICAgICAgICBjb21wb25lbnRBcnJheTogc3RyaW5nLFxuICAgICkge1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyoqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGAgKiAke29wdGlvbnMubmFtZX0gd2l0aCBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGFuZCBjb21wb25lbnQgaW50ZWdyYXRpb25gKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIiAqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICogRXh0ZW5kcyBQcm9qZW4ncyBiYXNlIGNsYXNzIHdpdGggb3BpbmlvbmF0ZWQgZGVmYXVsdHMgYW5kIGF1dG9tYXRpYyBjb21wb25lbnQgc2V0dXAuXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICovXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5vcGVuKGBleHBvcnQgY2xhc3MgJHtvcHRpb25zLm5hbWV9IGV4dGVuZHMgJHtvcHRpb25zLnByb2plY3RUeXBlLnZhbHVlT2YoKX0ge2ApO1xuICAgICAgICB0aGlzLnJlbmRlckNvbnN0cnVjdG9yKG9wdGlvbnMsIG9wdGlvbnNJbnRlcmZhY2UsIGJhc2VPcHRpb25zVHlwZSwgZGVzdHJ1Y3R1cmUsIGNvbXBvbmVudEFycmF5KTtcbiAgICAgICAgdGhpcy5idWZmZXIuY2xvc2UoXCJ9XCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgdGhlIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RydWN0b3I6XG4gICAgICogMS4gRGVzdHJ1Y3R1cmVzIGNvbXBvbmVudCBmbGFncyBhbmQgb3B0aW9ucyBmcm9tIHRoZSBvcHRpb25zIHBhcmFtZXRlclxuICAgICAqIDIuIE1lcmdlcyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCB1c2VyLXByb3ZpZGVkIG9wdGlvbnNcbiAgICAgKiAzLiBDYWxscyBzdXBlcigpIHdpdGggbWVyZ2VkIG9wdGlvbnNcbiAgICAgKiA0LiBBcHBsaWVzIGNvbXBvbmVudCBkZWZhdWx0cyB2aWEgYXBwbHlEZWZhdWx0cygpXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqIEBwYXJhbSBiYXNlT3B0aW9uc1R5cGUgLSBCYXNlIG9wdGlvbnMgdHlwZSB3aXRob3V0IFwicHJvamVuLlwiIHByZWZpeFxuICAgICAqIEBwYXJhbSBkZXN0cnVjdHVyZSAtIFZhcmlhYmxlIG5hbWVzIHRvIGRlc3RydWN0dXJlIGZyb20gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBjb21wb25lbnRBcnJheSAtIENvZGUgc3RyaW5nIGZvciBjb21wb25lbnQgYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckNvbnN0cnVjdG9yKFxuICAgICAgICBvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgICAgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nLFxuICAgICAgICBiYXNlT3B0aW9uc1R5cGU6IHN0cmluZyxcbiAgICAgICAgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdLFxuICAgICAgICBjb21wb25lbnRBcnJheTogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5nZXRDb25maWdQYXRoKG9wdGlvbnMucHJvamVjdFR5cGUpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyoqXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICogQHBhcmFtIG9wdGlvbnMgLSBQcm9qZWN0IGNvbmZpZ3VyYXRpb25cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLm9wZW4oYGNvbnN0cnVjdG9yKG9wdGlvbnM6ICR7b3B0aW9uc0ludGVyZmFjZX0pIHtgKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIi8qIFNlcGFyYXRlIGNvbXBvbmVudCBjb25maWd1cmF0aW9uIGZyb20gYmFzZSBQcm9qZW4gb3B0aW9ucyAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgY29uc3QgeyAke2Rlc3RydWN0dXJlLmpvaW4oXCIsIFwiKX0sIC4uLmJhc2VPcHRpb25zIH0gPSBvcHRpb25zO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKiBNZXJnZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCB1c2VyIG9wdGlvbnMgYW5kIGluaXRpYWxpemUgYmFzZSBjbGFzcyAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgc3VwZXIoZGVlcE1lcmdlPCR7YmFzZU9wdGlvbnNUeXBlfT4oJHtjb25maWdQYXRofSwgYmFzZU9wdGlvbnMpKTtgKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZSgpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyogQXBwbHkgY29tcG9uZW50IGRlZmF1bHRzIGFuZCBpbnN0YW50aWF0ZSBlbmFibGVkIGNvbXBvbmVudHMgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYGFwcGx5RGVmYXVsdHModGhpcywgJHtjb21wb25lbnRBcnJheX0pO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5jbG9zZShcIn1cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyBvcHRpb25zIGludGVyZmFjZSBuYW1lIHRvIGZpbGUgbmFtZVxuICAgICAqXG4gICAgICogQ29udmVydHMgUGFzY2FsQ2FzZSBpbnRlcmZhY2UgbmFtZXMgdG8ga2ViYWItY2FzZSBmaWxlIG5hbWVzLlxuICAgICAqIEZhbGxzIGJhY2sgdG8gbG93ZXJjYXNlIGNvbnZlcnNpb24gZm9yIHVubWFwcGVkIGludGVyZmFjZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE9wdGlvbnMgaW50ZXJmYWNlIG5hbWVcbiAgICAgKiBAcmV0dXJucyBLZWJhYi1jYXNlIGZpbGUgbmFtZSB3aXRob3V0IGV4dGVuc2lvblxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBnZXRPcHRpb25zRmlsZU5hbWUoXCJUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnNcIikgLy8gXCJ0eXBlc2NyaXB0LW9wdGlvbnNcIlxuICAgICAqL1xuICAgIGdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgVHlwZVNjcmlwdFByb2plY3RPcHRpb25zOiBcInR5cGVzY3JpcHQtb3B0aW9uc1wiLFxuICAgICAgICAgICAgSnNpaVByb2plY3RPcHRpb25zOiBcImpzaWktb3B0aW9uc1wiLFxuICAgICAgICAgICAgQXdzQ2RrVHlwZVNjcmlwdEFwcFByb2plY3RPcHRpb25zOiBcImF3c2Nkay10eXBlc2NyaXB0LWFwcC1vcHRpb25zXCIsXG4gICAgICAgICAgICBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5UHJvamVjdE9wdGlvbnM6IFwiYXdzY2RrLWNvbnN0cnVjdC1saWJyYXJ5LW9wdGlvbnNcIixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG1hcHBpbmdbb3B0aW9uc0ludGVyZmFjZV0gfHwgb3B0aW9uc0ludGVyZmFjZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm9qZW4gY29tcG9uZW50IHRoYXQgZ2VuZXJhdGVzIFR5cGVTY3JpcHQgcHJvamVjdCBjbGFzc2VzIHdpdGggc3RhbmRhcmQgY29uZmlndXJhdGlvblxuICpcbiAqIFRoaXMgY29tcG9uZW50IGF1dG9tYXRlcyB0aGUgY3JlYXRpb24gb2YgcHJvamVjdCBjbGFzc2VzIHRoYXQgZXh0ZW5kIFByb2plbiBiYXNlIGNsYXNzZXNcbiAqIHdpdGggb3BpbmlvbmF0ZWQgZGVmYXVsdHMgYW5kIGNvbXBvbmVudCBpbnRlZ3JhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFByb2plY3RHZW5lcmF0b3IgZXh0ZW5kcyBwcm9qZW4uQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBUeXBlU2NyaXB0Q2xhc3NSZW5kZXJlcjtcbiAgICBwcml2YXRlIHN0YXRpYyBlbnVtR2VuZXJhdGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zLFxuICAgICkge1xuICAgICAgICBzdXBlcihwcm9qZWN0KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IG5ldyBUeXBlU2NyaXB0Q2xhc3NSZW5kZXJlcigpO1xuXG4gICAgICAgIC8qIEdlbmVyYXRlIFByb2plY3RUeXBlIGVudW0gb25jZSBvbiBmaXJzdCBpbnN0YW50aWF0aW9uICovXG4gICAgICAgIGlmICghUHJvamVjdEdlbmVyYXRvci5lbnVtR2VuZXJhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvamVjdFR5cGVFbnVtKCk7XG4gICAgICAgICAgICBQcm9qZWN0R2VuZXJhdG9yLmVudW1HZW5lcmF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogR2VuZXJhdGUgdGhlIG9wdGlvbnMgaW50ZXJmYWNlIHVzaW5nIFByb2plblN0cnVjdCBmb3IgSlNJSSBjb21wYXRpYmlsaXR5ICovXG4gICAgICAgIGNvbnN0IG9wdGlvbnNJbnRlcmZhY2UgPSBgJHtvcHRpb25zLm5hbWV9T3B0aW9uc2A7XG4gICAgICAgIGNvbnN0IGJhc2VPcHRpb25zRnFuID0gdGhpcy5yZW5kZXJlci5nZXRCYXNlT3B0aW9uc0ZxbihvcHRpb25zLnByb2plY3RUeXBlKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVQYXRoID0gdGhpcy5nZXRPcHRpb25zRmlsZVBhdGgob3B0aW9uc0ludGVyZmFjZSk7XG5cbiAgICAgICAgLyogUHJvamVuU3RydWN0IGdlbmVyYXRlcyBhIGNvbmNyZXRlIFR5cGVTY3JpcHQgaW50ZXJmYWNlIGZyb20gUHJvamVuJ3Mgb3B0aW9uc1xuICAgICAgICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEpTSUkgZG9lc24ndCBzdXBwb3J0IFR5cGVTY3JpcHQgdXRpbGl0eSB0eXBlcyBsaWtlIE9taXQ8PlxuICAgICAgICAgKiBUaGUgZ2VuZXJhdGVkIGludGVyZmFjZSBjYW4gYmUgY29uc3VtZWQgYnkgb3RoZXIgbGFuZ3VhZ2VzIChQeXRob24sIEphdmEsIEMjLCBHbykgKi9cbiAgICAgICAgY29uc3Qgc3RydWN0ID0gbmV3IFByb2plblN0cnVjdCh0aGlzLmFzVHlwZVNjcmlwdFByb2plY3QocHJvamVjdCksIHtcbiAgICAgICAgICAgIG5hbWU6IG9wdGlvbnNJbnRlcmZhY2UsXG4gICAgICAgICAgICBmaWxlUGF0aDogb3B0aW9uc0ZpbGVQYXRoLFxuICAgICAgICAgICAgb3V0cHV0RmlsZU9wdGlvbnM6IHsgcmVhZG9ubHk6IHRydWUgfSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5taXhpbihTdHJ1Y3QuZnJvbUZxbihiYXNlT3B0aW9uc0ZxbikpXG4gICAgICAgICAgICAud2l0aG91dERlcHJlY2F0ZWQoKTtcblxuICAgICAgICAvKiBSZW1vdmUgc3BlY2lmaWVkIG9wdGlvbnMgZnJvbSB0aGUgYmFzZSBpbnRlcmZhY2UgKi9cbiAgICAgICAgaWYgKG9wdGlvbnMub21pdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIHN0cnVjdC5vbWl0KC4uLm9wdGlvbnMub21pdE9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQWRkIGNvbXBvbmVudC1kZXJpdmVkIG9wdGlvbnMgdG8gdGhlIGludGVyZmFjZSAqL1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gb3B0aW9ucy5jb21wb25lbnRzID8/IGdldERlZmF1bHRDb21wb25lbnRzKCk7XG4gICAgICAgIGNvbnN0IHsgUHJpbWl0aXZlVHlwZSB9ID0gcmVxdWlyZShcIkBqc2lpL3NwZWNcIik7XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjLmNvbXBvbmVudENsYXNzLm5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBjLmNvbXBvbmVudENsYXNzLm5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgIC8qIEFkZCBlbmFibGVkIGZsYWcgZm9yIHRoZSBjb21wb25lbnQgKi9cbiAgICAgICAgICAgIHN0cnVjdC5hZGQoe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogeyBwcmltaXRpdmU6IFByaW1pdGl2ZVR5cGUuQm9vbGVhbiB9LFxuICAgICAgICAgICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRvY3M6IHtcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEVuYWJsZSAke2MuY29tcG9uZW50Q2xhc3MubmFtZX0gY29tcG9uZW50YCxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBBZGQgb3B0aW9ucyBwcm9wZXJ0eSBpZiBjb21wb25lbnQgaXMgY29uZmlndXJhYmxlICovXG4gICAgICAgICAgICBpZiAoYy5vcHRpb25zUHJvcGVydHkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uc1R5cGUgPSB0aGlzLnJlc29sdmVDb21wb25lbnRPcHRpb25zVHlwZShjKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNUeXBlICYmIHRoaXMuaXNGcW5BdmFpbGFibGUob3B0aW9uc1R5cGUuZnFuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LmFkZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogb3B0aW9uc1R5cGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7IGZxbjogb3B0aW9uc1R5cGUuZnFuIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBvcHRpb25zVHlwZS5kb2NzID8/IGAke2MuY29tcG9uZW50Q2xhc3MubmFtZX0gY29uZmlndXJhdGlvbmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGAtIGRlZmF1bHQgJHtjLmNvbXBvbmVudENsYXNzLm5hbWV9IGNvbmZpZ3VyYXRpb25gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qIENvbXBvbmVudCBoYXMgbm8gb3B0aW9ucyBwYXJhbWV0ZXIgb3IgcmVzb2x1dGlvbiBmYWlsZWQgLSBza2lwICovXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkZhaWxlZCB0byByZXNvbHZlIGNvbXBvbmVudCBvcHRpb25zIHR5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IGMuY29tcG9uZW50Q2xhc3MubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyogQWRkIGN1c3RvbSBvcHRpb25zIHRvIHRoZSBpbnRlcmZhY2UgKi9cbiAgICAgICAgaWYgKG9wdGlvbnMuYWRkaXRpb25hbE9wdGlvbnMgJiYgb3B0aW9ucy5hZGRpdGlvbmFsT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzdHJ1Y3QuYWRkKC4uLm9wdGlvbnMuYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgcHJvamVjdCB0byBUeXBlU2NyaXB0IHByb2plY3QgdHlwZVxuICAgICAqXG4gICAgICogUHJvamVuU3RydWN0IHJlcXVpcmVzIGEgVHlwZVNjcmlwdFByb2plY3QgaW5zdGFuY2UuIFRoaXMgZ2VuZXJhdG9yIGlzIG9ubHkgdXNlZFxuICAgICAqIHdpdGhpbiBUeXBlU2NyaXB0IHByb2plY3RzLCBzbyB0aGUgY2FzdCBpcyBzYWZlIGluIHByYWN0aWNlLlxuICAgICAqXG4gICAgICogTm90ZTogVHlwZSBhc3NlcnRpb24gaXMgbmVjZXNzYXJ5IGhlcmUgYmVjYXVzZSBQcm9qZW4ncyB0eXBlIHN5c3RlbSBkb2Vzbid0IHByb3ZpZGVcbiAgICAgKiBhIHJ1bnRpbWUgdHlwZSBndWFyZCBmb3IgVHlwZVNjcmlwdFByb2plY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHJldHVybnMgVHlwZVNjcmlwdCBwcm9qZWN0IGluc3RhbmNlXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc1R5cGVTY3JpcHRQcm9qZWN0KHByb2plY3Q6IFByb2plY3QpOiB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0IHtcbiAgICAgICAgcmV0dXJuIHByb2plY3QgYXMgdW5rbm93biBhcyB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlcml2ZXMgdGhlIGZpbGUgcGF0aCBmb3IgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogUGxhY2VzIHRoZSBvcHRpb25zIGludGVyZmFjZSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY2xhc3MgZmlsZVxuICAgICAqIHdpdGggYSBcIi5nZW5lcmF0ZWQudHNcIiBzdWZmaXguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHJldHVybnMgRmlsZSBwYXRoIGZvciB0aGUgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKiBAdGhyb3dzIHtJbnZhbGlkRmlsZVBhdGhFcnJvcn0gV2hlbiBmaWxlUGF0aCBkb2Vzbid0IGNvbnRhaW4gYSBkaXJlY3Rvcnkgc2VwYXJhdG9yXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRPcHRpb25zRmlsZVBhdGgob3B0aW9uc0ludGVyZmFjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbGFzdFNsYXNoID0gdGhpcy5vcHRpb25zLmZpbGVQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRmlsZVBhdGhFcnJvcih0aGlzLm9wdGlvbnMuZmlsZVBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlyID0gdGhpcy5vcHRpb25zLmZpbGVQYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2gpO1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZU5hbWUgPSB0aGlzLnJlbmRlcmVyLmdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlKTtcbiAgICAgICAgcmV0dXJuIGAke2Rpcn0vJHtvcHRpb25zRmlsZU5hbWV9LmdlbmVyYXRlZC50c2A7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHRoZSBUeXBlU2NyaXB0IGNsYXNzIGZpbGUgZHVyaW5nIFByb2plbiBzeW50aGVzaXNcbiAgICAgKlxuICAgICAqIENhbGxlZCBieSBQcm9qZW4gZHVyaW5nIHRoZSBzeW50aGVzaXMgcGhhc2UgdG8gZ2VuZXJhdGUgdGhlIHByb2plY3QgY2xhc3MgZmlsZS5cbiAgICAgKiBUaGUgZmlsZSBpcyBtYXJrZWQgYXMgcmVhZG9ubHkgdG8gcHJldmVudCBtYW51YWwgZWRpdGluZy5cbiAgICAgKi9cbiAgICBwcmVTeW50aGVzaXplKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5vcHRpb25zKTtcblxuICAgICAgICBuZXcgVHlwZVNjcmlwdENsYXNzRmlsZSh0aGlzLnByb2plY3QsIHRoaXMub3B0aW9ucy5maWxlUGF0aCwgY29udGVudCwge1xuICAgICAgICAgICAgcmVhZG9ubHk6IHRoaXMub3B0aW9ucy5yZWFkb25seSA/PyB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW4gRlFOIGlzIGF2YWlsYWJsZSBpbiBhbnkgSlNJSSBtYW5pZmVzdFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNGcW5BdmFpbGFibGUoZnFuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5sb2FkTWFuaWZlc3RGb3JGcW4oZnFuKTtcbiAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdC50eXBlcz8uW2Zxbl0gIT09IHVuZGVmaW5lZDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBjb21wb25lbnQgb3B0aW9ucyB0eXBlIGZyb20gSlNJSSBtYW5pZmVzdFxuICAgICAqXG4gICAgICogQXV0by1kZXRlY3RzIG9wdGlvbnMgZnJvbSBKU0lJIG1hbmlmZXN0IHdoZW4gb3B0aW9uc1Byb3BlcnR5IGlzIHVuZGVmaW5lZC5cbiAgICAgKiBSZXR1cm5zIG51bGwgb25seSB3aGVuIG9wdGlvbnNQcm9wZXJ0eSBpcyBleHBsaWNpdGx5IHNldCB0byBmYWxzZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc29sdmVDb21wb25lbnRPcHRpb25zVHlwZShjb21wb25lbnQ6IENvbXBvbmVudCk6IHsgbmFtZTogc3RyaW5nOyBmcW46IHN0cmluZzsgZG9jcz86IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgICAgIC8qIE5vcm1hbGl6ZSBvcHRpb25zUHJvcGVydHkgdG8gQ29tcG9uZW50T3B0aW9ucyAqL1xuICAgICAgICBsZXQgb3B0aW9uc0NvbmZpZzogQ29tcG9uZW50T3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQub3B0aW9uc1Byb3BlcnR5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBvcHRpb25zQ29uZmlnID0geyBuYW1lOiBjb21wb25lbnQub3B0aW9uc1Byb3BlcnR5IH07XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50Lm9wdGlvbnNQcm9wZXJ0eSAmJiB0eXBlb2YgY29tcG9uZW50Lm9wdGlvbnNQcm9wZXJ0eSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgb3B0aW9uc0NvbmZpZyA9IGNvbXBvbmVudC5vcHRpb25zUHJvcGVydHk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBVc2UgZXhwbGljaXQgdHlwZSBpZiBwcm92aWRlZCAqL1xuICAgICAgICBpZiAob3B0aW9uc0NvbmZpZz8udHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zQ29uZmlnLm5hbWUsXG4gICAgICAgICAgICAgICAgZnFuOiBvcHRpb25zQ29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgZG9jczogb3B0aW9uc0NvbmZpZy5kb2NzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEZpbmQgY29tcG9uZW50IGluIEpTSUkgbWFuaWZlc3RzICovXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEZxbiA9IGNvbXBvbmVudC5mcW4gPz8gdGhpcy5maW5kQ29tcG9uZW50RnFuKGNvbXBvbmVudC5jb21wb25lbnRDbGFzcy5uYW1lKTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLmxvYWRNYW5pZmVzdEZvckZxbihjb21wb25lbnRGcW4pO1xuXG4gICAgICAgIGNvbnN0IGNsYXNzVHlwZSA9IG1hbmlmZXN0LnR5cGVzPy5bY29tcG9uZW50RnFuXTtcbiAgICAgICAgaWYgKCFjbGFzc1R5cGUgfHwgY2xhc3NUeXBlLmtpbmQgIT09IFwiY2xhc3NcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBvbmVudFJlc29sdXRpb25FcnJvcihjb21wb25lbnRGcW4sIFwiQ29tcG9uZW50IG5vdCBmb3VuZCBpbiBKU0lJIG1hbmlmZXN0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5pdGlhbGl6ZXIgPSAoY2xhc3NUeXBlIGFzIHsgaW5pdGlhbGl6ZXI/OiB7IHBhcmFtZXRlcnM/OiBBcnJheTx7IHR5cGU/OiB7IGZxbj86IHN0cmluZyB9IH0+IH0gfSlcbiAgICAgICAgICAgIC5pbml0aWFsaXplcjtcbiAgICAgICAgaWYgKCFpbml0aWFsaXplcj8ucGFyYW1ldGVycz8uWzFdKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLyogQ29tcG9uZW50IGhhcyBubyBvcHRpb25zIHBhcmFtZXRlciAqL1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uc1BhcmFtID0gaW5pdGlhbGl6ZXIucGFyYW1ldGVyc1sxXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZxbiA9IG9wdGlvbnNQYXJhbS50eXBlPy5mcW47XG5cbiAgICAgICAgaWYgKCFvcHRpb25zRnFuKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLyogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIG5vIEZRTiAqL1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uc1R5cGUgPSBtYW5pZmVzdC50eXBlcz8uW29wdGlvbnNGcW5dO1xuICAgICAgICBjb25zdCBkb2NzID0gKG9wdGlvbnNUeXBlIGFzIHsgZG9jcz86IHsgc3VtbWFyeT86IHN0cmluZyB9IH0gfCB1bmRlZmluZWQpPy5kb2NzPy5zdW1tYXJ5O1xuXG4gICAgICAgIC8qIEF1dG8tZ2VuZXJhdGUgcHJvcGVydHkgbmFtZSBpZiBub3QgcHJvdmlkZWQgKi9cbiAgICAgICAgY29uc3QgbmFtZSA9IGNvbXBvbmVudC5jb21wb25lbnRDbGFzcy5uYW1lO1xuICAgICAgICBjb25zdCBkZWZhdWx0TmFtZSA9IGAke25hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCl9JHtuYW1lLnNsaWNlKDEpfU9wdGlvbnNgO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBvcHRpb25zQ29uZmlnPy5uYW1lID8/IGRlZmF1bHROYW1lO1xuXG4gICAgICAgIHJldHVybiB7IG5hbWU6IHByb3BlcnR5TmFtZSwgZnFuOiBvcHRpb25zRnFuLCBkb2NzIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgY29tcG9uZW50IEZRTiBieSBzZWFyY2hpbmcgYWxsIEpTSUkgbWFuaWZlc3RzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kQ29tcG9uZW50RnFuKGNvbXBvbmVudE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8qIFRyeSBvd24gcGFja2FnZSBmaXJzdCAqL1xuICAgICAgICBjb25zdCBvd25GcW4gPSBgQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzLiR7Y29tcG9uZW50TmFtZX1gO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgb3duTWFuaWZlc3QgPSB0aGlzLmxvYWRPd25NYW5pZmVzdCgpO1xuICAgICAgICAgICAgaWYgKG93bk1hbmlmZXN0LnR5cGVzPy5bb3duRnFuXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvd25GcW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvKiBPd24gbWFuaWZlc3Qgbm90IGF2YWlsYWJsZSB5ZXQgZHVyaW5nIGRldmVsb3BtZW50IC0gdGhpcyBpcyBleHBlY3RlZCAqL1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJPd24gbWFuaWZlc3Qgbm90IGF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2VhcmNoIGluIG5vZGVfbW9kdWxlcyBmb3IgSlNJSSBwYWNrYWdlcyAqL1xuICAgICAgICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBqb2luKF9fZGlybmFtZSwgXCIuLi8uLi9ub2RlX21vZHVsZXNcIik7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gdGhpcy5maW5kSnNpaVBhY2thZ2VzKG5vZGVNb2R1bGVzUGF0aCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwa2cgb2YgcGFja2FnZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLmxvYWRNYW5pZmVzdEZyb21QYWNrYWdlKHBrZyk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmcW4gb2YgT2JqZWN0LmtleXMobWFuaWZlc3QudHlwZXMgPz8ge30pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcW4uZW5kc1dpdGgoYC4ke2NvbXBvbmVudE5hbWV9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8qIFNraXAgcGFja2FnZXMgd2l0aCBpbnZhbGlkIG1hbmlmZXN0cyAtIGxvZyBmb3IgZGVidWdnaW5nICovXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkZhaWxlZCB0byBsb2FkIG1hbmlmZXN0IGZyb20gcGFja2FnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZTogcGtnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBDb21wb25lbnRSZXNvbHV0aW9uRXJyb3IoY29tcG9uZW50TmFtZSwgXCJDb21wb25lbnQgbm90IGZvdW5kIGluIGFueSBKU0lJIG1hbmlmZXN0XCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIGFsbCBKU0lJIHBhY2thZ2VzIGluIG5vZGVfbW9kdWxlc1xuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEpzaWlQYWNrYWdlcyhub2RlTW9kdWxlc1BhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgcGFja2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IHsgcmVhZGRpclN5bmMsIHN0YXRTeW5jLCBleGlzdHNTeW5jIH0gPSByZXF1aXJlKFwibm9kZTpmc1wiKTtcblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMobm9kZU1vZHVsZXNQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcmVzb2x2ZShub2RlTW9kdWxlc1BhdGgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMobm9kZU1vZHVsZXNQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnlQYXRoID0gcmVzb2x2ZShub2RlTW9kdWxlc1BhdGgsIGVudHJ5KTtcblxuICAgICAgICAgICAgLyogUHJldmVudCBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzICovXG4gICAgICAgICAgICBpZiAoIWVudHJ5UGF0aC5zdGFydHNXaXRoKHJlc29sdmVkQmFzZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICAgICAgICAgICAgLyogU2NvcGVkIHBhY2thZ2UgLSByZWN1cnNlIGludG8gc2NvcGUgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBzY29wZVBhdGggPSBlbnRyeVBhdGg7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzY29wZWRFbnRyeSBvZiByZWFkZGlyU3luYyhzY29wZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBrZ1BhdGggPSByZXNvbHZlKHNjb3BlUGF0aCwgc2NvcGVkRW50cnkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8qIFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrcyAqL1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBrZ1BhdGguc3RhcnRzV2l0aChyZXNvbHZlZEJhc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4ocGtnUGF0aCwgXCIuanNpaVwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLnB1c2gocGtnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRTeW5jKGVudHJ5UGF0aCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIC8qIFJlZ3VsYXIgcGFja2FnZSAqL1xuICAgICAgICAgICAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4oZW50cnlQYXRoLCBcIi5qc2lpXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcy5wdXNoKGVudHJ5UGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhY2thZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIEpTSUkgbWFuaWZlc3QgZm9yIGEgZ2l2ZW4gRlFOXG4gICAgICpcbiAgICAgKiBFeHRyYWN0cyBwYWNrYWdlIG5hbWUgZnJvbSBGUU4uIEZvciBzY29wZWQgcGFja2FnZXMgbGlrZSBAc2NvcGUvcGFja2FnZS5DbGFzc05hbWUsXG4gICAgICogdGhlIHBhY2thZ2UgbmFtZSBpcyBldmVyeXRoaW5nIGJlZm9yZSB0aGUgZmlyc3QgZG90IChpLmUuLCBAc2NvcGUvcGFja2FnZSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkTWFuaWZlc3RGb3JGcW4oZnFuOiBzdHJpbmcpOiBBc3NlbWJseSB7XG4gICAgICAgIGNvbnN0IGRvdEluZGV4ID0gZnFuLmluZGV4T2YoXCIuXCIpO1xuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGRvdEluZGV4ID4gMCA/IGZxbi5zdWJzdHJpbmcoMCwgZG90SW5kZXgpIDogZnFuO1xuXG4gICAgICAgIC8qIFRyeSBvd24gcGFja2FnZSAqL1xuICAgICAgICBpZiAocGFja2FnZU5hbWUgPT09IFwiQG5pa292aXJ0YWxhL3Byb2plbi1jb25zdHJ1Y3RzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRPd25NYW5pZmVzdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogVHJ5IG5vZGVfbW9kdWxlcyAqL1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGtnSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGFja2FnZU5hbWV9L3BhY2thZ2UuanNvbmApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZE1hbmlmZXN0RnJvbVBhY2thZ2UoZGlybmFtZShwa2dKc29uUGF0aCkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1hbmlmZXN0TG9hZEVycm9yKHBhY2thZ2VOYW1lLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgSlNJSSBtYW5pZmVzdCBmcm9tIGEgcGFja2FnZSBkaXJlY3RvcnlcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRNYW5pZmVzdEZyb21QYWNrYWdlKHBhY2thZ2VQYXRoOiBzdHJpbmcpOiBBc3NlbWJseSB7XG4gICAgICAgIGNvbnN0IGpzaWlQYXRoID0gam9pbihwYWNrYWdlUGF0aCwgXCIuanNpaVwiKTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGpzaWlQYXRoLCBcInV0Zi04XCIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGlzIHBhY2thZ2UncyBKU0lJIG1hbmlmZXN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkT3duTWFuaWZlc3QoKTogQXNzZW1ibHkge1xuICAgICAgICBjb25zdCBqc2lpUGF0aCA9IGpvaW4oX19kaXJuYW1lLCBcIi4uLy5qc2lpXCIpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoanNpaVBhdGgsIFwidXRmLThcIikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBQcm9qZWN0VHlwZSBlbnVtIGZyb20gUHJvamVuJ3MgSlNJSSBtYW5pZmVzdFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2VuZXJhdGVQcm9qZWN0VHlwZUVudW0oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHByb2plY3RUeXBlcyA9IHRoaXMuZGlzY292ZXJQcm9qZWN0VHlwZXMoKTtcblxuICAgICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGluZXMucHVzaChcIi8qKlwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqIEVudW0gZGVmaW5pbmcgYWxsIHN1cHBvcnRlZCBwcm9qZWN0IHR5cGVzXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICpcIik7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgKiBFYWNoIHByb2plY3QgdHlwZSBjb3JyZXNwb25kcyB0byBhIGdlbmVyYXRlZCBwcm9qZWN0IGNsYXNzIGFuZCBpdHMgY29uZmlndXJhdGlvblwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqIGluIHRoZSBkZWZhdWx0T3B0aW9ucyBzdHJ1Y3R1cmUuXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICpcIik7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgKiBAZ2VuZXJhdGVkIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gUHJvamVuJ3MgSlNJSSBtYW5pZmVzdFwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqL1wiKTtcbiAgICAgICAgbGluZXMucHVzaChcImV4cG9ydCBlbnVtIFByb2plY3RUeXBlIHtcIik7XG5cbiAgICAgICAgZm9yIChjb25zdCBbZW51bU5hbWUsIHZhbHVlLCBkb2NzXSBvZiBwcm9qZWN0VHlwZXMpIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goXCIgICAgLyoqXCIpO1xuICAgICAgICAgICAgbGluZXMucHVzaChgICAgICAqICR7ZG9jc31gKTtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goXCIgICAgICovXCIpO1xuICAgICAgICAgICAgbGluZXMucHVzaChgICAgICR7ZW51bU5hbWV9ID0gXCIke3ZhbHVlfVwiLGApO1xuICAgICAgICAgICAgbGluZXMucHVzaChcIlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVzLnB1c2goXCJ9XCIpO1xuXG4gICAgICAgIG5ldyBwcm9qZW4uVGV4dEZpbGUodGhpcy5wcm9qZWN0LCBcInNyYy9wcm9qZWN0LXR5cGUudHNcIiwge1xuICAgICAgICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzY292ZXJzIGFsbCBwcm9qZWN0IHR5cGVzIHRoYXQgZXh0ZW5kIHByb2plbi5Qcm9qZWN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBkaXNjb3ZlclByb2plY3RUeXBlcygpOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgICAgICAgY29uc3QgcHJvamVjdFR5cGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10+ID0gW107XG4gICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IFwicHJvamVuLlByb2plY3RcIjtcblxuICAgICAgICBmb3IgKGNvbnN0IFtmcW4sIHR5cGVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucmVuZGVyZXIuanNpaU1hbmlmZXN0LnR5cGVzID8/IHt9KSkge1xuICAgICAgICAgICAgaWYgKHR5cGUua2luZCAhPT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNsYXNzVHlwZSA9IHR5cGUgYXMge1xuICAgICAgICAgICAgICAgIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICBiYXNlPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIGRvY3M/OiB7IHN1bW1hcnk/OiBzdHJpbmcgfTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChjbGFzc1R5cGUuYWJzdHJhY3QpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmV4dGVuZHNCYXNlKGNsYXNzVHlwZSwgYmFzZUNsYXNzKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGZxbi5zcGxpdChcIi5cIik7XG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoIDwgMyB8fCBwYXJ0c1swXSAhPT0gXCJwcm9qZW5cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBwYXJ0c1sxXTtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHBhcnRzLnNsaWNlKDIpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgICAgY29uc3QgZW51bU5hbWUgPSBjbGFzc05hbWVcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvKFtBLVpdKS9nLCBcIl8kMVwiKVxuICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL15fLywgXCJcIik7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGAke21vZHVsZX0uJHtjbGFzc05hbWV9YDtcbiAgICAgICAgICAgIGNvbnN0IGRvY3MgPSBjbGFzc1R5cGUuZG9jcz8uc3VtbWFyeSA/PyBjbGFzc05hbWU7XG5cbiAgICAgICAgICAgIHByb2plY3RUeXBlcy5wdXNoKFtlbnVtTmFtZSwgdmFsdWUsIGRvY3NdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9qZWN0VHlwZXMuc29ydCgoYSwgYikgPT4gYVswXS5sb2NhbGVDb21wYXJlKGJbMF0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjbGFzcyBleHRlbmRzIHRoZSBiYXNlIGNsYXNzXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRlbmRzQmFzZShjbGFzc1R5cGU6IHsgaW5oZXJpdGFuY2VQYXRoPzogc3RyaW5nW107IGJhc2U/OiBzdHJpbmcgfSwgYmFzZUNsYXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNsYXNzVHlwZS5pbmhlcml0YW5jZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjbGFzc1R5cGUuaW5oZXJpdGFuY2VQYXRoLmluY2x1ZGVzKGJhc2VDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3VycmVudEJhc2UgPSBjbGFzc1R5cGUuYmFzZTtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRCYXNlKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEJhc2UgPT09IGJhc2VDbGFzcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmFzZVR5cGUgPSB0aGlzLnJlbmRlcmVyLmpzaWlNYW5pZmVzdC50eXBlcz8uW2N1cnJlbnRCYXNlXTtcbiAgICAgICAgICAgIGlmICghYmFzZVR5cGUgfHwgYmFzZVR5cGUua2luZCAhPT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50QmFzZSA9IChiYXNlVHlwZSBhcyB7IGJhc2U/OiBzdHJpbmcgfSkuYmFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogVGV4dCBmaWxlIGZvciBnZW5lcmF0ZWQgVHlwZVNjcmlwdCBjbGFzcyBjb2RlXG4gKlxuICogRXh0ZW5kcyBQcm9qZW4ncyBUZXh0RmlsZSB0byBhZGQgdGhlIGdlbmVyYXRlZCBmaWxlIG1hcmtlciBjb21tZW50XG4gKiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLlxuICovXG5jbGFzcyBUeXBlU2NyaXB0Q2xhc3NGaWxlIGV4dGVuZHMgcHJvamVuLlRleHRGaWxlIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcHJvamVjdCAtIFByb2plbiBwcm9qZWN0IGluc3RhbmNlXG4gICAgICogQHBhcmFtIGZpbGVQYXRoIC0gT3V0cHV0IGZpbGUgcGF0aFxuICAgICAqIEBwYXJhbSBjb250ZW50IC0gVHlwZVNjcmlwdCBjbGFzcyBjb2RlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBTb3VyY2UgY29kZSBvcHRpb25zIChyZWFkb25seSwgZXRjLilcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIG9wdGlvbnM6IFNvdXJjZUNvZGVPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCwgZmlsZVBhdGgsIG9wdGlvbnMpO1xuICAgICAgICAvKiBBZGQgZ2VuZXJhdGVkIGZpbGUgbWFya2VyIHRvIHByZXZlbnQgbWFudWFsIGVkaXRpbmcgKi9cbiAgICAgICAgdGhpcy5hZGRMaW5lKGAvLyAke3RoaXMubWFya2VyfWApO1xuICAgICAgICB0aGlzLmFkZExpbmUoY29udGVudCk7XG4gICAgfVxufVxuIl19
|
|
831
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvamVjdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFDQUF1QztBQUN2Qyx5Q0FBbUQ7QUFFbkQsc0VBQW9FO0FBRXBFLCtDQUFpQztBQUNqQyxxQ0FNa0I7QUFHbEI7O0dBRUc7QUFDSCxTQUFTLG9CQUFvQjtJQUN6QixPQUFPO1FBQ0gsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxFQUFFO1FBQ3JEO1lBQ0ksY0FBYyxFQUFFLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU07WUFDckQsZUFBZSxFQUFFO2dCQUNiLElBQUksRUFBRSxlQUFlO2dCQUNyQixJQUFJLEVBQUUsOENBQThDO2dCQUNwRCxJQUFJLEVBQUUsc0JBQXNCO2FBQy9CO1NBQ0o7S0FDSixDQUFDO0FBQ04sQ0FBQztBQStHRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVTtJQU9pQjtJQU5yQixLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQ3JCLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFFeEI7O09BRUc7SUFDSCxZQUE2QixTQUFTLEdBQUc7UUFBWixXQUFNLEdBQU4sTUFBTSxDQUFNO0lBQUcsQ0FBQztJQUU3Qzs7OztPQUlHO0lBQ0gsS0FBSztRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJLENBQUMsSUFBYTtRQUNkLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJLENBQUMsSUFBYTtRQUNkLElBQUksSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLElBQWE7UUFDZixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLGdDQUF1QixFQUFFLENBQUM7UUFDeEMsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSztRQUNULElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7Q0FDSjtBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLHVCQUF1QjtJQUNqQixNQUFNLENBQWE7SUFDcEIsWUFBWSxDQUFXO0lBRTlCOztPQUVHO0lBQ0gsWUFBWSxNQUFNLEdBQUcsQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNqRCw4REFBOEQ7UUFDOUQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDakUsTUFBTSxVQUFVLEdBQUcsSUFBQSxtQkFBTyxFQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBQSxzQkFBWSxFQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxPQUFnQztRQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXBCLHlEQUF5RDtRQUN6RCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksU0FBUyxDQUFDO1FBQ2xELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkUsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFaEUsc0VBQXNFO1FBQ3RFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUVoRSxnRUFBZ0U7UUFDaEUsTUFBTSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUUvRCwyQ0FBMkM7UUFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFMUYsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSCxpQkFBaUIsQ0FBQyxXQUF3QjtRQUN0QyxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEMseUVBQXlFO1FBQ3pFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLG9DQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxVQUFVLFNBQVMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sVUFBVSxHQUFHLEdBQUcsWUFBWSxTQUFTLENBQUM7UUFFNUMsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLG9DQUEyQixDQUFDLDBDQUEwQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksb0NBQTJCLENBQUMsaURBQWlELFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNLLHVCQUF1QixDQUFDLFVBQXVCO1FBQ25ELE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQztRQUNqQyxNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUM7UUFFcEMsS0FBSyxNQUFNLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUN6QixzRkFBc0Y7WUFDdEYsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXZCLDREQUE0RDtZQUM1RCxNQUFNLEtBQUssR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQUMsQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzlELGdGQUFnRjtnQkFDaEYsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUMsZUFBZSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BHLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsRUFBRSxZQUFZLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDM0QsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLDBEQUEwRDtnQkFDMUQsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkMsQ0FBQztZQUNELGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBRUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNLLGNBQWMsQ0FBQyxPQUFnQyxFQUFFLGdCQUF3QjtRQUM3RSxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztRQUUvQyx3R0FBd0c7UUFDeEcsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFbEUsK0JBQStCO1FBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTdDLG9DQUFvQztRQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2RSw0RUFBNEU7UUFDNUUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQ2hFLEtBQUssTUFBTSxDQUFDLElBQUksVUFBVSxFQUFFLENBQUM7WUFDekIsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDNUMsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5QyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixhQUFhLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7UUFDTCxDQUFDO1FBRUQsOEJBQThCO1FBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWhELG1GQUFtRjtRQUNuRixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssZUFBZSxZQUFZLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzRSxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSyxhQUFhLENBQUMsV0FBd0I7UUFDMUMsT0FBTyxrQkFBa0IsV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxhQUFhLENBQUMsT0FBaUM7UUFDbkQsaUZBQWlGO1FBQ2pGLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNELE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QyxJQUFJLFdBQVcsS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUVILEtBQUssTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7WUFDOUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hELCtFQUErRTtZQUMvRSxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzlDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzdFLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFlBQVksQ0FBQyxnQkFBd0I7UUFDekMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEUsd0RBQXdEO1FBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixnQkFBZ0IsY0FBYyxlQUFlLGNBQWMsQ0FBQyxDQUFDO0lBQ25HLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLFdBQVcsQ0FDZixPQUFnQyxFQUNoQyxnQkFBd0IsRUFDeEIsZUFBdUIsRUFDdkIsV0FBcUIsRUFDckIsY0FBc0I7UUFFdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxPQUFPLENBQUMsSUFBSSx3REFBd0QsQ0FBQyxDQUFDO1FBQzdGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHlGQUF5RixDQUFDLENBQUM7UUFDNUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLE9BQU8sQ0FBQyxJQUFJLFlBQVksT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNLLGlCQUFpQixDQUNyQixPQUFnQyxFQUNoQyxnQkFBd0IsRUFDeEIsZUFBdUIsRUFDdkIsV0FBcUIsRUFDckIsY0FBc0I7UUFFdEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0VBQStFLENBQUMsQ0FBQztRQUNsRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsZUFBZSxLQUFLLFVBQVUsa0JBQWtCLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLGNBQWMsSUFBSSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsa0JBQWtCLENBQUMsZ0JBQXdCO1FBQ3ZDLE1BQU0sT0FBTyxHQUEyQjtZQUNwQyx3QkFBd0IsRUFBRSxvQkFBb0I7WUFDOUMsa0JBQWtCLEVBQUUsY0FBYztZQUNsQyxpQ0FBaUMsRUFBRSwrQkFBK0I7WUFDbEUsb0NBQW9DLEVBQUUsa0NBQWtDO1NBQzNFLENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZFLENBQUM7Q0FDSjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSxnQkFBaUIsU0FBUSxNQUFNLENBQUMsU0FBUztJQVU3Qjs7SUFUYixRQUFRLENBQTBCO0lBQ2xDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRXJDOzs7T0FHRztJQUNILFlBQ0ksT0FBZ0IsRUFDQyxPQUFnQztRQUVqRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFGRSxZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQUdqRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksdUJBQXVCLEVBQUUsQ0FBQztRQUU5QywyREFBMkQ7UUFDM0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQy9CLGdCQUFnQixDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUMsQ0FBQztRQUVELDhFQUE4RTtRQUM5RSxNQUFNLGdCQUFnQixHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksU0FBUyxDQUFDO1FBQ2xELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWxFOzsrRkFFdUY7UUFDdkYsTUFBTSxNQUFNLEdBQUcsSUFBSSxrQ0FBWSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMvRCxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLFFBQVEsRUFBRSxlQUFlO1lBQ3pCLGlCQUFpQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtTQUN4QyxDQUFDO2FBQ0csS0FBSyxDQUFDLDRCQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ3JDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsc0RBQXNEO1FBQ3RELElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELG9EQUFvRDtRQUNwRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDaEUsTUFBTSxFQUFFLGFBQWEsRUFBRSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVoRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFNUYsd0NBQXdDO1lBQ3hDLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0JBQ1AsSUFBSTtnQkFDSixJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLE9BQU8sRUFBRTtnQkFDMUMsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsSUFBSSxFQUFFO29CQUNGLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxZQUFZO29CQUNwRCxPQUFPLEVBQUUsTUFBTTtpQkFDbEI7YUFDSixDQUFDLENBQUM7WUFFSCx1REFBdUQ7WUFDdkQsSUFBSSxDQUFDLENBQUMsZUFBZSxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUM7b0JBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN4RCxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUN0RCxNQUFNLENBQUMsR0FBRyxDQUFDOzRCQUNQLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSTs0QkFDdEIsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHLEVBQUU7NEJBQzlCLFFBQVEsRUFBRSxJQUFJOzRCQUNkLElBQUksRUFBRTtnQ0FDRixPQUFPLEVBQUUsV0FBVyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxnQkFBZ0I7Z0NBQ3JFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxnQkFBZ0I7NkJBQzlEO3lCQUNKLENBQUMsQ0FBQztvQkFDUCxDQUFDO2dCQUNMLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDYixvRUFBb0U7b0JBQ3BFLE9BQU8sQ0FBQyxJQUFJLENBQ1IsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDWCxPQUFPLEVBQUUsMENBQTBDO3dCQUNuRCxTQUFTLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJO3dCQUNoQyxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztxQkFDaEUsQ0FBQyxDQUNMLENBQUM7Z0JBQ04sQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBRUQseUNBQXlDO1FBQ3pDLElBQUksT0FBTyxDQUFDLGlCQUFpQixJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSyxtQkFBbUIsQ0FBQyxPQUFnQjtRQUN4QyxPQUFPLE9BQWtELENBQUM7SUFDOUQsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLGtCQUFrQixDQUFDLGdCQUF3QjtRQUMvQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekQsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksNkJBQW9CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDM0UsT0FBTyxHQUFHLEdBQUcsSUFBSSxlQUFlLGVBQWUsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxhQUFhO1FBQ1QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRW5ELElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUU7WUFDbEUsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUk7U0FDMUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0ssY0FBYyxDQUFDLEdBQVc7UUFDOUIsSUFBSSxDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlDLE9BQU8sUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsQ0FBQztRQUMvQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ0wsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLDJCQUEyQixDQUFDLFNBQW9CO1FBQ3BELG1EQUFtRDtRQUNuRCxJQUFJLGFBQTJDLENBQUM7UUFDaEQsSUFBSSxPQUFPLFNBQVMsQ0FBQyxlQUFlLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEQsYUFBYSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4RCxDQUFDO2FBQU0sSUFBSSxTQUFTLENBQUMsZUFBZSxJQUFJLE9BQU8sU0FBUyxDQUFDLGVBQWUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNwRixhQUFhLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQztRQUM5QyxDQUFDO1FBRUQsbUNBQW1DO1FBQ25DLElBQUksYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ3RCLE9BQU87Z0JBQ0gsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJO2dCQUN4QixHQUFHLEVBQUUsYUFBYSxDQUFDLElBQUk7Z0JBQ3ZCLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTthQUMzQixDQUFDO1FBQ04sQ0FBQztRQUVELHNDQUFzQztRQUN0QyxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV2RCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxpQ0FBd0IsQ0FBQyxZQUFZLEVBQUUsc0NBQXNDLENBQUMsQ0FBQztRQUM3RixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUksU0FBbUY7YUFDbkcsV0FBVyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxPQUFPLElBQUksQ0FBQyxDQUFDLHdDQUF3QztRQUN6RCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztRQUUxQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDZCxPQUFPLElBQUksQ0FBQyxDQUFDLGtDQUFrQztRQUNuRCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sSUFBSSxHQUFJLFdBQTJELEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQztRQUV6RixpREFBaUQ7UUFDakQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM3RSxNQUFNLFlBQVksR0FBRyxhQUFhLEVBQUUsSUFBSSxJQUFJLFdBQVcsQ0FBQztRQUV4RCxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLGFBQXFCO1FBQzFDLDJCQUEyQjtRQUMzQixNQUFNLE1BQU0sR0FBRyxrQ0FBa0MsYUFBYSxFQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzNDLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sTUFBTSxDQUFDO1lBQ2xCLENBQUM7UUFDTCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNiLDBFQUEwRTtZQUMxRSxPQUFPLENBQUMsSUFBSSxDQUNSLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ1gsT0FBTyxFQUFFLDRCQUE0QjtnQkFDckMsU0FBUyxFQUFFLGFBQWE7Z0JBQ3hCLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2hFLENBQUMsQ0FDTCxDQUFDO1FBQ04sQ0FBQztRQUVELDhDQUE4QztRQUM5QyxNQUFNLGVBQWUsR0FBRyxJQUFBLGdCQUFJLEVBQUMsU0FBUyxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDOUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXhELEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDO2dCQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkQsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDbEQsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDO3dCQUNwQyxPQUFPLEdBQUcsQ0FBQztvQkFDZixDQUFDO2dCQUNMLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDYiw4REFBOEQ7Z0JBQzlELE9BQU8sQ0FBQyxJQUFJLENBQ1IsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDWCxPQUFPLEVBQUUsc0NBQXNDO29CQUMvQyxPQUFPLEVBQUUsR0FBRztvQkFDWixLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztpQkFDaEUsQ0FBQyxDQUNMLENBQUM7WUFDTixDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sSUFBSSxpQ0FBd0IsQ0FBQyxhQUFhLEVBQUUsMENBQTBDLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxlQUF1QjtRQUM1QyxNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7UUFDOUIsTUFBTSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWpFLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUMvQixPQUFPLFFBQVEsQ0FBQztRQUNwQixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBQSxtQkFBTyxFQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTlDLEtBQUssTUFBTSxLQUFLLElBQUksV0FBVyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBQSxtQkFBTyxFQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVsRCxvQ0FBb0M7WUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDdEMsU0FBUztZQUNiLENBQUM7WUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEIseUNBQXlDO2dCQUN6QyxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUM7Z0JBQzVCLEtBQUssTUFBTSxXQUFXLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7b0JBQy9DLE1BQU0sT0FBTyxHQUFHLElBQUEsbUJBQU8sRUFBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBRWhELG9DQUFvQztvQkFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQzt3QkFDcEMsU0FBUztvQkFDYixDQUFDO29CQUVELElBQUksVUFBVSxDQUFDLElBQUEsZ0JBQUksRUFBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUMzQixDQUFDO2dCQUNMLENBQUM7WUFDTCxDQUFDO2lCQUFNLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQzNDLHFCQUFxQjtnQkFDckIsSUFBSSxVQUFVLENBQUMsSUFBQSxnQkFBSSxFQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3ZDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzdCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGtCQUFrQixDQUFDLEdBQVc7UUFDbEMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxNQUFNLFdBQVcsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBRXBFLHFCQUFxQjtRQUNyQixJQUFJLFdBQVcsS0FBSyxnQ0FBZ0MsRUFBRSxDQUFDO1lBQ25ELE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFdBQVcsZUFBZSxDQUFDLENBQUM7WUFDbkUsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBQSxtQkFBTyxFQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksMEJBQWlCLENBQUMsV0FBVyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JHLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyx1QkFBdUIsQ0FBQyxXQUFtQjtRQUMvQyxNQUFNLFFBQVEsR0FBRyxJQUFBLGdCQUFJLEVBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLHNCQUFZLEVBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZTtRQUNuQixNQUFNLFFBQVEsR0FBRyxJQUFBLGdCQUFJLEVBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLHNCQUFZLEVBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssdUJBQXVCO1FBQzNCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRWpELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUMzQixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xCLEtBQUssQ0FBQyxJQUFJLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUMzRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMscUZBQXFGLENBQUMsQ0FBQztRQUNsRyxLQUFLLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDbEQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7UUFDaEYsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQixLQUFLLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFFeEMsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqRCxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLFFBQVEsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQzVDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFaEIsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUscUJBQXFCLEVBQUU7WUFDckQsUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLO1NBQ1IsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0ssb0JBQW9CO1FBQ3hCLE1BQU0sWUFBWSxHQUFvQyxFQUFFLENBQUM7UUFDekQsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUM7UUFFbkMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDL0UsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUN4QixTQUFTO1lBQ2IsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLElBSWpCLENBQUM7WUFFRixJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDckIsU0FBUztZQUNiLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDMUMsU0FBUztZQUNiLENBQUM7WUFFRCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM1QyxTQUFTO1lBQ2IsQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQyxNQUFNLFFBQVEsR0FBRyxTQUFTO2lCQUNyQixPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQztpQkFDMUIsV0FBVyxFQUFFO2lCQUNiLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkIsTUFBTSxLQUFLLEdBQUcsR0FBRyxNQUFNLElBQUksU0FBUyxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLElBQUksU0FBUyxDQUFDO1lBRWxELFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxXQUFXLENBQUMsU0FBd0QsRUFBRSxTQUFpQjtRQUMzRixJQUFJLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM1QixPQUFPLFNBQVMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxJQUFJLFdBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQ2pDLE9BQU8sV0FBVyxFQUFFLENBQUM7WUFDakIsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7WUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU07WUFDVixDQUFDO1lBQ0QsV0FBVyxHQUFJLFFBQThCLENBQUMsSUFBSSxDQUFDO1FBQ3ZELENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDOztBQWxjTCw0Q0FtY0M7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sbUJBQW9CLFNBQVEsTUFBTSxDQUFDLFFBQVE7SUFDN0M7Ozs7O09BS0c7SUFDSCxZQUFZLE9BQWdCLEVBQUUsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsVUFBNkIsRUFBRTtRQUM1RixLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsQyx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IEFzc2VtYmx5IH0gZnJvbSBcIkBqc2lpL3NwZWNcIjtcbmltcG9ydCB7IFByb2plblN0cnVjdCwgU3RydWN0IH0gZnJvbSBcIkBtcmdyYWluL2pzaWktc3RydWN0LWJ1aWxkZXJcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgU291cmNlQ29kZU9wdGlvbnMsIHR5cGVzY3JpcHQgfSBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgKiBhcyBwcm9qZW4gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnRSZXNvbHV0aW9uRXJyb3IsXG4gICAgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yLFxuICAgIEludmFsaWRGaWxlUGF0aEVycm9yLFxuICAgIEludmFsaWRJbmRlbnRMZXZlbEVycm9yLFxuICAgIE1hbmlmZXN0TG9hZEVycm9yLFxufSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdFR5cGUgfSBmcm9tIFwiLi9wcm9qZWN0LXR5cGVcIjtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbXBvbmVudHMgYXBwbGllZCB0byBhbGwgZ2VuZXJhdGVkIHByb2plY3RzXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRDb21wb25lbnRzKCk6IENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgICB7IGNvbXBvbmVudENsYXNzOiByZXF1aXJlKFwiLi9jb21wb25lbnRzL21pc2VcIikuTWlzZSB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBjb21wb25lbnRDbGFzczogcmVxdWlyZShcIi4vY29tcG9uZW50cy92aXRlc3RcIikuVml0ZXN0LFxuICAgICAgICAgICAgb3B0aW9uc1Byb3BlcnR5OiB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJ2aXRlc3RPcHRpb25zXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJAbmlrb3ZpcnRhbGEvcHJvamVuLWNvbnN0cnVjdHMuVml0ZXN0T3B0aW9uc1wiLFxuICAgICAgICAgICAgICAgIGRvY3M6IFwiVml0ZXN0IGNvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgXTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIGNvbXBvbmVudCB0byBiZSBpbnRlZ3JhdGVkIGludG8gYSBnZW5lcmF0ZWQgcHJvamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50IGNsYXNzIHJlZmVyZW5jZVxuICAgICAqXG4gICAgICogQGpzaWkgaWdub3JlXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tcG9uZW50Q2xhc3M6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjb21wb25lbnQgY2xhc3NcbiAgICAgKlxuICAgICAqIE9wdGlvbmFsIC0gYXV0by1kZXRlY3RlZCBieSBzZWFyY2hpbmcgSlNJSSBtYW5pZmVzdHMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZnFuPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9ucyBwcm9wZXJ0eSBjb25maWd1cmF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBPcHRpb25hbCAtIGF1dG8tZGV0ZWN0ZWQgZnJvbSBjb21wb25lbnQgY29uc3RydWN0b3IuXG4gICAgICogU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgb3B0aW9ucyBwcm9wZXJ0eSBnZW5lcmF0aW9uLlxuICAgICAqIFNldCB0byBzdHJpbmcgb3Igb2JqZWN0IHRvIGN1c3RvbWl6ZSB0aGUgcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBvcHRpb25zUHJvcGVydHk/OiBzdHJpbmcgfCBDb21wb25lbnRPcHRpb25zIHwgZmFsc2U7XG59XG5cbi8qKlxuICogT3B0aW9ucyBwcm9wZXJ0eSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgb3B0aW9ucyBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lIChvcHRpb25hbCwgYXV0by1kZXRlY3RlZCBmcm9tIGNvbXBvbmVudCBjb25zdHJ1Y3RvcilcbiAgICAgKi9cbiAgICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gc3VtbWFyeSAob3B0aW9uYWwsIGF1dG8tZGV0ZWN0ZWQgZnJvbSBjb21wb25lbnQgY29uc3RydWN0b3IpXG4gICAgICovXG4gICAgcmVhZG9ubHkgZG9jcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBQcm9qZWN0R2VuZXJhdG9yIGNvbXBvbmVudFxuICpcbiAqIENvbmZpZ3VyZXMgdGhlIGdlbmVyYXRpb24gb2YgYSBUeXBlU2NyaXB0IHByb2plY3QgY2xhc3MgdGhhdCBleHRlbmRzIGEgUHJvamVuIGJhc2UgY2xhc3NcbiAqIHdpdGggc3RhbmRhcmQgY29uZmlndXJhdGlvbiBhbmQgY29tcG9uZW50IGludGVncmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RHZW5lcmF0b3JPcHRpb25zIGV4dGVuZHMgU291cmNlQ29kZU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGdlbmVyYXRlZCBjbGFzcyAoZS5nLiwgXCJUeXBlU2NyaXB0UHJvamVjdFwiKVxuICAgICAqXG4gICAgICogVGhlIG9wdGlvbnMgaW50ZXJmYWNlIHdpbGwgYmUgbmFtZWQgYCR7bmFtZX1PcHRpb25zYC5cbiAgICAgKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBQcm9qZWN0IHR5cGUgaWRlbnRpZmllclxuICAgICAqXG4gICAgICogU3BlY2lmaWVzIHdoaWNoIFByb2plbiBiYXNlIGNsYXNzIHRvIGV4dGVuZCBhbmQgd2hpY2ggZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIGFwcGx5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgUHJvamVjdFR5cGUuVFlQRVNDUklQVFxuICAgICAqIEBleGFtcGxlIFByb2plY3RUeXBlLkpTSUlcbiAgICAgKi9cbiAgICByZWFkb25seSBwcm9qZWN0VHlwZTogUHJvamVjdFR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBPdXRwdXQgZmlsZSBwYXRoIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzXG4gICAgICpcbiAgICAgKiBNdXN0IGNvbnRhaW4gYSBkaXJlY3Rvcnkgc2VwYXJhdG9yLiBUaGUgb3B0aW9ucyBpbnRlcmZhY2Ugd2lsbCBiZSBnZW5lcmF0ZWRcbiAgICAgKiBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd2l0aCBhIFwiLmdlbmVyYXRlZC50c1wiIHN1ZmZpeC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIFwic3JjL3Byb2plY3RzL3R5cGVzY3JpcHQuZ2VuZXJhdGVkLnRzXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50cyB0byBpbnRlZ3JhdGUgaW50byB0aGUgcHJvamVjdFxuICAgICAqXG4gICAgICogRWFjaCBjb21wb25lbnQgd2lsbCBiZSBpbnN0YW50aWF0ZWQgZHVyaW5nIHByb2plY3QgY29uc3RydWN0aW9uIGFuZCBjYW4gYmVcbiAgICAgKiBjb25maWd1cmVkIHZpYSBhbiBvcHRpb25hbCBvcHRpb25zIHByb3BlcnR5IGluIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgW3sgY29tcG9uZW50OiBNaXNlIH0sIHsgY29tcG9uZW50OiBWaXRlc3QsIG9wdGlvbnNQcm9wZXJ0eTogeyBuYW1lOiBcInZpdGVzdE9wdGlvbnNcIiwgdHlwZTogXCIuLi5cIiwgZG9jczogXCIuLi5cIiB9IH1dXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tcG9uZW50cz86IENvbXBvbmVudFtdO1xuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyB0byBleHRlbmQgdGhlIGJhc2Ugb3B0aW9ucyB3aXRoIGN1c3RvbSBwcm9wZXJ0aWVzIHNwZWNpZmljIHRvXG4gICAgICogeW91ciBwcm9qZWN0IHR5cGUuXG4gICAgICpcbiAgICAgKiBAanNpaSBpZ25vcmVcbiAgICAgKi9cbiAgICByZWFkb25seSBhZGRpdGlvbmFsT3B0aW9ucz86IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogUHJvcGVydHkgbmFtZXMgdG8gb21pdCBmcm9tIHRoZSBiYXNlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyB0byBoaWRlIGJhc2UgY2xhc3Mgb3B0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgY29uZmlndXJhYmxlXG4gICAgICogaW4gdGhlIGdlbmVyYXRlZCBwcm9qZWN0IHR5cGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgb21pdE9wdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBCdWZmZXIgZm9yIGJ1aWxkaW5nIGluZGVudGVkIGNvZGUgd2l0aCBhdXRvbWF0aWMgbGluZSBtYW5hZ2VtZW50XG4gKlxuICogTWFpbnRhaW5zIGluZGVudGF0aW9uIGxldmVsIGFuZCBwcm92aWRlcyBtZXRob2RzIGZvciBhZGRpbmcgbGluZXMsXG4gKiBvcGVuaW5nL2Nsb3NpbmcgYmxvY2tzLCBhbmQgZmx1c2hpbmcgYWNjdW11bGF0ZWQgY29udGVudC5cbiAqL1xuY2xhc3MgQ29kZUJ1ZmZlciB7XG4gICAgcHJpdmF0ZSBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIGluZGVudExldmVsID0gMDtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpbmRlbnQgLSBTdHJpbmcgdG8gdXNlIGZvciBlYWNoIGluZGVudGF0aW9uIGxldmVsIChkZWZhdWx0OiBzaW5nbGUgc3BhY2UpXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBpbmRlbnQgPSBcIiBcIikge31cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGFjY3VtdWxhdGVkIGxpbmVzIGFuZCByZXNldHMgdGhlIGJ1ZmZlclxuICAgICAqXG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY29kZSBsaW5lcyB3aXRoIHByb3BlciBpbmRlbnRhdGlvblxuICAgICAqL1xuICAgIGZsdXNoKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMubGluZXM7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpbmUgb2YgY29kZSBhdCB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvZGUgLSBDb2RlIHRvIGFkZCAob3B0aW9uYWwsIGFkZHMgYmxhbmsgbGluZSBpZiBvbWl0dGVkKVxuICAgICAqL1xuICAgIGxpbmUoY29kZT86IHN0cmluZykge1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLmluZGVudC5yZXBlYXQodGhpcy5pbmRlbnRMZXZlbCk7XG4gICAgICAgIHRoaXMubGluZXMucHVzaCgocHJlZml4ICsgKGNvZGUgPz8gXCJcIikpLnRyaW1FbmQoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSBuZXcgaW5kZW50YXRpb24gYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gT3B0aW9uYWwgY29kZSB0byBhZGQgYmVmb3JlIGluY3JlYXNpbmcgaW5kZW50IChlLmcuLCBvcGVuaW5nIGJyYWNlKVxuICAgICAqL1xuICAgIG9wZW4oY29kZT86IHN0cmluZykge1xuICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgdGhpcy5saW5lKGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwrKztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIC0gT3B0aW9uYWwgY29kZSB0byBhZGQgYWZ0ZXIgZGVjcmVhc2luZyBpbmRlbnQgKGUuZy4sIGNsb3NpbmcgYnJhY2UpXG4gICAgICogQHRocm93cyB7SW52YWxpZEluZGVudExldmVsRXJyb3J9IFdoZW4gYXR0ZW1wdGluZyB0byBkZWNyZWFzZSBpbmRlbnQgYmVsb3cgemVyb1xuICAgICAqL1xuICAgIGNsb3NlKGNvZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZW50TGV2ZWwgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSW5kZW50TGV2ZWxFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwtLTtcbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMubGluZShjb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGluaXRpYWwgc3RhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxpbmVzID0gW107XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwgPSAwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIFR5cGVTY3JpcHQgY2xhc3MgY29kZSBmcm9tIFByb2plY3RHZW5lcmF0b3Igb3B0aW9uc1xuICpcbiAqIEdlbmVyYXRlcyBhIGNvbXBsZXRlIFR5cGVTY3JpcHQgY2xhc3MgZmlsZSBpbmNsdWRpbmcgaW1wb3J0cywgb3B0aW9ucyBpbnRlcmZhY2UgZXhwb3J0LFxuICogY2xhc3MgZGVjbGFyYXRpb24sIGFuZCBjb25zdHJ1Y3RvciB3aXRoIGNvbXBvbmVudCBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBVc2VzIEpTSUkgbWFuaWZlc3QgaW50cm9zcGVjdGlvbiB0byB2YWxpZGF0ZSBiYXNlIGNsYXNzZXMgYW5kIG9wdGlvbnMgaW50ZXJmYWNlcy5cbiAqL1xuY2xhc3MgVHlwZVNjcmlwdENsYXNzUmVuZGVyZXIge1xuICAgIHByaXZhdGUgYnVmZmVyOiBDb2RlQnVmZmVyO1xuICAgIHB1YmxpYyBqc2lpTWFuaWZlc3Q6IEFzc2VtYmx5O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGluZGVudCAtIE51bWJlciBvZiBzcGFjZXMgcGVyIGluZGVudGF0aW9uIGxldmVsIChkZWZhdWx0OiA0KVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGluZGVudCA9IDQpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgQ29kZUJ1ZmZlcihcIiBcIi5yZXBlYXQoaW5kZW50KSk7XG4gICAgICAgIC8qIExvYWQgUHJvamVuJ3MgSlNJSSBtYW5pZmVzdCBmb3IgYmFzZSBjbGFzcyBpbnRyb3NwZWN0aW9uICovXG4gICAgICAgIGNvbnN0IHByb2plblBhY2thZ2VKc29uID0gcmVxdWlyZS5yZXNvbHZlKFwicHJvamVuL3BhY2thZ2UuanNvblwiKTtcbiAgICAgICAgY29uc3QgcHJvamVuUm9vdCA9IGRpcm5hbWUocHJvamVuUGFja2FnZUpzb24pO1xuICAgICAgICBjb25zdCBqc2lpUGF0aCA9IGpvaW4ocHJvamVuUm9vdCwgXCIuanNpaVwiKTtcbiAgICAgICAgdGhpcy5qc2lpTWFuaWZlc3QgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhqc2lpUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBjb21wbGV0ZSBUeXBlU2NyaXB0IGNsYXNzIGNvZGUgZnJvbSBvcHRpb25zXG4gICAgICpcbiAgICAgKiBPcmNoZXN0cmF0ZXMgdGhlIHJlbmRlcmluZyBwcm9jZXNzOiBkZXJpdmVzIG5hbWVzLCBleHRyYWN0cyBjb21wb25lbnQgY29uZmlndXJhdGlvbixcbiAgICAgKiBidWlsZHMgaW1wb3J0IHN0YXRlbWVudHMsIGFuZCByZW5kZXJzIHRoZSBjbGFzcyBzdHJ1Y3R1cmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICogQHJldHVybnMgQ29tcGxldGUgVHlwZVNjcmlwdCBjbGFzcyBjb2RlIGFzIGEgc3RyaW5nXG4gICAgICovXG4gICAgcmVuZGVyKG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgdGhpcy5idWZmZXIuZmx1c2goKTtcblxuICAgICAgICAvKiBEZXJpdmUgaW50ZXJmYWNlIGFuZCB0eXBlIG5hbWVzIGZyb20gdGhlIGNsYXNzIG5hbWUgKi9cbiAgICAgICAgY29uc3Qgb3B0aW9uc0ludGVyZmFjZSA9IGAke29wdGlvbnMubmFtZX1PcHRpb25zYDtcbiAgICAgICAgY29uc3QgYmFzZU9wdGlvbnNGcW4gPSB0aGlzLmdldEJhc2VPcHRpb25zRnFuKG9wdGlvbnMucHJvamVjdFR5cGUpO1xuICAgICAgICBjb25zdCBiYXNlT3B0aW9uc1R5cGUgPSBiYXNlT3B0aW9uc0Zxbi5yZXBsYWNlKC9ecHJvamVuXFwuLywgXCJcIik7XG5cbiAgICAgICAgLyogVXNlIHByb3ZpZGVkIGNvbXBvbmVudHMgb3IgZmFsbCBiYWNrIHRvIGRlZmF1bHRzIChNaXNlICsgVml0ZXN0KSAqL1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gb3B0aW9ucy5jb21wb25lbnRzID8/IGdldERlZmF1bHRDb21wb25lbnRzKCk7XG5cbiAgICAgICAgLyogRXh0cmFjdCBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmb3IgY29uc3RydWN0b3IgZ2VuZXJhdGlvbiAqL1xuICAgICAgICBjb25zdCB7IGRlc3RydWN0dXJlLCBjb21wb25lbnRBcnJheSB9ID0gdGhpcy5leHRyYWN0Q29tcG9uZW50T3B0aW9ucyhjb21wb25lbnRzKTtcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IHRoaXMuZXh0cmFjdEltcG9ydHMob3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZSk7XG5cbiAgICAgICAgLyogUmVuZGVyIGFsbCBzZWN0aW9ucyBvZiB0aGUgY2xhc3MgZmlsZSAqL1xuICAgICAgICB0aGlzLnJlbmRlckltcG9ydHMoaW1wb3J0cyk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJFeHBvcnQob3B0aW9uc0ludGVyZmFjZSk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJDbGFzcyhvcHRpb25zLCBvcHRpb25zSW50ZXJmYWNlLCBiYXNlT3B0aW9uc1R5cGUsIGRlc3RydWN0dXJlLCBjb21wb25lbnRBcnJheSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmZsdXNoKCkuam9pbihcIlxcblwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXJpdmVzIHRoZSBmdWxseSBxdWFsaWZpZWQgb3B0aW9ucyBpbnRlcmZhY2UgbmFtZSBmcm9tIHByb2plY3QgdHlwZVxuICAgICAqXG4gICAgICogVHJhbnNmb3JtcyBwcm9qZWN0IHR5cGUgaW50byB0aGUgY29ycmVzcG9uZGluZyBQcm9qZW4gb3B0aW9ucyBpbnRlcmZhY2UgbmFtZVxuICAgICAqIGJ5IGFwcGVuZGluZyBcIk9wdGlvbnNcIiBzdWZmaXggYW5kIHByZWZpeGluZyB3aXRoIFwicHJvamVuLlwiIG5hbWVzcGFjZS5cbiAgICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgYmFzZSBjbGFzcyBleGlzdHMgaW4gUHJvamVuJ3MgSlNJSSBtYW5pZmVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0VHlwZSAtIFByb2plY3QgdHlwZSBpZGVudGlmaWVyXG4gICAgICogQHJldHVybnMgRnVsbHkgcXVhbGlmaWVkIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWVcbiAgICAgKiBAdGhyb3dzIHtJbnZhbGlkQmFzZUNsYXNzRm9ybWF0RXJyb3J9IFdoZW4gcHJvamVjdFR5cGUgZm9ybWF0IGlzIGludmFsaWQgb3IgY2xhc3Mgbm90IGZvdW5kXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGdldEJhc2VPcHRpb25zRnFuKFByb2plY3RUeXBlLlRZUEVTQ1JJUFQpIC8vIFwicHJvamVuLnR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RPcHRpb25zXCJcbiAgICAgKiBnZXRCYXNlT3B0aW9uc0ZxbihQcm9qZWN0VHlwZS5KU0lJKSAvLyBcInByb2plbi5jZGsuSnNpaVByb2plY3RPcHRpb25zXCJcbiAgICAgKi9cbiAgICBnZXRCYXNlT3B0aW9uc0Zxbihwcm9qZWN0VHlwZTogUHJvamVjdFR5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBiYXNlQ2xhc3MgPSBwcm9qZWN0VHlwZS52YWx1ZU9mKCk7XG4gICAgICAgIC8qIFZhbGlkYXRlIGJhc2UgY2xhc3MgZm9ybWF0OiBtdXN0IGNvbnRhaW4gbW9kdWxlLkNsYXNzTmFtZSBzdHJ1Y3R1cmUgKi9cbiAgICAgICAgaWYgKCFiYXNlQ2xhc3MuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEJhc2VDbGFzc0Zvcm1hdEVycm9yKGJhc2VDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNlQ2xhc3NGcW4gPSBgcHJvamVuLiR7YmFzZUNsYXNzfWA7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNGcW4gPSBgJHtiYXNlQ2xhc3NGcW59T3B0aW9uc2A7XG5cbiAgICAgICAgLyogVmFsaWRhdGUgYmFzZSBjbGFzcyBleGlzdHMgaW4gSlNJSSBtYW5pZmVzdCAqL1xuICAgICAgICBpZiAoIXRoaXMuanNpaU1hbmlmZXN0LnR5cGVzPy5bYmFzZUNsYXNzRnFuXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRCYXNlQ2xhc3NGb3JtYXRFcnJvcihgQmFzZSBjbGFzcyBub3QgZm91bmQgaW4gSlNJSSBtYW5pZmVzdDogJHtiYXNlQ2xhc3NGcW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBWYWxpZGF0ZSBvcHRpb25zIGludGVyZmFjZSBleGlzdHMgaW4gSlNJSSBtYW5pZmVzdCAqL1xuICAgICAgICBpZiAoIXRoaXMuanNpaU1hbmlmZXN0LnR5cGVzPy5bb3B0aW9uc0Zxbl0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQmFzZUNsYXNzRm9ybWF0RXJyb3IoYE9wdGlvbnMgaW50ZXJmYWNlIG5vdCBmb3VuZCBpbiBKU0lJIG1hbmlmZXN0OiAke29wdGlvbnNGcW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9uc0ZxbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmb3IgY29uc3RydWN0b3IgY29kZSBnZW5lcmF0aW9uXG4gICAgICpcbiAgICAgKiBUcmFuc2Zvcm1zIGNvbXBvbmVudCBjb25maWd1cmF0aW9ucyBpbnRvOlxuICAgICAqIDEuIERlc3RydWN0dXJlIGxpc3Q6IHZhcmlhYmxlIG5hbWVzIHRvIGV4dHJhY3QgZnJvbSBvcHRpb25zXG4gICAgICogMi4gQ29tcG9uZW50IGFycmF5OiBjb2RlIHN0cmluZyBmb3IgYXBwbHlEZWZhdWx0cygpIGNhbGxcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb21wb25lbnRzIC0gQ29tcG9uZW50IGNvbmZpZ3VyYXRpb25zXG4gICAgICogQHJldHVybnMgT2JqZWN0IHdpdGggZGVzdHJ1Y3R1cmUgYXJyYXkgYW5kIGNvbXBvbmVudEFycmF5IGNvZGUgc3RyaW5nXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIElucHV0OiBbeyBjb21wb25lbnQ6IFZpdGVzdCwgb3B0aW9uc1Byb3BlcnR5OiB7IG5hbWU6IFwidml0ZXN0T3B0aW9uc1wiLCAuLi4gfSB9XVxuICAgICAqIE91dHB1dDoge1xuICAgICAqICAgZGVzdHJ1Y3R1cmU6IFtcInZpdGVzdFwiLCBcInZpdGVzdE9wdGlvbnNcIl0sXG4gICAgICogICBjb21wb25lbnRBcnJheTogXCJbeyBjb21wb25lbnQ6IFZpdGVzdCwgZW5hYmxlZDogdml0ZXN0LCBvcHRpb25zOiB2aXRlc3RPcHRpb25zIH1dXCJcbiAgICAgKiB9XG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0Q29tcG9uZW50T3B0aW9ucyhjb21wb25lbnRzOiBDb21wb25lbnRbXSk6IHsgZGVzdHJ1Y3R1cmU6IHN0cmluZ1tdOyBjb21wb25lbnRBcnJheTogc3RyaW5nIH0ge1xuICAgICAgICBjb25zdCBkZXN0cnVjdHVyZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIC8qIENvbnZlcnQgY29tcG9uZW50IGNsYXNzIG5hbWUgdG8gY2FtZWxDYXNlIHZhcmlhYmxlIG5hbWUgKGUuZy4sIFZpdGVzdCAtPiB2aXRlc3QpICovXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gYy5jb21wb25lbnRDbGFzcy5uYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgYy5jb21wb25lbnRDbGFzcy5uYW1lLnNsaWNlKDEpO1xuICAgICAgICAgICAgZGVzdHJ1Y3R1cmUucHVzaChuYW1lKTtcblxuICAgICAgICAgICAgLyogQnVpbGQgY29tcG9uZW50IGNvbmZpZyBvYmplY3QgZm9yIGFwcGx5RGVmYXVsdHMoKSBjYWxsICovXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFtgY29tcG9uZW50OiAke2MuY29tcG9uZW50Q2xhc3MubmFtZX1gXTtcbiAgICAgICAgICAgIGlmIChjLm9wdGlvbnNQcm9wZXJ0eSAmJiB0eXBlb2YgYy5vcHRpb25zUHJvcGVydHkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgICAgLyogQ29tcG9uZW50IGhhcyBjb25maWd1cmFibGUgb3B0aW9ucyAtIGluY2x1ZGUgYm90aCBlbmFibGVkIGZsYWcgYW5kIG9wdGlvbnMgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVvZiBjLm9wdGlvbnNQcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIiA/IGMub3B0aW9uc1Byb3BlcnR5IDogYy5vcHRpb25zUHJvcGVydHkubmFtZTtcbiAgICAgICAgICAgICAgICBkZXN0cnVjdHVyZS5wdXNoKHByb3BOYW1lKTtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbmFibGVkOiAke25hbWV9YCwgYG9wdGlvbnM6ICR7cHJvcE5hbWV9YCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8qIENvbXBvbmVudCBoYXMgbm8gb3B0aW9ucyAtIG9ubHkgaW5jbHVkZSBlbmFibGVkIGZsYWcgKi9cbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbmFibGVkOiAke25hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnRQYXJ0cy5wdXNoKGB7ICR7cGFydHMuam9pbihcIiwgXCIpfSB9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBkZXN0cnVjdHVyZSwgY29tcG9uZW50QXJyYXk6IGBbJHtjb21wb25lbnRQYXJ0cy5qb2luKFwiLCBcIil9XWAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgaW1wb3J0IHN0YXRlbWVudHMgbWFwIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzXG4gICAgICpcbiAgICAgKiBDb2xsZWN0cyBhbGwgcmVxdWlyZWQgaW1wb3J0czpcbiAgICAgKiAtIFByb2plbiBiYXNlIG1vZHVsZSAodHlwZXNjcmlwdCwgY2RrLCBhd3NjZGspXG4gICAgICogLSBDb25maWcgdXRpbGl0aWVzIChhcHBseURlZmF1bHRzLCBkZWZhdWx0T3B0aW9ucylcbiAgICAgKiAtIENvbXBvbmVudCBjbGFzc2VzXG4gICAgICogLSBVdGlsaXR5IGZ1bmN0aW9ucyAoZGVlcE1lcmdlKVxuICAgICAqIC0gR2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlICh0eXBlLW9ubHkgaW1wb3J0KVxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBHZW5lcmF0b3IgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gTmFtZSBvZiB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHJldHVybnMgTWFwIG9mIG1vZHVsZSBwYXRocyB0byBzZXRzIG9mIGltcG9ydGVkIG5hbWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0SW1wb3J0cyhvcHRpb25zOiBQcm9qZWN0R2VuZXJhdG9yT3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZTogc3RyaW5nKTogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+IHtcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICAgICAgICAvKiBFeHRyYWN0IGJhc2UgbW9kdWxlIG5hbWUgZnJvbSBwcm9qZWN0VHlwZSAoZS5nLiwgXCJ0eXBlc2NyaXB0XCIgZnJvbSBcInR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RcIikgKi9cbiAgICAgICAgY29uc3QgYmFzZU1vZHVsZSA9IG9wdGlvbnMucHJvamVjdFR5cGUudmFsdWVPZigpLnNwbGl0KFwiLlwiKVswXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVOYW1lID0gdGhpcy5nZXRPcHRpb25zRmlsZU5hbWUob3B0aW9uc0ludGVyZmFjZSk7XG5cbiAgICAgICAgLyogUHJvamVuIGJhc2UgbW9kdWxlIGltcG9ydCAqL1xuICAgICAgICBpbXBvcnRzLnNldChcInByb2plblwiLCBuZXcgU2V0KFtiYXNlTW9kdWxlXSkpO1xuXG4gICAgICAgIC8qIENvbmZpZ3VyYXRpb24gdXRpbGl0aWVzIGltcG9ydCAqL1xuICAgICAgICBpbXBvcnRzLnNldChcIi4uL2NvbmZpZ1wiLCBuZXcgU2V0KFtcImFwcGx5RGVmYXVsdHNcIiwgXCJkZWZhdWx0T3B0aW9uc1wiXSkpO1xuXG4gICAgICAgIC8qIENvbXBvbmVudCBjbGFzcyBpbXBvcnRzIC0gZGVyaXZlIG1vZHVsZSBwYXRoIGZyb20gY29tcG9uZW50IGNsYXNzIG5hbWUgKi9cbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IG9wdGlvbnMuY29tcG9uZW50cyA/PyBnZXREZWZhdWx0Q29tcG9uZW50cygpO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGMuY29tcG9uZW50Q2xhc3MubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSBgLi4vY29tcG9uZW50cy8ke2NvbXBvbmVudE5hbWUudG9Mb3dlckNhc2UoKX1gO1xuICAgICAgICAgICAgaWYgKCFpbXBvcnRzLmhhcyhtb2R1bGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIGltcG9ydHMuc2V0KG1vZHVsZVBhdGgsIG5ldyBTZXQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtb2R1bGVJbXBvcnRzID0gaW1wb3J0cy5nZXQobW9kdWxlUGF0aCk7XG4gICAgICAgICAgICBpZiAobW9kdWxlSW1wb3J0cykge1xuICAgICAgICAgICAgICAgIG1vZHVsZUltcG9ydHMuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyogVXRpbGl0eSBmdW5jdGlvbnMgaW1wb3J0ICovXG4gICAgICAgIGltcG9ydHMuc2V0KFwiLi4vdXRpbHNcIiwgbmV3IFNldChbXCJkZWVwTWVyZ2VcIl0pKTtcblxuICAgICAgICAvKiBHZW5lcmF0ZWQgb3B0aW9ucyBpbnRlcmZhY2UgaW1wb3J0ICh0eXBlLW9ubHkgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzKSAqL1xuICAgICAgICBpbXBvcnRzLnNldChgLi8ke29wdGlvbnNGaWxlTmFtZX0uZ2VuZXJhdGVkYCwgbmV3IFNldChbb3B0aW9uc0ludGVyZmFjZV0pKTtcblxuICAgICAgICByZXR1cm4gaW1wb3J0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXJpdmVzIHRoZSBjb25maWcgcGF0aCBmb3IgYWNjZXNzaW5nIGRlZmF1bHQgb3B0aW9uc1xuICAgICAqXG4gICAgICogVHJhbnNmb3JtcyBwcm9qZWN0IHR5cGUgaW50byB0aGUgY29ycmVzcG9uZGluZyBwYXRoIGluIHRoZSBkZWZhdWx0T3B0aW9uc1xuICAgICAqIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGV4cG9ydGVkIGZyb20gY29uZmlnLnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2plY3RUeXBlIC0gUHJvamVjdCB0eXBlIGlkZW50aWZpZXJcbiAgICAgKiBAcmV0dXJucyBDb25maWcgcGF0aCBmb3IgYWNjZXNzaW5nIGRlZmF1bHQgb3B0aW9uc1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBnZXRDb25maWdQYXRoKFByb2plY3RUeXBlLlRZUEVTQ1JJUFQpIC8vIFwiZGVmYXVsdE9wdGlvbnMudHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFwiXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRDb25maWdQYXRoKHByb2plY3RUeXBlOiBQcm9qZWN0VHlwZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgZGVmYXVsdE9wdGlvbnMuJHtwcm9qZWN0VHlwZS52YWx1ZU9mKCl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIGltcG9ydCBzdGF0ZW1lbnRzIGluIHNvcnRlZCBvcmRlclxuICAgICAqXG4gICAgICogU29ydHMgaW1wb3J0cyB3aXRoIGV4dGVybmFsIHBhY2thZ2VzIGZpcnN0LCB0aGVuIHJlbGF0aXZlIGltcG9ydHMuXG4gICAgICogVXNlcyB0eXBlLW9ubHkgaW1wb3J0cyBmb3IgZ2VuZXJhdGVkIGZpbGVzIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbXBvcnRzIC0gTWFwIG9mIG1vZHVsZSBwYXRocyB0byBpbXBvcnRlZCBuYW1lc1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVuZGVySW1wb3J0cyhpbXBvcnRzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4pIHtcbiAgICAgICAgLyogU29ydCBtb2R1bGVzOiBleHRlcm5hbCBwYWNrYWdlcyBmaXJzdCwgdGhlbiByZWxhdGl2ZSBpbXBvcnRzIGFscGhhYmV0aWNhbGx5ICovXG4gICAgICAgIGNvbnN0IHNvcnRlZE1vZHVsZXMgPSBBcnJheS5mcm9tKGltcG9ydHMua2V5cygpKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhSXNSZWxhdGl2ZSA9IGEuc3RhcnRzV2l0aChcIi5cIik7XG4gICAgICAgICAgICBjb25zdCBiSXNSZWxhdGl2ZSA9IGIuc3RhcnRzV2l0aChcIi5cIik7XG4gICAgICAgICAgICBpZiAoYUlzUmVsYXRpdmUgIT09IGJJc1JlbGF0aXZlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFJc1JlbGF0aXZlID8gMSA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBtb2Qgb2Ygc29ydGVkTW9kdWxlcykge1xuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBBcnJheS5mcm9tKGltcG9ydHMuZ2V0KG1vZCkgfHwgW10pLnNvcnQoKTtcbiAgICAgICAgICAgIC8qIFVzZSB0eXBlLW9ubHkgaW1wb3J0IGZvciBnZW5lcmF0ZWQgZmlsZXMgdG8gcHJldmVudCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgKi9cbiAgICAgICAgICAgIGNvbnN0IGlzVHlwZU9ubHkgPSBtb2QuaW5jbHVkZXMoXCIuZ2VuZXJhdGVkXCIpO1xuICAgICAgICAgICAgY29uc3QgaW1wb3J0U3RtdCA9IGlzVHlwZU9ubHkgPyBcImltcG9ydCB0eXBlXCIgOiBcImltcG9ydFwiO1xuICAgICAgICAgICAgdGhpcy5idWZmZXIubGluZShgJHtpbXBvcnRTdG10fSB7ICR7bmFtZXMuam9pbihcIiwgXCIpfSB9IGZyb20gXCIke21vZH1cIjtgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlcnMgcmUtZXhwb3J0IHN0YXRlbWVudCBmb3IgdGhlIGdlbmVyYXRlZCBvcHRpb25zIGludGVyZmFjZVxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnNJbnRlcmZhY2UgLSBOYW1lIG9mIHRoZSBvcHRpb25zIGludGVyZmFjZSB0byBleHBvcnRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbmRlckV4cG9ydChvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVOYW1lID0gdGhpcy5nZXRPcHRpb25zRmlsZU5hbWUob3B0aW9uc0ludGVyZmFjZSk7XG4gICAgICAgIC8qIHR5cGUtb25seSByZS1leHBvcnQsIHJlcXVpcmVkIGJ5IGBpc29sYXRlZE1vZHVsZXNgICovXG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYGV4cG9ydCB0eXBlIHsgJHtvcHRpb25zSW50ZXJmYWNlfSB9IGZyb20gXCIuLyR7b3B0aW9uc0ZpbGVOYW1lfS5nZW5lcmF0ZWRcIjtgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHRoZSBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgY29uc3RydWN0b3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gR2VuZXJhdG9yIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHBhcmFtIGJhc2VPcHRpb25zVHlwZSAtIEJhc2Ugb3B0aW9ucyB0eXBlIHdpdGhvdXQgXCJwcm9qZW4uXCIgcHJlZml4XG4gICAgICogQHBhcmFtIGRlc3RydWN0dXJlIC0gVmFyaWFibGUgbmFtZXMgdG8gZGVzdHJ1Y3R1cmUgZnJvbSBvcHRpb25zXG4gICAgICogQHBhcmFtIGNvbXBvbmVudEFycmF5IC0gQ29kZSBzdHJpbmcgZm9yIGNvbXBvbmVudCBhcnJheVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVuZGVyQ2xhc3MoXG4gICAgICAgIG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zLFxuICAgICAgICBvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcsXG4gICAgICAgIGJhc2VPcHRpb25zVHlwZTogc3RyaW5nLFxuICAgICAgICBkZXN0cnVjdHVyZTogc3RyaW5nW10sXG4gICAgICAgIGNvbXBvbmVudEFycmF5OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKipcIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYCAqICR7b3B0aW9ucy5uYW1lfSB3aXRoIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gYW5kIGNvbXBvbmVudCBpbnRlZ3JhdGlvbmApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiICpcIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKiBFeHRlbmRzIFByb2plbidzIGJhc2UgY2xhc3Mgd2l0aCBvcGluaW9uYXRlZCBkZWZhdWx0cyBhbmQgYXV0b21hdGljIGNvbXBvbmVudCBzZXR1cC5cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKi9cIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLm9wZW4oYGV4cG9ydCBjbGFzcyAke29wdGlvbnMubmFtZX0gZXh0ZW5kcyAke29wdGlvbnMucHJvamVjdFR5cGUudmFsdWVPZigpfSB7YCk7XG4gICAgICAgIHRoaXMucmVuZGVyQ29uc3RydWN0b3Iob3B0aW9ucywgb3B0aW9uc0ludGVyZmFjZSwgYmFzZU9wdGlvbnNUeXBlLCBkZXN0cnVjdHVyZSwgY29tcG9uZW50QXJyYXkpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5jbG9zZShcIn1cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyB0aGUgY29uc3RydWN0b3IgaW1wbGVtZW50YXRpb25cbiAgICAgKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvcjpcbiAgICAgKiAxLiBEZXN0cnVjdHVyZXMgY29tcG9uZW50IGZsYWdzIGFuZCBvcHRpb25zIGZyb20gdGhlIG9wdGlvbnMgcGFyYW1ldGVyXG4gICAgICogMi4gTWVyZ2VzIGRlZmF1bHQgY29uZmlndXJhdGlvbiB3aXRoIHVzZXItcHJvdmlkZWQgb3B0aW9uc1xuICAgICAqIDMuIENhbGxzIHN1cGVyKCkgd2l0aCBtZXJnZWQgb3B0aW9uc1xuICAgICAqIDQuIEFwcGxpZXMgY29tcG9uZW50IGRlZmF1bHRzIHZpYSBhcHBseURlZmF1bHRzKClcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gR2VuZXJhdG9yIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcGFyYW0gb3B0aW9uc0ludGVyZmFjZSAtIE5hbWUgb2YgdGhlIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICogQHBhcmFtIGJhc2VPcHRpb25zVHlwZSAtIEJhc2Ugb3B0aW9ucyB0eXBlIHdpdGhvdXQgXCJwcm9qZW4uXCIgcHJlZml4XG4gICAgICogQHBhcmFtIGRlc3RydWN0dXJlIC0gVmFyaWFibGUgbmFtZXMgdG8gZGVzdHJ1Y3R1cmUgZnJvbSBvcHRpb25zXG4gICAgICogQHBhcmFtIGNvbXBvbmVudEFycmF5IC0gQ29kZSBzdHJpbmcgZm9yIGNvbXBvbmVudCBhcnJheVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVuZGVyQ29uc3RydWN0b3IoXG4gICAgICAgIG9wdGlvbnM6IFByb2plY3RHZW5lcmF0b3JPcHRpb25zLFxuICAgICAgICBvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcsXG4gICAgICAgIGJhc2VPcHRpb25zVHlwZTogc3RyaW5nLFxuICAgICAgICBkZXN0cnVjdHVyZTogc3RyaW5nW10sXG4gICAgICAgIGNvbXBvbmVudEFycmF5OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmdldENvbmZpZ1BhdGgob3B0aW9ucy5wcm9qZWN0VHlwZSk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKipcIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIgKiBAcGFyYW0gb3B0aW9ucyAtIFByb2plY3QgY29uZmlndXJhdGlvblwiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIiAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIub3BlbihgY29uc3RydWN0b3Iob3B0aW9uczogJHtvcHRpb25zSW50ZXJmYWNlfSkge2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKFwiLyogU2VwYXJhdGUgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gZnJvbSBiYXNlIFByb2plbiBvcHRpb25zICovXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGBjb25zdCB7ICR7ZGVzdHJ1Y3R1cmUuam9pbihcIiwgXCIpfSwgLi4uYmFzZU9wdGlvbnMgfSA9IG9wdGlvbnM7YCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShcIi8qIE1lcmdlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB3aXRoIHVzZXIgb3B0aW9ucyBhbmQgaW5pdGlhbGl6ZSBiYXNlIGNsYXNzICovXCIpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKGBzdXBlcihkZWVwTWVyZ2U8JHtiYXNlT3B0aW9uc1R5cGV9Pigke2NvbmZpZ1BhdGh9LCBiYXNlT3B0aW9ucykpO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCIvKiBBcHBseSBjb21wb25lbnQgZGVmYXVsdHMgYW5kIGluc3RhbnRpYXRlIGVuYWJsZWQgY29tcG9uZW50cyAqL1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgYXBwbHlEZWZhdWx0cyh0aGlzLCAke2NvbXBvbmVudEFycmF5fSk7YCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmNsb3NlKFwifVwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIG9wdGlvbnMgaW50ZXJmYWNlIG5hbWUgdG8gZmlsZSBuYW1lXG4gICAgICpcbiAgICAgKiBDb252ZXJ0cyBQYXNjYWxDYXNlIGludGVyZmFjZSBuYW1lcyB0byBrZWJhYi1jYXNlIGZpbGUgbmFtZXMuXG4gICAgICogRmFsbHMgYmFjayB0byBsb3dlcmNhc2UgY29udmVyc2lvbiBmb3IgdW5tYXBwZWQgaW50ZXJmYWNlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gT3B0aW9ucyBpbnRlcmZhY2UgbmFtZVxuICAgICAqIEByZXR1cm5zIEtlYmFiLWNhc2UgZmlsZSBuYW1lIHdpdGhvdXQgZXh0ZW5zaW9uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGdldE9wdGlvbnNGaWxlTmFtZShcIlR5cGVTY3JpcHRQcm9qZWN0T3B0aW9uc1wiKSAvLyBcInR5cGVzY3JpcHQtb3B0aW9uc1wiXG4gICAgICovXG4gICAgZ2V0T3B0aW9uc0ZpbGVOYW1lKG9wdGlvbnNJbnRlcmZhY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICBUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnM6IFwidHlwZXNjcmlwdC1vcHRpb25zXCIsXG4gICAgICAgICAgICBKc2lpUHJvamVjdE9wdGlvbnM6IFwianNpaS1vcHRpb25zXCIsXG4gICAgICAgICAgICBBd3NDZGtUeXBlU2NyaXB0QXBwUHJvamVjdE9wdGlvbnM6IFwiYXdzY2RrLXR5cGVzY3JpcHQtYXBwLW9wdGlvbnNcIixcbiAgICAgICAgICAgIEF3c0Nka0NvbnN0cnVjdExpYnJhcnlQcm9qZWN0T3B0aW9uczogXCJhd3NjZGstY29uc3RydWN0LWxpYnJhcnktb3B0aW9uc1wiLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbWFwcGluZ1tvcHRpb25zSW50ZXJmYWNlXSB8fCBvcHRpb25zSW50ZXJmYWNlLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFByb2plbiBjb21wb25lbnQgdGhhdCBnZW5lcmF0ZXMgVHlwZVNjcmlwdCBwcm9qZWN0IGNsYXNzZXMgd2l0aCBzdGFuZGFyZCBjb25maWd1cmF0aW9uXG4gKlxuICogVGhpcyBjb21wb25lbnQgYXV0b21hdGVzIHRoZSBjcmVhdGlvbiBvZiBwcm9qZWN0IGNsYXNzZXMgdGhhdCBleHRlbmQgUHJvamVuIGJhc2UgY2xhc3Nlc1xuICogd2l0aCBvcGluaW9uYXRlZCBkZWZhdWx0cyBhbmQgY29tcG9uZW50IGludGVncmF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUHJvamVjdEdlbmVyYXRvciBleHRlbmRzIHByb2plbi5Db21wb25lbnQge1xuICAgIHByaXZhdGUgcmVuZGVyZXI6IFR5cGVTY3JpcHRDbGFzc1JlbmRlcmVyO1xuICAgIHByaXZhdGUgc3RhdGljIGVudW1HZW5lcmF0ZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0IC0gUHJvamVuIHByb2plY3QgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEdlbmVyYXRvciBjb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogUHJvamVjdEdlbmVyYXRvck9wdGlvbnMsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKHByb2plY3QpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFR5cGVTY3JpcHRDbGFzc1JlbmRlcmVyKCk7XG5cbiAgICAgICAgLyogR2VuZXJhdGUgUHJvamVjdFR5cGUgZW51bSBvbmNlIG9uIGZpcnN0IGluc3RhbnRpYXRpb24gKi9cbiAgICAgICAgaWYgKCFQcm9qZWN0R2VuZXJhdG9yLmVudW1HZW5lcmF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9qZWN0VHlwZUVudW0oKTtcbiAgICAgICAgICAgIFByb2plY3RHZW5lcmF0b3IuZW51bUdlbmVyYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBHZW5lcmF0ZSB0aGUgb3B0aW9ucyBpbnRlcmZhY2UgdXNpbmcgUHJvamVuU3RydWN0IGZvciBKU0lJIGNvbXBhdGliaWxpdHkgKi9cbiAgICAgICAgY29uc3Qgb3B0aW9uc0ludGVyZmFjZSA9IGAke29wdGlvbnMubmFtZX1PcHRpb25zYDtcbiAgICAgICAgY29uc3QgYmFzZU9wdGlvbnNGcW4gPSB0aGlzLnJlbmRlcmVyLmdldEJhc2VPcHRpb25zRnFuKG9wdGlvbnMucHJvamVjdFR5cGUpO1xuICAgICAgICBjb25zdCBvcHRpb25zRmlsZVBhdGggPSB0aGlzLmdldE9wdGlvbnNGaWxlUGF0aChvcHRpb25zSW50ZXJmYWNlKTtcblxuICAgICAgICAvKiBQcm9qZW5TdHJ1Y3QgZ2VuZXJhdGVzIGEgY29uY3JldGUgVHlwZVNjcmlwdCBpbnRlcmZhY2UgZnJvbSBQcm9qZW4ncyBvcHRpb25zXG4gICAgICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgSlNJSSBkb2Vzbid0IHN1cHBvcnQgVHlwZVNjcmlwdCB1dGlsaXR5IHR5cGVzIGxpa2UgT21pdDw+XG4gICAgICAgICAqIFRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlIGNhbiBiZSBjb25zdW1lZCBieSBvdGhlciBsYW5ndWFnZXMgKFB5dGhvbiwgSmF2YSwgQyMsIEdvKSAqL1xuICAgICAgICBjb25zdCBzdHJ1Y3QgPSBuZXcgUHJvamVuU3RydWN0KHRoaXMuYXNUeXBlU2NyaXB0UHJvamVjdChwcm9qZWN0KSwge1xuICAgICAgICAgICAgbmFtZTogb3B0aW9uc0ludGVyZmFjZSxcbiAgICAgICAgICAgIGZpbGVQYXRoOiBvcHRpb25zRmlsZVBhdGgsXG4gICAgICAgICAgICBvdXRwdXRGaWxlT3B0aW9uczogeyByZWFkb25seTogdHJ1ZSB9LFxuICAgICAgICB9KVxuICAgICAgICAgICAgLm1peGluKFN0cnVjdC5mcm9tRnFuKGJhc2VPcHRpb25zRnFuKSlcbiAgICAgICAgICAgIC53aXRob3V0RGVwcmVjYXRlZCgpO1xuXG4gICAgICAgIC8qIFJlbW92ZSBzcGVjaWZpZWQgb3B0aW9ucyBmcm9tIHRoZSBiYXNlIGludGVyZmFjZSAqL1xuICAgICAgICBpZiAob3B0aW9ucy5vbWl0T3B0aW9ucykge1xuICAgICAgICAgICAgc3RydWN0Lm9taXQoLi4ub3B0aW9ucy5vbWl0T3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBBZGQgY29tcG9uZW50LWRlcml2ZWQgb3B0aW9ucyB0byB0aGUgaW50ZXJmYWNlICovXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBvcHRpb25zLmNvbXBvbmVudHMgPz8gZ2V0RGVmYXVsdENvbXBvbmVudHMoKTtcbiAgICAgICAgY29uc3QgeyBQcmltaXRpdmVUeXBlIH0gPSByZXF1aXJlKFwiQGpzaWkvc3BlY1wiKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGMuY29tcG9uZW50Q2xhc3MubmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIGMuY29tcG9uZW50Q2xhc3MubmFtZS5zbGljZSgxKTtcblxuICAgICAgICAgICAgLyogQWRkIGVuYWJsZWQgZmxhZyBmb3IgdGhlIGNvbXBvbmVudCAqL1xuICAgICAgICAgICAgc3RydWN0LmFkZCh7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB7IHByaW1pdGl2ZTogUHJpbWl0aXZlVHlwZS5Cb29sZWFuIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgZG9jczoge1xuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgRW5hYmxlICR7Yy5jb21wb25lbnRDbGFzcy5uYW1lfSBjb21wb25lbnRgLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBcInRydWVcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIEFkZCBvcHRpb25zIHByb3BlcnR5IGlmIGNvbXBvbmVudCBpcyBjb25maWd1cmFibGUgKi9cbiAgICAgICAgICAgIGlmIChjLm9wdGlvbnNQcm9wZXJ0eSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zVHlwZSA9IHRoaXMucmVzb2x2ZUNvbXBvbmVudE9wdGlvbnNUeXBlKGMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1R5cGUgJiYgdGhpcy5pc0ZxbkF2YWlsYWJsZShvcHRpb25zVHlwZS5mcW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zVHlwZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHsgZnFuOiBvcHRpb25zVHlwZS5mcW4gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2NzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IG9wdGlvbnNUeXBlLmRvY3MgPz8gYCR7Yy5jb21wb25lbnRDbGFzcy5uYW1lfSBjb25maWd1cmF0aW9uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogYC0gZGVmYXVsdCAke2MuY29tcG9uZW50Q2xhc3MubmFtZX0gY29uZmlndXJhdGlvbmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLyogQ29tcG9uZW50IGhhcyBubyBvcHRpb25zIHBhcmFtZXRlciBvciByZXNvbHV0aW9uIGZhaWxlZCAtIHNraXAgKi9cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiRmFpbGVkIHRvIHJlc29sdmUgY29tcG9uZW50IG9wdGlvbnMgdHlwZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogYy5jb21wb25lbnRDbGFzcy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBBZGQgY3VzdG9tIG9wdGlvbnMgdG8gdGhlIGludGVyZmFjZSAqL1xuICAgICAgICBpZiAob3B0aW9ucy5hZGRpdGlvbmFsT3B0aW9ucyAmJiBvcHRpb25zLmFkZGl0aW9uYWxPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN0cnVjdC5hZGQoLi4ub3B0aW9ucy5hZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBwcm9qZWN0IHRvIFR5cGVTY3JpcHQgcHJvamVjdCB0eXBlXG4gICAgICpcbiAgICAgKiBQcm9qZW5TdHJ1Y3QgcmVxdWlyZXMgYSBUeXBlU2NyaXB0UHJvamVjdCBpbnN0YW5jZS4gVGhpcyBnZW5lcmF0b3IgaXMgb25seSB1c2VkXG4gICAgICogd2l0aGluIFR5cGVTY3JpcHQgcHJvamVjdHMsIHNvIHRoZSBjYXN0IGlzIHNhZmUgaW4gcHJhY3RpY2UuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUeXBlIGFzc2VydGlvbiBpcyBuZWNlc3NhcnkgaGVyZSBiZWNhdXNlIFByb2plbidzIHR5cGUgc3lzdGVtIGRvZXNuJ3QgcHJvdmlkZVxuICAgICAqIGEgcnVudGltZSB0eXBlIGd1YXJkIGZvciBUeXBlU2NyaXB0UHJvamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0IC0gUHJvamVuIHByb2plY3QgaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyBUeXBlU2NyaXB0IHByb2plY3QgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzVHlwZVNjcmlwdFByb2plY3QocHJvamVjdDogUHJvamVjdCk6IHR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3Qge1xuICAgICAgICByZXR1cm4gcHJvamVjdCBhcyB1bmtub3duIGFzIHR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVyaXZlcyB0aGUgZmlsZSBwYXRoIGZvciB0aGUgZ2VuZXJhdGVkIG9wdGlvbnMgaW50ZXJmYWNlXG4gICAgICpcbiAgICAgKiBQbGFjZXMgdGhlIG9wdGlvbnMgaW50ZXJmYWNlIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjbGFzcyBmaWxlXG4gICAgICogd2l0aCBhIFwiLmdlbmVyYXRlZC50c1wiIHN1ZmZpeC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zSW50ZXJmYWNlIC0gTmFtZSBvZiB0aGUgb3B0aW9ucyBpbnRlcmZhY2VcbiAgICAgKiBAcmV0dXJucyBGaWxlIHBhdGggZm9yIHRoZSBvcHRpb25zIGludGVyZmFjZVxuICAgICAqIEB0aHJvd3Mge0ludmFsaWRGaWxlUGF0aEVycm9yfSBXaGVuIGZpbGVQYXRoIGRvZXNuJ3QgY29udGFpbiBhIGRpcmVjdG9yeSBzZXBhcmF0b3JcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldE9wdGlvbnNGaWxlUGF0aChvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBsYXN0U2xhc2ggPSB0aGlzLm9wdGlvbnMuZmlsZVBhdGgubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgICAgICBpZiAobGFzdFNsYXNoID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRGaWxlUGF0aEVycm9yKHRoaXMub3B0aW9ucy5maWxlUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXIgPSB0aGlzLm9wdGlvbnMuZmlsZVBhdGguc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNGaWxlTmFtZSA9IHRoaXMucmVuZGVyZXIuZ2V0T3B0aW9uc0ZpbGVOYW1lKG9wdGlvbnNJbnRlcmZhY2UpO1xuICAgICAgICByZXR1cm4gYCR7ZGlyfS8ke29wdGlvbnNGaWxlTmFtZX0uZ2VuZXJhdGVkLnRzYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIFR5cGVTY3JpcHQgY2xhc3MgZmlsZSBkdXJpbmcgUHJvamVuIHN5bnRoZXNpc1xuICAgICAqXG4gICAgICogQ2FsbGVkIGJ5IFByb2plbiBkdXJpbmcgdGhlIHN5bnRoZXNpcyBwaGFzZSB0byBnZW5lcmF0ZSB0aGUgcHJvamVjdCBjbGFzcyBmaWxlLlxuICAgICAqIFRoZSBmaWxlIGlzIG1hcmtlZCBhcyByZWFkb25seSB0byBwcmV2ZW50IG1hbnVhbCBlZGl0aW5nLlxuICAgICAqL1xuICAgIHByZVN5bnRoZXNpemUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLm9wdGlvbnMpO1xuXG4gICAgICAgIG5ldyBUeXBlU2NyaXB0Q2xhc3NGaWxlKHRoaXMucHJvamVjdCwgdGhpcy5vcHRpb25zLmZpbGVQYXRoLCBjb250ZW50LCB7XG4gICAgICAgICAgICByZWFkb25seTogdGhpcy5vcHRpb25zLnJlYWRvbmx5ID8/IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiBGUU4gaXMgYXZhaWxhYmxlIGluIGFueSBKU0lJIG1hbmlmZXN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0ZxbkF2YWlsYWJsZShmcW46IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLmxvYWRNYW5pZmVzdEZvckZxbihmcW4pO1xuICAgICAgICAgICAgcmV0dXJuIG1hbmlmZXN0LnR5cGVzPy5bZnFuXSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIGNvbXBvbmVudCBvcHRpb25zIHR5cGUgZnJvbSBKU0lJIG1hbmlmZXN0XG4gICAgICpcbiAgICAgKiBBdXRvLWRldGVjdHMgb3B0aW9ucyBmcm9tIEpTSUkgbWFuaWZlc3Qgd2hlbiBvcHRpb25zUHJvcGVydHkgaXMgdW5kZWZpbmVkLlxuICAgICAqIFJldHVybnMgbnVsbCBvbmx5IHdoZW4gb3B0aW9uc1Byb3BlcnR5IGlzIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzb2x2ZUNvbXBvbmVudE9wdGlvbnNUeXBlKGNvbXBvbmVudDogQ29tcG9uZW50KTogeyBuYW1lOiBzdHJpbmc7IGZxbjogc3RyaW5nOyBkb2NzPzogc3RyaW5nIH0gfCBudWxsIHtcbiAgICAgICAgLyogTm9ybWFsaXplIG9wdGlvbnNQcm9wZXJ0eSB0byBDb21wb25lbnRPcHRpb25zICovXG4gICAgICAgIGxldCBvcHRpb25zQ29uZmlnOiBDb21wb25lbnRPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5vcHRpb25zUHJvcGVydHkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIG9wdGlvbnNDb25maWcgPSB7IG5hbWU6IGNvbXBvbmVudC5vcHRpb25zUHJvcGVydHkgfTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQub3B0aW9uc1Byb3BlcnR5ICYmIHR5cGVvZiBjb21wb25lbnQub3B0aW9uc1Byb3BlcnR5ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBvcHRpb25zQ29uZmlnID0gY29tcG9uZW50Lm9wdGlvbnNQcm9wZXJ0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFVzZSBleHBsaWNpdCB0eXBlIGlmIHByb3ZpZGVkICovXG4gICAgICAgIGlmIChvcHRpb25zQ29uZmlnPy50eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IG9wdGlvbnNDb25maWcubmFtZSxcbiAgICAgICAgICAgICAgICBmcW46IG9wdGlvbnNDb25maWcudHlwZSxcbiAgICAgICAgICAgICAgICBkb2NzOiBvcHRpb25zQ29uZmlnLmRvY3MsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyogRmluZCBjb21wb25lbnQgaW4gSlNJSSBtYW5pZmVzdHMgKi9cbiAgICAgICAgY29uc3QgY29tcG9uZW50RnFuID0gY29tcG9uZW50LmZxbiA/PyB0aGlzLmZpbmRDb21wb25lbnRGcW4oY29tcG9uZW50LmNvbXBvbmVudENsYXNzLm5hbWUpO1xuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMubG9hZE1hbmlmZXN0Rm9yRnFuKGNvbXBvbmVudEZxbik7XG5cbiAgICAgICAgY29uc3QgY2xhc3NUeXBlID0gbWFuaWZlc3QudHlwZXM/Lltjb21wb25lbnRGcW5dO1xuICAgICAgICBpZiAoIWNsYXNzVHlwZSB8fCBjbGFzc1R5cGUua2luZCAhPT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tcG9uZW50UmVzb2x1dGlvbkVycm9yKGNvbXBvbmVudEZxbiwgXCJDb21wb25lbnQgbm90IGZvdW5kIGluIEpTSUkgbWFuaWZlc3RcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbml0aWFsaXplciA9IChjbGFzc1R5cGUgYXMgeyBpbml0aWFsaXplcj86IHsgcGFyYW1ldGVycz86IEFycmF5PHsgdHlwZT86IHsgZnFuPzogc3RyaW5nIH0gfT4gfSB9KVxuICAgICAgICAgICAgLmluaXRpYWxpemVyO1xuICAgICAgICBpZiAoIWluaXRpYWxpemVyPy5wYXJhbWV0ZXJzPy5bMV0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAvKiBDb21wb25lbnQgaGFzIG5vIG9wdGlvbnMgcGFyYW1ldGVyICovXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25zUGFyYW0gPSBpbml0aWFsaXplci5wYXJhbWV0ZXJzWzFdO1xuICAgICAgICBjb25zdCBvcHRpb25zRnFuID0gb3B0aW9uc1BhcmFtLnR5cGU/LmZxbjtcblxuICAgICAgICBpZiAoIW9wdGlvbnNGcW4pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAvKiBPcHRpb25zIHBhcmFtZXRlciBoYXMgbm8gRlFOICovXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25zVHlwZSA9IG1hbmlmZXN0LnR5cGVzPy5bb3B0aW9uc0Zxbl07XG4gICAgICAgIGNvbnN0IGRvY3MgPSAob3B0aW9uc1R5cGUgYXMgeyBkb2NzPzogeyBzdW1tYXJ5Pzogc3RyaW5nIH0gfSB8IHVuZGVmaW5lZCk/LmRvY3M/LnN1bW1hcnk7XG5cbiAgICAgICAgLyogQXV0by1nZW5lcmF0ZSBwcm9wZXJ0eSBuYW1lIGlmIG5vdCBwcm92aWRlZCAqL1xuICAgICAgICBjb25zdCBuYW1lID0gY29tcG9uZW50LmNvbXBvbmVudENsYXNzLm5hbWU7XG4gICAgICAgIGNvbnN0IGRlZmF1bHROYW1lID0gYCR7bmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKX0ke25hbWUuc2xpY2UoMSl9T3B0aW9uc2A7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IG9wdGlvbnNDb25maWc/Lm5hbWUgPz8gZGVmYXVsdE5hbWU7XG5cbiAgICAgICAgcmV0dXJuIHsgbmFtZTogcHJvcGVydHlOYW1lLCBmcW46IG9wdGlvbnNGcW4sIGRvY3MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyBjb21wb25lbnQgRlFOIGJ5IHNlYXJjaGluZyBhbGwgSlNJSSBtYW5pZmVzdHNcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRDb21wb25lbnRGcW4oY29tcG9uZW50TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgLyogVHJ5IG93biBwYWNrYWdlIGZpcnN0ICovXG4gICAgICAgIGNvbnN0IG93bkZxbiA9IGBAbmlrb3ZpcnRhbGEvcHJvamVuLWNvbnN0cnVjdHMuJHtjb21wb25lbnROYW1lfWA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBvd25NYW5pZmVzdCA9IHRoaXMubG9hZE93bk1hbmlmZXN0KCk7XG4gICAgICAgICAgICBpZiAob3duTWFuaWZlc3QudHlwZXM/Lltvd25GcW5dKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bkZxbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8qIE93biBtYW5pZmVzdCBub3QgYXZhaWxhYmxlIHlldCBkdXJpbmcgZGV2ZWxvcG1lbnQgLSB0aGlzIGlzIGV4cGVjdGVkICovXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIk93biBtYW5pZmVzdCBub3QgYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBTZWFyY2ggaW4gbm9kZV9tb2R1bGVzIGZvciBKU0lJIHBhY2thZ2VzICovXG4gICAgICAgIGNvbnN0IG5vZGVNb2R1bGVzUGF0aCA9IGpvaW4oX19kaXJuYW1lLCBcIi4uLy4uL25vZGVfbW9kdWxlc1wiKTtcbiAgICAgICAgY29uc3QgcGFja2FnZXMgPSB0aGlzLmZpbmRKc2lpUGFja2FnZXMobm9kZU1vZHVsZXNQYXRoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHBrZyBvZiBwYWNrYWdlcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMubG9hZE1hbmlmZXN0RnJvbVBhY2thZ2UocGtnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZxbiBvZiBPYmplY3Qua2V5cyhtYW5pZmVzdC50eXBlcyA/PyB7fSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZxbi5lbmRzV2l0aChgLiR7Y29tcG9uZW50TmFtZX1gKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZxbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLyogU2tpcCBwYWNrYWdlcyB3aXRoIGludmFsaWQgbWFuaWZlc3RzIC0gbG9nIGZvciBkZWJ1Z2dpbmcgKi9cbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiRmFpbGVkIHRvIGxvYWQgbWFuaWZlc3QgZnJvbSBwYWNrYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlOiBwa2csXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IENvbXBvbmVudFJlc29sdXRpb25FcnJvcihjb21wb25lbnROYW1lLCBcIkNvbXBvbmVudCBub3QgZm91bmQgaW4gYW55IEpTSUkgbWFuaWZlc3RcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgYWxsIEpTSUkgcGFja2FnZXMgaW4gbm9kZV9tb2R1bGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kSnNpaVBhY2thZ2VzKG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBwYWNrYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgeyByZWFkZGlyU3luYywgc3RhdFN5bmMsIGV4aXN0c1N5bmMgfSA9IHJlcXVpcmUoXCJub2RlOmZzXCIpO1xuXG4gICAgICAgIGlmICghZXhpc3RzU3luYyhub2RlTW9kdWxlc1BhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFja2FnZXM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlZEJhc2UgPSByZXNvbHZlKG5vZGVNb2R1bGVzUGF0aCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiByZWFkZGlyU3luYyhub2RlTW9kdWxlc1BhdGgpKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeVBhdGggPSByZXNvbHZlKG5vZGVNb2R1bGVzUGF0aCwgZW50cnkpO1xuXG4gICAgICAgICAgICAvKiBQcmV2ZW50IHBhdGggdHJhdmVyc2FsIGF0dGFja3MgKi9cbiAgICAgICAgICAgIGlmICghZW50cnlQYXRoLnN0YXJ0c1dpdGgocmVzb2x2ZWRCYXNlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAgICAgICAgICAgICAvKiBTY29wZWQgcGFja2FnZSAtIHJlY3Vyc2UgaW50byBzY29wZSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlUGF0aCA9IGVudHJ5UGF0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNjb3BlZEVudHJ5IG9mIHJlYWRkaXJTeW5jKHNjb3BlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGtnUGF0aCA9IHJlc29sdmUoc2NvcGVQYXRoLCBzY29wZWRFbnRyeSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLyogUHJldmVudCBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzICovXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGtnUGF0aC5zdGFydHNXaXRoKHJlc29sdmVkQmFzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0c1N5bmMoam9pbihwa2dQYXRoLCBcIi5qc2lpXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMucHVzaChwa2dQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdFN5bmMoZW50cnlQYXRoKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgLyogUmVndWxhciBwYWNrYWdlICovXG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0c1N5bmMoam9pbihlbnRyeVBhdGgsIFwiLmpzaWlcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLnB1c2goZW50cnlQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFja2FnZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgSlNJSSBtYW5pZmVzdCBmb3IgYSBnaXZlbiBGUU5cbiAgICAgKlxuICAgICAqIEV4dHJhY3RzIHBhY2thZ2UgbmFtZSBmcm9tIEZRTi4gRm9yIHNjb3BlZCBwYWNrYWdlcyBsaWtlIEBzY29wZS9wYWNrYWdlLkNsYXNzTmFtZSxcbiAgICAgKiB0aGUgcGFja2FnZSBuYW1lIGlzIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBmaXJzdCBkb3QgKGkuZS4sIEBzY29wZS9wYWNrYWdlKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRNYW5pZmVzdEZvckZxbihmcW46IHN0cmluZyk6IEFzc2VtYmx5IHtcbiAgICAgICAgY29uc3QgZG90SW5kZXggPSBmcW4uaW5kZXhPZihcIi5cIik7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gZG90SW5kZXggPiAwID8gZnFuLnN1YnN0cmluZygwLCBkb3RJbmRleCkgOiBmcW47XG5cbiAgICAgICAgLyogVHJ5IG93biBwYWNrYWdlICovXG4gICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PT0gXCJAbmlrb3ZpcnRhbGEvcHJvamVuLWNvbnN0cnVjdHNcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZE93bk1hbmlmZXN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBUcnkgbm9kZV9tb2R1bGVzICovXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwa2dKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShgJHtwYWNrYWdlTmFtZX0vcGFja2FnZS5qc29uYCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkTWFuaWZlc3RGcm9tUGFja2FnZShkaXJuYW1lKHBrZ0pzb25QYXRoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTWFuaWZlc3RMb2FkRXJyb3IocGFja2FnZU5hbWUsIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBKU0lJIG1hbmlmZXN0IGZyb20gYSBwYWNrYWdlIGRpcmVjdG9yeVxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZE1hbmlmZXN0RnJvbVBhY2thZ2UocGFja2FnZVBhdGg6IHN0cmluZyk6IEFzc2VtYmx5IHtcbiAgICAgICAgY29uc3QganNpaVBhdGggPSBqb2luKHBhY2thZ2VQYXRoLCBcIi5qc2lpXCIpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoanNpaVBhdGgsIFwidXRmLThcIikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoaXMgcGFja2FnZSdzIEpTSUkgbWFuaWZlc3RcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRPd25NYW5pZmVzdCgpOiBBc3NlbWJseSB7XG4gICAgICAgIGNvbnN0IGpzaWlQYXRoID0gam9pbihfX2Rpcm5hbWUsIFwiLi4vLmpzaWlcIik7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhqc2lpUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIFByb2plY3RUeXBlIGVudW0gZnJvbSBQcm9qZW4ncyBKU0lJIG1hbmlmZXN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVByb2plY3RUeXBlRW51bSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHJvamVjdFR5cGVzID0gdGhpcy5kaXNjb3ZlclByb2plY3RUeXBlcygpO1xuXG4gICAgICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsaW5lcy5wdXNoKFwiLyoqXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICogRW51bSBkZWZpbmluZyBhbGwgc3VwcG9ydGVkIHByb2plY3QgdHlwZXNcIik7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgKlwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqIEVhY2ggcHJvamVjdCB0eXBlIGNvcnJlc3BvbmRzIHRvIGEgZ2VuZXJhdGVkIHByb2plY3QgY2xhc3MgYW5kIGl0cyBjb25maWd1cmF0aW9uXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICogaW4gdGhlIGRlZmF1bHRPcHRpb25zIHN0cnVjdHVyZS5cIik7XG4gICAgICAgIGxpbmVzLnB1c2goXCIgKlwiKTtcbiAgICAgICAgbGluZXMucHVzaChcIiAqIEBnZW5lcmF0ZWQgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBQcm9qZW4ncyBKU0lJIG1hbmlmZXN0XCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiICovXCIpO1xuICAgICAgICBsaW5lcy5wdXNoKFwiZXhwb3J0IGVudW0gUHJvamVjdFR5cGUge1wiKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtlbnVtTmFtZSwgdmFsdWUsIGRvY3NdIG9mIHByb2plY3RUeXBlcykge1xuICAgICAgICAgICAgbGluZXMucHVzaChcIiAgICAvKipcIik7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGAgICAgICogJHtkb2NzfWApO1xuICAgICAgICAgICAgbGluZXMucHVzaChcIiAgICAgKi9cIik7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGAgICAgJHtlbnVtTmFtZX0gPSBcIiR7dmFsdWV9XCIsYCk7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKFwiXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluZXMucHVzaChcIn1cIik7XG5cbiAgICAgICAgbmV3IHByb2plbi5UZXh0RmlsZSh0aGlzLnByb2plY3QsIFwic3JjL3Byb2plY3QtdHlwZS50c1wiLCB7XG4gICAgICAgICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgICAgICAgIGxpbmVzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb3ZlcnMgYWxsIHByb2plY3QgdHlwZXMgdGhhdCBleHRlbmQgcHJvamVuLlByb2plY3RcbiAgICAgKi9cbiAgICBwcml2YXRlIGRpc2NvdmVyUHJvamVjdFR5cGVzKCk6IEFycmF5PFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXT4ge1xuICAgICAgICBjb25zdCBwcm9qZWN0VHlwZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXT4gPSBbXTtcbiAgICAgICAgY29uc3QgYmFzZUNsYXNzID0gXCJwcm9qZW4uUHJvamVjdFwiO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2ZxbiwgdHlwZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZW5kZXJlci5qc2lpTWFuaWZlc3QudHlwZXMgPz8ge30pKSB7XG4gICAgICAgICAgICBpZiAodHlwZS5raW5kICE9PSBcImNsYXNzXCIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY2xhc3NUeXBlID0gdHlwZSBhcyB7XG4gICAgICAgICAgICAgICAgYWJzdHJhY3Q/OiBib29sZWFuO1xuICAgICAgICAgICAgICAgIGJhc2U/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgZG9jcz86IHsgc3VtbWFyeT86IHN0cmluZyB9O1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGNsYXNzVHlwZS5hYnN0cmFjdCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZXh0ZW5kc0Jhc2UoY2xhc3NUeXBlLCBiYXNlQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gZnFuLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCAzIHx8IHBhcnRzWzBdICE9PSBcInByb2plblwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IHBhcnRzWzFdO1xuICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gcGFydHMuc2xpY2UoMikuam9pbihcIi5cIik7XG4gICAgICAgICAgICBjb25zdCBlbnVtTmFtZSA9IGNsYXNzTmFtZVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oW0EtWl0pL2csIFwiXyQxXCIpXG4gICAgICAgICAgICAgICAgLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXl8vLCBcIlwiKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYCR7bW9kdWxlfS4ke2NsYXNzTmFtZX1gO1xuICAgICAgICAgICAgY29uc3QgZG9jcyA9IGNsYXNzVHlwZS5kb2NzPy5zdW1tYXJ5ID8/IGNsYXNzTmFtZTtcblxuICAgICAgICAgICAgcHJvamVjdFR5cGVzLnB1c2goW2VudW1OYW1lLCB2YWx1ZSwgZG9jc10pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb2plY3RUeXBlcy5zb3J0KChhLCBiKSA9PiBhWzBdLmxvY2FsZUNvbXBhcmUoYlswXSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGNsYXNzIGV4dGVuZHMgdGhlIGJhc2UgY2xhc3NcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dGVuZHNCYXNlKGNsYXNzVHlwZTogeyBpbmhlcml0YW5jZVBhdGg/OiBzdHJpbmdbXTsgYmFzZT86IHN0cmluZyB9LCBiYXNlQ2xhc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoY2xhc3NUeXBlLmluaGVyaXRhbmNlUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNsYXNzVHlwZS5pbmhlcml0YW5jZVBhdGguaW5jbHVkZXMoYmFzZUNsYXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjdXJyZW50QmFzZSA9IGNsYXNzVHlwZS5iYXNlO1xuICAgICAgICB3aGlsZSAoY3VycmVudEJhc2UpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50QmFzZSA9PT0gYmFzZUNsYXNzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBiYXNlVHlwZSA9IHRoaXMucmVuZGVyZXIuanNpaU1hbmlmZXN0LnR5cGVzPy5bY3VycmVudEJhc2VdO1xuICAgICAgICAgICAgaWYgKCFiYXNlVHlwZSB8fCBiYXNlVHlwZS5raW5kICE9PSBcImNsYXNzXCIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRCYXNlID0gKGJhc2VUeXBlIGFzIHsgYmFzZT86IHN0cmluZyB9KS5iYXNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUZXh0IGZpbGUgZm9yIGdlbmVyYXRlZCBUeXBlU2NyaXB0IGNsYXNzIGNvZGVcbiAqXG4gKiBFeHRlbmRzIFByb2plbidzIFRleHRGaWxlIHRvIGFkZCB0aGUgZ2VuZXJhdGVkIGZpbGUgbWFya2VyIGNvbW1lbnRcbiAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuXG4gKi9cbmNsYXNzIFR5cGVTY3JpcHRDbGFzc0ZpbGUgZXh0ZW5kcyBwcm9qZW4uVGV4dEZpbGUge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0IC0gUHJvamVuIHByb2plY3QgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZmlsZVBhdGggLSBPdXRwdXQgZmlsZSBwYXRoXG4gICAgICogQHBhcmFtIGNvbnRlbnQgLSBUeXBlU2NyaXB0IGNsYXNzIGNvZGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFNvdXJjZSBjb2RlIG9wdGlvbnMgKHJlYWRvbmx5LCBldGMuKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgb3B0aW9uczogU291cmNlQ29kZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihwcm9qZWN0LCBmaWxlUGF0aCwgb3B0aW9ucyk7XG4gICAgICAgIC8qIEFkZCBnZW5lcmF0ZWQgZmlsZSBtYXJrZXIgdG8gcHJldmVudCBtYW51YWwgZWRpdGluZyAqL1xuICAgICAgICB0aGlzLmFkZExpbmUoYC8vICR7dGhpcy5tYXJrZXJ9YCk7XG4gICAgICAgIHRoaXMuYWRkTGluZShjb250ZW50KTtcbiAgICB9XG59XG4iXX0=
|
package/lib/project-type.d.ts
CHANGED
|
@@ -31,10 +31,6 @@ export declare enum ProjectType {
|
|
|
31
31
|
* CDK8s app in TypeScript.
|
|
32
32
|
*/
|
|
33
33
|
CDK8S_TYPE_SCRIPT_APP = "cdk8s.Cdk8sTypeScriptApp",
|
|
34
|
-
/**
|
|
35
|
-
* ConstructLibraryAws
|
|
36
|
-
*/
|
|
37
|
-
CONSTRUCT_LIBRARY_AWS = "awscdk.ConstructLibraryAws",
|
|
38
34
|
/**
|
|
39
35
|
* CDK8s construct library project.
|
|
40
36
|
*/
|
|
@@ -83,10 +79,6 @@ export declare enum ProjectType {
|
|
|
83
79
|
* TypeScript app.
|
|
84
80
|
*/
|
|
85
81
|
TYPE_SCRIPT_APP_PROJECT = "typescript.TypeScriptAppProject",
|
|
86
|
-
/**
|
|
87
|
-
* TypeScriptLibraryProject
|
|
88
|
-
*/
|
|
89
|
-
TYPE_SCRIPT_LIBRARY_PROJECT = "typescript.TypeScriptLibraryProject",
|
|
90
82
|
/**
|
|
91
83
|
* TypeScript project.
|
|
92
84
|
*/
|
package/lib/project-type.js
CHANGED
|
@@ -35,10 +35,6 @@ var ProjectType;
|
|
|
35
35
|
* CDK8s app in TypeScript.
|
|
36
36
|
*/
|
|
37
37
|
ProjectType["CDK8S_TYPE_SCRIPT_APP"] = "cdk8s.Cdk8sTypeScriptApp";
|
|
38
|
-
/**
|
|
39
|
-
* ConstructLibraryAws
|
|
40
|
-
*/
|
|
41
|
-
ProjectType["CONSTRUCT_LIBRARY_AWS"] = "awscdk.ConstructLibraryAws";
|
|
42
38
|
/**
|
|
43
39
|
* CDK8s construct library project.
|
|
44
40
|
*/
|
|
@@ -87,13 +83,9 @@ var ProjectType;
|
|
|
87
83
|
* TypeScript app.
|
|
88
84
|
*/
|
|
89
85
|
ProjectType["TYPE_SCRIPT_APP_PROJECT"] = "typescript.TypeScriptAppProject";
|
|
90
|
-
/**
|
|
91
|
-
* TypeScriptLibraryProject
|
|
92
|
-
*/
|
|
93
|
-
ProjectType["TYPE_SCRIPT_LIBRARY_PROJECT"] = "typescript.TypeScriptLibraryProject";
|
|
94
86
|
/**
|
|
95
87
|
* TypeScript project.
|
|
96
88
|
*/
|
|
97
89
|
ProjectType["TYPE_SCRIPT_PROJECT"] = "typescript.TypeScriptProject";
|
|
98
90
|
})(ProjectType || (exports.ProjectType = ProjectType = {}));
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb2plY3QtdHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7OztHQU9HO0FBQ0gsSUFBWSxXQWdHWDtBQWhHRCxXQUFZLFdBQVc7SUFDbkI7O09BRUc7SUFDSCwwRUFBMkQsQ0FBQTtJQUUzRDs7T0FFRztJQUNILHdEQUF5QyxDQUFBO0lBRXpDOztPQUVHO0lBQ0gsNERBQTZDLENBQUE7SUFFN0M7O09BRUc7SUFDSCxxRUFBc0QsQ0FBQTtJQUV0RDs7T0FFRztJQUNILHdEQUF5QyxDQUFBO0lBRXpDOztPQUVHO0lBQ0gsaUVBQWtELENBQUE7SUFFbEQ7O09BRUc7SUFDSCxzRUFBdUQsQ0FBQTtJQUV2RDs7T0FFRztJQUNILHNFQUF1RCxDQUFBO0lBRXZEOztPQUVHO0lBQ0gsdURBQXdDLENBQUE7SUFFeEM7O09BRUc7SUFDSCxnREFBaUMsQ0FBQTtJQUVqQzs7T0FFRztJQUNILCtDQUFnQyxDQUFBO0lBRWhDOztPQUVHO0lBQ0gsb0RBQXFDLENBQUE7SUFFckM7O09BRUc7SUFDSCwwRUFBMkQsQ0FBQTtJQUUzRDs7T0FFRztJQUNILHNEQUF1QyxDQUFBO0lBRXZDOztPQUVHO0lBQ0gsc0RBQXVDLENBQUE7SUFFdkM7O09BRUc7SUFDSCxpREFBa0MsQ0FBQTtJQUVsQzs7T0FFRztJQUNILHVFQUF3RCxDQUFBO0lBRXhEOztPQUVHO0lBQ0gsMEVBQTJELENBQUE7SUFFM0Q7O09BRUc7SUFDSCxtRUFBb0QsQ0FBQTtBQUV4RCxDQUFDLEVBaEdXLFdBQVcsMkJBQVgsV0FBVyxRQWdHdEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVudW0gZGVmaW5pbmcgYWxsIHN1cHBvcnRlZCBwcm9qZWN0IHR5cGVzXG4gKlxuICogRWFjaCBwcm9qZWN0IHR5cGUgY29ycmVzcG9uZHMgdG8gYSBnZW5lcmF0ZWQgcHJvamVjdCBjbGFzcyBhbmQgaXRzIGNvbmZpZ3VyYXRpb25cbiAqIGluIHRoZSBkZWZhdWx0T3B0aW9ucyBzdHJ1Y3R1cmUuXG4gKlxuICogQGdlbmVyYXRlZCBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIFByb2plbidzIEpTSUkgbWFuaWZlc3RcbiAqL1xuZXhwb3J0IGVudW0gUHJvamVjdFR5cGUge1xuICAgIC8qKlxuICAgICAqIEFXUyBDREsgY29uc3RydWN0IGxpYnJhcnkgcHJvamVjdC5cbiAgICAgKi9cbiAgICBBV1NfQ0RLX0NPTlNUUlVDVF9MSUJSQVJZID0gXCJhd3NjZGsuQXdzQ2RrQ29uc3RydWN0TGlicmFyeVwiLFxuXG4gICAgLyoqXG4gICAgICogQVdTIENESyBhcHAgaW4gSmF2YS5cbiAgICAgKi9cbiAgICBBV1NfQ0RLX0pBVkFfQVBQID0gXCJhd3NjZGsuQXdzQ2RrSmF2YUFwcFwiLFxuXG4gICAgLyoqXG4gICAgICogQVdTIENESyBhcHAgaW4gUHl0aG9uLlxuICAgICAqL1xuICAgIEFXU19DREtfUFlUSE9OX0FQUCA9IFwiYXdzY2RrLkF3c0Nka1B5dGhvbkFwcFwiLFxuXG4gICAgLyoqXG4gICAgICogQVdTIENESyBhcHAgaW4gVHlwZVNjcmlwdC5cbiAgICAgKi9cbiAgICBBV1NfQ0RLX1RZUEVfU0NSSVBUX0FQUCA9IFwiYXdzY2RrLkF3c0Nka1R5cGVTY3JpcHRBcHBcIixcblxuICAgIC8qKlxuICAgICAqIENESzhzIGFwcCBpbiBQeXRob24uXG4gICAgICovXG4gICAgQ0RLOFNfUFlUSE9OX0FQUCA9IFwiY2RrOHMuQ2RrOHNQeXRob25BcHBcIixcblxuICAgIC8qKlxuICAgICAqIENESzhzIGFwcCBpbiBUeXBlU2NyaXB0LlxuICAgICAqL1xuICAgIENESzhTX1RZUEVfU0NSSVBUX0FQUCA9IFwiY2RrOHMuQ2RrOHNUeXBlU2NyaXB0QXBwXCIsXG5cbiAgICAvKipcbiAgICAgKiBDREs4cyBjb25zdHJ1Y3QgbGlicmFyeSBwcm9qZWN0LlxuICAgICAqL1xuICAgIENPTlNUUlVDVF9MSUJSQVJZX0NESzhTID0gXCJjZGs4cy5Db25zdHJ1Y3RMaWJyYXJ5Q2RrOHNcIixcblxuICAgIC8qKlxuICAgICAqIENES1RGIGNvbnN0cnVjdCBsaWJyYXJ5IHByb2plY3QuXG4gICAgICovXG4gICAgQ09OU1RSVUNUX0xJQlJBUllfQ0RLVEYgPSBcImNka3RmLkNvbnN0cnVjdExpYnJhcnlDZGt0ZlwiLFxuXG4gICAgLyoqXG4gICAgICogR2l0SHViLWJhc2VkIHByb2plY3QuXG4gICAgICovXG4gICAgR0lUX0hVQl9QUk9KRUNUID0gXCJnaXRodWIuR2l0SHViUHJvamVjdFwiLFxuXG4gICAgLyoqXG4gICAgICogSmF2YSBwcm9qZWN0LlxuICAgICAqL1xuICAgIEpBVkFfUFJPSkVDVCA9IFwiamF2YS5KYXZhUHJvamVjdFwiLFxuXG4gICAgLyoqXG4gICAgICogTXVsdGktbGFuZ3VhZ2UganNpaSBsaWJyYXJ5IHByb2plY3QuXG4gICAgICovXG4gICAgSlNJSV9QUk9KRUNUID0gXCJjZGsuSnNpaVByb2plY3RcIixcblxuICAgIC8qKlxuICAgICAqIE5leHQuanMgcHJvamVjdCB1c2luZyBKYXZhU2NyaXB0LlxuICAgICAqL1xuICAgIE5FWFRfSlNfUFJPSkVDVCA9IFwid2ViLk5leHRKc1Byb2plY3RcIixcblxuICAgIC8qKlxuICAgICAqIE5leHQuanMgcHJvamVjdCB1c2luZyBUeXBlU2NyaXB0LlxuICAgICAqL1xuICAgIE5FWFRfSlNfVFlQRV9TQ1JJUFRfUFJPSkVDVCA9IFwid2ViLk5leHRKc1R5cGVTY3JpcHRQcm9qZWN0XCIsXG5cbiAgICAvKipcbiAgICAgKiBOb2RlLmpzIHByb2plY3QuXG4gICAgICovXG4gICAgTk9ERV9QUk9KRUNUID0gXCJqYXZhc2NyaXB0Lk5vZGVQcm9qZWN0XCIsXG5cbiAgICAvKipcbiAgICAgKiBQeXRob24gcHJvamVjdC5cbiAgICAgKi9cbiAgICBQWVRIT05fUFJPSkVDVCA9IFwicHl0aG9uLlB5dGhvblByb2plY3RcIixcblxuICAgIC8qKlxuICAgICAqIFJlYWN0IHByb2plY3QgdXNpbmcgSmF2YVNjcmlwdC5cbiAgICAgKi9cbiAgICBSRUFDVF9QUk9KRUNUID0gXCJ3ZWIuUmVhY3RQcm9qZWN0XCIsXG5cbiAgICAvKipcbiAgICAgKiBSZWFjdCBwcm9qZWN0IHVzaW5nIFR5cGVTY3JpcHQuXG4gICAgICovXG4gICAgUkVBQ1RfVFlQRV9TQ1JJUFRfUFJPSkVDVCA9IFwid2ViLlJlYWN0VHlwZVNjcmlwdFByb2plY3RcIixcblxuICAgIC8qKlxuICAgICAqIFR5cGVTY3JpcHQgYXBwLlxuICAgICAqL1xuICAgIFRZUEVfU0NSSVBUX0FQUF9QUk9KRUNUID0gXCJ0eXBlc2NyaXB0LlR5cGVTY3JpcHRBcHBQcm9qZWN0XCIsXG5cbiAgICAvKipcbiAgICAgKiBUeXBlU2NyaXB0IHByb2plY3QuXG4gICAgICovXG4gICAgVFlQRV9TQ1JJUFRfUFJPSkVDVCA9IFwidHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFwiLFxuXG59Il19
|