@mnaoumov/typescript-dev-toolkit 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/lib/cjs/commitlint-config.cjs +18 -3
- package/dist/lib/cjs/commitlint-config.d.cts +6 -0
- package/dist/lib/cjs/docs-site/api-doc-documented-files.cjs +51 -0
- package/dist/lib/cjs/docs-site/api-doc-documented-files.d.cts +31 -0
- package/dist/lib/cjs/docs-site/api-doc-package-sites.cjs +3 -2
- package/dist/lib/cjs/docs-site/api-doc-package-sites.d.cts +2 -1
- package/dist/lib/cjs/docs-site/api-doc-source-processing.cjs +4 -7
- package/dist/lib/cjs/docs-site/index.cjs +4 -1
- package/dist/lib/cjs/docs-site/index.d.cts +1 -0
- package/dist/lib/cjs/exec.cjs +18 -14
- package/dist/lib/cjs/exec.d.cts +31 -0
- package/dist/lib/cjs/linters/eslint-config.cjs +8 -1
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +3 -1
- package/dist/lib/cjs/linters/eslint-rules/index.cjs +4 -1
- package/dist/lib/cjs/linters/eslint-rules/index.d.cts +1 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-logical-operator-over-ternary.cjs +170 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-logical-operator-over-ternary.d.cts +30 -0
- package/dist/lib/cjs/nano-staged-config.cjs +42 -3
- package/dist/lib/cjs/nano-staged-config.d.cts +24 -4
- package/dist/lib/esm/commitlint-config.d.mts +6 -0
- package/dist/lib/esm/commitlint-config.mjs +7 -3
- package/dist/lib/esm/docs-site/api-doc-documented-files.d.mts +31 -0
- package/dist/lib/esm/docs-site/api-doc-documented-files.mjs +25 -0
- package/dist/lib/esm/docs-site/api-doc-package-sites.d.mts +2 -1
- package/dist/lib/esm/docs-site/api-doc-package-sites.mjs +3 -2
- package/dist/lib/esm/docs-site/api-doc-source-processing.mjs +7 -7
- package/dist/lib/esm/docs-site/index.d.mts +1 -0
- package/dist/lib/esm/docs-site/index.mjs +3 -1
- package/dist/lib/esm/exec.d.mts +31 -0
- package/dist/lib/esm/exec.mjs +15 -13
- package/dist/lib/esm/linters/eslint-config.mjs +8 -1
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +3 -1
- package/dist/lib/esm/linters/eslint-rules/index.d.mts +1 -0
- package/dist/lib/esm/linters/eslint-rules/index.mjs +3 -1
- package/dist/lib/esm/linters/eslint-rules/prefer-logical-operator-over-ternary.d.mts +30 -0
- package/dist/lib/esm/linters/eslint-rules/prefer-logical-operator-over-ternary.mjs +134 -0
- package/dist/lib/esm/nano-staged-config.d.mts +24 -4
- package/dist/lib/esm/nano-staged-config.mjs +48 -3
- package/docs-site/api-doc-documented-files/package.json +6 -0
- package/linters/eslint-rules/prefer-logical-operator-over-ternary/package.json +6 -0
- package/package.json +2 -2
|
@@ -47,6 +47,10 @@ import {
|
|
|
47
47
|
} from "node:path";
|
|
48
48
|
import { Node } from "ts-morph";
|
|
49
49
|
import { GENERIC_TYPE_PARAMS } from "./api-doc-constants.mjs";
|
|
50
|
+
import {
|
|
51
|
+
isDocumentedDirectoryName,
|
|
52
|
+
isDocumentedFileName
|
|
53
|
+
} from "./api-doc-documented-files.mjs";
|
|
50
54
|
import {
|
|
51
55
|
extractClassInfo,
|
|
52
56
|
extractEnumInfo,
|
|
@@ -62,7 +66,6 @@ import {
|
|
|
62
66
|
import { registerPackageDeclaration } from "./api-doc-package-sites.mjs";
|
|
63
67
|
import { getApiDocSettings } from "./api-doc-settings.mjs";
|
|
64
68
|
import { simplifyType } from "./api-doc-text-utils.mjs";
|
|
65
|
-
const EXCLUDED_DIR_SEGMENTS = /* @__PURE__ */ new Set(["@types", "styles", "test-helpers"]);
|
|
66
69
|
function collectFunctions(src, types, namespace) {
|
|
67
70
|
for (const $function of src.getFunctions()) {
|
|
68
71
|
if (!$function.isExported()) {
|
|
@@ -186,11 +189,11 @@ function findEntryFiles(directory) {
|
|
|
186
189
|
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
|
187
190
|
const fullPath = join(directory, entry.name);
|
|
188
191
|
if (entry.isDirectory()) {
|
|
189
|
-
if (
|
|
192
|
+
if (!isDocumentedDirectoryName(entry.name)) {
|
|
190
193
|
continue;
|
|
191
194
|
}
|
|
192
195
|
results.push(...findEntryFiles(fullPath));
|
|
193
|
-
} else if (
|
|
196
|
+
} else if (isDocumentedFileName(entry.name)) {
|
|
194
197
|
results.push(fullPath);
|
|
195
198
|
}
|
|
196
199
|
}
|
|
@@ -252,9 +255,6 @@ function registerGenericTypeParams(types) {
|
|
|
252
255
|
}
|
|
253
256
|
}
|
|
254
257
|
}
|
|
255
|
-
function isEntryFile(name) {
|
|
256
|
-
return !(!name.endsWith(".ts") || name.endsWith(".d.ts") || ["__merged.ts", "index.ts", "setup.ts"].includes(name) || name.endsWith("-setup.ts") || name.endsWith(".test.ts"));
|
|
257
|
-
}
|
|
258
258
|
function isTypeDeclaration(declaration) {
|
|
259
259
|
return Node.isClassDeclaration(declaration) || Node.isInterfaceDeclaration(declaration) || Node.isTypeAliasDeclaration(declaration) || Node.isEnumDeclaration(declaration);
|
|
260
260
|
}
|
|
@@ -271,4 +271,4 @@ export {
|
|
|
271
271
|
processSourceFile,
|
|
272
272
|
registerGenericTypeParams
|
|
273
273
|
};
|
|
274
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1zb3VyY2UtcHJvY2Vzc2luZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogU291cmNlIGRpc2NvdmVyeSArIGV4dHJhY3Rpb246IHdhbGtzIGBzcmNgLCBmaWx0ZXJzIHRvIGRvY3VtZW50YWJsZSBlbnRyeSBmaWxlcywgYW5kIHR1cm5zIGVhY2hcbiAqIGZpbGUncyBleHBvcnRlZCBkZWNsYXJhdGlvbnMgaW50byBgVHlwZUluZm9gIGVudHJpZXMga2V5ZWQgYnkgYSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNvdXJjZUZpbGUgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1xuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IE5vZGUgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB0eXBlIHsgVHlwZUluZm8gfSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBHRU5FUklDX1RZUEVfUEFSQU1TIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBleHRyYWN0Q2xhc3NJbmZvLFxuICBleHRyYWN0RW51bUluZm8sXG4gIGV4dHJhY3RJbnRlcmZhY2VJbmZvLFxuICBleHRyYWN0VHlwZUFsaWFzSW5mbyxcbiAgZ2V0RGVzY3JpcHRpb24sXG4gIGdldEV4YW1wbGVzLFxuICBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMsXG4gIGdldFJlbWFya3MsXG4gIGdldFJldHVybkRlc2NyaXB0aW9uLFxuICBnZXRTaW5jZVxufSBmcm9tICcuL2FwaS1kb2MtanNkb2MudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJQYWNrYWdlRGVjbGFyYXRpb24gfSBmcm9tICcuL2FwaS1kb2MtcGFja2FnZS1zaXRlcy50cyc7XG5pbXBvcnQgeyBnZXRBcGlEb2NTZXR0aW5ncyB9IGZyb20gJy4vYXBpLWRvYy1zZXR0aW5ncy50cyc7XG5pbXBvcnQgeyBzaW1wbGlmeVR5cGUgfSBmcm9tICcuL2FwaS1kb2MtdGV4dC11dGlscy50cyc7XG5cbi8qKlxuRGlyZWN0b3J5IG5hbWVzIHdob3NlIGVudGlyZSBzdWJ0cmVlIGlzIGV4Y2x1ZGVkIGZyb20gZG9jdW1lbnRhdGlvbi5cbiAqL1xuY29uc3QgRVhDTFVERURfRElSX1NFR01FTlRTID0gbmV3IFNldChbJ0B0eXBlcycsICdzdHlsZXMnLCAndGVzdC1oZWxwZXJzJ10pO1xuXG4vKipcbiAqIENvbGxlY3QgdG9wLWxldmVsIGV4cG9ydGVkIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RGdW5jdGlvbnMoc3JjOiBTb3VyY2VGaWxlLCB0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBuYW1lc3BhY2U6IHN0cmluZyk6IHZvaWQge1xuICBmb3IgKGNvbnN0ICRmdW5jdGlvbiBvZiBzcmMuZ2V0RnVuY3Rpb25zKCkpIHtcbiAgICBpZiAoISRmdW5jdGlvbi5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gJGZ1bmN0aW9uLmdldE5hbWUoKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRLZXkobmFtZXNwYWNlLCBuYW1lKTtcbiAgICBpZiAodHlwZXMuaGFzKGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMgPSBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoJGZ1bmN0aW9uKTtcbiAgICBjb25zdCBwYXJhbXMgPSAkZnVuY3Rpb24uZ2V0UGFyYW1ldGVycygpLm1hcCgocCkgPT4gKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMuZ2V0KHAuZ2V0TmFtZSgpKSA/PyAnJyxcbiAgICAgIG5hbWU6IHAuZ2V0TmFtZSgpLFxuICAgICAgdHlwZTogc2ltcGxpZnlUeXBlKHAuZ2V0VHlwZSgpLmdldFRleHQoKSlcbiAgICB9KSk7XG4gICAgY29uc3QgcGFyYW1ldGVyU3RyaW5nID0gcGFyYW1zLm1hcCgocCkgPT4gYCR7cC5uYW1lfTogJHtwLnR5cGV9YCkuam9pbignLCAnKTtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gc2ltcGxpZnlUeXBlKCRmdW5jdGlvbi5nZXRSZXR1cm5UeXBlKCkuZ2V0VGV4dCgpKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBgJHtuYW1lfSgke3BhcmFtZXRlclN0cmluZ30pYDtcbiAgICB0eXBlcy5zZXQoa2V5LCB7XG4gICAgICBiYXNlVHlwZXM6IFtdLFxuICAgICAgZGVzY3JpcHRpb246IGdldERlc2NyaXB0aW9uKCRmdW5jdGlvbiksXG4gICAgICBlbnVtTWVtYmVyczogW10sXG4gICAgICBleGFtcGxlczogZ2V0RXhhbXBsZXMoJGZ1bmN0aW9uKSxcbiAgICAgIGltcGxlbWVudHNUeXBlczogW10sXG4gICAgICBraW5kOiAnZnVuY3Rpb24nLFxuICAgICAgbWV0aG9kczogW3tcbiAgICAgICAgZGVzY3JpcHRpb246IGdldERlc2NyaXB0aW9uKCRmdW5jdGlvbiksXG4gICAgICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcygkZnVuY3Rpb24pLFxuICAgICAgICBpbmhlcml0ZWRGcm9tOiAnJyxcbiAgICAgICAgaXNTdGF0aWM6IGZhbHNlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBvdmVybG9hZEtleTogbmFtZSxcbiAgICAgICAgcGFyYW1ldGVyczogcGFyYW1zLFxuICAgICAgICByZW1hcmtzOiBnZXRSZW1hcmtzKCRmdW5jdGlvbiksXG4gICAgICAgIHJldHVybkRlc2NyaXB0aW9uOiBnZXRSZXR1cm5EZXNjcmlwdGlvbigkZnVuY3Rpb24pLFxuICAgICAgICByZXR1cm5UeXBlLFxuICAgICAgICBzaWduYXR1cmUsXG4gICAgICAgIHNpbmNlOiBnZXRTaW5jZSgkZnVuY3Rpb24pLFxuICAgICAgICB0eXBlOiAnJ1xuICAgICAgfV0sXG4gICAgICBuYW1lLFxuICAgICAgbmFtZXNwYWNlLFxuICAgICAgcHJvcGVydGllczogW10sXG4gICAgICByZW1hcmtzOiBnZXRSZW1hcmtzKCRmdW5jdGlvbiksXG4gICAgICB0eXBlUGFyYW1ldGVyczogJGZ1bmN0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkubWFwKCh0cCkgPT4gdHAuZ2V0VGV4dCgpKVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVjb3JkcyB3aGVyZSBldmVyeSBzeW1ib2wgYSBzb3VyY2UgZmlsZSBpbXBvcnRzIGlzIGRlY2xhcmVkLCBzbyBhIHR5cGUgYW5vdGhlciBkb2N1bWVudGVkIHBhY2thZ2UgZGVjbGFyZXNcbiAqIGxpbmtzIHRvIHRoYXQgcGFja2FnZSdzIHNpdGUuXG4gKlxuICogQHBhcmFtIHNyYyAtIFRoZSBzb3VyY2UgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RQYWNrYWdlRGVjbGFyYXRpb25zKHNyYzogU291cmNlRmlsZSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGltcG9ydERlY2xhcmF0aW9uIG9mIHNyYy5nZXRJbXBvcnREZWNsYXJhdGlvbnMoKSkge1xuICAgIGZvciAoY29uc3QgbmFtZWRJbXBvcnQgb2YgaW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZWRJbXBvcnRzKCkpIHtcbiAgICAgIC8vIEFuIHVucmVzb2x2ZWQgaW1wb3J0IGFsaWFzZXMgdGhlIGNoZWNrZXIncyB1bmtub3duIHN5bWJvbCwgd2hpY2ggaGFzIG5vIGRlY2xhcmF0aW9ucy5cbiAgICAgIC8vIEEgcmVuYW1lZCBpbXBvcnQgY2FycmllcyBpdHMgc3ltYm9sIG9uIHRoZSBsb2NhbCBuYW1lLlxuICAgICAgY29uc3QgbG9jYWxOYW1lTm9kZSA9IG5hbWVkSW1wb3J0LmdldEFsaWFzTm9kZSgpID8/IG5hbWVkSW1wb3J0LmdldE5hbWVOb2RlKCk7XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbnMgPSBsb2NhbE5hbWVOb2RlLmdldFN5bWJvbE9yVGhyb3coKS5nZXRBbGlhc2VkU3ltYm9sT3JUaHJvdygpLmdldERlY2xhcmF0aW9ucygpO1xuICAgICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBkZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgLy8gT25seSBhIHR5cGUgaXMgbGlua2VkIGZyb20gdHlwZSB0ZXh0OyBhIGZ1bmN0aW9uJ3MgbmFtZSBhbHNvIG1hdGNoZXMgd29yZHMgdGhhdCBhcmUgbm90IHJlZmVyZW5jZXMgdG8gaXQuXG4gICAgICAgIGlmIChpc1R5cGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICByZWdpc3RlclBhY2thZ2VEZWNsYXJhdGlvbihuYW1lZEltcG9ydC5nZXROYW1lKCksIGRlY2xhcmF0aW9uLmdldFNvdXJjZUZpbGUoKS5nZXRGaWxlUGF0aCgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgdG9wLWxldmVsIGV4cG9ydGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyAoZS5nLiBgZXhwb3J0IGNvbnN0IEVNUFRZID0gJydgKS5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RWYXJpYWJsZXMoc3JjOiBTb3VyY2VGaWxlLCB0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBuYW1lc3BhY2U6IHN0cmluZyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IHZhcmlhYmxlU3RhdGVtZW50IG9mIHNyYy5nZXRWYXJpYWJsZVN0YXRlbWVudHMoKSkge1xuICAgIGlmICghdmFyaWFibGVTdGF0ZW1lbnQuaXNFeHBvcnRlZCgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZGVjbGFyYXRpb25LaW5kID0gdmFyaWFibGVTdGF0ZW1lbnQuZ2V0RGVjbGFyYXRpb25LaW5kKCk7XG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZVN0YXRlbWVudC5nZXREZWNsYXJhdGlvbnMoKSkge1xuICAgICAgY29uc3QgbmFtZSA9IGRlY2xhcmF0aW9uLmdldE5hbWUoKTtcbiAgICAgIGNvbnN0IGtleSA9IHF1YWxpZmllZEtleShuYW1lc3BhY2UsIG5hbWUpO1xuICAgICAgaWYgKHR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdHlwZXMuc2V0KGtleSwge1xuICAgICAgICBiYXNlVHlwZXM6IFtdLFxuICAgICAgICBkZXNjcmlwdGlvbjogZ2V0RGVzY3JpcHRpb24odmFyaWFibGVTdGF0ZW1lbnQpLFxuICAgICAgICBlbnVtTWVtYmVyczogW10sXG4gICAgICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcyh2YXJpYWJsZVN0YXRlbWVudCksXG4gICAgICAgIGltcGxlbWVudHNUeXBlczogW10sXG4gICAgICAgIGtpbmQ6ICd2YXJpYWJsZScsXG4gICAgICAgIG1ldGhvZHM6IFtdLFxuICAgICAgICBuYW1lLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHByb3BlcnRpZXM6IFtdLFxuICAgICAgICByZW1hcmtzOiBnZXRSZW1hcmtzKHZhcmlhYmxlU3RhdGVtZW50KSxcbiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IFtdLFxuICAgICAgICB2YXJpYWJsZUtleXdvcmQ6IGRlY2xhcmF0aW9uS2luZCxcbiAgICAgICAgdmFyaWFibGVUeXBlOiBzaW1wbGlmeVR5cGUoZGVjbGFyYXRpb24uZ2V0VHlwZSgpLmdldFRleHQoKSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvbXB1dGUgYSBoYXNoIG9mIGV2ZXJ5IGlucHV0IHRoYXQgZGVjaWRlcyB0aGUgZ2VuZXJhdGVkIHBhZ2VzOiB0aGUgZ2VuZXJhdG9yJ3Mgb3duIG1vZHVsZXMsIHRoZSBzZXR0aW5ncyBhbmRcbiAqIHRoZSBlbnRyeSBzb3VyY2UgZmlsZXMuIEFuIHVuY2hhbmdlZCBoYXNoIGxldHMgYSBydW4gc2tpcCB0aGUgZ2VuZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gZW50cnlGaWxlcyAtIFRoZSBlbnRyeSBzb3VyY2UgZmlsZXMuXG4gKiBAcGFyYW0gZ2VuZXJhdG9yRGlyZWN0b3J5IC0gVGhlIGZvbGRlciBob2xkaW5nIHRoZSBnZW5lcmF0b3IncyBtb2R1bGVzLlxuICogQHJldHVybnMgVGhlIGhhc2gsIGFzIGhleC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDYWNoZUhhc2goZW50cnlGaWxlczogc3RyaW5nW10sIGdlbmVyYXRvckRpcmVjdG9yeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIC8vIFRoZSBnZW5lcmF0b3IgaXRzZWxmXG4gIGNvbnN0IGdlbmVyYXRvckZpbGVzID0gcmVhZGRpclN5bmMoZ2VuZXJhdG9yRGlyZWN0b3J5KS5maWx0ZXIoKG5hbWUpID0+ICFuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpKS5zb3J0KCk7XG4gIGZvciAoY29uc3QgZ2VuZXJhdG9yRmlsZSBvZiBnZW5lcmF0b3JGaWxlcykge1xuICAgIGhhc2gudXBkYXRlKGdlbmVyYXRvckZpbGUpO1xuICAgIGhhc2gudXBkYXRlKHJlYWRGaWxlU3luYyhqb2luKGdlbmVyYXRvckRpcmVjdG9yeSwgZ2VuZXJhdG9yRmlsZSksICd1dGYtOCcpKTtcbiAgfVxuXG4gIC8vIFRoZSBzZXR0aW5ncywgd2hpY2ggZXZlcnkgbGluayBhbmQgcGF0aCBkZXBlbmRzIG9uXG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0QXBpRG9jU2V0dGluZ3MoKTtcbiAgaGFzaC51cGRhdGUoSlNPTi5zdHJpbmdpZnkoe1xuICAgIC4uLnNldHRpbmdzLFxuICAgIGV4dGVybmFsVHlwZUxpbmtzOiBbLi4uc2V0dGluZ3MuZXh0ZXJuYWxUeXBlTGlua3NdLFxuICAgIHBhY2thZ2VTaXRlczogWy4uLnNldHRpbmdzLnBhY2thZ2VTaXRlc11cbiAgfSkpO1xuXG4gIC8vIEhhc2ggYWxsIGVudHJ5IHNvdXJjZSBmaWxlc1xuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIFsuLi5lbnRyeUZpbGVzXS5zb3J0KCkpIHtcbiAgICBoYXNoLnVwZGF0ZShmaWxlUGF0aCk7XG4gICAgaGFzaC51cGRhdGUocmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKSk7XG4gIH1cblxuICByZXR1cm4gaGFzaC5kaWdlc3QoJ2hleCcpO1xufVxuXG4vKipcbiAqIENvbXB1dGUgdGhlIG5hbWVzcGFjZSAoUE9TSVggcGF0aCByZWxhdGl2ZSB0byBgc3JjYCwgbm8gZXh0ZW5zaW9uKSBmb3IgYSBzb3VyY2UgZmlsZS5cbiAqXG4gKiBAcGFyYW0gc3JjRGlyZWN0b3J5IC0gVGhlIHNvdXJjZSBmb2xkZXIgdGhlIG5hbWVzcGFjZSBpcyByZWxhdGl2ZSB0by5cbiAqIEBwYXJhbSBmaWxlUGF0aCAtIFRoZSBmaWxlJ3MgcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlTmFtZXNwYWNlKHNyY0RpcmVjdG9yeTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlbGF0aXZlKHNyY0RpcmVjdG9yeSwgZmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpLnJlcGxhY2UoL1xcLnRzJC8sICcnKTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBmaW5kIGFsbCBkb2N1bWVudGFibGUgYCoudHNgIGVudHJ5IGZpbGVzIHVuZGVyIGBzcmNgLlxuICpcbiAqIEV4Y2x1ZGVzOiBgKi50ZXN0LnRzYCAoaW5jbC4gYCouYnJvd3Nlci50ZXN0LnRzYCAvIGAqLmludGVncmF0aW9uLnRlc3QudHNgKSwgYCouZC50c2AsXG4gKiBgaW5kZXgudHNgLCBgX19tZXJnZWQudHNgLCBgc2V0dXAudHNgLCBgKi1zZXR1cC50c2AsIGFuZCBhbnkgc3VidHJlZSB1bmRlciBhIGBAdHlwZXNgLFxuICogYHN0eWxlc2AsIG9yIGB0ZXN0LWhlbHBlcnNgIGRpcmVjdG9yeS5cbiAqXG4gKiBAcGFyYW0gZGlyZWN0b3J5IC0gVGhlIGZvbGRlciB0byBzZWFyY2guXG4gKiBAcmV0dXJucyBUaGUgZW50cnkgZmlsZXMnIHBhdGhzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEVudHJ5RmlsZXMoZGlyZWN0b3J5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4oZGlyZWN0b3J5LCBlbnRyeS5uYW1lKTtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYgKEVYQ0xVREVEX0RJUl9TRUdNRU5UUy5oYXMoZW50cnkubmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHRzLnB1c2goLi4uZmluZEVudHJ5RmlsZXMoZnVsbFBhdGgpKTtcbiAgICB9IGVsc2UgaWYgKGlzRW50cnlGaWxlKGVudHJ5Lm5hbWUpKSB7XG4gICAgICByZXN1bHRzLnB1c2goZnVsbFBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBhIHNvdXJjZSBmaWxlJ3MgZXhwb3J0ZWQgdHlwZSBhbGlhc2VzLCBlbnVtcywgaW50ZXJmYWNlcyBhbmQgY2xhc3Nlcy5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTb3VyY2VGaWxlKHNyYzogU291cmNlRmlsZSwgdHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgbmFtZXNwYWNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBhbGlhcyBvZiBzcmMuZ2V0VHlwZUFsaWFzZXMoKSkge1xuICAgIGlmICghYWxpYXMuaXNFeHBvcnRlZCgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gcXVhbGlmaWVkS2V5KG5hbWVzcGFjZSwgYWxpYXMuZ2V0TmFtZSgpKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0VHlwZUFsaWFzSW5mbyhhbGlhcywgbmFtZXNwYWNlKSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlbnVtRGVjbGFyYXRpb24gb2Ygc3JjLmdldEVudW1zKCkpIHtcbiAgICBpZiAoIWVudW1EZWNsYXJhdGlvbi5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRLZXkobmFtZXNwYWNlLCBlbnVtRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0RW51bUluZm8oZW51bURlY2xhcmF0aW9uLCBuYW1lc3BhY2UpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGlmYWNlIG9mIHNyYy5nZXRJbnRlcmZhY2VzKCkpIHtcbiAgICBpZiAoIWlmYWNlLmlzRXhwb3J0ZWQoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHF1YWxpZmllZEtleShuYW1lc3BhY2UsIGlmYWNlLmdldE5hbWUoKSk7XG4gICAgaWYgKCF0eXBlcy5oYXMoa2V5KSkge1xuICAgICAgdHlwZXMuc2V0KGtleSwgZXh0cmFjdEludGVyZmFjZUluZm8oaWZhY2UsIG5hbWVzcGFjZSkpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgY2xzIG9mIHNyYy5nZXRDbGFzc2VzKCkpIHtcbiAgICBpZiAoIWNscy5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gY2xzLmdldE5hbWUoKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRLZXkobmFtZXNwYWNlLCBuYW1lKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0Q2xhc3NJbmZvKGNscywgbmFtZXNwYWNlKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYWxsIHR5cGUgcGFyYW1ldGVyIG5hbWVzIHNvIHJlbmRlclR5cGVXaXRoTGlua3Mgd29uJ3QgaHlwZXJsaW5rIHRoZW0uXG4gKiBTa2lwIG5hbWVzIHRoYXQgYXJlIGFsc28ga25vd24gdHlwZXMg4oCUIHRob3NlIHNob3VsZCBzdGlsbCBiZSBsaW5rYWJsZS5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJHZW5lcmljVHlwZVBhcmFtcyh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IGtub3duTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGtub3duTmFtZXMuYWRkKGluZm8ubmFtZSk7XG4gIH1cbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGZvciAoY29uc3QgdHAgb2YgaW5mby50eXBlUGFyYW1ldGVycykge1xuICAgICAgY29uc3QgYmFyZVBhcmFtZXRlciA9IHRwLnJlcGxhY2UoL1xccytleHRlbmRzXFxzKy4qJC8sICcnKTtcbiAgICAgIGlmICgha25vd25OYW1lcy5oYXMoYmFyZVBhcmFtZXRlcikpIHtcbiAgICAgICAgR0VORVJJQ19UWVBFX1BBUkFNUy5hZGQoYmFyZVBhcmFtZXRlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzRW50cnlGaWxlKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBUaGUgYC50ZXN0LnRzYCBjbGF1c2UgY292ZXJzICoudGVzdC50cywgKi5icm93c2VyLnRlc3QudHMsICouaW50ZWdyYXRpb24udGVzdC50c1xuICByZXR1cm4gISghbmFtZS5lbmRzV2l0aCgnLnRzJykgfHwgbmFtZS5lbmRzV2l0aCgnLmQudHMnKSB8fCBbJ19fbWVyZ2VkLnRzJywgJ2luZGV4LnRzJywgJ3NldHVwLnRzJ10uaW5jbHVkZXMobmFtZSkgfHwgbmFtZS5lbmRzV2l0aCgnLXNldHVwLnRzJykgfHwgbmFtZS5lbmRzV2l0aCgnLnRlc3QudHMnKSk7XG59XG5cbmZ1bmN0aW9uIGlzVHlwZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uOiBOb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiBOb2RlLmlzQ2xhc3NEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikgfHwgTm9kZS5pc0ludGVyZmFjZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSB8fCBOb2RlLmlzVHlwZUFsaWFzRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pIHx8IE5vZGUuaXNFbnVtRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pO1xufVxuXG5mdW5jdGlvbiBxdWFsaWZpZWRLZXkobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNBLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFJckIsU0FBUywyQkFBMkI7QUFDcEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsa0NBQWtDO0FBQzNDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsb0JBQW9CO0FBSzdCLE1BQU0sd0JBQXdCLG9CQUFJLElBQUksQ0FBQyxVQUFVLFVBQVUsY0FBYyxDQUFDO0FBU25FLFNBQVMsaUJBQWlCLEtBQWlCLE9BQThCLFdBQXlCO0FBQ3ZHLGFBQVcsYUFBYSxJQUFJLGFBQWEsR0FBRztBQUMxQyxRQUFJLENBQUMsVUFBVSxXQUFXLEdBQUc7QUFDM0I7QUFBQSxJQUNGO0FBQ0EsVUFBTSxPQUFPLFVBQVUsUUFBUTtBQUMvQixRQUFJLENBQUMsTUFBTTtBQUNUO0FBQUEsSUFDRjtBQUNBLFVBQU0sTUFBTSxhQUFhLFdBQVcsSUFBSTtBQUN4QyxRQUFJLE1B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
|
|
274
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1zb3VyY2UtcHJvY2Vzc2luZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogU291cmNlIGRpc2NvdmVyeSArIGV4dHJhY3Rpb246IHdhbGtzIGBzcmNgLCBmaWx0ZXJzIHRvIGRvY3VtZW50YWJsZSBlbnRyeSBmaWxlcywgYW5kIHR1cm5zIGVhY2hcbiAqIGZpbGUncyBleHBvcnRlZCBkZWNsYXJhdGlvbnMgaW50byBgVHlwZUluZm9gIGVudHJpZXMga2V5ZWQgYnkgYSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNvdXJjZUZpbGUgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1xuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IE5vZGUgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB0eXBlIHsgVHlwZUluZm8gfSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBHRU5FUklDX1RZUEVfUEFSQU1TIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBpc0RvY3VtZW50ZWREaXJlY3RvcnlOYW1lLFxuICBpc0RvY3VtZW50ZWRGaWxlTmFtZVxufSBmcm9tICcuL2FwaS1kb2MtZG9jdW1lbnRlZC1maWxlcy50cyc7XG5pbXBvcnQge1xuICBleHRyYWN0Q2xhc3NJbmZvLFxuICBleHRyYWN0RW51bUluZm8sXG4gIGV4dHJhY3RJbnRlcmZhY2VJbmZvLFxuICBleHRyYWN0VHlwZUFsaWFzSW5mbyxcbiAgZ2V0RGVzY3JpcHRpb24sXG4gIGdldEV4YW1wbGVzLFxuICBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMsXG4gIGdldFJlbWFya3MsXG4gIGdldFJldHVybkRlc2NyaXB0aW9uLFxuICBnZXRTaW5jZVxufSBmcm9tICcuL2FwaS1kb2MtanNkb2MudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJQYWNrYWdlRGVjbGFyYXRpb24gfSBmcm9tICcuL2FwaS1kb2MtcGFja2FnZS1zaXRlcy50cyc7XG5pbXBvcnQgeyBnZXRBcGlEb2NTZXR0aW5ncyB9IGZyb20gJy4vYXBpLWRvYy1zZXR0aW5ncy50cyc7XG5pbXBvcnQgeyBzaW1wbGlmeVR5cGUgfSBmcm9tICcuL2FwaS1kb2MtdGV4dC11dGlscy50cyc7XG5cbi8qKlxuICogQ29sbGVjdCB0b3AtbGV2ZWwgZXhwb3J0ZWQgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSBzcmMgLSBUaGUgc291cmNlIGZpbGUuXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSB0eXBlJ3MgbmFtZXNwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEZ1bmN0aW9ucyhzcmM6IFNvdXJjZUZpbGUsIHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIG5hbWVzcGFjZTogc3RyaW5nKTogdm9pZCB7XG4gIGZvciAoY29uc3QgJGZ1bmN0aW9uIG9mIHNyYy5nZXRGdW5jdGlvbnMoKSkge1xuICAgIGlmICghJGZ1bmN0aW9uLmlzRXhwb3J0ZWQoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSAkZnVuY3Rpb24uZ2V0TmFtZSgpO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHF1YWxpZmllZEtleShuYW1lc3BhY2UsIG5hbWUpO1xuICAgIGlmICh0eXBlcy5oYXMoa2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtZXRlckRlc2NyaXB0aW9ucyA9IGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygkZnVuY3Rpb24pO1xuICAgIGNvbnN0IHBhcmFtcyA9ICRmdW5jdGlvbi5nZXRQYXJhbWV0ZXJzKCkubWFwKChwKSA9PiAoe1xuICAgICAgZGVzY3JpcHRpb246IHBhcmFtZXRlckRlc2NyaXB0aW9ucy5nZXQocC5nZXROYW1lKCkpID8/ICcnLFxuICAgICAgbmFtZTogcC5nZXROYW1lKCksXG4gICAgICB0eXBlOiBzaW1wbGlmeVR5cGUocC5nZXRUeXBlKCkuZ2V0VGV4dCgpKVxuICAgIH0pKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJTdHJpbmcgPSBwYXJhbXMubWFwKChwKSA9PiBgJHtwLm5hbWV9OiAke3AudHlwZX1gKS5qb2luKCcsICcpO1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBzaW1wbGlmeVR5cGUoJGZ1bmN0aW9uLmdldFJldHVyblR5cGUoKS5nZXRUZXh0KCkpO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGAke25hbWV9KCR7cGFyYW1ldGVyU3RyaW5nfSlgO1xuICAgIHR5cGVzLnNldChrZXksIHtcbiAgICAgIGJhc2VUeXBlczogW10sXG4gICAgICBkZXNjcmlwdGlvbjogZ2V0RGVzY3JpcHRpb24oJGZ1bmN0aW9uKSxcbiAgICAgIGVudW1NZW1iZXJzOiBbXSxcbiAgICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcygkZnVuY3Rpb24pLFxuICAgICAgaW1wbGVtZW50c1R5cGVzOiBbXSxcbiAgICAgIGtpbmQ6ICdmdW5jdGlvbicsXG4gICAgICBtZXRob2RzOiBbe1xuICAgICAgICBkZXNjcmlwdGlvbjogZ2V0RGVzY3JpcHRpb24oJGZ1bmN0aW9uKSxcbiAgICAgICAgZXhhbXBsZXM6IGdldEV4YW1wbGVzKCRmdW5jdGlvbiksXG4gICAgICAgIGluaGVyaXRlZEZyb206ICcnLFxuICAgICAgICBpc1N0YXRpYzogZmFsc2UsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG92ZXJsb2FkS2V5OiBuYW1lLFxuICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgIHJlbWFya3M6IGdldFJlbWFya3MoJGZ1bmN0aW9uKSxcbiAgICAgICAgcmV0dXJuRGVzY3JpcHRpb246IGdldFJldHVybkRlc2NyaXB0aW9uKCRmdW5jdGlvbiksXG4gICAgICAgIHJldHVyblR5cGUsXG4gICAgICAgIHNpZ25hdHVyZSxcbiAgICAgICAgc2luY2U6IGdldFNpbmNlKCRmdW5jdGlvbiksXG4gICAgICAgIHR5cGU6ICcnXG4gICAgICB9XSxcbiAgICAgIG5hbWUsXG4gICAgICBuYW1lc3BhY2UsXG4gICAgICBwcm9wZXJ0aWVzOiBbXSxcbiAgICAgIHJlbWFya3M6IGdldFJlbWFya3MoJGZ1bmN0aW9uKSxcbiAgICAgIHR5cGVQYXJhbWV0ZXJzOiAkZnVuY3Rpb24uZ2V0VHlwZVBhcmFtZXRlcnMoKS5tYXAoKHRwKSA9PiB0cC5nZXRUZXh0KCkpXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWNvcmRzIHdoZXJlIGV2ZXJ5IHN5bWJvbCBhIHNvdXJjZSBmaWxlIGltcG9ydHMgaXMgZGVjbGFyZWQsIHNvIGEgdHlwZSBhbm90aGVyIGRvY3VtZW50ZWQgcGFja2FnZSBkZWNsYXJlc1xuICogbGlua3MgdG8gdGhhdCBwYWNrYWdlJ3Mgc2l0ZS5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFBhY2thZ2VEZWNsYXJhdGlvbnMoc3JjOiBTb3VyY2VGaWxlKTogdm9pZCB7XG4gIGZvciAoY29uc3QgaW1wb3J0RGVjbGFyYXRpb24gb2Ygc3JjLmdldEltcG9ydERlY2xhcmF0aW9ucygpKSB7XG4gICAgZm9yIChjb25zdCBuYW1lZEltcG9ydCBvZiBpbXBvcnREZWNsYXJhdGlvbi5nZXROYW1lZEltcG9ydHMoKSkge1xuICAgICAgLy8gQW4gdW5yZXNvbHZlZCBpbXBvcnQgYWxpYXNlcyB0aGUgY2hlY2tlcidzIHVua25vd24gc3ltYm9sLCB3aGljaCBoYXMgbm8gZGVjbGFyYXRpb25zLlxuICAgICAgLy8gQSByZW5hbWVkIGltcG9ydCBjYXJyaWVzIGl0cyBzeW1ib2wgb24gdGhlIGxvY2FsIG5hbWUuXG4gICAgICBjb25zdCBsb2NhbE5hbWVOb2RlID0gbmFtZWRJbXBvcnQuZ2V0QWxpYXNOb2RlKCkgPz8gbmFtZWRJbXBvcnQuZ2V0TmFtZU5vZGUoKTtcbiAgICAgIGNvbnN0IGRlY2xhcmF0aW9ucyA9IGxvY2FsTmFtZU5vZGUuZ2V0U3ltYm9sT3JUaHJvdygpLmdldEFsaWFzZWRTeW1ib2xPclRocm93KCkuZ2V0RGVjbGFyYXRpb25zKCk7XG4gICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIGRlY2xhcmF0aW9ucykge1xuICAgICAgICAvLyBPbmx5IGEgdHlwZSBpcyBsaW5rZWQgZnJvbSB0eXBlIHRleHQ7IGEgZnVuY3Rpb24ncyBuYW1lIGFsc28gbWF0Y2hlcyB3b3JkcyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlcyB0byBpdC5cbiAgICAgICAgaWYgKGlzVHlwZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSkge1xuICAgICAgICAgIHJlZ2lzdGVyUGFja2FnZURlY2xhcmF0aW9uKG5hbWVkSW1wb3J0LmdldE5hbWUoKSwgZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpLmdldEZpbGVQYXRoKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCB0b3AtbGV2ZWwgZXhwb3J0ZWQgdmFyaWFibGUgZGVjbGFyYXRpb25zIChlLmcuIGBleHBvcnQgY29uc3QgRU1QVFkgPSAnJ2ApLlxuICpcbiAqIEBwYXJhbSBzcmMgLSBUaGUgc291cmNlIGZpbGUuXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSB0eXBlJ3MgbmFtZXNwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFZhcmlhYmxlcyhzcmM6IFNvdXJjZUZpbGUsIHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sIG5hbWVzcGFjZTogc3RyaW5nKTogdm9pZCB7XG4gIGZvciAoY29uc3QgdmFyaWFibGVTdGF0ZW1lbnQgb2Ygc3JjLmdldFZhcmlhYmxlU3RhdGVtZW50cygpKSB7XG4gICAgaWYgKCF2YXJpYWJsZVN0YXRlbWVudC5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBkZWNsYXJhdGlvbktpbmQgPSB2YXJpYWJsZVN0YXRlbWVudC5nZXREZWNsYXJhdGlvbktpbmQoKTtcbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHZhcmlhYmxlU3RhdGVtZW50LmdldERlY2xhcmF0aW9ucygpKSB7XG4gICAgICBjb25zdCBuYW1lID0gZGVjbGFyYXRpb24uZ2V0TmFtZSgpO1xuICAgICAgY29uc3Qga2V5ID0gcXVhbGlmaWVkS2V5KG5hbWVzcGFjZSwgbmFtZSk7XG4gICAgICBpZiAodHlwZXMuaGFzKGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0eXBlcy5zZXQoa2V5LCB7XG4gICAgICAgIGJhc2VUeXBlczogW10sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBnZXREZXNjcmlwdGlvbih2YXJpYWJsZVN0YXRlbWVudCksXG4gICAgICAgIGVudW1NZW1iZXJzOiBbXSxcbiAgICAgICAgZXhhbXBsZXM6IGdldEV4YW1wbGVzKHZhcmlhYmxlU3RhdGVtZW50KSxcbiAgICAgICAgaW1wbGVtZW50c1R5cGVzOiBbXSxcbiAgICAgICAga2luZDogJ3ZhcmlhYmxlJyxcbiAgICAgICAgbWV0aG9kczogW10sXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgcHJvcGVydGllczogW10sXG4gICAgICAgIHJlbWFya3M6IGdldFJlbWFya3ModmFyaWFibGVTdGF0ZW1lbnQpLFxuICAgICAgICB0eXBlUGFyYW1ldGVyczogW10sXG4gICAgICAgIHZhcmlhYmxlS2V5d29yZDogZGVjbGFyYXRpb25LaW5kLFxuICAgICAgICB2YXJpYWJsZVR5cGU6IHNpbXBsaWZ5VHlwZShkZWNsYXJhdGlvbi5nZXRUeXBlKCkuZ2V0VGV4dCgpKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29tcHV0ZSBhIGhhc2ggb2YgZXZlcnkgaW5wdXQgdGhhdCBkZWNpZGVzIHRoZSBnZW5lcmF0ZWQgcGFnZXM6IHRoZSBnZW5lcmF0b3IncyBvd24gbW9kdWxlcywgdGhlIHNldHRpbmdzIGFuZFxuICogdGhlIGVudHJ5IHNvdXJjZSBmaWxlcy4gQW4gdW5jaGFuZ2VkIGhhc2ggbGV0cyBhIHJ1biBza2lwIHRoZSBnZW5lcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBlbnRyeUZpbGVzIC0gVGhlIGVudHJ5IHNvdXJjZSBmaWxlcy5cbiAqIEBwYXJhbSBnZW5lcmF0b3JEaXJlY3RvcnkgLSBUaGUgZm9sZGVyIGhvbGRpbmcgdGhlIGdlbmVyYXRvcidzIG1vZHVsZXMuXG4gKiBAcmV0dXJucyBUaGUgaGFzaCwgYXMgaGV4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUNhY2hlSGFzaChlbnRyeUZpbGVzOiBzdHJpbmdbXSwgZ2VuZXJhdG9yRGlyZWN0b3J5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgLy8gVGhlIGdlbmVyYXRvciBpdHNlbGZcbiAgY29uc3QgZ2VuZXJhdG9yRmlsZXMgPSByZWFkZGlyU3luYyhnZW5lcmF0b3JEaXJlY3RvcnkpLmZpbHRlcigobmFtZSkgPT4gIW5hbWUuZW5kc1dpdGgoJy50ZXN0LnRzJykpLnNvcnQoKTtcbiAgZm9yIChjb25zdCBnZW5lcmF0b3JGaWxlIG9mIGdlbmVyYXRvckZpbGVzKSB7XG4gICAgaGFzaC51cGRhdGUoZ2VuZXJhdG9yRmlsZSk7XG4gICAgaGFzaC51cGRhdGUocmVhZEZpbGVTeW5jKGpvaW4oZ2VuZXJhdG9yRGlyZWN0b3J5LCBnZW5lcmF0b3JGaWxlKSwgJ3V0Zi04JykpO1xuICB9XG5cbiAgLy8gVGhlIHNldHRpbmdzLCB3aGljaCBldmVyeSBsaW5rIGFuZCBwYXRoIGRlcGVuZHMgb25cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRBcGlEb2NTZXR0aW5ncygpO1xuICBoYXNoLnVwZGF0ZShKU09OLnN0cmluZ2lmeSh7XG4gICAgLi4uc2V0dGluZ3MsXG4gICAgZXh0ZXJuYWxUeXBlTGlua3M6IFsuLi5zZXR0aW5ncy5leHRlcm5hbFR5cGVMaW5rc10sXG4gICAgcGFja2FnZVNpdGVzOiBbLi4uc2V0dGluZ3MucGFja2FnZVNpdGVzXVxuICB9KSk7XG5cbiAgLy8gSGFzaCBhbGwgZW50cnkgc291cmNlIGZpbGVzXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgWy4uLmVudHJ5RmlsZXNdLnNvcnQoKSkge1xuICAgIGhhc2gudXBkYXRlKGZpbGVQYXRoKTtcbiAgICBoYXNoLnVwZGF0ZShyZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGYtOCcpKTtcbiAgfVxuXG4gIHJldHVybiBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgbmFtZXNwYWNlIChQT1NJWCBwYXRoIHJlbGF0aXZlIHRvIGBzcmNgLCBubyBleHRlbnNpb24pIGZvciBhIHNvdXJjZSBmaWxlLlxuICpcbiAqIEBwYXJhbSBzcmNEaXJlY3RvcnkgLSBUaGUgc291cmNlIGZvbGRlciB0aGUgbmFtZXNwYWNlIGlzIHJlbGF0aXZlIHRvLlxuICogQHBhcmFtIGZpbGVQYXRoIC0gVGhlIGZpbGUncyBwYXRoLlxuICogQHJldHVybnMgVGhlIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVOYW1lc3BhY2Uoc3JjRGlyZWN0b3J5OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVsYXRpdmUoc3JjRGlyZWN0b3J5LCBmaWxlUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJykucmVwbGFjZSgvXFwudHMkLywgJycpO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGZpbmQgYWxsIGRvY3VtZW50YWJsZSBgKi50c2AgZW50cnkgZmlsZXMgdW5kZXIgYHNyY2AuXG4gKlxuICogRXhjbHVkZXM6IGAqLnRlc3QudHNgIChpbmNsLiBgKi5icm93c2VyLnRlc3QudHNgIC8gYCouaW50ZWdyYXRpb24udGVzdC50c2ApLCBgKi5kLnRzYCxcbiAqIGBpbmRleC50c2AsIGBfX21lcmdlZC50c2AsIGBzZXR1cC50c2AsIGAqLXNldHVwLnRzYCwgYW5kIGFueSBzdWJ0cmVlIHVuZGVyIGEgYEB0eXBlc2AsXG4gKiBgc3R5bGVzYCwgb3IgYHRlc3QtaGVscGVyc2AgZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSBkaXJlY3RvcnkgLSBUaGUgZm9sZGVyIHRvIHNlYXJjaC5cbiAqIEByZXR1cm5zIFRoZSBlbnRyeSBmaWxlcycgcGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRW50cnlGaWxlcyhkaXJlY3Rvcnk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiByZWFkZGlyU3luYyhkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXJlY3RvcnksIGVudHJ5Lm5hbWUpO1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBpZiAoIWlzRG9jdW1lbnRlZERpcmVjdG9yeU5hbWUoZW50cnkubmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHRzLnB1c2goLi4uZmluZEVudHJ5RmlsZXMoZnVsbFBhdGgpKTtcbiAgICB9IGVsc2UgaWYgKGlzRG9jdW1lbnRlZEZpbGVOYW1lKGVudHJ5Lm5hbWUpKSB7XG4gICAgICByZXN1bHRzLnB1c2goZnVsbFBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBhIHNvdXJjZSBmaWxlJ3MgZXhwb3J0ZWQgdHlwZSBhbGlhc2VzLCBlbnVtcywgaW50ZXJmYWNlcyBhbmQgY2xhc3Nlcy5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTb3VyY2VGaWxlKHNyYzogU291cmNlRmlsZSwgdHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgbmFtZXNwYWNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBhbGlhcyBvZiBzcmMuZ2V0VHlwZUFsaWFzZXMoKSkge1xuICAgIGlmICghYWxpYXMuaXNFeHBvcnRlZCgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gcXVhbGlmaWVkS2V5KG5hbWVzcGFjZSwgYWxpYXMuZ2V0TmFtZSgpKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0VHlwZUFsaWFzSW5mbyhhbGlhcywgbmFtZXNwYWNlKSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlbnVtRGVjbGFyYXRpb24gb2Ygc3JjLmdldEVudW1zKCkpIHtcbiAgICBpZiAoIWVudW1EZWNsYXJhdGlvbi5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRLZXkobmFtZXNwYWNlLCBlbnVtRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0RW51bUluZm8oZW51bURlY2xhcmF0aW9uLCBuYW1lc3BhY2UpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGlmYWNlIG9mIHNyYy5nZXRJbnRlcmZhY2VzKCkpIHtcbiAgICBpZiAoIWlmYWNlLmlzRXhwb3J0ZWQoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHF1YWxpZmllZEtleShuYW1lc3BhY2UsIGlmYWNlLmdldE5hbWUoKSk7XG4gICAgaWYgKCF0eXBlcy5oYXMoa2V5KSkge1xuICAgICAgdHlwZXMuc2V0KGtleSwgZXh0cmFjdEludGVyZmFjZUluZm8oaWZhY2UsIG5hbWVzcGFjZSkpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgY2xzIG9mIHNyYy5nZXRDbGFzc2VzKCkpIHtcbiAgICBpZiAoIWNscy5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gY2xzLmdldE5hbWUoKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRLZXkobmFtZXNwYWNlLCBuYW1lKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0Q2xhc3NJbmZvKGNscywgbmFtZXNwYWNlKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYWxsIHR5cGUgcGFyYW1ldGVyIG5hbWVzIHNvIHJlbmRlclR5cGVXaXRoTGlua3Mgd29uJ3QgaHlwZXJsaW5rIHRoZW0uXG4gKiBTa2lwIG5hbWVzIHRoYXQgYXJlIGFsc28ga25vd24gdHlwZXMg4oCUIHRob3NlIHNob3VsZCBzdGlsbCBiZSBsaW5rYWJsZS5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJHZW5lcmljVHlwZVBhcmFtcyh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IGtub3duTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGtub3duTmFtZXMuYWRkKGluZm8ubmFtZSk7XG4gIH1cbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGZvciAoY29uc3QgdHAgb2YgaW5mby50eXBlUGFyYW1ldGVycykge1xuICAgICAgY29uc3QgYmFyZVBhcmFtZXRlciA9IHRwLnJlcGxhY2UoL1xccytleHRlbmRzXFxzKy4qJC8sICcnKTtcbiAgICAgIGlmICgha25vd25OYW1lcy5oYXMoYmFyZVBhcmFtZXRlcikpIHtcbiAgICAgICAgR0VORVJJQ19UWVBFX1BBUkFNUy5hZGQoYmFyZVBhcmFtZXRlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVHlwZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uOiBOb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiBOb2RlLmlzQ2xhc3NEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikgfHwgTm9kZS5pc0ludGVyZmFjZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSB8fCBOb2RlLmlzVHlwZUFsaWFzRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pIHx8IE5vZGUuaXNFbnVtRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pO1xufVxuXG5mdW5jdGlvbiBxdWFsaWZpZWRLZXkobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNBLFNBQVMsa0JBQWtCO0FBQzNCO0FB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
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference path="../library-references.d.mts" />
|
|
2
2
|
export * as 'api-doc-constants' from './api-doc-constants.mjs';
|
|
3
|
+
export * as 'api-doc-documented-files' from './api-doc-documented-files.mjs';
|
|
3
4
|
export * as 'api-doc-jsdoc' from './api-doc-jsdoc.mjs';
|
|
4
5
|
export * as 'api-doc-link-rendering' from './api-doc-link-rendering.mjs';
|
|
5
6
|
export * as 'api-doc-package-sites' from './api-doc-package-sites.mjs';
|
|
@@ -4,6 +4,7 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import * as api_doc_constants from "./api-doc-constants.mjs";
|
|
7
|
+
import * as api_doc_documented_files from "./api-doc-documented-files.mjs";
|
|
7
8
|
import * as api_doc_jsdoc from "./api-doc-jsdoc.mjs";
|
|
8
9
|
import * as api_doc_link_rendering from "./api-doc-link-rendering.mjs";
|
|
9
10
|
import * as api_doc_package_sites from "./api-doc-package-sites.mjs";
|
|
@@ -30,6 +31,7 @@ import * as satteri_relative_links from "./satteri-relative-links.mjs";
|
|
|
30
31
|
import * as unrendered_alerts from "./unrendered-alerts.mjs";
|
|
31
32
|
export {
|
|
32
33
|
api_doc_constants as "api-doc-constants",
|
|
34
|
+
api_doc_documented_files as "api-doc-documented-files",
|
|
33
35
|
api_doc_jsdoc as "api-doc-jsdoc",
|
|
34
36
|
api_doc_link_rendering as "api-doc-link-rendering",
|
|
35
37
|
api_doc_package_sites as "api-doc-package-sites",
|
|
@@ -55,4 +57,4 @@ export {
|
|
|
55
57
|
satteri_relative_links as "satteri-relative-links",
|
|
56
58
|
unrendered_alerts as "unrendered-alerts"
|
|
57
59
|
};
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdhcGktZG9jLWNvbnN0YW50cycgZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy1kb2N1bWVudGVkLWZpbGVzJyBmcm9tICcuL2FwaS1kb2MtZG9jdW1lbnRlZC1maWxlcy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy1qc2RvYycgZnJvbSAnLi9hcGktZG9jLWpzZG9jLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLWxpbmstcmVuZGVyaW5nJyBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuZXhwb3J0ICogYXMgJ2FwaS1kb2MtcGFja2FnZS1zaXRlcycgZnJvbSAnLi9hcGktZG9jLXBhY2thZ2Utc2l0ZXMudHMnO1xuZXhwb3J0ICogYXMgJ2FwaS1kb2MtcGFnZS1nZW5lcmF0aW9uJyBmcm9tICcuL2FwaS1kb2MtcGFnZS1nZW5lcmF0aW9uLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLXJvdXRlLXNlZ21lbnRzJyBmcm9tICcuL2FwaS1kb2Mtcm91dGUtc2VnbWVudHMudHMnO1xuZXhwb3J0ICogYXMgJ2FwaS1kb2Mtc2V0dGluZ3MnIGZyb20gJy4vYXBpLWRvYy1zZXR0aW5ncy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy1zb3VyY2UtcHJvY2Vzc2luZycgZnJvbSAnLi9hcGktZG9jLXNvdXJjZS1wcm9jZXNzaW5nLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLXRleHQtdXRpbHMnIGZyb20gJy4vYXBpLWRvYy10ZXh0LXV0aWxzLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jLXR5cGUtbWVyZ2luZycgZnJvbSAnLi9hcGktZG9jLXR5cGUtbWVyZ2luZy50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWRvYy10eXBlcycgZnJvbSAnLi9hcGktZG9jLXR5cGVzLnRzJztcbmV4cG9ydCAqIGFzICdhcGktZG9jcycgZnJvbSAnLi9hcGktZG9jcy50cyc7XG5leHBvcnQgKiBhcyAnYXN0cm8tY29uZmlnJyBmcm9tICcuL2FzdHJvLWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnZG9jcy1saW5rcycgZnJvbSAnLi9kb2NzLWxpbmtzLnRzJztcbmV4cG9ydCAqIGFzICdkb2NzLXNpdGUtYXNzZXRzJyBmcm9tICcuL2RvY3Mtc2l0ZS1hc3NldHMudHMnO1xuZXhwb3J0ICogYXMgJ2RvY3Mtc2l0ZS1jb21tYW5kcycgZnJvbSAnLi9kb2NzLXNpdGUtY29tbWFuZHMudHMnO1xuZXhwb3J0ICogYXMgJ2RvY3Mtc2l0ZS1jb25maWcnIGZyb20gJy4vZG9jcy1zaXRlLWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnbGluay1jaGVjaycgZnJvbSAnLi9saW5rLWNoZWNrLnRzJztcbmV4cG9ydCAqIGFzICdvZy1pbWFnZS1wYWdlJyBmcm9tICcuL29nLWltYWdlLXBhZ2UudHMnO1xuZXhwb3J0ICogYXMgJ29nLWltYWdlJyBmcm9tICcuL29nLWltYWdlLnRzJztcbmV4cG9ydCAqIGFzICdvZy1pbWFnZXMnIGZyb20gJy4vb2ctaW1hZ2VzLnRzJztcbmV4cG9ydCAqIGFzICdyb3V0ZS1kYXRhJyBmcm9tICcuL3JvdXRlLWRhdGEudHMnO1xuZXhwb3J0ICogYXMgJ3NhdHRlcmktZ2l0aHViLWFsZXJ0cycgZnJvbSAnLi9zYXR0ZXJpLWdpdGh1Yi1hbGVydHMudHMnO1xuZXhwb3J0ICogYXMgJ3NhdHRlcmktcmVsYXRpdmUtbGlua3MnIGZyb20gJy4vc2F0dGVyaS1yZWxhdGl2ZS1saW5rcy50cyc7XG5leHBvcnQgKiBhcyAndW5yZW5kZXJlZC1hbGVydHMnIGZyb20gJy4vdW5yZW5kZXJlZC1hbGVydHMudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFFQSxZQUFZQSx1QkFBeUI7QUFDckMsWUFBWUMsOEJBQWdDO0FBQzVDLFlBQVlDLG1CQUFxQjtBQUNqQyxZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVlDLDZCQUErQjtBQUMzQyxZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMsc0JBQXdCO0FBQ3BDLFlBQVlDLCtCQUFpQztBQUM3QyxZQUFZQyx3QkFBMEI7QUFDdEMsWUFBWUMsMEJBQTRCO0FBQ3hDLFlBQVlDLG1CQUFxQjtBQUNqQyxZQUFZQyxjQUFnQjtBQUM1QixZQUFZQyxrQkFBb0I7QUFDaEMsWUFBWUMsZ0JBQWtCO0FBQzlCLFlBQVlDLHNCQUF3QjtBQUNwQyxZQUFZQyx3QkFBMEI7QUFDdEMsWUFBWUMsc0JBQXdCO0FBQ3BDLFlBQVlDLGdCQUFrQjtBQUM5QixZQUFZQyxtQkFBcUI7QUFDakMsWUFBWUMsY0FBZ0I7QUFDNUIsWUFBWUMsZUFBaUI7QUFDN0IsWUFBWUMsZ0JBQWtCO0FBQzlCLFlBQVlDLDJCQUE2QjtBQUN6QyxZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMsdUJBQXlCOyIsCiAgIm5hbWVzIjogWyJhcGktZG9jLWNvbnN0YW50cyIsICJhcGktZG9jLWRvY3VtZW50ZWQtZmlsZXMiLCAiYXBpLWRvYy1qc2RvYyIsICJhcGktZG9jLWxpbmstcmVuZGVyaW5nIiwgImFwaS1kb2MtcGFja2FnZS1zaXRlcyIsICJhcGktZG9jLXBhZ2UtZ2VuZXJhdGlvbiIsICJhcGktZG9jLXJvdXRlLXNlZ21lbnRzIiwgImFwaS1kb2Mtc2V0dGluZ3MiLCAiYXBpLWRvYy1zb3VyY2UtcHJvY2Vzc2luZyIsICJhcGktZG9jLXRleHQtdXRpbHMiLCAiYXBpLWRvYy10eXBlLW1lcmdpbmciLCAiYXBpLWRvYy10eXBlcyIsICJhcGktZG9jcyIsICJhc3Ryby1jb25maWciLCAiZG9jcy1saW5rcyIsICJkb2NzLXNpdGUtYXNzZXRzIiwgImRvY3Mtc2l0ZS1jb21tYW5kcyIsICJkb2NzLXNpdGUtY29uZmlnIiwgImxpbmstY2hlY2siLCAib2ctaW1hZ2UtcGFnZSIsICJvZy1pbWFnZSIsICJvZy1pbWFnZXMiLCAicm91dGUtZGF0YSIsICJzYXR0ZXJpLWdpdGh1Yi1hbGVydHMiLCAic2F0dGVyaS1yZWxhdGl2ZS1saW5rcyIsICJ1bnJlbmRlcmVkLWFsZXJ0cyJdCn0K
|
package/dist/lib/esm/exec.d.mts
CHANGED
|
@@ -161,3 +161,34 @@ export declare function exec(command: CommandPart[] | string, options?: ExecSimp
|
|
|
161
161
|
* the error is resolved with the stdout and stderr.
|
|
162
162
|
*/
|
|
163
163
|
export declare function exec(command: CommandPart[] | string, options: ExecDetailedOptions): Promise<ExecResult>;
|
|
164
|
+
/**
|
|
165
|
+
* Returns the length of the command line as the operating system will actually see it, which on Windows is
|
|
166
|
+
* NOT the length of the string passed in.
|
|
167
|
+
*
|
|
168
|
+
* {@link spawnViaShell} routes the command through `cmd.exe`, and two things are spent between here and
|
|
169
|
+
* there, neither of them visible in the assembled command:
|
|
170
|
+
* - Node's `spawn(…, { shell: true })` wraps it as `<comspec> /d /s /c "<command>"`.
|
|
171
|
+
* - {@link cmdEscapeCommandLine} `^`-escapes every one of `cmd.exe`'s metacharacters, which on a list of
|
|
172
|
+
* quoted paths is a few percent of the whole (measured: +236 chars on a 7216-char invocation).
|
|
173
|
+
*
|
|
174
|
+
* Both are ours to compute, so they are computed rather than guessed. What is NOT computable from here is
|
|
175
|
+
* what the spawned command does to its own arguments — see {@link WINDOWS_CHILD_EXPANSION_RESERVE}.
|
|
176
|
+
*
|
|
177
|
+
* The platform branch here MUST stay in sync with the one in {@link spawnViaShell}.
|
|
178
|
+
*
|
|
179
|
+
* @param commandLine - The assembled command line, before any shell wrapping.
|
|
180
|
+
* @returns The length in characters of what reaches the operating system.
|
|
181
|
+
*/
|
|
182
|
+
export declare function getEffectiveCommandLineLength(commandLine: string): number;
|
|
183
|
+
/**
|
|
184
|
+
* Returns the max command line length to size an {@link ExecArgument} batch against — the platform maximum
|
|
185
|
+
* less {@link WINDOWS_CHILD_EXPANSION_RESERVE}.
|
|
186
|
+
*
|
|
187
|
+
* Deliberately more conservative than {@link getMaxCommandLength}, because the two answer different
|
|
188
|
+
* questions. Exceeding the plain-command limit is a hard failure the caller cannot avoid, so that check
|
|
189
|
+
* stays exact. Exceeding the batching limit only costs one extra invocation, so that check may — and
|
|
190
|
+
* should — leave room to spare.
|
|
191
|
+
*
|
|
192
|
+
* @returns The max length in characters available to a single batch.
|
|
193
|
+
*/
|
|
194
|
+
export declare function getMaxBatchCommandLength(): number;
|
package/dist/lib/esm/exec.mjs
CHANGED
|
@@ -213,6 +213,17 @@ const NTSTATUS_NAMES = /* @__PURE__ */ new Map([
|
|
|
213
213
|
["0xC0000409", "STATUS_STACK_BUFFER_OVERRUN"]
|
|
214
214
|
]);
|
|
215
215
|
const WINDOWS_CHILD_EXPANSION_RESERVE = 2048;
|
|
216
|
+
function getEffectiveCommandLineLength(commandLine) {
|
|
217
|
+
if (process.platform !== "win32") {
|
|
218
|
+
return commandLine.length;
|
|
219
|
+
}
|
|
220
|
+
const comspec = process.env["comspec"] ?? "cmd.exe";
|
|
221
|
+
const CMD_WRAPPER = ' /d /s /c ""';
|
|
222
|
+
return comspec.length + CMD_WRAPPER.length + commandEscapeCommandLine(commandLine).length;
|
|
223
|
+
}
|
|
224
|
+
function getMaxBatchCommandLength() {
|
|
225
|
+
return getMaxCommandLength() - (process.platform === "win32" ? WINDOWS_CHILD_EXPANSION_RESERVE : 0);
|
|
226
|
+
}
|
|
216
227
|
function buildCommandLine($arguments) {
|
|
217
228
|
return process.platform === "win32" ? toCommandLine($arguments) : toPosixCommandLine($arguments);
|
|
218
229
|
}
|
|
@@ -279,17 +290,6 @@ async function executeBatches(params) {
|
|
|
279
290
|
function getChildEnv() {
|
|
280
291
|
return buildChildEnv(process.env, process.allowedNodeEnvironmentFlags);
|
|
281
292
|
}
|
|
282
|
-
function getEffectiveCommandLineLength(commandLine) {
|
|
283
|
-
if (process.platform !== "win32") {
|
|
284
|
-
return commandLine.length;
|
|
285
|
-
}
|
|
286
|
-
const comspec = process.env["comspec"] ?? "cmd.exe";
|
|
287
|
-
const CMD_WRAPPER = ' /d /s /c ""';
|
|
288
|
-
return comspec.length + CMD_WRAPPER.length + commandEscapeCommandLine(commandLine).length;
|
|
289
|
-
}
|
|
290
|
-
function getMaxBatchCommandLength() {
|
|
291
|
-
return getMaxCommandLength() - (process.platform === "win32" ? WINDOWS_CHILD_EXPANSION_RESERVE : 0);
|
|
292
|
-
}
|
|
293
293
|
function getMaxCommandLength() {
|
|
294
294
|
const WINDOWS_MAX_COMMAND_LENGTH = 8191;
|
|
295
295
|
const UNIX_MAX_COMMAND_LENGTH = 131072;
|
|
@@ -396,6 +396,8 @@ function truncateCommand(command) {
|
|
|
396
396
|
export {
|
|
397
397
|
appendNodeOption,
|
|
398
398
|
buildChildEnv,
|
|
399
|
-
exec
|
|
399
|
+
exec,
|
|
400
|
+
getEffectiveCommandLineLength,
|
|
401
|
+
getMaxBatchCommandLength
|
|
400
402
|
};
|
|
401
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgZXhlY3V0aW5nIGNvbW1hbmRzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGVidWcnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyB0cmltRW5kIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0cmluZyc7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQge1xuICBjbWRFc2NhcGVDb21tYW5kTGluZSBhcyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUsXG4gIHRvQ29tbWFuZExpbmUsXG4gIHRvUG9zaXhDb21tYW5kTGluZVxufSBmcm9tICcuL2NsaS11dGlscy50cyc7XG5cbi8qKlxuICogQSBjb21tYW5kIHBhcnQ6IGVpdGhlciBhIHBsYWluIHN0cmluZyBvciBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSB3aXRoIGJhdGNoZWQgYXJndW1lbnRzLlxuICovXG5leHBvcnQgdHlwZSBDb21tYW5kUGFydCA9IEV4ZWNBcmd1bWVudCB8IHN0cmluZztcblxuLyoqXG4gKiBBIGNvbW1hbmQgYXJndW1lbnQgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgYXJncyB0byBiZSBiYXRjaGVkLlxuICogSWYgdGhlIGV4cGFuZGVkIGNvbW1hbmQgZXhjZWVkcyB0aGUgcGxhdGZvcm0ncyBtYXggY29tbWFuZCBsZW5ndGgsXG4gKiB0aGUgYmF0Y2hlZCBhcmdzIGFyZSBzcGxpdCBpbnRvIHNlcXVlbnRpYWwgZXhlY3V0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjQXJndW1lbnQge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0byBiYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZWRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBleGVjfSB0aGF0IHJldHVybiBkZXRhaWxlZCByZXN1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNEZXRhaWxlZE9wdGlvbnMgZXh0ZW5kcyBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIGB0cnVlYCB0byByZWNlaXZlIGRldGFpbGVkIHJlc3VsdHMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlsczogdHJ1ZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBleGVjdXRpbmcgYSBjb21tYW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgY3VycmVudCB3b3JraW5nIGZvbGRlciBmb3IgdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY3dkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MsIG1lcmdlZCBvdmVyIHRoZSBpbmhlcml0ZWQgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB7fWBcbiAgICovXG4gIHJlYWRvbmx5IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGF0dGFjaGVzIHRoZSBjaGlsZCBwcm9jZXNzJ3Mgc3RkaW8gZGlyZWN0bHkgdG8gdGhlIHRlcm1pbmFsIChgc3RkaW86ICdpbmhlcml0J2ApIGluc3RlYWRcbiAgICogb2YgY2FwdHVyaW5nIGl0LiBVc2UgZm9yIGxvbmctcnVubmluZyBvciBpbnRlcmFjdGl2ZSBjb21tYW5kcyBzdWNoIGFzIGRldiBzZXJ2ZXJzIGFuZCB3YXRjaCBtb2RlLlxuICAgKiBCZWNhdXNlIHRoZSBvdXRwdXQgaXMgbm90IGNhcHR1cmVkLCB0aGUgcmVzb2x2ZWQgc3Rkb3V0IGlzIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNJbnRlcmFjdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgc3VwcHJlc3NlcyB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1F1aWV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNvbW1hbmQgZmFpbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRmFpbElmQ2FsbGVkRnJvbU91dHNpZGVSb290PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBpZ25vcmVzIHRoZSBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZElnbm9yZUV4aXRDb2RlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYGZhbHNlYCwgb25seSByZXR1cm5zIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVEZXRhaWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gaW5wdXQgdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBzdGRpbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCBvZiB7QGxpbmsgZXhlY30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBBbiBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuIEEgdmFsdWUgb2YgYG51bGxgIGluZGljYXRlcyB0aGF0IHRoZSBwcm9jZXNzIGRpZCBub3QgZXhpdCBub3JtYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHNpZ25hbCB0aGF0IGNhdXNlZCB0aGUgcHJvY2VzcyB0byBiZSB0ZXJtaW5hdGVkLiBBIHZhbHVlIG9mIGBudWxsYCBpbmRpY2F0ZXMgdGhhdCBubyBzaWduYWwgd2FzIHJlY2VpdmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHN0YW5kYXJkIGVycm9yIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhbmRhcmQgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZXhlY30gdGhhdCByZXR1cm4gb25seSBzdGRvdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1NpbXBsZU9wdGlvbnMgZXh0ZW5kcyBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIGBmYWxzZWAgb3Igb21pdHRlZCB0byByZWNlaXZlIG9ubHkgc3Rkb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlscz86IGZhbHNlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleGVjU3RyaW5nfS5cbiAqL1xuaW50ZXJmYWNlIEV4ZWNTdHJpbmdQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgc3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlYyBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9ucz86IEV4ZWNPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYXJndW1lbnQgYXJyYXkgKGlmIGF2YWlsYWJsZSksIHVzZWQgYnkgdGhlIFBvd2VyU2hlbGxcbiAgICogZmFsbGJhY2sgcGF0aCB0byBxdW90ZSBhcmd1bWVudHMgd2l0aCBQb3dlclNoZWxsLW5hdGl2ZSBzaW5nbGUgcXVvdGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3QXJndW1lbnRzPzogc3RyaW5nW107XG59XG4vKipcbiAqIEFwcGVuZHMgYSBzaW5nbGUgYG5vZGVgIENMSSBvcHRpb24gdG8gYSBgTk9ERV9PUFRJT05TYCBzdHJpbmcsIHByZXNlcnZpbmcgYW55IG9wdGlvbnMgYWxyZWFkeSBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSBleGlzdGluZ05vZGVPcHRpb25zIC0gVGhlIGN1cnJlbnQgYE5PREVfT1BUSU9OU2AgdmFsdWUgKGUuZy4gYHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OU2ApLCBpZiBhbnkuXG4gKiBAcGFyYW0gb3B0aW9uIC0gVGhlIGBub2RlYCBDTEkgb3B0aW9uIHRvIGFwcGVuZCAoZS5nLiBgLS1sb2NhbHN0b3JhZ2UtZmlsZT06bWVtb3J5OmApLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIGBOT0RFX09QVElPTlNgIHN0cmluZy4gSWYgYG9wdGlvbmAgaXMgYWxyZWFkeSBwcmVzZW50LCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kTm9kZU9wdGlvbihleGlzdGluZ05vZGVPcHRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQsIG9wdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IChleGlzdGluZ05vZGVPcHRpb25zID8/ICcnKS50cmltKCk7XG4gIGlmICh0cmltbWVkID09PSAnJykge1xuICAgIHJldHVybiBvcHRpb247XG4gIH1cbiAgcmV0dXJuIHRyaW1tZWQuc3BsaXQoL1xccysvKS5pbmNsdWRlcyhvcHRpb24pID8gdHJpbW1lZCA6IGAke3RyaW1tZWR9ICR7b3B0aW9ufWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBlbnZpcm9ubWVudCBmb3IgY2hpbGQgcHJvY2Vzc2VzOiB0aGUgcGFyZW50IGVudmlyb25tZW50IHBsdXMgYERFQlVHX0NPTE9SU2AsIGFuZCDigJQgd2hlblxuICogdGhlIHJ1bm5pbmcgYG5vZGVgIHN1cHBvcnRzIGl0IOKAlCB7QGxpbmsgTE9DQUxfU1RPUkFHRV9OT0RFX09QVElPTn0gYXBwZW5kZWQgdG8gYE5PREVfT1BUSU9OU2AuXG4gKlxuICogVGhlIHN1cHBvcnQgY2hlY2sgZ3VhcmRzIGFnYWluc3Qgb2xkZXIgYG5vZGVgICg8IDIyKTogcGFzc2luZyBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWFcbiAqIGBOT0RFX09QVElPTlNgIG1ha2VzIGl0IGV4aXQgYmVmb3JlIHJ1bm5pbmcsIHdoaWNoIHdvdWxkIGJyZWFrIGV2ZXJ5IHNwYXduZWQgdG9vbC5cbiAqXG4gKiBAcGFyYW0gYmFzZUVudiAtIFRoZSBwYXJlbnQgZW52aXJvbm1lbnQgdG8gZXh0ZW5kICh0eXBpY2FsbHkgYHByb2Nlc3MuZW52YCkuXG4gKiBAcGFyYW0gYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzIC0gVGhlIGBub2RlYCBvcHRpb25zIGFjY2VwdGVkIHZpYSBgTk9ERV9PUFRJT05TYCAodHlwaWNhbGx5IGBwcm9jZXNzLmFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFnc2ApLlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IHRvIHBhc3MgdG8gc3Bhd25lZCBjaGlsZCBwcm9jZXNzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkRW52KGJhc2VFbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBhbGxvd2VkTm9kZUVudmlyb25tZW50RmxhZ3M6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIHJldHVybiB7XG4gICAgREVCVUdfQ09MT1JTOiAnMScsXG4gICAgLi4uYmFzZUVudixcbiAgICAuLi4oYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzLmhhcygnLS1sb2NhbHN0b3JhZ2UtZmlsZScpICYmIHsgTk9ERV9PUFRJT05TOiBhcHBlbmROb2RlT3B0aW9uKGJhc2VFbnZbJ05PREVfT1BUSU9OUyddLCBMT0NBTF9TVE9SQUdFX05PREVfT1BUSU9OKSB9KVxuICB9O1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kLlxuICogQHRocm93cyBJZiB0aGUgY29tbWFuZCBmYWlscyB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgZmFsc2VgLlxuICogICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZSBpbmNsdWRlcyB0aGUgZXhpdCBjb2RlLCB0aGUgY29tbWFuZCwgc3RkZXJyLCBhbmQgc3Rkb3V0IChvciBhIG5vdGUgdGhhdCBpdCB3YXNcbiAqICAgICAgICAgcHJpbnRlZCksIGFuZCBzYXlzIHdoZW4gdGhlIGNoaWxkIGNyYXNoZWQgb3Igd2FzIGtpbGxlZCByYXRoZXIgdGhhbiBleGl0aW5nIG9uIGl0cyBvd24uXG4gKiAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBhbmQgaWdub3JlRXhpdENvZGUgaXMgYHRydWVgLFxuICogICAgICAgICB0aGUgZXJyb3IgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgc3Rkb3V0IGFuZCBzdGRlcnIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjKGNvbW1hbmQ6IENvbW1hbmRQYXJ0W10gfCBzdHJpbmcsIG9wdGlvbnM/OiBFeGVjU2ltcGxlT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPjtcbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIEV4ZWNSZXN1bHQgb2JqZWN0LlxuICogICAgICAgICAgVGhlIEV4ZWNSZXN1bHQgb2JqZWN0IGNvbnRhaW5zIHRoZSBleGl0IGNvZGUsIGV4aXQgc2lnbmFsLCBzdGRlcnIsIGFuZCBzdGRvdXQuXG4gKiBAdGhyb3dzIElmIHRoZSBjb21tYW5kIGZhaWxzIHdpdGggYSBub24temVybyBleGl0IGNvZGUgYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGBmYWxzZWAuXG4gKiAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGl0IGNvZGUsIHRoZSBjb21tYW5kLCBzdGRlcnIsIGFuZCBzdGRvdXQgKG9yIGEgbm90ZSB0aGF0IGl0IHdhc1xuICogICAgICAgICBwcmludGVkKSwgYW5kIHNheXMgd2hlbiB0aGUgY2hpbGQgY3Jhc2hlZCBvciB3YXMga2lsbGVkIHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93bi5cbiAqICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgdHJ1ZWAsXG4gKiAgICAgICAgIHRoZSBlcnJvciBpcyByZXNvbHZlZCB3aXRoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWMoY29tbWFuZDogQ29tbWFuZFBhcnRbXSB8IHN0cmluZywgb3B0aW9uczogRXhlY0RldGFpbGVkT3B0aW9ucyk6IFByb21pc2U8RXhlY1Jlc3VsdD47XG4vKipcbiAqIEV4ZWN1dGVzIGEgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kIG9yIGFuIEV4ZWNSZXN1bHQgb2JqZWN0LlxuICogICAgICAgICAgVGhlIEV4ZWNSZXN1bHQgb2JqZWN0IGNvbnRhaW5zIHRoZSBleGl0IGNvZGUsIGV4aXQgc2lnbmFsLCBzdGRlcnIsIGFuZCBzdGRvdXQuXG4gKiBAdGhyb3dzIElmIHRoZSBjb21tYW5kIGZhaWxzIHdpdGggYSBub24temVybyBleGl0IGNvZGUgYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGBmYWxzZWAuXG4gKiAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGl0IGNvZGUsIHRoZSBjb21tYW5kLCBzdGRlcnIsIGFuZCBzdGRvdXQgKG9yIGEgbm90ZSB0aGF0IGl0IHdhc1xuICogICAgICAgICBwcmludGVkKSwgYW5kIHNheXMgd2hlbiB0aGUgY2hpbGQgY3Jhc2hlZCBvciB3YXMga2lsbGVkIHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93bi5cbiAqICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgdHJ1ZWAsXG4gKiAgICAgICAgIHRoZSBlcnJvciBpcyByZXNvbHZlZCB3aXRoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWMoY29tbWFuZDogQ29tbWFuZFBhcnRbXSB8IHN0cmluZywgb3B0aW9uczogRXhlY09wdGlvbnMgPSB7fSk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShjb21tYW5kKSkge1xuICAgIGNvbnN0IGJhdGNoUmVzdWx0ID0gaGFuZGxlQmF0Y2hlZENvbW1hbmQoY29tbWFuZCwgb3B0aW9ucyk7XG4gICAgaWYgKGJhdGNoUmVzdWx0KSB7XG4gICAgICByZXR1cm4gYmF0Y2hSZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0ICRhcmd1bWVudHMgPSBjb21tYW5kLmZpbHRlcigocGFydCk6IHBhcnQgaXMgc3RyaW5nID0+IHR5cGVvZiBwYXJ0ID09PSAnc3RyaW5nJyk7XG4gICAgY29uc3QgY29tbWFuZExpbmUgPSBidWlsZENvbW1hbmRMaW5lKCRhcmd1bWVudHMpO1xuXG4gICAgY29uc3QgbWF4Q29tbWFuZExlbmd0aCA9IGdldE1heENvbW1hbmRMZW5ndGgoKTtcbiAgICBjb25zdCBlZmZlY3RpdmVMZW5ndGggPSBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChjb21tYW5kTGluZSk7XG4gICAgcmV0dXJuIGVmZmVjdGl2ZUxlbmd0aCA+IG1heENvbW1hbmRMZW5ndGhcbiAgICAgID8gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQ29tbWFuZCBsaW5lIGlzIHRvbyBsb25nICgke1N0cmluZyhlZmZlY3RpdmVMZW5ndGgpfSBjaGFycyBvbmNlIHdyYXBwZWQgZm9yIHRoZSBzaGVsbCwgbWF4ICR7U3RyaW5nKG1heENvbW1hbmRMZW5ndGgpfSBvbiAke3Byb2Nlc3MucGxhdGZvcm19KS4gQ29uc2lkZXIgc3BsaXR0aW5nIGludG8gc21hbGxlciBiYXRjaGVzIG9yIHVzZSBFeGVjQXJnLmBcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgOiBleGVjU3RyaW5nKHtcbiAgICAgICAgY29tbWFuZDogY29tbWFuZExpbmUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHJhd0FyZ3VtZW50czogJGFyZ3VtZW50c1xuICAgICAgfSk7XG4gIH1cblxuICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4Q29tbWFuZExlbmd0aCgpO1xuICBjb25zdCBlZmZlY3RpdmVMZW5ndGggPSBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChjb21tYW5kKTtcbiAgcmV0dXJuIGVmZmVjdGl2ZUxlbmd0aCA+IG1heENvbW1hbmRMZW5ndGhcbiAgICA/IFByb21pc2UucmVqZWN0KFxuICAgICAgbmV3IEVycm9yKFxuICAgICAgICBgQ29tbWFuZCBsaW5lIGlzIHRvbyBsb25nICgke1N0cmluZyhlZmZlY3RpdmVMZW5ndGgpfSBjaGFycyBvbmNlIHdyYXBwZWQgZm9yIHRoZSBzaGVsbCwgbWF4ICR7U3RyaW5nKG1heENvbW1hbmRMZW5ndGgpfSBvbiAke3Byb2Nlc3MucGxhdGZvcm19KS4gQ29uc2lkZXIgc3BsaXR0aW5nIGludG8gc21hbGxlciBiYXRjaGVzIG9yIHVzZSBFeGVjQXJnLmBcbiAgICAgIClcbiAgICApXG4gICAgOiBleGVjU3RyaW5nKHtcbiAgICAgIGNvbW1hbmQsXG4gICAgICBvcHRpb25zXG4gICAgfSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBzaW5nbGUgc3RyaW5nIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBleGVjU3RyaW5nKHBhcmFtczogRXhlY1N0cmluZ1BhcmFtcyk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgY29tbWFuZCxcbiAgICBvcHRpb25zID0ge30sXG4gICAgcmF3QXJndW1lbnRzXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHtcbiAgICBjd2QgPSBwcm9jZXNzLmN3ZCgpLFxuICAgIGVudixcbiAgICBpc0ludGVyYWN0aXZlID0gZmFsc2UsXG4gICAgaXNRdWlldDogcXVpZXQgPSBmYWxzZSxcbiAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogaWdub3JlRXhpdENvZGUgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRGV0YWlscyA9IGZhbHNlLFxuICAgIHN0ZGluID0gJydcbiAgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBnZXRMaWJEZWJ1Z2dlcignRXhlYycpKGBFeGVjdXRpbmcgY29tbWFuZDogJHtjb21tYW5kfWApO1xuXG4gICAgY29uc3QgY2hpbGQgPSBzcGF3blZpYVNoZWxsKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTcGF3blZpYVNoZWxsUGFyYW1zPih7XG4gICAgICBjb21tYW5kLFxuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgaXNJbnRlcmFjdGl2ZSxcbiAgICAgIHJhd0FyZ3VtZW50c1xuICAgIH0pKTtcblxuICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICBsZXQgc3RkZXJyID0gJyc7XG5cbiAgICAvLyBJbiBpbnRlcmFjdGl2ZSBtb2RlIHRoZSBjaGlsZCdzIHN0ZGlvIGlzIGluaGVyaXRlZCBieSB0aGUgdGVybWluYWwsIHNvIHRoZXJlIGFyZSBubyBzdHJlYW1zIHRvIHJlYWQgYW5kIG5vdGhpbmcgaXMgY2FwdHVyZWQuXG4gICAgaWYgKCFpc0ludGVyYWN0aXZlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHN0ZGVycjogY2hpbGRTdGRlcnIsXG4gICAgICAgIHN0ZGluOiBjaGlsZFN0ZGluLFxuICAgICAgICBzdGRvdXQ6IGNoaWxkU3Rkb3V0XG4gICAgICB9ID0gY2hpbGQ7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShjaGlsZFN0ZGluLCAnQ2hpbGQgcHJvY2VzcyBzdGRpbiBpcyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShjaGlsZFN0ZG91dCwgJ0NoaWxkIHByb2Nlc3Mgc3Rkb3V0IGlzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIGFzc2VydE5vbk51bGxhYmxlKGNoaWxkU3RkZXJyLCAnQ2hpbGQgcHJvY2VzcyBzdGRlcnIgaXMgbm90IGF2YWlsYWJsZScpO1xuXG4gICAgICBjaGlsZFN0ZGluLndyaXRlKHN0ZGluKTtcbiAgICAgIGNoaWxkU3RkaW4uZW5kKCk7XG5cbiAgICAgIGNoaWxkU3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgc3Rkb3V0ICs9IGRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRTdGRvdXQub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgc3Rkb3V0ID0gdHJpbUVuZCh7XG4gICAgICAgICAgJHN0cmluZzogc3Rkb3V0LFxuICAgICAgICAgIHN1ZmZpeDogJ1xcbidcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRTdGRlcnIub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICAgIGlmICghcXVpZXQpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBzdGRlcnIgKz0gZGF0YS50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIH0pO1xuXG4gICAgICBjaGlsZFN0ZGVyci5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICBzdGRlcnIgPSB0cmltRW5kKHtcbiAgICAgICAgICAkc3RyaW5nOiBzdGRlcnIsXG4gICAgICAgICAgc3VmZml4OiAnXFxuJ1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoaWxkLm9uKCdjbG9zZScsIChleGl0Q29kZSwgZXhpdFNpZ25hbCkgPT4ge1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFpZ25vcmVFeGl0Q29kZSkge1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKGRlc2NyaWJlRXhpdEZhaWx1cmUoe1xuICAgICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICAgIGV4aXRDb2RlLFxuICAgICAgICAgICAgZXhpdFNpZ25hbCxcbiAgICAgICAgICAgIGlzSW50ZXJhY3RpdmUsXG4gICAgICAgICAgICBpc1F1aWV0OiBxdWlldCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0ZG91dFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghc2hvdWxkSW5jbHVkZURldGFpbHMpIHtcbiAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgZXhpdENvZGUsXG4gICAgICAgIGV4aXRTaWduYWwsXG4gICAgICAgIHN0ZGVycixcbiAgICAgICAgc3Rkb3V0XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgaWYgKCFpZ25vcmVFeGl0Q29kZSkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb3VsZCBub3QgcnVuIGNvbW1hbmQ6ICR7dHJ1bmNhdGVDb21tYW5kKGNvbW1hbmQpfVxcbiR7ZXJyb3IubWVzc2FnZX1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaG91bGRJbmNsdWRlRGV0YWlscykge1xuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIGV4aXRDb2RlOiBudWxsLFxuICAgICAgICBleGl0U2lnbmFsOiBudWxsLFxuICAgICAgICBzdGRlcnIsXG4gICAgICAgIHN0ZG91dFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEEgYG5vZGVgIENMSSBvcHRpb24gKHBhc3NlZCB2aWEgYE5PREVfT1BUSU9OU2ApIHRoYXQgcHJvdmlkZXMgYW4gaW4tbWVtb3J5IGBsb2NhbFN0b3JhZ2VgIHRvIGV2ZXJ5XG4gKiBzcGF3bmVkIGBub2RlYCBwcm9jZXNzLiBOb2RlIDIyKyBleHBvc2VzIGFuIGV4cGVyaW1lbnRhbCBXZWIgU3RvcmFnZSBgbG9jYWxTdG9yYWdlYCwgYnV0IGFjY2Vzc2luZyBpdFxuICogd2l0aG91dCBgLS1sb2NhbHN0b3JhZ2UtZmlsZWAgZW1pdHMgYW4gYEV4cGVyaW1lbnRhbFdhcm5pbmdgIGFuZCBsZWF2ZXMgYGxvY2FsU3RvcmFnZWAgdW5hdmFpbGFibGUuXG4gKiBQb2ludGluZyBpdCBhdCB0aGUgc3BlY2lhbCBgOm1lbW9yeTpgIGRhdGFiYXNlIGdpdmVzIGVhY2ggcHJvY2VzcyBhIHdvcmtpbmcsIG5vbi1wZXJzaXN0ZW50XG4gKiBgbG9jYWxTdG9yYWdlYCAobm8gZmlsZSBvbiBkaXNrLCBubyBzdGF0ZSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMpIOKAlCBtYXRjaGluZyB0aGUgcmVhbCBPYnNpZGlhblxuICogKEVsZWN0cm9uKSBydW50aW1lIGFuZCBzaWxlbmNpbmcgdGhlIHdhcm5pbmcgYnkgYWRkcmVzc2luZyBpdHMgcm9vdCBjYXVzZSByYXRoZXIgdGhhbiBzdXBwcmVzc2luZyBpdC5cbiAqXG4gKiBJdCBpcyBhcHBsaWVkIG9ubHkgd2hlbiB0aGUgcnVubmluZyBgbm9kZWAgYWN0dWFsbHkgc3VwcG9ydHMgaXQgKHNlZSB7QGxpbmsgYnVpbGRDaGlsZEVudn0pOiBwYXNzaW5nXG4gKiBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWEgYE5PREVfT1BUSU9OU2AgbWFrZXMgaXQgcmVmdXNlIHRvIHN0YXJ0LCBzbyBhbiBvbGRlciBgbm9kZWBcbiAqICg8IDIyKSBtdXN0IGJlIGxlZnQgdW50b3VjaGVkLlxuICovXG5jb25zdCBMT0NBTF9TVE9SQUdFX05PREVfT1BUSU9OID0gJy0tbG9jYWxzdG9yYWdlLWZpbGU9Om1lbW9yeTonO1xuXG4vKipcbiAqIFRoZSBsb25nZXN0IGNvbW1hbmQgYSBmYWlsdXJlIG1lc3NhZ2UgcXVvdGVzIGJlZm9yZSB0cnVuY2F0aW5nIGl0LiBBIGJhdGNoZWQgY29tbWFuZCBjYW4gcnVuIHRvIHNldmVyYWxcbiAqIHRob3VzYW5kIGNoYXJhY3RlcnMgb2YgcGF0aHMsIHdoaWNoIHdvdWxkIGJ1cnkgdGhlIG9uZSBsaW5lIG9mIHRoZSBtZXNzYWdlIHRoYXQgc2F5cyB3aGF0IHdlbnQgd3JvbmcuXG4gKi9cbmNvbnN0IE1BWF9DT01NQU5EX0xFTkdUSF9JTl9NRVNTQUdFID0gNTAwO1xuXG4vKipcbiAqIE5hbWVzIG9mIHRoZSBXaW5kb3dzIE5UU1RBVFVTIGNvZGVzIGEgY3Jhc2hlZCBjaGlsZCBtb3N0IG9mdGVuIGV4aXRzIHdpdGgsIGZvciB0aGUgZmFpbHVyZSBtZXNzYWdlLiBBIGNvZGVcbiAqIG91dHNpZGUgdGhpcyBsaXN0IGlzIHN0aWxsIHJlY29nbml6ZWQgYXMgYW4gTlRTVEFUVVMgZmFpbHVyZSAoc2VlIHtAbGluayB0b050U3RhdHVzfSkgYW5kIHNob3duIGluIGhleDsgdGhlXG4gKiBuYW1lIGlzIGEgY291cnRlc3ksIG5vdCB0aGUgY2xhc3NpZmljYXRpb24uXG4gKi9cbmNvbnN0IE5UU1RBVFVTX05BTUVTOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKFtcbiAgWycweEMwMDAwMDA1JywgJ1NUQVRVU19BQ0NFU1NfVklPTEFUSU9OJ10sXG4gIFsnMHhDMDAwMDAxNycsICdTVEFUVVNfTk9fTUVNT1JZJ10sXG4gIFsnMHhDMDAwMDAxRCcsICdTVEFUVVNfSUxMRUdBTF9JTlNUUlVDVElPTiddLFxuICBbJzB4QzAwMDAwOTQnLCAnU1RBVFVTX0lOVEVHRVJfRElWSURFX0JZX1pFUk8nXSxcbiAgWycweEMwMDAwMEZEJywgJ1NUQVRVU19TVEFDS19PVkVSRkxPVyddLFxuICBbJzB4QzAwMDAxMzUnLCAnU1RBVFVTX0RMTF9OT1RfRk9VTkQnXSxcbiAgWycweEMwMDAwMTNBJywgJ1NUQVRVU19DT05UUk9MX0NfRVhJVCddLFxuICBbJzB4QzAwMDAzNzQnLCAnU1RBVFVTX0hFQVBfQ09SUlVQVElPTiddLFxuICBbJzB4QzAwMDA0MDknLCAnU1RBVFVTX1NUQUNLX0JVRkZFUl9PVkVSUlVOJ11cbl0pO1xuXG4vKipcbiAqIENoYXJhY3RlcnMgaGVsZCBiYWNrIGZyb20gdGhlIFdpbmRvd3MgY29tbWFuZC1saW5lIGJ1ZGdldCB3aGVuIHNpemluZyBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSBiYXRjaCwgdG9cbiAqIGNvdmVyIGV4cGFuc2lvbnMgdGhhdCBoYXBwZW4gSU5TSURFIHRoZSBjb21tYW5kIHdlIHNwYXduIGFuZCBhcmUgdGhlcmVmb3JlIGludmlzaWJsZSBmcm9tIGhlcmUuXG4gKlxuICogQSBzaGltbWVkIGA8dG9vbD4gPGFyZ3PigKY+YCBpbnZvY2F0aW9uIGlzIG5vdCBvbmUgYGNtZC5leGVgIGNvbW1hbmQgbGluZSBidXQgYSBjaGFpbiBvZiB0aGVtOiB0aGVcbiAqIGAuYmluLzx0b29sPi5jbWRgIHNoaW0gcmUtZXhwYW5kcyBgJSpgIGludG8gYSBmcmVzaCBgbm9kZSDigKYgPHRvb2w+LWNsaS5qcyA8YXJnc+KApj5gIGxpbmUsIGFuZCBlYWNoIGhvcFxuICogcmUtcXVvdGVzIHdoYXQgaXQgZm9yd2FyZHMuIEV2ZXJ5IG9uZSBvZiB0aG9zZSBsaW5lcyBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIDgxOTEgbGltaXQsIGFuZCBldmVyeSBvbmUgaXNcbiAqIGxvbmdlciB0aGFuIHRoZSBsaW5lIHdlIGFzc2VtYmxlZCDigJQgYnV0IGJ5IGhvdyBtdWNoIGlzIHRoZSBjaGlsZCdzIGJ1c2luZXNzLCBub3Qgb3Vycywgc28gbm8gZm9ybXVsYSBjYW5cbiAqIGJlIHJpZ2h0LiBPbmx5IHRoZSBkZWxpYmVyYXRlIHNsYWNrIGJlbG93IGNhbi5cbiAqXG4gKiBgMjA0OGAgaXMgcm91Z2hseSBkb3VibGUgdGhlIG92ZXJoZWFkIG1lYXN1cmVkIHdoZW4gdGhpcyB3YXMgZm91bmQsIGJhY2sgd2hlbiBldmVyeSB0b29sIHdhc1xuICogYWRkaXRpb25hbGx5IGZyb250ZWQgYnkgYG5weGAgYW5kIHNvIHBhaWQgb25lIG1vcmUgcmUtZXhwYW5zaW9uIGhvcCB0aGFuIGl0IGRvZXMgbm93LiBPdmVyIGEgcmVwb3NpdG9yeSdzXG4gKiAxODcgbWFya2Rvd24gcGF0aHMsIGEgYG1hcmtkb3dubGludC1jbGkyIOKApmAgbGluZSAqKmFzc2VtYmxlZCBhdCA3MDUxIGNoYXJzKiog4oCUIDExNDAgdW5kZXIgdGhlIGxpbWl0IOKAlFxuICogc3RpbGwgZGllZCB3aXRoIGBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nLmA7IHRoZSBzYW1lIHBheWxvYWQgc3BsaXQgaW4gdHdvIHJ1bnMgY2xlYW4uIE5vdGUgdGhlIHRvb2w6XG4gKiB0aGlzIGlzIG5vdCBzcGVjaWZpYyB0byBgbGlua2luYXRvcmAsIGl0IGlzIHRoZSBzaGFwZSBvZiBldmVyeSBzaGltLWZyb250ZWQgaW52b2NhdGlvbi5cbiAqXG4gKiBPdmVyLXJlc2VydmluZyBjb3N0cyBvbmUgZXh0cmEgc2VxdWVudGlhbCBpbnZvY2F0aW9uIG9mIGEgY29tbWFuZCB0aGF0IHdhcyBhbHJlYWR5IGdvaW5nIHRvIGJlIGJhdGNoZWQ7XG4gKiB1bmRlci1yZXNlcnZpbmcgY29zdHMgYSBsaW50IGZhaWx1cmUgdGhhdCBuYW1lcyBub3RoaW5nIHdyb25nIHdpdGggdGhlIGNvbnRlbnQuIFJhaXNlIGl0LCBuZXZlciBsb3dlciBpdCxcbiAqIGlmIHRoZSBzeW1wdG9tIHJldHVybnMuXG4gKi9cbmNvbnN0IFdJTkRPV1NfQ0hJTERfRVhQQU5TSU9OX1JFU0VSVkUgPSAyMDQ4O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBkZXNjcmliZUV4aXRGYWlsdXJlfS5cbiAqL1xuaW50ZXJmYWNlIERlc2NyaWJlRXhpdEZhaWx1cmVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgdGhhdCB3YXMgZXhlY3V0ZWQuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGl0IGNvZGUgdGhlIGNoaWxkIHJlcG9ydGVkLCBvciBgbnVsbGAgd2hlbiBpdCBkaWQgbm90IGV4aXQgb24gaXRzIG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc2lnbmFsIHRoYXQgdGVybWluYXRlZCB0aGUgY2hpbGQsIGlmIGFueS5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2hpbGQncyBzdGRpbyB3YXMgYXR0YWNoZWQgdG8gdGhlIHRlcm1pbmFsLCBzbyBub3RoaW5nIHdhcyBjYXB0dXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzSW50ZXJhY3RpdmU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNoaWxkJ3Mgb3V0cHV0IHdhcyBzdXBwcmVzc2VkLCBzbyB0aGUgdXNlciBoYXMgbm90IHNlZW4gaXQuXG4gICAqL1xuICByZWFkb25seSBpc1F1aWV0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FwdHVyZWQgc3RhbmRhcmQgZXJyb3IuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNhcHR1cmVkIHN0YW5kYXJkIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZG91dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleGVjdXRlQmF0Y2hlc30uXG4gKi9cbmludGVyZmFjZSBFeGVjdXRlQmF0Y2hlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYmFzZSBjb21tYW5kIHdpdGhvdXQgYmF0Y2hlZCBhcmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUNvbW1hbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGJhdGNoZXMgb2YgYXJncy5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZXM6IHN0cmluZ1tdW107XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBFeGVjT3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc3Bhd25WaWFTaGVsbH0uXG4gKi9cbmludGVyZmFjZSBTcGF3blZpYVNoZWxsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kIHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWVyZ2VkIG92ZXIgdGhlIGluaGVyaXRlZCBjaGlsZCBlbnZpcm9ubWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGF0dGFjaGVzIHRoZSBjaGlsZCdzIHN0ZGlvIHRvIHRoZSB0ZXJtaW5hbCBpbnN0ZWFkIG9mIHBpcGluZyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzSW50ZXJhY3RpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYXJndW1lbnQgYXJyYXkgKGlmIGF2YWlsYWJsZSkuXG4gICAqL1xuICByZWFkb25seSByYXdBcmd1bWVudHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBjb21tYW5kLWxpbmUgc3RyaW5nIGZyb20gYW4gYXJndW1lbnQgYXJyYXksIHF1b3RlZCBmb3IgdGhlIHNoZWxsIHRoYXRcbiAqIHtAbGluayBzcGF3blZpYVNoZWxsfSB3aWxsIHJvdXRlIHRocm91Z2ggb24gdGhlIGN1cnJlbnQgcGxhdGZvcm0uXG4gKlxuICogT24gV2luZG93cyB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCB2aWEgYGNtZC5leGVgLCBzbyBpdCB1c2VzIHRoZVxuICogYENvbW1hbmRMaW5lVG9Bcmd2V2AgY29udmVudGlvbiAoe0BsaW5rIHRvQ29tbWFuZExpbmV9KTsge0BsaW5rIHNwYXduVmlhU2hlbGx9XG4gKiB0aGVuIGFwcGxpZXMge0BsaW5rIGNtZEVzY2FwZUNvbW1hbmRMaW5lfSBvbiB0b3AgZm9yIGBjbWQuZXhlYCBtZXRhY2hhcmFjdGVycy5cbiAqIEVsc2V3aGVyZSB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCB2aWEgYHNoIC1jYCwgc28gaXQgdXNlcyBQT1NJWCBzaW5nbGUtcXVvdGVcbiAqIHF1b3RpbmcgKHtAbGluayB0b1Bvc2l4Q29tbWFuZExpbmV9KSBhbmQgbmVlZHMgbm8gZnVydGhlciBlc2NhcGluZy5cbiAqXG4gKiBUaGUgcGxhdGZvcm0gYnJhbmNoIGhlcmUgTVVTVCBzdGF5IGluIHN5bmMgd2l0aCB0aGUgb25lIGluIHtAbGluayBzcGF3blZpYVNoZWxsfS5cbiAqXG4gKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudCBhcnJheSB0byBxdW90ZSBhbmQgam9pbi5cbiAqIEByZXR1cm5zIFRoZSBxdW90ZWQgY29tbWFuZC1saW5lIHN0cmluZyBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0ncyBzaGVsbC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRDb21tYW5kTGluZSgkYXJndW1lbnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gdG9Db21tYW5kTGluZSgkYXJndW1lbnRzKSA6IHRvUG9zaXhDb21tYW5kTGluZSgkYXJndW1lbnRzKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIG1lc3NhZ2UgYSBmYWlsZWQgY29tbWFuZCByZWplY3RzIHdpdGgsIHNheWluZyBub3Qgb25seSBUSEFUIGl0IGZhaWxlZCBidXQgSE9XLlxuICpcbiAqIFRoZSBtZXNzYWdlIHVzZWQgdG8gYmUgYENvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBjb2RlIDxuPmAgcGx1cyBzdGRlcnIsIHdoYXRldmVyIHRoZSBjb2RlLiBTbyBhIGNoaWxkIHRoYXRcbiAqIGNyYXNoZWQgYmVmb3JlIHdyaXRpbmcgYSBieXRlIGFuZCBhIGxpbnRlciB0aGF0IGZvdW5kIHJlYWwgcHJvYmxlbXMgcmVhZCB0aGUgc2FtZSwgZGlmZmVyaW5nIG9ubHkgaW4gYVxuICogbnVtYmVyIG5vYm9keSByZWFkcyBhcyBhIHN0YXR1czogYSBXaW5kb3dzIGFjY2VzcyB2aW9sYXRpb24gYXJyaXZlcyBhcyBgZXhpdCBjb2RlIDMyMjEyMjU0NzdgIHdpdGggbm90aGluZ1xuICogYWZ0ZXIgaXQsIGFuZCB3aG9ldmVyIHJlYWRzIGl0IGdvZXMgbG9va2luZyBmb3IgYSBmaW5kaW5nIHRoYXQgZG9lcyBub3QgZXhpc3QuIFRoaXMgaXMgdGhlIGxhc3QgcG9pbnQgdGhhdFxuICogY2FuIHRlbGwgdGhlIHR3byBhcGFydCDigJQgdGhlIGAuY21kYCBzaGltIGlzIHNwYXduZWQgZGlyZWN0bHksIHNvIHRoZSBjaGlsZCdzIHJhdyBjb2RlIGlzIHZpc2libGUgaGVyZSwgd2hpbGVcbiAqIGFuIGBucG0gcnVuYCBsYXllciBmdXJ0aGVyIG91dCBpcyBrbm93biB0byBsYXVuZGVyIGl0IGludG8gYSBwbGFpbiBgMWAuXG4gKlxuICogVHdvIHNpZ25hbHMgYXJlIHJlYWQsIGFuZCB0aGVpciBjb25qdW5jdGlvbiBpcyB3aGF0IGVhcm5zIHRoZSB3b3JkIFwiY3Jhc2hlZFwiOiB0aGUgdGVybWluYXRpb24gd2FzIGFibm9ybWFsXG4gKiAoYW4gTlRTVEFUVVMgZXJyb3IgY29kZSwgb3IgYSBzaWduYWwpLCBhbmQgbmVpdGhlciBzdHJlYW0gY2FycmllZCBhbnl0aGluZy4gQSB0b29sIGZhaWxpbmcgb24gaXRzIG93biB0ZXJtc1xuICogc2F5cyBzb21ldGhpbmc7IGEgY2hpbGQgdGhhdCBkaWVkIG1pZC1pbnN0cnVjdGlvbiBkb2VzIG5vdC4gVGhlIENBVVNFIG9mIHN1Y2ggYSBjcmFzaCBpcyBub3QgdGhpc1xuICogZnVuY3Rpb24ncyBidXNpbmVzcywgc28gdGhlIG1lc3NhZ2Ugb25seSBuYW1lcyBpdCBhbmQgc2F5cyB3aGF0IHRvIGRvLlxuICpcbiAqIFRoZSBgQ29tbWFuZCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgPG4+YCBwcmVmaXggaXMga2VwdCwgc28gYSBjYWxsZXIgbWF0Y2hpbmcgb24gaXQgc3RpbGwgbWF0Y2hlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZGVzY3JpYmluZyB0aGUgZmFpbGVkIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIFRoZSBmYWlsdXJlIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlRXhpdEZhaWx1cmUocGFyYW1zOiBEZXNjcmliZUV4aXRGYWlsdXJlUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjb21tYW5kLCBleGl0Q29kZSwgZXhpdFNpZ25hbCwgaXNJbnRlcmFjdGl2ZSwgaXNRdWlldCwgc3RkZXJyLCBzdGRvdXQgfSA9IHBhcmFtcztcbiAgY29uc3QgbnRTdGF0dXMgPSB0b050U3RhdHVzKGV4aXRDb2RlKTtcblxuICBsZXQgc3RhdHVzID0gYGV4aXQgY29kZSAke2V4aXRDb2RlID09PSBudWxsID8gJyhudWxsKScgOiBTdHJpbmcoZXhpdENvZGUpfWA7XG4gIGxldCBhYm5vcm1hbFJlYXNvbjogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIGlmIChudFN0YXR1cyAhPT0gbnVsbCkge1xuICAgIGNvbnN0IEhFWF9SQURJWCA9IDE2O1xuICAgIGNvbnN0IGhleCA9IGAweCR7bnRTdGF0dXMudG9TdHJpbmcoSEVYX1JBRElYKS50b1VwcGVyQ2FzZSgpfWA7XG4gICAgY29uc3QgbmFtZSA9IE5UU1RBVFVTX05BTUVTLmdldChoZXgpO1xuICAgIHN0YXR1cyArPSBgIChOVFNUQVRVUyAke25hbWUgPyBgJHtoZXh9ICR7bmFtZX1gIDogaGV4fSlgO1xuICAgIGFibm9ybWFsUmVhc29uID0gbmFtZSA9PT0gJ1NUQVRVU19DT05UUk9MX0NfRVhJVCcgPyAnd2FzIGludGVycnVwdGVkJyA6ICdjcmFzaGVkJztcbiAgfSBlbHNlIGlmIChleGl0U2lnbmFsICE9PSBudWxsKSB7XG4gICAgc3RhdHVzICs9IGAsIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICR7ZXhpdFNpZ25hbH1gO1xuICAgIGFibm9ybWFsUmVhc29uID0gYHdhcyBraWxsZWQgYnkgJHtleGl0U2lnbmFsfWA7XG4gIH1cblxuICBjb25zdCBsaW5lcyA9IFtgQ29tbWFuZCBmYWlsZWQgd2l0aCAke3N0YXR1c31gLCBgQ29tbWFuZDogJHt0cnVuY2F0ZUNvbW1hbmQoY29tbWFuZCl9YF07XG5cbiAgaWYgKGFibm9ybWFsUmVhc29uICE9PSBudWxsKSB7XG4gICAgbGluZXMucHVzaChcbiAgICAgICFpc0ludGVyYWN0aXZlICYmIHN0ZG91dCA9PT0gJycgJiYgc3RkZXJyID09PSAnJ1xuICAgICAgICA/IGBUaGUgY2hpbGQgcHJvY2VzcyAke2Fibm9ybWFsUmVhc29ufSBiZWZvcmUgd3JpdGluZyBhbnl0aGluZyB0byBzdGRvdXQgb3Igc3RkZXJyLiBUaGlzIGlzIG5vdCBhIGZhaWx1cmUgdGhlIHRvb2wgcmVwb3J0ZWQgKG5vdCBhIGxpbnQgZmluZGluZywgbm90IGEgdHlwZSBlcnJvcik6IHJlLXJ1biB0aGUgY29tbWFuZC5gXG4gICAgICAgIDogYFRoZSBjaGlsZCBwcm9jZXNzICR7YWJub3JtYWxSZWFzb259IHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93biwgc28gYW55IG91dHB1dCBpdCB3cm90ZSBtYXkgYmUgaW5jb21wbGV0ZS5gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChzdGRvdXQgIT09ICcnKSB7XG4gICAgbGluZXMucHVzaChpc1F1aWV0ID8gYHN0ZG91dDpcXG4ke3N0ZG91dH1gIDogYHN0ZG91dDogJHtTdHJpbmcoc3Rkb3V0LnNwbGl0KCdcXG4nKS5sZW5ndGgpfSBsaW5lKHMpLCBwcmludGVkIGFib3ZlLmApO1xuICB9XG5cbiAgaWYgKHN0ZGVyciAhPT0gJycpIHtcbiAgICBsaW5lcy5wdXNoKGBzdGRlcnI6XFxuJHtzdGRlcnJ9YCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYmF0Y2hlZCBjb21tYW5kcyBzZXF1ZW50aWFsbHkgYW5kIGNvbmNhdGVuYXRlcyB0aGVpciBvdXRwdXQuXG4gKlxuICogYGV4ZWNTdHJpbmdgIHJldHVybnMgYSBgc3RyaW5nYCBvciBhbiB7QGxpbmsgRXhlY1Jlc3VsdH0gZGVwZW5kaW5nIG9uIGBvcHRpb25zLnNob3VsZEluY2x1ZGVEZXRhaWxzYCwgc29cbiAqIGJvdGggc2hhcGVzIGFyZSB1bnBhY2tlZCDigJQgcmVhZGluZyBvbmx5IHRoZSBgc3RyaW5nYCBvbmUgc2lsZW50bHkgdGhyZXcgYXdheSBldmVyeSBiYXRjaCdzIG91dHB1dCBpblxuICogZXhhY3RseSB0aGUgbW9kZSB0aGF0IGFza2VkIGZvciBpdC5cbiAqXG4gKiBBIGJhdGNoIHRoYXQgZXhpdHMgbm9uLXplcm8gbm9ybWFsbHkgcmVqZWN0czsgaXQgb25seSByZWFjaGVzIGhlcmUgd2hlbiBgc2hvdWxkSWdub3JlRXhpdENvZGVgIGFza2VkIGZvclxuICogaXQgdG8gYmUgcmVwb3J0ZWQgaW5zdGVhZC4gVGhlIGZpcnN0IHN1Y2ggZmFpbHVyZSBpcyB3aGF0IHRoZSBhZ2dyZWdhdGUgcmVwb3J0cywgc28gc3BsaXR0aW5nIGEgY29tbWFuZFxuICogaW50byBiYXRjaGVzIGNhbm5vdCB0dXJuIGEgZmFpbHVyZSBpbnRvIGEgc3VjY2VzcyDigJQgZXhjZXB0IHRoYXQgYW4gYWJub3JtYWwgdGVybWluYXRpb24gKGEgY3Jhc2gsIGFcbiAqIHNpZ25hbCkgaW4gYSBsYXRlciBiYXRjaCBvdXRyYW5rcyBhbiBvcmRpbmFyeSBmYWlsdXJlIGluIGFuIGVhcmxpZXIgb25lLiBPdGhlcndpc2UgYSBjcmFzaCBpbiBiYXRjaCAyIGFmdGVyXG4gKiByZWFsIGZpbmRpbmdzIGluIGJhdGNoIDEgd291bGQgYWdncmVnYXRlIHRvIHRoZSBmaW5kaW5ncycgZXhpdCBjb2RlLCBhbmQgYSBjYWxsZXIgY2xhc3NpZnlpbmcgdGhlIHJlc3VsdFxuICogd291bGQgbmV2ZXIgbGVhcm4gdGhhdCBwYXJ0IG9mIHRoZSBpbnB1dCB3YXMgbm90IGNoZWNrZWQgYXQgYWxsLlxuICpcbiAqIFNpbGVudCBiYXRjaGVzIGNvbnRyaWJ1dGUgbm90aGluZyB0byB0aGUgam9pbmVkIG91dHB1dC4gYGV4ZWNTdHJpbmdgIGFscmVhZHkgdHJpbXMgZWFjaCByZXN1bHQncyB0cmFpbGluZ1xuICogbmV3bGluZSwgc28gam9pbmluZyBlbXB0eSBvbmVzIGJhY2sgaW4gd291bGQgcmVpbnRyb2R1Y2UgZXhhY3RseSB0aGUgYmxhbmstbGluZSBub2lzZSBpdCByZW1vdmVkIOKAlCBhXG4gKiBjb21tYW5kIHRoYXQgcHJpbnRlZCBub3RoaW5nIG11c3QgYWdncmVnYXRlIHRvIGAnJ2AsIG5vdCB0byBhIHJ1biBvZiBuZXdsaW5lcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBiYXRjaGVkIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNvbmNhdGVuYXRlZCByZXN1bHQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVCYXRjaGVzKHBhcmFtczogRXhlY3V0ZUJhdGNoZXNQYXJhbXMpOiBQcm9taXNlPEV4ZWNSZXN1bHQgfCBzdHJpbmc+IHtcbiAgY29uc3QgeyBiYXNlQ29tbWFuZCwgYmF0Y2hlcywgb3B0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBzdGRvdXRQYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc3RkZXJyUGFydHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBmYWlsdXJlOiBFeGVjUmVzdWx0IHwgbnVsbCA9IG51bGw7XG5cbiAgZm9yIChjb25zdCBiYXRjaCBvZiBiYXRjaGVzKSB7XG4gICAgY29uc3QgYmF0Y2hDb21tYW5kID0gYCR7YmFzZUNvbW1hbmR9ICR7YnVpbGRDb21tYW5kTGluZShiYXRjaCl9YDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjU3RyaW5nKHtcbiAgICAgIGNvbW1hbmQ6IGJhdGNoQ29tbWFuZCxcbiAgICAgIG9wdGlvbnNcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHB1c2hJZk5vdEVtcHR5KHN0ZG91dFBhcnRzLCByZXN1bHQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcHVzaElmTm90RW1wdHkoc3Rkb3V0UGFydHMsIHJlc3VsdC5zdGRvdXQpO1xuICAgIHB1c2hJZk5vdEVtcHR5KHN0ZGVyclBhcnRzLCByZXN1bHQuc3RkZXJyKTtcbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwICYmIChmYWlsdXJlID09PSBudWxsIHx8ICghaXNBYm5vcm1hbFRlcm1pbmF0aW9uKGZhaWx1cmUpICYmIGlzQWJub3JtYWxUZXJtaW5hdGlvbihyZXN1bHQpKSkpIHtcbiAgICAgIGZhaWx1cmUgPSByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnMuc2hvdWxkSW5jbHVkZURldGFpbHNcbiAgICA/IHtcbiAgICAgIC8vIE5vdCBgZmFpbHVyZT8uZXhpdENvZGUgPz8gMGA6IGEgYmF0Y2gga2lsbGVkIGJ5IGEgc2lnbmFsIGhhcyBhIGBudWxsYCBjb2RlLCB3aGljaCBgPz9gIHdvdWxkIHJlcG9ydCBhcyBzdWNjZXNzLlxuICAgICAgZXhpdENvZGU6IGZhaWx1cmUgPT09IG51bGwgPyAwIDogZmFpbHVyZS5leGl0Q29kZSxcbiAgICAgIGV4aXRTaWduYWw6IGZhaWx1cmU/LmV4aXRTaWduYWwgPz8gbnVsbCxcbiAgICAgIHN0ZGVycjogc3RkZXJyUGFydHMuam9pbignXFxuJyksXG4gICAgICBzdGRvdXQ6IHN0ZG91dFBhcnRzLmpvaW4oJ1xcbicpXG4gICAgfVxuICAgIDogc3Rkb3V0UGFydHMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcGFzc2VkIHRvIGNoaWxkIHByb2Nlc3NlcywgcmVzb2x2ZWQgYXQgc3Bhd24gdGltZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbm90IGEgbW9kdWxlLWxldmVsIGNvbnN0YW50LiBgLmVudmAgaXMgbG9hZGVkIGJ5IGBsb2FkRW52RmlsZUlmRXhpc3RzYCBmcm9tIGluc2lkZVxuICogYHdyYXBDbGlUYXNrYCwgYW5kIEVTTSBldmFsdWF0ZXMgZXZlcnkgaW1wb3J0IGJlZm9yZSB0aGUgZW50cnkgbW9kdWxlJ3MgZmlyc3Qgc3RhdGVtZW50IOKAlCBzbyBhXG4gKiBzbmFwc2hvdCB0YWtlbiBoZXJlIHdvdWxkIGFsd2F5cyBwcmVkYXRlIHRoZSBsb2FkLCBhbmQgZXZlcnkgc3Bhd25lZCBjaGlsZCB3b3VsZCBydW4gd2l0aG91dCB0aGVcbiAqIHJlcG8ncyBvd24gYC5lbnZgLiBOb3RoaW5nIHN1cmZhY2VkIHRoYXQgd2hpbGUgVml0ZXN0IDMgY29waWVkIHRoZSBgLmVudmAgaXQgbG9hZGVkIGludG8gdGhlXG4gKiB3b3JrZXIncyBgcHJvY2Vzcy5lbnZgOyBWaXRlc3QgNCB3cml0ZXMgdGhvc2UgdG8gYGltcG9ydC5tZXRhLmVudmAgb25seSwgbGVhdmluZyB0aGlzIHRoZSBzb2xlXG4gKiBwYXRoIGFuZCBhbiBlbXB0eSBvbmUuXG4gKlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IHRvIHBhc3MgdG8gc3Bhd25lZCBjaGlsZCBwcm9jZXNzZXMsIHJlZmxlY3RpbmcgYHByb2Nlc3MuZW52YCBhcyBpdCBzdGFuZHMgbm93LlxuICovXG5mdW5jdGlvbiBnZXRDaGlsZEVudigpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIHJldHVybiBidWlsZENoaWxkRW52KHByb2Nlc3MuZW52LCBwcm9jZXNzLmFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFncyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGxpbmUgYXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBhY3R1YWxseSBzZWUgaXQsIHdoaWNoIG9uIFdpbmRvd3MgaXNcbiAqIE5PVCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgcGFzc2VkIGluLlxuICpcbiAqIHtAbGluayBzcGF3blZpYVNoZWxsfSByb3V0ZXMgdGhlIGNvbW1hbmQgdGhyb3VnaCBgY21kLmV4ZWAsIGFuZCB0d28gdGhpbmdzIGFyZSBzcGVudCBiZXR3ZWVuIGhlcmUgYW5kXG4gKiB0aGVyZSwgbmVpdGhlciBvZiB0aGVtIHZpc2libGUgaW4gdGhlIGFzc2VtYmxlZCBjb21tYW5kOlxuICogLSBOb2RlJ3MgYHNwYXduKOKApiwgeyBzaGVsbDogdHJ1ZSB9KWAgd3JhcHMgaXQgYXMgYDxjb21zcGVjPiAvZCAvcyAvYyBcIjxjb21tYW5kPlwiYC5cbiAqIC0ge0BsaW5rIGNtZEVzY2FwZUNvbW1hbmRMaW5lfSBgXmAtZXNjYXBlcyBldmVyeSBvbmUgb2YgYGNtZC5leGVgJ3MgbWV0YWNoYXJhY3RlcnMsIHdoaWNoIG9uIGEgbGlzdCBvZlxuICogICBxdW90ZWQgcGF0aHMgaXMgYSBmZXcgcGVyY2VudCBvZiB0aGUgd2hvbGUgKG1lYXN1cmVkOiArMjM2IGNoYXJzIG9uIGEgNzIxNi1jaGFyIGludm9jYXRpb24pLlxuICpcbiAqIEJvdGggYXJlIG91cnMgdG8gY29tcHV0ZSwgc28gdGhleSBhcmUgY29tcHV0ZWQgcmF0aGVyIHRoYW4gZ3Vlc3NlZC4gV2hhdCBpcyBOT1QgY29tcHV0YWJsZSBmcm9tIGhlcmUgaXNcbiAqIHdoYXQgdGhlIHNwYXduZWQgY29tbWFuZCBkb2VzIHRvIGl0cyBvd24gYXJndW1lbnRzIOKAlCBzZWUge0BsaW5rIFdJTkRPV1NfQ0hJTERfRVhQQU5TSU9OX1JFU0VSVkV9LlxuICpcbiAqIFRoZSBwbGF0Zm9ybSBicmFuY2ggaGVyZSBNVVNUIHN0YXkgaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4ge0BsaW5rIHNwYXduVmlhU2hlbGx9LlxuICpcbiAqIEBwYXJhbSBjb21tYW5kTGluZSAtIFRoZSBhc3NlbWJsZWQgY29tbWFuZCBsaW5lLCBiZWZvcmUgYW55IHNoZWxsIHdyYXBwaW5nLlxuICogQHJldHVybnMgVGhlIGxlbmd0aCBpbiBjaGFyYWN0ZXJzIG9mIHdoYXQgcmVhY2hlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbS5cbiAqL1xuZnVuY3Rpb24gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoY29tbWFuZExpbmU6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGNvbW1hbmRMaW5lLmxlbmd0aDtcbiAgfVxuXG4gIGNvbnN0IGNvbXNwZWMgPSBwcm9jZXNzLmVudlsnY29tc3BlYyddID8/ICdjbWQuZXhlJztcbiAgY29uc3QgQ01EX1dSQVBQRVIgPSAnIC9kIC9zIC9jIFwiXCInO1xuICByZXR1cm4gY29tc3BlYy5sZW5ndGggKyBDTURfV1JBUFBFUi5sZW5ndGggKyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUoY29tbWFuZExpbmUpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXggY29tbWFuZCBsaW5lIGxlbmd0aCB0byBzaXplIGFuIHtAbGluayBFeGVjQXJndW1lbnR9IGJhdGNoIGFnYWluc3Qg4oCUIHRoZSBwbGF0Zm9ybSBtYXhpbXVtXG4gKiBsZXNzIHtAbGluayBXSU5ET1dTX0NISUxEX0VYUEFOU0lPTl9SRVNFUlZFfS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbW9yZSBjb25zZXJ2YXRpdmUgdGhhbiB7QGxpbmsgZ2V0TWF4Q29tbWFuZExlbmd0aH0sIGJlY2F1c2UgdGhlIHR3byBhbnN3ZXIgZGlmZmVyZW50XG4gKiBxdWVzdGlvbnMuIEV4Y2VlZGluZyB0aGUgcGxhaW4tY29tbWFuZCBsaW1pdCBpcyBhIGhhcmQgZmFpbHVyZSB0aGUgY2FsbGVyIGNhbm5vdCBhdm9pZCwgc28gdGhhdCBjaGVja1xuICogc3RheXMgZXhhY3QuIEV4Y2VlZGluZyB0aGUgYmF0Y2hpbmcgbGltaXQgb25seSBjb3N0cyBvbmUgZXh0cmEgaW52b2NhdGlvbiwgc28gdGhhdCBjaGVjayBtYXkg4oCUIGFuZFxuICogc2hvdWxkIOKAlCBsZWF2ZSByb29tIHRvIHNwYXJlLlxuICpcbiAqIEByZXR1cm5zIFRoZSBtYXggbGVuZ3RoIGluIGNoYXJhY3RlcnMgYXZhaWxhYmxlIHRvIGEgc2luZ2xlIGJhdGNoLlxuICovXG5mdW5jdGlvbiBnZXRNYXhCYXRjaENvbW1hbmRMZW5ndGgoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldE1heENvbW1hbmRMZW5ndGgoKSAtIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gV0lORE9XU19DSElMRF9FWFBBTlNJT05fUkVTRVJWRSA6IDApO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIG1heCBjb21tYW5kIGxpbmUgbGVuZ3RoLlxuICpcbiAqIEByZXR1cm5zIFRoZSBtYXggY29tbWFuZCBsZW5ndGggaW4gY2hhcmFjdGVycy5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF4Q29tbWFuZExlbmd0aCgpOiBudW1iZXIge1xuICBjb25zdCBXSU5ET1dTX01BWF9DT01NQU5EX0xFTkdUSCA9IDgxOTE7XG4gIGNvbnN0IFVOSVhfTUFYX0NPTU1BTkRfTEVOR1RIID0gMTMxXzA3MjtcbiAgcmV0dXJuIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBXSU5ET1dTX01BWF9DT01NQU5EX0xFTkdUSCA6IFVOSVhfTUFYX0NPTU1BTkRfTEVOR1RIO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgYSBjb21tYW5kIGFycmF5IHRoYXQgbWF5IGNvbnRhaW4gYW4ge0BsaW5rIEV4ZWNBcmd1bWVudH0uXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSBpZiBiYXRjaGluZyBpcyBuZWVkZWQsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBjb21tYW5kXG4gKiBoYXMgbm8gRXhlY0FyZyBhbmQgc2hvdWxkIGJlIHByb2Nlc3NlZCBub3JtYWxseS5cbiAqXG4gKiBAcGFyYW0gcGFydHMgLSBUaGUgY29tbWFuZCBwYXJ0cy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGV4ZWMgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSBpZiBiYXRjaGluZyBpcyBoYW5kbGVkLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlQmF0Y2hlZENvbW1hbmQocGFydHM6IENvbW1hbmRQYXJ0W10sIG9wdGlvbnM6IEV4ZWNPcHRpb25zKTogUHJvbWlzZTxFeGVjUmVzdWx0IHwgc3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGV4ZWNBcmd1bWVudHMgPSBwYXJ0cy5maWx0ZXIoaXNFeGVjQXJndW1lbnQpO1xuICBpZiAoZXhlY0FyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChleGVjQXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdPbmx5IG9uZSBFeGVjQXJnIHdpdGggYmF0Y2hlZEFyZ3VtZW50cyBpcyBhbGxvd2VkIHBlciBjb21tYW5kJykpO1xuICB9XG5cbiAgY29uc3QgZXhlY0FyZ3VtZW50ID0gZXhlY0FyZ3VtZW50c1swXTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUoZXhlY0FyZ3VtZW50KTtcbiAgY29uc3Qgc3RhdGljUGFydHMgPSBwYXJ0cy5maWx0ZXIoKHBhcnQpOiBwYXJ0IGlzIHN0cmluZyA9PiB0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycpO1xuICBjb25zdCBiYXNlQ29tbWFuZCA9IGJ1aWxkQ29tbWFuZExpbmUoc3RhdGljUGFydHMpO1xuICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RoKCk7XG5cbiAgLy8gVHJ5IGV4cGFuZGluZyBhbGwgYXJncyBpbmxpbmVcbiAgY29uc3QgZnVsbENvbW1hbmQgPSBgJHtiYXNlQ29tbWFuZH0gJHtidWlsZENvbW1hbmRMaW5lKFsuLi5leGVjQXJndW1lbnQuYmF0Y2hlZEFyZ3VtZW50c10pfWA7XG4gIGlmIChnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChmdWxsQ29tbWFuZCkgPD0gbWF4Q29tbWFuZExlbmd0aCkge1xuICAgIHJldHVybiBleGVjU3RyaW5nKHtcbiAgICAgIGNvbW1hbmQ6IGZ1bGxDb21tYW5kLFxuICAgICAgb3B0aW9uc1xuICAgIH0pO1xuICB9XG5cbiAgLy8gU3BsaXQgaW50byBiYXRjaGVzXG4gIGNvbnN0IGJhdGNoZXM6IHN0cmluZ1tdW10gPSBbXTtcbiAgbGV0IGN1cnJlbnRCYXRjaDogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGFyZ3VtZW50IG9mIGV4ZWNBcmd1bWVudC5iYXRjaGVkQXJndW1lbnRzKSB7XG4gICAgY29uc3QgdGVudGF0aXZlID0gYCR7YmFzZUNvbW1hbmR9ICR7YnVpbGRDb21tYW5kTGluZShbLi4uY3VycmVudEJhdGNoLCBhcmd1bWVudF0pfWA7XG4gICAgaWYgKGdldEVmZmVjdGl2ZUNvbW1hbmRMaW5lTGVuZ3RoKHRlbnRhdGl2ZSkgPiBtYXhDb21tYW5kTGVuZ3RoKSB7XG4gICAgICBpZiAoY3VycmVudEJhdGNoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBzcGxpdCBjb21tYW5kIGludG8gYmF0Y2hlczogYSBzaW5nbGUgYXJndW1lbnQgKCR7U3RyaW5nKGFyZ3VtZW50Lmxlbmd0aCl9IGNoYXJzKSBwbHVzIHRoZSBiYXNlIGNvbW1hbmQgKCR7U3RyaW5nKGJhc2VDb21tYW5kLmxlbmd0aCl9IGNoYXJzKSBleGNlZWRzIHRoZSBtYXggYmF0Y2ggY29tbWFuZCBsZW5ndGggKCR7U3RyaW5nKG1heENvbW1hbmRMZW5ndGgpfSkuYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJhdGNoZXMucHVzaChjdXJyZW50QmF0Y2gpO1xuICAgICAgY3VycmVudEJhdGNoID0gW2FyZ3VtZW50XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudEJhdGNoLnB1c2goYXJndW1lbnQpO1xuICAgIH1cbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWx3YXlzIHRydWUgYWZ0ZXIgdGhlIGxvb3A7IGJhdGNoZWRBcmd1bWVudHMgaXMgbm9uLWVtcHR5IGF0IHRoaXMgcG9pbnQuICovXG4gIGlmIChjdXJyZW50QmF0Y2gubGVuZ3RoID4gMCkge1xuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgYmF0Y2hlcy5wdXNoKGN1cnJlbnRCYXRjaCk7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZUJhdGNoZXMoe1xuICAgIGJhc2VDb21tYW5kLFxuICAgIGJhdGNoZXMsXG4gICAgb3B0aW9uc1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHJlc3VsdCByZWNvcmRzIGFuIGFibm9ybWFsIHRlcm1pbmF0aW9uIOKAlCBhbiBOVFNUQVRVUyBlcnJvciBjb2RlIG9yIGEgc2lnbmFsIOKAlCByYXRoZXIgdGhhblxuICogdGhlIGNoaWxkIGV4aXRpbmcgb24gaXRzIG93biB3aXRoIGEgY29kZSBvZiBpdHMgY2hvb3NpbmcuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBjaGlsZCB0ZXJtaW5hdGVkIGFibm9ybWFsbHkuXG4gKi9cbmZ1bmN0aW9uIGlzQWJub3JtYWxUZXJtaW5hdGlvbihyZXN1bHQ6IEV4ZWNSZXN1bHQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlc3VsdC5leGl0U2lnbmFsICE9PSBudWxsIHx8IHRvTnRTdGF0dXMocmVzdWx0LmV4aXRDb2RlKSAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBjb21tYW5kIHBhcnQgaXMgYW4ge0BsaW5rIEV4ZWNBcmd1bWVudH0uXG4gKlxuICogQHBhcmFtIHBhcnQgLSBUaGUgY29tbWFuZCBwYXJ0IHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcGFydCBpcyBhbiBFeGVjQXJnLlxuICovXG5mdW5jdGlvbiBpc0V4ZWNBcmd1bWVudChwYXJ0OiBDb21tYW5kUGFydCk6IHBhcnQgaXMgRXhlY0FyZ3VtZW50IHtcbiAgcmV0dXJuIHR5cGVvZiBwYXJ0ID09PSAnb2JqZWN0JyAmJiAnYmF0Y2hlZEFyZ3VtZW50cycgaW4gcGFydDtcbn1cblxuLyoqXG4gKiBBcHBlbmRzIGEgYmF0Y2gncyBjYXB0dXJlZCBvdXRwdXQgdG8gdGhlIGFjY3VtdWxhdG9yLCBza2lwcGluZyBhbiBlbXB0eSBvbmUgc28gdGhlIGV2ZW50dWFsIGpvaW4gZG9lcyBub3RcbiAqIGZhYnJpY2F0ZSBibGFuayBsaW5lcyBmb3IgYmF0Y2hlcyB0aGF0IHByaW50ZWQgbm90aGluZy5cbiAqXG4gKiBAcGFyYW0gYWNjdW11bGF0b3IgLSBUaGUgY29sbGVjdGVkIG91dHB1dHMgc28gZmFyLlxuICogQHBhcmFtIG91dHB1dCAtIFRoZSBvdXRwdXQgb2YgYSBzaW5nbGUgYmF0Y2guXG4gKi9cbmZ1bmN0aW9uIHB1c2hJZk5vdEVtcHR5KGFjY3VtdWxhdG9yOiBzdHJpbmdbXSwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKG91dHB1dCAhPT0gJycpIHtcbiAgICBhY2N1bXVsYXRvci5wdXNoKG91dHB1dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIHZpYSB0aGUgYXBwcm9wcmlhdGUgc2hlbGwuXG4gKlxuICogT24gV2luZG93cywgaWYgdGhlIGNvbW1hbmQgY29udGFpbnMgbmV3bGluZXMgKHdoaWNoIGBjbWQuZXhlYCBjYW5ub3QgaGFuZGxlKVxuICogYW5kIHRoZSByYXcgYXJncyBhcnJheSBpcyBhdmFpbGFibGUsIHNwYXducyB0aGUgcHJvY2VzcyBkaXJlY3RseSB3aXRob3V0XG4gKiBhbnkgc2hlbGwg4oCUIHBhc3NpbmcgYXJncyB2aWEgYENyZWF0ZVByb2Nlc3NgLCB3aGljaCBhdm9pZHMgYWxsIHF1b3RpbmcgaXNzdWVzLlxuICpcbiAqIE9uIFdpbmRvd3MgKGNtZC5leGUgcGF0aCksIGFwcGxpZXMgYF5gLWVzY2FwaW5nIGZvciBjbWQgbWV0YWNoYXJhY3RlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBzcGF3bmluZyB0aGUgY2hpbGQgcHJvY2Vzcy5cbiAqIEByZXR1cm5zIFRoZSBzcGF3bmVkIGNoaWxkIHByb2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIHNwYXduVmlhU2hlbGwocGFyYW1zOiBTcGF3blZpYVNoZWxsUGFyYW1zKTogQ2hpbGRQcm9jZXNzIHtcbiAgY29uc3QgeyBjb21tYW5kLCBjd2QsIGVudjogZXh0cmFFbnYsIGlzSW50ZXJhY3RpdmUgPSBmYWxzZSwgcmF3QXJndW1lbnRzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7XG4gICAgLi4uZ2V0Q2hpbGRFbnYoKSxcbiAgICAuLi5leHRyYUVudlxuICB9O1xuICBjb25zdCBzdGRpbzogJ2luaGVyaXQnIHwgJ3BpcGUnID0gaXNJbnRlcmFjdGl2ZSA/ICdpbmhlcml0JyA6ICdwaXBlJztcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgJiYgY29tbWFuZC5pbmNsdWRlcygnXFxuJykpIHtcbiAgICBpZiAoIXJhd0FyZ3VtZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21tYW5kcyBjb250YWluaW5nIG5ld2xpbmVzIGNhbm5vdCBiZSBleGVjdXRlZCB0aHJvdWdoIGNtZC5leGUgb24gV2luZG93cy4gUGFzcyBhbiBhcmd1bWVudCBhcnJheSBpbnN0ZWFkIG9mIGEgc3RyaW5nLicpO1xuICAgIH1cbiAgICBjb25zdCBbcHJvZ3JhbSwgLi4uJGFyZ3VtZW50c10gPSByYXdBcmd1bWVudHM7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUocHJvZ3JhbSwgJ0NvbW1hbmQgYXJyYXkgbXVzdCBub3QgYmUgZW1wdHknKTtcbiAgICByZXR1cm4gc3Bhd24ocHJvZ3JhbSwgJGFyZ3VtZW50cywge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgc3RkaW9cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHNoZWxsQ29tbWFuZCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUoY29tbWFuZCkgOiBjb21tYW5kO1xuICByZXR1cm4gc3Bhd24oc2hlbGxDb21tYW5kLCBbXSwge1xuICAgIGN3ZCxcbiAgICBlbnYsXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW9cbiAgfSk7XG59XG5cbi8qKlxuICogUmVhZHMgYW4gZXhpdCBjb2RlIGFzIGEgV2luZG93cyBOVFNUQVRVUyBlcnJvciwgaWYgaXQgaXMgb25lLlxuICpcbiAqIEEgY3Jhc2hlZCBwcm9jZXNzIG9uIFdpbmRvd3MgZXhpdHMgd2l0aCB0aGUgTlRTVEFUVVMgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IGtpbGxlZCBpdCwgYW5kIGEgYC5jbWRgIHNoaW1cbiAqIGZvcndhcmRzIGl0cyBpbm5lciBwcm9jZXNzJ3MgY29kZSwgc28gYSBjcmFzaGVkIGBub2RlLmV4ZWAgYXJyaXZlcyBoZXJlIGludGFjdCDigJQgYDB4QzAwMDAwMDVgIGFzXG4gKiBgMzIyMTIyNTQ3N2AuIFRoZSB0ZXN0IGlzIHRoZSBOVFNUQVRVUyBsYXlvdXQgcmF0aGVyIHRoYW4gYSBiYXJlIGA+PSAweEMwMDAwMDAwYDogdGhlIHRvcCB0d28gYml0cyBhcmUgdGhlXG4gKiBlcnJvciBzZXZlcml0eSBhbmQgdGhlIG5leHQgb25lIGlzIHRoZSBjdXN0b21lciBmbGFnLCB3aGljaCBtdXN0IGJlIGNsZWFyLiBUaGF0IGtlZXBzIG91dCB0d28gY29kZXMgYSBiYXJlXG4gKiByYW5nZSB3b3VsZCBtaXNyZWFkIOKAlCBgcHJvY2Vzcy5leGl0KC0xKWAsIHdoaWNoIFdpbmRvd3MgcmVwb3J0cyBhcyBgMHhGRkZGRkZGRmAsIGFuZCB0aGUgYDB4RTA2RDczNjNgIG9mIGFuXG4gKiB1bmhhbmRsZWQgQysrIGV4Y2VwdGlvbiwgd2hpY2ggaXMgYSBjcmFzaCBidXQgbm90IGFuIE5UU1RBVFVTLiBBIHNpZ25lZCByZWFkaW5nIG9mIHRoZSBzYW1lIGNvZGUgaXMgYWNjZXB0ZWRcbiAqIHRvby4gTm8gbGludGVyLCBjb21waWxlciBvciB0ZXN0IHJ1bm5lciByZXR1cm5zIGEgY29kZSBvZiB0aGlzIHNoYXBlIGFzIGEgY291bnQgb2YgZmluZGluZ3MuXG4gKlxuICogQHBhcmFtIGV4aXRDb2RlIC0gVGhlIGV4aXQgY29kZSB0aGUgY2hpbGQgcmVwb3J0ZWQuXG4gKiBAcmV0dXJucyBUaGUgY29kZSBhcyBhbiB1bnNpZ25lZCBOVFNUQVRVUywgb3IgYG51bGxgIHdoZW4gaXQgaXMgbm90IGFuIE5UU1RBVFVTIGVycm9yLlxuICovXG5mdW5jdGlvbiB0b050U3RhdHVzKGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyKTogbnVsbCB8IG51bWJlciB7XG4gIGlmIChleGl0Q29kZSA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIoZXhpdENvZGUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBFcnJvciBzZXZlcml0eSAodG9wIHR3byBiaXRzIHNldCkgd2l0aCB0aGUgY3VzdG9tZXIgYml0IGNsZWFyIGlzIGV4YWN0bHkgdGhlIHJhbmdlIFsweEMwMDAwMDAwLCAweEUwMDAwMDAwKS5cbiAgY29uc3QgTlRTVEFUVVNfRVJST1JfU1RBUlQgPSAweEMwXzAwXzAwXzAwO1xuICBjb25zdCBOVFNUQVRVU19FUlJPUl9FTkQgPSAweEUwXzAwXzAwXzAwO1xuICBjb25zdCBVSU5UMzJfUkFOR0UgPSAweDFfMDBfMDBfMDBfMDA7XG4gIGNvbnN0IHVuc2lnbmVkID0gZXhpdENvZGUgPCAwID8gZXhpdENvZGUgKyBVSU5UMzJfUkFOR0UgOiBleGl0Q29kZTtcbiAgcmV0dXJuIHVuc2lnbmVkID49IE5UU1RBVFVTX0VSUk9SX1NUQVJUICYmIHVuc2lnbmVkIDwgTlRTVEFUVVNfRVJST1JfRU5EID8gdW5zaWduZWQgOiBudWxsO1xufVxuXG4vKipcbiAqIFNob3J0ZW5zIGEgY29tbWFuZCBmb3IgcXVvdGluZyBpbiBhbiBlcnJvciBtZXNzYWdlLCBrZWVwaW5nIGl0cyBzdGFydCwgd2hpY2ggbmFtZXMgdGhlIHByb2dyYW0uXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBzaG9ydGVuLlxuICogQHJldHVybnMgVGhlIGNvbW1hbmQsIGN1dCB0byB7QGxpbmsgTUFYX0NPTU1BTkRfTEVOR1RIX0lOX01FU1NBR0V9IGNoYXJhY3RlcnMgcGx1cyBhbiBlbGxpcHNpcyB3aGVuIGxvbmdlci5cbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVDb21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb21tYW5kLmxlbmd0aCA+IE1BWF9DT01NQU5EX0xFTkdUSF9JTl9NRVNTQUdFID8gYCR7Y29tbWFuZC5zbGljZSgwLCBNQVhfQ09NTUFORF9MRU5HVEhfSU5fTUVTU0FHRSl94oCmYCA6IGNvbW1hbmQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUUEsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyxlQUFlO0FBQ3hCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsYUFBYTtBQUN0QixPQUFPLGFBQWE7QUFFcEI7QUFBQSxFQUNFLHdCQUF3QjtBQUFBLEVBQ3hCO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUEwSkEsU0FBUyxpQkFBaUIscUJBQXlDLFFBQXdCO0FBQ2hHLFFBQU0sV0FBVyx1QkFBdUIsSUFBSSxLQUFLO0FBQ2pELE1BQUksWUFBWSxJQUFJO0FBQ2xCLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxRQUFRLE1BQU0sS0FBSyxFQUFFLFNBQVMsTUFBTSxJQUFJLFVBQVUsR0FBRyxPQUFPLElBQUksTUFBTTtBQUMvRTtBQWFPLFNBQVMsY0FBYyxTQUE0Qiw2QkFBcUU7QUFDN0gsU0FBTztBQUFBLElBQ0wsY0FBYztBQUFBLElBQ2QsR0FBRztBQUFBLElBQ0gsR0FBSSw0QkFBNEIsSUFBSSxxQkFBcUIsS0FBSyxFQUFFLGNBQWMsaUJBQWlCLFFBQVEsY0FBYyxHQUFHLHlCQUF5QixFQUFFO0FBQUEsRUFDcko7QUFDRjtBQTBDTyxTQUFTLEtBQUssU0FBaUMsVUFBdUIsQ0FBQyxHQUFpQztBQUM3RyxNQUFJLE1BQU0sUUFBUSxPQUFPLEdBQUc7QUFDMUIsVUFBTSxjQUFjLHFCQUFxQixT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
|
|
403
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgZXhlY3V0aW5nIGNvbW1hbmRzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGVidWcnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyB0cmltRW5kIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0cmluZyc7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQge1xuICBjbWRFc2NhcGVDb21tYW5kTGluZSBhcyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUsXG4gIHRvQ29tbWFuZExpbmUsXG4gIHRvUG9zaXhDb21tYW5kTGluZVxufSBmcm9tICcuL2NsaS11dGlscy50cyc7XG5cbi8qKlxuICogQSBjb21tYW5kIHBhcnQ6IGVpdGhlciBhIHBsYWluIHN0cmluZyBvciBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSB3aXRoIGJhdGNoZWQgYXJndW1lbnRzLlxuICovXG5leHBvcnQgdHlwZSBDb21tYW5kUGFydCA9IEV4ZWNBcmd1bWVudCB8IHN0cmluZztcblxuLyoqXG4gKiBBIGNvbW1hbmQgYXJndW1lbnQgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgYXJncyB0byBiZSBiYXRjaGVkLlxuICogSWYgdGhlIGV4cGFuZGVkIGNvbW1hbmQgZXhjZWVkcyB0aGUgcGxhdGZvcm0ncyBtYXggY29tbWFuZCBsZW5ndGgsXG4gKiB0aGUgYmF0Y2hlZCBhcmdzIGFyZSBzcGxpdCBpbnRvIHNlcXVlbnRpYWwgZXhlY3V0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjQXJndW1lbnQge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0byBiYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZWRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBleGVjfSB0aGF0IHJldHVybiBkZXRhaWxlZCByZXN1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNEZXRhaWxlZE9wdGlvbnMgZXh0ZW5kcyBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIGB0cnVlYCB0byByZWNlaXZlIGRldGFpbGVkIHJlc3VsdHMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlsczogdHJ1ZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBleGVjdXRpbmcgYSBjb21tYW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgY3VycmVudCB3b3JraW5nIGZvbGRlciBmb3IgdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY3dkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MsIG1lcmdlZCBvdmVyIHRoZSBpbmhlcml0ZWQgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB7fWBcbiAgICovXG4gIHJlYWRvbmx5IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGF0dGFjaGVzIHRoZSBjaGlsZCBwcm9jZXNzJ3Mgc3RkaW8gZGlyZWN0bHkgdG8gdGhlIHRlcm1pbmFsIChgc3RkaW86ICdpbmhlcml0J2ApIGluc3RlYWRcbiAgICogb2YgY2FwdHVyaW5nIGl0LiBVc2UgZm9yIGxvbmctcnVubmluZyBvciBpbnRlcmFjdGl2ZSBjb21tYW5kcyBzdWNoIGFzIGRldiBzZXJ2ZXJzIGFuZCB3YXRjaCBtb2RlLlxuICAgKiBCZWNhdXNlIHRoZSBvdXRwdXQgaXMgbm90IGNhcHR1cmVkLCB0aGUgcmVzb2x2ZWQgc3Rkb3V0IGlzIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNJbnRlcmFjdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgc3VwcHJlc3NlcyB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1F1aWV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNvbW1hbmQgZmFpbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRmFpbElmQ2FsbGVkRnJvbU91dHNpZGVSb290PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBpZ25vcmVzIHRoZSBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZElnbm9yZUV4aXRDb2RlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYGZhbHNlYCwgb25seSByZXR1cm5zIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVEZXRhaWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gaW5wdXQgdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBzdGRpbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCBvZiB7QGxpbmsgZXhlY30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBBbiBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuIEEgdmFsdWUgb2YgYG51bGxgIGluZGljYXRlcyB0aGF0IHRoZSBwcm9jZXNzIGRpZCBub3QgZXhpdCBub3JtYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHNpZ25hbCB0aGF0IGNhdXNlZCB0aGUgcHJvY2VzcyB0byBiZSB0ZXJtaW5hdGVkLiBBIHZhbHVlIG9mIGBudWxsYCBpbmRpY2F0ZXMgdGhhdCBubyBzaWduYWwgd2FzIHJlY2VpdmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHN0YW5kYXJkIGVycm9yIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhbmRhcmQgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZXhlY30gdGhhdCByZXR1cm4gb25seSBzdGRvdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1NpbXBsZU9wdGlvbnMgZXh0ZW5kcyBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIGBmYWxzZWAgb3Igb21pdHRlZCB0byByZWNlaXZlIG9ubHkgc3Rkb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlscz86IGZhbHNlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleGVjU3RyaW5nfS5cbiAqL1xuaW50ZXJmYWNlIEV4ZWNTdHJpbmdQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgc3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlYyBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9ucz86IEV4ZWNPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYXJndW1lbnQgYXJyYXkgKGlmIGF2YWlsYWJsZSksIHVzZWQgYnkgdGhlIFBvd2VyU2hlbGxcbiAgICogZmFsbGJhY2sgcGF0aCB0byBxdW90ZSBhcmd1bWVudHMgd2l0aCBQb3dlclNoZWxsLW5hdGl2ZSBzaW5nbGUgcXVvdGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3QXJndW1lbnRzPzogc3RyaW5nW107XG59XG4vKipcbiAqIEFwcGVuZHMgYSBzaW5nbGUgYG5vZGVgIENMSSBvcHRpb24gdG8gYSBgTk9ERV9PUFRJT05TYCBzdHJpbmcsIHByZXNlcnZpbmcgYW55IG9wdGlvbnMgYWxyZWFkeSBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSBleGlzdGluZ05vZGVPcHRpb25zIC0gVGhlIGN1cnJlbnQgYE5PREVfT1BUSU9OU2AgdmFsdWUgKGUuZy4gYHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OU2ApLCBpZiBhbnkuXG4gKiBAcGFyYW0gb3B0aW9uIC0gVGhlIGBub2RlYCBDTEkgb3B0aW9uIHRvIGFwcGVuZCAoZS5nLiBgLS1sb2NhbHN0b3JhZ2UtZmlsZT06bWVtb3J5OmApLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIGBOT0RFX09QVElPTlNgIHN0cmluZy4gSWYgYG9wdGlvbmAgaXMgYWxyZWFkeSBwcmVzZW50LCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kTm9kZU9wdGlvbihleGlzdGluZ05vZGVPcHRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQsIG9wdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IChleGlzdGluZ05vZGVPcHRpb25zID8/ICcnKS50cmltKCk7XG4gIGlmICh0cmltbWVkID09PSAnJykge1xuICAgIHJldHVybiBvcHRpb247XG4gIH1cbiAgcmV0dXJuIHRyaW1tZWQuc3BsaXQoL1xccysvKS5pbmNsdWRlcyhvcHRpb24pID8gdHJpbW1lZCA6IGAke3RyaW1tZWR9ICR7b3B0aW9ufWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBlbnZpcm9ubWVudCBmb3IgY2hpbGQgcHJvY2Vzc2VzOiB0aGUgcGFyZW50IGVudmlyb25tZW50IHBsdXMgYERFQlVHX0NPTE9SU2AsIGFuZCDigJQgd2hlblxuICogdGhlIHJ1bm5pbmcgYG5vZGVgIHN1cHBvcnRzIGl0IOKAlCB7QGxpbmsgTE9DQUxfU1RPUkFHRV9OT0RFX09QVElPTn0gYXBwZW5kZWQgdG8gYE5PREVfT1BUSU9OU2AuXG4gKlxuICogVGhlIHN1cHBvcnQgY2hlY2sgZ3VhcmRzIGFnYWluc3Qgb2xkZXIgYG5vZGVgICg8IDIyKTogcGFzc2luZyBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWFcbiAqIGBOT0RFX09QVElPTlNgIG1ha2VzIGl0IGV4aXQgYmVmb3JlIHJ1bm5pbmcsIHdoaWNoIHdvdWxkIGJyZWFrIGV2ZXJ5IHNwYXduZWQgdG9vbC5cbiAqXG4gKiBAcGFyYW0gYmFzZUVudiAtIFRoZSBwYXJlbnQgZW52aXJvbm1lbnQgdG8gZXh0ZW5kICh0eXBpY2FsbHkgYHByb2Nlc3MuZW52YCkuXG4gKiBAcGFyYW0gYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzIC0gVGhlIGBub2RlYCBvcHRpb25zIGFjY2VwdGVkIHZpYSBgTk9ERV9PUFRJT05TYCAodHlwaWNhbGx5IGBwcm9jZXNzLmFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFnc2ApLlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IHRvIHBhc3MgdG8gc3Bhd25lZCBjaGlsZCBwcm9jZXNzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkRW52KGJhc2VFbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBhbGxvd2VkTm9kZUVudmlyb25tZW50RmxhZ3M6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIHJldHVybiB7XG4gICAgREVCVUdfQ09MT1JTOiAnMScsXG4gICAgLi4uYmFzZUVudixcbiAgICAuLi4oYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzLmhhcygnLS1sb2NhbHN0b3JhZ2UtZmlsZScpICYmIHsgTk9ERV9PUFRJT05TOiBhcHBlbmROb2RlT3B0aW9uKGJhc2VFbnZbJ05PREVfT1BUSU9OUyddLCBMT0NBTF9TVE9SQUdFX05PREVfT1BUSU9OKSB9KVxuICB9O1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kLlxuICogQHRocm93cyBJZiB0aGUgY29tbWFuZCBmYWlscyB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgZmFsc2VgLlxuICogICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZSBpbmNsdWRlcyB0aGUgZXhpdCBjb2RlLCB0aGUgY29tbWFuZCwgc3RkZXJyLCBhbmQgc3Rkb3V0IChvciBhIG5vdGUgdGhhdCBpdCB3YXNcbiAqICAgICAgICAgcHJpbnRlZCksIGFuZCBzYXlzIHdoZW4gdGhlIGNoaWxkIGNyYXNoZWQgb3Igd2FzIGtpbGxlZCByYXRoZXIgdGhhbiBleGl0aW5nIG9uIGl0cyBvd24uXG4gKiAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBhbmQgaWdub3JlRXhpdENvZGUgaXMgYHRydWVgLFxuICogICAgICAgICB0aGUgZXJyb3IgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgc3Rkb3V0IGFuZCBzdGRlcnIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjKGNvbW1hbmQ6IENvbW1hbmRQYXJ0W10gfCBzdHJpbmcsIG9wdGlvbnM/OiBFeGVjU2ltcGxlT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPjtcbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIEV4ZWNSZXN1bHQgb2JqZWN0LlxuICogICAgICAgICAgVGhlIEV4ZWNSZXN1bHQgb2JqZWN0IGNvbnRhaW5zIHRoZSBleGl0IGNvZGUsIGV4aXQgc2lnbmFsLCBzdGRlcnIsIGFuZCBzdGRvdXQuXG4gKiBAdGhyb3dzIElmIHRoZSBjb21tYW5kIGZhaWxzIHdpdGggYSBub24temVybyBleGl0IGNvZGUgYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGBmYWxzZWAuXG4gKiAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGl0IGNvZGUsIHRoZSBjb21tYW5kLCBzdGRlcnIsIGFuZCBzdGRvdXQgKG9yIGEgbm90ZSB0aGF0IGl0IHdhc1xuICogICAgICAgICBwcmludGVkKSwgYW5kIHNheXMgd2hlbiB0aGUgY2hpbGQgY3Jhc2hlZCBvciB3YXMga2lsbGVkIHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93bi5cbiAqICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgdHJ1ZWAsXG4gKiAgICAgICAgIHRoZSBlcnJvciBpcyByZXNvbHZlZCB3aXRoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWMoY29tbWFuZDogQ29tbWFuZFBhcnRbXSB8IHN0cmluZywgb3B0aW9uczogRXhlY0RldGFpbGVkT3B0aW9ucyk6IFByb21pc2U8RXhlY1Jlc3VsdD47XG4vKipcbiAqIEV4ZWN1dGVzIGEgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kIG9yIGFuIEV4ZWNSZXN1bHQgb2JqZWN0LlxuICogICAgICAgICAgVGhlIEV4ZWNSZXN1bHQgb2JqZWN0IGNvbnRhaW5zIHRoZSBleGl0IGNvZGUsIGV4aXQgc2lnbmFsLCBzdGRlcnIsIGFuZCBzdGRvdXQuXG4gKiBAdGhyb3dzIElmIHRoZSBjb21tYW5kIGZhaWxzIHdpdGggYSBub24temVybyBleGl0IGNvZGUgYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGBmYWxzZWAuXG4gKiAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGl0IGNvZGUsIHRoZSBjb21tYW5kLCBzdGRlcnIsIGFuZCBzdGRvdXQgKG9yIGEgbm90ZSB0aGF0IGl0IHdhc1xuICogICAgICAgICBwcmludGVkKSwgYW5kIHNheXMgd2hlbiB0aGUgY2hpbGQgY3Jhc2hlZCBvciB3YXMga2lsbGVkIHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93bi5cbiAqICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgdHJ1ZWAsXG4gKiAgICAgICAgIHRoZSBlcnJvciBpcyByZXNvbHZlZCB3aXRoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWMoY29tbWFuZDogQ29tbWFuZFBhcnRbXSB8IHN0cmluZywgb3B0aW9uczogRXhlY09wdGlvbnMgPSB7fSk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShjb21tYW5kKSkge1xuICAgIGNvbnN0IGJhdGNoUmVzdWx0ID0gaGFuZGxlQmF0Y2hlZENvbW1hbmQoY29tbWFuZCwgb3B0aW9ucyk7XG4gICAgaWYgKGJhdGNoUmVzdWx0KSB7XG4gICAgICByZXR1cm4gYmF0Y2hSZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0ICRhcmd1bWVudHMgPSBjb21tYW5kLmZpbHRlcigocGFydCk6IHBhcnQgaXMgc3RyaW5nID0+IHR5cGVvZiBwYXJ0ID09PSAnc3RyaW5nJyk7XG4gICAgY29uc3QgY29tbWFuZExpbmUgPSBidWlsZENvbW1hbmRMaW5lKCRhcmd1bWVudHMpO1xuXG4gICAgY29uc3QgbWF4Q29tbWFuZExlbmd0aCA9IGdldE1heENvbW1hbmRMZW5ndGgoKTtcbiAgICBjb25zdCBlZmZlY3RpdmVMZW5ndGggPSBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChjb21tYW5kTGluZSk7XG4gICAgcmV0dXJuIGVmZmVjdGl2ZUxlbmd0aCA+IG1heENvbW1hbmRMZW5ndGhcbiAgICAgID8gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQ29tbWFuZCBsaW5lIGlzIHRvbyBsb25nICgke1N0cmluZyhlZmZlY3RpdmVMZW5ndGgpfSBjaGFycyBvbmNlIHdyYXBwZWQgZm9yIHRoZSBzaGVsbCwgbWF4ICR7U3RyaW5nKG1heENvbW1hbmRMZW5ndGgpfSBvbiAke3Byb2Nlc3MucGxhdGZvcm19KS4gQ29uc2lkZXIgc3BsaXR0aW5nIGludG8gc21hbGxlciBiYXRjaGVzIG9yIHVzZSBFeGVjQXJnLmBcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgOiBleGVjU3RyaW5nKHtcbiAgICAgICAgY29tbWFuZDogY29tbWFuZExpbmUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHJhd0FyZ3VtZW50czogJGFyZ3VtZW50c1xuICAgICAgfSk7XG4gIH1cblxuICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4Q29tbWFuZExlbmd0aCgpO1xuICBjb25zdCBlZmZlY3RpdmVMZW5ndGggPSBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChjb21tYW5kKTtcbiAgcmV0dXJuIGVmZmVjdGl2ZUxlbmd0aCA+IG1heENvbW1hbmRMZW5ndGhcbiAgICA/IFByb21pc2UucmVqZWN0KFxuICAgICAgbmV3IEVycm9yKFxuICAgICAgICBgQ29tbWFuZCBsaW5lIGlzIHRvbyBsb25nICgke1N0cmluZyhlZmZlY3RpdmVMZW5ndGgpfSBjaGFycyBvbmNlIHdyYXBwZWQgZm9yIHRoZSBzaGVsbCwgbWF4ICR7U3RyaW5nKG1heENvbW1hbmRMZW5ndGgpfSBvbiAke3Byb2Nlc3MucGxhdGZvcm19KS4gQ29uc2lkZXIgc3BsaXR0aW5nIGludG8gc21hbGxlciBiYXRjaGVzIG9yIHVzZSBFeGVjQXJnLmBcbiAgICAgIClcbiAgICApXG4gICAgOiBleGVjU3RyaW5nKHtcbiAgICAgIGNvbW1hbmQsXG4gICAgICBvcHRpb25zXG4gICAgfSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBzaW5nbGUgc3RyaW5nIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBleGVjU3RyaW5nKHBhcmFtczogRXhlY1N0cmluZ1BhcmFtcyk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgY29tbWFuZCxcbiAgICBvcHRpb25zID0ge30sXG4gICAgcmF3QXJndW1lbnRzXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHtcbiAgICBjd2QgPSBwcm9jZXNzLmN3ZCgpLFxuICAgIGVudixcbiAgICBpc0ludGVyYWN0aXZlID0gZmFsc2UsXG4gICAgaXNRdWlldDogcXVpZXQgPSBmYWxzZSxcbiAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogaWdub3JlRXhpdENvZGUgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRGV0YWlscyA9IGZhbHNlLFxuICAgIHN0ZGluID0gJydcbiAgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBnZXRMaWJEZWJ1Z2dlcignRXhlYycpKGBFeGVjdXRpbmcgY29tbWFuZDogJHtjb21tYW5kfWApO1xuXG4gICAgY29uc3QgY2hpbGQgPSBzcGF3blZpYVNoZWxsKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTcGF3blZpYVNoZWxsUGFyYW1zPih7XG4gICAgICBjb21tYW5kLFxuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgaXNJbnRlcmFjdGl2ZSxcbiAgICAgIHJhd0FyZ3VtZW50c1xuICAgIH0pKTtcblxuICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICBsZXQgc3RkZXJyID0gJyc7XG5cbiAgICAvLyBJbiBpbnRlcmFjdGl2ZSBtb2RlIHRoZSBjaGlsZCdzIHN0ZGlvIGlzIGluaGVyaXRlZCBieSB0aGUgdGVybWluYWwsIHNvIHRoZXJlIGFyZSBubyBzdHJlYW1zIHRvIHJlYWQgYW5kIG5vdGhpbmcgaXMgY2FwdHVyZWQuXG4gICAgaWYgKCFpc0ludGVyYWN0aXZlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHN0ZGVycjogY2hpbGRTdGRlcnIsXG4gICAgICAgIHN0ZGluOiBjaGlsZFN0ZGluLFxuICAgICAgICBzdGRvdXQ6IGNoaWxkU3Rkb3V0XG4gICAgICB9ID0gY2hpbGQ7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShjaGlsZFN0ZGluLCAnQ2hpbGQgcHJvY2VzcyBzdGRpbiBpcyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShjaGlsZFN0ZG91dCwgJ0NoaWxkIHByb2Nlc3Mgc3Rkb3V0IGlzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIGFzc2VydE5vbk51bGxhYmxlKGNoaWxkU3RkZXJyLCAnQ2hpbGQgcHJvY2VzcyBzdGRlcnIgaXMgbm90IGF2YWlsYWJsZScpO1xuXG4gICAgICBjaGlsZFN0ZGluLndyaXRlKHN0ZGluKTtcbiAgICAgIGNoaWxkU3RkaW4uZW5kKCk7XG5cbiAgICAgIGNoaWxkU3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgc3Rkb3V0ICs9IGRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRTdGRvdXQub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgc3Rkb3V0ID0gdHJpbUVuZCh7XG4gICAgICAgICAgJHN0cmluZzogc3Rkb3V0LFxuICAgICAgICAgIHN1ZmZpeDogJ1xcbidcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRTdGRlcnIub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICAgIGlmICghcXVpZXQpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBzdGRlcnIgKz0gZGF0YS50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIH0pO1xuXG4gICAgICBjaGlsZFN0ZGVyci5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICBzdGRlcnIgPSB0cmltRW5kKHtcbiAgICAgICAgICAkc3RyaW5nOiBzdGRlcnIsXG4gICAgICAgICAgc3VmZml4OiAnXFxuJ1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoaWxkLm9uKCdjbG9zZScsIChleGl0Q29kZSwgZXhpdFNpZ25hbCkgPT4ge1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFpZ25vcmVFeGl0Q29kZSkge1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKGRlc2NyaWJlRXhpdEZhaWx1cmUoe1xuICAgICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICAgIGV4aXRDb2RlLFxuICAgICAgICAgICAgZXhpdFNpZ25hbCxcbiAgICAgICAgICAgIGlzSW50ZXJhY3RpdmUsXG4gICAgICAgICAgICBpc1F1aWV0OiBxdWlldCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0ZG91dFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghc2hvdWxkSW5jbHVkZURldGFpbHMpIHtcbiAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgZXhpdENvZGUsXG4gICAgICAgIGV4aXRTaWduYWwsXG4gICAgICAgIHN0ZGVycixcbiAgICAgICAgc3Rkb3V0XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgaWYgKCFpZ25vcmVFeGl0Q29kZSkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb3VsZCBub3QgcnVuIGNvbW1hbmQ6ICR7dHJ1bmNhdGVDb21tYW5kKGNvbW1hbmQpfVxcbiR7ZXJyb3IubWVzc2FnZX1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaG91bGRJbmNsdWRlRGV0YWlscykge1xuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIGV4aXRDb2RlOiBudWxsLFxuICAgICAgICBleGl0U2lnbmFsOiBudWxsLFxuICAgICAgICBzdGRlcnIsXG4gICAgICAgIHN0ZG91dFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEEgYG5vZGVgIENMSSBvcHRpb24gKHBhc3NlZCB2aWEgYE5PREVfT1BUSU9OU2ApIHRoYXQgcHJvdmlkZXMgYW4gaW4tbWVtb3J5IGBsb2NhbFN0b3JhZ2VgIHRvIGV2ZXJ5XG4gKiBzcGF3bmVkIGBub2RlYCBwcm9jZXNzLiBOb2RlIDIyKyBleHBvc2VzIGFuIGV4cGVyaW1lbnRhbCBXZWIgU3RvcmFnZSBgbG9jYWxTdG9yYWdlYCwgYnV0IGFjY2Vzc2luZyBpdFxuICogd2l0aG91dCBgLS1sb2NhbHN0b3JhZ2UtZmlsZWAgZW1pdHMgYW4gYEV4cGVyaW1lbnRhbFdhcm5pbmdgIGFuZCBsZWF2ZXMgYGxvY2FsU3RvcmFnZWAgdW5hdmFpbGFibGUuXG4gKiBQb2ludGluZyBpdCBhdCB0aGUgc3BlY2lhbCBgOm1lbW9yeTpgIGRhdGFiYXNlIGdpdmVzIGVhY2ggcHJvY2VzcyBhIHdvcmtpbmcsIG5vbi1wZXJzaXN0ZW50XG4gKiBgbG9jYWxTdG9yYWdlYCAobm8gZmlsZSBvbiBkaXNrLCBubyBzdGF0ZSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMpIOKAlCBtYXRjaGluZyB0aGUgcmVhbCBPYnNpZGlhblxuICogKEVsZWN0cm9uKSBydW50aW1lIGFuZCBzaWxlbmNpbmcgdGhlIHdhcm5pbmcgYnkgYWRkcmVzc2luZyBpdHMgcm9vdCBjYXVzZSByYXRoZXIgdGhhbiBzdXBwcmVzc2luZyBpdC5cbiAqXG4gKiBJdCBpcyBhcHBsaWVkIG9ubHkgd2hlbiB0aGUgcnVubmluZyBgbm9kZWAgYWN0dWFsbHkgc3VwcG9ydHMgaXQgKHNlZSB7QGxpbmsgYnVpbGRDaGlsZEVudn0pOiBwYXNzaW5nXG4gKiBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWEgYE5PREVfT1BUSU9OU2AgbWFrZXMgaXQgcmVmdXNlIHRvIHN0YXJ0LCBzbyBhbiBvbGRlciBgbm9kZWBcbiAqICg8IDIyKSBtdXN0IGJlIGxlZnQgdW50b3VjaGVkLlxuICovXG5jb25zdCBMT0NBTF9TVE9SQUdFX05PREVfT1BUSU9OID0gJy0tbG9jYWxzdG9yYWdlLWZpbGU9Om1lbW9yeTonO1xuXG4vKipcbiAqIFRoZSBsb25nZXN0IGNvbW1hbmQgYSBmYWlsdXJlIG1lc3NhZ2UgcXVvdGVzIGJlZm9yZSB0cnVuY2F0aW5nIGl0LiBBIGJhdGNoZWQgY29tbWFuZCBjYW4gcnVuIHRvIHNldmVyYWxcbiAqIHRob3VzYW5kIGNoYXJhY3RlcnMgb2YgcGF0aHMsIHdoaWNoIHdvdWxkIGJ1cnkgdGhlIG9uZSBsaW5lIG9mIHRoZSBtZXNzYWdlIHRoYXQgc2F5cyB3aGF0IHdlbnQgd3JvbmcuXG4gKi9cbmNvbnN0IE1BWF9DT01NQU5EX0xFTkdUSF9JTl9NRVNTQUdFID0gNTAwO1xuXG4vKipcbiAqIE5hbWVzIG9mIHRoZSBXaW5kb3dzIE5UU1RBVFVTIGNvZGVzIGEgY3Jhc2hlZCBjaGlsZCBtb3N0IG9mdGVuIGV4aXRzIHdpdGgsIGZvciB0aGUgZmFpbHVyZSBtZXNzYWdlLiBBIGNvZGVcbiAqIG91dHNpZGUgdGhpcyBsaXN0IGlzIHN0aWxsIHJlY29nbml6ZWQgYXMgYW4gTlRTVEFUVVMgZmFpbHVyZSAoc2VlIHtAbGluayB0b050U3RhdHVzfSkgYW5kIHNob3duIGluIGhleDsgdGhlXG4gKiBuYW1lIGlzIGEgY291cnRlc3ksIG5vdCB0aGUgY2xhc3NpZmljYXRpb24uXG4gKi9cbmNvbnN0IE5UU1RBVFVTX05BTUVTOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKFtcbiAgWycweEMwMDAwMDA1JywgJ1NUQVRVU19BQ0NFU1NfVklPTEFUSU9OJ10sXG4gIFsnMHhDMDAwMDAxNycsICdTVEFUVVNfTk9fTUVNT1JZJ10sXG4gIFsnMHhDMDAwMDAxRCcsICdTVEFUVVNfSUxMRUdBTF9JTlNUUlVDVElPTiddLFxuICBbJzB4QzAwMDAwOTQnLCAnU1RBVFVTX0lOVEVHRVJfRElWSURFX0JZX1pFUk8nXSxcbiAgWycweEMwMDAwMEZEJywgJ1NUQVRVU19TVEFDS19PVkVSRkxPVyddLFxuICBbJzB4QzAwMDAxMzUnLCAnU1RBVFVTX0RMTF9OT1RfRk9VTkQnXSxcbiAgWycweEMwMDAwMTNBJywgJ1NUQVRVU19DT05UUk9MX0NfRVhJVCddLFxuICBbJzB4QzAwMDAzNzQnLCAnU1RBVFVTX0hFQVBfQ09SUlVQVElPTiddLFxuICBbJzB4QzAwMDA0MDknLCAnU1RBVFVTX1NUQUNLX0JVRkZFUl9PVkVSUlVOJ11cbl0pO1xuXG4vKipcbiAqIENoYXJhY3RlcnMgaGVsZCBiYWNrIGZyb20gdGhlIFdpbmRvd3MgY29tbWFuZC1saW5lIGJ1ZGdldCB3aGVuIHNpemluZyBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSBiYXRjaCwgdG9cbiAqIGNvdmVyIGV4cGFuc2lvbnMgdGhhdCBoYXBwZW4gSU5TSURFIHRoZSBjb21tYW5kIHdlIHNwYXduIGFuZCBhcmUgdGhlcmVmb3JlIGludmlzaWJsZSBmcm9tIGhlcmUuXG4gKlxuICogQSBzaGltbWVkIGA8dG9vbD4gPGFyZ3PigKY+YCBpbnZvY2F0aW9uIGlzIG5vdCBvbmUgYGNtZC5leGVgIGNvbW1hbmQgbGluZSBidXQgYSBjaGFpbiBvZiB0aGVtOiB0aGVcbiAqIGAuYmluLzx0b29sPi5jbWRgIHNoaW0gcmUtZXhwYW5kcyBgJSpgIGludG8gYSBmcmVzaCBgbm9kZSDigKYgPHRvb2w+LWNsaS5qcyA8YXJnc+KApj5gIGxpbmUsIGFuZCBlYWNoIGhvcFxuICogcmUtcXVvdGVzIHdoYXQgaXQgZm9yd2FyZHMuIEV2ZXJ5IG9uZSBvZiB0aG9zZSBsaW5lcyBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIDgxOTEgbGltaXQsIGFuZCBldmVyeSBvbmUgaXNcbiAqIGxvbmdlciB0aGFuIHRoZSBsaW5lIHdlIGFzc2VtYmxlZCDigJQgYnV0IGJ5IGhvdyBtdWNoIGlzIHRoZSBjaGlsZCdzIGJ1c2luZXNzLCBub3Qgb3Vycywgc28gbm8gZm9ybXVsYSBjYW5cbiAqIGJlIHJpZ2h0LiBPbmx5IHRoZSBkZWxpYmVyYXRlIHNsYWNrIGJlbG93IGNhbi5cbiAqXG4gKiBgMjA0OGAgaXMgcm91Z2hseSBkb3VibGUgdGhlIG92ZXJoZWFkIG1lYXN1cmVkIHdoZW4gdGhpcyB3YXMgZm91bmQsIGJhY2sgd2hlbiBldmVyeSB0b29sIHdhc1xuICogYWRkaXRpb25hbGx5IGZyb250ZWQgYnkgYG5weGAgYW5kIHNvIHBhaWQgb25lIG1vcmUgcmUtZXhwYW5zaW9uIGhvcCB0aGFuIGl0IGRvZXMgbm93LiBPdmVyIGEgcmVwb3NpdG9yeSdzXG4gKiAxODcgbWFya2Rvd24gcGF0aHMsIGEgYG1hcmtkb3dubGludC1jbGkyIOKApmAgbGluZSAqKmFzc2VtYmxlZCBhdCA3MDUxIGNoYXJzKiog4oCUIDExNDAgdW5kZXIgdGhlIGxpbWl0IOKAlFxuICogc3RpbGwgZGllZCB3aXRoIGBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nLmA7IHRoZSBzYW1lIHBheWxvYWQgc3BsaXQgaW4gdHdvIHJ1bnMgY2xlYW4uIE5vdGUgdGhlIHRvb2w6XG4gKiB0aGlzIGlzIG5vdCBzcGVjaWZpYyB0byBgbGlua2luYXRvcmAsIGl0IGlzIHRoZSBzaGFwZSBvZiBldmVyeSBzaGltLWZyb250ZWQgaW52b2NhdGlvbi5cbiAqXG4gKiBPdmVyLXJlc2VydmluZyBjb3N0cyBvbmUgZXh0cmEgc2VxdWVudGlhbCBpbnZvY2F0aW9uIG9mIGEgY29tbWFuZCB0aGF0IHdhcyBhbHJlYWR5IGdvaW5nIHRvIGJlIGJhdGNoZWQ7XG4gKiB1bmRlci1yZXNlcnZpbmcgY29zdHMgYSBsaW50IGZhaWx1cmUgdGhhdCBuYW1lcyBub3RoaW5nIHdyb25nIHdpdGggdGhlIGNvbnRlbnQuIFJhaXNlIGl0LCBuZXZlciBsb3dlciBpdCxcbiAqIGlmIHRoZSBzeW1wdG9tIHJldHVybnMuXG4gKi9cbmNvbnN0IFdJTkRPV1NfQ0hJTERfRVhQQU5TSU9OX1JFU0VSVkUgPSAyMDQ4O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBkZXNjcmliZUV4aXRGYWlsdXJlfS5cbiAqL1xuaW50ZXJmYWNlIERlc2NyaWJlRXhpdEZhaWx1cmVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgdGhhdCB3YXMgZXhlY3V0ZWQuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGl0IGNvZGUgdGhlIGNoaWxkIHJlcG9ydGVkLCBvciBgbnVsbGAgd2hlbiBpdCBkaWQgbm90IGV4aXQgb24gaXRzIG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc2lnbmFsIHRoYXQgdGVybWluYXRlZCB0aGUgY2hpbGQsIGlmIGFueS5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2hpbGQncyBzdGRpbyB3YXMgYXR0YWNoZWQgdG8gdGhlIHRlcm1pbmFsLCBzbyBub3RoaW5nIHdhcyBjYXB0dXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzSW50ZXJhY3RpdmU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNoaWxkJ3Mgb3V0cHV0IHdhcyBzdXBwcmVzc2VkLCBzbyB0aGUgdXNlciBoYXMgbm90IHNlZW4gaXQuXG4gICAqL1xuICByZWFkb25seSBpc1F1aWV0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FwdHVyZWQgc3RhbmRhcmQgZXJyb3IuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNhcHR1cmVkIHN0YW5kYXJkIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZG91dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleGVjdXRlQmF0Y2hlc30uXG4gKi9cbmludGVyZmFjZSBFeGVjdXRlQmF0Y2hlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYmFzZSBjb21tYW5kIHdpdGhvdXQgYmF0Y2hlZCBhcmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUNvbW1hbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGJhdGNoZXMgb2YgYXJncy5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZXM6IHN0cmluZ1tdW107XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBFeGVjT3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc3Bhd25WaWFTaGVsbH0uXG4gKi9cbmludGVyZmFjZSBTcGF3blZpYVNoZWxsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kIHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWVyZ2VkIG92ZXIgdGhlIGluaGVyaXRlZCBjaGlsZCBlbnZpcm9ubWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGF0dGFjaGVzIHRoZSBjaGlsZCdzIHN0ZGlvIHRvIHRoZSB0ZXJtaW5hbCBpbnN0ZWFkIG9mIHBpcGluZyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzSW50ZXJhY3RpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYXJndW1lbnQgYXJyYXkgKGlmIGF2YWlsYWJsZSkuXG4gICAqL1xuICByZWFkb25seSByYXdBcmd1bWVudHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1hbmQgbGluZSBhcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3aWxsIGFjdHVhbGx5IHNlZSBpdCwgd2hpY2ggb24gV2luZG93cyBpc1xuICogTk9UIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBwYXNzZWQgaW4uXG4gKlxuICoge0BsaW5rIHNwYXduVmlhU2hlbGx9IHJvdXRlcyB0aGUgY29tbWFuZCB0aHJvdWdoIGBjbWQuZXhlYCwgYW5kIHR3byB0aGluZ3MgYXJlIHNwZW50IGJldHdlZW4gaGVyZSBhbmRcbiAqIHRoZXJlLCBuZWl0aGVyIG9mIHRoZW0gdmlzaWJsZSBpbiB0aGUgYXNzZW1ibGVkIGNvbW1hbmQ6XG4gKiAtIE5vZGUncyBgc3Bhd24o4oCmLCB7IHNoZWxsOiB0cnVlIH0pYCB3cmFwcyBpdCBhcyBgPGNvbXNwZWM+IC9kIC9zIC9jIFwiPGNvbW1hbmQ+XCJgLlxuICogLSB7QGxpbmsgY21kRXNjYXBlQ29tbWFuZExpbmV9IGBeYC1lc2NhcGVzIGV2ZXJ5IG9uZSBvZiBgY21kLmV4ZWAncyBtZXRhY2hhcmFjdGVycywgd2hpY2ggb24gYSBsaXN0IG9mXG4gKiAgIHF1b3RlZCBwYXRocyBpcyBhIGZldyBwZXJjZW50IG9mIHRoZSB3aG9sZSAobWVhc3VyZWQ6ICsyMzYgY2hhcnMgb24gYSA3MjE2LWNoYXIgaW52b2NhdGlvbikuXG4gKlxuICogQm90aCBhcmUgb3VycyB0byBjb21wdXRlLCBzbyB0aGV5IGFyZSBjb21wdXRlZCByYXRoZXIgdGhhbiBndWVzc2VkLiBXaGF0IGlzIE5PVCBjb21wdXRhYmxlIGZyb20gaGVyZSBpc1xuICogd2hhdCB0aGUgc3Bhd25lZCBjb21tYW5kIGRvZXMgdG8gaXRzIG93biBhcmd1bWVudHMg4oCUIHNlZSB7QGxpbmsgV0lORE9XU19DSElMRF9FWFBBTlNJT05fUkVTRVJWRX0uXG4gKlxuICogVGhlIHBsYXRmb3JtIGJyYW5jaCBoZXJlIE1VU1Qgc3RheSBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbiB7QGxpbmsgc3Bhd25WaWFTaGVsbH0uXG4gKlxuICogQHBhcmFtIGNvbW1hbmRMaW5lIC0gVGhlIGFzc2VtYmxlZCBjb21tYW5kIGxpbmUsIGJlZm9yZSBhbnkgc2hlbGwgd3JhcHBpbmcuXG4gKiBAcmV0dXJucyBUaGUgbGVuZ3RoIGluIGNoYXJhY3RlcnMgb2Ygd2hhdCByZWFjaGVzIHRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoY29tbWFuZExpbmU6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGNvbW1hbmRMaW5lLmxlbmd0aDtcbiAgfVxuXG4gIGNvbnN0IGNvbXNwZWMgPSBwcm9jZXNzLmVudlsnY29tc3BlYyddID8/ICdjbWQuZXhlJztcbiAgY29uc3QgQ01EX1dSQVBQRVIgPSAnIC9kIC9zIC9jIFwiXCInO1xuICByZXR1cm4gY29tc3BlYy5sZW5ndGggKyBDTURfV1JBUFBFUi5sZW5ndGggKyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUoY29tbWFuZExpbmUpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXggY29tbWFuZCBsaW5lIGxlbmd0aCB0byBzaXplIGFuIHtAbGluayBFeGVjQXJndW1lbnR9IGJhdGNoIGFnYWluc3Qg4oCUIHRoZSBwbGF0Zm9ybSBtYXhpbXVtXG4gKiBsZXNzIHtAbGluayBXSU5ET1dTX0NISUxEX0VYUEFOU0lPTl9SRVNFUlZFfS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbW9yZSBjb25zZXJ2YXRpdmUgdGhhbiB7QGxpbmsgZ2V0TWF4Q29tbWFuZExlbmd0aH0sIGJlY2F1c2UgdGhlIHR3byBhbnN3ZXIgZGlmZmVyZW50XG4gKiBxdWVzdGlvbnMuIEV4Y2VlZGluZyB0aGUgcGxhaW4tY29tbWFuZCBsaW1pdCBpcyBhIGhhcmQgZmFpbHVyZSB0aGUgY2FsbGVyIGNhbm5vdCBhdm9pZCwgc28gdGhhdCBjaGVja1xuICogc3RheXMgZXhhY3QuIEV4Y2VlZGluZyB0aGUgYmF0Y2hpbmcgbGltaXQgb25seSBjb3N0cyBvbmUgZXh0cmEgaW52b2NhdGlvbiwgc28gdGhhdCBjaGVjayBtYXkg4oCUIGFuZFxuICogc2hvdWxkIOKAlCBsZWF2ZSByb29tIHRvIHNwYXJlLlxuICpcbiAqIEByZXR1cm5zIFRoZSBtYXggbGVuZ3RoIGluIGNoYXJhY3RlcnMgYXZhaWxhYmxlIHRvIGEgc2luZ2xlIGJhdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RoKCk6IG51bWJlciB7XG4gIHJldHVybiBnZXRNYXhDb21tYW5kTGVuZ3RoKCkgLSAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFdJTkRPV1NfQ0hJTERfRVhQQU5TSU9OX1JFU0VSVkUgOiAwKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBjb21tYW5kLWxpbmUgc3RyaW5nIGZyb20gYW4gYXJndW1lbnQgYXJyYXksIHF1b3RlZCBmb3IgdGhlIHNoZWxsIHRoYXRcbiAqIHtAbGluayBzcGF3blZpYVNoZWxsfSB3aWxsIHJvdXRlIHRocm91Z2ggb24gdGhlIGN1cnJlbnQgcGxhdGZvcm0uXG4gKlxuICogT24gV2luZG93cyB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCB2aWEgYGNtZC5leGVgLCBzbyBpdCB1c2VzIHRoZVxuICogYENvbW1hbmRMaW5lVG9Bcmd2V2AgY29udmVudGlvbiAoe0BsaW5rIHRvQ29tbWFuZExpbmV9KTsge0BsaW5rIHNwYXduVmlhU2hlbGx9XG4gKiB0aGVuIGFwcGxpZXMge0BsaW5rIGNtZEVzY2FwZUNvbW1hbmRMaW5lfSBvbiB0b3AgZm9yIGBjbWQuZXhlYCBtZXRhY2hhcmFjdGVycy5cbiAqIEVsc2V3aGVyZSB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCB2aWEgYHNoIC1jYCwgc28gaXQgdXNlcyBQT1NJWCBzaW5nbGUtcXVvdGVcbiAqIHF1b3RpbmcgKHtAbGluayB0b1Bvc2l4Q29tbWFuZExpbmV9KSBhbmQgbmVlZHMgbm8gZnVydGhlciBlc2NhcGluZy5cbiAqXG4gKiBUaGUgcGxhdGZvcm0gYnJhbmNoIGhlcmUgTVVTVCBzdGF5IGluIHN5bmMgd2l0aCB0aGUgb25lIGluIHtAbGluayBzcGF3blZpYVNoZWxsfS5cbiAqXG4gKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudCBhcnJheSB0byBxdW90ZSBhbmQgam9pbi5cbiAqIEByZXR1cm5zIFRoZSBxdW90ZWQgY29tbWFuZC1saW5lIHN0cmluZyBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0ncyBzaGVsbC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRDb21tYW5kTGluZSgkYXJndW1lbnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gdG9Db21tYW5kTGluZSgkYXJndW1lbnRzKSA6IHRvUG9zaXhDb21tYW5kTGluZSgkYXJndW1lbnRzKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIG1lc3NhZ2UgYSBmYWlsZWQgY29tbWFuZCByZWplY3RzIHdpdGgsIHNheWluZyBub3Qgb25seSBUSEFUIGl0IGZhaWxlZCBidXQgSE9XLlxuICpcbiAqIFRoZSBtZXNzYWdlIHVzZWQgdG8gYmUgYENvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBjb2RlIDxuPmAgcGx1cyBzdGRlcnIsIHdoYXRldmVyIHRoZSBjb2RlLiBTbyBhIGNoaWxkIHRoYXRcbiAqIGNyYXNoZWQgYmVmb3JlIHdyaXRpbmcgYSBieXRlIGFuZCBhIGxpbnRlciB0aGF0IGZvdW5kIHJlYWwgcHJvYmxlbXMgcmVhZCB0aGUgc2FtZSwgZGlmZmVyaW5nIG9ubHkgaW4gYVxuICogbnVtYmVyIG5vYm9keSByZWFkcyBhcyBhIHN0YXR1czogYSBXaW5kb3dzIGFjY2VzcyB2aW9sYXRpb24gYXJyaXZlcyBhcyBgZXhpdCBjb2RlIDMyMjEyMjU0NzdgIHdpdGggbm90aGluZ1xuICogYWZ0ZXIgaXQsIGFuZCB3aG9ldmVyIHJlYWRzIGl0IGdvZXMgbG9va2luZyBmb3IgYSBmaW5kaW5nIHRoYXQgZG9lcyBub3QgZXhpc3QuIFRoaXMgaXMgdGhlIGxhc3QgcG9pbnQgdGhhdFxuICogY2FuIHRlbGwgdGhlIHR3byBhcGFydCDigJQgdGhlIGAuY21kYCBzaGltIGlzIHNwYXduZWQgZGlyZWN0bHksIHNvIHRoZSBjaGlsZCdzIHJhdyBjb2RlIGlzIHZpc2libGUgaGVyZSwgd2hpbGVcbiAqIGFuIGBucG0gcnVuYCBsYXllciBmdXJ0aGVyIG91dCBpcyBrbm93biB0byBsYXVuZGVyIGl0IGludG8gYSBwbGFpbiBgMWAuXG4gKlxuICogVHdvIHNpZ25hbHMgYXJlIHJlYWQsIGFuZCB0aGVpciBjb25qdW5jdGlvbiBpcyB3aGF0IGVhcm5zIHRoZSB3b3JkIFwiY3Jhc2hlZFwiOiB0aGUgdGVybWluYXRpb24gd2FzIGFibm9ybWFsXG4gKiAoYW4gTlRTVEFUVVMgZXJyb3IgY29kZSwgb3IgYSBzaWduYWwpLCBhbmQgbmVpdGhlciBzdHJlYW0gY2FycmllZCBhbnl0aGluZy4gQSB0b29sIGZhaWxpbmcgb24gaXRzIG93biB0ZXJtc1xuICogc2F5cyBzb21ldGhpbmc7IGEgY2hpbGQgdGhhdCBkaWVkIG1pZC1pbnN0cnVjdGlvbiBkb2VzIG5vdC4gVGhlIENBVVNFIG9mIHN1Y2ggYSBjcmFzaCBpcyBub3QgdGhpc1xuICogZnVuY3Rpb24ncyBidXNpbmVzcywgc28gdGhlIG1lc3NhZ2Ugb25seSBuYW1lcyBpdCBhbmQgc2F5cyB3aGF0IHRvIGRvLlxuICpcbiAqIFRoZSBgQ29tbWFuZCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgPG4+YCBwcmVmaXggaXMga2VwdCwgc28gYSBjYWxsZXIgbWF0Y2hpbmcgb24gaXQgc3RpbGwgbWF0Y2hlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZGVzY3JpYmluZyB0aGUgZmFpbGVkIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIFRoZSBmYWlsdXJlIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlRXhpdEZhaWx1cmUocGFyYW1zOiBEZXNjcmliZUV4aXRGYWlsdXJlUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjb21tYW5kLCBleGl0Q29kZSwgZXhpdFNpZ25hbCwgaXNJbnRlcmFjdGl2ZSwgaXNRdWlldCwgc3RkZXJyLCBzdGRvdXQgfSA9IHBhcmFtcztcbiAgY29uc3QgbnRTdGF0dXMgPSB0b050U3RhdHVzKGV4aXRDb2RlKTtcblxuICBsZXQgc3RhdHVzID0gYGV4aXQgY29kZSAke2V4aXRDb2RlID09PSBudWxsID8gJyhudWxsKScgOiBTdHJpbmcoZXhpdENvZGUpfWA7XG4gIGxldCBhYm5vcm1hbFJlYXNvbjogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIGlmIChudFN0YXR1cyAhPT0gbnVsbCkge1xuICAgIGNvbnN0IEhFWF9SQURJWCA9IDE2O1xuICAgIGNvbnN0IGhleCA9IGAweCR7bnRTdGF0dXMudG9TdHJpbmcoSEVYX1JBRElYKS50b1VwcGVyQ2FzZSgpfWA7XG4gICAgY29uc3QgbmFtZSA9IE5UU1RBVFVTX05BTUVTLmdldChoZXgpO1xuICAgIHN0YXR1cyArPSBgIChOVFNUQVRVUyAke25hbWUgPyBgJHtoZXh9ICR7bmFtZX1gIDogaGV4fSlgO1xuICAgIGFibm9ybWFsUmVhc29uID0gbmFtZSA9PT0gJ1NUQVRVU19DT05UUk9MX0NfRVhJVCcgPyAnd2FzIGludGVycnVwdGVkJyA6ICdjcmFzaGVkJztcbiAgfSBlbHNlIGlmIChleGl0U2lnbmFsICE9PSBudWxsKSB7XG4gICAgc3RhdHVzICs9IGAsIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICR7ZXhpdFNpZ25hbH1gO1xuICAgIGFibm9ybWFsUmVhc29uID0gYHdhcyBraWxsZWQgYnkgJHtleGl0U2lnbmFsfWA7XG4gIH1cblxuICBjb25zdCBsaW5lcyA9IFtgQ29tbWFuZCBmYWlsZWQgd2l0aCAke3N0YXR1c31gLCBgQ29tbWFuZDogJHt0cnVuY2F0ZUNvbW1hbmQoY29tbWFuZCl9YF07XG5cbiAgaWYgKGFibm9ybWFsUmVhc29uICE9PSBudWxsKSB7XG4gICAgbGluZXMucHVzaChcbiAgICAgICFpc0ludGVyYWN0aXZlICYmIHN0ZG91dCA9PT0gJycgJiYgc3RkZXJyID09PSAnJ1xuICAgICAgICA/IGBUaGUgY2hpbGQgcHJvY2VzcyAke2Fibm9ybWFsUmVhc29ufSBiZWZvcmUgd3JpdGluZyBhbnl0aGluZyB0byBzdGRvdXQgb3Igc3RkZXJyLiBUaGlzIGlzIG5vdCBhIGZhaWx1cmUgdGhlIHRvb2wgcmVwb3J0ZWQgKG5vdCBhIGxpbnQgZmluZGluZywgbm90IGEgdHlwZSBlcnJvcik6IHJlLXJ1biB0aGUgY29tbWFuZC5gXG4gICAgICAgIDogYFRoZSBjaGlsZCBwcm9jZXNzICR7YWJub3JtYWxSZWFzb259IHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93biwgc28gYW55IG91dHB1dCBpdCB3cm90ZSBtYXkgYmUgaW5jb21wbGV0ZS5gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChzdGRvdXQgIT09ICcnKSB7XG4gICAgbGluZXMucHVzaChpc1F1aWV0ID8gYHN0ZG91dDpcXG4ke3N0ZG91dH1gIDogYHN0ZG91dDogJHtTdHJpbmcoc3Rkb3V0LnNwbGl0KCdcXG4nKS5sZW5ndGgpfSBsaW5lKHMpLCBwcmludGVkIGFib3ZlLmApO1xuICB9XG5cbiAgaWYgKHN0ZGVyciAhPT0gJycpIHtcbiAgICBsaW5lcy5wdXNoKGBzdGRlcnI6XFxuJHtzdGRlcnJ9YCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYmF0Y2hlZCBjb21tYW5kcyBzZXF1ZW50aWFsbHkgYW5kIGNvbmNhdGVuYXRlcyB0aGVpciBvdXRwdXQuXG4gKlxuICogYGV4ZWNTdHJpbmdgIHJldHVybnMgYSBgc3RyaW5nYCBvciBhbiB7QGxpbmsgRXhlY1Jlc3VsdH0gZGVwZW5kaW5nIG9uIGBvcHRpb25zLnNob3VsZEluY2x1ZGVEZXRhaWxzYCwgc29cbiAqIGJvdGggc2hhcGVzIGFyZSB1bnBhY2tlZCDigJQgcmVhZGluZyBvbmx5IHRoZSBgc3RyaW5nYCBvbmUgc2lsZW50bHkgdGhyZXcgYXdheSBldmVyeSBiYXRjaCdzIG91dHB1dCBpblxuICogZXhhY3RseSB0aGUgbW9kZSB0aGF0IGFza2VkIGZvciBpdC5cbiAqXG4gKiBBIGJhdGNoIHRoYXQgZXhpdHMgbm9uLXplcm8gbm9ybWFsbHkgcmVqZWN0czsgaXQgb25seSByZWFjaGVzIGhlcmUgd2hlbiBgc2hvdWxkSWdub3JlRXhpdENvZGVgIGFza2VkIGZvclxuICogaXQgdG8gYmUgcmVwb3J0ZWQgaW5zdGVhZC4gVGhlIGZpcnN0IHN1Y2ggZmFpbHVyZSBpcyB3aGF0IHRoZSBhZ2dyZWdhdGUgcmVwb3J0cywgc28gc3BsaXR0aW5nIGEgY29tbWFuZFxuICogaW50byBiYXRjaGVzIGNhbm5vdCB0dXJuIGEgZmFpbHVyZSBpbnRvIGEgc3VjY2VzcyDigJQgZXhjZXB0IHRoYXQgYW4gYWJub3JtYWwgdGVybWluYXRpb24gKGEgY3Jhc2gsIGFcbiAqIHNpZ25hbCkgaW4gYSBsYXRlciBiYXRjaCBvdXRyYW5rcyBhbiBvcmRpbmFyeSBmYWlsdXJlIGluIGFuIGVhcmxpZXIgb25lLiBPdGhlcndpc2UgYSBjcmFzaCBpbiBiYXRjaCAyIGFmdGVyXG4gKiByZWFsIGZpbmRpbmdzIGluIGJhdGNoIDEgd291bGQgYWdncmVnYXRlIHRvIHRoZSBmaW5kaW5ncycgZXhpdCBjb2RlLCBhbmQgYSBjYWxsZXIgY2xhc3NpZnlpbmcgdGhlIHJlc3VsdFxuICogd291bGQgbmV2ZXIgbGVhcm4gdGhhdCBwYXJ0IG9mIHRoZSBpbnB1dCB3YXMgbm90IGNoZWNrZWQgYXQgYWxsLlxuICpcbiAqIFNpbGVudCBiYXRjaGVzIGNvbnRyaWJ1dGUgbm90aGluZyB0byB0aGUgam9pbmVkIG91dHB1dC4gYGV4ZWNTdHJpbmdgIGFscmVhZHkgdHJpbXMgZWFjaCByZXN1bHQncyB0cmFpbGluZ1xuICogbmV3bGluZSwgc28gam9pbmluZyBlbXB0eSBvbmVzIGJhY2sgaW4gd291bGQgcmVpbnRyb2R1Y2UgZXhhY3RseSB0aGUgYmxhbmstbGluZSBub2lzZSBpdCByZW1vdmVkIOKAlCBhXG4gKiBjb21tYW5kIHRoYXQgcHJpbnRlZCBub3RoaW5nIG11c3QgYWdncmVnYXRlIHRvIGAnJ2AsIG5vdCB0byBhIHJ1biBvZiBuZXdsaW5lcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBiYXRjaGVkIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNvbmNhdGVuYXRlZCByZXN1bHQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVCYXRjaGVzKHBhcmFtczogRXhlY3V0ZUJhdGNoZXNQYXJhbXMpOiBQcm9taXNlPEV4ZWNSZXN1bHQgfCBzdHJpbmc+IHtcbiAgY29uc3QgeyBiYXNlQ29tbWFuZCwgYmF0Y2hlcywgb3B0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBzdGRvdXRQYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc3RkZXJyUGFydHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBmYWlsdXJlOiBFeGVjUmVzdWx0IHwgbnVsbCA9IG51bGw7XG5cbiAgZm9yIChjb25zdCBiYXRjaCBvZiBiYXRjaGVzKSB7XG4gICAgY29uc3QgYmF0Y2hDb21tYW5kID0gYCR7YmFzZUNvbW1hbmR9ICR7YnVpbGRDb21tYW5kTGluZShiYXRjaCl9YDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjU3RyaW5nKHtcbiAgICAgIGNvbW1hbmQ6IGJhdGNoQ29tbWFuZCxcbiAgICAgIG9wdGlvbnNcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHB1c2hJZk5vdEVtcHR5KHN0ZG91dFBhcnRzLCByZXN1bHQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcHVzaElmTm90RW1wdHkoc3Rkb3V0UGFydHMsIHJlc3VsdC5zdGRvdXQpO1xuICAgIHB1c2hJZk5vdEVtcHR5KHN0ZGVyclBhcnRzLCByZXN1bHQuc3RkZXJyKTtcbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwICYmIChmYWlsdXJlID09PSBudWxsIHx8ICghaXNBYm5vcm1hbFRlcm1pbmF0aW9uKGZhaWx1cmUpICYmIGlzQWJub3JtYWxUZXJtaW5hdGlvbihyZXN1bHQpKSkpIHtcbiAgICAgIGZhaWx1cmUgPSByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnMuc2hvdWxkSW5jbHVkZURldGFpbHNcbiAgICA/IHtcbiAgICAgIC8vIE5vdCBgZmFpbHVyZT8uZXhpdENvZGUgPz8gMGA6IGEgYmF0Y2gga2lsbGVkIGJ5IGEgc2lnbmFsIGhhcyBhIGBudWxsYCBjb2RlLCB3aGljaCBgPz9gIHdvdWxkIHJlcG9ydCBhcyBzdWNjZXNzLlxuICAgICAgZXhpdENvZGU6IGZhaWx1cmUgPT09IG51bGwgPyAwIDogZmFpbHVyZS5leGl0Q29kZSxcbiAgICAgIGV4aXRTaWduYWw6IGZhaWx1cmU/LmV4aXRTaWduYWwgPz8gbnVsbCxcbiAgICAgIHN0ZGVycjogc3RkZXJyUGFydHMuam9pbignXFxuJyksXG4gICAgICBzdGRvdXQ6IHN0ZG91dFBhcnRzLmpvaW4oJ1xcbicpXG4gICAgfVxuICAgIDogc3Rkb3V0UGFydHMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcGFzc2VkIHRvIGNoaWxkIHByb2Nlc3NlcywgcmVzb2x2ZWQgYXQgc3Bhd24gdGltZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbm90IGEgbW9kdWxlLWxldmVsIGNvbnN0YW50LiBgLmVudmAgaXMgbG9hZGVkIGJ5IGBsb2FkRW52RmlsZUlmRXhpc3RzYCBmcm9tIGluc2lkZVxuICogYHdyYXBDbGlUYXNrYCwgYW5kIEVTTSBldmFsdWF0ZXMgZXZlcnkgaW1wb3J0IGJlZm9yZSB0aGUgZW50cnkgbW9kdWxlJ3MgZmlyc3Qgc3RhdGVtZW50IOKAlCBzbyBhXG4gKiBzbmFwc2hvdCB0YWtlbiBoZXJlIHdvdWxkIGFsd2F5cyBwcmVkYXRlIHRoZSBsb2FkLCBhbmQgZXZlcnkgc3Bhd25lZCBjaGlsZCB3b3VsZCBydW4gd2l0aG91dCB0aGVcbiAqIHJlcG8ncyBvd24gYC5lbnZgLiBOb3RoaW5nIHN1cmZhY2VkIHRoYXQgd2hpbGUgVml0ZXN0IDMgY29waWVkIHRoZSBgLmVudmAgaXQgbG9hZGVkIGludG8gdGhlXG4gKiB3b3JrZXIncyBgcHJvY2Vzcy5lbnZgOyBWaXRlc3QgNCB3cml0ZXMgdGhvc2UgdG8gYGltcG9ydC5tZXRhLmVudmAgb25seSwgbGVhdmluZyB0aGlzIHRoZSBzb2xlXG4gKiBwYXRoIGFuZCBhbiBlbXB0eSBvbmUuXG4gKlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IHRvIHBhc3MgdG8gc3Bhd25lZCBjaGlsZCBwcm9jZXNzZXMsIHJlZmxlY3RpbmcgYHByb2Nlc3MuZW52YCBhcyBpdCBzdGFuZHMgbm93LlxuICovXG5mdW5jdGlvbiBnZXRDaGlsZEVudigpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIHJldHVybiBidWlsZENoaWxkRW52KHByb2Nlc3MuZW52LCBwcm9jZXNzLmFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFncyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgbWF4IGNvbW1hbmQgbGluZSBsZW5ndGguXG4gKlxuICogQHJldHVybnMgVGhlIG1heCBjb21tYW5kIGxlbmd0aCBpbiBjaGFyYWN0ZXJzLlxuICovXG5mdW5jdGlvbiBnZXRNYXhDb21tYW5kTGVuZ3RoKCk6IG51bWJlciB7XG4gIGNvbnN0IFdJTkRPV1NfTUFYX0NPTU1BTkRfTEVOR1RIID0gODE5MTtcbiAgY29uc3QgVU5JWF9NQVhfQ09NTUFORF9MRU5HVEggPSAxMzFfMDcyO1xuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFdJTkRPV1NfTUFYX0NPTU1BTkRfTEVOR1RIIDogVU5JWF9NQVhfQ09NTUFORF9MRU5HVEg7XG59XG5cbi8qKlxuICogSGFuZGxlcyBhIGNvbW1hbmQgYXJyYXkgdGhhdCBtYXkgY29udGFpbiBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fS5cbiAqIFJldHVybnMgYSBQcm9taXNlIGlmIGJhdGNoaW5nIGlzIG5lZWRlZCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIGNvbW1hbmRcbiAqIGhhcyBubyBFeGVjQXJnIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkIG5vcm1hbGx5LlxuICpcbiAqIEBwYXJhbSBwYXJ0cyAtIFRoZSBjb21tYW5kIHBhcnRzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgZXhlYyBvcHRpb25zLlxuICogQHJldHVybnMgQSBQcm9taXNlIGlmIGJhdGNoaW5nIGlzIGhhbmRsZWQsIG9yIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBoYW5kbGVCYXRjaGVkQ29tbWFuZChwYXJ0czogQ29tbWFuZFBhcnRbXSwgb3B0aW9uczogRXhlY09wdGlvbnMpOiBQcm9taXNlPEV4ZWNSZXN1bHQgfCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZXhlY0FyZ3VtZW50cyA9IHBhcnRzLmZpbHRlcihpc0V4ZWNBcmd1bWVudCk7XG4gIGlmIChleGVjQXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGV4ZWNBcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ09ubHkgb25lIEV4ZWNBcmcgd2l0aCBiYXRjaGVkQXJndW1lbnRzIGlzIGFsbG93ZWQgcGVyIGNvbW1hbmQnKSk7XG4gIH1cblxuICBjb25zdCBleGVjQXJndW1lbnQgPSBleGVjQXJndW1lbnRzWzBdO1xuICBhc3NlcnROb25OdWxsYWJsZShleGVjQXJndW1lbnQpO1xuICBjb25zdCBzdGF0aWNQYXJ0cyA9IHBhcnRzLmZpbHRlcigocGFydCk6IHBhcnQgaXMgc3RyaW5nID0+IHR5cGVvZiBwYXJ0ID09PSAnc3RyaW5nJyk7XG4gIGNvbnN0IGJhc2VDb21tYW5kID0gYnVpbGRDb21tYW5kTGluZShzdGF0aWNQYXJ0cyk7XG4gIGNvbnN0IG1heENvbW1hbmRMZW5ndGggPSBnZXRNYXhCYXRjaENvbW1hbmRMZW5ndGgoKTtcblxuICAvLyBUcnkgZXhwYW5kaW5nIGFsbCBhcmdzIGlubGluZVxuICBjb25zdCBmdWxsQ29tbWFuZCA9IGAke2Jhc2VDb21tYW5kfSAke2J1aWxkQ29tbWFuZExpbmUoWy4uLmV4ZWNBcmd1bWVudC5iYXRjaGVkQXJndW1lbnRzXSl9YDtcbiAgaWYgKGdldEVmZmVjdGl2ZUNvbW1hbmRMaW5lTGVuZ3RoKGZ1bGxDb21tYW5kKSA8PSBtYXhDb21tYW5kTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGV4ZWNTdHJpbmcoe1xuICAgICAgY29tbWFuZDogZnVsbENvbW1hbmQsXG4gICAgICBvcHRpb25zXG4gICAgfSk7XG4gIH1cblxuICAvLyBTcGxpdCBpbnRvIGJhdGNoZXNcbiAgY29uc3QgYmF0Y2hlczogc3RyaW5nW11bXSA9IFtdO1xuICBsZXQgY3VycmVudEJhdGNoOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgYXJndW1lbnQgb2YgZXhlY0FyZ3VtZW50LmJhdGNoZWRBcmd1bWVudHMpIHtcbiAgICBjb25zdCB0ZW50YXRpdmUgPSBgJHtiYXNlQ29tbWFuZH0gJHtidWlsZENvbW1hbmRMaW5lKFsuLi5jdXJyZW50QmF0Y2gsIGFyZ3VtZW50XSl9YDtcbiAgICBpZiAoZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgodGVudGF0aXZlKSA+IG1heENvbW1hbmRMZW5ndGgpIHtcbiAgICAgIGlmIChjdXJyZW50QmF0Y2gubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IHNwbGl0IGNvbW1hbmQgaW50byBiYXRjaGVzOiBhIHNpbmdsZSBhcmd1bWVudCAoJHtTdHJpbmcoYXJndW1lbnQubGVuZ3RoKX0gY2hhcnMpIHBsdXMgdGhlIGJhc2UgY29tbWFuZCAoJHtTdHJpbmcoYmFzZUNvbW1hbmQubGVuZ3RoKX0gY2hhcnMpIGV4Y2VlZHMgdGhlIG1heCBiYXRjaCBjb21tYW5kIGxlbmd0aCAoJHtTdHJpbmcobWF4Q29tbWFuZExlbmd0aCl9KS5gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYmF0Y2hlcy5wdXNoKGN1cnJlbnRCYXRjaCk7XG4gICAgICBjdXJyZW50QmF0Y2ggPSBbYXJndW1lbnRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50QmF0Y2gucHVzaChhcmd1bWVudCk7XG4gICAgfVxuICB9XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbHdheXMgdHJ1ZSBhZnRlciB0aGUgbG9vcDsgYmF0Y2hlZEFyZ3VtZW50cyBpcyBub24tZW1wdHkgYXQgdGhpcyBwb2ludC4gKi9cbiAgaWYgKGN1cnJlbnRCYXRjaC5sZW5ndGggPiAwKSB7XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICBiYXRjaGVzLnB1c2goY3VycmVudEJhdGNoKTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlQmF0Y2hlcyh7XG4gICAgYmFzZUNvbW1hbmQsXG4gICAgYmF0Y2hlcyxcbiAgICBvcHRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgcmVzdWx0IHJlY29yZHMgYW4gYWJub3JtYWwgdGVybWluYXRpb24g4oCUIGFuIE5UU1RBVFVTIGVycm9yIGNvZGUgb3IgYSBzaWduYWwg4oCUIHJhdGhlciB0aGFuXG4gKiB0aGUgY2hpbGQgZXhpdGluZyBvbiBpdHMgb3duIHdpdGggYSBjb2RlIG9mIGl0cyBjaG9vc2luZy5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHJlc3VsdCB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNoaWxkIHRlcm1pbmF0ZWQgYWJub3JtYWxseS5cbiAqL1xuZnVuY3Rpb24gaXNBYm5vcm1hbFRlcm1pbmF0aW9uKHJlc3VsdDogRXhlY1Jlc3VsdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVzdWx0LmV4aXRTaWduYWwgIT09IG51bGwgfHwgdG9OdFN0YXR1cyhyZXN1bHQuZXhpdENvZGUpICE9PSBudWxsO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGNvbW1hbmQgcGFydCBpcyBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fS5cbiAqXG4gKiBAcGFyYW0gcGFydCAtIFRoZSBjb21tYW5kIHBhcnQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwYXJ0IGlzIGFuIEV4ZWNBcmcuXG4gKi9cbmZ1bmN0aW9uIGlzRXhlY0FyZ3VtZW50KHBhcnQ6IENvbW1hbmRQYXJ0KTogcGFydCBpcyBFeGVjQXJndW1lbnQge1xuICByZXR1cm4gdHlwZW9mIHBhcnQgPT09ICdvYmplY3QnICYmICdiYXRjaGVkQXJndW1lbnRzJyBpbiBwYXJ0O1xufVxuXG4vKipcbiAqIEFwcGVuZHMgYSBiYXRjaCdzIGNhcHR1cmVkIG91dHB1dCB0byB0aGUgYWNjdW11bGF0b3IsIHNraXBwaW5nIGFuIGVtcHR5IG9uZSBzbyB0aGUgZXZlbnR1YWwgam9pbiBkb2VzIG5vdFxuICogZmFicmljYXRlIGJsYW5rIGxpbmVzIGZvciBiYXRjaGVzIHRoYXQgcHJpbnRlZCBub3RoaW5nLlxuICpcbiAqIEBwYXJhbSBhY2N1bXVsYXRvciAtIFRoZSBjb2xsZWN0ZWQgb3V0cHV0cyBzbyBmYXIuXG4gKiBAcGFyYW0gb3V0cHV0IC0gVGhlIG91dHB1dCBvZiBhIHNpbmdsZSBiYXRjaC5cbiAqL1xuZnVuY3Rpb24gcHVzaElmTm90RW1wdHkoYWNjdW11bGF0b3I6IHN0cmluZ1tdLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAob3V0cHV0ICE9PSAnJykge1xuICAgIGFjY3VtdWxhdG9yLnB1c2gob3V0cHV0KTtcbiAgfVxufVxuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgdmlhIHRoZSBhcHByb3ByaWF0ZSBzaGVsbC5cbiAqXG4gKiBPbiBXaW5kb3dzLCBpZiB0aGUgY29tbWFuZCBjb250YWlucyBuZXdsaW5lcyAod2hpY2ggYGNtZC5leGVgIGNhbm5vdCBoYW5kbGUpXG4gKiBhbmQgdGhlIHJhdyBhcmdzIGFycmF5IGlzIGF2YWlsYWJsZSwgc3Bhd25zIHRoZSBwcm9jZXNzIGRpcmVjdGx5IHdpdGhvdXRcbiAqIGFueSBzaGVsbCDigJQgcGFzc2luZyBhcmdzIHZpYSBgQ3JlYXRlUHJvY2Vzc2AsIHdoaWNoIGF2b2lkcyBhbGwgcXVvdGluZyBpc3N1ZXMuXG4gKlxuICogT24gV2luZG93cyAoY21kLmV4ZSBwYXRoKSwgYXBwbGllcyBgXmAtZXNjYXBpbmcgZm9yIGNtZCBtZXRhY2hhcmFjdGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHNwYXduaW5nIHRoZSBjaGlsZCBwcm9jZXNzLlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3Bhd25WaWFTaGVsbChwYXJhbXM6IFNwYXduVmlhU2hlbGxQYXJhbXMpOiBDaGlsZFByb2Nlc3Mge1xuICBjb25zdCB7IGNvbW1hbmQsIGN3ZCwgZW52OiBleHRyYUVudiwgaXNJbnRlcmFjdGl2ZSA9IGZhbHNlLCByYXdBcmd1bWVudHMgfSA9IHBhcmFtcztcbiAgY29uc3QgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHtcbiAgICAuLi5nZXRDaGlsZEVudigpLFxuICAgIC4uLmV4dHJhRW52XG4gIH07XG4gIGNvbnN0IHN0ZGlvOiAnaW5oZXJpdCcgfCAncGlwZScgPSBpc0ludGVyYWN0aXZlID8gJ2luaGVyaXQnIDogJ3BpcGUnO1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyAmJiBjb21tYW5kLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgIGlmICghcmF3QXJndW1lbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbW1hbmRzIGNvbnRhaW5pbmcgbmV3bGluZXMgY2Fubm90IGJlIGV4ZWN1dGVkIHRocm91Z2ggY21kLmV4ZSBvbiBXaW5kb3dzLiBQYXNzIGFuIGFyZ3VtZW50IGFycmF5IGluc3RlYWQgb2YgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIGNvbnN0IFtwcm9ncmFtLCAuLi4kYXJndW1lbnRzXSA9IHJhd0FyZ3VtZW50cztcbiAgICBhc3NlcnROb25OdWxsYWJsZShwcm9ncmFtLCAnQ29tbWFuZCBhcnJheSBtdXN0IG5vdCBiZSBlbXB0eScpO1xuICAgIHJldHVybiBzcGF3bihwcm9ncmFtLCAkYXJndW1lbnRzLCB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBzdGRpb1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qgc2hlbGxDb21tYW5kID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IGNvbW1hbmRFc2NhcGVDb21tYW5kTGluZShjb21tYW5kKSA6IGNvbW1hbmQ7XG4gIHJldHVybiBzcGF3bihzaGVsbENvbW1hbmQsIFtdLCB7XG4gICAgY3dkLFxuICAgIGVudixcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpb1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZWFkcyBhbiBleGl0IGNvZGUgYXMgYSBXaW5kb3dzIE5UU1RBVFVTIGVycm9yLCBpZiBpdCBpcyBvbmUuXG4gKlxuICogQSBjcmFzaGVkIHByb2Nlc3Mgb24gV2luZG93cyBleGl0cyB3aXRoIHRoZSBOVFNUQVRVUyBvZiB0aGUgZXhjZXB0aW9uIHRoYXQga2lsbGVkIGl0LCBhbmQgYSBgLmNtZGAgc2hpbVxuICogZm9yd2FyZHMgaXRzIGlubmVyIHByb2Nlc3MncyBjb2RlLCBzbyBhIGNyYXNoZWQgYG5vZGUuZXhlYCBhcnJpdmVzIGhlcmUgaW50YWN0IOKAlCBgMHhDMDAwMDAwNWAgYXNcbiAqIGAzMjIxMjI1NDc3YC4gVGhlIHRlc3QgaXMgdGhlIE5UU1RBVFVTIGxheW91dCByYXRoZXIgdGhhbiBhIGJhcmUgYD49IDB4QzAwMDAwMDBgOiB0aGUgdG9wIHR3byBiaXRzIGFyZSB0aGVcbiAqIGVycm9yIHNldmVyaXR5IGFuZCB0aGUgbmV4dCBvbmUgaXMgdGhlIGN1c3RvbWVyIGZsYWcsIHdoaWNoIG11c3QgYmUgY2xlYXIuIFRoYXQga2VlcHMgb3V0IHR3byBjb2RlcyBhIGJhcmVcbiAqIHJhbmdlIHdvdWxkIG1pc3JlYWQg4oCUIGBwcm9jZXNzLmV4aXQoLTEpYCwgd2hpY2ggV2luZG93cyByZXBvcnRzIGFzIGAweEZGRkZGRkZGYCwgYW5kIHRoZSBgMHhFMDZENzM2M2Agb2YgYW5cbiAqIHVuaGFuZGxlZCBDKysgZXhjZXB0aW9uLCB3aGljaCBpcyBhIGNyYXNoIGJ1dCBub3QgYW4gTlRTVEFUVVMuIEEgc2lnbmVkIHJlYWRpbmcgb2YgdGhlIHNhbWUgY29kZSBpcyBhY2NlcHRlZFxuICogdG9vLiBObyBsaW50ZXIsIGNvbXBpbGVyIG9yIHRlc3QgcnVubmVyIHJldHVybnMgYSBjb2RlIG9mIHRoaXMgc2hhcGUgYXMgYSBjb3VudCBvZiBmaW5kaW5ncy5cbiAqXG4gKiBAcGFyYW0gZXhpdENvZGUgLSBUaGUgZXhpdCBjb2RlIHRoZSBjaGlsZCByZXBvcnRlZC5cbiAqIEByZXR1cm5zIFRoZSBjb2RlIGFzIGFuIHVuc2lnbmVkIE5UU1RBVFVTLCBvciBgbnVsbGAgd2hlbiBpdCBpcyBub3QgYW4gTlRTVEFUVVMgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIHRvTnRTdGF0dXMoZXhpdENvZGU6IG51bGwgfCBudW1iZXIpOiBudWxsIHwgbnVtYmVyIHtcbiAgaWYgKGV4aXRDb2RlID09PSBudWxsIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihleGl0Q29kZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEVycm9yIHNldmVyaXR5ICh0b3AgdHdvIGJpdHMgc2V0KSB3aXRoIHRoZSBjdXN0b21lciBiaXQgY2xlYXIgaXMgZXhhY3RseSB0aGUgcmFuZ2UgWzB4QzAwMDAwMDAsIDB4RTAwMDAwMDApLlxuICBjb25zdCBOVFNUQVRVU19FUlJPUl9TVEFSVCA9IDB4QzBfMDBfMDBfMDA7XG4gIGNvbnN0IE5UU1RBVFVTX0VSUk9SX0VORCA9IDB4RTBfMDBfMDBfMDA7XG4gIGNvbnN0IFVJTlQzMl9SQU5HRSA9IDB4MV8wMF8wMF8wMF8wMDtcbiAgY29uc3QgdW5zaWduZWQgPSBleGl0Q29kZSA8IDAgPyBleGl0Q29kZSArIFVJTlQzMl9SQU5HRSA6IGV4aXRDb2RlO1xuICByZXR1cm4gdW5zaWduZWQgPj0gTlRTVEFUVVNfRVJST1JfU1RBUlQgJiYgdW5zaWduZWQgPCBOVFNUQVRVU19FUlJPUl9FTkQgPyB1bnNpZ25lZCA6IG51bGw7XG59XG5cbi8qKlxuICogU2hvcnRlbnMgYSBjb21tYW5kIGZvciBxdW90aW5nIGluIGFuIGVycm9yIG1lc3NhZ2UsIGtlZXBpbmcgaXRzIHN0YXJ0LCB3aGljaCBuYW1lcyB0aGUgcHJvZ3JhbS5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIHNob3J0ZW4uXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZCwgY3V0IHRvIHtAbGluayBNQVhfQ09NTUFORF9MRU5HVEhfSU5fTUVTU0FHRX0gY2hhcmFjdGVycyBwbHVzIGFuIGVsbGlwc2lzIHdoZW4gbG9uZ2VyLlxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZUNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbW1hbmQubGVuZ3RoID4gTUFYX0NPTU1BTkRfTEVOR1RIX0lOX01FU1NBR0UgPyBgJHtjb21tYW5kLnNsaWNlKDAsIE1BWF9DT01NQU5EX0xFTkdUSF9JTl9NRVNTQUdFKX3igKZgIDogY29tbWFuZDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLG1DQUFtQztBQUM1QyxTQUFTLGVBQWU7QUFDeEIsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxhQUFhO0FBQ3RCLE9BQU8sYUFBYTtBQUVwQjtBQUFBLEVBQ0Usd0JBQXdCO0FBQUEsRUFDeEI7QUFBQSxFQUNBO0FBQUEsT0FDSztBQTBKQSxTQUFTLGlCQUFpQixxQkFBeUMsUUFBd0I7QUFDaEcsUUFBTSxXQUFXLHVCQUF1QixJQUFJLEtBQUs7QUFDakQsTUFBSSxZQUFZLElBQUk7QUFDbEIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPLFFBQVEsTUFBTSxLQUFLLEVBQUUsU0FBUyxNQUFNLElBQUksVUFBVSxHQUFHLE9BQU8sSUFBSSxNQUFNO0FBQy9FO0FBYU8sU0FBUyxjQUFjLFNBQTRCLDZCQUFxRTtBQUM3SCxTQUFPO0FBQUEsSUFDTCxjQUFjO0FBQUEsSUFDZCxHQUFHO0FBQUEsSUFDSCxHQUFJLDRCQUE0QixJQUFJLHFCQUFxQixLQUFLLEVBQUUsY0FBYyxpQkFBaUIsUUFBUSxjQUFjLEdBQUcseUJBQXlCLEVBQUU7QUFBQSxFQUNySjtBQUNGO0FBMENPLFNBQVMsS0FBSyxTQUFpQyxVQUF1QixDQUFDLEdBQWlDO0FBQzdHLE1BQUksTUFBTSxRQUFRLE9BQU8sR0FBRztBQUMxQixVQUFN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
|