@dbx-tools/appkit-mastra 0.9.79 → 0.9.95
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -48
- package/index.ts +4 -12
- package/lib/index.d.ts +4 -12
- package/lib/index.js +4 -9
- package/lib/src/agents.js +11 -23
- package/lib/src/chat.js +20 -1
- package/lib/src/config.d.ts +9 -11
- package/lib/src/config.js +7 -7
- package/lib/src/filesystems.d.ts +20 -2
- package/lib/src/filesystems.js +29 -2
- package/lib/src/monty-sandbox.d.ts +4 -3
- package/lib/src/monty-sandbox.js +54 -21
- package/lib/src/plugin.js +3 -2
- package/lib/src/remote-skills.d.ts +3 -4
- package/lib/src/remote-skills.js +5 -14
- package/lib/src/server.d.ts +7 -0
- package/lib/src/server.js +33 -2
- package/lib/src/skill-paths.d.ts +8 -4
- package/lib/src/skill-paths.js +12 -6
- package/lib/src/workspaces.d.ts +39 -33
- package/lib/src/workspaces.js +208 -168
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -38
- package/src/agents.ts +11 -24
- package/src/chat.ts +24 -0
- package/src/config.ts +15 -17
- package/src/filesystems.ts +43 -0
- package/src/monty-sandbox.ts +61 -22
- package/src/plugin.ts +2 -0
- package/src/remote-skills.ts +5 -15
- package/src/server.ts +33 -1
- package/src/skill-paths.ts +13 -5
- package/src/workspaces.ts +285 -210
- package/lib/src/monty-native.d.ts +0 -40
- package/lib/src/monty-native.js +0 -100
- package/lib/src/skill-cache.d.ts +0 -94
- package/lib/src/skill-cache.js +0 -251
- package/lib/src/skill-search.d.ts +0 -30
- package/lib/src/skill-search.js +0 -171
- package/src/monty-native.ts +0 -149
- package/src/skill-cache.ts +0 -347
- package/src/skill-search.ts +0 -203
package/lib/src/monty-sandbox.js
CHANGED
|
@@ -1,29 +1,56 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Pydantic Monty fallback for Mastra command execution.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Prefers Monty's native Node subprocess workers and falls back to its WASM
|
|
5
|
+
* workers when the native package is unavailable. It executes Python source
|
|
5
6
|
* with no host filesystem, network, environment, shell, or third-party package
|
|
6
|
-
* access
|
|
7
|
+
* access.
|
|
7
8
|
*
|
|
8
9
|
* @module
|
|
9
10
|
*/
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
11
|
+
import { configUtils } from "@dbx-tools/core";
|
|
12
|
+
import { errorUtils, functionUtils, log } from "@dbx-tools/shared-core";
|
|
12
13
|
const DEFAULT_COMMAND_TIMEOUT_MS = 30_000;
|
|
13
14
|
const DEFAULT_MAX_MEMORY_BYTES = 10_000_000;
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
15
|
+
const NATIVE_MONTY_TARGET = {
|
|
16
|
+
name: "native Monty",
|
|
17
|
+
load: () => import("@pydantic/monty/node"),
|
|
18
|
+
};
|
|
19
|
+
const WASM_MONTY_TARGET = {
|
|
20
|
+
name: "WASM Monty",
|
|
21
|
+
load: () => import("@pydantic/monty/wasm"),
|
|
22
|
+
};
|
|
23
|
+
const logger = log.logger("mastra/monty");
|
|
24
|
+
const montyContext = functionUtils.memoize(async () => {
|
|
25
|
+
const errors = [];
|
|
26
|
+
const targets = configUtils.boolean(undefined, "MONTY_FORCE_WASM")
|
|
27
|
+
? [WASM_MONTY_TARGET]
|
|
28
|
+
: [NATIVE_MONTY_TARGET, WASM_MONTY_TARGET];
|
|
29
|
+
for (const target of targets) {
|
|
30
|
+
try {
|
|
31
|
+
const module = await target.load();
|
|
32
|
+
logger.debug(`${target.name} module available`);
|
|
33
|
+
const pool = await module.Monty.create({
|
|
34
|
+
minProcesses: 1,
|
|
35
|
+
maxProcesses: 4,
|
|
36
|
+
requestTimeout: 35,
|
|
37
|
+
});
|
|
38
|
+
logger.debug(`${target.name} pool created`);
|
|
39
|
+
return {
|
|
40
|
+
crashedError: module.MontyCrashedError,
|
|
41
|
+
pool,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
errors.push(errorUtils.toError(error));
|
|
46
|
+
logger.debug(`${target.name} unavailable`, {
|
|
47
|
+
error: errorUtils.errorMessage(error),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
throw new AggregateError(errors, "Failed to create Monty pool");
|
|
25
52
|
});
|
|
26
|
-
/** Python-only, deny-by-default sandbox backed by Monty's
|
|
53
|
+
/** Python-only, deny-by-default sandbox backed by Monty's selected worker pool. */
|
|
27
54
|
export class MontySandbox {
|
|
28
55
|
id;
|
|
29
56
|
name;
|
|
@@ -49,7 +76,7 @@ export class MontySandbox {
|
|
|
49
76
|
this.status = "starting";
|
|
50
77
|
this.error = undefined;
|
|
51
78
|
try {
|
|
52
|
-
await
|
|
79
|
+
await montyContext();
|
|
53
80
|
this.status = "running";
|
|
54
81
|
}
|
|
55
82
|
catch (caught) {
|
|
@@ -87,7 +114,7 @@ export class MontySandbox {
|
|
|
87
114
|
throw options.abortSignal.reason;
|
|
88
115
|
await this.start();
|
|
89
116
|
const timeout = options.timeout ?? this.commandTimeoutMs;
|
|
90
|
-
const pool = await
|
|
117
|
+
const pool = (await montyContext()).pool;
|
|
91
118
|
const session = await checkoutSession(pool, {
|
|
92
119
|
limits: {
|
|
93
120
|
maxFeedDurationSecs: Math.max(0.001, timeout / 1_000),
|
|
@@ -134,8 +161,8 @@ export class MontySandbox {
|
|
|
134
161
|
}
|
|
135
162
|
const message = errorUtils.errorMessage(caught);
|
|
136
163
|
output.emit("stderr", output.stderr.value ? `\n${message}` : message);
|
|
137
|
-
const {
|
|
138
|
-
const timedOut = caught instanceof
|
|
164
|
+
const { crashedError } = await montyContext();
|
|
165
|
+
const timedOut = caught instanceof crashedError && caught.timedOut;
|
|
139
166
|
return {
|
|
140
167
|
command,
|
|
141
168
|
args,
|
|
@@ -332,4 +359,10 @@ function failedResult(command, args, started, stderr) {
|
|
|
332
359
|
executionTimeMs: performance.now() - started,
|
|
333
360
|
};
|
|
334
361
|
}
|
|
335
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udHktc2FuZGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb250eS1zYW5kYm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVNuRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU3RCxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUMxQyxNQUFNLHdCQUF3QixHQUFHLFVBQVUsQ0FBQztBQUU1QyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFO0lBQ25ELE1BQU0sd0JBQXdCLEVBQUUsQ0FBQztJQUNqQyxPQUFPLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQXdCLEVBQUU7SUFDckUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sV0FBVyxFQUFFLENBQUM7SUFDdEMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2xCLFlBQVksRUFBRSxDQUFDO1FBQ2YsWUFBWSxFQUFFLENBQUM7UUFDZixjQUFjLEVBQUUsRUFBRTtLQUNuQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQWdCSCwrRUFBK0U7QUFDL0UsTUFBTSxPQUFPLFlBQVk7SUFDZCxFQUFFLENBQVM7SUFDWCxJQUFJLENBQVM7SUFDYixRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzVCLE1BQU0sR0FBK0IsU0FBUyxDQUFDO0lBQy9DLEtBQUssQ0FBVTtJQUVFLGdCQUFnQixDQUFTO0lBQ3pCLGNBQWMsQ0FBUztJQUN2QixTQUFTLENBQVU7SUFDbkIsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDaEMs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LE1BQWUsRUFBRSxFQUFFO1lBQ2xCLElBQUksT0FBTztnQkFBRSxPQUFPO1lBQ3BCLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE1BQStCO0lBQ2xELE9BQU8sTUFBTSxFQUFFLE1BQU0sSUFBSSxJQUFJLFlBQVksQ0FBQyx5QkFBeUIsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQ25CLE9BQWUsRUFDZixJQUFjLEVBQ2QsT0FBZSxFQUNmLE1BQWM7SUFFZCxPQUFPO1FBQ0wsT0FBTztRQUNQLElBQUk7UUFDSixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxDQUFDO1FBQ1gsTUFBTSxFQUFFLEVBQUU7UUFDVixNQUFNO1FBQ04sZUFBZSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPO0tBQzdDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQeWRhbnRpYyBNb250eSBmYWxsYmFjayBmb3IgTWFzdHJhIGNvbW1hbmQgZXhlY3V0aW9uLlxuICpcbiAqIFVzZXMgdGhlIE5vZGUgc3VicHJvY2Vzcy13b3JrZXIgYnVpbGQgb2YgTW9udHkuIEl0IGV4ZWN1dGVzIFB5dGhvbiBzb3VyY2VcbiAqIHdpdGggbm8gaG9zdCBmaWxlc3lzdGVtLCBuZXR3b3JrLCBlbnZpcm9ubWVudCwgc2hlbGwsIG9yIHRoaXJkLXBhcnR5IHBhY2thZ2VcbiAqIGFjY2VzcyB1bmxlc3MgYSBmdXR1cmUgY2FsbGVyIGV4cGxpY2l0bHkgYWRkcyB0aG9zZSBjYXBhYmlsaXRpZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGVycm9yVXRpbHMsIGZ1bmN0aW9uVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kUmVzdWx0LFxuICBFeGVjdXRlQ29tbWFuZE9wdGlvbnMsXG4gIFNhbmRib3hJbmZvLFxuICBXb3Jrc3BhY2VTYW5kYm94LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBDaGVja291dE9wdGlvbnMsIE1vbnR5IGFzIE1vbnR5UG9vbCwgTW9udHlTZXNzaW9uIH0gZnJvbSBcIkBweWRhbnRpYy9tb250eS9ub2RlXCI7XG5cbmltcG9ydCB7IGVuc3VyZU1vbnR5TmF0aXZlQmluZGluZyB9IGZyb20gXCIuL21vbnR5LW5hdGl2ZS50c1wiO1xuXG5jb25zdCBERUZBVUxUX0NPTU1BTkRfVElNRU9VVF9NUyA9IDMwXzAwMDtcbmNvbnN0IERFRkFVTFRfTUFYX01FTU9SWV9CWVRFUyA9IDEwXzAwMF8wMDA7XG5cbmNvbnN0IG1vbnR5TW9kdWxlID0gZnVuY3Rpb25VdGlscy5tZW1vaXplKGFzeW5jICgpID0+IHtcbiAgYXdhaXQgZW5zdXJlTW9udHlOYXRpdmVCaW5kaW5nKCk7XG4gIHJldHVybiBpbXBvcnQoXCJAcHlkYW50aWMvbW9udHkvbm9kZVwiKTtcbn0pO1xuY29uc3QgbW9udHlQb29sID0gZnVuY3Rpb25VdGlscy5tZW1vaXplKGFzeW5jICgpOiBQcm9taXNlPE1vbnR5UG9vbD4gPT4ge1xuICBjb25zdCB7IE1vbnR5IH0gPSBhd2FpdCBtb250eU1vZHVsZSgpO1xuICByZXR1cm4gTW9udHkuY3JlYXRlKHtcbiAgICBtaW5Qcm9jZXNzZXM6IDEsXG4gICAgbWF4UHJvY2Vzc2VzOiA0LFxuICAgIHJlcXVlc3RUaW1lb3V0OiAzNSxcbiAgfSk7XG59KTtcblxuLyoqIFJlc291cmNlIGNvbnRyb2xzIGZvciB0aGUgTW9udHkgUHl0aG9uIGZhbGxiYWNrLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb250eVNhbmRib3hPcHRpb25zIHtcbiAgLyoqIE1hc3RyYSBwcm92aWRlciBpZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWUuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBEZWZhdWx0IGV4ZWN1dGlvbiB0aW1lb3V0LiBQZXItY2FsbCBgb3B0aW9ucy50aW1lb3V0YCB3aW5zLiAqL1xuICBjb21tYW5kVGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSBNb250eSBoZWFwIGJ5dGVzIGZvciBvbmUgY2hlY2tvdXQuICovXG4gIG1heE1lbW9yeUJ5dGVzPzogbnVtYmVyO1xuICAvKiogVHlwZS1jaGVjayBlYWNoIFB5dGhvbiBzbmlwcGV0IGJlZm9yZSBydW5uaW5nIGl0LiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgdHlwZUNoZWNrPzogYm9vbGVhbjtcbn1cblxuLyoqIFB5dGhvbi1vbmx5LCBkZW55LWJ5LWRlZmF1bHQgc2FuZGJveCBiYWNrZWQgYnkgTW9udHkncyBOb2RlIHdvcmtlciBwb29sLiAqL1xuZXhwb3J0IGNsYXNzIE1vbnR5U2FuZGJveCBpbXBsZW1lbnRzIFdvcmtzcGFjZVNhbmRib3gge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByb3ZpZGVyID0gXCJtb250eVwiO1xuICBzdGF0dXM6IFdvcmtzcGFjZVNhbmRib3hbXCJzdGF0dXNcIl0gPSBcInBlbmRpbmdcIjtcbiAgZXJyb3I/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kVGltZW91dE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4TWVtb3J5Qnl0ZXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlQ2hlY2s6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgcHJpdmF0ZSBsYXN0VXNlZEF0PzogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNb250eVNhbmRib3hPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZCA/PyBcIm1vbnR5XCI7XG4gICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lID8/IFwiUHlkYW50aWMgTW9udHlcIjtcbiAgICB0aGlzLmNvbW1hbmRUaW1lb3V0TXMgPSBvcHRpb25zLmNvbW1hbmRUaW1lb3V0TXMgPz8gREVGQVVMVF9DT01NQU5EX1RJTUVPVVRfTVM7XG4gICAgdGhpcy5tYXhNZW1vcnlCeXRlcyA9IG9wdGlvbnMubWF4TWVtb3J5Qnl0ZXMgPz8gREVGQVVMVF9NQVhfTUVNT1JZX0JZVEVTO1xuICAgIHRoaXMudHlwZUNoZWNrID0gb3B0aW9ucy50eXBlQ2hlY2sgPz8gZmFsc2U7XG4gIH1cblxuICAvKiogV2FybSB0aGUgc2hhcmVkIGNyYXNoLWlzb2xhdGVkIHdvcmtlciBwb29sLiAqL1xuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09IFwicnVubmluZ1wiKSByZXR1cm47XG4gICAgdGhpcy5zdGF0dXMgPSBcInN0YXJ0aW5nXCI7XG4gICAgdGhpcy5lcnJvciA9IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbW9udHlQb29sKCk7XG4gICAgICB0aGlzLnN0YXR1cyA9IFwicnVubmluZ1wiO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgdGhpcy5zdGF0dXMgPSBcImVycm9yXCI7XG4gICAgICB0aGlzLmVycm9yID0gZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoY2F1Z2h0KTtcbiAgICAgIHRocm93IGNhdWdodDtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIHByb2Nlc3Mtd2lkZSBwb29sIHN0YXlzIHdhcm07IHRoaXMgaW5zdGFuY2UgY2FycmllcyBubyBvcGVuIHNlc3Npb24uICovXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0dXMgPSBcInN0b3BwZWRcIjtcbiAgfVxuXG4gIC8qKiBUaGUgcHJvY2Vzcy13aWRlIHBvb2wgc3RheXMgd2FybTsgZWFjaCBjb21tYW5kIGNsb3NlcyBpdHMgb3duIGNoZWNrb3V0LiAqL1xuICBhc3luYyBkZXN0cm95KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdHVzID0gXCJkZXN0cm95ZWRcIjtcbiAgfVxuXG4gIC8qKiBNb250eSBzZXNzaW9ucyBhcmUgZXBoZW1lcmFsIGFuZCBkbyBub3QgcHJvdmlkZSBwZXJzaXN0ZW50IGNoZWNrcG9pbnRzLiAqL1xuICBhc3luYyBzbmFwc2hvdCgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgcmVhZG9ubHkgc3VwcG9ydHNDaGVja3BvaW50cyA9IGZhbHNlO1xuXG4gIC8qKiBFeGVjdXRlIFB5dGhvbiBzb3VyY2UgYW5kIG1hcCBNb250eSBvdXRwdXQgdG8gTWFzdHJhJ3MgY29tbWFuZCByZXN1bHQuICovXG4gIGFzeW5jIGV4ZWN1dGVDb21tYW5kKFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICBhcmdzOiBzdHJpbmdbXSA9IFtdLFxuICAgIG9wdGlvbnM6IEV4ZWN1dGVDb21tYW5kT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPENvbW1hbmRSZXN1bHQ+IHtcbiAgICBjb25zdCBzdGFydGVkID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgY29kZSA9IG1vbnR5Q29kZShjb21tYW5kLCBhcmdzKTtcbiAgICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFpbGVkUmVzdWx0KFxuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdGFydGVkLFxuICAgICAgICBcIk1vbnR5IGZhbGxiYWNrIGFjY2VwdHMgUHl0aG9uIHNvdXJjZSBkaXJlY3RseSwgb3IgcHl0aG9uL3B5dGhvbjMgd2l0aCBhIHNpbmdsZSAtYyBzY3JpcHQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZW52ID8/IHt9KS5maWx0ZXIoXG4gICAgICAoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgICk7XG4gICAgaWYgKGVudmlyb25tZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmYWlsZWRSZXN1bHQoXG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHN0YXJ0ZWQsXG4gICAgICAgIFwiTW9udHkgZmFsbGJhY2sgZG9lcyBub3QgZXhwb3NlIGhvc3QgZW52aXJvbm1lbnQgdmFyaWFibGVzLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuY3dkKSB7XG4gICAgICByZXR1cm4gZmFpbGVkUmVzdWx0KFxuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdGFydGVkLFxuICAgICAgICBcIk1vbnR5IGZhbGxiYWNrIGRvZXMgbm90IGV4cG9zZSBhIGhvc3Qgd29ya2luZyBkaXJlY3RvcnkuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5hYm9ydFNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgb3B0aW9ucy5hYm9ydFNpZ25hbC5yZWFzb247XG5cbiAgICBhd2FpdCB0aGlzLnN0YXJ0KCk7XG4gICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCA/PyB0aGlzLmNvbW1hbmRUaW1lb3V0TXM7XG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IG1vbnR5UG9vbCgpO1xuICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjaGVja291dFNlc3Npb24oXG4gICAgICBwb29sLFxuICAgICAge1xuICAgICAgICBsaW1pdHM6IHtcbiAgICAgICAgICBtYXhGZWVkRHVyYXRpb25TZWNzOiBNYXRoLm1heCgwLjAwMSwgdGltZW91dCAvIDFfMDAwKSxcbiAgICAgICAgICBtYXhNZW1vcnk6IHRoaXMubWF4TWVtb3J5Qnl0ZXMsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVDaGVjazogdGhpcy50eXBlQ2hlY2ssXG4gICAgICB9LFxuICAgICAgb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICApO1xuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSZXRhaW5lZE91dHB1dChvcHRpb25zKTtcbiAgICBjb25zdCB3b3JrZXJQaWQgPSBzZXNzaW9uLndvcmtlclBpZDtcbiAgICBsZXQgYWJvcnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHRlcm1pbmF0ZVdvcmtlcih3b3JrZXJQaWQpO1xuICAgIH07XG4gICAgb3B0aW9ucy5hYm9ydFNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBpZiAob3B0aW9ucy5hYm9ydFNpZ25hbD8uYWJvcnRlZCkgb25BYm9ydCgpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWJvcnRlZCkgdGhyb3cgYWJvcnRSZWFzb24ob3B0aW9ucy5hYm9ydFNpZ25hbCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHNlc3Npb24uZmVlZFJ1bihzdHJpcFB5dGhvbkZlbmNlKGNvZGUpLCB7XG4gICAgICAgIHByaW50Q2FsbGJhY2s6IChzdHJlYW0sIHRleHQpID0+IG91dHB1dC5lbWl0KHN0cmVhbSwgdGV4dCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJldHVybmVkID0gZm9ybWF0UmVzdWx0KHZhbHVlKTtcbiAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICBjb25zdCBzdWZmaXggPSByZXR1cm5lZC5lbmRzV2l0aChcIlxcblwiKSA/IHJldHVybmVkIDogYCR7cmV0dXJuZWR9XFxuYDtcbiAgICAgICAgb3V0cHV0LmVtaXQoXCJzdGRvdXRcIiwgc3VmZml4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFVzZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgc3Rkb3V0OiBvdXRwdXQuc3Rkb3V0LnZhbHVlLFxuICAgICAgICBzdGRlcnI6IG91dHB1dC5zdGRlcnIudmFsdWUsXG4gICAgICAgIGV4ZWN1dGlvblRpbWVNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkLFxuICAgICAgICAuLi5vdXRwdXQubWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAoYWJvcnRlZCB8fCBvcHRpb25zLmFib3J0U2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHRocm93IGFib3J0UmVhc29uKG9wdGlvbnMuYWJvcnRTaWduYWwpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGNhdWdodCk7XG4gICAgICBvdXRwdXQuZW1pdChcInN0ZGVyclwiLCBvdXRwdXQuc3RkZXJyLnZhbHVlID8gYFxcbiR7bWVzc2FnZX1gIDogbWVzc2FnZSk7XG4gICAgICBjb25zdCB7IE1vbnR5Q3Jhc2hlZEVycm9yIH0gPSBhd2FpdCBtb250eU1vZHVsZSgpO1xuICAgICAgY29uc3QgdGltZWRPdXQgPSBjYXVnaHQgaW5zdGFuY2VvZiBNb250eUNyYXNoZWRFcnJvciAmJiBjYXVnaHQudGltZWRPdXQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXhpdENvZGU6IHRpbWVkT3V0ID8gLTEgOiAxLFxuICAgICAgICBzdGRvdXQ6IG91dHB1dC5zdGRvdXQudmFsdWUsXG4gICAgICAgIHN0ZGVycjogb3V0cHV0LnN0ZGVyci52YWx1ZSxcbiAgICAgICAgZXhlY3V0aW9uVGltZU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWQsXG4gICAgICAgIC4uLih0aW1lZE91dCA/IHsgdGltZWRPdXQ6IHRydWUsIGtpbGxlZDogdHJ1ZSB9IDoge30pLFxuICAgICAgICAuLi5vdXRwdXQubWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG9wdGlvbnMuYWJvcnRTaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIGF3YWl0IHNlc3Npb24uY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc1JlYWR5KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gXCJydW5uaW5nXCI7XG4gIH1cblxuICBnZXRJbmZvKCk6IFNhbmRib3hJbmZvIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBwcm92aWRlcjogdGhpcy5wcm92aWRlcixcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBjcmVhdGVkQXQ6IHRoaXMuY3JlYXRlZEF0LFxuICAgICAgLi4uKHRoaXMubGFzdFVzZWRBdCA/IHsgbGFzdFVzZWRBdDogdGhpcy5sYXN0VXNlZEF0IH0gOiB7fSksXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBsYW5ndWFnZTogXCJweXRob25cIixcbiAgICAgICAgaG9zdEFjY2VzczogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBnZXRJbnN0cnVjdGlvbnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgXCJDb21tYW5kcyBydW4gYXMgUHl0aG9uIHNvdXJjZSBpbiB0aGUgUHlkYW50aWMgTW9udHkgZmFsbGJhY2suXCIsXG4gICAgICBcIlBhc3MgUHl0aG9uIGNvZGUgZGlyZWN0bHkgcmF0aGVyIHRoYW4gc2hlbGwgc3ludGF4LlwiLFxuICAgICAgXCJUaGVyZSBpcyBubyBob3N0IGZpbGVzeXN0ZW0sIG5ldHdvcmssIGVudmlyb25tZW50LCBzaGVsbCwgb3IgdGhpcmQtcGFydHkgcGFja2FnZSBhY2Nlc3MuXCIsXG4gICAgXS5qb2luKFwiIFwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb250eUNvZGUoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvbW1hbmQ7XG4gIGlmICgoY29tbWFuZCA9PT0gXCJweXRob25cIiB8fCBjb21tYW5kID09PSBcInB5dGhvbjNcIikgJiYgYXJncy5sZW5ndGggPT09IDIgJiYgYXJnc1swXSA9PT0gXCItY1wiKSB7XG4gICAgcmV0dXJuIGFyZ3NbMV07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RyaXBQeXRob25GZW5jZShjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gY29kZS50cmltKCk7XG4gIGNvbnN0IG1hdGNoID0gL15gYGAoPzpweXRob258cHkpP1xccypcXG4oW1xcc1xcU10qPylcXG5gYGAkL2kuZXhlYyh0cmltbWVkKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV0gPz8gY29kZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVzdWx0KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBcIlwiO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKSA/PyBTdHJpbmcodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxufVxuXG5jbGFzcyBSZXRhaW5lZE91dHB1dCB7XG4gIHJlYWRvbmx5IHN0ZG91dDogUmV0YWluZWRUZXh0O1xuICByZWFkb25seSBzdGRlcnI6IFJldGFpbmVkVGV4dDtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uU3Rkb3V0OiBFeGVjdXRlQ29tbWFuZE9wdGlvbnNbXCJvblN0ZG91dFwiXTtcbiAgcHJpdmF0ZSByZWFkb25seSBvblN0ZGVycjogRXhlY3V0ZUNvbW1hbmRPcHRpb25zW1wib25TdGRlcnJcIl07XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRXhlY3V0ZUNvbW1hbmRPcHRpb25zKSB7XG4gICAgdGhpcy5zdGRvdXQgPSBuZXcgUmV0YWluZWRUZXh0KG9wdGlvbnMubWF4UmV0YWluZWRCeXRlcyk7XG4gICAgdGhpcy5zdGRlcnIgPSBuZXcgUmV0YWluZWRUZXh0KG9wdGlvbnMubWF4UmV0YWluZWRCeXRlcyk7XG4gICAgdGhpcy5vblN0ZG91dCA9IG9wdGlvbnMub25TdGRvdXQ7XG4gICAgdGhpcy5vblN0ZGVyciA9IG9wdGlvbnMub25TdGRlcnI7XG4gIH1cblxuICBlbWl0KHN0cmVhbTogXCJzdGRvdXRcIiB8IFwic3RkZXJyXCIsIHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChzdHJlYW0gPT09IFwic3Rkb3V0XCIpIHtcbiAgICAgIHRoaXMub25TdGRvdXQ/Lih0ZXh0KTtcbiAgICAgIHRoaXMuc3Rkb3V0LmFwcGVuZCh0ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vblN0ZGVycj8uKHRleHQpO1xuICAgICAgdGhpcy5zdGRlcnIuYXBwZW5kKHRleHQpO1xuICAgIH1cbiAgfVxuXG4gIG1ldGFkYXRhKCk6IFBpY2s8XG4gICAgQ29tbWFuZFJlc3VsdCxcbiAgICBcInN0ZG91dFRydW5jYXRlZFwiIHwgXCJzdGRlcnJUcnVuY2F0ZWRcIiB8IFwic3Rkb3V0RHJvcHBlZEJ5dGVzXCIgfCBcInN0ZGVyckRyb3BwZWRCeXRlc1wiXG4gID4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odGhpcy5zdGRvdXQuZHJvcHBlZEJ5dGVzID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0ZG91dFRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHN0ZG91dERyb3BwZWRCeXRlczogdGhpcy5zdGRvdXQuZHJvcHBlZEJ5dGVzLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4odGhpcy5zdGRlcnIuZHJvcHBlZEJ5dGVzID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0ZGVyclRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHN0ZGVyckRyb3BwZWRCeXRlczogdGhpcy5zdGRlcnIuZHJvcHBlZEJ5dGVzLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBSZXRhaW5lZFRleHQge1xuICB2YWx1ZSA9IFwiXCI7XG4gIGRyb3BwZWRCeXRlcyA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXhCeXRlczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbiAgY29uc3RydWN0b3IobWF4Qnl0ZXM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gbWF4Qnl0ZXMgPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIGlmIChcbiAgICAgIHJlc29sdmVkICE9PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgJiZcbiAgICAgICghTnVtYmVyLmlzU2FmZUludGVnZXIocmVzb2x2ZWQpIHx8IHJlc29sdmVkIDwgMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtYXhSZXRhaW5lZEJ5dGVzIG11c3QgYmUgYSBub24tbmVnYXRpdmUgc2FmZSBpbnRlZ2VyIG9yIEluZmluaXR5XCIpO1xuICAgIH1cbiAgICB0aGlzLm1heEJ5dGVzID0gcmVzb2x2ZWQ7XG4gIH1cblxuICBhcHBlbmQodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgaWYgKHRoaXMubWF4Qnl0ZXMgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgdGhpcy52YWx1ZSArPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb21iaW5lZCA9IHRoaXMuZW5jb2Rlci5lbmNvZGUodGhpcy52YWx1ZSArIHRleHQpO1xuICAgIGlmIChjb21iaW5lZC5sZW5ndGggPD0gdGhpcy5tYXhCeXRlcykge1xuICAgICAgdGhpcy52YWx1ZSArPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSBjb21iaW5lZC5sZW5ndGggLSB0aGlzLm1heEJ5dGVzO1xuICAgIHdoaWxlIChzdGFydCA8IGNvbWJpbmVkLmxlbmd0aCAmJiAoY29tYmluZWRbc3RhcnRdISAmIDB4YzApID09PSAweDgwKSBzdGFydCsrO1xuICAgIGNvbnN0IHJldGFpbmVkID0gY29tYmluZWQuc3ViYXJyYXkoc3RhcnQpO1xuICAgIHRoaXMuZHJvcHBlZEJ5dGVzICs9IGNvbWJpbmVkLmxlbmd0aCAtIHJldGFpbmVkLmxlbmd0aDtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5kZWNvZGVyLmRlY29kZShyZXRhaW5lZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVybWluYXRlV29ya2VyKHdvcmtlclBpZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICh3b3JrZXJQaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCh3b3JrZXJQaWQsIFwiU0lHS0lMTFwiKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gVGhlIGNvbW1hbmQgY2FuIGZpbmlzaCBiZXR3ZWVuIHRoZSBhYm9ydCBldmVudCBhbmQgdGhlIGtpbGwgcmVxdWVzdC5cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja291dFNlc3Npb24oXG4gIHBvb2w6IE1vbnR5UG9vbCxcbiAgb3B0aW9uczogQ2hlY2tvdXRPcHRpb25zLFxuICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxNb250eVNlc3Npb24+IHtcbiAgY29uc3QgY2hlY2tvdXQgPSBwb29sLmNoZWNrb3V0KG9wdGlvbnMpO1xuICBpZiAoIXNpZ25hbCkgcmV0dXJuIGNoZWNrb3V0O1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB2b2lkIGNoZWNrb3V0LnRoZW4oKHNlc3Npb24pID0+IHNlc3Npb24uY2xvc2UoKSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB0aHJvdyBhYm9ydFJlYXNvbihzaWduYWwpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPE1vbnR5U2Vzc2lvbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIHJlamVjdChhYm9ydFJlYXNvbihzaWduYWwpKTtcbiAgICAgIHZvaWQgY2hlY2tvdXQudGhlbigoc2Vzc2lvbikgPT4gc2Vzc2lvbi5jbG9zZSgpKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH07XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgY2hlY2tvdXQudGhlbihcbiAgICAgIChzZXNzaW9uKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgICAgICByZXNvbHZlKHNlc3Npb24pO1xuICAgICAgfSxcbiAgICAgIChjYXVnaHQ6IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICAgIHJlamVjdChjYXVnaHQpO1xuICAgICAgfSxcbiAgICApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYWJvcnRSZWFzb24oc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICByZXR1cm4gc2lnbmFsPy5yZWFzb24gPz8gbmV3IERPTUV4Y2VwdGlvbihcIlRoZSBjb21tYW5kIHdhcyBhYm9ydGVkXCIsIFwiQWJvcnRFcnJvclwiKTtcbn1cblxuZnVuY3Rpb24gZmFpbGVkUmVzdWx0KFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBzdGFydGVkOiBudW1iZXIsXG4gIHN0ZGVycjogc3RyaW5nLFxuKTogQ29tbWFuZFJlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIGV4aXRDb2RlOiAxLFxuICAgIHN0ZG91dDogXCJcIixcbiAgICBzdGRlcnIsXG4gICAgZXhlY3V0aW9uVGltZU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWQsXG4gIH07XG59XG4iXX0=
|
|
362
|
+
if (import.meta.main) {
|
|
363
|
+
const sandbox = new MontySandbox();
|
|
364
|
+
await sandbox.start();
|
|
365
|
+
console.log(await sandbox.executeCommand("print('Hello, world!')"));
|
|
366
|
+
await sandbox.stop();
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udHktc2FuZGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb250eS1zYW5kYm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVN4RSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUMxQyxNQUFNLHdCQUF3QixHQUFHLFVBQVUsQ0FBQztBQUM1QyxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLElBQUksRUFBRSxjQUFjO0lBQ3BCLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUM7Q0FDbEMsQ0FBQztBQUNYLE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsSUFBSSxFQUFFLFlBQVk7SUFDbEIsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQztDQUNsQyxDQUFDO0FBQ1gsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQVMxQyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBMkIsRUFBRTtJQUMzRSxNQUFNLE1BQU0sR0FBWSxFQUFFLENBQUM7SUFDM0IsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUM3QyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxD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LEVBQUUsRUFBRTtZQUNsQixJQUFJLE9BQU87Z0JBQUUsT0FBTztZQUNwQixPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ2YsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxNQUErQjtJQUNsRCxPQUFPLE1BQU0sRUFBRSxNQUFNLElBQUksSUFBSSxZQUFZLENBQUMseUJBQXlCLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDckYsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUNuQixPQUFlLEVBQ2YsSUFBYyxFQUNkLE9BQWUsRUFDZixNQUFjO0lBRWQsT0FBTztRQUNMLE9BQU87UUFDUCxJQUFJO1FBQ0osT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsQ0FBQztRQUNYLE1BQU0sRUFBRSxFQUFFO1FBQ1YsTUFBTTtRQUNOLGVBQWUsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTztLQUM3QyxDQUFDO0FBQ0osQ0FBQztBQUVELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixNQUFNLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ25DLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztJQUNwRSxNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQeWRhbnRpYyBNb250eSBmYWxsYmFjayBmb3IgTWFzdHJhIGNvbW1hbmQgZXhlY3V0aW9uLlxuICpcbiAqIFByZWZlcnMgTW9udHkncyBuYXRpdmUgTm9kZSBzdWJwcm9jZXNzIHdvcmtlcnMgYW5kIGZhbGxzIGJhY2sgdG8gaXRzIFdBU01cbiAqIHdvcmtlcnMgd2hlbiB0aGUgbmF0aXZlIHBhY2thZ2UgaXMgdW5hdmFpbGFibGUuIEl0IGV4ZWN1dGVzIFB5dGhvbiBzb3VyY2VcbiAqIHdpdGggbm8gaG9zdCBmaWxlc3lzdGVtLCBuZXR3b3JrLCBlbnZpcm9ubWVudCwgc2hlbGwsIG9yIHRoaXJkLXBhcnR5IHBhY2thZ2VcbiAqIGFjY2Vzcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY29uZmlnVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBmdW5jdGlvblV0aWxzLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kUmVzdWx0LFxuICBFeGVjdXRlQ29tbWFuZE9wdGlvbnMsXG4gIFNhbmRib3hJbmZvLFxuICBXb3Jrc3BhY2VTYW5kYm94LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBDaGVja291dE9wdGlvbnMsIE1vbnR5LCBNb250eUNyYXNoZWRFcnJvciwgTW9udHlTZXNzaW9uIH0gZnJvbSBcIkBweWRhbnRpYy9tb250eVwiO1xuXG5jb25zdCBERUZBVUxUX0NPTU1BTkRfVElNRU9VVF9NUyA9IDMwXzAwMDtcbmNvbnN0IERFRkFVTFRfTUFYX01FTU9SWV9CWVRFUyA9IDEwXzAwMF8wMDA7XG5jb25zdCBOQVRJVkVfTU9OVFlfVEFSR0VUID0ge1xuICBuYW1lOiBcIm5hdGl2ZSBNb250eVwiLFxuICBsb2FkOiAoKSA9PiBpbXBvcnQoXCJAcHlkYW50aWMvbW9udHkvbm9kZVwiKSxcbn0gYXMgY29uc3Q7XG5jb25zdCBXQVNNX01PTlRZX1RBUkdFVCA9IHtcbiAgbmFtZTogXCJXQVNNIE1vbnR5XCIsXG4gIGxvYWQ6ICgpID0+IGltcG9ydChcIkBweWRhbnRpYy9tb250eS93YXNtXCIpLFxufSBhcyBjb25zdDtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvbW9udHlcIik7XG5cbnR5cGUgTW9udHlQb29sID0gUGljazxNb250eSwgXCJjaGVja291dFwiPjtcblxuaW50ZXJmYWNlIE1vbnR5Q29udGV4dCB7XG4gIGNyYXNoZWRFcnJvcjogdHlwZW9mIE1vbnR5Q3Jhc2hlZEVycm9yO1xuICBwb29sOiBNb250eVBvb2w7XG59XG5cbmNvbnN0IG1vbnR5Q29udGV4dCA9IGZ1bmN0aW9uVXRpbHMubWVtb2l6ZShhc3luYyAoKTogUHJvbWlzZTxNb250eUNvbnRleHQ+ID0+IHtcbiAgY29uc3QgZXJyb3JzOiBFcnJvcltdID0gW107XG4gIGNvbnN0IHRhcmdldHMgPSBjb25maWdVdGlscy5ib29sZWFuKHVuZGVmaW5lZCwgXCJNT05UWV9GT1JDRV9XQVNNXCIpXG4gICAgPyBbV0FTTV9NT05UWV9UQVJHRVRdXG4gICAgOiBbTkFUSVZFX01PTlRZX1RBUkdFVCwgV0FTTV9NT05UWV9UQVJHRVRdO1xuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IHRhcmdldC5sb2FkKCk7XG4gICAgICBsb2dnZXIuZGVidWcoYCR7dGFyZ2V0Lm5hbWV9IG1vZHVsZSBhdmFpbGFibGVgKTtcbiAgICAgIGNvbnN0IHBvb2wgPSBhd2FpdCBtb2R1bGUuTW9udHkuY3JlYXRlKHtcbiAgICAgICAgbWluUHJvY2Vzc2VzOiAxLFxuICAgICAgICBtYXhQcm9jZXNzZXM6IDQsXG4gICAgICAgIHJlcXVlc3RUaW1lb3V0OiAzNSxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmRlYnVnKGAke3RhcmdldC5uYW1lfSBwb29sIGNyZWF0ZWRgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNyYXNoZWRFcnJvcjogbW9kdWxlLk1vbnR5Q3Jhc2hlZEVycm9yLFxuICAgICAgICBwb29sLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JzLnB1c2goZXJyb3JVdGlscy50b0Vycm9yKGVycm9yKSk7XG4gICAgICBsb2dnZXIuZGVidWcoYCR7dGFyZ2V0Lm5hbWV9IHVuYXZhaWxhYmxlYCwge1xuICAgICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIFwiRmFpbGVkIHRvIGNyZWF0ZSBNb250eSBwb29sXCIpO1xufSk7XG5cbi8qKiBSZXNvdXJjZSBjb250cm9scyBmb3IgdGhlIE1vbnR5IFB5dGhvbiBmYWxsYmFjay4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9udHlTYW5kYm94T3B0aW9ucyB7XG4gIC8qKiBNYXN0cmEgcHJvdmlkZXIgaWQuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogRGlzcGxheSBuYW1lLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogRGVmYXVsdCBleGVjdXRpb24gdGltZW91dC4gUGVyLWNhbGwgYG9wdGlvbnMudGltZW91dGAgd2lucy4gKi9cbiAgY29tbWFuZFRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gTW9udHkgaGVhcCBieXRlcyBmb3Igb25lIGNoZWNrb3V0LiAqL1xuICBtYXhNZW1vcnlCeXRlcz86IG51bWJlcjtcbiAgLyoqIFR5cGUtY2hlY2sgZWFjaCBQeXRob24gc25pcHBldCBiZWZvcmUgcnVubmluZyBpdC4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIHR5cGVDaGVjaz86IGJvb2xlYW47XG59XG5cbi8qKiBQeXRob24tb25seSwgZGVueS1ieS1kZWZhdWx0IHNhbmRib3ggYmFja2VkIGJ5IE1vbnR5J3Mgc2VsZWN0ZWQgd29ya2VyIHBvb2wuICovXG5leHBvcnQgY2xhc3MgTW9udHlTYW5kYm94IGltcGxlbWVudHMgV29ya3NwYWNlU2FuZGJveCB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvdmlkZXIgPSBcIm1vbnR5XCI7XG4gIHN0YXR1czogV29ya3NwYWNlU2FuZGJveFtcInN0YXR1c1wiXSA9IFwicGVuZGluZ1wiO1xuICBlcnJvcj86IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRUaW1lb3V0TXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhNZW1vcnlCeXRlczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGVDaGVjazogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVkQXQgPSBuZXcgRGF0ZSgpO1xuICBwcml2YXRlIGxhc3RVc2VkQXQ/OiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1vbnR5U2FuZGJveE9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkID8/IFwibW9udHlcIjtcbiAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWUgPz8gXCJQeWRhbnRpYyBNb250eVwiO1xuICAgIHRoaXMuY29tbWFuZFRpbWVvdXRNcyA9IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRNcyA/PyBERUZBVUxUX0NPTU1BTkRfVElNRU9VVF9NUztcbiAgICB0aGlzLm1heE1lbW9yeUJ5dGVzID0gb3B0aW9ucy5tYXhNZW1vcnlCeXRlcyA/PyBERUZBVUxUX01BWF9NRU1PUllfQllURVM7XG4gICAgdGhpcy50eXBlQ2hlY2sgPSBvcHRpb25zLnR5cGVDaGVjayA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKiBXYXJtIHRoZSBzaGFyZWQgY3Jhc2gtaXNvbGF0ZWQgd29ya2VyIHBvb2wuICovXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gXCJydW5uaW5nXCIpIHJldHVybjtcbiAgICB0aGlzLnN0YXR1cyA9IFwic3RhcnRpbmdcIjtcbiAgICB0aGlzLmVycm9yID0gdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBtb250eUNvbnRleHQoKTtcbiAgICAgIHRoaXMuc3RhdHVzID0gXCJydW5uaW5nXCI7XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IFwiZXJyb3JcIjtcbiAgICAgIHRoaXMuZXJyb3IgPSBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShjYXVnaHQpO1xuICAgICAgdGhyb3cgY2F1Z2h0O1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgcHJvY2Vzcy13aWRlIHBvb2wgc3RheXMgd2FybTsgdGhpcyBpbnN0YW5jZSBjYXJyaWVzIG5vIG9wZW4gc2Vzc2lvbi4gKi9cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXR1cyA9IFwic3RvcHBlZFwiO1xuICB9XG5cbiAgLyoqIFRoZSBwcm9jZXNzLXdpZGUgcG9vbCBzdGF5cyB3YXJtOyBlYWNoIGNvbW1hbmQgY2xvc2VzIGl0cyBvd24gY2hlY2tvdXQuICovXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0dXMgPSBcImRlc3Ryb3llZFwiO1xuICB9XG5cbiAgLyoqIE1vbnR5IHNlc3Npb25zIGFyZSBlcGhlbWVyYWwgYW5kIGRvIG5vdCBwcm92aWRlIHBlcnNpc3RlbnQgY2hlY2twb2ludHMuICovXG4gIGFzeW5jIHNuYXBzaG90KCk6IFByb21pc2U8dm9pZD4ge31cblxuICByZWFkb25seSBzdXBwb3J0c0NoZWNrcG9pbnRzID0gZmFsc2U7XG5cbiAgLyoqIEV4ZWN1dGUgUHl0aG9uIHNvdXJjZSBhbmQgbWFwIE1vbnR5IG91dHB1dCB0byBNYXN0cmEncyBjb21tYW5kIHJlc3VsdC4gKi9cbiAgYXN5bmMgZXhlY3V0ZUNvbW1hbmQoXG4gICAgY29tbWFuZDogc3RyaW5nLFxuICAgIGFyZ3M6IHN0cmluZ1tdID0gW10sXG4gICAgb3B0aW9uczogRXhlY3V0ZUNvbW1hbmRPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8Q29tbWFuZFJlc3VsdD4ge1xuICAgIGNvbnN0IHN0YXJ0ZWQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCBjb2RlID0gbW9udHlDb2RlKGNvbW1hbmQsIGFyZ3MpO1xuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWlsZWRSZXN1bHQoXG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHN0YXJ0ZWQsXG4gICAgICAgIFwiTW9udHkgZmFsbGJhY2sgYWNjZXB0cyBQeXRob24gc291cmNlIGRpcmVjdGx5LCBvciBweXRob24vcHl0aG9uMyB3aXRoIGEgc2luZ2xlIC1jIHNjcmlwdC5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucy5lbnYgPz8ge30pLmZpbHRlcihcbiAgICAgIChbLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQsXG4gICAgKTtcbiAgICBpZiAoZW52aXJvbm1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZhaWxlZFJlc3VsdChcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhcnRlZCxcbiAgICAgICAgXCJNb250eSBmYWxsYmFjayBkb2VzIG5vdCBleHBvc2UgaG9zdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5jd2QpIHtcbiAgICAgIHJldHVybiBmYWlsZWRSZXN1bHQoXG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHN0YXJ0ZWQsXG4gICAgICAgIFwiTW9udHkgZmFsbGJhY2sgZG9lcyBub3QgZXhwb3NlIGEgaG9zdCB3b3JraW5nIGRpcmVjdG9yeS5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmFib3J0U2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBvcHRpb25zLmFib3J0U2lnbmFsLnJlYXNvbjtcblxuICAgIGF3YWl0IHRoaXMuc3RhcnQoKTtcbiAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0ID8/IHRoaXMuY29tbWFuZFRpbWVvdXRNcztcbiAgICBjb25zdCBwb29sID0gKGF3YWl0IG1vbnR5Q29udGV4dCgpKS5wb29sO1xuICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjaGVja291dFNlc3Npb24oXG4gICAgICBwb29sLFxuICAgICAge1xuICAgICAgICBsaW1pdHM6IHtcbiAgICAgICAgICBtYXhGZWVkRHVyYXRpb25TZWNzOiBNYXRoLm1heCgwLjAwMSwgdGltZW91dCAvIDFfMDAwKSxcbiAgICAgICAgICBtYXhNZW1vcnk6IHRoaXMubWF4TWVtb3J5Qnl0ZXMsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVDaGVjazogdGhpcy50eXBlQ2hlY2ssXG4gICAgICB9LFxuICAgICAgb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICApO1xuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSZXRhaW5lZE91dHB1dChvcHRpb25zKTtcbiAgICBjb25zdCB3b3JrZXJQaWQgPSBzZXNzaW9uLndvcmtlclBpZDtcbiAgICBsZXQgYWJvcnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHRlcm1pbmF0ZVdvcmtlcih3b3JrZXJQaWQpO1xuICAgIH07XG4gICAgb3B0aW9ucy5hYm9ydFNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBpZiAob3B0aW9ucy5hYm9ydFNpZ25hbD8uYWJvcnRlZCkgb25BYm9ydCgpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWJvcnRlZCkgdGhyb3cgYWJvcnRSZWFzb24ob3B0aW9ucy5hYm9ydFNpZ25hbCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHNlc3Npb24uZmVlZFJ1bihzdHJpcFB5dGhvbkZlbmNlKGNvZGUpLCB7XG4gICAgICAgIHByaW50Q2FsbGJhY2s6IChzdHJlYW0sIHRleHQpID0+IG91dHB1dC5lbWl0KHN0cmVhbSwgdGV4dCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJldHVybmVkID0gZm9ybWF0UmVzdWx0KHZhbHVlKTtcbiAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICBjb25zdCBzdWZmaXggPSByZXR1cm5lZC5lbmRzV2l0aChcIlxcblwiKSA/IHJldHVybmVkIDogYCR7cmV0dXJuZWR9XFxuYDtcbiAgICAgICAgb3V0cHV0LmVtaXQoXCJzdGRvdXRcIiwgc3VmZml4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFVzZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgc3Rkb3V0OiBvdXRwdXQuc3Rkb3V0LnZhbHVlLFxuICAgICAgICBzdGRlcnI6IG91dHB1dC5zdGRlcnIudmFsdWUsXG4gICAgICAgIGV4ZWN1dGlvblRpbWVNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkLFxuICAgICAgICAuLi5vdXRwdXQubWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAoYWJvcnRlZCB8fCBvcHRpb25zLmFib3J0U2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHRocm93IGFib3J0UmVhc29uKG9wdGlvbnMuYWJvcnRTaWduYWwpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGNhdWdodCk7XG4gICAgICBvdXRwdXQuZW1pdChcInN0ZGVyclwiLCBvdXRwdXQuc3RkZXJyLnZhbHVlID8gYFxcbiR7bWVzc2FnZX1gIDogbWVzc2FnZSk7XG4gICAgICBjb25zdCB7IGNyYXNoZWRFcnJvciB9ID0gYXdhaXQgbW9udHlDb250ZXh0KCk7XG4gICAgICBjb25zdCB0aW1lZE91dCA9IGNhdWdodCBpbnN0YW5jZW9mIGNyYXNoZWRFcnJvciAmJiBjYXVnaHQudGltZWRPdXQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXhpdENvZGU6IHRpbWVkT3V0ID8gLTEgOiAxLFxuICAgICAgICBzdGRvdXQ6IG91dHB1dC5zdGRvdXQudmFsdWUsXG4gICAgICAgIHN0ZGVycjogb3V0cHV0LnN0ZGVyci52YWx1ZSxcbiAgICAgICAgZXhlY3V0aW9uVGltZU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWQsXG4gICAgICAgIC4uLih0aW1lZE91dCA/IHsgdGltZWRPdXQ6IHRydWUsIGtpbGxlZDogdHJ1ZSB9IDoge30pLFxuICAgICAgICAuLi5vdXRwdXQubWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG9wdGlvbnMuYWJvcnRTaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIGF3YWl0IHNlc3Npb24uY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc1JlYWR5KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gXCJydW5uaW5nXCI7XG4gIH1cblxuICBnZXRJbmZvKCk6IFNhbmRib3hJbmZvIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBwcm92aWRlcjogdGhpcy5wcm92aWRlcixcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBjcmVhdGVkQXQ6IHRoaXMuY3JlYXRlZEF0LFxuICAgICAgLi4uKHRoaXMubGFzdFVzZWRBdCA/IHsgbGFzdFVzZWRBdDogdGhpcy5sYXN0VXNlZEF0IH0gOiB7fSksXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBsYW5ndWFnZTogXCJweXRob25cIixcbiAgICAgICAgaG9zdEFjY2VzczogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBnZXRJbnN0cnVjdGlvbnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgXCJDb21tYW5kcyBydW4gYXMgUHl0aG9uIHNvdXJjZSBpbiB0aGUgUHlkYW50aWMgTW9udHkgZmFsbGJhY2suXCIsXG4gICAgICBcIlBhc3MgUHl0aG9uIGNvZGUgZGlyZWN0bHkgcmF0aGVyIHRoYW4gc2hlbGwgc3ludGF4LlwiLFxuICAgICAgXCJUaGVyZSBpcyBubyBob3N0IGZpbGVzeXN0ZW0sIG5ldHdvcmssIGVudmlyb25tZW50LCBzaGVsbCwgb3IgdGhpcmQtcGFydHkgcGFja2FnZSBhY2Nlc3MuXCIsXG4gICAgXS5qb2luKFwiIFwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb250eUNvZGUoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvbW1hbmQ7XG4gIGlmICgoY29tbWFuZCA9PT0gXCJweXRob25cIiB8fCBjb21tYW5kID09PSBcInB5dGhvbjNcIikgJiYgYXJncy5sZW5ndGggPT09IDIgJiYgYXJnc1swXSA9PT0gXCItY1wiKSB7XG4gICAgcmV0dXJuIGFyZ3NbMV07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RyaXBQeXRob25GZW5jZShjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gY29kZS50cmltKCk7XG4gIGNvbnN0IG1hdGNoID0gL15gYGAoPzpweXRob258cHkpP1xccypcXG4oW1xcc1xcU10qPylcXG5gYGAkL2kuZXhlYyh0cmltbWVkKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV0gPz8gY29kZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVzdWx0KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBcIlwiO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKSA/PyBTdHJpbmcodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxufVxuXG5jbGFzcyBSZXRhaW5lZE91dHB1dCB7XG4gIHJlYWRvbmx5IHN0ZG91dDogUmV0YWluZWRUZXh0O1xuICByZWFkb25seSBzdGRlcnI6IFJldGFpbmVkVGV4dDtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uU3Rkb3V0OiBFeGVjdXRlQ29tbWFuZE9wdGlvbnNbXCJvblN0ZG91dFwiXTtcbiAgcHJpdmF0ZSByZWFkb25seSBvblN0ZGVycjogRXhlY3V0ZUNvbW1hbmRPcHRpb25zW1wib25TdGRlcnJcIl07XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRXhlY3V0ZUNvbW1hbmRPcHRpb25zKSB7XG4gICAgdGhpcy5zdGRvdXQgPSBuZXcgUmV0YWluZWRUZXh0KG9wdGlvbnMubWF4UmV0YWluZWRCeXRlcyk7XG4gICAgdGhpcy5zdGRlcnIgPSBuZXcgUmV0YWluZWRUZXh0KG9wdGlvbnMubWF4UmV0YWluZWRCeXRlcyk7XG4gICAgdGhpcy5vblN0ZG91dCA9IG9wdGlvbnMub25TdGRvdXQ7XG4gICAgdGhpcy5vblN0ZGVyciA9IG9wdGlvbnMub25TdGRlcnI7XG4gIH1cblxuICBlbWl0KHN0cmVhbTogXCJzdGRvdXRcIiB8IFwic3RkZXJyXCIsIHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChzdHJlYW0gPT09IFwic3Rkb3V0XCIpIHtcbiAgICAgIHRoaXMub25TdGRvdXQ/Lih0ZXh0KTtcbiAgICAgIHRoaXMuc3Rkb3V0LmFwcGVuZCh0ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vblN0ZGVycj8uKHRleHQpO1xuICAgICAgdGhpcy5zdGRlcnIuYXBwZW5kKHRleHQpO1xuICAgIH1cbiAgfVxuXG4gIG1ldGFkYXRhKCk6IFBpY2s8XG4gICAgQ29tbWFuZFJlc3VsdCxcbiAgICBcInN0ZG91dFRydW5jYXRlZFwiIHwgXCJzdGRlcnJUcnVuY2F0ZWRcIiB8IFwic3Rkb3V0RHJvcHBlZEJ5dGVzXCIgfCBcInN0ZGVyckRyb3BwZWRCeXRlc1wiXG4gID4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odGhpcy5zdGRvdXQuZHJvcHBlZEJ5dGVzID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0ZG91dFRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHN0ZG91dERyb3BwZWRCeXRlczogdGhpcy5zdGRvdXQuZHJvcHBlZEJ5dGVzLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4odGhpcy5zdGRlcnIuZHJvcHBlZEJ5dGVzID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0ZGVyclRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHN0ZGVyckRyb3BwZWRCeXRlczogdGhpcy5zdGRlcnIuZHJvcHBlZEJ5dGVzLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBSZXRhaW5lZFRleHQge1xuICB2YWx1ZSA9IFwiXCI7XG4gIGRyb3BwZWRCeXRlcyA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXhCeXRlczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbiAgY29uc3RydWN0b3IobWF4Qnl0ZXM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gbWF4Qnl0ZXMgPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIGlmIChcbiAgICAgIHJlc29sdmVkICE9PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgJiZcbiAgICAgICghTnVtYmVyLmlzU2FmZUludGVnZXIocmVzb2x2ZWQpIHx8IHJlc29sdmVkIDwgMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtYXhSZXRhaW5lZEJ5dGVzIG11c3QgYmUgYSBub24tbmVnYXRpdmUgc2FmZSBpbnRlZ2VyIG9yIEluZmluaXR5XCIpO1xuICAgIH1cbiAgICB0aGlzLm1heEJ5dGVzID0gcmVzb2x2ZWQ7XG4gIH1cblxuICBhcHBlbmQodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgaWYgKHRoaXMubWF4Qnl0ZXMgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgdGhpcy52YWx1ZSArPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb21iaW5lZCA9IHRoaXMuZW5jb2Rlci5lbmNvZGUodGhpcy52YWx1ZSArIHRleHQpO1xuICAgIGlmIChjb21iaW5lZC5sZW5ndGggPD0gdGhpcy5tYXhCeXRlcykge1xuICAgICAgdGhpcy52YWx1ZSArPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSBjb21iaW5lZC5sZW5ndGggLSB0aGlzLm1heEJ5dGVzO1xuICAgIHdoaWxlIChzdGFydCA8IGNvbWJpbmVkLmxlbmd0aCAmJiAoY29tYmluZWRbc3RhcnRdISAmIDB4YzApID09PSAweDgwKSBzdGFydCsrO1xuICAgIGNvbnN0IHJldGFpbmVkID0gY29tYmluZWQuc3ViYXJyYXkoc3RhcnQpO1xuICAgIHRoaXMuZHJvcHBlZEJ5dGVzICs9IGNvbWJpbmVkLmxlbmd0aCAtIHJldGFpbmVkLmxlbmd0aDtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5kZWNvZGVyLmRlY29kZShyZXRhaW5lZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVybWluYXRlV29ya2VyKHdvcmtlclBpZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICh3b3JrZXJQaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCh3b3JrZXJQaWQsIFwiU0lHS0lMTFwiKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gVGhlIGNvbW1hbmQgY2FuIGZpbmlzaCBiZXR3ZWVuIHRoZSBhYm9ydCBldmVudCBhbmQgdGhlIGtpbGwgcmVxdWVzdC5cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja291dFNlc3Npb24oXG4gIHBvb2w6IE1vbnR5UG9vbCxcbiAgb3B0aW9uczogQ2hlY2tvdXRPcHRpb25zLFxuICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxNb250eVNlc3Npb24+IHtcbiAgY29uc3QgY2hlY2tvdXQgPSBwb29sLmNoZWNrb3V0KG9wdGlvbnMpO1xuICBpZiAoIXNpZ25hbCkgcmV0dXJuIGNoZWNrb3V0O1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB2b2lkIGNoZWNrb3V0LnRoZW4oKHNlc3Npb24pID0+IHNlc3Npb24uY2xvc2UoKSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB0aHJvdyBhYm9ydFJlYXNvbihzaWduYWwpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPE1vbnR5U2Vzc2lvbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIHJlamVjdChhYm9ydFJlYXNvbihzaWduYWwpKTtcbiAgICAgIHZvaWQgY2hlY2tvdXQudGhlbigoc2Vzc2lvbikgPT4gc2Vzc2lvbi5jbG9zZSgpKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH07XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgY2hlY2tvdXQudGhlbihcbiAgICAgIChzZXNzaW9uKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgICAgICByZXNvbHZlKHNlc3Npb24pO1xuICAgICAgfSxcbiAgICAgIChjYXVnaHQ6IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICAgIHJlamVjdChjYXVnaHQpO1xuICAgICAgfSxcbiAgICApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYWJvcnRSZWFzb24oc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICByZXR1cm4gc2lnbmFsPy5yZWFzb24gPz8gbmV3IERPTUV4Y2VwdGlvbihcIlRoZSBjb21tYW5kIHdhcyBhYm9ydGVkXCIsIFwiQWJvcnRFcnJvclwiKTtcbn1cblxuZnVuY3Rpb24gZmFpbGVkUmVzdWx0KFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBzdGFydGVkOiBudW1iZXIsXG4gIHN0ZGVycjogc3RyaW5nLFxuKTogQ29tbWFuZFJlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIGV4aXRDb2RlOiAxLFxuICAgIHN0ZG91dDogXCJcIixcbiAgICBzdGRlcnIsXG4gICAgZXhlY3V0aW9uVGltZU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWQsXG4gIH07XG59XG5cbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG4gIGNvbnN0IHNhbmRib3ggPSBuZXcgTW9udHlTYW5kYm94KCk7XG4gIGF3YWl0IHNhbmRib3guc3RhcnQoKTtcbiAgY29uc29sZS5sb2coYXdhaXQgc2FuZGJveC5leGVjdXRlQ29tbWFuZChcInByaW50KCdIZWxsbywgd29ybGQhJylcIikpO1xuICBhd2FpdCBzYW5kYm94LnN0b3AoKTtcbn1cbiJdfQ==
|