@dbx-tools/core 0.9.121 → 0.9.123

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/lib/src/exec.js CHANGED
@@ -48,12 +48,159 @@ import { readdir, readFile } from "node:fs/promises";
48
48
  import * as readline from "node:readline";
49
49
  import { text } from "node:stream/consumers";
50
50
  import { finished } from "node:stream/promises";
51
+ import { errorUtils, functionUtils, log } from "@dbx-tools/shared-core";
51
52
  /** Shell-compatible exit code returned when an executable cannot be found. */
52
53
  export const COMMAND_NOT_FOUND_EXIT_CODE = 127;
53
- const DEFAULT_GRACEFUL_TIMEOUT_MS = 10_000;
54
- const DEFAULT_FORCE_TIMEOUT_MS = 4_000;
54
+ const DEFAULT_TERMINATE_TIMEOUT_MS = 8_000;
55
+ const DEFAULT_KILL_TIMEOUT_MS = 4_000;
55
56
  const DEFAULT_KILL_POLL_INTERVAL_MS = 100;
57
+ const DEFAULT_TERMINATE_SIGNAL = "SIGTERM";
58
+ const DEFAULT_KILL_SIGNAL = "SIGKILL";
59
+ const FORWARDED_PARENT_SIGNALS = (process.platform === "win32"
60
+ ? ["SIGINT", "SIGTERM", "SIGBREAK"]
61
+ : ["SIGHUP", "SIGINT", "SIGTERM", "SIGQUIT"]);
56
62
  const WINDOWS_PROCESS_SNAPSHOT_SCRIPT = "Get-CimInstance Win32_Process | ForEach-Object { '{0} {1} {2}' -f $_.ProcessId, $_.ParentProcessId, $_.CreationDate.ToFileTimeUtc() }";
63
+ const logger = log.logger("core:exec");
64
+ const parentSignalForwarderState = functionUtils.memoize(() => ({
65
+ children: new Map(),
66
+ handlers: new Map(),
67
+ forwardingSignals: new Set(),
68
+ listeners: new Set(),
69
+ }));
70
+ const parentSignalShutdowns = new WeakMap();
71
+ function registerParentSignalForwarding(child) {
72
+ const pid = child.pid;
73
+ if (pid === undefined)
74
+ return undefined;
75
+ const state = parentSignalForwarderState();
76
+ installParentSignalHandlers(state);
77
+ state.children.set(pid, child);
78
+ return () => {
79
+ if (state.children.get(pid) === child)
80
+ state.children.delete(pid);
81
+ };
82
+ }
83
+ function installParentSignalHandlers(state) {
84
+ if (state.handlers.size > 0)
85
+ return;
86
+ for (const signal of FORWARDED_PARENT_SIGNALS) {
87
+ const handler = () => {
88
+ try {
89
+ forwardParentSignal(state, signal);
90
+ }
91
+ catch (error) {
92
+ reportParentSignalError(signal, undefined, error);
93
+ }
94
+ };
95
+ state.handlers.set(signal, handler);
96
+ process.prependListener(signal, handler);
97
+ }
98
+ }
99
+ /**
100
+ * Subscribe to the process-global parent-termination trap used by {@link spawn}.
101
+ * Does not add a per-subscriber `process` listener; extra listeners would change
102
+ * whether the trap re-raises the signal after children exit.
103
+ *
104
+ * @param listener - Called synchronously when a forwarded parent signal arrives
105
+ * @returns Unsubscribe function
106
+ */
107
+ export function onParentTerminationSignal(listener) {
108
+ const state = parentSignalForwarderState();
109
+ installParentSignalHandlers(state);
110
+ state.listeners.add(listener);
111
+ return () => {
112
+ state.listeners.delete(listener);
113
+ };
114
+ }
115
+ function forwardParentSignal(state, signal) {
116
+ if (state.forwardingSignals.has(signal))
117
+ return;
118
+ for (const listener of state.listeners) {
119
+ try {
120
+ listener(signal);
121
+ }
122
+ catch (error) {
123
+ reportParentSignalError(signal, undefined, error);
124
+ }
125
+ }
126
+ const shutdowns = [];
127
+ for (const [pid, child] of state.children) {
128
+ if (child.exitCode !== null || child.signalCode !== null) {
129
+ state.children.delete(pid);
130
+ continue;
131
+ }
132
+ shutdowns.push(shutdownChildForParentSignal(child, pid, signal));
133
+ }
134
+ const handler = state.handlers.get(signal);
135
+ const completed = Promise.all(shutdowns).catch((error) => {
136
+ reportParentSignalError(signal, undefined, error);
137
+ });
138
+ if (!handler || process.listenerCount(signal) !== passiveSignalListenerCount() + 1) {
139
+ void completed;
140
+ return;
141
+ }
142
+ state.forwardingSignals.add(signal);
143
+ void completed
144
+ .then(() => {
145
+ process.off(signal, handler);
146
+ state.handlers.delete(signal);
147
+ state.forwardingSignals.delete(signal);
148
+ try {
149
+ process.kill(process.pid, signal);
150
+ }
151
+ catch (error) {
152
+ reportParentSignalError(signal, process.pid, error);
153
+ }
154
+ })
155
+ .catch((error) => {
156
+ reportParentSignalError(signal, undefined, error);
157
+ });
158
+ }
159
+ function shutdownChildForParentSignal(child, pid, signal) {
160
+ try {
161
+ const shutdown = parentSignalShutdowns.get(child);
162
+ return (shutdown ? shutdown(signal) : child.shutdown()).catch((error) => {
163
+ reportParentSignalError(signal, pid, error);
164
+ });
165
+ }
166
+ catch (error) {
167
+ reportParentSignalError(signal, pid, error);
168
+ return Promise.resolve();
169
+ }
170
+ }
171
+ function reportParentSignalError(signal, pid, error) {
172
+ if (isExpectedProcessShutdownError(error))
173
+ return;
174
+ try {
175
+ logger.warn("failed to forward parent signal", {
176
+ signal,
177
+ ...(pid === undefined ? {} : { pid }),
178
+ error,
179
+ });
180
+ }
181
+ catch {
182
+ // Signal forwarding must never prevent other process listeners from running.
183
+ }
184
+ }
185
+ function isExpectedProcessShutdownError(error) {
186
+ if (isMissingProcessError(error))
187
+ return true;
188
+ return error instanceof AggregateError && error.errors.every(isExpectedProcessShutdownError);
189
+ }
190
+ function passiveSignalListenerCount() {
191
+ const legacyEmitter = process.__signal_exit_emitter__;
192
+ const modernEmitter = globalThis[Symbol.for("signal-exit emitter")];
193
+ return signalExitEmitterCount(legacyEmitter) + signalExitEmitterCount(modernEmitter);
194
+ }
195
+ function signalExitEmitterCount(emitter) {
196
+ return typeof emitter?.count === "number" ? emitter.count : 0;
197
+ }
198
+ function resolveDetached(detached, forwardTerminationSignals) {
199
+ if (detached !== undefined || forwardTerminationSignals || process.platform === "win32") {
200
+ return detached;
201
+ }
202
+ return true;
203
+ }
57
204
  function parseSpawnArgs(input) {
58
205
  let [value, ...values] = input;
59
206
  const last = values.at(-1);
@@ -142,12 +289,12 @@ function timeoutValue(value, name) {
142
289
  }
143
290
  return value;
144
291
  }
145
- /** Validate a finite positive polling interval. */
146
- function pollIntervalValue(value) {
147
- if (!Number.isFinite(value) || value <= 0) {
148
- throw new RangeError("pollIntervalMs must be a finite positive number");
149
- }
150
- return value;
292
+ /** Reject caller-selected signals so platform shutdown policy stays internal. */
293
+ function rejectSignalOptions(options) {
294
+ const unsupported = options;
295
+ if (unsupported.terminateSignal === undefined && unsupported.killSignal === undefined)
296
+ return;
297
+ throw new TypeError("Process signals are selected internally; configure terminateTimeout and killTimeout instead");
151
298
  }
152
299
  /** Parse the common `pid parentPid identity` process-snapshot format. */
153
300
  function parseProcessSnapshot(lines) {
@@ -209,7 +356,8 @@ async function linuxProcessSnapshot() {
209
356
  *
210
357
  * Linux reads exact start ticks from `/proc`. Windows uses the built-in
211
358
  * PowerShell CIM provider. macOS and other POSIX platforms combine `ps`
212
- * process start time and executable name.
359
+ * process start time and executable name. The helper process is detached so a
360
+ * terminal SIGINT to this process group cannot abort the snapshot.
213
361
  */
214
362
  async function processSnapshot() {
215
363
  if (process.platform === "linux")
@@ -221,6 +369,7 @@ async function processSnapshot() {
221
369
  const proc = nodeSpawn(command, args, {
222
370
  stdio: ["ignore", "pipe", "pipe"],
223
371
  windowsHide: true,
372
+ detached: true,
224
373
  });
225
374
  const stdout = text(proc.stdout);
226
375
  const stderr = text(proc.stderr);
@@ -230,6 +379,16 @@ async function processSnapshot() {
230
379
  }
231
380
  return parseProcessSnapshot(linesFromCapturedOutput(stdoutText));
232
381
  }
382
+ /** Read a process snapshot, or `undefined` when the process table cannot be listed. */
383
+ async function tryProcessSnapshot() {
384
+ try {
385
+ return await processSnapshot();
386
+ }
387
+ catch (error) {
388
+ logger.debug("process snapshot failed", { error: errorUtils.toError(error) });
389
+ return undefined;
390
+ }
391
+ }
233
392
  /** Group a process snapshot by parent PID. */
234
393
  function processChildren(snapshot) {
235
394
  const children = new Map();
@@ -341,7 +500,13 @@ async function waitForProcessTreeExit(retained, initialProcesses, signal, signal
341
500
  const remainingMs = deadline - Date.now();
342
501
  if (remainingMs > 0)
343
502
  await delay(Math.min(pollIntervalMs, remainingMs));
344
- const refreshed = refreshProcessTree(retained, await processSnapshot());
503
+ const snapshot = await tryProcessSnapshot();
504
+ if (snapshot === undefined) {
505
+ if (Date.now() >= deadline)
506
+ break;
507
+ continue;
508
+ }
509
+ const refreshed = refreshProcessTree(retained, snapshot);
345
510
  if (signalDiscovered && refreshed.discovered.length > 0) {
346
511
  signalProcesses(refreshed.discovered, signal, signaled);
347
512
  }
@@ -591,62 +756,54 @@ function linesFromCapturedOutput(output) {
591
756
  * The initial tree is retained before signaling so descendants remain
592
757
  * targetable after their parent exits or they are reparented. Polling refreshes
593
758
  * the process table, merges newly created descendants, and sends each one the
594
- * active shutdown signal once. Either phase can be disabled for graceful-only
595
- * or force-only termination. macOS and other POSIX platforms use `ps`; Windows
596
- * uses the built-in PowerShell CIM process provider.
759
+ * active shutdown signal once. macOS and other POSIX platforms use `ps`;
760
+ * Windows uses the built-in PowerShell CIM process provider.
597
761
  *
598
762
  * Windows does not implement POSIX signal semantics. Node terminates processes
599
763
  * unconditionally for supported signals there, including `SIGTERM`.
600
764
  *
601
765
  * @param child - Root child process whose snapshotted tree should stop
602
- * @param options - Graceful signal, force signal, timeout, and polling policy
603
- * @throws When the process table cannot be captured, a signal cannot be sent,
604
- * or identity-matched processes remain after the final enabled phase
766
+ * @param options - Graceful and forced shutdown timeout policy
767
+ * @param terminateSignal - Internal signal selected from the parent event or platform default
605
768
  */
606
- export async function kill(child, options = {}) {
769
+ async function terminateProcessTree(child, options = {}, terminateSignal = DEFAULT_TERMINATE_SIGNAL) {
607
770
  if (child.pid === undefined || child.exitCode !== null || child.signalCode !== null) {
608
771
  return;
609
772
  }
610
- const gracefulTimeoutMs = timeoutValue(options.gracefulTimeoutMs ?? DEFAULT_GRACEFUL_TIMEOUT_MS, "gracefulTimeoutMs");
611
- const forceTimeoutMs = timeoutValue(options.forceTimeoutMs ?? DEFAULT_FORCE_TIMEOUT_MS, "forceTimeoutMs");
612
- const pollIntervalMs = pollIntervalValue(options.pollIntervalMs ?? DEFAULT_KILL_POLL_INTERVAL_MS);
613
- const snapshot = await processSnapshot();
773
+ const terminateTimeout = timeoutValue(options.terminateTimeout ?? DEFAULT_TERMINATE_TIMEOUT_MS, "terminateTimeout");
774
+ const killTimeout = timeoutValue(options.killTimeout ?? DEFAULT_KILL_TIMEOUT_MS, "killTimeout");
775
+ const pollIntervalMs = DEFAULT_KILL_POLL_INTERVAL_MS;
776
+ const snapshot = await tryProcessSnapshot();
614
777
  if (child.exitCode !== null || child.signalCode !== null)
615
778
  return;
779
+ if (snapshot === undefined) {
780
+ try {
781
+ process.kill(child.pid, terminateSignal);
782
+ }
783
+ catch (error) {
784
+ if (!isMissingProcessError(error))
785
+ throw error;
786
+ }
787
+ return;
788
+ }
616
789
  const tree = processTree(snapshot, child.pid);
617
790
  const retained = new Map(tree.map((entry) => [entry.pid, entry]));
618
- const gracefulSignal = options.gracefulSignal === undefined ? "SIGTERM" : options.gracefulSignal;
619
- const gracefulSignalTarget = options.gracefulSignalTarget ?? "tree";
620
- const forceSignal = options.forceSignal === undefined ? "SIGKILL" : options.forceSignal;
621
- if (gracefulSignalTarget !== "root" && gracefulSignalTarget !== "tree") {
622
- throw new RangeError("gracefulSignalTarget must be root or tree");
623
- }
624
- if (gracefulSignal === false && forceSignal === false) {
625
- throw new Error("At least one process-tree termination signal must be enabled");
626
- }
627
- let forceTargets = tree;
628
- if (gracefulSignal !== false) {
629
- const gracefulSignaled = new Set();
630
- const gracefulTargets = gracefulSignalTarget === "root" ? [tree.at(-1)] : tree;
631
- signalProcesses(gracefulTargets, gracefulSignal, gracefulSignaled);
632
- forceTargets = await waitForProcessTreeExit(retained, tree, gracefulSignal, gracefulSignaled, gracefulTimeoutMs, pollIntervalMs, gracefulSignalTarget === "tree");
633
- }
634
- if (forceTargets.length === 0)
791
+ const terminated = new Set();
792
+ signalProcesses(tree, terminateSignal, terminated);
793
+ const killTargets = await waitForProcessTreeExit(retained, tree, terminateSignal, terminated, terminateTimeout, pollIntervalMs, true);
794
+ if (killTargets.length === 0)
635
795
  return;
636
- if (forceSignal === false) {
637
- if (gracefulSignal === false) {
638
- throw new Error("At least one process-tree termination signal must be enabled");
639
- }
640
- throw processTerminationError(gracefulSignal, forceTargets);
641
- }
642
- const forceSignaled = new Set();
643
- signalProcesses(forceTargets, forceSignal, forceSignaled);
644
- const forcedSurvivors = await waitForProcessTreeExit(retained, forceTargets, forceSignal, forceSignaled, forceTimeoutMs, pollIntervalMs, true);
645
- if (forcedSurvivors.length > 0)
646
- throw processTerminationError(forceSignal, forcedSurvivors);
647
- }
648
- function processTerminationError(signal, processes) {
649
- return new Error(`Processes did not terminate after ${signal}: ${processes.map((entry) => entry.pid).join(", ")}`);
796
+ const killed = new Set();
797
+ signalProcesses(killTargets, DEFAULT_KILL_SIGNAL, killed);
798
+ const survivors = await waitForProcessTreeExit(retained, killTargets, DEFAULT_KILL_SIGNAL, killed, killTimeout, pollIntervalMs, true);
799
+ if (survivors.length === 0)
800
+ return;
801
+ logger.warn("process tree still running after kill timeout", {
802
+ rootPid: child.pid,
803
+ survivorPids: survivors.map((entry) => entry.pid),
804
+ killSignal: DEFAULT_KILL_SIGNAL,
805
+ killTimeout,
806
+ });
650
807
  }
651
808
  /**
652
809
  * Spawn a subprocess. Returns the LIVE child handle that is ALSO a
@@ -656,7 +813,7 @@ function processTerminationError(signal, processes) {
656
813
  * exit (and any line reads / stdin write), then resolves to the {@link ExecResult}
657
814
  * or rejects (spawn error other than a missing executable, or `check` on non-zero
658
815
  * exit). Existing `await spawn(...)` callers are unaffected. The handle half lets a
659
- * caller supervise the process (`.pid`, `.kill(signal)`, `exit` event) without a
816
+ * caller supervise the process (`.pid`, `.shutdown()`, `exit` event) without a
660
817
  * second spawn.
661
818
  *
662
819
  * @param command - Executable to run (resolved on `PATH` when `shell` is set on options)
@@ -668,7 +825,12 @@ function processTerminationError(signal, processes) {
668
825
  */
669
826
  export function spawn(...args) {
670
827
  const { command, commandArgs, options = {} } = parseSpawnArgs(args);
671
- const { stdin, stdout, stderr, check, trim, ...spawnOpts } = options;
828
+ rejectSignalOptions(options);
829
+ const { stdin, stdout, stderr, forwardTerminationSignals = true, terminateTimeout, killTimeout, check, trim, ...spawnOpts } = options;
830
+ const terminationOptions = {
831
+ terminateTimeout,
832
+ killTimeout,
833
+ };
672
834
  const stdoutLines = [];
673
835
  const stderrLines = [];
674
836
  const stdoutHandler = resolveStdio(stdout, stdoutLines);
@@ -676,46 +838,68 @@ export function spawn(...args) {
676
838
  const stdinMode = isStdinPayload(stdin) ? "pipe" : (stdin ?? "inherit");
677
839
  const proc = nodeSpawn(command, commandArgs, {
678
840
  ...spawnOpts,
841
+ detached: resolveDetached(spawnOpts.detached, forwardTerminationSignals),
679
842
  stdio: [stdinMode, stdoutHandler.mode, stderrHandler.mode],
680
843
  });
844
+ const child = attachProcessControls(proc, terminationOptions);
845
+ const unregisterSignalForwarding = forwardTerminationSignals
846
+ ? registerParentSignalForwarding(child)
847
+ : undefined;
681
848
  const stdinWrite = writeStdin(proc, stdin);
682
849
  const reads = [];
683
850
  queueLineReads(reads, proc.stdout, stdoutHandler);
684
851
  queueLineReads(reads, proc.stderr, stderrHandler);
685
852
  const completion = (async () => {
686
- let exitCode = 1;
687
- let commandNotFoundError;
688
853
  try {
689
- exitCode = await waitForExit(proc);
690
- await Promise.all([stdinWrite, ...reads]);
691
- }
692
- catch (err) {
693
- if (!isCommandNotFoundError(err)) {
694
- await Promise.allSettled([stdinWrite, ...reads]);
854
+ let exitCode = 1;
855
+ let commandNotFoundError;
856
+ try {
857
+ exitCode = await waitForExit(proc);
858
+ await Promise.all([stdinWrite, ...reads]);
859
+ }
860
+ catch (err) {
861
+ if (!isCommandNotFoundError(err)) {
862
+ await Promise.allSettled([stdinWrite, ...reads]);
863
+ throw err;
864
+ }
865
+ proc.stdin?.destroy();
866
+ proc.stdout?.destroy();
867
+ proc.stderr?.destroy();
868
+ await Promise.allSettled([stdinWrite]);
869
+ for (const read of reads)
870
+ void read.catch(() => undefined);
871
+ commandNotFoundError = err;
872
+ exitCode = COMMAND_NOT_FOUND_EXIT_CODE;
873
+ }
874
+ const result = createExecResult(exitCode, stdoutLines, stderrLines, trim);
875
+ if (check && result.exitCode !== 0) {
876
+ const err = execError(command, commandArgs, result);
877
+ if (commandNotFoundError)
878
+ err.cause = commandNotFoundError;
695
879
  throw err;
696
880
  }
697
- proc.stdin?.destroy();
698
- proc.stdout?.destroy();
699
- proc.stderr?.destroy();
700
- await Promise.allSettled([stdinWrite]);
701
- for (const read of reads)
702
- void read.catch(() => undefined);
703
- commandNotFoundError = err;
704
- exitCode = COMMAND_NOT_FOUND_EXIT_CODE;
881
+ return result;
705
882
  }
706
- const result = createExecResult(exitCode, stdoutLines, stderrLines, trim);
707
- if (check && result.exitCode !== 0) {
708
- const err = execError(command, commandArgs, result);
709
- if (commandNotFoundError)
710
- err.cause = commandNotFoundError;
711
- throw err;
883
+ finally {
884
+ unregisterSignalForwarding?.();
712
885
  }
713
- return result;
714
886
  })();
715
887
  // Attach the promise interface onto the live child so ONE object is both. The
716
888
  // methods are bound to `completion` so `this` is the real promise; the child
717
889
  // owns no conflicting `then`/`catch`/`finally`, so this is purely additive.
718
- return attachPromise(proc, completion);
890
+ return attachPromise(child, completion);
891
+ }
892
+ function attachProcessControls(child, defaults) {
893
+ const controlled = child;
894
+ let shutdownPromise;
895
+ const shutdown = (options, terminateSignal = DEFAULT_TERMINATE_SIGNAL) => {
896
+ rejectSignalOptions(options);
897
+ shutdownPromise ??= terminateProcessTree(child, { ...defaults, ...options }, terminateSignal);
898
+ return shutdownPromise;
899
+ };
900
+ controlled.shutdown = (options = {}) => shutdown(options);
901
+ parentSignalShutdowns.set(controlled, (signal) => shutdown({}, signal));
902
+ return controlled;
719
903
  }
720
904
  /**
721
905
  * Attach a promise's `then` / `catch` / `finally` onto a live object, returning
@@ -744,6 +928,7 @@ function attachPromise(target, promise) {
744
928
  */
745
929
  export function spawnSync(...args) {
746
930
  const { command, commandArgs, options = {} } = parseSpawnArgs(args);
931
+ rejectSignalOptions(options);
747
932
  const { stdin, stdout, stderr, check, trim, ...spawnOpts } = options;
748
933
  const stdinMode = isStdinPayload(stdin) ? "pipe" : (stdin ?? "inherit");
749
934
  const captureStdout = stdout === "capture";
@@ -838,4 +1023,4 @@ export function shlex(command) {
838
1023
  push();
839
1024
  return args.length ? args : [command];
840
1025
  }
841
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRDRztBQUNILE9BQU8sRUFHTCxLQUFLLElBQUksU0FBUyxFQUNsQixTQUFTLElBQUksYUFBYSxHQUMzQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxLQUFLLFFBQVEsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFDO0FBRS9DLE1BQU0sMkJBQTJCLEdBQUcsTUFBTSxDQUFDO0FBQzNDLE1BQU0sd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0FBQ3ZDLE1BQU0sNkJBQTZCLEdBQUcsR0FBRyxDQUFDO0FBQzFDLE1BQU0sK0JBQStCLEdBQ25DLHVJQUF1SSxDQUFDO0FBaUsxSSxTQUFTLGNBQWMsQ0FBeUIsS0FBbUI7SUFDakUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUUvQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsTUFBTSxPQUFPLEdBQ1gsSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN2RixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM5RCxtR0FBbUc7SUFDbkcsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLFdBQVcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBTSxDQUFDLENBQUM7SUFDekYsTUFBTSxTQUFTLEdBQ2IsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsQ0FBQyxDQUFDLGNBQWMsQ0FBQztJQUVyQixPQUFPO1FBQ0wsT0FBTyxFQUFFLE9BQVE7UUFDakIsV0FBVyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxTQUFTLENBQUM7UUFDM0MsT0FBTyxFQUFFLE9BQVk7S0FDdEIsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLDZCQUE2QixDQUFDLEtBQXdCO0lBQzdELElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDdkQsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDRCxPQUFPLEtBQWlCLENBQUM7QUFDM0IsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixTQUFTLHlCQUF5QixDQUFDLElBQVk7SUFDN0MsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELGdEQUFnRDtBQUNoRCxTQUFTLG9CQUFvQixDQUFDLEtBQXdCLEVBQUUsSUFBeUI7SUFDL0UsSUFBSSxJQUFJLEtBQUssSUFBSTtRQUFFLE9BQU8sdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLE9BQU8sS0FBaUIsQ0FBQztBQUMzQixDQUFDO0FBRUQseURBQXlEO0FBQ3pELFNBQVMsd0JBQXdCLENBQUMsS0FBd0IsRUFBRSxJQUF5QjtJQUNuRixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDaEQsQ0FBQztBQUVELCtDQUErQztBQUMvQyxTQUFTLG1CQUFtQixDQUFDLEtBQXdCLEVBQUUsSUFBeUI7SUFDOUUsSUFBSSxJQUFJLEtBQUssS0FBSztRQUFFLE9BQU8sS0FBaUIsQ0FBQztJQUM3QyxJQUFJLElBQUksS0FBSyxJQUFJO1FBQUUsT0FBTyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0UsT0FBTyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsK0NBQStDO0FBQy9DLFNBQVMsc0JBQXNCLENBQzdCLElBQXdCLEVBQ3hCLElBQXlCO0lBRXpCLElBQUksSUFBSSxLQUFLLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN6QyxJQUFJLElBQUksS0FBSyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDaEMsSUFBSSxJQUFJLEtBQUssSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RDLE9BQU8seUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsWUFBWSxDQUFDLE9BQWUsRUFBRSxJQUFjO0lBQ25ELE9BQU8sS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQzVDLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsU0FBUyxzQkFBc0IsQ0FBQyxLQUFjO0lBQzVDLE9BQU8sS0FBSyxZQUFZLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO0FBQzlFLENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsU0FBUyxxQkFBcUIsQ0FBQyxLQUFjO0lBQzNDLE9BQU8sS0FBSyxZQUFZLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDO0FBQzdFLENBQUM7QUFFRCw4Q0FBOEM7QUFDOUMsU0FBUyxZQUFZLENBQUMsS0FBYSxFQUFFLElBQVk7SUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxJQUFJLHVDQUF1QyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELG1EQUFtRDtBQUNuRCxTQUFTLGlCQUFpQixDQUFDLEtBQWE7SUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sSUFBSSxVQUFVLENBQUMsaURBQWlELENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLFNBQVMsb0JBQW9CLENBQUMsS0FBd0I7SUFDcEQsTUFBTSxRQUFRLEdBQTJCLEVBQUUsQ0FBQztJQUM1QyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUTtZQUFFLFNBQVM7UUFDbEMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNaLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUUsRUFBRSxFQUFFLENBQUM7WUFDbkMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxFQUFFLEVBQUUsQ0FBQztZQUN6QyxRQUFRO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCx3RkFBd0Y7QUFDeEYsU0FBUyx1QkFBdUIsQ0FBQyxLQUFjO0lBQzdDLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2xFLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDdEYsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxTQUFTLHFCQUFxQixDQUFDLEdBQVcsRUFBRSxJQUFZO0lBQ3RELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsSUFBSSxVQUFVLEdBQUcsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUk7U0FDaEIsS0FBSyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7U0FDckIsSUFBSSxFQUFFO1NBQ04sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN0RSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDbEQsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixLQUFLLFVBQVUsb0JBQW9CO0lBQ2pDLE1BQU0sV0FBVyxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDL0IsV0FBVztTQUNSLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUE2QyxFQUFFO1FBQzlELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUM7WUFDSCxPQUFPLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQyxTQUFTLEtBQUssQ0FBQyxJQUFJLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSx1QkFBdUIsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDckQsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNGLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBaUMsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsS0FBSyxVQUFVLGVBQWU7SUFDNUIsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU87UUFBRSxPQUFPLG9CQUFvQixFQUFFLENBQUM7SUFFaEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdkUsTUFBTSxJQUFJLEdBQ1IsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPO1FBQzFCLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLCtCQUErQixDQUFDO1FBQzNGLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUUsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7UUFDcEMsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7UUFDakMsV0FBVyxFQUFFLElBQUk7S0FDbEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFPLENBQUMsQ0FBQztJQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU8sQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNsRyxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksS0FBSyxDQUNiLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQWlCLFFBQVEsSUFDckQsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUMxQyxFQUFFLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLG9CQUFvQixDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUVELDhDQUE4QztBQUM5QyxTQUFTLGVBQWUsQ0FDdEIsUUFBeUM7SUFFekMsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7SUFDM0QsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUM3QixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckQsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsU0FBUyxXQUFXLENBQ2xCLFFBQXlDLEVBQ3pDLE9BQWU7SUFFZixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLE9BQU8sQ0FBQyxDQUFDO0lBQzdELElBQUksQ0FBQyxJQUFJO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUUxRSxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0MsTUFBTSxJQUFJLEdBQTJCLEVBQUUsQ0FBQztJQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDM0MsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFNBQWlCLEVBQVEsRUFBRTtRQUNwRCxLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDbEQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7Z0JBQUUsU0FBUztZQUNyQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QixpQkFBaUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsU0FBUyxXQUFXLENBQUMsUUFBOEIsRUFBRSxPQUE2QjtJQUNoRixPQUFPLFFBQVEsQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUNoRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FDekIsUUFBMkMsRUFDM0MsUUFBeUM7SUFFekMsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRSxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFDMUQsTUFBTSxVQUFVLEdBQTJCLEVBQUUsQ0FBQztJQUM5QyxNQUFNLEtBQUssR0FBMkIsRUFBRSxDQUFDO0lBRXpDLEtBQUssTUFBTSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDekMsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO1lBQUUsU0FBUztRQUMxRCxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNyRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFFLENBQUM7UUFDN0IsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNuRCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekIsQ0FBQztZQUNELFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxTQUFTO1lBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUM1RCxDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLFNBQVMsZUFBZSxDQUFDLEtBQTJCO0lBQ2xELE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUMxQyxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLFNBQVMsZUFBZSxDQUN0QixTQUEwQyxFQUMxQyxNQUFzQixFQUN0QixRQUFxQjtJQUVyQixNQUFNLE1BQU0sR0FBYyxFQUFFLENBQUM7SUFDN0IsS0FBSyxNQUFNLEtBQUssSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUM5QixNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUFFLFNBQVM7UUFDckMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUM7WUFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLE1BQU0sK0JBQStCLENBQUMsQ0FBQztJQUM1RixDQUFDO0FBQ0gsQ0FBQztBQUVELDBFQUEwRTtBQUMxRSxTQUFTLEtBQUssQ0FBQyxZQUFvQjtJQUNqQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsc0JBQXNCLENBQ25DLFFBQTJDLEVBQzNDLGdCQUFpRCxFQUNqRCxNQUFzQixFQUN0QixRQUFxQixFQUNyQixTQUFpQixFQUNqQixjQUFzQixFQUN0QixnQkFBeUI7SUFFekIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUM7SUFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztJQUN4QyxPQUFPLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUIsTUFBTSxXQUFXLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQyxJQUFJLFdBQVcsR0FBRyxDQUFDO1lBQUUsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUV4RSxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLElBQUksZ0JBQWdCLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEQsZUFBZSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFDRCxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUNoQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxRQUFRO1lBQUUsTUFBTTtJQUNwQyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQ3ZCLFFBQWdCLEVBQ2hCLFdBQXFCLEVBQ3JCLFdBQXFCLEVBQ3JCLElBQXlCO0lBRXpCLE9BQU87UUFDTCxRQUFRO1FBQ1IsSUFBSSxXQUFXO1lBQ2IsT0FBTyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELElBQUksV0FBVztZQUNiLE9BQU8sb0JBQW9CLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFJLE1BQU07WUFDUixPQUFPLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxNQUFNO1lBQ1IsT0FBTyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckQsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FDM0IsUUFBZ0IsRUFDaEIsVUFBOEIsRUFDOUIsVUFBOEIsRUFDOUIsSUFBeUI7SUFFekIsSUFBSSxnQkFBc0MsQ0FBQztJQUMzQyxJQUFJLGdCQUFzQyxDQUFDO0lBRTNDLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBd0IsRUFBd0IsRUFBRTtRQUNuRSxJQUFJLElBQUksS0FBSyxTQUFTO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDekMsT0FBTyxtQkFBbUIsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUM7SUFFRixPQUFPO1FBQ0wsUUFBUTtRQUNSLElBQUksV0FBVztZQUNiLElBQUksVUFBVSxLQUFLLFNBQVM7Z0JBQUUsT0FBTyxFQUFFLENBQUM7WUFDeEMsZ0JBQWdCLEtBQUssU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqRCxPQUFPLGdCQUFnQixDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLFdBQVc7WUFDYixJQUFJLFVBQVUsS0FBSyxTQUFTO2dCQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ3hDLGdCQUFnQixLQUFLLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakQsT0FBTyxnQkFBZ0IsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxNQUFNO1lBQ1IsT0FBTyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hELENBQUM7UUFDRCxJQUFJLE1BQU07WUFDUixPQUFPLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEQsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxNQUFtQjtJQUN2QyxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVU7UUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUF1QixFQUFFLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7UUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLE1BQW1CO0lBQ3hDLE9BQU8sT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUM7QUFDekYsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxNQUFlO0lBQ3hDLE9BQU8sTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxRQUFRLENBQUM7QUFDMUUsQ0FBQztBQUVELGlGQUFpRjtBQUNqRixTQUFTLGNBQWMsQ0FBQyxLQUFxQztJQUMzRCxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxZQUFZLENBQ25CLE1BQStCLEVBQy9CLEtBQWUsRUFDZixjQUF5QixTQUFTO0lBRWxDLElBQUksTUFBTSxLQUFLLFNBQVM7UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ3ZELElBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxLQUFLLE1BQU07UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBRTVFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsT0FBTztRQUNMLElBQUksRUFBRSxNQUFNO1FBQ1osTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDZixJQUFJLE9BQU87Z0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVE7Z0JBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsS0FBSyxVQUFVLFNBQVMsQ0FBQyxNQUFnQixFQUFFLE1BQW1CO0lBQzVELE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLElBQUksQ0FBQztRQUNILElBQUksS0FBSyxFQUFFLE1BQU0sSUFBSSxJQUFJLEVBQUU7WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztZQUFTLENBQUM7UUFDVCxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDYixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsY0FBYyxDQUNyQixLQUFzQixFQUN0QixNQUF1QixFQUN2QixPQUFzQjtJQUV0QixJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTTtRQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsS0FBSyxVQUFVLFVBQVUsQ0FDdkIsSUFBa0IsRUFDbEIsS0FBcUM7SUFFckMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTztJQUNsRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RCLElBQUksQ0FBQztRQUNILE1BQU0sVUFBVSxDQUFDO0lBQ25CLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLEtBQUssSUFBSSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDO1lBQUUsTUFBTSxHQUFHLENBQUM7SUFDbEYsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxXQUFXLENBQUMsSUFBa0I7SUFDckMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsU0FBUyxDQUFDLE9BQWUsRUFBRSxJQUFjLEVBQUUsTUFBa0I7SUFDcEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzlDLE9BQU8sSUFBSSxLQUFLLENBQ2QsR0FBRyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNoRyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDdkIsTUFBaUMsRUFDakMsY0FBeUIsU0FBUztJQUVsQyxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDN0MsSUFBSSxNQUFNLEtBQUssU0FBUztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3hDLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsWUFBWSxDQUFDLE1BQTBDO0lBQzlELElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzlELE9BQU8sT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsdUJBQXVCLENBQUMsTUFBYztJQUM3QyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxJQUFJLENBQUMsS0FBbUIsRUFBRSxVQUF1QixFQUFFO0lBQ3ZFLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNwRixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUNwQyxPQUFPLENBQUMsaUJBQWlCLElBQUksMkJBQTJCLEVBQ3hELG1CQUFtQixDQUNwQixDQUFDO0lBQ0YsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUNqQyxPQUFPLENBQUMsY0FBYyxJQUFJLHdCQUF3QixFQUNsRCxnQkFBZ0IsQ0FDakIsQ0FBQztJQUNGLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxjQUFjLElBQUksNkJBQTZCLENBQUMsQ0FBQztJQUNsRyxNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQWUsRUFBRSxDQUFDO0lBQ3pDLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxJQUFJO1FBQUUsT0FBTztJQUNqRSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7SUFDakcsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLENBQUMsb0JBQW9CLElBQUksTUFBTSxDQUFDO0lBQ3BFLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7SUFDeEYsSUFBSSxvQkFBb0IsS0FBSyxNQUFNLElBQUksb0JBQW9CLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDdkUsTUFBTSxJQUFJLFVBQVUsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFDRCxJQUFJLGNBQWMsS0FBSyxLQUFLLElBQUksV0FBVyxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ3RELE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLElBQUksY0FBYyxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQzdCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUMzQyxNQUFNLGVBQWUsR0FBRyxvQkFBb0IsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNoRixlQUFlLENBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ25FLFlBQVksR0FBRyxNQUFNLHNCQUFzQixDQUN6QyxRQUFRLEVBQ1IsSUFBSSxFQUNKLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxvQkFBb0IsS0FBSyxNQUFNLENBQ2hDLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPO0lBQ3RDLElBQUksV0FBVyxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQzFCLElBQUksY0FBYyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUNsRixDQUFDO1FBQ0QsTUFBTSx1QkFBdUIsQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDeEMsZUFBZSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDMUQsTUFBTSxlQUFlLEdBQUcsTUFBTSxzQkFBc0IsQ0FDbEQsUUFBUSxFQUNSLFlBQVksRUFDWixXQUFXLEVBQ1gsYUFBYSxFQUNiLGNBQWMsRUFDZCxjQUFjLEVBQ2QsSUFBSSxDQUNMLENBQUM7SUFDRixJQUFJLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sdUJBQXVCLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQzlGLENBQUM7QUFFRCxTQUFTLHVCQUF1QixDQUM5QixNQUFzQixFQUN0QixTQUEwQztJQUUxQyxPQUFPLElBQUksS0FBSyxDQUNkLHFDQUFxQyxNQUFNLEtBQUssU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNqRyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQUMsR0FBRyxJQUE0QjtJQUNuRCxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ3JFLE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQztJQUNqQyxNQUFNLFdBQVcsR0FBYSxFQUFFLENBQUM7SUFDakMsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN4RCxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sU0FBUyxHQUFjLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsQ0FBQztJQUVuRixNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRTtRQUMzQyxHQUFHLFNBQVM7UUFDWixLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDO0tBQzNELENBQUMsQ0FBQztJQUVILE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFM0MsTUFBTSxLQUFLLEdBQW9CLEVBQUUsQ0FBQztJQUNsQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDbEQsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRWxELE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBSyxJQUF5QixFQUFFO1FBQ2xELElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLG9CQUF1RCxDQUFDO1FBQzVELElBQUksQ0FBQztZQUNILFFBQVEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELE1BQU0sR0FBRyxDQUFDO1lBQ1osQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDdkMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLO2dCQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzRCxvQkFBb0IsR0FBRyxHQUFHLENBQUM7WUFDM0IsUUFBUSxHQUFHLDJCQUEyQixDQUFDO1FBQ3pDLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRSxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3BELElBQUksb0JBQW9CO2dCQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsb0JBQW9CLENBQUM7WUFDM0QsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUVMLDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0UsNEVBQTRFO0lBQzVFLE9BQU8sYUFBYSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFzQixNQUFTLEVBQUUsT0FBbUI7SUFDeEUsTUFBTSxNQUFNLEdBQUcsTUFBd0IsQ0FBQztJQUN4QyxNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFHLElBQWdDO0lBQzNELE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDckUsTUFBTSxTQUFTLEdBQWMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQ25GLE1BQU0sYUFBYSxHQUFHLE1BQU0sS0FBSyxTQUFTLENBQUM7SUFDM0MsTUFBTSxhQUFhLEdBQUcsTUFBTSxLQUFLLFNBQVMsQ0FBQztJQUMzQyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1QyxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRTtRQUNqRCxHQUFHLFNBQVM7UUFDWixRQUFRLEVBQUUsYUFBYSxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzdELEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1FBQzFDLEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztLQUNqRCxDQUFDLENBQUM7SUFFSCxNQUFNLGVBQWUsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0QsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzNFLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzNFLE1BQU0sVUFBVSxHQUFHLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRWhGLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEQsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEQsR0FBRyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVELElBQUksS0FBSyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEtBQUssQ0FBQztRQUFFLE1BQU0sU0FBUyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDMUYsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQUMsT0FBZTtJQUNuQyxNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFFMUIsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLElBQUksS0FBNEIsQ0FBQztJQUNqQyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDcEIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRW5CLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtRQUNoQixJQUFJLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUNELE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLENBQUMsQ0FBQztJQUVGLEtBQUssTUFBTSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUM7UUFDekIsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDZCxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ2hCLFNBQVM7UUFDWCxDQUFDO1FBRUQsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDaEIsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNmLFNBQVM7UUFDWCxDQUFDO1FBRUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksRUFBRSxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUNqQixLQUFLLEdBQUcsU0FBUyxDQUFDO2dCQUNsQixNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLElBQUksRUFBRSxDQUFDO1lBQ2hCLENBQUM7WUFDRCxTQUFTO1FBQ1gsQ0FBQztRQUVELElBQUksRUFBRSxLQUFLLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDN0IsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNYLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDZCxTQUFTO1FBQ1gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2xCLElBQUksRUFBRSxDQUFDO1lBQ1AsU0FBUztRQUNYLENBQUM7UUFFRCxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixPQUFPLElBQUksSUFBSSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLEVBQUUsQ0FBQztJQUVQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBvcnRhYmxlIHN1YnByb2Nlc3MgaGVscGVyIGJ1aWx0IG9uIGBjaGlsZF9wcm9jZXNzLnNwYXduYCBhbmQgbGluZSBzdHJlYW1pbmcuXG4gKlxuICogRWFjaCBzdGRpbyBmZCBkZWZhdWx0cyB0byBgXCJpbmhlcml0XCJgLiB7QGxpbmsgc3Bhd259IHN0cmVhbXMgb3V0cHV0XG4gKiBsaW5lLWJ5LWxpbmUgaW50byB7QGxpbmsgRXhlY1Jlc3VsdC5zdGRvdXRMaW5lc31cbiAqIC8ge0BsaW5rIEV4ZWNSZXN1bHQuc3RkZXJyTGluZXN9OyBpdHMgYHN0ZG91dGAgLyBgc3RkZXJyYCBnZXR0ZXJzIGpvaW4gdGhvc2UgbGluZXMuXG4gKiB7QGxpbmsgc3Bhd25TeW5jfSBrZWVwcyB0aGUgY2FwdHVyZWQgc3RyaW5nOyBpdHMgYHN0ZG91dGAgLyBgc3RkZXJyYCBnZXR0ZXJzIHJlYWRcbiAqIHRoYXQgc3RyaW5nIGRpcmVjdGx5IChsaW5lIGFycmF5cyBzcGxpdCBsYXppbHkgb24gcmVhZCkuXG4gKiBPbWl0dGVkIGB0cmltYCAoZGVmYXVsdCkgYXBwbGllcyBhZGFwdGl2ZSBub3JtYWxpemF0aW9uOiB7QGxpbmsgc3Bhd25TeW5jfSBkcm9wc1xuICogYXQgbW9zdCBvbmUgdHJhaWxpbmcgZW1wdHkgbGluZSAvIG5ld2xpbmUgYHNwYXduU3luY2AgYWRkczsge0BsaW5rIHNwYXdufSBkb2VzXG4gKiBub3QgKHJlYWRsaW5lIG5ldmVyIGVtaXRzIHRoYXQgZXh0cmEgbGluZSkuIGB0cmltOiB0cnVlYCBzdHJpcHMgYWxsIGxlYWRpbmcvXG4gKiB0cmFpbGluZyB3aGl0ZXNwYWNlIGluIGJvdGggbW9kZXM7IGB0cmltOiBmYWxzZWAgbGVhdmVzIG91dHB1dCB1bmNoYW5nZWQuXG4gKlxuICogVGhpcyBtb2R1bGUgb3ducyBzdWJwcm9jZXNzIGV4ZWN1dGlvbiBwb2xpY3kgZm9yIE5vZGUgYW5kIEJ1biBwYWNrYWdlcy4gUmV1c2VcbiAqIGl0IGluc3RlYWQgb2Ygd3JhcHBpbmcgYGNoaWxkX3Byb2Nlc3NgIGxvY2FsbHkgd2hlbiBjYWxsZXJzIG5lZWQgY29uc2lzdGVudFxuICogYXJndiBwYXJzaW5nLCBzdGRpbyBjYXB0dXJlLCBsaW5lIGNhbGxiYWNrcywgY2FuY2VsbGF0aW9uLCBhbmQgZXhpdCBjaGVja2luZy5cbiAqXG4gKiBAZXhhbXBsZSBDYXB0dXJlIGNvbW1hbmQgb3V0cHV0XG4gKiBgYGB0c1xuICogY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWMoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiLS1zaG93LXRvcGxldmVsXCJdLCB7XG4gKiAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gKiAgIHN0ZGVycjogXCJpZ25vcmVcIixcbiAqICAgc3RkaW46IFwiaWdub3JlXCIsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFN0cmVhbSBhbmQgY2FwdHVyZSB0b2dldGhlclxuICogYGBgdHNcbiAqIGF3YWl0IGV4ZWMoXCJwbnBtXCIsIFtcImluc3RhbGxcIl0sIHtcbiAqICAgc3Rkb3V0OiBbKGxpbmUpID0+IGNvbnNvbGUubG9nKGxpbmUpLCBcImNhcHR1cmVcIl0sXG4gKiAgIGNoZWNrOiB0cnVlLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBTeW5jaHJvbm91cyBjYXB0dXJlIChubyBsaW5lIGNhbGxiYWNrcylcbiAqIGBgYHRzXG4gKiBjb25zdCB7IHN0ZG91dCB9ID0gZXhlY1N5bmMoXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiLS1zaG93LXRvcGxldmVsXCJdLCB7XG4gKiAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gKiAgIHN0ZGVycjogXCJpZ25vcmVcIixcbiAqICAgc3RkaW46IFwiaWdub3JlXCIsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHtcbiAgdHlwZSBDaGlsZFByb2Nlc3MsXG4gIHR5cGUgU3Bhd25PcHRpb25zLFxuICBzcGF3biBhcyBub2RlU3Bhd24sXG4gIHNwYXduU3luYyBhcyBub2RlU3Bhd25TeW5jLFxufSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyByZWFkZGlyLCByZWFkRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tIFwibm9kZTpyZWFkbGluZVwiO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tIFwibm9kZTpzdHJlYW1cIjtcbmltcG9ydCB7IHRleHQgfSBmcm9tIFwibm9kZTpzdHJlYW0vY29uc3VtZXJzXCI7XG5pbXBvcnQgeyBmaW5pc2hlZCB9IGZyb20gXCJub2RlOnN0cmVhbS9wcm9taXNlc1wiO1xuXG4vKiogU2hlbGwtY29tcGF0aWJsZSBleGl0IGNvZGUgcmV0dXJuZWQgd2hlbiBhbiBleGVjdXRhYmxlIGNhbm5vdCBiZSBmb3VuZC4gKi9cbmV4cG9ydCBjb25zdCBDT01NQU5EX05PVF9GT1VORF9FWElUX0NPREUgPSAxMjc7XG5cbmNvbnN0IERFRkFVTFRfR1JBQ0VGVUxfVElNRU9VVF9NUyA9IDEwXzAwMDtcbmNvbnN0IERFRkFVTFRfRk9SQ0VfVElNRU9VVF9NUyA9IDRfMDAwO1xuY29uc3QgREVGQVVMVF9LSUxMX1BPTExfSU5URVJWQUxfTVMgPSAxMDA7XG5jb25zdCBXSU5ET1dTX1BST0NFU1NfU05BUFNIT1RfU0NSSVBUID1cbiAgXCJHZXQtQ2ltSW5zdGFuY2UgV2luMzJfUHJvY2VzcyB8IEZvckVhY2gtT2JqZWN0IHsgJ3swfSB7MX0gezJ9JyAtZiAkXy5Qcm9jZXNzSWQsICRfLlBhcmVudFByb2Nlc3NJZCwgJF8uQ3JlYXRpb25EYXRlLlRvRmlsZVRpbWVVdGMoKSB9XCI7XG5cbi8qKiBTdGRpbyBtb2RlIGZvciBhIHN1YnByb2Nlc3MgZmQuICovXG5leHBvcnQgdHlwZSBFeGVjU3RkaW8gPSBcImluaGVyaXRcIiB8IFwicGlwZVwiIHwgXCJpZ25vcmVcIjtcblxuLyoqIEludm9rZWQgb25jZSBwZXIgb3V0cHV0IGxpbmUgd2hlbiBhIGZkIGlzIHBpcGVkLiAqL1xuZXhwb3J0IHR5cGUgTGluZUhhbmRsZXIgPSAobGluZTogc3RyaW5nKSA9PiB2b2lkO1xuXG4vKiogU3RyZWFtIGxpbmVzIHRvIGEgaGFuZGxlciB3aXRoIG9wdGlvbmFsIHJlc3VsdCBjYXB0dXJlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5lT3V0cHV0T3B0aW9ucyB7XG4gIC8qKiBJbnZva2VkIG9uY2UgcGVyIG91dHB1dCBsaW5lLiAqL1xuICBvbkxpbmU6IExpbmVIYW5kbGVyO1xuICAvKiogUmV0YWluIGxpbmVzIGluIHRoZSBjb21wbGV0ZWQgcmVzdWx0LiBEZWZhdWx0cyB0byBgdHJ1ZWAuICovXG4gIGNhcHR1cmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFN0ZGlvIGNvbmZpZyBmb3Igb25lIGZkLlxuICpcbiAqIC0gYFwiaW5oZXJpdFwiYCAvIGBcInBpcGVcImAgLyBgXCJpZ25vcmVcImAg4oCUIHBhc3MgdGhyb3VnaCB0byBgc3Bhd25gXG4gKiAtIGBcImNhcHR1cmVcImAg4oCUIHBpcGUgdGhlIGZkIGFuZCBhcHBlbmQgZWFjaCBsaW5lIHRvIHRoZSByZXN1bHRcbiAqIC0ge0BsaW5rIExpbmVIYW5kbGVyfSDigJQgcGlwZSBhbmQgaW52b2tlIHRoZSBoYW5kbGVyIHBlciBsaW5lIChsaW5lcyBhcmUgc3RpbGwgY2FwdHVyZWQpXG4gKiAtIHtAbGluayBMaW5lT3V0cHV0T3B0aW9uc30g4oCUIHBpcGUgYW5kIGludm9rZSB0aGUgaGFuZGxlciwgd2l0aCBvcHRpb25hbCBjYXB0dXJlXG4gKiAtIGAoTGluZUhhbmRsZXIgfCBcImNhcHR1cmVcIilbXWAg4oCUIHBpcGU7IGBcImNhcHR1cmVcImAgaXMgYSBuby1vcCBtYXJrZXIsIGhhbmRsZXJzIHJ1biBwZXIgbGluZVxuICovXG5leHBvcnQgdHlwZSBTdGRpb09wdGlvbiA9XG4gIEV4ZWNTdGRpbyB8IExpbmVIYW5kbGVyIHwgTGluZU91dHB1dE9wdGlvbnMgfCBcImNhcHR1cmVcIiB8IChMaW5lSGFuZGxlciB8IFwiY2FwdHVyZVwiKVtdO1xuXG4vKiogT3V0Y29tZSBvZiB7QGxpbmsgc3Bhd259IC8ge0BsaW5rIHNwYXduU3luY306IGV4aXQgY29kZSwgY2FwdHVyZWQgb3V0cHV0LCBhbmQgbGluZSB2aWV3cy4gKi9cbmV4cG9ydCB0eXBlIEV4ZWNSZXN1bHQgPSB7XG4gIGV4aXRDb2RlOiBudW1iZXI7XG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRvdXQgbGluZXMuIEZvciB7QGxpbmsgc3Bhd259IHRoZXNlIGFyZSBidWlsdCB3aGlsZSB0aGUgcHJvY2VzcyBydW5zO1xuICAgKiBmb3Ige0BsaW5rIHNwYXduU3luY30gdGhleSBhcmUgc3BsaXQgZnJvbSB0aGUgY2FwdHVyZWQgc3RyaW5nIG9uIGZpcnN0IHJlYWQuXG4gICAqL1xuICByZWFkb25seSBzdGRvdXRMaW5lczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRlcnIgbGluZXMuIEZvciB7QGxpbmsgc3Bhd259IHRoZXNlIGFyZSBidWlsdCB3aGlsZSB0aGUgcHJvY2VzcyBydW5zO1xuICAgKiBmb3Ige0BsaW5rIHNwYXduU3luY30gdGhleSBhcmUgc3BsaXQgZnJvbSB0aGUgY2FwdHVyZWQgc3RyaW5nIG9uIGZpcnN0IHJlYWQuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnJMaW5lczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRvdXQgdGV4dC4ge0BsaW5rIHNwYXduU3luY30gcmVhZHMgdGhlIGNhcHR1cmVkIHN0cmluZztcbiAgICoge0BsaW5rIHNwYXdufSBqb2lucyB7QGxpbmsgc3Rkb3V0TGluZXN9LiBTZWUgYHRyaW1gIGZvciBub3JtYWxpemF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3Rkb3V0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRlcnIgdGV4dC4ge0BsaW5rIHNwYXduU3luY30gcmVhZHMgdGhlIGNhcHR1cmVkIHN0cmluZztcbiAgICoge0BsaW5rIHNwYXdufSBqb2lucyB7QGxpbmsgc3RkZXJyTGluZXN9LiBTZWUgYHRyaW1gIGZvciBub3JtYWxpemF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFdoYXQge0BsaW5rIHNwYXdufSByZXR1cm5zOiB0aGUgTElWRSBgQ2hpbGRQcm9jZXNzYCBoYW5kbGUgdGhhdCBpcyBBTFNPIGFcbiAqIGBQcm9taXNlPEV4ZWNSZXN1bHQ+YCByZXNvbHZpbmcgb24gZXhpdC5cbiAqXG4gKiBUaGlzIGlzIGFkZGl0aXZlIC0gdGhlIG9iamVjdCBzdGlsbCBzYXRpc2ZpZXMgYFByb21pc2U8RXhlY1Jlc3VsdD5gLCBzbyBldmVyeVxuICogZXhpc3RpbmcgYGF3YWl0IHNwYXduKC4uLilgIC8gYHNwYXduKC4uLikudGhlbiguLi4pYCBjYWxsZXIgaXMgdW5jaGFuZ2VkLiBXaGF0XG4gKiBpcyBuZXcgaXMgdGhhdCB0aGUgc2FtZSB2YWx1ZSBpcyB0aGUgbGl2ZSBjaGlsZDogY2FsbGVycyB0aGF0IHdhbnQgdG8gc3VwZXJ2aXNlXG4gKiBpdCBjYW4gcmVhZCBgLnBpZGAsIGNhbGwgYC5raWxsKHNpZ25hbClgLCBhbmQgbGlzdGVuIGZvciBgZXhpdGAgd2l0aG91dCBhXG4gKiBzZWNvbmQgc3Bhd24uXG4gKlxuICogQGV4YW1wbGUgQXdhaXQgaXQgKHVuY2hhbmdlZClcbiAqIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bihcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCJIRUFEXCJdLCB7IHN0ZG91dDogXCJjYXB0dXJlXCIgfSk7XG4gKlxuICogQGV4YW1wbGUgU3VwZXJ2aXNlIGl0XG4gKiBjb25zdCBwcm9jID0gc3Bhd24oXCJidW5cIiwgW1wic3JjL3NlcnZlci50c1wiXSk7XG4gKiBjb25zdCBzaHV0ZG93biA9ICgpID0+IGtpbGwocHJvYyk7XG4gKiBjb25zdCB7IGV4aXRDb2RlIH0gPSBhd2FpdCBwcm9jO1xuICovXG5leHBvcnQgdHlwZSBDaGlsZFByb2Nlc3NSZXN1bHQgPSBDaGlsZFByb2Nlc3MgJiBQcm9taXNlPEV4ZWNSZXN1bHQ+O1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHNwYXdufS4gRXh0ZW5kcyBgU3Bhd25PcHRpb25zYCBleGNlcHQgYHN0ZGlvYCwgd2hpY2ggaXMgZHJpdmVuIGJ5IGBzdGRpbmAgLyBgc3Rkb3V0YCAvIGBzdGRlcnJgLiAqL1xuZXhwb3J0IHR5cGUgRXhlY09wdGlvbnMgPSBPbWl0PFNwYXduT3B0aW9ucywgXCJzdGRpb1wiPiAmIHtcbiAgLyoqIGBcImluaGVyaXRcImAgYnkgZGVmYXVsdDsgYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCBzZWxlY3QgbW9kZXMsIGFueSBvdGhlciBzdHJpbmcgaXMgaW5wdXQuICovXG4gIHN0ZGluPzogRXhlY1N0ZGlvIHwgc3RyaW5nO1xuICBzdGRvdXQ/OiBTdGRpb09wdGlvbjtcbiAgc3RkZXJyPzogU3RkaW9PcHRpb247XG4gIC8qKiBUaHJvdyB3aGVuIHRoZSBwcm9jZXNzIGV4aXRzIHdpdGggYSBub24temVybyBjb2RlLiAqL1xuICBjaGVjaz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBPbWl0dGVkIOKAlCBhZGFwdGl2ZSB0cmltICh7QGxpbmsgc3Bhd25TeW5jfSBkcm9wcyBvbmUgc3Bhd24gdHJhaWxpbmcgbmV3bGluZSxcbiAgICoge0BsaW5rIHNwYXdufSBkb2VzIG5vdCk7IGB0cnVlYCDigJQgc3RyaXAgYWxsIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZTtcbiAgICogYGZhbHNlYCDigJQgbGVhdmUgY2FwdHVyZWQgb3V0cHV0IHVuY2hhbmdlZC5cbiAgICovXG4gIHRyaW0/OiBib29sZWFuO1xufTtcblxuLyoqIEdyYWNlZnVsIGFuZCBmb3JjZWQgc2h1dGRvd24gcG9saWN5IGZvciB7QGxpbmsga2lsbH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEtpbGxPcHRpb25zIHtcbiAgLyoqIFNpZ25hbCBzZW50IHRvIHRoZSBzbmFwc2hvdHRlZCBwcm9jZXNzIHRyZWUuIGBmYWxzZWAgc2tpcHMgdGhpcyBwaGFzZS4gRGVmYXVsdHMgdG8gYFNJR1RFUk1gLiAqL1xuICBncmFjZWZ1bFNpZ25hbD86IE5vZGVKUy5TaWduYWxzIHwgZmFsc2U7XG4gIC8qKiBQcm9jZXNzZXMgcmVjZWl2aW5nIHRoZSBncmFjZWZ1bCBzaWduYWwuIERlZmF1bHRzIHRvIHRoZSBjb21wbGV0ZSBwcm9jZXNzIHRyZWUuICovXG4gIGdyYWNlZnVsU2lnbmFsVGFyZ2V0PzogXCJyb290XCIgfCBcInRyZWVcIjtcbiAgLyoqIFRpbWUgdG8gd2FpdCBmb3IgZ3JhY2VmdWwgc2h1dGRvd24uIERlZmF1bHRzIHRvIDEwIHNlY29uZHMuICovXG4gIGdyYWNlZnVsVGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogU2lnbmFsIHNlbnQgdG8gc3Vydml2b3JzLiBgZmFsc2VgIGRpc2FibGVzIGZvcmNlZCB0ZXJtaW5hdGlvbi4gRGVmYXVsdHMgdG8gYFNJR0tJTExgLiAqL1xuICBmb3JjZVNpZ25hbD86IE5vZGVKUy5TaWduYWxzIHwgZmFsc2U7XG4gIC8qKiBUaW1lIHRvIHBvbGwgYW5kIGZvcmNlIG5ld2x5IGRpc2NvdmVyZWQgZGVzY2VuZGFudHMuIERlZmF1bHRzIHRvIDQgc2Vjb25kcy4gKi9cbiAgZm9yY2VUaW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKiBJbnRlcnZhbCB1c2VkIHRvIHJlZnJlc2ggYW5kIHBvbGwgdGhlIHByb2Nlc3MgdHJlZS4gRGVmYXVsdHMgdG8gMTAwIG1pbGxpc2Vjb25kcy4gKi9cbiAgcG9sbEludGVydmFsTXM/OiBudW1iZXI7XG59XG5cbi8qKiBTdGRpbyBtb2RlIGZvciB7QGxpbmsgc3Bhd25TeW5jfSAobm8gcGVyLWxpbmUgY2FsbGJhY2tzKS4gKi9cbmV4cG9ydCB0eXBlIFN5bmNFeGVjU3RkaW8gPSBFeGVjU3RkaW8gfCBcImNhcHR1cmVcIjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBzcGF3blN5bmN9LiBTYW1lIHNoYXBlIGFzIHtAbGluayBFeGVjT3B0aW9uc30gYnV0IHdpdGhvdXQgbGluZS1oYW5kbGVyIHN0ZGlvLiAqL1xuZXhwb3J0IHR5cGUgU3luY0V4ZWNPcHRpb25zID0gT21pdDxTcGF3bk9wdGlvbnMsIFwic3RkaW9cIj4gJiB7XG4gIC8qKiBgXCJpbmhlcml0XCJgIGJ5IGRlZmF1bHQ7IGBcInBpcGVcImAgLyBgXCJpZ25vcmVcImAgc2VsZWN0IG1vZGVzLCBhbnkgb3RoZXIgc3RyaW5nIGlzIGlucHV0LiAqL1xuICBzdGRpbj86IEV4ZWNTdGRpbyB8IHN0cmluZztcbiAgc3Rkb3V0PzogU3luY0V4ZWNTdGRpbztcbiAgc3RkZXJyPzogU3luY0V4ZWNTdGRpbztcbiAgLyoqIFRocm93IHdoZW4gdGhlIHByb2Nlc3MgZXhpdHMgd2l0aCBhIG5vbi16ZXJvIGNvZGUuICovXG4gIGNoZWNrPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE9taXR0ZWQg4oCUIGFkYXB0aXZlIHRyaW0gKHtAbGluayBzcGF3blN5bmN9IGRyb3BzIG9uZSBzcGF3biB0cmFpbGluZyBuZXdsaW5lLFxuICAgKiB7QGxpbmsgc3Bhd259IGRvZXMgbm90KTsgYHRydWVgIOKAlCBzdHJpcCBhbGwgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlO1xuICAgKiBgZmFsc2VgIOKAlCBsZWF2ZSBjYXB0dXJlZCBvdXRwdXQgdW5jaGFuZ2VkLlxuICAgKi9cbiAgdHJpbT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXduIHN0ZGlvIG1vZGUgcGx1cyBhbiBvcHRpb25hbCBwZXItbGluZSBjYWxsYmFjayBhZnRlciB7QGxpbmsgcmVzb2x2ZVN0ZGlvfVxuICogbWFwcyBhIHtAbGluayBTdGRpb09wdGlvbn0gaW50byBzb21ldGhpbmcgYHNwYXduYCBjYW4gY29uc3VtZS5cbiAqL1xudHlwZSBSZXNvbHZlZFN0ZGlvID0ge1xuICAvKiogVmFsdWUgcGFzc2VkIHRvIGBzcGF3bmAncyBgc3RkaW9gIHR1cGxlIGZvciB0aGlzIGZkLiAqL1xuICBtb2RlOiBFeGVjU3RkaW87XG4gIC8qKiBXaGVuIHNldCwgZWFjaCBvdXRwdXQgbGluZSBpcyBhcHBlbmRlZCB0byB0aGUgY2FwdHVyZSBidWZmZXIgYW5kIGZvcndhcmRlZCBoZXJlLiAqL1xuICBvbkxpbmU/OiBMaW5lSGFuZGxlcjtcbn07XG5cbi8qKiBTdXBwb3J0ZWQgY29tbWFuZCwgYXJndW1lbnQtYXJyYXksIHZhcmlhZGljLWFyZ3VtZW50LCBhbmQgb3B0aW9ucyBjYWxsIGZvcm1zLiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25BcmdzPFQgZXh0ZW5kcyBTcGF3bk9wdGlvbnM+ID1cbiAgfCBbY29tbWFuZDogc3RyaW5nLCAuLi5hcmdzOiBzdHJpbmdbXV1cbiAgfCBbY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXV1cbiAgfCBbY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSwgb3B0aW9uczogVF1cbiAgfCBbY29tbWFuZDogc3RyaW5nLCAuLi5hcmdzQW5kT3B0aW9uczogWy4uLnN0cmluZ1tdLCBUXV07XG5cbmludGVyZmFjZSBQYXJzZWRTcGF3bkFyZ3M8VCBleHRlbmRzIFNwYXduT3B0aW9ucz4ge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIGNvbW1hbmRBcmdzOiBzdHJpbmdbXTtcbiAgb3B0aW9ucz86IFQ7XG59XG5cbi8qKiBPbmUgb3BlcmF0aW5nLXN5c3RlbSBwcm9jZXNzIGNhcHR1cmVkIGJlZm9yZSB0cmVlIHNodXRkb3duIGJlZ2lucy4gKi9cbmludGVyZmFjZSBQcm9jZXNzU25hcHNob3RFbnRyeSB7XG4gIHBpZDogbnVtYmVyO1xuICBwYXJlbnRQaWQ6IG51bWJlcjtcbiAgaWRlbnRpdHk6IHN0cmluZztcbn1cblxuLyoqIEN1cnJlbnQgcmV0YWluZWQgcHJvY2Vzc2VzIHBsdXMgZGVzY2VuZGFudHMgZmlyc3Qgb2JzZXJ2ZWQgYnkgb25lIHJlZnJlc2guICovXG5pbnRlcmZhY2UgUmVmcmVzaGVkUHJvY2Vzc1RyZWUge1xuICBwcm9jZXNzZXM6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W107XG4gIGRpc2NvdmVyZWQ6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W107XG59XG5cbmZ1bmN0aW9uIHBhcnNlU3Bhd25BcmdzPFQgZXh0ZW5kcyBTcGF3bk9wdGlvbnM+KGlucHV0OiBTcGF3bkFyZ3M8VD4pOiBQYXJzZWRTcGF3bkFyZ3M8VD4ge1xuICBsZXQgW3ZhbHVlLCAuLi52YWx1ZXNdID0gaW5wdXQ7XG5cbiAgY29uc3QgbGFzdCA9IHZhbHVlcy5hdCgtMSk7XG4gIGNvbnN0IG9wdGlvbnMgPVxuICAgIGxhc3QgIT09IG51bGwgJiYgdHlwZW9mIGxhc3QgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkobGFzdCkgPyBsYXN0IDogdW5kZWZpbmVkO1xuICBjb25zdCBhcmd1bWVudFZhbHVlcyA9IG9wdGlvbnMgPyB2YWx1ZXMuc2xpY2UoMCwgLTEpIDogdmFsdWVzO1xuICAvLyBPbmx5IHRoZSBvbmUtc3RyaW5nIGZvcm0gaXMgc2hlbGwtbGlrZS4gRXhwbGljaXQgYXJndW1lbnRzIG1ha2UgdGhlIGNvbW1hbmQgYW4gZXhhY3QgZXhlY3V0YWJsZS5cbiAgY29uc3QgW2NvbW1hbmQsIC4uLmNvbW1hbmRBcmdzXSA9IGFyZ3VtZW50VmFsdWVzLmxlbmd0aCA9PT0gMCA/IHNobGV4KHZhbHVlISkgOiBbdmFsdWUhXTtcbiAgY29uc3QgdmFsdWVBcmdzOiBzdHJpbmdbXSA9XG4gICAgYXJndW1lbnRWYWx1ZXMubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkoYXJndW1lbnRWYWx1ZXNbMF0pXG4gICAgICA/IFsuLi5hcmd1bWVudFZhbHVlc1swXV1cbiAgICAgIDogYXJndW1lbnRWYWx1ZXM7XG5cbiAgcmV0dXJuIHtcbiAgICBjb21tYW5kOiBjb21tYW5kISxcbiAgICBjb21tYW5kQXJnczogWy4uLmNvbW1hbmRBcmdzLCAuLi52YWx1ZUFyZ3NdLFxuICAgIG9wdGlvbnM6IG9wdGlvbnMgYXMgVCxcbiAgfTtcbn1cblxuLyoqXG4gKiBEcm9wIHRoZSBzaW5nbGUgdHJhaWxpbmcgZW1wdHkgZW50cnkgYHNwYXduU3luY2AgYWRkcyB3aGVuIHNwbGl0dGluZyBvbiBhIGZpbmFsXG4gKiBuZXdsaW5lIChgXCJoaVxcblwiYCAtPiBgW1wiaGlcIiwgXCJcIl1gKS4gRG9lcyBub3QgcmVtb3ZlIG11bHRpcGxlIHRyYWlsaW5nIGVtcHRpZXMuXG4gKi9cbmZ1bmN0aW9uIHdpdGhvdXRTcGF3blRyYWlsaW5nRW1wdHlMaW5lKGxpbmVzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgaWYgKGxpbmVzLmxlbmd0aCA+IDAgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPT09IFwiXCIpIHtcbiAgICByZXR1cm4gbGluZXMuc2xpY2UoMCwgLTEpO1xuICB9XG4gIHJldHVybiBsaW5lcyBhcyBzdHJpbmdbXTtcbn1cblxuLyoqIFJlbW92ZSBhdCBtb3N0IG9uZSB0cmFpbGluZyBuZXdsaW5lIGZyb20gY2FwdHVyZWQgc3Bhd24gc3Rkb3V0L3N0ZGVyciB0ZXh0LiAqL1xuZnVuY3Rpb24gdHJpbVNpbmdsZVRyYWlsaW5nTmV3bGluZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodGV4dC5lbmRzV2l0aChcIlxcclxcblwiKSkgcmV0dXJuIHRleHQuc2xpY2UoMCwgLTIpO1xuICBpZiAodGV4dC5lbmRzV2l0aChcIlxcblwiKSkgcmV0dXJuIHRleHQuc2xpY2UoMCwgLTEpO1xuICByZXR1cm4gdGV4dDtcbn1cblxuLyoqIExpbmUtYXJyYXkgdmlldyBvZiBhc3luYy1jYXB0dXJlZCBvdXRwdXQuICovXG5mdW5jdGlvbiBub3JtYWxpemVkQXN5bmNMaW5lcyhsaW5lczogcmVhZG9ubHkgc3RyaW5nW10sIHRyaW06IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIGlmICh0cmltID09PSB0cnVlKSByZXR1cm4gbGluZXNGcm9tQ2FwdHVyZWRPdXRwdXQobGluZXMuam9pbihcIlxcblwiKS50cmltKCkpO1xuICByZXR1cm4gbGluZXMgYXMgc3RyaW5nW107XG59XG5cbi8qKiBKb2luIGFzeW5jLWNhcHR1cmVkIGxpbmVzIGludG8gc3Rkb3V0L3N0ZGVyciB0ZXh0LiAqL1xuZnVuY3Rpb24gZm9ybWF0QXN5bmNDYXB0dXJlZExpbmVzKGxpbmVzOiByZWFkb25seSBzdHJpbmdbXSwgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGNvbnN0IGpvaW5lZCA9IGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIHJldHVybiB0cmltID09PSB0cnVlID8gam9pbmVkLnRyaW0oKSA6IGpvaW5lZDtcbn1cblxuLyoqIExpbmUtYXJyYXkgdmlldyBvZiBzeW5jLWNhcHR1cmVkIG91dHB1dC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRTeW5jTGluZXMobGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuICBpZiAodHJpbSA9PT0gZmFsc2UpIHJldHVybiBsaW5lcyBhcyBzdHJpbmdbXTtcbiAgaWYgKHRyaW0gPT09IHRydWUpIHJldHVybiBsaW5lc0Zyb21DYXB0dXJlZE91dHB1dChsaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKSk7XG4gIHJldHVybiB3aXRob3V0U3Bhd25UcmFpbGluZ0VtcHR5TGluZShsaW5lcyk7XG59XG5cbi8qKiBGb3JtYXQgc3luYy1jYXB0dXJlZCBzdGRvdXQvc3RkZXJyIHRleHQuICovXG5mdW5jdGlvbiBmb3JtYXRTeW5jQ2FwdHVyZWRUZXh0KFxuICB0ZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRyaW06IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodGV4dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodHJpbSA9PT0gZmFsc2UpIHJldHVybiB0ZXh0O1xuICBpZiAodHJpbSA9PT0gdHJ1ZSkgcmV0dXJuIHRleHQudHJpbSgpO1xuICByZXR1cm4gdHJpbVNpbmdsZVRyYWlsaW5nTmV3bGluZSh0ZXh0KTtcbn1cblxuLyoqXG4gKiBIdW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgYSBzcGF3bmVkIGNvbW1hbmQsIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBFeGVjdXRhYmxlIG5hbWUgb3IgcGF0aFxuICogQHBhcmFtIGFyZ3MgLSBBcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBleGVjdXRhYmxlXG4gKiBAcmV0dXJucyBCYWNrdGljay13cmFwcGVkIGBjb21tYW5kIGFyZzEgYXJnMiAuLi5gIHN0cmluZ1xuICovXG5mdW5jdGlvbiBjb21tYW5kTGFiZWwoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgXFxgJHtjb21tYW5kfSAke2FyZ3Muam9pbihcIiBcIil9XFxgYDtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIE5vZGUgZmFpbGVkIHRvIHNwYXduIGJlY2F1c2UgdGhlIGV4ZWN1dGFibGUgd2FzIG5vdCBmb3VuZC4gKi9cbmZ1bmN0aW9uIGlzQ29tbWFuZE5vdEZvdW5kRXJyb3IoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBcImNvZGVcIiBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiO1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgYSBwcm9jZXNzIG9wZXJhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgUElEIG5vIGxvbmdlciBleGlzdHMuICovXG5mdW5jdGlvbiBpc01pc3NpbmdQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBcImNvZGVcIiBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBcIkVTUkNIXCI7XG59XG5cbi8qKiBWYWxpZGF0ZSBhIGZpbml0ZSBub24tbmVnYXRpdmUgdGltZW91dC4gKi9cbmZ1bmN0aW9uIHRpbWVvdXRWYWx1ZSh2YWx1ZTogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCR7bmFtZX0gbXVzdCBiZSBhIGZpbml0ZSBub24tbmVnYXRpdmUgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKiogVmFsaWRhdGUgYSBmaW5pdGUgcG9zaXRpdmUgcG9sbGluZyBpbnRlcnZhbC4gKi9cbmZ1bmN0aW9uIHBvbGxJbnRlcnZhbFZhbHVlKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPD0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwicG9sbEludGVydmFsTXMgbXVzdCBiZSBhIGZpbml0ZSBwb3NpdGl2ZSBudW1iZXJcIik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKiogUGFyc2UgdGhlIGNvbW1vbiBgcGlkIHBhcmVudFBpZCBpZGVudGl0eWAgcHJvY2Vzcy1zbmFwc2hvdCBmb3JtYXQuICovXG5mdW5jdGlvbiBwYXJzZVByb2Nlc3NTbmFwc2hvdChsaW5lczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9jZXNzU25hcHNob3RFbnRyeVtdIHtcbiAgY29uc3Qgc25hcHNob3Q6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSAvXlxccyooXFxkKylcXHMrKFxcZCspKD86XFxzKyguKz8pKT9cXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IG1hdGNoPy5bM10/LnRyaW0oKTtcbiAgICBpZiAoIW1hdGNoIHx8ICFpZGVudGl0eSkgY29udGludWU7XG4gICAgc25hcHNob3QucHVzaCh7XG4gICAgICBwaWQ6IE51bWJlci5wYXJzZUludChtYXRjaFsxXSEsIDEwKSxcbiAgICAgIHBhcmVudFBpZDogTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdISwgMTApLFxuICAgICAgaWRlbnRpdHksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHNuYXBzaG90O1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgYSBgL3Byb2NgIHJlY29yZCBkaXNhcHBlYXJlZCBvciBpcyBpbmFjY2Vzc2libGUgZHVyaW5nIGEgc25hcHNob3QuICovXG5mdW5jdGlvbiBpc1VuYXZhaWxhYmxlUHJvY1JlY29yZChlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHx8ICEoXCJjb2RlXCIgaW4gZXJyb3IpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiIHx8IGVycm9yLmNvZGUgPT09IFwiRUFDQ0VTXCIgfHwgZXJyb3IuY29kZSA9PT0gXCJFUEVSTVwiO1xufVxuXG4vKiogUGFyc2UgTGludXggYC9wcm9jLzxwaWQ+L3N0YXRgIHBhcmVudCBQSUQgYW5kIGV4YWN0IHByb2Nlc3Mtc3RhcnQgdGlja3MuICovXG5mdW5jdGlvbiBwYXJzZUxpbnV4UHJvY2Vzc1N0YXQocGlkOiBudW1iZXIsIHN0YXQ6IHN0cmluZyk6IFByb2Nlc3NTbmFwc2hvdEVudHJ5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29tbWFuZEVuZCA9IHN0YXQubGFzdEluZGV4T2YoXCIpXCIpO1xuICBpZiAoY29tbWFuZEVuZCA8IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpZWxkcyA9IHN0YXRcbiAgICAuc2xpY2UoY29tbWFuZEVuZCArIDEpXG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCBwYXJlbnRQaWQgPSBOdW1iZXIucGFyc2VJbnQoZmllbGRzWzFdISwgMTApO1xuICBjb25zdCBzdGFydFRpY2tzID0gZmllbGRzWzE5XTtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihwYXJlbnRQaWQpIHx8ICFzdGFydFRpY2tzKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4geyBwaWQsIHBhcmVudFBpZCwgaWRlbnRpdHk6IHN0YXJ0VGlja3MgfTtcbn1cblxuLyoqIENhcHR1cmUgTGludXggcHJvY2VzcyBpZGVudGl0aWVzIGZyb20gYC9wcm9jYCB3aXRob3V0IHNlY29uZC1sZXZlbCB0cnVuY2F0aW9uLiAqL1xuYXN5bmMgZnVuY3Rpb24gbGludXhQcm9jZXNzU25hcHNob3QoKTogUHJvbWlzZTxQcm9jZXNzU25hcHNob3RFbnRyeVtdPiB7XG4gIGNvbnN0IGRpcmVjdG9yaWVzID0gYXdhaXQgcmVhZGRpcihcIi9wcm9jXCIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGRpcmVjdG9yaWVzXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSAmJiAvXlxcZCskLy50ZXN0KGVudHJ5Lm5hbWUpKVxuICAgICAgLm1hcChhc3luYyAoZW50cnkpOiBQcm9taXNlPFByb2Nlc3NTbmFwc2hvdEVudHJ5IHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChlbnRyeS5uYW1lLCAxMCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlTGludXhQcm9jZXNzU3RhdChwaWQsIGF3YWl0IHJlYWRGaWxlKGAvcHJvYy8ke2VudHJ5Lm5hbWV9L3N0YXRgLCBcInV0ZjhcIikpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChpc1VuYXZhaWxhYmxlUHJvY1JlY29yZChlcnJvcikpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICApO1xuICByZXR1cm4gZW50cmllcy5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUHJvY2Vzc1NuYXBzaG90RW50cnkgPT4gZW50cnkgIT09IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogQ2FwdHVyZSB0aGUgY3VycmVudCBQSUQsIHBhcmVudCBQSUQsIGFuZCBwcm9jZXNzLXN0YXJ0IGlkZW50aXR5IHRhYmxlLlxuICpcbiAqIExpbnV4IHJlYWRzIGV4YWN0IHN0YXJ0IHRpY2tzIGZyb20gYC9wcm9jYC4gV2luZG93cyB1c2VzIHRoZSBidWlsdC1pblxuICogUG93ZXJTaGVsbCBDSU0gcHJvdmlkZXIuIG1hY09TIGFuZCBvdGhlciBQT1NJWCBwbGF0Zm9ybXMgY29tYmluZSBgcHNgXG4gKiBwcm9jZXNzIHN0YXJ0IHRpbWUgYW5kIGV4ZWN1dGFibGUgbmFtZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1NuYXBzaG90KCk6IFByb21pc2U8UHJvY2Vzc1NuYXBzaG90RW50cnlbXT4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJsaW51eFwiKSByZXR1cm4gbGludXhQcm9jZXNzU25hcHNob3QoKTtcblxuICBjb25zdCBjb21tYW5kID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJwb3dlcnNoZWxsLmV4ZVwiIDogXCJwc1wiO1xuICBjb25zdCBhcmdzID1cbiAgICBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCJcbiAgICAgID8gW1wiLU5vTG9nb1wiLCBcIi1Ob1Byb2ZpbGVcIiwgXCItTm9uSW50ZXJhY3RpdmVcIiwgXCItQ29tbWFuZFwiLCBXSU5ET1dTX1BST0NFU1NfU05BUFNIT1RfU0NSSVBUXVxuICAgICAgOiBbXCItQVwiLCBcIi1vXCIsIFwicGlkPVwiLCBcIi1vXCIsIFwicHBpZD1cIiwgXCItb1wiLCBcImxzdGFydD1cIiwgXCItb1wiLCBcImNvbW09XCJdO1xuICBjb25zdCBwcm9jID0gbm9kZVNwYXduKGNvbW1hbmQsIGFyZ3MsIHtcbiAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXG4gICAgd2luZG93c0hpZGU6IHRydWUsXG4gIH0pO1xuICBjb25zdCBzdGRvdXQgPSB0ZXh0KHByb2Muc3Rkb3V0ISk7XG4gIGNvbnN0IHN0ZGVyciA9IHRleHQocHJvYy5zdGRlcnIhKTtcbiAgY29uc3QgW2V4aXRDb2RlLCBzdGRvdXRUZXh0LCBzdGRlcnJUZXh0XSA9IGF3YWl0IFByb21pc2UuYWxsKFt3YWl0Rm9yRXhpdChwcm9jKSwgc3Rkb3V0LCBzdGRlcnJdKTtcbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7Y29tbWFuZExhYmVsKGNvbW1hbmQsIGFyZ3MpfSBmYWlsZWQgKGV4aXQgJHtleGl0Q29kZX0pJHtcbiAgICAgICAgc3RkZXJyVGV4dCA/IGA6ICR7c3RkZXJyVGV4dC50cmltKCl9YCA6IFwiXCJcbiAgICAgIH1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlUHJvY2Vzc1NuYXBzaG90KGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KHN0ZG91dFRleHQpKTtcbn1cblxuLyoqIEdyb3VwIGEgcHJvY2VzcyBzbmFwc2hvdCBieSBwYXJlbnQgUElELiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuKFxuICBzbmFwc2hvdDogcmVhZG9ubHkgUHJvY2Vzc1NuYXBzaG90RW50cnlbXSxcbik6IE1hcDxudW1iZXIsIFByb2Nlc3NTbmFwc2hvdEVudHJ5W10+IHtcbiAgY29uc3QgY2hpbGRyZW4gPSBuZXcgTWFwPG51bWJlciwgUHJvY2Vzc1NuYXBzaG90RW50cnlbXT4oKTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBzbmFwc2hvdCkge1xuICAgIGNvbnN0IHNpYmxpbmdzID0gY2hpbGRyZW4uZ2V0KGVudHJ5LnBhcmVudFBpZCkgPz8gW107XG4gICAgc2libGluZ3MucHVzaChlbnRyeSk7XG4gICAgY2hpbGRyZW4uc2V0KGVudHJ5LnBhcmVudFBpZCwgc2libGluZ3MpO1xuICB9XG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuLyoqIFNlbGVjdCBvbmUgc25hcHNob3R0ZWQgcHJvY2VzcyB0cmVlIGluIGRlc2NlbmRhbnQtZmlyc3Qgc2lnbmFsIG9yZGVyLiAqL1xuZnVuY3Rpb24gcHJvY2Vzc1RyZWUoXG4gIHNuYXBzaG90OiByZWFkb25seSBQcm9jZXNzU25hcHNob3RFbnRyeVtdLFxuICByb290UGlkOiBudW1iZXIsXG4pOiBQcm9jZXNzU25hcHNob3RFbnRyeVtdIHtcbiAgY29uc3Qgcm9vdCA9IHNuYXBzaG90LmZpbmQoKGVudHJ5KSA9PiBlbnRyeS5waWQgPT09IHJvb3RQaWQpO1xuICBpZiAoIXJvb3QpIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGlkZW50aWZ5IGNoaWxkIHByb2Nlc3MgJHtyb290UGlkfWApO1xuXG4gIGNvbnN0IGNoaWxkcmVuID0gcHJvY2Vzc0NoaWxkcmVuKHNuYXBzaG90KTtcbiAgY29uc3QgdHJlZTogUHJvY2Vzc1NuYXBzaG90RW50cnlbXSA9IFtdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxudW1iZXI+KFtyb290UGlkXSk7XG4gIGNvbnN0IGFwcGVuZERlc2NlbmRhbnRzID0gKHBhcmVudFBpZDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbi5nZXQocGFyZW50UGlkKSA/PyBbXSkge1xuICAgICAgaWYgKHZpc2l0ZWQuaGFzKGNoaWxkLnBpZCkpIGNvbnRpbnVlO1xuICAgICAgdmlzaXRlZC5hZGQoY2hpbGQucGlkKTtcbiAgICAgIGFwcGVuZERlc2NlbmRhbnRzKGNoaWxkLnBpZCk7XG4gICAgICB0cmVlLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfTtcbiAgYXBwZW5kRGVzY2VuZGFudHMocm9vdFBpZCk7XG4gIHRyZWUucHVzaChyb290KTtcbiAgcmV0dXJuIHRyZWU7XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciB0d28gc25hcHNob3RzIGlkZW50aWZ5IHRoZSBzYW1lIHByb2Nlc3MgbGlmZXRpbWUuICovXG5mdW5jdGlvbiBzYW1lUHJvY2VzcyhwcmV2aW91czogUHJvY2Vzc1NuYXBzaG90RW50cnksIGN1cnJlbnQ6IFByb2Nlc3NTbmFwc2hvdEVudHJ5KTogYm9vbGVhbiB7XG4gIHJldHVybiBwcmV2aW91cy5pZGVudGl0eSA9PT0gY3VycmVudC5pZGVudGl0eTtcbn1cblxuLyoqXG4gKiBSZWZyZXNoIHJldGFpbmVkIHByb2Nlc3MgaWRlbnRpdGllcyBhbmQgbWVyZ2UgZGVzY2VuZGFudHMgY3JlYXRlZCBhZnRlciB0aGVcbiAqIGluaXRpYWwgc25hcHNob3QuXG4gKi9cbmZ1bmN0aW9uIHJlZnJlc2hQcm9jZXNzVHJlZShcbiAgcmV0YWluZWQ6IE1hcDxudW1iZXIsIFByb2Nlc3NTbmFwc2hvdEVudHJ5PixcbiAgc25hcHNob3Q6IHJlYWRvbmx5IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10sXG4pOiBSZWZyZXNoZWRQcm9jZXNzVHJlZSB7XG4gIGNvbnN0IGN1cnJlbnRCeVBpZCA9IG5ldyBNYXAoc25hcHNob3QubWFwKChlbnRyeSkgPT4gW2VudHJ5LnBpZCwgZW50cnldKSk7XG4gIGNvbnN0IGNoaWxkcmVuID0gcHJvY2Vzc0NoaWxkcmVuKHNuYXBzaG90KTtcbiAgY29uc3QgcHJvY2Vzc2VzID0gbmV3IE1hcDxudW1iZXIsIFByb2Nlc3NTbmFwc2hvdEVudHJ5PigpO1xuICBjb25zdCBkaXNjb3ZlcmVkOiBQcm9jZXNzU25hcHNob3RFbnRyeVtdID0gW107XG4gIGNvbnN0IHF1ZXVlOiBQcm9jZXNzU25hcHNob3RFbnRyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCBwcmV2aW91cyBvZiByZXRhaW5lZC52YWx1ZXMoKSkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBjdXJyZW50QnlQaWQuZ2V0KHByZXZpb3VzLnBpZCk7XG4gICAgaWYgKCFjdXJyZW50IHx8ICFzYW1lUHJvY2VzcyhwcmV2aW91cywgY3VycmVudCkpIGNvbnRpbnVlO1xuICAgIHJldGFpbmVkLnNldChjdXJyZW50LnBpZCwgY3VycmVudCk7XG4gICAgcHJvY2Vzc2VzLnNldChjdXJyZW50LnBpZCwgY3VycmVudCk7XG4gICAgcXVldWUucHVzaChjdXJyZW50KTtcbiAgfVxuXG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0KHByb2Nlc3Nlcy5rZXlzKCkpO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcXVldWUubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcXVldWVbaW5kZXhdITtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuLmdldChwYXJlbnQucGlkKSA/PyBbXSkge1xuICAgICAgY29uc3QgcHJldmlvdXMgPSByZXRhaW5lZC5nZXQoY2hpbGQucGlkKTtcbiAgICAgIGlmICghcHJldmlvdXMgfHwgIXNhbWVQcm9jZXNzKHByZXZpb3VzLCBjaGlsZCkpIHtcbiAgICAgICAgcmV0YWluZWQuc2V0KGNoaWxkLnBpZCwgY2hpbGQpO1xuICAgICAgICBkaXNjb3ZlcmVkLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgICAgcHJvY2Vzc2VzLnNldChjaGlsZC5waWQsIGNoaWxkKTtcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhjaGlsZC5waWQpKSBjb250aW51ZTtcbiAgICAgIHZpc2l0ZWQuYWRkKGNoaWxkLnBpZCk7XG4gICAgICBxdWV1ZS5wdXNoKGNoaWxkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBwcm9jZXNzZXM6IFsuLi5wcm9jZXNzZXMudmFsdWVzKCldLCBkaXNjb3ZlcmVkIH07XG59XG5cbi8qKiBCdWlsZCB0aGUgcGVyLWxpZmV0aW1lIGtleSB1c2VkIHRvIHByZXZlbnQgcmVwZWF0ZWQgc2lnbmFscyBhZnRlciBQSUQgcmV1c2UuICovXG5mdW5jdGlvbiBwcm9jZXNzSWRlbnRpdHkoZW50cnk6IFByb2Nlc3NTbmFwc2hvdEVudHJ5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2VudHJ5LnBpZH06JHtlbnRyeS5pZGVudGl0eX1gO1xufVxuXG4vKiogU2lnbmFsIGVhY2ggcHJvY2VzcyBpZGVudGl0eSBvbmNlLCBpZ25vcmluZyBQSURzIHRoYXQgYWxyZWFkeSBleGl0ZWQuICovXG5mdW5jdGlvbiBzaWduYWxQcm9jZXNzZXMoXG4gIHByb2Nlc3NlczogcmVhZG9ubHkgUHJvY2Vzc1NuYXBzaG90RW50cnlbXSxcbiAgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyxcbiAgc2lnbmFsZWQ6IFNldDxzdHJpbmc+LFxuKTogdm9pZCB7XG4gIGNvbnN0IGVycm9yczogdW5rbm93bltdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgcHJvY2Vzc2VzKSB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBwcm9jZXNzSWRlbnRpdHkoZW50cnkpO1xuICAgIGlmIChzaWduYWxlZC5oYXMoaWRlbnRpdHkpKSBjb250aW51ZTtcbiAgICBzaWduYWxlZC5hZGQoaWRlbnRpdHkpO1xuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmtpbGwoZW50cnkucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzTWlzc2luZ1Byb2Nlc3NFcnJvcihlcnJvcikpIGVycm9ycy5wdXNoKGVycm9yKTtcbiAgICB9XG4gIH1cbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgYEZhaWxlZCB0byBzZW5kICR7c2lnbmFsfSB0byB0aGUgY29tcGxldGUgcHJvY2VzcyB0cmVlYCk7XG4gIH1cbn1cblxuLyoqIFBhdXNlIHdpdGhvdXQgZGV0YWNoaW5nIHRoZSBzaHV0ZG93biBvcGVyYXRpb24gZnJvbSB0aGUgZXZlbnQgbG9vcC4gKi9cbmZ1bmN0aW9uIGRlbGF5KG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cblxuLyoqXG4gKiBQb2xsIHJlZnJlc2hlZCBwcm9jZXNzIHNuYXBzaG90cyB1bnRpbCB0aGUgcmV0YWluZWQgdHJlZSBleGl0cyBvciB0aGVcbiAqIHRpbWVvdXQgZWxhcHNlcy4gRGVzY2VuZGFudHMgY3JlYXRlZCBkdXJpbmcgc2h1dGRvd24gYXJlIHJldGFpbmVkIGFuZCBtYXlcbiAqIHJlY2VpdmUgdGhlIGN1cnJlbnQgc2h1dGRvd24gc2lnbmFsIG9uY2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JQcm9jZXNzVHJlZUV4aXQoXG4gIHJldGFpbmVkOiBNYXA8bnVtYmVyLCBQcm9jZXNzU25hcHNob3RFbnRyeT4sXG4gIGluaXRpYWxQcm9jZXNzZXM6IHJlYWRvbmx5IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10sXG4gIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMsXG4gIHNpZ25hbGVkOiBTZXQ8c3RyaW5nPixcbiAgdGltZW91dE1zOiBudW1iZXIsXG4gIHBvbGxJbnRlcnZhbE1zOiBudW1iZXIsXG4gIHNpZ25hbERpc2NvdmVyZWQ6IGJvb2xlYW4sXG4pOiBQcm9taXNlPFByb2Nlc3NTbmFwc2hvdEVudHJ5W10+IHtcbiAgbGV0IHN1cnZpdm9ycyA9IFsuLi5pbml0aWFsUHJvY2Vzc2VzXTtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGltZW91dE1zO1xuICB3aGlsZSAoc3Vydml2b3JzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCByZW1haW5pbmdNcyA9IGRlYWRsaW5lIC0gRGF0ZS5ub3coKTtcbiAgICBpZiAocmVtYWluaW5nTXMgPiAwKSBhd2FpdCBkZWxheShNYXRoLm1pbihwb2xsSW50ZXJ2YWxNcywgcmVtYWluaW5nTXMpKTtcblxuICAgIGNvbnN0IHJlZnJlc2hlZCA9IHJlZnJlc2hQcm9jZXNzVHJlZShyZXRhaW5lZCwgYXdhaXQgcHJvY2Vzc1NuYXBzaG90KCkpO1xuICAgIGlmIChzaWduYWxEaXNjb3ZlcmVkICYmIHJlZnJlc2hlZC5kaXNjb3ZlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgIHNpZ25hbFByb2Nlc3NlcyhyZWZyZXNoZWQuZGlzY292ZXJlZCwgc2lnbmFsLCBzaWduYWxlZCk7XG4gICAgfVxuICAgIHN1cnZpdm9ycyA9IHJlZnJlc2hlZC5wcm9jZXNzZXM7XG4gICAgaWYgKERhdGUubm93KCkgPj0gZGVhZGxpbmUpIGJyZWFrO1xuICB9XG4gIHJldHVybiBzdXJ2aXZvcnM7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHtAbGluayBzcGF3bn0gd2l0aCBsaXZlIGxpbmUgYXJyYXlzIGFuZCBsYXp5XG4gKiB0cmltbWVkIGBzdGRvdXRgIC8gYHN0ZGVycmAgZ2V0dGVycyBkZXJpdmVkIGZyb20gdGhvc2UgbGluZXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUV4ZWNSZXN1bHQoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN0ZG91dExpbmVzOiBzdHJpbmdbXSxcbiAgc3RkZXJyTGluZXM6IHN0cmluZ1tdLFxuICB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogRXhlY1Jlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgZXhpdENvZGUsXG4gICAgZ2V0IHN0ZG91dExpbmVzKCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRBc3luY0xpbmVzKHN0ZG91dExpbmVzLCB0cmltKTtcbiAgICB9LFxuICAgIGdldCBzdGRlcnJMaW5lcygpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkQXN5bmNMaW5lcyhzdGRlcnJMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgICBnZXQgc3Rkb3V0KCkge1xuICAgICAgcmV0dXJuIGZvcm1hdEFzeW5jQ2FwdHVyZWRMaW5lcyhzdGRvdXRMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyKCkge1xuICAgICAgcmV0dXJuIGZvcm1hdEFzeW5jQ2FwdHVyZWRMaW5lcyhzdGRlcnJMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgb2JqZWN0IHJldHVybmVkIGZyb20ge0BsaW5rIHNwYXduU3luY30uIENhcHR1cmVkIHN0cmluZ3MgYXJlIHN0b3JlZFxuICogYXMtaXM7IGBzdGRvdXRgIC8gYHN0ZGVycmAgdHJpbSBkaXJlY3RseSwgYW5kIGxpbmUgYXJyYXlzIHNwbGl0IG9ubHkgb24gcmVhZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3luY0V4ZWNSZXN1bHQoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN0ZG91dFRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgc3RkZXJyVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogRXhlY1Jlc3VsdCB7XG4gIGxldCBzdGRvdXRMaW5lc0NhY2hlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0ZGVyckxpbmVzQ2FjaGU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN5bmNMaW5lcyA9ICh0ZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHRleHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbm9ybWFsaXplZFN5bmNMaW5lcyhsaW5lc0Zyb21DYXB0dXJlZE91dHB1dCh0ZXh0KSwgdHJpbSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBleGl0Q29kZSxcbiAgICBnZXQgc3Rkb3V0TGluZXMoKSB7XG4gICAgICBpZiAoc3Rkb3V0VGV4dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gICAgICBzdGRvdXRMaW5lc0NhY2hlID8/PSBzeW5jTGluZXMoc3Rkb3V0VGV4dCkgPz8gW107XG4gICAgICByZXR1cm4gc3Rkb3V0TGluZXNDYWNoZTtcbiAgICB9LFxuICAgIGdldCBzdGRlcnJMaW5lcygpIHtcbiAgICAgIGlmIChzdGRlcnJUZXh0ID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgICAgIHN0ZGVyckxpbmVzQ2FjaGUgPz89IHN5bmNMaW5lcyhzdGRlcnJUZXh0KSA/PyBbXTtcbiAgICAgIHJldHVybiBzdGRlcnJMaW5lc0NhY2hlO1xuICAgIH0sXG4gICAgZ2V0IHN0ZG91dCgpIHtcbiAgICAgIHJldHVybiBmb3JtYXRTeW5jQ2FwdHVyZWRUZXh0KHN0ZG91dFRleHQsIHRyaW0pID8/IFwiXCI7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyKCkge1xuICAgICAgcmV0dXJuIGZvcm1hdFN5bmNDYXB0dXJlZFRleHQoc3RkZXJyVGV4dCwgdHJpbSkgPz8gXCJcIjtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdXNlci1zdXBwbGllZCBsaW5lIGhhbmRsZXJzIGZyb20gYSB7QGxpbmsgU3RkaW9PcHRpb259LlxuICpcbiAqIFRoZSBgXCJjYXB0dXJlXCJgIG1hcmtlciBpcyBmaWx0ZXJlZCBvdXQ7IGNhcHR1cmUgaXRzZWxmIGlzIGFsd2F5cyBoYW5kbGVkIGJ5XG4gKiBwdXNoaW5nIGludG8gdGhlIGxpbmUgYnVmZmVyIGluc2lkZSB7QGxpbmsgcmVzb2x2ZVN0ZGlvfS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gU3RkaW8gb3B0aW9uIHRoYXQgbWF5IGVtYmVkIG9uZSBvciBtb3JlIGhhbmRsZXJzXG4gKiBAcmV0dXJucyBIYW5kbGVycyB0byBpbnZva2UgYWZ0ZXIgZWFjaCBjYXB0dXJlZCBsaW5lIChtYXkgYmUgZW1wdHkpXG4gKi9cbmZ1bmN0aW9uIGxpbmVIYW5kbGVycyhvcHRpb246IFN0ZGlvT3B0aW9uKTogTGluZUhhbmRsZXJbXSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9uID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBbb3B0aW9uXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uKSkge1xuICAgIHJldHVybiBvcHRpb24uZmlsdGVyKChpdGVtKTogaXRlbSBpcyBMaW5lSGFuZGxlciA9PiBpdGVtICE9PSBcImNhcHR1cmVcIik7XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRpb24gPT09IFwib2JqZWN0XCIpIHJldHVybiBbb3B0aW9uLm9uTGluZV07XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gY2FwdHVyZXNMaW5lcyhvcHRpb246IFN0ZGlvT3B0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygb3B0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9uKSB8fCBvcHRpb24uY2FwdHVyZSAhPT0gZmFsc2U7XG59XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGEgc3RkaW8gb3B0aW9uIGlzIGEgc3RyaW5nIHNwYXduIG1vZGUgcmF0aGVyIHRoYW4gY2FwdHVyZS9oYW5kbGVycy5cbiAqXG4gKiB7QGxpbmsgcmVzb2x2ZVN0ZGlvfSBzdGlsbCB0cmVhdHMgYFwicGlwZVwiYCBhcyBwaXBlLWFuZC1jYXB0dXJlOyBvbmx5XG4gKiBgXCJpbmhlcml0XCJgIGFuZCBgXCJpZ25vcmVcImAgcmV0dXJuIHdpdGhvdXQgYSBsaW5lIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSBvcHRpb24gLSBTdGRpbyBvcHRpb24gdG8gY2xhc3NpZnlcbiAqIEByZXR1cm5zIFdoZXRoZXIgYG9wdGlvbmAgaXMgYFwiaW5oZXJpdFwiYCwgYFwicGlwZVwiYCwgb3IgYFwiaWdub3JlXCJgXG4gKi9cbmZ1bmN0aW9uIGlzUGFzc3Rocm91Z2hNb2RlKG9wdGlvbjogdW5rbm93bik6IG9wdGlvbiBpcyBFeGVjU3RkaW8ge1xuICByZXR1cm4gb3B0aW9uID09PSBcImluaGVyaXRcIiB8fCBvcHRpb24gPT09IFwicGlwZVwiIHx8IG9wdGlvbiA9PT0gXCJpZ25vcmVcIjtcbn1cblxuLyoqIFRydWUgd2hlbiBzdGRpbiBpcyBkYXRhIHJhdGhlciB0aGFuIG9uZSBvZiB0aGUgdGhyZWUgcmVzZXJ2ZWQgc3RkaW8gbW9kZXMuICovXG5mdW5jdGlvbiBpc1N0ZGluUGF5bG9hZChzdGRpbjogRXhlY1N0ZGlvIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RkaW4gaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBzdGRpbiA9PT0gXCJzdHJpbmdcIiAmJiAhaXNQYXNzdGhyb3VnaE1vZGUoc3RkaW4pO1xufVxuXG4vKipcbiAqIE1hcCBhIHtAbGluayBTdGRpb09wdGlvbn0gaW50byBhIHNwYXduIHN0ZGlvIG1vZGUgYW5kIG9wdGlvbmFsIGxpbmUgY2FsbGJhY2suXG4gKlxuICogUGlwZWQgbW9kZXMgKGBcImNhcHR1cmVcImAsIGBcInBpcGVcImAsIGhhbmRsZXJzLCBhcnJheXMpIGFwcGVuZCBldmVyeSBsaW5lIHRvXG4gKiBgbGluZXNgIGFuZCBpbnZva2UgYW55IGVtYmVkZGVkIGhhbmRsZXJzLiBPbWl0dGVkIG9wdGlvbnMgdXNlIGBkZWZhdWx0TW9kZWAuXG4gKlxuICogQHBhcmFtIG9wdGlvbiAtIENhbGxlciBzdGRpbyBwcmVmZXJlbmNlIGZvciBvbmUgZmRcbiAqIEBwYXJhbSBsaW5lcyAtIE11dGFibGUgYnVmZmVyIHRoYXQgcmVjZWl2ZXMgZWFjaCBwaXBlZCBsaW5lXG4gKiBAcGFyYW0gZGVmYXVsdE1vZGUgLSBTcGF3biBtb2RlIHdoZW4gYG9wdGlvbmAgaXMgb21pdHRlZCAoYFwiaW5oZXJpdFwiYCBieSBkZWZhdWx0KVxuICogQHJldHVybnMgUmVzb2x2ZWQgc3Bhd24gbW9kZSBhbmQgb3B0aW9uYWwgcGVyLWxpbmUgY2FsbGJhY2tcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN0ZGlvKFxuICBvcHRpb246IFN0ZGlvT3B0aW9uIHwgdW5kZWZpbmVkLFxuICBsaW5lczogc3RyaW5nW10sXG4gIGRlZmF1bHRNb2RlOiBFeGVjU3RkaW8gPSBcImluaGVyaXRcIixcbik6IFJlc29sdmVkU3RkaW8ge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB7IG1vZGU6IGRlZmF1bHRNb2RlIH07XG4gIGlmIChpc1Bhc3N0aHJvdWdoTW9kZShvcHRpb24pICYmIG9wdGlvbiAhPT0gXCJwaXBlXCIpIHJldHVybiB7IG1vZGU6IG9wdGlvbiB9O1xuXG4gIGNvbnN0IGhhbmRsZXJzID0gbGluZUhhbmRsZXJzKG9wdGlvbik7XG4gIGNvbnN0IGNhcHR1cmUgPSBjYXB0dXJlc0xpbmVzKG9wdGlvbik7XG4gIHJldHVybiB7XG4gICAgbW9kZTogXCJwaXBlXCIsXG4gICAgb25MaW5lOiAobGluZSkgPT4ge1xuICAgICAgaWYgKGNhcHR1cmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIGhhbmRsZXIobGluZSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWFkIGEgcmVhZGFibGUgc3RyZWFtIGxpbmUtYnktbGluZSBhbmQgaW52b2tlIGBvbkxpbmVgIGZvciBlYWNoIGNodW5rLlxuICpcbiAqIFVzZXMgYHJlYWRsaW5lYCBzbyBgXFxyXFxuYCBhbmQgYmFyZSBgXFxuYCBhcmUgbm9ybWFsaXplZC4gVGhlIGludGVyZmFjZSBpc1xuICogYWx3YXlzIGNsb3NlZCBpbiBhIGBmaW5hbGx5YCBibG9jay5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtIC0gU3VicHJvY2VzcyBzdGRvdXQgb3Igc3RkZXJyIHN0cmVhbVxuICogQHBhcmFtIG9uTGluZSAtIENhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgb3V0cHV0IGxpbmVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZExpbmVzKHN0cmVhbTogUmVhZGFibGUsIG9uTGluZTogTGluZUhhbmRsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2UoeyBpbnB1dDogc3RyZWFtLCBjcmxmRGVsYXk6IEluZmluaXR5IH0pO1xuICB0cnkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgbGluZSBvZiBybCkgb25MaW5lKGxpbmUpO1xuICB9IGZpbmFsbHkge1xuICAgIHJsLmNsb3NlKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGFydCBhIGJhY2tncm91bmQgbGluZSByZWFkIHdoZW4gdGhlIHJlc29sdmVkIGhhbmRsZXIgcGlwZXMgYSBzdHJlYW0uXG4gKlxuICogQHBhcmFtIHJlYWRzIC0gUHJvbWlzZSBsaXN0IGF3YWl0ZWQgYmVmb3JlIHJldHVybmluZyB0aGUge0BsaW5rIEV4ZWNSZXN1bHR9XG4gKiBAcGFyYW0gc3RyZWFtIC0gU3VicHJvY2VzcyBzdHJlYW0gZm9yIHRoaXMgZmQgKGBudWxsYCB3aGVuIHVuYXZhaWxhYmxlKVxuICogQHBhcmFtIGhhbmRsZXIgLSBSZXNvbHZlZCBzdGRpbyBjb25maWcgZnJvbSB7QGxpbmsgcmVzb2x2ZVN0ZGlvfVxuICovXG5mdW5jdGlvbiBxdWV1ZUxpbmVSZWFkcyhcbiAgcmVhZHM6IFByb21pc2U8dm9pZD5bXSxcbiAgc3RyZWFtOiBSZWFkYWJsZSB8IG51bGwsXG4gIGhhbmRsZXI6IFJlc29sdmVkU3RkaW8sXG4pOiB2b2lkIHtcbiAgaWYgKGhhbmRsZXIub25MaW5lICYmIHN0cmVhbSkgcmVhZHMucHVzaChyZWFkTGluZXMoc3RyZWFtLCBoYW5kbGVyLm9uTGluZSkpO1xufVxuXG4vKipcbiAqIFdyaXRlIHN0cmluZyBzdGRpbiB0byBhIHNwYXduZWQgcHJvY2VzcyBhbmQgY2xvc2UgdGhlIHN0cmVhbS5cbiAqXG4gKiBOby1vcCB1bmxlc3MgYHN0ZGluYCBpcyBhIHBheWxvYWQgc3RyaW5nIChub3QgYSBzdGRpbyBtb2RlKSBhbmRcbiAqIGBwcm9jLnN0ZGluYCBpcyBhdmFpbGFibGUuIEEgY2hpbGQgdGhhdCBleGl0cyBiZWZvcmUgY29uc3VtaW5nIHRoZSBwYXlsb2FkXG4gKiBjbG9zZXMgaXRzIHBpcGU7IEVQSVBFIGlzIGV4cGVjdGVkIGluIHRoYXQgY2FzZSBhbmQgaXMgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0gcHJvYyAtIENoaWxkIHByb2Nlc3MgcmV0dXJuZWQgZnJvbSBgc3Bhd25gXG4gKiBAcGFyYW0gc3RkaW4gLSBTdGRpbyBtb2RlIG9yIHN0cmluZyBwYXlsb2FkIGZyb20ge0BsaW5rIEV4ZWNPcHRpb25zfVxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN0ZGluKFxuICBwcm9jOiBDaGlsZFByb2Nlc3MsXG4gIHN0ZGluOiBFeGVjU3RkaW8gfCBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1N0ZGluUGF5bG9hZChzdGRpbikgfHwgIXByb2Muc3RkaW4pIHJldHVybjtcbiAgY29uc3QgY29tcGxldGlvbiA9IGZpbmlzaGVkKHByb2Muc3RkaW4sIHsgY2xlYW51cDogdHJ1ZSB9KTtcbiAgcHJvYy5zdGRpbi5lbmQoc3RkaW4pO1xuICB0cnkge1xuICAgIGF3YWl0IGNvbXBsZXRpb247XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVyciAmJiBlcnIuY29kZSA9PT0gXCJFUElQRVwiKSkgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogQXdhaXQgcHJvY2VzcyBleGl0IGFuZCBub3JtYWxpemUgYSBtaXNzaW5nIGV4aXQgY29kZSB0byBgMWAuXG4gKlxuICogUmVqZWN0cyB3aGVuIHNwYXduIGZhaWxzIGJlZm9yZSBgY2xvc2VgIChlLmcuIGV4ZWN1dGFibGUgbm90IGZvdW5kKS5cbiAqXG4gKiBAcGFyYW0gcHJvYyAtIENoaWxkIHByb2Nlc3MgcmV0dXJuZWQgZnJvbSBgc3Bhd25gXG4gKiBAcmV0dXJucyBSZXNvbHZlZCBleGl0IGNvZGVcbiAqL1xuZnVuY3Rpb24gd2FpdEZvckV4aXQocHJvYzogQ2hpbGRQcm9jZXNzKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBwcm9jLm9uY2UoXCJlcnJvclwiLCByZWplY3QpO1xuICAgIHByb2Mub25jZShcImNsb3NlXCIsIChjb2RlKSA9PiByZXNvbHZlKGNvZGUgPz8gMSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiBgRXJyb3JgIGZvciBhIG5vbi16ZXJvIGV4aXQgd2hlbiB7QGxpbmsgRXhlY09wdGlvbnMuY2hlY2t9IGlzIHNldC5cbiAqXG4gKiBQcmVmZXJzIHRyaW1tZWQgc3RkZXJyIHRleHQsIHRoZW4gc3Rkb3V0LCBpbiB0aGUgbWVzc2FnZSBib2R5LlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSBuYW1lIG9yIHBhdGhcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZXhlY3V0YWJsZVxuICogQHBhcmFtIHJlc3VsdCAtIENvbXBsZXRlZCBleGVjIG91dGNvbWUgd2l0aCBjYXB0dXJlZCBvdXRwdXRcbiAqIEByZXR1cm5zIEVycm9yIHN1aXRhYmxlIGZvciB0aHJvd2luZyBmcm9tIHtAbGluayBzcGF3bn1cbiAqL1xuZnVuY3Rpb24gZXhlY0Vycm9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIHJlc3VsdDogRXhlY1Jlc3VsdCk6IEVycm9yIHtcbiAgY29uc3QgZGV0YWlsID0gcmVzdWx0LnN0ZGVyciB8fCByZXN1bHQuc3Rkb3V0O1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGAke2NvbW1hbmRMYWJlbChjb21tYW5kLCBhcmdzKX0gZmFpbGVkIChleGl0ICR7cmVzdWx0LmV4aXRDb2RlfSkke2RldGFpbCA/IGA6ICR7ZGV0YWlsfWAgOiBcIlwifWAsXG4gICk7XG59XG5cbi8qKlxuICogTWFwIGEge0BsaW5rIFN5bmNFeGVjU3RkaW99IG9wdGlvbiB0byBhIGBzcGF3blN5bmNgIHN0ZGlvIG1vZGUuXG4gKlxuICogYFwiY2FwdHVyZVwiYCBwaXBlcyB0aGUgZmQgc28gb3V0cHV0IGNhbiBiZSByZWFkIGludG8gdGhlIHtAbGluayBFeGVjUmVzdWx0fS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gQ2FsbGVyIHN0ZGlvIHByZWZlcmVuY2UgZm9yIG9uZSBmZFxuICogQHBhcmFtIGRlZmF1bHRNb2RlIC0gU3Bhd24gbW9kZSB3aGVuIGBvcHRpb25gIGlzIG9taXR0ZWQgKGBcImluaGVyaXRcImAgYnkgZGVmYXVsdClcbiAqIEByZXR1cm5zIFZhbHVlIGZvciB0aGUgYHNwYXduU3luY2Agc3RkaW8gdHVwbGVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN5bmNTdGRpbyhcbiAgb3B0aW9uOiBTeW5jRXhlY1N0ZGlvIHwgdW5kZWZpbmVkLFxuICBkZWZhdWx0TW9kZTogRXhlY1N0ZGlvID0gXCJpbmhlcml0XCIsXG4pOiBFeGVjU3RkaW8ge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0TW9kZTtcbiAgaWYgKG9wdGlvbiA9PT0gXCJjYXB0dXJlXCIpIHJldHVybiBcInBpcGVcIjtcbiAgcmV0dXJuIG9wdGlvbjtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgcmF3IGBzcGF3blN5bmNgIG91dHB1dCB0byBhIFVURi04IHN0cmluZyB3aGVuIGNhcHR1cmUgaXMgZW5hYmxlZC5cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZWRUZXh0KG91dHB1dDogc3RyaW5nIHwgQnVmZmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvdXRwdXQgPT09IG51bGwgfHwgb3V0cHV0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygb3V0cHV0ID09PSBcInN0cmluZ1wiID8gb3V0cHV0IDogb3V0cHV0LnRvU3RyaW5nKFwidXRmOFwiKTtcbn1cblxuLyoqXG4gKiBTcGxpdCBjYXB0dXJlZCBwcm9jZXNzIG91dHB1dCBpbnRvIGxpbmVzIGZvciB7QGxpbmsgRXhlY1Jlc3VsdC5zdGRvdXRMaW5lc30gL1xuICoge0BsaW5rIEV4ZWNSZXN1bHQuc3RkZXJyTGluZXN9ICh7QGxpbmsgc3Bhd25TeW5jfSBvbmx5OyBpbnZva2VkIGxhemlseSkuXG4gKi9cbmZ1bmN0aW9uIGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gb3V0cHV0LnJlcGxhY2UoL1xcclxcbi9nLCBcIlxcblwiKS5yZXBsYWNlKC9cXHIvZywgXCJcXG5cIikuc3BsaXQoXCJcXG5cIik7XG59XG5cbi8qKlxuICogU3RvcCBhIGNoaWxkIHByb2Nlc3MgYW5kIGRlc2NlbmRhbnRzIGRpc2NvdmVyZWQgdGhyb3VnaCBvcGVyYXRpbmctc3lzdGVtXG4gKiBwcm9jZXNzIHNuYXBzaG90cy5cbiAqXG4gKiBUaGUgaW5pdGlhbCB0cmVlIGlzIHJldGFpbmVkIGJlZm9yZSBzaWduYWxpbmcgc28gZGVzY2VuZGFudHMgcmVtYWluXG4gKiB0YXJnZXRhYmxlIGFmdGVyIHRoZWlyIHBhcmVudCBleGl0cyBvciB0aGV5IGFyZSByZXBhcmVudGVkLiBQb2xsaW5nIHJlZnJlc2hlc1xuICogdGhlIHByb2Nlc3MgdGFibGUsIG1lcmdlcyBuZXdseSBjcmVhdGVkIGRlc2NlbmRhbnRzLCBhbmQgc2VuZHMgZWFjaCBvbmUgdGhlXG4gKiBhY3RpdmUgc2h1dGRvd24gc2lnbmFsIG9uY2UuIEVpdGhlciBwaGFzZSBjYW4gYmUgZGlzYWJsZWQgZm9yIGdyYWNlZnVsLW9ubHlcbiAqIG9yIGZvcmNlLW9ubHkgdGVybWluYXRpb24uIG1hY09TIGFuZCBvdGhlciBQT1NJWCBwbGF0Zm9ybXMgdXNlIGBwc2A7IFdpbmRvd3NcbiAqIHVzZXMgdGhlIGJ1aWx0LWluIFBvd2VyU2hlbGwgQ0lNIHByb2Nlc3MgcHJvdmlkZXIuXG4gKlxuICogV2luZG93cyBkb2VzIG5vdCBpbXBsZW1lbnQgUE9TSVggc2lnbmFsIHNlbWFudGljcy4gTm9kZSB0ZXJtaW5hdGVzIHByb2Nlc3Nlc1xuICogdW5jb25kaXRpb25hbGx5IGZvciBzdXBwb3J0ZWQgc2lnbmFscyB0aGVyZSwgaW5jbHVkaW5nIGBTSUdURVJNYC5cbiAqXG4gKiBAcGFyYW0gY2hpbGQgLSBSb290IGNoaWxkIHByb2Nlc3Mgd2hvc2Ugc25hcHNob3R0ZWQgdHJlZSBzaG91bGQgc3RvcFxuICogQHBhcmFtIG9wdGlvbnMgLSBHcmFjZWZ1bCBzaWduYWwsIGZvcmNlIHNpZ25hbCwgdGltZW91dCwgYW5kIHBvbGxpbmcgcG9saWN5XG4gKiBAdGhyb3dzIFdoZW4gdGhlIHByb2Nlc3MgdGFibGUgY2Fubm90IGJlIGNhcHR1cmVkLCBhIHNpZ25hbCBjYW5ub3QgYmUgc2VudCxcbiAqIG9yIGlkZW50aXR5LW1hdGNoZWQgcHJvY2Vzc2VzIHJlbWFpbiBhZnRlciB0aGUgZmluYWwgZW5hYmxlZCBwaGFzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbChjaGlsZDogQ2hpbGRQcm9jZXNzLCBvcHRpb25zOiBLaWxsT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCB8fCBjaGlsZC5leGl0Q29kZSAhPT0gbnVsbCB8fCBjaGlsZC5zaWduYWxDb2RlICE9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZ3JhY2VmdWxUaW1lb3V0TXMgPSB0aW1lb3V0VmFsdWUoXG4gICAgb3B0aW9ucy5ncmFjZWZ1bFRpbWVvdXRNcyA/PyBERUZBVUxUX0dSQUNFRlVMX1RJTUVPVVRfTVMsXG4gICAgXCJncmFjZWZ1bFRpbWVvdXRNc1wiLFxuICApO1xuICBjb25zdCBmb3JjZVRpbWVvdXRNcyA9IHRpbWVvdXRWYWx1ZShcbiAgICBvcHRpb25zLmZvcmNlVGltZW91dE1zID8/IERFRkFVTFRfRk9SQ0VfVElNRU9VVF9NUyxcbiAgICBcImZvcmNlVGltZW91dE1zXCIsXG4gICk7XG4gIGNvbnN0IHBvbGxJbnRlcnZhbE1zID0gcG9sbEludGVydmFsVmFsdWUob3B0aW9ucy5wb2xsSW50ZXJ2YWxNcyA/PyBERUZBVUxUX0tJTExfUE9MTF9JTlRFUlZBTF9NUyk7XG4gIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgcHJvY2Vzc1NuYXBzaG90KCk7XG4gIGlmIChjaGlsZC5leGl0Q29kZSAhPT0gbnVsbCB8fCBjaGlsZC5zaWduYWxDb2RlICE9PSBudWxsKSByZXR1cm47XG4gIGNvbnN0IHRyZWUgPSBwcm9jZXNzVHJlZShzbmFwc2hvdCwgY2hpbGQucGlkKTtcbiAgY29uc3QgcmV0YWluZWQgPSBuZXcgTWFwKHRyZWUubWFwKChlbnRyeSkgPT4gW2VudHJ5LnBpZCwgZW50cnldKSk7XG4gIGNvbnN0IGdyYWNlZnVsU2lnbmFsID0gb3B0aW9ucy5ncmFjZWZ1bFNpZ25hbCA9PT0gdW5kZWZpbmVkID8gXCJTSUdURVJNXCIgOiBvcHRpb25zLmdyYWNlZnVsU2lnbmFsO1xuICBjb25zdCBncmFjZWZ1bFNpZ25hbFRhcmdldCA9IG9wdGlvbnMuZ3JhY2VmdWxTaWduYWxUYXJnZXQgPz8gXCJ0cmVlXCI7XG4gIGNvbnN0IGZvcmNlU2lnbmFsID0gb3B0aW9ucy5mb3JjZVNpZ25hbCA9PT0gdW5kZWZpbmVkID8gXCJTSUdLSUxMXCIgOiBvcHRpb25zLmZvcmNlU2lnbmFsO1xuICBpZiAoZ3JhY2VmdWxTaWduYWxUYXJnZXQgIT09IFwicm9vdFwiICYmIGdyYWNlZnVsU2lnbmFsVGFyZ2V0ICE9PSBcInRyZWVcIikge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiZ3JhY2VmdWxTaWduYWxUYXJnZXQgbXVzdCBiZSByb290IG9yIHRyZWVcIik7XG4gIH1cbiAgaWYgKGdyYWNlZnVsU2lnbmFsID09PSBmYWxzZSAmJiBmb3JjZVNpZ25hbCA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdCBsZWFzdCBvbmUgcHJvY2Vzcy10cmVlIHRlcm1pbmF0aW9uIHNpZ25hbCBtdXN0IGJlIGVuYWJsZWRcIik7XG4gIH1cblxuICBsZXQgZm9yY2VUYXJnZXRzID0gdHJlZTtcbiAgaWYgKGdyYWNlZnVsU2lnbmFsICE9PSBmYWxzZSkge1xuICAgIGNvbnN0IGdyYWNlZnVsU2lnbmFsZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBncmFjZWZ1bFRhcmdldHMgPSBncmFjZWZ1bFNpZ25hbFRhcmdldCA9PT0gXCJyb290XCIgPyBbdHJlZS5hdCgtMSkhXSA6IHRyZWU7XG4gICAgc2lnbmFsUHJvY2Vzc2VzKGdyYWNlZnVsVGFyZ2V0cywgZ3JhY2VmdWxTaWduYWwsIGdyYWNlZnVsU2lnbmFsZWQpO1xuICAgIGZvcmNlVGFyZ2V0cyA9IGF3YWl0IHdhaXRGb3JQcm9jZXNzVHJlZUV4aXQoXG4gICAgICByZXRhaW5lZCxcbiAgICAgIHRyZWUsXG4gICAgICBncmFjZWZ1bFNpZ25hbCxcbiAgICAgIGdyYWNlZnVsU2lnbmFsZWQsXG4gICAgICBncmFjZWZ1bFRpbWVvdXRNcyxcbiAgICAgIHBvbGxJbnRlcnZhbE1zLFxuICAgICAgZ3JhY2VmdWxTaWduYWxUYXJnZXQgPT09IFwidHJlZVwiLFxuICAgICk7XG4gIH1cbiAgaWYgKGZvcmNlVGFyZ2V0cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgaWYgKGZvcmNlU2lnbmFsID09PSBmYWxzZSkge1xuICAgIGlmIChncmFjZWZ1bFNpZ25hbCA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0IGxlYXN0IG9uZSBwcm9jZXNzLXRyZWUgdGVybWluYXRpb24gc2lnbmFsIG11c3QgYmUgZW5hYmxlZFwiKTtcbiAgICB9XG4gICAgdGhyb3cgcHJvY2Vzc1Rlcm1pbmF0aW9uRXJyb3IoZ3JhY2VmdWxTaWduYWwsIGZvcmNlVGFyZ2V0cyk7XG4gIH1cblxuICBjb25zdCBmb3JjZVNpZ25hbGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHNpZ25hbFByb2Nlc3Nlcyhmb3JjZVRhcmdldHMsIGZvcmNlU2lnbmFsLCBmb3JjZVNpZ25hbGVkKTtcbiAgY29uc3QgZm9yY2VkU3Vydml2b3JzID0gYXdhaXQgd2FpdEZvclByb2Nlc3NUcmVlRXhpdChcbiAgICByZXRhaW5lZCxcbiAgICBmb3JjZVRhcmdldHMsXG4gICAgZm9yY2VTaWduYWwsXG4gICAgZm9yY2VTaWduYWxlZCxcbiAgICBmb3JjZVRpbWVvdXRNcyxcbiAgICBwb2xsSW50ZXJ2YWxNcyxcbiAgICB0cnVlLFxuICApO1xuICBpZiAoZm9yY2VkU3Vydml2b3JzLmxlbmd0aCA+IDApIHRocm93IHByb2Nlc3NUZXJtaW5hdGlvbkVycm9yKGZvcmNlU2lnbmFsLCBmb3JjZWRTdXJ2aXZvcnMpO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzVGVybWluYXRpb25FcnJvcihcbiAgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyxcbiAgcHJvY2Vzc2VzOiByZWFkb25seSBQcm9jZXNzU25hcHNob3RFbnRyeVtdLFxuKTogRXJyb3Ige1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGBQcm9jZXNzZXMgZGlkIG5vdCB0ZXJtaW5hdGUgYWZ0ZXIgJHtzaWduYWx9OiAke3Byb2Nlc3Nlcy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5waWQpLmpvaW4oXCIsIFwiKX1gLFxuICApO1xufVxuXG4vKipcbiAqIFNwYXduIGEgc3VicHJvY2Vzcy4gUmV0dXJucyB0aGUgTElWRSBjaGlsZCBoYW5kbGUgdGhhdCBpcyBBTFNPIGFcbiAqIGBQcm9taXNlPEV4ZWNSZXN1bHQ+YCByZXNvbHZpbmcgb24gZXhpdCAtIHNlZSB7QGxpbmsgQ2hpbGRQcm9jZXNzUmVzdWx0fS5cbiAqXG4gKiBUaGUgcHJvbWlzZSBoYWxmIGlzIHRoZSBleGFjdCBiZWhhdmlvdXIgdGhpcyBmdW5jdGlvbiBoYWQgYmVmb3JlOiBpdCBhd2FpdHNcbiAqIGV4aXQgKGFuZCBhbnkgbGluZSByZWFkcyAvIHN0ZGluIHdyaXRlKSwgdGhlbiByZXNvbHZlcyB0byB0aGUge0BsaW5rIEV4ZWNSZXN1bHR9XG4gKiBvciByZWplY3RzIChzcGF3biBlcnJvciBvdGhlciB0aGFuIGEgbWlzc2luZyBleGVjdXRhYmxlLCBvciBgY2hlY2tgIG9uIG5vbi16ZXJvXG4gKiBleGl0KS4gRXhpc3RpbmcgYGF3YWl0IHNwYXduKC4uLilgIGNhbGxlcnMgYXJlIHVuYWZmZWN0ZWQuIFRoZSBoYW5kbGUgaGFsZiBsZXRzIGFcbiAqIGNhbGxlciBzdXBlcnZpc2UgdGhlIHByb2Nlc3MgKGAucGlkYCwgYC5raWxsKHNpZ25hbClgLCBgZXhpdGAgZXZlbnQpIHdpdGhvdXQgYVxuICogc2Vjb25kIHNwYXduLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSB0byBydW4gKHJlc29sdmVkIG9uIGBQQVRIYCB3aGVuIGBzaGVsbGAgaXMgc2V0IG9uIG9wdGlvbnMpXG4gKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdmVyYmF0aW0gdG8gdGhlIGV4ZWN1dGFibGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gU3Bhd24sIHN0ZGlvLCBhbmQgY2hlY2sgb3B0aW9uc1xuICogQHJldHVybnMgVGhlIGxpdmUgYENoaWxkUHJvY2Vzc2AsIGF3YWl0YWJsZSB0byBleGl0IGNvZGUgKyBjYXB0dXJlZCBvdXRwdXRcbiAqIEB0aHJvd3MgKG9uIHRoZSBwcm9taXNlKSBXaGVuIHNwYXduIGZhaWxzIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIGEgbWlzc2luZ1xuICogZXhlY3V0YWJsZSwgbGluZSByZWFkcyBmYWlsLCBvciBgY2hlY2tgIGlzIHRydWUgYW5kIGV4aXQgY29kZSBpcyBub24temVyb1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3Bhd24oLi4uYXJnczogU3Bhd25BcmdzPEV4ZWNPcHRpb25zPik6IENoaWxkUHJvY2Vzc1Jlc3VsdCB7XG4gIGNvbnN0IHsgY29tbWFuZCwgY29tbWFuZEFyZ3MsIG9wdGlvbnMgPSB7fSB9ID0gcGFyc2VTcGF3bkFyZ3MoYXJncyk7XG4gIGNvbnN0IHsgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBjaGVjaywgdHJpbSwgLi4uc3Bhd25PcHRzIH0gPSBvcHRpb25zO1xuICBjb25zdCBzdGRvdXRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc3RkZXJyTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHN0ZG91dEhhbmRsZXIgPSByZXNvbHZlU3RkaW8oc3Rkb3V0LCBzdGRvdXRMaW5lcyk7XG4gIGNvbnN0IHN0ZGVyckhhbmRsZXIgPSByZXNvbHZlU3RkaW8oc3RkZXJyLCBzdGRlcnJMaW5lcyk7XG4gIGNvbnN0IHN0ZGluTW9kZTogRXhlY1N0ZGlvID0gaXNTdGRpblBheWxvYWQoc3RkaW4pID8gXCJwaXBlXCIgOiAoc3RkaW4gPz8gXCJpbmhlcml0XCIpO1xuXG4gIGNvbnN0IHByb2MgPSBub2RlU3Bhd24oY29tbWFuZCwgY29tbWFuZEFyZ3MsIHtcbiAgICAuLi5zcGF3bk9wdHMsXG4gICAgc3RkaW86IFtzdGRpbk1vZGUsIHN0ZG91dEhhbmRsZXIubW9kZSwgc3RkZXJySGFuZGxlci5tb2RlXSxcbiAgfSk7XG5cbiAgY29uc3Qgc3RkaW5Xcml0ZSA9IHdyaXRlU3RkaW4ocHJvYywgc3RkaW4pO1xuXG4gIGNvbnN0IHJlYWRzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgcXVldWVMaW5lUmVhZHMocmVhZHMsIHByb2Muc3Rkb3V0LCBzdGRvdXRIYW5kbGVyKTtcbiAgcXVldWVMaW5lUmVhZHMocmVhZHMsIHByb2Muc3RkZXJyLCBzdGRlcnJIYW5kbGVyKTtcblxuICBjb25zdCBjb21wbGV0aW9uID0gKGFzeW5jICgpOiBQcm9taXNlPEV4ZWNSZXN1bHQ+ID0+IHtcbiAgICBsZXQgZXhpdENvZGUgPSAxO1xuICAgIGxldCBjb21tYW5kTm90Rm91bmRFcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBleGl0Q29kZSA9IGF3YWl0IHdhaXRGb3JFeGl0KHByb2MpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3N0ZGluV3JpdGUsIC4uLnJlYWRzXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoIWlzQ29tbWFuZE5vdEZvdW5kRXJyb3IoZXJyKSkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3N0ZGluV3JpdGUsIC4uLnJlYWRzXSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHByb2Muc3RkaW4/LmRlc3Ryb3koKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5kZXN0cm95KCk7XG4gICAgICBwcm9jLnN0ZGVycj8uZGVzdHJveSgpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtzdGRpbldyaXRlXSk7XG4gICAgICBmb3IgKGNvbnN0IHJlYWQgb2YgcmVhZHMpIHZvaWQgcmVhZC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgY29tbWFuZE5vdEZvdW5kRXJyb3IgPSBlcnI7XG4gICAgICBleGl0Q29kZSA9IENPTU1BTkRfTk9UX0ZPVU5EX0VYSVRfQ09ERTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjcmVhdGVFeGVjUmVzdWx0KGV4aXRDb2RlLCBzdGRvdXRMaW5lcywgc3RkZXJyTGluZXMsIHRyaW0pO1xuICAgIGlmIChjaGVjayAmJiByZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICAgIGNvbnN0IGVyciA9IGV4ZWNFcnJvcihjb21tYW5kLCBjb21tYW5kQXJncywgcmVzdWx0KTtcbiAgICAgIGlmIChjb21tYW5kTm90Rm91bmRFcnJvcikgZXJyLmNhdXNlID0gY29tbWFuZE5vdEZvdW5kRXJyb3I7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pKCk7XG5cbiAgLy8gQXR0YWNoIHRoZSBwcm9taXNlIGludGVyZmFjZSBvbnRvIHRoZSBsaXZlIGNoaWxkIHNvIE9ORSBvYmplY3QgaXMgYm90aC4gVGhlXG4gIC8vIG1ldGhvZHMgYXJlIGJvdW5kIHRvIGBjb21wbGV0aW9uYCBzbyBgdGhpc2AgaXMgdGhlIHJlYWwgcHJvbWlzZTsgdGhlIGNoaWxkXG4gIC8vIG93bnMgbm8gY29uZmxpY3RpbmcgYHRoZW5gL2BjYXRjaGAvYGZpbmFsbHlgLCBzbyB0aGlzIGlzIHB1cmVseSBhZGRpdGl2ZS5cbiAgcmV0dXJuIGF0dGFjaFByb21pc2UocHJvYywgY29tcGxldGlvbik7XG59XG5cbi8qKlxuICogQXR0YWNoIGEgcHJvbWlzZSdzIGB0aGVuYCAvIGBjYXRjaGAgLyBgZmluYWxseWAgb250byBhIGxpdmUgb2JqZWN0LCByZXR1cm5pbmdcbiAqIHRoZSBzYW1lIG9iamVjdCB0eXBlZCBhcyBib3RoLiBVc2VkIGJ5IHtAbGluayBzcGF3bn0gdG8gbWFrZSBpdHMgYENoaWxkUHJvY2Vzc2BcbiAqIGF3YWl0YWJsZSB3aXRob3V0IHdyYXBwaW5nIGl0IC0gc28gY2FsbGVycyBrZWVwIHRoZSBsaXZlIGhhbmRsZSBBTkQgYGF3YWl0YCBpdC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoUHJvbWlzZTxUIGV4dGVuZHMgb2JqZWN0LCBSPih0YXJnZXQ6IFQsIHByb21pc2U6IFByb21pc2U8Uj4pOiBUICYgUHJvbWlzZTxSPiB7XG4gIGNvbnN0IGh5YnJpZCA9IHRhcmdldCBhcyBUICYgUHJvbWlzZTxSPjtcbiAgaHlicmlkLnRoZW4gPSBwcm9taXNlLnRoZW4uYmluZChwcm9taXNlKTtcbiAgaHlicmlkLmNhdGNoID0gcHJvbWlzZS5jYXRjaC5iaW5kKHByb21pc2UpO1xuICBoeWJyaWQuZmluYWxseSA9IHByb21pc2UuZmluYWxseS5iaW5kKHByb21pc2UpO1xuICByZXR1cm4gaHlicmlkO1xufVxuXG4vKipcbiAqIFNwYXduIGEgc3VicHJvY2VzcyBzeW5jaHJvbm91c2x5IGFuZCB3YWl0IGZvciBleGl0LlxuICpcbiAqIFVubGlrZSB7QGxpbmsgc3Bhd259LCBzdGRpbyBvcHRpb25zIGFyZSBsaW1pdGVkIHRvIGBcImluaGVyaXRcImAsIGBcInBpcGVcImAsXG4gKiBgXCJpZ25vcmVcImAsIGFuZCBgXCJjYXB0dXJlXCJgIOKAlCBubyBwZXItbGluZSBjYWxsYmFja3MuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBFeGVjdXRhYmxlIHRvIHJ1biAocmVzb2x2ZWQgb24gYFBBVEhgIHdoZW4gYHNoZWxsYCBpcyBzZXQgb24gb3B0aW9ucylcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB2ZXJiYXRpbSB0byB0aGUgZXhlY3V0YWJsZVxuICogQHBhcmFtIHNwYXduU3luYyAtIFNwYXduLCBzdGRpbywgYW5kIGNoZWNrIG9wdGlvbnNcbiAqIEByZXR1cm5zIEV4aXQgY29kZSwgY2FwdHVyZWQgbGluZSBhcnJheXMsIGFuZCB0cmltbWVkIGBzdGRvdXRgIC8gYHN0ZGVycmAgZ2V0dGVyc1xuICogQHRocm93cyBXaGVuIHNwYXduIGZhaWxzIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIGEgbWlzc2luZyBleGVjdXRhYmxlLCBvclxuICogYGNoZWNrYCBpcyB0cnVlIGFuZCBleGl0IGNvZGUgaXMgbm9uLXplcm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyguLi5hcmdzOiBTcGF3bkFyZ3M8U3luY0V4ZWNPcHRpb25zPik6IEV4ZWNSZXN1bHQge1xuICBjb25zdCB7IGNvbW1hbmQsIGNvbW1hbmRBcmdzLCBvcHRpb25zID0ge30gfSA9IHBhcnNlU3Bhd25BcmdzKGFyZ3MpO1xuICBjb25zdCB7IHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgY2hlY2ssIHRyaW0sIC4uLnNwYXduT3B0cyB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc3RkaW5Nb2RlOiBFeGVjU3RkaW8gPSBpc1N0ZGluUGF5bG9hZChzdGRpbikgPyBcInBpcGVcIiA6IChzdGRpbiA/PyBcImluaGVyaXRcIik7XG4gIGNvbnN0IGNhcHR1cmVTdGRvdXQgPSBzdGRvdXQgPT09IFwiY2FwdHVyZVwiO1xuICBjb25zdCBjYXB0dXJlU3RkZXJyID0gc3RkZXJyID09PSBcImNhcHR1cmVcIjtcbiAgY29uc3Qgc3Rkb3V0TW9kZSA9IHJlc29sdmVTeW5jU3RkaW8oc3Rkb3V0KTtcbiAgY29uc3Qgc3RkZXJyTW9kZSA9IHJlc29sdmVTeW5jU3RkaW8oc3RkZXJyKTtcblxuICBjb25zdCByZXN1bHQgPSBub2RlU3Bhd25TeW5jKGNvbW1hbmQsIGNvbW1hbmRBcmdzLCB7XG4gICAgLi4uc3Bhd25PcHRzLFxuICAgIGVuY29kaW5nOiBjYXB0dXJlU3Rkb3V0IHx8IGNhcHR1cmVTdGRlcnIgPyBcInV0ZjhcIiA6IHVuZGVmaW5lZCxcbiAgICBzdGRpbzogW3N0ZGluTW9kZSwgc3Rkb3V0TW9kZSwgc3RkZXJyTW9kZV0sXG4gICAgaW5wdXQ6IGlzU3RkaW5QYXlsb2FkKHN0ZGluKSA/IHN0ZGluIDogdW5kZWZpbmVkLFxuICB9KTtcblxuICBjb25zdCBjb21tYW5kTm90Rm91bmQgPSBpc0NvbW1hbmROb3RGb3VuZEVycm9yKHJlc3VsdC5lcnJvcik7XG4gIGNvbnN0IGV4aXRDb2RlID0gY29tbWFuZE5vdEZvdW5kID8gQ09NTUFORF9OT1RfRk9VTkRfRVhJVF9DT0RFIDogKHJlc3VsdC5zdGF0dXMgPz8gMSk7XG4gIGNvbnN0IHN0ZG91dFRleHQgPSBjYXB0dXJlU3Rkb3V0ID8gY2FwdHVyZWRUZXh0KHJlc3VsdC5zdGRvdXQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGRlcnJUZXh0ID0gY2FwdHVyZVN0ZGVyciA/IGNhcHR1cmVkVGV4dChyZXN1bHQuc3RkZXJyKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGNyZWF0ZVN5bmNFeGVjUmVzdWx0KGV4aXRDb2RlLCBzdGRvdXRUZXh0LCBzdGRlcnJUZXh0LCB0cmltKTtcblxuICBpZiAocmVzdWx0LmVycm9yICYmICghY29tbWFuZE5vdEZvdW5kIHx8IGNoZWNrKSkge1xuICAgIGNvbnN0IGVyciA9IGV4ZWNFcnJvcihjb21tYW5kLCBjb21tYW5kQXJncywgZXhlY1Jlc3VsdCk7XG4gICAgZXJyLmNhdXNlID0gcmVzdWx0LmVycm9yO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGlmIChjaGVjayAmJiBleGVjUmVzdWx0LmV4aXRDb2RlICE9PSAwKSB0aHJvdyBleGVjRXJyb3IoY29tbWFuZCwgY29tbWFuZEFyZ3MsIGV4ZWNSZXN1bHQpO1xuICByZXR1cm4gZXhlY1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBzaGVsbC1saWtlIGNvbW1hbmQgaW50byBhcmd2LlxuICpcbiAqIFN1cHBvcnRzOlxuICogICAtIHdoaXRlc3BhY2Ugc2VwYXJhdG9yc1xuICogICAtIHNpbmdsZSBhbmQgZG91YmxlIHF1b3Rlc1xuICogICAtIGJhY2tzbGFzaCBlc2NhcGluZ1xuICogICAtIGVzY2FwZWQgc3BhY2VzXG4gKiAgIC0gZW1wdHkgcXVvdGVkIHN0cmluZ3NcbiAqXG4gKiBJZiB0aGUgaW5wdXQgaXMgbWFsZm9ybWVkIChmb3IgZXhhbXBsZSwgYW4gdW50ZXJtaW5hdGVkIHF1b3RlKSxcbiAqIHJldHVybnMgdGhlIG9yaWdpbmFsIHN0cmluZyBhcyBhIHNpbmdsZSBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNobGV4KGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcblxuICBsZXQgY3VycmVudCA9IFwiXCI7XG4gIGxldCBxdW90ZTogXCInXCIgfCAnXCInIHwgdW5kZWZpbmVkO1xuICBsZXQgZXNjYXBlZCA9IGZhbHNlO1xuICBsZXQgcXVvdGVkID0gZmFsc2U7XG5cbiAgY29uc3QgcHVzaCA9ICgpID0+IHtcbiAgICBpZiAocXVvdGVkIHx8IGN1cnJlbnQubGVuZ3RoID4gMCkge1xuICAgICAgYXJncy5wdXNoKGN1cnJlbnQpO1xuICAgIH1cbiAgICBjdXJyZW50ID0gXCJcIjtcbiAgICBxdW90ZWQgPSBmYWxzZTtcbiAgfTtcblxuICBmb3IgKGNvbnN0IGNoIG9mIGNvbW1hbmQpIHtcbiAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gXCJcXFxcXCIpIHtcbiAgICAgIGVzY2FwZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHF1b3RlKSB7XG4gICAgICBpZiAoY2ggPT09IHF1b3RlKSB7XG4gICAgICAgIHF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgICBxdW90ZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudCArPSBjaDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaCA9PT0gXCInXCIgfHwgY2ggPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2g7XG4gICAgICBxdW90ZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKC9cXHMvLnRlc3QoY2gpKSB7XG4gICAgICBwdXNoKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjdXJyZW50ICs9IGNoO1xuICB9XG5cbiAgLy8gTWFsZm9ybWVkIGlucHV0OiB0cmVhdCBhcyBhIGxpdGVyYWwgY29tbWFuZC5cbiAgaWYgKHF1b3RlKSB7XG4gICAgcmV0dXJuIFtjb21tYW5kXTtcbiAgfVxuXG4gIC8vIFRyYWlsaW5nIGJhY2tzbGFzaCBpcyBsaXRlcmFsLlxuICBpZiAoZXNjYXBlZCkge1xuICAgIGN1cnJlbnQgKz0gXCJcXFxcXCI7XG4gIH1cblxuICBwdXNoKCk7XG5cbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID8gYXJncyA6IFtjb21tYW5kXTtcbn1cbiJdfQ==
1026
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRDRztBQUNILE9BQU8sRUFHTCxLQUFLLElBQUksU0FBUyxFQUNsQixTQUFTLElBQUksYUFBYSxHQUMzQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxLQUFLLFFBQVEsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV4RSw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFDO0FBRS9DLE1BQU0sNEJBQTRCLEdBQUcsS0FBSyxDQUFDO0FBQzNDLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0FBQ3RDLE1BQU0sNkJBQTZCLEdBQUcsR0FBRyxDQUFDO0FBQzFDLE1BQU0sd0JBQXdCLEdBQW1CLFNBQVMsQ0FBQztBQUMzRCxNQUFNLG1CQUFtQixHQUFtQixTQUFTLENBQUM7QUFDdEQsTUFBTSx3QkFBd0IsR0FBRyxDQUMvQixPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU87SUFDMUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQ1gsQ0FBQztBQUN0QyxNQUFNLCtCQUErQixHQUNuQyx1SUFBdUksQ0FB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QUFTO1FBQ1gsQ0FBQztRQUVELE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELCtDQUErQztJQUMvQyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLE9BQU8sSUFBSSxJQUFJLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksRUFBRSxDQUFDO0lBRVAsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUG9ydGFibGUgc3VicHJvY2VzcyBoZWxwZXIgYnVpbHQgb24gYGNoaWxkX3Byb2Nlc3Muc3Bhd25gIGFuZCBsaW5lIHN0cmVhbWluZy5cbiAqXG4gKiBFYWNoIHN0ZGlvIGZkIGRlZmF1bHRzIHRvIGBcImluaGVyaXRcImAuIHtAbGluayBzcGF3bn0gc3RyZWFtcyBvdXRwdXRcbiAqIGxpbmUtYnktbGluZSBpbnRvIHtAbGluayBFeGVjUmVzdWx0LnN0ZG91dExpbmVzfVxuICogLyB7QGxpbmsgRXhlY1Jlc3VsdC5zdGRlcnJMaW5lc307IGl0cyBgc3Rkb3V0YCAvIGBzdGRlcnJgIGdldHRlcnMgam9pbiB0aG9zZSBsaW5lcy5cbiAqIHtAbGluayBzcGF3blN5bmN9IGtlZXBzIHRoZSBjYXB0dXJlZCBzdHJpbmc7IGl0cyBgc3Rkb3V0YCAvIGBzdGRlcnJgIGdldHRlcnMgcmVhZFxuICogdGhhdCBzdHJpbmcgZGlyZWN0bHkgKGxpbmUgYXJyYXlzIHNwbGl0IGxhemlseSBvbiByZWFkKS5cbiAqIE9taXR0ZWQgYHRyaW1gIChkZWZhdWx0KSBhcHBsaWVzIGFkYXB0aXZlIG5vcm1hbGl6YXRpb246IHtAbGluayBzcGF3blN5bmN9IGRyb3BzXG4gKiBhdCBtb3N0IG9uZSB0cmFpbGluZyBlbXB0eSBsaW5lIC8gbmV3bGluZSBgc3Bhd25TeW5jYCBhZGRzOyB7QGxpbmsgc3Bhd259IGRvZXNcbiAqIG5vdCAocmVhZGxpbmUgbmV2ZXIgZW1pdHMgdGhhdCBleHRyYSBsaW5lKS4gYHRyaW06IHRydWVgIHN0cmlwcyBhbGwgbGVhZGluZy9cbiAqIHRyYWlsaW5nIHdoaXRlc3BhY2UgaW4gYm90aCBtb2RlczsgYHRyaW06IGZhbHNlYCBsZWF2ZXMgb3V0cHV0IHVuY2hhbmdlZC5cbiAqXG4gKiBUaGlzIG1vZHVsZSBvd25zIHN1YnByb2Nlc3MgZXhlY3V0aW9uIHBvbGljeSBmb3IgTm9kZSBhbmQgQnVuIHBhY2thZ2VzLiBSZXVzZVxuICogaXQgaW5zdGVhZCBvZiB3cmFwcGluZyBgY2hpbGRfcHJvY2Vzc2AgbG9jYWxseSB3aGVuIGNhbGxlcnMgbmVlZCBjb25zaXN0ZW50XG4gKiBhcmd2IHBhcnNpbmcsIHN0ZGlvIGNhcHR1cmUsIGxpbmUgY2FsbGJhY2tzLCBjYW5jZWxsYXRpb24sIGFuZCBleGl0IGNoZWNraW5nLlxuICpcbiAqIEBleGFtcGxlIENhcHR1cmUgY29tbWFuZCBvdXRwdXRcbiAqIGBgYHRzXG4gKiBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgZXhlYyhcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCItLXNob3ctdG9wbGV2ZWxcIl0sIHtcbiAqICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAqICAgc3RkZXJyOiBcImlnbm9yZVwiLFxuICogICBzdGRpbjogXCJpZ25vcmVcIixcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGUgU3RyZWFtIGFuZCBjYXB0dXJlIHRvZ2V0aGVyXG4gKiBgYGB0c1xuICogYXdhaXQgZXhlYyhcInBucG1cIiwgW1wiaW5zdGFsbFwiXSwge1xuICogICBzdGRvdXQ6IFsobGluZSkgPT4gY29uc29sZS5sb2cobGluZSksIFwiY2FwdHVyZVwiXSxcbiAqICAgY2hlY2s6IHRydWUsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFN5bmNocm9ub3VzIGNhcHR1cmUgKG5vIGxpbmUgY2FsbGJhY2tzKVxuICogYGBgdHNcbiAqIGNvbnN0IHsgc3Rkb3V0IH0gPSBleGVjU3luYyhcImdpdFwiLCBbXCJyZXYtcGFyc2VcIiwgXCItLXNob3ctdG9wbGV2ZWxcIl0sIHtcbiAqICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAqICAgc3RkZXJyOiBcImlnbm9yZVwiLFxuICogICBzdGRpbjogXCJpZ25vcmVcIixcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQge1xuICB0eXBlIENoaWxkUHJvY2VzcyxcbiAgdHlwZSBTcGF3bk9wdGlvbnMsXG4gIHNwYXduIGFzIG5vZGVTcGF3bixcbiAgc3Bhd25TeW5jIGFzIG5vZGVTcGF3blN5bmMsXG59IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRkaXIsIHJlYWRGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCAqIGFzIHJlYWRsaW5lIGZyb20gXCJub2RlOnJlYWRsaW5lXCI7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gXCJub2RlOnN0cmVhbVwiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCJub2RlOnN0cmVhbS9jb25zdW1lcnNcIjtcbmltcG9ydCB7IGZpbmlzaGVkIH0gZnJvbSBcIm5vZGU6c3RyZWFtL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBmdW5jdGlvblV0aWxzLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG4vKiogU2hlbGwtY29tcGF0aWJsZSBleGl0IGNvZGUgcmV0dXJuZWQgd2hlbiBhbiBleGVjdXRhYmxlIGNhbm5vdCBiZSBmb3VuZC4gKi9cbmV4cG9ydCBjb25zdCBDT01NQU5EX05PVF9GT1VORF9FWElUX0NPREUgPSAxMjc7XG5cbmNvbnN0IERFRkFVTFRfVEVSTUlOQVRFX1RJTUVPVVRfTVMgPSA4XzAwMDtcbmNvbnN0IERFRkFVTFRfS0lMTF9USU1FT1VUX01TID0gNF8wMDA7XG5jb25zdCBERUZBVUxUX0tJTExfUE9MTF9JTlRFUlZBTF9NUyA9IDEwMDtcbmNvbnN0IERFRkFVTFRfVEVSTUlOQVRFX1NJR05BTDogTm9kZUpTLlNpZ25hbHMgPSBcIlNJR1RFUk1cIjtcbmNvbnN0IERFRkFVTFRfS0lMTF9TSUdOQUw6IE5vZGVKUy5TaWduYWxzID0gXCJTSUdLSUxMXCI7XG5jb25zdCBGT1JXQVJERURfUEFSRU5UX1NJR05BTFMgPSAoXG4gIHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIlxuICAgID8gW1wiU0lHSU5UXCIsIFwiU0lHVEVSTVwiLCBcIlNJR0JSRUFLXCJdXG4gICAgOiBbXCJTSUdIVVBcIiwgXCJTSUdJTlRcIiwgXCJTSUdURVJNXCIsIFwiU0lHUVVJVFwiXVxuKSBzYXRpc2ZpZXMgcmVhZG9ubHkgTm9kZUpTLlNpZ25hbHNbXTtcbmNvbnN0IFdJTkRPV1NfUFJPQ0VTU19TTkFQU0hPVF9TQ1JJUFQgPVxuICBcIkdldC1DaW1JbnN0YW5jZSBXaW4zMl9Qcm9jZXNzIHwgRm9yRWFjaC1PYmplY3QgeyAnezB9IHsxfSB7Mn0nIC1mICRfLlByb2Nlc3NJZCwgJF8uUGFyZW50UHJvY2Vzc0lkLCAkXy5DcmVhdGlvbkRhdGUuVG9GaWxlVGltZVV0YygpIH1cIjtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJjb3JlOmV4ZWNcIik7XG5cbi8qKiBTdGRpbyBtb2RlIGZvciBhIHN1YnByb2Nlc3MgZmQuICovXG5leHBvcnQgdHlwZSBFeGVjU3RkaW8gPSBcImluaGVyaXRcIiB8IFwicGlwZVwiIHwgXCJpZ25vcmVcIjtcblxuLyoqIEludm9rZWQgb25jZSBwZXIgb3V0cHV0IGxpbmUgd2hlbiBhIGZkIGlzIHBpcGVkLiAqL1xuZXhwb3J0IHR5cGUgTGluZUhhbmRsZXIgPSAobGluZTogc3RyaW5nKSA9PiB2b2lkO1xuXG4vKiogU3RyZWFtIGxpbmVzIHRvIGEgaGFuZGxlciB3aXRoIG9wdGlvbmFsIHJlc3VsdCBjYXB0dXJlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5lT3V0cHV0T3B0aW9ucyB7XG4gIC8qKiBJbnZva2VkIG9uY2UgcGVyIG91dHB1dCBsaW5lLiAqL1xuICBvbkxpbmU6IExpbmVIYW5kbGVyO1xuICAvKiogUmV0YWluIGxpbmVzIGluIHRoZSBjb21wbGV0ZWQgcmVzdWx0LiBEZWZhdWx0cyB0byBgdHJ1ZWAuICovXG4gIGNhcHR1cmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFN0ZGlvIGNvbmZpZyBmb3Igb25lIGZkLlxuICpcbiAqIC0gYFwiaW5oZXJpdFwiYCAvIGBcInBpcGVcImAgLyBgXCJpZ25vcmVcImAg4oCUIHBhc3MgdGhyb3VnaCB0byBgc3Bhd25gXG4gKiAtIGBcImNhcHR1cmVcImAg4oCUIHBpcGUgdGhlIGZkIGFuZCBhcHBlbmQgZWFjaCBsaW5lIHRvIHRoZSByZXN1bHRcbiAqIC0ge0BsaW5rIExpbmVIYW5kbGVyfSDigJQgcGlwZSBhbmQgaW52b2tlIHRoZSBoYW5kbGVyIHBlciBsaW5lIChsaW5lcyBhcmUgc3RpbGwgY2FwdHVyZWQpXG4gKiAtIHtAbGluayBMaW5lT3V0cHV0T3B0aW9uc30g4oCUIHBpcGUgYW5kIGludm9rZSB0aGUgaGFuZGxlciwgd2l0aCBvcHRpb25hbCBjYXB0dXJlXG4gKiAtIGAoTGluZUhhbmRsZXIgfCBcImNhcHR1cmVcIilbXWAg4oCUIHBpcGU7IGBcImNhcHR1cmVcImAgaXMgYSBuby1vcCBtYXJrZXIsIGhhbmRsZXJzIHJ1biBwZXIgbGluZVxuICovXG5leHBvcnQgdHlwZSBTdGRpb09wdGlvbiA9XG4gIEV4ZWNTdGRpbyB8IExpbmVIYW5kbGVyIHwgTGluZU91dHB1dE9wdGlvbnMgfCBcImNhcHR1cmVcIiB8IChMaW5lSGFuZGxlciB8IFwiY2FwdHVyZVwiKVtdO1xuXG4vKiogT3V0Y29tZSBvZiB7QGxpbmsgc3Bhd259IC8ge0BsaW5rIHNwYXduU3luY306IGV4aXQgY29kZSwgY2FwdHVyZWQgb3V0cHV0LCBhbmQgbGluZSB2aWV3cy4gKi9cbmV4cG9ydCB0eXBlIEV4ZWNSZXN1bHQgPSB7XG4gIGV4aXRDb2RlOiBudW1iZXI7XG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRvdXQgbGluZXMuIEZvciB7QGxpbmsgc3Bhd259IHRoZXNlIGFyZSBidWlsdCB3aGlsZSB0aGUgcHJvY2VzcyBydW5zO1xuICAgKiBmb3Ige0BsaW5rIHNwYXduU3luY30gdGhleSBhcmUgc3BsaXQgZnJvbSB0aGUgY2FwdHVyZWQgc3RyaW5nIG9uIGZpcnN0IHJlYWQuXG4gICAqL1xuICByZWFkb25seSBzdGRvdXRMaW5lczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRlcnIgbGluZXMuIEZvciB7QGxpbmsgc3Bhd259IHRoZXNlIGFyZSBidWlsdCB3aGlsZSB0aGUgcHJvY2VzcyBydW5zO1xuICAgKiBmb3Ige0BsaW5rIHNwYXduU3luY30gdGhleSBhcmUgc3BsaXQgZnJvbSB0aGUgY2FwdHVyZWQgc3RyaW5nIG9uIGZpcnN0IHJlYWQuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnJMaW5lczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRvdXQgdGV4dC4ge0BsaW5rIHNwYXduU3luY30gcmVhZHMgdGhlIGNhcHR1cmVkIHN0cmluZztcbiAgICoge0BsaW5rIHNwYXdufSBqb2lucyB7QGxpbmsgc3Rkb3V0TGluZXN9LiBTZWUgYHRyaW1gIGZvciBub3JtYWxpemF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3Rkb3V0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDYXB0dXJlZCBzdGRlcnIgdGV4dC4ge0BsaW5rIHNwYXduU3luY30gcmVhZHMgdGhlIGNhcHR1cmVkIHN0cmluZztcbiAgICoge0BsaW5rIHNwYXdufSBqb2lucyB7QGxpbmsgc3RkZXJyTGluZXN9LiBTZWUgYHRyaW1gIGZvciBub3JtYWxpemF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFdoYXQge0BsaW5rIHNwYXdufSByZXR1cm5zOiB0aGUgTElWRSBgQ2hpbGRQcm9jZXNzYCBoYW5kbGUgdGhhdCBpcyBBTFNPIGFcbiAqIGBQcm9taXNlPEV4ZWNSZXN1bHQ+YCByZXNvbHZpbmcgb24gZXhpdC5cbiAqXG4gKiBUaGlzIGlzIGFkZGl0aXZlIC0gdGhlIG9iamVjdCBzdGlsbCBzYXRpc2ZpZXMgYFByb21pc2U8RXhlY1Jlc3VsdD5gLCBzbyBldmVyeVxuICogZXhpc3RpbmcgYGF3YWl0IHNwYXduKC4uLilgIC8gYHNwYXduKC4uLikudGhlbiguLi4pYCBjYWxsZXIgaXMgdW5jaGFuZ2VkLiBXaGF0XG4gKiBpcyBuZXcgaXMgdGhhdCB0aGUgc2FtZSB2YWx1ZSBpcyB0aGUgbGl2ZSBjaGlsZDogY2FsbGVycyB0aGF0IHdhbnQgdG8gc3VwZXJ2aXNlXG4gKiBpdCBjYW4gcmVhZCBgLnBpZGAsIGNhbGwgYC5zaHV0ZG93bigpYCwgYW5kIGxpc3RlbiBmb3IgYGV4aXRgIHdpdGhvdXQgYVxuICogc2Vjb25kIHNwYXduLlxuICpcbiAqIEBleGFtcGxlIEF3YWl0IGl0ICh1bmNoYW5nZWQpXG4gKiBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgc3Bhd24oXCJnaXRcIiwgW1wicmV2LXBhcnNlXCIsIFwiSEVBRFwiXSwgeyBzdGRvdXQ6IFwiY2FwdHVyZVwiIH0pO1xuICpcbiAqIEBleGFtcGxlIFN1cGVydmlzZSBpdFxuICogY29uc3QgcHJvYyA9IHNwYXduKFwiYnVuXCIsIFtcInNyYy9zZXJ2ZXIudHNcIl0pO1xuICogY29uc3Qgc2h1dGRvd24gPSAoKSA9PiBwcm9jLnNodXRkb3duKCk7XG4gKiBjb25zdCB7IGV4aXRDb2RlIH0gPSBhd2FpdCBwcm9jO1xuICovXG5leHBvcnQgdHlwZSBDaGlsZFByb2Nlc3NSZXN1bHQgPSBDaGlsZFByb2Nlc3MgJlxuICBQcm9taXNlPEV4ZWNSZXN1bHQ+ICYge1xuICAgIC8qKiBTdG9wIHRoZSBjaGlsZCBwcm9jZXNzIHRyZWUgb25jZSB1c2luZyB0aGUgY29uZmlndXJlZCB0ZXJtaW5hdGlvbiBwb2xpY3kuICovXG4gICAgc2h1dGRvd24ob3B0aW9ucz86IENoaWxkUHJvY2Vzc1Rlcm1pbmF0aW9uT3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG4gIH07XG5cbi8qKiBQcm9jZXNzLXRyZWUgdGVybWluYXRpb24gcG9saWN5IHVzZWQgYnkge0BsaW5rIENoaWxkUHJvY2Vzc1Jlc3VsdC5zaHV0ZG93bn0uICovXG5leHBvcnQgaW50ZXJmYWNlIENoaWxkUHJvY2Vzc1Rlcm1pbmF0aW9uT3B0aW9ucyB7XG4gIC8qKiBUaW1lIHRvIHdhaXQgZm9yIG9wZXJhdGluZy1zeXN0ZW0gdGVybWluYXRpb24uIERlZmF1bHRzIHRvIDggc2Vjb25kcy4gKi9cbiAgdGVybWluYXRlVGltZW91dD86IG51bWJlcjtcbiAgLyoqIFRpbWUgdG8gcG9sbCBhbmQgZm9yY2Uta2lsbCByZW1haW5pbmcgZGVzY2VuZGFudHMuIERlZmF1bHRzIHRvIDQgc2Vjb25kcy4gKi9cbiAga2lsbFRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgc3Bhd259LiBFeHRlbmRzIGBTcGF3bk9wdGlvbnNgIGV4Y2VwdCBgc3RkaW9gLCB3aGljaCBpcyBkcml2ZW4gYnkgYHN0ZGluYCAvIGBzdGRvdXRgIC8gYHN0ZGVycmAuICovXG5leHBvcnQgdHlwZSBFeGVjT3B0aW9ucyA9IE9taXQ8U3Bhd25PcHRpb25zLCBcInN0ZGlvXCIgfCBcImtpbGxTaWduYWxcIj4gJlxuICBDaGlsZFByb2Nlc3NUZXJtaW5hdGlvbk9wdGlvbnMgJiB7XG4gICAgLyoqIGBcImluaGVyaXRcImAgYnkgZGVmYXVsdDsgYFwicGlwZVwiYCAvIGBcImlnbm9yZVwiYCBzZWxlY3QgbW9kZXMsIGFueSBvdGhlciBzdHJpbmcgaXMgaW5wdXQuICovXG4gICAgc3RkaW4/OiBFeGVjU3RkaW8gfCBzdHJpbmc7XG4gICAgc3Rkb3V0PzogU3RkaW9PcHRpb247XG4gICAgc3RkZXJyPzogU3RkaW9PcHRpb247XG4gICAgLyoqXG4gICAgICogRm9yd2FyZCBwYXJlbnQgdGVybWluYXRpb24gc2lnbmFscyB0byB0aGlzIGNoaWxkLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gc2tpcCB0aGUgc2hhcmVkIHNpZ25hbCB0cmFwOyBvbiBQT1NJWCwgdGhlIGNoaWxkIGlzIGFsc29cbiAgICAgKiBkZXRhY2hlZCBieSBkZWZhdWx0IHNvIHRlcm1pbmFsIHByb2Nlc3MtZ3JvdXAgc2lnbmFscyBhcmUgbm90IGluaGVyaXRlZC5cbiAgICAgKi9cbiAgICBmb3J3YXJkVGVybWluYXRpb25TaWduYWxzPzogYm9vbGVhbjtcbiAgICAvKiogVGhyb3cgd2hlbiB0aGUgcHJvY2VzcyBleGl0cyB3aXRoIGEgbm9uLXplcm8gY29kZS4gKi9cbiAgICBjaGVjaz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogT21pdHRlZCDigJQgYWRhcHRpdmUgdHJpbSAoe0BsaW5rIHNwYXduU3luY30gZHJvcHMgb25lIHNwYXduIHRyYWlsaW5nIG5ld2xpbmUsXG4gICAgICoge0BsaW5rIHNwYXdufSBkb2VzIG5vdCk7IGB0cnVlYCDigJQgc3RyaXAgYWxsIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZTtcbiAgICAgKiBgZmFsc2VgIOKAlCBsZWF2ZSBjYXB0dXJlZCBvdXRwdXQgdW5jaGFuZ2VkLlxuICAgICAqL1xuICAgIHRyaW0/OiBib29sZWFuO1xuICB9O1xuXG4vKiogU3RkaW8gbW9kZSBmb3Ige0BsaW5rIHNwYXduU3luY30gKG5vIHBlci1saW5lIGNhbGxiYWNrcykuICovXG5leHBvcnQgdHlwZSBTeW5jRXhlY1N0ZGlvID0gRXhlY1N0ZGlvIHwgXCJjYXB0dXJlXCI7XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgc3Bhd25TeW5jfS4gU2FtZSBzaGFwZSBhcyB7QGxpbmsgRXhlY09wdGlvbnN9IGJ1dCB3aXRob3V0IGxpbmUtaGFuZGxlciBzdGRpby4gKi9cbmV4cG9ydCB0eXBlIFN5bmNFeGVjT3B0aW9ucyA9IE9taXQ8U3Bhd25PcHRpb25zLCBcInN0ZGlvXCIgfCBcImtpbGxTaWduYWxcIj4gJiB7XG4gIC8qKiBgXCJpbmhlcml0XCJgIGJ5IGRlZmF1bHQ7IGBcInBpcGVcImAgLyBgXCJpZ25vcmVcImAgc2VsZWN0IG1vZGVzLCBhbnkgb3RoZXIgc3RyaW5nIGlzIGlucHV0LiAqL1xuICBzdGRpbj86IEV4ZWNTdGRpbyB8IHN0cmluZztcbiAgc3Rkb3V0PzogU3luY0V4ZWNTdGRpbztcbiAgc3RkZXJyPzogU3luY0V4ZWNTdGRpbztcbiAgLyoqIFRocm93IHdoZW4gdGhlIHByb2Nlc3MgZXhpdHMgd2l0aCBhIG5vbi16ZXJvIGNvZGUuICovXG4gIGNoZWNrPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE9taXR0ZWQg4oCUIGFkYXB0aXZlIHRyaW0gKHtAbGluayBzcGF3blN5bmN9IGRyb3BzIG9uZSBzcGF3biB0cmFpbGluZyBuZXdsaW5lLFxuICAgKiB7QGxpbmsgc3Bhd259IGRvZXMgbm90KTsgYHRydWVgIOKAlCBzdHJpcCBhbGwgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlO1xuICAgKiBgZmFsc2VgIOKAlCBsZWF2ZSBjYXB0dXJlZCBvdXRwdXQgdW5jaGFuZ2VkLlxuICAgKi9cbiAgdHJpbT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXduIHN0ZGlvIG1vZGUgcGx1cyBhbiBvcHRpb25hbCBwZXItbGluZSBjYWxsYmFjayBhZnRlciB7QGxpbmsgcmVzb2x2ZVN0ZGlvfVxuICogbWFwcyBhIHtAbGluayBTdGRpb09wdGlvbn0gaW50byBzb21ldGhpbmcgYHNwYXduYCBjYW4gY29uc3VtZS5cbiAqL1xudHlwZSBSZXNvbHZlZFN0ZGlvID0ge1xuICAvKiogVmFsdWUgcGFzc2VkIHRvIGBzcGF3bmAncyBgc3RkaW9gIHR1cGxlIGZvciB0aGlzIGZkLiAqL1xuICBtb2RlOiBFeGVjU3RkaW87XG4gIC8qKiBXaGVuIHNldCwgZWFjaCBvdXRwdXQgbGluZSBpcyBhcHBlbmRlZCB0byB0aGUgY2FwdHVyZSBidWZmZXIgYW5kIGZvcndhcmRlZCBoZXJlLiAqL1xuICBvbkxpbmU/OiBMaW5lSGFuZGxlcjtcbn07XG5cbi8qKiBTdXBwb3J0ZWQgY29tbWFuZCwgYXJndW1lbnQtYXJyYXksIHZhcmlhZGljLWFyZ3VtZW50LCBhbmQgb3B0aW9ucyBjYWxsIGZvcm1zLiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25BcmdzPFQgZXh0ZW5kcyBTcGF3bk9wdGlvbnM+ID1cbiAgfCBbY29tbWFuZDogc3RyaW5nLCAuLi5hcmdzOiBzdHJpbmdbXV1cbiAgfCBbY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXV1cbiAgfCBbY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSwgb3B0aW9uczogVF1cbiAgfCBbY29tbWFuZDogc3RyaW5nLCAuLi5hcmdzQW5kT3B0aW9uczogWy4uLnN0cmluZ1tdLCBUXV07XG5cbmludGVyZmFjZSBQYXJzZWRTcGF3bkFyZ3M8VCBleHRlbmRzIFNwYXduT3B0aW9ucz4ge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIGNvbW1hbmRBcmdzOiBzdHJpbmdbXTtcbiAgb3B0aW9ucz86IFQ7XG59XG5cbi8qKiBPbmUgb3BlcmF0aW5nLXN5c3RlbSBwcm9jZXNzIGNhcHR1cmVkIGJlZm9yZSB0cmVlIHNodXRkb3duIGJlZ2lucy4gKi9cbmludGVyZmFjZSBQcm9jZXNzU25hcHNob3RFbnRyeSB7XG4gIHBpZDogbnVtYmVyO1xuICBwYXJlbnRQaWQ6IG51bWJlcjtcbiAgaWRlbnRpdHk6IHN0cmluZztcbn1cblxuLyoqIEN1cnJlbnQgcmV0YWluZWQgcHJvY2Vzc2VzIHBsdXMgZGVzY2VuZGFudHMgZmlyc3Qgb2JzZXJ2ZWQgYnkgb25lIHJlZnJlc2guICovXG5pbnRlcmZhY2UgUmVmcmVzaGVkUHJvY2Vzc1RyZWUge1xuICBwcm9jZXNzZXM6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W107XG4gIGRpc2NvdmVyZWQ6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W107XG59XG5cbmludGVyZmFjZSBQYXJlbnRTaWduYWxGb3J3YXJkZXJTdGF0ZSB7XG4gIHJlYWRvbmx5IGNoaWxkcmVuOiBNYXA8bnVtYmVyLCBDaGlsZFByb2Nlc3NSZXN1bHQ+O1xuICByZWFkb25seSBoYW5kbGVyczogTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPjtcbiAgcmVhZG9ubHkgZm9yd2FyZGluZ1NpZ25hbHM6IFNldDxOb2RlSlMuU2lnbmFscz47XG4gIHJlYWRvbmx5IGxpc3RlbmVyczogU2V0PChzaWduYWw6IE5vZGVKUy5TaWduYWxzKSA9PiB2b2lkPjtcbn1cblxuaW50ZXJmYWNlIFNpZ25hbEV4aXRFbWl0dGVyIHtcbiAgY291bnQ/OiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgUHJvY2Vzc1dpdGhTaWduYWxFeGl0RW1pdHRlciBleHRlbmRzIE5vZGVKUy5Qcm9jZXNzIHtcbiAgX19zaWduYWxfZXhpdF9lbWl0dGVyX18/OiBTaWduYWxFeGl0RW1pdHRlcjtcbn1cblxudHlwZSBQYXJlbnRTaWduYWxTaHV0ZG93biA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG5jb25zdCBwYXJlbnRTaWduYWxGb3J3YXJkZXJTdGF0ZSA9IGZ1bmN0aW9uVXRpbHMubWVtb2l6ZSgoKTogUGFyZW50U2lnbmFsRm9yd2FyZGVyU3RhdGUgPT4gKHtcbiAgY2hpbGRyZW46IG5ldyBNYXAoKSxcbiAgaGFuZGxlcnM6IG5ldyBNYXAoKSxcbiAgZm9yd2FyZGluZ1NpZ25hbHM6IG5ldyBTZXQoKSxcbiAgbGlzdGVuZXJzOiBuZXcgU2V0KCksXG59KSk7XG5jb25zdCBwYXJlbnRTaWduYWxTaHV0ZG93bnMgPSBuZXcgV2Vha01hcDxDaGlsZFByb2Nlc3NSZXN1bHQsIFBhcmVudFNpZ25hbFNodXRkb3duPigpO1xuXG5mdW5jdGlvbiByZWdpc3RlclBhcmVudFNpZ25hbEZvcndhcmRpbmcoY2hpbGQ6IENoaWxkUHJvY2Vzc1Jlc3VsdCk6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBpZCA9IGNoaWxkLnBpZDtcbiAgaWYgKHBpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0ZSA9IHBhcmVudFNpZ25hbEZvcndhcmRlclN0YXRlKCk7XG4gIGluc3RhbGxQYXJlbnRTaWduYWxIYW5kbGVycyhzdGF0ZSk7XG4gIHN0YXRlLmNoaWxkcmVuLnNldChwaWQsIGNoaWxkKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoc3RhdGUuY2hpbGRyZW4uZ2V0KHBpZCkgPT09IGNoaWxkKSBzdGF0ZS5jaGlsZHJlbi5kZWxldGUocGlkKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaW5zdGFsbFBhcmVudFNpZ25hbEhhbmRsZXJzKHN0YXRlOiBQYXJlbnRTaWduYWxGb3J3YXJkZXJTdGF0ZSk6IHZvaWQge1xuICBpZiAoc3RhdGUuaGFuZGxlcnMuc2l6ZSA+IDApIHJldHVybjtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgRk9SV0FSREVEX1BBUkVOVF9TSUdOQUxTKSB7XG4gICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvcndhcmRQYXJlbnRTaWduYWwoc3RhdGUsIHNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXBvcnRQYXJlbnRTaWduYWxFcnJvcihzaWduYWwsIHVuZGVmaW5lZCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgc3RhdGUuaGFuZGxlcnMuc2V0KHNpZ25hbCwgaGFuZGxlcik7XG4gICAgcHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIoc2lnbmFsLCBoYW5kbGVyKTtcbiAgfVxufVxuXG4vKipcbiAqIFN1YnNjcmliZSB0byB0aGUgcHJvY2Vzcy1nbG9iYWwgcGFyZW50LXRlcm1pbmF0aW9uIHRyYXAgdXNlZCBieSB7QGxpbmsgc3Bhd259LlxuICogRG9lcyBub3QgYWRkIGEgcGVyLXN1YnNjcmliZXIgYHByb2Nlc3NgIGxpc3RlbmVyOyBleHRyYSBsaXN0ZW5lcnMgd291bGQgY2hhbmdlXG4gKiB3aGV0aGVyIHRoZSB0cmFwIHJlLXJhaXNlcyB0aGUgc2lnbmFsIGFmdGVyIGNoaWxkcmVuIGV4aXQuXG4gKlxuICogQHBhcmFtIGxpc3RlbmVyIC0gQ2FsbGVkIHN5bmNocm9ub3VzbHkgd2hlbiBhIGZvcndhcmRlZCBwYXJlbnQgc2lnbmFsIGFycml2ZXNcbiAqIEByZXR1cm5zIFVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvblBhcmVudFRlcm1pbmF0aW9uU2lnbmFsKFxuICBsaXN0ZW5lcjogKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpID0+IHZvaWQsXG4pOiAoKSA9PiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSBwYXJlbnRTaWduYWxGb3J3YXJkZXJTdGF0ZSgpO1xuICBpbnN0YWxsUGFyZW50U2lnbmFsSGFuZGxlcnMoc3RhdGUpO1xuICBzdGF0ZS5saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBzdGF0ZS5saXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFBhcmVudFNpZ25hbChzdGF0ZTogUGFyZW50U2lnbmFsRm9yd2FyZGVyU3RhdGUsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkIHtcbiAgaWYgKHN0YXRlLmZvcndhcmRpbmdTaWduYWxzLmhhcyhzaWduYWwpKSByZXR1cm47XG4gIGZvciAoY29uc3QgbGlzdGVuZXIgb2Ygc3RhdGUubGlzdGVuZXJzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxpc3RlbmVyKHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlcG9ydFBhcmVudFNpZ25hbEVycm9yKHNpZ25hbCwgdW5kZWZpbmVkLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIGNvbnN0IHNodXRkb3duczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGZvciAoY29uc3QgW3BpZCwgY2hpbGRdIG9mIHN0YXRlLmNoaWxkcmVuKSB7XG4gICAgaWYgKGNoaWxkLmV4aXRDb2RlICE9PSBudWxsIHx8IGNoaWxkLnNpZ25hbENvZGUgIT09IG51bGwpIHtcbiAgICAgIHN0YXRlLmNoaWxkcmVuLmRlbGV0ZShwaWQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHNodXRkb3ducy5wdXNoKHNodXRkb3duQ2hpbGRGb3JQYXJlbnRTaWduYWwoY2hpbGQsIHBpZCwgc2lnbmFsKSk7XG4gIH1cblxuICBjb25zdCBoYW5kbGVyID0gc3RhdGUuaGFuZGxlcnMuZ2V0KHNpZ25hbCk7XG4gIGNvbnN0IGNvbXBsZXRlZCA9IFByb21pc2UuYWxsKHNodXRkb3ducykuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgcmVwb3J0UGFyZW50U2lnbmFsRXJyb3Ioc2lnbmFsLCB1bmRlZmluZWQsIGVycm9yKTtcbiAgfSk7XG4gIGlmICghaGFuZGxlciB8fCBwcm9jZXNzLmxpc3RlbmVyQ291bnQoc2lnbmFsKSAhPT0gcGFzc2l2ZVNpZ25hbExpc3RlbmVyQ291bnQoKSArIDEpIHtcbiAgICB2b2lkIGNvbXBsZXRlZDtcbiAgICByZXR1cm47XG4gIH1cbiAgc3RhdGUuZm9yd2FyZGluZ1NpZ25hbHMuYWRkKHNpZ25hbCk7XG4gIHZvaWQgY29tcGxldGVkXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcHJvY2Vzcy5vZmYoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgIHN0YXRlLmhhbmRsZXJzLmRlbGV0ZShzaWduYWwpO1xuICAgICAgc3RhdGUuZm9yd2FyZGluZ1NpZ25hbHMuZGVsZXRlKHNpZ25hbCk7XG4gICAgICB0cnkge1xuICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXBvcnRQYXJlbnRTaWduYWxFcnJvcihzaWduYWwsIHByb2Nlc3MucGlkLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICByZXBvcnRQYXJlbnRTaWduYWxFcnJvcihzaWduYWwsIHVuZGVmaW5lZCwgZXJyb3IpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBzaHV0ZG93bkNoaWxkRm9yUGFyZW50U2lnbmFsKFxuICBjaGlsZDogQ2hpbGRQcm9jZXNzUmVzdWx0LFxuICBwaWQ6IG51bWJlcixcbiAgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyxcbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHNodXRkb3duID0gcGFyZW50U2lnbmFsU2h1dGRvd25zLmdldChjaGlsZCk7XG4gICAgcmV0dXJuIChzaHV0ZG93biA/IHNodXRkb3duKHNpZ25hbCkgOiBjaGlsZC5zaHV0ZG93bigpKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHJlcG9ydFBhcmVudFNpZ25hbEVycm9yKHNpZ25hbCwgcGlkLCBlcnJvcik7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0UGFyZW50U2lnbmFsRXJyb3Ioc2lnbmFsLCBwaWQsIGVycm9yKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwb3J0UGFyZW50U2lnbmFsRXJyb3IoXG4gIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMsXG4gIHBpZDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBlcnJvcjogdW5rbm93bixcbik6IHZvaWQge1xuICBpZiAoaXNFeHBlY3RlZFByb2Nlc3NTaHV0ZG93bkVycm9yKGVycm9yKSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGxvZ2dlci53YXJuKFwiZmFpbGVkIHRvIGZvcndhcmQgcGFyZW50IHNpZ25hbFwiLCB7XG4gICAgICBzaWduYWwsXG4gICAgICAuLi4ocGlkID09PSB1bmRlZmluZWQgPyB7fSA6IHsgcGlkIH0pLFxuICAgICAgZXJyb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFNpZ25hbCBmb3J3YXJkaW5nIG11c3QgbmV2ZXIgcHJldmVudCBvdGhlciBwcm9jZXNzIGxpc3RlbmVycyBmcm9tIHJ1bm5pbmcuXG4gIH1cbn1cblxuZnVuY3Rpb24gaXNFeHBlY3RlZFByb2Nlc3NTaHV0ZG93bkVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChpc01pc3NpbmdQcm9jZXNzRXJyb3IoZXJyb3IpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IgJiYgZXJyb3IuZXJyb3JzLmV2ZXJ5KGlzRXhwZWN0ZWRQcm9jZXNzU2h1dGRvd25FcnJvcik7XG59XG5cbmZ1bmN0aW9uIHBhc3NpdmVTaWduYWxMaXN0ZW5lckNvdW50KCk6IG51bWJlciB7XG4gIGNvbnN0IGxlZ2FjeUVtaXR0ZXIgPSAocHJvY2VzcyBhcyBQcm9jZXNzV2l0aFNpZ25hbEV4aXRFbWl0dGVyKS5fX3NpZ25hbF9leGl0X2VtaXR0ZXJfXztcbiAgY29uc3QgbW9kZXJuRW1pdHRlciA9IChnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgIFN5bWJvbC5mb3IoXCJzaWduYWwtZXhpdCBlbWl0dGVyXCIpXG4gIF0gYXMgU2lnbmFsRXhpdEVtaXR0ZXIgfCB1bmRlZmluZWQ7XG4gIHJldHVybiBzaWduYWxFeGl0RW1pdHRlckNvdW50KGxlZ2FjeUVtaXR0ZXIpICsgc2lnbmFsRXhpdEVtaXR0ZXJDb3VudChtb2Rlcm5FbWl0dGVyKTtcbn1cblxuZnVuY3Rpb24gc2lnbmFsRXhpdEVtaXR0ZXJDb3VudChlbWl0dGVyOiBTaWduYWxFeGl0RW1pdHRlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIHJldHVybiB0eXBlb2YgZW1pdHRlcj8uY291bnQgPT09IFwibnVtYmVyXCIgPyBlbWl0dGVyLmNvdW50IDogMDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURldGFjaGVkKFxuICBkZXRhY2hlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgZm9yd2FyZFRlcm1pbmF0aW9uU2lnbmFsczogYm9vbGVhbixcbik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBpZiAoZGV0YWNoZWQgIT09IHVuZGVmaW5lZCB8fCBmb3J3YXJkVGVybWluYXRpb25TaWduYWxzIHx8IHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIikge1xuICAgIHJldHVybiBkZXRhY2hlZDtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTcGF3bkFyZ3M8VCBleHRlbmRzIFNwYXduT3B0aW9ucz4oaW5wdXQ6IFNwYXduQXJnczxUPik6IFBhcnNlZFNwYXduQXJnczxUPiB7XG4gIGxldCBbdmFsdWUsIC4uLnZhbHVlc10gPSBpbnB1dDtcblxuICBjb25zdCBsYXN0ID0gdmFsdWVzLmF0KC0xKTtcbiAgY29uc3Qgb3B0aW9ucyA9XG4gICAgbGFzdCAhPT0gbnVsbCAmJiB0eXBlb2YgbGFzdCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShsYXN0KSA/IGxhc3QgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGFyZ3VtZW50VmFsdWVzID0gb3B0aW9ucyA/IHZhbHVlcy5zbGljZSgwLCAtMSkgOiB2YWx1ZXM7XG4gIC8vIE9ubHkgdGhlIG9uZS1zdHJpbmcgZm9ybSBpcyBzaGVsbC1saWtlLiBFeHBsaWNpdCBhcmd1bWVudHMgbWFrZSB0aGUgY29tbWFuZCBhbiBleGFjdCBleGVjdXRhYmxlLlxuICBjb25zdCBbY29tbWFuZCwgLi4uY29tbWFuZEFyZ3NdID0gYXJndW1lbnRWYWx1ZXMubGVuZ3RoID09PSAwID8gc2hsZXgodmFsdWUhKSA6IFt2YWx1ZSFdO1xuICBjb25zdCB2YWx1ZUFyZ3M6IHN0cmluZ1tdID1cbiAgICBhcmd1bWVudFZhbHVlcy5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShhcmd1bWVudFZhbHVlc1swXSlcbiAgICAgID8gWy4uLmFyZ3VtZW50VmFsdWVzWzBdXVxuICAgICAgOiBhcmd1bWVudFZhbHVlcztcblxuICByZXR1cm4ge1xuICAgIGNvbW1hbmQ6IGNvbW1hbmQhLFxuICAgIGNvbW1hbmRBcmdzOiBbLi4uY29tbWFuZEFyZ3MsIC4uLnZhbHVlQXJnc10sXG4gICAgb3B0aW9uczogb3B0aW9ucyBhcyBULFxuICB9O1xufVxuXG4vKipcbiAqIERyb3AgdGhlIHNpbmdsZSB0cmFpbGluZyBlbXB0eSBlbnRyeSBgc3Bhd25TeW5jYCBhZGRzIHdoZW4gc3BsaXR0aW5nIG9uIGEgZmluYWxcbiAqIG5ld2xpbmUgKGBcImhpXFxuXCJgIC0+IGBbXCJoaVwiLCBcIlwiXWApLiBEb2VzIG5vdCByZW1vdmUgbXVsdGlwbGUgdHJhaWxpbmcgZW1wdGllcy5cbiAqL1xuZnVuY3Rpb24gd2l0aG91dFNwYXduVHJhaWxpbmdFbXB0eUxpbmUobGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9PT0gXCJcIikge1xuICAgIHJldHVybiBsaW5lcy5zbGljZSgwLCAtMSk7XG4gIH1cbiAgcmV0dXJuIGxpbmVzIGFzIHN0cmluZ1tdO1xufVxuXG4vKiogUmVtb3ZlIGF0IG1vc3Qgb25lIHRyYWlsaW5nIG5ld2xpbmUgZnJvbSBjYXB0dXJlZCBzcGF3biBzdGRvdXQvc3RkZXJyIHRleHQuICovXG5mdW5jdGlvbiB0cmltU2luZ2xlVHJhaWxpbmdOZXdsaW5lKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh0ZXh0LmVuZHNXaXRoKFwiXFxyXFxuXCIpKSByZXR1cm4gdGV4dC5zbGljZSgwLCAtMik7XG4gIGlmICh0ZXh0LmVuZHNXaXRoKFwiXFxuXCIpKSByZXR1cm4gdGV4dC5zbGljZSgwLCAtMSk7XG4gIHJldHVybiB0ZXh0O1xufVxuXG4vKiogTGluZS1hcnJheSB2aWV3IG9mIGFzeW5jLWNhcHR1cmVkIG91dHB1dC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRBc3luY0xpbmVzKGxpbmVzOiByZWFkb25seSBzdHJpbmdbXSwgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgaWYgKHRyaW0gPT09IHRydWUpIHJldHVybiBsaW5lc0Zyb21DYXB0dXJlZE91dHB1dChsaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKSk7XG4gIHJldHVybiBsaW5lcyBhcyBzdHJpbmdbXTtcbn1cblxuLyoqIEpvaW4gYXN5bmMtY2FwdHVyZWQgbGluZXMgaW50byBzdGRvdXQvc3RkZXJyIHRleHQuICovXG5mdW5jdGlvbiBmb3JtYXRBc3luY0NhcHR1cmVkTGluZXMobGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgY29uc3Qgam9pbmVkID0gbGluZXMuam9pbihcIlxcblwiKTtcbiAgcmV0dXJuIHRyaW0gPT09IHRydWUgPyBqb2luZWQudHJpbSgpIDogam9pbmVkO1xufVxuXG4vKiogTGluZS1hcnJheSB2aWV3IG9mIHN5bmMtY2FwdHVyZWQgb3V0cHV0LiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplZFN5bmNMaW5lcyhsaW5lczogcmVhZG9ubHkgc3RyaW5nW10sIHRyaW06IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIGlmICh0cmltID09PSBmYWxzZSkgcmV0dXJuIGxpbmVzIGFzIHN0cmluZ1tdO1xuICBpZiAodHJpbSA9PT0gdHJ1ZSkgcmV0dXJuIGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KGxpbmVzLmpvaW4oXCJcXG5cIikudHJpbSgpKTtcbiAgcmV0dXJuIHdpdGhvdXRTcGF3blRyYWlsaW5nRW1wdHlMaW5lKGxpbmVzKTtcbn1cblxuLyoqIEZvcm1hdCBzeW5jLWNhcHR1cmVkIHN0ZG91dC9zdGRlcnIgdGV4dC4gKi9cbmZ1bmN0aW9uIGZvcm1hdFN5bmNDYXB0dXJlZFRleHQoXG4gIHRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdHJpbTogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0ZXh0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0cmltID09PSBmYWxzZSkgcmV0dXJuIHRleHQ7XG4gIGlmICh0cmltID09PSB0cnVlKSByZXR1cm4gdGV4dC50cmltKCk7XG4gIHJldHVybiB0cmltU2luZ2xlVHJhaWxpbmdOZXdsaW5lKHRleHQpO1xufVxuXG4vKipcbiAqIEh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciBhIHNwYXduZWQgY29tbWFuZCwgdXNlZCBpbiBlcnJvciBtZXNzYWdlcy5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIEV4ZWN1dGFibGUgbmFtZSBvciBwYXRoXG4gKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGV4ZWN1dGFibGVcbiAqIEByZXR1cm5zIEJhY2t0aWNrLXdyYXBwZWQgYGNvbW1hbmQgYXJnMSBhcmcyIC4uLmAgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNvbW1hbmRMYWJlbChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcXGAke2NvbW1hbmR9ICR7YXJncy5qb2luKFwiIFwiKX1cXGBgO1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgTm9kZSBmYWlsZWQgdG8gc3Bhd24gYmVjYXVzZSB0aGUgZXhlY3V0YWJsZSB3YXMgbm90IGZvdW5kLiAqL1xuZnVuY3Rpb24gaXNDb21tYW5kTm90Rm91bmRFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCI7XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciBhIHByb2Nlc3Mgb3BlcmF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBQSUQgbm8gbG9uZ2VyIGV4aXN0cy4gKi9cbmZ1bmN0aW9uIGlzTWlzc2luZ1Byb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IFwiRVNSQ0hcIjtcbn1cblxuLyoqIFZhbGlkYXRlIGEgZmluaXRlIG5vbi1uZWdhdGl2ZSB0aW1lb3V0LiAqL1xuZnVuY3Rpb24gdGltZW91dFZhbHVlKHZhbHVlOiBudW1iZXIsIG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGEgZmluaXRlIG5vbi1uZWdhdGl2ZSBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKiBSZWplY3QgY2FsbGVyLXNlbGVjdGVkIHNpZ25hbHMgc28gcGxhdGZvcm0gc2h1dGRvd24gcG9saWN5IHN0YXlzIGludGVybmFsLiAqL1xuZnVuY3Rpb24gcmVqZWN0U2lnbmFsT3B0aW9ucyhvcHRpb25zOiBvYmplY3QpOiB2b2lkIHtcbiAgY29uc3QgdW5zdXBwb3J0ZWQgPSBvcHRpb25zIGFzIHsgdGVybWluYXRlU2lnbmFsPzogdW5rbm93bjsga2lsbFNpZ25hbD86IHVua25vd24gfTtcbiAgaWYgKHVuc3VwcG9ydGVkLnRlcm1pbmF0ZVNpZ25hbCA9PT0gdW5kZWZpbmVkICYmIHVuc3VwcG9ydGVkLmtpbGxTaWduYWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIFwiUHJvY2VzcyBzaWduYWxzIGFyZSBzZWxlY3RlZCBpbnRlcm5hbGx5OyBjb25maWd1cmUgdGVybWluYXRlVGltZW91dCBhbmQga2lsbFRpbWVvdXQgaW5zdGVhZFwiLFxuICApO1xufVxuXG4vKiogUGFyc2UgdGhlIGNvbW1vbiBgcGlkIHBhcmVudFBpZCBpZGVudGl0eWAgcHJvY2Vzcy1zbmFwc2hvdCBmb3JtYXQuICovXG5mdW5jdGlvbiBwYXJzZVByb2Nlc3NTbmFwc2hvdChsaW5lczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9jZXNzU25hcHNob3RFbnRyeVtdIHtcbiAgY29uc3Qgc25hcHNob3Q6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSAvXlxccyooXFxkKylcXHMrKFxcZCspKD86XFxzKyguKz8pKT9cXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBjb25zdCBpZGVudGl0eSA9IG1hdGNoPy5bM10/LnRyaW0oKTtcbiAgICBpZiAoIW1hdGNoIHx8ICFpZGVudGl0eSkgY29udGludWU7XG4gICAgc25hcHNob3QucHVzaCh7XG4gICAgICBwaWQ6IE51bWJlci5wYXJzZUludChtYXRjaFsxXSEsIDEwKSxcbiAgICAgIHBhcmVudFBpZDogTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdISwgMTApLFxuICAgICAgaWRlbnRpdHksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHNuYXBzaG90O1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgYSBgL3Byb2NgIHJlY29yZCBkaXNhcHBlYXJlZCBvciBpcyBpbmFjY2Vzc2libGUgZHVyaW5nIGEgc25hcHNob3QuICovXG5mdW5jdGlvbiBpc1VuYXZhaWxhYmxlUHJvY1JlY29yZChlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHx8ICEoXCJjb2RlXCIgaW4gZXJyb3IpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiIHx8IGVycm9yLmNvZGUgPT09IFwiRUFDQ0VTXCIgfHwgZXJyb3IuY29kZSA9PT0gXCJFUEVSTVwiO1xufVxuXG4vKiogUGFyc2UgTGludXggYC9wcm9jLzxwaWQ+L3N0YXRgIHBhcmVudCBQSUQgYW5kIGV4YWN0IHByb2Nlc3Mtc3RhcnQgdGlja3MuICovXG5mdW5jdGlvbiBwYXJzZUxpbnV4UHJvY2Vzc1N0YXQocGlkOiBudW1iZXIsIHN0YXQ6IHN0cmluZyk6IFByb2Nlc3NTbmFwc2hvdEVudHJ5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29tbWFuZEVuZCA9IHN0YXQubGFzdEluZGV4T2YoXCIpXCIpO1xuICBpZiAoY29tbWFuZEVuZCA8IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpZWxkcyA9IHN0YXRcbiAgICAuc2xpY2UoY29tbWFuZEVuZCArIDEpXG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCBwYXJlbnRQaWQgPSBOdW1iZXIucGFyc2VJbnQoZmllbGRzWzFdISwgMTApO1xuICBjb25zdCBzdGFydFRpY2tzID0gZmllbGRzWzE5XTtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihwYXJlbnRQaWQpIHx8ICFzdGFydFRpY2tzKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4geyBwaWQsIHBhcmVudFBpZCwgaWRlbnRpdHk6IHN0YXJ0VGlja3MgfTtcbn1cblxuLyoqIENhcHR1cmUgTGludXggcHJvY2VzcyBpZGVudGl0aWVzIGZyb20gYC9wcm9jYCB3aXRob3V0IHNlY29uZC1sZXZlbCB0cnVuY2F0aW9uLiAqL1xuYXN5bmMgZnVuY3Rpb24gbGludXhQcm9jZXNzU25hcHNob3QoKTogUHJvbWlzZTxQcm9jZXNzU25hcHNob3RFbnRyeVtdPiB7XG4gIGNvbnN0IGRpcmVjdG9yaWVzID0gYXdhaXQgcmVhZGRpcihcIi9wcm9jXCIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGRpcmVjdG9yaWVzXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSAmJiAvXlxcZCskLy50ZXN0KGVudHJ5Lm5hbWUpKVxuICAgICAgLm1hcChhc3luYyAoZW50cnkpOiBQcm9taXNlPFByb2Nlc3NTbmFwc2hvdEVudHJ5IHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChlbnRyeS5uYW1lLCAxMCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlTGludXhQcm9jZXNzU3RhdChwaWQsIGF3YWl0IHJlYWRGaWxlKGAvcHJvYy8ke2VudHJ5Lm5hbWV9L3N0YXRgLCBcInV0ZjhcIikpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChpc1VuYXZhaWxhYmxlUHJvY1JlY29yZChlcnJvcikpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICApO1xuICByZXR1cm4gZW50cmllcy5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUHJvY2Vzc1NuYXBzaG90RW50cnkgPT4gZW50cnkgIT09IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogQ2FwdHVyZSB0aGUgY3VycmVudCBQSUQsIHBhcmVudCBQSUQsIGFuZCBwcm9jZXNzLXN0YXJ0IGlkZW50aXR5IHRhYmxlLlxuICpcbiAqIExpbnV4IHJlYWRzIGV4YWN0IHN0YXJ0IHRpY2tzIGZyb20gYC9wcm9jYC4gV2luZG93cyB1c2VzIHRoZSBidWlsdC1pblxuICogUG93ZXJTaGVsbCBDSU0gcHJvdmlkZXIuIG1hY09TIGFuZCBvdGhlciBQT1NJWCBwbGF0Zm9ybXMgY29tYmluZSBgcHNgXG4gKiBwcm9jZXNzIHN0YXJ0IHRpbWUgYW5kIGV4ZWN1dGFibGUgbmFtZS4gVGhlIGhlbHBlciBwcm9jZXNzIGlzIGRldGFjaGVkIHNvIGFcbiAqIHRlcm1pbmFsIFNJR0lOVCB0byB0aGlzIHByb2Nlc3MgZ3JvdXAgY2Fubm90IGFib3J0IHRoZSBzbmFwc2hvdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1NuYXBzaG90KCk6IFByb21pc2U8UHJvY2Vzc1NuYXBzaG90RW50cnlbXT4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJsaW51eFwiKSByZXR1cm4gbGludXhQcm9jZXNzU25hcHNob3QoKTtcblxuICBjb25zdCBjb21tYW5kID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJwb3dlcnNoZWxsLmV4ZVwiIDogXCJwc1wiO1xuICBjb25zdCBhcmdzID1cbiAgICBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCJcbiAgICAgID8gW1wiLU5vTG9nb1wiLCBcIi1Ob1Byb2ZpbGVcIiwgXCItTm9uSW50ZXJhY3RpdmVcIiwgXCItQ29tbWFuZFwiLCBXSU5ET1dTX1BST0NFU1NfU05BUFNIT1RfU0NSSVBUXVxuICAgICAgOiBbXCItQVwiLCBcIi1vXCIsIFwicGlkPVwiLCBcIi1vXCIsIFwicHBpZD1cIiwgXCItb1wiLCBcImxzdGFydD1cIiwgXCItb1wiLCBcImNvbW09XCJdO1xuICBjb25zdCBwcm9jID0gbm9kZVNwYXduKGNvbW1hbmQsIGFyZ3MsIHtcbiAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXG4gICAgd2luZG93c0hpZGU6IHRydWUsXG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gIH0pO1xuICBjb25zdCBzdGRvdXQgPSB0ZXh0KHByb2Muc3Rkb3V0ISk7XG4gIGNvbnN0IHN0ZGVyciA9IHRleHQocHJvYy5zdGRlcnIhKTtcbiAgY29uc3QgW2V4aXRDb2RlLCBzdGRvdXRUZXh0LCBzdGRlcnJUZXh0XSA9IGF3YWl0IFByb21pc2UuYWxsKFt3YWl0Rm9yRXhpdChwcm9jKSwgc3Rkb3V0LCBzdGRlcnJdKTtcbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7Y29tbWFuZExhYmVsKGNvbW1hbmQsIGFyZ3MpfSBmYWlsZWQgKGV4aXQgJHtleGl0Q29kZX0pJHtcbiAgICAgICAgc3RkZXJyVGV4dCA/IGA6ICR7c3RkZXJyVGV4dC50cmltKCl9YCA6IFwiXCJcbiAgICAgIH1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlUHJvY2Vzc1NuYXBzaG90KGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KHN0ZG91dFRleHQpKTtcbn1cblxuLyoqIFJlYWQgYSBwcm9jZXNzIHNuYXBzaG90LCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwcm9jZXNzIHRhYmxlIGNhbm5vdCBiZSBsaXN0ZWQuICovXG5hc3luYyBmdW5jdGlvbiB0cnlQcm9jZXNzU25hcHNob3QoKTogUHJvbWlzZTxQcm9jZXNzU25hcHNob3RFbnRyeVtdIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHByb2Nlc3NTbmFwc2hvdCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInByb2Nlc3Mgc25hcHNob3QgZmFpbGVkXCIsIHsgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvcikgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogR3JvdXAgYSBwcm9jZXNzIHNuYXBzaG90IGJ5IHBhcmVudCBQSUQuICovXG5mdW5jdGlvbiBwcm9jZXNzQ2hpbGRyZW4oXG4gIHNuYXBzaG90OiByZWFkb25seSBQcm9jZXNzU25hcHNob3RFbnRyeVtdLFxuKTogTWFwPG51bWJlciwgUHJvY2Vzc1NuYXBzaG90RW50cnlbXT4ge1xuICBjb25zdCBjaGlsZHJlbiA9IG5ldyBNYXA8bnVtYmVyLCBQcm9jZXNzU25hcHNob3RFbnRyeVtdPigpO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNuYXBzaG90KSB7XG4gICAgY29uc3Qgc2libGluZ3MgPSBjaGlsZHJlbi5nZXQoZW50cnkucGFyZW50UGlkKSA/PyBbXTtcbiAgICBzaWJsaW5ncy5wdXNoKGVudHJ5KTtcbiAgICBjaGlsZHJlbi5zZXQoZW50cnkucGFyZW50UGlkLCBzaWJsaW5ncyk7XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG4vKiogU2VsZWN0IG9uZSBzbmFwc2hvdHRlZCBwcm9jZXNzIHRyZWUgaW4gZGVzY2VuZGFudC1maXJzdCBzaWduYWwgb3JkZXIuICovXG5mdW5jdGlvbiBwcm9jZXNzVHJlZShcbiAgc25hcHNob3Q6IHJlYWRvbmx5IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10sXG4gIHJvb3RQaWQ6IG51bWJlcixcbik6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10ge1xuICBjb25zdCByb290ID0gc25hcHNob3QuZmluZCgoZW50cnkpID0+IGVudHJ5LnBpZCA9PT0gcm9vdFBpZCk7XG4gIGlmICghcm9vdCkgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gaWRlbnRpZnkgY2hpbGQgcHJvY2VzcyAke3Jvb3RQaWR9YCk7XG5cbiAgY29uc3QgY2hpbGRyZW4gPSBwcm9jZXNzQ2hpbGRyZW4oc25hcHNob3QpO1xuICBjb25zdCB0cmVlOiBQcm9jZXNzU25hcHNob3RFbnRyeVtdID0gW107XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PG51bWJlcj4oW3Jvb3RQaWRdKTtcbiAgY29uc3QgYXBwZW5kRGVzY2VuZGFudHMgPSAocGFyZW50UGlkOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuLmdldChwYXJlbnRQaWQpID8/IFtdKSB7XG4gICAgICBpZiAodmlzaXRlZC5oYXMoY2hpbGQucGlkKSkgY29udGludWU7XG4gICAgICB2aXNpdGVkLmFkZChjaGlsZC5waWQpO1xuICAgICAgYXBwZW5kRGVzY2VuZGFudHMoY2hpbGQucGlkKTtcbiAgICAgIHRyZWUucHVzaChjaGlsZCk7XG4gICAgfVxuICB9O1xuICBhcHBlbmREZXNjZW5kYW50cyhyb290UGlkKTtcbiAgdHJlZS5wdXNoKHJvb3QpO1xuICByZXR1cm4gdHJlZTtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIHR3byBzbmFwc2hvdHMgaWRlbnRpZnkgdGhlIHNhbWUgcHJvY2VzcyBsaWZldGltZS4gKi9cbmZ1bmN0aW9uIHNhbWVQcm9jZXNzKHByZXZpb3VzOiBQcm9jZXNzU25hcHNob3RFbnRyeSwgY3VycmVudDogUHJvY2Vzc1NuYXBzaG90RW50cnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByZXZpb3VzLmlkZW50aXR5ID09PSBjdXJyZW50LmlkZW50aXR5O1xufVxuXG4vKipcbiAqIFJlZnJlc2ggcmV0YWluZWQgcHJvY2VzcyBpZGVudGl0aWVzIGFuZCBtZXJnZSBkZXNjZW5kYW50cyBjcmVhdGVkIGFmdGVyIHRoZVxuICogaW5pdGlhbCBzbmFwc2hvdC5cbiAqL1xuZnVuY3Rpb24gcmVmcmVzaFByb2Nlc3NUcmVlKFxuICByZXRhaW5lZDogTWFwPG51bWJlciwgUHJvY2Vzc1NuYXBzaG90RW50cnk+LFxuICBzbmFwc2hvdDogcmVhZG9ubHkgUHJvY2Vzc1NuYXBzaG90RW50cnlbXSxcbik6IFJlZnJlc2hlZFByb2Nlc3NUcmVlIHtcbiAgY29uc3QgY3VycmVudEJ5UGlkID0gbmV3IE1hcChzbmFwc2hvdC5tYXAoKGVudHJ5KSA9PiBbZW50cnkucGlkLCBlbnRyeV0pKTtcbiAgY29uc3QgY2hpbGRyZW4gPSBwcm9jZXNzQ2hpbGRyZW4oc25hcHNob3QpO1xuICBjb25zdCBwcm9jZXNzZXMgPSBuZXcgTWFwPG51bWJlciwgUHJvY2Vzc1NuYXBzaG90RW50cnk+KCk7XG4gIGNvbnN0IGRpc2NvdmVyZWQ6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10gPSBbXTtcbiAgY29uc3QgcXVldWU6IFByb2Nlc3NTbmFwc2hvdEVudHJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHByZXZpb3VzIG9mIHJldGFpbmVkLnZhbHVlcygpKSB7XG4gICAgY29uc3QgY3VycmVudCA9IGN1cnJlbnRCeVBpZC5nZXQocHJldmlvdXMucGlkKTtcbiAgICBpZiAoIWN1cnJlbnQgfHwgIXNhbWVQcm9jZXNzKHByZXZpb3VzLCBjdXJyZW50KSkgY29udGludWU7XG4gICAgcmV0YWluZWQuc2V0KGN1cnJlbnQucGlkLCBjdXJyZW50KTtcbiAgICBwcm9jZXNzZXMuc2V0KGN1cnJlbnQucGlkLCBjdXJyZW50KTtcbiAgICBxdWV1ZS5wdXNoKGN1cnJlbnQpO1xuICB9XG5cbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQocHJvY2Vzc2VzLmtleXMoKSk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBxdWV1ZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBxdWV1ZVtpbmRleF0hO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4uZ2V0KHBhcmVudC5waWQpID8/IFtdKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IHJldGFpbmVkLmdldChjaGlsZC5waWQpO1xuICAgICAgaWYgKCFwcmV2aW91cyB8fCAhc2FtZVByb2Nlc3MocHJldmlvdXMsIGNoaWxkKSkge1xuICAgICAgICByZXRhaW5lZC5zZXQoY2hpbGQucGlkLCBjaGlsZCk7XG4gICAgICAgIGRpc2NvdmVyZWQucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzZXMuc2V0KGNoaWxkLnBpZCwgY2hpbGQpO1xuICAgICAgaWYgKHZpc2l0ZWQuaGFzKGNoaWxkLnBpZCkpIGNvbnRpbnVlO1xuICAgICAgdmlzaXRlZC5hZGQoY2hpbGQucGlkKTtcbiAgICAgIHF1ZXVlLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHByb2Nlc3NlczogWy4uLnByb2Nlc3Nlcy52YWx1ZXMoKV0sIGRpc2NvdmVyZWQgfTtcbn1cblxuLyoqIEJ1aWxkIHRoZSBwZXItbGlmZXRpbWUga2V5IHVzZWQgdG8gcHJldmVudCByZXBlYXRlZCBzaWduYWxzIGFmdGVyIFBJRCByZXVzZS4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NJZGVudGl0eShlbnRyeTogUHJvY2Vzc1NuYXBzaG90RW50cnkpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7ZW50cnkucGlkfToke2VudHJ5LmlkZW50aXR5fWA7XG59XG5cbi8qKiBTaWduYWwgZWFjaCBwcm9jZXNzIGlkZW50aXR5IG9uY2UsIGlnbm9yaW5nIFBJRHMgdGhhdCBhbHJlYWR5IGV4aXRlZC4gKi9cbmZ1bmN0aW9uIHNpZ25hbFByb2Nlc3NlcyhcbiAgcHJvY2Vzc2VzOiByZWFkb25seSBQcm9jZXNzU25hcHNob3RFbnRyeVtdLFxuICBzaWduYWw6IE5vZGVKUy5TaWduYWxzLFxuICBzaWduYWxlZDogU2V0PHN0cmluZz4sXG4pOiB2b2lkIHtcbiAgY29uc3QgZXJyb3JzOiB1bmtub3duW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBwcm9jZXNzZXMpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHByb2Nlc3NJZGVudGl0eShlbnRyeSk7XG4gICAgaWYgKHNpZ25hbGVkLmhhcyhpZGVudGl0eSkpIGNvbnRpbnVlO1xuICAgIHNpZ25hbGVkLmFkZChpZGVudGl0eSk7XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbChlbnRyeS5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNNaXNzaW5nUHJvY2Vzc0Vycm9yKGVycm9yKSkgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgIH1cbiAgfVxuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBgRmFpbGVkIHRvIHNlbmQgJHtzaWduYWx9IHRvIHRoZSBjb21wbGV0ZSBwcm9jZXNzIHRyZWVgKTtcbiAgfVxufVxuXG4vKiogUGF1c2Ugd2l0aG91dCBkZXRhY2hpbmcgdGhlIHNodXRkb3duIG9wZXJhdGlvbiBmcm9tIHRoZSBldmVudCBsb29wLiAqL1xuZnVuY3Rpb24gZGVsYXkobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpc2Vjb25kcykpO1xufVxuXG4vKipcbiAqIFBvbGwgcmVmcmVzaGVkIHByb2Nlc3Mgc25hcHNob3RzIHVudGlsIHRoZSByZXRhaW5lZCB0cmVlIGV4aXRzIG9yIHRoZVxuICogdGltZW91dCBlbGFwc2VzLiBEZXNjZW5kYW50cyBjcmVhdGVkIGR1cmluZyBzaHV0ZG93biBhcmUgcmV0YWluZWQgYW5kIG1heVxuICogcmVjZWl2ZSB0aGUgY3VycmVudCBzaHV0ZG93biBzaWduYWwgb25jZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclByb2Nlc3NUcmVlRXhpdChcbiAgcmV0YWluZWQ6IE1hcDxudW1iZXIsIFByb2Nlc3NTbmFwc2hvdEVudHJ5PixcbiAgaW5pdGlhbFByb2Nlc3NlczogcmVhZG9ubHkgUHJvY2Vzc1NuYXBzaG90RW50cnlbXSxcbiAgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyxcbiAgc2lnbmFsZWQ6IFNldDxzdHJpbmc+LFxuICB0aW1lb3V0TXM6IG51bWJlcixcbiAgcG9sbEludGVydmFsTXM6IG51bWJlcixcbiAgc2lnbmFsRGlzY292ZXJlZDogYm9vbGVhbixcbik6IFByb21pc2U8UHJvY2Vzc1NuYXBzaG90RW50cnlbXT4ge1xuICBsZXQgc3Vydml2b3JzID0gWy4uLmluaXRpYWxQcm9jZXNzZXNdO1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aW1lb3V0TXM7XG4gIHdoaWxlIChzdXJ2aXZvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHJlbWFpbmluZ01zID0gZGVhZGxpbmUgLSBEYXRlLm5vdygpO1xuICAgIGlmIChyZW1haW5pbmdNcyA+IDApIGF3YWl0IGRlbGF5KE1hdGgubWluKHBvbGxJbnRlcnZhbE1zLCByZW1haW5pbmdNcykpO1xuXG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0cnlQcm9jZXNzU25hcHNob3QoKTtcbiAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKERhdGUubm93KCkgPj0gZGVhZGxpbmUpIGJyZWFrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHJlZnJlc2hlZCA9IHJlZnJlc2hQcm9jZXNzVHJlZShyZXRhaW5lZCwgc25hcHNob3QpO1xuICAgIGlmIChzaWduYWxEaXNjb3ZlcmVkICYmIHJlZnJlc2hlZC5kaXNjb3ZlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgIHNpZ25hbFByb2Nlc3NlcyhyZWZyZXNoZWQuZGlzY292ZXJlZCwgc2lnbmFsLCBzaWduYWxlZCk7XG4gICAgfVxuICAgIHN1cnZpdm9ycyA9IHJlZnJlc2hlZC5wcm9jZXNzZXM7XG4gICAgaWYgKERhdGUubm93KCkgPj0gZGVhZGxpbmUpIGJyZWFrO1xuICB9XG4gIHJldHVybiBzdXJ2aXZvcnM7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHtAbGluayBzcGF3bn0gd2l0aCBsaXZlIGxpbmUgYXJyYXlzIGFuZCBsYXp5XG4gKiB0cmltbWVkIGBzdGRvdXRgIC8gYHN0ZGVycmAgZ2V0dGVycyBkZXJpdmVkIGZyb20gdGhvc2UgbGluZXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUV4ZWNSZXN1bHQoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN0ZG91dExpbmVzOiBzdHJpbmdbXSxcbiAgc3RkZXJyTGluZXM6IHN0cmluZ1tdLFxuICB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogRXhlY1Jlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgZXhpdENvZGUsXG4gICAgZ2V0IHN0ZG91dExpbmVzKCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRBc3luY0xpbmVzKHN0ZG91dExpbmVzLCB0cmltKTtcbiAgICB9LFxuICAgIGdldCBzdGRlcnJMaW5lcygpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkQXN5bmNMaW5lcyhzdGRlcnJMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgICBnZXQgc3Rkb3V0KCkge1xuICAgICAgcmV0dXJuIGZvcm1hdEFzeW5jQ2FwdHVyZWRMaW5lcyhzdGRvdXRMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyKCkge1xuICAgICAgcmV0dXJuIGZvcm1hdEFzeW5jQ2FwdHVyZWRMaW5lcyhzdGRlcnJMaW5lcywgdHJpbSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgb2JqZWN0IHJldHVybmVkIGZyb20ge0BsaW5rIHNwYXduU3luY30uIENhcHR1cmVkIHN0cmluZ3MgYXJlIHN0b3JlZFxuICogYXMtaXM7IGBzdGRvdXRgIC8gYHN0ZGVycmAgdHJpbSBkaXJlY3RseSwgYW5kIGxpbmUgYXJyYXlzIHNwbGl0IG9ubHkgb24gcmVhZC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3luY0V4ZWNSZXN1bHQoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN0ZG91dFRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgc3RkZXJyVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0cmltOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogRXhlY1Jlc3VsdCB7XG4gIGxldCBzdGRvdXRMaW5lc0NhY2hlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0ZGVyckxpbmVzQ2FjaGU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN5bmNMaW5lcyA9ICh0ZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHRleHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbm9ybWFsaXplZFN5bmNMaW5lcyhsaW5lc0Zyb21DYXB0dXJlZE91dHB1dCh0ZXh0KSwgdHJpbSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBleGl0Q29kZSxcbiAgICBnZXQgc3Rkb3V0TGluZXMoKSB7XG4gICAgICBpZiAoc3Rkb3V0VGV4dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gICAgICBzdGRvdXRMaW5lc0NhY2hlID8/PSBzeW5jTGluZXMoc3Rkb3V0VGV4dCkgPz8gW107XG4gICAgICByZXR1cm4gc3Rkb3V0TGluZXNDYWNoZTtcbiAgICB9LFxuICAgIGdldCBzdGRlcnJMaW5lcygpIHtcbiAgICAgIGlmIChzdGRlcnJUZXh0ID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgICAgIHN0ZGVyckxpbmVzQ2FjaGUgPz89IHN5bmNMaW5lcyhzdGRlcnJUZXh0KSA/PyBbXTtcbiAgICAgIHJldHVybiBzdGRlcnJMaW5lc0NhY2hlO1xuICAgIH0sXG4gICAgZ2V0IHN0ZG91dCgpIHtcbiAgICAgIHJldHVybiBmb3JtYXRTeW5jQ2FwdHVyZWRUZXh0KHN0ZG91dFRleHQsIHRyaW0pID8/IFwiXCI7XG4gICAgfSxcbiAgICBnZXQgc3RkZXJyKCkge1xuICAgICAgcmV0dXJuIGZvcm1hdFN5bmNDYXB0dXJlZFRleHQoc3RkZXJyVGV4dCwgdHJpbSkgPz8gXCJcIjtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdXNlci1zdXBwbGllZCBsaW5lIGhhbmRsZXJzIGZyb20gYSB7QGxpbmsgU3RkaW9PcHRpb259LlxuICpcbiAqIFRoZSBgXCJjYXB0dXJlXCJgIG1hcmtlciBpcyBmaWx0ZXJlZCBvdXQ7IGNhcHR1cmUgaXRzZWxmIGlzIGFsd2F5cyBoYW5kbGVkIGJ5XG4gKiBwdXNoaW5nIGludG8gdGhlIGxpbmUgYnVmZmVyIGluc2lkZSB7QGxpbmsgcmVzb2x2ZVN0ZGlvfS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gU3RkaW8gb3B0aW9uIHRoYXQgbWF5IGVtYmVkIG9uZSBvciBtb3JlIGhhbmRsZXJzXG4gKiBAcmV0dXJucyBIYW5kbGVycyB0byBpbnZva2UgYWZ0ZXIgZWFjaCBjYXB0dXJlZCBsaW5lIChtYXkgYmUgZW1wdHkpXG4gKi9cbmZ1bmN0aW9uIGxpbmVIYW5kbGVycyhvcHRpb246IFN0ZGlvT3B0aW9uKTogTGluZUhhbmRsZXJbXSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9uID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBbb3B0aW9uXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uKSkge1xuICAgIHJldHVybiBvcHRpb24uZmlsdGVyKChpdGVtKTogaXRlbSBpcyBMaW5lSGFuZGxlciA9PiBpdGVtICE9PSBcImNhcHR1cmVcIik7XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRpb24gPT09IFwib2JqZWN0XCIpIHJldHVybiBbb3B0aW9uLm9uTGluZV07XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gY2FwdHVyZXNMaW5lcyhvcHRpb246IFN0ZGlvT3B0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygb3B0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9uKSB8fCBvcHRpb24uY2FwdHVyZSAhPT0gZmFsc2U7XG59XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGEgc3RkaW8gb3B0aW9uIGlzIGEgc3RyaW5nIHNwYXduIG1vZGUgcmF0aGVyIHRoYW4gY2FwdHVyZS9oYW5kbGVycy5cbiAqXG4gKiB7QGxpbmsgcmVzb2x2ZVN0ZGlvfSBzdGlsbCB0cmVhdHMgYFwicGlwZVwiYCBhcyBwaXBlLWFuZC1jYXB0dXJlOyBvbmx5XG4gKiBgXCJpbmhlcml0XCJgIGFuZCBgXCJpZ25vcmVcImAgcmV0dXJuIHdpdGhvdXQgYSBsaW5lIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSBvcHRpb24gLSBTdGRpbyBvcHRpb24gdG8gY2xhc3NpZnlcbiAqIEByZXR1cm5zIFdoZXRoZXIgYG9wdGlvbmAgaXMgYFwiaW5oZXJpdFwiYCwgYFwicGlwZVwiYCwgb3IgYFwiaWdub3JlXCJgXG4gKi9cbmZ1bmN0aW9uIGlzUGFzc3Rocm91Z2hNb2RlKG9wdGlvbjogdW5rbm93bik6IG9wdGlvbiBpcyBFeGVjU3RkaW8ge1xuICByZXR1cm4gb3B0aW9uID09PSBcImluaGVyaXRcIiB8fCBvcHRpb24gPT09IFwicGlwZVwiIHx8IG9wdGlvbiA9PT0gXCJpZ25vcmVcIjtcbn1cblxuLyoqIFRydWUgd2hlbiBzdGRpbiBpcyBkYXRhIHJhdGhlciB0aGFuIG9uZSBvZiB0aGUgdGhyZWUgcmVzZXJ2ZWQgc3RkaW8gbW9kZXMuICovXG5mdW5jdGlvbiBpc1N0ZGluUGF5bG9hZChzdGRpbjogRXhlY1N0ZGlvIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RkaW4gaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBzdGRpbiA9PT0gXCJzdHJpbmdcIiAmJiAhaXNQYXNzdGhyb3VnaE1vZGUoc3RkaW4pO1xufVxuXG4vKipcbiAqIE1hcCBhIHtAbGluayBTdGRpb09wdGlvbn0gaW50byBhIHNwYXduIHN0ZGlvIG1vZGUgYW5kIG9wdGlvbmFsIGxpbmUgY2FsbGJhY2suXG4gKlxuICogUGlwZWQgbW9kZXMgKGBcImNhcHR1cmVcImAsIGBcInBpcGVcImAsIGhhbmRsZXJzLCBhcnJheXMpIGFwcGVuZCBldmVyeSBsaW5lIHRvXG4gKiBgbGluZXNgIGFuZCBpbnZva2UgYW55IGVtYmVkZGVkIGhhbmRsZXJzLiBPbWl0dGVkIG9wdGlvbnMgdXNlIGBkZWZhdWx0TW9kZWAuXG4gKlxuICogQHBhcmFtIG9wdGlvbiAtIENhbGxlciBzdGRpbyBwcmVmZXJlbmNlIGZvciBvbmUgZmRcbiAqIEBwYXJhbSBsaW5lcyAtIE11dGFibGUgYnVmZmVyIHRoYXQgcmVjZWl2ZXMgZWFjaCBwaXBlZCBsaW5lXG4gKiBAcGFyYW0gZGVmYXVsdE1vZGUgLSBTcGF3biBtb2RlIHdoZW4gYG9wdGlvbmAgaXMgb21pdHRlZCAoYFwiaW5oZXJpdFwiYCBieSBkZWZhdWx0KVxuICogQHJldHVybnMgUmVzb2x2ZWQgc3Bhd24gbW9kZSBhbmQgb3B0aW9uYWwgcGVyLWxpbmUgY2FsbGJhY2tcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN0ZGlvKFxuICBvcHRpb246IFN0ZGlvT3B0aW9uIHwgdW5kZWZpbmVkLFxuICBsaW5lczogc3RyaW5nW10sXG4gIGRlZmF1bHRNb2RlOiBFeGVjU3RkaW8gPSBcImluaGVyaXRcIixcbik6IFJlc29sdmVkU3RkaW8ge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB7IG1vZGU6IGRlZmF1bHRNb2RlIH07XG4gIGlmIChpc1Bhc3N0aHJvdWdoTW9kZShvcHRpb24pICYmIG9wdGlvbiAhPT0gXCJwaXBlXCIpIHJldHVybiB7IG1vZGU6IG9wdGlvbiB9O1xuXG4gIGNvbnN0IGhhbmRsZXJzID0gbGluZUhhbmRsZXJzKG9wdGlvbik7XG4gIGNvbnN0IGNhcHR1cmUgPSBjYXB0dXJlc0xpbmVzKG9wdGlvbik7XG4gIHJldHVybiB7XG4gICAgbW9kZTogXCJwaXBlXCIsXG4gICAgb25MaW5lOiAobGluZSkgPT4ge1xuICAgICAgaWYgKGNhcHR1cmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIGhhbmRsZXIobGluZSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWFkIGEgcmVhZGFibGUgc3RyZWFtIGxpbmUtYnktbGluZSBhbmQgaW52b2tlIGBvbkxpbmVgIGZvciBlYWNoIGNodW5rLlxuICpcbiAqIFVzZXMgYHJlYWRsaW5lYCBzbyBgXFxyXFxuYCBhbmQgYmFyZSBgXFxuYCBhcmUgbm9ybWFsaXplZC4gVGhlIGludGVyZmFjZSBpc1xuICogYWx3YXlzIGNsb3NlZCBpbiBhIGBmaW5hbGx5YCBibG9jay5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtIC0gU3VicHJvY2VzcyBzdGRvdXQgb3Igc3RkZXJyIHN0cmVhbVxuICogQHBhcmFtIG9uTGluZSAtIENhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgb3V0cHV0IGxpbmVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZExpbmVzKHN0cmVhbTogUmVhZGFibGUsIG9uTGluZTogTGluZUhhbmRsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2UoeyBpbnB1dDogc3RyZWFtLCBjcmxmRGVsYXk6IEluZmluaXR5IH0pO1xuICB0cnkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgbGluZSBvZiBybCkgb25MaW5lKGxpbmUpO1xuICB9IGZpbmFsbHkge1xuICAgIHJsLmNsb3NlKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGFydCBhIGJhY2tncm91bmQgbGluZSByZWFkIHdoZW4gdGhlIHJlc29sdmVkIGhhbmRsZXIgcGlwZXMgYSBzdHJlYW0uXG4gKlxuICogQHBhcmFtIHJlYWRzIC0gUHJvbWlzZSBsaXN0IGF3YWl0ZWQgYmVmb3JlIHJldHVybmluZyB0aGUge0BsaW5rIEV4ZWNSZXN1bHR9XG4gKiBAcGFyYW0gc3RyZWFtIC0gU3VicHJvY2VzcyBzdHJlYW0gZm9yIHRoaXMgZmQgKGBudWxsYCB3aGVuIHVuYXZhaWxhYmxlKVxuICogQHBhcmFtIGhhbmRsZXIgLSBSZXNvbHZlZCBzdGRpbyBjb25maWcgZnJvbSB7QGxpbmsgcmVzb2x2ZVN0ZGlvfVxuICovXG5mdW5jdGlvbiBxdWV1ZUxpbmVSZWFkcyhcbiAgcmVhZHM6IFByb21pc2U8dm9pZD5bXSxcbiAgc3RyZWFtOiBSZWFkYWJsZSB8IG51bGwsXG4gIGhhbmRsZXI6IFJlc29sdmVkU3RkaW8sXG4pOiB2b2lkIHtcbiAgaWYgKGhhbmRsZXIub25MaW5lICYmIHN0cmVhbSkgcmVhZHMucHVzaChyZWFkTGluZXMoc3RyZWFtLCBoYW5kbGVyLm9uTGluZSkpO1xufVxuXG4vKipcbiAqIFdyaXRlIHN0cmluZyBzdGRpbiB0byBhIHNwYXduZWQgcHJvY2VzcyBhbmQgY2xvc2UgdGhlIHN0cmVhbS5cbiAqXG4gKiBOby1vcCB1bmxlc3MgYHN0ZGluYCBpcyBhIHBheWxvYWQgc3RyaW5nIChub3QgYSBzdGRpbyBtb2RlKSBhbmRcbiAqIGBwcm9jLnN0ZGluYCBpcyBhdmFpbGFibGUuIEEgY2hpbGQgdGhhdCBleGl0cyBiZWZvcmUgY29uc3VtaW5nIHRoZSBwYXlsb2FkXG4gKiBjbG9zZXMgaXRzIHBpcGU7IEVQSVBFIGlzIGV4cGVjdGVkIGluIHRoYXQgY2FzZSBhbmQgaXMgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0gcHJvYyAtIENoaWxkIHByb2Nlc3MgcmV0dXJuZWQgZnJvbSBgc3Bhd25gXG4gKiBAcGFyYW0gc3RkaW4gLSBTdGRpbyBtb2RlIG9yIHN0cmluZyBwYXlsb2FkIGZyb20ge0BsaW5rIEV4ZWNPcHRpb25zfVxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN0ZGluKFxuICBwcm9jOiBDaGlsZFByb2Nlc3MsXG4gIHN0ZGluOiBFeGVjU3RkaW8gfCBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1N0ZGluUGF5bG9hZChzdGRpbikgfHwgIXByb2Muc3RkaW4pIHJldHVybjtcbiAgY29uc3QgY29tcGxldGlvbiA9IGZpbmlzaGVkKHByb2Muc3RkaW4sIHsgY2xlYW51cDogdHJ1ZSB9KTtcbiAgcHJvYy5zdGRpbi5lbmQoc3RkaW4pO1xuICB0cnkge1xuICAgIGF3YWl0IGNvbXBsZXRpb247XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIFwiY29kZVwiIGluIGVyciAmJiBlcnIuY29kZSA9PT0gXCJFUElQRVwiKSkgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogQXdhaXQgcHJvY2VzcyBleGl0IGFuZCBub3JtYWxpemUgYSBtaXNzaW5nIGV4aXQgY29kZSB0byBgMWAuXG4gKlxuICogUmVqZWN0cyB3aGVuIHNwYXduIGZhaWxzIGJlZm9yZSBgY2xvc2VgIChlLmcuIGV4ZWN1dGFibGUgbm90IGZvdW5kKS5cbiAqXG4gKiBAcGFyYW0gcHJvYyAtIENoaWxkIHByb2Nlc3MgcmV0dXJuZWQgZnJvbSBgc3Bhd25gXG4gKiBAcmV0dXJucyBSZXNvbHZlZCBleGl0IGNvZGVcbiAqL1xuZnVuY3Rpb24gd2FpdEZvckV4aXQocHJvYzogQ2hpbGRQcm9jZXNzKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBwcm9jLm9uY2UoXCJlcnJvclwiLCByZWplY3QpO1xuICAgIHByb2Mub25jZShcImNsb3NlXCIsIChjb2RlKSA9PiByZXNvbHZlKGNvZGUgPz8gMSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiBgRXJyb3JgIGZvciBhIG5vbi16ZXJvIGV4aXQgd2hlbiB7QGxpbmsgRXhlY09wdGlvbnMuY2hlY2t9IGlzIHNldC5cbiAqXG4gKiBQcmVmZXJzIHRyaW1tZWQgc3RkZXJyIHRleHQsIHRoZW4gc3Rkb3V0LCBpbiB0aGUgbWVzc2FnZSBib2R5LlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gRXhlY3V0YWJsZSBuYW1lIG9yIHBhdGhcbiAqIEBwYXJhbSBhcmdzIC0gQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZXhlY3V0YWJsZVxuICogQHBhcmFtIHJlc3VsdCAtIENvbXBsZXRlZCBleGVjIG91dGNvbWUgd2l0aCBjYXB0dXJlZCBvdXRwdXRcbiAqIEByZXR1cm5zIEVycm9yIHN1aXRhYmxlIGZvciB0aHJvd2luZyBmcm9tIHtAbGluayBzcGF3bn1cbiAqL1xuZnVuY3Rpb24gZXhlY0Vycm9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIHJlc3VsdDogRXhlY1Jlc3VsdCk6IEVycm9yIHtcbiAgY29uc3QgZGV0YWlsID0gcmVzdWx0LnN0ZGVyciB8fCByZXN1bHQuc3Rkb3V0O1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGAke2NvbW1hbmRMYWJlbChjb21tYW5kLCBhcmdzKX0gZmFpbGVkIChleGl0ICR7cmVzdWx0LmV4aXRDb2RlfSkke2RldGFpbCA/IGA6ICR7ZGV0YWlsfWAgOiBcIlwifWAsXG4gICk7XG59XG5cbi8qKlxuICogTWFwIGEge0BsaW5rIFN5bmNFeGVjU3RkaW99IG9wdGlvbiB0byBhIGBzcGF3blN5bmNgIHN0ZGlvIG1vZGUuXG4gKlxuICogYFwiY2FwdHVyZVwiYCBwaXBlcyB0aGUgZmQgc28gb3V0cHV0IGNhbiBiZSByZWFkIGludG8gdGhlIHtAbGluayBFeGVjUmVzdWx0fS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uIC0gQ2FsbGVyIHN0ZGlvIHByZWZlcmVuY2UgZm9yIG9uZSBmZFxuICogQHBhcmFtIGRlZmF1bHRNb2RlIC0gU3Bhd24gbW9kZSB3aGVuIGBvcHRpb25gIGlzIG9taXR0ZWQgKGBcImluaGVyaXRcImAgYnkgZGVmYXVsdClcbiAqIEByZXR1cm5zIFZhbHVlIGZvciB0aGUgYHNwYXduU3luY2Agc3RkaW8gdHVwbGVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN5bmNTdGRpbyhcbiAgb3B0aW9uOiBTeW5jRXhlY1N0ZGlvIHwgdW5kZWZpbmVkLFxuICBkZWZhdWx0TW9kZTogRXhlY1N0ZGlvID0gXCJpbmhlcml0XCIsXG4pOiBFeGVjU3RkaW8ge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0TW9kZTtcbiAgaWYgKG9wdGlvbiA9PT0gXCJjYXB0dXJlXCIpIHJldHVybiBcInBpcGVcIjtcbiAgcmV0dXJuIG9wdGlvbjtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgcmF3IGBzcGF3blN5bmNgIG91dHB1dCB0byBhIFVURi04IHN0cmluZyB3aGVuIGNhcHR1cmUgaXMgZW5hYmxlZC5cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZWRUZXh0KG91dHB1dDogc3RyaW5nIHwgQnVmZmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvdXRwdXQgPT09IG51bGwgfHwgb3V0cHV0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygb3V0cHV0ID09PSBcInN0cmluZ1wiID8gb3V0cHV0IDogb3V0cHV0LnRvU3RyaW5nKFwidXRmOFwiKTtcbn1cblxuLyoqXG4gKiBTcGxpdCBjYXB0dXJlZCBwcm9jZXNzIG91dHB1dCBpbnRvIGxpbmVzIGZvciB7QGxpbmsgRXhlY1Jlc3VsdC5zdGRvdXRMaW5lc30gL1xuICoge0BsaW5rIEV4ZWNSZXN1bHQuc3RkZXJyTGluZXN9ICh7QGxpbmsgc3Bhd25TeW5jfSBvbmx5OyBpbnZva2VkIGxhemlseSkuXG4gKi9cbmZ1bmN0aW9uIGxpbmVzRnJvbUNhcHR1cmVkT3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gb3V0cHV0LnJlcGxhY2UoL1xcclxcbi9nLCBcIlxcblwiKS5yZXBsYWNlKC9cXHIvZywgXCJcXG5cIikuc3BsaXQoXCJcXG5cIik7XG59XG5cbi8qKlxuICogU3RvcCBhIGNoaWxkIHByb2Nlc3MgYW5kIGRlc2NlbmRhbnRzIGRpc2NvdmVyZWQgdGhyb3VnaCBvcGVyYXRpbmctc3lzdGVtXG4gKiBwcm9jZXNzIHNuYXBzaG90cy5cbiAqXG4gKiBUaGUgaW5pdGlhbCB0cmVlIGlzIHJldGFpbmVkIGJlZm9yZSBzaWduYWxpbmcgc28gZGVzY2VuZGFudHMgcmVtYWluXG4gKiB0YXJnZXRhYmxlIGFmdGVyIHRoZWlyIHBhcmVudCBleGl0cyBvciB0aGV5IGFyZSByZXBhcmVudGVkLiBQb2xsaW5nIHJlZnJlc2hlc1xuICogdGhlIHByb2Nlc3MgdGFibGUsIG1lcmdlcyBuZXdseSBjcmVhdGVkIGRlc2NlbmRhbnRzLCBhbmQgc2VuZHMgZWFjaCBvbmUgdGhlXG4gKiBhY3RpdmUgc2h1dGRvd24gc2lnbmFsIG9uY2UuIG1hY09TIGFuZCBvdGhlciBQT1NJWCBwbGF0Zm9ybXMgdXNlIGBwc2A7XG4gKiBXaW5kb3dzIHVzZXMgdGhlIGJ1aWx0LWluIFBvd2VyU2hlbGwgQ0lNIHByb2Nlc3MgcHJvdmlkZXIuXG4gKlxuICogV2luZG93cyBkb2VzIG5vdCBpbXBsZW1lbnQgUE9TSVggc2lnbmFsIHNlbWFudGljcy4gTm9kZSB0ZXJtaW5hdGVzIHByb2Nlc3Nlc1xuICogdW5jb25kaXRpb25hbGx5IGZvciBzdXBwb3J0ZWQgc2lnbmFscyB0aGVyZSwgaW5jbHVkaW5nIGBTSUdURVJNYC5cbiAqXG4gKiBAcGFyYW0gY2hpbGQgLSBSb290IGNoaWxkIHByb2Nlc3Mgd2hvc2Ugc25hcHNob3R0ZWQgdHJlZSBzaG91bGQgc3RvcFxuICogQHBhcmFtIG9wdGlvbnMgLSBHcmFjZWZ1bCBhbmQgZm9yY2VkIHNodXRkb3duIHRpbWVvdXQgcG9saWN5XG4gKiBAcGFyYW0gdGVybWluYXRlU2lnbmFsIC0gSW50ZXJuYWwgc2lnbmFsIHNlbGVjdGVkIGZyb20gdGhlIHBhcmVudCBldmVudCBvciBwbGF0Zm9ybSBkZWZhdWx0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZVByb2Nlc3NUcmVlKFxuICBjaGlsZDogQ2hpbGRQcm9jZXNzLFxuICBvcHRpb25zOiBDaGlsZFByb2Nlc3NUZXJtaW5hdGlvbk9wdGlvbnMgPSB7fSxcbiAgdGVybWluYXRlU2lnbmFsOiBOb2RlSlMuU2lnbmFscyA9IERFRkFVTFRfVEVSTUlOQVRFX1NJR05BTCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQgfHwgY2hpbGQuZXhpdENvZGUgIT09IG51bGwgfHwgY2hpbGQuc2lnbmFsQ29kZSAhPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRlcm1pbmF0ZVRpbWVvdXQgPSB0aW1lb3V0VmFsdWUoXG4gICAgb3B0aW9ucy50ZXJtaW5hdGVUaW1lb3V0ID8/IERFRkFVTFRfVEVSTUlOQVRFX1RJTUVPVVRfTVMsXG4gICAgXCJ0ZXJtaW5hdGVUaW1lb3V0XCIsXG4gICk7XG4gIGNvbnN0IGtpbGxUaW1lb3V0ID0gdGltZW91dFZhbHVlKG9wdGlvbnMua2lsbFRpbWVvdXQgPz8gREVGQVVMVF9LSUxMX1RJTUVPVVRfTVMsIFwia2lsbFRpbWVvdXRcIik7XG4gIGNvbnN0IHBvbGxJbnRlcnZhbE1zID0gREVGQVVMVF9LSUxMX1BPTExfSU5URVJWQUxfTVM7XG4gIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdHJ5UHJvY2Vzc1NuYXBzaG90KCk7XG4gIGlmIChjaGlsZC5leGl0Q29kZSAhPT0gbnVsbCB8fCBjaGlsZC5zaWduYWxDb2RlICE9PSBudWxsKSByZXR1cm47XG4gIGlmIChzbmFwc2hvdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbChjaGlsZC5waWQsIHRlcm1pbmF0ZVNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNNaXNzaW5nUHJvY2Vzc0Vycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0cmVlID0gcHJvY2Vzc1RyZWUoc25hcHNob3QsIGNoaWxkLnBpZCk7XG4gIGNvbnN0IHJldGFpbmVkID0gbmV3IE1hcCh0cmVlLm1hcCgoZW50cnkpID0+IFtlbnRyeS5waWQsIGVudHJ5XSkpO1xuXG4gIGNvbnN0IHRlcm1pbmF0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgc2lnbmFsUHJvY2Vzc2VzKHRyZWUsIHRlcm1pbmF0ZVNpZ25hbCwgdGVybWluYXRlZCk7XG4gIGNvbnN0IGtpbGxUYXJnZXRzID0gYXdhaXQgd2FpdEZvclByb2Nlc3NUcmVlRXhpdChcbiAgICByZXRhaW5lZCxcbiAgICB0cmVlLFxuICAgIHRlcm1pbmF0ZVNpZ25hbCxcbiAgICB0ZXJtaW5hdGVkLFxuICAgIHRlcm1pbmF0ZVRpbWVvdXQsXG4gICAgcG9sbEludGVydmFsTXMsXG4gICAgdHJ1ZSxcbiAgKTtcbiAgaWYgKGtpbGxUYXJnZXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGtpbGxlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBzaWduYWxQcm9jZXNzZXMoa2lsbFRhcmdldHMsIERFRkFVTFRfS0lMTF9TSUdOQUwsIGtpbGxlZCk7XG4gIGNvbnN0IHN1cnZpdm9ycyA9IGF3YWl0IHdhaXRGb3JQcm9jZXNzVHJlZUV4aXQoXG4gICAgcmV0YWluZWQsXG4gICAga2lsbFRhcmdldHMsXG4gICAgREVGQVVMVF9LSUxMX1NJR05BTCxcbiAgICBraWxsZWQsXG4gICAga2lsbFRpbWVvdXQsXG4gICAgcG9sbEludGVydmFsTXMsXG4gICAgdHJ1ZSxcbiAgKTtcbiAgaWYgKHN1cnZpdm9ycy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgbG9nZ2VyLndhcm4oXCJwcm9jZXNzIHRyZWUgc3RpbGwgcnVubmluZyBhZnRlciBraWxsIHRpbWVvdXRcIiwge1xuICAgIHJvb3RQaWQ6IGNoaWxkLnBpZCxcbiAgICBzdXJ2aXZvclBpZHM6IHN1cnZpdm9ycy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5waWQpLFxuICAgIGtpbGxTaWduYWw6IERFRkFVTFRfS0lMTF9TSUdOQUwsXG4gICAga2lsbFRpbWVvdXQsXG4gIH0pO1xufVxuXG4vKipcbiAqIFNwYXduIGEgc3VicHJvY2Vzcy4gUmV0dXJucyB0aGUgTElWRSBjaGlsZCBoYW5kbGUgdGhhdCBpcyBBTFNPIGFcbiAqIGBQcm9taXNlPEV4ZWNSZXN1bHQ+YCByZXNvbHZpbmcgb24gZXhpdCAtIHNlZSB7QGxpbmsgQ2hpbGRQcm9jZXNzUmVzdWx0fS5cbiAqXG4gKiBUaGUgcHJvbWlzZSBoYWxmIGlzIHRoZSBleGFjdCBiZWhhdmlvdXIgdGhpcyBmdW5jdGlvbiBoYWQgYmVmb3JlOiBpdCBhd2FpdHNcbiAqIGV4aXQgKGFuZCBhbnkgbGluZSByZWFkcyAvIHN0ZGluIHdyaXRlKSwgdGhlbiByZXNvbHZlcyB0byB0aGUge0BsaW5rIEV4ZWNSZXN1bHR9XG4gKiBvciByZWplY3RzIChzcGF3biBlcnJvciBvdGhlciB0aGFuIGEgbWlzc2luZyBleGVjdXRhYmxlLCBvciBgY2hlY2tgIG9uIG5vbi16ZXJvXG4gKiBleGl0KS4gRXhpc3RpbmcgYGF3YWl0IHNwYXduKC4uLilgIGNhbGxlcnMgYXJlIHVuYWZmZWN0ZWQuIFRoZSBoYW5kbGUgaGFsZiBsZXRzIGFcbiAqIGNhbGxlciBzdXBlcnZpc2UgdGhlIHByb2Nlc3MgKGAucGlkYCwgYC5zaHV0ZG93bigpYCwgYGV4aXRgIGV2ZW50KSB3aXRob3V0IGFcbiAqIHNlY29uZCBzcGF3bi5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIEV4ZWN1dGFibGUgdG8gcnVuIChyZXNvbHZlZCBvbiBgUEFUSGAgd2hlbiBgc2hlbGxgIGlzIHNldCBvbiBvcHRpb25zKVxuICogQHBhcmFtIGFyZ3MgLSBBcmd1bWVudHMgcGFzc2VkIHZlcmJhdGltIHRvIHRoZSBleGVjdXRhYmxlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFNwYXduLCBzdGRpbywgYW5kIGNoZWNrIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRoZSBsaXZlIGBDaGlsZFByb2Nlc3NgLCBhd2FpdGFibGUgdG8gZXhpdCBjb2RlICsgY2FwdHVyZWQgb3V0cHV0XG4gKiBAdGhyb3dzIChvbiB0aGUgcHJvbWlzZSkgV2hlbiBzcGF3biBmYWlscyBmb3IgYSByZWFzb24gb3RoZXIgdGhhbiBhIG1pc3NpbmdcbiAqIGV4ZWN1dGFibGUsIGxpbmUgcmVhZHMgZmFpbCwgb3IgYGNoZWNrYCBpcyB0cnVlIGFuZCBleGl0IGNvZGUgaXMgbm9uLXplcm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXduKC4uLmFyZ3M6IFNwYXduQXJnczxFeGVjT3B0aW9ucz4pOiBDaGlsZFByb2Nlc3NSZXN1bHQge1xuICBjb25zdCB7IGNvbW1hbmQsIGNvbW1hbmRBcmdzLCBvcHRpb25zID0ge30gfSA9IHBhcnNlU3Bhd25BcmdzKGFyZ3MpO1xuICByZWplY3RTaWduYWxPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7XG4gICAgc3RkaW4sXG4gICAgc3Rkb3V0LFxuICAgIHN0ZGVycixcbiAgICBmb3J3YXJkVGVybWluYXRpb25TaWduYWxzID0gdHJ1ZSxcbiAgICB0ZXJtaW5hdGVUaW1lb3V0LFxuICAgIGtpbGxUaW1lb3V0LFxuICAgIGNoZWNrLFxuICAgIHRyaW0sXG4gICAgLi4uc3Bhd25PcHRzXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCB0ZXJtaW5hdGlvbk9wdGlvbnM6IENoaWxkUHJvY2Vzc1Rlcm1pbmF0aW9uT3B0aW9ucyA9IHtcbiAgICB0ZXJtaW5hdGVUaW1lb3V0LFxuICAgIGtpbGxUaW1lb3V0LFxuICB9O1xuICBjb25zdCBzdGRvdXRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc3RkZXJyTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHN0ZG91dEhhbmRsZXIgPSByZXNvbHZlU3RkaW8oc3Rkb3V0LCBzdGRvdXRMaW5lcyk7XG4gIGNvbnN0IHN0ZGVyckhhbmRsZXIgPSByZXNvbHZlU3RkaW8oc3RkZXJyLCBzdGRlcnJMaW5lcyk7XG4gIGNvbnN0IHN0ZGluTW9kZTogRXhlY1N0ZGlvID0gaXNTdGRpblBheWxvYWQoc3RkaW4pID8gXCJwaXBlXCIgOiAoc3RkaW4gPz8gXCJpbmhlcml0XCIpO1xuXG4gIGNvbnN0IHByb2MgPSBub2RlU3Bhd24oY29tbWFuZCwgY29tbWFuZEFyZ3MsIHtcbiAgICAuLi5zcGF3bk9wdHMsXG4gICAgZGV0YWNoZWQ6IHJlc29sdmVEZXRhY2hlZChzcGF3bk9wdHMuZGV0YWNoZWQsIGZvcndhcmRUZXJtaW5hdGlvblNpZ25hbHMpLFxuICAgIHN0ZGlvOiBbc3RkaW5Nb2RlLCBzdGRvdXRIYW5kbGVyLm1vZGUsIHN0ZGVyckhhbmRsZXIubW9kZV0sXG4gIH0pO1xuICBjb25zdCBjaGlsZCA9IGF0dGFjaFByb2Nlc3NDb250cm9scyhwcm9jLCB0ZXJtaW5hdGlvbk9wdGlvbnMpO1xuICBjb25zdCB1bnJlZ2lzdGVyU2lnbmFsRm9yd2FyZGluZyA9IGZvcndhcmRUZXJtaW5hdGlvblNpZ25hbHNcbiAgICA/IHJlZ2lzdGVyUGFyZW50U2lnbmFsRm9yd2FyZGluZyhjaGlsZClcbiAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBzdGRpbldyaXRlID0gd3JpdGVTdGRpbihwcm9jLCBzdGRpbik7XG5cbiAgY29uc3QgcmVhZHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBxdWV1ZUxpbmVSZWFkcyhyZWFkcywgcHJvYy5zdGRvdXQsIHN0ZG91dEhhbmRsZXIpO1xuICBxdWV1ZUxpbmVSZWFkcyhyZWFkcywgcHJvYy5zdGRlcnIsIHN0ZGVyckhhbmRsZXIpO1xuXG4gIGNvbnN0IGNvbXBsZXRpb24gPSAoYXN5bmMgKCk6IFByb21pc2U8RXhlY1Jlc3VsdD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgZXhpdENvZGUgPSAxO1xuICAgICAgbGV0IGNvbW1hbmROb3RGb3VuZEVycm9yOiBOb2RlSlMuRXJybm9FeGNlcHRpb24gfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBleGl0Q29kZSA9IGF3YWl0IHdhaXRGb3JFeGl0KHByb2MpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbc3RkaW5Xcml0ZSwgLi4ucmVhZHNdKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoIWlzQ29tbWFuZE5vdEZvdW5kRXJyb3IoZXJyKSkge1xuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbc3RkaW5Xcml0ZSwgLi4ucmVhZHNdKTtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgcHJvYy5zdGRpbj8uZGVzdHJveSgpO1xuICAgICAgICBwcm9jLnN0ZG91dD8uZGVzdHJveSgpO1xuICAgICAgICBwcm9jLnN0ZGVycj8uZGVzdHJveSgpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3N0ZGluV3JpdGVdKTtcbiAgICAgICAgZm9yIChjb25zdCByZWFkIG9mIHJlYWRzKSB2b2lkIHJlYWQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgY29tbWFuZE5vdEZvdW5kRXJyb3IgPSBlcnI7XG4gICAgICAgIGV4aXRDb2RlID0gQ09NTUFORF9OT1RfRk9VTkRfRVhJVF9DT0RFO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGVFeGVjUmVzdWx0KGV4aXRDb2RlLCBzdGRvdXRMaW5lcywgc3RkZXJyTGluZXMsIHRyaW0pO1xuICAgICAgaWYgKGNoZWNrICYmIHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgICBjb25zdCBlcnIgPSBleGVjRXJyb3IoY29tbWFuZCwgY29tbWFuZEFyZ3MsIHJlc3VsdCk7XG4gICAgICAgIGlmIChjb21tYW5kTm90Rm91bmRFcnJvcikgZXJyLmNhdXNlID0gY29tbWFuZE5vdEZvdW5kRXJyb3I7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHVucmVnaXN0ZXJTaWduYWxGb3J3YXJkaW5nPy4oKTtcbiAgICB9XG4gIH0pKCk7XG5cbiAgLy8gQXR0YWNoIHRoZSBwcm9taXNlIGludGVyZmFjZSBvbnRvIHRoZSBsaXZlIGNoaWxkIHNvIE9ORSBvYmplY3QgaXMgYm90aC4gVGhlXG4gIC8vIG1ldGhvZHMgYXJlIGJvdW5kIHRvIGBjb21wbGV0aW9uYCBzbyBgdGhpc2AgaXMgdGhlIHJlYWwgcHJvbWlzZTsgdGhlIGNoaWxkXG4gIC8vIG93bnMgbm8gY29uZmxpY3RpbmcgYHRoZW5gL2BjYXRjaGAvYGZpbmFsbHlgLCBzbyB0aGlzIGlzIHB1cmVseSBhZGRpdGl2ZS5cbiAgcmV0dXJuIGF0dGFjaFByb21pc2UoY2hpbGQsIGNvbXBsZXRpb24pO1xufVxuXG5mdW5jdGlvbiBhdHRhY2hQcm9jZXNzQ29udHJvbHMoXG4gIGNoaWxkOiBDaGlsZFByb2Nlc3MsXG4gIGRlZmF1bHRzOiBDaGlsZFByb2Nlc3NUZXJtaW5hdGlvbk9wdGlvbnMsXG4pOiBDaGlsZFByb2Nlc3NSZXN1bHQge1xuICBjb25zdCBjb250cm9sbGVkID0gY2hpbGQgYXMgQ2hpbGRQcm9jZXNzUmVzdWx0O1xuICBsZXQgc2h1dGRvd25Qcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBzaHV0ZG93biA9IChcbiAgICBvcHRpb25zOiBDaGlsZFByb2Nlc3NUZXJtaW5hdGlvbk9wdGlvbnMsXG4gICAgdGVybWluYXRlU2lnbmFsID0gREVGQVVMVF9URVJNSU5BVEVfU0lHTkFMLFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZWplY3RTaWduYWxPcHRpb25zKG9wdGlvbnMpO1xuICAgIHNodXRkb3duUHJvbWlzZSA/Pz0gdGVybWluYXRlUHJvY2Vzc1RyZWUoY2hpbGQsIHsgLi4uZGVmYXVsdHMsIC4uLm9wdGlvbnMgfSwgdGVybWluYXRlU2lnbmFsKTtcbiAgICByZXR1cm4gc2h1dGRvd25Qcm9taXNlO1xuICB9O1xuICBjb250cm9sbGVkLnNodXRkb3duID0gKG9wdGlvbnMgPSB7fSkgPT4gc2h1dGRvd24ob3B0aW9ucyk7XG4gIHBhcmVudFNpZ25hbFNodXRkb3ducy5zZXQoY29udHJvbGxlZCwgKHNpZ25hbCkgPT4gc2h1dGRvd24oe30sIHNpZ25hbCkpO1xuICByZXR1cm4gY29udHJvbGxlZDtcbn1cblxuLyoqXG4gKiBBdHRhY2ggYSBwcm9taXNlJ3MgYHRoZW5gIC8gYGNhdGNoYCAvIGBmaW5hbGx5YCBvbnRvIGEgbGl2ZSBvYmplY3QsIHJldHVybmluZ1xuICogdGhlIHNhbWUgb2JqZWN0IHR5cGVkIGFzIGJvdGguIFVzZWQgYnkge0BsaW5rIHNwYXdufSB0byBtYWtlIGl0cyBgQ2hpbGRQcm9jZXNzYFxuICogYXdhaXRhYmxlIHdpdGhvdXQgd3JhcHBpbmcgaXQgLSBzbyBjYWxsZXJzIGtlZXAgdGhlIGxpdmUgaGFuZGxlIEFORCBgYXdhaXRgIGl0LlxuICovXG5mdW5jdGlvbiBhdHRhY2hQcm9taXNlPFQgZXh0ZW5kcyBvYmplY3QsIFI+KHRhcmdldDogVCwgcHJvbWlzZTogUHJvbWlzZTxSPik6IFQgJiBQcm9taXNlPFI+IHtcbiAgY29uc3QgaHlicmlkID0gdGFyZ2V0IGFzIFQgJiBQcm9taXNlPFI+O1xuICBoeWJyaWQudGhlbiA9IHByb21pc2UudGhlbi5iaW5kKHByb21pc2UpO1xuICBoeWJyaWQuY2F0Y2ggPSBwcm9taXNlLmNhdGNoLmJpbmQocHJvbWlzZSk7XG4gIGh5YnJpZC5maW5hbGx5ID0gcHJvbWlzZS5maW5hbGx5LmJpbmQocHJvbWlzZSk7XG4gIHJldHVybiBoeWJyaWQ7XG59XG5cbi8qKlxuICogU3Bhd24gYSBzdWJwcm9jZXNzIHN5bmNocm9ub3VzbHkgYW5kIHdhaXQgZm9yIGV4aXQuXG4gKlxuICogVW5saWtlIHtAbGluayBzcGF3bn0sIHN0ZGlvIG9wdGlvbnMgYXJlIGxpbWl0ZWQgdG8gYFwiaW5oZXJpdFwiYCwgYFwicGlwZVwiYCxcbiAqIGBcImlnbm9yZVwiYCwgYW5kIGBcImNhcHR1cmVcImAg4oCUIG5vIHBlci1saW5lIGNhbGxiYWNrcy5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIEV4ZWN1dGFibGUgdG8gcnVuIChyZXNvbHZlZCBvbiBgUEFUSGAgd2hlbiBgc2hlbGxgIGlzIHNldCBvbiBvcHRpb25zKVxuICogQHBhcmFtIGFyZ3MgLSBBcmd1bWVudHMgcGFzc2VkIHZlcmJhdGltIHRvIHRoZSBleGVjdXRhYmxlXG4gKiBAcGFyYW0gc3Bhd25TeW5jIC0gU3Bhd24sIHN0ZGlvLCBhbmQgY2hlY2sgb3B0aW9uc1xuICogQHJldHVybnMgRXhpdCBjb2RlLCBjYXB0dXJlZCBsaW5lIGFycmF5cywgYW5kIHRyaW1tZWQgYHN0ZG91dGAgLyBgc3RkZXJyYCBnZXR0ZXJzXG4gKiBAdGhyb3dzIFdoZW4gc3Bhd24gZmFpbHMgZm9yIGEgcmVhc29uIG90aGVyIHRoYW4gYSBtaXNzaW5nIGV4ZWN1dGFibGUsIG9yXG4gKiBgY2hlY2tgIGlzIHRydWUgYW5kIGV4aXQgY29kZSBpcyBub24temVyb1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKC4uLmFyZ3M6IFNwYXduQXJnczxTeW5jRXhlY09wdGlvbnM+KTogRXhlY1Jlc3VsdCB7XG4gIGNvbnN0IHsgY29tbWFuZCwgY29tbWFuZEFyZ3MsIG9wdGlvbnMgPSB7fSB9ID0gcGFyc2VTcGF3bkFyZ3MoYXJncyk7XG4gIHJlamVjdFNpZ25hbE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHsgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBjaGVjaywgdHJpbSwgLi4uc3Bhd25PcHRzIH0gPSBvcHRpb25zO1xuICBjb25zdCBzdGRpbk1vZGU6IEV4ZWNTdGRpbyA9IGlzU3RkaW5QYXlsb2FkKHN0ZGluKSA/IFwicGlwZVwiIDogKHN0ZGluID8/IFwiaW5oZXJpdFwiKTtcbiAgY29uc3QgY2FwdHVyZVN0ZG91dCA9IHN0ZG91dCA9PT0gXCJjYXB0dXJlXCI7XG4gIGNvbnN0IGNhcHR1cmVTdGRlcnIgPSBzdGRlcnIgPT09IFwiY2FwdHVyZVwiO1xuICBjb25zdCBzdGRvdXRNb2RlID0gcmVzb2x2ZVN5bmNTdGRpbyhzdGRvdXQpO1xuICBjb25zdCBzdGRlcnJNb2RlID0gcmVzb2x2ZVN5bmNTdGRpbyhzdGRlcnIpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IG5vZGVTcGF3blN5bmMoY29tbWFuZCwgY29tbWFuZEFyZ3MsIHtcbiAgICAuLi5zcGF3bk9wdHMsXG4gICAgZW5jb2Rpbmc6IGNhcHR1cmVTdGRvdXQgfHwgY2FwdHVyZVN0ZGVyciA/IFwidXRmOFwiIDogdW5kZWZpbmVkLFxuICAgIHN0ZGlvOiBbc3RkaW5Nb2RlLCBzdGRvdXRNb2RlLCBzdGRlcnJNb2RlXSxcbiAgICBpbnB1dDogaXNTdGRpblBheWxvYWQoc3RkaW4pID8gc3RkaW4gOiB1bmRlZmluZWQsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbW1hbmROb3RGb3VuZCA9IGlzQ29tbWFuZE5vdEZvdW5kRXJyb3IocmVzdWx0LmVycm9yKTtcbiAgY29uc3QgZXhpdENvZGUgPSBjb21tYW5kTm90Rm91bmQgPyBDT01NQU5EX05PVF9GT1VORF9FWElUX0NPREUgOiAocmVzdWx0LnN0YXR1cyA/PyAxKTtcbiAgY29uc3Qgc3Rkb3V0VGV4dCA9IGNhcHR1cmVTdGRvdXQgPyBjYXB0dXJlZFRleHQocmVzdWx0LnN0ZG91dCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0ZGVyclRleHQgPSBjYXB0dXJlU3RkZXJyID8gY2FwdHVyZWRUZXh0KHJlc3VsdC5zdGRlcnIpIDogdW5kZWZpbmVkO1xuICBjb25zdCBleGVjUmVzdWx0ID0gY3JlYXRlU3luY0V4ZWNSZXN1bHQoZXhpdENvZGUsIHN0ZG91dFRleHQsIHN0ZGVyclRleHQsIHRyaW0pO1xuXG4gIGlmIChyZXN1bHQuZXJyb3IgJiYgKCFjb21tYW5kTm90Rm91bmQgfHwgY2hlY2spKSB7XG4gICAgY29uc3QgZXJyID0gZXhlY0Vycm9yKGNvbW1hbmQsIGNvbW1hbmRBcmdzLCBleGVjUmVzdWx0KTtcbiAgICBlcnIuY2F1c2UgPSByZXN1bHQuZXJyb3I7XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgaWYgKGNoZWNrICYmIGV4ZWNSZXN1bHQuZXhpdENvZGUgIT09IDApIHRocm93IGV4ZWNFcnJvcihjb21tYW5kLCBjb21tYW5kQXJncywgZXhlY1Jlc3VsdCk7XG4gIHJldHVybiBleGVjUmVzdWx0O1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIHNoZWxsLWxpa2UgY29tbWFuZCBpbnRvIGFyZ3YuXG4gKlxuICogU3VwcG9ydHM6XG4gKiAgIC0gd2hpdGVzcGFjZSBzZXBhcmF0b3JzXG4gKiAgIC0gc2luZ2xlIGFuZCBkb3VibGUgcXVvdGVzXG4gKiAgIC0gYmFja3NsYXNoIGVzY2FwaW5nXG4gKiAgIC0gZXNjYXBlZCBzcGFjZXNcbiAqICAgLSBlbXB0eSBxdW90ZWQgc3RyaW5nc1xuICpcbiAqIElmIHRoZSBpbnB1dCBpcyBtYWxmb3JtZWQgKGZvciBleGFtcGxlLCBhbiB1bnRlcm1pbmF0ZWQgcXVvdGUpLFxuICogcmV0dXJucyB0aGUgb3JpZ2luYWwgc3RyaW5nIGFzIGEgc2luZ2xlIGFyZ3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hsZXgoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGxldCBjdXJyZW50ID0gXCJcIjtcbiAgbGV0IHF1b3RlOiBcIidcIiB8ICdcIicgfCB1bmRlZmluZWQ7XG4gIGxldCBlc2NhcGVkID0gZmFsc2U7XG4gIGxldCBxdW90ZWQgPSBmYWxzZTtcblxuICBjb25zdCBwdXNoID0gKCkgPT4ge1xuICAgIGlmIChxdW90ZWQgfHwgY3VycmVudC5sZW5ndGggPiAwKSB7XG4gICAgICBhcmdzLnB1c2goY3VycmVudCk7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBcIlwiO1xuICAgIHF1b3RlZCA9IGZhbHNlO1xuICB9O1xuXG4gIGZvciAoY29uc3QgY2ggb2YgY29tbWFuZCkge1xuICAgIGlmIChlc2NhcGVkKSB7XG4gICAgICBjdXJyZW50ICs9IGNoO1xuICAgICAgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSBcIlxcXFxcIikge1xuICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocXVvdGUpIHtcbiAgICAgIGlmIChjaCA9PT0gcXVvdGUpIHtcbiAgICAgICAgcXVvdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHF1b3RlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50ICs9IGNoO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSBcIidcIiB8fCBjaCA9PT0gJ1wiJykge1xuICAgICAgcXVvdGUgPSBjaDtcbiAgICAgIHF1b3RlZCA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoL1xccy8udGVzdChjaCkpIHtcbiAgICAgIHB1c2goKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGN1cnJlbnQgKz0gY2g7XG4gIH1cblxuICAvLyBNYWxmb3JtZWQgaW5wdXQ6IHRyZWF0IGFzIGEgbGl0ZXJhbCBjb21tYW5kLlxuICBpZiAocXVvdGUpIHtcbiAgICByZXR1cm4gW2NvbW1hbmRdO1xuICB9XG5cbiAgLy8gVHJhaWxpbmcgYmFja3NsYXNoIGlzIGxpdGVyYWwuXG4gIGlmIChlc2NhcGVkKSB7XG4gICAgY3VycmVudCArPSBcIlxcXFxcIjtcbiAgfVxuXG4gIHB1c2goKTtcblxuICByZXR1cm4gYXJncy5sZW5ndGggPyBhcmdzIDogW2NvbW1hbmRdO1xufVxuIl19