footprintjs 8.0.0 → 8.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -28,7 +28,9 @@ const types_js_1 = require("../engine/types.js");
28
28
  const types_js_2 = require("../pause/types.js");
29
29
  const CombinedRecorder_js_1 = require("../recorder/CombinedRecorder.js");
30
30
  const detectCircular_js_1 = require("../scope/detectCircular.js");
31
+ const readonlyInput_js_1 = require("../scope/protection/readonlyInput.js");
31
32
  const ScopeFacade_js_1 = require("../scope/ScopeFacade.js");
33
+ const checkpointSanitize_js_1 = require("./checkpointSanitize.js");
32
34
  const ExecutionRuntime_js_1 = require("./ExecutionRuntime.js");
33
35
  const runId_js_1 = require("./runId.js");
34
36
  const validateInput_js_1 = require("./validateInput.js");
@@ -67,6 +69,16 @@ class FlowChartExecutor {
67
69
  * scope. See `test/lib/pause/cross-executor-resume.test.ts`.
68
70
  */
69
71
  _hasRunBefore = false;
72
+ /**
73
+ * Re-entrancy guard. `run()` and `resume()` mutate per-run instance state
74
+ * (traverser, runId, execution counter, checkpoint) and clear attached
75
+ * recorders — a second concurrent entry on the SAME executor would
76
+ * interleave runIds and cross-contaminate recorder/narrative state, and
77
+ * `getCheckpoint()` would return whichever run paused last. One executor =
78
+ * one in-flight execution; create an executor per concurrent run.
79
+ * See docs/guides/execution-model.md.
80
+ */
81
+ _isExecuting = false;
70
82
  // SYNC REQUIRED: every optional field here must mirror FlowChartExecutorOptions
71
83
  // AND be assigned in the constructor's options-resolution block (the `else if` branch).
72
84
  // Adding a field to only one of the three places causes silent omission.
@@ -278,6 +290,11 @@ class FlowChartExecutor {
278
290
  *
279
291
  * The checkpoint is JSON-serializable — store it in Redis, Postgres, localStorage, etc.
280
292
  *
293
+ * It is fully DETACHED from engine state: every field was deep-copied at
294
+ * pause time (see `buildPauseCheckpoint`). Holding, mutating, or persisting
295
+ * it cannot affect the executor, and a later same-executor resume cannot
296
+ * mutate a checkpoint you already stored.
297
+ *
281
298
  * @example
282
299
  * ```typescript
283
300
  * const result = await executor.run({ input });
@@ -340,8 +357,17 @@ class FlowChartExecutor {
340
357
  * ```
341
358
  */
342
359
  async resume(checkpoint, resumeInput, options) {
343
- this.lastCheckpoint = undefined;
360
+ // Re-entrancy guard FIRST — resume() mutates the same per-run state run()
361
+ // does (traverser, runId, checkpoint), so resume-during-run and
362
+ // double-resume are the same corruption class as concurrent run().
363
+ if (this._isExecuting) {
364
+ throw new Error('FlowChartExecutor: resume() called while another run()/resume() is in flight on this ' +
365
+ 'executor. An executor holds per-run state (runId, recorders, checkpoint) — create ' +
366
+ 'one executor per concurrent run. See docs/guides/execution-model.md.');
367
+ }
344
368
  // ── Validate checkpoint structure (may come from untrusted external storage) ──
369
+ // (lastCheckpoint is wiped AFTER validation — a rejected checkpoint must
370
+ // not destroy the executor's existing checkpoint state.)
345
371
  if (!checkpoint ||
346
372
  typeof checkpoint !== 'object' ||
347
373
  typeof checkpoint.sharedState !== 'object' ||
@@ -366,6 +392,7 @@ class FlowChartExecutor {
366
392
  throw new Error(`Cannot resume: stage '${pausedNode.name}' (${pausedNode.id}) has no resumeFn. ` +
367
393
  'Only stages created with addPausableFunction() can be resumed.');
368
394
  }
395
+ this.lastCheckpoint = undefined;
369
396
  // Build a synthetic resume node: calls resumeFn with resumeInput, then continues.
370
397
  // resumeFn signature is (scope, input) per PausableHandler — wrap to match StageFunction(scope, breakFn).
371
398
  const resumeFn = pausedNode.resumeFn;
@@ -381,7 +408,12 @@ class FlowChartExecutor {
381
408
  // leaf subflow (e.g., the loop target back to `messages`). Search
382
409
  // the leaf subflow first; fall back to top-level for root-level
383
410
  // pauses.
384
- const sfStates = checkpoint.subflowStates;
411
+ // Clone-in: `subflowStates` seeds nested runtimes in SubflowExecutor
412
+ // (shallow-merged into each nested SharedMemory), so without a copy the
413
+ // engine would hold live references into the caller's checkpoint object —
414
+ // caller mutations would bleed into the resumed run and engine writes
415
+ // would reach a checkpoint the caller may have already persisted.
416
+ const sfStates = structuredClone(checkpoint.subflowStates);
385
417
  const leafSubflowId = checkpoint.subflowPath.length > 0 ? checkpoint.subflowPath[checkpoint.subflowPath.length - 1] : undefined;
386
418
  let continuationNext = pausedNode.next;
387
419
  // A branch-sourced loop (`{ loopTo }` / `DeciderList.loopTo`) sets the
@@ -488,7 +520,10 @@ class FlowChartExecutor {
488
520
  subflowsOverride = { ...(fc.subflows ?? {}) };
489
521
  subflowsOverride[leafSubflowId] = { root: innerResumeChain };
490
522
  }
491
- const resumeInitialContext = checkpoint.sharedState;
523
+ // Clone-in for the same reason as `sfStates` above: `initialContext`
524
+ // seeds the fresh SharedMemory via `mergeContextWins`, which copies only
525
+ // the TOP level — nested objects would alias the caller's checkpoint.
526
+ const resumeInitialContext = structuredClone(checkpoint.sharedState);
492
527
  this.traverser = this.createTraverser(options?.signal, undefined, options?.env, options?.maxDepth, {
493
528
  root: resumeRoot,
494
529
  initialContext: resumeInitialContext,
@@ -531,29 +566,94 @@ class FlowChartExecutor {
531
566
  };
532
567
  for (const r of this.scopeRecorders)
533
568
  r.onResume?.(scopeResumeEvent);
569
+ // Set AFTER all sync validation/lookup throws above (nothing can leak the
570
+ // flag); no await between the top-of-method check and here, so race-free.
571
+ this._isExecuting = true;
534
572
  try {
535
573
  return await this.traverser.execute();
536
574
  }
537
575
  catch (error) {
538
576
  if ((0, types_js_2.isPauseSignal)(error)) {
539
- const snapshot = this.traverser.getSnapshot();
540
- const sfResults = this.traverser.getSubflowResults();
541
- this.lastCheckpoint = {
542
- sharedState: snapshot.sharedState,
543
- executionTree: snapshot.executionTree,
544
- pausedStageId: error.stageId,
545
- subflowPath: error.subflowPath,
546
- pauseData: error.pauseData,
547
- subflowStates: error.subflowStates,
548
- ...(sfResults.size > 0 && { subflowResults: Object.fromEntries(sfResults) }),
549
- ...(error.invokerStageId && { invokerStageId: error.invokerStageId }),
550
- ...(error.continuationStageId && { continuationStageId: error.continuationStageId }),
551
- pausedAt: Date.now(),
552
- };
577
+ this.lastCheckpoint = this.buildPauseCheckpoint(error);
553
578
  return { paused: true, checkpoint: this.lastCheckpoint };
554
579
  }
555
580
  throw error;
556
581
  }
582
+ finally {
583
+ this._isExecuting = false;
584
+ }
585
+ }
586
+ /**
587
+ * Build a fully DETACHED checkpoint from a caught PauseSignal.
588
+ *
589
+ * Every field is deep-copied via one `structuredClone` of the assembled
590
+ * checkpoint, because the raw pieces alias live engine state:
591
+ *
592
+ * - `sharedState` IS `SharedMemory`'s internal context object — the alias
593
+ * only detaches at the next commit (`applySmartMerge` rebuilds it), and
594
+ * after a pause there is no next commit until resume.
595
+ * - `executionTree` nodes are fresh, but their `logs`/`errors`/`metrics`/
596
+ * `evals`/`stageReads`/`flowMessages` fields reference live
597
+ * `DiagnosticCollector` bags that keep accumulating on same-executor
598
+ * resume.
599
+ * - `subflowStates` values are shallow copies whose NESTED objects alias
600
+ * subflow memory, and they get seeded back into live runtimes on resume.
601
+ * - `subflowResults` values stay referenced by the traverser's results map.
602
+ *
603
+ * The checkpoint is persisted by contract ("store in Redis/Postgres") — it
604
+ * must never share structure with the engine. Pause is not a hot path; the
605
+ * clone cost is irrelevant.
606
+ *
607
+ * The JSON-safe checkpoint contract (no functions, no class instances)
608
+ * governs CONSUMER-owned data — but the executionTree's diagnostic bags
609
+ * accept ANY value at write time without cloning ($debug/$error/$metric/
610
+ * $eval store raw references), so a contract-compliant run can still carry
611
+ * a non-cloneable diagnostic. Observability side-bags never abort traversal
612
+ * anywhere else in the library, so they must not abort the pause either:
613
+ * on clone failure we sanitize the diagnostic bags (non-cloneable values
614
+ * become '[non-serializable: …]' markers — the live engine bags are never
615
+ * touched) and retry. If the retry STILL fails, the violation is in
616
+ * consumer-owned data (realistically `pauseData` — a function in shared
617
+ * state already rejects at stage entry when TransactionBuffer clones the
618
+ * context) and we throw a DESCRIPTIVE contract error naming the offending
619
+ * checkpoint field(s). A naked DataCloneError never escapes.
620
+ *
621
+ * Subflow scope capture (`subflowStates`) survives ONLY on the signal — the
622
+ * nested runtimes are GC'd as the stack unwinds. Promoting it onto the
623
+ * checkpoint here lets cross-executor resume restore pre-pause subflow
624
+ * scope (e.g. an Agent's `scope.history`). Empty `{}` for root-level pauses.
625
+ */
626
+ buildPauseCheckpoint(signal) {
627
+ const snapshot = this.traverser.getSnapshot();
628
+ const sfResults = this.traverser.getSubflowResults();
629
+ const checkpoint = {
630
+ sharedState: snapshot.sharedState,
631
+ executionTree: snapshot.executionTree,
632
+ pausedStageId: signal.stageId,
633
+ subflowPath: signal.subflowPath,
634
+ pauseData: signal.pauseData,
635
+ subflowStates: signal.subflowStates,
636
+ ...(sfResults.size > 0 && { subflowResults: Object.fromEntries(sfResults) }),
637
+ // Invoker context — collected during traversal bubble-up (not tree-walked)
638
+ ...(signal.invokerStageId && { invokerStageId: signal.invokerStageId }),
639
+ ...(signal.continuationStageId && { continuationStageId: signal.continuationStageId }),
640
+ pausedAt: Date.now(),
641
+ };
642
+ try {
643
+ return structuredClone(checkpoint);
644
+ }
645
+ catch {
646
+ // Non-cloneable diagnostics must not swallow the pause — sanitize the
647
+ // executionTree's bags (markers replace the offenders) and retry.
648
+ try {
649
+ checkpoint.executionTree = (0, checkpointSanitize_js_1.sanitizeDiagnosticBags)(checkpoint.executionTree);
650
+ return structuredClone(checkpoint);
651
+ }
652
+ catch (retryError) {
653
+ // Genuine JSON-safe contract violation in consumer-owned data.
654
+ throw (0, checkpointSanitize_js_1.describeCheckpointCloneFailure)(checkpoint, retryError);
655
+ }
656
+ }
557
657
  }
558
658
  /**
559
659
  * Find a StageNode in the compiled graph by ID.
@@ -876,6 +976,22 @@ class FlowChartExecutor {
876
976
  return recorders.length > 0 ? recorders : undefined;
877
977
  }
878
978
  async run(options) {
979
+ // Re-entrancy guard FIRST — before clearing recorders or touching any
980
+ // per-run field, so a rejected concurrent call leaves the in-flight run
981
+ // completely untouched.
982
+ if (this._isExecuting) {
983
+ throw new Error('FlowChartExecutor: run() called while another run()/resume() is in flight on this ' +
984
+ 'executor. An executor holds per-run state (runId, recorders, checkpoint) — create ' +
985
+ 'one executor per concurrent run. See docs/guides/execution-model.md.');
986
+ }
987
+ // Validate input against inputSchema if both are present. Validation runs
988
+ // BEFORE the timeout timer is created so a rejected input can't leak a
989
+ // pending timer (same "failed entry leaves no side effects" rule as the
990
+ // re-entrancy guard above).
991
+ let validatedInput = options?.input;
992
+ if (validatedInput && this.flowChartArgs.flowChart.inputSchema) {
993
+ validatedInput = (0, validateInput_js_1.validateInput)(this.flowChartArgs.flowChart.inputSchema, validatedInput);
994
+ }
879
995
  let signal = options?.signal;
880
996
  let timeoutId;
881
997
  // Create an internal AbortController for timeoutMs
@@ -884,11 +1000,6 @@ class FlowChartExecutor {
884
1000
  signal = controller.signal;
885
1001
  timeoutId = setTimeout(() => controller.abort(new Error(`Execution timed out after ${options.timeoutMs}ms`)), options.timeoutMs);
886
1002
  }
887
- // Validate input against inputSchema if both are present
888
- let validatedInput = options?.input;
889
- if (validatedInput && this.flowChartArgs.flowChart.inputSchema) {
890
- validatedInput = (0, validateInput_js_1.validateInput)(this.flowChartArgs.flowChart.inputSchema, validatedInput);
891
- }
892
1003
  // User-attached recorders (flowRecorders + scopeRecorders) are cleared via clear() to prevent
893
1004
  // cross-run accumulation. The combinedRecorder is NOT cleared here — createTraverser() always
894
1005
  // creates a fresh CombinedNarrativeRecorder instance on each run, so stale state is never an issue.
@@ -904,38 +1015,24 @@ class FlowChartExecutor {
904
1015
  this._hasRunBefore = true; // mark so a later resume() takes the
905
1016
  // same-executor branch (reuse runtime, accumulate execution tree).
906
1017
  this.traverser = this.createTraverser(signal, validatedInput, options?.env, options?.maxDepth);
1018
+ // Set AFTER all sync validation throws (nothing above can leak the flag);
1019
+ // no await between the top-of-method check and here, so this is race-free.
1020
+ this._isExecuting = true;
907
1021
  try {
908
1022
  return await this.traverser.execute();
909
1023
  }
910
1024
  catch (error) {
911
1025
  if ((0, types_js_2.isPauseSignal)(error)) {
912
- // Build checkpoint from current execution state
913
- const snapshot = this.traverser.getSnapshot();
914
- const sfResults = this.traverser.getSubflowResults();
915
- // Subflow scope capture survives ONLY on the signal — the
916
- // nested runtimes are GC'd as the stack unwinds. Promote to
917
- // the checkpoint here so cross-executor resume can restore
918
- // pre-pause subflow scope (e.g. an Agent's `scope.history`).
919
- // Empty `{}` for root-level pauses (no subflows entered).
920
- this.lastCheckpoint = {
921
- sharedState: snapshot.sharedState,
922
- executionTree: snapshot.executionTree,
923
- pausedStageId: error.stageId,
924
- subflowPath: error.subflowPath,
925
- pauseData: error.pauseData,
926
- subflowStates: error.subflowStates,
927
- ...(sfResults.size > 0 && { subflowResults: Object.fromEntries(sfResults) }),
928
- // Invoker context — collected during traversal bubble-up (not tree-walked)
929
- ...(error.invokerStageId && { invokerStageId: error.invokerStageId }),
930
- ...(error.continuationStageId && { continuationStageId: error.continuationStageId }),
931
- pausedAt: Date.now(),
932
- };
1026
+ // Build a detached checkpoint from current execution state — see
1027
+ // buildPauseCheckpoint() for the deep-copy rationale.
1028
+ this.lastCheckpoint = this.buildPauseCheckpoint(error);
933
1029
  // Return a PauseResult-shaped value so callers can check without try/catch
934
1030
  return { paused: true, checkpoint: this.lastCheckpoint };
935
1031
  }
936
1032
  throw error;
937
1033
  }
938
1034
  finally {
1035
+ this._isExecuting = false;
939
1036
  if (timeoutId !== undefined)
940
1037
  clearTimeout(timeoutId);
941
1038
  }
@@ -953,9 +1050,25 @@ class FlowChartExecutor {
953
1050
  *
954
1051
  * The commit log is already redacted at write-time regardless of this
955
1052
  * flag, and the execution tree carries only structural metadata.
1053
+ *
1054
+ * **Treat `sharedState` as READ-ONLY.** In production it is a live view of
1055
+ * the engine's working memory (zero copy cost) — mutating it corrupts
1056
+ * engine state. In dev mode (`enableDevMode()`) it is a deep-frozen CLONE,
1057
+ * so any consumer mutation throws loudly instead of corrupting silently.
956
1058
  */
957
1059
  getSnapshot(options) {
958
1060
  const snapshot = this.traverser.getSnapshot(options);
1061
+ if ((0, detectCircular_js_1.isDevMode)()) {
1062
+ // Dev-mode mutation guard: freeze a CLONE, never the live engine
1063
+ // state — `snapshot.sharedState` aliases SharedMemory's internal
1064
+ // context until the next commit rebuilds it (post-run: forever).
1065
+ // Production stays zero-copy; clone-always is a measured decision
1066
+ // deferred until the bench says it's affordable (BACKLOG #8).
1067
+ // NOTE: deepFreeze (reused from readonlyInput) freezes plain objects/
1068
+ // arrays only — Map/Set INTERNALS stay mutable (`map.set()` on the
1069
+ // frozen clone won't throw). The CLONE still isolates the engine.
1070
+ snapshot.sharedState = (0, readonlyInput_js_1.deepFreeze)(structuredClone(snapshot.sharedState));
1071
+ }
959
1072
  const sfResults = this.traverser.getSubflowResults();
960
1073
  if (sfResults.size > 0) {
961
1074
  snapshot.subflowResults = Object.fromEntries(sfResults);
@@ -1033,4 +1146,4 @@ class FlowChartExecutor {
1033
1146
  }
1034
1147
  }
1035
1148
  exports.FlowChartExecutor = FlowChartExecutor;
1036
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHOzs7QUFHSCxpREFBb0g7QUFFcEgsbUdBQTZGO0FBRzdGLG1HQUE2RjtBQUU3RixtRUFBa0U7QUFDbEUscUZBQStFO0FBQy9FLGlEQVc0QjtBQUU1QixnREFBa0Q7QUFFbEQseUVBQXFIO0FBRXJILGtFQUF1RDtBQUV2RCw0REFBc0Q7QUFFdEQsK0RBQXNHO0FBQ3RHLHlDQUEyQztBQUMzQyx5REFBbUQ7QUFFbkQsMEVBQTBFO0FBQzFFLE1BQU0sbUJBQW1CLEdBQWlCLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FDMUUsSUFBSSw0QkFBVyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBeURqRCxNQUFhLGlCQUFpQjtJQUNwQixTQUFTLENBQW1DO0lBQ3BELDhFQUE4RTtJQUN0RSxpQkFBaUIsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN6Qzs7K0JBRTJCO0lBQ25CLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDbkIsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLGdCQUFnQixDQUFvQztJQUNwRCxnQkFBZ0IsQ0FBd0M7SUFDeEQsYUFBYSxHQUFtQixFQUFFLENBQUM7SUFDbkMsY0FBYyxHQUFvQixFQUFFLENBQUM7SUFDckMsZUFBZSxDQUE4QjtJQUM3QyxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3ZDLHlCQUF5QixHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO0lBQzNELGNBQWMsQ0FBa0M7SUFDeEQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSyxhQUFhLEdBQUcs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Q29udGVudCI6WyIvKipcbiAqIEZsb3dDaGFydEV4ZWN1dG9yIOKAlCBQdWJsaWMgQVBJIGZvciBleGVjdXRpbmcgYSBjb21waWxlZCBGbG93Q2hhcnQuXG4gKlxuICogV3JhcHMgRmxvd2NoYXJ0VHJhdmVyc2VyLiBCdWlsZCBhIGNoYXJ0IHdpdGggZmxvd0NoYXJ0KCkgYW5kIHBhc3MgdGhlIHJlc3VsdCBoZXJlOlxuICpcbiAqICAgY29uc3QgY2hhcnQgPSBmbG93Q2hhcnQoJ2VudHJ5JywgZW50cnlGbikuYWRkRnVuY3Rpb24oJ3Byb2Nlc3MnLCBwcm9jZXNzRm4pLmJ1aWxkKCk7XG4gKlxuICogICAvLyBOby1vcHRpb25zIGZvcm0gKHVzZXMgYXV0by1kZXRlY3RlZCBUeXBlZFNjb3BlIGZhY3RvcnkgZnJvbSB0aGUgY2hhcnQpOlxuICogICBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCk7XG4gKlxuICogICAvLyBPcHRpb25zLW9iamVjdCBmb3JtIChwcmVmZXJyZWQgd2hlbiB5b3UgbmVlZCB0byBjdXN0b21pemUgYmVoYXZpb3IpOlxuICogICBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzY29wZUZhY3Rvcnk6IG15RmFjdG9yeSB9KTtcbiAqXG4gKiAgIC8vIDItcGFyYW0gZm9ybSAoYWNjZXB0cyBhIFNjb3BlRmFjdG9yeSBkaXJlY3RseSwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpOlxuICogICBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgbXlGYWN0b3J5KTtcbiAqXG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0OiBkYXRhLCBlbnY6IHsgdHJhY2VJZDogJ3JlcS0xMjMnIH0gfSk7XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBGbG93Q2hhcnQgfSBmcm9tICcuLi9idWlsZGVyL3R5cGVzLmpzJztcbmltcG9ydCB7IGRldGFjaEFuZEZvcmdldCBhcyBfZGV0YWNoQW5kRm9yZ2V0LCBkZXRhY2hBbmRKb2luTGF0ZXIgYXMgX2RldGFjaEFuZEpvaW5MYXRlciB9IGZyb20gJy4uL2RldGFjaC9zcGF3bi5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLmpzJztcbmltcG9ydCB7IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9uYXJyYXRpdmVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0RW50cnkgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3JlY29yZGVycy9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBNYW5pZmVzdEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvcmVjb3JkZXJzL01hbmlmZXN0Rmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBidWlsZFJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnLi4vZW5naW5lL3J1bnRpbWVTdGFnZUlkLmpzJztcbmltcG9ydCB7IEZsb3djaGFydFRyYXZlcnNlciB9IGZyb20gJy4uL2VuZ2luZS90cmF2ZXJzYWwvRmxvd2NoYXJ0VHJhdmVyc2VyLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRXhlY3V0b3JSZXN1bHQsXG4gIHR5cGUgUGF1c2VkUmVzdWx0LFxuICB0eXBlIFJ1bk9wdGlvbnMsXG4gIHR5cGUgU2NvcGVGYWN0b3J5LFxuICB0eXBlIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgdHlwZSBTdGFnZU5vZGUsXG4gIHR5cGUgU3RyZWFtSGFuZGxlcnMsXG4gIHR5cGUgU3ViZmxvd1Jlc3VsdCxcbiAgdHlwZSBUcmF2ZXJzYWxSZXN1bHQsXG4gIGRlZmF1bHRMb2dnZXIsXG59IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBoYXNFbWl0UmVjb3JkZXJNZXRob2RzLCBoYXNGbG93UmVjb3JkZXJNZXRob2RzLCBoYXNSZWNvcmRlck1ldGhvZHMgfSBmcm9tICcuLi9yZWNvcmRlci9Db21iaW5lZFJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvRW1pdFJlY29yZGVyLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVQcm90ZWN0aW9uTW9kZSB9IGZyb20gJy4uL3Njb3BlL3Byb3RlY3Rpb24vdHlwZXMuanMnO1xuaW1wb3J0IHsgU2NvcGVGYWNhZGUgfSBmcm9tICcuLi9zY29wZS9TY29wZUZhY2FkZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblBvbGljeSwgUmVkYWN0aW9uUmVwb3J0LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBSZWNvcmRlclNuYXBzaG90LCB0eXBlIFJ1bnRpbWVTbmFwc2hvdCwgRXhlY3V0aW9uUnVudGltZSB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJ1bklkIH0gZnJvbSAnLi9ydW5JZC5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUlucHV0IH0gZnJvbSAnLi92YWxpZGF0ZUlucHV0LmpzJztcblxuLyoqIERlZmF1bHQgc2NvcGUgZmFjdG9yeSDigJQgY3JlYXRlcyBhIHBsYWluIFNjb3BlRmFjYWRlIGZvciBlYWNoIHN0YWdlLiAqL1xuY29uc3QgZGVmYXVsdFNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5ID0gKGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52KSA9PlxuICBuZXcgU2NvcGVGYWNhZGUoY3R4LCBzdGFnZU5hbWUsIHJlYWRPbmx5LCBlbnYpO1xuXG4vKipcbiAqIE9wdGlvbnMgb2JqZWN0IGZvciBgRmxvd0NoYXJ0RXhlY3V0b3JgIOKAlCBwcmVmZXJyZWQgb3ZlciBwb3NpdGlvbmFsIHBhcmFtcy5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBleCA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwge1xuICogICBzY29wZUZhY3Rvcnk6IG15RmFjdG9yeSxcbiAqICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ6IHsgLi4uIH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICoqU3luYyBub3RlIGZvciBtYWludGFpbmVyczoqKiBFdmVyeSBmaWVsZCBhZGRlZCBoZXJlIG11c3QgYWxzbyBhcHBlYXIgaW4gdGhlXG4gKiBgZmxvd0NoYXJ0QXJnc2AgcHJpdmF0ZSBmaWVsZCB0eXBlIGFuZCBpbiB0aGUgY29uc3RydWN0b3IncyBvcHRpb25zLXJlc29sdXRpb25cbiAqIGJsb2NrICh0aGUgYGVsc2UgaWZgIGJyYW5jaCB0aGF0IHJlYWRzIGZyb20gYG9wdHNgKS4gTWlzc2luZyBhbnkgb25lIG9mIHRoZVxuICogdGhyZWUgY2F1c2VzIHNpbGVudCBvbWlzc2lvbiDigJQgdGhlIG9wdGlvbiBpcyBhY2NlcHRlZCBidXQgbmV2ZXIgYXBwbGllZC5cbiAqXG4gKiAqKlRTY29wZSBpbmZlcmVuY2Ugbm90ZToqKiBXaGVuIHVzaW5nIHRoZSBvcHRpb25zLW9iamVjdCBmb3JtIHdpdGggYSBjdXN0b20gc2NvcGUsXG4gKiBUeXBlU2NyaXB0IGNhbm5vdCBpbmZlciBgVFNjb3BlYCB0aHJvdWdoIHRoZSBvcHRpb25zIG9iamVjdC4gUGFzcyB0aGUgdHlwZVxuICogZXhwbGljaXRseTogYG5ldyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0LCBNeVNjb3BlPihjaGFydCwgeyBzY29wZUZhY3RvcnkgfSlgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGUgPSBhbnk+IHtcbiAgLy8g4pSA4pSAIENvbW1vbiBvcHRpb25zIChtb3N0IGNhbGxlcnMgbmVlZCBvbmx5IHRoZXNlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQ3VzdG9tIHNjb3BlIGZhY3RvcnkuIERlZmF1bHRzIHRvIFR5cGVkU2NvcGUgb3IgU2NvcGVGYWNhZGUgYXV0by1kZXRlY3Rpb24uICovXG4gIHNjb3BlRmFjdG9yeT86IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuXG4gIC8vIOKUgOKUgCBDb250ZXh0IG9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIHByZS1wb3B1bGF0ZWQgaW50byB0aGUgc2hhcmVkIGNvbnRleHQgYmVmb3JlICoqZWFjaCoqIHN0YWdlXG4gICAqIChyZS1hcHBsaWVkIGV2ZXJ5IHN0YWdlLCBhY3RpbmcgYXMgYmFzZWxpbmUgZGVmYXVsdHMpLlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ/OiB1bmtub3duO1xuICAvKipcbiAgICogSW5pdGlhbCBjb250ZXh0IHZhbHVlcyBtZXJnZWQgaW50byB0aGUgc2hhcmVkIGNvbnRleHQgKipvbmNlKiogYXQgc3RhcnR1cFxuICAgKiAoYXBwbGllZCBiZWZvcmUgdGhlIGZpcnN0IHN0YWdlLCBub3QgcmVwZWF0ZWQgb24gc3Vic2VxdWVudCBzdGFnZXMpLlxuICAgKiBEaXN0aW5jdCBmcm9tIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAsIHdoaWNoIGlzIHJlLWFwcGxpZWQgZXZlcnkgc3RhZ2UuXG4gICAqL1xuICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gIC8qKiBSZWFkLW9ubHkgaW5wdXQgYWNjZXNzaWJsZSB2aWEgYHNjb3BlLmdldEFyZ3MoKWAg4oCUIG5ldmVyIHRyYWNrZWQgb3Igd3JpdHRlbi4gKi9cbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcblxuICAvLyDilIDilIAgQWR2YW5jZWQgLyBlc2NhcGUtaGF0Y2ggb3B0aW9ucyAobW9zdCBjYWxsZXJzIGRvIG5vdCBuZWVkIHRoZXNlKSDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIGNsYXNzaWZpZXIgZm9yIHRocm90dGxpbmcgZGV0ZWN0aW9uLiBSZXR1cm4gYHRydWVgIGlmIHRoZVxuICAgKiBlcnJvciByZXByZXNlbnRzIGEgcmF0ZS1saW1pdCBvciBiYWNrcHJlc3N1cmUgY29uZGl0aW9uICh0aGUgZXhlY3V0b3Igd2lsbFxuICAgKiB0cmVhdCBpdCBkaWZmZXJlbnRseSBmcm9tIGhhcmQgZmFpbHVyZXMpLiBEZWZhdWx0cyB0byBubyB0aHJvdHRsaW5nIGNsYXNzaWZpY2F0aW9uLlxuICAgKi9cbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgLyoqIEhhbmRsZXJzIGZvciBzdHJlYW1pbmcgc3RhZ2UgbGlmZWN5Y2xlIGV2ZW50cyAoc2VlIGBhZGRTdHJlYW1pbmdGdW5jdGlvbmApLiAqL1xuICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAvKiogU2NvcGUgcHJvdGVjdGlvbiBtb2RlIGZvciBUeXBlZFNjb3BlIGRpcmVjdC1hc3NpZ25tZW50IGRldGVjdGlvbi4gKi9cbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG59XG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSB0cmF2ZXJzZXI6IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+O1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIOKAlCBzdXJ2aXZlcyBwYXVzZS9yZXN1bWUuIFJlc2V0IG9uIGZyZXNoIHJ1bigpLiAqL1xuICBwcml2YXRlIF9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9O1xuICAvKiogUGVyLWBydW4oKWAgaWRlbnRpZmllciDigJQgZ2VuZXJhdGVkIGZyZXNoIHBlciBydW4gKyBwZXIgcmVzdW1lLiBUaHJlYWRlZFxuICAgKiAgdGhyb3VnaCBldmVyeSBUcmF2ZXJzYWxDb250ZXh0IHNvIHJlY29yZGVycyBjYW4gc2NvcGUgc3RhdGUgdG8gYSBzaW5nbGVcbiAgICogIHJ1bi4gU2VlIGBydW5JZC50c2AuICovXG4gIHByaXZhdGUgX2N1cnJlbnRSdW5JZCA9ICcnO1xuICBwcml2YXRlIG5hcnJhdGl2ZUVuYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBuYXJyYXRpdmVPcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnM7XG4gIHByaXZhdGUgY29tYmluZWRSZWNvcmRlcjogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBmbG93UmVjb3JkZXJzOiBGbG93UmVjb3JkZXJbXSA9IFtdO1xuICBwcml2YXRlIHNjb3BlUmVjb3JkZXJzOiBTY29wZVJlY29yZGVyW10gPSBbXTtcbiAgcHJpdmF0ZSByZWRhY3Rpb25Qb2xpY3k6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzaGFyZWRSZWRhY3RlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICBwcml2YXRlIGxhc3RDaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogYHRydWVgIG9uY2UgYHJ1bigpYCAob3IgYSBwcmV2aW91cyBgcmVzdW1lKClgKSBoYXMgZXhlY3V0ZWQgb25cbiAgICogdGhpcyBpbnN0YW5jZS4gYHJlc3VtZSgpYCBicmFuY2hlcyBvbiBpdDpcbiAgICpcbiAgICogICDigKIgdHJ1ZSAg4oaSIHJldXNlIHRoZSBjb25zdHJ1Y3Rvci10aW1lIHJ1bnRpbWUgKHNhbWUtZXhlY3V0b3JcbiAgICogICAgICAgICAgICAgY29udGludWl0eTogZXhlY3V0aW9uIHRyZWUsIHJlY29yZGVycywgbmFycmF0aXZlXG4gICAqICAgICAgICAgICAgIGFjY3VtdWxhdGUgYWNyb3NzIHBhdXNlL3Jlc3VtZSBjeWNsZXMpXG4gICAqICAg4oCiIGZhbHNlIOKGkiBzZWVkIGEgZnJlc2ggcnVudGltZSBmcm9tIGBjaGVja3BvaW50LnNoYXJlZFN0YXRlYFxuICAgKiAgICAgICAgICAgICAoY3Jvc3MtZXhlY3V0b3IgLyBjcm9zcy1wcm9jZXNzIHJlc3VtZTogbmV3IGluc3RhbmNlXG4gICAqICAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgZnJvbSBhIHNlcmlhbGl6ZWQgY2hlY2twb2ludClcbiAgICpcbiAgICogV2l0aG91dCB0aGlzIGZsYWcsIGZyZXNoIGV4ZWN1dG9ycyBzaWxlbnRseSBkaXNjYXJkZWQgdGhlXG4gICAqIGNoZWNrcG9pbnQncyBzaGFyZWRTdGF0ZSBhbmQgcmVzdW1lIGhhbmRsZXJzIGNvdWxkbid0IHJlYWQgcHJlLXBhdXNlXG4gICAqIHNjb3BlLiBTZWUgYHRlc3QvbGliL3BhdXNlL2Nyb3NzLWV4ZWN1dG9yLXJlc3VtZS50ZXN0LnRzYC5cbiAgICovXG4gIHByaXZhdGUgX2hhc1J1bkJlZm9yZSA9IGZhbHNlO1xuXG4gIC8vIFNZTkMgUkVRVUlSRUQ6IGV2ZXJ5IG9wdGlvbmFsIGZpZWxkIGhlcmUgbXVzdCBtaXJyb3IgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zXG4gIC8vIEFORCBiZSBhc3NpZ25lZCBpbiB0aGUgY29uc3RydWN0b3IncyBvcHRpb25zLXJlc29sdXRpb24gYmxvY2sgKHRoZSBgZWxzZSBpZmAgYnJhbmNoKS5cbiAgLy8gQWRkaW5nIGEgZmllbGQgdG8gb25seSBvbmUgb2YgdGhlIHRocmVlIHBsYWNlcyBjYXVzZXMgc2lsZW50IG9taXNzaW9uLlxuICBwcml2YXRlIHJlYWRvbmx5IGZsb3dDaGFydEFyZ3M6IHtcbiAgICBmbG93Q2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+O1xuICAgIHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT47XG4gICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ/OiB1bmtub3duO1xuICAgIGluaXRpYWxDb250ZXh0PzogdW5rbm93bjtcbiAgICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gICAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgICBzY29wZVByb3RlY3Rpb25Nb2RlPzogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgRmxvd0NoYXJ0RXhlY3V0b3IuXG4gICAqXG4gICAqICoqT3B0aW9ucyBvYmplY3QgZm9ybSoqIChwcmVmZXJyZWQpOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzY29wZUZhY3RvcnksIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0IH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiAqKjItcGFyYW0gZm9ybSoqIChhbHNvIHN1cHBvcnRlZCk6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCBzY29wZUZhY3RvcnkpXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gZmxvd0NoYXJ0IC0gVGhlIGNvbXBpbGVkIEZsb3dDaGFydCByZXR1cm5lZCBieSBgZmxvd0NoYXJ0KC4uLikuYnVpbGQoKWBcbiAgICogQHBhcmFtIGZhY3RvcnlPck9wdGlvbnMgLSBBIGBTY29wZUZhY3Rvcnk8VFNjb3BlPmAgT1IgYSBgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZT5gIG9wdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZmxvd0NoYXJ0OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBmYWN0b3J5T3JPcHRpb25zPzogU2NvcGVGYWN0b3J5PFRTY29wZT4gfCBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlPixcbiAgKSB7XG4gICAgLy8gRGV0ZWN0IG9wdGlvbnMtb2JqZWN0IGZvcm0gdnMgZmFjdG9yeSBmb3JtXG4gICAgbGV0IHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCBpbml0aWFsQ29udGV4dDogdW5rbm93bjtcbiAgICBsZXQgcmVhZE9ubHlDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiAoKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RyZWFtSGFuZGxlcnM6IFN0cmVhbUhhbmRsZXJzIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzY29wZVByb3RlY3Rpb25Nb2RlOiBTY29wZVByb3RlY3Rpb25Nb2RlIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiBmYWN0b3J5T3JPcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyAyLXBhcmFtIGZvcm06IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgc2NvcGVGYWN0b3J5KVxuICAgICAgc2NvcGVGYWN0b3J5ID0gZmFjdG9yeU9yT3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKGZhY3RvcnlPck9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT3B0aW9ucyBvYmplY3QgZm9ybVxuICAgICAgY29uc3Qgb3B0cyA9IGZhY3RvcnlPck9wdGlvbnM7XG4gICAgICBzY29wZUZhY3RvcnkgPSBvcHRzLnNjb3BlRmFjdG9yeTtcbiAgICAgIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0ID0gb3B0cy5kZWZhdWx0VmFsdWVzRm9yQ29udGV4dDtcbiAgICAgIGluaXRpYWxDb250ZXh0ID0gb3B0cy5pbml0aWFsQ29udGV4dDtcbiAgICAgIHJlYWRPbmx5Q29udGV4dCA9IG9wdHMucmVhZE9ubHlDb250ZXh0O1xuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlciA9IG9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjtcbiAgICAgIHN0cmVhbUhhbmRsZXJzID0gb3B0cy5zdHJlYW1IYW5kbGVycztcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGUgPSBvcHRzLnNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gICAgfVxuICAgIHRoaXMuZmxvd0NoYXJ0QXJncyA9IHtcbiAgICAgIGZsb3dDaGFydCxcbiAgICAgIHNjb3BlRmFjdG9yeTogc2NvcGVGYWN0b3J5ID8/IGZsb3dDaGFydC5zY29wZUZhY3RvcnkgPz8gKGRlZmF1bHRTY29wZUZhY3RvcnkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT4pLFxuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsXG4gICAgICBpbml0aWFsQ29udGV4dCxcbiAgICAgIHJlYWRPbmx5Q29udGV4dCxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVycyxcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgfTtcbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRyYXZlcnNlcihcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICByZWFkT25seUNvbnRleHRPdmVycmlkZT86IHVua25vd24sXG4gICAgZW52PzogaW1wb3J0KCcuLi9lbmdpbmUvdHlwZXMnKS5FeGVjdXRpb25FbnYsXG4gICAgbWF4RGVwdGg/OiBudW1iZXIsXG4gICAgb3ZlcnJpZGVzPzoge1xuICAgICAgcm9vdD86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgICAgcHJlc2VydmVSZWNvcmRlcnM/OiBib29sZWFuO1xuICAgICAgZXhpc3RpbmdSdW50aW1lPzogSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPjtcbiAgICAgIC8qKiBQZXItc3ViZmxvdyBzY29wZSBjYXB0dXJlcyBmcm9tIGEgY2hlY2twb2ludCDigJQgcGFzc2VkIHRocm91Z2hcbiAgICAgICAqICB0byBIYW5kbGVyRGVwcyBzbyBTdWJmbG93RXhlY3V0b3IgY2FuIHJlLXNlZWQgbmVzdGVkIHJ1bnRpbWVzXG4gICAgICAgKiAgb24gdGhlIHJlc3VtZSBwYXRoLiBVbmRlZmluZWQgb24gbm9ybWFsIHJ1bigpIHBhdGhzLiAqL1xuICAgICAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZT86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgICAgIC8qKiBSZXN1bWUtb25seSBvdmVycmlkZSBvZiB0aGUgc3ViZmxvd3MgZGljdCDigJQgc3Vic3RpdHV0ZXMgdGhlXG4gICAgICAgKiAgbGVhZiBzdWJmbG93J3Mgcm9vdCB3aXRoIGEgcmVzdW1lIGNoYWluIHNvIHRoZSBzdWJmbG93IGJvZHlcbiAgICAgICAqICBwaWNrcyB1cCBhdCB0aGUgcGF1c2UgcG9pbnQuIE90aGVyIGVudHJpZXMgcGFzcyB0aHJvdWdoXG4gICAgICAgKiAgdW5jaGFuZ2VkLiAqL1xuICAgICAgc3ViZmxvd3NPdmVycmlkZT86IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT47XG4gICAgfSxcbiAgKTogRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmZsb3dDaGFydEFyZ3M7XG4gICAgY29uc3QgZmMgPSBhcmdzLmZsb3dDaGFydDtcbiAgICBjb25zdCBuYXJyYXRpdmVGbGFnID0gdGhpcy5uYXJyYXRpdmVFbmFibGVkIHx8IChmYy5lbmFibGVOYXJyYXRpdmUgPz8gZmFsc2UpO1xuXG4gICAgLy8g4pSA4pSAIENvbXBvc2VkIHNjb3BlIGZhY3Rvcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgLy8gQ29sbGVjdCBhbGwgc2NvcGUgbW9kaWZpZXJzIChyZWNvcmRlcnMsIHJlZGFjdGlvbikgaW50byBhIHNpbmdsZSBsaXN0LFxuICAgIC8vIHRoZW4gY3JlYXRlIE9ORSBmYWN0b3J5IHRoYXQgYXBwbGllcyB0aGVtIGluIGEgbG9vcC4gUmVwbGFjZXMgdGhlXG4gICAgLy8gcHJldmlvdXMgNC1kZWVwIGNsb3N1cmUgbmVzdGluZyB3aXRoIGEgZmxhdCwgZGVidWdnYWJsZSBjb21wb3NpdGlvbi5cblxuICAgIGlmIChvdmVycmlkZXM/LnByZXNlcnZlUmVjb3JkZXJzKSB7XG4gICAgICAvLyBSZXN1bWUgbW9kZToga2VlcCBleGlzdGluZyBjb21iaW5lZFJlY29yZGVyIHNvIG5hcnJhdGl2ZSBhY2N1bXVsYXRlc1xuICAgIH0gZWxzZSBpZiAobmFycmF0aXZlRmxhZykge1xuICAgICAgdGhpcy5jb21iaW5lZFJlY29yZGVyID0gbmV3IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIodGhpcy5uYXJyYXRpdmVPcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb21iaW5lZFJlY29yZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuc2hhcmVkUmVkYWN0ZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuXG4gICAgLy8gQnVpbGQgbW9kaWZpZXIgbGlzdCDigJQgZWFjaCBtb2RpZmllciByZWNlaXZlcyB0aGUgc2NvcGUgYWZ0ZXIgY3JlYXRpb25cbiAgICB0eXBlIFNjb3BlTW9kaWZpZXIgPSAoc2NvcGU6IGFueSkgPT4gdm9pZDtcbiAgICBjb25zdCBtb2RpZmllcnM6IFNjb3BlTW9kaWZpZXJbXSA9IFtdO1xuXG4gICAgLy8gMS4gTmFycmF0aXZlIHJlY29yZGVyIChpZiBlbmFibGVkKVxuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5jb21iaW5lZFJlY29yZGVyO1xuICAgICAgbW9kaWZpZXJzLnB1c2goKHNjb3BlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGUuYXR0YWNoU2NvcGVSZWNvcmRlciA9PT0gJ2Z1bmN0aW9uJykgc2NvcGUuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAyLiBVc2VyLXByb3ZpZGVkIHNjb3BlIHJlY29yZGVyc1xuICAgIGlmICh0aGlzLnNjb3BlUmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnM7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZm9yIChjb25zdCByIG9mIHJlY29yZGVycykgc2NvcGUuYXR0YWNoU2NvcGVSZWNvcmRlcihyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gMy4gUmVkYWN0aW9uIHBvbGljeSAoY29uZGl0aW9uYWwg4oCUIG9ubHkgd2hlbiBwb2xpY3kgaXMgc2V0KVxuICAgIGlmICh0aGlzLnJlZGFjdGlvblBvbGljeSkge1xuICAgICAgY29uc3QgcG9saWN5ID0gdGhpcy5yZWRhY3Rpb25Qb2xpY3k7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS51c2VSZWRhY3Rpb25Qb2xpY3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzY29wZS51c2VSZWRhY3Rpb25Qb2xpY3kocG9saWN5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBQcmUtcG9wdWxhdGUgZXhlY3V0b3ItbGV2ZWwgZmllbGQgcmVkYWN0aW9uIG1hcCBmcm9tIHBvbGljeVxuICAgICAgLy8gc28gZ2V0UmVkYWN0aW9uUmVwb3J0KCkgaW5jbHVkZXMgZmllbGQtbGV2ZWwgcmVkYWN0aW9ucy5cbiAgICAgIGlmIChwb2xpY3kuZmllbGRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiBPYmplY3QuZW50cmllcyhwb2xpY3kuZmllbGRzKSkge1xuICAgICAgICAgIHRoaXMuc2hhcmVkUmVkYWN0ZWRGaWVsZHNCeUtleS5zZXQoa2V5LCBuZXcgU2V0KGZpZWxkcykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tcG9zZTogYmFzZSBmYWN0b3J5ICsgbW9kaWZpZXJzIGluIGEgc2luZ2xlIHBhc3MuXG4gICAgLy8gU2hhcmVkIHJlZGFjdGVkIGtleXMgYXJlIEFMV0FZUyB3aXJlZCB1cCAodW5jb25kaXRpb25hbCDigJQgZW5zdXJlcyBjcm9zcy1zdGFnZVxuICAgIC8vIHByb3BhZ2F0aW9uIGV2ZW4gd2l0aG91dCBhIHBvbGljeSwgYmVjYXVzZSBzdGFnZXMgY2FuIGNhbGwgc2V0VmFsdWUoa2V5LCB2YWwsIHRydWUpXG4gICAgLy8gZm9yIHBlci1jYWxsIHJlZGFjdGlvbikuIE9wdGlvbmFsIG1vZGlmaWVycyAocmVjb3JkZXJzLCBwb2xpY3kpIGFyZSBpbiB0aGUgbGlzdC5cbiAgICBjb25zdCBiYXNlRmFjdG9yeSA9IGFyZ3Muc2NvcGVGYWN0b3J5O1xuICAgIGNvbnN0IHNoYXJlZFJlZGFjdGVkS2V5cyA9IHRoaXMuc2hhcmVkUmVkYWN0ZWRLZXlzO1xuICAgIGNvbnN0IHNjb3BlRmFjdG9yeSA9ICgoY3R4OiBhbnksIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seT86IHVua25vd24sIGVudkFyZz86IGFueSkgPT4ge1xuICAgICAgY29uc3Qgc2NvcGUgPSBiYXNlRmFjdG9yeShjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHksIGVudkFyZyk7XG4gICAgICAvLyBBbHdheXMgd2lyZSBzaGFyZWQgcmVkYWN0aW9uIHN0YXRlXG4gICAgICBpZiAodHlwZW9mIChzY29wZSBhcyBhbnkpLnVzZVNoYXJlZFJlZGFjdGVkS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAoc2NvcGUgYXMgYW55KS51c2VTaGFyZWRSZWRhY3RlZEtleXMoc2hhcmVkUmVkYWN0ZWRLZXlzKTtcbiAgICAgIH1cbiAgICAgIC8vIEFwcGx5IG9wdGlvbmFsIG1vZGlmaWVyc1xuICAgICAgZm9yIChjb25zdCBtb2Qgb2YgbW9kaWZpZXJzKSBtb2Qoc2NvcGUpO1xuICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH0pIGFzIFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuXG4gICAgY29uc3QgZWZmZWN0aXZlUm9vdCA9IG92ZXJyaWRlcz8ucm9vdCA/PyBmYy5yb290O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUluaXRpYWxDb250ZXh0ID0gb3ZlcnJpZGVzPy5pbml0aWFsQ29udGV4dCA/PyBhcmdzLmluaXRpYWxDb250ZXh0O1xuXG4gICAgbGV0IHJ1bnRpbWU6IEV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgaWYgKG92ZXJyaWRlcz8uZXhpc3RpbmdSdW50aW1lKSB7XG4gICAgICAvLyBSZXN1bWUgbW9kZTogcmV1c2UgZXhpc3RpbmcgcnVudGltZSBzbyBleGVjdXRpb24gdHJlZSBjb250aW51ZXMgZnJvbSBwYXVzZSBwb2ludC5cbiAgICAgIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCByb290IGZvciBnZXRTbmFwc2hvdCgpIChmdWxsIHRyZWUpLCB0aGVuIGFkdmFuY2VcbiAgICAgIC8vIHJvb3RTdGFnZUNvbnRleHQgdG8gYSBjb250aW51YXRpb24gZnJvbSB0aGUgbGVhZiAoZm9yIHRyYXZlcnNhbCkuXG4gICAgICBydW50aW1lID0gb3ZlcnJpZGVzLmV4aXN0aW5nUnVudGltZTtcbiAgICAgIHJ1bnRpbWUucHJlc2VydmVTbmFwc2hvdFJvb3QoKTtcbiAgICAgIGxldCBsZWFmID0gcnVudGltZS5yb290U3RhZ2VDb250ZXh0O1xuICAgICAgd2hpbGUgKGxlYWYubmV4dCkgbGVhZiA9IGxlYWYubmV4dDtcbiAgICAgIHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dCA9IGxlYWYuY3JlYXRlTmV4dCgnJywgZWZmZWN0aXZlUm9vdC5uYW1lLCBlZmZlY3RpdmVSb290LmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lKFxuICAgICAgICBlZmZlY3RpdmVSb290Lm5hbWUsXG4gICAgICAgIGVmZmVjdGl2ZVJvb3QuaWQsXG4gICAgICAgIGFyZ3MuZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsXG4gICAgICAgIGVmZmVjdGl2ZUluaXRpYWxDb250ZXh0LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIGEgcmVkYWN0aW9uIHBvbGljeSBpcyBjb25maWd1cmVkLCBtYWludGFpbiBhIHBhcmFsbGVsIHJlZGFjdGVkXG4gICAgLy8gbWlycm9yIG9mIGBnbG9iYWxTdG9yZWAgZHVyaW5nIHRyYXZlcnNhbC4gRWFjaCBjb21taXQgYXBwbGllcyB0aGVcbiAgICAvLyBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMg4oCUIHNhbWUgb25lcyBmZWQgdG8gdGhlIGV2ZW50IGxvZyDigJRcbiAgICAvLyBzbyBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIHJldHVybnMgYSBzY3J1YmJlZCBzaGFyZWRTdGF0ZSBhdFxuICAgIC8vIHplcm8gcG9zdC1wYXNzIGNvc3QuIFNraXBwZWQgd2hlbiBubyBwb2xpY3kgZXhpc3RzICh6ZXJvIGFsbG9jYXRpb24pLlxuICAgIGlmICh0aGlzLnJlZGFjdGlvblBvbGljeSkge1xuICAgICAgcnVudGltZS5lbmFibGVSZWRhY3RlZE1pcnJvcigpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4oe1xuICAgICAgcm9vdDogZWZmZWN0aXZlUm9vdCxcbiAgICAgIHN0YWdlTWFwOiBmYy5zdGFnZU1hcCxcbiAgICAgIHNjb3BlRmFjdG9yeSxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHJ1bnRpbWUsXG4gICAgICByZWFkT25seUNvbnRleHQ6IHJlYWRPbmx5Q29udGV4dE92ZXJyaWRlID8/IGFyZ3MucmVhZE9ubHlDb250ZXh0LFxuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogYXJncy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnM6IGFyZ3Muc3RyZWFtSGFuZGxlcnMsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBhcmdzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICBzdWJmbG93czogZmMuc3ViZmxvd3MsXG4gICAgICBuYXJyYXRpdmVFbmFibGVkOiBuYXJyYXRpdmVGbGFnLFxuICAgICAgYnVpbGRUaW1lU3RydWN0dXJlOiBmYy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICBsb2dnZXI6IGZjLmxvZ2dlciA/PyBkZWZhdWx0TG9nZ2VyLFxuICAgICAgc2lnbmFsLFxuICAgICAgZXhlY3V0aW9uRW52OiBlbnYsXG4gICAgICBmbG93UmVjb3JkZXJzOiB0aGlzLmJ1aWxkRmxvd1JlY29yZGVyc0xpc3QoKSxcbiAgICAgIGV4ZWN1dGlvbkNvdW50ZXI6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIsXG4gICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgLi4uKG92ZXJyaWRlcz8uc3ViZmxvd3NPdmVycmlkZSAmJiB7IHN1YmZsb3dzOiBvdmVycmlkZXMuc3ViZmxvd3NPdmVycmlkZSB9KSxcbiAgICAgIC4uLihvdmVycmlkZXM/LnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUgJiYge1xuICAgICAgICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lOiBvdmVycmlkZXMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSxcbiAgICAgIH0pLFxuICAgICAgLi4uKG1heERlcHRoICE9PSB1bmRlZmluZWQgJiYgeyBtYXhEZXB0aCB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGVuYWJsZU5hcnJhdGl2ZShvcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgPSB0cnVlO1xuICAgIGlmIChvcHRpb25zKSB0aGlzLm5hcnJhdGl2ZU9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGRlY2xhcmF0aXZlIHJlZGFjdGlvbiBwb2xpY3kgdGhhdCBhcHBsaWVzIHRvIGFsbCBzdGFnZXMuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS5cbiAgICovXG4gIHNldFJlZGFjdGlvblBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucmVkYWN0aW9uUG9saWN5ID0gcG9saWN5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGlhbmNlLWZyaWVuZGx5IHJlcG9ydCBvZiBhbGwgcmVkYWN0aW9uIGFjdGl2aXR5IGZyb20gdGhlXG4gICAqIG1vc3QgcmVjZW50IHJ1bi4gTmV2ZXIgaW5jbHVkZXMgYWN0dWFsIHZhbHVlcy5cbiAgICovXG4gIGdldFJlZGFjdGlvblJlcG9ydCgpOiBSZWRhY3Rpb25SZXBvcnQge1xuICAgIGNvbnN0IGZpZWxkUmVkYWN0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIHRoaXMuc2hhcmVkUmVkYWN0ZWRGaWVsZHNCeUtleSkge1xuICAgICAgZmllbGRSZWRhY3Rpb25zW2tleV0gPSBbLi4uZmllbGRzXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZGFjdGVkS2V5czogWy4uLnRoaXMuc2hhcmVkUmVkYWN0ZWRLZXlzXSxcbiAgICAgIGZpZWxkUmVkYWN0aW9ucyxcbiAgICAgIHBhdHRlcm5zOiAodGhpcy5yZWRhY3Rpb25Qb2xpY3k/LnBhdHRlcm5zID8/IFtdKS5tYXAoKHApID0+IHAuc291cmNlKSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFBhdXNlL1Jlc3VtZSDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2hlY2twb2ludCBmcm9tIHRoZSBtb3N0IHJlY2VudCBwYXVzZWQgZXhlY3V0aW9uLCBvciBgdW5kZWZpbmVkYFxuICAgKiBpZiB0aGUgbGFzdCBydW4gY29tcGxldGVkIHdpdGhvdXQgcGF1c2luZy5cbiAgICpcbiAgICogVGhlIGNoZWNrcG9pbnQgaXMgSlNPTi1zZXJpYWxpemFibGUg4oCUIHN0b3JlIGl0IGluIFJlZGlzLCBQb3N0Z3JlcywgbG9jYWxTdG9yYWdlLCBldGMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gICAqIGlmIChleGVjdXRvci5pc1BhdXNlZCgpKSB7XG4gICAqICAgY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKSE7XG4gICAqICAgYXdhaXQgcmVkaXMuc2V0KGBzZXNzaW9uOiR7aWR9YCwgSlNPTi5zdHJpbmdpZnkoY2hlY2twb2ludCkpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2hlY2twb2ludCgpOiBGbG93Y2hhcnRDaGVja3BvaW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hlY2twb2ludDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgbW9zdCByZWNlbnQgcnVuKCkgd2FzIHBhdXNlZCAoY2hlY2twb2ludCBhdmFpbGFibGUpLiAqL1xuICBpc1BhdXNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hlY2twb2ludCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBjb21taXRzIGluIHRoZSBydW4ncyBjb21taXQgbG9nLiBPKDEpIOKAlCBkaXJlY3QgbGVuZ3RoXG4gICAqIHJlYWQsIG5vIHNuYXBzaG90IG1hdGVyaWFsaXphdGlvbi4gVXNlIHRoaXMgdG8gc3RhbXAgY29tbWl0XG4gICAqIGluZGljZXMgb24gb2JzZXJ2ZXIgZXZlbnRzIChlLmcuLCBgQm91bmRhcnlSZWNvcmRlcmAgc3RvcmluZ1xuICAgKiBgY29tbWl0SWR4QmVmb3JlYCAvIGBjb21taXRJZHhBZnRlcmAgcGVyIGRvbWFpbiBldmVudCBmb3JcbiAgICogYENvbW1pdFJhbmdlSW5kZXhgIHF1ZXJpZXMg4oCUIHNlZSBgZm9vdHByaW50anMvdHJhY2VgKS5cbiAgICpcbiAgICogUmV0dXJucyAwIGJlZm9yZSBhbnkgcnVuOyBhZnRlciwgcmV0dXJucyB0aGUgY3VtdWxhdGl2ZSBjb21taXRcbiAgICogY291bnQgYWNyb3NzIHRoZSBleGVjdXRvcidzIGxpZmV0aW1lIChpbmNsdWRpbmcgcmVzdW1lcykuXG4gICAqXG4gICAqIElNUExFTUVOVEFUSU9OIE5PVEU6IHRoaXMgcmV0dXJucyBgcnVudGltZS5leGVjdXRpb25IaXN0b3J5Lmxlbmd0aGAsXG4gICAqIHdoaWNoIGlzIHRoZSBzYW1lIHZhbHVlIGFzIGBnZXRTbmFwc2hvdCgpLmNvbW1pdExvZy5sZW5ndGhgLiBUaGVcbiAgICogbmFtaW5nIGFzeW1tZXRyeSBpcyBoaXN0b3JpY2FsIOKAlCB0aGUgdW5kZXJseWluZyBgRXZlbnRMb2dgIGZpZWxkXG4gICAqIGlzIG5hbWVkIGBleGVjdXRpb25IaXN0b3J5YCBidXQgc3RvcmVzIHRoZSBgQ29tbWl0QnVuZGxlW11gIHRoYXRcbiAgICogYGNvbW1pdExvZ2AgZXhwb3Nlcy4gVGhleSBhcmUgdGhlIFNBTUUgYXJyYXkgKHZlcmlmaWVkIGJ5IHRoZVxuICAgKiBcIm1hdGNoZXMgY29tbWl0TG9nLmxlbmd0aFwiIGludGVncmF0aW9uIHRlc3QpLlxuICAgKi9cbiAgZ2V0Q29tbWl0Q291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBydW50aW1lID0gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEluc3RhbmNlVHlwZTx0eXBlb2YgRXhlY3V0aW9uUnVudGltZT4gfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJ1bnRpbWU/LmV4ZWN1dGlvbkhpc3RvcnkubGVuZ3RoID8/IDA7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIGEgcGF1c2VkIGZsb3djaGFydCBmcm9tIGEgY2hlY2twb2ludC5cbiAgICpcbiAgICogUmVzdG9yZXMgdGhlIHNjb3BlIHN0YXRlLCBjYWxscyB0aGUgcGF1c2VkIHN0YWdlJ3MgYHJlc3VtZUZuYCB3aXRoIHRoZVxuICAgKiBwcm92aWRlZCBpbnB1dCwgdGhlbiBjb250aW51ZXMgdHJhdmVyc2FsIGZyb20gdGhlIG5leHQgc3RhZ2UuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGNhbiBjb21lIGZyb20gYGdldENoZWNrcG9pbnQoKWAgb24gYSBwcmV2aW91cyBydW4sIG9yIGZyb21cbiAgICogYSBzZXJpYWxpemVkIGNoZWNrcG9pbnQgc3RvcmVkIGluIFJlZGlzL1Bvc3RncmVzL2xvY2FsU3RvcmFnZS5cbiAgICpcbiAgICogKipOYXJyYXRpdmUvcmVjb3JkZXIgc3RhdGUgaXMgcmVzZXQgb24gcmVzdW1lLioqIFRvIGtlZXAgYSB1bmlmaWVkIG5hcnJhdGl2ZVxuICAgKiBhY3Jvc3MgcGF1c2UvcmVzdW1lIGN5Y2xlcywgY29sbGVjdCBpdCBiZWZvcmUgY2FsbGluZyByZXN1bWUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gUHJvY2VzcyBBIOKAlCBhZnRlciBhIHBhdXNlLCBwZXJzaXN0IHRoZSBjaGVja3BvaW50OlxuICAgKiBjb25zdCBjaGVja3BvaW50ID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAgICogYXdhaXQgcmVkaXMuc2V0KGBzZXNzaW9uOiR7aWR9YCwgSlNPTi5zdHJpbmdpZnkoY2hlY2twb2ludCkpO1xuICAgKlxuICAgKiAvLyBQcm9jZXNzIEIgKHBvc3NpYmx5IGRpZmZlcmVudCBzZXJ2ZXIsIHNhbWUgY2hhcnQpIOKAlCByZXN0b3JlIGFuZCByZXN1bWU6XG4gICAqIGNvbnN0IHJlc3RvcmVkID0gSlNPTi5wYXJzZShhd2FpdCByZWRpcy5nZXQoYHNlc3Npb246JHtpZH1gKSk7XG4gICAqIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0b3IucmVzdW1lKHJlc3RvcmVkLCB7IGFwcHJvdmVkOiB0cnVlIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc3VtZShcbiAgICBjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50LFxuICAgIHJlc3VtZUlucHV0PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUGljazxSdW5PcHRpb25zLCAnc2lnbmFsJyB8ICdlbnYnIHwgJ21heERlcHRoJz4sXG4gICk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0gdW5kZWZpbmVkO1xuXG4gICAgLy8g4pSA4pSAIFZhbGlkYXRlIGNoZWNrcG9pbnQgc3RydWN0dXJlIChtYXkgY29tZSBmcm9tIHVudHJ1c3RlZCBleHRlcm5hbCBzdG9yYWdlKSDilIDilIBcbiAgICBpZiAoXG4gICAgICAhY2hlY2twb2ludCB8fFxuICAgICAgdHlwZW9mIGNoZWNrcG9pbnQgIT09ICdvYmplY3QnIHx8XG4gICAgICB0eXBlb2YgY2hlY2twb2ludC5zaGFyZWRTdGF0ZSAhPT0gJ29iamVjdCcgfHxcbiAgICAgIGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUgPT09IG51bGwgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkoY2hlY2twb2ludC5zaGFyZWRTdGF0ZSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGVja3BvaW50OiBzaGFyZWRTdGF0ZSBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0LicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZCAhPT0gJ3N0cmluZycgfHwgY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrcG9pbnQ6IHBhdXNlZFN0YWdlSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFBcnJheS5pc0FycmF5KGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpIHx8XG4gICAgICAhY2hlY2twb2ludC5zdWJmbG93UGF0aC5ldmVyeSgoczogdW5rbm93bikgPT4gdHlwZW9mIHMgPT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrcG9pbnQ6IHN1YmZsb3dQYXRoIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncy4nKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBwYXVzZWQgbm9kZSBpbiB0aGUgZ3JhcGhcbiAgICBjb25zdCBwYXVzZWROb2RlID0gdGhpcy5maW5kTm9kZUluR3JhcGgoY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkLCBjaGVja3BvaW50LnN1YmZsb3dQYXRoKTtcbiAgICBpZiAoIXBhdXNlZE5vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke2NoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZH0nIG5vdCBmb3VuZCBpbiBmbG93Y2hhcnQuIGAgK1xuICAgICAgICAgICdUaGUgY2hhcnQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgY2hlY2twb2ludCB3YXMgY3JlYXRlZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFwYXVzZWROb2RlLnJlc3VtZUZuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdGFnZSAnJHtwYXVzZWROb2RlLm5hbWV9JyAoJHtwYXVzZWROb2RlLmlkfSkgaGFzIG5vIHJlc3VtZUZuLiBgICtcbiAgICAgICAgICAnT25seSBzdGFnZXMgY3JlYXRlZCB3aXRoIGFkZFBhdXNhYmxlRnVuY3Rpb24oKSBjYW4gYmUgcmVzdW1lZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBhIHN5bnRoZXRpYyByZXN1bWUgbm9kZTogY2FsbHMgcmVzdW1lRm4gd2l0aCByZXN1bWVJbnB1dCwgdGhlbiBjb250aW51ZXMuXG4gICAgLy8gcmVzdW1lRm4gc2lnbmF0dXJlIGlzIChzY29wZSwgaW5wdXQpIHBlciBQYXVzYWJsZUhhbmRsZXIg4oCUIHdyYXAgdG8gbWF0Y2ggU3RhZ2VGdW5jdGlvbihzY29wZSwgYnJlYWtGbikuXG4gICAgY29uc3QgcmVzdW1lRm4gPSBwYXVzZWROb2RlLnJlc3VtZUZuO1xuICAgIGNvbnN0IHJlc3VtZVN0YWdlRm4gPSAoc2NvcGU6IFRTY29wZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VtZUZuKHNjb3BlLCByZXN1bWVJbnB1dCk7XG4gICAgfTtcblxuICAgIC8vIERldGVybWluZSBjb250aW51YXRpb246IGZvciBicmFuY2ggY2hpbGRyZW4gKGRlY2lkZXIvc2VsZWN0b3IpLFxuICAgIC8vIHBhdXNlZE5vZGUubmV4dCBpcyB1bmRlZmluZWQuIFRoZSBjaGVja3BvaW50J3NcbiAgICAvLyBjb250aW51YXRpb25TdGFnZUlkIChjb2xsZWN0ZWQgZHVyaW5nIHRyYXZlcnNhbCBidWJibGUtdXApXG4gICAgLy8gcG9pbnRzIHRvIHRoZSBpbnZva2VyJ3MgbmV4dCBub2RlLlxuICAgIC8vXG4gICAgLy8gRm9yIHBhdXNlcyBpbnNpZGUgYSBzdWJmbG93LCB0aGUgY29udGludWF0aW9uIGxpdmVzIElOU0lERSB0aGVcbiAgICAvLyBsZWFmIHN1YmZsb3cgKGUuZy4sIHRoZSBsb29wIHRhcmdldCBiYWNrIHRvIGBtZXNzYWdlc2ApLiBTZWFyY2hcbiAgICAvLyB0aGUgbGVhZiBzdWJmbG93IGZpcnN0OyBmYWxsIGJhY2sgdG8gdG9wLWxldmVsIGZvciByb290LWxldmVsXG4gICAgLy8gcGF1c2VzLlxuICAgIGNvbnN0IHNmU3RhdGVzID0gY2hlY2twb2ludC5zdWJmbG93U3RhdGVzO1xuICAgIGNvbnN0IGxlYWZTdWJmbG93SWQgPVxuICAgICAgY2hlY2twb2ludC5zdWJmbG93UGF0aC5sZW5ndGggPiAwID8gY2hlY2twb2ludC5zdWJmbG93UGF0aFtjaGVja3BvaW50LnN1YmZsb3dQYXRoLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgIGxldCBjb250aW51YXRpb25OZXh0ID0gcGF1c2VkTm9kZS5uZXh0O1xuICAgIC8vIEEgYnJhbmNoLXNvdXJjZWQgbG9vcCAoYHsgbG9vcFRvIH1gIC8gYERlY2lkZXJMaXN0Lmxvb3BUb2ApIHNldHMgdGhlXG4gICAgLy8gbG9vcGluZyBicmFuY2gncyBgbmV4dGAgdG8gYSBsb29wLXJlZiBTVFVCIOKAlCBgeyBpZCwgaXNMb29wUmVmOnRydWUgfWBcbiAgICAvLyB3aXRoIG5vIGZuL2NoaWxkcmVuL3N1YmZsb3dJZC4gT24gYSBOT1JNQUwgcnVuIHRoYXQgc3R1YiByZXNvbHZlcyBmaW5lOlxuICAgIC8vIHRoZSByZWFsIHRhcmdldCBub2RlIGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBjaGFydCByb290LCBzbyB0aGUgdHJhdmVyc2VyJ3NcbiAgICAvLyBub2RlIG1hcCBhbHJlYWR5IGhvbGRzIGl0ICh0aGUgc3R1YiBpcyBza2lwcGVkIOKAlCBmaXJzdC13cml0ZS13aW5zKS4gT25cbiAgICAvLyBSRVNVTUUgdGhlIG5vZGUgbWFwIGlzIGJ1aWx0IGZyb20gdGhlIHRydW5jYXRlZCByZXN1bWUgcm9vdCwgd2hlcmUgdGhlXG4gICAgLy8gcmVhbCB0YXJnZXQgaXMgdW5yZWFjaGFibGUsIHNvIHRoZSBzdHViIHdvdWxkIHdpbiB0aGUgaWQgc2xvdCBhbmRcbiAgICAvLyBgZXhlY3V0ZU5vZGVgIHRocm93cyBcIk5vZGUgJzx0YXJnZXQ+JyBtdXN0IGRlZmluZSAuLi5cIi4gUmVzb2x2ZSB0aGUgc3R1YlxuICAgIC8vIHRvIHRoZSBSRUFMIHRhcmdldCBub2RlIGhlcmUgKGRmc0ZpbmQgc2tpcHMgbG9vcC1yZWZzIGFuZCByZXR1cm5zIHRoZVxuICAgIC8vIHJlYWwgbm9kZSBXSVRIIGl0cyBmdWxsIGRvd25zdHJlYW0gY2hhaW4g4oCUIGUuZy4gYSBzdWJmbG93IE1PVU5UIG5vZGUsXG4gICAgLy8gd2hvc2UgYC5uZXh0YCBjYXJyaWVzIHRoZSBkZWNpZGVyL3Rlcm1pbmFsIGNvbnRpbnVhdGlvbiB0aGUgbG9vcCBtdXN0XG4gICAgLy8gcmUtZW50ZXIpLiBTZWUgdGVzdC9saWIvcGF1c2UvcmVzdW1lLWJyYW5jaC1sb29wLXN1YmZsb3cudGVzdC50cy5cbiAgICBpZiAoY29udGludWF0aW9uTmV4dD8uaXNMb29wUmVmKSB7XG4gICAgICBjb25zdCBsb29wVGFyZ2V0SWQgPSBjb250aW51YXRpb25OZXh0LmlkO1xuICAgICAgY29uc3QgcmVhbFRhcmdldCA9XG4gICAgICAgIChsZWFmU3ViZmxvd0lkICE9PSB1bmRlZmluZWQgPyB0aGlzLmZpbmROb2RlSW5HcmFwaChsb29wVGFyZ2V0SWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpIDogdW5kZWZpbmVkKSA/P1xuICAgICAgICB0aGlzLmZpbmROb2RlSW5HcmFwaChsb29wVGFyZ2V0SWQsIFtdKTtcbiAgICAgIGlmIChyZWFsVGFyZ2V0KSBjb250aW51YXRpb25OZXh0ID0gcmVhbFRhcmdldDtcbiAgICB9XG4gICAgaWYgKCFjb250aW51YXRpb25OZXh0ICYmIGNoZWNrcG9pbnQuY29udGludWF0aW9uU3RhZ2VJZCkge1xuICAgICAgLy8gU2VhcmNoIGxlYWYgc3ViZmxvdyBmaXJzdCAobG9vcCB0YXJnZXRzIC8gYnJhbmNoIGpvaW5zIGxpdmUgdGhlcmUpLFxuICAgICAgLy8gdGhlbiBmYWxsIGJhY2sgdG8gdG9wIGxldmVsLlxuICAgICAgY29udGludWF0aW9uTmV4dCA9IGxlYWZTdWJmbG93SWRcbiAgICAgICAgPyB0aGlzLmZpbmROb2RlSW5HcmFwaChjaGVja3BvaW50LmNvbnRpbnVhdGlvblN0YWdlSWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKCFjb250aW51YXRpb25OZXh0KSB7XG4gICAgICAgIGNvbnRpbnVhdGlvbk5leHQgPSB0aGlzLmZpbmROb2RlSW5HcmFwaChjaGVja3BvaW50LmNvbnRpbnVhdGlvblN0YWdlSWQsIFtdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgXCJpbm5lclwiIHJlc3VtZSBjaGFpbjogcmVzdW1lRm4g4oaSIGNvbnRpbnVhdGlvbi4gVGhpcyBpcyB3aGF0XG4gICAgLy8gcnVucyBJTlNJREUgdGhlIGxlYWYgc3ViZmxvdydzIGJvZHkuIEZvciBhIHJvb3QtbGV2ZWwgcGF1c2VcbiAgICAvLyAoc3ViZmxvd1BhdGggZW1wdHkpLCB0aGlzIGlzIGFsc28gdGhlIHRvcC1sZXZlbCByZXN1bWUgcm9vdC5cbiAgICBjb25zdCBpbm5lclJlc3VtZUNoYWluOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIGlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgZGVzY3JpcHRpb246IHBhdXNlZE5vZGUuZGVzY3JpcHRpb24sXG4gICAgICBmbjogcmVzdW1lU3RhZ2VGbixcbiAgICAgIG5leHQ6IGNvbnRpbnVhdGlvbk5leHQsXG4gICAgfTtcblxuICAgIC8vIERvbid0IGNsZWFyIHJlY29yZGVycyDigJQgcmVzdW1lIGNvbnRpbnVlcyBmcm9tIHByZXZpb3VzIHN0YXRlLlxuICAgIC8vIE5hcnJhdGl2ZSwgbWV0cmljcywgZGVidWcgZW50cmllcyBhY2N1bXVsYXRlIGFjcm9zcyBwYXVzZS9yZXN1bWUuXG4gICAgLy9cbiAgICAvLyBUd28tbW9kZSByZXN1bWU6XG4gICAgLy8gICDigKIgU2FtZS1leGVjdXRvciAocnVuKCkgcHJldmlvdXNseSBjYWxsZWQgb24gVEhJUyBpbnN0YW5jZSk6XG4gICAgLy8gICAgIHJldXNlIHRoZSBleGlzdGluZyBydW50aW1lIHNvIHRoZSBleGVjdXRpb24gdHJlZSBjb250aW51ZXNcbiAgICAvLyAgICAgZnJvbSB0aGUgcGF1c2UgcG9pbnQgYW5kIHJlY29yZGVycy9uYXJyYXRpdmUgYWNjdW11bGF0ZS5cbiAgICAvLyAgIOKAoiBDcm9zcy1leGVjdXRvciAoZnJlc2ggZXhlY3V0b3IgcmVjb25zdHJ1Y3RlZCBmcm9tIGEgc3RvcmVkXG4gICAgLy8gICAgIGNoZWNrcG9pbnQpOiBzZWVkIGEgTkVXIHJ1bnRpbWUgZnJvbSBgY2hlY2twb2ludC5zaGFyZWRTdGF0ZWBcbiAgICAvLyAgICAgc28gcmVzdW1lIGhhbmRsZXJzIGNhbiByZWFkIHByZS1wYXVzZSBzY29wZS4gVGhlIGV4ZWN1dGlvblxuICAgIC8vICAgICB0cmVlIHN0YXJ0cyBhdCB0aGUgcmVzdW1lIG5vZGUg4oCUIHdlIGRvbid0IGhhdmUgdGhlIHByZXZpb3VzXG4gICAgLy8gICAgIHRyYXZlcnNhbCdzIHRyZWUgb24gYSBmcmVzaCBwcm9jZXNzIGFueXdheS5cbiAgICBjb25zdCBzYW1lRXhlY3V0b3IgPSB0aGlzLl9oYXNSdW5CZWZvcmU7XG4gICAgY29uc3QgZXhpc3RpbmdSdW50aW1lID0gc2FtZUV4ZWN1dG9yXG4gICAgICA/ICh0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPilcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuX2hhc1J1bkJlZm9yZSA9IHRydWU7IC8vIGFueSBwYXRoIHRoYXQgcmVzdW1lcyBjb3VudHMgYXMgYSBydW5cbiAgICAvLyBSZXN1bWUgZ2V0cyBhIE5FVyBydW5JZCDigJQgcmVzdW1lIGlzIGxvZ2ljYWxseSBhIGRpc3RpbmN0IHJ1bi5cbiAgICAvLyBPcmlnaW5hbCBydW5JZCBpcyByZWNvdmVyYWJsZSBmcm9tIGNoZWNrcG9pbnQgbWV0YWRhdGEgaWYgYSBjb25zdW1lclxuICAgIC8vIG5lZWRzIGNyb3NzLXJ1biBhdWRpdCAod2UgZG9uJ3Qgc3RvcmUgaXQgb24gdGhlIGNoZWNrcG9pbnQgdG9kYXk7XG4gICAgLy8gZnV0dXJlIGVuaGFuY2VtZW50KS4gU2VlIGBydW5JZC50c2AuXG4gICAgdGhpcy5fY3VycmVudFJ1bklkID0gZ2VuZXJhdGVSdW5JZCgpO1xuXG4gICAgLy8gUGljayB0aGUgcmVzdW1lIHJvb3QgKyBpbml0aWFsIGNvbnRleHQuXG4gICAgLy9cbiAgICAvLyAgIFJPT1QtTEVWRUwgUEFVU0UgKHN1YmZsb3dQYXRoIGVtcHR5KTpcbiAgICAvLyAgICAgcmVzdW1lIHJvb3QgPSBpbm5lclJlc3VtZUNoYWluIChydW4gcmVzdW1lRm4gYXQgdG9wIGxldmVsKS5cbiAgICAvLyAgICAgaW5pdGlhbENvbnRleHQgPSBjaGVja3BvaW50LnNoYXJlZFN0YXRlLlxuICAgIC8vXG4gICAgLy8gICBTVUJGTE9XLU5FU1RFRCBQQVVTRSAoc3ViZmxvd1BhdGggbm9uLWVtcHR5KTpcbiAgICAvLyAgICAgVGhlIHBhdXNlIHdhcyBJTlNJREUgYSBzdWJmbG93J3MgYm9keS4gVG8gcnVuIHRoZSBzdWJmbG93J3NcbiAgICAvLyAgICAgb3V0cHV0TWFwcGVyIGFuZCB0aGUgcGFyZW50J3MgY29udGludWF0aW9uLCB3ZSBoYXZlIHRvIGVudGVyXG4gICAgLy8gICAgIHRocm91Z2ggdGhlIE9VVEVSIE1PVU5UICh0aGUgcGFyZW50J3Mgbm9kZSB0aGF0IG1vdW50cyB0aGVcbiAgICAvLyAgICAgbGVhZiBzdWJmbG93KS4gV2Ugc3dhcCB0aGUgbGVhZiBzdWJmbG93J3Mgcm9vdCB3aXRoXG4gICAgLy8gICAgIGlubmVyUmVzdW1lQ2hhaW4gc28gU3ViZmxvd0V4ZWN1dG9yOlxuICAgIC8vICAgICAgIDEuIGVudGVycyB0aGUgc3ViZmxvdyBib3VuZGFyeSxcbiAgICAvLyAgICAgICAyLiBzZWVkcyB0aGUgbmVzdGVkIHJ1bnRpbWUgZnJvbSBzdWJmbG93U3RhdGVzW2xlYWZdXG4gICAgLy8gICAgICAgICAgKHNraXBwaW5nIHRoZSBpbnB1dE1hcHBlciDigJQgc2VlIFN1YmZsb3dFeGVjdXRvci50cyksXG4gICAgLy8gICAgICAgMy4gcnVucyB0aGUgcmVzdW1lRm4g4oaSIGNvbnRpbnVhdGlvbiBjaGFpbixcbiAgICAvLyAgICAgICA0LiBydW5zIHRoZSBvdXRwdXRNYXBwZXIgYXQgZXhpdCxcbiAgICAvLyAgICAgICA1LiBwYXJlbnQgdHJhdmVyc2FsIGNvbnRpbnVlcyBub3JtYWxseS5cbiAgICAvL1xuICAgIC8vICAgICBDcm9zcy1leGVjdXRvcjogaW5pdGlhbENvbnRleHQgPSBjaGVja3BvaW50LnNoYXJlZFN0YXRlICh0aGVcbiAgICAvLyAgICAgICBwYXJlbnQncyB2aWV3IGF0IHBhdXNlIHRpbWUg4oCUIG91dHB1dE1hcHBlciB3cml0ZXMgYmFjayBpbnRvIGl0KS5cbiAgICAvLyAgICAgU2FtZS1leGVjdXRvcjogZXhpc3RpbmdSdW50aW1lIGlzIHJldXNlZDsgaW5pdGlhbENvbnRleHQgaXMgbW9vdFxuICAgIC8vICAgICAgIGZvciB0aGUgc3ViZmxvdyBmcmFtZSAoYWxyZWFkeSBpbiB0aGUgcnVudGltZSBzdGFjayksIGJ1dCB3ZVxuICAgIC8vICAgICAgIHN0aWxsIHBhc3Mgc2hhcmVkU3RhdGUgZm9yIGNvbnNpc3RlbmN5LlxuICAgIGNvbnN0IGZjID0gdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydDtcbiAgICBsZXQgcmVzdW1lUm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSBpbm5lclJlc3VtZUNoYWluO1xuICAgIGxldCBzdWJmbG93c092ZXJyaWRlOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChsZWFmU3ViZmxvd0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEZpbmQgdGhlIE9VVEVSIG1vdW50IG5vZGUgZm9yIHRoZSBGSVJTVCBlbnRyeSBvbiB0aGUgcGF0aC5cbiAgICAgIC8vIEZvciBzaW5nbGUtbGV2ZWwgcGF1c2VzLCB0aGlzIGlzIHRoZSBvbmx5IG1vdW50IHdlIG5lZWQgdG9cbiAgICAgIC8vIGVudGVyIHRocm91Z2guIEZvciBuZXN0ZWQgbW91bnRzIHRoZSBwYXR0ZXJuIHdvdWxkIGV4dGVuZCwgYnV0XG4gICAgICAvLyBzaW5nbGUtbGV2ZWwgY292ZXJzIGFsbCBjdXJyZW50IHVzZSBjYXNlcyAoU2VxdWVuY2UoQWdlbnQpLFxuICAgICAgLy8gQ29uZGl0aW9uYWwoQWdlbnQpLCBQYXJhbGxlbCBicmFuY2hlcyB3aXRoIHBhdXNlZCBhZ2VudHMpLlxuICAgICAgY29uc3Qgb3V0ZXJTdWJmbG93SWQgPSBjaGVja3BvaW50LnN1YmZsb3dQYXRoWzBdO1xuICAgICAgY29uc3Qgb3V0ZXJNb3VudCA9IHRoaXMuZmluZE1vdW50SW5HcmFwaChmYy5yb290LCBvdXRlclN1YmZsb3dJZCk7XG4gICAgICBpZiAob3V0ZXJNb3VudCkge1xuICAgICAgICByZXN1bWVSb290ID0gb3V0ZXJNb3VudDtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxhY2UgdGhlIGxlYWYgc3ViZmxvdydzIHJvb3Qgd2l0aCB0aGUgcmVzdW1lIGNoYWluIHNvIHRoZVxuICAgICAgLy8gYm9keSBydW5zIGZyb20gdGhlIHBhdXNlIHBvaW50IGZvcndhcmQuXG4gICAgICBzdWJmbG93c092ZXJyaWRlID0geyAuLi4oZmMuc3ViZmxvd3MgPz8ge30pIH07XG4gICAgICBzdWJmbG93c092ZXJyaWRlW2xlYWZTdWJmbG93SWRdID0geyByb290OiBpbm5lclJlc3VtZUNoYWluIH07XG4gICAgfVxuICAgIGNvbnN0IHJlc3VtZUluaXRpYWxDb250ZXh0ID0gY2hlY2twb2ludC5zaGFyZWRTdGF0ZTtcblxuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIob3B0aW9ucz8uc2lnbmFsLCB1bmRlZmluZWQsIG9wdGlvbnM/LmVudiwgb3B0aW9ucz8ubWF4RGVwdGgsIHtcbiAgICAgIHJvb3Q6IHJlc3VtZVJvb3QsXG4gICAgICBpbml0aWFsQ29udGV4dDogcmVzdW1lSW5pdGlhbENvbnRleHQsXG4gICAgICBwcmVzZXJ2ZVJlY29yZGVyczogdHJ1ZSxcbiAgICAgIC4uLihleGlzdGluZ1J1bnRpbWUgPyB7IGV4aXN0aW5nUnVudGltZSB9IDoge30pLFxuICAgICAgLy8gSGFuZCB0aGUgcGVyLXN1YmZsb3cgc2NvcGUgY2FwdHVyZXMgZG93biB0byBTdWJmbG93RXhlY3V0b3IuXG4gICAgICAvLyBBbHdheXMgcHJlc2VudCBvbiBhIGNoZWNrcG9pbnQg4oCUIGVtcHR5IGB7fWAgZm9yIHJvb3QgcGF1c2VzLlxuICAgICAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZTogc2ZTdGF0ZXMsXG4gICAgICAuLi4oc3ViZmxvd3NPdmVycmlkZSAmJiB7IHN1YmZsb3dzT3ZlcnJpZGUgfSksXG4gICAgfSk7XG5cbiAgICAvLyBGaXJlIG9uUmVzdW1lIGV2ZW50IG9uIGFsbCByZWNvcmRlcnMgKGZsb3cgKyBzY29wZSkuIFN0YW1wIHRoZVxuICAgIC8vIHN5bnRoZXRpYyBUcmF2ZXJzYWxDb250ZXh0IGZvciB0aGUgcmVzdW1lZCBzdGFnZSB3aXRoIHRoZSBORVdcbiAgICAvLyBydW5JZCBzbyBjb25zdW1lcnMgZGV0ZWN0IFwidGhpcyBpcyBhIGZyZXNoIGxvZ2ljYWwgcnVuXCIgdmlhXG4gICAgLy8gdGhlIHNhbWUgcnVuSWQtY2hhbmdlIHBhdHRlcm4gdGhleSB1c2UgZm9yIGBvblJ1blN0YXJ0YC5cbiAgICBjb25zdCBoYXNJbnB1dCA9IHJlc3VtZUlucHV0ICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzdW1lUnVudGltZVN0YWdlSWQgPSBidWlsZFJ1bnRpbWVTdGFnZUlkKHBhdXNlZE5vZGUuaWQsIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUpO1xuICAgIGNvbnN0IGZsb3dSZXN1bWVFdmVudCA9IHtcbiAgICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgc3RhZ2VJZDogcGF1c2VkTm9kZS5pZCxcbiAgICAgIGhhc0lucHV0LFxuICAgICAgdHJhdmVyc2FsQ29udGV4dDoge1xuICAgICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogcmVzdW1lUnVudGltZVN0YWdlSWQsXG4gICAgICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgICBkZXB0aDogMCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB0aGlzLmNvbWJpbmVkUmVjb3JkZXIub25SZXN1bWUoZmxvd1Jlc3VtZUV2ZW50KTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSByLm9uUmVzdW1lPy4oZmxvd1Jlc3VtZUV2ZW50KTtcblxuICAgIGNvbnN0IHNjb3BlUmVzdW1lRXZlbnQgPSB7XG4gICAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogYnVpbGRSdW50aW1lU3RhZ2VJZChwYXVzZWROb2RlLmlkLCB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlKSxcbiAgICAgIGhhc0lucHV0LFxuICAgICAgcGlwZWxpbmVJZDogJycsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5zY29wZVJlY29yZGVycykgci5vblJlc3VtZT8uKHNjb3BlUmVzdW1lRXZlbnQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMudHJhdmVyc2VyLmdldFNuYXBzaG90KCk7XG4gICAgICAgIGNvbnN0IHNmUmVzdWx0cyA9IHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gICAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB7XG4gICAgICAgICAgc2hhcmVkU3RhdGU6IHNuYXBzaG90LnNoYXJlZFN0YXRlLFxuICAgICAgICAgIGV4ZWN1dGlvblRyZWU6IHNuYXBzaG90LmV4ZWN1dGlvblRyZWUsXG4gICAgICAgICAgcGF1c2VkU3RhZ2VJZDogZXJyb3Iuc3RhZ2VJZCxcbiAgICAgICAgICBzdWJmbG93UGF0aDogZXJyb3Iuc3ViZmxvd1BhdGgsXG4gICAgICAgICAgcGF1c2VEYXRhOiBlcnJvci5wYXVzZURhdGEsXG4gICAgICAgICAgc3ViZmxvd1N0YXRlczogZXJyb3Iuc3ViZmxvd1N0YXRlcyxcbiAgICAgICAgICAuLi4oc2ZSZXN1bHRzLnNpemUgPiAwICYmIHsgc3ViZmxvd1Jlc3VsdHM6IE9iamVjdC5mcm9tRW50cmllcyhzZlJlc3VsdHMpIH0pLFxuICAgICAgICAgIC4uLihlcnJvci5pbnZva2VyU3RhZ2VJZCAmJiB7IGludm9rZXJTdGFnZUlkOiBlcnJvci5pbnZva2VyU3RhZ2VJZCB9KSxcbiAgICAgICAgICAuLi4oZXJyb3IuY29udGludWF0aW9uU3RhZ2VJZCAmJiB7IGNvbnRpbnVhdGlvblN0YWdlSWQ6IGVycm9yLmNvbnRpbnVhdGlvblN0YWdlSWQgfSksXG4gICAgICAgICAgcGF1c2VkQXQ6IERhdGUubm93KCksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7IHBhdXNlZDogdHJ1ZSwgY2hlY2twb2ludDogdGhpcy5sYXN0Q2hlY2twb2ludCB9IHNhdGlzZmllcyBQYXVzZWRSZXN1bHQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIFN0YWdlTm9kZSBpbiB0aGUgY29tcGlsZWQgZ3JhcGggYnkgSUQuXG4gICAqIEhhbmRsZXMgc3ViZmxvdyBwYXRocyBieSBkcmlsbGluZyBpbnRvIHJlZ2lzdGVyZWQgc3ViZmxvd3MuXG4gICAqL1xuICBwcml2YXRlIGZpbmROb2RlSW5HcmFwaChzdGFnZUlkOiBzdHJpbmcsIHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXSk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmYyA9IHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQ7XG5cbiAgICBpZiAoc3ViZmxvd1BhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBUb3AtbGV2ZWw6IERGUyBmcm9tIHJvb3RcbiAgICAgIHJldHVybiB0aGlzLmRmc0ZpbmQoZmMucm9vdCwgc3RhZ2VJZCk7XG4gICAgfVxuXG4gICAgLy8gU3ViZmxvdzogZHJpbGwgaW50byB0aGUgc3ViZmxvdyBjaGFpbiwgdGhlbiBzZWFyY2ggZnJvbSB0aGUgbGFzdCBzdWJmbG93J3Mgcm9vdFxuICAgIGxldCBzdWJmbG93Um9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBzZklkIG9mIHN1YmZsb3dQYXRoKSB7XG4gICAgICBjb25zdCBzdWJmbG93ID0gZmMuc3ViZmxvd3M/LltzZklkXTtcbiAgICAgIGlmICghc3ViZmxvdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHN1YmZsb3dSb290ID0gc3ViZmxvdy5yb290O1xuICAgIH1cbiAgICBpZiAoIXN1YmZsb3dSb290KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmRmc0ZpbmQoc3ViZmxvd1Jvb3QsIHN0YWdlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIG1vdW50IG5vZGUgKHRoZSBub2RlIHRoYXQgbW91bnRzIGEgc3ViZmxvdyBib3VuZGFyeSlcbiAgICogZm9yIGEgZ2l2ZW4gc3ViZmxvd0lkLCBieSBERlMgZnJvbSBgc3RhcnRgLiBVc2VkIGJ5IGByZXN1bWUoKWAgdG9cbiAgICogbG9jYXRlIHRoZSBPVVRFUiBub2RlIHdlIGhhdmUgdG8gZW50ZXIgdGhyb3VnaCBzbyB0aGUgc3ViZmxvdydzXG4gICAqIG91dHB1dE1hcHBlciBhbmQgcGFyZW50IGNvbnRpbnVhdGlvbiBleGVjdXRlLlxuICAgKlxuICAgKiBDeWNsZS1zYWZlIHZpYSB2aXNpdGVkIHNldC4gUmV0dXJucyB0aGUgZmlyc3QgbWF0Y2ggKERGUyBvcmRlcikuXG4gICAqL1xuICBwcml2YXRlIGZpbmRNb3VudEluR3JhcGgoXG4gICAgc3RhcnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKSxcbiAgKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmIChzdGFydC5pc0xvb3BSZWYpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHN0YXJ0LmlkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB2aXNpdGVkLmFkZChzdGFydC5pZCk7XG4gICAgaWYgKHN0YXJ0LnN1YmZsb3dJZCA9PT0gc3ViZmxvd0lkKSByZXR1cm4gc3RhcnQ7XG4gICAgaWYgKHN0YXJ0LmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHN0YXJ0LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kTW91bnRJbkdyYXBoKGNoaWxkLCBzdWJmbG93SWQsIHZpc2l0ZWQpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXJ0Lm5leHQpIHJldHVybiB0aGlzLmZpbmRNb3VudEluR3JhcGgoc3RhcnQubmV4dCwgc3ViZmxvd0lkLCB2aXNpdGVkKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIERGUyBzZWFyY2ggZm9yIGEgbm9kZSBieSBJRCBpbiB0aGUgU3RhZ2VOb2RlIGdyYXBoLiBDeWNsZS1zYWZlIHZpYSB2aXNpdGVkIHNldC4gKi9cbiAgcHJpdmF0ZSBkZnNGaW5kKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHRhcmdldElkOiBzdHJpbmcsXG4gICAgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpLFxuICApOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgLy8gU2tpcCBsb29wIGJhY2stZWRnZSByZWZlcmVuY2VzICh0aGV5IHNoYXJlIHRoZSB0YXJnZXQncyBJRCBidXQgaGF2ZSBubyBmbi9yZXN1bWVGbilcbiAgICBpZiAobm9kZS5pc0xvb3BSZWYpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUuaWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHZpc2l0ZWQuYWRkKG5vZGUuaWQpO1xuICAgIGlmIChub2RlLmlkID09PSB0YXJnZXRJZCkgcmV0dXJuIG5vZGU7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZGZzRmluZChjaGlsZCwgdGFyZ2V0SWQsIHZpc2l0ZWQpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5vZGUubmV4dCkgcmV0dXJuIHRoaXMuZGZzRmluZChub2RlLm5leHQsIHRhcmdldElkLCB2aXNpdGVkKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFNjb3BlUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgc2NvcGUgU2NvcGVSZWNvcmRlciB0byBvYnNlcnZlIGRhdGEgb3BlcmF0aW9ucyAocmVhZHMsIHdyaXRlcywgY29tbWl0cykuXG4gICAqIEF1dG9tYXRpY2FsbHkgYXR0YWNoZWQgdG8gZXZlcnkgU2NvcGVGYWNhZGUgY3JlYXRlZCBkdXJpbmcgdHJhdmVyc2FsLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuXG4gICAqXG4gICAqICoqSWRlbXBvdGVudCBieSBJRDoqKiBJZiBhIHJlY29yZGVyIHdpdGggdGhlIHNhbWUgYGlkYCBpcyBhbHJlYWR5IGF0dGFjaGVkLFxuICAgKiBpdCBpcyByZXBsYWNlZCAobm90IGR1cGxpY2F0ZWQpLiBUaGlzIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZyB3aGVuIGJvdGhcbiAgICogYSBmcmFtZXdvcmsgYW5kIHRoZSB1c2VyIGF0dGFjaCB0aGUgc2FtZSByZWNvcmRlciB0eXBlLlxuICAgKlxuICAgKiBCdWlsdC1pbiByZWNvcmRlcnMgdXNlIGF1dG8taW5jcmVtZW50IElEcyAoYG1ldHJpY3MtMWAsIGBkZWJ1Zy0xYCwgLi4uKSBieVxuICAgKiBkZWZhdWx0LCBzbyBtdWx0aXBsZSBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uZmlncyBjb2V4aXN0LiBUbyBvdmVycmlkZVxuICAgKiBhIGZyYW1ld29yay1hdHRhY2hlZCByZWNvcmRlciwgcGFzcyB0aGUgc2FtZSB3ZWxsLWtub3duIElELlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIE11bHRpcGxlIHJlY29yZGVycyB3aXRoIGRpZmZlcmVudCBjb25maWdzIOKAlCBlYWNoIGdldHMgYSB1bmlxdWUgSURcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoKSk7XG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IERlYnVnUmVjb3JkZXIoeyB2ZXJib3NpdHk6ICdtaW5pbWFsJyB9KSk7XG4gICAqXG4gICAqIC8vIE92ZXJyaWRlIGEgZnJhbWV3b3JrLWF0dGFjaGVkIHJlY29yZGVyIGJ5IHBhc3NpbmcgaXRzIHdlbGwta25vd24gSURcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ21ldHJpY3MnKSk7XG4gICAqXG4gICAqIC8vIEF0dGFjaGluZyB0d2ljZSB3aXRoIHNhbWUgSUQgcmVwbGFjZXMgKG5vIGRvdWJsZS1jb3VudGluZylcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ215LW1ldHJpY3MnKSk7XG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCdteS1tZXRyaWNzJykpOyAvLyByZXBsYWNlcyBwcmV2aW91c1xuICAgKiBgYGBcbiAgICovXG4gIGF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXI6IFNjb3BlUmVjb3JkZXIpOiB2b2lkIHtcbiAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBJRCAoaWRlbXBvdGVudCDigJQgcHJldmVudHMgZG91YmxlLWNvdW50aW5nKVxuICAgIHRoaXMuc2NvcGVSZWNvcmRlcnMgPSB0aGlzLnNjb3BlUmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXIuaWQpO1xuICAgIHRoaXMuc2NvcGVSZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gIH1cblxuICAvLyDilIDilIDilIAgRGV0YWNoIChUNCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIEJhcmUtZXhlY3V0b3IgZW50cnkgcG9pbnQgZm9yIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnQgZXhlY3V0aW9uLlxuICAvLyBVc2UgZnJvbSBvdXRzaWRlIGFueSBjaGFydCAoY29uc3VtZXIgY29kZSB0aGF0IHdhbnRzIHRvIGRldGFjaCB3b3JrXG4gIC8vIHdpdGhvdXQgZmlyc3QgcnVubmluZyBhIHBhcmVudCBjaGFydCkuIEZvciBkZXRhY2ggRlJPTSBJTlNJREUgYSBzdGFnZSxcbiAgLy8gdXNlIGBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKC4uLilgIC8gYHNjb3BlLiRkZXRhY2hBbmRGb3JnZXQoLi4uKWAg4oCUXG4gIC8vIHRob3NlIG1pbnQgcmVmSWRzIGZyb20gdGhlIGNhbGxpbmcgc3RhZ2UncyBydW50aW1lU3RhZ2VJZCBmb3IgdHJhY2VcbiAgLy8gY29ycmVsYXRpb247IHRoZSBiYXJlLWV4ZWN1dG9yIGVudHJpZXMgdXNlIGEgc3ludGhldGljIHByZWZpeFxuICAvLyAoYF9fZXhlY3V0b3JfX2ApIGluc3RlYWQuXG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNoaWxkIGZsb3djaGFydCBvbiB0aGUgZ2l2ZW4gZHJpdmVyIGFuZCByZXR1cm4gYSBgRGV0YWNoSGFuZGxlYFxuICAgKiB0aGUgY2FsbGVyIGNhbiBgd2FpdCgpYCBvbiAoUHJvbWlzZSkgb3IgcmVhZCBgLnN0YXR1c2AgZnJvbSAoc3luYykuXG4gICAqXG4gICAqIFRoZSBkcml2ZXIgaXMgYSBSRVFVSVJFRCBmaXJzdCBhcmd1bWVudCDigJQgdGhlcmUgaXMgbm8gbGlicmFyeS1kZWZhdWx0LFxuICAgKiB0byBrZWVwIHRoZSBlbmdpbmUgZnJlZSBvZiBkcml2ZXIgaW1wb3J0cyBhbmQgdG8gbWFrZSB0aGUgY2hvaWNlIG9mXG4gICAqIHNjaGVkdWxpbmcgYWxnb3JpdGhtIGV4cGxpY2l0IGF0IHRoZSBjYWxsIHNpdGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW1wb3J0IHsgbWljcm90YXNrQmF0Y2hEcml2ZXIgfSBmcm9tICdmb290cHJpbnRqcy9kZXRhY2gnO1xuICAgKlxuICAgKiBjb25zdCBleGVjID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKHBhcmVudENoYXJ0KTtcbiAgICogY29uc3QgaGFuZGxlID0gZXhlYy5kZXRhY2hBbmRKb2luTGF0ZXIobWljcm90YXNrQmF0Y2hEcml2ZXIsIHRlbGVtZXRyeUNoYXJ0LCB7IGV2ZW50OiAneCcgfSk7XG4gICAqIGF3YWl0IGhhbmRsZS53YWl0KCk7IC8vIG9wdGlvbmFsXG4gICAqIGBgYFxuICAgKi9cbiAgZGV0YWNoQW5kSm9pbkxhdGVyKFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoSGFuZGxlIHtcbiAgICByZXR1cm4gX2RldGFjaEFuZEpvaW5MYXRlcihkcml2ZXIsIGNoaWxkLCBpbnB1dCwgJ19fZXhlY3V0b3JfXycpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNoaWxkIGZsb3djaGFydCBvbiB0aGUgZ2l2ZW4gZHJpdmVyIGFuZCBESVNDQVJEIHRoZSBoYW5kbGUuXG4gICAqIFVzZSBmb3IgdGVsZW1ldHJ5IGV4cG9ydHMgLyBmaXJlLWFuZC1mb3JnZXQgc2lkZSBlZmZlY3RzIHdoZXJlIHRoZVxuICAgKiBjYWxsZXIgZG9lc24ndCBjYXJlIGFib3V0IHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEVycm9ycyByYWlzZWQgYnkgdGhlIGNoaWxkIHN0aWxsIGxhbmQgb24gdGhlIChkaXNjYXJkZWQpIGhhbmRsZSDigJQgdGhleVxuICAgKiBnbyBzaWxlbnQgdW5sZXNzIHN1cmZhY2VkIHRocm91Z2ggYSByZWNvcmRlci4gRm9yIG9ic2VydmFibGUgZGV0YWNoLFxuICAgKiBwcmVmZXIgYGRldGFjaEFuZEpvaW5MYXRlcmAgYW5kIHN1cmZhY2UgZmFpbHVyZXMgdmlhIGAud2FpdCgpLmNhdGNoKClgLlxuICAgKi9cbiAgZGV0YWNoQW5kRm9yZ2V0KFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IHZvaWQge1xuICAgIF9kZXRhY2hBbmRGb3JnZXQoZHJpdmVyLCBjaGlsZCwgaW5wdXQsICdfX2V4ZWN1dG9yX18nKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIHNjb3BlIFJlY29yZGVycyB3aXRoIHRoZSBnaXZlbiBJRC4gKi9cbiAgZGV0YWNoU2NvcGVSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zY29wZVJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSBpZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIHNjb3BlIFJlY29yZGVycy4gKi9cbiAgZ2V0U2NvcGVSZWNvcmRlcnMoKTogU2NvcGVSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuc2NvcGVSZWNvcmRlcnNdO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEZsb3dSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBGbG93UmVjb3JkZXIgdG8gb2JzZXJ2ZSBjb250cm9sIGZsb3cgZXZlbnRzLlxuICAgKiBBdXRvbWF0aWNhbGx5IGVuYWJsZXMgbmFycmF0aXZlIGlmIG5vdCBhbHJlYWR5IGVuYWJsZWQuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKSDigJQgcmVjb3JkZXJzIGFyZSBwYXNzZWQgdG8gdGhlIHRyYXZlcnNlciBhdCBjcmVhdGlvbiB0aW1lLlxuICAgKlxuICAgKiAqKklkZW1wb3RlbnQgYnkgSUQ6KiogcmVwbGFjZXMgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIGBpZGAuXG4gICAqL1xuICBhdHRhY2hGbG93UmVjb3JkZXIocmVjb3JkZXI6IEZsb3dSZWNvcmRlcik6IHZvaWQge1xuICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIElEIChpZGVtcG90ZW50IOKAlCBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcpXG4gICAgdGhpcy5mbG93UmVjb3JkZXJzID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXIuaWQpO1xuICAgIHRoaXMuZmxvd1JlY29yZGVycy5wdXNoKHJlY29yZGVyKTtcbiAgICB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbGwgRmxvd1JlY29yZGVycyB3aXRoIHRoZSBnaXZlbiBJRC4gKi9cbiAgZGV0YWNoRmxvd1JlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSBpZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIEZsb3dSZWNvcmRlcnMuICovXG4gIGdldEZsb3dSZWNvcmRlcnMoKTogRmxvd1JlY29yZGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5mbG93UmVjb3JkZXJzXTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBDb21iaW5lZCBTY29wZVJlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIHJlY29yZGVyIHRoYXQgbWF5IG9ic2VydmUgbXVsdGlwbGUgZXZlbnQgc3RyZWFtcyAoc2NvcGVcbiAgICogZGF0YS1mbG93LCBjb250cm9sLWZsb3csIG9yIGJvdGgpLiBEZXRlY3RzIGF0IHJ1bnRpbWUgd2hpY2ggc3RyZWFtcyB0aGVcbiAgICogcmVjb3JkZXIgaGFzIG1ldGhvZHMgZm9yIGFuZCByb3V0ZXMgaXQgdG8gdGhlIGNvcnJlY3QgaW50ZXJuYWwgY2hhbm5lbHMuXG4gICAqXG4gICAqIFByZWZlcnJlZCBvdmVyIGNhbGxpbmcgYGF0dGFjaFNjb3BlUmVjb3JkZXJgIGFuZCBgYXR0YWNoRmxvd1JlY29yZGVyYFxuICAgKiBzZXBhcmF0ZWx5LCBiZWNhdXNlIGZvcmdldHRpbmcgb25lIG9mIHRoZSB0d28gaXMgYSBzaWxlbnQgZm9vdC1ndW4g4oCUXG4gICAqIGhhbGYgeW91ciBldmVudHMgbmV2ZXIgZmlyZSBhbmQgdGhlcmUgaXMgbm8gcnVudGltZSB3YXJuaW5nLiBXaXRoXG4gICAqIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyYCB0aGUgbGlicmFyeSBndWFyYW50ZWVzIHRoZSByZWNvcmRlcidzIGRlY2xhcmVkXG4gICAqIG1ldGhvZHMgYWxsIGZpcmUsIGFuZCBhZGRzIG5vIG92ZXJoZWFkIHZlcnN1cyB0d28gZXhwbGljaXQgY2FsbHMuXG4gICAqXG4gICAqICMjIElkZW1wb3RlbmN5XG4gICAqXG4gICAqIElkZW1wb3RlbnQgYnkgYGlkYCBhY3Jvc3MgQUxMIGNoYW5uZWxzIOKAlCByZS1hdHRhY2hpbmcgd2l0aCB0aGUgc2FtZSBgaWRgXG4gICAqIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBldmVyeXdoZXJlIGl0IHdhcyByZWdpc3RlcmVkLiBNaXhpbmdcbiAgICogYGF0dGFjaENvbWJpbmVkUmVjb3JkZXIoeClgIHdpdGggYSBwcmlvciBgYXR0YWNoU2NvcGVSZWNvcmRlcih5KWAgb3JcbiAgICogYGF0dGFjaEZsb3dSZWNvcmRlcih5KWAgdGhhdCBzaGFyZSBgeC5pZCA9PT0geS5pZGAgaXMgYWxzbyBzYWZlOiB0aGVcbiAgICogY29tYmluZWQgYXR0YWNoIHJlcGxhY2VzIHRoZSBzaW5nbGUtY2hhbm5lbCByZWdpc3RyYXRpb24gb24gd2hpY2hldmVyXG4gICAqIGNoYW5uZWwocykgYHhgIGhhcyBtZXRob2RzIGZvci4gTm8gZHVwbGljYXRlIGZpcmluZ3Mgb2NjdXIuXG4gICAqXG4gICAqICMjIE5hcnJhdGl2ZSBhY3RpdmF0aW9uXG4gICAqXG4gICAqIElmIHRoZSByZWNvcmRlciBoYXMgYW55IGNvbnRyb2wtZmxvdyBtZXRob2RzLCBgZW5hYmxlTmFycmF0aXZlKClgIGlzXG4gICAqIGNhbGxlZCBhcyBhIHNpZGUgZWZmZWN0ICh0aGUgbmFycmF0aXZlIHN1YnN5c3RlbSBpcyByZXF1aXJlZCB0byBlbWl0XG4gICAqIGNvbnRyb2wtZmxvdyBldmVudHMpLiBEYXRhLWZsb3ctb25seSByZWNvcmRlcnMgZG8gTk9UIGFjdGl2YXRlIHRoZVxuICAgKiBuYXJyYXRpdmUuXG4gICAqXG4gICAqICMjIERldGVjdGlvbiBydWxlXG4gICAqXG4gICAqIE9ubHkgKipvd24qKiBldmVudCBtZXRob2RzIGNvdW50IChzZWUgYGhhc1JlY29yZGVyTWV0aG9kc2ApLiBNZXRob2RzXG4gICAqIGluaGVyaXRlZCB2aWEgdGhlIHByb3RvdHlwZSBjaGFpbiBhcmUgaWdub3JlZCDigJQgdGhpcyBwcm90ZWN0cyBhZ2FpbnN0XG4gICAqIGFjY2lkZW50YWwgYE9iamVjdC5wcm90b3R5cGVgIHBvbGx1dGlvbiBhdHRhY2hpbmcgaGFuZGxlcnMgeW91IG5ldmVyXG4gICAqIGRlY2xhcmVkLiBBIHJlY29yZGVyIHRoYXQgcHJvdmlkZXMgb25seSBgY2xlYXJgL2B0b1NuYXBzaG90YCBpcyBhXG4gICAqIG5vLW9wIGFuZCBlbWl0cyBhIGRldi1tb2RlIHdhcm5pbmcgdG8gc3VyZmFjZSB0aGUgbGlrZWx5IG1pc3Rha2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgYXVkaXQ6IENvbWJpbmVkUmVjb3JkZXIgPSB7XG4gICAqICAgaWQ6ICdhdWRpdCcsXG4gICAqICAgb25Xcml0ZTogKGUpID0+IGxvZygnc2NvcGUgd3JpdGUnLCBlLmtleSksXG4gICAqICAgb25EZWNpc2lvbjogKGUpID0+IGxvZygncm91dGVkIHRvJywgZS5jaG9zZW4pLFxuICAgKiB9O1xuICAgKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKGF1ZGl0KTtcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hDb21iaW5lZFJlY29yZGVyKHJlY29yZGVyOiBDb21iaW5lZFJlY29yZGVyKTogdm9pZCB7XG4gICAgY29uc3QgaGFzRGF0YSA9IGhhc1JlY29yZGVyTWV0aG9kcyhyZWNvcmRlcik7XG4gICAgY29uc3QgaGFzRmxvdyA9IGhhc0Zsb3dSZWNvcmRlck1ldGhvZHMocmVjb3JkZXIpO1xuICAgIGNvbnN0IGhhc0VtaXQgPSBoYXNFbWl0UmVjb3JkZXJNZXRob2RzKHJlY29yZGVyKTtcblxuICAgIC8vIEVtaXQgcmVjb3JkZXJzIGxpdmUgb24gdGhlIFNBTUUgY2hhbm5lbCBhcyBkYXRhLWZsb3cgcmVjb3JkZXJzXG4gICAgLy8gKFNjb3BlRmFjYWRlIGl0ZXJhdGVzIGBfcmVjb3JkZXJzYCBmb3Igb25FbWl0IGRpc3BhdGNoKS4gU29cbiAgICAvLyBhdHRhY2hFbWl0UmVjb3JkZXIgaW50ZXJuYWxseSBjYWxscyBhdHRhY2hTY29wZVJlY29yZGVyIOKAlCBidXQgd2Ugd2FudCB0b1xuICAgIC8vIGF2b2lkIGRvdWJsZS1hdHRhY2ggd2hlbiB0aGUgcmVjb3JkZXIgaW1wbGVtZW50cyBCT1RIIG9uRW1pdCBBTkRcbiAgICAvLyBvdGhlciBTY29wZVJlY29yZGVyIG1ldGhvZHMuIFNob3J0LWNpcmN1aXQ6IGlmIGhhc0RhdGEgT1IgaGFzRW1pdCwgdGhlXG4gICAgLy8gcmVjb3JkZXIgbGFuZHMgb24gdGhlIHNjb3BlLXJlY29yZGVyIGxpc3QgZXhhY3RseSBvbmNlLlxuICAgIGlmIChoYXNEYXRhIHx8IGhhc0VtaXQpIHRoaXMuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlciBhcyBTY29wZVJlY29yZGVyKTtcbiAgICBpZiAoaGFzRmxvdykgdGhpcy5hdHRhY2hGbG93UmVjb3JkZXIocmVjb3JkZXIgYXMgRmxvd1JlY29yZGVyKTtcblxuICAgIGlmICghaGFzRGF0YSAmJiAhaGFzRmxvdyAmJiAhaGFzRW1pdCAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgLy8gRGV2LW1vZGUgb25seTogc2lsZW50IHNraXBzIGFyZSBpbnZpc2libGUgYW5kIHByb2R1Y2UgaGFyZC10by1kZWJ1Z1xuICAgICAgLy8gXCJ3aHkgZGlkbid0IG15IHJlY29yZGVyIGZpcmVcIiByZXBvcnRzLiBQZXIgbGlicmFyeSBjb252ZW50aW9uLCBnYXRlZFxuICAgICAgLy8gb24gdGhlIGNlbnRyYWwgaXNEZXZNb2RlKCkgZmxhZyAobm90IHByb2Nlc3MuZW52KSBzbyBjb25zdW1lcnMgY2FuXG4gICAgICAvLyBjb250cm9sIGRldiB0b29saW5nIGNlbnRyYWxseSB2aWEgZW5hYmxlRGV2TW9kZSgpL2Rpc2FibGVEZXZNb2RlKCkuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludGpzXSBhdHRhY2hDb21iaW5lZFJlY29yZGVyOiByZWNvcmRlciAnJHtyZWNvcmRlci5pZH0nIGhhcyBgICtcbiAgICAgICAgICAnbm8gb2JzZXJ2ZXIgZXZlbnQgbWV0aG9kcyDigJQgbm90aGluZyB0byBhdHRhY2guIERpZCB5b3UgZm9yZ2V0IHRvICcgK1xuICAgICAgICAgICdhZGQgYW4gb24qIGhhbmRsZXIgKG9uV3JpdGUsIG9uRGVjaXNpb24sIG9uU3ViZmxvd0VudHJ5LCAuLi4pPyAnICtcbiAgICAgICAgICAnTm90ZTogb25seSBPV04gcHJvcGVydGllcyBjb3VudDsgbWV0aG9kcyBvbiB0aGUgcHJvdG90eXBlIGNoYWluICcgK1xuICAgICAgICAgICdhcmUgaWdub3JlZCBvbiBwdXJwb3NlLicsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRhY2ggYSBjb21iaW5lZCByZWNvcmRlciBmcm9tIGFsbCBjaGFubmVscyBpdCB3YXMgYXR0YWNoZWQgdG8uXG4gICAqIFNhZmUgdG8gY2FsbCBpZiB0aGUgcmVjb3JkZXIgd2FzIG9ubHkgb24gb25lIGNoYW5uZWwgb3IgbmV2ZXIgYXR0YWNoZWQuXG4gICAqL1xuICBkZXRhY2hDb21iaW5lZFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaFNjb3BlUmVjb3JkZXIoaWQpO1xuICAgIHRoaXMuZGV0YWNoRmxvd1JlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBFbWl0IFNjb3BlUmVjb3JkZXIgTWFuYWdlbWVudCAoUGhhc2UgMykg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhbiBgRW1pdFJlY29yZGVyYCDigJQgYW4gb2JzZXJ2ZXIgZm9yIGNvbnN1bWVyLWVtaXR0ZWQgc3RydWN0dXJlZFxuICAgKiBldmVudHMgZmlyZWQgdmlhIGBzY29wZS4kZW1pdChuYW1lLCBwYXlsb2FkKWAuXG4gICAqXG4gICAqIEludGVybmFsbHksIGVtaXQgcmVjb3JkZXJzIHNoYXJlIHRoZSBzY29wZS1yZWNvcmRlciBjaGFubmVsIGJlY2F1c2VcbiAgICogZW1pdCBldmVudHMgZmlyZSBmcm9tIGluc2lkZSBgU2NvcGVGYWNhZGVgIGR1cmluZyBzdGFnZSBleGVjdXRpb24sXG4gICAqIHNhbWUgdGltaW5nIGFzIGBvblJlYWRgL2BvbldyaXRlYC4gVGhpcyBtZXRob2QgaXMgYSBjb252ZW5pZW5jZSB0aGF0XG4gICAqIGRlbGVnYXRlcyB0byBgYXR0YWNoU2NvcGVSZWNvcmRlcmAg4oCUIGNvbnN1bWVycyBjYW4gYWxzbyB1c2VcbiAgICogYGF0dGFjaFNjb3BlUmVjb3JkZXJgIGRpcmVjdGx5IGZvciBhIHJlY29yZGVyIHRoYXQgaW1wbGVtZW50cyBCT1RIXG4gICAqIGBvbldyaXRlYCBhbmQgYG9uRW1pdGAuIEVpdGhlciBhcHByb2FjaCBwbGFjZXMgdGhlIHJlY29yZGVyIG9uIHRoZVxuICAgKiBzYW1lIHVuZGVybHlpbmcgbGlzdCwgc28gYG9uRW1pdGAgZmlyZXMgZXhhY3RseSBvbmNlIHBlciBldmVudC5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IGBpZGA6KiogcmVwbGFjZXMgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIGBpZGAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogZXhlY3V0b3IuYXR0YWNoRW1pdFJlY29yZGVyKHtcbiAgICogICBpZDogJ3Rva2VuLW1ldGVyJyxcbiAgICogICBvbkVtaXQ6IChlKSA9PiB7XG4gICAqICAgICBpZiAoZS5uYW1lID09PSAnYWdlbnRmb290cHJpbnQubGxtLnRva2VucycpIHRyYWNrVG9rZW5zKGUucGF5bG9hZCk7XG4gICAqICAgfSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoRW1pdFJlY29yZGVyKHJlY29yZGVyOiBFbWl0UmVjb3JkZXIpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXIgYXMgU2NvcGVSZWNvcmRlcik7XG4gIH1cblxuICAvKiogRGV0YWNoIGFuIGBFbWl0UmVjb3JkZXJgIGJ5IGlkLiBTYWZlIHRvIGNhbGwgaWYgbmV2ZXIgYXR0YWNoZWQuICovXG4gIGRldGFjaEVtaXRSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2hTY29wZVJlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgcmVjb3JkZXJzIGZpbHRlcmVkIHRvIHRob3NlIHRoYXRcbiAgICogaW1wbGVtZW50IGBvbkVtaXRgLiBVc2VmdWwgZm9yIGluc3BlY3Rpb24gZHVyaW5nIHRlc3RpbmcuXG4gICAqL1xuICBnZXRFbWl0UmVjb3JkZXJzKCk6IEVtaXRSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoXG4gICAgICAocik6IHIgaXMgRW1pdFJlY29yZGVyID0+IHR5cGVvZiAociBhcyB7IG9uRW1pdD86IHVua25vd24gfSkub25FbWl0ID09PSAnZnVuY3Rpb24nLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzdHJ1Y3R1cmVkIG5hcnJhdGl2ZSBlbnRyaWVzIOKAlCB0aGUgc2luZ2xlIHB1YmxpYyBuYXJyYXRpdmUgQVBJLlxuICAgKiBFYWNoIGVudHJ5IGhhcyBhIHR5cGUgKHN0YWdlLCBzdGVwLCBjb25kaXRpb24sIGZvcmssIGV0Yy4pLCB0ZXh0LCBhbmRcbiAgICogZGVwdGguIENvbnN1bWVycyByZW5kZXIgaG93ZXZlciB0aGV5IHdhbnQ7IGNhbGwgYC5tYXAoZSA9PiBlLnRleHQpYFxuICAgKiBpZiBhIGZsYXQgYHN0cmluZ1tdYCBpcyBuZWVkZWQgbG9jYWxseS5cbiAgICovXG4gIGdldE5hcnJhdGl2ZUVudHJpZXMoKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21iaW5lZFJlY29yZGVyLmdldEVudHJpZXMoKTtcbiAgICB9XG4gICAgY29uc3QgZmxvd1NlbnRlbmNlcyA9IHRoaXMudHJhdmVyc2VyLmdldE5hcnJhdGl2ZSgpO1xuICAgIHJldHVybiBmbG93U2VudGVuY2VzLm1hcCgodGV4dCkgPT4gKHsgdHlwZTogJ3N0YWdlJyBhcyBjb25zdCwgdGV4dCwgZGVwdGg6IDAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbWJpbmVkIEZsb3dSZWNvcmRlcnMgbGlzdC4gV2hlbiBuYXJyYXRpdmUgaXMgZW5hYmxlZCxcbiAgICogaW5jbHVkZXMgdGhlIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgKHdoaWNoIGJ1aWxkcyBtZXJnZWQgZmxvdytkYXRhXG4gICAqIGVudHJpZXMgaW5saW5lKS4gUGx1cyBhbnkgdXNlci1hdHRhY2hlZCByZWNvcmRlcnMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRmxvd1JlY29yZGVyc0xpc3QoKTogRmxvd1JlY29yZGVyW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyczogRmxvd1JlY29yZGVyW10gPSBbXTtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZWNvcmRlcnMucHVzaCh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpO1xuICAgIH1cbiAgICByZWNvcmRlcnMucHVzaCguLi50aGlzLmZsb3dSZWNvcmRlcnMpO1xuICAgIHJldHVybiByZWNvcmRlcnMubGVuZ3RoID4gMCA/IHJlY29yZGVycyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFzeW5jIHJ1bihvcHRpb25zPzogUnVuT3B0aW9ucyk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICBsZXQgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGxldCB0aW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGludGVybmFsIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dE1zXG4gICAgaWYgKG9wdGlvbnM/LnRpbWVvdXRNcyAmJiAhc2lnbmFsKSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgc2lnbmFsID0gY29udHJvbGxlci5zaWduYWw7XG4gICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiBjb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcihgRXhlY3V0aW9uIHRpbWVkIG91dCBhZnRlciAke29wdGlvbnMudGltZW91dE1zfW1zYCkpLFxuICAgICAgICBvcHRpb25zLnRpbWVvdXRNcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5wdXQgYWdhaW5zdCBpbnB1dFNjaGVtYSBpZiBib3RoIGFyZSBwcmVzZW50XG4gICAgbGV0IHZhbGlkYXRlZElucHV0ID0gb3B0aW9ucz8uaW5wdXQ7XG4gICAgaWYgKHZhbGlkYXRlZElucHV0ICYmIHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuaW5wdXRTY2hlbWEpIHtcbiAgICAgIHZhbGlkYXRlZElucHV0ID0gdmFsaWRhdGVJbnB1dCh0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hLCB2YWxpZGF0ZWRJbnB1dCk7XG4gICAgfVxuXG4gICAgLy8gVXNlci1hdHRhY2hlZCByZWNvcmRlcnMgKGZsb3dSZWNvcmRlcnMgKyBzY29wZVJlY29yZGVycykgYXJlIGNsZWFyZWQgdmlhIGNsZWFyKCkgdG8gcHJldmVudFxuICAgIC8vIGNyb3NzLXJ1biBhY2N1bXVsYXRpb24uIFRoZSBjb21iaW5lZFJlY29yZGVyIGlzIE5PVCBjbGVhcmVkIGhlcmUg4oCUIGNyZWF0ZVRyYXZlcnNlcigpIGFsd2F5c1xuICAgIC8vIGNyZWF0ZXMgYSBmcmVzaCBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIGluc3RhbmNlIG9uIGVhY2ggcnVuLCBzbyBzdGFsZSBzdGF0ZSBpcyBuZXZlciBhbiBpc3N1ZS5cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSB7XG4gICAgICByLmNsZWFyPy4oKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHtcbiAgICAgIHIuY2xlYXI/LigpO1xuICAgIH1cblxuICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlciA9IHsgdmFsdWU6IDAgfTsgLy8gUmVzZXQgY291bnRlciBvbiBmcmVzaCBydW5cbiAgICB0aGlzLl9jdXJyZW50UnVuSWQgPSBnZW5lcmF0ZVJ1bklkKCk7IC8vIEZyZXNoIHJ1bklkIHBlciBydW4oKSBjYWxsXG4gICAgdGhpcy5faGFzUnVuQmVmb3JlID0gdHJ1ZTsgLy8gbWFyayBzbyBhIGxhdGVyIHJlc3VtZSgpIHRha2VzIHRoZVxuICAgIC8vIHNhbWUtZXhlY3V0b3IgYnJhbmNoIChyZXVzZSBydW50aW1lLCBhY2N1bXVsYXRlIGV4ZWN1dGlvbiB0cmVlKS5cbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKHNpZ25hbCwgdmFsaWRhdGVkSW5wdXQsIG9wdGlvbnM/LmVudiwgb3B0aW9ucz8ubWF4RGVwdGgpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50cmF2ZXJzZXIuZXhlY3V0ZSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgLy8gQnVpbGQgY2hlY2twb2ludCBmcm9tIGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlXG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy50cmF2ZXJzZXIuZ2V0U25hcHNob3QoKTtcbiAgICAgICAgY29uc3Qgc2ZSZXN1bHRzID0gdGhpcy50cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKTtcbiAgICAgICAgLy8gU3ViZmxvdyBzY29wZSBjYXB0dXJlIHN1cnZpdmVzIE9OTFkgb24gdGhlIHNpZ25hbCDigJQgdGhlXG4gICAgICAgIC8vIG5lc3RlZCBydW50aW1lcyBhcmUgR0MnZCBhcyB0aGUgc3RhY2sgdW53aW5kcy4gUHJvbW90ZSB0b1xuICAgICAgICAvLyB0aGUgY2hlY2twb2ludCBoZXJlIHNvIGNyb3NzLWV4ZWN1dG9yIHJlc3VtZSBjYW4gcmVzdG9yZVxuICAgICAgICAvLyBwcmUtcGF1c2Ugc3ViZmxvdyBzY29wZSAoZS5nLiBhbiBBZ2VudCdzIGBzY29wZS5oaXN0b3J5YCkuXG4gICAgICAgIC8vIEVtcHR5IGB7fWAgZm9yIHJvb3QtbGV2ZWwgcGF1c2VzIChubyBzdWJmbG93cyBlbnRlcmVkKS5cbiAgICAgICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHtcbiAgICAgICAgICBzaGFyZWRTdGF0ZTogc25hcHNob3Quc2hhcmVkU3RhdGUsXG4gICAgICAgICAgZXhlY3V0aW9uVHJlZTogc25hcHNob3QuZXhlY3V0aW9uVHJlZSxcbiAgICAgICAgICBwYXVzZWRTdGFnZUlkOiBlcnJvci5zdGFnZUlkLFxuICAgICAgICAgIHN1YmZsb3dQYXRoOiBlcnJvci5zdWJmbG93UGF0aCxcbiAgICAgICAgICBwYXVzZURhdGE6IGVycm9yLnBhdXNlRGF0YSxcbiAgICAgICAgICBzdWJmbG93U3RhdGVzOiBlcnJvci5zdWJmbG93U3RhdGVzLFxuICAgICAgICAgIC4uLihzZlJlc3VsdHMuc2l6ZSA+IDAgJiYgeyBzdWJmbG93UmVzdWx0czogT2JqZWN0LmZyb21FbnRyaWVzKHNmUmVzdWx0cykgfSksXG4gICAgICAgICAgLy8gSW52b2tlciBjb250ZXh0IOKAlCBjb2xsZWN0ZWQgZHVyaW5nIHRyYXZlcnNhbCBidWJibGUtdXAgKG5vdCB0cmVlLXdhbGtlZClcbiAgICAgICAgICAuLi4oZXJyb3IuaW52b2tlclN0YWdlSWQgJiYgeyBpbnZva2VyU3RhZ2VJZDogZXJyb3IuaW52b2tlclN0YWdlSWQgfSksXG4gICAgICAgICAgLi4uKGVycm9yLmNvbnRpbnVhdGlvblN0YWdlSWQgJiYgeyBjb250aW51YXRpb25TdGFnZUlkOiBlcnJvci5jb250aW51YXRpb25TdGFnZUlkIH0pLFxuICAgICAgICAgIHBhdXNlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICB9O1xuICAgICAgICAvLyBSZXR1cm4gYSBQYXVzZVJlc3VsdC1zaGFwZWQgdmFsdWUgc28gY2FsbGVycyBjYW4gY2hlY2sgd2l0aG91dCB0cnkvY2F0Y2hcbiAgICAgICAgcmV0dXJuIHsgcGF1c2VkOiB0cnVlLCBjaGVja3BvaW50OiB0aGlzLmxhc3RDaGVja3BvaW50IH0gc2F0aXNmaWVzIFBhdXNlZFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGltZW91dElkICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbnRyb3NwZWN0aW9uIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRhY3QgIFdoZW4gYHRydWVgLCBgc2hhcmVkU3RhdGVgIGNvbWVzIGZyb20gdGhlIHBhcmFsbGVsXG4gICAqICAgcmVkYWN0ZWQgbWlycm9yIChpZiBtYWludGFpbmVkIOKAlCBzZWUgYHNldFJlZGFjdGlvblBvbGljeWApLiBUaGlzIGlzXG4gICAqICAgdGhlIHNhZmUgdmlldyBmb3IgZXhwb3J0aW5nIHRyYWNlcyBleHRlcm5hbGx5IChwYXN0ZSBpbnRvIGEgdmlld2VyLFxuICAgKiAgIHNoYXJlIHdpdGggc3VwcG9ydCkuIFdoZW4gbm8gcmVkYWN0aW9uIHBvbGljeSBpcyBjb25maWd1cmVkIHRoZVxuICAgKiAgIHJlZGFjdGVkIG1pcnJvciBpcyBub3QgbWFpbnRhaW5lZCwgc28gdGhpcyBmbGFnIGlzIGEgbm8tb3Ag4oCUXG4gICAqICAgYHNoYXJlZFN0YXRlYCBpcyB0aGUgcmF3IHdvcmtpbmcgbWVtb3J5IGVpdGhlciB3YXkuIERlZmF1bHQgYGZhbHNlYC5cbiAgICpcbiAgICogICBUaGUgY29tbWl0IGxvZyBpcyBhbHJlYWR5IHJlZGFjdGVkIGF0IHdyaXRlLXRpbWUgcmVnYXJkbGVzcyBvZiB0aGlzXG4gICAqICAgZmxhZywgYW5kIHRoZSBleGVjdXRpb24gdHJlZSBjYXJyaWVzIG9ubHkgc3RydWN0dXJhbCBtZXRhZGF0YS5cbiAgICovXG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSk6IFJ1bnRpbWVTbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnRyYXZlcnNlci5nZXRTbmFwc2hvdChvcHRpb25zKSBhcyBSdW50aW1lU25hcHNob3Q7XG4gICAgY29uc3Qgc2ZSZXN1bHRzID0gdGhpcy50cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKTtcbiAgICBpZiAoc2ZSZXN1bHRzLnNpemUgPiAwKSB7XG4gICAgICBzbmFwc2hvdC5zdWJmbG93UmVzdWx0cyA9IE9iamVjdC5mcm9tRW50cmllcyhzZlJlc3VsdHMpO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3Qgc25hcHNob3QgZGF0YSBmcm9tIHJlY29yZGVycyB0aGF0IGltcGxlbWVudCB0b1NuYXBzaG90KClcbiAgICBjb25zdCByZWNvcmRlclNuYXBzaG90czogUmVjb3JkZXJTbmFwc2hvdFtdID0gW107XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHtcbiAgICAgIGlmIChyLnRvU25hcHNob3QpIHtcbiAgICAgICAgY29uc3Qgc25hcCA9IHIudG9TbmFwc2hvdCgpO1xuICAgICAgICByZWNvcmRlclNuYXBzaG90cy5wdXNoKHtcbiAgICAgICAgICBpZDogci5pZCxcbiAgICAgICAgICBuYW1lOiBzbmFwLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHNuYXAuZGVzY3JpcHRpb24sXG4gICAgICAgICAgcHJlZmVycmVkT3BlcmF0aW9uOiBzbmFwLnByZWZlcnJlZE9wZXJhdGlvbixcbiAgICAgICAgICBkYXRhOiBzbmFwLmRhdGEsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSB7XG4gICAgICBpZiAoci50b1NuYXBzaG90KSB7XG4gICAgICAgIGNvbnN0IHNuYXAgPSByLnRvU25hcHNob3QoKTtcbiAgICAgICAgcmVjb3JkZXJTbmFwc2hvdHMucHVzaCh7XG4gICAgICAgICAgaWQ6IHIuaWQsXG4gICAgICAgICAgbmFtZTogc25hcC5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBzbmFwLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogc25hcC5wcmVmZXJyZWRPcGVyYXRpb24sXG4gICAgICAgICAgZGF0YTogc25hcC5kYXRhLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlY29yZGVyU25hcHNob3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnJlY29yZGVycyA9IHJlY29yZGVyU25hcHNob3RzO1xuICAgIH1cblxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnRyYXZlcnNlci5zZXRSb290T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRCcmFuY2hJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEJyYW5jaElkcygpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lUm9vdCgpOiBTdGFnZU5vZGUge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lUm9vdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lU3RydWN0dXJlKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1YmZsb3cgbWFuaWZlc3QgZnJvbSBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlci5cbiAgICogUmV0dXJucyBlbXB0eSBhcnJheSBpZiBubyBNYW5pZmVzdEZsb3dSZWNvcmRlciBpcyBhdHRhY2hlZC5cbiAgICovXG4gIGdldFN1YmZsb3dNYW5pZmVzdCgpOiBNYW5pZmVzdEVudHJ5W10ge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0TWFuaWZlc3QoKSA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIHNwZWMgZm9yIGEgZHluYW1pY2FsbHktcmVnaXN0ZXJlZCBzdWJmbG93LlxuICAgKiBSZXF1aXJlcyBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlciB0aGF0IG9ic2VydmVkIHRoZSByZWdpc3RyYXRpb24uXG4gICAqL1xuICBnZXRTdWJmbG93U3BlYyhzdWJmbG93SWQ6IHN0cmluZyk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0U3BlYyhzdWJmbG93SWQpO1xuICB9XG59XG4iXX0=
1149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHOzs7QUFHSCxpREFBb0g7QUFFcEgsbUdBQTZGO0FBRzdGLG1HQUE2RjtBQUU3RixtRUFBa0U7QUFDbEUscUZBQStFO0FBQy9FLGlEQVc0QjtBQUc1QixnREFBa0Q7QUFFbEQseUVBQXFIO0FBRXJILGtFQUF1RDtBQUN2RCwyRUFBa0U7QUFFbEUsNERBQXNEO0FBRXRELG1FQUFpRztBQUNqRywrREFBc0c7QUFDdEcseUNBQTJDO0FBQzNDLHlEQUFtRDtBQUVuRCwwRUFBMEU7QUFDMUUsTUFBTSxtQkFBbUIsR0FBaUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUMxRSxJQUFJLDRCQUFXLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7QUF5RGpELE1BQWEsaUJBQWlCO0lBQ3BCLFNBQVMsQ0FBbUM7SUFDcEQsOEVBQThFO0lBQ3RFLGlCQUFpQixHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3pDOzsrQkFFMkI7SUFDbkIsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUNuQixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDekIsZ0JBQWdCLENBQW9DO0lBQ3BELGdCQUFnQixDQUF3QztJQUN4RCxhQUFhLEdBQW1CLEVBQUUsQ0FBQztJQUNuQyxjQUFjLEdBQW9CLEVBQUUsQ0FBQztJQUNyQyxlQUFlLENBQThCO0lBQzdDLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDdkMseUJBQXlCLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDM0QsY0FBYyxDQUFrQztJQUN4RDs7Ozs7Ozs7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bG93Q2hhcnRFeGVjdXRvciDigJQgUHVibGljIEFQSSBmb3IgZXhlY3V0aW5nIGEgY29tcGlsZWQgRmxvd0NoYXJ0LlxuICpcbiAqIFdyYXBzIEZsb3djaGFydFRyYXZlcnNlci4gQnVpbGQgYSBjaGFydCB3aXRoIGZsb3dDaGFydCgpIGFuZCBwYXNzIHRoZSByZXN1bHQgaGVyZTpcbiAqXG4gKiAgIGNvbnN0IGNoYXJ0ID0gZmxvd0NoYXJ0KCdlbnRyeScsIGVudHJ5Rm4pLmFkZEZ1bmN0aW9uKCdwcm9jZXNzJywgcHJvY2Vzc0ZuKS5idWlsZCgpO1xuICpcbiAqICAgLy8gTm8tb3B0aW9ucyBmb3JtICh1c2VzIGF1dG8tZGV0ZWN0ZWQgVHlwZWRTY29wZSBmYWN0b3J5IGZyb20gdGhlIGNoYXJ0KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICpcbiAqICAgLy8gT3B0aW9ucy1vYmplY3QgZm9ybSAocHJlZmVycmVkIHdoZW4geW91IG5lZWQgdG8gY3VzdG9taXplIGJlaGF2aW9yKTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5OiBteUZhY3RvcnkgfSk7XG4gKlxuICogICAvLyAyLXBhcmFtIGZvcm0gKGFjY2VwdHMgYSBTY29wZUZhY3RvcnkgZGlyZWN0bHksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIG15RmFjdG9yeSk7XG4gKlxuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dDogZGF0YSwgZW52OiB7IHRyYWNlSWQ6ICdyZXEtMTIzJyB9IH0pO1xuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0IH0gZnJvbSAnLi4vYnVpbGRlci90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZXRhY2hBbmRGb3JnZXQgYXMgX2RldGFjaEFuZEZvcmdldCwgZGV0YWNoQW5kSm9pbkxhdGVyIGFzIF9kZXRhY2hBbmRKb2luTGF0ZXIgfSBmcm9tICcuLi9kZXRhY2gvc3Bhd24uanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvbmFycmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3JlY29yZGVycy9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgYnVpbGRSdW50aW1lU3RhZ2VJZCB9IGZyb20gJy4uL2VuZ2luZS9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgeyBGbG93Y2hhcnRUcmF2ZXJzZXIgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEV4ZWN1dG9yUmVzdWx0LFxuICB0eXBlIFBhdXNlZFJlc3VsdCxcbiAgdHlwZSBSdW5PcHRpb25zLFxuICB0eXBlIFNjb3BlRmFjdG9yeSxcbiAgdHlwZSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHR5cGUgU3RhZ2VOb2RlLFxuICB0eXBlIFN0cmVhbUhhbmRsZXJzLFxuICB0eXBlIFN1YmZsb3dSZXN1bHQsXG4gIHR5cGUgVHJhdmVyc2FsUmVzdWx0LFxuICBkZWZhdWx0TG9nZ2VyLFxufSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZVNuYXBzaG90IH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd2NoYXJ0Q2hlY2twb2ludCwgUGF1c2VTaWduYWwgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBoYXNFbWl0UmVjb3JkZXJNZXRob2RzLCBoYXNGbG93UmVjb3JkZXJNZXRob2RzLCBoYXNSZWNvcmRlck1ldGhvZHMgfSBmcm9tICcuLi9yZWNvcmRlci9Db21iaW5lZFJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvRW1pdFJlY29yZGVyLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcbmltcG9ydCB7IGRlZXBGcmVlemUgfSBmcm9tICcuLi9zY29wZS9wcm90ZWN0aW9uL3JlYWRvbmx5SW5wdXQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgeyBTY29wZUZhY2FkZSB9IGZyb20gJy4uL3Njb3BlL1Njb3BlRmFjYWRlLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uUG9saWN5LCBSZWRhY3Rpb25SZXBvcnQsIFNjb3BlUmVjb3JkZXIgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZXNjcmliZUNoZWNrcG9pbnRDbG9uZUZhaWx1cmUsIHNhbml0aXplRGlhZ25vc3RpY0JhZ3MgfSBmcm9tICcuL2NoZWNrcG9pbnRTYW5pdGl6ZS5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlY29yZGVyU25hcHNob3QsIHR5cGUgUnVudGltZVNuYXBzaG90LCBFeGVjdXRpb25SdW50aW1lIH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUnVuSWQgfSBmcm9tICcuL3J1bklkLmpzJztcbmltcG9ydCB7IHZhbGlkYXRlSW5wdXQgfSBmcm9tICcuL3ZhbGlkYXRlSW5wdXQuanMnO1xuXG4vKiogRGVmYXVsdCBzY29wZSBmYWN0b3J5IOKAlCBjcmVhdGVzIGEgcGxhaW4gU2NvcGVGYWNhZGUgZm9yIGVhY2ggc3RhZ2UuICovXG5jb25zdCBkZWZhdWx0U2NvcGVGYWN0b3J5OiBTY29wZUZhY3RvcnkgPSAoY3R4LCBzdGFnZU5hbWUsIHJlYWRPbmx5LCBlbnYpID0+XG4gIG5ldyBTY29wZUZhY2FkZShjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHksIGVudik7XG5cbi8qKlxuICogT3B0aW9ucyBvYmplY3QgZm9yIGBGbG93Q2hhcnRFeGVjdXRvcmAg4oCUIHByZWZlcnJlZCBvdmVyIHBvc2l0aW9uYWwgcGFyYW1zLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGV4ID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7XG4gKiAgIHNjb3BlRmFjdG9yeTogbXlGYWN0b3J5LFxuICogICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dDogeyAuLi4gfSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogKipTeW5jIG5vdGUgZm9yIG1haW50YWluZXJzOioqIEV2ZXJ5IGZpZWxkIGFkZGVkIGhlcmUgbXVzdCBhbHNvIGFwcGVhciBpbiB0aGVcbiAqIGBmbG93Q2hhcnRBcmdzYCBwcml2YXRlIGZpZWxkIHR5cGUgYW5kIGluIHRoZSBjb25zdHJ1Y3RvcidzIG9wdGlvbnMtcmVzb2x1dGlvblxuICogYmxvY2sgKHRoZSBgZWxzZSBpZmAgYnJhbmNoIHRoYXQgcmVhZHMgZnJvbSBgb3B0c2ApLiBNaXNzaW5nIGFueSBvbmUgb2YgdGhlXG4gKiB0aHJlZSBjYXVzZXMgc2lsZW50IG9taXNzaW9uIOKAlCB0aGUgb3B0aW9uIGlzIGFjY2VwdGVkIGJ1dCBuZXZlciBhcHBsaWVkLlxuICpcbiAqICoqVFNjb3BlIGluZmVyZW5jZSBub3RlOioqIFdoZW4gdXNpbmcgdGhlIG9wdGlvbnMtb2JqZWN0IGZvcm0gd2l0aCBhIGN1c3RvbSBzY29wZSxcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGluZmVyIGBUU2NvcGVgIHRocm91Z2ggdGhlIG9wdGlvbnMgb2JqZWN0LiBQYXNzIHRoZSB0eXBlXG4gKiBleHBsaWNpdGx5OiBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yPFRPdXQsIE15U2NvcGU+KGNoYXJ0LCB7IHNjb3BlRmFjdG9yeSB9KWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZSA9IGFueT4ge1xuICAvLyDilIDilIAgQ29tbW9uIG9wdGlvbnMgKG1vc3QgY2FsbGVycyBuZWVkIG9ubHkgdGhlc2UpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDdXN0b20gc2NvcGUgZmFjdG9yeS4gRGVmYXVsdHMgdG8gVHlwZWRTY29wZSBvciBTY29wZUZhY2FkZSBhdXRvLWRldGVjdGlvbi4gKi9cbiAgc2NvcGVGYWN0b3J5PzogU2NvcGVGYWN0b3J5PFRTY29wZT47XG5cbiAgLy8g4pSA4pSAIENvbnRleHQgb3B0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgcHJlLXBvcHVsYXRlZCBpbnRvIHRoZSBzaGFyZWQgY29udGV4dCBiZWZvcmUgKiplYWNoKiogc3RhZ2VcbiAgICogKHJlLWFwcGxpZWQgZXZlcnkgc3RhZ2UsIGFjdGluZyBhcyBiYXNlbGluZSBkZWZhdWx0cykuXG4gICAqL1xuICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dD86IHVua25vd247XG4gIC8qKlxuICAgKiBJbml0aWFsIGNvbnRleHQgdmFsdWVzIG1lcmdlZCBpbnRvIHRoZSBzaGFyZWQgY29udGV4dCAqKm9uY2UqKiBhdCBzdGFydHVwXG4gICAqIChhcHBsaWVkIGJlZm9yZSB0aGUgZmlyc3Qgc3RhZ2UsIG5vdCByZXBlYXRlZCBvbiBzdWJzZXF1ZW50IHN0YWdlcykuXG4gICAqIERpc3RpbmN0IGZyb20gYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCwgd2hpY2ggaXMgcmUtYXBwbGllZCBldmVyeSBzdGFnZS5cbiAgICovXG4gIGluaXRpYWxDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIFJlYWQtb25seSBpbnB1dCBhY2Nlc3NpYmxlIHZpYSBgc2NvcGUuZ2V0QXJncygpYCDigJQgbmV2ZXIgdHJhY2tlZCBvciB3cml0dGVuLiAqL1xuICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuXG4gIC8vIOKUgOKUgCBBZHZhbmNlZCAvIGVzY2FwZS1oYXRjaCBvcHRpb25zIChtb3N0IGNhbGxlcnMgZG8gbm90IG5lZWQgdGhlc2UpIOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgY2xhc3NpZmllciBmb3IgdGhyb3R0bGluZyBkZXRlY3Rpb24uIFJldHVybiBgdHJ1ZWAgaWYgdGhlXG4gICAqIGVycm9yIHJlcHJlc2VudHMgYSByYXRlLWxpbWl0IG9yIGJhY2twcmVzc3VyZSBjb25kaXRpb24gKHRoZSBleGVjdXRvciB3aWxsXG4gICAqIHRyZWF0IGl0IGRpZmZlcmVudGx5IGZyb20gaGFyZCBmYWlsdXJlcykuIERlZmF1bHRzIHRvIG5vIHRocm90dGxpbmcgY2xhc3NpZmljYXRpb24uXG4gICAqL1xuICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyPzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICAvKiogSGFuZGxlcnMgZm9yIHN0cmVhbWluZyBzdGFnZSBsaWZlY3ljbGUgZXZlbnRzIChzZWUgYGFkZFN0cmVhbWluZ0Z1bmN0aW9uYCkuICovXG4gIHN0cmVhbUhhbmRsZXJzPzogU3RyZWFtSGFuZGxlcnM7XG4gIC8qKiBTY29wZSBwcm90ZWN0aW9uIG1vZGUgZm9yIFR5cGVkU2NvcGUgZGlyZWN0LWFzc2lnbm1lbnQgZGV0ZWN0aW9uLiAqL1xuICBzY29wZVByb3RlY3Rpb25Nb2RlPzogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbn1cblxuZXhwb3J0IGNsYXNzIEZsb3dDaGFydEV4ZWN1dG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHRyYXZlcnNlcjogRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT47XG4gIC8qKiBTaGFyZWQgZXhlY3V0aW9uIGNvdW50ZXIg4oCUIHN1cnZpdmVzIHBhdXNlL3Jlc3VtZS4gUmVzZXQgb24gZnJlc2ggcnVuKCkuICovXG4gIHByaXZhdGUgX2V4ZWN1dGlvbkNvdW50ZXIgPSB7IHZhbHVlOiAwIH07XG4gIC8qKiBQZXItYHJ1bigpYCBpZGVudGlmaWVyIOKAlCBnZW5lcmF0ZWQgZnJlc2ggcGVyIHJ1biArIHBlciByZXN1bWUuIFRocmVhZGVkXG4gICAqICB0aHJvdWdoIGV2ZXJ5IFRyYXZlcnNhbENvbnRleHQgc28gcmVjb3JkZXJzIGNhbiBzY29wZSBzdGF0ZSB0byBhIHNpbmdsZVxuICAgKiAgcnVuLiBTZWUgYHJ1bklkLnRzYC4gKi9cbiAgcHJpdmF0ZSBfY3VycmVudFJ1bklkID0gJyc7XG4gIHByaXZhdGUgbmFycmF0aXZlRW5hYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIG5hcnJhdGl2ZU9wdGlvbnM/OiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSBjb21iaW5lZFJlY29yZGVyOiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGZsb3dSZWNvcmRlcnM6IEZsb3dSZWNvcmRlcltdID0gW107XG4gIHByaXZhdGUgc2NvcGVSZWNvcmRlcnM6IFNjb3BlUmVjb3JkZXJbXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGlvblBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNoYXJlZFJlZGFjdGVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gIHByaXZhdGUgbGFzdENoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBgdHJ1ZWAgb25jZSBgcnVuKClgIChvciBhIHByZXZpb3VzIGByZXN1bWUoKWApIGhhcyBleGVjdXRlZCBvblxuICAgKiB0aGlzIGluc3RhbmNlLiBgcmVzdW1lKClgIGJyYW5jaGVzIG9uIGl0OlxuICAgKlxuICAgKiAgIOKAoiB0cnVlICDihpIgcmV1c2UgdGhlIGNvbnN0cnVjdG9yLXRpbWUgcnVudGltZSAoc2FtZS1leGVjdXRvclxuICAgKiAgICAgICAgICAgICBjb250aW51aXR5OiBleGVjdXRpb24gdHJlZSwgcmVjb3JkZXJzLCBuYXJyYXRpdmVcbiAgICogICAgICAgICAgICAgYWNjdW11bGF0ZSBhY3Jvc3MgcGF1c2UvcmVzdW1lIGN5Y2xlcylcbiAgICogICDigKIgZmFsc2Ug4oaSIHNlZWQgYSBmcmVzaCBydW50aW1lIGZyb20gYGNoZWNrcG9pbnQuc2hhcmVkU3RhdGVgXG4gICAqICAgICAgICAgICAgIChjcm9zcy1leGVjdXRvciAvIGNyb3NzLXByb2Nlc3MgcmVzdW1lOiBuZXcgaW5zdGFuY2VcbiAgICogICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcm9tIGEgc2VyaWFsaXplZCBjaGVja3BvaW50KVxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMgZmxhZywgZnJlc2ggZXhlY3V0b3JzIHNpbGVudGx5IGRpc2NhcmRlZCB0aGVcbiAgICogY2hlY2twb2ludCdzIHNoYXJlZFN0YXRlIGFuZCByZXN1bWUgaGFuZGxlcnMgY291bGRuJ3QgcmVhZCBwcmUtcGF1c2VcbiAgICogc2NvcGUuIFNlZSBgdGVzdC9saWIvcGF1c2UvY3Jvc3MtZXhlY3V0b3ItcmVzdW1lLnRlc3QudHNgLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFzUnVuQmVmb3JlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBSZS1lbnRyYW5jeSBndWFyZC4gYHJ1bigpYCBhbmQgYHJlc3VtZSgpYCBtdXRhdGUgcGVyLXJ1biBpbnN0YW5jZSBzdGF0ZVxuICAgKiAodHJhdmVyc2VyLCBydW5JZCwgZXhlY3V0aW9uIGNvdW50ZXIsIGNoZWNrcG9pbnQpIGFuZCBjbGVhciBhdHRhY2hlZFxuICAgKiByZWNvcmRlcnMg4oCUIGEgc2Vjb25kIGNvbmN1cnJlbnQgZW50cnkgb24gdGhlIFNBTUUgZXhlY3V0b3Igd291bGRcbiAgICogaW50ZXJsZWF2ZSBydW5JZHMgYW5kIGNyb3NzLWNvbnRhbWluYXRlIHJlY29yZGVyL25hcnJhdGl2ZSBzdGF0ZSwgYW5kXG4gICAqIGBnZXRDaGVja3BvaW50KClgIHdvdWxkIHJldHVybiB3aGljaGV2ZXIgcnVuIHBhdXNlZCBsYXN0LiBPbmUgZXhlY3V0b3IgPVxuICAgKiBvbmUgaW4tZmxpZ2h0IGV4ZWN1dGlvbjsgY3JlYXRlIGFuIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi5cbiAgICogU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC5cbiAgICovXG4gIHByaXZhdGUgX2lzRXhlY3V0aW5nID0gZmFsc2U7XG5cbiAgLy8gU1lOQyBSRVFVSVJFRDogZXZlcnkgb3B0aW9uYWwgZmllbGQgaGVyZSBtdXN0IG1pcnJvciBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnNcbiAgLy8gQU5EIGJlIGFzc2lnbmVkIGluIHRoZSBjb25zdHJ1Y3RvcidzIG9wdGlvbnMtcmVzb2x1dGlvbiBibG9jayAodGhlIGBlbHNlIGlmYCBicmFuY2gpLlxuICAvLyBBZGRpbmcgYSBmaWVsZCB0byBvbmx5IG9uZSBvZiB0aGUgdGhyZWUgcGxhY2VzIGNhdXNlcyBzaWxlbnQgb21pc3Npb24uXG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd0NoYXJ0QXJnczoge1xuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT47XG4gICAgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcbiAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dD86IHVua25vd247XG4gICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBGbG93Q2hhcnRFeGVjdXRvci5cbiAgICpcbiAgICogKipPcHRpb25zIG9iamVjdCBmb3JtKiogKHByZWZlcnJlZCk6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeSwgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQgfSlcbiAgICogYGBgXG4gICAqXG4gICAqICoqMi1wYXJhbSBmb3JtKiogKGFsc28gc3VwcG9ydGVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSlcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBmbG93Q2hhcnQgLSBUaGUgY29tcGlsZWQgRmxvd0NoYXJ0IHJldHVybmVkIGJ5IGBmbG93Q2hhcnQoLi4uKS5idWlsZCgpYFxuICAgKiBAcGFyYW0gZmFjdG9yeU9yT3B0aW9ucyAtIEEgYFNjb3BlRmFjdG9yeTxUU2NvcGU+YCBPUiBhIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlPmAgb3B0aW9ucyBvYmplY3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBmbG93Q2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICAgIGZhY3RvcnlPck9wdGlvbnM/OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGU+LFxuICApIHtcbiAgICAvLyBEZXRlY3Qgb3B0aW9ucy1vYmplY3QgZm9ybSB2cyBmYWN0b3J5IGZvcm1cbiAgICBsZXQgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ6IHVua25vd247XG4gICAgbGV0IGluaXRpYWxDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCByZWFkT25seUNvbnRleHQ6IHVua25vd247XG4gICAgbGV0IHRocm90dGxpbmdFcnJvckNoZWNrZXI6ICgoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1IYW5kbGVyczogU3RyZWFtSGFuZGxlcnMgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHNjb3BlUHJvdGVjdGlvbk1vZGU6IFNjb3BlUHJvdGVjdGlvbk1vZGUgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZW9mIGZhY3RvcnlPck9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIDItcGFyYW0gZm9ybTogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCBzY29wZUZhY3RvcnkpXG4gICAgICBzY29wZUZhY3RvcnkgPSBmYWN0b3J5T3JPcHRpb25zO1xuICAgIH0gZWxzZSBpZiAoZmFjdG9yeU9yT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBPcHRpb25zIG9iamVjdCBmb3JtXG4gICAgICBjb25zdCBvcHRzID0gZmFjdG9yeU9yT3B0aW9ucztcbiAgICAgIHNjb3BlRmFjdG9yeSA9IG9wdHMuc2NvcGVGYWN0b3J5O1xuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQgPSBvcHRzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0O1xuICAgICAgaW5pdGlhbENvbnRleHQgPSBvcHRzLmluaXRpYWxDb250ZXh0O1xuICAgICAgcmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyID0gb3B0cy50aHJvdHRsaW5nRXJyb3JDaGVja2VyO1xuICAgICAgc3RyZWFtSGFuZGxlcnMgPSBvcHRzLnN0cmVhbUhhbmRsZXJzO1xuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZSA9IG9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgICB9XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzID0ge1xuICAgICAgZmxvd0NoYXJ0LFxuICAgICAgc2NvcGVGYWN0b3J5OiBzY29wZUZhY3RvcnkgPz8gZmxvd0NoYXJ0LnNjb3BlRmFjdG9yeSA/PyAoZGVmYXVsdFNjb3BlRmFjdG9yeSBhcyBTY29wZUZhY3Rvcnk8VFNjb3BlPiksXG4gICAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dCxcbiAgICAgIGluaXRpYWxDb250ZXh0LFxuICAgICAgcmVhZE9ubHlDb250ZXh0LFxuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICB9O1xuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVHJhdmVyc2VyKFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgIHJlYWRPbmx5Q29udGV4dE92ZXJyaWRlPzogdW5rbm93bixcbiAgICBlbnY/OiBpbXBvcnQoJy4uL2VuZ2luZS90eXBlcycpLkV4ZWN1dGlvbkVudixcbiAgICBtYXhEZXB0aD86IG51bWJlcixcbiAgICBvdmVycmlkZXM/OiB7XG4gICAgICByb290PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gICAgICBwcmVzZXJ2ZVJlY29yZGVycz86IGJvb2xlYW47XG4gICAgICBleGlzdGluZ1J1bnRpbWU/OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+O1xuICAgICAgLyoqIFBlci1zdWJmbG93IHNjb3BlIGNhcHR1cmVzIGZyb20gYSBjaGVja3BvaW50IOKAlCBwYXNzZWQgdGhyb3VnaFxuICAgICAgICogIHRvIEhhbmRsZXJEZXBzIHNvIFN1YmZsb3dFeGVjdXRvciBjYW4gcmUtc2VlZCBuZXN0ZWQgcnVudGltZXNcbiAgICAgICAqICBvbiB0aGUgcmVzdW1lIHBhdGguIFVuZGVmaW5lZCBvbiBub3JtYWwgcnVuKCkgcGF0aHMuICovXG4gICAgICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAgICAgLyoqIFJlc3VtZS1vbmx5IG92ZXJyaWRlIG9mIHRoZSBzdWJmbG93cyBkaWN0IOKAlCBzdWJzdGl0dXRlcyB0aGVcbiAgICAgICAqICBsZWFmIHN1YmZsb3cncyByb290IHdpdGggYSByZXN1bWUgY2hhaW4gc28gdGhlIHN1YmZsb3cgYm9keVxuICAgICAgICogIHBpY2tzIHVwIGF0IHRoZSBwYXVzZSBwb2ludC4gT3RoZXIgZW50cmllcyBwYXNzIHRocm91Z2hcbiAgICAgICAqICB1bmNoYW5nZWQuICovXG4gICAgICBzdWJmbG93c092ZXJyaWRlPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgICB9LFxuICApOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZmxvd0NoYXJ0QXJncztcbiAgICBjb25zdCBmYyA9IGFyZ3MuZmxvd0NoYXJ0O1xuICAgIGNvbnN0IG5hcnJhdGl2ZUZsYWcgPSB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgfHwgKGZjLmVuYWJsZU5hcnJhdGl2ZSA/PyBmYWxzZSk7XG5cbiAgICAvLyDilIDilIAgQ29tcG9zZWQgc2NvcGUgZmFjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAvLyBDb2xsZWN0IGFsbCBzY29wZSBtb2RpZmllcnMgKHJlY29yZGVycywgcmVkYWN0aW9uKSBpbnRvIGEgc2luZ2xlIGxpc3QsXG4gICAgLy8gdGhlbiBjcmVhdGUgT05FIGZhY3RvcnkgdGhhdCBhcHBsaWVzIHRoZW0gaW4gYSBsb29wLiBSZXBsYWNlcyB0aGVcbiAgICAvLyBwcmV2aW91cyA0LWRlZXAgY2xvc3VyZSBuZXN0aW5nIHdpdGggYSBmbGF0LCBkZWJ1Z2dhYmxlIGNvbXBvc2l0aW9uLlxuXG4gICAgaWYgKG92ZXJyaWRlcz8ucHJlc2VydmVSZWNvcmRlcnMpIHtcbiAgICAgIC8vIFJlc3VtZSBtb2RlOiBrZWVwIGV4aXN0aW5nIGNvbWJpbmVkUmVjb3JkZXIgc28gbmFycmF0aXZlIGFjY3VtdWxhdGVzXG4gICAgfSBlbHNlIGlmIChuYXJyYXRpdmVGbGFnKSB7XG4gICAgICB0aGlzLmNvbWJpbmVkUmVjb3JkZXIgPSBuZXcgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlcih0aGlzLm5hcnJhdGl2ZU9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbWJpbmVkUmVjb3JkZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5zaGFyZWRSZWRhY3RlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLnNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG5cbiAgICAvLyBCdWlsZCBtb2RpZmllciBsaXN0IOKAlCBlYWNoIG1vZGlmaWVyIHJlY2VpdmVzIHRoZSBzY29wZSBhZnRlciBjcmVhdGlvblxuICAgIHR5cGUgU2NvcGVNb2RpZmllciA9IChzY29wZTogYW55KSA9PiB2b2lkO1xuICAgIGNvbnN0IG1vZGlmaWVyczogU2NvcGVNb2RpZmllcltdID0gW107XG5cbiAgICAvLyAxLiBOYXJyYXRpdmUgcmVjb3JkZXIgKGlmIGVuYWJsZWQpXG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmNvbWJpbmVkUmVjb3JkZXI7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyID09PSAnZnVuY3Rpb24nKSBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDIuIFVzZXItcHJvdmlkZWQgc2NvcGUgcmVjb3JkZXJzXG4gICAgaWYgKHRoaXMuc2NvcGVSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycztcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmF0dGFjaFNjb3BlUmVjb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHIgb2YgcmVjb3JkZXJzKSBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyKHIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAzLiBSZWRhY3Rpb24gcG9saWN5IChjb25kaXRpb25hbCDigJQgb25seSB3aGVuIHBvbGljeSBpcyBzZXQpXG4gICAgaWYgKHRoaXMucmVkYWN0aW9uUG9saWN5KSB7XG4gICAgICBjb25zdCBwb2xpY3kgPSB0aGlzLnJlZGFjdGlvblBvbGljeTtcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLnVzZVJlZGFjdGlvblBvbGljeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNjb3BlLnVzZVJlZGFjdGlvblBvbGljeShwb2xpY3kpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIFByZS1wb3B1bGF0ZSBleGVjdXRvci1sZXZlbCBmaWVsZCByZWRhY3Rpb24gbWFwIGZyb20gcG9saWN5XG4gICAgICAvLyBzbyBnZXRSZWRhY3Rpb25SZXBvcnQoKSBpbmNsdWRlcyBmaWVsZC1sZXZlbCByZWRhY3Rpb25zLlxuICAgICAgaWYgKHBvbGljeS5maWVsZHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHBvbGljeS5maWVsZHMpKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5LnNldChrZXksIG5ldyBTZXQoZmllbGRzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21wb3NlOiBiYXNlIGZhY3RvcnkgKyBtb2RpZmllcnMgaW4gYSBzaW5nbGUgcGFzcy5cbiAgICAvLyBTaGFyZWQgcmVkYWN0ZWQga2V5cyBhcmUgQUxXQVlTIHdpcmVkIHVwICh1bmNvbmRpdGlvbmFsIOKAlCBlbnN1cmVzIGNyb3NzLXN0YWdlXG4gICAgLy8gcHJvcGFnYXRpb24gZXZlbiB3aXRob3V0IGEgcG9saWN5LCBiZWNhdXNlIHN0YWdlcyBjYW4gY2FsbCBzZXRWYWx1ZShrZXksIHZhbCwgdHJ1ZSlcbiAgICAvLyBmb3IgcGVyLWNhbGwgcmVkYWN0aW9uKS4gT3B0aW9uYWwgbW9kaWZpZXJzIChyZWNvcmRlcnMsIHBvbGljeSkgYXJlIGluIHRoZSBsaXN0LlxuICAgIGNvbnN0IGJhc2VGYWN0b3J5ID0gYXJncy5zY29wZUZhY3Rvcnk7XG4gICAgY29uc3Qgc2hhcmVkUmVkYWN0ZWRLZXlzID0gdGhpcy5zaGFyZWRSZWRhY3RlZEtleXM7XG4gICAgY29uc3Qgc2NvcGVGYWN0b3J5ID0gKChjdHg6IGFueSwgc3RhZ2VOYW1lOiBzdHJpbmcsIHJlYWRPbmx5PzogdW5rbm93biwgZW52QXJnPzogYW55KSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IGJhc2VGYWN0b3J5KGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52QXJnKTtcbiAgICAgIC8vIEFsd2F5cyB3aXJlIHNoYXJlZCByZWRhY3Rpb24gc3RhdGVcbiAgICAgIGlmICh0eXBlb2YgKHNjb3BlIGFzIGFueSkudXNlU2hhcmVkUmVkYWN0ZWRLZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIChzY29wZSBhcyBhbnkpLnVzZVNoYXJlZFJlZGFjdGVkS2V5cyhzaGFyZWRSZWRhY3RlZEtleXMpO1xuICAgICAgfVxuICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgbW9kaWZpZXJzXG4gICAgICBmb3IgKGNvbnN0IG1vZCBvZiBtb2RpZmllcnMpIG1vZChzY29wZSk7XG4gICAgICByZXR1cm4gc2NvcGU7XG4gICAgfSkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT47XG5cbiAgICBjb25zdCBlZmZlY3RpdmVSb290ID0gb3ZlcnJpZGVzPy5yb290ID8/IGZjLnJvb3Q7XG4gICAgY29uc3QgZWZmZWN0aXZlSW5pdGlhbENvbnRleHQgPSBvdmVycmlkZXM/LmluaXRpYWxDb250ZXh0ID8/IGFyZ3MuaW5pdGlhbENvbnRleHQ7XG5cbiAgICBsZXQgcnVudGltZTogRXhlY3V0aW9uUnVudGltZTtcbiAgICBpZiAob3ZlcnJpZGVzPy5leGlzdGluZ1J1bnRpbWUpIHtcbiAgICAgIC8vIFJlc3VtZSBtb2RlOiByZXVzZSBleGlzdGluZyBydW50aW1lIHNvIGV4ZWN1dGlvbiB0cmVlIGNvbnRpbnVlcyBmcm9tIHBhdXNlIHBvaW50LlxuICAgICAgLy8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIHJvb3QgZm9yIGdldFNuYXBzaG90KCkgKGZ1bGwgdHJlZSksIHRoZW4gYWR2YW5jZVxuICAgICAgLy8gcm9vdFN0YWdlQ29udGV4dCB0byBhIGNvbnRpbnVhdGlvbiBmcm9tIHRoZSBsZWFmIChmb3IgdHJhdmVyc2FsKS5cbiAgICAgIHJ1bnRpbWUgPSBvdmVycmlkZXMuZXhpc3RpbmdSdW50aW1lO1xuICAgICAgcnVudGltZS5wcmVzZXJ2ZVNuYXBzaG90Um9vdCgpO1xuICAgICAgbGV0IGxlYWYgPSBydW50aW1lLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgICB3aGlsZSAobGVhZi5uZXh0KSBsZWFmID0gbGVhZi5uZXh0O1xuICAgICAgcnVudGltZS5yb290U3RhZ2VDb250ZXh0ID0gbGVhZi5jcmVhdGVOZXh0KCcnLCBlZmZlY3RpdmVSb290Lm5hbWUsIGVmZmVjdGl2ZVJvb3QuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBydW50aW1lID0gbmV3IEV4ZWN1dGlvblJ1bnRpbWUoXG4gICAgICAgIGVmZmVjdGl2ZVJvb3QubmFtZSxcbiAgICAgICAgZWZmZWN0aXZlUm9vdC5pZCxcbiAgICAgICAgYXJncy5kZWZhdWx0VmFsdWVzRm9yQ29udGV4dCxcbiAgICAgICAgZWZmZWN0aXZlSW5pdGlhbENvbnRleHQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFdoZW4gYSByZWRhY3Rpb24gcG9saWN5IGlzIGNvbmZpZ3VyZWQsIG1haW50YWluIGEgcGFyYWxsZWwgcmVkYWN0ZWRcbiAgICAvLyBtaXJyb3Igb2YgYGdsb2JhbFN0b3JlYCBkdXJpbmcgdHJhdmVyc2FsLiBFYWNoIGNvbW1pdCBhcHBsaWVzIHRoZVxuICAgIC8vIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyDigJQgc2FtZSBvbmVzIGZlZCB0byB0aGUgZXZlbnQgbG9nIOKAlFxuICAgIC8vIHNvIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgcmV0dXJucyBhIHNjcnViYmVkIHNoYXJlZFN0YXRlIGF0XG4gICAgLy8gemVybyBwb3N0LXBhc3MgY29zdC4gU2tpcHBlZCB3aGVuIG5vIHBvbGljeSBleGlzdHMgKHplcm8gYWxsb2NhdGlvbikuXG4gICAgaWYgKHRoaXMucmVkYWN0aW9uUG9saWN5KSB7XG4gICAgICBydW50aW1lLmVuYWJsZVJlZGFjdGVkTWlycm9yKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPih7XG4gICAgICByb290OiBlZmZlY3RpdmVSb290LFxuICAgICAgc3RhZ2VNYXA6IGZjLnN0YWdlTWFwLFxuICAgICAgc2NvcGVGYWN0b3J5LFxuICAgICAgZXhlY3V0aW9uUnVudGltZTogcnVudGltZSxcbiAgICAgIHJlYWRPbmx5Q29udGV4dDogcmVhZE9ubHlDb250ZXh0T3ZlcnJpZGUgPz8gYXJncy5yZWFkT25seUNvbnRleHQsXG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBhcmdzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVyczogYXJncy5zdHJlYW1IYW5kbGVycyxcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IGFyZ3Muc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgIHN1YmZsb3dzOiBmYy5zdWJmbG93cyxcbiAgICAgIG5hcnJhdGl2ZUVuYWJsZWQ6IG5hcnJhdGl2ZUZsYWcsXG4gICAgICBidWlsZFRpbWVTdHJ1Y3R1cmU6IGZjLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgIGxvZ2dlcjogZmMubG9nZ2VyID8/IGRlZmF1bHRMb2dnZXIsXG4gICAgICBzaWduYWwsXG4gICAgICBleGVjdXRpb25FbnY6IGVudixcbiAgICAgIGZsb3dSZWNvcmRlcnM6IHRoaXMuYnVpbGRGbG93UmVjb3JkZXJzTGlzdCgpLFxuICAgICAgZXhlY3V0aW9uQ291bnRlcjogdGhpcy5fZXhlY3V0aW9uQ291bnRlcixcbiAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICAuLi4ob3ZlcnJpZGVzPy5zdWJmbG93c092ZXJyaWRlICYmIHsgc3ViZmxvd3M6IG92ZXJyaWRlcy5zdWJmbG93c092ZXJyaWRlIH0pLFxuICAgICAgLi4uKG92ZXJyaWRlcz8uc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSAmJiB7XG4gICAgICAgIHN1YmZsb3dTdGF0ZXNGb3JSZXN1bWU6IG92ZXJyaWRlcy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lLFxuICAgICAgfSksXG4gICAgICAuLi4obWF4RGVwdGggIT09IHVuZGVmaW5lZCAmJiB7IG1heERlcHRoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgZW5hYmxlTmFycmF0aXZlKG9wdGlvbnM/OiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMubmFycmF0aXZlRW5hYmxlZCA9IHRydWU7XG4gICAgaWYgKG9wdGlvbnMpIHRoaXMubmFycmF0aXZlT3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgZGVjbGFyYXRpdmUgcmVkYWN0aW9uIHBvbGljeSB0aGF0IGFwcGxpZXMgdG8gYWxsIHN0YWdlcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLlxuICAgKi9cbiAgc2V0UmVkYWN0aW9uUG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3Rpb25Qb2xpY3kgPSBwb2xpY3k7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsaWFuY2UtZnJpZW5kbHkgcmVwb3J0IG9mIGFsbCByZWRhY3Rpb24gYWN0aXZpdHkgZnJvbSB0aGVcbiAgICogbW9zdCByZWNlbnQgcnVuLiBOZXZlciBpbmNsdWRlcyBhY3R1YWwgdmFsdWVzLlxuICAgKi9cbiAgZ2V0UmVkYWN0aW9uUmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgY29uc3QgZmllbGRSZWRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5KSB7XG4gICAgICBmaWVsZFJlZGFjdGlvbnNba2V5XSA9IFsuLi5maWVsZHNdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVkYWN0ZWRLZXlzOiBbLi4udGhpcy5zaGFyZWRSZWRhY3RlZEtleXNdLFxuICAgICAgZmllbGRSZWRhY3Rpb25zLFxuICAgICAgcGF0dGVybnM6ICh0aGlzLnJlZGFjdGlvblBvbGljeT8ucGF0dGVybnMgPz8gW10pLm1hcCgocCkgPT4gcC5zb3VyY2UpLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIDilIAgUGF1c2UvUmVzdW1lIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjaGVja3BvaW50IGZyb20gdGhlIG1vc3QgcmVjZW50IHBhdXNlZCBleGVjdXRpb24sIG9yIGB1bmRlZmluZWRgXG4gICAqIGlmIHRoZSBsYXN0IHJ1biBjb21wbGV0ZWQgd2l0aG91dCBwYXVzaW5nLlxuICAgKlxuICAgKiBUaGUgY2hlY2twb2ludCBpcyBKU09OLXNlcmlhbGl6YWJsZSDigJQgc3RvcmUgaXQgaW4gUmVkaXMsIFBvc3RncmVzLCBsb2NhbFN0b3JhZ2UsIGV0Yy5cbiAgICpcbiAgICogSXQgaXMgZnVsbHkgREVUQUNIRUQgZnJvbSBlbmdpbmUgc3RhdGU6IGV2ZXJ5IGZpZWxkIHdhcyBkZWVwLWNvcGllZCBhdFxuICAgKiBwYXVzZSB0aW1lIChzZWUgYGJ1aWxkUGF1c2VDaGVja3BvaW50YCkuIEhvbGRpbmcsIG11dGF0aW5nLCBvciBwZXJzaXN0aW5nXG4gICAqIGl0IGNhbm5vdCBhZmZlY3QgdGhlIGV4ZWN1dG9yLCBhbmQgYSBsYXRlciBzYW1lLWV4ZWN1dG9yIHJlc3VtZSBjYW5ub3RcbiAgICogbXV0YXRlIGEgY2hlY2twb2ludCB5b3UgYWxyZWFkeSBzdG9yZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gICAqIGlmIChleGVjdXRvci5pc1BhdXNlZCgpKSB7XG4gICAqICAgY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKSE7XG4gICAqICAgYXdhaXQgcmVkaXMuc2V0KGBzZXNzaW9uOiR7aWR9YCwgSlNPTi5zdHJpbmdpZnkoY2hlY2twb2ludCkpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2hlY2twb2ludCgpOiBGbG93Y2hhcnRDaGVja3BvaW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hlY2twb2ludDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgbW9zdCByZWNlbnQgcnVuKCkgd2FzIHBhdXNlZCAoY2hlY2twb2ludCBhdmFpbGFibGUpLiAqL1xuICBpc1BhdXNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hlY2twb2ludCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBjb21taXRzIGluIHRoZSBydW4ncyBjb21taXQgbG9nLiBPKDEpIOKAlCBkaXJlY3QgbGVuZ3RoXG4gICAqIHJlYWQsIG5vIHNuYXBzaG90IG1hdGVyaWFsaXphdGlvbi4gVXNlIHRoaXMgdG8gc3RhbXAgY29tbWl0XG4gICAqIGluZGljZXMgb24gb2JzZXJ2ZXIgZXZlbnRzIChlLmcuLCBgQm91bmRhcnlSZWNvcmRlcmAgc3RvcmluZ1xuICAgKiBgY29tbWl0SWR4QmVmb3JlYCAvIGBjb21taXRJZHhBZnRlcmAgcGVyIGRvbWFpbiBldmVudCBmb3JcbiAgICogYENvbW1pdFJhbmdlSW5kZXhgIHF1ZXJpZXMg4oCUIHNlZSBgZm9vdHByaW50anMvdHJhY2VgKS5cbiAgICpcbiAgICogUmV0dXJucyAwIGJlZm9yZSBhbnkgcnVuOyBhZnRlciwgcmV0dXJucyB0aGUgY3VtdWxhdGl2ZSBjb21taXRcbiAgICogY291bnQgYWNyb3NzIHRoZSBleGVjdXRvcidzIGxpZmV0aW1lIChpbmNsdWRpbmcgcmVzdW1lcykuXG4gICAqXG4gICAqIElNUExFTUVOVEFUSU9OIE5PVEU6IHRoaXMgcmV0dXJucyBgcnVudGltZS5leGVjdXRpb25IaXN0b3J5Lmxlbmd0aGAsXG4gICAqIHdoaWNoIGlzIHRoZSBzYW1lIHZhbHVlIGFzIGBnZXRTbmFwc2hvdCgpLmNvbW1pdExvZy5sZW5ndGhgLiBUaGVcbiAgICogbmFtaW5nIGFzeW1tZXRyeSBpcyBoaXN0b3JpY2FsIOKAlCB0aGUgdW5kZXJseWluZyBgRXZlbnRMb2dgIGZpZWxkXG4gICAqIGlzIG5hbWVkIGBleGVjdXRpb25IaXN0b3J5YCBidXQgc3RvcmVzIHRoZSBgQ29tbWl0QnVuZGxlW11gIHRoYXRcbiAgICogYGNvbW1pdExvZ2AgZXhwb3Nlcy4gVGhleSBhcmUgdGhlIFNBTUUgYXJyYXkgKHZlcmlmaWVkIGJ5IHRoZVxuICAgKiBcIm1hdGNoZXMgY29tbWl0TG9nLmxlbmd0aFwiIGludGVncmF0aW9uIHRlc3QpLlxuICAgKi9cbiAgZ2V0Q29tbWl0Q291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBydW50aW1lID0gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEluc3RhbmNlVHlwZTx0eXBlb2YgRXhlY3V0aW9uUnVudGltZT4gfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJ1bnRpbWU/LmV4ZWN1dGlvbkhpc3RvcnkubGVuZ3RoID8/IDA7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIGEgcGF1c2VkIGZsb3djaGFydCBmcm9tIGEgY2hlY2twb2ludC5cbiAgICpcbiAgICogUmVzdG9yZXMgdGhlIHNjb3BlIHN0YXRlLCBjYWxscyB0aGUgcGF1c2VkIHN0YWdlJ3MgYHJlc3VtZUZuYCB3aXRoIHRoZVxuICAgKiBwcm92aWRlZCBpbnB1dCwgdGhlbiBjb250aW51ZXMgdHJhdmVyc2FsIGZyb20gdGhlIG5leHQgc3RhZ2UuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGNhbiBjb21lIGZyb20gYGdldENoZWNrcG9pbnQoKWAgb24gYSBwcmV2aW91cyBydW4sIG9yIGZyb21cbiAgICogYSBzZXJpYWxpemVkIGNoZWNrcG9pbnQgc3RvcmVkIGluIFJlZGlzL1Bvc3RncmVzL2xvY2FsU3RvcmFnZS5cbiAgICpcbiAgICogKipOYXJyYXRpdmUvcmVjb3JkZXIgc3RhdGUgaXMgcmVzZXQgb24gcmVzdW1lLioqIFRvIGtlZXAgYSB1bmlmaWVkIG5hcnJhdGl2ZVxuICAgKiBhY3Jvc3MgcGF1c2UvcmVzdW1lIGN5Y2xlcywgY29sbGVjdCBpdCBiZWZvcmUgY2FsbGluZyByZXN1bWUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gUHJvY2VzcyBBIOKAlCBhZnRlciBhIHBhdXNlLCBwZXJzaXN0IHRoZSBjaGVja3BvaW50OlxuICAgKiBjb25zdCBjaGVja3BvaW50ID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAgICogYXdhaXQgcmVkaXMuc2V0KGBzZXNzaW9uOiR7aWR9YCwgSlNPTi5zdHJpbmdpZnkoY2hlY2twb2ludCkpO1xuICAgKlxuICAgKiAvLyBQcm9jZXNzIEIgKHBvc3NpYmx5IGRpZmZlcmVudCBzZXJ2ZXIsIHNhbWUgY2hhcnQpIOKAlCByZXN0b3JlIGFuZCByZXN1bWU6XG4gICAqIGNvbnN0IHJlc3RvcmVkID0gSlNPTi5wYXJzZShhd2FpdCByZWRpcy5nZXQoYHNlc3Npb246JHtpZH1gKSk7XG4gICAqIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0b3IucmVzdW1lKHJlc3RvcmVkLCB7IGFwcHJvdmVkOiB0cnVlIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc3VtZShcbiAgICBjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50LFxuICAgIHJlc3VtZUlucHV0PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUGljazxSdW5PcHRpb25zLCAnc2lnbmFsJyB8ICdlbnYnIHwgJ21heERlcHRoJz4sXG4gICk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICAvLyBSZS1lbnRyYW5jeSBndWFyZCBGSVJTVCDigJQgcmVzdW1lKCkgbXV0YXRlcyB0aGUgc2FtZSBwZXItcnVuIHN0YXRlIHJ1bigpXG4gICAgLy8gZG9lcyAodHJhdmVyc2VyLCBydW5JZCwgY2hlY2twb2ludCksIHNvIHJlc3VtZS1kdXJpbmctcnVuIGFuZFxuICAgIC8vIGRvdWJsZS1yZXN1bWUgYXJlIHRoZSBzYW1lIGNvcnJ1cHRpb24gY2xhc3MgYXMgY29uY3VycmVudCBydW4oKS5cbiAgICBpZiAodGhpcy5faXNFeGVjdXRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Zsb3dDaGFydEV4ZWN1dG9yOiByZXN1bWUoKSBjYWxsZWQgd2hpbGUgYW5vdGhlciBydW4oKS9yZXN1bWUoKSBpcyBpbiBmbGlnaHQgb24gdGhpcyAnICtcbiAgICAgICAgICAnZXhlY3V0b3IuIEFuIGV4ZWN1dG9yIGhvbGRzIHBlci1ydW4gc3RhdGUgKHJ1bklkLCByZWNvcmRlcnMsIGNoZWNrcG9pbnQpIOKAlCBjcmVhdGUgJyArXG4gICAgICAgICAgJ29uZSBleGVjdXRvciBwZXIgY29uY3VycmVudCBydW4uIFNlZSBkb2NzL2d1aWRlcy9leGVjdXRpb24tbW9kZWwubWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIOKUgOKUgCBWYWxpZGF0ZSBjaGVja3BvaW50IHN0cnVjdHVyZSAobWF5IGNvbWUgZnJvbSB1bnRydXN0ZWQgZXh0ZXJuYWwgc3RvcmFnZSkg4pSA4pSAXG4gICAgLy8gKGxhc3RDaGVja3BvaW50IGlzIHdpcGVkIEFGVEVSIHZhbGlkYXRpb24g4oCUIGEgcmVqZWN0ZWQgY2hlY2twb2ludCBtdXN0XG4gICAgLy8gbm90IGRlc3Ryb3kgdGhlIGV4ZWN1dG9yJ3MgZXhpc3RpbmcgY2hlY2twb2ludCBzdGF0ZS4pXG4gICAgaWYgKFxuICAgICAgIWNoZWNrcG9pbnQgfHxcbiAgICAgIHR5cGVvZiBjaGVja3BvaW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgdHlwZW9mIGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUgIT09ICdvYmplY3QnIHx8XG4gICAgICBjaGVja3BvaW50LnNoYXJlZFN0YXRlID09PSBudWxsIHx8XG4gICAgICBBcnJheS5pc0FycmF5KGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hlY2twb2ludDogc2hhcmVkU3RhdGUgbXVzdCBiZSBhIHBsYWluIG9iamVjdC4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaGVja3BvaW50LnBhdXNlZFN0YWdlSWQgIT09ICdzdHJpbmcnIHx8IGNoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZCA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGVja3BvaW50OiBwYXVzZWRTdGFnZUlkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhQXJyYXkuaXNBcnJheShjaGVja3BvaW50LnN1YmZsb3dQYXRoKSB8fFxuICAgICAgIWNoZWNrcG9pbnQuc3ViZmxvd1BhdGguZXZlcnkoKHM6IHVua25vd24pID0+IHR5cGVvZiBzID09PSAnc3RyaW5nJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGVja3BvaW50OiBzdWJmbG93UGF0aCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MuJyk7XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgcGF1c2VkIG5vZGUgaW4gdGhlIGdyYXBoXG4gICAgY29uc3QgcGF1c2VkTm9kZSA9IHRoaXMuZmluZE5vZGVJbkdyYXBoKGNoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZCwgY2hlY2twb2ludC5zdWJmbG93UGF0aCk7XG4gICAgaWYgKCFwYXVzZWROb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdGFnZSAnJHtjaGVja3BvaW50LnBhdXNlZFN0YWdlSWR9JyBub3QgZm91bmQgaW4gZmxvd2NoYXJ0LiBgICtcbiAgICAgICAgICAnVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcGF1c2VkTm9kZS5yZXN1bWVGbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7cGF1c2VkTm9kZS5uYW1lfScgKCR7cGF1c2VkTm9kZS5pZH0pIGhhcyBubyByZXN1bWVGbi4gYCArXG4gICAgICAgICAgJ09ubHkgc3RhZ2VzIGNyZWF0ZWQgd2l0aCBhZGRQYXVzYWJsZUZ1bmN0aW9uKCkgY2FuIGJlIHJlc3VtZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBCdWlsZCBhIHN5bnRoZXRpYyByZXN1bWUgbm9kZTogY2FsbHMgcmVzdW1lRm4gd2l0aCByZXN1bWVJbnB1dCwgdGhlbiBjb250aW51ZXMuXG4gICAgLy8gcmVzdW1lRm4gc2lnbmF0dXJlIGlzIChzY29wZSwgaW5wdXQpIHBlciBQYXVzYWJsZUhhbmRsZXIg4oCUIHdyYXAgdG8gbWF0Y2ggU3RhZ2VGdW5jdGlvbihzY29wZSwgYnJlYWtGbikuXG4gICAgY29uc3QgcmVzdW1lRm4gPSBwYXVzZWROb2RlLnJlc3VtZUZuO1xuICAgIGNvbnN0IHJlc3VtZVN0YWdlRm4gPSAoc2NvcGU6IFRTY29wZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VtZUZuKHNjb3BlLCByZXN1bWVJbnB1dCk7XG4gICAgfTtcblxuICAgIC8vIERldGVybWluZSBjb250aW51YXRpb246IGZvciBicmFuY2ggY2hpbGRyZW4gKGRlY2lkZXIvc2VsZWN0b3IpLFxuICAgIC8vIHBhdXNlZE5vZGUubmV4dCBpcyB1bmRlZmluZWQuIFRoZSBjaGVja3BvaW50J3NcbiAgICAvLyBjb250aW51YXRpb25TdGFnZUlkIChjb2xsZWN0ZWQgZHVyaW5nIHRyYXZlcnNhbCBidWJibGUtdXApXG4gICAgLy8gcG9pbnRzIHRvIHRoZSBpbnZva2VyJ3MgbmV4dCBub2RlLlxuICAgIC8vXG4gICAgLy8gRm9yIHBhdXNlcyBpbnNpZGUgYSBzdWJmbG93LCB0aGUgY29udGludWF0aW9uIGxpdmVzIElOU0lERSB0aGVcbiAgICAvLyBsZWFmIHN1YmZsb3cgKGUuZy4sIHRoZSBsb29wIHRhcmdldCBiYWNrIHRvIGBtZXNzYWdlc2ApLiBTZWFyY2hcbiAgICAvLyB0aGUgbGVhZiBzdWJmbG93IGZpcnN0OyBmYWxsIGJhY2sgdG8gdG9wLWxldmVsIGZvciByb290LWxldmVsXG4gICAgLy8gcGF1c2VzLlxuICAgIC8vIENsb25lLWluOiBgc3ViZmxvd1N0YXRlc2Agc2VlZHMgbmVzdGVkIHJ1bnRpbWVzIGluIFN1YmZsb3dFeGVjdXRvclxuICAgIC8vIChzaGFsbG93LW1lcmdlZCBpbnRvIGVhY2ggbmVzdGVkIFNoYXJlZE1lbW9yeSksIHNvIHdpdGhvdXQgYSBjb3B5IHRoZVxuICAgIC8vIGVuZ2luZSB3b3VsZCBob2xkIGxpdmUgcmVmZXJlbmNlcyBpbnRvIHRoZSBjYWxsZXIncyBjaGVja3BvaW50IG9iamVjdCDigJRcbiAgICAvLyBjYWxsZXIgbXV0YXRpb25zIHdvdWxkIGJsZWVkIGludG8gdGhlIHJlc3VtZWQgcnVuIGFuZCBlbmdpbmUgd3JpdGVzXG4gICAgLy8gd291bGQgcmVhY2ggYSBjaGVja3BvaW50IHRoZSBjYWxsZXIgbWF5IGhhdmUgYWxyZWFkeSBwZXJzaXN0ZWQuXG4gICAgY29uc3Qgc2ZTdGF0ZXMgPSBzdHJ1Y3R1cmVkQ2xvbmUoY2hlY2twb2ludC5zdWJmbG93U3RhdGVzKTtcbiAgICBjb25zdCBsZWFmU3ViZmxvd0lkID1cbiAgICAgIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgubGVuZ3RoID4gMCA/IGNoZWNrcG9pbnQuc3ViZmxvd1BhdGhbY2hlY2twb2ludC5zdWJmbG93UGF0aC5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgY29udGludWF0aW9uTmV4dCA9IHBhdXNlZE5vZGUubmV4dDtcbiAgICAvLyBBIGJyYW5jaC1zb3VyY2VkIGxvb3AgKGB7IGxvb3BUbyB9YCAvIGBEZWNpZGVyTGlzdC5sb29wVG9gKSBzZXRzIHRoZVxuICAgIC8vIGxvb3BpbmcgYnJhbmNoJ3MgYG5leHRgIHRvIGEgbG9vcC1yZWYgU1RVQiDigJQgYHsgaWQsIGlzTG9vcFJlZjp0cnVlIH1gXG4gICAgLy8gd2l0aCBubyBmbi9jaGlsZHJlbi9zdWJmbG93SWQuIE9uIGEgTk9STUFMIHJ1biB0aGF0IHN0dWIgcmVzb2x2ZXMgZmluZTpcbiAgICAvLyB0aGUgcmVhbCB0YXJnZXQgbm9kZSBpcyByZWFjaGFibGUgZnJvbSB0aGUgY2hhcnQgcm9vdCwgc28gdGhlIHRyYXZlcnNlcidzXG4gICAgLy8gbm9kZSBtYXAgYWxyZWFkeSBob2xkcyBpdCAodGhlIHN0dWIgaXMgc2tpcHBlZCDigJQgZmlyc3Qtd3JpdGUtd2lucykuIE9uXG4gICAgLy8gUkVTVU1FIHRoZSBub2RlIG1hcCBpcyBidWlsdCBmcm9tIHRoZSB0cnVuY2F0ZWQgcmVzdW1lIHJvb3QsIHdoZXJlIHRoZVxuICAgIC8vIHJlYWwgdGFyZ2V0IGlzIHVucmVhY2hhYmxlLCBzbyB0aGUgc3R1YiB3b3VsZCB3aW4gdGhlIGlkIHNsb3QgYW5kXG4gICAgLy8gYGV4ZWN1dGVOb2RlYCB0aHJvd3MgXCJOb2RlICc8dGFyZ2V0PicgbXVzdCBkZWZpbmUgLi4uXCIuIFJlc29sdmUgdGhlIHN0dWJcbiAgICAvLyB0byB0aGUgUkVBTCB0YXJnZXQgbm9kZSBoZXJlIChkZnNGaW5kIHNraXBzIGxvb3AtcmVmcyBhbmQgcmV0dXJucyB0aGVcbiAgICAvLyByZWFsIG5vZGUgV0lUSCBpdHMgZnVsbCBkb3duc3RyZWFtIGNoYWluIOKAlCBlLmcuIGEgc3ViZmxvdyBNT1VOVCBub2RlLFxuICAgIC8vIHdob3NlIGAubmV4dGAgY2FycmllcyB0aGUgZGVjaWRlci90ZXJtaW5hbCBjb250aW51YXRpb24gdGhlIGxvb3AgbXVzdFxuICAgIC8vIHJlLWVudGVyKS4gU2VlIHRlc3QvbGliL3BhdXNlL3Jlc3VtZS1icmFuY2gtbG9vcC1zdWJmbG93LnRlc3QudHMuXG4gICAgaWYgKGNvbnRpbnVhdGlvbk5leHQ/LmlzTG9vcFJlZikge1xuICAgICAgY29uc3QgbG9vcFRhcmdldElkID0gY29udGludWF0aW9uTmV4dC5pZDtcbiAgICAgIGNvbnN0IHJlYWxUYXJnZXQgPVxuICAgICAgICAobGVhZlN1YmZsb3dJZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5maW5kTm9kZUluR3JhcGgobG9vcFRhcmdldElkLCBjaGVja3BvaW50LnN1YmZsb3dQYXRoKSA6IHVuZGVmaW5lZCkgPz9cbiAgICAgICAgdGhpcy5maW5kTm9kZUluR3JhcGgobG9vcFRhcmdldElkLCBbXSk7XG4gICAgICBpZiAocmVhbFRhcmdldCkgY29udGludWF0aW9uTmV4dCA9IHJlYWxUYXJnZXQ7XG4gICAgfVxuICAgIGlmICghY29udGludWF0aW9uTmV4dCAmJiBjaGVja3BvaW50LmNvbnRpbnVhdGlvblN0YWdlSWQpIHtcbiAgICAgIC8vIFNlYXJjaCBsZWFmIHN1YmZsb3cgZmlyc3QgKGxvb3AgdGFyZ2V0cyAvIGJyYW5jaCBqb2lucyBsaXZlIHRoZXJlKSxcbiAgICAgIC8vIHRoZW4gZmFsbCBiYWNrIHRvIHRvcCBsZXZlbC5cbiAgICAgIGNvbnRpbnVhdGlvbk5leHQgPSBsZWFmU3ViZmxvd0lkXG4gICAgICAgID8gdGhpcy5maW5kTm9kZUluR3JhcGgoY2hlY2twb2ludC5jb250aW51YXRpb25TdGFnZUlkLCBjaGVja3BvaW50LnN1YmZsb3dQYXRoKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICghY29udGludWF0aW9uTmV4dCkge1xuICAgICAgICBjb250aW51YXRpb25OZXh0ID0gdGhpcy5maW5kTm9kZUluR3JhcGgoY2hlY2twb2ludC5jb250aW51YXRpb25TdGFnZUlkLCBbXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIFwiaW5uZXJcIiByZXN1bWUgY2hhaW46IHJlc3VtZUZuIOKGkiBjb250aW51YXRpb24uIFRoaXMgaXMgd2hhdFxuICAgIC8vIHJ1bnMgSU5TSURFIHRoZSBsZWFmIHN1YmZsb3cncyBib2R5LiBGb3IgYSByb290LWxldmVsIHBhdXNlXG4gICAgLy8gKHN1YmZsb3dQYXRoIGVtcHR5KSwgdGhpcyBpcyBhbHNvIHRoZSB0b3AtbGV2ZWwgcmVzdW1lIHJvb3QuXG4gICAgY29uc3QgaW5uZXJSZXN1bWVDaGFpbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICBpZDogcGF1c2VkTm9kZS5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBwYXVzZWROb2RlLmRlc2NyaXB0aW9uLFxuICAgICAgZm46IHJlc3VtZVN0YWdlRm4sXG4gICAgICBuZXh0OiBjb250aW51YXRpb25OZXh0LFxuICAgIH07XG5cbiAgICAvLyBEb24ndCBjbGVhciByZWNvcmRlcnMg4oCUIHJlc3VtZSBjb250aW51ZXMgZnJvbSBwcmV2aW91cyBzdGF0ZS5cbiAgICAvLyBOYXJyYXRpdmUsIG1ldHJpY3MsIGRlYnVnIGVudHJpZXMgYWNjdW11bGF0ZSBhY3Jvc3MgcGF1c2UvcmVzdW1lLlxuICAgIC8vXG4gICAgLy8gVHdvLW1vZGUgcmVzdW1lOlxuICAgIC8vICAg4oCiIFNhbWUtZXhlY3V0b3IgKHJ1bigpIHByZXZpb3VzbHkgY2FsbGVkIG9uIFRISVMgaW5zdGFuY2UpOlxuICAgIC8vICAgICByZXVzZSB0aGUgZXhpc3RpbmcgcnVudGltZSBzbyB0aGUgZXhlY3V0aW9uIHRyZWUgY29udGludWVzXG4gICAgLy8gICAgIGZyb20gdGhlIHBhdXNlIHBvaW50IGFuZCByZWNvcmRlcnMvbmFycmF0aXZlIGFjY3VtdWxhdGUuXG4gICAgLy8gICDigKIgQ3Jvc3MtZXhlY3V0b3IgKGZyZXNoIGV4ZWN1dG9yIHJlY29uc3RydWN0ZWQgZnJvbSBhIHN0b3JlZFxuICAgIC8vICAgICBjaGVja3BvaW50KTogc2VlZCBhIE5FVyBydW50aW1lIGZyb20gYGNoZWNrcG9pbnQuc2hhcmVkU3RhdGVgXG4gICAgLy8gICAgIHNvIHJlc3VtZSBoYW5kbGVycyBjYW4gcmVhZCBwcmUtcGF1c2Ugc2NvcGUuIFRoZSBleGVjdXRpb25cbiAgICAvLyAgICAgdHJlZSBzdGFydHMgYXQgdGhlIHJlc3VtZSBub2RlIOKAlCB3ZSBkb24ndCBoYXZlIHRoZSBwcmV2aW91c1xuICAgIC8vICAgICB0cmF2ZXJzYWwncyB0cmVlIG9uIGEgZnJlc2ggcHJvY2VzcyBhbnl3YXkuXG4gICAgY29uc3Qgc2FtZUV4ZWN1dG9yID0gdGhpcy5faGFzUnVuQmVmb3JlO1xuICAgIGNvbnN0IGV4aXN0aW5nUnVudGltZSA9IHNhbWVFeGVjdXRvclxuICAgICAgPyAodGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEluc3RhbmNlVHlwZTx0eXBlb2YgRXhlY3V0aW9uUnVudGltZT4pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBhbnkgcGF0aCB0aGF0IHJlc3VtZXMgY291bnRzIGFzIGEgcnVuXG4gICAgLy8gUmVzdW1lIGdldHMgYSBORVcgcnVuSWQg4oCUIHJlc3VtZSBpcyBsb2dpY2FsbHkgYSBkaXN0aW5jdCBydW4uXG4gICAgLy8gT3JpZ2luYWwgcnVuSWQgaXMgcmVjb3ZlcmFibGUgZnJvbSBjaGVja3BvaW50IG1ldGFkYXRhIGlmIGEgY29uc3VtZXJcbiAgICAvLyBuZWVkcyBjcm9zcy1ydW4gYXVkaXQgKHdlIGRvbid0IHN0b3JlIGl0IG9uIHRoZSBjaGVja3BvaW50IHRvZGF5O1xuICAgIC8vIGZ1dHVyZSBlbmhhbmNlbWVudCkuIFNlZSBgcnVuSWQudHNgLlxuICAgIHRoaXMuX2N1cnJlbnRSdW5JZCA9IGdlbmVyYXRlUnVuSWQoKTtcblxuICAgIC8vIFBpY2sgdGhlIHJlc3VtZSByb290ICsgaW5pdGlhbCBjb250ZXh0LlxuICAgIC8vXG4gICAgLy8gICBST09ULUxFVkVMIFBBVVNFIChzdWJmbG93UGF0aCBlbXB0eSk6XG4gICAgLy8gICAgIHJlc3VtZSByb290ID0gaW5uZXJSZXN1bWVDaGFpbiAocnVuIHJlc3VtZUZuIGF0IHRvcCBsZXZlbCkuXG4gICAgLy8gICAgIGluaXRpYWxDb250ZXh0ID0gY2hlY2twb2ludC5zaGFyZWRTdGF0ZS5cbiAgICAvL1xuICAgIC8vICAgU1VCRkxPVy1ORVNURUQgUEFVU0UgKHN1YmZsb3dQYXRoIG5vbi1lbXB0eSk6XG4gICAgLy8gICAgIFRoZSBwYXVzZSB3YXMgSU5TSURFIGEgc3ViZmxvdydzIGJvZHkuIFRvIHJ1biB0aGUgc3ViZmxvdydzXG4gICAgLy8gICAgIG91dHB1dE1hcHBlciBhbmQgdGhlIHBhcmVudCdzIGNvbnRpbnVhdGlvbiwgd2UgaGF2ZSB0byBlbnRlclxuICAgIC8vICAgICB0aHJvdWdoIHRoZSBPVVRFUiBNT1VOVCAodGhlIHBhcmVudCdzIG5vZGUgdGhhdCBtb3VudHMgdGhlXG4gICAgLy8gICAgIGxlYWYgc3ViZmxvdykuIFdlIHN3YXAgdGhlIGxlYWYgc3ViZmxvdydzIHJvb3Qgd2l0aFxuICAgIC8vICAgICBpbm5lclJlc3VtZUNoYWluIHNvIFN1YmZsb3dFeGVjdXRvcjpcbiAgICAvLyAgICAgICAxLiBlbnRlcnMgdGhlIHN1YmZsb3cgYm91bmRhcnksXG4gICAgLy8gICAgICAgMi4gc2VlZHMgdGhlIG5lc3RlZCBydW50aW1lIGZyb20gc3ViZmxvd1N0YXRlc1tsZWFmXVxuICAgIC8vICAgICAgICAgIChza2lwcGluZyB0aGUgaW5wdXRNYXBwZXIg4oCUIHNlZSBTdWJmbG93RXhlY3V0b3IudHMpLFxuICAgIC8vICAgICAgIDMuIHJ1bnMgdGhlIHJlc3VtZUZuIOKGkiBjb250aW51YXRpb24gY2hhaW4sXG4gICAgLy8gICAgICAgNC4gcnVucyB0aGUgb3V0cHV0TWFwcGVyIGF0IGV4aXQsXG4gICAgLy8gICAgICAgNS4gcGFyZW50IHRyYXZlcnNhbCBjb250aW51ZXMgbm9ybWFsbHkuXG4gICAgLy9cbiAgICAvLyAgICAgQ3Jvc3MtZXhlY3V0b3I6IGluaXRpYWxDb250ZXh0ID0gY2hlY2twb2ludC5zaGFyZWRTdGF0ZSAodGhlXG4gICAgLy8gICAgICAgcGFyZW50J3MgdmlldyBhdCBwYXVzZSB0aW1lIOKAlCBvdXRwdXRNYXBwZXIgd3JpdGVzIGJhY2sgaW50byBpdCkuXG4gICAgLy8gICAgIFNhbWUtZXhlY3V0b3I6IGV4aXN0aW5nUnVudGltZSBpcyByZXVzZWQ7IGluaXRpYWxDb250ZXh0IGlzIG1vb3RcbiAgICAvLyAgICAgICBmb3IgdGhlIHN1YmZsb3cgZnJhbWUgKGFscmVhZHkgaW4gdGhlIHJ1bnRpbWUgc3RhY2spLCBidXQgd2VcbiAgICAvLyAgICAgICBzdGlsbCBwYXNzIHNoYXJlZFN0YXRlIGZvciBjb25zaXN0ZW5jeS5cbiAgICBjb25zdCBmYyA9IHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQ7XG4gICAgbGV0IHJlc3VtZVJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0gaW5uZXJSZXN1bWVDaGFpbjtcbiAgICBsZXQgc3ViZmxvd3NPdmVycmlkZTogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZDtcbiAgICBpZiAobGVhZlN1YmZsb3dJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBGaW5kIHRoZSBPVVRFUiBtb3VudCBub2RlIGZvciB0aGUgRklSU1QgZW50cnkgb24gdGhlIHBhdGguXG4gICAgICAvLyBGb3Igc2luZ2xlLWxldmVsIHBhdXNlcywgdGhpcyBpcyB0aGUgb25seSBtb3VudCB3ZSBuZWVkIHRvXG4gICAgICAvLyBlbnRlciB0aHJvdWdoLiBGb3IgbmVzdGVkIG1vdW50cyB0aGUgcGF0dGVybiB3b3VsZCBleHRlbmQsIGJ1dFxuICAgICAgLy8gc2luZ2xlLWxldmVsIGNvdmVycyBhbGwgY3VycmVudCB1c2UgY2FzZXMgKFNlcXVlbmNlKEFnZW50KSxcbiAgICAgIC8vIENvbmRpdGlvbmFsKEFnZW50KSwgUGFyYWxsZWwgYnJhbmNoZXMgd2l0aCBwYXVzZWQgYWdlbnRzKS5cbiAgICAgIGNvbnN0IG91dGVyU3ViZmxvd0lkID0gY2hlY2twb2ludC5zdWJmbG93UGF0aFswXTtcbiAgICAgIGNvbnN0IG91dGVyTW91bnQgPSB0aGlzLmZpbmRNb3VudEluR3JhcGgoZmMucm9vdCwgb3V0ZXJTdWJmbG93SWQpO1xuICAgICAgaWYgKG91dGVyTW91bnQpIHtcbiAgICAgICAgcmVzdW1lUm9vdCA9IG91dGVyTW91bnQ7XG4gICAgICB9XG4gICAgICAvLyBSZXBsYWNlIHRoZSBsZWFmIHN1YmZsb3cncyByb290IHdpdGggdGhlIHJlc3VtZSBjaGFpbiBzbyB0aGVcbiAgICAgIC8vIGJvZHkgcnVucyBmcm9tIHRoZSBwYXVzZSBwb2ludCBmb3J3YXJkLlxuICAgICAgc3ViZmxvd3NPdmVycmlkZSA9IHsgLi4uKGZjLnN1YmZsb3dzID8/IHt9KSB9O1xuICAgICAgc3ViZmxvd3NPdmVycmlkZVtsZWFmU3ViZmxvd0lkXSA9IHsgcm9vdDogaW5uZXJSZXN1bWVDaGFpbiB9O1xuICAgIH1cbiAgICAvLyBDbG9uZS1pbiBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIGBzZlN0YXRlc2AgYWJvdmU6IGBpbml0aWFsQ29udGV4dGBcbiAgICAvLyBzZWVkcyB0aGUgZnJlc2ggU2hhcmVkTWVtb3J5IHZpYSBgbWVyZ2VDb250ZXh0V2luc2AsIHdoaWNoIGNvcGllcyBvbmx5XG4gICAgLy8gdGhlIFRPUCBsZXZlbCDigJQgbmVzdGVkIG9iamVjdHMgd291bGQgYWxpYXMgdGhlIGNhbGxlcidzIGNoZWNrcG9pbnQuXG4gICAgY29uc3QgcmVzdW1lSW5pdGlhbENvbnRleHQgPSBzdHJ1Y3R1cmVkQ2xvbmUoY2hlY2twb2ludC5zaGFyZWRTdGF0ZSk7XG5cbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKG9wdGlvbnM/LnNpZ25hbCwgdW5kZWZpbmVkLCBvcHRpb25zPy5lbnYsIG9wdGlvbnM/Lm1heERlcHRoLCB7XG4gICAgICByb290OiByZXN1bWVSb290LFxuICAgICAgaW5pdGlhbENvbnRleHQ6IHJlc3VtZUluaXRpYWxDb250ZXh0LFxuICAgICAgcHJlc2VydmVSZWNvcmRlcnM6IHRydWUsXG4gICAgICAuLi4oZXhpc3RpbmdSdW50aW1lID8geyBleGlzdGluZ1J1bnRpbWUgfSA6IHt9KSxcbiAgICAgIC8vIEhhbmQgdGhlIHBlci1zdWJmbG93IHNjb3BlIGNhcHR1cmVzIGRvd24gdG8gU3ViZmxvd0V4ZWN1dG9yLlxuICAgICAgLy8gQWx3YXlzIHByZXNlbnQgb24gYSBjaGVja3BvaW50IOKAlCBlbXB0eSBge31gIGZvciByb290IHBhdXNlcy5cbiAgICAgIHN1YmZsb3dTdGF0ZXNGb3JSZXN1bWU6IHNmU3RhdGVzLFxuICAgICAgLi4uKHN1YmZsb3dzT3ZlcnJpZGUgJiYgeyBzdWJmbG93c092ZXJyaWRlIH0pLFxuICAgIH0pO1xuXG4gICAgLy8gRmlyZSBvblJlc3VtZSBldmVudCBvbiBhbGwgcmVjb3JkZXJzIChmbG93ICsgc2NvcGUpLiBTdGFtcCB0aGVcbiAgICAvLyBzeW50aGV0aWMgVHJhdmVyc2FsQ29udGV4dCBmb3IgdGhlIHJlc3VtZWQgc3RhZ2Ugd2l0aCB0aGUgTkVXXG4gICAgLy8gcnVuSWQgc28gY29uc3VtZXJzIGRldGVjdCBcInRoaXMgaXMgYSBmcmVzaCBsb2dpY2FsIHJ1blwiIHZpYVxuICAgIC8vIHRoZSBzYW1lIHJ1bklkLWNoYW5nZSBwYXR0ZXJuIHRoZXkgdXNlIGZvciBgb25SdW5TdGFydGAuXG4gICAgY29uc3QgaGFzSW5wdXQgPSByZXN1bWVJbnB1dCAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlc3VtZVJ1bnRpbWVTdGFnZUlkID0gYnVpbGRSdW50aW1lU3RhZ2VJZChwYXVzZWROb2RlLmlkLCB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlKTtcbiAgICBjb25zdCBmbG93UmVzdW1lRXZlbnQgPSB7XG4gICAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICBoYXNJbnB1dCxcbiAgICAgIHRyYXZlcnNhbENvbnRleHQ6IHtcbiAgICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgICAgc3RhZ2VJZDogcGF1c2VkTm9kZS5pZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHJlc3VtZVJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgICAgZGVwdGg6IDAsXG4gICAgICB9LFxuICAgIH07XG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikgdGhpcy5jb21iaW5lZFJlY29yZGVyLm9uUmVzdW1lKGZsb3dSZXN1bWVFdmVudCk7XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuZmxvd1JlY29yZGVycykgci5vblJlc3VtZT8uKGZsb3dSZXN1bWVFdmVudCk7XG5cbiAgICBjb25zdCBzY29wZVJlc3VtZUV2ZW50ID0ge1xuICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGJ1aWxkUnVudGltZVN0YWdlSWQocGF1c2VkTm9kZS5pZCwgdGhpcy5fZXhlY3V0aW9uQ291bnRlci52YWx1ZSksXG4gICAgICBoYXNJbnB1dCxcbiAgICAgIHBpcGVsaW5lSWQ6ICcnLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHIub25SZXN1bWU/LihzY29wZVJlc3VtZUV2ZW50KTtcblxuICAgIC8vIFNldCBBRlRFUiBhbGwgc3luYyB2YWxpZGF0aW9uL2xvb2t1cCB0aHJvd3MgYWJvdmUgKG5vdGhpbmcgY2FuIGxlYWsgdGhlXG4gICAgLy8gZmxhZyk7IG5vIGF3YWl0IGJldHdlZW4gdGhlIHRvcC1vZi1tZXRob2QgY2hlY2sgYW5kIGhlcmUsIHNvIHJhY2UtZnJlZS5cbiAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0gdGhpcy5idWlsZFBhdXNlQ2hlY2twb2ludChlcnJvcik7XG4gICAgICAgIHJldHVybiB7IHBhdXNlZDogdHJ1ZSwgY2hlY2twb2ludDogdGhpcy5sYXN0Q2hlY2twb2ludCB9IHNhdGlzZmllcyBQYXVzZWRSZXN1bHQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBmdWxseSBERVRBQ0hFRCBjaGVja3BvaW50IGZyb20gYSBjYXVnaHQgUGF1c2VTaWduYWwuXG4gICAqXG4gICAqIEV2ZXJ5IGZpZWxkIGlzIGRlZXAtY29waWVkIHZpYSBvbmUgYHN0cnVjdHVyZWRDbG9uZWAgb2YgdGhlIGFzc2VtYmxlZFxuICAgKiBjaGVja3BvaW50LCBiZWNhdXNlIHRoZSByYXcgcGllY2VzIGFsaWFzIGxpdmUgZW5naW5lIHN0YXRlOlxuICAgKlxuICAgKiAgIC0gYHNoYXJlZFN0YXRlYCBJUyBgU2hhcmVkTWVtb3J5YCdzIGludGVybmFsIGNvbnRleHQgb2JqZWN0IOKAlCB0aGUgYWxpYXNcbiAgICogICAgIG9ubHkgZGV0YWNoZXMgYXQgdGhlIG5leHQgY29tbWl0IChgYXBwbHlTbWFydE1lcmdlYCByZWJ1aWxkcyBpdCksIGFuZFxuICAgKiAgICAgYWZ0ZXIgYSBwYXVzZSB0aGVyZSBpcyBubyBuZXh0IGNvbW1pdCB1bnRpbCByZXN1bWUuXG4gICAqICAgLSBgZXhlY3V0aW9uVHJlZWAgbm9kZXMgYXJlIGZyZXNoLCBidXQgdGhlaXIgYGxvZ3NgL2BlcnJvcnNgL2BtZXRyaWNzYC9cbiAgICogICAgIGBldmFsc2AvYHN0YWdlUmVhZHNgL2BmbG93TWVzc2FnZXNgIGZpZWxkcyByZWZlcmVuY2UgbGl2ZVxuICAgKiAgICAgYERpYWdub3N0aWNDb2xsZWN0b3JgIGJhZ3MgdGhhdCBrZWVwIGFjY3VtdWxhdGluZyBvbiBzYW1lLWV4ZWN1dG9yXG4gICAqICAgICByZXN1bWUuXG4gICAqICAgLSBgc3ViZmxvd1N0YXRlc2AgdmFsdWVzIGFyZSBzaGFsbG93IGNvcGllcyB3aG9zZSBORVNURUQgb2JqZWN0cyBhbGlhc1xuICAgKiAgICAgc3ViZmxvdyBtZW1vcnksIGFuZCB0aGV5IGdldCBzZWVkZWQgYmFjayBpbnRvIGxpdmUgcnVudGltZXMgb24gcmVzdW1lLlxuICAgKiAgIC0gYHN1YmZsb3dSZXN1bHRzYCB2YWx1ZXMgc3RheSByZWZlcmVuY2VkIGJ5IHRoZSB0cmF2ZXJzZXIncyByZXN1bHRzIG1hcC5cbiAgICpcbiAgICogVGhlIGNoZWNrcG9pbnQgaXMgcGVyc2lzdGVkIGJ5IGNvbnRyYWN0IChcInN0b3JlIGluIFJlZGlzL1Bvc3RncmVzXCIpIOKAlCBpdFxuICAgKiBtdXN0IG5ldmVyIHNoYXJlIHN0cnVjdHVyZSB3aXRoIHRoZSBlbmdpbmUuIFBhdXNlIGlzIG5vdCBhIGhvdCBwYXRoOyB0aGVcbiAgICogY2xvbmUgY29zdCBpcyBpcnJlbGV2YW50LlxuICAgKlxuICAgKiBUaGUgSlNPTi1zYWZlIGNoZWNrcG9pbnQgY29udHJhY3QgKG5vIGZ1bmN0aW9ucywgbm8gY2xhc3MgaW5zdGFuY2VzKVxuICAgKiBnb3Zlcm5zIENPTlNVTUVSLW93bmVkIGRhdGEg4oCUIGJ1dCB0aGUgZXhlY3V0aW9uVHJlZSdzIGRpYWdub3N0aWMgYmFnc1xuICAgKiBhY2NlcHQgQU5ZIHZhbHVlIGF0IHdyaXRlIHRpbWUgd2l0aG91dCBjbG9uaW5nICgkZGVidWcvJGVycm9yLyRtZXRyaWMvXG4gICAqICRldmFsIHN0b3JlIHJhdyByZWZlcmVuY2VzKSwgc28gYSBjb250cmFjdC1jb21wbGlhbnQgcnVuIGNhbiBzdGlsbCBjYXJyeVxuICAgKiBhIG5vbi1jbG9uZWFibGUgZGlhZ25vc3RpYy4gT2JzZXJ2YWJpbGl0eSBzaWRlLWJhZ3MgbmV2ZXIgYWJvcnQgdHJhdmVyc2FsXG4gICAqIGFueXdoZXJlIGVsc2UgaW4gdGhlIGxpYnJhcnksIHNvIHRoZXkgbXVzdCBub3QgYWJvcnQgdGhlIHBhdXNlIGVpdGhlcjpcbiAgICogb24gY2xvbmUgZmFpbHVyZSB3ZSBzYW5pdGl6ZSB0aGUgZGlhZ25vc3RpYyBiYWdzIChub24tY2xvbmVhYmxlIHZhbHVlc1xuICAgKiBiZWNvbWUgJ1tub24tc2VyaWFsaXphYmxlOiDigKZdJyBtYXJrZXJzIOKAlCB0aGUgbGl2ZSBlbmdpbmUgYmFncyBhcmUgbmV2ZXJcbiAgICogdG91Y2hlZCkgYW5kIHJldHJ5LiBJZiB0aGUgcmV0cnkgU1RJTEwgZmFpbHMsIHRoZSB2aW9sYXRpb24gaXMgaW5cbiAgICogY29uc3VtZXItb3duZWQgZGF0YSAocmVhbGlzdGljYWxseSBgcGF1c2VEYXRhYCDigJQgYSBmdW5jdGlvbiBpbiBzaGFyZWRcbiAgICogc3RhdGUgYWxyZWFkeSByZWplY3RzIGF0IHN0YWdlIGVudHJ5IHdoZW4gVHJhbnNhY3Rpb25CdWZmZXIgY2xvbmVzIHRoZVxuICAgKiBjb250ZXh0KSBhbmQgd2UgdGhyb3cgYSBERVNDUklQVElWRSBjb250cmFjdCBlcnJvciBuYW1pbmcgdGhlIG9mZmVuZGluZ1xuICAgKiBjaGVja3BvaW50IGZpZWxkKHMpLiBBIG5ha2VkIERhdGFDbG9uZUVycm9yIG5ldmVyIGVzY2FwZXMuXG4gICAqXG4gICAqIFN1YmZsb3cgc2NvcGUgY2FwdHVyZSAoYHN1YmZsb3dTdGF0ZXNgKSBzdXJ2aXZlcyBPTkxZIG9uIHRoZSBzaWduYWwg4oCUIHRoZVxuICAgKiBuZXN0ZWQgcnVudGltZXMgYXJlIEdDJ2QgYXMgdGhlIHN0YWNrIHVud2luZHMuIFByb21vdGluZyBpdCBvbnRvIHRoZVxuICAgKiBjaGVja3BvaW50IGhlcmUgbGV0cyBjcm9zcy1leGVjdXRvciByZXN1bWUgcmVzdG9yZSBwcmUtcGF1c2Ugc3ViZmxvd1xuICAgKiBzY29wZSAoZS5nLiBhbiBBZ2VudCdzIGBzY29wZS5oaXN0b3J5YCkuIEVtcHR5IGB7fWAgZm9yIHJvb3QtbGV2ZWwgcGF1c2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFBhdXNlQ2hlY2twb2ludChzaWduYWw6IFBhdXNlU2lnbmFsKTogRmxvd2NoYXJ0Q2hlY2twb2ludCB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnRyYXZlcnNlci5nZXRTbmFwc2hvdCgpO1xuICAgIGNvbnN0IHNmUmVzdWx0cyA9IHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gICAgY29uc3QgY2hlY2twb2ludCA9IHtcbiAgICAgIHNoYXJlZFN0YXRlOiBzbmFwc2hvdC5zaGFyZWRTdGF0ZSxcbiAgICAgIGV4ZWN1dGlvblRyZWU6IHNuYXBzaG90LmV4ZWN1dGlvblRyZWUsXG4gICAgICBwYXVzZWRTdGFnZUlkOiBzaWduYWwuc3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiBzaWduYWwuc3ViZmxvd1BhdGgsXG4gICAgICBwYXVzZURhdGE6IHNpZ25hbC5wYXVzZURhdGEsXG4gICAgICBzdWJmbG93U3RhdGVzOiBzaWduYWwuc3ViZmxvd1N0YXRlcyxcbiAgICAgIC4uLihzZlJlc3VsdHMuc2l6ZSA+IDAgJiYgeyBzdWJmbG93UmVzdWx0czogT2JqZWN0LmZyb21FbnRyaWVzKHNmUmVzdWx0cykgfSksXG4gICAgICAvLyBJbnZva2VyIGNvbnRleHQg4oCUIGNvbGxlY3RlZCBkdXJpbmcgdHJhdmVyc2FsIGJ1YmJsZS11cCAobm90IHRyZWUtd2Fsa2VkKVxuICAgICAgLi4uKHNpZ25hbC5pbnZva2VyU3RhZ2VJZCAmJiB7IGludm9rZXJTdGFnZUlkOiBzaWduYWwuaW52b2tlclN0YWdlSWQgfSksXG4gICAgICAuLi4oc2lnbmFsLmNvbnRpbnVhdGlvblN0YWdlSWQgJiYgeyBjb250aW51YXRpb25TdGFnZUlkOiBzaWduYWwuY29udGludWF0aW9uU3RhZ2VJZCB9KSxcbiAgICAgIHBhdXNlZEF0OiBEYXRlLm5vdygpLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoY2hlY2twb2ludCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBOb24tY2xvbmVhYmxlIGRpYWdub3N0aWNzIG11c3Qgbm90IHN3YWxsb3cgdGhlIHBhdXNlIOKAlCBzYW5pdGl6ZSB0aGVcbiAgICAgIC8vIGV4ZWN1dGlvblRyZWUncyBiYWdzIChtYXJrZXJzIHJlcGxhY2UgdGhlIG9mZmVuZGVycykgYW5kIHJldHJ5LlxuICAgICAgdHJ5IHtcbiAgICAgICAgY2hlY2twb2ludC5leGVjdXRpb25UcmVlID0gc2FuaXRpemVEaWFnbm9zdGljQmFncyhjaGVja3BvaW50LmV4ZWN1dGlvblRyZWUgYXMgU3RhZ2VTbmFwc2hvdCk7XG4gICAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoY2hlY2twb2ludCk7XG4gICAgICB9IGNhdGNoIChyZXRyeUVycm9yKSB7XG4gICAgICAgIC8vIEdlbnVpbmUgSlNPTi1zYWZlIGNvbnRyYWN0IHZpb2xhdGlvbiBpbiBjb25zdW1lci1vd25lZCBkYXRhLlxuICAgICAgICB0aHJvdyBkZXNjcmliZUNoZWNrcG9pbnRDbG9uZUZhaWx1cmUoY2hlY2twb2ludCwgcmV0cnlFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBTdGFnZU5vZGUgaW4gdGhlIGNvbXBpbGVkIGdyYXBoIGJ5IElELlxuICAgKiBIYW5kbGVzIHN1YmZsb3cgcGF0aHMgYnkgZHJpbGxpbmcgaW50byByZWdpc3RlcmVkIHN1YmZsb3dzLlxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kTm9kZUluR3JhcGgoc3RhZ2VJZDogc3RyaW5nLCBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW10pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmMgPSB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0O1xuXG4gICAgaWYgKHN1YmZsb3dQYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gVG9wLWxldmVsOiBERlMgZnJvbSByb290XG4gICAgICByZXR1cm4gdGhpcy5kZnNGaW5kKGZjLnJvb3QsIHN0YWdlSWQpO1xuICAgIH1cblxuICAgIC8vIFN1YmZsb3c6IGRyaWxsIGludG8gdGhlIHN1YmZsb3cgY2hhaW4sIHRoZW4gc2VhcmNoIGZyb20gdGhlIGxhc3Qgc3ViZmxvdydzIHJvb3RcbiAgICBsZXQgc3ViZmxvd1Jvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3Qgc2ZJZCBvZiBzdWJmbG93UGF0aCkge1xuICAgICAgY29uc3Qgc3ViZmxvdyA9IGZjLnN1YmZsb3dzPy5bc2ZJZF07XG4gICAgICBpZiAoIXN1YmZsb3cpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBzdWJmbG93Um9vdCA9IHN1YmZsb3cucm9vdDtcbiAgICB9XG4gICAgaWYgKCFzdWJmbG93Um9vdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5kZnNGaW5kKHN1YmZsb3dSb290LCBzdGFnZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBtb3VudCBub2RlICh0aGUgbm9kZSB0aGF0IG1vdW50cyBhIHN1YmZsb3cgYm91bmRhcnkpXG4gICAqIGZvciBhIGdpdmVuIHN1YmZsb3dJZCwgYnkgREZTIGZyb20gYHN0YXJ0YC4gVXNlZCBieSBgcmVzdW1lKClgIHRvXG4gICAqIGxvY2F0ZSB0aGUgT1VURVIgbm9kZSB3ZSBoYXZlIHRvIGVudGVyIHRocm91Z2ggc28gdGhlIHN1YmZsb3cnc1xuICAgKiBvdXRwdXRNYXBwZXIgYW5kIHBhcmVudCBjb250aW51YXRpb24gZXhlY3V0ZS5cbiAgICpcbiAgICogQ3ljbGUtc2FmZSB2aWEgdmlzaXRlZCBzZXQuIFJldHVybnMgdGhlIGZpcnN0IG1hdGNoIChERlMgb3JkZXIpLlxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kTW91bnRJbkdyYXBoKFxuICAgIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdWJmbG93SWQ6IHN0cmluZyxcbiAgICB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCksXG4gICk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoc3RhcnQuaXNMb29wUmVmKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh2aXNpdGVkLmhhcyhzdGFydC5pZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdmlzaXRlZC5hZGQoc3RhcnQuaWQpO1xuICAgIGlmIChzdGFydC5zdWJmbG93SWQgPT09IHN1YmZsb3dJZCkgcmV0dXJuIHN0YXJ0O1xuICAgIGlmIChzdGFydC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBzdGFydC5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZE1vdW50SW5HcmFwaChjaGlsZCwgc3ViZmxvd0lkLCB2aXNpdGVkKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdGFydC5uZXh0KSByZXR1cm4gdGhpcy5maW5kTW91bnRJbkdyYXBoKHN0YXJ0Lm5leHQsIHN1YmZsb3dJZCwgdmlzaXRlZCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBERlMgc2VhcmNoIGZvciBhIG5vZGUgYnkgSUQgaW4gdGhlIFN0YWdlTm9kZSBncmFwaC4gQ3ljbGUtc2FmZSB2aWEgdmlzaXRlZCBzZXQuICovXG4gIHByaXZhdGUgZGZzRmluZChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICB0YXJnZXRJZDogc3RyaW5nLFxuICAgIHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKSxcbiAgKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIC8vIFNraXAgbG9vcCBiYWNrLWVkZ2UgcmVmZXJlbmNlcyAodGhleSBzaGFyZSB0aGUgdGFyZ2V0J3MgSUQgYnV0IGhhdmUgbm8gZm4vcmVzdW1lRm4pXG4gICAgaWYgKG5vZGUuaXNMb29wUmVmKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh2aXNpdGVkLmhhcyhub2RlLmlkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB2aXNpdGVkLmFkZChub2RlLmlkKTtcbiAgICBpZiAobm9kZS5pZCA9PT0gdGFyZ2V0SWQpIHJldHVybiBub2RlO1xuICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmRmc0ZpbmQoY2hpbGQsIHRhcmdldElkLCB2aXNpdGVkKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChub2RlLm5leHQpIHJldHVybiB0aGlzLmRmc0ZpbmQobm9kZS5uZXh0LCB0YXJnZXRJZCwgdmlzaXRlZCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBTY29wZVJlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIHNjb3BlIFNjb3BlUmVjb3JkZXIgdG8gb2JzZXJ2ZSBkYXRhIG9wZXJhdGlvbnMgKHJlYWRzLCB3cml0ZXMsIGNvbW1pdHMpLlxuICAgKiBBdXRvbWF0aWNhbGx5IGF0dGFjaGVkIHRvIGV2ZXJ5IFNjb3BlRmFjYWRlIGNyZWF0ZWQgZHVyaW5nIHRyYXZlcnNhbC5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLlxuICAgKlxuICAgKiAqKklkZW1wb3RlbnQgYnkgSUQ6KiogSWYgYSByZWNvcmRlciB3aXRoIHRoZSBzYW1lIGBpZGAgaXMgYWxyZWFkeSBhdHRhY2hlZCxcbiAgICogaXQgaXMgcmVwbGFjZWQgKG5vdCBkdXBsaWNhdGVkKS4gVGhpcyBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcgd2hlbiBib3RoXG4gICAqIGEgZnJhbWV3b3JrIGFuZCB0aGUgdXNlciBhdHRhY2ggdGhlIHNhbWUgcmVjb3JkZXIgdHlwZS5cbiAgICpcbiAgICogQnVpbHQtaW4gcmVjb3JkZXJzIHVzZSBhdXRvLWluY3JlbWVudCBJRHMgKGBtZXRyaWNzLTFgLCBgZGVidWctMWAsIC4uLikgYnlcbiAgICogZGVmYXVsdCwgc28gbXVsdGlwbGUgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3MgY29leGlzdC4gVG8gb3ZlcnJpZGVcbiAgICogYSBmcmFtZXdvcmstYXR0YWNoZWQgcmVjb3JkZXIsIHBhc3MgdGhlIHNhbWUgd2VsbC1rbm93biBJRC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBNdWx0aXBsZSByZWNvcmRlcnMgd2l0aCBkaWZmZXJlbnQgY29uZmlncyDigJQgZWFjaCBnZXRzIGEgdW5pcXVlIElEXG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCkpO1xuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBEZWJ1Z1JlY29yZGVyKHsgdmVyYm9zaXR5OiAnbWluaW1hbCcgfSkpO1xuICAgKlxuICAgKiAvLyBPdmVycmlkZSBhIGZyYW1ld29yay1hdHRhY2hlZCByZWNvcmRlciBieSBwYXNzaW5nIGl0cyB3ZWxsLWtub3duIElEXG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCdtZXRyaWNzJykpO1xuICAgKlxuICAgKiAvLyBBdHRhY2hpbmcgdHdpY2Ugd2l0aCBzYW1lIElEIHJlcGxhY2VzIChubyBkb3VibGUtY291bnRpbmcpXG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCdteS1tZXRyaWNzJykpO1xuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcignbXktbWV0cmljcycpKTsgLy8gcmVwbGFjZXMgcHJldmlvdXNcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyOiBTY29wZVJlY29yZGVyKTogdm9pZCB7XG4gICAgLy8gUmVwbGFjZSBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgSUQgKGlkZW1wb3RlbnQg4oCUIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZylcbiAgICB0aGlzLnNjb3BlUmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVyLmlkKTtcbiAgICB0aGlzLnNjb3BlUmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIERldGFjaCAoVDQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvL1xuICAvLyBCYXJlLWV4ZWN1dG9yIGVudHJ5IHBvaW50IGZvciBmaXJlLWFuZC1mb3JnZXQgY2hpbGQgZmxvd2NoYXJ0IGV4ZWN1dGlvbi5cbiAgLy8gVXNlIGZyb20gb3V0c2lkZSBhbnkgY2hhcnQgKGNvbnN1bWVyIGNvZGUgdGhhdCB3YW50cyB0byBkZXRhY2ggd29ya1xuICAvLyB3aXRob3V0IGZpcnN0IHJ1bm5pbmcgYSBwYXJlbnQgY2hhcnQpLiBGb3IgZGV0YWNoIEZST00gSU5TSURFIGEgc3RhZ2UsXG4gIC8vIHVzZSBgc2NvcGUuJGRldGFjaEFuZEpvaW5MYXRlciguLi4pYCAvIGBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KC4uLilgIOKAlFxuICAvLyB0aG9zZSBtaW50IHJlZklkcyBmcm9tIHRoZSBjYWxsaW5nIHN0YWdlJ3MgcnVudGltZVN0YWdlSWQgZm9yIHRyYWNlXG4gIC8vIGNvcnJlbGF0aW9uOyB0aGUgYmFyZS1leGVjdXRvciBlbnRyaWVzIHVzZSBhIHN5bnRoZXRpYyBwcmVmaXhcbiAgLy8gKGBfX2V4ZWN1dG9yX19gKSBpbnN0ZWFkLlxuXG4gIC8qKlxuICAgKiBEZXRhY2ggYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmQgcmV0dXJuIGEgYERldGFjaEhhbmRsZWBcbiAgICogdGhlIGNhbGxlciBjYW4gYHdhaXQoKWAgb24gKFByb21pc2UpIG9yIHJlYWQgYC5zdGF0dXNgIGZyb20gKHN5bmMpLlxuICAgKlxuICAgKiBUaGUgZHJpdmVyIGlzIGEgUkVRVUlSRUQgZmlyc3QgYXJndW1lbnQg4oCUIHRoZXJlIGlzIG5vIGxpYnJhcnktZGVmYXVsdCxcbiAgICogdG8ga2VlcCB0aGUgZW5naW5lIGZyZWUgb2YgZHJpdmVyIGltcG9ydHMgYW5kIHRvIG1ha2UgdGhlIGNob2ljZSBvZlxuICAgKiBzY2hlZHVsaW5nIGFsZ29yaXRobSBleHBsaWNpdCBhdCB0aGUgY2FsbCBzaXRlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGltcG9ydCB7IG1pY3JvdGFza0JhdGNoRHJpdmVyIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAgICpcbiAgICogY29uc3QgZXhlYyA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihwYXJlbnRDaGFydCk7XG4gICAqIGNvbnN0IGhhbmRsZSA9IGV4ZWMuZGV0YWNoQW5kSm9pbkxhdGVyKG1pY3JvdGFza0JhdGNoRHJpdmVyLCB0ZWxlbWV0cnlDaGFydCwgeyBldmVudDogJ3gnIH0pO1xuICAgKiBhd2FpdCBoYW5kbGUud2FpdCgpOyAvLyBvcHRpb25hbFxuICAgKiBgYGBcbiAgICovXG4gIGRldGFjaEFuZEpvaW5MYXRlcihcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaEhhbmRsZSB7XG4gICAgcmV0dXJuIF9kZXRhY2hBbmRKb2luTGF0ZXIoZHJpdmVyLCBjaGlsZCwgaW5wdXQsICdfX2V4ZWN1dG9yX18nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRhY2ggYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmQgRElTQ0FSRCB0aGUgaGFuZGxlLlxuICAgKiBVc2UgZm9yIHRlbGVtZXRyeSBleHBvcnRzIC8gZmlyZS1hbmQtZm9yZ2V0IHNpZGUgZWZmZWN0cyB3aGVyZSB0aGVcbiAgICogY2FsbGVyIGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgcmVzdWx0LlxuICAgKlxuICAgKiBFcnJvcnMgcmFpc2VkIGJ5IHRoZSBjaGlsZCBzdGlsbCBsYW5kIG9uIHRoZSAoZGlzY2FyZGVkKSBoYW5kbGUg4oCUIHRoZXlcbiAgICogZ28gc2lsZW50IHVubGVzcyBzdXJmYWNlZCB0aHJvdWdoIGEgcmVjb3JkZXIuIEZvciBvYnNlcnZhYmxlIGRldGFjaCxcbiAgICogcHJlZmVyIGBkZXRhY2hBbmRKb2luTGF0ZXJgIGFuZCBzdXJmYWNlIGZhaWx1cmVzIHZpYSBgLndhaXQoKS5jYXRjaCgpYC5cbiAgICovXG4gIGRldGFjaEFuZEZvcmdldChcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiB2b2lkIHtcbiAgICBfZGV0YWNoQW5kRm9yZ2V0KGRyaXZlciwgY2hpbGQsIGlucHV0LCAnX19leGVjdXRvcl9fJyk7XG4gIH1cblxuICAvKiogRGV0YWNoIGFsbCBzY29wZSBSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQuICovXG4gIGRldGFjaFNjb3BlUmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2NvcGVSZWNvcmRlcnMgPSB0aGlzLnNjb3BlUmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBzY29wZSBSZWNvcmRlcnMuICovXG4gIGdldFNjb3BlUmVjb3JkZXJzKCk6IFNjb3BlUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnNjb3BlUmVjb3JkZXJzXTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBGbG93UmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgRmxvd1JlY29yZGVyIHRvIG9ic2VydmUgY29udHJvbCBmbG93IGV2ZW50cy5cbiAgICogQXV0b21hdGljYWxseSBlbmFibGVzIG5hcnJhdGl2ZSBpZiBub3QgYWxyZWFkeSBlbmFibGVkLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkg4oCUIHJlY29yZGVycyBhcmUgcGFzc2VkIHRvIHRoZSB0cmF2ZXJzZXIgYXQgY3JlYXRpb24gdGltZS5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IElEOioqIHJlcGxhY2VzIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBgaWRgLlxuICAgKi9cbiAgYXR0YWNoRmxvd1JlY29yZGVyKHJlY29yZGVyOiBGbG93UmVjb3JkZXIpOiB2b2lkIHtcbiAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBJRCAoaWRlbXBvdGVudCDigJQgcHJldmVudHMgZG91YmxlLWNvdW50aW5nKVxuICAgIHRoaXMuZmxvd1JlY29yZGVycyA9IHRoaXMuZmxvd1JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVyLmlkKTtcbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gICAgdGhpcy5uYXJyYXRpdmVFbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIEZsb3dSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQuICovXG4gIGRldGFjaEZsb3dSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mbG93UmVjb3JkZXJzID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBGbG93UmVjb3JkZXJzLiAqL1xuICBnZXRGbG93UmVjb3JkZXJzKCk6IEZsb3dSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZmxvd1JlY29yZGVyc107XG4gIH1cblxuICAvLyDilIDilIDilIAgQ29tYmluZWQgU2NvcGVSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSByZWNvcmRlciB0aGF0IG1heSBvYnNlcnZlIG11bHRpcGxlIGV2ZW50IHN0cmVhbXMgKHNjb3BlXG4gICAqIGRhdGEtZmxvdywgY29udHJvbC1mbG93LCBvciBib3RoKS4gRGV0ZWN0cyBhdCBydW50aW1lIHdoaWNoIHN0cmVhbXMgdGhlXG4gICAqIHJlY29yZGVyIGhhcyBtZXRob2RzIGZvciBhbmQgcm91dGVzIGl0IHRvIHRoZSBjb3JyZWN0IGludGVybmFsIGNoYW5uZWxzLlxuICAgKlxuICAgKiBQcmVmZXJyZWQgb3ZlciBjYWxsaW5nIGBhdHRhY2hTY29wZVJlY29yZGVyYCBhbmQgYGF0dGFjaEZsb3dSZWNvcmRlcmBcbiAgICogc2VwYXJhdGVseSwgYmVjYXVzZSBmb3JnZXR0aW5nIG9uZSBvZiB0aGUgdHdvIGlzIGEgc2lsZW50IGZvb3QtZ3VuIOKAlFxuICAgKiBoYWxmIHlvdXIgZXZlbnRzIG5ldmVyIGZpcmUgYW5kIHRoZXJlIGlzIG5vIHJ1bnRpbWUgd2FybmluZy4gV2l0aFxuICAgKiBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAgdGhlIGxpYnJhcnkgZ3VhcmFudGVlcyB0aGUgcmVjb3JkZXIncyBkZWNsYXJlZFxuICAgKiBtZXRob2RzIGFsbCBmaXJlLCBhbmQgYWRkcyBubyBvdmVyaGVhZCB2ZXJzdXMgdHdvIGV4cGxpY2l0IGNhbGxzLlxuICAgKlxuICAgKiAjIyBJZGVtcG90ZW5jeVxuICAgKlxuICAgKiBJZGVtcG90ZW50IGJ5IGBpZGAgYWNyb3NzIEFMTCBjaGFubmVscyDigJQgcmUtYXR0YWNoaW5nIHdpdGggdGhlIHNhbWUgYGlkYFxuICAgKiByZXBsYWNlcyB0aGUgcHJldmlvdXMgaW5zdGFuY2UgZXZlcnl3aGVyZSBpdCB3YXMgcmVnaXN0ZXJlZC4gTWl4aW5nXG4gICAqIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyKHgpYCB3aXRoIGEgcHJpb3IgYGF0dGFjaFNjb3BlUmVjb3JkZXIoeSlgIG9yXG4gICAqIGBhdHRhY2hGbG93UmVjb3JkZXIoeSlgIHRoYXQgc2hhcmUgYHguaWQgPT09IHkuaWRgIGlzIGFsc28gc2FmZTogdGhlXG4gICAqIGNvbWJpbmVkIGF0dGFjaCByZXBsYWNlcyB0aGUgc2luZ2xlLWNoYW5uZWwgcmVnaXN0cmF0aW9uIG9uIHdoaWNoZXZlclxuICAgKiBjaGFubmVsKHMpIGB4YCBoYXMgbWV0aG9kcyBmb3IuIE5vIGR1cGxpY2F0ZSBmaXJpbmdzIG9jY3VyLlxuICAgKlxuICAgKiAjIyBOYXJyYXRpdmUgYWN0aXZhdGlvblxuICAgKlxuICAgKiBJZiB0aGUgcmVjb3JkZXIgaGFzIGFueSBjb250cm9sLWZsb3cgbWV0aG9kcywgYGVuYWJsZU5hcnJhdGl2ZSgpYCBpc1xuICAgKiBjYWxsZWQgYXMgYSBzaWRlIGVmZmVjdCAodGhlIG5hcnJhdGl2ZSBzdWJzeXN0ZW0gaXMgcmVxdWlyZWQgdG8gZW1pdFxuICAgKiBjb250cm9sLWZsb3cgZXZlbnRzKS4gRGF0YS1mbG93LW9ubHkgcmVjb3JkZXJzIGRvIE5PVCBhY3RpdmF0ZSB0aGVcbiAgICogbmFycmF0aXZlLlxuICAgKlxuICAgKiAjIyBEZXRlY3Rpb24gcnVsZVxuICAgKlxuICAgKiBPbmx5ICoqb3duKiogZXZlbnQgbWV0aG9kcyBjb3VudCAoc2VlIGBoYXNSZWNvcmRlck1ldGhvZHNgKS4gTWV0aG9kc1xuICAgKiBpbmhlcml0ZWQgdmlhIHRoZSBwcm90b3R5cGUgY2hhaW4gYXJlIGlnbm9yZWQg4oCUIHRoaXMgcHJvdGVjdHMgYWdhaW5zdFxuICAgKiBhY2NpZGVudGFsIGBPYmplY3QucHJvdG90eXBlYCBwb2xsdXRpb24gYXR0YWNoaW5nIGhhbmRsZXJzIHlvdSBuZXZlclxuICAgKiBkZWNsYXJlZC4gQSByZWNvcmRlciB0aGF0IHByb3ZpZGVzIG9ubHkgYGNsZWFyYC9gdG9TbmFwc2hvdGAgaXMgYVxuICAgKiBuby1vcCBhbmQgZW1pdHMgYSBkZXYtbW9kZSB3YXJuaW5nIHRvIHN1cmZhY2UgdGhlIGxpa2VseSBtaXN0YWtlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICAgKiAgIGlkOiAnYXVkaXQnLFxuICAgKiAgIG9uV3JpdGU6IChlKSA9PiBsb2coJ3Njb3BlIHdyaXRlJywgZS5rZXkpLFxuICAgKiAgIG9uRGVjaXNpb246IChlKSA9PiBsb2coJ3JvdXRlZCB0bycsIGUuY2hvc2VuKSxcbiAgICogfTtcbiAgICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihhdWRpdCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcjogQ29tYmluZWRSZWNvcmRlcik6IHZvaWQge1xuICAgIGNvbnN0IGhhc0RhdGEgPSBoYXNSZWNvcmRlck1ldGhvZHMocmVjb3JkZXIpO1xuICAgIGNvbnN0IGhhc0Zsb3cgPSBoYXNGbG93UmVjb3JkZXJNZXRob2RzKHJlY29yZGVyKTtcbiAgICBjb25zdCBoYXNFbWl0ID0gaGFzRW1pdFJlY29yZGVyTWV0aG9kcyhyZWNvcmRlcik7XG5cbiAgICAvLyBFbWl0IHJlY29yZGVycyBsaXZlIG9uIHRoZSBTQU1FIGNoYW5uZWwgYXMgZGF0YS1mbG93IHJlY29yZGVyc1xuICAgIC8vIChTY29wZUZhY2FkZSBpdGVyYXRlcyBgX3JlY29yZGVyc2AgZm9yIG9uRW1pdCBkaXNwYXRjaCkuIFNvXG4gICAgLy8gYXR0YWNoRW1pdFJlY29yZGVyIGludGVybmFsbHkgY2FsbHMgYXR0YWNoU2NvcGVSZWNvcmRlciDigJQgYnV0IHdlIHdhbnQgdG9cbiAgICAvLyBhdm9pZCBkb3VibGUtYXR0YWNoIHdoZW4gdGhlIHJlY29yZGVyIGltcGxlbWVudHMgQk9USCBvbkVtaXQgQU5EXG4gICAgLy8gb3RoZXIgU2NvcGVSZWNvcmRlciBtZXRob2RzLiBTaG9ydC1jaXJjdWl0OiBpZiBoYXNEYXRhIE9SIGhhc0VtaXQsIHRoZVxuICAgIC8vIHJlY29yZGVyIGxhbmRzIG9uIHRoZSBzY29wZS1yZWNvcmRlciBsaXN0IGV4YWN0bHkgb25jZS5cbiAgICBpZiAoaGFzRGF0YSB8fCBoYXNFbWl0KSB0aGlzLmF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXIgYXMgU2NvcGVSZWNvcmRlcik7XG4gICAgaWYgKGhhc0Zsb3cpIHRoaXMuYXR0YWNoRmxvd1JlY29yZGVyKHJlY29yZGVyIGFzIEZsb3dSZWNvcmRlcik7XG5cbiAgICBpZiAoIWhhc0RhdGEgJiYgIWhhc0Zsb3cgJiYgIWhhc0VtaXQgJiYgaXNEZXZNb2RlKCkpIHtcbiAgICAgIC8vIERldi1tb2RlIG9ubHk6IHNpbGVudCBza2lwcyBhcmUgaW52aXNpYmxlIGFuZCBwcm9kdWNlIGhhcmQtdG8tZGVidWdcbiAgICAgIC8vIFwid2h5IGRpZG4ndCBteSByZWNvcmRlciBmaXJlXCIgcmVwb3J0cy4gUGVyIGxpYnJhcnkgY29udmVudGlvbiwgZ2F0ZWRcbiAgICAgIC8vIG9uIHRoZSBjZW50cmFsIGlzRGV2TW9kZSgpIGZsYWcgKG5vdCBwcm9jZXNzLmVudikgc28gY29uc3VtZXJzIGNhblxuICAgICAgLy8gY29udHJvbCBkZXYgdG9vbGluZyBjZW50cmFsbHkgdmlhIGVuYWJsZURldk1vZGUoKS9kaXNhYmxlRGV2TW9kZSgpLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtmb290cHJpbnRqc10gYXR0YWNoQ29tYmluZWRSZWNvcmRlcjogcmVjb3JkZXIgJyR7cmVjb3JkZXIuaWR9JyBoYXMgYCArXG4gICAgICAgICAgJ25vIG9ic2VydmVyIGV2ZW50IG1ldGhvZHMg4oCUIG5vdGhpbmcgdG8gYXR0YWNoLiBEaWQgeW91IGZvcmdldCB0byAnICtcbiAgICAgICAgICAnYWRkIGFuIG9uKiBoYW5kbGVyIChvbldyaXRlLCBvbkRlY2lzaW9uLCBvblN1YmZsb3dFbnRyeSwgLi4uKT8gJyArXG4gICAgICAgICAgJ05vdGU6IG9ubHkgT1dOIHByb3BlcnRpZXMgY291bnQ7IG1ldGhvZHMgb24gdGhlIHByb3RvdHlwZSBjaGFpbiAnICtcbiAgICAgICAgICAnYXJlIGlnbm9yZWQgb24gcHVycG9zZS4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0YWNoIGEgY29tYmluZWQgcmVjb3JkZXIgZnJvbSBhbGwgY2hhbm5lbHMgaXQgd2FzIGF0dGFjaGVkIHRvLlxuICAgKiBTYWZlIHRvIGNhbGwgaWYgdGhlIHJlY29yZGVyIHdhcyBvbmx5IG9uIG9uZSBjaGFubmVsIG9yIG5ldmVyIGF0dGFjaGVkLlxuICAgKi9cbiAgZGV0YWNoQ29tYmluZWRSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2hTY29wZVJlY29yZGVyKGlkKTtcbiAgICB0aGlzLmRldGFjaEZsb3dSZWNvcmRlcihpZCk7XG4gIH1cblxuICAvLyDilIDilIDilIAgRW1pdCBTY29wZVJlY29yZGVyIE1hbmFnZW1lbnQgKFBoYXNlIDMpIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYW4gYEVtaXRSZWNvcmRlcmAg4oCUIGFuIG9ic2VydmVyIGZvciBjb25zdW1lci1lbWl0dGVkIHN0cnVjdHVyZWRcbiAgICogZXZlbnRzIGZpcmVkIHZpYSBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgLlxuICAgKlxuICAgKiBJbnRlcm5hbGx5LCBlbWl0IHJlY29yZGVycyBzaGFyZSB0aGUgc2NvcGUtcmVjb3JkZXIgY2hhbm5lbCBiZWNhdXNlXG4gICAqIGVtaXQgZXZlbnRzIGZpcmUgZnJvbSBpbnNpZGUgYFNjb3BlRmFjYWRlYCBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uLFxuICAgKiBzYW1lIHRpbWluZyBhcyBgb25SZWFkYC9gb25Xcml0ZWAuIFRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgdGhhdFxuICAgKiBkZWxlZ2F0ZXMgdG8gYGF0dGFjaFNjb3BlUmVjb3JkZXJgIOKAlCBjb25zdW1lcnMgY2FuIGFsc28gdXNlXG4gICAqIGBhdHRhY2hTY29wZVJlY29yZGVyYCBkaXJlY3RseSBmb3IgYSByZWNvcmRlciB0aGF0IGltcGxlbWVudHMgQk9USFxuICAgKiBgb25Xcml0ZWAgYW5kIGBvbkVtaXRgLiBFaXRoZXIgYXBwcm9hY2ggcGxhY2VzIHRoZSByZWNvcmRlciBvbiB0aGVcbiAgICogc2FtZSB1bmRlcmx5aW5nIGxpc3QsIHNvIGBvbkVtaXRgIGZpcmVzIGV4YWN0bHkgb25jZSBwZXIgZXZlbnQuXG4gICAqXG4gICAqICoqSWRlbXBvdGVudCBieSBgaWRgOioqIHJlcGxhY2VzIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBgaWRgLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGV4ZWN1dG9yLmF0dGFjaEVtaXRSZWNvcmRlcih7XG4gICAqICAgaWQ6ICd0b2tlbi1tZXRlcicsXG4gICAqICAgb25FbWl0OiAoZSkgPT4ge1xuICAgKiAgICAgaWYgKGUubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LmxsbS50b2tlbnMnKSB0cmFja1Rva2VucyhlLnBheWxvYWQpO1xuICAgKiAgIH0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGF0dGFjaEVtaXRSZWNvcmRlcihyZWNvcmRlcjogRW1pdFJlY29yZGVyKTogdm9pZCB7XG4gICAgdGhpcy5hdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyIGFzIFNjb3BlUmVjb3JkZXIpO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbiBgRW1pdFJlY29yZGVyYCBieSBpZC4gU2FmZSB0byBjYWxsIGlmIG5ldmVyIGF0dGFjaGVkLiAqL1xuICBkZXRhY2hFbWl0UmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoU2NvcGVSZWNvcmRlcihpZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIHJlY29yZGVycyBmaWx0ZXJlZCB0byB0aG9zZSB0aGF0XG4gICAqIGltcGxlbWVudCBgb25FbWl0YC4gVXNlZnVsIGZvciBpbnNwZWN0aW9uIGR1cmluZyB0ZXN0aW5nLlxuICAgKi9cbiAgZ2V0RW1pdFJlY29yZGVycygpOiBFbWl0UmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2NvcGVSZWNvcmRlcnMuZmlsdGVyKFxuICAgICAgKHIpOiByIGlzIEVtaXRSZWNvcmRlciA9PiB0eXBlb2YgKHIgYXMgeyBvbkVtaXQ/OiB1bmtub3duIH0pLm9uRW1pdCA9PT0gJ2Z1bmN0aW9uJyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgc3RydWN0dXJlZCBuYXJyYXRpdmUgZW50cmllcyDigJQgdGhlIHNpbmdsZSBwdWJsaWMgbmFycmF0aXZlIEFQSS5cbiAgICogRWFjaCBlbnRyeSBoYXMgYSB0eXBlIChzdGFnZSwgc3RlcCwgY29uZGl0aW9uLCBmb3JrLCBldGMuKSwgdGV4dCwgYW5kXG4gICAqIGRlcHRoLiBDb25zdW1lcnMgcmVuZGVyIGhvd2V2ZXIgdGhleSB3YW50OyBjYWxsIGAubWFwKGUgPT4gZS50ZXh0KWBcbiAgICogaWYgYSBmbGF0IGBzdHJpbmdbXWAgaXMgbmVlZGVkIGxvY2FsbHkuXG4gICAqL1xuICBnZXROYXJyYXRpdmVFbnRyaWVzKCk6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSB7XG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tYmluZWRSZWNvcmRlci5nZXRFbnRyaWVzKCk7XG4gICAgfVxuICAgIGNvbnN0IGZsb3dTZW50ZW5jZXMgPSB0aGlzLnRyYXZlcnNlci5nZXROYXJyYXRpdmUoKTtcbiAgICByZXR1cm4gZmxvd1NlbnRlbmNlcy5tYXAoKHRleHQpID0+ICh7IHR5cGU6ICdzdGFnZScgYXMgY29uc3QsIHRleHQsIGRlcHRoOiAwIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21iaW5lZCBGbG93UmVjb3JkZXJzIGxpc3QuIFdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQsXG4gICAqIGluY2x1ZGVzIHRoZSBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyICh3aGljaCBidWlsZHMgbWVyZ2VkIGZsb3crZGF0YVxuICAgKiBlbnRyaWVzIGlubGluZSkuIFBsdXMgYW55IHVzZXItYXR0YWNoZWQgcmVjb3JkZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEZsb3dSZWNvcmRlcnNMaXN0KCk6IEZsb3dSZWNvcmRlcltdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWNvcmRlcnM6IEZsb3dSZWNvcmRlcltdID0gW107XG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgcmVjb3JkZXJzLnB1c2godGhpcy5jb21iaW5lZFJlY29yZGVyKTtcbiAgICB9XG4gICAgcmVjb3JkZXJzLnB1c2goLi4udGhpcy5mbG93UmVjb3JkZXJzKTtcbiAgICByZXR1cm4gcmVjb3JkZXJzLmxlbmd0aCA+IDAgPyByZWNvcmRlcnMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBhc3luYyBydW4ob3B0aW9ucz86IFJ1bk9wdGlvbnMpOiBQcm9taXNlPEV4ZWN1dG9yUmVzdWx0PiB7XG4gICAgLy8gUmUtZW50cmFuY3kgZ3VhcmQgRklSU1Qg4oCUIGJlZm9yZSBjbGVhcmluZyByZWNvcmRlcnMgb3IgdG91Y2hpbmcgYW55XG4gICAgLy8gcGVyLXJ1biBmaWVsZCwgc28gYSByZWplY3RlZCBjb25jdXJyZW50IGNhbGwgbGVhdmVzIHRoZSBpbi1mbGlnaHQgcnVuXG4gICAgLy8gY29tcGxldGVseSB1bnRvdWNoZWQuXG4gICAgaWYgKHRoaXMuX2lzRXhlY3V0aW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdGbG93Q2hhcnRFeGVjdXRvcjogcnVuKCkgY2FsbGVkIHdoaWxlIGFub3RoZXIgcnVuKCkvcmVzdW1lKCkgaXMgaW4gZmxpZ2h0IG9uIHRoaXMgJyArXG4gICAgICAgICAgJ2V4ZWN1dG9yLiBBbiBleGVjdXRvciBob2xkcyBwZXItcnVuIHN0YXRlIChydW5JZCwgcmVjb3JkZXJzLCBjaGVja3BvaW50KSDigJQgY3JlYXRlICcgK1xuICAgICAgICAgICdvbmUgZXhlY3V0b3IgcGVyIGNvbmN1cnJlbnQgcnVuLiBTZWUgZG9jcy9ndWlkZXMvZXhlY3V0aW9uLW1vZGVsLm1kLicsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBWYWxpZGF0ZSBpbnB1dCBhZ2FpbnN0IGlucHV0U2NoZW1hIGlmIGJvdGggYXJlIHByZXNlbnQuIFZhbGlkYXRpb24gcnVuc1xuICAgIC8vIEJFRk9SRSB0aGUgdGltZW91dCB0aW1lciBpcyBjcmVhdGVkIHNvIGEgcmVqZWN0ZWQgaW5wdXQgY2FuJ3QgbGVhayBhXG4gICAgLy8gcGVuZGluZyB0aW1lciAoc2FtZSBcImZhaWxlZCBlbnRyeSBsZWF2ZXMgbm8gc2lkZSBlZmZlY3RzXCIgcnVsZSBhcyB0aGVcbiAgICAvLyByZS1lbnRyYW5jeSBndWFyZCBhYm92ZSkuXG4gICAgbGV0IHZhbGlkYXRlZElucHV0ID0gb3B0aW9ucz8uaW5wdXQ7XG4gICAgaWYgKHZhbGlkYXRlZElucHV0ICYmIHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuaW5wdXRTY2hlbWEpIHtcbiAgICAgIHZhbGlkYXRlZElucHV0ID0gdmFsaWRhdGVJbnB1dCh0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hLCB2YWxpZGF0ZWRJbnB1dCk7XG4gICAgfVxuXG4gICAgbGV0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBsZXQgdGltZW91dElkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcblxuICAgIC8vIENyZWF0ZSBhbiBpbnRlcm5hbCBBYm9ydENvbnRyb2xsZXIgZm9yIHRpbWVvdXRNc1xuICAgIGlmIChvcHRpb25zPy50aW1lb3V0TXMgJiYgIXNpZ25hbCkge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHNpZ25hbCA9IGNvbnRyb2xsZXIuc2lnbmFsO1xuICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4gY29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoYEV4ZWN1dGlvbiB0aW1lZCBvdXQgYWZ0ZXIgJHtvcHRpb25zLnRpbWVvdXRNc31tc2ApKSxcbiAgICAgICAgb3B0aW9ucy50aW1lb3V0TXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFVzZXItYXR0YWNoZWQgcmVjb3JkZXJzIChmbG93UmVjb3JkZXJzICsgc2NvcGVSZWNvcmRlcnMpIGFyZSBjbGVhcmVkIHZpYSBjbGVhcigpIHRvIHByZXZlbnRcbiAgICAvLyBjcm9zcy1ydW4gYWNjdW11bGF0aW9uLiBUaGUgY29tYmluZWRSZWNvcmRlciBpcyBOT1QgY2xlYXJlZCBoZXJlIOKAlCBjcmVhdGVUcmF2ZXJzZXIoKSBhbHdheXNcbiAgICAvLyBjcmVhdGVzIGEgZnJlc2ggQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciBpbnN0YW5jZSBvbiBlYWNoIHJ1biwgc28gc3RhbGUgc3RhdGUgaXMgbmV2ZXIgYW4gaXNzdWUuXG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuZmxvd1JlY29yZGVycykge1xuICAgICAgci5jbGVhcj8uKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnNjb3BlUmVjb3JkZXJzKSB7XG4gICAgICByLmNsZWFyPy4oKTtcbiAgICB9XG5cbiAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIgPSB7IHZhbHVlOiAwIH07IC8vIFJlc2V0IGNvdW50ZXIgb24gZnJlc2ggcnVuXG4gICAgdGhpcy5fY3VycmVudFJ1bklkID0gZ2VuZXJhdGVSdW5JZCgpOyAvLyBGcmVzaCBydW5JZCBwZXIgcnVuKCkgY2FsbFxuICAgIHRoaXMuX2hhc1J1bkJlZm9yZSA9IHRydWU7IC8vIG1hcmsgc28gYSBsYXRlciByZXN1bWUoKSB0YWtlcyB0aGVcbiAgICAvLyBzYW1lLWV4ZWN1dG9yIGJyYW5jaCAocmV1c2UgcnVudGltZSwgYWNjdW11bGF0ZSBleGVjdXRpb24gdHJlZSkuXG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcihzaWduYWwsIHZhbGlkYXRlZElucHV0LCBvcHRpb25zPy5lbnYsIG9wdGlvbnM/Lm1heERlcHRoKTtcbiAgICAvLyBTZXQgQUZURVIgYWxsIHN5bmMgdmFsaWRhdGlvbiB0aHJvd3MgKG5vdGhpbmcgYWJvdmUgY2FuIGxlYWsgdGhlIGZsYWcpO1xuICAgIC8vIG5vIGF3YWl0IGJldHdlZW4gdGhlIHRvcC1vZi1tZXRob2QgY2hlY2sgYW5kIGhlcmUsIHNvIHRoaXMgaXMgcmFjZS1mcmVlLlxuICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIC8vIEJ1aWxkIGEgZGV0YWNoZWQgY2hlY2twb2ludCBmcm9tIGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlIOKAlCBzZWVcbiAgICAgICAgLy8gYnVpbGRQYXVzZUNoZWNrcG9pbnQoKSBmb3IgdGhlIGRlZXAtY29weSByYXRpb25hbGUuXG4gICAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB0aGlzLmJ1aWxkUGF1c2VDaGVja3BvaW50KGVycm9yKTtcbiAgICAgICAgLy8gUmV0dXJuIGEgUGF1c2VSZXN1bHQtc2hhcGVkIHZhbHVlIHNvIGNhbGxlcnMgY2FuIGNoZWNrIHdpdGhvdXQgdHJ5L2NhdGNoXG4gICAgICAgIHJldHVybiB7IHBhdXNlZDogdHJ1ZSwgY2hlY2twb2ludDogdGhpcy5sYXN0Q2hlY2twb2ludCB9IHNhdGlzZmllcyBQYXVzZWRSZXN1bHQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgICAgIGlmICh0aW1lb3V0SWQgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEludHJvc3BlY3Rpb24g4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJ1bnRpbWUgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnJlZGFjdCAgV2hlbiBgdHJ1ZWAsIGBzaGFyZWRTdGF0ZWAgY29tZXMgZnJvbSB0aGUgcGFyYWxsZWxcbiAgICogICByZWRhY3RlZCBtaXJyb3IgKGlmIG1haW50YWluZWQg4oCUIHNlZSBgc2V0UmVkYWN0aW9uUG9saWN5YCkuIFRoaXMgaXNcbiAgICogICB0aGUgc2FmZSB2aWV3IGZvciBleHBvcnRpbmcgdHJhY2VzIGV4dGVybmFsbHkgKHBhc3RlIGludG8gYSB2aWV3ZXIsXG4gICAqICAgc2hhcmUgd2l0aCBzdXBwb3J0KS4gV2hlbiBubyByZWRhY3Rpb24gcG9saWN5IGlzIGNvbmZpZ3VyZWQgdGhlXG4gICAqICAgcmVkYWN0ZWQgbWlycm9yIGlzIG5vdCBtYWludGFpbmVkLCBzbyB0aGlzIGZsYWcgaXMgYSBuby1vcCDigJRcbiAgICogICBgc2hhcmVkU3RhdGVgIGlzIHRoZSByYXcgd29ya2luZyBtZW1vcnkgZWl0aGVyIHdheS4gRGVmYXVsdCBgZmFsc2VgLlxuICAgKlxuICAgKiAgIFRoZSBjb21taXQgbG9nIGlzIGFscmVhZHkgcmVkYWN0ZWQgYXQgd3JpdGUtdGltZSByZWdhcmRsZXNzIG9mIHRoaXNcbiAgICogICBmbGFnLCBhbmQgdGhlIGV4ZWN1dGlvbiB0cmVlIGNhcnJpZXMgb25seSBzdHJ1Y3R1cmFsIG1ldGFkYXRhLlxuICAgKlxuICAgKiAqKlRyZWF0IGBzaGFyZWRTdGF0ZWAgYXMgUkVBRC1PTkxZLioqIEluIHByb2R1Y3Rpb24gaXQgaXMgYSBsaXZlIHZpZXcgb2ZcbiAgICogdGhlIGVuZ2luZSdzIHdvcmtpbmcgbWVtb3J5ICh6ZXJvIGNvcHkgY29zdCkg4oCUIG11dGF0aW5nIGl0IGNvcnJ1cHRzXG4gICAqIGVuZ2luZSBzdGF0ZS4gSW4gZGV2IG1vZGUgKGBlbmFibGVEZXZNb2RlKClgKSBpdCBpcyBhIGRlZXAtZnJvemVuIENMT05FLFxuICAgKiBzbyBhbnkgY29uc3VtZXIgbXV0YXRpb24gdGhyb3dzIGxvdWRseSBpbnN0ZWFkIG9mIGNvcnJ1cHRpbmcgc2lsZW50bHkuXG4gICAqL1xuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pOiBSdW50aW1lU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy50cmF2ZXJzZXIuZ2V0U25hcHNob3Qob3B0aW9ucykgYXMgUnVudGltZVNuYXBzaG90O1xuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgLy8gRGV2LW1vZGUgbXV0YXRpb24gZ3VhcmQ6IGZyZWV6ZSBhIENMT05FLCBuZXZlciB0aGUgbGl2ZSBlbmdpbmVcbiAgICAgIC8vIHN0YXRlIOKAlCBgc25hcHNob3Quc2hhcmVkU3RhdGVgIGFsaWFzZXMgU2hhcmVkTWVtb3J5J3MgaW50ZXJuYWxcbiAgICAgIC8vIGNvbnRleHQgdW50aWwgdGhlIG5leHQgY29tbWl0IHJlYnVpbGRzIGl0IChwb3N0LXJ1bjogZm9yZXZlcikuXG4gICAgICAvLyBQcm9kdWN0aW9uIHN0YXlzIHplcm8tY29weTsgY2xvbmUtYWx3YXlzIGlzIGEgbWVhc3VyZWQgZGVjaXNpb25cbiAgICAgIC8vIGRlZmVycmVkIHVudGlsIHRoZSBiZW5jaCBzYXlzIGl0J3MgYWZmb3JkYWJsZSAoQkFDS0xPRyAjOCkuXG4gICAgICAvLyBOT1RFOiBkZWVwRnJlZXplIChyZXVzZWQgZnJvbSByZWFkb25seUlucHV0KSBmcmVlemVzIHBsYWluIG9iamVjdHMvXG4gICAgICAvLyBhcnJheXMgb25seSDigJQgTWFwL1NldCBJTlRFUk5BTFMgc3RheSBtdXRhYmxlIChgbWFwLnNldCgpYCBvbiB0aGVcbiAgICAgIC8vIGZyb3plbiBjbG9uZSB3b24ndCB0aHJvdykuIFRoZSBDTE9ORSBzdGlsbCBpc29sYXRlcyB0aGUgZW5naW5lLlxuICAgICAgc25hcHNob3Quc2hhcmVkU3RhdGUgPSBkZWVwRnJlZXplKHN0cnVjdHVyZWRDbG9uZShzbmFwc2hvdC5zaGFyZWRTdGF0ZSkpO1xuICAgIH1cbiAgICBjb25zdCBzZlJlc3VsdHMgPSB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICAgIGlmIChzZlJlc3VsdHMuc2l6ZSA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dSZXN1bHRzID0gT2JqZWN0LmZyb21FbnRyaWVzKHNmUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdCBzbmFwc2hvdCBkYXRhIGZyb20gcmVjb3JkZXJzIHRoYXQgaW1wbGVtZW50IHRvU25hcHNob3QoKVxuICAgIGNvbnN0IHJlY29yZGVyU25hcHNob3RzOiBSZWNvcmRlclNuYXBzaG90W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5zY29wZVJlY29yZGVycykge1xuICAgICAgaWYgKHIudG9TbmFwc2hvdCkge1xuICAgICAgICBjb25zdCBzbmFwID0gci50b1NuYXBzaG90KCk7XG4gICAgICAgIHJlY29yZGVyU25hcHNob3RzLnB1c2goe1xuICAgICAgICAgIGlkOiByLmlkLFxuICAgICAgICAgIG5hbWU6IHNuYXAubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogc25hcC5kZXNjcmlwdGlvbixcbiAgICAgICAgICBwcmVmZXJyZWRPcGVyYXRpb246IHNuYXAucHJlZmVycmVkT3BlcmF0aW9uLFxuICAgICAgICAgIGRhdGE6IHNuYXAuZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIHtcbiAgICAgIGlmIChyLnRvU25hcHNob3QpIHtcbiAgICAgICAgY29uc3Qgc25hcCA9IHIudG9TbmFwc2hvdCgpO1xuICAgICAgICByZWNvcmRlclNuYXBzaG90cy5wdXNoKHtcbiAgICAgICAgICBpZDogci5pZCxcbiAgICAgICAgICBuYW1lOiBzbmFwLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHNuYXAuZGVzY3JpcHRpb24sXG4gICAgICAgICAgcHJlZmVycmVkT3BlcmF0aW9uOiBzbmFwLnByZWZlcnJlZE9wZXJhdGlvbixcbiAgICAgICAgICBkYXRhOiBzbmFwLmRhdGEsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVjb3JkZXJTbmFwc2hvdHMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QucmVjb3JkZXJzID0gcmVjb3JkZXJTbmFwc2hvdHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMudHJhdmVyc2VyLnNldFJvb3RPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0QnJhbmNoSWRzKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVSb290KCk6IFN0YWdlTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVSb290KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZVN0cnVjdHVyZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTdWJmbG93UmVzdWx0cygpOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3ViZmxvdyBtYW5pZmVzdCBmcm9tIGFuIGF0dGFjaGVkIE1hbmlmZXN0Rmxvd1JlY29yZGVyLlxuICAgKiBSZXR1cm5zIGVtcHR5IGFycmF5IGlmIG5vIE1hbmlmZXN0Rmxvd1JlY29yZGVyIGlzIGF0dGFjaGVkLlxuICAgKi9cbiAgZ2V0U3ViZmxvd01hbmlmZXN0KCk6IE1hbmlmZXN0RW50cnlbXSB7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmluZCgocikgPT4gciBpbnN0YW5jZW9mIE1hbmlmZXN0Rmxvd1JlY29yZGVyKSBhc1xuICAgICAgfCBNYW5pZmVzdEZsb3dSZWNvcmRlclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlY29yZGVyPy5nZXRNYW5pZmVzdCgpID8/IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZ1bGwgc3BlYyBmb3IgYSBkeW5hbWljYWxseS1yZWdpc3RlcmVkIHN1YmZsb3cuXG4gICAqIFJlcXVpcmVzIGFuIGF0dGFjaGVkIE1hbmlmZXN0Rmxvd1JlY29yZGVyIHRoYXQgb2JzZXJ2ZWQgdGhlIHJlZ2lzdHJhdGlvbi5cbiAgICovXG4gIGdldFN1YmZsb3dTcGVjKHN1YmZsb3dJZDogc3RyaW5nKTogdW5rbm93biB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmluZCgocikgPT4gciBpbnN0YW5jZW9mIE1hbmlmZXN0Rmxvd1JlY29yZGVyKSBhc1xuICAgICAgfCBNYW5pZmVzdEZsb3dSZWNvcmRlclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlY29yZGVyPy5nZXRTcGVjKHN1YmZsb3dJZCk7XG4gIH1cbn1cbiJdfQ==