mulmoclaude 0.6.2 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/bin/mulmoclaude.js +11 -1
- package/client/assets/chunk-D8eiyYIV-CW0rPbG2.js +1 -0
- package/client/assets/{html2canvas-CDGcmOD3-Bkf2uOth.js → html2canvas-CDGcmOD3-BjwfzAN8.js} +1 -1
- package/client/assets/index-Bp1owZ-i.js +5101 -0
- package/client/assets/index-c63H1pnd.css +2 -0
- package/client/assets/{index.es-DqtpmBm8-D9mAh_KQ.js → index.es-DqtpmBm8-DudYPW7R.js} +1 -1
- package/client/assets/material-symbols-outlined-C0dZ3SlO.woff2 +0 -0
- package/client/assets/runtime-protocol-vue-BUk5WXSy.js +1 -0
- package/client/assets/{runtime-vue-BVUzgYGA.js → runtime-vue-fFYhnNg3.js} +1 -1
- package/client/assets/{vue-C8UuIO9J.js → vue-Kqzpl9Vx.js} +1 -1
- package/client/assets/vue.runtime.esm-bundler-BTyIdNAI.js +4 -0
- package/client/index.html +9 -11
- package/package.json +5 -4
- package/server/agent/backend/claude-code.ts +34 -0
- package/server/agent/backend/fake-echo.ts +370 -0
- package/server/agent/backend/index.ts +16 -1
- package/server/agent/config.ts +8 -1
- package/server/agent/mcpFailureMonitor.ts +167 -0
- package/server/agent/mcpPreflight.ts +185 -0
- package/server/agent/stream.ts +12 -1
- package/server/api/routes/mulmo-script.ts +19 -1
- package/server/api/routes/schedulerHandlers.ts +52 -4
- package/server/api/routes/sessions.ts +15 -0
- package/server/api/routes/skills.ts +263 -0
- package/server/events/notifications.ts +19 -91
- package/server/index.ts +87 -9
- package/server/notifier/macosReminderAdapter.ts +30 -0
- package/server/system/announceOptionalDeps.ts +50 -0
- package/server/system/config.ts +8 -1
- package/server/system/docker.ts +14 -6
- package/server/system/env.ts +18 -5
- package/server/system/optionalDeps.ts +129 -0
- package/server/utils/cli-flags.d.mts +14 -0
- package/server/utils/cli-flags.mjs +53 -0
- package/server/utils/time.ts +6 -0
- package/server/workspace/helps/business.md +2 -2
- package/server/workspace/helps/mulmoscript.md +3 -3
- package/server/workspace/helps/sandbox.md +2 -2
- package/server/workspace/hooks/dispatcher.mjs +1 -1
- package/server/workspace/paths.ts +13 -4
- package/server/workspace/skills/catalog.ts +355 -0
- package/server/workspace/skills/external/catalog.ts +283 -0
- package/server/workspace/skills/external/clone.ts +129 -0
- package/server/workspace/skills/external/id.ts +194 -0
- package/server/workspace/skills/external/install.ts +417 -0
- package/server/workspace/skills/external/presets.ts +50 -0
- package/server/workspace/skills-preset.ts +29 -17
- package/server/workspace/workspace.ts +10 -5
- package/src/App.vue +19 -8
- package/src/components/RightSidebar.vue +19 -0
- package/src/components/StackView.vue +10 -1
- package/src/config/apiRoutes.ts +0 -6
- package/src/config/roles.ts +2 -0
- package/src/lang/de.ts +50 -1
- package/src/lang/en.ts +49 -1
- package/src/lang/es.ts +49 -1
- package/src/lang/fr.ts +49 -1
- package/src/lang/ja.ts +49 -1
- package/src/lang/ko.ts +49 -1
- package/src/lang/pt-BR.ts +49 -1
- package/src/lang/zh.ts +49 -1
- package/src/plugins/manageSkills/View.vue +795 -30
- package/src/plugins/manageSkills/categories.ts +125 -0
- package/src/plugins/manageSkills/meta.ts +30 -0
- package/src/plugins/markdown/definition.ts +3 -3
- package/src/plugins/meta-types.ts +5 -0
- package/src/plugins/presentMulmoScript/Preview.vue +3 -3
- package/src/plugins/presentMulmoScript/View.vue +157 -33
- package/src/plugins/presentMulmoScript/meta.ts +4 -0
- package/src/plugins/scheduler/View.vue +45 -9
- package/src/plugins/scheduler/calendarDefinition.ts +6 -2
- package/src/plugins/scheduler/multiDayHelpers.ts +95 -0
- package/src/plugins/spreadsheet/View.vue +3 -3
- package/src/types/notification.ts +1 -1
- package/src/types/session.ts +6 -0
- package/src/types/sse.ts +5 -0
- package/src/types/toolCallHistory.ts +7 -0
- package/src/utils/agent/eventDispatch.ts +26 -5
- package/src/utils/agent/mcpHint.ts +50 -0
- package/src/utils/session/sessionEntries.ts +8 -32
- package/client/assets/PluginScopedRoot-YjvQq0Nn.js +0 -3
- package/client/assets/chunk-CernVdwh.js +0 -1
- package/client/assets/chunk-D8eiyYIV-CAXpUwLd.js +0 -1
- package/client/assets/index-BwrlMMHr.js +0 -5005
- package/client/assets/index-CvvNuegU.css +0 -2
- package/client/assets/material-symbols-outlined-BOZVWuR3.woff2 +0 -0
- package/client/assets/runtime-protocol-vue-C1To4M3t.js +0 -1
- package/client/assets/vue.runtime.esm-bundler-DQ8Kjjui.js +0 -4
- package/server/api/routes/notifications.ts +0 -195
- package/server/notifier/legacy-adapters.ts +0 -76
- package/src/composables/useSelectedResult.ts +0 -49
- /package/client/assets/{purify.es-Fx1Nqyry-Dwtk-9WZ.js → purify.es-Fx1Nqyry-B3aL7Uvj.js} +0 -0
- /package/client/assets/{typeof-DBp4T-Ny-CSr8wx1e.js → typeof-DBp4T-Ny-Bef7RiR_.js} +0 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// Optional host-binary registry + graceful-degradation probe (#1385).
|
|
2
|
+
//
|
|
3
|
+
// A missing optional binary must never crash the app: the feature
|
|
4
|
+
// that needs it disables itself, the user is warned once, and the
|
|
5
|
+
// rest keeps working. This module centralises the "is <binary>
|
|
6
|
+
// available?" question so we don't re-implement the lazy-cached
|
|
7
|
+
// probe per dependency (docker's ad-hoc check was the only one
|
|
8
|
+
// before this).
|
|
9
|
+
|
|
10
|
+
import which from "which";
|
|
11
|
+
import { isDockerLive } from "./docker.js";
|
|
12
|
+
|
|
13
|
+
/** A single optional host dependency the app can run without. */
|
|
14
|
+
export interface OptionalDep {
|
|
15
|
+
/** Stable id used by `depStatus()` lookups and notification ids. */
|
|
16
|
+
readonly id: string;
|
|
17
|
+
/** Binary name passed to `which` for the default presence probe. */
|
|
18
|
+
readonly command: string;
|
|
19
|
+
/** i18n key fragment naming what stops working when absent. */
|
|
20
|
+
readonly enables: string;
|
|
21
|
+
/** Override when "on PATH" is insufficient (e.g. docker client
|
|
22
|
+
* exists but the daemon is down). Returning false means the
|
|
23
|
+
* dependency is treated as unavailable even if `which` found it. */
|
|
24
|
+
readonly probe?: () => Promise<boolean>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type DepReason = "ok" | "not-on-path" | "probe-failed";
|
|
28
|
+
|
|
29
|
+
export interface DepStatus {
|
|
30
|
+
readonly id: string;
|
|
31
|
+
readonly available: boolean;
|
|
32
|
+
readonly reason: DepReason;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const REGISTRY: readonly OptionalDep[] = [
|
|
36
|
+
{ id: "docker", command: "docker", enables: "dockerSandbox", probe: isDockerLive },
|
|
37
|
+
{ id: "ffmpeg", command: "ffmpeg", enables: "mulmocast" },
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
async function onPath(command: string): Promise<boolean> {
|
|
41
|
+
try {
|
|
42
|
+
const resolved = await which(command, { nothrow: true });
|
|
43
|
+
return resolved !== null;
|
|
44
|
+
} catch {
|
|
45
|
+
// `which` shouldn't throw with nothrow, but a corrupt PATH or
|
|
46
|
+
// an fs error must degrade to "absent", never bubble up.
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Never throws — a missing optional dep degrades, it does not crash
|
|
52
|
+
// startup. A throwing PATH check or liveness `probe` is treated as
|
|
53
|
+
// "unavailable" rather than propagating into the boot sequence.
|
|
54
|
+
// `pathCheck` is injectable so unit tests exercise the reason
|
|
55
|
+
// mapping + override precedence without depending on the host's
|
|
56
|
+
// real PATH.
|
|
57
|
+
export async function probeOne(dep: OptionalDep, pathCheck: (command: string) => Promise<boolean> = onPath): Promise<DepStatus> {
|
|
58
|
+
try {
|
|
59
|
+
if (!(await pathCheck(dep.command))) {
|
|
60
|
+
return { id: dep.id, available: false, reason: "not-on-path" };
|
|
61
|
+
}
|
|
62
|
+
if (dep.probe && !(await dep.probe())) {
|
|
63
|
+
return { id: dep.id, available: false, reason: "probe-failed" };
|
|
64
|
+
}
|
|
65
|
+
return { id: dep.id, available: true, reason: "ok" };
|
|
66
|
+
} catch {
|
|
67
|
+
return { id: dep.id, available: false, reason: "probe-failed" };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
let cache: Record<string, DepStatus> | null = null;
|
|
72
|
+
let inFlight: Promise<Record<string, DepStatus>> | null = null;
|
|
73
|
+
|
|
74
|
+
/** Probe every registered dependency in parallel. Cached for the
|
|
75
|
+
* process lifetime; concurrent callers share one in-flight run so
|
|
76
|
+
* `which` / the daemon probe fire once each. */
|
|
77
|
+
export async function probeOptionalDeps(): Promise<Record<string, DepStatus>> {
|
|
78
|
+
if (cache) return cache;
|
|
79
|
+
if (inFlight) return inFlight;
|
|
80
|
+
inFlight = (async () => {
|
|
81
|
+
try {
|
|
82
|
+
const statuses = await Promise.all(REGISTRY.map((dep) => probeOne(dep)));
|
|
83
|
+
cache = Object.fromEntries(statuses.map((status) => [status.id, status]));
|
|
84
|
+
return cache;
|
|
85
|
+
} catch {
|
|
86
|
+
// probeOne never rejects, so this is unreachable in practice —
|
|
87
|
+
// but if it ever did, returning an empty map keeps boot alive
|
|
88
|
+
// (callers treat "no status" as "assume available"). Do NOT
|
|
89
|
+
// poison `cache` so a later call can retry.
|
|
90
|
+
return {};
|
|
91
|
+
} finally {
|
|
92
|
+
// Always clear so a rejected/failed run can't permanently
|
|
93
|
+
// poison the cache (Codex review).
|
|
94
|
+
inFlight = null;
|
|
95
|
+
}
|
|
96
|
+
})();
|
|
97
|
+
return inFlight;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Synchronous read of a previously-probed dependency. Returns
|
|
101
|
+
* undefined if `probeOptionalDeps()` has not completed yet — callers
|
|
102
|
+
* on the request path should treat that as "assume available" so a
|
|
103
|
+
* not-yet-probed boot window never blocks a feature. */
|
|
104
|
+
export function depStatus(depId: string): DepStatus | undefined {
|
|
105
|
+
return cache?.[depId];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** The registry, for callers that need the human-facing `enables`
|
|
109
|
+
* label (boot warning composition). */
|
|
110
|
+
export function optionalDeps(): readonly OptionalDep[] {
|
|
111
|
+
return REGISTRY;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Test-only: drop the cache so a fresh probe runs next call. */
|
|
115
|
+
export function _resetOptionalDepsCacheForTest(): void {
|
|
116
|
+
cache = null;
|
|
117
|
+
inFlight = null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Test-only: seed the probe cache directly so route guards and
|
|
121
|
+
* `announceOptionalDeps` behave deterministically without invoking
|
|
122
|
+
* the real `which` / daemon probe (CI has no control over whether
|
|
123
|
+
* ffmpeg/docker are installed on the runner). `probeOptionalDeps()`
|
|
124
|
+
* returns this seeded cache untouched (its first line is
|
|
125
|
+
* `if (cache) return cache;`). */
|
|
126
|
+
export function _setOptionalDepsCacheForTest(seed: Record<string, DepStatus>): void {
|
|
127
|
+
cache = seed;
|
|
128
|
+
inFlight = null;
|
|
129
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Type declarations for cli-flags.mjs. See the .mjs file for rationale
|
|
2
|
+
// on why the shared registry lives in plain JS.
|
|
3
|
+
|
|
4
|
+
export interface CliFlag {
|
|
5
|
+
flag: string;
|
|
6
|
+
env: string;
|
|
7
|
+
help: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const CLI_FLAGS: readonly CliFlag[];
|
|
11
|
+
|
|
12
|
+
export function flagEnvOverrides(argv: readonly string[]): Record<string, "1">;
|
|
13
|
+
|
|
14
|
+
export function cliFlagHelpLines(): string;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Shared registry of the boolean CLI flags that mirror an env var.
|
|
2
|
+
// Single source of truth for: the launcher's argv→env injection
|
|
3
|
+
// (`packages/mulmoclaude/bin/mulmoclaude.js`), the launcher `--help`
|
|
4
|
+
// text, and the server-side argv awareness in `server/system/env.ts`.
|
|
5
|
+
//
|
|
6
|
+
// Kept as plain `.mjs` for the same reason as `dev-plugin-args.mjs` /
|
|
7
|
+
// `port.mjs`: the launcher runs BEFORE tsx is wired up, so it can't
|
|
8
|
+
// import from a `.ts` file. Sibling `cli-flags.d.mts` carries the
|
|
9
|
+
// type declarations.
|
|
10
|
+
//
|
|
11
|
+
// Each flag is a launch-time boolean toggle that was previously only
|
|
12
|
+
// reachable via a `VAR=1` env-var prefix — awkward on Windows
|
|
13
|
+
// PowerShell `npx`, in IDE/launcher run configs, and for quick ad-hoc
|
|
14
|
+
// debugging. Setting `<flag>` is equivalent to exporting `<env>=1`;
|
|
15
|
+
// the env var stays supported in parallel (CI scripts / existing docs
|
|
16
|
+
// rely on it). Secret-bearing vars (auth token, API keys) are
|
|
17
|
+
// deliberately NOT here — argv is visible via `ps` and shell history,
|
|
18
|
+
// so those stay env-only. (#1089 + bundle.)
|
|
19
|
+
|
|
20
|
+
/** @type {ReadonlyArray<{ flag: string, env: string, help: string }>} */
|
|
21
|
+
export const CLI_FLAGS = Object.freeze([
|
|
22
|
+
{ flag: "--disable-sandbox", env: "DISABLE_SANDBOX", help: "Run without the Docker sandbox (= DISABLE_SANDBOX=1)" },
|
|
23
|
+
{
|
|
24
|
+
flag: "--disable-macos-reminders",
|
|
25
|
+
env: "DISABLE_MACOS_REMINDER_NOTIFICATIONS",
|
|
26
|
+
help: "Disable the macOS Reminder notification sink (= DISABLE_MACOS_REMINDER_NOTIFICATIONS=1)",
|
|
27
|
+
},
|
|
28
|
+
{ flag: "--persist-tool-calls", env: "PERSIST_TOOL_CALLS", help: "Also persist tool_call events to the session jsonl (= PERSIST_TOOL_CALLS=1)" },
|
|
29
|
+
{ flag: "--journal-force-run", env: "JOURNAL_FORCE_RUN_ON_STARTUP", help: "Run the journal pass immediately on startup (= JOURNAL_FORCE_RUN_ON_STARTUP=1)" },
|
|
30
|
+
{
|
|
31
|
+
flag: "--chat-index-force-run",
|
|
32
|
+
env: "CHAT_INDEX_FORCE_RUN_ON_STARTUP",
|
|
33
|
+
help: "Run the chat-index pass immediately on startup (= CHAT_INDEX_FORCE_RUN_ON_STARTUP=1)",
|
|
34
|
+
},
|
|
35
|
+
]);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Map present CLI flags to the `{ ENV: "1" }` overrides the launcher
|
|
39
|
+
* merges into the spawned server's env. Pure — caller passes argv in.
|
|
40
|
+
*/
|
|
41
|
+
export function flagEnvOverrides(argv) {
|
|
42
|
+
const overrides = {};
|
|
43
|
+
for (const { flag, env } of CLI_FLAGS) {
|
|
44
|
+
if (argv.includes(flag)) overrides[env] = "1";
|
|
45
|
+
}
|
|
46
|
+
return overrides;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Render the aligned `--help` lines for the flag block. */
|
|
50
|
+
export function cliFlagHelpLines() {
|
|
51
|
+
const width = Math.max(...CLI_FLAGS.map(({ flag }) => flag.length));
|
|
52
|
+
return CLI_FLAGS.map(({ flag, help }) => ` ${flag.padEnd(width)} ${help}`).join("\n");
|
|
53
|
+
}
|
package/server/utils/time.ts
CHANGED
|
@@ -36,6 +36,12 @@ export const DEV_PLUGIN_WATCH_DEBOUNCE_MS = 300;
|
|
|
36
36
|
* a fail-fast guarantee. */
|
|
37
37
|
export const STARTUP_FAILURE_FORCE_EXIT_MS = 5 * ONE_SECOND_MS;
|
|
38
38
|
|
|
39
|
+
/** Tiny grace after an uncaught exception / unhandled rejection so
|
|
40
|
+
* the final `log.error` line flushes to disk before the process
|
|
41
|
+
* bounces. Long enough for a synchronous append, short enough not
|
|
42
|
+
* to delay a crash-restart loop. */
|
|
43
|
+
export const FATAL_LOG_FLUSH_MS = 100;
|
|
44
|
+
|
|
39
45
|
/** Heavy subprocess work (libreoffice conversion, etc.) */
|
|
40
46
|
export const SUBPROCESS_WORK_TIMEOUT_MS = ONE_MINUTE_MS;
|
|
41
47
|
|
|
@@ -37,8 +37,8 @@ Reach for `presentMulmoScript` when the user asks for a presentation, slideshow,
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
},
|
|
40
|
-
"imageParams": { "provider": "google", "model": "gemini-
|
|
41
|
-
"movieParams": { "provider": "google", "model": "veo-
|
|
40
|
+
"imageParams": { "provider": "google", "model": "gemini-3.1-flash-image-preview" },
|
|
41
|
+
"movieParams": { "provider": "google", "model": "veo-3.1-generate" },
|
|
42
42
|
"textSlideParams": { "cssStyles": "body { background-color: white; }" },
|
|
43
43
|
"beats": [
|
|
44
44
|
{
|
|
@@ -11,8 +11,8 @@ MulmoScript files are rendered in the canvas. The underlying engine is [mulmocas
|
|
|
11
11
|
| Purpose | Provider | Example config |
|
|
12
12
|
|---|---|---|
|
|
13
13
|
| TTS (speech) | `gemini` | `"provider": "gemini", "voiceId": "Kore"` |
|
|
14
|
-
| Image generation | `google` | `"provider": "google", "model": "gemini-
|
|
15
|
-
| Video generation | `google` | `"provider": "google", "model": "veo-
|
|
14
|
+
| Image generation | `google` | `"provider": "google", "model": "gemini-3.1-flash-image-preview"` |
|
|
15
|
+
| Video generation | `google` | `"provider": "google", "model": "veo-3.1-generate"` |
|
|
16
16
|
|
|
17
17
|
Do not use `openai`, `elevenlabs`, or other providers — they are not configured in this app.
|
|
18
18
|
|
|
@@ -225,7 +225,7 @@ Control BGM and volume mixing.
|
|
|
225
225
|
"Presenter": { "provider": "gemini", "voiceId": "Kore", "displayName": { "en": "Presenter" } }
|
|
226
226
|
}
|
|
227
227
|
},
|
|
228
|
-
"imageParams": { "provider": "google", "model": "gemini-
|
|
228
|
+
"imageParams": { "provider": "google", "model": "gemini-3.1-flash-image-preview" },
|
|
229
229
|
"beats": [
|
|
230
230
|
{
|
|
231
231
|
"speaker": "Presenter",
|
|
@@ -23,11 +23,11 @@ The container runs with `--cap-drop ALL` and as the host user's UID/GID, so it h
|
|
|
23
23
|
|
|
24
24
|
## Disabling the Sandbox
|
|
25
25
|
|
|
26
|
-
Set the environment variable `DISABLE_SANDBOX=1` to always run the agent directly on the host, even when Docker is available.
|
|
26
|
+
Set the environment variable `DISABLE_SANDBOX=1` to always run the agent directly on the host, even when Docker is available. Equivalently, pass the `--disable-sandbox` CLI flag — `yarn dev --disable-sandbox` or `npx mulmoclaude --disable-sandbox`. The flag form is handy on Windows PowerShell (no inline `VAR=value` syntax), in IDE / launcher run configs, and for quick ad-hoc debugging. Both set the same internal switch; the env var stays supported in parallel.
|
|
27
27
|
|
|
28
28
|
## Debug aids (opt-in env vars)
|
|
29
29
|
|
|
30
|
-
These flags exist for development / debugging only. Off by default so production runs aren't surprised.
|
|
30
|
+
These flags exist for development / debugging only. Off by default so production runs aren't surprised. Each has an equivalent `--flag` CLI form (drop the `=1`, kebab-case the name) accepted by both `yarn dev` and `npx mulmoclaude` — e.g. `DISABLE_SANDBOX=1` ≡ `--disable-sandbox`, `PERSIST_TOOL_CALLS=1` ≡ `--persist-tool-calls`, `DISABLE_MACOS_REMINDER_NOTIFICATIONS=1` ≡ `--disable-macos-reminders`, `JOURNAL_FORCE_RUN_ON_STARTUP=1` ≡ `--journal-force-run`, `CHAT_INDEX_FORCE_RUN_ON_STARTUP=1` ≡ `--chat-index-force-run`. Secret-bearing vars (auth token, API keys) have no flag form on purpose — argv is visible via `ps` / shell history.
|
|
31
31
|
|
|
32
32
|
- `DISABLE_SANDBOX=1` — see above. Bypasses the Docker sandbox.
|
|
33
33
|
- `PERSIST_TOOL_CALLS=1` — also persist `tool_call` events to the session jsonl alongside `tool_result`. Useful for reading the args sent to a tool after the run is over (page refresh / server restart). Off by default because args can be large and may carry payload bytes (inline images, full MulmoScript JSON) you didn't expect to land in the jsonl. See [issue #1096](https://github.com/receptron/mulmoclaude/issues/1096) for the rationale.
|
|
@@ -297,4 +297,4 @@ async function main() {
|
|
|
297
297
|
}
|
|
298
298
|
main().catch(() => {
|
|
299
299
|
});
|
|
300
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic2hhcmVkL3NpZGVjYXIudHMiLCAiLi4vLi4vdXRpbHMvdGltZS50cyIsICJzaGFyZWQvd29ya3NwYWNlLnRzIiwgInNoYXJlZC9zdGRpbi50cyIsICJoYW5kbGVycy9jb25maWdSZWZyZXNoLnRzIiwgImhhbmRsZXJzL3NraWxsQnJpZGdlLnRzIiwgIi4uLy4uL3V0aWxzL2Vycm9ycy50cyIsICJoYW5kbGVycy93aWtpU25hcHNob3QudHMiLCAiLi4vLi4vLi4vc3JjL2xpYi93aWtpLXBhZ2UvcGF0aHMudHMiLCAiLi4vLi4vLi4vc3JjL2xpYi93aWtpLXBhZ2Uvc2x1Zy50cyIsICJkaXNwYXRjaGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBSZWFkIHRoZSBiZWFyZXIgdG9rZW4gYW5kIHNlcnZlciBwb3J0IGZyb20gc2lkZWNhciBmaWxlcyB0aGVcbi8vIHBhcmVudCBzZXJ2ZXIgd3JpdGVzIG9uIGVhY2ggc3RhcnR1cC4gSG9va3MgUE9TVCBiYWNrIHRvIHRoZVxuLy8gcGFyZW50IHNlcnZlciB1c2luZyB0aGVzZSBcdTIwMTQgdGhleSBuZWVkIHRvIHJ1biB3aXRob3V0IGFueVxuLy8gcnVudGltZSBjb25maWcgYmFrZWQgaW4uXG4vL1xuLy8gU3RyaWN0IGludGVnZXIgcGFyc2luZyBvbiB0aGUgcG9ydDogYSBjcmFmdGVkIGZpbGUgdmFsdWUgbGlrZVxuLy8gYDgwQGF0dGFja2VyLmV4YW1wbGVgIHdvdWxkIG90aGVyd2lzZSBjaGFuZ2UgdGhlIHJlcXVlc3Rcbi8vIGF1dGhvcml0eSBhbmQgZXhmaWx0cmF0ZSB0aGUgYmVhcmVyIHRva2VuIG9mZi1ob3N0LiBTYW1lXG4vLyBoYXJkZW5pbmcgYXBwbGllZCBhcyB0aGUgQ29kZXggcmV2aWV3IG9uIFBSICMxMjg0LlxuXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgT05FX1NFQ09ORF9NUyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy90aW1lLmpzXCI7XG5pbXBvcnQgeyB3b3Jrc3BhY2VSb290IH0gZnJvbSBcIi4vd29ya3NwYWNlLmpzXCI7XG5cbmNvbnN0IFRPS0VOX0ZJTEUgPSBcIi5zZXNzaW9uLXRva2VuXCI7XG5jb25zdCBQT1JUX0ZJTEUgPSBcIi5zZXJ2ZXItcG9ydFwiO1xuXG4vLyBJbiBEb2NrZXIgbW9kZSB0aGUgcGFyZW50IHNlcnZlciBsaXZlcyBvbiB0aGUgaG9zdCdzIDEyNy4wLjAuMVxuLy8gd2hpY2ggdGhlIGNvbnRhaW5lciBjYW4ndCByZWFjaCB2aWEgcGxhaW4gbG9vcGJhY2suIFRoZSBEb2NrZXJcbi8vIHNwYXduIHBsdW1iaW5nIHNldHMgTVVMTU9DTEFVREVfSE9TVD1ob3N0LmRvY2tlci5pbnRlcm5hbCBzb1xuLy8gZmV0Y2goKSByZXNvbHZlcyB0byB0aGUgaG9zdCBzZXJ2ZXIuIE91dHNpZGUgRG9ja2VyIChvciB3aGVuIHRoZVxuLy8gdmFyIGlzIHVuc2V0KSB3ZSBmYWxsIGJhY2sgdG8gdGhlIGxvb3BiYWNrIGFkZHJlc3MuXG5leHBvcnQgZnVuY3Rpb24gc2VydmVySG9zdCgpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuTVVMTU9DTEFVREVfSE9TVCA/PyBcIjEyNy4wLjAuMVwiO1xufVxuXG5mdW5jdGlvbiByZWFkU2lkZWNhcihyZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya3NwYWNlUm9vdCgpLCByZWwpLCBcInV0Zi04XCIpLnRyaW0oKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRUb2tlbigpOiBzdHJpbmcge1xuICByZXR1cm4gcmVhZFNpZGVjYXIoVE9LRU5fRklMRSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkUG9ydCgpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgcmF3ID0gcmVhZFNpZGVjYXIoUE9SVF9GSUxFKTtcbiAgaWYgKCFyYXcpIHJldHVybiBudWxsO1xuICBjb25zdCBwb3J0ID0gTnVtYmVyLnBhcnNlSW50KHJhdywgMTApO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwb3J0KSAmJiBwb3J0ID4gMCAmJiBwb3J0IDwgNjU1MzYgPyBwb3J0IDogbnVsbDtcbn1cblxuLy8gQnVpbGQgYW4gYXV0aGVudGljYXRlZCBQT1NUIHJlcXVlc3QgYWdhaW5zdCB0aGUgcGFyZW50IHNlcnZlci5cbi8vIFJldHVybnMgbnVsbCB3aGVuIHRva2VuIC8gcG9ydCBhcmUgbWlzc2luZyAoc2VydmVyIGlzbid0IHVwIHlldCk7XG4vLyBjYWxsZXIgdHJlYXRzIG51bGwgYXMgYSBzaWxlbnQgbm8tb3Agc28gYSBvbmUtb2ZmIGhvb2sgbWlzc1xuLy8gZHVyaW5nIHN0YXJ0dXAgZG9lc24ndCBzdXJmYWNlIGFzIGEgdG9vbCBlcnJvci5cbi8vIGBQYXJhbWV0ZXJzPHR5cGVvZiBmZXRjaD5bMV1gIGRlcml2ZXMgdGhlIHJlcXVlc3QtaW5pdCBzaGFwZVxuLy8gZnJvbSB0aGUgZ2xvYmFsIGBmZXRjaGAgdHlwZSByYXRoZXIgdGhhbiBuYW1pbmcgYFJlcXVlc3RJbml0YFxuLy8gZGlyZWN0bHkgXHUyMDE0IGtlZXBzIHRoZSBmaWxlIGxpbnQtY2xlYW4gdW5kZXIgb3VyIHNoYXJlZCBuby11bmRlZlxuLy8gY29uZmlnIHdpdGhvdXQgbmVlZGluZyBhIGN1c3RvbSBET00tdHlwZXMgdHNjb25maWcgZm9yIHRoZSBob29rXG4vLyBidW5kbGUuXG50eXBlIEZldGNoSW5pdCA9IFBhcmFtZXRlcnM8dHlwZW9mIGZldGNoPlsxXTtcblxuZXhwb3J0IGludGVyZmFjZSBQb3N0UmVxdWVzdCB7XG4gIHVybDogc3RyaW5nO1xuICBpbml0OiBGZXRjaEluaXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEF1dGhQb3N0KHBhdGhuYW1lOiBzdHJpbmcsIGJvZHk/OiB1bmtub3duKTogUG9zdFJlcXVlc3QgfCBudWxsIHtcbiAgY29uc3QgdG9rZW4gPSByZWFkVG9rZW4oKTtcbiAgY29uc3QgcG9ydCA9IHJlYWRQb3J0KCk7XG4gIGlmICghdG9rZW4gfHwgcG9ydCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gIH07XG4gIGNvbnN0IGluaXQ6IEZldGNoSW5pdCA9IHsgbWV0aG9kOiBcIlBPU1RcIiwgaGVhZGVycyB9O1xuICBpZiAoYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGluaXQuYm9keSA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuICB9XG4gIHJldHVybiB7XG4gICAgdXJsOiBgaHR0cDovLyR7c2VydmVySG9zdCgpfToke3BvcnR9JHtwYXRobmFtZX1gLFxuICAgIGluaXQsXG4gIH07XG59XG5cbi8vIDIgcyBkZWZhdWx0IHRpbWVvdXQuIFBvc3RUb29sVXNlIGhvb2tzIGJsb2NrIENsYXVkZSBDTEkncyB0b29sXG4vLyB0dXJuIHVudGlsIHRoZSBzY3JpcHQgZXhpdHMsIHNvIGEgc2xvdyAvIGh1bmcgcGFyZW50IHNlcnZlclxuLy8gKHJlZnJlc2ggZGVhZGxvY2ssIEdDIHBhdXNlLCB1bnJlbGF0ZWQgbG9uZy1ydW5uaW5nIHJvdXRlKSB3b3VsZFxuLy8gbGVhdmUgdGhlIHVzZXIncyBXcml0ZS9FZGl0IGFwcGVhcmluZyBmcm96ZW4uIFRoZSByZWZyZXNoLXN0eWxlXG4vLyBQT1NUcyBhcmUgZmlyZS1hbmQtZm9yZ2V0IGFueXdheTsgaWYgdGhlIHNlcnZlciBjYW4ndCByZXNwb25kXG4vLyBpbnNpZGUgdGhhdCB3aW5kb3csIHRoZSBmaWxlIGlzIGFscmVhZHkgb24gZGlzayBhbmQgdGhlIG5leHRcbi8vIHJlc3RhcnQgcGlja3MgaXQgdXAuXG5jb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSAyICogT05FX1NFQ09ORF9NUztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhZmVQb3N0KHJlcTogUG9zdFJlcXVlc3QgfCBudWxsLCB0aW1lb3V0TXMgPSBERUZBVUxUX1RJTUVPVVRfTVMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFyZXEpIHJldHVybjtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGltZW91dE1zKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmZXRjaChyZXEudXJsLCB7IC4uLnJlcS5pbml0LCBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBTZXJ2ZXIgbWlnaHQgYmUgcmVzdGFydGluZyAvIHVucmVhY2hhYmxlIC8gdGltZWQgb3V0IFx1MjAxNCBzaWxlbnRcbiAgICAvLyBmYWlsIGlzIGZpbmU7IHRoZSBmaWxlIGlzIG9uIGRpc2sgYW5kIHRoZSBuZXh0IG1hbnVhbCByZXN0YXJ0XG4gICAgLy8gcGlja3MgaXQgdXAuXG4gIH0gZmluYWxseSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgfVxufVxuXG4vLyBGb3J3YXJkIGEgc3RydWN0dXJlZCBsb2cgbGluZSBpbnRvIHRoZSBzZXJ2ZXIncyBsb2dnZXIgdmlhXG4vLyBgUE9TVCAvYXBpL2hvb2tzL2xvZ2AuIEhhbmRsZXJzIGNhbGwgdGhpcyBhZnRlciBlYWNoIG1lYW5pbmdmdWxcbi8vIHNpZGUtZWZmZWN0IChtaXJyb3IgY29weSwgZGVsZXRlLCBldGMuKSBzbyB0aGUgdXNlciBjYW4gdmVyaWZ5XG4vLyBmcm9tIHNlcnZlciBsb2dzIHRoYXQgdGhlIGhvb2sgZmlyZWQgYW5kIHdoYXQgaXQgZGlkLiBUaGUgZW5kcG9pbnRcbi8vIGF1dGhlbnRpY2F0ZXMgdmlhIGJlYXJlciB0b2tlbiAoc2FtZSBhcyBldmVyeSBvdGhlciBpbnRlcm5hbCBob29rXG4vLyBQT1NUKTsgYSBtaXNzaW5nIHRva2VuIC8gcG9ydCBpcyB0aGUgc2lsZW50IG5vLW9wIHNhZmVQb3N0XG4vLyBhbHJlYWR5IGhhbmRsZXMuIDEgcyB0aW1lb3V0IFx1MjAxNCBsb2dnaW5nIHNob3VsZG4ndCBzdGFsbCB0aGUgdXNlcidzXG4vLyB0b29sIHR1cm4gZXZlbiBpZiB0aGUgc2VydmVyIGlzIGJyaWVmbHkgc2xvdy5cbmNvbnN0IExPR19USU1FT1VUX01TID0gT05FX1NFQ09ORF9NUztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlcnZlckxvZyhuYW1lc3BhY2U6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBvcHRpb25zOiB7IGxldmVsPzogXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIjsgZGF0YT86IG9iamVjdCB9ID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYm9keSA9IHtcbiAgICBuYW1lc3BhY2UsXG4gICAgbWVzc2FnZSxcbiAgICBsZXZlbDogb3B0aW9ucy5sZXZlbCA/PyBcImluZm9cIixcbiAgICAuLi4ob3B0aW9ucy5kYXRhID8geyBkYXRhOiBvcHRpb25zLmRhdGEgfSA6IHt9KSxcbiAgfTtcbiAgY29uc3QgcmVxID0gYnVpbGRBdXRoUG9zdChcIi9hcGkvaG9va3MvbG9nXCIsIGJvZHkpO1xuICBhd2FpdCBzYWZlUG9zdChyZXEsIExPR19USU1FT1VUX01TKTtcbn1cbiIsICIvLyBDb21tb24gdGltZSBjb25zdGFudHMgaW4gbWlsbGlzZWNvbmRzLiBBdm9pZHMgbWFnaWMgbnVtYmVycyBsaWtlXG4vLyAzXzYwMF8wMDAgc2NhdHRlcmVkIGFjcm9zcyB0aGUgY29kZWJhc2UuXG4vL1xuLy8gQWxsIHNlcnZlci1zaWRlIGNvZGUgc2hvdWxkIGltcG9ydCBmcm9tIGhlcmUgaW5zdGVhZCBvZiB1c2luZyByYXdcbi8vIG51bWVyaWMgbGl0ZXJhbHMuIFdoZW4gYSBzcGVjaWZpYyBkdXJhdGlvbiBpcyBuZWVkZWQgKGUuZy4gYVxuLy8gNS1zZWNvbmQgdGltZW91dCksIGV4cHJlc3MgaXQgYXMgYDUgKiBPTkVfU0VDT05EX01TYC5cblxuZXhwb3J0IGNvbnN0IE9ORV9TRUNPTkRfTVMgPSAxXzAwMDtcbmV4cG9ydCBjb25zdCBPTkVfTUlOVVRFX01TID0gNjBfMDAwO1xuZXhwb3J0IGNvbnN0IE9ORV9IT1VSX01TID0gM182MDBfMDAwO1xuZXhwb3J0IGNvbnN0IE9ORV9EQVlfTVMgPSA4Nl80MDBfMDAwO1xuXG4vKiogTWFwIHRpbWUtdW5pdCBzdWZmaXhlcyAocy9tL2gpIHRvIG1pbGxpc2Vjb25kcy4gKi9cbmV4cG9ydCBjb25zdCBUSU1FX1VOSVRfTVM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gIHM6IE9ORV9TRUNPTkRfTVMsXG4gIG06IE9ORV9NSU5VVEVfTVMsXG4gIGg6IE9ORV9IT1VSX01TLFxufTtcblxuLy8gXHUyNTAwXHUyNTAwIENvbW1vbiB0aW1lb3V0IHByZXNldHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vLyBOYW1lZCB0aW1lb3V0cyBmb3IgcmVjdXJyaW5nIHBhdHRlcm5zLiBQcmVmZXIgdGhlc2Ugb3ZlciBpbmxpbmVcbi8vIGA1ICogT05FX1NFQ09ORF9NU2Agd2hlbiB0aGUgc2FtZSB2YWx1ZSBpcyB1c2VkIGluIDMrIHBsYWNlcy5cblxuLyoqIFF1aWNrIHN1YnByb2Nlc3MgcHJvYmUgKGRvY2tlciBwcywgbGlicmVvZmZpY2UgLS12ZXJzaW9uLCBldGMuKSAqL1xuZXhwb3J0IGNvbnN0IFNVQlBST0NFU1NfUFJPQkVfVElNRU9VVF9NUyA9IDUgKiBPTkVfU0VDT05EX01TO1xuXG4vKiogRGVib3VuY2Ugd2luZG93IGZvciBkZXYtcGx1Z2luIGBkaXN0L2Agd2F0Y2hlciAoIzExNTkgUFIzKS4gVml0ZVxuICogIHdyaXRlcyA0LTUgZmlsZXMgd2l0aGluIH4xMDBtcyBvbiBhIHNpbmdsZSByZWJ1aWxkOyAzMDBtcyBjb2xsYXBzZXNcbiAqICB0aGUgYnVyc3QgaW50byBvbmUgcHVibGlzaC4gKi9cbmV4cG9ydCBjb25zdCBERVZfUExVR0lOX1dBVENIX0RFQk9VTkNFX01TID0gMzAwO1xuXG4vKiogSGFyZCBjYXAgb24gaG93IGxvbmcgdGhlIHN0YXJ0dXAtZmFpbHVyZSBwYXRoIHdhaXRzIGZvclxuICogIGBodHRwU2VydmVyLmNsb3NlKClgIHRvIGRyYWluIGluLWZsaWdodCBjb25uZWN0aW9ucyBiZWZvcmVcbiAqICBmb3JjaW5nIGBwcm9jZXNzLmV4aXQoMSlgLiBTU0Ugc3RyZWFtcyArIFdlYlNvY2tldCB1cGdyYWRlcyBob2xkXG4gKiAgY29ubmVjdGlvbnMgb3BlbiBpbmRlZmluaXRlbHksIHNvIHRoZSBncmFjZWZ1bCBjbG9zZSBhbG9uZSBpc24ndFxuICogIGEgZmFpbC1mYXN0IGd1YXJhbnRlZS4gKi9cbmV4cG9ydCBjb25zdCBTVEFSVFVQX0ZBSUxVUkVfRk9SQ0VfRVhJVF9NUyA9IDUgKiBPTkVfU0VDT05EX01TO1xuXG4vKiogSGVhdnkgc3VicHJvY2VzcyB3b3JrIChsaWJyZW9mZmljZSBjb252ZXJzaW9uLCBldGMuKSAqL1xuZXhwb3J0IGNvbnN0IFNVQlBST0NFU1NfV09SS19USU1FT1VUX01TID0gT05FX01JTlVURV9NUztcblxuLyoqIENMSSBzdWJwcm9jZXNzIHRpbWVvdXQgKGNsYXVkZSAtcCBmb3Igc3VtbWFyaXphdGlvbiwgZXRjLikgKi9cbmV4cG9ydCBjb25zdCBDTElfU1VCUFJPQ0VTU19USU1FT1VUX01TID0gNSAqIE9ORV9NSU5VVEVfTVM7XG5cbi8qKiBNYXhpbXVtIG9uZS1zaG90IG5vdGlmaWNhdGlvbiBkZWxheSAqL1xuZXhwb3J0IGNvbnN0IE1BWF9OT1RJRklDQVRJT05fREVMQVlfU0VDID0gM182MDA7IC8vIDEgaG91ciBpbiBzZWNvbmRzXG4iLCAiLy8gV29ya3NwYWNlIHJvb3QgcmVzb2x1dGlvbiBmb3IgaG9vayBzY3JpcHRzLlxuLy9cbi8vIGBDTEFVREVfUFJPSkVDVF9ESVJgIGlzIHNldCBieSBDbGF1ZGUgQ0xJIHRvIHRoZSB3b3Jrc3BhY2Ugcm9vdFxuLy8gdGhlIGhvb2sgZmlyZWQgYWdhaW5zdCBcdTIwMTQgdGhpcyBpcyB0aGUgdmFsdWUgd2UgdHJ1c3QgYXQgcnVudGltZS5cbi8vIEZhbGxpbmcgYmFjayB0byBgfi9tdWxtb2NsYXVkZWAga2VlcHMgdGhlIHNjcmlwdCByb2J1c3Qgd2hlbiBydW5cbi8vIG91dHNpZGUgQ0xJIGNvbnRleHQgKHRlc3QgaGFybmVzcywgbWFudWFsIHJlcHJvZHVjdGlvbikuXG5cbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gd29ya3NwYWNlUm9vdCgpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuQ0xBVURFX1BST0pFQ1RfRElSID8/IHBhdGguam9pbihob21lZGlyKCksIFwibXVsbW9jbGF1ZGVcIik7XG59XG4iLCAiLy8gUmVhZCB0aGUgSlNPTiBQb3N0VG9vbFVzZSBwYXlsb2FkIENsYXVkZSBDTEkgc3RyZWFtcyBvbiBzdGRpbi5cbi8vIFJldHVybnMgdGhlIHBhcnNlZCBwYXlsb2FkIG9yIG51bGwgd2hlbiB0aGUgaW5wdXQgaXMgZW1wdHkgL1xuLy8gbWFsZm9ybWVkIFx1MjAxNCB0aGUgZGlzcGF0Y2hlciB0cmVhdHMgbnVsbCBhcyBhIGZhc3Qgbm8tb3Agc28gYSBob29rXG4vLyBmaXJlZCB3aXRoIG5vIGJvZHkgbmV2ZXIgY3Jhc2hlcyB0aGUgdXNlcidzIHRvb2wgdHVybi5cblxuZXhwb3J0IGludGVyZmFjZSBIb29rUGF5bG9hZCB7XG4gIHRvb2xfbmFtZT86IHVua25vd247XG4gIHRvb2xfaW5wdXQ/OiB7XG4gICAgZmlsZV9wYXRoPzogdW5rbm93bjtcbiAgICBjb21tYW5kPzogdW5rbm93bjtcbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICB9O1xuICB0b29sX3Jlc3BvbnNlPzoge1xuICAgIGZpbGVQYXRoPzogdW5rbm93bjtcbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICB9O1xuICBzZXNzaW9uX2lkPzogdW5rbm93bjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRIb29rUGF5bG9hZCgpOiBQcm9taXNlPEhvb2tQYXlsb2FkIHwgbnVsbD4ge1xuICBjb25zdCBjaHVua3M6IEJ1ZmZlcltdID0gW107XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcHJvY2Vzcy5zdGRpbikge1xuICAgIGNodW5rcy5wdXNoKHR5cGVvZiBjaHVuayA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGNodW5rKSA6IGNodW5rKTtcbiAgfVxuICBjb25zdCByYXcgPSBCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgaWYgKCFyYXcudHJpbSgpKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpIGFzIEhvb2tQYXlsb2FkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBEaWZmZXJlbnQgdG9vbHMgc3VyZmFjZSB0aGUgcGF0aCB1bmRlciBkaWZmZXJlbnQga2V5cyAoV3JpdGUvRWRpdFxuLy8gdXNlIHRvb2xfaW5wdXQuZmlsZV9wYXRoOyB0aGUgcmVzcG9uc2Ugc2hhcGUgdXNlcyBmaWxlUGF0aCkuIFRoZVxuLy8gaGVscGVyIGNoZWNrcyBib3RoIGRlZmVuc2l2ZWx5IHNvIGhhbmRsZXJzIGRvbid0IG5lZWQgdG8uXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEZpbGVQYXRoKHBheWxvYWQ6IEhvb2tQYXlsb2FkKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbUlucHV0ID0gcGF5bG9hZC50b29sX2lucHV0Py5maWxlX3BhdGg7XG4gIGlmICh0eXBlb2YgZnJvbUlucHV0ID09PSBcInN0cmluZ1wiKSByZXR1cm4gZnJvbUlucHV0O1xuICBjb25zdCBmcm9tUmVzcG9uc2UgPSBwYXlsb2FkLnRvb2xfcmVzcG9uc2U/LmZpbGVQYXRoO1xuICBpZiAodHlwZW9mIGZyb21SZXNwb25zZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGZyb21SZXNwb25zZTtcbiAgcmV0dXJuIFwiXCI7XG59XG5cbi8vIEJhc2ggdG9vbCBjYWxscyBwdXQgdGhlIHNoZWxsIGNvbW1hbmQgc3RyaW5nIGluIHRvb2xfaW5wdXQuY29tbWFuZC5cbi8vIEVtcHR5IHN0cmluZyB3aGVuIHRoZSBwYXlsb2FkIGlzIGEgbm9uLUJhc2ggdG9vbCBvciBtYWxmb3JtZWQuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdENvbW1hbmQocGF5bG9hZDogSG9va1BheWxvYWQpOiBzdHJpbmcge1xuICBjb25zdCBjb21tYW5kID0gcGF5bG9hZC50b29sX2lucHV0Py5jb21tYW5kO1xuICByZXR1cm4gdHlwZW9mIGNvbW1hbmQgPT09IFwic3RyaW5nXCIgPyBjb21tYW5kIDogXCJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RUb29sTmFtZShwYXlsb2FkOiBIb29rUGF5bG9hZCk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgcGF5bG9hZC50b29sX25hbWUgPT09IFwic3RyaW5nXCIgPyBwYXlsb2FkLnRvb2xfbmFtZSA6IFwiXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0U2Vzc2lvbklkKHBheWxvYWQ6IEhvb2tQYXlsb2FkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2Vzc2lvbklkID0gcGF5bG9hZC5zZXNzaW9uX2lkO1xuICByZXR1cm4gdHlwZW9mIHNlc3Npb25JZCA9PT0gXCJzdHJpbmdcIiAmJiBzZXNzaW9uSWQubGVuZ3RoID4gMCA/IHNlc3Npb25JZCA6IHVuZGVmaW5lZDtcbn1cbiIsICIvLyBDb25maWctcmVmcmVzaCBoYW5kbGVyIFx1MjAxNCBmaXJlcyBhZnRlciBXcml0ZS9FZGl0IG9uIGZpbGVzIHRoYXRcbi8vIGRyaXZlIHdvcmtzcGFjZSBzdGF0ZSB0aGUgcGFyZW50IHNlcnZlciBob3QtcmVsb2Fkczpcbi8vXG4vLyAgIDx3cz4vLmNsYXVkZS9za2lsbHMvPHNsdWc+L1NLSUxMLm1kICAgKG1hbnVhbCBlZGl0cyB0byBjYW5vbmljYWwgc2tpbGxzKVxuLy8gICA8d3M+L2NvbmZpZy9zY2hlZHVsZXIvdGFza3MuanNvbiAgICAgICh1c2VyLXRhc2sgc2NoZWR1bGVyIGNvbmZpZylcbi8vXG4vLyBQT1NUcyAvYXBpL2NvbmZpZy9yZWZyZXNoIHNvIHRoZSBjaGFuZ2UgYWN0aXZhdGVzIHdpdGhvdXQgYSBzZXJ2ZXJcbi8vIHJlc3RhcnQuIE1pZ3JhdGVkIGZyb20gYHNlcnZlci93b3Jrc3BhY2UvY29uZmlnLXJlZnJlc2gvaG9vay5tanNgLlxuLy9cbi8vIE5PVEUgb24gc3RhZ2luZyBza2lsbHMgKGBkYXRhL3NraWxscy88c2x1Zz4vU0tJTEwubWRgKTpcbi8vIFRoZSBzdGFnaW5nIHBhdGggaXMgSU5URU5USU9OQUxMWSBleGNsdWRlZCBmcm9tIFBBVFRFUk5TIGhlcmUuXG4vLyBSZWZyZXNoaW5nIG9uIHRoZSBzdGFnaW5nIHdyaXRlIHdvdWxkIHJhY2Ugd2l0aCBgc2tpbGxCcmlkZ2VgJ3Ncbi8vIG1pcnJvciBjb3B5IFx1MjAxNCBgL2FwaS9jb25maWcvcmVmcmVzaGAgY291bGQgbGFuZCBiZWZvcmUgdGhlIGNhbm9uaWNhbFxuLy8gZmlsZSBpcyB3cml0dGVuLCBsZWF2aW5nIGEgZnJlc2ggc2tpbGwgdW5yZWdpc3RlcmVkIHVudGlsIHRoZSBuZXh0XG4vLyByZXN0YXJ0LiBgc2tpbGxCcmlkZ2VgIG93bnMgaXRzIG93biByZWZyZXNoIHRyaWdnZXIgYW5kIGZpcmVzIGl0XG4vLyBBRlRFUiB0aGUgbWlycm9yIHN1Y2NlZWRzLCBzbyB0aGUgb3JkZXJpbmcgaXMgZGV0ZXJtaW5pc3RpYy5cblxuaW1wb3J0IHsgYnVpbGRBdXRoUG9zdCwgc2FmZVBvc3QgfSBmcm9tIFwiLi4vc2hhcmVkL3NpZGVjYXIuanNcIjtcbmltcG9ydCB0eXBlIHsgSG9va1BheWxvYWQgfSBmcm9tIFwiLi4vc2hhcmVkL3N0ZGluLmpzXCI7XG5pbXBvcnQgeyBleHRyYWN0RmlsZVBhdGgsIGV4dHJhY3RUb29sTmFtZSB9IGZyb20gXCIuLi9zaGFyZWQvc3RkaW4uanNcIjtcblxuLy8gRWFjaCBwYXR0ZXJuIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgYWJzb2x1dGUgcGF0aCB0aGUgQ0xJXG4vLyBkZWxpdmVyZWQuIFdpbmRvd3MgcGF0aCBzZXBhcmF0b3JzIGFyZSB0b2xlcmF0ZWQgZm9yIGNyb3NzLVxuLy8gcGxhdGZvcm0gcm9idXN0bmVzcyBldmVuIHRob3VnaCB0aGUgaG9zdCBpcyBjdXJyZW50bHkgZGFyd2luIC9cbi8vIGxpbnV4IG9ubHkuXG5jb25zdCBQQVRURVJOUyA9IFsvW1xcXFwvXVxcLmNsYXVkZVtcXFxcL11za2lsbHNbXFxcXC9dW15cXFxcL10rW1xcXFwvXVNLSUxMXFwubWQkLywgL1tcXFxcL11jb25maWdbXFxcXC9dc2NoZWR1bGVyW1xcXFwvXXRhc2tzXFwuanNvbiQvXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNvbmZpZ1JlZnJlc2gocGF5bG9hZDogSG9va1BheWxvYWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdG9vbCA9IGV4dHJhY3RUb29sTmFtZShwYXlsb2FkKTtcbiAgaWYgKHRvb2wgIT09IFwiV3JpdGVcIiAmJiB0b29sICE9PSBcIkVkaXRcIikgcmV0dXJuO1xuXG4gIGNvbnN0IGZpbGVQYXRoID0gZXh0cmFjdEZpbGVQYXRoKHBheWxvYWQpO1xuICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG4gIGlmICghUEFUVEVSTlMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGZpbGVQYXRoKSkpIHJldHVybjtcblxuICBjb25zdCByZXEgPSBidWlsZEF1dGhQb3N0KFwiL2FwaS9jb25maWcvcmVmcmVzaFwiKTtcbiAgYXdhaXQgc2FmZVBvc3QocmVxKTtcbn1cbiIsICIvLyBTa2lsbC1icmlkZ2UgaGFuZGxlciBcdTIwMTQgYWdlbnQgd3JpdGVzIHNraWxsIGRyYWZ0cyB0b1xuLy8gYGRhdGEvc2tpbGxzLzxzbHVnPi9TS0lMTC5tZGAgKGEgcGxhaW4gZGF0YSBkaXIsIG5vIHBlcm1pc3Npb25cbi8vIHNwZWNpYWwgY2FzZSkgYW5kIHRoaXMgaG9vayBtaXJyb3JzIHRoZW0gaW50b1xuLy8gYC5jbGF1ZGUvc2tpbGxzLzxzbHVnPi9TS0lMTC5tZGAgc28gQ2xhdWRlIENMSSdzIHNraWxsIGRpc2NvdmVyeVxuLy8gcGlja3MgdGhlbSB1cC5cbi8vXG4vLyBXaHkgYSBicmlkZ2U6IENsYXVkZSBDb2RlJ3MgcGVybWlzc2lvbiBzeXN0ZW0gZ2l2ZXMgYC5jbGF1ZGUvYFxuLy8gc3RyaWN0ZXIgc2NydXRpbnkgdGhhbiBvcmRpbmFyeSBjd2Qgc3ViZGlycyAodGhlIGRpciBob2xkcyB0aGVcbi8vIGFnZW50J3Mgb3duIHNraWxscyAvIGhvb2tzIC8gc2V0dGluZ3MsIHNvIHdyaXRlcyB0aGVyZSBhcmUgYVxuLy8gc2VsZi1tb2RpZmljYXRpb24gcmlzaykuIEV2ZW4gd2l0aCBleHBsaWNpdCBgV3JpdGUoLmNsYXVkZS8qKilgXG4vLyBhbGxvdyBydWxlcyBpbiB3b3Jrc3BhY2Ugc2V0dGluZ3MuanNvbiwgd3JpdGVzIHByb21wdCBcdTIwMTQgYW5kIHRoZVxuLy8gaG9zdCBHVUkgaGFzIG5vIHN1cmZhY2UgdG8gYW5zd2VyIHRoZSBwcm9tcHQuIFJvdXRpbmcgd3JpdGVzXG4vLyB0aHJvdWdoIGBkYXRhL3NraWxscy9gIGF2b2lkcyB0aGUgZ2F0ZTsgdGhpcyBob29rIChhIHJlZ3VsYXJcbi8vIHN1YnByb2Nlc3MsIE5PVCBhIENsYXVkZSB0b29sIGNhbGwpIGRvZXMgdGhlIG1pcnJvciBjb3B5IGFuZCBpc1xuLy8gbm90IHN1YmplY3QgdG8gdGhlIGdhdGUuXG4vL1xuLy8gV2h5IG1pcnJvciBhcyBgPHNsdWc+L1NLSUxMLm1kYCAobm90IGZsYXQgYDxzbHVnPi5tZGApOiBDbGF1ZGVcbi8vIENMSSdzIGNhbm9uaWNhbCBza2lsbCBsYXlvdXQgSVMgdGhlIG5lc3RlZCBmb3JtLCBhbmQgdGhlIGFnZW50XG4vLyBuYXR1cmFsbHkgd3JpdGVzIHRoYXQgc2hhcGUuIEEgZmxhdCBzdGFnaW5nIHBhdGggZm9yY2VkIHRoZSBhZ2VudFxuLy8gdG8gcmVhc29uIGFnYWluc3QgaXRzIG93biB0cmFpbmluZywgbWlzc2VkIHRoZSByZWdleCwgYW5kIHRoZVxuLy8gbWlycm9yIHNpbGVudGx5IG5ldmVyIGZpcmVkLiBNaXJyb3JpbmcgMToxIGtlZXBzIHRoZSBwYXRoIG1hdGhcbi8vIHRyaXZpYWwgZm9yIGJvdGggc2lkZXMuXG4vL1xuLy8gTWlycm9yIG9wZXJhdGlvbnM6XG4vL1xuLy8gICBXcml0ZS9FZGl0IGRhdGEvc2tpbGxzLzxzbHVnPi9TS0lMTC5tZFxuLy8gICAgIFx1MjE5MiBjb3B5IGNvbnRlbnQgdG8gLmNsYXVkZS9za2lsbHMvPHNsdWc+L1NLSUxMLm1kXG4vLyAgICAgICAoY3JlYXRlcyB0aGUgcGFyZW50IGRpciBvbiBmaXJzdCBpbnN0YWxsKVxuLy9cbi8vICAgQmFzaCBcInJtIC1yZiBkYXRhL3NraWxscy88c2x1Zz4vXCIgb3IgXCJybSAtcmYgZGF0YS9za2lsbHMvPHNsdWc+XCJcbi8vICAgICBcdTIxOTIgcm0gLXJmIC5jbGF1ZGUvc2tpbGxzLzxzbHVnPi9cbi8vICAgICAgIChyZWdleC1tYXRjaGVkIHNvIHRoZSBhZ2VudCdzIGludGVudCBpcyB1bmFtYmlndW91cztcbi8vICAgICAgICBhIGJ1bGsgYHJtIC1yZiBkYXRhL3NraWxscy9gIG9yIHdpbGRjYXJkcyBhcmUgaW50ZW50aW9uYWxseVxuLy8gICAgICAgIE5PVCBtaXJyb3JlZCB0byBhdm9pZCBtYXNzIGRlbGV0aW9uIHN1cnByaXNlcylcblxuaW1wb3J0IHsgbWtkaXJTeW5jLCByZWFkRmlsZVN5bmMsIHJlbmFtZVN5bmMsIHJtU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBidWlsZEF1dGhQb3N0LCBzYWZlUG9zdCwgc2VydmVyTG9nIH0gZnJvbSBcIi4uL3NoYXJlZC9zaWRlY2FyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEhvb2tQYXlsb2FkIH0gZnJvbSBcIi4uL3NoYXJlZC9zdGRpbi5qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdENvbW1hbmQsIGV4dHJhY3RGaWxlUGF0aCwgZXh0cmFjdFRvb2xOYW1lIH0gZnJvbSBcIi4uL3NoYXJlZC9zdGRpbi5qc1wiO1xuaW1wb3J0IHsgd29ya3NwYWNlUm9vdCB9IGZyb20gXCIuLi9zaGFyZWQvd29ya3NwYWNlLmpzXCI7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvZXJyb3JzLmpzXCI7XG5cbmNvbnN0IERBVEFfU0tJTExTX0RJUiA9IHBhdGguam9pbihcImRhdGFcIiwgXCJza2lsbHNcIik7XG5jb25zdCBDTEFVREVfU0tJTExTX0RJUiA9IHBhdGguam9pbihcIi5jbGF1ZGVcIiwgXCJza2lsbHNcIik7XG5jb25zdCBTS0lMTF9GSUxFTkFNRSA9IFwiU0tJTEwubWRcIjtcblxuLy8gU2x1Z3MgZm9sbG93IENsYXVkZSBDb2RlJ3Mgc2tpbGwtbmFtZSBjb252ZW50aW9uOiBsb3dlcmNhc2UgQVNDSUlcbi8vIGxldHRlcnMgLyBkaWdpdHMgd2l0aCBzaW5nbGUtaHlwaGVuIHNlcGFyYXRvcnMuIE1hdGNoaW5nIGlzXG4vLyBzdHJpY3Qgc28gYSB0eXBvIG9yIHBhdGggdHJhdmVyc2FsIGF0dGVtcHQgKGAuLi9mb29gKSBuZXZlclxuLy8gcmVhY2hlcyB0aGUgZGVzdGluYXRpb24gcGF0aCBtYXRoLlxuLy9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3QtdW5zYWZlLXJlZ2V4IC0tIGlucHV0IGlzIGFsd2F5cyBhIGJhc2VuYW1lIHNsaWNlIFx1MjI2NCA2NCBjaGFycywgc28gdGhlIHRoZW9yZXRpY2FsIHdvcnN0LWNhc2UgYmFja3RyYWNraW5nIGlzIGJvdW5kZWQ7IHRoaXMgaXMgdGhlIGNhbm9uaWNhbCBrZWJhYi1jYXNlIHBhdHRlcm4gdXNlZCBhY3Jvc3MgdGhlIHNraWxsIHRvb2xjaGFpbi5cbmNvbnN0IFNMVUdfUkUgPSAvXlthLXowLTldKygtW2EtejAtOV0rKSokLztcblxuLy8gYHJtIC1yZiBkYXRhL3NraWxscy88c2x1Zz5gIHJlZ2V4LiBDYXB0dXJlcyB0aGUgZmxhZyBydW4gYXNcbi8vIGBtYXRjaFsxXWAgc28gdGhlIGNhbGxlciBjYW4gcG9zdC12YWxpZGF0ZSB0aGF0IHRoZSB1c2VyIHBhc3NlZFxuLy8gYSByZWN1cnNpdmUgZmxhZyAoYC1yYCwgYC1SYCwgYC1yZmAsIGAtZnJgLCBcdTIwMjYpLiBUb2xlcmF0ZXMgb3B0aW9uYWxcbi8vIHRyYWlsaW5nIHNsYXNoIGFuZCBvcHRpb25hbCBxdW90aW5nIGFyb3VuZCB0aGUgcGF0aC4gQSBsaXRlcmFsXG4vLyBgcm0gLXJmIGRhdGEvc2tpbGxzYCAodGhlIHBhcmVudCBkaXIgaXRzZWxmKSBvciBwYXRocyB3aXRoXG4vLyB3aWxkY2FyZHMgLyBzaGVsbCBleHBhbnNpb24gYXJlIGludGVudGlvbmFsbHkgTk9UIG1hdGNoZWQuXG4vL1xuLy8gUmVjdXJzaXZlLWZsYWcgZW5mb3JjZW1lbnQgKENvZGV4IHJldmlldyBvbiB0aGlzIFBSKTogcGxhaW4gYHJtYFxuLy8gb3IgYHJtIC1mYCBjYW5ub3QgcmVtb3ZlIGEgZGlyZWN0b3J5LCBzbyB0aGUgc3RhZ2luZyBkZWxldGUgZmFpbHNcbi8vIHNpbGVudGx5IHdoaWxlIHRoZSBjYW5vbmljYWwgZGVsZXRlIHN0aWxsIHJ1bnMgXHUyMDE0IGRlc3luY2luZyB0aGVcbi8vIHR3byB0cmVlcy4gUmVxdWlyaW5nIGF0IGxlYXN0IG9uZSBgcmAgLyBgUmAgaW4gdGhlIGZsYWdzIHJlamVjdHNcbi8vIHRob3NlIGZvcm1zIG91dHJpZ2h0LlxuLy9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3QtdW5zYWZlLXJlZ2V4IC0tIHRoZSBgKC1bYS16MC05XSspKmAgc2x1ZyBjbGF1c2UgaXMgYm91bmRlZCBieSB0aGUgcGF0aCB0YWlsIGFuZCB0aGUgaW5wdXQgaXMgYSBzaW5nbGUtbGluZSBCYXNoIGNvbW1hbmQgQ2xhdWRlIENMSSBjYXB0dXJlZDsgbm8gcGF0aG9sb2dpY2FsIGJhY2t0cmFja2luZyBzdXJmYWNlLlxuY29uc3QgUk1fUkUgPSAvXlxccypybVxccysoKD86LVthLXpBLVpdK1xccyspKylbJ1wiXT9kYXRhXFwvc2tpbGxzXFwvKFthLXowLTktXSspXFwvP1snXCJdP1xccyokLztcbmNvbnN0IFJFQ1VSU0lWRV9GTEFHX1JFID0gL1tyUl0vO1xuXG4vLyBQdXJlIGhlbHBlcnMgZXhwb3J0ZWQgZm9yIHVuaXQgdGVzdGluZy4gU291cmNlIHBhdGhzIHN0YXkgcmVsYXRpdmVcbi8vIHRvIHRoZSB3b3Jrc3BhY2Ugcm9vdCByZXNvbHZlZCBhdCBjYWxsIHRpbWUgc28gdGhlIGhhbmRsZXIgaXNcbi8vIHNhZmUgdG8gcnVuIGZyb20gYW55IGN3ZC5cblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFTa2lsbERpcihzbHVnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKHdvcmtzcGFjZVJvb3QoKSwgREFUQV9TS0lMTFNfRElSLCBzbHVnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFTa2lsbEZpbGVQYXRoKHNsdWc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4oZGF0YVNraWxsRGlyKHNsdWcpLCBTS0lMTF9GSUxFTkFNRSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGF1ZGVTa2lsbERpcihzbHVnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKHdvcmtzcGFjZVJvb3QoKSwgQ0xBVURFX1NLSUxMU19ESVIsIHNsdWcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xhdWRlU2tpbGxGaWxlUGF0aChzbHVnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKGNsYXVkZVNraWxsRGlyKHNsdWcpLCBTS0lMTF9GSUxFTkFNRSk7XG59XG5cbi8vIEV4dHJhY3QgdGhlIHNsdWcgZnJvbSBhIFdyaXRlL0VkaXQgb24gYVxuLy8gYGRhdGEvc2tpbGxzLzxzbHVnPi9TS0lMTC5tZGAgcGF0aC4gUmV0dXJucyBudWxsIHdoZW46XG4vLyAgIC0gdGhlIHBhdGggZG9lc24ndCBzaXQgZGlyZWN0bHkgdW5kZXIgZGF0YS9za2lsbHMvPHNsdWc+L1xuLy8gICAtIHRoZSBmaWxlbmFtZSBpc24ndCBTS0lMTC5tZFxuLy8gICAtIHRoZSBzbHVnIGlzbid0IGEgdmFsaWQga2ViYWItY2FzZSBpZGVudGlmaWVyXG4vL1xuLy8gU2libGluZyBmaWxlcyBpbiB0aGUgc2FtZSBkaXIgKGUuZy4gZGF0YS9za2lsbHMvPHNsdWc+L1JFQURNRS5tZFxuLy8gb3IgZGF0YS9za2lsbHMvPHNsdWc+L2Fzc2V0cy9mb28ucG5nKSBhcmUgaW50ZW50aW9uYWxseSBOT1Rcbi8vIGJyaWRnZWQgXHUyMDE0IG9ubHkgdGhlIGNhbm9uaWNhbCBTS0lMTC5tZCBjcm9zc2VzIG92ZXIuIFNraWxsIGF1dGhvcnNcbi8vIGNhbiBrZWVwIGV4dHJhIG1hdGVyaWFsIHN0YWdpbmctc2lkZSB1bnRpbCB0aGV5IGRlY2lkZSB3aGF0XG4vLyBiZWxvbmdzIGluIHRoZSBidW5kbGUuXG5leHBvcnQgZnVuY3Rpb24gc2x1Z0Zyb21EYXRhUGF0aChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHJvb3QgPSB3b3Jrc3BhY2VSb290KCk7XG4gIGNvbnN0IHN0YWdpbmcgPSBwYXRoLmpvaW4ocm9vdCwgREFUQV9TS0lMTFNfRElSKTtcbiAgY29uc3QgcmVsID0gcGF0aC5yZWxhdGl2ZShzdGFnaW5nLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsIHx8IHJlbC5zdGFydHNXaXRoKFwiLi5cIikpIHJldHVybiBudWxsO1xuICAvLyBFeHBlY3QgZXhhY3RseSBgPHNsdWc+L1NLSUxMLm1kYCBcdTIwMTQgdHdvIHNlZ21lbnRzIGRlZXAuXG4gIGNvbnN0IHNlZ21lbnRzID0gcmVsLnNwbGl0KHBhdGguc2VwKTtcbiAgaWYgKHNlZ21lbnRzLmxlbmd0aCAhPT0gMikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IFtzbHVnLCBiYXNlbmFtZV0gPSBzZWdtZW50cztcbiAgaWYgKGJhc2VuYW1lICE9PSBTS0lMTF9GSUxFTkFNRSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBTTFVHX1JFLnRlc3Qoc2x1ZykgPyBzbHVnIDogbnVsbDtcbn1cblxuLy8gRXh0cmFjdCB0aGUgc2x1ZyBmcm9tIGEgQmFzaCBgcm0gLXJmIGRhdGEvc2tpbGxzLzxzbHVnPi9gIGNvbW1hbmQuXG4vLyBSZXR1cm5zIG51bGwgb24gYW55IG1pc21hdGNoIFx1MjAxNCB3aWxkY2FyZHMsIHBhdGhzIG91dHNpZGUgdGhlXG4vLyBzdGFnaW5nIGRpciwgb3Igbm9uLXJlY3Vyc2l2ZSBgcm1gIC8gYHJtIC1mYCAod2hpY2ggY2FuJ3QgZGVsZXRlXG4vLyB0aGUgc3RhZ2luZyBkaXIgYW55d2F5LCBzbyBtaXJyb3Jpbmcgd291bGQgZGVzeW5jKSBhcmUgYWxsXG4vLyBpbnRlbnRpb25hbGx5IHJlamVjdGVkLlxuZXhwb3J0IGZ1bmN0aW9uIHNsdWdGcm9tUm1Db21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtYXRjaCA9IFJNX1JFLmV4ZWMoY29tbWFuZCk7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuICBjb25zdCBbLCBmbGFncywgc2x1Z10gPSBtYXRjaDtcbiAgaWYgKCFSRUNVUlNJVkVfRkxBR19SRS50ZXN0KGZsYWdzKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBTTFVHX1JFLnRlc3Qoc2x1ZykgPyBzbHVnIDogbnVsbDtcbn1cblxuLy8gQXRvbWljIG1pcnJvcjogd3JpdGUgdG8gYSB0bXAgZmlsZSBpbiB0aGUgZGVzdGluYXRpb24gZGlyLCB0aGVuXG4vLyByZW5hbWUgb250byB0aGUgY2Fub25pY2FsIHBhdGguIGBmcy5yZW5hbWVTeW5jYCBpcyBhdG9taWMgb24gUE9TSVhcbi8vIHdoZW4gc291cmNlICsgZGVzdGluYXRpb24gc2hhcmUgYSBmaWxlc3lzdGVtIChhbHdheXMgdHJ1ZSBoZXJlIFx1MjAxNFxuLy8gYm90aCBhcmUgaW5zaWRlIGAuY2xhdWRlL3NraWxscy88c2x1Zz4vYCkuIElmIHRoZSBob29rIGlzIGtpbGxlZFxuLy8gbWlkLXdyaXRlLCB0aGUgaGFsZi13cml0dGVuIHRtcCBmaWxlIGlzIGxlZnQgYmVoaW5kIChoYXJtbGVzcyxcbi8vIG5ldmVyIHJlYWQpIGFuZCBTS0lMTC5tZCBzdGlsbCBoYXMgaXRzIHByZXZpb3VzIGNvbnRlbnRzIFx1MjAxNCBDbGF1ZGVcbi8vIENMSSdzIHNraWxsIGRpc2NvdmVyeSBuZXZlciBzZWVzIGEgdG9ybiBmaWxlLiBDb2RlUmFiYml0IHJldmlld1xuLy8gb24gUFIgIzEyOTguXG5mdW5jdGlvbiBtaXJyb3JXcml0ZShzbHVnOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhkYXRhU2tpbGxGaWxlUGF0aChzbHVnKSwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgZGVzdERpciA9IGNsYXVkZVNraWxsRGlyKHNsdWcpO1xuICBta2RpclN5bmMoZGVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGRlc3QgPSBjbGF1ZGVTa2lsbEZpbGVQYXRoKHNsdWcpO1xuICBjb25zdCB0bXAgPSBwYXRoLmpvaW4oZGVzdERpciwgYC5TS0lMTC5tZC4ke3Byb2Nlc3MucGlkfS50bXBgKTtcbiAgd3JpdGVGaWxlU3luYyh0bXAsIGNvbnRlbnQsIFwidXRmLThcIik7XG4gIHJlbmFtZVN5bmModG1wLCBkZXN0KTtcbn1cblxuZnVuY3Rpb24gbWlycm9yRGVsZXRlKHNsdWc6IHN0cmluZyk6IHZvaWQge1xuICBybVN5bmMoY2xhdWRlU2tpbGxEaXIoc2x1ZyksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbn1cblxuLy8gYGNvbmZpZ1JlZnJlc2hgIHVzZWQgdG8gZmFuIHRoaXMgb3V0IGZvciB1cyBhcyBhIHNpYmxpbmcgaGFuZGxlcixcbi8vIGJ1dCBydW5uaW5nIGl0IGluIHBhcmFsbGVsIHdpdGggdGhlIG1pcnJvciByYWNlJ2Q6IHRoZVxuLy8gYC9hcGkvY29uZmlnL3JlZnJlc2hgIFBPU1QgY291bGQgbGFuZCBiZWZvcmUgdGhlIGNhbm9uaWNhbFxuLy8gYC5jbGF1ZGUvc2tpbGxzLzxzbHVnPi9TS0lMTC5tZGAgZXhpc3RlZCBvbiBkaXNrLCBsZWF2aW5nIGEgZnJlc2hcbi8vIHNraWxsIHVucmVnaXN0ZXJlZCB1bnRpbCB0aGUgbmV4dCByZXN0YXJ0LiBgc2tpbGxCcmlkZ2VgIG5vd1xuLy8gZmlyZXMgdGhlIHJlZnJlc2ggaXRzZWxmLCBBTFdBWVMgYWZ0ZXIgYSBzdWNjZXNzZnVsIG1pcnJvciAob3Jcbi8vIGRlbGV0ZSksIHNvIG9yZGVyaW5nIGlzIGRldGVybWluaXN0aWMgKENvZGV4IHJldmlldyBvbiB0aGlzIFBSKS5cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHNhZmVQb3N0KGJ1aWxkQXV0aFBvc3QoXCIvYXBpL2NvbmZpZy9yZWZyZXNoXCIpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlV3JpdGVPckVkaXQocGF5bG9hZDogSG9va1BheWxvYWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBleHRyYWN0RmlsZVBhdGgocGF5bG9hZCk7XG4gIGlmICghZmlsZVBhdGgpIHJldHVybjtcbiAgY29uc3Qgc2x1ZyA9IHNsdWdGcm9tRGF0YVBhdGgoZmlsZVBhdGgpO1xuICBpZiAoc2x1ZyA9PT0gbnVsbCkgcmV0dXJuO1xuICB0cnkge1xuICAgIG1pcnJvcldyaXRlKHNsdWcpO1xuICAgIC8vIE9yZGVyIG1hdHRlcnM6IG1pcnJvciBtdXN0IGNvbXBsZXRlIGJlZm9yZSByZWZyZXNoIHNvIHRoZVxuICAgIC8vIHNlcnZlcidzIHNraWxsIHNjYW4gc2VlcyB0aGUgbmV3IFNLSUxMLm1kLiBTZWUgcmVmcmVzaENvbmZpZ1xuICAgIC8vIGNvbW1lbnQgZm9yIHRoZSByYWNlIGhpc3RvcnkuXG4gICAgYXdhaXQgcmVmcmVzaENvbmZpZygpO1xuICAgIC8vIFNlcnZlci1zaWRlIGxvZyBsaW5lIHNvIHRoZSB1c2VyIGNhbiBzZWUgZnJvbVxuICAgIC8vIGBzZXJ2ZXItPGRhdGU+LmxvZ2AgdGhhdCB0aGUgaG9vayBmaXJlZCBhbmQgd2hhdCBpdCBkaWQuXG4gICAgLy8gV2l0aG91dCB0aGlzIHRoZSBtaXJyb3IgaXMgaW52aXNpYmxlIFx1MjAxNCBhIHN1Y2Nlc3NmdWwgY29weVxuICAgIC8vIGFuZCBcInRoZSBob29rIG5ldmVyIHJhblwiIGxvb2sgaWRlbnRpY2FsIGZyb20gdGhlIGNoYXQgVUkuXG4gICAgYXdhaXQgc2VydmVyTG9nKFwic2tpbGwtYnJpZGdlXCIsIGBtaXJyb3JlZCAke2RhdGFTa2lsbEZpbGVQYXRoKHNsdWcpfSBcdTIxOTIgJHtjbGF1ZGVTa2lsbEZpbGVQYXRoKHNsdWcpfWAsIHsgZGF0YTogeyBzbHVnLCBvcDogXCJ3cml0ZVwiIH0gfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIFRoZSBXcml0ZSBpdHNlbGYgc3VjY2VlZGVkOyBhIGZhaWxlZCBtaXJyb3Igd291bGQgbGVhdmUgdGhlXG4gICAgLy8gc3RhZ2luZyBjb3B5IGluIHBsYWNlLiBTdXJmYWNlIHRoZSBmYWlsdXJlIHRvIHNlcnZlciBsb2dzXG4gICAgLy8gKHNvIHRoZSB1c2VyIGhhcyBhIGNoYW5jZSB0byByZWFjdCkgYnV0IG5ldmVyIHRocm93IFx1MjAxNCB0aGVcbiAgICAvLyB1c2VyJ3MgdG9vbCB0dXJuIG11c3Qgc3RheSBjbGVhbi5cbiAgICBhd2FpdCBzZXJ2ZXJMb2coXCJza2lsbC1icmlkZ2VcIiwgYG1pcnJvciB3cml0ZSBmYWlsZWQgZm9yIHNsdWc9JHtzbHVnfWAsIHtcbiAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICBkYXRhOiB7IHNsdWcsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9LFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUJhc2gocGF5bG9hZDogSG9va1BheWxvYWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29tbWFuZCA9IGV4dHJhY3RDb21tYW5kKHBheWxvYWQpO1xuICBpZiAoIWNvbW1hbmQpIHJldHVybjtcbiAgY29uc3Qgc2x1ZyA9IHNsdWdGcm9tUm1Db21tYW5kKGNvbW1hbmQpO1xuICBpZiAoc2x1ZyA9PT0gbnVsbCkgcmV0dXJuO1xuICB0cnkge1xuICAgIG1pcnJvckRlbGV0ZShzbHVnKTtcbiAgICAvLyBTYW1lIG9yZGVyaW5nIGludmFyaWFudCBhcyBoYW5kbGVXcml0ZU9yRWRpdCBcdTIwMTQgcmVmcmVzaCBtdXN0XG4gICAgLy8gcnVuIGFmdGVyIHRoZSBjYW5vbmljYWwgZGlyIGlzIGdvbmUgc28gdGhlIHNlcnZlcidzIHJlc2NhblxuICAgIC8vIGRlcmVnaXN0ZXJzIHRoZSBkZWxldGVkIHNraWxsLlxuICAgIGF3YWl0IHJlZnJlc2hDb25maWcoKTtcbiAgICBhd2FpdCBzZXJ2ZXJMb2coXCJza2lsbC1icmlkZ2VcIiwgYHJlbW92ZWQgJHtjbGF1ZGVTa2lsbERpcihzbHVnKX1gLCB7IGRhdGE6IHsgc2x1Zywgb3A6IFwiZGVsZXRlXCIgfSB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gU2FtZSBzaWxlbnQtZmFpbCBkaXNjaXBsaW5lIFx1MjAxNCBhIG1pc3NlZCBkZWxldGUgbGVhdmVzIGFuXG4gICAgLy8gb3JwaGFuIGluIGAuY2xhdWRlL3NraWxscy9gIHRoYXQgdGhlIHVzZXIgY2FuIGNsZWFuIHVwXG4gICAgLy8gbWFudWFsbHksIHdoaWNoIGlzIGJldHRlciB0aGFuIGFib3J0aW5nIHRoZSB0b29sIHR1cm4uXG4gICAgYXdhaXQgc2VydmVyTG9nKFwic2tpbGwtYnJpZGdlXCIsIGBtaXJyb3IgZGVsZXRlIGZhaWxlZCBmb3Igc2x1Zz0ke3NsdWd9YCwge1xuICAgICAgbGV2ZWw6IFwiZXJyb3JcIixcbiAgICAgIGRhdGE6IHsgc2x1ZywgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVNraWxsQnJpZGdlKHBheWxvYWQ6IEhvb2tQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHRvb2wgPSBleHRyYWN0VG9vbE5hbWUocGF5bG9hZCk7XG4gIGlmICh0b29sID09PSBcIldyaXRlXCIgfHwgdG9vbCA9PT0gXCJFZGl0XCIpIHtcbiAgICBhd2FpdCBoYW5kbGVXcml0ZU9yRWRpdChwYXlsb2FkKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHRvb2wgPT09IFwiQmFzaFwiKSB7XG4gICAgYXdhaXQgaGFuZGxlQmFzaChwYXlsb2FkKTtcbiAgfVxufVxuIiwgIi8vIFNoYXJlZCBlcnJvciBoZWxwZXJzLiBVc2UgYGVycm9yTWVzc2FnZShlcnIpYCBpbnN0ZWFkIG9mIGlubGluaW5nXG4vLyBgZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpYCBcdTIwMTQgc2VhcmNoaW5nIGZvclxuLy8gb25lIGNhbm9uaWNhbCBoZWxwZXIgaXMgZWFzaWVyIHRoYW4gZ3JlcHBpbmcgZm9yIHRoZSBpbmxpbmUgZm9ybS5cbi8vXG4vLyBOb24tRXJyb3Igb2JqZWN0cyB3aXRoIGEgYGRldGFpbHNgIChnUlBDIGNvbnZlbnRpb24pIG9yIGBtZXNzYWdlYFxuLy8gc3RyaW5nIGZpZWxkIGhhdmUgdGhhdCBmaWVsZCBzdXJmYWNlZCBcdTIwMTQgd2l0aG91dCB0aGlzLCBnUlBDIGVycm9yc1xuLy8gbGlrZSBgeyBjb2RlLCBkZXRhaWxzLCBtZXRhZGF0YSB9YCBzaG93IHVwIHRvIHVzZXJzIGFzXG4vLyBgW29iamVjdCBPYmplY3RdYC5cbi8vXG4vLyBUaGUgb3B0aW9uYWwgYGZhbGxiYWNrYCBjb3ZlcnMgdGhlIGNvbW1vbiByb3V0ZS1oYW5kbGVyIGlkaW9tIHdoZXJlXG4vLyBhIHRocm93IG9mIGEgcGxhaW4gbm9uLUVycm9yIHZhbHVlIHNob3VsZCBzdXJmYWNlIGFzIGEgZGVzY3JpcHRpdmVcbi8vIG1lc3NhZ2UgKFwicmVidWlsZCBmYWlsZWRcIikgcmF0aGVyIHRoYW4gYFN0cmluZyhlcnIpYCBub2lzZS4gUHJlZmVyXG4vLyBwYXNzaW5nIGEgZmFsbGJhY2sgYXQgZXJyb3ItcmVzcG9uc2UgYm91bmRhcmllcyBcdTIwMTQgb21pdCBpdCBmb3Jcbi8vIGxvZ2dpbmcgY29udGV4dHMgd2hlcmUgYFN0cmluZyhlcnIpYCBpcyBmaW5lLlxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKGVycjogdW5rbm93biwgZmFsbGJhY2s/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBlcnIubWVzc2FnZTtcbiAgaWYgKGVyciAhPT0gbnVsbCAmJiB0eXBlb2YgZXJyID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3Qgb2JqID0gZXJyIGFzIHsgZGV0YWlscz86IHVua25vd247IG1lc3NhZ2U/OiB1bmtub3duIH07XG4gICAgaWYgKHR5cGVvZiBvYmouZGV0YWlscyA9PT0gXCJzdHJpbmdcIiAmJiBvYmouZGV0YWlscykgcmV0dXJuIG9iai5kZXRhaWxzO1xuICAgIGlmICh0eXBlb2Ygb2JqLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIgJiYgb2JqLm1lc3NhZ2UpIHJldHVybiBvYmoubWVzc2FnZTtcbiAgfVxuICBpZiAoZmFsbGJhY2sgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbGxiYWNrO1xuICByZXR1cm4gU3RyaW5nKGVycik7XG59XG4iLCAiLy8gV2lraSBwYWdlIHNuYXBzaG90IGhhbmRsZXIgXHUyMDE0IGZpcmVzIGFmdGVyIFdyaXRlL0VkaXQgb24gYSB3aWtpXG4vLyBwYWdlIHNvIHRoZSBzbmFwc2hvdCBwaXBlbGluZSAoIzc2MyBQUiAyKSByZWNvcmRzIHRoZSBuZXcgc3RhdGUuXG4vL1xuLy8gTWlncmF0ZWQgZnJvbSBgc2VydmVyL3dvcmtzcGFjZS93aWtpLWhpc3RvcnkvaG9vay9zbmFwc2hvdC50c2AuXG4vLyBTYW1lIGJlaGF2aW91ciwgbm93IHBhcnQgb2YgdGhlIHVuaWZpZWQgZGlzcGF0Y2hlciBzbyBzZXR0aW5ncy5qc29uXG4vLyBjYXJyaWVzIGEgc2luZ2xlIFBvc3RUb29sVXNlIGVudHJ5IGluc3RlYWQgb2Ygb25lIHBlciBob29rIHNvdXJjZS5cblxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgd2lraVNsdWdGcm9tQWJzUGF0aCB9IGZyb20gXCIuLi8uLi8uLi8uLi9zcmMvbGliL3dpa2ktcGFnZS9wYXRocy5qc1wiO1xuaW1wb3J0IHsgYnVpbGRBdXRoUG9zdCwgc2FmZVBvc3QgfSBmcm9tIFwiLi4vc2hhcmVkL3NpZGVjYXIuanNcIjtcbmltcG9ydCB0eXBlIHsgSG9va1BheWxvYWQgfSBmcm9tIFwiLi4vc2hhcmVkL3N0ZGluLmpzXCI7XG5pbXBvcnQgeyBleHRyYWN0RmlsZVBhdGgsIGV4dHJhY3RTZXNzaW9uSWQsIGV4dHJhY3RUb29sTmFtZSB9IGZyb20gXCIuLi9zaGFyZWQvc3RkaW4uanNcIjtcbmltcG9ydCB7IHdvcmtzcGFjZVJvb3QgfSBmcm9tIFwiLi4vc2hhcmVkL3dvcmtzcGFjZS5qc1wiO1xuXG5jb25zdCBXSUtJX1BBR0VTX1JFTCA9IHBhdGguam9pbihcImRhdGFcIiwgXCJ3aWtpXCIsIFwicGFnZXNcIik7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVXaWtpU25hcHNob3QocGF5bG9hZDogSG9va1BheWxvYWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdG9vbCA9IGV4dHJhY3RUb29sTmFtZShwYXlsb2FkKTtcbiAgLy8gV2lraSBwYWdlcyBhcmUgd3JpdHRlbiB2aWEgV3JpdGUgb3IgRWRpdCBcdTIwMTQgQmFzaCBybSBvciBzaGVsbFxuICAvLyBtdXRhdGlvbnMgZG9uJ3QgZ28gdGhyb3VnaCB0aGUgc25hcHNob3QgcGlwZWxpbmUgKHRoZSB3aWtpXG4gIC8vIHJvdXRlIGRvZXMgdGhhdCBleHBsaWNpdGx5IHNlcnZlci1zaWRlIHdoZW4gbmVlZGVkKS5cbiAgaWYgKHRvb2wgIT09IFwiV3JpdGVcIiAmJiB0b29sICE9PSBcIkVkaXRcIikgcmV0dXJuO1xuXG4gIGNvbnN0IGZpbGVQYXRoID0gZXh0cmFjdEZpbGVQYXRoKHBheWxvYWQpO1xuICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgY29uc3Qgd2lraVBhZ2VzRGlyID0gcGF0aC5qb2luKHdvcmtzcGFjZVJvb3QoKSwgV0lLSV9QQUdFU19SRUwpO1xuICBjb25zdCBzbHVnID0gd2lraVNsdWdGcm9tQWJzUGF0aChmaWxlUGF0aCwgd2lraVBhZ2VzRGlyKTtcbiAgaWYgKHNsdWcgPT09IG51bGwpIHJldHVybjtcblxuICAvLyBQcmVmZXIgdGhlIHBhcmVudCBzZXJ2ZXIncyBjaGF0U2Vzc2lvbklkICgjOTYzKSBcdTIwMTQgdGhlIHNlcnZlcidzXG4gIC8vIHNlc3Npb24gc3RvcmUga2V5cyBieSBjaGF0U2Vzc2lvbklkLCBub3QgQ2xhdWRlIENMSSdzIGludGVybmFsXG4gIC8vIHNlc3Npb25faWQsIHNvIHRoZSB0b29sUmVzdWx0IHB1Ymxpc2ggb24gdGhlIHNlcnZlciBzaWRlIG9ubHlcbiAgLy8gbWF0Y2hlcyB3aGVuIHdlIGZvcndhcmQgb3VyIG93biBpZC4gRmFsbCBiYWNrIHRvIENsYXVkZSBDTEknc1xuICAvLyBzZXNzaW9uX2lkIHdoZW4gdGhlIGVudiB2YXIgaXMgYWJzZW50LlxuICBjb25zdCBlbnZDaGF0U2Vzc2lvbklkID0gcHJvY2Vzcy5lbnYuTVVMTU9DTEFVREVfQ0hBVF9TRVNTSU9OX0lEO1xuICBjb25zdCBwYXlsb2FkU2Vzc2lvbklkID0gZXh0cmFjdFNlc3Npb25JZChwYXlsb2FkKTtcbiAgY29uc3Qgc2Vzc2lvbklkID0gZW52Q2hhdFNlc3Npb25JZCAmJiBlbnZDaGF0U2Vzc2lvbklkLmxlbmd0aCA+IDAgPyBlbnZDaGF0U2Vzc2lvbklkIDogcGF5bG9hZFNlc3Npb25JZDtcbiAgY29uc3QgYm9keSA9IHNlc3Npb25JZCA9PT0gdW5kZWZpbmVkID8geyBzbHVnIH0gOiB7IHNsdWcsIHNlc3Npb25JZCB9O1xuXG4gIGNvbnN0IHJlcSA9IGJ1aWxkQXV0aFBvc3QoXCIvYXBpL3dpa2kvaW50ZXJuYWwvc25hcHNob3RcIiwgYm9keSk7XG4gIGF3YWl0IHNhZmVQb3N0KHJlcSk7XG59XG4iLCAiLy8gTm9kZS1vbmx5IHdpa2ktcGFnZSBoZWxwZXJzIFx1MjAxNCBhbnl0aGluZyB0aGF0IG5lZWRzIGBub2RlOnBhdGhgXG4vLyBsaXZlcyBoZXJlIHNvIHRoZSByZXN0IG9mIGBzcmMvbGliL3dpa2ktcGFnZS9gIHN0YXlzIHB1cmVcbi8vIChzdHJpbmctb25seSwgaW1wb3J0YWJsZSBmcm9tIGJvdGggYnJvd3NlciBhbmQgTm9kZSBidW5kbGVzKS5cbi8vIEZyb250ZW5kIGNvZGUgTVVTVCBOT1QgaW1wb3J0IHRoaXMgZmlsZSBkaXJlY3RseTsgdXNlIHRoZSBwdXJlXG4vLyBtb2R1bGVzIGluc3RlYWQuXG5cbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGlzU2FmZVNsdWcgfSBmcm9tIFwiLi9zbHVnLmpzXCI7XG5cbi8qKiBHaXZlbiBhbiBhYnNvbHV0ZSBwYXRoIGFuZCB0aGUgYWJzb2x1dGUgYHBhZ2VzRGlyYCwgcmV0dXJuIHRoZVxuICogIHNsdWcgaWYgYGFic1BhdGhgIGlzIGEgZGlyZWN0IGAubWRgIGNoaWxkIG9mIGBwYWdlc0RpcmAsIGVsc2VcbiAqICBudWxsLiBQdXJlIHBhdGgtc3RyaW5nIG1hdGggXHUyMDE0IG5vIGZzIElPLCBubyBzeW1saW5rIHJlc29sdXRpb24uXG4gKlxuICogIENhbGxlciByZXNwb25zaWJpbGl0eTogcGFzcyBhbHJlYWR5LXJlYWxwYXRoJ2QgdmFsdWVzIGZvciBib3RoXG4gKiAgYXJndW1lbnRzLiBNaXhpbmcgYSByZWFscGF0aCdkIGBhYnNQYXRoYCB3aXRoIGEgc3ltbGlua2VkXG4gKiAgYHBhZ2VzRGlyYCAob3IgdmljZSB2ZXJzYSkgc2lsZW50bHkgbWlzbWF0Y2hlcyBiZWNhdXNlXG4gKiAgYHBhdGgucmVsYXRpdmVgIGlzIHBsYWluIHN0cmluZyBhcml0aG1ldGljLiBUaGUgdHJhcCBjYXVzZWRcbiAqICAjODgzIHJldmlldy1pdGVyLTEgXHUyMDE0IGEgc3ltbGlua2VkIHdvcmtzcGFjZSBzaWxlbnRseSByb3V0ZWRcbiAqICB3aWtpIHdyaXRlcyB0aHJvdWdoIHRoZSBnZW5lcmljIHdyaXRlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aWtpU2x1Z0Zyb21BYnNQYXRoKGFic1BhdGg6IHN0cmluZywgcGFnZXNEaXI6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCByZWwgPSBwYXRoLnJlbGF0aXZlKHBhZ2VzRGlyLCBhYnNQYXRoKTtcbiAgaWYgKHJlbC5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICBpZiAocGF0aC5pc0Fic29sdXRlKHJlbCkpIHJldHVybiBudWxsO1xuICAvLyBEaXJlY3QgY2hpbGQgb25seSBcdTIwMTQgbm8gbmVzdGVkIGxheW91dCB0b2RheS4gQW55IHNlcGFyYXRvclxuICAvLyBtZWFucyB0aGUgcGF0aCBlaXRoZXIgZXNjYXBlcyAoYC4uL3NlY3JldC5tZGApIG9yIGRlc2NlbmRzXG4gIC8vIChgc3ViZGlyL2Zvby5tZGApLiBBIGxpdGVyYWwgcGFnZSBuYW1lIGxpa2UgYC4uZm9vLm1kYCBpcyBhXG4gIC8vIHNpbmdsZSBzZWdtZW50IHdpdGhvdXQgYSBzZXBhcmF0b3IgYW5kIGlzIGFsbG93ZWQgKGNvZGV4XG4gIC8vIGl0ZXItMyAjODgzIFx1MjAxNCB0aGUgcHJpb3IgYHN0YXJ0c1dpdGgoXCIuLlwiKWAgcnVsZSB3cm9uZ2x5XG4gIC8vIHJlamVjdGVkIGl0KS5cbiAgaWYgKHJlbC5pbmNsdWRlcyhwYXRoLnNlcCkpIHJldHVybiBudWxsO1xuICBpZiAoIXJlbC5lbmRzV2l0aChcIi5tZFwiKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHNsdWcgPSByZWwuc2xpY2UoMCwgLVwiLm1kXCIubGVuZ3RoKTtcbiAgaWYgKCFpc1NhZmVTbHVnKHNsdWcpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHNsdWc7XG59XG4iLCAiLy8gUHVyZSB3aWtpLXBhZ2Ugc2x1ZyBoZWxwZXJzIFx1MjAxNCBzdHJpbmctb25seSwgbm8gTm9kZSAvIGJyb3dzZXJcbi8vIGRlcGVuZGVuY2llcywgaW1wb3J0YWJsZSBmcm9tIGFueSBidW5kbGUuXG4vL1xuLy8gVXNlZCBieTpcbi8vICAgLSBzZXJ2ZXIvd29ya3NwYWNlL3dpa2ktcGFnZXMvaW8udHMgKHRoZSB3cml0ZSBjaG9rZXBvaW50KVxuLy8gICAtIHNlcnZlci93b3Jrc3BhY2UvaG9va3MvaGFuZGxlcnMvd2lraVNuYXBzaG90LnRzICh0aGVcbi8vICAgICBQb3N0VG9vbFVzZSBoYW5kbGVyIHRoYXQgZmlyZXMgb24gV3JpdGUvRWRpdCBvZiBhIHdpa2kgcGFnZSlcbi8vICAgLSBzZXJ2ZXIvYXBpL3JvdXRlcy93aWtpLnRzIChwYWdlIHJlc29sdmVyICsgbGludClcbi8vICAgLSBzZXJ2ZXIvYXBpL3JvdXRlcy93aWtpL2hpc3RvcnkudHMgKGhpc3Rvcnkgc2x1ZyBndWFyZClcbi8vICAgLSBzcmMvcGx1Z2lucy93aWtpL3JvdXRlLnRzIChyb3V0ZXIgc2x1ZyBndWFyZCBcdTIwMTQgcmVwbGFjZXMgdGhlXG4vLyAgICAgbG9jYWwgYGlzU2FmZVdpa2lTbHVnYCBkdXBsaWNhdGUgdGhhdCBleGlzdGVkIGJlZm9yZSB0aGVcbi8vICAgICBwdXJlLWxpYiByZWZhY3Rvcilcbi8vICAgLSBzcmMvcGx1Z2lucy93aWtpL2hlbHBlcnMudHMgKHJlbmRlcmVyIHNsdWdpZnkgZm9yIFtbXHUyMDI2XV0gbGlua3MpXG4vL1xuLy8gQW55IGhlbHBlciB0aGF0IG5lZWRzIGBub2RlOnBhdGhgIGxpdmVzIGluIGAuL3BhdGhzLnRzYCBzbyB0aGF0XG4vLyBpbXBvcnRpbmcgdGhpcyBmaWxlIGZyb20gZnJvbnRlbmQgY29kZSBuZXZlciBwdWxscyBpbiBOb2RlXG4vLyBidWlsdGlucy5cblxuLyoqIFJlamVjdCBzbHVncyB0aGF0IHdvdWxkIGVzY2FwZSBgZGF0YS93aWtpL3BhZ2VzL2Agb25jZVxuICogIGpvaW5lZCBiYWNrIGludG8gYSBwYXRoLCBvciB0aGF0IGFyZSBvdGhlcndpc2UgaW52YWxpZCBhc1xuICogIHBhZ2UgZmlsZW5hbWVzLiBUaGUgY2hva2Vwb2ludCBtdXN0IGRlZmVuZCBpdHNlbGYgZXZlbiB3aGVuXG4gKiAgY2FsbGVycyBkZXJpdmUgdGhlIHNsdWcgZnJvbSBhIHRydXN0ZWQgc291cmNlIFx1MjAxNCBhIHR5cG8gb3JcbiAqICBmdXR1cmUgY2FsbGVyIG1pc3Rha2Ugc2hvdWxkIGZhaWwgbG91ZCwgbm90IHNpbGVudGx5IHdyaXRlXG4gKiAgb3V0c2lkZSB0aGUgd2lraSB0cmVlLlxuICpcbiAqICBUaGUgcnVsZSBpcyBpbnRlbnRpb25hbGx5IG5hcnJvdyBcdTIwMTQgc2VwYXJhdG9ycyAvIGAuLmAgLyBOVUwgL1xuICogIGVtcHR5IFx1MjAxNCBzbyBpdCBvbmx5IHJlamVjdHMgdW5hbWJpZ3VvdXMgdmlvbGF0aW9ucy4gQWVzdGhldGljXG4gKiAgY29uY2VybnMgKGUuZy4gZG90LXByZWZpeGVkIGZpbGVuYW1lcykgYXJlIG91dCBvZiBzY29wZTogYVxuICogIHByZS1leGlzdGluZyBgZGF0YS93aWtpL3BhZ2VzLy5mb28ubWRgIHNob3VsZCByZW1haW4gd3JpdGFibGVcbiAqICB0aHJvdWdoIHRoZSBjaG9rZXBvaW50IChjb2RleCByZXZpZXcgaXRlci0yICM4ODMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FmZVNsdWcoc2x1Zzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChzbHVnLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoc2x1ZyA9PT0gXCIuXCIgfHwgc2x1ZyA9PT0gXCIuLlwiKSByZXR1cm4gZmFsc2U7XG4gIGlmIChzbHVnLmluY2x1ZGVzKFwiL1wiKSB8fCBzbHVnLmluY2x1ZGVzKFwiXFxcXFwiKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoc2x1Zy5pbmNsdWRlcyhcIlxcMFwiKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFNsdWcgcnVsZXMgZm9yIGBbW3dpa2kgbGlua11dYCB0ZXh0IFx1MjE5MiBzbHVnIGRlcml2YXRpb246XG4gKiAgbG93ZXJjYXNlLCBzcGFjZXMgY29sbGFwc2VkIHRvIGh5cGhlbnMsIGV2ZXJ5IG5vbi1BU0NJSSAvXG4gKiAgbm9uLWFscGhhbnVtZXJpYyAvIG5vbi1oeXBoZW4gY2hhcmFjdGVyIHN0cmlwcGVkLlxuICpcbiAqICBQdXJlOiBubyBub3JtYWxpc2F0aW9uLCBubyB0cmFuc2xpdGVyYXRpb24gXHUyMDE0IHRoaXMgaXMgdGhlXG4gKiAgc2FtZSBzaGFwZSB0aGUgaW5kZXggcGFyc2VyLCBwYWdlIHJlc29sdmVyLCBhbmQgZnJvbnRlbmRcbiAqICByZW5kZXJlciBhbGwgbmVlZCB0byBhZ3JlZSBvbi4gTm9uLUFTQ0lJIHRpdGxlcyAoZS5nLlxuICogIEphcGFuZXNlKSBjb2xsYXBzZSB0byBhbiBlbXB0eSBzdHJpbmcgaGVyZTsgY2FsbGVycyBmYWxsIGJhY2tcbiAqICB0byBvdGhlciBzdHJhdGVnaWVzICh0aXRsZS1tYXRjaCBpbiB0aGUgaW5kZXgsIG9yIHRoZSBhZ2VudFxuICogIHByZS1yZXNvbHZpbmcgdG8gYSBzbHVnLWZvcm0gdGFyZ2V0IHZpYSBgW1tzbHVnfGRpc3BsYXldXWApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpa2lTbHVnaWZ5KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvXFxzKy9nLCBcIi1cIilcbiAgICAucmVwbGFjZSgvW15hLXowLTktXS9nLCBcIlwiKTtcbn1cbiIsICIvLyBQb3N0VG9vbFVzZSBkaXNwYXRjaGVyIFx1MjAxNCBydW5zIGFmdGVyIGV2ZXJ5IENsYXVkZSBDTEkgV3JpdGUgLyBFZGl0XG4vLyAvIEJhc2ggdG9vbCBjYWxsIGFuZCBmYW5zIG91dCB0byB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycy4gRWFjaFxuLy8gaGFuZGxlciBkZWNpZGVzIGZvciBpdHNlbGYgd2hldGhlciB0aGUgY2FsbCBpcyByZWxldmFudCAoYnlcbi8vIHRvb2xfbmFtZSArIGZpbGVfcGF0aCAvIGNvbW1hbmQpLCBzbyBhZGRpbmcgYSBuZXcgYmVoYXZpb3VyIG1lYW5zXG4vLyBkcm9wcGluZyBhIG5ldyBmaWxlIHVuZGVyIGBoYW5kbGVycy9gIGFuZCByZWdpc3RlcmluZyBpdCBoZXJlIFx1MjAxNFxuLy8gc2V0dGluZ3MuanNvbiBuZXZlciBjaGFuZ2VzLlxuLy9cbi8vIFRISVMgRklMRSBJUyBUSEUgU09VUkNFIE9GIFRSVVRILiBFZGl0cyBoZXJlLCB0aGVuIHJ1blxuLy8gYHlhcm4gYnVpbGQ6aG9va3NgIChvciBgeWFybiBidWlsZGApIHRvIHJlZ2VuZXJhdGUgYC4vZGlzcGF0Y2hlci5tanNgLlxuLy8gVGhlIGJ1bmRsZWQgYC5tanNgIGlzIGNvbW1pdHRlZCB0byBnaXQgc28gYHByb3Zpc2lvbi50c2AgY2FuIHJlYWRcbi8vIGl0IGF0IHNlcnZlciBzdGFydHVwIHdpdGhvdXQgaW52b2tpbmcgZXNidWlsZCBvbiB0aGUgcnVudGltZSBwYXRoLlxuLy8gQ0kgcnVucyBgeWFybiBidWlsZDpob29rcyAmJiBnaXQgZGlmZiAtLWV4aXQtY29kZWAgdG8gY2F0Y2ggYVxuLy8gc3RhbGUgYnVuZGxlLlxuLy9cbi8vIFRoZSBob29rIGV4ZWN1dGVzIGluc2lkZSBDbGF1ZGUgQ0xJJ3MgcHJvY2VzcyBzcGFjZSBcdTIwMTQgbXVzdCBiZSBhXG4vLyBzZWxmLWNvbnRhaW5lZCBFU00gYnVuZGxlLiBlc2J1aWxkIHJvbGxzIGV2ZXJ5IGltcG9ydCAoaGFuZGxlcnMsXG4vLyBzaGFyZWQsIGFuZCB0aGUgd2lraS1zbHVnIGhlbHBlciBmcm9tIGBzcmMvbGliL2ApIGludG8gb25lIGZpbGUuXG5cbmltcG9ydCB7IGhhbmRsZUNvbmZpZ1JlZnJlc2ggfSBmcm9tIFwiLi9oYW5kbGVycy9jb25maWdSZWZyZXNoLmpzXCI7XG5pbXBvcnQgeyBoYW5kbGVTa2lsbEJyaWRnZSB9IGZyb20gXCIuL2hhbmRsZXJzL3NraWxsQnJpZGdlLmpzXCI7XG5pbXBvcnQgeyBoYW5kbGVXaWtpU25hcHNob3QgfSBmcm9tIFwiLi9oYW5kbGVycy93aWtpU25hcHNob3QuanNcIjtcbmltcG9ydCB7IHJlYWRIb29rUGF5bG9hZCwgdHlwZSBIb29rUGF5bG9hZCB9IGZyb20gXCIuL3NoYXJlZC9zdGRpbi5qc1wiO1xuXG50eXBlIEhhbmRsZXIgPSAocGF5bG9hZDogSG9va1BheWxvYWQpID0+IFByb21pc2U8dm9pZD47XG5cbi8vIE9yZGVyIGlzIGluZm9ybWF0aW9uYWwgb25seSBcdTIwMTQgaGFuZGxlcnMgZG9uJ3QgaW50ZXJhY3QuIEFkZCBuZXdcbi8vIGVudHJpZXMgaGVyZS4gRWFjaCBvbmUgaXMgd3JhcHBlZCBzbyBhbiBpbmRpdmlkdWFsIGZhaWx1cmVcbi8vIGRvZXNuJ3QgYmxvY2sgaXRzIHNpYmxpbmdzICh0aGUgdXNlcidzIHRvb2wgdHVybiB3b3VsZCB2aXNpYmx5XG4vLyBzdGFsbCBvdGhlcndpc2UpLlxuY29uc3QgSEFORExFUlM6IEhhbmRsZXJbXSA9IFtoYW5kbGVXaWtpU25hcHNob3QsIGhhbmRsZUNvbmZpZ1JlZnJlc2gsIGhhbmRsZVNraWxsQnJpZGdlXTtcblxuYXN5bmMgZnVuY3Rpb24gcnVuSGFuZGxlcihoYW5kbGVyOiBIYW5kbGVyLCBwYXlsb2FkOiBIb29rUGF5bG9hZCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGhhbmRsZXIocGF5bG9hZCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEhvb2tzIHJ1biBzeW5jaHJvbm91c2x5IHRvIHRoZSBMTE0gdG9vbCBmbG93IFx1MjAxNCBuZXZlciB0aHJvdy5cbiAgICAvLyBBIGJ1c3RlZCBoYW5kbGVyIHdvdWxkIG1ha2UgdGhlIHRvb2wgaXRzZWxmIGxvb2sgbGlrZSBpdFxuICAgIC8vIGZhaWxlZCB0byB0aGUgTExNLCB3aGljaCBpcyBtdWNoIHdvcnNlIHRoYW4gYSBtaXNzZWRcbiAgICAvLyBzaWRlLWVmZmVjdC5cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVhZEhvb2tQYXlsb2FkKCk7XG4gIGlmICghcGF5bG9hZCkgcmV0dXJuO1xuICAvLyBSdW4gaGFuZGxlcnMgaW4gcGFyYWxsZWwgXHUyMDE0IHRoZXkgdG91Y2ggZGlzam9pbnQgcmVzb3VyY2VzXG4gIC8vICh3aWtpIHNuYXBzaG90IGVuZHBvaW50IHZzIGNvbmZpZy1yZWZyZXNoIGVuZHBvaW50IHZzIGxvY2FsXG4gIC8vIGZpbGUgY29weSkgYW5kIHNlcmlhbGlzaW5nIHRoZW0gd291bGQgcHVzaCB0aGUgcGVyLXR1cm5cbiAgLy8gbGF0ZW5jeSBwYXN0IHRoZSAyIHMgc2FmZVBvc3QgdGltZW91dCB1bmRlciBiYWQgY29uZGl0aW9ucy5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoSEFORExFUlMubWFwKChoYW5kbGVyKSA9PiBydW5IYW5kbGVyKGhhbmRsZXIsIHBheWxvYWQpKSk7XG59XG5cbm1haW4oKS5jYXRjaCgoKSA9PiB7XG4gIC8vIE91dGVybW9zdCBzYWZldHkgbmV0IFx1MjAxNCBzZWUgcnVuSGFuZGxlciBjb21tZW50LlxufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUFVQSxTQUFTLG9CQUFvQjtBQUM3QixPQUFPQSxXQUFVOzs7QUNKVixJQUFNLGdCQUFnQjtBQUN0QixJQUFNLGdCQUFnQjtBQWdCdEIsSUFBTSw4QkFBOEIsSUFBSTtBQVl4QyxJQUFNLGdDQUFnQyxJQUFJO0FBTTFDLElBQU0sNEJBQTRCLElBQUk7OztBQ25DN0MsU0FBUyxlQUFlO0FBQ3hCLE9BQU8sVUFBVTtBQUVWLFNBQVMsZ0JBQXdCO0FBQ3RDLFNBQU8sUUFBUSxJQUFJLHNCQUFzQixLQUFLLEtBQUssUUFBUSxHQUFHLGFBQWE7QUFDN0U7OztBRkdBLElBQU0sYUFBYTtBQUNuQixJQUFNLFlBQVk7QUFPWCxTQUFTLGFBQXFCO0FBQ25DLFNBQU8sUUFBUSxJQUFJLG9CQUFvQjtBQUN6QztBQUVBLFNBQVMsWUFBWSxLQUFxQjtBQUN4QyxNQUFJO0FBQ0YsV0FBTyxhQUFhQyxNQUFLLEtBQUssY0FBYyxHQUFHLEdBQUcsR0FBRyxPQUFPLEVBQUUsS0FBSztBQUFBLEVBQ3JFLFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRU8sU0FBUyxZQUFvQjtBQUNsQyxTQUFPLFlBQVksVUFBVTtBQUMvQjtBQUVPLFNBQVMsV0FBMEI7QUFDeEMsUUFBTSxNQUFNLFlBQVksU0FBUztBQUNqQyxNQUFJLENBQUMsSUFBSyxRQUFPO0FBQ2pCLFFBQU0sT0FBTyxPQUFPLFNBQVMsS0FBSyxFQUFFO0FBQ3BDLFNBQU8sT0FBTyxVQUFVLElBQUksS0FBSyxPQUFPLEtBQUssT0FBTyxRQUFRLE9BQU87QUFDckU7QUFrQk8sU0FBUyxjQUFjLFVBQWtCLE1BQW9D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QUFTLEtBQU07QUFPbkIsUUFBTSxtQkFBbUIsUUFBUSxJQUFJO0FBQ3JDLFFBQU0sbUJBQW1CLGlCQUFpQixPQUFPO0FBQ2pELFFBQU0sWUFBWSxvQkFBb0IsaUJBQWlCLFNBQVMsSUFBSSxtQkFBbUI7QUFDdkYsUUFBTSxPQUFPLGNBQWMsU0FBWSxFQUFFLEtBQUssSUFBSSxFQUFFLE1BQU0sVUFBVTtBQUVwRSxRQUFNLE1BQU0sY0FBYywrQkFBK0IsSUFBSTtBQUM3RCxRQUFNLFNBQVMsR0FBRztBQUNwQjs7O0FHYkEsSUFBTSxXQUFzQixDQUFDLG9CQUFvQixxQkFBcUIsaUJBQWlCO0FBRXZGLGVBQWUsV0FBVyxTQUFrQixTQUFxQztBQUMvRSxNQUFJO0FBQ0YsVUFBTSxRQUFRLE9BQU87QUFBQSxFQUN2QixRQUFRO0FBQUEsRUFLUjtBQUNGO0FBRUEsZUFBZSxPQUFzQjtBQUNuQyxRQUFNLFVBQVUsTUFBTSxnQkFBZ0I7QUFDdEMsTUFBSSxDQUFDLFFBQVM7QUFLZCxRQUFNLFFBQVEsSUFBSSxTQUFTLElBQUksQ0FBQyxZQUFZLFdBQVcsU0FBUyxPQUFPLENBQUMsQ0FBQztBQUMzRTtBQUVBLEtBQUssRUFBRSxNQUFNLE1BQU07QUFFbkIsQ0FBQzsiLAogICJuYW1lcyI6IFsicGF0aCIsICJwYXRoIiwgInJlYWRGaWxlU3luYyIsICJwYXRoIiwgInBhdGgiLCAicmVhZEZpbGVTeW5jIiwgInBhdGgiLCAicGF0aCIsICJwYXRoIiwgInBhdGgiXQp9Cg==
|
|
300
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic2hhcmVkL3NpZGVjYXIudHMiLCAiLi4vLi4vdXRpbHMvdGltZS50cyIsICJzaGFyZWQvd29ya3NwYWNlLnRzIiwgInNoYXJlZC9zdGRpbi50cyIsICJoYW5kbGVycy9jb25maWdSZWZyZXNoLnRzIiwgImhhbmRsZXJzL3NraWxsQnJpZGdlLnRzIiwgIi4uLy4uL3V0aWxzL2Vycm9ycy50cyIsICJoYW5kbGVycy93aWtpU25hcHNob3QudHMiLCAiLi4vLi4vLi4vc3JjL2xpYi93aWtpLXBhZ2UvcGF0aHMudHMiLCAiLi4vLi4vLi4vc3JjL2xpYi93aWtpLXBhZ2Uvc2x1Zy50cyIsICJkaXNwYXRjaGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBSZWFkIHRoZSBiZWFyZXIgdG9rZW4gYW5kIHNlcnZlciBwb3J0IGZyb20gc2lkZWNhciBmaWxlcyB0aGVcbi8vIHBhcmVudCBzZXJ2ZXIgd3JpdGVzIG9uIGVhY2ggc3RhcnR1cC4gSG9va3MgUE9TVCBiYWNrIHRvIHRoZVxuLy8gcGFyZW50IHNlcnZlciB1c2luZyB0aGVzZSBcdTIwMTQgdGhleSBuZWVkIHRvIHJ1biB3aXRob3V0IGFueVxuLy8gcnVudGltZSBjb25maWcgYmFrZWQgaW4uXG4vL1xuLy8gU3RyaWN0IGludGVnZXIgcGFyc2luZyBvbiB0aGUgcG9ydDogYSBjcmFmdGVkIGZpbGUgdmFsdWUgbGlrZVxuLy8gYDgwQGF0dGFja2VyLmV4YW1wbGVgIHdvdWxkIG90aGVyd2lzZSBjaGFuZ2UgdGhlIHJlcXVlc3Rcbi8vIGF1dGhvcml0eSBhbmQgZXhmaWx0cmF0ZSB0aGUgYmVhcmVyIHRva2VuIG9mZi1ob3N0LiBTYW1lXG4vLyBoYXJkZW5pbmcgYXBwbGllZCBhcyB0aGUgQ29kZXggcmV2aWV3IG9uIFBSICMxMjg0LlxuXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgT05FX1NFQ09ORF9NUyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy90aW1lLmpzXCI7XG5pbXBvcnQgeyB3b3Jrc3BhY2VSb290IH0gZnJvbSBcIi4vd29ya3NwYWNlLmpzXCI7XG5cbmNvbnN0IFRPS0VOX0ZJTEUgPSBcIi5zZXNzaW9uLXRva2VuXCI7XG5jb25zdCBQT1JUX0ZJTEUgPSBcIi5zZXJ2ZXItcG9ydFwiO1xuXG4vLyBJbiBEb2NrZXIgbW9kZSB0aGUgcGFyZW50IHNlcnZlciBsaXZlcyBvbiB0aGUgaG9zdCdzIDEyNy4wLjAuMVxuLy8gd2hpY2ggdGhlIGNvbnRhaW5lciBjYW4ndCByZWFjaCB2aWEgcGxhaW4gbG9vcGJhY2suIFRoZSBEb2NrZXJcbi8vIHNwYXduIHBsdW1iaW5nIHNldHMgTVVMTU9DTEFVREVfSE9TVD1ob3N0LmRvY2tlci5pbnRlcm5hbCBzb1xuLy8gZmV0Y2goKSByZXNvbHZlcyB0byB0aGUgaG9zdCBzZXJ2ZXIuIE91dHNpZGUgRG9ja2VyIChvciB3aGVuIHRoZVxuLy8gdmFyIGlzIHVuc2V0KSB3ZSBmYWxsIGJhY2sgdG8gdGhlIGxvb3BiYWNrIGFkZHJlc3MuXG5leHBvcnQgZnVuY3Rpb24gc2VydmVySG9zdCgpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuTVVMTU9DTEFVREVfSE9TVCA/PyBcIjEyNy4wLjAuMVwiO1xufVxuXG5mdW5jdGlvbiByZWFkU2lkZWNhcihyZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya3NwYWNlUm9vdCgpLCByZWwpLCBcInV0Zi04XCIpLnRyaW0oKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRUb2tlbigpOiBzdHJpbmcge1xuICByZXR1cm4gcmVhZFNpZGVjYXIoVE9LRU5fRklMRSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkUG9ydCgpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgcmF3ID0gcmVhZFNpZGVjYXIoUE9SVF9GSUxFKTtcbiAgaWYgKCFyYXcpIHJldHVybiBudWxsO1xuICBjb25zdCBwb3J0ID0gTnVtYmVyLnBhcnNlSW50KHJhdywgMTApO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwb3J0KSAmJiBwb3J0ID4gMCAmJiBwb3J0IDwgNjU1MzYgPyBwb3J0IDogbnVsbDtcbn1cblxuLy8gQnVpbGQgYW4gYXV0aGVudGljYXRlZCBQT1NUIHJlcXVlc3QgYWdhaW5zdCB0aGUgcGFyZW50IHNlcnZlci5cbi8vIFJldHVybnMgbnVsbCB3aGVuIHRva2VuIC8gcG9ydCBhcmUgbWlzc2luZyAoc2VydmVyIGlzbid0IHVwIHlldCk7XG4vLyBjYWxsZXIgdHJlYXRzIG51bGwgYXMgYSBzaWxlbnQgbm8tb3Agc28gYSBvbmUtb2ZmIGhvb2sgbWlzc1xuLy8gZHVyaW5nIHN0YXJ0dXAgZG9lc24ndCBzdXJmYWNlIGFzIGEgdG9vbCBlcnJvci5cbi8vIGBQYXJhbWV0ZXJzPHR5cGVvZiBmZXRjaD5bMV1gIGRlcml2ZXMgdGhlIHJlcXVlc3QtaW5pdCBzaGFwZVxuLy8gZnJvbSB0aGUgZ2xvYmFsIGBmZXRjaGAgdHlwZSByYXRoZXIgdGhhbiBuYW1pbmcgYFJlcXVlc3RJbml0YFxuLy8gZGlyZWN0bHkgXHUyMDE0IGtlZXBzIHRoZSBmaWxlIGxpbnQtY2xlYW4gdW5kZXIgb3VyIHNoYXJlZCBuby11bmRlZlxuLy8gY29uZmlnIHdpdGhvdXQgbmVlZGluZyBhIGN1c3RvbSBET00tdHlwZXMgdHNjb25maWcgZm9yIHRoZSBob29rXG4vLyBidW5kbGUuXG50eXBlIEZldGNoSW5pdCA9IFBhcmFtZXRlcnM8dHlwZW9mIGZldGNoPlsxXTtcblxuZXhwb3J0IGludGVyZmFjZSBQb3N0UmVxdWVzdCB7XG4gIHVybDogc3RyaW5nO1xuICBpbml0OiBGZXRjaEluaXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEF1dGhQb3N0KHBhdGhuYW1lOiBzdHJpbmcsIGJvZHk/OiB1bmtub3duKTogUG9zdFJlcXVlc3QgfCBudWxsIHtcbiAgY29uc3QgdG9rZW4gPSByZWFkVG9rZW4oKTtcbiAgY29uc3QgcG9ydCA9IHJlYWRQb3J0KCk7XG4gIGlmICghdG9rZW4gfHwgcG9ydCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gIH07XG4gIGNvbnN0IGluaXQ6IEZldGNoSW5pdCA9IHsgbWV0aG9kOiBcIlBPU1RcIiwgaGVhZGVycyB9O1xuICBpZiAoYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIGluaXQuYm9keSA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuICB9XG4gIHJldHVybiB7XG4gICAgdXJsOiBgaHR0cDovLyR7c2VydmVySG9zdCgpfToke3BvcnR9JHtwYXRobmFtZX1gLFxuICAgIGluaXQsXG4gIH07XG59XG5cbi8vIDIgcyBkZWZhdWx0IHRpbWVvdXQuIFBvc3RUb29sVXNlIGhvb2tzIGJsb2NrIENsYXVkZSBDTEkncyB0b29sXG4vLyB0dXJuIHVudGlsIHRoZSBzY3JpcHQgZXhpdHMsIHNvIGEgc2xvdyAvIGh1bmcgcGFyZW50IHNlcnZlclxuLy8gKHJlZnJlc2ggZGVhZGxvY2ssIEdDIHBhdXNlLCB1bnJlbGF0ZWQgbG9uZy1ydW5uaW5nIHJvdXRlKSB3b3VsZFxuLy8gbGVhdmUgdGhlIHVzZXIncyBXcml0ZS9FZGl0IGFwcGVhcmluZyBmcm96ZW4uIFRoZSByZWZyZXNoLXN0eWxlXG4vLyBQT1NUcyBhcmUgZmlyZS1hbmQtZm9yZ2V0IGFueXdheTsgaWYgdGhlIHNlcnZlciBjYW4ndCByZXNwb25kXG4vLyBpbnNpZGUgdGhhdCB3aW5kb3csIHRoZSBmaWxlIGlzIGFscmVhZHkgb24gZGlzayBhbmQgdGhlIG5leHRcbi8vIHJlc3RhcnQgcGlja3MgaXQgdXAuXG5jb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSAyICogT05FX1NFQ09ORF9NUztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhZmVQb3N0KHJlcTogUG9zdFJlcXVlc3QgfCBudWxsLCB0aW1lb3V0TXMgPSBERUZBVUxUX1RJTUVPVVRfTVMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFyZXEpIHJldHVybjtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGltZW91dE1zKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmZXRjaChyZXEudXJsLCB7IC4uLnJlcS5pbml0LCBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBTZXJ2ZXIgbWlnaHQgYmUgcmVzdGFydGluZyAvIHVucmVhY2hhYmxlIC8gdGltZWQgb3V0IFx1MjAxNCBzaWxlbnRcbiAgICAvLyBmYWlsIGlzIGZpbmU7IHRoZSBmaWxlIGlzIG9uIGRpc2sgYW5kIHRoZSBuZXh0IG1hbnVhbCByZXN0YXJ0XG4gICAgLy8gcGlja3MgaXQgdXAuXG4gIH0gZmluYWxseSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgfVxufVxuXG4vLyBGb3J3YXJkIGEgc3RydWN0dXJlZCBsb2cgbGluZSBpbnRvIHRoZSBzZXJ2ZXIncyBsb2dnZXIgdmlhXG4vLyBgUE9TVCAvYXBpL2hvb2tzL2xvZ2AuIEhhbmRsZXJzIGNhbGwgdGhpcyBhZnRlciBlYWNoIG1lYW5pbmdmdWxcbi8vIHNpZGUtZWZmZWN0IChtaXJyb3IgY29weSwgZGVsZXRlLCBldGMuKSBzbyB0aGUgdXNlciBjYW4gdmVyaWZ5XG4vLyBmcm9tIHNlcnZlciBsb2dzIHRoYXQgdGhlIGhvb2sgZmlyZWQgYW5kIHdoYXQgaXQgZGlkLiBUaGUgZW5kcG9pbnRcbi8vIGF1dGhlbnRpY2F0ZXMgdmlhIGJlYXJlciB0b2tlbiAoc2FtZSBhcyBldmVyeSBvdGhlciBpbnRlcm5hbCBob29rXG4vLyBQT1NUKTsgYSBtaXNzaW5nIHRva2VuIC8gcG9ydCBpcyB0aGUgc2lsZW50IG5vLW9wIHNhZmVQb3N0XG4vLyBhbHJlYWR5IGhhbmRsZXMuIDEgcyB0aW1lb3V0IFx1MjAxNCBsb2dnaW5nIHNob3VsZG4ndCBzdGFsbCB0aGUgdXNlcidzXG4vLyB0b29sIHR1cm4gZXZlbiBpZiB0aGUgc2VydmVyIGlzIGJyaWVmbHkgc2xvdy5cbmNvbnN0IExPR19USU1FT1VUX01TID0gT05FX1NFQ09ORF9NUztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlcnZlckxvZyhuYW1lc3BhY2U6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBvcHRpb25zOiB7IGxldmVsPzogXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIjsgZGF0YT86IG9iamVjdCB9ID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYm9keSA9IHtcbiAgICBuYW1lc3BhY2UsXG4gICAgbWVzc2FnZSxcbiAgICBsZXZlbDogb3B0aW9ucy5sZXZlbCA/PyBcImluZm9cIixcbiAgICAuLi4ob3B0aW9ucy5kYXRhID8geyBkYXRhOiBvcHRpb25zLmRhdGEgfSA6IHt9KSxcbiAgfTtcbiAgY29uc3QgcmVxID0gYnVpbGRBdXRoUG9zdChcIi9hcGkvaG9va3MvbG9nXCIsIGJvZHkpO1xuICBhd2FpdCBzYWZlUG9zdChyZXEsIExPR19USU1FT1VUX01TKTtcbn1cbiIsICIvLyBDb21tb24gdGltZSBjb25zdGFudHMgaW4gbWlsbGlzZWNvbmRzLiBBdm9pZHMgbWFnaWMgbnVtYmVycyBsaWtlXG4vLyAzXzYwMF8wMDAgc2NhdHRlcmVkIGFjcm9zcyB0aGUgY29kZWJhc2UuXG4vL1xuLy8gQWxsIHNlcnZlci1zaWRlIGNvZGUgc2hvdWxkIGltcG9ydCBmcm9tIGhlcmUgaW5zdGVhZCBvZiB1c2luZyByYXdcbi8vIG51bWVyaWMgbGl0ZXJhbHMuIFdoZW4gYSBzcGVjaWZpYyBkdXJhdGlvbiBpcyBuZWVkZWQgKGUuZy4gYVxuLy8gNS1zZWNvbmQgdGltZW91dCksIGV4cHJlc3MgaXQgYXMgYDUgKiBPTkVfU0VDT05EX01TYC5cblxuZXhwb3J0IGNvbnN0IE9ORV9TRUNPTkRfTVMgPSAxXzAwMDtcbmV4cG9ydCBjb25zdCBPTkVfTUlOVVRFX01TID0gNjBfMDAwO1xuZXhwb3J0IGNvbnN0IE9ORV9IT1VSX01TID0gM182MDBfMDAwO1xuZXhwb3J0IGNvbnN0IE9ORV9EQVlfTVMgPSA4Nl80MDBfMDAwO1xuXG4vKiogTWFwIHRpbWUtdW5pdCBzdWZmaXhlcyAocy9tL2gpIHRvIG1pbGxpc2Vjb25kcy4gKi9cbmV4cG9ydCBjb25zdCBUSU1FX1VOSVRfTVM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gIHM6IE9ORV9TRUNPTkRfTVMsXG4gIG06IE9ORV9NSU5VVEVfTVMsXG4gIGg6IE9ORV9IT1VSX01TLFxufTtcblxuLy8gXHUyNTAwXHUyNTAwIENvbW1vbiB0aW1lb3V0IHByZXNldHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vLyBOYW1lZCB0aW1lb3V0cyBmb3IgcmVjdXJyaW5nIHBhdHRlcm5zLiBQcmVmZXIgdGhlc2Ugb3ZlciBpbmxpbmVcbi8vIGA1ICogT05FX1NFQ09ORF9NU2Agd2hlbiB0aGUgc2FtZSB2YWx1ZSBpcyB1c2VkIGluIDMrIHBsYWNlcy5cblxuLyoqIFF1aWNrIHN1YnByb2Nlc3MgcHJvYmUgKGRvY2tlciBwcywgbGlicmVvZmZpY2UgLS12ZXJzaW9uLCBldGMuKSAqL1xuZXhwb3J0IGNvbnN0IFNVQlBST0NFU1NfUFJPQkVfVElNRU9VVF9NUyA9IDUgKiBPTkVfU0VDT05EX01TO1xuXG4vKiogRGVib3VuY2Ugd2luZG93IGZvciBkZXYtcGx1Z2luIGBkaXN0L2Agd2F0Y2hlciAoIzExNTkgUFIzKS4gVml0ZVxuICogIHdyaXRlcyA0LTUgZmlsZXMgd2l0aGluIH4xMDBtcyBvbiBhIHNpbmdsZSByZWJ1aWxkOyAzMDBtcyBjb2xsYXBzZXNcbiAqICB0aGUgYnVyc3QgaW50byBvbmUgcHVibGlzaC4gKi9cbmV4cG9ydCBjb25zdCBERVZfUExVR0lOX1dBVENIX0RFQk9VTkNFX01TID0gMzAwO1xuXG4vKiogSGFyZCBjYXAgb24gaG93IGxvbmcgdGhlIHN0YXJ0dXAtZmFpbHVyZSBwYXRoIHdhaXRzIGZvclxuICogIGBodHRwU2VydmVyLmNsb3NlKClgIHRvIGRyYWluIGluLWZsaWdodCBjb25uZWN0aW9ucyBiZWZvcmVcbiAqICBmb3JjaW5nIGBwcm9jZXNzLmV4aXQoMSlgLiBTU0Ugc3RyZWFtcyArIFdlYlNvY2tldCB1cGdyYWRlcyBob2xkXG4gKiAgY29ubmVjdGlvbnMgb3BlbiBpbmRlZmluaXRlbHksIHNvIHRoZSBncmFjZWZ1bCBjbG9zZSBhbG9uZSBpc24ndFxuICogIGEgZmFpbC1mYXN0IGd1YXJhbnRlZS4gKi9cbmV4cG9ydCBjb25zdCBTVEFSVFVQX0ZBSUxVUkVfRk9SQ0VfRVhJVF9NUyA9IDUgKiBPTkVfU0VDT05EX01TO1xuXG4vKiogVGlueSBncmFjZSBhZnRlciBhbiB1bmNhdWdodCBleGNlcHRpb24gLyB1bmhhbmRsZWQgcmVqZWN0aW9uIHNvXG4gKiAgdGhlIGZpbmFsIGBsb2cuZXJyb3JgIGxpbmUgZmx1c2hlcyB0byBkaXNrIGJlZm9yZSB0aGUgcHJvY2Vzc1xuICogIGJvdW5jZXMuIExvbmcgZW5vdWdoIGZvciBhIHN5bmNocm9ub3VzIGFwcGVuZCwgc2hvcnQgZW5vdWdoIG5vdFxuICogIHRvIGRlbGF5IGEgY3Jhc2gtcmVzdGFydCBsb29wLiAqL1xuZXhwb3J0IGNvbnN0IEZBVEFMX0xPR19GTFVTSF9NUyA9IDEwMDtcblxuLyoqIEhlYXZ5IHN1YnByb2Nlc3Mgd29yayAobGlicmVvZmZpY2UgY29udmVyc2lvbiwgZXRjLikgKi9cbmV4cG9ydCBjb25zdCBTVUJQUk9DRVNTX1dPUktfVElNRU9VVF9NUyA9IE9ORV9NSU5VVEVfTVM7XG5cbi8qKiBDTEkgc3VicHJvY2VzcyB0aW1lb3V0IChjbGF1ZGUgLXAgZm9yIHN1bW1hcml6YXRpb24sIGV0Yy4pICovXG5leHBvcnQgY29uc3QgQ0xJX1NVQlBST0NFU1NfVElNRU9VVF9NUyA9IDUgKiBPTkVfTUlOVVRFX01TO1xuXG4vKiogTWF4aW11bSBvbmUtc2hvdCBub3RpZmljYXRpb24gZGVsYXkgKi9cbmV4cG9ydCBjb25zdCBNQVhfTk9USUZJQ0FUSU9OX0RFTEFZX1NFQyA9IDNfNjAwOyAvLyAxIGhvdXIgaW4gc2Vjb25kc1xuIiwgIi8vIFdvcmtzcGFjZSByb290IHJlc29sdXRpb24gZm9yIGhvb2sgc2NyaXB0cy5cbi8vXG4vLyBgQ0xBVURFX1BST0pFQ1RfRElSYCBpcyBzZXQgYnkgQ2xhdWRlIENMSSB0byB0aGUgd29ya3NwYWNlIHJvb3Rcbi8vIHRoZSBob29rIGZpcmVkIGFnYWluc3QgXHUyMDE0IHRoaXMgaXMgdGhlIHZhbHVlIHdlIHRydXN0IGF0IHJ1bnRpbWUuXG4vLyBGYWxsaW5nIGJhY2sgdG8gYH4vbXVsbW9jbGF1ZGVgIGtlZXBzIHRoZSBzY3JpcHQgcm9idXN0IHdoZW4gcnVuXG4vLyBvdXRzaWRlIENMSSBjb250ZXh0ICh0ZXN0IGhhcm5lc3MsIG1hbnVhbCByZXByb2R1Y3Rpb24pLlxuXG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHdvcmtzcGFjZVJvb3QoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LkNMQVVERV9QUk9KRUNUX0RJUiA/PyBwYXRoLmpvaW4oaG9tZWRpcigpLCBcIm11bG1vY2xhdWRlXCIpO1xufVxuIiwgIi8vIFJlYWQgdGhlIEpTT04gUG9zdFRvb2xVc2UgcGF5bG9hZCBDbGF1ZGUgQ0xJIHN0cmVhbXMgb24gc3RkaW4uXG4vLyBSZXR1cm5zIHRoZSBwYXJzZWQgcGF5bG9hZCBvciBudWxsIHdoZW4gdGhlIGlucHV0IGlzIGVtcHR5IC9cbi8vIG1hbGZvcm1lZCBcdTIwMTQgdGhlIGRpc3BhdGNoZXIgdHJlYXRzIG51bGwgYXMgYSBmYXN0IG5vLW9wIHNvIGEgaG9va1xuLy8gZmlyZWQgd2l0aCBubyBib2R5IG5ldmVyIGNyYXNoZXMgdGhlIHVzZXIncyB0b29sIHR1cm4uXG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9va1BheWxvYWQge1xuICB0b29sX25hbWU/OiB1bmtub3duO1xuICB0b29sX2lucHV0Pzoge1xuICAgIGZpbGVfcGF0aD86IHVua25vd247XG4gICAgY29tbWFuZD86IHVua25vd247XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgfTtcbiAgdG9vbF9yZXNwb25zZT86IHtcbiAgICBmaWxlUGF0aD86IHVua25vd247XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgfTtcbiAgc2Vzc2lvbl9pZD86IHVua25vd247XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkSG9va1BheWxvYWQoKTogUHJvbWlzZTxIb29rUGF5bG9hZCB8IG51bGw+IHtcbiAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHByb2Nlc3Muc3RkaW4pIHtcbiAgICBjaHVua3MucHVzaCh0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShjaHVuaykgOiBjaHVuayk7XG4gIH1cbiAgY29uc3QgcmF3ID0gQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gIGlmICghcmF3LnRyaW0oKSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBIb29rUGF5bG9hZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8gRGlmZmVyZW50IHRvb2xzIHN1cmZhY2UgdGhlIHBhdGggdW5kZXIgZGlmZmVyZW50IGtleXMgKFdyaXRlL0VkaXRcbi8vIHVzZSB0b29sX2lucHV0LmZpbGVfcGF0aDsgdGhlIHJlc3BvbnNlIHNoYXBlIHVzZXMgZmlsZVBhdGgpLiBUaGVcbi8vIGhlbHBlciBjaGVja3MgYm90aCBkZWZlbnNpdmVseSBzbyBoYW5kbGVycyBkb24ndCBuZWVkIHRvLlxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RGaWxlUGF0aChwYXlsb2FkOiBIb29rUGF5bG9hZCk6IHN0cmluZyB7XG4gIGNvbnN0IGZyb21JbnB1dCA9IHBheWxvYWQudG9vbF9pbnB1dD8uZmlsZV9wYXRoO1xuICBpZiAodHlwZW9mIGZyb21JbnB1dCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGZyb21JbnB1dDtcbiAgY29uc3QgZnJvbVJlc3BvbnNlID0gcGF5bG9hZC50b29sX3Jlc3BvbnNlPy5maWxlUGF0aDtcbiAgaWYgKHR5cGVvZiBmcm9tUmVzcG9uc2UgPT09IFwic3RyaW5nXCIpIHJldHVybiBmcm9tUmVzcG9uc2U7XG4gIHJldHVybiBcIlwiO1xufVxuXG4vLyBCYXNoIHRvb2wgY2FsbHMgcHV0IHRoZSBzaGVsbCBjb21tYW5kIHN0cmluZyBpbiB0b29sX2lucHV0LmNvbW1hbmQuXG4vLyBFbXB0eSBzdHJpbmcgd2hlbiB0aGUgcGF5bG9hZCBpcyBhIG5vbi1CYXNoIHRvb2wgb3IgbWFsZm9ybWVkLlxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RDb21tYW5kKHBheWxvYWQ6IEhvb2tQYXlsb2FkKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZCA9IHBheWxvYWQudG9vbF9pbnB1dD8uY29tbWFuZDtcbiAgcmV0dXJuIHR5cGVvZiBjb21tYW5kID09PSBcInN0cmluZ1wiID8gY29tbWFuZCA6IFwiXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VG9vbE5hbWUocGF5bG9hZDogSG9va1BheWxvYWQpOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHBheWxvYWQudG9vbF9uYW1lID09PSBcInN0cmluZ1wiID8gcGF5bG9hZC50b29sX25hbWUgOiBcIlwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFNlc3Npb25JZChwYXlsb2FkOiBIb29rUGF5bG9hZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlc3Npb25JZCA9IHBheWxvYWQuc2Vzc2lvbl9pZDtcbiAgcmV0dXJuIHR5cGVvZiBzZXNzaW9uSWQgPT09IFwic3RyaW5nXCIgJiYgc2Vzc2lvbklkLmxlbmd0aCA+IDAgPyBzZXNzaW9uSWQgOiB1bmRlZmluZWQ7XG59XG4iLCAiLy8gQ29uZmlnLXJlZnJlc2ggaGFuZGxlciBcdTIwMTQgZmlyZXMgYWZ0ZXIgV3JpdGUvRWRpdCBvbiBmaWxlcyB0aGF0XG4vLyBkcml2ZSB3b3Jrc3BhY2Ugc3RhdGUgdGhlIHBhcmVudCBzZXJ2ZXIgaG90LXJlbG9hZHM6XG4vL1xuLy8gICA8d3M+Ly5jbGF1ZGUvc2tpbGxzLzxzbHVnPi9TS0lMTC5tZCAgIChtYW51YWwgZWRpdHMgdG8gY2Fub25pY2FsIHNraWxscylcbi8vICAgPHdzPi9jb25maWcvc2NoZWR1bGVyL3Rhc2tzLmpzb24gICAgICAodXNlci10YXNrIHNjaGVkdWxlciBjb25maWcpXG4vL1xuLy8gUE9TVHMgL2FwaS9jb25maWcvcmVmcmVzaCBzbyB0aGUgY2hhbmdlIGFjdGl2YXRlcyB3aXRob3V0IGEgc2VydmVyXG4vLyByZXN0YXJ0LiBNaWdyYXRlZCBmcm9tIGBzZXJ2ZXIvd29ya3NwYWNlL2NvbmZpZy1yZWZyZXNoL2hvb2subWpzYC5cbi8vXG4vLyBOT1RFIG9uIHN0YWdpbmcgc2tpbGxzIChgZGF0YS9za2lsbHMvPHNsdWc+L1NLSUxMLm1kYCk6XG4vLyBUaGUgc3RhZ2luZyBwYXRoIGlzIElOVEVOVElPTkFMTFkgZXhjbHVkZWQgZnJvbSBQQVRURVJOUyBoZXJlLlxuLy8gUmVmcmVzaGluZyBvbiB0aGUgc3RhZ2luZyB3cml0ZSB3b3VsZCByYWNlIHdpdGggYHNraWxsQnJpZGdlYCdzXG4vLyBtaXJyb3IgY29weSBcdTIwMTQgYC9hcGkvY29uZmlnL3JlZnJlc2hgIGNvdWxkIGxhbmQgYmVmb3JlIHRoZSBjYW5vbmljYWxcbi8vIGZpbGUgaXMgd3JpdHRlbiwgbGVhdmluZyBhIGZyZXNoIHNraWxsIHVucmVnaXN0ZXJlZCB1bnRpbCB0aGUgbmV4dFxuLy8gcmVzdGFydC4gYHNraWxsQnJpZGdlYCBvd25zIGl0cyBvd24gcmVmcmVzaCB0cmlnZ2VyIGFuZCBmaXJlcyBpdFxuLy8gQUZURVIgdGhlIG1pcnJvciBzdWNjZWVkcywgc28gdGhlIG9yZGVyaW5nIGlzIGRldGVybWluaXN0aWMuXG5cbmltcG9ydCB7IGJ1aWxkQXV0aFBvc3QsIHNhZmVQb3N0IH0gZnJvbSBcIi4uL3NoYXJlZC9zaWRlY2FyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEhvb2tQYXlsb2FkIH0gZnJvbSBcIi4uL3NoYXJlZC9zdGRpbi5qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEZpbGVQYXRoLCBleHRyYWN0VG9vbE5hbWUgfSBmcm9tIFwiLi4vc2hhcmVkL3N0ZGluLmpzXCI7XG5cbi8vIEVhY2ggcGF0dGVybiBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGFic29sdXRlIHBhdGggdGhlIENMSVxuLy8gZGVsaXZlcmVkLiBXaW5kb3dzIHBhdGggc2VwYXJhdG9ycyBhcmUgdG9sZXJhdGVkIGZvciBjcm9zcy1cbi8vIHBsYXRmb3JtIHJvYnVzdG5lc3MgZXZlbiB0aG91Z2ggdGhlIGhvc3QgaXMgY3VycmVudGx5IGRhcndpbiAvXG4vLyBsaW51eCBvbmx5LlxuY29uc3QgUEFUVEVSTlMgPSBbL1tcXFxcL11cXC5jbGF1ZGVbXFxcXC9dc2tpbGxzW1xcXFwvXVteXFxcXC9dK1tcXFxcL11TS0lMTFxcLm1kJC8sIC9bXFxcXC9dY29uZmlnW1xcXFwvXXNjaGVkdWxlcltcXFxcL110YXNrc1xcLmpzb24kL107XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVDb25maWdSZWZyZXNoKHBheWxvYWQ6IEhvb2tQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHRvb2wgPSBleHRyYWN0VG9vbE5hbWUocGF5bG9hZCk7XG4gIGlmICh0b29sICE9PSBcIldyaXRlXCIgJiYgdG9vbCAhPT0gXCJFZGl0XCIpIHJldHVybjtcblxuICBjb25zdCBmaWxlUGF0aCA9IGV4dHJhY3RGaWxlUGF0aChwYXlsb2FkKTtcbiAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuICBpZiAoIVBBVFRFUk5TLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChmaWxlUGF0aCkpKSByZXR1cm47XG5cbiAgY29uc3QgcmVxID0gYnVpbGRBdXRoUG9zdChcIi9hcGkvY29uZmlnL3JlZnJlc2hcIik7XG4gIGF3YWl0IHNhZmVQb3N0KHJlcSk7XG59XG4iLCAiLy8gU2tpbGwtYnJpZGdlIGhhbmRsZXIgXHUyMDE0IGFnZW50IHdyaXRlcyBza2lsbCBkcmFmdHMgdG9cbi8vIGBkYXRhL3NraWxscy88c2x1Zz4vU0tJTEwubWRgIChhIHBsYWluIGRhdGEgZGlyLCBubyBwZXJtaXNzaW9uXG4vLyBzcGVjaWFsIGNhc2UpIGFuZCB0aGlzIGhvb2sgbWlycm9ycyB0aGVtIGludG9cbi8vIGAuY2xhdWRlL3NraWxscy88c2x1Zz4vU0tJTEwubWRgIHNvIENsYXVkZSBDTEkncyBza2lsbCBkaXNjb3Zlcnlcbi8vIHBpY2tzIHRoZW0gdXAuXG4vL1xuLy8gV2h5IGEgYnJpZGdlOiBDbGF1ZGUgQ29kZSdzIHBlcm1pc3Npb24gc3lzdGVtIGdpdmVzIGAuY2xhdWRlL2Bcbi8vIHN0cmljdGVyIHNjcnV0aW55IHRoYW4gb3JkaW5hcnkgY3dkIHN1YmRpcnMgKHRoZSBkaXIgaG9sZHMgdGhlXG4vLyBhZ2VudCdzIG93biBza2lsbHMgLyBob29rcyAvIHNldHRpbmdzLCBzbyB3cml0ZXMgdGhlcmUgYXJlIGFcbi8vIHNlbGYtbW9kaWZpY2F0aW9uIHJpc2spLiBFdmVuIHdpdGggZXhwbGljaXQgYFdyaXRlKC5jbGF1ZGUvKiopYFxuLy8gYWxsb3cgcnVsZXMgaW4gd29ya3NwYWNlIHNldHRpbmdzLmpzb24sIHdyaXRlcyBwcm9tcHQgXHUyMDE0IGFuZCB0aGVcbi8vIGhvc3QgR1VJIGhhcyBubyBzdXJmYWNlIHRvIGFuc3dlciB0aGUgcHJvbXB0LiBSb3V0aW5nIHdyaXRlc1xuLy8gdGhyb3VnaCBgZGF0YS9za2lsbHMvYCBhdm9pZHMgdGhlIGdhdGU7IHRoaXMgaG9vayAoYSByZWd1bGFyXG4vLyBzdWJwcm9jZXNzLCBOT1QgYSBDbGF1ZGUgdG9vbCBjYWxsKSBkb2VzIHRoZSBtaXJyb3IgY29weSBhbmQgaXNcbi8vIG5vdCBzdWJqZWN0IHRvIHRoZSBnYXRlLlxuLy9cbi8vIFdoeSBtaXJyb3IgYXMgYDxzbHVnPi9TS0lMTC5tZGAgKG5vdCBmbGF0IGA8c2x1Zz4ubWRgKTogQ2xhdWRlXG4vLyBDTEkncyBjYW5vbmljYWwgc2tpbGwgbGF5b3V0IElTIHRoZSBuZXN0ZWQgZm9ybSwgYW5kIHRoZSBhZ2VudFxuLy8gbmF0dXJhbGx5IHdyaXRlcyB0aGF0IHNoYXBlLiBBIGZsYXQgc3RhZ2luZyBwYXRoIGZvcmNlZCB0aGUgYWdlbnRcbi8vIHRvIHJlYXNvbiBhZ2FpbnN0IGl0cyBvd24gdHJhaW5pbmcsIG1pc3NlZCB0aGUgcmVnZXgsIGFuZCB0aGVcbi8vIG1pcnJvciBzaWxlbnRseSBuZXZlciBmaXJlZC4gTWlycm9yaW5nIDE6MSBrZWVwcyB0aGUgcGF0aCBtYXRoXG4vLyB0cml2aWFsIGZvciBib3RoIHNpZGVzLlxuLy9cbi8vIE1pcnJvciBvcGVyYXRpb25zOlxuLy9cbi8vICAgV3JpdGUvRWRpdCBkYXRhL3NraWxscy88c2x1Zz4vU0tJTEwubWRcbi8vICAgICBcdTIxOTIgY29weSBjb250ZW50IHRvIC5jbGF1ZGUvc2tpbGxzLzxzbHVnPi9TS0lMTC5tZFxuLy8gICAgICAgKGNyZWF0ZXMgdGhlIHBhcmVudCBkaXIgb24gZmlyc3QgaW5zdGFsbClcbi8vXG4vLyAgIEJhc2ggXCJybSAtcmYgZGF0YS9za2lsbHMvPHNsdWc+L1wiIG9yIFwicm0gLXJmIGRhdGEvc2tpbGxzLzxzbHVnPlwiXG4vLyAgICAgXHUyMTkyIHJtIC1yZiAuY2xhdWRlL3NraWxscy88c2x1Zz4vXG4vLyAgICAgICAocmVnZXgtbWF0Y2hlZCBzbyB0aGUgYWdlbnQncyBpbnRlbnQgaXMgdW5hbWJpZ3VvdXM7XG4vLyAgICAgICAgYSBidWxrIGBybSAtcmYgZGF0YS9za2lsbHMvYCBvciB3aWxkY2FyZHMgYXJlIGludGVudGlvbmFsbHlcbi8vICAgICAgICBOT1QgbWlycm9yZWQgdG8gYXZvaWQgbWFzcyBkZWxldGlvbiBzdXJwcmlzZXMpXG5cbmltcG9ydCB7IG1rZGlyU3luYywgcmVhZEZpbGVTeW5jLCByZW5hbWVTeW5jLCBybVN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgYnVpbGRBdXRoUG9zdCwgc2FmZVBvc3QsIHNlcnZlckxvZyB9IGZyb20gXCIuLi9zaGFyZWQvc2lkZWNhci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBIb29rUGF5bG9hZCB9IGZyb20gXCIuLi9zaGFyZWQvc3RkaW4uanNcIjtcbmltcG9ydCB7IGV4dHJhY3RDb21tYW5kLCBleHRyYWN0RmlsZVBhdGgsIGV4dHJhY3RUb29sTmFtZSB9IGZyb20gXCIuLi9zaGFyZWQvc3RkaW4uanNcIjtcbmltcG9ydCB7IHdvcmtzcGFjZVJvb3QgfSBmcm9tIFwiLi4vc2hhcmVkL3dvcmtzcGFjZS5qc1wiO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2Vycm9ycy5qc1wiO1xuXG5jb25zdCBEQVRBX1NLSUxMU19ESVIgPSBwYXRoLmpvaW4oXCJkYXRhXCIsIFwic2tpbGxzXCIpO1xuY29uc3QgQ0xBVURFX1NLSUxMU19ESVIgPSBwYXRoLmpvaW4oXCIuY2xhdWRlXCIsIFwic2tpbGxzXCIpO1xuY29uc3QgU0tJTExfRklMRU5BTUUgPSBcIlNLSUxMLm1kXCI7XG5cbi8vIFNsdWdzIGZvbGxvdyBDbGF1ZGUgQ29kZSdzIHNraWxsLW5hbWUgY29udmVudGlvbjogbG93ZXJjYXNlIEFTQ0lJXG4vLyBsZXR0ZXJzIC8gZGlnaXRzIHdpdGggc2luZ2xlLWh5cGhlbiBzZXBhcmF0b3JzLiBNYXRjaGluZyBpc1xuLy8gc3RyaWN0IHNvIGEgdHlwbyBvciBwYXRoIHRyYXZlcnNhbCBhdHRlbXB0IChgLi4vZm9vYCkgbmV2ZXJcbi8vIHJlYWNoZXMgdGhlIGRlc3RpbmF0aW9uIHBhdGggbWF0aC5cbi8vXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LXVuc2FmZS1yZWdleCAtLSBpbnB1dCBpcyBhbHdheXMgYSBiYXNlbmFtZSBzbGljZSBcdTIyNjQgNjQgY2hhcnMsIHNvIHRoZSB0aGVvcmV0aWNhbCB3b3JzdC1jYXNlIGJhY2t0cmFja2luZyBpcyBib3VuZGVkOyB0aGlzIGlzIHRoZSBjYW5vbmljYWwga2ViYWItY2FzZSBwYXR0ZXJuIHVzZWQgYWNyb3NzIHRoZSBza2lsbCB0b29sY2hhaW4uXG5jb25zdCBTTFVHX1JFID0gL15bYS16MC05XSsoLVthLXowLTldKykqJC87XG5cbi8vIGBybSAtcmYgZGF0YS9za2lsbHMvPHNsdWc+YCByZWdleC4gQ2FwdHVyZXMgdGhlIGZsYWcgcnVuIGFzXG4vLyBgbWF0Y2hbMV1gIHNvIHRoZSBjYWxsZXIgY2FuIHBvc3QtdmFsaWRhdGUgdGhhdCB0aGUgdXNlciBwYXNzZWRcbi8vIGEgcmVjdXJzaXZlIGZsYWcgKGAtcmAsIGAtUmAsIGAtcmZgLCBgLWZyYCwgXHUyMDI2KS4gVG9sZXJhdGVzIG9wdGlvbmFsXG4vLyB0cmFpbGluZyBzbGFzaCBhbmQgb3B0aW9uYWwgcXVvdGluZyBhcm91bmQgdGhlIHBhdGguIEEgbGl0ZXJhbFxuLy8gYHJtIC1yZiBkYXRhL3NraWxsc2AgKHRoZSBwYXJlbnQgZGlyIGl0c2VsZikgb3IgcGF0aHMgd2l0aFxuLy8gd2lsZGNhcmRzIC8gc2hlbGwgZXhwYW5zaW9uIGFyZSBpbnRlbnRpb25hbGx5IE5PVCBtYXRjaGVkLlxuLy9cbi8vIFJlY3Vyc2l2ZS1mbGFnIGVuZm9yY2VtZW50IChDb2RleCByZXZpZXcgb24gdGhpcyBQUik6IHBsYWluIGBybWBcbi8vIG9yIGBybSAtZmAgY2Fubm90IHJlbW92ZSBhIGRpcmVjdG9yeSwgc28gdGhlIHN0YWdpbmcgZGVsZXRlIGZhaWxzXG4vLyBzaWxlbnRseSB3aGlsZSB0aGUgY2Fub25pY2FsIGRlbGV0ZSBzdGlsbCBydW5zIFx1MjAxNCBkZXN5bmNpbmcgdGhlXG4vLyB0d28gdHJlZXMuIFJlcXVpcmluZyBhdCBsZWFzdCBvbmUgYHJgIC8gYFJgIGluIHRoZSBmbGFncyByZWplY3RzXG4vLyB0aG9zZSBmb3JtcyBvdXRyaWdodC5cbi8vXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LXVuc2FmZS1yZWdleCAtLSB0aGUgYCgtW2EtejAtOV0rKSpgIHNsdWcgY2xhdXNlIGlzIGJvdW5kZWQgYnkgdGhlIHBhdGggdGFpbCBhbmQgdGhlIGlucHV0IGlzIGEgc2luZ2xlLWxpbmUgQmFzaCBjb21tYW5kIENsYXVkZSBDTEkgY2FwdHVyZWQ7IG5vIHBhdGhvbG9naWNhbCBiYWNrdHJhY2tpbmcgc3VyZmFjZS5cbmNvbnN0IFJNX1JFID0gL15cXHMqcm1cXHMrKCg/Oi1bYS16QS1aXStcXHMrKSspWydcIl0/ZGF0YVxcL3NraWxsc1xcLyhbYS16MC05LV0rKVxcLz9bJ1wiXT9cXHMqJC87XG5jb25zdCBSRUNVUlNJVkVfRkxBR19SRSA9IC9bclJdLztcblxuLy8gUHVyZSBoZWxwZXJzIGV4cG9ydGVkIGZvciB1bml0IHRlc3RpbmcuIFNvdXJjZSBwYXRocyBzdGF5IHJlbGF0aXZlXG4vLyB0byB0aGUgd29ya3NwYWNlIHJvb3QgcmVzb2x2ZWQgYXQgY2FsbCB0aW1lIHNvIHRoZSBoYW5kbGVyIGlzXG4vLyBzYWZlIHRvIHJ1biBmcm9tIGFueSBjd2QuXG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhU2tpbGxEaXIoc2x1Zzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbih3b3Jrc3BhY2VSb290KCksIERBVEFfU0tJTExTX0RJUiwgc2x1Zyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhU2tpbGxGaWxlUGF0aChzbHVnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKGRhdGFTa2lsbERpcihzbHVnKSwgU0tJTExfRklMRU5BTUUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xhdWRlU2tpbGxEaXIoc2x1Zzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbih3b3Jrc3BhY2VSb290KCksIENMQVVERV9TS0lMTFNfRElSLCBzbHVnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYXVkZVNraWxsRmlsZVBhdGgoc2x1Zzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihjbGF1ZGVTa2lsbERpcihzbHVnKSwgU0tJTExfRklMRU5BTUUpO1xufVxuXG4vLyBFeHRyYWN0IHRoZSBzbHVnIGZyb20gYSBXcml0ZS9FZGl0IG9uIGFcbi8vIGBkYXRhL3NraWxscy88c2x1Zz4vU0tJTEwubWRgIHBhdGguIFJldHVybnMgbnVsbCB3aGVuOlxuLy8gICAtIHRoZSBwYXRoIGRvZXNuJ3Qgc2l0IGRpcmVjdGx5IHVuZGVyIGRhdGEvc2tpbGxzLzxzbHVnPi9cbi8vICAgLSB0aGUgZmlsZW5hbWUgaXNuJ3QgU0tJTEwubWRcbi8vICAgLSB0aGUgc2x1ZyBpc24ndCBhIHZhbGlkIGtlYmFiLWNhc2UgaWRlbnRpZmllclxuLy9cbi8vIFNpYmxpbmcgZmlsZXMgaW4gdGhlIHNhbWUgZGlyIChlLmcuIGRhdGEvc2tpbGxzLzxzbHVnPi9SRUFETUUubWRcbi8vIG9yIGRhdGEvc2tpbGxzLzxzbHVnPi9hc3NldHMvZm9vLnBuZykgYXJlIGludGVudGlvbmFsbHkgTk9UXG4vLyBicmlkZ2VkIFx1MjAxNCBvbmx5IHRoZSBjYW5vbmljYWwgU0tJTEwubWQgY3Jvc3NlcyBvdmVyLiBTa2lsbCBhdXRob3JzXG4vLyBjYW4ga2VlcCBleHRyYSBtYXRlcmlhbCBzdGFnaW5nLXNpZGUgdW50aWwgdGhleSBkZWNpZGUgd2hhdFxuLy8gYmVsb25ncyBpbiB0aGUgYnVuZGxlLlxuZXhwb3J0IGZ1bmN0aW9uIHNsdWdGcm9tRGF0YVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCByb290ID0gd29ya3NwYWNlUm9vdCgpO1xuICBjb25zdCBzdGFnaW5nID0gcGF0aC5qb2luKHJvb3QsIERBVEFfU0tJTExTX0RJUik7XG4gIGNvbnN0IHJlbCA9IHBhdGgucmVsYXRpdmUoc3RhZ2luZywgZmlsZVBhdGgpO1xuICBpZiAoIXJlbCB8fCByZWwuc3RhcnRzV2l0aChcIi4uXCIpKSByZXR1cm4gbnVsbDtcbiAgLy8gRXhwZWN0IGV4YWN0bHkgYDxzbHVnPi9TS0lMTC5tZGAgXHUyMDE0IHR3byBzZWdtZW50cyBkZWVwLlxuICBjb25zdCBzZWdtZW50cyA9IHJlbC5zcGxpdChwYXRoLnNlcCk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDIpIHJldHVybiBudWxsO1xuICBjb25zdCBbc2x1ZywgYmFzZW5hbWVdID0gc2VnbWVudHM7XG4gIGlmIChiYXNlbmFtZSAhPT0gU0tJTExfRklMRU5BTUUpIHJldHVybiBudWxsO1xuICByZXR1cm4gU0xVR19SRS50ZXN0KHNsdWcpID8gc2x1ZyA6IG51bGw7XG59XG5cbi8vIEV4dHJhY3QgdGhlIHNsdWcgZnJvbSBhIEJhc2ggYHJtIC1yZiBkYXRhL3NraWxscy88c2x1Zz4vYCBjb21tYW5kLlxuLy8gUmV0dXJucyBudWxsIG9uIGFueSBtaXNtYXRjaCBcdTIwMTQgd2lsZGNhcmRzLCBwYXRocyBvdXRzaWRlIHRoZVxuLy8gc3RhZ2luZyBkaXIsIG9yIG5vbi1yZWN1cnNpdmUgYHJtYCAvIGBybSAtZmAgKHdoaWNoIGNhbid0IGRlbGV0ZVxuLy8gdGhlIHN0YWdpbmcgZGlyIGFueXdheSwgc28gbWlycm9yaW5nIHdvdWxkIGRlc3luYykgYXJlIGFsbFxuLy8gaW50ZW50aW9uYWxseSByZWplY3RlZC5cbmV4cG9ydCBmdW5jdGlvbiBzbHVnRnJvbVJtQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgbWF0Y2ggPSBSTV9SRS5leGVjKGNvbW1hbmQpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgWywgZmxhZ3MsIHNsdWddID0gbWF0Y2g7XG4gIGlmICghUkVDVVJTSVZFX0ZMQUdfUkUudGVzdChmbGFncykpIHJldHVybiBudWxsO1xuICByZXR1cm4gU0xVR19SRS50ZXN0KHNsdWcpID8gc2x1ZyA6IG51bGw7XG59XG5cbi8vIEF0b21pYyBtaXJyb3I6IHdyaXRlIHRvIGEgdG1wIGZpbGUgaW4gdGhlIGRlc3RpbmF0aW9uIGRpciwgdGhlblxuLy8gcmVuYW1lIG9udG8gdGhlIGNhbm9uaWNhbCBwYXRoLiBgZnMucmVuYW1lU3luY2AgaXMgYXRvbWljIG9uIFBPU0lYXG4vLyB3aGVuIHNvdXJjZSArIGRlc3RpbmF0aW9uIHNoYXJlIGEgZmlsZXN5c3RlbSAoYWx3YXlzIHRydWUgaGVyZSBcdTIwMTRcbi8vIGJvdGggYXJlIGluc2lkZSBgLmNsYXVkZS9za2lsbHMvPHNsdWc+L2ApLiBJZiB0aGUgaG9vayBpcyBraWxsZWRcbi8vIG1pZC13cml0ZSwgdGhlIGhhbGYtd3JpdHRlbiB0bXAgZmlsZSBpcyBsZWZ0IGJlaGluZCAoaGFybWxlc3MsXG4vLyBuZXZlciByZWFkKSBhbmQgU0tJTEwubWQgc3RpbGwgaGFzIGl0cyBwcmV2aW91cyBjb250ZW50cyBcdTIwMTQgQ2xhdWRlXG4vLyBDTEkncyBza2lsbCBkaXNjb3ZlcnkgbmV2ZXIgc2VlcyBhIHRvcm4gZmlsZS4gQ29kZVJhYmJpdCByZXZpZXdcbi8vIG9uIFBSICMxMjk4LlxuZnVuY3Rpb24gbWlycm9yV3JpdGUoc2x1Zzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMoZGF0YVNraWxsRmlsZVBhdGgoc2x1ZyksIFwidXRmLThcIik7XG4gIGNvbnN0IGRlc3REaXIgPSBjbGF1ZGVTa2lsbERpcihzbHVnKTtcbiAgbWtkaXJTeW5jKGRlc3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBkZXN0ID0gY2xhdWRlU2tpbGxGaWxlUGF0aChzbHVnKTtcbiAgY29uc3QgdG1wID0gcGF0aC5qb2luKGRlc3REaXIsIGAuU0tJTEwubWQuJHtwcm9jZXNzLnBpZH0udG1wYCk7XG4gIHdyaXRlRmlsZVN5bmModG1wLCBjb250ZW50LCBcInV0Zi04XCIpO1xuICByZW5hbWVTeW5jKHRtcCwgZGVzdCk7XG59XG5cbmZ1bmN0aW9uIG1pcnJvckRlbGV0ZShzbHVnOiBzdHJpbmcpOiB2b2lkIHtcbiAgcm1TeW5jKGNsYXVkZVNraWxsRGlyKHNsdWcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG59XG5cbi8vIGBjb25maWdSZWZyZXNoYCB1c2VkIHRvIGZhbiB0aGlzIG91dCBmb3IgdXMgYXMgYSBzaWJsaW5nIGhhbmRsZXIsXG4vLyBidXQgcnVubmluZyBpdCBpbiBwYXJhbGxlbCB3aXRoIHRoZSBtaXJyb3IgcmFjZSdkOiB0aGVcbi8vIGAvYXBpL2NvbmZpZy9yZWZyZXNoYCBQT1NUIGNvdWxkIGxhbmQgYmVmb3JlIHRoZSBjYW5vbmljYWxcbi8vIGAuY2xhdWRlL3NraWxscy88c2x1Zz4vU0tJTEwubWRgIGV4aXN0ZWQgb24gZGlzaywgbGVhdmluZyBhIGZyZXNoXG4vLyBza2lsbCB1bnJlZ2lzdGVyZWQgdW50aWwgdGhlIG5leHQgcmVzdGFydC4gYHNraWxsQnJpZGdlYCBub3dcbi8vIGZpcmVzIHRoZSByZWZyZXNoIGl0c2VsZiwgQUxXQVlTIGFmdGVyIGEgc3VjY2Vzc2Z1bCBtaXJyb3IgKG9yXG4vLyBkZWxldGUpLCBzbyBvcmRlcmluZyBpcyBkZXRlcm1pbmlzdGljIChDb2RleCByZXZpZXcgb24gdGhpcyBQUikuXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBzYWZlUG9zdChidWlsZEF1dGhQb3N0KFwiL2FwaS9jb25maWcvcmVmcmVzaFwiKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVdyaXRlT3JFZGl0KHBheWxvYWQ6IEhvb2tQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gZXh0cmFjdEZpbGVQYXRoKHBheWxvYWQpO1xuICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG4gIGNvbnN0IHNsdWcgPSBzbHVnRnJvbURhdGFQYXRoKGZpbGVQYXRoKTtcbiAgaWYgKHNsdWcgPT09IG51bGwpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBtaXJyb3JXcml0ZShzbHVnKTtcbiAgICAvLyBPcmRlciBtYXR0ZXJzOiBtaXJyb3IgbXVzdCBjb21wbGV0ZSBiZWZvcmUgcmVmcmVzaCBzbyB0aGVcbiAgICAvLyBzZXJ2ZXIncyBza2lsbCBzY2FuIHNlZXMgdGhlIG5ldyBTS0lMTC5tZC4gU2VlIHJlZnJlc2hDb25maWdcbiAgICAvLyBjb21tZW50IGZvciB0aGUgcmFjZSBoaXN0b3J5LlxuICAgIGF3YWl0IHJlZnJlc2hDb25maWcoKTtcbiAgICAvLyBTZXJ2ZXItc2lkZSBsb2cgbGluZSBzbyB0aGUgdXNlciBjYW4gc2VlIGZyb21cbiAgICAvLyBgc2VydmVyLTxkYXRlPi5sb2dgIHRoYXQgdGhlIGhvb2sgZmlyZWQgYW5kIHdoYXQgaXQgZGlkLlxuICAgIC8vIFdpdGhvdXQgdGhpcyB0aGUgbWlycm9yIGlzIGludmlzaWJsZSBcdTIwMTQgYSBzdWNjZXNzZnVsIGNvcHlcbiAgICAvLyBhbmQgXCJ0aGUgaG9vayBuZXZlciByYW5cIiBsb29rIGlkZW50aWNhbCBmcm9tIHRoZSBjaGF0IFVJLlxuICAgIGF3YWl0IHNlcnZlckxvZyhcInNraWxsLWJyaWRnZVwiLCBgbWlycm9yZWQgJHtkYXRhU2tpbGxGaWxlUGF0aChzbHVnKX0gXHUyMTkyICR7Y2xhdWRlU2tpbGxGaWxlUGF0aChzbHVnKX1gLCB7IGRhdGE6IHsgc2x1Zywgb3A6IFwid3JpdGVcIiB9IH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBUaGUgV3JpdGUgaXRzZWxmIHN1Y2NlZWRlZDsgYSBmYWlsZWQgbWlycm9yIHdvdWxkIGxlYXZlIHRoZVxuICAgIC8vIHN0YWdpbmcgY29weSBpbiBwbGFjZS4gU3VyZmFjZSB0aGUgZmFpbHVyZSB0byBzZXJ2ZXIgbG9nc1xuICAgIC8vIChzbyB0aGUgdXNlciBoYXMgYSBjaGFuY2UgdG8gcmVhY3QpIGJ1dCBuZXZlciB0aHJvdyBcdTIwMTQgdGhlXG4gICAgLy8gdXNlcidzIHRvb2wgdHVybiBtdXN0IHN0YXkgY2xlYW4uXG4gICAgYXdhaXQgc2VydmVyTG9nKFwic2tpbGwtYnJpZGdlXCIsIGBtaXJyb3Igd3JpdGUgZmFpbGVkIGZvciBzbHVnPSR7c2x1Z31gLCB7XG4gICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgZGF0YTogeyBzbHVnLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSxcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVCYXNoKHBheWxvYWQ6IEhvb2tQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBleHRyYWN0Q29tbWFuZChwYXlsb2FkKTtcbiAgaWYgKCFjb21tYW5kKSByZXR1cm47XG4gIGNvbnN0IHNsdWcgPSBzbHVnRnJvbVJtQ29tbWFuZChjb21tYW5kKTtcbiAgaWYgKHNsdWcgPT09IG51bGwpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBtaXJyb3JEZWxldGUoc2x1Zyk7XG4gICAgLy8gU2FtZSBvcmRlcmluZyBpbnZhcmlhbnQgYXMgaGFuZGxlV3JpdGVPckVkaXQgXHUyMDE0IHJlZnJlc2ggbXVzdFxuICAgIC8vIHJ1biBhZnRlciB0aGUgY2Fub25pY2FsIGRpciBpcyBnb25lIHNvIHRoZSBzZXJ2ZXIncyByZXNjYW5cbiAgICAvLyBkZXJlZ2lzdGVycyB0aGUgZGVsZXRlZCBza2lsbC5cbiAgICBhd2FpdCByZWZyZXNoQ29uZmlnKCk7XG4gICAgYXdhaXQgc2VydmVyTG9nKFwic2tpbGwtYnJpZGdlXCIsIGByZW1vdmVkICR7Y2xhdWRlU2tpbGxEaXIoc2x1Zyl9YCwgeyBkYXRhOiB7IHNsdWcsIG9wOiBcImRlbGV0ZVwiIH0gfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIFNhbWUgc2lsZW50LWZhaWwgZGlzY2lwbGluZSBcdTIwMTQgYSBtaXNzZWQgZGVsZXRlIGxlYXZlcyBhblxuICAgIC8vIG9ycGhhbiBpbiBgLmNsYXVkZS9za2lsbHMvYCB0aGF0IHRoZSB1c2VyIGNhbiBjbGVhbiB1cFxuICAgIC8vIG1hbnVhbGx5LCB3aGljaCBpcyBiZXR0ZXIgdGhhbiBhYm9ydGluZyB0aGUgdG9vbCB0dXJuLlxuICAgIGF3YWl0IHNlcnZlckxvZyhcInNraWxsLWJyaWRnZVwiLCBgbWlycm9yIGRlbGV0ZSBmYWlsZWQgZm9yIHNsdWc9JHtzbHVnfWAsIHtcbiAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICBkYXRhOiB7IHNsdWcsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVTa2lsbEJyaWRnZShwYXlsb2FkOiBIb29rUGF5bG9hZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0b29sID0gZXh0cmFjdFRvb2xOYW1lKHBheWxvYWQpO1xuICBpZiAodG9vbCA9PT0gXCJXcml0ZVwiIHx8IHRvb2wgPT09IFwiRWRpdFwiKSB7XG4gICAgYXdhaXQgaGFuZGxlV3JpdGVPckVkaXQocGF5bG9hZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0b29sID09PSBcIkJhc2hcIikge1xuICAgIGF3YWl0IGhhbmRsZUJhc2gocGF5bG9hZCk7XG4gIH1cbn1cbiIsICIvLyBTaGFyZWQgZXJyb3IgaGVscGVycy4gVXNlIGBlcnJvck1lc3NhZ2UoZXJyKWAgaW5zdGVhZCBvZiBpbmxpbmluZ1xuLy8gYGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKWAgXHUyMDE0IHNlYXJjaGluZyBmb3Jcbi8vIG9uZSBjYW5vbmljYWwgaGVscGVyIGlzIGVhc2llciB0aGFuIGdyZXBwaW5nIGZvciB0aGUgaW5saW5lIGZvcm0uXG4vL1xuLy8gTm9uLUVycm9yIG9iamVjdHMgd2l0aCBhIGBkZXRhaWxzYCAoZ1JQQyBjb252ZW50aW9uKSBvciBgbWVzc2FnZWBcbi8vIHN0cmluZyBmaWVsZCBoYXZlIHRoYXQgZmllbGQgc3VyZmFjZWQgXHUyMDE0IHdpdGhvdXQgdGhpcywgZ1JQQyBlcnJvcnNcbi8vIGxpa2UgYHsgY29kZSwgZGV0YWlscywgbWV0YWRhdGEgfWAgc2hvdyB1cCB0byB1c2VycyBhc1xuLy8gYFtvYmplY3QgT2JqZWN0XWAuXG4vL1xuLy8gVGhlIG9wdGlvbmFsIGBmYWxsYmFja2AgY292ZXJzIHRoZSBjb21tb24gcm91dGUtaGFuZGxlciBpZGlvbSB3aGVyZVxuLy8gYSB0aHJvdyBvZiBhIHBsYWluIG5vbi1FcnJvciB2YWx1ZSBzaG91bGQgc3VyZmFjZSBhcyBhIGRlc2NyaXB0aXZlXG4vLyBtZXNzYWdlIChcInJlYnVpbGQgZmFpbGVkXCIpIHJhdGhlciB0aGFuIGBTdHJpbmcoZXJyKWAgbm9pc2UuIFByZWZlclxuLy8gcGFzc2luZyBhIGZhbGxiYWNrIGF0IGVycm9yLXJlc3BvbnNlIGJvdW5kYXJpZXMgXHUyMDE0IG9taXQgaXQgZm9yXG4vLyBsb2dnaW5nIGNvbnRleHRzIHdoZXJlIGBTdHJpbmcoZXJyKWAgaXMgZmluZS5cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnI6IHVua25vd24sIGZhbGxiYWNrPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gZXJyLm1lc3NhZ2U7XG4gIGlmIChlcnIgIT09IG51bGwgJiYgdHlwZW9mIGVyciA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IG9iaiA9IGVyciBhcyB7IGRldGFpbHM/OiB1bmtub3duOyBtZXNzYWdlPzogdW5rbm93biB9O1xuICAgIGlmICh0eXBlb2Ygb2JqLmRldGFpbHMgPT09IFwic3RyaW5nXCIgJiYgb2JqLmRldGFpbHMpIHJldHVybiBvYmouZGV0YWlscztcbiAgICBpZiAodHlwZW9mIG9iai5tZXNzYWdlID09PSBcInN0cmluZ1wiICYmIG9iai5tZXNzYWdlKSByZXR1cm4gb2JqLm1lc3NhZ2U7XG4gIH1cbiAgaWYgKGZhbGxiYWNrICE9PSB1bmRlZmluZWQpIHJldHVybiBmYWxsYmFjaztcbiAgcmV0dXJuIFN0cmluZyhlcnIpO1xufVxuIiwgIi8vIFdpa2kgcGFnZSBzbmFwc2hvdCBoYW5kbGVyIFx1MjAxNCBmaXJlcyBhZnRlciBXcml0ZS9FZGl0IG9uIGEgd2lraVxuLy8gcGFnZSBzbyB0aGUgc25hcHNob3QgcGlwZWxpbmUgKCM3NjMgUFIgMikgcmVjb3JkcyB0aGUgbmV3IHN0YXRlLlxuLy9cbi8vIE1pZ3JhdGVkIGZyb20gYHNlcnZlci93b3Jrc3BhY2Uvd2lraS1oaXN0b3J5L2hvb2svc25hcHNob3QudHNgLlxuLy8gU2FtZSBiZWhhdmlvdXIsIG5vdyBwYXJ0IG9mIHRoZSB1bmlmaWVkIGRpc3BhdGNoZXIgc28gc2V0dGluZ3MuanNvblxuLy8gY2FycmllcyBhIHNpbmdsZSBQb3N0VG9vbFVzZSBlbnRyeSBpbnN0ZWFkIG9mIG9uZSBwZXIgaG9vayBzb3VyY2UuXG5cbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHdpa2lTbHVnRnJvbUFic1BhdGggfSBmcm9tIFwiLi4vLi4vLi4vLi4vc3JjL2xpYi93aWtpLXBhZ2UvcGF0aHMuanNcIjtcbmltcG9ydCB7IGJ1aWxkQXV0aFBvc3QsIHNhZmVQb3N0IH0gZnJvbSBcIi4uL3NoYXJlZC9zaWRlY2FyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEhvb2tQYXlsb2FkIH0gZnJvbSBcIi4uL3NoYXJlZC9zdGRpbi5qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEZpbGVQYXRoLCBleHRyYWN0U2Vzc2lvbklkLCBleHRyYWN0VG9vbE5hbWUgfSBmcm9tIFwiLi4vc2hhcmVkL3N0ZGluLmpzXCI7XG5pbXBvcnQgeyB3b3Jrc3BhY2VSb290IH0gZnJvbSBcIi4uL3NoYXJlZC93b3Jrc3BhY2UuanNcIjtcblxuY29uc3QgV0lLSV9QQUdFU19SRUwgPSBwYXRoLmpvaW4oXCJkYXRhXCIsIFwid2lraVwiLCBcInBhZ2VzXCIpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlV2lraVNuYXBzaG90KHBheWxvYWQ6IEhvb2tQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHRvb2wgPSBleHRyYWN0VG9vbE5hbWUocGF5bG9hZCk7XG4gIC8vIFdpa2kgcGFnZXMgYXJlIHdyaXR0ZW4gdmlhIFdyaXRlIG9yIEVkaXQgXHUyMDE0IEJhc2ggcm0gb3Igc2hlbGxcbiAgLy8gbXV0YXRpb25zIGRvbid0IGdvIHRocm91Z2ggdGhlIHNuYXBzaG90IHBpcGVsaW5lICh0aGUgd2lraVxuICAvLyByb3V0ZSBkb2VzIHRoYXQgZXhwbGljaXRseSBzZXJ2ZXItc2lkZSB3aGVuIG5lZWRlZCkuXG4gIGlmICh0b29sICE9PSBcIldyaXRlXCIgJiYgdG9vbCAhPT0gXCJFZGl0XCIpIHJldHVybjtcblxuICBjb25zdCBmaWxlUGF0aCA9IGV4dHJhY3RGaWxlUGF0aChwYXlsb2FkKTtcbiAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IHdpa2lQYWdlc0RpciA9IHBhdGguam9pbih3b3Jrc3BhY2VSb290KCksIFdJS0lfUEFHRVNfUkVMKTtcbiAgY29uc3Qgc2x1ZyA9IHdpa2lTbHVnRnJvbUFic1BhdGgoZmlsZVBhdGgsIHdpa2lQYWdlc0Rpcik7XG4gIGlmIChzbHVnID09PSBudWxsKSByZXR1cm47XG5cbiAgLy8gUHJlZmVyIHRoZSBwYXJlbnQgc2VydmVyJ3MgY2hhdFNlc3Npb25JZCAoIzk2MykgXHUyMDE0IHRoZSBzZXJ2ZXInc1xuICAvLyBzZXNzaW9uIHN0b3JlIGtleXMgYnkgY2hhdFNlc3Npb25JZCwgbm90IENsYXVkZSBDTEkncyBpbnRlcm5hbFxuICAvLyBzZXNzaW9uX2lkLCBzbyB0aGUgdG9vbFJlc3VsdCBwdWJsaXNoIG9uIHRoZSBzZXJ2ZXIgc2lkZSBvbmx5XG4gIC8vIG1hdGNoZXMgd2hlbiB3ZSBmb3J3YXJkIG91ciBvd24gaWQuIEZhbGwgYmFjayB0byBDbGF1ZGUgQ0xJJ3NcbiAgLy8gc2Vzc2lvbl9pZCB3aGVuIHRoZSBlbnYgdmFyIGlzIGFic2VudC5cbiAgY29uc3QgZW52Q2hhdFNlc3Npb25JZCA9IHByb2Nlc3MuZW52Lk1VTE1PQ0xBVURFX0NIQVRfU0VTU0lPTl9JRDtcbiAgY29uc3QgcGF5bG9hZFNlc3Npb25JZCA9IGV4dHJhY3RTZXNzaW9uSWQocGF5bG9hZCk7XG4gIGNvbnN0IHNlc3Npb25JZCA9IGVudkNoYXRTZXNzaW9uSWQgJiYgZW52Q2hhdFNlc3Npb25JZC5sZW5ndGggPiAwID8gZW52Q2hhdFNlc3Npb25JZCA6IHBheWxvYWRTZXNzaW9uSWQ7XG4gIGNvbnN0IGJvZHkgPSBzZXNzaW9uSWQgPT09IHVuZGVmaW5lZCA/IHsgc2x1ZyB9IDogeyBzbHVnLCBzZXNzaW9uSWQgfTtcblxuICBjb25zdCByZXEgPSBidWlsZEF1dGhQb3N0KFwiL2FwaS93aWtpL2ludGVybmFsL3NuYXBzaG90XCIsIGJvZHkpO1xuICBhd2FpdCBzYWZlUG9zdChyZXEpO1xufVxuIiwgIi8vIE5vZGUtb25seSB3aWtpLXBhZ2UgaGVscGVycyBcdTIwMTQgYW55dGhpbmcgdGhhdCBuZWVkcyBgbm9kZTpwYXRoYFxuLy8gbGl2ZXMgaGVyZSBzbyB0aGUgcmVzdCBvZiBgc3JjL2xpYi93aWtpLXBhZ2UvYCBzdGF5cyBwdXJlXG4vLyAoc3RyaW5nLW9ubHksIGltcG9ydGFibGUgZnJvbSBib3RoIGJyb3dzZXIgYW5kIE5vZGUgYnVuZGxlcykuXG4vLyBGcm9udGVuZCBjb2RlIE1VU1QgTk9UIGltcG9ydCB0aGlzIGZpbGUgZGlyZWN0bHk7IHVzZSB0aGUgcHVyZVxuLy8gbW9kdWxlcyBpbnN0ZWFkLlxuXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBpc1NhZmVTbHVnIH0gZnJvbSBcIi4vc2x1Zy5qc1wiO1xuXG4vKiogR2l2ZW4gYW4gYWJzb2x1dGUgcGF0aCBhbmQgdGhlIGFic29sdXRlIGBwYWdlc0RpcmAsIHJldHVybiB0aGVcbiAqICBzbHVnIGlmIGBhYnNQYXRoYCBpcyBhIGRpcmVjdCBgLm1kYCBjaGlsZCBvZiBgcGFnZXNEaXJgLCBlbHNlXG4gKiAgbnVsbC4gUHVyZSBwYXRoLXN0cmluZyBtYXRoIFx1MjAxNCBubyBmcyBJTywgbm8gc3ltbGluayByZXNvbHV0aW9uLlxuICpcbiAqICBDYWxsZXIgcmVzcG9uc2liaWxpdHk6IHBhc3MgYWxyZWFkeS1yZWFscGF0aCdkIHZhbHVlcyBmb3IgYm90aFxuICogIGFyZ3VtZW50cy4gTWl4aW5nIGEgcmVhbHBhdGgnZCBgYWJzUGF0aGAgd2l0aCBhIHN5bWxpbmtlZFxuICogIGBwYWdlc0RpcmAgKG9yIHZpY2UgdmVyc2EpIHNpbGVudGx5IG1pc21hdGNoZXMgYmVjYXVzZVxuICogIGBwYXRoLnJlbGF0aXZlYCBpcyBwbGFpbiBzdHJpbmcgYXJpdGhtZXRpYy4gVGhlIHRyYXAgY2F1c2VkXG4gKiAgIzg4MyByZXZpZXctaXRlci0xIFx1MjAxNCBhIHN5bWxpbmtlZCB3b3Jrc3BhY2Ugc2lsZW50bHkgcm91dGVkXG4gKiAgd2lraSB3cml0ZXMgdGhyb3VnaCB0aGUgZ2VuZXJpYyB3cml0ZXIuICovXG5leHBvcnQgZnVuY3Rpb24gd2lraVNsdWdGcm9tQWJzUGF0aChhYnNQYXRoOiBzdHJpbmcsIHBhZ2VzRGlyOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgcmVsID0gcGF0aC5yZWxhdGl2ZShwYWdlc0RpciwgYWJzUGF0aCk7XG4gIGlmIChyZWwubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKHBhdGguaXNBYnNvbHV0ZShyZWwpKSByZXR1cm4gbnVsbDtcbiAgLy8gRGlyZWN0IGNoaWxkIG9ubHkgXHUyMDE0IG5vIG5lc3RlZCBsYXlvdXQgdG9kYXkuIEFueSBzZXBhcmF0b3JcbiAgLy8gbWVhbnMgdGhlIHBhdGggZWl0aGVyIGVzY2FwZXMgKGAuLi9zZWNyZXQubWRgKSBvciBkZXNjZW5kc1xuICAvLyAoYHN1YmRpci9mb28ubWRgKS4gQSBsaXRlcmFsIHBhZ2UgbmFtZSBsaWtlIGAuLmZvby5tZGAgaXMgYVxuICAvLyBzaW5nbGUgc2VnbWVudCB3aXRob3V0IGEgc2VwYXJhdG9yIGFuZCBpcyBhbGxvd2VkIChjb2RleFxuICAvLyBpdGVyLTMgIzg4MyBcdTIwMTQgdGhlIHByaW9yIGBzdGFydHNXaXRoKFwiLi5cIilgIHJ1bGUgd3JvbmdseVxuICAvLyByZWplY3RlZCBpdCkuXG4gIGlmIChyZWwuaW5jbHVkZXMocGF0aC5zZXApKSByZXR1cm4gbnVsbDtcbiAgaWYgKCFyZWwuZW5kc1dpdGgoXCIubWRcIikpIHJldHVybiBudWxsO1xuICBjb25zdCBzbHVnID0gcmVsLnNsaWNlKDAsIC1cIi5tZFwiLmxlbmd0aCk7XG4gIGlmICghaXNTYWZlU2x1ZyhzbHVnKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBzbHVnO1xufVxuIiwgIi8vIFB1cmUgd2lraS1wYWdlIHNsdWcgaGVscGVycyBcdTIwMTQgc3RyaW5nLW9ubHksIG5vIE5vZGUgLyBicm93c2VyXG4vLyBkZXBlbmRlbmNpZXMsIGltcG9ydGFibGUgZnJvbSBhbnkgYnVuZGxlLlxuLy9cbi8vIFVzZWQgYnk6XG4vLyAgIC0gc2VydmVyL3dvcmtzcGFjZS93aWtpLXBhZ2VzL2lvLnRzICh0aGUgd3JpdGUgY2hva2Vwb2ludClcbi8vICAgLSBzZXJ2ZXIvd29ya3NwYWNlL2hvb2tzL2hhbmRsZXJzL3dpa2lTbmFwc2hvdC50cyAodGhlXG4vLyAgICAgUG9zdFRvb2xVc2UgaGFuZGxlciB0aGF0IGZpcmVzIG9uIFdyaXRlL0VkaXQgb2YgYSB3aWtpIHBhZ2UpXG4vLyAgIC0gc2VydmVyL2FwaS9yb3V0ZXMvd2lraS50cyAocGFnZSByZXNvbHZlciArIGxpbnQpXG4vLyAgIC0gc2VydmVyL2FwaS9yb3V0ZXMvd2lraS9oaXN0b3J5LnRzIChoaXN0b3J5IHNsdWcgZ3VhcmQpXG4vLyAgIC0gc3JjL3BsdWdpbnMvd2lraS9yb3V0ZS50cyAocm91dGVyIHNsdWcgZ3VhcmQgXHUyMDE0IHJlcGxhY2VzIHRoZVxuLy8gICAgIGxvY2FsIGBpc1NhZmVXaWtpU2x1Z2AgZHVwbGljYXRlIHRoYXQgZXhpc3RlZCBiZWZvcmUgdGhlXG4vLyAgICAgcHVyZS1saWIgcmVmYWN0b3IpXG4vLyAgIC0gc3JjL3BsdWdpbnMvd2lraS9oZWxwZXJzLnRzIChyZW5kZXJlciBzbHVnaWZ5IGZvciBbW1x1MjAyNl1dIGxpbmtzKVxuLy9cbi8vIEFueSBoZWxwZXIgdGhhdCBuZWVkcyBgbm9kZTpwYXRoYCBsaXZlcyBpbiBgLi9wYXRocy50c2Agc28gdGhhdFxuLy8gaW1wb3J0aW5nIHRoaXMgZmlsZSBmcm9tIGZyb250ZW5kIGNvZGUgbmV2ZXIgcHVsbHMgaW4gTm9kZVxuLy8gYnVpbHRpbnMuXG5cbi8qKiBSZWplY3Qgc2x1Z3MgdGhhdCB3b3VsZCBlc2NhcGUgYGRhdGEvd2lraS9wYWdlcy9gIG9uY2VcbiAqICBqb2luZWQgYmFjayBpbnRvIGEgcGF0aCwgb3IgdGhhdCBhcmUgb3RoZXJ3aXNlIGludmFsaWQgYXNcbiAqICBwYWdlIGZpbGVuYW1lcy4gVGhlIGNob2tlcG9pbnQgbXVzdCBkZWZlbmQgaXRzZWxmIGV2ZW4gd2hlblxuICogIGNhbGxlcnMgZGVyaXZlIHRoZSBzbHVnIGZyb20gYSB0cnVzdGVkIHNvdXJjZSBcdTIwMTQgYSB0eXBvIG9yXG4gKiAgZnV0dXJlIGNhbGxlciBtaXN0YWtlIHNob3VsZCBmYWlsIGxvdWQsIG5vdCBzaWxlbnRseSB3cml0ZVxuICogIG91dHNpZGUgdGhlIHdpa2kgdHJlZS5cbiAqXG4gKiAgVGhlIHJ1bGUgaXMgaW50ZW50aW9uYWxseSBuYXJyb3cgXHUyMDE0IHNlcGFyYXRvcnMgLyBgLi5gIC8gTlVMIC9cbiAqICBlbXB0eSBcdTIwMTQgc28gaXQgb25seSByZWplY3RzIHVuYW1iaWd1b3VzIHZpb2xhdGlvbnMuIEFlc3RoZXRpY1xuICogIGNvbmNlcm5zIChlLmcuIGRvdC1wcmVmaXhlZCBmaWxlbmFtZXMpIGFyZSBvdXQgb2Ygc2NvcGU6IGFcbiAqICBwcmUtZXhpc3RpbmcgYGRhdGEvd2lraS9wYWdlcy8uZm9vLm1kYCBzaG91bGQgcmVtYWluIHdyaXRhYmxlXG4gKiAgdGhyb3VnaCB0aGUgY2hva2Vwb2ludCAoY29kZXggcmV2aWV3IGl0ZXItMiAjODgzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmVTbHVnKHNsdWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoc2x1Zy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgaWYgKHNsdWcgPT09IFwiLlwiIHx8IHNsdWcgPT09IFwiLi5cIikgcmV0dXJuIGZhbHNlO1xuICBpZiAoc2x1Zy5pbmNsdWRlcyhcIi9cIikgfHwgc2x1Zy5pbmNsdWRlcyhcIlxcXFxcIikpIHJldHVybiBmYWxzZTtcbiAgaWYgKHNsdWcuaW5jbHVkZXMoXCJcXDBcIikpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBTbHVnIHJ1bGVzIGZvciBgW1t3aWtpIGxpbmtdXWAgdGV4dCBcdTIxOTIgc2x1ZyBkZXJpdmF0aW9uOlxuICogIGxvd2VyY2FzZSwgc3BhY2VzIGNvbGxhcHNlZCB0byBoeXBoZW5zLCBldmVyeSBub24tQVNDSUkgL1xuICogIG5vbi1hbHBoYW51bWVyaWMgLyBub24taHlwaGVuIGNoYXJhY3RlciBzdHJpcHBlZC5cbiAqXG4gKiAgUHVyZTogbm8gbm9ybWFsaXNhdGlvbiwgbm8gdHJhbnNsaXRlcmF0aW9uIFx1MjAxNCB0aGlzIGlzIHRoZVxuICogIHNhbWUgc2hhcGUgdGhlIGluZGV4IHBhcnNlciwgcGFnZSByZXNvbHZlciwgYW5kIGZyb250ZW5kXG4gKiAgcmVuZGVyZXIgYWxsIG5lZWQgdG8gYWdyZWUgb24uIE5vbi1BU0NJSSB0aXRsZXMgKGUuZy5cbiAqICBKYXBhbmVzZSkgY29sbGFwc2UgdG8gYW4gZW1wdHkgc3RyaW5nIGhlcmU7IGNhbGxlcnMgZmFsbCBiYWNrXG4gKiAgdG8gb3RoZXIgc3RyYXRlZ2llcyAodGl0bGUtbWF0Y2ggaW4gdGhlIGluZGV4LCBvciB0aGUgYWdlbnRcbiAqICBwcmUtcmVzb2x2aW5nIHRvIGEgc2x1Zy1mb3JtIHRhcmdldCB2aWEgYFtbc2x1Z3xkaXNwbGF5XV1gKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aWtpU2x1Z2lmeSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCItXCIpXG4gICAgLnJlcGxhY2UoL1teYS16MC05LV0vZywgXCJcIik7XG59XG4iLCAiLy8gUG9zdFRvb2xVc2UgZGlzcGF0Y2hlciBcdTIwMTQgcnVucyBhZnRlciBldmVyeSBDbGF1ZGUgQ0xJIFdyaXRlIC8gRWRpdFxuLy8gLyBCYXNoIHRvb2wgY2FsbCBhbmQgZmFucyBvdXQgdG8gdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMuIEVhY2hcbi8vIGhhbmRsZXIgZGVjaWRlcyBmb3IgaXRzZWxmIHdoZXRoZXIgdGhlIGNhbGwgaXMgcmVsZXZhbnQgKGJ5XG4vLyB0b29sX25hbWUgKyBmaWxlX3BhdGggLyBjb21tYW5kKSwgc28gYWRkaW5nIGEgbmV3IGJlaGF2aW91ciBtZWFuc1xuLy8gZHJvcHBpbmcgYSBuZXcgZmlsZSB1bmRlciBgaGFuZGxlcnMvYCBhbmQgcmVnaXN0ZXJpbmcgaXQgaGVyZSBcdTIwMTRcbi8vIHNldHRpbmdzLmpzb24gbmV2ZXIgY2hhbmdlcy5cbi8vXG4vLyBUSElTIEZJTEUgSVMgVEhFIFNPVVJDRSBPRiBUUlVUSC4gRWRpdHMgaGVyZSwgdGhlbiBydW5cbi8vIGB5YXJuIGJ1aWxkOmhvb2tzYCAob3IgYHlhcm4gYnVpbGRgKSB0byByZWdlbmVyYXRlIGAuL2Rpc3BhdGNoZXIubWpzYC5cbi8vIFRoZSBidW5kbGVkIGAubWpzYCBpcyBjb21taXR0ZWQgdG8gZ2l0IHNvIGBwcm92aXNpb24udHNgIGNhbiByZWFkXG4vLyBpdCBhdCBzZXJ2ZXIgc3RhcnR1cCB3aXRob3V0IGludm9raW5nIGVzYnVpbGQgb24gdGhlIHJ1bnRpbWUgcGF0aC5cbi8vIENJIHJ1bnMgYHlhcm4gYnVpbGQ6aG9va3MgJiYgZ2l0IGRpZmYgLS1leGl0LWNvZGVgIHRvIGNhdGNoIGFcbi8vIHN0YWxlIGJ1bmRsZS5cbi8vXG4vLyBUaGUgaG9vayBleGVjdXRlcyBpbnNpZGUgQ2xhdWRlIENMSSdzIHByb2Nlc3Mgc3BhY2UgXHUyMDE0IG11c3QgYmUgYVxuLy8gc2VsZi1jb250YWluZWQgRVNNIGJ1bmRsZS4gZXNidWlsZCByb2xscyBldmVyeSBpbXBvcnQgKGhhbmRsZXJzLFxuLy8gc2hhcmVkLCBhbmQgdGhlIHdpa2ktc2x1ZyBoZWxwZXIgZnJvbSBgc3JjL2xpYi9gKSBpbnRvIG9uZSBmaWxlLlxuXG5pbXBvcnQgeyBoYW5kbGVDb25maWdSZWZyZXNoIH0gZnJvbSBcIi4vaGFuZGxlcnMvY29uZmlnUmVmcmVzaC5qc1wiO1xuaW1wb3J0IHsgaGFuZGxlU2tpbGxCcmlkZ2UgfSBmcm9tIFwiLi9oYW5kbGVycy9za2lsbEJyaWRnZS5qc1wiO1xuaW1wb3J0IHsgaGFuZGxlV2lraVNuYXBzaG90IH0gZnJvbSBcIi4vaGFuZGxlcnMvd2lraVNuYXBzaG90LmpzXCI7XG5pbXBvcnQgeyByZWFkSG9va1BheWxvYWQsIHR5cGUgSG9va1BheWxvYWQgfSBmcm9tIFwiLi9zaGFyZWQvc3RkaW4uanNcIjtcblxudHlwZSBIYW5kbGVyID0gKHBheWxvYWQ6IEhvb2tQYXlsb2FkKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4vLyBPcmRlciBpcyBpbmZvcm1hdGlvbmFsIG9ubHkgXHUyMDE0IGhhbmRsZXJzIGRvbid0IGludGVyYWN0LiBBZGQgbmV3XG4vLyBlbnRyaWVzIGhlcmUuIEVhY2ggb25lIGlzIHdyYXBwZWQgc28gYW4gaW5kaXZpZHVhbCBmYWlsdXJlXG4vLyBkb2Vzbid0IGJsb2NrIGl0cyBzaWJsaW5ncyAodGhlIHVzZXIncyB0b29sIHR1cm4gd291bGQgdmlzaWJseVxuLy8gc3RhbGwgb3RoZXJ3aXNlKS5cbmNvbnN0IEhBTkRMRVJTOiBIYW5kbGVyW10gPSBbaGFuZGxlV2lraVNuYXBzaG90LCBoYW5kbGVDb25maWdSZWZyZXNoLCBoYW5kbGVTa2lsbEJyaWRnZV07XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkhhbmRsZXIoaGFuZGxlcjogSGFuZGxlciwgcGF5bG9hZDogSG9va1BheWxvYWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBoYW5kbGVyKHBheWxvYWQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBIb29rcyBydW4gc3luY2hyb25vdXNseSB0byB0aGUgTExNIHRvb2wgZmxvdyBcdTIwMTQgbmV2ZXIgdGhyb3cuXG4gICAgLy8gQSBidXN0ZWQgaGFuZGxlciB3b3VsZCBtYWtlIHRoZSB0b29sIGl0c2VsZiBsb29rIGxpa2UgaXRcbiAgICAvLyBmYWlsZWQgdG8gdGhlIExMTSwgd2hpY2ggaXMgbXVjaCB3b3JzZSB0aGFuIGEgbWlzc2VkXG4gICAgLy8gc2lkZS1lZmZlY3QuXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlYWRIb29rUGF5bG9hZCgpO1xuICBpZiAoIXBheWxvYWQpIHJldHVybjtcbiAgLy8gUnVuIGhhbmRsZXJzIGluIHBhcmFsbGVsIFx1MjAxNCB0aGV5IHRvdWNoIGRpc2pvaW50IHJlc291cmNlc1xuICAvLyAod2lraSBzbmFwc2hvdCBlbmRwb2ludCB2cyBjb25maWctcmVmcmVzaCBlbmRwb2ludCB2cyBsb2NhbFxuICAvLyBmaWxlIGNvcHkpIGFuZCBzZXJpYWxpc2luZyB0aGVtIHdvdWxkIHB1c2ggdGhlIHBlci10dXJuXG4gIC8vIGxhdGVuY3kgcGFzdCB0aGUgMiBzIHNhZmVQb3N0IHRpbWVvdXQgdW5kZXIgYmFkIGNvbmRpdGlvbnMuXG4gIGF3YWl0IFByb21pc2UuYWxsKEhBTkRMRVJTLm1hcCgoaGFuZGxlcikgPT4gcnVuSGFuZGxlcihoYW5kbGVyLCBwYXlsb2FkKSkpO1xufVxuXG5tYWluKCkuY2F0Y2goKCkgPT4ge1xuICAvLyBPdXRlcm1vc3Qgc2FmZXR5IG5ldCBcdTIwMTQgc2VlIHJ1bkhhbmRsZXIgY29tbWVudC5cbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7O0FBVUEsU0FBUyxvQkFBb0I7QUFDN0IsT0FBT0EsV0FBVTs7O0FDSlYsSUFBTSxnQkFBZ0I7QUFDdEIsSUFBTSxnQkFBZ0I7QUFnQnRCLElBQU0sOEJBQThCLElBQUk7QUFZeEMsSUFBTSxnQ0FBZ0MsSUFBSTtBQVkxQyxJQUFNLDRCQUE0QixJQUFJOzs7QUN6QzdDLFNBQVMsZUFBZTtBQUN4QixPQUFPLFVBQVU7QUFFVixTQUFTLGdCQUF3QjtBQUN0QyxTQUFPLFFBQVEsSUFBSSxzQkFBc0IsS0FBSyxLQUFLLFFBQVEsR0FBRyxhQUFhO0FBQzdFOzs7QUZHQSxJQUFNLGFBQWE7QUFDbkIsSUFBTSxZQUFZO0FBT1gsU0FBUyxhQUFxQjtBQUNuQyxTQUFPLFFBQVEsSUFBSSxvQkFBb0I7QUFDekM7QUFFQSxTQUFTLFlBQVksS0FBcUI7QUFDeEMsTUFBSTtBQUNGLFdBQU8sYUFBYUMsTUFBSyxLQUFLLGNBQWMsR0FBRyxHQUFHLEdBQUcsT0FBTyxF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
|
|
@@ -12,10 +12,9 @@
|
|
|
12
12
|
// artifacts/ LLM-generated (charts, html, images, documents,
|
|
13
13
|
// spreadsheets, stories, news)
|
|
14
14
|
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
// to the script.
|
|
15
|
+
// Pre-#284 workspaces (with `chat/`, `summaries/`, `memory.md` at the
|
|
16
|
+
// root) continue to boot — the modern layout above is what new
|
|
17
|
+
// installs use, but the older directory names are still accepted.
|
|
19
18
|
//
|
|
20
19
|
// When adding a new top-level directory: add the name to the
|
|
21
20
|
// `WORKSPACE_DIRS` record below. The absolute path is derived
|
|
@@ -154,6 +153,16 @@ const HOST_WORKSPACE_DIRS = {
|
|
|
154
153
|
// so server code references it through `WORKSPACE_PATHS.claudeSkills`
|
|
155
154
|
// instead of inlining the string.
|
|
156
155
|
claudeSkills: ".claude/skills",
|
|
156
|
+
// Skill catalog root (#1335). Holds preset skills shipped with the
|
|
157
|
+
// launcher (`catalog/preset/`) and — in later PRs — git-synced
|
|
158
|
+
// Anthropic skills (`catalog/anthropic/`) and community URL-install
|
|
159
|
+
// entries (`catalog/community/`). Entries here are catalog-only:
|
|
160
|
+
// visible to UI / tooling but NOT discovered by Claude Code's
|
|
161
|
+
// slash-command resolver. An entry becomes active by being copied
|
|
162
|
+
// (or symlinked) into `.claude/skills/`. The catalog vs active
|
|
163
|
+
// split keeps unused skills out of the system prompt.
|
|
164
|
+
skillsCatalog: "data/skills/catalog",
|
|
165
|
+
skillsCatalogPreset: "data/skills/catalog/preset",
|
|
157
166
|
// Nested subdirs inside a top-level grouping. Kept here (rather
|
|
158
167
|
// than module-local constants) when multiple modules need to
|
|
159
168
|
// reference the same nested path — e.g. wiki/pages/ is used by
|