@dbx-tools/core 0.9.173 → 0.9.175
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.ts +2 -2
- package/lib/index.d.ts +2 -2
- package/lib/index.js +3 -3
- package/lib/src/exec.d.ts +11 -0
- package/lib/src/exec.js +9 -12
- package/package.json +2 -2
- package/src/exec.ts +12 -11
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/core";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.175";
|
|
7
7
|
export * as bin from "./src/bin.ts";
|
|
8
8
|
export * as brandFiles from "./src/brand-files.ts";
|
|
9
9
|
export * as bundle from "./src/bundle.ts";
|
|
@@ -22,7 +22,7 @@ export { ENV_ONLY, valueSchema, bundleResourceSchema, bundleEnvEntrySchema, bund
|
|
|
22
22
|
export type { ConfigMapValue, ConfigData, ConfigSource, ConfigOptions, ConfigFile } from "./src/config-utils.ts";
|
|
23
23
|
export { missingDependencies, resolveVersion, resolveDependencies } from "./src/dependency-resolver.ts";
|
|
24
24
|
export type { DependencyResolverOptions, DependencyInfo, ResolvedNpmVersion, NpmSpecifierInput, ResolvedNpmDependencies, MissingDependencyInfo } from "./src/dependency-resolver.ts";
|
|
25
|
-
export { COMMAND_NOT_FOUND_EXIT_CODE, onParentTerminationSignal, spawn, spawnSync, shlex } from "./src/exec.ts";
|
|
25
|
+
export { COMMAND_NOT_FOUND_EXIT_CODE, onParentTerminationSignal, shutdownProcessTree, spawn, spawnSync, shlex } from "./src/exec.ts";
|
|
26
26
|
export type { ExecStdio, LineHandler, LineOutputOptions, StdioOption, ExecResult, ChildProcessResult, ChildProcessTerminationOptions, ExecOptions, SyncExecStdio, SyncExecOptions, SpawnArgs } from "./src/exec.ts";
|
|
27
27
|
export { withFileLock, acquireFileLock } from "./src/file-lock.ts";
|
|
28
28
|
export type { FileLockBackend, FileLockAcquisition, FileLockOptions, FileLockLease } from "./src/file-lock.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/core";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.175";
|
|
3
3
|
export * as bin from "./src/bin.ts";
|
|
4
4
|
export * as brandFiles from "./src/brand-files.ts";
|
|
5
5
|
export * as bundle from "./src/bundle.ts";
|
|
@@ -18,7 +18,7 @@ export { ENV_ONLY, valueSchema, bundleResourceSchema, bundleEnvEntrySchema, bund
|
|
|
18
18
|
export type { ConfigMapValue, ConfigData, ConfigSource, ConfigOptions, ConfigFile } from "./src/config-utils.ts";
|
|
19
19
|
export { missingDependencies, resolveVersion, resolveDependencies } from "./src/dependency-resolver.ts";
|
|
20
20
|
export type { DependencyResolverOptions, DependencyInfo, ResolvedNpmVersion, NpmSpecifierInput, ResolvedNpmDependencies, MissingDependencyInfo } from "./src/dependency-resolver.ts";
|
|
21
|
-
export { COMMAND_NOT_FOUND_EXIT_CODE, onParentTerminationSignal, spawn, spawnSync, shlex } from "./src/exec.ts";
|
|
21
|
+
export { COMMAND_NOT_FOUND_EXIT_CODE, onParentTerminationSignal, shutdownProcessTree, spawn, spawnSync, shlex } from "./src/exec.ts";
|
|
22
22
|
export type { ExecStdio, LineHandler, LineOutputOptions, StdioOption, ExecResult, ChildProcessResult, ChildProcessTerminationOptions, ExecOptions, SyncExecStdio, SyncExecOptions, SpawnArgs } from "./src/exec.ts";
|
|
23
23
|
export { withFileLock, acquireFileLock } from "./src/file-lock.ts";
|
|
24
24
|
export type { FileLockBackend, FileLockAcquisition, FileLockOptions, FileLockLease } from "./src/file-lock.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/core";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.175";
|
|
6
6
|
export * as bin from "./src/bin.js";
|
|
7
7
|
export * as brandFiles from "./src/brand-files.js";
|
|
8
8
|
export * as bundle from "./src/bundle.js";
|
|
@@ -18,9 +18,9 @@ export { findBrandContextFile, loadBrandContextFile, loadBrandContext, resolveBr
|
|
|
18
18
|
export { appResources } from "./src/bundle.js";
|
|
19
19
|
export { ENV_ONLY, valueSchema, bundleResourceSchema, bundleEnvEntrySchema, bundleAppSchema, appEnvEntrySchema, appSchema, flattenBundleEnv, flattenAppEnv, getBundlePath, environmentKeys, text, resolveValue, string, boolean, positiveNumber, positiveInt, port, list, bundleFile, appFile } from "./src/config-utils.js";
|
|
20
20
|
export { missingDependencies, resolveVersion, resolveDependencies } from "./src/dependency-resolver.js";
|
|
21
|
-
export { COMMAND_NOT_FOUND_EXIT_CODE, onParentTerminationSignal, spawn, spawnSync, shlex } from "./src/exec.js";
|
|
21
|
+
export { COMMAND_NOT_FOUND_EXIT_CODE, onParentTerminationSignal, shutdownProcessTree, spawn, spawnSync, shlex } from "./src/exec.js";
|
|
22
22
|
export { withFileLock, acquireFileLock } from "./src/file-lock.js";
|
|
23
23
|
export { statSync, cachedRecord } from "./src/file.js";
|
|
24
24
|
export { withProcessLock, processLockWorkerOptions, attachProcessLock, processLockAttached } from "./src/process-lock.js";
|
|
25
25
|
export { resolveWorkingDirectory, root, parseGitRemote, resolveProjectRoots, parseProjectGhRemote, resolveProjectGhAccount, repositoryUrl, npmRegistry } from "./src/project-utils.js";
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxrQkFBa0IsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV0RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3VCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFeEcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLHlCQUF5QixFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJJLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSx3QkFBd0IsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvY29yZVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjE3NVwiO1xuZXhwb3J0ICogYXMgYmluIGZyb20gXCIuL3NyYy9iaW4udHNcIjtcbmV4cG9ydCAqIGFzIGJyYW5kRmlsZXMgZnJvbSBcIi4vc3JjL2JyYW5kLWZpbGVzLnRzXCI7XG5leHBvcnQgKiBhcyBidW5kbGUgZnJvbSBcIi4vc3JjL2J1bmRsZS50c1wiO1xuZXhwb3J0ICogYXMgY29uZmlnVXRpbHMgZnJvbSBcIi4vc3JjL2NvbmZpZy11dGlscy50c1wiO1xuZXhwb3J0ICogYXMgZGVwZW5kZW5jeVJlc29sdmVyIGZyb20gXCIuL3NyYy9kZXBlbmRlbmN5LXJlc29sdmVyLnRzXCI7XG5leHBvcnQgKiBhcyBleGVjIGZyb20gXCIuL3NyYy9leGVjLnRzXCI7XG5leHBvcnQgKiBhcyBmaWxlTG9jayBmcm9tIFwiLi9zcmMvZmlsZS1sb2NrLnRzXCI7XG5leHBvcnQgKiBhcyBmaWxlIGZyb20gXCIuL3NyYy9maWxlLnRzXCI7XG5leHBvcnQgKiBhcyBwcm9jZXNzTG9jayBmcm9tIFwiLi9zcmMvcHJvY2Vzcy1sb2NrLnRzXCI7XG5leHBvcnQgKiBhcyBwcm9qZWN0VXRpbHMgZnJvbSBcIi4vc3JjL3Byb2plY3QtdXRpbHMudHNcIjtcbmV4cG9ydCB7IHBhcnNlVmVyc2lvbiwgaXNWZXJzaW9uQXRMZWFzdCwgZW5zdXJlIH0gZnJvbSBcIi4vc3JjL2Jpbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBCaW5Db250ZXh0LCBCaW5TZWxlY3Rpb25Db250ZXh0LCBCaW5TZWxlY3RvciwgQmluVmVyc2lvbk91dHB1dCwgQmluVmVyc2lvblBhcnNlciwgQmluT3B0aW9ucywgQmluUGFja2FnZU9wdGlvbnMsIEJpblVybFJlc29sdmVDb250ZXh0LCBCaW5Tb3VyY2UsIEJpblVybCB9IGZyb20gXCIuL3NyYy9iaW4udHNcIjtcbmV4cG9ydCB7IGZpbmRCcmFuZENvbnRleHRGaWxlLCBsb2FkQnJhbmRDb250ZXh0RmlsZSwgbG9hZEJyYW5kQ29udGV4dCwgcmVzb2x2ZUJyYW5kQXNzZXRQYXRoIH0gZnJvbSBcIi4vc3JjL2JyYW5kLWZpbGVzLnRzXCI7XG5leHBvcnQgeyBhcHBSZXNvdXJjZXMgfSBmcm9tIFwiLi9zcmMvYnVuZGxlLnRzXCI7XG5leHBvcnQgeyBFTlZfT05MWSwgdmFsdWVTY2hlbWEsIGJ1bmRsZVJlc291cmNlU2NoZW1hLCBidW5kbGVFbnZFbnRyeVNjaGVtYSwgYnVuZGxlQXBwU2NoZW1hLCBhcHBFbnZFbnRyeVNjaGVtYSwgYXBwU2NoZW1hLCBmbGF0dGVuQnVuZGxlRW52LCBmbGF0dGVuQXBwRW52LCBnZXRCdW5kbGVQYXRoLCBlbnZpcm9ubWVudEtleXMsIHRleHQsIHJlc29sdmVWYWx1ZSwgc3RyaW5nLCBib29sZWFuLCBwb3NpdGl2ZU51bWJlciwgcG9zaXRpdmVJbnQsIHBvcnQsIGxpc3QsIGJ1bmRsZUZpbGUsIGFwcEZpbGUgfSBmcm9tIFwiLi9zcmMvY29uZmlnLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IENvbmZpZ01hcFZhbHVlLCBDb25maWdEYXRhLCBDb25maWdTb3VyY2UsIENvbmZpZ09wdGlvbnMsIENvbmZpZ0ZpbGUgfSBmcm9tIFwiLi9zcmMvY29uZmlnLXV0aWxzLnRzXCI7XG5leHBvcnQgeyBtaXNzaW5nRGVwZW5kZW5jaWVzLCByZXNvbHZlVmVyc2lvbiwgcmVzb2x2ZURlcGVuZGVuY2llcyB9IGZyb20gXCIuL3NyYy9kZXBlbmRlbmN5LXJlc29sdmVyLnRzXCI7XG5leHBvcnQgdHlwZSB7IERlcGVuZGVuY3lSZXNvbHZlck9wdGlvbnMsIERlcGVuZGVuY3lJbmZvLCBSZXNvbHZlZE5wbVZlcnNpb24sIE5wbVNwZWNpZmllcklucHV0LCBSZXNvbHZlZE5wbURlcGVuZGVuY2llcywgTWlzc2luZ0RlcGVuZGVuY3lJbmZvIH0gZnJvbSBcIi4vc3JjL2RlcGVuZGVuY3ktcmVzb2x2ZXIudHNcIjtcbmV4cG9ydCB7IENPTU1BTkRfTk9UX0ZPVU5EX0VYSVRfQ09ERSwgb25QYXJlbnRUZXJtaW5hdGlvblNpZ25hbCwgc2h1dGRvd25Qcm9jZXNzVHJlZSwgc3Bhd24sIHNwYXduU3luYywgc2hsZXggfSBmcm9tIFwiLi9zcmMvZXhlYy50c1wiO1xuZXhwb3J0IHR5cGUgeyBFeGVjU3RkaW8sIExpbmVIYW5kbGVyLCBMaW5lT3V0cHV0T3B0aW9ucywgU3RkaW9PcHRpb24sIEV4ZWNSZXN1bHQsIENoaWxkUHJvY2Vzc1Jlc3VsdCwgQ2hpbGRQcm9jZXNzVGVybWluYXRpb25PcHRpb25zLCBFeGVjT3B0aW9ucywgU3luY0V4ZWNTdGRpbywgU3luY0V4ZWNPcHRpb25zLCBTcGF3bkFyZ3MgfSBmcm9tIFwiLi9zcmMvZXhlYy50c1wiO1xuZXhwb3J0IHsgd2l0aEZpbGVMb2NrLCBhY3F1aXJlRmlsZUxvY2sgfSBmcm9tIFwiLi9zcmMvZmlsZS1sb2NrLnRzXCI7XG5leHBvcnQgdHlwZSB7IEZpbGVMb2NrQmFja2VuZCwgRmlsZUxvY2tBY3F1aXNpdGlvbiwgRmlsZUxvY2tPcHRpb25zLCBGaWxlTG9ja0xlYXNlIH0gZnJvbSBcIi4vc3JjL2ZpbGUtbG9jay50c1wiO1xuZXhwb3J0IHsgc3RhdFN5bmMsIGNhY2hlZFJlY29yZCB9IGZyb20gXCIuL3NyYy9maWxlLnRzXCI7XG5leHBvcnQgeyB3aXRoUHJvY2Vzc0xvY2ssIHByb2Nlc3NMb2NrV29ya2VyT3B0aW9ucywgYXR0YWNoUHJvY2Vzc0xvY2ssIHByb2Nlc3NMb2NrQXR0YWNoZWQgfSBmcm9tIFwiLi9zcmMvcHJvY2Vzcy1sb2NrLnRzXCI7XG5leHBvcnQgeyByZXNvbHZlV29ya2luZ0RpcmVjdG9yeSwgcm9vdCwgcGFyc2VHaXRSZW1vdGUsIHJlc29sdmVQcm9qZWN0Um9vdHMsIHBhcnNlUHJvamVjdEdoUmVtb3RlLCByZXNvbHZlUHJvamVjdEdoQWNjb3VudCwgcmVwb3NpdG9yeVVybCwgbnBtUmVnaXN0cnkgfSBmcm9tIFwiLi9zcmMvcHJvamVjdC11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBQcm9qZWN0Q29udGV4dCwgUHJvamVjdEdoUmVtb3RlLCBQcm9qZWN0R2hBY2NvdW50LCBSZXNvbHZlUHJvamVjdEdoQWNjb3VudE9wdGlvbnMsIE5wbVJlZ2lzdHJ5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9wcm9qZWN0LXV0aWxzLnRzXCI7XG4iXX0=
|
package/lib/src/exec.d.ts
CHANGED
|
@@ -169,6 +169,17 @@ export type SpawnArgs<T extends SpawnOptions> = [command: string, ...args: strin
|
|
|
169
169
|
* @returns Unsubscribe function
|
|
170
170
|
*/
|
|
171
171
|
export declare function onParentTerminationSignal(listener: (signal: NodeJS.Signals) => void): () => void;
|
|
172
|
+
/**
|
|
173
|
+
* Stop an existing child process and every descendant discovered through
|
|
174
|
+
* operating-system process snapshots.
|
|
175
|
+
*
|
|
176
|
+
* Use this when a caller must retain native `child_process.spawn` behavior but
|
|
177
|
+
* still needs the same process-tree shutdown policy as {@link spawn}.
|
|
178
|
+
*
|
|
179
|
+
* @param child - Root child process whose snapshotted tree should stop
|
|
180
|
+
* @param options - Graceful and forced shutdown timeout policy
|
|
181
|
+
*/
|
|
182
|
+
export declare function shutdownProcessTree(child: ChildProcess, options?: ChildProcessTerminationOptions): Promise<void>;
|
|
172
183
|
/**
|
|
173
184
|
* Spawn a subprocess. Returns the LIVE child handle that is ALSO a
|
|
174
185
|
* `Promise<ExecResult>` resolving on exit - see {@link ChildProcessResult}.
|
package/lib/src/exec.js
CHANGED
|
@@ -750,22 +750,19 @@ function linesFromCapturedOutput(output) {
|
|
|
750
750
|
return output.replace(/\r\n/g, "\n").replace(/\r/g, "\n").split("\n");
|
|
751
751
|
}
|
|
752
752
|
/**
|
|
753
|
-
* Stop
|
|
754
|
-
* process snapshots.
|
|
753
|
+
* Stop an existing child process and every descendant discovered through
|
|
754
|
+
* operating-system process snapshots.
|
|
755
755
|
*
|
|
756
|
-
*
|
|
757
|
-
*
|
|
758
|
-
* the process table, merges newly created descendants, and sends each one the
|
|
759
|
-
* active shutdown signal once. macOS and other POSIX platforms use `ps`;
|
|
760
|
-
* Windows uses the built-in PowerShell CIM process provider.
|
|
761
|
-
*
|
|
762
|
-
* Windows does not implement POSIX signal semantics. Node terminates processes
|
|
763
|
-
* unconditionally for supported signals there, including `SIGTERM`.
|
|
756
|
+
* Use this when a caller must retain native `child_process.spawn` behavior but
|
|
757
|
+
* still needs the same process-tree shutdown policy as {@link spawn}.
|
|
764
758
|
*
|
|
765
759
|
* @param child - Root child process whose snapshotted tree should stop
|
|
766
760
|
* @param options - Graceful and forced shutdown timeout policy
|
|
767
|
-
* @param terminateSignal - Internal signal selected from the parent event or platform default
|
|
768
761
|
*/
|
|
762
|
+
export async function shutdownProcessTree(child, options = {}) {
|
|
763
|
+
await terminateProcessTree(child, options);
|
|
764
|
+
}
|
|
765
|
+
/** Stop a process tree with an internally selected graceful signal. */
|
|
769
766
|
async function terminateProcessTree(child, options = {}, terminateSignal = DEFAULT_TERMINATE_SIGNAL) {
|
|
770
767
|
if (child.pid === undefined || child.exitCode !== null || child.signalCode !== null) {
|
|
771
768
|
return;
|
|
@@ -1023,4 +1020,4 @@ export function shlex(command) {
|
|
|
1023
1020
|
push();
|
|
1024
1021
|
return args.length ? args : [command];
|
|
1025
1022
|
}
|
|
1026
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRDRztBQUNILE9BQU8sRUFHTCxLQUFLLElBQUksU0FBUyxFQUNsQixTQUFTLElBQUksYUFBYSxHQUMzQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxLQUFLLFFBQVEsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUvRCw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFDO0FBRS9DLE1BQU0sNEJBQTRCLEdBQUcsS0FBSyxDQUFDO0FBQzNDLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0FBQ3RDLE1BQU0sNkJBQTZCLEdBQUcsR0FBRyxDQUFDO0FBQzFDLE1BQU0sd0JBQXdCLEdBQW1CLFNBQVMsQ0FBQztBQUMzRCxNQUFNLG1CQUFtQixHQUFtQixTQUFTLENBQUM7QUFDdEQsTUFBTSx3QkFBd0IsR0FBRyxDQUMvQixPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU87SUFDMUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQ1gsQ0FBQztBQUN0QyxNQUFNLCtCQUErQixHQUNuQyx1SUFBdUksQ0FBQztBQUMxSSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBcUx2QyxNQUFNLDBCQUEwQixHQUFHLE9BQU8sQ0FBQyxHQUErQixFQUFFLENBQUMsQ0FBQztJQUM1RSxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUU7SUFDbkIsUUFBUSxFQUFFLElBQUksR0FBRyxFQUFFO0lBQ25CLGlCQUFpQixFQUFFLElBQUksR0FBRyxFQUFFO0lBQzVCLFNBQVMsRUFBRSxJQUFJLEdBQUcsRUFBRTtDQUNyQixDQUFDLENBQUMsQ0FBQztBQUNKLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQTRDLENBQUM7QUFFdEYsU0FBUyw4QkFBOEIsQ0FBQyxLQUF5QjtJQUMvRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQ3RCLElBQUksR0FBRyxLQUFLLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN4QyxNQUFNLEtBQUssR0FBRywwQkFBMEIsRUFBRSxDQUFDO0lBQzNDLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQixPQUFPLEdBQUcsRUFBRTtRQUNWLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSztZQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BFLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLDJCQUEyQixDQUFDLEtBQWlDO0lBQ3BFLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQztRQUFFLE9BQU87SUFDcEMsS0FBSyxNQUFNLE1BQU0sSUFBSSx3QkFBd0IsRUFBRSxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUM7Z0JBQ0gsbUJBQW1CLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3JDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEQsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNwQyxPQUFPLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsUUFBMEM7SUFDbEYsTUFBTSxLQUFLLEdBQUcsMEJBQTBCLEVBQUUsQ0FBQztJQUMzQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixPQUFPLEdBQUcsRUFBRTtRQUNWLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLEtBQWlDLEVBQUUsTUFBc0I7SUFDcEYsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU87SUFDaEQsS0FBSyxNQUFNLFFBQVEsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDO1lBQ0gsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsdUJBQXVCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFvQixFQUFFLENBQUM7SUFDdEMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDekQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0IsU0FBUztRQUNYLENBQUM7UUFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUN2RCx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLDBCQUEwQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkYsS0FBSyxTQUFTLENBQUM7UUFDZixPQUFPO0lBQ1QsQ0FBQztJQUNELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsS0FBSyxTQUFTO1NBQ1gsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDO1lBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsdUJBQXVCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUMsQ0FBQztTQUNELEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2YsdUJBQXVCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxTQUFTLDRCQUE0QixDQUNuQyxLQUF5QixFQUN6QixHQUFXLEVBQ1gsTUFBc0I7SUFFdEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdEUsdUJBQXVCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsdUJBQXVCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQzlCLE1BQXNCLEVBQ3RCLEdBQXVCLEVBQ3ZCLEtBQWM7SUFFZCxJQUFJLDhCQUE4QixDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU87SUFDbEQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRTtZQUM3QyxNQUFNO1lBQ04sR0FBRyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNyQyxLQUFLO1NBQ04sQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLDZFQUE2RTtJQUMvRSxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsOEJBQThCLENBQUMsS0FBYztJQUNwRCxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlDLE9BQU8sS0FBSyxZQUFZLGNBQWMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0FBQy9GLENBQUM7QUFFRCxTQUFTLDBCQUEwQjtJQUNqQyxNQUFNLGFBQWEsR0FBSSxPQUF3QyxDQUFDLHVCQUF1QixDQUFDO0lBQ3hGLE1BQU0sYUFBYSxHQUFJLFVBQTBELENBQy9FLE1BQU0sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FDRCxDQUFDO0lBQ25DLE9BQU8sc0JBQXNCLENBQUMsYUFBYSxDQUFDLEdBQUcsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsT0FBc0M7SUFDcEUsT0FBTyxPQUFPLE9BQU8sRUFBRSxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUN0QixRQUE2QixFQUM3Qix5QkFBa0M7SUFFbEMsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLHlCQUF5QixJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDeEYsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUF5QixLQUFtQjtJQUNqRSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBRS9CLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixNQUFNLE9BQU8sR0FDWCxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZGLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzlELG1HQUFtRztJQUNuRyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsV0FBVyxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFNLENBQUMsQ0FBQztJQUN6RixNQUFNLFNBQVMsR0FDYixjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsY0FBYyxDQUFDO0lBRXJCLE9BQU87UUFDTCxPQUFPLEVBQUUsT0FBUTtRQUNqQixXQUFXLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUMzQyxPQUFPLEVBQUUsT0FBWTtLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsNkJBQTZCLENBQUMsS0FBd0I7SUFDN0QsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUN2RCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNELE9BQU8sS0FBaUIsQ0FBQztBQUMzQixDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLFNBQVMseUJBQXlCLENBQUMsSUFBWTtJQUM3QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsZ0RBQWdEO0FBQ2hELFNBQVMsb0JBQW9CLENBQUMsS0FBd0IsRUFBRSxJQUF5QjtJQUMvRSxJQUFJLElBQUksS0FBSyxJQUFJO1FBQUUsT0FBTyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0UsT0FBTyxLQUFpQixDQUFDO0FBQzNCLENBQUM7QUFFRCx5REFBeUQ7QUFDekQsU0FBUyx3QkFBd0IsQ0FBQyxLQUF3QixFQUFFLElBQXlCO0lBQ25GLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsT0FBTyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNoRCxDQUFDO0FBRUQsK0NBQStDO0FBQy9DLFNBQVMsbUJBQW1CLENBQUMsS0FBd0IsRUFBRSxJQUF5QjtJQUM5RSxJQUFJLElBQUksS0FBSyxLQUFLO1FBQUUsT0FBTyxLQUFpQixDQUFDO0lBQzdDLElBQUksSUFBSSxLQUFLLElBQUk7UUFBRSxPQUFPLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRSxPQUFPLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCwrQ0FBK0M7QUFDL0MsU0FBUyxzQkFBc0IsQ0FDN0IsSUFBd0IsRUFDeEIsSUFBeUI7SUFFekIsSUFBSSxJQUFJLEtBQUssU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3pDLElBQUksSUFBSSxLQUFLLEtBQUs7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNoQyxJQUFJLElBQUksS0FBSyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEMsT0FBTyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxZQUFZLENBQUMsT0FBZSxFQUFFLElBQWM7SUFDbkQsT0FBTyxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDNUMsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixTQUFTLHNCQUFzQixDQUFDLEtBQWM7SUFDNUMsT0FBTyxLQUFLLFlBQVksS0FBSyxJQUFJLE1BQU0sSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7QUFDOUUsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixTQUFTLHFCQUFxQixDQUFDLEtBQWM7SUFDM0MsT0FBTyxLQUFLLFlBQVksS0FBSyxJQUFJLE1BQU0sSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDN0UsQ0FBQztBQUVELDhDQUE4QztBQUM5QyxTQUFTLFlBQVksQ0FBQyxLQUFhLEVBQUUsSUFBWTtJQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLElBQUksdUNBQXVDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLFNBQVMsbUJBQW1CLENBQUMsT0FBZTtJQUMxQyxNQUFNLFdBQVcsR0FBRyxPQUE4RCxDQUFDO0lBQ25GLElBQUksV0FBVyxDQUFDLGVBQWUsS0FBSyxTQUFTLElBQUksV0FBVyxDQUFDLFVBQVUsS0FBSyxTQUFTO1FBQUUsT0FBTztJQUM5RixNQUFNLElBQUksU0FBUyxDQUNqQiw2RkFBNkYsQ0FDOUYsQ0FBQztBQUNKLENBQUM7QUFFRCx5RUFBeUU7QUFDekUsU0FBUyxvQkFBb0IsQ0FBQyxLQUF3QjtJQUNwRCxNQUFNLFFBQVEsR0FBMkIsRUFBRSxDQUFDO0lBQzVDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsTUFBTSxLQUFLLEdBQUcsb0NBQW9DLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELE1BQU0sUUFBUSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRO1lBQUUsU0FBUztRQUNsQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ1osR0FBRyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxFQUFFLEVBQUUsQ0FBQztZQUNuQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLFFBQVE7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELHdGQUF3RjtBQUN4RixTQUFTLHVCQUF1QixDQUFDLEtBQWM7SUFDN0MsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDbEUsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQztBQUN0RixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLFNBQVMscUJBQXFCLENBQUMsR0FBVyxFQUFFLElBQVk7SUFDdEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QyxJQUFJLFVBQVUsR0FBRyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSTtTQUNoQixLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztTQUNyQixJQUFJLEVBQUU7U0FDTixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3RFLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUNsRCxDQUFDO0FBRUQscUZBQXFGO0FBQ3JGLEtBQUssVUFBVSxvQkFBb0I7SUFDakMsTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUMvQixXQUFXO1NBQ1IsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEUsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQTZDLEVBQUU7UUFDOUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQztZQUNILE9BQU8scUJBQXFCLENBQUMsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDLFNBQVMsS0FBSyxDQUFDLElBQUksT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLHVCQUF1QixDQUFDLEtBQUssQ0FBQztnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUNyRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ0YsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFpQyxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZGLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsS0FBSyxVQUFVLGVBQWU7SUFDNUIsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU87UUFBRSxPQUFPLG9CQUFvQixFQUFFLENBQUM7SUFFaEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdkUsTUFBTSxJQUFJLEdBQ1IsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPO1FBQzFCLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLCtCQUErQixDQUFDO1FBQzNGLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUUsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7UUFDcEMsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7UUFDakMsV0FBVyxFQUFFLElBQUk7UUFDakIsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFDLENBQUM7SUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU8sQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTyxDQUFDLENBQUM7SUFDbEMsTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2xHLElBQUksUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQ2IsR0FBRyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsUUFBUSxJQUNyRCxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQzFDLEVBQUUsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sb0JBQW9CLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsdUZBQXVGO0FBQ3ZGLEtBQUssVUFBVSxrQkFBa0I7SUFDL0IsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLGVBQWUsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQsOENBQThDO0FBQzlDLFNBQVMsZUFBZSxDQUN0QixRQUF5QztJQUV6QyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztJQUMzRCxLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzdCLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyRCxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxTQUFTLFdBQVcsQ0FDbEIsUUFBeUMsRUFDekMsT0FBZTtJQUVmLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLENBQUM7SUFDN0QsSUFBSSxDQUFDLElBQUk7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRTFFLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQyxNQUFNLElBQUksR0FBMkIsRUFBRSxDQUFDO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMzQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsU0FBaUIsRUFBUSxFQUFFO1FBQ3BELEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNsRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxTQUFTO1lBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDLENBQUM7SUFDRixpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELHVFQUF1RTtBQUN2RSxTQUFTLFdBQVcsQ0FBQyxRQUE4QixFQUFFLE9BQTZCO0lBQ2hGLE9BQU8sUUFBUSxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDO0FBQ2hELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixRQUEyQyxFQUMzQyxRQUF5QztJQUV6QyxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQyxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUMxRCxNQUFNLFVBQVUsR0FBMkIsRUFBRSxDQUFDO0lBQzlDLE1BQU0sS0FBSyxHQUEyQixFQUFFLENBQUM7SUFFekMsS0FBSyxNQUFNLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUN6QyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUM7WUFBRSxTQUFTO1FBQzFELFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3JELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUUsQ0FBQztRQUM3QixLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ25ELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQy9DLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDL0IsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixDQUFDO1lBQ0QsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO2dCQUFFLFNBQVM7WUFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBQzVELENBQUM7QUFFRCxtRkFBbUY7QUFDbkYsU0FBUyxlQUFlLENBQUMsS0FBMkI7SUFDbEQsT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQzFDLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsU0FBUyxlQUFlLENBQ3RCLFNBQTBDLEVBQzFDLE1BQXNCLEVBQ3RCLFFBQXFCO0lBRXJCLE1BQU0sTUFBTSxHQUFjLEVBQUUsQ0FBQztJQUM3QixLQUFLLE1BQU0sS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQUUsU0FBUztRQUNyQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsTUFBTSwrQkFBK0IsQ0FBQyxDQUFDO0lBQzVGLENBQUM7QUFDSCxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLFNBQVMsS0FBSyxDQUFDLFlBQW9CO0lBQ2pDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxzQkFBc0IsQ0FDbkMsUUFBMkMsRUFDM0MsZ0JBQWlELEVBQ2pELE1BQXNCLEVBQ3RCLFFBQXFCLEVBQ3JCLFNBQWlCLEVBQ2pCLGNBQXNCLEVBQ3RCLGdCQUF5QjtJQUV6QixJQUFJLFNBQVMsR0FBRyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBQ3hDLE9BQU8sU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QixNQUFNLFdBQVcsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzFDLElBQUksV0FBVyxHQUFHLENBQUM7WUFBRSxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sUUFBUSxHQUFHLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQztRQUM1QyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxRQUFRO2dCQUFFLE1BQU07WUFDbEMsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDekQsSUFBSSxnQkFBZ0IsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxlQUFlLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLFFBQVE7WUFBRSxNQUFNO0lBQ3BDLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDdkIsUUFBZ0IsRUFDaEIsV0FBcUIsRUFDckIsV0FBcUIsRUFDckIsSUFBeUI7SUFFekIsT0FBTztRQUNMLFFBQVE7UUFDUixJQUFJLFdBQVc7WUFDYixPQUFPLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxXQUFXO1lBQ2IsT0FBTyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELElBQUksTUFBTTtZQUNSLE9BQU8sd0JBQXdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxJQUFJLE1BQU07WUFDUixPQUFPLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLG9CQUFvQixDQUMzQixRQUFnQixFQUNoQixVQUE4QixFQUM5QixVQUE4QixFQUM5QixJQUF5QjtJQUV6QixJQUFJLGdCQUFzQyxDQUFDO0lBQzNDLElBQUksZ0JBQXNDLENBQUM7SUFFM0MsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUF3QixFQUF3QixFQUFFO1FBQ25FLElBQUksSUFBSSxLQUFLLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN6QyxPQUFPLG1CQUFtQixDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQztJQUVGLE9BQU87UUFDTCxRQUFRO1FBQ1IsSUFBSSxXQUFXO1lBQ2IsSUFBSSxVQUFVLEtBQUssU0FBUztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUN4QyxnQkFBZ0IsS0FBSyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pELE9BQU8sZ0JBQWdCLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksV0FBVztZQUNiLElBQUksVUFBVSxLQUFLLFNBQVM7Z0JBQUUsT0FBTyxFQUFFLENBQUM7WUFDeEMsZ0JBQWdCLEtBQUssU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqRCxPQUFPLGdCQUFnQixDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLE1BQU07WUFDUixPQUFPLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEQsQ0FBQztRQUNELElBQUksTUFBTTtZQUNSLE9BQU8sc0JBQXNCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4RCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsWUFBWSxDQUFDLE1BQW1CO0lBQ3ZDLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVTtRQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQXVCLEVBQUUsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtRQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkQsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsTUFBbUI7SUFDeEMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLE1BQWU7SUFDeEMsT0FBTyxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQztBQUMxRSxDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLFNBQVMsY0FBYyxDQUFDLEtBQXFDO0lBQzNELE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLFlBQVksQ0FDbkIsTUFBK0IsRUFDL0IsS0FBZSxFQUNmLGNBQXlCLFNBQVM7SUFFbEMsSUFBSSxNQUFNLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDdkQsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEtBQUssTUFBTTtRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFFNUUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxPQUFPO1FBQ0wsSUFBSSxFQUFFLE1BQU07UUFDWixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNmLElBQUksT0FBTztnQkFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlCLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUTtnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxLQUFLLFVBQVUsU0FBUyxDQUFDLE1BQWdCLEVBQUUsTUFBbUI7SUFDNUQsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDNUUsSUFBSSxDQUFDO1FBQ0gsSUFBSSxLQUFLLEVBQUUsTUFBTSxJQUFJLElBQUksRUFBRTtZQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO1lBQVMsQ0FBQztRQUNULEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNiLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxjQUFjLENBQ3JCLEtBQXNCLEVBQ3RCLE1BQXVCLEVBQ3ZCLE9BQXNCO0lBRXRCLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxNQUFNO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxLQUFLLFVBQVUsVUFBVSxDQUN2QixJQUFrQixFQUNsQixLQUFxQztJQUVyQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPO0lBQ2xELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxVQUFVLENBQUM7SUFDbkIsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksS0FBSyxJQUFJLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7WUFBRSxNQUFNLEdBQUcsQ0FBQztJQUNsRixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxJQUFrQjtJQUNyQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxTQUFTLENBQUMsT0FBZSxFQUFFLElBQWMsRUFBRSxNQUFrQjtJQUNwRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUMsT0FBTyxJQUFJLEtBQUssQ0FDZCxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ2hHLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGdCQUFnQixDQUN2QixNQUFpQyxFQUNqQyxjQUF5QixTQUFTO0lBRWxDLElBQUksTUFBTSxLQUFLLFNBQVM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUM3QyxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDeEMsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxZQUFZLENBQUMsTUFBMEM7SUFDOUQsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUQsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxNQUFjO0lBQzdDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsS0FBSyxVQUFVLG9CQUFvQixDQUNqQyxLQUFtQixFQUNuQixVQUEwQyxFQUFFLEVBQzVDLGtCQUFrQyx3QkFBd0I7SUFFMUQsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BGLE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQ25DLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSw0QkFBNEIsRUFDeEQsa0JBQWtCLENBQ25CLENBQUM7SUFDRixNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSx1QkFBdUIsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNoRyxNQUFNLGNBQWMsR0FBRyw2QkFBNkIsQ0FBQztJQUNyRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGtCQUFrQixFQUFFLENBQUM7SUFDNUMsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLElBQUk7UUFBRSxPQUFPO0lBQ2pFLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsTUFBTSxLQUFLLENBQUM7UUFDakQsQ0FBQztRQUNELE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsRSxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3JDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sV0FBVyxHQUFHLE1BQU0sc0JBQXNCLENBQzlDLFFBQVEsRUFDUixJQUFJLEVBQ0osZUFBZSxFQUNmLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLElBQUksQ0FDTCxDQUFDO0lBQ0YsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPO0lBRXJDLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDakMsZUFBZSxDQUFDLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxRCxNQUFNLFNBQVMsR0FBRyxNQUFNLHNCQUFzQixDQUM1QyxRQUFRLEVBQ1IsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixNQUFNLEVBQ04sV0FBVyxFQUNYLGNBQWMsRUFDZCxJQUFJLENBQ0wsQ0FBQztJQUNGLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTztJQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLCtDQUErQyxFQUFFO1FBQzNELE9BQU8sRUFBRSxLQUFLLENBQUMsR0FBRztRQUNsQixZQUFZLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUNqRCxVQUFVLEVBQUUsbUJBQW1CO1FBQy9CLFdBQVc7S0FDWixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxHQUFHLElBQTRCO0lBQ25ELE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEUsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0IsTUFBTSxFQUNKLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLHlCQUF5QixHQUFHLElBQUksRUFDaEMsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxLQUFLLEVBQ0wsSUFBSSxFQUNKLEdBQUcsU0FBUyxFQUNiLEdBQUcsT0FBTyxDQUFDO0lBQ1osTUFBTSxrQkFBa0IsR0FBbUM7UUFDekQsZ0JBQWdCO1FBQ2hCLFdBQVc7S0FDWixDQUFDO0lBQ0YsTUFBTSxXQUFXLEdBQWEsRUFBRSxDQUFDO0lBQ2pDLE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQztJQUNqQyxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDeEQsTUFBTSxTQUFTLEdBQWMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBRW5GLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFO1FBQzNDLEdBQUcsU0FBUztRQUNaLFFBQVEsRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSx5QkFBeUIsQ0FBQztRQUN4RSxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDO0tBQzNELENBQUMsQ0FBQztJQUNILE1BQU0sS0FBSyxHQUFHLHFCQUFxQixDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQzlELE1BQU0sMEJBQTBCLEdBQUcseUJBQXlCO1FBQzFELENBQUMsQ0FBQyw4QkFBOEIsQ0FBQyxLQUFLLENBQUM7UUFDdkMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUVkLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFM0MsTUFBTSxLQUFLLEdBQW9CLEVBQUUsQ0FBQztJQUNsQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDbEQsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRWxELE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBSyxJQUF5QixFQUFFO1FBQ2xELElBQUksQ0FBQztZQUNILElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNqQixJQUFJLG9CQUF1RCxDQUFDO1lBQzVELElBQUksQ0FBQztnQkFDSCxRQUFRLEdBQUcsTUFBTSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ25DLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2pDLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ2pELE1BQU0sR0FBRyxDQUFDO2dCQUNaLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDdkMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLO29CQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDM0Qsb0JBQW9CLEdBQUcsR0FBRyxDQUFDO2dCQUMzQixRQUFRLEdBQUcsMkJBQTJCLENBQUM7WUFDekMsQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFFLElBQUksS0FBSyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLG9CQUFvQjtvQkFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLG9CQUFvQixDQUFDO2dCQUMzRCxNQUFNLEdBQUcsQ0FBQztZQUNaLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO2dCQUFTLENBQUM7WUFDVCwwQkFBMEIsRUFBRSxFQUFFLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFTCw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSxPQUFPLGFBQWEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQzVCLEtBQW1CLEVBQ25CLFFBQXdDO0lBRXhDLE1BQU0sVUFBVSxHQUFHLEtBQTJCLENBQUM7SUFDL0MsSUFBSSxlQUEwQyxDQUFDO0lBQy9DLE1BQU0sUUFBUSxHQUFHLENBQ2YsT0FBdUMsRUFDdkMsZUFBZSxHQUFHLHdCQUF3QixFQUMzQixFQUFFO1FBQ2pCLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLGVBQWUsS0FBSyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLFFBQVEsRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzlGLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUMsQ0FBQztJQUNGLFVBQVUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxPQUFPLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUQscUJBQXFCLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQXNCLE1BQVMsRUFBRSxPQUFtQjtJQUN4RSxNQUFNLE1BQU0sR0FBRyxNQUF3QixDQUFDO0lBQ3hDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsTUFBTSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQUcsSUFBZ0M7SUFDM0QsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxHQUFHLEVBQUUsRUFBRSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNyRSxNQUFNLFNBQVMsR0FBYyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLENBQUM7SUFDbkYsTUFBTSxhQUFhLEdBQUcsTUFBTSxLQUFLLFNBQVMsQ0FBQztJQUMzQyxNQUFNLGFBQWEsR0FBRyxNQUFNLEtBQUssU0FBUyxDQUFDO0lBQzNDLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTVDLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFO1FBQ2pELEdBQUcsU0FBUztRQUNaLFFBQVEsRUFBRSxhQUFhLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDN0QsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7UUFDMUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ2pELENBQUMsQ0FBQztJQUVILE1BQU0sZUFBZSxHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RCxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEYsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDM0UsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDM0UsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFaEYsSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxlQUFlLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RCxHQUFHLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDekIsTUFBTSxHQUFHLENBQUM7SUFDWixDQUFDO0lBRUQsSUFBSSxLQUFLLElBQUksVUFBVSxDQUFDLFFBQVEsS0FBSyxDQUFDO1FBQUUsTUFBTSxTQUFTLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMxRixPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxPQUFlO0lBQ25DLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUUxQixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDakIsSUFBSSxLQUE0QixDQUFDO0lBQ2pDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFbkIsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1FBQ2hCLElBQUksTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDakIsQ0FBQyxDQUFDO0lBRUYsS0FBSyxNQUFNLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN6QixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNkLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDaEIsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNoQixPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ2YsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ2pCLEtBQUssR0FBRyxTQUFTLENBQUM7Z0JBQ2xCLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDaEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDaEIsQ0FBQztZQUNELFNBQVM7UUFDWCxDQUFDO1FBRUQsSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUM3QixLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ1gsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNkLFNBQVM7UUFDWCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbEIsSUFBSSxFQUFFLENBQUM7WUFDUCxTQUFTO1FBQ1gsQ0FBQztRQUVELE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELCtDQUErQztJQUMvQyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLE9BQU8sSUFBSSxJQUFJLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksRUFBRSxDQUFDO0lBRVAsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUG9ydGFibGUgc3VicHJvY2VzcyBoZWxwZXIgYnVpbHQgb24gYGNoaWxkX3Byb2Nlc3Muc3Bhd25gIGFuZCBsaW5lIHN0cmVhbWluZy5cbiAqXG4gKiBFYWNoIHN0ZGlvIGZkIGRlZmF1bHRzIHRvIGBcImluaGVyaXRcImAuIHtAbGluayBzcGF3bn0gc3RyZWFtcyBvdXRwdXRcbiAqIGxpbmUtYnktbGluZSBpbnRvIHtAbGluayBFeGVjUmVzdWx0LnN0ZG91dExpbmVzfVxuICogLyB7QGxpbmsgRXhlY1Jlc3VsdC5zdGRlcnJMaW5lc307IGl0cyBgc3Rkb3V0YCAvIGBzdGRlcnJgIGdldHRlcnMgam9pbiB0aG9zZSBsaW5lcy5cbiAqIHtAbGluayBzcGF3blN5bmN9IGtlZXBzIHRoZSBjYXB0dXJlZCBzdHJpbmc7IGl0cyBgc3Rkb3V0YCAvIGBzdGRlcnJgIGdldHRlcnMgcmVhZFxuICogdGhhdCBzdHJpbmcgZGlyZWN0bHkgKGxpbmUgYXJyYXlzIHNwbGl0IGxhemlseSBvbiByZWFkKS5cbiAqIE9taXR0ZWQgYHRyaW1gIChkZWZhdWx0KSBhcHBsaWVzIGFkYXB0aXZlIG5vcm1hbGl6YXRpb246IHtAbGluayBzcGF3blN5bmN9IGRyb3BzXG4gKiBhdCBtb3N0IG9uZSB0cmFpbGluZyBlbXB0eSBsaW5lIC8gbmV3bGluZSBgc3Bhd25TeW5jYCBhZGRzOyB7QGxpbmsgc3Bhd259IGRvZXNcbiAqIG5vdCAocmVhZGxpbmUgbmV2ZXIgZW1pdHMgdGhhdCBleHRyYSBsaW5lKS4gYHRyaW06IHRydWVgIHN0cmlwcyBhbGwgbGVhZGluZy9cbiAqIHRyYWlsaW5nIHdoaXRlc3BhY2UgaW4gYm90aCBtb2RlczsgYHRyaW06IGZhbHNlYCBsZWF2ZXMgb3V0cHV0IHVuY2hhbmdlZC5cbiAqXG4gKiBUaGlzIG1vZHVsZSBvd25zIHN1YnByb2Nlc3MgZXhlY3V0aW9uIHBvbGljeSBmb3IgTm9kZSBhbmQgQnVuIHBhY2thZ2VzLiBSZXVzZVxuICogaXQgaW5zdGVhZCBvZiB3cmFwcGluZyBgY2hpbGRfcHJvY2Vzc2AgbG9jYWxseSB3aGVuIGNhbGxlcnMgbmVlZCBjb25zaXN0ZW50XG4gKiBhcmd2IHBhcnNpbmcsIHN0ZGlvIGNhcHR1cmUsIGxpbmUgY2FsbGJhY2tzLCBjYW5jZWxsYXRpb24sIGFuZCBleGl0IGNoZWNraW5nLlxuICpcbiAqIEBleGFtcGxlIENhcHR1cmUgY29tbWFuZCBvdXRwdXRcbiAqIGBgYHRzXG4gKiBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgZXhlYyhcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCItLXNob3ctdG9wbGV2ZWxcIl0sIHtcbiAqICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAqICAgc3RkZXJyOiBcImlnbm9yZVwiLFxuICogICBzdGRpbjogXCJpZ25vcmVcIixcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGUgU3RyZWFtIGFuZCBjYXB0dXJlIHRvZ2V0aGVyXG4gKiBgYGB0c1xuICogYXdhaXQgZXhlYyhcInBucG1cIiwgW1wiaW5zdGFsbFwiXSwge1xuICogICBzdGRvdXQ6IFsobGluZSkgPT4gY29uc29sZS5sb2cobGluZSksIFwiY2FwdHVyZVwiXSxcbiAqICAgY2hlY2s6IHRydWUsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFN5bmNocm9ub3VzIGNhcHR1cmUgKG5vIGxpbmUgY2FsbGJhY2tzKVxuICogYGBgdHNcbiAqIGNvbnN0IHsgc3Rkb3V0IH0gPSBleGVjU3luYyhcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCItLXNob3ctdG9wbGV2ZWxcIl0sIHtcbiAqICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAqICAgc3RkZXJyOiBcImlnbm9yZVwiLFxuICogICBzdGRpbjogXCJpZ25vcmVcIixcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQge1xuICB0eXBlIENoaWxkUHJvY2VzcyxcbiAgdHlwZSBTcGF3bk9wdGlvbnMsXG4gIHNwYXduIGFzIG5vZGVTcGF3bixcbiAgc3Bhd25TeW5jIGFzIG5vZGVTcGF3blN5bmMsXG59IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRkaXIsIHJlYWRGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCAqIGFzIHJlYWRsaW5lIGZyb20gXCJub2RlOnJlYWRsaW5lXCI7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gXCJub2RlOnN0cmVhbVwiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCJub2RlOnN0cmVhbS9jb25zdW1lcnNcIjtcbmltcG9ydCB7IGZpbmlzaGVkIH0gZnJvbSBcIm5vZGU6c3RyZWFtL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBsb2csIHRvRXJyb3IsIG1lbW9pemUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG4vKiogU2hlbGwtY29tcGF0aWJsZSBleGl0IGNvZGUgcmV0dXJuZWQgd2hlbiBhbiBleGVjdXRhYmxlIGNhbm5vdCBiZSBmb3VuZC4gKi9cbmV4cG9ydCBjb25zdCBDT01NQU5EX05PVF9GT1VORF9FWElUX0NPREUgPSAxMjc7XG5cbmNvbnN0IERFRkFVTFRfVEVSTUlOQVRFX1RJTUVPVVRfTVMgPSA4XzAwMDtcbmNvbnN0IERFRkFVTFRfS0lMTF9USU1FT1VUX01TID0gNF8wMDA7XG5jb25zdCBERUZBVUxUX0tJTExfUE9MTF9JTlRFUlZBTF9NUyA9IDEwMDtcbmNvbnN0IERFRkFVTFRfVEVSTUlOQVRFX1NJR05BTDogTm9kZUpTLlNpZ25hbHMgPSBcIlNJR1RFUk1cIjtcbmNvbnN0IERFRkFVTFRfS0lMTF9TSUdOQUw6IE5vZGVKUy5TaWduYWxzID0gXCJTSUdLSUxMXCI7XG5jb25zdCBGT1JXQVJERURfUEFSRU5UX1NJR05BTFMgPSAoXG4gIHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIlxuICAgID8gW1wiU0lHSU5UXCIsIFwiU0lHVEVSTVwiLCBcIlNJR0JSRUFLXCJdXG4gICAgOiBbXCJTSUdIVVBcIiwgXCJTSUdJTlRcIiwgXCJTSUdURVJNXCIsIFwiU0lHUVVJVFwiXVxuKSBzYXRpc2ZpZXMgcmVhZG9ubHkgTm9kZUpTLlNpZ25hbHNbXTtcbmNvbnN0IFdJTkRPV1NfUFJPQ0VTU19TTkFQU0hPVF9TQ1JJUFQgPVxuICBcIkdldC1DaW1JbnN0YW5jZSBXaW4zMl9Qcm9jZXNzIHwgRm9yRWFjaC1PYmplY3QgeyAnezB9IHsxfSB7Mn0nIC1mICRfLlByb2Nlc3NJZCwgJF8uUGFyZW50UHJvY2Vzc0lkLCAkXy5DcmVhdGlvbkRhdGUuVG9GaWxlVGltZVV0YygpIH1cIjtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJjb3JlOmV4ZWNcIik7XG5cbi8qKiBTdGRpbyBtb2RlIGZvciBhIHN1YnByb2Nlc3MgZmQuICovXG5leHBvcnQgdHlwZSBFeGVjU3RkaW8gPSBcImluaGVyaXRcIiB8IFwicGlwZVwiIHwgXCJpZ25vcmVcIjtcblxuLyoqIEludm9rZWQgb25jZSBwZXIgb3V0cHV0IGxpbmUgd2hlbiBhIGZkIGlzIHBpcGVkLiAqL1xuZXhwb3J0IHR5cGUgTGluZUhhbmRsZXIgPSAobGluZTogc3RyaW5nKSA9PiB2b2lkO1xuXG4vKiogU3RyZWFtIGxpbmVzIHRvIGEgaGFuZGxlciB3aXRoIG9wdGlvbmFsIHJlc3VsdCBjYXB0dXJlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5lT3V0cHV0T3B0aW9ucyB7XG4gIC8qKiBJbnZva2VkIG9uY2UgcGVyIG91dHB1dCBsaW5lLiAqL1xuICBvbkxpbmU6IExpbmVIYW5kbGVyO1xuICAvKiogUmV0YWluIGxpbmVzIGluIHRoZSBjb21wbGV0ZWQgcmVzdWx0LiBEZWZhdWx0cyB0byBgdHJ1ZWAuICovXG4gIGNhcHR1cmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFN0ZGlvIGNvbmZpZyBmb3Igb25lIGZkLlxuICpcbiAqIC0gYFwiaW5oZXJpdFwiYCAvIGBcInBpcGVcImAgLyBgXCJpZ25vcmVcImAg4oCUIHBhc3MgdGhyb3VnaCB0byBgc3Bhd25gXG4gKiAtIGBcImNhcHR1cmVcImAg4oCUIHBpcGUgdGhlIGZkIGFuZCBhcHBlbmQgZWFjaCBsaW5lIHRvIHRoZSByZXN1bHRcbiAqIC0ge0BsaW5rIExpbmVIYW5kbGVyfSDigJQgcGlwZSBhbmQgaW52b2tlIHRoZSBoYW5kbGVyIHBlciBsaW5lIChsaW5lcyBhcmUgc3RpbGwgY2FwdHVyZWQpXG4gKiAtIHtAbGluayBMaW5lT3V0cHV0T3B0aW9uc30g4oCUIHBpcGUgYW5kIGludm9rZSB0aGUgaGFuZGxlciwgd2l0aCBvcHRpb25hbCBjYXB0dXJlXG4gKiAtIGAoTGluZUhhbmRsZXIgfCBcImNhcHR1cmVcIilbXWAg4oCUIHBpcGU7IGBcImNhcHR1cmVcImAgaXMgYSBuby1vcCBtYXJrZXIsIGhhbmRsZXJzIHJ1biBwZXIgbGluZVxuICovXG5leHBvcnQgdHlwZSBTdGRpb09wdGlvbiA9XG4gIEV4ZWNTdGRpbyB8IExpbmVIYW5kbGVyIHwgTGluZU91dHB1dE9wdGlvbnMgfCBcImNhcHR1cmVcIiB8IChMaW5lSGFuZGxlciB8IFwiY2FwdHVyZVwiKVtdO1xuXG4vKiogT3V0Y29tZSBvZiB7QGxpbmsgc3Bhd259IC8ge0BsaW5rIHNwYXduU3luY306IGV4aXQgY29kZSwgY2FwdHVyZWQgb3V0cHV0LCBhbmQgbGluZSB2aWV3cy4gKi9cbmV4cG9ydCB0eXBlIEV4ZWNSZXN1bHQgPSB7XG4gIGV4aXRDb2RlOiBudW1iZXI7XG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRvdXQgbGluZXMuIEZvciB7QGxpbmsgc3Bhd259IHRoZXNlIGFyZSBidWlsdCB3aGlsZSB0aGUgcHJvY2VzcyBydW5zO1xuICAgKiBmb3Ige0BsaW5rIHNwYXduU3luY30gdGhleSBhcmUgc3BsaXQgZnJvbSB0aGUgY2FwdHVyZWQgc3RyaW5nIG9uIGZpcnN0IHJlYWQuXG4gICAqL1xuICByZWFkb25seSBzdGRvdXRMaW5lczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRlcnIgbGluZXMuIEZvciB7QGxpbmsgc3Bhd259IHRoZXNlIGFyZSBidWlsdCB3aGlsZSB0aGUgcHJvY2VzcyBydW5zO1xuICAgKiBmb3Ige0BsaW5rIHNwYXduU3luY30gdGhleSBhcmUgc3BsaXQgZnJvbSB0aGUgY2FwdHVyZWQgc3RyaW5nIG9uIGZpcnN0IHJlYWQuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnJMaW5lczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRvdXQgdGV4dC4ge0BsaW5rIHNwYXduU3luY30gcmVhZHMgdGhlIGNhcHR1cmVkIHN0cmluZztcbiAgICoge0BsaW5rIHNwYXdufSBqb2lucyB7QGxpbmsgc3Rkb3V0TGluZXN9LiBTZWUgYHRyaW1gIGZvciBub3JtYWxpemF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3Rkb3V0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRlcnIgdGV4dC4ge0BsaW5rIHNwYXduU3luY30gcmVhZHMgdGhlIGNhcHR1cmVkIHN0cmluZztcbiAgICoge0BsaW5rIHNwYXdufSBqb2lucyB7QGxpbmsgc3RkZXJyTGluZXN9LiBTZWUgYHRyaW1gIGZvciBub3JtYWxpemF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFdoYXQge0BsaW5rIHNwYXdufSByZXR1cm5zOiB0aGUgTElWRSBgQ2hpbGRQcm9jZXNzYCBoYW5kbGUgdGhhdCBpcyBBTFNPIGFcbiAqIGBQcm9taXNlPEV4ZWNSZXN1bHQ+YCByZXNvbHZpbmcgb24gZXhpdC5cbiAqXG4gKiBUaGlzIGlzIGFkZGl0aXZlIC0gdGhlIG9iamVjdCBzdGlsbCBzYXRpc2ZpZXMgYFByb21pc2U8RXhlY1Jlc3VsdD5gLCBzbyBldmVyeVxuICogZXhpc3RpbmcgYGF3YWl0IHNwYXduKC4uLilgIC8gYHNwYXduKC4uLikudGhlbiguLi4pYCBjYWxsZXIgaXMgdW5jaGFuZ2VkLiBXaGF0XG4gKiBpcyBuZXcgaXMgdGhhdCB0aGUgc2FtZSB2YWx1ZSBpcyB0aGUgbGl2ZSBjaGlsZDogY2FsbGVycyB0aGF0IHdhbnQgdG8gc3VwZXJ2aXNlXG4gKiBpdCBjYW4gcmVhZCBgLnBpZGAsIGNhbGwgYC5zaHV0ZG93bigpYCwgYW5kIGxpc3RlbiBmb3IgYGV4aXRgIHdpdGhvdXQgYVxuICogc2Vjb25kIHNwYXduLlxuICpcbiAqIEBleGFtcGxlIEF3YWl0IGl0ICh1bmNoYW5nZWQpXG4gKiBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgc3Bhd24oXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiSEVBRFwiXSwgeyBzdGRvdXQ6IFwiY2FwdHVyZVwiIH0pO1xuICpcbiAqIEBleGFtcGxlIFN1cGVydmlzZSBpdFxuICogY29uc3QgcHJvYyA9IHNwYXduKFwiYnVuXCIsIFtcInNyYy9zZXJ2ZXIudHNcIl0pO1xuICogY29uc3Qgc2h1dGRvd24gPSAoKSA9PiBwcm9jLnNodXRkb3duKCk7XG4gKiBjb25zdCB7IGV4aXRDb2RlIH0gPSBhd2FpdCBwcm9jO1xuICovXG5leHBvcnQgdHlwZSBDaGlsZFByb2Nlc3NSZXN1bHQgPSBDaGlsZFByb2Nlc3MgJlxuICBQcm9taXNlPEV4ZWNSZXN1bHQ+ICYge1xuICAgIC8qKiBTdG9wIHRoZSBjaGlsZCBwcm9jZXNzIHRyZWUgb25jZSB1c2luZyB0aGUgY29uZmlndXJlZCB0ZXJtaW5hdGlvbiBwb2xpY3kuICovXG4gICAgc2h1dGRvd24ob3B0aW9ucz86IENoaWxkUHJvY2Vzc1Rlcm1pbmF0aW9uT3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG4gIH07XG5cbi8qKiBQcm9jZXNzLXRyZWUgdGVybWluYXRpb24gcG9saWN5IHVzZWQgYnkge0BsaW5rIENoaWxkUHJvY2Vzc1Jlc3VsdC5zaHV0ZG93bn0uICovXG5leHBvcnQgaW50ZXJmYWNlIENoaWxkUHJvY2Vzc1Rlcm1pbmF0aW9uT3B0aW9ucyB7XG4gIC8qKiBUaW1lIHRvIHdhaXQgZm9yIG9wZXJhdGluZy1zeXN0ZW0gdGVybWluYXRpb24uIERlZmF1bHRzIHRvIDggc2Vjb25kcy4gKi9cbiAgdGVybWluYXRlVGltZW91dD86IG51bWJlcjtcbiAgLyoqIFRpbWUgdG8gcG9sbCBhbmQgZm9yY2Uta2lsbCByZW1haW5pbmcgZGVzY2VuZGFudHMuIERlZmF1bHRzIHRvIDQgc2Vjb25kcy4gKi9cbiAga2lsbFRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgc3Bhd259LiBFeHRlbmRzIGBTcGF3bk9wdGlvbnNgIGV4Y2VwdCBgc3RkaW9gLCB3aGljaCBpcyBkcml2ZW4gYnkgYHN0ZGluYCAvIGBzdGRvdXRgIC8gYHN0ZGVycmAuICovXG5leHBvcnQgdHlwZSBFeGVjT3B0aW9ucyA9IE9taXQ8U3Bhd25PcHRpb25zLCBcInN0ZGlvXCIgfCBcImtpbGxTaWduYWxcIj4gJlxuICBDaGlsZFByb2Nlc3NUZXJtaW5hdGlvbk9wdGlvbnMgJiB7XG4gICAgLyoqIGBcImluaGVyaXRcImAgYnkgZGVmYXVsdDsgYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCBzZWxlY3QgbW9kZXMsIGFueSBvdGhlciBzdHJpbmcgaXMgaW5wdXQuICovXG4gICAgc3RkaW4/OiBFeGVjU3RkaW8gfCBzdHJpbmc7XG4gICAgc3Rkb3V0PzogU3RkaW9PcHRpb247XG4gICAgc3RkZXJyPzogU3RkaW9PcHRpb247XG4gICAgLyoqXG4gICAgICogRm9yd2FyZCBwYXJlbnQgdGVybWluYXRpb24gc2lnbmFscyB0byB0aGlzIGNoaWxkLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCB0aGUgc2hhcmVkIHNpZ25hbCB0cmFwOyBvbiBQT1NJWCwgdGhlIGNoaWxkIGlzIGFsc29cbiAgICAgKiBkZXRhY2hlZCBieSBkZWZhdWx0IHNvIHRlcm1pbmFsIHByb2Nlc3MtZ3JvdXAgc2lnbmFscyBhcmUgbm90IGluaGVyaXRlZC5cbiAgICAgKi9cbiAgICBmb3J3YXJkVGVybWluYXRpb25TaWduYWxzPzogYm9vbGVhbjtcbiAgICAvKiogVGhyb3cgd2hlbiB0aGUgcHJvY2VzcyBleGl0cyB3aXRoIGEgbm9uLXplcm8gY29kZS4gKi9cbiAgICBjaGVjaz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogT21pdHRlZCDigJQgYWRhcHRpdmUgdHJpbSAoe0BsaW5rIHNwYXduU3luY30gZHJvcHMgb25lIHNwYXduIHRyYWlsaW5nIG5ld2xpbmUsXG4gICAgICoge0BsaW5rIHNwYXdufSBkb2VzIG5vdCk7IGB0cnVlYCDigJQgc3RyaXAgYWxsIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZTtcbiAgICAgKiBgZmFsc2VgIOKAlCBsZWF2ZSBjYXB0dXJlZCBvdXRwdXQgdW5jaGFuZ2VkLlxuICAgICAqL1xuICAgIHRyaW0/OiBib29sZWFuO1xuICB9O1xuXG4vKiogU3RkaW8gbW9kZSBmb3Ige0BsaW5rIHNwYXduU3luY30gKG5vIHBlci1saW5lIGNhbGxiYWNrcykuICovXG5leHBvcnQgdHlwZSBTeW5jRXhlY1N0ZGlvID0gRXhlY1N0ZGlvIHwgXCJjYXB0dXJlXCI7XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgc3Bhd25TeW5jfS4gU2FtZSBzaGFwZSBhcyB7QGxpbmsgRXhlY09wdGlvbnN9IGJ1dCB3aXRob3V0IGxpbmUtaGFuZGxlciBzdGRpby4gKi9cbmV4cG9ydCB0eXBlIFN5bmNFeGVjT3B0aW9ucyA9IE9taXQ8U3Bhd25PcHRpb25zLCBcInN0ZGlvXCIgfCBcImtpbGxTaWduYWxcIj4gJiB7XG4gIC8qKiBgXCJpbmhlcml0XCJgIGJ5IGRlZmF1bHQ7IGBcInBpcGVcImAgLyBgXCJpZ25vcmVcImAgc2VsZWN0IG1vZGVzLCBhbnkgb3RoZXIgc3RyaW5nIGlzIGlucHV0LiAqL1xuICBzdGRpbj86IEV4ZWNTdGRpbyB8IHN0cmluZztcbiAgc3Rkb3V0PzogU3luY0V4ZWNTdGRpbztcbiAgc3RkZXJyPzogU3luY0V4ZWNTdGRpbztcbiAgLyoqIFRocm93IHdoZW4gdGhlIHByb2Nlc3MgZXhpdHMgd2l0aCBhIG5vbi16ZXJvIGNvZGUuICovXG4gIGNoZWNrPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE9taXR0ZWQg4oCUIGFkYXB0aXZlIHRyaW0gKHtAbGluayBzcGF3blN5bmN9IGRyb3BzIG9uZSBzcGF3biB0cmFpbGluZyBuZXdsaW5lLFxuICAgKiB7QGxpbmsgc3Bhd259IGRvZXMgbm90KTsgYHRydWVgIOKAlCBzdHJpcCBhbGwgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlO1xuICAgKiBgZmFsc2VgIOKAlCBsZWF2ZSBjYXB0dXJlZCBvdXRwdXQgdW5jaGFuZ2VkLlxuICAgKi9cbiAgdHJpbT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXduIHN0ZGlvIG1vZGUgcGx1cyBhbiBvcHRpb25hbCBwZXItbGluZSBjYWxsYmFjayBhZnRlciB7QGxpbmsgcmVzb2x2ZVN0ZGlvfVxuICogbWFwcyBhIHtAbGluayBTdGRpb09wdGlvbn0gaW50byBzb21ldGhpbmcgYHNwYXduYCBjYW4gY29uc3VtZS5cbiAqL1xudHlwZSBSZXNvbHZlZFN0ZGlvID0ge1xuICAvKiogVmFsdWUgcGFzc2VkIHRvIGBzcGF3bmAncyBgc3RkaW9gIHR1cGxlIGZvciB0aGlzIGZkLiAqL1xuICBtb2RlOiBFeGVjU3RkaW87XG4gIC8qKiBXaGVuIHNldCwgZWFjaCBvdXRwdXQgbGluZSBpcyBhcHBlbmRlZCB0byB0aGUgY2FwdHVyZSBidWZmZXIgYW5kIGZvcndhcmRlZCBoZXJlLiAqL1xuICBvbkxpbmU/OiBMaW5lSGFuZGxlcjtcbn07XG5cbi8qKiBTdXBwb3J0ZWQgY29tbWFuZCwgYXJndW1lbnQtYXJyYXksIHZhcmlhZGljLWFyZ3VtZW50LCBhbmQgb3B0aW9ucyBjYWxsIGZvcm1zLiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25BcmdzPFQgZXh0ZW5kcyBTcGF3bk9wdGlvbnM+ID1cbiAgfCBbY29tbWFuZDogc3RyaW5nLCAuLi5hcmdzOiBzdHJpbmdbXV1cbiAgfCBbY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXV1cbiAgfCBbY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSwgb3B0aW9uczogVF1cbiAgfCBbY29tbWFuZDogc3RyaW5nLCAuLi5hcmdzQW5kT3B0aW9uczogWy4uLnN0cmluZ1tdLCBUXV07XG5cbmludGVyZmFjZSBQYXJzZWRTcGF3bkFyZ3M8VCBleHRlbmRzIFNwYXduT3B0aW9ucz4ge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIGNvbW1hbmRBcmdzOiBzdHJpbmdbXTtcbiAgb3B0aW9ucz86IFQ7XG59XG5cbi8qKiBPbmUgb3BlcmF0aW5nLXN5c3RlbSBwcm9jZXNzIGNhcHR1cmVkIGJlZm9yZSB0cmVlIHNodXRkb3duIGJlZ2lucy4gKi9cbmludGVyZmFjZSBQcm9jZXNzU25hcHNob3RFbnRyeSB7XG4gIHBpZDogbnVtYmVyO1xuICBwYXJlbnRQaWQ6IG51bWJlcjtcbiAgaWRlbnRpdHk6IHN0cmluZztcbn1cblxuLyoqIEN1cnJlbnQgcmV0YWluZWQgcHJvY2Vzc2VzIHBsdXMgZGVzY2VuZGFudHMgZmlyc3Qgb2JzZXJ2ZWQgYnkgb25lIHJlZnJlc2guICovXG5pbnRlcmZhY2UgUmVmcmVzaGVkUHJvY2Vzc1RyZWUge1xuICBwcm9jZXNzZXM6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W107XG4gIGRpc2NvdmVyZWQ6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W107XG59XG5cbmludGVyZmFjZSBQYXJlbnRTaWduYWxGb3J3YXJkZXJTdGF0ZSB7XG4gIHJlYWRvbmx5IGNoaWxkcmVuOiBNYXA8bnVtYmVyLCBDaGlsZFByb2Nlc3NSZXN1bHQ+O1xuICByZWFkb25seSBoYW5kbGVyczogTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPjtcbiAgcmVhZG9ubHkgZm9yd2FyZGluZ1NpZ25hbHM6IFNldDxOb2RlSlMuU2lnbmFscz47XG4gIHJlYWRvbmx5IGxpc3RlbmVyczogU2V0PChzaWduYWw6IE5vZGVKUy5TaWduYWxzKSA9PiB2b2lkPjtcbn1cblxuaW50ZXJmYWNlIFNpZ25hbEV4aXRFbWl0dGVyIHtcbiAgY291bnQ/OiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgUHJvY2Vzc1dpdGhTaWduYWxFeGl0RW1pdHRlciBleHRlbmRzIE5vZGVKUy5Qcm9jZXNzIHtcbiAgX19zaWduYWxfZXhpdF9lbWl0dGVyX18/OiBTaWduYWxFeGl0RW1pdHRlcjtcbn1cblxudHlwZSBQYXJlbnRTaWduYWxTaHV0ZG93biA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5jb25zdCBwYXJlbnRTaWduYWxGb3J3YXJkZXJTdGF0ZSA9IG1lbW9pemUoKCk6IFBhcmVudFNpZ25hbEZvcndhcmRlclN0YXRlID0+ICh7XG4gIGNoaWxkcmVuOiBuZXcgTWFwKCksXG4gIGhhbmRsZXJzOiBuZXcgTWFwKCksXG4gIGZvcndhcmRpbmdTaWduYWxzOiBuZXcgU2V0KCksXG4gIGxpc3RlbmVyczogbmV3IFNldCgpLFxufSkpO1xuY29uc3QgcGFyZW50U2lnbmFsU2h1dGRvd25zID0gbmV3IFdlYWtNYXA8Q2hpbGRQcm9jZXNzUmVzdWx0LCBQYXJlbnRTaWduYWxTaHV0ZG93bj4oKTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJQYXJlbnRTaWduYWxGb3J3YXJkaW5nKGNoaWxkOiBDaGlsZFByb2Nlc3NSZXN1bHQpOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQge1xuICBjb25zdCBwaWQgPSBjaGlsZC5waWQ7XG4gIGlmIChwaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhdGUgPSBwYXJlbnRTaWduYWxGb3J3YXJkZXJTdGF0ZSgpO1xuICBpbnN0YWxsUGFyZW50U2lnbmFsSGFuZGxlcnMoc3RhdGUpO1xuICBzdGF0ZS5jaGlsZHJlbi5zZXQocGlkLCBjaGlsZCk7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKHN0YXRlLmNoaWxkcmVuLmdldChwaWQpID09PSBjaGlsZCkgc3RhdGUuY2hpbGRyZW4uZGVsZXRlKHBpZCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxQYXJlbnRTaWduYWxIYW5kbGVycyhzdGF0ZTogUGFyZW50U2lnbmFsRm9yd2FyZGVyU3RhdGUpOiB2b2lkIHtcbiAgaWYgKHN0YXRlLmhhbmRsZXJzLnNpemUgPiAwKSByZXR1cm47XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIEZPUldBUkRFRF9QQVJFTlRfU0lHTkFMUykge1xuICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBmb3J3YXJkUGFyZW50U2lnbmFsKHN0YXRlLCBzaWduYWwpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVwb3J0UGFyZW50U2lnbmFsRXJyb3Ioc2lnbmFsLCB1bmRlZmluZWQsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHN0YXRlLmhhbmRsZXJzLnNldChzaWduYWwsIGhhbmRsZXIpO1xuICAgIHByb2Nlc3MucHJlcGVuZExpc3RlbmVyKHNpZ25hbCwgaGFuZGxlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTdWJzY3JpYmUgdG8gdGhlIHByb2Nlc3MtZ2xvYmFsIHBhcmVudC10ZXJtaW5hdGlvbiB0cmFwIHVzZWQgYnkge0BsaW5rIHNwYXdufS5cbiAqIERvZXMgbm90IGFkZCBhIHBlci1zdWJzY3JpYmVyIGBwcm9jZXNzYCBsaXN0ZW5lcjsgZXh0cmEgbGlzdGVuZXJzIHdvdWxkIGNoYW5nZVxuICogd2hldGhlciB0aGUgdHJhcCByZS1yYWlzZXMgdGhlIHNpZ25hbCBhZnRlciBjaGlsZHJlbiBleGl0LlxuICpcbiAqIEBwYXJhbSBsaXN0ZW5lciAtIENhbGxlZCBzeW5jaHJvbm91c2x5IHdoZW4gYSBmb3J3YXJkZWQgcGFyZW50IHNpZ25hbCBhcnJpdmVzXG4gKiBAcmV0dXJucyBVbnN1YnNjcmliZSBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gb25QYXJlbnRUZXJtaW5hdGlvblNpZ25hbChsaXN0ZW5lcjogKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSBwYXJlbnRTaWduYWxGb3J3YXJkZXJTdGF0ZSgpO1xuICBpbnN0YWxsUGFyZW50U2lnbmFsSGFuZGxlcnMoc3RhdGUpO1xuICBzdGF0ZS5saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBzdGF0ZS5saXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFBhcmVudFNpZ25hbChzdGF0ZTogUGFyZW50U2lnbmFsRm9yd2FyZGVyU3RhdGUsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkIHtcbiAgaWYgKHN0YXRlLmZvcndhcmRpbmdTaWduYWxzLmhhcyhzaWduYWwpKSByZXR1cm47XG4gIGZvciAoY29uc3QgbGlzdGVuZXIgb2Ygc3RhdGUubGlzdGVuZXJzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxpc3RlbmVyKHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlcG9ydFBhcmVudFNpZ25hbEVycm9yKHNpZ25hbCwgdW5kZWZpbmVkLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIGNvbnN0IHNodXRkb3duczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGZvciAoY29uc3QgW3BpZCwgY2hpbGRdIG9mIHN0YXRlLmNoaWxkcmVuKSB7XG4gICAgaWYgKGNoaWxkLmV4aXRDb2RlICE9PSBudWxsIHx8IGNoaWxkLnNpZ25hbENvZGUgIT09IG51bGwpIHtcbiAgICAgIHN0YXRlLmNoaWxkcmVuLmRlbGV0ZShwaWQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHNodXRkb3ducy5wdXNoKHNodXRkb3duQ2hpbGRGb3JQYXJlbnRTaWduYWwoY2hpbGQsIHBpZCwgc2lnbmFsKSk7XG4gIH1cblxuICBjb25zdCBoYW5kbGVyID0gc3RhdGUuaGFuZGxlcnMuZ2V0KHNpZ25hbCk7XG4gIGNvbnN0IGNvbXBsZXRlZCA9IFByb21pc2UuYWxsKHNodXRkb3ducykuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgcmVwb3J0UGFyZW50U2lnbmFsRXJyb3Ioc2lnbmFsLCB1bmRlZmluZWQsIGVycm9yKTtcbiAgfSk7XG4gIGlmICghaGFuZGxlciB8fCBwcm9jZXNzLmxpc3RlbmVyQ291bnQoc2lnbmFsKSAhPT0gcGFzc2l2ZVNpZ25hbExpc3RlbmVyQ291bnQoKSArIDEpIHtcbiAgICB2b2lkIGNvbXBsZXRlZDtcbiAgICByZXR1cm47XG4gIH1cbiAgc3RhdGUuZm9yd2FyZGluZ1NpZ25hbHMuYWRkKHNpZ25hbCk7XG4gIHZvaWQgY29tcGxldGVkXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcHJvY2Vzcy5vZmYoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgIHN0YXRlLmhhbmRsZXJzLmRlbGV0ZShzaWduYWwpO1xuICAgICAgc3RhdGUuZm9yd2FyZGluZ1NpZ25hbHMuZGVsZXRlKHNpZ25hbCk7XG4gICAgICB0cnkge1xuICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXBvcnRQYXJlbnRTaWduYWxFcnJvcihzaWduYWwsIHByb2Nlc3MucGlkLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICByZXBvcnRQYXJlbnRTaWduYWxFcnJvcihzaWduYWwsIHVuZGVmaW5lZCwgZXJyb3IpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBzaHV0ZG93bkNoaWxkRm9yUGFyZW50U2lnbmFsKFxuICBjaGlsZDogQ2hpbGRQcm9jZXNzUmVzdWx0LFxuICBwaWQ6IG51bWJlcixcbiAgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyxcbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHNodXRkb3duID0gcGFyZW50U2lnbmFsU2h1dGRvd25zLmdldChjaGlsZCk7XG4gICAgcmV0dXJuIChzaHV0ZG93biA/IHNodXRkb3duKHNpZ25hbCkgOiBjaGlsZC5zaHV0ZG93bigpKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHJlcG9ydFBhcmVudFNpZ25hbEVycm9yKHNpZ25hbCwgcGlkLCBlcnJvcik7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0UGFyZW50U2lnbmFsRXJyb3Ioc2lnbmFsLCBwaWQsIGVycm9yKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwb3J0UGFyZW50U2lnbmFsRXJyb3IoXG4gIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMsXG4gIHBpZDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBlcnJvcjogdW5rbm93bixcbik6IHZvaWQge1xuICBpZiAoaXNFeHBlY3RlZFByb2Nlc3NTaHV0ZG93bkVycm9yKGVycm9yKSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGxvZ2dlci53YXJuKFwiZmFpbGVkIHRvIGZvcndhcmQgcGFyZW50IHNpZ25hbFwiLCB7XG4gICAgICBzaWduYWwsXG4gICAgICAuLi4ocGlkID09PSB1bmRlZmluZWQgPyB7fSA6IHsgcGlkIH0pLFxuICAgICAgZXJyb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFNpZ25hbCBmb3J3YXJkaW5nIG11c3QgbmV2ZXIgcHJldmVudCBvdGhlciBwcm9jZXNzIGxpc3RlbmVycyBmcm9tIHJ1bm5pbmcuXG4gIH1cbn1cblxuZnVuY3Rpb24gaXNFeHBlY3RlZFByb2Nlc3NTaHV0ZG93bkVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChpc01pc3NpbmdQcm9jZXNzRXJyb3IoZXJyb3IpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IgJiYgZXJyb3IuZXJyb3JzLmV2ZXJ5KGlzRXhwZWN0ZWRQcm9jZXNzU2h1dGRvd25FcnJvcik7XG59XG5cbmZ1bmN0aW9uIHBhc3NpdmVTaWduYWxMaXN0ZW5lckNvdW50KCk6IG51bWJlciB7XG4gIGNvbnN0IGxlZ2FjeUVtaXR0ZXIgPSAocHJvY2VzcyBhcyBQcm9jZXNzV2l0aFNpZ25hbEV4aXRFbWl0dGVyKS5fX3NpZ25hbF9leGl0X2VtaXR0ZXJfXztcbiAgY29uc3QgbW9kZXJuRW1pdHRlciA9IChnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgIFN5bWJvbC5mb3IoXCJzaWduYWwtZXhpdCBlbWl0dGVyXCIpXG4gIF0gYXMgU2lnbmFsRXhpdEVtaXR0ZXIgfCB1bmRlZmluZWQ7XG4gIHJldHVybiBzaWduYWxFeGl0RW1pdHRlckNvdW50KGxlZ2FjeUVtaXR0ZXIpICsgc2lnbmFsRXhpdEVtaXR0ZXJDb3VudChtb2Rlcm5FbWl0dGVyKTtcbn1cblxuZnVuY3Rpb24gc2lnbmFsRXhpdEVtaXR0ZXJDb3VudChlbWl0dGVyOiBTaWduYWxFeGl0RW1pdHRlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIHJldHVybiB0eXBlb2YgZW1pdHRlcj8uY291bnQgPT09IFwibnVtYmVyXCIgPyBlbWl0dGVyLmNvdW50IDogMDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURldGFjaGVkKFxuICBkZXRhY2hlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgZm9yd2FyZFRlcm1pbmF0aW9uU2lnbmFsczogYm9vbGVhbixcbik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBpZiAoZGV0YWNoZWQgIT09IHVuZGVmaW5lZCB8fCBmb3J3YXJkVGVybWluYXRpb25TaWduYWxzIHx8IHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIikge1xuICAgIHJldHVybiBkZXRhY2hlZDtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTcGF3bkFyZ3M8VCBleHRlbmRzIFNwYXduT3B0aW9ucz4oaW5wdXQ6IFNwYXduQXJnczxUPik6IFBhcnNlZFNwYXduQXJnczxUPiB7XG4gIGxldCBbdmFsdWUsIC4uLnZhbHVlc10gPSBpbnB1dDtcblxuICBjb25zdCBsYXN0ID0gdmFsdWVzLmF0KC0xKTtcbiAgY29uc3Qgb3B0aW9ucyA9XG4gICAgbGFzdCAhPT0gbnVsbCAmJiB0eXBlb2YgbGFzdCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShsYXN0KSA/IGxhc3QgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGFyZ3VtZW50VmFsdWVzID0gb3B0aW9ucyA/IHZhbHVlcy5zbGljZSgwLCAtMSkgOiB2YWx1ZXM7XG4gIC8vIE9ubHkgdGhlIG9uZS1zdHJpbmcgZm9ybSBpcyBzaGVsbC1saWtlLiBFeHBsaWNpdCBhcmd1bWVudHMgbWFrZSB0aGUgY29tbWFuZCBhbiBleGFjdCBleGVjdXRhYmxlLlxuICBjb25zdCBbY29tbWFuZCwgLi4uY29tbWFuZEFyZ3NdID0gYXJndW1lbnRWYWx1ZXMubGVuZ3RoID09PSAwID8gc2hsZXgodmFsdWUhKSA6IFt2YWx1ZSFdO1xuICBjb25zdCB2YWx1ZUFyZ3M6IHN0cmluZ1tdID1cbiAgICBhcmd1bWVudFZhbHVlcy5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShhcmd1bWVudFZhbHVlc1swXSlcbiAgICAgID8gWy4uLmFyZ3VtZW50VmFsdWVzWzBdXVxuICAgICAgOiBhcmd1bWVudFZhbHVlcztcblxuICByZXR1cm4ge1xuICAgIGNvbW1hbmQ6IGNvbW1hbmQhLFxuICAgIGNvbW1hbmRBcmdzOiBbLi4uY29tbWFuZEFyZ3MsIC4uLnZhbHVlQXJnc10sXG4gICAgb3B0aW9uczogb3B0aW9ucyBhcyBULFxuICB9O1xufVxuXG4vKipcbiAqIERyb3AgdGhlIHNpbmdsZSB0cmFpbGluZyBlbXB0eSBlbnRyeSBgc3Bhd25TeW5jYCBhZGRzIHdoZW4gc3BsaXR0aW5nIG9uIGEgZmluYWxcbiAqIG5ld2xpbmUgKGBcImhpXFxuXCJgIC0+IGBbXCJoaVwiLCBcIlwiXWApLiBEb2VzIG5vdCByZW1vdmUgbXVsdGlwbGUgdHJhaWxpbmcgZW1wdGllcy5cbiAqL1xuZnVuY3Rpb24gd2l0aG91dFNwYXduVHJhaWxpbmdFbXB0eUxpbmUobGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9PT0gXCJcIikge1xuICAgIHJldHVybiBsaW5lcy5zbGljZSgwLCAtMSk7XG4gIH1cbiAgcmV0dXJuIGxpbmVzIGFzIHN0cmluZ1tdO1xufVxuXG4vKiogUmVtb3ZlIGF0IG1vc3Qgb25lIHRyYWlsaW5nIG5ld2xpbmUgZnJvbSBjYXB0dXJlZCBzcGF3biBzdGRvdXQvc3RkZXJyIHRleHQuICovXG5mdW5jdGlvbiB0cmltU2luZ2xlVHJhaWxpbmdOZXdsaW5lKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh0ZXh0LmVuZHNXaXRoKFwiXFxyXFxuXCIpKSByZXR1cm4gdGV4dC5zbGljZSgwLCAtMik7XG4gIGlmICh0ZXh0LmVuZHNXaXRoKFwiXFxuXCIpKSByZXR1cm4gdGV4dC5zbGljZSgwLCAtMSk7XG4gIHJldHVybiB0ZXh0O1xufVxuXG4vKiogTGluZS1hcnJheSB2aWV3IG9mIGFzeW5jLWNhcHR1cmVkIG91dHB1dC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRBc3luY0xpbmVzKGxpbmVzOiByZWFkb25seSBzdHJpbmdbXSwgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgaWYgKHRyaW0gPT09IHRydWUpIHJldHVybiBsaW5lc0Zyb21DYXB0dXJlZE91dHB1dChsaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKSk7XG4gIHJldHVybiBsaW5lcyBhcyBzdHJpbmdbXTtcbn1cblxuLyoqIEpvaW4gYXN5bmMtY2FwdHVyZWQgbGluZXMgaW50byBzdGRvdXQvc3RkZXJyIHRleHQuICovXG5mdW5jdGlvbiBmb3JtYXRBc3luY0NhcHR1cmVkTGluZXMobGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgY29uc3Qgam9pbmVkID0gbGluZXMuam9pbihcIlxcblwiKTtcbiAgcmV0dXJuIHRyaW0gPT09IHRydWUgPyBqb2luZWQudHJpbSgpIDogam9pbmVkO1xufVxuXG4vKiogTGluZS1hcnJheSB2aWV3IG9mIHN5bmMtY2FwdHVyZWQgb3V0cHV0LiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplZFN5bmNMaW5lcyhsaW5lczogcmVhZG9ubHkgc3RyaW5nW10sIHRyaW06IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIGlmICh0cmltID09PSBmYWxzZSkgcmV0dXJuIGxpbmVzIGFzIHN0cmluZ1tdO1xuICBpZiAodHJpbSA9PT0gdHJ1ZSkgcmV0dXJuIGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KGxpbmVzLmpvaW4oXCJcXG5cIikudHJpbSgpKTtcbiAgcmV0dXJuIHdpdGhvdXRTcGF3blRyYWlsaW5nRW1wdHlMaW5lKGxpbmVzKTtcbn1cblxuLyoqIEZvcm1hdCBzeW5jLWNhcHR1cmVkIHN0ZG91dC9zdGRlcnIgdGV4dC4gKi9cbmZ1bmN0aW9uIGZvcm1hdFN5bmNDYXB0dXJlZFRleHQoXG4gIHRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0ZXh0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0cmltID09PSBmYWxzZSkgcmV0dXJuIHRleHQ7XG4gIGlmICh0cmltID09PSB0cnVlKSByZXR1cm4gdGV4dC50cmltKCk7XG4gIHJldHVybiB0cmltU2luZ2xlVHJhaWxpbmdOZXdsaW5lKHRleHQpO1xufVxuXG4vKipcbiAqIEh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciBhIHNwYXduZWQgY29tbWFuZCwgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIEV4ZWN1dGFibGUgbmFtZSBvciBwYXRoXG4gKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGV4ZWN1dGFibGVcbiAqIEByZXR1cm5zIEJhY2t0aWNrLXdyYXBwZWQgYGNvbW1hbmQgYXJnMSBhcmcyIC4uLmAgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNvbW1hbmRMYWJlbChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcXGAke2NvbW1hbmR9ICR7YXJncy5qb2luKFwiIFwiKX1cXGBgO1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgTm9kZSBmYWlsZWQgdG8gc3Bhd24gYmVjYXVzZSB0aGUgZXhlY3V0YWJsZSB3YXMgbm90IGZvdW5kLiAqL1xuZnVuY3Rpb24gaXNDb21tYW5kTm90Rm91bmRFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCI7XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciBhIHByb2Nlc3Mgb3BlcmF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBQSUQgbm8gbG9uZ2VyIGV4aXN0cy4gKi9cbmZ1bmN0aW9uIGlzTWlzc2luZ1Byb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IFwiRVNSQ0hcIjtcbn1cblxuLyoqIFZhbGlkYXRlIGEgZmluaXRlIG5vbi1uZWdhdGl2ZSB0aW1lb3V0LiAqL1xuZnVuY3Rpb24gdGltZW91dFZhbHVlKHZhbHVlOiBudW1iZXIsIG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGEgZmluaXRlIG5vbi1uZWdhdGl2ZSBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKiBSZWplY3QgY2FsbGVyLXNlbGVjdGVkIHNpZ25hbHMgc28gcGxhdGZvcm0gc2h1dGRvd24gcG9saWN5IHN0YXlzIGludGVybmFsLiAqL1xuZnVuY3Rpb24gcmVqZWN0U2lnbmFsT3B0aW9ucyhvcHRpb25zOiBvYmplY3QpOiB2b2lkIHtcbiAgY29uc3QgdW5zdXBwb3J0ZWQgPSBvcHRpb25zIGFzIHsgdGVybWluYXRlU2lnbmFsPzogdW5rbm93bjsga2lsbFNpZ25hbD86IHVua25vd24gfTtcbiAgaWYgKHVuc3VwcG9ydGVkLnRlcm1pbmF0ZVNpZ25hbCA9PT0gdW5kZWZpbmVkICYmIHVuc3VwcG9ydGVkLmtpbGxTaWduYWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIFwiUHJvY2VzcyBzaWduYWxzIGFyZSBzZWxlY3RlZCBpbnRlcm5hbGx5OyBjb25maWd1cmUgdGVybWluYXRlVGltZW91dCBhbmQga2lsbFRpbWVvdXQgaW5zdGVhZFwiLFxuICApO1xufVxuXG4vKiogUGFyc2UgdGhlIGNvbW1vbiBgcGlkIHBhcmVudFBpZCBpZGVudGl0eWAgcHJvY2Vzcy1zbmFwc2hvdCBmb3JtYXQuICovXG5mdW5jdGlvbiBwYXJzZVByb2Nlc3NTbmFwc2hvdChsaW5lczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9jZXNzU25hcHNob3RFbnRyeVtdIHtcbiAgY29uc3Qgc25hcHNob3Q6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSAvXlxccyooXFxkKylcXHMrKFxcZCspKD86XFxzKyguKz8pKT9cXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IG1hdGNoPy5bM10/LnRyaW0oKTtcbiAgICBpZiAoIW1hdGNoIHx8ICFpZGVudGl0eSkgY29udGludWU7XG4gICAgc25hcHNob3QucHVzaCh7XG4gICAgICBwaWQ6IE51bWJlci5wYXJzZUludChtYXRjaFsxXSEsIDEwKSxcbiAgICAgIHBhcmVudFBpZDogTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdISwgMTApLFxuICAgICAgaWRlbnRpdHksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHNuYXBzaG90O1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgYSBgL3Byb2NgIHJlY29yZCBkaXNhcHBlYXJlZCBvciBpcyBpbmFjY2Vzc2libGUgZHVyaW5nIGEgc25hcHNob3QuICovXG5mdW5jdGlvbiBpc1VuYXZhaWxhYmxlUHJvY1JlY29yZChlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHx8ICEoXCJjb2RlXCIgaW4gZXJyb3IpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiIHx8IGVycm9yLmNvZGUgPT09IFwiRUFDQ0VTXCIgfHwgZXJyb3IuY29kZSA9PT0gXCJFUEVSTVwiO1xufVxuXG4vKiogUGFyc2UgTGludXggYC9wcm9jLzxwaWQ+L3N0YXRgIHBhcmVudCBQSUQgYW5kIGV4YWN0IHByb2Nlc3Mtc3RhcnQgdGlja3MuICovXG5mdW5jdGlvbiBwYXJzZUxpbnV4UHJvY2Vzc1N0YXQocGlkOiBudW1iZXIsIHN0YXQ6IHN0cmluZyk6IFByb2Nlc3NTbmFwc2hvdEVudHJ5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29tbWFuZEVuZCA9IHN0YXQubGFzdEluZGV4T2YoXCIpXCIpO1xuICBpZiAoY29tbWFuZEVuZCA8IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpZWxkcyA9IHN0YXRcbiAgICAuc2xpY2UoY29tbWFuZEVuZCArIDEpXG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCBwYXJlbnRQaWQgPSBOdW1iZXIucGFyc2VJbnQoZmllbGRzWzFdISwgMTApO1xuICBjb25zdCBzdGFydFRpY2tzID0gZmllbGRzWzE5XTtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihwYXJlbnRQaWQpIHx8ICFzdGFydFRpY2tzKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4geyBwaWQsIHBhcmVudFBpZCwgaWRlbnRpdHk6IHN0YXJ0VGlja3MgfTtcbn1cblxuLyoqIENhcHR1cmUgTGludXggcHJvY2VzcyBpZGVudGl0aWVzIGZyb20gYC9wcm9jYCB3aXRob3V0IHNlY29uZC1sZXZlbCB0cnVuY2F0aW9uLiAqL1xuYXN5bmMgZnVuY3Rpb24gbGludXhQcm9jZXNzU25hcHNob3QoKTogUHJvbWlzZTxQcm9jZXNzU25hcHNob3RFbnRyeVtdPiB7XG4gIGNvbnN0IGRpcmVjdG9yaWVzID0gYXdhaXQgcmVhZGRpcihcIi9wcm9jXCIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGRpcmVjdG9yaWVzXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSAmJiAvXlxcZCskLy50ZXN0KGVudHJ5Lm5hbWUpKVxuICAgICAgLm1hcChhc3luYyAoZW50cnkpOiBQcm9taXNlPFByb2Nlc3NTbmFwc2hvdEVudHJ5IHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChlbnRyeS5uYW1lLCAxMCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlTGludXhQcm9jZXNzU3RhdChwaWQsIGF3YWl0IHJlYWRGaWxlKGAvcHJvYy8ke2VudHJ5Lm5hbWV9L3N0YXRgLCBcInV0ZjhcIikpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChpc1VuYXZhaWxhYmxlUHJvY1JlY29yZChlcnJvcikpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICApO1xuICByZXR1cm4gZW50cmllcy5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUHJvY2Vzc1NuYXBzaG90RW50cnkgPT4gZW50cnkgIT09IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogQ2FwdHVyZSB0aGUgY3VycmVudCBQSUQsIHBhcmVudCBQSUQsIGFuZCBwcm9jZXNzLXN0YXJ0IGlkZW50aXR5IHRhYmxlLlxuICpcbiAqIExpbnV4IHJlYWRzIGV4YWN0IHN0YXJ0IHRpY2tzIGZyb20gYC9wcm9jYC4gV2luZG93cyB1c2VzIHRoZSBidWlsdC1pblxuICogUG93ZXJTaGVsbCBDSU0gcHJvdmlkZXIuIG1hY09TIGFuZCBvdGhlciBQT1NJWCBwbGF0Zm9ybXMgY29tYmluZSBgcHNgXG4gKiBwcm9jZXNzIHN0YXJ0IHRpbWUgYW5kIGV4ZWN1dGFibGUgbmFtZS4gVGhlIGhlbHBlciBwcm9jZXNzIGlzIGRldGFjaGVkIHNvIGFcbiAqIHRlcm1pbmFsIFNJR0lOVCB0byB0aGlzIHByb2Nlc3MgZ3JvdXAgY2Fubm90IGFib3J0IHRoZSBzbmFwc2hvdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1NuYXBzaG90KCk6IFByb21pc2U8UHJvY2Vzc1NuYXBzaG90RW50cnlbXT4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJsaW51eFwiKSByZXR1cm4gbGludXhQcm9jZXNzU25hcHNob3QoKTtcblxuICBjb25zdCBjb21tYW5kID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJwb3dlcnNoZWxsLmV4ZVwiIDogXCJwc1wiO1xuICBjb25zdCBhcmdzID1cbiAgICBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCJcbiAgICAgID8gW1wiLU5vTG9nb1wiLCBcIi1Ob1Byb2ZpbGVcIiwgXCItTm9uSW50ZXJhY3RpdmVcIiwgXCItQ29tbWFuZFwiLCBXSU5ET1dTX1BST0NFU1NfU05BUFNIT1RfU0NSSVBUXVxuICAgICAgOiBbXCItQVwiLCBcIi1vXCIsIFwicGlkPVwiLCBcIi1vXCIsIFwicHBpZD1cIiwgXCItb1wiLCBcImxzdGFydD1cIiwgXCItb1wiLCBcImNvbW09XCJdO1xuICBjb25zdCBwcm9jID0gbm9kZVNwYXduKGNvbW1hbmQsIGFyZ3MsIHtcbiAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXG4gICAgd2luZG93c0hpZGU6IHRydWUsXG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gIH0pO1xuICBjb25zdCBzdGRvdXQgPSB0ZXh0KHByb2Muc3Rkb3V0ISk7XG4gIGNvbnN0IHN0ZGVyciA9IHRleHQocHJvYy5zdGRlcnIhKTtcbiAgY29uc3QgW2V4aXRDb2RlLCBzdGRvdXRUZXh0LCBzdGRlcnJUZXh0XSA9IGF3YWl0IFByb21pc2UuYWxsKFt3YWl0Rm9yRXhpdChwcm9jKSwgc3Rkb3V0LCBzdGRlcnJdKTtcbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7Y29tbWFuZExhYmVsKGNvbW1hbmQsIGFyZ3MpfSBmYWlsZWQgKGV4aXQgJHtleGl0Q29kZX0pJHtcbiAgICAgICAgc3RkZXJyVGV4dCA/IGA6ICR7c3RkZXJyVGV4dC50cmltKCl9YCA6IFwiXCJcbiAgICAgIH1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlUHJvY2Vzc1NuYXBzaG90KGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KHN0ZG91dFRleHQpKTtcbn1cblxuLyoqIFJlYWQgYSBwcm9jZXNzIHNuYXBzaG90LCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwcm9jZXNzIHRhYmxlIGNhbm5vdCBiZSBsaXN0ZWQuICovXG5hc3luYyBmdW5jdGlvbiB0cnlQcm9jZXNzU25hcHNob3QoKTogUHJvbWlzZTxQcm9jZXNzU25hcHNob3RFbnRyeVtdIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHByb2Nlc3NTbmFwc2hvdCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInByb2Nlc3Mgc25hcHNob3QgZmFpbGVkXCIsIHsgZXJyb3I6IHRvRXJyb3IoZXJyb3IpIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqIEdyb3VwIGEgcHJvY2VzcyBzbmFwc2hvdCBieSBwYXJlbnQgUElELiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuKFxuICBzbmFwc2hvdDogcmVhZG9ubHkgUHJvY2Vzc1NuYXBzaG90RW50cnlbXSxcbik6IE1hcDxudW1iZXIsIFByb2Nlc3NTbmFwc2hvdEVudHJ5W10+IHtcbiAgY29uc3QgY2hpbGRyZW4gPSBuZXcgTWFwPG51bWJlciwgUHJvY2Vzc1NuYXBzaG90RW50cnlbXT4oKTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBzbmFwc2hvdCkge1xuICAgIGNvbnN0IHNpYmxpbmdzID0gY2hpbGRyZW4uZ2V0KGVudHJ5LnBhcmVudFBpZCkgPz8gW107XG4gICAgc2libGluZ3MucHVzaChlbnRyeSk7XG4gICAgY2hpbGRyZW4uc2V0KGVudHJ5LnBhcmVudFBpZCwgc2libGluZ3MpO1xuICB9XG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuLyoqIFNlbGVjdCBvbmUgc25hcHNob3R0ZWQgcHJvY2VzcyB0cmVlIGluIGRlc2NlbmRhbnQtZmlyc3Qgc2lnbmFsIG9yZGVyLiAqL1xuZnVuY3Rpb24gcHJvY2Vzc1RyZWUoXG4gIHNuYXBzaG90OiByZWFkb25seSBQcm9jZXNzU25hcHNob3RFbnRyeVtdLFxuICByb290UGlkOiBudW1iZXIsXG4pOiBQcm9jZXNzU25hcHNob3RFbnRyeVtdIHtcbiAgY29uc3Qgcm9vdCA9IHNuYXBzaG90LmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5waWQgPT09IHJvb3RQaWQpO1xuICBpZiAoIXJvb3QpIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGlkZW50aWZ5IGNoaWxkIHByb2Nlc3MgJHtyb290UGlkfWApO1xuXG4gIGNvbnN0IGNoaWxkcmVuID0gcHJvY2Vzc0NoaWxkcmVuKHNuYXBzaG90KTtcbiAgY29uc3QgdHJlZTogUHJvY2Vzc1NuYXBzaG90RW50cnlbXSA9IFtdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxudW1iZXI+KFtyb290UGlkXSk7XG4gIGNvbnN0IGFwcGVuZERlc2NlbmRhbnRzID0gKHBhcmVudFBpZDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbi5nZXQocGFyZW50UGlkKSA/PyBbXSkge1xuICAgICAgaWYgKHZpc2l0ZWQuaGFzKGNoaWxkLnBpZCkpIGNvbnRpbnVlO1xuICAgICAgdmlzaXRlZC5hZGQoY2hpbGQucGlkKTtcbiAgICAgIGFwcGVuZERlc2NlbmRhbnRzKGNoaWxkLnBpZCk7XG4gICAgICB0cmVlLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfTtcbiAgYXBwZW5kRGVzY2VuZGFudHMocm9vdFBpZCk7XG4gIHRyZWUucHVzaChyb290KTtcbiAgcmV0dXJuIHRyZWU7XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciB0d28gc25hcHNob3RzIGlkZW50aWZ5IHRoZSBzYW1lIHByb2Nlc3MgbGlmZXRpbWUuICovXG5mdW5jdGlvbiBzYW1lUHJvY2VzcyhwcmV2aW91czogUHJvY2Vzc1NuYXBzaG90RW50cnksIGN1cnJlbnQ6IFByb2Nlc3NTbmFwc2hvdEVudHJ5KTogYm9vbGVhbiB7XG4gIHJldHVybiBwcmV2aW91cy5pZGVudGl0eSA9PT0gY3VycmVudC5pZGVudGl0eTtcbn1cblxuLyoqXG4gKiBSZWZyZXNoIHJldGFpbmVkIHByb2Nlc3MgaWRlbnRpdGllcyBhbmQgbWVyZ2UgZGVzY2VuZGFudHMgY3JlYXRlZCBhZnRlciB0aGVcbiAqIGluaXRpYWwgc25hcHNob3QuXG4gKi9cbmZ1bmN0aW9uIHJlZnJlc2hQcm9jZXNzVHJlZShcbiAgcmV0YWluZWQ6IE1hcDxudW1iZXIsIFByb2Nlc3NTbmFwc2hvdEVudHJ5PixcbiAgc25hcHNob3Q6IHJlYWRvbmx5IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10sXG4pOiBSZWZyZXNoZWRQcm9jZXNzVHJlZSB7XG4gIGNvbnN0IGN1cnJlbnRCeVBpZCA9IG5ldyBNYXAoc25hcHNob3QubWFwKChlbnRyeSkgPT4gW2VudHJ5LnBpZCwgZW50cnldKSk7XG4gIGNvbnN0IGNoaWxkcmVuID0gcHJvY2Vzc0NoaWxkcmVuKHNuYXBzaG90KTtcbiAgY29uc3QgcHJvY2Vzc2VzID0gbmV3IE1hcDxudW1iZXIsIFByb2Nlc3NTbmFwc2hvdEVudHJ5PigpO1xuICBjb25zdCBkaXNjb3ZlcmVkOiBQcm9jZXNzU25hcHNob3RFbnRyeVtdID0gW107XG4gIGNvbnN0IHF1ZXVlOiBQcm9jZXNzU25hcHNob3RFbnRyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCBwcmV2aW91cyBvZiByZXRhaW5lZC52YWx1ZXMoKSkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBjdXJyZW50QnlQaWQuZ2V0KHByZXZpb3VzLnBpZCk7XG4gICAgaWYgKCFjdXJyZW50IHx8ICFzYW1lUHJvY2VzcyhwcmV2aW91cywgY3VycmVudCkpIGNvbnRpbnVlO1xuICAgIHJldGFpbmVkLnNldChjdXJyZW50LnBpZCwgY3VycmVudCk7XG4gICAgcHJvY2Vzc2VzLnNldChjdXJyZW50LnBpZCwgY3VycmVudCk7XG4gICAgcXVldWUucHVzaChjdXJyZW50KTtcbiAgfVxuXG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0KHByb2Nlc3Nlcy5rZXlzKCkpO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcXVldWUubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcXVldWVbaW5kZXhdITtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuLmdldChwYXJlbnQucGlkKSA/PyBbXSkge1xuICAgICAgY29uc3QgcHJldmlvdXMgPSByZXRhaW5lZC5nZXQoY2hpbGQucGlkKTtcbiAgICAgIGlmICghcHJldmlvdXMgfHwgIXNhbWVQcm9jZXNzKHByZXZpb3VzLCBjaGlsZCkpIHtcbiAgICAgICAgcmV0YWluZWQuc2V0KGNoaWxkLnBpZCwgY2hpbGQpO1xuICAgICAgICBkaXNjb3ZlcmVkLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgICAgcHJvY2Vzc2VzLnNldChjaGlsZC5waWQsIGNoaWxkKTtcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhjaGlsZC5waWQpKSBjb250aW51ZTtcbiAgICAgIHZpc2l0ZWQuYWRkKGNoaWxkLnBpZCk7XG4gICAgICBxdWV1ZS5wdXNoKGNoaWxkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBwcm9jZXNzZXM6IFsuLi5wcm9jZXNzZXMudmFsdWVzKCldLCBkaXNjb3ZlcmVkIH07XG59XG5cbi8qKiBCdWlsZCB0aGUgcGVyLWxpZmV0aW1lIGtleSB1c2VkIHRvIHByZXZlbnQgcmVwZWF0ZWQgc2lnbmFscyBhZnRlciBQSUQgcmV1c2UuICovXG5mdW5jdGlvbiBwcm9jZXNzSWRlbnRpdHkoZW50cnk6IFByb2Nlc3NTbmFwc2hvdEVudHJ5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2VudHJ5LnBpZH06JHtlbnRyeS5pZGVudGl0eX1gO1xufVxuXG4vKiogU2lnbmFsIGVhY2ggcHJvY2VzcyBpZGVudGl0eSBvbmNlLCBpZ25vcmluZyBQSURzIHRoYXQgYWxyZWFkeSBleGl0ZWQuICovXG5mdW5jdGlvbiBzaWduYWxQcm9jZXNzZXMoXG4gIHByb2Nlc3NlczogcmVhZG9ubHkgUHJvY2Vzc1NuYXBzaG90RW50cnlbXSxcbiAgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyxcbiAgc2lnbmFsZWQ6IFNldDxzdHJpbmc+LFxuKTogdm9pZCB7XG4gIGNvbnN0IGVycm9yczogdW5rbm93bltdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgcHJvY2Vzc2VzKSB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBwcm9jZXNzSWRlbnRpdHkoZW50cnkpO1xuICAgIGlmIChzaWduYWxlZC5oYXMoaWRlbnRpdHkpKSBjb250aW51ZTtcbiAgICBzaWduYWxlZC5hZGQoaWRlbnRpdHkpO1xuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmtpbGwoZW50cnkucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzTWlzc2luZ1Byb2Nlc3NFcnJvcihlcnJvcikpIGVycm9ycy5wdXNoKGVycm9yKTtcbiAgICB9XG4gIH1cbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgYEZhaWxlZCB0byBzZW5kICR7c2lnbmFsfSB0byB0aGUgY29tcGxldGUgcHJvY2VzcyB0cmVlYCk7XG4gIH1cbn1cblxuLyoqIFBhdXNlIHdpdGhvdXQgZGV0YWNoaW5nIHRoZSBzaHV0ZG93biBvcGVyYXRpb24gZnJvbSB0aGUgZXZlbnQgbG9vcC4gKi9cbmZ1bmN0aW9uIGRlbGF5KG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cblxuLyoqXG4gKiBQb2xsIHJlZnJlc2hlZCBwcm9jZXNzIHNuYXBzaG90cyB1bnRpbCB0aGUgcmV0YWluZWQgdHJlZSBleGl0cyBvciB0aGVcbiAqIHRpbWVvdXQgZWxhcHNlcy4gRGVzY2VuZGFudHMgY3JlYXRlZCBkdXJpbmcgc2h1dGRvd24gYXJlIHJldGFpbmVkIGFuZCBtYXlcbiAqIHJlY2VpdmUgdGhlIGN1cnJlbnQgc2h1dGRvd24gc2lnbmFsIG9uY2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JQcm9jZXNzVHJlZUV4aXQoXG4gIHJldGFpbmVkOiBNYXA8bnVtYmVyLCBQcm9jZXNzU25hcHNob3RFbnRyeT4sXG4gIGluaXRpYWxQcm9jZXNzZXM6IHJlYWRvbmx5IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10sXG4gIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMsXG4gIHNpZ25hbGVkOiBTZXQ8c3RyaW5nPixcbiAgdGltZW91dE1zOiBudW1iZXIsXG4gIHBvbGxJbnRlcnZhbE1zOiBudW1iZXIsXG4gIHNpZ25hbERpc2NvdmVyZWQ6IGJvb2xlYW4sXG4pOiBQcm9taXNlPFByb2Nlc3NTbmFwc2hvdEVudHJ5W10+IHtcbiAgbGV0IHN1cnZpdm9ycyA9IFsuLi5pbml0aWFsUHJvY2Vzc2VzXTtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGltZW91dE1zO1xuICB3aGlsZSAoc3Vydml2b3JzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCByZW1haW5pbmdNcyA9IGRlYWRsaW5lIC0gRGF0ZS5ub3coKTtcbiAgICBpZiAocmVtYWluaW5nTXMgPiAwKSBhd2FpdCBkZWxheShNYXRoLm1pbihwb2xsSW50ZXJ2YWxNcywgcmVtYWluaW5nTXMpKTtcblxuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdHJ5UHJvY2Vzc1NuYXBzaG90KCk7XG4gICAgaWYgKHNuYXBzaG90ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSBicmVhaztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCByZWZyZXNoZWQgPSByZWZyZXNoUHJvY2Vzc1RyZWUocmV0YWluZWQsIHNuYXBzaG90KTtcbiAgICBpZiAoc2lnbmFsRGlzY292ZXJlZCAmJiByZWZyZXNoZWQuZGlzY292ZXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICBzaWduYWxQcm9jZXNzZXMocmVmcmVzaGVkLmRpc2NvdmVyZWQsIHNpZ25hbCwgc2lnbmFsZWQpO1xuICAgIH1cbiAgICBzdXJ2aXZvcnMgPSByZWZyZXNoZWQucHJvY2Vzc2VzO1xuICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSBicmVhaztcbiAgfVxuICByZXR1cm4gc3Vydml2b3JzO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSB7QGxpbmsgc3Bhd259IHdpdGggbGl2ZSBsaW5lIGFycmF5cyBhbmQgbGF6eVxuICogdHJpbW1lZCBgc3Rkb3V0YCAvIGBzdGRlcnJgIGdldHRlcnMgZGVyaXZlZCBmcm9tIHRob3NlIGxpbmVzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFeGVjUmVzdWx0KFxuICBleGl0Q29kZTogbnVtYmVyLFxuICBzdGRvdXRMaW5lczogc3RyaW5nW10sXG4gIHN0ZGVyckxpbmVzOiBzdHJpbmdbXSxcbiAgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbik6IEV4ZWNSZXN1bHQge1xuICByZXR1cm4ge1xuICAgIGV4aXRDb2RlLFxuICAgIGdldCBzdGRvdXRMaW5lcygpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkQXN5bmNMaW5lcyhzdGRvdXRMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyTGluZXMoKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEFzeW5jTGluZXMoc3RkZXJyTGluZXMsIHRyaW0pO1xuICAgIH0sXG4gICAgZ2V0IHN0ZG91dCgpIHtcbiAgICAgIHJldHVybiBmb3JtYXRBc3luY0NhcHR1cmVkTGluZXMoc3Rkb3V0TGluZXMsIHRyaW0pO1xuICAgIH0sXG4gICAgZ2V0IHN0ZGVycigpIHtcbiAgICAgIHJldHVybiBmb3JtYXRBc3luY0NhcHR1cmVkTGluZXMoc3RkZXJyTGluZXMsIHRyaW0pO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHtAbGluayBzcGF3blN5bmN9LiBDYXB0dXJlZCBzdHJpbmdzIGFyZSBzdG9yZWRcbiAqIGFzLWlzOyBgc3Rkb3V0YCAvIGBzdGRlcnJgIHRyaW0gZGlyZWN0bHksIGFuZCBsaW5lIGFycmF5cyBzcGxpdCBvbmx5IG9uIHJlYWQuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN5bmNFeGVjUmVzdWx0KFxuICBleGl0Q29kZTogbnVtYmVyLFxuICBzdGRvdXRUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHN0ZGVyclRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbik6IEV4ZWNSZXN1bHQge1xuICBsZXQgc3Rkb3V0TGluZXNDYWNoZTogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gIGxldCBzdGRlcnJMaW5lc0NhY2hlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICBjb25zdCBzeW5jTGluZXMgPSAodGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nW10gfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0ZXh0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRTeW5jTGluZXMobGluZXNGcm9tQ2FwdHVyZWRPdXRwdXQodGV4dCksIHRyaW0pO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgZXhpdENvZGUsXG4gICAgZ2V0IHN0ZG91dExpbmVzKCkge1xuICAgICAgaWYgKHN0ZG91dFRleHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICAgICAgc3Rkb3V0TGluZXNDYWNoZSA/Pz0gc3luY0xpbmVzKHN0ZG91dFRleHQpID8/IFtdO1xuICAgICAgcmV0dXJuIHN0ZG91dExpbmVzQ2FjaGU7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyTGluZXMoKSB7XG4gICAgICBpZiAoc3RkZXJyVGV4dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gICAgICBzdGRlcnJMaW5lc0NhY2hlID8/PSBzeW5jTGluZXMoc3RkZXJyVGV4dCkgPz8gW107XG4gICAgICByZXR1cm4gc3RkZXJyTGluZXNDYWNoZTtcbiAgICB9LFxuICAgIGdldCBzdGRvdXQoKSB7XG4gICAgICByZXR1cm4gZm9ybWF0U3luY0NhcHR1cmVkVGV4dChzdGRvdXRUZXh0LCB0cmltKSA/PyBcIlwiO1xuICAgIH0sXG4gICAgZ2V0IHN0ZGVycigpIHtcbiAgICAgIHJldHVybiBmb3JtYXRTeW5jQ2FwdHVyZWRUZXh0KHN0ZGVyclRleHQsIHRyaW0pID8/IFwiXCI7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHVzZXItc3VwcGxpZWQgbGluZSBoYW5kbGVycyBmcm9tIGEge0BsaW5rIFN0ZGlvT3B0aW9ufS5cbiAqXG4gKiBUaGUgYFwiY2FwdHVyZVwiYCBtYXJrZXIgaXMgZmlsdGVyZWQgb3V0OyBjYXB0dXJlIGl0c2VsZiBpcyBhbHdheXMgaGFuZGxlZCBieVxuICogcHVzaGluZyBpbnRvIHRoZSBsaW5lIGJ1ZmZlciBpbnNpZGUge0BsaW5rIHJlc29sdmVTdGRpb30uXG4gKlxuICogQHBhcmFtIG9wdGlvbiAtIFN0ZGlvIG9wdGlvbiB0aGF0IG1heSBlbWJlZCBvbmUgb3IgbW9yZSBoYW5kbGVyc1xuICogQHJldHVybnMgSGFuZGxlcnMgdG8gaW52b2tlIGFmdGVyIGVhY2ggY2FwdHVyZWQgbGluZSAobWF5IGJlIGVtcHR5KVxuICovXG5mdW5jdGlvbiBsaW5lSGFuZGxlcnMob3B0aW9uOiBTdGRpb09wdGlvbik6IExpbmVIYW5kbGVyW10ge1xuICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gW29wdGlvbl07XG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbikpIHtcbiAgICByZXR1cm4gb3B0aW9uLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgTGluZUhhbmRsZXIgPT4gaXRlbSAhPT0gXCJjYXB0dXJlXCIpO1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9uID09PSBcIm9iamVjdFwiKSByZXR1cm4gW29wdGlvbi5vbkxpbmVdO1xuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVzTGluZXMob3B0aW9uOiBTdGRpb09wdGlvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIG9wdGlvbiAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG9wdGlvbikgfHwgb3B0aW9uLmNhcHR1cmUgIT09IGZhbHNlO1xufVxuXG4vKipcbiAqIFRydWUgd2hlbiBhIHN0ZGlvIG9wdGlvbiBpcyBhIHN0cmluZyBzcGF3biBtb2RlIHJhdGhlciB0aGFuIGNhcHR1cmUvaGFuZGxlcnMuXG4gKlxuICoge0BsaW5rIHJlc29sdmVTdGRpb30gc3RpbGwgdHJlYXRzIGBcInBpcGVcImAgYXMgcGlwZS1hbmQtY2FwdHVyZTsgb25seVxuICogYFwiaW5oZXJpdFwiYCBhbmQgYFwiaWdub3JlXCJgIHJldHVybiB3aXRob3V0IGEgbGluZSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gU3RkaW8gb3B0aW9uIHRvIGNsYXNzaWZ5XG4gKiBAcmV0dXJucyBXaGV0aGVyIGBvcHRpb25gIGlzIGBcImluaGVyaXRcImAsIGBcInBpcGVcImAsIG9yIGBcImlnbm9yZVwiYFxuICovXG5mdW5jdGlvbiBpc1Bhc3N0aHJvdWdoTW9kZShvcHRpb246IHVua25vd24pOiBvcHRpb24gaXMgRXhlY1N0ZGlvIHtcbiAgcmV0dXJuIG9wdGlvbiA9PT0gXCJpbmhlcml0XCIgfHwgb3B0aW9uID09PSBcInBpcGVcIiB8fCBvcHRpb24gPT09IFwiaWdub3JlXCI7XG59XG5cbi8qKiBUcnVlIHdoZW4gc3RkaW4gaXMgZGF0YSByYXRoZXIgdGhhbiBvbmUgb2YgdGhlIHRocmVlIHJlc2VydmVkIHN0ZGlvIG1vZGVzLiAqL1xuZnVuY3Rpb24gaXNTdGRpblBheWxvYWQoc3RkaW46IEV4ZWNTdGRpbyB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0ZGluIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2Ygc3RkaW4gPT09IFwic3RyaW5nXCIgJiYgIWlzUGFzc3Rocm91Z2hNb2RlKHN0ZGluKTtcbn1cblxuLyoqXG4gKiBNYXAgYSB7QGxpbmsgU3RkaW9PcHRpb259IGludG8gYSBzcGF3biBzdGRpbyBtb2RlIGFuZCBvcHRpb25hbCBsaW5lIGNhbGxiYWNrLlxuICpcbiAqIFBpcGVkIG1vZGVzIChgXCJjYXB0dXJlXCJgLCBgXCJwaXBlXCJgLCBoYW5kbGVycywgYXJyYXlzKSBhcHBlbmQgZXZlcnkgbGluZSB0b1xuICogYGxpbmVzYCBhbmQgaW52b2tlIGFueSBlbWJlZGRlZCBoYW5kbGVycy4gT21pdHRlZCBvcHRpb25zIHVzZSBgZGVmYXVsdE1vZGVgLlxuICpcbiAqIEBwYXJhbSBvcHRpb24gLSBDYWxsZXIgc3RkaW8gcHJlZmVyZW5jZSBmb3Igb25lIGZkXG4gKiBAcGFyYW0gbGluZXMgLSBNdXRhYmxlIGJ1ZmZlciB0aGF0IHJlY2VpdmVzIGVhY2ggcGlwZWQgbGluZVxuICogQHBhcmFtIGRlZmF1bHRNb2RlIC0gU3Bhd24gbW9kZSB3aGVuIGBvcHRpb25gIGlzIG9taXR0ZWQgKGBcImluaGVyaXRcImAgYnkgZGVmYXVsdClcbiAqIEByZXR1cm5zIFJlc29sdmVkIHNwYXduIG1vZGUgYW5kIG9wdGlvbmFsIHBlci1saW5lIGNhbGxiYWNrXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTdGRpbyhcbiAgb3B0aW9uOiBTdGRpb09wdGlvbiB8IHVuZGVmaW5lZCxcbiAgbGluZXM6IHN0cmluZ1tdLFxuICBkZWZhdWx0TW9kZTogRXhlY1N0ZGlvID0gXCJpbmhlcml0XCIsXG4pOiBSZXNvbHZlZFN0ZGlvIHtcbiAgaWYgKG9wdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4geyBtb2RlOiBkZWZhdWx0TW9kZSB9O1xuICBpZiAoaXNQYXNzdGhyb3VnaE1vZGUob3B0aW9uKSAmJiBvcHRpb24gIT09IFwicGlwZVwiKSByZXR1cm4geyBtb2RlOiBvcHRpb24gfTtcblxuICBjb25zdCBoYW5kbGVycyA9IGxpbmVIYW5kbGVycyhvcHRpb24pO1xuICBjb25zdCBjYXB0dXJlID0gY2FwdHVyZXNMaW5lcyhvcHRpb24pO1xuICByZXR1cm4ge1xuICAgIG1vZGU6IFwicGlwZVwiLFxuICAgIG9uTGluZTogKGxpbmUpID0+IHtcbiAgICAgIGlmIChjYXB0dXJlKSBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSBoYW5kbGVyKGxpbmUpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVhZCBhIHJlYWRhYmxlIHN0cmVhbSBsaW5lLWJ5LWxpbmUgYW5kIGludm9rZSBgb25MaW5lYCBmb3IgZWFjaCBjaHVuay5cbiAqXG4gKiBVc2VzIGByZWFkbGluZWAgc28gYFxcclxcbmAgYW5kIGJhcmUgYFxcbmAgYXJlIG5vcm1hbGl6ZWQuIFRoZSBpbnRlcmZhY2UgaXNcbiAqIGFsd2F5cyBjbG9zZWQgaW4gYSBgZmluYWxseWAgYmxvY2suXG4gKlxuICogQHBhcmFtIHN0cmVhbSAtIFN1YnByb2Nlc3Mgc3Rkb3V0IG9yIHN0ZGVyciBzdHJlYW1cbiAqIEBwYXJhbSBvbkxpbmUgLSBDYWxsYmFjayBpbnZva2VkIG9uY2UgcGVyIG91dHB1dCBsaW5lXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRMaW5lcyhzdHJlYW06IFJlYWRhYmxlLCBvbkxpbmU6IExpbmVIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHsgaW5wdXQ6IHN0cmVhbSwgY3JsZkRlbGF5OiBJbmZpbml0eSB9KTtcbiAgdHJ5IHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGxpbmUgb2YgcmwpIG9uTGluZShsaW5lKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBybC5jbG9zZSgpO1xuICB9XG59XG5cbi8qKlxuICogU3RhcnQgYSBiYWNrZ3JvdW5kIGxpbmUgcmVhZCB3aGVuIHRoZSByZXNvbHZlZCBoYW5kbGVyIHBpcGVzIGEgc3RyZWFtLlxuICpcbiAqIEBwYXJhbSByZWFkcyAtIFByb21pc2UgbGlzdCBhd2FpdGVkIGJlZm9yZSByZXR1cm5pbmcgdGhlIHtAbGluayBFeGVjUmVzdWx0fVxuICogQHBhcmFtIHN0cmVhbSAtIFN1YnByb2Nlc3Mgc3RyZWFtIGZvciB0aGlzIGZkIChgbnVsbGAgd2hlbiB1bmF2YWlsYWJsZSlcbiAqIEBwYXJhbSBoYW5kbGVyIC0gUmVzb2x2ZWQgc3RkaW8gY29uZmlnIGZyb20ge0BsaW5rIHJlc29sdmVTdGRpb31cbiAqL1xuZnVuY3Rpb24gcXVldWVMaW5lUmVhZHMoXG4gIHJlYWRzOiBQcm9taXNlPHZvaWQ+W10sXG4gIHN0cmVhbTogUmVhZGFibGUgfCBudWxsLFxuICBoYW5kbGVyOiBSZXNvbHZlZFN0ZGlvLFxuKTogdm9pZCB7XG4gIGlmIChoYW5kbGVyLm9uTGluZSAmJiBzdHJlYW0pIHJlYWRzLnB1c2gocmVhZExpbmVzKHN0cmVhbSwgaGFuZGxlci5vbkxpbmUpKTtcbn1cblxuLyoqXG4gKiBXcml0ZSBzdHJpbmcgc3RkaW4gdG8gYSBzcGF3bmVkIHByb2Nlc3MgYW5kIGNsb3NlIHRoZSBzdHJlYW0uXG4gKlxuICogTm8tb3AgdW5sZXNzIGBzdGRpbmAgaXMgYSBwYXlsb2FkIHN0cmluZyAobm90IGEgc3RkaW8gbW9kZSkgYW5kXG4gKiBgcHJvYy5zdGRpbmAgaXMgYXZhaWxhYmxlLiBBIGNoaWxkIHRoYXQgZXhpdHMgYmVmb3JlIGNvbnN1bWluZyB0aGUgcGF5bG9hZFxuICogY2xvc2VzIGl0cyBwaXBlOyBFUElQRSBpcyBleHBlY3RlZCBpbiB0aGF0IGNhc2UgYW5kIGlzIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHByb2MgLSBDaGlsZCBwcm9jZXNzIHJldHVybmVkIGZyb20gYHNwYXduYFxuICogQHBhcmFtIHN0ZGluIC0gU3RkaW8gbW9kZSBvciBzdHJpbmcgcGF5bG9hZCBmcm9tIHtAbGluayBFeGVjT3B0aW9uc31cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVTdGRpbihcbiAgcHJvYzogQ2hpbGRQcm9jZXNzLFxuICBzdGRpbjogRXhlY1N0ZGlvIHwgc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNTdGRpblBheWxvYWQoc3RkaW4pIHx8ICFwcm9jLnN0ZGluKSByZXR1cm47XG4gIGNvbnN0IGNvbXBsZXRpb24gPSBmaW5pc2hlZChwcm9jLnN0ZGluLCB7IGNsZWFudXA6IHRydWUgfSk7XG4gIHByb2Muc3RkaW4uZW5kKHN0ZGluKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjb21wbGV0aW9uO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoIShlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiBcImNvZGVcIiBpbiBlcnIgJiYgZXJyLmNvZGUgPT09IFwiRVBJUEVcIikpIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIEF3YWl0IHByb2Nlc3MgZXhpdCBhbmQgbm9ybWFsaXplIGEgbWlzc2luZyBleGl0IGNvZGUgdG8gYDFgLlxuICpcbiAqIFJlamVjdHMgd2hlbiBzcGF3biBmYWlscyBiZWZvcmUgYGNsb3NlYCAoZS5nLiBleGVjdXRhYmxlIG5vdCBmb3VuZCkuXG4gKlxuICogQHBhcmFtIHByb2MgLSBDaGlsZCBwcm9jZXNzIHJldHVybmVkIGZyb20gYHNwYXduYFxuICogQHJldHVybnMgUmVzb2x2ZWQgZXhpdCBjb2RlXG4gKi9cbmZ1bmN0aW9uIHdhaXRGb3JFeGl0KHByb2M6IENoaWxkUHJvY2Vzcyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcHJvYy5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICBwcm9jLm9uY2UoXCJjbG9zZVwiLCAoY29kZSkgPT4gcmVzb2x2ZShjb2RlID8/IDEpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQnVpbGQgYW4gYEVycm9yYCBmb3IgYSBub24temVybyBleGl0IHdoZW4ge0BsaW5rIEV4ZWNPcHRpb25zLmNoZWNrfSBpcyBzZXQuXG4gKlxuICogUHJlZmVycyB0cmltbWVkIHN0ZGVyciB0ZXh0LCB0aGVuIHN0ZG91dCwgaW4gdGhlIG1lc3NhZ2UgYm9keS5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIEV4ZWN1dGFibGUgbmFtZSBvciBwYXRoXG4gKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGV4ZWN1dGFibGVcbiAqIEBwYXJhbSByZXN1bHQgLSBDb21wbGV0ZWQgZXhlYyBvdXRjb21lIHdpdGggY2FwdHVyZWQgb3V0cHV0XG4gKiBAcmV0dXJucyBFcnJvciBzdWl0YWJsZSBmb3IgdGhyb3dpbmcgZnJvbSB7QGxpbmsgc3Bhd259XG4gKi9cbmZ1bmN0aW9uIGV4ZWNFcnJvcihjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCByZXN1bHQ6IEV4ZWNSZXN1bHQpOiBFcnJvciB7XG4gIGNvbnN0IGRldGFpbCA9IHJlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dDtcbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBgJHtjb21tYW5kTGFiZWwoY29tbWFuZCwgYXJncyl9IGZhaWxlZCAoZXhpdCAke3Jlc3VsdC5leGl0Q29kZX0pJHtkZXRhaWwgPyBgOiAke2RldGFpbH1gIDogXCJcIn1gLFxuICApO1xufVxuXG4vKipcbiAqIE1hcCBhIHtAbGluayBTeW5jRXhlY1N0ZGlvfSBvcHRpb24gdG8gYSBgc3Bhd25TeW5jYCBzdGRpbyBtb2RlLlxuICpcbiAqIGBcImNhcHR1cmVcImAgcGlwZXMgdGhlIGZkIHNvIG91dHB1dCBjYW4gYmUgcmVhZCBpbnRvIHRoZSB7QGxpbmsgRXhlY1Jlc3VsdH0uXG4gKlxuICogQHBhcmFtIG9wdGlvbiAtIENhbGxlciBzdGRpbyBwcmVmZXJlbmNlIGZvciBvbmUgZmRcbiAqIEBwYXJhbSBkZWZhdWx0TW9kZSAtIFNwYXduIG1vZGUgd2hlbiBgb3B0aW9uYCBpcyBvbWl0dGVkIChgXCJpbmhlcml0XCJgIGJ5IGRlZmF1bHQpXG4gKiBAcmV0dXJucyBWYWx1ZSBmb3IgdGhlIGBzcGF3blN5bmNgIHN0ZGlvIHR1cGxlXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTeW5jU3RkaW8oXG4gIG9wdGlvbjogU3luY0V4ZWNTdGRpbyB8IHVuZGVmaW5lZCxcbiAgZGVmYXVsdE1vZGU6IEV4ZWNTdGRpbyA9IFwiaW5oZXJpdFwiLFxuKTogRXhlY1N0ZGlvIHtcbiAgaWYgKG9wdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdE1vZGU7XG4gIGlmIChvcHRpb24gPT09IFwiY2FwdHVyZVwiKSByZXR1cm4gXCJwaXBlXCI7XG4gIHJldHVybiBvcHRpb247XG59XG5cbi8qKlxuICogTm9ybWFsaXplIHJhdyBgc3Bhd25TeW5jYCBvdXRwdXQgdG8gYSBVVEYtOCBzdHJpbmcgd2hlbiBjYXB0dXJlIGlzIGVuYWJsZWQuXG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVkVGV4dChvdXRwdXQ6IHN0cmluZyB8IEJ1ZmZlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAob3V0cHV0ID09PSBudWxsIHx8IG91dHB1dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIG91dHB1dCA9PT0gXCJzdHJpbmdcIiA/IG91dHB1dCA6IG91dHB1dC50b1N0cmluZyhcInV0ZjhcIik7XG59XG5cbi8qKlxuICogU3BsaXQgY2FwdHVyZWQgcHJvY2VzcyBvdXRwdXQgaW50byBsaW5lcyBmb3Ige0BsaW5rIEV4ZWNSZXN1bHQuc3Rkb3V0TGluZXN9IC9cbiAqIHtAbGluayBFeGVjUmVzdWx0LnN0ZGVyckxpbmVzfSAoe0BsaW5rIHNwYXduU3luY30gb25seTsgaW52b2tlZCBsYXppbHkpLlxuICovXG5mdW5jdGlvbiBsaW5lc0Zyb21DYXB0dXJlZE91dHB1dChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIG91dHB1dC5yZXBsYWNlKC9cXHJcXG4vZywgXCJcXG5cIikucmVwbGFjZSgvXFxyL2csIFwiXFxuXCIpLnNwbGl0KFwiXFxuXCIpO1xufVxuXG4vKipcbiAqIFN0b3AgYSBjaGlsZCBwcm9jZXNzIGFuZCBkZXNjZW5kYW50cyBkaXNjb3ZlcmVkIHRocm91Z2ggb3BlcmF0aW5nLXN5c3RlbVxuICogcHJvY2VzcyBzbmFwc2hvdHMuXG4gKlxuICogVGhlIGluaXRpYWwgdHJlZSBpcyByZXRhaW5lZCBiZWZvcmUgc2lnbmFsaW5nIHNvIGRlc2NlbmRhbnRzIHJlbWFpblxuICogdGFyZ2V0YWJsZSBhZnRlciB0aGVpciBwYXJlbnQgZXhpdHMgb3IgdGhleSBhcmUgcmVwYXJlbnRlZC4gUG9sbGluZyByZWZyZXNoZXNcbiAqIHRoZSBwcm9jZXNzIHRhYmxlLCBtZXJnZXMgbmV3bHkgY3JlYXRlZCBkZXNjZW5kYW50cywgYW5kIHNlbmRzIGVhY2ggb25lIHRoZVxuICogYWN0aXZlIHNodXRkb3duIHNpZ25hbCBvbmNlLiBtYWNPUyBhbmQgb3RoZXIgUE9TSVggcGxhdGZvcm1zIHVzZSBgcHNgO1xuICogV2luZG93cyB1c2VzIHRoZSBidWlsdC1pbiBQb3dlclNoZWxsIENJTSBwcm9jZXNzIHByb3ZpZGVyLlxuICpcbiAqIFdpbmRvd3MgZG9lcyBub3QgaW1wbGVtZW50IFBPU0lYIHNpZ25hbCBzZW1hbnRpY3MuIE5vZGUgdGVybWluYXRlcyBwcm9jZXNzZXNcbiAqIHVuY29uZGl0aW9uYWxseSBmb3Igc3VwcG9ydGVkIHNpZ25hbHMgdGhlcmUsIGluY2x1ZGluZyBgU0lHVEVSTWAuXG4gKlxuICogQHBhcmFtIGNoaWxkIC0gUm9vdCBjaGlsZCBwcm9jZXNzIHdob3NlIHNuYXBzaG90dGVkIHRyZWUgc2hvdWxkIHN0b3BcbiAqIEBwYXJhbSBvcHRpb25zIC0gR3JhY2VmdWwgYW5kIGZvcmNlZCBzaHV0ZG93biB0aW1lb3V0IHBvbGljeVxuICogQHBhcmFtIHRlcm1pbmF0ZVNpZ25hbCAtIEludGVybmFsIHNpZ25hbCBzZWxlY3RlZCBmcm9tIHRoZSBwYXJlbnQgZXZlbnQgb3IgcGxhdGZvcm0gZGVmYXVsdFxuICovXG5hc3luYyBmdW5jdGlvbiB0ZXJtaW5hdGVQcm9jZXNzVHJlZShcbiAgY2hpbGQ6IENoaWxkUHJvY2VzcyxcbiAgb3B0aW9uczogQ2hpbGRQcm9jZXNzVGVybWluYXRpb25PcHRpb25zID0ge30sXG4gIHRlcm1pbmF0ZVNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSBERUZBVUxUX1RFUk1JTkFURV9TSUdOQUwsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGNoaWxkLnBpZCA9PT0gdW5kZWZpbmVkIHx8IGNoaWxkLmV4aXRDb2RlICE9PSBudWxsIHx8IGNoaWxkLnNpZ25hbENvZGUgIT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0ZXJtaW5hdGVUaW1lb3V0ID0gdGltZW91dFZhbHVlKFxuICAgIG9wdGlvbnMudGVybWluYXRlVGltZW91dCA/PyBERUZBVUxUX1RFUk1JTkFURV9USU1FT1VUX01TLFxuICAgIFwidGVybWluYXRlVGltZW91dFwiLFxuICApO1xuICBjb25zdCBraWxsVGltZW91dCA9IHRpbWVvdXRWYWx1ZShvcHRpb25zLmtpbGxUaW1lb3V0ID8/IERFRkFVTFRfS0lMTF9USU1FT1VUX01TLCBcImtpbGxUaW1lb3V0XCIpO1xuICBjb25zdCBwb2xsSW50ZXJ2YWxNcyA9IERFRkFVTFRfS0lMTF9QT0xMX0lOVEVSVkFMX01TO1xuICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRyeVByb2Nlc3NTbmFwc2hvdCgpO1xuICBpZiAoY2hpbGQuZXhpdENvZGUgIT09IG51bGwgfHwgY2hpbGQuc2lnbmFsQ29kZSAhPT0gbnVsbCkgcmV0dXJuO1xuICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmtpbGwoY2hpbGQucGlkLCB0ZXJtaW5hdGVTaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzTWlzc2luZ1Byb2Nlc3NFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdHJlZSA9IHByb2Nlc3NUcmVlKHNuYXBzaG90LCBjaGlsZC5waWQpO1xuICBjb25zdCByZXRhaW5lZCA9IG5ldyBNYXAodHJlZS5tYXAoKGVudHJ5KSA9PiBbZW50cnkucGlkLCBlbnRyeV0pKTtcblxuICBjb25zdCB0ZXJtaW5hdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHNpZ25hbFByb2Nlc3Nlcyh0cmVlLCB0ZXJtaW5hdGVTaWduYWwsIHRlcm1pbmF0ZWQpO1xuICBjb25zdCBraWxsVGFyZ2V0cyA9IGF3YWl0IHdhaXRGb3JQcm9jZXNzVHJlZUV4aXQoXG4gICAgcmV0YWluZWQsXG4gICAgdHJlZSxcbiAgICB0ZXJtaW5hdGVTaWduYWwsXG4gICAgdGVybWluYXRlZCxcbiAgICB0ZXJtaW5hdGVUaW1lb3V0LFxuICAgIHBvbGxJbnRlcnZhbE1zLFxuICAgIHRydWUsXG4gICk7XG4gIGlmIChraWxsVGFyZ2V0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBraWxsZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgc2lnbmFsUHJvY2Vzc2VzKGtpbGxUYXJnZXRzLCBERUZBVUxUX0tJTExfU0lHTkFMLCBraWxsZWQpO1xuICBjb25zdCBzdXJ2aXZvcnMgPSBhd2FpdCB3YWl0Rm9yUHJvY2Vzc1RyZWVFeGl0KFxuICAgIHJldGFpbmVkLFxuICAgIGtpbGxUYXJnZXRzLFxuICAgIERFRkFVTFRfS0lMTF9TSUdOQUwsXG4gICAga2lsbGVkLFxuICAgIGtpbGxUaW1lb3V0LFxuICAgIHBvbGxJbnRlcnZhbE1zLFxuICAgIHRydWUsXG4gICk7XG4gIGlmIChzdXJ2aXZvcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIGxvZ2dlci53YXJuKFwicHJvY2VzcyB0cmVlIHN0aWxsIHJ1bm5pbmcgYWZ0ZXIga2lsbCB0aW1lb3V0XCIsIHtcbiAgICByb290UGlkOiBjaGlsZC5waWQsXG4gICAgc3Vydml2b3JQaWRzOiBzdXJ2aXZvcnMubWFwKChlbnRyeSkgPT4gZW50cnkucGlkKSxcbiAgICBraWxsU2lnbmFsOiBERUZBVUxUX0tJTExfU0lHTkFMLFxuICAgIGtpbGxUaW1lb3V0LFxuICB9KTtcbn1cblxuLyoqXG4gKiBTcGF3biBhIHN1YnByb2Nlc3MuIFJldHVybnMgdGhlIExJVkUgY2hpbGQgaGFuZGxlIHRoYXQgaXMgQUxTTyBhXG4gKiBgUHJvbWlzZTxFeGVjUmVzdWx0PmAgcmVzb2x2aW5nIG9uIGV4aXQgLSBzZWUge0BsaW5rIENoaWxkUHJvY2Vzc1Jlc3VsdH0uXG4gKlxuICogVGhlIHByb21pc2UgaGFsZiBpcyB0aGUgZXhhY3QgYmVoYXZpb3VyIHRoaXMgZnVuY3Rpb24gaGFkIGJlZm9yZTogaXQgYXdhaXRzXG4gKiBleGl0IChhbmQgYW55IGxpbmUgcmVhZHMgLyBzdGRpbiB3cml0ZSksIHRoZW4gcmVzb2x2ZXMgdG8gdGhlIHtAbGluayBFeGVjUmVzdWx0fVxuICogb3IgcmVqZWN0cyAoc3Bhd24gZXJyb3Igb3RoZXIgdGhhbiBhIG1pc3NpbmcgZXhlY3V0YWJsZSwgb3IgYGNoZWNrYCBvbiBub24temVyb1xuICogZXhpdCkuIEV4aXN0aW5nIGBhd2FpdCBzcGF3biguLi4pYCBjYWxsZXJzIGFyZSB1bmFmZmVjdGVkLiBUaGUgaGFuZGxlIGhhbGYgbGV0cyBhXG4gKiBjYWxsZXIgc3VwZXJ2aXNlIHRoZSBwcm9jZXNzIChgLnBpZGAsIGAuc2h1dGRvd24oKWAsIGBleGl0YCBldmVudCkgd2l0aG91dCBhXG4gKiBzZWNvbmQgc3Bhd24uXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBFeGVjdXRhYmxlIHRvIHJ1biAocmVzb2x2ZWQgb24gYFBBVEhgIHdoZW4gYHNoZWxsYCBpcyBzZXQgb24gb3B0aW9ucylcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB2ZXJiYXRpbSB0byB0aGUgZXhlY3V0YWJsZVxuICogQHBhcmFtIG9wdGlvbnMgLSBTcGF3biwgc3RkaW8sIGFuZCBjaGVjayBvcHRpb25zXG4gKiBAcmV0dXJucyBUaGUgbGl2ZSBgQ2hpbGRQcm9jZXNzYCwgYXdhaXRhYmxlIHRvIGV4aXQgY29kZSArIGNhcHR1cmVkIG91dHB1dFxuICogQHRocm93cyAob24gdGhlIHByb21pc2UpIFdoZW4gc3Bhd24gZmFpbHMgZm9yIGEgcmVhc29uIG90aGVyIHRoYW4gYSBtaXNzaW5nXG4gKiBleGVjdXRhYmxlLCBsaW5lIHJlYWRzIGZhaWwsIG9yIGBjaGVja2AgaXMgdHJ1ZSBhbmQgZXhpdCBjb2RlIGlzIG5vbi16ZXJvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGF3biguLi5hcmdzOiBTcGF3bkFyZ3M8RXhlY09wdGlvbnM+KTogQ2hpbGRQcm9jZXNzUmVzdWx0IHtcbiAgY29uc3QgeyBjb21tYW5kLCBjb21tYW5kQXJncywgb3B0aW9ucyA9IHt9IH0gPSBwYXJzZVNwYXduQXJncyhhcmdzKTtcbiAgcmVqZWN0U2lnbmFsT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge1xuICAgIHN0ZGluLFxuICAgIHN0ZG91dCxcbiAgICBzdGRlcnIsXG4gICAgZm9yd2FyZFRlcm1pbmF0aW9uU2lnbmFscyA9IHRydWUsXG4gICAgdGVybWluYXRlVGltZW91dCxcbiAgICBraWxsVGltZW91dCxcbiAgICBjaGVjayxcbiAgICB0cmltLFxuICAgIC4uLnNwYXduT3B0c1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgdGVybWluYXRpb25PcHRpb25zOiBDaGlsZFByb2Nlc3NUZXJtaW5hdGlvbk9wdGlvbnMgPSB7XG4gICAgdGVybWluYXRlVGltZW91dCxcbiAgICBraWxsVGltZW91dCxcbiAgfTtcbiAgY29uc3Qgc3Rkb3V0TGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHN0ZGVyckxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzdGRvdXRIYW5kbGVyID0gcmVzb2x2ZVN0ZGlvKHN0ZG91dCwgc3Rkb3V0TGluZXMpO1xuICBjb25zdCBzdGRlcnJIYW5kbGVyID0gcmVzb2x2ZVN0ZGlvKHN0ZGVyciwgc3RkZXJyTGluZXMpO1xuICBjb25zdCBzdGRpbk1vZGU6IEV4ZWNTdGRpbyA9IGlzU3RkaW5QYXlsb2FkKHN0ZGluKSA/IFwicGlwZVwiIDogKHN0ZGluID8/IFwiaW5oZXJpdFwiKTtcblxuICBjb25zdCBwcm9jID0gbm9kZVNwYXduKGNvbW1hbmQsIGNvbW1hbmRBcmdzLCB7XG4gICAgLi4uc3Bhd25PcHRzLFxuICAgIGRldGFjaGVkOiByZXNvbHZlRGV0YWNoZWQoc3Bhd25PcHRzLmRldGFjaGVkLCBmb3J3YXJkVGVybWluYXRpb25TaWduYWxzKSxcbiAgICBzdGRpbzogW3N0ZGluTW9kZSwgc3Rkb3V0SGFuZGxlci5tb2RlLCBzdGRlcnJIYW5kbGVyLm1vZGVdLFxuICB9KTtcbiAgY29uc3QgY2hpbGQgPSBhdHRhY2hQcm9jZXNzQ29udHJvbHMocHJvYywgdGVybWluYXRpb25PcHRpb25zKTtcbiAgY29uc3QgdW5yZWdpc3RlclNpZ25hbEZvcndhcmRpbmcgPSBmb3J3YXJkVGVybWluYXRpb25TaWduYWxzXG4gICAgPyByZWdpc3RlclBhcmVudFNpZ25hbEZvcndhcmRpbmcoY2hpbGQpXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3RkaW5Xcml0ZSA9IHdyaXRlU3RkaW4ocHJvYywgc3RkaW4pO1xuXG4gIGNvbnN0IHJlYWRzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgcXVldWVMaW5lUmVhZHMocmVhZHMsIHByb2Muc3Rkb3V0LCBzdGRvdXRIYW5kbGVyKTtcbiAgcXVldWVMaW5lUmVhZHMocmVhZHMsIHByb2Muc3RkZXJyLCBzdGRlcnJIYW5kbGVyKTtcblxuICBjb25zdCBjb21wbGV0aW9uID0gKGFzeW5jICgpOiBQcm9taXNlPEV4ZWNSZXN1bHQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGV4aXRDb2RlID0gMTtcbiAgICAgIGxldCBjb21tYW5kTm90Rm91bmRFcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhpdENvZGUgPSBhd2FpdCB3YWl0Rm9yRXhpdChwcm9jKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3N0ZGluV3JpdGUsIC4uLnJlYWRzXSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCFpc0NvbW1hbmROb3RGb3VuZEVycm9yKGVycikpIHtcbiAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3N0ZGluV3JpdGUsIC4uLnJlYWRzXSk7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHByb2Muc3RkaW4/LmRlc3Ryb3koKTtcbiAgICAgICAgcHJvYy5zdGRvdXQ/LmRlc3Ryb3koKTtcbiAgICAgICAgcHJvYy5zdGRlcnI/LmRlc3Ryb3koKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtzdGRpbldyaXRlXSk7XG4gICAgICAgIGZvciAoY29uc3QgcmVhZCBvZiByZWFkcykgdm9pZCByZWFkLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbW1hbmROb3RGb3VuZEVycm9yID0gZXJyO1xuICAgICAgICBleGl0Q29kZSA9IENPTU1BTkRfTk9UX0ZPVU5EX0VYSVRfQ09ERTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlRXhlY1Jlc3VsdChleGl0Q29kZSwgc3Rkb3V0TGluZXMsIHN0ZGVyckxpbmVzLCB0cmltKTtcbiAgICAgIGlmIChjaGVjayAmJiByZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgY29uc3QgZXJyID0gZXhlY0Vycm9yKGNvbW1hbmQsIGNvbW1hbmRBcmdzLCByZXN1bHQpO1xuICAgICAgICBpZiAoY29tbWFuZE5vdEZvdW5kRXJyb3IpIGVyci5jYXVzZSA9IGNvbW1hbmROb3RGb3VuZEVycm9yO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB1bnJlZ2lzdGVyU2lnbmFsRm9yd2FyZGluZz8uKCk7XG4gICAgfVxuICB9KSgpO1xuXG4gIC8vIEF0dGFjaCB0aGUgcHJvbWlzZSBpbnRlcmZhY2Ugb250byB0aGUgbGl2ZSBjaGlsZCBzbyBPTkUgb2JqZWN0IGlzIGJvdGguIFRoZVxuICAvLyBtZXRob2RzIGFyZSBib3VuZCB0byBgY29tcGxldGlvbmAgc28gYHRoaXNgIGlzIHRoZSByZWFsIHByb21pc2U7IHRoZSBjaGlsZFxuICAvLyBvd25zIG5vIGNvbmZsaWN0aW5nIGB0aGVuYC9gY2F0Y2hgL2BmaW5hbGx5YCwgc28gdGhpcyBpcyBwdXJlbHkgYWRkaXRpdmUuXG4gIHJldHVybiBhdHRhY2hQcm9taXNlKGNoaWxkLCBjb21wbGV0aW9uKTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoUHJvY2Vzc0NvbnRyb2xzKFxuICBjaGlsZDogQ2hpbGRQcm9jZXNzLFxuICBkZWZhdWx0czogQ2hpbGRQcm9jZXNzVGVybWluYXRpb25PcHRpb25zLFxuKTogQ2hpbGRQcm9jZXNzUmVzdWx0IHtcbiAgY29uc3QgY29udHJvbGxlZCA9IGNoaWxkIGFzIENoaWxkUHJvY2Vzc1Jlc3VsdDtcbiAgbGV0IHNodXRkb3duUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2h1dGRvd24gPSAoXG4gICAgb3B0aW9uczogQ2hpbGRQcm9jZXNzVGVybWluYXRpb25PcHRpb25zLFxuICAgIHRlcm1pbmF0ZVNpZ25hbCA9IERFRkFVTFRfVEVSTUlOQVRFX1NJR05BTCxcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcmVqZWN0U2lnbmFsT3B0aW9ucyhvcHRpb25zKTtcbiAgICBzaHV0ZG93blByb21pc2UgPz89IHRlcm1pbmF0ZVByb2Nlc3NUcmVlKGNoaWxkLCB7IC4uLmRlZmF1bHRzLCAuLi5vcHRpb25zIH0sIHRlcm1pbmF0ZVNpZ25hbCk7XG4gICAgcmV0dXJuIHNodXRkb3duUHJvbWlzZTtcbiAgfTtcbiAgY29udHJvbGxlZC5zaHV0ZG93biA9IChvcHRpb25zID0ge30pID0+IHNodXRkb3duKG9wdGlvbnMpO1xuICBwYXJlbnRTaWduYWxTaHV0ZG93bnMuc2V0KGNvbnRyb2xsZWQsIChzaWduYWwpID0+IHNodXRkb3duKHt9LCBzaWduYWwpKTtcbiAgcmV0dXJuIGNvbnRyb2xsZWQ7XG59XG5cbi8qKlxuICogQXR0YWNoIGEgcHJvbWlzZSdzIGB0aGVuYCAvIGBjYXRjaGAgLyBgZmluYWxseWAgb250byBhIGxpdmUgb2JqZWN0LCByZXR1cm5pbmdcbiAqIHRoZSBzYW1lIG9iamVjdCB0eXBlZCBhcyBib3RoLiBVc2VkIGJ5IHtAbGluayBzcGF3bn0gdG8gbWFrZSBpdHMgYENoaWxkUHJvY2Vzc2BcbiAqIGF3YWl0YWJsZSB3aXRob3V0IHdyYXBwaW5nIGl0IC0gc28gY2FsbGVycyBrZWVwIHRoZSBsaXZlIGhhbmRsZSBBTkQgYGF3YWl0YCBpdC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoUHJvbWlzZTxUIGV4dGVuZHMgb2JqZWN0LCBSPih0YXJnZXQ6IFQsIHByb21pc2U6IFByb21pc2U8Uj4pOiBUICYgUHJvbWlzZTxSPiB7XG4gIGNvbnN0IGh5YnJpZCA9IHRhcmdldCBhcyBUICYgUHJvbWlzZTxSPjtcbiAgaHlicmlkLnRoZW4gPSBwcm9taXNlLnRoZW4uYmluZChwcm9taXNlKTtcbiAgaHlicmlkLmNhdGNoID0gcHJvbWlzZS5jYXRjaC5iaW5kKHByb21pc2UpO1xuICBoeWJyaWQuZmluYWxseSA9IHByb21pc2UuZmluYWxseS5iaW5kKHByb21pc2UpO1xuICByZXR1cm4gaHlicmlkO1xufVxuXG4vKipcbiAqIFNwYXduIGEgc3VicHJvY2VzcyBzeW5jaHJvbm91c2x5IGFuZCB3YWl0IGZvciBleGl0LlxuICpcbiAqIFVubGlrZSB7QGxpbmsgc3Bhd259LCBzdGRpbyBvcHRpb25zIGFyZSBsaW1pdGVkIHRvIGBcImluaGVyaXRcImAsIGBcInBpcGVcImAsXG4gKiBgXCJpZ25vcmVcImAsIGFuZCBgXCJjYXB0dXJlXCJgIOKAlCBubyBwZXItbGluZSBjYWxsYmFja3MuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBFeGVjdXRhYmxlIHRvIHJ1biAocmVzb2x2ZWQgb24gYFBBVEhgIHdoZW4gYHNoZWxsYCBpcyBzZXQgb24gb3B0aW9ucylcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB2ZXJiYXRpbSB0byB0aGUgZXhlY3V0YWJsZVxuICogQHBhcmFtIHNwYXduU3luYyAtIFNwYXduLCBzdGRpbywgYW5kIGNoZWNrIG9wdGlvbnNcbiAqIEByZXR1cm5zIEV4aXQgY29kZSwgY2FwdHVyZWQgbGluZSBhcnJheXMsIGFuZCB0cmltbWVkIGBzdGRvdXRgIC8gYHN0ZGVycmAgZ2V0dGVyc1xuICogQHRocm93cyBXaGVuIHNwYXduIGZhaWxzIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIGEgbWlzc2luZyBleGVjdXRhYmxlLCBvclxuICogYGNoZWNrYCBpcyB0cnVlIGFuZCBleGl0IGNvZGUgaXMgbm9uLXplcm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyguLi5hcmdzOiBTcGF3bkFyZ3M8U3luY0V4ZWNPcHRpb25zPik6IEV4ZWNSZXN1bHQge1xuICBjb25zdCB7IGNvbW1hbmQsIGNvbW1hbmRBcmdzLCBvcHRpb25zID0ge30gfSA9IHBhcnNlU3Bhd25BcmdzKGFyZ3MpO1xuICByZWplY3RTaWduYWxPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7IHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgY2hlY2ssIHRyaW0sIC4uLnNwYXduT3B0cyB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc3RkaW5Nb2RlOiBFeGVjU3RkaW8gPSBpc1N0ZGluUGF5bG9hZChzdGRpbikgPyBcInBpcGVcIiA6IChzdGRpbiA/PyBcImluaGVyaXRcIik7XG4gIGNvbnN0IGNhcHR1cmVTdGRvdXQgPSBzdGRvdXQgPT09IFwiY2FwdHVyZVwiO1xuICBjb25zdCBjYXB0dXJlU3RkZXJyID0gc3RkZXJyID09PSBcImNhcHR1cmVcIjtcbiAgY29uc3Qgc3Rkb3V0TW9kZSA9IHJlc29sdmVTeW5jU3RkaW8oc3Rkb3V0KTtcbiAgY29uc3Qgc3RkZXJyTW9kZSA9IHJlc29sdmVTeW5jU3RkaW8oc3RkZXJyKTtcblxuICBjb25zdCByZXN1bHQgPSBub2RlU3Bhd25TeW5jKGNvbW1hbmQsIGNvbW1hbmRBcmdzLCB7XG4gICAgLi4uc3Bhd25PcHRzLFxuICAgIGVuY29kaW5nOiBjYXB0dXJlU3Rkb3V0IHx8IGNhcHR1cmVTdGRlcnIgPyBcInV0ZjhcIiA6IHVuZGVmaW5lZCxcbiAgICBzdGRpbzogW3N0ZGluTW9kZSwgc3Rkb3V0TW9kZSwgc3RkZXJyTW9kZV0sXG4gICAgaW5wdXQ6IGlzU3RkaW5QYXlsb2FkKHN0ZGluKSA/IHN0ZGluIDogdW5kZWZpbmVkLFxuICB9KTtcblxuICBjb25zdCBjb21tYW5kTm90Rm91bmQgPSBpc0NvbW1hbmROb3RGb3VuZEVycm9yKHJlc3VsdC5lcnJvcik7XG4gIGNvbnN0IGV4aXRDb2RlID0gY29tbWFuZE5vdEZvdW5kID8gQ09NTUFORF9OT1RfRk9VTkRfRVhJVF9DT0RFIDogKHJlc3VsdC5zdGF0dXMgPz8gMSk7XG4gIGNvbnN0IHN0ZG91dFRleHQgPSBjYXB0dXJlU3Rkb3V0ID8gY2FwdHVyZWRUZXh0KHJlc3VsdC5zdGRvdXQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGRlcnJUZXh0ID0gY2FwdHVyZVN0ZGVyciA/IGNhcHR1cmVkVGV4dChyZXN1bHQuc3RkZXJyKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGNyZWF0ZVN5bmNFeGVjUmVzdWx0KGV4aXRDb2RlLCBzdGRvdXRUZXh0LCBzdGRlcnJUZXh0LCB0cmltKTtcblxuICBpZiAocmVzdWx0LmVycm9yICYmICghY29tbWFuZE5vdEZvdW5kIHx8IGNoZWNrKSkge1xuICAgIGNvbnN0IGVyciA9IGV4ZWNFcnJvcihjb21tYW5kLCBjb21tYW5kQXJncywgZXhlY1Jlc3VsdCk7XG4gICAgZXJyLmNhdXNlID0gcmVzdWx0LmVycm9yO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGlmIChjaGVjayAmJiBleGVjUmVzdWx0LmV4aXRDb2RlICE9PSAwKSB0aHJvdyBleGVjRXJyb3IoY29tbWFuZCwgY29tbWFuZEFyZ3MsIGV4ZWNSZXN1bHQpO1xuICByZXR1cm4gZXhlY1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBzaGVsbC1saWtlIGNvbW1hbmQgaW50byBhcmd2LlxuICpcbiAqIFN1cHBvcnRzOlxuICogICAtIHdoaXRlc3BhY2Ugc2VwYXJhdG9yc1xuICogICAtIHNpbmdsZSBhbmQgZG91YmxlIHF1b3Rlc1xuICogICAtIGJhY2tzbGFzaCBlc2NhcGluZ1xuICogICAtIGVzY2FwZWQgc3BhY2VzXG4gKiAgIC0gZW1wdHkgcXVvdGVkIHN0cmluZ3NcbiAqXG4gKiBJZiB0aGUgaW5wdXQgaXMgbWFsZm9ybWVkIChmb3IgZXhhbXBsZSwgYW4gdW50ZXJtaW5hdGVkIHF1b3RlKSxcbiAqIHJldHVybnMgdGhlIG9yaWdpbmFsIHN0cmluZyBhcyBhIHNpbmdsZSBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNobGV4KGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcblxuICBsZXQgY3VycmVudCA9IFwiXCI7XG4gIGxldCBxdW90ZTogXCInXCIgfCAnXCInIHwgdW5kZWZpbmVkO1xuICBsZXQgZXNjYXBlZCA9IGZhbHNlO1xuICBsZXQgcXVvdGVkID0gZmFsc2U7XG5cbiAgY29uc3QgcHVzaCA9ICgpID0+IHtcbiAgICBpZiAocXVvdGVkIHx8IGN1cnJlbnQubGVuZ3RoID4gMCkge1xuICAgICAgYXJncy5wdXNoKGN1cnJlbnQpO1xuICAgIH1cbiAgICBjdXJyZW50ID0gXCJcIjtcbiAgICBxdW90ZWQgPSBmYWxzZTtcbiAgfTtcblxuICBmb3IgKGNvbnN0IGNoIG9mIGNvbW1hbmQpIHtcbiAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gXCJcXFxcXCIpIHtcbiAgICAgIGVzY2FwZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHF1b3RlKSB7XG4gICAgICBpZiAoY2ggPT09IHF1b3RlKSB7XG4gICAgICAgIHF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgICBxdW90ZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudCArPSBjaDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gXCInXCIgfHwgY2ggPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2g7XG4gICAgICBxdW90ZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKC9cXHMvLnRlc3QoY2gpKSB7XG4gICAgICBwdXNoKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjdXJyZW50ICs9IGNoO1xuICB9XG5cbiAgLy8gTWFsZm9ybWVkIGlucHV0OiB0cmVhdCBhcyBhIGxpdGVyYWwgY29tbWFuZC5cbiAgaWYgKHF1b3RlKSB7XG4gICAgcmV0dXJuIFtjb21tYW5kXTtcbiAgfVxuXG4gIC8vIFRyYWlsaW5nIGJhY2tzbGFzaCBpcyBsaXRlcmFsLlxuICBpZiAoZXNjYXBlZCkge1xuICAgIGN1cnJlbnQgKz0gXCJcXFxcXCI7XG4gIH1cblxuICBwdXNoKCk7XG5cbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID8gYXJncyA6IFtjb21tYW5kXTtcbn1cbiJdfQ==
|
|
1023
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRDRztBQUNILE9BQU8sRUFHTCxLQUFLLElBQUksU0FBUyxFQUNsQixTQUFTLElBQUksYUFBYSxHQUMzQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxLQUFLLFFBQVEsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUvRCw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFDO0FBRS9DLE1BQU0sNEJBQTRCLEdBQUcsS0FBSyxDQUFDO0FBQzNDLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0FBQ3RDLE1BQU0sNkJBQTZCLEdBQUcsR0FBRyxDQUFDO0FBQzFDLE1BQU0sd0JBQXdCLEdBQW1CLFNBQVMsQ0FBQztBQUMzRCxNQUFNLG1CQUFtQixHQUFtQixTQUFTLENBQUM7QUFDdEQsTUFBTSx3QkFBd0IsR0FBRyxDQUMvQixPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU87SUFDMUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQ1gsQ0FBQztBQUN0QyxNQUFNLCtCQUErQixHQUNuQyx1SUFBdUksQ0FB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SSxDQUFDO1lBQ2QsU0FBUztRQUNYLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNsQixJQUFJLEVBQUUsQ0FBQztZQUNQLFNBQVM7UUFDWCxDQUFDO1FBRUQsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsK0NBQStDO0lBQy9DLElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osT0FBTyxJQUFJLElBQUksQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxFQUFFLENBQUM7SUFFUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3J0YWJsZSBzdWJwcm9jZXNzIGhlbHBlciBidWlsdCBvbiBgY2hpbGRfcHJvY2Vzcy5zcGF3bmAgYW5kIGxpbmUgc3RyZWFtaW5nLlxuICpcbiAqIEVhY2ggc3RkaW8gZmQgZGVmYXVsdHMgdG8gYFwiaW5oZXJpdFwiYC4ge0BsaW5rIHNwYXdufSBzdHJlYW1zIG91dHB1dFxuICogbGluZS1ieS1saW5lIGludG8ge0BsaW5rIEV4ZWNSZXN1bHQuc3Rkb3V0TGluZXN9XG4gKiAvIHtAbGluayBFeGVjUmVzdWx0LnN0ZGVyckxpbmVzfTsgaXRzIGBzdGRvdXRgIC8gYHN0ZGVycmAgZ2V0dGVycyBqb2luIHRob3NlIGxpbmVzLlxuICoge0BsaW5rIHNwYXduU3luY30ga2VlcHMgdGhlIGNhcHR1cmVkIHN0cmluZzsgaXRzIGBzdGRvdXRgIC8gYHN0ZGVycmAgZ2V0dGVycyByZWFkXG4gKiB0aGF0IHN0cmluZyBkaXJlY3RseSAobGluZSBhcnJheXMgc3BsaXQgbGF6aWx5IG9uIHJlYWQpLlxuICogT21pdHRlZCBgdHJpbWAgKGRlZmF1bHQpIGFwcGxpZXMgYWRhcHRpdmUgbm9ybWFsaXphdGlvbjoge0BsaW5rIHNwYXduU3luY30gZHJvcHNcbiAqIGF0IG1vc3Qgb25lIHRyYWlsaW5nIGVtcHR5IGxpbmUgLyBuZXdsaW5lIGBzcGF3blN5bmNgIGFkZHM7IHtAbGluayBzcGF3bn0gZG9lc1xuICogbm90IChyZWFkbGluZSBuZXZlciBlbWl0cyB0aGF0IGV4dHJhIGxpbmUpLiBgdHJpbTogdHJ1ZWAgc3RyaXBzIGFsbCBsZWFkaW5nL1xuICogdHJhaWxpbmcgd2hpdGVzcGFjZSBpbiBib3RoIG1vZGVzOyBgdHJpbTogZmFsc2VgIGxlYXZlcyBvdXRwdXQgdW5jaGFuZ2VkLlxuICpcbiAqIFRoaXMgbW9kdWxlIG93bnMgc3VicHJvY2VzcyBleGVjdXRpb24gcG9saWN5IGZvciBOb2RlIGFuZCBCdW4gcGFja2FnZXMuIFJldXNlXG4gKiBpdCBpbnN0ZWFkIG9mIHdyYXBwaW5nIGBjaGlsZF9wcm9jZXNzYCBsb2NhbGx5IHdoZW4gY2FsbGVycyBuZWVkIGNvbnNpc3RlbnRcbiAqIGFyZ3YgcGFyc2luZywgc3RkaW8gY2FwdHVyZSwgbGluZSBjYWxsYmFja3MsIGNhbmNlbGxhdGlvbiwgYW5kIGV4aXQgY2hlY2tpbmcuXG4gKlxuICogQGV4YW1wbGUgQ2FwdHVyZSBjb21tYW5kIG91dHB1dFxuICogYGBgdHNcbiAqIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBleGVjKFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIi0tc2hvdy10b3BsZXZlbFwiXSwge1xuICogICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICogICBzdGRlcnI6IFwiaWdub3JlXCIsXG4gKiAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBTdHJlYW0gYW5kIGNhcHR1cmUgdG9nZXRoZXJcbiAqIGBgYHRzXG4gKiBhd2FpdCBleGVjKFwicG5wbVwiLCBbXCJpbnN0YWxsXCJdLCB7XG4gKiAgIHN0ZG91dDogWyhsaW5lKSA9PiBjb25zb2xlLmxvZyhsaW5lKSwgXCJjYXB0dXJlXCJdLFxuICogICBjaGVjazogdHJ1ZSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGUgU3luY2hyb25vdXMgY2FwdHVyZSAobm8gbGluZSBjYWxsYmFja3MpXG4gKiBgYGB0c1xuICogY29uc3QgeyBzdGRvdXQgfSA9IGV4ZWNTeW5jKFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIi0tc2hvdy10b3BsZXZlbFwiXSwge1xuICogICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICogICBzdGRlcnI6IFwiaWdub3JlXCIsXG4gKiAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7XG4gIHR5cGUgQ2hpbGRQcm9jZXNzLFxuICB0eXBlIFNwYXduT3B0aW9ucyxcbiAgc3Bhd24gYXMgbm9kZVNwYXduLFxuICBzcGF3blN5bmMgYXMgbm9kZVNwYXduU3luYyxcbn0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcmVhZGRpciwgcmVhZEZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSBcIm5vZGU6cmVhZGxpbmVcIjtcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgeyB0ZXh0IH0gZnJvbSBcIm5vZGU6c3RyZWFtL2NvbnN1bWVyc1wiO1xuaW1wb3J0IHsgZmluaXNoZWQgfSBmcm9tIFwibm9kZTpzdHJlYW0vcHJvbWlzZXNcIjtcbmltcG9ydCB7IGxvZywgdG9FcnJvciwgbWVtb2l6ZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbi8qKiBTaGVsbC1jb21wYXRpYmxlIGV4aXQgY29kZSByZXR1cm5lZCB3aGVuIGFuIGV4ZWN1dGFibGUgY2Fubm90IGJlIGZvdW5kLiAqL1xuZXhwb3J0IGNvbnN0IENPTU1BTkRfTk9UX0ZPVU5EX0VYSVRfQ09ERSA9IDEyNztcblxuY29uc3QgREVGQVVMVF9URVJNSU5BVEVfVElNRU9VVF9NUyA9IDhfMDAwO1xuY29uc3QgREVGQVVMVF9LSUxMX1RJTUVPVVRfTVMgPSA0XzAwMDtcbmNvbnN0IERFRkFVTFRfS0lMTF9QT0xMX0lOVEVSVkFMX01TID0gMTAwO1xuY29uc3QgREVGQVVMVF9URVJNSU5BVEVfU0lHTkFMOiBOb2RlSlMuU2lnbmFscyA9IFwiU0lHVEVSTVwiO1xuY29uc3QgREVGQVVMVF9LSUxMX1NJR05BTDogTm9kZUpTLlNpZ25hbHMgPSBcIlNJR0tJTExcIjtcbmNvbnN0IEZPUldBUkRFRF9QQVJFTlRfU0lHTkFMUyA9IChcbiAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiXG4gICAgPyBbXCJTSUdJTlRcIiwgXCJTSUdURVJNXCIsIFwiU0lHQlJFQUtcIl1cbiAgICA6IFtcIlNJR0hVUFwiLCBcIlNJR0lOVFwiLCBcIlNJR1RFUk1cIiwgXCJTSUdRVUlUXCJdXG4pIHNhdGlzZmllcyByZWFkb25seSBOb2RlSlMuU2lnbmFsc1tdO1xuY29uc3QgV0lORE9XU19QUk9DRVNTX1NOQVBTSE9UX1NDUklQVCA9XG4gIFwiR2V0LUNpbUluc3RhbmNlIFdpbjMyX1Byb2Nlc3MgfCBGb3JFYWNoLU9iamVjdCB7ICd7MH0gezF9IHsyfScgLWYgJF8uUHJvY2Vzc0lkLCAkXy5QYXJlbnRQcm9jZXNzSWQsICRfLkNyZWF0aW9uRGF0ZS5Ub0ZpbGVUaW1lVXRjKCkgfVwiO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImNvcmU6ZXhlY1wiKTtcblxuLyoqIFN0ZGlvIG1vZGUgZm9yIGEgc3VicHJvY2VzcyBmZC4gKi9cbmV4cG9ydCB0eXBlIEV4ZWNTdGRpbyA9IFwiaW5oZXJpdFwiIHwgXCJwaXBlXCIgfCBcImlnbm9yZVwiO1xuXG4vKiogSW52b2tlZCBvbmNlIHBlciBvdXRwdXQgbGluZSB3aGVuIGEgZmQgaXMgcGlwZWQuICovXG5leHBvcnQgdHlwZSBMaW5lSGFuZGxlciA9IChsaW5lOiBzdHJpbmcpID0+IHZvaWQ7XG5cbi8qKiBTdHJlYW0gbGluZXMgdG8gYSBoYW5kbGVyIHdpdGggb3B0aW9uYWwgcmVzdWx0IGNhcHR1cmUuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmVPdXRwdXRPcHRpb25zIHtcbiAgLyoqIEludm9rZWQgb25jZSBwZXIgb3V0cHV0IGxpbmUuICovXG4gIG9uTGluZTogTGluZUhhbmRsZXI7XG4gIC8qKiBSZXRhaW4gbGluZXMgaW4gdGhlIGNvbXBsZXRlZCByZXN1bHQuIERlZmF1bHRzIHRvIGB0cnVlYC4gKi9cbiAgY2FwdHVyZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogU3RkaW8gY29uZmlnIGZvciBvbmUgZmQuXG4gKlxuICogLSBgXCJpbmhlcml0XCJgIC8gYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCDigJQgcGFzcyB0aHJvdWdoIHRvIGBzcGF3bmBcbiAqIC0gYFwiY2FwdHVyZVwiYCDigJQgcGlwZSB0aGUgZmQgYW5kIGFwcGVuZCBlYWNoIGxpbmUgdG8gdGhlIHJlc3VsdFxuICogLSB7QGxpbmsgTGluZUhhbmRsZXJ9IOKAlCBwaXBlIGFuZCBpbnZva2UgdGhlIGhhbmRsZXIgcGVyIGxpbmUgKGxpbmVzIGFyZSBzdGlsbCBjYXB0dXJlZClcbiAqIC0ge0BsaW5rIExpbmVPdXRwdXRPcHRpb25zfSDigJQgcGlwZSBhbmQgaW52b2tlIHRoZSBoYW5kbGVyLCB3aXRoIG9wdGlvbmFsIGNhcHR1cmVcbiAqIC0gYChMaW5lSGFuZGxlciB8IFwiY2FwdHVyZVwiKVtdYCDigJQgcGlwZTsgYFwiY2FwdHVyZVwiYCBpcyBhIG5vLW9wIG1hcmtlciwgaGFuZGxlcnMgcnVuIHBlciBsaW5lXG4gKi9cbmV4cG9ydCB0eXBlIFN0ZGlvT3B0aW9uID1cbiAgRXhlY1N0ZGlvIHwgTGluZUhhbmRsZXIgfCBMaW5lT3V0cHV0T3B0aW9ucyB8IFwiY2FwdHVyZVwiIHwgKExpbmVIYW5kbGVyIHwgXCJjYXB0dXJlXCIpW107XG5cbi8qKiBPdXRjb21lIG9mIHtAbGluayBzcGF3bn0gLyB7QGxpbmsgc3Bhd25TeW5jfTogZXhpdCBjb2RlLCBjYXB0dXJlZCBvdXRwdXQsIGFuZCBsaW5lIHZpZXdzLiAqL1xuZXhwb3J0IHR5cGUgRXhlY1Jlc3VsdCA9IHtcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZG91dCBsaW5lcy4gRm9yIHtAbGluayBzcGF3bn0gdGhlc2UgYXJlIGJ1aWx0IHdoaWxlIHRoZSBwcm9jZXNzIHJ1bnM7XG4gICAqIGZvciB7QGxpbmsgc3Bhd25TeW5jfSB0aGV5IGFyZSBzcGxpdCBmcm9tIHRoZSBjYXB0dXJlZCBzdHJpbmcgb24gZmlyc3QgcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZG91dExpbmVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZGVyciBsaW5lcy4gRm9yIHtAbGluayBzcGF3bn0gdGhlc2UgYXJlIGJ1aWx0IHdoaWxlIHRoZSBwcm9jZXNzIHJ1bnM7XG4gICAqIGZvciB7QGxpbmsgc3Bhd25TeW5jfSB0aGV5IGFyZSBzcGxpdCBmcm9tIHRoZSBjYXB0dXJlZCBzdHJpbmcgb24gZmlyc3QgcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZGVyckxpbmVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZG91dCB0ZXh0LiB7QGxpbmsgc3Bhd25TeW5jfSByZWFkcyB0aGUgY2FwdHVyZWQgc3RyaW5nO1xuICAgKiB7QGxpbmsgc3Bhd259IGpvaW5zIHtAbGluayBzdGRvdXRMaW5lc30uIFNlZSBgdHJpbWAgZm9yIG5vcm1hbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZGVyciB0ZXh0LiB7QGxpbmsgc3Bhd25TeW5jfSByZWFkcyB0aGUgY2FwdHVyZWQgc3RyaW5nO1xuICAgKiB7QGxpbmsgc3Bhd259IGpvaW5zIHtAbGluayBzdGRlcnJMaW5lc30uIFNlZSBgdHJpbWAgZm9yIG5vcm1hbGl6YXRpb24uXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbn07XG5cbi8qKlxuICogV2hhdCB7QGxpbmsgc3Bhd259IHJldHVybnM6IHRoZSBMSVZFIGBDaGlsZFByb2Nlc3NgIGhhbmRsZSB0aGF0IGlzIEFMU08gYVxuICogYFByb21pc2U8RXhlY1Jlc3VsdD5gIHJlc29sdmluZyBvbiBleGl0LlxuICpcbiAqIFRoaXMgaXMgYWRkaXRpdmUgLSB0aGUgb2JqZWN0IHN0aWxsIHNhdGlzZmllcyBgUHJvbWlzZTxFeGVjUmVzdWx0PmAsIHNvIGV2ZXJ5XG4gKiBleGlzdGluZyBgYXdhaXQgc3Bhd24oLi4uKWAgLyBgc3Bhd24oLi4uKS50aGVuKC4uLilgIGNhbGxlciBpcyB1bmNoYW5nZWQuIFdoYXRcbiAqIGlzIG5ldyBpcyB0aGF0IHRoZSBzYW1lIHZhbHVlIGlzIHRoZSBsaXZlIGNoaWxkOiBjYWxsZXJzIHRoYXQgd2FudCB0byBzdXBlcnZpc2VcbiAqIGl0IGNhbiByZWFkIGAucGlkYCwgY2FsbCBgLnNodXRkb3duKClgLCBhbmQgbGlzdGVuIGZvciBgZXhpdGAgd2l0aG91dCBhXG4gKiBzZWNvbmQgc3Bhd24uXG4gKlxuICogQGV4YW1wbGUgQXdhaXQgaXQgKHVuY2hhbmdlZClcbiAqIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bihcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCJIRUFEXCJdLCB7IHN0ZG91dDogXCJjYXB0dXJlXCIgfSk7XG4gKlxuICogQGV4YW1wbGUgU3VwZXJ2aXNlIGl0XG4gKiBjb25zdCBwcm9jID0gc3Bhd24oXCJidW5cIiwgW1wic3JjL3NlcnZlci50c1wiXSk7XG4gKiBjb25zdCBzaHV0ZG93biA9ICgpID0+IHByb2Muc2h1dGRvd24oKTtcbiAqIGNvbnN0IHsgZXhpdENvZGUgfSA9IGF3YWl0IHByb2M7XG4gKi9cbmV4cG9ydCB0eXBlIENoaWxkUHJvY2Vzc1Jlc3VsdCA9IENoaWxkUHJvY2VzcyAmXG4gIFByb21pc2U8RXhlY1Jlc3VsdD4gJiB7XG4gICAgLyoqIFN0b3AgdGhlIGNoaWxkIHByb2Nlc3MgdHJlZSBvbmNlIHVzaW5nIHRoZSBjb25maWd1cmVkIHRlcm1pbmF0aW9uIHBvbGljeS4gKi9cbiAgICBzaHV0ZG93bihvcHRpb25zPzogQ2hpbGRQcm9jZXNzVGVybWluYXRpb25PcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcbiAgfTtcblxuLyoqIFByb2Nlc3MtdHJlZSB0ZXJtaW5hdGlvbiBwb2xpY3kgdXNlZCBieSB7QGxpbmsgQ2hpbGRQcm9jZXNzUmVzdWx0LnNodXRkb3dufS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbGRQcm9jZXNzVGVybWluYXRpb25PcHRpb25zIHtcbiAgLyoqIFRpbWUgdG8gd2FpdCBmb3Igb3BlcmF0aW5nLXN5c3RlbSB0ZXJtaW5hdGlvbi4gRGVmYXVsdHMgdG8gOCBzZWNvbmRzLiAqL1xuICB0ZXJtaW5hdGVUaW1lb3V0PzogbnVtYmVyO1xuICAvKiogVGltZSB0byBwb2xsIGFuZCBmb3JjZS1raWxsIHJlbWFpbmluZyBkZXNjZW5kYW50cy4gRGVmYXVsdHMgdG8gNCBzZWNvbmRzLiAqL1xuICBraWxsVGltZW91dD86IG51bWJlcjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBzcGF3bn0uIEV4dGVuZHMgYFNwYXduT3B0aW9uc2AgZXhjZXB0IGBzdGRpb2AsIHdoaWNoIGlzIGRyaXZlbiBieSBgc3RkaW5gIC8gYHN0ZG91dGAgLyBgc3RkZXJyYC4gKi9cbmV4cG9ydCB0eXBlIEV4ZWNPcHRpb25zID0gT21pdDxTcGF3bk9wdGlvbnMsIFwic3RkaW9cIiB8IFwia2lsbFNpZ25hbFwiPiAmXG4gIENoaWxkUHJvY2Vzc1Rlcm1pbmF0aW9uT3B0aW9ucyAmIHtcbiAgICAvKiogYFwiaW5oZXJpdFwiYCBieSBkZWZhdWx0OyBgXCJwaXBlXCJgIC8gYFwiaWdub3JlXCJgIHNlbGVjdCBtb2RlcywgYW55IG90aGVyIHN0cmluZyBpcyBpbnB1dC4gKi9cbiAgICBzdGRpbj86IEV4ZWNTdGRpbyB8IHN0cmluZztcbiAgICBzdGRvdXQ/OiBTdGRpb09wdGlvbjtcbiAgICBzdGRlcnI/OiBTdGRpb09wdGlvbjtcbiAgICAvKipcbiAgICAgKiBGb3J3YXJkIHBhcmVudCB0ZXJtaW5hdGlvbiBzaWduYWxzIHRvIHRoaXMgY2hpbGQuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBza2lwIHRoZSBzaGFyZWQgc2lnbmFsIHRyYXA7IG9uIFBPU0lYLCB0aGUgY2hpbGQgaXMgYWxzb1xuICAgICAqIGRldGFjaGVkIGJ5IGRlZmF1bHQgc28gdGVybWluYWwgcHJvY2Vzcy1ncm91cCBzaWduYWxzIGFyZSBub3QgaW5oZXJpdGVkLlxuICAgICAqL1xuICAgIGZvcndhcmRUZXJtaW5hdGlvblNpZ25hbHM/OiBib29sZWFuO1xuICAgIC8qKiBUaHJvdyB3aGVuIHRoZSBwcm9jZXNzIGV4aXRzIHdpdGggYSBub24temVybyBjb2RlLiAqL1xuICAgIGNoZWNrPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBPbWl0dGVkIOKAlCBhZGFwdGl2ZSB0cmltICh7QGxpbmsgc3Bhd25TeW5jfSBkcm9wcyBvbmUgc3Bhd24gdHJhaWxpbmcgbmV3bGluZSxcbiAgICAgKiB7QGxpbmsgc3Bhd259IGRvZXMgbm90KTsgYHRydWVgIOKAlCBzdHJpcCBhbGwgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlO1xuICAgICAqIGBmYWxzZWAg4oCUIGxlYXZlIGNhcHR1cmVkIG91dHB1dCB1bmNoYW5nZWQuXG4gICAgICovXG4gICAgdHJpbT86IGJvb2xlYW47XG4gIH07XG5cbi8qKiBTdGRpbyBtb2RlIGZvciB7QGxpbmsgc3Bhd25TeW5jfSAobm8gcGVyLWxpbmUgY2FsbGJhY2tzKS4gKi9cbmV4cG9ydCB0eXBlIFN5bmNFeGVjU3RkaW8gPSBFeGVjU3RkaW8gfCBcImNhcHR1cmVcIjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBzcGF3blN5bmN9LiBTYW1lIHNoYXBlIGFzIHtAbGluayBFeGVjT3B0aW9uc30gYnV0IHdpdGhvdXQgbGluZS1oYW5kbGVyIHN0ZGlvLiAqL1xuZXhwb3J0IHR5cGUgU3luY0V4ZWNPcHRpb25zID0gT21pdDxTcGF3bk9wdGlvbnMsIFwic3RkaW9cIiB8IFwia2lsbFNpZ25hbFwiPiAmIHtcbiAgLyoqIGBcImluaGVyaXRcImAgYnkgZGVmYXVsdDsgYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCBzZWxlY3QgbW9kZXMsIGFueSBvdGhlciBzdHJpbmcgaXMgaW5wdXQuICovXG4gIHN0ZGluPzogRXhlY1N0ZGlvIHwgc3RyaW5nO1xuICBzdGRvdXQ/OiBTeW5jRXhlY1N0ZGlvO1xuICBzdGRlcnI/OiBTeW5jRXhlY1N0ZGlvO1xuICAvKiogVGhyb3cgd2hlbiB0aGUgcHJvY2VzcyBleGl0cyB3aXRoIGEgbm9uLXplcm8gY29kZS4gKi9cbiAgY2hlY2s/OiBib29sZWFuO1xuICAvKipcbiAgICogT21pdHRlZCDigJQgYWRhcHRpdmUgdHJpbSAoe0BsaW5rIHNwYXduU3luY30gZHJvcHMgb25lIHNwYXduIHRyYWlsaW5nIG5ld2xpbmUsXG4gICAqIHtAbGluayBzcGF3bn0gZG9lcyBub3QpOyBgdHJ1ZWAg4oCUIHN0cmlwIGFsbCBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2U7XG4gICAqIGBmYWxzZWAg4oCUIGxlYXZlIGNhcHR1cmVkIG91dHB1dCB1bmNoYW5nZWQuXG4gICAqL1xuICB0cmltPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd24gc3RkaW8gbW9kZSBwbHVzIGFuIG9wdGlvbmFsIHBlci1saW5lIGNhbGxiYWNrIGFmdGVyIHtAbGluayByZXNvbHZlU3RkaW99XG4gKiBtYXBzIGEge0BsaW5rIFN0ZGlvT3B0aW9ufSBpbnRvIHNvbWV0aGluZyBgc3Bhd25gIGNhbiBjb25zdW1lLlxuICovXG50eXBlIFJlc29sdmVkU3RkaW8gPSB7XG4gIC8qKiBWYWx1ZSBwYXNzZWQgdG8gYHNwYXduYCdzIGBzdGRpb2AgdHVwbGUgZm9yIHRoaXMgZmQuICovXG4gIG1vZGU6IEV4ZWNTdGRpbztcbiAgLyoqIFdoZW4gc2V0LCBlYWNoIG91dHB1dCBsaW5lIGlzIGFwcGVuZGVkIHRvIHRoZSBjYXB0dXJlIGJ1ZmZlciBhbmQgZm9yd2FyZGVkIGhlcmUuICovXG4gIG9uTGluZT86IExpbmVIYW5kbGVyO1xufTtcblxuLyoqIFN1cHBvcnRlZCBjb21tYW5kLCBhcmd1bWVudC1hcnJheSwgdmFyaWFkaWMtYXJndW1lbnQsIGFuZCBvcHRpb25zIGNhbGwgZm9ybXMuICovXG5leHBvcnQgdHlwZSBTcGF3bkFyZ3M8VCBleHRlbmRzIFNwYXduT3B0aW9ucz4gPVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdXVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdXVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBvcHRpb25zOiBUXVxuICB8IFtjb21tYW5kOiBzdHJpbmcsIC4uLmFyZ3NBbmRPcHRpb25zOiBbLi4uc3RyaW5nW10sIFRdXTtcblxuaW50ZXJmYWNlIFBhcnNlZFNwYXduQXJnczxUIGV4dGVuZHMgU3Bhd25PcHRpb25zPiB7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgY29tbWFuZEFyZ3M6IHN0cmluZ1tdO1xuICBvcHRpb25zPzogVDtcbn1cblxuLyoqIE9uZSBvcGVyYXRpbmctc3lzdGVtIHByb2Nlc3MgY2FwdHVyZWQgYmVmb3JlIHRyZWUgc2h1dGRvd24gYmVnaW5zLiAqL1xuaW50ZXJmYWNlIFByb2Nlc3NTbmFwc2hvdEVudHJ5IHtcbiAgcGlkOiBudW1iZXI7XG4gIHBhcmVudFBpZDogbnVtYmVyO1xuICBpZGVudGl0eTogc3RyaW5nO1xufVxuXG4vKiogQ3VycmVudCByZXRhaW5lZCBwcm9jZXNzZXMgcGx1cyBkZXNjZW5kYW50cyBmaXJzdCBvYnNlcnZlZCBieSBvbmUgcmVmcmVzaC4gKi9cbmludGVyZmFjZSBSZWZyZXNoZWRQcm9jZXNzVHJlZSB7XG4gIHByb2Nlc3NlczogUHJvY2Vzc1NuYXBzaG90RW50cnlbXTtcbiAgZGlzY292ZXJlZDogUHJvY2Vzc1NuYXBzaG90RW50cnlbXTtcbn1cblxuaW50ZXJmYWNlIFBhcmVudFNpZ25hbEZvcndhcmRlclN0YXRlIHtcbiAgcmVhZG9ubHkgY2hpbGRyZW46IE1hcDxudW1iZXIsIENoaWxkUHJvY2Vzc1Jlc3VsdD47XG4gIHJlYWRvbmx5IGhhbmRsZXJzOiBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+O1xuICByZWFkb25seSBmb3J3YXJkaW5nU2lnbmFsczogU2V0PE5vZGVKUy5TaWduYWxzPjtcbiAgcmVhZG9ubHkgbGlzdGVuZXJzOiBTZXQ8KHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpID0+IHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgU2lnbmFsRXhpdEVtaXR0ZXIge1xuICBjb3VudD86IHVua25vd247XG59XG5cbmludGVyZmFjZSBQcm9jZXNzV2l0aFNpZ25hbEV4aXRFbWl0dGVyIGV4dGVuZHMgTm9kZUpTLlByb2Nlc3Mge1xuICBfX3NpZ25hbF9leGl0X2VtaXR0ZXJfXz86IFNpZ25hbEV4aXRFbWl0dGVyO1xufVxuXG50eXBlIFBhcmVudFNpZ25hbFNodXRkb3duID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpID0+IFByb21pc2U8dm9pZD47XG5cbmNvbnN0IHBhcmVudFNpZ25hbEZvcndhcmRlclN0YXRlID0gbWVtb2l6ZSgoKTogUGFyZW50U2lnbmFsRm9yd2FyZGVyU3RhdGUgPT4gKHtcbiAgY2hpbGRyZW46IG5ldyBNYXAoKSxcbiAgaGFuZGxlcnM6IG5ldyBNYXAoKSxcbiAgZm9yd2FyZGluZ1NpZ25hbHM6IG5ldyBTZXQoKSxcbiAgbGlzdGVuZXJzOiBuZXcgU2V0KCksXG59KSk7XG5jb25zdCBwYXJlbnRTaWduYWxTaHV0ZG93bnMgPSBuZXcgV2Vha01hcDxDaGlsZFByb2Nlc3NSZXN1bHQsIFBhcmVudFNpZ25hbFNodXRkb3duPigpO1xuXG5mdW5jdGlvbiByZWdpc3RlclBhcmVudFNpZ25hbEZvcndhcmRpbmcoY2hpbGQ6IENoaWxkUHJvY2Vzc1Jlc3VsdCk6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBpZCA9IGNoaWxkLnBpZDtcbiAgaWYgKHBpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0ZSA9IHBhcmVudFNpZ25hbEZvcndhcmRlclN0YXRlKCk7XG4gIGluc3RhbGxQYXJlbnRTaWduYWxIYW5kbGVycyhzdGF0ZSk7XG4gIHN0YXRlLmNoaWxkcmVuLnNldChwaWQsIGNoaWxkKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoc3RhdGUuY2hpbGRyZW4uZ2V0KHBpZCkgPT09IGNoaWxkKSBzdGF0ZS5jaGlsZHJlbi5kZWxldGUocGlkKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaW5zdGFsbFBhcmVudFNpZ25hbEhhbmRsZXJzKHN0YXRlOiBQYXJlbnRTaWduYWxGb3J3YXJkZXJTdGF0ZSk6IHZvaWQge1xuICBpZiAoc3RhdGUuaGFuZGxlcnMuc2l6ZSA+IDApIHJldHVybjtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgRk9SV0FSREVEX1BBUkVOVF9TSUdOQUxTKSB7XG4gICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvcndhcmRQYXJlbnRTaWduYWwoc3RhdGUsIHNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXBvcnRQYXJlbnRTaWduYWxFcnJvcihzaWduYWwsIHVuZGVmaW5lZCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgc3RhdGUuaGFuZGxlcnMuc2V0KHNpZ25hbCwgaGFuZGxlcik7XG4gICAgcHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIoc2lnbmFsLCBoYW5kbGVyKTtcbiAgfVxufVxuXG4vKipcbiAqIFN1YnNjcmliZSB0byB0aGUgcHJvY2Vzcy1nbG9iYWwgcGFyZW50LXRlcm1pbmF0aW9uIHRyYXAgdXNlZCBieSB7QGxpbmsgc3Bhd259LlxuICogRG9lcyBub3QgYWRkIGEgcGVyLXN1YnNjcmliZXIgYHByb2Nlc3NgIGxpc3RlbmVyOyBleHRyYSBsaXN0ZW5lcnMgd291bGQgY2hhbmdlXG4gKiB3aGV0aGVyIHRoZSB0cmFwIHJlLXJhaXNlcyB0aGUgc2lnbmFsIGFmdGVyIGNoaWxkcmVuIGV4aXQuXG4gKlxuICogQHBhcmFtIGxpc3RlbmVyIC0gQ2FsbGVkIHN5bmNocm9ub3VzbHkgd2hlbiBhIGZvcndhcmRlZCBwYXJlbnQgc2lnbmFsIGFycml2ZXNcbiAqIEByZXR1cm5zIFVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvblBhcmVudFRlcm1pbmF0aW9uU2lnbmFsKGxpc3RlbmVyOiAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscykgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICBjb25zdCBzdGF0ZSA9IHBhcmVudFNpZ25hbEZvcndhcmRlclN0YXRlKCk7XG4gIGluc3RhbGxQYXJlbnRTaWduYWxIYW5kbGVycyhzdGF0ZSk7XG4gIHN0YXRlLmxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIHN0YXRlLmxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBmb3J3YXJkUGFyZW50U2lnbmFsKHN0YXRlOiBQYXJlbnRTaWduYWxGb3J3YXJkZXJTdGF0ZSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQge1xuICBpZiAoc3RhdGUuZm9yd2FyZGluZ1NpZ25hbHMuaGFzKHNpZ25hbCkpIHJldHVybjtcbiAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBzdGF0ZS5saXN0ZW5lcnMpIHtcbiAgICB0cnkge1xuICAgICAgbGlzdGVuZXIoc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVwb3J0UGFyZW50U2lnbmFsRXJyb3Ioc2lnbmFsLCB1bmRlZmluZWQsIGVycm9yKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2h1dGRvd25zOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgZm9yIChjb25zdCBbcGlkLCBjaGlsZF0gb2Ygc3RhdGUuY2hpbGRyZW4pIHtcbiAgICBpZiAoY2hpbGQuZXhpdENvZGUgIT09IG51bGwgfHwgY2hpbGQuc2lnbmFsQ29kZSAhPT0gbnVsbCkge1xuICAgICAgc3RhdGUuY2hpbGRyZW4uZGVsZXRlKHBpZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgc2h1dGRvd25zLnB1c2goc2h1dGRvd25DaGlsZEZvclBhcmVudFNpZ25hbChjaGlsZCwgcGlkLCBzaWduYWwpKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZXIgPSBzdGF0ZS5oYW5kbGVycy5nZXQoc2lnbmFsKTtcbiAgY29uc3QgY29tcGxldGVkID0gUHJvbWlzZS5hbGwoc2h1dGRvd25zKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICByZXBvcnRQYXJlbnRTaWduYWxFcnJvcihzaWduYWwsIHVuZGVmaW5lZCwgZXJyb3IpO1xuICB9KTtcbiAgaWYgKCFoYW5kbGVyIHx8IHByb2Nlc3MubGlzdGVuZXJDb3VudChzaWduYWwpICE9PSBwYXNzaXZlU2lnbmFsTGlzdGVuZXJDb3VudCgpICsgMSkge1xuICAgIHZvaWQgY29tcGxldGVkO1xuICAgIHJldHVybjtcbiAgfVxuICBzdGF0ZS5mb3J3YXJkaW5nU2lnbmFscy5hZGQoc2lnbmFsKTtcbiAgdm9pZCBjb21wbGV0ZWRcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICBwcm9jZXNzLm9mZihzaWduYWwsIGhhbmRsZXIpO1xuICAgICAgc3RhdGUuaGFuZGxlcnMuZGVsZXRlKHNpZ25hbCk7XG4gICAgICBzdGF0ZS5mb3J3YXJkaW5nU2lnbmFscy5kZWxldGUoc2lnbmFsKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlcG9ydFBhcmVudFNpZ25hbEVycm9yKHNpZ25hbCwgcHJvY2Vzcy5waWQsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHJlcG9ydFBhcmVudFNpZ25hbEVycm9yKHNpZ25hbCwgdW5kZWZpbmVkLCBlcnJvcik7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHNodXRkb3duQ2hpbGRGb3JQYXJlbnRTaWduYWwoXG4gIGNoaWxkOiBDaGlsZFByb2Nlc3NSZXN1bHQsXG4gIHBpZDogbnVtYmVyLFxuICBzaWduYWw6IE5vZGVKUy5TaWduYWxzLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2h1dGRvd24gPSBwYXJlbnRTaWduYWxTaHV0ZG93bnMuZ2V0KGNoaWxkKTtcbiAgICByZXR1cm4gKHNodXRkb3duID8gc2h1dGRvd24oc2lnbmFsKSA6IGNoaWxkLnNodXRkb3duKCkpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgcmVwb3J0UGFyZW50U2lnbmFsRXJyb3Ioc2lnbmFsLCBwaWQsIGVycm9yKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXBvcnRQYXJlbnRTaWduYWxFcnJvcihzaWduYWwsIHBpZCwgZXJyb3IpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBvcnRQYXJlbnRTaWduYWxFcnJvcihcbiAgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyxcbiAgcGlkOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGVycm9yOiB1bmtub3duLFxuKTogdm9pZCB7XG4gIGlmIChpc0V4cGVjdGVkUHJvY2Vzc1NodXRkb3duRXJyb3IoZXJyb3IpKSByZXR1cm47XG4gIHRyeSB7XG4gICAgbG9nZ2VyLndhcm4oXCJmYWlsZWQgdG8gZm9yd2FyZCBwYXJlbnQgc2lnbmFsXCIsIHtcbiAgICAgIHNpZ25hbCxcbiAgICAgIC4uLihwaWQgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBwaWQgfSksXG4gICAgICBlcnJvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gU2lnbmFsIGZvcndhcmRpbmcgbXVzdCBuZXZlciBwcmV2ZW50IG90aGVyIHByb2Nlc3MgbGlzdGVuZXJzIGZyb20gcnVubmluZy5cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0V4cGVjdGVkUHJvY2Vzc1NodXRkb3duRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzTWlzc2luZ1Byb2Nlc3NFcnJvcihlcnJvcikpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvciAmJiBlcnJvci5lcnJvcnMuZXZlcnkoaXNFeHBlY3RlZFByb2Nlc3NTaHV0ZG93bkVycm9yKTtcbn1cblxuZnVuY3Rpb24gcGFzc2l2ZVNpZ25hbExpc3RlbmVyQ291bnQoKTogbnVtYmVyIHtcbiAgY29uc3QgbGVnYWN5RW1pdHRlciA9IChwcm9jZXNzIGFzIFByb2Nlc3NXaXRoU2lnbmFsRXhpdEVtaXR0ZXIpLl9fc2lnbmFsX2V4aXRfZW1pdHRlcl9fO1xuICBjb25zdCBtb2Rlcm5FbWl0dGVyID0gKGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbXG4gICAgU3ltYm9sLmZvcihcInNpZ25hbC1leGl0IGVtaXR0ZXJcIilcbiAgXSBhcyBTaWduYWxFeGl0RW1pdHRlciB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHNpZ25hbEV4aXRFbWl0dGVyQ291bnQobGVnYWN5RW1pdHRlcikgKyBzaWduYWxFeGl0RW1pdHRlckNvdW50KG1vZGVybkVtaXR0ZXIpO1xufVxuXG5mdW5jdGlvbiBzaWduYWxFeGl0RW1pdHRlckNvdW50KGVtaXR0ZXI6IFNpZ25hbEV4aXRFbWl0dGVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgcmV0dXJuIHR5cGVvZiBlbWl0dGVyPy5jb3VudCA9PT0gXCJudW1iZXJcIiA/IGVtaXR0ZXIuY291bnQgOiAwO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGV0YWNoZWQoXG4gIGRldGFjaGVkOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBmb3J3YXJkVGVybWluYXRpb25TaWduYWxzOiBib29sZWFuLFxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChkZXRhY2hlZCAhPT0gdW5kZWZpbmVkIHx8IGZvcndhcmRUZXJtaW5hdGlvblNpZ25hbHMgfHwgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiKSB7XG4gICAgcmV0dXJuIGRldGFjaGVkO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBwYXJzZVNwYXduQXJnczxUIGV4dGVuZHMgU3Bhd25PcHRpb25zPihpbnB1dDogU3Bhd25BcmdzPFQ+KTogUGFyc2VkU3Bhd25BcmdzPFQ+IHtcbiAgbGV0IFt2YWx1ZSwgLi4udmFsdWVzXSA9IGlucHV0O1xuXG4gIGNvbnN0IGxhc3QgPSB2YWx1ZXMuYXQoLTEpO1xuICBjb25zdCBvcHRpb25zID1cbiAgICBsYXN0ICE9PSBudWxsICYmIHR5cGVvZiBsYXN0ID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGxhc3QpID8gbGFzdCA6IHVuZGVmaW5lZDtcbiAgY29uc3QgYXJndW1lbnRWYWx1ZXMgPSBvcHRpb25zID8gdmFsdWVzLnNsaWNlKDAsIC0xKSA6IHZhbHVlcztcbiAgLy8gT25seSB0aGUgb25lLXN0cmluZyBmb3JtIGlzIHNoZWxsLWxpa2UuIEV4cGxpY2l0IGFyZ3VtZW50cyBtYWtlIHRoZSBjb21tYW5kIGFuIGV4YWN0IGV4ZWN1dGFibGUuXG4gIGNvbnN0IFtjb21tYW5kLCAuLi5jb21tYW5kQXJnc10gPSBhcmd1bWVudFZhbHVlcy5sZW5ndGggPT09IDAgPyBzaGxleCh2YWx1ZSEpIDogW3ZhbHVlIV07XG4gIGNvbnN0IHZhbHVlQXJnczogc3RyaW5nW10gPVxuICAgIGFyZ3VtZW50VmFsdWVzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3VtZW50VmFsdWVzWzBdKVxuICAgICAgPyBbLi4uYXJndW1lbnRWYWx1ZXNbMF1dXG4gICAgICA6IGFyZ3VtZW50VmFsdWVzO1xuXG4gIHJldHVybiB7XG4gICAgY29tbWFuZDogY29tbWFuZCEsXG4gICAgY29tbWFuZEFyZ3M6IFsuLi5jb21tYW5kQXJncywgLi4udmFsdWVBcmdzXSxcbiAgICBvcHRpb25zOiBvcHRpb25zIGFzIFQsXG4gIH07XG59XG5cbi8qKlxuICogRHJvcCB0aGUgc2luZ2xlIHRyYWlsaW5nIGVtcHR5IGVudHJ5IGBzcGF3blN5bmNgIGFkZHMgd2hlbiBzcGxpdHRpbmcgb24gYSBmaW5hbFxuICogbmV3bGluZSAoYFwiaGlcXG5cImAgLT4gYFtcImhpXCIsIFwiXCJdYCkuIERvZXMgbm90IHJlbW92ZSBtdWx0aXBsZSB0cmFpbGluZyBlbXB0aWVzLlxuICovXG5mdW5jdGlvbiB3aXRob3V0U3Bhd25UcmFpbGluZ0VtcHR5TGluZShsaW5lczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGlmIChsaW5lcy5sZW5ndGggPiAwICYmIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGxpbmVzLnNsaWNlKDAsIC0xKTtcbiAgfVxuICByZXR1cm4gbGluZXMgYXMgc3RyaW5nW107XG59XG5cbi8qKiBSZW1vdmUgYXQgbW9zdCBvbmUgdHJhaWxpbmcgbmV3bGluZSBmcm9tIGNhcHR1cmVkIHNwYXduIHN0ZG91dC9zdGRlcnIgdGV4dC4gKi9cbmZ1bmN0aW9uIHRyaW1TaW5nbGVUcmFpbGluZ05ld2xpbmUodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHRleHQuZW5kc1dpdGgoXCJcXHJcXG5cIikpIHJldHVybiB0ZXh0LnNsaWNlKDAsIC0yKTtcbiAgaWYgKHRleHQuZW5kc1dpdGgoXCJcXG5cIikpIHJldHVybiB0ZXh0LnNsaWNlKDAsIC0xKTtcbiAgcmV0dXJuIHRleHQ7XG59XG5cbi8qKiBMaW5lLWFycmF5IHZpZXcgb2YgYXN5bmMtY2FwdHVyZWQgb3V0cHV0LiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplZEFzeW5jTGluZXMobGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuICBpZiAodHJpbSA9PT0gdHJ1ZSkgcmV0dXJuIGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KGxpbmVzLmpvaW4oXCJcXG5cIikudHJpbSgpKTtcbiAgcmV0dXJuIGxpbmVzIGFzIHN0cmluZ1tdO1xufVxuXG4vKiogSm9pbiBhc3luYy1jYXB0dXJlZCBsaW5lcyBpbnRvIHN0ZG91dC9zdGRlcnIgdGV4dC4gKi9cbmZ1bmN0aW9uIGZvcm1hdEFzeW5jQ2FwdHVyZWRMaW5lcyhsaW5lczogcmVhZG9ubHkgc3RyaW5nW10sIHRyaW06IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCBqb2luZWQgPSBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICByZXR1cm4gdHJpbSA9PT0gdHJ1ZSA/IGpvaW5lZC50cmltKCkgOiBqb2luZWQ7XG59XG5cbi8qKiBMaW5lLWFycmF5IHZpZXcgb2Ygc3luYy1jYXB0dXJlZCBvdXRwdXQuICovXG5mdW5jdGlvbiBub3JtYWxpemVkU3luY0xpbmVzKGxpbmVzOiByZWFkb25seSBzdHJpbmdbXSwgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgaWYgKHRyaW0gPT09IGZhbHNlKSByZXR1cm4gbGluZXMgYXMgc3RyaW5nW107XG4gIGlmICh0cmltID09PSB0cnVlKSByZXR1cm4gbGluZXNGcm9tQ2FwdHVyZWRPdXRwdXQobGluZXMuam9pbihcIlxcblwiKS50cmltKCkpO1xuICByZXR1cm4gd2l0aG91dFNwYXduVHJhaWxpbmdFbXB0eUxpbmUobGluZXMpO1xufVxuXG4vKiogRm9ybWF0IHN5bmMtY2FwdHVyZWQgc3Rkb3V0L3N0ZGVyciB0ZXh0LiAqL1xuZnVuY3Rpb24gZm9ybWF0U3luY0NhcHR1cmVkVGV4dChcbiAgdGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRleHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHRyaW0gPT09IGZhbHNlKSByZXR1cm4gdGV4dDtcbiAgaWYgKHRyaW0gPT09IHRydWUpIHJldHVybiB0ZXh0LnRyaW0oKTtcbiAgcmV0dXJuIHRyaW1TaW5nbGVUcmFpbGluZ05ld2xpbmUodGV4dCk7XG59XG5cbi8qKlxuICogSHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIGEgc3Bhd25lZCBjb21tYW5kLCB1c2VkIGluIGVycm9yIG1lc3NhZ2VzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSBuYW1lIG9yIHBhdGhcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZXhlY3V0YWJsZVxuICogQHJldHVybnMgQmFja3RpY2std3JhcHBlZCBgY29tbWFuZCBhcmcxIGFyZzIgLi4uYCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gY29tbWFuZExhYmVsKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYFxcYCR7Y29tbWFuZH0gJHthcmdzLmpvaW4oXCIgXCIpfVxcYGA7XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciBOb2RlIGZhaWxlZCB0byBzcGF3biBiZWNhdXNlIHRoZSBleGVjdXRhYmxlIHdhcyBub3QgZm91bmQuICovXG5mdW5jdGlvbiBpc0NvbW1hbmROb3RGb3VuZEVycm9yKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gXCJFTk9FTlRcIjtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIGEgcHJvY2VzcyBvcGVyYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIFBJRCBubyBsb25nZXIgZXhpc3RzLiAqL1xuZnVuY3Rpb24gaXNNaXNzaW5nUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gXCJFU1JDSFwiO1xufVxuXG4vKiogVmFsaWRhdGUgYSBmaW5pdGUgbm9uLW5lZ2F0aXZlIHRpbWVvdXQuICovXG5mdW5jdGlvbiB0aW1lb3V0VmFsdWUodmFsdWU6IG51bWJlciwgbmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGAke25hbWV9IG11c3QgYmUgYSBmaW5pdGUgbm9uLW5lZ2F0aXZlIG51bWJlcmApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqIFJlamVjdCBjYWxsZXItc2VsZWN0ZWQgc2lnbmFscyBzbyBwbGF0Zm9ybSBzaHV0ZG93biBwb2xpY3kgc3RheXMgaW50ZXJuYWwuICovXG5mdW5jdGlvbiByZWplY3RTaWduYWxPcHRpb25zKG9wdGlvbnM6IG9iamVjdCk6IHZvaWQge1xuICBjb25zdCB1bnN1cHBvcnRlZCA9IG9wdGlvbnMgYXMgeyB0ZXJtaW5hdGVTaWduYWw/OiB1bmtub3duOyBraWxsU2lnbmFsPzogdW5rbm93biB9O1xuICBpZiAodW5zdXBwb3J0ZWQudGVybWluYXRlU2lnbmFsID09PSB1bmRlZmluZWQgJiYgdW5zdXBwb3J0ZWQua2lsbFNpZ25hbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgXCJQcm9jZXNzIHNpZ25hbHMgYXJlIHNlbGVjdGVkIGludGVybmFsbHk7IGNvbmZpZ3VyZSB0ZXJtaW5hdGVUaW1lb3V0IGFuZCBraWxsVGltZW91dCBpbnN0ZWFkXCIsXG4gICk7XG59XG5cbi8qKiBQYXJzZSB0aGUgY29tbW9uIGBwaWQgcGFyZW50UGlkIGlkZW50aXR5YCBwcm9jZXNzLXNuYXBzaG90IGZvcm1hdC4gKi9cbmZ1bmN0aW9uIHBhcnNlUHJvY2Vzc1NuYXBzaG90KGxpbmVzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10ge1xuICBjb25zdCBzbmFwc2hvdDogUHJvY2Vzc1NuYXBzaG90RW50cnlbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCBtYXRjaCA9IC9eXFxzKihcXGQrKVxccysoXFxkKykoPzpcXHMrKC4rPykpP1xccyokLy5leGVjKGxpbmUpO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gbWF0Y2g/LlszXT8udHJpbSgpO1xuICAgIGlmICghbWF0Y2ggfHwgIWlkZW50aXR5KSBjb250aW51ZTtcbiAgICBzbmFwc2hvdC5wdXNoKHtcbiAgICAgIHBpZDogTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdISwgMTApLFxuICAgICAgcGFyZW50UGlkOiBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMl0hLCAxMCksXG4gICAgICBpZGVudGl0eSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gc25hcHNob3Q7XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciBhIGAvcHJvY2AgcmVjb3JkIGRpc2FwcGVhcmVkIG9yIGlzIGluYWNjZXNzaWJsZSBkdXJpbmcgYSBzbmFwc2hvdC4gKi9cbmZ1bmN0aW9uIGlzVW5hdmFpbGFibGVQcm9jUmVjb3JkKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgfHwgIShcImNvZGVcIiBpbiBlcnJvcikpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIgfHwgZXJyb3IuY29kZSA9PT0gXCJFQUNDRVNcIiB8fCBlcnJvci5jb2RlID09PSBcIkVQRVJNXCI7XG59XG5cbi8qKiBQYXJzZSBMaW51eCBgL3Byb2MvPHBpZD4vc3RhdGAgcGFyZW50IFBJRCBhbmQgZXhhY3QgcHJvY2Vzcy1zdGFydCB0aWNrcy4gKi9cbmZ1bmN0aW9uIHBhcnNlTGludXhQcm9jZXNzU3RhdChwaWQ6IG51bWJlciwgc3RhdDogc3RyaW5nKTogUHJvY2Vzc1NuYXBzaG90RW50cnkgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb21tYW5kRW5kID0gc3RhdC5sYXN0SW5kZXhPZihcIilcIik7XG4gIGlmIChjb21tYW5kRW5kIDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZmllbGRzID0gc3RhdFxuICAgIC5zbGljZShjb21tYW5kRW5kICsgMSlcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KC9cXHMrLyk7XG4gIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlci5wYXJzZUludChmaWVsZHNbMV0hLCAxMCk7XG4gIGNvbnN0IHN0YXJ0VGlja3MgPSBmaWVsZHNbMTldO1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHBhcmVudFBpZCkgfHwgIXN0YXJ0VGlja3MpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7IHBpZCwgcGFyZW50UGlkLCBpZGVudGl0eTogc3RhcnRUaWNrcyB9O1xufVxuXG4vKiogQ2FwdHVyZSBMaW51eCBwcm9jZXNzIGlkZW50aXRpZXMgZnJvbSBgL3Byb2NgIHdpdGhvdXQgc2Vjb25kLWxldmVsIHRydW5jYXRpb24uICovXG5hc3luYyBmdW5jdGlvbiBsaW51eFByb2Nlc3NTbmFwc2hvdCgpOiBQcm9taXNlPFByb2Nlc3NTbmFwc2hvdEVudHJ5W10+IHtcbiAgY29uc3QgZGlyZWN0b3JpZXMgPSBhd2FpdCByZWFkZGlyKFwiL3Byb2NcIiwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgZGlyZWN0b3JpZXNcbiAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0RpcmVjdG9yeSgpICYmIC9eXFxkKyQvLnRlc3QoZW50cnkubmFtZSkpXG4gICAgICAubWFwKGFzeW5jIChlbnRyeSk6IFByb21pc2U8UHJvY2Vzc1NuYXBzaG90RW50cnkgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgICAgY29uc3QgcGlkID0gTnVtYmVyLnBhcnNlSW50KGVudHJ5Lm5hbWUsIDEwKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VMaW51eFByb2Nlc3NTdGF0KHBpZCwgYXdhaXQgcmVhZEZpbGUoYC9wcm9jLyR7ZW50cnkubmFtZX0vc3RhdGAsIFwidXRmOFwiKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGlzVW5hdmFpbGFibGVQcm9jUmVjb3JkKGVycm9yKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICk7XG4gIHJldHVybiBlbnRyaWVzLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBQcm9jZXNzU25hcHNob3RFbnRyeSA9PiBlbnRyeSAhPT0gdW5kZWZpbmVkKTtcbn1cblxuLyoqXG4gKiBDYXB0dXJlIHRoZSBjdXJyZW50IFBJRCwgcGFyZW50IFBJRCwgYW5kIHByb2Nlc3Mtc3RhcnQgaWRlbnRpdHkgdGFibGUuXG4gKlxuICogTGludXggcmVhZHMgZXhhY3Qgc3RhcnQgdGlja3MgZnJvbSBgL3Byb2NgLiBXaW5kb3dzIHVzZXMgdGhlIGJ1aWx0LWluXG4gKiBQb3dlclNoZWxsIENJTSBwcm92aWRlci4gbWFjT1MgYW5kIG90aGVyIFBPU0lYIHBsYXRmb3JtcyBjb21iaW5lIGBwc2BcbiAqIHByb2Nlc3Mgc3RhcnQgdGltZSBhbmQgZXhlY3V0YWJsZSBuYW1lLiBUaGUgaGVscGVyIHByb2Nlc3MgaXMgZGV0YWNoZWQgc28gYVxuICogdGVybWluYWwgU0lHSU5UIHRvIHRoaXMgcHJvY2VzcyBncm91cCBjYW5ub3QgYWJvcnQgdGhlIHNuYXBzaG90LlxuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzU25hcHNob3QoKTogUHJvbWlzZTxQcm9jZXNzU25hcHNob3RFbnRyeVtdPiB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImxpbnV4XCIpIHJldHVybiBsaW51eFByb2Nlc3NTbmFwc2hvdCgpO1xuXG4gIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBcInBvd2Vyc2hlbGwuZXhlXCIgOiBcInBzXCI7XG4gIGNvbnN0IGFyZ3MgPVxuICAgIHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIlxuICAgICAgPyBbXCItTm9Mb2dvXCIsIFwiLU5vUHJvZmlsZVwiLCBcIi1Ob25JbnRlcmFjdGl2ZVwiLCBcIi1Db21tYW5kXCIsIFdJTkRPV1NfUFJPQ0VTU19TTkFQU0hPVF9TQ1JJUFRdXG4gICAgICA6IFtcIi1BXCIsIFwiLW9cIiwgXCJwaWQ9XCIsIFwiLW9cIiwgXCJwcGlkPVwiLCBcIi1vXCIsIFwibHN0YXJ0PVwiLCBcIi1vXCIsIFwiY29tbT1cIl07XG4gIGNvbnN0IHByb2MgPSBub2RlU3Bhd24oY29tbWFuZCwgYXJncywge1xuICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICB3aW5kb3dzSGlkZTogdHJ1ZSxcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgfSk7XG4gIGNvbnN0IHN0ZG91dCA9IHRleHQocHJvYy5zdGRvdXQhKTtcbiAgY29uc3Qgc3RkZXJyID0gdGV4dChwcm9jLnN0ZGVyciEpO1xuICBjb25zdCBbZXhpdENvZGUsIHN0ZG91dFRleHQsIHN0ZGVyclRleHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3dhaXRGb3JFeGl0KHByb2MpLCBzdGRvdXQsIHN0ZGVycl0pO1xuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtjb21tYW5kTGFiZWwoY29tbWFuZCwgYXJncyl9IGZhaWxlZCAoZXhpdCAke2V4aXRDb2RlfSkke1xuICAgICAgICBzdGRlcnJUZXh0ID8gYDogJHtzdGRlcnJUZXh0LnRyaW0oKX1gIDogXCJcIlxuICAgICAgfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VQcm9jZXNzU25hcHNob3QobGluZXNGcm9tQ2FwdHVyZWRPdXRwdXQoc3Rkb3V0VGV4dCkpO1xufVxuXG4vKiogUmVhZCBhIHByb2Nlc3Mgc25hcHNob3QsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHByb2Nlc3MgdGFibGUgY2Fubm90IGJlIGxpc3RlZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRyeVByb2Nlc3NTbmFwc2hvdCgpOiBQcm9taXNlPFByb2Nlc3NTbmFwc2hvdEVudHJ5W10gfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcHJvY2Vzc1NuYXBzaG90KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicHJvY2VzcyBzbmFwc2hvdCBmYWlsZWRcIiwgeyBlcnJvcjogdG9FcnJvcihlcnJvcikgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogR3JvdXAgYSBwcm9jZXNzIHNuYXBzaG90IGJ5IHBhcmVudCBQSUQuICovXG5mdW5jdGlvbiBwcm9jZXNzQ2hpbGRyZW4oXG4gIHNuYXBzaG90OiByZWFkb25seSBQcm9jZXNzU25hcHNob3RFbnRyeVtdLFxuKTogTWFwPG51bWJlciwgUHJvY2Vzc1NuYXBzaG90RW50cnlbXT4ge1xuICBjb25zdCBjaGlsZHJlbiA9IG5ldyBNYXA8bnVtYmVyLCBQcm9jZXNzU25hcHNob3RFbnRyeVtdPigpO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNuYXBzaG90KSB7XG4gICAgY29uc3Qgc2libGluZ3MgPSBjaGlsZHJlbi5nZXQoZW50cnkucGFyZW50UGlkKSA/PyBbXTtcbiAgICBzaWJsaW5ncy5wdXNoKGVudHJ5KTtcbiAgICBjaGlsZHJlbi5zZXQoZW50cnkucGFyZW50UGlkLCBzaWJsaW5ncyk7XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG4vKiogU2VsZWN0IG9uZSBzbmFwc2hvdHRlZCBwcm9jZXNzIHRyZWUgaW4gZGVzY2VuZGFudC1maXJzdCBzaWduYWwgb3JkZXIuICovXG5mdW5jdGlvbiBwcm9jZXNzVHJlZShcbiAgc25hcHNob3Q6IHJlYWRvbmx5IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10sXG4gIHJvb3RQaWQ6IG51bWJlcixcbik6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10ge1xuICBjb25zdCByb290ID0gc25hcHNob3QuZmluZCgoZW50cnkpID0+IGVudHJ5LnBpZCA9PT0gcm9vdFBpZCk7XG4gIGlmICghcm9vdCkgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gaWRlbnRpZnkgY2hpbGQgcHJvY2VzcyAke3Jvb3RQaWR9YCk7XG5cbiAgY29uc3QgY2hpbGRyZW4gPSBwcm9jZXNzQ2hpbGRyZW4oc25hcHNob3QpO1xuICBjb25zdCB0cmVlOiBQcm9jZXNzU25hcHNob3RFbnRyeVtdID0gW107XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PG51bWJlcj4oW3Jvb3RQaWRdKTtcbiAgY29uc3QgYXBwZW5kRGVzY2VuZGFudHMgPSAocGFyZW50UGlkOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuLmdldChwYXJlbnRQaWQpID8/IFtdKSB7XG4gICAgICBpZiAodmlzaXRlZC5oYXMoY2hpbGQucGlkKSkgY29udGludWU7XG4gICAgICB2aXNpdGVkLmFkZChjaGlsZC5waWQpO1xuICAgICAgYXBwZW5kRGVzY2VuZGFudHMoY2hpbGQucGlkKTtcbiAgICAgIHRyZWUucHVzaChjaGlsZCk7XG4gICAgfVxuICB9O1xuICBhcHBlbmREZXNjZW5kYW50cyhyb290UGlkKTtcbiAgdHJlZS5wdXNoKHJvb3QpO1xuICByZXR1cm4gdHJlZTtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIHR3byBzbmFwc2hvdHMgaWRlbnRpZnkgdGhlIHNhbWUgcHJvY2VzcyBsaWZldGltZS4gKi9cbmZ1bmN0aW9uIHNhbWVQcm9jZXNzKHByZXZpb3VzOiBQcm9jZXNzU25hcHNob3RFbnRyeSwgY3VycmVudDogUHJvY2Vzc1NuYXBzaG90RW50cnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByZXZpb3VzLmlkZW50aXR5ID09PSBjdXJyZW50LmlkZW50aXR5O1xufVxuXG4vKipcbiAqIFJlZnJlc2ggcmV0YWluZWQgcHJvY2VzcyBpZGVudGl0aWVzIGFuZCBtZXJnZSBkZXNjZW5kYW50cyBjcmVhdGVkIGFmdGVyIHRoZVxuICogaW5pdGlhbCBzbmFwc2hvdC5cbiAqL1xuZnVuY3Rpb24gcmVmcmVzaFByb2Nlc3NUcmVlKFxuICByZXRhaW5lZDogTWFwPG51bWJlciwgUHJvY2Vzc1NuYXBzaG90RW50cnk+LFxuICBzbmFwc2hvdDogcmVhZG9ubHkgUHJvY2Vzc1NuYXBzaG90RW50cnlbXSxcbik6IFJlZnJlc2hlZFByb2Nlc3NUcmVlIHtcbiAgY29uc3QgY3VycmVudEJ5UGlkID0gbmV3IE1hcChzbmFwc2hvdC5tYXAoKGVudHJ5KSA9PiBbZW50cnkucGlkLCBlbnRyeV0pKTtcbiAgY29uc3QgY2hpbGRyZW4gPSBwcm9jZXNzQ2hpbGRyZW4oc25hcHNob3QpO1xuICBjb25zdCBwcm9jZXNzZXMgPSBuZXcgTWFwPG51bWJlciwgUHJvY2Vzc1NuYXBzaG90RW50cnk+KCk7XG4gIGNvbnN0IGRpc2NvdmVyZWQ6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10gPSBbXTtcbiAgY29uc3QgcXVldWU6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHByZXZpb3VzIG9mIHJldGFpbmVkLnZhbHVlcygpKSB7XG4gICAgY29uc3QgY3VycmVudCA9IGN1cnJlbnRCeVBpZC5nZXQocHJldmlvdXMucGlkKTtcbiAgICBpZiAoIWN1cnJlbnQgfHwgIXNhbWVQcm9jZXNzKHByZXZpb3VzLCBjdXJyZW50KSkgY29udGludWU7XG4gICAgcmV0YWluZWQuc2V0KGN1cnJlbnQucGlkLCBjdXJyZW50KTtcbiAgICBwcm9jZXNzZXMuc2V0KGN1cnJlbnQucGlkLCBjdXJyZW50KTtcbiAgICBxdWV1ZS5wdXNoKGN1cnJlbnQpO1xuICB9XG5cbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQocHJvY2Vzc2VzLmtleXMoKSk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBxdWV1ZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBxdWV1ZVtpbmRleF0hO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4uZ2V0KHBhcmVudC5waWQpID8/IFtdKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IHJldGFpbmVkLmdldChjaGlsZC5waWQpO1xuICAgICAgaWYgKCFwcmV2aW91cyB8fCAhc2FtZVByb2Nlc3MocHJldmlvdXMsIGNoaWxkKSkge1xuICAgICAgICByZXRhaW5lZC5zZXQoY2hpbGQucGlkLCBjaGlsZCk7XG4gICAgICAgIGRpc2NvdmVyZWQucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzZXMuc2V0KGNoaWxkLnBpZCwgY2hpbGQpO1xuICAgICAgaWYgKHZpc2l0ZWQuaGFzKGNoaWxkLnBpZCkpIGNvbnRpbnVlO1xuICAgICAgdmlzaXRlZC5hZGQoY2hpbGQucGlkKTtcbiAgICAgIHF1ZXVlLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHByb2Nlc3NlczogWy4uLnByb2Nlc3Nlcy52YWx1ZXMoKV0sIGRpc2NvdmVyZWQgfTtcbn1cblxuLyoqIEJ1aWxkIHRoZSBwZXItbGlmZXRpbWUga2V5IHVzZWQgdG8gcHJldmVudCByZXBlYXRlZCBzaWduYWxzIGFmdGVyIFBJRCByZXVzZS4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NJZGVudGl0eShlbnRyeTogUHJvY2Vzc1NuYXBzaG90RW50cnkpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7ZW50cnkucGlkfToke2VudHJ5LmlkZW50aXR5fWA7XG59XG5cbi8qKiBTaWduYWwgZWFjaCBwcm9jZXNzIGlkZW50aXR5IG9uY2UsIGlnbm9yaW5nIFBJRHMgdGhhdCBhbHJlYWR5IGV4aXRlZC4gKi9cbmZ1bmN0aW9uIHNpZ25hbFByb2Nlc3NlcyhcbiAgcHJvY2Vzc2VzOiByZWFkb25seSBQcm9jZXNzU25hcHNob3RFbnRyeVtdLFxuICBzaWduYWw6IE5vZGVKUy5TaWduYWxzLFxuICBzaWduYWxlZDogU2V0PHN0cmluZz4sXG4pOiB2b2lkIHtcbiAgY29uc3QgZXJyb3JzOiB1bmtub3duW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBwcm9jZXNzZXMpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHByb2Nlc3NJZGVudGl0eShlbnRyeSk7XG4gICAgaWYgKHNpZ25hbGVkLmhhcyhpZGVudGl0eSkpIGNvbnRpbnVlO1xuICAgIHNpZ25hbGVkLmFkZChpZGVudGl0eSk7XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbChlbnRyeS5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNNaXNzaW5nUHJvY2Vzc0Vycm9yKGVycm9yKSkgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgIH1cbiAgfVxuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBgRmFpbGVkIHRvIHNlbmQgJHtzaWduYWx9IHRvIHRoZSBjb21wbGV0ZSBwcm9jZXNzIHRyZWVgKTtcbiAgfVxufVxuXG4vKiogUGF1c2Ugd2l0aG91dCBkZXRhY2hpbmcgdGhlIHNodXRkb3duIG9wZXJhdGlvbiBmcm9tIHRoZSBldmVudCBsb29wLiAqL1xuZnVuY3Rpb24gZGVsYXkobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpc2Vjb25kcykpO1xufVxuXG4vKipcbiAqIFBvbGwgcmVmcmVzaGVkIHByb2Nlc3Mgc25hcHNob3RzIHVudGlsIHRoZSByZXRhaW5lZCB0cmVlIGV4aXRzIG9yIHRoZVxuICogdGltZW91dCBlbGFwc2VzLiBEZXNjZW5kYW50cyBjcmVhdGVkIGR1cmluZyBzaHV0ZG93biBhcmUgcmV0YWluZWQgYW5kIG1heVxuICogcmVjZWl2ZSB0aGUgY3VycmVudCBzaHV0ZG93biBzaWduYWwgb25jZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclByb2Nlc3NUcmVlRXhpdChcbiAgcmV0YWluZWQ6IE1hcDxudW1iZXIsIFByb2Nlc3NTbmFwc2hvdEVudHJ5PixcbiAgaW5pdGlhbFByb2Nlc3NlczogcmVhZG9ubHkgUHJvY2Vzc1NuYXBzaG90RW50cnlbXSxcbiAgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyxcbiAgc2lnbmFsZWQ6IFNldDxzdHJpbmc+LFxuICB0aW1lb3V0TXM6IG51bWJlcixcbiAgcG9sbEludGVydmFsTXM6IG51bWJlcixcbiAgc2lnbmFsRGlzY292ZXJlZDogYm9vbGVhbixcbik6IFByb21pc2U8UHJvY2Vzc1NuYXBzaG90RW50cnlbXT4ge1xuICBsZXQgc3Vydml2b3JzID0gWy4uLmluaXRpYWxQcm9jZXNzZXNdO1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aW1lb3V0TXM7XG4gIHdoaWxlIChzdXJ2aXZvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHJlbWFpbmluZ01zID0gZGVhZGxpbmUgLSBEYXRlLm5vdygpO1xuICAgIGlmIChyZW1haW5pbmdNcyA+IDApIGF3YWl0IGRlbGF5KE1hdGgubWluKHBvbGxJbnRlcnZhbE1zLCByZW1haW5pbmdNcykpO1xuXG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0cnlQcm9jZXNzU25hcHNob3QoKTtcbiAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKERhdGUubm93KCkgPj0gZGVhZGxpbmUpIGJyZWFrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHJlZnJlc2hlZCA9IHJlZnJlc2hQcm9jZXNzVHJlZShyZXRhaW5lZCwgc25hcHNob3QpO1xuICAgIGlmIChzaWduYWxEaXNjb3ZlcmVkICYmIHJlZnJlc2hlZC5kaXNjb3ZlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgIHNpZ25hbFByb2Nlc3NlcyhyZWZyZXNoZWQuZGlzY292ZXJlZCwgc2lnbmFsLCBzaWduYWxlZCk7XG4gICAgfVxuICAgIHN1cnZpdm9ycyA9IHJlZnJlc2hlZC5wcm9jZXNzZXM7XG4gICAgaWYgKERhdGUubm93KCkgPj0gZGVhZGxpbmUpIGJyZWFrO1xuICB9XG4gIHJldHVybiBzdXJ2aXZvcnM7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHtAbGluayBzcGF3bn0gd2l0aCBsaXZlIGxpbmUgYXJyYXlzIGFuZCBsYXp5XG4gKiB0cmltbWVkIGBzdGRvdXRgIC8gYHN0ZGVycmAgZ2V0dGVycyBkZXJpdmVkIGZyb20gdGhvc2UgbGluZXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUV4ZWNSZXN1bHQoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN0ZG91dExpbmVzOiBzdHJpbmdbXSxcbiAgc3RkZXJyTGluZXM6IHN0cmluZ1tdLFxuICB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogRXhlY1Jlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgZXhpdENvZGUsXG4gICAgZ2V0IHN0ZG91dExpbmVzKCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRBc3luY0xpbmVzKHN0ZG91dExpbmVzLCB0cmltKTtcbiAgICB9LFxuICAgIGdldCBzdGRlcnJMaW5lcygpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkQXN5bmNMaW5lcyhzdGRlcnJMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgICBnZXQgc3Rkb3V0KCkge1xuICAgICAgcmV0dXJuIGZvcm1hdEFzeW5jQ2FwdHVyZWRMaW5lcyhzdGRvdXRMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyKCkge1xuICAgICAgcmV0dXJuIGZvcm1hdEFzeW5jQ2FwdHVyZWRMaW5lcyhzdGRlcnJMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgb2JqZWN0IHJldHVybmVkIGZyb20ge0BsaW5rIHNwYXduU3luY30uIENhcHR1cmVkIHN0cmluZ3MgYXJlIHN0b3JlZFxuICogYXMtaXM7IGBzdGRvdXRgIC8gYHN0ZGVycmAgdHJpbSBkaXJlY3RseSwgYW5kIGxpbmUgYXJyYXlzIHNwbGl0IG9ubHkgb24gcmVhZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3luY0V4ZWNSZXN1bHQoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN0ZG91dFRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgc3RkZXJyVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogRXhlY1Jlc3VsdCB7XG4gIGxldCBzdGRvdXRMaW5lc0NhY2hlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0ZGVyckxpbmVzQ2FjaGU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN5bmNMaW5lcyA9ICh0ZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHRleHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbm9ybWFsaXplZFN5bmNMaW5lcyhsaW5lc0Zyb21DYXB0dXJlZE91dHB1dCh0ZXh0KSwgdHJpbSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBleGl0Q29kZSxcbiAgICBnZXQgc3Rkb3V0TGluZXMoKSB7XG4gICAgICBpZiAoc3Rkb3V0VGV4dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gICAgICBzdGRvdXRMaW5lc0NhY2hlID8/PSBzeW5jTGluZXMoc3Rkb3V0VGV4dCkgPz8gW107XG4gICAgICByZXR1cm4gc3Rkb3V0TGluZXNDYWNoZTtcbiAgICB9LFxuICAgIGdldCBzdGRlcnJMaW5lcygpIHtcbiAgICAgIGlmIChzdGRlcnJUZXh0ID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgICAgIHN0ZGVyckxpbmVzQ2FjaGUgPz89IHN5bmNMaW5lcyhzdGRlcnJUZXh0KSA/PyBbXTtcbiAgICAgIHJldHVybiBzdGRlcnJMaW5lc0NhY2hlO1xuICAgIH0sXG4gICAgZ2V0IHN0ZG91dCgpIHtcbiAgICAgIHJldHVybiBmb3JtYXRTeW5jQ2FwdHVyZWRUZXh0KHN0ZG91dFRleHQsIHRyaW0pID8/IFwiXCI7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyKCkge1xuICAgICAgcmV0dXJuIGZvcm1hdFN5bmNDYXB0dXJlZFRleHQoc3RkZXJyVGV4dCwgdHJpbSkgPz8gXCJcIjtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdXNlci1zdXBwbGllZCBsaW5lIGhhbmRsZXJzIGZyb20gYSB7QGxpbmsgU3RkaW9PcHRpb259LlxuICpcbiAqIFRoZSBgXCJjYXB0dXJlXCJgIG1hcmtlciBpcyBmaWx0ZXJlZCBvdXQ7IGNhcHR1cmUgaXRzZWxmIGlzIGFsd2F5cyBoYW5kbGVkIGJ5XG4gKiBwdXNoaW5nIGludG8gdGhlIGxpbmUgYnVmZmVyIGluc2lkZSB7QGxpbmsgcmVzb2x2ZVN0ZGlvfS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gU3RkaW8gb3B0aW9uIHRoYXQgbWF5IGVtYmVkIG9uZSBvciBtb3JlIGhhbmRsZXJzXG4gKiBAcmV0dXJucyBIYW5kbGVycyB0byBpbnZva2UgYWZ0ZXIgZWFjaCBjYXB0dXJlZCBsaW5lIChtYXkgYmUgZW1wdHkpXG4gKi9cbmZ1bmN0aW9uIGxpbmVIYW5kbGVycyhvcHRpb246IFN0ZGlvT3B0aW9uKTogTGluZUhhbmRsZXJbXSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9uID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBbb3B0aW9uXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uKSkge1xuICAgIHJldHVybiBvcHRpb24uZmlsdGVyKChpdGVtKTogaXRlbSBpcyBMaW5lSGFuZGxlciA9PiBpdGVtICE9PSBcImNhcHR1cmVcIik7XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRpb24gPT09IFwib2JqZWN0XCIpIHJldHVybiBbb3B0aW9uLm9uTGluZV07XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gY2FwdHVyZXNMaW5lcyhvcHRpb246IFN0ZGlvT3B0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygb3B0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9uKSB8fCBvcHRpb24uY2FwdHVyZSAhPT0gZmFsc2U7XG59XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGEgc3RkaW8gb3B0aW9uIGlzIGEgc3RyaW5nIHNwYXduIG1vZGUgcmF0aGVyIHRoYW4gY2FwdHVyZS9oYW5kbGVycy5cbiAqXG4gKiB7QGxpbmsgcmVzb2x2ZVN0ZGlvfSBzdGlsbCB0cmVhdHMgYFwicGlwZVwiYCBhcyBwaXBlLWFuZC1jYXB0dXJlOyBvbmx5XG4gKiBgXCJpbmhlcml0XCJgIGFuZCBgXCJpZ25vcmVcImAgcmV0dXJuIHdpdGhvdXQgYSBsaW5lIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSBvcHRpb24gLSBTdGRpbyBvcHRpb24gdG8gY2xhc3NpZnlcbiAqIEByZXR1cm5zIFdoZXRoZXIgYG9wdGlvbmAgaXMgYFwiaW5oZXJpdFwiYCwgYFwicGlwZVwiYCwgb3IgYFwiaWdub3JlXCJgXG4gKi9cbmZ1bmN0aW9uIGlzUGFzc3Rocm91Z2hNb2RlKG9wdGlvbjogdW5rbm93bik6IG9wdGlvbiBpcyBFeGVjU3RkaW8ge1xuICByZXR1cm4gb3B0aW9uID09PSBcImluaGVyaXRcIiB8fCBvcHRpb24gPT09IFwicGlwZVwiIHx8IG9wdGlvbiA9PT0gXCJpZ25vcmVcIjtcbn1cblxuLyoqIFRydWUgd2hlbiBzdGRpbiBpcyBkYXRhIHJhdGhlciB0aGFuIG9uZSBvZiB0aGUgdGhyZWUgcmVzZXJ2ZWQgc3RkaW8gbW9kZXMuICovXG5mdW5jdGlvbiBpc1N0ZGluUGF5bG9hZChzdGRpbjogRXhlY1N0ZGlvIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RkaW4gaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBzdGRpbiA9PT0gXCJzdHJpbmdcIiAmJiAhaXNQYXNzdGhyb3VnaE1vZGUoc3RkaW4pO1xufVxuXG4vKipcbiAqIE1hcCBhIHtAbGluayBTdGRpb09wdGlvbn0gaW50byBhIHNwYXduIHN0ZGlvIG1vZGUgYW5kIG9wdGlvbmFsIGxpbmUgY2FsbGJhY2suXG4gKlxuICogUGlwZWQgbW9kZXMgKGBcImNhcHR1cmVcImAsIGBcInBpcGVcImAsIGhhbmRsZXJzLCBhcnJheXMpIGFwcGVuZCBldmVyeSBsaW5lIHRvXG4gKiBgbGluZXNgIGFuZCBpbnZva2UgYW55IGVtYmVkZGVkIGhhbmRsZXJzLiBPbWl0dGVkIG9wdGlvbnMgdXNlIGBkZWZhdWx0TW9kZWAuXG4gKlxuICogQHBhcmFtIG9wdGlvbiAtIENhbGxlciBzdGRpbyBwcmVmZXJlbmNlIGZvciBvbmUgZmRcbiAqIEBwYXJhbSBsaW5lcyAtIE11dGFibGUgYnVmZmVyIHRoYXQgcmVjZWl2ZXMgZWFjaCBwaXBlZCBsaW5lXG4gKiBAcGFyYW0gZGVmYXVsdE1vZGUgLSBTcGF3biBtb2RlIHdoZW4gYG9wdGlvbmAgaXMgb21pdHRlZCAoYFwiaW5oZXJpdFwiYCBieSBkZWZhdWx0KVxuICogQHJldHVybnMgUmVzb2x2ZWQgc3Bhd24gbW9kZSBhbmQgb3B0aW9uYWwgcGVyLWxpbmUgY2FsbGJhY2tcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN0ZGlvKFxuICBvcHRpb246IFN0ZGlvT3B0aW9uIHwgdW5kZWZpbmVkLFxuICBsaW5lczogc3RyaW5nW10sXG4gIGRlZmF1bHRNb2RlOiBFeGVjU3RkaW8gPSBcImluaGVyaXRcIixcbik6IFJlc29sdmVkU3RkaW8ge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB7IG1vZGU6IGRlZmF1bHRNb2RlIH07XG4gIGlmIChpc1Bhc3N0aHJvdWdoTW9kZShvcHRpb24pICYmIG9wdGlvbiAhPT0gXCJwaXBlXCIpIHJldHVybiB7IG1vZGU6IG9wdGlvbiB9O1xuXG4gIGNvbnN0IGhhbmRsZXJzID0gbGluZUhhbmRsZXJzKG9wdGlvbik7XG4gIGNvbnN0IGNhcHR1cmUgPSBjYXB0dXJlc0xpbmVzKG9wdGlvbik7XG4gIHJldHVybiB7XG4gICAgbW9kZTogXCJwaXBlXCIsXG4gICAgb25MaW5lOiAobGluZSkgPT4ge1xuICAgICAgaWYgKGNhcHR1cmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIGhhbmRsZXIobGluZSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWFkIGEgcmVhZGFibGUgc3RyZWFtIGxpbmUtYnktbGluZSBhbmQgaW52b2tlIGBvbkxpbmVgIGZvciBlYWNoIGNodW5rLlxuICpcbiAqIFVzZXMgYHJlYWRsaW5lYCBzbyBgXFxyXFxuYCBhbmQgYmFyZSBgXFxuYCBhcmUgbm9ybWFsaXplZC4gVGhlIGludGVyZmFjZSBpc1xuICogYWx3YXlzIGNsb3NlZCBpbiBhIGBmaW5hbGx5YCBibG9jay5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtIC0gU3VicHJvY2VzcyBzdGRvdXQgb3Igc3RkZXJyIHN0cmVhbVxuICogQHBhcmFtIG9uTGluZSAtIENhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgb3V0cHV0IGxpbmVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZExpbmVzKHN0cmVhbTogUmVhZGFibGUsIG9uTGluZTogTGluZUhhbmRsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2UoeyBpbnB1dDogc3RyZWFtLCBjcmxmRGVsYXk6IEluZmluaXR5IH0pO1xuICB0cnkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgbGluZSBvZiBybCkgb25MaW5lKGxpbmUpO1xuICB9IGZpbmFsbHkge1xuICAgIHJsLmNsb3NlKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGFydCBhIGJhY2tncm91bmQgbGluZSByZWFkIHdoZW4gdGhlIHJlc29sdmVkIGhhbmRsZXIgcGlwZXMgYSBzdHJlYW0uXG4gKlxuICogQHBhcmFtIHJlYWRzIC0gUHJvbWlzZSBsaXN0IGF3YWl0ZWQgYmVmb3JlIHJldHVybmluZyB0aGUge0BsaW5rIEV4ZWNSZXN1bHR9XG4gKiBAcGFyYW0gc3RyZWFtIC0gU3VicHJvY2VzcyBzdHJlYW0gZm9yIHRoaXMgZmQgKGBudWxsYCB3aGVuIHVuYXZhaWxhYmxlKVxuICogQHBhcmFtIGhhbmRsZXIgLSBSZXNvbHZlZCBzdGRpbyBjb25maWcgZnJvbSB7QGxpbmsgcmVzb2x2ZVN0ZGlvfVxuICovXG5mdW5jdGlvbiBxdWV1ZUxpbmVSZWFkcyhcbiAgcmVhZHM6IFByb21pc2U8dm9pZD5bXSxcbiAgc3RyZWFtOiBSZWFkYWJsZSB8IG51bGwsXG4gIGhhbmRsZXI6IFJlc29sdmVkU3RkaW8sXG4pOiB2b2lkIHtcbiAgaWYgKGhhbmRsZXIub25MaW5lICYmIHN0cmVhbSkgcmVhZHMucHVzaChyZWFkTGluZXMoc3RyZWFtLCBoYW5kbGVyLm9uTGluZSkpO1xufVxuXG4vKipcbiAqIFdyaXRlIHN0cmluZyBzdGRpbiB0byBhIHNwYXduZWQgcHJvY2VzcyBhbmQgY2xvc2UgdGhlIHN0cmVhbS5cbiAqXG4gKiBOby1vcCB1bmxlc3MgYHN0ZGluYCBpcyBhIHBheWxvYWQgc3RyaW5nIChub3QgYSBzdGRpbyBtb2RlKSBhbmRcbiAqIGBwcm9jLnN0ZGluYCBpcyBhdmFpbGFibGUuIEEgY2hpbGQgdGhhdCBleGl0cyBiZWZvcmUgY29uc3VtaW5nIHRoZSBwYXlsb2FkXG4gKiBjbG9zZXMgaXRzIHBpcGU7IEVQSVBFIGlzIGV4cGVjdGVkIGluIHRoYXQgY2FzZSBhbmQgaXMgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0gcHJvYyAtIENoaWxkIHByb2Nlc3MgcmV0dXJuZWQgZnJvbSBgc3Bhd25gXG4gKiBAcGFyYW0gc3RkaW4gLSBTdGRpbyBtb2RlIG9yIHN0cmluZyBwYXlsb2FkIGZyb20ge0BsaW5rIEV4ZWNPcHRpb25zfVxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN0ZGluKFxuICBwcm9jOiBDaGlsZFByb2Nlc3MsXG4gIHN0ZGluOiBFeGVjU3RkaW8gfCBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1N0ZGluUGF5bG9hZChzdGRpbikgfHwgIXByb2Muc3RkaW4pIHJldHVybjtcbiAgY29uc3QgY29tcGxldGlvbiA9IGZpbmlzaGVkKHByb2Muc3RkaW4sIHsgY2xlYW51cDogdHJ1ZSB9KTtcbiAgcHJvYy5zdGRpbi5lbmQoc3RkaW4pO1xuICB0cnkge1xuICAgIGF3YWl0IGNvbXBsZXRpb247XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVyciAmJiBlcnIuY29kZSA9PT0gXCJFUElQRVwiKSkgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogQXdhaXQgcHJvY2VzcyBleGl0IGFuZCBub3JtYWxpemUgYSBtaXNzaW5nIGV4aXQgY29kZSB0byBgMWAuXG4gKlxuICogUmVqZWN0cyB3aGVuIHNwYXduIGZhaWxzIGJlZm9yZSBgY2xvc2VgIChlLmcuIGV4ZWN1dGFibGUgbm90IGZvdW5kKS5cbiAqXG4gKiBAcGFyYW0gcHJvYyAtIENoaWxkIHByb2Nlc3MgcmV0dXJuZWQgZnJvbSBgc3Bhd25gXG4gKiBAcmV0dXJucyBSZXNvbHZlZCBleGl0IGNvZGVcbiAqL1xuZnVuY3Rpb24gd2FpdEZvckV4aXQocHJvYzogQ2hpbGRQcm9jZXNzKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBwcm9jLm9uY2UoXCJlcnJvclwiLCByZWplY3QpO1xuICAgIHByb2Mub25jZShcImNsb3NlXCIsIChjb2RlKSA9PiByZXNvbHZlKGNvZGUgPz8gMSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiBgRXJyb3JgIGZvciBhIG5vbi16ZXJvIGV4aXQgd2hlbiB7QGxpbmsgRXhlY09wdGlvbnMuY2hlY2t9IGlzIHNldC5cbiAqXG4gKiBQcmVmZXJzIHRyaW1tZWQgc3RkZXJyIHRleHQsIHRoZW4gc3Rkb3V0LCBpbiB0aGUgbWVzc2FnZSBib2R5LlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSBuYW1lIG9yIHBhdGhcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZXhlY3V0YWJsZVxuICogQHBhcmFtIHJlc3VsdCAtIENvbXBsZXRlZCBleGVjIG91dGNvbWUgd2l0aCBjYXB0dXJlZCBvdXRwdXRcbiAqIEByZXR1cm5zIEVycm9yIHN1aXRhYmxlIGZvciB0aHJvd2luZyBmcm9tIHtAbGluayBzcGF3bn1cbiAqL1xuZnVuY3Rpb24gZXhlY0Vycm9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIHJlc3VsdDogRXhlY1Jlc3VsdCk6IEVycm9yIHtcbiAgY29uc3QgZGV0YWlsID0gcmVzdWx0LnN0ZGVyciB8fCByZXN1bHQuc3Rkb3V0O1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGAke2NvbW1hbmRMYWJlbChjb21tYW5kLCBhcmdzKX0gZmFpbGVkIChleGl0ICR7cmVzdWx0LmV4aXRDb2RlfSkke2RldGFpbCA/IGA6ICR7ZGV0YWlsfWAgOiBcIlwifWAsXG4gICk7XG59XG5cbi8qKlxuICogTWFwIGEge0BsaW5rIFN5bmNFeGVjU3RkaW99IG9wdGlvbiB0byBhIGBzcGF3blN5bmNgIHN0ZGlvIG1vZGUuXG4gKlxuICogYFwiY2FwdHVyZVwiYCBwaXBlcyB0aGUgZmQgc28gb3V0cHV0IGNhbiBiZSByZWFkIGludG8gdGhlIHtAbGluayBFeGVjUmVzdWx0fS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gQ2FsbGVyIHN0ZGlvIHByZWZlcmVuY2UgZm9yIG9uZSBmZFxuICogQHBhcmFtIGRlZmF1bHRNb2RlIC0gU3Bhd24gbW9kZSB3aGVuIGBvcHRpb25gIGlzIG9taXR0ZWQgKGBcImluaGVyaXRcImAgYnkgZGVmYXVsdClcbiAqIEByZXR1cm5zIFZhbHVlIGZvciB0aGUgYHNwYXduU3luY2Agc3RkaW8gdHVwbGVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN5bmNTdGRpbyhcbiAgb3B0aW9uOiBTeW5jRXhlY1N0ZGlvIHwgdW5kZWZpbmVkLFxuICBkZWZhdWx0TW9kZTogRXhlY1N0ZGlvID0gXCJpbmhlcml0XCIsXG4pOiBFeGVjU3RkaW8ge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0TW9kZTtcbiAgaWYgKG9wdGlvbiA9PT0gXCJjYXB0dXJlXCIpIHJldHVybiBcInBpcGVcIjtcbiAgcmV0dXJuIG9wdGlvbjtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgcmF3IGBzcGF3blN5bmNgIG91dHB1dCB0byBhIFVURi04IHN0cmluZyB3aGVuIGNhcHR1cmUgaXMgZW5hYmxlZC5cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZWRUZXh0KG91dHB1dDogc3RyaW5nIHwgQnVmZmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvdXRwdXQgPT09IG51bGwgfHwgb3V0cHV0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygb3V0cHV0ID09PSBcInN0cmluZ1wiID8gb3V0cHV0IDogb3V0cHV0LnRvU3RyaW5nKFwidXRmOFwiKTtcbn1cblxuLyoqXG4gKiBTcGxpdCBjYXB0dXJlZCBwcm9jZXNzIG91dHB1dCBpbnRvIGxpbmVzIGZvciB7QGxpbmsgRXhlY1Jlc3VsdC5zdGRvdXRMaW5lc30gL1xuICoge0BsaW5rIEV4ZWNSZXN1bHQuc3RkZXJyTGluZXN9ICh7QGxpbmsgc3Bhd25TeW5jfSBvbmx5OyBpbnZva2VkIGxhemlseSkuXG4gKi9cbmZ1bmN0aW9uIGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gb3V0cHV0LnJlcGxhY2UoL1xcclxcbi9nLCBcIlxcblwiKS5yZXBsYWNlKC9cXHIvZywgXCJcXG5cIikuc3BsaXQoXCJcXG5cIik7XG59XG5cbi8qKlxuICogU3RvcCBhbiBleGlzdGluZyBjaGlsZCBwcm9jZXNzIGFuZCBldmVyeSBkZXNjZW5kYW50IGRpc2NvdmVyZWQgdGhyb3VnaFxuICogb3BlcmF0aW5nLXN5c3RlbSBwcm9jZXNzIHNuYXBzaG90cy5cbiAqXG4gKiBVc2UgdGhpcyB3aGVuIGEgY2FsbGVyIG11c3QgcmV0YWluIG5hdGl2ZSBgY2hpbGRfcHJvY2Vzcy5zcGF3bmAgYmVoYXZpb3IgYnV0XG4gKiBzdGlsbCBuZWVkcyB0aGUgc2FtZSBwcm9jZXNzLXRyZWUgc2h1dGRvd24gcG9saWN5IGFzIHtAbGluayBzcGF3bn0uXG4gKlxuICogQHBhcmFtIGNoaWxkIC0gUm9vdCBjaGlsZCBwcm9jZXNzIHdob3NlIHNuYXBzaG90dGVkIHRyZWUgc2hvdWxkIHN0b3BcbiAqIEBwYXJhbSBvcHRpb25zIC0gR3JhY2VmdWwgYW5kIGZvcmNlZCBzaHV0ZG93biB0aW1lb3V0IHBvbGljeVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2h1dGRvd25Qcm9jZXNzVHJlZShcbiAgY2hpbGQ6IENoaWxkUHJvY2VzcyxcbiAgb3B0aW9uczogQ2hpbGRQcm9jZXNzVGVybWluYXRpb25PcHRpb25zID0ge30sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgdGVybWluYXRlUHJvY2Vzc1RyZWUoY2hpbGQsIG9wdGlvbnMpO1xufVxuXG4vKiogU3RvcCBhIHByb2Nlc3MgdHJlZSB3aXRoIGFuIGludGVybmFsbHkgc2VsZWN0ZWQgZ3JhY2VmdWwgc2lnbmFsLiAqL1xuYXN5bmMgZnVuY3Rpb24gdGVybWluYXRlUHJvY2Vzc1RyZWUoXG4gIGNoaWxkOiBDaGlsZFByb2Nlc3MsXG4gIG9wdGlvbnM6IENoaWxkUHJvY2Vzc1Rlcm1pbmF0aW9uT3B0aW9ucyA9IHt9LFxuICB0ZXJtaW5hdGVTaWduYWw6IE5vZGVKUy5TaWduYWxzID0gREVGQVVMVF9URVJNSU5BVEVfU0lHTkFMLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCB8fCBjaGlsZC5leGl0Q29kZSAhPT0gbnVsbCB8fCBjaGlsZC5zaWduYWxDb2RlICE9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdGVybWluYXRlVGltZW91dCA9IHRpbWVvdXRWYWx1ZShcbiAgICBvcHRpb25zLnRlcm1pbmF0ZVRpbWVvdXQgPz8gREVGQVVMVF9URVJNSU5BVEVfVElNRU9VVF9NUyxcbiAgICBcInRlcm1pbmF0ZVRpbWVvdXRcIixcbiAgKTtcbiAgY29uc3Qga2lsbFRpbWVvdXQgPSB0aW1lb3V0VmFsdWUob3B0aW9ucy5raWxsVGltZW91dCA/PyBERUZBVUxUX0tJTExfVElNRU9VVF9NUywgXCJraWxsVGltZW91dFwiKTtcbiAgY29uc3QgcG9sbEludGVydmFsTXMgPSBERUZBVUxUX0tJTExfUE9MTF9JTlRFUlZBTF9NUztcbiAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0cnlQcm9jZXNzU25hcHNob3QoKTtcbiAgaWYgKGNoaWxkLmV4aXRDb2RlICE9PSBudWxsIHx8IGNoaWxkLnNpZ25hbENvZGUgIT09IG51bGwpIHJldHVybjtcbiAgaWYgKHNuYXBzaG90ID09PSB1bmRlZmluZWQpIHtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5raWxsKGNoaWxkLnBpZCwgdGVybWluYXRlU2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc01pc3NpbmdQcm9jZXNzRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRyZWUgPSBwcm9jZXNzVHJlZShzbmFwc2hvdCwgY2hpbGQucGlkKTtcbiAgY29uc3QgcmV0YWluZWQgPSBuZXcgTWFwKHRyZWUubWFwKChlbnRyeSkgPT4gW2VudHJ5LnBpZCwgZW50cnldKSk7XG5cbiAgY29uc3QgdGVybWluYXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBzaWduYWxQcm9jZXNzZXModHJlZSwgdGVybWluYXRlU2lnbmFsLCB0ZXJtaW5hdGVkKTtcbiAgY29uc3Qga2lsbFRhcmdldHMgPSBhd2FpdCB3YWl0Rm9yUHJvY2Vzc1RyZWVFeGl0KFxuICAgIHJldGFpbmVkLFxuICAgIHRyZWUsXG4gICAgdGVybWluYXRlU2lnbmFsLFxuICAgIHRlcm1pbmF0ZWQsXG4gICAgdGVybWluYXRlVGltZW91dCxcbiAgICBwb2xsSW50ZXJ2YWxNcyxcbiAgICB0cnVlLFxuICApO1xuICBpZiAoa2lsbFRhcmdldHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3Qga2lsbGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHNpZ25hbFByb2Nlc3NlcyhraWxsVGFyZ2V0cywgREVGQVVMVF9LSUxMX1NJR05BTCwga2lsbGVkKTtcbiAgY29uc3Qgc3Vydml2b3JzID0gYXdhaXQgd2FpdEZvclByb2Nlc3NUcmVlRXhpdChcbiAgICByZXRhaW5lZCxcbiAgICBraWxsVGFyZ2V0cyxcbiAgICBERUZBVUxUX0tJTExfU0lHTkFMLFxuICAgIGtpbGxlZCxcbiAgICBraWxsVGltZW91dCxcbiAgICBwb2xsSW50ZXJ2YWxNcyxcbiAgICB0cnVlLFxuICApO1xuICBpZiAoc3Vydml2b3JzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBsb2dnZXIud2FybihcInByb2Nlc3MgdHJlZSBzdGlsbCBydW5uaW5nIGFmdGVyIGtpbGwgdGltZW91dFwiLCB7XG4gICAgcm9vdFBpZDogY2hpbGQucGlkLFxuICAgIHN1cnZpdm9yUGlkczogc3Vydml2b3JzLm1hcCgoZW50cnkpID0+IGVudHJ5LnBpZCksXG4gICAga2lsbFNpZ25hbDogREVGQVVMVF9LSUxMX1NJR05BTCxcbiAgICBraWxsVGltZW91dCxcbiAgfSk7XG59XG5cbi8qKlxuICogU3Bhd24gYSBzdWJwcm9jZXNzLiBSZXR1cm5zIHRoZSBMSVZFIGNoaWxkIGhhbmRsZSB0aGF0IGlzIEFMU08gYVxuICogYFByb21pc2U8RXhlY1Jlc3VsdD5gIHJlc29sdmluZyBvbiBleGl0IC0gc2VlIHtAbGluayBDaGlsZFByb2Nlc3NSZXN1bHR9LlxuICpcbiAqIFRoZSBwcm9taXNlIGhhbGYgaXMgdGhlIGV4YWN0IGJlaGF2aW91ciB0aGlzIGZ1bmN0aW9uIGhhZCBiZWZvcmU6IGl0IGF3YWl0c1xuICogZXhpdCAoYW5kIGFueSBsaW5lIHJlYWRzIC8gc3RkaW4gd3JpdGUpLCB0aGVuIHJlc29sdmVzIHRvIHRoZSB7QGxpbmsgRXhlY1Jlc3VsdH1cbiAqIG9yIHJlamVjdHMgKHNwYXduIGVycm9yIG90aGVyIHRoYW4gYSBtaXNzaW5nIGV4ZWN1dGFibGUsIG9yIGBjaGVja2Agb24gbm9uLXplcm9cbiAqIGV4aXQpLiBFeGlzdGluZyBgYXdhaXQgc3Bhd24oLi4uKWAgY2FsbGVycyBhcmUgdW5hZmZlY3RlZC4gVGhlIGhhbmRsZSBoYWxmIGxldHMgYVxuICogY2FsbGVyIHN1cGVydmlzZSB0aGUgcHJvY2VzcyAoYC5waWRgLCBgLnNodXRkb3duKClgLCBgZXhpdGAgZXZlbnQpIHdpdGhvdXQgYVxuICogc2Vjb25kIHNwYXduLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSB0byBydW4gKHJlc29sdmVkIG9uIGBQQVRIYCB3aGVuIGBzaGVsbGAgaXMgc2V0IG9uIG9wdGlvbnMpXG4gKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdmVyYmF0aW0gdG8gdGhlIGV4ZWN1dGFibGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gU3Bhd24sIHN0ZGlvLCBhbmQgY2hlY2sgb3B0aW9uc1xuICogQHJldHVybnMgVGhlIGxpdmUgYENoaWxkUHJvY2Vzc2AsIGF3YWl0YWJsZSB0byBleGl0IGNvZGUgKyBjYXB0dXJlZCBvdXRwdXRcbiAqIEB0aHJvd3MgKG9uIHRoZSBwcm9taXNlKSBXaGVuIHNwYXduIGZhaWxzIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIGEgbWlzc2luZ1xuICogZXhlY3V0YWJsZSwgbGluZSByZWFkcyBmYWlsLCBvciBgY2hlY2tgIGlzIHRydWUgYW5kIGV4aXQgY29kZSBpcyBub24temVyb1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3Bhd24oLi4uYXJnczogU3Bhd25BcmdzPEV4ZWNPcHRpb25zPik6IENoaWxkUHJvY2Vzc1Jlc3VsdCB7XG4gIGNvbnN0IHsgY29tbWFuZCwgY29tbWFuZEFyZ3MsIG9wdGlvbnMgPSB7fSB9ID0gcGFyc2VTcGF3bkFyZ3MoYXJncyk7XG4gIHJlamVjdFNpZ25hbE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtcbiAgICBzdGRpbixcbiAgICBzdGRvdXQsXG4gICAgc3RkZXJyLFxuICAgIGZvcndhcmRUZXJtaW5hdGlvblNpZ25hbHMgPSB0cnVlLFxuICAgIHRlcm1pbmF0ZVRpbWVvdXQsXG4gICAga2lsbFRpbWVvdXQsXG4gICAgY2hlY2ssXG4gICAgdHJpbSxcbiAgICAuLi5zcGF3bk9wdHNcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHRlcm1pbmF0aW9uT3B0aW9uczogQ2hpbGRQcm9jZXNzVGVybWluYXRpb25PcHRpb25zID0ge1xuICAgIHRlcm1pbmF0ZVRpbWVvdXQsXG4gICAga2lsbFRpbWVvdXQsXG4gIH07XG4gIGNvbnN0IHN0ZG91dExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzdGRlcnJMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc3Rkb3V0SGFuZGxlciA9IHJlc29sdmVTdGRpbyhzdGRvdXQsIHN0ZG91dExpbmVzKTtcbiAgY29uc3Qgc3RkZXJySGFuZGxlciA9IHJlc29sdmVTdGRpbyhzdGRlcnIsIHN0ZGVyckxpbmVzKTtcbiAgY29uc3Qgc3RkaW5Nb2RlOiBFeGVjU3RkaW8gPSBpc1N0ZGluUGF5bG9hZChzdGRpbikgPyBcInBpcGVcIiA6IChzdGRpbiA/PyBcImluaGVyaXRcIik7XG5cbiAgY29uc3QgcHJvYyA9IG5vZGVTcGF3bihjb21tYW5kLCBjb21tYW5kQXJncywge1xuICAgIC4uLnNwYXduT3B0cyxcbiAgICBkZXRhY2hlZDogcmVzb2x2ZURldGFjaGVkKHNwYXduT3B0cy5kZXRhY2hlZCwgZm9yd2FyZFRlcm1pbmF0aW9uU2lnbmFscyksXG4gICAgc3RkaW86IFtzdGRpbk1vZGUsIHN0ZG91dEhhbmRsZXIubW9kZSwgc3RkZXJySGFuZGxlci5tb2RlXSxcbiAgfSk7XG4gIGNvbnN0IGNoaWxkID0gYXR0YWNoUHJvY2Vzc0NvbnRyb2xzKHByb2MsIHRlcm1pbmF0aW9uT3B0aW9ucyk7XG4gIGNvbnN0IHVucmVnaXN0ZXJTaWduYWxGb3J3YXJkaW5nID0gZm9yd2FyZFRlcm1pbmF0aW9uU2lnbmFsc1xuICAgID8gcmVnaXN0ZXJQYXJlbnRTaWduYWxGb3J3YXJkaW5nKGNoaWxkKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN0ZGluV3JpdGUgPSB3cml0ZVN0ZGluKHByb2MsIHN0ZGluKTtcblxuICBjb25zdCByZWFkczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIHF1ZXVlTGluZVJlYWRzKHJlYWRzLCBwcm9jLnN0ZG91dCwgc3Rkb3V0SGFuZGxlcik7XG4gIHF1ZXVlTGluZVJlYWRzKHJlYWRzLCBwcm9jLnN0ZGVyciwgc3RkZXJySGFuZGxlcik7XG5cbiAgY29uc3QgY29tcGxldGlvbiA9IChhc3luYyAoKTogUHJvbWlzZTxFeGVjUmVzdWx0PiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBleGl0Q29kZSA9IDE7XG4gICAgICBsZXQgY29tbWFuZE5vdEZvdW5kRXJyb3I6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGV4aXRDb2RlID0gYXdhaXQgd2FpdEZvckV4aXQocHJvYyk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtzdGRpbldyaXRlLCAuLi5yZWFkc10pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghaXNDb21tYW5kTm90Rm91bmRFcnJvcihlcnIpKSB7XG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtzdGRpbldyaXRlLCAuLi5yZWFkc10pO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICBwcm9jLnN0ZGluPy5kZXN0cm95KCk7XG4gICAgICAgIHByb2Muc3Rkb3V0Py5kZXN0cm95KCk7XG4gICAgICAgIHByb2Muc3RkZXJyPy5kZXN0cm95KCk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbc3RkaW5Xcml0ZV0pO1xuICAgICAgICBmb3IgKGNvbnN0IHJlYWQgb2YgcmVhZHMpIHZvaWQgcmVhZC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICBjb21tYW5kTm90Rm91bmRFcnJvciA9IGVycjtcbiAgICAgICAgZXhpdENvZGUgPSBDT01NQU5EX05PVF9GT1VORF9FWElUX0NPREU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZUV4ZWNSZXN1bHQoZXhpdENvZGUsIHN0ZG91dExpbmVzLCBzdGRlcnJMaW5lcywgdHJpbSk7XG4gICAgICBpZiAoY2hlY2sgJiYgcmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IGV4ZWNFcnJvcihjb21tYW5kLCBjb21tYW5kQXJncywgcmVzdWx0KTtcbiAgICAgICAgaWYgKGNvbW1hbmROb3RGb3VuZEVycm9yKSBlcnIuY2F1c2UgPSBjb21tYW5kTm90Rm91bmRFcnJvcjtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdW5yZWdpc3RlclNpZ25hbEZvcndhcmRpbmc/LigpO1xuICAgIH1cbiAgfSkoKTtcblxuICAvLyBBdHRhY2ggdGhlIHByb21pc2UgaW50ZXJmYWNlIG9udG8gdGhlIGxpdmUgY2hpbGQgc28gT05FIG9iamVjdCBpcyBib3RoLiBUaGVcbiAgLy8gbWV0aG9kcyBhcmUgYm91bmQgdG8gYGNvbXBsZXRpb25gIHNvIGB0aGlzYCBpcyB0aGUgcmVhbCBwcm9taXNlOyB0aGUgY2hpbGRcbiAgLy8gb3ducyBubyBjb25mbGljdGluZyBgdGhlbmAvYGNhdGNoYC9gZmluYWxseWAsIHNvIHRoaXMgaXMgcHVyZWx5IGFkZGl0aXZlLlxuICByZXR1cm4gYXR0YWNoUHJvbWlzZShjaGlsZCwgY29tcGxldGlvbik7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFByb2Nlc3NDb250cm9scyhcbiAgY2hpbGQ6IENoaWxkUHJvY2VzcyxcbiAgZGVmYXVsdHM6IENoaWxkUHJvY2Vzc1Rlcm1pbmF0aW9uT3B0aW9ucyxcbik6IENoaWxkUHJvY2Vzc1Jlc3VsdCB7XG4gIGNvbnN0IGNvbnRyb2xsZWQgPSBjaGlsZCBhcyBDaGlsZFByb2Nlc3NSZXN1bHQ7XG4gIGxldCBzaHV0ZG93blByb21pc2U6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHNodXRkb3duID0gKFxuICAgIG9wdGlvbnM6IENoaWxkUHJvY2Vzc1Rlcm1pbmF0aW9uT3B0aW9ucyxcbiAgICB0ZXJtaW5hdGVTaWduYWwgPSBERUZBVUxUX1RFUk1JTkFURV9TSUdOQUwsXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHJlamVjdFNpZ25hbE9wdGlvbnMob3B0aW9ucyk7XG4gICAgc2h1dGRvd25Qcm9taXNlID8/PSB0ZXJtaW5hdGVQcm9jZXNzVHJlZShjaGlsZCwgeyAuLi5kZWZhdWx0cywgLi4ub3B0aW9ucyB9LCB0ZXJtaW5hdGVTaWduYWwpO1xuICAgIHJldHVybiBzaHV0ZG93blByb21pc2U7XG4gIH07XG4gIGNvbnRyb2xsZWQuc2h1dGRvd24gPSAob3B0aW9ucyA9IHt9KSA9PiBzaHV0ZG93bihvcHRpb25zKTtcbiAgcGFyZW50U2lnbmFsU2h1dGRvd25zLnNldChjb250cm9sbGVkLCAoc2lnbmFsKSA9PiBzaHV0ZG93bih7fSwgc2lnbmFsKSk7XG4gIHJldHVybiBjb250cm9sbGVkO1xufVxuXG4vKipcbiAqIEF0dGFjaCBhIHByb21pc2UncyBgdGhlbmAgLyBgY2F0Y2hgIC8gYGZpbmFsbHlgIG9udG8gYSBsaXZlIG9iamVjdCwgcmV0dXJuaW5nXG4gKiB0aGUgc2FtZSBvYmplY3QgdHlwZWQgYXMgYm90aC4gVXNlZCBieSB7QGxpbmsgc3Bhd259IHRvIG1ha2UgaXRzIGBDaGlsZFByb2Nlc3NgXG4gKiBhd2FpdGFibGUgd2l0aG91dCB3cmFwcGluZyBpdCAtIHNvIGNhbGxlcnMga2VlcCB0aGUgbGl2ZSBoYW5kbGUgQU5EIGBhd2FpdGAgaXQuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaFByb21pc2U8VCBleHRlbmRzIG9iamVjdCwgUj4odGFyZ2V0OiBULCBwcm9taXNlOiBQcm9taXNlPFI+KTogVCAmIFByb21pc2U8Uj4ge1xuICBjb25zdCBoeWJyaWQgPSB0YXJnZXQgYXMgVCAmIFByb21pc2U8Uj47XG4gIGh5YnJpZC50aGVuID0gcHJvbWlzZS50aGVuLmJpbmQocHJvbWlzZSk7XG4gIGh5YnJpZC5jYXRjaCA9IHByb21pc2UuY2F0Y2guYmluZChwcm9taXNlKTtcbiAgaHlicmlkLmZpbmFsbHkgPSBwcm9taXNlLmZpbmFsbHkuYmluZChwcm9taXNlKTtcbiAgcmV0dXJuIGh5YnJpZDtcbn1cblxuLyoqXG4gKiBTcGF3biBhIHN1YnByb2Nlc3Mgc3luY2hyb25vdXNseSBhbmQgd2FpdCBmb3IgZXhpdC5cbiAqXG4gKiBVbmxpa2Uge0BsaW5rIHNwYXdufSwgc3RkaW8gb3B0aW9ucyBhcmUgbGltaXRlZCB0byBgXCJpbmhlcml0XCJgLCBgXCJwaXBlXCJgLFxuICogYFwiaWdub3JlXCJgLCBhbmQgYFwiY2FwdHVyZVwiYCDigJQgbm8gcGVyLWxpbmUgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSB0byBydW4gKHJlc29sdmVkIG9uIGBQQVRIYCB3aGVuIGBzaGVsbGAgaXMgc2V0IG9uIG9wdGlvbnMpXG4gKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdmVyYmF0aW0gdG8gdGhlIGV4ZWN1dGFibGVcbiAqIEBwYXJhbSBzcGF3blN5bmMgLSBTcGF3biwgc3RkaW8sIGFuZCBjaGVjayBvcHRpb25zXG4gKiBAcmV0dXJucyBFeGl0IGNvZGUsIGNhcHR1cmVkIGxpbmUgYXJyYXlzLCBhbmQgdHJpbW1lZCBgc3Rkb3V0YCAvIGBzdGRlcnJgIGdldHRlcnNcbiAqIEB0aHJvd3MgV2hlbiBzcGF3biBmYWlscyBmb3IgYSByZWFzb24gb3RoZXIgdGhhbiBhIG1pc3NpbmcgZXhlY3V0YWJsZSwgb3JcbiAqIGBjaGVja2AgaXMgdHJ1ZSBhbmQgZXhpdCBjb2RlIGlzIG5vbi16ZXJvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoLi4uYXJnczogU3Bhd25BcmdzPFN5bmNFeGVjT3B0aW9ucz4pOiBFeGVjUmVzdWx0IHtcbiAgY29uc3QgeyBjb21tYW5kLCBjb21tYW5kQXJncywgb3B0aW9ucyA9IHt9IH0gPSBwYXJzZVNwYXduQXJncyhhcmdzKTtcbiAgcmVqZWN0U2lnbmFsT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgeyBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGNoZWNrLCB0cmltLCAuLi5zcGF3bk9wdHMgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHN0ZGluTW9kZTogRXhlY1N0ZGlvID0gaXNTdGRpblBheWxvYWQoc3RkaW4pID8gXCJwaXBlXCIgOiAoc3RkaW4gPz8gXCJpbmhlcml0XCIpO1xuICBjb25zdCBjYXB0dXJlU3Rkb3V0ID0gc3Rkb3V0ID09PSBcImNhcHR1cmVcIjtcbiAgY29uc3QgY2FwdHVyZVN0ZGVyciA9IHN0ZGVyciA9PT0gXCJjYXB0dXJlXCI7XG4gIGNvbnN0IHN0ZG91dE1vZGUgPSByZXNvbHZlU3luY1N0ZGlvKHN0ZG91dCk7XG4gIGNvbnN0IHN0ZGVyck1vZGUgPSByZXNvbHZlU3luY1N0ZGlvKHN0ZGVycik7XG5cbiAgY29uc3QgcmVzdWx0ID0gbm9kZVNwYXduU3luYyhjb21tYW5kLCBjb21tYW5kQXJncywge1xuICAgIC4uLnNwYXduT3B0cyxcbiAgICBlbmNvZGluZzogY2FwdHVyZVN0ZG91dCB8fCBjYXB0dXJlU3RkZXJyID8gXCJ1dGY4XCIgOiB1bmRlZmluZWQsXG4gICAgc3RkaW86IFtzdGRpbk1vZGUsIHN0ZG91dE1vZGUsIHN0ZGVyck1vZGVdLFxuICAgIGlucHV0OiBpc1N0ZGluUGF5bG9hZChzdGRpbikgPyBzdGRpbiA6IHVuZGVmaW5lZCxcbiAgfSk7XG5cbiAgY29uc3QgY29tbWFuZE5vdEZvdW5kID0gaXNDb21tYW5kTm90Rm91bmRFcnJvcihyZXN1bHQuZXJyb3IpO1xuICBjb25zdCBleGl0Q29kZSA9IGNvbW1hbmROb3RGb3VuZCA/IENPTU1BTkRfTk9UX0ZPVU5EX0VYSVRfQ09ERSA6IChyZXN1bHQuc3RhdHVzID8/IDEpO1xuICBjb25zdCBzdGRvdXRUZXh0ID0gY2FwdHVyZVN0ZG91dCA/IGNhcHR1cmVkVGV4dChyZXN1bHQuc3Rkb3V0KSA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RkZXJyVGV4dCA9IGNhcHR1cmVTdGRlcnIgPyBjYXB0dXJlZFRleHQocmVzdWx0LnN0ZGVycikgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGV4ZWNSZXN1bHQgPSBjcmVhdGVTeW5jRXhlY1Jlc3VsdChleGl0Q29kZSwgc3Rkb3V0VGV4dCwgc3RkZXJyVGV4dCwgdHJpbSk7XG5cbiAgaWYgKHJlc3VsdC5lcnJvciAmJiAoIWNvbW1hbmROb3RGb3VuZCB8fCBjaGVjaykpIHtcbiAgICBjb25zdCBlcnIgPSBleGVjRXJyb3IoY29tbWFuZCwgY29tbWFuZEFyZ3MsIGV4ZWNSZXN1bHQpO1xuICAgIGVyci5jYXVzZSA9IHJlc3VsdC5lcnJvcjtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBpZiAoY2hlY2sgJiYgZXhlY1Jlc3VsdC5leGl0Q29kZSAhPT0gMCkgdGhyb3cgZXhlY0Vycm9yKGNvbW1hbmQsIGNvbW1hbmRBcmdzLCBleGVjUmVzdWx0KTtcbiAgcmV0dXJuIGV4ZWNSZXN1bHQ7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgc2hlbGwtbGlrZSBjb21tYW5kIGludG8gYXJndi5cbiAqXG4gKiBTdXBwb3J0czpcbiAqICAgLSB3aGl0ZXNwYWNlIHNlcGFyYXRvcnNcbiAqICAgLSBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZXNcbiAqICAgLSBiYWNrc2xhc2ggZXNjYXBpbmdcbiAqICAgLSBlc2NhcGVkIHNwYWNlc1xuICogICAtIGVtcHR5IHF1b3RlZCBzdHJpbmdzXG4gKlxuICogSWYgdGhlIGlucHV0IGlzIG1hbGZvcm1lZCAoZm9yIGV4YW1wbGUsIGFuIHVudGVybWluYXRlZCBxdW90ZSksXG4gKiByZXR1cm5zIHRoZSBvcmlnaW5hbCBzdHJpbmcgYXMgYSBzaW5nbGUgYXJndW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGxleChjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgbGV0IGN1cnJlbnQgPSBcIlwiO1xuICBsZXQgcXVvdGU6IFwiJ1wiIHwgJ1wiJyB8IHVuZGVmaW5lZDtcbiAgbGV0IGVzY2FwZWQgPSBmYWxzZTtcbiAgbGV0IHF1b3RlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IHB1c2ggPSAoKSA9PiB7XG4gICAgaWYgKHF1b3RlZCB8fCBjdXJyZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIGFyZ3MucHVzaChjdXJyZW50KTtcbiAgICB9XG4gICAgY3VycmVudCA9IFwiXCI7XG4gICAgcXVvdGVkID0gZmFsc2U7XG4gIH07XG5cbiAgZm9yIChjb25zdCBjaCBvZiBjb21tYW5kKSB7XG4gICAgaWYgKGVzY2FwZWQpIHtcbiAgICAgIGN1cnJlbnQgKz0gY2g7XG4gICAgICBlc2NhcGVkID0gZmFsc2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY2ggPT09IFwiXFxcXFwiKSB7XG4gICAgICBlc2NhcGVkID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChxdW90ZSkge1xuICAgICAgaWYgKGNoID09PSBxdW90ZSkge1xuICAgICAgICBxdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcXVvdGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnQgKz0gY2g7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY2ggPT09IFwiJ1wiIHx8IGNoID09PSAnXCInKSB7XG4gICAgICBxdW90ZSA9IGNoO1xuICAgICAgcXVvdGVkID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICgvXFxzLy50ZXN0KGNoKSkge1xuICAgICAgcHVzaCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY3VycmVudCArPSBjaDtcbiAgfVxuXG4gIC8vIE1hbGZvcm1lZCBpbnB1dDogdHJlYXQgYXMgYSBsaXRlcmFsIGNvbW1hbmQuXG4gIGlmIChxdW90ZSkge1xuICAgIHJldHVybiBbY29tbWFuZF07XG4gIH1cblxuICAvLyBUcmFpbGluZyBiYWNrc2xhc2ggaXMgbGl0ZXJhbC5cbiAgaWYgKGVzY2FwZWQpIHtcbiAgICBjdXJyZW50ICs9IFwiXFxcXFwiO1xuICB9XG5cbiAgcHVzaCgpO1xuXG4gIHJldHVybiBhcmdzLmxlbmd0aCA/IGFyZ3MgOiBbY29tbWFuZF07XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"typescript": "^5.9.3"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
28
|
+
"@dbx-tools/shared-core": "^0.9.175",
|
|
29
29
|
"extract-zip": "^2.0.1",
|
|
30
30
|
"proper-lockfile": "^4.1.2",
|
|
31
31
|
"semver": "^7.7.3",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"./package.json": "./package.json"
|
|
48
48
|
}
|
|
49
49
|
},
|
|
50
|
-
"version": "0.9.
|
|
50
|
+
"version": "0.9.175",
|
|
51
51
|
"types": "./lib/index.d.ts",
|
|
52
52
|
"dbxToolsConfig": {
|
|
53
53
|
"tags": [
|
package/src/exec.ts
CHANGED
|
@@ -1022,22 +1022,23 @@ function linesFromCapturedOutput(output: string): string[] {
|
|
|
1022
1022
|
}
|
|
1023
1023
|
|
|
1024
1024
|
/**
|
|
1025
|
-
* Stop
|
|
1026
|
-
* process snapshots.
|
|
1025
|
+
* Stop an existing child process and every descendant discovered through
|
|
1026
|
+
* operating-system process snapshots.
|
|
1027
1027
|
*
|
|
1028
|
-
*
|
|
1029
|
-
*
|
|
1030
|
-
* the process table, merges newly created descendants, and sends each one the
|
|
1031
|
-
* active shutdown signal once. macOS and other POSIX platforms use `ps`;
|
|
1032
|
-
* Windows uses the built-in PowerShell CIM process provider.
|
|
1033
|
-
*
|
|
1034
|
-
* Windows does not implement POSIX signal semantics. Node terminates processes
|
|
1035
|
-
* unconditionally for supported signals there, including `SIGTERM`.
|
|
1028
|
+
* Use this when a caller must retain native `child_process.spawn` behavior but
|
|
1029
|
+
* still needs the same process-tree shutdown policy as {@link spawn}.
|
|
1036
1030
|
*
|
|
1037
1031
|
* @param child - Root child process whose snapshotted tree should stop
|
|
1038
1032
|
* @param options - Graceful and forced shutdown timeout policy
|
|
1039
|
-
* @param terminateSignal - Internal signal selected from the parent event or platform default
|
|
1040
1033
|
*/
|
|
1034
|
+
export async function shutdownProcessTree(
|
|
1035
|
+
child: ChildProcess,
|
|
1036
|
+
options: ChildProcessTerminationOptions = {},
|
|
1037
|
+
): Promise<void> {
|
|
1038
|
+
await terminateProcessTree(child, options);
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
/** Stop a process tree with an internally selected graceful signal. */
|
|
1041
1042
|
async function terminateProcessTree(
|
|
1042
1043
|
child: ChildProcess,
|
|
1043
1044
|
options: ChildProcessTerminationOptions = {},
|