obsidian-dev-utils 51.0.1 → 51.1.6
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/CHANGELOG.md +30 -0
- package/dist/lib/cjs/async.cjs +2 -2
- package/dist/lib/cjs/blob.cjs +2 -2
- package/dist/lib/cjs/debug.cjs +7 -8
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/object-utils.cjs +23 -23
- package/dist/lib/cjs/obsidian/app.cjs +4 -3
- package/dist/lib/cjs/obsidian/components/setting-components/multiple-file-component.cjs +3 -2
- package/dist/lib/cjs/obsidian/components/setting-components/typed-text-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/setting-components/validator-component.cjs +2 -2
- package/dist/lib/cjs/obsidian/constructors/getDomEventsHandlersConstructor.cjs +1 -1
- package/dist/lib/cjs/obsidian/constructors/getDomEventsHandlersConstructor.d.cts +3 -1
- package/dist/lib/cjs/obsidian/dataview-link.cjs +1 -1
- package/dist/lib/cjs/obsidian/dataview-link.d.cts +1 -1
- package/dist/lib/cjs/obsidian/file-change.cjs +1 -1
- package/dist/lib/cjs/obsidian/file-system.cjs +2 -2
- package/dist/lib/cjs/obsidian/i18n/custom-type-options-base.cjs +1 -1
- package/dist/lib/cjs/obsidian/i18n/custom-type-options-base.d.cts +12 -6
- package/dist/lib/cjs/obsidian/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/is-in-obsidian.cjs +143 -0
- package/dist/lib/cjs/obsidian/is-in-obsidian.d.cts +11 -0
- package/dist/lib/cjs/obsidian/link.cjs +37 -37
- package/dist/lib/cjs/obsidian/markdown.cjs +1 -1
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -2
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +1 -1
- package/dist/lib/cjs/obsidian/plugin/path-settings.cjs +4 -5
- package/dist/lib/cjs/obsidian/plugin/plugin-settings-manager-base.cjs +2 -2
- package/dist/lib/cjs/obsidian/rename-delete-handler.cjs +2 -2
- package/dist/lib/cjs/obsidian/resource-url.cjs +3 -2
- package/dist/lib/cjs/obsidian/vault.cjs +2 -2
- package/dist/lib/cjs/reg-exp.cjs +5 -6
- package/dist/lib/cjs/script-utils/build.cjs +5 -5
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/changeExtensionPlugin.cjs +3 -3
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copyToObsidianPluginsFolderPlugin.cjs +12 -11
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/dependency.cjs +4 -4
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fixSourceMapsPlugin.cjs +6 -5
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +15 -12
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/preprocessPlugin.cjs +3 -3
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/renameCssPlugin.cjs +5 -4
- package/dist/lib/cjs/script-utils/bundlers/esbuild.cjs +1 -1
- package/dist/lib/cjs/script-utils/cli-utils.cjs +14 -4
- package/dist/lib/cjs/script-utils/code-generator.cjs +3 -3
- package/dist/lib/cjs/script-utils/commitlint-config.cjs +134 -0
- package/dist/lib/cjs/script-utils/commitlint-config.d.cts +10 -0
- package/dist/lib/cjs/script-utils/exec.cjs +99 -10
- package/dist/lib/cjs/script-utils/exec.d.cts +35 -6
- package/dist/lib/cjs/script-utils/formatters/dprint.cjs +8 -6
- package/dist/lib/cjs/script-utils/formatters/dprint.d.cts +15 -2
- package/dist/lib/cjs/script-utils/fs.cjs +8 -11
- package/dist/lib/cjs/script-utils/fs.d.cts +1 -1
- package/dist/lib/cjs/script-utils/index.cjs +7 -4
- package/dist/lib/cjs/script-utils/index.d.cts +2 -1
- package/dist/lib/cjs/script-utils/json.cjs +9 -8
- package/dist/lib/cjs/script-utils/linters/cspell.cjs +5 -3
- package/dist/lib/cjs/script-utils/linters/cspell.d.cts +14 -1
- package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +32 -20
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +142 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-params.cjs +174 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-params.d.cts +12 -0
- package/dist/lib/cjs/script-utils/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.cts +4 -2
- package/dist/lib/cjs/script-utils/linters/eslint.cjs +9 -6
- package/dist/lib/cjs/script-utils/linters/eslint.d.cts +15 -2
- package/dist/lib/cjs/script-utils/linters/index.cjs +4 -1
- package/dist/lib/cjs/script-utils/linters/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +13 -10
- package/dist/lib/cjs/script-utils/linters/markdownlint.d.cts +15 -2
- package/dist/lib/cjs/script-utils/nano-staged-config.cjs +143 -0
- package/dist/lib/cjs/script-utils/nano-staged-config.d.cts +14 -0
- package/dist/lib/cjs/script-utils/npm-publish.cjs +16 -5
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +2 -1
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +2 -0
- package/dist/lib/cjs/script-utils/root.cjs +3 -3
- package/dist/lib/cjs/script-utils/root.d.cts +3 -7
- package/dist/lib/cjs/script-utils/test-runners/vitest.cjs +6 -3
- package/dist/lib/cjs/script-utils/test-runners/vitest.d.cts +12 -1
- package/dist/lib/cjs/script-utils/version.cjs +22 -31
- package/dist/lib/cjs/string.cjs +4 -13
- package/dist/lib/cjs/string.d.cts +2 -2
- package/dist/lib/cjs/type-guards.cjs +8 -1
- package/dist/lib/cjs/type-guards.d.cts +11 -1
- package/dist/lib/esm/async.mjs +6 -3
- package/dist/lib/esm/blob.mjs +2 -2
- package/dist/lib/esm/debug.mjs +5 -6
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/object-utils.mjs +24 -23
- package/dist/lib/esm/obsidian/app.mjs +4 -3
- package/dist/lib/esm/obsidian/components/setting-components/multiple-file-component.mjs +3 -2
- package/dist/lib/esm/obsidian/components/setting-components/typed-text-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/setting-components/validator-component.mjs +2 -2
- package/dist/lib/esm/obsidian/constructors/getDomEventsHandlersConstructor.d.mts +3 -1
- package/dist/lib/esm/obsidian/constructors/getDomEventsHandlersConstructor.mjs +1 -1
- package/dist/lib/esm/obsidian/dataview-link.d.mts +1 -1
- package/dist/lib/esm/obsidian/dataview-link.mjs +1 -1
- package/dist/lib/esm/obsidian/file-change.mjs +1 -1
- package/dist/lib/esm/obsidian/file-system.mjs +3 -2
- package/dist/lib/esm/obsidian/i18n/custom-type-options-base.d.mts +12 -6
- package/dist/lib/esm/obsidian/i18n/custom-type-options-base.mjs +1 -1
- package/dist/lib/esm/obsidian/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/index.mjs +3 -1
- package/dist/lib/esm/obsidian/is-in-obsidian.d.mts +11 -0
- package/dist/lib/esm/obsidian/is-in-obsidian.mjs +39 -0
- package/dist/lib/esm/obsidian/link.mjs +38 -41
- package/dist/lib/esm/obsidian/markdown.mjs +1 -1
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +1 -1
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -2
- package/dist/lib/esm/obsidian/plugin/path-settings.mjs +4 -5
- package/dist/lib/esm/obsidian/plugin/plugin-settings-manager-base.mjs +3 -2
- package/dist/lib/esm/obsidian/rename-delete-handler.mjs +6 -3
- package/dist/lib/esm/obsidian/resource-url.mjs +3 -2
- package/dist/lib/esm/obsidian/vault.mjs +3 -2
- package/dist/lib/esm/reg-exp.mjs +5 -6
- package/dist/lib/esm/script-utils/build.mjs +6 -6
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/changeExtensionPlugin.mjs +2 -2
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copyToObsidianPluginsFolderPlugin.mjs +8 -8
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/dependency.mjs +5 -5
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fixSourceMapsPlugin.mjs +5 -5
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +10 -11
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/preprocessPlugin.mjs +2 -2
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/renameCssPlugin.mjs +3 -5
- package/dist/lib/esm/script-utils/bundlers/esbuild.mjs +1 -1
- package/dist/lib/esm/script-utils/cli-utils.mjs +2 -2
- package/dist/lib/esm/script-utils/code-generator.mjs +2 -2
- package/dist/lib/esm/script-utils/commitlint-config.d.mts +10 -0
- package/dist/lib/esm/script-utils/commitlint-config.mjs +28 -0
- package/dist/lib/esm/script-utils/exec.d.mts +35 -6
- package/dist/lib/esm/script-utils/exec.mjs +84 -8
- package/dist/lib/esm/script-utils/formatters/dprint.d.mts +15 -2
- package/dist/lib/esm/script-utils/formatters/dprint.mjs +6 -4
- package/dist/lib/esm/script-utils/fs.d.mts +1 -1
- package/dist/lib/esm/script-utils/fs.mjs +5 -8
- package/dist/lib/esm/script-utils/index.d.mts +2 -1
- package/dist/lib/esm/script-utils/index.mjs +5 -3
- package/dist/lib/esm/script-utils/json.mjs +7 -5
- package/dist/lib/esm/script-utils/linters/cspell.d.mts +14 -1
- package/dist/lib/esm/script-utils/linters/cspell.mjs +5 -3
- package/dist/lib/esm/script-utils/linters/eslint-config.mjs +32 -20
- package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +26 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-params.d.mts +12 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-params.mjs +68 -0
- package/dist/lib/esm/script-utils/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.mts +4 -2
- package/dist/lib/esm/script-utils/linters/eslint.d.mts +15 -2
- package/dist/lib/esm/script-utils/linters/eslint.mjs +7 -7
- package/dist/lib/esm/script-utils/linters/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/linters/index.mjs +3 -1
- package/dist/lib/esm/script-utils/linters/markdownlint.d.mts +15 -2
- package/dist/lib/esm/script-utils/linters/markdownlint.mjs +13 -11
- package/dist/lib/esm/script-utils/nano-staged-config.d.mts +14 -0
- package/dist/lib/esm/script-utils/nano-staged-config.mjs +37 -0
- package/dist/lib/esm/script-utils/npm-publish.mjs +3 -6
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +2 -0
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +2 -1
- package/dist/lib/esm/script-utils/root.d.mts +3 -7
- package/dist/lib/esm/script-utils/root.mjs +2 -2
- package/dist/lib/esm/script-utils/test-runners/vitest.d.mts +12 -1
- package/dist/lib/esm/script-utils/test-runners/vitest.mjs +6 -3
- package/dist/lib/esm/script-utils/version.mjs +16 -27
- package/dist/lib/esm/string.d.mts +2 -2
- package/dist/lib/esm/string.mjs +7 -13
- package/dist/lib/esm/type-guards.d.mts +11 -1
- package/dist/lib/esm/type-guards.mjs +7 -1
- package/dist/scripts/build/build-clean.ts +4 -0
- package/dist/scripts/build/build-compile-svelte.ts +4 -0
- package/dist/scripts/build/build-compile-typescript.ts +4 -0
- package/dist/scripts/build/build-compile.ts +4 -0
- package/dist/scripts/build/build-static.ts +4 -0
- package/dist/scripts/bundlers/esbuild/build.ts +4 -0
- package/dist/scripts/bundlers/esbuild/dev.ts +4 -0
- package/dist/scripts/formatters/dprint/format-check.ts +8 -0
- package/dist/scripts/formatters/dprint/format.ts +8 -0
- package/dist/scripts/linters/cspell/spellcheck.ts +8 -0
- package/dist/scripts/linters/eslint/lint-fix.ts +8 -0
- package/dist/scripts/linters/eslint/lint.ts +8 -0
- package/dist/scripts/linters/markdownlint/lint-md-fix.ts +8 -0
- package/dist/scripts/linters/markdownlint/lint-md.ts +8 -0
- package/dist/scripts/test-runners/vitest/test-coverage.ts +4 -0
- package/dist/scripts/test-runners/vitest/test-watch.ts +4 -0
- package/dist/scripts/test-runners/vitest/test.ts +4 -0
- package/dist/scripts/version/version.ts +7 -0
- package/obsidian/is-in-obsidian/package.json +6 -0
- package/package.json +30 -4
- package/script-utils/commitlint-config/package.json +6 -0
- package/script-utils/linters/eslint-rules/index/package.json +6 -0
- package/script-utils/linters/eslint-rules/no-used-underscore-params/package.json +6 -0
- package/script-utils/linters/eslint-rules/package.json +6 -0
- package/script-utils/nano-staged-config/package.json +6 -0
- package/dist/lib/cjs/script-utils/linters/eslint-types/@types/@guardian__eslint-plugin-tsdoc-required.d.cts +0 -14
- package/dist/lib/cjs/script-utils/node-modules.cjs +0 -207
- package/dist/lib/cjs/script-utils/node-modules.d.cts +0 -17
- package/dist/lib/esm/script-utils/linters/eslint-types/@types/@guardian__eslint-plugin-tsdoc-required.d.mts +0 -14
- package/dist/lib/esm/script-utils/node-modules.d.mts +0 -17
- package/dist/lib/esm/script-utils/node-modules.mjs +0 -92
- package/dist/scripts/default/build-clean.ts +0 -5
- package/dist/scripts/default/build-compile-svelte.ts +0 -5
- package/dist/scripts/default/build-compile-typescript.ts +0 -5
- package/dist/scripts/default/build-compile.ts +0 -5
- package/dist/scripts/default/build-static.ts +0 -5
- package/dist/scripts/default/build.ts +0 -9
- package/dist/scripts/default/dev.ts +0 -10
- package/dist/scripts/default/format-check.ts +0 -5
- package/dist/scripts/default/format.ts +0 -5
- package/dist/scripts/default/lint-fix.ts +0 -5
- package/dist/scripts/default/lint.ts +0 -5
- package/dist/scripts/default/publish.ts +0 -5
- package/dist/scripts/default/spellcheck.ts +0 -5
- package/dist/scripts/default/version.ts +0 -5
- package/dist/scripts/examples/build.customPlugin.ts +0 -38
- package/dist/scripts/examples/build.svelteConditions.ts +0 -18
- package/dist/scripts/examples/eslint.config.extend.mts +0 -14
- package/dist/scripts/examples/eslint.config.no-dev-utils.mts +0 -15
- package/dist/scripts/examples/format.prettier.ts +0 -25
- package/script-utils/linters/eslint-types/@types/@guardian__eslint-plugin-tsdoc-required/package.json +0 -4
- package/script-utils/node-modules/package.json +0 -6
|
@@ -602,7 +602,7 @@ class RenameHandler {
|
|
|
602
602
|
}
|
|
603
603
|
}
|
|
604
604
|
async handleCaseCollision() {
|
|
605
|
-
if (!this.app.
|
|
605
|
+
if (!(0, import_implementations.getDataAdapterEx)(this.app).insensitive || this.oldPath.toLowerCase() !== this.newPath.toLowerCase()) {
|
|
606
606
|
return false;
|
|
607
607
|
}
|
|
608
608
|
const tempPath = (0, import_path.join)((0, import_path.dirname)(this.newPath), `__temp__${(0, import_path.basename)(this.newPath)}`);
|
|
@@ -834,4 +834,4 @@ async function cleanupParentFolders(app, settings, parentFolderPaths) {
|
|
|
834
834
|
EmptyFolderBehavior,
|
|
835
835
|
registerRenameDeleteHandlers
|
|
836
836
|
});
|
|
837
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3JlbmFtZS1kZWxldGUtaGFuZGxlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGluIE9ic2lkaWFuLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBEZWVwbHkgY291cGxlZCB0byBPYnNpZGlhbiBydW50aW1lOyByZXF1aXJlcyBydW5uaW5nIHZhdWx0IGZvciBtZWFuaW5nZnVsIHRlc3RpbmcuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgRmlsZU1hbmFnZXIsXG4gIFBsdWdpbixcbiAgUmVmZXJlbmNlLFxuICBUQWJzdHJhY3RGaWxlLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7XG4gIExpbmtVcGRhdGUsXG4gIExpbmtVcGRhdGVzSGFuZGxlclxufSBmcm9tICdvYnNpZGlhbi10eXBpbmdzJztcblxuaW1wb3J0IHsgdCB9IGZyb20gJ2kxOG5leHQnO1xuaW1wb3J0IHtcbiAgTm90aWNlLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBJbnRlcm5hbFBsdWdpbk5hbWUgfSBmcm9tICdvYnNpZGlhbi10eXBpbmdzL2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgVXBkYXRlTGlua1BhcmFtcyxcbiAgVXBkYXRlTGlua3NJbkZpbGVQYXJhbXNcbn0gZnJvbSAnLi9saW5rLnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxOZXZlciB9IGZyb20gJy4uL2Fib3J0LWNvbnRyb2xsZXIudHMnO1xuaW1wb3J0IHsgZmlsdGVySW5QbGFjZSB9IGZyb20gJy4uL2FycmF5LnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzLFxuICB0b0pzb25cbn0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4vYXBwLnRzJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQYXRoQ29udGV4dCxcbiAgZ2V0QXR0YWNobWVudEZpbGVQYXRoLFxuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuL2F0dGFjaG1lbnQtcGF0aC50cyc7XG5pbXBvcnQge1xuICBDQU5WQVNfRklMRV9FWFRFTlNJT04sXG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgaXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgaXNOb3RlXG59IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgZWRpdExpbmtzLFxuICBleHRyYWN0TGlua0ZpbGUsXG4gIHVwZGF0ZUxpbmssXG4gIHVwZGF0ZUxpbmtzSW5GaWxlXG59IGZyb20gJy4vbGluay50cyc7XG5pbXBvcnQge1xuICBnZXRBbGxMaW5rcyxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aCxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlLFxuICB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1bixcbiAgdGVtcFJlZ2lzdGVyRmlsZXNBbmRSdW5Bc3luYyxcbiAgdW5yZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZVxufSBmcm9tICcuL21ldGFkYXRhLWNhY2hlLnRzJztcbmltcG9ydCB7IHJlZ2lzdGVyUGF0Y2ggfSBmcm9tICcuL21vbmtleS1hcm91bmQudHMnO1xuaW1wb3J0IHsgYWRkVG9RdWV1ZSB9IGZyb20gJy4vcXVldWUudHMnO1xuaW1wb3J0IHsgZGVsZXRlSWZOb3RVc2VkIH0gZnJvbSAnLi92YXVsdC1kZWxldGUudHMnO1xuaW1wb3J0IHtcbiAgZGVsZXRlRW1wdHlGb2xkZXIsXG4gIGRlbGV0ZUVtcHR5Rm9sZGVySGllcmFyY2h5LFxuICBnZXRTYWZlUmVuYW1lUGF0aCxcbiAgcmVuYW1lU2FmZSxcbiAgdHJhc2hTYWZlXG59IGZyb20gJy4vdmF1bHQudHMnO1xuXG4vKipcbiAqIEEgYmVoYXZpb3Igb2YgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlciB3aGVuIGRlbGV0aW5nIGVtcHR5IGZvbGRlcnMuXG4gKi9cbmV4cG9ydCBlbnVtIEVtcHR5Rm9sZGVyQmVoYXZpb3Ige1xuICAvKipcbiAgICogRGVsZXRlIHRoZSBlbXB0eSBmb2xkZXIuXG4gICAqL1xuICBEZWxldGUgPSAnRGVsZXRlJyxcblxuICAvKipcbiAgICogRGVsZXRlIHRoZSBlbXB0eSBmb2xkZXIgYW5kIGFsbCBpdHMgZW1wdHkgcGFyZW50cy5cbiAgICovXG4gIERlbGV0ZVdpdGhFbXB0eVBhcmVudHMgPSAnRGVsZXRlV2l0aEVtcHR5UGFyZW50cycsXG5cbiAgLyoqXG4gICAqIEtlZXAgdGhlIGVtcHR5IGZvbGRlci5cbiAgICovXG4gIEtlZXAgPSAnS2VlcCdcbn1cblxuLyoqXG4gKiBTZXR0aW5ncyBmb3IgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3Mge1xuICAvKipcbiAgICogQSBiZWhhdmlvciBvZiB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHdoZW4gZGVsZXRpbmcgZW1wdHkgZm9sZGVycy5cbiAgICovXG4gIGVtcHR5Rm9sZGVyQmVoYXZpb3I6IEVtcHR5Rm9sZGVyQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBhdGggaXMgYSBub3RlLlxuICAgKi9cbiAgaXNOb3RlKHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaWdub3JlIHRoZSBwYXRoLlxuICAgKi9cbiAgaXNQYXRoSWdub3JlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBjb25mbGljdGluZyBhdHRhY2htZW50cy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIGRlbGV0aW9ucy5cbiAgICovXG4gIHNob3VsZEhhbmRsZURlbGV0aW9uczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgcmVuYW1lcy5cbiAgICovXG4gIHNob3VsZEhhbmRsZVJlbmFtZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZmlsZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmb2xkZXIgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhc2VzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBYm9ydGFibGVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG5pbnRlcmZhY2UgSGFuZGxlZFJlbmFtZUtleSB7XG4gIG5ld1BhdGg6IHN0cmluZztcbiAgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJydXB0ZWRSZW5hbWUge1xuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlbmFtZUhhbmRsZXJQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBoYW5kbGVkUmVuYW1lczogSGFuZGxlZFJlbmFtZXM7XG4gIHJlYWRvbmx5IGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA/OiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiBNYXA8c3RyaW5nLCBJbnRlcnJ1cHRlZFJlbmFtZVtdPjtcbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVNYXBQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbnR5cGUgUnVuQXN5bmNMaW5rVXBkYXRlRm4gPSB7IHJlbmFtZURlbGV0ZUhhbmRsZXJQYXRjaGVkPzogYm9vbGVhbiB9ICYgRmlsZU1hbmFnZXJbJ3J1bkFzeW5jTGlua1VwZGF0ZSddO1xuXG5jbGFzcyBEZWxldGVIYW5kbGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHAsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+XG4gICkge1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoYEhhbmRsZSBEZWxldGUgJHt0aGlzLmZpbGUucGF0aH1gKTtcbiAgICBpZiAoIWlzTm90ZSh0aGlzLmFwcCwgdGhpcy5maWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4odGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZGlybmFtZSh0aGlzLmZpbGUucGF0aCldKTtcblxuICAgIGlmIChzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5nZXQodGhpcy5maWxlLnBhdGgpO1xuICAgICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5kZWxldGUodGhpcy5maWxlLnBhdGgpO1xuICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGNvbnN0IGxpbmtzID0gZ2V0QWxsTGlua3MoY2FjaGUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHRoaXMuYXBwLCBsaW5rLCB0aGlzLmZpbGUucGF0aCk7XG4gICAgICAgICAgaWYgKCFhdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KGF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJlbnRGb2xkZXJQYXRocy5hZGQoYXR0YWNobWVudEZpbGUucGFyZW50Py5wYXRoID8/ICcnKTtcbiAgICAgICAgICBhd2FpdCBkZWxldGVJZk5vdFVzZWQodGhpcy5hcHAsIGF0dGFjaG1lbnRGaWxlLCB0aGlzLmZpbGUucGF0aCwgZmFsc2UsIHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcCk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyZW50Rm9sZGVyUGF0aHMuZGVsZXRlKCcnKTtcbiAgICBhd2FpdCBjbGVhbnVwUGFyZW50Rm9sZGVycyh0aGlzLmFwcCwgdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKSwgQXJyYXkuZnJvbShwYXJlbnRGb2xkZXJQYXRocykpO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh0aGlzLmFwcCwgdGhpcy5maWxlLnBhdGgsIEF0dGFjaG1lbnRQYXRoQ29udGV4dC5EZWxldGVOb3RlKTtcbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHRoaXMuYXBwLCBhdHRhY2htZW50Rm9sZGVyUGF0aCk7XG5cbiAgICBpZiAoIWF0dGFjaG1lbnRGb2xkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIodGhpcy5hcHAsIHRoaXMuZmlsZS5wYXRoLCBBdHRhY2htZW50UGF0aENvbnRleHQuRGVsZXRlTm90ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBhd2FpdCBkZWxldGVJZk5vdFVzZWQodGhpcy5hcHAsIGF0dGFjaG1lbnRGb2xkZXIsIHRoaXMuZmlsZS5wYXRoLCBmYWxzZSwgc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIH1cbn1cblxuY2xhc3MgSGFuZGxlZFJlbmFtZXMge1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBIYW5kbGVkUmVuYW1lS2V5PigpO1xuXG4gIHB1YmxpYyBhZGQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSwgeyBuZXdQYXRoLCBvbGRQYXRoIH0pO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZShvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLmRlbGV0ZSh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXMob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxIYW5kbGVkUmVuYW1lS2V5PiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLnZhbHVlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBrZXlUb1N0cmluZyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gO1xuICB9XG59XG5cbmNsYXNzIE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmV2Q2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPlxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlTWV0YWRhdGFEZWxldGVkJykoYFNraXBwaW5nIG1ldGFkYXRhIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzTWFya2Rvd25GaWxlKHRoaXMuYXBwLCB0aGlzLmZpbGUpICYmIHRoaXMucHJldkNhY2hlKSB7XG4gICAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLnNldCh0aGlzLmZpbGUucGF0aCwgdGhpcy5wcmV2Q2FjaGUpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBSZWdpc3RyeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzID0gbmV3IEhhbmRsZWRSZW5hbWVzKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW46IEFib3J0YWJsZVBsdWdpbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXJcbiAgKSB7XG4gICAgdGhpcy5hcHAgPSBwbHVnaW4uYXBwO1xuICAgIHRoaXMucGx1Z2luSWQgPSBwbHVnaW4ubWFuaWZlc3QuaWQ7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBsdWdpbi5hYm9ydFNpZ25hbCA/PyBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5yZW5hbWVEZWxldGVIYW5kbGVyc01hcDtcblxuICAgIHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLnNldCh0aGlzLnBsdWdpbklkLCB0aGlzLnNldHRpbmdzQnVpbGRlcik7XG4gICAgdGhpcy5sb2dSZWdpc3RlcmVkSGFuZGxlcnMoKTtcblxuICAgIHRoaXMucGx1Z2luLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmRlbGV0ZSh0aGlzLnBsdWdpbklkKTtcbiAgICAgIHRoaXMubG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnBsdWdpbi5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdkZWxldGUnLCB0aGlzLmhhbmRsZURlbGV0ZS5iaW5kKHRoaXMpKSk7XG4gICAgdGhpcy5wbHVnaW4ucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgdGhpcy5oYW5kbGVSZW5hbWUuYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucGx1Z2luLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIHRoaXMuaGFuZGxlTWV0YWRhdGFEZWxldGVkLmJpbmQodGhpcykpKTtcblxuICAgIHJlZ2lzdGVyUGF0Y2godGhpcy5wbHVnaW4sIHRoaXMuYXBwLmZpbGVNYW5hZ2VyLCB7XG4gICAgICBydW5Bc3luY0xpbmtVcGRhdGU6IChuZXh0OiBSdW5Bc3luY0xpbmtVcGRhdGVGbik6IFJ1bkFzeW5jTGlua1VwZGF0ZUZuID0+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oKGxpbmtVcGRhdGVzSGFuZGxlcikgPT4gdGhpcy5ydW5Bc3luY0xpbmtVcGRhdGUobmV4dCwgbGlua1VwZGF0ZXNIYW5kbGVyKSwgeyByZW5hbWVEZWxldGVIYW5kbGVyUGF0Y2hlZDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGVsZXRlKGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSW52b2tlSGFuZGxlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFkZFRvUXVldWUoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIG9wZXJhdGlvbkZuOiAoYWJvcnRTaWduYWwpID0+IG5ldyBEZWxldGVIYW5kbGVyKHRoaXMuYXBwLCBmaWxlLCBhYm9ydFNpZ25hbCwgdGhpcy5zZXR0aW5nc01hbmFnZXIsIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXApLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlRGVsZXRlLCB7IGZpbGVQYXRoOiBmaWxlLnBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTWV0YWRhdGFEZWxldGVkKGZpbGU6IFRBYnN0cmFjdEZpbGUsIHByZXZDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3VsZEludm9rZUhhbmRsZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBuZXcgTWV0YWRhdGFEZWxldGVkSGFuZGxlcih0aGlzLmFwcCwgZmlsZSwgcHJldkNhY2hlLCB0aGlzLnNldHRpbmdzTWFuYWdlciwgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCkuaGFuZGxlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlbmFtZShmaWxlOiBUQWJzdHJhY3RGaWxlLCBvbGRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSW52b2tlSGFuZGxlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc0ZpbGUoZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQYXRoID0gZmlsZS5wYXRoO1xuXG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYEhhbmRsZSBSZW5hbWUgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YCk7XG4gICAgaWYgKHRoaXMuaGFuZGxlZFJlbmFtZXMuaGFzKG9sZFBhdGgsIG5ld1BhdGgpKSB7XG4gICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG9sZCBwYXRoICR7b2xkUGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgbmV3IHBhdGggJHtuZXdQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG5ld1BhdGgpO1xuICAgIGNvbnN0IG9sZFBhdGhCYWNrbGlua3NNYXAgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKHRoaXMuYXBwLCBvbGRQYXRoKS5kYXRhO1xuICAgIGFkZFRvUXVldWUoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgb3BlcmF0aW9uRm46IChhYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgICAgICBuZXdQYXRoLFxuICAgICAgICAgIG9sZENhY2hlLFxuICAgICAgICAgIG9sZFBhdGgsXG4gICAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlUmVuYW1lLCB7IG5ld1BhdGgsIG9sZFBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6bG9nUmVnaXN0ZXJlZEhhbmRsZXJzJykoXG4gICAgICBgUGx1Z2lucyB3aXRoIHJlZ2lzdGVyZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyczogJHtKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmtleXMoKSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5Bc3luY0xpbmtVcGRhdGUobmV4dDogUnVuQXN5bmNMaW5rVXBkYXRlRm4sIGxpbmtVcGRhdGVzSGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG5leHQucmVuYW1lRGVsZXRlSGFuZGxlclBhdGNoZWQpIHtcbiAgICAgIGF3YWl0IG5leHQuY2FsbCh0aGlzLmFwcC5maWxlTWFuYWdlciwgbGlua1VwZGF0ZXNIYW5kbGVyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgbmV4dC5jYWxsKHRoaXMuYXBwLmZpbGVNYW5hZ2VyLCAobGlua1VwZGF0ZXMpID0+IHRoaXMud3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcywgbGlua1VwZGF0ZXNIYW5kbGVyKSk7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZEludm9rZUhhbmRsZXIoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGx1Z2luSWQgPSB0aGlzLnBsdWdpbi5tYW5pZmVzdC5pZDtcblxuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG4gICAgY29uc3QgbWFpblBsdWdpbklkID0gQXJyYXkuZnJvbShyZW5hbWVEZWxldGVIYW5kbGVyc01hcC5rZXlzKCkpWzBdO1xuICAgIHJldHVybiBtYWluUGx1Z2luSWQgPT09IHBsdWdpbklkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cmFwTGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzOiBMaW5rVXBkYXRlW10sIGxpbmtVcGRhdGVzSGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGlzUmVuYW1lQ2FsbGVkID0gZmFsc2U7XG4gICAgY29uc3QgZXZlbnRSZWYgPSB0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgKCkgPT4ge1xuICAgICAgaXNSZW5hbWVDYWxsZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBsaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmFwcC52YXVsdC5vZmZyZWYoZXZlbnRSZWYpO1xuICAgIH1cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gSXQgbWlnaHQgY2hhbmdlZCBpbiBgcmVuYW1lYCBldmVudCBoYW5kbGVyLiBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gICAgaWYgKCFpc1JlbmFtZUNhbGxlZCB8fCAhc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZpbHRlckluUGxhY2UoXG4gICAgICBsaW5rVXBkYXRlcyxcbiAgICAgIChsaW5rVXBkYXRlKSA9PiB7XG4gICAgICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obGlua1VwZGF0ZS5zb3VyY2VGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6cnVuQXN5bmNMaW5rVXBkYXRlJykoXG4gICAgICAgICAgICBgUm9sbCBiYWNrIHRvIGRlZmF1bHQgbGluayB1cGRhdGUgb2Ygc291cmNlIGZpbGUgJHtsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUucGF0aCkpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiByZXNvbHZlZCBmaWxlICR7bGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5hcHAuaW50ZXJuYWxQbHVnaW5zLmdldEVuYWJsZWRQbHVnaW5CeUlkKEludGVybmFsUGx1Z2luTmFtZS5DYW52YXMpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKCdiYWNrbGluay1jYWNoZScpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpbmtVcGRhdGUuc291cmNlRmlsZS5leHRlbnNpb24gPT09IENBTlZBU19GSUxFX0VYVEVOU0lPTikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLmV4dGVuc2lvbiA9PT0gQ0FOVkFTX0ZJTEVfRVhURU5TSU9OKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5jbGFzcyBTZXR0aW5nc01hbmFnZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA6IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHApIHtcbiAgICB0aGlzLnJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID1cbiAgICAgIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZShhcHAsICdyZW5hbWVEZWxldGVIYW5kbGVyc01hcCcsIG5ldyBNYXA8c3RyaW5nLCAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4+KCkpLnZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldFNldHRpbmdzKCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gICAgY29uc3Qgc2V0dGluZ3NCdWlsZGVycyA9IEFycmF5LmZyb20odGhpcy5yZW5hbWVEZWxldGVIYW5kbGVyc01hcC52YWx1ZXMoKSkucmV2ZXJzZSgpO1xuXG4gICAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiA9IHt9O1xuICAgIHNldHRpbmdzLmlzTm90ZSA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzTm90ZSh0aGlzLmFwcCwgcGF0aCk7XG4gICAgc2V0dGluZ3MuaXNQYXRoSWdub3JlZCA9ICgpOiBib29sZWFuID0+IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBzZXR0aW5nc0J1aWxkZXIgb2Ygc2V0dGluZ3NCdWlsZGVycykge1xuICAgICAgY29uc3QgbmV3U2V0dGluZ3MgPSBzZXR0aW5nc0J1aWxkZXIoKTtcbiAgICAgIHNldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMgfHw9IG5ld1NldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMgPz8gZmFsc2U7XG4gICAgICBpZiAobmV3U2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvcikge1xuICAgICAgICBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/PSBuZXdTZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yO1xuICAgICAgfVxuICAgICAgc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMgPz8gZmFsc2U7XG4gICAgICBzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzID8/IGZhbHNlO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMgPz8gZmFsc2U7XG4gICAgICBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyID8/IGZhbHNlO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXMgPz8gZmFsc2U7XG4gICAgICBjb25zdCBpc1BhdGhJZ25vcmVkID0gc2V0dGluZ3MuaXNQYXRoSWdub3JlZDtcbiAgICAgIHNldHRpbmdzLmlzUGF0aElnbm9yZWQgPSAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBpc1BhdGhJZ25vcmVkKHBhdGgpIHx8IChuZXdTZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ocGF0aCkgPz8gZmFsc2UpO1xuICAgICAgY29uc3QgY3VycmVudElzTm90ZSA9IHNldHRpbmdzLmlzTm90ZTtcbiAgICAgIHNldHRpbmdzLmlzTm90ZSA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGN1cnJlbnRJc05vdGUocGF0aCkgJiYgKG5ld1NldHRpbmdzLmlzTm90ZT8uKHBhdGgpID8/IHRydWUpO1xuICAgIH1cblxuICAgIHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz89IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcDtcbiAgICByZXR1cm4gc2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgaXNOb3RlRXgocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKCk7XG4gICAgcmV0dXJuIHNldHRpbmdzLmlzTm90ZT8uKHBhdGgpID8/IGZhbHNlO1xuICB9XG59XG5cbmNsYXNzIFJlbmFtZUhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVkUmVuYW1lczogSGFuZGxlZFJlbmFtZXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiBNYXA8c3RyaW5nLCBJbnRlcnJ1cHRlZFJlbmFtZVtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lSGFuZGxlclBhcmFtcykge1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLm9sZFBhdGggPSBwYXJhbXMub2xkUGF0aDtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAgPSBwYXJhbXMub2xkUGF0aEJhY2tsaW5rc01hcDtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICAgIHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gcGFyYW1zLmludGVycnVwdGVkUmVuYW1lc01hcDtcbiAgICB0aGlzLm9sZFBhdGhMaW5rcyA9IHRoaXMub2xkQ2FjaGUgPyBnZXRBbGxMaW5rcyh0aGlzLm9sZENhY2hlKSA6IFtdO1xuICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMgPSBwYXJhbXMuaGFuZGxlZFJlbmFtZXM7XG4gICAgdGhpcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwID0gcGFyYW1zLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPz8gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm9sZFBhdGggPT09IHRoaXMubmV3UGF0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgYXdhaXQgdGhpcy5jb250aW51ZUludGVycnVwdGVkUmVuYW1lcygpO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2hMaW5rcygpO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVDYXNlQ29sbGlzaW9uKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBjb25zdCByZW5hbWVkRmlsZVBhdGhzID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKHRoaXMuYXBwLCAncmVuYW1lZEZpbGVQYXRocycsIG5ldyBTZXQ8c3RyaW5nPigpKS52YWx1ZTtcbiAgICBjb25zdCByZW5hbWVkTGlua3MgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUodGhpcy5hcHAsICdyZW5hbWVkTGlua1BhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbmFtZU1hcCA9IG5ldyBSZW5hbWVNYXAoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHJlbmFtZU1hcC5maWxsKCk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGNvbnN0IGNvbWJpbmVkQmFja2xpbmtzTWFwID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG4gICAgICByZW5hbWVNYXAuaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXApO1xuICAgICAgcmVuYW1lTWFwLmluaXRCYWNrbGlua3NNYXAodGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLCBjb21iaW5lZEJhY2tsaW5rc01hcCwgdGhpcy5vbGRQYXRoKTtcblxuICAgICAgZm9yIChjb25zdCBhdHRhY2htZW50T2xkUGF0aCBvZiByZW5hbWVNYXAua2V5cygpKSB7XG4gICAgICAgIGlmIChhdHRhY2htZW50T2xkUGF0aCA9PT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXAgPSAoYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUodGhpcy5hcHAsIGF0dGFjaG1lbnRPbGRQYXRoKSkuZGF0YTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICByZW5hbWVNYXAuaW5pdEJhY2tsaW5rc01hcChhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcCwgY29tYmluZWRCYWNrbGlua3NNYXAsIGF0dGFjaG1lbnRPbGRQYXRoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50Rm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgZm9yIChjb25zdCBbb2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoXSBvZiByZW5hbWVNYXAuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChvbGRBdHRhY2htZW50UGF0aCAhPT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgY29uc3QgZml4ZWROZXdBdHRhY2htZW50UGF0aCA9IGF3YWl0IHRoaXMucmVuYW1lSGFuZGxlZChvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICByZW5hbWVNYXAuc2V0KG9sZEF0dGFjaG1lbnRQYXRoLCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KG9sZEF0dGFjaG1lbnRQYXRoKSkge1xuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChkaXJuYW1lKG9sZEF0dGFjaG1lbnRQYXRoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgY2xlYW51cFBhcmVudEZvbGRlcnModGhpcy5hcHAsIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCksIEFycmF5LmZyb20ocGFyZW50Rm9sZGVyUGF0aHMpKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgICAgZm9yIChcbiAgICAgICAgY29uc3QgW25ld0JhY2tsaW5rUGF0aCwgbGlua0pzb25Ub1BhdGhNYXBdIG9mIEFycmF5LmZyb20oY29tYmluZWRCYWNrbGlua3NNYXAuZW50cmllcygpKS5jb25jYXQoXG4gICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAuZW50cmllcygpKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbGV0IGxpbmtJbmRleCA9IDA7XG4gICAgICAgIGF3YWl0IGVkaXRMaW5rcyh0aGlzLmFwcCwgbmV3QmFja2xpbmtQYXRoLCAobGluaykgPT4ge1xuICAgICAgICAgIGxpbmtJbmRleCsrO1xuICAgICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRQYXRoID0gbGlua0pzb25Ub1BhdGhNYXAuZ2V0KHRvSnNvbihsaW5rKSk7XG4gICAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50UGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gcmVuYW1lTWFwLmdldChvbGRBdHRhY2htZW50UGF0aCkgPz8gb2xkQXR0YWNobWVudFBhdGg7XG5cbiAgICAgICAgICByZW5hbWVkRmlsZVBhdGhzLmFkZChuZXdCYWNrbGlua1BhdGgpO1xuICAgICAgICAgIHJlbmFtZWRMaW5rcy5hZGQoYCR7bmV3QmFja2xpbmtQYXRofS8vJHtTdHJpbmcobGlua0luZGV4KX1gKTtcblxuICAgICAgICAgIHJldHVybiB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgbGluayxcbiAgICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgb2xkVGFyZ2V0UGF0aE9yRmlsZTogb2xkQXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTm90ZSh0aGlzLmFwcCwgdGhpcy5uZXdQYXRoKSkge1xuICAgICAgICBhd2FpdCB1cGRhdGVMaW5rc0luRmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua3NJbkZpbGVQYXJhbXM+KHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlc1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFnZXRGaWxlT3JOdWxsKHRoaXMuYXBwLCB0aGlzLm5ld1BhdGgpKSB7XG4gICAgICAgIGxldCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5nZXQodGhpcy5uZXdQYXRoKTtcbiAgICAgICAgaWYgKCFpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5zZXQodGhpcy5uZXdQYXRoLCBpbnRlcnJ1cHRlZFJlbmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIGludGVycnVwdGVkUmVuYW1lcy5wdXNoKHtcbiAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnN0IG9ycGhhbktleXMgPSBBcnJheS5mcm9tKHRoaXMuaGFuZGxlZFJlbmFtZXMua2V5cygpKTtcbiAgICAgIGFkZFRvUXVldWUoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgb3BlcmF0aW9uRm46ICgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG9ycGhhbktleSBvZiBvcnBoYW5LZXlzKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvcnBoYW5LZXkub2xkUGF0aCwgb3JwaGFuS2V5Lm5ld1BhdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZW5hbWVkTGlua3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXcgTm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLnVwZGF0ZWRMaW5rcywgeyBmaWxlc0NvdW50OiByZW5hbWVkRmlsZVBhdGhzLnNpemUsIGxpbmtzQ291bnQ6IHJlbmFtZWRMaW5rcy5zaXplIH0pKTtcbiAgICAgICAgICByZW5hbWVkRmlsZVBhdGhzLmNsZWFyKCk7XG4gICAgICAgICAgcmVuYW1lZExpbmtzLmNsZWFyKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZU9ycGhhbmVkUmVuYW1lcylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMub2xkUGF0aCk7XG4gICAgaWYgKGludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZGVsZXRlKHRoaXMub2xkUGF0aCk7XG4gICAgICBmb3IgKGNvbnN0IGludGVycnVwdGVkUmVuYW1lIG9mIGludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgICBhd2FpdCBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgICAgICBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwOiBpbnRlcnJ1cHRlZFJlbmFtZS5jb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICAgIG5ld1BhdGg6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgICBvbGRQYXRoOiBpbnRlcnJ1cHRlZFJlbmFtZS5vbGRQYXRoLFxuICAgICAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ2FzZUNvbGxpc2lvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuaW5zZW5zaXRpdmUgfHwgdGhpcy5vbGRQYXRoLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMubmV3UGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcFBhdGggPSBqb2luKGRpcm5hbWUodGhpcy5uZXdQYXRoKSwgYF9fdGVtcF9fJHtiYXNlbmFtZSh0aGlzLm5ld1BhdGgpfWApO1xuICAgIGF3YWl0IHRoaXMucmVuYW1lSGFuZGxlZCh0aGlzLm5ld1BhdGgsIHRlbXBQYXRoKTtcblxuICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgIG5ld1BhdGg6IHRlbXBQYXRoLFxuICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG5cbiAgICBhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKGdldEZpbGUodGhpcy5hcHAsIHRlbXBQYXRoKSwgdGhpcy5uZXdQYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaExpbmtzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZSh0aGlzLm9sZFBhdGgpID8/IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUodGhpcy5uZXdQYXRoKTtcbiAgICBjb25zdCBvbGRQYXRoTGlua3NSZWZyZXNoZWQgPSBjYWNoZSA/IGdldEFsbExpbmtzKGNhY2hlKSA6IFtdO1xuICAgIGNvbnN0IGZha2VPbGRGaWxlID0gZ2V0RmlsZSh0aGlzLmFwcCwgdGhpcy5vbGRQYXRoLCB0cnVlKTtcbiAgICBsZXQgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCA9IG5ldyBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4oKTtcbiAgICBhd2FpdCB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1bih0aGlzLmFwcCwgW2Zha2VPbGRGaWxlXSwgYXN5bmMgKCkgPT4ge1xuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCA9IChhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh0aGlzLmFwcCwgZmFrZU9sZEZpbGUpKS5kYXRhO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBsaW5rIG9mIG9sZFBhdGhMaW5rc1JlZnJlc2hlZCkge1xuICAgICAgaWYgKHRoaXMub2xkUGF0aExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5vbGRQYXRoTGlua3MucHVzaChsaW5rKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIHJlZnJlc2hlZExpbmtzXSBvZiBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkLmVudHJpZXMoKSkge1xuICAgICAgbGV0IG9sZExpbmtzID0gdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLmdldChiYWNrbGlua1BhdGgpO1xuICAgICAgaWYgKCFvbGRMaW5rcykge1xuICAgICAgICBvbGRMaW5rcyA9IFtdO1xuICAgICAgICB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAuc2V0KGJhY2tsaW5rUGF0aCwgb2xkTGlua3MpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgcmVmcmVzaGVkTGlua3MpIHtcbiAgICAgICAgaWYgKG9sZExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgb2xkTGlua3MucHVzaChsaW5rKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmFtZUhhbmRsZWQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIG5ld1BhdGggPSBnZXRTYWZlUmVuYW1lUGF0aCh0aGlzLmFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgaWYgKG9sZFBhdGggPT09IG5ld1BhdGgpIHtcbiAgICAgIHJldHVybiBuZXdQYXRoO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmFkZChvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICBuZXdQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh0aGlzLmFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbn1cblxuY2xhc3MgUmVuYW1lTWFwIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVNYXBQYXJhbXMpIHtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5vbGRDYWNoZSA9IHBhcmFtcy5vbGRDYWNoZTtcbiAgICB0aGlzLm9sZFBhdGggPSBwYXJhbXMub2xkUGF0aDtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZFBhdGhMaW5rcyA9IHRoaXMub2xkQ2FjaGUgPyBnZXRBbGxMaW5rcyh0aGlzLm9sZENhY2hlKSA6IFtdO1xuICB9XG5cbiAgcHVibGljIGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBzdHJpbmddPiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmVudHJpZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmaWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5vbGRQYXRoLCB0aGlzLm5ld1BhdGgpO1xuXG4gICAgaWYgKCFpc05vdGUodGhpcy5hcHAsIHRoaXMub2xkUGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBjb25zdCBvbGRGaWxlID0gZ2V0RmlsZSh0aGlzLmFwcCwgdGhpcy5vbGRQYXRoLCB0cnVlKTtcbiAgICBsZXQgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSAnJztcbiAgICBhd2FpdCB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1bkFzeW5jKHRoaXMuYXBwLCBbb2xkRmlsZV0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEZha2VPbGRQYXRoQ2FjaGUgPSB0aGlzLm9sZENhY2hlICYmIG9sZEZpbGUuZGVsZXRlZDtcbiAgICAgIGlmIChzaG91bGRGYWtlT2xkUGF0aENhY2hlKSB7XG4gICAgICAgIHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKHRoaXMuYXBwLCBvbGRGaWxlLCB0aGlzLm9sZENhY2hlKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh0aGlzLmFwcCwgdGhpcy5vbGRQYXRoLCBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoc2hvdWxkRmFrZU9sZFBhdGhDYWNoZSkge1xuICAgICAgICAgIHVucmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUodGhpcy5hcHAsIG9sZEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCA9IHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXJcbiAgICAgID8gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgodGhpcy5hcHAsIHRoaXMubmV3UGF0aCwgQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUpXG4gICAgICA6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoO1xuXG4gICAgY29uc3QgaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID0gb2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09ICcvJztcblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwodGhpcy5hcHAsIG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKTtcblxuICAgIGlmICghb2xkQXR0YWNobWVudEZvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gbmV3QXR0YWNobWVudEZvbGRlclBhdGggJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlczogVEZpbGVbXSA9IFtdO1xuXG4gICAgaWYgKGF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIodGhpcy5hcHAsIHRoaXMub2xkUGF0aCwgQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUpKSB7XG4gICAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4ob2xkQXR0YWNobWVudEZvbGRlciwgKG9sZEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgaWYgKGlzRmlsZShvbGRBdHRhY2htZW50RmlsZSkpIHtcbiAgICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IG9sZFBhdGhMaW5rIG9mIHRoaXMub2xkUGF0aExpbmtzKSB7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUodGhpcy5hcHAsIG9sZFBhdGhMaW5rLCB0aGlzLm9sZFBhdGgpO1xuICAgICAgICBpZiAoIW9sZEF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290IHx8IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGguc3RhcnRzV2l0aChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50QmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUodGhpcy5hcHAsIG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IG5ldyBTZXQ8c3RyaW5nPihvbGRBdHRhY2htZW50QmFja2xpbmtzLmtleXMoKSk7XG4gICAgICAgICAga2V5cy5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgICAgICBrZXlzLmRlbGV0ZSh0aGlzLm5ld1BhdGgpO1xuICAgICAgICAgIGlmIChrZXlzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlIG9mIG9sZEF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3QXR0YWNobWVudEZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGaWxlUGF0aCh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50RmlsZSxcbiAgICAgICAgICBvbGROb3RlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVjazogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID8gb2xkQXR0YWNobWVudEZpbGUucGF0aCA6IHJlbGF0aXZlKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoLCBvbGRBdHRhY2htZW50RmlsZS5wYXRoKTtcbiAgICAgICAgY29uc3QgbmV3Rm9sZGVyID0gam9pbihuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCwgZGlybmFtZShyZWxhdGl2ZVBhdGgpKTtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gam9pbihuZXdGb2xkZXIsIG9sZEF0dGFjaG1lbnRGaWxlLm5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkQXR0YWNobWVudEZpbGUucGF0aCA9PT0gbmV3QXR0YWNobWVudEZpbGVQYXRoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMpIHtcbiAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudEZpbGUgPSBnZXRGaWxlT3JOdWxsKHRoaXMuYXBwLCBuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgICAgICBpZiAobmV3QXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpmaWxsUmVuYW1lTWFwJykoYFJlbW92aW5nIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnQgJHtuZXdBdHRhY2htZW50RmlsZS5wYXRofS5gKTtcbiAgICAgICAgICBhd2FpdCB0cmFzaFNhZmUodGhpcy5hcHAsIG5ld0F0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRpciA9IGRpcm5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgZXh0ID0gZXh0bmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGJhc2VuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCwgZXh0KTtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gdGhpcy5hcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aChqb2luKGRpciwgYmFzZU5hbWUpLCBleHQuc2xpY2UoMSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXAuc2V0KG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldChvbGRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1hcC5nZXQob2xkUGF0aCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdEJhY2tsaW5rc01hcChcbiAgICBzaW5nbGVCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPixcbiAgICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4sXG4gICAgcGF0aDogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2JhY2tsaW5rUGF0aCwgbGlua3NdIG9mIHNpbmdsZUJhY2tsaW5rc01hcC5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IG5ld0JhY2tsaW5rUGF0aCA9IHRoaXMubWFwLmdldChiYWNrbGlua1BhdGgpID8/IGJhY2tsaW5rUGF0aDtcbiAgICAgIGNvbnN0IGxpbmtKc29uVG9QYXRoTWFwID0gY29tYmluZWRCYWNrbGlua3NNYXAuZ2V0KG5ld0JhY2tsaW5rUGF0aCkgPz8gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLnNldChuZXdCYWNrbGlua1BhdGgsIGxpbmtKc29uVG9QYXRoTWFwKTtcbiAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICBsaW5rSnNvblRvUGF0aE1hcC5zZXQodG9Kc29uKGxpbmspLCBwYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvbGRQYXRoTGluayBvZiB0aGlzLm9sZFBhdGhMaW5rcykge1xuICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUodGhpcy5hcHAsIG9sZFBhdGhMaW5rLCB0aGlzLm9sZFBhdGgpO1xuICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4oKTtcbiAgICAgIGJhY2tsaW5rc01hcC5zZXQodGhpcy5uZXdQYXRoLCBbb2xkUGF0aExpbmtdKTtcbiAgICAgIHRoaXMuaW5pdEJhY2tsaW5rc01hcChiYWNrbGlua3NNYXAsIGNvbWJpbmVkQmFja2xpbmtzTWFwLCBvbGRBdHRhY2htZW50RmlsZS5wYXRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5rZXlzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KG9sZFBhdGgsIG5ld1BhdGgpO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXJzLlxuICpcbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIGluc3RhbmNlLlxuICogQHBhcmFtIHNldHRpbmdzQnVpbGRlciAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzZXR0aW5ncyBmb3IgdGhlIHJlbmFtZSBkZWxldGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUmVuYW1lRGVsZXRlSGFuZGxlcnMocGx1Z2luOiBBYm9ydGFibGVQbHVnaW4sIHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+KTogdm9pZCB7XG4gIG5ldyBSZWdpc3RyeShwbHVnaW4sIHNldHRpbmdzQnVpbGRlciwgbmV3IFNldHRpbmdzTWFuYWdlcihwbHVnaW4uYXBwKSkucmVnaXN0ZXIoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cFBhcmVudEZvbGRlcnMoYXBwOiBBcHAsIHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4sIHBhcmVudEZvbGRlclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA9PT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoY29uc3QgcGFyZW50Rm9sZGVyUGF0aCBvZiBwYXJlbnRGb2xkZXJQYXRocykge1xuICAgIHN3aXRjaCAoc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvcikge1xuICAgICAgY2FzZSBFbXB0eUZvbGRlckJlaGF2aW9yLkRlbGV0ZTpcbiAgICAgICAgYXdhaXQgZGVsZXRlRW1wdHlGb2xkZXIoYXBwLCBwYXJlbnRGb2xkZXJQYXRoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVtcHR5Rm9sZGVyQmVoYXZpb3IuRGVsZXRlV2l0aEVtcHR5UGFyZW50czpcbiAgICAgICAgYXdhaXQgZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHkoYXBwLCBwYXJlbnRGb2xkZXJQYXRoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFzQkEscUJBQWtCO0FBQ2xCLHNCQUdPO0FBQ1AsNkJBQW1DO0FBT25DLDhCQUFpQztBQUNqQyxtQkFBOEI7QUFDOUIsbUJBQStCO0FBQy9CLDBCQUdPO0FBQ1Asa0JBTU87QUFDUCxpQkFBeUM7QUFDekMsNkJBS087QUFDUCx5QkFRTztBQUNQLGtCQUtPO0FBQ1AsNEJBUU87QUFDUCwyQkFBOEI7QUFDOUIsbUJBQTJCO0FBQzNCLDBCQUFnQztBQUNoQyxtQkFNTztBQUtBLElBQUssc0JBQUwsa0JBQUtBLHlCQUFMO0FBSUwsRUFBQUEscUJBQUEsWUFBUztBQUtULEVB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TUFDTTtBQUNOLGVBQVcsQ0FBQyxjQUFjLEtBQUssS0FBSyxtQkFBbUIsUUFBUSxHQUFHO0FBQ2hFLFlBQU0sa0JBQWtCLEtBQUssSUFBSSxJQUFJLFlBQVksS0FBSztBQUN0RCxZQUFNLG9CQUFvQixxQkFBcUIsSUFBSSxlQUFlLEtBQUssb0JBQUksSUFBb0I7QUFDL0YsMkJBQXFCLElBQUksaUJBQWlCLGlCQUFpQjtBQUMzRCxpQkFBVyxRQUFRLE9BQU87QUFDeEIsMEJBQWtCLFFBQUksNEJBQU8sSUFBSSxHQUFHLElBQUk7QUFBQSxNQUMxQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFTyxxQkFBcUIsc0JBQThEO0FBQ3hGLGVBQVcsZUFBZSxLQUFLLGNBQWM7QUFDM0MsWUFBTSx3QkFBb0IsNkJBQWdCLEtBQUssS0FBSyxhQUFhLEtBQUssT0FBTztBQUM3RSxVQUFJLENBQUMsbUJBQW1CO0FBQ3RCO0FBQUEsTUFDRjtBQUNBLFlBQU0sZUFBZSxvQkFBSSxJQUF5QjtBQUNsRCxtQkFBYSxJQUFJLEtBQUssU0FBUyxDQUFDLFdBQVcsQ0FBQztBQUM1QyxXQUFLLGlCQUFpQixjQUFjLHNCQUFzQixrQkFBa0IsSUFBSTtBQUFBLElBQ2xGO0FBQUEsRUFDRjtBQUFBLEVBRU8sT0FBaUM7QUFDdEMsV0FBTyxLQUFLLElBQUksS0FBSztBQUFBLEVBQ3ZCO0FBQUEsRUFFTyxJQUFJLFNBQWlCLFNBQXVCO0FBQ2pELFNBQUssSUFBSSxJQUFJLFNBQVMsT0FBTztBQUFBLEVBQy9CO0FBQ0Y7QUFRTyxTQUFTLDZCQUE2QixRQUF5QixpQkFBbUU7QUFDdkksTUFBSSxTQUFTLFFBQVEsaUJBQWlCLElBQUksZ0JBQWdCLE9BQU8sR0FBRyxDQUFDLEVBQUUsU0FBUztBQUNsRjtBQUVBLGVBQWUscUJBQXFCLEtBQVUsVUFBZ0QsbUJBQTRDO0FBQ3hJLE1BQUksU0FBUyx3QkFBd0IsbUJBQTBCO0FBQzdEO0FBQUEsRUFDRjtBQUNBLGFBQVcsb0JBQW9CLG1CQUFtQjtBQUNoRCxZQUFRLFNBQVMscUJBQXFCO0FBQUEsTUFDcEMsS0FBSztBQUNILGtCQUFNLGdDQUFrQixLQUFLLGdCQUFnQjtBQUM3QztBQUFBLE1BQ0YsS0FBSztBQUNILGtCQUFNLHlDQUEyQixLQUFLLGdCQUFnQjtBQUN0RDtBQUFBLE1BQ0Y7QUFDRTtBQUFBLElBQ0o7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbIkVtcHR5Rm9sZGVyQmVoYXZpb3IiXQp9Cg==
|
|
837
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3JlbmFtZS1kZWxldGUtaGFuZGxlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgRmlsZU1hbmFnZXIsXG4gIFBsdWdpbixcbiAgUmVmZXJlbmNlLFxuICBUQWJzdHJhY3RGaWxlLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7XG4gIExpbmtVcGRhdGUsXG4gIExpbmtVcGRhdGVzSGFuZGxlclxufSBmcm9tICdvYnNpZGlhbi10eXBpbmdzJztcblxuaW1wb3J0IHsgdCB9IGZyb20gJ2kxOG5leHQnO1xuaW1wb3J0IHtcbiAgTm90aWNlLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRGVlcGx5IGNvdXBsZWQgdG8gT2JzaWRpYW4gcnVudGltZTsgcmVxdWlyZXMgcnVubmluZyB2YXVsdCBmb3IgbWVhbmluZ2Z1bCB0ZXN0aW5nLiAqL1xuaW1wb3J0IHtcbiAgZ2V0RGF0YUFkYXB0ZXJFeCxcbiAgSW50ZXJuYWxQbHVnaW5OYW1lXG59IGZyb20gJ29ic2lkaWFuLXR5cGluZ3MvaW1wbGVtZW50YXRpb25zJztcblxuaW1wb3J0IHR5cGUge1xuICBVcGRhdGVMaW5rUGFyYW1zLFxuICBVcGRhdGVMaW5rc0luRmlsZVBhcmFtc1xufSBmcm9tICcuL2xpbmsudHMnO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbE5ldmVyIH0gZnJvbSAnLi4vYWJvcnQtY29udHJvbGxlci50cyc7XG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnLi4vYXJyYXkudHMnO1xuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlXG59IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi9hcHAudHMnO1xuaW1wb3J0IHtcbiAgQXR0YWNobWVudFBhdGhDb250ZXh0LFxuICBnZXRBdHRhY2htZW50RmlsZVBhdGgsXG4gIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoLFxuICBoYXNPd25BdHRhY2htZW50Rm9sZGVyXG59IGZyb20gJy4vYXR0YWNobWVudC1wYXRoLnRzJztcbmltcG9ydCB7XG4gIENBTlZBU19GSUxFX0VYVEVOU0lPTixcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBlZGl0TGlua3MsXG4gIGV4dHJhY3RMaW5rRmlsZSxcbiAgdXBkYXRlTGluayxcbiAgdXBkYXRlTGlua3NJbkZpbGVcbn0gZnJvbSAnLi9saW5rLnRzJztcbmltcG9ydCB7XG4gIGdldEFsbExpbmtzLFxuICBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoLFxuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSxcbiAgcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUsXG4gIHRlbXBSZWdpc3RlckZpbGVzQW5kUnVuLFxuICB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1bkFzeW5jLFxuICB1bnJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlXG59IGZyb20gJy4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJQYXRjaCB9IGZyb20gJy4vbW9ua2V5LWFyb3VuZC50cyc7XG5pbXBvcnQgeyBhZGRUb1F1ZXVlIH0gZnJvbSAnLi9xdWV1ZS50cyc7XG5pbXBvcnQgeyBkZWxldGVJZk5vdFVzZWQgfSBmcm9tICcuL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQge1xuICBkZWxldGVFbXB0eUZvbGRlcixcbiAgZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHksXG4gIGdldFNhZmVSZW5hbWVQYXRoLFxuICByZW5hbWVTYWZlLFxuICB0cmFzaFNhZmVcbn0gZnJvbSAnLi92YXVsdC50cyc7XG5cbi8qKlxuICogQSBiZWhhdmlvciBvZiB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHdoZW4gZGVsZXRpbmcgZW1wdHkgZm9sZGVycy5cbiAqL1xuZXhwb3J0IGVudW0gRW1wdHlGb2xkZXJCZWhhdmlvciB7XG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGVtcHR5IGZvbGRlci5cbiAgICovXG4gIERlbGV0ZSA9ICdEZWxldGUnLFxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGVtcHR5IGZvbGRlciBhbmQgYWxsIGl0cyBlbXB0eSBwYXJlbnRzLlxuICAgKi9cbiAgRGVsZXRlV2l0aEVtcHR5UGFyZW50cyA9ICdEZWxldGVXaXRoRW1wdHlQYXJlbnRzJyxcblxuICAvKipcbiAgICogS2VlcCB0aGUgZW1wdHkgZm9sZGVyLlxuICAgKi9cbiAgS2VlcCA9ICdLZWVwJ1xufVxuXG4vKipcbiAqIFNldHRpbmdzIGZvciB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBmb2xkZXJzLlxuICAgKi9cbiAgZW1wdHlGb2xkZXJCZWhhdmlvcjogRW1wdHlGb2xkZXJCZWhhdmlvcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGF0aCBpcyBhIG5vdGUuXG4gICAqL1xuICBpc05vdGUocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgdGhlIHBhdGguXG4gICAqL1xuICBpc1BhdGhJZ25vcmVkKHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZXRlIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnRzLlxuICAgKi9cbiAgc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50czogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgZGVsZXRpb25zLlxuICAgKi9cbiAgc2hvdWxkSGFuZGxlRGVsZXRpb25zOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSByZW5hbWVzLlxuICAgKi9cbiAgc2hvdWxkSGFuZGxlUmVuYW1lczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmaWxlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZvbGRlciB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlczogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEFib3J0YWJsZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbmludGVyZmFjZSBIYW5kbGVkUmVuYW1lS2V5IHtcbiAgbmV3UGF0aDogc3RyaW5nO1xuICBvbGRQYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJbnRlcnJ1cHRlZFJlbmFtZSB7XG4gIGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lSGFuZGxlclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcD86IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZU1hcFBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxudHlwZSBSdW5Bc3luY0xpbmtVcGRhdGVGbiA9IHsgcmVuYW1lRGVsZXRlSGFuZGxlclBhdGNoZWQ/OiBib29sZWFuIH0gJiBGaWxlTWFuYWdlclsncnVuQXN5bmNMaW5rVXBkYXRlJ107XG5cbmNsYXNzIERlbGV0ZUhhbmRsZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT5cbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgSGFuZGxlIERlbGV0ZSAke3RoaXMuZmlsZS5wYXRofWApO1xuICAgIGlmICghaXNOb3RlKHRoaXMuYXBwLCB0aGlzLmZpbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/Lih0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBTa2lwcGluZyBkZWxldGUgaGFuZGxlciBvZiAke3RoaXMuZmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KFtkaXJuYW1lKHRoaXMuZmlsZS5wYXRoKV0pO1xuXG4gICAgaWYgKHNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmdldCh0aGlzLmZpbGUucGF0aCk7XG4gICAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmRlbGV0ZSh0aGlzLmZpbGUucGF0aCk7XG4gICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgY29uc3QgbGlua3MgPSBnZXRBbGxMaW5rcyhjYWNoZSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUodGhpcy5hcHAsIGxpbmssIHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgICAgICBpZiAoIWF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgoYXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChhdHRhY2htZW50RmlsZS5wYXJlbnQ/LnBhdGggPz8gJycpO1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh0aGlzLmFwcCwgYXR0YWNobWVudEZpbGUsIHRoaXMuZmlsZS5wYXRoLCBmYWxzZSwgc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwKTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJlbnRGb2xkZXJQYXRocy5kZWxldGUoJycpO1xuICAgIGF3YWl0IGNsZWFudXBQYXJlbnRGb2xkZXJzKHRoaXMuYXBwLCB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpLCBBcnJheS5mcm9tKHBhcmVudEZvbGRlclBhdGhzKSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHRoaXMuYXBwLCB0aGlzLmZpbGUucGF0aCwgQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUpO1xuICAgIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwodGhpcy5hcHAsIGF0dGFjaG1lbnRGb2xkZXJQYXRoKTtcblxuICAgIGlmICghYXR0YWNobWVudEZvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghYXdhaXQgaGFzT3duQXR0YWNobWVudEZvbGRlcih0aGlzLmFwcCwgdGhpcy5maWxlLnBhdGgsIEF0dGFjaG1lbnRQYXRoQ29udGV4dC5EZWxldGVOb3RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh0aGlzLmFwcCwgYXR0YWNobWVudEZvbGRlciwgdGhpcy5maWxlLnBhdGgsIGZhbHNlLCBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yICE9PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXApO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgfVxufVxuXG5jbGFzcyBIYW5kbGVkUmVuYW1lcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbmV3IE1hcDxzdHJpbmcsIEhhbmRsZWRSZW5hbWVLZXk+KCk7XG5cbiAgcHVibGljIGFkZChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLnNldCh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpLCB7IG5ld1BhdGgsIG9sZFBhdGggfSk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuZGVsZXRlKHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGhhcyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXModGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSk7XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPEhhbmRsZWRSZW5hbWVLZXk+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAudmFsdWVzKCk7XG4gIH1cblxuICBwcml2YXRlIGtleVRvU3RyaW5nKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofWA7XG4gIH1cbn1cblxuY2xhc3MgTWV0YWRhdGFEZWxldGVkSGFuZGxlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByZXZDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+XG4gICkge1xuICB9XG5cbiAgcHVibGljIGhhbmRsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4odGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVNZXRhZGF0YURlbGV0ZWQnKShgU2tpcHBpbmcgbWV0YWRhdGEgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXJrZG93bkZpbGUodGhpcy5hcHAsIHRoaXMuZmlsZSkgJiYgdGhpcy5wcmV2Q2FjaGUpIHtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuc2V0KHRoaXMuZmlsZS5wYXRoLCB0aGlzLnByZXZDYWNoZSk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXMgPSBuZXcgSGFuZGxlZFJlbmFtZXMoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogQWJvcnRhYmxlUGx1Z2luLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlclxuICApIHtcbiAgICB0aGlzLmFwcCA9IHBsdWdpbi5hcHA7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBsdWdpbi5tYW5pZmVzdC5pZDtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGx1Z2luLmFib3J0U2lnbmFsID8/IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlcigpOiB2b2lkIHtcbiAgICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwO1xuXG4gICAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuc2V0KHRoaXMucGx1Z2luSWQsIHRoaXMuc2V0dGluZ3NCdWlsZGVyKTtcbiAgICB0aGlzLmxvZ1JlZ2lzdGVyZWRIYW5kbGVycygpO1xuXG4gICAgdGhpcy5wbHVnaW4ucmVnaXN0ZXIoKCkgPT4ge1xuICAgICAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuZGVsZXRlKHRoaXMucGx1Z2luSWQpO1xuICAgICAgdGhpcy5sb2dSZWdpc3RlcmVkSGFuZGxlcnMoKTtcbiAgICB9KTtcblxuICAgIHRoaXMucGx1Z2luLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIHRoaXMuaGFuZGxlRGVsZXRlLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnBsdWdpbi5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCB0aGlzLmhhbmRsZVJlbmFtZS5iaW5kKHRoaXMpKSk7XG4gICAgdGhpcy5wbHVnaW4ucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLm9uKCdkZWxldGVkJywgdGhpcy5oYW5kbGVNZXRhZGF0YURlbGV0ZWQuYmluZCh0aGlzKSkpO1xuXG4gICAgcmVnaXN0ZXJQYXRjaCh0aGlzLnBsdWdpbiwgdGhpcy5hcHAuZmlsZU1hbmFnZXIsIHtcbiAgICAgIHJ1bkFzeW5jTGlua1VwZGF0ZTogKG5leHQ6IFJ1bkFzeW5jTGlua1VwZGF0ZUZuKTogUnVuQXN5bmNMaW5rVXBkYXRlRm4gPT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbigobGlua1VwZGF0ZXNIYW5kbGVyKSA9PiB0aGlzLnJ1bkFzeW5jTGlua1VwZGF0ZShuZXh0LCBsaW5rVXBkYXRlc0hhbmRsZXIpLCB7IHJlbmFtZURlbGV0ZUhhbmRsZXJQYXRjaGVkOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGUoZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgb3BlcmF0aW9uRm46IChhYm9ydFNpZ25hbCkgPT4gbmV3IERlbGV0ZUhhbmRsZXIodGhpcy5hcHAsIGZpbGUsIGFib3J0U2lnbmFsLCB0aGlzLnNldHRpbmdzTWFuYWdlciwgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCkuaGFuZGxlKCksXG4gICAgICBvcGVyYXRpb25OYW1lOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVEZWxldGUsIHsgZmlsZVBhdGg6IGZpbGUucGF0aCB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNZXRhZGF0YURlbGV0ZWQoZmlsZTogVEFic3RyYWN0RmlsZSwgcHJldkNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSW52b2tlSGFuZGxlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG5ldyBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyKHRoaXMuYXBwLCBmaWxlLCBwcmV2Q2FjaGUsIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLCB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwKS5oYW5kbGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVuYW1lKGZpbGU6IFRBYnN0cmFjdEZpbGUsIG9sZFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzRmlsZShmaWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1BhdGggPSBmaWxlLnBhdGg7XG5cbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgSGFuZGxlIFJlbmFtZSAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gKTtcbiAgICBpZiAodGhpcy5oYW5kbGVkUmVuYW1lcy5oYXMob2xkUGF0aCwgbmV3UGF0aCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuZGVsZXRlKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG9sZFBhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2Ygb2xkIHBhdGggJHtvbGRQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obmV3UGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiBuZXcgcGF0aCAke25ld1BhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQ2FjaGUgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG9sZFBhdGgpID8/IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUobmV3UGF0aCk7XG4gICAgY29uc3Qgb2xkUGF0aEJhY2tsaW5rc01hcCA9IGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgodGhpcy5hcHAsIG9sZFBhdGgpLmRhdGE7XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBvcGVyYXRpb25GbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICAgIG5ld1BhdGgsXG4gICAgICAgICAgb2xkQ2FjaGUsXG4gICAgICAgICAgb2xkUGF0aCxcbiAgICAgICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgICAgfSkuaGFuZGxlKCksXG4gICAgICBvcGVyYXRpb25OYW1lOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVSZW5hbWUsIHsgbmV3UGF0aCwgb2xkUGF0aCB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dSZWdpc3RlcmVkSGFuZGxlcnMoKTogdm9pZCB7XG4gICAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5yZW5hbWVEZWxldGVIYW5kbGVyc01hcDtcbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpsb2dSZWdpc3RlcmVkSGFuZGxlcnMnKShcbiAgICAgIGBQbHVnaW5zIHdpdGggcmVnaXN0ZXJlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXJzOiAke0pTT04uc3RyaW5naWZ5KEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAua2V5cygpKSl9YFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkFzeW5jTGlua1VwZGF0ZShuZXh0OiBSdW5Bc3luY0xpbmtVcGRhdGVGbiwgbGlua1VwZGF0ZXNIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAobmV4dC5yZW5hbWVEZWxldGVIYW5kbGVyUGF0Y2hlZCkge1xuICAgICAgYXdhaXQgbmV4dC5jYWxsKHRoaXMuYXBwLmZpbGVNYW5hZ2VyLCBsaW5rVXBkYXRlc0hhbmRsZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBuZXh0LmNhbGwodGhpcy5hcHAuZmlsZU1hbmFnZXIsIChsaW5rVXBkYXRlcykgPT4gdGhpcy53cmFwTGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzLCBsaW5rVXBkYXRlc0hhbmRsZXIpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkSW52b2tlSGFuZGxlcigpOiBib29sZWFuIHtcbiAgICBjb25zdCBwbHVnaW5JZCA9IHRoaXMucGx1Z2luLm1hbmlmZXN0LmlkO1xuXG4gICAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5yZW5hbWVEZWxldGVIYW5kbGVyc01hcDtcbiAgICBjb25zdCBtYWluUGx1Z2luSWQgPSBBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmtleXMoKSlbMF07XG4gICAgcmV0dXJuIG1haW5QbHVnaW5JZCA9PT0gcGx1Z2luSWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyYXBMaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXM6IExpbmtVcGRhdGVbXSwgbGlua1VwZGF0ZXNIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaXNSZW5hbWVDYWxsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBldmVudFJlZiA9IHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoKSA9PiB7XG4gICAgICBpc1JlbmFtZUNhbGxlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYXBwLnZhdWx0Lm9mZnJlZihldmVudFJlZik7XG4gICAgfVxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBJdCBtaWdodCBjaGFuZ2VkIGluIGByZW5hbWVgIGV2ZW50IGhhbmRsZXIuIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgICBpZiAoIWlzUmVuYW1lQ2FsbGVkIHx8ICFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShcbiAgICAgIGxpbmtVcGRhdGVzLFxuICAgICAgKGxpbmtVcGRhdGUpID0+IHtcbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aCkpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiBzb3VyY2UgZmlsZSAke2xpbmtVcGRhdGUuc291cmNlRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRoKSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHJlc29sdmVkIGZpbGUgJHtsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcHAucGx1Z2lucy5nZXRQbHVnaW4oJ2JhY2tsaW5rLWNhY2hlJykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlua1VwZGF0ZS5zb3VyY2VGaWxlLmV4dGVuc2lvbiA9PT0gQ0FOVkFTX0ZJTEVfRVhURU5TSU9OKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmNsYXNzIFNldHRpbmdzTWFuYWdlciB7XG4gIHB1YmxpYyByZWFkb25seSByZW5hbWVEZWxldGVIYW5kbGVyc01hcDogTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcCkge1xuICAgIHRoaXMucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPVxuICAgICAgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKGFwcCwgJ3JlbmFtZURlbGV0ZUhhbmRsZXJzTWFwJywgbmV3IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj4oKSkudmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2V0dGluZ3MoKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+IHtcbiAgICBjb25zdCBzZXR0aW5nc0J1aWxkZXJzID0gQXJyYXkuZnJvbSh0aGlzLnJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLnZhbHVlcygpKS5yZXZlcnNlKCk7XG5cbiAgICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+ID0ge307XG4gICAgc2V0dGluZ3MuaXNOb3RlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gaXNOb3RlKHRoaXMuYXBwLCBwYXRoKTtcbiAgICBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkID0gKCk6IGJvb2xlYW4gPT4gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IHNldHRpbmdzQnVpbGRlciBvZiBzZXR0aW5nc0J1aWxkZXJzKSB7XG4gICAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHNldHRpbmdzQnVpbGRlcigpO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyA/PyBmYWxzZTtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yKSB7XG4gICAgICAgIHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz89IG5ld1NldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3I7XG4gICAgICB9XG4gICAgICBzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMgfHw9IG5ld1NldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucyA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgPz8gZmFsc2U7XG4gICAgICBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcyA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgfHw9IG5ld1NldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgPz8gZmFsc2U7XG4gICAgICBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlcyA/PyBmYWxzZTtcbiAgICAgIGNvbnN0IGlzUGF0aElnbm9yZWQgPSBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkO1xuICAgICAgc2V0dGluZ3MuaXNQYXRoSWdub3JlZCA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzUGF0aElnbm9yZWQocGF0aCkgfHwgKG5ld1NldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihwYXRoKSA/PyBmYWxzZSk7XG4gICAgICBjb25zdCBjdXJyZW50SXNOb3RlID0gc2V0dGluZ3MuaXNOb3RlO1xuICAgICAgc2V0dGluZ3MuaXNOb3RlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gY3VycmVudElzTm90ZShwYXRoKSAmJiAobmV3U2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/Pz0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwO1xuICAgIHJldHVybiBzZXR0aW5ncztcbiAgfVxuXG4gIHB1YmxpYyBpc05vdGVFeChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG4gIH1cbn1cblxuY2xhc3MgUmVuYW1lSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVIYW5kbGVyUGFyYW1zKSB7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCA9IHBhcmFtcy5vbGRQYXRoQmFja2xpbmtzTWFwO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwO1xuICAgIHRoaXMub2xkUGF0aExpbmtzID0gdGhpcy5vbGRDYWNoZSA/IGdldEFsbExpbmtzKHRoaXMub2xkQ2FjaGUpIDogW107XG4gICAgdGhpcy5oYW5kbGVkUmVuYW1lcyA9IHBhcmFtcy5oYW5kbGVkUmVuYW1lcztcbiAgICB0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCA/PyBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub2xkUGF0aCA9PT0gdGhpcy5uZXdQYXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBhd2FpdCB0aGlzLmNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGF3YWl0IHRoaXMucmVmcmVzaExpbmtzKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUNhc2VDb2xsaXNpb24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGNvbnN0IHJlbmFtZWRGaWxlUGF0aHMgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUodGhpcy5hcHAsICdyZW5hbWVkRmlsZVBhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuICAgIGNvbnN0IHJlbmFtZWRMaW5rcyA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSh0aGlzLmFwcCwgJ3JlbmFtZWRMaW5rUGF0aHMnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVuYW1lTWFwID0gbmV3IFJlbmFtZU1hcCh7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBuZXdQYXRoOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcmVuYW1lTWFwLmZpbGwoKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgY29uc3QgY29tYmluZWRCYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgICAgIHJlbmFtZU1hcC5pbml0T3JpZ2luYWxMaW5rc01hcChjb21iaW5lZEJhY2tsaW5rc01hcCk7XG4gICAgICByZW5hbWVNYXAuaW5pdEJhY2tsaW5rc01hcCh0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAsIGNvbWJpbmVkQmFja2xpbmtzTWFwLCB0aGlzLm9sZFBhdGgpO1xuXG4gICAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoIG9mIHJlbmFtZU1hcC5rZXlzKCkpIHtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnRPbGRQYXRoID09PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcCA9IChhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh0aGlzLmFwcCwgYXR0YWNobWVudE9sZFBhdGgpKS5kYXRhO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIHJlbmFtZU1hcC5pbml0QmFja2xpbmtzTWFwKGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwLCBjb21iaW5lZEJhY2tsaW5rc01hcCwgYXR0YWNobWVudE9sZFBhdGgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGhdIG9mIHJlbmFtZU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKG9sZEF0dGFjaG1lbnRQYXRoICE9PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICBjb25zdCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgdGhpcy5yZW5hbWVIYW5kbGVkKG9sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIHJlbmFtZU1hcC5zZXQob2xkQXR0YWNobWVudFBhdGgsIGZpeGVkTmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudFBhdGgpKSB7XG4gICAgICAgICAgcGFyZW50Rm9sZGVyUGF0aHMuYWRkKGRpcm5hbWUob2xkQXR0YWNobWVudFBhdGgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBjbGVhbnVwUGFyZW50Rm9sZGVycyh0aGlzLmFwcCwgdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKSwgQXJyYXkuZnJvbShwYXJlbnRGb2xkZXJQYXRocykpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgICBmb3IgKFxuICAgICAgICBjb25zdCBbbmV3QmFja2xpbmtQYXRoLCBsaW5rSnNvblRvUGF0aE1hcF0gb2YgQXJyYXkuZnJvbShjb21iaW5lZEJhY2tsaW5rc01hcC5lbnRyaWVzKCkpLmNvbmNhdChcbiAgICAgICAgICBBcnJheS5mcm9tKHRoaXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcC5lbnRyaWVzKCkpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBsZXQgbGlua0luZGV4ID0gMDtcbiAgICAgICAgYXdhaXQgZWRpdExpbmtzKHRoaXMuYXBwLCBuZXdCYWNrbGlua1BhdGgsIChsaW5rKSA9PiB7XG4gICAgICAgICAgbGlua0luZGV4Kys7XG4gICAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudFBhdGggPSBsaW5rSnNvblRvUGF0aE1hcC5nZXQodG9Kc29uKGxpbmspKTtcbiAgICAgICAgICBpZiAoIW9sZEF0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudFBhdGggPSByZW5hbWVNYXAuZ2V0KG9sZEF0dGFjaG1lbnRQYXRoKSA/PyBvbGRBdHRhY2htZW50UGF0aDtcblxuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuYWRkKG5ld0JhY2tsaW5rUGF0aCk7XG4gICAgICAgICAgcmVuYW1lZExpbmtzLmFkZChgJHtuZXdCYWNrbGlua1BhdGh9Ly8ke1N0cmluZyhsaW5rSW5kZXgpfWApO1xuXG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtQYXJhbXM+KHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBsaW5rLFxuICAgICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogbmV3QXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICBvbGRUYXJnZXRQYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50UGF0aCxcbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlc1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSwge1xuICAgICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOb3RlKHRoaXMuYXBwLCB0aGlzLm5ld1BhdGgpKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZUxpbmtzSW5GaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rc0luRmlsZVBhcmFtcz4oe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2UsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWdldEZpbGVPck51bGwodGhpcy5hcHAsIHRoaXMubmV3UGF0aCkpIHtcbiAgICAgICAgbGV0IGludGVycnVwdGVkUmVuYW1lcyA9IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmdldCh0aGlzLm5ld1BhdGgpO1xuICAgICAgICBpZiAoIWludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lcyA9IFtdO1xuICAgICAgICAgIHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLnNldCh0aGlzLm5ld1BhdGgsIGludGVycnVwdGVkUmVuYW1lcyk7XG4gICAgICAgIH1cbiAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzLnB1c2goe1xuICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3Qgb3JwaGFuS2V5cyA9IEFycmF5LmZyb20odGhpcy5oYW5kbGVkUmVuYW1lcy5rZXlzKCkpO1xuICAgICAgYWRkVG9RdWV1ZSh7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBvcGVyYXRpb25GbjogKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3Qgb3JwaGFuS2V5IG9mIG9ycGhhbktleXMpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuZGVsZXRlKG9ycGhhbktleS5vbGRQYXRoLCBvcnBoYW5LZXkubmV3UGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmFtZWRMaW5rcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIG5ldyBOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIudXBkYXRlZExpbmtzLCB7IGZpbGVzQ291bnQ6IHJlbmFtZWRGaWxlUGF0aHMuc2l6ZSwgbGlua3NDb3VudDogcmVuYW1lZExpbmtzLnNpemUgfSkpO1xuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuY2xlYXIoKTtcbiAgICAgICAgICByZW5hbWVkTGlua3MuY2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlT3JwaGFuZWRSZW5hbWVzKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5nZXQodGhpcy5vbGRQYXRoKTtcbiAgICBpZiAoaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgIGZvciAoY29uc3QgaW50ZXJydXB0ZWRSZW5hbWUgb2YgaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgICAgIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICAgIG9sZFBhdGg6IGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsXG4gICAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgICAgfSkuaGFuZGxlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDYXNlQ29sbGlzaW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghZ2V0RGF0YUFkYXB0ZXJFeCh0aGlzLmFwcCkuaW5zZW5zaXRpdmUgfHwgdGhpcy5vbGRQYXRoLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMubmV3UGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcFBhdGggPSBqb2luKGRpcm5hbWUodGhpcy5uZXdQYXRoKSwgYF9fdGVtcF9fJHtiYXNlbmFtZSh0aGlzLm5ld1BhdGgpfWApO1xuICAgIGF3YWl0IHRoaXMucmVuYW1lSGFuZGxlZCh0aGlzLm5ld1BhdGgsIHRlbXBQYXRoKTtcblxuICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgIG5ld1BhdGg6IHRlbXBQYXRoLFxuICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG5cbiAgICBhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKGdldEZpbGUodGhpcy5hcHAsIHRlbXBQYXRoKSwgdGhpcy5uZXdQYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaExpbmtzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZSh0aGlzLm9sZFBhdGgpID8/IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUodGhpcy5uZXdQYXRoKTtcbiAgICBjb25zdCBvbGRQYXRoTGlua3NSZWZyZXNoZWQgPSBjYWNoZSA/IGdldEFsbExpbmtzKGNhY2hlKSA6IFtdO1xuICAgIGNvbnN0IGZha2VPbGRGaWxlID0gZ2V0RmlsZSh0aGlzLmFwcCwgdGhpcy5vbGRQYXRoLCB0cnVlKTtcbiAgICBsZXQgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCA9IG5ldyBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4oKTtcbiAgICBhd2FpdCB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1bih0aGlzLmFwcCwgW2Zha2VPbGRGaWxlXSwgYXN5bmMgKCkgPT4ge1xuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCA9IChhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh0aGlzLmFwcCwgZmFrZU9sZEZpbGUpKS5kYXRhO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBsaW5rIG9mIG9sZFBhdGhMaW5rc1JlZnJlc2hlZCkge1xuICAgICAgaWYgKHRoaXMub2xkUGF0aExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5vbGRQYXRoTGlua3MucHVzaChsaW5rKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIHJlZnJlc2hlZExpbmtzXSBvZiBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkLmVudHJpZXMoKSkge1xuICAgICAgbGV0IG9sZExpbmtzID0gdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLmdldChiYWNrbGlua1BhdGgpO1xuICAgICAgaWYgKCFvbGRMaW5rcykge1xuICAgICAgICBvbGRMaW5rcyA9IFtdO1xuICAgICAgICB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAuc2V0KGJhY2tsaW5rUGF0aCwgb2xkTGlua3MpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgcmVmcmVzaGVkTGlua3MpIHtcbiAgICAgICAgaWYgKG9sZExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgb2xkTGlua3MucHVzaChsaW5rKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmFtZUhhbmRsZWQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIG5ld1BhdGggPSBnZXRTYWZlUmVuYW1lUGF0aCh0aGlzLmFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgaWYgKG9sZFBhdGggPT09IG5ld1BhdGgpIHtcbiAgICAgIHJldHVybiBuZXdQYXRoO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmFkZChvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICBuZXdQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh0aGlzLmFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbn1cblxuY2xhc3MgUmVuYW1lTWFwIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVNYXBQYXJhbXMpIHtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5vbGRDYWNoZSA9IHBhcmFtcy5vbGRDYWNoZTtcbiAgICB0aGlzLm9sZFBhdGggPSBwYXJhbXMub2xkUGF0aDtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZFBhdGhMaW5rcyA9IHRoaXMub2xkQ2FjaGUgPyBnZXRBbGxMaW5rcyh0aGlzLm9sZENhY2hlKSA6IFtdO1xuICB9XG5cbiAgcHVibGljIGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBzdHJpbmddPiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmVudHJpZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmaWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5vbGRQYXRoLCB0aGlzLm5ld1BhdGgpO1xuXG4gICAgaWYgKCFpc05vdGUodGhpcy5hcHAsIHRoaXMub2xkUGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBjb25zdCBvbGRGaWxlID0gZ2V0RmlsZSh0aGlzLmFwcCwgdGhpcy5vbGRQYXRoLCB0cnVlKTtcbiAgICBsZXQgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSAnJztcbiAgICBhd2FpdCB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1bkFzeW5jKHRoaXMuYXBwLCBbb2xkRmlsZV0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEZha2VPbGRQYXRoQ2FjaGUgPSB0aGlzLm9sZENhY2hlICYmIG9sZEZpbGUuZGVsZXRlZDtcbiAgICAgIGlmIChzaG91bGRGYWtlT2xkUGF0aENhY2hlKSB7XG4gICAgICAgIHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKHRoaXMuYXBwLCBvbGRGaWxlLCB0aGlzLm9sZENhY2hlKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh0aGlzLmFwcCwgdGhpcy5vbGRQYXRoLCBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoc2hvdWxkRmFrZU9sZFBhdGhDYWNoZSkge1xuICAgICAgICAgIHVucmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUodGhpcy5hcHAsIG9sZEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCA9IHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXJcbiAgICAgID8gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgodGhpcy5hcHAsIHRoaXMubmV3UGF0aCwgQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUpXG4gICAgICA6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoO1xuXG4gICAgY29uc3QgaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID0gb2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09ICcvJztcblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwodGhpcy5hcHAsIG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKTtcblxuICAgIGlmICghb2xkQXR0YWNobWVudEZvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gbmV3QXR0YWNobWVudEZvbGRlclBhdGggJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlczogVEZpbGVbXSA9IFtdO1xuXG4gICAgaWYgKGF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIodGhpcy5hcHAsIHRoaXMub2xkUGF0aCwgQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUpKSB7XG4gICAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4ob2xkQXR0YWNobWVudEZvbGRlciwgKG9sZEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgaWYgKGlzRmlsZShvbGRBdHRhY2htZW50RmlsZSkpIHtcbiAgICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IG9sZFBhdGhMaW5rIG9mIHRoaXMub2xkUGF0aExpbmtzKSB7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUodGhpcy5hcHAsIG9sZFBhdGhMaW5rLCB0aGlzLm9sZFBhdGgpO1xuICAgICAgICBpZiAoIW9sZEF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290IHx8IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGguc3RhcnRzV2l0aChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50QmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUodGhpcy5hcHAsIG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IG5ldyBTZXQ8c3RyaW5nPihvbGRBdHRhY2htZW50QmFja2xpbmtzLmtleXMoKSk7XG4gICAgICAgICAga2V5cy5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgICAgICBrZXlzLmRlbGV0ZSh0aGlzLm5ld1BhdGgpO1xuICAgICAgICAgIGlmIChrZXlzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlIG9mIG9sZEF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3QXR0YWNobWVudEZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGaWxlUGF0aCh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50RmlsZSxcbiAgICAgICAgICBvbGROb3RlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVjazogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID8gb2xkQXR0YWNobWVudEZpbGUucGF0aCA6IHJlbGF0aXZlKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoLCBvbGRBdHRhY2htZW50RmlsZS5wYXRoKTtcbiAgICAgICAgY29uc3QgbmV3Rm9sZGVyID0gam9pbihuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCwgZGlybmFtZShyZWxhdGl2ZVBhdGgpKTtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gam9pbihuZXdGb2xkZXIsIG9sZEF0dGFjaG1lbnRGaWxlLm5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkQXR0YWNobWVudEZpbGUucGF0aCA9PT0gbmV3QXR0YWNobWVudEZpbGVQYXRoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMpIHtcbiAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudEZpbGUgPSBnZXRGaWxlT3JOdWxsKHRoaXMuYXBwLCBuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgICAgICBpZiAobmV3QXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpmaWxsUmVuYW1lTWFwJykoYFJlbW92aW5nIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnQgJHtuZXdBdHRhY2htZW50RmlsZS5wYXRofS5gKTtcbiAgICAgICAgICBhd2FpdCB0cmFzaFNhZmUodGhpcy5hcHAsIG5ld0F0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRpciA9IGRpcm5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgZXh0ID0gZXh0bmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGJhc2VuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCwgZXh0KTtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gdGhpcy5hcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aChqb2luKGRpciwgYmFzZU5hbWUpLCBleHQuc2xpY2UoMSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXAuc2V0KG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldChvbGRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1hcC5nZXQob2xkUGF0aCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdEJhY2tsaW5rc01hcChcbiAgICBzaW5nbGVCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPixcbiAgICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4sXG4gICAgcGF0aDogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2JhY2tsaW5rUGF0aCwgbGlua3NdIG9mIHNpbmdsZUJhY2tsaW5rc01hcC5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IG5ld0JhY2tsaW5rUGF0aCA9IHRoaXMubWFwLmdldChiYWNrbGlua1BhdGgpID8/IGJhY2tsaW5rUGF0aDtcbiAgICAgIGNvbnN0IGxpbmtKc29uVG9QYXRoTWFwID0gY29tYmluZWRCYWNrbGlua3NNYXAuZ2V0KG5ld0JhY2tsaW5rUGF0aCkgPz8gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLnNldChuZXdCYWNrbGlua1BhdGgsIGxpbmtKc29uVG9QYXRoTWFwKTtcbiAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICBsaW5rSnNvblRvUGF0aE1hcC5zZXQodG9Kc29uKGxpbmspLCBwYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvbGRQYXRoTGluayBvZiB0aGlzLm9sZFBhdGhMaW5rcykge1xuICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUodGhpcy5hcHAsIG9sZFBhdGhMaW5rLCB0aGlzLm9sZFBhdGgpO1xuICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4oKTtcbiAgICAgIGJhY2tsaW5rc01hcC5zZXQodGhpcy5uZXdQYXRoLCBbb2xkUGF0aExpbmtdKTtcbiAgICAgIHRoaXMuaW5pdEJhY2tsaW5rc01hcChiYWNrbGlua3NNYXAsIGNvbWJpbmVkQmFja2xpbmtzTWFwLCBvbGRBdHRhY2htZW50RmlsZS5wYXRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5rZXlzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KG9sZFBhdGgsIG5ld1BhdGgpO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXJzLlxuICpcbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIGluc3RhbmNlLlxuICogQHBhcmFtIHNldHRpbmdzQnVpbGRlciAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzZXR0aW5ncyBmb3IgdGhlIHJlbmFtZSBkZWxldGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUmVuYW1lRGVsZXRlSGFuZGxlcnMocGx1Z2luOiBBYm9ydGFibGVQbHVnaW4sIHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+KTogdm9pZCB7XG4gIG5ldyBSZWdpc3RyeShwbHVnaW4sIHNldHRpbmdzQnVpbGRlciwgbmV3IFNldHRpbmdzTWFuYWdlcihwbHVnaW4uYXBwKSkucmVnaXN0ZXIoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cFBhcmVudEZvbGRlcnMoYXBwOiBBcHAsIHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4sIHBhcmVudEZvbGRlclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA9PT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoY29uc3QgcGFyZW50Rm9sZGVyUGF0aCBvZiBwYXJlbnRGb2xkZXJQYXRocykge1xuICAgIHN3aXRjaCAoc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvcikge1xuICAgICAgY2FzZSBFbXB0eUZvbGRlckJlaGF2aW9yLkRlbGV0ZTpcbiAgICAgICAgYXdhaXQgZGVsZXRlRW1wdHlGb2xkZXIoYXBwLCBwYXJlbnRGb2xkZXJQYXRoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVtcHR5Rm9sZGVyQmVoYXZpb3IuRGVsZXRlV2l0aEVtcHR5UGFyZW50czpcbiAgICAgICAgYXdhaXQgZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHkoYXBwLCBwYXJlbnRGb2xkZXJQYXRoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFvQkEscUJBQWtCO0FBQ2xCLHNCQUdPO0FBRVAsNkJBR087QUFPUCw4QkFBaUM7QUFDakMsbUJBQThCO0FBQzlCLG1CQUErQjtBQUMvQiwwQkFHTztBQUNQLGtCQU1PO0FBQ1AsaUJBQXlDO0FBQ3pDLDZCQUtPO0FBQ1AseUJBUU87QUFDUCxrQkFLTztBQUNQLDRCQVFPO0FBQ1AsMkJBQThCO0FBQzlCLG1CQUEyQjtBQUMzQiwwQkFBZ0M7QUFDaEMsbUJBTU87QUFLQSxJQUFLLHNCQUFMLGtCQUFLQSx5QkFBTDtBQUlM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QUFBLEVBRU8saUJBQ0wsb0JBQ0Esc0JBQ0EsTUFDTTtBQUNOLGVBQVcsQ0FBQyxjQUFjLEtBQUssS0FBSyxtQkFBbUIsUUFBUSxHQUFHO0FBQ2hFLFlBQU0sa0JBQWtCLEtBQUssSUFBSSxJQUFJLFlBQVksS0FBSztBQUN0RCxZQUFNLG9CQUFvQixxQkFBcUIsSUFBSSxlQUFlLEtBQUssb0JBQUksSUFBb0I7QUFDL0YsMkJBQXFCLElBQUksaUJBQWlCLGlCQUFpQjtBQUMzRCxpQkFBVyxRQUFRLE9BQU87QUFDeEIsMEJBQWtCLFFBQUksNEJBQU8sSUFBSSxHQUFHLElBQUk7QUFBQSxNQUMxQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFTyxxQkFBcUIsc0JBQThEO0FBQ3hGLGVBQVcsZUFBZSxLQUFLLGNBQWM7QUFDM0MsWUFBTSx3QkFBb0IsNkJBQWdCLEtBQUssS0FBSyxhQUFhLEtBQUssT0FBTztBQUM3RSxVQUFJLENBQUMsbUJBQW1CO0FBQ3RCO0FBQUEsTUFDRjtBQUNBLFlBQU0sZUFBZSxvQkFBSSxJQUF5QjtBQUNsRCxtQkFBYSxJQUFJLEtBQUssU0FBUyxDQUFDLFdBQVcsQ0FBQztBQUM1QyxXQUFLLGlCQUFpQixjQUFjLHNCQUFzQixrQkFBa0IsSUFBSTtBQUFBLElBQ2xGO0FBQUEsRUFDRjtBQUFBLEVBRU8sT0FBaUM7QUFDdEMsV0FBTyxLQUFLLElBQUksS0FBSztBQUFBLEVBQ3ZCO0FBQUEsRUFFTyxJQUFJLFNBQWlCLFNBQXVCO0FBQ2pELFNBQUssSUFBSSxJQUFJLFNBQVMsT0FBTztBQUFBLEVBQy9CO0FBQ0Y7QUFRTyxTQUFTLDZCQUE2QixRQUF5QixpQkFBbUU7QUFDdkksTUFBSSxTQUFTLFFBQVEsaUJBQWlCLElBQUksZ0JBQWdCLE9BQU8sR0FBRyxDQUFDLEVBQUUsU0FBUztBQUNsRjtBQUVBLGVBQWUscUJBQXFCLEtBQVUsVUFBZ0QsbUJBQTRDO0FBQ3hJLE1BQUksU0FBUyx3QkFBd0IsbUJBQTBCO0FBQzdEO0FBQUEsRUFDRjtBQUNBLGFBQVcsb0JBQW9CLG1CQUFtQjtBQUNoRCxZQUFRLFNBQVMscUJBQXFCO0FBQUEsTUFDcEMsS0FBSztBQUNILGtCQUFNLGdDQUFrQixLQUFLLGdCQUFnQjtBQUM3QztBQUFBLE1BQ0YsS0FBSztBQUNILGtCQUFNLHlDQUEyQixLQUFLLGdCQUFnQjtBQUN0RDtBQUFBLE1BQ0Y7QUFDRTtBQUFBLElBQ0o7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbIkVtcHR5Rm9sZGVyQmVoYXZpb3IiXQp9Cg==
|
|
@@ -125,9 +125,10 @@ __export(resource_url_exports, {
|
|
|
125
125
|
});
|
|
126
126
|
module.exports = __toCommonJS(resource_url_exports);
|
|
127
127
|
var import_obsidian = require('obsidian');
|
|
128
|
+
var import_implementations = require('obsidian-typings/implementations');
|
|
128
129
|
var import_path = require('../path.cjs');
|
|
129
130
|
function relativePathToResourceUrl(app, relativePath, notePath) {
|
|
130
|
-
const noteFullPath = (0, import_path.toPosixPath)(app.
|
|
131
|
+
const noteFullPath = (0, import_path.toPosixPath)((0, import_implementations.getDataAdapterEx)(app).getFullRealPath(notePath));
|
|
131
132
|
const noteUrl = `${import_obsidian.Platform.resourcePathPrefix}${noteFullPath}`;
|
|
132
133
|
const relativeUrl = new URL(relativePath, noteUrl);
|
|
133
134
|
return String(relativeUrl);
|
|
@@ -136,4 +137,4 @@ function relativePathToResourceUrl(app, relativePath, notePath) {
|
|
|
136
137
|
0 && (module.exports = {
|
|
137
138
|
relativePathToResourceUrl
|
|
138
139
|
});
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3Jlc291cmNlLXVybC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3Igd29ya2luZyB3aXRoIHJlc291cmNlIFVSTHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgZ2V0RGF0YUFkYXB0ZXJFeCB9IGZyb20gJ29ic2lkaWFuLXR5cGluZ3MvaW1wbGVtZW50YXRpb25zJztcblxuaW1wb3J0IHsgdG9Qb3NpeFBhdGggfSBmcm9tICcuLi9wYXRoLnRzJztcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHJlbGF0aXZlIHBhdGggdG8gYSByZXNvdXJjZSBVUkwuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGggLSBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gbm90ZVBhdGggLSBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAqIEByZXR1cm5zIFRoZSByZXNvdXJjZSBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZVBhdGhUb1Jlc291cmNlVXJsKGFwcDogQXBwLCByZWxhdGl2ZVBhdGg6IHN0cmluZywgbm90ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vdGVGdWxsUGF0aCA9IHRvUG9zaXhQYXRoKGdldERhdGFBZGFwdGVyRXgoYXBwKS5nZXRGdWxsUmVhbFBhdGgobm90ZVBhdGgpKTtcbiAgY29uc3Qgbm90ZVVybCA9IGAke1BsYXRmb3JtLnJlc291cmNlUGF0aFByZWZpeH0ke25vdGVGdWxsUGF0aH1gO1xuICBjb25zdCByZWxhdGl2ZVVybCA9IG5ldyBVUkwocmVsYXRpdmVQYXRoLCBub3RlVXJsKTtcbiAgcmV0dXJuIFN0cmluZyhyZWxhdGl2ZVVybCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBLHNCQUF5QjtBQUN6Qiw2QkFBaUM7QUFFakMsa0JBQTRCO0FBVXJCLFNBQVMsMEJBQTBCLEtBQVUsY0FBc0IsVUFBMEI7QUFDbEcsUUFBTSxtQkFBZSw2QkFBWSx5Q0FBaUIsR0FBRyxFQUFFLGdCQUFnQixRQUFRLENBQUM7QUFDaEYsUUFBTSxVQUFVLEdBQUcseUJBQVMsa0JBQWtCLEdBQUcsWUFBWTtBQUM3RCxRQUFNLGNBQWMsSUFBSSxJQUFJLGNBQWMsT0FBTztBQUNqRCxTQUFPLE9BQU8sV0FBVztBQUMzQjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -296,7 +296,7 @@ async function getOrCreateFolderSafe(app, path) {
|
|
|
296
296
|
}
|
|
297
297
|
function getSafeRenamePath(app, oldPathOrAbstractFile, newPath) {
|
|
298
298
|
const oldPath = (0, import_file_system.getPath)(app, oldPathOrAbstractFile);
|
|
299
|
-
if (app.
|
|
299
|
+
if ((0, import_implementations.getDataAdapterEx)(app).insensitive) {
|
|
300
300
|
let folderPath = (0, import_path.dirname)(newPath);
|
|
301
301
|
let nonExistingPath = (0, import_path.basename)(newPath);
|
|
302
302
|
let folder;
|
|
@@ -537,4 +537,4 @@ async function invokeFileActionSafe(app, pathOrFile, fileAction) {
|
|
|
537
537
|
saveNote,
|
|
538
538
|
trashSafe
|
|
539
539
|
});
|
|
540
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3ZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggdGhlIE9ic2lkaWFuIFZhdWx0LlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBFdmVudFJlZixcbiAgTGlzdGVkRmlsZXNcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBNYXJrZG93blZpZXcsXG4gIFRBYnN0cmFjdEZpbGUsXG4gIFRGaWxlLFxuICBURm9sZGVyXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7XG4gIHBhcmVudEZvbGRlclBhdGgsXG4gIFZpZXdUeXBlXG59IGZyb20gJ29ic2lkaWFuLXR5cGluZ3MvaW1wbGVtZW50YXRpb25zJztcblxuaW1wb3J0IHR5cGUgeyBSZXRyeU9wdGlvbnMgfSBmcm9tICcuLi9hc3luYy50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbHVlUHJvdmlkZXIgfSBmcm9tICcuLi92YWx1ZS1wcm92aWRlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIFBhdGhPckFic3RyYWN0RmlsZSxcbiAgUGF0aE9yRmlsZSxcbiAgUGF0aE9yRm9sZGVyXG59IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbEFueSB9IGZyb20gJy4uL2Fib3J0LWNvbnRyb2xsZXIudHMnO1xuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyBub29wQXN5bmMgfSBmcm9tICcuLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pblxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL2FzeW5jLXdpdGgtbm90aWNlLnRzJztcbmltcG9ydCB7XG4gIGxvY2tFZGl0b3IsXG4gIHVubG9ja0VkaXRvclxufSBmcm9tICcuL2VkaXRvci50cyc7XG5pbXBvcnQge1xuICBhc0ZpbGUsXG4gIGFzRm9sZGVyLFxuICBGaWxlU3lzdGVtVHlwZSxcbiAgZ2V0QWJzdHJhY3RGaWxlLFxuICBnZXRBYnN0cmFjdEZpbGVPck51bGwsXG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZpbGVTeXN0ZW1UeXBlLFxuICBnZXRGb2xkZXIsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgZ2V0UGF0aCxcbiAgaXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgaXNOb3RlXG59IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4vaTE4bi9pMThuLnRzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcHJvY2Vzc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc09wdGlvbnMgZXh0ZW5kcyBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBmYWlsIGlmIHRoZSBmaWxlIGlzIG1pc3Npbmcgb3IgZGVsZXRlZC4gRGVmYXVsdCBpcyBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGYWlsT25NaXNzaW5nRmlsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbG9jayB0aGUgZWRpdG9yIHdoaWxlIHByb2Nlc3NpbmcgdGhlIGZpbGUuIEFwcGxpY2FibGUgb25seSBmb3IgbWFya2Rvd24gZmlsZXMuIERlZmF1bHQgaXMgYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkTG9ja0VkaXRvcldoaWxlUHJvY2Vzc2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyBhIHRpbWVvdXQgbm90aWNlLiBEZWZhdWx0IGlzIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dUaW1lb3V0Tm90aWNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb3BpZXMgYSBmaWxlIHNhZmVseSBpbiB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBvbGRQYXRoT3JGaWxlIC0gVGhlIG9sZCBwYXRoIG9yIGZpbGUgdG8gY29weS5cbiAqIEBwYXJhbSBuZXdQYXRoIC0gVGhlIG5ldyBwYXRoIHRvIGNvcHkgdGhlIGZpbGUgdG8uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgcGF0aCBvZiB0aGUgY29waWVkIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3B5U2FmZShhcHA6IEFwcCwgb2xkUGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZSA9IGdldEZpbGUoYXBwLCBvbGRQYXRoT3JGaWxlKTtcblxuICBpZiAoZmlsZS5wYXRoID09PSBuZXdQYXRoKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cblxuICBjb25zdCBuZXdGb2xkZXJQYXRoID0gcGFyZW50Rm9sZGVyUGF0aChuZXdQYXRoKTtcbiAgYXdhaXQgY3JlYXRlRm9sZGVyU2FmZShhcHAsIG5ld0ZvbGRlclBhdGgpO1xuXG4gIGNvbnN0IG5ld0F2YWlsYWJsZVBhdGggPSBnZXRBdmFpbGFibGVQYXRoKGFwcCwgbmV3UGF0aCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcHAudmF1bHQuY29weShmaWxlLCBuZXdBdmFpbGFibGVQYXRoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhuZXdBdmFpbGFibGVQYXRoKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QXZhaWxhYmxlUGF0aDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZm9sZGVyIHNhZmVseSBpbiB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZvbGRlciB0byBjcmVhdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZvbGRlciB3YXMgY3JlYXRlZC5cbiAqIEB0aHJvd3MgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSBmb2xkZXIgYW5kIGl0IHN0aWxsIGRvZXNuJ3QgZXhpc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVGb2xkZXJTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGF3YWl0IGFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhwYXRoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihwYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhwYXRoKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIHZhdWx0IHdpdGggcGFyZW50IGZvbGRlcnMgaWYgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gZGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBhbmQgYWxsIGl0cyBjcmVhdGVkIHBhcmVudHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVUZW1wRmlsZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiBQcm9taXNlPHZvaWQ+PiB7XG4gIGxldCBmaWxlID0gZ2V0RmlsZU9yTnVsbChhcHAsIHBhdGgpO1xuICBpZiAoZmlsZSkge1xuICAgIHJldHVybiBub29wQXN5bmM7XG4gIH1cblxuICBjb25zdCBmb2xkZXJDbGVhbnVwID0gYXdhaXQgY3JlYXRlVGVtcEZvbGRlcihhcHAsIHBhcmVudEZvbGRlclBhdGgocGF0aCkpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZShwYXRoLCAnJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWF3YWl0IGFwcC52YXVsdC5leGlzdHMocGF0aCkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICBmaWxlID0gZ2V0RmlsZShhcHAsIHBhdGgpO1xuICAgIGlmICghZmlsZS5kZWxldGVkKSB7XG4gICAgICBhd2FpdCB0cmFzaFNhZmUoYXBwLCBmaWxlKTtcbiAgICB9XG4gICAgYXdhaXQgZm9sZGVyQ2xlYW51cCgpO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgZm9sZGVyIGluIHRoZSB2YXVsdCB3aXRoIHBhcmVudCBmb2xkZXJzIGlmIG5lZWRlZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZm9sZGVyIHRvIGNyZWF0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gZGVsZXRlIHRoZSB0ZW1wb3JhcnkgZm9sZGVyIGFuZCBhbGwgaXRzIGNyZWF0ZWQgcGFyZW50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRlbXBGb2xkZXIoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8KCkgPT4gUHJvbWlzZTx2b2lkPj4ge1xuICBsZXQgZm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKGFwcCwgcGF0aCk7XG4gIGlmIChmb2xkZXIpIHtcbiAgICByZXR1cm4gbm9vcEFzeW5jO1xuICB9XG5cbiAgY29uc3QgZm9sZGVyUGF0aCA9IHBhcmVudEZvbGRlclBhdGgocGF0aCk7XG4gIGF3YWl0IGNyZWF0ZVRlbXBGb2xkZXIoYXBwLCBmb2xkZXJQYXRoKTtcblxuICBjb25zdCBmb2xkZXJDbGVhbnVwID0gYXdhaXQgY3JlYXRlVGVtcEZvbGRlcihhcHAsIHBhcmVudEZvbGRlclBhdGgocGF0aCkpO1xuXG4gIGF3YWl0IGNyZWF0ZUZvbGRlclNhZmUoYXBwLCBwYXRoKTtcblxuICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgIGZvbGRlciA9IGdldEZvbGRlcihhcHAsIHBhdGgpO1xuICAgIGlmICghZm9sZGVyLmRlbGV0ZWQpIHtcbiAgICAgIGF3YWl0IHRyYXNoU2FmZShhcHAsIGZvbGRlcik7XG4gICAgfVxuICAgIGF3YWl0IGZvbGRlckNsZWFudXAoKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWxldGVzIGFuIGVtcHR5IGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZvbGRlciAtIFRoZSBmb2xkZXIgdG8gZGVsZXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmb2xkZXIgaXMgZGVsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUVtcHR5Rm9sZGVyKGFwcDogQXBwLCBwYXRoT3JGb2xkZXI6IG51bGwgfCBQYXRoT3JGb2xkZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKGFwcCwgcGF0aE9yRm9sZGVyKTtcbiAgaWYgKCFmb2xkZXIpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFhd2FpdCBpc0VtcHR5Rm9sZGVyKGFwcCwgZm9sZGVyKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCB0cmFzaFNhZmUoYXBwLCBmb2xkZXIpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZW1wdHkgZm9sZGVyIGhpZXJhcmNoeSBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBmb2xkZXIuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGb2xkZXIgLSBUaGUgZm9sZGVyIHRvIHN0YXJ0IHJlbW92aW5nIGVtcHR5IGhpZXJhcmNoeSBmcm9tLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbXB0eSBoaWVyYXJjaHkgaXMgZGVsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUVtcHR5Rm9sZGVySGllcmFyY2h5KGFwcDogQXBwLCBwYXRoT3JGb2xkZXI6IG51bGwgfCBQYXRoT3JGb2xkZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIHBhdGhPckZvbGRlcik7XG5cbiAgd2hpbGUgKGZvbGRlcikge1xuICAgIGlmICghYXdhaXQgaXNFbXB0eUZvbGRlcihhcHAsIGZvbGRlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gZm9sZGVyLnBhcmVudDtcbiAgICBhd2FpdCBkZWxldGVFbXB0eUZvbGRlcihhcHAsIGZvbGRlcik7XG4gICAgZm9sZGVyID0gcGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBhIHNhZmUgcGF0aCBmb3IgYSBmaWxlIG9yIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSBvciBmb2xkZXIgdG8gZ2V0IGEgc2FmZSBwYXRoIGZvci5cbiAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGZpbGUgc3lzdGVtIG9iamVjdC5cbiAqIEByZXR1cm5zIFRoZSBzYWZlIHBhdGggZm9yIHRoZSBmaWxlIG9yIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFic3RyYWN0RmlsZVBhdGhTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcsIHR5cGU6IEZpbGVTeXN0ZW1UeXBlKTogc3RyaW5nIHtcbiAgY29uc3QgYWJzdHJhY3RGaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKGFwcCwgcGF0aCk7XG5cbiAgaWYgKGFic3RyYWN0RmlsZSAmJiBnZXRGaWxlU3lzdGVtVHlwZShhYnN0cmFjdEZpbGUpID09PSB0eXBlKSB7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICByZXR1cm4gZ2V0QXZhaWxhYmxlUGF0aChhcHAsIHBhdGgpO1xufVxuXG4vKipcbiAqIEdldHMgYW4gYXZhaWxhYmxlIHBhdGggZm9yIGEgZmlsZSBpbiB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gZ2V0IGFuIGF2YWlsYWJsZSBwYXRoIGZvci5cbiAqIEByZXR1cm5zIFRoZSBhdmFpbGFibGUgcGF0aCBmb3IgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdmFpbGFibGVQYXRoKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBleHQgPSBleHRuYW1lKHBhdGgpO1xuICByZXR1cm4gYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihkaXJuYW1lKHBhdGgpLCBiYXNlbmFtZShwYXRoLCBleHQpKSwgZXh0LnNsaWNlKDEpKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgc2FmZSBmaWxlIHBhdGggZm9yIGEgZmlsZSBvciBmb2xkZXIuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgb3IgZm9sZGVyIHRvIGdldCBhIHNhZmUgcGF0aCBmb3IuXG4gKiBAcmV0dXJucyBUaGUgc2FmZSBwYXRoIGZvciB0aGUgZmlsZSBvciBmb2xkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlUGF0aFNhZmUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRBYnN0cmFjdEZpbGVQYXRoU2FmZShhcHAsIHBhdGgsIEZpbGVTeXN0ZW1UeXBlLkZpbGUpO1xufVxuXG4vKipcbiAqIEdldHMgYSBzYWZlIGZvbGRlciBwYXRoIGZvciBhIGZpbGUgb3IgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIG9yIGZvbGRlciB0byBnZXQgYSBzYWZlIHBhdGggZm9yLlxuICogQHJldHVybnMgVGhlIHNhZmUgcGF0aCBmb3IgdGhlIGZpbGUgb3IgZm9sZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9sZGVyUGF0aFNhZmUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRBYnN0cmFjdEZpbGVQYXRoU2FmZShhcHAsIHBhdGgsIEZpbGVTeXN0ZW1UeXBlLkZvbGRlcik7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGFuIGFycmF5IG9mIE1hcmtkb3duIGZpbGVzIGZyb20gdGhlIGFwcCdzIHZhdWx0IGFuZCBzb3J0cyB0aGVtIGFscGhhYmV0aWNhbGx5IGJ5IHRoZWlyIGZpbGUgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIE1hcmtkb3duIGZpbGVzIHNvcnRlZCBieSBmaWxlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXJrZG93bkZpbGVzU29ydGVkKGFwcDogQXBwKTogVEZpbGVbXSB7XG4gIHJldHVybiBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLnNvcnQoKGEsIGIpID0+IGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBhbGwgbm90ZSBmaWxlcyBmcm9tIHRoZSBhcHAncyB2YXVsdCBhbmQgc29ydHMgdGhlbSBhbHBoYWJldGljYWxseSBieSB0aGVpciBmaWxlIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgbm90ZSBmaWxlcyBpbiB0aGUgdmF1bHQgc29ydGVkIGJ5IGZpbGUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vdGVGaWxlc1NvcnRlZChhcHA6IEFwcCk6IFRGaWxlW10ge1xuICByZXR1cm4gYXBwLnZhdWx0LmdldEFsbExvYWRlZEZpbGVzKCkuZmlsdGVyKChmaWxlKSA9PiBpc0ZpbGUoZmlsZSkgJiYgaXNOb3RlKGFwcCwgZmlsZSkpLnNvcnQoKGEsIGIpID0+IGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCkpIGFzIFRGaWxlW107XG59XG5cbi8qKlxuICogR2V0cyBvciBjcmVhdGVzIGFuIGFic3RyYWN0IGZpbGUgc2FmZWx5IGluIHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqXG4gKiBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBhYnN0cmFjdCBmaWxlIHRvIGdldCBvciBjcmVhdGUuXG4gKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBhYnN0cmFjdCBmaWxlIHRvIGdldCBvciBjcmVhdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhYnN0cmFjdCBmaWxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVBYnN0cmFjdEZpbGVTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcsIHR5cGU6IEZpbGVTeXN0ZW1UeXBlKTogUHJvbWlzZTxUQWJzdHJhY3RGaWxlPiB7XG4gIHBhdGggPSBnZXRBYnN0cmFjdEZpbGVQYXRoU2FmZShhcHAsIHBhdGgsIHR5cGUpO1xuICBjb25zdCBhYnN0cmFjdEZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwoYXBwLCBwYXRoKTtcbiAgaWYgKGFic3RyYWN0RmlsZSkge1xuICAgIHJldHVybiBhYnN0cmFjdEZpbGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEZpbGVTeXN0ZW1UeXBlLkZpbGU6XG4gICAgICByZXR1cm4gYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZShwYXRoLCAnJyk7XG4gICAgY2FzZSBGaWxlU3lzdGVtVHlwZS5Gb2xkZXI6XG4gICAgICByZXR1cm4gYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihwYXRoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZpbGUgc3lzdGVtIHR5cGU6ICR7dHlwZSBhcyBzdHJpbmd9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIG9yIGNyZWF0ZXMgYSBmaWxlIHNhZmVseSBpbiB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBnZXQgb3IgY3JlYXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlRmlsZVNhZmUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8VEZpbGU+IHtcbiAgcmV0dXJuIGFzRmlsZShhd2FpdCBnZXRPckNyZWF0ZUFic3RyYWN0RmlsZVNhZmUoYXBwLCBwYXRoLCBGaWxlU3lzdGVtVHlwZS5GaWxlKSk7XG59XG5cbi8qKlxuICogR2V0cyBvciBjcmVhdGVzIGEgZm9sZGVyIHNhZmVseSBpbiB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogSWYgdGhlIGZvbGRlciBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIElmIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZvbGRlciB0byBnZXQgb3IgY3JlYXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZm9sZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVGb2xkZXJTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFRGb2xkZXI+IHtcbiAgcmV0dXJuIGFzRm9sZGVyKGF3YWl0IGdldE9yQ3JlYXRlQWJzdHJhY3RGaWxlU2FmZShhcHAsIHBhdGgsIEZpbGVTeXN0ZW1UeXBlLkZvbGRlcikpO1xufVxuXG4vKipcbiAqIEdldHMgYSBzYWZlIHJlbmFtZSBwYXRoIGZvciBhIGZpbGUuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBvbGRQYXRoT3JBYnN0cmFjdEZpbGUgLSBUaGUgb2xkIHBhdGggb3IgYWJzdHJhY3QgZmlsZSB0byByZW5hbWUuXG4gKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBuZXcgcGF0aCB0byByZW5hbWUgdGhlIGFic3RyYWN0IGZpbGUgdG8uXG4gKiBAcmV0dXJucyBUaGUgc2FmZSByZW5hbWUgcGF0aCBmb3IgdGhlIGFic3RyYWN0IGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZlUmVuYW1lUGF0aChhcHA6IEFwcCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGUsIG5ld1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG9sZFBhdGggPSBnZXRQYXRoKGFwcCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlKTtcblxuICBpZiAoYXBwLnZhdWx0LmFkYXB0ZXIuaW5zZW5zaXRpdmUpIHtcbiAgICBsZXQgZm9sZGVyUGF0aCA9IGRpcm5hbWUobmV3UGF0aCk7XG4gICAgbGV0IG5vbkV4aXN0aW5nUGF0aCA9IGJhc2VuYW1lKG5ld1BhdGgpO1xuICAgIGxldCBmb2xkZXI6IG51bGwgfCBURm9sZGVyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIFRoZXJlIGlzIG5vIGVsZWdhbnQgd2F5IHRvIHBlcmZvcm0gaW5maW5pdGUgbG9vcHMuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIGZvbGRlclBhdGgsIHRydWUpO1xuICAgICAgaWYgKGZvbGRlcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG5vbkV4aXN0aW5nUGF0aCA9IGpvaW4oYmFzZW5hbWUoZm9sZGVyUGF0aCksIG5vbkV4aXN0aW5nUGF0aCk7XG4gICAgICBmb2xkZXJQYXRoID0gZGlybmFtZShmb2xkZXJQYXRoKTtcbiAgICB9XG4gICAgbmV3UGF0aCA9IGpvaW4oZm9sZGVyLmdldFBhcmVudFByZWZpeCgpLCBub25FeGlzdGluZ1BhdGgpO1xuICB9XG5cbiAgaWYgKG9sZFBhdGgudG9Mb3dlckNhc2UoKSA9PT0gbmV3UGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cblxuICByZXR1cm4gZ2V0QXZhaWxhYmxlUGF0aChhcHAsIG5ld1BhdGgpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYSBmdW5jdGlvbiB3aXRoIHRoZSBmaWxlIHN5c3RlbSBsb2NrLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZmlsZSBzeXN0ZW0gbG9jayBvZi5cbiAqIEBwYXJhbSBmbiAtIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW52b2tlV2l0aEZpbGVTeXN0ZW1Mb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBmbjogKGNvbnRlbnQ6IHN0cmluZykgPT4gdm9pZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZShhcHAsIHBhdGhPckZpbGUpO1xuICBhd2FpdCBhcHAudmF1bHQucHJvY2VzcyhmaWxlLCAoY29udGVudCkgPT4ge1xuICAgIGZuKGNvbnRlbnQpO1xuICAgIHJldHVybiBjb250ZW50O1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwYXRoIG9yIGZpbGUgaXMgYSBjaGlsZCBvZiBhbm90aGVyIHBhdGggb3IgZmlsZS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIGEgLSBUaGUgZmlyc3QgcGF0aCBvciBmaWxlLlxuICogQHBhcmFtIGIgLSBUaGUgc2Vjb25kIHBhdGggb3IgZmlsZS5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpcnN0IHBhdGggb3IgZmlsZSBpcyBhIGNoaWxkIG9mIHRoZSBzZWNvbmQgcGF0aCBvciBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDaGlsZChhcHA6IEFwcCwgYTogUGF0aE9yQWJzdHJhY3RGaWxlLCBiOiBQYXRoT3JBYnN0cmFjdEZpbGUpOiBib29sZWFuIHtcbiAgY29uc3QgYVBhdGggPSBnZXRQYXRoKGFwcCwgYSk7XG4gIGNvbnN0IGJQYXRoID0gZ2V0UGF0aChhcHAsIGIpO1xuXG4gIGlmIChhUGF0aCA9PT0gYlBhdGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoYlBhdGggPT09ICcvJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGFQYXRoLnN0YXJ0c1dpdGgoYCR7YlBhdGh9L2ApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHBhdGggb3IgZmlsZSBpcyBhIGNoaWxkIG9yIHNlbGYgb2YgYW5vdGhlciBwYXRoIG9yIGZpbGUuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBhIC0gVGhlIGZpcnN0IHBhdGggb3IgZmlsZS5cbiAqIEBwYXJhbSBiIC0gVGhlIHNlY29uZCBwYXRoIG9yIGZpbGUuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaXJzdCBwYXRoIG9yIGZpbGUgaXMgYSBjaGlsZCBvciBzZWxmIG9mIHRoZSBzZWNvbmQgcGF0aCBvciBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDaGlsZE9yU2VsZihhcHA6IEFwcCwgYTogUGF0aE9yQWJzdHJhY3RGaWxlLCBiOiBQYXRoT3JBYnN0cmFjdEZpbGUpOiBib29sZWFuIHtcbiAgY29uc3QgYVBhdGggPSBnZXRQYXRoKGFwcCwgYSk7XG4gIGNvbnN0IGJQYXRoID0gZ2V0UGF0aChhcHAsIGIpO1xuICByZXR1cm4gYVBhdGggPT09IGJQYXRoIHx8IGlzQ2hpbGQoYXBwLCBhLCBiKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmb2xkZXIgaXMgZW1wdHkuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGb2xkZXIgLSBUaGUgcGF0aCBvciBmb2xkZXIgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZvbGRlciBpcyBlbXB0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzRW1wdHlGb2xkZXIoYXBwOiBBcHAsIHBhdGhPckZvbGRlcjogUGF0aE9yRm9sZGVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGxpc3RlZEZpbGVzID0gYXdhaXQgbGlzdFNhZmUoYXBwLCBnZXRQYXRoKGFwcCwgcGF0aE9yRm9sZGVyKSk7XG4gIHJldHVybiBsaXN0ZWRGaWxlcy5maWxlcy5sZW5ndGggPT09IDAgJiYgbGlzdGVkRmlsZXMuZm9sZGVycy5sZW5ndGggPT09IDA7XG59XG5cbi8qKlxuICogU2FmZWx5IGxpc3RzIHRoZSBmaWxlcyBhbmQgZm9sZGVycyBhdCB0aGUgc3BlY2lmaWVkIHBhdGggaW4gdGhlIHZhdWx0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRm9sZGVyIC0gVGhlIHBhdGggb3IgZm9sZGVyIHRvIGxpc3QuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEge0BsaW5rIExpc3RlZEZpbGVzfSBvYmplY3QgY29udGFpbmluZyB0aGUgbGlzdGVkIGZpbGVzIGFuZCBmb2xkZXJzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFNhZmUoYXBwOiBBcHAsIHBhdGhPckZvbGRlcjogUGF0aE9yRm9sZGVyKTogUHJvbWlzZTxMaXN0ZWRGaWxlcz4ge1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZvbGRlcik7XG4gIGNvbnN0IEVNUFRZID0geyBmaWxlczogW10sIGZvbGRlcnM6IFtdIH07XG5cbiAgaWYgKChhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5zdGF0KHBhdGgpKT8udHlwZSAhPT0gJ2ZvbGRlcicpIHtcbiAgICByZXR1cm4gRU1QVFk7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5saXN0KHBhdGgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGF3YWl0IGFwcC52YXVsdC5leGlzdHMocGF0aCkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiBFTVBUWTtcbiAgfVxufVxuXG4vKipcbiAqIFByb2Nlc3NlcyBhIGZpbGUgd2l0aCByZXRyeSBsb2dpYywgdXBkYXRpbmcgaXRzIGNvbnRlbnQgYmFzZWQgb24gYSBwcm92aWRlZCB2YWx1ZSBvciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLCB0eXBpY2FsbHkgdXNlZCBmb3IgYWNjZXNzaW5nIHRoZSB2YXVsdC5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBiZSBwcm9jZXNzZWQuIEl0IGNhbiBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggb3IgYSBmaWxlIG9iamVjdC5cbiAqIEBwYXJhbSBuZXdDb250ZW50UHJvdmlkZXIgLSBBIHZhbHVlIHByb3ZpZGVyIHRoYXQgcmV0dXJucyB0aGUgbmV3IGNvbnRlbnQgYmFzZWQgb24gdGhlIG9sZCBjb250ZW50IG9mIHRoZSBmaWxlLlxuICogSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgb2xkIGNvbnRlbnQgYXMgYW4gYXJndW1lbnQgYW5kIHJldHVybnMgdGhlIG5ldyBjb250ZW50LlxuICogSWYgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGl0IHNob3VsZCByZXR1cm4gYG51bGxgIGlmIHRoZSBwcm9jZXNzIHNob3VsZCBiZSByZXRyaWVkLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIGZvciBwcm9jZXNzaW5nL3JldHJ5aW5nIHRoZSBvcGVyYXRpb24uXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwcm9jZXNzIGlzIGNvbXBsZXRlLlxuICpcbiAqIEB0aHJvd3MgV2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgcHJvY2VzcyBmYWlscyBhZnRlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiByZXRyaWVzIG9yIHRpbWVvdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzKFxuICBhcHA6IEFwcCxcbiAgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSxcbiAgbmV3Q29udGVudFByb3ZpZGVyOiBWYWx1ZVByb3ZpZGVyPG51bGwgfCBzdHJpbmcsIFtzdHJpbmddPixcbiAgb3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IERFRkFVTFRfUkVUUllfT1BUSU9OUyA9IHtcbiAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogdHJ1ZSxcbiAgICBzaG91bGRMb2NrRWRpdG9yV2hpbGVQcm9jZXNzaW5nOiB0cnVlLFxuICAgIHNob3VsZFNob3dUaW1lb3V0Tm90aWNlOiB0cnVlLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tYWdpYy1udW1iZXJzIC0tIERlZmF1bHQgdmFsdWUuXG4gICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiA1MDBcbiAgfTtcbiAgY29uc3QgZnVsbE9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfUkVUUllfT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGZ1bGxPcHRpb25zLmFib3J0U2lnbmFsID0gYWJvcnRTaWduYWxBbnkoZnVsbE9wdGlvbnMuYWJvcnRTaWduYWwsIGFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuXG4gIGxldCBhY3RpdmVMZWFmQ2hhbmdlRXZlbnRSZWY6IEV2ZW50UmVmIHwgbnVsbCA9IG51bGw7XG5cbiAgaWYgKGZ1bGxPcHRpb25zLnNob3VsZExvY2tFZGl0b3JXaGlsZVByb2Nlc3NpbmcpIHtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVmlld1R5cGUuTWFya2Rvd24pKSB7XG4gICAgICBpZiAobGVhZi52aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3ICYmIGxlYWYudmlldy5maWxlPy5wYXRoID09PSBwYXRoKSB7XG4gICAgICAgIGxvY2tFZGl0b3IobGVhZi52aWV3LmVkaXRvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYWN0aXZlTGVhZkNoYW5nZUV2ZW50UmVmID0gYXBwLndvcmtzcGFjZS5vbignYWN0aXZlLWxlYWYtY2hhbmdlJywgKGxlYWYpID0+IHtcbiAgICAgIGlmIChsZWFmPy52aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3ICYmIGxlYWYudmlldy5maWxlPy5wYXRoID09PSBwYXRoKSB7XG4gICAgICAgIGxvY2tFZGl0b3IobGVhZi52aWV3LmVkaXRvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHJldHJ5V2l0aFRpbWVvdXROb3RpY2Uoe1xuICAgICAgYXN5bmMgb3BlcmF0aW9uRm4oYWJvcnRTaWduYWwpIHtcbiAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgcmVhZFNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVNaXNzaW5nRmlsZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IHJlc29sdmVWYWx1ZShuZXdDb250ZW50UHJvdmlkZXIsIGFib3J0U2lnbmFsLCBvbGRDb250ZW50KTtcbiAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgICBpZiAobmV3Q29udGVudCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc1N1Y2Nlc3MgPSB0cnVlO1xuICAgICAgICBjb25zdCBkb2VzRmlsZUV4aXN0ID0gYXdhaXQgaW52b2tlRmlsZUFjdGlvblNhZmUoYXBwLCBwYXRoT3JGaWxlLCBhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgYXdhaXQgYXBwLnZhdWx0LnByb2Nlc3MoZmlsZSwgKGNvbnRlbnQpID0+IHtcbiAgICAgICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgICBpZiAoY29udGVudCAhPT0gb2xkQ29udGVudCkge1xuICAgICAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignVmF1bHQ6cHJvY2VzcycpKCdDb250ZW50IGhhcyBjaGFuZ2VkIHNpbmNlIGl0IHdhcyByZWFkLiBSZXRyeWluZy4uLicsIHtcbiAgICAgICAgICAgICAgICBhY3R1YWxDb250ZW50OiBjb250ZW50LFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkQ29udGVudDogb2xkQ29udGVudCxcbiAgICAgICAgICAgICAgICBwYXRoOiBmaWxlLnBhdGhcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlzU3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ld0NvbnRlbnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWRvZXNGaWxlRXhpc3QpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlTWlzc2luZ0ZpbGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc1N1Y2Nlc3M7XG5cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlTWlzc2luZ0ZpbGUoKTogYm9vbGVhbiB7XG4gICAgICAgICAgaWYgKGZ1bGxPcHRpb25zLnNob3VsZEZhaWxPbk1pc3NpbmdGaWxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJyR7cGF0aH0nIG5vdCBmb3VuZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy52YXVsdC5wcm9jZXNzRmlsZSwgeyBmaWxlUGF0aDogcGF0aCB9KSxcbiAgICAgIHJldHJ5T3B0aW9uczogZnVsbE9wdGlvbnMsXG4gICAgICBzaG91bGRTaG93VGltZW91dE5vdGljZTogZnVsbE9wdGlvbnMuc2hvdWxkU2hvd1RpbWVvdXROb3RpY2VcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmVMZWFmQ2hhbmdlRXZlbnRSZWY/LmUub2ZmcmVmKGFjdGl2ZUxlYWZDaGFuZ2VFdmVudFJlZik7XG4gICAgZm9yIChjb25zdCBsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZpZXdUeXBlLk1hcmtkb3duKSkge1xuICAgICAgaWYgKGxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldyAmJiBsZWFmLnZpZXcuZmlsZT8ucGF0aCA9PT0gcGF0aCkge1xuICAgICAgICB1bmxvY2tFZGl0b3IobGVhZi52aWV3LmVkaXRvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIHNhZmVseSBmcm9tIHRoZSB2YXVsdC5cbiAqXG4gKiBJdCBjb3ZlcnMgdGhlIGNhc2Ugd2hlbiB0aGUgZmlsZSB3YXMgcmVtb3ZlZCBkdXJpbmcgdGhlIHJlYWRpbmcuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byByZWFkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCBvZiB0aGUgZmlsZSBvciBgbnVsbGAgaWYgdGhlIGZpbGUgaXMgbWlzc2luZyBvciBkZWxldGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFNhZmUoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgbGV0IGNvbnRlbnQ6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICBhd2FpdCBpbnZva2VGaWxlQWN0aW9uU2FmZShhcHAsIHBhdGhPckZpbGUsIGFzeW5jIChmaWxlKSA9PiB7XG4gICAgYXdhaXQgc2F2ZU5vdGUoYXBwLCBmaWxlKTtcbiAgICBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XG4gIH0pO1xuICByZXR1cm4gY29udGVudDtcbn1cblxuLyoqXG4gKiBSZW5hbWVzIGEgZmlsZSBzYWZlbHkgaW4gdGhlIHZhdWx0LlxuICogSWYgdGhlIG5ldyBwYXRoIGFscmVhZHkgZXhpc3RzLCB0aGUgZmlsZSB3aWxsIGJlIHJlbmFtZWQgdG8gYW4gYXZhaWxhYmxlIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBvbGRQYXRoT3JBYnN0cmFjdEZpbGUgLSBUaGUgb2xkIHBhdGggb3IgZmlsZSB0byByZW5hbWUuXG4gKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBuZXcgcGF0aCB0byByZW5hbWUgdGhlIGZpbGUgdG8uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgcGF0aCBvZiB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmFtZVNhZmUoYXBwOiBBcHAsIG9sZFBhdGhPckFic3RyYWN0RmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBvbGRBYnN0cmFjdEZpbGUgPSBnZXRBYnN0cmFjdEZpbGUoYXBwLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGUpO1xuXG4gIGNvbnN0IG5ld0F2YWlsYWJsZVBhdGggPSBnZXRTYWZlUmVuYW1lUGF0aChhcHAsIG9sZFBhdGhPckFic3RyYWN0RmlsZSwgbmV3UGF0aCk7XG5cbiAgaWYgKG9sZEFic3RyYWN0RmlsZS5wYXRoLnRvTG93ZXJDYXNlKCkgPT09IG5ld0F2YWlsYWJsZVBhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgIGlmIChvbGRBYnN0cmFjdEZpbGUucGF0aCAhPT0gbmV3UGF0aCkge1xuICAgICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUob2xkQWJzdHJhY3RGaWxlLCBuZXdBdmFpbGFibGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0F2YWlsYWJsZVBhdGg7XG4gIH1cblxuICBjb25zdCBuZXdGb2xkZXJQYXRoID0gcGFyZW50Rm9sZGVyUGF0aChuZXdBdmFpbGFibGVQYXRoKTtcbiAgYXdhaXQgY3JlYXRlRm9sZGVyU2FmZShhcHAsIG5ld0ZvbGRlclBhdGgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUob2xkQWJzdHJhY3RGaWxlLCBuZXdBdmFpbGFibGVQYXRoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhuZXdBdmFpbGFibGVQYXRoKSB8fCBhd2FpdCBhcHAudmF1bHQuZXhpc3RzKG9sZEFic3RyYWN0RmlsZS5wYXRoKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QXZhaWxhYmxlUGF0aDtcbn1cblxuLyoqXG4gKiBTYXZlcyB0aGUgc3BlY2lmaWVkIG5vdGUgaW4gdGhlIE9ic2lkaWFuIGFwcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIG5vdGUgdG8gYmUgc2F2ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5vdGUgaXMgc2F2ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlTm90ZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzTWFya2Rvd25GaWxlKGFwcCwgcGF0aE9yRmlsZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuXG4gIGZvciAoY29uc3QgbGVhZiBvZiBhcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShWaWV3VHlwZS5NYXJrZG93bikpIHtcbiAgICBpZiAobGVhZi52aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3ICYmIGxlYWYudmlldy5maWxlPy5wYXRoID09PSBwYXRoICYmIGxlYWYudmlldy5kaXJ0eSkge1xuICAgICAgYXdhaXQgbGVhZi52aWV3LnNhdmUoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFzaGVzIGFuIGFic3RyYWN0IGZpbGUgc2FmZWx5IGZyb20gdGhlIHZhdWx0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gdHJhc2guXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZpbGUgaXMgdHJhc2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYXNoU2FmZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwoYXBwLCBwYXRoT3JGaWxlKTtcbiAgaWYgKCFmaWxlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcHAuZmlsZU1hbmFnZXIudHJhc2hGaWxlKGZpbGUpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGF3YWl0IGFwcC52YXVsdC5leGlzdHMoZmlsZS5wYXRoKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICBnZXRMaWJEZWJ1Z2dlcignVmF1bHQ6dHJhc2hTYWZlJykoYEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyYXNoaW5nICR7ZmlsZS5wYXRofSwgYnV0IHRoZSBmaWxlIG5vIGxvbmdlciBleGlzdHMuYCwgeyBlcnJvcjogZSwgcGF0aDogZmlsZS5wYXRoIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGludm9rZUZpbGVBY3Rpb25TYWZlKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBmaWxlQWN0aW9uOiAoZmlsZTogVEZpbGUpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgbGV0IGZpbGUgPSBnZXRGaWxlT3JOdWxsKGFwcCwgcGF0aCk7XG4gIGlmICghZmlsZSB8fCBmaWxlLmRlbGV0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBmaWxlQWN0aW9uKGZpbGUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZmlsZSA9IGdldEZpbGVPck51bGwoYXBwLCBwYXRoKTtcbiAgICBpZiAoIWZpbGUgfHwgZmlsZS5kZWxldGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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
|
|
540
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3ZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggdGhlIE9ic2lkaWFuIFZhdWx0LlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBFdmVudFJlZixcbiAgTGlzdGVkRmlsZXNcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBNYXJrZG93blZpZXcsXG4gIFRBYnN0cmFjdEZpbGUsXG4gIFRGaWxlLFxuICBURm9sZGVyXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIHBhcmVudEZvbGRlclBhdGgsXG4gIFZpZXdUeXBlXG59IGZyb20gJ29ic2lkaWFuLXR5cGluZ3MvaW1wbGVtZW50YXRpb25zJztcblxuaW1wb3J0IHR5cGUgeyBSZXRyeU9wdGlvbnMgfSBmcm9tICcuLi9hc3luYy50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbHVlUHJvdmlkZXIgfSBmcm9tICcuLi92YWx1ZS1wcm92aWRlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIFBhdGhPckFic3RyYWN0RmlsZSxcbiAgUGF0aE9yRmlsZSxcbiAgUGF0aE9yRm9sZGVyXG59IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbEFueSB9IGZyb20gJy4uL2Fib3J0LWNvbnRyb2xsZXIudHMnO1xuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyBub29wQXN5bmMgfSBmcm9tICcuLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pblxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL2FzeW5jLXdpdGgtbm90aWNlLnRzJztcbmltcG9ydCB7XG4gIGxvY2tFZGl0b3IsXG4gIHVubG9ja0VkaXRvclxufSBmcm9tICcuL2VkaXRvci50cyc7XG5pbXBvcnQge1xuICBhc0ZpbGUsXG4gIGFzRm9sZGVyLFxuICBGaWxlU3lzdGVtVHlwZSxcbiAgZ2V0QWJzdHJhY3RGaWxlLFxuICBnZXRBYnN0cmFjdEZpbGVPck51bGwsXG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZpbGVTeXN0ZW1UeXBlLFxuICBnZXRGb2xkZXIsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgZ2V0UGF0aCxcbiAgaXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgaXNOb3RlXG59IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4vaTE4bi9pMThuLnRzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcHJvY2Vzc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc09wdGlvbnMgZXh0ZW5kcyBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBmYWlsIGlmIHRoZSBmaWxlIGlzIG1pc3Npbmcgb3IgZGVsZXRlZC4gRGVmYXVsdCBpcyBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGYWlsT25NaXNzaW5nRmlsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbG9jayB0aGUgZWRpdG9yIHdoaWxlIHByb2Nlc3NpbmcgdGhlIGZpbGUuIEFwcGxpY2FibGUgb25seSBmb3IgbWFya2Rvd24gZmlsZXMuIERlZmF1bHQgaXMgYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkTG9ja0VkaXRvcldoaWxlUHJvY2Vzc2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyBhIHRpbWVvdXQgbm90aWNlLiBEZWZhdWx0IGlzIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dUaW1lb3V0Tm90aWNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb3BpZXMgYSBmaWxlIHNhZmVseSBpbiB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBvbGRQYXRoT3JGaWxlIC0gVGhlIG9sZCBwYXRoIG9yIGZpbGUgdG8gY29weS5cbiAqIEBwYXJhbSBuZXdQYXRoIC0gVGhlIG5ldyBwYXRoIHRvIGNvcHkgdGhlIGZpbGUgdG8uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgcGF0aCBvZiB0aGUgY29waWVkIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3B5U2FmZShhcHA6IEFwcCwgb2xkUGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZSA9IGdldEZpbGUoYXBwLCBvbGRQYXRoT3JGaWxlKTtcblxuICBpZiAoZmlsZS5wYXRoID09PSBuZXdQYXRoKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cblxuICBjb25zdCBuZXdGb2xkZXJQYXRoID0gcGFyZW50Rm9sZGVyUGF0aChuZXdQYXRoKTtcbiAgYXdhaXQgY3JlYXRlRm9sZGVyU2FmZShhcHAsIG5ld0ZvbGRlclBhdGgpO1xuXG4gIGNvbnN0IG5ld0F2YWlsYWJsZVBhdGggPSBnZXRBdmFpbGFibGVQYXRoKGFwcCwgbmV3UGF0aCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcHAudmF1bHQuY29weShmaWxlLCBuZXdBdmFpbGFibGVQYXRoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhuZXdBdmFpbGFibGVQYXRoKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QXZhaWxhYmxlUGF0aDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZm9sZGVyIHNhZmVseSBpbiB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZvbGRlciB0byBjcmVhdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZvbGRlciB3YXMgY3JlYXRlZC5cbiAqIEB0aHJvd3MgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSBmb2xkZXIgYW5kIGl0IHN0aWxsIGRvZXNuJ3QgZXhpc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVGb2xkZXJTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGF3YWl0IGFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhwYXRoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihwYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhwYXRoKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIHZhdWx0IHdpdGggcGFyZW50IGZvbGRlcnMgaWYgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gZGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBhbmQgYWxsIGl0cyBjcmVhdGVkIHBhcmVudHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVUZW1wRmlsZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiBQcm9taXNlPHZvaWQ+PiB7XG4gIGxldCBmaWxlID0gZ2V0RmlsZU9yTnVsbChhcHAsIHBhdGgpO1xuICBpZiAoZmlsZSkge1xuICAgIHJldHVybiBub29wQXN5bmM7XG4gIH1cblxuICBjb25zdCBmb2xkZXJDbGVhbnVwID0gYXdhaXQgY3JlYXRlVGVtcEZvbGRlcihhcHAsIHBhcmVudEZvbGRlclBhdGgocGF0aCkpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZShwYXRoLCAnJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWF3YWl0IGFwcC52YXVsdC5leGlzdHMocGF0aCkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICBmaWxlID0gZ2V0RmlsZShhcHAsIHBhdGgpO1xuICAgIGlmICghZmlsZS5kZWxldGVkKSB7XG4gICAgICBhd2FpdCB0cmFzaFNhZmUoYXBwLCBmaWxlKTtcbiAgICB9XG4gICAgYXdhaXQgZm9sZGVyQ2xlYW51cCgpO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgZm9sZGVyIGluIHRoZSB2YXVsdCB3aXRoIHBhcmVudCBmb2xkZXJzIGlmIG5lZWRlZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZm9sZGVyIHRvIGNyZWF0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gZGVsZXRlIHRoZSB0ZW1wb3JhcnkgZm9sZGVyIGFuZCBhbGwgaXRzIGNyZWF0ZWQgcGFyZW50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRlbXBGb2xkZXIoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8KCkgPT4gUHJvbWlzZTx2b2lkPj4ge1xuICBsZXQgZm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKGFwcCwgcGF0aCk7XG4gIGlmIChmb2xkZXIpIHtcbiAgICByZXR1cm4gbm9vcEFzeW5jO1xuICB9XG5cbiAgY29uc3QgZm9sZGVyUGF0aCA9IHBhcmVudEZvbGRlclBhdGgocGF0aCk7XG4gIGF3YWl0IGNyZWF0ZVRlbXBGb2xkZXIoYXBwLCBmb2xkZXJQYXRoKTtcblxuICBjb25zdCBmb2xkZXJDbGVhbnVwID0gYXdhaXQgY3JlYXRlVGVtcEZvbGRlcihhcHAsIHBhcmVudEZvbGRlclBhdGgocGF0aCkpO1xuXG4gIGF3YWl0IGNyZWF0ZUZvbGRlclNhZmUoYXBwLCBwYXRoKTtcblxuICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgIGZvbGRlciA9IGdldEZvbGRlcihhcHAsIHBhdGgpO1xuICAgIGlmICghZm9sZGVyLmRlbGV0ZWQpIHtcbiAgICAgIGF3YWl0IHRyYXNoU2FmZShhcHAsIGZvbGRlcik7XG4gICAgfVxuICAgIGF3YWl0IGZvbGRlckNsZWFudXAoKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWxldGVzIGFuIGVtcHR5IGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZvbGRlciAtIFRoZSBmb2xkZXIgdG8gZGVsZXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmb2xkZXIgaXMgZGVsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUVtcHR5Rm9sZGVyKGFwcDogQXBwLCBwYXRoT3JGb2xkZXI6IG51bGwgfCBQYXRoT3JGb2xkZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKGFwcCwgcGF0aE9yRm9sZGVyKTtcbiAgaWYgKCFmb2xkZXIpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFhd2FpdCBpc0VtcHR5Rm9sZGVyKGFwcCwgZm9sZGVyKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCB0cmFzaFNhZmUoYXBwLCBmb2xkZXIpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZW1wdHkgZm9sZGVyIGhpZXJhcmNoeSBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBmb2xkZXIuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGb2xkZXIgLSBUaGUgZm9sZGVyIHRvIHN0YXJ0IHJlbW92aW5nIGVtcHR5IGhpZXJhcmNoeSBmcm9tLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbXB0eSBoaWVyYXJjaHkgaXMgZGVsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUVtcHR5Rm9sZGVySGllcmFyY2h5KGFwcDogQXBwLCBwYXRoT3JGb2xkZXI6IG51bGwgfCBQYXRoT3JGb2xkZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIHBhdGhPckZvbGRlcik7XG5cbiAgd2hpbGUgKGZvbGRlcikge1xuICAgIGlmICghYXdhaXQgaXNFbXB0eUZvbGRlcihhcHAsIGZvbGRlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gZm9sZGVyLnBhcmVudDtcbiAgICBhd2FpdCBkZWxldGVFbXB0eUZvbGRlcihhcHAsIGZvbGRlcik7XG4gICAgZm9sZGVyID0gcGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBhIHNhZmUgcGF0aCBmb3IgYSBmaWxlIG9yIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSBvciBmb2xkZXIgdG8gZ2V0IGEgc2FmZSBwYXRoIGZvci5cbiAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGZpbGUgc3lzdGVtIG9iamVjdC5cbiAqIEByZXR1cm5zIFRoZSBzYWZlIHBhdGggZm9yIHRoZSBmaWxlIG9yIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFic3RyYWN0RmlsZVBhdGhTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcsIHR5cGU6IEZpbGVTeXN0ZW1UeXBlKTogc3RyaW5nIHtcbiAgY29uc3QgYWJzdHJhY3RGaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKGFwcCwgcGF0aCk7XG5cbiAgaWYgKGFic3RyYWN0RmlsZSAmJiBnZXRGaWxlU3lzdGVtVHlwZShhYnN0cmFjdEZpbGUpID09PSB0eXBlKSB7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICByZXR1cm4gZ2V0QXZhaWxhYmxlUGF0aChhcHAsIHBhdGgpO1xufVxuXG4vKipcbiAqIEdldHMgYW4gYXZhaWxhYmxlIHBhdGggZm9yIGEgZmlsZSBpbiB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gZ2V0IGFuIGF2YWlsYWJsZSBwYXRoIGZvci5cbiAqIEByZXR1cm5zIFRoZSBhdmFpbGFibGUgcGF0aCBmb3IgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdmFpbGFibGVQYXRoKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBleHQgPSBleHRuYW1lKHBhdGgpO1xuICByZXR1cm4gYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihkaXJuYW1lKHBhdGgpLCBiYXNlbmFtZShwYXRoLCBleHQpKSwgZXh0LnNsaWNlKDEpKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgc2FmZSBmaWxlIHBhdGggZm9yIGEgZmlsZSBvciBmb2xkZXIuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgb3IgZm9sZGVyIHRvIGdldCBhIHNhZmUgcGF0aCBmb3IuXG4gKiBAcmV0dXJucyBUaGUgc2FmZSBwYXRoIGZvciB0aGUgZmlsZSBvciBmb2xkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlUGF0aFNhZmUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRBYnN0cmFjdEZpbGVQYXRoU2FmZShhcHAsIHBhdGgsIEZpbGVTeXN0ZW1UeXBlLkZpbGUpO1xufVxuXG4vKipcbiAqIEdldHMgYSBzYWZlIGZvbGRlciBwYXRoIGZvciBhIGZpbGUgb3IgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIG9yIGZvbGRlciB0byBnZXQgYSBzYWZlIHBhdGggZm9yLlxuICogQHJldHVybnMgVGhlIHNhZmUgcGF0aCBmb3IgdGhlIGZpbGUgb3IgZm9sZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9sZGVyUGF0aFNhZmUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRBYnN0cmFjdEZpbGVQYXRoU2FmZShhcHAsIHBhdGgsIEZpbGVTeXN0ZW1UeXBlLkZvbGRlcik7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGFuIGFycmF5IG9mIE1hcmtkb3duIGZpbGVzIGZyb20gdGhlIGFwcCdzIHZhdWx0IGFuZCBzb3J0cyB0aGVtIGFscGhhYmV0aWNhbGx5IGJ5IHRoZWlyIGZpbGUgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIE1hcmtkb3duIGZpbGVzIHNvcnRlZCBieSBmaWxlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXJrZG93bkZpbGVzU29ydGVkKGFwcDogQXBwKTogVEZpbGVbXSB7XG4gIHJldHVybiBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLnNvcnQoKGEsIGIpID0+IGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBhbGwgbm90ZSBmaWxlcyBmcm9tIHRoZSBhcHAncyB2YXVsdCBhbmQgc29ydHMgdGhlbSBhbHBoYWJldGljYWxseSBieSB0aGVpciBmaWxlIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgbm90ZSBmaWxlcyBpbiB0aGUgdmF1bHQgc29ydGVkIGJ5IGZpbGUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vdGVGaWxlc1NvcnRlZChhcHA6IEFwcCk6IFRGaWxlW10ge1xuICByZXR1cm4gYXBwLnZhdWx0LmdldEFsbExvYWRlZEZpbGVzKCkuZmlsdGVyKChmaWxlKSA9PiBpc0ZpbGUoZmlsZSkgJiYgaXNOb3RlKGFwcCwgZmlsZSkpLnNvcnQoKGEsIGIpID0+IGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCkpIGFzIFRGaWxlW107XG59XG5cbi8qKlxuICogR2V0cyBvciBjcmVhdGVzIGFuIGFic3RyYWN0IGZpbGUgc2FmZWx5IGluIHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqXG4gKiBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBhYnN0cmFjdCBmaWxlIHRvIGdldCBvciBjcmVhdGUuXG4gKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBhYnN0cmFjdCBmaWxlIHRvIGdldCBvciBjcmVhdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhYnN0cmFjdCBmaWxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVBYnN0cmFjdEZpbGVTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcsIHR5cGU6IEZpbGVTeXN0ZW1UeXBlKTogUHJvbWlzZTxUQWJzdHJhY3RGaWxlPiB7XG4gIHBhdGggPSBnZXRBYnN0cmFjdEZpbGVQYXRoU2FmZShhcHAsIHBhdGgsIHR5cGUpO1xuICBjb25zdCBhYnN0cmFjdEZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwoYXBwLCBwYXRoKTtcbiAgaWYgKGFic3RyYWN0RmlsZSkge1xuICAgIHJldHVybiBhYnN0cmFjdEZpbGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEZpbGVTeXN0ZW1UeXBlLkZpbGU6XG4gICAgICByZXR1cm4gYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZShwYXRoLCAnJyk7XG4gICAgY2FzZSBGaWxlU3lzdGVtVHlwZS5Gb2xkZXI6XG4gICAgICByZXR1cm4gYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihwYXRoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZpbGUgc3lzdGVtIHR5cGU6ICR7dHlwZSBhcyBzdHJpbmd9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIG9yIGNyZWF0ZXMgYSBmaWxlIHNhZmVseSBpbiB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBnZXQgb3IgY3JlYXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlRmlsZVNhZmUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8VEZpbGU+IHtcbiAgcmV0dXJuIGFzRmlsZShhd2FpdCBnZXRPckNyZWF0ZUFic3RyYWN0RmlsZVNhZmUoYXBwLCBwYXRoLCBGaWxlU3lzdGVtVHlwZS5GaWxlKSk7XG59XG5cbi8qKlxuICogR2V0cyBvciBjcmVhdGVzIGEgZm9sZGVyIHNhZmVseSBpbiB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogSWYgdGhlIGZvbGRlciBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIElmIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZvbGRlciB0byBnZXQgb3IgY3JlYXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZm9sZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVGb2xkZXJTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFRGb2xkZXI+IHtcbiAgcmV0dXJuIGFzRm9sZGVyKGF3YWl0IGdldE9yQ3JlYXRlQWJzdHJhY3RGaWxlU2FmZShhcHAsIHBhdGgsIEZpbGVTeXN0ZW1UeXBlLkZvbGRlcikpO1xufVxuXG4vKipcbiAqIEdldHMgYSBzYWZlIHJlbmFtZSBwYXRoIGZvciBhIGZpbGUuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBvbGRQYXRoT3JBYnN0cmFjdEZpbGUgLSBUaGUgb2xkIHBhdGggb3IgYWJzdHJhY3QgZmlsZSB0byByZW5hbWUuXG4gKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBuZXcgcGF0aCB0byByZW5hbWUgdGhlIGFic3RyYWN0IGZpbGUgdG8uXG4gKiBAcmV0dXJucyBUaGUgc2FmZSByZW5hbWUgcGF0aCBmb3IgdGhlIGFic3RyYWN0IGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZlUmVuYW1lUGF0aChhcHA6IEFwcCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGUsIG5ld1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG9sZFBhdGggPSBnZXRQYXRoKGFwcCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlKTtcblxuICBpZiAoZ2V0RGF0YUFkYXB0ZXJFeChhcHApLmluc2Vuc2l0aXZlKSB7XG4gICAgbGV0IGZvbGRlclBhdGggPSBkaXJuYW1lKG5ld1BhdGgpO1xuICAgIGxldCBub25FeGlzdGluZ1BhdGggPSBiYXNlbmFtZShuZXdQYXRoKTtcbiAgICBsZXQgZm9sZGVyOiBudWxsIHwgVEZvbGRlcjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBUaGVyZSBpcyBubyBlbGVnYW50IHdheSB0byBwZXJmb3JtIGluZmluaXRlIGxvb3BzLlxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoYXBwLCBmb2xkZXJQYXRoLCB0cnVlKTtcbiAgICAgIGlmIChmb2xkZXIpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBub25FeGlzdGluZ1BhdGggPSBqb2luKGJhc2VuYW1lKGZvbGRlclBhdGgpLCBub25FeGlzdGluZ1BhdGgpO1xuICAgICAgZm9sZGVyUGF0aCA9IGRpcm5hbWUoZm9sZGVyUGF0aCk7XG4gICAgfVxuICAgIG5ld1BhdGggPSBqb2luKGZvbGRlci5nZXRQYXJlbnRQcmVmaXgoKSwgbm9uRXhpc3RpbmdQYXRoKTtcbiAgfVxuXG4gIGlmIChvbGRQYXRoLnRvTG93ZXJDYXNlKCkgPT09IG5ld1BhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBuZXdQYXRoO1xuICB9XG5cbiAgcmV0dXJuIGdldEF2YWlsYWJsZVBhdGgoYXBwLCBuZXdQYXRoKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgZmlsZSBzeXN0ZW0gbG9jay5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGZpbGUgc3lzdGVtIGxvY2sgb2YuXG4gKiBAcGFyYW0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGludm9rZVdpdGhGaWxlU3lzdGVtTG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgZm46IChjb250ZW50OiBzdHJpbmcpID0+IHZvaWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZSA9IGdldEZpbGUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgYXdhaXQgYXBwLnZhdWx0LnByb2Nlc3MoZmlsZSwgKGNvbnRlbnQpID0+IHtcbiAgICBmbihjb250ZW50KTtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcGF0aCBvciBmaWxlIGlzIGEgY2hpbGQgb2YgYW5vdGhlciBwYXRoIG9yIGZpbGUuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBhIC0gVGhlIGZpcnN0IHBhdGggb3IgZmlsZS5cbiAqIEBwYXJhbSBiIC0gVGhlIHNlY29uZCBwYXRoIG9yIGZpbGUuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaXJzdCBwYXRoIG9yIGZpbGUgaXMgYSBjaGlsZCBvZiB0aGUgc2Vjb25kIHBhdGggb3IgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2hpbGQoYXBwOiBBcHAsIGE6IFBhdGhPckFic3RyYWN0RmlsZSwgYjogUGF0aE9yQWJzdHJhY3RGaWxlKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFQYXRoID0gZ2V0UGF0aChhcHAsIGEpO1xuICBjb25zdCBiUGF0aCA9IGdldFBhdGgoYXBwLCBiKTtcblxuICBpZiAoYVBhdGggPT09IGJQYXRoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGJQYXRoID09PSAnLycpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBhUGF0aC5zdGFydHNXaXRoKGAke2JQYXRofS9gKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwYXRoIG9yIGZpbGUgaXMgYSBjaGlsZCBvciBzZWxmIG9mIGFub3RoZXIgcGF0aCBvciBmaWxlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gYSAtIFRoZSBmaXJzdCBwYXRoIG9yIGZpbGUuXG4gKiBAcGFyYW0gYiAtIFRoZSBzZWNvbmQgcGF0aCBvciBmaWxlLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlyc3QgcGF0aCBvciBmaWxlIGlzIGEgY2hpbGQgb3Igc2VsZiBvZiB0aGUgc2Vjb25kIHBhdGggb3IgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2hpbGRPclNlbGYoYXBwOiBBcHAsIGE6IFBhdGhPckFic3RyYWN0RmlsZSwgYjogUGF0aE9yQWJzdHJhY3RGaWxlKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFQYXRoID0gZ2V0UGF0aChhcHAsIGEpO1xuICBjb25zdCBiUGF0aCA9IGdldFBhdGgoYXBwLCBiKTtcbiAgcmV0dXJuIGFQYXRoID09PSBiUGF0aCB8fCBpc0NoaWxkKGFwcCwgYSwgYik7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZm9sZGVyIGlzIGVtcHR5LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRm9sZGVyIC0gVGhlIHBhdGggb3IgZm9sZGVyIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmb2xkZXIgaXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0VtcHR5Rm9sZGVyKGFwcDogQXBwLCBwYXRoT3JGb2xkZXI6IFBhdGhPckZvbGRlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBsaXN0ZWRGaWxlcyA9IGF3YWl0IGxpc3RTYWZlKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZvbGRlcikpO1xuICByZXR1cm4gbGlzdGVkRmlsZXMuZmlsZXMubGVuZ3RoID09PSAwICYmIGxpc3RlZEZpbGVzLmZvbGRlcnMubGVuZ3RoID09PSAwO1xufVxuXG4vKipcbiAqIFNhZmVseSBsaXN0cyB0aGUgZmlsZXMgYW5kIGZvbGRlcnMgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGluIHRoZSB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZvbGRlciAtIFRoZSBwYXRoIG9yIGZvbGRlciB0byBsaXN0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBMaXN0ZWRGaWxlc30gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxpc3RlZCBmaWxlcyBhbmQgZm9sZGVycy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTYWZlKGFwcDogQXBwLCBwYXRoT3JGb2xkZXI6IFBhdGhPckZvbGRlcik6IFByb21pc2U8TGlzdGVkRmlsZXM+IHtcbiAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGb2xkZXIpO1xuICBjb25zdCBFTVBUWSA9IHsgZmlsZXM6IFtdLCBmb2xkZXJzOiBbXSB9O1xuXG4gIGlmICgoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuc3RhdChwYXRoKSk/LnR5cGUgIT09ICdmb2xkZXInKSB7XG4gICAgcmV0dXJuIEVNUFRZO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIubGlzdChwYXRoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChhd2FpdCBhcHAudmF1bHQuZXhpc3RzKHBhdGgpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gRU1QVFk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBmaWxlIHdpdGggcmV0cnkgbG9naWMsIHVwZGF0aW5nIGl0cyBjb250ZW50IGJhc2VkIG9uIGEgcHJvdmlkZWQgdmFsdWUgb3IgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZSwgdHlwaWNhbGx5IHVzZWQgZm9yIGFjY2Vzc2luZyB0aGUgdmF1bHQuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gYmUgcHJvY2Vzc2VkLiBJdCBjYW4gYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIG9yIGEgZmlsZSBvYmplY3QuXG4gKiBAcGFyYW0gbmV3Q29udGVudFByb3ZpZGVyIC0gQSB2YWx1ZSBwcm92aWRlciB0aGF0IHJldHVybnMgdGhlIG5ldyBjb250ZW50IGJhc2VkIG9uIHRoZSBvbGQgY29udGVudCBvZiB0aGUgZmlsZS5cbiAqIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIG9sZCBjb250ZW50IGFzIGFuIGFyZ3VtZW50IGFuZCByZXR1cm5zIHRoZSBuZXcgY29udGVudC5cbiAqIElmIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCBpdCBzaG91bGQgcmV0dXJuIGBudWxsYCBpZiB0aGUgcHJvY2VzcyBzaG91bGQgYmUgcmV0cmllZC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyBmb3IgcHJvY2Vzc2luZy9yZXRyeWluZyB0aGUgb3BlcmF0aW9uLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcHJvY2VzcyBpcyBjb21wbGV0ZS5cbiAqXG4gKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHByb2Nlc3MgZmFpbHMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcmV0cmllcyBvciB0aW1lb3V0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2VzcyhcbiAgYXBwOiBBcHAsXG4gIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsXG4gIG5ld0NvbnRlbnRQcm92aWRlcjogVmFsdWVQcm92aWRlcjxudWxsIHwgc3RyaW5nLCBbc3RyaW5nXT4sXG4gIG9wdGlvbnM6IFByb2Nlc3NPcHRpb25zID0ge31cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBERUZBVUxUX1JFVFJZX09QVElPTlMgPSB7XG4gICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IHRydWUsXG4gICAgc2hvdWxkTG9ja0VkaXRvcldoaWxlUHJvY2Vzc2luZzogdHJ1ZSxcbiAgICBzaG91bGRTaG93VGltZW91dE5vdGljZTogdHJ1ZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVycyAtLSBEZWZhdWx0IHZhbHVlLlxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogNTAwXG4gIH07XG4gIGNvbnN0IGZ1bGxPcHRpb25zID0geyAuLi5ERUZBVUxUX1JFVFJZX09QVElPTlMsIC4uLm9wdGlvbnMgfTtcbiAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBmdWxsT3B0aW9ucy5hYm9ydFNpZ25hbCA9IGFib3J0U2lnbmFsQW55KGZ1bGxPcHRpb25zLmFib3J0U2lnbmFsLCBhYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcblxuICBsZXQgYWN0aXZlTGVhZkNoYW5nZUV2ZW50UmVmOiBFdmVudFJlZiB8IG51bGwgPSBudWxsO1xuXG4gIGlmIChmdWxsT3B0aW9ucy5zaG91bGRMb2NrRWRpdG9yV2hpbGVQcm9jZXNzaW5nKSB7XG4gICAgZm9yIChjb25zdCBsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZpZXdUeXBlLk1hcmtkb3duKSkge1xuICAgICAgaWYgKGxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldyAmJiBsZWFmLnZpZXcuZmlsZT8ucGF0aCA9PT0gcGF0aCkge1xuICAgICAgICBsb2NrRWRpdG9yKGxlYWYudmlldy5lZGl0b3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFjdGl2ZUxlYWZDaGFuZ2VFdmVudFJlZiA9IGFwcC53b3Jrc3BhY2Uub24oJ2FjdGl2ZS1sZWFmLWNoYW5nZScsIChsZWFmKSA9PiB7XG4gICAgICBpZiAobGVhZj8udmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldyAmJiBsZWFmLnZpZXcuZmlsZT8ucGF0aCA9PT0gcGF0aCkge1xuICAgICAgICBsb2NrRWRpdG9yKGxlYWYudmlldy5lZGl0b3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCByZXRyeVdpdGhUaW1lb3V0Tm90aWNlKHtcbiAgICAgIGFzeW5jIG9wZXJhdGlvbkZuKGFib3J0U2lnbmFsKSB7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IHJlYWRTYWZlKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlTWlzc2luZ0ZpbGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCByZXNvbHZlVmFsdWUobmV3Q29udGVudFByb3ZpZGVyLCBhYm9ydFNpZ25hbCwgb2xkQ29udGVudCk7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgICAgaWYgKG5ld0NvbnRlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXNTdWNjZXNzID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZG9lc0ZpbGVFeGlzdCA9IGF3YWl0IGludm9rZUZpbGVBY3Rpb25TYWZlKGFwcCwgcGF0aE9yRmlsZSwgYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIGF3YWl0IGFwcC52YXVsdC5wcm9jZXNzKGZpbGUsIChjb250ZW50KSA9PiB7XG4gICAgICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT09IG9sZENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1ZhdWx0OnByb2Nlc3MnKSgnQ29udGVudCBoYXMgY2hhbmdlZCBzaW5jZSBpdCB3YXMgcmVhZC4gUmV0cnlpbmcuLi4nLCB7XG4gICAgICAgICAgICAgICAgYWN0dWFsQ29udGVudDogY29udGVudCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZENvbnRlbnQ6IG9sZENvbnRlbnQsXG4gICAgICAgICAgICAgICAgcGF0aDogZmlsZS5wYXRoXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpc1N1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuZXdDb250ZW50O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFkb2VzRmlsZUV4aXN0KSB7XG4gICAgICAgICAgcmV0dXJuIGhhbmRsZU1pc3NpbmdGaWxlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNTdWNjZXNzO1xuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZU1pc3NpbmdGaWxlKCk6IGJvb2xlYW4ge1xuICAgICAgICAgIGlmIChmdWxsT3B0aW9ucy5zaG91bGRGYWlsT25NaXNzaW5nRmlsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlICcke3BhdGh9JyBub3QgZm91bmRgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvcGVyYXRpb25OYW1lOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMudmF1bHQucHJvY2Vzc0ZpbGUsIHsgZmlsZVBhdGg6IHBhdGggfSksXG4gICAgICByZXRyeU9wdGlvbnM6IGZ1bGxPcHRpb25zLFxuICAgICAgc2hvdWxkU2hvd1RpbWVvdXROb3RpY2U6IGZ1bGxPcHRpb25zLnNob3VsZFNob3dUaW1lb3V0Tm90aWNlXG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZlTGVhZkNoYW5nZUV2ZW50UmVmPy5lLm9mZnJlZihhY3RpdmVMZWFmQ2hhbmdlRXZlbnRSZWYpO1xuICAgIGZvciAoY29uc3QgbGVhZiBvZiBhcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShWaWV3VHlwZS5NYXJrZG93bikpIHtcbiAgICAgIGlmIChsZWFmLnZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcgJiYgbGVhZi52aWV3LmZpbGU/LnBhdGggPT09IHBhdGgpIHtcbiAgICAgICAgdW5sb2NrRWRpdG9yKGxlYWYudmlldy5lZGl0b3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjb250ZW50IG9mIGEgZmlsZSBzYWZlbHkgZnJvbSB0aGUgdmF1bHQuXG4gKlxuICogSXQgY292ZXJzIHRoZSBjYXNlIHdoZW4gdGhlIGZpbGUgd2FzIHJlbW92ZWQgZHVyaW5nIHRoZSByZWFkaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gcmVhZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgb3IgYG51bGxgIGlmIHRoZSBmaWxlIGlzIG1pc3Npbmcgb3IgZGVsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRTYWZlKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gIGxldCBjb250ZW50OiBudWxsIHwgc3RyaW5nID0gbnVsbDtcbiAgYXdhaXQgaW52b2tlRmlsZUFjdGlvblNhZmUoYXBwLCBwYXRoT3JGaWxlLCBhc3luYyAoZmlsZSkgPT4ge1xuICAgIGF3YWl0IHNhdmVOb3RlKGFwcCwgZmlsZSk7XG4gICAgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xuICB9KTtcbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbi8qKlxuICogUmVuYW1lcyBhIGZpbGUgc2FmZWx5IGluIHRoZSB2YXVsdC5cbiAqIElmIHRoZSBuZXcgcGF0aCBhbHJlYWR5IGV4aXN0cywgdGhlIGZpbGUgd2lsbCBiZSByZW5hbWVkIHRvIGFuIGF2YWlsYWJsZSBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gb2xkUGF0aE9yQWJzdHJhY3RGaWxlIC0gVGhlIG9sZCBwYXRoIG9yIGZpbGUgdG8gcmVuYW1lLlxuICogQHBhcmFtIG5ld1BhdGggLSBUaGUgbmV3IHBhdGggdG8gcmVuYW1lIHRoZSBmaWxlIHRvLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbmV3IHBhdGggb2YgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5hbWVTYWZlKGFwcDogQXBwLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IFBhdGhPckFic3RyYWN0RmlsZSwgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgb2xkQWJzdHJhY3RGaWxlID0gZ2V0QWJzdHJhY3RGaWxlKGFwcCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlKTtcblxuICBjb25zdCBuZXdBdmFpbGFibGVQYXRoID0gZ2V0U2FmZVJlbmFtZVBhdGgoYXBwLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGUsIG5ld1BhdGgpO1xuXG4gIGlmIChvbGRBYnN0cmFjdEZpbGUucGF0aC50b0xvd2VyQ2FzZSgpID09PSBuZXdBdmFpbGFibGVQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBpZiAob2xkQWJzdHJhY3RGaWxlLnBhdGggIT09IG5ld1BhdGgpIHtcbiAgICAgIGF3YWl0IGFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKG9sZEFic3RyYWN0RmlsZSwgbmV3QXZhaWxhYmxlUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBuZXdBdmFpbGFibGVQYXRoO1xuICB9XG5cbiAgY29uc3QgbmV3Rm9sZGVyUGF0aCA9IHBhcmVudEZvbGRlclBhdGgobmV3QXZhaWxhYmxlUGF0aCk7XG4gIGF3YWl0IGNyZWF0ZUZvbGRlclNhZmUoYXBwLCBuZXdGb2xkZXJQYXRoKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKG9sZEFic3RyYWN0RmlsZSwgbmV3QXZhaWxhYmxlUGF0aCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWF3YWl0IGFwcC52YXVsdC5leGlzdHMobmV3QXZhaWxhYmxlUGF0aCkgfHwgYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhvbGRBYnN0cmFjdEZpbGUucGF0aCkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0F2YWlsYWJsZVBhdGg7XG59XG5cbi8qKlxuICogU2F2ZXMgdGhlIHNwZWNpZmllZCBub3RlIGluIHRoZSBPYnNpZGlhbiBhcHAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBub3RlIHRvIGJlIHNhdmVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBub3RlIGlzIHNhdmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZU5vdGUoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc01hcmtkb3duRmlsZShhcHAsIHBhdGhPckZpbGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcblxuICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVmlld1R5cGUuTWFya2Rvd24pKSB7XG4gICAgaWYgKGxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldyAmJiBsZWFmLnZpZXcuZmlsZT8ucGF0aCA9PT0gcGF0aCAmJiBsZWFmLnZpZXcuZGlydHkpIHtcbiAgICAgIGF3YWl0IGxlYWYudmlldy5zYXZlKCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVHJhc2hlcyBhbiBhYnN0cmFjdCBmaWxlIHNhZmVseSBmcm9tIHRoZSB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBhYnN0cmFjdCBmaWxlIHRvIHRyYXNoLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlIGlzIHRyYXNoZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFzaFNhZmUoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKGFwcCwgcGF0aE9yRmlsZSk7XG4gIGlmICghZmlsZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnRyYXNoRmlsZShmaWxlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChhd2FpdCBhcHAudmF1bHQuZXhpc3RzKGZpbGUucGF0aCkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgZ2V0TGliRGVidWdnZXIoJ1ZhdWx0OnRyYXNoU2FmZScpKGBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cmFzaGluZyAke2ZpbGUucGF0aH0sIGJ1dCB0aGUgZmlsZSBubyBsb25nZXIgZXhpc3RzLmAsIHsgZXJyb3I6IGUsIHBhdGg6IGZpbGUucGF0aCB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpbnZva2VGaWxlQWN0aW9uU2FmZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgZmlsZUFjdGlvbjogKGZpbGU6IFRGaWxlKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gIGxldCBmaWxlID0gZ2V0RmlsZU9yTnVsbChhcHAsIHBhdGgpO1xuICBpZiAoIWZpbGUgfHwgZmlsZS5kZWxldGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgZmlsZUFjdGlvbihmaWxlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGZpbGUgPSBnZXRGaWxlT3JOdWxsKGFwcCwgcGF0aCk7XG4gICAgaWYgKCFmaWxlIHx8IGZpbGUuZGVsZXRlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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
|