semantifold 0.9.0 → 0.11.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/README.md +6 -3
- package/bin/semantifold.js +6 -0
- package/build/bin/semantifold.d.ts +3 -0
- package/build/bin/semantifold.d.ts.map +1 -0
- package/build/bin/semantifold.js +5 -0
- package/build/index.d.ts +8 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +9 -1
- package/build/src/artifact-path.d.ts +16 -0
- package/build/src/artifact-path.d.ts.map +1 -1
- package/build/src/artifact-path.js +29 -3
- package/build/src/backends/c-check.d.ts +7 -0
- package/build/src/backends/c-check.d.ts.map +1 -0
- package/build/src/backends/c-check.js +65 -0
- package/build/src/backends/check-plan.d.ts +96 -0
- package/build/src/backends/check-plan.d.ts.map +1 -0
- package/build/src/backends/check-plan.js +135 -0
- package/build/src/backends/cpp-check.d.ts +7 -0
- package/build/src/backends/cpp-check.d.ts.map +1 -0
- package/build/src/backends/cpp-check.js +59 -0
- package/build/src/backends/csharp-check.d.ts +7 -0
- package/build/src/backends/csharp-check.d.ts.map +1 -0
- package/build/src/backends/csharp-check.js +125 -0
- package/build/src/backends/csharp.d.ts +1 -0
- package/build/src/backends/csharp.d.ts.map +1 -1
- package/build/src/backends/csharp.js +5 -4
- package/build/src/backends/dart-check.d.ts +7 -0
- package/build/src/backends/dart-check.d.ts.map +1 -0
- package/build/src/backends/dart-check.js +103 -0
- package/build/src/backends/dart.d.ts +2 -0
- package/build/src/backends/dart.d.ts.map +1 -1
- package/build/src/backends/dart.js +5 -5
- package/build/src/backends/go-check.d.ts +7 -0
- package/build/src/backends/go-check.d.ts.map +1 -0
- package/build/src/backends/go-check.js +77 -0
- package/build/src/backends/go.d.ts +1 -0
- package/build/src/backends/go.d.ts.map +1 -1
- package/build/src/backends/go.js +3 -3
- package/build/src/backends/java-check.d.ts +21 -0
- package/build/src/backends/java-check.d.ts.map +1 -0
- package/build/src/backends/java-check.js +73 -0
- package/build/src/backends/javascript-check.d.ts +7 -0
- package/build/src/backends/javascript-check.d.ts.map +1 -0
- package/build/src/backends/javascript-check.js +29 -0
- package/build/src/backends/kotlin-check.d.ts +7 -0
- package/build/src/backends/kotlin-check.d.ts.map +1 -0
- package/build/src/backends/kotlin-check.js +31 -0
- package/build/src/backends/kotlin.d.ts +1 -1
- package/build/src/backends/kotlin.js +2 -2
- package/build/src/backends/php-check.d.ts +7 -0
- package/build/src/backends/php-check.d.ts.map +1 -0
- package/build/src/backends/php-check.js +21 -0
- package/build/src/backends/program.d.ts +7 -0
- package/build/src/backends/program.d.ts.map +1 -1
- package/build/src/backends/program.js +16 -1
- package/build/src/backends/python-check.d.ts +7 -0
- package/build/src/backends/python-check.d.ts.map +1 -0
- package/build/src/backends/python-check.js +28 -0
- package/build/src/backends/ruby-check.d.ts +7 -0
- package/build/src/backends/ruby-check.d.ts.map +1 -0
- package/build/src/backends/ruby-check.js +21 -0
- package/build/src/backends/rust-check.d.ts +7 -0
- package/build/src/backends/rust-check.d.ts.map +1 -0
- package/build/src/backends/rust-check.js +65 -0
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +29 -1
- package/build/src/backends/swift-check.d.ts +7 -0
- package/build/src/backends/swift-check.d.ts.map +1 -0
- package/build/src/backends/swift-check.js +77 -0
- package/build/src/backends/typescript-check.d.ts +7 -0
- package/build/src/backends/typescript-check.d.ts.map +1 -0
- package/build/src/backends/typescript-check.js +33 -0
- package/build/src/backends/zig-check.d.ts +7 -0
- package/build/src/backends/zig-check.d.ts.map +1 -0
- package/build/src/backends/zig-check.js +70 -0
- package/build/src/diagnostic.d.ts +13 -1
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +14 -2
- package/build/src/frontends/java.d.ts.map +1 -1
- package/build/src/frontends/java.js +23 -1
- package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
- package/build/src/frontends/javascript-typescript.js +45 -4
- package/build/src/frontends/php.d.ts.map +1 -1
- package/build/src/frontends/php.js +54 -3
- package/build/src/frontends/program.d.ts +6 -0
- package/build/src/frontends/program.d.ts.map +1 -1
- package/build/src/frontends/program.js +9 -1
- package/build/src/frontends/ruby.d.ts.map +1 -1
- package/build/src/frontends/ruby.js +55 -5
- package/build/src/language-registry.d.ts +54 -0
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +124 -10
- package/build/src/project-build.d.ts +172 -0
- package/build/src/project-build.d.ts.map +1 -0
- package/build/src/project-build.js +320 -0
- package/build/src/project-cli.d.ts +40 -0
- package/build/src/project-cli.d.ts.map +1 -0
- package/build/src/project-cli.js +145 -0
- package/build/src/project-manifest.d.ts +148 -0
- package/build/src/project-manifest.d.ts.map +1 -0
- package/build/src/project-manifest.js +432 -0
- package/build/src/project-reporter.d.ts +81 -0
- package/build/src/project-reporter.d.ts.map +1 -0
- package/build/src/project-reporter.js +293 -0
- package/build/src/project-snapshot.d.ts +129 -0
- package/build/src/project-snapshot.d.ts.map +1 -0
- package/build/src/project-snapshot.js +362 -0
- package/build/src/project-watch-reporter.d.ts +125 -0
- package/build/src/project-watch-reporter.d.ts.map +1 -0
- package/build/src/project-watch-reporter.js +280 -0
- package/build/src/project-watch.d.ts +133 -0
- package/build/src/project-watch.d.ts.map +1 -0
- package/build/src/project-watch.js +839 -0
- package/build/src/publication.d.ts +69 -5
- package/build/src/publication.d.ts.map +1 -1
- package/build/src/publication.js +246 -57
- package/build/src/semantic/effects.js +3 -1
- package/build/src/semantic/provenance.d.ts.map +1 -1
- package/build/src/semantic/provenance.js +11 -1
- package/build/src/semantic/types.d.ts +355 -4
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +92 -3
- package/build/src/semantic/validate.js +18 -1
- package/build/src/subprocess.d.ts +8 -0
- package/build/src/subprocess.d.ts.map +1 -1
- package/build/src/subprocess.js +50 -9
- package/build/src/target-check.d.ts +52 -0
- package/build/src/target-check.d.ts.map +1 -0
- package/build/src/target-check.js +796 -0
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +3 -3
- package/docs/adr-expression-breadth.md +186 -0
- package/docs/architecture.md +3 -1
- package/docs/c.md +4 -0
- package/docs/cpp.md +4 -0
- package/docs/dart.md +4 -0
- package/docs/generated-artifact-publication.md +11 -8
- package/docs/kotlin.md +2 -2
- package/docs/language-support.md +40 -6
- package/docs/parser-qualification.md +1 -1
- package/docs/project-build-cli.md +147 -0
- package/docs/project-watch.md +60 -0
- package/docs/rust.md +4 -0
- package/docs/swift.md +2 -0
- package/docs/testing.md +70 -3
- package/docs/watch-build-pipeline.md +39 -23
- package/docs/zig.md +2 -0
- package/examples/jsdoc-java-watch/expected-output.txt +3 -0
- package/examples/jsdoc-java-watch/semantifold.json +23 -0
- package/examples/jsdoc-java-watch/src/main.js +21 -0
- package/index.js +8 -0
- package/package.json +6 -1
- package/src/artifact-path.js +31 -2
- package/src/backends/c-check.js +80 -0
- package/src/backends/check-plan.js +147 -0
- package/src/backends/cpp-check.js +73 -0
- package/src/backends/csharp-check.js +139 -0
- package/src/backends/csharp.js +4 -3
- package/src/backends/dart-check.js +117 -0
- package/src/backends/dart.js +4 -4
- package/src/backends/go-check.js +89 -0
- package/src/backends/go.js +2 -2
- package/src/backends/java-check.js +77 -0
- package/src/backends/javascript-check.js +33 -0
- package/src/backends/kotlin-check.js +41 -0
- package/src/backends/kotlin.js +1 -1
- package/src/backends/php-check.js +23 -0
- package/src/backends/program.js +17 -0
- package/src/backends/python-check.js +30 -0
- package/src/backends/ruby-check.js +23 -0
- package/src/backends/rust-check.js +78 -0
- package/src/backends/shared.js +30 -0
- package/src/backends/swift-check.js +89 -0
- package/src/backends/typescript-check.js +37 -0
- package/src/backends/zig-check.js +81 -0
- package/src/diagnostic.js +9 -1
- package/src/frontends/java.js +24 -0
- package/src/frontends/javascript-typescript.js +49 -2
- package/src/frontends/php.js +61 -2
- package/src/frontends/program.js +9 -0
- package/src/frontends/ruby.js +62 -2
- package/src/language-registry.js +130 -9
- package/src/project-build.js +353 -0
- package/src/project-cli.js +155 -0
- package/src/project-manifest.js +479 -0
- package/src/project-reporter.js +320 -0
- package/src/project-snapshot.js +403 -0
- package/src/project-watch-reporter.js +303 -0
- package/src/project-watch.js +870 -0
- package/src/publication.js +275 -58
- package/src/semantic/effects.js +1 -0
- package/src/semantic/provenance.js +8 -0
- package/src/semantic/types.js +101 -2
- package/src/semantic/validate.js +26 -0
- package/src/subprocess.js +49 -8
- package/src/target-check.js +844 -0
- package/src/toolchains.js +3 -2
- package/tsconfig.json +1 -1
|
@@ -4,6 +4,7 @@ import { SemantifoldDiagnostic, unsupportedRole } from "./diagnostic.js";
|
|
|
4
4
|
import { generateJava } from "./backends/java.js";
|
|
5
5
|
import { generateKotlin } from "./backends/kotlin.js";
|
|
6
6
|
import { generateCSharpProject } from "./backends/csharp.js";
|
|
7
|
+
import { createCSharpCheckPlan } from "./backends/csharp-check.js";
|
|
7
8
|
import { generateGoModule } from "./backends/go.js";
|
|
8
9
|
import { generateRustProject } from "./backends/rust.js";
|
|
9
10
|
import { generateSwift } from "./backends/swift.js";
|
|
@@ -34,11 +35,26 @@ import { parseJavaScriptTypeScript } from "./frontends/javascript-typescript.js"
|
|
|
34
35
|
import { parsePhp } from "./frontends/php.js";
|
|
35
36
|
import { parsePython } from "./frontends/python.js";
|
|
36
37
|
import { parseRuby } from "./frontends/ruby.js";
|
|
38
|
+
import { createJavaCheckPlan } from "./backends/java-check.js";
|
|
39
|
+
import { createJavaScriptCheckPlan } from "./backends/javascript-check.js";
|
|
40
|
+
import { createKotlinCheckPlan } from "./backends/kotlin-check.js";
|
|
41
|
+
import { createPhpCheckPlan } from "./backends/php-check.js";
|
|
42
|
+
import { createPythonCheckPlan } from "./backends/python-check.js";
|
|
43
|
+
import { createRubyCheckPlan } from "./backends/ruby-check.js";
|
|
44
|
+
import { createTypeScriptCheckPlan } from "./backends/typescript-check.js";
|
|
45
|
+
import { createGoCheckPlan } from "./backends/go-check.js";
|
|
46
|
+
import { createCCheckPlan } from "./backends/c-check.js";
|
|
47
|
+
import { createCppCheckPlan } from "./backends/cpp-check.js";
|
|
48
|
+
import { createRustCheckPlan } from "./backends/rust-check.js";
|
|
49
|
+
import { createSwiftCheckPlan } from "./backends/swift-check.js";
|
|
50
|
+
import { createDartCheckPlan } from "./backends/dart-check.js";
|
|
51
|
+
import { createZigCheckPlan } from "./backends/zig-check.js";
|
|
37
52
|
const registryRoles = Object.freeze(["frontend", "textBackend", "binaryBackend", "applicationBackend", "interoperability"]);
|
|
38
53
|
const acceptanceStageOrder = ["parse", "generate", "restore", "compile", "link", "validate", "instantiate", "execute"];
|
|
39
54
|
const acceptanceStages = new Map(acceptanceStageOrder.map((stage, index) => [stage, index]));
|
|
55
|
+
const developerCheckStages = new Set(["restore", "compile", "link", "validate"]);
|
|
40
56
|
const registryKeys = new Set([
|
|
41
|
-
"acceptance", "applicationBackend", "artifactMultiplicity", "binaryBackend", "defaultFilename", "frontend", "id",
|
|
57
|
+
"acceptance", "applicationBackend", "artifactMultiplicity", "binaryBackend", "check", "defaultFilename", "frontend", "id",
|
|
42
58
|
"features", "interoperability", "mapping", "mediaType", "provider", "roundTrip", "textBackend"
|
|
43
59
|
]);
|
|
44
60
|
/** @typedef {"frontend" | "textBackend" | "binaryBackend" | "applicationBackend" | "interoperability"} RegistryRole */
|
|
@@ -59,6 +75,7 @@ const registryKeys = new Set([
|
|
|
59
75
|
* @typedef LanguageRegistryRecord
|
|
60
76
|
* @property {string} id - Stable identity.
|
|
61
77
|
* @property {{stages: import("./semantic/types.js").AcceptanceStage[], toolchains: string[]}} acceptance - Acceptance declaration.
|
|
78
|
+
* @property {Readonly<LanguageRegistryCheckRecord>} check - Developer-check declaration.
|
|
62
79
|
* @property {"single" | "multiple"} artifactMultiplicity - Artifact multiplicity.
|
|
63
80
|
* @property {import("./semantic/types.js").LanguageFeatureCapabilities} features - Semantic feature capabilities.
|
|
64
81
|
* @property {import("./semantic/types.js").LanguageMappingCapabilities} mapping - Mapping capabilities.
|
|
@@ -72,6 +89,28 @@ const registryKeys = new Set([
|
|
|
72
89
|
* @property {RegistryImplementation} [applicationBackend] - Application-artifact backend.
|
|
73
90
|
* @property {RegistryImplementation} [interoperability] - Interoperability bridge.
|
|
74
91
|
*/
|
|
92
|
+
/**
|
|
93
|
+
* @typedef {Readonly<{
|
|
94
|
+
* artifacts: import("./semantic/types.js").GeneratedArtifactSet,
|
|
95
|
+
* buildPath: string,
|
|
96
|
+
* projectId: string,
|
|
97
|
+
* sourcePath: string,
|
|
98
|
+
* targetId: string,
|
|
99
|
+
* tools: readonly import("./semantic/types.js").DiscoveredToolchain[]
|
|
100
|
+
* }>} TargetCheckPlanContext
|
|
101
|
+
*/
|
|
102
|
+
/**
|
|
103
|
+
* @callback TargetCheckPlanFactory
|
|
104
|
+
* @param {TargetCheckPlanContext} context - Exact staged target context.
|
|
105
|
+
* @returns {import("./semantic/types.js").TargetCheckPlan} Immutable plan.
|
|
106
|
+
*/
|
|
107
|
+
/**
|
|
108
|
+
* @typedef LanguageRegistryCheckRecord
|
|
109
|
+
* @property {TargetCheckPlanFactory} [factory] - Target-owned plan factory for supported checks.
|
|
110
|
+
* @property {readonly import("./semantic/types.js").AcceptanceStage[]} stages - Exact non-executing stages.
|
|
111
|
+
* @property {boolean} supported - Whether the target supplies a check plan.
|
|
112
|
+
* @property {readonly string[]} toolchains - Exact declared canonical toolchains.
|
|
113
|
+
*/
|
|
75
114
|
/**
|
|
76
115
|
* @typedef LanguageRegistry
|
|
77
116
|
* @property {readonly import("./semantic/types.js").LanguageCapabilities[]} descriptors - Public descriptors.
|
|
@@ -120,6 +159,8 @@ export function createLanguageRegistry(candidateRecords) {
|
|
|
120
159
|
const featuresCandidate = candidate.features ?? {
|
|
121
160
|
closedRecords: false,
|
|
122
161
|
conditionControlledLoops: false,
|
|
162
|
+
conditionalExpressions: false,
|
|
163
|
+
stringInterpolation: false,
|
|
123
164
|
effectfulCapabilitiesAndResources: false,
|
|
124
165
|
generalFunctionsAndCalls: false,
|
|
125
166
|
immutableCollections: false,
|
|
@@ -131,9 +172,10 @@ export function createLanguageRegistry(candidateRecords) {
|
|
|
131
172
|
typeParametersAndGenerics: false
|
|
132
173
|
};
|
|
133
174
|
if (!isPlainObject(featuresCandidate) ||
|
|
134
|
-
Object.keys(featuresCandidate).sort().join(",") != "closedRecords,conditionControlledLoops,effectfulCapabilitiesAndResources,generalFunctionsAndCalls,immutableCollections,optionalValues,orderedListIteration,orderedMapIteration,referenceClasses,typeParametersAndGenerics,typedErrors" ||
|
|
175
|
+
Object.keys(featuresCandidate).sort().join(",") != "closedRecords,conditionControlledLoops,conditionalExpressions,effectfulCapabilitiesAndResources,generalFunctionsAndCalls,immutableCollections,optionalValues,orderedListIteration,orderedMapIteration,referenceClasses,stringInterpolation,typeParametersAndGenerics,typedErrors" ||
|
|
135
176
|
typeof featuresCandidate.closedRecords != "boolean" ||
|
|
136
177
|
typeof featuresCandidate.conditionControlledLoops != "boolean" ||
|
|
178
|
+
typeof featuresCandidate.conditionalExpressions != "boolean" ||
|
|
137
179
|
typeof featuresCandidate.effectfulCapabilitiesAndResources != "boolean" ||
|
|
138
180
|
typeof featuresCandidate.generalFunctionsAndCalls != "boolean" ||
|
|
139
181
|
typeof featuresCandidate.immutableCollections != "boolean" ||
|
|
@@ -141,6 +183,7 @@ export function createLanguageRegistry(candidateRecords) {
|
|
|
141
183
|
typeof featuresCandidate.orderedListIteration != "boolean" ||
|
|
142
184
|
typeof featuresCandidate.orderedMapIteration != "boolean" ||
|
|
143
185
|
typeof featuresCandidate.referenceClasses != "boolean" ||
|
|
186
|
+
typeof featuresCandidate.stringInterpolation != "boolean" ||
|
|
144
187
|
typeof featuresCandidate.typedErrors != "boolean" ||
|
|
145
188
|
typeof featuresCandidate.typeParametersAndGenerics != "boolean") {
|
|
146
189
|
invalidRegistry(`Registry record '${id}' has an invalid feature declaration.`, id);
|
|
@@ -148,6 +191,7 @@ export function createLanguageRegistry(candidateRecords) {
|
|
|
148
191
|
const features = deepFreeze(/** @type {import("./semantic/types.js").LanguageFeatureCapabilities} */ ({
|
|
149
192
|
closedRecords: featuresCandidate.closedRecords,
|
|
150
193
|
conditionControlledLoops: featuresCandidate.conditionControlledLoops,
|
|
194
|
+
conditionalExpressions: featuresCandidate.conditionalExpressions,
|
|
151
195
|
effectfulCapabilitiesAndResources: featuresCandidate.effectfulCapabilitiesAndResources,
|
|
152
196
|
generalFunctionsAndCalls: featuresCandidate.generalFunctionsAndCalls,
|
|
153
197
|
immutableCollections: featuresCandidate.immutableCollections,
|
|
@@ -155,6 +199,7 @@ export function createLanguageRegistry(candidateRecords) {
|
|
|
155
199
|
orderedListIteration: featuresCandidate.orderedListIteration,
|
|
156
200
|
orderedMapIteration: featuresCandidate.orderedMapIteration,
|
|
157
201
|
referenceClasses: featuresCandidate.referenceClasses,
|
|
202
|
+
stringInterpolation: featuresCandidate.stringInterpolation,
|
|
158
203
|
typedErrors: featuresCandidate.typedErrors,
|
|
159
204
|
typeParametersAndGenerics: featuresCandidate.typeParametersAndGenerics
|
|
160
205
|
}));
|
|
@@ -204,11 +249,57 @@ export function createLanguageRegistry(candidateRecords) {
|
|
|
204
249
|
if (new Set(toolchains).size != toolchains.length) {
|
|
205
250
|
invalidRegistry(`Registry record '${id}' has duplicate acceptance toolchains.`, id);
|
|
206
251
|
}
|
|
252
|
+
const checkCandidate = candidate.check;
|
|
253
|
+
/** @type {Readonly<LanguageRegistryCheckRecord>} */
|
|
254
|
+
let check;
|
|
255
|
+
if (checkCandidate === undefined) {
|
|
256
|
+
check = deepFreeze({ stages: [], supported: false, toolchains: [] });
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
if (!isPlainObject(checkCandidate) || Object.keys(checkCandidate).sort().join(",") != "factory,stages,toolchains" ||
|
|
260
|
+
typeof checkCandidate.factory != "function" || !isDenseArray(checkCandidate.stages) ||
|
|
261
|
+
!isDenseArray(checkCandidate.toolchains) || checkCandidate.stages.length == 0) {
|
|
262
|
+
invalidRegistry(`Registry record '${id}' has an invalid developer-check declaration.`, id);
|
|
263
|
+
}
|
|
264
|
+
/** @type {unknown[]} */
|
|
265
|
+
const checkStageSnapshot = [];
|
|
266
|
+
/** @type {unknown[]} */
|
|
267
|
+
const checkToolchainSnapshot = [];
|
|
268
|
+
for (let index = 0; index < checkCandidate.stages.length; index += 1) {
|
|
269
|
+
checkStageSnapshot.push(checkCandidate.stages[index]);
|
|
270
|
+
}
|
|
271
|
+
for (let index = 0; index < checkCandidate.toolchains.length; index += 1) {
|
|
272
|
+
checkToolchainSnapshot.push(checkCandidate.toolchains[index]);
|
|
273
|
+
}
|
|
274
|
+
if (!checkStageSnapshot.every(stage => typeof stage == "string" && developerCheckStages.has(stage) &&
|
|
275
|
+
declaredStages.has(stage)) || !checkToolchainSnapshot.every(toolchain => typeof toolchain == "string" &&
|
|
276
|
+
toolchains.includes(toolchain)) || new Set(checkStageSnapshot).size != checkStageSnapshot.length ||
|
|
277
|
+
new Set(checkToolchainSnapshot).size != checkToolchainSnapshot.length) {
|
|
278
|
+
invalidRegistry(`Registry record '${id}' developer checks must use ordered non-executing declared stages and toolchains.`, id);
|
|
279
|
+
}
|
|
280
|
+
let previousCheckStage = -1;
|
|
281
|
+
for (const stage of checkStageSnapshot) {
|
|
282
|
+
const stageIndex = /** @type {number} */ (acceptanceStages.get(/** @type {string} */ (stage)));
|
|
283
|
+
if (stageIndex < previousCheckStage) {
|
|
284
|
+
invalidRegistry(`Registry record '${id}' has unordered developer-check stages.`, id);
|
|
285
|
+
}
|
|
286
|
+
previousCheckStage = stageIndex;
|
|
287
|
+
}
|
|
288
|
+
check = deepFreeze({
|
|
289
|
+
factory: /** @type {TargetCheckPlanFactory} */ (checkCandidate.factory),
|
|
290
|
+
stages: /** @type {import("./semantic/types.js").AcceptanceStage[]} */ (checkStageSnapshot),
|
|
291
|
+
supported: true,
|
|
292
|
+
toolchains: /** @type {string[]} */ (checkToolchainSnapshot)
|
|
293
|
+
});
|
|
294
|
+
}
|
|
207
295
|
const hasFrontend = typeof candidate.frontend == "function";
|
|
208
296
|
const hasTextBackend = typeof candidate.textBackend == "function";
|
|
209
297
|
const hasBinaryBackend = typeof candidate.binaryBackend == "function";
|
|
210
298
|
const hasApplicationBackend = typeof candidate.applicationBackend == "function";
|
|
211
299
|
const hasBackend = hasTextBackend || hasBinaryBackend || hasApplicationBackend;
|
|
300
|
+
if (check.supported && !hasBackend) {
|
|
301
|
+
invalidRegistry(`Registry record '${id}' declares developer checks without a backend role.`, id);
|
|
302
|
+
}
|
|
212
303
|
if ((mapping.richText || mapping.sourceMapV3 || mapping.binaryRanges) && !hasBackend ||
|
|
213
304
|
mapping.sourceMapV3 && !mapping.richText ||
|
|
214
305
|
mapping.binaryRanges && !hasBinaryBackend && !hasApplicationBackend) {
|
|
@@ -236,6 +327,7 @@ export function createLanguageRegistry(candidateRecords) {
|
|
|
236
327
|
const record = deepFreeze(/** @type {LanguageRegistryRecord} */ ({
|
|
237
328
|
acceptance,
|
|
238
329
|
artifactMultiplicity,
|
|
330
|
+
check,
|
|
239
331
|
features,
|
|
240
332
|
id,
|
|
241
333
|
mapping,
|
|
@@ -252,6 +344,7 @@ export function createLanguageRegistry(candidateRecords) {
|
|
|
252
344
|
const descriptor = deepFreeze(/** @type {import("./semantic/types.js").LanguageCapabilities} */ ({
|
|
253
345
|
acceptance,
|
|
254
346
|
artifactMultiplicity,
|
|
347
|
+
check: deepFreeze({ stages: check.stages, supported: check.supported, toolchains: check.toolchains }),
|
|
255
348
|
features,
|
|
256
349
|
id,
|
|
257
350
|
mapping,
|
|
@@ -349,7 +442,8 @@ const dartFrontend = ({ filename, source }) => parseDart({ filename, source });
|
|
|
349
442
|
const zigFrontend = ({ filename, source }) => parseZig({ filename, source });
|
|
350
443
|
const records = [
|
|
351
444
|
language({
|
|
352
|
-
acceptance: { stages: ["parse", "generate", "execute"], toolchains: ["php82"] },
|
|
445
|
+
acceptance: { stages: ["parse", "generate", "validate", "execute"], toolchains: ["php82"] },
|
|
446
|
+
check: { factory: createPhpCheckPlan, stages: ["validate"], toolchains: ["php82"] },
|
|
353
447
|
defaultFilename: "program.php",
|
|
354
448
|
frontend: phpFrontend,
|
|
355
449
|
id: "php",
|
|
@@ -357,7 +451,8 @@ const records = [
|
|
|
357
451
|
textBackend: generatePhp
|
|
358
452
|
}),
|
|
359
453
|
language({
|
|
360
|
-
acceptance: { stages: ["parse", "generate", "execute"], toolchains: ["ruby"] },
|
|
454
|
+
acceptance: { stages: ["parse", "generate", "validate", "execute"], toolchains: ["ruby"] },
|
|
455
|
+
check: { factory: createRubyCheckPlan, stages: ["validate"], toolchains: ["ruby"] },
|
|
361
456
|
defaultFilename: "program.rb",
|
|
362
457
|
frontend: rubyFrontend,
|
|
363
458
|
id: "ruby",
|
|
@@ -365,7 +460,8 @@ const records = [
|
|
|
365
460
|
textBackend: generateRuby
|
|
366
461
|
}),
|
|
367
462
|
language({
|
|
368
|
-
acceptance: { stages: ["parse", "generate", "execute"], toolchains: ["node"] },
|
|
463
|
+
acceptance: { stages: ["parse", "generate", "validate", "execute"], toolchains: ["node"] },
|
|
464
|
+
check: { factory: createJavaScriptCheckPlan, stages: ["validate"], toolchains: ["node"] },
|
|
369
465
|
defaultFilename: "program.js",
|
|
370
466
|
frontend: javaScriptFrontend,
|
|
371
467
|
id: "javascript",
|
|
@@ -374,6 +470,7 @@ const records = [
|
|
|
374
470
|
}),
|
|
375
471
|
language({
|
|
376
472
|
acceptance: { stages: ["parse", "generate", "compile", "execute"], toolchains: ["tsc", "node"] },
|
|
473
|
+
check: { factory: createTypeScriptCheckPlan, stages: ["compile"], toolchains: ["tsc"] },
|
|
377
474
|
defaultFilename: "program.ts",
|
|
378
475
|
frontend: typeScriptFrontend,
|
|
379
476
|
id: "typescript",
|
|
@@ -382,6 +479,7 @@ const records = [
|
|
|
382
479
|
}),
|
|
383
480
|
language({
|
|
384
481
|
acceptance: { stages: ["parse", "generate", "compile", "execute"], toolchains: ["javac", "java"] },
|
|
482
|
+
check: { factory: createJavaCheckPlan, stages: ["compile"], toolchains: ["javac"] },
|
|
385
483
|
defaultFilename: "Main.java",
|
|
386
484
|
frontend: javaFrontend,
|
|
387
485
|
id: "java",
|
|
@@ -390,6 +488,7 @@ const records = [
|
|
|
390
488
|
}),
|
|
391
489
|
language({
|
|
392
490
|
acceptance: { stages: ["parse", "generate", "compile", "execute"], toolchains: ["kotlinc", "java25"] },
|
|
491
|
+
check: { factory: createKotlinCheckPlan, stages: ["compile"], toolchains: ["kotlinc"] },
|
|
393
492
|
defaultFilename: "Program.kt",
|
|
394
493
|
frontend: kotlinFrontend,
|
|
395
494
|
id: "kotlin",
|
|
@@ -398,6 +497,7 @@ const records = [
|
|
|
398
497
|
}),
|
|
399
498
|
language({
|
|
400
499
|
acceptance: { stages: ["parse", "generate", "compile", "execute"], toolchains: ["python"] },
|
|
500
|
+
check: { factory: createPythonCheckPlan, stages: ["compile"], toolchains: ["python"] },
|
|
401
501
|
defaultFilename: "program.py",
|
|
402
502
|
frontend: pythonFrontend,
|
|
403
503
|
id: "python",
|
|
@@ -407,6 +507,7 @@ const records = [
|
|
|
407
507
|
language({
|
|
408
508
|
acceptance: { stages: ["parse", "generate", "restore", "compile", "execute"], toolchains: ["dotnet"] },
|
|
409
509
|
artifactMultiplicity: "multiple",
|
|
510
|
+
check: { factory: createCSharpCheckPlan, stages: ["restore", "compile"], toolchains: ["dotnet"] },
|
|
410
511
|
defaultFilename: "Program.cs",
|
|
411
512
|
frontend: csharpFrontend,
|
|
412
513
|
id: "csharp",
|
|
@@ -416,6 +517,7 @@ const records = [
|
|
|
416
517
|
language({
|
|
417
518
|
acceptance: { stages: ["parse", "generate", "compile", "validate", "execute"], toolchains: ["go"] },
|
|
418
519
|
artifactMultiplicity: "multiple",
|
|
520
|
+
check: { factory: createGoCheckPlan, stages: ["compile", "validate"], toolchains: ["go"] },
|
|
419
521
|
defaultFilename: "main.go",
|
|
420
522
|
frontend: goFrontend,
|
|
421
523
|
id: "go",
|
|
@@ -425,6 +527,7 @@ const records = [
|
|
|
425
527
|
language({
|
|
426
528
|
acceptance: { stages: ["parse", "generate", "compile", "link", "execute"], toolchains: ["clang"] },
|
|
427
529
|
artifactMultiplicity: "multiple",
|
|
530
|
+
check: { factory: createCCheckPlan, stages: ["compile", "link"], toolchains: ["clang"] },
|
|
428
531
|
defaultFilename: "program.c",
|
|
429
532
|
frontend: parseC,
|
|
430
533
|
id: "c",
|
|
@@ -433,22 +536,28 @@ const records = [
|
|
|
433
536
|
}),
|
|
434
537
|
language({
|
|
435
538
|
acceptance: { stages: ["parse", "generate", "compile", "link", "execute"], toolchains: ["clangpp"] },
|
|
539
|
+
check: { factory: createCppCheckPlan, stages: ["compile", "link"], toolchains: ["clangpp"] },
|
|
436
540
|
defaultFilename: "program.cpp", frontend: parseCpp, id: "cpp", mediaType: "text/x-c++src", textBackend: generateCpp
|
|
437
541
|
}),
|
|
438
542
|
language({
|
|
439
543
|
acceptance: { stages: ["parse", "generate", "compile", "validate", "execute"], toolchains: ["rustc", "cargo"] },
|
|
440
544
|
artifactMultiplicity: "multiple",
|
|
545
|
+
check: { factory: createRustCheckPlan, stages: ["compile", "validate"], toolchains: ["rustc", "cargo"] },
|
|
441
546
|
defaultFilename: "src/main.rs", frontend: parseRust, id: "rust", mediaType: "text/x-rust", textBackend: generateRustProject
|
|
442
547
|
}),
|
|
443
548
|
language({ acceptance: { stages: ["parse", "generate", "compile", "execute"], toolchains: ["swiftc"] },
|
|
549
|
+
check: { factory: createSwiftCheckPlan, stages: ["compile"], toolchains: ["swiftc"] },
|
|
444
550
|
defaultFilename: "program.swift", frontend: parseSwift, id: "swift", mediaType: "text/x-swift", textBackend: generateSwift }),
|
|
445
551
|
language({
|
|
446
552
|
acceptance: { stages: ["parse", "generate", "restore", "compile", "validate", "execute"], toolchains: ["dart"] },
|
|
447
553
|
artifactMultiplicity: "multiple",
|
|
554
|
+
check: { factory: createDartCheckPlan, stages: ["restore", "compile", "validate"], toolchains: ["dart"] },
|
|
448
555
|
defaultFilename: "bin/program.dart",
|
|
449
556
|
features: {
|
|
450
557
|
closedRecords: false,
|
|
451
558
|
conditionControlledLoops: false,
|
|
559
|
+
conditionalExpressions: false,
|
|
560
|
+
stringInterpolation: false,
|
|
452
561
|
effectfulCapabilitiesAndResources: false,
|
|
453
562
|
generalFunctionsAndCalls: true,
|
|
454
563
|
immutableCollections: false,
|
|
@@ -467,10 +576,13 @@ const records = [
|
|
|
467
576
|
language({
|
|
468
577
|
acceptance: { stages: ["parse", "generate", "compile", "validate", "execute"], toolchains: ["zig"] },
|
|
469
578
|
artifactMultiplicity: "multiple",
|
|
579
|
+
check: { factory: createZigCheckPlan, stages: ["compile", "validate"], toolchains: ["zig"] },
|
|
470
580
|
defaultFilename: "src/main.zig",
|
|
471
581
|
features: {
|
|
472
582
|
closedRecords: false,
|
|
473
583
|
conditionControlledLoops: false,
|
|
584
|
+
conditionalExpressions: false,
|
|
585
|
+
stringInterpolation: false,
|
|
474
586
|
effectfulCapabilitiesAndResources: false,
|
|
475
587
|
generalFunctionsAndCalls: true,
|
|
476
588
|
immutableCollections: false,
|
|
@@ -492,7 +604,7 @@ const records = [
|
|
|
492
604
|
artifactMultiplicity: "multiple",
|
|
493
605
|
binaryBackend: generateBrowserWasm,
|
|
494
606
|
defaultFilename: "program.wasm",
|
|
495
|
-
features: { closedRecords: false, conditionControlledLoops: false, effectfulCapabilitiesAndResources: false, generalFunctionsAndCalls: false, immutableCollections: false, optionalValues: false, orderedListIteration: false, orderedMapIteration: false, referenceClasses: false, typedErrors: false, typeParametersAndGenerics: false },
|
|
607
|
+
features: { closedRecords: false, conditionControlledLoops: false, conditionalExpressions: false, stringInterpolation: false, effectfulCapabilitiesAndResources: false, generalFunctionsAndCalls: false, immutableCollections: false, optionalValues: false, orderedListIteration: false, orderedMapIteration: false, referenceClasses: false, typedErrors: false, typeParametersAndGenerics: false },
|
|
496
608
|
id: "wasm",
|
|
497
609
|
mapping: { binaryRanges: true, richText: true, sourceMapV3: true },
|
|
498
610
|
mediaType: "application/wasm",
|
|
@@ -502,7 +614,7 @@ const records = [
|
|
|
502
614
|
acceptance: { stages: ["generate", "compile", "validate", "instantiate", "execute"], toolchains: ["android"] },
|
|
503
615
|
applicationBackend: generateAndroidApplication,
|
|
504
616
|
artifactMultiplicity: "multiple",
|
|
505
|
-
features: { closedRecords: false, conditionControlledLoops: false, effectfulCapabilitiesAndResources: false, generalFunctionsAndCalls: false, immutableCollections: false, optionalValues: false, orderedListIteration: false, orderedMapIteration: false, referenceClasses: false, typedErrors: false, typeParametersAndGenerics: false },
|
|
617
|
+
features: { closedRecords: false, conditionControlledLoops: false, conditionalExpressions: false, stringInterpolation: false, effectfulCapabilitiesAndResources: false, generalFunctionsAndCalls: false, immutableCollections: false, optionalValues: false, orderedListIteration: false, orderedMapIteration: false, referenceClasses: false, typedErrors: false, typeParametersAndGenerics: false },
|
|
506
618
|
id: "android",
|
|
507
619
|
mapping: { binaryRanges: true, richText: true, sourceMapV3: true },
|
|
508
620
|
roundTrip: false
|
|
@@ -511,7 +623,7 @@ const records = [
|
|
|
511
623
|
acceptance: { stages: ["generate"], toolchains: [] },
|
|
512
624
|
applicationBackend: generateIosApplication,
|
|
513
625
|
artifactMultiplicity: "multiple",
|
|
514
|
-
features: { closedRecords: false, conditionControlledLoops: false, effectfulCapabilitiesAndResources: false, generalFunctionsAndCalls: false, immutableCollections: false, optionalValues: false, orderedListIteration: false, orderedMapIteration: false, referenceClasses: false, typedErrors: false, typeParametersAndGenerics: false },
|
|
626
|
+
features: { closedRecords: false, conditionControlledLoops: false, conditionalExpressions: false, stringInterpolation: false, effectfulCapabilitiesAndResources: false, generalFunctionsAndCalls: false, immutableCollections: false, optionalValues: false, orderedListIteration: false, orderedMapIteration: false, referenceClasses: false, typedErrors: false, typeParametersAndGenerics: false },
|
|
515
627
|
id: "ios",
|
|
516
628
|
mapping: { binaryRanges: true, richText: true, sourceMapV3: true },
|
|
517
629
|
roundTrip: false
|
|
@@ -520,7 +632,7 @@ const records = [
|
|
|
520
632
|
acceptance: { stages: ["generate", "restore", "compile", "validate", "instantiate", "execute"], toolchains: ["flutter", "android"] },
|
|
521
633
|
applicationBackend: generateFlutterApplication,
|
|
522
634
|
artifactMultiplicity: "multiple",
|
|
523
|
-
features: { closedRecords: false, conditionControlledLoops: false, effectfulCapabilitiesAndResources: false, generalFunctionsAndCalls: false, immutableCollections: false, optionalValues: false, orderedListIteration: false, orderedMapIteration: false, referenceClasses: false, typedErrors: false, typeParametersAndGenerics: false },
|
|
635
|
+
features: { closedRecords: false, conditionControlledLoops: false, conditionalExpressions: false, stringInterpolation: false, effectfulCapabilitiesAndResources: false, generalFunctionsAndCalls: false, immutableCollections: false, optionalValues: false, orderedListIteration: false, orderedMapIteration: false, referenceClasses: false, typedErrors: false, typeParametersAndGenerics: false },
|
|
524
636
|
id: "flutter",
|
|
525
637
|
mapping: { binaryRanges: true, richText: true, sourceMapV3: true },
|
|
526
638
|
roundTrip: false
|
|
@@ -543,6 +655,8 @@ function language(values) {
|
|
|
543
655
|
features: {
|
|
544
656
|
closedRecords: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
|
|
545
657
|
conditionControlledLoops: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
|
|
658
|
+
conditionalExpressions: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
|
|
659
|
+
stringInterpolation: ["php", "ruby", "javascript", "typescript"].includes(String(values.id)),
|
|
546
660
|
effectfulCapabilitiesAndResources: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
|
|
547
661
|
generalFunctionsAndCalls: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
|
|
548
662
|
immutableCollections: ["php", "ruby", "javascript", "typescript", "java"].includes(String(values.id)),
|
|
@@ -621,4 +735,4 @@ function deepFreeze(value) {
|
|
|
621
735
|
deepFreeze(nested);
|
|
622
736
|
return Object.freeze(value);
|
|
623
737
|
}
|
|
624
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2UtcmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFuZ3VhZ2UtcmVnaXN0cnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxZQUFZLENBQUE7QUFDdkMsT0FBTyxFQUFDLHFCQUFxQixFQUFFLGVBQWUsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3RFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUMvQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFDbkQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFDMUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDakQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDdEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQ2pELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQ3RELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ3BELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQzNELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQTtBQUM3QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFDbkQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQy9DLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQzNELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQ3RELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ3hE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QixFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtBQUNwRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLEtBQUs7SUFDMUIsT0FBTyxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFBO0FBQy9ILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUU5RSxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTdELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7aXNEZW5zZUFycmF5fSBmcm9tIFwiLi9hcnJheS5qc1wiXG5pbXBvcnQge1NlbWFudGlmb2xkRGlhZ25vc3RpYywgdW5zdXBwb3J0ZWRSb2xlfSBmcm9tIFwiLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVKYXZhfSBmcm9tIFwiLi9iYWNrZW5kcy9qYXZhLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVLb3RsaW59IGZyb20gXCIuL2JhY2tlbmRzL2tvdGxpbi5qc1wiXG5pbXBvcnQge2dlbmVyYXRlQ1NoYXJwUHJvamVjdH0gZnJvbSBcIi4vYmFja2VuZHMvY3NoYXJwLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVHb01vZHVsZX0gZnJvbSBcIi4vYmFja2VuZHMvZ28uanNcIlxuaW1wb3J0IHtnZW5lcmF0ZVJ1c3RQcm9qZWN0fSBmcm9tIFwiLi9iYWNrZW5kcy9ydXN0LmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVTd2lmdH0gZnJvbSBcIi4vYmFja2VuZHMvc3dpZnQuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZURhcnRQYWNrYWdlfSBmcm9tIFwiLi9iYWNrZW5kcy9kYXJ0LmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVaaWdQcm9qZWN0fSBmcm9tIFwiLi9iYWNrZW5kcy96aWcuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZUphdmFTY3JpcHR9IGZyb20gXCIuL2JhY2tlbmRzL2phdmFzY3JpcHQuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZVBocH0gZnJvbSBcIi4vYmFja2VuZHMvcGhwLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVQeXRob259IGZyb20gXCIuL2JhY2tlbmRzL3B5dGhvbi5qc1wiXG5pbXBvcnQge2dlbmVyYXRlUnVieX0gZnJvbSBcIi4vYmFja2VuZHMvcnVieS5qc1wiXG5pbXBvcnQge2dlbmVyYXRlVHlwZVNjcmlwdH0gZnJvbSBcIi4vYmFja2VuZHMvdHlwZXNjcmlwdC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlQnJvd3Nlcldhc219IGZyb20gXCIuL2JhY2tlbmRzL3dhc20uanNcIlxuaW1wb3J0IHtnZW5lcmF0ZUlvc0FwcGxpY2F0aW9ufSBmcm9tIFwiLi9iYWNrZW5kcy9pb3MuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZUFuZHJvaWRBcHBsaWNhdGlvbn0gZnJvbSBcIi4vYmFja2VuZHMvYW5kcm9pZC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlRmx1dHRlckFwcGxpY2F0aW9ufSBmcm9tIFwiLi9iYWNrZW5kcy9mbHV0dGVyLmpzXCJcbmltcG9ydCB7cGFyc2VKYXZhfSBmcm9tIFwiLi9mcm9udGVuZHMvamF2YS5qc1wiXG5pbXBvcnQge3BhcnNlS290bGlufSBmcm9tIFwiLi9mcm9udGVuZHMva290bGluLmpzXCJcbmltcG9ydCB7cGFyc2VDU2hhcnB9IGZyb20gXCIuL2Zyb250ZW5kcy9jc2hhcnAuanNcIlxuaW1wb3J0IHtwYXJzZUdvfSBmcm9tIFwiLi9mcm9udGVuZHMvZ28uanNcIlxuaW1wb3J0IHtwYXJzZVJ1c3R9IGZyb20gXCIuL2Zyb250ZW5kcy9ydXN0LmpzXCJcbmltcG9ydCB7cGFyc2VTd2lmdH0gZnJvbSBcIi4vZnJvbnRlbmRzL3N3aWZ0LmpzXCJcbmltcG9ydCB7cGFyc2VEYXJ0fSBmcm9tIFwiLi9mcm9udGVuZHMvZGFydC5qc1wiXG5pbXBvcnQge3BhcnNlWmlnfSBmcm9tIFwiLi9mcm9udGVuZHMvemlnLmpzXCJcbmltcG9ydCB7cGFyc2VDcHB9IGZyb20gXCIuL2Zyb250ZW5kcy9jcHAuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZUNwcH0gZnJvbSBcIi4vYmFja2VuZHMvY3BwLmpzXCJcbmltcG9ydCB7cGFyc2VDfSBmcm9tIFwiLi9mcm9udGVuZHMvYy5qc1wiXG5pbXBvcnQge2dlbmVyYXRlQ1Byb2dyYW19IGZyb20gXCIuL2JhY2tlbmRzL2MuanNcIlxuaW1wb3J0IHtwYXJzZUphdmFTY3JpcHRUeXBlU2NyaXB0fSBmcm9tIFwiLi9mcm9udGVuZHMvamF2YXNjcmlwdC10eXBlc2NyaXB0LmpzXCJcbmltcG9ydCB7cGFyc2VQaHB9IGZyb20gXCIuL2Zyb250ZW5kcy9waHAuanNcIlxuaW1wb3J0IHtwYXJzZVB5dGhvbn0gZnJvbSBcIi4vZnJvbnRlbmRzL3B5dGhvbi5qc1wiXG5pbXBvcnQge3BhcnNlUnVieX0gZnJvbSBcIi4vZnJvbnRlbmRzL3J1YnkuanNcIlxuXG5jb25zdCByZWdpc3RyeVJvbGVzID0gT2JqZWN0LmZyZWV6ZShbXCJmcm9udGVuZFwiLCBcInRleHRCYWNrZW5kXCIsIFwiYmluYXJ5QmFja2VuZFwiLCBcImFwcGxpY2F0aW9uQmFja2VuZFwiLCBcImludGVyb3BlcmFiaWxpdHlcIl0pXG5jb25zdCBhY2NlcHRhbmNlU3RhZ2VPcmRlciA9IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJyZXN0b3JlXCIsIFwiY29tcGlsZVwiLCBcImxpbmtcIiwgXCJ2YWxpZGF0ZVwiLCBcImluc3RhbnRpYXRlXCIsIFwiZXhlY3V0ZVwiXVxuY29uc3QgYWNjZXB0YW5jZVN0YWdlcyA9IG5ldyBNYXAoYWNjZXB0YW5jZVN0YWdlT3JkZXIubWFwKChzdGFnZSwgaW5kZXgpID0+IFtzdGFnZSwgaW5kZXhdKSlcbmNvbnN0IHJlZ2lzdHJ5S2V5cyA9IG5ldyBTZXQoW1xuICBcImFjY2VwdGFuY2VcIiwgXCJhcHBsaWNhdGlvbkJhY2tlbmRcIiwgXCJhcnRpZmFjdE11bHRpcGxpY2l0eVwiLCBcImJpbmFyeUJhY2tlbmRcIiwgXCJkZWZhdWx0RmlsZW5hbWVcIiwgXCJmcm9udGVuZFwiLCBcImlkXCIsXG4gIFwiZmVhdHVyZXNcIiwgXCJpbnRlcm9wZXJhYmlsaXR5XCIsIFwibWFwcGluZ1wiLCBcIm1lZGlhVHlwZVwiLCBcInByb3ZpZGVyXCIsIFwicm91bmRUcmlwXCIsIFwidGV4dEJhY2tlbmRcIlxuXSlcblxuLyoqIEB0eXBlZGVmIHtcImZyb250ZW5kXCIgfCBcInRleHRCYWNrZW5kXCIgfCBcImJpbmFyeUJhY2tlbmRcIiB8IFwiYXBwbGljYXRpb25CYWNrZW5kXCIgfCBcImludGVyb3BlcmFiaWxpdHlcIn0gUmVnaXN0cnlSb2xlICovXG4vKiogQHR5cGVkZWYgeyguLi52YWx1ZXM6IHVua25vd25bXSkgPT4gdW5rbm93bn0gUmVnaXN0cnlJbXBsZW1lbnRhdGlvbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZyb250ZW5kSW5wdXRcbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBDb21waWxlci1hdXRob3JpemVkIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2UgLSBTb3VyY2UgdGV4dC5cbiAqIEBwcm9wZXJ0eSB7e2lzRW50cnk6IGJvb2xlYW4sIGZ1bmN0aW9uczogTWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPiwgcmVjb3JkczogTWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj4sIGVycm9ycz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj4sIHZhbHVlUmVjb3Jkcz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+fX0gW3Byb2dyYW1dIC0gUHJvZ3JhbSBjb252ZXJzaW9uIGNvbnRleHQuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgRnJvbnRlbmRcbiAqIEBwYXJhbSB7RnJvbnRlbmRJbnB1dH0gaW5wdXQgLSBGcm9udGVuZCByZXF1ZXN0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IFNlbWFudGljIG1vZHVsZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlUmVnaXN0cnlSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7e3N0YWdlczogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BY2NlcHRhbmNlU3RhZ2VbXSwgdG9vbGNoYWluczogc3RyaW5nW119fSBhY2NlcHRhbmNlIC0gQWNjZXB0YW5jZSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7XCJzaW5nbGVcIiB8IFwibXVsdGlwbGVcIn0gYXJ0aWZhY3RNdWx0aXBsaWNpdHkgLSBBcnRpZmFjdCBtdWx0aXBsaWNpdHkuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VGZWF0dXJlQ2FwYWJpbGl0aWVzfSBmZWF0dXJlcyAtIFNlbWFudGljIGZlYXR1cmUgY2FwYWJpbGl0aWVzLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkxhbmd1YWdlTWFwcGluZ0NhcGFiaWxpdGllc30gbWFwcGluZyAtIE1hcHBpbmcgY2FwYWJpbGl0aWVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSByb3VuZFRyaXAgLSBSb3VuZC10cmlwIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkZWZhdWx0RmlsZW5hbWVdIC0gRGVmYXVsdCBiYWNrZW5kIGZpbGVuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttZWRpYVR5cGVdIC0gRGVmYXVsdCBiYWNrZW5kIG1lZGlhIHR5cGUuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwcm92aWRlcl0gLSBUYXJnZXQgaG9zdCBzdGRsaWIgcHJvdmlkZXIvbmF0aXZlLWJpbmRpbmcgcm9sZS5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0cnlJbXBsZW1lbnRhdGlvbn0gW2Zyb250ZW5kXSAtIEZyb250ZW5kIGFkYXB0ZXIuXG4gKiBAcHJvcGVydHkge1JlZ2lzdHJ5SW1wbGVtZW50YXRpb259IFt0ZXh0QmFja2VuZF0gLSBUZXh0IGJhY2tlbmQuXG4gKiBAcHJvcGVydHkge1JlZ2lzdHJ5SW1wbGVtZW50YXRpb259IFtiaW5hcnlCYWNrZW5kXSAtIEJpbmFyeSBiYWNrZW5kLlxuICogQHByb3BlcnR5IHtSZWdpc3RyeUltcGxlbWVudGF0aW9ufSBbYXBwbGljYXRpb25CYWNrZW5kXSAtIEFwcGxpY2F0aW9uLWFydGlmYWN0IGJhY2tlbmQuXG4gKiBAcHJvcGVydHkge1JlZ2lzdHJ5SW1wbGVtZW50YXRpb259IFtpbnRlcm9wZXJhYmlsaXR5XSAtIEludGVyb3BlcmFiaWxpdHkgYnJpZGdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VSZWdpc3RyeVxuICogQHByb3BlcnR5IHtyZWFkb25seSBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkxhbmd1YWdlQ2FwYWJpbGl0aWVzW119IGRlc2NyaXB0b3JzIC0gUHVibGljIGRlc2NyaXB0b3JzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gaWRzIC0gUmVnaXN0ZXJlZCBJRHMgaW4gc3RhYmxlIG9yZGVyLlxuICogQHByb3BlcnR5IHsoaWQ6IHN0cmluZykgPT4gUmVhZG9ubHk8TGFuZ3VhZ2VSZWdpc3RyeVJlY29yZD59IHJlY29yZCAtIEV4YWN0IHJlY29yZCBsb29rdXAuXG4gKiBAcHJvcGVydHkgeyhpZDogc3RyaW5nLCByb2xlOiBSZWdpc3RyeVJvbGUsIGxvY2F0aW9uPzogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbikgPT4gUmVnaXN0cnlJbXBsZW1lbnRhdGlvbn0gcmVzb2x2ZSAtIFJvbGUgbG9va3VwLlxuICovXG5cbi8qKlxuICogQ29uc3RydWN0cyBhbiBpbW11dGFibGUgcm9sZSByZWdpc3RyeSBmcm9tIG9yZGVyZWQgcmVjb3Jkcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlUmVjb3JkcyAtIE9yZGVyZWQgbGFuZ3VhZ2UgcmVjb3Jkcy5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxMYW5ndWFnZVJlZ2lzdHJ5Pn0gUmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5ndWFnZVJlZ2lzdHJ5KGNhbmRpZGF0ZVJlY29yZHMpIHtcbiAgaWYgKCFpc0RlbnNlQXJyYXkoY2FuZGlkYXRlUmVjb3JkcykpIGludmFsaWRSZWdpc3RyeShcIlJlZ2lzdHJ5IHJlY29yZHMgbXVzdCBiZSBhbiBvcmRlcmVkIGRlbnNlIGFycmF5LlwiKVxuXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgUmVhZG9ubHk8TGFuZ3VhZ2VSZWdpc3RyeVJlY29yZD4+fSAqL1xuICBjb25zdCByZWNvcmRzQnlJZCA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VDYXBhYmlsaXRpZXNbXX0gKi9cbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBbXVxuXG4gIGZvciAobGV0IHJlY29yZEluZGV4ID0gMDsgcmVjb3JkSW5kZXggPCBjYW5kaWRhdGVSZWNvcmRzLmxlbmd0aDsgcmVjb3JkSW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZVJlY29yZHNbcmVjb3JkSW5kZXhdXG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoY2FuZGlkYXRlKSkgaW52YWxpZFJlZ2lzdHJ5KFwiRXZlcnkgcmVnaXN0cnkgcmVjb3JkIG11c3QgYmUgYSBwbGFpbiBvYmplY3QuXCIpXG4gICAgY29uc3QgaWQgPSBjYW5kaWRhdGUuaWRcblxuICAgIGlmICh0eXBlb2YgaWQgIT0gXCJzdHJpbmdcIiB8fCBpZC5sZW5ndGggPT0gMCB8fCAhL15bYS16XVthLXowLTktXSokL3UudGVzdChpZCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShcIkV2ZXJ5IHJlZ2lzdHJ5IHJlY29yZCByZXF1aXJlcyBhIHN0YWJsZSBsb3dlcmNhc2UgSUQuXCIsIHR5cGVvZiBpZCA9PSBcInN0cmluZ1wiID8gaWQgOiB1bmRlZmluZWQpXG4gICAgfVxuICAgIGlmIChyZWNvcmRzQnlJZC5oYXMoaWQpKSBpbnZhbGlkUmVnaXN0cnkoYER1cGxpY2F0ZSByZWdpc3RyeSBJRCAnJHtpZH0nLmAsIGlkKVxuICAgIGlmIChPYmplY3Qua2V5cyhjYW5kaWRhdGUpLnNvbWUoKGtleSkgPT4gIXJlZ2lzdHJ5S2V5cy5oYXMoa2V5KSkpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIHVua25vd24gZmllbGRzLmAsIGlkKVxuICAgIGlmIChjYW5kaWRhdGUucHJvdmlkZXIgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgY2FuZGlkYXRlLnByb3ZpZGVyICE9IFwiYm9vbGVhblwiKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGRlY2xhcmVzIGFuIGludmFsaWQgcHJvdmlkZXIgcm9sZS5gLCBpZClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvbGUgb2YgcmVnaXN0cnlSb2xlcykge1xuICAgICAgaWYgKGNhbmRpZGF0ZVtyb2xlXSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBjYW5kaWRhdGVbcm9sZV0gIT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcm9sZSAnJHtyb2xlfScgZm9yICcke2lkfScgbXVzdCBiZSBhIGZ1bmN0aW9uIHdoZW4gcHJlc2VudC5gLCBpZClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXJ0aWZhY3RNdWx0aXBsaWNpdHkgPSBjYW5kaWRhdGUuYXJ0aWZhY3RNdWx0aXBsaWNpdHlcblxuICAgIGlmIChhcnRpZmFjdE11bHRpcGxpY2l0eSAhPSBcInNpbmdsZVwiICYmIGFydGlmYWN0TXVsdGlwbGljaXR5ICE9IFwibXVsdGlwbGVcIikge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBoYXMgYW4gaW52YWxpZCBhcnRpZmFjdCBtdWx0aXBsaWNpdHkuYCwgaWQpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlLnJvdW5kVHJpcCAhPSBcImJvb2xlYW5cIikgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyByZXF1aXJlcyBhIEJvb2xlYW4gcm91bmQtdHJpcCBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICBjb25zdCBmZWF0dXJlc0NhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5mZWF0dXJlcyA/PyB7XG4gICAgICBjbG9zZWRSZWNvcmRzOiBmYWxzZSxcbiAgICAgIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogZmFsc2UsXG4gICAgICBlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXM6IGZhbHNlLFxuICAgICAgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiBmYWxzZSxcbiAgICAgIGltbXV0YWJsZUNvbGxlY3Rpb25zOiBmYWxzZSxcbiAgICAgIG9wdGlvbmFsVmFsdWVzOiBmYWxzZSxcbiAgICAgIG9yZGVyZWRMaXN0SXRlcmF0aW9uOiBmYWxzZSxcbiAgICAgIG9yZGVyZWRNYXBJdGVyYXRpb246IGZhbHNlLFxuICAgICAgcmVmZXJlbmNlQ2xhc3NlczogZmFsc2UsXG4gICAgICB0eXBlZEVycm9yczogZmFsc2UsXG4gICAgICB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzOiBmYWxzZVxuICAgIH1cblxuICAgIGlmICghaXNQbGFpbk9iamVjdChmZWF0dXJlc0NhbmRpZGF0ZSkgfHxcbiAgICAgIE9iamVjdC5rZXlzKGZlYXR1cmVzQ2FuZGlkYXRlKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJjbG9zZWRSZWNvcmRzLGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wcyxlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXMsZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzLGltbXV0YWJsZUNvbGxlY3Rpb25zLG9wdGlvbmFsVmFsdWVzLG9yZGVyZWRMaXN0SXRlcmF0aW9uLG9yZGVyZWRNYXBJdGVyYXRpb24scmVmZXJlbmNlQ2xhc3Nlcyx0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzLHR5cGVkRXJyb3JzXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS5jbG9zZWRSZWNvcmRzICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUuY29uZGl0aW9uQ29udHJvbGxlZExvb3BzICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUuZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUuZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUuaW1tdXRhYmxlQ29sbGVjdGlvbnMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS5vcHRpb25hbFZhbHVlcyAhPSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIGZlYXR1cmVzQ2FuZGlkYXRlLm9yZGVyZWRMaXN0SXRlcmF0aW9uICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUub3JkZXJlZE1hcEl0ZXJhdGlvbiAhPSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIGZlYXR1cmVzQ2FuZGlkYXRlLnJlZmVyZW5jZUNsYXNzZXMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS50eXBlZEVycm9ycyAhPSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIGZlYXR1cmVzQ2FuZGlkYXRlLnR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3MgIT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgZmVhdHVyZSBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICB9XG4gICAgY29uc3QgZmVhdHVyZXMgPSBkZWVwRnJlZXplKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5MYW5ndWFnZUZlYXR1cmVDYXBhYmlsaXRpZXN9ICovICh7XG4gICAgICBjbG9zZWRSZWNvcmRzOiBmZWF0dXJlc0NhbmRpZGF0ZS5jbG9zZWRSZWNvcmRzLFxuICAgICAgY29uZGl0aW9uQ29udHJvbGxlZExvb3BzOiBmZWF0dXJlc0NhbmRpZGF0ZS5jb25kaXRpb25Db250cm9sbGVkTG9vcHMsXG4gICAgICBlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXM6IGZlYXR1cmVzQ2FuZGlkYXRlLmVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlcyxcbiAgICAgIGdlbmVyYWxGdW5jdGlvbnNBbmRDYWxsczogZmVhdHVyZXNDYW5kaWRhdGUuZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzLFxuICAgICAgaW1tdXRhYmxlQ29sbGVjdGlvbnM6IGZlYXR1cmVzQ2FuZGlkYXRlLmltbXV0YWJsZUNvbGxlY3Rpb25zLFxuICAgICAgb3B0aW9uYWxWYWx1ZXM6IGZlYXR1cmVzQ2FuZGlkYXRlLm9wdGlvbmFsVmFsdWVzLFxuICAgICAgb3JkZXJlZExpc3RJdGVyYXRpb246IGZlYXR1cmVzQ2FuZGlkYXRlLm9yZGVyZWRMaXN0SXRlcmF0aW9uLFxuICAgICAgb3JkZXJlZE1hcEl0ZXJhdGlvbjogZmVhdHVyZXNDYW5kaWRhdGUub3JkZXJlZE1hcEl0ZXJhdGlvbixcbiAgICAgIHJlZmVyZW5jZUNsYXNzZXM6IGZlYXR1cmVzQ2FuZGlkYXRlLnJlZmVyZW5jZUNsYXNzZXMsXG4gICAgICB0eXBlZEVycm9yczogZmVhdHVyZXNDYW5kaWRhdGUudHlwZWRFcnJvcnMsXG4gICAgICB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzOiBmZWF0dXJlc0NhbmRpZGF0ZS50eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzXG4gICAgfSkpXG4gICAgY29uc3QgbWFwcGluZ0NhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5tYXBwaW5nXG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QobWFwcGluZ0NhbmRpZGF0ZSkpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgbWFwcGluZyBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICBjb25zdCBtYXBwaW5nU25hcHNob3QgPSB7XG4gICAgICBiaW5hcnlSYW5nZXM6IG1hcHBpbmdDYW5kaWRhdGUuYmluYXJ5UmFuZ2VzLFxuICAgICAgcmljaFRleHQ6IG1hcHBpbmdDYW5kaWRhdGUucmljaFRleHQsXG4gICAgICBzb3VyY2VNYXBWMzogbWFwcGluZ0NhbmRpZGF0ZS5zb3VyY2VNYXBWM1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWFwcGluZ1NuYXBzaG90LnJpY2hUZXh0ICE9IFwiYm9vbGVhblwiIHx8IHR5cGVvZiBtYXBwaW5nU25hcHNob3Quc291cmNlTWFwVjMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBtYXBwaW5nU25hcHNob3QuYmluYXJ5UmFuZ2VzICE9IFwiYm9vbGVhblwiKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyBhbiBpbnZhbGlkIG1hcHBpbmcgZGVjbGFyYXRpb24uYCwgaWQpXG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmcgPSBkZWVwRnJlZXplKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5MYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXN9ICovIChtYXBwaW5nU25hcHNob3QpKVxuICAgIGNvbnN0IGFjY2VwdGFuY2VDYW5kaWRhdGUgPSBjYW5kaWRhdGUuYWNjZXB0YW5jZVxuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjY2VwdGFuY2VDYW5kaWRhdGUpIHx8ICFpc0RlbnNlQXJyYXkoYWNjZXB0YW5jZUNhbmRpZGF0ZS5zdGFnZXMpIHx8XG4gICAgICAhaXNEZW5zZUFycmF5KGFjY2VwdGFuY2VDYW5kaWRhdGUudG9vbGNoYWlucykpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgYWNjZXB0YW5jZSBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICB9XG4gICAgLyoqIEB0eXBlIHt1bmtub3duW119ICovXG4gICAgY29uc3Qgc3RhZ2VTbmFwc2hvdCA9IFtdXG4gICAgLyoqIEB0eXBlIHt1bmtub3duW119ICovXG4gICAgY29uc3QgdG9vbGNoYWluU25hcHNob3QgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFjY2VwdGFuY2VDYW5kaWRhdGUuc3RhZ2VzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RhZ2VTbmFwc2hvdC5wdXNoKGFjY2VwdGFuY2VDYW5kaWRhdGUuc3RhZ2VzW2luZGV4XSlcbiAgICB9XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFjY2VwdGFuY2VDYW5kaWRhdGUudG9vbGNoYWlucy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHRvb2xjaGFpblNuYXBzaG90LnB1c2goYWNjZXB0YW5jZUNhbmRpZGF0ZS50b29sY2hhaW5zW2luZGV4XSlcbiAgICB9XG4gICAgaWYgKCFzdGFnZVNuYXBzaG90LmV2ZXJ5KChzdGFnZSkgPT4gdHlwZW9mIHN0YWdlID09IFwic3RyaW5nXCIgJiYgYWNjZXB0YW5jZVN0YWdlcy5oYXMoc3RhZ2UpKSB8fFxuICAgICAgIXRvb2xjaGFpblNuYXBzaG90LmV2ZXJ5KCh0b29sY2hhaW4pID0+IHR5cGVvZiB0b29sY2hhaW4gPT0gXCJzdHJpbmdcIiAmJiB0b29sY2hhaW4ubGVuZ3RoID4gMCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgYWNjZXB0YW5jZSBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICB9XG4gICAgY29uc3Qgc3RhZ2VzID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkFjY2VwdGFuY2VTdGFnZVtdfSAqLyAoc3RhZ2VTbmFwc2hvdClcbiAgICBjb25zdCB0b29sY2hhaW5zID0gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKHRvb2xjaGFpblNuYXBzaG90KVxuICAgIGxldCBwcmV2aW91c1N0YWdlID0gLTFcbiAgICBjb25zdCBkZWNsYXJlZFN0YWdlcyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCBzdGFnZSBvZiBzdGFnZXMpIHtcbiAgICAgIGNvbnN0IHN0YWdlSW5kZXggPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGFjY2VwdGFuY2VTdGFnZXMuZ2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc3RhZ2UpKSlcblxuICAgICAgaWYgKGRlY2xhcmVkU3RhZ2VzLmhhcyhzdGFnZSkgfHwgc3RhZ2VJbmRleCA8IHByZXZpb3VzU3RhZ2UpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIHVub3JkZXJlZCBvciBkdXBsaWNhdGUgYWNjZXB0YW5jZSBzdGFnZXMuYCwgaWQpXG4gICAgICBkZWNsYXJlZFN0YWdlcy5hZGQoc3RhZ2UpXG4gICAgICBwcmV2aW91c1N0YWdlID0gc3RhZ2VJbmRleFxuICAgIH1cbiAgICBpZiAobmV3IFNldCh0b29sY2hhaW5zKS5zaXplICE9IHRvb2xjaGFpbnMubGVuZ3RoKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyBkdXBsaWNhdGUgYWNjZXB0YW5jZSB0b29sY2hhaW5zLmAsIGlkKVxuICAgIH1cblxuICAgIGNvbnN0IGhhc0Zyb250ZW5kID0gdHlwZW9mIGNhbmRpZGF0ZS5mcm9udGVuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICBjb25zdCBoYXNUZXh0QmFja2VuZCA9IHR5cGVvZiBjYW5kaWRhdGUudGV4dEJhY2tlbmQgPT0gXCJmdW5jdGlvblwiXG4gICAgY29uc3QgaGFzQmluYXJ5QmFja2VuZCA9IHR5cGVvZiBjYW5kaWRhdGUuYmluYXJ5QmFja2VuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICBjb25zdCBoYXNBcHBsaWNhdGlvbkJhY2tlbmQgPSB0eXBlb2YgY2FuZGlkYXRlLmFwcGxpY2F0aW9uQmFja2VuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICBjb25zdCBoYXNCYWNrZW5kID0gaGFzVGV4dEJhY2tlbmQgfHwgaGFzQmluYXJ5QmFja2VuZCB8fCBoYXNBcHBsaWNhdGlvbkJhY2tlbmRcblxuICAgIGlmICgobWFwcGluZy5yaWNoVGV4dCB8fCBtYXBwaW5nLnNvdXJjZU1hcFYzIHx8IG1hcHBpbmcuYmluYXJ5UmFuZ2VzKSAmJiAhaGFzQmFja2VuZCB8fFxuICAgICAgbWFwcGluZy5zb3VyY2VNYXBWMyAmJiAhbWFwcGluZy5yaWNoVGV4dCB8fFxuICAgICAgbWFwcGluZy5iaW5hcnlSYW5nZXMgJiYgIWhhc0JpbmFyeUJhY2tlbmQgJiYgIWhhc0FwcGxpY2F0aW9uQmFja2VuZCkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBkZWNsYXJlcyBtYXBwaW5nIHN1cHBvcnQgd2l0aG91dCBpdHMgcmVxdWlyZWQgYmFja2VuZCByb2xlLmAsIGlkKVxuICAgIH1cbiAgICBpZiAoY2FuZGlkYXRlLnJvdW5kVHJpcCAmJiAoIWhhc0Zyb250ZW5kIHx8ICFoYXNCYWNrZW5kKSkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBkZWNsYXJlcyByb3VuZC10cmlwIHN1cHBvcnQgd2l0aG91dCBmcm9udGVuZCBhbmQgYmFja2VuZCByb2xlcy5gLCBpZClcbiAgICB9XG4gICAgaWYgKHN0YWdlcy5pbmNsdWRlcyhcInBhcnNlXCIpICYmICFoYXNGcm9udGVuZCB8fCBzdGFnZXMuaW5jbHVkZXMoXCJnZW5lcmF0ZVwiKSAmJiAhaGFzQmFja2VuZCkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBkZWNsYXJlcyBhbiBhY2NlcHRhbmNlIHN0YWdlIHdpdGhvdXQgaXRzIHJlcXVpcmVkIHJvbGUuYCwgaWQpXG4gICAgfVxuXG4gICAgY29uc3QgaGFzRGVmYXVsdGVkQmFja2VuZCA9IGhhc1RleHRCYWNrZW5kIHx8IGhhc0JpbmFyeUJhY2tlbmRcblxuICAgIGlmICgoaGFzRGVmYXVsdGVkQmFja2VuZCB8fCBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAodHlwZW9mIGNhbmRpZGF0ZS5kZWZhdWx0RmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fCBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lLmxlbmd0aCA9PSAwKSkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSBiYWNrZW5kICcke2lkfScgcmVxdWlyZXMgYSBkZWZhdWx0IGZpbGVuYW1lLmAsIGlkKVxuICAgIH1cbiAgICBpZiAoKGhhc0RlZmF1bHRlZEJhY2tlbmQgfHwgY2FuZGlkYXRlLm1lZGlhVHlwZSAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgKHR5cGVvZiBjYW5kaWRhdGUubWVkaWFUeXBlICE9IFwic3RyaW5nXCIgfHwgY2FuZGlkYXRlLm1lZGlhVHlwZS5sZW5ndGggPT0gMCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgYmFja2VuZCAnJHtpZH0nIHJlcXVpcmVzIGEgbWVkaWEgdHlwZS5gLCBpZClcbiAgICB9XG5cbiAgICBjb25zdCBhY2NlcHRhbmNlID0gZGVlcEZyZWV6ZSgvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VBY2NlcHRhbmNlQ2FwYWJpbGl0aWVzfSAqLyAoe1xuICAgICAgc3RhZ2VzLFxuICAgICAgdG9vbGNoYWluc1xuICAgIH0pKVxuICAgIGNvbnN0IHJlY29yZCA9IGRlZXBGcmVlemUoLyoqIEB0eXBlIHtMYW5ndWFnZVJlZ2lzdHJ5UmVjb3JkfSAqLyAoe1xuICAgICAgYWNjZXB0YW5jZSxcbiAgICAgIGFydGlmYWN0TXVsdGlwbGljaXR5LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBpZCxcbiAgICAgIG1hcHBpbmcsXG4gICAgICByb3VuZFRyaXA6IGNhbmRpZGF0ZS5yb3VuZFRyaXAsXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5kZWZhdWx0RmlsZW5hbWUgPT0gXCJzdHJpbmdcIiA/IHtkZWZhdWx0RmlsZW5hbWU6IGNhbmRpZGF0ZS5kZWZhdWx0RmlsZW5hbWV9IDoge30pLFxuICAgICAgLi4uKHR5cGVvZiBjYW5kaWRhdGUubWVkaWFUeXBlID09IFwic3RyaW5nXCIgPyB7bWVkaWFUeXBlOiBjYW5kaWRhdGUubWVkaWFUeXBlfSA6IHt9KSxcbiAgICAgIC4uLih0eXBlb2YgY2FuZGlkYXRlLnByb3ZpZGVyID09IFwiYm9vbGVhblwiID8ge3Byb3ZpZGVyOiBjYW5kaWRhdGUucHJvdmlkZXJ9IDoge30pLFxuICAgICAgLi4uKHR5cGVvZiBjYW5kaWRhdGUuZnJvbnRlbmQgPT0gXCJmdW5jdGlvblwiID8ge2Zyb250ZW5kOiBjYW5kaWRhdGUuZnJvbnRlbmR9IDoge30pLFxuICAgICAgLi4uKHR5cGVvZiBjYW5kaWRhdGUudGV4dEJhY2tlbmQgPT0gXCJmdW5jdGlvblwiID8ge3RleHRCYWNrZW5kOiBjYW5kaWRhdGUudGV4dEJhY2tlbmR9IDoge30pLFxuICAgICAgLi4uKHR5cGVvZiBjYW5kaWRhdGUuYmluYXJ5QmFja2VuZCA9PSBcImZ1bmN0aW9uXCIgPyB7YmluYXJ5QmFja2VuZDogY2FuZGlkYXRlLmJpbmFyeUJhY2tlbmR9IDoge30pLFxuICAgICAgLi4uKHR5cGVvZiBjYW5kaWRhdGUuYXBwbGljYXRpb25CYWNrZW5kID09IFwiZnVuY3Rpb25cIiA/IHthcHBsaWNhdGlvbkJhY2tlbmQ6IGNhbmRpZGF0ZS5hcHBsaWNhdGlvbkJhY2tlbmR9IDoge30pLFxuICAgICAgLi4uKHR5cGVvZiBjYW5kaWRhdGUuaW50ZXJvcGVyYWJpbGl0eSA9PSBcImZ1bmN0aW9uXCIgPyB7aW50ZXJvcGVyYWJpbGl0eTogY2FuZGlkYXRlLmludGVyb3BlcmFiaWxpdHl9IDoge30pXG4gICAgfSkpXG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGRlZXBGcmVlemUoLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkxhbmd1YWdlQ2FwYWJpbGl0aWVzfSAqLyAoe1xuICAgICAgYWNjZXB0YW5jZSxcbiAgICAgIGFydGlmYWN0TXVsdGlwbGljaXR5LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBpZCxcbiAgICAgIG1hcHBpbmcsXG4gICAgICByb2xlczoge1xuICAgICAgICBhcHBsaWNhdGlvbkJhY2tlbmQ6IHR5cGVvZiBjYW5kaWRhdGUuYXBwbGljYXRpb25CYWNrZW5kID09IFwiZnVuY3Rpb25cIixcbiAgICAgICAgYmluYXJ5QmFja2VuZDogdHlwZW9mIGNhbmRpZGF0ZS5iaW5hcnlCYWNrZW5kID09IFwiZnVuY3Rpb25cIixcbiAgICAgICAgZnJvbnRlbmQ6IHR5cGVvZiBjYW5kaWRhdGUuZnJvbnRlbmQgPT0gXCJmdW5jdGlvblwiLFxuICAgICAgICBpbnRlcm9wZXJhYmlsaXR5OiB0eXBlb2YgY2FuZGlkYXRlLmludGVyb3BlcmFiaWxpdHkgPT0gXCJmdW5jdGlvblwiLFxuICAgICAgICBwcm92aWRlcjogY2FuZGlkYXRlLnByb3ZpZGVyID09PSB0cnVlLFxuICAgICAgICB0ZXh0QmFja2VuZDogdHlwZW9mIGNhbmRpZGF0ZS50ZXh0QmFja2VuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICAgIH0sXG4gICAgICByb3VuZFRyaXA6IGNhbmRpZGF0ZS5yb3VuZFRyaXBcbiAgICB9KSlcblxuICAgIHJlY29yZHNCeUlkLnNldChpZCwgcmVjb3JkKVxuICAgIGRlc2NyaXB0b3JzLnB1c2goZGVzY3JpcHRvcilcbiAgfVxuXG4gIGNvbnN0IGZyb3plbkRlc2NyaXB0b3JzID0gZGVlcEZyZWV6ZShkZXNjcmlwdG9ycylcbiAgY29uc3QgaWRzID0gT2JqZWN0LmZyZWV6ZShmcm96ZW5EZXNjcmlwdG9ycy5tYXAoKHtpZH0pID0+IGlkKSlcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgZGVzY3JpcHRvcnM6IGZyb3plbkRlc2NyaXB0b3JzLFxuICAgIGlkcyxcbiAgICByZWNvcmQoaWQpIHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHNCeUlkLmdldChpZClcblxuICAgICAgaWYgKCFyZWNvcmQpIHVuc3VwcG9ydGVkTGFuZ3VhZ2UoaWQpXG5cbiAgICAgIHJldHVybiByZWNvcmRcbiAgICB9LFxuICAgIHJlc29sdmUoaWQsIHJvbGUsIGxvY2F0aW9uKSB7XG4gICAgICBpZiAoIXJlZ2lzdHJ5Um9sZXMuaW5jbHVkZXMocm9sZSkpIGludmFsaWRSZWdpc3RyeShgVW5rbm93biByZWdpc3RyeSByb2xlICcke3JvbGV9Jy5gLCBpZClcbiAgICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHNCeUlkLmdldChpZClcblxuICAgICAgaWYgKCFyZWNvcmQpIHVuc3VwcG9ydGVkTGFuZ3VhZ2UoaWQsIGxvY2F0aW9uLCByb2xlKVxuICAgICAgY29uc3QgaW1wbGVtZW50YXRpb24gPSByZWNvcmRbcm9sZV1cblxuICAgICAgaWYgKHR5cGVvZiBpbXBsZW1lbnRhdGlvbiAhPSBcImZ1bmN0aW9uXCIpIHVuc3VwcG9ydGVkUm9sZShpZCwgcHVibGljUm9sZU5hbWUocm9sZSksIGxvY2F0aW9uKVxuXG4gICAgICByZXR1cm4gaW1wbGVtZW50YXRpb25cbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogUEhQIHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IHBocEZyb250ZW5kID0gKHtjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBwcm9ncmFtLCBzb3VyY2V9KSA9PiBwYXJzZVBocCh7Y2FwYWJpbGl0aWVzLCBmaWxlbmFtZSwgcHJvZ3JhbSwgc291cmNlfSlcblxuLyoqXG4gKiBSdWJ5IHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IHJ1YnlGcm9udGVuZCA9ICh7Y2FwYWJpbGl0aWVzLCBmaWxlbmFtZSwgcHJvZ3JhbSwgc291cmNlfSkgPT4gcGFyc2VSdWJ5KHtjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBwcm9ncmFtLCBzb3VyY2V9KVxuXG4vKipcbiAqIEphdmFTY3JpcHQgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgamF2YVNjcmlwdEZyb250ZW5kID0gKHtjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBwcm9ncmFtLCBzb3VyY2V9KSA9PiBwYXJzZUphdmFTY3JpcHRUeXBlU2NyaXB0KHtjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBsYW5ndWFnZTogXCJqYXZhc2NyaXB0XCIsIHByb2dyYW0sIHNvdXJjZX0pXG5cbi8qKlxuICogVHlwZVNjcmlwdCByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCB0eXBlU2NyaXB0RnJvbnRlbmQgPSAoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIHByb2dyYW0sIHNvdXJjZX0pID0+IHBhcnNlSmF2YVNjcmlwdFR5cGVTY3JpcHQoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIGxhbmd1YWdlOiBcInR5cGVzY3JpcHRcIiwgcHJvZ3JhbSwgc291cmNlfSlcblxuLyoqXG4gKiBKYXZhIHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IGphdmFGcm9udGVuZCA9ICh7Y2FwYWJpbGl0aWVzLCBmaWxlbmFtZSwgcHJvZ3JhbSwgc291cmNlfSkgPT4gcGFyc2VKYXZhKHtjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBwcm9ncmFtLCBzb3VyY2V9KVxuXG4vKipcbiAqIEtvdGxpbiByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCBrb3RsaW5Gcm9udGVuZCA9ICh7ZmlsZW5hbWUsIHNvdXJjZX0pID0+IHBhcnNlS290bGluKHtmaWxlbmFtZSwgc291cmNlfSlcblxuLyoqXG4gKiBQeXRob24gcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgcHl0aG9uRnJvbnRlbmQgPSAoe2ZpbGVuYW1lLCBzb3VyY2V9KSA9PiBwYXJzZVB5dGhvbih7ZmlsZW5hbWUsIHNvdXJjZX0pXG5cbi8qKlxuICogQyMgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgY3NoYXJwRnJvbnRlbmQgPSAoe2ZpbGVuYW1lLCBzb3VyY2V9KSA9PiBwYXJzZUNTaGFycCh7ZmlsZW5hbWUsIHNvdXJjZX0pXG5cbi8qKlxuICogR28gcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgZ29Gcm9udGVuZCA9ICh7ZmlsZW5hbWUsIHNvdXJjZX0pID0+IHBhcnNlR28oe2ZpbGVuYW1lLCBzb3VyY2V9KVxuXG4vKipcbiAqIERhcnQgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgZGFydEZyb250ZW5kID0gKHtmaWxlbmFtZSwgc291cmNlfSkgPT4gcGFyc2VEYXJ0KHtmaWxlbmFtZSwgc291cmNlfSlcblxuLyoqXG4gKiBaaWcgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgemlnRnJvbnRlbmQgPSAoe2ZpbGVuYW1lLCBzb3VyY2V9KSA9PiBwYXJzZVppZyh7ZmlsZW5hbWUsIHNvdXJjZX0pXG5cbmNvbnN0IHJlY29yZHMgPSBbXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wicGhwODJcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLnBocFwiLFxuICAgIGZyb250ZW5kOiBwaHBGcm9udGVuZCxcbiAgICBpZDogXCJwaHBcIixcbiAgICBtZWRpYVR5cGU6IFwiYXBwbGljYXRpb24veC1odHRwZC1waHBcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVQaHBcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wicnVieVwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0ucmJcIixcbiAgICBmcm9udGVuZDogcnVieUZyb250ZW5kLFxuICAgIGlkOiBcInJ1YnlcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LXJ1YnlcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVSdWJ5XG4gIH0pLFxuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcIm5vZGVcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLmpzXCIsXG4gICAgZnJvbnRlbmQ6IGphdmFTY3JpcHRGcm9udGVuZCxcbiAgICBpZDogXCJqYXZhc2NyaXB0XCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQvamF2YXNjcmlwdFwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZUphdmFTY3JpcHRcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInRzY1wiLCBcIm5vZGVcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLnRzXCIsXG4gICAgZnJvbnRlbmQ6IHR5cGVTY3JpcHRGcm9udGVuZCxcbiAgICBpZDogXCJ0eXBlc2NyaXB0XCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQvdHlwZXNjcmlwdFwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZVR5cGVTY3JpcHRcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImphdmFjXCIsIFwiamF2YVwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcIk1haW4uamF2YVwiLFxuICAgIGZyb250ZW5kOiBqYXZhRnJvbnRlbmQsXG4gICAgaWQ6IFwiamF2YVwiLFxuICAgIG1lZGlhVHlwZTogXCJ0ZXh0L3gtamF2YS1zb3VyY2VcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVKYXZhXG4gIH0pLFxuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImNvbXBpbGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJrb3RsaW5jXCIsIFwiamF2YTI1XCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwiUHJvZ3JhbS5rdFwiLFxuICAgIGZyb250ZW5kOiBrb3RsaW5Gcm9udGVuZCxcbiAgICBpZDogXCJrb3RsaW5cIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWtvdGxpblwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZUtvdGxpblxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wicHl0aG9uXCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS5weVwiLFxuICAgIGZyb250ZW5kOiBweXRob25Gcm9udGVuZCxcbiAgICBpZDogXCJweXRob25cIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LXB5dGhvblwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZVB5dGhvblxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJyZXN0b3JlXCIsIFwiY29tcGlsZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImRvdG5ldFwiXX0sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwiUHJvZ3JhbS5jc1wiLFxuICAgIGZyb250ZW5kOiBjc2hhcnBGcm9udGVuZCxcbiAgICBpZDogXCJjc2hhcnBcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWNzaGFycFwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZUNTaGFycFByb2plY3RcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcInZhbGlkYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wiZ29cIl19LFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcIm1haW4uZ29cIixcbiAgICBmcm9udGVuZDogZ29Gcm9udGVuZCxcbiAgICBpZDogXCJnb1wiLFxuICAgIG1lZGlhVHlwZTogXCJ0ZXh0L3gtZ29cIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVHb01vZHVsZVxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwibGlua1wiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImNsYW5nXCJdfSxcbiAgICBhcnRpZmFjdE11bHRpcGxpY2l0eTogXCJtdWx0aXBsZVwiLFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLmNcIixcbiAgICBmcm9udGVuZDogcGFyc2VDLFxuICAgIGlkOiBcImNcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWNcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVDUHJvZ3JhbVxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwibGlua1wiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImNsYW5ncHBcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLmNwcFwiLCBmcm9udGVuZDogcGFyc2VDcHAsIGlkOiBcImNwcFwiLCBtZWRpYVR5cGU6IFwidGV4dC94LWMrK3NyY1wiLCB0ZXh0QmFja2VuZDogZ2VuZXJhdGVDcHBcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcInZhbGlkYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wicnVzdGNcIiwgXCJjYXJnb1wiXX0sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwic3JjL21haW4ucnNcIiwgZnJvbnRlbmQ6IHBhcnNlUnVzdCwgaWQ6IFwicnVzdFwiLCBtZWRpYVR5cGU6IFwidGV4dC94LXJ1c3RcIiwgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlUnVzdFByb2plY3RcbiAgfSksXG4gIGxhbmd1YWdlKHthY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInN3aWZ0Y1wiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0uc3dpZnRcIiwgZnJvbnRlbmQ6IHBhcnNlU3dpZnQsIGlkOiBcInN3aWZ0XCIsIG1lZGlhVHlwZTogXCJ0ZXh0L3gtc3dpZnRcIiwgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlU3dpZnR9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJyZXN0b3JlXCIsIFwiY29tcGlsZVwiLCBcInZhbGlkYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wiZGFydFwiXX0sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwiYmluL3Byb2dyYW0uZGFydFwiLFxuICAgIGZlYXR1cmVzOiB7XG4gICAgICBjbG9zZWRSZWNvcmRzOiBmYWxzZSxcbiAgICAgIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogZmFsc2UsXG4gICAgICBlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXM6IGZhbHNlLFxuICAgICAgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiB0cnVlLFxuICAgICAgaW1tdXRhYmxlQ29sbGVjdGlvbnM6IGZhbHNlLFxuICAgICAgb3B0aW9uYWxWYWx1ZXM6IGZhbHNlLFxuICAgICAgb3JkZXJlZExpc3RJdGVyYXRpb246IGZhbHNlLFxuICAgICAgb3JkZXJlZE1hcEl0ZXJhdGlvbjogZmFsc2UsXG4gICAgICByZWZlcmVuY2VDbGFzc2VzOiBmYWxzZSxcbiAgICAgIHR5cGVkRXJyb3JzOiBmYWxzZSxcbiAgICAgIHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3M6IGZhbHNlXG4gICAgfSxcbiAgICBmcm9udGVuZDogZGFydEZyb250ZW5kLFxuICAgIGlkOiBcImRhcnRcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWRhcnRcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVEYXJ0UGFja2FnZVxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwidmFsaWRhdGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJ6aWdcIl19LFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInNyYy9tYWluLnppZ1wiLFxuICAgIGZlYXR1cmVzOiB7XG4gICAgICBjbG9zZWRSZWNvcmRzOiBmYWxzZSxcbiAgICAgIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogZmFsc2UsXG4gICAgICBlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXM6IGZhbHNlLFxuICAgICAgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiB0cnVlLFxuICAgICAgaW1tdXRhYmxlQ29sbGVjdGlvbnM6IGZhbHNlLFxuICAgICAgb3B0aW9uYWxWYWx1ZXM6IGZhbHNlLFxuICAgICAgb3JkZXJlZExpc3RJdGVyYXRpb246IGZhbHNlLFxuICAgICAgb3JkZXJlZE1hcEl0ZXJhdGlvbjogZmFsc2UsXG4gICAgICByZWZlcmVuY2VDbGFzc2VzOiBmYWxzZSxcbiAgICAgIHR5cGVkRXJyb3JzOiBmYWxzZSxcbiAgICAgIHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3M6IGZhbHNlXG4gICAgfSxcbiAgICBmcm9udGVuZDogemlnRnJvbnRlbmQsXG4gICAgaWQ6IFwiemlnXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC16aWdcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVaaWdQcm9qZWN0XG4gIH0pLFxuICB7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wiZ2VuZXJhdGVcIiwgXCJ2YWxpZGF0ZVwiLCBcImluc3RhbnRpYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wid2FzbS12YWxpZGF0ZVwiLCBcIm5vZGVcIiwgXCJjaHJvbWl1bVwiXX0sXG4gICAgYXBwbGljYXRpb25CYWNrZW5kOiBnZW5lcmF0ZUJyb3dzZXJXYXNtLFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgYmluYXJ5QmFja2VuZDogZ2VuZXJhdGVCcm93c2VyV2FzbSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS53YXNtXCIsXG4gICAgZmVhdHVyZXM6IHtjbG9zZWRSZWNvcmRzOiBmYWxzZSwgY29uZGl0aW9uQ29udHJvbGxlZExvb3BzOiBmYWxzZSwgZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzOiBmYWxzZSwgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiBmYWxzZSwgaW1tdXRhYmxlQ29sbGVjdGlvbnM6IGZhbHNlLCBvcHRpb25hbFZhbHVlczogZmFsc2UsIG9yZGVyZWRMaXN0SXRlcmF0aW9uOiBmYWxzZSwgb3JkZXJlZE1hcEl0ZXJhdGlvbjogZmFsc2UsIHJlZmVyZW5jZUNsYXNzZXM6IGZhbHNlLCB0eXBlZEVycm9yczogZmFsc2UsIHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3M6IGZhbHNlfSxcbiAgICBpZDogXCJ3YXNtXCIsXG4gICAgbWFwcGluZzoge2JpbmFyeVJhbmdlczogdHJ1ZSwgcmljaFRleHQ6IHRydWUsIHNvdXJjZU1hcFYzOiB0cnVlfSxcbiAgICBtZWRpYVR5cGU6IFwiYXBwbGljYXRpb24vd2FzbVwiLFxuICAgIHJvdW5kVHJpcDogZmFsc2VcbiAgfSxcbiAge1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcInZhbGlkYXRlXCIsIFwiaW5zdGFudGlhdGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJhbmRyb2lkXCJdfSxcbiAgICBhcHBsaWNhdGlvbkJhY2tlbmQ6IGdlbmVyYXRlQW5kcm9pZEFwcGxpY2F0aW9uLFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgZmVhdHVyZXM6IHtjbG9zZWRSZWNvcmRzOiBmYWxzZSwgY29uZGl0aW9uQ29udHJvbGxlZExvb3BzOiBmYWxzZSwgZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzOiBmYWxzZSwgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiBmYWxzZSwgaW1tdXRhYmxlQ29sbGVjdGlvbnM6IGZhbHNlLCBvcHRpb25hbFZhbHVlczogZmFsc2UsIG9yZGVyZWRMaXN0SXRlcmF0aW9uOiBmYWxzZSwgb3JkZXJlZE1hcEl0ZXJhdGlvbjogZmFsc2UsIHJlZmVyZW5jZUNsYXNzZXM6IGZhbHNlLCB0eXBlZEVycm9yczogZmFsc2UsIHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3M6IGZhbHNlfSxcbiAgICBpZDogXCJhbmRyb2lkXCIsXG4gICAgbWFwcGluZzoge2JpbmFyeVJhbmdlczogdHJ1ZSwgcmljaFRleHQ6IHRydWUsIHNvdXJjZU1hcFYzOiB0cnVlfSxcbiAgICByb3VuZFRyaXA6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJnZW5lcmF0ZVwiXSwgdG9vbGNoYWluczogW119LFxuICAgIGFwcGxpY2F0aW9uQmFja2VuZDogZ2VuZXJhdGVJb3NBcHBsaWNhdGlvbixcbiAgICBhcnRpZmFjdE11bHRpcGxpY2l0eTogXCJtdWx0aXBsZVwiLFxuICAgIGZlYXR1cmVzOiB7Y2xvc2VkUmVjb3JkczogZmFsc2UsIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogZmFsc2UsIGVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlczogZmFsc2UsIGdlbmVyYWxGdW5jdGlvbnNBbmRDYWxsczogZmFsc2UsIGltbXV0YWJsZUNvbGxlY3Rpb25zOiBmYWxzZSwgb3B0aW9uYWxWYWx1ZXM6IGZhbHNlLCBvcmRlcmVkTGlzdEl0ZXJhdGlvbjogZmFsc2UsIG9yZGVyZWRNYXBJdGVyYXRpb246IGZhbHNlLCByZWZlcmVuY2VDbGFzc2VzOiBmYWxzZSwgdHlwZWRFcnJvcnM6IGZhbHNlLCB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzOiBmYWxzZX0sXG4gICAgaWQ6IFwiaW9zXCIsXG4gICAgbWFwcGluZzoge2JpbmFyeVJhbmdlczogdHJ1ZSwgcmljaFRleHQ6IHRydWUsIHNvdXJjZU1hcFYzOiB0cnVlfSxcbiAgICByb3VuZFRyaXA6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJnZW5lcmF0ZVwiLCBcInJlc3RvcmVcIiwgXCJjb21waWxlXCIsIFwidmFsaWRhdGVcIiwgXCJpbnN0YW50aWF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImZsdXR0ZXJcIiwgXCJhbmRyb2lkXCJdfSxcbiAgICBhcHBsaWNhdGlvbkJhY2tlbmQ6IGdlbmVyYXRlRmx1dHRlckFwcGxpY2F0aW9uLFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgZmVhdHVyZXM6IHtjbG9zZWRSZWNvcmRzOiBmYWxzZSwgY29uZGl0aW9uQ29udHJvbGxlZExvb3BzOiBmYWxzZSwgZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzOiBmYWxzZSwgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiBmYWxzZSwgaW1tdXRhYmxlQ29sbGVjdGlvbnM6IGZhbHNlLCBvcHRpb25hbFZhbHVlczogZmFsc2UsIG9yZGVyZWRMaXN0SXRlcmF0aW9uOiBmYWxzZSwgb3JkZXJlZE1hcEl0ZXJhdGlvbjogZmFsc2UsIHJlZmVyZW5jZUNsYXNzZXM6IGZhbHNlLCB0eXBlZEVycm9yczogZmFsc2UsIHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3M6IGZhbHNlfSxcbiAgICBpZDogXCJmbHV0dGVyXCIsXG4gICAgbWFwcGluZzoge2JpbmFyeVJhbmdlczogdHJ1ZSwgcmljaFRleHQ6IHRydWUsIHNvdXJjZU1hcFYzOiB0cnVlfSxcbiAgICByb3VuZFRyaXA6IGZhbHNlXG4gIH1cbl1cblxuZXhwb3J0IGNvbnN0IGxhbmd1YWdlUmVnaXN0cnkgPSBjcmVhdGVMYW5ndWFnZVJlZ2lzdHJ5KHJlY29yZHMpXG5leHBvcnQgY29uc3QgbGFuZ3VhZ2VDYXBhYmlsaXRpZXMgPSBsYW5ndWFnZVJlZ2lzdHJ5LmRlc2NyaXB0b3JzXG4vKiogQHR5cGUge3JlYWRvbmx5IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZVtdfSAqL1xuZXhwb3J0IGNvbnN0IHN1cHBvcnRlZExhbmd1YWdlcyA9IE9iamVjdC5mcmVlemUobGFuZ3VhZ2VDYXBhYmlsaXRpZXNcbiAgLmZpbHRlcigoe3JvbGVzfSkgPT4gcm9sZXMuZnJvbnRlbmQgJiYgcm9sZXMudGV4dEJhY2tlbmQpXG4gIC5tYXAoKHtpZH0pID0+IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSAqLyAoaWQpKSlcblxuLyoqXG4gKiBTdXBwbGllcyBjb21tb24gb3JpZ2luYWwtZml2ZSBjYXBhYmlsaXR5IGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IHZhbHVlcyAtIExhbmd1YWdlLXNwZWNpZmljIHJlY29yZCBmaWVsZHMuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IENvbXBsZXRlIHJlY29yZC5cbiAqL1xuZnVuY3Rpb24gbGFuZ3VhZ2UodmFsdWVzKSB7XG4gIHJldHVybiB7XG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwic2luZ2xlXCIsXG4gICAgZmVhdHVyZXM6IHtcbiAgICAgIGNsb3NlZFJlY29yZHM6IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpLFxuICAgICAgY29uZGl0aW9uQ29udHJvbGxlZExvb3BzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIGVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlczogW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiXS5pbmNsdWRlcyhTdHJpbmcodmFsdWVzLmlkKSksXG4gICAgICBnZW5lcmFsRnVuY3Rpb25zQW5kQ2FsbHM6IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpLFxuICAgICAgaW1tdXRhYmxlQ29sbGVjdGlvbnM6IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpLFxuICAgICAgb3B0aW9uYWxWYWx1ZXM6IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpLFxuICAgICAgb3JkZXJlZExpc3RJdGVyYXRpb246IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpLFxuICAgICAgb3JkZXJlZE1hcEl0ZXJhdGlvbjogW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiXS5pbmNsdWRlcyhTdHJpbmcodmFsdWVzLmlkKSksXG4gICAgICByZWZlcmVuY2VDbGFzc2VzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIHR5cGVkRXJyb3JzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3M6IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpXG4gICAgfSxcbiAgICBtYXBwaW5nOiB7YmluYXJ5UmFuZ2VzOiBmYWxzZSwgcmljaFRleHQ6IHRydWUsIHNvdXJjZU1hcFYzOiB0cnVlfSxcbiAgICBwcm92aWRlcjogW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiXS5pbmNsdWRlcyhTdHJpbmcodmFsdWVzLmlkKSksXG4gICAgcm91bmRUcmlwOiB0cnVlLFxuICAgIC4uLnZhbHVlc1xuICB9XG59XG5cbi8qKlxuICogRm9ybWF0cyBhbiBpbnRlcm5hbCByZWdpc3RyeSBrZXkgZm9yIGEgcHVibGljIHJvbGUgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSByb2xlIC0gSW50ZXJuYWwgcm9sZSBrZXkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBQdWJsaWMgcm9sZSBuYW1lLlxuICovXG5mdW5jdGlvbiBwdWJsaWNSb2xlTmFtZShyb2xlKSB7XG4gIGlmIChyb2xlID09IFwidGV4dEJhY2tlbmRcIikgcmV0dXJuIFwidGV4dCBiYWNrZW5kXCJcbiAgaWYgKHJvbGUgPT0gXCJiaW5hcnlCYWNrZW5kXCIpIHJldHVybiBcImJpbmFyeSBiYWNrZW5kXCJcbiAgaWYgKHJvbGUgPT0gXCJhcHBsaWNhdGlvbkJhY2tlbmRcIikgcmV0dXJuIFwiYXBwbGljYXRpb24tYXJ0aWZhY3QgYmFja2VuZFwiXG5cbiAgcmV0dXJuIHJvbGVcbn1cblxuLyoqXG4gKiBUaHJvd3MgYW4gdW5rbm93bi1sYW5ndWFnZSBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gVW5rbm93biBpZGVudGl0eS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZH0gW2xvY2F0aW9uXSAtIFJlbGF0ZWQgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1JlZ2lzdHJ5Um9sZSB8IHVuZGVmaW5lZH0gW3JvbGVdIC0gUmVxdWVzdGVkIHJvbGUuXG4gKiBAcmV0dXJucyB7bmV2ZXJ9IEFsd2F5cyB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIHVuc3VwcG9ydGVkTGFuZ3VhZ2UoaWQsIGxvY2F0aW9uLCByb2xlKSB7XG4gIGNvbnN0IG1lc3NhZ2UgPSByb2xlID09IFwiZnJvbnRlbmRcIiA/IFwiTm8gZnJvbnRlbmQgYWRhcHRlciBpcyByZWdpc3RlcmVkIGZvciB0aGlzIGxhbmd1YWdlLlwiIDpcbiAgICByb2xlID09IFwidGV4dEJhY2tlbmRcIiA/IFwiTm8gc291cmNlIGJhY2tlbmQgaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBsYW5ndWFnZS5cIiA6XG4gICAgICBcIk5vIGxhbmd1YWdlIG9yIHRhcmdldCBpcyByZWdpc3RlcmVkIGZvciB0aGlzIElELlwiXG5cbiAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgY29kZTogXCJVTlNVUFBPUlRFRF9MQU5HVUFHRVwiLFxuICAgIGxhbmd1YWdlOiBpZCxcbiAgICBsb2NhdGlvbixcbiAgICBtZXNzYWdlXG4gIH0pXG59XG5cbi8qKlxuICogVGhyb3dzIGEgbm9ybWFsaXplZCByZWdpc3RyeS1zaGFwZSBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBGYWlsdXJlIGRldGFpbC5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBbaWRdIC0gQ2FuZGlkYXRlIHJlZ2lzdHJ5IElELlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBpbnZhbGlkUmVnaXN0cnkobWVzc2FnZSwgaWQgPSBcInJlZ2lzdHJ5XCIpIHtcbiAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7Y29kZTogXCJJTlZBTElEX1JFR0lTVFJZXCIsIGxhbmd1YWdlOiBpZCwgbWVzc2FnZX0pXG59XG5cbi8qKlxuICogQ2hlY2tzIGZvciBhbiBvcmRpbmFyeSBzdHJpbmcta2V5ZWQgb2JqZWN0LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gV2hldGhlciB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIHZhbHVlICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT0gT2JqZWN0LnByb3RvdHlwZVxufVxuXG4vKipcbiAqIERlZXBseSBmcmVlemVzIHJlZ2lzdHJ5IHJlY29yZHMgYW5kIHB1YmxpYyBkZXNjcmlwdG9ycy5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlIC0gUmVnaXN0cnktb3duZWQgdmFsdWUuXG4gKiBAcmV0dXJucyB7VH0gRnJvemVuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBkZWVwRnJlZXplKHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgT2JqZWN0LmlzRnJvemVuKHZhbHVlKSkgcmV0dXJuIHZhbHVlXG5cbiAgZm9yIChjb25zdCBuZXN0ZWQgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIGRlZXBGcmVlemUobmVzdGVkKVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlKVxufVxuIl19
|
|
738
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2UtcmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFuZ3VhZ2UtcmVnaXN0cnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxZQUFZLENBQUE7QUFDdkMsT0FBTyxFQUFDLHFCQUFxQixFQUFFLGVBQWUsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3RFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUMvQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFDbkQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFDMUQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sNEJBQTRCLENBQUE7QUFDaEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDakQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDdEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQ2pELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQ3RELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ3BELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQzNELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQTtBQUM3QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFDbkQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQy9DLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDBCQUEwQixDQUFBO0FBQzNELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQ3RE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QUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLFVBQVU7SUFDL0MsTUFBTSxJQUFJLHFCQUFxQixDQUFDLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtBQUNwRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLEtBQUs7SUFDMUIsT0FBTyxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFBO0FBQy9ILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUU5RSxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTdELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7aXNEZW5zZUFycmF5fSBmcm9tIFwiLi9hcnJheS5qc1wiXG5pbXBvcnQge1NlbWFudGlmb2xkRGlhZ25vc3RpYywgdW5zdXBwb3J0ZWRSb2xlfSBmcm9tIFwiLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVKYXZhfSBmcm9tIFwiLi9iYWNrZW5kcy9qYXZhLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVLb3RsaW59IGZyb20gXCIuL2JhY2tlbmRzL2tvdGxpbi5qc1wiXG5pbXBvcnQge2dlbmVyYXRlQ1NoYXJwUHJvamVjdH0gZnJvbSBcIi4vYmFja2VuZHMvY3NoYXJwLmpzXCJcbmltcG9ydCB7Y3JlYXRlQ1NoYXJwQ2hlY2tQbGFufSBmcm9tIFwiLi9iYWNrZW5kcy9jc2hhcnAtY2hlY2suanNcIlxuaW1wb3J0IHtnZW5lcmF0ZUdvTW9kdWxlfSBmcm9tIFwiLi9iYWNrZW5kcy9nby5qc1wiXG5pbXBvcnQge2dlbmVyYXRlUnVzdFByb2plY3R9IGZyb20gXCIuL2JhY2tlbmRzL3J1c3QuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZVN3aWZ0fSBmcm9tIFwiLi9iYWNrZW5kcy9zd2lmdC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlRGFydFBhY2thZ2V9IGZyb20gXCIuL2JhY2tlbmRzL2RhcnQuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZVppZ1Byb2plY3R9IGZyb20gXCIuL2JhY2tlbmRzL3ppZy5qc1wiXG5pbXBvcnQge2dlbmVyYXRlSmF2YVNjcmlwdH0gZnJvbSBcIi4vYmFja2VuZHMvamF2YXNjcmlwdC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlUGhwfSBmcm9tIFwiLi9iYWNrZW5kcy9waHAuanNcIlxuaW1wb3J0IHtnZW5lcmF0ZVB5dGhvbn0gZnJvbSBcIi4vYmFja2VuZHMvcHl0aG9uLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVSdWJ5fSBmcm9tIFwiLi9iYWNrZW5kcy9ydWJ5LmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVUeXBlU2NyaXB0fSBmcm9tIFwiLi9iYWNrZW5kcy90eXBlc2NyaXB0LmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVCcm93c2VyV2FzbX0gZnJvbSBcIi4vYmFja2VuZHMvd2FzbS5qc1wiXG5pbXBvcnQge2dlbmVyYXRlSW9zQXBwbGljYXRpb259IGZyb20gXCIuL2JhY2tlbmRzL2lvcy5qc1wiXG5pbXBvcnQge2dlbmVyYXRlQW5kcm9pZEFwcGxpY2F0aW9ufSBmcm9tIFwiLi9iYWNrZW5kcy9hbmRyb2lkLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVGbHV0dGVyQXBwbGljYXRpb259IGZyb20gXCIuL2JhY2tlbmRzL2ZsdXR0ZXIuanNcIlxuaW1wb3J0IHtwYXJzZUphdmF9IGZyb20gXCIuL2Zyb250ZW5kcy9qYXZhLmpzXCJcbmltcG9ydCB7cGFyc2VLb3RsaW59IGZyb20gXCIuL2Zyb250ZW5kcy9rb3RsaW4uanNcIlxuaW1wb3J0IHtwYXJzZUNTaGFycH0gZnJvbSBcIi4vZnJvbnRlbmRzL2NzaGFycC5qc1wiXG5pbXBvcnQge3BhcnNlR299IGZyb20gXCIuL2Zyb250ZW5kcy9nby5qc1wiXG5pbXBvcnQge3BhcnNlUnVzdH0gZnJvbSBcIi4vZnJvbnRlbmRzL3J1c3QuanNcIlxuaW1wb3J0IHtwYXJzZVN3aWZ0fSBmcm9tIFwiLi9mcm9udGVuZHMvc3dpZnQuanNcIlxuaW1wb3J0IHtwYXJzZURhcnR9IGZyb20gXCIuL2Zyb250ZW5kcy9kYXJ0LmpzXCJcbmltcG9ydCB7cGFyc2VaaWd9IGZyb20gXCIuL2Zyb250ZW5kcy96aWcuanNcIlxuaW1wb3J0IHtwYXJzZUNwcH0gZnJvbSBcIi4vZnJvbnRlbmRzL2NwcC5qc1wiXG5pbXBvcnQge2dlbmVyYXRlQ3BwfSBmcm9tIFwiLi9iYWNrZW5kcy9jcHAuanNcIlxuaW1wb3J0IHtwYXJzZUN9IGZyb20gXCIuL2Zyb250ZW5kcy9jLmpzXCJcbmltcG9ydCB7Z2VuZXJhdGVDUHJvZ3JhbX0gZnJvbSBcIi4vYmFja2VuZHMvYy5qc1wiXG5pbXBvcnQge3BhcnNlSmF2YVNjcmlwdFR5cGVTY3JpcHR9IGZyb20gXCIuL2Zyb250ZW5kcy9qYXZhc2NyaXB0LXR5cGVzY3JpcHQuanNcIlxuaW1wb3J0IHtwYXJzZVBocH0gZnJvbSBcIi4vZnJvbnRlbmRzL3BocC5qc1wiXG5pbXBvcnQge3BhcnNlUHl0aG9ufSBmcm9tIFwiLi9mcm9udGVuZHMvcHl0aG9uLmpzXCJcbmltcG9ydCB7cGFyc2VSdWJ5fSBmcm9tIFwiLi9mcm9udGVuZHMvcnVieS5qc1wiXG5pbXBvcnQge2NyZWF0ZUphdmFDaGVja1BsYW59IGZyb20gXCIuL2JhY2tlbmRzL2phdmEtY2hlY2suanNcIlxuaW1wb3J0IHtjcmVhdGVKYXZhU2NyaXB0Q2hlY2tQbGFufSBmcm9tIFwiLi9iYWNrZW5kcy9qYXZhc2NyaXB0LWNoZWNrLmpzXCJcbmltcG9ydCB7Y3JlYXRlS290bGluQ2hlY2tQbGFufSBmcm9tIFwiLi9iYWNrZW5kcy9rb3RsaW4tY2hlY2suanNcIlxuaW1wb3J0IHtjcmVhdGVQaHBDaGVja1BsYW59IGZyb20gXCIuL2JhY2tlbmRzL3BocC1jaGVjay5qc1wiXG5pbXBvcnQge2NyZWF0ZVB5dGhvbkNoZWNrUGxhbn0gZnJvbSBcIi4vYmFja2VuZHMvcHl0aG9uLWNoZWNrLmpzXCJcbmltcG9ydCB7Y3JlYXRlUnVieUNoZWNrUGxhbn0gZnJvbSBcIi4vYmFja2VuZHMvcnVieS1jaGVjay5qc1wiXG5pbXBvcnQge2NyZWF0ZVR5cGVTY3JpcHRDaGVja1BsYW59IGZyb20gXCIuL2JhY2tlbmRzL3R5cGVzY3JpcHQtY2hlY2suanNcIlxuaW1wb3J0IHtjcmVhdGVHb0NoZWNrUGxhbn0gZnJvbSBcIi4vYmFja2VuZHMvZ28tY2hlY2suanNcIlxuaW1wb3J0IHtjcmVhdGVDQ2hlY2tQbGFufSBmcm9tIFwiLi9iYWNrZW5kcy9jLWNoZWNrLmpzXCJcbmltcG9ydCB7Y3JlYXRlQ3BwQ2hlY2tQbGFufSBmcm9tIFwiLi9iYWNrZW5kcy9jcHAtY2hlY2suanNcIlxuaW1wb3J0IHtjcmVhdGVSdXN0Q2hlY2tQbGFufSBmcm9tIFwiLi9iYWNrZW5kcy9ydXN0LWNoZWNrLmpzXCJcbmltcG9ydCB7Y3JlYXRlU3dpZnRDaGVja1BsYW59IGZyb20gXCIuL2JhY2tlbmRzL3N3aWZ0LWNoZWNrLmpzXCJcbmltcG9ydCB7Y3JlYXRlRGFydENoZWNrUGxhbn0gZnJvbSBcIi4vYmFja2VuZHMvZGFydC1jaGVjay5qc1wiXG5pbXBvcnQge2NyZWF0ZVppZ0NoZWNrUGxhbn0gZnJvbSBcIi4vYmFja2VuZHMvemlnLWNoZWNrLmpzXCJcblxuY29uc3QgcmVnaXN0cnlSb2xlcyA9IE9iamVjdC5mcmVlemUoW1wiZnJvbnRlbmRcIiwgXCJ0ZXh0QmFja2VuZFwiLCBcImJpbmFyeUJhY2tlbmRcIiwgXCJhcHBsaWNhdGlvbkJhY2tlbmRcIiwgXCJpbnRlcm9wZXJhYmlsaXR5XCJdKVxuY29uc3QgYWNjZXB0YW5jZVN0YWdlT3JkZXIgPSBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwicmVzdG9yZVwiLCBcImNvbXBpbGVcIiwgXCJsaW5rXCIsIFwidmFsaWRhdGVcIiwgXCJpbnN0YW50aWF0ZVwiLCBcImV4ZWN1dGVcIl1cbmNvbnN0IGFjY2VwdGFuY2VTdGFnZXMgPSBuZXcgTWFwKGFjY2VwdGFuY2VTdGFnZU9yZGVyLm1hcCgoc3RhZ2UsIGluZGV4KSA9PiBbc3RhZ2UsIGluZGV4XSkpXG5jb25zdCBkZXZlbG9wZXJDaGVja1N0YWdlcyA9IG5ldyBTZXQoW1wicmVzdG9yZVwiLCBcImNvbXBpbGVcIiwgXCJsaW5rXCIsIFwidmFsaWRhdGVcIl0pXG5jb25zdCByZWdpc3RyeUtleXMgPSBuZXcgU2V0KFtcbiAgXCJhY2NlcHRhbmNlXCIsIFwiYXBwbGljYXRpb25CYWNrZW5kXCIsIFwiYXJ0aWZhY3RNdWx0aXBsaWNpdHlcIiwgXCJiaW5hcnlCYWNrZW5kXCIsIFwiY2hlY2tcIiwgXCJkZWZhdWx0RmlsZW5hbWVcIiwgXCJmcm9udGVuZFwiLCBcImlkXCIsXG4gIFwiZmVhdHVyZXNcIiwgXCJpbnRlcm9wZXJhYmlsaXR5XCIsIFwibWFwcGluZ1wiLCBcIm1lZGlhVHlwZVwiLCBcInByb3ZpZGVyXCIsIFwicm91bmRUcmlwXCIsIFwidGV4dEJhY2tlbmRcIlxuXSlcblxuLyoqIEB0eXBlZGVmIHtcImZyb250ZW5kXCIgfCBcInRleHRCYWNrZW5kXCIgfCBcImJpbmFyeUJhY2tlbmRcIiB8IFwiYXBwbGljYXRpb25CYWNrZW5kXCIgfCBcImludGVyb3BlcmFiaWxpdHlcIn0gUmVnaXN0cnlSb2xlICovXG4vKiogQHR5cGVkZWYgeyguLi52YWx1ZXM6IHVua25vd25bXSkgPT4gdW5rbm93bn0gUmVnaXN0cnlJbXBsZW1lbnRhdGlvbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZyb250ZW5kSW5wdXRcbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBDb21waWxlci1hdXRob3JpemVkIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2UgLSBTb3VyY2UgdGV4dC5cbiAqIEBwcm9wZXJ0eSB7e2lzRW50cnk6IGJvb2xlYW4sIGZ1bmN0aW9uczogTWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPiwgcmVjb3JkczogTWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj4sIGVycm9ycz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj4sIHZhbHVlUmVjb3Jkcz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+fX0gW3Byb2dyYW1dIC0gUHJvZ3JhbSBjb252ZXJzaW9uIGNvbnRleHQuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgRnJvbnRlbmRcbiAqIEBwYXJhbSB7RnJvbnRlbmRJbnB1dH0gaW5wdXQgLSBGcm9udGVuZCByZXF1ZXN0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IFNlbWFudGljIG1vZHVsZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlUmVnaXN0cnlSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7e3N0YWdlczogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BY2NlcHRhbmNlU3RhZ2VbXSwgdG9vbGNoYWluczogc3RyaW5nW119fSBhY2NlcHRhbmNlIC0gQWNjZXB0YW5jZSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VSZWdpc3RyeUNoZWNrUmVjb3JkPn0gY2hlY2sgLSBEZXZlbG9wZXItY2hlY2sgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge1wic2luZ2xlXCIgfCBcIm11bHRpcGxlXCJ9IGFydGlmYWN0TXVsdGlwbGljaXR5IC0gQXJ0aWZhY3QgbXVsdGlwbGljaXR5LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkxhbmd1YWdlRmVhdHVyZUNhcGFiaWxpdGllc30gZmVhdHVyZXMgLSBTZW1hbnRpYyBmZWF0dXJlIGNhcGFiaWxpdGllcy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5MYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXN9IG1hcHBpbmcgLSBNYXBwaW5nIGNhcGFiaWxpdGllcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcm91bmRUcmlwIC0gUm91bmQtdHJpcCBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGVmYXVsdEZpbGVuYW1lXSAtIERlZmF1bHQgYmFja2VuZCBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbWVkaWFUeXBlXSAtIERlZmF1bHQgYmFja2VuZCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcHJvdmlkZXJdIC0gVGFyZ2V0IGhvc3Qgc3RkbGliIHByb3ZpZGVyL25hdGl2ZS1iaW5kaW5nIHJvbGUuXG4gKiBAcHJvcGVydHkge1JlZ2lzdHJ5SW1wbGVtZW50YXRpb259IFtmcm9udGVuZF0gLSBGcm9udGVuZCBhZGFwdGVyLlxuICogQHByb3BlcnR5IHtSZWdpc3RyeUltcGxlbWVudGF0aW9ufSBbdGV4dEJhY2tlbmRdIC0gVGV4dCBiYWNrZW5kLlxuICogQHByb3BlcnR5IHtSZWdpc3RyeUltcGxlbWVudGF0aW9ufSBbYmluYXJ5QmFja2VuZF0gLSBCaW5hcnkgYmFja2VuZC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0cnlJbXBsZW1lbnRhdGlvbn0gW2FwcGxpY2F0aW9uQmFja2VuZF0gLSBBcHBsaWNhdGlvbi1hcnRpZmFjdCBiYWNrZW5kLlxuICogQHByb3BlcnR5IHtSZWdpc3RyeUltcGxlbWVudGF0aW9ufSBbaW50ZXJvcGVyYWJpbGl0eV0gLSBJbnRlcm9wZXJhYmlsaXR5IGJyaWRnZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWFkb25seTx7XG4gKiAgIGFydGlmYWN0czogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRBcnRpZmFjdFNldCxcbiAqICAgYnVpbGRQYXRoOiBzdHJpbmcsXG4gKiAgIHByb2plY3RJZDogc3RyaW5nLFxuICogICBzb3VyY2VQYXRoOiBzdHJpbmcsXG4gKiAgIHRhcmdldElkOiBzdHJpbmcsXG4gKiAgIHRvb2xzOiByZWFkb25seSBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkRpc2NvdmVyZWRUb29sY2hhaW5bXVxuICogfT59IFRhcmdldENoZWNrUGxhbkNvbnRleHRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBUYXJnZXRDaGVja1BsYW5GYWN0b3J5XG4gKiBAcGFyYW0ge1RhcmdldENoZWNrUGxhbkNvbnRleHR9IGNvbnRleHQgLSBFeGFjdCBzdGFnZWQgdGFyZ2V0IGNvbnRleHQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UYXJnZXRDaGVja1BsYW59IEltbXV0YWJsZSBwbGFuLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VSZWdpc3RyeUNoZWNrUmVjb3JkXG4gKiBAcHJvcGVydHkge1RhcmdldENoZWNrUGxhbkZhY3Rvcnl9IFtmYWN0b3J5XSAtIFRhcmdldC1vd25lZCBwbGFuIGZhY3RvcnkgZm9yIHN1cHBvcnRlZCBjaGVja3MuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuQWNjZXB0YW5jZVN0YWdlW119IHN0YWdlcyAtIEV4YWN0IG5vbi1leGVjdXRpbmcgc3RhZ2VzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBzdXBwb3J0ZWQgLSBXaGV0aGVyIHRoZSB0YXJnZXQgc3VwcGxpZXMgYSBjaGVjayBwbGFuLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gdG9vbGNoYWlucyAtIEV4YWN0IGRlY2xhcmVkIGNhbm9uaWNhbCB0b29sY2hhaW5zLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VSZWdpc3RyeVxuICogQHByb3BlcnR5IHtyZWFkb25seSBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkxhbmd1YWdlQ2FwYWJpbGl0aWVzW119IGRlc2NyaXB0b3JzIC0gUHVibGljIGRlc2NyaXB0b3JzLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBzdHJpbmdbXX0gaWRzIC0gUmVnaXN0ZXJlZCBJRHMgaW4gc3RhYmxlIG9yZGVyLlxuICogQHByb3BlcnR5IHsoaWQ6IHN0cmluZykgPT4gUmVhZG9ubHk8TGFuZ3VhZ2VSZWdpc3RyeVJlY29yZD59IHJlY29yZCAtIEV4YWN0IHJlY29yZCBsb29rdXAuXG4gKiBAcHJvcGVydHkgeyhpZDogc3RyaW5nLCByb2xlOiBSZWdpc3RyeVJvbGUsIGxvY2F0aW9uPzogaW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbikgPT4gUmVnaXN0cnlJbXBsZW1lbnRhdGlvbn0gcmVzb2x2ZSAtIFJvbGUgbG9va3VwLlxuICovXG5cbi8qKlxuICogQ29uc3RydWN0cyBhbiBpbW11dGFibGUgcm9sZSByZWdpc3RyeSBmcm9tIG9yZGVyZWQgcmVjb3Jkcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlUmVjb3JkcyAtIE9yZGVyZWQgbGFuZ3VhZ2UgcmVjb3Jkcy5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxMYW5ndWFnZVJlZ2lzdHJ5Pn0gUmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5ndWFnZVJlZ2lzdHJ5KGNhbmRpZGF0ZVJlY29yZHMpIHtcbiAgaWYgKCFpc0RlbnNlQXJyYXkoY2FuZGlkYXRlUmVjb3JkcykpIGludmFsaWRSZWdpc3RyeShcIlJlZ2lzdHJ5IHJlY29yZHMgbXVzdCBiZSBhbiBvcmRlcmVkIGRlbnNlIGFycmF5LlwiKVxuXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgUmVhZG9ubHk8TGFuZ3VhZ2VSZWdpc3RyeVJlY29yZD4+fSAqL1xuICBjb25zdCByZWNvcmRzQnlJZCA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VDYXBhYmlsaXRpZXNbXX0gKi9cbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBbXVxuXG4gIGZvciAobGV0IHJlY29yZEluZGV4ID0gMDsgcmVjb3JkSW5kZXggPCBjYW5kaWRhdGVSZWNvcmRzLmxlbmd0aDsgcmVjb3JkSW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZVJlY29yZHNbcmVjb3JkSW5kZXhdXG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoY2FuZGlkYXRlKSkgaW52YWxpZFJlZ2lzdHJ5KFwiRXZlcnkgcmVnaXN0cnkgcmVjb3JkIG11c3QgYmUgYSBwbGFpbiBvYmplY3QuXCIpXG4gICAgY29uc3QgaWQgPSBjYW5kaWRhdGUuaWRcblxuICAgIGlmICh0eXBlb2YgaWQgIT0gXCJzdHJpbmdcIiB8fCBpZC5sZW5ndGggPT0gMCB8fCAhL15bYS16XVthLXowLTktXSokL3UudGVzdChpZCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShcIkV2ZXJ5IHJlZ2lzdHJ5IHJlY29yZCByZXF1aXJlcyBhIHN0YWJsZSBsb3dlcmNhc2UgSUQuXCIsIHR5cGVvZiBpZCA9PSBcInN0cmluZ1wiID8gaWQgOiB1bmRlZmluZWQpXG4gICAgfVxuICAgIGlmIChyZWNvcmRzQnlJZC5oYXMoaWQpKSBpbnZhbGlkUmVnaXN0cnkoYER1cGxpY2F0ZSByZWdpc3RyeSBJRCAnJHtpZH0nLmAsIGlkKVxuICAgIGlmIChPYmplY3Qua2V5cyhjYW5kaWRhdGUpLnNvbWUoKGtleSkgPT4gIXJlZ2lzdHJ5S2V5cy5oYXMoa2V5KSkpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIHVua25vd24gZmllbGRzLmAsIGlkKVxuICAgIGlmIChjYW5kaWRhdGUucHJvdmlkZXIgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgY2FuZGlkYXRlLnByb3ZpZGVyICE9IFwiYm9vbGVhblwiKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGRlY2xhcmVzIGFuIGludmFsaWQgcHJvdmlkZXIgcm9sZS5gLCBpZClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvbGUgb2YgcmVnaXN0cnlSb2xlcykge1xuICAgICAgaWYgKGNhbmRpZGF0ZVtyb2xlXSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBjYW5kaWRhdGVbcm9sZV0gIT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcm9sZSAnJHtyb2xlfScgZm9yICcke2lkfScgbXVzdCBiZSBhIGZ1bmN0aW9uIHdoZW4gcHJlc2VudC5gLCBpZClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXJ0aWZhY3RNdWx0aXBsaWNpdHkgPSBjYW5kaWRhdGUuYXJ0aWZhY3RNdWx0aXBsaWNpdHlcblxuICAgIGlmIChhcnRpZmFjdE11bHRpcGxpY2l0eSAhPSBcInNpbmdsZVwiICYmIGFydGlmYWN0TXVsdGlwbGljaXR5ICE9IFwibXVsdGlwbGVcIikge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBoYXMgYW4gaW52YWxpZCBhcnRpZmFjdCBtdWx0aXBsaWNpdHkuYCwgaWQpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlLnJvdW5kVHJpcCAhPSBcImJvb2xlYW5cIikgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyByZXF1aXJlcyBhIEJvb2xlYW4gcm91bmQtdHJpcCBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICBjb25zdCBmZWF0dXJlc0NhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5mZWF0dXJlcyA/PyB7XG4gICAgICBjbG9zZWRSZWNvcmRzOiBmYWxzZSxcbiAgICAgIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogZmFsc2UsXG4gICAgICBjb25kaXRpb25hbEV4cHJlc3Npb25zOiBmYWxzZSxcbiAgICAgIHN0cmluZ0ludGVycG9sYXRpb246IGZhbHNlLFxuICAgICAgZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzOiBmYWxzZSxcbiAgICAgIGdlbmVyYWxGdW5jdGlvbnNBbmRDYWxsczogZmFsc2UsXG4gICAgICBpbW11dGFibGVDb2xsZWN0aW9uczogZmFsc2UsXG4gICAgICBvcHRpb25hbFZhbHVlczogZmFsc2UsXG4gICAgICBvcmRlcmVkTGlzdEl0ZXJhdGlvbjogZmFsc2UsXG4gICAgICBvcmRlcmVkTWFwSXRlcmF0aW9uOiBmYWxzZSxcbiAgICAgIHJlZmVyZW5jZUNsYXNzZXM6IGZhbHNlLFxuICAgICAgdHlwZWRFcnJvcnM6IGZhbHNlLFxuICAgICAgdHlwZVBhcmFtZXRlcnNBbmRHZW5lcmljczogZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoZmVhdHVyZXNDYW5kaWRhdGUpIHx8XG4gICAgICBPYmplY3Qua2V5cyhmZWF0dXJlc0NhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwiY2xvc2VkUmVjb3Jkcyxjb25kaXRpb25Db250cm9sbGVkTG9vcHMsY29uZGl0aW9uYWxFeHByZXNzaW9ucyxlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXMsZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzLGltbXV0YWJsZUNvbGxlY3Rpb25zLG9wdGlvbmFsVmFsdWVzLG9yZGVyZWRMaXN0SXRlcmF0aW9uLG9yZGVyZWRNYXBJdGVyYXRpb24scmVmZXJlbmNlQ2xhc3NlcyxzdHJpbmdJbnRlcnBvbGF0aW9uLHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3MsdHlwZWRFcnJvcnNcIiB8fFxuICAgICAgdHlwZW9mIGZlYXR1cmVzQ2FuZGlkYXRlLmNsb3NlZFJlY29yZHMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS5jb25kaXRpb25Db250cm9sbGVkTG9vcHMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS5jb25kaXRpb25hbEV4cHJlc3Npb25zICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUuZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUuZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUuaW1tdXRhYmxlQ29sbGVjdGlvbnMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS5vcHRpb25hbFZhbHVlcyAhPSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIGZlYXR1cmVzQ2FuZGlkYXRlLm9yZGVyZWRMaXN0SXRlcmF0aW9uICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUub3JkZXJlZE1hcEl0ZXJhdGlvbiAhPSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIGZlYXR1cmVzQ2FuZGlkYXRlLnJlZmVyZW5jZUNsYXNzZXMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS5zdHJpbmdJbnRlcnBvbGF0aW9uICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2YgZmVhdHVyZXNDYW5kaWRhdGUudHlwZWRFcnJvcnMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBmZWF0dXJlc0NhbmRpZGF0ZS50eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzICE9IFwiYm9vbGVhblwiKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyBhbiBpbnZhbGlkIGZlYXR1cmUgZGVjbGFyYXRpb24uYCwgaWQpXG4gICAgfVxuICAgIGNvbnN0IGZlYXR1cmVzID0gZGVlcEZyZWV6ZSgvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VGZWF0dXJlQ2FwYWJpbGl0aWVzfSAqLyAoe1xuICAgICAgY2xvc2VkUmVjb3JkczogZmVhdHVyZXNDYW5kaWRhdGUuY2xvc2VkUmVjb3JkcyxcbiAgICAgIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogZmVhdHVyZXNDYW5kaWRhdGUuY29uZGl0aW9uQ29udHJvbGxlZExvb3BzLFxuICAgICAgY29uZGl0aW9uYWxFeHByZXNzaW9uczogZmVhdHVyZXNDYW5kaWRhdGUuY29uZGl0aW9uYWxFeHByZXNzaW9ucyxcbiAgICAgIGVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlczogZmVhdHVyZXNDYW5kaWRhdGUuZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzLFxuICAgICAgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiBmZWF0dXJlc0NhbmRpZGF0ZS5nZW5lcmFsRnVuY3Rpb25zQW5kQ2FsbHMsXG4gICAgICBpbW11dGFibGVDb2xsZWN0aW9uczogZmVhdHVyZXNDYW5kaWRhdGUuaW1tdXRhYmxlQ29sbGVjdGlvbnMsXG4gICAgICBvcHRpb25hbFZhbHVlczogZmVhdHVyZXNDYW5kaWRhdGUub3B0aW9uYWxWYWx1ZXMsXG4gICAgICBvcmRlcmVkTGlzdEl0ZXJhdGlvbjogZmVhdHVyZXNDYW5kaWRhdGUub3JkZXJlZExpc3RJdGVyYXRpb24sXG4gICAgICBvcmRlcmVkTWFwSXRlcmF0aW9uOiBmZWF0dXJlc0NhbmRpZGF0ZS5vcmRlcmVkTWFwSXRlcmF0aW9uLFxuICAgICAgcmVmZXJlbmNlQ2xhc3NlczogZmVhdHVyZXNDYW5kaWRhdGUucmVmZXJlbmNlQ2xhc3NlcyxcbiAgICAgIHN0cmluZ0ludGVycG9sYXRpb246IGZlYXR1cmVzQ2FuZGlkYXRlLnN0cmluZ0ludGVycG9sYXRpb24sXG4gICAgICB0eXBlZEVycm9yczogZmVhdHVyZXNDYW5kaWRhdGUudHlwZWRFcnJvcnMsXG4gICAgICB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzOiBmZWF0dXJlc0NhbmRpZGF0ZS50eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzXG4gICAgfSkpXG4gICAgY29uc3QgbWFwcGluZ0NhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5tYXBwaW5nXG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QobWFwcGluZ0NhbmRpZGF0ZSkpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgbWFwcGluZyBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICBjb25zdCBtYXBwaW5nU25hcHNob3QgPSB7XG4gICAgICBiaW5hcnlSYW5nZXM6IG1hcHBpbmdDYW5kaWRhdGUuYmluYXJ5UmFuZ2VzLFxuICAgICAgcmljaFRleHQ6IG1hcHBpbmdDYW5kaWRhdGUucmljaFRleHQsXG4gICAgICBzb3VyY2VNYXBWMzogbWFwcGluZ0NhbmRpZGF0ZS5zb3VyY2VNYXBWM1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWFwcGluZ1NuYXBzaG90LnJpY2hUZXh0ICE9IFwiYm9vbGVhblwiIHx8IHR5cGVvZiBtYXBwaW5nU25hcHNob3Quc291cmNlTWFwVjMgIT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBtYXBwaW5nU25hcHNob3QuYmluYXJ5UmFuZ2VzICE9IFwiYm9vbGVhblwiKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyBhbiBpbnZhbGlkIG1hcHBpbmcgZGVjbGFyYXRpb24uYCwgaWQpXG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmcgPSBkZWVwRnJlZXplKC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5MYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXN9ICovIChtYXBwaW5nU25hcHNob3QpKVxuICAgIGNvbnN0IGFjY2VwdGFuY2VDYW5kaWRhdGUgPSBjYW5kaWRhdGUuYWNjZXB0YW5jZVxuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjY2VwdGFuY2VDYW5kaWRhdGUpIHx8ICFpc0RlbnNlQXJyYXkoYWNjZXB0YW5jZUNhbmRpZGF0ZS5zdGFnZXMpIHx8XG4gICAgICAhaXNEZW5zZUFycmF5KGFjY2VwdGFuY2VDYW5kaWRhdGUudG9vbGNoYWlucykpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgYWNjZXB0YW5jZSBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICB9XG4gICAgLyoqIEB0eXBlIHt1bmtub3duW119ICovXG4gICAgY29uc3Qgc3RhZ2VTbmFwc2hvdCA9IFtdXG4gICAgLyoqIEB0eXBlIHt1bmtub3duW119ICovXG4gICAgY29uc3QgdG9vbGNoYWluU25hcHNob3QgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFjY2VwdGFuY2VDYW5kaWRhdGUuc3RhZ2VzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RhZ2VTbmFwc2hvdC5wdXNoKGFjY2VwdGFuY2VDYW5kaWRhdGUuc3RhZ2VzW2luZGV4XSlcbiAgICB9XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFjY2VwdGFuY2VDYW5kaWRhdGUudG9vbGNoYWlucy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHRvb2xjaGFpblNuYXBzaG90LnB1c2goYWNjZXB0YW5jZUNhbmRpZGF0ZS50b29sY2hhaW5zW2luZGV4XSlcbiAgICB9XG4gICAgaWYgKCFzdGFnZVNuYXBzaG90LmV2ZXJ5KChzdGFnZSkgPT4gdHlwZW9mIHN0YWdlID09IFwic3RyaW5nXCIgJiYgYWNjZXB0YW5jZVN0YWdlcy5oYXMoc3RhZ2UpKSB8fFxuICAgICAgIXRvb2xjaGFpblNuYXBzaG90LmV2ZXJ5KCh0b29sY2hhaW4pID0+IHR5cGVvZiB0b29sY2hhaW4gPT0gXCJzdHJpbmdcIiAmJiB0b29sY2hhaW4ubGVuZ3RoID4gMCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIGFuIGludmFsaWQgYWNjZXB0YW5jZSBkZWNsYXJhdGlvbi5gLCBpZClcbiAgICB9XG4gICAgY29uc3Qgc3RhZ2VzID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLkFjY2VwdGFuY2VTdGFnZVtdfSAqLyAoc3RhZ2VTbmFwc2hvdClcbiAgICBjb25zdCB0b29sY2hhaW5zID0gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKHRvb2xjaGFpblNuYXBzaG90KVxuICAgIGxldCBwcmV2aW91c1N0YWdlID0gLTFcbiAgICBjb25zdCBkZWNsYXJlZFN0YWdlcyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCBzdGFnZSBvZiBzdGFnZXMpIHtcbiAgICAgIGNvbnN0IHN0YWdlSW5kZXggPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGFjY2VwdGFuY2VTdGFnZXMuZ2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc3RhZ2UpKSlcblxuICAgICAgaWYgKGRlY2xhcmVkU3RhZ2VzLmhhcyhzdGFnZSkgfHwgc3RhZ2VJbmRleCA8IHByZXZpb3VzU3RhZ2UpIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIHVub3JkZXJlZCBvciBkdXBsaWNhdGUgYWNjZXB0YW5jZSBzdGFnZXMuYCwgaWQpXG4gICAgICBkZWNsYXJlZFN0YWdlcy5hZGQoc3RhZ2UpXG4gICAgICBwcmV2aW91c1N0YWdlID0gc3RhZ2VJbmRleFxuICAgIH1cbiAgICBpZiAobmV3IFNldCh0b29sY2hhaW5zKS5zaXplICE9IHRvb2xjaGFpbnMubGVuZ3RoKSB7XG4gICAgICBpbnZhbGlkUmVnaXN0cnkoYFJlZ2lzdHJ5IHJlY29yZCAnJHtpZH0nIGhhcyBkdXBsaWNhdGUgYWNjZXB0YW5jZSB0b29sY2hhaW5zLmAsIGlkKVxuICAgIH1cbiAgICBjb25zdCBjaGVja0NhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5jaGVja1xuICAgIC8qKiBAdHlwZSB7UmVhZG9ubHk8TGFuZ3VhZ2VSZWdpc3RyeUNoZWNrUmVjb3JkPn0gKi9cbiAgICBsZXQgY2hlY2tcblxuICAgIGlmIChjaGVja0NhbmRpZGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjaGVjayA9IGRlZXBGcmVlemUoe3N0YWdlczogW10sIHN1cHBvcnRlZDogZmFsc2UsIHRvb2xjaGFpbnM6IFtdfSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGNoZWNrQ2FuZGlkYXRlKSB8fCBPYmplY3Qua2V5cyhjaGVja0NhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwiZmFjdG9yeSxzdGFnZXMsdG9vbGNoYWluc1wiIHx8XG4gICAgICAgIHR5cGVvZiBjaGVja0NhbmRpZGF0ZS5mYWN0b3J5ICE9IFwiZnVuY3Rpb25cIiB8fCAhaXNEZW5zZUFycmF5KGNoZWNrQ2FuZGlkYXRlLnN0YWdlcykgfHxcbiAgICAgICAgIWlzRGVuc2VBcnJheShjaGVja0NhbmRpZGF0ZS50b29sY2hhaW5zKSB8fCBjaGVja0NhbmRpZGF0ZS5zdGFnZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBoYXMgYW4gaW52YWxpZCBkZXZlbG9wZXItY2hlY2sgZGVjbGFyYXRpb24uYCwgaWQpXG4gICAgICB9XG4gICAgICAvKiogQHR5cGUge3Vua25vd25bXX0gKi9cbiAgICAgIGNvbnN0IGNoZWNrU3RhZ2VTbmFwc2hvdCA9IFtdXG4gICAgICAvKiogQHR5cGUge3Vua25vd25bXX0gKi9cbiAgICAgIGNvbnN0IGNoZWNrVG9vbGNoYWluU25hcHNob3QgPSBbXVxuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY2hlY2tDYW5kaWRhdGUuc3RhZ2VzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBjaGVja1N0YWdlU25hcHNob3QucHVzaChjaGVja0NhbmRpZGF0ZS5zdGFnZXNbaW5kZXhdKVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNoZWNrQ2FuZGlkYXRlLnRvb2xjaGFpbnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIGNoZWNrVG9vbGNoYWluU25hcHNob3QucHVzaChjaGVja0NhbmRpZGF0ZS50b29sY2hhaW5zW2luZGV4XSlcbiAgICAgIH1cbiAgICAgIGlmICghY2hlY2tTdGFnZVNuYXBzaG90LmV2ZXJ5KHN0YWdlID0+IHR5cGVvZiBzdGFnZSA9PSBcInN0cmluZ1wiICYmIGRldmVsb3BlckNoZWNrU3RhZ2VzLmhhcyhzdGFnZSkgJiZcbiAgICAgICAgZGVjbGFyZWRTdGFnZXMuaGFzKHN0YWdlKSkgfHwgIWNoZWNrVG9vbGNoYWluU25hcHNob3QuZXZlcnkodG9vbGNoYWluID0+IHR5cGVvZiB0b29sY2hhaW4gPT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICB0b29sY2hhaW5zLmluY2x1ZGVzKHRvb2xjaGFpbikpIHx8IG5ldyBTZXQoY2hlY2tTdGFnZVNuYXBzaG90KS5zaXplICE9IGNoZWNrU3RhZ2VTbmFwc2hvdC5sZW5ndGggfHxcbiAgICAgICAgbmV3IFNldChjaGVja1Rvb2xjaGFpblNuYXBzaG90KS5zaXplICE9IGNoZWNrVG9vbGNoYWluU25hcHNob3QubGVuZ3RoKSB7XG4gICAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgZGV2ZWxvcGVyIGNoZWNrcyBtdXN0IHVzZSBvcmRlcmVkIG5vbi1leGVjdXRpbmcgZGVjbGFyZWQgc3RhZ2VzIGFuZCB0b29sY2hhaW5zLmAsIGlkKVxuICAgICAgfVxuICAgICAgbGV0IHByZXZpb3VzQ2hlY2tTdGFnZSA9IC0xXG5cbiAgICAgIGZvciAoY29uc3Qgc3RhZ2Ugb2YgY2hlY2tTdGFnZVNuYXBzaG90KSB7XG4gICAgICAgIGNvbnN0IHN0YWdlSW5kZXggPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGFjY2VwdGFuY2VTdGFnZXMuZ2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc3RhZ2UpKSlcblxuICAgICAgICBpZiAoc3RhZ2VJbmRleCA8IHByZXZpb3VzQ2hlY2tTdGFnZSkge1xuICAgICAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgaGFzIHVub3JkZXJlZCBkZXZlbG9wZXItY2hlY2sgc3RhZ2VzLmAsIGlkKVxuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzQ2hlY2tTdGFnZSA9IHN0YWdlSW5kZXhcbiAgICAgIH1cbiAgICAgIGNoZWNrID0gZGVlcEZyZWV6ZSh7XG4gICAgICAgIGZhY3Rvcnk6IC8qKiBAdHlwZSB7VGFyZ2V0Q2hlY2tQbGFuRmFjdG9yeX0gKi8gKGNoZWNrQ2FuZGlkYXRlLmZhY3RvcnkpLFxuICAgICAgICBzdGFnZXM6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5BY2NlcHRhbmNlU3RhZ2VbXX0gKi8gKGNoZWNrU3RhZ2VTbmFwc2hvdCksXG4gICAgICAgIHN1cHBvcnRlZDogdHJ1ZSxcbiAgICAgICAgdG9vbGNoYWluczogLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKGNoZWNrVG9vbGNoYWluU25hcHNob3QpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IGhhc0Zyb250ZW5kID0gdHlwZW9mIGNhbmRpZGF0ZS5mcm9udGVuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICBjb25zdCBoYXNUZXh0QmFja2VuZCA9IHR5cGVvZiBjYW5kaWRhdGUudGV4dEJhY2tlbmQgPT0gXCJmdW5jdGlvblwiXG4gICAgY29uc3QgaGFzQmluYXJ5QmFja2VuZCA9IHR5cGVvZiBjYW5kaWRhdGUuYmluYXJ5QmFja2VuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICBjb25zdCBoYXNBcHBsaWNhdGlvbkJhY2tlbmQgPSB0eXBlb2YgY2FuZGlkYXRlLmFwcGxpY2F0aW9uQmFja2VuZCA9PSBcImZ1bmN0aW9uXCJcbiAgICBjb25zdCBoYXNCYWNrZW5kID0gaGFzVGV4dEJhY2tlbmQgfHwgaGFzQmluYXJ5QmFja2VuZCB8fCBoYXNBcHBsaWNhdGlvbkJhY2tlbmRcblxuICAgIGlmIChjaGVjay5zdXBwb3J0ZWQgJiYgIWhhc0JhY2tlbmQpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgcmVjb3JkICcke2lkfScgZGVjbGFyZXMgZGV2ZWxvcGVyIGNoZWNrcyB3aXRob3V0IGEgYmFja2VuZCByb2xlLmAsIGlkKVxuICAgIH1cblxuICAgIGlmICgobWFwcGluZy5yaWNoVGV4dCB8fCBtYXBwaW5nLnNvdXJjZU1hcFYzIHx8IG1hcHBpbmcuYmluYXJ5UmFuZ2VzKSAmJiAhaGFzQmFja2VuZCB8fFxuICAgICAgbWFwcGluZy5zb3VyY2VNYXBWMyAmJiAhbWFwcGluZy5yaWNoVGV4dCB8fFxuICAgICAgbWFwcGluZy5iaW5hcnlSYW5nZXMgJiYgIWhhc0JpbmFyeUJhY2tlbmQgJiYgIWhhc0FwcGxpY2F0aW9uQmFja2VuZCkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBkZWNsYXJlcyBtYXBwaW5nIHN1cHBvcnQgd2l0aG91dCBpdHMgcmVxdWlyZWQgYmFja2VuZCByb2xlLmAsIGlkKVxuICAgIH1cbiAgICBpZiAoY2FuZGlkYXRlLnJvdW5kVHJpcCAmJiAoIWhhc0Zyb250ZW5kIHx8ICFoYXNCYWNrZW5kKSkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBkZWNsYXJlcyByb3VuZC10cmlwIHN1cHBvcnQgd2l0aG91dCBmcm9udGVuZCBhbmQgYmFja2VuZCByb2xlcy5gLCBpZClcbiAgICB9XG4gICAgaWYgKHN0YWdlcy5pbmNsdWRlcyhcInBhcnNlXCIpICYmICFoYXNGcm9udGVuZCB8fCBzdGFnZXMuaW5jbHVkZXMoXCJnZW5lcmF0ZVwiKSAmJiAhaGFzQmFja2VuZCkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSByZWNvcmQgJyR7aWR9JyBkZWNsYXJlcyBhbiBhY2NlcHRhbmNlIHN0YWdlIHdpdGhvdXQgaXRzIHJlcXVpcmVkIHJvbGUuYCwgaWQpXG4gICAgfVxuXG4gICAgY29uc3QgaGFzRGVmYXVsdGVkQmFja2VuZCA9IGhhc1RleHRCYWNrZW5kIHx8IGhhc0JpbmFyeUJhY2tlbmRcblxuICAgIGlmICgoaGFzRGVmYXVsdGVkQmFja2VuZCB8fCBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAodHlwZW9mIGNhbmRpZGF0ZS5kZWZhdWx0RmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fCBjYW5kaWRhdGUuZGVmYXVsdEZpbGVuYW1lLmxlbmd0aCA9PSAwKSkge1xuICAgICAgaW52YWxpZFJlZ2lzdHJ5KGBSZWdpc3RyeSBiYWNrZW5kICcke2lkfScgcmVxdWlyZXMgYSBkZWZhdWx0IGZpbGVuYW1lLmAsIGlkKVxuICAgIH1cbiAgICBpZiAoKGhhc0RlZmF1bHRlZEJhY2tlbmQgfHwgY2FuZGlkYXRlLm1lZGlhVHlwZSAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgKHR5cGVvZiBjYW5kaWRhdGUubWVkaWFUeXBlICE9IFwic3RyaW5nXCIgfHwgY2FuZGlkYXRlLm1lZGlhVHlwZS5sZW5ndGggPT0gMCkpIHtcbiAgICAgIGludmFsaWRSZWdpc3RyeShgUmVnaXN0cnkgYmFja2VuZCAnJHtpZH0nIHJlcXVpcmVzIGEgbWVkaWEgdHlwZS5gLCBpZClcbiAgICB9XG5cbiAgICBjb25zdCBhY2NlcHRhbmNlID0gZGVlcEZyZWV6ZSgvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VBY2NlcHRhbmNlQ2FwYWJpbGl0aWVzfSAqLyAoe1xuICAgICAgc3RhZ2VzLFxuICAgICAgdG9vbGNoYWluc1xuICAgIH0pKVxuICAgIGNvbnN0IHJlY29yZCA9IGRlZXBGcmVlemUoLyoqIEB0eXBlIHtMYW5ndWFnZVJlZ2lzdHJ5UmVjb3JkfSAqLyAoe1xuICAgICAgYWNjZXB0YW5jZSxcbiAgICAgIGFydGlmYWN0TXVsdGlwbGljaXR5LFxuICAgICAgY2hlY2ssXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGlkLFxuICAgICAgbWFwcGluZyxcbiAgICAgIHJvdW5kVHJpcDogY2FuZGlkYXRlLnJvdW5kVHJpcCxcbiAgICAgIC4uLih0eXBlb2YgY2FuZGlkYXRlLmRlZmF1bHRGaWxlbmFtZSA9PSBcInN0cmluZ1wiID8ge2RlZmF1bHRGaWxlbmFtZTogY2FuZGlkYXRlLmRlZmF1bHRGaWxlbmFtZX0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5tZWRpYVR5cGUgPT0gXCJzdHJpbmdcIiA/IHttZWRpYVR5cGU6IGNhbmRpZGF0ZS5tZWRpYVR5cGV9IDoge30pLFxuICAgICAgLi4uKHR5cGVvZiBjYW5kaWRhdGUucHJvdmlkZXIgPT0gXCJib29sZWFuXCIgPyB7cHJvdmlkZXI6IGNhbmRpZGF0ZS5wcm92aWRlcn0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5mcm9udGVuZCA9PSBcImZ1bmN0aW9uXCIgPyB7ZnJvbnRlbmQ6IGNhbmRpZGF0ZS5mcm9udGVuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS50ZXh0QmFja2VuZCA9PSBcImZ1bmN0aW9uXCIgPyB7dGV4dEJhY2tlbmQ6IGNhbmRpZGF0ZS50ZXh0QmFja2VuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5iaW5hcnlCYWNrZW5kID09IFwiZnVuY3Rpb25cIiA/IHtiaW5hcnlCYWNrZW5kOiBjYW5kaWRhdGUuYmluYXJ5QmFja2VuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5hcHBsaWNhdGlvbkJhY2tlbmQgPT0gXCJmdW5jdGlvblwiID8ge2FwcGxpY2F0aW9uQmFja2VuZDogY2FuZGlkYXRlLmFwcGxpY2F0aW9uQmFja2VuZH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNhbmRpZGF0ZS5pbnRlcm9wZXJhYmlsaXR5ID09IFwiZnVuY3Rpb25cIiA/IHtpbnRlcm9wZXJhYmlsaXR5OiBjYW5kaWRhdGUuaW50ZXJvcGVyYWJpbGl0eX0gOiB7fSlcbiAgICB9KSlcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gZGVlcEZyZWV6ZSgvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuTGFuZ3VhZ2VDYXBhYmlsaXRpZXN9ICovICh7XG4gICAgICBhY2NlcHRhbmNlLFxuICAgICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHksXG4gICAgICBjaGVjazogZGVlcEZyZWV6ZSh7c3RhZ2VzOiBjaGVjay5zdGFnZXMsIHN1cHBvcnRlZDogY2hlY2suc3VwcG9ydGVkLCB0b29sY2hhaW5zOiBjaGVjay50b29sY2hhaW5zfSksXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGlkLFxuICAgICAgbWFwcGluZyxcbiAgICAgIHJvbGVzOiB7XG4gICAgICAgIGFwcGxpY2F0aW9uQmFja2VuZDogdHlwZW9mIGNhbmRpZGF0ZS5hcHBsaWNhdGlvbkJhY2tlbmQgPT0gXCJmdW5jdGlvblwiLFxuICAgICAgICBiaW5hcnlCYWNrZW5kOiB0eXBlb2YgY2FuZGlkYXRlLmJpbmFyeUJhY2tlbmQgPT0gXCJmdW5jdGlvblwiLFxuICAgICAgICBmcm9udGVuZDogdHlwZW9mIGNhbmRpZGF0ZS5mcm9udGVuZCA9PSBcImZ1bmN0aW9uXCIsXG4gICAgICAgIGludGVyb3BlcmFiaWxpdHk6IHR5cGVvZiBjYW5kaWRhdGUuaW50ZXJvcGVyYWJpbGl0eSA9PSBcImZ1bmN0aW9uXCIsXG4gICAgICAgIHByb3ZpZGVyOiBjYW5kaWRhdGUucHJvdmlkZXIgPT09IHRydWUsXG4gICAgICAgIHRleHRCYWNrZW5kOiB0eXBlb2YgY2FuZGlkYXRlLnRleHRCYWNrZW5kID09IFwiZnVuY3Rpb25cIlxuICAgICAgfSxcbiAgICAgIHJvdW5kVHJpcDogY2FuZGlkYXRlLnJvdW5kVHJpcFxuICAgIH0pKVxuXG4gICAgcmVjb3Jkc0J5SWQuc2V0KGlkLCByZWNvcmQpXG4gICAgZGVzY3JpcHRvcnMucHVzaChkZXNjcmlwdG9yKVxuICB9XG5cbiAgY29uc3QgZnJvemVuRGVzY3JpcHRvcnMgPSBkZWVwRnJlZXplKGRlc2NyaXB0b3JzKVxuICBjb25zdCBpZHMgPSBPYmplY3QuZnJlZXplKGZyb3plbkRlc2NyaXB0b3JzLm1hcCgoe2lkfSkgPT4gaWQpKVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICBkZXNjcmlwdG9yczogZnJvemVuRGVzY3JpcHRvcnMsXG4gICAgaWRzLFxuICAgIHJlY29yZChpZCkge1xuICAgICAgY29uc3QgcmVjb3JkID0gcmVjb3Jkc0J5SWQuZ2V0KGlkKVxuXG4gICAgICBpZiAoIXJlY29yZCkgdW5zdXBwb3J0ZWRMYW5ndWFnZShpZClcblxuICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH0sXG4gICAgcmVzb2x2ZShpZCwgcm9sZSwgbG9jYXRpb24pIHtcbiAgICAgIGlmICghcmVnaXN0cnlSb2xlcy5pbmNsdWRlcyhyb2xlKSkgaW52YWxpZFJlZ2lzdHJ5KGBVbmtub3duIHJlZ2lzdHJ5IHJvbGUgJyR7cm9sZX0nLmAsIGlkKVxuICAgICAgY29uc3QgcmVjb3JkID0gcmVjb3Jkc0J5SWQuZ2V0KGlkKVxuXG4gICAgICBpZiAoIXJlY29yZCkgdW5zdXBwb3J0ZWRMYW5ndWFnZShpZCwgbG9jYXRpb24sIHJvbGUpXG4gICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbiA9IHJlY29yZFtyb2xlXVxuXG4gICAgICBpZiAodHlwZW9mIGltcGxlbWVudGF0aW9uICE9IFwiZnVuY3Rpb25cIikgdW5zdXBwb3J0ZWRSb2xlKGlkLCBwdWJsaWNSb2xlTmFtZShyb2xlKSwgbG9jYXRpb24pXG5cbiAgICAgIHJldHVybiBpbXBsZW1lbnRhdGlvblxuICAgIH1cbiAgfSlcbn1cblxuLyoqXG4gKiBQSFAgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgcGhwRnJvbnRlbmQgPSAoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIHByb2dyYW0sIHNvdXJjZX0pID0+IHBhcnNlUGhwKHtjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBwcm9ncmFtLCBzb3VyY2V9KVxuXG4vKipcbiAqIFJ1YnkgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgcnVieUZyb250ZW5kID0gKHtjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBwcm9ncmFtLCBzb3VyY2V9KSA9PiBwYXJzZVJ1Ynkoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIHByb2dyYW0sIHNvdXJjZX0pXG5cbi8qKlxuICogSmF2YVNjcmlwdCByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCBqYXZhU2NyaXB0RnJvbnRlbmQgPSAoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIHByb2dyYW0sIHNvdXJjZX0pID0+IHBhcnNlSmF2YVNjcmlwdFR5cGVTY3JpcHQoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIGxhbmd1YWdlOiBcImphdmFzY3JpcHRcIiwgcHJvZ3JhbSwgc291cmNlfSlcblxuLyoqXG4gKiBUeXBlU2NyaXB0IHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IHR5cGVTY3JpcHRGcm9udGVuZCA9ICh7Y2FwYWJpbGl0aWVzLCBmaWxlbmFtZSwgcHJvZ3JhbSwgc291cmNlfSkgPT4gcGFyc2VKYXZhU2NyaXB0VHlwZVNjcmlwdCh7Y2FwYWJpbGl0aWVzLCBmaWxlbmFtZSwgbGFuZ3VhZ2U6IFwidHlwZXNjcmlwdFwiLCBwcm9ncmFtLCBzb3VyY2V9KVxuXG4vKipcbiAqIEphdmEgcmVnaXN0cnkgZnJvbnRlbmQgd3JhcHBlci5cbiAqIEB0eXBlIHtGcm9udGVuZH1cbiAqL1xuY29uc3QgamF2YUZyb250ZW5kID0gKHtjYXBhYmlsaXRpZXMsIGZpbGVuYW1lLCBwcm9ncmFtLCBzb3VyY2V9KSA9PiBwYXJzZUphdmEoe2NhcGFiaWxpdGllcywgZmlsZW5hbWUsIHByb2dyYW0sIHNvdXJjZX0pXG5cbi8qKlxuICogS290bGluIHJlZ2lzdHJ5IGZyb250ZW5kIHdyYXBwZXIuXG4gKiBAdHlwZSB7RnJvbnRlbmR9XG4gKi9cbmNvbnN0IGtvdGxpbkZyb250ZW5kID0gKHtmaWxlbmFtZSwgc291cmNlfSkgPT4gcGFyc2VLb3RsaW4oe2ZpbGVuYW1lLCBzb3VyY2V9KVxuXG4vKipcbiAqIFB5dGhvbiByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCBweXRob25Gcm9udGVuZCA9ICh7ZmlsZW5hbWUsIHNvdXJjZX0pID0+IHBhcnNlUHl0aG9uKHtmaWxlbmFtZSwgc291cmNlfSlcblxuLyoqXG4gKiBDIyByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCBjc2hhcnBGcm9udGVuZCA9ICh7ZmlsZW5hbWUsIHNvdXJjZX0pID0+IHBhcnNlQ1NoYXJwKHtmaWxlbmFtZSwgc291cmNlfSlcblxuLyoqXG4gKiBHbyByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCBnb0Zyb250ZW5kID0gKHtmaWxlbmFtZSwgc291cmNlfSkgPT4gcGFyc2VHbyh7ZmlsZW5hbWUsIHNvdXJjZX0pXG5cbi8qKlxuICogRGFydCByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCBkYXJ0RnJvbnRlbmQgPSAoe2ZpbGVuYW1lLCBzb3VyY2V9KSA9PiBwYXJzZURhcnQoe2ZpbGVuYW1lLCBzb3VyY2V9KVxuXG4vKipcbiAqIFppZyByZWdpc3RyeSBmcm9udGVuZCB3cmFwcGVyLlxuICogQHR5cGUge0Zyb250ZW5kfVxuICovXG5jb25zdCB6aWdGcm9udGVuZCA9ICh7ZmlsZW5hbWUsIHNvdXJjZX0pID0+IHBhcnNlWmlnKHtmaWxlbmFtZSwgc291cmNlfSlcblxuY29uc3QgcmVjb3JkcyA9IFtcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJ2YWxpZGF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInBocDgyXCJdfSxcbiAgICBjaGVjazoge2ZhY3Rvcnk6IGNyZWF0ZVBocENoZWNrUGxhbiwgc3RhZ2VzOiBbXCJ2YWxpZGF0ZVwiXSwgdG9vbGNoYWluczogW1wicGhwODJcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLnBocFwiLFxuICAgIGZyb250ZW5kOiBwaHBGcm9udGVuZCxcbiAgICBpZDogXCJwaHBcIixcbiAgICBtZWRpYVR5cGU6IFwiYXBwbGljYXRpb24veC1odHRwZC1waHBcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVQaHBcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwidmFsaWRhdGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJydWJ5XCJdfSxcbiAgICBjaGVjazoge2ZhY3Rvcnk6IGNyZWF0ZVJ1YnlDaGVja1BsYW4sIHN0YWdlczogW1widmFsaWRhdGVcIl0sIHRvb2xjaGFpbnM6IFtcInJ1YnlcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLnJiXCIsXG4gICAgZnJvbnRlbmQ6IHJ1YnlGcm9udGVuZCxcbiAgICBpZDogXCJydWJ5XCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1ydWJ5XCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlUnVieVxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJ2YWxpZGF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcIm5vZGVcIl19LFxuICAgIGNoZWNrOiB7ZmFjdG9yeTogY3JlYXRlSmF2YVNjcmlwdENoZWNrUGxhbiwgc3RhZ2VzOiBbXCJ2YWxpZGF0ZVwiXSwgdG9vbGNoYWluczogW1wibm9kZVwiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0uanNcIixcbiAgICBmcm9udGVuZDogamF2YVNjcmlwdEZyb250ZW5kLFxuICAgIGlkOiBcImphdmFzY3JpcHRcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC9qYXZhc2NyaXB0XCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlSmF2YVNjcmlwdFxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1widHNjXCIsIFwibm9kZVwiXX0sXG4gICAgY2hlY2s6IHtmYWN0b3J5OiBjcmVhdGVUeXBlU2NyaXB0Q2hlY2tQbGFuLCBzdGFnZXM6IFtcImNvbXBpbGVcIl0sIHRvb2xjaGFpbnM6IFtcInRzY1wiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0udHNcIixcbiAgICBmcm9udGVuZDogdHlwZVNjcmlwdEZyb250ZW5kLFxuICAgIGlkOiBcInR5cGVzY3JpcHRcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC90eXBlc2NyaXB0XCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlVHlwZVNjcmlwdFxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wiamF2YWNcIiwgXCJqYXZhXCJdfSxcbiAgICBjaGVjazoge2ZhY3Rvcnk6IGNyZWF0ZUphdmFDaGVja1BsYW4sIHN0YWdlczogW1wiY29tcGlsZVwiXSwgdG9vbGNoYWluczogW1wiamF2YWNcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJNYWluLmphdmFcIixcbiAgICBmcm9udGVuZDogamF2YUZyb250ZW5kLFxuICAgIGlkOiBcImphdmFcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWphdmEtc291cmNlXCIsXG4gICAgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlSmF2YVxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wia290bGluY1wiLCBcImphdmEyNVwiXX0sXG4gICAgY2hlY2s6IHtmYWN0b3J5OiBjcmVhdGVLb3RsaW5DaGVja1BsYW4sIHN0YWdlczogW1wiY29tcGlsZVwiXSwgdG9vbGNoYWluczogW1wia290bGluY1wiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcIlByb2dyYW0ua3RcIixcbiAgICBmcm9udGVuZDoga290bGluRnJvbnRlbmQsXG4gICAgaWQ6IFwia290bGluXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1rb3RsaW5cIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVLb3RsaW5cbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInB5dGhvblwiXX0sXG4gICAgY2hlY2s6IHtmYWN0b3J5OiBjcmVhdGVQeXRob25DaGVja1BsYW4sIHN0YWdlczogW1wiY29tcGlsZVwiXSwgdG9vbGNoYWluczogW1wicHl0aG9uXCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwicHJvZ3JhbS5weVwiLFxuICAgIGZyb250ZW5kOiBweXRob25Gcm9udGVuZCxcbiAgICBpZDogXCJweXRob25cIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LXB5dGhvblwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZVB5dGhvblxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJyZXN0b3JlXCIsIFwiY29tcGlsZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImRvdG5ldFwiXX0sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBjaGVjazoge2ZhY3Rvcnk6IGNyZWF0ZUNTaGFycENoZWNrUGxhbiwgc3RhZ2VzOiBbXCJyZXN0b3JlXCIsIFwiY29tcGlsZVwiXSwgdG9vbGNoYWluczogW1wiZG90bmV0XCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwiUHJvZ3JhbS5jc1wiLFxuICAgIGZyb250ZW5kOiBjc2hhcnBGcm9udGVuZCxcbiAgICBpZDogXCJjc2hhcnBcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWNzaGFycFwiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZUNTaGFycFByb2plY3RcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcInZhbGlkYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wiZ29cIl19LFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgY2hlY2s6IHtmYWN0b3J5OiBjcmVhdGVHb0NoZWNrUGxhbiwgc3RhZ2VzOiBbXCJjb21waWxlXCIsIFwidmFsaWRhdGVcIl0sIHRvb2xjaGFpbnM6IFtcImdvXCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwibWFpbi5nb1wiLFxuICAgIGZyb250ZW5kOiBnb0Zyb250ZW5kLFxuICAgIGlkOiBcImdvXCIsXG4gICAgbWVkaWFUeXBlOiBcInRleHQveC1nb1wiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZUdvTW9kdWxlXG4gIH0pLFxuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImNvbXBpbGVcIiwgXCJsaW5rXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wiY2xhbmdcIl19LFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgY2hlY2s6IHtmYWN0b3J5OiBjcmVhdGVDQ2hlY2tQbGFuLCBzdGFnZXM6IFtcImNvbXBpbGVcIiwgXCJsaW5rXCJdLCB0b29sY2hhaW5zOiBbXCJjbGFuZ1wiXX0sXG4gICAgZGVmYXVsdEZpbGVuYW1lOiBcInByb2dyYW0uY1wiLFxuICAgIGZyb250ZW5kOiBwYXJzZUMsXG4gICAgaWQ6IFwiY1wiLFxuICAgIG1lZGlhVHlwZTogXCJ0ZXh0L3gtY1wiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZUNQcm9ncmFtXG4gIH0pLFxuICBsYW5ndWFnZSh7XG4gICAgYWNjZXB0YW5jZToge3N0YWdlczogW1wicGFyc2VcIiwgXCJnZW5lcmF0ZVwiLCBcImNvbXBpbGVcIiwgXCJsaW5rXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wiY2xhbmdwcFwiXX0sXG4gICAgY2hlY2s6IHtmYWN0b3J5OiBjcmVhdGVDcHBDaGVja1BsYW4sIHN0YWdlczogW1wiY29tcGlsZVwiLCBcImxpbmtcIl0sIHRvb2xjaGFpbnM6IFtcImNsYW5ncHBcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLmNwcFwiLCBmcm9udGVuZDogcGFyc2VDcHAsIGlkOiBcImNwcFwiLCBtZWRpYVR5cGU6IFwidGV4dC94LWMrK3NyY1wiLCB0ZXh0QmFja2VuZDogZ2VuZXJhdGVDcHBcbiAgfSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcInZhbGlkYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wicnVzdGNcIiwgXCJjYXJnb1wiXX0sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBjaGVjazoge2ZhY3Rvcnk6IGNyZWF0ZVJ1c3RDaGVja1BsYW4sIHN0YWdlczogW1wiY29tcGlsZVwiLCBcInZhbGlkYXRlXCJdLCB0b29sY2hhaW5zOiBbXCJydXN0Y1wiLCBcImNhcmdvXCJdfSxcbiAgICBkZWZhdWx0RmlsZW5hbWU6IFwic3JjL21haW4ucnNcIiwgZnJvbnRlbmQ6IHBhcnNlUnVzdCwgaWQ6IFwicnVzdFwiLCBtZWRpYVR5cGU6IFwidGV4dC94LXJ1c3RcIiwgdGV4dEJhY2tlbmQ6IGdlbmVyYXRlUnVzdFByb2plY3RcbiAgfSksXG4gIGxhbmd1YWdlKHthY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwiY29tcGlsZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcInN3aWZ0Y1wiXX0sXG4gICAgY2hlY2s6IHtmYWN0b3J5OiBjcmVhdGVTd2lmdENoZWNrUGxhbiwgc3RhZ2VzOiBbXCJjb21waWxlXCJdLCB0b29sY2hhaW5zOiBbXCJzd2lmdGNcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLnN3aWZ0XCIsIGZyb250ZW5kOiBwYXJzZVN3aWZ0LCBpZDogXCJzd2lmdFwiLCBtZWRpYVR5cGU6IFwidGV4dC94LXN3aWZ0XCIsIHRleHRCYWNrZW5kOiBnZW5lcmF0ZVN3aWZ0fSksXG4gIGxhbmd1YWdlKHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJwYXJzZVwiLCBcImdlbmVyYXRlXCIsIFwicmVzdG9yZVwiLCBcImNvbXBpbGVcIiwgXCJ2YWxpZGF0ZVwiLCBcImV4ZWN1dGVcIl0sIHRvb2xjaGFpbnM6IFtcImRhcnRcIl19LFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgY2hlY2s6IHtmYWN0b3J5OiBjcmVhdGVEYXJ0Q2hlY2tQbGFuLCBzdGFnZXM6IFtcInJlc3RvcmVcIiwgXCJjb21waWxlXCIsIFwidmFsaWRhdGVcIl0sIHRvb2xjaGFpbnM6IFtcImRhcnRcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJiaW4vcHJvZ3JhbS5kYXJ0XCIsXG4gICAgZmVhdHVyZXM6IHtcbiAgICAgIGNsb3NlZFJlY29yZHM6IGZhbHNlLFxuICAgICAgY29uZGl0aW9uQ29udHJvbGxlZExvb3BzOiBmYWxzZSxcbiAgICAgIGNvbmRpdGlvbmFsRXhwcmVzc2lvbnM6IGZhbHNlLFxuICAgICAgc3RyaW5nSW50ZXJwb2xhdGlvbjogZmFsc2UsXG4gICAgICBlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXM6IGZhbHNlLFxuICAgICAgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiB0cnVlLFxuICAgICAgaW1tdXRhYmxlQ29sbGVjdGlvbnM6IGZhbHNlLFxuICAgICAgb3B0aW9uYWxWYWx1ZXM6IGZhbHNlLFxuICAgICAgb3JkZXJlZExpc3RJdGVyYXRpb246IGZhbHNlLFxuICAgICAgb3JkZXJlZE1hcEl0ZXJhdGlvbjogZmFsc2UsXG4gICAgICByZWZlcmVuY2VDbGFzc2VzOiBmYWxzZSxcbiAgICAgIHR5cGVkRXJyb3JzOiBmYWxzZSxcbiAgICAgIHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3M6IGZhbHNlXG4gICAgfSxcbiAgICBmcm9udGVuZDogZGFydEZyb250ZW5kLFxuICAgIGlkOiBcImRhcnRcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LWRhcnRcIixcbiAgICB0ZXh0QmFja2VuZDogZ2VuZXJhdGVEYXJ0UGFja2FnZVxuICB9KSxcbiAgbGFuZ3VhZ2Uoe1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcInBhcnNlXCIsIFwiZ2VuZXJhdGVcIiwgXCJjb21waWxlXCIsIFwidmFsaWRhdGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJ6aWdcIl19LFxuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcIm11bHRpcGxlXCIsXG4gICAgY2hlY2s6IHtmYWN0b3J5OiBjcmVhdGVaaWdDaGVja1BsYW4sIHN0YWdlczogW1wiY29tcGlsZVwiLCBcInZhbGlkYXRlXCJdLCB0b29sY2hhaW5zOiBbXCJ6aWdcIl19LFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJzcmMvbWFpbi56aWdcIixcbiAgICBmZWF0dXJlczoge1xuICAgICAgY2xvc2VkUmVjb3JkczogZmFsc2UsXG4gICAgICBjb25kaXRpb25Db250cm9sbGVkTG9vcHM6IGZhbHNlLFxuICAgICAgY29uZGl0aW9uYWxFeHByZXNzaW9uczogZmFsc2UsXG4gICAgICBzdHJpbmdJbnRlcnBvbGF0aW9uOiBmYWxzZSxcbiAgICAgIGVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlczogZmFsc2UsXG4gICAgICBnZW5lcmFsRnVuY3Rpb25zQW5kQ2FsbHM6IHRydWUsXG4gICAgICBpbW11dGFibGVDb2xsZWN0aW9uczogZmFsc2UsXG4gICAgICBvcHRpb25hbFZhbHVlczogZmFsc2UsXG4gICAgICBvcmRlcmVkTGlzdEl0ZXJhdGlvbjogZmFsc2UsXG4gICAgICBvcmRlcmVkTWFwSXRlcmF0aW9uOiBmYWxzZSxcbiAgICAgIHJlZmVyZW5jZUNsYXNzZXM6IGZhbHNlLFxuICAgICAgdHlwZWRFcnJvcnM6IGZhbHNlLFxuICAgICAgdHlwZVBhcmFtZXRlcnNBbmRHZW5lcmljczogZmFsc2VcbiAgICB9LFxuICAgIGZyb250ZW5kOiB6aWdGcm9udGVuZCxcbiAgICBpZDogXCJ6aWdcIixcbiAgICBtZWRpYVR5cGU6IFwidGV4dC94LXppZ1wiLFxuICAgIHRleHRCYWNrZW5kOiBnZW5lcmF0ZVppZ1Byb2plY3RcbiAgfSksXG4gIHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJnZW5lcmF0ZVwiLCBcInZhbGlkYXRlXCIsIFwiaW5zdGFudGlhdGVcIiwgXCJleGVjdXRlXCJdLCB0b29sY2hhaW5zOiBbXCJ3YXNtLXZhbGlkYXRlXCIsIFwibm9kZVwiLCBcImNocm9taXVtXCJdfSxcbiAgICBhcHBsaWNhdGlvbkJhY2tlbmQ6IGdlbmVyYXRlQnJvd3Nlcldhc20sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBiaW5hcnlCYWNrZW5kOiBnZW5lcmF0ZUJyb3dzZXJXYXNtLFxuICAgIGRlZmF1bHRGaWxlbmFtZTogXCJwcm9ncmFtLndhc21cIixcbiAgICBmZWF0dXJlczoge2Nsb3NlZFJlY29yZHM6IGZhbHNlLCBjb25kaXRpb25Db250cm9sbGVkTG9vcHM6IGZhbHNlLCBjb25kaXRpb25hbEV4cHJlc3Npb25zOiBmYWxzZSwgc3RyaW5nSW50ZXJwb2xhdGlvbjogZmFsc2UsIGVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlczogZmFsc2UsIGdlbmVyYWxGdW5jdGlvbnNBbmRDYWxsczogZmFsc2UsIGltbXV0YWJsZUNvbGxlY3Rpb25zOiBmYWxzZSwgb3B0aW9uYWxWYWx1ZXM6IGZhbHNlLCBvcmRlcmVkTGlzdEl0ZXJhdGlvbjogZmFsc2UsIG9yZGVyZWRNYXBJdGVyYXRpb246IGZhbHNlLCByZWZlcmVuY2VDbGFzc2VzOiBmYWxzZSwgdHlwZWRFcnJvcnM6IGZhbHNlLCB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzOiBmYWxzZX0sXG4gICAgaWQ6IFwid2FzbVwiLFxuICAgIG1hcHBpbmc6IHtiaW5hcnlSYW5nZXM6IHRydWUsIHJpY2hUZXh0OiB0cnVlLCBzb3VyY2VNYXBWMzogdHJ1ZX0sXG4gICAgbWVkaWFUeXBlOiBcImFwcGxpY2F0aW9uL3dhc21cIixcbiAgICByb3VuZFRyaXA6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJnZW5lcmF0ZVwiLCBcImNvbXBpbGVcIiwgXCJ2YWxpZGF0ZVwiLCBcImluc3RhbnRpYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wiYW5kcm9pZFwiXX0sXG4gICAgYXBwbGljYXRpb25CYWNrZW5kOiBnZW5lcmF0ZUFuZHJvaWRBcHBsaWNhdGlvbixcbiAgICBhcnRpZmFjdE11bHRpcGxpY2l0eTogXCJtdWx0aXBsZVwiLFxuICAgIGZlYXR1cmVzOiB7Y2xvc2VkUmVjb3JkczogZmFsc2UsIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogZmFsc2UsIGNvbmRpdGlvbmFsRXhwcmVzc2lvbnM6IGZhbHNlLCBzdHJpbmdJbnRlcnBvbGF0aW9uOiBmYWxzZSwgZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzOiBmYWxzZSwgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiBmYWxzZSwgaW1tdXRhYmxlQ29sbGVjdGlvbnM6IGZhbHNlLCBvcHRpb25hbFZhbHVlczogZmFsc2UsIG9yZGVyZWRMaXN0SXRlcmF0aW9uOiBmYWxzZSwgb3JkZXJlZE1hcEl0ZXJhdGlvbjogZmFsc2UsIHJlZmVyZW5jZUNsYXNzZXM6IGZhbHNlLCB0eXBlZEVycm9yczogZmFsc2UsIHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3M6IGZhbHNlfSxcbiAgICBpZDogXCJhbmRyb2lkXCIsXG4gICAgbWFwcGluZzoge2JpbmFyeVJhbmdlczogdHJ1ZSwgcmljaFRleHQ6IHRydWUsIHNvdXJjZU1hcFYzOiB0cnVlfSxcbiAgICByb3VuZFRyaXA6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBhY2NlcHRhbmNlOiB7c3RhZ2VzOiBbXCJnZW5lcmF0ZVwiXSwgdG9vbGNoYWluczogW119LFxuICAgIGFwcGxpY2F0aW9uQmFja2VuZDogZ2VuZXJhdGVJb3NBcHBsaWNhdGlvbixcbiAgICBhcnRpZmFjdE11bHRpcGxpY2l0eTogXCJtdWx0aXBsZVwiLFxuICAgIGZlYXR1cmVzOiB7Y2xvc2VkUmVjb3JkczogZmFsc2UsIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogZmFsc2UsIGNvbmRpdGlvbmFsRXhwcmVzc2lvbnM6IGZhbHNlLCBzdHJpbmdJbnRlcnBvbGF0aW9uOiBmYWxzZSwgZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzOiBmYWxzZSwgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiBmYWxzZSwgaW1tdXRhYmxlQ29sbGVjdGlvbnM6IGZhbHNlLCBvcHRpb25hbFZhbHVlczogZmFsc2UsIG9yZGVyZWRMaXN0SXRlcmF0aW9uOiBmYWxzZSwgb3JkZXJlZE1hcEl0ZXJhdGlvbjogZmFsc2UsIHJlZmVyZW5jZUNsYXNzZXM6IGZhbHNlLCB0eXBlZEVycm9yczogZmFsc2UsIHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3M6IGZhbHNlfSxcbiAgICBpZDogXCJpb3NcIixcbiAgICBtYXBwaW5nOiB7YmluYXJ5UmFuZ2VzOiB0cnVlLCByaWNoVGV4dDogdHJ1ZSwgc291cmNlTWFwVjM6IHRydWV9LFxuICAgIHJvdW5kVHJpcDogZmFsc2VcbiAgfSxcbiAge1xuICAgIGFjY2VwdGFuY2U6IHtzdGFnZXM6IFtcImdlbmVyYXRlXCIsIFwicmVzdG9yZVwiLCBcImNvbXBpbGVcIiwgXCJ2YWxpZGF0ZVwiLCBcImluc3RhbnRpYXRlXCIsIFwiZXhlY3V0ZVwiXSwgdG9vbGNoYWluczogW1wiZmx1dHRlclwiLCBcImFuZHJvaWRcIl19LFxuICAgIGFwcGxpY2F0aW9uQmFja2VuZDogZ2VuZXJhdGVGbHV0dGVyQXBwbGljYXRpb24sXG4gICAgYXJ0aWZhY3RNdWx0aXBsaWNpdHk6IFwibXVsdGlwbGVcIixcbiAgICBmZWF0dXJlczoge2Nsb3NlZFJlY29yZHM6IGZhbHNlLCBjb25kaXRpb25Db250cm9sbGVkTG9vcHM6IGZhbHNlLCBjb25kaXRpb25hbEV4cHJlc3Npb25zOiBmYWxzZSwgc3RyaW5nSW50ZXJwb2xhdGlvbjogZmFsc2UsIGVmZmVjdGZ1bENhcGFiaWxpdGllc0FuZFJlc291cmNlczogZmFsc2UsIGdlbmVyYWxGdW5jdGlvbnNBbmRDYWxsczogZmFsc2UsIGltbXV0YWJsZUNvbGxlY3Rpb25zOiBmYWxzZSwgb3B0aW9uYWxWYWx1ZXM6IGZhbHNlLCBvcmRlcmVkTGlzdEl0ZXJhdGlvbjogZmFsc2UsIG9yZGVyZWRNYXBJdGVyYXRpb246IGZhbHNlLCByZWZlcmVuY2VDbGFzc2VzOiBmYWxzZSwgdHlwZWRFcnJvcnM6IGZhbHNlLCB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzOiBmYWxzZX0sXG4gICAgaWQ6IFwiZmx1dHRlclwiLFxuICAgIG1hcHBpbmc6IHtiaW5hcnlSYW5nZXM6IHRydWUsIHJpY2hUZXh0OiB0cnVlLCBzb3VyY2VNYXBWMzogdHJ1ZX0sXG4gICAgcm91bmRUcmlwOiBmYWxzZVxuICB9XG5dXG5cbmV4cG9ydCBjb25zdCBsYW5ndWFnZVJlZ2lzdHJ5ID0gY3JlYXRlTGFuZ3VhZ2VSZWdpc3RyeShyZWNvcmRzKVxuZXhwb3J0IGNvbnN0IGxhbmd1YWdlQ2FwYWJpbGl0aWVzID0gbGFuZ3VhZ2VSZWdpc3RyeS5kZXNjcmlwdG9yc1xuLyoqIEB0eXBlIHtyZWFkb25seSBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2VbXX0gKi9cbmV4cG9ydCBjb25zdCBzdXBwb3J0ZWRMYW5ndWFnZXMgPSBPYmplY3QuZnJlZXplKGxhbmd1YWdlQ2FwYWJpbGl0aWVzXG4gIC5maWx0ZXIoKHtyb2xlc30pID0+IHJvbGVzLmZyb250ZW5kICYmIHJvbGVzLnRleHRCYWNrZW5kKVxuICAubWFwKCh7aWR9KSA9PiAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gKi8gKGlkKSkpXG5cbi8qKlxuICogU3VwcGxpZXMgY29tbW9uIG9yaWdpbmFsLWZpdmUgY2FwYWJpbGl0eSBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSB2YWx1ZXMgLSBMYW5ndWFnZS1zcGVjaWZpYyByZWNvcmQgZmllbGRzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBDb21wbGV0ZSByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIGxhbmd1YWdlKHZhbHVlcykge1xuICByZXR1cm4ge1xuICAgIGFydGlmYWN0TXVsdGlwbGljaXR5OiBcInNpbmdsZVwiLFxuICAgIGZlYXR1cmVzOiB7XG4gICAgICBjbG9zZWRSZWNvcmRzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIGNvbmRpdGlvbkNvbnRyb2xsZWRMb29wczogW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiXS5pbmNsdWRlcyhTdHJpbmcodmFsdWVzLmlkKSksXG4gICAgICBjb25kaXRpb25hbEV4cHJlc3Npb25zOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIHN0cmluZ0ludGVycG9sYXRpb246IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiXS5pbmNsdWRlcyhTdHJpbmcodmFsdWVzLmlkKSksXG4gICAgICBlZmZlY3RmdWxDYXBhYmlsaXRpZXNBbmRSZXNvdXJjZXM6IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpLFxuICAgICAgZ2VuZXJhbEZ1bmN0aW9uc0FuZENhbGxzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIGltbXV0YWJsZUNvbGxlY3Rpb25zOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIG9wdGlvbmFsVmFsdWVzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIG9yZGVyZWRMaXN0SXRlcmF0aW9uOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKSxcbiAgICAgIG9yZGVyZWRNYXBJdGVyYXRpb246IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpLFxuICAgICAgcmVmZXJlbmNlQ2xhc3NlczogW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiXS5pbmNsdWRlcyhTdHJpbmcodmFsdWVzLmlkKSksXG4gICAgICB0eXBlZEVycm9yczogW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiXS5pbmNsdWRlcyhTdHJpbmcodmFsdWVzLmlkKSksXG4gICAgICB0eXBlUGFyYW1ldGVyc0FuZEdlbmVyaWNzOiBbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdLmluY2x1ZGVzKFN0cmluZyh2YWx1ZXMuaWQpKVxuICAgIH0sXG4gICAgbWFwcGluZzoge2JpbmFyeVJhbmdlczogZmFsc2UsIHJpY2hUZXh0OiB0cnVlLCBzb3VyY2VNYXBWMzogdHJ1ZX0sXG4gICAgcHJvdmlkZXI6IFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoU3RyaW5nKHZhbHVlcy5pZCkpLFxuICAgIHJvdW5kVHJpcDogdHJ1ZSxcbiAgICAuLi52YWx1ZXNcbiAgfVxufVxuXG4vKipcbiAqIEZvcm1hdHMgYW4gaW50ZXJuYWwgcmVnaXN0cnkga2V5IGZvciBhIHB1YmxpYyByb2xlIGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIEludGVybmFsIHJvbGUga2V5LlxuICogQHJldHVybnMge3N0cmluZ30gUHVibGljIHJvbGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcHVibGljUm9sZU5hbWUocm9sZSkge1xuICBpZiAocm9sZSA9PSBcInRleHRCYWNrZW5kXCIpIHJldHVybiBcInRleHQgYmFja2VuZFwiXG4gIGlmIChyb2xlID09IFwiYmluYXJ5QmFja2VuZFwiKSByZXR1cm4gXCJiaW5hcnkgYmFja2VuZFwiXG4gIGlmIChyb2xlID09IFwiYXBwbGljYXRpb25CYWNrZW5kXCIpIHJldHVybiBcImFwcGxpY2F0aW9uLWFydGlmYWN0IGJhY2tlbmRcIlxuXG4gIHJldHVybiByb2xlXG59XG5cbi8qKlxuICogVGhyb3dzIGFuIHVua25vd24tbGFuZ3VhZ2UgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFVua25vd24gaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWR9IFtsb2NhdGlvbl0gLSBSZWxhdGVkIGxvY2F0aW9uLlxuICogQHBhcmFtIHtSZWdpc3RyeVJvbGUgfCB1bmRlZmluZWR9IFtyb2xlXSAtIFJlcXVlc3RlZCByb2xlLlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiB1bnN1cHBvcnRlZExhbmd1YWdlKGlkLCBsb2NhdGlvbiwgcm9sZSkge1xuICBjb25zdCBtZXNzYWdlID0gcm9sZSA9PSBcImZyb250ZW5kXCIgPyBcIk5vIGZyb250ZW5kIGFkYXB0ZXIgaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBsYW5ndWFnZS5cIiA6XG4gICAgcm9sZSA9PSBcInRleHRCYWNrZW5kXCIgPyBcIk5vIHNvdXJjZSBiYWNrZW5kIGlzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgbGFuZ3VhZ2UuXCIgOlxuICAgICAgXCJObyBsYW5ndWFnZSBvciB0YXJnZXQgaXMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBJRC5cIlxuXG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNvZGU6IFwiVU5TVVBQT1JURURfTEFOR1VBR0VcIixcbiAgICBsYW5ndWFnZTogaWQsXG4gICAgbG9jYXRpb24sXG4gICAgbWVzc2FnZVxuICB9KVxufVxuXG4vKipcbiAqIFRocm93cyBhIG5vcm1hbGl6ZWQgcmVnaXN0cnktc2hhcGUgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRmFpbHVyZSBkZXRhaWwuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2lkXSAtIENhbmRpZGF0ZSByZWdpc3RyeSBJRC5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZFJlZ2lzdHJ5KG1lc3NhZ2UsIGlkID0gXCJyZWdpc3RyeVwiKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiSU5WQUxJRF9SRUdJU1RSWVwiLCBsYW5ndWFnZTogaWQsIG1lc3NhZ2V9KVxufVxuXG4vKipcbiAqIENoZWNrcyBmb3IgYW4gb3JkaW5hcnkgc3RyaW5nLWtleWVkIG9iamVjdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09IE9iamVjdC5wcm90b3R5cGVcbn1cblxuLyoqXG4gKiBEZWVwbHkgZnJlZXplcyByZWdpc3RyeSByZWNvcmRzIGFuZCBwdWJsaWMgZGVzY3JpcHRvcnMuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZSAtIFJlZ2lzdHJ5LW93bmVkIHZhbHVlLlxuICogQHJldHVybnMge1R9IEZyb3plbiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGVlcEZyZWV6ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IE9iamVjdC5pc0Zyb3plbih2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gIGZvciAoY29uc3QgbmVzdGVkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBkZWVwRnJlZXplKG5lc3RlZClcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh2YWx1ZSlcbn1cbiJdfQ==
|