@cdktn/cli-core 0.24.0-pre.9 → 0.24.0-pre.91
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/.spec.swcrc +22 -0
- package/LICENSE +355 -0
- package/build/lib/cdktf-config.d.ts +2 -1
- package/build/lib/cdktf-config.d.ts.map +1 -1
- package/build/lib/cdktf-config.js +10 -1
- package/build/lib/cdktf-stack.d.ts +6 -1
- package/build/lib/cdktf-stack.d.ts.map +1 -1
- package/build/lib/cdktf-stack.js +18 -1
- package/build/lib/dependencies/dependency-manager.d.ts.map +1 -1
- package/build/lib/dependencies/dependency-manager.js +6 -3
- package/build/lib/dependencies/package-manager.d.ts.map +1 -1
- package/build/lib/dependencies/package-manager.js +145 -42
- package/build/lib/dependencies/prebuilt-providers.d.ts.map +1 -1
- package/build/lib/dependencies/prebuilt-providers.js +7 -12
- package/build/lib/dependencies/registry-api.d.ts.map +1 -1
- package/build/lib/dependencies/registry-api.js +5 -12
- package/build/lib/get.d.ts.map +1 -1
- package/build/lib/get.js +2 -1
- package/build/lib/helpers/stack-helpers.js +3 -6
- package/build/lib/init.d.ts +1 -1
- package/build/lib/init.d.ts.map +1 -1
- package/build/lib/init.js +22 -4
- package/build/lib/installed-binary-check.d.ts +12 -0
- package/build/lib/installed-binary-check.d.ts.map +1 -0
- package/build/lib/installed-binary-check.js +62 -0
- package/build/lib/local-provider-constraints.d.ts +1 -7
- package/build/lib/local-provider-constraints.d.ts.map +1 -1
- package/build/lib/local-provider-constraints.js +2 -2
- package/build/lib/models/deploy-machine.d.ts +10 -0
- package/build/lib/models/deploy-machine.d.ts.map +1 -1
- package/build/lib/models/deploy-machine.js +42 -7
- package/build/lib/models/interactive-process.d.ts.map +1 -1
- package/build/lib/models/interactive-process.js +3 -5
- package/build/lib/models/schema.d.ts +151 -2093
- package/build/lib/models/schema.d.ts.map +1 -1
- package/build/lib/models/schema.js +3 -3
- package/build/lib/models/terraform-cli.d.ts +0 -1
- package/build/lib/models/terraform-cli.d.ts.map +1 -1
- package/build/lib/models/terraform.d.ts +1 -0
- package/build/lib/models/terraform.d.ts.map +1 -1
- package/build/lib/models/terraform.js +1 -1
- package/build/lib/output.js +2 -2
- package/build/lib/synth-stack.d.ts +0 -1
- package/build/lib/synth-stack.d.ts.map +1 -1
- package/build/lib/terraform-json.d.ts +21 -981
- package/build/lib/terraform-json.d.ts.map +1 -1
- package/build/lib/terraform-json.js +25 -17
- package/build/lib/watch.d.ts +0 -1
- package/build/lib/watch.d.ts.map +1 -1
- package/jest.config.js +24 -11
- package/package.json +36 -38
- package/templates/csharp/TestProgram.cs +1 -1
- package/templates/csharp/cdktf.json +4 -0
- package/templates/csharp/help +9 -9
- package/templates/go/cdktf.json +4 -0
- package/templates/go/help +3 -3
- package/templates/go/main_test.go +1 -1
- package/templates/java/cdktf.json +4 -0
- package/templates/java/gradlew +0 -0
- package/templates/java/help +4 -4
- package/templates/java/src/test/java/com/company/app/MainTest.java +1 -1
- package/templates/python/cdktf.json +4 -0
- package/templates/python/help +3 -3
- package/templates/python/main-test.py +1 -1
- package/templates/python-pip/cdktf.json +4 -0
- package/templates/python-pip/help +3 -3
- package/templates/python-pip/main-test.py +1 -1
- package/templates/typescript/__tests__/main-test.ts +1 -1
- package/templates/typescript/cdktf.json +4 -0
- package/templates/typescript/help +2 -2
- package/templates/typescript/package.json +1 -1
|
@@ -35,8 +35,89 @@ const path_1 = __importDefault(require("path"));
|
|
|
35
35
|
const xml_js_1 = require("xml-js");
|
|
36
36
|
const fs = __importStar(require("fs-extra"));
|
|
37
37
|
const semver = __importStar(require("semver"));
|
|
38
|
-
const
|
|
38
|
+
const undici_1 = require("undici");
|
|
39
39
|
const z = __importStar(require("zod"));
|
|
40
|
+
const proxy = process.env.http_proxy || process.env.HTTP_PROXY;
|
|
41
|
+
const dispatcher = proxy
|
|
42
|
+
? new undici_1.ProxyAgent(proxy)
|
|
43
|
+
: undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Number of attempts (initial try + retries) for a registry probe before we give up and treat the registry as
|
|
46
|
+
* unreachable. Transient failures (network errors / 408 / 429 / 5xx) are retried; definitive responses are not.
|
|
47
|
+
*/
|
|
48
|
+
const REGISTRY_PROBE_ATTEMPTS = 3;
|
|
49
|
+
/** Base backoff between retries, doubled each attempt (250ms, 500ms). */
|
|
50
|
+
const REGISTRY_PROBE_BACKOFF_MS = 250;
|
|
51
|
+
/**
|
|
52
|
+
* HTTP 408 Request Timeout — a transient status worth retrying.
|
|
53
|
+
*/
|
|
54
|
+
const HTTP_REQUEST_TIMEOUT = 408;
|
|
55
|
+
/**
|
|
56
|
+
* HTTP 429 Too Many Requests (rate limit) — a transient status worth retrying.
|
|
57
|
+
*/
|
|
58
|
+
const HTTP_TOO_MANY_REQUESTS = 429;
|
|
59
|
+
/**
|
|
60
|
+
* Lowest HTTP 5xx status — any status at or above this is a server error and treated as a transient status worth retrying.
|
|
61
|
+
*/
|
|
62
|
+
const HTTP_SERVER_ERROR_MIN = 500;
|
|
63
|
+
/**
|
|
64
|
+
* HTTP 404 Not Found — a definitive "the version is not published" answer from a registry (not transient).
|
|
65
|
+
*/
|
|
66
|
+
const HTTP_NOT_FOUND = 404;
|
|
67
|
+
/**
|
|
68
|
+
* Reports whether an HTTP status is transient and therefore worth retrying: request timeout (408), rate limit (429),
|
|
69
|
+
* or any server error (5xx). Definitive statuses (2xx, 404, other 4xx) are not transient.
|
|
70
|
+
*
|
|
71
|
+
* @param status - The HTTP status code from a registry response.
|
|
72
|
+
* @returns `true` if the status is transient and the request should be retried, `false` otherwise.
|
|
73
|
+
*/
|
|
74
|
+
function isTransientStatus(status) {
|
|
75
|
+
return (status === HTTP_REQUEST_TIMEOUT ||
|
|
76
|
+
status === HTTP_TOO_MANY_REQUESTS ||
|
|
77
|
+
status >= HTTP_SERVER_ERROR_MIN);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Resolves after `ms` milliseconds; used to back off between registry-probe retries.
|
|
81
|
+
*
|
|
82
|
+
* @param ms - The number of milliseconds to wait.
|
|
83
|
+
* @returns A promise that resolves once the delay has elapsed.
|
|
84
|
+
*/
|
|
85
|
+
function delay(ms) {
|
|
86
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Fetches `url`, retrying only on transient failures — network errors and HTTP 408/429/5xx — so a registry hiccup is
|
|
90
|
+
* not mistaken for a definitive answer. Definitive responses (2xx, 404, other 4xx) are returned immediately without
|
|
91
|
+
* retry. If every attempt fails transiently, throws an `External` error so callers can distinguish "registry
|
|
92
|
+
* unreachable" from "version absent" rather than silently treating a hiccup as absence.
|
|
93
|
+
*
|
|
94
|
+
* @param url - The registry URL to fetch.
|
|
95
|
+
* @param init - Optional `fetch` request options (e.g. headers), passed through unchanged on every attempt.
|
|
96
|
+
* @returns The `Response` for the first definitive (non-transient) result.
|
|
97
|
+
* @throws An `External` error if every attempt (up to `REGISTRY_PROBE_ATTEMPTS`) fails transiently.
|
|
98
|
+
*/
|
|
99
|
+
async function fetchWithRetry(url, init) {
|
|
100
|
+
let lastError;
|
|
101
|
+
for (let attempt = 1; attempt <= REGISTRY_PROBE_ATTEMPTS; attempt++) {
|
|
102
|
+
try {
|
|
103
|
+
const response = await (0, undici_1.fetch)(url, { ...init, dispatcher });
|
|
104
|
+
if (!isTransientStatus(response.status)) {
|
|
105
|
+
return response;
|
|
106
|
+
}
|
|
107
|
+
lastError = new Error(`registry responded HTTP ${response.status}`);
|
|
108
|
+
commons_1.logger.debug(`Transient HTTP ${response.status} from '${url}' (attempt ${attempt}/${REGISTRY_PROBE_ATTEMPTS})`);
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
// fetch rejects on network-level failures (DNS, connection reset, timeout) — always transient.
|
|
112
|
+
lastError = e;
|
|
113
|
+
commons_1.logger.debug(`Network error fetching '${url}' (attempt ${attempt}/${REGISTRY_PROBE_ATTEMPTS}): ${e}`);
|
|
114
|
+
}
|
|
115
|
+
if (attempt < REGISTRY_PROBE_ATTEMPTS) {
|
|
116
|
+
await delay(REGISTRY_PROBE_BACKOFF_MS * 2 ** (attempt - 1));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
throw commons_1.Errors.External(`Could not reach the registry at '${url}' after ${REGISTRY_PROBE_ATTEMPTS} attempts: ${lastError}`);
|
|
120
|
+
}
|
|
40
121
|
// Can't use CDKTF_ as prefix because yargs .env("CDKTF") in strict mode does not allow us to
|
|
41
122
|
// Refer to: https://github.com/yargs/yargs/issues/873
|
|
42
123
|
const { GITHUB_API_TOKEN_CDKTF } = process.env;
|
|
@@ -53,14 +134,14 @@ const { GITHUB_API_TOKEN_CDKTF } = process.env;
|
|
|
53
134
|
// },
|
|
54
135
|
const npmListSchema = z
|
|
55
136
|
.object({
|
|
56
|
-
dependencies: z.record(z
|
|
137
|
+
dependencies: z.record(z.string(), z
|
|
57
138
|
.object({
|
|
58
139
|
version: z.string(),
|
|
59
140
|
})
|
|
60
|
-
.
|
|
141
|
+
.loose()),
|
|
61
142
|
})
|
|
62
|
-
.
|
|
63
|
-
.
|
|
143
|
+
.partial()
|
|
144
|
+
.loose();
|
|
64
145
|
// {
|
|
65
146
|
// "type": "tree",
|
|
66
147
|
// "data": {
|
|
@@ -84,19 +165,21 @@ const yarnListSchema = z
|
|
|
84
165
|
.object({
|
|
85
166
|
name: z.string(),
|
|
86
167
|
})
|
|
87
|
-
.
|
|
168
|
+
.partial()
|
|
169
|
+
.loose()),
|
|
88
170
|
})
|
|
89
|
-
.
|
|
171
|
+
.partial()
|
|
172
|
+
.loose(),
|
|
90
173
|
})
|
|
91
|
-
.
|
|
92
|
-
.
|
|
174
|
+
.partial()
|
|
175
|
+
.loose();
|
|
93
176
|
// [
|
|
94
177
|
// {
|
|
95
178
|
// "name": "appdirs",
|
|
96
179
|
// "version": "1.4.4"
|
|
97
180
|
// },
|
|
98
181
|
// {
|
|
99
|
-
const pipPackageSchema = z.array(z.object({ name: z.string(), version: z.string() }).
|
|
182
|
+
const pipPackageSchema = z.array(z.object({ name: z.string(), version: z.string() }).loose());
|
|
100
183
|
/**
|
|
101
184
|
* manages installing, updating, and removing dependencies
|
|
102
185
|
* in the package system used by the target language of a CDKTN
|
|
@@ -174,7 +257,7 @@ class NodePackageManager extends PackageManager {
|
|
|
174
257
|
}));
|
|
175
258
|
}
|
|
176
259
|
catch (e) {
|
|
177
|
-
throw new Error(`Could not determine installed packages using 'yarn list --json': ${e
|
|
260
|
+
throw new Error(`Could not determine installed packages using 'yarn list --json': ${e}`);
|
|
178
261
|
}
|
|
179
262
|
}
|
|
180
263
|
async listNpmPackages() {
|
|
@@ -190,7 +273,7 @@ class NodePackageManager extends PackageManager {
|
|
|
190
273
|
.map(([name, dep]) => ({ name, version: dep.version }));
|
|
191
274
|
}
|
|
192
275
|
catch (e) {
|
|
193
|
-
throw new Error(`Could not determine installed packages using 'npm list --json': ${e
|
|
276
|
+
throw new Error(`Could not determine installed packages using 'npm list --json': ${e}`);
|
|
194
277
|
}
|
|
195
278
|
}
|
|
196
279
|
async listProviderPackages() {
|
|
@@ -259,17 +342,14 @@ class PythonPackageManager extends PackageManager {
|
|
|
259
342
|
commons_1.logger.debug(`Checking if ${packageName}@${packageVersion} is available for Python`);
|
|
260
343
|
const url = `https://pypi.org/pypi/${packageName}/${packageVersion}/json`;
|
|
261
344
|
commons_1.logger.debug(`Fetching package information for ${packageName} from ${url}`);
|
|
262
|
-
const response = await (
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
if (json.info) {
|
|
266
|
-
// We found the version, so it exists
|
|
267
|
-
return true;
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
commons_1.logger.debug(`Could not get PyPI package info, got: ${JSON.stringify(json)}`);
|
|
345
|
+
const response = await fetchWithRetry(url);
|
|
346
|
+
if (response.status === HTTP_NOT_FOUND) {
|
|
347
|
+
commons_1.logger.debug(`PyPI reports ${packageName}@${packageVersion} not found`);
|
|
271
348
|
return false;
|
|
272
349
|
}
|
|
350
|
+
const json = (await response.json());
|
|
351
|
+
commons_1.logger.debug(`Got response from PyPI for ${packageName}@${packageVersion}: ${JSON.stringify(json)}`);
|
|
352
|
+
return Boolean(json.info);
|
|
273
353
|
}
|
|
274
354
|
async listPipenvPackages() {
|
|
275
355
|
try {
|
|
@@ -282,7 +362,7 @@ class PythonPackageManager extends PackageManager {
|
|
|
282
362
|
item.name.startsWith("cdktn-provider"));
|
|
283
363
|
}
|
|
284
364
|
catch (e) {
|
|
285
|
-
throw new Error(`Could not determine installed packages using 'pipenv run pip list --format=json': ${e
|
|
365
|
+
throw new Error(`Could not determine installed packages using 'pipenv run pip list --format=json': ${e}`);
|
|
286
366
|
}
|
|
287
367
|
}
|
|
288
368
|
async listPipPackages() {
|
|
@@ -296,7 +376,7 @@ class PythonPackageManager extends PackageManager {
|
|
|
296
376
|
item.name.startsWith("cdktn-provider"));
|
|
297
377
|
}
|
|
298
378
|
catch (e) {
|
|
299
|
-
throw new Error(`Could not determine installed packages using 'pip list --format=json': ${e
|
|
379
|
+
throw new Error(`Could not determine installed packages using 'pip list --format=json': ${e}`);
|
|
300
380
|
}
|
|
301
381
|
}
|
|
302
382
|
async listProviderPackages() {
|
|
@@ -320,10 +400,15 @@ class NugetPackageManager extends PackageManager {
|
|
|
320
400
|
var _a, _b, _c;
|
|
321
401
|
commons_1.logger.debug(`Checking if ${packageName}@${packageVersion} is available`);
|
|
322
402
|
const [owner, ...rest] = packageName.split(".");
|
|
403
|
+
const fixedOwner = packageName.startsWith("Io.Cdktn") ? "cdktn" : owner;
|
|
323
404
|
const id = rest[rest.length - 1];
|
|
324
|
-
const url = `https://azuresearch-usnc.nuget.org/query?q=owner:${
|
|
405
|
+
const url = `https://azuresearch-usnc.nuget.org/query?q=owner:${fixedOwner}%20id:${id}&prerelease=false&semVerLevel=2.0.0`;
|
|
325
406
|
commons_1.logger.debug(`Fetching package metadata from Nuget: '${url}'`);
|
|
326
|
-
const response = await (
|
|
407
|
+
const response = await fetchWithRetry(url);
|
|
408
|
+
if (response.status === HTTP_NOT_FOUND) {
|
|
409
|
+
commons_1.logger.debug(`NuGet reports ${packageName}@${packageVersion} not found`);
|
|
410
|
+
return false;
|
|
411
|
+
}
|
|
327
412
|
const json = (await response.json());
|
|
328
413
|
commons_1.logger.debug(`Got response from NuGet for ${packageName} : ${JSON.stringify(json)}`);
|
|
329
414
|
if (!((_a = json === null || json === void 0 ? void 0 : json.data) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
@@ -360,26 +445,44 @@ class NugetPackageManager extends PackageManager {
|
|
|
360
445
|
.map((match) => ({ name: match[1], version: match[3] }));
|
|
361
446
|
}
|
|
362
447
|
catch (e) {
|
|
363
|
-
throw new Error(`Could not determine installed packages using 'dotnet list package': ${e
|
|
448
|
+
throw new Error(`Could not determine installed packages using 'dotnet list package': ${e}`);
|
|
364
449
|
}
|
|
365
450
|
}
|
|
366
451
|
}
|
|
452
|
+
/**
|
|
453
|
+
* Shared base for the Java package managers (Maven and Gradle). Both install from Maven Central, so the check for
|
|
454
|
+
* whether a given provider version exists is common to both and lives here; the concrete subclasses differ only in how
|
|
455
|
+
* they declare and list dependencies (pom.xml vs build.gradle).
|
|
456
|
+
*/
|
|
367
457
|
class JavaPackageManager extends PackageManager {
|
|
458
|
+
/**
|
|
459
|
+
* Reports whether `packageName@packageVersion` is published on Maven Central by probing the artifact repository for
|
|
460
|
+
* the version's `.pom` directly: HTTP 200 means present, anything else means not available.
|
|
461
|
+
*
|
|
462
|
+
* @param packageName - The Java coordinates in "group.artifact" form, e.g. "com.hashicorp.cdktf-provider-random".
|
|
463
|
+
* @param packageVersion - The exact version to check for.
|
|
464
|
+
* @returns `true` if the `.pom` exists on Maven Central, `false` otherwise.
|
|
465
|
+
* @throws If `packageName` is not in the expected "group.artifact" format.
|
|
466
|
+
*/
|
|
368
467
|
async isNpmVersionAvailable(packageName, packageVersion) {
|
|
369
|
-
var _a, _b;
|
|
370
468
|
commons_1.logger.debug(`Checking if ${packageName}@${packageVersion} is available`);
|
|
371
469
|
const parts = packageName.split(".");
|
|
372
470
|
if (parts.length !== 3) {
|
|
373
471
|
throw commons_1.Errors.Internal(`Expected package name to be in format "group.artifact", e.g. "com.hashicorp.cdktf-provider-google", got: ${packageName}`);
|
|
374
472
|
}
|
|
375
|
-
const
|
|
473
|
+
const artifactId = parts.pop();
|
|
376
474
|
const groupId = parts.join(".");
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
const
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
475
|
+
// Probe the artifact CDN directly for the .pom: 200 = present, anything else = not available.
|
|
476
|
+
const groupPath = groupId.replace(/\./g, "/");
|
|
477
|
+
const url = `https://repo1.maven.org/maven2/${groupPath}/${artifactId}/${packageVersion}/${artifactId}-${packageVersion}.pom`;
|
|
478
|
+
commons_1.logger.debug(`Checking whether ${packageName}@${packageVersion} exists on Maven Central under '${url}'`);
|
|
479
|
+
const response = await fetchWithRetry(url);
|
|
480
|
+
if (response.status === HTTP_NOT_FOUND) {
|
|
481
|
+
commons_1.logger.debug(`Maven Central reports ${packageName}@${packageVersion} not found`);
|
|
482
|
+
return false;
|
|
483
|
+
}
|
|
484
|
+
commons_1.logger.debug(`Maven Central responded HTTP ${response.status} for ${packageName}@${packageVersion}`);
|
|
485
|
+
return response.ok;
|
|
383
486
|
}
|
|
384
487
|
}
|
|
385
488
|
class MavenPackageManager extends JavaPackageManager {
|
|
@@ -489,7 +592,7 @@ class GradlePackageManager extends JavaPackageManager {
|
|
|
489
592
|
dep.name.includes("cdktn-provider-"));
|
|
490
593
|
})
|
|
491
594
|
.map((dep) => ({
|
|
492
|
-
name:
|
|
595
|
+
name: `${dep.group}.${dep.name}`,
|
|
493
596
|
version: dep.version,
|
|
494
597
|
}));
|
|
495
598
|
return dependencyList;
|
|
@@ -524,7 +627,7 @@ class GoPackageManager extends PackageManager {
|
|
|
524
627
|
const packagePath = parts[3];
|
|
525
628
|
const url = `https://api.github.com/repos/${org}/${repo}/git/ref/tags/${packagePath}/v${packageVersion}`;
|
|
526
629
|
commons_1.logger.debug(`Fetching tags for ${org}/${repo} from '${url}'`);
|
|
527
|
-
const response = await (
|
|
630
|
+
const response = await fetchWithRetry(url, {
|
|
528
631
|
headers: {
|
|
529
632
|
Accept: "application/vnd.github+json",
|
|
530
633
|
"User-Agent": "OpenConstructs/cdktn-cli",
|
|
@@ -533,13 +636,13 @@ class GoPackageManager extends PackageManager {
|
|
|
533
636
|
: {}),
|
|
534
637
|
},
|
|
535
638
|
});
|
|
639
|
+
if (response.status === HTTP_NOT_FOUND) {
|
|
640
|
+
commons_1.logger.info(`Could not find the tag ${packagePath}/v${packageVersion} in the repository ${org}/${repo}`);
|
|
641
|
+
return false;
|
|
642
|
+
}
|
|
536
643
|
const json = (await response.json());
|
|
537
644
|
commons_1.logger.debug(`Got response from GitHubs repository tag endpoint for ${packageName}: ${JSON.stringify(json)}`);
|
|
538
|
-
|
|
539
|
-
return true;
|
|
540
|
-
}
|
|
541
|
-
commons_1.logger.info(`Could not find the tag ${packagePath}/v${packageVersion} in the repository ${org}/${repo}: ${JSON.stringify(json)}}`);
|
|
542
|
-
return false;
|
|
645
|
+
return Boolean(json && json.ref);
|
|
543
646
|
}
|
|
544
647
|
async listProviderPackages() {
|
|
545
648
|
try {
|
|
@@ -578,4 +681,4 @@ class GoPackageManager extends PackageManager {
|
|
|
578
681
|
}
|
|
579
682
|
}
|
|
580
683
|
}
|
|
581
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9kZXBlbmRlbmNpZXMvcGFja2FnZS1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQyw0Q0FRd0I7QUFDeEIsdUNBQXNDO0FBQ3RDLGdEQUF3QjtBQUN4QixtQ0FBaUQ7QUFDakQsNkNBQStCO0FBQy9CLCtDQUFpQztBQUNqQyw0REFBK0I7QUFDL0IsdUNBQXlCO0FBRXpCLDZGQUE2RjtBQUM3RixzREFBc0Q7QUFDdEQsTUFBTSxFQUFFLHNCQUFzQixFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztBQUUvQyxJQUFJO0FBQ0osd0JBQXdCO0FBQ3hCLDBCQUEwQjtBQUMxQixrQkFBa0I7QUFDbEIsMElBQTBJO0FBQzFJLE9BQU87QUFDUCxzQkFBc0I7QUFDdEIsa0NBQWtDO0FBQ2xDLDZCQUE2QjtBQUM3QixxR0FBcUc7QUFDckcsU0FBUztBQUNULE1BQU0sYUFBYSxHQUFHLENBQUM7S0FDcEIsTUFBTSxDQUFDO0lBQ04sWUFBWSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQ3BCLENBQUM7U0FDRSxNQUFNLENBQUM7UUFDTixPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtLQUNwQixDQUFDO1NBQ0QsU0FBUyxFQUFFLENBQ2Y7Q0FDRixDQUFDO0tBQ0QsV0FBVyxFQUFFO0tBQ2IsU0FBUyxFQUFFLENBQUM7QUFFZixJQUFJO0FBQ0osb0JBQW9CO0FBQ3BCLGNBQWM7QUFDZCxzQkFBc0I7QUFDdEIsaUJBQWlCO0FBQ2pCLFVBQVU7QUFDVixtREFBbUQ7QUFDbkQsMEJBQTBCO0FBQzFCLHdCQUF3QjtBQUN4QiwyQkFBMkI7QUFDM0IscUJBQXFCO0FBQ3JCLFVBQVU7QUFDVixRQUFRO0FBQ1IsTUFBTTtBQUNOLElBQUk7QUFD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QUV2RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV2QyxJQUFJLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNuQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7Z0JBQ25DLENBQUM7Z0JBRUQsb0JBQW9CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUUvQixPQUFPO29CQUNMLElBQUk7b0JBQ0osT0FBTztpQkFDUixDQUFDO1lBQ0osQ0FBQyxDQUFDO2lCQUNELE1BQU0sQ0FDTCxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQ2hFLENBQUM7UUFDTixDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUNiLDhEQUE4RCxDQUFDLENBQUMsT0FBTyxFQUFFLENBQzFFLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7XG4gIExhbmd1YWdlLFxuICBleGVjLFxuICBFcnJvcnMsXG4gIGxvZ2dlcixcbiAgaXNHcmFkbGVQcm9qZWN0LFxuICBnZXRHcmFkbGVEZXBlbmRlbmNpZXMsXG4gIGdldERlcGVuZGVuY3lJbmZvcm1hdGlvbkZyb21MaW5lLFxufSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB4bWwyanMsIGpzMnhtbCwgRWxlbWVudCB9IGZyb20gXCJ4bWwtanNcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gXCJzZW12ZXJcIjtcbmltcG9ydCBmZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiO1xuaW1wb3J0ICogYXMgeiBmcm9tIFwiem9kXCI7XG5cbi8vIENhbid0IHVzZSBDREtURl8gYXMgcHJlZml4IGJlY2F1c2UgeWFyZ3MgLmVudihcIkNES1RGXCIpIGluIHN0cmljdCBtb2RlIGRvZXMgbm90IGFsbG93IHVzIHRvXG4vLyBSZWZlciB0bzogaHR0cHM6Ly9naXRodWIuY29tL3lhcmdzL3lhcmdzL2lzc3Vlcy84NzNcbmNvbnN0IHsgR0lUSFVCX0FQSV9UT0tFTl9DREtURiB9ID0gcHJvY2Vzcy5lbnY7XG5cbi8vIHtcbi8vICAgXCJ2ZXJzaW9uXCI6IFwiMS4wLjBcIixcbi8vICAgXCJuYW1lXCI6IFwidGVzdFVTSGFzRlwiLFxuLy8gICBcInByb2JsZW1zXCI6IFtcbi8vICAgICBcImV4dHJhbmVvdXM6IGFyY2hpdmVyLXV0aWxzQDIuMS4wIC9wcml2YXRlL3Zhci9mb2xkZXJzL3pfL3YwM2wzM2Q1NWZiNTducnIzYjFxMDNjaDAwMDBncS9UL3Rlc3RVU0hhc0Yvbm9kZV9tb2R1bGVzL2FyY2hpdmVyLXV0aWxzXCIsXG4vLyAgIF0sXG4vLyAgIFwiZGVwZW5kZW5jaWVzXCI6IHtcbi8vICAgICBcIkBjZGt0Zi9wcm92aWRlci1yYW5kb21cIjoge1xuLy8gICAgICAgXCJ2ZXJzaW9uXCI6IFwiMy4wLjExXCIsXG4vLyAgICAgICBcInJlc29sdmVkXCI6IFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGNka3RmL3Byb3ZpZGVyLXJhbmRvbS8tL3Byb3ZpZGVyLXJhbmRvbS0zLjAuMTEudGd6XCJcbi8vICAgICB9LFxuY29uc3QgbnBtTGlzdFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZGVwZW5kZW5jaWVzOiB6LnJlY29yZChcbiAgICAgIHpcbiAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgdmVyc2lvbjogei5zdHJpbmcoKSxcbiAgICAgICAgfSlcbiAgICAgICAgLm5vbnN0cmljdCgpLFxuICAgICksXG4gIH0pXG4gIC5kZWVwUGFydGlhbCgpXG4gIC5ub25zdHJpY3QoKTtcblxuLy8ge1xuLy8gICBcInR5cGVcIjogXCJ0cmVlXCIsXG4vLyAgIFwiZGF0YVwiOiB7XG4vLyAgICAgXCJ0eXBlXCI6IFwibGlzdFwiLFxuLy8gICAgIFwidHJlZXNcIjogW1xuLy8gICAgICAge1xuLy8gICAgICAgICBcIm5hbWVcIjogXCJAY2RrdGYvcHJvdmlkZXItcmFuZG9tQDMuMC4xMVwiLFxuLy8gICAgICAgICBcImNoaWxkcmVuXCI6IFtdLFxuLy8gICAgICAgICBcImhpbnRcIjogbnVsbCxcbi8vICAgICAgICAgXCJjb2xvclwiOiBcImJvbGRcIixcbi8vICAgICAgICAgXCJkZXB0aFwiOiAwXG4vLyAgICAgICB9XG4vLyAgICAgXVxuLy8gICB9XG4vLyB9XG5jb25zdCB5YXJuTGlzdFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZGF0YTogelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgIHRyZWVzOiB6LmFycmF5KFxuICAgICAgICAgIHpcbiAgICAgICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgICAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5ub25zdHJpY3QoKSxcbiAgICAgICAgKSxcbiAgICAgIH0pXG4gICAgICAubm9uc3RyaWN0KCksXG4gIH0pXG4gIC5kZWVwUGFydGlhbCgpXG4gIC5ub25zdHJpY3QoKTtcblxuLy8gW1xuLy8gICB7XG4vLyAgICAgXCJuYW1lXCI6IFwiYXBwZGlyc1wiLFxuLy8gICAgIFwidmVyc2lvblwiOiBcIjEuNC40XCJcbi8vICAgfSxcbi8vICAge1xuY29uc3QgcGlwUGFja2FnZVNjaGVtYSA9IHouYXJyYXkoXG4gIHoub2JqZWN0KHsgbmFtZTogei5zdHJpbmcoKSwgdmVyc2lvbjogei5zdHJpbmcoKSB9KS5ub25zdHJpY3QoKSxcbik7XG5cbi8qKlxuICogbWFuYWdlcyBpbnN0YWxsaW5nLCB1cGRhdGluZywgYW5kIHJlbW92aW5nIGRlcGVuZGVuY2llc1xuICogaW4gdGhlIHBhY2thZ2Ugc3lzdGVtIHVzZWQgYnkgdGhlIHRhcmdldCBsYW5ndWFnZSBvZiBhIENES1ROXG4gKiBwcm9qZWN0XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQYWNrYWdlTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSB3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcpIHt9XG5cbiAgcHVibGljIHN0YXRpYyBmb3JMYW5ndWFnZShcbiAgICBsYW5ndWFnZTogTGFuZ3VhZ2UsXG4gICAgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nLFxuICApOiBQYWNrYWdlTWFuYWdlciB7XG4gICAgc3dpdGNoIChsYW5ndWFnZSkge1xuICAgICAgY2FzZSBMYW5ndWFnZS5HTzpcbiAgICAgICAgcmV0dXJuIG5ldyBHb1BhY2thZ2VNYW5hZ2VyKHdvcmtpbmdEaXJlY3RvcnkpO1xuICAgICAgY2FzZSBMYW5ndWFnZS5UWVBFU0NSSVBUOlxuICAgICAgICByZXR1cm4gbmV3IE5vZGVQYWNrYWdlTWFuYWdlcih3b3JraW5nRGlyZWN0b3J5KTtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuUFlUSE9OOlxuICAgICAgICByZXR1cm4gbmV3IFB5dGhvblBhY2thZ2VNYW5hZ2VyKHdvcmtpbmdEaXJlY3RvcnkpO1xuICAgICAgY2FzZSBMYW5ndWFnZS5DU0hBUlA6XG4gICAgICAgIHJldHVybiBuZXcgTnVnZXRQYWNrYWdlTWFuYWdlcih3b3JraW5nRGlyZWN0b3J5KTtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuSkFWQTpcbiAgICAgICAgaWYgKEdyYWRsZVBhY2thZ2VNYW5hZ2VyLmlzR3JhZGxlUHJvamVjdCh3b3JraW5nRGlyZWN0b3J5KSkge1xuICAgICAgICAgIHJldHVybiBuZXcgR3JhZGxlUGFja2FnZU1hbmFnZXIod29ya2luZ0RpcmVjdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNYXZlblBhY2thZ2VNYW5hZ2VyKHdvcmtpbmdEaXJlY3RvcnkpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGxhbmd1YWdlOiAke2xhbmd1YWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCBhZGRQYWNrYWdlKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcGFja2FnZVZlcnNpb24/OiBzdHJpbmcsXG4gICAgc2lsZW50PzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPjtcbiAgLy8gYWRkIGNoZWNrIGlmIHBhY2thZ2UgZXhpc3RzIGFscmVhZHkuIG1pZ2h0IHF1ZXJ5IHZlcnNpb24gaW4gdGhlIGZ1dHVyZSBhbmQgb2ZmZXIgdG8gdXBncmFkZT9cblxuICBwdWJsaWMgYWJzdHJhY3QgaXNOcG1WZXJzaW9uQXZhaWxhYmxlKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcGFja2FnZVZlcnNpb246IHN0cmluZyxcbiAgKTogUHJvbWlzZTxib29sZWFuPjtcblxuICBwdWJsaWMgYWJzdHJhY3QgbGlzdFByb3ZpZGVyUGFja2FnZXMoKTogUHJvbWlzZTxcbiAgICB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXVxuICA+O1xufVxuXG5jbGFzcyBOb2RlUGFja2FnZU1hbmFnZXIgZXh0ZW5kcyBQYWNrYWdlTWFuYWdlciB7XG4gIHByaXZhdGUgaGFzWWFybkxvY2tmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBleGlzdHNTeW5jKHBhdGguam9pbih0aGlzLndvcmtpbmdEaXJlY3RvcnksIFwieWFybi5sb2NrXCIpKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGRQYWNrYWdlKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcGFja2FnZVZlcnNpb24/OiBzdHJpbmcsXG4gICAgc2lsZW50PzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coYEFkZGluZyBwYWNrYWdlICR7cGFja2FnZU5hbWV9IEAgJHtwYWNrYWdlVmVyc2lvbn1gKTtcblxuICAgIC8vIHByb2JlIGZvciBwYWNrYWdlLWxvY2suanNvbiBvciB5YXJuLmxvY2tcbiAgICBsZXQgY29tbWFuZCA9IFwibnBtXCI7XG4gICAgbGV0IGFyZ3MgPSBbXCJpbnN0YWxsXCJdO1xuXG4gICAgaWYgKHRoaXMuaGFzWWFybkxvY2tmaWxlKCkpIHtcbiAgICAgIGNvbW1hbmQgPSBcInlhcm5cIjtcbiAgICAgIGFyZ3MgPSBbXCJhZGRcIl07XG4gICAgfVxuICAgIGFyZ3MucHVzaChcbiAgICAgIHBhY2thZ2VWZXJzaW9uID8gcGFja2FnZU5hbWUgKyBcIkBcIiArIHBhY2thZ2VWZXJzaW9uIDogcGFja2FnZU5hbWUsXG4gICAgKTtcblxuICAgIGlmIChzaWxlbnQpIHtcbiAgICAgIGFyZ3MucHVzaChcIi0tc2lsZW50XCIpO1xuICAgICAgYXJncy5wdXNoKFwiLS1uby1wcm9ncmVzc1wiKTtcbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIGV4YWN0IHZlcnNpb25cbiAgICAvLyBZYXJuOiBodHRwczovL2NsYXNzaWMueWFybnBrZy5jb20vbGFuZy9lbi9kb2NzL2NsaS9hZGQvI3RvYy15YXJuLWFkZC1leGFjdC1lXG4gICAgLy8gTnBtOiBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92OC9jb21tYW5kcy9ucG0taW5zdGFsbCNzYXZlLWV4YWN0XG4gICAgYXJncy5wdXNoKFwiLUVcIik7XG5cbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBJbnN0YWxsaW5nIHBhY2thZ2UgJHtwYWNrYWdlTmFtZX0gQCAke3BhY2thZ2VWZXJzaW9ufSB1c2luZyAke2NvbW1hbmR9LmAsXG4gICAgKTtcblxuICAgIGF3YWl0IGV4ZWMoY29tbWFuZCwgYXJncywgeyBjd2Q6IHRoaXMud29ya2luZ0RpcmVjdG9yeSB9KTtcblxuICAgIGxvZ2dlci5pbmZvKFwiUGFja2FnZSBpbnN0YWxsZWQuXCIpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGlzTnBtVmVyc2lvbkF2YWlsYWJsZShcbiAgICBfcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgICBfcGFja2FnZVZlcnNpb246IHN0cmluZyxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gV2UgZ2V0IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSB2ZXJzaW9ucyBmcm9tIG5wbSwgbm8gbmVlZCB0byBjaGVjayBoZXJlXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxpc3RZYXJuUGFja2FnZXMoKTogUHJvbWlzZTxcbiAgICB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXVxuICA+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgZXhlYyhcInlhcm5cIiwgW1wibGlzdFwiLCBcIi0tanNvblwiXSwge1xuICAgICAgICBjd2Q6IHRoaXMud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIuZGVidWcoYExpc3RpbmcgeWFybiBwYWNrYWdlcyB1c2luZyBcInlhcm4gbGlzdCAtLWpzb25cIjogJHtzdGRvdXR9YCk7XG5cbiAgICAgIGNvbnN0IGpzb24gPSB5YXJuTGlzdFNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHN0ZG91dCkpO1xuXG4gICAgICByZXR1cm4gKGpzb24/LmRhdGE/LnRyZWVzIHx8IFtdKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChkZXA6IGFueSkgPT5cbiAgICAgICAgICAgIGRlcC5uYW1lLnN0YXJ0c1dpdGgoXCJAY2RrdGYvcHJvdmlkZXItXCIpIHx8XG4gICAgICAgICAgICBkZXAubmFtZS5zdGFydHNXaXRoKFwiQGNka3RuL3Byb3ZpZGVyLVwiKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChkZXA6IGFueSkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBgQCR7ZGVwLm5hbWUuc3BsaXQoXCJAXCIpWzFdfWAsXG4gICAgICAgICAgdmVyc2lvbjogZGVwLm5hbWUuc3BsaXQoXCJAXCIpWzJdLFxuICAgICAgICB9KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGluc3RhbGxlZCBwYWNrYWdlcyB1c2luZyAneWFybiBsaXN0IC0tanNvbic6ICR7ZS5tZXNzYWdlfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbGlzdE5wbVBhY2thZ2VzKCk6IFByb21pc2U8XG4gICAgeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9W11cbiAgPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IGV4ZWMoXCJucG1cIiwgW1wibGlzdFwiLCBcIi0tanNvblwiXSwge1xuICAgICAgICBjd2Q6IHRoaXMud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIuZGVidWcoYExpc3RpbmcgbnBtIHBhY2thZ2VzIHVzaW5nIFwibnBtIGxpc3QgLS1qc29uXCI6ICR7c3Rkb3V0fWApO1xuICAgICAgY29uc3QganNvbiA9IG5wbUxpc3RTY2hlbWEucGFyc2UoSlNPTi5wYXJzZShzdGRvdXQpKTtcblxuICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGpzb24/LmRlcGVuZGVuY2llcyB8fCB7fSlcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoW2RlcE5hbWVdKSA9PlxuICAgICAgICAgICAgZGVwTmFtZS5zdGFydHNXaXRoKFwiQGNka3RmL3Byb3ZpZGVyLVwiKSB8fFxuICAgICAgICAgICAgZGVwTmFtZS5zdGFydHNXaXRoKFwiQGNka3RuL3Byb3ZpZGVyLVwiKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChbbmFtZSwgZGVwXSkgPT4gKHsgbmFtZSwgdmVyc2lvbjogZGVwLnZlcnNpb24gfSkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGRldGVybWluZSBpbnN0YWxsZWQgcGFja2FnZXMgdXNpbmcgJ25wbSBsaXN0IC0tanNvbic6ICR7ZS5tZXNzYWdlfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsaXN0UHJvdmlkZXJQYWNrYWdlcygpOiBQcm9taXNlPFxuICAgIHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfVtdXG4gID4ge1xuICAgIHJldHVybiB0aGlzLmhhc1lhcm5Mb2NrZmlsZSgpXG4gICAgICA/IHRoaXMubGlzdFlhcm5QYWNrYWdlcygpXG4gICAgICA6IHRoaXMubGlzdE5wbVBhY2thZ2VzKCk7XG4gIH1cbn1cblxuY2xhc3MgUHl0aG9uUGFja2FnZU1hbmFnZXIgZXh0ZW5kcyBQYWNrYWdlTWFuYWdlciB7XG4gIHByaXZhdGUgZ2V0IGFwcENvbW1hbmQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgICBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgcGF0aC5yZXNvbHZlKHRoaXMud29ya2luZ0RpcmVjdG9yeSwgXCJjZGt0Zi5qc29uXCIpLFxuICAgICAgICAgIFwidXRmOFwiLFxuICAgICAgICApLFxuICAgICAgKVtcImFwcFwiXTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IEVycm9ycy5Vc2FnZShcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIGZpbmQgYW5kIHBhcnNlIGNka3RmLmpzb24gaW4gJHt0aGlzLndvcmtpbmdEaXJlY3Rvcnl9YCxcbiAgICAgICAgZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZFBhY2thZ2UoXG4gICAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgICBwYWNrYWdlVmVyc2lvbj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXNlUGlwZW52ID0gdGhpcy5hcHBDb21tYW5kLmluY2x1ZGVzKFwicGlwZW52XCIpO1xuXG4gICAgaWYgKHVzZVBpcGVudikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBJbnN0YWxsaW5nIHBhY2thZ2UgJHtwYWNrYWdlTmFtZX0gQCAke3BhY2thZ2VWZXJzaW9ufSB1c2luZyBwaXBlbnYuYCxcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IGV4ZWMoXCJwaXBlbnZcIiwgW1wiaW5zdGFsbFwiLCBgJHtwYWNrYWdlTmFtZX1+PSR7cGFja2FnZVZlcnNpb259YF0sIHtcbiAgICAgICAgY3dkOiB0aGlzLndvcmtpbmdEaXJlY3RvcnksXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICAgIFBJUEVOVl9RVUlFVDogXCIxXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHN0ZGlvOiBbXCJpbmhlcml0XCIsIDEsIDFdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKFwiUGFja2FnZSBpbnN0YWxsZWQuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYEluc3RhbGxpbmcgcGFja2FnZSAke3BhY2thZ2VOYW1lfSBAICR7cGFja2FnZVZlcnNpb259IHVzaW5nIHBpcC5gLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVxdWlyZW1lbnRzRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIHRoaXMud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgICAgXCJyZXF1aXJlbWVudHMudHh0XCIsXG4gICAgICApO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlcXVpcmVtZW50c0ZpbGVQYXRoKSkge1xuICAgICAgICB0aHJvdyBFcnJvcnMuVXNhZ2UoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIHJlcXVpcmVtZW50cy50eHQgaW4gJHt0aGlzLndvcmtpbmdEaXJlY3Rvcnl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWlyZW1lbnRzID0gYXdhaXQgZnMucmVhZEZpbGUocmVxdWlyZW1lbnRzRmlsZVBhdGgsIFwidXRmOFwiKTtcbiAgICAgIGNvbnN0IHJlcXVpcmVtZW50TGluZSA9IHJlcXVpcmVtZW50c1xuICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgLmZpbmQoKGxpbmUpID0+IGxpbmUuaW5jbHVkZXMocGFja2FnZU5hbWUpKTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgUmVhZCByZXF1aXJlbWVudHMudHh0IGZpbGUgYW5kIGZvdW5kIGxpbmUgaW5jbHVkaW5nICR7cGFja2FnZU5hbWV9OiAke3JlcXVpcmVtZW50TGluZX1gLFxuICAgICAgKTtcblxuICAgICAgaWYgKHJlcXVpcmVtZW50TGluZSkge1xuICAgICAgICBpZiAocGFja2FnZVZlcnNpb24gPyByZXF1aXJlbWVudExpbmUuaW5jbHVkZXMocGFja2FnZVZlcnNpb24pIDogdHJ1ZSkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFBhY2thZ2UgJHtwYWNrYWdlTmFtZX0gYWxyZWFkeSBpbnN0YWxsZWQuIFNraXBwaW5nIGluc3RhbGxhdGlvbi5gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBGb3VuZCB0aGUgcGFja2FnZSBidXQgd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uLCBjb250aW51aW5nYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld1JlcXVpcmVtZW50cyA9XG4gICAgICAgIHJlcXVpcmVtZW50c1xuICAgICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLnN0YXJ0c1dpdGgocGFja2FnZU5hbWUpKVxuICAgICAgICAgIC5qb2luKFwiXFxuXCIpICtcbiAgICAgICAgYFxcbiR7cGFja2FnZU5hbWV9JHtwYWNrYWdlVmVyc2lvbiA/IGB+PSR7cGFja2FnZVZlcnNpb259YCA6IFwiXCJ9YDtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShyZXF1aXJlbWVudHNGaWxlUGF0aCwgbmV3UmVxdWlyZW1lbnRzLCBcInV0ZjhcIik7XG5cbiAgICAgIGF3YWl0IGV4ZWMoXCJwaXBcIiwgW1wiaW5zdGFsbFwiLCBcIi1yXCIsIFwicmVxdWlyZW1lbnRzLnR4dFwiXSwge1xuICAgICAgICBjd2Q6IHRoaXMud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgICAgc3RkaW86IFtcImluaGVyaXRcIiwgMSwgMV0sXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coXCJQYWNrYWdlIGluc3RhbGxlZC5cIik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGlzTnBtVmVyc2lvbkF2YWlsYWJsZShcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICAgIHBhY2thZ2VWZXJzaW9uOiBzdHJpbmcsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBDaGVja2luZyBpZiAke3BhY2thZ2VOYW1lfUAke3BhY2thZ2VWZXJzaW9ufSBpcyBhdmFpbGFibGUgZm9yIFB5dGhvbmAsXG4gICAgKTtcbiAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9weXBpLm9yZy9weXBpLyR7cGFja2FnZU5hbWV9LyR7cGFja2FnZVZlcnNpb259L2pzb25gO1xuICAgIGxvZ2dlci5kZWJ1ZyhgRmV0Y2hpbmcgcGFja2FnZSBpbmZvcm1hdGlvbiBmb3IgJHtwYWNrYWdlTmFtZX0gZnJvbSAke3VybH1gKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICBjb25zdCBqc29uID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgYW55O1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBHb3QgcmVzcG9uc2UgZnJvbSBQeVBJIGZvciAke3BhY2thZ2VOYW1lfUAke3BhY2thZ2VWZXJzaW9ufTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAganNvbixcbiAgICAgICl9YCxcbiAgICApO1xuXG4gICAgaWYgKGpzb24uaW5mbykge1xuICAgICAgLy8gV2UgZm91bmQgdGhlIHZlcnNpb24sIHNvIGl0IGV4aXN0c1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYENvdWxkIG5vdCBnZXQgUHlQSSBwYWNrYWdlIGluZm8sIGdvdDogJHtKU09OLnN0cmluZ2lmeShqc29uKX1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbGlzdFBpcGVudlBhY2thZ2VzKCk6IFByb21pc2U8XG4gICAgeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9W11cbiAgPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IGV4ZWMoXG4gICAgICAgIFwicGlwZW52XCIsXG4gICAgICAgIFtcInJ1blwiLCBcInBpcFwiLCBcImxpc3RcIiwgXCItLWZvcm1hdD1qc29uXCJdLFxuICAgICAgICB7XG4gICAgICAgICAgY3dkOiB0aGlzLndvcmtpbmdEaXJlY3RvcnksXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgTGlzdGluZyBwaXBlbnYgcGFja2FnZXMgdXNpbmcgXCJwaXBlbnYgcnVuIHBpcCBsaXN0IC0tZm9ybWF0PWpzb25cIjogJHtzdGRvdXR9YCxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGxpc3QgPSBwaXBQYWNrYWdlU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uoc3Rkb3V0KSk7XG4gICAgICByZXR1cm4gbGlzdC5maWx0ZXIoXG4gICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgIGl0ZW0ubmFtZS5zdGFydHNXaXRoKFwiY2RrdGYtY2RrdGYtcHJvdmlkZXJcIikgfHxcbiAgICAgICAgICBpdGVtLm5hbWUuc3RhcnRzV2l0aChcImNka3RuLXByb3ZpZGVyXCIpLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBkZXRlcm1pbmUgaW5zdGFsbGVkIHBhY2thZ2VzIHVzaW5nICdwaXBlbnYgcnVuIHBpcCBsaXN0IC0tZm9ybWF0PWpzb24nOiAke2UubWVzc2FnZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbGlzdFBpcFBhY2thZ2VzKCk6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9W10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgZXhlYyhcInBpcFwiLCBbXCJsaXN0XCIsIFwiLS1mb3JtYXQ9anNvblwiXSwge1xuICAgICAgICBjd2Q6IHRoaXMud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgTGlzdGluZyBwaXAgcGFja2FnZXMgdXNpbmcgXCJwaXAgbGlzdCAtLWZvcm1hdD1qc29uXCI6ICR7c3Rkb3V0fWAsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBsaXN0ID0gcGlwUGFja2FnZVNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHN0ZG91dCkpO1xuICAgICAgcmV0dXJuIGxpc3QuZmlsdGVyKFxuICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICBpdGVtLm5hbWUuc3RhcnRzV2l0aChcImNka3RmLWNka3RmLXByb3ZpZGVyXCIpIHx8XG4gICAgICAgICAgaXRlbS5uYW1lLnN0YXJ0c1dpdGgoXCJjZGt0bi1wcm92aWRlclwiKSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGluc3RhbGxlZCBwYWNrYWdlcyB1c2luZyAncGlwIGxpc3QgLS1mb3JtYXQ9anNvbic6ICR7ZS5tZXNzYWdlfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsaXN0UHJvdmlkZXJQYWNrYWdlcygpOiBQcm9taXNlPFxuICAgIHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfVtdXG4gID4ge1xuICAgIHJldHVybiB0aGlzLmFwcENvbW1hbmQuaW5jbHVkZXMoXCJwaXBlbnZcIilcbiAgICAgID8gdGhpcy5saXN0UGlwZW52UGFja2FnZXMoKVxuICAgICAgOiB0aGlzLmxpc3RQaXBQYWNrYWdlcygpO1xuICB9XG59XG5cbmNsYXNzIE51Z2V0UGFja2FnZU1hbmFnZXIgZXh0ZW5kcyBQYWNrYWdlTWFuYWdlciB7XG4gIHB1YmxpYyBhc3luYyBhZGRQYWNrYWdlKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcGFja2FnZVZlcnNpb24/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBcImRvdG5ldFwiO1xuICAgIGNvbnN0IGFyZ3MgPSBbXCJhZGRcIiwgXCJwYWNrYWdlXCIsIHBhY2thZ2VOYW1lXTtcbiAgICBpZiAocGFja2FnZVZlcnNpb24pIHtcbiAgICAgIGFyZ3MucHVzaChcIi0tdmVyc2lvblwiLCBwYWNrYWdlVmVyc2lvbik7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYEluc3RhbGxpbmcgcGFja2FnZSAke3BhY2thZ2VOYW1lfSBAICR7cGFja2FnZVZlcnNpb259IHVzaW5nIFwiJHtjb21tYW5kfSAke2FyZ3Muam9pbihcbiAgICAgICAgXCIgXCIsXG4gICAgICApfVwiLmAsXG4gICAgKTtcblxuICAgIGF3YWl0IGV4ZWMoY29tbWFuZCwgYXJncywgeyBjd2Q6IHRoaXMud29ya2luZ0RpcmVjdG9yeSB9KTtcblxuICAgIGNvbnNvbGUubG9nKFwiUGFja2FnZSBpbnN0YWxsZWQuXCIpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGlzTnBtVmVyc2lvbkF2YWlsYWJsZShcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICAgIHBhY2thZ2VWZXJzaW9uOiBzdHJpbmcsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ2hlY2tpbmcgaWYgJHtwYWNrYWdlTmFtZX1AJHtwYWNrYWdlVmVyc2lvbn0gaXMgYXZhaWxhYmxlYCk7XG5cbiAgICBjb25zdCBbb3duZXIsIC4uLnJlc3RdID0gcGFja2FnZU5hbWUuc3BsaXQoXCIuXCIpO1xuICAgIGNvbnN0IGlkID0gcmVzdFtyZXN0Lmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHVybCA9IGBodHRwczovL2F6dXJlc2VhcmNoLXVzbmMubnVnZXQub3JnL3F1ZXJ5P3E9b3duZXI6JHtvd25lcn0lMjBpZDoke2lkfSZwcmVyZWxlYXNlPWZhbHNlJnNlbVZlckxldmVsPTIuMC4wYDtcbiAgICBsb2dnZXIuZGVidWcoYEZldGNoaW5nIHBhY2thZ2UgbWV0YWRhdGEgZnJvbSBOdWdldDogJyR7dXJsfSdgKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICBjb25zdCBqc29uID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMge1xuICAgICAgZGF0YTogeyBpZDogc3RyaW5nOyB2ZXJzaW9uczogeyB2ZXJzaW9uOiBzdHJpbmcgfVtdIH1bXTtcbiAgICB9O1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBHb3QgcmVzcG9uc2UgZnJvbSBOdUdldCBmb3IgJHtwYWNrYWdlTmFtZX0gOiAke0pTT04uc3RyaW5naWZ5KGpzb24pfWAsXG4gICAgKTtcblxuICAgIGlmICghanNvbj8uZGF0YT8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIE5vIHBhY2thZ2UgZm91bmRcbiAgICB9XG5cbiAgICBjb25zdCBwYWNrYWdlVmVyc2lvbnMgPVxuICAgICAganNvbi5kYXRhLmZpbmQoKHApID0+IHAuaWQgPT09IHBhY2thZ2VOYW1lKT8udmVyc2lvbnMgPz8gW107XG5cbiAgICBpZiAoIXBhY2thZ2VWZXJzaW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gcGFja2FnZSByZWxlYXNlIG1hdGNoaW5nIHRoZSBpZCBmb3VuZFxuICAgIH1cblxuICAgIHJldHVybiBwYWNrYWdlVmVyc2lvbnMuc29tZSgodikgPT4gdi52ZXJzaW9uID09PSBwYWNrYWdlVmVyc2lvbik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbGlzdFByb3ZpZGVyUGFja2FnZXMoKTogUHJvbWlzZTxcbiAgICB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXVxuICA+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgZXhlYyhcImRvdG5ldFwiLCBbXCJsaXN0XCIsIFwicGFja2FnZVwiXSwge1xuICAgICAgICBjd2Q6IHRoaXMud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgTGlzdGluZyBudWdldCBwYWNrYWdlcyB1c2luZyBcImRvdG5ldCBsaXN0IHBhY2thZ2VcIjogJHtzdGRvdXR9YCxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJlZ2V4ID1cbiAgICAgICAgL15cXHMqPlxccygoPzpIYXNoaUNvcnBcXC5DZGt0ZnxJb1xcLkNka3RuKVxcLlByb3ZpZGVyc1xcLltcXHcuXSspXFxzKygoPzpcXGQrXFwuKXsyfVxcZCsoPzotXFxTKyk/KVxccysoKD86XFxkK1xcLil7Mn1cXGQrKD86LVxcUyspPylcXHMqJC87XG5cbiAgICAgIHJldHVybiBzdGRvdXRcbiAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgIC5tYXAoKGxpbmU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIC8vIEV4YW1wbGUgb3V0cHV0OlxuICAgICAgICAgIC8vIFByb2plY3QgJ015VGVycmFmb3JtU3RhY2snIGhhcyB0aGUgZm9sbG93aW5nIHBhY2thZ2UgcmVmZXJlbmNlc1xuICAgICAgICAgIC8vICBbbmV0Ni4wXTpcbiAgICAgICAgICAvLyAgVG9wLWxldmVsIFBhY2thZ2UgICAgICBSZXF1ZXN0ZWQgICBSZXNvbHZlZFxuICAgICAgICAgIC8vICA+IEhhc2hpQ29ycC5DZGt0ZiAgICAgIDAuMC4wICAgICAgIDAuMC4wXG4gICAgICAgICAgLy8gbWF0Y2hbMF0gPSBmdWxsIG1hdGNoXG4gICAgICAgICAgLy8gbWF0Y2hbMV0gPSBwYWNrYWdlIG5hbWVcbiAgICAgICAgICAvLyBtYXRjaFsyXSA9IHJlcXVlc3RlZCB2ZXJzaW9uXG4gICAgICAgICAgLy8gbWF0Y2hbM10gPSByZXNvbHZlZCB2ZXJzaW9uXG4gICAgICAgICAgcmV0dXJuIHJlZ2V4LmV4ZWMobGluZSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhIW1hdGNoKVxuICAgICAgICAubWFwKChtYXRjaCkgPT4gKHsgbmFtZTogbWF0Y2ghWzFdLCB2ZXJzaW9uOiBtYXRjaCFbM10gfSkpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGRldGVybWluZSBpbnN0YWxsZWQgcGFja2FnZXMgdXNpbmcgJ2RvdG5ldCBsaXN0IHBhY2thZ2UnOiAke2UubWVzc2FnZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuYWJzdHJhY3QgY2xhc3MgSmF2YVBhY2thZ2VNYW5hZ2VyIGV4dGVuZHMgUGFja2FnZU1hbmFnZXIge1xuICBwdWJsaWMgYXN5bmMgaXNOcG1WZXJzaW9uQXZhaWxhYmxlKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcGFja2FnZVZlcnNpb246IHN0cmluZyxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbG9nZ2VyLmRlYnVnKGBDaGVja2luZyBpZiAke3BhY2thZ2VOYW1lfUAke3BhY2thZ2VWZXJzaW9ufSBpcyBhdmFpbGFibGVgKTtcblxuICAgIGNvbnN0IHBhcnRzID0gcGFja2FnZU5hbWUuc3BsaXQoXCIuXCIpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IEVycm9ycy5JbnRlcm5hbChcbiAgICAgICAgYEV4cGVjdGVkIHBhY2thZ2UgbmFtZSB0byBiZSBpbiBmb3JtYXQgXCJncm91cC5hcnRpZmFjdFwiLCBlLmcuIFwiY29tLmhhc2hpY29ycC5jZGt0Zi1wcm92aWRlci1nb29nbGVcIiwgZ290OiAke3BhY2thZ2VOYW1lfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhY2thZ2VJZGVudGlmaWVyID0gcGFydHMucG9wKCk7XG4gICAgY29uc3QgZ3JvdXBJZCA9IHBhcnRzLmpvaW4oXCIuXCIpO1xuXG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vc2VhcmNoLm1hdmVuLm9yZy9zb2xyc2VhcmNoL3NlbGVjdD9xPWc6JHtncm91cElkfStBTkQrYToke3BhY2thZ2VJZGVudGlmaWVyfStBTkQrdjoke3BhY2thZ2VWZXJzaW9ufSZyb3dzPTUmd3Q9anNvbmA7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYFRyeWluZyB0byBmaW5kIHBhY2thZ2UgdmVyc2lvbiBieSBxdWVyeWluZyBNYXZlbiBDZW50cmFsIHVuZGVyICcke3VybH0nYCxcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcblxuICAgIGNvbnN0IGpzb24gPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBhbnk7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYEdvdCByZXNwb25zZSBmcm9tIHRoZSBNYXZlbiBwYWNrYWdlIHNlYXJjaCBmb3IgJHtwYWNrYWdlTmFtZX06ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGpzb24sXG4gICAgICApfWAsXG4gICAgKTtcblxuICAgIHJldHVybiAoanNvbj8ucmVzcG9uc2U/Lm51bUZvdW5kID8/IDApID4gMDtcbiAgfVxufVxuXG5jbGFzcyBNYXZlblBhY2thZ2VNYW5hZ2VyIGV4dGVuZHMgSmF2YVBhY2thZ2VNYW5hZ2VyIHtcbiAgcHVibGljIGFzeW5jIGFkZFBhY2thZ2UoXG4gICAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgICBwYWNrYWdlVmVyc2lvbiA9IFwiTEFURVNUXCIsIC8vIHRoZSBsYXRlc3Qgb3B0aW9uIGlzIGRlcHJlY2F0ZWQgaW4gbWF2ZW4gMy41XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKGBBZGRpbmcgJHtwYWNrYWdlTmFtZX0gQCAke3BhY2thZ2VWZXJzaW9ufSB0byBwb20ueG1sYCk7XG4gICAgLy8gQXNzZXJ0IHBvbS54bWwgZXhpc3RzXG4gICAgY29uc3QgcG9tUGF0aCA9IHBhdGguam9pbih0aGlzLndvcmtpbmdEaXJlY3RvcnksIFwicG9tLnhtbFwiKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMocG9tUGF0aCkpIHtcbiAgICAgIHRocm93IEVycm9ycy5Vc2FnZShcbiAgICAgICAgXCJObyBwb20ueG1sIGZvdW5kIGluIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIFBsZWFzZSBydW4gdGhlIGNvbW1hbmQgZnJvbSB0aGUgcm9vdCBvZiB5b3VyIHByb2plY3QuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBvbSA9IGF3YWl0IGZzLnJlYWRGaWxlKHBvbVBhdGgsIFwidXRmOFwiKTtcbiAgICBjb25zdCBwb21YbWwgPSAoYXdhaXQgeG1sMmpzKHBvbSwge30pKSBhcyBFbGVtZW50O1xuXG4gICAgLy8gTXV0YXRlIGRlcGVuZGVuY2llc1xuICAgIGNvbnN0IG5hbWVQYXJ0cyA9IHBhY2thZ2VOYW1lLnNwbGl0KFwiLlwiKTtcbiAgICBjb25zdCBncm91cElkID0gbmFtZVBhcnRzLnNsaWNlKDAsIG5hbWVQYXJ0cy5sZW5ndGggLSAxKS5qb2luKFwiLlwiKTtcbiAgICBjb25zdCBhcnRpZmFjdElkID0gbmFtZVBhcnRzW25hbWVQYXJ0cy5sZW5ndGggLSAxXTtcblxuICAgIGNvbnN0IG5ld0RlcGVuZGVuY3kgPSAoYXdhaXQgeG1sMmpzKFxuICAgICAgYDxkZXBlbmRlbmN5PlxuICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+XG4gICAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD5cbiAgICA8dmVyc2lvbj4ke3BhY2thZ2VWZXJzaW9ufTwvdmVyc2lvbj5cbjwvZGVwZW5kZW5jeT5gLFxuICAgICkpIGFzIEVsZW1lbnQ7XG5cbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwb21YbWwuZWxlbWVudHNcbiAgICAgID8uZmluZCgoZWwpID0+IGVsLm5hbWUgPT09IFwicHJvamVjdFwiKVxuICAgICAgPy5lbGVtZW50cz8uZmluZCgoZWwpID0+IGVsLm5hbWUgPT09IFwiZGVwZW5kZW5jaWVzXCIpO1xuXG4gICAgaWYgKCFkZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRocm93IEVycm9ycy5Vc2FnZShgQ291bGQgbm90IGZpbmQgZGVwZW5kZW5jaWVzIHNlY3Rpb24gaW4gdGhlIHBvbS54bWxgKTtcbiAgICB9XG4gICAgZGVwZW5kZW5jaWVzLmVsZW1lbnRzID0gKGRlcGVuZGVuY2llcz8uZWxlbWVudHMgfHwgW10pLmZpbHRlcihcbiAgICAgIChlbCkgPT5cbiAgICAgICAgZWwuZWxlbWVudHM/LnNvbWUoXG4gICAgICAgICAgKGdyb3VwKSA9PlxuICAgICAgICAgICAgZ3JvdXAubmFtZSA9PT0gXCJncm91cElkXCIgJiYgZ3JvdXAuZWxlbWVudHM/LlswXS50ZXh0ICE9PSBncm91cElkLFxuICAgICAgICApIHx8XG4gICAgICAgIGVsLmVsZW1lbnRzPy5zb21lKFxuICAgICAgICAgIChhcnRpZmFjdCkgPT5cbiAgICAgICAgICAgIGFydGlmYWN0Lm5hbWUgPT09IFwiYXJ0aWZhY3RJZFwiICYmXG4gICAgICAgICAgICBhcnRpZmFjdC5lbGVtZW50cz8uWzBdLnRleHQgIT09IGFydGlmYWN0SWQsXG4gICAgICAgICksXG4gICAgKTtcbiAgICBkZXBlbmRlbmNpZXM/LmVsZW1lbnRzPy5wdXNoKG5ld0RlcGVuZGVuY3kuZWxlbWVudHMhWzBdKTtcblxuICAgIC8vIFdyaXRlIG5ldyBwb20ueG1sXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBvbVBhdGgsIGpzMnhtbChwb21YbWwsIHsgc3BhY2VzOiAyIH0pKTtcblxuICAgIC8vIEluc3RhbGxcbiAgICBhd2FpdCBleGVjKFwibXZuXCIsIFtcImluc3RhbGxcIl0sIHsgY3dkOiB0aGlzLndvcmtpbmdEaXJlY3RvcnkgfSk7XG4gICAgY29uc29sZS5sb2coXCJQYWNrYWdlIGluc3RhbGxlZC5cIik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbGlzdFByb3ZpZGVyUGFja2FnZXMoKTogUHJvbWlzZTxcbiAgICB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXVxuICA+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcG9tUGF0aCA9IHBhdGguam9pbih0aGlzLndvcmtpbmdEaXJlY3RvcnksIFwicG9tLnhtbFwiKTtcbiAgICAgIGlmICghZXhpc3RzU3luYyhwb21QYXRoKSkge1xuICAgICAgICB0aHJvdyBFcnJvcnMuVXNhZ2UoXG4gICAgICAgICAgXCJObyBwb20ueG1sIGZvdW5kIGluIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIFBsZWFzZSBydW4gdGhlIGNvbW1hbmQgZnJvbSB0aGUgcm9vdCBvZiB5b3VyIHByb2plY3QuXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBvbSA9IGF3YWl0IGZzLnJlYWRGaWxlKHBvbVBhdGgsIFwidXRmOFwiKTtcbiAgICAgIGNvbnN0IHBvbVhtbCA9IChhd2FpdCB4bWwyanMocG9tLCB7fSkpIGFzIEVsZW1lbnQ7XG5cbiAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9XG4gICAgICAgIHBvbVhtbC5lbGVtZW50c1xuICAgICAgICAgID8uZmluZCgoZWwpID0+IGVsLm5hbWUgPT09IFwicHJvamVjdFwiKVxuICAgICAgICAgID8uZWxlbWVudHM/LmZpbmQoKGVsKSA9PiBlbC5uYW1lID09PSBcImRlcGVuZGVuY2llc1wiKT8uZWxlbWVudHMgPz8gW107XG5cbiAgICAgIHJldHVybiBkZXBlbmRlbmNpZXNcbiAgICAgICAgLm1hcCgoZGVwKSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGAke1xuICAgICAgICAgICAgZGVwLmVsZW1lbnRzPy5maW5kKChlbCkgPT4gZWwubmFtZSA9PT0gXCJncm91cElkXCIpPy5lbGVtZW50cz8uWzBdXG4gICAgICAgICAgICAgIC50ZXh0XG4gICAgICAgICAgfS4ke1xuICAgICAgICAgICAgZGVwLmVsZW1lbnRzPy5maW5kKChlbCkgPT4gZWwubmFtZSA9PT0gXCJhcnRpZmFjdElkXCIpPy5lbGVtZW50cz8uWzBdXG4gICAgICAgICAgICAgIC50ZXh0XG4gICAgICAgICAgfWAsXG4gICAgICAgICAgdmVyc2lvbjogZGVwLmVsZW1lbnRzPy5maW5kKChlbCkgPT4gZWwubmFtZSA9PT0gXCJ2ZXJzaW9uXCIpXG4gICAgICAgICAgICA/LmVsZW1lbnRzPy5bMF0udGV4dCBhcyBzdHJpbmcsXG4gICAgICAgIH0pKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChkZXApID0+XG4gICAgICAgICAgICBkZXAubmFtZS5zdGFydHNXaXRoKFwiY29tLmhhc2hpY29ycC5jZGt0Zi1wcm92aWRlci1cIikgfHxcbiAgICAgICAgICAgIGRlcC5uYW1lLnN0YXJ0c1dpdGgoXCJpby5jZGt0bi5jZGt0bi1wcm92aWRlci1cIiksXG4gICAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGluc3RhbGxlZCBwYWNrYWdlcyByZWFkaW5nIHRoZSBwb20ueG1sOiAke2UubWVzc2FnZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgR3JhZGxlUGFja2FnZU1hbmFnZXIgZXh0ZW5kcyBKYXZhUGFja2FnZU1hbmFnZXIge1xuICBwdWJsaWMgc3RhdGljIGlzR3JhZGxlUHJvamVjdCh3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNHcmFkbGVQcm9qZWN0KHdvcmtpbmdEaXJlY3RvcnkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZFBhY2thZ2UoXG4gICAgcGFja2FnZUZRTjogc3RyaW5nLFxuICAgIHBhY2thZ2VWZXJzaW9uID0gXCJsYXRlc3QucmVsZWFzZVwiLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBidWlsZEdyYWRsZVBhdGggPSBwYXRoLmpvaW4odGhpcy53b3JraW5nRGlyZWN0b3J5LCBcImJ1aWxkLmdyYWRsZVwiKTtcbiAgICBjb25zdCBidWlsZEdyYWRsZSA9IGF3YWl0IGZzLnJlYWRGaWxlKGJ1aWxkR3JhZGxlUGF0aCwgXCJ1dGY4XCIpO1xuICAgIGNvbnN0IGJ1aWxkR3JhZGxlTGluZXMgPSBidWlsZEdyYWRsZS5zcGxpdCgvXFxyP1xcbi8pO1xuXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzUmVnZXggPSAvZGVwZW5kZW5jaWVzXFxzK1xcey9pO1xuICAgIGNvbnN0IGRlcGVuZGVuY3lCbG9ja1N0YXJ0ID0gYnVpbGRHcmFkbGVMaW5lcy5maW5kSW5kZXgoKGxpbmUpID0+XG4gICAgICBkZXBlbmRlbmNpZXNSZWdleC50ZXN0KGxpbmUpLFxuICAgICk7XG4gICAgaWYgKGRlcGVuZGVuY3lCbG9ja1N0YXJ0ID09PSAtMSkge1xuICAgICAgdGhyb3cgRXJyb3JzLlVzYWdlKFxuICAgICAgICBcIkNvdWxkIG5vdCBmaW5kIGRlcGVuZGVuY2llcyBzZWN0aW9uIGluIHRoZSBidWlsZC5ncmFkbGVcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFja2FnZVNlZ21lbnRzID0gcGFja2FnZUZRTi5zcGxpdChcIi5cIik7XG4gICAgY29uc3QgcGFja2FnZU5hbWUgPSBwYWNrYWdlU2VnbWVudHMucG9wKCk7XG4gICAgY29uc3QgZ3JvdXBOYW1lID0gcGFja2FnZVNlZ21lbnRzLmpvaW4oXCIuXCIpO1xuICAgIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXIgPSBgJHtncm91cE5hbWV9OiR7cGFja2FnZU5hbWV9YDtcbiAgICBjb25zdCBkZXBlbmRlbmN5QW5kVmVyc2lvblNwZWNpZmllciA9IGAke2RlcGVuZGVuY3lTcGVjaWZpZXJ9OiR7cGFja2FnZVZlcnNpb259YDtcblxuICAgIGNvbnN0IGV4aXN0aW5nRGVwZW5kZW5jeSA9IGJ1aWxkR3JhZGxlTGluZXMuZmluZEluZGV4KChsaW5lKSA9PlxuICAgICAgbGluZS5pbmNsdWRlcyhkZXBlbmRlbmN5U3BlY2lmaWVyKSxcbiAgICApO1xuICAgIGlmIChleGlzdGluZ0RlcGVuZGVuY3kgIT09IC0xKSB7XG4gICAgICBidWlsZEdyYWRsZUxpbmVzLnNwbGljZShleGlzdGluZ0RlcGVuZGVuY3ksIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1BhY2thZ2VEZXBlbmRlbmN5ID0gYFxcdGltcGxlbWVudGF0aW9uICcke2RlcGVuZGVuY3lBbmRWZXJzaW9uU3BlY2lmaWVyfSdgO1xuICAgIGJ1aWxkR3JhZGxlTGluZXMuc3BsaWNlKGRlcGVuZGVuY3lCbG9ja1N0YXJ0ICsgMSwgMCwgbmV3UGFja2FnZURlcGVuZGVuY3kpO1xuXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGJ1aWxkR3JhZGxlUGF0aCwgYnVpbGRHcmFkbGVMaW5lcy5qb2luKFwiXFxuXCIpKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsaXN0UHJvdmlkZXJQYWNrYWdlcygpOiBQcm9taXNlPFxuICAgIHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfVtdXG4gID4ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGF3YWl0IGdldEdyYWRsZURlcGVuZGVuY2llcygpO1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSB7XG4gICAgICB0aHJvdyBFcnJvcnMuVXNhZ2UoXCJDb3VsZCBub3QgZmluZCBhbnkgZGVwZW5kZW5jaWVzXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcGVuZGVuY3lMaXN0ID0gZGVwZW5kZW5jaWVzXG4gICAgICAubWFwKChsaW5lKSA9PiBnZXREZXBlbmRlbmN5SW5mb3JtYXRpb25Gcm9tTGluZShsaW5lKSlcbiAgICAgIC5maWx0ZXIoKGRlcCkgPT4ge1xuICAgICAgICBpZiAoIWRlcCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGRlcC5uYW1lLmluY2x1ZGVzKFwiY2RrdGYtcHJvdmlkZXItXCIpIHx8XG4gICAgICAgICAgZGVwLm5hbWUuaW5jbHVkZXMoXCJjZGt0bi1wcm92aWRlci1cIilcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAubWFwKChkZXApID0+ICh7XG4gICAgICAgIG5hbWU6IGBjb20uaGFzaGljb3JwLiR7ZGVwIS5uYW1lfWAsXG4gICAgICAgIHZlcnNpb246IGRlcCEudmVyc2lvbixcbiAgICAgIH0pKTtcblxuICAgIHJldHVybiBkZXBlbmRlbmN5TGlzdDtcbiAgfVxufVxuXG5jbGFzcyBHb1BhY2thZ2VNYW5hZ2VyIGV4dGVuZHMgUGFja2FnZU1hbmFnZXIge1xuICBwdWJsaWMgYXN5bmMgYWRkUGFja2FnZShcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICAgIHBhY2thZ2VWZXJzaW9uPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZyhgQWRkaW5nIHBhY2thZ2UgJHtwYWNrYWdlTmFtZX0gQCAke3BhY2thZ2VWZXJzaW9ufWApO1xuXG4gICAgY29uc3QgbWFqb3JWZXJzaW9uOiBudW1iZXIgfCB1bmRlZmluZWQgPSBwYWNrYWdlVmVyc2lvblxuICAgICAgPyBzZW12ZXIubWFqb3IocGFja2FnZVZlcnNpb24pXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGxldCB2ZXJzaW9uUGFja2FnZVN1ZmZpeCA9IFwiXCI7XG4gICAgaWYgKHR5cGVvZiBtYWpvclZlcnNpb24gPT09IFwibnVtYmVyXCIgJiYgbWFqb3JWZXJzaW9uID4gMSkge1xuICAgICAgdmVyc2lvblBhY2thZ2VTdWZmaXggPSBgL3Yke21ham9yVmVyc2lvbn1gO1xuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBSdW5uaW5nICdnbyBnZXQgJHtwYWNrYWdlTmFtZX0ke3ZlcnNpb25QYWNrYWdlU3VmZml4fUB2JHtwYWNrYWdlVmVyc2lvbn0nYCxcbiAgICApO1xuICAgIC8vIEluc3RhbGxcbiAgICBhd2FpdCBleGVjKFxuICAgICAgXCJnb1wiLFxuICAgICAgW1wiZ2V0XCIsIGAke3BhY2thZ2VOYW1lfSR7dmVyc2lvblBhY2thZ2VTdWZmaXh9QHYke3BhY2thZ2VWZXJzaW9ufWBdLFxuICAgICAge1xuICAgICAgICBjd2Q6IHRoaXMud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnNvbGUubG9nKFwiUGFja2FnZSBpbnN0YWxsZWQuXCIpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGlzTnBtVmVyc2lvbkF2YWlsYWJsZShcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICAgIHBhY2thZ2VWZXJzaW9uOiBzdHJpbmcsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ2hlY2tpbmcgaWYgJHtwYWNrYWdlTmFtZX1AJHtwYWNrYWdlVmVyc2lvbn0gaXMgYXZhaWxhYmxlYCk7XG5cbiAgICAvLyBlLmcuIGdpdGh1Yi5jb20vY2RrdGYvY2RrdGYtcHJvdmlkZXItZ29vZ2xlLWdvL2dvb2dsZVxuICAgIGNvbnN0IHBhcnRzID0gcGFja2FnZU5hbWUuc3BsaXQoXCIvXCIpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDQpIHtcbiAgICAgIHRocm93IEVycm9ycy5JbnRlcm5hbChcbiAgICAgICAgYEV4cGVjdGluZyBHbyBwYWNrYWdlIG5hbWUgdG8gYmUgaW4gdGhlIGZvcm1hdCBvZiBnaXRodWIuY29tLzxvcmc+LzxyZXBvPi88cGFja2FnZT4sIGdvdCAke3BhY2thZ2VOYW1lfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG9yZyA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IHJlcG8gPSBwYXJ0c1syXTtcbiAgICBjb25zdCBwYWNrYWdlUGF0aCA9IHBhcnRzWzNdO1xuXG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtvcmd9LyR7cmVwb30vZ2l0L3JlZi90YWdzLyR7cGFja2FnZVBhdGh9L3Yke3BhY2thZ2VWZXJzaW9ufWA7XG4gICAgbG9nZ2VyLmRlYnVnKGBGZXRjaGluZyB0YWdzIGZvciAke29yZ30vJHtyZXBvfSBmcm9tICcke3VybH0nYCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvblwiLFxuICAgICAgICBcIlVzZXItQWdlbnRcIjogXCJPcGVuQ29uc3RydWN0cy9jZGt0bi1jbGlcIixcbiAgICAgICAgLi4uKEdJVEhVQl9BUElfVE9LRU5fQ0RLVEZcbiAgICAgICAgICA/IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke0dJVEhVQl9BUElfVE9LRU5fQ0RLVEZ9YCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QganNvbiA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIGFueTtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgR290IHJlc3BvbnNlIGZyb20gR2l0SHVicyByZXBvc2l0b3J5IHRhZyBlbmRwb2ludCBmb3IgJHtwYWNrYWdlTmFtZX06ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGpzb24sXG4gICAgICApfWAsXG4gICAgKTtcblxuICAgIGlmIChqc29uICYmIGpzb24ucmVmKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBDb3VsZCBub3QgZmluZCB0aGUgdGFnICR7cGFja2FnZVBhdGh9L3Yke3BhY2thZ2VWZXJzaW9ufSBpbiB0aGUgcmVwb3NpdG9yeSAke29yZ30vJHtyZXBvfTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAganNvbixcbiAgICAgICl9fWAsXG4gICAgKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsaXN0UHJvdmlkZXJQYWNrYWdlcygpOiBQcm9taXNlPFxuICAgIHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfVtdXG4gID4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBnb1N1bVBhdGggPSBwYXRoLmpvaW4odGhpcy53b3JraW5nRGlyZWN0b3J5LCBcImdvLnN1bVwiKTtcbiAgICAgIGlmICghZXhpc3RzU3luYyhnb1N1bVBhdGgpKSB7XG4gICAgICAgIHRocm93IEVycm9ycy5Vc2FnZShcbiAgICAgICAgICBcIk5vIGdvLnN1bSBmb3VuZCBpbiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBQbGVhc2UgcnVuIHRoZSBjb21tYW5kIGZyb20gdGhlIHJvb3Qgb2YgeW91ciBwcm9qZWN0LlwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBnb1N1bSA9IGF3YWl0IGZzLnJlYWRGaWxlKGdvU3VtUGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgY29uc3QgZGVkdXBlZFByb3ZpZGVyTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgIHJldHVybiBnb1N1bVxuICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAobGluZSkgPT5cbiAgICAgICAgICAgIGxpbmUuc3RhcnRzV2l0aChcImdpdGh1Yi5jb20vaGFzaGljb3JwL2Nka3RmLXByb3ZpZGVyXCIpIHx8XG4gICAgICAgICAgICBsaW5lLnN0YXJ0c1dpdGgoXCJnaXRodWIuY29tL2Nka3RmL2Nka3RmLXByb3ZpZGVyXCIpIHx8XG4gICAgICAgICAgICBsaW5lLnN0YXJ0c1dpdGgoXCJnaXRodWIuY29tL2Nka3RuLWlvL2Nka3RuLXByb3ZpZGVyXCIpLFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJ0cyA9IGxpbmUuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9ycy5JbnRlcm5hbChcbiAgICAgICAgICAgICAgYEV4cGVjdGVkIGxpbmUgaW4gZ28uc3VtIHRvIGJlIGluIHRoZSBmb3JtYXQgb2YgJzxwYWNrYWdlPiA8dmVyc2lvbj4gPGNoZWNrc3VtPicsIGdvdDogJHtsaW5lfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHBhcnRbMF0gY291bGQgYmUgZ2l0aHViLmNvbS9hd3MvY29uc3RydWN0cy1nby9jb25zdHJ1Y3RzL3YxMFxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBwYXJ0c1swXS5zcGxpdChcIi9cIikuc2xpY2UoMCwgNCkuam9pbihcIi9cIik7XG5cbiAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gcGFydHNbMV0uc3BsaXQoXCIvXCIpWzBdO1xuXG4gICAgICAgICAgaWYgKGRlZHVwZWRQcm92aWRlck5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogXCJcIiwgdmVyc2lvbjogXCJcIiB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRlZHVwZWRQcm92aWRlck5hbWVzLmFkZChuYW1lKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChwcm92aWRlckluZm8pID0+ICEhcHJvdmlkZXJJbmZvLm5hbWUgJiYgISFwcm92aWRlckluZm8udmVyc2lvbixcbiAgICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBkZXRlcm1pbmUgaW5zdGFsbGVkIHBhY2thZ2VzIHJlYWRpbmcgdGhlIGdvLnN1bTogJHtlLm1lc3NhZ2V9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
684
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9kZXBlbmRlbmNpZXMvcGFja2FnZS1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQyw0Q0FRd0I7QUFDeEIsdUNBQXNDO0FBQ3RDLGdEQUF3QjtBQUN4QixtQ0FBaUQ7QUFDakQsNkNBQStCO0FBQy9CLCtDQUFpQztBQUNqQyxtQ0FBa0U7QUFDbEUsdUNBQXlCO0FBRXpCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO0FBQy9ELE1BQU0sVUFBVSxHQUEyQixLQUFLO0lBQzlDLENBQUMsQ0FBQyxJQUFJLG1CQUFVLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFFZDs7O0dBR0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQztBQUVsQyx5RUFBeUU7QUFDekUsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7QUFFdEM7O0dBRUc7QUFDSCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQUVqQzs7R0FFRztBQUNILE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0FBRW5DOztHQUVHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFFbEM7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFFM0I7Ozs7OztHQU1HO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxNQUFjO0lBQ3ZDLE9BQU8sQ0FDTCxNQUFNLEtBQUssb0JBQW9CO1FBQy9CLE1BQU0sS0FBSyxzQkFBc0I7UUFDakMsTUFBTSxJQUFJLHFCQUFxQixDQUNoQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FB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TUFBTSxnQkFBTSxDQUFDLFFBQVEsQ0FDbkIseUZBQXlGLElBQUksRUFBRSxDQUNoRyxDQUFDO2dCQUNKLENBQUM7Z0JBRUQsK0RBQStEO2dCQUMvRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUV2RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV2QyxJQUFJLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNuQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7Z0JBQ25DLENBQUM7Z0JBRUQsb0JBQW9CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUUvQixPQUFPO29CQUNMLElBQUk7b0JBQ0osT0FBTztpQkFDUixDQUFDO1lBQ0osQ0FBQyxDQUFDO2lCQUNELE1BQU0sQ0FDTCxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQ2hFLENBQUM7UUFDTixDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUNiLDhEQUE4RCxDQUFDLENBQUMsT0FBTyxFQUFFLENBQzFFLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7XG4gIExhbmd1YWdlLFxuICBleGVjLFxuICBFcnJvcnMsXG4gIGxvZ2dlcixcbiAgaXNHcmFkbGVQcm9qZWN0LFxuICBnZXRHcmFkbGVEZXBlbmRlbmNpZXMsXG4gIGdldERlcGVuZGVuY3lJbmZvcm1hdGlvbkZyb21MaW5lLFxufSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB4bWwyanMsIGpzMnhtbCwgRWxlbWVudCB9IGZyb20gXCJ4bWwtanNcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gXCJzZW12ZXJcIjtcbmltcG9ydCB7IGZldGNoLCBQcm94eUFnZW50LCBSZXF1ZXN0SW5pdCwgUmVzcG9uc2UgfSBmcm9tIFwidW5kaWNpXCI7XG5pbXBvcnQgKiBhcyB6IGZyb20gXCJ6b2RcIjtcblxuY29uc3QgcHJveHkgPSBwcm9jZXNzLmVudi5odHRwX3Byb3h5IHx8IHByb2Nlc3MuZW52LkhUVFBfUFJPWFk7XG5jb25zdCBkaXNwYXRjaGVyOiBQcm94eUFnZW50IHwgdW5kZWZpbmVkID0gcHJveHlcbiAgPyBuZXcgUHJveHlBZ2VudChwcm94eSlcbiAgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogTnVtYmVyIG9mIGF0dGVtcHRzIChpbml0aWFsIHRyeSArIHJldHJpZXMpIGZvciBhIHJlZ2lzdHJ5IHByb2JlIGJlZm9yZSB3ZSBnaXZlIHVwIGFuZCB0cmVhdCB0aGUgcmVnaXN0cnkgYXNcbiAqIHVucmVhY2hhYmxlLiBUcmFuc2llbnQgZmFpbHVyZXMgKG5ldHdvcmsgZXJyb3JzIC8gNDA4IC8gNDI5IC8gNXh4KSBhcmUgcmV0cmllZDsgZGVmaW5pdGl2ZSByZXNwb25zZXMgYXJlIG5vdC5cbiAqL1xuY29uc3QgUkVHSVNUUllfUFJPQkVfQVRURU1QVFMgPSAzO1xuXG4vKiogQmFzZSBiYWNrb2ZmIGJldHdlZW4gcmV0cmllcywgZG91YmxlZCBlYWNoIGF0dGVtcHQgKDI1MG1zLCA1MDBtcykuICovXG5jb25zdCBSRUdJU1RSWV9QUk9CRV9CQUNLT0ZGX01TID0gMjUwO1xuXG4vKipcbiAqIEhUVFAgNDA4IFJlcXVlc3QgVGltZW91dCDigJQgYSB0cmFuc2llbnQgc3RhdHVzIHdvcnRoIHJldHJ5aW5nLlxuICovXG5jb25zdCBIVFRQX1JFUVVFU1RfVElNRU9VVCA9IDQwODtcblxuLyoqXG4gKiBIVFRQIDQyOSBUb28gTWFueSBSZXF1ZXN0cyAocmF0ZSBsaW1pdCkg4oCUIGEgdHJhbnNpZW50IHN0YXR1cyB3b3J0aCByZXRyeWluZy5cbiAqL1xuY29uc3QgSFRUUF9UT09fTUFOWV9SRVFVRVNUUyA9IDQyOTtcblxuLyoqXG4gKiBMb3dlc3QgSFRUUCA1eHggc3RhdHVzIOKAlCBhbnkgc3RhdHVzIGF0IG9yIGFib3ZlIHRoaXMgaXMgYSBzZXJ2ZXIgZXJyb3IgYW5kIHRyZWF0ZWQgYXMgYSB0cmFuc2llbnQgc3RhdHVzIHdvcnRoIHJldHJ5aW5nLlxuICovXG5jb25zdCBIVFRQX1NFUlZFUl9FUlJPUl9NSU4gPSA1MDA7XG5cbi8qKlxuICogSFRUUCA0MDQgTm90IEZvdW5kIOKAlCBhIGRlZmluaXRpdmUgXCJ0aGUgdmVyc2lvbiBpcyBub3QgcHVibGlzaGVkXCIgYW5zd2VyIGZyb20gYSByZWdpc3RyeSAobm90IHRyYW5zaWVudCkuXG4gKi9cbmNvbnN0IEhUVFBfTk9UX0ZPVU5EID0gNDA0O1xuXG4vKipcbiAqIFJlcG9ydHMgd2hldGhlciBhbiBIVFRQIHN0YXR1cyBpcyB0cmFuc2llbnQgYW5kIHRoZXJlZm9yZSB3b3J0aCByZXRyeWluZzogcmVxdWVzdCB0aW1lb3V0ICg0MDgpLCByYXRlIGxpbWl0ICg0MjkpLFxuICogb3IgYW55IHNlcnZlciBlcnJvciAoNXh4KS4gRGVmaW5pdGl2ZSBzdGF0dXNlcyAoMnh4LCA0MDQsIG90aGVyIDR4eCkgYXJlIG5vdCB0cmFuc2llbnQuXG4gKlxuICogQHBhcmFtIHN0YXR1cyAtIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGZyb20gYSByZWdpc3RyeSByZXNwb25zZS5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3RhdHVzIGlzIHRyYW5zaWVudCBhbmQgdGhlIHJlcXVlc3Qgc2hvdWxkIGJlIHJldHJpZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBpc1RyYW5zaWVudFN0YXR1cyhzdGF0dXM6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHN0YXR1cyA9PT0gSFRUUF9SRVFVRVNUX1RJTUVPVVQgfHxcbiAgICBzdGF0dXMgPT09IEhUVFBfVE9PX01BTllfUkVRVUVTVFMgfHxcbiAgICBzdGF0dXMgPj0gSFRUUF9TRVJWRVJfRVJST1JfTUlOXG4gICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYWZ0ZXIgYG1zYCBtaWxsaXNlY29uZHM7IHVzZWQgdG8gYmFjayBvZmYgYmV0d2VlbiByZWdpc3RyeS1wcm9iZSByZXRyaWVzLlxuICpcbiAqIEBwYXJhbSBtcyAtIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBkZWxheSBoYXMgZWxhcHNlZC5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIGB1cmxgLCByZXRyeWluZyBvbmx5IG9uIHRyYW5zaWVudCBmYWlsdXJlcyDigJQgbmV0d29yayBlcnJvcnMgYW5kIEhUVFAgNDA4LzQyOS81eHgg4oCUIHNvIGEgcmVnaXN0cnkgaGljY3VwIGlzXG4gKiBub3QgbWlzdGFrZW4gZm9yIGEgZGVmaW5pdGl2ZSBhbnN3ZXIuIERlZmluaXRpdmUgcmVzcG9uc2VzICgyeHgsIDQwNCwgb3RoZXIgNHh4KSBhcmUgcmV0dXJuZWQgaW1tZWRpYXRlbHkgd2l0aG91dFxuICogcmV0cnkuIElmIGV2ZXJ5IGF0dGVtcHQgZmFpbHMgdHJhbnNpZW50bHksIHRocm93cyBhbiBgRXh0ZXJuYWxgIGVycm9yIHNvIGNhbGxlcnMgY2FuIGRpc3Rpbmd1aXNoIFwicmVnaXN0cnlcbiAqIHVucmVhY2hhYmxlXCIgZnJvbSBcInZlcnNpb24gYWJzZW50XCIgcmF0aGVyIHRoYW4gc2lsZW50bHkgdHJlYXRpbmcgYSBoaWNjdXAgYXMgYWJzZW5jZS5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIHJlZ2lzdHJ5IFVSTCB0byBmZXRjaC5cbiAqIEBwYXJhbSBpbml0IC0gT3B0aW9uYWwgYGZldGNoYCByZXF1ZXN0IG9wdGlvbnMgKGUuZy4gaGVhZGVycyksIHBhc3NlZCB0aHJvdWdoIHVuY2hhbmdlZCBvbiBldmVyeSBhdHRlbXB0LlxuICogQHJldHVybnMgVGhlIGBSZXNwb25zZWAgZm9yIHRoZSBmaXJzdCBkZWZpbml0aXZlIChub24tdHJhbnNpZW50KSByZXN1bHQuXG4gKiBAdGhyb3dzIEFuIGBFeHRlcm5hbGAgZXJyb3IgaWYgZXZlcnkgYXR0ZW1wdCAodXAgdG8gYFJFR0lTVFJZX1BST0JFX0FUVEVNUFRTYCkgZmFpbHMgdHJhbnNpZW50bHkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoV2l0aFJldHJ5KFxuICB1cmw6IHN0cmluZyxcbiAgaW5pdD86IFJlcXVlc3RJbml0LFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBsZXQgbGFzdEVycm9yOiB1bmtub3duO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IFJFR0lTVFJZX1BST0JFX0FUVEVNUFRTOyBhdHRlbXB0KyspIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgLi4uaW5pdCwgZGlzcGF0Y2hlciB9KTtcbiAgICAgIGlmICghaXNUcmFuc2llbnRTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9XG4gICAgICBsYXN0RXJyb3IgPSBuZXcgRXJyb3IoYHJlZ2lzdHJ5IHJlc3BvbmRlZCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgVHJhbnNpZW50IEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9IGZyb20gJyR7dXJsfScgKGF0dGVtcHQgJHthdHRlbXB0fS8ke1JFR0lTVFJZX1BST0JFX0FUVEVNUFRTfSlgLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIC8vIGZldGNoIHJlamVjdHMgb24gbmV0d29yay1sZXZlbCBmYWlsdXJlcyAoRE5TLCBjb25uZWN0aW9uIHJlc2V0LCB0aW1lb3V0KSDigJQgYWx3YXlzIHRyYW5zaWVudC5cbiAgICAgIGxhc3RFcnJvciA9IGU7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBOZXR3b3JrIGVycm9yIGZldGNoaW5nICcke3VybH0nIChhdHRlbXB0ICR7YXR0ZW1wdH0vJHtSRUdJU1RSWV9QUk9CRV9BVFRFTVBUU30pOiAke2V9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGF0dGVtcHQgPCBSRUdJU1RSWV9QUk9CRV9BVFRFTVBUUykge1xuICAgICAgYXdhaXQgZGVsYXkoUkVHSVNUUllfUFJPQkVfQkFDS09GRl9NUyAqIDIgKiogKGF0dGVtcHQgLSAxKSk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgRXJyb3JzLkV4dGVybmFsKFxuICAgIGBDb3VsZCBub3QgcmVhY2ggdGhlIHJlZ2lzdHJ5IGF0ICcke3VybH0nIGFmdGVyICR7UkVHSVNUUllfUFJPQkVfQVRURU1QVFN9IGF0dGVtcHRzOiAke2xhc3RFcnJvcn1gLFxuICApO1xufVxuXG4vLyBDYW4ndCB1c2UgQ0RLVEZfIGFzIHByZWZpeCBiZWNhdXNlIHlhcmdzIC5lbnYoXCJDREtURlwiKSBpbiBzdHJpY3QgbW9kZSBkb2VzIG5vdCBhbGxvdyB1cyB0b1xuLy8gUmVmZXIgdG86IGh0dHBzOi8vZ2l0aHViLmNvbS95YXJncy95YXJncy9pc3N1ZXMvODczXG5jb25zdCB7IEdJVEhVQl9BUElfVE9LRU5fQ0RLVEYgfSA9IHByb2Nlc3MuZW52O1xuXG4vLyB7XG4vLyAgIFwidmVyc2lvblwiOiBcIjEuMC4wXCIsXG4vLyAgIFwibmFtZVwiOiBcInRlc3RVU0hhc0ZcIixcbi8vICAgXCJwcm9ibGVtc1wiOiBbXG4vLyAgICAgXCJleHRyYW5lb3VzOiBhcmNoaXZlci11dGlsc0AyLjEuMCAvcHJpdmF0ZS92YXIvZm9sZGVycy96Xy92MDNsMzNkNTVmYjU3bnJyM2IxcTAzY2gwMDAwZ3EvVC90ZXN0VVNIYXNGL25vZGVfbW9kdWxlcy9hcmNoaXZlci11dGlsc1wiLFxuLy8gICBdLFxuLy8gICBcImRlcGVuZGVuY2llc1wiOiB7XG4vLyAgICAgXCJAY2RrdGYvcHJvdmlkZXItcmFuZG9tXCI6IHtcbi8vICAgICAgIFwidmVyc2lvblwiOiBcIjMuMC4xMVwiLFxuLy8gICAgICAgXCJyZXNvbHZlZFwiOiBcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BjZGt0Zi9wcm92aWRlci1yYW5kb20vLS9wcm92aWRlci1yYW5kb20tMy4wLjExLnRnelwiXG4vLyAgICAgfSxcbmNvbnN0IG5wbUxpc3RTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGRlcGVuZGVuY2llczogei5yZWNvcmQoXG4gICAgICB6LnN0cmluZygpLFxuICAgICAgelxuICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICB2ZXJzaW9uOiB6LnN0cmluZygpLFxuICAgICAgICB9KVxuICAgICAgICAubG9vc2UoKSxcbiAgICApLFxuICB9KVxuICAucGFydGlhbCgpXG4gIC5sb29zZSgpO1xuXG4vLyB7XG4vLyAgIFwidHlwZVwiOiBcInRyZWVcIixcbi8vICAgXCJkYXRhXCI6IHtcbi8vICAgICBcInR5cGVcIjogXCJsaXN0XCIsXG4vLyAgICAgXCJ0cmVlc1wiOiBbXG4vLyAgICAgICB7XG4vLyAgICAgICAgIFwibmFtZVwiOiBcIkBjZGt0Zi9wcm92aWRlci1yYW5kb21AMy4wLjExXCIsXG4vLyAgICAgICAgIFwiY2hpbGRyZW5cIjogW10sXG4vLyAgICAgICAgIFwiaGludFwiOiBudWxsLFxuLy8gICAgICAgICBcImNvbG9yXCI6IFwiYm9sZFwiLFxuLy8gICAgICAgICBcImRlcHRoXCI6IDBcbi8vICAgICAgIH1cbi8vICAgICBdXG4vLyAgIH1cbi8vIH1cbmNvbnN0IHlhcm5MaXN0U2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBkYXRhOiB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgdHJlZXM6IHouYXJyYXkoXG4gICAgICAgICAgelxuICAgICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICAgIG5hbWU6IHouc3RyaW5nKCksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBhcnRpYWwoKVxuICAgICAgICAgICAgLmxvb3NlKCksXG4gICAgICAgICksXG4gICAgICB9KVxuICAgICAgLnBhcnRpYWwoKVxuICAgICAgLmxvb3NlKCksXG4gIH0pXG4gIC5wYXJ0aWFsKClcbiAgLmxvb3NlKCk7XG5cbi8vIFtcbi8vICAge1xuLy8gICAgIFwibmFtZVwiOiBcImFwcGRpcnNcIixcbi8vICAgICBcInZlcnNpb25cIjogXCIxLjQuNFwiXG4vLyAgIH0sXG4vLyAgIHtcbmNvbnN0IHBpcFBhY2thZ2VTY2hlbWEgPSB6LmFycmF5KFxuICB6Lm9iamVjdCh7IG5hbWU6IHouc3RyaW5nKCksIHZlcnNpb246IHouc3RyaW5nKCkgfSkubG9vc2UoKSxcbik7XG5cbi8qKlxuICogbWFuYWdlcyBpbnN0YWxsaW5nLCB1cGRhdGluZywgYW5kIHJlbW92aW5nIGRlcGVuZGVuY2llc1xuICogaW4gdGhlIHBhY2thZ2Ugc3lzdGVtIHVzZWQgYnkgdGhlIHRhcmdldCBsYW5ndWFnZSBvZiBhIENES1ROXG4gKiBwcm9qZWN0XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQYWNrYWdlTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSB3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcpIHt9XG5cbiAgcHVibGljIHN0YXRpYyBmb3JMYW5ndWFnZShcbiAgICBsYW5ndWFnZTogTGFuZ3VhZ2UsXG4gICAgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nLFxuICApOiBQYWNrYWdlTWFuYWdlciB7XG4gICAgc3dpdGNoIChsYW5ndWFnZSkge1xuICAgICAgY2FzZSBMYW5ndWFnZS5HTzpcbiAgICAgICAgcmV0dXJuIG5ldyBHb1BhY2thZ2VNYW5hZ2VyKHdvcmtpbmdEaXJlY3RvcnkpO1xuICAgICAgY2FzZSBMYW5ndWFnZS5UWVBFU0NSSVBUOlxuICAgICAgICByZXR1cm4gbmV3IE5vZGVQYWNrYWdlTWFuYWdlcih3b3JraW5nRGlyZWN0b3J5KTtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuUFlUSE9OOlxuICAgICAgICByZXR1cm4gbmV3IFB5dGhvblBhY2thZ2VNYW5hZ2VyKHdvcmtpbmdEaXJlY3RvcnkpO1xuICAgICAgY2FzZSBMYW5ndWFnZS5DU0hBUlA6XG4gICAgICAgIHJldHVybiBuZXcgTnVnZXRQYWNrYWdlTWFuYWdlcih3b3JraW5nRGlyZWN0b3J5KTtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuSkFWQTpcbiAgICAgICAgaWYgKEdyYWRsZVBhY2thZ2VNYW5hZ2VyLmlzR3JhZGxlUHJvamVjdCh3b3JraW5nRGlyZWN0b3J5KSkge1xuICAgICAgICAgIHJldHVybiBuZXcgR3JhZGxlUGFja2FnZU1hbmFnZXIod29ya2luZ0RpcmVjdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNYXZlblBhY2thZ2VNYW5hZ2VyKHdvcmtpbmdEaXJlY3RvcnkpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGxhbmd1YWdlOiAke2xhbmd1YWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCBhZGRQYWNrYWdlKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcGFja2FnZVZlcnNpb24/OiBzdHJpbmcsXG4gICAgc2lsZW50PzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPjtcbiAgLy8gYWRkIGNoZWNrIGlmIHBhY2thZ2UgZXhpc3RzIGFscmVhZHkuIG1pZ2h0IHF1ZXJ5IHZlcnNpb24gaW4gdGhlIGZ1dHVyZSBhbmQgb2ZmZXIgdG8gdXBncmFkZT9cblxuICBwdWJsaWMgYWJzdHJhY3QgaXNOcG1WZXJzaW9uQXZhaWxhYmxlKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcGFja2FnZVZlcnNpb246IHN0cmluZyxcbiAgKTogUHJvbWlzZTxib29sZWFuPjtcblxuICBwdWJsaWMgYWJzdHJhY3QgbGlzdFByb3ZpZGVyUGFja2FnZXMoKTogUHJvbWlzZTxcbiAgICB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXVxuICA+O1xufVxuXG5jbGFzcyBOb2RlUGFja2FnZU1hbmFnZXIgZXh0ZW5kcyBQYWNrYWdlTWFuYWdlciB7XG4gIHByaXZhdGUgaGFzWWFybkxvY2tmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBleGlzdHNTeW5jKHBhdGguam9pbih0aGlzLndvcmtpbmdEaXJlY3RvcnksIFwieWFybi5sb2NrXCIpKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGRQYWNrYWdlKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcGFja2FnZVZlcnNpb24/OiBzdHJpbmcsXG4gICAgc2lsZW50PzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coYEFkZGluZyBwYWNrYWdlICR7cGFja2FnZU5hbWV9IEAgJHtwYWNrYWdlVmVyc2lvbn1gKTtcblxuICAgIC8vIHByb2JlIGZvciBwYWNrYWdlLWxvY2suanNvbiBvciB5YXJuLmxvY2tcbiAgICBsZXQgY29tbWFuZCA9IFwibnBtXCI7XG4gICAgbGV0IGFyZ3MgPSBbXCJpbnN0YWxsXCJdO1xuXG4gICAgaWYgKHRoaXMuaGFzWWFybkxvY2tmaWxlKCkpIHtcbiAgICAgIGNvbW1hbmQgPSBcInlhcm5cIjtcbiAgICAgIGFyZ3MgPSBbXCJhZGRcIl07XG4gICAgfVxuICAgIGFyZ3MucHVzaChcbiAgICAgIHBhY2thZ2VWZXJzaW9uID8gcGFja2FnZU5hbWUgKyBcIkBcIiArIHBhY2thZ2VWZXJzaW9uIDogcGFja2FnZU5hbWUsXG4gICAgKTtcblxuICAgIGlmIChzaWxlbnQpIHtcbiAgICAgIGFyZ3MucHVzaChcIi0tc2lsZW50XCIpO1xuICAgICAgYXJncy5wdXNoKFwiLS1uby1wcm9ncmVzc1wiKTtcbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIGV4YWN0IHZlcnNpb25cbiAgICAvLyBZYXJuOiBodHRwczovL2NsYXNzaWMueWFybnBrZy5jb20vbGFuZy9lbi9kb2NzL2NsaS9hZGQvI3RvYy15YXJuLWFkZC1leGFjdC1lXG4gICAgLy8gTnBtOiBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92OC9jb21tYW5kcy9ucG0taW5zdGFsbCNzYXZlLWV4YWN0XG4gICAgYXJncy5wdXNoKFwiLUVcIik7XG5cbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBJbnN0YWxsaW5nIHBhY2thZ2UgJHtwYWNrYWdlTmFtZX0gQCAke3BhY2thZ2VWZXJzaW9ufSB1c2luZyAke2NvbW1hbmR9LmAsXG4gICAgKTtcblxuICAgIGF3YWl0IGV4ZWMoY29tbWFuZCwgYXJncywgeyBjd2Q6IHRoaXMud29ya2luZ0RpcmVjdG9yeSB9KTtcblxuICAgIGxvZ2dlci5pbmZvKFwiUGFja2FnZSBpbnN0YWxsZWQuXCIpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGlzTnBtVmVyc2lvbkF2YWlsYWJsZShcbiAgICBfcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgICBfcGFja2FnZVZlcnNpb246IHN0cmluZyxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gV2UgZ2V0IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSB2ZXJzaW9ucyBmcm9tIG5wbSwgbm8gbmVlZCB0byBjaGVjayBoZXJlXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxpc3RZYXJuUGFja2FnZXMoKTogUHJvbWlzZTxcbiAgICB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXVxuICA+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgZXhlYyhcInlhcm5cIiwgW1wibGlzdFwiLCBcIi0tanNvblwiXSwge1xuICAgICAgICBjd2Q6IHRoaXMud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIuZGVidWcoYExpc3RpbmcgeWFybiBwYWNrYWdlcyB1c2luZyBcInlhcm4gbGlzdCAtLWpzb25cIjogJHtzdGRvdXR9YCk7XG5cbiAgICAgIGNvbnN0IGpzb24gPSB5YXJuTGlzdFNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHN0ZG91dCkpO1xuXG4gICAgICByZXR1cm4gKGpzb24/LmRhdGE/LnRyZWVzIHx8IFtdKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChkZXA6IGFueSkgPT5cbiAgICAgICAgICAgIGRlcC5uYW1lLnN0YXJ0c1dpdGgoXCJAY2RrdGYvcHJvdmlkZXItXCIpIHx8XG4gICAgICAgICAgICBkZXAubmFtZS5zdGFydHNXaXRoKFwiQGNka3RuL3Byb3ZpZGVyLVwiKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChkZXA6IGFueSkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBgQCR7ZGVwLm5hbWUuc3BsaXQoXCJAXCIpWzFdfWAsXG4gICAgICAgICAgdmVyc2lvbjogZGVwLm5hbWUuc3BsaXQoXCJAXCIpWzJdLFxuICAgICAgICB9KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGluc3RhbGxlZCBwYWNrYWdlcyB1c2luZyAneWFybiBsaXN0IC0tanNvbic6ICR7ZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxpc3ROcG1QYWNrYWdlcygpOiBQcm9taXNlPFxuICAgIHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfVtdXG4gID4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCBleGVjKFwibnBtXCIsIFtcImxpc3RcIiwgXCItLWpzb25cIl0sIHtcbiAgICAgICAgY3dkOiB0aGlzLndvcmtpbmdEaXJlY3RvcnksXG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKGBMaXN0aW5nIG5wbSBwYWNrYWdlcyB1c2luZyBcIm5wbSBsaXN0IC0tanNvblwiOiAke3N0ZG91dH1gKTtcbiAgICAgIGNvbnN0IGpzb24gPSBucG1MaXN0U2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uoc3Rkb3V0KSk7XG5cbiAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhqc29uPy5kZXBlbmRlbmNpZXMgfHwge30pXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKFtkZXBOYW1lXSkgPT5cbiAgICAgICAgICAgIGRlcE5hbWUuc3RhcnRzV2l0aChcIkBjZGt0Zi9wcm92aWRlci1cIikgfHxcbiAgICAgICAgICAgIGRlcE5hbWUuc3RhcnRzV2l0aChcIkBjZGt0bi9wcm92aWRlci1cIiksXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoW25hbWUsIGRlcF0pID0+ICh7IG5hbWUsIHZlcnNpb246IGRlcC52ZXJzaW9uIH0pKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBkZXRlcm1pbmUgaW5zdGFsbGVkIHBhY2thZ2VzIHVzaW5nICducG0gbGlzdCAtLWpzb24nOiAke2V9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGxpc3RQcm92aWRlclBhY2thZ2VzKCk6IFByb21pc2U8XG4gICAgeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9W11cbiAgPiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzWWFybkxvY2tmaWxlKClcbiAgICAgID8gdGhpcy5saXN0WWFyblBhY2thZ2VzKClcbiAgICAgIDogdGhpcy5saXN0TnBtUGFja2FnZXMoKTtcbiAgfVxufVxuXG5jbGFzcyBQeXRob25QYWNrYWdlTWFuYWdlciBleHRlbmRzIFBhY2thZ2VNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBnZXQgYXBwQ29tbWFuZCgpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICBwYXRoLnJlc29sdmUodGhpcy53b3JraW5nRGlyZWN0b3J5LCBcImNka3RmLmpzb25cIiksXG4gICAgICAgICAgXCJ1dGY4XCIsXG4gICAgICAgICksXG4gICAgICApW1wiYXBwXCJdO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgRXJyb3JzLlVzYWdlKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgZmluZCBhbmQgcGFyc2UgY2RrdGYuanNvbiBpbiAke3RoaXMud29ya2luZ0RpcmVjdG9yeX1gLFxuICAgICAgICBlLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkUGFja2FnZShcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICAgIHBhY2thZ2VWZXJzaW9uPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1c2VQaXBlbnYgPSB0aGlzLmFwcENvbW1hbmQuaW5jbHVkZXMoXCJwaXBlbnZcIik7XG5cbiAgICBpZiAodXNlUGlwZW52KSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYEluc3RhbGxpbmcgcGFja2FnZSAke3BhY2thZ2VOYW1lfSBAICR7cGFja2FnZVZlcnNpb259IHVzaW5nIHBpcGVudi5gLFxuICAgICAgKTtcblxuICAgICAgYXdhaXQgZXhlYyhcInBpcGVudlwiLCBbXCJpbnN0YWxsXCIsIGAke3BhY2thZ2VOYW1lfX49JHtwYWNrYWdlVmVyc2lvbn1gXSwge1xuICAgICAgICBjd2Q6IHRoaXMud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgICAgUElQRU5WX1FVSUVUOiBcIjFcIixcbiAgICAgICAgfSxcbiAgICAgICAgc3RkaW86IFtcImluaGVyaXRcIiwgMSwgMV0sXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coXCJQYWNrYWdlIGluc3RhbGxlZC5cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgSW5zdGFsbGluZyBwYWNrYWdlICR7cGFja2FnZU5hbWV9IEAgJHtwYWNrYWdlVmVyc2lvbn0gdXNpbmcgcGlwLmAsXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZXF1aXJlbWVudHNGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgdGhpcy53b3JraW5nRGlyZWN0b3J5LFxuICAgICAgICBcInJlcXVpcmVtZW50cy50eHRcIixcbiAgICAgICk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVxdWlyZW1lbnRzRmlsZVBhdGgpKSB7XG4gICAgICAgIHRocm93IEVycm9ycy5Vc2FnZShcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgcmVxdWlyZW1lbnRzLnR4dCBpbiAke3RoaXMud29ya2luZ0RpcmVjdG9yeX1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXF1aXJlbWVudHMgPSBhd2FpdCBmcy5yZWFkRmlsZShyZXF1aXJlbWVudHNGaWxlUGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgY29uc3QgcmVxdWlyZW1lbnRMaW5lID0gcmVxdWlyZW1lbnRzXG4gICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAuZmluZCgobGluZSkgPT4gbGluZS5pbmNsdWRlcyhwYWNrYWdlTmFtZSkpO1xuXG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBSZWFkIHJlcXVpcmVtZW50cy50eHQgZmlsZSBhbmQgZm91bmQgbGluZSBpbmNsdWRpbmcgJHtwYWNrYWdlTmFtZX06ICR7cmVxdWlyZW1lbnRMaW5lfWAsXG4gICAgICApO1xuXG4gICAgICBpZiAocmVxdWlyZW1lbnRMaW5lKSB7XG4gICAgICAgIGlmIChwYWNrYWdlVmVyc2lvbiA/IHJlcXVpcmVtZW50TGluZS5pbmNsdWRlcyhwYWNrYWdlVmVyc2lvbikgOiB0cnVlKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICBgUGFja2FnZSAke3BhY2thZ2VOYW1lfSBhbHJlYWR5IGluc3RhbGxlZC4gU2tpcHBpbmcgaW5zdGFsbGF0aW9uLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYEZvdW5kIHRoZSBwYWNrYWdlIGJ1dCB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24sIGNvbnRpbnVpbmdgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3UmVxdWlyZW1lbnRzID1cbiAgICAgICAgcmVxdWlyZW1lbnRzXG4gICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gIWxpbmUuc3RhcnRzV2l0aChwYWNrYWdlTmFtZSkpXG4gICAgICAgICAgLmpvaW4oXCJcXG5cIikgK1xuICAgICAgICBgXFxuJHtwYWNrYWdlTmFtZX0ke3BhY2thZ2VWZXJzaW9uID8gYH49JHtwYWNrYWdlVmVyc2lvbn1gIDogXCJcIn1gO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHJlcXVpcmVtZW50c0ZpbGVQYXRoLCBuZXdSZXF1aXJlbWVudHMsIFwidXRmOFwiKTtcblxuICAgICAgYXdhaXQgZXhlYyhcInBpcFwiLCBbXCJpbnN0YWxsXCIsIFwiLXJcIiwgXCJyZXF1aXJlbWVudHMudHh0XCJdLCB7XG4gICAgICAgIGN3ZDogdGhpcy53b3JraW5nRGlyZWN0b3J5LFxuICAgICAgICBzdGRpbzogW1wiaW5oZXJpdFwiLCAxLCAxXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zb2xlLmxvZyhcIlBhY2thZ2UgaW5zdGFsbGVkLlwiKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaXNOcG1WZXJzaW9uQXZhaWxhYmxlKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcGFja2FnZVZlcnNpb246IHN0cmluZyxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYENoZWNraW5nIGlmICR7cGFja2FnZU5hbWV9QCR7cGFja2FnZVZlcnNpb259IGlzIGF2YWlsYWJsZSBmb3IgUHl0aG9uYCxcbiAgICApO1xuICAgIGNvbnN0IHVybCA9IGBodHRwczovL3B5cGkub3JnL3B5cGkvJHtwYWNrYWdlTmFtZX0vJHtwYWNrYWdlVmVyc2lvbn0vanNvbmA7XG4gICAgbG9nZ2VyLmRlYnVnKGBGZXRjaGluZyBwYWNrYWdlIGluZm9ybWF0aW9uIGZvciAke3BhY2thZ2VOYW1lfSBmcm9tICR7dXJsfWApO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeSh1cmwpO1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IEhUVFBfTk9UX0ZPVU5EKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYFB5UEkgcmVwb3J0cyAke3BhY2thZ2VOYW1lfUAke3BhY2thZ2VWZXJzaW9ufSBub3QgZm91bmRgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgYW55O1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBHb3QgcmVzcG9uc2UgZnJvbSBQeVBJIGZvciAke3BhY2thZ2VOYW1lfUAke3BhY2thZ2VWZXJzaW9ufTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAganNvbixcbiAgICAgICl9YCxcbiAgICApO1xuXG4gICAgcmV0dXJuIEJvb2xlYW4oanNvbi5pbmZvKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsaXN0UGlwZW52UGFja2FnZXMoKTogUHJvbWlzZTxcbiAgICB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXVxuICA+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgZXhlYyhcbiAgICAgICAgXCJwaXBlbnZcIixcbiAgICAgICAgW1wicnVuXCIsIFwicGlwXCIsIFwibGlzdFwiLCBcIi0tZm9ybWF0PWpzb25cIl0sXG4gICAgICAgIHtcbiAgICAgICAgICBjd2Q6IHRoaXMud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBMaXN0aW5nIHBpcGVudiBwYWNrYWdlcyB1c2luZyBcInBpcGVudiBydW4gcGlwIGxpc3QgLS1mb3JtYXQ9anNvblwiOiAke3N0ZG91dH1gLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgbGlzdCA9IHBpcFBhY2thZ2VTY2hlbWEucGFyc2UoSlNPTi5wYXJzZShzdGRvdXQpKTtcbiAgICAgIHJldHVybiBsaXN0LmZpbHRlcihcbiAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgaXRlbS5uYW1lLnN0YXJ0c1dpdGgoXCJjZGt0Zi1jZGt0Zi1wcm92aWRlclwiKSB8fFxuICAgICAgICAgIGl0ZW0ubmFtZS5zdGFydHNXaXRoKFwiY2RrdG4tcHJvdmlkZXJcIiksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGRldGVybWluZSBpbnN0YWxsZWQgcGFja2FnZXMgdXNpbmcgJ3BpcGVudiBydW4gcGlwIGxpc3QgLS1mb3JtYXQ9anNvbic6ICR7ZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbGlzdFBpcFBhY2thZ2VzKCk6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9W10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgZXhlYyhcInBpcFwiLCBbXCJsaXN0XCIsIFwiLS1mb3JtYXQ9anNvblwiXSwge1xuICAgICAgICBjd2Q6IHRoaXMud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgTGlzdGluZyBwaXAgcGFja2FnZXMgdXNpbmcgXCJwaXAgbGlzdCAtLWZvcm1hdD1qc29uXCI6ICR7c3Rkb3V0fWAsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBsaXN0ID0gcGlwUGFja2FnZVNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHN0ZG91dCkpO1xuICAgICAgcmV0dXJuIGxpc3QuZmlsdGVyKFxuICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICBpdGVtLm5hbWUuc3RhcnRzV2l0aChcImNka3RmLWNka3RmLXByb3ZpZGVyXCIpIHx8XG4gICAgICAgICAgaXRlbS5uYW1lLnN0YXJ0c1dpdGgoXCJjZGt0bi1wcm92aWRlclwiKSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGluc3RhbGxlZCBwYWNrYWdlcyB1c2luZyAncGlwIGxpc3QgLS1mb3JtYXQ9anNvbic6ICR7ZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbGlzdFByb3ZpZGVyUGFja2FnZXMoKTogUHJvbWlzZTxcbiAgICB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXVxuICA+IHtcbiAgICByZXR1cm4gdGhpcy5hcHBDb21tYW5kLmluY2x1ZGVzKFwicGlwZW52XCIpXG4gICAgICA/IHRoaXMubGlzdFBpcGVudlBhY2thZ2VzKClcbiAgICAgIDogdGhpcy5saXN0UGlwUGFja2FnZXMoKTtcbiAgfVxufVxuXG5jbGFzcyBOdWdldFBhY2thZ2VNYW5hZ2VyIGV4dGVuZHMgUGFja2FnZU1hbmFnZXIge1xuICBwdWJsaWMgYXN5bmMgYWRkUGFja2FnZShcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICAgIHBhY2thZ2VWZXJzaW9uPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb21tYW5kID0gXCJkb3RuZXRcIjtcbiAgICBjb25zdCBhcmdzID0gW1wiYWRkXCIsIFwicGFja2FnZVwiLCBwYWNrYWdlTmFtZV07XG4gICAgaWYgKHBhY2thZ2VWZXJzaW9uKSB7XG4gICAgICBhcmdzLnB1c2goXCItLXZlcnNpb25cIiwgcGFja2FnZVZlcnNpb24pO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBJbnN0YWxsaW5nIHBhY2thZ2UgJHtwYWNrYWdlTmFtZX0gQCAke3BhY2thZ2VWZXJzaW9ufSB1c2luZyBcIiR7Y29tbWFuZH0gJHthcmdzLmpvaW4oXG4gICAgICAgIFwiIFwiLFxuICAgICAgKX1cIi5gLFxuICAgICk7XG5cbiAgICBhd2FpdCBleGVjKGNvbW1hbmQsIGFyZ3MsIHsgY3dkOiB0aGlzLndvcmtpbmdEaXJlY3RvcnkgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhcIlBhY2thZ2UgaW5zdGFsbGVkLlwiKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpc05wbVZlcnNpb25BdmFpbGFibGUoXG4gICAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgICBwYWNrYWdlVmVyc2lvbjogc3RyaW5nLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsb2dnZXIuZGVidWcoYENoZWNraW5nIGlmICR7cGFja2FnZU5hbWV9QCR7cGFja2FnZVZlcnNpb259IGlzIGF2YWlsYWJsZWApO1xuXG4gICAgY29uc3QgW293bmVyLCAuLi5yZXN0XSA9IHBhY2thZ2VOYW1lLnNwbGl0KFwiLlwiKTtcbiAgICBjb25zdCBmaXhlZE93bmVyID0gcGFja2FnZU5hbWUuc3RhcnRzV2l0aChcIklvLkNka3RuXCIpID8gXCJjZGt0blwiIDogb3duZXI7XG4gICAgY29uc3QgaWQgPSByZXN0W3Jlc3QubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vYXp1cmVzZWFyY2gtdXNuYy5udWdldC5vcmcvcXVlcnk/cT1vd25lcjoke2ZpeGVkT3duZXJ9JTIwaWQ6JHtpZH0mcHJlcmVsZWFzZT1mYWxzZSZzZW1WZXJMZXZlbD0yLjAuMGA7XG4gICAgbG9nZ2VyLmRlYnVnKGBGZXRjaGluZyBwYWNrYWdlIG1ldGFkYXRhIGZyb20gTnVnZXQ6ICcke3VybH0nYCk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoV2l0aFJldHJ5KHVybCk7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gSFRUUF9OT1RfRk9VTkQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgTnVHZXQgcmVwb3J0cyAke3BhY2thZ2VOYW1lfUAke3BhY2thZ2VWZXJzaW9ufSBub3QgZm91bmRgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QganNvbiA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgIGRhdGE6IHsgaWQ6IHN0cmluZzsgdmVyc2lvbnM6IHsgdmVyc2lvbjogc3RyaW5nIH1bXSB9W107XG4gICAgfTtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgR290IHJlc3BvbnNlIGZyb20gTnVHZXQgZm9yICR7cGFja2FnZU5hbWV9IDogJHtKU09OLnN0cmluZ2lmeShqc29uKX1gLFxuICAgICk7XG5cbiAgICBpZiAoIWpzb24/LmRhdGE/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyBObyBwYWNrYWdlIGZvdW5kXG4gICAgfVxuXG4gICAgY29uc3QgcGFja2FnZVZlcnNpb25zID1cbiAgICAgIGpzb24uZGF0YS5maW5kKChwKSA9PiBwLmlkID09PSBwYWNrYWdlTmFtZSk/LnZlcnNpb25zID8/IFtdO1xuXG4gICAgaWYgKCFwYWNrYWdlVmVyc2lvbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIE5vIHBhY2thZ2UgcmVsZWFzZSBtYXRjaGluZyB0aGUgaWQgZm91bmRcbiAgICB9XG5cbiAgICByZXR1cm4gcGFja2FnZVZlcnNpb25zLnNvbWUoKHYpID0+IHYudmVyc2lvbiA9PT0gcGFja2FnZVZlcnNpb24pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxpc3RQcm92aWRlclBhY2thZ2VzKCk6IFByb21pc2U8XG4gICAgeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9W11cbiAgPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IGV4ZWMoXCJkb3RuZXRcIiwgW1wibGlzdFwiLCBcInBhY2thZ2VcIl0sIHtcbiAgICAgICAgY3dkOiB0aGlzLndvcmtpbmdEaXJlY3RvcnksXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYExpc3RpbmcgbnVnZXQgcGFja2FnZXMgdXNpbmcgXCJkb3RuZXQgbGlzdCBwYWNrYWdlXCI6ICR7c3Rkb3V0fWAsXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZWdleCA9XG4gICAgICAgIC9eXFxzKj5cXHMoKD86SGFzaGlDb3JwXFwuQ2RrdGZ8SW9cXC5DZGt0bilcXC5Qcm92aWRlcnNcXC5bXFx3Ll0rKVxccysoKD86XFxkK1xcLil7Mn1cXGQrKD86LVxcUyspPylcXHMrKCg/OlxcZCtcXC4pezJ9XFxkKyg/Oi1cXFMrKT8pXFxzKiQvO1xuXG4gICAgICByZXR1cm4gc3Rkb3V0XG4gICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAubWFwKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAvLyBFeGFtcGxlIG91dHB1dDpcbiAgICAgICAgICAvLyBQcm9qZWN0ICdNeVRlcnJhZm9ybVN0YWNrJyBoYXMgdGhlIGZvbGxvd2luZyBwYWNrYWdlIHJlZmVyZW5jZXNcbiAgICAgICAgICAvLyAgW25ldDYuMF06XG4gICAgICAgICAgLy8gIFRvcC1sZXZlbCBQYWNrYWdlICAgICAgUmVxdWVzdGVkICAgUmVzb2x2ZWRcbiAgICAgICAgICAvLyAgPiBIYXNoaUNvcnAuQ2RrdGYgICAgICAwLjAuMCAgICAgICAwLjAuMFxuICAgICAgICAgIC8vIG1hdGNoWzBdID0gZnVsbCBtYXRjaFxuICAgICAgICAgIC8vIG1hdGNoWzFdID0gcGFja2FnZSBuYW1lXG4gICAgICAgICAgLy8gbWF0Y2hbMl0gPSByZXF1ZXN0ZWQgdmVyc2lvblxuICAgICAgICAgIC8vIG1hdGNoWzNdID0gcmVzb2x2ZWQgdmVyc2lvblxuICAgICAgICAgIHJldHVybiByZWdleC5leGVjKGxpbmUpO1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChtYXRjaCkgPT4gISFtYXRjaClcbiAgICAgICAgLm1hcCgobWF0Y2gpID0+ICh7IG5hbWU6IG1hdGNoIVsxXSwgdmVyc2lvbjogbWF0Y2ghWzNdIH0pKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBkZXRlcm1pbmUgaW5zdGFsbGVkIHBhY2thZ2VzIHVzaW5nICdkb3RuZXQgbGlzdCBwYWNrYWdlJzogJHtlfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNoYXJlZCBiYXNlIGZvciB0aGUgSmF2YSBwYWNrYWdlIG1hbmFnZXJzIChNYXZlbiBhbmQgR3JhZGxlKS4gQm90aCBpbnN0YWxsIGZyb20gTWF2ZW4gQ2VudHJhbCwgc28gdGhlIGNoZWNrIGZvclxuICogd2hldGhlciBhIGdpdmVuIHByb3ZpZGVyIHZlcnNpb24gZXhpc3RzIGlzIGNvbW1vbiB0byBib3RoIGFuZCBsaXZlcyBoZXJlOyB0aGUgY29uY3JldGUgc3ViY2xhc3NlcyBkaWZmZXIgb25seSBpbiBob3dcbiAqIHRoZXkgZGVjbGFyZSBhbmQgbGlzdCBkZXBlbmRlbmNpZXMgKHBvbS54bWwgdnMgYnVpbGQuZ3JhZGxlKS5cbiAqL1xuYWJzdHJhY3QgY2xhc3MgSmF2YVBhY2thZ2VNYW5hZ2VyIGV4dGVuZHMgUGFja2FnZU1hbmFnZXIge1xuICAvKipcbiAgICogUmVwb3J0cyB3aGV0aGVyIGBwYWNrYWdlTmFtZUBwYWNrYWdlVmVyc2lvbmAgaXMgcHVibGlzaGVkIG9uIE1hdmVuIENlbnRyYWwgYnkgcHJvYmluZyB0aGUgYXJ0aWZhY3QgcmVwb3NpdG9yeSBmb3JcbiAgICogdGhlIHZlcnNpb24ncyBgLnBvbWAgZGlyZWN0bHk6IEhUVFAgMjAwIG1lYW5zIHByZXNlbnQsIGFueXRoaW5nIGVsc2UgbWVhbnMgbm90IGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHBhY2thZ2VOYW1lIC0gVGhlIEphdmEgY29vcmRpbmF0ZXMgaW4gXCJncm91cC5hcnRpZmFjdFwiIGZvcm0sIGUuZy4gXCJjb20uaGFzaGljb3JwLmNka3RmLXByb3ZpZGVyLXJhbmRvbVwiLlxuICAgKiBAcGFyYW0gcGFja2FnZVZlcnNpb24gLSBUaGUgZXhhY3QgdmVyc2lvbiB0byBjaGVjayBmb3IuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYC5wb21gIGV4aXN0cyBvbiBNYXZlbiBDZW50cmFsLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICogQHRocm93cyBJZiBgcGFja2FnZU5hbWVgIGlzIG5vdCBpbiB0aGUgZXhwZWN0ZWQgXCJncm91cC5hcnRpZmFjdFwiIGZvcm1hdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpc05wbVZlcnNpb25BdmFpbGFibGUoXG4gICAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgICBwYWNrYWdlVmVyc2lvbjogc3RyaW5nLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsb2dnZXIuZGVidWcoYENoZWNraW5nIGlmICR7cGFja2FnZU5hbWV9QCR7cGFja2FnZVZlcnNpb259IGlzIGF2YWlsYWJsZWApO1xuXG4gICAgY29uc3QgcGFydHMgPSBwYWNrYWdlTmFtZS5zcGxpdChcIi5cIik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgRXJyb3JzLkludGVybmFsKFxuICAgICAgICBgRXhwZWN0ZWQgcGFja2FnZSBuYW1lIHRvIGJlIGluIGZvcm1hdCBcImdyb3VwLmFydGlmYWN0XCIsIGUuZy4gXCJjb20uaGFzaGljb3JwLmNka3RmLXByb3ZpZGVyLWdvb2dsZVwiLCBnb3Q6ICR7cGFja2FnZU5hbWV9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYXJ0aWZhY3RJZCA9IHBhcnRzLnBvcCgpO1xuICAgIGNvbnN0IGdyb3VwSWQgPSBwYXJ0cy5qb2luKFwiLlwiKTtcblxuICAgIC8vIFByb2JlIHRoZSBhcnRpZmFjdCBDRE4gZGlyZWN0bHkgZm9yIHRoZSAucG9tOiAyMDAgPSBwcmVzZW50LCBhbnl0aGluZyBlbHNlID0gbm90IGF2YWlsYWJsZS5cbiAgICBjb25zdCBncm91cFBhdGggPSBncm91cElkLnJlcGxhY2UoL1xcLi9nLCBcIi9cIik7XG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMi8ke2dyb3VwUGF0aH0vJHthcnRpZmFjdElkfS8ke3BhY2thZ2VWZXJzaW9ufS8ke2FydGlmYWN0SWR9LSR7cGFja2FnZVZlcnNpb259LnBvbWA7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYENoZWNraW5nIHdoZXRoZXIgJHtwYWNrYWdlTmFtZX1AJHtwYWNrYWdlVmVyc2lvbn0gZXhpc3RzIG9uIE1hdmVuIENlbnRyYWwgdW5kZXIgJyR7dXJsfSdgLFxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeSh1cmwpO1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IEhUVFBfTk9UX0ZPVU5EKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBNYXZlbiBDZW50cmFsIHJlcG9ydHMgJHtwYWNrYWdlTmFtZX1AJHtwYWNrYWdlVmVyc2lvbn0gbm90IGZvdW5kYCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBNYXZlbiBDZW50cmFsIHJlc3BvbmRlZCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSBmb3IgJHtwYWNrYWdlTmFtZX1AJHtwYWNrYWdlVmVyc2lvbn1gLFxuICAgICk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2Uub2s7XG4gIH1cbn1cblxuY2xhc3MgTWF2ZW5QYWNrYWdlTWFuYWdlciBleHRlbmRzIEphdmFQYWNrYWdlTWFuYWdlciB7XG4gIHB1YmxpYyBhc3luYyBhZGRQYWNrYWdlKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcGFja2FnZVZlcnNpb24gPSBcIkxBVEVTVFwiLCAvLyB0aGUgbGF0ZXN0IG9wdGlvbiBpcyBkZXByZWNhdGVkIGluIG1hdmVuIDMuNVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZyhgQWRkaW5nICR7cGFja2FnZU5hbWV9IEAgJHtwYWNrYWdlVmVyc2lvbn0gdG8gcG9tLnhtbGApO1xuICAgIC8vIEFzc2VydCBwb20ueG1sIGV4aXN0c1xuICAgIGNvbnN0IHBvbVBhdGggPSBwYXRoLmpvaW4odGhpcy53b3JraW5nRGlyZWN0b3J5LCBcInBvbS54bWxcIik7XG4gICAgaWYgKCFleGlzdHNTeW5jKHBvbVBhdGgpKSB7XG4gICAgICB0aHJvdyBFcnJvcnMuVXNhZ2UoXG4gICAgICAgIFwiTm8gcG9tLnhtbCBmb3VuZCBpbiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBQbGVhc2UgcnVuIHRoZSBjb21tYW5kIGZyb20gdGhlIHJvb3Qgb2YgeW91ciBwcm9qZWN0LlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb20gPSBhd2FpdCBmcy5yZWFkRmlsZShwb21QYXRoLCBcInV0ZjhcIik7XG4gICAgY29uc3QgcG9tWG1sID0gKGF3YWl0IHhtbDJqcyhwb20sIHt9KSkgYXMgRWxlbWVudDtcblxuICAgIC8vIE11dGF0ZSBkZXBlbmRlbmNpZXNcbiAgICBjb25zdCBuYW1lUGFydHMgPSBwYWNrYWdlTmFtZS5zcGxpdChcIi5cIik7XG4gICAgY29uc3QgZ3JvdXBJZCA9IG5hbWVQYXJ0cy5zbGljZSgwLCBuYW1lUGFydHMubGVuZ3RoIC0gMSkuam9pbihcIi5cIik7XG4gICAgY29uc3QgYXJ0aWZhY3RJZCA9IG5hbWVQYXJ0c1tuYW1lUGFydHMubGVuZ3RoIC0gMV07XG5cbiAgICBjb25zdCBuZXdEZXBlbmRlbmN5ID0gKGF3YWl0IHhtbDJqcyhcbiAgICAgIGA8ZGVwZW5kZW5jeT5cbiAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPlxuICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+XG4gICAgPHZlcnNpb24+JHtwYWNrYWdlVmVyc2lvbn08L3ZlcnNpb24+XG48L2RlcGVuZGVuY3k+YCxcbiAgICApKSBhcyBFbGVtZW50O1xuXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gcG9tWG1sLmVsZW1lbnRzXG4gICAgICA/LmZpbmQoKGVsKSA9PiBlbC5uYW1lID09PSBcInByb2plY3RcIilcbiAgICAgID8uZWxlbWVudHM/LmZpbmQoKGVsKSA9PiBlbC5uYW1lID09PSBcImRlcGVuZGVuY2llc1wiKTtcblxuICAgIGlmICghZGVwZW5kZW5jaWVzKSB7XG4gICAgICB0aHJvdyBFcnJvcnMuVXNhZ2UoYENvdWxkIG5vdCBmaW5kIGRlcGVuZGVuY2llcyBzZWN0aW9uIGluIHRoZSBwb20ueG1sYCk7XG4gICAgfVxuICAgIGRlcGVuZGVuY2llcy5lbGVtZW50cyA9IChkZXBlbmRlbmNpZXM/LmVsZW1lbnRzIHx8IFtdKS5maWx0ZXIoXG4gICAgICAoZWwpID0+XG4gICAgICAgIGVsLmVsZW1lbnRzPy5zb21lKFxuICAgICAgICAgIChncm91cCkgPT5cbiAgICAgICAgICAgIGdyb3VwLm5hbWUgPT09IFwiZ3JvdXBJZFwiICYmIGdyb3VwLmVsZW1lbnRzPy5bMF0udGV4dCAhPT0gZ3JvdXBJZCxcbiAgICAgICAgKSB8fFxuICAgICAgICBlbC5lbGVtZW50cz8uc29tZShcbiAgICAgICAgICAoYXJ0aWZhY3QpID0+XG4gICAgICAgICAgICBhcnRpZmFjdC5uYW1lID09PSBcImFydGlmYWN0SWRcIiAmJlxuICAgICAgICAgICAgYXJ0aWZhY3QuZWxlbWVudHM/LlswXS50ZXh0ICE9PSBhcnRpZmFjdElkLFxuICAgICAgICApLFxuICAgICk7XG4gICAgZGVwZW5kZW5jaWVzPy5lbGVtZW50cz8ucHVzaChuZXdEZXBlbmRlbmN5LmVsZW1lbnRzIVswXSk7XG5cbiAgICAvLyBXcml0ZSBuZXcgcG9tLnhtbFxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwb21QYXRoLCBqczJ4bWwocG9tWG1sLCB7IHNwYWNlczogMiB9KSk7XG5cbiAgICAvLyBJbnN0YWxsXG4gICAgYXdhaXQgZXhlYyhcIm12blwiLCBbXCJpbnN0YWxsXCJdLCB7IGN3ZDogdGhpcy53b3JraW5nRGlyZWN0b3J5IH0pO1xuICAgIGNvbnNvbGUubG9nKFwiUGFja2FnZSBpbnN0YWxsZWQuXCIpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxpc3RQcm92aWRlclBhY2thZ2VzKCk6IFByb21pc2U8XG4gICAgeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9W11cbiAgPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBvbVBhdGggPSBwYXRoLmpvaW4odGhpcy53b3JraW5nRGlyZWN0b3J5LCBcInBvbS54bWxcIik7XG4gICAgICBpZiAoIWV4aXN0c1N5bmMocG9tUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JzLlVzYWdlKFxuICAgICAgICAgIFwiTm8gcG9tLnhtbCBmb3VuZCBpbiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBQbGVhc2UgcnVuIHRoZSBjb21tYW5kIGZyb20gdGhlIHJvb3Qgb2YgeW91ciBwcm9qZWN0LlwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwb20gPSBhd2FpdCBmcy5yZWFkRmlsZShwb21QYXRoLCBcInV0ZjhcIik7XG4gICAgICBjb25zdCBwb21YbWwgPSAoYXdhaXQgeG1sMmpzKHBvbSwge30pKSBhcyBFbGVtZW50O1xuXG4gICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPVxuICAgICAgICBwb21YbWwuZWxlbWVudHNcbiAgICAgICAgICA/LmZpbmQoKGVsKSA9PiBlbC5uYW1lID09PSBcInByb2plY3RcIilcbiAgICAgICAgICA/LmVsZW1lbnRzPy5maW5kKChlbCkgPT4gZWwubmFtZSA9PT0gXCJkZXBlbmRlbmNpZXNcIik/LmVsZW1lbnRzID8/IFtdO1xuXG4gICAgICByZXR1cm4gZGVwZW5kZW5jaWVzXG4gICAgICAgIC5tYXAoKGRlcCkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBgJHtcbiAgICAgICAgICAgIGRlcC5lbGVtZW50cz8uZmluZCgoZWwpID0+IGVsLm5hbWUgPT09IFwiZ3JvdXBJZFwiKT8uZWxlbWVudHM/LlswXVxuICAgICAgICAgICAgICAudGV4dFxuICAgICAgICAgIH0uJHtcbiAgICAgICAgICAgIGRlcC5lbGVtZW50cz8uZmluZCgoZWwpID0+IGVsLm5hbWUgPT09IFwiYXJ0aWZhY3RJZFwiKT8uZWxlbWVudHM/LlswXVxuICAgICAgICAgICAgICAudGV4dFxuICAgICAgICAgIH1gLFxuICAgICAgICAgIHZlcnNpb246IGRlcC5lbGVtZW50cz8uZmluZCgoZWwpID0+IGVsLm5hbWUgPT09IFwidmVyc2lvblwiKVxuICAgICAgICAgICAgPy5lbGVtZW50cz8uWzBdLnRleHQgYXMgc3RyaW5nLFxuICAgICAgICB9KSlcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoZGVwKSA9PlxuICAgICAgICAgICAgZGVwLm5hbWUuc3RhcnRzV2l0aChcImNvbS5oYXNoaWNvcnAuY2RrdGYtcHJvdmlkZXItXCIpIHx8XG4gICAgICAgICAgICBkZXAubmFtZS5zdGFydHNXaXRoKFwiaW8uY2RrdG4uY2RrdG4tcHJvdmlkZXItXCIpLFxuICAgICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGRldGVybWluZSBpbnN0YWxsZWQgcGFja2FnZXMgcmVhZGluZyB0aGUgcG9tLnhtbDogJHtlLm1lc3NhZ2V9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEdyYWRsZVBhY2thZ2VNYW5hZ2VyIGV4dGVuZHMgSmF2YVBhY2thZ2VNYW5hZ2VyIHtcbiAgcHVibGljIHN0YXRpYyBpc0dyYWRsZVByb2plY3Qod29ya2luZ0RpcmVjdG9yeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzR3JhZGxlUHJvamVjdCh3b3JraW5nRGlyZWN0b3J5KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGRQYWNrYWdlKFxuICAgIHBhY2thZ2VGUU46IHN0cmluZyxcbiAgICBwYWNrYWdlVmVyc2lvbiA9IFwibGF0ZXN0LnJlbGVhc2VcIixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYnVpbGRHcmFkbGVQYXRoID0gcGF0aC5qb2luKHRoaXMud29ya2luZ0RpcmVjdG9yeSwgXCJidWlsZC5ncmFkbGVcIik7XG4gICAgY29uc3QgYnVpbGRHcmFkbGUgPSBhd2FpdCBmcy5yZWFkRmlsZShidWlsZEdyYWRsZVBhdGgsIFwidXRmOFwiKTtcbiAgICBjb25zdCBidWlsZEdyYWRsZUxpbmVzID0gYnVpbGRHcmFkbGUuc3BsaXQoL1xccj9cXG4vKTtcblxuICAgIGNvbnN0IGRlcGVuZGVuY2llc1JlZ2V4ID0gL2RlcGVuZGVuY2llc1xccytcXHsvaTtcbiAgICBjb25zdCBkZXBlbmRlbmN5QmxvY2tTdGFydCA9IGJ1aWxkR3JhZGxlTGluZXMuZmluZEluZGV4KChsaW5lKSA9PlxuICAgICAgZGVwZW5kZW5jaWVzUmVnZXgudGVzdChsaW5lKSxcbiAgICApO1xuICAgIGlmIChkZXBlbmRlbmN5QmxvY2tTdGFydCA9PT0gLTEpIHtcbiAgICAgIHRocm93IEVycm9ycy5Vc2FnZShcbiAgICAgICAgXCJDb3VsZCBub3QgZmluZCBkZXBlbmRlbmNpZXMgc2VjdGlvbiBpbiB0aGUgYnVpbGQuZ3JhZGxlXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhY2thZ2VTZWdtZW50cyA9IHBhY2thZ2VGUU4uc3BsaXQoXCIuXCIpO1xuICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gcGFja2FnZVNlZ21lbnRzLnBvcCgpO1xuICAgIGNvbnN0IGdyb3VwTmFtZSA9IHBhY2thZ2VTZWdtZW50cy5qb2luKFwiLlwiKTtcbiAgICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVyID0gYCR7Z3JvdXBOYW1lfToke3BhY2thZ2VOYW1lfWA7XG4gICAgY29uc3QgZGVwZW5kZW5jeUFuZFZlcnNpb25TcGVjaWZpZXIgPSBgJHtkZXBlbmRlbmN5U3BlY2lmaWVyfToke3BhY2thZ2VWZXJzaW9ufWA7XG5cbiAgICBjb25zdCBleGlzdGluZ0RlcGVuZGVuY3kgPSBidWlsZEdyYWRsZUxpbmVzLmZpbmRJbmRleCgobGluZSkgPT5cbiAgICAgIGxpbmUuaW5jbHVkZXMoZGVwZW5kZW5jeVNwZWNpZmllciksXG4gICAgKTtcbiAgICBpZiAoZXhpc3RpbmdEZXBlbmRlbmN5ICE9PSAtMSkge1xuICAgICAgYnVpbGRHcmFkbGVMaW5lcy5zcGxpY2UoZXhpc3RpbmdEZXBlbmRlbmN5LCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQYWNrYWdlRGVwZW5kZW5jeSA9IGBcXHRpbXBsZW1lbnRhdGlvbiAnJHtkZXBlbmRlbmN5QW5kVmVyc2lvblNwZWNpZmllcn0nYDtcbiAgICBidWlsZEdyYWRsZUxpbmVzLnNwbGljZShkZXBlbmRlbmN5QmxvY2tTdGFydCArIDEsIDAsIG5ld1BhY2thZ2VEZXBlbmRlbmN5KTtcblxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShidWlsZEdyYWRsZVBhdGgsIGJ1aWxkR3JhZGxlTGluZXMuam9pbihcIlxcblwiKSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbGlzdFByb3ZpZGVyUGFja2FnZXMoKTogUHJvbWlzZTxcbiAgICB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXVxuICA+IHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBhd2FpdCBnZXRHcmFkbGVEZXBlbmRlbmNpZXMoKTtcbiAgICBpZiAoIWRlcGVuZGVuY2llcykge1xuICAgICAgdGhyb3cgRXJyb3JzLlVzYWdlKFwiQ291bGQgbm90IGZpbmQgYW55IGRlcGVuZGVuY2llc1wiKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXBlbmRlbmN5TGlzdCA9IGRlcGVuZGVuY2llc1xuICAgICAgLm1hcCgobGluZSkgPT4gZ2V0RGVwZW5kZW5jeUluZm9ybWF0aW9uRnJvbUxpbmUobGluZSkpXG4gICAgICAuZmlsdGVyKChkZXApID0+IHtcbiAgICAgICAgaWYgKCFkZXApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBkZXAubmFtZS5pbmNsdWRlcyhcImNka3RmLXByb3ZpZGVyLVwiKSB8fFxuICAgICAgICAgIGRlcC5uYW1lLmluY2x1ZGVzKFwiY2RrdG4tcHJvdmlkZXItXCIpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoZGVwKSA9PiAoe1xuICAgICAgICBuYW1lOiBgJHtkZXAhLmdyb3VwfS4ke2RlcCEubmFtZX1gLFxuICAgICAgICB2ZXJzaW9uOiBkZXAhLnZlcnNpb24sXG4gICAgICB9KSk7XG5cbiAgICByZXR1cm4gZGVwZW5kZW5jeUxpc3Q7XG4gIH1cbn1cblxuY2xhc3MgR29QYWNrYWdlTWFuYWdlciBleHRlbmRzIFBhY2thZ2VNYW5hZ2VyIHtcbiAgcHVibGljIGFzeW5jIGFkZFBhY2thZ2UoXG4gICAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgICBwYWNrYWdlVmVyc2lvbj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coYEFkZGluZyBwYWNrYWdlICR7cGFja2FnZU5hbWV9IEAgJHtwYWNrYWdlVmVyc2lvbn1gKTtcblxuICAgIGNvbnN0IG1ham9yVmVyc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkID0gcGFja2FnZVZlcnNpb25cbiAgICAgID8gc2VtdmVyLm1ham9yKHBhY2thZ2VWZXJzaW9uKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgdmVyc2lvblBhY2thZ2VTdWZmaXggPSBcIlwiO1xuICAgIGlmICh0eXBlb2YgbWFqb3JWZXJzaW9uID09PSBcIm51bWJlclwiICYmIG1ham9yVmVyc2lvbiA+IDEpIHtcbiAgICAgIHZlcnNpb25QYWNrYWdlU3VmZml4ID0gYC92JHttYWpvclZlcnNpb259YDtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgUnVubmluZyAnZ28gZ2V0ICR7cGFja2FnZU5hbWV9JHt2ZXJzaW9uUGFja2FnZVN1ZmZpeH1AdiR7cGFja2FnZVZlcnNpb259J2AsXG4gICAgKTtcbiAgICAvLyBJbnN0YWxsXG4gICAgYXdhaXQgZXhlYyhcbiAgICAgIFwiZ29cIixcbiAgICAgIFtcImdldFwiLCBgJHtwYWNrYWdlTmFtZX0ke3ZlcnNpb25QYWNrYWdlU3VmZml4fUB2JHtwYWNrYWdlVmVyc2lvbn1gXSxcbiAgICAgIHtcbiAgICAgICAgY3dkOiB0aGlzLndvcmtpbmdEaXJlY3RvcnksXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zb2xlLmxvZyhcIlBhY2thZ2UgaW5zdGFsbGVkLlwiKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpc05wbVZlcnNpb25BdmFpbGFibGUoXG4gICAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgICBwYWNrYWdlVmVyc2lvbjogc3RyaW5nLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsb2dnZXIuZGVidWcoYENoZWNraW5nIGlmICR7cGFja2FnZU5hbWV9QCR7cGFja2FnZVZlcnNpb259IGlzIGF2YWlsYWJsZWApO1xuXG4gICAgLy8gZS5nLiBnaXRodWIuY29tL2Nka3RmL2Nka3RmLXByb3ZpZGVyLWdvb2dsZS1nby9nb29nbGVcbiAgICBjb25zdCBwYXJ0cyA9IHBhY2thZ2VOYW1lLnNwbGl0KFwiL1wiKTtcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSA0KSB7XG4gICAgICB0aHJvdyBFcnJvcnMuSW50ZXJuYWwoXG4gICAgICAgIGBFeHBlY3RpbmcgR28gcGFja2FnZSBuYW1lIHRvIGJlIGluIHRoZSBmb3JtYXQgb2YgZ2l0aHViLmNvbS88b3JnPi88cmVwbz4vPHBhY2thZ2U+LCBnb3QgJHtwYWNrYWdlTmFtZX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmcgPSBwYXJ0c1sxXTtcbiAgICBjb25zdCByZXBvID0gcGFydHNbMl07XG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBwYXJ0c1szXTtcblxuICAgIGNvbnN0IHVybCA9IGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7b3JnfS8ke3JlcG99L2dpdC9yZWYvdGFncy8ke3BhY2thZ2VQYXRofS92JHtwYWNrYWdlVmVyc2lvbn1gO1xuICAgIGxvZ2dlci5kZWJ1ZyhgRmV0Y2hpbmcgdGFncyBmb3IgJHtvcmd9LyR7cmVwb30gZnJvbSAnJHt1cmx9J2ApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkodXJsLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb25cIixcbiAgICAgICAgXCJVc2VyLUFnZW50XCI6IFwiT3BlbkNvbnN0cnVjdHMvY2RrdG4tY2xpXCIsXG4gICAgICAgIC4uLihHSVRIVUJfQVBJX1RPS0VOX0NES1RGXG4gICAgICAgICAgPyB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtHSVRIVUJfQVBJX1RPS0VOX0NES1RGfWAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IEhUVFBfTk9UX0ZPVU5EKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIHRoZSB0YWcgJHtwYWNrYWdlUGF0aH0vdiR7cGFja2FnZVZlcnNpb259IGluIHRoZSByZXBvc2l0b3J5ICR7b3JnfS8ke3JlcG99YCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QganNvbiA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIGFueTtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgR290IHJlc3BvbnNlIGZyb20gR2l0SHVicyByZXBvc2l0b3J5IHRhZyBlbmRwb2ludCBmb3IgJHtwYWNrYWdlTmFtZX06ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGpzb24sXG4gICAgICApfWAsXG4gICAgKTtcblxuICAgIHJldHVybiBCb29sZWFuKGpzb24gJiYganNvbi5yZWYpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxpc3RQcm92aWRlclBhY2thZ2VzKCk6IFByb21pc2U8XG4gICAgeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9W11cbiAgPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdvU3VtUGF0aCA9IHBhdGguam9pbih0aGlzLndvcmtpbmdEaXJlY3RvcnksIFwiZ28uc3VtXCIpO1xuICAgICAgaWYgKCFleGlzdHNTeW5jKGdvU3VtUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JzLlVzYWdlKFxuICAgICAgICAgIFwiTm8gZ28uc3VtIGZvdW5kIGluIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIFBsZWFzZSBydW4gdGhlIGNvbW1hbmQgZnJvbSB0aGUgcm9vdCBvZiB5b3VyIHByb2plY3QuXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdvU3VtID0gYXdhaXQgZnMucmVhZEZpbGUoZ29TdW1QYXRoLCBcInV0ZjhcIik7XG4gICAgICBjb25zdCBkZWR1cGVkUHJvdmlkZXJOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgICAgcmV0dXJuIGdvU3VtXG4gICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChsaW5lKSA9PlxuICAgICAgICAgICAgbGluZS5zdGFydHNXaXRoKFwiZ2l0aHViLmNvbS9oYXNoaWNvcnAvY2RrdGYtcHJvdmlkZXJcIikgfHxcbiAgICAgICAgICAgIGxpbmUuc3RhcnRzV2l0aChcImdpdGh1Yi5jb20vY2RrdGYvY2RrdGYtcHJvdmlkZXJcIikgfHxcbiAgICAgICAgICAgIGxpbmUuc3RhcnRzV2l0aChcImdpdGh1Yi5jb20vY2RrdG4taW8vY2RrdG4tcHJvdmlkZXJcIiksXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gbGluZS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3JzLkludGVybmFsKFxuICAgICAgICAgICAgICBgRXhwZWN0ZWQgbGluZSBpbiBnby5zdW0gdG8gYmUgaW4gdGhlIGZvcm1hdCBvZiAnPHBhY2thZ2U+IDx2ZXJzaW9uPiA8Y2hlY2tzdW0+JywgZ290OiAke2xpbmV9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gcGFydFswXSBjb3VsZCBiZSBnaXRodWIuY29tL2F3cy9jb25zdHJ1Y3RzLWdvL2NvbnN0cnVjdHMvdjEwXG4gICAgICAgICAgY29uc3QgbmFtZSA9IHBhcnRzWzBdLnNwbGl0KFwiL1wiKS5zbGljZSgwLCA0KS5qb2luKFwiL1wiKTtcblxuICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSBwYXJ0c1sxXS5zcGxpdChcIi9cIilbMF07XG5cbiAgICAgICAgICBpZiAoZGVkdXBlZFByb3ZpZGVyTmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lOiBcIlwiLCB2ZXJzaW9uOiBcIlwiIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVkdXBlZFByb3ZpZGVyTmFtZXMuYWRkKG5hbWUpO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKHByb3ZpZGVySW5mbykgPT4gISFwcm92aWRlckluZm8ubmFtZSAmJiAhIXByb3ZpZGVySW5mby52ZXJzaW9uLFxuICAgICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGRldGVybWluZSBpbnN0YWxsZWQgcGFja2FnZXMgcmVhZGluZyB0aGUgZ28uc3VtOiAke2UubWVzc2FnZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|