@dbx-tools/lakebox 0.9.154 → 0.9.157
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.ts +7 -3
- package/lib/index.d.ts +7 -3
- package/lib/index.js +7 -4
- package/lib/src/_ssh_openssh.d.ts +1 -1
- package/lib/src/_ssh_openssh.js +13 -13
- package/lib/src/_ssh_ssh2.d.ts +1 -1
- package/lib/src/_ssh_ssh2.js +2 -2
- package/lib/src/key-store.js +3 -3
- package/lib/src/lifecycle.js +3 -3
- package/lib/src/rest.js +4 -4
- package/lib/src/session.d.ts +2 -3
- package/lib/src/session.js +6 -7
- package/lib/src/ssh.js +489 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -53
- package/src/_ssh_openssh.ts +13 -13
- package/src/_ssh_ssh2.ts +1 -1
- package/src/key-store.ts +2 -2
- package/src/lifecycle.ts +2 -2
- package/src/rest.ts +3 -3
- package/src/session.ts +5 -7
- package/src/{_ssh.ts → ssh.ts} +3 -3
- package/lib/src/_ssh.js +0 -489
- /package/lib/src/{_ssh.d.ts → ssh.d.ts} +0 -0
package/index.ts
CHANGED
|
@@ -3,16 +3,20 @@
|
|
|
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/lakebox";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.157";
|
|
7
7
|
export * as keyStore from "./src/key-store.ts";
|
|
8
8
|
export * as lifecycle from "./src/lifecycle.ts";
|
|
9
9
|
export * as rest from "./src/rest.ts";
|
|
10
10
|
export * as session from "./src/session.ts";
|
|
11
|
+
export * as ssh from "./src/ssh.ts";
|
|
11
12
|
export * as transport from "./src/transport.ts";
|
|
12
13
|
export { SshKeyStore } from "./src/key-store.ts";
|
|
13
|
-
export {
|
|
14
|
+
export { normalizeLakeboxStatus, lakeboxIdleTimeoutSeconds, ensureLakeboxRunning, ensureLakeboxStopped } from "./src/lifecycle.ts";
|
|
15
|
+
export { LakeboxEntrySchema, LakeboxSshKeySchema, LakeboxApiError, LakeboxClient, isLakeboxUnavailable } from "./src/rest.ts";
|
|
14
16
|
export type { LakeboxEntry, LakeboxSshKey, LakeboxAuth } from "./src/rest.ts";
|
|
15
|
-
export { SshSession } from "./src/session.ts";
|
|
17
|
+
export { SshSession, resolvePublicGatewayAddresses } from "./src/session.ts";
|
|
16
18
|
export type { SshSessionOptions } from "./src/session.ts";
|
|
19
|
+
export { SSH_POOL_MAX, SshCommand, PooledSshTransport, createSshTransport, sshCommandScript } from "./src/ssh.ts";
|
|
20
|
+
export type { SshExecutionOptions, SshCommandExecution, SshTransportOptions, SshTransport, SshResourceLifecycle, SshPoolOptions, SshTransportFactories, SshCommandIdentity } from "./src/ssh.ts";
|
|
17
21
|
export { SshTransportModeSchema, Ssh2PatchModeSchema } from "./src/transport.ts";
|
|
18
22
|
export type { SshTransportMode, Ssh2PatchMode } from "./src/transport.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/lakebox";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.157";
|
|
3
3
|
export * as keyStore from "./src/key-store.ts";
|
|
4
4
|
export * as lifecycle from "./src/lifecycle.ts";
|
|
5
5
|
export * as rest from "./src/rest.ts";
|
|
6
6
|
export * as session from "./src/session.ts";
|
|
7
|
+
export * as ssh from "./src/ssh.ts";
|
|
7
8
|
export * as transport from "./src/transport.ts";
|
|
8
9
|
export { SshKeyStore } from "./src/key-store.ts";
|
|
9
|
-
export {
|
|
10
|
+
export { normalizeLakeboxStatus, lakeboxIdleTimeoutSeconds, ensureLakeboxRunning, ensureLakeboxStopped } from "./src/lifecycle.ts";
|
|
11
|
+
export { LakeboxEntrySchema, LakeboxSshKeySchema, LakeboxApiError, LakeboxClient, isLakeboxUnavailable } from "./src/rest.ts";
|
|
10
12
|
export type { LakeboxEntry, LakeboxSshKey, LakeboxAuth } from "./src/rest.ts";
|
|
11
|
-
export { SshSession } from "./src/session.ts";
|
|
13
|
+
export { SshSession, resolvePublicGatewayAddresses } from "./src/session.ts";
|
|
12
14
|
export type { SshSessionOptions } from "./src/session.ts";
|
|
15
|
+
export { SSH_POOL_MAX, SshCommand, PooledSshTransport, createSshTransport, sshCommandScript } from "./src/ssh.ts";
|
|
16
|
+
export type { SshExecutionOptions, SshCommandExecution, SshTransportOptions, SshTransport, SshResourceLifecycle, SshPoolOptions, SshTransportFactories, SshCommandIdentity } from "./src/ssh.ts";
|
|
13
17
|
export { SshTransportModeSchema, Ssh2PatchModeSchema } from "./src/transport.ts";
|
|
14
18
|
export type { SshTransportMode, Ssh2PatchMode } from "./src/transport.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,14 +2,17 @@
|
|
|
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/lakebox";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.157";
|
|
6
6
|
export * as keyStore from "./src/key-store.js";
|
|
7
7
|
export * as lifecycle from "./src/lifecycle.js";
|
|
8
8
|
export * as rest from "./src/rest.js";
|
|
9
9
|
export * as session from "./src/session.js";
|
|
10
|
+
export * as ssh from "./src/ssh.js";
|
|
10
11
|
export * as transport from "./src/transport.js";
|
|
11
12
|
export { SshKeyStore } from "./src/key-store.js";
|
|
12
|
-
export {
|
|
13
|
-
export {
|
|
13
|
+
export { normalizeLakeboxStatus, lakeboxIdleTimeoutSeconds, ensureLakeboxRunning, ensureLakeboxStopped } from "./src/lifecycle.js";
|
|
14
|
+
export { LakeboxEntrySchema, LakeboxSshKeySchema, LakeboxApiError, LakeboxClient, isLakeboxUnavailable } from "./src/rest.js";
|
|
15
|
+
export { SshSession, resolvePublicGatewayAddresses } from "./src/session.js";
|
|
16
|
+
export { SSH_POOL_MAX, SshCommand, PooledSshTransport, createSshTransport, sshCommandScript } from "./src/ssh.js";
|
|
14
17
|
export { SshTransportModeSchema, Ssh2PatchModeSchema } from "./src/transport.js";
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxvQkFBb0IsQ0FBQztBQUN2RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxLQUFLLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx5QkFBeUIsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25JLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTlILE9BQU8sRUFBRSxVQUFVLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU3RSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVsSCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvbGFrZWJveFwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjE1N1wiO1xuZXhwb3J0ICogYXMga2V5U3RvcmUgZnJvbSBcIi4vc3JjL2tleS1zdG9yZS50c1wiO1xuZXhwb3J0ICogYXMgbGlmZWN5Y2xlIGZyb20gXCIuL3NyYy9saWZlY3ljbGUudHNcIjtcbmV4cG9ydCAqIGFzIHJlc3QgZnJvbSBcIi4vc3JjL3Jlc3QudHNcIjtcbmV4cG9ydCAqIGFzIHNlc3Npb24gZnJvbSBcIi4vc3JjL3Nlc3Npb24udHNcIjtcbmV4cG9ydCAqIGFzIHNzaCBmcm9tIFwiLi9zcmMvc3NoLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFuc3BvcnQgZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuZXhwb3J0IHsgU3NoS2V5U3RvcmUgfSBmcm9tIFwiLi9zcmMva2V5LXN0b3JlLnRzXCI7XG5leHBvcnQgeyBub3JtYWxpemVMYWtlYm94U3RhdHVzLCBsYWtlYm94SWRsZVRpbWVvdXRTZWNvbmRzLCBlbnN1cmVMYWtlYm94UnVubmluZywgZW5zdXJlTGFrZWJveFN0b3BwZWQgfSBmcm9tIFwiLi9zcmMvbGlmZWN5Y2xlLnRzXCI7XG5leHBvcnQgeyBMYWtlYm94RW50cnlTY2hlbWEsIExha2Vib3hTc2hLZXlTY2hlbWEsIExha2Vib3hBcGlFcnJvciwgTGFrZWJveENsaWVudCwgaXNMYWtlYm94VW5hdmFpbGFibGUgfSBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYm94RW50cnksIExha2Vib3hTc2hLZXksIExha2Vib3hBdXRoIH0gZnJvbSBcIi4vc3JjL3Jlc3QudHNcIjtcbmV4cG9ydCB7IFNzaFNlc3Npb24sIHJlc29sdmVQdWJsaWNHYXRld2F5QWRkcmVzc2VzIH0gZnJvbSBcIi4vc3JjL3Nlc3Npb24udHNcIjtcbmV4cG9ydCB0eXBlIHsgU3NoU2Vzc2lvbk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc2Vzc2lvbi50c1wiO1xuZXhwb3J0IHsgU1NIX1BPT0xfTUFYLCBTc2hDb21tYW5kLCBQb29sZWRTc2hUcmFuc3BvcnQsIGNyZWF0ZVNzaFRyYW5zcG9ydCwgc3NoQ29tbWFuZFNjcmlwdCB9IGZyb20gXCIuL3NyYy9zc2gudHNcIjtcbmV4cG9ydCB0eXBlIHsgU3NoRXhlY3V0aW9uT3B0aW9ucywgU3NoQ29tbWFuZEV4ZWN1dGlvbiwgU3NoVHJhbnNwb3J0T3B0aW9ucywgU3NoVHJhbnNwb3J0LCBTc2hSZXNvdXJjZUxpZmVjeWNsZSwgU3NoUG9vbE9wdGlvbnMsIFNzaFRyYW5zcG9ydEZhY3RvcmllcywgU3NoQ29tbWFuZElkZW50aXR5IH0gZnJvbSBcIi4vc3JjL3NzaC50c1wiO1xuZXhwb3J0IHsgU3NoVHJhbnNwb3J0TW9kZVNjaGVtYSwgU3NoMlBhdGNoTW9kZVNjaGVtYSB9IGZyb20gXCIuL3NyYy90cmFuc3BvcnQudHNcIjtcbmV4cG9ydCB0eXBlIHsgU3NoVHJhbnNwb3J0TW9kZSwgU3NoMlBhdGNoTW9kZSB9IGZyb20gXCIuL3NyYy90cmFuc3BvcnQudHNcIjtcbiJdfQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Duplex } from "node:stream";
|
|
2
|
-
import { PooledSshTransport, type SshCommandExecution, type SshPoolOptions, type SshResourceLifecycle, type SshTransportOptions } from "./
|
|
2
|
+
import { PooledSshTransport, type SshCommandExecution, type SshPoolOptions, type SshResourceLifecycle, type SshTransportOptions } from "./ssh.ts";
|
|
3
3
|
/** One authenticated native OpenSSH ControlMaster resource. */
|
|
4
4
|
export interface OpenSshResource {
|
|
5
5
|
run(script: string, execution: SshCommandExecution): Promise<number>;
|
package/lib/src/_ssh_openssh.js
CHANGED
|
@@ -3,10 +3,10 @@ import { createConnection, createServer } from "node:net";
|
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { setTimeout as delay } from "node:timers/promises";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { spawn, onParentTerminationSignal } from "@dbx-tools/core";
|
|
7
|
+
import { log, toError, dedent } from "@dbx-tools/shared-core";
|
|
8
8
|
import { SocksClient } from "socks";
|
|
9
|
-
import { PooledSshTransport, } from "./
|
|
9
|
+
import { PooledSshTransport, } from "./ssh.js";
|
|
10
10
|
const SOCKS_HOST = "127.0.0.1";
|
|
11
11
|
const OPENSSH_HELPER_TIMEOUT_MS = 2_000;
|
|
12
12
|
const logger = log.logger("lakebox:openssh");
|
|
@@ -16,7 +16,7 @@ const parentBoundNativeOpenSshProcesses = new WeakSet();
|
|
|
16
16
|
let stopParentTerminationSignal;
|
|
17
17
|
let processExitHookInstalled = false;
|
|
18
18
|
/** @internal JavaScript watchdog that terminates one child when its parent pipe closes. */
|
|
19
|
-
export const OPENSSH_PARENT_WATCH_SOURCE =
|
|
19
|
+
export const OPENSSH_PARENT_WATCH_SOURCE = dedent(// ============================================================================
|
|
20
20
|
/*js*/ `
|
|
21
21
|
const { spawn } = require("node:child_process");
|
|
22
22
|
|
|
@@ -133,7 +133,7 @@ class NativeOpenSshResource {
|
|
|
133
133
|
const controlPath = join(directory, "control");
|
|
134
134
|
const socksPort = await availableLoopbackPort();
|
|
135
135
|
const target = `${options.username}@${options.connectHost}`;
|
|
136
|
-
const master = trackNativeOpenSshProcess(
|
|
136
|
+
const master = trackNativeOpenSshProcess(spawn(process.execPath, [
|
|
137
137
|
"-e",
|
|
138
138
|
OPENSSH_PARENT_WATCH_SOURCE,
|
|
139
139
|
command,
|
|
@@ -172,7 +172,7 @@ class NativeOpenSshResource {
|
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
async run(script, execution) {
|
|
175
|
-
const child = trackNativeOpenSshProcess(
|
|
175
|
+
const child = trackNativeOpenSshProcess(spawn(this.command, [
|
|
176
176
|
...nativeOpenSshArgs(this.options),
|
|
177
177
|
"-S",
|
|
178
178
|
this.controlPath,
|
|
@@ -192,7 +192,7 @@ class NativeOpenSshResource {
|
|
|
192
192
|
let shutdown;
|
|
193
193
|
execution.setCancel(() => {
|
|
194
194
|
shutdown ??= child.shutdown({ terminateTimeout: 0, killTimeout: 1_000 }).catch((error) => {
|
|
195
|
-
logger.warn("failed to stop native SSH command", { error:
|
|
195
|
+
logger.warn("failed to stop native SSH command", { error: toError(error) });
|
|
196
196
|
});
|
|
197
197
|
return shutdown;
|
|
198
198
|
});
|
|
@@ -231,7 +231,7 @@ class NativeOpenSshResource {
|
|
|
231
231
|
}
|
|
232
232
|
finally {
|
|
233
233
|
await this.master.shutdown({ terminateTimeout: 0, killTimeout: 1_000 }).catch((error) => logger.warn("failed to stop native SSH ControlMaster", {
|
|
234
|
-
error:
|
|
234
|
+
error: toError(error),
|
|
235
235
|
}));
|
|
236
236
|
await rm(this.directory, { recursive: true, force: true });
|
|
237
237
|
}
|
|
@@ -250,7 +250,7 @@ class NativeOpenSshResource {
|
|
|
250
250
|
throw new Error(`Native OpenSSH ControlMaster did not become ready within ${this.options.connectTimeoutMs}ms`);
|
|
251
251
|
}
|
|
252
252
|
control(operation) {
|
|
253
|
-
const child = trackNativeOpenSshProcess(
|
|
253
|
+
const child = trackNativeOpenSshProcess(spawn(this.command, [
|
|
254
254
|
"-p",
|
|
255
255
|
String(this.options.port),
|
|
256
256
|
"-S",
|
|
@@ -269,7 +269,7 @@ class NativeOpenSshResource {
|
|
|
269
269
|
}
|
|
270
270
|
async function probeNativeOpenSsh(command) {
|
|
271
271
|
try {
|
|
272
|
-
const version = await waitForNativeOpenSshChild(trackNativeOpenSshProcess(
|
|
272
|
+
const version = await waitForNativeOpenSshChild(trackNativeOpenSshProcess(spawn(command, ["-V"], {
|
|
273
273
|
stdin: "ignore",
|
|
274
274
|
stdout: "capture",
|
|
275
275
|
stderr: "capture",
|
|
@@ -278,7 +278,7 @@ async function probeNativeOpenSsh(command) {
|
|
|
278
278
|
const versionOutput = `${version.stdout}\n${version.stderr}`;
|
|
279
279
|
if (version.exitCode !== 0 || !/(?:^|\s)OpenSSH_/m.test(versionOutput))
|
|
280
280
|
return false;
|
|
281
|
-
const dynamicForward = await waitForNativeOpenSshChild(trackNativeOpenSshProcess(
|
|
281
|
+
const dynamicForward = await waitForNativeOpenSshChild(trackNativeOpenSshProcess(spawn(command, ["-G", "-D", `${SOCKS_HOST}:1`, "localhost"], {
|
|
282
282
|
stdin: "ignore",
|
|
283
283
|
stdout: "ignore",
|
|
284
284
|
stderr: "ignore",
|
|
@@ -310,7 +310,7 @@ function trackNativeOpenSshProcess(child, parentBound = false) {
|
|
|
310
310
|
if (parentBound)
|
|
311
311
|
parentBoundNativeOpenSshProcesses.add(child);
|
|
312
312
|
if (!stopParentTerminationSignal) {
|
|
313
|
-
stopParentTerminationSignal =
|
|
313
|
+
stopParentTerminationSignal = onParentTerminationSignal(forceStopNativeOpenSshProcesses);
|
|
314
314
|
}
|
|
315
315
|
if (!processExitHookInstalled) {
|
|
316
316
|
processExitHookInstalled = true;
|
|
@@ -379,4 +379,4 @@ function canConnectLoopback(port) {
|
|
|
379
379
|
socket.once("connect", () => finish(true));
|
|
380
380
|
});
|
|
381
381
|
}
|
|
382
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3NzaF9vcGVuc3NoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19zc2hfb3BlbnNzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sRUFBRSxVQUFVLElBQUksS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDcEMsT0FBTyxFQUNMLGtCQUFrQixHQUtuQixNQUFNLFdBQVcsQ0FBQztBQUVuQixNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUM7QUFDL0IsTUFBTSx5QkFBeUIsR0FBRyxLQUFLLENBQUM7QUFDeEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzdDLE1BQU0sNkJBQTZCLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7QUFDMUUsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztBQUNuRSxNQUFNLGlDQUFpQyxHQUFHLElBQUksT0FBTyxFQUFzQixDQUFDO0FBQzVFLElBQUksMkJBQXFELENBQUM7QUFDMUQsSUFBSSx3QkFBd0IsR0FBRyxLQUFLLENBQUM7QUFDckMsMkZBQTJGO0FBQzNGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixH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c1wiO1xuaW1wb3J0IHsgY3JlYXRlQ29ubmVjdGlvbiwgY3JlYXRlU2VydmVyIH0gZnJvbSBcIm5vZGU6bmV0XCI7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgRHVwbGV4IH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIGRlbGF5IH0gZnJvbSBcIm5vZGU6dGltZXJzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3NSZXN1bHQgfSBmcm9tIFwiQGRieC10b29scy9jb3JlL2V4ZWNcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGxvZywgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgU29ja3NDbGllbnQgfSBmcm9tIFwic29ja3NcIjtcbmltcG9ydCB7XG4gIFBvb2xlZFNzaFRyYW5zcG9ydCxcbiAgdHlwZSBTc2hDb21tYW5kRXhlY3V0aW9uLFxuICB0eXBlIFNzaFBvb2xPcHRpb25zLFxuICB0eXBlIFNzaFJlc291cmNlTGlmZWN5Y2xlLFxuICB0eXBlIFNzaFRyYW5zcG9ydE9wdGlvbnMsXG59IGZyb20gXCIuL19zc2gudHNcIjtcblxuY29uc3QgU09DS1NfSE9TVCA9IFwiMTI3LjAuMC4xXCI7XG5jb25zdCBPUEVOU1NIX0hFTFBFUl9USU1FT1VUX01TID0gMl8wMDA7XG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibGFrZWJveDpvcGVuc3NoXCIpO1xuY29uc3QgbmF0aXZlT3BlblNzaFN1cHBvcnRCeUNvbW1hbmQgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxib29sZWFuPj4oKTtcbmNvbnN0IGFjdGl2ZU5hdGl2ZU9wZW5Tc2hQcm9jZXNzZXMgPSBuZXcgU2V0PENoaWxkUHJvY2Vzc1Jlc3VsdD4oKTtcbmNvbnN0IHBhcmVudEJvdW5kTmF0aXZlT3BlblNzaFByb2Nlc3NlcyA9IG5ldyBXZWFrU2V0PENoaWxkUHJvY2Vzc1Jlc3VsdD4oKTtcbmxldCBzdG9wUGFyZW50VGVybWluYXRpb25TaWduYWw6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbmxldCBwcm9jZXNzRXhpdEhvb2tJbnN0YWxsZWQgPSBmYWxzZTtcbi8qKiBAaW50ZXJuYWwgSmF2YVNjcmlwdCB3YXRjaGRvZyB0aGF0IHRlcm1pbmF0ZXMgb25lIGNoaWxkIHdoZW4gaXRzIHBhcmVudCBwaXBlIGNsb3Nlcy4gKi9cbmV4cG9ydCBjb25zdCBPUEVOU1NIX1BBUkVOVF9XQVRDSF9TT1VSQ0UgPVxuICBzdHJpbmdVdGlscy5kZWRlbnQoLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKmpzKi8gYFxuICAgIGNvbnN0IHsgc3Bhd24gfSA9IHJlcXVpcmUoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIik7XG5cbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKHByb2Nlc3MuYXJndlsxXSwgcHJvY2Vzcy5hcmd2LnNsaWNlKDIpLCB7XG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwiaW5oZXJpdFwiXSxcbiAgICB9KTtcbiAgICBsZXQgc3RvcHBpbmcgPSBmYWxzZTtcbiAgICBjb25zdCBzdG9wQ2hpbGQgPSAoKSA9PiB7XG4gICAgICBpZiAoc3RvcHBpbmcpIHJldHVybjtcbiAgICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICAgIGNoaWxkLmtpbGwoXCJTSUdLSUxMXCIpO1xuICAgIH07XG5cbiAgICBwcm9jZXNzLnN0ZGluLnJlc3VtZSgpO1xuICAgIHByb2Nlc3Muc3RkaW4ub25jZShcImVuZFwiLCBzdG9wQ2hpbGQpO1xuICAgIHByb2Nlc3Muc3RkaW4ub25jZShcImNsb3NlXCIsIHN0b3BDaGlsZCk7XG4gICAgY2hpbGQub25jZShcImVycm9yXCIsIChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfSk7XG4gICAgY2hpbGQub25jZShcImV4aXRcIiwgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgcHJvY2Vzcy5zdGRpbi5wYXVzZSgpO1xuICAgICAgcHJvY2Vzcy5leGl0KGNvZGUgPz8gKHNpZ25hbCA/IDEgOiAwKSk7XG4gICAgfSk7XG4gIGApO1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogT25lIGF1dGhlbnRpY2F0ZWQgbmF0aXZlIE9wZW5TU0ggQ29udHJvbE1hc3RlciByZXNvdXJjZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlblNzaFJlc291cmNlIHtcbiAgcnVuKHNjcmlwdDogc3RyaW5nLCBleGVjdXRpb246IFNzaENvbW1hbmRFeGVjdXRpb24pOiBQcm9taXNlPG51bWJlcj47XG4gIGNvbm5lY3QocmVtb3RlSG9zdDogc3RyaW5nLCByZW1vdGVQb3J0OiBudW1iZXIpOiBQcm9taXNlPER1cGxleD47XG4gIHRlc3QoKTogUHJvbWlzZTxib29sZWFuPjtcbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqIEV4Y2x1c2l2ZSBuYXRpdmUgT3BlblNTSCBDb250cm9sTWFzdGVyIHBvb2wuICovXG5leHBvcnQgY2xhc3MgT3BlblNzaFRyYW5zcG9ydCBleHRlbmRzIFBvb2xlZFNzaFRyYW5zcG9ydDxPcGVuU3NoUmVzb3VyY2U+IHtcbiAgcmVhZG9ubHkga2luZCA9IFwib3BlbnNzaFwiIGFzIGNvbnN0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IFNzaFRyYW5zcG9ydE9wdGlvbnMsXG4gICAgY29tbWFuZDogc3RyaW5nLFxuICAgIHBvb2xPcHRpb25zOiBTc2hQb29sT3B0aW9ucyA9IHt9LFxuICAgIGxpZmVjeWNsZTogU3NoUmVzb3VyY2VMaWZlY3ljbGU8T3BlblNzaFJlc291cmNlPiA9IG9wZW5Tc2hMaWZlY3ljbGUob3B0aW9ucywgY29tbWFuZCksXG4gICkge1xuICAgIHN1cGVyKGxpZmVjeWNsZSwge1xuICAgICAgYWNxdWlyZVRpbWVvdXRNaWxsaXM6IG9wdGlvbnMuY29ubmVjdFRpbWVvdXRNcyxcbiAgICAgIC4uLnBvb2xPcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJ1bldpdGhSZXNvdXJjZShcbiAgICByZXNvdXJjZTogT3BlblNzaFJlc291cmNlLFxuICAgIHNjcmlwdDogc3RyaW5nLFxuICAgIGV4ZWN1dGlvbjogU3NoQ29tbWFuZEV4ZWN1dGlvbixcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gcmVzb3VyY2UucnVuKHNjcmlwdCwgZXhlY3V0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25uZWN0V2l0aFJlc291cmNlKFxuICAgIHJlc291cmNlOiBPcGVuU3NoUmVzb3VyY2UsXG4gICAgcmVtb3RlSG9zdDogc3RyaW5nLFxuICAgIHJlbW90ZVBvcnQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxEdXBsZXg+IHtcbiAgICByZXR1cm4gcmVzb3VyY2UuY29ubmVjdChyZW1vdGVIb3N0LCByZW1vdGVQb3J0KTtcbiAgfVxufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgYW4gZXhlY3V0YWJsZSBpcyBPcGVuU1NIIGFuZCBhY2NlcHRzIGR5bmFtaWMgU09DS1M1IGZvcndhcmRpbmcuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3VwcG9ydHNOYXRpdmVPcGVuU3NoKGNvbW1hbmQgPSBcInNzaFwiKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNhY2hlZCA9IG5hdGl2ZU9wZW5Tc2hTdXBwb3J0QnlDb21tYW5kLmdldChjb21tYW5kKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgY29uc3QgcHJvYmUgPSBwcm9iZU5hdGl2ZU9wZW5Tc2goY29tbWFuZCk7XG4gIG5hdGl2ZU9wZW5Tc2hTdXBwb3J0QnlDb21tYW5kLnNldChjb21tYW5kLCBwcm9iZSk7XG4gIHJldHVybiBwcm9iZTtcbn1cblxuLyoqIEBpbnRlcm5hbCBPcGVuU1NIIGFyZ3VtZW50cyBzaGFyZWQgYnkgcG9vbGVkIENvbnRyb2xNYXN0ZXIgcHJvY2Vzc2VzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZU9wZW5Tc2hBcmdzKG9wdGlvbnM6IFNzaFRyYW5zcG9ydE9wdGlvbnMpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgXCItaVwiLFxuICAgIG9wdGlvbnMucHJpdmF0ZUtleVBhdGgsXG4gICAgXCItcFwiLFxuICAgIFN0cmluZyhvcHRpb25zLnBvcnQpLFxuICAgIFwiLVRcIixcbiAgICBcIi1vXCIsXG4gICAgXCJCYXRjaE1vZGU9eWVzXCIsXG4gICAgXCItb1wiLFxuICAgIFwiSWRlbnRpdGllc09ubHk9eWVzXCIsXG4gICAgXCItb1wiLFxuICAgIFwiRm9yd2FyZEFnZW50PW5vXCIsXG4gICAgXCItb1wiLFxuICAgIFwiUHJlZmVycmVkQXV0aGVudGljYXRpb25zPXB1YmxpY2tleVwiLFxuICAgIFwiLW9cIixcbiAgICBcIlN0cmljdEhvc3RLZXlDaGVja2luZz15ZXNcIixcbiAgICBcIi1vXCIsXG4gICAgYFVzZXJLbm93bkhvc3RzRmlsZT0ke29wdGlvbnMua25vd25Ib3N0c1BhdGh9YCxcbiAgICBcIi1vXCIsXG4gICAgYEhvc3RLZXlBbGlhcz1bJHtvcHRpb25zLmhvc3R9XToke29wdGlvbnMucG9ydH1gLFxuICAgIFwiLW9cIixcbiAgICBcIkxvZ0xldmVsPUVSUk9SXCIsXG4gICAgXCItb1wiLFxuICAgIGBDb25uZWN0VGltZW91dD0ke01hdGgubWF4KDEsIE1hdGguY2VpbChvcHRpb25zLmNvbm5lY3RUaW1lb3V0TXMgLyAxXzAwMCkpfWAsXG4gICAgXCItb1wiLFxuICAgIFwiU2VydmVyQWxpdmVJbnRlcnZhbD0xNVwiLFxuICAgIFwiLW9cIixcbiAgICBcIlNlcnZlckFsaXZlQ291bnRNYXg9M1wiLFxuICBdO1xufVxuXG5mdW5jdGlvbiBvcGVuU3NoTGlmZWN5Y2xlKFxuICBvcHRpb25zOiBTc2hUcmFuc3BvcnRPcHRpb25zLFxuICBjb21tYW5kOiBzdHJpbmcsXG4pOiBTc2hSZXNvdXJjZUxpZmVjeWNsZTxPcGVuU3NoUmVzb3VyY2U+IHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6ICgpID0+IE5hdGl2ZU9wZW5Tc2hSZXNvdXJjZS5jcmVhdGUob3B0aW9ucywgY29tbWFuZCksXG4gICAgZGVzdHJveTogKHJlc291cmNlKSA9PiByZXNvdXJjZS5jbG9zZSgpLFxuICAgIHRlc3Q6IChyZXNvdXJjZSkgPT4gcmVzb3VyY2UudGVzdCgpLFxuICB9O1xufVxuXG5jbGFzcyBOYXRpdmVPcGVuU3NoUmVzb3VyY2UgaW1wbGVtZW50cyBPcGVuU3NoUmVzb3VyY2Uge1xuICBwcml2YXRlIGFsaXZlID0gdHJ1ZTtcbiAgcHJpdmF0ZSBjbG9zaW5nPzogUHJvbWlzZTx2b2lkPjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogU3NoVHJhbnNwb3J0T3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udHJvbFBhdGg6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNvY2tzUG9ydDogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFzdGVyOiBDaGlsZFByb2Nlc3NSZXN1bHQsXG4gICkge1xuICAgIGNvbnN0IGNsb3NlZCA9ICgpID0+IHtcbiAgICAgIHRoaXMuYWxpdmUgPSBmYWxzZTtcbiAgICB9O1xuICAgIHZvaWQgbWFzdGVyLnRoZW4oY2xvc2VkLCBjbG9zZWQpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZShcbiAgICBvcHRpb25zOiBTc2hUcmFuc3BvcnRPcHRpb25zLFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxOYXRpdmVPcGVuU3NoUmVzb3VyY2U+IHtcbiAgICBjb25zdCBkaXJlY3RvcnkgPSBhd2FpdCBta2R0ZW1wKGpvaW4odG1wZGlyKCksIFwiZGJ4LXRvb2xzLXNzaC1cIikpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250cm9sUGF0aCA9IGpvaW4oZGlyZWN0b3J5LCBcImNvbnRyb2xcIik7XG4gICAgICBjb25zdCBzb2Nrc1BvcnQgPSBhd2FpdCBhdmFpbGFibGVMb29wYmFja1BvcnQoKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGAke29wdGlvbnMudXNlcm5hbWV9QCR7b3B0aW9ucy5jb25uZWN0SG9zdH1gO1xuICAgICAgY29uc3QgbWFzdGVyID0gdHJhY2tOYXRpdmVPcGVuU3NoUHJvY2VzcyhcbiAgICAgICAgZXhlYy5zcGF3bihcbiAgICAgICAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIFwiLWVcIixcbiAgICAgICAgICAgIE9QRU5TU0hfUEFSRU5UX1dBVENIX1NPVVJDRSxcbiAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICAuLi5uYXRpdmVPcGVuU3NoQXJncyhvcHRpb25zKSxcbiAgICAgICAgICAgIFwiLU1cIixcbiAgICAgICAgICAgIFwiLU5cIixcbiAgICAgICAgICAgIFwiLVNcIixcbiAgICAgICAgICAgIGNvbnRyb2xQYXRoLFxuICAgICAgICAgICAgXCItb1wiLFxuICAgICAgICAgICAgXCJDb250cm9sUGVyc2lzdD1ub1wiLFxuICAgICAgICAgICAgXCItb1wiLFxuICAgICAgICAgICAgXCJFeGl0T25Gb3J3YXJkRmFpbHVyZT15ZXNcIixcbiAgICAgICAgICAgIFwiLURcIixcbiAgICAgICAgICAgIGAke1NPQ0tTX0hPU1R9OiR7c29ja3NQb3J0fWAsXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgXSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGRpbjogXCJwaXBlXCIsXG4gICAgICAgICAgICBzdGRvdXQ6IFwiaWdub3JlXCIsXG4gICAgICAgICAgICBzdGRlcnI6IFwiY2FwdHVyZVwiLFxuICAgICAgICAgICAgdHJpbTogZmFsc2UsXG4gICAgICAgICAgICBmb3J3YXJkVGVybWluYXRpb25TaWduYWxzOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICB0cnVlLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gbmV3IE5hdGl2ZU9wZW5Tc2hSZXNvdXJjZShcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgZGlyZWN0b3J5LFxuICAgICAgICBjb250cm9sUGF0aCxcbiAgICAgICAgc29ja3NQb3J0LFxuICAgICAgICBtYXN0ZXIsXG4gICAgICApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVzb3VyY2Uud2FpdFVudGlsUmVhZHkoKTtcbiAgICAgICAgcmV0dXJuIHJlc291cmNlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgYXdhaXQgcmVzb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHJtKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcnVuKHNjcmlwdDogc3RyaW5nLCBleGVjdXRpb246IFNzaENvbW1hbmRFeGVjdXRpb24pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGNoaWxkID0gdHJhY2tOYXRpdmVPcGVuU3NoUHJvY2VzcyhcbiAgICAgIGV4ZWMuc3Bhd24oXG4gICAgICAgIHRoaXMuY29tbWFuZCxcbiAgICAgICAgW1xuICAgICAgICAgIC4uLm5hdGl2ZU9wZW5Tc2hBcmdzKHRoaXMub3B0aW9ucyksXG4gICAgICAgICAgXCItU1wiLFxuICAgICAgICAgIHRoaXMuY29udHJvbFBhdGgsXG4gICAgICAgICAgXCItb1wiLFxuICAgICAgICAgIFwiQ29udHJvbE1hc3Rlcj1ub1wiLFxuICAgICAgICAgIGAke3RoaXMub3B0aW9ucy51c2VybmFtZX1AJHt0aGlzLm9wdGlvbnMuY29ubmVjdEhvc3R9YCxcbiAgICAgICAgICBzY3JpcHQsXG4gICAgICAgIF0sXG4gICAgICAgIHtcbiAgICAgICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgICAgICBzdGRvdXQ6IFwicGlwZVwiLFxuICAgICAgICAgIHN0ZGVycjogXCJwaXBlXCIsXG4gICAgICAgICAgdHJpbTogZmFsc2UsXG4gICAgICAgICAgZm9yd2FyZFRlcm1pbmF0aW9uU2lnbmFsczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICk7XG4gICAgY2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgZXhlY3V0aW9uLnN0ZG91dCk7XG4gICAgY2hpbGQuc3RkZXJyPy5vbihcImRhdGFcIiwgZXhlY3V0aW9uLnN0ZGVycik7XG4gICAgbGV0IHNodXRkb3duOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICAgIGV4ZWN1dGlvbi5zZXRDYW5jZWwoKCkgPT4ge1xuICAgICAgc2h1dGRvd24gPz89IGNoaWxkLnNodXRkb3duKHsgdGVybWluYXRlVGltZW91dDogMCwga2lsbFRpbWVvdXQ6IDFfMDAwIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBsb2dnZXIud2FybihcImZhaWxlZCB0byBzdG9wIG5hdGl2ZSBTU0ggY29tbWFuZFwiLCB7IGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyb3IpIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gc2h1dGRvd247XG4gICAgfSk7XG4gICAgcmV0dXJuIChhd2FpdCBjaGlsZCkuZXhpdENvZGU7XG4gIH1cblxuICBhc3luYyBjb25uZWN0KHJlbW90ZUhvc3Q6IHN0cmluZywgcmVtb3RlUG9ydDogbnVtYmVyKTogUHJvbWlzZTxEdXBsZXg+IHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgU29ja3NDbGllbnQuY3JlYXRlQ29ubmVjdGlvbih7XG4gICAgICBjb21tYW5kOiBcImNvbm5lY3RcIixcbiAgICAgIGRlc3RpbmF0aW9uOiB7IGhvc3Q6IHJlbW90ZUhvc3QsIHBvcnQ6IHJlbW90ZVBvcnQgfSxcbiAgICAgIHByb3h5OiB7IGhvc3Q6IFNPQ0tTX0hPU1QsIHBvcnQ6IHRoaXMuc29ja3NQb3J0LCB0eXBlOiA1IH0sXG4gICAgICB0aW1lb3V0OiB0aGlzLm9wdGlvbnMuY29ubmVjdFRpbWVvdXRNcyxcbiAgICAgIHNldF90Y3Bfbm9kZWxheTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gY29ubmVjdGlvbi5zb2NrZXQ7XG4gIH1cblxuICBhc3luYyB0ZXN0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5hbGl2ZSB8fCB0aGlzLm1hc3Rlci5leGl0Q29kZSAhPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IHRoaXMuY29udHJvbChcImNoZWNrXCIpKS5leGl0Q29kZSA9PT0gMDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbG9zaW5nKSByZXR1cm4gdGhpcy5jbG9zaW5nO1xuICAgIHRoaXMuYWxpdmUgPSBmYWxzZTtcbiAgICB0aGlzLmNsb3NpbmcgPSB0aGlzLmNsb3NlUmVzb3VyY2UoKTtcbiAgICByZXR1cm4gdGhpcy5jbG9zaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbG9zZVJlc291cmNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbnRyb2woXCJleGl0XCIpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMubWFzdGVyLnNodXRkb3duKHsgdGVybWluYXRlVGltZW91dDogMCwga2lsbFRpbWVvdXQ6IDFfMDAwIH0pLmNhdGNoKChlcnJvcikgPT5cbiAgICAgICAgbG9nZ2VyLndhcm4oXCJmYWlsZWQgdG8gc3RvcCBuYXRpdmUgU1NIIENvbnRyb2xNYXN0ZXJcIiwge1xuICAgICAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyb3IpLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBybSh0aGlzLmRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdFVudGlsUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGhpcy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0TXM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgaWYgKHRoaXMubWFzdGVyLmV4aXRDb2RlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubWFzdGVyO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5hdGl2ZSBPcGVuU1NIIENvbnRyb2xNYXN0ZXIgZXhpdGVkICgke3Jlc3VsdC5leGl0Q29kZX0pOiAke3Jlc3VsdC5zdGRlcnIudHJpbSgpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoKGF3YWl0IHRoaXMudGVzdCgpKSAmJiAoYXdhaXQgY2FuQ29ubmVjdExvb3BiYWNrKHRoaXMuc29ja3NQb3J0KSkpIHJldHVybjtcbiAgICAgIGF3YWl0IGRlbGF5KDUwKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE5hdGl2ZSBPcGVuU1NIIENvbnRyb2xNYXN0ZXIgZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7dGhpcy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0TXN9bXNgLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnRyb2wob3BlcmF0aW9uOiBcImNoZWNrXCIgfCBcImV4aXRcIikge1xuICAgIGNvbnN0IGNoaWxkID0gdHJhY2tOYXRpdmVPcGVuU3NoUHJvY2VzcyhcbiAgICAgIGV4ZWMuc3Bhd24oXG4gICAgICAgIHRoaXMuY29tbWFuZCxcbiAgICAgICAgW1xuICAgICAgICAgIFwiLXBcIixcbiAgICAgICAgICBTdHJpbmcodGhpcy5vcHRpb25zLnBvcnQpLFxuICAgICAgICAgIFwiLVNcIixcbiAgICAgICAgICB0aGlzLmNvbnRyb2xQYXRoLFxuICAgICAgICAgIFwiLU9cIixcbiAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAgYCR7dGhpcy5vcHRpb25zLnVzZXJuYW1lfUAke3RoaXMub3B0aW9ucy5jb25uZWN0SG9zdH1gLFxuICAgICAgICBdLFxuICAgICAgICB7XG4gICAgICAgICAgc3RkaW46IFwiaWdub3JlXCIsXG4gICAgICAgICAgc3Rkb3V0OiBcImlnbm9yZVwiLFxuICAgICAgICAgIHN0ZGVycjogXCJpZ25vcmVcIixcbiAgICAgICAgICBmb3J3YXJkVGVybWluYXRpb25TaWduYWxzOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4gd2FpdEZvck5hdGl2ZU9wZW5Tc2hDaGlsZChjaGlsZCwgYHNzaCAtTyAke29wZXJhdGlvbn1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9iZU5hdGl2ZU9wZW5Tc2goY29tbWFuZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IHdhaXRGb3JOYXRpdmVPcGVuU3NoQ2hpbGQoXG4gICAgICB0cmFja05hdGl2ZU9wZW5Tc2hQcm9jZXNzKFxuICAgICAgICBleGVjLnNwYXduKGNvbW1hbmQsIFtcIi1WXCJdLCB7XG4gICAgICAgICAgc3RkaW46IFwiaWdub3JlXCIsXG4gICAgICAgICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICAgICAgICBzdGRlcnI6IFwiY2FwdHVyZVwiLFxuICAgICAgICAgIGZvcndhcmRUZXJtaW5hdGlvblNpZ25hbHM6IGZhbHNlLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBcInNzaCAtVlwiLFxuICAgICk7XG4gICAgY29uc3QgdmVyc2lvbk91dHB1dCA9IGAke3ZlcnNpb24uc3Rkb3V0fVxcbiR7dmVyc2lvbi5zdGRlcnJ9YDtcbiAgICBpZiAodmVyc2lvbi5leGl0Q29kZSAhPT0gMCB8fCAhLyg/Ol58XFxzKU9wZW5TU0hfL20udGVzdCh2ZXJzaW9uT3V0cHV0KSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGR5bmFtaWNGb3J3YXJkID0gYXdhaXQgd2FpdEZvck5hdGl2ZU9wZW5Tc2hDaGlsZChcbiAgICAgIHRyYWNrTmF0aXZlT3BlblNzaFByb2Nlc3MoXG4gICAgICAgIGV4ZWMuc3Bhd24oY29tbWFuZCwgW1wiLUdcIiwgXCItRFwiLCBgJHtTT0NLU19IT1NUfToxYCwgXCJsb2NhbGhvc3RcIl0sIHtcbiAgICAgICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgICAgICBzdGRvdXQ6IFwiaWdub3JlXCIsXG4gICAgICAgICAgc3RkZXJyOiBcImlnbm9yZVwiLFxuICAgICAgICAgIGZvcndhcmRUZXJtaW5hdGlvblNpZ25hbHM6IGZhbHNlLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBcInNzaCAtR1wiLFxuICAgICk7XG4gICAgcmV0dXJuIGR5bmFtaWNGb3J3YXJkLmV4aXRDb2RlID09PSAwO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvck5hdGl2ZU9wZW5Tc2hDaGlsZChcbiAgY2hpbGQ6IENoaWxkUHJvY2Vzc1Jlc3VsdCxcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4pOiBQcm9taXNlPEF3YWl0ZWQ8Q2hpbGRQcm9jZXNzUmVzdWx0Pj4ge1xuICBsZXQgdGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIGNvbnN0IHRpbWVkT3V0ID0gbmV3IFByb21pc2U8bmV2ZXI+KChfcmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdm9pZCBjaGlsZC5zaHV0ZG93bih7IHRlcm1pbmF0ZVRpbWVvdXQ6IDAsIGtpbGxUaW1lb3V0OiAxXzAwMCB9KS50aGVuKFxuICAgICAgICAoKSA9PiByZWplY3QobmV3IEVycm9yKGAke29wZXJhdGlvbn0gdGltZWQgb3V0IGFmdGVyICR7T1BFTlNTSF9IRUxQRVJfVElNRU9VVF9NU31tc2ApKSxcbiAgICAgICAgKGVycm9yKSA9PiByZWplY3QoZXJyb3IpLFxuICAgICAgKTtcbiAgICB9LCBPUEVOU1NIX0hFTFBFUl9USU1FT1VUX01TKTtcbiAgICB0aW1lb3V0LnVucmVmPy4oKTtcbiAgfSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbY2hpbGQsIHRpbWVkT3V0XSk7XG4gIH0gZmluYWxseSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQhKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFja05hdGl2ZU9wZW5Tc2hQcm9jZXNzKFxuICBjaGlsZDogQ2hpbGRQcm9jZXNzUmVzdWx0LFxuICBwYXJlbnRCb3VuZCA9IGZhbHNlLFxuKTogQ2hpbGRQcm9jZXNzUmVzdWx0IHtcbiAgYWN0aXZlTmF0aXZlT3BlblNzaFByb2Nlc3Nlcy5hZGQoY2hpbGQpO1xuICBpZiAocGFyZW50Qm91bmQpIHBhcmVudEJvdW5kTmF0aXZlT3BlblNzaFByb2Nlc3Nlcy5hZGQoY2hpbGQpO1xuICBpZiAoIXN0b3BQYXJlbnRUZXJtaW5hdGlvblNpZ25hbCkge1xuICAgIHN0b3BQYXJlbnRUZXJtaW5hdGlvblNpZ25hbCA9IGV4ZWMub25QYXJlbnRUZXJtaW5hdGlvblNpZ25hbChmb3JjZVN0b3BOYXRpdmVPcGVuU3NoUHJvY2Vzc2VzKTtcbiAgfVxuICBpZiAoIXByb2Nlc3NFeGl0SG9va0luc3RhbGxlZCkge1xuICAgIHByb2Nlc3NFeGl0SG9va0luc3RhbGxlZCA9IHRydWU7XG4gICAgcHJvY2Vzcy5vbmNlKFwiZXhpdFwiLCBmb3JjZVN0b3BOYXRpdmVPcGVuU3NoUHJvY2Vzc2VzKTtcbiAgfVxuICBsZXQgdHJhY2tlZCA9IHRydWU7XG4gIGNvbnN0IHVudHJhY2sgPSAoKSA9PiB7XG4gICAgaWYgKCF0cmFja2VkKSByZXR1cm47XG4gICAgdHJhY2tlZCA9IGZhbHNlO1xuICAgIHZvaWQgY2hpbGQub2ZmKFwiZXhpdFwiLCB1bnRyYWNrKTtcbiAgICB2b2lkIGNoaWxkLm9mZihcImVycm9yXCIsIHVudHJhY2spO1xuICAgIGFjdGl2ZU5hdGl2ZU9wZW5Tc2hQcm9jZXNzZXMuZGVsZXRlKGNoaWxkKTtcbiAgICBpZiAoYWN0aXZlTmF0aXZlT3BlblNzaFByb2Nlc3Nlcy5zaXplID09PSAwKSB7XG4gICAgICBzdG9wUGFyZW50VGVybWluYXRpb25TaWduYWw/LigpO1xuICAgICAgc3RvcFBhcmVudFRlcm1pbmF0aW9uU2lnbmFsID0gdW5kZWZpbmVkO1xuICAgICAgcHJvY2Vzcy5vZmYoXCJleGl0XCIsIGZvcmNlU3RvcE5hdGl2ZU9wZW5Tc2hQcm9jZXNzZXMpO1xuICAgICAgcHJvY2Vzc0V4aXRIb29rSW5zdGFsbGVkID0gZmFsc2U7XG4gICAgfVxuICB9O1xuICB2b2lkIGNoaWxkLm9uY2UoXCJleGl0XCIsIHVudHJhY2spO1xuICB2b2lkIGNoaWxkLm9uY2UoXCJlcnJvclwiLCB1bnRyYWNrKTtcbiAgcmV0dXJuIGNoaWxkO1xufVxuXG5mdW5jdGlvbiBmb3JjZVN0b3BOYXRpdmVPcGVuU3NoUHJvY2Vzc2VzKCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGFjdGl2ZU5hdGl2ZU9wZW5Tc2hQcm9jZXNzZXMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHBhcmVudEJvdW5kTmF0aXZlT3BlblNzaFByb2Nlc3Nlcy5oYXMoY2hpbGQpKSBjaGlsZC5zdGRpbj8uZW5kKCk7XG4gICAgICBlbHNlIGNoaWxkLmtpbGwoXCJTSUdLSUxMXCIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIGNoaWxkIG1heSBoYXZlIGV4aXRlZCBiZXR3ZWVuIHRoZSB0cmFja2VkLXN0YXRlIGNoZWNrIGFuZCBraWxsLlxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhdmFpbGFibGVMb29wYmFja1BvcnQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgc2VydmVyID0gY3JlYXRlU2VydmVyKCk7XG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBzZXJ2ZXIub25jZShcImVycm9yXCIsIHJlamVjdCk7XG4gICAgc2VydmVyLmxpc3RlbigwLCBTT0NLU19IT1NULCByZXNvbHZlKTtcbiAgfSk7XG4gIGNvbnN0IGFkZHJlc3MgPSBzZXJ2ZXIuYWRkcmVzcygpO1xuICBpZiAoIWFkZHJlc3MgfHwgdHlwZW9mIGFkZHJlc3MgPT09IFwic3RyaW5nXCIpIHtcbiAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBsb29wYmFjayBTT0NLUzUgcG9ydFwiKTtcbiAgfVxuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2VydmVyLmNsb3NlKCgpID0+IHJlc29sdmUoKSkpO1xuICByZXR1cm4gYWRkcmVzcy5wb3J0O1xufVxuXG5mdW5jdGlvbiBjYW5Db25uZWN0TG9vcGJhY2socG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNvY2tldCA9IGNyZWF0ZUNvbm5lY3Rpb24oeyBob3N0OiBTT0NLU19IT1NULCBwb3J0IH0pO1xuICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgY29uc3QgZmluaXNoID0gKGNvbm5lY3RlZDogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIHJlc29sdmUoY29ubmVjdGVkKTtcbiAgICB9O1xuICAgIHNvY2tldC51bnJlZigpO1xuICAgIHNvY2tldC5zZXRUaW1lb3V0KDEwMCwgKCkgPT4gZmluaXNoKGZhbHNlKSk7XG4gICAgc29ja2V0Lm9uY2UoXCJlcnJvclwiLCAoKSA9PiBmaW5pc2goZmFsc2UpKTtcbiAgICBzb2NrZXQub25jZShcImNvbm5lY3RcIiwgKCkgPT4gZmluaXNoKHRydWUpKTtcbiAgfSk7XG59XG4iXX0=
|
|
382
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3NzaF9vcGVuc3NoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19zc2hfb3BlbnNzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sRUFBRSxVQUFVLElBQUksS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDcEMsT0FBTyxFQUNMLGtCQUFrQixHQUtuQixNQUFNLFVBQVUsQ0FBQztBQUVsQixNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUM7QUFDL0IsTUFBTSx5QkFBeUIsR0FBRyxLQUFLLENBQUM7QUFDeEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzdDLE1BQU0sNkJBQTZCLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7QUFDMUUsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztBQUNuRSxNQUFNLGlDQUFpQyxHQUFHLElBQUksT0FBTyxFQUFzQixDQUFDO0FBQzVFLElBQUksMkJBQXFELENBQUM7QUFDMUQsSUFBSSx3QkFBd0IsR0FBRyxLQUFLLENBQUM7QUFDckMsMkZBQTJGO0FBQzNGLE1BQU0sQ0FBQyxN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QU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztBQUN0QixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxJQUFZO0lBQ3RDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM3QixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1RCxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDcEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxTQUFrQixFQUFFLEVBQUU7WUFDcEMsSUFBSSxPQUFPO2dCQUFFLE9BQU87WUFDcEIsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNmLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWtkdGVtcCwgcm0gfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgY3JlYXRlQ29ubmVjdGlvbiwgY3JlYXRlU2VydmVyIH0gZnJvbSBcIm5vZGU6bmV0XCI7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgRHVwbGV4IH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIGRlbGF5IH0gZnJvbSBcIm5vZGU6dGltZXJzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBzcGF3biwgb25QYXJlbnRUZXJtaW5hdGlvblNpZ25hbCB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzUmVzdWx0IH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgbG9nLCB0b0Vycm9yLCBkZWRlbnQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgU29ja3NDbGllbnQgfSBmcm9tIFwic29ja3NcIjtcbmltcG9ydCB7XG4gIFBvb2xlZFNzaFRyYW5zcG9ydCxcbiAgdHlwZSBTc2hDb21tYW5kRXhlY3V0aW9uLFxuICB0eXBlIFNzaFBvb2xPcHRpb25zLFxuICB0eXBlIFNzaFJlc291cmNlTGlmZWN5Y2xlLFxuICB0eXBlIFNzaFRyYW5zcG9ydE9wdGlvbnMsXG59IGZyb20gXCIuL3NzaC50c1wiO1xuXG5jb25zdCBTT0NLU19IT1NUID0gXCIxMjcuMC4wLjFcIjtcbmNvbnN0IE9QRU5TU0hfSEVMUEVSX1RJTUVPVVRfTVMgPSAyXzAwMDtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJsYWtlYm94Om9wZW5zc2hcIik7XG5jb25zdCBuYXRpdmVPcGVuU3NoU3VwcG9ydEJ5Q29tbWFuZCA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPGJvb2xlYW4+PigpO1xuY29uc3QgYWN0aXZlTmF0aXZlT3BlblNzaFByb2Nlc3NlcyA9IG5ldyBTZXQ8Q2hpbGRQcm9jZXNzUmVzdWx0PigpO1xuY29uc3QgcGFyZW50Qm91bmROYXRpdmVPcGVuU3NoUHJvY2Vzc2VzID0gbmV3IFdlYWtTZXQ8Q2hpbGRQcm9jZXNzUmVzdWx0PigpO1xubGV0IHN0b3BQYXJlbnRUZXJtaW5hdGlvblNpZ25hbDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xubGV0IHByb2Nlc3NFeGl0SG9va0luc3RhbGxlZCA9IGZhbHNlO1xuLyoqIEBpbnRlcm5hbCBKYXZhU2NyaXB0IHdhdGNoZG9nIHRoYXQgdGVybWluYXRlcyBvbmUgY2hpbGQgd2hlbiBpdHMgcGFyZW50IHBpcGUgY2xvc2VzLiAqL1xuZXhwb3J0IGNvbnN0IE9QRU5TU0hfUEFSRU5UX1dBVENIX1NPVVJDRSA9XG4gIGRlZGVudCgvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qanMqLyBgXG4gICAgY29uc3QgeyBzcGF3biB9ID0gcmVxdWlyZShcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKTtcblxuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24ocHJvY2Vzcy5hcmd2WzFdLCBwcm9jZXNzLmFyZ3Yuc2xpY2UoMiksIHtcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJpbmhlcml0XCJdLFxuICAgIH0pO1xuICAgIGxldCBzdG9wcGluZyA9IGZhbHNlO1xuICAgIGNvbnN0IHN0b3BDaGlsZCA9ICgpID0+IHtcbiAgICAgIGlmIChzdG9wcGluZykgcmV0dXJuO1xuICAgICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgICAgY2hpbGQua2lsbChcIlNJR0tJTExcIik7XG4gICAgfTtcblxuICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG4gICAgcHJvY2Vzcy5zdGRpbi5vbmNlKFwiZW5kXCIsIHN0b3BDaGlsZCk7XG4gICAgcHJvY2Vzcy5zdGRpbi5vbmNlKFwiY2xvc2VcIiwgc3RvcENoaWxkKTtcbiAgICBjaGlsZC5vbmNlKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9KTtcbiAgICBjaGlsZC5vbmNlKFwiZXhpdFwiLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICBwcm9jZXNzLnN0ZGluLnBhdXNlKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoY29kZSA/PyAoc2lnbmFsID8gMSA6IDApKTtcbiAgICB9KTtcbiAgYCk7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBPbmUgYXV0aGVudGljYXRlZCBuYXRpdmUgT3BlblNTSCBDb250cm9sTWFzdGVyIHJlc291cmNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuU3NoUmVzb3VyY2Uge1xuICBydW4oc2NyaXB0OiBzdHJpbmcsIGV4ZWN1dGlvbjogU3NoQ29tbWFuZEV4ZWN1dGlvbik6IFByb21pc2U8bnVtYmVyPjtcbiAgY29ubmVjdChyZW1vdGVIb3N0OiBzdHJpbmcsIHJlbW90ZVBvcnQ6IG51bWJlcik6IFByb21pc2U8RHVwbGV4PjtcbiAgdGVzdCgpOiBQcm9taXNlPGJvb2xlYW4+O1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogRXhjbHVzaXZlIG5hdGl2ZSBPcGVuU1NIIENvbnRyb2xNYXN0ZXIgcG9vbC4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuU3NoVHJhbnNwb3J0IGV4dGVuZHMgUG9vbGVkU3NoVHJhbnNwb3J0PE9wZW5Tc2hSZXNvdXJjZT4ge1xuICByZWFkb25seSBraW5kID0gXCJvcGVuc3NoXCIgYXMgY29uc3Q7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogU3NoVHJhbnNwb3J0T3B0aW9ucyxcbiAgICBjb21tYW5kOiBzdHJpbmcsXG4gICAgcG9vbE9wdGlvbnM6IFNzaFBvb2xPcHRpb25zID0ge30sXG4gICAgbGlmZWN5Y2xlOiBTc2hSZXNvdXJjZUxpZmVjeWNsZTxPcGVuU3NoUmVzb3VyY2U+ID0gb3BlblNzaExpZmVjeWNsZShvcHRpb25zLCBjb21tYW5kKSxcbiAgKSB7XG4gICAgc3VwZXIobGlmZWN5Y2xlLCB7XG4gICAgICBhY3F1aXJlVGltZW91dE1pbGxpczogb3B0aW9ucy5jb25uZWN0VGltZW91dE1zLFxuICAgICAgLi4ucG9vbE9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcnVuV2l0aFJlc291cmNlKFxuICAgIHJlc291cmNlOiBPcGVuU3NoUmVzb3VyY2UsXG4gICAgc2NyaXB0OiBzdHJpbmcsXG4gICAgZXhlY3V0aW9uOiBTc2hDb21tYW5kRXhlY3V0aW9uLFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiByZXNvdXJjZS5ydW4oc2NyaXB0LCBleGVjdXRpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbm5lY3RXaXRoUmVzb3VyY2UoXG4gICAgcmVzb3VyY2U6IE9wZW5Tc2hSZXNvdXJjZSxcbiAgICByZW1vdGVIb3N0OiBzdHJpbmcsXG4gICAgcmVtb3RlUG9ydDogbnVtYmVyLFxuICApOiBQcm9taXNlPER1cGxleD4ge1xuICAgIHJldHVybiByZXNvdXJjZS5jb25uZWN0KHJlbW90ZUhvc3QsIHJlbW90ZVBvcnQpO1xuICB9XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciBhbiBleGVjdXRhYmxlIGlzIE9wZW5TU0ggYW5kIGFjY2VwdHMgZHluYW1pYyBTT0NLUzUgZm9yd2FyZGluZy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdXBwb3J0c05hdGl2ZU9wZW5Tc2goY29tbWFuZCA9IFwic3NoXCIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgY2FjaGVkID0gbmF0aXZlT3BlblNzaFN1cHBvcnRCeUNvbW1hbmQuZ2V0KGNvbW1hbmQpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICBjb25zdCBwcm9iZSA9IHByb2JlTmF0aXZlT3BlblNzaChjb21tYW5kKTtcbiAgbmF0aXZlT3BlblNzaFN1cHBvcnRCeUNvbW1hbmQuc2V0KGNvbW1hbmQsIHByb2JlKTtcbiAgcmV0dXJuIHByb2JlO1xufVxuXG4vKiogQGludGVybmFsIE9wZW5TU0ggYXJndW1lbnRzIHNoYXJlZCBieSBwb29sZWQgQ29udHJvbE1hc3RlciBwcm9jZXNzZXMuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlT3BlblNzaEFyZ3Mob3B0aW9uczogU3NoVHJhbnNwb3J0T3B0aW9ucyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBcIi1pXCIsXG4gICAgb3B0aW9ucy5wcml2YXRlS2V5UGF0aCxcbiAgICBcIi1wXCIsXG4gICAgU3RyaW5nKG9wdGlvbnMucG9ydCksXG4gICAgXCItVFwiLFxuICAgIFwiLW9cIixcbiAgICBcIkJhdGNoTW9kZT15ZXNcIixcbiAgICBcIi1vXCIsXG4gICAgXCJJZGVudGl0aWVzT25seT15ZXNcIixcbiAgICBcIi1vXCIsXG4gICAgXCJGb3J3YXJkQWdlbnQ9bm9cIixcbiAgICBcIi1vXCIsXG4gICAgXCJQcmVmZXJyZWRBdXRoZW50aWNhdGlvbnM9cHVibGlja2V5XCIsXG4gICAgXCItb1wiLFxuICAgIFwiU3RyaWN0SG9zdEtleUNoZWNraW5nPXllc1wiLFxuICAgIFwiLW9cIixcbiAgICBgVXNlcktub3duSG9zdHNGaWxlPSR7b3B0aW9ucy5rbm93bkhvc3RzUGF0aH1gLFxuICAgIFwiLW9cIixcbiAgICBgSG9zdEtleUFsaWFzPVske29wdGlvbnMuaG9zdH1dOiR7b3B0aW9ucy5wb3J0fWAsXG4gICAgXCItb1wiLFxuICAgIFwiTG9nTGV2ZWw9RVJST1JcIixcbiAgICBcIi1vXCIsXG4gICAgYENvbm5lY3RUaW1lb3V0PSR7TWF0aC5tYXgoMSwgTWF0aC5jZWlsKG9wdGlvbnMuY29ubmVjdFRpbWVvdXRNcyAvIDFfMDAwKSl9YCxcbiAgICBcIi1vXCIsXG4gICAgXCJTZXJ2ZXJBbGl2ZUludGVydmFsPTE1XCIsXG4gICAgXCItb1wiLFxuICAgIFwiU2VydmVyQWxpdmVDb3VudE1heD0zXCIsXG4gIF07XG59XG5cbmZ1bmN0aW9uIG9wZW5Tc2hMaWZlY3ljbGUoXG4gIG9wdGlvbnM6IFNzaFRyYW5zcG9ydE9wdGlvbnMsXG4gIGNvbW1hbmQ6IHN0cmluZyxcbik6IFNzaFJlc291cmNlTGlmZWN5Y2xlPE9wZW5Tc2hSZXNvdXJjZT4ge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZTogKCkgPT4gTmF0aXZlT3BlblNzaFJlc291cmNlLmNyZWF0ZShvcHRpb25zLCBjb21tYW5kKSxcbiAgICBkZXN0cm95OiAocmVzb3VyY2UpID0+IHJlc291cmNlLmNsb3NlKCksXG4gICAgdGVzdDogKHJlc291cmNlKSA9PiByZXNvdXJjZS50ZXN0KCksXG4gIH07XG59XG5cbmNsYXNzIE5hdGl2ZU9wZW5Tc2hSZXNvdXJjZSBpbXBsZW1lbnRzIE9wZW5Tc2hSZXNvdXJjZSB7XG4gIHByaXZhdGUgYWxpdmUgPSB0cnVlO1xuICBwcml2YXRlIGNsb3Npbmc/OiBQcm9taXNlPHZvaWQ+O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTc2hUcmFuc3BvcnRPcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlyZWN0b3J5OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sUGF0aDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc29ja3NQb3J0OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXN0ZXI6IENoaWxkUHJvY2Vzc1Jlc3VsdCxcbiAgKSB7XG4gICAgY29uc3QgY2xvc2VkID0gKCkgPT4ge1xuICAgICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gICAgdm9pZCBtYXN0ZXIudGhlbihjbG9zZWQsIGNsb3NlZCk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlKFxuICAgIG9wdGlvbnM6IFNzaFRyYW5zcG9ydE9wdGlvbnMsXG4gICAgY29tbWFuZDogc3RyaW5nLFxuICApOiBQcm9taXNlPE5hdGl2ZU9wZW5Tc2hSZXNvdXJjZT4ge1xuICAgIGNvbnN0IGRpcmVjdG9yeSA9IGF3YWl0IG1rZHRlbXAoam9pbih0bXBkaXIoKSwgXCJkYngtdG9vbHMtc3NoLVwiKSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xQYXRoID0gam9pbihkaXJlY3RvcnksIFwiY29udHJvbFwiKTtcbiAgICAgIGNvbnN0IHNvY2tzUG9ydCA9IGF3YWl0IGF2YWlsYWJsZUxvb3BiYWNrUG9ydCgpO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gYCR7b3B0aW9ucy51c2VybmFtZX1AJHtvcHRpb25zLmNvbm5lY3RIb3N0fWA7XG4gICAgICBjb25zdCBtYXN0ZXIgPSB0cmFja05hdGl2ZU9wZW5Tc2hQcm9jZXNzKFxuICAgICAgICBzcGF3bihcbiAgICAgICAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIFwiLWVcIixcbiAgICAgICAgICAgIE9QRU5TU0hfUEFSRU5UX1dBVENIX1NPVVJDRSxcbiAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICAuLi5uYXRpdmVPcGVuU3NoQXJncyhvcHRpb25zKSxcbiAgICAgICAgICAgIFwiLU1cIixcbiAgICAgICAgICAgIFwiLU5cIixcbiAgICAgICAgICAgIFwiLVNcIixcbiAgICAgICAgICAgIGNvbnRyb2xQYXRoLFxuICAgICAgICAgICAgXCItb1wiLFxuICAgICAgICAgICAgXCJDb250cm9sUGVyc2lzdD1ub1wiLFxuICAgICAgICAgICAgXCItb1wiLFxuICAgICAgICAgICAgXCJFeGl0T25Gb3J3YXJkRmFpbHVyZT15ZXNcIixcbiAgICAgICAgICAgIFwiLURcIixcbiAgICAgICAgICAgIGAke1NPQ0tTX0hPU1R9OiR7c29ja3NQb3J0fWAsXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgXSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGRpbjogXCJwaXBlXCIsXG4gICAgICAgICAgICBzdGRvdXQ6IFwiaWdub3JlXCIsXG4gICAgICAgICAgICBzdGRlcnI6IFwiY2FwdHVyZVwiLFxuICAgICAgICAgICAgdHJpbTogZmFsc2UsXG4gICAgICAgICAgICBmb3J3YXJkVGVybWluYXRpb25TaWduYWxzOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICB0cnVlLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gbmV3IE5hdGl2ZU9wZW5Tc2hSZXNvdXJjZShcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgZGlyZWN0b3J5LFxuICAgICAgICBjb250cm9sUGF0aCxcbiAgICAgICAgc29ja3NQb3J0LFxuICAgICAgICBtYXN0ZXIsXG4gICAgICApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVzb3VyY2Uud2FpdFVudGlsUmVhZHkoKTtcbiAgICAgICAgcmV0dXJuIHJlc291cmNlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgYXdhaXQgcmVzb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHJtKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcnVuKHNjcmlwdDogc3RyaW5nLCBleGVjdXRpb246IFNzaENvbW1hbmRFeGVjdXRpb24pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGNoaWxkID0gdHJhY2tOYXRpdmVPcGVuU3NoUHJvY2VzcyhcbiAgICAgIHNwYXduKFxuICAgICAgICB0aGlzLmNvbW1hbmQsXG4gICAgICAgIFtcbiAgICAgICAgICAuLi5uYXRpdmVPcGVuU3NoQXJncyh0aGlzLm9wdGlvbnMpLFxuICAgICAgICAgIFwiLVNcIixcbiAgICAgICAgICB0aGlzLmNvbnRyb2xQYXRoLFxuICAgICAgICAgIFwiLW9cIixcbiAgICAgICAgICBcIkNvbnRyb2xNYXN0ZXI9bm9cIixcbiAgICAgICAgICBgJHt0aGlzLm9wdGlvbnMudXNlcm5hbWV9QCR7dGhpcy5vcHRpb25zLmNvbm5lY3RIb3N0fWAsXG4gICAgICAgICAgc2NyaXB0LFxuICAgICAgICBdLFxuICAgICAgICB7XG4gICAgICAgICAgc3RkaW46IFwiaWdub3JlXCIsXG4gICAgICAgICAgc3Rkb3V0OiBcInBpcGVcIixcbiAgICAgICAgICBzdGRlcnI6IFwicGlwZVwiLFxuICAgICAgICAgIHRyaW06IGZhbHNlLFxuICAgICAgICAgIGZvcndhcmRUZXJtaW5hdGlvblNpZ25hbHM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICAgIGNoaWxkLnN0ZG91dD8ub24oXCJkYXRhXCIsIGV4ZWN1dGlvbi5zdGRvdXQpO1xuICAgIGNoaWxkLnN0ZGVycj8ub24oXCJkYXRhXCIsIGV4ZWN1dGlvbi5zdGRlcnIpO1xuICAgIGxldCBzaHV0ZG93bjogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgICBleGVjdXRpb24uc2V0Q2FuY2VsKCgpID0+IHtcbiAgICAgIHNodXRkb3duID8/PSBjaGlsZC5zaHV0ZG93bih7IHRlcm1pbmF0ZVRpbWVvdXQ6IDAsIGtpbGxUaW1lb3V0OiAxXzAwMCB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJmYWlsZWQgdG8gc3RvcCBuYXRpdmUgU1NIIGNvbW1hbmRcIiwgeyBlcnJvcjogdG9FcnJvcihlcnJvcikgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzaHV0ZG93bjtcbiAgICB9KTtcbiAgICByZXR1cm4gKGF3YWl0IGNoaWxkKS5leGl0Q29kZTtcbiAgfVxuXG4gIGFzeW5jIGNvbm5lY3QocmVtb3RlSG9zdDogc3RyaW5nLCByZW1vdGVQb3J0OiBudW1iZXIpOiBQcm9taXNlPER1cGxleD4ge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBhd2FpdCBTb2Nrc0NsaWVudC5jcmVhdGVDb25uZWN0aW9uKHtcbiAgICAgIGNvbW1hbmQ6IFwiY29ubmVjdFwiLFxuICAgICAgZGVzdGluYXRpb246IHsgaG9zdDogcmVtb3RlSG9zdCwgcG9ydDogcmVtb3RlUG9ydCB9LFxuICAgICAgcHJveHk6IHsgaG9zdDogU09DS1NfSE9TVCwgcG9ydDogdGhpcy5zb2Nrc1BvcnQsIHR5cGU6IDUgfSxcbiAgICAgIHRpbWVvdXQ6IHRoaXMub3B0aW9ucy5jb25uZWN0VGltZW91dE1zLFxuICAgICAgc2V0X3RjcF9ub2RlbGF5OiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBjb25uZWN0aW9uLnNvY2tldDtcbiAgfVxuXG4gIGFzeW5jIHRlc3QoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLmFsaXZlIHx8IHRoaXMubWFzdGVyLmV4aXRDb2RlICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5jb250cm9sKFwiY2hlY2tcIikpLmV4aXRDb2RlID09PSAwO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNsb3NpbmcpIHJldHVybiB0aGlzLmNsb3Npbmc7XG4gICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuY2xvc2luZyA9IHRoaXMuY2xvc2VSZXNvdXJjZSgpO1xuICAgIHJldHVybiB0aGlzLmNsb3Npbmc7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNsb3NlUmVzb3VyY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY29udHJvbChcImV4aXRcIikuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5tYXN0ZXIuc2h1dGRvd24oeyB0ZXJtaW5hdGVUaW1lb3V0OiAwLCBraWxsVGltZW91dDogMV8wMDAgfSkuY2F0Y2goKGVycm9yKSA9PlxuICAgICAgICBsb2dnZXIud2FybihcImZhaWxlZCB0byBzdG9wIG5hdGl2ZSBTU0ggQ29udHJvbE1hc3RlclwiLCB7XG4gICAgICAgICAgZXJyb3I6IHRvRXJyb3IoZXJyb3IpLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBybSh0aGlzLmRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdFVudGlsUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGhpcy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0TXM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgaWYgKHRoaXMubWFzdGVyLmV4aXRDb2RlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubWFzdGVyO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5hdGl2ZSBPcGVuU1NIIENvbnRyb2xNYXN0ZXIgZXhpdGVkICgke3Jlc3VsdC5leGl0Q29kZX0pOiAke3Jlc3VsdC5zdGRlcnIudHJpbSgpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoKGF3YWl0IHRoaXMudGVzdCgpKSAmJiAoYXdhaXQgY2FuQ29ubmVjdExvb3BiYWNrKHRoaXMuc29ja3NQb3J0KSkpIHJldHVybjtcbiAgICAgIGF3YWl0IGRlbGF5KDUwKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE5hdGl2ZSBPcGVuU1NIIENvbnRyb2xNYXN0ZXIgZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7dGhpcy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0TXN9bXNgLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnRyb2wob3BlcmF0aW9uOiBcImNoZWNrXCIgfCBcImV4aXRcIikge1xuICAgIGNvbnN0IGNoaWxkID0gdHJhY2tOYXRpdmVPcGVuU3NoUHJvY2VzcyhcbiAgICAgIHNwYXduKFxuICAgICAgICB0aGlzLmNvbW1hbmQsXG4gICAgICAgIFtcbiAgICAgICAgICBcIi1wXCIsXG4gICAgICAgICAgU3RyaW5nKHRoaXMub3B0aW9ucy5wb3J0KSxcbiAgICAgICAgICBcIi1TXCIsXG4gICAgICAgICAgdGhpcy5jb250cm9sUGF0aCxcbiAgICAgICAgICBcIi1PXCIsXG4gICAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICAgIGAke3RoaXMub3B0aW9ucy51c2VybmFtZX1AJHt0aGlzLm9wdGlvbnMuY29ubmVjdEhvc3R9YCxcbiAgICAgICAgXSxcbiAgICAgICAge1xuICAgICAgICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgICAgICAgIHN0ZG91dDogXCJpZ25vcmVcIixcbiAgICAgICAgICBzdGRlcnI6IFwiaWdub3JlXCIsXG4gICAgICAgICAgZm9yd2FyZFRlcm1pbmF0aW9uU2lnbmFsczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICk7XG4gICAgcmV0dXJuIHdhaXRGb3JOYXRpdmVPcGVuU3NoQ2hpbGQoY2hpbGQsIGBzc2ggLU8gJHtvcGVyYXRpb259YCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvYmVOYXRpdmVPcGVuU3NoKGNvbW1hbmQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHZlcnNpb24gPSBhd2FpdCB3YWl0Rm9yTmF0aXZlT3BlblNzaENoaWxkKFxuICAgICAgdHJhY2tOYXRpdmVPcGVuU3NoUHJvY2VzcyhcbiAgICAgICAgc3Bhd24oY29tbWFuZCwgW1wiLVZcIl0sIHtcbiAgICAgICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgICAgICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICAgICAgICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgICAgICAgZm9yd2FyZFRlcm1pbmF0aW9uU2lnbmFsczogZmFsc2UsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIFwic3NoIC1WXCIsXG4gICAgKTtcbiAgICBjb25zdCB2ZXJzaW9uT3V0cHV0ID0gYCR7dmVyc2lvbi5zdGRvdXR9XFxuJHt2ZXJzaW9uLnN0ZGVycn1gO1xuICAgIGlmICh2ZXJzaW9uLmV4aXRDb2RlICE9PSAwIHx8ICEvKD86XnxcXHMpT3BlblNTSF8vbS50ZXN0KHZlcnNpb25PdXRwdXQpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZHluYW1pY0ZvcndhcmQgPSBhd2FpdCB3YWl0Rm9yTmF0aXZlT3BlblNzaENoaWxkKFxuICAgICAgdHJhY2tOYXRpdmVPcGVuU3NoUHJvY2VzcyhcbiAgICAgICAgc3Bhd24oY29tbWFuZCwgW1wiLUdcIiwgXCItRFwiLCBgJHtTT0NLU19IT1NUfToxYCwgXCJsb2NhbGhvc3RcIl0sIHtcbiAgICAgICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgICAgICBzdGRvdXQ6IFwiaWdub3JlXCIsXG4gICAgICAgICAgc3RkZXJyOiBcImlnbm9yZVwiLFxuICAgICAgICAgIGZvcndhcmRUZXJtaW5hdGlvblNpZ25hbHM6IGZhbHNlLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBcInNzaCAtR1wiLFxuICAgICk7XG4gICAgcmV0dXJuIGR5bmFtaWNGb3J3YXJkLmV4aXRDb2RlID09PSAwO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvck5hdGl2ZU9wZW5Tc2hDaGlsZChcbiAgY2hpbGQ6IENoaWxkUHJvY2Vzc1Jlc3VsdCxcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4pOiBQcm9taXNlPEF3YWl0ZWQ8Q2hpbGRQcm9jZXNzUmVzdWx0Pj4ge1xuICBsZXQgdGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIGNvbnN0IHRpbWVkT3V0ID0gbmV3IFByb21pc2U8bmV2ZXI+KChfcmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdm9pZCBjaGlsZC5zaHV0ZG93bih7IHRlcm1pbmF0ZVRpbWVvdXQ6IDAsIGtpbGxUaW1lb3V0OiAxXzAwMCB9KS50aGVuKFxuICAgICAgICAoKSA9PiByZWplY3QobmV3IEVycm9yKGAke29wZXJhdGlvbn0gdGltZWQgb3V0IGFmdGVyICR7T1BFTlNTSF9IRUxQRVJfVElNRU9VVF9NU31tc2ApKSxcbiAgICAgICAgKGVycm9yKSA9PiByZWplY3QoZXJyb3IpLFxuICAgICAgKTtcbiAgICB9LCBPUEVOU1NIX0hFTFBFUl9USU1FT1VUX01TKTtcbiAgICB0aW1lb3V0LnVucmVmPy4oKTtcbiAgfSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbY2hpbGQsIHRpbWVkT3V0XSk7XG4gIH0gZmluYWxseSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQhKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFja05hdGl2ZU9wZW5Tc2hQcm9jZXNzKFxuICBjaGlsZDogQ2hpbGRQcm9jZXNzUmVzdWx0LFxuICBwYXJlbnRCb3VuZCA9IGZhbHNlLFxuKTogQ2hpbGRQcm9jZXNzUmVzdWx0IHtcbiAgYWN0aXZlTmF0aXZlT3BlblNzaFByb2Nlc3Nlcy5hZGQoY2hpbGQpO1xuICBpZiAocGFyZW50Qm91bmQpIHBhcmVudEJvdW5kTmF0aXZlT3BlblNzaFByb2Nlc3Nlcy5hZGQoY2hpbGQpO1xuICBpZiAoIXN0b3BQYXJlbnRUZXJtaW5hdGlvblNpZ25hbCkge1xuICAgIHN0b3BQYXJlbnRUZXJtaW5hdGlvblNpZ25hbCA9IG9uUGFyZW50VGVybWluYXRpb25TaWduYWwoZm9yY2VTdG9wTmF0aXZlT3BlblNzaFByb2Nlc3Nlcyk7XG4gIH1cbiAgaWYgKCFwcm9jZXNzRXhpdEhvb2tJbnN0YWxsZWQpIHtcbiAgICBwcm9jZXNzRXhpdEhvb2tJbnN0YWxsZWQgPSB0cnVlO1xuICAgIHByb2Nlc3Mub25jZShcImV4aXRcIiwgZm9yY2VTdG9wTmF0aXZlT3BlblNzaFByb2Nlc3Nlcyk7XG4gIH1cbiAgbGV0IHRyYWNrZWQgPSB0cnVlO1xuICBjb25zdCB1bnRyYWNrID0gKCkgPT4ge1xuICAgIGlmICghdHJhY2tlZCkgcmV0dXJuO1xuICAgIHRyYWNrZWQgPSBmYWxzZTtcbiAgICB2b2lkIGNoaWxkLm9mZihcImV4aXRcIiwgdW50cmFjayk7XG4gICAgdm9pZCBjaGlsZC5vZmYoXCJlcnJvclwiLCB1bnRyYWNrKTtcbiAgICBhY3RpdmVOYXRpdmVPcGVuU3NoUHJvY2Vzc2VzLmRlbGV0ZShjaGlsZCk7XG4gICAgaWYgKGFjdGl2ZU5hdGl2ZU9wZW5Tc2hQcm9jZXNzZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgc3RvcFBhcmVudFRlcm1pbmF0aW9uU2lnbmFsPy4oKTtcbiAgICAgIHN0b3BQYXJlbnRUZXJtaW5hdGlvblNpZ25hbCA9IHVuZGVmaW5lZDtcbiAgICAgIHByb2Nlc3Mub2ZmKFwiZXhpdFwiLCBmb3JjZVN0b3BOYXRpdmVPcGVuU3NoUHJvY2Vzc2VzKTtcbiAgICAgIHByb2Nlc3NFeGl0SG9va0luc3RhbGxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgdm9pZCBjaGlsZC5vbmNlKFwiZXhpdFwiLCB1bnRyYWNrKTtcbiAgdm9pZCBjaGlsZC5vbmNlKFwiZXJyb3JcIiwgdW50cmFjayk7XG4gIHJldHVybiBjaGlsZDtcbn1cblxuZnVuY3Rpb24gZm9yY2VTdG9wTmF0aXZlT3BlblNzaFByb2Nlc3NlcygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBhY3RpdmVOYXRpdmVPcGVuU3NoUHJvY2Vzc2VzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChwYXJlbnRCb3VuZE5hdGl2ZU9wZW5Tc2hQcm9jZXNzZXMuaGFzKGNoaWxkKSkgY2hpbGQuc3RkaW4/LmVuZCgpO1xuICAgICAgZWxzZSBjaGlsZC5raWxsKFwiU0lHS0lMTFwiKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBjaGlsZCBtYXkgaGF2ZSBleGl0ZWQgYmV0d2VlbiB0aGUgdHJhY2tlZC1zdGF0ZSBjaGVjayBhbmQga2lsbC5cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXZhaWxhYmxlTG9vcGJhY2tQb3J0KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc2VydmVyLm9uY2UoXCJlcnJvclwiLCByZWplY3QpO1xuICAgIHNlcnZlci5saXN0ZW4oMCwgU09DS1NfSE9TVCwgcmVzb2x2ZSk7XG4gIH0pO1xuICBjb25zdCBhZGRyZXNzID0gc2VydmVyLmFkZHJlc3MoKTtcbiAgaWYgKCFhZGRyZXNzIHx8IHR5cGVvZiBhZGRyZXNzID09PSBcInN0cmluZ1wiKSB7XG4gICAgc2VydmVyLmNsb3NlKCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGFsbG9jYXRlIGEgbG9vcGJhY2sgU09DS1M1IHBvcnRcIik7XG4gIH1cbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNlcnZlci5jbG9zZSgoKSA9PiByZXNvbHZlKCkpKTtcbiAgcmV0dXJuIGFkZHJlc3MucG9ydDtcbn1cblxuZnVuY3Rpb24gY2FuQ29ubmVjdExvb3BiYWNrKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzb2NrZXQgPSBjcmVhdGVDb25uZWN0aW9uKHsgaG9zdDogU09DS1NfSE9TVCwgcG9ydCB9KTtcbiAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGZpbmlzaCA9IChjb25uZWN0ZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICByZXNvbHZlKGNvbm5lY3RlZCk7XG4gICAgfTtcbiAgICBzb2NrZXQudW5yZWYoKTtcbiAgICBzb2NrZXQuc2V0VGltZW91dCgxMDAsICgpID0+IGZpbmlzaChmYWxzZSkpO1xuICAgIHNvY2tldC5vbmNlKFwiZXJyb3JcIiwgKCkgPT4gZmluaXNoKGZhbHNlKSk7XG4gICAgc29ja2V0Lm9uY2UoXCJjb25uZWN0XCIsICgpID0+IGZpbmlzaCh0cnVlKSk7XG4gIH0pO1xufVxuIl19
|
package/lib/src/_ssh_ssh2.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Duplex } from "node:stream";
|
|
2
2
|
import type { Client as Ssh2Client } from "ssh2";
|
|
3
|
-
import { PooledSshTransport, type SshCommandExecution, type SshPoolOptions, type SshTransportOptions } from "./
|
|
3
|
+
import { PooledSshTransport, type SshCommandExecution, type SshPoolOptions, type SshTransportOptions } from "./ssh.ts";
|
|
4
4
|
interface Ssh2Resource {
|
|
5
5
|
readonly client: Ssh2Client;
|
|
6
6
|
alive: boolean;
|
package/lib/src/_ssh_ssh2.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { log } from "@dbx-tools/shared-core";
|
|
2
|
-
import { PooledSshTransport, } from "./
|
|
2
|
+
import { PooledSshTransport, } from "./ssh.js";
|
|
3
3
|
const logger = log.logger("lakebox:ssh2");
|
|
4
4
|
const patchedSsh2Protocols = new WeakSet();
|
|
5
5
|
/** Exclusive ssh2 connection pool for commands and direct TCP forwarding. */
|
|
@@ -222,4 +222,4 @@ function isNodeDevelopment() {
|
|
|
222
222
|
const nodeEnv = process.env.NODE_ENV?.trim().toLowerCase();
|
|
223
223
|
return nodeEnv === "development" || nodeEnv === "dev";
|
|
224
224
|
}
|
|
225
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3NzaF9zc2gyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19zc2hfc3NoMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0MsT0FBTyxFQUNMLGtCQUFrQixHQUtuQixNQUFNLFdBQVcsQ0FBQztBQUVuQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxPQUFPLEVBQWdCLENBQUM7QUFPekQsNkVBQTZFO0FBQzdFLE1BQU0sT0FBTyxhQUFjLFNBQVEsa0JBQWdDO0lBQ3hELElBQUksR0FBRyxNQUFlLENBQUM7SUFDZixnQkFBZ0IsQ0FBUztJQUUxQyxZQUFZLE9BQTRCLEVBQUUsY0FBOEIsRUFBRTtRQUN4RSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzVCLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7WUFDOUMsR0FBRyxXQUFXO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztJQUNuRCxDQUFDO0lBRVMsZUFBZSxDQUN2QixRQUFzQixFQUN0QixNQUFjLEVBQ2QsU0FBOEI7UUFFOUIsT0FBTyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRVMsbUJBQW1CLENBQzNCLFFBQXNCLEVBQ3RCLFVBQWtCLEVBQ2xCLFVBQWtCO1FBRWxCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksT0FBc0MsQ0FBQztZQUMzQyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUU7Z0JBQ25CLFlBQVksQ0FB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VUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsd0VBQXdFLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBQ0QsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUMsQ0FBQztJQUNGLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuQyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLGlCQUFpQjtJQUN4QixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMzRCxPQUFPLE9BQU8sS0FBSyxhQUFhLElBQUksT0FBTyxLQUFLLEtBQUssQ0FBQztBQUN4RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEdXBsZXggfSBmcm9tIFwibm9kZTpzdHJlYW1cIjtcbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IENsaWVudCBhcyBTc2gyQ2xpZW50LCBDbGllbnRDaGFubmVsIH0gZnJvbSBcInNzaDJcIjtcbmltcG9ydCB7XG4gIFBvb2xlZFNzaFRyYW5zcG9ydCxcbiAgdHlwZSBTc2hDb21tYW5kRXhlY3V0aW9uLFxuICB0eXBlIFNzaFBvb2xPcHRpb25zLFxuICB0eXBlIFNzaFJlc291cmNlTGlmZWN5Y2xlLFxuICB0eXBlIFNzaFRyYW5zcG9ydE9wdGlvbnMsXG59IGZyb20gXCIuL19zc2gudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImxha2Vib3g6c3NoMlwiKTtcbmNvbnN0IHBhdGNoZWRTc2gyUHJvdG9jb2xzID0gbmV3IFdlYWtTZXQ8U3NoMlByb3RvY29sPigpO1xuXG5pbnRlcmZhY2UgU3NoMlJlc291cmNlIHtcbiAgcmVhZG9ubHkgY2xpZW50OiBTc2gyQ2xpZW50O1xuICBhbGl2ZTogYm9vbGVhbjtcbn1cblxuLyoqIEV4Y2x1c2l2ZSBzc2gyIGNvbm5lY3Rpb24gcG9vbCBmb3IgY29tbWFuZHMgYW5kIGRpcmVjdCBUQ1AgZm9yd2FyZGluZy4gKi9cbmV4cG9ydCBjbGFzcyBTc2gyVHJhbnNwb3J0IGV4dGVuZHMgUG9vbGVkU3NoVHJhbnNwb3J0PFNzaDJSZXNvdXJjZT4ge1xuICByZWFkb25seSBraW5kID0gXCJzc2gyXCIgYXMgY29uc3Q7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdFRpbWVvdXRNczogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNzaFRyYW5zcG9ydE9wdGlvbnMsIHBvb2xPcHRpb25zOiBTc2hQb29sT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoc3NoMkxpZmVjeWNsZShvcHRpb25zKSwge1xuICAgICAgYWNxdWlyZVRpbWVvdXRNaWxsaXM6IG9wdGlvbnMuY29ubmVjdFRpbWVvdXRNcyxcbiAgICAgIC4uLnBvb2xPcHRpb25zLFxuICAgIH0pO1xuICAgIHRoaXMuY29ubmVjdFRpbWVvdXRNcyA9IG9wdGlvbnMuY29ubmVjdFRpbWVvdXRNcztcbiAgfVxuXG4gIHByb3RlY3RlZCBydW5XaXRoUmVzb3VyY2UoXG4gICAgcmVzb3VyY2U6IFNzaDJSZXNvdXJjZSxcbiAgICBzY3JpcHQ6IHN0cmluZyxcbiAgICBleGVjdXRpb246IFNzaENvbW1hbmRFeGVjdXRpb24sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGV4ZWN1dGVDb21tYW5kKHJlc291cmNlLCBzY3JpcHQsIGV4ZWN1dGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29ubmVjdFdpdGhSZXNvdXJjZShcbiAgICByZXNvdXJjZTogU3NoMlJlc291cmNlLFxuICAgIHJlbW90ZUhvc3Q6IHN0cmluZyxcbiAgICByZW1vdGVQb3J0OiBudW1iZXIsXG4gICk6IFByb21pc2U8RHVwbGV4PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBsZXQgdGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIHJlc291cmNlLmNsaWVudC5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsIGNsaWVudENsb3NlZCk7XG4gICAgICAgIHJlc291cmNlLmNsaWVudC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIGNsaWVudEZhaWxlZCk7XG4gICAgICB9O1xuICAgICAgY29uc3QgZmFpbCA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBjbGllbnRDbG9zZWQgPSAoKSA9PiB7XG4gICAgICAgIGZhaWwobmV3IEVycm9yKFwic3NoMiBjb25uZWN0aW9uIGNsb3NlZCB3aGlsZSBvcGVuaW5nIGZvcndhcmRpbmdcIikpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGNsaWVudEZhaWxlZCA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgZmFpbChlcnJvcik7XG4gICAgICB9O1xuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IGZhaWwobmV3IEVycm9yKGBzc2gyIGZvcndhcmRpbmcgZGlkIG5vdCBvcGVuIHdpdGhpbiAke3RoaXMuY29ubmVjdFRpbWVvdXRNc31tc2ApKSxcbiAgICAgICAgdGhpcy5jb25uZWN0VGltZW91dE1zLFxuICAgICAgKTtcbiAgICAgIHRpbWVvdXQudW5yZWY/LigpO1xuICAgICAgcmVzb3VyY2UuY2xpZW50Lm9uY2UoXCJjbG9zZVwiLCBjbGllbnRDbG9zZWQpO1xuICAgICAgcmVzb3VyY2UuY2xpZW50Lm9uY2UoXCJlcnJvclwiLCBjbGllbnRGYWlsZWQpO1xuICAgICAgcmVzb3VyY2UuY2xpZW50LmZvcndhcmRPdXQoXCIxMjcuMC4wLjFcIiwgMCwgcmVtb3RlSG9zdCwgcmVtb3RlUG9ydCwgKGVycm9yLCBjaGFubmVsKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSB7XG4gICAgICAgICAgY2hhbm5lbD8uZGVzdHJveSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICBpZiAoZXJyb3IpIHJlamVjdChlcnJvcik7XG4gICAgICAgIGVsc2UgcmVzb2x2ZShjaGFubmVsKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNzaDJMaWZlY3ljbGUob3B0aW9uczogU3NoVHJhbnNwb3J0T3B0aW9ucyk6IFNzaFJlc291cmNlTGlmZWN5Y2xlPFNzaDJSZXNvdXJjZT4ge1xuICBjb25zdCBwYXRjaE1vZGUgPSBvcHRpb25zLnNzaDJQYXRjaCA/PyBcImF1dG9cIjtcbiAgY29uc3QgcmVxdWlyZVBhdGNoID0gcGF0Y2hNb2RlID09PSBcInRydWVcIjtcbiAgY29uc3QgcGF0Y2hDb21tYW5kcyA9IHJlcXVpcmVQYXRjaCB8fCAocGF0Y2hNb2RlID09PSBcImF1dG9cIiAmJiBpc05vZGVEZXZlbG9wbWVudCgpKTtcbiAgbGV0IGluaXRpYWxDbGllbnQ6IFNzaDJDbGllbnQgfCB1bmRlZmluZWQgPSBvcHRpb25zLnNzaDJDbGllbnQ7XG4gIGNvbnN0IGluaXRpYWxQYXRjaGVkID0gcGF0Y2hDb21tYW5kcyA/IHBhdGNoU3NoMkV4ZWNXaXRob3V0UmVwbHkob3B0aW9ucy5zc2gyQ2xpZW50KSA6IGZhbHNlO1xuICBpZiAocmVxdWlyZVBhdGNoICYmICFpbml0aWFsUGF0Y2hlZCkge1xuICAgIG9wdGlvbnMuc3NoMkNsaWVudC5kZXN0cm95KCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW5zdGFsbGVkIHNzaDIgaW50ZXJuYWxzIGRvIG5vdCBzdXBwb3J0IHRoZSByZXF1aXJlZCBleGVjIG5vLXJlcGx5IHBhdGNoXCIpO1xuICB9XG4gIGxldCBsb2dnZWQgPSBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNlZWRlZCA9IGluaXRpYWxDbGllbnQgIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGluaXRpYWxDbGllbnQgPz8gKGF3YWl0IG9wdGlvbnMuY3JlYXRlU3NoMkNvbW1hbmRDbGllbnQoKSk7XG4gICAgICBpbml0aWFsQ2xpZW50ID0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmVzb3VyY2UgPSB0cmFja0NsaWVudChjbGllbnQpO1xuICAgICAgY29uc3QgcGF0Y2hlZCA9IHNlZWRlZFxuICAgICAgICA/IGluaXRpYWxQYXRjaGVkXG4gICAgICAgIDogcGF0Y2hDb21tYW5kc1xuICAgICAgICAgID8gcGF0Y2hTc2gyRXhlY1dpdGhvdXRSZXBseShjbGllbnQpXG4gICAgICAgICAgOiBmYWxzZTtcbiAgICAgIGlmIChyZXF1aXJlUGF0Y2ggJiYgIXBhdGNoZWQpIHtcbiAgICAgICAgY2xpZW50LmRlc3Ryb3koKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5zdGFsbGVkIHNzaDIgaW50ZXJuYWxzIGRvIG5vdCBzdXBwb3J0IHRoZSByZXF1aXJlZCBleGVjIG5vLXJlcGx5IHBhdGNoXCIpO1xuICAgICAgfVxuICAgICAgaWYgKCFsb2dnZWQpIHtcbiAgICAgICAgbG9nZ2VkID0gdHJ1ZTtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJ1c2luZyBwb29sZWQgc3NoMiBMYWtlYm94IHRyYW5zcG9ydFwiLCB7XG4gICAgICAgICAgcGF0Y2hNb2RlLFxuICAgICAgICAgIHBhdGNoZWQsXG4gICAgICAgICAgbm9kZUVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYsXG4gICAgICAgICAgdHJhbnNwb3J0TW9kZTogb3B0aW9ucy50cmFuc3BvcnQgPz8gXCJhdXRvXCIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc291cmNlO1xuICAgIH0sXG4gICAgZGVzdHJveTogKHJlc291cmNlKSA9PiBjbG9zZUNsaWVudChyZXNvdXJjZSwgb3B0aW9ucy5jb25uZWN0VGltZW91dE1zKSxcbiAgICAvLyBBIHJlbW90ZSBuby1vcCB3b3VsZCBjb25zdW1lIHRoZSBjb25uZWN0aW9uJ3Mgb25seSBwZXJtaXR0ZWQgb3BlcmF0aW9uLlxuICAgIHRlc3Q6IGFzeW5jIChyZXNvdXJjZSkgPT4gcmVzb3VyY2UuYWxpdmUsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRyYWNrQ2xpZW50KGNsaWVudDogU3NoMkNsaWVudCk6IFNzaDJSZXNvdXJjZSB7XG4gIGNvbnN0IHJlc291cmNlOiBTc2gyUmVzb3VyY2UgPSB7IGNsaWVudCwgYWxpdmU6IHRydWUgfTtcbiAgY29uc3QgbWFya0Nsb3NlZCA9ICgpID0+IHtcbiAgICByZXNvdXJjZS5hbGl2ZSA9IGZhbHNlO1xuICB9O1xuICBjbGllbnQub25jZShcImNsb3NlXCIsIG1hcmtDbG9zZWQpO1xuICBjbGllbnQub25jZShcImVycm9yXCIsIG1hcmtDbG9zZWQpO1xuICByZXR1cm4gcmVzb3VyY2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsb3NlQ2xpZW50KHJlc291cmNlOiBTc2gyUmVzb3VyY2UsIHRpbWVvdXRNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghcmVzb3VyY2UuYWxpdmUpIHtcbiAgICByZXNvdXJjZS5jbGllbnQuZGVzdHJveSgpO1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgY29uc3QgZmluaXNoID0gKCkgPT4ge1xuICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgcmVzb3VyY2UuYWxpdmUgPSBmYWxzZTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9O1xuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICByZXNvdXJjZS5jbGllbnQuZGVzdHJveSgpO1xuICAgICAgICBmaW5pc2goKTtcbiAgICAgIH0sXG4gICAgICBNYXRoLm1pbih0aW1lb3V0TXMsIDFfMDAwKSxcbiAgICApO1xuICAgIHRpbWVvdXQudW5yZWY/LigpO1xuICAgIHJlc291cmNlLmNsaWVudC5vbmNlKFwiY2xvc2VcIiwgZmluaXNoKTtcbiAgICByZXNvdXJjZS5jbGllbnQub25jZShcImVycm9yXCIsIGZpbmlzaCk7XG4gICAgcmVzb3VyY2UuY2xpZW50LmVuZCgpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhlY3V0ZUNvbW1hbmQoXG4gIHJlc291cmNlOiBTc2gyUmVzb3VyY2UsXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGVjdXRpb246IFNzaENvbW1hbmRFeGVjdXRpb24sXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IGNoYW5uZWw6IENsaWVudENoYW5uZWwgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGV4aXRDb2RlOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgcmVzb3VyY2UuY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgY2xpZW50Q2xvc2VkKTtcbiAgICAgIHJlc291cmNlLmNsaWVudC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIGNsaWVudENsb3NlZCk7XG4gICAgfTtcbiAgICBjb25zdCBmaW5pc2ggPSAoY29kZTogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICByZXNvbHZlKGNvZGUpO1xuICAgIH07XG4gICAgY29uc3QgZmFpbCA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfTtcbiAgICBjb25zdCBjbGllbnRDbG9zZWQgPSAoKSA9PiBmYWlsKG5ldyBFcnJvcihcInNzaDIgY29ubmVjdGlvbiBjbG9zZWQgZHVyaW5nIGNvbW1hbmQgZXhlY3V0aW9uXCIpKTtcbiAgICByZXNvdXJjZS5jbGllbnQub25jZShcImNsb3NlXCIsIGNsaWVudENsb3NlZCk7XG4gICAgcmVzb3VyY2UuY2xpZW50Lm9uY2UoXCJlcnJvclwiLCBjbGllbnRDbG9zZWQpO1xuICAgIGV4ZWN1dGlvbi5zZXRDYW5jZWwoKCkgPT4ge1xuICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNoYW5uZWw/LnNpZ25hbChcIktJTExcIik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVGhlIHJlbW90ZSBtYXkgY2xvc2UgdGhlIGNoYW5uZWwgYmVmb3JlIHRoZSBzaWduYWwgaXMgd3JpdHRlbi5cbiAgICAgIH1cbiAgICAgIGZpbmlzaCgxMzApO1xuICAgICAgY2hhbm5lbD8uY2xvc2UoKTtcbiAgICB9KTtcbiAgICBpZiAoZXhlY3V0aW9uLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBmaW5pc2goMTMwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzb3VyY2UuY2xpZW50LmV4ZWMoc2NyaXB0LCAoZXJyb3IsIG9wZW5lZENoYW5uZWwpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBmYWlsKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHNldHRsZWQpIHtcbiAgICAgICAgb3BlbmVkQ2hhbm5lbC5jbG9zZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjaGFubmVsID0gb3BlbmVkQ2hhbm5lbDtcbiAgICAgIGNoYW5uZWwub24oXCJkYXRhXCIsIGV4ZWN1dGlvbi5zdGRvdXQpO1xuICAgICAgY2hhbm5lbC5zdGRlcnIub24oXCJkYXRhXCIsIGV4ZWN1dGlvbi5zdGRlcnIpO1xuICAgICAgY2hhbm5lbC5vbihcImV4aXRcIiwgKGNvZGU6IG51bWJlciB8IG51bGwpID0+IHtcbiAgICAgICAgZXhpdENvZGUgPSBjb2RlID8/IDE7XG4gICAgICB9KTtcbiAgICAgIGNoYW5uZWwub25jZShcImVycm9yXCIsIGZhaWwpO1xuICAgICAgY2hhbm5lbC5vbmNlKFwiY2xvc2VcIiwgKCkgPT4gZmluaXNoKGV4aXRDb2RlID8/IDEpKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKiBBcHBseSB0aGUgRGF0YWJyaWNrcyBnYXRld2F5IGV4ZWMtcmVxdWVzdCB3b3JrYXJvdW5kIHdoZW4gaW50ZXJuYWxzIHBlcm1pdCBpdC4gKi9cbmZ1bmN0aW9uIHBhdGNoU3NoMkV4ZWNXaXRob3V0UmVwbHkoY2xpZW50OiBTc2gyQ2xpZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IGludGVybmFscyA9IGNsaWVudCBhcyB1bmtub3duIGFzIFNzaDJDbGllbnRJbnRlcm5hbHM7XG4gIGNvbnN0IHByb3RvY29sID0gaW50ZXJuYWxzLl9wcm90b2NvbDtcbiAgY29uc3QgY2hhbm5lbE1hbmFnZXIgPSBpbnRlcm5hbHMuX2NoYW5NZ3I7XG4gIGlmICghcHJvdG9jb2wgfHwgdHlwZW9mIHByb3RvY29sLmV4ZWMgIT09IFwiZnVuY3Rpb25cIiB8fCAhY2hhbm5lbE1hbmFnZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHBhdGNoZWRTc2gyUHJvdG9jb2xzLmhhcyhwcm90b2NvbCkpIHJldHVybiB0cnVlO1xuICBjb25zdCBvcmlnaW5hbEV4ZWMgPSBwcm90b2NvbC5leGVjLmJpbmQocHJvdG9jb2wpO1xuICBwcm90b2NvbC5leGVjID0gKGNoYW5uZWxJZCwgY29tbWFuZCkgPT4ge1xuICAgIG9yaWdpbmFsRXhlYyhjaGFubmVsSWQsIGNvbW1hbmQsIGZhbHNlKTtcbiAgICBjb25zdCBjaGFubmVsID0gT2JqZWN0LnZhbHVlcyhjaGFubmVsTWFuYWdlci5fY2hhbm5lbHMpLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGU/Lm91dGdvaW5nLmlkID09PSBjaGFubmVsSWQsXG4gICAgKTtcbiAgICBjb25zdCBjYWxsYmFjayA9IGNoYW5uZWw/Ll9jYWxsYmFja3Muc2hpZnQoKTtcbiAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzc2gyIGV4ZWMgY2FsbGJhY2sgcXVldWUgd2FzIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBuby1yZXBseSB3b3JrYXJvdW5kXCIpO1xuICAgIH1cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhmYWxzZSkpO1xuICB9O1xuICBwYXRjaGVkU3NoMlByb3RvY29scy5hZGQocHJvdG9jb2wpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNOb2RlRGV2ZWxvcG1lbnQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vZGVFbnYgPSBwcm9jZXNzLmVudi5OT0RFX0VOVj8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBub2RlRW52ID09PSBcImRldmVsb3BtZW50XCIgfHwgbm9kZUVudiA9PT0gXCJkZXZcIjtcbn1cblxuaW50ZXJmYWNlIFNzaDJFeGVjQ2hhbm5lbCB7XG4gIG91dGdvaW5nOiB7IGlkOiBudW1iZXIgfTtcbiAgX2NhbGxiYWNrczogQXJyYXk8KGhhZEVycm9yOiBib29sZWFuIHwgRXJyb3IpID0+IHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgU3NoMlByb3RvY29sIHtcbiAgZXhlYyhjaGFubmVsSWQ6IG51bWJlciwgY29tbWFuZDogc3RyaW5nIHwgQnVmZmVyLCB3YW50UmVwbHk/OiBib29sZWFuKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIFNzaDJDbGllbnRJbnRlcm5hbHMge1xuICBfcHJvdG9jb2w/OiBTc2gyUHJvdG9jb2w7XG4gIF9jaGFuTWdyPzogeyBfY2hhbm5lbHM6IFJlY29yZDxudW1iZXIsIFNzaDJFeGVjQ2hhbm5lbCB8IHVuZGVmaW5lZD4gfTtcbn1cbiJdfQ==
|
|
225
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3NzaF9zc2gyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19zc2hfc3NoMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0MsT0FBTyxFQUNMLGtCQUFrQixHQUtuQixNQUFNLFVBQVUsQ0FBQztBQUVsQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxPQUFPLEVBQWdCLENBQUM7QUFPekQsNkVBQTZFO0FBQzdFLE1BQU0sT0FBTyxhQUFjLFNBQVEsa0JBQWdDO0lBQ3hELElBQUksR0FBRyxNQUFlLENBQUM7SUFDZixnQkFBZ0IsQ0FBUztJQUUxQyxZQUFZLE9BQTRCLEVBQUUsY0FBOEIsRUFBRTtRQUN4RSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzVCLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7WUFDOUMsR0FBRyxXQUFXO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztJQUNuRCxDQUFDO0lBRVMsZUFBZSxDQUN2QixRQUFzQixFQUN0QixNQUFjLEVBQ2QsU0FBOEI7UUFFOUIsT0FBTyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRVMsbUJBQW1CLENBQzNCLFFBQXNCLEVBQ3RCLFVBQWtCLEVBQ2xCLFVBQWtCO1FBRWxCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksT0FBc0MsQ0FBQztZQUMzQyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUU7Z0JBQ25CLFlBQVksQ0FB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VUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsd0VBQXdFLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBQ0QsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUMsQ0FBQztJQUNGLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuQyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLGlCQUFpQjtJQUN4QixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMzRCxPQUFPLE9BQU8sS0FBSyxhQUFhLElBQUksT0FBTyxLQUFLLEtBQUssQ0FBQztBQUN4RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEdXBsZXggfSBmcm9tIFwibm9kZTpzdHJlYW1cIjtcbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IENsaWVudCBhcyBTc2gyQ2xpZW50LCBDbGllbnRDaGFubmVsIH0gZnJvbSBcInNzaDJcIjtcbmltcG9ydCB7XG4gIFBvb2xlZFNzaFRyYW5zcG9ydCxcbiAgdHlwZSBTc2hDb21tYW5kRXhlY3V0aW9uLFxuICB0eXBlIFNzaFBvb2xPcHRpb25zLFxuICB0eXBlIFNzaFJlc291cmNlTGlmZWN5Y2xlLFxuICB0eXBlIFNzaFRyYW5zcG9ydE9wdGlvbnMsXG59IGZyb20gXCIuL3NzaC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibGFrZWJveDpzc2gyXCIpO1xuY29uc3QgcGF0Y2hlZFNzaDJQcm90b2NvbHMgPSBuZXcgV2Vha1NldDxTc2gyUHJvdG9jb2w+KCk7XG5cbmludGVyZmFjZSBTc2gyUmVzb3VyY2Uge1xuICByZWFkb25seSBjbGllbnQ6IFNzaDJDbGllbnQ7XG4gIGFsaXZlOiBib29sZWFuO1xufVxuXG4vKiogRXhjbHVzaXZlIHNzaDIgY29ubmVjdGlvbiBwb29sIGZvciBjb21tYW5kcyBhbmQgZGlyZWN0IFRDUCBmb3J3YXJkaW5nLiAqL1xuZXhwb3J0IGNsYXNzIFNzaDJUcmFuc3BvcnQgZXh0ZW5kcyBQb29sZWRTc2hUcmFuc3BvcnQ8U3NoMlJlc291cmNlPiB7XG4gIHJlYWRvbmx5IGtpbmQgPSBcInNzaDJcIiBhcyBjb25zdDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0VGltZW91dE1zOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogU3NoVHJhbnNwb3J0T3B0aW9ucywgcG9vbE9wdGlvbnM6IFNzaFBvb2xPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihzc2gyTGlmZWN5Y2xlKG9wdGlvbnMpLCB7XG4gICAgICBhY3F1aXJlVGltZW91dE1pbGxpczogb3B0aW9ucy5jb25uZWN0VGltZW91dE1zLFxuICAgICAgLi4ucG9vbE9wdGlvbnMsXG4gICAgfSk7XG4gICAgdGhpcy5jb25uZWN0VGltZW91dE1zID0gb3B0aW9ucy5jb25uZWN0VGltZW91dE1zO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJ1bldpdGhSZXNvdXJjZShcbiAgICByZXNvdXJjZTogU3NoMlJlc291cmNlLFxuICAgIHNjcmlwdDogc3RyaW5nLFxuICAgIGV4ZWN1dGlvbjogU3NoQ29tbWFuZEV4ZWN1dGlvbixcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gZXhlY3V0ZUNvbW1hbmQocmVzb3VyY2UsIHNjcmlwdCwgZXhlY3V0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25uZWN0V2l0aFJlc291cmNlKFxuICAgIHJlc291cmNlOiBTc2gyUmVzb3VyY2UsXG4gICAgcmVtb3RlSG9zdDogc3RyaW5nLFxuICAgIHJlbW90ZVBvcnQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxEdXBsZXg+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCB0aW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgcmVzb3VyY2UuY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgY2xpZW50Q2xvc2VkKTtcbiAgICAgICAgcmVzb3VyY2UuY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgY2xpZW50RmFpbGVkKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBmYWlsID0gKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGNsaWVudENsb3NlZCA9ICgpID0+IHtcbiAgICAgICAgZmFpbChuZXcgRXJyb3IoXCJzc2gyIGNvbm5lY3Rpb24gY2xvc2VkIHdoaWxlIG9wZW5pbmcgZm9yd2FyZGluZ1wiKSk7XG4gICAgICB9O1xuICAgICAgY29uc3QgY2xpZW50RmFpbGVkID0gKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICBmYWlsKGVycm9yKTtcbiAgICAgIH07XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4gZmFpbChuZXcgRXJyb3IoYHNzaDIgZm9yd2FyZGluZyBkaWQgbm90IG9wZW4gd2l0aGluICR7dGhpcy5jb25uZWN0VGltZW91dE1zfW1zYCkpLFxuICAgICAgICB0aGlzLmNvbm5lY3RUaW1lb3V0TXMsXG4gICAgICApO1xuICAgICAgdGltZW91dC51bnJlZj8uKCk7XG4gICAgICByZXNvdXJjZS5jbGllbnQub25jZShcImNsb3NlXCIsIGNsaWVudENsb3NlZCk7XG4gICAgICByZXNvdXJjZS5jbGllbnQub25jZShcImVycm9yXCIsIGNsaWVudEZhaWxlZCk7XG4gICAgICByZXNvdXJjZS5jbGllbnQuZm9yd2FyZE91dChcIjEyNy4wLjAuMVwiLCAwLCByZW1vdGVIb3N0LCByZW1vdGVQb3J0LCAoZXJyb3IsIGNoYW5uZWwpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHtcbiAgICAgICAgICBjaGFubmVsPy5kZXN0cm95KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIGlmIChlcnJvcikgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgZWxzZSByZXNvbHZlKGNoYW5uZWwpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3NoMkxpZmVjeWNsZShvcHRpb25zOiBTc2hUcmFuc3BvcnRPcHRpb25zKTogU3NoUmVzb3VyY2VMaWZlY3ljbGU8U3NoMlJlc291cmNlPiB7XG4gIGNvbnN0IHBhdGNoTW9kZSA9IG9wdGlvbnMuc3NoMlBhdGNoID8/IFwiYXV0b1wiO1xuICBjb25zdCByZXF1aXJlUGF0Y2ggPSBwYXRjaE1vZGUgPT09IFwidHJ1ZVwiO1xuICBjb25zdCBwYXRjaENvbW1hbmRzID0gcmVxdWlyZVBhdGNoIHx8IChwYXRjaE1vZGUgPT09IFwiYXV0b1wiICYmIGlzTm9kZURldmVsb3BtZW50KCkpO1xuICBsZXQgaW5pdGlhbENsaWVudDogU3NoMkNsaWVudCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMuc3NoMkNsaWVudDtcbiAgY29uc3QgaW5pdGlhbFBhdGNoZWQgPSBwYXRjaENvbW1hbmRzID8gcGF0Y2hTc2gyRXhlY1dpdGhvdXRSZXBseShvcHRpb25zLnNzaDJDbGllbnQpIDogZmFsc2U7XG4gIGlmIChyZXF1aXJlUGF0Y2ggJiYgIWluaXRpYWxQYXRjaGVkKSB7XG4gICAgb3B0aW9ucy5zc2gyQ2xpZW50LmRlc3Ryb3koKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnN0YWxsZWQgc3NoMiBpbnRlcm5hbHMgZG8gbm90IHN1cHBvcnQgdGhlIHJlcXVpcmVkIGV4ZWMgbm8tcmVwbHkgcGF0Y2hcIik7XG4gIH1cbiAgbGV0IGxvZ2dlZCA9IGZhbHNlO1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZTogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VlZGVkID0gaW5pdGlhbENsaWVudCAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgY2xpZW50ID0gaW5pdGlhbENsaWVudCA/PyAoYXdhaXQgb3B0aW9ucy5jcmVhdGVTc2gyQ29tbWFuZENsaWVudCgpKTtcbiAgICAgIGluaXRpYWxDbGllbnQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IHRyYWNrQ2xpZW50KGNsaWVudCk7XG4gICAgICBjb25zdCBwYXRjaGVkID0gc2VlZGVkXG4gICAgICAgID8gaW5pdGlhbFBhdGNoZWRcbiAgICAgICAgOiBwYXRjaENvbW1hbmRzXG4gICAgICAgICAgPyBwYXRjaFNzaDJFeGVjV2l0aG91dFJlcGx5KGNsaWVudClcbiAgICAgICAgICA6IGZhbHNlO1xuICAgICAgaWYgKHJlcXVpcmVQYXRjaCAmJiAhcGF0Y2hlZCkge1xuICAgICAgICBjbGllbnQuZGVzdHJveSgpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnN0YWxsZWQgc3NoMiBpbnRlcm5hbHMgZG8gbm90IHN1cHBvcnQgdGhlIHJlcXVpcmVkIGV4ZWMgbm8tcmVwbHkgcGF0Y2hcIik7XG4gICAgICB9XG4gICAgICBpZiAoIWxvZ2dlZCkge1xuICAgICAgICBsb2dnZWQgPSB0cnVlO1xuICAgICAgICBsb2dnZXIud2FybihcInVzaW5nIHBvb2xlZCBzc2gyIExha2Vib3ggdHJhbnNwb3J0XCIsIHtcbiAgICAgICAgICBwYXRjaE1vZGUsXG4gICAgICAgICAgcGF0Y2hlZCxcbiAgICAgICAgICBub2RlRW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcbiAgICAgICAgICB0cmFuc3BvcnRNb2RlOiBvcHRpb25zLnRyYW5zcG9ydCA/PyBcImF1dG9cIixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb3VyY2U7XG4gICAgfSxcbiAgICBkZXN0cm95OiAocmVzb3VyY2UpID0+IGNsb3NlQ2xpZW50KHJlc291cmNlLCBvcHRpb25zLmNvbm5lY3RUaW1lb3V0TXMpLFxuICAgIC8vIEEgcmVtb3RlIG5vLW9wIHdvdWxkIGNvbnN1bWUgdGhlIGNvbm5lY3Rpb24ncyBvbmx5IHBlcm1pdHRlZCBvcGVyYXRpb24uXG4gICAgdGVzdDogYXN5bmMgKHJlc291cmNlKSA9PiByZXNvdXJjZS5hbGl2ZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJhY2tDbGllbnQoY2xpZW50OiBTc2gyQ2xpZW50KTogU3NoMlJlc291cmNlIHtcbiAgY29uc3QgcmVzb3VyY2U6IFNzaDJSZXNvdXJjZSA9IHsgY2xpZW50LCBhbGl2ZTogdHJ1ZSB9O1xuICBjb25zdCBtYXJrQ2xvc2VkID0gKCkgPT4ge1xuICAgIHJlc291cmNlLmFsaXZlID0gZmFsc2U7XG4gIH07XG4gIGNsaWVudC5vbmNlKFwiY2xvc2VcIiwgbWFya0Nsb3NlZCk7XG4gIGNsaWVudC5vbmNlKFwiZXJyb3JcIiwgbWFya0Nsb3NlZCk7XG4gIHJldHVybiByZXNvdXJjZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xvc2VDbGllbnQocmVzb3VyY2U6IFNzaDJSZXNvdXJjZSwgdGltZW91dE1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFyZXNvdXJjZS5hbGl2ZSkge1xuICAgIHJlc291cmNlLmNsaWVudC5kZXN0cm95KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBmaW5pc2ggPSAoKSA9PiB7XG4gICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICByZXNvdXJjZS5hbGl2ZSA9IGZhbHNlO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJlc291cmNlLmNsaWVudC5kZXN0cm95KCk7XG4gICAgICAgIGZpbmlzaCgpO1xuICAgICAgfSxcbiAgICAgIE1hdGgubWluKHRpbWVvdXRNcywgMV8wMDApLFxuICAgICk7XG4gICAgdGltZW91dC51bnJlZj8uKCk7XG4gICAgcmVzb3VyY2UuY2xpZW50Lm9uY2UoXCJjbG9zZVwiLCBmaW5pc2gpO1xuICAgIHJlc291cmNlLmNsaWVudC5vbmNlKFwiZXJyb3JcIiwgZmluaXNoKTtcbiAgICByZXNvdXJjZS5jbGllbnQuZW5kKCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGVjdXRlQ29tbWFuZChcbiAgcmVzb3VyY2U6IFNzaDJSZXNvdXJjZSxcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4ZWN1dGlvbjogU3NoQ29tbWFuZEV4ZWN1dGlvbixcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgY2hhbm5lbDogQ2xpZW50Q2hhbm5lbCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZXhpdENvZGU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICByZXNvdXJjZS5jbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLCBjbGllbnRDbG9zZWQpO1xuICAgICAgcmVzb3VyY2UuY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgY2xpZW50Q2xvc2VkKTtcbiAgICB9O1xuICAgIGNvbnN0IGZpbmlzaCA9IChjb2RlOiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIHJlc29sdmUoY29kZSk7XG4gICAgfTtcbiAgICBjb25zdCBmYWlsID0gKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuICAgIGNvbnN0IGNsaWVudENsb3NlZCA9ICgpID0+IGZhaWwobmV3IEVycm9yKFwic3NoMiBjb25uZWN0aW9uIGNsb3NlZCBkdXJpbmcgY29tbWFuZCBleGVjdXRpb25cIikpO1xuICAgIHJlc291cmNlLmNsaWVudC5vbmNlKFwiY2xvc2VcIiwgY2xpZW50Q2xvc2VkKTtcbiAgICByZXNvdXJjZS5jbGllbnQub25jZShcImVycm9yXCIsIGNsaWVudENsb3NlZCk7XG4gICAgZXhlY3V0aW9uLnNldENhbmNlbCgoKSA9PiB7XG4gICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2hhbm5lbD8uc2lnbmFsKFwiS0lMTFwiKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgcmVtb3RlIG1heSBjbG9zZSB0aGUgY2hhbm5lbCBiZWZvcmUgdGhlIHNpZ25hbCBpcyB3cml0dGVuLlxuICAgICAgfVxuICAgICAgZmluaXNoKDEzMCk7XG4gICAgICBjaGFubmVsPy5jbG9zZSgpO1xuICAgIH0pO1xuICAgIGlmIChleGVjdXRpb24uc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGZpbmlzaCgxMzApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXNvdXJjZS5jbGllbnQuZXhlYyhzY3JpcHQsIChlcnJvciwgb3BlbmVkQ2hhbm5lbCkgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGZhaWwoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoc2V0dGxlZCkge1xuICAgICAgICBvcGVuZWRDaGFubmVsLmNsb3NlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNoYW5uZWwgPSBvcGVuZWRDaGFubmVsO1xuICAgICAgY2hhbm5lbC5vbihcImRhdGFcIiwgZXhlY3V0aW9uLnN0ZG91dCk7XG4gICAgICBjaGFubmVsLnN0ZGVyci5vbihcImRhdGFcIiwgZXhlY3V0aW9uLnN0ZGVycik7XG4gICAgICBjaGFubmVsLm9uKFwiZXhpdFwiLCAoY29kZTogbnVtYmVyIHwgbnVsbCkgPT4ge1xuICAgICAgICBleGl0Q29kZSA9IGNvZGUgPz8gMTtcbiAgICAgIH0pO1xuICAgICAgY2hhbm5lbC5vbmNlKFwiZXJyb3JcIiwgZmFpbCk7XG4gICAgICBjaGFubmVsLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiBmaW5pc2goZXhpdENvZGUgPz8gMSkpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqIEFwcGx5IHRoZSBEYXRhYnJpY2tzIGdhdGV3YXkgZXhlYy1yZXF1ZXN0IHdvcmthcm91bmQgd2hlbiBpbnRlcm5hbHMgcGVybWl0IGl0LiAqL1xuZnVuY3Rpb24gcGF0Y2hTc2gyRXhlY1dpdGhvdXRSZXBseShjbGllbnQ6IFNzaDJDbGllbnQpOiBib29sZWFuIHtcbiAgY29uc3QgaW50ZXJuYWxzID0gY2xpZW50IGFzIHVua25vd24gYXMgU3NoMkNsaWVudEludGVybmFscztcbiAgY29uc3QgcHJvdG9jb2wgPSBpbnRlcm5hbHMuX3Byb3RvY29sO1xuICBjb25zdCBjaGFubmVsTWFuYWdlciA9IGludGVybmFscy5fY2hhbk1ncjtcbiAgaWYgKCFwcm90b2NvbCB8fCB0eXBlb2YgcHJvdG9jb2wuZXhlYyAhPT0gXCJmdW5jdGlvblwiIHx8ICFjaGFubmVsTWFuYWdlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAocGF0Y2hlZFNzaDJQcm90b2NvbHMuaGFzKHByb3RvY29sKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG9yaWdpbmFsRXhlYyA9IHByb3RvY29sLmV4ZWMuYmluZChwcm90b2NvbCk7XG4gIHByb3RvY29sLmV4ZWMgPSAoY2hhbm5lbElkLCBjb21tYW5kKSA9PiB7XG4gICAgb3JpZ2luYWxFeGVjKGNoYW5uZWxJZCwgY29tbWFuZCwgZmFsc2UpO1xuICAgIGNvbnN0IGNoYW5uZWwgPSBPYmplY3QudmFsdWVzKGNoYW5uZWxNYW5hZ2VyLl9jaGFubmVscykuZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZT8ub3V0Z29pbmcuaWQgPT09IGNoYW5uZWxJZCxcbiAgICApO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gY2hhbm5lbD8uX2NhbGxiYWNrcy5zaGlmdCgpO1xuICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNzaDIgZXhlYyBjYWxsYmFjayBxdWV1ZSB3YXMgbm90IGF2YWlsYWJsZSBmb3IgdGhlIG5vLXJlcGx5IHdvcmthcm91bmRcIik7XG4gICAgfVxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGNhbGxiYWNrKGZhbHNlKSk7XG4gIH07XG4gIHBhdGNoZWRTc2gyUHJvdG9jb2xzLmFkZChwcm90b2NvbCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc05vZGVEZXZlbG9wbWVudCgpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9kZUVudiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WPy50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVFbnYgPT09IFwiZGV2ZWxvcG1lbnRcIiB8fCBub2RlRW52ID09PSBcImRldlwiO1xufVxuXG5pbnRlcmZhY2UgU3NoMkV4ZWNDaGFubmVsIHtcbiAgb3V0Z29pbmc6IHsgaWQ6IG51bWJlciB9O1xuICBfY2FsbGJhY2tzOiBBcnJheTwoaGFkRXJyb3I6IGJvb2xlYW4gfCBFcnJvcikgPT4gdm9pZD47XG59XG5cbmludGVyZmFjZSBTc2gyUHJvdG9jb2wge1xuICBleGVjKGNoYW5uZWxJZDogbnVtYmVyLCBjb21tYW5kOiBzdHJpbmcgfCBCdWZmZXIsIHdhbnRSZXBseT86IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgU3NoMkNsaWVudEludGVybmFscyB7XG4gIF9wcm90b2NvbD86IFNzaDJQcm90b2NvbDtcbiAgX2NoYW5NZ3I/OiB7IF9jaGFubmVsczogUmVjb3JkPG51bWJlciwgU3NoMkV4ZWNDaGFubmVsIHwgdW5kZWZpbmVkPiB9O1xufVxuIl19
|
package/lib/src/key-store.js
CHANGED
|
@@ -2,7 +2,7 @@ import { createHash, randomBytes } from "node:crypto";
|
|
|
2
2
|
import { chmod, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
-
import {
|
|
5
|
+
import { withFileLock } from "@dbx-tools/core";
|
|
6
6
|
import ssh2 from "ssh2";
|
|
7
7
|
const { utils } = ssh2;
|
|
8
8
|
/**
|
|
@@ -73,7 +73,7 @@ export class SshKeyStore {
|
|
|
73
73
|
if (stored)
|
|
74
74
|
return stored;
|
|
75
75
|
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
76
|
-
return
|
|
76
|
+
return withFileLock(["lakebox-ssh-key", privatePath], async () => {
|
|
77
77
|
const rechecked = await readStoredKey(privatePath, publicPath);
|
|
78
78
|
if (rechecked)
|
|
79
79
|
return rechecked;
|
|
@@ -142,4 +142,4 @@ function sshKeyAlgorithm(key) {
|
|
|
142
142
|
throw new Error("SSH gateway returned an invalid host key algorithm");
|
|
143
143
|
return algorithm;
|
|
144
144
|
}
|
|
145
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2tleS1zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0RCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUd4QixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBU3ZCOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBRU87SUFEN0IsaUZBQWlGO0lBQ2pGLFlBQTZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUM7UUFBL0MsU0FBSSxHQUFKLElBQUksQ0FBMkM7SUFBRyxDQUFDO0lBRWhGOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsR0FBa0IsRUFDbEIsS0FBYSxFQUNiLE1BQW9CO1FBRXBCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RSxNQUFNLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxD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QUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFGLENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxLQUFhO0lBQzNCLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsR0FBVztJQUNsQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUNoRixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDdkIsSUFBSSxNQUFNLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUNsRyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztJQUNoRyxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCwgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IGNobW9kLCBta2RpciwgcmVhZEZpbGUsIHJlbmFtZSwgcm0sIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlTG9jayB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCBzc2gyIGZyb20gXCJzc2gyXCI7XG5pbXBvcnQgdHlwZSB7IExha2Vib3hDbGllbnQgfSBmcm9tIFwiLi9yZXN0LnRzXCI7XG5cbmNvbnN0IHsgdXRpbHMgfSA9IHNzaDI7XG5cbmludGVyZmFjZSBTdG9yZWRLZXkge1xuICBwcml2YXRlS2V5OiBzdHJpbmc7XG4gIHByaXZhdGVLZXlQYXRoOiBzdHJpbmc7XG4gIHB1YmxpY0tleTogc3RyaW5nO1xuICBrZXlIYXNoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RvcmVzIGNhbGxlci1zY29wZWQgU1NIIGtleXMgYW5kIHRydXN0ZWQgRGF0YWJyaWNrcyBnYXRld2F5IGhvc3Qga2V5cy5cbiAqXG4gKiBFYWNoIHdvcmtzcGFjZSBhbmQgY2FsbGVyIGlkZW50aXR5IHJlY2VpdmVzIGEgc2VwYXJhdGUgRWQyNTUxOSBrZXkgcGFpci4gVGhlXG4gKiBzdG9yZSB3cml0ZXMgcHJpdmF0ZSBrZXlzLCBnYXRld2F5IGZpbmdlcnByaW50cywgYW5kIE9wZW5TU0gga25vd24taG9zdCBmaWxlc1xuICogd2l0aCBvd25lci1vbmx5IHBlcm1pc3Npb25zIGJlbmVhdGggdGhlIGNvbmZpZ3VyZWQgcm9vdCBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTc2hLZXlTdG9yZSB7XG4gIC8qKiBDcmVhdGVzIGEga2V5IHN0b3JlIHJvb3RlZCBhdCB0aGUgZGVmYXVsdCBkYngtdG9vbHMgYXBwbGljYXRpb24tZGF0YSBwYXRoLiAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJvb3QgPSBqb2luKGhvbWVkaXIoKSwgXCIuZGJ4LXRvb2xzXCIsIFwibGFrZWJveFwiKSkge31cblxuICAvKipcbiAgICogTG9hZHMgb3IgY3JlYXRlcyB0aGUgY2FsbGVyIGtleSBwYWlyIGFuZCByZWdpc3RlcnMgaXRzIHB1YmxpYyBrZXkgd2hlbiB0aGVcbiAgICogd29ya3NwYWNlIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiB0aGUgbWF0Y2hpbmcga2V5IGhhc2guXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsb2NhbCBrZXkgbWF0ZXJpYWwgYW5kIHRoZSBnYXRld2F5IGhvc3QgcmV0dXJuZWQgYnkgRGF0YWJyaWNrcyxcbiAgICogd2hlbiBhdmFpbGFibGUuXG4gICAqL1xuICBhc3luYyBlbnN1cmVSZWdpc3RlcmVkKFxuICAgIGFwaTogTGFrZWJveENsaWVudCxcbiAgICBvd25lcjogc3RyaW5nLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFN0b3JlZEtleSAmIHsgZ2F0ZXdheUhvc3Q/OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMubG9hZE9yQ3JlYXRlKGF3YWl0IGFwaS53b3Jrc3BhY2VTY29wZSgpLCBvd25lcik7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IGFwaS5saXN0S2V5cyhzaWduYWwpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0ga2V5cy5maW5kKChlbnRyeSkgPT4gZW50cnkua2V5SGFzaCA9PT0ga2V5LmtleUhhc2gpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgcmV0dXJuIHsgLi4ua2V5LCAuLi4oZXhpc3RpbmcuZ2F0ZXdheUhvc3QgPyB7IGdhdGV3YXlIb3N0OiBleGlzdGluZy5nYXRld2F5SG9zdCB9IDoge30pIH07XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBhd2FpdCBhcGkucmVnaXN0ZXJLZXkoXG4gICAgICBrZXkucHVibGljS2V5LFxuICAgICAgYGRieC10b29scy1sYWtlYm94OiR7a2V5LmtleUhhc2h9YCxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5rZXksXG4gICAgICAuLi4ocmVnaXN0ZXJlZC5nYXRld2F5SG9zdCA/IHsgZ2F0ZXdheUhvc3Q6IHJlZ2lzdGVyZWQuZ2F0ZXdheUhvc3QgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHN0b3JlZCBTSEEtMjU2IGdhdGV3YXkgZmluZ2VycHJpbnQsIG9yIGB1bmRlZmluZWRgIHdoZW4gdW50cnVzdGVkLiAqL1xuICBhc3luYyBrbm93bkhvc3QoXG4gICAgc2NvcGU6IHN0cmluZyxcbiAgICBvd25lcjogc3RyaW5nLFxuICAgIGhvc3Q6IHN0cmluZyxcbiAgICBwb3J0OiBudW1iZXIsXG4gICk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcmVhZEZpbGUodGhpcy5ob3N0RmluZ2VycHJpbnRQYXRoKHNjb3BlLCBvd25lciwgaG9zdCwgcG9ydCksIFwidXRmOFwiKTtcbiAgICAgIHJldHVybiB2YWx1ZS50cmltKCkgfHwgdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgT3BlblNTSCBrbm93bi1ob3N0IGZpbGUgcGF0aCBmb3Igb25lIHdvcmtzcGFjZSwgdXNlciwgYW5kIGdhdGV3YXkuICovXG4gIGtub3duSG9zdHNQYXRoKHNjb3BlOiBzdHJpbmcsIG93bmVyOiBzdHJpbmcsIGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gam9pbih0aGlzLmRpcmVjdG9yeShzY29wZSwgb3duZXIpLCBgaG9zdC0ke2RpZ2VzdChgJHtob3N0fVxcMCR7cG9ydH1gKX0ua25vd25faG9zdHNgKTtcbiAgfVxuXG4gIC8qKiBTdG9yZXMgdGhlIGFjY2VwdGVkIGdhdGV3YXkgZmluZ2VycHJpbnQgYW5kIE9wZW5TU0ggaG9zdC1rZXkgZW50cnkuICovXG4gIGFzeW5jIHJlbWVtYmVySG9zdChcbiAgICBzY29wZTogc3RyaW5nLFxuICAgIG93bmVyOiBzdHJpbmcsXG4gICAgaG9zdDogc3RyaW5nLFxuICAgIHBvcnQ6IG51bWJlcixcbiAgICBmaW5nZXJwcmludDogc3RyaW5nLFxuICAgIGtleTogQnVmZmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkaXJlY3RvcnkgPSB0aGlzLmRpcmVjdG9yeShzY29wZSwgb3duZXIpO1xuICAgIGF3YWl0IG1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIG1vZGU6IDBvNzAwIH0pO1xuICAgIGNvbnN0IGZpbmdlcnByaW50UGF0aCA9IHRoaXMuaG9zdEZpbmdlcnByaW50UGF0aChzY29wZSwgb3duZXIsIGhvc3QsIHBvcnQpO1xuICAgIGNvbnN0IGtub3duSG9zdHNQYXRoID0gdGhpcy5rbm93bkhvc3RzUGF0aChzY29wZSwgb3duZXIsIGhvc3QsIHBvcnQpO1xuICAgIGNvbnN0IGtub3duSG9zdCA9IGBbJHtob3N0fV06JHtwb3J0fSAke3NzaEtleUFsZ29yaXRobShrZXkpfSAke2tleS50b1N0cmluZyhcImJhc2U2NFwiKX1cXG5gO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHdyaXRlRmlsZShmaW5nZXJwcmludFBhdGgsIGAke2ZpbmdlcnByaW50fVxcbmAsIHsgbW9kZTogMG82MDAgfSksXG4gICAgICB3cml0ZUZpbGUoa25vd25Ib3N0c1BhdGgsIGtub3duSG9zdCwgeyBtb2RlOiAwbzYwMCB9KSxcbiAgICBdKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbY2htb2QoZmluZ2VycHJpbnRQYXRoLCAwbzYwMCksIGNobW9kKGtub3duSG9zdHNQYXRoLCAwbzYwMCldKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE9yQ3JlYXRlKHNjb3BlOiBzdHJpbmcsIG93bmVyOiBzdHJpbmcpOiBQcm9taXNlPFN0b3JlZEtleT4ge1xuICAgIGNvbnN0IGRpcmVjdG9yeSA9IHRoaXMuZGlyZWN0b3J5KHNjb3BlLCBvd25lcik7XG4gICAgY29uc3QgcHJpdmF0ZVBhdGggPSBqb2luKGRpcmVjdG9yeSwgXCJpZF9lZDI1NTE5XCIpO1xuICAgIGNvbnN0IHB1YmxpY1BhdGggPSBgJHtwcml2YXRlUGF0aH0ucHViYDtcbiAgICBjb25zdCBzdG9yZWQgPSBhd2FpdCByZWFkU3RvcmVkS2V5KHByaXZhdGVQYXRoLCBwdWJsaWNQYXRoKTtcbiAgICBpZiAoc3RvcmVkKSByZXR1cm4gc3RvcmVkO1xuICAgIGF3YWl0IG1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIG1vZGU6IDBvNzAwIH0pO1xuICAgIHJldHVybiBmaWxlTG9jay53aXRoRmlsZUxvY2soW1wibGFrZWJveC1zc2gta2V5XCIsIHByaXZhdGVQYXRoXSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVjaGVja2VkID0gYXdhaXQgcmVhZFN0b3JlZEtleShwcml2YXRlUGF0aCwgcHVibGljUGF0aCk7XG4gICAgICBpZiAocmVjaGVja2VkKSByZXR1cm4gcmVjaGVja2VkO1xuXG4gICAgICBjb25zdCBnZW5lcmF0ZWQgPSB1dGlscy5nZW5lcmF0ZUtleVBhaXJTeW5jKFwiZWQyNTUxOVwiKTtcbiAgICAgIGNvbnN0IHByaXZhdGVLZXkgPSBnZW5lcmF0ZWQucHJpdmF0ZTtcbiAgICAgIGNvbnN0IHB1YmxpY0tleSA9IGdlbmVyYXRlZC5wdWJsaWM7XG4gICAgICBjb25zdCBzdWZmaXggPSBgJHtwcm9jZXNzLnBpZH0tJHtyYW5kb21CeXRlcyg4KS50b1N0cmluZyhcImhleFwiKX1gO1xuICAgICAgY29uc3Qgc3RhZ2VkUHJpdmF0ZSA9IGAke3ByaXZhdGVQYXRofS4ke3N1ZmZpeH1gO1xuICAgICAgY29uc3Qgc3RhZ2VkUHVibGljID0gYCR7cHVibGljUGF0aH0uJHtzdWZmaXh9YDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShzdGFnZWRQcml2YXRlLCBwcml2YXRlS2V5LCB7IG1vZGU6IDBvNjAwIH0pO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoc3RhZ2VkUHVibGljLCBgJHtwdWJsaWNLZXkudHJpbSgpfVxcbmAsIHsgbW9kZTogMG82MDAgfSk7XG4gICAgICAgIGF3YWl0IHJlbmFtZShzdGFnZWRQcml2YXRlLCBwcml2YXRlUGF0aCk7XG4gICAgICAgIGF3YWl0IHJlbmFtZShzdGFnZWRQdWJsaWMsIHB1YmxpY1BhdGgpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbY2htb2QocHJpdmF0ZVBhdGgsIDBvNjAwKSwgY2htb2QocHVibGljUGF0aCwgMG82MDApXSk7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZWFkU3RvcmVkS2V5KHByaXZhdGVQYXRoLCBwdWJsaWNQYXRoKTtcbiAgICAgICAgaWYgKCFjcmVhdGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJTU0gga2V5IGZpbGVzIHdlcmUgbm90IHB1Ymxpc2hlZCBhdG9taWNhbGx5XCIpO1xuICAgICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtybShzdGFnZWRQcml2YXRlLCB7IGZvcmNlOiB0cnVlIH0pLCBybShzdGFnZWRQdWJsaWMsIHsgZm9yY2U6IHRydWUgfSldKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaG9zdEZpbmdlcnByaW50UGF0aChzY29wZTogc3RyaW5nLCBvd25lcjogc3RyaW5nLCBob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGpvaW4odGhpcy5kaXJlY3Rvcnkoc2NvcGUsIG93bmVyKSwgYGhvc3QtJHtkaWdlc3QoYCR7aG9zdH1cXDAke3BvcnR9YCl9LnNoYTI1NmApO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXJlY3Rvcnkoc2NvcGU6IHN0cmluZywgb3duZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGpvaW4odGhpcy5yb290LCBkaWdlc3QoYCR7c2NvcGV9XFwwJHtvd25lcn1gKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFN0b3JlZEtleShcbiAgcHJpdmF0ZVBhdGg6IHN0cmluZyxcbiAgcHVibGljUGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxTdG9yZWRLZXkgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBbcHJpdmF0ZUtleSwgcHVibGljS2V5XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHJlYWRGaWxlKHByaXZhdGVQYXRoLCBcInV0ZjhcIiksXG4gICAgICByZWFkRmlsZShwdWJsaWNQYXRoLCBcInV0ZjhcIiksXG4gICAgXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByaXZhdGVLZXksXG4gICAgICBwcml2YXRlS2V5UGF0aDogcHJpdmF0ZVBhdGgsXG4gICAgICBwdWJsaWNLZXksXG4gICAgICBrZXlIYXNoOiBwdWJsaWNLZXlIYXNoKHB1YmxpY0tleSksXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdWJsaWNLZXlIYXNoKHB1YmxpY0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHB1YmxpY0tleS50cmltKCkuc3BsaXQoL1xccysvKS5zbGljZSgwLCAyKS5qb2luKFwiIFwiKTtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKG5vcm1hbGl6ZWQpLmRpZ2VzdCgpLnN1YmFycmF5KDAsIDE2KS50b1N0cmluZyhcImhleFwiKTtcbn1cblxuZnVuY3Rpb24gZGlnZXN0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUodmFsdWUpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCAzMik7XG59XG5cbmZ1bmN0aW9uIHNzaEtleUFsZ29yaXRobShrZXk6IEJ1ZmZlcik6IHN0cmluZyB7XG4gIGlmIChrZXkubGVuZ3RoIDwgNSkgdGhyb3cgbmV3IEVycm9yKFwiU1NIIGdhdGV3YXkgcmV0dXJuZWQgYW4gaW52YWxpZCBob3N0IGtleVwiKTtcbiAgY29uc3QgbGVuZ3RoID0ga2V5LnJlYWRVSW50MzJCRSgwKTtcbiAgY29uc3QgZW5kID0gNCArIGxlbmd0aDtcbiAgaWYgKGxlbmd0aCA9PT0gMCB8fCBlbmQgPiBrZXkubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoXCJTU0ggZ2F0ZXdheSByZXR1cm5lZCBhbiBpbnZhbGlkIGhvc3Qga2V5XCIpO1xuICBjb25zdCBhbGdvcml0aG0gPSBrZXkuc3ViYXJyYXkoNCwgZW5kKS50b1N0cmluZyhcImFzY2lpXCIpO1xuICBpZiAoL1xccy8udGVzdChhbGdvcml0aG0pKSB0aHJvdyBuZXcgRXJyb3IoXCJTU0ggZ2F0ZXdheSByZXR1cm5lZCBhbiBpbnZhbGlkIGhvc3Qga2V5IGFsZ29yaXRobVwiKTtcbiAgcmV0dXJuIGFsZ29yaXRobTtcbn1cbiJdfQ==
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2tleS1zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0RCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUd4QixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBU3ZCOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBRU87SUFEN0IsaUZBQWlGO0lBQ2pGLFlBQTZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUM7UUFBL0MsU0FBSSxHQUFKLElBQUksQ0FBMkM7SUFBRyxDQUFDO0lBRWhGOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsR0FBa0IsRUFDbEIsS0FBYSxFQUNiLE1BQW9CO1FBRXBCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RSxNQUFNLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxD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QUFDLENBQUM7QUFDMUYsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLEtBQWE7SUFDM0IsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxHQUFXO0lBQ2xDLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQ2hGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUN2QixJQUFJLE1BQU0sS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQ2xHLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6RCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQ2hHLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoLCByYW5kb21CeXRlcyB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgY2htb2QsIG1rZGlyLCByZWFkRmlsZSwgcmVuYW1lLCBybSwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHdpdGhGaWxlTG9jayB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCBzc2gyIGZyb20gXCJzc2gyXCI7XG5pbXBvcnQgdHlwZSB7IExha2Vib3hDbGllbnQgfSBmcm9tIFwiLi9yZXN0LnRzXCI7XG5cbmNvbnN0IHsgdXRpbHMgfSA9IHNzaDI7XG5cbmludGVyZmFjZSBTdG9yZWRLZXkge1xuICBwcml2YXRlS2V5OiBzdHJpbmc7XG4gIHByaXZhdGVLZXlQYXRoOiBzdHJpbmc7XG4gIHB1YmxpY0tleTogc3RyaW5nO1xuICBrZXlIYXNoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RvcmVzIGNhbGxlci1zY29wZWQgU1NIIGtleXMgYW5kIHRydXN0ZWQgRGF0YWJyaWNrcyBnYXRld2F5IGhvc3Qga2V5cy5cbiAqXG4gKiBFYWNoIHdvcmtzcGFjZSBhbmQgY2FsbGVyIGlkZW50aXR5IHJlY2VpdmVzIGEgc2VwYXJhdGUgRWQyNTUxOSBrZXkgcGFpci4gVGhlXG4gKiBzdG9yZSB3cml0ZXMgcHJpdmF0ZSBrZXlzLCBnYXRld2F5IGZpbmdlcnByaW50cywgYW5kIE9wZW5TU0gga25vd24taG9zdCBmaWxlc1xuICogd2l0aCBvd25lci1vbmx5IHBlcm1pc3Npb25zIGJlbmVhdGggdGhlIGNvbmZpZ3VyZWQgcm9vdCBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTc2hLZXlTdG9yZSB7XG4gIC8qKiBDcmVhdGVzIGEga2V5IHN0b3JlIHJvb3RlZCBhdCB0aGUgZGVmYXVsdCBkYngtdG9vbHMgYXBwbGljYXRpb24tZGF0YSBwYXRoLiAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJvb3QgPSBqb2luKGhvbWVkaXIoKSwgXCIuZGJ4LXRvb2xzXCIsIFwibGFrZWJveFwiKSkge31cblxuICAvKipcbiAgICogTG9hZHMgb3IgY3JlYXRlcyB0aGUgY2FsbGVyIGtleSBwYWlyIGFuZCByZWdpc3RlcnMgaXRzIHB1YmxpYyBrZXkgd2hlbiB0aGVcbiAgICogd29ya3NwYWNlIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiB0aGUgbWF0Y2hpbmcga2V5IGhhc2guXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsb2NhbCBrZXkgbWF0ZXJpYWwgYW5kIHRoZSBnYXRld2F5IGhvc3QgcmV0dXJuZWQgYnkgRGF0YWJyaWNrcyxcbiAgICogd2hlbiBhdmFpbGFibGUuXG4gICAqL1xuICBhc3luYyBlbnN1cmVSZWdpc3RlcmVkKFxuICAgIGFwaTogTGFrZWJveENsaWVudCxcbiAgICBvd25lcjogc3RyaW5nLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFN0b3JlZEtleSAmIHsgZ2F0ZXdheUhvc3Q/OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMubG9hZE9yQ3JlYXRlKGF3YWl0IGFwaS53b3Jrc3BhY2VTY29wZSgpLCBvd25lcik7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IGFwaS5saXN0S2V5cyhzaWduYWwpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0ga2V5cy5maW5kKChlbnRyeSkgPT4gZW50cnkua2V5SGFzaCA9PT0ga2V5LmtleUhhc2gpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgcmV0dXJuIHsgLi4ua2V5LCAuLi4oZXhpc3RpbmcuZ2F0ZXdheUhvc3QgPyB7IGdhdGV3YXlIb3N0OiBleGlzdGluZy5nYXRld2F5SG9zdCB9IDoge30pIH07XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBhd2FpdCBhcGkucmVnaXN0ZXJLZXkoXG4gICAgICBrZXkucHVibGljS2V5LFxuICAgICAgYGRieC10b29scy1sYWtlYm94OiR7a2V5LmtleUhhc2h9YCxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5rZXksXG4gICAgICAuLi4ocmVnaXN0ZXJlZC5nYXRld2F5SG9zdCA/IHsgZ2F0ZXdheUhvc3Q6IHJlZ2lzdGVyZWQuZ2F0ZXdheUhvc3QgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHN0b3JlZCBTSEEtMjU2IGdhdGV3YXkgZmluZ2VycHJpbnQsIG9yIGB1bmRlZmluZWRgIHdoZW4gdW50cnVzdGVkLiAqL1xuICBhc3luYyBrbm93bkhvc3QoXG4gICAgc2NvcGU6IHN0cmluZyxcbiAgICBvd25lcjogc3RyaW5nLFxuICAgIGhvc3Q6IHN0cmluZyxcbiAgICBwb3J0OiBudW1iZXIsXG4gICk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcmVhZEZpbGUodGhpcy5ob3N0RmluZ2VycHJpbnRQYXRoKHNjb3BlLCBvd25lciwgaG9zdCwgcG9ydCksIFwidXRmOFwiKTtcbiAgICAgIHJldHVybiB2YWx1ZS50cmltKCkgfHwgdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgT3BlblNTSCBrbm93bi1ob3N0IGZpbGUgcGF0aCBmb3Igb25lIHdvcmtzcGFjZSwgdXNlciwgYW5kIGdhdGV3YXkuICovXG4gIGtub3duSG9zdHNQYXRoKHNjb3BlOiBzdHJpbmcsIG93bmVyOiBzdHJpbmcsIGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gam9pbih0aGlzLmRpcmVjdG9yeShzY29wZSwgb3duZXIpLCBgaG9zdC0ke2RpZ2VzdChgJHtob3N0fVxcMCR7cG9ydH1gKX0ua25vd25faG9zdHNgKTtcbiAgfVxuXG4gIC8qKiBTdG9yZXMgdGhlIGFjY2VwdGVkIGdhdGV3YXkgZmluZ2VycHJpbnQgYW5kIE9wZW5TU0ggaG9zdC1rZXkgZW50cnkuICovXG4gIGFzeW5jIHJlbWVtYmVySG9zdChcbiAgICBzY29wZTogc3RyaW5nLFxuICAgIG93bmVyOiBzdHJpbmcsXG4gICAgaG9zdDogc3RyaW5nLFxuICAgIHBvcnQ6IG51bWJlcixcbiAgICBmaW5nZXJwcmludDogc3RyaW5nLFxuICAgIGtleTogQnVmZmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkaXJlY3RvcnkgPSB0aGlzLmRpcmVjdG9yeShzY29wZSwgb3duZXIpO1xuICAgIGF3YWl0IG1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIG1vZGU6IDBvNzAwIH0pO1xuICAgIGNvbnN0IGZpbmdlcnByaW50UGF0aCA9IHRoaXMuaG9zdEZpbmdlcnByaW50UGF0aChzY29wZSwgb3duZXIsIGhvc3QsIHBvcnQpO1xuICAgIGNvbnN0IGtub3duSG9zdHNQYXRoID0gdGhpcy5rbm93bkhvc3RzUGF0aChzY29wZSwgb3duZXIsIGhvc3QsIHBvcnQpO1xuICAgIGNvbnN0IGtub3duSG9zdCA9IGBbJHtob3N0fV06JHtwb3J0fSAke3NzaEtleUFsZ29yaXRobShrZXkpfSAke2tleS50b1N0cmluZyhcImJhc2U2NFwiKX1cXG5gO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHdyaXRlRmlsZShmaW5nZXJwcmludFBhdGgsIGAke2ZpbmdlcnByaW50fVxcbmAsIHsgbW9kZTogMG82MDAgfSksXG4gICAgICB3cml0ZUZpbGUoa25vd25Ib3N0c1BhdGgsIGtub3duSG9zdCwgeyBtb2RlOiAwbzYwMCB9KSxcbiAgICBdKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbY2htb2QoZmluZ2VycHJpbnRQYXRoLCAwbzYwMCksIGNobW9kKGtub3duSG9zdHNQYXRoLCAwbzYwMCldKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE9yQ3JlYXRlKHNjb3BlOiBzdHJpbmcsIG93bmVyOiBzdHJpbmcpOiBQcm9taXNlPFN0b3JlZEtleT4ge1xuICAgIGNvbnN0IGRpcmVjdG9yeSA9IHRoaXMuZGlyZWN0b3J5KHNjb3BlLCBvd25lcik7XG4gICAgY29uc3QgcHJpdmF0ZVBhdGggPSBqb2luKGRpcmVjdG9yeSwgXCJpZF9lZDI1NTE5XCIpO1xuICAgIGNvbnN0IHB1YmxpY1BhdGggPSBgJHtwcml2YXRlUGF0aH0ucHViYDtcbiAgICBjb25zdCBzdG9yZWQgPSBhd2FpdCByZWFkU3RvcmVkS2V5KHByaXZhdGVQYXRoLCBwdWJsaWNQYXRoKTtcbiAgICBpZiAoc3RvcmVkKSByZXR1cm4gc3RvcmVkO1xuICAgIGF3YWl0IG1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIG1vZGU6IDBvNzAwIH0pO1xuICAgIHJldHVybiB3aXRoRmlsZUxvY2soW1wibGFrZWJveC1zc2gta2V5XCIsIHByaXZhdGVQYXRoXSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVjaGVja2VkID0gYXdhaXQgcmVhZFN0b3JlZEtleShwcml2YXRlUGF0aCwgcHVibGljUGF0aCk7XG4gICAgICBpZiAocmVjaGVja2VkKSByZXR1cm4gcmVjaGVja2VkO1xuXG4gICAgICBjb25zdCBnZW5lcmF0ZWQgPSB1dGlscy5nZW5lcmF0ZUtleVBhaXJTeW5jKFwiZWQyNTUxOVwiKTtcbiAgICAgIGNvbnN0IHByaXZhdGVLZXkgPSBnZW5lcmF0ZWQucHJpdmF0ZTtcbiAgICAgIGNvbnN0IHB1YmxpY0tleSA9IGdlbmVyYXRlZC5wdWJsaWM7XG4gICAgICBjb25zdCBzdWZmaXggPSBgJHtwcm9jZXNzLnBpZH0tJHtyYW5kb21CeXRlcyg4KS50b1N0cmluZyhcImhleFwiKX1gO1xuICAgICAgY29uc3Qgc3RhZ2VkUHJpdmF0ZSA9IGAke3ByaXZhdGVQYXRofS4ke3N1ZmZpeH1gO1xuICAgICAgY29uc3Qgc3RhZ2VkUHVibGljID0gYCR7cHVibGljUGF0aH0uJHtzdWZmaXh9YDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShzdGFnZWRQcml2YXRlLCBwcml2YXRlS2V5LCB7IG1vZGU6IDBvNjAwIH0pO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoc3RhZ2VkUHVibGljLCBgJHtwdWJsaWNLZXkudHJpbSgpfVxcbmAsIHsgbW9kZTogMG82MDAgfSk7XG4gICAgICAgIGF3YWl0IHJlbmFtZShzdGFnZWRQcml2YXRlLCBwcml2YXRlUGF0aCk7XG4gICAgICAgIGF3YWl0IHJlbmFtZShzdGFnZWRQdWJsaWMsIHB1YmxpY1BhdGgpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbY2htb2QocHJpdmF0ZVBhdGgsIDBvNjAwKSwgY2htb2QocHVibGljUGF0aCwgMG82MDApXSk7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZWFkU3RvcmVkS2V5KHByaXZhdGVQYXRoLCBwdWJsaWNQYXRoKTtcbiAgICAgICAgaWYgKCFjcmVhdGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJTU0gga2V5IGZpbGVzIHdlcmUgbm90IHB1Ymxpc2hlZCBhdG9taWNhbGx5XCIpO1xuICAgICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtybShzdGFnZWRQcml2YXRlLCB7IGZvcmNlOiB0cnVlIH0pLCBybShzdGFnZWRQdWJsaWMsIHsgZm9yY2U6IHRydWUgfSldKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaG9zdEZpbmdlcnByaW50UGF0aChzY29wZTogc3RyaW5nLCBvd25lcjogc3RyaW5nLCBob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGpvaW4odGhpcy5kaXJlY3Rvcnkoc2NvcGUsIG93bmVyKSwgYGhvc3QtJHtkaWdlc3QoYCR7aG9zdH1cXDAke3BvcnR9YCl9LnNoYTI1NmApO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXJlY3Rvcnkoc2NvcGU6IHN0cmluZywgb3duZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGpvaW4odGhpcy5yb290LCBkaWdlc3QoYCR7c2NvcGV9XFwwJHtvd25lcn1gKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFN0b3JlZEtleShcbiAgcHJpdmF0ZVBhdGg6IHN0cmluZyxcbiAgcHVibGljUGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxTdG9yZWRLZXkgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBbcHJpdmF0ZUtleSwgcHVibGljS2V5XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHJlYWRGaWxlKHByaXZhdGVQYXRoLCBcInV0ZjhcIiksXG4gICAgICByZWFkRmlsZShwdWJsaWNQYXRoLCBcInV0ZjhcIiksXG4gICAgXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByaXZhdGVLZXksXG4gICAgICBwcml2YXRlS2V5UGF0aDogcHJpdmF0ZVBhdGgsXG4gICAgICBwdWJsaWNLZXksXG4gICAgICBrZXlIYXNoOiBwdWJsaWNLZXlIYXNoKHB1YmxpY0tleSksXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdWJsaWNLZXlIYXNoKHB1YmxpY0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHB1YmxpY0tleS50cmltKCkuc3BsaXQoL1xccysvKS5zbGljZSgwLCAyKS5qb2luKFwiIFwiKTtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKG5vcm1hbGl6ZWQpLmRpZ2VzdCgpLnN1YmFycmF5KDAsIDE2KS50b1N0cmluZyhcImhleFwiKTtcbn1cblxuZnVuY3Rpb24gZGlnZXN0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUodmFsdWUpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCAzMik7XG59XG5cbmZ1bmN0aW9uIHNzaEtleUFsZ29yaXRobShrZXk6IEJ1ZmZlcik6IHN0cmluZyB7XG4gIGlmIChrZXkubGVuZ3RoIDwgNSkgdGhyb3cgbmV3IEVycm9yKFwiU1NIIGdhdGV3YXkgcmV0dXJuZWQgYW4gaW52YWxpZCBob3N0IGtleVwiKTtcbiAgY29uc3QgbGVuZ3RoID0ga2V5LnJlYWRVSW50MzJCRSgwKTtcbiAgY29uc3QgZW5kID0gNCArIGxlbmd0aDtcbiAgaWYgKGxlbmd0aCA9PT0gMCB8fCBlbmQgPiBrZXkubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoXCJTU0ggZ2F0ZXdheSByZXR1cm5lZCBhbiBpbnZhbGlkIGhvc3Qga2V5XCIpO1xuICBjb25zdCBhbGdvcml0aG0gPSBrZXkuc3ViYXJyYXkoNCwgZW5kKS50b1N0cmluZyhcImFzY2lpXCIpO1xuICBpZiAoL1xccy8udGVzdChhbGdvcml0aG0pKSB0aHJvdyBuZXcgRXJyb3IoXCJTU0ggZ2F0ZXdheSByZXR1cm5lZCBhbiBpbnZhbGlkIGhvc3Qga2V5IGFsZ29yaXRobVwiKTtcbiAgcmV0dXJuIGFsZ29yaXRobTtcbn1cbiJdfQ==
|