@dbx-tools/core 0.9.154 → 0.9.157
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/index.ts +12 -6
- package/lib/index.d.ts +12 -6
- package/lib/index.js +13 -6
- package/lib/src/bin.js +3 -4
- package/lib/src/brand-files.d.ts +1 -101
- package/lib/src/brand-files.js +4 -14
- package/lib/src/bundle.js +10 -10
- package/lib/src/config-utils.d.ts +0 -5
- package/lib/src/config-utils.js +34 -49
- package/lib/src/dependency-resolver.js +12 -12
- package/lib/src/exec.js +4 -4
- package/lib/src/file-lock.js +12 -18
- package/lib/src/process-lock.js +8 -9
- package/lib/src/project-utils.d.ts +3 -3
- package/lib/src/project-utils.js +14 -14
- package/package.json +3 -91
- package/src/bin.ts +2 -3
- package/src/brand-files.ts +3 -18
- package/src/bundle.ts +9 -12
- package/src/config-utils.ts +50 -62
- package/src/dependency-resolver.ts +11 -11
- package/src/exec.ts +3 -3
- package/src/file-lock.ts +20 -17
- package/src/process-lock.ts +7 -8
- package/src/project-utils.ts +25 -19
package/lib/src/project-utils.js
CHANGED
|
@@ -11,7 +11,7 @@ import { spawnSync } from "node:child_process";
|
|
|
11
11
|
import { readFileSync } from "node:fs";
|
|
12
12
|
import { homedir } from "node:os";
|
|
13
13
|
import { basename, dirname, join, resolve } from "node:path";
|
|
14
|
-
import {
|
|
14
|
+
import { parseRecord, urlBuilder, isRecord, trimToNull, } from "@dbx-tools/shared-core";
|
|
15
15
|
import { parse as parseYaml } from "yaml";
|
|
16
16
|
import { cachedRecord, statSync as fileStatSync } from "./file.js";
|
|
17
17
|
const ROOT_MARKERS = [
|
|
@@ -23,7 +23,7 @@ const ROOT_MARKERS = [
|
|
|
23
23
|
];
|
|
24
24
|
/** Resolve a blank, null, omitted, relative, or absolute cwd to an absolute path. */
|
|
25
25
|
export function resolveWorkingDirectory(cwd) {
|
|
26
|
-
return resolve(
|
|
26
|
+
return resolve(trimToNull(cwd) ?? process.cwd());
|
|
27
27
|
}
|
|
28
28
|
function projectContextCommandOutput(command, args, cwd, env) {
|
|
29
29
|
const result = spawnSync(command, args, {
|
|
@@ -38,7 +38,7 @@ function projectContextCommandOutput(command, args, cwd, env) {
|
|
|
38
38
|
// synthesizes one (a bare `example.com` -> `https://…`, an absolute path ->
|
|
39
39
|
// `http://localhost/…`), which would mislabel directory outputs and bare
|
|
40
40
|
// tokens - so gate on the raw output already carrying a scheme + authority.
|
|
41
|
-
const url = /^[a-z][a-z0-9+.-]*:\/\//i.test(output) ?
|
|
41
|
+
const url = /^[a-z][a-z0-9+.-]*:\/\//i.test(output) ? urlBuilder(output) : undefined;
|
|
42
42
|
return { output, path: pathStats ? output : undefined, pathStats, success: true, url };
|
|
43
43
|
}
|
|
44
44
|
return { output, success: result.status === 0 };
|
|
@@ -63,7 +63,7 @@ function projectCommand(command) {
|
|
|
63
63
|
return {
|
|
64
64
|
context,
|
|
65
65
|
output(args, cwd, options) {
|
|
66
|
-
return
|
|
66
|
+
return trimToNull(context(args, cwd, options).output) ?? undefined;
|
|
67
67
|
},
|
|
68
68
|
root(args, cwd) {
|
|
69
69
|
const parsed = context(args, cwd);
|
|
@@ -102,7 +102,7 @@ function npmRoot(cwd) {
|
|
|
102
102
|
return npmCommand.root(["prefix"], resolved);
|
|
103
103
|
}
|
|
104
104
|
function envDirectory(value) {
|
|
105
|
-
const path =
|
|
105
|
+
const path = trimToNull(value);
|
|
106
106
|
if (!path)
|
|
107
107
|
return undefined;
|
|
108
108
|
const resolved = resolve(path);
|
|
@@ -243,7 +243,7 @@ function repositoryUrlFromGh(cwd) {
|
|
|
243
243
|
if (!account)
|
|
244
244
|
return undefined;
|
|
245
245
|
const out = ghCommand.output(["repo", "view", account.remote.repository, "--json", "url"], account.root, { cache: true, env: account.env });
|
|
246
|
-
return
|
|
246
|
+
return trimToNull(parseRecord(out)?.url) ?? undefined;
|
|
247
247
|
}
|
|
248
248
|
/** Resolve an ssh host alias (`~/.ssh/config`) to its effective `hostname` via `ssh -G`. */
|
|
249
249
|
function resolveSshHostName(host, cwd, refresh = false) {
|
|
@@ -279,7 +279,7 @@ const projectGhAccountCache = new Map();
|
|
|
279
279
|
*/
|
|
280
280
|
export function resolveProjectGhAccount(cwd, options = {}) {
|
|
281
281
|
const root = resolveWorkingDirectory(cwd);
|
|
282
|
-
const remoteName =
|
|
282
|
+
const remoteName = trimToNull(options.remote) ?? "origin";
|
|
283
283
|
const key = JSON.stringify([root, remoteName, homedir(), process.env.GH_CONFIG_DIR ?? ""]);
|
|
284
284
|
if (!options.refresh && projectGhAccountCache.has(key)) {
|
|
285
285
|
return projectGhAccountCache.get(key) ?? undefined;
|
|
@@ -362,7 +362,7 @@ function repositoryUrlFromGit(cwd) {
|
|
|
362
362
|
if (scp)
|
|
363
363
|
https = `https://${scp[1]}/${scp[2]}`;
|
|
364
364
|
https = https.replace(/^(ssh|git):\/\//, "https://");
|
|
365
|
-
let builder =
|
|
365
|
+
let builder = urlBuilder(https);
|
|
366
366
|
if (!builder)
|
|
367
367
|
return undefined;
|
|
368
368
|
// Drop any embedded `user[:pass]@` credentials.
|
|
@@ -459,10 +459,10 @@ function* npmRegistryCandidates(cwd, envVars) {
|
|
|
459
459
|
}
|
|
460
460
|
}
|
|
461
461
|
function toRegistryUrl(candidate, overrideOnly) {
|
|
462
|
-
const trimmed =
|
|
462
|
+
const trimmed = trimToNull(candidate);
|
|
463
463
|
if (!trimmed)
|
|
464
464
|
return undefined;
|
|
465
|
-
const url =
|
|
465
|
+
const url = urlBuilder(trimmed);
|
|
466
466
|
if (!url)
|
|
467
467
|
return undefined;
|
|
468
468
|
if (overrideOnly && isPublicNpmRegistry(url))
|
|
@@ -518,7 +518,7 @@ function readYamlRegistry(path) {
|
|
|
518
518
|
if (!text)
|
|
519
519
|
return undefined;
|
|
520
520
|
const parsed = parseYaml(text);
|
|
521
|
-
if (!
|
|
521
|
+
if (!isRecord(parsed))
|
|
522
522
|
return undefined;
|
|
523
523
|
const registry = yamlRegistry(parsed);
|
|
524
524
|
return registry ? { registry } : undefined;
|
|
@@ -577,7 +577,7 @@ function yamlRegistry(data) {
|
|
|
577
577
|
if (typeof data.registry === "string")
|
|
578
578
|
return data.registry;
|
|
579
579
|
const registries = data.registries;
|
|
580
|
-
if (
|
|
580
|
+
if (isRecord(registries) && typeof registries.default === "string") {
|
|
581
581
|
return registries.default;
|
|
582
582
|
}
|
|
583
583
|
return undefined;
|
|
@@ -598,6 +598,6 @@ function stripTomlComment(line) {
|
|
|
598
598
|
function readPackageName(pkgPath) {
|
|
599
599
|
if (!fileStatSync(pkgPath)?.isFile())
|
|
600
600
|
return undefined;
|
|
601
|
-
return
|
|
601
|
+
return trimToNull(parseRecord(readFileSync(pkgPath, "utf8"))?.name) ?? undefined;
|
|
602
602
|
}
|
|
603
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0LXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBUyxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzdELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsSUFBSSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbkUsTUFBTSxZQUFZLEdBQUc7SUFDbkIsY0FBYztJQUNkLGNBQWM7SUFDZCxlQUFlO0lBQ2YsZUFBZTtJQUNmLGNBQWM7Q0FDTixDQUFDO0FBRVgscUZBQXFGO0FBQ3JGLE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxHQUFtQjtJQUN6RCxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFnQ0QsU0FBUywyQkFBMkIsQ0FDbEMsT0FBZSxFQUNmLElBQWMsRUFDZCxHQUFXLEVBQ1gsR0FBdUI7SUFFdkIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7UUFDdEMsR0FBRztRQUNILEdBQUcsRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLEdB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QUMsSUFBSSxTQUFTLENBQUM7QUFDcEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVwb3NpdG9yeSwgcGFja2FnZSwgYnVuZGxlLCBhbmQgcHJvamVjdCBkaXNjb3ZlcnkgZm9yIE5vZGUgYW5kIEJ1biB0b29scy5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyB0aGUgc2hhcmVkIG93bmVyIGZvciB3b3JraW5nLWRpcmVjdG9yeSBub3JtYWxpemF0aW9uLCBwcm9qZWN0XG4gKiByb290cywgcmVwb3NpdG9yeSBVUkxzLCBwYWNrYWdlIG5hbWVzLCBhbmQgRGF0YWJyaWNrcyBidW5kbGUgY29udGV4dC4gUmV1c2UgaXRcbiAqIGluc3RlYWQgb2YgYWRkaW5nIHBhY2thZ2UtbG9jYWwgcm9vdC1tYXJrZXIgd2Fsa3Mgb3IgR2l0IHJlbW90ZSBwYXJzaW5nLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBTdGF0cywgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBqc29uLCBuZXQsIG9iamVjdCwgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VZYW1sIH0gZnJvbSBcInlhbWxcIjtcbmltcG9ydCB7IGNhY2hlZFJlY29yZCwgc3RhdFN5bmMgYXMgZmlsZVN0YXRTeW5jIH0gZnJvbSBcIi4vZmlsZS50c1wiO1xuXG5jb25zdCBST09UX01BUktFUlMgPSBbXG4gIFwiLnByb2plbnJjLnRzXCIsXG4gIFwiLnByb2plbnJjLmpzXCIsXG4gIFwiLnByb2plbnJjLm1qc1wiLFxuICBcIi5wcm9qZW5yYy5janNcIixcbiAgXCJwYWNrYWdlLmpzb25cIixcbl0gYXMgY29uc3Q7XG5cbi8qKiBSZXNvbHZlIGEgYmxhbmssIG51bGwsIG9taXR0ZWQsIHJlbGF0aXZlLCBvciBhYnNvbHV0ZSBjd2QgdG8gYW4gYWJzb2x1dGUgcGF0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2Q/OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc29sdmUoc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjd2QpID8/IHByb2Nlc3MuY3dkKCkpO1xufVxuXG4vKiogQSBjb21tYW5kJ3Mgc3Rkb3V0LCBjbGFzc2lmaWVkIGFzIGEgZmlsZXN5c3RlbSBwYXRoIGFuZC9vciBhIFVSTC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdENvbnRleHQge1xuICByZWFkb25seSBvdXRwdXQ/OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBjb21tYW5kIGV4aXRlZCBzdWNjZXNzZnVsbHkuICovXG4gIHJlYWRvbmx5IHN1Y2Nlc3M6IGJvb2xlYW47XG4gIC8qKiBgb3V0cHV0YCB3aGVuIGl0IG5hbWVzIHNvbWV0aGluZyBvbiBkaXNrLiAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuICAvKiogYGZpbGUuc3RhdFN5bmNgIG9mIHtAbGluayBwYXRofSwgd2hlbiBpdCBleGlzdHMuICovXG4gIHJlYWRvbmx5IHBhdGhTdGF0cz86IFN0YXRzO1xuICAvKipcbiAgICogYG91dHB1dGAgcGFyc2VkIGludG8gYSBjaGFpbmFibGUge0BsaW5rIG5ldC5VcmxCdWlsZGVyfSwgd2hlbiBpdCBpcyBhIHJlYWxcbiAgICogbmV0d29yayBVUkwgLSBhIG5vbi1ibGFuayBzY2hlbWUgKG5vdCBgZmlsZTpgKSBBTkQgYSBub24tYmxhbmsgaG9zdG5hbWUuXG4gICAqIEJhcmUgcGF0aHMsIHNjcC1saWtlIGBnaXRAaG9zdDouLi5gIHJlbW90ZXMsIGFuZCBgZmlsZTpgIFVSTHMgc3RheSB1bnNldC5cbiAgICovXG4gIHJlYWRvbmx5IHVybD86IG5ldC5VcmxCdWlsZGVyO1xufVxuXG4vKipcbiAqIGJlY2F1c2UgdGhpcyBpcyBjcnVjaWFsIGRvIG5vdCB1c2UgZXhlYy5zcGF3blN5bmNcbiAqXG4gKiBSdW4gYGNvbW1hbmQgYXJnc2AgaW4gYGN3ZGAgYW5kIGNsYXNzaWZ5IGl0cyBzdGRvdXQ6IGBwYXRoYCArIGBwYXRoU3RhdHNgIHdoZW5cbiAqIHRoZSBvdXRwdXQgbmFtZXMgc29tZXRoaW5nIG9uIGRpc2ssIGB1cmxgIChhIHtAbGluayBuZXQuVXJsQnVpbGRlcn0pIHdoZW4gaXRcbiAqIHBhcnNlcyBhcyBhIHJlYWwgbmV0d29yayBVUkwuIEVtcHR5IHtAbGluayBQcm9qZWN0Q29udGV4dH0gb24gYSBub24temVybyBleGl0XG4gKiBvciBlbXB0eSBvdXRwdXQuXG4gKi9cbmludGVyZmFjZSBQcm9qZWN0Q29tbWFuZE9wdGlvbnMge1xuICByZWFkb25seSBjYWNoZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0Q29udGV4dENvbW1hbmRPdXRwdXQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nW10sXG4gIGN3ZDogc3RyaW5nLFxuICBlbnY/OiBOb2RlSlMuUHJvY2Vzc0Vudixcbik6IFByb2plY3RDb250ZXh0IHtcbiAgY29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKGNvbW1hbmQsIGFyZ3MsIHtcbiAgICBjd2QsXG4gICAgZW52OiBlbnYgPz8gcHJvY2Vzcy5lbnYsXG4gICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJpZ25vcmVcIl0sXG4gIH0pO1xuICBjb25zdCBvdXRwdXQgPSByZXN1bHQ/LnN0ZG91dD8udG9TdHJpbmcoKT8udHJpbSgpO1xuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCAmJiBvdXRwdXQpIHtcbiAgICBjb25zdCBwYXRoU3RhdHMgPSBmaWxlU3RhdFN5bmMob3V0cHV0KTtcbiAgICAvLyBPbmx5IGFuIEVYUExJQ0lUIGBzY2hlbWU6Ly8uLi5gIGNvdW50cyBhcyBhIFVSTC4gYHVybEJ1aWxkZXJgIG90aGVyd2lzZVxuICAgIC8vIHN5bnRoZXNpemVzIG9uZSAoYSBiYXJlIGBleGFtcGxlLmNvbWAgLT4gYGh0dHBzOi8v4oCmYCwgYW4gYWJzb2x1dGUgcGF0aCAtPlxuICAgIC8vIGBodHRwOi8vbG9jYWxob3N0L+KApmApLCB3aGljaCB3b3VsZCBtaXNsYWJlbCBkaXJlY3Rvcnkgb3V0cHV0cyBhbmQgYmFyZVxuICAgIC8vIHRva2VucyAtIHNvIGdhdGUgb24gdGhlIHJhdyBvdXRwdXQgYWxyZWFkeSBjYXJyeWluZyBhIHNjaGVtZSArIGF1dGhvcml0eS5cbiAgICBjb25zdCB1cmwgPSAvXlthLXpdW2EtejAtOSsuLV0qOlxcL1xcLy9pLnRlc3Qob3V0cHV0KSA/IG5ldC51cmxCdWlsZGVyKG91dHB1dCkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgb3V0cHV0LCBwYXRoOiBwYXRoU3RhdHMgPyBvdXRwdXQgOiB1bmRlZmluZWQsIHBhdGhTdGF0cywgc3VjY2VzczogdHJ1ZSwgdXJsIH07XG4gIH1cbiAgcmV0dXJuIHsgb3V0cHV0LCBzdWNjZXNzOiByZXN1bHQuc3RhdHVzID09PSAwIH07XG59XG5cbmNvbnN0IHByb2plY3RDb21tYW5kQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUHJvamVjdENvbnRleHQ+KCk7XG5cbmZ1bmN0aW9uIHByb2plY3RDb250ZXh0Q29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgY3dkPzogc3RyaW5nLFxuICBvcHRpb25zOiBQcm9qZWN0Q29tbWFuZE9wdGlvbnMgPSB7fSxcbik6IFByb2plY3RDb250ZXh0IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBjb25zdCBjYWNoZSA9IG9wdGlvbnMuY2FjaGUgPz8gKCFvcHRpb25zLmVudiAmJiByZXNvbHZlZCA9PT0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoKSk7XG4gIGNvbnN0IGtleSA9IGNhY2hlID8gSlNPTi5zdHJpbmdpZnkoW3Jlc29sdmVkLCBjb21tYW5kLCAuLi5hcmdzXSkgOiB1bmRlZmluZWQ7XG4gIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGNhY2hlZCA9IHByb2plY3RDb21tYW5kQ2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHZhbHVlID0gcHJvamVjdENvbnRleHRDb21tYW5kT3V0cHV0KGNvbW1hbmQsIGFyZ3MsIHJlc29sdmVkLCBvcHRpb25zLmVudik7XG4gIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgcHJvamVjdENvbW1hbmRDYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdENvbW1hbmQoY29tbWFuZDogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbnRleHQgPSAoYXJnczogc3RyaW5nW10sIGN3ZD86IHN0cmluZywgb3B0aW9ucz86IFByb2plY3RDb21tYW5kT3B0aW9ucyk6IFByb2plY3RDb250ZXh0ID0+XG4gICAgcHJvamVjdENvbnRleHRDb21tYW5kKGNvbW1hbmQsIGFyZ3MsIGN3ZCwgb3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgY29udGV4dCxcbiAgICBvdXRwdXQoYXJnczogc3RyaW5nW10sIGN3ZD86IHN0cmluZywgb3B0aW9ucz86IFByb2plY3RDb21tYW5kT3B0aW9ucyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjb250ZXh0KGFyZ3MsIGN3ZCwgb3B0aW9ucykub3V0cHV0KSA/PyB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICByb290KGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBjb250ZXh0KGFyZ3MsIGN3ZCk7XG4gICAgICByZXR1cm4gcGFyc2VkLnBhdGhTdGF0cz8uaXNEaXJlY3RvcnkoKSA/IHBhcnNlZC5wYXRoIDogdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgc3VjY2VlZHMoYXJnczogc3RyaW5nW10sIGN3ZD86IHN0cmluZywgb3B0aW9ucz86IFByb2plY3RDb21tYW5kT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGNvbnRleHQoYXJncywgY3dkLCBvcHRpb25zKS5zdWNjZXNzO1xuICAgIH0sXG4gIH07XG59XG5cbmNvbnN0IGdpdENvbW1hbmQgPSBwcm9qZWN0Q29tbWFuZChcImdpdFwiKTtcbmNvbnN0IGdoQ29tbWFuZCA9IHByb2plY3RDb21tYW5kKFwiZ2hcIik7XG5jb25zdCBucG1Db21tYW5kID0gcHJvamVjdENvbW1hbmQoXCJucG1cIik7XG5jb25zdCBzc2hDb21tYW5kID0gcHJvamVjdENvbW1hbmQoXCJzc2hcIik7XG5cbmZ1bmN0aW9uIGdpdFJlbW90ZVVybChjd2Q/OiBzdHJpbmcsIHJlbW90ZSA9IFwib3JpZ2luXCIsIHJlZnJlc2ggPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnaXRDb21tYW5kLm91dHB1dChbXCJyZW1vdGVcIiwgXCJnZXQtdXJsXCIsIHJlbW90ZV0sIGN3ZCwgeyBjYWNoZTogIXJlZnJlc2ggfSk7XG59XG5cbi8qKlxuICogQ2xvc2VzdCBkaXJlY3Rvcnkgd2l0aCBhIGBwYWNrYWdlLmpzb25gIG9yIGBub2RlX21vZHVsZXNgLCBtYXRjaGluZyBgbnBtIHByZWZpeGAuXG4gKlxuICogTGlmZWN5Y2xlIHNjcmlwdHMgZnJvbSBucG0gYW5kIEJ1biBzZXQgYG5wbV9jb25maWdfbG9jYWxfcHJlZml4YCB0byB0aGF0XG4gKiBkaXJlY3RvcnkuIFJlYWQgaXQgZmlyc3Qgd2hlbiByZXNvbHZpbmcgdGhpcyBwcm9jZXNzJ3MgY3dkIHNvIGEgbWlzc2luZyBucG1cbiAqIENMSSBpcyBub3QgcmVxdWlyZWQuIGBucG1fY29uZmlnX3ByZWZpeGAgLyBgUFJFRklYYCBhcmUgdGhlIGdsb2JhbCBpbnN0YWxsXG4gKiBwcmVmaXggYW5kIG11c3Qgbm90IGJlIHVzZWQgaGVyZS5cbiAqXG4gKiBCdW4gaGFzIG5vIHByZWZpeCBjb21tYW5kIChgYnVuIHBtIGJpbmAgaXMgdGhlIGAuYmluYCBkaXJlY3RvcnkpLiBwbnBtJ3NcbiAqIGBwcmVmaXhgIGNvbW1hbmQgaXMgdW5pbXBsZW1lbnRlZDsgYHBucG0gcm9vdGAgcHJpbnRzIGBub2RlX21vZHVsZXNgLlxuICovXG5mdW5jdGlvbiBucG1Sb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgaWYgKHJlc29sdmVkID09PSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeSgpKSB7XG4gICAgY29uc3QgZnJvbUVudiA9IGVudkRpcmVjdG9yeShwcm9jZXNzLmVudi5ucG1fY29uZmlnX2xvY2FsX3ByZWZpeCk7XG4gICAgaWYgKGZyb21FbnYpIHJldHVybiBmcm9tRW52O1xuICB9XG4gIHJldHVybiBucG1Db21tYW5kLnJvb3QoW1wicHJlZml4XCJdLCByZXNvbHZlZCk7XG59XG5cbmZ1bmN0aW9uIGVudkRpcmVjdG9yeSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGF0aCA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwodmFsdWUpO1xuICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZShwYXRoKTtcbiAgcmV0dXJuIGZpbGVTdGF0U3luYyhyZXNvbHZlZCk/LmlzRGlyZWN0b3J5KCkgPyByZXNvbHZlZCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2l0Um9vdChjd2Q/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIHJldHVybiBnaXRDb21tYW5kLnJvb3QoW1wicmV2LXBhcnNlXCIsIFwiLS1zaG93LXRvcGxldmVsXCJdLCByZXNvbHZlZCk7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSBuZWFyZXN0IHByb2plY3Qgcm9vdCB3aXRob3V0IHdhbGtpbmcgYWJvdmUgaXRzIG5wbSBvciBHaXQgYm91bmRhcnkuICovXG5leHBvcnQgZnVuY3Rpb24gcm9vdChjd2Q/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIGxldCBjdXJyZW50ID0gcmVzb2x2ZWQ7XG5cbiAgaWYgKCFmaWxlU3RhdFN5bmMoY3VycmVudCk/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICBjdXJyZW50ID0gZGlybmFtZShjdXJyZW50KTtcbiAgfVxuICBjb25zdCBib3VuZGFyaWVzID0gbmV3IFNldChcbiAgICBbbnBtQm91bmRhcnkocmVzb2x2ZWQpLCBnaXRSb290KHJlc29sdmVkKV1cbiAgICAgIC5maWx0ZXIoKHBhdGgpOiBwYXRoIGlzIHN0cmluZyA9PiBwYXRoICE9PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChwYXRoKSA9PiByZXNvbHZlKHBhdGgpKSxcbiAgKTtcbiAgY29uc3QgaGFzQm91bmRhcnkgPSBib3VuZGFyaWVzLnNpemUgPiAwO1xuICBsZXQgYmVzdDogeyBkaXI6IHN0cmluZzsgcHJpb3JpdHk6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGZvciAoY29uc3QgW3ByaW9yaXR5LCBtYXJrZXJdIG9mIFJPT1RfTUFSS0VSUy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChmaWxlU3RhdFN5bmMoam9pbihjdXJyZW50LCBtYXJrZXIpKT8uaXNGaWxlKCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGJlc3QgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIHByaW9yaXR5IDwgYmVzdC5wcmlvcml0eSB8fFxuICAgICAgICAgIChwcmlvcml0eSA9PT0gYmVzdC5wcmlvcml0eSAmJiBjdXJyZW50Lmxlbmd0aCA8IGJlc3QuZGlyLmxlbmd0aClcbiAgICAgICAgKSB7XG4gICAgICAgICAgYmVzdCA9IHsgZGlyOiBjdXJyZW50LCBwcmlvcml0eSB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc0JvdW5kYXJ5ICYmIGJlc3QpIHtcbiAgICAgIHJldHVybiBiZXN0LmRpcjtcbiAgICB9XG4gICAgaWYgKGJvdW5kYXJpZXMuaGFzKGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4gYmVzdD8uZGlyO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGN1cnJlbnQpO1xuICAgIGlmIChwYXJlbnQgPT09IGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBiZXN0Py5kaXI7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBwYXJlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbnBtQm91bmRhcnkoY3dkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGUgPSBucG1Sb290KGN3ZCk7XG4gIGlmICghY2FuZGlkYXRlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmUoY2FuZGlkYXRlKTtcbiAgaWYgKGZpbGVTdGF0U3luYyhqb2luKHJlc29sdmVkLCBcInBhY2thZ2UuanNvblwiKSk/LmlzRmlsZSgpKSByZXR1cm4gcmVzb2x2ZWQ7XG4gIGlmIChmaWxlU3RhdFN5bmMoam9pbihyZXNvbHZlZCwgXCJub2RlX21vZHVsZXNcIikpPy5pc0RpcmVjdG9yeSgpKSByZXR1cm4gcmVzb2x2ZWQ7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyc2UgYSBnaXQgcmVtb3RlIFVSTCAoYGh0dHBzOi8vLi4uYCwgYGdpdEBob3N0Om93bmVyL3JlcG8uZ2l0YCwgZXRjLikgYW5kXG4gKiByZXR1cm4gdGhlIHJlcG8gc2VnbWVudCwgc3RyaXBwaW5nIGFueSBgLmdpdGAgc3VmZml4LiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvclxuICogZW1wdHkgb3IgdW5wYXJzYWJsZSBpbnB1dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlR2l0UmVtb3RlKHVybDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdHJpbW1lZCA9IHVybC50cmltKCk7XG4gIGlmICghdHJpbW1lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBzY3AgPSAvXlteQF0rQFteOl0rOiguKykkL2kuZXhlYyh0cmltbWVkKTtcbiAgaWYgKHNjcCkgcmV0dXJuIGxhc3RQYXRoU2VnbWVudChzY3BbMV0gPz8gXCJcIik7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdHJpbW1lZC5yZXBsYWNlKC9cXC5naXQkL2ksIFwiXCIpO1xuICAgIGNvbnN0IHBhdGhuYW1lID0gbmV3IFVSTChub3JtYWxpemVkKS5wYXRobmFtZTtcbiAgICBjb25zdCBzZWdtZW50ID0gcGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKS5hdCgtMSk7XG4gICAgcmV0dXJuIHNlZ21lbnQgPyBsYXN0UGF0aFNlZ21lbnQoc2VnbWVudCkgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGFzdFBhdGhTZWdtZW50KHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNlZ21lbnQgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbikuYXQoLTEpID8/IHBhdGg7XG4gIHJldHVybiBzZWdtZW50LnJlcGxhY2UoL1xcLmdpdCQvaSwgXCJcIik7XG59XG5cbi8qKlxuICogWWllbGQgY2FuZGlkYXRlIHByb2plY3Qtcm9vdCBkaXJlY3RvcmllcyBmb3IgYGN3ZGAsIGluIHByaW9yaXR5IG9yZGVyOiB0aGVcbiAqIGBucG0gcHJlZml4YCwgdGhlIGdpdCB0b3AtbGV2ZWwsIHRoZW4gYGN3ZGAgaXRzZWxmLiBEdXBsaWNhdGVzIGFyZSBza2lwcGVkO1xuICogb25seSBleGlzdGluZyBkaXJlY3RvcmllcyBhcmUgeWllbGRlZCAoZXhjZXB0IHRoZSBmaW5hbCBgY3dkYCBmYWxsYmFjaykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogcmVzb2x2ZVByb2plY3RSb290cyhjd2Q/OiBzdHJpbmcpOiBHZW5lcmF0b3I8c3RyaW5nPiB7XG4gIGNvbnN0IGJhc2UgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIFtucG1Sb290KGJhc2UpLCBnaXRSb290KGJhc2UpXSkge1xuICAgIGlmICghY2FuZGlkYXRlKSBjb250aW51ZTtcbiAgICBjb25zdCBkaXIgPSByZXNvbHZlKGNhbmRpZGF0ZSk7XG4gICAgaWYgKHNlZW4uaGFzKGRpcikpIGNvbnRpbnVlO1xuICAgIHNlZW4uYWRkKGRpcik7XG4gICAgaWYgKGZpbGVTdGF0U3luYyhkaXIpPy5pc0RpcmVjdG9yeSgpKSB5aWVsZCBkaXI7XG4gIH1cbiAgaWYgKCFzZWVuLmhhcyhiYXNlKSkgeWllbGQgYmFzZTtcbn1cblxuLyoqIFRoZSBuZWFyZXN0IGFuY2VzdG9yIG9mIGBjd2RgIChmcm9tIHtAbGluayByZXNvbHZlUHJvamVjdFJvb3RzfSkgd2l0aCBhIGBwYWNrYWdlLmpzb25gLiAqL1xuZnVuY3Rpb24gd29ya3NwYWNlUm9vdChjd2Q/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgbGFzdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGRpciBvZiByZXNvbHZlUHJvamVjdFJvb3RzKGN3ZCkpIHtcbiAgICBpZiAoZmlsZVN0YXRTeW5jKHJlc29sdmUoZGlyLCBcInBhY2thZ2UuanNvblwiKSk/LmlzRmlsZSgpKSByZXR1cm4gZGlyO1xuICAgIGxhc3QgPSBkaXI7XG4gIH1cbiAgcmV0dXJuIGxhc3QgPz8gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgaHVtYW4tZnJpZW5kbHkgcHJvamVjdCBuYW1lIGZvciB0aGUgcmVwbyByb290ZWQgYXQgYGN3ZGA6XG4gKiBgcGFja2FnZS5qc29uYCBgbmFtZWAsIHRoZW4gdGhlIGdpdCByZW1vdGUncyByZXBvIG5hbWUsIHRoZW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSdzIGJhc2VuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmFtZShjd2Q/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIGNvbnN0IHJvb3REaXIgPSB3b3Jrc3BhY2VSb290KHJlc29sdmVkKTtcblxuICBjb25zdCBmcm9tUGFja2FnZSA9IHJlYWRQYWNrYWdlTmFtZShyZXNvbHZlKHJvb3REaXIsIFwicGFja2FnZS5qc29uXCIpKTtcbiAgaWYgKGZyb21QYWNrYWdlKSByZXR1cm4gZnJvbVBhY2thZ2U7XG5cbiAgY29uc3QgcmVtb3RlID0gZ2l0UmVtb3RlVXJsKHJvb3REaXIpO1xuICBjb25zdCBmcm9tR2l0ID0gcmVtb3RlID8gcGFyc2VHaXRSZW1vdGUocmVtb3RlKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGZyb21HaXQpIHJldHVybiBmcm9tR2l0O1xuXG4gIHJldHVybiBiYXNlbmFtZShyb290RGlyKTtcbn1cblxuLyoqXG4gKiBUaGUgR2l0SHViIENMSSdzIGNhbm9uaWNhbCByZXBvIFVSTCAtIHRoZSBlYXN5IHBhdGguIGBnaGAgYWxyZWFkeSByZXNvbHZlcyB0aGVcbiAqIHRydWUgaG9zdCAobm8gc3NoLWFsaWFzIHBhcnNpbmcpIGFuZCBwcmludHMgYSBjbGVhbiBgaHR0cHM6Ly9ob3N0L293bmVyL3JlcG9gLlxuICogYHVuZGVmaW5lZGAgd2hlbiBgZ2hgIGlzIGFic2VudCwgdW5hdXRoZW50aWNhdGVkLCBvciB0aGUgZGlyIGlzbid0IGEgR0ggcmVwby5cbiAqL1xuZnVuY3Rpb24gcmVwb3NpdG9yeVVybEZyb21HaChjd2Q/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBhY2NvdW50ID0gcmVzb2x2ZVByb2plY3RHaEFjY291bnQoY3dkKTtcbiAgaWYgKCFhY2NvdW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBvdXQgPSBnaENvbW1hbmQub3V0cHV0KFxuICAgIFtcInJlcG9cIiwgXCJ2aWV3XCIsIGFjY291bnQucmVtb3RlLnJlcG9zaXRvcnksIFwiLS1qc29uXCIsIFwidXJsXCJdLFxuICAgIGFjY291bnQucm9vdCxcbiAgICB7IGNhY2hlOiB0cnVlLCBlbnY6IGFjY291bnQuZW52IH0sXG4gICk7XG4gIHJldHVybiBzdHJpbmdVdGlscy50cmltVG9OdWxsKGpzb24ucGFyc2VSZWNvcmQob3V0KT8udXJsKSA/PyB1bmRlZmluZWQ7XG59XG5cbi8qKiBSZXNvbHZlIGFuIHNzaCBob3N0IGFsaWFzIChgfi8uc3NoL2NvbmZpZ2ApIHRvIGl0cyBlZmZlY3RpdmUgYGhvc3RuYW1lYCB2aWEgYHNzaCAtR2AuICovXG5mdW5jdGlvbiByZXNvbHZlU3NoSG9zdE5hbWUoaG9zdDogc3RyaW5nLCBjd2Q/OiBzdHJpbmcsIHJlZnJlc2ggPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxpbmUgPSBzc2hDb21tYW5kXG4gICAgLmNvbnRleHQoW1wiLUdcIiwgaG9zdF0sIGN3ZCwgeyBjYWNoZTogIXJlZnJlc2ggfSlcbiAgICAub3V0cHV0Py5zcGxpdChcIlxcblwiKVxuICAgIC5maW5kKChsKSA9PiAvXmhvc3RuYW1lXFxzL2kudGVzdChsLnRyaW0oKSkpO1xuICBjb25zdCBuYW1lID0gbGluZT8udHJpbSgpLnNwbGl0KC9cXHMrLylbMV07XG4gIHJldHVybiBuYW1lICYmIG5hbWUgIT09IGhvc3QgPyBuYW1lIDogdW5kZWZpbmVkO1xufVxuXG4vKiogUGFyc2VkIEdpdEh1Yi1zdHlsZSByZW1vdGUgY29vcmRpbmF0ZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RHaFJlbW90ZSB7XG4gIC8qKiBBY2NvdW50IGhpbnRlZCBieSBhbiBTU0ggYWxpYXMgc3VjaCBhcyBgZ2l0QGdpdGh1Yi13b3JrOmAuICovXG4gIHJlYWRvbmx5IGFjY291bnRIaW50Pzogc3RyaW5nO1xuICAvKiogSG9zdCB3cml0dGVuIGluIHRoZSByZW1vdGUgYmVmb3JlIFNTSCBhbGlhcyByZXNvbHV0aW9uLiAqL1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG4gIC8qKiBgb3duZXIvcmVwb3NpdG9yeWAgcGF0aC4gKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeTogc3RyaW5nO1xufVxuXG4vKiogQXV0aGVudGljYXRlZCBHaXRIdWIgQ0xJIGFjY291bnQgc2VsZWN0ZWQgZm9yIG9uZSBwcm9qZWN0IHJlbW90ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdEdoQWNjb3VudCB7XG4gIC8qKiBFbnZpcm9ubWVudCB0byBwYXNzIHRvIGV2ZXJ5IGBnaGAgY29tbWFuZCBmb3IgdGhpcyBwcm9qZWN0LiAqL1xuICByZWFkb25seSBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52O1xuICAvKiogQWN0dWFsIEdpdEh1YiBob3N0IHNlbGVjdGVkIGZyb20gYGdoIGF1dGggc3RhdHVzYC4gKi9cbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICAvKiogQXV0aGVudGljYXRlZCBHaXRIdWIgbG9naW4uICovXG4gIHJlYWRvbmx5IGxvZ2luOiBzdHJpbmc7XG4gIC8qKiBQYXJzZWQgcHJvamVjdCByZW1vdGUuICovXG4gIHJlYWRvbmx5IHJlbW90ZTogUHJvamVjdEdoUmVtb3RlO1xuICAvKiogUmVzb2x2ZWQgcHJvamVjdCBkaXJlY3RvcnkgdXNlZCBmb3IgY29tbWFuZCBleGVjdXRpb24uICovXG4gIHJlYWRvbmx5IHJvb3Q6IHN0cmluZztcbn1cblxuLyoqIE9wdGlvbnMgZm9yIGNhY2hlZCBwcm9qZWN0IEdpdEh1Yi1hY2NvdW50IHJlc29sdXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVQcm9qZWN0R2hBY2NvdW50T3B0aW9ucyB7XG4gIC8qKiBHaXQgcmVtb3RlIG5hbWUuIERlZmF1bHRzIHRvIGBvcmlnaW5gLiAqL1xuICByZWFkb25seSByZW1vdGU/OiBzdHJpbmc7XG4gIC8qKiBSZS1yZWFkIGdpdCwgU1NILCBhbmQgR2l0SHViIENMSSBzdGF0ZSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBwcm9jZXNzIGNhY2hlLiAqL1xuICByZWFkb25seSByZWZyZXNoPzogYm9vbGVhbjtcbn1cblxuLyoqIFBhcnNlIEhUVFBTLCBTU0ggVVJMLCBvciBzY3AtbGlrZSBHaXRIdWIgcmVtb3RlIGNvb3JkaW5hdGVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHJvamVjdEdoUmVtb3RlKHJlbW90ZVVybDogc3RyaW5nKTogUHJvamVjdEdoUmVtb3RlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSByZW1vdGVVcmwudHJpbSgpLnJlcGxhY2UoL1xcLmdpdCQvaSwgXCJcIik7XG4gIGNvbnN0IGh0dHBzID0gL15odHRwcz86XFwvXFwvKFteL10rKVxcLyhbXi9dKylcXC8oW14vXSspJC9pLmV4ZWModmFsdWUpO1xuICBpZiAoaHR0cHMpIHJldHVybiB7IGhvc3Q6IGh0dHBzWzFdISwgcmVwb3NpdG9yeTogYCR7aHR0cHNbMl19LyR7aHR0cHNbM119YCB9O1xuICBjb25zdCBzc2ggPSAvXig/OnNzaDpcXC9cXC8pP2dpdEAoW14vOl0rKVs6L10oW14vXSspXFwvKFteL10rKSQvaS5leGVjKHZhbHVlKTtcbiAgaWYgKCFzc2gpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGFjY291bnRIaW50ID0gL15naXRodWItKC4rKSQvaS5leGVjKHNzaFsxXSEpPy5bMV07XG4gIHJldHVybiB7XG4gICAgLi4uKGFjY291bnRIaW50ID8geyBhY2NvdW50SGludCB9IDoge30pLFxuICAgIGhvc3Q6IHNzaFsxXSEsXG4gICAgcmVwb3NpdG9yeTogYCR7c3NoWzJdfS8ke3NzaFszXX1gLFxuICB9O1xufVxuXG5jb25zdCBwcm9qZWN0R2hBY2NvdW50Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUHJvamVjdEdoQWNjb3VudCB8IG51bGw+KCk7XG5cbi8qKlxuICogUmVzb2x2ZSBhbmQgY2FjaGUgdGhlIGF1dGhlbnRpY2F0ZWQgYGdoYCBhY2NvdW50IHRoYXQgY2FuIGFjY2VzcyBhIHByb2plY3Qnc1xuICogcmVtb3RlLiBTU0ggYWxpYXMgYWNjb3VudCBoaW50cyB3aW4sIGZvbGxvd2VkIGJ5IHRoZSBhY3RpdmUgYWNjb3VudCBvbiB0aGVcbiAqIGVmZmVjdGl2ZSBTU0gvSFRUUFMgaG9zdCwgdGhlbiBvdGhlciBhdXRoZW50aWNhdGVkIGFjY291bnRzLiBFdmVyeSBjYW5kaWRhdGVcbiAqIGlzIHZlcmlmaWVkIGFnYWluc3QgdGhlIHJlcG9zaXRvcnkgYmVmb3JlIGl0IGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVByb2plY3RHaEFjY291bnQoXG4gIGN3ZD86IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZVByb2plY3RHaEFjY291bnRPcHRpb25zID0ge30sXG4pOiBQcm9qZWN0R2hBY2NvdW50IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgcm9vdCA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIGNvbnN0IHJlbW90ZU5hbWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG9wdGlvbnMucmVtb3RlKSA/PyBcIm9yaWdpblwiO1xuICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbcm9vdCwgcmVtb3RlTmFtZSwgaG9tZWRpcigpLCBwcm9jZXNzLmVudi5HSF9DT05GSUdfRElSID8/IFwiXCJdKTtcbiAgaWYgKCFvcHRpb25zLnJlZnJlc2ggJiYgcHJvamVjdEdoQWNjb3VudENhY2hlLmhhcyhrZXkpKSB7XG4gICAgcmV0dXJuIHByb2plY3RHaEFjY291bnRDYWNoZS5nZXQoa2V5KSA/PyB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgcmVtb3RlVXJsID0gZ2l0UmVtb3RlVXJsKHJvb3QsIHJlbW90ZU5hbWUsIG9wdGlvbnMucmVmcmVzaCk7XG4gIGlmICghcmVtb3RlVXJsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZW1vdGUgPSBwYXJzZVByb2plY3RHaFJlbW90ZShyZW1vdGVVcmwpO1xuICBpZiAoIXJlbW90ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZWZmZWN0aXZlSG9zdCA9IHJlc29sdmVTc2hIb3N0TmFtZShyZW1vdGUuaG9zdCwgcm9vdCwgb3B0aW9ucy5yZWZyZXNoKSA/PyByZW1vdGUuaG9zdDtcblxuICBjb25zdCBzdGF0dXMgPSBnaENvbW1hbmQub3V0cHV0KFtcImF1dGhcIiwgXCJzdGF0dXNcIiwgXCItLWpzb25cIiwgXCJob3N0c1wiXSwgcm9vdCwge1xuICAgIGNhY2hlOiBmYWxzZSxcbiAgfSk7XG4gIGlmICghc3RhdHVzKSB7XG4gICAgcHJvamVjdEdoQWNjb3VudENhY2hlLnNldChrZXksIG51bGwpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHBhcnNlZDoge1xuICAgIGhvc3RzPzogUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAgQXJyYXk8eyBhY3RpdmU/OiBib29sZWFuOyBob3N0Pzogc3RyaW5nOyBsb2dpbj86IHN0cmluZzsgc3RhdGU/OiBzdHJpbmcgfT5cbiAgICA+O1xuICB9O1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2Uoc3RhdHVzKSBhcyB0eXBlb2YgcGFyc2VkO1xuICB9IGNhdGNoIHtcbiAgICBwcm9qZWN0R2hBY2NvdW50Q2FjaGUuc2V0KGtleSwgbnVsbCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBhY2NvdW50cyA9IE9iamVjdC5lbnRyaWVzKHBhcnNlZC5ob3N0cyA/PyB7fSkuZmxhdE1hcCgoW2hvc3QsIGVudHJpZXNdKSA9PlxuICAgIGVudHJpZXNcbiAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5zdGF0ZSA9PT0gXCJzdWNjZXNzXCIgJiYgZW50cnkubG9naW4pXG4gICAgICAubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgICAgYWN0aXZlOiBlbnRyeS5hY3RpdmUgPT09IHRydWUsXG4gICAgICAgIGhvc3Q6IGVudHJ5Lmhvc3QgPz8gaG9zdCxcbiAgICAgICAgbG9naW46IGVudHJ5LmxvZ2luISxcbiAgICAgIH0pKSxcbiAgKTtcbiAgYWNjb3VudHMuc29ydCgobGVmdCwgcmlnaHQpID0+IHtcbiAgICBjb25zdCByYW5rID0gKGFjY291bnQ6ICh0eXBlb2YgYWNjb3VudHMpW251bWJlcl0pOiBudW1iZXIgPT4ge1xuICAgICAgaWYgKHJlbW90ZS5hY2NvdW50SGludCAmJiBhY2NvdW50LmxvZ2luID09PSByZW1vdGUuYWNjb3VudEhpbnQpIHJldHVybiAwO1xuICAgICAgaWYgKGFjY291bnQuaG9zdCA9PT0gZWZmZWN0aXZlSG9zdCAmJiBhY2NvdW50LmFjdGl2ZSkgcmV0dXJuIDE7XG4gICAgICBpZiAoYWNjb3VudC5ob3N0ID09PSBlZmZlY3RpdmVIb3N0KSByZXR1cm4gMjtcbiAgICAgIGlmIChhY2NvdW50LmFjdGl2ZSkgcmV0dXJuIDM7XG4gICAgICByZXR1cm4gNDtcbiAgICB9O1xuICAgIHJldHVybiByYW5rKGxlZnQpIC0gcmFuayhyaWdodCk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgYWNjb3VudCBvZiBhY2NvdW50cykge1xuICAgIGNvbnN0IHRva2VuID0gZ2hDb21tYW5kLm91dHB1dChcbiAgICAgIFtcImF1dGhcIiwgXCJ0b2tlblwiLCBcIi0taG9zdG5hbWVcIiwgYWNjb3VudC5ob3N0LCBcIi0tdXNlclwiLCBhY2NvdW50LmxvZ2luXSxcbiAgICAgIHJvb3QsXG4gICAgICB7IGNhY2hlOiBmYWxzZSB9LFxuICAgICk7XG4gICAgaWYgKCF0b2tlbikgY29udGludWU7XG4gICAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiwgR0hfSE9TVDogYWNjb3VudC5ob3N0LCBHSF9UT0tFTjogdG9rZW4gfTtcbiAgICBpZiAoXG4gICAgICAhZ2hDb21tYW5kLnN1Y2NlZWRzKFxuICAgICAgICBbXCJhcGlcIiwgXCItLWhvc3RuYW1lXCIsIGFjY291bnQuaG9zdCwgYHJlcG9zLyR7cmVtb3RlLnJlcG9zaXRvcnl9YCwgXCItLXNpbGVudFwiXSxcbiAgICAgICAgcm9vdCxcbiAgICAgICAgeyBjYWNoZTogZmFsc2UsIGVudiB9LFxuICAgICAgKVxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkID0geyBlbnYsIGhvc3Q6IGFjY291bnQuaG9zdCwgbG9naW46IGFjY291bnQubG9naW4sIHJlbW90ZSwgcm9vdCB9O1xuICAgIHByb2plY3RHaEFjY291bnRDYWNoZS5zZXQoa2V5LCBzZWxlY3RlZCk7XG4gICAgcmV0dXJuIHNlbGVjdGVkO1xuICB9XG4gIHByb2plY3RHaEFjY291bnRDYWNoZS5zZXQoa2V5LCBudWxsKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBGYWxsYmFjazogbm9ybWFsaXplIGBnaXQgcmVtb3RlIGdldC11cmwgb3JpZ2luYCB0byBhIHBsYWluXG4gKiBgaHR0cHM6Ly9ob3N0L293bmVyL3JlcG9gIFVSTC4gc2NwLWxpa2UgLyBgc3NoOi8vYCAvIGBnaXQ6Ly9gIC9cbiAqIGVtYmVkZGVkLWNyZWRlbnRpYWwgZm9ybXMgYXJlIHJld3JpdHRlbiB0byBodHRwcywgYW5kIGFuIHNzaCBob3N0IGFsaWFzIGlzXG4gKiBmb2xsb3dlZCB0byBpdHMgcmVhbCBob3N0bmFtZS5cbiAqL1xuZnVuY3Rpb24gcmVwb3NpdG9yeVVybEZyb21HaXQoY3dkPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3ID0gZ2l0UmVtb3RlVXJsKGN3ZCk7XG4gIGlmICghcmF3KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgc2NoZW1lIHRvIGh0dHBzIGF0IHRoZSBzdHJpbmcgbGV2ZWwgZmlyc3Q6IHRoZSBXSEFUV0cgYFVSTGBcbiAgLy8gcGFyc2VyIGNhbid0IGNvbnZlcnQgYSBub24tc3BlY2lhbCBzY2hlbWUgKGBzc2hgL2BnaXRgKSB0byBgaHR0cHNgICh0aGVcbiAgLy8gYHByb3RvY29sYCBzZXR0ZXIgbm8tb3BzKSwgYW5kIHNjcC1saWtlIGBnaXRAaG9zdDpvd25lci9yZXBvYCBpc24ndCBhIFVSTCBhdFxuICAvLyBhbGwuIFJld3JpdGUgYm90aCBpbnRvIGFuIGBodHRwczovL2Agc3RyaW5nLCB0aGVuIGxldCB7QGxpbmsgbmV0LnVybEJ1aWxkZXJ9XG4gIC8vIG93biB0aGUgc3RydWN0dXJlZCBlZGl0cyAoc3RyaXAgY3JlZGVudGlhbHMsIHN3YXAgdGhlIGhvc3QpLlxuICBsZXQgaHR0cHMgPSByYXcucmVwbGFjZSgvXmdpdFxcKy8sIFwiXCIpO1xuICBjb25zdCBzY3AgPSAvXlteQF0rQChbXjpdKyk6KC4rKSQvLmV4ZWMoaHR0cHMpO1xuICBpZiAoc2NwKSBodHRwcyA9IGBodHRwczovLyR7c2NwWzFdfS8ke3NjcFsyXX1gO1xuICBodHRwcyA9IGh0dHBzLnJlcGxhY2UoL14oc3NofGdpdCk6XFwvXFwvLywgXCJodHRwczovL1wiKTtcblxuICBsZXQgYnVpbGRlciA9IG5ldC51cmxCdWlsZGVyKGh0dHBzKTtcbiAgaWYgKCFidWlsZGVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBEcm9wIGFueSBlbWJlZGRlZCBgdXNlcls6cGFzc11AYCBjcmVkZW50aWFscy5cbiAgaWYgKGJ1aWxkZXIudXNlcm5hbWUgfHwgYnVpbGRlci5wYXNzd29yZCkge1xuICAgIGJ1aWxkZXIgPSBidWlsZGVyLndpdGgoXCJ1c2VybmFtZVwiLCBcIlwiKS53aXRoKFwicGFzc3dvcmRcIiwgXCJcIik7XG4gIH1cbiAgLy8gRm9sbG93IGFuIHNzaCBob3N0IGFsaWFzIHRvIHRoZSB0cnVlIGhvc3QuXG4gIGNvbnN0IHJlYWxIb3N0ID0gcmVzb2x2ZVNzaEhvc3ROYW1lKGJ1aWxkZXIuaG9zdG5hbWUsIGN3ZCk7XG4gIGlmIChyZWFsSG9zdCkgYnVpbGRlciA9IGJ1aWxkZXIud2l0aChcImhvc3RuYW1lXCIsIHJlYWxIb3N0KTtcblxuICByZXR1cm4gYCR7YnVpbGRlci5vcmlnaW59JHtidWlsZGVyLnBhdGhuYW1lLnJlcGxhY2UoL1xcLmdpdCQvLCBcIlwiKX1gO1xufVxuXG4vKipcbiAqIFRoZSByZXBvJ3MgY2Fub25pY2FsIHJlbW90ZSBVUkwsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gZ2l0IHJlbW90ZS5cbiAqIE5vcm1hbGl6ZXMgYGdpdCByZW1vdGUgZ2V0LXVybCBvcmlnaW5gIGxvY2FsbHkgZmlyc3QsIGluY2x1ZGluZyBTU0ggYWxpYXNlcyxcbiAqIGFuZCBvbmx5IGFza3MgYGdoIHJlcG8gdmlld2Agd2hlbiB0aGUgcmVtb3RlIGNhbm5vdCBiZSBwYXJzZWQuIFRoaXMga2VlcHNcbiAqIGF1dGhlbnRpY2F0ZWQgR2l0SHViIGFjY291bnQgZGlzY292ZXJ5IGxhenkgZm9yIGNhbGxlcnMgdGhhdCBhY3R1YWxseSBuZWVkXG4gKiBpdC4gQSBibGFuaywgb21pdHRlZCwgb3IgZXhwbGljaXRseSBjdXJyZW50IGBjd2RgIHJldXNlcyBjYWNoZWQgY29tbWFuZFxuICogcHJvYmVzOyBhbm90aGVyIHJlc29sdmVkIGRpcmVjdG9yeSBleGVjdXRlcyBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0gY3dkIC0gZGlyZWN0b3J5IHRvIHJlc29sdmUgZnJvbSAoZGVmYXVsdHMgdG8gYHByb2Nlc3MuY3dkKClgKS5cbiAqIEBwYXJhbSBmb3JtYXQgLSBgXCJodHRwc1wiYCAoZGVmYXVsdCkgeWllbGRzIGBodHRwczovL2hvc3Qvb3duZXIvcmVwb2A7XG4gKiAgIGBcIm5wbVwiYCB5aWVsZHMgbnBtJ3MgYGdpdCtodHRwczovL2hvc3Qvb3duZXIvcmVwby5naXRgIGZvcm0gKGZvciBhXG4gKiAgIGBwYWNrYWdlLmpzb25gIGByZXBvc2l0b3J5LnVybGAgdGhhdCBwYXNzZXMgbnBtIHByb3ZlbmFuY2UpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb3NpdG9yeVVybChjd2Q/OiBzdHJpbmcsIGZvcm1hdDogXCJodHRwc1wiIHwgXCJucG1cIiA9IFwiaHR0cHNcIik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgY29uc3QgaHR0cHMgPSByZXBvc2l0b3J5VXJsRnJvbUdpdChyZXNvbHZlZCkgPz8gcmVwb3NpdG9yeVVybEZyb21HaChyZXNvbHZlZCk7XG4gIGlmICghaHR0cHMpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBmb3JtYXQgPT09IFwibnBtXCIgPyBgZ2l0KyR7aHR0cHMucmVwbGFjZSgvXFwuZ2l0JC8sIFwiXCIpfS5naXRgIDogaHR0cHM7XG59XG5cbi8qKiBQdWJsaWMgbnBtLCB1c2VkIG9ubHkgYWZ0ZXIgZW52LCBucG1yYywgYnVuZmlnLCBhbmQgcG5wbSB5YW1sIG1pc3MuICovXG5jb25zdCBERUZBVUxUX05QTV9SRUdJU1RSWSA9IFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvXCI7XG5cbi8qKiBJbnB1dHMgdGhhdCBjb250cm9sIGFjdGl2ZSBucG0gcmVnaXN0cnkgZGlzY292ZXJ5LiAqL1xuZXhwb3J0IHR5cGUgTnBtUmVnaXN0cnlPcHRpb25zID0ge1xuICAvKiogU2tpcCBwdWJsaWMgbnBtanMub3JnIHNvIGNhbGxlcnMgY2FuIGRldGVjdCBhIGNvbmZpZ3VyZWQgb3ZlcnJpZGUuICovXG4gIG92ZXJyaWRlT25seT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSZWFkIGBucG1fY29uZmlnX3JlZ2lzdHJ5YCwgYE5QTV9DT05GSUdfUkVHSVNUUllgLCBhbmQgYEJVTl9DT05GSUdfUkVHSVNUUllgXG4gICAqIGZpcnN0LiBEZWZhdWx0cyB0byB0cnVlIHNvIHRoZSBzYW1lIGNhc2NhZGUgYSBwYWNrYWdlIG1hbmFnZXIgdXNlcyBpcyB0aGVcbiAgICogZGVmYXVsdC5cbiAgICovXG4gIGVudlZhcnM/OiBib29sZWFuO1xufTtcblxuY29uc3QgbnBtUmVnaXN0cnlDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBuZXQuVXJsQnVpbGRlciB8IHVuZGVmaW5lZD4oKTtcblxuLyoqXG4gKiBUaGUgYWN0aXZlIG5wbSByZWdpc3RyeSBhcyBhIGNoYWluYWJsZSB7QGxpbmsgbmV0LlVybEJ1aWxkZXJ9LlxuICpcbiAqIFJlc29sdXRpb24gaXMgbWFuYWdlci1hZ25vc3RpYyBhbmQgbWVtb2l6ZWQgcGVyIGN3ZCBwbHVzIG9wdGlvbnM6IGVudmlyb25tZW50XG4gKiB2YXJpYWJsZXMsIHRoZW4gYC5ucG1yY2AgKHByb2plY3QgYW5jZXN0b3JzLCB1c2VyLCBnbG9iYWwpLCB0aGVuIEJ1blxuICogYGJ1bmZpZy50b21sYCBgaW5zdGFsbC5yZWdpc3RyeWAsIHRoZW4gcG5wbSB3b3Jrc3BhY2UvZ2xvYmFsIFlBTUwsIHRoZW5cbiAqIGBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9gLiBgb3ZlcnJpZGVPbmx5YCBza2lwcyB0aGF0IHB1YmxpYyBkZWZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbnBtUmVnaXN0cnkoXG4gIGN3ZD86IHN0cmluZyB8IG51bGwsXG4gIG9wdGlvbnM/OiBOcG1SZWdpc3RyeU9wdGlvbnMsXG4pOiBuZXQuVXJsQnVpbGRlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgY29uc3QgZW52VmFycyA9IG9wdGlvbnM/LmVudlZhcnMgIT09IGZhbHNlO1xuICBjb25zdCBvdmVycmlkZU9ubHkgPSBCb29sZWFuKG9wdGlvbnM/Lm92ZXJyaWRlT25seSk7XG4gIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtcbiAgICByZXNvbHZlZCxcbiAgICBvdmVycmlkZU9ubHksXG4gICAgZW52VmFycyxcbiAgICBob21lZGlyKCksXG4gICAgcHJvY2Vzcy5lbnYuTlBNX0NPTkZJR19VU0VSQ09ORklHID8/IFwiXCIsXG4gICAgcHJvY2Vzcy5lbnYuTlBNX0NPTkZJR19HTE9CQUxDT05GSUcgPz8gXCJcIixcbiAgICBwcm9jZXNzLmVudi5QUkVGSVggPz8gXCJcIixcbiAgICBlbnZWYXJzID8gKHByb2Nlc3MuZW52Lm5wbV9jb25maWdfcmVnaXN0cnkgPz8gXCJcIikgOiBcIlwiLFxuICAgIGVudlZhcnMgPyAocHJvY2Vzcy5lbnYuTlBNX0NPTkZJR19SRUdJU1RSWSA/PyBcIlwiKSA6IFwiXCIsXG4gICAgZW52VmFycyA/IChwcm9jZXNzLmVudi5CVU5fQ09ORklHX1JFR0lTVFJZID8/IFwiXCIpIDogXCJcIixcbiAgXSk7XG4gIGlmIChucG1SZWdpc3RyeUNhY2hlLmhhcyhrZXkpKSByZXR1cm4gbnBtUmVnaXN0cnlDYWNoZS5nZXQoa2V5KTtcbiAgY29uc3QgdmFsdWUgPSByZXNvbHZlTnBtUmVnaXN0cnkocmVzb2x2ZWQsIHsgb3ZlcnJpZGVPbmx5LCBlbnZWYXJzIH0pO1xuICBucG1SZWdpc3RyeUNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTnBtUmVnaXN0cnkoXG4gIGN3ZDogc3RyaW5nLFxuICBvcHRpb25zOiB7IG92ZXJyaWRlT25seTogYm9vbGVhbjsgZW52VmFyczogYm9vbGVhbiB9LFxuKTogbmV0LlVybEJ1aWxkZXIgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBucG1SZWdpc3RyeUNhbmRpZGF0ZXMoY3dkLCBvcHRpb25zLmVudlZhcnMpKSB7XG4gICAgY29uc3QgdXJsID0gdG9SZWdpc3RyeVVybChjYW5kaWRhdGUsIG9wdGlvbnMub3ZlcnJpZGVPbmx5KTtcbiAgICBpZiAodXJsKSByZXR1cm4gdXJsO1xuICB9XG4gIHJldHVybiB0b1JlZ2lzdHJ5VXJsKERFRkFVTFRfTlBNX1JFR0lTVFJZLCBvcHRpb25zLm92ZXJyaWRlT25seSk7XG59XG5cbmZ1bmN0aW9uKiBucG1SZWdpc3RyeUNhbmRpZGF0ZXMoY3dkOiBzdHJpbmcsIGVudlZhcnM6IGJvb2xlYW4pOiBHZW5lcmF0b3I8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChlbnZWYXJzKSB7XG4gICAgeWllbGQgcHJvY2Vzcy5lbnYubnBtX2NvbmZpZ19yZWdpc3RyeTtcbiAgICB5aWVsZCBwcm9jZXNzLmVudi5OUE1fQ09ORklHX1JFR0lTVFJZO1xuICAgIHlpZWxkIHByb2Nlc3MuZW52LkJVTl9DT05GSUdfUkVHSVNUUlk7XG4gIH1cbiAgZm9yIChjb25zdCBkaXIgb2YgYW5jZXN0b3JEaXJzKGN3ZCkpIHtcbiAgICB5aWVsZCByZWFkTnBtcmNSZWdpc3RyeShqb2luKGRpciwgXCIubnBtcmNcIikpO1xuICB9XG4gIHlpZWxkIHJlYWROcG1yY1JlZ2lzdHJ5KHByb2Nlc3MuZW52Lk5QTV9DT05GSUdfVVNFUkNPTkZJRyA/PyBqb2luKGhvbWVkaXIoKSwgXCIubnBtcmNcIikpO1xuICB5aWVsZCByZWFkTnBtcmNSZWdpc3RyeShwcm9jZXNzLmVudi5OUE1fQ09ORklHX0dMT0JBTENPTkZJRyA/PyBkZWZhdWx0R2xvYmFsTnBtcmMoKSk7XG4gIGZvciAoY29uc3QgZGlyIG9mIGFuY2VzdG9yRGlycyhjd2QpKSB7XG4gICAgeWllbGQgcmVhZEJ1bmZpZ1JlZ2lzdHJ5KGpvaW4oZGlyLCBcImJ1bmZpZy50b21sXCIpKTtcbiAgfVxuICB5aWVsZCByZWFkQnVuZmlnUmVnaXN0cnkoam9pbihob21lZGlyKCksIFwiYnVuZmlnLnRvbWxcIikpO1xuICBmb3IgKGNvbnN0IGRpciBvZiBhbmNlc3RvckRpcnMoY3dkKSkge1xuICAgIHlpZWxkIHJlYWRZYW1sUmVnaXN0cnkoam9pbihkaXIsIFwicG5wbS13b3Jrc3BhY2UueWFtbFwiKSk7XG4gIH1cbiAgZm9yIChjb25zdCBwYXRoIG9mIHBucG1HbG9iYWxDb25maWdQYXRocygpKSB7XG4gICAgeWllbGQgcmVhZFlhbWxSZWdpc3RyeShwYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1JlZ2lzdHJ5VXJsKFxuICBjYW5kaWRhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3ZlcnJpZGVPbmx5OiBib29sZWFuLFxuKTogbmV0LlVybEJ1aWxkZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCB0cmltbWVkID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjYW5kaWRhdGUpO1xuICBpZiAoIXRyaW1tZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKHRyaW1tZWQpO1xuICBpZiAoIXVybCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG92ZXJyaWRlT25seSAmJiBpc1B1YmxpY05wbVJlZ2lzdHJ5KHVybCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB1cmw7XG59XG5cbmZ1bmN0aW9uIGlzUHVibGljTnBtUmVnaXN0cnkodXJsOiBuZXQuVXJsQnVpbGRlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gdXJsLmhvc3RuYW1lID09PSBcInJlZ2lzdHJ5Lm5wbWpzLm9yZ1wiO1xufVxuXG5mdW5jdGlvbiogYW5jZXN0b3JEaXJzKGN3ZDogc3RyaW5nKTogR2VuZXJhdG9yPHN0cmluZz4ge1xuICBsZXQgY3VycmVudCA9IGN3ZDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB5aWVsZCBjdXJyZW50O1xuICAgIGNvbnN0IHBhcmVudCA9IGRpcm5hbWUoY3VycmVudCk7XG4gICAgaWYgKHBhcmVudCA9PT0gY3VycmVudCkgcmV0dXJuO1xuICAgIGN1cnJlbnQgPSBwYXJlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdEdsb2JhbE5wbXJjKCk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIpIHtcbiAgICByZXR1cm4gam9pbihwcm9jZXNzLmVudi5QUk9HUkFNREFUQSA/PyBcIkM6XFxcXFByb2dyYW1EYXRhXCIsIFwibnBtXCIsIFwiZXRjXCIsIFwibnBtcmNcIik7XG4gIH1cbiAgcmV0dXJuIGpvaW4ocHJvY2Vzcy5lbnYuUFJFRklYID8/IFwiL3Vzci9sb2NhbFwiLCBcImV0Y1wiLCBcIm5wbXJjXCIpO1xufVxuXG5mdW5jdGlvbiBwbnBtR2xvYmFsQ29uZmlnUGF0aHMoKTogc3RyaW5nW10ge1xuICBjb25zdCBob21lID0gaG9tZWRpcigpO1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIikge1xuICAgIHJldHVybiBbam9pbihob21lLCBcIkxpYnJhcnkvUHJlZmVyZW5jZXMvcG5wbS9jb25maWcueWFtbFwiKV07XG4gIH1cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIikge1xuICAgIHJldHVybiBbam9pbihwcm9jZXNzLmVudi5MT0NBTEFQUERBVEEgPz8gam9pbihob21lLCBcIkFwcERhdGEvTG9jYWxcIiksIFwicG5wbS9jb25maWcueWFtbFwiKV07XG4gIH1cbiAgcmV0dXJuIFtqb2luKGhvbWUsIFwiLmNvbmZpZy9wbnBtL2NvbmZpZy55YW1sXCIpXTtcbn1cblxuZnVuY3Rpb24gcmVhZE5wbXJjUmVnaXN0cnkocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNhY2hlZFJlY29yZChgbnBtcmMtcmVnaXN0cnk6JHtwYXRofWAsICgpID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gcmVhZFRleHRGaWxlKHBhdGgpO1xuICAgIGNvbnN0IHJlZ2lzdHJ5ID0gdGV4dCA/IHBhcnNlSW5pUmVnaXN0cnkodGV4dCkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlZ2lzdHJ5ID8geyByZWdpc3RyeSB9IDogdW5kZWZpbmVkO1xuICB9KT8ucmVnaXN0cnk7XG59XG5cbmZ1bmN0aW9uIHJlYWRCdW5maWdSZWdpc3RyeShwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2FjaGVkUmVjb3JkKGBidW5maWctcmVnaXN0cnk6JHtwYXRofWAsICgpID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gcmVhZFRleHRGaWxlKHBhdGgpO1xuICAgIGNvbnN0IHJlZ2lzdHJ5ID0gdGV4dCA/IHBhcnNlQnVuZmlnUmVnaXN0cnkodGV4dCkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlZ2lzdHJ5ID8geyByZWdpc3RyeSB9IDogdW5kZWZpbmVkO1xuICB9KT8ucmVnaXN0cnk7XG59XG5cbmZ1bmN0aW9uIHJlYWRZYW1sUmVnaXN0cnkocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNhY2hlZFJlY29yZChgeWFtbC1yZWdpc3RyeToke3BhdGh9YCwgKCkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSByZWFkVGV4dEZpbGUocGF0aCk7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlWWFtbCh0ZXh0KTtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChwYXJzZWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlZ2lzdHJ5ID0geWFtbFJlZ2lzdHJ5KHBhcnNlZCk7XG4gICAgcmV0dXJuIHJlZ2lzdHJ5ID8geyByZWdpc3RyeSB9IDogdW5kZWZpbmVkO1xuICB9KT8ucmVnaXN0cnk7XG59XG5cbmZ1bmN0aW9uIHJlYWRUZXh0RmlsZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWZpbGVTdGF0U3luYyhwYXRoKT8uaXNGaWxlKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiByZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpO1xufVxuXG4vKiogUGFyc2UgYSBgcmVnaXN0cnk9YCBhc3NpZ25tZW50IGZyb20gbnBtcmMgLyBpbmkgdGV4dC4gKi9cbmZ1bmN0aW9uIHBhcnNlSW5pUmVnaXN0cnkodGV4dDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCByYXcgb2YgdGV4dC5zcGxpdCgvXFxyP1xcbi8pKSB7XG4gICAgY29uc3QgbGluZSA9IHJhdy50cmltKCk7XG4gICAgaWYgKCFsaW5lIHx8IGxpbmUuc3RhcnRzV2l0aChcIiNcIikgfHwgbGluZS5zdGFydHNXaXRoKFwiO1wiKSkgY29udGludWU7XG4gICAgY29uc3QgZXEgPSBsaW5lLmluZGV4T2YoXCI9XCIpO1xuICAgIGlmIChlcSA9PT0gLTEpIGNvbnRpbnVlO1xuICAgIGlmIChsaW5lLnNsaWNlKDAsIGVxKS50cmltKCkgIT09IFwicmVnaXN0cnlcIikgY29udGludWU7XG4gICAgcmV0dXJuIHVucXVvdGVJbmlWYWx1ZShsaW5lLnNsaWNlKGVxICsgMSkpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVhZCBCdW4gYGluc3RhbGwucmVnaXN0cnlgIGZyb20gYSBidW5maWcudG9tbC4gVGFibGUgZm9ybVxuICogYFtpbnN0YWxsLnJlZ2lzdHJ5XWAgd2l0aCBgdXJsID0gXCIuLi5cImAgaXMgYWNjZXB0ZWQ7IHNjb3BlZCBtYXBzIGFyZSBpZ25vcmVkLlxuICovXG5mdW5jdGlvbiBwYXJzZUJ1bmZpZ1JlZ2lzdHJ5KHRleHQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBzZWN0aW9uID0gXCJcIjtcbiAgZm9yIChjb25zdCByYXcgb2YgdGV4dC5zcGxpdCgvXFxyP1xcbi8pKSB7XG4gICAgY29uc3QgbGluZSA9IHN0cmlwVG9tbENvbW1lbnQocmF3KS50cmltKCk7XG4gICAgaWYgKCFsaW5lKSBjb250aW51ZTtcbiAgICBjb25zdCBoZWFkZXIgPSAvXlxcWyhbXlxcXV0rKVxcXSQvLmV4ZWMobGluZSk7XG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgc2VjdGlvbiA9IGhlYWRlclsxXSEudHJpbSgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGVxID0gbGluZS5pbmRleE9mKFwiPVwiKTtcbiAgICBpZiAoZXEgPT09IC0xKSBjb250aW51ZTtcbiAgICBjb25zdCBrZXkgPSBsaW5lLnNsaWNlKDAsIGVxKS50cmltKCk7XG4gICAgY29uc3QgdmFsdWUgPSB1bnF1b3RlSW5pVmFsdWUobGluZS5zbGljZShlcSArIDEpKTtcbiAgICBpZiAoc2VjdGlvbiA9PT0gXCJpbnN0YWxsXCIgJiYga2V5ID09PSBcInJlZ2lzdHJ5XCIgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoXCJ7XCIpKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHNlY3Rpb24gPT09IFwiaW5zdGFsbC5yZWdpc3RyeVwiICYmIGtleSA9PT0gXCJ1cmxcIikgcmV0dXJuIHZhbHVlO1xuICAgIGlmICghc2VjdGlvbiAmJiBrZXkgPT09IFwiaW5zdGFsbC5yZWdpc3RyeVwiKSByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24geWFtbFJlZ2lzdHJ5KGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBkYXRhLnJlZ2lzdHJ5ID09PSBcInN0cmluZ1wiKSByZXR1cm4gZGF0YS5yZWdpc3RyeTtcbiAgY29uc3QgcmVnaXN0cmllcyA9IGRhdGEucmVnaXN0cmllcztcbiAgaWYgKG9iamVjdC5pc1JlY29yZChyZWdpc3RyaWVzKSAmJiB0eXBlb2YgcmVnaXN0cmllcy5kZWZhdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHJlZ2lzdHJpZXMuZGVmYXVsdDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1bnF1b3RlSW5pVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gIGNvbnN0IGNvbW1lbnQgPSB0cmltbWVkLnNlYXJjaCgvXFxzKyMvKTtcbiAgY29uc3QgcmF3ID0gY29tbWVudCA9PT0gLTEgPyB0cmltbWVkIDogdHJpbW1lZC5zbGljZSgwLCBjb21tZW50KS50cmltKCk7XG4gIGlmICgocmF3LnN0YXJ0c1dpdGgoJ1wiJykgJiYgcmF3LmVuZHNXaXRoKCdcIicpKSB8fCAocmF3LnN0YXJ0c1dpdGgoXCInXCIpICYmIHJhdy5lbmRzV2l0aChcIidcIikpKSB7XG4gICAgcmV0dXJuIHJhdy5zbGljZSgxLCAtMSk7XG4gIH1cbiAgcmV0dXJuIHJhdztcbn1cblxuZnVuY3Rpb24gc3RyaXBUb21sQ29tbWVudChsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBoYXNoID0gbGluZS5pbmRleE9mKFwiI1wiKTtcbiAgcmV0dXJuIGhhc2ggPT09IC0xID8gbGluZSA6IGxpbmUuc2xpY2UoMCwgaGFzaCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrYWdlTmFtZShwa2dQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWZpbGVTdGF0U3luYyhwa2dQYXRoKT8uaXNGaWxlKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBzdHJpbmdVdGlscy50cmltVG9OdWxsKGpzb24ucGFyc2VSZWNvcmQocmVhZEZpbGVTeW5jKHBrZ1BhdGgsIFwidXRmOFwiKSk/Lm5hbWUpID8/IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
603
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0LXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBUyxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzdELE9BQU8sRUFDTCxXQUFXLEVBRVgsVUFBVSxFQUNWLFFBQVEsRUFDUixVQUFVLEdBQ1gsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsSUFBSSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbkUsTUFBTSxZQUFZLEdBQUc7SUFDbkIsY0FBYztJQUNkLGNBQWM7SUFDZCxlQUFlO0lBQ2YsZUFBZTtJQUNmLGNBQWM7Q0FDTixDQUFDO0FBRVgscUZBQXFGO0FBQ3JGLE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxHQUFtQjtJQUN6RCxPQUFPLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQWdDRCxTQUFTLDJCQUEyQixDQUNsQyxPQUFlLEVBQ2YsSUFBYyxFQUNkLEdBQVcsRUFDWCxHQUF1QjtJQUV2QixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtRQUN0QyxHQUFHO1FBQ0gsR0FBRyxFQUFFLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRztRQUN2QixL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QyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsSUFBWTtJQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxPQUFlO0lBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDdkQsT0FBTyxVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUM7QUFDbkYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVwb3NpdG9yeSwgcGFja2FnZSwgYnVuZGxlLCBhbmQgcHJvamVjdCBkaXNjb3ZlcnkgZm9yIE5vZGUgYW5kIEJ1biB0b29scy5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyB0aGUgc2hhcmVkIG93bmVyIGZvciB3b3JraW5nLWRpcmVjdG9yeSBub3JtYWxpemF0aW9uLCBwcm9qZWN0XG4gKiByb290cywgcmVwb3NpdG9yeSBVUkxzLCBwYWNrYWdlIG5hbWVzLCBhbmQgRGF0YWJyaWNrcyBidW5kbGUgY29udGV4dC4gUmV1c2UgaXRcbiAqIGluc3RlYWQgb2YgYWRkaW5nIHBhY2thZ2UtbG9jYWwgcm9vdC1tYXJrZXIgd2Fsa3Mgb3IgR2l0IHJlbW90ZSBwYXJzaW5nLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBTdGF0cywgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQge1xuICBwYXJzZVJlY29yZCxcbiAgdHlwZSBVcmxCdWlsZGVyLFxuICB1cmxCdWlsZGVyLFxuICBpc1JlY29yZCxcbiAgdHJpbVRvTnVsbCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlWWFtbCB9IGZyb20gXCJ5YW1sXCI7XG5pbXBvcnQgeyBjYWNoZWRSZWNvcmQsIHN0YXRTeW5jIGFzIGZpbGVTdGF0U3luYyB9IGZyb20gXCIuL2ZpbGUudHNcIjtcblxuY29uc3QgUk9PVF9NQVJLRVJTID0gW1xuICBcIi5wcm9qZW5yYy50c1wiLFxuICBcIi5wcm9qZW5yYy5qc1wiLFxuICBcIi5wcm9qZW5yYy5tanNcIixcbiAgXCIucHJvamVucmMuY2pzXCIsXG4gIFwicGFja2FnZS5qc29uXCIsXG5dIGFzIGNvbnN0O1xuXG4vKiogUmVzb2x2ZSBhIGJsYW5rLCBudWxsLCBvbWl0dGVkLCByZWxhdGl2ZSwgb3IgYWJzb2x1dGUgY3dkIHRvIGFuIGFic29sdXRlIHBhdGguICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkPzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XG4gIHJldHVybiByZXNvbHZlKHRyaW1Ub051bGwoY3dkKSA/PyBwcm9jZXNzLmN3ZCgpKTtcbn1cblxuLyoqIEEgY29tbWFuZCdzIHN0ZG91dCwgY2xhc3NpZmllZCBhcyBhIGZpbGVzeXN0ZW0gcGF0aCBhbmQvb3IgYSBVUkwuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RDb250ZXh0IHtcbiAgcmVhZG9ubHkgb3V0cHV0Pzogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgY29tbWFuZCBleGl0ZWQgc3VjY2Vzc2Z1bGx5LiAqL1xuICByZWFkb25seSBzdWNjZXNzOiBib29sZWFuO1xuICAvKiogYG91dHB1dGAgd2hlbiBpdCBuYW1lcyBzb21ldGhpbmcgb24gZGlzay4gKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgLyoqIGBmaWxlLnN0YXRTeW5jYCBvZiB7QGxpbmsgcGF0aH0sIHdoZW4gaXQgZXhpc3RzLiAqL1xuICByZWFkb25seSBwYXRoU3RhdHM/OiBTdGF0cztcbiAgLyoqXG4gICAqIGBvdXRwdXRgIHBhcnNlZCBpbnRvIGEgY2hhaW5hYmxlIHtAbGluayBuZXQuVXJsQnVpbGRlcn0sIHdoZW4gaXQgaXMgYSByZWFsXG4gICAqIG5ldHdvcmsgVVJMIC0gYSBub24tYmxhbmsgc2NoZW1lIChub3QgYGZpbGU6YCkgQU5EIGEgbm9uLWJsYW5rIGhvc3RuYW1lLlxuICAgKiBCYXJlIHBhdGhzLCBzY3AtbGlrZSBgZ2l0QGhvc3Q6Li4uYCByZW1vdGVzLCBhbmQgYGZpbGU6YCBVUkxzIHN0YXkgdW5zZXQuXG4gICAqL1xuICByZWFkb25seSB1cmw/OiBVcmxCdWlsZGVyO1xufVxuXG4vKipcbiAqIGJlY2F1c2UgdGhpcyBpcyBjcnVjaWFsIGRvIG5vdCB1c2UgZXhlYy5zcGF3blN5bmNcbiAqXG4gKiBSdW4gYGNvbW1hbmQgYXJnc2AgaW4gYGN3ZGAgYW5kIGNsYXNzaWZ5IGl0cyBzdGRvdXQ6IGBwYXRoYCArIGBwYXRoU3RhdHNgIHdoZW5cbiAqIHRoZSBvdXRwdXQgbmFtZXMgc29tZXRoaW5nIG9uIGRpc2ssIGB1cmxgIChhIHtAbGluayBuZXQuVXJsQnVpbGRlcn0pIHdoZW4gaXRcbiAqIHBhcnNlcyBhcyBhIHJlYWwgbmV0d29yayBVUkwuIEVtcHR5IHtAbGluayBQcm9qZWN0Q29udGV4dH0gb24gYSBub24temVybyBleGl0XG4gKiBvciBlbXB0eSBvdXRwdXQuXG4gKi9cbmludGVyZmFjZSBQcm9qZWN0Q29tbWFuZE9wdGlvbnMge1xuICByZWFkb25seSBjYWNoZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0Q29udGV4dENvbW1hbmRPdXRwdXQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nW10sXG4gIGN3ZDogc3RyaW5nLFxuICBlbnY/OiBOb2RlSlMuUHJvY2Vzc0Vudixcbik6IFByb2plY3RDb250ZXh0IHtcbiAgY29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKGNvbW1hbmQsIGFyZ3MsIHtcbiAgICBjd2QsXG4gICAgZW52OiBlbnYgPz8gcHJvY2Vzcy5lbnYsXG4gICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJpZ25vcmVcIl0sXG4gIH0pO1xuICBjb25zdCBvdXRwdXQgPSByZXN1bHQ/LnN0ZG91dD8udG9TdHJpbmcoKT8udHJpbSgpO1xuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCAmJiBvdXRwdXQpIHtcbiAgICBjb25zdCBwYXRoU3RhdHMgPSBmaWxlU3RhdFN5bmMob3V0cHV0KTtcbiAgICAvLyBPbmx5IGFuIEVYUExJQ0lUIGBzY2hlbWU6Ly8uLi5gIGNvdW50cyBhcyBhIFVSTC4gYHVybEJ1aWxkZXJgIG90aGVyd2lzZVxuICAgIC8vIHN5bnRoZXNpemVzIG9uZSAoYSBiYXJlIGBleGFtcGxlLmNvbWAgLT4gYGh0dHBzOi8v4oCmYCwgYW4gYWJzb2x1dGUgcGF0aCAtPlxuICAgIC8vIGBodHRwOi8vbG9jYWxob3N0L+KApmApLCB3aGljaCB3b3VsZCBtaXNsYWJlbCBkaXJlY3Rvcnkgb3V0cHV0cyBhbmQgYmFyZVxuICAgIC8vIHRva2VucyAtIHNvIGdhdGUgb24gdGhlIHJhdyBvdXRwdXQgYWxyZWFkeSBjYXJyeWluZyBhIHNjaGVtZSArIGF1dGhvcml0eS5cbiAgICBjb25zdCB1cmwgPSAvXlthLXpdW2EtejAtOSsuLV0qOlxcL1xcLy9pLnRlc3Qob3V0cHV0KSA/IHVybEJ1aWxkZXIob3V0cHV0KSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBvdXRwdXQsIHBhdGg6IHBhdGhTdGF0cyA/IG91dHB1dCA6IHVuZGVmaW5lZCwgcGF0aFN0YXRzLCBzdWNjZXNzOiB0cnVlLCB1cmwgfTtcbiAgfVxuICByZXR1cm4geyBvdXRwdXQsIHN1Y2Nlc3M6IHJlc3VsdC5zdGF0dXMgPT09IDAgfTtcbn1cblxuY29uc3QgcHJvamVjdENvbW1hbmRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9qZWN0Q29udGV4dD4oKTtcblxuZnVuY3Rpb24gcHJvamVjdENvbnRleHRDb21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb2plY3RDb21tYW5kT3B0aW9ucyA9IHt9LFxuKTogUHJvamVjdENvbnRleHQge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIGNvbnN0IGNhY2hlID0gb3B0aW9ucy5jYWNoZSA/PyAoIW9wdGlvbnMuZW52ICYmIHJlc29sdmVkID09PSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeSgpKTtcbiAgY29uc3Qga2V5ID0gY2FjaGUgPyBKU09OLnN0cmluZ2lmeShbcmVzb2x2ZWQsIGNvbW1hbmQsIC4uLmFyZ3NdKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2FjaGVkID0gcHJvamVjdENvbW1hbmRDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBwcm9qZWN0Q29udGV4dENvbW1hbmRPdXRwdXQoY29tbWFuZCwgYXJncywgcmVzb2x2ZWQsIG9wdGlvbnMuZW52KTtcbiAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSBwcm9qZWN0Q29tbWFuZENhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0Q29tbWFuZChjb21tYW5kOiBzdHJpbmcpIHtcbiAgY29uc3QgY29udGV4dCA9IChhcmdzOiBzdHJpbmdbXSwgY3dkPzogc3RyaW5nLCBvcHRpb25zPzogUHJvamVjdENvbW1hbmRPcHRpb25zKTogUHJvamVjdENvbnRleHQgPT5cbiAgICBwcm9qZWN0Q29udGV4dENvbW1hbmQoY29tbWFuZCwgYXJncywgY3dkLCBvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICBjb250ZXh0LFxuICAgIG91dHB1dChhcmdzOiBzdHJpbmdbXSwgY3dkPzogc3RyaW5nLCBvcHRpb25zPzogUHJvamVjdENvbW1hbmRPcHRpb25zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0cmltVG9OdWxsKGNvbnRleHQoYXJncywgY3dkLCBvcHRpb25zKS5vdXRwdXQpID8/IHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIHJvb3QoYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IGNvbnRleHQoYXJncywgY3dkKTtcbiAgICAgIHJldHVybiBwYXJzZWQucGF0aFN0YXRzPy5pc0RpcmVjdG9yeSgpID8gcGFyc2VkLnBhdGggOiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICBzdWNjZWVkcyhhcmdzOiBzdHJpbmdbXSwgY3dkPzogc3RyaW5nLCBvcHRpb25zPzogUHJvamVjdENvbW1hbmRPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gY29udGV4dChhcmdzLCBjd2QsIG9wdGlvbnMpLnN1Y2Nlc3M7XG4gICAgfSxcbiAgfTtcbn1cblxuY29uc3QgZ2l0Q29tbWFuZCA9IHByb2plY3RDb21tYW5kKFwiZ2l0XCIpO1xuY29uc3QgZ2hDb21tYW5kID0gcHJvamVjdENvbW1hbmQoXCJnaFwiKTtcbmNvbnN0IG5wbUNvbW1hbmQgPSBwcm9qZWN0Q29tbWFuZChcIm5wbVwiKTtcbmNvbnN0IHNzaENvbW1hbmQgPSBwcm9qZWN0Q29tbWFuZChcInNzaFwiKTtcblxuZnVuY3Rpb24gZ2l0UmVtb3RlVXJsKGN3ZD86IHN0cmluZywgcmVtb3RlID0gXCJvcmlnaW5cIiwgcmVmcmVzaCA9IGZhbHNlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdpdENvbW1hbmQub3V0cHV0KFtcInJlbW90ZVwiLCBcImdldC11cmxcIiwgcmVtb3RlXSwgY3dkLCB7IGNhY2hlOiAhcmVmcmVzaCB9KTtcbn1cblxuLyoqXG4gKiBDbG9zZXN0IGRpcmVjdG9yeSB3aXRoIGEgYHBhY2thZ2UuanNvbmAgb3IgYG5vZGVfbW9kdWxlc2AsIG1hdGNoaW5nIGBucG0gcHJlZml4YC5cbiAqXG4gKiBMaWZlY3ljbGUgc2NyaXB0cyBmcm9tIG5wbSBhbmQgQnVuIHNldCBgbnBtX2NvbmZpZ19sb2NhbF9wcmVmaXhgIHRvIHRoYXRcbiAqIGRpcmVjdG9yeS4gUmVhZCBpdCBmaXJzdCB3aGVuIHJlc29sdmluZyB0aGlzIHByb2Nlc3MncyBjd2Qgc28gYSBtaXNzaW5nIG5wbVxuICogQ0xJIGlzIG5vdCByZXF1aXJlZC4gYG5wbV9jb25maWdfcHJlZml4YCAvIGBQUkVGSVhgIGFyZSB0aGUgZ2xvYmFsIGluc3RhbGxcbiAqIHByZWZpeCBhbmQgbXVzdCBub3QgYmUgdXNlZCBoZXJlLlxuICpcbiAqIEJ1biBoYXMgbm8gcHJlZml4IGNvbW1hbmQgKGBidW4gcG0gYmluYCBpcyB0aGUgYC5iaW5gIGRpcmVjdG9yeSkuIHBucG0nc1xuICogYHByZWZpeGAgY29tbWFuZCBpcyB1bmltcGxlbWVudGVkOyBgcG5wbSByb290YCBwcmludHMgYG5vZGVfbW9kdWxlc2AuXG4gKi9cbmZ1bmN0aW9uIG5wbVJvb3QoY3dkPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBpZiAocmVzb2x2ZWQgPT09IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KCkpIHtcbiAgICBjb25zdCBmcm9tRW52ID0gZW52RGlyZWN0b3J5KHByb2Nlc3MuZW52Lm5wbV9jb25maWdfbG9jYWxfcHJlZml4KTtcbiAgICBpZiAoZnJvbUVudikgcmV0dXJuIGZyb21FbnY7XG4gIH1cbiAgcmV0dXJuIG5wbUNvbW1hbmQucm9vdChbXCJwcmVmaXhcIl0sIHJlc29sdmVkKTtcbn1cblxuZnVuY3Rpb24gZW52RGlyZWN0b3J5KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXRoID0gdHJpbVRvTnVsbCh2YWx1ZSk7XG4gIGlmICghcGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKHBhdGgpO1xuICByZXR1cm4gZmlsZVN0YXRTeW5jKHJlc29sdmVkKT8uaXNEaXJlY3RvcnkoKSA/IHJlc29sdmVkIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnaXRSb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgcmV0dXJuIGdpdENvbW1hbmQucm9vdChbXCJyZXYtcGFyc2VcIiwgXCItLXNob3ctdG9wbGV2ZWxcIl0sIHJlc29sdmVkKTtcbn1cblxuLyoqIFJlc29sdmUgdGhlIG5lYXJlc3QgcHJvamVjdCByb290IHdpdGhvdXQgd2Fsa2luZyBhYm92ZSBpdHMgbnBtIG9yIEdpdCBib3VuZGFyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgbGV0IGN1cnJlbnQgPSByZXNvbHZlZDtcblxuICBpZiAoIWZpbGVTdGF0U3luYyhjdXJyZW50KT8uaXNEaXJlY3RvcnkoKSkge1xuICAgIGN1cnJlbnQgPSBkaXJuYW1lKGN1cnJlbnQpO1xuICB9XG4gIGNvbnN0IGJvdW5kYXJpZXMgPSBuZXcgU2V0KFxuICAgIFtucG1Cb3VuZGFyeShyZXNvbHZlZCksIGdpdFJvb3QocmVzb2x2ZWQpXVxuICAgICAgLmZpbHRlcigocGF0aCk6IHBhdGggaXMgc3RyaW5nID0+IHBhdGggIT09IHVuZGVmaW5lZClcbiAgICAgIC5tYXAoKHBhdGgpID0+IHJlc29sdmUocGF0aCkpLFxuICApO1xuICBjb25zdCBoYXNCb3VuZGFyeSA9IGJvdW5kYXJpZXMuc2l6ZSA+IDA7XG4gIGxldCBiZXN0OiB7IGRpcjogc3RyaW5nOyBwcmlvcml0eTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgZm9yIChjb25zdCBbcHJpb3JpdHksIG1hcmtlcl0gb2YgUk9PVF9NQVJLRVJTLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGZpbGVTdGF0U3luYyhqb2luKGN1cnJlbnQsIG1hcmtlcikpPy5pc0ZpbGUoKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYmVzdCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgcHJpb3JpdHkgPCBiZXN0LnByaW9yaXR5IHx8XG4gICAgICAgICAgKHByaW9yaXR5ID09PSBiZXN0LnByaW9yaXR5ICYmIGN1cnJlbnQubGVuZ3RoIDwgYmVzdC5kaXIubGVuZ3RoKVxuICAgICAgICApIHtcbiAgICAgICAgICBiZXN0ID0geyBkaXI6IGN1cnJlbnQsIHByaW9yaXR5IH07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzQm91bmRhcnkgJiYgYmVzdCkge1xuICAgICAgcmV0dXJuIGJlc3QuZGlyO1xuICAgIH1cbiAgICBpZiAoYm91bmRhcmllcy5oYXMoY3VycmVudCkpIHtcbiAgICAgIHJldHVybiBiZXN0Py5kaXI7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGRpcm5hbWUoY3VycmVudCk7XG4gICAgaWYgKHBhcmVudCA9PT0gY3VycmVudCkge1xuICAgICAgcmV0dXJuIGJlc3Q/LmRpcjtcbiAgICB9XG4gICAgY3VycmVudCA9IHBhcmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBucG1Cb3VuZGFyeShjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IG5wbVJvb3QoY3dkKTtcbiAgaWYgKCFjYW5kaWRhdGUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZShjYW5kaWRhdGUpO1xuICBpZiAoZmlsZVN0YXRTeW5jKGpvaW4ocmVzb2x2ZWQsIFwicGFja2FnZS5qc29uXCIpKT8uaXNGaWxlKCkpIHJldHVybiByZXNvbHZlZDtcbiAgaWYgKGZpbGVTdGF0U3luYyhqb2luKHJlc29sdmVkLCBcIm5vZGVfbW9kdWxlc1wiKSk/LmlzRGlyZWN0b3J5KCkpIHJldHVybiByZXNvbHZlZDtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIGdpdCByZW1vdGUgVVJMIChgaHR0cHM6Ly8uLi5gLCBgZ2l0QGhvc3Q6b3duZXIvcmVwby5naXRgLCBldGMuKSBhbmRcbiAqIHJldHVybiB0aGUgcmVwbyBzZWdtZW50LCBzdHJpcHBpbmcgYW55IGAuZ2l0YCBzdWZmaXguIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yXG4gKiBlbXB0eSBvciB1bnBhcnNhYmxlIGlucHV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VHaXRSZW1vdGUodXJsOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0cmltbWVkID0gdXJsLnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHNjcCA9IC9eW15AXStAW146XSs6KC4rKSQvaS5leGVjKHRyaW1tZWQpO1xuICBpZiAoc2NwKSByZXR1cm4gbGFzdFBhdGhTZWdtZW50KHNjcFsxXSA/PyBcIlwiKTtcblxuICB0cnkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0cmltbWVkLnJlcGxhY2UoL1xcLmdpdCQvaSwgXCJcIik7XG4gICAgY29uc3QgcGF0aG5hbWUgPSBuZXcgVVJMKG5vcm1hbGl6ZWQpLnBhdGhuYW1lO1xuICAgIGNvbnN0IHNlZ21lbnQgPSBwYXRobmFtZS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLmF0KC0xKTtcbiAgICByZXR1cm4gc2VnbWVudCA/IGxhc3RQYXRoU2VnbWVudChzZWdtZW50KSA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBsYXN0UGF0aFNlZ21lbnQocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VnbWVudCA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKS5hdCgtMSkgPz8gcGF0aDtcbiAgcmV0dXJuIHNlZ21lbnQucmVwbGFjZSgvXFwuZ2l0JC9pLCBcIlwiKTtcbn1cblxuLyoqXG4gKiBZaWVsZCBjYW5kaWRhdGUgcHJvamVjdC1yb290IGRpcmVjdG9yaWVzIGZvciBgY3dkYCwgaW4gcHJpb3JpdHkgb3JkZXI6IHRoZVxuICogYG5wbSBwcmVmaXhgLCB0aGUgZ2l0IHRvcC1sZXZlbCwgdGhlbiBgY3dkYCBpdHNlbGYuIER1cGxpY2F0ZXMgYXJlIHNraXBwZWQ7XG4gKiBvbmx5IGV4aXN0aW5nIGRpcmVjdG9yaWVzIGFyZSB5aWVsZGVkIChleGNlcHQgdGhlIGZpbmFsIGBjd2RgIGZhbGxiYWNrKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiByZXNvbHZlUHJvamVjdFJvb3RzKGN3ZD86IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgY29uc3QgYmFzZSA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgW25wbVJvb3QoYmFzZSksIGdpdFJvb3QoYmFzZSldKSB7XG4gICAgaWYgKCFjYW5kaWRhdGUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRpciA9IHJlc29sdmUoY2FuZGlkYXRlKTtcbiAgICBpZiAoc2Vlbi5oYXMoZGlyKSkgY29udGludWU7XG4gICAgc2Vlbi5hZGQoZGlyKTtcbiAgICBpZiAoZmlsZVN0YXRTeW5jKGRpcik/LmlzRGlyZWN0b3J5KCkpIHlpZWxkIGRpcjtcbiAgfVxuICBpZiAoIXNlZW4uaGFzKGJhc2UpKSB5aWVsZCBiYXNlO1xufVxuXG4vKiogVGhlIG5lYXJlc3QgYW5jZXN0b3Igb2YgYGN3ZGAgKGZyb20ge0BsaW5rIHJlc29sdmVQcm9qZWN0Um9vdHN9KSB3aXRoIGEgYHBhY2thZ2UuanNvbmAuICovXG5mdW5jdGlvbiB3b3Jrc3BhY2VSb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBsYXN0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZGlyIG9mIHJlc29sdmVQcm9qZWN0Um9vdHMoY3dkKSkge1xuICAgIGlmIChmaWxlU3RhdFN5bmMocmVzb2x2ZShkaXIsIFwicGFja2FnZS5qc29uXCIpKT8uaXNGaWxlKCkpIHJldHVybiBkaXI7XG4gICAgbGFzdCA9IGRpcjtcbiAgfVxuICByZXR1cm4gbGFzdCA/PyByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBodW1hbi1mcmllbmRseSBwcm9qZWN0IG5hbWUgZm9yIHRoZSByZXBvIHJvb3RlZCBhdCBgY3dkYDpcbiAqIGBwYWNrYWdlLmpzb25gIGBuYW1lYCwgdGhlbiB0aGUgZ2l0IHJlbW90ZSdzIHJlcG8gbmFtZSwgdGhlbiB0aGUgcm9vdFxuICogZGlyZWN0b3J5J3MgYmFzZW5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYW1lKGN3ZD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgY29uc3Qgcm9vdERpciA9IHdvcmtzcGFjZVJvb3QocmVzb2x2ZWQpO1xuXG4gIGNvbnN0IGZyb21QYWNrYWdlID0gcmVhZFBhY2thZ2VOYW1lKHJlc29sdmUocm9vdERpciwgXCJwYWNrYWdlLmpzb25cIikpO1xuICBpZiAoZnJvbVBhY2thZ2UpIHJldHVybiBmcm9tUGFja2FnZTtcblxuICBjb25zdCByZW1vdGUgPSBnaXRSZW1vdGVVcmwocm9vdERpcik7XG4gIGNvbnN0IGZyb21HaXQgPSByZW1vdGUgPyBwYXJzZUdpdFJlbW90ZShyZW1vdGUpIDogdW5kZWZpbmVkO1xuICBpZiAoZnJvbUdpdCkgcmV0dXJuIGZyb21HaXQ7XG5cbiAgcmV0dXJuIGJhc2VuYW1lKHJvb3REaXIpO1xufVxuXG4vKipcbiAqIFRoZSBHaXRIdWIgQ0xJJ3MgY2Fub25pY2FsIHJlcG8gVVJMIC0gdGhlIGVhc3kgcGF0aC4gYGdoYCBhbHJlYWR5IHJlc29sdmVzIHRoZVxuICogdHJ1ZSBob3N0IChubyBzc2gtYWxpYXMgcGFyc2luZykgYW5kIHByaW50cyBhIGNsZWFuIGBodHRwczovL2hvc3Qvb3duZXIvcmVwb2AuXG4gKiBgdW5kZWZpbmVkYCB3aGVuIGBnaGAgaXMgYWJzZW50LCB1bmF1dGhlbnRpY2F0ZWQsIG9yIHRoZSBkaXIgaXNuJ3QgYSBHSCByZXBvLlxuICovXG5mdW5jdGlvbiByZXBvc2l0b3J5VXJsRnJvbUdoKGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjY291bnQgPSByZXNvbHZlUHJvamVjdEdoQWNjb3VudChjd2QpO1xuICBpZiAoIWFjY291bnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG91dCA9IGdoQ29tbWFuZC5vdXRwdXQoXG4gICAgW1wicmVwb1wiLCBcInZpZXdcIiwgYWNjb3VudC5yZW1vdGUucmVwb3NpdG9yeSwgXCItLWpzb25cIiwgXCJ1cmxcIl0sXG4gICAgYWNjb3VudC5yb290LFxuICAgIHsgY2FjaGU6IHRydWUsIGVudjogYWNjb3VudC5lbnYgfSxcbiAgKTtcbiAgcmV0dXJuIHRyaW1Ub051bGwocGFyc2VSZWNvcmQob3V0KT8udXJsKSA/PyB1bmRlZmluZWQ7XG59XG5cbi8qKiBSZXNvbHZlIGFuIHNzaCBob3N0IGFsaWFzIChgfi8uc3NoL2NvbmZpZ2ApIHRvIGl0cyBlZmZlY3RpdmUgYGhvc3RuYW1lYCB2aWEgYHNzaCAtR2AuICovXG5mdW5jdGlvbiByZXNvbHZlU3NoSG9zdE5hbWUoaG9zdDogc3RyaW5nLCBjd2Q/OiBzdHJpbmcsIHJlZnJlc2ggPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxpbmUgPSBzc2hDb21tYW5kXG4gICAgLmNvbnRleHQoW1wiLUdcIiwgaG9zdF0sIGN3ZCwgeyBjYWNoZTogIXJlZnJlc2ggfSlcbiAgICAub3V0cHV0Py5zcGxpdChcIlxcblwiKVxuICAgIC5maW5kKChsKSA9PiAvXmhvc3RuYW1lXFxzL2kudGVzdChsLnRyaW0oKSkpO1xuICBjb25zdCBuYW1lID0gbGluZT8udHJpbSgpLnNwbGl0KC9cXHMrLylbMV07XG4gIHJldHVybiBuYW1lICYmIG5hbWUgIT09IGhvc3QgPyBuYW1lIDogdW5kZWZpbmVkO1xufVxuXG4vKiogUGFyc2VkIEdpdEh1Yi1zdHlsZSByZW1vdGUgY29vcmRpbmF0ZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RHaFJlbW90ZSB7XG4gIC8qKiBBY2NvdW50IGhpbnRlZCBieSBhbiBTU0ggYWxpYXMgc3VjaCBhcyBgZ2l0QGdpdGh1Yi13b3JrOmAuICovXG4gIHJlYWRvbmx5IGFjY291bnRIaW50Pzogc3RyaW5nO1xuICAvKiogSG9zdCB3cml0dGVuIGluIHRoZSByZW1vdGUgYmVmb3JlIFNTSCBhbGlhcyByZXNvbHV0aW9uLiAqL1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG4gIC8qKiBgb3duZXIvcmVwb3NpdG9yeWAgcGF0aC4gKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeTogc3RyaW5nO1xufVxuXG4vKiogQXV0aGVudGljYXRlZCBHaXRIdWIgQ0xJIGFjY291bnQgc2VsZWN0ZWQgZm9yIG9uZSBwcm9qZWN0IHJlbW90ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdEdoQWNjb3VudCB7XG4gIC8qKiBFbnZpcm9ubWVudCB0byBwYXNzIHRvIGV2ZXJ5IGBnaGAgY29tbWFuZCBmb3IgdGhpcyBwcm9qZWN0LiAqL1xuICByZWFkb25seSBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52O1xuICAvKiogQWN0dWFsIEdpdEh1YiBob3N0IHNlbGVjdGVkIGZyb20gYGdoIGF1dGggc3RhdHVzYC4gKi9cbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICAvKiogQXV0aGVudGljYXRlZCBHaXRIdWIgbG9naW4uICovXG4gIHJlYWRvbmx5IGxvZ2luOiBzdHJpbmc7XG4gIC8qKiBQYXJzZWQgcHJvamVjdCByZW1vdGUuICovXG4gIHJlYWRvbmx5IHJlbW90ZTogUHJvamVjdEdoUmVtb3RlO1xuICAvKiogUmVzb2x2ZWQgcHJvamVjdCBkaXJlY3RvcnkgdXNlZCBmb3IgY29tbWFuZCBleGVjdXRpb24uICovXG4gIHJlYWRvbmx5IHJvb3Q6IHN0cmluZztcbn1cblxuLyoqIE9wdGlvbnMgZm9yIGNhY2hlZCBwcm9qZWN0IEdpdEh1Yi1hY2NvdW50IHJlc29sdXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVQcm9qZWN0R2hBY2NvdW50T3B0aW9ucyB7XG4gIC8qKiBHaXQgcmVtb3RlIG5hbWUuIERlZmF1bHRzIHRvIGBvcmlnaW5gLiAqL1xuICByZWFkb25seSByZW1vdGU/OiBzdHJpbmc7XG4gIC8qKiBSZS1yZWFkIGdpdCwgU1NILCBhbmQgR2l0SHViIENMSSBzdGF0ZSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBwcm9jZXNzIGNhY2hlLiAqL1xuICByZWFkb25seSByZWZyZXNoPzogYm9vbGVhbjtcbn1cblxuLyoqIFBhcnNlIEhUVFBTLCBTU0ggVVJMLCBvciBzY3AtbGlrZSBHaXRIdWIgcmVtb3RlIGNvb3JkaW5hdGVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHJvamVjdEdoUmVtb3RlKHJlbW90ZVVybDogc3RyaW5nKTogUHJvamVjdEdoUmVtb3RlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSByZW1vdGVVcmwudHJpbSgpLnJlcGxhY2UoL1xcLmdpdCQvaSwgXCJcIik7XG4gIGNvbnN0IGh0dHBzID0gL15odHRwcz86XFwvXFwvKFteL10rKVxcLyhbXi9dKylcXC8oW14vXSspJC9pLmV4ZWModmFsdWUpO1xuICBpZiAoaHR0cHMpIHJldHVybiB7IGhvc3Q6IGh0dHBzWzFdISwgcmVwb3NpdG9yeTogYCR7aHR0cHNbMl19LyR7aHR0cHNbM119YCB9O1xuICBjb25zdCBzc2ggPSAvXig/OnNzaDpcXC9cXC8pP2dpdEAoW14vOl0rKVs6L10oW14vXSspXFwvKFteL10rKSQvaS5leGVjKHZhbHVlKTtcbiAgaWYgKCFzc2gpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGFjY291bnRIaW50ID0gL15naXRodWItKC4rKSQvaS5leGVjKHNzaFsxXSEpPy5bMV07XG4gIHJldHVybiB7XG4gICAgLi4uKGFjY291bnRIaW50ID8geyBhY2NvdW50SGludCB9IDoge30pLFxuICAgIGhvc3Q6IHNzaFsxXSEsXG4gICAgcmVwb3NpdG9yeTogYCR7c3NoWzJdfS8ke3NzaFszXX1gLFxuICB9O1xufVxuXG5jb25zdCBwcm9qZWN0R2hBY2NvdW50Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUHJvamVjdEdoQWNjb3VudCB8IG51bGw+KCk7XG5cbi8qKlxuICogUmVzb2x2ZSBhbmQgY2FjaGUgdGhlIGF1dGhlbnRpY2F0ZWQgYGdoYCBhY2NvdW50IHRoYXQgY2FuIGFjY2VzcyBhIHByb2plY3Qnc1xuICogcmVtb3RlLiBTU0ggYWxpYXMgYWNjb3VudCBoaW50cyB3aW4sIGZvbGxvd2VkIGJ5IHRoZSBhY3RpdmUgYWNjb3VudCBvbiB0aGVcbiAqIGVmZmVjdGl2ZSBTU0gvSFRUUFMgaG9zdCwgdGhlbiBvdGhlciBhdXRoZW50aWNhdGVkIGFjY291bnRzLiBFdmVyeSBjYW5kaWRhdGVcbiAqIGlzIHZlcmlmaWVkIGFnYWluc3QgdGhlIHJlcG9zaXRvcnkgYmVmb3JlIGl0IGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVByb2plY3RHaEFjY291bnQoXG4gIGN3ZD86IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZVByb2plY3RHaEFjY291bnRPcHRpb25zID0ge30sXG4pOiBQcm9qZWN0R2hBY2NvdW50IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgcm9vdCA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIGNvbnN0IHJlbW90ZU5hbWUgPSB0cmltVG9OdWxsKG9wdGlvbnMucmVtb3RlKSA/PyBcIm9yaWdpblwiO1xuICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbcm9vdCwgcmVtb3RlTmFtZSwgaG9tZWRpcigpLCBwcm9jZXNzLmVudi5HSF9DT05GSUdfRElSID8/IFwiXCJdKTtcbiAgaWYgKCFvcHRpb25zLnJlZnJlc2ggJiYgcHJvamVjdEdoQWNjb3VudENhY2hlLmhhcyhrZXkpKSB7XG4gICAgcmV0dXJuIHByb2plY3RHaEFjY291bnRDYWNoZS5nZXQoa2V5KSA/PyB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgcmVtb3RlVXJsID0gZ2l0UmVtb3RlVXJsKHJvb3QsIHJlbW90ZU5hbWUsIG9wdGlvbnMucmVmcmVzaCk7XG4gIGlmICghcmVtb3RlVXJsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZW1vdGUgPSBwYXJzZVByb2plY3RHaFJlbW90ZShyZW1vdGVVcmwpO1xuICBpZiAoIXJlbW90ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZWZmZWN0aXZlSG9zdCA9IHJlc29sdmVTc2hIb3N0TmFtZShyZW1vdGUuaG9zdCwgcm9vdCwgb3B0aW9ucy5yZWZyZXNoKSA/PyByZW1vdGUuaG9zdDtcblxuICBjb25zdCBzdGF0dXMgPSBnaENvbW1hbmQub3V0cHV0KFtcImF1dGhcIiwgXCJzdGF0dXNcIiwgXCItLWpzb25cIiwgXCJob3N0c1wiXSwgcm9vdCwge1xuICAgIGNhY2hlOiBmYWxzZSxcbiAgfSk7XG4gIGlmICghc3RhdHVzKSB7XG4gICAgcHJvamVjdEdoQWNjb3VudENhY2hlLnNldChrZXksIG51bGwpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHBhcnNlZDoge1xuICAgIGhvc3RzPzogUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAgQXJyYXk8eyBhY3RpdmU/OiBib29sZWFuOyBob3N0Pzogc3RyaW5nOyBsb2dpbj86IHN0cmluZzsgc3RhdGU/OiBzdHJpbmcgfT5cbiAgICA+O1xuICB9O1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2Uoc3RhdHVzKSBhcyB0eXBlb2YgcGFyc2VkO1xuICB9IGNhdGNoIHtcbiAgICBwcm9qZWN0R2hBY2NvdW50Q2FjaGUuc2V0KGtleSwgbnVsbCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBhY2NvdW50cyA9IE9iamVjdC5lbnRyaWVzKHBhcnNlZC5ob3N0cyA/PyB7fSkuZmxhdE1hcCgoW2hvc3QsIGVudHJpZXNdKSA9PlxuICAgIGVudHJpZXNcbiAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5zdGF0ZSA9PT0gXCJzdWNjZXNzXCIgJiYgZW50cnkubG9naW4pXG4gICAgICAubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgICAgYWN0aXZlOiBlbnRyeS5hY3RpdmUgPT09IHRydWUsXG4gICAgICAgIGhvc3Q6IGVudHJ5Lmhvc3QgPz8gaG9zdCxcbiAgICAgICAgbG9naW46IGVudHJ5LmxvZ2luISxcbiAgICAgIH0pKSxcbiAgKTtcbiAgYWNjb3VudHMuc29ydCgobGVmdCwgcmlnaHQpID0+IHtcbiAgICBjb25zdCByYW5rID0gKGFjY291bnQ6ICh0eXBlb2YgYWNjb3VudHMpW251bWJlcl0pOiBudW1iZXIgPT4ge1xuICAgICAgaWYgKHJlbW90ZS5hY2NvdW50SGludCAmJiBhY2NvdW50LmxvZ2luID09PSByZW1vdGUuYWNjb3VudEhpbnQpIHJldHVybiAwO1xuICAgICAgaWYgKGFjY291bnQuaG9zdCA9PT0gZWZmZWN0aXZlSG9zdCAmJiBhY2NvdW50LmFjdGl2ZSkgcmV0dXJuIDE7XG4gICAgICBpZiAoYWNjb3VudC5ob3N0ID09PSBlZmZlY3RpdmVIb3N0KSByZXR1cm4gMjtcbiAgICAgIGlmIChhY2NvdW50LmFjdGl2ZSkgcmV0dXJuIDM7XG4gICAgICByZXR1cm4gNDtcbiAgICB9O1xuICAgIHJldHVybiByYW5rKGxlZnQpIC0gcmFuayhyaWdodCk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgYWNjb3VudCBvZiBhY2NvdW50cykge1xuICAgIGNvbnN0IHRva2VuID0gZ2hDb21tYW5kLm91dHB1dChcbiAgICAgIFtcImF1dGhcIiwgXCJ0b2tlblwiLCBcIi0taG9zdG5hbWVcIiwgYWNjb3VudC5ob3N0LCBcIi0tdXNlclwiLCBhY2NvdW50LmxvZ2luXSxcbiAgICAgIHJvb3QsXG4gICAgICB7IGNhY2hlOiBmYWxzZSB9LFxuICAgICk7XG4gICAgaWYgKCF0b2tlbikgY29udGludWU7XG4gICAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiwgR0hfSE9TVDogYWNjb3VudC5ob3N0LCBHSF9UT0tFTjogdG9rZW4gfTtcbiAgICBpZiAoXG4gICAgICAhZ2hDb21tYW5kLnN1Y2NlZWRzKFxuICAgICAgICBbXCJhcGlcIiwgXCItLWhvc3RuYW1lXCIsIGFjY291bnQuaG9zdCwgYHJlcG9zLyR7cmVtb3RlLnJlcG9zaXRvcnl9YCwgXCItLXNpbGVudFwiXSxcbiAgICAgICAgcm9vdCxcbiAgICAgICAgeyBjYWNoZTogZmFsc2UsIGVudiB9LFxuICAgICAgKVxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkID0geyBlbnYsIGhvc3Q6IGFjY291bnQuaG9zdCwgbG9naW46IGFjY291bnQubG9naW4sIHJlbW90ZSwgcm9vdCB9O1xuICAgIHByb2plY3RHaEFjY291bnRDYWNoZS5zZXQoa2V5LCBzZWxlY3RlZCk7XG4gICAgcmV0dXJuIHNlbGVjdGVkO1xuICB9XG4gIHByb2plY3RHaEFjY291bnRDYWNoZS5zZXQoa2V5LCBudWxsKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBGYWxsYmFjazogbm9ybWFsaXplIGBnaXQgcmVtb3RlIGdldC11cmwgb3JpZ2luYCB0byBhIHBsYWluXG4gKiBgaHR0cHM6Ly9ob3N0L293bmVyL3JlcG9gIFVSTC4gc2NwLWxpa2UgLyBgc3NoOi8vYCAvIGBnaXQ6Ly9gIC9cbiAqIGVtYmVkZGVkLWNyZWRlbnRpYWwgZm9ybXMgYXJlIHJld3JpdHRlbiB0byBodHRwcywgYW5kIGFuIHNzaCBob3N0IGFsaWFzIGlzXG4gKiBmb2xsb3dlZCB0byBpdHMgcmVhbCBob3N0bmFtZS5cbiAqL1xuZnVuY3Rpb24gcmVwb3NpdG9yeVVybEZyb21HaXQoY3dkPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3ID0gZ2l0UmVtb3RlVXJsKGN3ZCk7XG4gIGlmICghcmF3KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgc2NoZW1lIHRvIGh0dHBzIGF0IHRoZSBzdHJpbmcgbGV2ZWwgZmlyc3Q6IHRoZSBXSEFUV0cgYFVSTGBcbiAgLy8gcGFyc2VyIGNhbid0IGNvbnZlcnQgYSBub24tc3BlY2lhbCBzY2hlbWUgKGBzc2hgL2BnaXRgKSB0byBgaHR0cHNgICh0aGVcbiAgLy8gYHByb3RvY29sYCBzZXR0ZXIgbm8tb3BzKSwgYW5kIHNjcC1saWtlIGBnaXRAaG9zdDpvd25lci9yZXBvYCBpc24ndCBhIFVSTCBhdFxuICAvLyBhbGwuIFJld3JpdGUgYm90aCBpbnRvIGFuIGBodHRwczovL2Agc3RyaW5nLCB0aGVuIGxldCB7QGxpbmsgbmV0LnVybEJ1aWxkZXJ9XG4gIC8vIG93biB0aGUgc3RydWN0dXJlZCBlZGl0cyAoc3RyaXAgY3JlZGVudGlhbHMsIHN3YXAgdGhlIGhvc3QpLlxuICBsZXQgaHR0cHMgPSByYXcucmVwbGFjZSgvXmdpdFxcKy8sIFwiXCIpO1xuICBjb25zdCBzY3AgPSAvXlteQF0rQChbXjpdKyk6KC4rKSQvLmV4ZWMoaHR0cHMpO1xuICBpZiAoc2NwKSBodHRwcyA9IGBodHRwczovLyR7c2NwWzFdfS8ke3NjcFsyXX1gO1xuICBodHRwcyA9IGh0dHBzLnJlcGxhY2UoL14oc3NofGdpdCk6XFwvXFwvLywgXCJodHRwczovL1wiKTtcblxuICBsZXQgYnVpbGRlciA9IHVybEJ1aWxkZXIoaHR0cHMpO1xuICBpZiAoIWJ1aWxkZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIERyb3AgYW55IGVtYmVkZGVkIGB1c2VyWzpwYXNzXUBgIGNyZWRlbnRpYWxzLlxuICBpZiAoYnVpbGRlci51c2VybmFtZSB8fCBidWlsZGVyLnBhc3N3b3JkKSB7XG4gICAgYnVpbGRlciA9IGJ1aWxkZXIud2l0aChcInVzZXJuYW1lXCIsIFwiXCIpLndpdGgoXCJwYXNzd29yZFwiLCBcIlwiKTtcbiAgfVxuICAvLyBGb2xsb3cgYW4gc3NoIGhvc3QgYWxpYXMgdG8gdGhlIHRydWUgaG9zdC5cbiAgY29uc3QgcmVhbEhvc3QgPSByZXNvbHZlU3NoSG9zdE5hbWUoYnVpbGRlci5ob3N0bmFtZSwgY3dkKTtcbiAgaWYgKHJlYWxIb3N0KSBidWlsZGVyID0gYnVpbGRlci53aXRoKFwiaG9zdG5hbWVcIiwgcmVhbEhvc3QpO1xuXG4gIHJldHVybiBgJHtidWlsZGVyLm9yaWdpbn0ke2J1aWxkZXIucGF0aG5hbWUucmVwbGFjZSgvXFwuZ2l0JC8sIFwiXCIpfWA7XG59XG5cbi8qKlxuICogVGhlIHJlcG8ncyBjYW5vbmljYWwgcmVtb3RlIFVSTCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBubyBnaXQgcmVtb3RlLlxuICogTm9ybWFsaXplcyBgZ2l0IHJlbW90ZSBnZXQtdXJsIG9yaWdpbmAgbG9jYWxseSBmaXJzdCwgaW5jbHVkaW5nIFNTSCBhbGlhc2VzLFxuICogYW5kIG9ubHkgYXNrcyBgZ2ggcmVwbyB2aWV3YCB3aGVuIHRoZSByZW1vdGUgY2Fubm90IGJlIHBhcnNlZC4gVGhpcyBrZWVwc1xuICogYXV0aGVudGljYXRlZCBHaXRIdWIgYWNjb3VudCBkaXNjb3ZlcnkgbGF6eSBmb3IgY2FsbGVycyB0aGF0IGFjdHVhbGx5IG5lZWRcbiAqIGl0LiBBIGJsYW5rLCBvbWl0dGVkLCBvciBleHBsaWNpdGx5IGN1cnJlbnQgYGN3ZGAgcmV1c2VzIGNhY2hlZCBjb21tYW5kXG4gKiBwcm9iZXM7IGFub3RoZXIgcmVzb2x2ZWQgZGlyZWN0b3J5IGV4ZWN1dGVzIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSBjd2QgLSBkaXJlY3RvcnkgdG8gcmVzb2x2ZSBmcm9tIChkZWZhdWx0cyB0byBgcHJvY2Vzcy5jd2QoKWApLlxuICogQHBhcmFtIGZvcm1hdCAtIGBcImh0dHBzXCJgIChkZWZhdWx0KSB5aWVsZHMgYGh0dHBzOi8vaG9zdC9vd25lci9yZXBvYDtcbiAqICAgYFwibnBtXCJgIHlpZWxkcyBucG0ncyBgZ2l0K2h0dHBzOi8vaG9zdC9vd25lci9yZXBvLmdpdGAgZm9ybSAoZm9yIGFcbiAqICAgYHBhY2thZ2UuanNvbmAgYHJlcG9zaXRvcnkudXJsYCB0aGF0IHBhc3NlcyBucG0gcHJvdmVuYW5jZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvc2l0b3J5VXJsKGN3ZD86IHN0cmluZywgZm9ybWF0OiBcImh0dHBzXCIgfCBcIm5wbVwiID0gXCJodHRwc1wiKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBjb25zdCBodHRwcyA9IHJlcG9zaXRvcnlVcmxGcm9tR2l0KHJlc29sdmVkKSA/PyByZXBvc2l0b3J5VXJsRnJvbUdoKHJlc29sdmVkKTtcbiAgaWYgKCFodHRwcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGZvcm1hdCA9PT0gXCJucG1cIiA/IGBnaXQrJHtodHRwcy5yZXBsYWNlKC9cXC5naXQkLywgXCJcIil9LmdpdGAgOiBodHRwcztcbn1cblxuLyoqIFB1YmxpYyBucG0sIHVzZWQgb25seSBhZnRlciBlbnYsIG5wbXJjLCBidW5maWcsIGFuZCBwbnBtIHlhbWwgbWlzcy4gKi9cbmNvbnN0IERFRkFVTFRfTlBNX1JFR0lTVFJZID0gXCJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9cIjtcblxuLyoqIElucHV0cyB0aGF0IGNvbnRyb2wgYWN0aXZlIG5wbSByZWdpc3RyeSBkaXNjb3ZlcnkuICovXG5leHBvcnQgdHlwZSBOcG1SZWdpc3RyeU9wdGlvbnMgPSB7XG4gIC8qKiBTa2lwIHB1YmxpYyBucG1qcy5vcmcgc28gY2FsbGVycyBjYW4gZGV0ZWN0IGEgY29uZmlndXJlZCBvdmVycmlkZS4gKi9cbiAgb3ZlcnJpZGVPbmx5PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJlYWQgYG5wbV9jb25maWdfcmVnaXN0cnlgLCBgTlBNX0NPTkZJR19SRUdJU1RSWWAsIGFuZCBgQlVOX0NPTkZJR19SRUdJU1RSWWBcbiAgICogZmlyc3QuIERlZmF1bHRzIHRvIHRydWUgc28gdGhlIHNhbWUgY2FzY2FkZSBhIHBhY2thZ2UgbWFuYWdlciB1c2VzIGlzIHRoZVxuICAgKiBkZWZhdWx0LlxuICAgKi9cbiAgZW52VmFycz86IGJvb2xlYW47XG59O1xuXG5jb25zdCBucG1SZWdpc3RyeUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFVybEJ1aWxkZXIgfCB1bmRlZmluZWQ+KCk7XG5cbi8qKlxuICogVGhlIGFjdGl2ZSBucG0gcmVnaXN0cnkgYXMgYSBjaGFpbmFibGUge0BsaW5rIG5ldC5VcmxCdWlsZGVyfS5cbiAqXG4gKiBSZXNvbHV0aW9uIGlzIG1hbmFnZXItYWdub3N0aWMgYW5kIG1lbW9pemVkIHBlciBjd2QgcGx1cyBvcHRpb25zOiBlbnZpcm9ubWVudFxuICogdmFyaWFibGVzLCB0aGVuIGAubnBtcmNgIChwcm9qZWN0IGFuY2VzdG9ycywgdXNlciwgZ2xvYmFsKSwgdGhlbiBCdW5cbiAqIGBidW5maWcudG9tbGAgYGluc3RhbGwucmVnaXN0cnlgLCB0aGVuIHBucG0gd29ya3NwYWNlL2dsb2JhbCBZQU1MLCB0aGVuXG4gKiBgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYC4gYG92ZXJyaWRlT25seWAgc2tpcHMgdGhhdCBwdWJsaWMgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5wbVJlZ2lzdHJ5KFxuICBjd2Q/OiBzdHJpbmcgfCBudWxsLFxuICBvcHRpb25zPzogTnBtUmVnaXN0cnlPcHRpb25zLFxuKTogVXJsQnVpbGRlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgY29uc3QgZW52VmFycyA9IG9wdGlvbnM/LmVudlZhcnMgIT09IGZhbHNlO1xuICBjb25zdCBvdmVycmlkZU9ubHkgPSBCb29sZWFuKG9wdGlvbnM/Lm92ZXJyaWRlT25seSk7XG4gIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtcbiAgICByZXNvbHZlZCxcbiAgICBvdmVycmlkZU9ubHksXG4gICAgZW52VmFycyxcbiAgICBob21lZGlyKCksXG4gICAgcHJvY2Vzcy5lbnYuTlBNX0NPTkZJR19VU0VSQ09ORklHID8/IFwiXCIsXG4gICAgcHJvY2Vzcy5lbnYuTlBNX0NPTkZJR19HTE9CQUxDT05GSUcgPz8gXCJcIixcbiAgICBwcm9jZXNzLmVudi5QUkVGSVggPz8gXCJcIixcbiAgICBlbnZWYXJzID8gKHByb2Nlc3MuZW52Lm5wbV9jb25maWdfcmVnaXN0cnkgPz8gXCJcIikgOiBcIlwiLFxuICAgIGVudlZhcnMgPyAocHJvY2Vzcy5lbnYuTlBNX0NPTkZJR19SRUdJU1RSWSA/PyBcIlwiKSA6IFwiXCIsXG4gICAgZW52VmFycyA/IChwcm9jZXNzLmVudi5CVU5fQ09ORklHX1JFR0lTVFJZID8/IFwiXCIpIDogXCJcIixcbiAgXSk7XG4gIGlmIChucG1SZWdpc3RyeUNhY2hlLmhhcyhrZXkpKSByZXR1cm4gbnBtUmVnaXN0cnlDYWNoZS5nZXQoa2V5KTtcbiAgY29uc3QgdmFsdWUgPSByZXNvbHZlTnBtUmVnaXN0cnkocmVzb2x2ZWQsIHsgb3ZlcnJpZGVPbmx5LCBlbnZWYXJzIH0pO1xuICBucG1SZWdpc3RyeUNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTnBtUmVnaXN0cnkoXG4gIGN3ZDogc3RyaW5nLFxuICBvcHRpb25zOiB7IG92ZXJyaWRlT25seTogYm9vbGVhbjsgZW52VmFyczogYm9vbGVhbiB9LFxuKTogVXJsQnVpbGRlciB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIG5wbVJlZ2lzdHJ5Q2FuZGlkYXRlcyhjd2QsIG9wdGlvbnMuZW52VmFycykpIHtcbiAgICBjb25zdCB1cmwgPSB0b1JlZ2lzdHJ5VXJsKGNhbmRpZGF0ZSwgb3B0aW9ucy5vdmVycmlkZU9ubHkpO1xuICAgIGlmICh1cmwpIHJldHVybiB1cmw7XG4gIH1cbiAgcmV0dXJuIHRvUmVnaXN0cnlVcmwoREVGQVVMVF9OUE1fUkVHSVNUUlksIG9wdGlvbnMub3ZlcnJpZGVPbmx5KTtcbn1cblxuZnVuY3Rpb24qIG5wbVJlZ2lzdHJ5Q2FuZGlkYXRlcyhjd2Q6IHN0cmluZywgZW52VmFyczogYm9vbGVhbik6IEdlbmVyYXRvcjxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKGVudlZhcnMpIHtcbiAgICB5aWVsZCBwcm9jZXNzLmVudi5ucG1fY29uZmlnX3JlZ2lzdHJ5O1xuICAgIHlpZWxkIHByb2Nlc3MuZW52Lk5QTV9DT05GSUdfUkVHSVNUUlk7XG4gICAgeWllbGQgcHJvY2Vzcy5lbnYuQlVOX0NPTkZJR19SRUdJU1RSWTtcbiAgfVxuICBmb3IgKGNvbnN0IGRpciBvZiBhbmNlc3RvckRpcnMoY3dkKSkge1xuICAgIHlpZWxkIHJlYWROcG1yY1JlZ2lzdHJ5KGpvaW4oZGlyLCBcIi5ucG1yY1wiKSk7XG4gIH1cbiAgeWllbGQgcmVhZE5wbXJjUmVnaXN0cnkocHJvY2Vzcy5lbnYuTlBNX0NPTkZJR19VU0VSQ09ORklHID8/IGpvaW4oaG9tZWRpcigpLCBcIi5ucG1yY1wiKSk7XG4gIHlpZWxkIHJlYWROcG1yY1JlZ2lzdHJ5KHByb2Nlc3MuZW52Lk5QTV9DT05GSUdfR0xPQkFMQ09ORklHID8/IGRlZmF1bHRHbG9iYWxOcG1yYygpKTtcbiAgZm9yIChjb25zdCBkaXIgb2YgYW5jZXN0b3JEaXJzKGN3ZCkpIHtcbiAgICB5aWVsZCByZWFkQnVuZmlnUmVnaXN0cnkoam9pbihkaXIsIFwiYnVuZmlnLnRvbWxcIikpO1xuICB9XG4gIHlpZWxkIHJlYWRCdW5maWdSZWdpc3RyeShqb2luKGhvbWVkaXIoKSwgXCJidW5maWcudG9tbFwiKSk7XG4gIGZvciAoY29uc3QgZGlyIG9mIGFuY2VzdG9yRGlycyhjd2QpKSB7XG4gICAgeWllbGQgcmVhZFlhbWxSZWdpc3RyeShqb2luKGRpciwgXCJwbnBtLXdvcmtzcGFjZS55YW1sXCIpKTtcbiAgfVxuICBmb3IgKGNvbnN0IHBhdGggb2YgcG5wbUdsb2JhbENvbmZpZ1BhdGhzKCkpIHtcbiAgICB5aWVsZCByZWFkWWFtbFJlZ2lzdHJ5KHBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUmVnaXN0cnlVcmwoXG4gIGNhbmRpZGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvdmVycmlkZU9ubHk6IGJvb2xlYW4sXG4pOiBVcmxCdWlsZGVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdHJpbW1lZCA9IHRyaW1Ub051bGwoY2FuZGlkYXRlKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB1cmwgPSB1cmxCdWlsZGVyKHRyaW1tZWQpO1xuICBpZiAoIXVybCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG92ZXJyaWRlT25seSAmJiBpc1B1YmxpY05wbVJlZ2lzdHJ5KHVybCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB1cmw7XG59XG5cbmZ1bmN0aW9uIGlzUHVibGljTnBtUmVnaXN0cnkodXJsOiBVcmxCdWlsZGVyKTogYm9vbGVhbiB7XG4gIHJldHVybiB1cmwuaG9zdG5hbWUgPT09IFwicmVnaXN0cnkubnBtanMub3JnXCI7XG59XG5cbmZ1bmN0aW9uKiBhbmNlc3RvckRpcnMoY3dkOiBzdHJpbmcpOiBHZW5lcmF0b3I8c3RyaW5nPiB7XG4gIGxldCBjdXJyZW50ID0gY3dkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHlpZWxkIGN1cnJlbnQ7XG4gICAgY29uc3QgcGFyZW50ID0gZGlybmFtZShjdXJyZW50KTtcbiAgICBpZiAocGFyZW50ID09PSBjdXJyZW50KSByZXR1cm47XG4gICAgY3VycmVudCA9IHBhcmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0R2xvYmFsTnBtcmMoKTogc3RyaW5nIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIikge1xuICAgIHJldHVybiBqb2luKHByb2Nlc3MuZW52LlBST0dSQU1EQVRBID8/IFwiQzpcXFxcUHJvZ3JhbURhdGFcIiwgXCJucG1cIiwgXCJldGNcIiwgXCJucG1yY1wiKTtcbiAgfVxuICByZXR1cm4gam9pbihwcm9jZXNzLmVudi5QUkVGSVggPz8gXCIvdXNyL2xvY2FsXCIsIFwiZXRjXCIsIFwibnBtcmNcIik7XG59XG5cbmZ1bmN0aW9uIHBucG1HbG9iYWxDb25maWdQYXRocygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhvbWUgPSBob21lZGlyKCk7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiKSB7XG4gICAgcmV0dXJuIFtqb2luKGhvbWUsIFwiTGlicmFyeS9QcmVmZXJlbmNlcy9wbnBtL2NvbmZpZy55YW1sXCIpXTtcbiAgfVxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiKSB7XG4gICAgcmV0dXJuIFtqb2luKHByb2Nlc3MuZW52LkxPQ0FMQVBQREFUQSA/PyBqb2luKGhvbWUsIFwiQXBwRGF0YS9Mb2NhbFwiKSwgXCJwbnBtL2NvbmZpZy55YW1sXCIpXTtcbiAgfVxuICByZXR1cm4gW2pvaW4oaG9tZSwgXCIuY29uZmlnL3BucG0vY29uZmlnLnlhbWxcIildO1xufVxuXG5mdW5jdGlvbiByZWFkTnBtcmNSZWdpc3RyeShwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2FjaGVkUmVjb3JkKGBucG1yYy1yZWdpc3RyeToke3BhdGh9YCwgKCkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSByZWFkVGV4dEZpbGUocGF0aCk7XG4gICAgY29uc3QgcmVnaXN0cnkgPSB0ZXh0ID8gcGFyc2VJbmlSZWdpc3RyeSh0ZXh0KSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVnaXN0cnkgPyB7IHJlZ2lzdHJ5IH0gOiB1bmRlZmluZWQ7XG4gIH0pPy5yZWdpc3RyeTtcbn1cblxuZnVuY3Rpb24gcmVhZEJ1bmZpZ1JlZ2lzdHJ5KHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjYWNoZWRSZWNvcmQoYGJ1bmZpZy1yZWdpc3RyeToke3BhdGh9YCwgKCkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSByZWFkVGV4dEZpbGUocGF0aCk7XG4gICAgY29uc3QgcmVnaXN0cnkgPSB0ZXh0ID8gcGFyc2VCdW5maWdSZWdpc3RyeSh0ZXh0KSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVnaXN0cnkgPyB7IHJlZ2lzdHJ5IH0gOiB1bmRlZmluZWQ7XG4gIH0pPy5yZWdpc3RyeTtcbn1cblxuZnVuY3Rpb24gcmVhZFlhbWxSZWdpc3RyeShwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2FjaGVkUmVjb3JkKGB5YW1sLXJlZ2lzdHJ5OiR7cGF0aH1gLCAoKSA9PiB7XG4gICAgY29uc3QgdGV4dCA9IHJlYWRUZXh0RmlsZShwYXRoKTtcbiAgICBpZiAoIXRleHQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VZYW1sKHRleHQpO1xuICAgIGlmICghaXNSZWNvcmQocGFyc2VkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCByZWdpc3RyeSA9IHlhbWxSZWdpc3RyeShwYXJzZWQpO1xuICAgIHJldHVybiByZWdpc3RyeSA/IHsgcmVnaXN0cnkgfSA6IHVuZGVmaW5lZDtcbiAgfSk/LnJlZ2lzdHJ5O1xufVxuXG5mdW5jdGlvbiByZWFkVGV4dEZpbGUocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFmaWxlU3RhdFN5bmMocGF0aCk/LmlzRmlsZSgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gcmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmOFwiKTtcbn1cblxuLyoqIFBhcnNlIGEgYHJlZ2lzdHJ5PWAgYXNzaWdubWVudCBmcm9tIG5wbXJjIC8gaW5pIHRleHQuICovXG5mdW5jdGlvbiBwYXJzZUluaVJlZ2lzdHJ5KHRleHQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgcmF3IG9mIHRleHQuc3BsaXQoL1xccj9cXG4vKSkge1xuICAgIGNvbnN0IGxpbmUgPSByYXcudHJpbSgpO1xuICAgIGlmICghbGluZSB8fCBsaW5lLnN0YXJ0c1dpdGgoXCIjXCIpIHx8IGxpbmUuc3RhcnRzV2l0aChcIjtcIikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGVxID0gbGluZS5pbmRleE9mKFwiPVwiKTtcbiAgICBpZiAoZXEgPT09IC0xKSBjb250aW51ZTtcbiAgICBpZiAobGluZS5zbGljZSgwLCBlcSkudHJpbSgpICE9PSBcInJlZ2lzdHJ5XCIpIGNvbnRpbnVlO1xuICAgIHJldHVybiB1bnF1b3RlSW5pVmFsdWUobGluZS5zbGljZShlcSArIDEpKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlYWQgQnVuIGBpbnN0YWxsLnJlZ2lzdHJ5YCBmcm9tIGEgYnVuZmlnLnRvbWwuIFRhYmxlIGZvcm1cbiAqIGBbaW5zdGFsbC5yZWdpc3RyeV1gIHdpdGggYHVybCA9IFwiLi4uXCJgIGlzIGFjY2VwdGVkOyBzY29wZWQgbWFwcyBhcmUgaWdub3JlZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VCdW5maWdSZWdpc3RyeSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgc2VjdGlvbiA9IFwiXCI7XG4gIGZvciAoY29uc3QgcmF3IG9mIHRleHQuc3BsaXQoL1xccj9cXG4vKSkge1xuICAgIGNvbnN0IGxpbmUgPSBzdHJpcFRvbWxDb21tZW50KHJhdykudHJpbSgpO1xuICAgIGlmICghbGluZSkgY29udGludWU7XG4gICAgY29uc3QgaGVhZGVyID0gL15cXFsoW15cXF1dKylcXF0kLy5leGVjKGxpbmUpO1xuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIHNlY3Rpb24gPSBoZWFkZXJbMV0hLnRyaW0oKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBlcSA9IGxpbmUuaW5kZXhPZihcIj1cIik7XG4gICAgaWYgKGVxID09PSAtMSkgY29udGludWU7XG4gICAgY29uc3Qga2V5ID0gbGluZS5zbGljZSgwLCBlcSkudHJpbSgpO1xuICAgIGNvbnN0IHZhbHVlID0gdW5xdW90ZUluaVZhbHVlKGxpbmUuc2xpY2UoZXEgKyAxKSk7XG4gICAgaWYgKHNlY3Rpb24gPT09IFwiaW5zdGFsbFwiICYmIGtleSA9PT0gXCJyZWdpc3RyeVwiICYmICF2YWx1ZS5zdGFydHNXaXRoKFwie1wiKSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmIChzZWN0aW9uID09PSBcImluc3RhbGwucmVnaXN0cnlcIiAmJiBrZXkgPT09IFwidXJsXCIpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAoIXNlY3Rpb24gJiYga2V5ID09PSBcImluc3RhbGwucmVnaXN0cnlcIikgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHlhbWxSZWdpc3RyeShkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgZGF0YS5yZWdpc3RyeSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGRhdGEucmVnaXN0cnk7XG4gIGNvbnN0IHJlZ2lzdHJpZXMgPSBkYXRhLnJlZ2lzdHJpZXM7XG4gIGlmIChpc1JlY29yZChyZWdpc3RyaWVzKSAmJiB0eXBlb2YgcmVnaXN0cmllcy5kZWZhdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHJlZ2lzdHJpZXMuZGVmYXVsdDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1bnF1b3RlSW5pVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gIGNvbnN0IGNvbW1lbnQgPSB0cmltbWVkLnNlYXJjaCgvXFxzKyMvKTtcbiAgY29uc3QgcmF3ID0gY29tbWVudCA9PT0gLTEgPyB0cmltbWVkIDogdHJpbW1lZC5zbGljZSgwLCBjb21tZW50KS50cmltKCk7XG4gIGlmICgocmF3LnN0YXJ0c1dpdGgoJ1wiJykgJiYgcmF3LmVuZHNXaXRoKCdcIicpKSB8fCAocmF3LnN0YXJ0c1dpdGgoXCInXCIpICYmIHJhdy5lbmRzV2l0aChcIidcIikpKSB7XG4gICAgcmV0dXJuIHJhdy5zbGljZSgxLCAtMSk7XG4gIH1cbiAgcmV0dXJuIHJhdztcbn1cblxuZnVuY3Rpb24gc3RyaXBUb21sQ29tbWVudChsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBoYXNoID0gbGluZS5pbmRleE9mKFwiI1wiKTtcbiAgcmV0dXJuIGhhc2ggPT09IC0xID8gbGluZSA6IGxpbmUuc2xpY2UoMCwgaGFzaCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrYWdlTmFtZShwa2dQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWZpbGVTdGF0U3luYyhwa2dQYXRoKT8uaXNGaWxlKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0cmltVG9OdWxsKHBhcnNlUmVjb3JkKHJlYWRGaWxlU3luYyhwa2dQYXRoLCBcInV0ZjhcIikpPy5uYW1lKSA/PyB1bmRlZmluZWQ7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"typescript": "^5.9.3"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
28
|
+
"@dbx-tools/shared-core": "^0.9.157",
|
|
29
29
|
"extract-zip": "^2.0.1",
|
|
30
30
|
"proper-lockfile": "^4.1.2",
|
|
31
31
|
"semver": "^7.7.3",
|
|
@@ -44,54 +44,10 @@
|
|
|
44
44
|
"types": "./lib/index.d.ts",
|
|
45
45
|
"default": "./lib/index.js"
|
|
46
46
|
},
|
|
47
|
-
"./bin": {
|
|
48
|
-
"types": "./lib/src/bin.d.ts",
|
|
49
|
-
"default": "./lib/src/bin.js"
|
|
50
|
-
},
|
|
51
|
-
"./brand-files": {
|
|
52
|
-
"types": "./lib/src/brand-files.d.ts",
|
|
53
|
-
"default": "./lib/src/brand-files.js"
|
|
54
|
-
},
|
|
55
|
-
"./bundle": {
|
|
56
|
-
"types": "./lib/src/bundle.d.ts",
|
|
57
|
-
"default": "./lib/src/bundle.js"
|
|
58
|
-
},
|
|
59
|
-
"./config-utils": {
|
|
60
|
-
"types": "./lib/src/config-utils.d.ts",
|
|
61
|
-
"default": "./lib/src/config-utils.js"
|
|
62
|
-
},
|
|
63
|
-
"./dependency-resolver": {
|
|
64
|
-
"types": "./lib/src/dependency-resolver.d.ts",
|
|
65
|
-
"default": "./lib/src/dependency-resolver.js"
|
|
66
|
-
},
|
|
67
|
-
"./exec": {
|
|
68
|
-
"types": "./lib/src/exec.d.ts",
|
|
69
|
-
"default": "./lib/src/exec.js"
|
|
70
|
-
},
|
|
71
|
-
"./file-lock": {
|
|
72
|
-
"types": "./lib/src/file-lock.d.ts",
|
|
73
|
-
"default": "./lib/src/file-lock.js"
|
|
74
|
-
},
|
|
75
|
-
"./file": {
|
|
76
|
-
"types": "./lib/src/file.d.ts",
|
|
77
|
-
"default": "./lib/src/file.js"
|
|
78
|
-
},
|
|
79
|
-
"./process-lock": {
|
|
80
|
-
"types": "./lib/src/process-lock.d.ts",
|
|
81
|
-
"default": "./lib/src/process-lock.js"
|
|
82
|
-
},
|
|
83
|
-
"./project-utils": {
|
|
84
|
-
"types": "./lib/src/project-utils.d.ts",
|
|
85
|
-
"default": "./lib/src/project-utils.js"
|
|
86
|
-
},
|
|
87
|
-
"./*": {
|
|
88
|
-
"types": "./lib/src/*/index.d.ts",
|
|
89
|
-
"default": "./lib/src/*/index.js"
|
|
90
|
-
},
|
|
91
47
|
"./package.json": "./package.json"
|
|
92
48
|
}
|
|
93
49
|
},
|
|
94
|
-
"version": "0.9.
|
|
50
|
+
"version": "0.9.157",
|
|
95
51
|
"types": "./lib/index.d.ts",
|
|
96
52
|
"dbxToolsConfig": {
|
|
97
53
|
"tags": [
|
|
@@ -104,54 +60,10 @@
|
|
|
104
60
|
"types": "./lib/index.d.ts",
|
|
105
61
|
"default": "./lib/index.js"
|
|
106
62
|
},
|
|
107
|
-
"./bin": {
|
|
108
|
-
"types": "./lib/src/bin.d.ts",
|
|
109
|
-
"default": "./lib/src/bin.js"
|
|
110
|
-
},
|
|
111
|
-
"./brand-files": {
|
|
112
|
-
"types": "./lib/src/brand-files.d.ts",
|
|
113
|
-
"default": "./lib/src/brand-files.js"
|
|
114
|
-
},
|
|
115
|
-
"./bundle": {
|
|
116
|
-
"types": "./lib/src/bundle.d.ts",
|
|
117
|
-
"default": "./lib/src/bundle.js"
|
|
118
|
-
},
|
|
119
|
-
"./config-utils": {
|
|
120
|
-
"types": "./lib/src/config-utils.d.ts",
|
|
121
|
-
"default": "./lib/src/config-utils.js"
|
|
122
|
-
},
|
|
123
|
-
"./dependency-resolver": {
|
|
124
|
-
"types": "./lib/src/dependency-resolver.d.ts",
|
|
125
|
-
"default": "./lib/src/dependency-resolver.js"
|
|
126
|
-
},
|
|
127
|
-
"./exec": {
|
|
128
|
-
"types": "./lib/src/exec.d.ts",
|
|
129
|
-
"default": "./lib/src/exec.js"
|
|
130
|
-
},
|
|
131
|
-
"./file-lock": {
|
|
132
|
-
"types": "./lib/src/file-lock.d.ts",
|
|
133
|
-
"default": "./lib/src/file-lock.js"
|
|
134
|
-
},
|
|
135
|
-
"./file": {
|
|
136
|
-
"types": "./lib/src/file.d.ts",
|
|
137
|
-
"default": "./lib/src/file.js"
|
|
138
|
-
},
|
|
139
|
-
"./process-lock": {
|
|
140
|
-
"types": "./lib/src/process-lock.d.ts",
|
|
141
|
-
"default": "./lib/src/process-lock.js"
|
|
142
|
-
},
|
|
143
|
-
"./project-utils": {
|
|
144
|
-
"types": "./lib/src/project-utils.d.ts",
|
|
145
|
-
"default": "./lib/src/project-utils.js"
|
|
146
|
-
},
|
|
147
|
-
"./*": {
|
|
148
|
-
"types": "./lib/src/*/index.d.ts",
|
|
149
|
-
"default": "./lib/src/*/index.js"
|
|
150
|
-
},
|
|
151
63
|
"./package.json": "./package.json"
|
|
152
64
|
},
|
|
153
65
|
"files": [
|
|
154
|
-
"index
|
|
66
|
+
"index*.ts",
|
|
155
67
|
"src",
|
|
156
68
|
"lib"
|
|
157
69
|
],
|
package/src/bin.ts
CHANGED
|
@@ -22,8 +22,7 @@ import { basename, dirname, isAbsolute, join, resolve, sep } from "node:path";
|
|
|
22
22
|
import { fileURLToPath } from "node:url";
|
|
23
23
|
import { promisify } from "node:util";
|
|
24
24
|
|
|
25
|
-
import
|
|
26
|
-
import * as log from "@dbx-tools/shared-core/log";
|
|
25
|
+
import { toError, log } from "@dbx-tools/shared-core";
|
|
27
26
|
import extractZip from "extract-zip";
|
|
28
27
|
import { coerce, gte, type SemVer } from "semver";
|
|
29
28
|
import { x as extractTar } from "tar";
|
|
@@ -247,7 +246,7 @@ async function isValidBin(path: string, options: BinOptions): Promise<boolean> {
|
|
|
247
246
|
} catch (cause) {
|
|
248
247
|
logger.debug("binary version command failed", {
|
|
249
248
|
path,
|
|
250
|
-
error:
|
|
249
|
+
error: toError(cause),
|
|
251
250
|
});
|
|
252
251
|
return false;
|
|
253
252
|
}
|
package/src/brand-files.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { readFile } from "node:fs/promises";
|
|
12
12
|
import { dirname, extname, isAbsolute, resolve } from "node:path";
|
|
13
|
-
import {
|
|
13
|
+
import { defaultBrandContext, parseBrandContext, type BrandContext } from "@dbx-tools/shared-core";
|
|
14
14
|
import { statSync } from "./file.ts";
|
|
15
15
|
import { resolveProjectRoots } from "./project-utils.ts";
|
|
16
16
|
|
|
@@ -23,21 +23,6 @@ const BRAND_CONTEXT_FILES = [
|
|
|
23
23
|
"brand.json",
|
|
24
24
|
] as const;
|
|
25
25
|
|
|
26
|
-
/** Validated brand context consumed by dbx-tools presentation packages. */
|
|
27
|
-
export type BrandContext = brandUtils.BrandContext;
|
|
28
|
-
/** Partial or untrusted input accepted by the brand context parser. */
|
|
29
|
-
export type BrandContextInput = brandUtils.BrandContextInput;
|
|
30
|
-
/** Zod schema for a complete validated brand context. */
|
|
31
|
-
export const BrandContextSchema = brandUtils.BrandContextSchema;
|
|
32
|
-
/** Built-in dbx-tools brand used when no project brand file exists. */
|
|
33
|
-
export const defaultBrandContext = brandUtils.defaultBrandContext;
|
|
34
|
-
/** Validate and normalize brand context input. */
|
|
35
|
-
export const parseBrandContext = brandUtils.parseBrandContext;
|
|
36
|
-
/** JSON Schema representation of {@link BrandContextSchema}. */
|
|
37
|
-
export const brandContextJsonSchema = brandUtils.brandContextJsonSchema;
|
|
38
|
-
/** Format a brand context as instructions for a text or design model. */
|
|
39
|
-
export const brandContextPrompt = brandUtils.brandContextPrompt;
|
|
40
|
-
|
|
41
26
|
/** Find a conventional YAML or JSON brand file from known project roots. */
|
|
42
27
|
export function findBrandContextFile(cwd: string = process.cwd()): string | undefined {
|
|
43
28
|
for (const root of resolveProjectRoots(cwd)) {
|
|
@@ -64,7 +49,7 @@ export async function loadBrandContextFile(path: string): Promise<BrandContext>
|
|
|
64
49
|
throw new Error(`Unsupported brand context format: ${extension || "no extension"}`);
|
|
65
50
|
}
|
|
66
51
|
|
|
67
|
-
return
|
|
52
|
+
return parseBrandContext(input);
|
|
68
53
|
}
|
|
69
54
|
|
|
70
55
|
/**
|
|
@@ -73,7 +58,7 @@ export async function loadBrandContextFile(path: string): Promise<BrandContext>
|
|
|
73
58
|
*/
|
|
74
59
|
export async function loadBrandContext(cwd: string = process.cwd()): Promise<BrandContext> {
|
|
75
60
|
const path = findBrandContextFile(cwd);
|
|
76
|
-
return path ? loadBrandContextFile(path) :
|
|
61
|
+
return path ? loadBrandContextFile(path) : defaultBrandContext;
|
|
77
62
|
}
|
|
78
63
|
|
|
79
64
|
/** Resolve a relative asset reference against the brand file that declared it. */
|