obsidian-integration-testing 6.2.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +49 -14
  2. package/dist/lib/cjs/connect-to-cdp.cjs +1 -1
  3. package/dist/lib/cjs/connect-to-cdp.d.cts +5 -4
  4. package/dist/lib/cjs/enable-plugin.cjs +2 -2
  5. package/dist/lib/cjs/error-to-string.cjs +61 -0
  6. package/dist/lib/cjs/error-to-string.d.cts +20 -0
  7. package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
  8. package/dist/lib/cjs/eval-in-obsidian.d.cts +127 -92
  9. package/dist/lib/cjs/global-setup-core.cjs +11 -11
  10. package/dist/lib/cjs/index.cjs +4 -1
  11. package/dist/lib/cjs/index.d.cts +3 -1
  12. package/dist/lib/cjs/lib-registry.cjs +59 -0
  13. package/dist/lib/cjs/lib-registry.d.cts +67 -0
  14. package/dist/lib/cjs/library.cjs +1 -1
  15. package/dist/lib/cjs/namespace-bootstrap.cjs +55 -31
  16. package/dist/lib/cjs/obsidian-namespace.cjs +1 -1
  17. package/dist/lib/cjs/obsidian-namespace.d.cts +8 -8
  18. package/dist/lib/cjs/vitest/global-setup.cjs +4 -4
  19. package/dist/lib/esm/connect-to-cdp.d.mts +5 -4
  20. package/dist/lib/esm/connect-to-cdp.mjs +1 -1
  21. package/dist/lib/esm/enable-plugin.mjs +2 -2
  22. package/dist/lib/esm/error-to-string.d.mts +20 -0
  23. package/dist/lib/esm/error-to-string.mjs +37 -0
  24. package/dist/lib/esm/eval-in-obsidian.d.mts +127 -92
  25. package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
  26. package/dist/lib/esm/global-setup-core.mjs +11 -11
  27. package/dist/lib/esm/index.d.mts +3 -1
  28. package/dist/lib/esm/index.mjs +3 -1
  29. package/dist/lib/esm/lib-registry.d.mts +67 -0
  30. package/dist/lib/esm/lib-registry.mjs +32 -0
  31. package/dist/lib/esm/library.mjs +1 -1
  32. package/dist/lib/esm/namespace-bootstrap.mjs +58 -31
  33. package/dist/lib/esm/obsidian-namespace.d.mts +8 -8
  34. package/dist/lib/esm/vitest/global-setup.mjs +4 -4
  35. package/dist/obsidian-integration-testing-8.0.0.tgz +0 -0
  36. package/package.json +1 -1
  37. package/dist/lib/cjs/serialize-error.cjs +0 -44
  38. package/dist/lib/cjs/serialize-error.d.cts +0 -22
  39. package/dist/lib/esm/serialize-error.d.mts +0 -22
  40. package/dist/lib/esm/serialize-error.mjs +0 -20
  41. package/dist/obsidian-integration-testing-6.2.0.tgz +0 -0
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Registry of renderer-side resolvers that populate the `lib` argument injected
5
+ * into every {@link evalInObsidian} callback.
6
+ *
7
+ * A provider package (e.g. `obsidian-dev-utils`) registers a resolver via
8
+ * {@link registerLibResolver} from its per-worker test setup (`setupFiles`),
9
+ * like the context resolvers in `context-provider.ts` — registration must happen
10
+ * in the worker because the namespace bootstrap is generated per-worker. Each
11
+ * resolver is a self-contained function that runs inside the Obsidian renderer
12
+ * and returns an object; the harness serializes it into the bootstrap and
13
+ * `Object.assign`s every resolver's result into the single `lib` bag.
14
+ */
15
+ /**
16
+ * A self-contained function, evaluated inside the Obsidian renderer, that returns
17
+ * an object whose own enumerable properties are merged (via `Object.assign`) into
18
+ * the injected `lib` bag.
19
+ *
20
+ * It is serialized via `toString()` and must not close over any module scope
21
+ * (imports are unavailable in the serialized renderer closure); read a renderer
22
+ * global instead (e.g. a value a fixture plugin published on `window`). Returning
23
+ * `null`/`undefined` is tolerated at runtime (`Object.assign` ignores it).
24
+ *
25
+ * @returns The object whose own enumerable properties are merged into `lib`.
26
+ */
27
+ export type LibResolver = (this: void) => object;
28
+ /**
29
+ * Computes the namespace-bootstrap version string, folding the registered
30
+ * resolver sources into the base library version so that a changed resolver set
31
+ * forces a re-bootstrap of the shared Obsidian instance.
32
+ *
33
+ * Pure — takes the resolver array explicitly so it can be unit-tested without
34
+ * touching the module-level registry.
35
+ *
36
+ * @param version - The base library version.
37
+ * @param resolvers - The registered resolvers.
38
+ * @returns The base version when `resolvers` is empty; otherwise the base version
39
+ * combined with every resolver's source text.
40
+ */
41
+ export declare function computeBootstrapVersion(version: string, resolvers: readonly LibResolver[]): string;
42
+ /**
43
+ * Returns the namespace-bootstrap version for the currently registered
44
+ * resolvers — {@link computeBootstrapVersion} applied to
45
+ * {@link getRegisteredLibResolvers}.
46
+ *
47
+ * @returns The bootstrap version string.
48
+ */
49
+ export declare function getBootstrapVersion(): string;
50
+ /**
51
+ * Returns every registered {@link LibResolver}, in registration order.
52
+ *
53
+ * @returns The registered resolvers.
54
+ */
55
+ export declare function getRegisteredLibResolvers(): readonly LibResolver[];
56
+ /**
57
+ * Registers a renderer-side resolver whose result is merged into the `lib`
58
+ * argument of every {@link evalInObsidian} callback. Call from a provider's
59
+ * per-worker test setup (`setupFiles`), like the context resolvers.
60
+ *
61
+ * Registration is idempotent by source text: registering a resolver whose
62
+ * `toString()` matches an already-registered one is a no-op, so a setup module
63
+ * evaluated more than once does not merge the same library twice.
64
+ *
65
+ * @param resolver - The resolver function.
66
+ */
67
+ export declare function registerLibResolver(resolver: LibResolver): void;
@@ -21,7 +21,7 @@ __export(library_exports, {
21
21
  LIBRARY_VERSION: () => LIBRARY_VERSION
22
22
  });
23
23
  module.exports = __toCommonJS(library_exports);
24
- const LIBRARY_VERSION = false ? "dev" : "6.1.0";
24
+ const LIBRARY_VERSION = false ? "dev" : "7.0.0";
25
25
  // Annotate the CommonJS export names for ESM import in node:
26
26
  0 && (module.exports = {
27
27
  LIBRARY_VERSION
@@ -22,13 +22,14 @@ __export(namespace_bootstrap_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(namespace_bootstrap_exports);
24
24
  var import_generate_function_call = require("./generate-function-call.cjs");
25
- var import_library = require("./library.cjs");
25
+ var import_lib_registry = require("./lib-registry.cjs");
26
26
  async function ensureNamespaceBootstrapped(transport, cwd, timeoutInMilliseconds) {
27
27
  const evalOptions = {
28
28
  cwd,
29
29
  ...timeoutInMilliseconds !== void 0 && { timeoutInMilliseconds }
30
30
  };
31
- const versionJson = JSON.stringify(import_library.LIBRARY_VERSION);
31
+ const bootstrapVersion = (0, import_lib_registry.getBootstrapVersion)();
32
+ const versionJson = JSON.stringify(bootstrapVersion);
32
33
  const checkResult = await transport.evaluate(
33
34
  `JSON.stringify(window.__obsidianIntegrationTesting?.version === ${versionJson})`,
34
35
  evalOptions
@@ -36,7 +37,10 @@ async function ensureNamespaceBootstrapped(transport, cwd, timeoutInMilliseconds
36
37
  if (checkResult === "true") {
37
38
  return;
38
39
  }
39
- const bootstrapExpr = (0, import_generate_function_call.generateFunctionCall)(bootstrapNamespace, { version: import_library.LIBRARY_VERSION });
40
+ const bootstrapExpr = (0, import_generate_function_call.generateFunctionCall)(bootstrapNamespace, {
41
+ libResolvers: [...(0, import_lib_registry.getRegisteredLibResolvers)()],
42
+ version: bootstrapVersion
43
+ });
40
44
  await transport.evaluate(bootstrapExpr, evalOptions);
41
45
  }
42
46
  function bootstrapNamespace(bootstrapParams) {
@@ -45,6 +49,7 @@ function bootstrapNamespace(bootstrapParams) {
45
49
  const INPUT_TIMEOUT_IN_MILLISECONDS = 5e3;
46
50
  const WAIT_UNTIL_POLL_INTERVAL_IN_MILLISECONDS = 50;
47
51
  const WAIT_UNTIL_TIMEOUT_IN_MILLISECONDS = 5e3;
52
+ const STACK_TRACE_PREFIX = " at";
48
53
  const holder = window;
49
54
  const existingContexts = holder.__obsidianIntegrationTesting?.contexts ?? {};
50
55
  const existingObsidianModule = holder.__obsidianIntegrationTesting?.obsidianModule;
@@ -66,13 +71,20 @@ function bootstrapNamespace(bootstrapParams) {
66
71
  this.app.workspace.onLayoutReady(resolve);
67
72
  });
68
73
  },
74
+ errorToString(error) {
75
+ return errorToStringImpl(error);
76
+ },
69
77
  async evalWrapper(params) {
70
78
  if (!this.app.plugins.isEnabled()) {
71
79
  await this.app.plugins.setEnable(true);
72
80
  }
73
81
  const obsidianModule = await this.getObsidianModule();
74
82
  const context = params.contextId ? this.contexts[params.contextId] ??= {} : {};
75
- const fullArgs = { ...params.args, app: this.app, context, hoverElement, moveMouse, obsidianModule, pressKey, typeIntoEditor, unhoverElement, waitUntil };
83
+ const lib = { hoverElement, moveMouse, pressKey, typeIntoEditor, unhoverElement, waitUntil };
84
+ for (const resolveLib of this.libResolvers) {
85
+ Object.assign(lib, resolveLib());
86
+ }
87
+ const fullArgs = { ...params.args, app: this.app, context, lib, obsidianModule };
76
88
  try {
77
89
  const result = await params.fn(fullArgs);
78
90
  if (result === void 0) {
@@ -80,7 +92,7 @@ function bootstrapNamespace(bootstrapParams) {
80
92
  }
81
93
  return JSON.stringify({ value: result });
82
94
  } catch (evalError) {
83
- return JSON.stringify({ type: "error", value: this.serializeError(evalError) });
95
+ return JSON.stringify({ type: "error", value: this.errorToString(evalError) });
84
96
  }
85
97
  },
86
98
  async getObsidianModule() {
@@ -115,27 +127,12 @@ function bootstrapNamespace(bootstrapParams) {
115
127
  await this.ensureLayoutReady();
116
128
  window.electron.ipcRenderer.sendSync(params.channel, ...params.args);
117
129
  },
130
+ libResolvers: bootstrapParams.libResolvers,
118
131
  obsidianModule: existingObsidianModule,
119
132
  async pollVaultBasePath() {
120
133
  await this.ensureLayoutReady();
121
134
  return JSON.stringify(this.app.vault.adapter.getBasePath());
122
135
  },
123
- serializeError(error, depth = 0) {
124
- const CAUSE_INDENT_SIZE = 2;
125
- const indent = " ".repeat(depth * CAUSE_INDENT_SIZE);
126
- if (!(error instanceof Error)) {
127
- return `${indent}${String(error)}`;
128
- }
129
- const stackOrMessage = error.stack ?? `${error.name}: ${error.message}`;
130
- let result = stackOrMessage.split("\n").map((line) => `${indent}${line}`).join("\n");
131
- if (error.cause !== void 0) {
132
- result += `
133
- ${indent}[cause]:`;
134
- result += `
135
- ${this.serializeError(error.cause, depth + 1)}`;
136
- }
137
- return result;
138
- },
139
136
  async setLocalStorageItem(params) {
140
137
  await this.ensureLayoutReady();
141
138
  localStorage.setItem(params.key, params.value);
@@ -152,7 +149,7 @@ ${this.serializeError(error.cause, depth + 1)}`;
152
149
  editor.setCursor(lastLine, editor.getLine(lastLine).length);
153
150
  await sleep(FOCUS_SETTLE_DELAY_IN_MILLISECONDS);
154
151
  for (const char of text) {
155
- await pressKey({ key: char });
152
+ pressKey({ key: char });
156
153
  }
157
154
  const startTime = Date.now();
158
155
  while (editor.getValue() === valueBeforeTyping && Date.now() - startTime < INPUT_TIMEOUT_IN_MILLISECONDS) {
@@ -175,25 +172,20 @@ ${this.serializeError(error.cause, depth + 1)}`;
175
172
  webContents.sendInputEvent({ keyCode: key, modifiers: electronModifiers, type: "keyDown" });
176
173
  webContents.sendInputEvent({ keyCode: key, modifiers: electronModifiers, type: "char" });
177
174
  webContents.sendInputEvent({ keyCode: key, modifiers: electronModifiers, type: "keyUp" });
178
- return Promise.resolve();
179
175
  }
180
176
  async function hoverElement(hoverParams) {
181
177
  const CENTER_DIVISOR = 2;
182
178
  const { element } = hoverParams;
183
179
  const rect = element.getBoundingClientRect();
184
- moveMouseTo(Math.round(rect.left + rect.width / CENTER_DIVISOR), Math.round(rect.top + rect.height / CENTER_DIVISOR));
180
+ moveMouse({ x: rect.left + rect.width / CENTER_DIVISOR, y: rect.top + rect.height / CENTER_DIVISOR });
185
181
  const startTime = Date.now();
186
182
  while (!element.matches(":hover") && Date.now() - startTime < INPUT_TIMEOUT_IN_MILLISECONDS) {
187
183
  await sleep(INPUT_POLL_INTERVAL_IN_MILLISECONDS);
188
184
  }
189
185
  }
190
186
  function moveMouse(moveParams) {
191
- moveMouseTo(Math.round(moveParams.x), Math.round(moveParams.y));
192
- return Promise.resolve();
193
- }
194
- function moveMouseTo(x, y) {
195
187
  const webContents = window.electron.remote.getCurrentWebContents();
196
- webContents.sendInputEvent({ type: "mouseMove", x, y });
188
+ webContents.sendInputEvent({ type: "mouseMove", x: Math.round(moveParams.x), y: Math.round(moveParams.y) });
197
189
  }
198
190
  async function unhoverElement(unhoverParams) {
199
191
  const CENTER_DIVISOR = 2;
@@ -202,7 +194,7 @@ ${this.serializeError(error.cause, depth + 1)}`;
202
194
  const rect = element.getBoundingClientRect();
203
195
  const x = rect.left >= OUTSIDE_OFFSET_IN_PIXELS ? rect.left - OUTSIDE_OFFSET_IN_PIXELS : rect.right + OUTSIDE_OFFSET_IN_PIXELS;
204
196
  const y = rect.top + rect.height / CENTER_DIVISOR;
205
- moveMouseTo(Math.round(x), Math.round(y));
197
+ moveMouse({ x, y });
206
198
  const startTime = Date.now();
207
199
  while (element.matches(":hover") && Date.now() - startTime < INPUT_TIMEOUT_IN_MILLISECONDS) {
208
200
  await sleep(INPUT_POLL_INTERVAL_IN_MILLISECONDS);
@@ -224,9 +216,41 @@ ${this.serializeError(error.cause, depth + 1)}`;
224
216
  await sleep(intervalInMilliseconds);
225
217
  }
226
218
  }
219
+ function errorToStringImpl(error) {
220
+ if (!(error instanceof Error)) {
221
+ return String(error);
222
+ }
223
+ let message = error.stack ?? `${error.name}: ${error.message}`;
224
+ if (error.cause !== void 0) {
225
+ message = appendNestedError(message, error.cause, "Caused by:");
226
+ }
227
+ if (error instanceof AggregateError) {
228
+ const aggregatedErrors = error.errors;
229
+ for (const [index, aggregatedError] of aggregatedErrors.entries()) {
230
+ message = appendNestedError(message, aggregatedError, `Aggregated error #${String(index + 1)}:`);
231
+ }
232
+ }
233
+ return message;
234
+ }
235
+ function appendNestedError(message, nestedError, title) {
236
+ let result = `${message}
237
+ ${generateStackTraceLine(title)}`;
238
+ for (const line of errorToStringImpl(nestedError).split("\n")) {
239
+ if (!line.trim()) {
240
+ continue;
241
+ }
242
+ result += line.startsWith(STACK_TRACE_PREFIX) ? `
243
+ ${line}` : `
244
+ ${generateStackTraceLine(line)}`;
245
+ }
246
+ return result;
247
+ }
248
+ function generateStackTraceLine(title) {
249
+ return `${STACK_TRACE_PREFIX} --- ${title} --- (0)`;
250
+ }
227
251
  }
228
252
  // Annotate the CommonJS export names for ESM import in node:
229
253
  0 && (module.exports = {
230
254
  ensureNamespaceBootstrapped
231
255
  });
232
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBIb3ZlckVsZW1lbnRQYXJhbXMsXG4gIE1vdmVNb3VzZVBhcmFtcyxcbiAgUHJlc3NLZXlQYXJhbXMsXG4gIFR5cGVJbnRvRWRpdG9yUGFyYW1zLFxuICBVbmhvdmVyRWxlbWVudFBhcmFtcyxcbiAgV2FpdFVudGlsUGFyYW1zXG59IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZUZ1bmN0aW9uQ2FsbFBhcmFtcyB9IGZyb20gJy4vZ2VuZXJhdGUtZnVuY3Rpb24tY2FsbC5janMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVGdW5jdGlvbkNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB7IExJQlJBUllfVkVSU0lPTiB9IGZyb20gJy4vbGlicmFyeS5janMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgbmFtZXNwYWNlIGlzIGJvb3RzdHJhcHBlZFxuICogaW4gdGhlIE9ic2lkaWFuIHByb2Nlc3Mgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUGVyZm9ybXMgYSBsaWdodHdlaWdodCB2ZXJzaW9uIGNoZWNrIHZpYSB0aGUgdHJhbnNwb3J0LiBJZiB0aGUgbmFtZXNwYWNlXG4gKiBkb2Vzbid0IGV4aXN0IG9yIGhhcyBhIGRpZmZlcmVudCB2ZXJzaW9uLCBzZW5kcyB0aGUgZnVsbCBib290c3RyYXAgZXhwcmVzc2lvblxuICogdG8gcmVnaXN0ZXIgYWxsIGhlbHBlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeSAodmF1bHQgcGF0aCkuXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gT3B0aW9uYWwgcGVyLWV2YWwgdGltZW91dC4gRm9yd2FyZGVkIHRvIGJvdGhcbiAqICAgdGhlIHZlcnNpb24gY2hlY2sgYW5kIHRoZSBib290c3RyYXAgZXZhbCBzbyBhIGh1bmcgYG9ic2lkaWFuIGV2YWxgIHJlamVjdHNcbiAqICAgaW5zdGVhZCBvZiBibG9ja2luZyB0aGUgY2FsbGVyIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0LCBjd2Q6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV2YWxPcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyA9IHtcbiAgICBjd2QsXG4gICAgLi4uKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gIH07XG4gIGNvbnN0IHZlcnNpb25Kc29uID0gSlNPTi5zdHJpbmdpZnkoTElCUkFSWV9WRVJTSU9OKTtcbiAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKGNoZWNrUmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBib290c3RyYXBFeHByID0gZ2VuZXJhdGVGdW5jdGlvbkNhbGwoYm9vdHN0cmFwTmFtZXNwYWNlLCB7IHZlcnNpb246IExJQlJBUllfVkVSU0lPTiB9KTtcbiAgYXdhaXQgdHJhbnNwb3J0LmV2YWx1YXRlKGJvb3RzdHJhcEV4cHIsIGV2YWxPcHRpb25zKTtcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIFNlcmlhbGl6ZWQgdmlhIHRvU3RyaW5nKCkgYW5kIGV4ZWN1dGVkIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcywgbm90IGluIE5vZGUuIENvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMuICovXG5cbi8qKlxuICogQm9vdHN0cmFwcyB0aGUgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBuYW1lc3BhY2Ugd2l0aCBhbGxcbiAqIGhlbHBlciBmdW5jdGlvbnMuIFNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmQgc2VudCB0byBPYnNpZGlhbiBvbmNlXG4gKiBwZXIgbGlicmFyeSB2ZXJzaW9uLlxuICpcbiAqIFByZXNlcnZlcyBgY29udGV4dHNgIGFjcm9zcyB2ZXJzaW9uIHVwZ3JhZGVzIHNvIGxpdmUge0BsaW5rIENvbnRleHRJZH1cbiAqIHJlZmVyZW5jZXMgc3Vydml2ZS5cbiAqXG4gKiBNdXN0IE5PVCByZWZlcmVuY2UgYW55IG91dGVyIHNjb3BlIFx1MjAxNCBpdCBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAuXG4gKlxuICogQHBhcmFtIGJvb3RzdHJhcFBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGluY2x1ZGluZyB0aGUgbGlicmFyeSB2ZXJzaW9uLlxuICovXG5mdW5jdGlvbiBib290c3RyYXBOYW1lc3BhY2UoYm9vdHN0cmFwUGFyYW1zOiBHZW5lcmF0ZUZ1bmN0aW9uQ2FsbFBhcmFtczxCb290c3RyYXBOYW1lc3BhY2VQYXJhbXM+KTogdm9pZCB7XG4gIGludGVyZmFjZSBJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXIge1xuICAgIF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZVN0YXRlO1xuICB9XG5cbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZVN0YXRlIHtcbiAgICBjb250ZXh0czogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIHJlYWRvbmx5IGFwcDogQXBwO1xuICAgIGRlc3Ryb3lDdXJyZW50V2luZG93KCk6IFByb21pc2U8dm9pZD47XG4gICAgZW5zdXJlTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcbiAgICBldmFsV3JhcHBlcihuc1BhcmFtczogRXZhbFdyYXBwZXJQYXJhbXMpOiBQcm9taXNlPHN0cmluZz47XG4gICAgZ2V0T2JzaWRpYW5Nb2R1bGUoKTogUHJvbWlzZTx1bmtub3duPjtcbiAgICBpcGNTZW5kU3luYyhuc1BhcmFtczogSXBjU2VuZFN5bmNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHBvbGxWYXVsdEJhc2VQYXRoKCk6IFByb21pc2U8c3RyaW5nPjtcbiAgICBzZXJpYWxpemVFcnJvcihlcnJvcjogdW5rbm93biwgZGVwdGg/OiBudW1iZXIpOiBzdHJpbmc7XG4gICAgc2V0TG9jYWxTdG9yYWdlSXRlbShuc1BhcmFtczogU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gIH1cblxuICBpbnRlcmZhY2UgRXZhbFdyYXBwZXJQYXJhbXMge1xuICAgIHJlYWRvbmx5IGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJlYWRvbmx5IGNvbnRleHRJZD86IHN0cmluZztcbiAgICBmbihmbkFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdW5rbm93bjtcbiAgfVxuXG4gIGludGVyZmFjZSBGaWxlU3lzdGVtQWRhcHRlckxpa2Uge1xuICAgIGdldEJhc2VQYXRoKCk6IHN0cmluZztcbiAgfVxuXG4gIGludGVyZmFjZSBJcGNTZW5kU3luY1BhcmFtcyB7XG4gICAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICAgIHJlYWRvbmx5IGNoYW5uZWw6IHN0cmluZztcbiAgfVxuXG4gIGludGVyZmFjZSBTZXRMb2NhbFN0b3JhZ2VJdGVtUGFyYW1zIHtcbiAgICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuICB9XG5cbiAgaW50ZXJmYWNlIEVsZWN0cm9uV2ViQ29udGVudHNXaXRoU2VuZElucHV0RXZlbnQge1xuICAgIHNlbmRJbnB1dEV2ZW50KGlucHV0RXZlbnQ6IFNlbmRJbnB1dEV2ZW50S2V5Ym9hcmRJbnB1dCB8IFNlbmRJbnB1dEV2ZW50TW91c2VJbnB1dCk6IHZvaWQ7XG4gIH1cblxuICBpbnRlcmZhY2UgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0ge1xuICAgIFBsYXRmb3JtOiBPYnNpZGlhblBsYXRmb3JtO1xuICB9XG5cbiAgaW50ZXJmYWNlIE9ic2lkaWFuUGxhdGZvcm0ge1xuICAgIGlzTWFjT1M6IGJvb2xlYW47XG4gIH1cblxuICBpbnRlcmZhY2UgU2VuZElucHV0RXZlbnRLZXlib2FyZElucHV0IHtcbiAgICBrZXlDb2RlOiBzdHJpbmc7XG4gICAgbW9kaWZpZXJzPzogc3RyaW5nW107XG4gICAgdHlwZTogJ2NoYXInIHwgJ2tleURvd24nIHwgJ2tleVVwJztcbiAgfVxuXG4gIGludGVyZmFjZSBTZW5kSW5wdXRFdmVudE1vdXNlSW5wdXQge1xuICAgIHR5cGU6ICdtb3VzZU1vdmUnO1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogRGVsYXkgKGluIG1zKSBiZWZvcmUgaW52b2tpbmcgYGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKWAgc28gdGhlIGV2YWwgdGhhdFxuICAgKiB0cmlnZ2VyZWQgdGhlIGNhbGwgaGFzIHRpbWUgdG8gcmV0dXJuIGl0cyByZXN1bHQgdG8gdGhlIGNhbGxlci4gV2l0aG91dFxuICAgKiBpdCB0aGUgcmVuZGVyZXIgZGllcyBiZWZvcmUgdGhlIElQQyByZXBseSBzaGlwcywgdGhlIGNhbGxlciB3YWl0cyBmb3IgdGhlXG4gICAqIGZ1bGwgZXZhbCB0aW1lb3V0LCBhbmQgc3RhbGUgYEJyb3dzZXJXaW5kb3dgIGVudHJpZXMgcGlsZSB1cC5cbiAgICovXG4gIGNvbnN0IERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTA7XG5cbiAgLyoqXG4gICAqIEludGVydmFsIChpbiBtcykgYmV0d2VlbiBwb2xscyB3aGlsZSB3YWl0aW5nIGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG9cbiAgICogdGFrZSBlZmZlY3QgKHRoZSBlZGl0b3IgZG9jdW1lbnQgdXBkYXRlcywgb3IgYW4gZWxlbWVudCdzIGA6aG92ZXJgIHN0YXRlXG4gICAqIGZsaXBzKS4gU2hhcmVkIGJ5IGV2ZXJ5IHRydXN0ZWQtaW5wdXQgaGVscGVyLlxuICAgKi9cbiAgY29uc3QgSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIChpbiBtcykgdG8gd2FpdCBmb3IgYSB0cnVzdGVkIGlucHV0IGV2ZW50IHRvIHRha2UgZWZmZWN0XG4gICAqIGJlZm9yZSBnaXZpbmcgdXAgKHRoZSBleHBlY3RlZCBvdXRjb21lIHdoZW4gdGhlIGlucHV0IGlzIHJlamVjdGVkIFx1MjAxNCBlLmcuIGFcbiAgICogcmVhZC1vbmx5IGVkaXRvciwgb3IgYSBwb2ludGVyIG1vdmUgdGhhdCBuZXZlciBsYW5kcyBvbiB0aGUgZWxlbWVudCkuXG4gICAqL1xuICBjb25zdCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHtAbGluayB3YWl0VW50aWx9IHByZWRpY2F0ZSBjaGVja3Mgd2hlbiB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gdGltZSAoaW4gbXMpIHtAbGluayB3YWl0VW50aWx9IHdhaXRzIGZvciBpdHMgcHJlZGljYXRlIHRvXG4gICAqIGJlY29tZSB0cnV0aHkgYmVmb3JlIHJlamVjdGluZywgd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaXMgb3VyIGludGVybmFsIFdpbmRvdyBhdWdtZW50YXRpb24sIGludGVudGlvbmFsbHkga2VwdCBsb2NhbCAobm90IGRlY2xhcmVkIGdsb2JhbGx5KSB0byBhdm9pZCBsZWFraW5nIGludG8gY29uc3VtZXIgdHlwZXMuXG4gIGNvbnN0IGhvbGRlciA9IHdpbmRvdyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPjtcbiAgY29uc3QgZXhpc3RpbmdDb250ZXh0cyA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5jb250ZXh0cyA/PyB7fTtcbiAgY29uc3QgZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5vYnNpZGlhbk1vZHVsZTtcblxuICBjb25zdCBuczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlID0ge1xuICAgIGdldCBhcHAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gYGFwcGAgZ2V0dGVyIHJlYWRzIGB3aW5kb3cuYXBwYCB3aGljaCBpcyBzZXQgYnkgT2JzaWRpYW4uXG4gICAgICByZXR1cm4gd2luZG93LmFwcDtcbiAgICB9LFxuXG4gICAgY29udGV4dHM6IGV4aXN0aW5nQ29udGV4dHMsXG5cbiAgICBhc3luYyBkZXN0cm95Q3VycmVudFdpbmRvdyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGF3YWl0IHNsZWVwKDApO1xuICAgICAgY29uc3QgZWxlY3Ryb25XaW5kb3cgPSB3aW5kb3cuZWxlY3Ryb25XaW5kb3c7XG4gICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKTtcbiAgICAgIH0sIERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZW5zdXJlTGF5b3V0UmVhZHkodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShyZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBldmFsV3JhcHBlcih0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBpZiAoIXRoaXMuYXBwLnBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvYnNpZGlhbk1vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0T2JzaWRpYW5Nb2R1bGUoKTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBwYXJhbXMuY29udGV4dElkXG4gICAgICAgID8gKHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF0gPz89IHt9KVxuICAgICAgICA6IHt9O1xuICAgICAgY29uc3QgZnVsbEFyZ3MgPSB7IC4uLnBhcmFtcy5hcmdzLCBhcHA6IHRoaXMuYXBwLCBjb250ZXh0LCBob3ZlckVsZW1lbnQsIG1vdmVNb3VzZSwgb2JzaWRpYW5Nb2R1bGUsIHByZXNzS2V5LCB0eXBlSW50b0VkaXRvciwgdW5ob3ZlckVsZW1lbnQsIHdhaXRVbnRpbCB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFyYW1zLmZuKGZ1bGxBcmdzKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3VuZGVmaW5lZCcgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHJlc3VsdCB9KTtcbiAgICAgIH0gY2F0Y2ggKGV2YWxFcnJvcikge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXJyb3InLCB2YWx1ZTogdGhpcy5zZXJpYWxpemVFcnJvcihldmFsRXJyb3IpIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPYnNpZGlhbk1vZHVsZSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgIGlmICh0aGlzLm9ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2lkaWFuTW9kdWxlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBTTElDRV9TVEFSVCA9IDI7XG4gICAgICBjb25zdCByYW5kb21TdWZmaXggPSBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoU0xJQ0VfU1RBUlQpO1xuICAgICAgY29uc3QgdGVtcE1vZHVsZU5hbWUgPSBgZ2V0LW9ic2lkaWFuLW1vZHVsZS0ke3JhbmRvbVN1ZmZpeH1gO1xuICAgICAgY29uc3QgZGlyID0gYCR7dGhpcy5hcHAudmF1bHQuY29uZmlnRGlyfS9wbHVnaW5zLyR7dGVtcE1vZHVsZU5hbWV9YDtcbiAgICAgIHRoaXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzW3RlbXBNb2R1bGVOYW1lXSA9IHtcbiAgICAgICAgYXV0aG9yOiAnJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICBkaXIsXG4gICAgICAgIGlkOiB0ZW1wTW9kdWxlTmFtZSxcbiAgICAgICAgaXNEZXNrdG9wT25seTogZmFsc2UsXG4gICAgICAgIG1pbkFwcFZlcnNpb246ICcnLFxuICAgICAgICBuYW1lOiB0ZW1wTW9kdWxlTmFtZSxcbiAgICAgICAgdmVyc2lvbjogJydcbiAgICAgIH07XG4gICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKGRpcik7XG5cbiAgICAgIGNvbnN0IHBsdWdpbkZuQm9keSA9ICdjb25zdCByPXJlcXVpcmUsZT1leHBvcnRzO2NvbnN0IG09cihcXCdvYnNpZGlhblxcJyk7d2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmcub2JzaWRpYW5Nb2R1bGU9bTtlLmRlZmF1bHQ9bS5QbHVnaW47JztcbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIud3JpdGUoYCR7ZGlyfS9tYWluLmpzYCwgcGx1Z2luRm5Cb2R5KTtcblxuICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5sb2FkUGx1Z2luKHRlbXBNb2R1bGVOYW1lKTtcbiAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMudW5pbnN0YWxsUGx1Z2luKHRlbXBNb2R1bGVOYW1lKTtcblxuICAgICAgaWYgKHRoaXMub2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5Nb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgb2JzaWRpYW4gbW9kdWxlJyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGlwY1NlbmRTeW5jKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmMocGFyYW1zLmNoYW5uZWwsIC4uLnBhcmFtcy5hcmdzKTtcbiAgICB9LFxuXG4gICAgb2JzaWRpYW5Nb2R1bGU6IGV4aXN0aW5nT2JzaWRpYW5Nb2R1bGUsXG5cbiAgICBhc3luYyBwb2xsVmF1bHRCYXNlUGF0aCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gRGF0YUFkYXB0ZXIgaXMgYWN0dWFsbHkgRmlsZVN5c3RlbUFkYXB0ZXIgYXQgcnVudGltZSBvbiBkZXNrdG9wLlxuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KCh0aGlzLmFwcC52YXVsdC5hZGFwdGVyIGFzIHVua25vd24gYXMgRmlsZVN5c3RlbUFkYXB0ZXJMaWtlKS5nZXRCYXNlUGF0aCgpKTtcbiAgICB9LFxuXG4gICAgc2VyaWFsaXplRXJyb3IodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBlcnJvcjogdW5rbm93biwgZGVwdGggPSAwKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IENBVVNFX0lOREVOVF9TSVpFID0gMjtcbiAgICAgIGNvbnN0IGluZGVudCA9ICcgJy5yZXBlYXQoZGVwdGggKiBDQVVTRV9JTkRFTlRfU0laRSk7XG5cbiAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgIHJldHVybiBgJHtpbmRlbnR9JHtTdHJpbmcoZXJyb3IpfWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YWNrT3JNZXNzYWdlID0gZXJyb3Iuc3RhY2sgPz8gYCR7ZXJyb3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgbGV0IHJlc3VsdCA9IHN0YWNrT3JNZXNzYWdlLnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IGAke2luZGVudH0ke2xpbmV9YCkuam9pbignXFxuJyk7XG5cbiAgICAgIGlmIChlcnJvci5jYXVzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdCArPSBgXFxuJHtpbmRlbnR9W2NhdXNlXTpgO1xuICAgICAgICByZXN1bHQgKz0gYFxcbiR7dGhpcy5zZXJpYWxpemVFcnJvcihlcnJvci5jYXVzZSwgZGVwdGggKyAxKX1gO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBhc3luYyBzZXRMb2NhbFN0b3JhZ2VJdGVtKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShwYXJhbXMua2V5LCBwYXJhbXMudmFsdWUpO1xuICAgIH0sXG5cbiAgICB2ZXJzaW9uOiBib290c3RyYXBQYXJhbXMudmVyc2lvblxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICAod2luZG93IGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+KS5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nID0gbnM7XG5cbiAgYXN5bmMgZnVuY3Rpb24gdHlwZUludG9FZGl0b3IodHlwZVBhcmFtczogVHlwZUludG9FZGl0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuXG4gICAgY29uc3QgeyBlZGl0b3IsIHRleHQgfSA9IHR5cGVQYXJhbXM7XG4gICAgY29uc3QgdmFsdWVCZWZvcmVUeXBpbmcgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcblxuICAgIC8vIEZvY3VzIHRoZSBlZGl0b3IgYW5kIHBsYWNlIHRoZSBjYXJldCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICBlZGl0b3IuZm9jdXMoKTtcbiAgICBjb25zdCBsYXN0TGluZSA9IGVkaXRvci5sYXN0TGluZSgpO1xuICAgIGVkaXRvci5zZXRDdXJzb3IobGFzdExpbmUsIGVkaXRvci5nZXRMaW5lKGxhc3RMaW5lKS5sZW5ndGgpO1xuXG4gICAgLy8gTGV0IGFueSBmb2N1cyB0cmFwIChhIGBzZXRUaW1lb3V0KDApYCByZS1mb2N1cykgZmlyZSBiZWZvcmUgdHlwaW5nLCBzbyBzdG9sZW4gZm9jdXMgaXMgZGV0ZWN0ZWQuXG4gICAgYXdhaXQgc2xlZXAoRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAvLyBUeXBpbmcgaXMgcHJlc3NpbmcgZWFjaCBjaGFyYWN0ZXIga2V5IGluIHR1cm46IGBwcmVzc0tleWAgaW5qZWN0cyB0aGUgc2FtZSB0cnVzdGVkXG4gICAgLy8gYGtleURvd25gIC0+IGBjaGFyYCAtPiBga2V5VXBgIGEgcmVhbCB1c2VyIHByb2R1Y2VzIFx1MjAxNCB0ZXh0IGxhbmRzIG9ubHkgaWYgdGhlIGVkaXRvciBob2xkcyBmb2N1cy5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgdGV4dCkge1xuICAgICAgYXdhaXQgcHJlc3NLZXkoeyBrZXk6IGNoYXIgfSk7XG4gICAgfVxuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgZG9jdW1lbnQgcmVmbGVjdHMgdGhlIGlucHV0IG9yIHRoZSB0aW1lb3V0IGVsYXBzZXMsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWRpdG9yLmdldFZhbHVlKCkgPT09IHZhbHVlQmVmb3JlVHlwaW5nICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXNzS2V5KHByZXNzUGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsga2V5LCBtb2RpZmllcnMgPSBbXSB9ID0gcHJlc3NQYXJhbXM7XG5cbiAgICAvLyAnTW9kJyBpcyBPYnNpZGlhbidzIHBsYXRmb3JtLWFnbm9zdGljIG1vZGlmaWVyOiBDbWQgKG1ldGEpIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZS5cbiAgICAvLyBSZWFkaW5nIGBQbGF0Zm9ybS5pc01hY09TYCBvZmYgdGhlIHJlc29sdmVkIG9ic2lkaWFuIG1vZHVsZSBpcyBzYWZlIGhlcmU6XG4gICAgLy8gYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdCBtb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayAoYW5kIHRodXMgYHByZXNzS2V5YCkgY2FuIHJ1bi5cbiAgICBjb25zdCBpc01hY09TID0gKG5zLm9ic2lkaWFuTW9kdWxlIGFzIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtKS5QbGF0Zm9ybS5pc01hY09TO1xuXG4gICAgLy8gTWFwIE9ic2lkaWFuJ3MgYE1vZGlmaWVyYCBuYW1lcyB0byBFbGVjdHJvbidzIGxvd2VyY2FzZSBgc2VuZElucHV0RXZlbnRgIG1vZGlmaWVyIG5hbWVzLlxuICAgIC8vIE5hbWVzICdNZXRhJywgJ0FsdCcsICdTaGlmdCcgbG93ZXJjYXNlIGRpcmVjdGx5OyAnQ3RybCcgLT4gJ2NvbnRyb2wnOyAnTW9kJyByZXNvbHZlcyBwZXItcGxhdGZvcm0uXG4gICAgY29uc3QgZWxlY3Ryb25Nb2RpZmllcnMgPSBtb2RpZmllcnMubWFwKChtb2RpZmllcik6IHN0cmluZyA9PiB7XG4gICAgICBpZiAobW9kaWZpZXIgPT09ICdNb2QnKSB7XG4gICAgICAgIHJldHVybiBpc01hY09TID8gJ21ldGEnIDogJ2NvbnRyb2wnO1xuICAgICAgfVxuICAgICAgaWYgKG1vZGlmaWVyID09PSAnQ3RybCcpIHtcbiAgICAgICAgcmV0dXJuICdjb250cm9sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBtb2RpZmllci50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBvYnNpZGlhbi10eXBpbmdzJyBgRWxlY3Ryb25XZWJDb250ZW50c2Agb21pdHMgdGhlIHN0YWJsZSBgc2VuZElucHV0RXZlbnRgLCB3aGljaCBpcyB3aGF0IGluamVjdHMgYSB0cnVzdGVkIChyZWFsKSBrZXkgcHJlc3MuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpIGFzIHVua25vd24gYXMgRWxlY3Ryb25XZWJDb250ZW50c1dpdGhTZW5kSW5wdXRFdmVudDtcblxuICAgIC8vIEEgdHJ1c3RlZCBrZXkgcHJlc3MgaXMga2V5RG93biAtPiBjaGFyIC0+IGtleVVwOiBrZXlEb3duIGZpcmVzIGBrZXlkb3duYCwgY2hhciBmaXJlc1xuICAgIC8vIGBrZXlwcmVzc2AvYGJlZm9yZWlucHV0YC9gaW5wdXRgLCBrZXlVcCBmaXJlcyBga2V5dXBgIFx1MjAxNCB0aGUgZnVsbCByZWFsIGtleSBwaXBlbGluZS5cbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleURvd24nIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnY2hhcicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdrZXlVcCcgfSk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBob3ZlckVsZW1lbnQoaG92ZXJQYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gaG92ZXJQYXJhbXM7XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbW92ZU1vdXNlVG8oTWF0aC5yb3VuZChyZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IpLCBNYXRoLnJvdW5kKHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUikpO1xuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgcmVhbCBgOmhvdmVyYCBzdGF0ZSBoYXMgYWN0dWFsbHkgdGFrZW4sIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoIWVsZW1lbnQubWF0Y2hlcygnOmhvdmVyJykgJiYgRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICBhd2FpdCBzbGVlcChJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbW92ZU1vdXNlKG1vdmVQYXJhbXM6IE1vdmVNb3VzZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIG1vdmVNb3VzZVRvKE1hdGgucm91bmQobW92ZVBhcmFtcy54KSwgTWF0aC5yb3VuZChtb3ZlUGFyYW1zLnkpKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBtb3ZlTW91c2VUbyh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogb2JzaWRpYW4tdHlwaW5ncycgYEVsZWN0cm9uV2ViQ29udGVudHNgIG9taXRzIHRoZSBzdGFibGUgYHNlbmRJbnB1dEV2ZW50YCwgd2hpY2ggaXMgd2hhdCBpbmplY3RzIGEgdHJ1c3RlZCAocmVhbCkgcG9pbnRlciBtb3ZlLlxuICAgIGNvbnN0IHdlYkNvbnRlbnRzID0gd2luZG93LmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKSBhcyB1bmtub3duIGFzIEVsZWN0cm9uV2ViQ29udGVudHNXaXRoU2VuZElucHV0RXZlbnQ7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyB0eXBlOiAnbW91c2VNb3ZlJywgeCwgeSB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVuaG92ZXJFbGVtZW50KHVuaG92ZXJQYXJhbXM6IFVuaG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuICAgIGNvbnN0IE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA9IDE7XG5cbiAgICBjb25zdCB7IGVsZW1lbnQgfSA9IHVuaG92ZXJQYXJhbXM7XG5cbiAgICAvLyBNb3ZlIHRvIGEgcG9pbnQganVzdCBvdXRzaWRlIHRoZSBlbGVtZW50J3MgYm94LlxuICAgIC8vIFdoZW4gZmx1c2ggYWdhaW5zdCB0aGUgdmlld3BvcnQncyBsZWZ0IGVkZ2UsIHVzZSBqdXN0IHBhc3QgdGhlIHJpZ2h0IGVkZ2UuXG4gICAgLy8gQSBmdWxsLXZpZXdwb3J0LXdpZHRoIGVsZW1lbnQgc2hvdWxkIHVzZSBgbW92ZU1vdXNlYCBkaXJlY3RseSBpbnN0ZWFkLlxuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHggPSByZWN0LmxlZnQgPj0gT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTID8gcmVjdC5sZWZ0IC0gT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTIDogcmVjdC5yaWdodCArIE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUztcbiAgICBjb25zdCB5ID0gcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIENFTlRFUl9ESVZJU09SO1xuICAgIG1vdmVNb3VzZVRvKE1hdGgucm91bmQoeCksIE1hdGgucm91bmQoeSkpO1xuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgcmVhbCBgOmhvdmVyYCBzdGF0ZSBoYXMgYWN0dWFsbHkgY2xlYXJlZCwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlIChlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHdhaXRVbnRpbCh3YWl0UGFyYW1zOiBXYWl0VW50aWxQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7XG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzID0gV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBwcmVkaWNhdGUsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgfSA9IHdhaXRQYXJhbXM7XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghKGF3YWl0IHByZWRpY2F0ZSgpKSkge1xuICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPj0gdGltZW91dEluTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1lc3NhZ2UgPT09IHVuZGVmaW5lZCA/ICcnIDogYDogJHttZXNzYWdlfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FpdFVudGlsIHRpbWVkIG91dCBhZnRlciAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHMke3N1ZmZpeH1gKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsZWVwKGludGVydmFsSW5NaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXdCQSxvQ0FBcUM7QUFDckMscUJBQWdDO0FBb0JoQyxlQUFzQiw0QkFBNEIsV0FBOEIsS0FBYSx1QkFBK0M7QUFDMUksUUFBTSxjQUFvQztBQUFBLElBQ3hDO0FBQUEsSUFDQSxHQUFJLDBCQUEwQixVQUFhLEVBQUUsc0JBQXNCO0FBQUEsRUFDckU7QUFDQSxRQUFNLGNBQWMsS0FBSyxVQUFVLDhCQUFlO0FBQ2xELFFBQU0sY0FBYyxNQUFNLFVBQVU7QUFBQSxJQUNsQyxtRUFBbUUsV0FBVztBQUFBLElBQzlFO0FBQUEsRUFDRjtBQUVBLE1BQUksZ0JBQWdCLFFBQVE7QUFDMUI7QUFBQSxFQUNGO0FBRUEsUUFBTSxvQkFBZ0Isb0RBQXFCLG9CQUFvQixFQUFFLFNBQVMsK0JBQWdCLENBQUM7QUFDM0YsUUFBTSxVQUFVLFNBQVMsZUFBZSxXQUFXO0FBQ3JEO0FBZ0JBLFNBQVMsbUJBQW1CLGlCQUE2RTtBQXlFdkcsUUFBTSxnQ0FBZ0M7QUFPdEMsUUFBTSxzQ0FBc0M7QUFPNUMsUUFBTSxnQ0FBZ0M7QUFNdEMsUUFBTSwyQ0FBMkM7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
256
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBIb3ZlckVsZW1lbnRQYXJhbXMsXG4gIE1vdmVNb3VzZVBhcmFtcyxcbiAgUHJlc3NLZXlQYXJhbXMsXG4gIFR5cGVJbnRvRWRpdG9yUGFyYW1zLFxuICBVbmhvdmVyRWxlbWVudFBhcmFtcyxcbiAgV2FpdFVudGlsUGFyYW1zXG59IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZUZ1bmN0aW9uQ2FsbFBhcmFtcyB9IGZyb20gJy4vZ2VuZXJhdGUtZnVuY3Rpb24tY2FsbC5janMnO1xuaW1wb3J0IHR5cGUgeyBMaWJSZXNvbHZlciB9IGZyb20gJy4vbGliLXJlZ2lzdHJ5LmNqcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbCB9IGZyb20gJy4vZ2VuZXJhdGUtZnVuY3Rpb24tY2FsbC5janMnO1xuaW1wb3J0IHtcbiAgZ2V0Qm9vdHN0cmFwVmVyc2lvbixcbiAgZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVyc1xufSBmcm9tICcuL2xpYi1yZWdpc3RyeS5janMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBuYW1lc3BhY2UgaXMgYm9vdHN0cmFwcGVkXG4gKiBpbiB0aGUgT2JzaWRpYW4gcHJvY2VzcyB3aXRoIHRoZSBjdXJyZW50IGxpYnJhcnkgdmVyc2lvbi5cbiAqXG4gKiBQZXJmb3JtcyBhIGxpZ2h0d2VpZ2h0IHZlcnNpb24gY2hlY2sgdmlhIHRoZSB0cmFuc3BvcnQuIElmIHRoZSBuYW1lc3BhY2VcbiAqIGRvZXNuJ3QgZXhpc3Qgb3IgaGFzIGEgZGlmZmVyZW50IHZlcnNpb24sIHNlbmRzIHRoZSBmdWxsIGJvb3RzdHJhcCBleHByZXNzaW9uXG4gKiB0byByZWdpc3RlciBhbGwgaGVscGVyIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCB0byB1c2UgZm9yIGV2YWx1YXRpb24uXG4gKiBAcGFyYW0gY3dkIC0gVGhlIHdvcmtpbmcgZGlyZWN0b3J5ICh2YXVsdCBwYXRoKS5cbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBPcHRpb25hbCBwZXItZXZhbCB0aW1lb3V0LiBGb3J3YXJkZWQgdG8gYm90aFxuICogICB0aGUgdmVyc2lvbiBjaGVjayBhbmQgdGhlIGJvb3RzdHJhcCBldmFsIHNvIGEgaHVuZyBgb2JzaWRpYW4gZXZhbGAgcmVqZWN0c1xuICogICBpbnN0ZWFkIG9mIGJsb2NraW5nIHRoZSBjYWxsZXIgaW5kZWZpbml0ZWx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQsIGN3ZDogc3RyaW5nLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXZhbE9wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zID0ge1xuICAgIGN3ZCxcbiAgICAuLi4odGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgfTtcbiAgY29uc3QgYm9vdHN0cmFwVmVyc2lvbiA9IGdldEJvb3RzdHJhcFZlcnNpb24oKTtcbiAgY29uc3QgdmVyc2lvbkpzb24gPSBKU09OLnN0cmluZ2lmeShib290c3RyYXBWZXJzaW9uKTtcbiAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKGNoZWNrUmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBib290c3RyYXBFeHByID0gZ2VuZXJhdGVGdW5jdGlvbkNhbGwoYm9vdHN0cmFwTmFtZXNwYWNlLCB7XG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwciwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0XG4gICAgICogb3ducyB0aGUgaGFybmVzcyB0ZXN0IHdpbmRvdydzIGxpZmVjeWNsZSB2aWEgRWxlY3Ryb24gKGB3aW5kb3cuZWxlY3Ryb25XaW5kb3dgKSxcbiAgICAgKiB3aGljaCBpcyB0aGUgaGFybmVzcydzIGNvbmNlcm4sIG5vdCBhIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBkZXN0cm95Q3VycmVudFdpbmRvdygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgd29ya3NwYWNlLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZW5zdXJlTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN5bmNlZCB3aXRoIGBvYnNpZGlhbi1kZXYtdXRpbHNgIChtaXJyb3IgYGVycm9yLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZXJyb3JUb1N0cmluZyhlcnJvcjogdW5rbm93bik6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gVGhpc1xuICAgICAqIGlzIHRoZSBoYXJuZXNzJ3Mgb3duIGV2YWwgcGx1bWJpbmcgKGJ1aWxkcyB0aGUgYGxpYmAgYmFnLCByZXNvbHZlcyB0aGVcbiAgICAgKiBtb2R1bGUsIGludm9rZXMgdGhlIGNsb3N1cmUsIGVudmVsb3BlcyB0aGUgcmVzdWx0KSBcdTIwMTQgbWVhbmluZ2xlc3Mgb3V0c2lkZVxuICAgICAqIHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIGV2YWxXcmFwcGVyKG5zUGFyYW1zOiBFdmFsV3JhcHBlclBhcmFtcyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiB0aGUgaGFybmVzcydzIG9uZS10aW1lIGJvb3RzdHJhcCB0aGF0IHJlc29sdmVzIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBmb3JcbiAgICAgKiB0aGUgcHJvY2VzczsgY2xvc3VyZXMgb2J0YWluIGl0IGRpcmVjdGx5IHZpYSB0aGVpciBgb2JzaWRpYW5Nb2R1bGVgIGFyZy5cbiAgICAgKi9cbiAgICBnZXRPYnNpZGlhbk1vZHVsZSgpOiBQcm9taXNlPHVua25vd24+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBSYXdcbiAgICAgKiBFbGVjdHJvbiBJUEMgKGB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmNgKSBpcyBhIGhhcm5lc3MvdHJhbnNwb3J0XG4gICAgICogcHJpbWl0aXZlLCBub3QgYSBnZW5lcmFsLXB1cnBvc2UgaGVscGVyLlxuICAgICAqL1xuICAgIGlwY1NlbmRTeW5jKG5zUGFyYW1zOiBJcGNTZW5kU3luY1BhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzXG4gICAgICogcGFydCBvZiB0aGUgaGFybmVzcydzIHZhdWx0LXBhdGggaGFuZHNoYWtlIHdpdGggdGhlIE5vZGUgc2lkZSwgbm90IGFcbiAgICAgKiBnZW5lcmFsIHV0aWxpdHkuXG4gICAgICovXG4gICAgcG9sbFZhdWx0QmFzZVBhdGgoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IG5pY2hlL3RyaXZpYWwgXHUyMDE0IGFcbiAgICAgKiBvbmUtbGluZSBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIHdyYXBwZXIgdXNlZCBvbmx5IGJ5IHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIHNldExvY2FsU3RvcmFnZUl0ZW0obnNQYXJhbXM6IFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgaW50ZXJmYWNlIEV2YWxXcmFwcGVyUGFyYW1zIHtcbiAgICByZWFkb25seSBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICByZWFkb25seSBjb250ZXh0SWQ/OiBzdHJpbmc7XG4gICAgZm4oZm5BcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHVua25vd247XG4gIH1cblxuICBpbnRlcmZhY2UgRmlsZVN5c3RlbUFkYXB0ZXJMaWtlIHtcbiAgICBnZXRCYXNlUGF0aCgpOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSXBjU2VuZFN5bmNQYXJhbXMge1xuICAgIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgICByZWFkb25seSBjaGFubmVsOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgfVxuXG4gIGludGVyZmFjZSBFbGVjdHJvbldlYkNvbnRlbnRzV2l0aFNlbmRJbnB1dEV2ZW50IHtcbiAgICBzZW5kSW5wdXRFdmVudChpbnB1dEV2ZW50OiBTZW5kSW5wdXRFdmVudEtleWJvYXJkSW5wdXQgfCBTZW5kSW5wdXRFdmVudE1vdXNlSW5wdXQpOiB2b2lkO1xuICB9XG5cbiAgaW50ZXJmYWNlIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtIHtcbiAgICBQbGF0Zm9ybTogT2JzaWRpYW5QbGF0Zm9ybTtcbiAgfVxuXG4gIGludGVyZmFjZSBPYnNpZGlhblBsYXRmb3JtIHtcbiAgICBpc01hY09TOiBib29sZWFuO1xuICB9XG5cbiAgaW50ZXJmYWNlIFNlbmRJbnB1dEV2ZW50S2V5Ym9hcmRJbnB1dCB7XG4gICAga2V5Q29kZTogc3RyaW5nO1xuICAgIG1vZGlmaWVycz86IHN0cmluZ1tdO1xuICAgIHR5cGU6ICdjaGFyJyB8ICdrZXlEb3duJyB8ICdrZXlVcCc7XG4gIH1cblxuICBpbnRlcmZhY2UgU2VuZElucHV0RXZlbnRNb3VzZUlucHV0IHtcbiAgICB0eXBlOiAnbW91c2VNb3ZlJztcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGF5IChpbiBtcykgYmVmb3JlIGludm9raW5nIGBlbGVjdHJvbldpbmRvdy5kZXN0cm95KClgIHNvIHRoZSBldmFsIHRoYXRcbiAgICogdHJpZ2dlcmVkIHRoZSBjYWxsIGhhcyB0aW1lIHRvIHJldHVybiBpdHMgcmVzdWx0IHRvIHRoZSBjYWxsZXIuIFdpdGhvdXRcbiAgICogaXQgdGhlIHJlbmRlcmVyIGRpZXMgYmVmb3JlIHRoZSBJUEMgcmVwbHkgc2hpcHMsIHRoZSBjYWxsZXIgd2FpdHMgZm9yIHRoZVxuICAgKiBmdWxsIGV2YWwgdGltZW91dCwgYW5kIHN0YWxlIGBCcm93c2VyV2luZG93YCBlbnRyaWVzIHBpbGUgdXAuXG4gICAqL1xuICBjb25zdCBERVNUUk9ZX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBJbnRlcnZhbCAoaW4gbXMpIGJldHdlZW4gcG9sbHMgd2hpbGUgd2FpdGluZyBmb3IgYSB0cnVzdGVkIGlucHV0IGV2ZW50IHRvXG4gICAqIHRha2UgZWZmZWN0ICh0aGUgZWRpdG9yIGRvY3VtZW50IHVwZGF0ZXMsIG9yIGFuIGVsZW1lbnQncyBgOmhvdmVyYCBzdGF0ZVxuICAgKiBmbGlwcykuIFNoYXJlZCBieSBldmVyeSB0cnVzdGVkLWlucHV0IGhlbHBlci5cbiAgICovXG4gIGNvbnN0IElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTA7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdGltZSAoaW4gbXMpIHRvIHdhaXQgZm9yIGEgdHJ1c3RlZCBpbnB1dCBldmVudCB0byB0YWtlIGVmZmVjdFxuICAgKiBiZWZvcmUgZ2l2aW5nIHVwICh0aGUgZXhwZWN0ZWQgb3V0Y29tZSB3aGVuIHRoZSBpbnB1dCBpcyByZWplY3RlZCBcdTIwMTQgZS5nLiBhXG4gICAqIHJlYWQtb25seSBlZGl0b3IsIG9yIGEgcG9pbnRlciBtb3ZlIHRoYXQgbmV2ZXIgbGFuZHMgb24gdGhlIGVsZW1lbnQpLlxuICAgKi9cbiAgY29uc3QgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGludGVydmFsIChpbiBtcykgYmV0d2VlbiB7QGxpbmsgd2FpdFVudGlsfSBwcmVkaWNhdGUgY2hlY2tzIHdoZW4gdGhlXG4gICAqIGNhbGxlciBkb2VzIG5vdCBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFdBSVRfVU5USUxfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgKGluIG1zKSB7QGxpbmsgd2FpdFVudGlsfSB3YWl0cyBmb3IgaXRzIHByZWRpY2F0ZSB0b1xuICAgKiBiZWNvbWUgdHJ1dGh5IGJlZm9yZSByZWplY3RpbmcsIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdCBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggdXNlZCBieSB7QGxpbmsgZXJyb3JUb1N0cmluZ30ncyBuZXN0ZWQtZXJyb3Igc2VwYXJhdG9yIGxpbmVzLCBtYXRjaGluZ1xuICAgKiB0aGUgYCAgICBhdGAgcHJlZml4IG9mIGEgVjggc3RhY2stdHJhY2UgZnJhbWUgc28gdGhlIHNlcGFyYXRvcnMgYmxlbmQgaW50b1xuICAgKiB0aGUgc3Vycm91bmRpbmcgc3RhY2suIEtlcHQgaWRlbnRpY2FsIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgJyBgZXJyb3JUb1N0cmluZ2AuXG4gICAqL1xuICBjb25zdCBTVEFDS19UUkFDRV9QUkVGSVggPSAnICAgIGF0JztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gQXBwcm92ZWQgZG91YmxlIGNhc3Q6IGBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpcyBvdXIgaW50ZXJuYWwgV2luZG93IGF1Z21lbnRhdGlvbiwgaW50ZW50aW9uYWxseSBrZXB0IGxvY2FsIChub3QgZGVjbGFyZWQgZ2xvYmFsbHkpIHRvIGF2b2lkIGxlYWtpbmcgaW50byBjb25zdW1lciB0eXBlcy5cbiAgY29uc3QgaG9sZGVyID0gd2luZG93IGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+O1xuICBjb25zdCBleGlzdGluZ0NvbnRleHRzID0gaG9sZGVyLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LmNvbnRleHRzID8/IHt9O1xuICBjb25zdCBleGlzdGluZ09ic2lkaWFuTW9kdWxlID0gaG9sZGVyLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/Lm9ic2lkaWFuTW9kdWxlO1xuXG4gIGNvbnN0IG5zOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UgPSB7XG4gICAgZ2V0IGFwcCgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBgYXBwYCBnZXR0ZXIgcmVhZHMgYHdpbmRvdy5hcHBgIHdoaWNoIGlzIHNldCBieSBPYnNpZGlhbi5cbiAgICAgIHJldHVybiB3aW5kb3cuYXBwO1xuICAgIH0sXG5cbiAgICBjb250ZXh0czogZXhpc3RpbmdDb250ZXh0cyxcblxuICAgIGFzeW5jIGRlc3Ryb3lDdXJyZW50V2luZG93KHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgYXdhaXQgc2xlZXAoMCk7XG4gICAgICBjb25zdCBlbGVjdHJvbldpbmRvdyA9IHdpbmRvdy5lbGVjdHJvbldpbmRvdztcbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpO1xuICAgICAgfSwgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBlbnN1cmVMYXlvdXRSZWFkeSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KHJlc29sdmUpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGVycm9yVG9TdHJpbmcodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3IpO1xuICAgIH0sXG5cbiAgICBhc3luYyBldmFsV3JhcHBlcih0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBpZiAoIXRoaXMuYXBwLnBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvYnNpZGlhbk1vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0T2JzaWRpYW5Nb2R1bGUoKTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBwYXJhbXMuY29udGV4dElkXG4gICAgICAgID8gKHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF0gPz89IHt9KVxuICAgICAgICA6IHt9O1xuICAgICAgLy8gVGhlIGluamVjdGVkIGBsaWJgIGJhZzogYmFzZSBoZWxwZXJzIGZyb20gdGhlIGhhcm5lc3MsIHRoZW4gcHJvdmlkZXJzIG9uIHRvcC5cbiAgICAgIC8vIFJlc29sdmVycyBydW4gaW4tcmVuZGVyZXIgKHRoZXkgcmVhZCByZW5kZXJlciBnbG9iYWxzIGEgcHJvdmlkZXIgcHVibGlzaGVkKS5cbiAgICAgIC8vIFJlYnVpbGRpbmcgcGVyIGV2YWwga2VlcHMgYGxpYmAgZnJlc2ggYW5kIHRvbGVyYW50IG9mIGEgbGF0ZS1sb2FkZWQgcHJvdmlkZXIuXG4gICAgICBjb25zdCBsaWIgPSB7IGhvdmVyRWxlbWVudCwgbW92ZU1vdXNlLCBwcmVzc0tleSwgdHlwZUludG9FZGl0b3IsIHVuaG92ZXJFbGVtZW50LCB3YWl0VW50aWwgfTtcbiAgICAgIGZvciAoY29uc3QgcmVzb2x2ZUxpYiBvZiB0aGlzLmxpYlJlc29sdmVycykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGxpYiwgcmVzb2x2ZUxpYigpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZ1bGxBcmdzID0geyAuLi5wYXJhbXMuYXJncywgYXBwOiB0aGlzLmFwcCwgY29udGV4dCwgbGliLCBvYnNpZGlhbk1vZHVsZSB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFyYW1zLmZuKGZ1bGxBcmdzKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3VuZGVmaW5lZCcgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHJlc3VsdCB9KTtcbiAgICAgIH0gY2F0Y2ggKGV2YWxFcnJvcikge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXJyb3InLCB2YWx1ZTogdGhpcy5lcnJvclRvU3RyaW5nKGV2YWxFcnJvcikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9ic2lkaWFuTW9kdWxlKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgaWYgKHRoaXMub2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5Nb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICAgIGNvbnN0IHJhbmRvbVN1ZmZpeCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgICBjb25zdCB0ZW1wTW9kdWxlTmFtZSA9IGBnZXQtb2JzaWRpYW4tbW9kdWxlLSR7cmFuZG9tU3VmZml4fWA7XG4gICAgICBjb25zdCBkaXIgPSBgJHt0aGlzLmFwcC52YXVsdC5jb25maWdEaXJ9L3BsdWdpbnMvJHt0ZW1wTW9kdWxlTmFtZX1gO1xuICAgICAgdGhpcy5hcHAucGx1Z2lucy5tYW5pZmVzdHNbdGVtcE1vZHVsZU5hbWVdID0ge1xuICAgICAgICBhdXRob3I6ICcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIGRpcixcbiAgICAgICAgaWQ6IHRlbXBNb2R1bGVOYW1lLFxuICAgICAgICBpc0Rlc2t0b3BPbmx5OiBmYWxzZSxcbiAgICAgICAgbWluQXBwVmVyc2lvbjogJycsXG4gICAgICAgIG5hbWU6IHRlbXBNb2R1bGVOYW1lLFxuICAgICAgICB2ZXJzaW9uOiAnJ1xuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoZGlyKTtcblxuICAgICAgY29uc3QgcGx1Z2luRm5Cb2R5ID0gJ2NvbnN0IHI9cmVxdWlyZSxlPWV4cG9ydHM7Y29uc3QgbT1yKFxcJ29ic2lkaWFuXFwnKTt3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5vYnNpZGlhbk1vZHVsZT1tO2UuZGVmYXVsdD1tLlBsdWdpbjsnO1xuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci53cml0ZShgJHtkaXJ9L21haW4uanNgLCBwbHVnaW5GbkJvZHkpO1xuXG4gICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLmxvYWRQbHVnaW4odGVtcE1vZHVsZU5hbWUpO1xuICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4odGVtcE1vZHVsZU5hbWUpO1xuXG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBvYnNpZGlhbiBtb2R1bGUnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaXBjU2VuZFN5bmModGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhwYXJhbXMuY2hhbm5lbCwgLi4ucGFyYW1zLmFyZ3MpO1xuICAgIH0sXG5cbiAgICBsaWJSZXNvbHZlcnM6IGJvb3RzdHJhcFBhcmFtcy5saWJSZXNvbHZlcnMsXG5cbiAgICBvYnNpZGlhbk1vZHVsZTogZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSxcblxuICAgIGFzeW5jIHBvbGxWYXVsdEJhc2VQYXRoKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBEYXRhQWRhcHRlciBpcyBhY3R1YWxseSBGaWxlU3lzdGVtQWRhcHRlciBhdCBydW50aW1lIG9uIGRlc2t0b3AuXG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoKHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgYXMgdW5rbm93biBhcyBGaWxlU3lzdGVtQWRhcHRlckxpa2UpLmdldEJhc2VQYXRoKCkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBzZXRMb2NhbFN0b3JhZ2VJdGVtKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShwYXJhbXMua2V5LCBwYXJhbXMudmFsdWUpO1xuICAgIH0sXG5cbiAgICB2ZXJzaW9uOiBib290c3RyYXBQYXJhbXMudmVyc2lvblxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICAod2luZG93IGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+KS5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nID0gbnM7XG5cbiAgYXN5bmMgZnVuY3Rpb24gdHlwZUludG9FZGl0b3IodHlwZVBhcmFtczogVHlwZUludG9FZGl0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuXG4gICAgY29uc3QgeyBlZGl0b3IsIHRleHQgfSA9IHR5cGVQYXJhbXM7XG4gICAgY29uc3QgdmFsdWVCZWZvcmVUeXBpbmcgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcblxuICAgIC8vIEZvY3VzIHRoZSBlZGl0b3IgYW5kIHBsYWNlIHRoZSBjYXJldCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICBlZGl0b3IuZm9jdXMoKTtcbiAgICBjb25zdCBsYXN0TGluZSA9IGVkaXRvci5sYXN0TGluZSgpO1xuICAgIGVkaXRvci5zZXRDdXJzb3IobGFzdExpbmUsIGVkaXRvci5nZXRMaW5lKGxhc3RMaW5lKS5sZW5ndGgpO1xuXG4gICAgLy8gTGV0IGFueSBmb2N1cyB0cmFwIChhIGBzZXRUaW1lb3V0KDApYCByZS1mb2N1cykgZmlyZSBiZWZvcmUgdHlwaW5nLCBzbyBzdG9sZW4gZm9jdXMgaXMgZGV0ZWN0ZWQuXG4gICAgYXdhaXQgc2xlZXAoRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAvLyBUeXBpbmcgaXMgcHJlc3NpbmcgZWFjaCBjaGFyYWN0ZXIga2V5IGluIHR1cm46IGBwcmVzc0tleWAgaW5qZWN0cyB0aGUgc2FtZSB0cnVzdGVkXG4gICAgLy8gYGtleURvd25gIC0+IGBjaGFyYCAtPiBga2V5VXBgIGEgcmVhbCB1c2VyIHByb2R1Y2VzIFx1MjAxNCB0ZXh0IGxhbmRzIG9ubHkgaWYgdGhlIGVkaXRvciBob2xkcyBmb2N1cy5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgdGV4dCkge1xuICAgICAgcHJlc3NLZXkoeyBrZXk6IGNoYXIgfSk7XG4gICAgfVxuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgZG9jdW1lbnQgcmVmbGVjdHMgdGhlIGlucHV0IG9yIHRoZSB0aW1lb3V0IGVsYXBzZXMsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWRpdG9yLmdldFZhbHVlKCkgPT09IHZhbHVlQmVmb3JlVHlwaW5nICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXNzS2V5KHByZXNzUGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHsga2V5LCBtb2RpZmllcnMgPSBbXSB9ID0gcHJlc3NQYXJhbXM7XG5cbiAgICAvLyAnTW9kJyBpcyBPYnNpZGlhbidzIHBsYXRmb3JtLWFnbm9zdGljIG1vZGlmaWVyOiBDbWQgKG1ldGEpIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZS5cbiAgICAvLyBSZWFkaW5nIGBQbGF0Zm9ybS5pc01hY09TYCBvZmYgdGhlIHJlc29sdmVkIG9ic2lkaWFuIG1vZHVsZSBpcyBzYWZlIGhlcmU6XG4gICAgLy8gYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdCBtb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayAoYW5kIHRodXMgYHByZXNzS2V5YCkgY2FuIHJ1bi5cbiAgICBjb25zdCBpc01hY09TID0gKG5zLm9ic2lkaWFuTW9kdWxlIGFzIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtKS5QbGF0Zm9ybS5pc01hY09TO1xuXG4gICAgLy8gTWFwIE9ic2lkaWFuJ3MgYE1vZGlmaWVyYCBuYW1lcyB0byBFbGVjdHJvbidzIGxvd2VyY2FzZSBgc2VuZElucHV0RXZlbnRgIG1vZGlmaWVyIG5hbWVzLlxuICAgIC8vIE5hbWVzICdNZXRhJywgJ0FsdCcsICdTaGlmdCcgbG93ZXJjYXNlIGRpcmVjdGx5OyAnQ3RybCcgLT4gJ2NvbnRyb2wnOyAnTW9kJyByZXNvbHZlcyBwZXItcGxhdGZvcm0uXG4gICAgY29uc3QgZWxlY3Ryb25Nb2RpZmllcnMgPSBtb2RpZmllcnMubWFwKChtb2RpZmllcik6IHN0cmluZyA9PiB7XG4gICAgICBpZiAobW9kaWZpZXIgPT09ICdNb2QnKSB7XG4gICAgICAgIHJldHVybiBpc01hY09TID8gJ21ldGEnIDogJ2NvbnRyb2wnO1xuICAgICAgfVxuICAgICAgaWYgKG1vZGlmaWVyID09PSAnQ3RybCcpIHtcbiAgICAgICAgcmV0dXJuICdjb250cm9sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBtb2RpZmllci50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBvYnNpZGlhbi10eXBpbmdzJyBgRWxlY3Ryb25XZWJDb250ZW50c2Agb21pdHMgdGhlIHN0YWJsZSBgc2VuZElucHV0RXZlbnRgLCB3aGljaCBpcyB3aGF0IGluamVjdHMgYSB0cnVzdGVkIChyZWFsKSBrZXkgcHJlc3MuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpIGFzIHVua25vd24gYXMgRWxlY3Ryb25XZWJDb250ZW50c1dpdGhTZW5kSW5wdXRFdmVudDtcblxuICAgIC8vIEEgdHJ1c3RlZCBrZXkgcHJlc3MgaXMga2V5RG93biAtPiBjaGFyIC0+IGtleVVwOiBrZXlEb3duIGZpcmVzIGBrZXlkb3duYCwgY2hhciBmaXJlc1xuICAgIC8vIGBrZXlwcmVzc2AvYGJlZm9yZWlucHV0YC9gaW5wdXRgLCBrZXlVcCBmaXJlcyBga2V5dXBgIFx1MjAxNCB0aGUgZnVsbCByZWFsIGtleSBwaXBlbGluZS5cbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleURvd24nIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnY2hhcicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdrZXlVcCcgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBob3ZlckVsZW1lbnQoaG92ZXJQYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gaG92ZXJQYXJhbXM7XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbW92ZU1vdXNlKHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIENFTlRFUl9ESVZJU09SLCB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1IgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSB0YWtlbiwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3ZlTW91c2UobW92ZVBhcmFtczogTW92ZU1vdXNlUGFyYW1zKTogdm9pZCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBvYnNpZGlhbi10eXBpbmdzJyBgRWxlY3Ryb25XZWJDb250ZW50c2Agb21pdHMgdGhlIHN0YWJsZSBgc2VuZElucHV0RXZlbnRgLCB3aGljaCBpcyB3aGF0IGluamVjdHMgYSB0cnVzdGVkIChyZWFsKSBwb2ludGVyIG1vdmUuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpIGFzIHVua25vd24gYXMgRWxlY3Ryb25XZWJDb250ZW50c1dpdGhTZW5kSW5wdXRFdmVudDtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IHR5cGU6ICdtb3VzZU1vdmUnLCB4OiBNYXRoLnJvdW5kKG1vdmVQYXJhbXMueCksIHk6IE1hdGgucm91bmQobW92ZVBhcmFtcy55KSB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVuaG92ZXJFbGVtZW50KHVuaG92ZXJQYXJhbXM6IFVuaG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuICAgIGNvbnN0IE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA9IDE7XG5cbiAgICBjb25zdCB7IGVsZW1lbnQgfSA9IHVuaG92ZXJQYXJhbXM7XG5cbiAgICAvLyBNb3ZlIHRvIGEgcG9pbnQganVzdCBvdXRzaWRlIHRoZSBlbGVtZW50J3MgYm94LlxuICAgIC8vIFdoZW4gZmx1c2ggYWdhaW5zdCB0aGUgdmlld3BvcnQncyBsZWZ0IGVkZ2UsIHVzZSBqdXN0IHBhc3QgdGhlIHJpZ2h0IGVkZ2UuXG4gICAgLy8gQSBmdWxsLXZpZXdwb3J0LXdpZHRoIGVsZW1lbnQgc2hvdWxkIHVzZSBgbW92ZU1vdXNlYCBkaXJlY3RseSBpbnN0ZWFkLlxuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHggPSByZWN0LmxlZnQgPj0gT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTID8gcmVjdC5sZWZ0IC0gT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTIDogcmVjdC5yaWdodCArIE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUztcbiAgICBjb25zdCB5ID0gcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIENFTlRFUl9ESVZJU09SO1xuICAgIG1vdmVNb3VzZSh7IHgsIHkgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSBjbGVhcmVkLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKGVsZW1lbnQubWF0Y2hlcygnOmhvdmVyJykgJiYgRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICBhd2FpdCBzbGVlcChJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd2FpdFVudGlsKHdhaXRQYXJhbXM6IFdhaXRVbnRpbFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHByZWRpY2F0ZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9ID0gd2FpdFBhcmFtcztcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCEoYXdhaXQgcHJlZGljYXRlKCkpKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSB0aW1lb3V0SW5NaWxsaXNlY29uZHMpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gbWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiBgOiAke21lc3NhZ2V9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YWl0VW50aWwgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kcyR7c3VmZml4fWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2xlZXAoaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgbWVzc2FnZSA9IGVycm9yLnN0YWNrID8/IGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICBpZiAoZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGVycm9yLmNhdXNlLCAnQ2F1c2VkIGJ5OicpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgICAgY29uc3QgYWdncmVnYXRlZEVycm9yczogcmVhZG9ubHkgdW5rbm93bltdID0gZXJyb3IuZXJyb3JzO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGFnZ3JlZ2F0ZWRFcnJvcl0gb2YgYWdncmVnYXRlZEVycm9ycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGFnZ3JlZ2F0ZWRFcnJvciwgYEFnZ3JlZ2F0ZWQgZXJyb3IgIyR7U3RyaW5nKGluZGV4ICsgMSl9OmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2U6IHN0cmluZywgbmVzdGVkRXJyb3I6IHVua25vd24sIHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSBgJHttZXNzYWdlfVxcbiR7Z2VuZXJhdGVTdGFja1RyYWNlTGluZSh0aXRsZSl9YDtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZXJyb3JUb1N0cmluZ0ltcGwobmVzdGVkRXJyb3IpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgaWYgKCFsaW5lLnRyaW0oKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBsaW5lLnN0YXJ0c1dpdGgoU1RBQ0tfVFJBQ0VfUFJFRklYKVxuICAgICAgICA/IGBcXG4ke2xpbmV9YFxuICAgICAgICA6IGBcXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUobGluZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1NUQUNLX1RSQUNFX1BSRUZJWH0gLS0tICR7dGl0bGV9IC0tLSAoMClgO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBeUJBLG9DQUFxQztBQUNyQywwQkFHTztBQXFCUCxlQUFzQiw0QkFBNEIsV0FBOEIsS0FBYSx1QkFBK0M7QUFDMUksUUFBTSxjQUFvQztBQUFBLElBQ3hDO0FBQUEsSUFDQSxHQUFJLDBCQUEwQixVQUFhLEVBQUUsc0JBQXNCO0FBQUEsRUFDckU7QUFDQSxRQUFNLHVCQUFtQix5Q0FBb0I7QUFDN0MsUUFBTSxjQUFjLEtBQUssVUFBVSxnQkFBZ0I7QUFDbkQsUUFBTSxjQUFjLE1BQU0sVUFBVTtBQUFBLElBQ2xDLG1FQUFtRSxXQUFXO0FBQUEsSUFDOUU7QUFBQSxFQUNGO0FBRUEsTUFBSSxnQkFBZ0IsUUFBUTtBQUMxQjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLG9CQUFnQixvREFBcUIsb0JBQW9CO0FBQUEsSUFDN0QsY0FBYyxDQUFDLE9BQUcsK0NBQTBCLENBQUM7QUFBQSxJQUM3QyxTQUFTO0FBQUEsRUFDWCxDQUFDO0FBQ0QsUUFBTSxVQUFVLFNBQVMsZUFBZSxXQUFXO0FBQ3JEO0FBZ0JBLFNBQVMsbUJBQW1CLGlCQUE2RTtBQTJIdkcsUUFBTSxnQ0FBZ0M7QUFPdEMsUUFBTSxzQ0FBc0M7QUFPNUMsUUFBTSxnQ0FBZ0M7QUFNdEMsUUFBTSwyQ0FBMkM7QUFNakQsUUFBTSxxQ0FBcUM7QUFPM0MsUUFBTSxxQkFBcUI7QUFHM0IsUUFBTSxTQUFTO0FBQ2YsUUFBTSxtQkFBbUIsT0FBTyw4QkFBOEIsWUFBWSxDQUFDO0FBQzNFLFFBQU0seUJBQXlCLE9BQU8sOEJBQThCO0FBRXBFLFFBQU0sS0FBa0M7QUFBQSxJQUN0QyxJQUFJLE1BQU07QUFF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
@@ -14,4 +14,4 @@ var __copyProps = (to, from, except, desc) => {
14
14
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
15
  var obsidian_namespace_exports = {};
16
16
  module.exports = __toCommonJS(obsidian_namespace_exports);
17
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLW5hbWVzcGFjZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFR5cGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZVxuICogdXNlZCBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuIEFsbCBsaWJyYXJ5IHN0YXRlIGFuZCByZWdpc3RlcmVkIGhlbHBlclxuICogZnVuY3Rpb25zIGxpdmUgdW5kZXIgdGhpcyBzaW5nbGUgbmFtZXNwYWNlIHRvIGF2b2lkIHBvbGx1dGluZyBgd2luZG93YC5cbiAqL1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSByZWdpc3RlcmVkIGBldmFsV3JhcHBlcmAgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZhbFdyYXBwZXJOYW1lc3BhY2VQYXJhbXMge1xuICAvKiogVXNlci1zdXBwbGllZCBhcmd1bWVudHMgdG8gcGFzcyB0byBgZm5gLiAqL1xuICByZWFkb25seSBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIE9wdGlvbmFsIGNvbnRleHQgSUQgZm9yIHBlcnNpc3RlbnQgc3RvcmFnZS4gKi9cbiAgcmVhZG9ubHkgY29udGV4dElkPzogc3RyaW5nO1xuICAvKiogVGhlIHVzZXIgZnVuY3Rpb24gdG8gZXZhbHVhdGUuICovXG4gIGZuKGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgT2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UuaXBjU2VuZFN5bmN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElwY1NlbmRTeW5jTmFtZXNwYWNlUGFyYW1zIHtcbiAgLyoqIFRoZSBJUEMgYXJndW1lbnRzLiAqL1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIC8qKiBUaGUgSVBDIGNoYW5uZWwgbmFtZS4gKi9cbiAgcmVhZG9ubHkgY2hhbm5lbDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhvbGRlciBpbnRlcmZhY2UgZm9yIHR5cGUtc2FmZSBhY2Nlc3MgdG8gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYC5cbiAqIFVzZSB3aXRoIGBQYXJ0aWFsPE9ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPmAgdG8gc2FmZWx5IGNoZWNrIGV4aXN0ZW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gIF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc6IE9ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlO1xufVxuXG4vKipcbiAqIFRoZSBuYW1lc3BhY2Ugb2JqZWN0IHN0b3JlZCBvbiBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgXG4gKiBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuIFJlZ2lzdGVyZWQgb25jZSB2aWEge0BsaW5rIGJvb3RzdHJhcE5hbWVzcGFjZX1cbiAqIGFuZCByZXVzZWQgYWNyb3NzIGFsbCBzdWJzZXF1ZW50IGBldmFsSW5PYnNpZGlhbmAgY2FsbHMuXG4gKlxuICogQWxsIGZ1bmN0aW9ucyBhY2Nlc3MgYHdpbmRvdy5hcHBgIGRpcmVjdGx5IFx1MjAxNCBjYWxsZXJzIGRvIG5vdCBuZWVkIHRvIHBhc3MgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2Uge1xuICAvKipcbiAgICogUGVyc2lzdGVudCBjb250ZXh0IG9iamVjdHMga2V5ZWQgYnkge0BsaW5rIENvbnRleHRJZH0gc3RyaW5nLlxuICAgKiBQcmVzZXJ2ZWQgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSBjb250ZXh0IHJlZmVyZW5jZXMgc3Vydml2ZS5cbiAgICovXG4gIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBjdXJyZW50IEVsZWN0cm9uIHdpbmRvdy5cbiAgICovXG4gIGRlc3Ryb3lDdXJyZW50V2luZG93KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgT2JzaWRpYW4gd29ya3NwYWNlIGxheW91dCB0byBiZSByZWFkeS5cbiAgICovXG4gIGVuc3VyZUxheW91dFJlYWR5KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSB0b3AtbGV2ZWwgd3JhcHBlciB0aGF0IHNldHMgdXAgY29udGV4dCwgcmVzb2x2ZXMgdGhlIG9ic2lkaWFuIG1vZHVsZSxcbiAgICogY2FsbHMgdGhlIHVzZXIncyBmdW5jdGlvbiwgYW5kIHJldHVybnMgYSBKU09OIGVudmVsb3BlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBpbmNsdWRpbmcgdGhlIHVzZXIncyBmdW5jdGlvbiwgYXJncywgYW5kIGNvbnRleHQgSUQuXG4gICAqIEByZXR1cm5zIEEgSlNPTi1zdHJpbmdpZmllZCByZXN1bHQgZW52ZWxvcGUuXG4gICAqL1xuICBldmFsV3JhcHBlcihwYXJhbXM6IEV2YWxXcmFwcGVyTmFtZXNwYWNlUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgYG9ic2lkaWFuYCBtb2R1bGUgYXQgcnVudGltZSBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBgb2JzaWRpYW5gIG1vZHVsZS5cbiAgICovXG4gIGdldE9ic2lkaWFuTW9kdWxlKCk6IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFNlbmRzIGFuIElQQyBtZXNzYWdlIHN5bmNocm9ub3VzbHkgdmlhIEVsZWN0cm9uJ3MgYGlwY1JlbmRlcmVyYC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBJUEMgY2hhbm5lbCBhbmQgYXJndW1lbnRzLlxuICAgKi9cbiAgaXBjU2VuZFN5bmMocGFyYW1zOiBJcGNTZW5kU3luY05hbWVzcGFjZVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIENhY2hlZCBgb2JzaWRpYW5gIG1vZHVsZSwgc2V0IGJ5IHtAbGluayBnZXRPYnNpZGlhbk1vZHVsZX0gb24gZmlyc3QgcmVzb2x1dGlvbi5cbiAgICovXG4gIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmF1bHQncyBiYXNlIHBhdGggYXMgYSBKU09OLWVuY29kZWQgc3RyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgSlNPTi1lbmNvZGVkIGJhc2UgcGF0aC5cbiAgICovXG4gIHBvbGxWYXVsdEJhc2VQYXRoKCk6IFByb21pc2U8c3RyaW5nPjtcblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhbiBlcnJvciBpbnRvIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIHdpdGggc3RhY2sgdHJhY2UgYW5kIGNhdXNlIGNoYWluLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gc2VyaWFsaXplLlxuICAgKiBAcGFyYW0gZGVwdGggLSBUaGUgY3VycmVudCBuZXN0aW5nIGRlcHRoLlxuICAgKiBAcmV0dXJucyBBIGZvcm1hdHRlZCBlcnJvciBzdHJpbmcuXG4gICAqL1xuICBzZXJpYWxpemVFcnJvcihlcnJvcjogdW5rbm93biwgZGVwdGg/OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNldHMgYSBgbG9jYWxTdG9yYWdlYCBpdGVtLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGtleSBhbmQgdmFsdWUgdG8gc2V0LlxuICAgKi9cbiAgc2V0TG9jYWxTdG9yYWdlSXRlbShwYXJhbXM6IFNldExvY2FsU3RvcmFnZUl0ZW1OYW1lc3BhY2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgbGlicmFyeSB2ZXJzaW9uIHRoYXQgd2FzIHVzZWQgdG8gYm9vdHN0cmFwIHRoaXMgbmFtZXNwYWNlLlxuICAgKiBVc2VkIHRvIGRldGVjdCB2ZXJzaW9uIG1pc21hdGNoZXMgYW5kIHJlLWluaXRpYWxpemUuXG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIE9ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLnNldExvY2FsU3RvcmFnZUl0ZW19LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldExvY2FsU3RvcmFnZUl0ZW1OYW1lc3BhY2VQYXJhbXMge1xuICAvKiogVGhlIGxvY2FsU3RvcmFnZSBrZXkuICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAvKiogVGhlIGxvY2FsU3RvcmFnZSB2YWx1ZS4gKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTsiLAogICJuYW1lcyI6IFtdCn0K
17
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLW5hbWVzcGFjZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFR5cGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZVxuICogdXNlZCBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuIEFsbCBsaWJyYXJ5IHN0YXRlIGFuZCByZWdpc3RlcmVkIGhlbHBlclxuICogZnVuY3Rpb25zIGxpdmUgdW5kZXIgdGhpcyBzaW5nbGUgbmFtZXNwYWNlIHRvIGF2b2lkIHBvbGx1dGluZyBgd2luZG93YC5cbiAqL1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSByZWdpc3RlcmVkIGBldmFsV3JhcHBlcmAgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZhbFdyYXBwZXJOYW1lc3BhY2VQYXJhbXMge1xuICAvKiogVXNlci1zdXBwbGllZCBhcmd1bWVudHMgdG8gcGFzcyB0byBgZm5gLiAqL1xuICByZWFkb25seSBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIE9wdGlvbmFsIGNvbnRleHQgSUQgZm9yIHBlcnNpc3RlbnQgc3RvcmFnZS4gKi9cbiAgcmVhZG9ubHkgY29udGV4dElkPzogc3RyaW5nO1xuICAvKiogVGhlIHVzZXIgZnVuY3Rpb24gdG8gZXZhbHVhdGUuICovXG4gIGZuKGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgT2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UuaXBjU2VuZFN5bmN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElwY1NlbmRTeW5jTmFtZXNwYWNlUGFyYW1zIHtcbiAgLyoqIFRoZSBJUEMgYXJndW1lbnRzLiAqL1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIC8qKiBUaGUgSVBDIGNoYW5uZWwgbmFtZS4gKi9cbiAgcmVhZG9ubHkgY2hhbm5lbDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhvbGRlciBpbnRlcmZhY2UgZm9yIHR5cGUtc2FmZSBhY2Nlc3MgdG8gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYC5cbiAqIFVzZSB3aXRoIGBQYXJ0aWFsPE9ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPmAgdG8gc2FmZWx5IGNoZWNrIGV4aXN0ZW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gIF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc6IE9ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlO1xufVxuXG4vKipcbiAqIFRoZSBuYW1lc3BhY2Ugb2JqZWN0IHN0b3JlZCBvbiBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgXG4gKiBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuIFJlZ2lzdGVyZWQgb25jZSB2aWEge0BsaW5rIGJvb3RzdHJhcE5hbWVzcGFjZX1cbiAqIGFuZCByZXVzZWQgYWNyb3NzIGFsbCBzdWJzZXF1ZW50IGBldmFsSW5PYnNpZGlhbmAgY2FsbHMuXG4gKlxuICogQWxsIGZ1bmN0aW9ucyBhY2Nlc3MgYHdpbmRvdy5hcHBgIGRpcmVjdGx5IFx1MjAxNCBjYWxsZXJzIGRvIG5vdCBuZWVkIHRvIHBhc3MgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2Uge1xuICAvKipcbiAgICogUGVyc2lzdGVudCBjb250ZXh0IG9iamVjdHMga2V5ZWQgYnkge0BsaW5rIENvbnRleHRJZH0gc3RyaW5nLlxuICAgKiBQcmVzZXJ2ZWQgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSBjb250ZXh0IHJlZmVyZW5jZXMgc3Vydml2ZS5cbiAgICovXG4gIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBjdXJyZW50IEVsZWN0cm9uIHdpbmRvdy5cbiAgICovXG4gIGRlc3Ryb3lDdXJyZW50V2luZG93KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgT2JzaWRpYW4gd29ya3NwYWNlIGxheW91dCB0byBiZSByZWFkeS5cbiAgICovXG4gIGVuc3VyZUxheW91dFJlYWR5KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIGVycm9yIGludG8gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgd2l0aCBpdHMgZnVsbCBzdGFjayB0cmFjZSxcbiAgICogcmVjdXJzaXZlIGBjYXVzZWAgY2hhaW4sIGFuZCB0aGUgYWdncmVnYXRlZCBlcnJvcnMgb2YgYW4gYEFnZ3JlZ2F0ZUVycm9yYC5cbiAgICpcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIGNvbnZlcnQgdG8gYSBzdHJpbmcuXG4gICAqIEByZXR1cm5zIEEgZm9ybWF0dGVkIGVycm9yIHN0cmluZy5cbiAgICovXG4gIGVycm9yVG9TdHJpbmcoZXJyb3I6IHVua25vd24pOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0b3AtbGV2ZWwgd3JhcHBlciB0aGF0IHNldHMgdXAgY29udGV4dCwgcmVzb2x2ZXMgdGhlIG9ic2lkaWFuIG1vZHVsZSxcbiAgICogY2FsbHMgdGhlIHVzZXIncyBmdW5jdGlvbiwgYW5kIHJldHVybnMgYSBKU09OIGVudmVsb3BlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBpbmNsdWRpbmcgdGhlIHVzZXIncyBmdW5jdGlvbiwgYXJncywgYW5kIGNvbnRleHQgSUQuXG4gICAqIEByZXR1cm5zIEEgSlNPTi1zdHJpbmdpZmllZCByZXN1bHQgZW52ZWxvcGUuXG4gICAqL1xuICBldmFsV3JhcHBlcihwYXJhbXM6IEV2YWxXcmFwcGVyTmFtZXNwYWNlUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgYG9ic2lkaWFuYCBtb2R1bGUgYXQgcnVudGltZSBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBgb2JzaWRpYW5gIG1vZHVsZS5cbiAgICovXG4gIGdldE9ic2lkaWFuTW9kdWxlKCk6IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFNlbmRzIGFuIElQQyBtZXNzYWdlIHN5bmNocm9ub3VzbHkgdmlhIEVsZWN0cm9uJ3MgYGlwY1JlbmRlcmVyYC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBJUEMgY2hhbm5lbCBhbmQgYXJndW1lbnRzLlxuICAgKi9cbiAgaXBjU2VuZFN5bmMocGFyYW1zOiBJcGNTZW5kU3luY05hbWVzcGFjZVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIENhY2hlZCBgb2JzaWRpYW5gIG1vZHVsZSwgc2V0IGJ5IHtAbGluayBnZXRPYnNpZGlhbk1vZHVsZX0gb24gZmlyc3QgcmVzb2x1dGlvbi5cbiAgICovXG4gIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmF1bHQncyBiYXNlIHBhdGggYXMgYSBKU09OLWVuY29kZWQgc3RyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgSlNPTi1lbmNvZGVkIGJhc2UgcGF0aC5cbiAgICovXG4gIHBvbGxWYXVsdEJhc2VQYXRoKCk6IFByb21pc2U8c3RyaW5nPjtcblxuICAvKipcbiAgICogU2V0cyBhIGBsb2NhbFN0b3JhZ2VgIGl0ZW0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUga2V5IGFuZCB2YWx1ZSB0byBzZXQuXG4gICAqL1xuICBzZXRMb2NhbFN0b3JhZ2VJdGVtKHBhcmFtczogU2V0TG9jYWxTdG9yYWdlSXRlbU5hbWVzcGFjZVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBsaWJyYXJ5IHZlcnNpb24gdGhhdCB3YXMgdXNlZCB0byBib290c3RyYXAgdGhpcyBuYW1lc3BhY2UuXG4gICAqIFVzZWQgdG8gZGV0ZWN0IHZlcnNpb24gbWlzbWF0Y2hlcyBhbmQgcmUtaW5pdGlhbGl6ZS5cbiAgICovXG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgT2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2Uuc2V0TG9jYWxTdG9yYWdlSXRlbX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2V0TG9jYWxTdG9yYWdlSXRlbU5hbWVzcGFjZVBhcmFtcyB7XG4gIC8qKiBUaGUgbG9jYWxTdG9yYWdlIGtleS4gKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIC8qKiBUaGUgbG9jYWxTdG9yYWdlIHZhbHVlLiAqL1xuICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -53,6 +53,14 @@ export interface ObsidianIntegrationTestingNamespace {
53
53
  * Waits for the Obsidian workspace layout to be ready.
54
54
  */
55
55
  ensureLayoutReady(): Promise<void>;
56
+ /**
57
+ * Converts an error into a human-readable string with its full stack trace,
58
+ * recursive `cause` chain, and the aggregated errors of an `AggregateError`.
59
+ *
60
+ * @param error - The error to convert to a string.
61
+ * @returns A formatted error string.
62
+ */
63
+ errorToString(error: unknown): string;
56
64
  /**
57
65
  * The top-level wrapper that sets up context, resolves the obsidian module,
58
66
  * calls the user's function, and returns a JSON envelope.
@@ -83,14 +91,6 @@ export interface ObsidianIntegrationTestingNamespace {
83
91
  * @returns The JSON-encoded base path.
84
92
  */
85
93
  pollVaultBasePath(): Promise<string>;
86
- /**
87
- * Serializes an error into a human-readable string with stack trace and cause chain.
88
- *
89
- * @param error - The error to serialize.
90
- * @param depth - The current nesting depth.
91
- * @returns A formatted error string.
92
- */
93
- serializeError(error: unknown, depth?: number): string;
94
94
  /**
95
95
  * Sets a `localStorage` item.
96
96
  *
@@ -26,9 +26,9 @@ __export(global_setup_exports, {
26
26
  module.exports = __toCommonJS(global_setup_exports);
27
27
  var import_vitest = require("vitest");
28
28
  var import_context_provider = require("../context-provider.cjs");
29
+ var import_error_to_string = require("../error-to-string.cjs");
29
30
  var import_global_setup_core = require("../global-setup-core.cjs");
30
31
  var import_log = require("../log.cjs");
31
- var import_serialize_error = require("../serialize-error.cjs");
32
32
  var import_temp_vault = require("../temp-vault.cjs");
33
33
  (0, import_context_provider.setTransportOptionsResolver)(() => (0, import_vitest.inject)("obsidianTransport"));
34
34
  (0, import_context_provider.setVaultPathResolver)(() => (0, import_vitest.inject)("tempVaultPath"));
@@ -42,8 +42,8 @@ function createSetup(options) {
42
42
  try {
43
43
  setupResult = await (0, import_global_setup_core.coreSetup)({ populate: options?.populate?.(), transportOptions });
44
44
  } catch (error) {
45
- (0, import_log.log)(`[integration-setup:${label}] Setup failed (tests for this project will be skipped): ${(0, import_serialize_error.serializeError)(error)}`);
46
- project.provide("setupError", (0, import_serialize_error.serializeError)(error));
45
+ (0, import_log.log)(`[integration-setup:${label}] Setup failed (tests for this project will be skipped): ${(0, import_error_to_string.errorToString)(error)}`);
46
+ project.provide("setupError", (0, import_error_to_string.errorToString)(error));
47
47
  return;
48
48
  }
49
49
  project.provide("obsidianTransport", setupResult.transportOptions);
@@ -71,4 +71,4 @@ const teardown = defaultGlobalSetup.teardown;
71
71
  setup,
72
72
  teardown
73
73
  });
74
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZpdGVzdC9nbG9iYWwtc2V0dXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93biBhZGFwdGVyLlxuICpcbiAqIERlbGVnYXRlcyB0byB0aGUgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgYW5kIGJyaWRnZXMgY29udGV4dFxuICogdG8gdGVzdCB3b3JrZXJzIHZpYSBWaXRlc3QncyBgcHJvamVjdC5wcm92aWRlYCAvIGBpbmplY3RgLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RQcm9qZWN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IENvcmVTZXR1cFJlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLmNqcyc7XG5pbXBvcnQgdHlwZSB7IFBvcHVsYXRlRmlsZXNQYXJhbXMgfSBmcm9tICcuLi90ZW1wLXZhdWx0LmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4uL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5cbmltcG9ydCB7XG4gIHNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgc2V0VmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi4vY29udGV4dC1wcm92aWRlci5janMnO1xuaW1wb3J0IHtcbiAgY29yZVNldHVwLFxuICBjb3JlVGVhcmRvd25cbn0gZnJvbSAnLi4vZ2xvYmFsLXNldHVwLWNvcmUuY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4uL2xvZy5janMnO1xuaW1wb3J0IHsgc2VyaWFsaXplRXJyb3IgfSBmcm9tICcuLi9zZXJpYWxpemUtZXJyb3IuY2pzJztcbmltcG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4uL3RlbXAtdmF1bHQuY2pzJztcblxuc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyKCgpID0+IGluamVjdCgnb2JzaWRpYW5UcmFuc3BvcnQnKSk7XG5zZXRWYXVsdFBhdGhSZXNvbHZlcigoKSA9PiBpbmplY3QoJ3RlbXBWYXVsdFBhdGgnKSk7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTZXR1cE9wdGlvbnMge1xuICAvKipcbiAgICogUmV0dXJucyBmaWxlcy9mb2xkZXJzIHRvIHdyaXRlIGludG8gdGhlIHZhdWx0IGJlZm9yZSBPYnNpZGlhbiBvcGVucyBpdCAoc2VlXG4gICAqIHtAbGluayBDb3JlU2V0dXBQYXJhbXMucG9wdWxhdGV9KS4gQSB0aHVuayBzbyBsYXJnZSBmaXh0dXJlcyBhcmUgYnVpbHQgbGF6aWx5LFxuICAgKiBvbmNlLCBpbiB0aGUgc2V0dXAgcHJvY2Vzcy5cbiAgICovXG4gIHBvcHVsYXRlPyh0aGlzOiB2b2lkKTogUG9wdWxhdGVGaWxlc1BhcmFtcztcbn1cblxuLyoqXG4gKiBBIFZpdGVzdCBgZ2xvYmFsU2V0dXBgIG1vZHVsZSdzIGBzZXR1cGAgLyBgdGVhcmRvd25gIHBhaXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml0ZXN0R2xvYmFsU2V0dXAge1xuICBzZXR1cCh0aGlzOiB2b2lkLCBwcm9qZWN0OiBUZXN0UHJvamVjdCk6IFByb21pc2U8dm9pZD47XG4gIHRlYXJkb3duKHRoaXM6IHZvaWQpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBWaXRlc3QgZ2xvYmFsIHNldHVwL3RlYXJkb3duIHBhaXIsIG9wdGlvbmFsbHkgcHJlLXBvcHVsYXRpbmcgdGhlIHZhdWx0XG4gKiBiZWZvcmUgT2JzaWRpYW4gb3BlbnMgaXQgXHUyMDE0IHVzZSB0aGlzIGZvciBhIGRlZGljYXRlZCBsYXJnZS12YXVsdC9wZXJmb3JtYW5jZVxuICogcHJvamVjdC4gVGhlIHBsYWluIHtAbGluayBzZXR1cH0gLyB7QGxpbmsgdGVhcmRvd259IGV4cG9ydHMgYXJlIHRoZSBuby1wb3B1bGF0ZVxuICogY2FzZSAoYGNyZWF0ZVNldHVwKClgKS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFNldHVwIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgYHNldHVwYCBhbmQgYHRlYXJkb3duYCBmdW5jdGlvbnMgdG8gcmUtZXhwb3J0IGZyb20gYSBgZ2xvYmFsU2V0dXBgIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNldHVwKG9wdGlvbnM/OiBDcmVhdGVTZXR1cE9wdGlvbnMpOiBWaXRlc3RHbG9iYWxTZXR1cCB7XG4gIGxldCBzZXR1cFJlc3VsdDogQ29yZVNldHVwUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7IHNldHVwLCB0ZWFyZG93biB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHNldHVwKHByb2plY3Q6IFRlc3RQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW52aXJvbm1lbnRPcHRpb25zID0gcHJvamVjdC5jb25maWcuZW52aXJvbm1lbnRPcHRpb25zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSBlbnZpcm9ubWVudE9wdGlvbnM/Llsnb2JzaWRpYW5UcmFuc3BvcnQnXSBhcyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFiZWwgPSB0cmFuc3BvcnRPcHRpb25zPy50eXBlID8/ICdvYnNpZGlhbi1jZHAnO1xuXG4gICAgdHJ5IHtcbiAgICAgIHNldHVwUmVzdWx0ID0gYXdhaXQgY29yZVNldHVwKHsgcG9wdWxhdGU6IG9wdGlvbnM/LnBvcHVsYXRlPy4oKSwgdHJhbnNwb3J0T3B0aW9ucyB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gQ2F0Y2ggc2V0dXAgZXJyb3JzIHNvIHRoYXQgb3RoZXIgcHJvamVjdHMnIHRlc3RzIGNhbiBzdGlsbCBydW4uXG4gICAgICAvLyBJbmRpdmlkdWFsIHRlc3RzIGluIHRoaXMgcHJvamVjdCB3aWxsIGZhaWwgd2l0aCB0aGUgc3RvcmVkIGVycm9yXG4gICAgICAvLyBXaGVuIHRoZXkgdHJ5IHRvIGluamVjdCB0aGUgdGVtcCB2YXVsdCBwYXRoLlxuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGZhaWxlZCAodGVzdHMgZm9yIHRoaXMgcHJvamVjdCB3aWxsIGJlIHNraXBwZWQpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICAgIHByb2plY3QucHJvdmlkZSgnc2V0dXBFcnJvcicsIHNlcmlhbGl6ZUVycm9yKGVycm9yKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJvamVjdC5wcm92aWRlKCdvYnNpZGlhblRyYW5zcG9ydCcsIHNldHVwUmVzdWx0LnRyYW5zcG9ydE9wdGlvbnMpO1xuICAgIHByb2plY3QucHJvdmlkZSgndGVtcFZhdWx0UGF0aCcsIHNldHVwUmVzdWx0LnRlbXBWYXVsdC5wYXRoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHRlYXJkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGNvcmVUZWFyZG93bihzZXR1cFJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0ZW1wb3JhcnkgdmF1bHQgcHJvdmlkZWQgYnkgdGhlIGdsb2JhbCBzZXR1cC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgdGVtcG9yYXJ5IHZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcFZhdWx0KCk6IFRlbXBWYXVsdCB7XG4gIGNvbnN0IHRlbXBWYXVsdFBhdGggPSBpbmplY3QoJ3RlbXBWYXVsdFBhdGgnKTtcbiAgY29uc3Qgc2V0dXBFcnJvck1lc3NhZ2UgPSBpbmplY3QoJ3NldHVwRXJyb3InKTtcbiAgaWYgKHNldHVwRXJyb3JNZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlZ3JhdGlvbiBzZXR1cCBmYWlsZWQgXHUyMDE0IGNhbm5vdCBnZXQgdGVtcCB2YXVsdDogJHtzZXR1cEVycm9yTWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gbmV3IFRlbXBWYXVsdCh0ZW1wVmF1bHRQYXRoKTtcbn1cblxuY29uc3QgZGVmYXVsdEdsb2JhbFNldHVwID0gY3JlYXRlU2V0dXAoKTtcblxuLyoqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGZ1bmN0aW9uIChubyBwcmUtcG9wdWxhdGlvbikuXG4gKlxuICogQ29waWVzIHRoZSBidWlsdCBwbHVnaW4gaW50byBhIHRlbXBvcmFyeSB2YXVsdCwgZW5hYmxlcyBpdCB2aWEgdGhlIE9ic2lkaWFuIENMSSxcbiAqIGFuZCBwcm92aWRlcyBgdGVtcFZhdWx0UGF0aGAgdG8gdGVzdHMuXG4gKlxuICogQHBhcmFtIHByb2plY3QgLSBUaGUgVml0ZXN0IHByb2plY3QuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNldHVwIGNvbXBsZXRlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHNldHVwID0gZGVmYXVsdEdsb2JhbFNldHVwLnNldHVwO1xuXG4vKipcbiAqIFZpdGVzdCBnbG9iYWwgdGVhcmRvd24gZnVuY3Rpb24uXG4gKlxuICogUmVtb3ZlcyB0aGUgdGVtcG9yYXJ5IHZhdWx0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGVhcmRvd24gY29tcGxldGVzLlxuICovXG5leHBvcnQgY29uc3QgdGVhcmRvd24gPSBkZWZhdWx0R2xvYmFsU2V0dXAudGVhcmRvd247XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBYUEsb0JBQXVCO0FBTXZCLDhCQUdPO0FBQ1AsK0JBR087QUFDUCxpQkFBb0I7QUFDcEIsNkJBQStCO0FBQy9CLHdCQUEwQjtBQUFBLElBRTFCLHFEQUE0QixVQUFNLHNCQUFPLG1CQUFtQixDQUFDO0FBQUEsSUFDN0QsOENBQXFCLFVBQU0sc0JBQU8sZUFBZSxDQUFDO0FBK0IzQyxTQUFTLFlBQVksU0FBaUQ7QUFDM0UsTUFBSTtBQUVKLFNBQU8sRUFBRSxPQUFBQSxRQUFPLFVBQUFDLFVBQVM7QUFFekIsaUJBQWVELE9BQU0sU0FBcUM7QUFDeEQsVUFBTSxxQkFBcUIsUUFBUSxPQUFPO0FBQzFDLFVBQU0sbUJBQW1CLHFCQUFxQixtQkFBbUI7QUFDakUsVUFBTSxRQUFRLGtCQUFrQixRQUFRO0FBRXhDLFFBQUk7QUFDRixvQkFBYyxVQUFNLG9DQUFVLEVBQUUsVUFBVSxTQUFTLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQztBQUFBLElBQ3JGLFNBQVMsT0FBZ0I7QUFJdkIsMEJBQUksc0JBQXNCLEtBQUssZ0VBQTRELHVDQUFlLEtBQUssQ0FBQyxFQUFFO0FBQ2xILGNBQVEsUUFBUSxrQkFBYyx1Q0FBZSxLQUFLLENBQUM7QUFDbkQ7QUFBQSxJQUNGO0FBRUEsWUFBUSxRQUFRLHFCQUFxQixZQUFZLGdCQUFnQjtBQUNqRSxZQUFRLFFBQVEsaUJBQWlCLFlBQVksVUFBVSxJQUFJO0FBQUEsRUFDN0Q7QUFFQSxpQkFBZUMsWUFBMEI7QUFDdkMsY0FBTSx1Q0FBYSxXQUFXO0FBQUEsRUFDaEM7QUFDRjtBQU9PLFNBQVMsZUFBMEI7QUFDeEMsUUFBTSxvQkFBZ0Isc0JBQU8sZUFBZTtBQUM1QyxRQUFNLHdCQUFvQixzQkFBTyxZQUFZO0FBQzdDLE1BQUksbUJBQW1CO0FBQ3JCLFVBQU0sSUFBSSxNQUFNLDBEQUFxRCxpQkFBaUIsRUFBRTtBQUFBLEVBQzFGO0FBQ0EsU0FBTyxJQUFJLDRCQUFVLGFBQWE7QUFDcEM7QUFFQSxNQUFNLHFCQUFxQixZQUFZO0FBV2hDLE1BQU0sUUFBUSxtQkFBbUI7QUFTakMsTUFBTSxXQUFXLG1CQUFtQjsiLAogICJuYW1lcyI6IFsic2V0dXAiLCAidGVhcmRvd24iXQp9Cg==
74
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZpdGVzdC9nbG9iYWwtc2V0dXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93biBhZGFwdGVyLlxuICpcbiAqIERlbGVnYXRlcyB0byB0aGUgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgYW5kIGJyaWRnZXMgY29udGV4dFxuICogdG8gdGVzdCB3b3JrZXJzIHZpYSBWaXRlc3QncyBgcHJvamVjdC5wcm92aWRlYCAvIGBpbmplY3RgLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RQcm9qZWN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IENvcmVTZXR1cFJlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLmNqcyc7XG5pbXBvcnQgdHlwZSB7IFBvcHVsYXRlRmlsZXNQYXJhbXMgfSBmcm9tICcuLi90ZW1wLXZhdWx0LmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4uL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5cbmltcG9ydCB7XG4gIHNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgc2V0VmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi4vY29udGV4dC1wcm92aWRlci5janMnO1xuaW1wb3J0IHsgZXJyb3JUb1N0cmluZyB9IGZyb20gJy4uL2Vycm9yLXRvLXN0cmluZy5janMnO1xuaW1wb3J0IHtcbiAgY29yZVNldHVwLFxuICBjb3JlVGVhcmRvd25cbn0gZnJvbSAnLi4vZ2xvYmFsLXNldHVwLWNvcmUuY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4uL2xvZy5janMnO1xuaW1wb3J0IHsgVGVtcFZhdWx0IH0gZnJvbSAnLi4vdGVtcC12YXVsdC5janMnO1xuXG5zZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIoKCkgPT4gaW5qZWN0KCdvYnNpZGlhblRyYW5zcG9ydCcpKTtcbnNldFZhdWx0UGF0aFJlc29sdmVyKCgpID0+IGluamVjdCgndGVtcFZhdWx0UGF0aCcpKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlU2V0dXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVNldHVwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGZpbGVzL2ZvbGRlcnMgdG8gd3JpdGUgaW50byB0aGUgdmF1bHQgYmVmb3JlIE9ic2lkaWFuIG9wZW5zIGl0IChzZWVcbiAgICoge0BsaW5rIENvcmVTZXR1cFBhcmFtcy5wb3B1bGF0ZX0pLiBBIHRodW5rIHNvIGxhcmdlIGZpeHR1cmVzIGFyZSBidWlsdCBsYXppbHksXG4gICAqIG9uY2UsIGluIHRoZSBzZXR1cCBwcm9jZXNzLlxuICAgKi9cbiAgcG9wdWxhdGU/KHRoaXM6IHZvaWQpOiBQb3B1bGF0ZUZpbGVzUGFyYW1zO1xufVxuXG4vKipcbiAqIEEgVml0ZXN0IGBnbG9iYWxTZXR1cGAgbW9kdWxlJ3MgYHNldHVwYCAvIGB0ZWFyZG93bmAgcGFpci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXRlc3RHbG9iYWxTZXR1cCB7XG4gIHNldHVwKHRoaXM6IHZvaWQsIHByb2plY3Q6IFRlc3RQcm9qZWN0KTogUHJvbWlzZTx2b2lkPjtcbiAgdGVhcmRvd24odGhpczogdm9pZCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFZpdGVzdCBnbG9iYWwgc2V0dXAvdGVhcmRvd24gcGFpciwgb3B0aW9uYWxseSBwcmUtcG9wdWxhdGluZyB0aGUgdmF1bHRcbiAqIGJlZm9yZSBPYnNpZGlhbiBvcGVucyBpdCBcdTIwMTQgdXNlIHRoaXMgZm9yIGEgZGVkaWNhdGVkIGxhcmdlLXZhdWx0L3BlcmZvcm1hbmNlXG4gKiBwcm9qZWN0LiBUaGUgcGxhaW4ge0BsaW5rIHNldHVwfSAvIHtAbGluayB0ZWFyZG93bn0gZXhwb3J0cyBhcmUgdGhlIG5vLXBvcHVsYXRlXG4gKiBjYXNlIChgY3JlYXRlU2V0dXAoKWApLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gU2V0dXAgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBgc2V0dXBgIGFuZCBgdGVhcmRvd25gIGZ1bmN0aW9ucyB0byByZS1leHBvcnQgZnJvbSBhIGBnbG9iYWxTZXR1cGAgbW9kdWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2V0dXAob3B0aW9ucz86IENyZWF0ZVNldHVwT3B0aW9ucyk6IFZpdGVzdEdsb2JhbFNldHVwIHtcbiAgbGV0IHNldHVwUmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQgfCB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHsgc2V0dXAsIHRlYXJkb3duIH07XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2V0dXAocHJvamVjdDogVGVzdFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBlbnZpcm9ubWVudE9wdGlvbnMgPSBwcm9qZWN0LmNvbmZpZy5lbnZpcm9ubWVudE9wdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdHJhbnNwb3J0T3B0aW9ucyA9IGVudmlyb25tZW50T3B0aW9ucz8uWydvYnNpZGlhblRyYW5zcG9ydCddIGFzIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsYWJlbCA9IHRyYW5zcG9ydE9wdGlvbnM/LnR5cGUgPz8gJ29ic2lkaWFuLWNkcCc7XG5cbiAgICB0cnkge1xuICAgICAgc2V0dXBSZXN1bHQgPSBhd2FpdCBjb3JlU2V0dXAoeyBwb3B1bGF0ZTogb3B0aW9ucz8ucG9wdWxhdGU/LigpLCB0cmFuc3BvcnRPcHRpb25zIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBDYXRjaCBzZXR1cCBlcnJvcnMgc28gdGhhdCBvdGhlciBwcm9qZWN0cycgdGVzdHMgY2FuIHN0aWxsIHJ1bi5cbiAgICAgIC8vIEluZGl2aWR1YWwgdGVzdHMgaW4gdGhpcyBwcm9qZWN0IHdpbGwgZmFpbCB3aXRoIHRoZSBzdG9yZWQgZXJyb3JcbiAgICAgIC8vIFdoZW4gdGhleSB0cnkgdG8gaW5qZWN0IHRoZSB0ZW1wIHZhdWx0IHBhdGguXG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU2V0dXAgZmFpbGVkICh0ZXN0cyBmb3IgdGhpcyBwcm9qZWN0IHdpbGwgYmUgc2tpcHBlZCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgICBwcm9qZWN0LnByb3ZpZGUoJ3NldHVwRXJyb3InLCBlcnJvclRvU3RyaW5nKGVycm9yKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJvamVjdC5wcm92aWRlKCdvYnNpZGlhblRyYW5zcG9ydCcsIHNldHVwUmVzdWx0LnRyYW5zcG9ydE9wdGlvbnMpO1xuICAgIHByb2plY3QucHJvdmlkZSgndGVtcFZhdWx0UGF0aCcsIHNldHVwUmVzdWx0LnRlbXBWYXVsdC5wYXRoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHRlYXJkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGNvcmVUZWFyZG93bihzZXR1cFJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0ZW1wb3JhcnkgdmF1bHQgcHJvdmlkZWQgYnkgdGhlIGdsb2JhbCBzZXR1cC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgdGVtcG9yYXJ5IHZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcFZhdWx0KCk6IFRlbXBWYXVsdCB7XG4gIGNvbnN0IHRlbXBWYXVsdFBhdGggPSBpbmplY3QoJ3RlbXBWYXVsdFBhdGgnKTtcbiAgY29uc3Qgc2V0dXBFcnJvck1lc3NhZ2UgPSBpbmplY3QoJ3NldHVwRXJyb3InKTtcbiAgaWYgKHNldHVwRXJyb3JNZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlZ3JhdGlvbiBzZXR1cCBmYWlsZWQgXHUyMDE0IGNhbm5vdCBnZXQgdGVtcCB2YXVsdDogJHtzZXR1cEVycm9yTWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gbmV3IFRlbXBWYXVsdCh0ZW1wVmF1bHRQYXRoKTtcbn1cblxuY29uc3QgZGVmYXVsdEdsb2JhbFNldHVwID0gY3JlYXRlU2V0dXAoKTtcblxuLyoqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGZ1bmN0aW9uIChubyBwcmUtcG9wdWxhdGlvbikuXG4gKlxuICogQ29waWVzIHRoZSBidWlsdCBwbHVnaW4gaW50byBhIHRlbXBvcmFyeSB2YXVsdCwgZW5hYmxlcyBpdCB2aWEgdGhlIE9ic2lkaWFuIENMSSxcbiAqIGFuZCBwcm92aWRlcyBgdGVtcFZhdWx0UGF0aGAgdG8gdGVzdHMuXG4gKlxuICogQHBhcmFtIHByb2plY3QgLSBUaGUgVml0ZXN0IHByb2plY3QuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNldHVwIGNvbXBsZXRlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHNldHVwID0gZGVmYXVsdEdsb2JhbFNldHVwLnNldHVwO1xuXG4vKipcbiAqIFZpdGVzdCBnbG9iYWwgdGVhcmRvd24gZnVuY3Rpb24uXG4gKlxuICogUmVtb3ZlcyB0aGUgdGVtcG9yYXJ5IHZhdWx0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGVhcmRvd24gY29tcGxldGVzLlxuICovXG5leHBvcnQgY29uc3QgdGVhcmRvd24gPSBkZWZhdWx0R2xvYmFsU2V0dXAudGVhcmRvd247XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBYUEsb0JBQXVCO0FBTXZCLDhCQUdPO0FBQ1AsNkJBQThCO0FBQzlCLCtCQUdPO0FBQ1AsaUJBQW9CO0FBQ3BCLHdCQUEwQjtBQUFBLElBRTFCLHFEQUE0QixVQUFNLHNCQUFPLG1CQUFtQixDQUFDO0FBQUEsSUFDN0QsOENBQXFCLFVBQU0sc0JBQU8sZUFBZSxDQUFDO0FBK0IzQyxTQUFTLFlBQVksU0FBaUQ7QUFDM0UsTUFBSTtBQUVKLFNBQU8sRUFBRSxPQUFBQSxRQUFPLFVBQUFDLFVBQVM7QUFFekIsaUJBQWVELE9BQU0sU0FBcUM7QUFDeEQsVUFBTSxxQkFBcUIsUUFBUSxPQUFPO0FBQzFDLFVBQU0sbUJBQW1CLHFCQUFxQixtQkFBbUI7QUFDakUsVUFBTSxRQUFRLGtCQUFrQixRQUFRO0FBRXhDLFFBQUk7QUFDRixvQkFBYyxVQUFNLG9DQUFVLEVBQUUsVUFBVSxTQUFTLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQztBQUFBLElBQ3JGLFNBQVMsT0FBZ0I7QUFJdkIsMEJBQUksc0JBQXNCLEtBQUssZ0VBQTRELHNDQUFjLEtBQUssQ0FBQyxFQUFFO0FBQ2pILGNBQVEsUUFBUSxrQkFBYyxzQ0FBYyxLQUFLLENBQUM7QUFDbEQ7QUFBQSxJQUNGO0FBRUEsWUFBUSxRQUFRLHFCQUFxQixZQUFZLGdCQUFnQjtBQUNqRSxZQUFRLFFBQVEsaUJBQWlCLFlBQVksVUFBVSxJQUFJO0FBQUEsRUFDN0Q7QUFFQSxpQkFBZUMsWUFBMEI7QUFDdkMsY0FBTSx1Q0FBYSxXQUFXO0FBQUEsRUFDaEM7QUFDRjtBQU9PLFNBQVMsZUFBMEI7QUFDeEMsUUFBTSxvQkFBZ0Isc0JBQU8sZUFBZTtBQUM1QyxRQUFNLHdCQUFvQixzQkFBTyxZQUFZO0FBQzdDLE1BQUksbUJBQW1CO0FBQ3JCLFVBQU0sSUFBSSxNQUFNLDBEQUFxRCxpQkFBaUIsRUFBRTtBQUFBLEVBQzFGO0FBQ0EsU0FBTyxJQUFJLDRCQUFVLGFBQWE7QUFDcEM7QUFFQSxNQUFNLHFCQUFxQixZQUFZO0FBV2hDLE1BQU0sUUFBUSxtQkFBbUI7QUFTakMsTUFBTSxXQUFXLG1CQUFtQjsiLAogICJuYW1lcyI6IFsic2V0dXAiLCAidGVhcmRvd24iXQp9Cg==
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * A single {@link connectToCdp} call resolves the owned-instance config, opens a
8
8
  * vault, and bootstraps `window.__obsidianIntegrationTesting` (so `evalWrapper`,
9
- * `typeIntoEditor`, `serializeError`, `getObsidianModule`, … are available), then
9
+ * the base `lib` helpers, `errorToString`, `getObsidianModule`, … are available), then
10
10
  * hands back a disposable {@link CdpConnection} exposing the chosen CDP port, a
11
11
  * raw {@link CdpConnection.invoke} and the rich {@link CdpConnection.evalInObsidian}.
12
12
  */
@@ -38,9 +38,10 @@ export interface CdpConnection extends AsyncDisposable {
38
38
  dispose(): Promise<void>;
39
39
  /**
40
40
  * Evaluates a self-contained function inside Obsidian via the rich helper
41
- * path, receiving `{ app, obsidianModule, typeIntoEditor, context }` plus any
42
- * `args`. Mirrors the top-level `evalInObsidian`, with the transport and vault
43
- * path pre-bound to this connection.
41
+ * path, receiving `{ app, lib, obsidianModule, context }` plus any `args`
42
+ * (shared helpers like `typeIntoEditor` / `waitUntil` live on `lib`). Mirrors
43
+ * the top-level `evalInObsidian`, with the transport and vault path pre-bound
44
+ * to this connection.
44
45
  *
45
46
  * @param params - The evaluation parameters (`fn`, optional `args`/`contextId`).
46
47
  * @returns A {@link Promise} that resolves to the return value of `fn`.