footprintjs 10.1.0 → 10.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.
Files changed (64) hide show
  1. package/CLAUDE.md +18 -0
  2. package/dist/esm/index.d.ts +2 -0
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/lib/attempt/category.d.ts +6 -0
  5. package/dist/esm/lib/attempt/category.js +26 -2
  6. package/dist/esm/lib/attempt/runner.d.ts +3 -1
  7. package/dist/esm/lib/attempt/runner.js +26 -6
  8. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
  9. package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
  10. package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
  11. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +5 -2
  12. package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
  13. package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
  14. package/dist/esm/lib/engine/handlers/stageError.d.ts +2 -0
  15. package/dist/esm/lib/engine/handlers/stageError.js +13 -1
  16. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -1
  17. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +6 -2
  18. package/dist/esm/lib/engine/narrative/types.d.ts +4 -1
  19. package/dist/esm/lib/engine/narrative/types.js +1 -1
  20. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +14 -6
  21. package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
  22. package/dist/esm/lib/errors/terminalFailure.js +60 -0
  23. package/dist/esm/lib/memory/StageContext.d.ts +14 -0
  24. package/dist/esm/lib/memory/StageContext.js +32 -1
  25. package/dist/esm/lib/memory/attention.d.ts +26 -0
  26. package/dist/esm/lib/memory/attention.js +171 -0
  27. package/dist/esm/lib/memory/frameTypes.d.ts +8 -0
  28. package/dist/esm/lib/memory/frameTypes.js +1 -1
  29. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +14 -0
  30. package/dist/esm/lib/recorder/ControlDepRecorder.js +18 -1
  31. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +4 -0
  32. package/dist/esm/lib/runner/FlowChartExecutor.js +163 -127
  33. package/dist/index.js +1 -1
  34. package/dist/lib/attempt/category.js +27 -2
  35. package/dist/lib/attempt/runner.js +25 -5
  36. package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
  37. package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
  38. package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
  39. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -2
  40. package/dist/lib/engine/handlers/commitStage.js +24 -5
  41. package/dist/lib/engine/handlers/stageError.js +15 -2
  42. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +6 -2
  43. package/dist/lib/engine/narrative/types.js +1 -1
  44. package/dist/lib/engine/traversal/FlowchartTraverser.js +12 -4
  45. package/dist/lib/errors/terminalFailure.js +64 -0
  46. package/dist/lib/memory/StageContext.js +32 -1
  47. package/dist/lib/memory/attention.js +175 -0
  48. package/dist/lib/memory/frameTypes.js +1 -1
  49. package/dist/lib/recorder/ControlDepRecorder.js +18 -1
  50. package/dist/lib/runner/FlowChartExecutor.js +163 -127
  51. package/dist/types/index.d.ts +2 -0
  52. package/dist/types/lib/attempt/category.d.ts +6 -0
  53. package/dist/types/lib/attempt/runner.d.ts +3 -1
  54. package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
  55. package/dist/types/lib/engine/handlers/stageError.d.ts +2 -0
  56. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -1
  57. package/dist/types/lib/engine/narrative/types.d.ts +4 -1
  58. package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
  59. package/dist/types/lib/memory/StageContext.d.ts +14 -0
  60. package/dist/types/lib/memory/attention.d.ts +26 -0
  61. package/dist/types/lib/memory/frameTypes.d.ts +8 -0
  62. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +14 -0
  63. package/dist/types/lib/runner/FlowChartExecutor.d.ts +4 -0
  64. package/package.json +6 -6
@@ -36,7 +36,7 @@ import { prefixNodeTree } from '../graph/prefixNodeTree.js';
36
36
  import { isStageNodeReturn } from '../graph/StageNode.js';
37
37
  import { createBreakHandler } from '../handlers/breakFlag.js';
38
38
  import { ChildrenExecutor } from '../handlers/ChildrenExecutor.js';
39
- import { commitStage } from '../handlers/commitStage.js';
39
+ import { commitStage, commitStageWrites } from '../handlers/commitStage.js';
40
40
  import { ContinuationResolver } from '../handlers/ContinuationResolver.js';
41
41
  import { DeciderHandler } from '../handlers/DeciderHandler.js';
42
42
  import { NodeResolver } from '../handlers/NodeResolver.js';
@@ -45,7 +45,7 @@ import { queueBehind, raiseQueuedPause } from '../handlers/ResumeEntry.js';
45
45
  import { RuntimeStructureManager } from '../handlers/RuntimeStructureManager.js';
46
46
  import { SelectorHandler } from '../handlers/SelectorHandler.js';
47
47
  import { servedPause } from '../handlers/servedPause.js';
48
- import { loggableStageError, recordStageError, servedIdempotencyKey, servedStageError, } from '../handlers/stageError.js';
48
+ import { captureStageFailure, loggableStageError, recordStageError, servedIdempotencyKey, servedStageError, } from '../handlers/stageError.js';
49
49
  import { StageRunner } from '../handlers/StageRunner.js';
50
50
  import { SubflowExecutor } from '../handlers/SubflowExecutor.js';
51
51
  import { TraversalDepthError } from '../handlers/TraversalDepthError.js';
@@ -428,7 +428,7 @@ export class FlowchartTraverser {
428
428
  }
429
429
  catch (error) {
430
430
  if (!isPauseSignal(error)) {
431
- this.narrativeGenerator.onRunFailed(redactionRule ? redactionRule.servedError(error) : extractErrorInfo(error), rootContext);
431
+ this.narrativeGenerator.onRunFailed(redactionRule ? redactionRule.servedError(error) : extractErrorInfo(error), rootContext, context.failureState.announce(error));
432
432
  }
433
433
  throw error;
434
434
  }
@@ -690,6 +690,11 @@ export class FlowchartTraverser {
690
690
  // the decision is made, not once it has already elapsed.
691
691
  onRetry: (attempt, of, delayMs, structuredError) => this.narrativeGenerator.onStageRetry(node.name, node.id, attempt, of, delayMs, structuredError, traversalContext),
692
692
  onEnd: (summary) => context.endAttempts(summary),
693
+ onFailure: (error, category) => {
694
+ const identity = context.failureIdentity;
695
+ if (identity)
696
+ context.failureState.capture(error, category, identity);
697
+ },
693
698
  // A predicate may rethrow the stage's own error: the logger gets the served form.
694
699
  onRetryOnThrew: (thrown) => this.logger.warn('[footprint] retryOn predicate threw; treating the failure as final', {
695
700
  error: loggableStageError(context, thrown),
@@ -970,6 +975,8 @@ export class FlowchartTraverser {
970
975
  // use the same value. Must happen before executeStage AND before traversalContext.
971
976
  const idx = this._executionCounter.value++;
972
977
  context.runtimeStageId = buildRuntimeStageId(node.id, idx);
978
+ context.bindFailureIdentity(this.runId, context.runtimeStageId);
979
+ context.beginAttention();
973
980
  context.bindEmitOrigin(this.runId, this.emitDrillPath);
974
981
  // Declared tags (9.21.0) ride the same stamp: per-node identity, set
975
982
  // UNCONDITIONALLY so a re-used context (a loop's next-context, a resumed
@@ -1208,11 +1215,12 @@ export class FlowchartTraverser {
1208
1215
  catch (error) {
1209
1216
  // PauseSignal is expected control flow, not an error — fire narrative, commit, re-throw.
1210
1217
  if (isPauseSignal(error)) {
1211
- context.commit();
1218
+ commitStageWrites(context);
1212
1219
  this.narrativeGenerator.onPause(node.name, node.id, servedPause(context, error.pauseData), error.subflowPath, traversalContext);
1213
1220
  throw error;
1214
1221
  }
1215
- context.commit();
1222
+ captureStageFailure(context, error);
1223
+ commitStageWrites(context);
1216
1224
  const served = recordStageError(context, error);
1217
1225
  this.narrativeGenerator.onError(node.name, served.message, served.structuredError, traversalContext);
1218
1226
  this.logger.error(`Error in pipeline (${branchPath}) stage [${node.name}]:`, {
@@ -1464,4 +1472,4 @@ function touchesRefusal(node) {
1464
1472
  const problem = touchesProblem(node.touches, node.retry);
1465
1473
  return problem === undefined ? undefined : `stage '${node.id}': ${problem}`;
1466
1474
  }
1467
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUUzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxN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b0IsQ0FDeEMsV0FBVyxFQUNYLFNBQVMsRUFDVCxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFDckQsVUFBVSxDQUFDLGtCQUFrQixDQUM5QixDQUFDO1FBQ0osQ0FBQztRQUVELDZFQUE2RTtRQUM3RSxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksU0FBUyxDQUFDO1lBQ3ZGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FDekMsU0FBUyxFQUNULFdBQVcsRUFDWCxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFDNUIsVUFBVSxDQUFDLGtCQUFrQixDQUM5QixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7O0FBR0gsNkZBQTZGO0FBQzdGLFNBQVMsY0FBYyxDQUFDLElBQXlCO0lBQy9DLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6RCxPQUFPLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsRUFBRSxNQUFNLE9BQU8sRUFBRSxDQUFDO0FBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZsb3djaGFydFRyYXZlcnNlciDigJQgUHJlLW9yZGVyIERGUyB0cmF2ZXJzYWwgb2YgU3RhZ2VOb2RlIGdyYXBoLlxuICpcbiAqIFVuaWZpZWQgdHJhdmVyc2FsIGFsZ29yaXRobSBmb3IgYWxsIG5vZGUgc2hhcGVzLiBgZXhlY3V0ZU5vZGVgIGlzIGFcbiAqIFRSQU1QT0xJTkUgZHJpdmVyOiBpdCBydW5zIGBleGVjdXRlTm9kZVN0ZXBgIChvbmUgbm9kZSwgYWxsIDcgcGhhc2VzKSBpblxuICogYSBmbGF0IGxvb3AsIGZvbGxvd2luZyB0YWlsIGNvbnRpbnVhdGlvbnMgKGxpbmVhciBgbmV4dGAsIGxvb3AgZWRnZXMsXG4gKiBkeW5hbWljIG5leHQsIGZsYXQgZGVjaWRlciBkaXNwYXRjaCkgaXRlcmF0aXZlbHkg4oCUIHNvIGNoYWluIGxlbmd0aCBhbmRcbiAqIGxvb3AgaXRlcmF0aW9ucyBuZXZlciBncm93IHRoZSBjYWxsIHN0YWNrLiBPbmx5IHRydWUgdHJlZSBuZXN0aW5nIChmb3JrXG4gKiBjaGlsZHJlbiwgd2l0aC1jb250aW51YXRpb24gZGVjaWRlci9zZWxlY3RvciBicmFuY2hlcywgc3ViZmxvdyBtb3VudHMpXG4gKiByZWN1cnNlcy5cbiAqXG4gKiBGb3IgZWFjaCBub2RlLCBleGVjdXRlTm9kZVN0ZXAgZm9sbG93cyA3IHBoYXNlczpcbiAqICAgMC4gQ0xBU1NJRlkgIOKAlCBzdWJmbG93IGRldGVjdGlvbiwgZWFybHkgZGVsZWdhdGlvblxuICogICAwYi4gUEFSQUxMRUwtRk9SLUVBQ0gg4oCUIGR5bmFtaWMgZmFuLW91dCAoYnJhbmNoZXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBheWxvYWQpXG4gKiAgIDEuIFZBTElEQVRFICDigJQgbm9kZSBpbnZhcmlhbnRzLCByb2xlIG1hcmtlcnNcbiAqICAgMi4gRVhFQ1VURSAgIOKAlCBydW4gc3RhZ2UgZm4sIGNvbW1pdCwgYnJlYWsgY2hlY2tcbiAqICAgMy4gRFlOQU1JQyAgIOKAlCBTdGFnZU5vZGUgcmV0dXJuIGRldGVjdGlvbiwgc3ViZmxvdyBhdXRvLXJlZ2lzdHJhdGlvbiwgc3RydWN0dXJlIHVwZGF0ZXNcbiAqICAgNC4gQ0hJTERSRU4gIOKAlCBmb3JrL3NlbGVjdG9yL2RlY2lkZXIgZGlzcGF0Y2hcbiAqICAgNS4gQ09OVElOVUUgIOKAlCBkeW5hbWljIG5leHQgLyBsaW5lYXIgbmV4dCByZXNvbHV0aW9uXG4gKiAgIDYuIExFQUYgICAgICDigJQgbm8gY29udGludWF0aW9uLCByZXR1cm4gb3V0cHV0XG4gKlxuICogQnJlYWsgc2VtYW50aWNzOiBJZiBhIHN0YWdlIGNhbGxzIGJyZWFrRm4oKSwgY29tbWl0IGFuZCBTVE9QLlxuICogUGF0Y2ggbW9kZWw6IFN0YWdlIHdyaXRlcyBpbnRvIGxvY2FsIHBhdGNoOyBjb21taXRQYXRjaCgpIGFmdGVyIHJldHVybiBvciB0aHJvdy5cbiAqL1xuXG5pbXBvcnQgeyBidWlsZFJ1bnRpbWVTdGFnZUlkLCBqb2luUGF0aCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IHJlYWREZWFkbGluZSB9IGZyb20gJy4uLy4uL2F0dGVtcHQvZGVhZGxpbmUuanMnO1xuaW1wb3J0IHR5cGUgeyBFZmZlY3RUYXJnZXQgfSBmcm9tICcuLi8uLi9hdHRlbXB0L2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBhZG1pdElkZW1wb3RlbmN5S2V5LCBpc0NhcnJpZWRUb3VjaGVzLCB0b3VjaGVzUHJvYmxlbSB9IGZyb20gJy4uLy4uL2F0dGVtcHQvZWZmZWN0LmpzJztcbmltcG9ydCB7IGF0dGVtcHRDZWlsaW5nLCBhdHRlbXB0VGltZW91dE1zLCByZXRyeVBvbGljeVByb2JsZW0gfSBmcm9tICcuLi8uLi9hdHRlbXB0L3BvbGljeS5qcyc7XG5pbXBvcnQgeyBmcmVlemVEZWVwIH0gZnJvbSAnLi4vLi4vYXR0ZW1wdC9yZWNvcmQuanMnO1xuaW1wb3J0IHsgcnVuQXR0ZW1wdHMgfSBmcm9tICcuLi8uLi9hdHRlbXB0L3J1bm5lci5qcyc7XG5pbXBvcnQgdHlwZSB7IFJldHJ5UG9saWN5LCBSdW5Db3JyZWxhdGlvbiwgU3RhZ2VUb3VjaGVzIH0gZnJvbSAnLi4vLi4vYXR0ZW1wdC90eXBlcy5qcyc7XG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCB0aHJvd25UZXh0IH0gZnJvbSAnLi4vLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyByZWZ1c2VSZXNlcnZlZElkIH0gZnJvbSAnLi4vLi4vaWRzL3Jlc2VydmVkSWRzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgc25hcHNob3RSdW5JbnB1dCB9IGZyb20gJy4uLy4uL3Njb3BlL3Byb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjb3BlUHJvdGVjdGlvbk1vZGUgfSBmcm9tICcuLi8uLi9zY29wZS9wcm90ZWN0aW9uL3R5cGVzLmpzJztcbmltcG9ydCB7IHByZWZpeE5vZGVUcmVlIH0gZnJvbSAnLi4vZ3JhcGgvcHJlZml4Tm9kZVRyZWUuanMnO1xuaW1wb3J0IHsgaXNTdGFnZU5vZGVSZXR1cm4gfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHsgY3JlYXRlQnJlYWtIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvYnJlYWtGbGFnLmpzJztcbmltcG9ydCB7IENoaWxkcmVuRXhlY3V0b3IgfSBmcm9tICcuLi9oYW5kbGVycy9DaGlsZHJlbkV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGNvbW1pdFN0YWdlIH0gZnJvbSAnLi4vaGFuZGxlcnMvY29tbWl0U3RhZ2UuanMnO1xuaW1wb3J0IHsgQ29udGludWF0aW9uUmVzb2x2ZXIgfSBmcm9tICcuLi9oYW5kbGVycy9Db250aW51YXRpb25SZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBEZWNpZGVySGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL0RlY2lkZXJIYW5kbGVyLmpzJztcbmltcG9ydCB7IE5vZGVSZXNvbHZlciB9IGZyb20gJy4uL2hhbmRsZXJzL05vZGVSZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBQYXJhbGxlbEZvckVhY2hIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvUGFyYWxsZWxGb3JFYWNoSGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlZFBhdXNlLCBSZXN1bWVFbnRyeSB9IGZyb20gJy4uL2hhbmRsZXJzL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IHF1ZXVlQmVoaW5kLCByYWlzZVF1ZXVlZFBhdXNlIH0gZnJvbSAnLi4vaGFuZGxlcnMvUmVzdW1lRW50cnkuanMnO1xuaW1wb3J0IHsgUnVudGltZVN0cnVjdHVyZU1hbmFnZXIgfSBmcm9tICcuLi9oYW5kbGVycy9SdW50aW1lU3RydWN0dXJlTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWxlY3RvckhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9TZWxlY3RvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgc2VydmVkUGF1c2UgfSBmcm9tICcuLi9oYW5kbGVycy9zZXJ2ZWRQYXVzZS5qcyc7XG5pbXBvcnQge1xuICBsb2dnYWJsZVN0YWdlRXJyb3IsXG4gIHJlY29yZFN0YWdlRXJyb3IsXG4gIHNlcnZlZElkZW1wb3RlbmN5S2V5LFxuICBzZXJ2ZWRTdGFnZUVycm9yLFxufSBmcm9tICcuLi9oYW5kbGVycy9zdGFnZUVycm9yLmpzJztcbmltcG9ydCB7IFN0YWdlUnVubmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvU3RhZ2VSdW5uZXIuanMnO1xuaW1wb3J0IHsgU3ViZmxvd0V4ZWN1dG9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLmpzJztcbmltcG9ydCB7IFRyYXZlcnNhbERlcHRoRXJyb3IgfSBmcm9tICcuLi9oYW5kbGVycy9UcmF2ZXJzYWxEZXB0aEVycm9yLmpzJztcbmltcG9ydCB0eXBlIHsgQnJlYWtGbGFnIH0gZnJvbSAnLi4vaGFuZGxlcnMvdHlwZXMuanMnO1xuaW1wb3J0IHsgRmxvd1JlY29yZGVyRGlzcGF0Y2hlciB9IGZyb20gJy4uL25hcnJhdGl2ZS9GbG93UmVjb3JkZXJEaXNwYXRjaGVyLmpzJztcbmltcG9ydCB7IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4uL25hcnJhdGl2ZS9OYXJyYXRpdmVGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgTnVsbENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yIH0gZnJvbSAnLi4vbmFycmF0aXZlL051bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciwgSUNvbnRyb2xGbG93TmFycmF0aXZlLCBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IHJvb3RUcmF2ZXJzYWxDb250ZXh0LCB0cmF2ZXJzYWxDb250ZXh0Rm9yIH0gZnJvbSAnLi4vdHJhdmVyc2FsQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEhhbmRsZXJEZXBzLFxuICBJRXhlY3V0aW9uUnVudGltZSxcbiAgSUxvZ2dlcixcbiAgTm9kZVJlc3VsdFR5cGUsXG4gIFNjb3BlRmFjdG9yeSxcbiAgU2VsZWN0b3IsXG4gIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgU3RhZ2VGdW5jdGlvbixcbiAgU3RhZ2VOb2RlLFxuICBTdHJlYW1IYW5kbGVycyxcbiAgU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgU3ViZmxvd1Jlc3VsdCxcbiAgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnksXG4gIFRyYXZlcnNhbFJlc3VsdCxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYXZlcnNlck9wdGlvbnM8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKlxuICAgKiBUaGUgZ3JhcGggdGhpcyB0cmF2ZXJzZXIgd2Fsa3Mg4oCUIGFuZCB0aGUgZ3JhcGggZXZlcnkgaWQgcmVzb2x2ZXMgYWdhaW5zdFxuICAgKiAodGhlIG5vZGUgbWFwIGJlaGluZCBldmVyeSBgbG9vcFRvYCwgdGhlIERGUyBmYWxsYmFjaykuIGBleGVjdXRlKClgXG4gICAqIHN0YXJ0cyBoZXJlIHVubGVzcyBgZW50cnlgIHNheXMgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBXaGVyZSBgZXhlY3V0ZSgpYCBzdGFydHMgd2hlbiBub3QgYXQgYHJvb3RgIOKAlCBhIHJlc3VtZSdzIG9uZS1zaG90XG4gICAqIHJlLWVudHJ5IChNMik6IHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiwgb3IgdGhlIG1vdW50IG9mIHRoZSBmaXJzdFxuICAgKiBzdWJmbG93IG9uIHRoZSBwYXVzZSBwYXRoLCBlYWNoIHdpdGggaXRzIGRpc3BhdGNoZXIncyBjb250aW51YXRpb25cbiAgICogYXR0YWNoZWQuIFZpc2l0ZWQgb25jZSwgZmlyc3QsIGFuZCBuZXZlciByZWdpc3RlcmVkIGFueXdoZXJlIGFuIGlkIGNhblxuICAgKiByZWFjaCBpdCwgc28gYSBsb29wIGJhY2sgdG8gdGhlIHBhdXNlZCBzdGFnZSBmaW5kcyB0aGUgUkVBTCBzdGFnZS5cbiAgICogQ29uc3VtZWQgYnkgdGhlIGZpcnN0IGBleGVjdXRlKClgLlxuICAgKi9cbiAgZW50cnk/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgLyoqXG4gICAqIFBhcmFsbGVsIHNpYmxpbmdzJyBwYXVzZXMgd2FpdGluZyBhdCB0aGlzIGxldmVsIChhIHJlc3VtZSwgOS4yOC4wKTogb25jZVxuICAgKiBgZW50cnlgJ3MgY2hhaW4gZW5kcywgYGV4ZWN1dGUoKWAgcmFpc2VzIHRoZSBmaXJzdCBhZ2FpbiAodGhlIHJlc3Qgd2FpdFxuICAgKiBiZWhpbmQgaXQpOyBhIHBhdXNlIHJhaXNlZCBmcm9tIGluc2lkZSB0aGUgY2hhaW4gY2FycmllcyB0aGVtIGFsbC4gT25seVxuICAgKiB3aXRoIGBlbnRyeWA7IGNvbnN1bWVkIGJ5IHRoZSBmaXJzdCBgZXhlY3V0ZSgpYC4gU2VlIGBSZXN1bWVFbnRyeWAuXG4gICAqL1xuICBwZW5kaW5nUGF1c2VzPzogcmVhZG9ubHkgUXVldWVkUGF1c2VbXTtcbiAgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47XG4gIHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT47XG4gIGV4ZWN1dGlvblJ1bnRpbWU6IElFeGVjdXRpb25SdW50aW1lO1xuICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuICAvKiogRXhlY3V0aW9uIGVudmlyb25tZW50IOKAlCBwcm9wYWdhdGVzIHRvIHN1YmZsb3dzIGF1dG9tYXRpY2FsbHkuICovXG4gIGV4ZWN1dGlvbkVudj86IGltcG9ydCgnLi4vLi4vZW5naW5lL3R5cGVzLmpzJykuRXhlY3V0aW9uRW52O1xuICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyPzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICBzY29wZVByb3RlY3Rpb25Nb2RlPzogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgc3ViZmxvd3M/OiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+O1xuICBuYXJyYXRpdmVFbmFibGVkPzogYm9vbGVhbjtcbiAgYnVpbGRUaW1lU3RydWN0dXJlPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBsb2dnZXI6IElMb2dnZXI7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKiogUHJlLWNvbmZpZ3VyZWQgRmxvd1JlY29yZGVycyB0byBhdHRhY2ggd2hlbiBuYXJyYXRpdmUgaXMgZW5hYmxlZC4gKi9cbiAgZmxvd1JlY29yZGVycz86IEZsb3dSZWNvcmRlcltdO1xuICAvKipcbiAgICogUHJlLWNvbmZpZ3VyZWQgbmFycmF0aXZlIGdlbmVyYXRvci4gSWYgcHJvdmlkZWQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlclxuICAgKiBmbG93UmVjb3JkZXJzIGFuZCBuYXJyYXRpdmVFbmFibGVkLiBVc2VkIGJ5IHRoZSBzdWJmbG93IHRyYXZlcnNlciBmYWN0b3J5XG4gICAqIHRvIHNoYXJlIHRoZSBwYXJlbnQncyBuYXJyYXRpdmUgZ2VuZXJhdG9yIHdpdGggc3ViZmxvdyB0cmF2ZXJzZXJzLlxuICAgKi9cbiAgbmFycmF0aXZlR2VuZXJhdG9yPzogSUNvbnRyb2xGbG93TmFycmF0aXZlO1xuICAvKipcbiAgICogTWF4aW11bSBuZXN0ZWQgZXhlY3V0ZU5vZGUgZGVwdGggKHRyZWUgbmVzdGluZyDigJQgYnJhbmNoL2ZvcmsgZGlzcGF0Y2ggYW5kXG4gICAqIGR5bmFtaWMgcmVjdXJzaW9uLCBOT1QgbGluZWFyIGNoYWlucyBvciBsb29wIGl0ZXJhdGlvbnMsIHdoaWNoIHJ1biBmbGF0KS5cbiAgICogRGVmYXVsdHMgdG8gRmxvd2NoYXJ0VHJhdmVyc2VyLk1BWF9FWEVDVVRFX0RFUFRIICg1MDApLlxuICAgKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGxvb3AgaXRlcmF0aW9ucyBwZXIgbm9kZSAodGhlIENvbnRpbnVhdGlvblJlc29sdmVyIGd1YXJkKS5cbiAgICogRGVmYXVsdHMgdG8gREVGQVVMVF9NQVhfSVRFUkFUSU9OUyAoMTAwMCkuIFByb3BhZ2F0ZWQgdG8gc3ViZmxvd1xuICAgKiB0cmF2ZXJzZXJzLiBNdXN0IGJlID49IDEuXG4gICAqL1xuICBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuICAvKipcbiAgICogV2hlbiB0aGlzIHRyYXZlcnNlciBydW5zIGluc2lkZSBhIHN1YmZsb3csIHNldCB0aGlzIHRvIHRoZSBzdWJmbG93J3MgSUQuXG4gICAqIFByb3BhZ2F0ZWQgdG8gVHJhdmVyc2FsQ29udGV4dCBzbyBuYXJyYXRpdmUgZW50cmllcyBjYXJyeSB0aGUgY29ycmVjdCBzdWJmbG93SWQuXG4gICAqL1xuICBwYXJlbnRTdWJmbG93SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGVuIHRoaXMgdHJhdmVyc2VyIHJ1bnMgaW5zaWRlIGEgc3ViZmxvdywgdGhlIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZVxuICAgKiBzdWJmbG93IE1PVU5UIHN0YWdlIGluIHRoZSBwYXJlbnQgdHJhdmVyc2VyLiBVc2VkIGFzIHRoZVxuICAgKiBgcGFyZW50UnVudGltZVN0YWdlSWRgIGZhbGxiYWNrIGZvciBzdGFnZXMgd2hvc2UgU3RhZ2VDb250ZXh0IGhhcyBub1xuICAgKiBwYXJlbnQgKHRoZSBzdWJmbG93J3Mgb3duIHJvb3QgY29udGV4dCBpcyBjcmVhdGVkIGZyZXNoIGJ5XG4gICAqIFN1YmZsb3dFeGVjdXRvcikgc28gcnVudGltZSBhbmNlc3RvciBjaGFpbnMgY3Jvc3Mgc3ViZmxvdyBib3VuZGFyaWVzXG4gICAqIChSRkMtMDAzIEQxKS5cbiAgICovXG4gIHBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ/OiBzdHJpbmc7XG4gIC8qKiBAaW50ZXJuYWwgQWN0dWFsIHJ1bnRpbWUgbW91bnQgYW5jZXN0cnkgZm9yIHRoZSBvd25pbmcgbG9nLCBub3Qgc3RhdGljIHN1YmZsb3dQYXRoLiAqL1xuICBlbWl0RHJpbGxQYXRoPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBTaGFyZWQgZXhlY3V0aW9uIGNvdW50ZXIgZnJvbSBwYXJlbnQgdHJhdmVyc2VyLiBTdWJmbG93cyBjb250aW51ZSB0aGUgcGFyZW50J3MgbnVtYmVyaW5nLiAqL1xuICBleGVjdXRpb25Db3VudGVyPzogeyB2YWx1ZTogbnVtYmVyIH07XG4gIC8qKlxuICAgKiBTaGFyZWQgcGVyLXJ1biB2aXNpdC1jb3VudCBtYXAgKGtleWVkIGJ5IHN0YWdlSWQpIGZyb20gdGhlIHBhcmVudCB0cmF2ZXJzZXIuXG4gICAqIERyaXZlcyBgVHJhdmVyc2FsQ29udGV4dC5sb29wSXRlcmF0aW9uYC4gU2hhcmVkIHdpdGggc3ViZmxvd3Mgc28gYSBzdGFnZVxuICAgKiByZS1lbnRlcmVkIGFjcm9zcyBhIHN1YmZsb3cgcmUtbW91bnQga2VlcHMgYSBjb3JyZWN0LCBtb25vdG9uaWMgaXRlcmF0aW9uXG4gICAqIGNvdW50IOKAlCB0aGUgc2FtZSBzaW5nbGUtbWFwIHNlbWFudGljcyB0aGUgbmFycmF0aXZlIHJlY29yZGVyIHVzZXMuXG4gICAqL1xuICB2aXNpdENvdW50cz86IE1hcDxzdHJpbmcsIG51bWJlcj47XG4gIC8qKlxuICAgKiBUaGUgcmVzdW1lJ3Mgb25lLXNob3QgcmUtZW50cnkgKE0yKSwgc2hhcmVkIGJ5IHJlZmVyZW5jZSB3aXRoIGV2ZXJ5XG4gICAqIG5lc3RlZCB0cmF2ZXJzZXIgKHRoZSBleGVjdXRpb24gY291bnRlcidzIHByZWNlZGVudCk6IGVhY2ggc3ViZmxvdyBvbiB0aGVcbiAgICogcGF1c2UgcGF0aCB0YWtlcyBpdHMgY2FwdHVyZWQgc3RhdGUgYW5kIGl0cyBlbnRyeSBwb2ludCBleGFjdGx5IG9uY2UsIG9uXG4gICAqIGl0cyBmaXJzdCBlbnRyeS4gU2VlIGBSZXN1bWVFbnRyeWAuIFVuZGVmaW5lZCBvbiBub3JtYWwgYHJ1bigpYCBwYXRocy5cbiAgICovXG4gIHJlc3VtZT86IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBQZXItYGV4ZWN1dG9yLnJ1bigpYCBpZGVudGlmaWVyLiBUaHJlYWRlZCBpbnRvIGV2ZXJ5IFRyYXZlcnNhbENvbnRleHRcbiAgICogdGhpcyB0cmF2ZXJzZXIgcHJvZHVjZXMgc28gcmVjb3JkZXJzIGNhbiBzY29wZSBzdGF0ZSB0byBhIHNpbmdsZSBydW4uXG4gICAqIFN1YmZsb3cgdHJhdmVyc2VycyBpbmhlcml0IHRoZSBwYXJlbnQncyBydW5JZCAodGhlIHN1YmZsb3cgaXMgcGFydCBvZlxuICAgKiB0aGUgc2FtZSBydW4gZnJvbSB0aGUgY29uc3VtZXIncyBQT1YpLiBSZXF1aXJlZCBmaWVsZCDigJQgZXZlcnkgZXZlbnRcbiAgICogbmVlZHMgaXQuIFNlZSBgcnVubmVyL3J1bklkLnRzYC5cbiAgICovXG4gIHJ1bklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbGVnJ3MgY29ycmVsYXRpb24gKDEwLjEsIGBhdHRlbXB0L2NvcnJlbGF0aW9uLnRzIMK3IHJlc29sdmVDb3JyZWxhdGlvbmApIOKAlCBzdGFtcGVkIG9udG8gZXZlcnlcbiAgICogVHJhdmVyc2FsQ29udGV4dCBhbmQgdGhlIHNuYXBzaG90LCBpbmhlcml0ZWQgYnkgc3ViZmxvdyB0cmF2ZXJzZXJzIEJZIFJFRkVSRU5DRS4gQWJzZW50IHdoZW4gdGhlIGVudiBnYXZlIG5vbmUuXG4gICAqL1xuICBjb3JyZWxhdGlvbj86IFJ1bkNvcnJlbGF0aW9uO1xufVxuXG4vKipcbiAqIFRyYXZlcnNlci1sb2NhbCBvdmVybGF5IGVudHJ5IGZvciBhIG5vZGUgd2hvc2Ugc3RhZ2UgZnVuY3Rpb24gcmV0dXJuZWQgYVxuICogU3RhZ2VOb2RlIChkeW5hbWljIGNvbnRpbnVhdGlvbikuIEhvbGRzIHRoZSBkeW5hbWljIHZhbHVlcyB0aGF0IGVhcmxpZXJcbiAqIHZlcnNpb25zIHdyb3RlIERJUkVDVExZIG9udG8gdGhlIHNoYXJlZCBidWlsdC1jaGFydCBub2RlIOKAlCB3aGljaCBsZWFrZWQgdGhlXG4gKiBkeW5hbWljIHNoYXBlIGludG8gZXZlcnkgbGF0ZXIgcnVuIG9mIHRoZSBzYW1lIGJ1aWx0IGNoYXJ0IGFuZCByYWNlZFxuICogY29uY3VycmVudCBleGVjdXRvcnMuIFRoZSBvdmVybGF5IGtlZXBzIHRoZSBidWlsdCBncmFwaCBpbW11dGFibGU6IHBhdGNoZXNcbiAqIGxpdmUgaW4gYSBwZXItdHJhdmVyc2VyIE1hcCBrZXllZCBieSBgbm9kZS5pZGAgYW5kIGRpZSB3aXRoIHRoZSBydW4uXG4gKlxuICogYG5leHRgIGlzIGludGVudGlvbmFsbHkgQUJTRU5UOiBhIGR5bmFtaWMgYG5leHRgIG9ubHkgZXZlciBhcHBsaWVzIHRvIHRoZVxuICogdmlzaXQgdGhhdCBwcm9kdWNlZCBpdCAodGhlIG9sZCBjb2RlIHdyb3RlIGBub2RlLm5leHRgIGFuZCByZXN0b3JlZCBpdFxuICogYmVmb3JlIGFueXRoaW5nIGNvdWxkIG9ic2VydmUgdGhlIHdyaXRlKSwgc28gaXQgc3RheXMgYSBsb2NhbCB2YXJpYWJsZSBpblxuICogYGV4ZWN1dGVOb2RlYCBhbmQgaXMgcm91dGVkIHRocm91Z2ggYENvbnRpbnVhdGlvblJlc29sdmVyYCBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljTm9kZVBhdGNoPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogU3ViZmxvdyBtb3VudCBtZXRhZGF0YSBmcm9tIGEgZHluYW1pYy1zdWJmbG93IHJldHVybi4gR3JvdXBlZCBzbyB0aGVcbiAgICogbWVyZ2VkIHZpZXcgcmVwcm9kdWNlcyB0aGUgb2xkIGZpZWxkLXdpc2Ugb3ZlcndyaXRlIGV4YWN0bHkg4oCUIGluY2x1ZGluZ1xuICAgKiBgc3ViZmxvd05hbWVgL2BzdWJmbG93TW91bnRPcHRpb25zYCBiZWNvbWluZyB1bmRlZmluZWQgd2hlbiB0aGUgZHluYW1pY1xuICAgKiByZXR1cm4gb21pdHRlZCB0aGVtLlxuICAgKi9cbiAgc3ViZmxvd01ldGE/OiB7XG4gICAgaXNTdWJmbG93Um9vdDogdHJ1ZTtcbiAgICBzdWJmbG93SWQ6IHN0cmluZztcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIH07XG4gIC8qKiBEeW5hbWljIGZvcmsgY2hpbGRyZW4gKHJlcGxhY2VzIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4gZm9yIHRoaXMgcnVuKS4gKi9cbiAgY2hpbGRyZW4/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAvKiogRHluYW1pYyBvdXRwdXQtYmFzZWQgc2VsZWN0b3IgYWNjb21wYW55aW5nIGR5bmFtaWMgY2hpbGRyZW4uICovXG4gIG5leHROb2RlU2VsZWN0b3I/OiBTZWxlY3Rvcjtcbn1cblxuLyoqXG4gKiBUcmFtcG9saW5lIGJyYW5kIOKAlCBtYXJrcyBhIGNvbnRpbnVhdGlvbiBob3AgcmV0dXJuZWQgYnkgYGV4ZWN1dGVOb2RlU3RlcGBcbiAqIHRvIHRoZSBkcml2ZXIgbG9vcCBpbiBgZXhlY3V0ZU5vZGVgLiBNb2R1bGUtcHJpdmF0ZSBzeW1ib2wgc28gYSBzdGFnZSdzIG93blxuICogcmV0dXJuIHZhbHVlICh3aGljaCBjYW4gYmUgYW55IG9iamVjdCkgY2FuIG5ldmVyIGJlIG1pc3Rha2VuIGZvciBhIGhvcC5cbiAqL1xuY29uc3QgQ09OVElOVUVfSE9QOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdmb290cHJpbnRqcy5leGVjdXRlTm9kZS5jb250aW51ZScpO1xuXG4vKiogVGhlIHBvbGljeSBvZiBhIHN0YWdlIHRoYXQgZGVjbGFyZWQgbm9uZSBidXQgcnVucyBvbiB0aGUgYXR0ZW1wdCBydW5uZXIgYW55d2F5IChhIHJ1biBkZWFkbGluZSk6IG9uZSBhdHRlbXB0LiAqL1xuY29uc3QgU0lOR0xFX0FUVEVNUFQ6IFJldHJ5UG9saWN5ID0gT2JqZWN0LmZyZWV6ZSh7IGF0dGVtcHRzOiAxIH0pO1xuXG4vKipcbiAqIEEgZmxhdCBjb250aW51YXRpb24g4oCUIFwiZXhlY3V0ZSB0aGlzIG5vZGUgbmV4dCwgaW4gdGhpcyBjb250ZXh0XCIg4oCUIHJldHVybmVkXG4gKiBieSBgZXhlY3V0ZU5vZGVTdGVwYCBmb3IgZXZlcnkgVEFJTCBjb250aW51YXRpb24gKGxpbmVhciBgbmV4dGAsIGxvb3BcbiAqIGVkZ2VzLCBkeW5hbWljIG5leHQsIGR5bmFtaWMtc3ViZmxvdyByZS1lbnRyeSwgbm8tY29udGludWF0aW9uIGRlY2lkZXJcbiAqIGRpc3BhdGNoKS4gVGhlIGRyaXZlciBsb29wIGluIGBleGVjdXRlTm9kZWAgY29uc3VtZXMgaG9wcyBpdGVyYXRpdmVseTpcbiAqIGBjdXJyZW50ID0gaG9wOyBjb250aW51ZTtgIOKAlCBzbyBuZWl0aGVyIHRoZSBjYWxsIHN0YWNrIG5vciB0aGUgcmV0YWluZWRcbiAqIHByb21pc2UgY2hhaW4gZ3Jvd3Mgd2l0aCBjaGFpbiBsZW5ndGggb3IgbG9vcCBpdGVyYXRpb25zLlxuICovXG5pbnRlcmZhY2UgQ29udGludWF0aW9uSG9wPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICByZWFkb25seSBbQ09OVElOVUVfSE9QXTogdHJ1ZTtcbiAgcmVhZG9ubHkgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHJlYWRvbmx5IGNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcmVhZG9ubHkgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogUHJlc2VudCB3aGVuIHRoZSBob3AgaXMgYSBkZWNpZGVyJ3MgYnJhbmNoIGRpc3BhdGNoIChkZWNpZGVyIHdpdGhvdXQgaXRzXG4gICAqIG93biBgbmV4dGApLiBUaGUgZHJpdmVyIHJlY29yZHMgaXQgc28gYSBQYXVzZVNpZ25hbCB0aHJvd24gYW55d2hlcmUgaW5cbiAgICogdGhlIGNvbnRpbnVlZCBjaGFpbiBzdGlsbCBnZXRzIHRoZSBkZWNpZGVyIHN0YW1wZWQgYXMgaXRzIGludm9rZXIg4oCUXG4gICAqIGV4YWN0bHkgd2hhdCB0aGUgcmVjdXJzaXZlIGRpc3BhdGNoJ3MgY2F0Y2ggdXNlZCB0byBkby5cbiAgICovXG4gIHJlYWRvbmx5IGludm9rZXJTdGFtcD86IEludm9rZXJTdGFtcDtcbiAgLyoqXG4gICAqIFByZXNlbnQgd2hlbiB0aGUgaG9wIGZvbGxvd3MgYSBMT09QIGVkZ2UgKGEgYmFjay1yZWZlcmVuY2UgcmVzb2x2ZWQgYnlcbiAgICogYENvbnRpbnVhdGlvblJlc29sdmVyYCkuIEEgZGVjaWRlcidzIGJyYW5jaCBmcmFtZSBoYW5kcyBzdWNoIGEgaG9wIGJhY2tcbiAgICogdG8gaXRzIGRlY2lkZXIgd2hlbiB0aGUgdGFyZ2V0IGlzIG5vdCBhIG5vZGUgdGhlIGZyYW1lIHJhbiwgc28gdGhlIGxvb3BcbiAgICogcmUtZW50ZXJzIGF0IHRoZSB0YXJnZXQncyBvd24gbGV2ZWwg4oCUIGZsYXQsIG5ldmVyIG9uZSBmcmFtZSBwZXIgcGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IGxvb3A/OiB0cnVlO1xufVxuXG4vKipcbiAqIFdoYXQgYSBkcml2ZXIgcmVjb3JkcyBmb3IgZWFjaCBzdGFnZSBjb250ZXh0IGl0IHJ1bnM6IGl0cyBORVNUSU5HIGRlcHRoXG4gKiAoc2VlIGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgbmVzdGluZ0RlcHRoT2ZgKSBhbmQgdGhlIG5vZGUgaWRzIGVhY2ggZHJpdmVyXG4gKiBvbiBpdHMgQlJBTkNILUZSQU1FIGNoYWluIGhhcyBydW4g4oCUIGl0cyBvd24gbGFzdC4gQSBkZWNpZGVyIHdpdGggaXRzIG93blxuICogYG5leHRgIGhhbmRzIHRoYXQgY2hhaW4gdG8gaXRzIGJyYW5jaCBmcmFtZSwgc28gdGhlIGZyYW1lIGNhbiB0ZWxsIGEgbG9vcFxuICogYmFjayBpbnRvIGFuIGVuY2xvc2luZyBkcml2ZXIgKGxlYXZlKSBmcm9tIGFueSBvdGhlciBqdW1wIChzdGF5KS5cbiAqL1xuaW50ZXJmYWNlIERyaXZlckZyYW1lIHtcbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgcmFuOiByZWFkb25seSBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+W107XG4gIC8qKiBUaGUgYG5leHRgLWNoYWluIGlkcyBvZiBldmVyeSBkZWNpZGVyIHdob3NlIGJyYW5jaCBmcmFtZSBlbmNsb3NlcyB0aGlzIGRyaXZlci4gKi9cbiAgcmVhZG9ubHkgdGFpbHM6IHJlYWRvbmx5IFJlYWRvbmx5U2V0PHN0cmluZyB8IHVuZGVmaW5lZD5bXTtcbn1cblxuLyoqIFdoYXQgYSBicmFuY2ggZnJhbWUgaW5oZXJpdHM6IHRoZSBlbmNsb3NpbmcgcmFuLXNldHMsIGFuZCB0aGUgdGFpbHMgaXQgbWF5IGp1bXAgdG8uICovXG50eXBlIEVuY2xvc2luZ0ZyYW1lcyA9IFBpY2s8RHJpdmVyRnJhbWUsICdyYW4nIHwgJ3RhaWxzJz47XG5cbi8qKiBQYXVzZS1pbnZva2VyIGNvbnRleHQgcmVjb3JkZWQgYnkgdGhlIGRyaXZlciBmb3IgZmxhdCBkZWNpZGVyIGRpc3BhdGNoZXMuICovXG5pbnRlcmZhY2UgSW52b2tlclN0YW1wIHtcbiAgcmVhZG9ubHkgaW52b2tlclN0YWdlSWQ6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgKHZhbHVlIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtDT05USU5VRV9IT1BdID09PSB0cnVlO1xufVxuXG5leHBvcnQgY2xhc3MgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKiogV2hlcmUgdGhlIG5leHQgYGV4ZWN1dGUoKWAgc3RhcnRzIHdoZW4gbm90IGF0IGByb290YCDigJQgb25lLXNob3QgKHNlZSBUcmF2ZXJzZXJPcHRpb25zLmVudHJ5KS4gKi9cbiAgcHJpdmF0ZSBlbnRyeTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gIC8qKiBTaWJsaW5ncycgcGF1c2VzIHJhaXNlZCBvbmNlIGBlbnRyeWAncyBjaGFpbiBlbmRzIOKAlCBvbmUtc2hvdCAoc2VlIFRyYXZlcnNlck9wdGlvbnMucGVuZGluZ1BhdXNlcykuICovXG4gIHByaXZhdGUgZW50cnlQZW5kaW5nUGF1c2VzOiByZWFkb25seSBRdWV1ZWRQYXVzZVtdIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5LCBzaGFyZWQgd2l0aCBuZXN0ZWQgdHJhdmVyc2Vycy4gVW5kZWZpbmVkIG9uIGEgbm9ybWFsIHJ1bi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXN1bWU6IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0aW9uUnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWU7XG4gIHByaXZhdGUgc3ViZmxvd3M6IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT47XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBJTG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogVGhlIHJ1bidzIGRlYWRsaW5lLCBlcG9jaCBtcyAoYGVudi5kZWFkbGluZWAsIHN0YW1wZWQgYnkgdGhlIGV4ZWN1dG9yJ3MgYGFybVJ1bmA7IGEgc3ViZmxvdyBpbmhlcml0cyB0aGUgZW52KS5cbiAgICogVW5kZXIgb25lLCBFVkVSWSBzdGFnZSBydW5zIG9uIHRoZSBhdHRlbXB0IHJ1bm5lciwgc28gYSBsb25lIHN0YWdlIHRoZSBkZWFkbGluZSBjdXRzIHN0aWxsIGxlYXZlcyBpdHMgYXR0ZW1wdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVhZGxpbmU/OiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKiogUkZDLTAwMyBEMTogcnVudGltZVN0YWdlSWQgb2YgdGhlIHN1YmZsb3cgbW91bnQgc3RhZ2UgaW4gdGhlIHBhcmVudFxuICAgKiAgdHJhdmVyc2VyLiBGYWxsYmFjayBgcGFyZW50UnVudGltZVN0YWdlSWRgIGZvciBzdGFnZXMgd2hvc2UgY29udGV4dCBoYXNcbiAgICogIG5vIHBhcmVudCAodGhlIHN1YmZsb3cgcm9vdCkuIFVuZGVmaW5lZCBhdCB0aGUgdG9wIGxldmVsLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW1pdERyaWxsUGF0aDogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gIC8qKiBWYWxpZGF0ZWQgdmFsdWUgcGFzc2VkIHZpYSBgcnVuKHtpbnB1dH0pYC4gUm9vdCBib3VuZGFyeSBvYnNlcnZlcnNcbiAgICogIHJlY2VpdmUgaXRzIHJldGFpbmVkIGZvcm07IHN0YWdlIGFyZ3VtZW50cyBrZWVwIHRoZSBvcmlnaW5hbCBkYXRhLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gIC8qKiBUaGUgaGFuZGxlcnMnIHNoYXJlZCBkZXBzIOKAlCBpdHMgYHJlYWRPbmx5Q29udGV4dGAgaXMgdGhlIGxlZydzIGlucHV0IHNuYXBzaG90LCBzZXQgYnkgYGV4ZWN1dGVgLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT47XG4gIC8qKiBQZXItYGV4ZWN1dG9yLnJ1bigpYCBpZGVudGlmaWVyLiBTdGFtcGVkIG9udG8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dC5cbiAgICogIEluaGVyaXRlZCBieSBzdWJmbG93IHRyYXZlcnNlcnMgc28gYWxsIGV2ZW50cyBvZiBvbmUgcnVuIHNoYXJlIG9uZSBydW5JZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICAvKiogVGhlIGxlZydzIGNvcnJlbGF0aW9uIOKAlCBvbmUgZnJvemVuIG9iamVjdCwgc3RhbXBlZCBvbiBldmVyeSBUcmF2ZXJzYWxDb250ZXh0OyBpbmhlcml0ZWQgYnkgc3ViZmxvd3MuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29ycmVsYXRpb24/OiBSdW5Db3JyZWxhdGlvbjtcblxuICAvLyBIYW5kbGVyIG1vZHVsZXNcbiAgcHJpdmF0ZSByZWFkb25seSBub2RlUmVzb2x2ZXI6IE5vZGVSZXNvbHZlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGNoaWxkcmVuRXhlY3V0b3I6IENoaWxkcmVuRXhlY3V0b3I8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJmbG93RXhlY3V0b3I6IFN1YmZsb3dFeGVjdXRvcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWdlUnVubmVyOiBTdGFnZVJ1bm5lcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRpbnVhdGlvblJlc29sdmVyOiBDb250aW51YXRpb25SZXNvbHZlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGRlY2lkZXJIYW5kbGVyOiBEZWNpZGVySGFuZGxlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdG9ySGFuZGxlcjogU2VsZWN0b3JIYW5kbGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyYWxsZWxGb3JFYWNoSGFuZGxlcjogUGFyYWxsZWxGb3JFYWNoSGFuZGxlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN0cnVjdHVyZU1hbmFnZXI6IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IG5hcnJhdGl2ZUdlbmVyYXRvcjogSUNvbnRyb2xGbG93TmFycmF0aXZlO1xuICBwcml2YXRlIHJlYWRvbmx5IGZsb3dSZWNvcmRlckRpc3BhdGNoZXI6IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfCB1bmRlZmluZWQ7XG5cbiAgLy8gRXhlY3V0aW9uIHN0YXRlXG4gIHByaXZhdGUgc3ViZmxvd1Jlc3VsdHM6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBQZXItdHJhdmVyc2VyIHNldCBvZiBsYXp5IHN1YmZsb3cgSURzIHRoYXQgaGF2ZSBiZWVuIHJlc29sdmVkIGJ5IFRISVMgcnVuLlxuICAgKiBVc2VkIGluc3RlYWQgb2Ygd3JpdGluZyBgbm9kZS5zdWJmbG93UmVzb2x2ZXIgPSB1bmRlZmluZWRgIGJhY2sgdG8gdGhlIHNoYXJlZFxuICAgKiBTdGFnZU5vZGUgZ3JhcGgg4oCUIGF2b2lkcyBhIHJhY2Ugd2hlcmUgYSBjb25jdXJyZW50IHRyYXZlcnNlciBjbGVhcnMgdGhlIHNoYXJlZFxuICAgKiByZXNvbHZlciBiZWZvcmUgYW5vdGhlciB0cmF2ZXJzZXIgaGFzIGZpbmlzaGVkIHVzaW5nIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlZExhenlTdWJmbG93cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBQZXItdHJhdmVyc2VyIG92ZXJsYXkgb2YgZHluYW1pYyBTdGFnZU5vZGUgcmV0dXJucywga2V5ZWQgYnkgYG5vZGUuaWRgLlxuICAgKiBQaGFzZSA0IHdyaXRlcyBwYXRjaGVzIEhFUkUgaW5zdGVhZCBvZiBtdXRhdGluZyB0aGUgc2hhcmVkIGJ1aWx0LWNoYXJ0XG4gICAqIG5vZGUgb2JqZWN0cyAoc2FtZSBpc29sYXRpb24gY29udmVudGlvbiBhcyBgcmVzb2x2ZWRMYXp5U3ViZmxvd3NgKS5cbiAgICogQWxsIGVuZ2luZSByZWFkcyBvZiB0aGUgcGF0Y2hlZCBmaWVsZHMgZ28gdGhyb3VnaCB0aGUgYGVmZipgIGFjY2Vzc29yc1xuICAgKiBiZWxvdy4gVGhlIG1hcCBkaWVzIHdpdGggdGhlIHRyYXZlcnNlciDigJQgb25lIHJ1biwgb25lIG92ZXJsYXkg4oCUIHNvIGFcbiAgICogZnJlc2ggZXhlY3V0b3Igb3ZlciB0aGUgc2FtZSBidWlsdCBjaGFydCBhbHdheXMgc2VlcyB0aGUgb3JpZ2luYWwgZ3JhcGguXG4gICAqXG4gICAqIEtleWVkIGJ5IHRoZSBub2RlIE9CSkVDVCAoV2Vha01hcCksIG5vdCBgbm9kZS5pZGA6IGEgZHluYW1pYyBjaGlsZCB0aGF0XG4gICAqIHJldXNlcyBhIGJ1aWx0IG5vZGUncyBpZCBtdXN0IE5PVCBtYWtlIHRoZSBidWlsdCBub2RlIGluaGVyaXQgdGhlIHBhdGNoXG4gICAqIChpZC1rZXllZCBsb29rdXAgY2F1c2VkIHBoYW50b20gZG91YmxlLWV4ZWN1dGlvbikuIGBwYXRjaENvdW50YCBpcyB0aGVcbiAgICogZmFzdC1wYXRoIGNoZWNrIOKAlCBXZWFrTWFwIGhhcyBubyBgc2l6ZWAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGR5bmFtaWNQYXRjaGVzID0gbmV3IFdlYWtNYXA8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIER5bmFtaWNOb2RlUGF0Y2g8VE91dCwgVFNjb3BlPj4oKTtcbiAgcHJpdmF0ZSBwYXRjaENvdW50ID0gMDtcblxuICAvKipcbiAgICogVGhlIGZyYW1lIChORVNUSU5HIGRlcHRoICsgYnJhbmNoLWZyYW1lIHJhbi1zZXRzKSBvZiB0aGUgZHJpdmVyIHRoYXQgcmFuIGVhY2ggc3RhZ2UgY29udGV4dCDigJQgZGVwdGggaXMgYVxuICAgKiBwcm9wZXJ0eSBvZiB0aGUgY2FsbCBQQVRILCBzbyBpdCB0cmF2ZWxzIHdpdGggdGhlIGNvbnRleHRzLCBub3QgaW4gb25lXG4gICAqIHBlci10cmF2ZXJzZXIgY291bnRlci4gQSBuZXN0ZWQgZHJpdmVyIChmb3JrL3NlbGVjdG9yIGNoaWxkLCBhIGRlY2lkZXInc1xuICAgKiBicmFuY2ggZnJhbWUpIHNpdHMgb25lIGxldmVsIGJlbG93IHRoZSBkcml2ZXIgdGhhdCByYW4gdGhlIGNvbnRleHQgaXRzXG4gICAqIG93biBjb250ZXh0IHdhcyBjcmVhdGVkIGZyb20gKGBTdGFnZUNvbnRleHQucGFyZW50YCkg4oCUIHNvIHBhcmFsbGVsXG4gICAqIHNpYmxpbmdzIHNoYXJlIG9uZSBkZXB0aCwgYW5kIDUyMCBjaGlsZHJlbiBvZiBvbmUgZm9yayBhcmUgNTIwIGRyaXZlcnNcbiAgICogYXQgdGhlIHNhbWUgbGV2ZWwgKHRocm91Z2ggOS4zOS4wIGEgc2hhcmVkIGNvdW50ZXIgbWFkZSB0aGVtIDUyMCBsZXZlbHMpLlxuICAgKlxuICAgKiBMaW5lYXIgYG5leHRgIGNoYWlucywgbG9vcCBlZGdlcywgYW5kIGR5bmFtaWMgY29udGludWF0aW9ucyBhcmUgZm9sbG93ZWRcbiAgICogSVRFUkFUSVZFTFkgaW5zaWRlIG9uZSBkcml2ZXIgaW52b2NhdGlvbiwgc28gdGhleSBuZXZlciBhZGQgYSBsZXZlbC5cbiAgICogT25seSB0cnVlIHRyZWUgcmVjdXJzaW9uIGRvZXM6IGZvcmsgY2hpbGRyZW4sIGRlY2lkZXIvc2VsZWN0b3IgYnJhbmNoXG4gICAqIGRpc3BhdGNoICh3aGVuIHRoZSBkZWNpZGVyIGhhcyBpdHMgb3duIGNvbnRpbnVhdGlvbiksIGFuZCB1bmJvdW5kZWRcbiAgICogZHluYW1pYyByZWN1cnNpb24uIFByZXZlbnRzIGNhbGwtc3RhY2sgb3ZlcmZsb3cgb24gcnVuYXdheSByZWN1cnNpdmVcbiAgICogY29tcG9zaXRpb24uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9mcmFtZU9mID0gbmV3IFdlYWtNYXA8U3RhZ2VDb250ZXh0LCBEcml2ZXJGcmFtZT4oKTtcblxuICAvKiogYG5leHRgLWNoYWluIGlkcyBwZXIgZGVjaWRlciBjb250aW51YXRpb24gaGVhZCAoYHRhaWxJZHNgKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdGFpbElkcyA9IG5ldyBXZWFrTWFwPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+PigpO1xuXG4gIC8qKlxuICAgKiBTaGFyZWQgbXV0YWJsZSBleGVjdXRpb24gY291bnRlciDigJQgbW9ub3RvbmljLCBpbmNyZW1lbnRlZCBwZXIgc3RhZ2UgZXhlY3V0aW9uLlxuICAgKiBTaGFyZWQgd2l0aCBjaGlsZCB0cmF2ZXJzZXJzIChzdWJmbG93cykgc28gaW5kaWNlcyBhcmUgZ2xvYmFsbHkgdW5pcXVlIHdpdGhpbiBhIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2V4ZWN1dGlvbkNvdW50ZXI6IHsgdmFsdWU6IG51bWJlciB9O1xuXG4gIC8qKlxuICAgKiBTaGFyZWQgcGVyLXJ1biB2aXNpdCBjb3VudHMga2V5ZWQgYnkgc3RhZ2VJZCDigJQgaG93IG1hbnkgdGltZXMgZWFjaCBzdGFnZVxuICAgKiBoYXMgZXhlY3V0ZWQgaW4gdGhpcyBydW4uIFNoYXJlZCB3aXRoIGNoaWxkIHRyYXZlcnNlcnMgKHN1YmZsb3dzKSBzbyBhXG4gICAqIGxvb3BlZC1iYWNrIHN0YWdlJ3MgaXRlcmF0aW9uIGNvdW50IGlzIG1vbm90b25pYyBhY3Jvc3Mgc3ViZmxvdyByZS1tb3VudHMsXG4gICAqIG1hdGNoaW5nIHRoZSBuYXJyYXRpdmUgcmVjb3JkZXIncyBzaW5nbGUtbWFwIHNlbWFudGljcy4gRHJpdmVzXG4gICAqIGBUcmF2ZXJzYWxDb250ZXh0Lmxvb3BJdGVyYXRpb25gLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdmlzaXRDb3VudHM6IE1hcDxzdHJpbmcsIG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFBlci1pbnN0YW5jZSBtYXhpbXVtIGRlcHRoIChzZXQgZnJvbSBUcmF2ZXJzZXJPcHRpb25zLm1heERlcHRoIG9yIHRoZSBjbGFzcyBkZWZhdWx0KS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX21heERlcHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFBlci1pbnN0YW5jZSBsb29wLWl0ZXJhdGlvbiBsaW1pdCBmb3J3YXJkZWQgdG8gdGhlIENvbnRpbnVhdGlvblJlc29sdmVyXG4gICAqIGFuZCBwcm9wYWdhdGVkIHRvIHN1YmZsb3cgdHJhdmVyc2Vycy4gVW5kZWZpbmVkIOKGkiByZXNvbHZlciBkZWZhdWx0ICgxMDAwKS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX21heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgbWF4aW11bSBuZXN0ZWQgZXhlY3V0ZU5vZGUgZGVwdGggYmVmb3JlIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICpcbiAgICogKipXaGF0IGNvdW50cyBhcyBkZXB0aCAodHJhbXBvbGluZSBtb2RlbCk6KiogYGV4ZWN1dGVOb2RlYCBpcyBhbiBpdGVyYXRpdmVcbiAgICogZHJpdmVyIOKAlCBsaW5lYXIgYG5leHRgIGhvcHMsIGxvb3AgZWRnZXMgKGBsb29wVG9gL2R5bmFtaWMgbmV4dCksIGFuZFxuICAgKiBkeW5hbWljLXN1YmZsb3cgcmUtZW50cnkgYXJlIGZvbGxvd2VkIGluIGEgZmxhdCBsb29wIGFuZCBjb25zdW1lIE5PIGRlcHRoLlxuICAgKiBEZXB0aCBncm93cyBvbmx5IHdpdGggdHJ1ZSB0cmVlIG5lc3Rpbmc6IG9uZSB0aWNrIHBlciBmb3JrIGNoaWxkLCBvbmUgcGVyXG4gICAqIGRlY2lkZXIvc2VsZWN0b3IgYnJhbmNoIGRpc3BhdGNoIHRoYXQgbXVzdCByZXR1cm4gdG8gaXRzIGludm9rZXIgKGRlY2lkZXJcbiAgICogd2l0aCBpdHMgb3duIGBuZXh0YCksIG9uZSBwZXIgc3ViZmxvdyBtb3VudCBmcmFtZSBpbiB0aGUgcGFyZW50ICh0aGVcbiAgICogc3ViZmxvdyBib2R5IGl0c2VsZiBydW5zIG9uIGEgRlJFU0ggdHJhdmVyc2VyIHdpdGggaXRzIG93biBidWRnZXQpLlxuICAgKlxuICAgKiA1MDAgdGhlcmVmb3JlIGNvdmVycyBhbnkgcmVhbGlzdGljIGNoYXJ0IOKAlCBpdCBib3VuZHMgcmVjdXJzaXZlXG4gICAqIENPTVBPU0lUSU9OLCBub3QgY2hhaW4gbGVuZ3RoIG9yIGxvb3AgY291bnQuIExvb3BzIGFyZSBib3VuZGVkIGJ5XG4gICAqIGBDb250aW51YXRpb25SZXNvbHZlcmAncyBpbmRlcGVuZGVudCBpdGVyYXRpb24gbGltaXQgKGRlZmF1bHQgMTAwMCxcbiAgICogY29uZmlndXJhYmxlIHZpYSBgUnVuT3B0aW9ucy5tYXhJdGVyYXRpb25zYCksIHdoaWNoIGlzIG5vdyB0aGUgYmluZGluZ1xuICAgKiBjb25zdHJhaW50IGZvciBsb29wLWhlYXZ5IHBpcGVsaW5lcy5cbiAgICpcbiAgICogUGFyYWxsZWwgc2libGluZ3Mgc2hhcmUgdGhlaXIgcGFyZW50J3MgZGVwdGggKyAxIOKAlCBhIGZvcmsgb3Igc2VsZWN0b3Igb2YgYW55IHdpZHRoIGlzXG4gICAqIG9uZSBsZXZlbCwgbmV2ZXIgb25lIGxldmVsIHBlciBjaGlsZC5cbiAgICpcbiAgICogQHJlbWFya3MgTm90IHNhZmUgZm9yIGNvbmN1cnJlbnQgYC5leGVjdXRlKClgIGNhbGxzIG9uIHRoZSBzYW1lIGluc3RhbmNlICh0aGUgYnJlYWsgZmxhZ1xuICAgKiBhbmQgdGhlIHJlc29sdmVyJ3MgbG9vcCBjb3VudHMgYXJlIHBlciBpbnN0YW5jZSkuIFVzZSBhIHNlcGFyYXRlIGBGbG93Y2hhcnRUcmF2ZXJzZXJgIHBlclxuICAgKiBjb25jdXJyZW50IGV4ZWN1dGlvbi4gYEZsb3dDaGFydEV4ZWN1dG9yLnJ1bigpYCBhbHdheXMgY3JlYXRlcyBhIGZyZXNoIHRyYXZlcnNlciBwZXIgY2FsbC5cbiAgICovXG4gIHN0YXRpYyByZWFkb25seSBNQVhfRVhFQ1VURV9ERVBUSCA9IDUwMDtcblxuICBjb25zdHJ1Y3RvcihvcHRzOiBUcmF2ZXJzZXJPcHRpb25zPFRPdXQsIFRTY29wZT4pIHtcbiAgICBjb25zdCBtYXhEZXB0aCA9IG9wdHMubWF4RGVwdGggPz8gRmxvd2NoYXJ0VHJhdmVyc2VyLk1BWF9FWEVDVVRFX0RFUFRIO1xuICAgIGlmIChtYXhEZXB0aCA8IDEpIHRocm93IG5ldyBFcnJvcignRmxvd2NoYXJ0VHJhdmVyc2VyOiBtYXhEZXB0aCBtdXN0IGJlID49IDEnKTtcbiAgICB0aGlzLl9tYXhEZXB0aCA9IG1heERlcHRoO1xuICAgIGlmIChvcHRzLm1heEl0ZXJhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBvcHRzLm1heEl0ZXJhdGlvbnMgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Zsb3djaGFydFRyYXZlcnNlcjogbWF4SXRlcmF0aW9ucyBtdXN0IGJlID49IDEnKTtcbiAgICB9XG4gICAgdGhpcy5fbWF4SXRlcmF0aW9ucyA9IG9wdHMubWF4SXRlcmF0aW9ucztcbiAgICB0aGlzLl9leGVjdXRpb25Db3VudGVyID0gb3B0cy5leGVjdXRpb25Db3VudGVyID8/IHsgdmFsdWU6IDAgfTtcbiAgICB0aGlzLl92aXNpdENvdW50cyA9IG9wdHMudmlzaXRDb3VudHMgPz8gbmV3IE1hcCgpO1xuICAgIHRoaXMucm9vdCA9IG9wdHMucm9vdDtcbiAgICB0aGlzLmVudHJ5ID0gb3B0cy5lbnRyeTtcbiAgICB0aGlzLmVudHJ5UGVuZGluZ1BhdXNlcyA9IG9wdHMuZW50cnkgPyBvcHRzLnBlbmRpbmdQYXVzZXMgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZXN1bWUgPSBvcHRzLnJlc3VtZTtcbiAgICAvLyBTaGFsbG93LWNvcHkgc3RhZ2VNYXAgYW5kIHN1YmZsb3dzIHNvIHRoYXQgbGF6eS1yZXNvbHV0aW9uIG11dGF0aW9uc1xuICAgIC8vIChwcmVmaXhlZCBlbnRyaWVzIGFkZGVkIGR1cmluZyBleGVjdXRpb24pIHN0YXkgc2NvcGVkIHRvIFRISVMgdHJhdmVyc2VyXG4gICAgLy8gYW5kIGRvIG5vdCBlc2NhcGUgdG8gdGhlIHNoYXJlZCBGbG93Q2hhcnQgb2JqZWN0LiBXaXRob3V0IHRoZSBjb3B5LFxuICAgIC8vIGNvbmN1cnJlbnQgRmxvd0NoYXJ0RXhlY3V0b3IgcnVucyBzaGFyaW5nIHRoZSBzYW1lIEZsb3dDaGFydCB3b3VsZCByYWNlXG4gICAgLy8gb24gdGhlc2UgdHdvIG11dGFibGUgZGljdGlvbmFyaWVzLlxuICAgIHRoaXMuc3RhZ2VNYXAgPSBuZXcgTWFwKG9wdHMuc3RhZ2VNYXApO1xuICAgIHRoaXMuZXhlY3V0aW9uUnVudGltZSA9IG9wdHMuZXhlY3V0aW9uUnVudGltZTtcbiAgICB0aGlzLnN1YmZsb3dzID0gb3B0cy5zdWJmbG93cyA/IHsgLi4ub3B0cy5zdWJmbG93cyB9IDoge307XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlcjtcbiAgICB0aGlzLnNpZ25hbCA9IG9wdHMuc2lnbmFsO1xuICAgIHRoaXMuZGVhZGxpbmUgPSByZWFkRGVhZGxpbmUob3B0cy5leGVjdXRpb25FbnY/LmRlYWRsaW5lKTtcbiAgICB0aGlzLnBhcmVudFN1YmZsb3dJZCA9IG9wdHMucGFyZW50U3ViZmxvd0lkO1xuICAgIHRoaXMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZCA9IG9wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDtcbiAgICAvLyBNaXNzaW5nIGFuY2VzdHJ5IGluIGEgaGFuZC1idWlsdCBuZXN0ZWQgdHJhdmVyc2VyIGlzIHVua25vd24sIG5ldmVyXG4gICAgLy8gZ3Vlc3NlZCBhcyByb290LiBUaGUgbm9ybWFsIHN1YmZsb3cgZmFjdG9yeSBzdXBwbGllcyB0aGUgZnVsbCBwYXRoLlxuICAgIGNvbnN0IGVtaXREcmlsbFBhdGggPVxuICAgICAgb3B0cy5lbWl0RHJpbGxQYXRoID8/IChvcHRzLnBhcmVudFN1YmZsb3dJZCB8fCBvcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWQgPyB1bmRlZmluZWQgOiBbXSk7XG4gICAgdGhpcy5lbWl0RHJpbGxQYXRoID0gZW1pdERyaWxsUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogT2JqZWN0LmZyZWV6ZShbLi4uZW1pdERyaWxsUGF0aF0pO1xuICAgIHRoaXMucmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgdGhpcy5ydW5JZCA9IG9wdHMucnVuSWQ7XG4gICAgdGhpcy5jb3JyZWxhdGlvbiA9IG9wdHMuY29ycmVsYXRpb247XG5cbiAgICAvLyBTdHJ1Y3R1cmUgbWFuYWdlciAoZGVlcC1jbG9uZXMgYnVpbGQtdGltZSBzdHJ1Y3R1cmUpXG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyID0gbmV3IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyKCk7XG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmluaXQob3B0cy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgLy8gTmFycmF0aXZlIGdlbmVyYXRvclxuICAgIC8vIFByaW9yaXR5OiBleHBsaWNpdCBuYXJyYXRpdmVHZW5lcmF0b3IgPiBmbG93UmVjb3JkZXJzID4gZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXIgPiBudWxsLlxuICAgIC8vIFN1YmZsb3cgdHJhdmVyc2VycyByZWNlaXZlIHRoZSBwYXJlbnQncyBuYXJyYXRpdmVHZW5lcmF0b3Igc28gYWxsIGV2ZW50cyBmbG93IHRvIG9uZSBwbGFjZS5cbiAgICBpZiAob3B0cy5uYXJyYXRpdmVHZW5lcmF0b3IpIHtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gb3B0cy5uYXJyYXRpdmVHZW5lcmF0b3I7XG4gICAgfSBlbHNlIGlmIChvcHRzLm5hcnJhdGl2ZUVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBuZXcgRmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpO1xuICAgICAgdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcblxuICAgICAgLy8gSWYgY3VzdG9tIEZsb3dSZWNvcmRlcnMgYXJlIHByb3ZpZGVkLCB1c2UgdGhlbTsgb3RoZXJ3aXNlIGF0dGFjaCBkZWZhdWx0IE5hcnJhdGl2ZUZsb3dSZWNvcmRlclxuICAgICAgaWYgKG9wdHMuZmxvd1JlY29yZGVycyAmJiBvcHRzLmZsb3dSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZGVyIG9mIG9wdHMuZmxvd1JlY29yZGVycykge1xuICAgICAgICAgIGRpc3BhdGNoZXIuYXR0YWNoKHJlY29yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGF0Y2hlci5hdHRhY2gobmV3IE5hcnJhdGl2ZUZsb3dSZWNvcmRlcigpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBkaXNwYXRjaGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IG5ldyBOdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBzaGFyZWQgZGVwcyBiYWdcbiAgICBjb25zdCBkZXBzID0gdGhpcy5jcmVhdGVEZXBzKG9wdHMpO1xuICAgIHRoaXMuZGVwcyA9IGRlcHM7XG5cbiAgICAvLyBCdWlsZCBPKDEpIG5vZGUgSUQgbWFwIGZyb20gdGhlIHJvb3QgZ3JhcGggKGF2b2lkcyByZXBlYXRlZCBERlMgb24gZXZlcnkgbG9vcFRvKCkpLlxuICAgIC8vIEZyb20gYHJvb3RgLCBuZXZlciBmcm9tIGBlbnRyeWA6IGEgcmVzdW1lJ3Mgc3RhbmQtaW4gY2FycmllcyB0aGUgcGF1c2VkXG4gICAgLy8gc3RhZ2UncyBpZCwgYW5kIGEgbG9vcCBiYWNrIHRvIHRoYXQgaWQgbXVzdCBmaW5kIHRoZSBSRUFMIHN0YWdlLlxuICAgIGNvbnN0IG5vZGVJZE1hcCA9IHRoaXMuYnVpbGROb2RlSWRNYXAob3B0cy5yb290KTtcblxuICAgIC8vIEluaXRpYWxpemUgaGFuZGxlciBtb2R1bGVzLlxuICAgIC8vIE5vZGVSZXNvbHZlcidzIERGUyBmYWxsYmFjayByZXNvbHZlcyBsb29wIHRhcmdldHMgYWdhaW5zdCB0aGUgTElWRVxuICAgIC8vIHJ1bnRpbWUgc2hhcGUsIHNvIGl0IHJlYWRzIGNoaWxkcmVuIHRocm91Z2ggdGhlIGR5bmFtaWMtcGF0Y2ggb3ZlcmxheVxuICAgIC8vIChhIGxvb3AgY2FuIHRhcmdldCBhIG5vZGUgYWRkZWQgYnkgYSBkeW5hbWljIFN0YWdlTm9kZSByZXR1cm4pLlxuICAgIHRoaXMubm9kZVJlc29sdmVyID0gbmV3IE5vZGVSZXNvbHZlcihkZXBzLCBub2RlSWRNYXAsIChuKSA9PiB0aGlzLmVmZkNoaWxkcmVuKG4pKTtcbiAgICB0aGlzLmNoaWxkcmVuRXhlY3V0b3IgPSBuZXcgQ2hpbGRyZW5FeGVjdXRvcihkZXBzLCB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuc3RhZ2VSdW5uZXIgPSBuZXcgU3RhZ2VSdW5uZXIoZGVwcyk7XG4gICAgdGhpcy5jb250aW51YXRpb25SZXNvbHZlciA9IG5ldyBDb250aW51YXRpb25SZXNvbHZlcihcbiAgICAgIGRlcHMsXG4gICAgICB0aGlzLm5vZGVSZXNvbHZlcixcbiAgICAgIChub2RlSWQsIGNvdW50KSA9PiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlSXRlcmF0aW9uQ291bnQobm9kZUlkLCBjb3VudCksXG4gICAgICB0aGlzLl9tYXhJdGVyYXRpb25zLFxuICAgICk7XG4gICAgdGhpcy5kZWNpZGVySGFuZGxlciA9IG5ldyBEZWNpZGVySGFuZGxlcihkZXBzKTtcbiAgICB0aGlzLnNlbGVjdG9ySGFuZGxlciA9IG5ldyBTZWxlY3RvckhhbmRsZXIoZGVwcywgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yKTtcbiAgICB0aGlzLnN1YmZsb3dFeGVjdXRvciA9IG5ldyBTdWJmbG93RXhlY3V0b3IoZGVwcywgdGhpcy5jcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShvcHRzKSk7XG4gICAgdGhpcy5wYXJhbGxlbEZvckVhY2hIYW5kbGVyID0gbmV3IFBhcmFsbGVsRm9yRWFjaEhhbmRsZXIoZGVwcywgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLCB7XG4gICAgICBwcmVmaXhOb2RlVHJlZTogKG4sIHByZWZpeCkgPT4gdGhpcy5wcmVmaXhOb2RlVHJlZShuLCBwcmVmaXgpLFxuICAgICAgcmVnaXN0ZXJCcmFuY2hTdWJmbG93OiAoc3ViZmxvd0lkLCByb290LCBjaGFydCkgPT4gdGhpcy5yZWdpc3RlckJyYW5jaFN1YmZsb3coc3ViZmxvd0lkLCByb290LCBjaGFydCksXG4gICAgICBicmFuY2hTaGFyZWRTdGF0ZTogKHN1YmZsb3dJZCkgPT5cbiAgICAgICAgdGhpcy5zdWJmbG93UmVzdWx0cy5nZXQoc3ViZmxvd0lkKT8udHJlZUNvbnRleHQ/Lmdsb2JhbENvbnRleHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICByZWNvcmRCcmFuY2hTdHJ1Y3R1cmU6IChub2RlSWQsIGJyYW5jaGVzKSA9PiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY0NoaWxkcmVuKG5vZGVJZCwgYnJhbmNoZXMpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZhY3RvcnkgdGhhdCBwcm9kdWNlcyBGbG93Y2hhcnRUcmF2ZXJzZXIgaW5zdGFuY2VzIGZvciBzdWJmbG93IGV4ZWN1dGlvbi5cbiAgICogQ2FwdHVyZXMgcGFyZW50IGNvbmZpZyBpbiBjbG9zdXJlIOKAlCBTdWJmbG93RXhlY3V0b3IgcHJvdmlkZXMgc3ViZmxvdy1zcGVjaWZpYyBvdmVycmlkZXMuXG4gICAqIEVhY2ggc3ViZmxvdyBnZXRzIGEgZnVsbCB0cmF2ZXJzZXIgd2l0aCBhbGwgNyBwaGFzZXMgKGRlY2lkZXJzLCBzZWxlY3RvcnMsIGxvb3BzLCBldGMuKS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkoXG4gICAgcGFyZW50T3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+LFxuICApOiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+IHtcbiAgICAvLyBDYXB0dXJlIHJlZmVyZW5jZXMgdG8gbXV0YWJsZSBzdGF0ZSDigJQgZmFjdG9yeSByZWFkcyB0aGUgQ1VSUkVOVCBzdGF0ZSB3aGVuIGNhbGxlZCxcbiAgICAvLyBub3QgdGhlIHN0YXRlIGF0IGZhY3RvcnkgY3JlYXRpb24gdGltZS4gVGhpcyBpcyBjb3JyZWN0IGJlY2F1c2UgbGF6eSBzdWJmbG93IHJlc29sdXRpb25cbiAgICAvLyBtYXkgYWRkIGVudHJpZXMgdG8gc3RhZ2VNYXAvc3ViZmxvd3MgYmVmb3JlIGEgbmVzdGVkIHN1YmZsb3cgaXMgZW5jb3VudGVyZWQuXG4gICAgY29uc3QgcGFyZW50U3RhZ2VNYXAgPSB0aGlzLnN0YWdlTWFwO1xuICAgIGNvbnN0IHBhcmVudFN1YmZsb3dzID0gdGhpcy5zdWJmbG93cztcbiAgICBjb25zdCBuYXJyYXRpdmVHZW5lcmF0b3IgPSB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvcjtcblxuICAgIHJldHVybiAoc3ViZmxvd09wdHMpID0+IHtcbiAgICAgIGNvbnN0IHRyYXZlcnNlciA9IG5ldyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPih7XG4gICAgICAgIHJvb3Q6IHN1YmZsb3dPcHRzLnJvb3QsXG4gICAgICAgIC4uLihzdWJmbG93T3B0cy5lbnRyeSAmJiB7IGVudHJ5OiBzdWJmbG93T3B0cy5lbnRyeSB9KSwgLy8gYSByZXN1bWUgaG9wJ3MgZW50cnkgcG9pbnRcbiAgICAgICAgLi4uKHN1YmZsb3dPcHRzLnBlbmRpbmdQYXVzZXMgJiYgeyBwZW5kaW5nUGF1c2VzOiBzdWJmbG93T3B0cy5wZW5kaW5nUGF1c2VzIH0pLFxuICAgICAgICBzdGFnZU1hcDogcGFyZW50U3RhZ2VNYXAsIC8vIENvbnN0cnVjdG9yIHNoYWxsb3ctY29waWVzIHRoaXNcbiAgICAgICAgc2NvcGVGYWN0b3J5OiBwYXJlbnRPcHRzLnNjb3BlRmFjdG9yeSxcbiAgICAgICAgZXhlY3V0aW9uUnVudGltZTogc3ViZmxvd09wdHMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgICAgcmVhZE9ubHlDb250ZXh0OiBzdWJmbG93T3B0cy5yZWFkT25seUNvbnRleHQsXG4gICAgICAgIGV4ZWN1dGlvbkVudjogcGFyZW50T3B0cy5leGVjdXRpb25FbnYsXG4gICAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IHBhcmVudE9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgICAgc3RyZWFtSGFuZGxlcnM6IHBhcmVudE9wdHMuc3RyZWFtSGFuZGxlcnMsXG4gICAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IHBhcmVudE9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgICAgc3ViZmxvd3M6IHBhcmVudFN1YmZsb3dzLCAvLyBDb25zdHJ1Y3RvciBzaGFsbG93LWNvcGllcyB0aGlzXG4gICAgICAgIG5hcnJhdGl2ZUdlbmVyYXRvciwgLy8gU2hhcmUgcGFyZW50J3Mg4oCUIGFsbCBldmVudHMgZmxvdyB0byBvbmUgcGxhY2VcbiAgICAgICAgbG9nZ2VyOiBwYXJlbnRPcHRzLmxvZ2dlcixcbiAgICAgICAgc2lnbmFsOiBwYXJlbnRPcHRzLnNpZ25hbCxcbiAgICAgICAgbWF4RGVwdGg6IHRoaXMuX21heERlcHRoLFxuICAgICAgICAuLi4odGhpcy5fbWF4SXRlcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHsgbWF4SXRlcmF0aW9uczogdGhpcy5fbWF4SXRlcmF0aW9ucyB9KSxcbiAgICAgICAgcGFyZW50U3ViZmxvd0lkOiBzdWJmbG93T3B0cy5zdWJmbG93SWQsXG4gICAgICAgIC8vIFJGQy0wMDMgRDE6IHRoZSBtb3VudCBzdGFnZSdzIHJ1bnRpbWVTdGFnZUlkIOKAlCBwYXJlbnQgZmFsbGJhY2sgZm9yXG4gICAgICAgIC8vIHRoZSBzdWJmbG93J3Mgcm9vdCBzdGFnZSBzbyBhbmNlc3RvciBjaGFpbnMgY3Jvc3MgdGhlIGJvdW5kYXJ5LlxuICAgICAgICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkOiBzdWJmbG93T3B0cy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBlbWl0RHJpbGxQYXRoOlxuICAgICAgICAgIHRoaXMuZW1pdERyaWxsUGF0aCAhPT0gdW5kZWZpbmVkICYmIHN1YmZsb3dPcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWRcbiAgICAgICAgICAgID8gWy4uLnRoaXMuZW1pdERyaWxsUGF0aCwgc3ViZmxvd09wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZF1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBleGVjdXRpb25Db3VudGVyOiB0aGlzLl9leGVjdXRpb25Db3VudGVyLCAvLyBTaGFyZSBjb3VudGVyIOKAlCBzdWJmbG93IGNvbnRpbnVlcyBnbG9iYWwgbnVtYmVyaW5nXG4gICAgICAgIHZpc2l0Q291bnRzOiB0aGlzLl92aXNpdENvdW50cywgLy8gU2hhcmUgdmlzaXQgY291bnRzIOKAlCBsb29wSXRlcmF0aW9uIHN0YXlzIG1vbm90b25pYyBhY3Jvc3Mgc3ViZmxvdyByZS1tb3VudHNcbiAgICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsIC8vIFN1YmZsb3cgaW5oZXJpdHMgcGFyZW50J3MgcnVuSWQg4oCUIHNhbWUgbG9naWNhbCBydW5cbiAgICAgICAgLi4uKHRoaXMuY29ycmVsYXRpb24gJiYgeyBjb3JyZWxhdGlvbjogdGhpcy5jb3JyZWxhdGlvbiB9KSwgLy8g4oCmYW5kIGl0cyBjb3JyZWxhdGlvbiwgYnkgcmVmZXJlbmNlXG4gICAgICAgIC8vIFNoYXJlIHRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSBCWSBSRUZFUkVOQ0UsIHNvIGEgaG9wIHRha2VuXG4gICAgICAgIC8vIGF0IGFueSBkZXB0aCBpcyB0YWtlbiBmb3IgdGhlIHdob2xlIHJ1biDigJQgYW5kIG5lc3RlZFxuICAgICAgICAvLyBTdWJmbG93RXhlY3V0b3JzIGNhbiB0YWtlIHRoZSBkZWVwZXIgaG9wcyAoZS5nLiBTZXF1ZW5jZShBZ2VudCguLi4pKVxuICAgICAgICAvLyB3aGVyZSB0aGUgaW5uZXIgQWdlbnQgc3ViZmxvdyBwYXVzZWQpLlxuICAgICAgICAuLi4odGhpcy5yZXN1bWUgJiYgeyByZXN1bWU6IHRoaXMucmVzdW1lIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4ZWN1dGU6ICgpID0+IHRyYXZlcnNlci5leGVjdXRlKCksXG4gICAgICAgIGdldFN1YmZsb3dSZXN1bHRzOiAoKSA9PiB0cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKSxcbiAgICAgICAgZ2V0QnJlYWtTdGF0ZTogKCkgPT4gdHJhdmVyc2VyLmdldEJyZWFrU3RhdGUoKSxcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVwcyhvcHRzOiBUcmF2ZXJzZXJPcHRpb25zPFRPdXQsIFRTY29wZT4pOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhZ2VNYXA6IHRoaXMuc3RhZ2VNYXAsXG4gICAgICByb290OiB0aGlzLnJvb3QsXG4gICAgICBleGVjdXRpb25SdW50aW1lOiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUsXG4gICAgICBzY29wZUZhY3Rvcnk6IG9wdHMuc2NvcGVGYWN0b3J5LFxuICAgICAgc3ViZmxvd3M6IHRoaXMuc3ViZmxvd3MsXG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBvcHRzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVyczogb3B0cy5zdHJlYW1IYW5kbGVycyxcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IG9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZSA/PyAnZXJyb3InLFxuICAgICAgLy8gVGhlIGxlZydzIE9ORSBvd25lZCBmcm96ZW4gaW5wdXQgc25hcHNob3QgaXMgdGFrZW4gd2hlbiB0aGUgbGVnIFNUQVJUU1xuICAgICAgLy8gKGBleGVjdXRlYCksIG5ldmVyIGhlcmU6IGEgZ2V0dGVyIG9uIHRoZSBpbnB1dCBtdXN0IG5vdCBydW4gYXQgY29uc3RydWN0aW9uLlxuICAgICAgcmVhZE9ubHlDb250ZXh0OiB1bmRlZmluZWQsXG4gICAgICBleGVjdXRpb25FbnY6IG9wdHMuZXhlY3V0aW9uRW52LFxuICAgICAgbmFycmF0aXZlR2VuZXJhdG9yOiB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvcixcbiAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICBzaWduYWw6IG9wdHMuc2lnbmFsLFxuICAgICAgLi4uKHRoaXMucmVzdW1lICYmIHsgcmVzdW1lOiB0aGlzLnJlc3VtZSB9KSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEhvbGRzIHRoZSB0b3AtbGV2ZWwgYnJlYWsgZmxhZyBmb3IgdGhlIGR1cmF0aW9uIG9mIGBleGVjdXRlKClgLiBLZXB0IGFzXG4gICAqIGEgZmllbGQgKG5vdCBhIGxvY2FsKSBzbyBgZ2V0QnJlYWtTdGF0ZSgpYCBjYW4gc3VyZmFjZSB0aGUgZmluYWwgc3RhdGVcbiAgICogZm9yIGNhbGxlcnMgbGlrZSBgU3ViZmxvd0V4ZWN1dG9yYCB0aGF0IGltcGxlbWVudCBgcHJvcGFnYXRlQnJlYWtgLlxuICAgKi9cbiAgcHJpdmF0ZSBfdG9wQnJlYWtGbGFnOiB7IHNob3VsZEJyZWFrOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSA9IHsgc2hvdWxkQnJlYWs6IGZhbHNlIH07XG5cbiAgYXN5bmMgZXhlY3V0ZShicmFuY2hQYXRoPzogc3RyaW5nKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+IHtcbiAgICAvLyBPTkUgb3duZWQgZnJvemVuIGlucHV0IHNuYXBzaG90IHBlciBsZWcgKHJ1biwgcmVzdW1lLCBzdWJmbG93IG1vdW50KSwgdGFrZW4gYXMgdGhlXG4gICAgLy8gbGVnIHN0YXJ0cyDigJQgbmV2ZXIgYXQgY29uc3RydWN0aW9uIChhbiBleGVjdXRvciBjb25zdHJ1Y3RzIGEgdHJhdmVyc2VyIGl0IG1heSBuZXZlclxuICAgIC8vIHJ1bik6IGV2ZXJ5IHNjb3BlIG9mIHRoZSBsZWcgZ2V0cyBpdCwgc28gZWFjaCBwYXlzIE8ocm9vdCBrZXlzKSwgbm90IE8oaW5wdXQpLlxuICAgIHRoaXMuZGVwcy5yZWFkT25seUNvbnRleHQgPSBzbmFwc2hvdFJ1bklucHV0KHRoaXMucmVhZE9ubHlDb250ZXh0KTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5leGVjdXRpb25SdW50aW1lLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgdGhpcy5fdG9wQnJlYWtGbGFnID0geyBzaG91bGRCcmVhazogZmFsc2UgfTtcbiAgICAvLyBUaGUgZW50cnkgaXMgb25lLXNob3Q6IHRoZSBmaXJzdCBleGVjdXRlKCkgc3RhcnRzIHRoZXJlLCBuZXZlciBhZ2FpbiDigJRcbiAgICAvLyBhbmQgc28gYXJlIHRoZSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGJlaGluZCBpdC5cbiAgICBjb25zdCBzdGFydCA9IHRoaXMuZW50cnkgPz8gdGhpcy5yb290O1xuICAgIGNvbnN0IHdhaXRpbmcgPSB0aGlzLmVudHJ5UGVuZGluZ1BhdXNlcztcbiAgICB0aGlzLmVudHJ5ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZW50cnlQZW5kaW5nUGF1c2VzID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHdhbGsgPSAoKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+ID0+XG4gICAgICB3YWl0aW5nXG4gICAgICAgID8gdGhpcy53YWxrVGhlblJhaXNlKHN0YXJ0LCBjb250ZXh0LCB3YWl0aW5nLCBicmFuY2hQYXRoKVxuICAgICAgICA6IHRoaXMuZXhlY3V0ZU5vZGUoc3RhcnQsIGNvbnRleHQsIHRoaXMuX3RvcEJyZWFrRmxhZywgYnJhbmNoUGF0aCA/PyAnJyk7XG5cbiAgICAvLyBGaXJlIG9uUnVuU3RhcnQgT05MWSBhdCB0aGUgdG9wLWxldmVsIHRyYXZlcnNhbCDigJQgc3ViZmxvdyB0cmF2ZXJzZXJzXG4gICAgLy8gYWxyZWFkeSBwcm9kdWNlIG9uU3ViZmxvd0VudHJ5L29uU3ViZmxvd0V4aXQgcGFpcnMsIHNvIGVtaXR0aW5nIHJ1blxuICAgIC8vIGV2ZW50cyBmb3IgdGhlbSB3b3VsZCBkb3VibGUtYnJhY2tldCB0aGUgYm91bmRhcnkgc3RyZWFtLiBUaGVcbiAgICAvLyB0b3AtbGV2ZWwgdHJhdmVyc2VyIGlzIHRoZSBvbmUgd2l0aG91dCBhIHBhcmVudFN1YmZsb3dJZC5cbiAgICBjb25zdCBpc1RvcExldmVsID0gdGhpcy5wYXJlbnRTdWJmbG93SWQgPT09IHVuZGVmaW5lZDtcbiAgICAvLyBTeW50aGV0aWMgVHJhdmVyc2FsQ29udGV4dCBmb3IgcnVuLmVudHJ5IC8gcnVuLmV4aXQuIEZpZWxkcyB1c2VcbiAgICAvLyByb290LXN0YWdlIGRlZmF1bHRzIChzdGFnZUlkPSdfX3Jvb3RfXycsIHJ1bnRpbWVTdGFnZUlkPSdfX3Jvb3RfXyMwJyxcbiAgICAvLyBkZXB0aCAwKSBzbyB0aGUgcnVuSWQgaXMgcmVsaWFibHkgYXZhaWxhYmxlIG9uIHJ1biBldmVudHMgd2l0aG91dFxuICAgIC8vIGZvcmNpbmcgcmVjb3JkZXJzIHRvIGhhbmRsZSBgdHJhdmVyc2FsQ29udGV4dCA9PT0gdW5kZWZpbmVkYC5cbiAgICBjb25zdCByb290Q29udGV4dCA9IHJvb3RUcmF2ZXJzYWxDb250ZXh0KHRoaXMucnVuSWQsIHRoaXMuY29ycmVsYXRpb24pO1xuICAgIGNvbnN0IHJlZGFjdGlvblJ1bGUgPSBjb250ZXh0LmdldFJlZGFjdGlvblJ1bGUoKTtcbiAgICBpZiAoaXNUb3BMZXZlbCkge1xuICAgICAgLy8gUmV0YWluIGF0IHRoZSBib3VuZGFyeSwgYmVmb3JlIGRpc3BhdGNoIG9yIGRlZmVycmVkIGNhcHR1cmUg4oCUIHRoZVxuICAgICAgLy8gc2FtZSBvd25lciBhcyBzdWJmbG93IGVudHJ5LCBub3QgYSByZWNvcmRlci1sb2NhbCBzY3J1YiBvciBsYXRlciB3YWxrLlxuICAgICAgLy8gVW5kZXIgYSBwb2xpY3kgdGhlIHdhbGsgcmVhZHMgdGhlIGxlZydzIE9ORSBzbmFwc2hvdCAodGFrZW4gYWJvdmUpLCBuZXZlciB0aGUgbGl2ZSBpbnB1dFxuICAgICAgLy8gYSBzZWNvbmQgdGltZTsgd2l0aG91dCBvbmUgdGhlIGV2ZW50IGNhcnJpZXMgdGhlIGlucHV0IGFzIGl0IGFsd2F5cyBoYXMuXG4gICAgICBjb25zdCBpbnB1dCA9XG4gICAgICAgIHJlZGFjdGlvblJ1bGUgJiYgIXJlZGFjdGlvblJ1bGUuaXNJbmVydCgpXG4gICAgICAgICAgPyByZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5KHRoaXMuZGVwcy5yZWFkT25seUNvbnRleHQpXG4gICAgICAgICAgOiB0aGlzLnJlYWRPbmx5Q29udGV4dDtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUnVuU3RhcnQoaW5wdXQsIHJvb3RDb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBUb3AtbGV2ZWwgcnVucyBjbG9zZSB0aGVpciBib3VuZGFyeSBTWU1NRVRSSUNBTExZOiBldmVyeSBvblJ1blN0YXJ0XG4gICAgLy8gaXMgZm9sbG93ZWQgYnkgZXhhY3RseSBvbmUgb25SdW5FbmQgKGNsZWFuKSBvciBvblJ1bkZhaWxlZCAoZXJyb3IpLlxuICAgIC8vIFdpdGhvdXQgdGhlIGNhdGNoLCBhIHRocm93biBydW4gZmlyZWQgb25SdW5TdGFydCB0aGVuIG5vdGhpbmcg4oCUIGFcbiAgICAvLyBtb25pdG9yIGNvdWxkbid0IHRlbGwgXCJzdGlsbCBydW5uaW5nXCIgZnJvbSBcImNyYXNoZWQuXCIgUGF1c2UgaXMgTk9UXG4gICAgLy8gYW4gZXJyb3IgKGl0J3MgZXhwZWN0ZWQgc3VzcGVuc2lvbiksIHNvIGl0IHNraXBzIG9uUnVuRmFpbGVkIGFuZFxuICAgIC8vIHJlLXRocm93cyB1bnRvdWNoZWQuIFRoZSBzdGFnZS1sZXZlbCBjYXRjaCBhbHJlYWR5IHJlY29yZGVkIHRoZVxuICAgIC8vIGZhaWxpbmcgc3RhZ2UgKG9uRXJyb3IgKyBjb21taXQpOyB0aGlzIGFkZHMgdGhlIHJ1bi1sZXZlbCB0ZXJtaW5hbFxuICAgIC8vIHNpZ25hbC4gVGhlIGVycm9yIHN0aWxsIHByb3BhZ2F0ZXMg4oCUIHRoaXMgaXMgb2JzZXJ2YXRpb24sIG5vdFxuICAgIC8vIHJlY292ZXJ5LiBTdWJmbG93IHRyYXZlcnNlcnMgZG9uJ3QgZmlyZSBydW4gZXZlbnRzOyB0aGVpciBlcnJvcnNcbiAgICAvLyBidWJibGUgdXAgYW5kIHN1cmZhY2UgaGVyZSBhdCB0aGUgdG9wIGxldmVsLlxuICAgIGlmICghaXNUb3BMZXZlbCkge1xuICAgICAgcmV0dXJuIHdhbGsoKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogVHJhdmVyc2FsUmVzdWx0O1xuICAgIGxldCByZXRhaW5lZFJlc3VsdDogVHJhdmVyc2FsUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB3YWxrKCk7XG4gICAgICAvLyBSZWFkIHRoZSBzaGFyZWQgcnVsZSBub3cgc28gbWFya3MgbWFkZSBkdXJpbmcgZXhlY3V0aW9uIGFwcGx5IHRvXG4gICAgICAvLyB0aGlzIGV2ZW50LiBBIHNjcnViIGZhaWx1cmUgY2xvc2VzIHRoZSBydW4gYXMgZmFpbGVkLCBuZXZlciByYXcuXG4gICAgICByZXRhaW5lZFJlc3VsdCA9IHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5KHJlc3VsdCkgOiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmICghaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25SdW5GYWlsZWQoXG4gICAgICAgICAgcmVkYWN0aW9uUnVsZSA/IHJlZGFjdGlvblJ1bGUuc2VydmVkRXJyb3IoZXJyb3IpIDogZXh0cmFjdEVycm9ySW5mbyhlcnJvciksXG4gICAgICAgICAgcm9vdENvbnRleHQsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25SdW5FbmQocmV0YWluZWRSZXN1bHQsIHJvb3RDb250ZXh0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgcmVzdW1lJ3MgZW50cnkgY2hhaW4gYXQgYSBsZXZlbCB3aGVyZSBwYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRcbiAgICogKDkuMjguMCk6IHJ1biB0aGUgY2hhaW4g4oCUIHRoZSByZXN1bWVkIGNoaWxkIG9ubHksIHRoZSBmYW4tb3V0J3Mgam9pbiBpc1xuICAgKiBOT1QgYXR0YWNoZWQg4oCUIHRoZW4gcmFpc2UgdGhlIGZpcnN0IHdhaXRpbmcgcGF1c2UgYWdhaW4sIHRoZSByZXN0IGJlaGluZFxuICAgKiBpdC4gTm90aGluZyBvZiB0aGUgc2libGluZyByZS1ydW5zOyBpdHMgcXVlc3Rpb24gY29tZXMgYmFjayBhcyBpdCB3YXNcbiAgICogYXNrZWQuIEEgcGF1c2UgcmFpc2VkIGZyb20gaW5zaWRlIHRoZSBjaGFpbiAodGhlIHJlc3VtZWQgY2hpbGQgYXNraW5nXG4gICAqIGFnYWluKSBjYXJyaWVzIGV2ZXJ5IHdhaXRpbmcgc2libGluZyBpbnN0ZWFkLCBzbyBub25lIGlzIGV2ZXIgZHJvcHBlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2Fsa1RoZW5SYWlzZShcbiAgICBzdGFydDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIHdhaXRpbmc6IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW10sXG4gICAgYnJhbmNoUGF0aD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5leGVjdXRlTm9kZShzdGFydCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSBxdWV1ZUJlaGluZChlcnJvciwgd2FpdGluZyk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgY29uc3QgeyBwYXVzZSwgc3RhZ2VOYW1lIH0gPSB3YWl0aW5nWzBdO1xuICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUGF1c2UoXG4gICAgICBzdGFnZU5hbWUsXG4gICAgICBwYXVzZS5wYXVzZWRTdGFnZUlkLFxuICAgICAgc2VydmVkUGF1c2UoY29udGV4dCwgcGF1c2UucGF1c2VEYXRhKSxcbiAgICAgIHBhdXNlLnN1YmZsb3dQYXRoLFxuICAgICAgLy8gVGhpcyBsZWcgcmUtcmFpc2VkIGEgcXVldWVkIHNpYmxpbmc7IGl0IGRpZCBub3QgZXhlY3V0ZSB0aGF0IHNpYmxpbmcgYWdhaW4uIEtlZXAgdGhlIG9yaWdpbmFsXG4gICAgICAvLyBwYXVzZWRFeGVjdXRpb24gb24gdGhlIHNpZ25hbCwgYW5kIHN0YW1wIHRoaXMgbm90aWZpY2F0aW9uIHdpdGggdGhlIGN1cnJlbnQgbGVnJ3Mgcm9vdCBpZGVudGl0eS5cbiAgICAgIHJvb3RUcmF2ZXJzYWxDb250ZXh0KHRoaXMucnVuSWQsIHRoaXMuY29ycmVsYXRpb24pLFxuICAgICk7XG4gICAgdGhyb3cgcmFpc2VRdWV1ZWRQYXVzZSh3YWl0aW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCcmVhayBzdGF0ZSBjYXB0dXJlZCBhdCB0aGUgdG9wLWxldmVsIG9mIHRoZSBtb3N0IHJlY2VudCBgZXhlY3V0ZSgpYC5cbiAgICogYHNob3VsZEJyZWFrYCBpcyB0cnVlIHdoZW4gYSBzdGFnZSBjYWxsZWQgYHNjb3BlLiRicmVhayhyZWFzb24pYDsgdGhlXG4gICAqIG9wdGlvbmFsIGByZWFzb25gIGNhcnJpZXMgdGhlIHN0cmluZyBwYXNzZWQgdG8gYCRicmVha2AuXG4gICAqXG4gICAqIFVzZWQgYnkgYFN1YmZsb3dFeGVjdXRvcmAgdG8gcHJvcGFnYXRlIGFuIGlubmVyIHN1YmZsb3cncyBicmVhayB1cCB0b1xuICAgKiB0aGUgcGFyZW50IHRyYXZlcnNlciB3aGVuIHRoZSBtb3VudCBzZXRzIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAuXG4gICAqL1xuICBnZXRCcmVha1N0YXRlKCk6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9IHtcbiAgICByZXR1cm4geyAuLi50aGlzLl90b3BCcmVha0ZsYWcgfTtcbiAgfVxuXG4gIGdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmdldFN0cnVjdHVyZSgpO1xuICB9XG5cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KSB7XG4gICAgLy8gU3RhbXAgdGhlIHJ1bidzIGlkIG9udG8gdGhlIHJ1bnRpbWUgc25hcHNob3QgaGVyZSDigJQgdGhlIHRyYXZlcnNlciBpc1xuICAgIC8vIHRoZSBzaW5nbGUgYXV0aG9yaXR5IGZvciBgcnVuSWRgIChpdCBhbHJlYWR5IHN0YW1wcyB0aGUgc2FtZSB2YWx1ZSBvblxuICAgIC8vIGV2ZXJ5IFRyYXZlcnNhbENvbnRleHQvZXZlbnQpLCB3aGlsZSB0aGUgcnVudGltZSBpcyBydW4tYWdub3N0aWNcbiAgICAvLyBtZW1vcnkgKGl0cyBnZXRTbmFwc2hvdCByZXR1cm5zIE9taXQ8UnVudGltZVNuYXBzaG90LCAncnVuSWQnPikuXG4gICAgLy8gRnJlc2ggcGVyIHJ1bigpIEFORCBwZXIgcmVzdW1lKCkg4oCUIHNlZSBydW5uZXIvcnVuSWQudHMuXG4gICAgLy8gVGhlIGNvcnJlbGF0aW9uIHJpZGVzIGJlc2lkZSBpdCwgZnJvbSB0aGUgc2FtZSBhdXRob3JpdHkg4oCUIHByZXNlbnQgb25seSB3aGVuIHRoZSBsZWcgaGFzIG9uZS5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5leGVjdXRpb25SdW50aW1lLmdldFNuYXBzaG90KG9wdGlvbnMpLFxuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICAuLi4odGhpcy5jb3JyZWxhdGlvbiAmJiB7IGNvcnJlbGF0aW9uOiB0aGlzLmNvcnJlbGF0aW9uIH0pLFxuICAgIH07XG4gIH1cblxuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gIH1cblxuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25SdW50aW1lLmdldFBpcGVsaW5lcygpO1xuICB9XG5cbiAgZ2V0UnVudGltZVJvb3QoKTogU3RhZ2VOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG5cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnN1YmZsb3dSZXN1bHRzO1xuICB9XG5cbiAgZ2V0TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IuZ2V0U2VudGVuY2VzKCk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgRmxvd1JlY29yZGVyRGlzcGF0Y2hlciwgb3IgdW5kZWZpbmVkIGlmIG5hcnJhdGl2ZSBpcyBkaXNhYmxlZC4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIENvcmUgVHJhdmVyc2FsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBPKDEpIElE4oaSbm9kZSBtYXAgZnJvbSB0aGUgcm9vdCBncmFwaC5cbiAgICogVXNlZCBieSBOb2RlUmVzb2x2ZXIgdG8gYXZvaWQgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpIGNhbGwuXG4gICAqIEl0ZXJhdGl2ZSB3b3JrbGlzdCAobm8gcmVjdXJzaW9uKSBzbyBhcmJpdHJhcmlseSBsb25nIGNoYWlucyBpbmRleCBmdWxseTtcbiAgICogdGhlIGBtYXAuaGFzYCBndWFyZCBoYW5kbGVzIGN5Y2xpYyByZWZzLiBGaXJzdC12aXNpdGVkIG5vZGUgd2lucyBwZXIgSUQg4oCUXG4gICAqIHdvcmtsaXN0IG9yZGVyIG1hdGNoZXMgdGhlIG9sZCByZWN1cnNpdmUgcHJlLW9yZGVyIChjaGlsZHJlbiwgdGhlbiBuZXh0KS5cbiAgICogRHluYW1pYyBzdWJmbG93cyBhbmQgbGF6eS1yZXNvbHZlZCBub2RlcyBhcmUgYWRkZWQgdG8gc3RhZ2VNYXAgYXQgcnVudGltZSBidXQgbm90IHRvIHRoaXMgbWFwIOKAlFxuICAgKiB0aG9zZSB1c2UgdGhlIERGUyBmYWxsYmFjayBpbiBOb2RlUmVzb2x2ZXIuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm9kZUlkTWFwKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3Qgc3RhY2s6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbcm9vdF07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdGFjay5wb3AoKSE7XG4gICAgICBpZiAobWFwLmhhcyhub2RlLmlkKSkgY29udGludWU7IC8vIGFscmVhZHkgdmlzaXRlZCAoYXZvaWRzIGluZmluaXRlIGxvb3BzIG9uIGN5Y2xpYyByZWZzKVxuICAgICAgbWFwLnNldChub2RlLmlkLCBub2RlKTtcbiAgICAgIC8vIFB1c2ggaW4gcmV2ZXJzZSB2aXNpdCBvcmRlciAoTElGTyBzdGFjayk6IG5leHQgZmlyc3QsIHRoZW4gY2hpbGRyZW5cbiAgICAgIC8vIHJldmVyc2VkIOKAlCBzbyBjaGlsZHJlbiBhcmUgdmlzaXRlZCBiZWZvcmUgbmV4dCwgZmlyc3QgY2hpbGQgZmlyc3QsXG4gICAgICAvLyBtYXRjaGluZyB0aGUgcmVjdXJzaXZlIHByZS1vcmRlciBleGFjdGx5LlxuICAgICAgaWYgKG5vZGUubmV4dCkgc3RhY2sucHVzaChub2RlLm5leHQpO1xuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHN0YWNrLnB1c2gobm9kZS5jaGlsZHJlbltpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YWdlRm4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2Ygbm9kZS5mbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5vZGUuZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgIC8vIFByaW1hcnk6IGxvb2sgdXAgYnkgaWQgKHN0YWJsZSBpZGVudGlmaWVyLCBrZXllZCBieSBGbG93Q2hhcnRCdWlsZGVyKVxuICAgIGNvbnN0IGJ5SWQgPSB0aGlzLnN0YWdlTWFwLmdldChub2RlLmlkKTtcbiAgICBpZiAoYnlJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYnlJZDtcbiAgICAvLyBGYWxsYmFjazogbG9vayB1cCBieSBuYW1lIChzdXBwb3J0cyBoYW5kLWNyYWZ0ZWQgc3RhZ2VNYXBzIGluIHRlc3RzIGFuZCBhZHZhbmNlZCB1c2UpXG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VNYXAuZ2V0KG5vZGUubmFtZSk7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgRHluYW1pYy1wYXRjaCBvdmVybGF5IGFjY2Vzc29ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gRXZlcnkgZW5naW5lIHJlYWQgb2YgYSBmaWVsZCB0aGF0IFBoYXNlIDQgY2FuIHBhdGNoIChjaGlsZHJlbixcbiAgLy8gbmV4dE5vZGVTZWxlY3Rvciwgc3ViZmxvdyBtZXRhKSBnb2VzIHRocm91Z2ggdGhlc2UuIEZhc3QgcGF0aDogY2hhcnRzXG4gIC8vIHdpdGggbm8gZHluYW1pYyByZXR1cm5zIG5ldmVyIGFsbG9jYXRlIGFuZCBwYXkgb25lIGBzaXplID09PSAwYCBjaGVjay5cblxuICBwcml2YXRlIGdldFBhdGNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5wYXRjaENvdW50ID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNQYXRjaGVzLmdldChub2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVQYXRjaChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IER5bmFtaWNOb2RlUGF0Y2g8VE91dCwgVFNjb3BlPiB7XG4gICAgbGV0IHBhdGNoID0gdGhpcy5keW5hbWljUGF0Y2hlcy5nZXQobm9kZSk7XG4gICAgaWYgKCFwYXRjaCkge1xuICAgICAgcGF0Y2ggPSB7fTtcbiAgICAgIHRoaXMuZHluYW1pY1BhdGNoZXMuc2V0KG5vZGUsIHBhdGNoKTtcbiAgICAgIHRoaXMucGF0Y2hDb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gcGF0Y2g7XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIGNoaWxkcmVuOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4uICovXG4gIHByaXZhdGUgZWZmQ2hpbGRyZW4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYXRjaChub2RlKT8uY2hpbGRyZW4gPz8gbm9kZS5jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgb3V0cHV0LWJhc2VkIHNlbGVjdG9yOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MuICovXG4gIHByaXZhdGUgZWZmU2VsZWN0b3Iobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTZWxlY3RvciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGF0Y2gobm9kZSk/Lm5leHROb2RlU2VsZWN0b3IgPz8gbm9kZS5uZXh0Tm9kZVNlbGVjdG9yO1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93LXJvb3QgbWFya2VyICh0cnVlIHdoZW4gYSBkeW5hbWljIHN1YmZsb3cgd2FzIHBhdGNoZWQgb24pLiAqL1xuICBwcml2YXRlIGVmZklzU3ViZmxvd1Jvb3Qobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyB0cnVlIDogbm9kZS5pc1N1YmZsb3dSb290O1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93IGlkIChwYXRjaGVkIHZlcmJhdGltIGJ5IGEgZHluYW1pYyBzdWJmbG93IHJldHVybikuICovXG4gIHByaXZhdGUgZWZmU3ViZmxvd0lkKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyBtZXRhLnN1YmZsb3dJZCA6IG5vZGUuc3ViZmxvd0lkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBlZmZlY3RpdmUgdmlldyBvZiBhIG5vZGUg4oCUIGZpZWxkLWlkZW50aWNhbCB0byB3aGF0IHRoZVxuICAgKiBwcmUtb3ZlcmxheSBjb2RlIHByb2R1Y2VkIGJ5IG11dGF0aW5nIHRoZSBzaGFyZWQgbm9kZS4gVXNlZCB3aGVyZSBhIG5vZGVcbiAgICogaXMgaGFuZGVkIHRvIGEgaGVscGVyIGV4ZWN1dG9yIChOb2RlUmVzb2x2ZXIgLyBTdWJmbG93RXhlY3V0b3IgL1xuICAgKiBDaGlsZHJlbkV4ZWN1dG9yKSBzbyBoZWxwZXJzIG5ldmVyIHJlYWQgc3RhbGUgYnVpbHQgZmllbGRzLiBSZXR1cm5zIHRoZVxuICAgKiBub2RlIGl0c2VsZiAobm8gYWxsb2NhdGlvbikgd2hlbiBpdCBjYXJyaWVzIG5vIHBhdGNoLlxuICAgKi9cbiAgcHJpdmF0ZSBlZmZOb2RlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHBhdGNoID0gdGhpcy5nZXRQYXRjaChub2RlKTtcbiAgICBpZiAoIXBhdGNoKSByZXR1cm4gbm9kZTtcbiAgICBjb25zdCBtZXJnZWQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5ub2RlIH07XG4gICAgaWYgKHBhdGNoLnN1YmZsb3dNZXRhKSB7XG4gICAgICBtZXJnZWQuaXNTdWJmbG93Um9vdCA9IHRydWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd0lkID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd0lkO1xuICAgICAgbWVyZ2VkLnN1YmZsb3dOYW1lID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd05hbWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd01vdW50T3B0aW9ucyA9IHBhdGNoLnN1YmZsb3dNZXRhLnN1YmZsb3dNb3VudE9wdGlvbnM7XG4gICAgfVxuICAgIGlmIChwYXRjaC5jaGlsZHJlbikgbWVyZ2VkLmNoaWxkcmVuID0gcGF0Y2guY2hpbGRyZW47XG4gICAgaWYgKHBhdGNoLm5leHROb2RlU2VsZWN0b3IpIG1lcmdlZC5uZXh0Tm9kZVNlbGVjdG9yID0gcGF0Y2gubmV4dE5vZGVTZWxlY3RvcjtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRIRSBzaW5nbGUgZnVubmVsIGV2ZXJ5IHN0YWdlIGZ1bmN0aW9uIHBhc3NlcyB0aHJvdWdoIOKAlCBsaW5lYXIgc3RhZ2VzXG4gICAqIChQaGFzZSAzKSwgZGVjaWRlciBzdGFnZXMgYW5kIHNlbGVjdG9yIHN0YWdlcyAodGhlaXIgaGFuZGxlcnMgYXJlIGhhbmRlZFxuICAgKiB0aGlzIG1ldGhvZCBhcyBgcnVuU3RhZ2VgKSwgYW5kIGJ5IGV4dGVuc2lvbiBmb3JrIGNoaWxkcmVuIGFuZFxuICAgKiBzdWJmbG93LWludGVybmFsIHN0YWdlcywgd2hpY2ggcmUtZW50ZXIgUGhhc2UgMyBpbiB0aGVpciBvd24gdHJhdmVyc2VyLlxuICAgKlxuICAgKiBXaGljaCBpcyBleGFjdGx5IHdoeSBhIGRlY2xhcmVkIGByZXRyeWAgcG9saWN5IGlzIGhvbm91cmVkIEhFUkUgYW5kXG4gICAqIG5vd2hlcmUgZWxzZTogb25lIGNhbGwgZ2l2ZXMgYHJldHJ5YCB0byBldmVyeSBzdGFnZSBraW5kIHRoYXQgaGFzIGFcbiAgICogZnVuY3Rpb24gdG8gcmV0cnkuIFRoZSBsb29wIGl0c2VsZiBpcyB0aGUgYXR0ZW1wdCBydW5uZXInc1xuICAgKiAoYGF0dGVtcHQvcnVubmVyLnRzIMK3IHJ1bkF0dGVtcHRzYCwgMTAuMSDigJQgb25lIHJ1bm5lciwgb25lIHJlY29yZCk7IHRoaXNcbiAgICogbWV0aG9kIGhhbmRzIGl0IHRoZSBlbmdpbmUncyBoYWxmOiBvbmUgYXR0ZW1wdCAoYFN0YWdlUnVubmVyIMK3IHJ1bmAsIGFcbiAgICogZnJlc2ggc2NvcGUgZWFjaCB0aW1lKSwgdGhlIGRpc2NhcmQgYmV0d2VlbiBhdHRlbXB0c1xuICAgKiAoYFN0YWdlQ29udGV4dCDCtyBkaXNjYXJkU3RhZ2VkYCDigJQgdGhlIHJ1bm5lciBjYW5ub3QgcmVhY2ggYSBmcmFtZSksIHRoZVxuICAgKiBzZXJ2ZWQgZm9ybSBvZiBhbiBhdHRlbXB0J3MgZXJyb3IgKGBzZXJ2ZWRTdGFnZUVycm9yYCwgdGhlIHJ1bidzXG4gICAqIHJlZGFjdGlvbiBydWxlKSwgYW5kIHdoZXJlIGVhY2ggcmVjb3JkIGdvZXMgKHRoZSBmcmFtZSwgZm9yIHRoZVxuICAgKiBleGVjdXRpb24gdHJlZTsgYG9uQXR0ZW1wdGAgYW5kIGBvblN0YWdlUmV0cnlgLCBmb3IgcmVjb3JkZXJzKS5cbiAgICpcbiAgICogTk9UIGBhc3luY2AsIG9uIHB1cnBvc2Ug4oCUIHRoZSBtaWNyb3Rhc2sgc2hhcGUgb2YgYSBzdGFnZSBpcyBwYXJ0IG9mIHdoYXRcbiAgICogdGhlIGVuZ2luZSBrZWVwcyBieXRlLWlkZW50aWNhbCAocGFyYWxsZWwgc2libGluZ3Mgc2V0dGxlIGluIHRoZSBvcmRlclxuICAgKiB0aGV5IGFsd2F5cyBkaWQpOlxuICAgKiAgIC0gbm8gcG9saWN5IChvciBgYXR0ZW1wdHM6IDFgLCBhIGRlY2xhcmVkLWJ1dC1vZmYgcG9saWN5KTogb25lIGNhbGxcbiAgICogICAgIHRocm91Z2ggYW4gYXN5bmMgZnJhbWUgKHtAbGluayBydW5TdGFnZU9uY2V9KSwgZXhhY3RseSB0aGUgcHJlLTEwLjFcbiAgICogICAgIHNoYXBlIOKAlCBhbmQgbm8gYXR0ZW1wdCBpcyByZWNvcmRlZDtcbiAgICogICAtIGEgcG9saWN5OiB0aGUgcnVubmVyJ3Mgb3duIHByb21pc2UsIHdob3NlIG9uZSBhd2FpdCBwZXIgYXR0ZW1wdCBpcyB0aGVcbiAgICogICAgIHNhbWUgb25lIGF3YWl0IHRoZSA5LjE1IGxvb3AgaGFkLlxuICAgKi9cbiAgcHJpdmF0ZSBleGVjdXRlU3RhZ2UoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3RhZ2VGdW5jOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRm46ICgpID0+IHZvaWQsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8VE91dD4ge1xuICAgIC8vIHJ1bnRpbWVTdGFnZUlkIGlzIGFzc2lnbmVkIGluIGV4ZWN1dGVOb2RlKCkgYmVmb3JlIHRyYXZlcnNhbENvbnRleHQgY3JlYXRpb24sXG4gICAgLy8gZW5zdXJpbmcgc2NvcGUgZXZlbnRzIGFuZCBmbG93IGV2ZW50cyB1c2UgdGhlIHNhbWUgdmFsdWUuIEl0IGRvZXMgTk9UXG4gICAgLy8gY2hhbmdlIGFjcm9zcyBhdHRlbXB0czogYXR0ZW1wdHMgYXJlIGludGVybmFsIHRvIE9ORSBzdGFnZSBleGVjdXRpb24g4oCUXG4gICAgLy8gb25lIHJ1bnRpbWVTdGFnZUlkLCBvbmUgZXhlY3V0aW9uIGluZGV4LCBvbmUgZmluYWwgQ29tbWl0QnVuZGxlLlxuICAgIC8vIFRoZSBjZWlsaW5nIGlzIHRoZSBydW5uZXIncyBvd24gcmVhZGluZyAoYGF0dGVtcHRDZWlsaW5nYCksIHNvIHRoZSBnYXRlXG4gICAgLy8gYW5kIHRoZSBzZXJpZXMgY2FuIG5ldmVyIGRpc2FncmVlIGFib3V0IHdoZXRoZXIgdGhpcyBzdGFnZSByZXRyaWVzLlxuICAgIC8vIEEgc3RhZ2UgcnVucyBvbiB0aGUgcnVubmVyIHdoZW4gYW55dGhpbmcgYWJvdXQgaXQgaXMgd29ydGggYW4gYXR0ZW1wdCByZWNvcmQ6IGEgcmV0cnksIGEgY2FwIG9uIG9uZSBhdHRlbXB0XG4gICAgLy8gKGB0aW1lb3V0TXNgLCBldmVuIHdpdGggYGF0dGVtcHRzOiAxYCksIG9yIGEgcnVuIGRlYWRsaW5lLiBPdGhlcndpc2UgaXQga2VlcHMgaXRzIHByZS0xMC4xIHNoYXBlIGV4YWN0bHkuXG4gICAgLy8gVGhlIGNhbGxzIHRoaXMgc3RhZ2UgbWFrZXMgKGBzY29wZS4kY2FsbGAsIGBvYnNlcnZlZCgpYCwgUDIpIHJlcG9ydCB0aHJvdWdoIHRoZSBzYW1lIGhvb2sgYXMgaXRzIG93biBhdHRlbXB0cyxcbiAgICAvLyB3aXRoIHRoaXMgZXhlY3V0aW9uJ3MgdHJhdmVyc2FsIGNvbnRleHQgKGFuZCB0aGUgcnVuJ3MgY29ycmVsYXRpb24pLiBTZXR0aW5nIGl0IG1vdmVzIG5vIG1pY3JvdGFzay5cbiAgICBjb250ZXh0LnVzZUF0dGVtcHRSZXBvcnRlcigocmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3IpID0+XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkF0dGVtcHQobm9kZS5uYW1lLCBub2RlLmlkLCByZWNvcmQsIHN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCksXG4gICAgKTtcbiAgICBjb25zdCBwb2xpY3kgPSBub2RlLnJldHJ5ID8/IFNJTkdMRV9BVFRFTVBUO1xuICAgIC8vIEEgc3RhZ2UgdGhhdCB0b3VjaGVzIGFuIG91dHNpZGUgc3lzdGVtIChQMykgYWx3YXlzIHJ1bnMgb24gdGhlIHJ1bm5lcjogZXZlcnkgYXR0ZW1wdCBzYXlzIHdoYXQgaXQgZGlkIHRoZXJlLlxuICAgIGxldCBlZmZlY3Q6IEVmZmVjdFRhcmdldCB8IHVuZGVmaW5lZDtcbiAgICBpZiAobm9kZS50b3VjaGVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlZmZlY3QgPSB0aGlzLmVmZmVjdFRhcmdldChub2RlLmlkLCBub2RlLnRvdWNoZXMsIG5vZGUucmV0cnksIGNvbnRleHQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgLy8gVGhlIHN0YWdlIGZhaWxzIG9uIGl0cyBlcnJvciBwYXRoIGJlZm9yZSBhbnkgYXR0ZW1wdDogbm90aGluZyB3YXMgc2VudC5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSBmcmFtZSBjYW4gYmUgcmUtdXNlZCBieSBhIGxhdGVyIGV4ZWN1dGlvbjogdGhlIHNpZGUtZWZmZWN0IGJvb2trZWVwaW5nIGlzIHRoaXMgZXhlY3V0aW9uJ3Mgb3duLlxuICAgIGNvbnRleHQuYmVnaW5FZmZlY3RzKFxuICAgICAgZWZmZWN0Py5pZGVtcG90ZW5jeUtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChlZmZlY3QucmVjb3JkZWRLZXkgIT09IGVmZmVjdC5pZGVtcG90ZW5jeUtleSB8fCBpc0NhcnJpZWRUb3VjaGVzKG5vZGUudG91Y2hlcykpLFxuICAgICk7XG4gICAgY29uc3QgcnVucyA9XG4gICAgICBhdHRlbXB0Q2VpbGluZyhwb2xpY3kuYXR0ZW1wdHMpID4gMSB8fFxuICAgICAgYXR0ZW1wdFRpbWVvdXRNcyhwb2xpY3kudGltZW91dE1zKSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLmRlYWRsaW5lICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIGVmZmVjdCAhPT0gdW5kZWZpbmVkO1xuICAgIGlmICghcnVucykgcmV0dXJuIHRoaXMucnVuU3RhZ2VPbmNlKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbik7XG4gICAgcmV0dXJuIHJ1bkF0dGVtcHRzKChfbiwgYXR0ZW1wdCkgPT4gdGhpcy5zdGFnZVJ1bm5lci5ydW4obm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuLCBhdHRlbXB0KSwgcG9saWN5LCB7XG4gICAgICBzZXJpZXM6IGNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAuLi4oZWZmZWN0ICE9PSB1bmRlZmluZWQgJiYgeyBlZmZlY3QgfSksXG4gICAgICBzaWduYWw6IHRoaXMuc2lnbmFsLFxuICAgICAgLi4uKHRoaXMuZGVhZGxpbmUgIT09IHVuZGVmaW5lZCAmJiB7IGRlYWRsaW5lOiB0aGlzLmRlYWRsaW5lIH0pLFxuICAgICAgLy8gU3RhZ2VSdW5uZXIgcmFjZXMgdGhlIGF0dGVtcHQncyBzaWduYWwgYXQgdGhlIHN0YWdlIGJvdW5kYXJ5OiBvbmUgYXdhaXQgcGVyIGF0dGVtcHQsIGFzIGluIDkuMTUuXG4gICAgICByYWNlZDogdHJ1ZSxcbiAgICAgIHNlcnZlOiAoZXJyb3IpID0+IHNlcnZlZFN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpLFxuICAgICAgLy8gVGhlIGZlbmNlOiB0aGUgbW9tZW50IGFuIGF0dGVtcHQgZW5kcyB3aXRob3V0IGFuIGFuc3dlciwgaXRzIHNjb3BlIG1heSBubyBsb25nZXIgdG91Y2ggdGhlIHN0YWdlLlxuICAgICAgb25BYmFuZG9uOiAoYXR0ZW1wdCkgPT4gY29udGV4dC5lbmRBdHRlbXB0KGF0dGVtcHQpLFxuICAgICAgLy8gQXR0ZW1wdCBpc29sYXRpb246IGRyb3AgZXZlcnl0aGluZyBhIGZhaWxlZCBhdHRlbXB0IHN0YWdlZCBCRUZPUkUgdGhlXG4gICAgICAvLyBuZXh0IG9uZSBzdGFydHMuIE5vdGhpbmcgd2FzIGFwcGxpZWQsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gcm9sbFxuICAgICAgLy8gYmFjayDigJQgc2VlIFN0YWdlQ29udGV4dC5kaXNjYXJkU3RhZ2VkKCkuXG4gICAgICBiZXR3ZWVuOiAoKSA9PiBjb250ZXh0LmRpc2NhcmRTdGFnZWQoKSxcbiAgICAgIG9uQXR0ZW1wdDogKHJlY29yZCwgc3RydWN0dXJlZEVycm9yKSA9PiB7XG4gICAgICAgIGNvbnRleHQucmVjb3JkQXR0ZW1wdChyZWNvcmQpO1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkF0dGVtcHQobm9kZS5uYW1lLCBub2RlLmlkLCByZWNvcmQsIHN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICB9LFxuICAgICAgLy8gRmlyZWQgQkVGT1JFIHRoZSB3YWl0OiBhIGxpdmUgbW9uaXRvciBsZWFybnMgXCJyZXRyeWluZyBpbiA1MDBtc1wiIHdoZW5cbiAgICAgIC8vIHRoZSBkZWNpc2lvbiBpcyBtYWRlLCBub3Qgb25jZSBpdCBoYXMgYWxyZWFkeSBlbGFwc2VkLlxuICAgICAgb25SZXRyeTogKGF0dGVtcHQsIG9mLCBkZWxheU1zLCBzdHJ1Y3R1cmVkRXJyb3IpID0+XG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VSZXRyeShcbiAgICAgICAgICBub2RlLm5hbWUsXG4gICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgIG9mLFxuICAgICAgICAgIGRlbGF5TXMsXG4gICAgICAgICAgc3RydWN0dXJlZEVycm9yLFxuICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICksXG4gICAgICBvbkVuZDogKHN1bW1hcnkpID0+IGNvbnRleHQuZW5kQXR0ZW1wdHMoc3VtbWFyeSksXG4gICAgICAvLyBBIHByZWRpY2F0ZSBtYXkgcmV0aHJvdyB0aGUgc3RhZ2UncyBvd24gZXJyb3I6IHRoZSBsb2dnZXIgZ2V0cyB0aGUgc2VydmVkIGZvcm0uXG4gICAgICBvblJldHJ5T25UaHJldzogKHRocm93bikgPT5cbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignW2Zvb3RwcmludF0gcmV0cnlPbiBwcmVkaWNhdGUgdGhyZXc7IHRyZWF0aW5nIHRoZSBmYWlsdXJlIGFzIGZpbmFsJywge1xuICAgICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dCwgdGhyb3duKSxcbiAgICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQSB0b3VjaGluZyBzdGFnZSdzIHNpZGUtZWZmZWN0IHRhcmdldCBmb3IgVEhJUyBleGVjdXRpb24gKFAzLCBkZXNpZ24gwqczLjMpLiBUaGUgbGF3IGZpcnN0IOKAlCBhIGNoYXJ0IGVkaXRlZFxuICAgKiBhZnRlciBgYnVpbGQoKWAgcmVhY2hlcyB0aGUgc3RhZ2Ugd2l0aG91dCB0aGUgYnVpbGRlcidzIHJlZnVzYWwsIHNvIHRoZSBzdGFnZSBhc2tzIGB0b3VjaGVzUHJvYmxlbWAgaXRzZWxmICh0aGVcbiAgICogbGFzdCBkb29yKS4gVGhlbiB0aGUga2V5OiB0aGUgZGVjbGFyZWQgcnVsZSBydW5zIE9OQ0UgcGVyIGV4ZWN1dGlvbiwgYmVmb3JlIGF0dGVtcHQgMSwgaGFuZGVkIHRoZSBmcm96ZW4gaW5wdXQsXG4gICAqIHRoZSBydW4gaWQgYW5kIHRoaXMgZXhlY3V0aW9uJ3MgaWQ7IGl0cyBhbnN3ZXIgaXMgYWRtaXR0ZWQgKGBhZG1pdElkZW1wb3RlbmN5S2V5YCDigJQgdGhlIGZvcm1hdCwgbmV2ZXIgZWNob2VkKSBhbmRcbiAgICogc2VydmVkIHVuZGVyIHRoZSBydW4ncyBkaWFnbm9zdGljIHJ1bGUgYXMgYHsgaWRlbXBvdGVuY3lLZXkgfWAgZm9yIHRoZSByZWNvcmRzLiBUaHJvd3Mgb24gYW55IHJlZnVzYWwuXG4gICAqL1xuICBwcml2YXRlIGVmZmVjdFRhcmdldChcbiAgICBzdGFnZUlkOiBzdHJpbmcsXG4gICAgdG91Y2hlczogU3RhZ2VUb3VjaGVzLFxuICAgIHJldHJ5OiBSZXRyeVBvbGljeSB8IHVuZGVmaW5lZCxcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICk6IEVmZmVjdFRhcmdldCB7XG4gICAgY29uc3QgcHJvYmxlbSA9IHRvdWNoZXNQcm9ibGVtKHRvdWNoZXMsIHJldHJ5KTtcbiAgICBpZiAocHJvYmxlbSAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYFtmb290cHJpbnRdIHN0YWdlICcke3N0YWdlSWR9JzogJHtwcm9ibGVtfWApO1xuICAgIGNvbnN0IHJ1bGUgPSB0b3VjaGVzLmlkZW1wb3RlbmN5S2V5O1xuICAgIGlmIChydWxlID09PSB1bmRlZmluZWQpIHJldHVybiB7IHN5c3RlbTogdG91Y2hlcy5zeXN0ZW0gfTtcbiAgICBjb25zdCB3aGVyZSA9IGBbZm9vdHByaW50XSBzdGFnZSAnJHtzdGFnZUlkfScgKHRvdWNoZXMgXCIke3RvdWNoZXMuc3lzdGVtfVwiKWA7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZGVwcy5yZWFkT25seUNvbnRleHQ7XG4gICAgLy8gQSByZXN1bWVkIGxlZydzIHJvb3QgaGFzIG5vIGlucHV0IOKAlCB0aGUgcnVuJ3MgZG9lcyBub3QgY3Jvc3MgYSByZXN1bWUg4oCUIHNvIGEgcnVsZSB0aGF0IHJlYWRzIGBhcmdzYCB0aGVyZSBpc1xuICAgIC8vIHJlZnVzZWQgcmF0aGVyIHRoYW4gaGFuZGVkIG5vdGhpbmcgKGFuIGBvcmRlci11bmRlZmluZWRgIGtleSB3b3VsZCBtYWtlIGRpc3RpbmN0IG9wZXJhdGlvbnMgb25lKS5cbiAgICBjb25zdCBpbnB1dExvc3QgPSB0aGlzLnJlc3VtZSAhPT0gdW5kZWZpbmVkICYmIGFyZ3MgPT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZWRhY3Rpb24gPSBjb250ZXh0LmdldFJlZGFjdGlvblJ1bGUoKTtcbiAgICAvLyBBIGtleSBhIGNoZWNrcG9pbnQgY2FycmllZCBoYXMgdW5rbm93biBzb3VyY2VzIGhlcmUgKHRoZSBpbnB1dCBpdCB3YXMgbWFkZSBvZiBkaWQgbm90IGNyb3NzIHRoZSByZXN1bWUpOiBpdCBpc1xuICAgIC8vIHNlcnZlZCBhcyBvbmUgbWFkZSBvZiBhIHNlbGVjdGVkIHZhbHVlIOKAlCB0aGUgcGxhY2Vob2xkZXIgdW5kZXIgYW55IHN0YXRlIHJ1bGUuXG4gICAgbGV0IHJlYWRTZWxlY3RlZCA9IGlzQ2FycmllZFRvdWNoZXModG91Y2hlcyk7XG4gICAgY29uc3Qga2V5ID0gYWRtaXRJZGVtcG90ZW5jeUtleShcbiAgICAgIHdoZXJlLFxuICAgICAgcnVsZShcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgZ2V0IGFyZ3MoKTogdW5rbm93biB7XG4gICAgICAgICAgICBpZiAoaW5wdXRMb3N0KSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgJHt3aGVyZX06IHRoZSBydW4ncyBpbnB1dCBkb2VzIG5vdCBjcm9zcyBhIHJlc3VtZSDigJQgZGVyaXZlIHRoZSBrZXkgZnJvbSBzdGF0ZSAoZ2V0U3RhdGUpIGluc3RlYWRgLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBydW5JZDogdGhpcy5ydW5JZCxcbiAgICAgICAgICBydW50aW1lU3RhZ2VJZDogY29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgICAvLyBDb21taXR0ZWQgc3RhdGUsIHJlYWQgc2lsZW50bHkgKHRoZSBrZXkgaXMgbm90IGEgd3JpdGUpOyBhIHNlbGVjdGVkIHZhbHVlIHRhaW50cyB0aGUgcmVjb3JkZWQga2V5LlxuICAgICAgICAgIC8vIEEgZnJvemVuIGNvcHkg4oCUIG5ldmVyIHRoZSBjb21taXR0ZWQgdmFsdWUgaXRzZWxmLCB3aGljaCBhIHJ1bGUgY291bGQgb3RoZXJ3aXNlIGVkaXQgd2l0aCBubyBjb21taXQgcm93LlxuICAgICAgICAgIGdldFN0YXRlOiAoc3RhdGVLZXk6IHN0cmluZyk6IHVua25vd24gPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250ZXh0LmdldFZhbHVlRGlyZWN0KFtdLCBzdGF0ZUtleSk7XG4gICAgICAgICAgICBpZiAocmVkYWN0aW9uICYmICFyZWRhY3Rpb24uaXNJbmVydCgpICYmIHJlZGFjdGlvbi52ZXJkaWN0T2ZSZWFkKHN0YXRlS2V5LCB2YWx1ZSkua2luZCAhPT0gJ2NsZWFyJykge1xuICAgICAgICAgICAgICByZWFkU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBmcmVlemVEZWVwKHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkpIDogdmFsdWU7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG4gICAgY29uc3QgcmVjb3JkZWRLZXkgPSBzZXJ2ZWRJZGVtcG90ZW5jeUtleShjb250ZXh0LCBrZXksIGFyZ3MsIHJlYWRTZWxlY3RlZCk7XG4gICAgcmV0dXJuIHsgc3lzdGVtOiB0b3VjaGVzLnN5c3RlbSwgaWRlbXBvdGVuY3lLZXk6IGtleSwgcmVjb3JkZWRLZXkgfTtcbiAgfVxuXG4gIC8qKiBPbmUgY2FsbCBvZiBhIHN0YWdlIHdpdGggbm8gcmV0cnkgcG9saWN5LCB0aHJvdWdoIGFuIGFzeW5jIGZyYW1lIOKAlCB0aGUgcHJlLTEwLjEgbWljcm90YXNrIHNoYXBlLiAqL1xuICBwcml2YXRlIGFzeW5jIHJ1blN0YWdlT25jZShcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbjogKCkgPT4gdm9pZCxcbiAgKTogUHJvbWlzZTxUT3V0PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VSdW5uZXIucnVuKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJ1bi10aW1lIGRvb3IgZm9yIG5vZGVzIGEgc3RhZ2UgUkVUVVJOUyAoaXRzIGBuZXh0YCBjaGFpbiwgYGNoaWxkcmVuYFxuICAgKiBhbmQgc3ViZmxvdyBpZHMpIOKAlCB0aGUgYnVpbGRlciBuZXZlciBzYXcgdGhlbSwgc28gdGhpcyBhcHBsaWVzIHRoZVxuICAgKiBidWlsZGVyJ3MgcmVmdXNhbHM6XG4gICAqICAgLSBSNSwgaWRzOiBgaWRzL3Jlc2VydmVkSWRzLnRzIMK3IHJlZnVzZVJlc2VydmVkSWRgLCBzbyBcIm5vIHVzZXIgaWRcbiAgICogICAgIGNhcnJpZXMgYSBncmFtbWFyIGRlbGltaXRlclwiIHN0YXlzIHRydWUgYnkgY29uc3RydWN0aW9uLiBMb29wLXJlZiBzdHVic1xuICAgKiAgICAgKHRoZXkgbmFtZSBhbiBleGlzdGluZyBub2RlKSBhbmQgdGhlIGNoYXJ0J3Mgb3duIG5vZGVzIChhZG1pdHRlZCBhdFxuICAgKiAgICAgYnVpbGQ7IGEgcHJlZml4ZWQgaWQgY2FycmllcyBgL2Agb24gcHVycG9zZSkgYXJlIG5vdCBuZXcgaWRzIGFuZCBhcmVcbiAgICogICAgIHNraXBwZWQuXG4gICAqICAgLSBhIGRlY2xhcmVkIGByZXRyeWA6IGBhdHRlbXB0L3BvbGljeS50cyDCtyByZXRyeVBvbGljeVByb2JsZW1gLCB0aGUgcnVsZVxuICAgKiAgICAgYEZsb3dDaGFydEJ1aWxkZXIgwrcgYXBwbHlSZXRyeVBvbGljeWAgYXBwbGllcyBhdCBidWlsZCDigJQgYGF0dGVtcHRzYFxuICAgKiAgICAgbXVzdCBiZSBhIHdob2xlIG51bWJlciA+PSAxLCBuZXZlciBgTmFOYCwgYEluZmluaXR5YCBvciBgMGAuXG4gICAqICAgLSBhIGRlY2xhcmVkIGB0b3VjaGVzYDogYGF0dGVtcHQvZWZmZWN0LnRzIMK3IHRvdWNoZXNQcm9ibGVtYCwgdGhlIHJ1bGVcbiAgICogICAgIGBGbG93Q2hhcnRCdWlsZGVyIMK3IGFwcGx5VG91Y2hlc2AgYXBwbGllcyBhdCBidWlsZCDigJQgYSBub2RlIHRoYXRcbiAgICogICAgIHRvdWNoZXMgYW4gb3V0c2lkZSBzeXN0ZW0gYW5kIG1heSByZXRyeSBtdXN0IGRlY2xhcmUgYSBrZXkgcnVsZS5cbiAgICogQSBzdWJmbG93IGRlZmluaXRpb24ncyBvd24gdHJlZSBpcyBhIGJ1aWx0IGNoYXJ0IGFuZCBpcyBub3Qgd2Fsa2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBhZG1pdER5bmFtaWNOb2RlcyhvdXRwdXQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIW91dHB1dCB8fCB0eXBlb2Ygb3V0cHV0ICE9PSAnb2JqZWN0JyB8fCAhaXNTdGFnZU5vZGVSZXR1cm4ob3V0cHV0KSkgcmV0dXJuO1xuICAgIGNvbnN0IHJvb3QgPSBvdXRwdXQgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgY29uc3QgcmVmdXNlID0gKHJlZnVzYWw6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKHJlZnVzYWwgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBbZm9vdHByaW50XSBkeW5hbWljIFN0YWdlTm9kZTogJHtyZWZ1c2FsfWApO1xuICAgIH07XG4gICAgaWYgKHJvb3Quc3ViZmxvd0lkKSByZWZ1c2UocmVmdXNlUmVzZXJ2ZWRJZCgnZHluYW1pYyBzdWJmbG93IGlkJywgcm9vdC5zdWJmbG93SWQsICdzZWdtZW50JykpO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+PigpO1xuICAgIGNvbnN0IHN0YWNrOiBBcnJheTxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZD4gPSBbcm9vdC5uZXh0LCAuLi4ocm9vdC5jaGlsZHJlbiA/PyBbXSldO1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuID0gc3RhY2sucG9wKCk7XG4gICAgICBpZiAoIW4gfHwgc2Vlbi5oYXMobikgfHwgbi5pc0xvb3BSZWYpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQobik7XG4gICAgICBpZiAobi5yZXRyeSkge1xuICAgICAgICBjb25zdCBwcm9ibGVtID0gcmV0cnlQb2xpY3lQcm9ibGVtKG4ucmV0cnkpO1xuICAgICAgICBpZiAocHJvYmxlbSAhPT0gdW5kZWZpbmVkKSByZWZ1c2UoYHN0YWdlICcke24uaWR9JzogJHtwcm9ibGVtfWApO1xuICAgICAgfVxuICAgICAgLy8gQSB0b3VjaGluZyBub2RlIGlzIGhlbGQgdG8gdGhlIGJ1aWxkIGxhdyAoUDMpOiBubyByZXRyeSBvZiBhbiBvdXRzaWRlIGVmZmVjdCB3aXRob3V0IGEga2V5IHJ1bGUuXG4gICAgICBpZiAobi50b3VjaGVzICE9PSB1bmRlZmluZWQpIHJlZnVzZSh0b3VjaGVzUmVmdXNhbChuKSk7XG4gICAgICBjb25zdCByZWZ1c2FsID1cbiAgICAgICAgcmVmdXNlUmVzZXJ2ZWRJZCgnZHluYW1pYyBzdGFnZSBpZCcsIG4uaWQsICdzdGFnZScpID8/XG4gICAgICAgIChuLnN1YmZsb3dJZCA/IHJlZnVzZVJlc2VydmVkSWQoJ2R5bmFtaWMgc3ViZmxvdyBpZCcsIG4uc3ViZmxvd0lkLCAnc2VnbWVudCcpIDogdW5kZWZpbmVkKTtcbiAgICAgIGlmIChyZWZ1c2FsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gT25seSBhIFNVU1BFQ1QgaWQgcGF5cyBmb3IgdGhlIGNoYXJ0IGxvb2t1cDogYSBjaGFydCBub2RlIChhbmQgdGhlXG4gICAgICAgIC8vIGNoYXJ0IGJlbG93IGl0KSB3YXMgYWRtaXR0ZWQgYXQgYnVpbGQuXG4gICAgICAgIGlmICh0aGlzLm5vZGVSZXNvbHZlci5maW5kTm9kZUJ5SWQobi5pZCkgPT09IG4pIGNvbnRpbnVlO1xuICAgICAgICByZWZ1c2UocmVmdXNhbCk7XG4gICAgICB9XG4gICAgICBzdGFjay5wdXNoKG4ubmV4dCwgLi4uKG4uY2hpbGRyZW4gPz8gW10pKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJhbXBvbGluZSBkcml2ZXIg4oCUIHByZS1vcmRlciBERlMgdHJhdmVyc2FsIGVudHJ5IHBvaW50LlxuICAgKlxuICAgKiBSdW5zIGBleGVjdXRlTm9kZVN0ZXBgIChvbmUgbm9kZSwgYWxsIDcgcGhhc2VzKSBpbiBhIGZsYXQgbG9vcDogZXZlcnlcbiAgICogVEFJTCBjb250aW51YXRpb24gKGxpbmVhciBgbmV4dGAsIGxvb3AgZWRnZSwgZHluYW1pYyBuZXh0IC8gZHluYW1pY1xuICAgKiByZS1lbnRyeSwgbm8tY29udGludWF0aW9uIGRlY2lkZXIgZGlzcGF0Y2gpIGNvbWVzIGJhY2sgYXMgYVxuICAgKiBgQ29udGludWF0aW9uSG9wYCBhbmQgaXMgZm9sbG93ZWQgSVRFUkFUSVZFTFkg4oCUIG5laXRoZXIgdGhlIGNhbGwgc3RhY2tcbiAgICogbm9yIHRoZSByZXRhaW5lZCBwcm9taXNlIGNoYWluIGdyb3dzIHdpdGggY2hhaW4gbGVuZ3RoIG9yIGxvb3AgY291bnQuXG4gICAqXG4gICAqIFJlY3Vyc2lvbiByZW1haW5zIE9OTFkgZm9yIHRydWUgdHJlZSBuZXN0aW5nIChlYWNoIGdldHMgYSBuZXN0ZWQgZHJpdmVyXG4gICAqIGNhbGwpOiBmb3JrIGNoaWxkcmVuIChgQ2hpbGRyZW5FeGVjdXRvcmApLCBzZWxlY3RvciBicmFuY2hlcyAocGFyYWxsZWxcbiAgICogZmFuLW91dCksIGRlY2lkZXIgYnJhbmNoIGRpc3BhdGNoIHdoZW4gdGhlIGRlY2lkZXIgaGFzIGl0cyBvd24gYG5leHRgXG4gICAqICh0aGUgYnJhbmNoIG11c3QgY29tcGxldGUgQkVGT1JFIHRoZSBkZWNpZGVyJ3MgY29udGludWF0aW9uIHJ1bnMpLCBhbmRcbiAgICogc3ViZmxvdyBtb3VudHMgKGZyZXNoIHRyYXZlcnNlcjsgdGhlIG1vdW50IGZyYW1lIHN0YXlzIGluIHRoZSBwYXJlbnQpLlxuICAgKiBgX2V4ZWN1dGVEZXB0aGAgdGhlcmVmb3JlIGNvdW50cyBjaGFydCBDT01QT1NJVElPTiBkZXB0aCBvbmx5LCBndWFyZGVkXG4gICAqIGJ5IGBfbWF4RGVwdGhgIChkZWZhdWx0IGBNQVhfRVhFQ1VURV9ERVBUSGAgPSA1MDApLlxuICAgKlxuICAgKiBQYXVzZVNpZ25hbDogYSBmbGF0IGRlY2lkZXIgZGlzcGF0Y2ggcmVjb3JkcyBhbiBgSW52b2tlclN0YW1wYDsgaWYgdGhlXG4gICAqIGNvbnRpbnVlZCBjaGFpbiBsYXRlciBwYXVzZXMsIHRoZSBkcml2ZXIgc3RhbXBzIHRoZSBzaWduYWwgZHVyaW5nXG4gICAqIHVud2luZCDigJQgc2FtZSBpbnZva2VyIGNvbnRleHQgdGhlIHJlY3Vyc2l2ZSBkaXNwYXRjaCdzIGNhdGNoIHVzZWQgdG9cbiAgICogc3RhbXAsIGlubmVybW9zdCAobW9zdCByZWNlbnQgZGlzcGF0Y2gpIGZpcnN0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTm9kZShcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiBCcmVha0ZsYWcsXG4gICAgYnJhbmNoUGF0aD86IHN0cmluZyxcbiAgICBlbmNsb3Npbmc/OiBFbmNsb3NpbmdGcmFtZXMsXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgLy8g4pSA4pSA4pSAIFRyZWUtZGVwdGggZ3VhcmQg4pSA4pSA4pSAXG4gICAgLy8gRGVwdGggaXMgdGhlIENBTEwgUEFUSCdzIG5lc3RpbmcsIHJlYWQgb2ZmIHRoZSBjb250ZXh0IHRoaXMgZHJpdmVyIHdhc1xuICAgIC8vIGhhbmRlZCAoc2VlIGBfZnJhbWVPZmApIOKAlCBzaWJsaW5ncyBuZXZlciBjb25zdW1lIGl0LiBBIHJlYWNoZWQgY2FwIGlzIGFcbiAgICAvLyBSVU4gZmFpbHVyZTogYG9uRXJyb3JgIGZpcmVzIGhlcmUgKG5vIHN0YWdlIHJhbiBmb3IgdGhpcyBub2RlLCBzbyBub1xuICAgIC8vIHN0YWdlIGNhdGNoIHdvdWxkKSBhbmQgYENoaWxkcmVuRXhlY3V0b3JgIHJldGhyb3dzIGl0IHdoYXRldmVyIHRoZVxuICAgIC8vIGZhbi1vdXQncyBlcnJvciBtb2RlLlxuICAgIGNvbnN0IGRlcHRoID0gdGhpcy5uZXN0aW5nRGVwdGhPZihjb250ZXh0KTtcbiAgICBpZiAoZGVwdGggPiB0aGlzLl9tYXhEZXB0aCkge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgVHJhdmVyc2FsRGVwdGhFcnJvcih0aGlzLl9tYXhEZXB0aCwgbm9kZS5uYW1lKTtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uRXJyb3Iobm9kZS5uYW1lLCB0aHJvd25UZXh0KGVycm9yKSwgZXh0cmFjdEVycm9ySW5mbyhlcnJvcikpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLy8gSW52b2tlciBzdGFtcHMgZnJvbSBmbGF0IGRlY2lkZXIgZGlzcGF0Y2hlcyBpbiBUSElTIGRyaXZlciDigJQga2VwdFxuICAgIC8vIGxvY2FsIHNvIG5lc3RlZCBkcml2ZXJzIChmb3JrIGNoaWxkcmVuLCB3aXRoLW5leHQgZGVjaWRlciBicmFuY2hlcylcbiAgICAvLyBnZXQgdGhlaXIgb3duIHdpbmRvd3MsIG1hdGNoaW5nIHRoZSBvbGQgZnJhbWUtb24tc3RhY2sgc3RhbXBpbmcgc2NvcGUuXG4gICAgbGV0IHBlbmRpbmdJbnZva2VyczogSW52b2tlclN0YW1wW10gfCB1bmRlZmluZWQ7XG4gICAgLy8gRXZlcnkgZHJpdmVyIHJlbWVtYmVycyB0aGUgbm9kZXMgaXQgcmFuLiBBIGRlY2lkZXIncyBCUkFOQ0ggRlJBTUVcbiAgICAvLyAoZGVjaWRlciB3aXRoIGl0cyBvd24gYG5leHRgOyBgZW5jbG9zaW5nYCA9IHRoZSByYW4tc2V0cyBvZiB0aGUgZHJpdmVyc1xuICAgIC8vIGl0IGlzIG5lc3RlZCBpbiArIHRoZSBgbmV4dGAgY2hhaW5zIG9mIHRoZSBkZWNpZGVycyB3aG9zZSBmcmFtZXMgaG9sZFxuICAgIC8vIGl0KSBMRUFWRVMgb24gYSBqdW1wIGJ5IGlkIChhIGBsb29wYCBob3ApIHRvIGEgbm9kZSB0aGlzIGZyYW1lIGRpZCBub3RcbiAgICAvLyBydW4gdGhhdCBpcyBlaXRoZXIgb25lIGFuIEVOQ0xPU0lORyBkcml2ZXIgYWxyZWFkeSByYW4gKGEgbG9vcCBiYWNrKSBvclxuICAgIC8vIG9uZSBvbiBhbiBlbmNsb3NpbmcgZGVjaWRlcidzIGBuZXh0YCBjaGFpbiAoYSBmb3J3YXJkIGp1bXAgaW50byB0aGVcbiAgICAvLyB0YWlsKSDigJQgdGhlIGhvcCBpcyBoYW5kZWQgYmFjayB0byB0aGUgZGVjaWRlciwgd2hpY2ggZm9sbG93cyBpdCBmbGF0XG4gICAgLy8gYXQgaXRzIG93biBsZXZlbCBhbmQgc2tpcHMgaXRzIGBuZXh0YCwgc28gbmVpdGhlciBhIGxvb3Agc3RhY2tzIG9uZVxuICAgIC8vIGZyYW1lIHBlciBwYXNzIG5vciBhIHRhaWwgcnVucyB0d2ljZS4gQW55IG90aGVyIGp1bXAgKHNpZGV3YXlzIHRvIGFcbiAgICAvLyBzaWJsaW5nIGJyYW5jaCkgc3RheXMgaW4gdGhlIGZyYW1lLCBhcyB0aHJvdWdoIDkuMzkuMC5cbiAgICBjb25zdCByYW5IZXJlID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgY29uc3QgZnJhbWU6IERyaXZlckZyYW1lID0ge1xuICAgICAgZGVwdGgsXG4gICAgICByYW46IGVuY2xvc2luZyA/IFsuLi5lbmNsb3NpbmcucmFuLCByYW5IZXJlXSA6IFtyYW5IZXJlXSxcbiAgICAgIHRhaWxzOiBlbmNsb3Npbmc/LnRhaWxzID8/IFtdLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjdXJyZW50OiBDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPiA9IHsgW0NPTlRJTlVFX0hPUF06IHRydWUsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGggfTtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgdGhpcy5fZnJhbWVPZi5zZXQoY3VycmVudC5jb250ZXh0LCBmcmFtZSk7XG4gICAgICAgIHJhbkhlcmUuYWRkKGN1cnJlbnQubm9kZS5pZCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZU5vZGVTdGVwKGN1cnJlbnQubm9kZSwgY3VycmVudC5jb250ZXh0LCBicmVha0ZsYWcsIGN1cnJlbnQuYnJhbmNoUGF0aCk7XG4gICAgICAgIGlmICghaXNDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPihyZXN1bHQpKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5jbG9zaW5nICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0Lmxvb3AgPT09IHRydWUgJiYgIXJhbkhlcmUuaGFzKHJlc3VsdC5ub2RlLmlkKSkge1xuICAgICAgICAgIGNvbnN0IGlkID0gcmVzdWx0Lm5vZGUuaWQ7XG4gICAgICAgICAgY29uc3QgaGFzID0gKGlkczogUmVhZG9ubHlTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPikgPT4gaWRzLmhhcyhpZCk7XG4gICAgICAgICAgaWYgKGVuY2xvc2luZy5yYW4uc29tZShoYXMpIHx8IGVuY2xvc2luZy50YWlscy5zb21lKGhhcykpIHJldHVybiByZXN1bHQ7IC8vIHRoZSBqdW1wIGxlYXZlcyB0aGlzIGZyYW1lXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5pbnZva2VyU3RhbXApIChwZW5kaW5nSW52b2tlcnMgPz89IFtdKS5wdXNoKHJlc3VsdC5pbnZva2VyU3RhbXApO1xuICAgICAgICBjdXJyZW50ID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBSZXBsYXkgaW52b2tlciBzdGFtcHMgbW9zdC1yZWNlbnQtZmlyc3QuIGBzZXRJbnZva2VyYCBpc1xuICAgICAgLy8gZmlyc3Qtd3JpdGUtd2lucywgc28gdGhlIGlubmVybW9zdCBkaXNwYXRjaCdzIHN0YW1wIGxhbmRzIOKAlCBleGFjdGx5XG4gICAgICAvLyB0aGUgb2xkIGJ1YmJsZS11cCBvcmRlciB0aHJvdWdoIG5lc3RlZCBjYXRjaCBmcmFtZXMuXG4gICAgICBpZiAocGVuZGluZ0ludm9rZXJzICE9PSB1bmRlZmluZWQgJiYgaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHBlbmRpbmdJbnZva2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGVycm9yLnNldEludm9rZXIocGVuZGluZ0ludm9rZXJzW2ldLmludm9rZXJTdGFnZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuZXN0aW5nIGRlcHRoIGEgZHJpdmVyIGhhbmRlZCBgY29udGV4dGAgcnVucyBhdDogb25lIGJlbG93IHRoZVxuICAgKiBkcml2ZXIgdGhhdCByYW4gdGhlIGNvbnRleHQgaXQgd2FzIGNyZWF0ZWQgZnJvbSwgMSBhdCB0aGUgdG9wIChhbmQgZm9yXG4gICAqIGEgY29udGV4dCB3aG9zZSBwYXJlbnQgbm8gZHJpdmVyIG9mIHRoaXMgdHJhdmVyc2VyIHJhbiDigJQgYSBzdWJmbG93J3NcbiAgICogcm9vdCwgYSByZXN1bWUncyBzdGFydCkuIFJlYWQgYnkgdGhlIGluc3RydW1lbnRhdGlvbiBpblxuICAgKiBgYmVuY2gvZGVwdGgtcHJvYmUudHNgIGFuZCB0aGUgdHJhbXBvbGluZSB0ZXN0cy5cbiAgICovXG4gIHByaXZhdGUgbmVzdGluZ0RlcHRoT2YoY29udGV4dDogU3RhZ2VDb250ZXh0KTogbnVtYmVyIHtcbiAgICBjb25zdCBwYXJlbnQgPSBjb250ZXh0LnBhcmVudDtcbiAgICByZXR1cm4gKHBhcmVudCA9PT0gdW5kZWZpbmVkID8gMCA6IHRoaXMuX2ZyYW1lT2YuZ2V0KHBhcmVudCk/LmRlcHRoID8/IDApICsgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IGEgZGVjaWRlcidzIGJyYW5jaCBmcmFtZSBpbmhlcml0czogdGhlIHJhbi1zZXRzIG9mIHRoZSBkcml2ZXJzIGl0IGlzXG4gICAqIG5lc3RlZCBpbiwgYW5kIGV2ZXJ5IGVuY2xvc2luZyBkZWNpZGVyJ3MgYG5leHRgIGNoYWluIHBsdXMgdGhpcyBvbmUncy5cbiAgICovXG4gIHByaXZhdGUgYnJhbmNoRnJhbWVGb3IoY29udGV4dDogU3RhZ2VDb250ZXh0LCBuZXh0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IEVuY2xvc2luZ0ZyYW1lcyB7XG4gICAgY29uc3Qgb3V0ZXIgPSB0aGlzLl9mcmFtZU9mLmdldChjb250ZXh0KTtcbiAgICByZXR1cm4geyByYW46IG91dGVyPy5yYW4gPz8gW10sIHRhaWxzOiBbLi4uKG91dGVyPy50YWlscyA/PyBbXSksIHRoaXMudGFpbElkcyhuZXh0KV0gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaWRzIG9uIGEgZGVjaWRlcidzIGBuZXh0YCBjaGFpbiDigJQgYG5leHRgLCBpdHMgYG5leHRgLCDigKYg4oCUIHVwIHRvIGFcbiAgICogbG9vcC1yZWYgc3R1YiAoYSBiYWNrLWVkZ2UsIG5vdCB0aGUgdGFpbCkuIENhY2hlZCBwZXIgY2hhaW4gaGVhZC5cbiAgICovXG4gIHByaXZhdGUgdGFpbElkcyhuZXh0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFJlYWRvbmx5U2V0PHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBpZHMgPSB0aGlzLl90YWlsSWRzLmdldChuZXh0KTtcbiAgICBpZiAoaWRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNoYWluID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICBmb3IgKGxldCBuOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCA9IG5leHQ7IG4gJiYgIW4uaXNMb29wUmVmICYmICFjaGFpbi5oYXMobi5pZCk7IG4gPSBuLm5leHQpIHtcbiAgICAgICAgY2hhaW4uYWRkKG4uaWQpO1xuICAgICAgfVxuICAgICAgaWRzID0gY2hhaW47XG4gICAgICB0aGlzLl90YWlsSWRzLnNldChuZXh0LCBpZHMpO1xuICAgIH1cbiAgICByZXR1cm4gaWRzO1xuICB9XG5cbiAgLyoqIEJ1aWxkIGEgZmxhdCBjb250aW51YXRpb24gaG9wIGZvciB0aGUgZHJpdmVyIGxvb3AuICovXG4gIHByaXZhdGUgaG9wKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgaW52b2tlclN0YW1wPzogSW52b2tlclN0YW1wLFxuICApOiBDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHsgW0NPTlRJTlVFX0hPUF06IHRydWUsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIC4uLihpbnZva2VyU3RhbXAgJiYgeyBpbnZva2VyU3RhbXAgfSkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgbG9vcCBlZGdlIChhIGBsb29wVG9gIHN0dWIgb3IgYSBieS1pZCBkeW5hbWljIG5leHQpIGFuZCBob3AgdG9cbiAgICogaXRzIHRhcmdldC4gVGhlIGhvcCBpcyBmbGFnZ2VkIGBsb29wYCB3aGVuIHRoZSByZXNvbHZlciBmb2xsb3dlZCBhXG4gICAqIGJhY2stcmVmZXJlbmNlLCBzbyBhIGRlY2lkZXIncyBicmFuY2ggZnJhbWUgY2FuIHRlbGwgYSBsb29wIHRoYXQgbGVhdmVzXG4gICAqIGl0IGZyb20gb25lIHRoYXQgc3RheXMgaW5zaWRlIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBsb29wSG9wKFxuICAgIGxvb3BSZWY6IHN0cmluZyB8IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNvbnRpbnVhdGlvblJlc29sdmVyLnJlc29sdmVUYXJnZXQobG9vcFJlZiwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgY29uc3QgaG9wID0gdGhpcy5ob3AodGFyZ2V0Lm5vZGUsIHRhcmdldC5jb250ZXh0LCBicmFuY2hQYXRoKTtcbiAgICByZXR1cm4gdGFyZ2V0Lm5vZGUgPT09IGxvb3BSZWYgPyBob3AgOiB7IC4uLmhvcCwgbG9vcDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIElzIHRoZSBkZWNpZGVyJ3Mgb3duIGBuZXh0YCB0aGUgc3R1YiBgbG9vcFRvYCBwbGFudGVkIChvciBhXG4gICAqIHJlZmVyZW5jZS1vbmx5IG5vZGUg4oCUIG5vIGZuLCBubyBjaGlsZHJlbiwgbm8gZGVjaWRlci9zZWxlY3Rvciwgbm90IGFcbiAgICogc3ViZmxvdyByb290KT8gVGhlIHNlbGVjdG9yJ3MgYW5kIHRoZSBtb3VudCdzIGNvbnRpbnVhdGlvbiBhc2tcbiAgICogYGlzTG9vcFJlZmAgYWxvbmUuXG4gICAqL1xuICBwcml2YXRlIGlzTG9vcFN0dWIobmV4dDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgbmV4dC5pc0xvb3BSZWYgPT09IHRydWUgfHxcbiAgICAgICghdGhpcy5nZXRTdGFnZUZuKG5leHQpICYmXG4gICAgICAgICF0aGlzLmVmZkNoaWxkcmVuKG5leHQpPy5sZW5ndGggJiZcbiAgICAgICAgIW5leHQuZGVjaWRlckZuICYmXG4gICAgICAgICFuZXh0LnNlbGVjdG9yRm4gJiZcbiAgICAgICAgIXRoaXMuZWZmSXNTdWJmbG93Um9vdChuZXh0KSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgT05FIG5vZGUgdGhyb3VnaCBhbGwgNyBwaGFzZXMg4oCUIHRoZSBvbGQgcmVjdXJzaXZlIGBleGVjdXRlTm9kZWBcbiAgICogYm9keTsgb25seSB0aGUgdGFpbCBjYWxscyBiZWNhbWUgYENvbnRpbnVhdGlvbkhvcGAgcmV0dXJucy4gUmV0dXJucyB0aGVcbiAgICogbm9kZSdzIHJlc3VsdCwgb3IgYSBob3AgZm9yIHRoZSBkcml2ZXIgbG9vcCB0byBmb2xsb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVOb2RlU3RlcChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiBCcmVha0ZsYWcsXG4gICAgYnJhbmNoUGF0aD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBBdHRhY2ggYnVpbGRlciBtZXRhZGF0YSB0byBjb250ZXh0IGZvciBzbmFwc2hvdCBlbnJpY2htZW50LlxuICAgIC8vIFN1YmZsb3cgbWV0YSByZWFkcyBnbyB0aHJvdWdoIHRoZSBkeW5hbWljLXBhdGNoIG92ZXJsYXkg4oCUIGEgbm9kZVxuICAgIC8vIHBhdGNoZWQgYnkgYSBkeW5hbWljLXN1YmZsb3cgcmV0dXJuIHJlLWVudGVycyBleGVjdXRlTm9kZSBhbmQgbXVzdFxuICAgIC8vIGNsYXNzaWZ5IGFzIGEgc3ViZmxvdyB3aXRob3V0IHRoZSBzaGFyZWQgbm9kZSBldmVyIGJlaW5nIG11dGF0ZWQuXG4gICAgaWYgKG5vZGUuZGVzY3JpcHRpb24pIGNvbnRleHQuZGVzY3JpcHRpb24gPSBub2RlLmRlc2NyaXB0aW9uO1xuICAgIGNvbnN0IGVmZlN1YmZsb3dJZCA9IHRoaXMuZWZmU3ViZmxvd0lkKG5vZGUpO1xuICAgIGlmICh0aGlzLmVmZklzU3ViZmxvd1Jvb3Qobm9kZSkgJiYgZWZmU3ViZmxvd0lkKSBjb250ZXh0LnN1YmZsb3dJZCA9IGVmZlN1YmZsb3dJZDtcblxuICAgIC8vIEFzc2lnbiBydW50aW1lU3RhZ2VJZCBCRUZPUkUgdHJhdmVyc2FsQ29udGV4dCBjcmVhdGlvbiDigJQgZW5zdXJlcyBzY29wZSBldmVudHNcbiAgICAvLyAoYnVmZmVyZWQgYnkgcnVudGltZVN0YWdlSWQpIGFuZCBmbG93IGV2ZW50cyAoZmx1c2hlZCBieSB0cmF2ZXJzYWxDb250ZXh0LnJ1bnRpbWVTdGFnZUlkKVxuICAgIC8vIHVzZSB0aGUgc2FtZSB2YWx1ZS4gTXVzdCBoYXBwZW4gYmVmb3JlIGV4ZWN1dGVTdGFnZSBBTkQgYmVmb3JlIHRyYXZlcnNhbENvbnRleHQuXG4gICAgY29uc3QgaWR4ID0gdGhpcy5fZXhlY3V0aW9uQ291bnRlci52YWx1ZSsrO1xuICAgIGNvbnRleHQucnVudGltZVN0YWdlSWQgPSBidWlsZFJ1bnRpbWVTdGFnZUlkKG5vZGUuaWQsIGlkeCk7XG4gICAgY29udGV4dC5iaW5kRW1pdE9yaWdpbih0aGlzLnJ1bklkLCB0aGlzLmVtaXREcmlsbFBhdGgpO1xuICAgIC8vIERlY2xhcmVkIHRhZ3MgKDkuMjEuMCkgcmlkZSB0aGUgc2FtZSBzdGFtcDogcGVyLW5vZGUgaWRlbnRpdHksIHNldFxuICAgIC8vIFVOQ09ORElUSU9OQUxMWSBzbyBhIHJlLXVzZWQgY29udGV4dCAoYSBsb29wJ3MgbmV4dC1jb250ZXh0LCBhIHJlc3VtZWRcbiAgICAvLyBsZWcpIG5ldmVyIGtlZXBzIGEgcHJldmlvdXMgbm9kZSdzIG5hbWVzLiBgU3RhZ2VDb250ZXh0LmNvbW1pdGAgcmVjb3Jkc1xuICAgIC8vIHRoZW0gb24gdGhlIGZpcnN0IGJ1bmRsZSBvZiB0aGlzIGV4ZWN1dGlvbiBhbmQgcmVsZWFzZXMgdGhlbS5cbiAgICBjb250ZXh0LnRhZ3MgPSBub2RlLnRhZ3M7XG5cbiAgICAvLyBSRkMtMDAzIEQxOiBydW50aW1lIHBhcmVudCDigJQgdGhlIHByZXZpb3VzIGV4ZWN1dGlvbiBzdGVwJ3MgcnVudGltZVN0YWdlSWQuXG4gICAgLy8gRmFsbHMgYmFjayB0byB0aGUgc3ViZmxvdyBNT1VOVCdzIHJ1bnRpbWVTdGFnZUlkIGZvciB0aGUgc3ViZmxvdyByb290XG4gICAgLy8gc3RhZ2UgKGl0cyBTdGFnZUNvbnRleHQgaXMgY3JlYXRlZCBmcmVzaCB3aXRoIG5vIHBhcmVudCksIHNvIHJ1bnRpbWVcbiAgICAvLyBhbmNlc3RvciBjaGFpbnMgY3Jvc3Mgc3ViZmxvdyBib3VuZGFyaWVzLiBgfHxgIChub3QgYD8/YCkgb24gcHVycG9zZTpcbiAgICAvLyBhIHBhcmVudCBjb250ZXh0IHRoYXQgbmV2ZXIgZXhlY3V0ZWQgc3RpbGwgY2FycmllcyB0aGUgZmllbGQnc1xuICAgIC8vIGluaXRpYWwgYCcnYCwgd2hpY2ggbXVzdCBhbHNvIGZhbGwgdGhyb3VnaCB0byB0aGUgbW91bnQgZmFsbGJhY2suXG4gICAgY29uc3QgcGFyZW50UnVudGltZVN0YWdlSWQgPSBjb250ZXh0LnBhcmVudD8ucnVudGltZVN0YWdlSWQgfHwgdGhpcy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkO1xuXG4gICAgLy8gbG9vcEl0ZXJhdGlvbiDigJQgaG93IG1hbnkgdGltZXMgVEhJUyBzdGFnZSBoYXMgcnVuIGJlZm9yZSBpbiB0aGlzIHJ1bi5cbiAgICAvLyBLZXllZCBieSB0aGUgc2FtZSBzdGFnZUlkIHdlIHN0YW1wIG9uIHRoZSBjb250ZXh0IChhbmQgdGhlIHNhbWUgdmFsdWUgdGhlXG4gICAgLy8gbmFycmF0aXZlIHJlY29yZGVyIGNvdW50cyBvbiksIHJ1bi1zY29wZWQgYW5kIHNoYXJlZCBhY3Jvc3Mgc3ViZmxvd1xuICAgIC8vIHJlLW1vdW50cyB2aWEgYF92aXNpdENvdW50c2AuIHVuZGVmaW5lZCBvbiB0aGUgZmlyc3QgdmlzaXQ7IDEgb24gdGhlXG4gICAgLy8gZmlyc3QgbG9vcC1iYWNrLCAyIG9uIHRoZSBuZXh0LCDigKYg4oCUIGkuZS4gdmlzaXRDb3VudCAtIDEuIENvdW50ZWQgZm9yXG4gICAgLy8gRVZFUlkgc3RhZ2Uga2luZCAoYW55IG5vZGUgY2FuIGJlIGEgbG9vcCB0YXJnZXQpLCB1bmxpa2UgdGhlIG5hcnJhdGl2ZVxuICAgIC8vIHJlY29yZGVyIHdoaWNoIG9ubHkgcmVuZGVycyBpdCBmb3IgbGluZWFyIHN0YWdlcy5cbiAgICBjb25zdCBjb250ZXh0U3RhZ2VJZCA9IG5vZGUuaWQgPz8gY29udGV4dC5zdGFnZUlkO1xuICAgIGNvbnN0IHZpc2l0Q291bnQgPSAodGhpcy5fdmlzaXRDb3VudHMuZ2V0KGNvbnRleHRTdGFnZUlkKSA/PyAwKSArIDE7XG4gICAgdGhpcy5fdmlzaXRDb3VudHMuc2V0KGNvbnRleHRTdGFnZUlkLCB2aXNpdENvdW50KTtcbiAgICBjb25zdCBsb29wSXRlcmF0aW9uID0gdmlzaXRDb3VudCA+IDEgPyB2aXNpdENvdW50IC0gMSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIEJ1aWxkIHRyYXZlcnNhbCBjb250ZXh0IGZvciByZWNvcmRlciBldmVudHMg4oCUIGNyZWF0ZWQgb25jZSBwZXIgc3RhZ2UsIHNoYXJlZCBieSBhbGwgZXZlbnRzXG4gICAgY29uc3QgdHJhdmVyc2FsQ29udGV4dCA9IHRyYXZlcnNhbENvbnRleHRGb3Ioe1xuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICBzdGFnZUlkOiBjb250ZXh0U3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBjb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3RhZ2VOYW1lOiBub2RlLm5hbWUsXG4gICAgICBwYXJlbnRTdGFnZUlkOiBjb250ZXh0LnBhcmVudD8uc3RhZ2VJZCxcbiAgICAgIHBhcmVudFJ1bnRpbWVTdGFnZUlkLFxuICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgIHN1YmZsb3dJZDogY29udGV4dC5zdWJmbG93SWQgPz8gdGhpcy5wYXJlbnRTdWJmbG93SWQsXG4gICAgICBzdWJmbG93UGF0aDogYnJhbmNoUGF0aCB8fCB1bmRlZmluZWQsXG4gICAgICAuLi4odGhpcy5jb3JyZWxhdGlvbiAmJiB7IGNvcnJlbGF0aW9uOiB0aGlzLmNvcnJlbGF0aW9uIH0pLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDBhOiBMQVpZIFJFU09MVkUg4oCUIGRlZmVycmVkIHN1YmZsb3cgcmVzb2x1dGlvbiDilIDilIDilIBcbiAgICAvLyBHdWFyZCB1c2VzIHRoZSBwZXItdHJhdmVyc2VyIHJlc29sdmVkTGF6eVN1YmZsb3dzIHNldCAobm90IHRoZSBzaGFyZWQgbm9kZSkgc29cbiAgICAvLyBjb25jdXJyZW50IHRyYXZlcnNlcnMgZG8gbm90IHJhY2Ugb24gbm9kZS5zdWJmbG93UmVzb2x2ZXIgb3IgY2xlYXIgaXQgZm9yIGVhY2ggb3RoZXIuXG4gICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCAmJiBub2RlLnN1YmZsb3dSZXNvbHZlciAmJiAhdGhpcy5yZXNvbHZlZExhenlTdWJmbG93cy5oYXMobm9kZS5zdWJmbG93SWQhKSkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBub2RlLnN1YmZsb3dSZXNvbHZlcigpO1xuICAgICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5wcmVmaXhOb2RlVHJlZShyZXNvbHZlZC5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBub2RlLnN1YmZsb3dJZCEpO1xuXG4gICAgICAvLyBSZWdpc3RlciB0aGUgcmVzb2x2ZWQgc3ViZmxvdyAoc2FtZSBwYXRoIGFzIGVhZ2VyIHJlZ2lzdHJhdGlvbilcbiAgICAgIHRoaXMuc3ViZmxvd3Nbbm9kZS5zdWJmbG93SWQhXSA9IHsgcm9vdDogcHJlZml4ZWRSb290IH07XG5cbiAgICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIHJlc29sdmVkLnN0YWdlTWFwKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gam9pblBhdGgobm9kZS5zdWJmbG93SWQhLCBrZXkpO1xuICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKHByZWZpeGVkS2V5KSkge1xuICAgICAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KHByZWZpeGVkS2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBzdWJmbG93c1xuICAgICAgaWYgKHJlc29sdmVkLnN1YmZsb3dzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhyZXNvbHZlZC5zdWJmbG93cykpIHtcbiAgICAgICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGpvaW5QYXRoKG5vZGUuc3ViZmxvd0lkISwga2V5KTtcbiAgICAgICAgICBpZiAoIXRoaXMuc3ViZmxvd3NbcHJlZml4ZWRLZXldKSB7XG4gICAgICAgICAgICAvLyBQcmVmaXhlZCBsaWtlIHRoZSBidWlsZGVyJ3MgYF9tb3VudFN1YmZsb3dgICg5LjM3LjAgZml4KTogdGhlXG4gICAgICAgICAgICAvLyBuZXN0ZWQgcm9vdCdzIGlkcyBsaXZlIHVuZGVyIHRoZSBsYXp5IG1vdW50J3MgcGF0aCB0b28uXG4gICAgICAgICAgICB0aGlzLnN1YmZsb3dzW3ByZWZpeGVkS2V5XSA9IHtcbiAgICAgICAgICAgICAgcm9vdDogcHJlZml4Tm9kZVRyZWUoKGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0pLnJvb3QsIG5vZGUuc3ViZmxvd0lkISksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcnVudGltZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbm93LXJlc29sdmVkIHNwZWNcbiAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgbm9kZS5zdWJmbG93SWQhLFxuICAgICAgICBub2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICByZXNvbHZlZC5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuXG4gICAgICAvLyBNYXJrIGFzIHJlc29sdmVkIGZvciBUSElTIHRyYXZlcnNlciDigJQgcGVyLXRyYXZlcnNlciBzZXQgcHJldmVudHMgcmUtZW50cnlcbiAgICAgIC8vIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHNoYXJlZCBTdGFnZU5vZGUgZ3JhcGggKHdoaWNoIHdvdWxkIHJhY2UgY29uY3VycmVudCB0cmF2ZXJzZXJzKS5cbiAgICAgIHRoaXMucmVzb2x2ZWRMYXp5U3ViZmxvd3MuYWRkKG5vZGUuc3ViZmxvd0lkISk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDA6IENMQVNTSUZZIOKAlCBzdWJmbG93IGRldGVjdGlvbiDilIDilIDilIBcbiAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkge1xuICAgICAgLy8gSGFuZCBoZWxwZXJzIHRoZSBFRkZFQ1RJVkUgbm9kZSB2aWV3IChidWlsdCBmaWVsZHMgKyBkeW5hbWljIHBhdGNoKVxuICAgICAgLy8gc28gU3ViZmxvd0V4ZWN1dG9yL05vZGVSZXNvbHZlciBuZXZlciByZWFkIHN0YWxlIGJ1aWx0IGZpZWxkcy5cbiAgICAgIGNvbnN0IG1vdW50Tm9kZSA9IHRoaXMuZWZmTm9kZShub2RlKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkTm9kZSA9IHRoaXMubm9kZVJlc29sdmVyLnJlc29sdmVTdWJmbG93UmVmZXJlbmNlKG1vdW50Tm9kZSk7XG5cbiAgICAgIGNvbnN0IHN1YmZsb3dPdXRwdXQgPSBhd2FpdCB0aGlzLnN1YmZsb3dFeGVjdXRvci5leGVjdXRlU3ViZmxvdyhcbiAgICAgICAgcmVzb2x2ZWROb2RlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMsXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpc1JlZmVyZW5jZUJhc2VkU3ViZmxvdyA9IHJlc29sdmVkTm9kZSAhPT0gbW91bnROb2RlO1xuICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBCb29sZWFuKG1vdW50Tm9kZS5jaGlsZHJlbiAmJiBtb3VudE5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCk7XG4gICAgICBjb25zdCBzaG91bGRFeGVjdXRlQ29udGludWF0aW9uID0gaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgfHwgaGFzQ2hpbGRyZW47XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBCcmVhay1mbGFnIGNoZWNrIEFGVEVSIHN1YmZsb3cgcmV0dXJucyDilIDilIDilIBcbiAgICAgIC8vIElmIHRoZSBzdWJmbG93IHdhcyBtb3VudGVkIHdpdGggYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCBhbmQgYnJva2VcbiAgICAgIC8vIGludGVybmFsbHksIGBTdWJmbG93RXhlY3V0b3JgIGhhcyBhbHJlYWR5IGZsaXBwZWQgb3VyIGJyZWFrRmxhZy5cbiAgICAgIC8vIFN0b3AgdGhlIG91dGVyIHRyYXZlcnNhbCBoZXJlIOKAlCBkbyBub3QgcnVuIHRoZSBuZXh0IGxpbmVhciBzdGFnZS5cbiAgICAgIGlmIChicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgcmV0dXJuIHN1YmZsb3dPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5leHQgJiYgc2hvdWxkRXhlY3V0ZUNvbnRpbnVhdGlvbikge1xuICAgICAgICAvLyBBIG1vdW50J3MgYG5leHRgIGNhbiBiZSBhIGxvb3AtcmVmIFNUVUIg4oCUIGEgc3ViZmxvdyBtb3VudGVkIGFzIGFcbiAgICAgICAgLy8gZGVjaWRlciBicmFuY2ggd2l0aCBgeyBsb29wVG8gfWAgLyBgLmxvb3BUbygpYC4gUmVzb2x2ZSBpdCBsaWtlXG4gICAgICAgIC8vIFBoYXNlIDYgZG9lcyAoaXRlcmF0aW9uIGNvdW50ZWQsIGBvbkxvb3BgIGZpcmVkKTsgaG9wcGluZyBpbnRvIHRoZVxuICAgICAgICAvLyBiYXJlIHN0dWIgcmFuIHRoZSB0YXJnZXQncyBmdW5jdGlvbiBvbmNlIGFuZCBlbmRlZCB0aGUgcnVuLlxuICAgICAgICBpZiAobm9kZS5uZXh0LmlzTG9vcFJlZikgcmV0dXJuIHRoaXMubG9vcEhvcChub2RlLm5leHQsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQubmFtZSwgbm9kZS5uZXh0LmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5vZGUubmV4dCwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwYjogUEFSQUxMRUwtRk9SLUVBQ0gg4oCUIGR5bmFtaWMgZmFuLW91dCwgb25lIGJyYW5jaCBwZXIgaXRlbSDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFNpdHMgQkVGT1JFIFBoYXNlIDEgKFZBTElEQVRFKSBvbiBwdXJwb3NlOiB0aGlzIG5vZGUgbGVnaXRpbWF0ZWx5IGhhcyBub1xuICAgIC8vIHN0YWdlIGZ1bmN0aW9uLCBubyBzdGF0aWMgY2hpbGRyZW4sIGFuZCBubyBkZWNpZGVyIOKAlCBpdHMgYnJhbmNoZXMgZG8gbm90XG4gICAgLy8gZXhpc3QgdW50aWwgYGl0ZW1zKClgIHJ1bnMg4oCUIHNvIHRoZSBcIm11c3QgZGVmaW5lIGZuIE9SIGNoaWxkcmVuXCIgY2hlY2tcbiAgICAvLyB3b3VsZCByZWplY3QgYSBwZXJmZWN0bHkgdmFsaWQgY2hhcnQuIFRoZSBoYW5kbGVyIG93bnMgaXRzIG93biBjb21taXRcbiAgICAvLyAodGhlIG9yZGVyZWQgcmVzdWx0cyBhcnJheSksIGxpa2UgdGhlIGRlY2lkZXIgYW5kIHNlbGVjdG9yIHBoYXNlcyBkby5cbiAgICBpZiAobm9kZS5pc0R5bmFtaWNQYXJhbGxlbCAmJiBub2RlLnBhcmFsbGVsRm9yRWFjaCkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucGFyYWxsZWxGb3JFYWNoSGFuZGxlci5ydW4obm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0Lm5hbWUsIG5vZGUubmV4dC5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLm5leHQsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhZ2VGdW5jID0gdGhpcy5nZXRTdGFnZUZuKG5vZGUpO1xuICAgIGNvbnN0IGhhc1N0YWdlRnVuY3Rpb24gPSBCb29sZWFuKHN0YWdlRnVuYyk7XG4gICAgY29uc3QgaXNTY29wZUJhc2VkRGVjaWRlciA9IEJvb2xlYW4obm9kZS5kZWNpZGVyRm4pO1xuICAgIGNvbnN0IGlzU2NvcGVCYXNlZFNlbGVjdG9yID0gQm9vbGVhbihub2RlLnNlbGVjdG9yRm4pO1xuICAgIGNvbnN0IGlzRGVjaWRlck5vZGUgPSBpc1Njb3BlQmFzZWREZWNpZGVyO1xuICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gQm9vbGVhbih0aGlzLmVmZkNoaWxkcmVuKG5vZGUpPy5sZW5ndGgpO1xuICAgIC8vIGBuZXh0YCBpcyBuZXZlciBvdmVybGFpZCDigJQgYSBkeW5hbWljIG5leHQgYXBwbGllcyBvbmx5IHRvIHRoZSB2aXNpdFxuICAgIC8vIHRoYXQgcHJvZHVjZWQgaXQgKGhhbmRsZWQgdmlhIHRoZSBgZHluYW1pY05leHRgIGxvY2FsIGJlbG93KSwgc28gdGhlXG4gICAgLy8gYnVpbHQgY2hhcnQncyBuZXh0IGlzIGFsd2F5cyB0aGUgY29ycmVjdCBjb250aW51YXRpb24gaGVyZS5cbiAgICBjb25zdCBoYXNOZXh0ID0gQm9vbGVhbihub2RlLm5leHQpO1xuICAgIGNvbnN0IG9yaWdpbmFsTmV4dCA9IG5vZGUubmV4dDtcblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAxOiBWQUxJREFURSDigJQgbm9kZSBpbnZhcmlhbnRzIOKUgOKUgOKUgFxuICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbiAmJiAhaXNEZWNpZGVyTm9kZSAmJiAhaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgTm9kZSAnJHtub2RlLm5hbWV9JyBtdXN0IGRlZmluZTogZW1iZWRkZWQgZm4gT1IgYSBzdGFnZU1hcCBlbnRyeSBPUiBoYXZlIGNoaWxkcmVuL2RlY2lkZXJgO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKGlzRGVjaWRlck5vZGUgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnRGVjaWRlciBub2RlIG5lZWRzIHRvIGhhdmUgY2hpbGRyZW4gdG8gZXhlY3V0ZSc7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAoaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnU2VsZWN0b3Igbm9kZSBuZWVkcyB0byBoYXZlIGNoaWxkcmVuIHRvIGV4ZWN1dGUnO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvLyBSb2xlIG1hcmtlcnMgZm9yIGRlYnVnIHBhbmVsc1xuICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbikge1xuICAgICAgaWYgKGlzRGVjaWRlck5vZGUpIGNvbnRleHQuc2V0QXNEZWNpZGVyKCk7XG4gICAgICBlbHNlIGlmIChoYXNDaGlsZHJlbikgY29udGV4dC5zZXRBc0ZvcmsoKTtcbiAgICB9XG5cbiAgICBjb25zdCBicmVha0ZuID0gY3JlYXRlQnJlYWtIYW5kbGVyKGJyZWFrRmxhZyk7XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMmE6IFNFTEVDVE9SIOKAlCBzY29wZS1iYXNlZCBtdWx0aS1jaG9pY2Ug4pSA4pSA4pSAXG4gICAgaWYgKGlzU2NvcGVCYXNlZFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBzZWxlY3RvclJlc3VsdCA9IGF3YWl0IHRoaXMuc2VsZWN0b3JIYW5kbGVyLmhhbmRsZVNjb3BlQmFzZWQoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHN0YWdlRnVuYyEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgdGhpcy5leGVjdXRlU3RhZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8gVGhlIGhhbmRsZXIgY29tbWl0dGVkIGFuZCByZWNvcmRlZCB0aGUgc3RvcC4gRG8gbm90IGNyZWF0ZSBhIG5leHRcbiAgICAgIC8vIGZyYW1lIG9yIHJlc29sdmUgYSBsb29wIGVkZ2UgZm9yIGEgc2VsZWN0b3IgdGhhdCBzdG9wcGVkIGhlcmUuXG4gICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG5cbiAgICAgIGlmIChoYXNOZXh0KSB7XG4gICAgICAgIC8vIEEgc2VsZWN0b3IncyBvd24gYGxvb3BUb2AgaXMgYSBsb29wIGVkZ2UgbGlrZSBhbnkgb3RoZXI6IHJlc29sdmVkXG4gICAgICAgIC8vIChpdGVyYXRpb24gZ3VhcmQgKyBgb25Mb29wYCksIG5ldmVyIGEgaG9wIGludG8gdGhlIGJhcmUgc3R1Yi5cbiAgICAgICAgaWYgKG5vZGUubmV4dCEuaXNMb29wUmVmID09PSB0cnVlKSByZXR1cm4gdGhpcy5sb29wSG9wKG5vZGUubmV4dCEsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQhLm5hbWUsIG5vZGUubmV4dCEuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5ob3Aobm9kZS5uZXh0ISwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDJiOiBERUNJREVSIOKAlCBzY29wZS1iYXNlZCBzaW5nbGUtY2hvaWNlIGNvbmRpdGlvbmFsIGJyYW5jaCDilIDilIDilIBcbiAgICBpZiAoaXNEZWNpZGVyTm9kZSkge1xuICAgICAgY29uc3QgZGlzcGF0Y2ggPSBhd2FpdCB0aGlzLmRlY2lkZXJIYW5kbGVyLnByZXBhcmVEaXNwYXRjaChcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3RhZ2VGdW5jISxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0aGlzLmV4ZWN1dGVTdGFnZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8gTm8gZGVjaWRlci1sZXZlbCBjb250aW51YXRpb24g4oaSIHRoZSBicmFuY2ggZGlzcGF0Y2ggaXMgYSB0YWlsXG4gICAgICAvLyBjYWxsLiBIYW5kIGl0IHRvIHRoZSBkcml2ZXIgYXMgYSBmbGF0IGhvcCBzbyBsb29wLWhlYXZ5IGRlY2lkZXJcbiAgICAgIC8vIGNoYXJ0cyAoZS5nLiBhZ2VudCBSZUFjdCBsb29wcyB3aXRoIGJyYW5jaC1zb3VyY2VkIGBsb29wVG9gKSBzdGF5XG4gICAgICAvLyBmbGF0LXN0YWNrZWQuIFRoZSBpbnZva2VyIHN0YW1wIHByZXNlcnZlcyBQYXVzZVNpZ25hbCBzZW1hbnRpY3Mg4oCUXG4gICAgICAvLyB0aGUgZGVjaWRlciBpcyB0aGUgaW52b2tlciBvZiB3aGF0ZXZlciBwYXVzZXMgaW4gdGhlIGNoYWluLlxuICAgICAgaWYgKCFoYXNOZXh0ICYmIGRpc3BhdGNoLmtpbmQgPT09ICdkaXNwYXRjaCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKGRpc3BhdGNoLmNob3NlbiwgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCwgYnJhbmNoUGF0aCwgeyBpbnZva2VyU3RhZ2VJZDogbm9kZS5pZCEgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlY2lkZXIgV0lUSCBpdHMgb3duIG5leHQ6IHRoZSBicmFuY2ggY2hhaW4gbXVzdCBjb21wbGV0ZSBCRUZPUkVcbiAgICAgIC8vIHRoZSBkZWNpZGVyJ3MgY29udGludWF0aW9uIHJ1bnMg4oCUIHRydWUgdHJlZSBuZXN0aW5nLCBrZXB0XG4gICAgICAvLyByZWN1cnNpdmUgKGEgbmVzdGVkIGRyaXZlciwgcnVuIGFzIGEgQlJBTkNIIEZSQU1FKS4gTWlycm9yc1xuICAgICAgLy8gaGFuZGxlU2NvcGVCYXNlZCBleGFjdGx5LCBpbmNsdWRpbmcgdGhlIFBhdXNlU2lnbmFsIGludm9rZXIgc3RhbXBcbiAgICAgIC8vIG9uIGJ1YmJsZS11cC5cbiAgICAgIGxldCBkZWNpZGVyUmVzdWx0OiBhbnk7XG4gICAgICBpZiAoZGlzcGF0Y2gua2luZCA9PT0gJ2JyZWFrJykge1xuICAgICAgICBkZWNpZGVyUmVzdWx0ID0gZGlzcGF0Y2guYnJhbmNoSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRlY2lkZXJSZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKFxuICAgICAgICAgICAgZGlzcGF0Y2guY2hvc2VuLFxuICAgICAgICAgICAgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCxcbiAgICAgICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgICB0aGlzLmJyYW5jaEZyYW1lRm9yKGNvbnRleHQsIG9yaWdpbmFsTmV4dCEpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgICAgICBlcnJvci5zZXRJbnZva2VyKG5vZGUuaWQhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGJyYW5jaCBMT09QRUQgT1VUIG9mIGl0cyBmcmFtZSAoYmFjayB0aHJvdWdoIHRoaXMgZGVjaWRlciBvclxuICAgICAgICAvLyBmdXJ0aGVyIHVwKTogdGhlIGJyYW5jaCBuZXZlciBjb21wbGV0ZWQsIHNvIHRoaXMgZGVjaWRlcidzIGBuZXh0YFxuICAgICAgICAvLyBpcyBub3QgZHVlIOKAlCBmb2xsb3cgdGhlIGxvb3AgZmxhdCBhdCB0aGlzIGxldmVsLiBUaGUgYG5leHRgIHJ1bnNcbiAgICAgICAgLy8gb25jZSwgYWZ0ZXIgdGhlIHBhc3Mgd2hvc2UgYnJhbmNoIGNvbXBsZXRlcyAoQ0xBVURFLm1kIFwibG9vcFwiOiBhXG4gICAgICAgIC8vIGZsYXQgaG9wIHdpdGggemVybyBzdGFjaykuXG4gICAgICAgIGlmIChpc0NvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+KGRlY2lkZXJSZXN1bHQpKSByZXR1cm4gZGVjaWRlclJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgLy8gQWZ0ZXIgYnJhbmNoIGV4ZWN1dGlvbiwgZm9sbG93IGRlY2lkZXIncyBvd24gbmV4dCAoZS5nLiwgbG9vcFRvIHRhcmdldClcbiAgICAgIGlmIChoYXNOZXh0ICYmICFicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuICAgICAgICAvLyBVc2UgdGhlIGlzTG9vcFJlZiBmbGFnIHNldCBieSBsb29wVG8oKSDigJQgZG8gbm90IHJlbHkgb24gc3RhZ2VNYXAgYWJzZW5jZSxcbiAgICAgICAgLy8gc2luY2UgaWQta2V5ZWQgc3RhZ2VNYXBzIHdvdWxkIG90aGVyd2lzZSBjYXVzZSBsb29wIHRhcmdldHMgdG8gYmUgZXhlY3V0ZWQgZGlyZWN0bHkuXG4gICAgICAgIGlmICh0aGlzLmlzTG9vcFN0dWIobmV4dE5vZGUpKSByZXR1cm4gdGhpcy5sb29wSG9wKG5leHROb2RlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcblxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbk5leHQobm9kZS5uYW1lLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5leHROb2RlLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlY2lkZXJSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIEFib3J0IGNoZWNrIOKAlCBjb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24g4pSA4pSA4pSAXG4gICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICB0aGlzLnNpZ25hbC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHRoaXMuc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcih0aGlzLnNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKTtcbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMzogRVhFQ1VURSDigJQgcnVuIHN0YWdlIGZ1bmN0aW9uIOKUgOKUgOKUgFxuICAgIGxldCBzdGFnZU91dHB1dDogVE91dCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZHluYW1pY05leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXR1cm5lZER5bmFtaWNOb2RlID0gZmFsc2U7XG5cbiAgICBpZiAoc3RhZ2VGdW5jKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFnZU91dHB1dCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN0YWdlKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIC8vIFRoZSBydW4tdGltZSBkb29yOiBhIHJldHVybmVkIFN0YWdlTm9kZSBhZG9wdHMgaWRzIChSNSkgYW5kIHJldHJ5XG4gICAgICAgIC8vIHBvbGljaWVzIHRoZSBidWlsZGVyIG5ldmVyIHNhdy4gUmVmdXNlZCBoZXJlLCBpbnNpZGUgdGhlIHRyeSwgc28gaXRcbiAgICAgICAgLy8gdGFrZXMgdGhlIHN0YWdlJ3MgZXJyb3IgcGF0aCAoY29tbWl0LCBvbkVycm9yLCByZXRocm93KS5cbiAgICAgICAgdGhpcy5hZG1pdER5bmFtaWNOb2RlcyhzdGFnZU91dHB1dCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIC8vIFBhdXNlU2lnbmFsIGlzIGV4cGVjdGVkIGNvbnRyb2wgZmxvdywgbm90IGFuIGVycm9yIOKAlCBmaXJlIG5hcnJhdGl2ZSwgY29tbWl0LCByZS10aHJvdy5cbiAgICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblBhdXNlKFxuICAgICAgICAgICAgbm9kZS5uYW1lLFxuICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgIHNlcnZlZFBhdXNlKGNvbnRleHQsIGVycm9yLnBhdXNlRGF0YSksXG4gICAgICAgICAgICBlcnJvci5zdWJmbG93UGF0aCxcbiAgICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPSByZWNvcmRTdGFnZUVycm9yKGNvbnRleHQsIGVycm9yKTtcbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25FcnJvcihub2RlLm5hbWUsIHNlcnZlZC5tZXNzYWdlLCBzZXJ2ZWQuc3RydWN0dXJlZEVycm9yLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7XG4gICAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbW1pdFN0YWdlKGNvbnRleHQsIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLCBub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKG5vZGUubmFtZSwgbm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgJ2xpbmVhcicpO1xuXG4gICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIC8vIEZvcndhcmQgdGhlIG9wdGlvbmFsIHJlYXNvbiBjYXB0dXJlZCBvbiBicmVha0ZsYWcg4oCUIHNldCBieSB0aGVcbiAgICAgICAgLy8gc3RhZ2UncyAkYnJlYWsocmVhc29uKSBjYWxsIE9SIGJ5IGEgc3ViZmxvdydzIHByb3BhZ2F0ZUJyZWFrLlxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCwgYnJlYWtGbGFnLnJlYXNvbik7XG4gICAgICAgIHJldHVybiBzdGFnZU91dHB1dDtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDQ6IERZTkFNSUMg4oCUIFN0YWdlTm9kZSByZXR1cm4gZGV0ZWN0aW9uIOKUgOKUgOKUgFxuICAgICAgaWYgKHN0YWdlT3V0cHV0ICYmIHR5cGVvZiBzdGFnZU91dHB1dCA9PT0gJ29iamVjdCcgJiYgaXNTdGFnZU5vZGVSZXR1cm4oc3RhZ2VPdXRwdXQpKSB7XG4gICAgICAgIGNvbnN0IGR5bmFtaWNOb2RlID0gc3RhZ2VPdXRwdXQgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgICAgIHJldHVybmVkRHluYW1pY05vZGUgPSB0cnVlO1xuICAgICAgICBjb250ZXh0LmFkZExvZygnaXNEeW5hbWljJywgdHJ1ZSk7XG4gICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljUGF0dGVybicsICdTdGFnZU5vZGVSZXR1cm4nKTtcblxuICAgICAgICAvLyBEeW5hbWljIHN1YmZsb3cgYXV0by1yZWdpc3RyYXRpb24uIFRoZSBzdWJmbG93IG1ldGEgbGFuZHMgaW4gdGhlXG4gICAgICAgIC8vIHRyYXZlcnNlci1sb2NhbCBvdmVybGF5IChOT1Qgb24gdGhlIHNoYXJlZCBub2RlKTsgdGhlIGltbWVkaWF0ZVxuICAgICAgICAvLyBleGVjdXRlTm9kZSByZS1lbnRyeSBzZWVzIGl0IHRocm91Z2ggdGhlIGVmZiogYWNjZXNzb3JzIGFuZFxuICAgICAgICAvLyBjbGFzc2lmaWVzIHRoZSBub2RlIGFzIGEgc3ViZmxvdyBtb3VudCBpbiBQaGFzZSAwLlxuICAgICAgICBpZiAoZHluYW1pY05vZGUuaXNTdWJmbG93Um9vdCAmJiBkeW5hbWljTm9kZS5zdWJmbG93RGVmICYmIGR5bmFtaWNOb2RlLnN1YmZsb3dJZCkge1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljUGF0dGVybicsICdkeW5hbWljU3ViZmxvdycpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljU3ViZmxvd0lkJywgZHluYW1pY05vZGUuc3ViZmxvd0lkKTtcblxuICAgICAgICAgIHRoaXMuYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihkeW5hbWljTm9kZS5zdWJmbG93SWQsIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWYsIG5vZGUuaWQpO1xuXG4gICAgICAgICAgdGhpcy5nZXRPckNyZWF0ZVBhdGNoKG5vZGUpLnN1YmZsb3dNZXRhID0ge1xuICAgICAgICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgICAgICAgIHN1YmZsb3dJZDogZHluYW1pY05vZGUuc3ViZmxvd0lkLFxuICAgICAgICAgICAgc3ViZmxvd05hbWU6IGR5bmFtaWNOb2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICAgICAgc3ViZmxvd01vdW50T3B0aW9uczogZHluYW1pY05vZGUuc3ViZmxvd01vdW50T3B0aW9ucyxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dJZCEsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWY/LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUmUtZW50ZXIgVEhJUyBub2RlIChzYW1lIGNvbnRleHQpOiB0aGUgb3ZlcmxheSBwYXRjaCBtYWtlcyB0aGVcbiAgICAgICAgICAvLyBuZXh0IHN0ZXAgY2xhc3NpZnkgaXQgYXMgYSBzdWJmbG93IG1vdW50IGluIFBoYXNlIDAuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgY2hpbGRyZW4gZm9yIHN1YmZsb3dEZWZcbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBkeW5hbWljTm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGNoaWxkLmlzU3ViZmxvd1Jvb3QgJiYgY2hpbGQuc3ViZmxvd0RlZiAmJiBjaGlsZC5zdWJmbG93SWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5hdXRvUmVnaXN0ZXJTdWJmbG93RGVmKGNoaWxkLnN1YmZsb3dJZCwgY2hpbGQuc3ViZmxvd0RlZiwgY2hpbGQuaWQpO1xuICAgICAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgICAgICAgICAgY2hpbGQuaWQsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd0lkISxcbiAgICAgICAgICAgICAgICBjaGlsZC5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBjaGlsZC5zdWJmbG93RGVmPy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHluYW1pYyBjaGlsZHJlbiAoZm9yayBwYXR0ZXJuKSDigJQgcGF0Y2hlZCBpbnRvIHRoZSBvdmVybGF5O1xuICAgICAgICAvLyBQaGFzZSA1IGJlbG93IHJlYWRzIHRoZW0gYmFjayB0aHJvdWdoIGVmZkNoaWxkcmVuL2VmZlNlbGVjdG9yLlxuICAgICAgICBpZiAoZHluYW1pY05vZGUuY2hpbGRyZW4gJiYgZHluYW1pY05vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVQYXRjaChub2RlKS5jaGlsZHJlbiA9IGR5bmFtaWNOb2RlLmNoaWxkcmVuO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljQ2hpbGRDb3VudCcsIGR5bmFtaWNOb2RlLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coXG4gICAgICAgICAgICAnZHluYW1pY0NoaWxkSWRzJyxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLmNoaWxkcmVuLm1hcCgoYykgPT4gYy5pZCksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljQ2hpbGRyZW4oXG4gICAgICAgICAgICBub2RlLmlkLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuY2hpbGRyZW4sXG4gICAgICAgICAgICBCb29sZWFuKGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3IpLFxuICAgICAgICAgICAgQm9vbGVhbihkeW5hbWljTm9kZS5kZWNpZGVyRm4pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVQYXRjaChub2RlKS5uZXh0Tm9kZVNlbGVjdG9yID0gZHluYW1pY05vZGUubmV4dE5vZGVTZWxlY3RvcjtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdoYXNTZWxlY3RvcicsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIER5bmFtaWMgbmV4dCAobGluZWFyIGNvbnRpbnVhdGlvbikg4oCUIHN0YXlzIGEgTE9DQUw6IGl0IGFwcGxpZXNcbiAgICAgICAgLy8gb25seSB0byB0aGlzIHZpc2l0IChQaGFzZSA2IHJvdXRlcyBpdCB0aHJvdWdoIHRoZVxuICAgICAgICAvLyBDb250aW51YXRpb25SZXNvbHZlciksIHNvIHRoZSBzaGFyZWQgbm9kZSdzIG5leHQgaXMgbmV2ZXIgdG91Y2hlZFxuICAgICAgICAvLyBhbmQgYSBsb29wIHJldmlzaXQgbmF0dXJhbGx5IHNlZXMgdGhlIGJ1aWx0IGNvbnRpbnVhdGlvbi5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLm5leHQpIHtcbiAgICAgICAgICBkeW5hbWljTmV4dCA9IGR5bmFtaWNOb2RlLm5leHQ7XG4gICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNOZXh0KG5vZGUuaWQsIGR5bmFtaWNOb2RlLm5leHQpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdoYXNEeW5hbWljTmV4dCcsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhZ2VPdXRwdXQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDU6IENISUxEUkVOIOKAlCBmb3JrIGRpc3BhdGNoIOKUgOKUgOKUgFxuICAgIC8vIFJlLXJlYWQgdGhyb3VnaCB0aGUgb3ZlcmxheTogUGhhc2UgNCBtYXkgaGF2ZSBqdXN0IHBhdGNoZWQgZHluYW1pY1xuICAgIC8vIGNoaWxkcmVuL3NlbGVjdG9yIGZvciBUSElTIHZpc2l0IChvciBhbiBlYXJsaWVyIHZpc2l0IGluIHRoaXMgcnVuKS5cbiAgICBjb25zdCBjaGlsZHJlbkFmdGVyU3RhZ2UgPSB0aGlzLmVmZkNoaWxkcmVuKG5vZGUpO1xuICAgIGNvbnN0IGhhc0NoaWxkcmVuQWZ0ZXJTdGFnZSA9IEJvb2xlYW4oY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGgpO1xuXG4gICAgaWYgKGhhc0NoaWxkcmVuQWZ0ZXJTdGFnZSkge1xuICAgICAgY29udGV4dC5hZGRMb2coJ3RvdGFsQ2hpbGRyZW4nLCBjaGlsZHJlbkFmdGVyU3RhZ2U/Lmxlbmd0aCk7XG4gICAgICBjb250ZXh0LmFkZExvZygnb3JkZXJPZkV4ZWN1dGlvbicsICdDaGlsZHJlbkFmdGVyU3RhZ2UnKTtcblxuICAgICAgbGV0IG5vZGVDaGlsZHJlblJlc3VsdHM6IFJlY29yZDxzdHJpbmcsIE5vZGVSZXN1bHRUeXBlPjtcblxuICAgICAgY29uc3QgZWZmU2VsZWN0b3JGbiA9IHRoaXMuZWZmU2VsZWN0b3Iobm9kZSk7XG4gICAgICBpZiAoZWZmU2VsZWN0b3JGbikge1xuICAgICAgICBub2RlQ2hpbGRyZW5SZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVTZWxlY3RlZENoaWxkcmVuKFxuICAgICAgICAgIGVmZlNlbGVjdG9yRm4sXG4gICAgICAgICAgY2hpbGRyZW5BZnRlclN0YWdlISxcbiAgICAgICAgICBzdGFnZU91dHB1dCxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIGJyYW5jaFBhdGggYXMgc3RyaW5nLFxuICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICAgbm9kZS5mYWlsRmFzdCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNoaWxkQ291bnQgPSBjaGlsZHJlbkFmdGVyU3RhZ2U/Lmxlbmd0aCA/PyAwO1xuICAgICAgICBjb25zdCBjaGlsZE5hbWVzID0gY2hpbGRyZW5BZnRlclN0YWdlPy5tYXAoKGMpID0+IGMubmFtZSkuam9pbignLCAnKTtcbiAgICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdjaGlsZHJlbicsIGBFeGVjdXRpbmcgYWxsICR7Y2hpbGRDb3VudH0gY2hpbGRyZW4gaW4gcGFyYWxsZWw6ICR7Y2hpbGROYW1lc31gLCB7XG4gICAgICAgICAgY291bnQ6IGNoaWxkQ291bnQsXG4gICAgICAgICAgdGFyZ2V0U3RhZ2U6IGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubWFwKChjKSA9PiBjLm5hbWUpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBlZmZOb2RlOiBDaGlsZHJlbkV4ZWN1dG9yIHJlYWRzIG5vZGUuY2hpbGRyZW4vbm9kZS5mYWlsRmFzdCBpdHNlbGYuXG4gICAgICAgIG5vZGVDaGlsZHJlblJlc3VsdHMgPSBhd2FpdCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IuZXhlY3V0ZU5vZGVDaGlsZHJlbihcbiAgICAgICAgICB0aGlzLmVmZk5vZGUobm9kZSksXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3JrLW9ubHk6IHJldHVybiBidW5kbGVcbiAgICAgIGlmICghaGFzTmV4dCAmJiAhZHluYW1pY05leHQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVDaGlsZHJlblJlc3VsdHMhO1xuICAgICAgfVxuXG4gICAgICAvLyBDYXB0dXJlIGR5bmFtaWMgY2hpbGRyZW4gYXMgc3ludGhldGljIHN1YmZsb3cgcmVzdWx0IGZvciBVSVxuICAgICAgLy8gUnVudGltZSBzdHJ1Y3R1cmUgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aDsgZGlhZ25vc3RpYyB0ZXh0IG1heSBiZVxuICAgICAgLy8gbWFza2VkIChvciB1c2VyLXdyaXR0ZW4pIGFuZCBtdXN0IG5ldmVyIGRlY2lkZSBjYXB0dXJlIGJlaGF2aW9yLlxuICAgICAgaWYgKHJldHVybmVkRHluYW1pY05vZGUgJiYgY2hpbGRyZW5BZnRlclN0YWdlICYmIGNoaWxkcmVuQWZ0ZXJTdGFnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuY2FwdHVyZUR5bmFtaWNDaGlsZHJlblJlc3VsdChub2RlLCBjaGlsZHJlbkFmdGVyU3RhZ2UsIGNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA2OiBDT05USU5VRSDigJQgZHluYW1pYyBuZXh0IC8gbGluZWFyIG5leHQg4pSA4pSA4pSAXG4gICAgaWYgKGR5bmFtaWNOZXh0KSByZXR1cm4gdGhpcy5sb29wSG9wKGR5bmFtaWNOZXh0LCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcblxuICAgIGlmIChoYXNOZXh0KSB7XG4gICAgICBjb25zdCBuZXh0Tm9kZSA9IG9yaWdpbmFsTmV4dCE7XG5cbiAgICAgIC8vIERldGVjdCBsb29wIHJlZmVyZW5jZSBub2RlcyBjcmVhdGVkIGJ5IGxvb3BUbygpIOKAlCBtYXJrZWQgd2l0aCBpc0xvb3BSZWYgZmxhZy5cbiAgICAgIC8vIFJvdXRlIHRocm91Z2ggQ29udGludWF0aW9uUmVzb2x2ZXIgZm9yIHByb3BlciBJRCByZXNvbHV0aW9uLCBpdGVyYXRpb25cbiAgICAgIC8vIHRyYWNraW5nLCBhbmQgbmFycmF0aXZlIGdlbmVyYXRpb24uIFRoZSByZXNvbHZlZCB0YXJnZXQgY29tZXMgYmFja1xuICAgICAgLy8gYXMgYSBob3Ag4oCUIGxvb3AgZWRnZXMgY29uc3VtZSBubyBzdGFjaywgc28gdGhlIGl0ZXJhdGlvbiBsaW1pdFxuICAgICAgLy8gKG5vdCBjYWxsLXN0YWNrIGRlcHRoKSBpcyB3aGF0IGJvdW5kcyBhIGxvb3AuXG4gICAgICBjb25zdCBpc0xvb3BSZWZlcmVuY2UgPSBuZXh0Tm9kZS5pc0xvb3BSZWY7XG5cbiAgICAgIGlmIChpc0xvb3BSZWZlcmVuY2UpIHJldHVybiB0aGlzLmxvb3BIb3AobmV4dE5vZGUsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuXG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbk5leHQobm9kZS5uYW1lLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ25leHQnLCBgTW92aW5nIHRvICR7bmV4dE5vZGUubmFtZX0gc3RhZ2VgLCB7XG4gICAgICAgIHRhcmdldFN0YWdlOiBuZXh0Tm9kZS5uYW1lLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5pZCk7XG4gICAgICByZXR1cm4gdGhpcy5ob3AobmV4dE5vZGUsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA3OiBMRUFGIOKAlCBubyBjb250aW51YXRpb24g4pSA4pSA4pSAXG4gICAgcmV0dXJuIHN0YWdlT3V0cHV0O1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFByaXZhdGUgSGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGNhcHR1cmVEeW5hbWljQ2hpbGRyZW5SZXN1bHQoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY2hpbGRyZW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRTdGFnZUlkID0gY29udGV4dC5nZXRTdGFnZUlkKCk7XG5cbiAgICBjb25zdCBjaGlsZFN0cnVjdHVyZTogYW55ID0ge1xuICAgICAgaWQ6IGAke25vZGUuaWR9LWNoaWxkcmVuYCxcbiAgICAgIG5hbWU6ICdEeW5hbWljIENoaWxkcmVuJyxcbiAgICAgIHR5cGU6ICdmb3JrJyxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbi5tYXAoKGMpID0+ICh7XG4gICAgICAgIGlkOiBjLmlkLFxuICAgICAgICBuYW1lOiBjLm5hbWUsXG4gICAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICB9KSksXG4gICAgfTtcblxuICAgIGNvbnN0IGNoaWxkU3RhZ2VzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGlmIChjb250ZXh0LmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkQ3R4IG9mIGNvbnRleHQuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSBjaGlsZEN0eC5nZXRTbmFwc2hvdCgpO1xuICAgICAgICBjaGlsZFN0YWdlc1tzbmFwc2hvdC5uYW1lIHx8IHNuYXBzaG90LmlkXSA9IHtcbiAgICAgICAgICBuYW1lOiBzbmFwc2hvdC5uYW1lLFxuICAgICAgICAgIG91dHB1dDogc25hcHNob3QubG9ncyxcbiAgICAgICAgICBlcnJvcnM6IHNuYXBzaG90LmVycm9ycyxcbiAgICAgICAgICBtZXRyaWNzOiBzbmFwc2hvdC5tZXRyaWNzLFxuICAgICAgICAgIHN0YXR1czogc25hcHNob3QuZXJyb3JzICYmIE9iamVjdC5rZXlzKHNuYXBzaG90LmVycm9ycykubGVuZ3RoID4gMCA/ICdlcnJvcicgOiAnc3VjY2VzcycsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdWJmbG93UmVzdWx0cy5zZXQobm9kZS5pZCwge1xuICAgICAgc3ViZmxvd0lkOiBub2RlLmlkLFxuICAgICAgc3ViZmxvd05hbWU6IG5vZGUubmFtZSxcbiAgICAgIHRyZWVDb250ZXh0OiB7XG4gICAgICAgIGdsb2JhbENvbnRleHQ6IHt9LFxuICAgICAgICBzdGFnZUNvbnRleHRzOiBjaGlsZFN0YWdlcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBoaXN0b3J5OiBbXSxcbiAgICAgICAgaW5pdGlhbFN0YXRlOiB7fSxcbiAgICAgIH0sXG4gICAgICBwYXJlbnRTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVTdHJ1Y3R1cmU6IGNoaWxkU3RydWN0dXJlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgZ2VuZXJhdGVkIGBwYXJhbGxlbEZvckVhY2hgIGJyYW5jaCBhcyBhIHN1YmZsb3cg4oCUIE9WRVJXUklUSU5HXG4gICAqIGFueSByZWdpc3RyYXRpb24gZnJvbSBhIHByZXZpb3VzIHZpc2l0LlxuICAgKlxuICAgKiBEZWxpYmVyYXRlIGRpdmVyZ2VuY2UgZnJvbSBgYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZmAncyBmaXJzdC13cml0ZS13aW5zLlxuICAgKiBHZW5lcmF0ZWQgc2VnbWVudHMgYXJlIHN0YWJsZSBhY3Jvc3MgbG9vcCBpdGVyYXRpb25zIChgPHN0YWdlSWQ+fjxpbmRleD5gXG4gICAqIGlzIGRlcml2ZWQgZnJvbSB0aGUgc3RhZ2UgaWQgYW5kIHRoZSBicmFuY2ggaW5kZXgsIG5laXRoZXIgb2Ygd2hpY2hcbiAgICogY2hhbmdlcyksIHNvIGZpcnN0LXdyaXRlLXdpbnMgd291bGQgbWVhbiBhIExPT1BJTkcgZmFuLW91dCBzaWxlbnRseVxuICAgKiByZS1leGVjdXRpbmcgaXRlcmF0aW9uIDEncyBicmFuY2ggY2hhcnRzIGZvcmV2ZXIg4oCUIGV2ZW4gd2hlbiB0aGUgYnJhbmNoXG4gICAqIGZhY3RvcnkgcmV0dXJucyBhIGRpZmZlcmVudCBjaGFydCBlYWNoIHRpbWUuIFRoYXQgaXMgdGhlIFwid291bGQgbm90IGNyYXNoLFxuICAgKiB3b3VsZCBzaWxlbnRseSBjb3JydXB0XCIgZmFpbHVyZSBjbGFzcyB0aGlzIHdob2xlIGRlc2lnbiBpcyBidWlsdCB0byBhdm9pZCxcbiAgICogc28gYSByZWdlbmVyYXRlZCBicmFuY2ggYWx3YXlzIHJlcGxhY2VzIGl0cyBwcmVkZWNlc3Nvci4gUGVyLWl0ZXJhdGlvblxuICAgKiByZXN1bHRzIHN0YXkgYWRkcmVzc2FibGUgdmlhIHRoZSBtb3VudCdzIGBydW50aW1lU3RhZ2VJZGAga2V5LCBleGFjdGx5IGFzXG4gICAqIGZvciBhIGhhbmQtYXV0aG9yZWQgbG9vcGluZyBzdWJmbG93LlxuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3RlckJyYW5jaFN1YmZsb3coXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY2hhcnQ6IHsgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47IHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGUgfT4gfSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zdWJmbG93c1tzdWJmbG93SWRdID0geyByb290IH07XG5cbiAgICAvLyBTdGFnZSBmdW5jdGlvbnMgbGFuZCB1bmRlciB0aGUgYnJhbmNoJ3MgcHJlZml4LCBtYXRjaGluZyB0aGUgcHJlZml4ZWQgaWRzLlxuICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIGNoYXJ0LnN0YWdlTWFwKSB7XG4gICAgICB0aGlzLnN0YWdlTWFwLnNldChqb2luUGF0aChzdWJmbG93SWQsIGtleSksIGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG4gICAgfVxuXG4gICAgLy8gTmVzdGVkIHN1YmZsb3dzIGluc2lkZSB0aGUgYnJhbmNoIGNoYXJ0LCBzYW1lIHByZWZpeGluZy5cbiAgICBpZiAoY2hhcnQuc3ViZmxvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhjaGFydC5zdWJmbG93cykpIHtcbiAgICAgICAgLy8gUHJlZml4ZWQgbGlrZSB0aGUgYnVpbGRlcidzIGBfbW91bnRTdWJmbG93YCAoOS4zNy4wIGZpeCk6IHdpdGhvdXQgaXRcbiAgICAgICAgLy8gZXZlcnkgYnJhbmNoIHJhbiBpdHMgbmVzdGVkIHN1YmZsb3cncyBzdGFnZXMgdW5kZXIgT05FIGlkLlxuICAgICAgICB0aGlzLnN1YmZsb3dzW2pvaW5QYXRoKHN1YmZsb3dJZCwga2V5KV0gPSB7XG4gICAgICAgICAgcm9vdDogcHJlZml4Tm9kZVRyZWUoKGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0pLnJvb3QsIHN1YmZsb3dJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWZpeCBhIG5vZGUgdHJlZSB3aXRoIGEgc3ViZmxvdyBwYXRoIHNlZ21lbnQgYXQgUlVOIHRpbWUgKGxhenkgc3ViZmxvd3MsXG4gICAqIHRoZSBnZW5lcmF0ZWQgYnJhbmNoZXMgb2YgYGFkZFBhcmFsbGVsRm9yRWFjaGApIOKAlCB0aGUgb25lIHByZWZpeGVyLFxuICAgKiBgZW5naW5lL2dyYXBoL3ByZWZpeE5vZGVUcmVlLnRzYCwgd2hpY2ggdGhlIGJ1aWxkZXIgY2FsbHMgYXQgbW91bnQgdGltZS5cbiAgICovXG4gIHByaXZhdGUgcHJlZml4Tm9kZVRyZWUobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHByZWZpeDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiBwcmVmaXhOb2RlVHJlZShub2RlLCBwcmVmaXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRvUmVnaXN0ZXJTdWJmbG93RGVmKFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHN1YmZsb3dEZWY6IE5vbk51bGxhYmxlPFN0YWdlTm9kZVsnc3ViZmxvd0RlZiddPixcbiAgICBtb3VudE5vZGVJZD86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgLy8gdGhpcy5zdWJmbG93cyBpcyBhbHdheXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yOyB0aGUgbnVsbCBndWFyZCBiZWxvdyBpcyB1bnJlYWNoYWJsZS5cbiAgICBjb25zdCBzdWJmbG93c0RpY3QgPSB0aGlzLnN1YmZsb3dzO1xuXG4gICAgLy8gRmlyc3Qtd3JpdGUtd2luc1xuICAgIGNvbnN0IGlzTmV3UmVnaXN0cmF0aW9uID0gIXN1YmZsb3dzRGljdFtzdWJmbG93SWRdO1xuICAgIGlmIChpc05ld1JlZ2lzdHJhdGlvbiAmJiBzdWJmbG93RGVmLnJvb3QpIHtcbiAgICAgIHN1YmZsb3dzRGljdFtzdWJmbG93SWRdID0ge1xuICAgICAgICByb290OiBzdWJmbG93RGVmLnJvb3QgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgICAgIC4uLihzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSA/IHsgYnVpbGRUaW1lU3RydWN0dXJlOiBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSB9IDoge30pLFxuICAgICAgfSBhcyBhbnk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2Ugc3RhZ2VNYXAgZW50cmllcyAocGFyZW50IGVudHJpZXMgcHJlc2VydmVkKVxuICAgIGlmIChzdWJmbG93RGVmLnN0YWdlTWFwKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiBBcnJheS5mcm9tKHN1YmZsb3dEZWYuc3RhZ2VNYXAuZW50cmllcygpKSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICB0aGlzLnN0YWdlTWFwLnNldChrZXksIGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNZXJnZSBuZXN0ZWQgc3ViZmxvd3NcbiAgICBpZiAoc3ViZmxvd0RlZi5zdWJmbG93cykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YmZsb3dEZWYuc3ViZmxvd3MpKSB7XG4gICAgICAgIGlmICghc3ViZmxvd3NEaWN0W2tleV0pIHtcbiAgICAgICAgICBzdWJmbG93c0RpY3Rba2V5XSA9IGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW91bnROb2RlSWQpIHtcbiAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgbW91bnROb2RlSWQsXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgc3ViZmxvd0RlZi5yb290Py5zdWJmbG93TmFtZSB8fCBzdWJmbG93RGVmLnJvb3Q/Lm5hbWUsXG4gICAgICAgIHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBOb3RpZnkgRmxvd1JlY29yZGVycyBvbmx5IG9uIGZpcnN0IHJlZ2lzdHJhdGlvbiAobWF0Y2hlcyBmaXJzdC13cml0ZS13aW5zKVxuICAgIGlmIChpc05ld1JlZ2lzdHJhdGlvbikge1xuICAgICAgY29uc3Qgc3ViZmxvd05hbWUgPSBzdWJmbG93RGVmLnJvb3Q/LnN1YmZsb3dOYW1lIHx8IHN1YmZsb3dEZWYucm9vdD8ubmFtZSB8fCBzdWJmbG93SWQ7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dSZWdpc3RlcmVkKFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgICBzdWJmbG93RGVmLnJvb3Q/LmRlc2NyaXB0aW9uLFxuICAgICAgICBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBBIHRvdWNoaW5nIG5vZGUncyByZWZ1c2FsIGF0IHRoZSBydW4tdGltZSBkb29yLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBsYXcgYWRtaXRzIGl0LiAqL1xuZnVuY3Rpb24gdG91Y2hlc1JlZnVzYWwobm9kZTogU3RhZ2VOb2RlPGFueSwgYW55Pik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb2JsZW0gPSB0b3VjaGVzUHJvYmxlbShub2RlLnRvdWNoZXMsIG5vZGUucmV0cnkpO1xuICByZXR1cm4gcHJvYmxlbSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYHN0YWdlICcke25vZGUuaWR9JzogJHtwcm9ibGVtfWA7XG59XG4iXX0=
1475
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUUzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxp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QUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekQsT0FBTyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLEVBQUUsTUFBTSxPQUFPLEVBQUUsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93Y2hhcnRUcmF2ZXJzZXIg4oCUIFByZS1vcmRlciBERlMgdHJhdmVyc2FsIG9mIFN0YWdlTm9kZSBncmFwaC5cbiAqXG4gKiBVbmlmaWVkIHRyYXZlcnNhbCBhbGdvcml0aG0gZm9yIGFsbCBub2RlIHNoYXBlcy4gYGV4ZWN1dGVOb2RlYCBpcyBhXG4gKiBUUkFNUE9MSU5FIGRyaXZlcjogaXQgcnVucyBgZXhlY3V0ZU5vZGVTdGVwYCAob25lIG5vZGUsIGFsbCA3IHBoYXNlcykgaW5cbiAqIGEgZmxhdCBsb29wLCBmb2xsb3dpbmcgdGFpbCBjb250aW51YXRpb25zIChsaW5lYXIgYG5leHRgLCBsb29wIGVkZ2VzLFxuICogZHluYW1pYyBuZXh0LCBmbGF0IGRlY2lkZXIgZGlzcGF0Y2gpIGl0ZXJhdGl2ZWx5IOKAlCBzbyBjaGFpbiBsZW5ndGggYW5kXG4gKiBsb29wIGl0ZXJhdGlvbnMgbmV2ZXIgZ3JvdyB0aGUgY2FsbCBzdGFjay4gT25seSB0cnVlIHRyZWUgbmVzdGluZyAoZm9ya1xuICogY2hpbGRyZW4sIHdpdGgtY29udGludWF0aW9uIGRlY2lkZXIvc2VsZWN0b3IgYnJhbmNoZXMsIHN1YmZsb3cgbW91bnRzKVxuICogcmVjdXJzZXMuXG4gKlxuICogRm9yIGVhY2ggbm9kZSwgZXhlY3V0ZU5vZGVTdGVwIGZvbGxvd3MgNyBwaGFzZXM6XG4gKiAgIDAuIENMQVNTSUZZICDigJQgc3ViZmxvdyBkZXRlY3Rpb24sIGVhcmx5IGRlbGVnYXRpb25cbiAqICAgMGIuIFBBUkFMTEVMLUZPUi1FQUNIIOKAlCBkeW5hbWljIGZhbi1vdXQgKGJyYW5jaGVzIGdlbmVyYXRlZCBmcm9tIHRoZSBwYXlsb2FkKVxuICogICAxLiBWQUxJREFURSAg4oCUIG5vZGUgaW52YXJpYW50cywgcm9sZSBtYXJrZXJzXG4gKiAgIDIuIEVYRUNVVEUgICDigJQgcnVuIHN0YWdlIGZuLCBjb21taXQsIGJyZWFrIGNoZWNrXG4gKiAgIDMuIERZTkFNSUMgICDigJQgU3RhZ2VOb2RlIHJldHVybiBkZXRlY3Rpb24sIHN1YmZsb3cgYXV0by1yZWdpc3RyYXRpb24sIHN0cnVjdHVyZSB1cGRhdGVzXG4gKiAgIDQuIENISUxEUkVOICDigJQgZm9yay9zZWxlY3Rvci9kZWNpZGVyIGRpc3BhdGNoXG4gKiAgIDUuIENPTlRJTlVFICDigJQgZHluYW1pYyBuZXh0IC8gbGluZWFyIG5leHQgcmVzb2x1dGlvblxuICogICA2LiBMRUFGICAgICAg4oCUIG5vIGNvbnRpbnVhdGlvbiwgcmV0dXJuIG91dHB1dFxuICpcbiAqIEJyZWFrIHNlbWFudGljczogSWYgYSBzdGFnZSBjYWxscyBicmVha0ZuKCksIGNvbW1pdCBhbmQgU1RPUC5cbiAqIFBhdGNoIG1vZGVsOiBTdGFnZSB3cml0ZXMgaW50byBsb2NhbCBwYXRjaDsgY29tbWl0UGF0Y2goKSBhZnRlciByZXR1cm4gb3IgdGhyb3cuXG4gKi9cblxuaW1wb3J0IHsgYnVpbGRSdW50aW1lU3RhZ2VJZCwgam9pblBhdGggfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgeyByZWFkRGVhZGxpbmUgfSBmcm9tICcuLi8uLi9hdHRlbXB0L2RlYWRsaW5lLmpzJztcbmltcG9ydCB0eXBlIHsgRWZmZWN0VGFyZ2V0IH0gZnJvbSAnLi4vLi4vYXR0ZW1wdC9lZmZlY3QuanMnO1xuaW1wb3J0IHsgYWRtaXRJZGVtcG90ZW5jeUtleSwgaXNDYXJyaWVkVG91Y2hlcywgdG91Y2hlc1Byb2JsZW0gfSBmcm9tICcuLi8uLi9hdHRlbXB0L2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBhdHRlbXB0Q2VpbGluZywgYXR0ZW1wdFRpbWVvdXRNcywgcmV0cnlQb2xpY3lQcm9ibGVtIH0gZnJvbSAnLi4vLi4vYXR0ZW1wdC9wb2xpY3kuanMnO1xuaW1wb3J0IHsgZnJlZXplRGVlcCB9IGZyb20gJy4uLy4uL2F0dGVtcHQvcmVjb3JkLmpzJztcbmltcG9ydCB7IHJ1bkF0dGVtcHRzIH0gZnJvbSAnLi4vLi4vYXR0ZW1wdC9ydW5uZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXRyeVBvbGljeSwgUnVuQ29ycmVsYXRpb24sIFN0YWdlVG91Y2hlcyB9IGZyb20gJy4uLy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgdGhyb3duVGV4dCB9IGZyb20gJy4uLy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgcmVmdXNlUmVzZXJ2ZWRJZCB9IGZyb20gJy4uLy4uL2lkcy9yZXNlcnZlZElkcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IHNuYXBzaG90UnVuSW5wdXQgfSBmcm9tICcuLi8uLi9zY29wZS9wcm90ZWN0aW9uL3JlYWRvbmx5SW5wdXQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgeyBwcmVmaXhOb2RlVHJlZSB9IGZyb20gJy4uL2dyYXBoL3ByZWZpeE5vZGVUcmVlLmpzJztcbmltcG9ydCB7IGlzU3RhZ2VOb2RlUmV0dXJuIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZUJyZWFrSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL2JyZWFrRmxhZy5qcyc7XG5pbXBvcnQgeyBDaGlsZHJlbkV4ZWN1dG9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ2hpbGRyZW5FeGVjdXRvci5qcyc7XG5pbXBvcnQgeyBjb21taXRTdGFnZSwgY29tbWl0U3RhZ2VXcml0ZXMgfSBmcm9tICcuLi9oYW5kbGVycy9jb21taXRTdGFnZS5qcyc7XG5pbXBvcnQgeyBDb250aW51YXRpb25SZXNvbHZlciB9IGZyb20gJy4uL2hhbmRsZXJzL0NvbnRpbnVhdGlvblJlc29sdmVyLmpzJztcbmltcG9ydCB7IERlY2lkZXJIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvRGVjaWRlckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvTm9kZVJlc29sdmVyLmpzJztcbmltcG9ydCB7IFBhcmFsbGVsRm9yRWFjaEhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9QYXJhbGxlbEZvckVhY2hIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUXVldWVkUGF1c2UsIFJlc3VtZUVudHJ5IH0gZnJvbSAnLi4vaGFuZGxlcnMvUmVzdW1lRW50cnkuanMnO1xuaW1wb3J0IHsgcXVldWVCZWhpbmQsIHJhaXNlUXVldWVkUGF1c2UgfSBmcm9tICcuLi9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyBSdW50aW1lU3RydWN0dXJlTWFuYWdlciB9IGZyb20gJy4uL2hhbmRsZXJzL1J1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlbGVjdG9ySGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL1NlbGVjdG9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBzZXJ2ZWRQYXVzZSB9IGZyb20gJy4uL2hhbmRsZXJzL3NlcnZlZFBhdXNlLmpzJztcbmltcG9ydCB7XG4gIGNhcHR1cmVTdGFnZUZhaWx1cmUsXG4gIGxvZ2dhYmxlU3RhZ2VFcnJvcixcbiAgcmVjb3JkU3RhZ2VFcnJvcixcbiAgc2VydmVkSWRlbXBvdGVuY3lLZXksXG4gIHNlcnZlZFN0YWdlRXJyb3IsXG59IGZyb20gJy4uL2hhbmRsZXJzL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHsgU3RhZ2VSdW5uZXIgfSBmcm9tICcuLi9oYW5kbGVycy9TdGFnZVJ1bm5lci5qcyc7XG5pbXBvcnQgeyBTdWJmbG93RXhlY3V0b3IgfSBmcm9tICcuLi9oYW5kbGVycy9TdWJmbG93RXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgVHJhdmVyc2FsRGVwdGhFcnJvciB9IGZyb20gJy4uL2hhbmRsZXJzL1RyYXZlcnNhbERlcHRoRXJyb3IuanMnO1xuaW1wb3J0IHR5cGUgeyBCcmVha0ZsYWcgfSBmcm9tICcuLi9oYW5kbGVycy90eXBlcy5qcyc7XG5pbXBvcnQgeyBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIH0gZnJvbSAnLi4vbmFycmF0aXZlL0Zsb3dSZWNvcmRlckRpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vbmFycmF0aXZlL05hcnJhdGl2ZUZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBOdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IgfSBmcm9tICcuLi9uYXJyYXRpdmUvTnVsbENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd1JlY29yZGVyLCBJQ29udHJvbEZsb3dOYXJyYXRpdmUsIFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgcm9vdFRyYXZlcnNhbENvbnRleHQsIHRyYXZlcnNhbENvbnRleHRGb3IgfSBmcm9tICcuLi90cmF2ZXJzYWxDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgSGFuZGxlckRlcHMsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBJTG9nZ2VyLFxuICBOb2RlUmVzdWx0VHlwZSxcbiAgU2NvcGVGYWN0b3J5LFxuICBTZWxlY3RvcixcbiAgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICBTdGFnZUZ1bmN0aW9uLFxuICBTdGFnZU5vZGUsXG4gIFN0cmVhbUhhbmRsZXJzLFxuICBTdWJmbG93TW91bnRPcHRpb25zLFxuICBTdWJmbG93UmVzdWx0LFxuICBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSxcbiAgVHJhdmVyc2FsUmVzdWx0LFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhdmVyc2VyT3B0aW9uczxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFRoZSBncmFwaCB0aGlzIHRyYXZlcnNlciB3YWxrcyDigJQgYW5kIHRoZSBncmFwaCBldmVyeSBpZCByZXNvbHZlcyBhZ2FpbnN0XG4gICAqICh0aGUgbm9kZSBtYXAgYmVoaW5kIGV2ZXJ5IGBsb29wVG9gLCB0aGUgREZTIGZhbGxiYWNrKS4gYGV4ZWN1dGUoKWBcbiAgICogc3RhcnRzIGhlcmUgdW5sZXNzIGBlbnRyeWAgc2F5cyBvdGhlcndpc2UuXG4gICAqL1xuICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgLyoqXG4gICAqIFdoZXJlIGBleGVjdXRlKClgIHN0YXJ0cyB3aGVuIG5vdCBhdCBgcm9vdGAg4oCUIGEgcmVzdW1lJ3Mgb25lLXNob3RcbiAgICogcmUtZW50cnkgKE0yKTogdGhlIHBhdXNlZCBzdGFnZSdzIHN0YW5kLWluLCBvciB0aGUgbW91bnQgb2YgdGhlIGZpcnN0XG4gICAqIHN1YmZsb3cgb24gdGhlIHBhdXNlIHBhdGgsIGVhY2ggd2l0aCBpdHMgZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvblxuICAgKiBhdHRhY2hlZC4gVmlzaXRlZCBvbmNlLCBmaXJzdCwgYW5kIG5ldmVyIHJlZ2lzdGVyZWQgYW55d2hlcmUgYW4gaWQgY2FuXG4gICAqIHJlYWNoIGl0LCBzbyBhIGxvb3AgYmFjayB0byB0aGUgcGF1c2VkIHN0YWdlIGZpbmRzIHRoZSBSRUFMIHN0YWdlLlxuICAgKiBDb25zdW1lZCBieSB0aGUgZmlyc3QgYGV4ZWN1dGUoKWAuXG4gICAqL1xuICBlbnRyeT86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogUGFyYWxsZWwgc2libGluZ3MnIHBhdXNlcyB3YWl0aW5nIGF0IHRoaXMgbGV2ZWwgKGEgcmVzdW1lLCA5LjI4LjApOiBvbmNlXG4gICAqIGBlbnRyeWAncyBjaGFpbiBlbmRzLCBgZXhlY3V0ZSgpYCByYWlzZXMgdGhlIGZpcnN0IGFnYWluICh0aGUgcmVzdCB3YWl0XG4gICAqIGJlaGluZCBpdCk7IGEgcGF1c2UgcmFpc2VkIGZyb20gaW5zaWRlIHRoZSBjaGFpbiBjYXJyaWVzIHRoZW0gYWxsLiBPbmx5XG4gICAqIHdpdGggYGVudHJ5YDsgY29uc3VtZWQgYnkgdGhlIGZpcnN0IGBleGVjdXRlKClgLiBTZWUgYFJlc3VtZUVudHJ5YC5cbiAgICovXG4gIHBlbmRpbmdQYXVzZXM/OiByZWFkb25seSBRdWV1ZWRQYXVzZVtdO1xuICBzdGFnZU1hcDogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PjtcbiAgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcbiAgZXhlY3V0aW9uUnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWU7XG4gIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gIC8qKiBFeGVjdXRpb24gZW52aXJvbm1lbnQg4oCUIHByb3BhZ2F0ZXMgdG8gc3ViZmxvd3MgYXV0b21hdGljYWxseS4gKi9cbiAgZXhlY3V0aW9uRW52PzogaW1wb3J0KCcuLi8uLi9lbmdpbmUvdHlwZXMuanMnKS5FeGVjdXRpb25FbnY7XG4gIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHN0cmVhbUhhbmRsZXJzPzogU3RyZWFtSGFuZGxlcnM7XG4gIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xuICBzdWJmbG93cz86IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT47XG4gIG5hcnJhdGl2ZUVuYWJsZWQ/OiBib29sZWFuO1xuICBidWlsZFRpbWVTdHJ1Y3R1cmU/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gIGxvZ2dlcjogSUxvZ2dlcjtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKiBQcmUtY29uZmlndXJlZCBGbG93UmVjb3JkZXJzIHRvIGF0dGFjaCB3aGVuIG5hcnJhdGl2ZSBpcyBlbmFibGVkLiAqL1xuICBmbG93UmVjb3JkZXJzPzogRmxvd1JlY29yZGVyW107XG4gIC8qKlxuICAgKiBQcmUtY29uZmlndXJlZCBuYXJyYXRpdmUgZ2VuZXJhdG9yLiBJZiBwcm92aWRlZCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyXG4gICAqIGZsb3dSZWNvcmRlcnMgYW5kIG5hcnJhdGl2ZUVuYWJsZWQuIFVzZWQgYnkgdGhlIHN1YmZsb3cgdHJhdmVyc2VyIGZhY3RvcnlcbiAgICogdG8gc2hhcmUgdGhlIHBhcmVudCdzIG5hcnJhdGl2ZSBnZW5lcmF0b3Igd2l0aCBzdWJmbG93IHRyYXZlcnNlcnMuXG4gICAqL1xuICBuYXJyYXRpdmVHZW5lcmF0b3I/OiBJQ29udHJvbEZsb3dOYXJyYXRpdmU7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG5lc3RlZCBleGVjdXRlTm9kZSBkZXB0aCAodHJlZSBuZXN0aW5nIOKAlCBicmFuY2gvZm9yayBkaXNwYXRjaCBhbmRcbiAgICogZHluYW1pYyByZWN1cnNpb24sIE5PVCBsaW5lYXIgY2hhaW5zIG9yIGxvb3AgaXRlcmF0aW9ucywgd2hpY2ggcnVuIGZsYXQpLlxuICAgKiBEZWZhdWx0cyB0byBGbG93Y2hhcnRUcmF2ZXJzZXIuTUFYX0VYRUNVVEVfREVQVEggKDUwMCkuXG4gICAqL1xuICBtYXhEZXB0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gbG9vcCBpdGVyYXRpb25zIHBlciBub2RlICh0aGUgQ29udGludWF0aW9uUmVzb2x2ZXIgZ3VhcmQpLlxuICAgKiBEZWZhdWx0cyB0byBERUZBVUxUX01BWF9JVEVSQVRJT05TICgxMDAwKS4gUHJvcGFnYXRlZCB0byBzdWJmbG93XG4gICAqIHRyYXZlcnNlcnMuIE11c3QgYmUgPj0gMS5cbiAgICovXG4gIG1heEl0ZXJhdGlvbnM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGVuIHRoaXMgdHJhdmVyc2VyIHJ1bnMgaW5zaWRlIGEgc3ViZmxvdywgc2V0IHRoaXMgdG8gdGhlIHN1YmZsb3cncyBJRC5cbiAgICogUHJvcGFnYXRlZCB0byBUcmF2ZXJzYWxDb250ZXh0IHNvIG5hcnJhdGl2ZSBlbnRyaWVzIGNhcnJ5IHRoZSBjb3JyZWN0IHN1YmZsb3dJZC5cbiAgICovXG4gIHBhcmVudFN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyB0cmF2ZXJzZXIgcnVucyBpbnNpZGUgYSBzdWJmbG93LCB0aGUgcnVudGltZVN0YWdlSWQgb2YgdGhlXG4gICAqIHN1YmZsb3cgTU9VTlQgc3RhZ2UgaW4gdGhlIHBhcmVudCB0cmF2ZXJzZXIuIFVzZWQgYXMgdGhlXG4gICAqIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgZmFsbGJhY2sgZm9yIHN0YWdlcyB3aG9zZSBTdGFnZUNvbnRleHQgaGFzIG5vXG4gICAqIHBhcmVudCAodGhlIHN1YmZsb3cncyBvd24gcm9vdCBjb250ZXh0IGlzIGNyZWF0ZWQgZnJlc2ggYnlcbiAgICogU3ViZmxvd0V4ZWN1dG9yKSBzbyBydW50aW1lIGFuY2VzdG9yIGNoYWlucyBjcm9zcyBzdWJmbG93IGJvdW5kYXJpZXNcbiAgICogKFJGQy0wMDMgRDEpLlxuICAgKi9cbiAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgLyoqIEBpbnRlcm5hbCBBY3R1YWwgcnVudGltZSBtb3VudCBhbmNlc3RyeSBmb3IgdGhlIG93bmluZyBsb2csIG5vdCBzdGF0aWMgc3ViZmxvd1BhdGguICovXG4gIGVtaXREcmlsbFBhdGg/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIFNoYXJlZCBleGVjdXRpb24gY291bnRlciBmcm9tIHBhcmVudCB0cmF2ZXJzZXIuIFN1YmZsb3dzIGNvbnRpbnVlIHRoZSBwYXJlbnQncyBudW1iZXJpbmcuICovXG4gIGV4ZWN1dGlvbkNvdW50ZXI/OiB7IHZhbHVlOiBudW1iZXIgfTtcbiAgLyoqXG4gICAqIFNoYXJlZCBwZXItcnVuIHZpc2l0LWNvdW50IG1hcCAoa2V5ZWQgYnkgc3RhZ2VJZCkgZnJvbSB0aGUgcGFyZW50IHRyYXZlcnNlci5cbiAgICogRHJpdmVzIGBUcmF2ZXJzYWxDb250ZXh0Lmxvb3BJdGVyYXRpb25gLiBTaGFyZWQgd2l0aCBzdWJmbG93cyBzbyBhIHN0YWdlXG4gICAqIHJlLWVudGVyZWQgYWNyb3NzIGEgc3ViZmxvdyByZS1tb3VudCBrZWVwcyBhIGNvcnJlY3QsIG1vbm90b25pYyBpdGVyYXRpb25cbiAgICogY291bnQg4oCUIHRoZSBzYW1lIHNpbmdsZS1tYXAgc2VtYW50aWNzIHRoZSBuYXJyYXRpdmUgcmVjb3JkZXIgdXNlcy5cbiAgICovXG4gIHZpc2l0Q291bnRzPzogTWFwPHN0cmluZywgbnVtYmVyPjtcbiAgLyoqXG4gICAqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSAoTTIpLCBzaGFyZWQgYnkgcmVmZXJlbmNlIHdpdGggZXZlcnlcbiAgICogbmVzdGVkIHRyYXZlcnNlciAodGhlIGV4ZWN1dGlvbiBjb3VudGVyJ3MgcHJlY2VkZW50KTogZWFjaCBzdWJmbG93IG9uIHRoZVxuICAgKiBwYXVzZSBwYXRoIHRha2VzIGl0cyBjYXB0dXJlZCBzdGF0ZSBhbmQgaXRzIGVudHJ5IHBvaW50IGV4YWN0bHkgb25jZSwgb25cbiAgICogaXRzIGZpcnN0IGVudHJ5LiBTZWUgYFJlc3VtZUVudHJ5YC4gVW5kZWZpbmVkIG9uIG5vcm1hbCBgcnVuKClgIHBhdGhzLlxuICAgKi9cbiAgcmVzdW1lPzogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPjtcbiAgLyoqXG4gICAqIFBlci1gZXhlY3V0b3IucnVuKClgIGlkZW50aWZpZXIuIFRocmVhZGVkIGludG8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dFxuICAgKiB0aGlzIHRyYXZlcnNlciBwcm9kdWNlcyBzbyByZWNvcmRlcnMgY2FuIHNjb3BlIHN0YXRlIHRvIGEgc2luZ2xlIHJ1bi5cbiAgICogU3ViZmxvdyB0cmF2ZXJzZXJzIGluaGVyaXQgdGhlIHBhcmVudCdzIHJ1bklkICh0aGUgc3ViZmxvdyBpcyBwYXJ0IG9mXG4gICAqIHRoZSBzYW1lIHJ1biBmcm9tIHRoZSBjb25zdW1lcidzIFBPVikuIFJlcXVpcmVkIGZpZWxkIOKAlCBldmVyeSBldmVudFxuICAgKiBuZWVkcyBpdC4gU2VlIGBydW5uZXIvcnVuSWQudHNgLlxuICAgKi9cbiAgcnVuSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBsZWcncyBjb3JyZWxhdGlvbiAoMTAuMSwgYGF0dGVtcHQvY29ycmVsYXRpb24udHMgwrcgcmVzb2x2ZUNvcnJlbGF0aW9uYCkg4oCUIHN0YW1wZWQgb250byBldmVyeVxuICAgKiBUcmF2ZXJzYWxDb250ZXh0IGFuZCB0aGUgc25hcHNob3QsIGluaGVyaXRlZCBieSBzdWJmbG93IHRyYXZlcnNlcnMgQlkgUkVGRVJFTkNFLiBBYnNlbnQgd2hlbiB0aGUgZW52IGdhdmUgbm9uZS5cbiAgICovXG4gIGNvcnJlbGF0aW9uPzogUnVuQ29ycmVsYXRpb247XG59XG5cbi8qKlxuICogVHJhdmVyc2VyLWxvY2FsIG92ZXJsYXkgZW50cnkgZm9yIGEgbm9kZSB3aG9zZSBzdGFnZSBmdW5jdGlvbiByZXR1cm5lZCBhXG4gKiBTdGFnZU5vZGUgKGR5bmFtaWMgY29udGludWF0aW9uKS4gSG9sZHMgdGhlIGR5bmFtaWMgdmFsdWVzIHRoYXQgZWFybGllclxuICogdmVyc2lvbnMgd3JvdGUgRElSRUNUTFkgb250byB0aGUgc2hhcmVkIGJ1aWx0LWNoYXJ0IG5vZGUg4oCUIHdoaWNoIGxlYWtlZCB0aGVcbiAqIGR5bmFtaWMgc2hhcGUgaW50byBldmVyeSBsYXRlciBydW4gb2YgdGhlIHNhbWUgYnVpbHQgY2hhcnQgYW5kIHJhY2VkXG4gKiBjb25jdXJyZW50IGV4ZWN1dG9ycy4gVGhlIG92ZXJsYXkga2VlcHMgdGhlIGJ1aWx0IGdyYXBoIGltbXV0YWJsZTogcGF0Y2hlc1xuICogbGl2ZSBpbiBhIHBlci10cmF2ZXJzZXIgTWFwIGtleWVkIGJ5IGBub2RlLmlkYCBhbmQgZGllIHdpdGggdGhlIHJ1bi5cbiAqXG4gKiBgbmV4dGAgaXMgaW50ZW50aW9uYWxseSBBQlNFTlQ6IGEgZHluYW1pYyBgbmV4dGAgb25seSBldmVyIGFwcGxpZXMgdG8gdGhlXG4gKiB2aXNpdCB0aGF0IHByb2R1Y2VkIGl0ICh0aGUgb2xkIGNvZGUgd3JvdGUgYG5vZGUubmV4dGAgYW5kIHJlc3RvcmVkIGl0XG4gKiBiZWZvcmUgYW55dGhpbmcgY291bGQgb2JzZXJ2ZSB0aGUgd3JpdGUpLCBzbyBpdCBzdGF5cyBhIGxvY2FsIHZhcmlhYmxlIGluXG4gKiBgZXhlY3V0ZU5vZGVgIGFuZCBpcyByb3V0ZWQgdGhyb3VnaCBgQ29udGludWF0aW9uUmVzb2x2ZXJgIGRpcmVjdGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtaWNOb2RlUGF0Y2g8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKlxuICAgKiBTdWJmbG93IG1vdW50IG1ldGFkYXRhIGZyb20gYSBkeW5hbWljLXN1YmZsb3cgcmV0dXJuLiBHcm91cGVkIHNvIHRoZVxuICAgKiBtZXJnZWQgdmlldyByZXByb2R1Y2VzIHRoZSBvbGQgZmllbGQtd2lzZSBvdmVyd3JpdGUgZXhhY3RseSDigJQgaW5jbHVkaW5nXG4gICAqIGBzdWJmbG93TmFtZWAvYHN1YmZsb3dNb3VudE9wdGlvbnNgIGJlY29taW5nIHVuZGVmaW5lZCB3aGVuIHRoZSBkeW5hbWljXG4gICAqIHJldHVybiBvbWl0dGVkIHRoZW0uXG4gICAqL1xuICBzdWJmbG93TWV0YT86IHtcbiAgICBpc1N1YmZsb3dSb290OiB0cnVlO1xuICAgIHN1YmZsb3dJZDogc3RyaW5nO1xuICAgIHN1YmZsb3dOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgc3ViZmxvd01vdW50T3B0aW9uczogU3ViZmxvd01vdW50T3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgfTtcbiAgLyoqIER5bmFtaWMgZm9yayBjaGlsZHJlbiAocmVwbGFjZXMgdGhlIGJ1aWx0IG5vZGUncyBjaGlsZHJlbiBmb3IgdGhpcyBydW4pLiAqL1xuICBjaGlsZHJlbj86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W107XG4gIC8qKiBEeW5hbWljIG91dHB1dC1iYXNlZCBzZWxlY3RvciBhY2NvbXBhbnlpbmcgZHluYW1pYyBjaGlsZHJlbi4gKi9cbiAgbmV4dE5vZGVTZWxlY3Rvcj86IFNlbGVjdG9yO1xufVxuXG4vKipcbiAqIFRyYW1wb2xpbmUgYnJhbmQg4oCUIG1hcmtzIGEgY29udGludWF0aW9uIGhvcCByZXR1cm5lZCBieSBgZXhlY3V0ZU5vZGVTdGVwYFxuICogdG8gdGhlIGRyaXZlciBsb29wIGluIGBleGVjdXRlTm9kZWAuIE1vZHVsZS1wcml2YXRlIHN5bWJvbCBzbyBhIHN0YWdlJ3Mgb3duXG4gKiByZXR1cm4gdmFsdWUgKHdoaWNoIGNhbiBiZSBhbnkgb2JqZWN0KSBjYW4gbmV2ZXIgYmUgbWlzdGFrZW4gZm9yIGEgaG9wLlxuICovXG5jb25zdCBDT05USU5VRV9IT1A6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ2Zvb3RwcmludGpzLmV4ZWN1dGVOb2RlLmNvbnRpbnVlJyk7XG5cbi8qKiBUaGUgcG9saWN5IG9mIGEgc3RhZ2UgdGhhdCBkZWNsYXJlZCBub25lIGJ1dCBydW5zIG9uIHRoZSBhdHRlbXB0IHJ1bm5lciBhbnl3YXkgKGEgcnVuIGRlYWRsaW5lKTogb25lIGF0dGVtcHQuICovXG5jb25zdCBTSU5HTEVfQVRURU1QVDogUmV0cnlQb2xpY3kgPSBPYmplY3QuZnJlZXplKHsgYXR0ZW1wdHM6IDEgfSk7XG5cbi8qKlxuICogQSBmbGF0IGNvbnRpbnVhdGlvbiDigJQgXCJleGVjdXRlIHRoaXMgbm9kZSBuZXh0LCBpbiB0aGlzIGNvbnRleHRcIiDigJQgcmV0dXJuZWRcbiAqIGJ5IGBleGVjdXRlTm9kZVN0ZXBgIGZvciBldmVyeSBUQUlMIGNvbnRpbnVhdGlvbiAobGluZWFyIGBuZXh0YCwgbG9vcFxuICogZWRnZXMsIGR5bmFtaWMgbmV4dCwgZHluYW1pYy1zdWJmbG93IHJlLWVudHJ5LCBuby1jb250aW51YXRpb24gZGVjaWRlclxuICogZGlzcGF0Y2gpLiBUaGUgZHJpdmVyIGxvb3AgaW4gYGV4ZWN1dGVOb2RlYCBjb25zdW1lcyBob3BzIGl0ZXJhdGl2ZWx5OlxuICogYGN1cnJlbnQgPSBob3A7IGNvbnRpbnVlO2Ag4oCUIHNvIG5laXRoZXIgdGhlIGNhbGwgc3RhY2sgbm9yIHRoZSByZXRhaW5lZFxuICogcHJvbWlzZSBjaGFpbiBncm93cyB3aXRoIGNoYWluIGxlbmd0aCBvciBsb29wIGl0ZXJhdGlvbnMuXG4gKi9cbmludGVyZmFjZSBDb250aW51YXRpb25Ib3A8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHJlYWRvbmx5IFtDT05USU5VRV9IT1BdOiB0cnVlO1xuICByZWFkb25seSBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcmVhZG9ubHkgY29udGV4dDogU3RhZ2VDb250ZXh0O1xuICByZWFkb25seSBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBQcmVzZW50IHdoZW4gdGhlIGhvcCBpcyBhIGRlY2lkZXIncyBicmFuY2ggZGlzcGF0Y2ggKGRlY2lkZXIgd2l0aG91dCBpdHNcbiAgICogb3duIGBuZXh0YCkuIFRoZSBkcml2ZXIgcmVjb3JkcyBpdCBzbyBhIFBhdXNlU2lnbmFsIHRocm93biBhbnl3aGVyZSBpblxuICAgKiB0aGUgY29udGludWVkIGNoYWluIHN0aWxsIGdldHMgdGhlIGRlY2lkZXIgc3RhbXBlZCBhcyBpdHMgaW52b2tlciDigJRcbiAgICogZXhhY3RseSB3aGF0IHRoZSByZWN1cnNpdmUgZGlzcGF0Y2gncyBjYXRjaCB1c2VkIHRvIGRvLlxuICAgKi9cbiAgcmVhZG9ubHkgaW52b2tlclN0YW1wPzogSW52b2tlclN0YW1wO1xuICAvKipcbiAgICogUHJlc2VudCB3aGVuIHRoZSBob3AgZm9sbG93cyBhIExPT1AgZWRnZSAoYSBiYWNrLXJlZmVyZW5jZSByZXNvbHZlZCBieVxuICAgKiBgQ29udGludWF0aW9uUmVzb2x2ZXJgKS4gQSBkZWNpZGVyJ3MgYnJhbmNoIGZyYW1lIGhhbmRzIHN1Y2ggYSBob3AgYmFja1xuICAgKiB0byBpdHMgZGVjaWRlciB3aGVuIHRoZSB0YXJnZXQgaXMgbm90IGEgbm9kZSB0aGUgZnJhbWUgcmFuLCBzbyB0aGUgbG9vcFxuICAgKiByZS1lbnRlcnMgYXQgdGhlIHRhcmdldCdzIG93biBsZXZlbCDigJQgZmxhdCwgbmV2ZXIgb25lIGZyYW1lIHBlciBwYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9vcD86IHRydWU7XG59XG5cbi8qKlxuICogV2hhdCBhIGRyaXZlciByZWNvcmRzIGZvciBlYWNoIHN0YWdlIGNvbnRleHQgaXQgcnVuczogaXRzIE5FU1RJTkcgZGVwdGhcbiAqIChzZWUgYEZsb3djaGFydFRyYXZlcnNlciDCtyBuZXN0aW5nRGVwdGhPZmApIGFuZCB0aGUgbm9kZSBpZHMgZWFjaCBkcml2ZXJcbiAqIG9uIGl0cyBCUkFOQ0gtRlJBTUUgY2hhaW4gaGFzIHJ1biDigJQgaXRzIG93biBsYXN0LiBBIGRlY2lkZXIgd2l0aCBpdHMgb3duXG4gKiBgbmV4dGAgaGFuZHMgdGhhdCBjaGFpbiB0byBpdHMgYnJhbmNoIGZyYW1lLCBzbyB0aGUgZnJhbWUgY2FuIHRlbGwgYSBsb29wXG4gKiBiYWNrIGludG8gYW4gZW5jbG9zaW5nIGRyaXZlciAobGVhdmUpIGZyb20gYW55IG90aGVyIGp1bXAgKHN0YXkpLlxuICovXG5pbnRlcmZhY2UgRHJpdmVyRnJhbWUge1xuICByZWFkb25seSBkZXB0aDogbnVtYmVyO1xuICByZWFkb25seSByYW46IHJlYWRvbmx5IFJlYWRvbmx5U2V0PHN0cmluZyB8IHVuZGVmaW5lZD5bXTtcbiAgLyoqIFRoZSBgbmV4dGAtY2hhaW4gaWRzIG9mIGV2ZXJ5IGRlY2lkZXIgd2hvc2UgYnJhbmNoIGZyYW1lIGVuY2xvc2VzIHRoaXMgZHJpdmVyLiAqL1xuICByZWFkb25seSB0YWlsczogcmVhZG9ubHkgUmVhZG9ubHlTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPltdO1xufVxuXG4vKiogV2hhdCBhIGJyYW5jaCBmcmFtZSBpbmhlcml0czogdGhlIGVuY2xvc2luZyByYW4tc2V0cywgYW5kIHRoZSB0YWlscyBpdCBtYXkganVtcCB0by4gKi9cbnR5cGUgRW5jbG9zaW5nRnJhbWVzID0gUGljazxEcml2ZXJGcmFtZSwgJ3JhbicgfCAndGFpbHMnPjtcblxuLyoqIFBhdXNlLWludm9rZXIgY29udGV4dCByZWNvcmRlZCBieSB0aGUgZHJpdmVyIGZvciBmbGF0IGRlY2lkZXIgZGlzcGF0Y2hlcy4gKi9cbmludGVyZmFjZSBJbnZva2VyU3RhbXAge1xuICByZWFkb25seSBpbnZva2VyU3RhZ2VJZDogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBpc0NvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAodmFsdWUgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW0NPTlRJTlVFX0hPUF0gPT09IHRydWU7XG59XG5cbmV4cG9ydCBjbGFzcyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKiBXaGVyZSB0aGUgbmV4dCBgZXhlY3V0ZSgpYCBzdGFydHMgd2hlbiBub3QgYXQgYHJvb3RgIOKAlCBvbmUtc2hvdCAoc2VlIFRyYXZlcnNlck9wdGlvbnMuZW50cnkpLiAqL1xuICBwcml2YXRlIGVudHJ5OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgLyoqIFNpYmxpbmdzJyBwYXVzZXMgcmFpc2VkIG9uY2UgYGVudHJ5YCdzIGNoYWluIGVuZHMg4oCUIG9uZS1zaG90IChzZWUgVHJhdmVyc2VyT3B0aW9ucy5wZW5kaW5nUGF1c2VzKS4gKi9cbiAgcHJpdmF0ZSBlbnRyeVBlbmRpbmdQYXVzZXM6IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW10gfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgcmVzdW1lJ3Mgb25lLXNob3QgcmUtZW50cnksIHNoYXJlZCB3aXRoIG5lc3RlZCB0cmF2ZXJzZXJzLiBVbmRlZmluZWQgb24gYSBub3JtYWwgcnVuLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc3VtZTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdGFnZU1hcDogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcHJpdmF0ZSBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IElMb2dnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgZGVhZGxpbmUsIGVwb2NoIG1zIChgZW52LmRlYWRsaW5lYCwgc3RhbXBlZCBieSB0aGUgZXhlY3V0b3IncyBgYXJtUnVuYDsgYSBzdWJmbG93IGluaGVyaXRzIHRoZSBlbnYpLlxuICAgKiBVbmRlciBvbmUsIEVWRVJZIHN0YWdlIHJ1bnMgb24gdGhlIGF0dGVtcHQgcnVubmVyLCBzbyBhIGxvbmUgc3RhZ2UgdGhlIGRlYWRsaW5lIGN1dHMgc3RpbGwgbGVhdmVzIGl0cyBhdHRlbXB0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkZWFkbGluZT86IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdWJmbG93SWQ/OiBzdHJpbmc7XG4gIC8qKiBSRkMtMDAzIEQxOiBydW50aW1lU3RhZ2VJZCBvZiB0aGUgc3ViZmxvdyBtb3VudCBzdGFnZSBpbiB0aGUgcGFyZW50XG4gICAqICB0cmF2ZXJzZXIuIEZhbGxiYWNrIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgZm9yIHN0YWdlcyB3aG9zZSBjb250ZXh0IGhhc1xuICAgKiAgbm8gcGFyZW50ICh0aGUgc3ViZmxvdyByb290KS4gVW5kZWZpbmVkIGF0IHRoZSB0b3AgbGV2ZWwuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlbWl0RHJpbGxQYXRoOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgLyoqIFZhbGlkYXRlZCB2YWx1ZSBwYXNzZWQgdmlhIGBydW4oe2lucHV0fSlgLiBSb290IGJvdW5kYXJ5IG9ic2VydmVyc1xuICAgKiAgcmVjZWl2ZSBpdHMgcmV0YWluZWQgZm9ybTsgc3RhZ2UgYXJndW1lbnRzIGtlZXAgdGhlIG9yaWdpbmFsIGRhdGEuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIFRoZSBoYW5kbGVycycgc2hhcmVkIGRlcHMg4oCUIGl0cyBgcmVhZE9ubHlDb250ZXh0YCBpcyB0aGUgbGVnJ3MgaW5wdXQgc25hcHNob3QsIHNldCBieSBgZXhlY3V0ZWAuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwczogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFBlci1gZXhlY3V0b3IucnVuKClgIGlkZW50aWZpZXIuIFN0YW1wZWQgb250byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0LlxuICAgKiAgSW5oZXJpdGVkIGJ5IHN1YmZsb3cgdHJhdmVyc2VycyBzbyBhbGwgZXZlbnRzIG9mIG9uZSBydW4gc2hhcmUgb25lIHJ1bklkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgbGVnJ3MgY29ycmVsYXRpb24g4oCUIG9uZSBmcm96ZW4gb2JqZWN0LCBzdGFtcGVkIG9uIGV2ZXJ5IFRyYXZlcnNhbENvbnRleHQ7IGluaGVyaXRlZCBieSBzdWJmbG93cy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb3JyZWxhdGlvbj86IFJ1bkNvcnJlbGF0aW9uO1xuXG4gIC8vIEhhbmRsZXIgbW9kdWxlc1xuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVSZXNvbHZlcjogTm9kZVJlc29sdmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW5FeGVjdXRvcjogQ2hpbGRyZW5FeGVjdXRvcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YmZsb3dFeGVjdXRvcjogU3ViZmxvd0V4ZWN1dG9yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhZ2VSdW5uZXI6IFN0YWdlUnVubmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGludWF0aW9uUmVzb2x2ZXI6IENvbnRpbnVhdGlvblJlc29sdmVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjaWRlckhhbmRsZXI6IERlY2lkZXJIYW5kbGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0b3JIYW5kbGVyOiBTZWxlY3RvckhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJhbGxlbEZvckVhY2hIYW5kbGVyOiBQYXJhbGxlbEZvckVhY2hIYW5kbGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RydWN0dXJlTWFuYWdlcjogUnVudGltZVN0cnVjdHVyZU1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmFycmF0aXZlR2VuZXJhdG9yOiBJQ29udHJvbEZsb3dOYXJyYXRpdmU7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd1JlY29yZGVyRGlzcGF0Y2hlcjogRmxvd1JlY29yZGVyRGlzcGF0Y2hlciB8IHVuZGVmaW5lZDtcblxuICAvLyBFeGVjdXRpb24gc3RhdGVcbiAgcHJpdmF0ZSBzdWJmbG93UmVzdWx0czogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIFBlci10cmF2ZXJzZXIgc2V0IG9mIGxhenkgc3ViZmxvdyBJRHMgdGhhdCBoYXZlIGJlZW4gcmVzb2x2ZWQgYnkgVEhJUyBydW4uXG4gICAqIFVzZWQgaW5zdGVhZCBvZiB3cml0aW5nIGBub2RlLnN1YmZsb3dSZXNvbHZlciA9IHVuZGVmaW5lZGAgYmFjayB0byB0aGUgc2hhcmVkXG4gICAqIFN0YWdlTm9kZSBncmFwaCDigJQgYXZvaWRzIGEgcmFjZSB3aGVyZSBhIGNvbmN1cnJlbnQgdHJhdmVyc2VyIGNsZWFycyB0aGUgc2hhcmVkXG4gICAqIHJlc29sdmVyIGJlZm9yZSBhbm90aGVyIHRyYXZlcnNlciBoYXMgZmluaXNoZWQgdXNpbmcgaXQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVkTGF6eVN1YmZsb3dzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFBlci10cmF2ZXJzZXIgb3ZlcmxheSBvZiBkeW5hbWljIFN0YWdlTm9kZSByZXR1cm5zLCBrZXllZCBieSBgbm9kZS5pZGAuXG4gICAqIFBoYXNlIDQgd3JpdGVzIHBhdGNoZXMgSEVSRSBpbnN0ZWFkIG9mIG11dGF0aW5nIHRoZSBzaGFyZWQgYnVpbHQtY2hhcnRcbiAgICogbm9kZSBvYmplY3RzIChzYW1lIGlzb2xhdGlvbiBjb252ZW50aW9uIGFzIGByZXNvbHZlZExhenlTdWJmbG93c2ApLlxuICAgKiBBbGwgZW5naW5lIHJlYWRzIG9mIHRoZSBwYXRjaGVkIGZpZWxkcyBnbyB0aHJvdWdoIHRoZSBgZWZmKmAgYWNjZXNzb3JzXG4gICAqIGJlbG93LiBUaGUgbWFwIGRpZXMgd2l0aCB0aGUgdHJhdmVyc2VyIOKAlCBvbmUgcnVuLCBvbmUgb3ZlcmxheSDigJQgc28gYVxuICAgKiBmcmVzaCBleGVjdXRvciBvdmVyIHRoZSBzYW1lIGJ1aWx0IGNoYXJ0IGFsd2F5cyBzZWVzIHRoZSBvcmlnaW5hbCBncmFwaC5cbiAgICpcbiAgICogS2V5ZWQgYnkgdGhlIG5vZGUgT0JKRUNUIChXZWFrTWFwKSwgbm90IGBub2RlLmlkYDogYSBkeW5hbWljIGNoaWxkIHRoYXRcbiAgICogcmV1c2VzIGEgYnVpbHQgbm9kZSdzIGlkIG11c3QgTk9UIG1ha2UgdGhlIGJ1aWx0IG5vZGUgaW5oZXJpdCB0aGUgcGF0Y2hcbiAgICogKGlkLWtleWVkIGxvb2t1cCBjYXVzZWQgcGhhbnRvbSBkb3VibGUtZXhlY3V0aW9uKS4gYHBhdGNoQ291bnRgIGlzIHRoZVxuICAgKiBmYXN0LXBhdGggY2hlY2sg4oCUIFdlYWtNYXAgaGFzIG5vIGBzaXplYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY1BhdGNoZXMgPSBuZXcgV2Vha01hcDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+PigpO1xuICBwcml2YXRlIHBhdGNoQ291bnQgPSAwO1xuXG4gIC8qKlxuICAgKiBUaGUgZnJhbWUgKE5FU1RJTkcgZGVwdGggKyBicmFuY2gtZnJhbWUgcmFuLXNldHMpIG9mIHRoZSBkcml2ZXIgdGhhdCByYW4gZWFjaCBzdGFnZSBjb250ZXh0IOKAlCBkZXB0aCBpcyBhXG4gICAqIHByb3BlcnR5IG9mIHRoZSBjYWxsIFBBVEgsIHNvIGl0IHRyYXZlbHMgd2l0aCB0aGUgY29udGV4dHMsIG5vdCBpbiBvbmVcbiAgICogcGVyLXRyYXZlcnNlciBjb3VudGVyLiBBIG5lc3RlZCBkcml2ZXIgKGZvcmsvc2VsZWN0b3IgY2hpbGQsIGEgZGVjaWRlcidzXG4gICAqIGJyYW5jaCBmcmFtZSkgc2l0cyBvbmUgbGV2ZWwgYmVsb3cgdGhlIGRyaXZlciB0aGF0IHJhbiB0aGUgY29udGV4dCBpdHNcbiAgICogb3duIGNvbnRleHQgd2FzIGNyZWF0ZWQgZnJvbSAoYFN0YWdlQ29udGV4dC5wYXJlbnRgKSDigJQgc28gcGFyYWxsZWxcbiAgICogc2libGluZ3Mgc2hhcmUgb25lIGRlcHRoLCBhbmQgNTIwIGNoaWxkcmVuIG9mIG9uZSBmb3JrIGFyZSA1MjAgZHJpdmVyc1xuICAgKiBhdCB0aGUgc2FtZSBsZXZlbCAodGhyb3VnaCA5LjM5LjAgYSBzaGFyZWQgY291bnRlciBtYWRlIHRoZW0gNTIwIGxldmVscykuXG4gICAqXG4gICAqIExpbmVhciBgbmV4dGAgY2hhaW5zLCBsb29wIGVkZ2VzLCBhbmQgZHluYW1pYyBjb250aW51YXRpb25zIGFyZSBmb2xsb3dlZFxuICAgKiBJVEVSQVRJVkVMWSBpbnNpZGUgb25lIGRyaXZlciBpbnZvY2F0aW9uLCBzbyB0aGV5IG5ldmVyIGFkZCBhIGxldmVsLlxuICAgKiBPbmx5IHRydWUgdHJlZSByZWN1cnNpb24gZG9lczogZm9yayBjaGlsZHJlbiwgZGVjaWRlci9zZWxlY3RvciBicmFuY2hcbiAgICogZGlzcGF0Y2ggKHdoZW4gdGhlIGRlY2lkZXIgaGFzIGl0cyBvd24gY29udGludWF0aW9uKSwgYW5kIHVuYm91bmRlZFxuICAgKiBkeW5hbWljIHJlY3Vyc2lvbi4gUHJldmVudHMgY2FsbC1zdGFjayBvdmVyZmxvdyBvbiBydW5hd2F5IHJlY3Vyc2l2ZVxuICAgKiBjb21wb3NpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZyYW1lT2YgPSBuZXcgV2Vha01hcDxTdGFnZUNvbnRleHQsIERyaXZlckZyYW1lPigpO1xuXG4gIC8qKiBgbmV4dGAtY2hhaW4gaWRzIHBlciBkZWNpZGVyIGNvbnRpbnVhdGlvbiBoZWFkIChgdGFpbElkc2ApLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF90YWlsSWRzID0gbmV3IFdlYWtNYXA8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIFJlYWRvbmx5U2V0PHN0cmluZyB8IHVuZGVmaW5lZD4+KCk7XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBtdXRhYmxlIGV4ZWN1dGlvbiBjb3VudGVyIOKAlCBtb25vdG9uaWMsIGluY3JlbWVudGVkIHBlciBzdGFnZSBleGVjdXRpb24uXG4gICAqIFNoYXJlZCB3aXRoIGNoaWxkIHRyYXZlcnNlcnMgKHN1YmZsb3dzKSBzbyBpbmRpY2VzIGFyZSBnbG9iYWxseSB1bmlxdWUgd2l0aGluIGEgcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZXhlY3V0aW9uQ291bnRlcjogeyB2YWx1ZTogbnVtYmVyIH07XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBwZXItcnVuIHZpc2l0IGNvdW50cyBrZXllZCBieSBzdGFnZUlkIOKAlCBob3cgbWFueSB0aW1lcyBlYWNoIHN0YWdlXG4gICAqIGhhcyBleGVjdXRlZCBpbiB0aGlzIHJ1bi4gU2hhcmVkIHdpdGggY2hpbGQgdHJhdmVyc2VycyAoc3ViZmxvd3MpIHNvIGFcbiAgICogbG9vcGVkLWJhY2sgc3RhZ2UncyBpdGVyYXRpb24gY291bnQgaXMgbW9ub3RvbmljIGFjcm9zcyBzdWJmbG93IHJlLW1vdW50cyxcbiAgICogbWF0Y2hpbmcgdGhlIG5hcnJhdGl2ZSByZWNvcmRlcidzIHNpbmdsZS1tYXAgc2VtYW50aWNzLiBEcml2ZXNcbiAgICogYFRyYXZlcnNhbENvbnRleHQubG9vcEl0ZXJhdGlvbmAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF92aXNpdENvdW50czogTWFwPHN0cmluZywgbnVtYmVyPjtcblxuICAvKipcbiAgICogUGVyLWluc3RhbmNlIG1heGltdW0gZGVwdGggKHNldCBmcm9tIFRyYXZlcnNlck9wdGlvbnMubWF4RGVwdGggb3IgdGhlIGNsYXNzIGRlZmF1bHQpLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4RGVwdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogUGVyLWluc3RhbmNlIGxvb3AtaXRlcmF0aW9uIGxpbWl0IGZvcndhcmRlZCB0byB0aGUgQ29udGludWF0aW9uUmVzb2x2ZXJcbiAgICogYW5kIHByb3BhZ2F0ZWQgdG8gc3ViZmxvdyB0cmF2ZXJzZXJzLiBVbmRlZmluZWQg4oaSIHJlc29sdmVyIGRlZmF1bHQgKDEwMDApLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIG5lc3RlZCBleGVjdXRlTm9kZSBkZXB0aCBiZWZvcmUgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKlxuICAgKiAqKldoYXQgY291bnRzIGFzIGRlcHRoICh0cmFtcG9saW5lIG1vZGVsKToqKiBgZXhlY3V0ZU5vZGVgIGlzIGFuIGl0ZXJhdGl2ZVxuICAgKiBkcml2ZXIg4oCUIGxpbmVhciBgbmV4dGAgaG9wcywgbG9vcCBlZGdlcyAoYGxvb3BUb2AvZHluYW1pYyBuZXh0KSwgYW5kXG4gICAqIGR5bmFtaWMtc3ViZmxvdyByZS1lbnRyeSBhcmUgZm9sbG93ZWQgaW4gYSBmbGF0IGxvb3AgYW5kIGNvbnN1bWUgTk8gZGVwdGguXG4gICAqIERlcHRoIGdyb3dzIG9ubHkgd2l0aCB0cnVlIHRyZWUgbmVzdGluZzogb25lIHRpY2sgcGVyIGZvcmsgY2hpbGQsIG9uZSBwZXJcbiAgICogZGVjaWRlci9zZWxlY3RvciBicmFuY2ggZGlzcGF0Y2ggdGhhdCBtdXN0IHJldHVybiB0byBpdHMgaW52b2tlciAoZGVjaWRlclxuICAgKiB3aXRoIGl0cyBvd24gYG5leHRgKSwgb25lIHBlciBzdWJmbG93IG1vdW50IGZyYW1lIGluIHRoZSBwYXJlbnQgKHRoZVxuICAgKiBzdWJmbG93IGJvZHkgaXRzZWxmIHJ1bnMgb24gYSBGUkVTSCB0cmF2ZXJzZXIgd2l0aCBpdHMgb3duIGJ1ZGdldCkuXG4gICAqXG4gICAqIDUwMCB0aGVyZWZvcmUgY292ZXJzIGFueSByZWFsaXN0aWMgY2hhcnQg4oCUIGl0IGJvdW5kcyByZWN1cnNpdmVcbiAgICogQ09NUE9TSVRJT04sIG5vdCBjaGFpbiBsZW5ndGggb3IgbG9vcCBjb3VudC4gTG9vcHMgYXJlIGJvdW5kZWQgYnlcbiAgICogYENvbnRpbnVhdGlvblJlc29sdmVyYCdzIGluZGVwZW5kZW50IGl0ZXJhdGlvbiBsaW1pdCAoZGVmYXVsdCAxMDAwLFxuICAgKiBjb25maWd1cmFibGUgdmlhIGBSdW5PcHRpb25zLm1heEl0ZXJhdGlvbnNgKSwgd2hpY2ggaXMgbm93IHRoZSBiaW5kaW5nXG4gICAqIGNvbnN0cmFpbnQgZm9yIGxvb3AtaGVhdnkgcGlwZWxpbmVzLlxuICAgKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncyBzaGFyZSB0aGVpciBwYXJlbnQncyBkZXB0aCArIDEg4oCUIGEgZm9yayBvciBzZWxlY3RvciBvZiBhbnkgd2lkdGggaXNcbiAgICogb25lIGxldmVsLCBuZXZlciBvbmUgbGV2ZWwgcGVyIGNoaWxkLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3Qgc2FmZSBmb3IgY29uY3VycmVudCBgLmV4ZWN1dGUoKWAgY2FsbHMgb24gdGhlIHNhbWUgaW5zdGFuY2UgKHRoZSBicmVhayBmbGFnXG4gICAqIGFuZCB0aGUgcmVzb2x2ZXIncyBsb29wIGNvdW50cyBhcmUgcGVyIGluc3RhbmNlKS4gVXNlIGEgc2VwYXJhdGUgYEZsb3djaGFydFRyYXZlcnNlcmAgcGVyXG4gICAqIGNvbmN1cnJlbnQgZXhlY3V0aW9uLiBgRmxvd0NoYXJ0RXhlY3V0b3IucnVuKClgIGFsd2F5cyBjcmVhdGVzIGEgZnJlc2ggdHJhdmVyc2VyIHBlciBjYWxsLlxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IE1BWF9FWEVDVVRFX0RFUFRIID0gNTAwO1xuXG4gIGNvbnN0cnVjdG9yKG9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPikge1xuICAgIGNvbnN0IG1heERlcHRoID0gb3B0cy5tYXhEZXB0aCA/PyBGbG93Y2hhcnRUcmF2ZXJzZXIuTUFYX0VYRUNVVEVfREVQVEg7XG4gICAgaWYgKG1heERlcHRoIDwgMSkgdGhyb3cgbmV3IEVycm9yKCdGbG93Y2hhcnRUcmF2ZXJzZXI6IG1heERlcHRoIG11c3QgYmUgPj0gMScpO1xuICAgIHRoaXMuX21heERlcHRoID0gbWF4RGVwdGg7XG4gICAgaWYgKG9wdHMubWF4SXRlcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIG9wdHMubWF4SXRlcmF0aW9ucyA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmxvd2NoYXJ0VHJhdmVyc2VyOiBtYXhJdGVyYXRpb25zIG11c3QgYmUgPj0gMScpO1xuICAgIH1cbiAgICB0aGlzLl9tYXhJdGVyYXRpb25zID0gb3B0cy5tYXhJdGVyYXRpb25zO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIgPSBvcHRzLmV4ZWN1dGlvbkNvdW50ZXIgPz8geyB2YWx1ZTogMCB9O1xuICAgIHRoaXMuX3Zpc2l0Q291bnRzID0gb3B0cy52aXNpdENvdW50cyA/PyBuZXcgTWFwKCk7XG4gICAgdGhpcy5yb290ID0gb3B0cy5yb290O1xuICAgIHRoaXMuZW50cnkgPSBvcHRzLmVudHJ5O1xuICAgIHRoaXMuZW50cnlQZW5kaW5nUGF1c2VzID0gb3B0cy5lbnRyeSA/IG9wdHMucGVuZGluZ1BhdXNlcyA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlc3VtZSA9IG9wdHMucmVzdW1lO1xuICAgIC8vIFNoYWxsb3ctY29weSBzdGFnZU1hcCBhbmQgc3ViZmxvd3Mgc28gdGhhdCBsYXp5LXJlc29sdXRpb24gbXV0YXRpb25zXG4gICAgLy8gKHByZWZpeGVkIGVudHJpZXMgYWRkZWQgZHVyaW5nIGV4ZWN1dGlvbikgc3RheSBzY29wZWQgdG8gVEhJUyB0cmF2ZXJzZXJcbiAgICAvLyBhbmQgZG8gbm90IGVzY2FwZSB0byB0aGUgc2hhcmVkIEZsb3dDaGFydCBvYmplY3QuIFdpdGhvdXQgdGhlIGNvcHksXG4gICAgLy8gY29uY3VycmVudCBGbG93Q2hhcnRFeGVjdXRvciBydW5zIHNoYXJpbmcgdGhlIHNhbWUgRmxvd0NoYXJ0IHdvdWxkIHJhY2VcbiAgICAvLyBvbiB0aGVzZSB0d28gbXV0YWJsZSBkaWN0aW9uYXJpZXMuXG4gICAgdGhpcy5zdGFnZU1hcCA9IG5ldyBNYXAob3B0cy5zdGFnZU1hcCk7XG4gICAgdGhpcy5leGVjdXRpb25SdW50aW1lID0gb3B0cy5leGVjdXRpb25SdW50aW1lO1xuICAgIHRoaXMuc3ViZmxvd3MgPSBvcHRzLnN1YmZsb3dzID8geyAuLi5vcHRzLnN1YmZsb3dzIH0gOiB7fTtcbiAgICB0aGlzLmxvZ2dlciA9IG9wdHMubG9nZ2VyO1xuICAgIHRoaXMuc2lnbmFsID0gb3B0cy5zaWduYWw7XG4gICAgdGhpcy5kZWFkbGluZSA9IHJlYWREZWFkbGluZShvcHRzLmV4ZWN1dGlvbkVudj8uZGVhZGxpbmUpO1xuICAgIHRoaXMucGFyZW50U3ViZmxvd0lkID0gb3B0cy5wYXJlbnRTdWJmbG93SWQ7XG4gICAgdGhpcy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkID0gb3B0cy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkO1xuICAgIC8vIE1pc3NpbmcgYW5jZXN0cnkgaW4gYSBoYW5kLWJ1aWx0IG5lc3RlZCB0cmF2ZXJzZXIgaXMgdW5rbm93biwgbmV2ZXJcbiAgICAvLyBndWVzc2VkIGFzIHJvb3QuIFRoZSBub3JtYWwgc3ViZmxvdyBmYWN0b3J5IHN1cHBsaWVzIHRoZSBmdWxsIHBhdGguXG4gICAgY29uc3QgZW1pdERyaWxsUGF0aCA9XG4gICAgICBvcHRzLmVtaXREcmlsbFBhdGggPz8gKG9wdHMucGFyZW50U3ViZmxvd0lkIHx8IG9wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZCA/IHVuZGVmaW5lZCA6IFtdKTtcbiAgICB0aGlzLmVtaXREcmlsbFBhdGggPSBlbWl0RHJpbGxQYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBPYmplY3QuZnJlZXplKFsuLi5lbWl0RHJpbGxQYXRoXSk7XG4gICAgdGhpcy5yZWFkT25seUNvbnRleHQgPSBvcHRzLnJlYWRPbmx5Q29udGV4dDtcbiAgICB0aGlzLnJ1bklkID0gb3B0cy5ydW5JZDtcbiAgICB0aGlzLmNvcnJlbGF0aW9uID0gb3B0cy5jb3JyZWxhdGlvbjtcblxuICAgIC8vIFN0cnVjdHVyZSBtYW5hZ2VyIChkZWVwLWNsb25lcyBidWlsZC10aW1lIHN0cnVjdHVyZSlcbiAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIgPSBuZXcgUnVudGltZVN0cnVjdHVyZU1hbmFnZXIoKTtcbiAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIuaW5pdChvcHRzLmJ1aWxkVGltZVN0cnVjdHVyZSk7XG5cbiAgICAvLyBOYXJyYXRpdmUgZ2VuZXJhdG9yXG4gICAgLy8gUHJpb3JpdHk6IGV4cGxpY2l0IG5hcnJhdGl2ZUdlbmVyYXRvciA+IGZsb3dSZWNvcmRlcnMgPiBkZWZhdWx0IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciA+IG51bGwuXG4gICAgLy8gU3ViZmxvdyB0cmF2ZXJzZXJzIHJlY2VpdmUgdGhlIHBhcmVudCdzIG5hcnJhdGl2ZUdlbmVyYXRvciBzbyBhbGwgZXZlbnRzIGZsb3cgdG8gb25lIHBsYWNlLlxuICAgIGlmIChvcHRzLm5hcnJhdGl2ZUdlbmVyYXRvcikge1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBvcHRzLm5hcnJhdGl2ZUdlbmVyYXRvcjtcbiAgICB9IGVsc2UgaWYgKG9wdHMubmFycmF0aXZlRW5hYmxlZCkge1xuICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IG5ldyBGbG93UmVjb3JkZXJEaXNwYXRjaGVyKCk7XG4gICAgICB0aGlzLmZsb3dSZWNvcmRlckRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyO1xuXG4gICAgICAvLyBJZiBjdXN0b20gRmxvd1JlY29yZGVycyBhcmUgcHJvdmlkZWQsIHVzZSB0aGVtOyBvdGhlcndpc2UgYXR0YWNoIGRlZmF1bHQgTmFycmF0aXZlRmxvd1JlY29yZGVyXG4gICAgICBpZiAob3B0cy5mbG93UmVjb3JkZXJzICYmIG9wdHMuZmxvd1JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkZXIgb2Ygb3B0cy5mbG93UmVjb3JkZXJzKSB7XG4gICAgICAgICAgZGlzcGF0Y2hlci5hdHRhY2gocmVjb3JkZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXNwYXRjaGVyLmF0dGFjaChuZXcgTmFycmF0aXZlRmxvd1JlY29yZGVyKCkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IGRpc3BhdGNoZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gbmV3IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvcigpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIHNoYXJlZCBkZXBzIGJhZ1xuICAgIGNvbnN0IGRlcHMgPSB0aGlzLmNyZWF0ZURlcHMob3B0cyk7XG4gICAgdGhpcy5kZXBzID0gZGVwcztcblxuICAgIC8vIEJ1aWxkIE8oMSkgbm9kZSBJRCBtYXAgZnJvbSB0aGUgcm9vdCBncmFwaCAoYXZvaWRzIHJlcGVhdGVkIERGUyBvbiBldmVyeSBsb29wVG8oKSkuXG4gICAgLy8gRnJvbSBgcm9vdGAsIG5ldmVyIGZyb20gYGVudHJ5YDogYSByZXN1bWUncyBzdGFuZC1pbiBjYXJyaWVzIHRoZSBwYXVzZWRcbiAgICAvLyBzdGFnZSdzIGlkLCBhbmQgYSBsb29wIGJhY2sgdG8gdGhhdCBpZCBtdXN0IGZpbmQgdGhlIFJFQUwgc3RhZ2UuXG4gICAgY29uc3Qgbm9kZUlkTWFwID0gdGhpcy5idWlsZE5vZGVJZE1hcChvcHRzLnJvb3QpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBoYW5kbGVyIG1vZHVsZXMuXG4gICAgLy8gTm9kZVJlc29sdmVyJ3MgREZTIGZhbGxiYWNrIHJlc29sdmVzIGxvb3AgdGFyZ2V0cyBhZ2FpbnN0IHRoZSBMSVZFXG4gICAgLy8gcnVudGltZSBzaGFwZSwgc28gaXQgcmVhZHMgY2hpbGRyZW4gdGhyb3VnaCB0aGUgZHluYW1pYy1wYXRjaCBvdmVybGF5XG4gICAgLy8gKGEgbG9vcCBjYW4gdGFyZ2V0IGEgbm9kZSBhZGRlZCBieSBhIGR5bmFtaWMgU3RhZ2VOb2RlIHJldHVybikuXG4gICAgdGhpcy5ub2RlUmVzb2x2ZXIgPSBuZXcgTm9kZVJlc29sdmVyKGRlcHMsIG5vZGVJZE1hcCwgKG4pID0+IHRoaXMuZWZmQ2hpbGRyZW4obikpO1xuICAgIHRoaXMuY2hpbGRyZW5FeGVjdXRvciA9IG5ldyBDaGlsZHJlbkV4ZWN1dG9yKGRlcHMsIHRoaXMuZXhlY3V0ZU5vZGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5zdGFnZVJ1bm5lciA9IG5ldyBTdGFnZVJ1bm5lcihkZXBzKTtcbiAgICB0aGlzLmNvbnRpbnVhdGlvblJlc29sdmVyID0gbmV3IENvbnRpbnVhdGlvblJlc29sdmVyKFxuICAgICAgZGVwcyxcbiAgICAgIHRoaXMubm9kZVJlc29sdmVyLFxuICAgICAgKG5vZGVJZCwgY291bnQpID0+IHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVJdGVyYXRpb25Db3VudChub2RlSWQsIGNvdW50KSxcbiAgICAgIHRoaXMuX21heEl0ZXJhdGlvbnMsXG4gICAgKTtcbiAgICB0aGlzLmRlY2lkZXJIYW5kbGVyID0gbmV3IERlY2lkZXJIYW5kbGVyKGRlcHMpO1xuICAgIHRoaXMuc2VsZWN0b3JIYW5kbGVyID0gbmV3IFNlbGVjdG9ySGFuZGxlcihkZXBzLCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IpO1xuICAgIHRoaXMuc3ViZmxvd0V4ZWN1dG9yID0gbmV3IFN1YmZsb3dFeGVjdXRvcihkZXBzLCB0aGlzLmNyZWF0ZVN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5KG9wdHMpKTtcbiAgICB0aGlzLnBhcmFsbGVsRm9yRWFjaEhhbmRsZXIgPSBuZXcgUGFyYWxsZWxGb3JFYWNoSGFuZGxlcihkZXBzLCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IsIHtcbiAgICAgIHByZWZpeE5vZGVUcmVlOiAobiwgcHJlZml4KSA9PiB0aGlzLnByZWZpeE5vZGVUcmVlKG4sIHByZWZpeCksXG4gICAgICByZWdpc3RlckJyYW5jaFN1YmZsb3c6IChzdWJmbG93SWQsIHJvb3QsIGNoYXJ0KSA9PiB0aGlzLnJlZ2lzdGVyQnJhbmNoU3ViZmxvdyhzdWJmbG93SWQsIHJvb3QsIGNoYXJ0KSxcbiAgICAgIGJyYW5jaFNoYXJlZFN0YXRlOiAoc3ViZmxvd0lkKSA9PlxuICAgICAgICB0aGlzLnN1YmZsb3dSZXN1bHRzLmdldChzdWJmbG93SWQpPy50cmVlQ29udGV4dD8uZ2xvYmFsQ29udGV4dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAgIHJlY29yZEJyYW5jaFN0cnVjdHVyZTogKG5vZGVJZCwgYnJhbmNoZXMpID0+IHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljQ2hpbGRyZW4obm9kZUlkLCBicmFuY2hlcyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZmFjdG9yeSB0aGF0IHByb2R1Y2VzIEZsb3djaGFydFRyYXZlcnNlciBpbnN0YW5jZXMgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICAgKiBDYXB0dXJlcyBwYXJlbnQgY29uZmlnIGluIGNsb3N1cmUg4oCUIFN1YmZsb3dFeGVjdXRvciBwcm92aWRlcyBzdWJmbG93LXNwZWNpZmljIG92ZXJyaWRlcy5cbiAgICogRWFjaCBzdWJmbG93IGdldHMgYSBmdWxsIHRyYXZlcnNlciB3aXRoIGFsbCA3IHBoYXNlcyAoZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGV0Yy4pLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShcbiAgICBwYXJlbnRPcHRzOiBUcmF2ZXJzZXJPcHRpb25zPFRPdXQsIFRTY29wZT4sXG4gICk6IFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5PFRPdXQsIFRTY29wZT4ge1xuICAgIC8vIENhcHR1cmUgcmVmZXJlbmNlcyB0byBtdXRhYmxlIHN0YXRlIOKAlCBmYWN0b3J5IHJlYWRzIHRoZSBDVVJSRU5UIHN0YXRlIHdoZW4gY2FsbGVkLFxuICAgIC8vIG5vdCB0aGUgc3RhdGUgYXQgZmFjdG9yeSBjcmVhdGlvbiB0aW1lLiBUaGlzIGlzIGNvcnJlY3QgYmVjYXVzZSBsYXp5IHN1YmZsb3cgcmVzb2x1dGlvblxuICAgIC8vIG1heSBhZGQgZW50cmllcyB0byBzdGFnZU1hcC9zdWJmbG93cyBiZWZvcmUgYSBuZXN0ZWQgc3ViZmxvdyBpcyBlbmNvdW50ZXJlZC5cbiAgICBjb25zdCBwYXJlbnRTdGFnZU1hcCA9IHRoaXMuc3RhZ2VNYXA7XG4gICAgY29uc3QgcGFyZW50U3ViZmxvd3MgPSB0aGlzLnN1YmZsb3dzO1xuICAgIGNvbnN0IG5hcnJhdGl2ZUdlbmVyYXRvciA9IHRoaXMubmFycmF0aXZlR2VuZXJhdG9yO1xuXG4gICAgcmV0dXJuIChzdWJmbG93T3B0cykgPT4ge1xuICAgICAgY29uc3QgdHJhdmVyc2VyID0gbmV3IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+KHtcbiAgICAgICAgcm9vdDogc3ViZmxvd09wdHMucm9vdCxcbiAgICAgICAgLi4uKHN1YmZsb3dPcHRzLmVudHJ5ICYmIHsgZW50cnk6IHN1YmZsb3dPcHRzLmVudHJ5IH0pLCAvLyBhIHJlc3VtZSBob3AncyBlbnRyeSBwb2ludFxuICAgICAgICAuLi4oc3ViZmxvd09wdHMucGVuZGluZ1BhdXNlcyAmJiB7IHBlbmRpbmdQYXVzZXM6IHN1YmZsb3dPcHRzLnBlbmRpbmdQYXVzZXMgfSksXG4gICAgICAgIHN0YWdlTWFwOiBwYXJlbnRTdGFnZU1hcCwgLy8gQ29uc3RydWN0b3Igc2hhbGxvdy1jb3BpZXMgdGhpc1xuICAgICAgICBzY29wZUZhY3Rvcnk6IHBhcmVudE9wdHMuc2NvcGVGYWN0b3J5LFxuICAgICAgICBleGVjdXRpb25SdW50aW1lOiBzdWJmbG93T3B0cy5leGVjdXRpb25SdW50aW1lLFxuICAgICAgICByZWFkT25seUNvbnRleHQ6IHN1YmZsb3dPcHRzLnJlYWRPbmx5Q29udGV4dCxcbiAgICAgICAgZXhlY3V0aW9uRW52OiBwYXJlbnRPcHRzLmV4ZWN1dGlvbkVudixcbiAgICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogcGFyZW50T3B0cy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgICBzdHJlYW1IYW5kbGVyczogcGFyZW50T3B0cy5zdHJlYW1IYW5kbGVycyxcbiAgICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogcGFyZW50T3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgICBzdWJmbG93czogcGFyZW50U3ViZmxvd3MsIC8vIENvbnN0cnVjdG9yIHNoYWxsb3ctY29waWVzIHRoaXNcbiAgICAgICAgbmFycmF0aXZlR2VuZXJhdG9yLCAvLyBTaGFyZSBwYXJlbnQncyDigJQgYWxsIGV2ZW50cyBmbG93IHRvIG9uZSBwbGFjZVxuICAgICAgICBsb2dnZXI6IHBhcmVudE9wdHMubG9nZ2VyLFxuICAgICAgICBzaWduYWw6IHBhcmVudE9wdHMuc2lnbmFsLFxuICAgICAgICBtYXhEZXB0aDogdGhpcy5fbWF4RGVwdGgsXG4gICAgICAgIC4uLih0aGlzLl9tYXhJdGVyYXRpb25zICE9PSB1bmRlZmluZWQgJiYgeyBtYXhJdGVyYXRpb25zOiB0aGlzLl9tYXhJdGVyYXRpb25zIH0pLFxuICAgICAgICBwYXJlbnRTdWJmbG93SWQ6IHN1YmZsb3dPcHRzLnN1YmZsb3dJZCxcbiAgICAgICAgLy8gUkZDLTAwMyBEMTogdGhlIG1vdW50IHN0YWdlJ3MgcnVudGltZVN0YWdlSWQg4oCUIHBhcmVudCBmYWxsYmFjayBmb3JcbiAgICAgICAgLy8gdGhlIHN1YmZsb3cncyByb290IHN0YWdlIHNvIGFuY2VzdG9yIGNoYWlucyBjcm9zcyB0aGUgYm91bmRhcnkuXG4gICAgICAgIHBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ6IHN1YmZsb3dPcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWQsXG4gICAgICAgIGVtaXREcmlsbFBhdGg6XG4gICAgICAgICAgdGhpcy5lbWl0RHJpbGxQYXRoICE9PSB1bmRlZmluZWQgJiYgc3ViZmxvd09wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZFxuICAgICAgICAgICAgPyBbLi4udGhpcy5lbWl0RHJpbGxQYXRoLCBzdWJmbG93T3B0cy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGV4ZWN1dGlvbkNvdW50ZXI6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIsIC8vIFNoYXJlIGNvdW50ZXIg4oCUIHN1YmZsb3cgY29udGludWVzIGdsb2JhbCBudW1iZXJpbmdcbiAgICAgICAgdmlzaXRDb3VudHM6IHRoaXMuX3Zpc2l0Q291bnRzLCAvLyBTaGFyZSB2aXNpdCBjb3VudHMg4oCUIGxvb3BJdGVyYXRpb24gc3RheXMgbW9ub3RvbmljIGFjcm9zcyBzdWJmbG93IHJlLW1vdW50c1xuICAgICAgICBydW5JZDogdGhpcy5ydW5JZCwgLy8gU3ViZmxvdyBpbmhlcml0cyBwYXJlbnQncyBydW5JZCDigJQgc2FtZSBsb2dpY2FsIHJ1blxuICAgICAgICAuLi4odGhpcy5jb3JyZWxhdGlvbiAmJiB7IGNvcnJlbGF0aW9uOiB0aGlzLmNvcnJlbGF0aW9uIH0pLCAvLyDigKZhbmQgaXRzIGNvcnJlbGF0aW9uLCBieSByZWZlcmVuY2VcbiAgICAgICAgLy8gU2hhcmUgdGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IEJZIFJFRkVSRU5DRSwgc28gYSBob3AgdGFrZW5cbiAgICAgICAgLy8gYXQgYW55IGRlcHRoIGlzIHRha2VuIGZvciB0aGUgd2hvbGUgcnVuIOKAlCBhbmQgbmVzdGVkXG4gICAgICAgIC8vIFN1YmZsb3dFeGVjdXRvcnMgY2FuIHRha2UgdGhlIGRlZXBlciBob3BzIChlLmcuIFNlcXVlbmNlKEFnZW50KC4uLikpXG4gICAgICAgIC8vIHdoZXJlIHRoZSBpbm5lciBBZ2VudCBzdWJmbG93IHBhdXNlZCkuXG4gICAgICAgIC4uLih0aGlzLnJlc3VtZSAmJiB7IHJlc3VtZTogdGhpcy5yZXN1bWUgfSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0ZTogKCkgPT4gdHJhdmVyc2VyLmV4ZWN1dGUoKSxcbiAgICAgICAgZ2V0U3ViZmxvd1Jlc3VsdHM6ICgpID0+IHRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpLFxuICAgICAgICBnZXRCcmVha1N0YXRlOiAoKSA9PiB0cmF2ZXJzZXIuZ2V0QnJlYWtTdGF0ZSgpLFxuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBzKG9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPik6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFnZU1hcDogdGhpcy5zdGFnZU1hcCxcbiAgICAgIHJvb3Q6IHRoaXMucm9vdCxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHRoaXMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgIHNjb3BlRmFjdG9yeTogb3B0cy5zY29wZUZhY3RvcnksXG4gICAgICBzdWJmbG93czogdGhpcy5zdWJmbG93cyxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IG9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzOiBvcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogb3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlID8/ICdlcnJvcicsXG4gICAgICAvLyBUaGUgbGVnJ3MgT05FIG93bmVkIGZyb3plbiBpbnB1dCBzbmFwc2hvdCBpcyB0YWtlbiB3aGVuIHRoZSBsZWcgU1RBUlRTXG4gICAgICAvLyAoYGV4ZWN1dGVgKSwgbmV2ZXIgaGVyZTogYSBnZXR0ZXIgb24gdGhlIGlucHV0IG11c3Qgbm90IHJ1biBhdCBjb25zdHJ1Y3Rpb24uXG4gICAgICByZWFkT25seUNvbnRleHQ6IHVuZGVmaW5lZCxcbiAgICAgIGV4ZWN1dGlvbkVudjogb3B0cy5leGVjdXRpb25FbnYsXG4gICAgICBuYXJyYXRpdmVHZW5lcmF0b3I6IHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLFxuICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgIHNpZ25hbDogb3B0cy5zaWduYWwsXG4gICAgICAuLi4odGhpcy5yZXN1bWUgJiYgeyByZXN1bWU6IHRoaXMucmVzdW1lIH0pLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogSG9sZHMgdGhlIHRvcC1sZXZlbCBicmVhayBmbGFnIGZvciB0aGUgZHVyYXRpb24gb2YgYGV4ZWN1dGUoKWAuIEtlcHQgYXNcbiAgICogYSBmaWVsZCAobm90IGEgbG9jYWwpIHNvIGBnZXRCcmVha1N0YXRlKClgIGNhbiBzdXJmYWNlIHRoZSBmaW5hbCBzdGF0ZVxuICAgKiBmb3IgY2FsbGVycyBsaWtlIGBTdWJmbG93RXhlY3V0b3JgIHRoYXQgaW1wbGVtZW50IGBwcm9wYWdhdGVCcmVha2AuXG4gICAqL1xuICBwcml2YXRlIF90b3BCcmVha0ZsYWc6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9ID0geyBzaG91bGRCcmVhazogZmFsc2UgfTtcblxuICBhc3luYyBleGVjdXRlKGJyYW5jaFBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4ge1xuICAgIC8vIE9ORSBvd25lZCBmcm96ZW4gaW5wdXQgc25hcHNob3QgcGVyIGxlZyAocnVuLCByZXN1bWUsIHN1YmZsb3cgbW91bnQpLCB0YWtlbiBhcyB0aGVcbiAgICAvLyBsZWcgc3RhcnRzIOKAlCBuZXZlciBhdCBjb25zdHJ1Y3Rpb24gKGFuIGV4ZWN1dG9yIGNvbnN0cnVjdHMgYSB0cmF2ZXJzZXIgaXQgbWF5IG5ldmVyXG4gICAgLy8gcnVuKTogZXZlcnkgc2NvcGUgb2YgdGhlIGxlZyBnZXRzIGl0LCBzbyBlYWNoIHBheXMgTyhyb290IGtleXMpLCBub3QgTyhpbnB1dCkuXG4gICAgdGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dCA9IHNuYXBzaG90UnVuSW5wdXQodGhpcy5yZWFkT25seUNvbnRleHQpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcbiAgICB0aGlzLl90b3BCcmVha0ZsYWcgPSB7IHNob3VsZEJyZWFrOiBmYWxzZSB9O1xuICAgIC8vIFRoZSBlbnRyeSBpcyBvbmUtc2hvdDogdGhlIGZpcnN0IGV4ZWN1dGUoKSBzdGFydHMgdGhlcmUsIG5ldmVyIGFnYWluIOKAlFxuICAgIC8vIGFuZCBzbyBhcmUgdGhlIHNpYmxpbmcgcGF1c2VzIHdhaXRpbmcgYmVoaW5kIGl0LlxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5lbnRyeSA/PyB0aGlzLnJvb3Q7XG4gICAgY29uc3Qgd2FpdGluZyA9IHRoaXMuZW50cnlQZW5kaW5nUGF1c2VzO1xuICAgIHRoaXMuZW50cnkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbnRyeVBlbmRpbmdQYXVzZXMgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgd2FsayA9ICgpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4gPT5cbiAgICAgIHdhaXRpbmdcbiAgICAgICAgPyB0aGlzLndhbGtUaGVuUmFpc2Uoc3RhcnQsIGNvbnRleHQsIHdhaXRpbmcsIGJyYW5jaFBhdGgpXG4gICAgICAgIDogdGhpcy5leGVjdXRlTm9kZShzdGFydCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcblxuICAgIC8vIEZpcmUgb25SdW5TdGFydCBPTkxZIGF0IHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2FsIOKAlCBzdWJmbG93IHRyYXZlcnNlcnNcbiAgICAvLyBhbHJlYWR5IHByb2R1Y2Ugb25TdWJmbG93RW50cnkvb25TdWJmbG93RXhpdCBwYWlycywgc28gZW1pdHRpbmcgcnVuXG4gICAgLy8gZXZlbnRzIGZvciB0aGVtIHdvdWxkIGRvdWJsZS1icmFja2V0IHRoZSBib3VuZGFyeSBzdHJlYW0uIFRoZVxuICAgIC8vIHRvcC1sZXZlbCB0cmF2ZXJzZXIgaXMgdGhlIG9uZSB3aXRob3V0IGEgcGFyZW50U3ViZmxvd0lkLlxuICAgIGNvbnN0IGlzVG9wTGV2ZWwgPSB0aGlzLnBhcmVudFN1YmZsb3dJZCA9PT0gdW5kZWZpbmVkO1xuICAgIC8vIFN5bnRoZXRpYyBUcmF2ZXJzYWxDb250ZXh0IGZvciBydW4uZW50cnkgLyBydW4uZXhpdC4gRmllbGRzIHVzZVxuICAgIC8vIHJvb3Qtc3RhZ2UgZGVmYXVsdHMgKHN0YWdlSWQ9J19fcm9vdF9fJywgcnVudGltZVN0YWdlSWQ9J19fcm9vdF9fIzAnLFxuICAgIC8vIGRlcHRoIDApIHNvIHRoZSBydW5JZCBpcyByZWxpYWJseSBhdmFpbGFibGUgb24gcnVuIGV2ZW50cyB3aXRob3V0XG4gICAgLy8gZm9yY2luZyByZWNvcmRlcnMgdG8gaGFuZGxlIGB0cmF2ZXJzYWxDb250ZXh0ID09PSB1bmRlZmluZWRgLlxuICAgIGNvbnN0IHJvb3RDb250ZXh0ID0gcm9vdFRyYXZlcnNhbENvbnRleHQodGhpcy5ydW5JZCwgdGhpcy5jb3JyZWxhdGlvbik7XG4gICAgY29uc3QgcmVkYWN0aW9uUnVsZSA9IGNvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZSgpO1xuICAgIGlmIChpc1RvcExldmVsKSB7XG4gICAgICAvLyBSZXRhaW4gYXQgdGhlIGJvdW5kYXJ5LCBiZWZvcmUgZGlzcGF0Y2ggb3IgZGVmZXJyZWQgY2FwdHVyZSDigJQgdGhlXG4gICAgICAvLyBzYW1lIG93bmVyIGFzIHN1YmZsb3cgZW50cnksIG5vdCBhIHJlY29yZGVyLWxvY2FsIHNjcnViIG9yIGxhdGVyIHdhbGsuXG4gICAgICAvLyBVbmRlciBhIHBvbGljeSB0aGUgd2FsayByZWFkcyB0aGUgbGVnJ3MgT05FIHNuYXBzaG90ICh0YWtlbiBhYm92ZSksIG5ldmVyIHRoZSBsaXZlIGlucHV0XG4gICAgICAvLyBhIHNlY29uZCB0aW1lOyB3aXRob3V0IG9uZSB0aGUgZXZlbnQgY2FycmllcyB0aGUgaW5wdXQgYXMgaXQgYWx3YXlzIGhhcy5cbiAgICAgIGNvbnN0IGlucHV0ID1cbiAgICAgICAgcmVkYWN0aW9uUnVsZSAmJiAhcmVkYWN0aW9uUnVsZS5pc0luZXJ0KClcbiAgICAgICAgICA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkodGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dClcbiAgICAgICAgICA6IHRoaXMucmVhZE9ubHlDb250ZXh0O1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25SdW5TdGFydChpbnB1dCwgcm9vdENvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFRvcC1sZXZlbCBydW5zIGNsb3NlIHRoZWlyIGJvdW5kYXJ5IFNZTU1FVFJJQ0FMTFk6IGV2ZXJ5IG9uUnVuU3RhcnRcbiAgICAvLyBpcyBmb2xsb3dlZCBieSBleGFjdGx5IG9uZSBvblJ1bkVuZCAoY2xlYW4pIG9yIG9uUnVuRmFpbGVkIChlcnJvcikuXG4gICAgLy8gV2l0aG91dCB0aGUgY2F0Y2gsIGEgdGhyb3duIHJ1biBmaXJlZCBvblJ1blN0YXJ0IHRoZW4gbm90aGluZyDigJQgYVxuICAgIC8vIG1vbml0b3IgY291bGRuJ3QgdGVsbCBcInN0aWxsIHJ1bm5pbmdcIiBmcm9tIFwiY3Jhc2hlZC5cIiBQYXVzZSBpcyBOT1RcbiAgICAvLyBhbiBlcnJvciAoaXQncyBleHBlY3RlZCBzdXNwZW5zaW9uKSwgc28gaXQgc2tpcHMgb25SdW5GYWlsZWQgYW5kXG4gICAgLy8gcmUtdGhyb3dzIHVudG91Y2hlZC4gVGhlIHN0YWdlLWxldmVsIGNhdGNoIGFscmVhZHkgcmVjb3JkZWQgdGhlXG4gICAgLy8gZmFpbGluZyBzdGFnZSAob25FcnJvciArIGNvbW1pdCk7IHRoaXMgYWRkcyB0aGUgcnVuLWxldmVsIHRlcm1pbmFsXG4gICAgLy8gc2lnbmFsLiBUaGUgZXJyb3Igc3RpbGwgcHJvcGFnYXRlcyDigJQgdGhpcyBpcyBvYnNlcnZhdGlvbiwgbm90XG4gICAgLy8gcmVjb3ZlcnkuIFN1YmZsb3cgdHJhdmVyc2VycyBkb24ndCBmaXJlIHJ1biBldmVudHM7IHRoZWlyIGVycm9yc1xuICAgIC8vIGJ1YmJsZSB1cCBhbmQgc3VyZmFjZSBoZXJlIGF0IHRoZSB0b3AgbGV2ZWwuXG4gICAgaWYgKCFpc1RvcExldmVsKSB7XG4gICAgICByZXR1cm4gd2FsaygpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBUcmF2ZXJzYWxSZXN1bHQ7XG4gICAgbGV0IHJldGFpbmVkUmVzdWx0OiBUcmF2ZXJzYWxSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHdhbGsoKTtcbiAgICAgIC8vIFJlYWQgdGhlIHNoYXJlZCBydWxlIG5vdyBzbyBtYXJrcyBtYWRlIGR1cmluZyBleGVjdXRpb24gYXBwbHkgdG9cbiAgICAgIC8vIHRoaXMgZXZlbnQuIEEgc2NydWIgZmFpbHVyZSBjbG9zZXMgdGhlIHJ1biBhcyBmYWlsZWQsIG5ldmVyIHJhdy5cbiAgICAgIHJldGFpbmVkUmVzdWx0ID0gcmVkYWN0aW9uUnVsZSA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkocmVzdWx0KSA6IHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKCFpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1bkZhaWxlZChcbiAgICAgICAgICByZWRhY3Rpb25SdWxlID8gcmVkYWN0aW9uUnVsZS5zZXJ2ZWRFcnJvcihlcnJvcikgOiBleHRyYWN0RXJyb3JJbmZvKGVycm9yKSxcbiAgICAgICAgICByb290Q29udGV4dCxcbiAgICAgICAgICBjb250ZXh0LmZhaWx1cmVTdGF0ZS5hbm5vdW5jZShlcnJvciksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25SdW5FbmQocmV0YWluZWRSZXN1bHQsIHJvb3RDb250ZXh0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgcmVzdW1lJ3MgZW50cnkgY2hhaW4gYXQgYSBsZXZlbCB3aGVyZSBwYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRcbiAgICogKDkuMjguMCk6IHJ1biB0aGUgY2hhaW4g4oCUIHRoZSByZXN1bWVkIGNoaWxkIG9ubHksIHRoZSBmYW4tb3V0J3Mgam9pbiBpc1xuICAgKiBOT1QgYXR0YWNoZWQg4oCUIHRoZW4gcmFpc2UgdGhlIGZpcnN0IHdhaXRpbmcgcGF1c2UgYWdhaW4sIHRoZSByZXN0IGJlaGluZFxuICAgKiBpdC4gTm90aGluZyBvZiB0aGUgc2libGluZyByZS1ydW5zOyBpdHMgcXVlc3Rpb24gY29tZXMgYmFjayBhcyBpdCB3YXNcbiAgICogYXNrZWQuIEEgcGF1c2UgcmFpc2VkIGZyb20gaW5zaWRlIHRoZSBjaGFpbiAodGhlIHJlc3VtZWQgY2hpbGQgYXNraW5nXG4gICAqIGFnYWluKSBjYXJyaWVzIGV2ZXJ5IHdhaXRpbmcgc2libGluZyBpbnN0ZWFkLCBzbyBub25lIGlzIGV2ZXIgZHJvcHBlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2Fsa1RoZW5SYWlzZShcbiAgICBzdGFydDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIHdhaXRpbmc6IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW10sXG4gICAgYnJhbmNoUGF0aD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5leGVjdXRlTm9kZShzdGFydCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSBxdWV1ZUJlaGluZChlcnJvciwgd2FpdGluZyk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgY29uc3QgeyBwYXVzZSwgc3RhZ2VOYW1lIH0gPSB3YWl0aW5nWzBdO1xuICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUGF1c2UoXG4gICAgICBzdGFnZU5hbWUsXG4gICAgICBwYXVzZS5wYXVzZWRTdGFnZUlkLFxuICAgICAgc2VydmVkUGF1c2UoY29udGV4dCwgcGF1c2UucGF1c2VEYXRhKSxcbiAgICAgIHBhdXNlLnN1YmZsb3dQYXRoLFxuICAgICAgLy8gVGhpcyBsZWcgcmUtcmFpc2VkIGEgcXVldWVkIHNpYmxpbmc7IGl0IGRpZCBub3QgZXhlY3V0ZSB0aGF0IHNpYmxpbmcgYWdhaW4uIEtlZXAgdGhlIG9yaWdpbmFsXG4gICAgICAvLyBwYXVzZWRFeGVjdXRpb24gb24gdGhlIHNpZ25hbCwgYW5kIHN0YW1wIHRoaXMgbm90aWZpY2F0aW9uIHdpdGggdGhlIGN1cnJlbnQgbGVnJ3Mgcm9vdCBpZGVudGl0eS5cbiAgICAgIHJvb3RUcmF2ZXJzYWxDb250ZXh0KHRoaXMucnVuSWQsIHRoaXMuY29ycmVsYXRpb24pLFxuICAgICk7XG4gICAgdGhyb3cgcmFpc2VRdWV1ZWRQYXVzZSh3YWl0aW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCcmVhayBzdGF0ZSBjYXB0dXJlZCBhdCB0aGUgdG9wLWxldmVsIG9mIHRoZSBtb3N0IHJlY2VudCBgZXhlY3V0ZSgpYC5cbiAgICogYHNob3VsZEJyZWFrYCBpcyB0cnVlIHdoZW4gYSBzdGFnZSBjYWxsZWQgYHNjb3BlLiRicmVhayhyZWFzb24pYDsgdGhlXG4gICAqIG9wdGlvbmFsIGByZWFzb25gIGNhcnJpZXMgdGhlIHN0cmluZyBwYXNzZWQgdG8gYCRicmVha2AuXG4gICAqXG4gICAqIFVzZWQgYnkgYFN1YmZsb3dFeGVjdXRvcmAgdG8gcHJvcGFnYXRlIGFuIGlubmVyIHN1YmZsb3cncyBicmVhayB1cCB0b1xuICAgKiB0aGUgcGFyZW50IHRyYXZlcnNlciB3aGVuIHRoZSBtb3VudCBzZXRzIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAuXG4gICAqL1xuICBnZXRCcmVha1N0YXRlKCk6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9IHtcbiAgICByZXR1cm4geyAuLi50aGlzLl90b3BCcmVha0ZsYWcgfTtcbiAgfVxuXG4gIGdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmdldFN0cnVjdHVyZSgpO1xuICB9XG5cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KSB7XG4gICAgLy8gU3RhbXAgdGhlIHJ1bidzIGlkIG9udG8gdGhlIHJ1bnRpbWUgc25hcHNob3QgaGVyZSDigJQgdGhlIHRyYXZlcnNlciBpc1xuICAgIC8vIHRoZSBzaW5nbGUgYXV0aG9yaXR5IGZvciBgcnVuSWRgIChpdCBhbHJlYWR5IHN0YW1wcyB0aGUgc2FtZSB2YWx1ZSBvblxuICAgIC8vIGV2ZXJ5IFRyYXZlcnNhbENvbnRleHQvZXZlbnQpLCB3aGlsZSB0aGUgcnVudGltZSBpcyBydW4tYWdub3N0aWNcbiAgICAvLyBtZW1vcnkgKGl0cyBnZXRTbmFwc2hvdCByZXR1cm5zIE9taXQ8UnVudGltZVNuYXBzaG90LCAncnVuSWQnPikuXG4gICAgLy8gRnJlc2ggcGVyIHJ1bigpIEFORCBwZXIgcmVzdW1lKCkg4oCUIHNlZSBydW5uZXIvcnVuSWQudHMuXG4gICAgLy8gVGhlIGNvcnJlbGF0aW9uIHJpZGVzIGJlc2lkZSBpdCwgZnJvbSB0aGUgc2FtZSBhdXRob3JpdHkg4oCUIHByZXNlbnQgb25seSB3aGVuIHRoZSBsZWcgaGFzIG9uZS5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5leGVjdXRpb25SdW50aW1lLmdldFNuYXBzaG90KG9wdGlvbnMpLFxuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICAuLi4odGhpcy5jb3JyZWxhdGlvbiAmJiB7IGNvcnJlbGF0aW9uOiB0aGlzLmNvcnJlbGF0aW9uIH0pLFxuICAgIH07XG4gIH1cblxuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gIH1cblxuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25SdW50aW1lLmdldFBpcGVsaW5lcygpO1xuICB9XG5cbiAgZ2V0UnVudGltZVJvb3QoKTogU3RhZ2VOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG5cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnN1YmZsb3dSZXN1bHRzO1xuICB9XG5cbiAgZ2V0TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IuZ2V0U2VudGVuY2VzKCk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgRmxvd1JlY29yZGVyRGlzcGF0Y2hlciwgb3IgdW5kZWZpbmVkIGlmIG5hcnJhdGl2ZSBpcyBkaXNhYmxlZC4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIENvcmUgVHJhdmVyc2FsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBPKDEpIElE4oaSbm9kZSBtYXAgZnJvbSB0aGUgcm9vdCBncmFwaC5cbiAgICogVXNlZCBieSBOb2RlUmVzb2x2ZXIgdG8gYXZvaWQgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpIGNhbGwuXG4gICAqIEl0ZXJhdGl2ZSB3b3JrbGlzdCAobm8gcmVjdXJzaW9uKSBzbyBhcmJpdHJhcmlseSBsb25nIGNoYWlucyBpbmRleCBmdWxseTtcbiAgICogdGhlIGBtYXAuaGFzYCBndWFyZCBoYW5kbGVzIGN5Y2xpYyByZWZzLiBGaXJzdC12aXNpdGVkIG5vZGUgd2lucyBwZXIgSUQg4oCUXG4gICAqIHdvcmtsaXN0IG9yZGVyIG1hdGNoZXMgdGhlIG9sZCByZWN1cnNpdmUgcHJlLW9yZGVyIChjaGlsZHJlbiwgdGhlbiBuZXh0KS5cbiAgICogRHluYW1pYyBzdWJmbG93cyBhbmQgbGF6eS1yZXNvbHZlZCBub2RlcyBhcmUgYWRkZWQgdG8gc3RhZ2VNYXAgYXQgcnVudGltZSBidXQgbm90IHRvIHRoaXMgbWFwIOKAlFxuICAgKiB0aG9zZSB1c2UgdGhlIERGUyBmYWxsYmFjayBpbiBOb2RlUmVzb2x2ZXIuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm9kZUlkTWFwKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3Qgc3RhY2s6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbcm9vdF07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdGFjay5wb3AoKSE7XG4gICAgICBpZiAobWFwLmhhcyhub2RlLmlkKSkgY29udGludWU7IC8vIGFscmVhZHkgdmlzaXRlZCAoYXZvaWRzIGluZmluaXRlIGxvb3BzIG9uIGN5Y2xpYyByZWZzKVxuICAgICAgbWFwLnNldChub2RlLmlkLCBub2RlKTtcbiAgICAgIC8vIFB1c2ggaW4gcmV2ZXJzZSB2aXNpdCBvcmRlciAoTElGTyBzdGFjayk6IG5leHQgZmlyc3QsIHRoZW4gY2hpbGRyZW5cbiAgICAgIC8vIHJldmVyc2VkIOKAlCBzbyBjaGlsZHJlbiBhcmUgdmlzaXRlZCBiZWZvcmUgbmV4dCwgZmlyc3QgY2hpbGQgZmlyc3QsXG4gICAgICAvLyBtYXRjaGluZyB0aGUgcmVjdXJzaXZlIHByZS1vcmRlciBleGFjdGx5LlxuICAgICAgaWYgKG5vZGUubmV4dCkgc3RhY2sucHVzaChub2RlLm5leHQpO1xuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHN0YWNrLnB1c2gobm9kZS5jaGlsZHJlbltpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YWdlRm4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2Ygbm9kZS5mbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5vZGUuZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgIC8vIFByaW1hcnk6IGxvb2sgdXAgYnkgaWQgKHN0YWJsZSBpZGVudGlmaWVyLCBrZXllZCBieSBGbG93Q2hhcnRCdWlsZGVyKVxuICAgIGNvbnN0IGJ5SWQgPSB0aGlzLnN0YWdlTWFwLmdldChub2RlLmlkKTtcbiAgICBpZiAoYnlJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYnlJZDtcbiAgICAvLyBGYWxsYmFjazogbG9vayB1cCBieSBuYW1lIChzdXBwb3J0cyBoYW5kLWNyYWZ0ZWQgc3RhZ2VNYXBzIGluIHRlc3RzIGFuZCBhZHZhbmNlZCB1c2UpXG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VNYXAuZ2V0KG5vZGUubmFtZSk7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgRHluYW1pYy1wYXRjaCBvdmVybGF5IGFjY2Vzc29ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gRXZlcnkgZW5naW5lIHJlYWQgb2YgYSBmaWVsZCB0aGF0IFBoYXNlIDQgY2FuIHBhdGNoIChjaGlsZHJlbixcbiAgLy8gbmV4dE5vZGVTZWxlY3Rvciwgc3ViZmxvdyBtZXRhKSBnb2VzIHRocm91Z2ggdGhlc2UuIEZhc3QgcGF0aDogY2hhcnRzXG4gIC8vIHdpdGggbm8gZHluYW1pYyByZXR1cm5zIG5ldmVyIGFsbG9jYXRlIGFuZCBwYXkgb25lIGBzaXplID09PSAwYCBjaGVjay5cblxuICBwcml2YXRlIGdldFBhdGNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5wYXRjaENvdW50ID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNQYXRjaGVzLmdldChub2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVQYXRjaChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IER5bmFtaWNOb2RlUGF0Y2g8VE91dCwgVFNjb3BlPiB7XG4gICAgbGV0IHBhdGNoID0gdGhpcy5keW5hbWljUGF0Y2hlcy5nZXQobm9kZSk7XG4gICAgaWYgKCFwYXRjaCkge1xuICAgICAgcGF0Y2ggPSB7fTtcbiAgICAgIHRoaXMuZHluYW1pY1BhdGNoZXMuc2V0KG5vZGUsIHBhdGNoKTtcbiAgICAgIHRoaXMucGF0Y2hDb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gcGF0Y2g7XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIGNoaWxkcmVuOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4uICovXG4gIHByaXZhdGUgZWZmQ2hpbGRyZW4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYXRjaChub2RlKT8uY2hpbGRyZW4gPz8gbm9kZS5jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgb3V0cHV0LWJhc2VkIHNlbGVjdG9yOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MuICovXG4gIHByaXZhdGUgZWZmU2VsZWN0b3Iobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTZWxlY3RvciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGF0Y2gobm9kZSk/Lm5leHROb2RlU2VsZWN0b3IgPz8gbm9kZS5uZXh0Tm9kZVNlbGVjdG9yO1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93LXJvb3QgbWFya2VyICh0cnVlIHdoZW4gYSBkeW5hbWljIHN1YmZsb3cgd2FzIHBhdGNoZWQgb24pLiAqL1xuICBwcml2YXRlIGVmZklzU3ViZmxvd1Jvb3Qobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyB0cnVlIDogbm9kZS5pc1N1YmZsb3dSb290O1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93IGlkIChwYXRjaGVkIHZlcmJhdGltIGJ5IGEgZHluYW1pYyBzdWJmbG93IHJldHVybikuICovXG4gIHByaXZhdGUgZWZmU3ViZmxvd0lkKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyBtZXRhLnN1YmZsb3dJZCA6IG5vZGUuc3ViZmxvd0lkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBlZmZlY3RpdmUgdmlldyBvZiBhIG5vZGUg4oCUIGZpZWxkLWlkZW50aWNhbCB0byB3aGF0IHRoZVxuICAgKiBwcmUtb3ZlcmxheSBjb2RlIHByb2R1Y2VkIGJ5IG11dGF0aW5nIHRoZSBzaGFyZWQgbm9kZS4gVXNlZCB3aGVyZSBhIG5vZGVcbiAgICogaXMgaGFuZGVkIHRvIGEgaGVscGVyIGV4ZWN1dG9yIChOb2RlUmVzb2x2ZXIgLyBTdWJmbG93RXhlY3V0b3IgL1xuICAgKiBDaGlsZHJlbkV4ZWN1dG9yKSBzbyBoZWxwZXJzIG5ldmVyIHJlYWQgc3RhbGUgYnVpbHQgZmllbGRzLiBSZXR1cm5zIHRoZVxuICAgKiBub2RlIGl0c2VsZiAobm8gYWxsb2NhdGlvbikgd2hlbiBpdCBjYXJyaWVzIG5vIHBhdGNoLlxuICAgKi9cbiAgcHJpdmF0ZSBlZmZOb2RlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHBhdGNoID0gdGhpcy5nZXRQYXRjaChub2RlKTtcbiAgICBpZiAoIXBhdGNoKSByZXR1cm4gbm9kZTtcbiAgICBjb25zdCBtZXJnZWQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5ub2RlIH07XG4gICAgaWYgKHBhdGNoLnN1YmZsb3dNZXRhKSB7XG4gICAgICBtZXJnZWQuaXNTdWJmbG93Um9vdCA9IHRydWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd0lkID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd0lkO1xuICAgICAgbWVyZ2VkLnN1YmZsb3dOYW1lID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd05hbWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd01vdW50T3B0aW9ucyA9IHBhdGNoLnN1YmZsb3dNZXRhLnN1YmZsb3dNb3VudE9wdGlvbnM7XG4gICAgfVxuICAgIGlmIChwYXRjaC5jaGlsZHJlbikgbWVyZ2VkLmNoaWxkcmVuID0gcGF0Y2guY2hpbGRyZW47XG4gICAgaWYgKHBhdGNoLm5leHROb2RlU2VsZWN0b3IpIG1lcmdlZC5uZXh0Tm9kZVNlbGVjdG9yID0gcGF0Y2gubmV4dE5vZGVTZWxlY3RvcjtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRIRSBzaW5nbGUgZnVubmVsIGV2ZXJ5IHN0YWdlIGZ1bmN0aW9uIHBhc3NlcyB0aHJvdWdoIOKAlCBsaW5lYXIgc3RhZ2VzXG4gICAqIChQaGFzZSAzKSwgZGVjaWRlciBzdGFnZXMgYW5kIHNlbGVjdG9yIHN0YWdlcyAodGhlaXIgaGFuZGxlcnMgYXJlIGhhbmRlZFxuICAgKiB0aGlzIG1ldGhvZCBhcyBgcnVuU3RhZ2VgKSwgYW5kIGJ5IGV4dGVuc2lvbiBmb3JrIGNoaWxkcmVuIGFuZFxuICAgKiBzdWJmbG93LWludGVybmFsIHN0YWdlcywgd2hpY2ggcmUtZW50ZXIgUGhhc2UgMyBpbiB0aGVpciBvd24gdHJhdmVyc2VyLlxuICAgKlxuICAgKiBXaGljaCBpcyBleGFjdGx5IHdoeSBhIGRlY2xhcmVkIGByZXRyeWAgcG9saWN5IGlzIGhvbm91cmVkIEhFUkUgYW5kXG4gICAqIG5vd2hlcmUgZWxzZTogb25lIGNhbGwgZ2l2ZXMgYHJldHJ5YCB0byBldmVyeSBzdGFnZSBraW5kIHRoYXQgaGFzIGFcbiAgICogZnVuY3Rpb24gdG8gcmV0cnkuIFRoZSBsb29wIGl0c2VsZiBpcyB0aGUgYXR0ZW1wdCBydW5uZXInc1xuICAgKiAoYGF0dGVtcHQvcnVubmVyLnRzIMK3IHJ1bkF0dGVtcHRzYCwgMTAuMSDigJQgb25lIHJ1bm5lciwgb25lIHJlY29yZCk7IHRoaXNcbiAgICogbWV0aG9kIGhhbmRzIGl0IHRoZSBlbmdpbmUncyBoYWxmOiBvbmUgYXR0ZW1wdCAoYFN0YWdlUnVubmVyIMK3IHJ1bmAsIGFcbiAgICogZnJlc2ggc2NvcGUgZWFjaCB0aW1lKSwgdGhlIGRpc2NhcmQgYmV0d2VlbiBhdHRlbXB0c1xuICAgKiAoYFN0YWdlQ29udGV4dCDCtyBkaXNjYXJkU3RhZ2VkYCDigJQgdGhlIHJ1bm5lciBjYW5ub3QgcmVhY2ggYSBmcmFtZSksIHRoZVxuICAgKiBzZXJ2ZWQgZm9ybSBvZiBhbiBhdHRlbXB0J3MgZXJyb3IgKGBzZXJ2ZWRTdGFnZUVycm9yYCwgdGhlIHJ1bidzXG4gICAqIHJlZGFjdGlvbiBydWxlKSwgYW5kIHdoZXJlIGVhY2ggcmVjb3JkIGdvZXMgKHRoZSBmcmFtZSwgZm9yIHRoZVxuICAgKiBleGVjdXRpb24gdHJlZTsgYG9uQXR0ZW1wdGAgYW5kIGBvblN0YWdlUmV0cnlgLCBmb3IgcmVjb3JkZXJzKS5cbiAgICpcbiAgICogTk9UIGBhc3luY2AsIG9uIHB1cnBvc2Ug4oCUIHRoZSBtaWNyb3Rhc2sgc2hhcGUgb2YgYSBzdGFnZSBpcyBwYXJ0IG9mIHdoYXRcbiAgICogdGhlIGVuZ2luZSBrZWVwcyBieXRlLWlkZW50aWNhbCAocGFyYWxsZWwgc2libGluZ3Mgc2V0dGxlIGluIHRoZSBvcmRlclxuICAgKiB0aGV5IGFsd2F5cyBkaWQpOlxuICAgKiAgIC0gbm8gcG9saWN5IChvciBgYXR0ZW1wdHM6IDFgLCBhIGRlY2xhcmVkLWJ1dC1vZmYgcG9saWN5KTogb25lIGNhbGxcbiAgICogICAgIHRocm91Z2ggYW4gYXN5bmMgZnJhbWUgKHtAbGluayBydW5TdGFnZU9uY2V9KSwgZXhhY3RseSB0aGUgcHJlLTEwLjFcbiAgICogICAgIHNoYXBlIOKAlCBhbmQgbm8gYXR0ZW1wdCBpcyByZWNvcmRlZDtcbiAgICogICAtIGEgcG9saWN5OiB0aGUgcnVubmVyJ3Mgb3duIHByb21pc2UsIHdob3NlIG9uZSBhd2FpdCBwZXIgYXR0ZW1wdCBpcyB0aGVcbiAgICogICAgIHNhbWUgb25lIGF3YWl0IHRoZSA5LjE1IGxvb3AgaGFkLlxuICAgKi9cbiAgcHJpdmF0ZSBleGVjdXRlU3RhZ2UoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3RhZ2VGdW5jOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRm46ICgpID0+IHZvaWQsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8VE91dD4ge1xuICAgIC8vIHJ1bnRpbWVTdGFnZUlkIGlzIGFzc2lnbmVkIGluIGV4ZWN1dGVOb2RlKCkgYmVmb3JlIHRyYXZlcnNhbENvbnRleHQgY3JlYXRpb24sXG4gICAgLy8gZW5zdXJpbmcgc2NvcGUgZXZlbnRzIGFuZCBmbG93IGV2ZW50cyB1c2UgdGhlIHNhbWUgdmFsdWUuIEl0IGRvZXMgTk9UXG4gICAgLy8gY2hhbmdlIGFjcm9zcyBhdHRlbXB0czogYXR0ZW1wdHMgYXJlIGludGVybmFsIHRvIE9ORSBzdGFnZSBleGVjdXRpb24g4oCUXG4gICAgLy8gb25lIHJ1bnRpbWVTdGFnZUlkLCBvbmUgZXhlY3V0aW9uIGluZGV4LCBvbmUgZmluYWwgQ29tbWl0QnVuZGxlLlxuICAgIC8vIFRoZSBjZWlsaW5nIGlzIHRoZSBydW5uZXIncyBvd24gcmVhZGluZyAoYGF0dGVtcHRDZWlsaW5nYCksIHNvIHRoZSBnYXRlXG4gICAgLy8gYW5kIHRoZSBzZXJpZXMgY2FuIG5ldmVyIGRpc2FncmVlIGFib3V0IHdoZXRoZXIgdGhpcyBzdGFnZSByZXRyaWVzLlxuICAgIC8vIEEgc3RhZ2UgcnVucyBvbiB0aGUgcnVubmVyIHdoZW4gYW55dGhpbmcgYWJvdXQgaXQgaXMgd29ydGggYW4gYXR0ZW1wdCByZWNvcmQ6IGEgcmV0cnksIGEgY2FwIG9uIG9uZSBhdHRlbXB0XG4gICAgLy8gKGB0aW1lb3V0TXNgLCBldmVuIHdpdGggYGF0dGVtcHRzOiAxYCksIG9yIGEgcnVuIGRlYWRsaW5lLiBPdGhlcndpc2UgaXQga2VlcHMgaXRzIHByZS0xMC4xIHNoYXBlIGV4YWN0bHkuXG4gICAgLy8gVGhlIGNhbGxzIHRoaXMgc3RhZ2UgbWFrZXMgKGBzY29wZS4kY2FsbGAsIGBvYnNlcnZlZCgpYCwgUDIpIHJlcG9ydCB0aHJvdWdoIHRoZSBzYW1lIGhvb2sgYXMgaXRzIG93biBhdHRlbXB0cyxcbiAgICAvLyB3aXRoIHRoaXMgZXhlY3V0aW9uJ3MgdHJhdmVyc2FsIGNvbnRleHQgKGFuZCB0aGUgcnVuJ3MgY29ycmVsYXRpb24pLiBTZXR0aW5nIGl0IG1vdmVzIG5vIG1pY3JvdGFzay5cbiAgICBjb250ZXh0LnVzZUF0dGVtcHRSZXBvcnRlcigocmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3IpID0+XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkF0dGVtcHQobm9kZS5uYW1lLCBub2RlLmlkLCByZWNvcmQsIHN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCksXG4gICAgKTtcbiAgICBjb25zdCBwb2xpY3kgPSBub2RlLnJldHJ5ID8/IFNJTkdMRV9BVFRFTVBUO1xuICAgIC8vIEEgc3RhZ2UgdGhhdCB0b3VjaGVzIGFuIG91dHNpZGUgc3lzdGVtIChQMykgYWx3YXlzIHJ1bnMgb24gdGhlIHJ1bm5lcjogZXZlcnkgYXR0ZW1wdCBzYXlzIHdoYXQgaXQgZGlkIHRoZXJlLlxuICAgIGxldCBlZmZlY3Q6IEVmZmVjdFRhcmdldCB8IHVuZGVmaW5lZDtcbiAgICBpZiAobm9kZS50b3VjaGVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBlZmZlY3QgPSB0aGlzLmVmZmVjdFRhcmdldChub2RlLmlkLCBub2RlLnRvdWNoZXMsIG5vZGUucmV0cnksIGNvbnRleHQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgLy8gVGhlIHN0YWdlIGZhaWxzIG9uIGl0cyBlcnJvciBwYXRoIGJlZm9yZSBhbnkgYXR0ZW1wdDogbm90aGluZyB3YXMgc2VudC5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSBmcmFtZSBjYW4gYmUgcmUtdXNlZCBieSBhIGxhdGVyIGV4ZWN1dGlvbjogdGhlIHNpZGUtZWZmZWN0IGJvb2trZWVwaW5nIGlzIHRoaXMgZXhlY3V0aW9uJ3Mgb3duLlxuICAgIGNvbnRleHQuYmVnaW5FZmZlY3RzKFxuICAgICAgZWZmZWN0Py5pZGVtcG90ZW5jeUtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChlZmZlY3QucmVjb3JkZWRLZXkgIT09IGVmZmVjdC5pZGVtcG90ZW5jeUtleSB8fCBpc0NhcnJpZWRUb3VjaGVzKG5vZGUudG91Y2hlcykpLFxuICAgICk7XG4gICAgY29uc3QgcnVucyA9XG4gICAgICBhdHRlbXB0Q2VpbGluZyhwb2xpY3kuYXR0ZW1wdHMpID4gMSB8fFxuICAgICAgYXR0ZW1wdFRpbWVvdXRNcyhwb2xpY3kudGltZW91dE1zKSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLmRlYWRsaW5lICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIGVmZmVjdCAhPT0gdW5kZWZpbmVkO1xuICAgIGlmICghcnVucykgcmV0dXJuIHRoaXMucnVuU3RhZ2VPbmNlKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbik7XG4gICAgcmV0dXJuIHJ1bkF0dGVtcHRzKChfbiwgYXR0ZW1wdCkgPT4gdGhpcy5zdGFnZVJ1bm5lci5ydW4obm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuLCBhdHRlbXB0KSwgcG9saWN5LCB7XG4gICAgICBzZXJpZXM6IGNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAuLi4oZWZmZWN0ICE9PSB1bmRlZmluZWQgJiYgeyBlZmZlY3QgfSksXG4gICAgICBzaWduYWw6IHRoaXMuc2lnbmFsLFxuICAgICAgLi4uKHRoaXMuZGVhZGxpbmUgIT09IHVuZGVmaW5lZCAmJiB7IGRlYWRsaW5lOiB0aGlzLmRlYWRsaW5lIH0pLFxuICAgICAgLy8gU3RhZ2VSdW5uZXIgcmFjZXMgdGhlIGF0dGVtcHQncyBzaWduYWwgYXQgdGhlIHN0YWdlIGJvdW5kYXJ5OiBvbmUgYXdhaXQgcGVyIGF0dGVtcHQsIGFzIGluIDkuMTUuXG4gICAgICByYWNlZDogdHJ1ZSxcbiAgICAgIHNlcnZlOiAoZXJyb3IpID0+IHNlcnZlZFN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpLFxuICAgICAgLy8gVGhlIGZlbmNlOiB0aGUgbW9tZW50IGFuIGF0dGVtcHQgZW5kcyB3aXRob3V0IGFuIGFuc3dlciwgaXRzIHNjb3BlIG1heSBubyBsb25nZXIgdG91Y2ggdGhlIHN0YWdlLlxuICAgICAgb25BYmFuZG9uOiAoYXR0ZW1wdCkgPT4gY29udGV4dC5lbmRBdHRlbXB0KGF0dGVtcHQpLFxuICAgICAgLy8gQXR0ZW1wdCBpc29sYXRpb246IGRyb3AgZXZlcnl0aGluZyBhIGZhaWxlZCBhdHRlbXB0IHN0YWdlZCBCRUZPUkUgdGhlXG4gICAgICAvLyBuZXh0IG9uZSBzdGFydHMuIE5vdGhpbmcgd2FzIGFwcGxpZWQsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gcm9sbFxuICAgICAgLy8gYmFjayDigJQgc2VlIFN0YWdlQ29udGV4dC5kaXNjYXJkU3RhZ2VkKCkuXG4gICAgICBiZXR3ZWVuOiAoKSA9PiBjb250ZXh0LmRpc2NhcmRTdGFnZWQoKSxcbiAgICAgIG9uQXR0ZW1wdDogKHJlY29yZCwgc3RydWN0dXJlZEVycm9yKSA9PiB7XG4gICAgICAgIGNvbnRleHQucmVjb3JkQXR0ZW1wdChyZWNvcmQpO1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkF0dGVtcHQobm9kZS5uYW1lLCBub2RlLmlkLCByZWNvcmQsIHN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICB9LFxuICAgICAgLy8gRmlyZWQgQkVGT1JFIHRoZSB3YWl0OiBhIGxpdmUgbW9uaXRvciBsZWFybnMgXCJyZXRyeWluZyBpbiA1MDBtc1wiIHdoZW5cbiAgICAgIC8vIHRoZSBkZWNpc2lvbiBpcyBtYWRlLCBub3Qgb25jZSBpdCBoYXMgYWxyZWFkeSBlbGFwc2VkLlxuICAgICAgb25SZXRyeTogKGF0dGVtcHQsIG9mLCBkZWxheU1zLCBzdHJ1Y3R1cmVkRXJyb3IpID0+XG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VSZXRyeShcbiAgICAgICAgICBub2RlLm5hbWUsXG4gICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgIG9mLFxuICAgICAgICAgIGRlbGF5TXMsXG4gICAgICAgICAgc3RydWN0dXJlZEVycm9yLFxuICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICksXG4gICAgICBvbkVuZDogKHN1bW1hcnkpID0+IGNvbnRleHQuZW5kQXR0ZW1wdHMoc3VtbWFyeSksXG4gICAgICBvbkZhaWx1cmU6IChlcnJvciwgY2F0ZWdvcnkpID0+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpdHkgPSBjb250ZXh0LmZhaWx1cmVJZGVudGl0eTtcbiAgICAgICAgaWYgKGlkZW50aXR5KSBjb250ZXh0LmZhaWx1cmVTdGF0ZS5jYXB0dXJlKGVycm9yLCBjYXRlZ29yeSwgaWRlbnRpdHkpO1xuICAgICAgfSxcbiAgICAgIC8vIEEgcHJlZGljYXRlIG1heSByZXRocm93IHRoZSBzdGFnZSdzIG93biBlcnJvcjogdGhlIGxvZ2dlciBnZXRzIHRoZSBzZXJ2ZWQgZm9ybS5cbiAgICAgIG9uUmV0cnlPblRocmV3OiAodGhyb3duKSA9PlxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdbZm9vdHByaW50XSByZXRyeU9uIHByZWRpY2F0ZSB0aHJldzsgdHJlYXRpbmcgdGhlIGZhaWx1cmUgYXMgZmluYWwnLCB7XG4gICAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihjb250ZXh0LCB0aHJvd24pLFxuICAgICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHRvdWNoaW5nIHN0YWdlJ3Mgc2lkZS1lZmZlY3QgdGFyZ2V0IGZvciBUSElTIGV4ZWN1dGlvbiAoUDMsIGRlc2lnbiDCpzMuMykuIFRoZSBsYXcgZmlyc3Qg4oCUIGEgY2hhcnQgZWRpdGVkXG4gICAqIGFmdGVyIGBidWlsZCgpYCByZWFjaGVzIHRoZSBzdGFnZSB3aXRob3V0IHRoZSBidWlsZGVyJ3MgcmVmdXNhbCwgc28gdGhlIHN0YWdlIGFza3MgYHRvdWNoZXNQcm9ibGVtYCBpdHNlbGYgKHRoZVxuICAgKiBsYXN0IGRvb3IpLiBUaGVuIHRoZSBrZXk6IHRoZSBkZWNsYXJlZCBydWxlIHJ1bnMgT05DRSBwZXIgZXhlY3V0aW9uLCBiZWZvcmUgYXR0ZW1wdCAxLCBoYW5kZWQgdGhlIGZyb3plbiBpbnB1dCxcbiAgICogdGhlIHJ1biBpZCBhbmQgdGhpcyBleGVjdXRpb24ncyBpZDsgaXRzIGFuc3dlciBpcyBhZG1pdHRlZCAoYGFkbWl0SWRlbXBvdGVuY3lLZXlgIOKAlCB0aGUgZm9ybWF0LCBuZXZlciBlY2hvZWQpIGFuZFxuICAgKiBzZXJ2ZWQgdW5kZXIgdGhlIHJ1bidzIGRpYWdub3N0aWMgcnVsZSBhcyBgeyBpZGVtcG90ZW5jeUtleSB9YCBmb3IgdGhlIHJlY29yZHMuIFRocm93cyBvbiBhbnkgcmVmdXNhbC5cbiAgICovXG4gIHByaXZhdGUgZWZmZWN0VGFyZ2V0KFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgICB0b3VjaGVzOiBTdGFnZVRvdWNoZXMsXG4gICAgcmV0cnk6IFJldHJ5UG9saWN5IHwgdW5kZWZpbmVkLFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgKTogRWZmZWN0VGFyZ2V0IHtcbiAgICBjb25zdCBwcm9ibGVtID0gdG91Y2hlc1Byb2JsZW0odG91Y2hlcywgcmV0cnkpO1xuICAgIGlmIChwcm9ibGVtICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgW2Zvb3RwcmludF0gc3RhZ2UgJyR7c3RhZ2VJZH0nOiAke3Byb2JsZW19YCk7XG4gICAgY29uc3QgcnVsZSA9IHRvdWNoZXMuaWRlbXBvdGVuY3lLZXk7XG4gICAgaWYgKHJ1bGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgc3lzdGVtOiB0b3VjaGVzLnN5c3RlbSB9O1xuICAgIGNvbnN0IHdoZXJlID0gYFtmb290cHJpbnRdIHN0YWdlICcke3N0YWdlSWR9JyAodG91Y2hlcyBcIiR7dG91Y2hlcy5zeXN0ZW19XCIpYDtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dDtcbiAgICAvLyBBIHJlc3VtZWQgbGVnJ3Mgcm9vdCBoYXMgbm8gaW5wdXQg4oCUIHRoZSBydW4ncyBkb2VzIG5vdCBjcm9zcyBhIHJlc3VtZSDigJQgc28gYSBydWxlIHRoYXQgcmVhZHMgYGFyZ3NgIHRoZXJlIGlzXG4gICAgLy8gcmVmdXNlZCByYXRoZXIgdGhhbiBoYW5kZWQgbm90aGluZyAoYW4gYG9yZGVyLXVuZGVmaW5lZGAga2V5IHdvdWxkIG1ha2UgZGlzdGluY3Qgb3BlcmF0aW9ucyBvbmUpLlxuICAgIGNvbnN0IGlucHV0TG9zdCA9IHRoaXMucmVzdW1lICE9PSB1bmRlZmluZWQgJiYgYXJncyA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlZGFjdGlvbiA9IGNvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZSgpO1xuICAgIC8vIEEga2V5IGEgY2hlY2twb2ludCBjYXJyaWVkIGhhcyB1bmtub3duIHNvdXJjZXMgaGVyZSAodGhlIGlucHV0IGl0IHdhcyBtYWRlIG9mIGRpZCBub3QgY3Jvc3MgdGhlIHJlc3VtZSk6IGl0IGlzXG4gICAgLy8gc2VydmVkIGFzIG9uZSBtYWRlIG9mIGEgc2VsZWN0ZWQgdmFsdWUg4oCUIHRoZSBwbGFjZWhvbGRlciB1bmRlciBhbnkgc3RhdGUgcnVsZS5cbiAgICBsZXQgcmVhZFNlbGVjdGVkID0gaXNDYXJyaWVkVG91Y2hlcyh0b3VjaGVzKTtcbiAgICBjb25zdCBrZXkgPSBhZG1pdElkZW1wb3RlbmN5S2V5KFxuICAgICAgd2hlcmUsXG4gICAgICBydWxlKFxuICAgICAgICBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICBnZXQgYXJncygpOiB1bmtub3duIHtcbiAgICAgICAgICAgIGlmIChpbnB1dExvc3QpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGAke3doZXJlfTogdGhlIHJ1bidzIGlucHV0IGRvZXMgbm90IGNyb3NzIGEgcmVzdW1lIOKAlCBkZXJpdmUgdGhlIGtleSBmcm9tIHN0YXRlIChnZXRTdGF0ZSkgaW5zdGVhZGAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJncztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiBjb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICAgIC8vIENvbW1pdHRlZCBzdGF0ZSwgcmVhZCBzaWxlbnRseSAodGhlIGtleSBpcyBub3QgYSB3cml0ZSk7IGEgc2VsZWN0ZWQgdmFsdWUgdGFpbnRzIHRoZSByZWNvcmRlZCBrZXkuXG4gICAgICAgICAgLy8gQSBmcm96ZW4gY29weSDigJQgbmV2ZXIgdGhlIGNvbW1pdHRlZCB2YWx1ZSBpdHNlbGYsIHdoaWNoIGEgcnVsZSBjb3VsZCBvdGhlcndpc2UgZWRpdCB3aXRoIG5vIGNvbW1pdCByb3cuXG4gICAgICAgICAgZ2V0U3RhdGU6IChzdGF0ZUtleTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnRleHQuZ2V0VmFsdWVEaXJlY3QoW10sIHN0YXRlS2V5KTtcbiAgICAgICAgICAgIGlmIChyZWRhY3Rpb24gJiYgIXJlZGFjdGlvbi5pc0luZXJ0KCkgJiYgcmVkYWN0aW9uLnZlcmRpY3RPZlJlYWQoc3RhdGVLZXksIHZhbHVlKS5raW5kICE9PSAnY2xlYXInKSB7XG4gICAgICAgICAgICAgIHJlYWRTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IGZyZWV6ZURlZXAoc3RydWN0dXJlZENsb25lKHZhbHVlKSkgOiB2YWx1ZTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKTtcbiAgICBjb25zdCByZWNvcmRlZEtleSA9IHNlcnZlZElkZW1wb3RlbmN5S2V5KGNvbnRleHQsIGtleSwgYXJncywgcmVhZFNlbGVjdGVkKTtcbiAgICByZXR1cm4geyBzeXN0ZW06IHRvdWNoZXMuc3lzdGVtLCBpZGVtcG90ZW5jeUtleToga2V5LCByZWNvcmRlZEtleSB9O1xuICB9XG5cbiAgLyoqIE9uZSBjYWxsIG9mIGEgc3RhZ2Ugd2l0aCBubyByZXRyeSBwb2xpY3ksIHRocm91Z2ggYW4gYXN5bmMgZnJhbWUg4oCUIHRoZSBwcmUtMTAuMSBtaWNyb3Rhc2sgc2hhcGUuICovXG4gIHByaXZhdGUgYXN5bmMgcnVuU3RhZ2VPbmNlKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0YWdlRnVuYzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZuOiAoKSA9PiB2b2lkLFxuICApOiBQcm9taXNlPFRPdXQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFnZVJ1bm5lci5ydW4obm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcnVuLXRpbWUgZG9vciBmb3Igbm9kZXMgYSBzdGFnZSBSRVRVUk5TIChpdHMgYG5leHRgIGNoYWluLCBgY2hpbGRyZW5gXG4gICAqIGFuZCBzdWJmbG93IGlkcykg4oCUIHRoZSBidWlsZGVyIG5ldmVyIHNhdyB0aGVtLCBzbyB0aGlzIGFwcGxpZXMgdGhlXG4gICAqIGJ1aWxkZXIncyByZWZ1c2FsczpcbiAgICogICAtIFI1LCBpZHM6IGBpZHMvcmVzZXJ2ZWRJZHMudHMgwrcgcmVmdXNlUmVzZXJ2ZWRJZGAsIHNvIFwibm8gdXNlciBpZFxuICAgKiAgICAgY2FycmllcyBhIGdyYW1tYXIgZGVsaW1pdGVyXCIgc3RheXMgdHJ1ZSBieSBjb25zdHJ1Y3Rpb24uIExvb3AtcmVmIHN0dWJzXG4gICAqICAgICAodGhleSBuYW1lIGFuIGV4aXN0aW5nIG5vZGUpIGFuZCB0aGUgY2hhcnQncyBvd24gbm9kZXMgKGFkbWl0dGVkIGF0XG4gICAqICAgICBidWlsZDsgYSBwcmVmaXhlZCBpZCBjYXJyaWVzIGAvYCBvbiBwdXJwb3NlKSBhcmUgbm90IG5ldyBpZHMgYW5kIGFyZVxuICAgKiAgICAgc2tpcHBlZC5cbiAgICogICAtIGEgZGVjbGFyZWQgYHJldHJ5YDogYGF0dGVtcHQvcG9saWN5LnRzIMK3IHJldHJ5UG9saWN5UHJvYmxlbWAsIHRoZSBydWxlXG4gICAqICAgICBgRmxvd0NoYXJ0QnVpbGRlciDCtyBhcHBseVJldHJ5UG9saWN5YCBhcHBsaWVzIGF0IGJ1aWxkIOKAlCBgYXR0ZW1wdHNgXG4gICAqICAgICBtdXN0IGJlIGEgd2hvbGUgbnVtYmVyID49IDEsIG5ldmVyIGBOYU5gLCBgSW5maW5pdHlgIG9yIGAwYC5cbiAgICogICAtIGEgZGVjbGFyZWQgYHRvdWNoZXNgOiBgYXR0ZW1wdC9lZmZlY3QudHMgwrcgdG91Y2hlc1Byb2JsZW1gLCB0aGUgcnVsZVxuICAgKiAgICAgYEZsb3dDaGFydEJ1aWxkZXIgwrcgYXBwbHlUb3VjaGVzYCBhcHBsaWVzIGF0IGJ1aWxkIOKAlCBhIG5vZGUgdGhhdFxuICAgKiAgICAgdG91Y2hlcyBhbiBvdXRzaWRlIHN5c3RlbSBhbmQgbWF5IHJldHJ5IG11c3QgZGVjbGFyZSBhIGtleSBydWxlLlxuICAgKiBBIHN1YmZsb3cgZGVmaW5pdGlvbidzIG93biB0cmVlIGlzIGEgYnVpbHQgY2hhcnQgYW5kIGlzIG5vdCB3YWxrZWQuXG4gICAqL1xuICBwcml2YXRlIGFkbWl0RHluYW1pY05vZGVzKG91dHB1dDogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghb3V0cHV0IHx8IHR5cGVvZiBvdXRwdXQgIT09ICdvYmplY3QnIHx8ICFpc1N0YWdlTm9kZVJldHVybihvdXRwdXQpKSByZXR1cm47XG4gICAgY29uc3Qgcm9vdCA9IG91dHB1dCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICBjb25zdCByZWZ1c2UgPSAocmVmdXNhbDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAocmVmdXNhbCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYFtmb290cHJpbnRdIGR5bmFtaWMgU3RhZ2VOb2RlOiAke3JlZnVzYWx9YCk7XG4gICAgfTtcbiAgICBpZiAocm9vdC5zdWJmbG93SWQpIHJlZnVzZShyZWZ1c2VSZXNlcnZlZElkKCdkeW5hbWljIHN1YmZsb3cgaWQnLCByb290LnN1YmZsb3dJZCwgJ3NlZ21lbnQnKSk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPiA9IFtyb290Lm5leHQsIC4uLihyb290LmNoaWxkcmVuID8/IFtdKV07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG4gPSBzdGFjay5wb3AoKTtcbiAgICAgIGlmICghbiB8fCBzZWVuLmhhcyhuKSB8fCBuLmlzTG9vcFJlZikgY29udGludWU7XG4gICAgICBzZWVuLmFkZChuKTtcbiAgICAgIGlmIChuLnJldHJ5KSB7XG4gICAgICAgIGNvbnN0IHByb2JsZW0gPSByZXRyeVBvbGljeVByb2JsZW0obi5yZXRyeSk7XG4gICAgICAgIGlmIChwcm9ibGVtICE9PSB1bmRlZmluZWQpIHJlZnVzZShgc3RhZ2UgJyR7bi5pZH0nOiAke3Byb2JsZW19YCk7XG4gICAgICB9XG4gICAgICAvLyBBIHRvdWNoaW5nIG5vZGUgaXMgaGVsZCB0byB0aGUgYnVpbGQgbGF3IChQMyk6IG5vIHJldHJ5IG9mIGFuIG91dHNpZGUgZWZmZWN0IHdpdGhvdXQgYSBrZXkgcnVsZS5cbiAgICAgIGlmIChuLnRvdWNoZXMgIT09IHVuZGVmaW5lZCkgcmVmdXNlKHRvdWNoZXNSZWZ1c2FsKG4pKTtcbiAgICAgIGNvbnN0IHJlZnVzYWwgPVxuICAgICAgICByZWZ1c2VSZXNlcnZlZElkKCdkeW5hbWljIHN0YWdlIGlkJywgbi5pZCwgJ3N0YWdlJykgPz9cbiAgICAgICAgKG4uc3ViZmxvd0lkID8gcmVmdXNlUmVzZXJ2ZWRJZCgnZHluYW1pYyBzdWJmbG93IGlkJywgbi5zdWJmbG93SWQsICdzZWdtZW50JykgOiB1bmRlZmluZWQpO1xuICAgICAgaWYgKHJlZnVzYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBPbmx5IGEgU1VTUEVDVCBpZCBwYXlzIGZvciB0aGUgY2hhcnQgbG9va3VwOiBhIGNoYXJ0IG5vZGUgKGFuZCB0aGVcbiAgICAgICAgLy8gY2hhcnQgYmVsb3cgaXQpIHdhcyBhZG1pdHRlZCBhdCBidWlsZC5cbiAgICAgICAgaWYgKHRoaXMubm9kZVJlc29sdmVyLmZpbmROb2RlQnlJZChuLmlkKSA9PT0gbikgY29udGludWU7XG4gICAgICAgIHJlZnVzZShyZWZ1c2FsKTtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnB1c2gobi5uZXh0LCAuLi4obi5jaGlsZHJlbiA/PyBbXSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFtcG9saW5lIGRyaXZlciDigJQgcHJlLW9yZGVyIERGUyB0cmF2ZXJzYWwgZW50cnkgcG9pbnQuXG4gICAqXG4gICAqIFJ1bnMgYGV4ZWN1dGVOb2RlU3RlcGAgKG9uZSBub2RlLCBhbGwgNyBwaGFzZXMpIGluIGEgZmxhdCBsb29wOiBldmVyeVxuICAgKiBUQUlMIGNvbnRpbnVhdGlvbiAobGluZWFyIGBuZXh0YCwgbG9vcCBlZGdlLCBkeW5hbWljIG5leHQgLyBkeW5hbWljXG4gICAqIHJlLWVudHJ5LCBuby1jb250aW51YXRpb24gZGVjaWRlciBkaXNwYXRjaCkgY29tZXMgYmFjayBhcyBhXG4gICAqIGBDb250aW51YXRpb25Ib3BgIGFuZCBpcyBmb2xsb3dlZCBJVEVSQVRJVkVMWSDigJQgbmVpdGhlciB0aGUgY2FsbCBzdGFja1xuICAgKiBub3IgdGhlIHJldGFpbmVkIHByb21pc2UgY2hhaW4gZ3Jvd3Mgd2l0aCBjaGFpbiBsZW5ndGggb3IgbG9vcCBjb3VudC5cbiAgICpcbiAgICogUmVjdXJzaW9uIHJlbWFpbnMgT05MWSBmb3IgdHJ1ZSB0cmVlIG5lc3RpbmcgKGVhY2ggZ2V0cyBhIG5lc3RlZCBkcml2ZXJcbiAgICogY2FsbCk6IGZvcmsgY2hpbGRyZW4gKGBDaGlsZHJlbkV4ZWN1dG9yYCksIHNlbGVjdG9yIGJyYW5jaGVzIChwYXJhbGxlbFxuICAgKiBmYW4tb3V0KSwgZGVjaWRlciBicmFuY2ggZGlzcGF0Y2ggd2hlbiB0aGUgZGVjaWRlciBoYXMgaXRzIG93biBgbmV4dGBcbiAgICogKHRoZSBicmFuY2ggbXVzdCBjb21wbGV0ZSBCRUZPUkUgdGhlIGRlY2lkZXIncyBjb250aW51YXRpb24gcnVucyksIGFuZFxuICAgKiBzdWJmbG93IG1vdW50cyAoZnJlc2ggdHJhdmVyc2VyOyB0aGUgbW91bnQgZnJhbWUgc3RheXMgaW4gdGhlIHBhcmVudCkuXG4gICAqIGBfZXhlY3V0ZURlcHRoYCB0aGVyZWZvcmUgY291bnRzIGNoYXJ0IENPTVBPU0lUSU9OIGRlcHRoIG9ubHksIGd1YXJkZWRcbiAgICogYnkgYF9tYXhEZXB0aGAgKGRlZmF1bHQgYE1BWF9FWEVDVVRFX0RFUFRIYCA9IDUwMCkuXG4gICAqXG4gICAqIFBhdXNlU2lnbmFsOiBhIGZsYXQgZGVjaWRlciBkaXNwYXRjaCByZWNvcmRzIGFuIGBJbnZva2VyU3RhbXBgOyBpZiB0aGVcbiAgICogY29udGludWVkIGNoYWluIGxhdGVyIHBhdXNlcywgdGhlIGRyaXZlciBzdGFtcHMgdGhlIHNpZ25hbCBkdXJpbmdcbiAgICogdW53aW5kIOKAlCBzYW1lIGludm9rZXIgY29udGV4dCB0aGUgcmVjdXJzaXZlIGRpc3BhdGNoJ3MgY2F0Y2ggdXNlZCB0b1xuICAgKiBzdGFtcCwgaW5uZXJtb3N0IChtb3N0IHJlY2VudCBkaXNwYXRjaCkgZmlyc3QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVOb2RlKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoPzogc3RyaW5nLFxuICAgIGVuY2xvc2luZz86IEVuY2xvc2luZ0ZyYW1lcyxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyDilIDilIDilIAgVHJlZS1kZXB0aCBndWFyZCDilIDilIDilIBcbiAgICAvLyBEZXB0aCBpcyB0aGUgQ0FMTCBQQVRIJ3MgbmVzdGluZywgcmVhZCBvZmYgdGhlIGNvbnRleHQgdGhpcyBkcml2ZXIgd2FzXG4gICAgLy8gaGFuZGVkIChzZWUgYF9mcmFtZU9mYCkg4oCUIHNpYmxpbmdzIG5ldmVyIGNvbnN1bWUgaXQuIEEgcmVhY2hlZCBjYXAgaXMgYVxuICAgIC8vIFJVTiBmYWlsdXJlOiBgb25FcnJvcmAgZmlyZXMgaGVyZSAobm8gc3RhZ2UgcmFuIGZvciB0aGlzIG5vZGUsIHNvIG5vXG4gICAgLy8gc3RhZ2UgY2F0Y2ggd291bGQpIGFuZCBgQ2hpbGRyZW5FeGVjdXRvcmAgcmV0aHJvd3MgaXQgd2hhdGV2ZXIgdGhlXG4gICAgLy8gZmFuLW91dCdzIGVycm9yIG1vZGUuXG4gICAgY29uc3QgZGVwdGggPSB0aGlzLm5lc3RpbmdEZXB0aE9mKGNvbnRleHQpO1xuICAgIGlmIChkZXB0aCA+IHRoaXMuX21heERlcHRoKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBUcmF2ZXJzYWxEZXB0aEVycm9yKHRoaXMuX21heERlcHRoLCBub2RlLm5hbWUpO1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25FcnJvcihub2RlLm5hbWUsIHRocm93blRleHQoZXJyb3IpLCBleHRyYWN0RXJyb3JJbmZvKGVycm9yKSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvLyBJbnZva2VyIHN0YW1wcyBmcm9tIGZsYXQgZGVjaWRlciBkaXNwYXRjaGVzIGluIFRISVMgZHJpdmVyIOKAlCBrZXB0XG4gICAgLy8gbG9jYWwgc28gbmVzdGVkIGRyaXZlcnMgKGZvcmsgY2hpbGRyZW4sIHdpdGgtbmV4dCBkZWNpZGVyIGJyYW5jaGVzKVxuICAgIC8vIGdldCB0aGVpciBvd24gd2luZG93cywgbWF0Y2hpbmcgdGhlIG9sZCBmcmFtZS1vbi1zdGFjayBzdGFtcGluZyBzY29wZS5cbiAgICBsZXQgcGVuZGluZ0ludm9rZXJzOiBJbnZva2VyU3RhbXBbXSB8IHVuZGVmaW5lZDtcbiAgICAvLyBFdmVyeSBkcml2ZXIgcmVtZW1iZXJzIHRoZSBub2RlcyBpdCByYW4uIEEgZGVjaWRlcidzIEJSQU5DSCBGUkFNRVxuICAgIC8vIChkZWNpZGVyIHdpdGggaXRzIG93biBgbmV4dGA7IGBlbmNsb3NpbmdgID0gdGhlIHJhbi1zZXRzIG9mIHRoZSBkcml2ZXJzXG4gICAgLy8gaXQgaXMgbmVzdGVkIGluICsgdGhlIGBuZXh0YCBjaGFpbnMgb2YgdGhlIGRlY2lkZXJzIHdob3NlIGZyYW1lcyBob2xkXG4gICAgLy8gaXQpIExFQVZFUyBvbiBhIGp1bXAgYnkgaWQgKGEgYGxvb3BgIGhvcCkgdG8gYSBub2RlIHRoaXMgZnJhbWUgZGlkIG5vdFxuICAgIC8vIHJ1biB0aGF0IGlzIGVpdGhlciBvbmUgYW4gRU5DTE9TSU5HIGRyaXZlciBhbHJlYWR5IHJhbiAoYSBsb29wIGJhY2spIG9yXG4gICAgLy8gb25lIG9uIGFuIGVuY2xvc2luZyBkZWNpZGVyJ3MgYG5leHRgIGNoYWluIChhIGZvcndhcmQganVtcCBpbnRvIHRoZVxuICAgIC8vIHRhaWwpIOKAlCB0aGUgaG9wIGlzIGhhbmRlZCBiYWNrIHRvIHRoZSBkZWNpZGVyLCB3aGljaCBmb2xsb3dzIGl0IGZsYXRcbiAgICAvLyBhdCBpdHMgb3duIGxldmVsIGFuZCBza2lwcyBpdHMgYG5leHRgLCBzbyBuZWl0aGVyIGEgbG9vcCBzdGFja3Mgb25lXG4gICAgLy8gZnJhbWUgcGVyIHBhc3Mgbm9yIGEgdGFpbCBydW5zIHR3aWNlLiBBbnkgb3RoZXIganVtcCAoc2lkZXdheXMgdG8gYVxuICAgIC8vIHNpYmxpbmcgYnJhbmNoKSBzdGF5cyBpbiB0aGUgZnJhbWUsIGFzIHRocm91Z2ggOS4zOS4wLlxuICAgIGNvbnN0IHJhbkhlcmUgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICBjb25zdCBmcmFtZTogRHJpdmVyRnJhbWUgPSB7XG4gICAgICBkZXB0aCxcbiAgICAgIHJhbjogZW5jbG9zaW5nID8gWy4uLmVuY2xvc2luZy5yYW4sIHJhbkhlcmVdIDogW3JhbkhlcmVdLFxuICAgICAgdGFpbHM6IGVuY2xvc2luZz8udGFpbHMgPz8gW10sXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgbGV0IGN1cnJlbnQ6IENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+ID0geyBbQ09OVElOVUVfSE9QXTogdHJ1ZSwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCB9O1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICB0aGlzLl9mcmFtZU9mLnNldChjdXJyZW50LmNvbnRleHQsIGZyYW1lKTtcbiAgICAgICAgcmFuSGVyZS5hZGQoY3VycmVudC5ub2RlLmlkKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlTm9kZVN0ZXAoY3VycmVudC5ub2RlLCBjdXJyZW50LmNvbnRleHQsIGJyZWFrRmxhZywgY3VycmVudC5icmFuY2hQYXRoKTtcbiAgICAgICAgaWYgKCFpc0NvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+KHJlc3VsdCkpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmNsb3NpbmcgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQubG9vcCA9PT0gdHJ1ZSAmJiAhcmFuSGVyZS5oYXMocmVzdWx0Lm5vZGUuaWQpKSB7XG4gICAgICAgICAgY29uc3QgaWQgPSByZXN1bHQubm9kZS5pZDtcbiAgICAgICAgICBjb25zdCBoYXMgPSAoaWRzOiBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KSA9PiBpZHMuaGFzKGlkKTtcbiAgICAgICAgICBpZiAoZW5jbG9zaW5nLnJhbi5zb21lKGhhcykgfHwgZW5jbG9zaW5nLnRhaWxzLnNvbWUoaGFzKSkgcmV0dXJuIHJlc3VsdDsgLy8gdGhlIGp1bXAgbGVhdmVzIHRoaXMgZnJhbWVcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0Lmludm9rZXJTdGFtcCkgKHBlbmRpbmdJbnZva2VycyA/Pz0gW10pLnB1c2gocmVzdWx0Lmludm9rZXJTdGFtcCk7XG4gICAgICAgIGN1cnJlbnQgPSByZXN1bHQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIFJlcGxheSBpbnZva2VyIHN0YW1wcyBtb3N0LXJlY2VudC1maXJzdC4gYHNldEludm9rZXJgIGlzXG4gICAgICAvLyBmaXJzdC13cml0ZS13aW5zLCBzbyB0aGUgaW5uZXJtb3N0IGRpc3BhdGNoJ3Mgc3RhbXAgbGFuZHMg4oCUIGV4YWN0bHlcbiAgICAgIC8vIHRoZSBvbGQgYnViYmxlLXVwIG9yZGVyIHRocm91Z2ggbmVzdGVkIGNhdGNoIGZyYW1lcy5cbiAgICAgIGlmIChwZW5kaW5nSW52b2tlcnMgIT09IHVuZGVmaW5lZCAmJiBpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gcGVuZGluZ0ludm9rZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgZXJyb3Iuc2V0SW52b2tlcihwZW5kaW5nSW52b2tlcnNbaV0uaW52b2tlclN0YWdlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5lc3RpbmcgZGVwdGggYSBkcml2ZXIgaGFuZGVkIGBjb250ZXh0YCBydW5zIGF0OiBvbmUgYmVsb3cgdGhlXG4gICAqIGRyaXZlciB0aGF0IHJhbiB0aGUgY29udGV4dCBpdCB3YXMgY3JlYXRlZCBmcm9tLCAxIGF0IHRoZSB0b3AgKGFuZCBmb3JcbiAgICogYSBjb250ZXh0IHdob3NlIHBhcmVudCBubyBkcml2ZXIgb2YgdGhpcyB0cmF2ZXJzZXIgcmFuIOKAlCBhIHN1YmZsb3cnc1xuICAgKiByb290LCBhIHJlc3VtZSdzIHN0YXJ0KS4gUmVhZCBieSB0aGUgaW5zdHJ1bWVudGF0aW9uIGluXG4gICAqIGBiZW5jaC9kZXB0aC1wcm9iZS50c2AgYW5kIHRoZSB0cmFtcG9saW5lIHRlc3RzLlxuICAgKi9cbiAgcHJpdmF0ZSBuZXN0aW5nRGVwdGhPZihjb250ZXh0OiBTdGFnZUNvbnRleHQpOiBudW1iZXIge1xuICAgIGNvbnN0IHBhcmVudCA9IGNvbnRleHQucGFyZW50O1xuICAgIHJldHVybiAocGFyZW50ID09PSB1bmRlZmluZWQgPyAwIDogdGhpcy5fZnJhbWVPZi5nZXQocGFyZW50KT8uZGVwdGggPz8gMCkgKyAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgYSBkZWNpZGVyJ3MgYnJhbmNoIGZyYW1lIGluaGVyaXRzOiB0aGUgcmFuLXNldHMgb2YgdGhlIGRyaXZlcnMgaXQgaXNcbiAgICogbmVzdGVkIGluLCBhbmQgZXZlcnkgZW5jbG9zaW5nIGRlY2lkZXIncyBgbmV4dGAgY2hhaW4gcGx1cyB0aGlzIG9uZSdzLlxuICAgKi9cbiAgcHJpdmF0ZSBicmFuY2hGcmFtZUZvcihjb250ZXh0OiBTdGFnZUNvbnRleHQsIG5leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogRW5jbG9zaW5nRnJhbWVzIHtcbiAgICBjb25zdCBvdXRlciA9IHRoaXMuX2ZyYW1lT2YuZ2V0KGNvbnRleHQpO1xuICAgIHJldHVybiB7IHJhbjogb3V0ZXI/LnJhbiA/PyBbXSwgdGFpbHM6IFsuLi4ob3V0ZXI/LnRhaWxzID8/IFtdKSwgdGhpcy50YWlsSWRzKG5leHQpXSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZHMgb24gYSBkZWNpZGVyJ3MgYG5leHRgIGNoYWluIOKAlCBgbmV4dGAsIGl0cyBgbmV4dGAsIOKApiDigJQgdXAgdG8gYVxuICAgKiBsb29wLXJlZiBzdHViIChhIGJhY2stZWRnZSwgbm90IHRoZSB0YWlsKS4gQ2FjaGVkIHBlciBjaGFpbiBoZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSB0YWlsSWRzKG5leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogUmVhZG9ubHlTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGlkcyA9IHRoaXMuX3RhaWxJZHMuZ2V0KG5leHQpO1xuICAgIGlmIChpZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY2hhaW4gPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgIGZvciAobGV0IG46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkID0gbmV4dDsgbiAmJiAhbi5pc0xvb3BSZWYgJiYgIWNoYWluLmhhcyhuLmlkKTsgbiA9IG4ubmV4dCkge1xuICAgICAgICBjaGFpbi5hZGQobi5pZCk7XG4gICAgICB9XG4gICAgICBpZHMgPSBjaGFpbjtcbiAgICAgIHRoaXMuX3RhaWxJZHMuc2V0KG5leHQsIGlkcyk7XG4gICAgfVxuICAgIHJldHVybiBpZHM7XG4gIH1cblxuICAvKiogQnVpbGQgYSBmbGF0IGNvbnRpbnVhdGlvbiBob3AgZm9yIHRoZSBkcml2ZXIgbG9vcC4gKi9cbiAgcHJpdmF0ZSBob3AoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBpbnZva2VyU3RhbXA/OiBJbnZva2VyU3RhbXAsXG4gICk6IENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4geyBbQ09OVElOVUVfSE9QXTogdHJ1ZSwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgLi4uKGludm9rZXJTdGFtcCAmJiB7IGludm9rZXJTdGFtcCB9KSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBsb29wIGVkZ2UgKGEgYGxvb3BUb2Agc3R1YiBvciBhIGJ5LWlkIGR5bmFtaWMgbmV4dCkgYW5kIGhvcCB0b1xuICAgKiBpdHMgdGFyZ2V0LiBUaGUgaG9wIGlzIGZsYWdnZWQgYGxvb3BgIHdoZW4gdGhlIHJlc29sdmVyIGZvbGxvd2VkIGFcbiAgICogYmFjay1yZWZlcmVuY2UsIHNvIGEgZGVjaWRlcidzIGJyYW5jaCBmcmFtZSBjYW4gdGVsbCBhIGxvb3AgdGhhdCBsZWF2ZXNcbiAgICogaXQgZnJvbSBvbmUgdGhhdCBzdGF5cyBpbnNpZGUgaXQuXG4gICAqL1xuICBwcml2YXRlIGxvb3BIb3AoXG4gICAgbG9vcFJlZjogc3RyaW5nIHwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIucmVzb2x2ZVRhcmdldChsb29wUmVmLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICBjb25zdCBob3AgPSB0aGlzLmhvcCh0YXJnZXQubm9kZSwgdGFyZ2V0LmNvbnRleHQsIGJyYW5jaFBhdGgpO1xuICAgIHJldHVybiB0YXJnZXQubm9kZSA9PT0gbG9vcFJlZiA/IGhvcCA6IHsgLi4uaG9wLCBsb29wOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogSXMgdGhlIGRlY2lkZXIncyBvd24gYG5leHRgIHRoZSBzdHViIGBsb29wVG9gIHBsYW50ZWQgKG9yIGFcbiAgICogcmVmZXJlbmNlLW9ubHkgbm9kZSDigJQgbm8gZm4sIG5vIGNoaWxkcmVuLCBubyBkZWNpZGVyL3NlbGVjdG9yLCBub3QgYVxuICAgKiBzdWJmbG93IHJvb3QpPyBUaGUgc2VsZWN0b3IncyBhbmQgdGhlIG1vdW50J3MgY29udGludWF0aW9uIGFza1xuICAgKiBgaXNMb29wUmVmYCBhbG9uZS5cbiAgICovXG4gIHByaXZhdGUgaXNMb29wU3R1YihuZXh0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBuZXh0LmlzTG9vcFJlZiA9PT0gdHJ1ZSB8fFxuICAgICAgKCF0aGlzLmdldFN0YWdlRm4obmV4dCkgJiZcbiAgICAgICAgIXRoaXMuZWZmQ2hpbGRyZW4obmV4dCk/Lmxlbmd0aCAmJlxuICAgICAgICAhbmV4dC5kZWNpZGVyRm4gJiZcbiAgICAgICAgIW5leHQuc2VsZWN0b3JGbiAmJlxuICAgICAgICAhdGhpcy5lZmZJc1N1YmZsb3dSb290KG5leHQpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBPTkUgbm9kZSB0aHJvdWdoIGFsbCA3IHBoYXNlcyDigJQgdGhlIG9sZCByZWN1cnNpdmUgYGV4ZWN1dGVOb2RlYFxuICAgKiBib2R5OyBvbmx5IHRoZSB0YWlsIGNhbGxzIGJlY2FtZSBgQ29udGludWF0aW9uSG9wYCByZXR1cm5zLiBSZXR1cm5zIHRoZVxuICAgKiBub2RlJ3MgcmVzdWx0LCBvciBhIGhvcCBmb3IgdGhlIGRyaXZlciBsb29wIHRvIGZvbGxvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU5vZGVTdGVwKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoPzogc3RyaW5nLFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIEF0dGFjaCBidWlsZGVyIG1ldGFkYXRhIHRvIGNvbnRleHQgZm9yIHNuYXBzaG90IGVucmljaG1lbnQuXG4gICAgLy8gU3ViZmxvdyBtZXRhIHJlYWRzIGdvIHRocm91Z2ggdGhlIGR5bmFtaWMtcGF0Y2ggb3ZlcmxheSDigJQgYSBub2RlXG4gICAgLy8gcGF0Y2hlZCBieSBhIGR5bmFtaWMtc3ViZmxvdyByZXR1cm4gcmUtZW50ZXJzIGV4ZWN1dGVOb2RlIGFuZCBtdXN0XG4gICAgLy8gY2xhc3NpZnkgYXMgYSBzdWJmbG93IHdpdGhvdXQgdGhlIHNoYXJlZCBub2RlIGV2ZXIgYmVpbmcgbXV0YXRlZC5cbiAgICBpZiAobm9kZS5kZXNjcmlwdGlvbikgY29udGV4dC5kZXNjcmlwdGlvbiA9IG5vZGUuZGVzY3JpcHRpb247XG4gICAgY29uc3QgZWZmU3ViZmxvd0lkID0gdGhpcy5lZmZTdWJmbG93SWQobm9kZSk7XG4gICAgaWYgKHRoaXMuZWZmSXNTdWJmbG93Um9vdChub2RlKSAmJiBlZmZTdWJmbG93SWQpIGNvbnRleHQuc3ViZmxvd0lkID0gZWZmU3ViZmxvd0lkO1xuXG4gICAgLy8gQXNzaWduIHJ1bnRpbWVTdGFnZUlkIEJFRk9SRSB0cmF2ZXJzYWxDb250ZXh0IGNyZWF0aW9uIOKAlCBlbnN1cmVzIHNjb3BlIGV2ZW50c1xuICAgIC8vIChidWZmZXJlZCBieSBydW50aW1lU3RhZ2VJZCkgYW5kIGZsb3cgZXZlbnRzIChmbHVzaGVkIGJ5IHRyYXZlcnNhbENvbnRleHQucnVudGltZVN0YWdlSWQpXG4gICAgLy8gdXNlIHRoZSBzYW1lIHZhbHVlLiBNdXN0IGhhcHBlbiBiZWZvcmUgZXhlY3V0ZVN0YWdlIEFORCBiZWZvcmUgdHJhdmVyc2FsQ29udGV4dC5cbiAgICBjb25zdCBpZHggPSB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlKys7XG4gICAgY29udGV4dC5ydW50aW1lU3RhZ2VJZCA9IGJ1aWxkUnVudGltZVN0YWdlSWQobm9kZS5pZCwgaWR4KTtcbiAgICBjb250ZXh0LmJpbmRGYWlsdXJlSWRlbnRpdHkodGhpcy5ydW5JZCwgY29udGV4dC5ydW50aW1lU3RhZ2VJZCk7XG4gICAgY29udGV4dC5iZWdpbkF0dGVudGlvbigpO1xuICAgIGNvbnRleHQuYmluZEVtaXRPcmlnaW4odGhpcy5ydW5JZCwgdGhpcy5lbWl0RHJpbGxQYXRoKTtcbiAgICAvLyBEZWNsYXJlZCB0YWdzICg5LjIxLjApIHJpZGUgdGhlIHNhbWUgc3RhbXA6IHBlci1ub2RlIGlkZW50aXR5LCBzZXRcbiAgICAvLyBVTkNPTkRJVElPTkFMTFkgc28gYSByZS11c2VkIGNvbnRleHQgKGEgbG9vcCdzIG5leHQtY29udGV4dCwgYSByZXN1bWVkXG4gICAgLy8gbGVnKSBuZXZlciBrZWVwcyBhIHByZXZpb3VzIG5vZGUncyBuYW1lcy4gYFN0YWdlQ29udGV4dC5jb21taXRgIHJlY29yZHNcbiAgICAvLyB0aGVtIG9uIHRoZSBmaXJzdCBidW5kbGUgb2YgdGhpcyBleGVjdXRpb24gYW5kIHJlbGVhc2VzIHRoZW0uXG4gICAgY29udGV4dC50YWdzID0gbm9kZS50YWdzO1xuXG4gICAgLy8gUkZDLTAwMyBEMTogcnVudGltZSBwYXJlbnQg4oCUIHRoZSBwcmV2aW91cyBleGVjdXRpb24gc3RlcCdzIHJ1bnRpbWVTdGFnZUlkLlxuICAgIC8vIEZhbGxzIGJhY2sgdG8gdGhlIHN1YmZsb3cgTU9VTlQncyBydW50aW1lU3RhZ2VJZCBmb3IgdGhlIHN1YmZsb3cgcm9vdFxuICAgIC8vIHN0YWdlIChpdHMgU3RhZ2VDb250ZXh0IGlzIGNyZWF0ZWQgZnJlc2ggd2l0aCBubyBwYXJlbnQpLCBzbyBydW50aW1lXG4gICAgLy8gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllcy4gYHx8YCAobm90IGA/P2ApIG9uIHB1cnBvc2U6XG4gICAgLy8gYSBwYXJlbnQgY29udGV4dCB0aGF0IG5ldmVyIGV4ZWN1dGVkIHN0aWxsIGNhcnJpZXMgdGhlIGZpZWxkJ3NcbiAgICAvLyBpbml0aWFsIGAnJ2AsIHdoaWNoIG11c3QgYWxzbyBmYWxsIHRocm91Z2ggdG8gdGhlIG1vdW50IGZhbGxiYWNrLlxuICAgIGNvbnN0IHBhcmVudFJ1bnRpbWVTdGFnZUlkID0gY29udGV4dC5wYXJlbnQ/LnJ1bnRpbWVTdGFnZUlkIHx8IHRoaXMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDtcblxuICAgIC8vIGxvb3BJdGVyYXRpb24g4oCUIGhvdyBtYW55IHRpbWVzIFRISVMgc3RhZ2UgaGFzIHJ1biBiZWZvcmUgaW4gdGhpcyBydW4uXG4gICAgLy8gS2V5ZWQgYnkgdGhlIHNhbWUgc3RhZ2VJZCB3ZSBzdGFtcCBvbiB0aGUgY29udGV4dCAoYW5kIHRoZSBzYW1lIHZhbHVlIHRoZVxuICAgIC8vIG5hcnJhdGl2ZSByZWNvcmRlciBjb3VudHMgb24pLCBydW4tc2NvcGVkIGFuZCBzaGFyZWQgYWNyb3NzIHN1YmZsb3dcbiAgICAvLyByZS1tb3VudHMgdmlhIGBfdmlzaXRDb3VudHNgLiB1bmRlZmluZWQgb24gdGhlIGZpcnN0IHZpc2l0OyAxIG9uIHRoZVxuICAgIC8vIGZpcnN0IGxvb3AtYmFjaywgMiBvbiB0aGUgbmV4dCwg4oCmIOKAlCBpLmUuIHZpc2l0Q291bnQgLSAxLiBDb3VudGVkIGZvclxuICAgIC8vIEVWRVJZIHN0YWdlIGtpbmQgKGFueSBub2RlIGNhbiBiZSBhIGxvb3AgdGFyZ2V0KSwgdW5saWtlIHRoZSBuYXJyYXRpdmVcbiAgICAvLyByZWNvcmRlciB3aGljaCBvbmx5IHJlbmRlcnMgaXQgZm9yIGxpbmVhciBzdGFnZXMuXG4gICAgY29uc3QgY29udGV4dFN0YWdlSWQgPSBub2RlLmlkID8/IGNvbnRleHQuc3RhZ2VJZDtcbiAgICBjb25zdCB2aXNpdENvdW50ID0gKHRoaXMuX3Zpc2l0Q291bnRzLmdldChjb250ZXh0U3RhZ2VJZCkgPz8gMCkgKyAxO1xuICAgIHRoaXMuX3Zpc2l0Q291bnRzLnNldChjb250ZXh0U3RhZ2VJZCwgdmlzaXRDb3VudCk7XG4gICAgY29uc3QgbG9vcEl0ZXJhdGlvbiA9IHZpc2l0Q291bnQgPiAxID8gdmlzaXRDb3VudCAtIDEgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBCdWlsZCB0cmF2ZXJzYWwgY29udGV4dCBmb3IgcmVjb3JkZXIgZXZlbnRzIOKAlCBjcmVhdGVkIG9uY2UgcGVyIHN0YWdlLCBzaGFyZWQgYnkgYWxsIGV2ZW50c1xuICAgIGNvbnN0IHRyYXZlcnNhbENvbnRleHQgPSB0cmF2ZXJzYWxDb250ZXh0Rm9yKHtcbiAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLFxuICAgICAgc3RhZ2VJZDogY29udGV4dFN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogY29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN0YWdlTmFtZTogbm9kZS5uYW1lLFxuICAgICAgcGFyZW50U3RhZ2VJZDogY29udGV4dC5wYXJlbnQ/LnN0YWdlSWQsXG4gICAgICBwYXJlbnRSdW50aW1lU3RhZ2VJZCxcbiAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICBzdWJmbG93SWQ6IGNvbnRleHQuc3ViZmxvd0lkID8/IHRoaXMucGFyZW50U3ViZmxvd0lkLFxuICAgICAgc3ViZmxvd1BhdGg6IGJyYW5jaFBhdGggfHwgdW5kZWZpbmVkLFxuICAgICAgLi4uKHRoaXMuY29ycmVsYXRpb24gJiYgeyBjb3JyZWxhdGlvbjogdGhpcy5jb3JyZWxhdGlvbiB9KSxcbiAgICB9KTtcblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwYTogTEFaWSBSRVNPTFZFIOKAlCBkZWZlcnJlZCBzdWJmbG93IHJlc29sdXRpb24g4pSA4pSA4pSAXG4gICAgLy8gR3VhcmQgdXNlcyB0aGUgcGVyLXRyYXZlcnNlciByZXNvbHZlZExhenlTdWJmbG93cyBzZXQgKG5vdCB0aGUgc2hhcmVkIG5vZGUpIHNvXG4gICAgLy8gY29uY3VycmVudCB0cmF2ZXJzZXJzIGRvIG5vdCByYWNlIG9uIG5vZGUuc3ViZmxvd1Jlc29sdmVyIG9yIGNsZWFyIGl0IGZvciBlYWNoIG90aGVyLlxuICAgIGlmIChub2RlLmlzU3ViZmxvd1Jvb3QgJiYgbm9kZS5zdWJmbG93UmVzb2x2ZXIgJiYgIXRoaXMucmVzb2x2ZWRMYXp5U3ViZmxvd3MuaGFzKG5vZGUuc3ViZmxvd0lkISkpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gbm9kZS5zdWJmbG93UmVzb2x2ZXIoKTtcbiAgICAgIGNvbnN0IHByZWZpeGVkUm9vdCA9IHRoaXMucHJlZml4Tm9kZVRyZWUocmVzb2x2ZWQucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgbm9kZS5zdWJmbG93SWQhKTtcblxuICAgICAgLy8gUmVnaXN0ZXIgdGhlIHJlc29sdmVkIHN1YmZsb3cgKHNhbWUgcGF0aCBhcyBlYWdlciByZWdpc3RyYXRpb24pXG4gICAgICB0aGlzLnN1YmZsb3dzW25vZGUuc3ViZmxvd0lkIV0gPSB7IHJvb3Q6IHByZWZpeGVkUm9vdCB9O1xuXG4gICAgICAvLyBNZXJnZSBzdGFnZU1hcCBlbnRyaWVzXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiByZXNvbHZlZC5zdGFnZU1hcCkge1xuICAgICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGpvaW5QYXRoKG5vZGUuc3ViZmxvd0lkISwga2V5KTtcbiAgICAgICAgaWYgKCF0aGlzLnN0YWdlTWFwLmhhcyhwcmVmaXhlZEtleSkpIHtcbiAgICAgICAgICB0aGlzLnN0YWdlTWFwLnNldChwcmVmaXhlZEtleSwgZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBNZXJnZSBuZXN0ZWQgc3ViZmxvd3NcbiAgICAgIGlmIChyZXNvbHZlZC5zdWJmbG93cykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMocmVzb2x2ZWQuc3ViZmxvd3MpKSB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ZWRLZXkgPSBqb2luUGF0aChub2RlLnN1YmZsb3dJZCEsIGtleSk7XG4gICAgICAgICAgaWYgKCF0aGlzLnN1YmZsb3dzW3ByZWZpeGVkS2V5XSkge1xuICAgICAgICAgICAgLy8gUHJlZml4ZWQgbGlrZSB0aGUgYnVpbGRlcidzIGBfbW91bnRTdWJmbG93YCAoOS4zNy4wIGZpeCk6IHRoZVxuICAgICAgICAgICAgLy8gbmVzdGVkIHJvb3QncyBpZHMgbGl2ZSB1bmRlciB0aGUgbGF6eSBtb3VudCdzIHBhdGggdG9vLlxuICAgICAgICAgICAgdGhpcy5zdWJmbG93c1twcmVmaXhlZEtleV0gPSB7XG4gICAgICAgICAgICAgIHJvb3Q6IHByZWZpeE5vZGVUcmVlKChkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9KS5yb290LCBub2RlLnN1YmZsb3dJZCEpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHJ1bnRpbWUgc3RydWN0dXJlIHdpdGggdGhlIG5vdy1yZXNvbHZlZCBzcGVjXG4gICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgIG5vZGUuaWQsXG4gICAgICAgIG5vZGUuc3ViZmxvd0lkISxcbiAgICAgICAgbm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgcmVzb2x2ZWQuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgKTtcblxuICAgICAgLy8gTWFyayBhcyByZXNvbHZlZCBmb3IgVEhJUyB0cmF2ZXJzZXIg4oCUIHBlci10cmF2ZXJzZXIgc2V0IHByZXZlbnRzIHJlLWVudHJ5XG4gICAgICAvLyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgU3RhZ2VOb2RlIGdyYXBoICh3aGljaCB3b3VsZCByYWNlIGNvbmN1cnJlbnQgdHJhdmVyc2VycykuXG4gICAgICB0aGlzLnJlc29sdmVkTGF6eVN1YmZsb3dzLmFkZChub2RlLnN1YmZsb3dJZCEpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwOiBDTEFTU0lGWSDigJQgc3ViZmxvdyBkZXRlY3Rpb24g4pSA4pSA4pSAXG4gICAgaWYgKHRoaXMuZWZmSXNTdWJmbG93Um9vdChub2RlKSAmJiBlZmZTdWJmbG93SWQpIHtcbiAgICAgIC8vIEhhbmQgaGVscGVycyB0aGUgRUZGRUNUSVZFIG5vZGUgdmlldyAoYnVpbHQgZmllbGRzICsgZHluYW1pYyBwYXRjaClcbiAgICAgIC8vIHNvIFN1YmZsb3dFeGVjdXRvci9Ob2RlUmVzb2x2ZXIgbmV2ZXIgcmVhZCBzdGFsZSBidWlsdCBmaWVsZHMuXG4gICAgICBjb25zdCBtb3VudE5vZGUgPSB0aGlzLmVmZk5vZGUobm9kZSk7XG4gICAgICBjb25zdCByZXNvbHZlZE5vZGUgPSB0aGlzLm5vZGVSZXNvbHZlci5yZXNvbHZlU3ViZmxvd1JlZmVyZW5jZShtb3VudE5vZGUpO1xuXG4gICAgICBjb25zdCBzdWJmbG93T3V0cHV0ID0gYXdhaXQgdGhpcy5zdWJmbG93RXhlY3V0b3IuZXhlY3V0ZVN1YmZsb3coXG4gICAgICAgIHJlc29sdmVkTm9kZSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0aGlzLnN1YmZsb3dSZXN1bHRzLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgPSByZXNvbHZlZE5vZGUgIT09IG1vdW50Tm9kZTtcbiAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gQm9vbGVhbihtb3VudE5vZGUuY2hpbGRyZW4gJiYgbW91bnROb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApO1xuICAgICAgY29uc3Qgc2hvdWxkRXhlY3V0ZUNvbnRpbnVhdGlvbiA9IGlzUmVmZXJlbmNlQmFzZWRTdWJmbG93IHx8IGhhc0NoaWxkcmVuO1xuXG4gICAgICAvLyDilIDilIDilIAgQnJlYWstZmxhZyBjaGVjayBBRlRFUiBzdWJmbG93IHJldHVybnMg4pSA4pSA4pSAXG4gICAgICAvLyBJZiB0aGUgc3ViZmxvdyB3YXMgbW91bnRlZCB3aXRoIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAgYW5kIGJyb2tlXG4gICAgICAvLyBpbnRlcm5hbGx5LCBgU3ViZmxvd0V4ZWN1dG9yYCBoYXMgYWxyZWFkeSBmbGlwcGVkIG91ciBicmVha0ZsYWcuXG4gICAgICAvLyBTdG9wIHRoZSBvdXRlciB0cmF2ZXJzYWwgaGVyZSDigJQgZG8gbm90IHJ1biB0aGUgbmV4dCBsaW5lYXIgc3RhZ2UuXG4gICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5uZXh0ICYmIHNob3VsZEV4ZWN1dGVDb250aW51YXRpb24pIHtcbiAgICAgICAgLy8gQSBtb3VudCdzIGBuZXh0YCBjYW4gYmUgYSBsb29wLXJlZiBTVFVCIOKAlCBhIHN1YmZsb3cgbW91bnRlZCBhcyBhXG4gICAgICAgIC8vIGRlY2lkZXIgYnJhbmNoIHdpdGggYHsgbG9vcFRvIH1gIC8gYC5sb29wVG8oKWAuIFJlc29sdmUgaXQgbGlrZVxuICAgICAgICAvLyBQaGFzZSA2IGRvZXMgKGl0ZXJhdGlvbiBjb3VudGVkLCBgb25Mb29wYCBmaXJlZCk7IGhvcHBpbmcgaW50byB0aGVcbiAgICAgICAgLy8gYmFyZSBzdHViIHJhbiB0aGUgdGFyZ2V0J3MgZnVuY3Rpb24gb25jZSBhbmQgZW5kZWQgdGhlIHJ1bi5cbiAgICAgICAgaWYgKG5vZGUubmV4dC5pc0xvb3BSZWYpIHJldHVybiB0aGlzLmxvb3BIb3Aobm9kZS5uZXh0LCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0Lm5hbWUsIG5vZGUubmV4dC5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLm5leHQsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMGI6IFBBUkFMTEVMLUZPUi1FQUNIIOKAlCBkeW5hbWljIGZhbi1vdXQsIG9uZSBicmFuY2ggcGVyIGl0ZW0g4pSA4pSA4pSAXG4gICAgLy9cbiAgICAvLyBTaXRzIEJFRk9SRSBQaGFzZSAxIChWQUxJREFURSkgb24gcHVycG9zZTogdGhpcyBub2RlIGxlZ2l0aW1hdGVseSBoYXMgbm9cbiAgICAvLyBzdGFnZSBmdW5jdGlvbiwgbm8gc3RhdGljIGNoaWxkcmVuLCBhbmQgbm8gZGVjaWRlciDigJQgaXRzIGJyYW5jaGVzIGRvIG5vdFxuICAgIC8vIGV4aXN0IHVudGlsIGBpdGVtcygpYCBydW5zIOKAlCBzbyB0aGUgXCJtdXN0IGRlZmluZSBmbiBPUiBjaGlsZHJlblwiIGNoZWNrXG4gICAgLy8gd291bGQgcmVqZWN0IGEgcGVyZmVjdGx5IHZhbGlkIGNoYXJ0LiBUaGUgaGFuZGxlciBvd25zIGl0cyBvd24gY29tbWl0XG4gICAgLy8gKHRoZSBvcmRlcmVkIHJlc3VsdHMgYXJyYXkpLCBsaWtlIHRoZSBkZWNpZGVyIGFuZCBzZWxlY3RvciBwaGFzZXMgZG8uXG4gICAgaWYgKG5vZGUuaXNEeW5hbWljUGFyYWxsZWwgJiYgbm9kZS5wYXJhbGxlbEZvckVhY2gpIHtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnBhcmFsbGVsRm9yRWFjaEhhbmRsZXIucnVuKG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuXG4gICAgICBpZiAobm9kZS5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5vZGUubmV4dC5uYW1lLCBub2RlLm5leHQuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5ob3Aobm9kZS5uZXh0LCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWdlRnVuYyA9IHRoaXMuZ2V0U3RhZ2VGbihub2RlKTtcbiAgICBjb25zdCBoYXNTdGFnZUZ1bmN0aW9uID0gQm9vbGVhbihzdGFnZUZ1bmMpO1xuICAgIGNvbnN0IGlzU2NvcGVCYXNlZERlY2lkZXIgPSBCb29sZWFuKG5vZGUuZGVjaWRlckZuKTtcbiAgICBjb25zdCBpc1Njb3BlQmFzZWRTZWxlY3RvciA9IEJvb2xlYW4obm9kZS5zZWxlY3RvckZuKTtcbiAgICBjb25zdCBpc0RlY2lkZXJOb2RlID0gaXNTY29wZUJhc2VkRGVjaWRlcjtcbiAgICBjb25zdCBoYXNDaGlsZHJlbiA9IEJvb2xlYW4odGhpcy5lZmZDaGlsZHJlbihub2RlKT8ubGVuZ3RoKTtcbiAgICAvLyBgbmV4dGAgaXMgbmV2ZXIgb3ZlcmxhaWQg4oCUIGEgZHluYW1pYyBuZXh0IGFwcGxpZXMgb25seSB0byB0aGUgdmlzaXRcbiAgICAvLyB0aGF0IHByb2R1Y2VkIGl0IChoYW5kbGVkIHZpYSB0aGUgYGR5bmFtaWNOZXh0YCBsb2NhbCBiZWxvdyksIHNvIHRoZVxuICAgIC8vIGJ1aWx0IGNoYXJ0J3MgbmV4dCBpcyBhbHdheXMgdGhlIGNvcnJlY3QgY29udGludWF0aW9uIGhlcmUuXG4gICAgY29uc3QgaGFzTmV4dCA9IEJvb2xlYW4obm9kZS5uZXh0KTtcbiAgICBjb25zdCBvcmlnaW5hbE5leHQgPSBub2RlLm5leHQ7XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMTogVkFMSURBVEUg4oCUIG5vZGUgaW52YXJpYW50cyDilIDilIDilIBcbiAgICBpZiAoIWhhc1N0YWdlRnVuY3Rpb24gJiYgIWlzRGVjaWRlck5vZGUgJiYgIWlzU2NvcGVCYXNlZFNlbGVjdG9yICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYE5vZGUgJyR7bm9kZS5uYW1lfScgbXVzdCBkZWZpbmU6IGVtYmVkZGVkIGZuIE9SIGEgc3RhZ2VNYXAgZW50cnkgT1IgaGF2ZSBjaGlsZHJlbi9kZWNpZGVyYDtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuICAgIGlmIChpc0RlY2lkZXJOb2RlICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ0RlY2lkZXIgbm9kZSBuZWVkcyB0byBoYXZlIGNoaWxkcmVuIHRvIGV4ZWN1dGUnO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKGlzU2NvcGVCYXNlZFNlbGVjdG9yICYmICFoYXNDaGlsZHJlbikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ1NlbGVjdG9yIG5vZGUgbmVlZHMgdG8gaGF2ZSBjaGlsZHJlbiB0byBleGVjdXRlJztcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLy8gUm9sZSBtYXJrZXJzIGZvciBkZWJ1ZyBwYW5lbHNcbiAgICBpZiAoIWhhc1N0YWdlRnVuY3Rpb24pIHtcbiAgICAgIGlmIChpc0RlY2lkZXJOb2RlKSBjb250ZXh0LnNldEFzRGVjaWRlcigpO1xuICAgICAgZWxzZSBpZiAoaGFzQ2hpbGRyZW4pIGNvbnRleHQuc2V0QXNGb3JrKCk7XG4gICAgfVxuXG4gICAgY29uc3QgYnJlYWtGbiA9IGNyZWF0ZUJyZWFrSGFuZGxlcihicmVha0ZsYWcpO1xuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDJhOiBTRUxFQ1RPUiDigJQgc2NvcGUtYmFzZWQgbXVsdGktY2hvaWNlIOKUgOKUgOKUgFxuICAgIGlmIChpc1Njb3BlQmFzZWRTZWxlY3Rvcikge1xuICAgICAgY29uc3Qgc2VsZWN0b3JSZXN1bHQgPSBhd2FpdCB0aGlzLnNlbGVjdG9ySGFuZGxlci5oYW5kbGVTY29wZUJhc2VkKFxuICAgICAgICBub2RlLFxuICAgICAgICBzdGFnZUZ1bmMhLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRoaXMuZXhlY3V0ZVN0YWdlLmJpbmQodGhpcyksXG4gICAgICAgIHRoaXMuZXhlY3V0ZU5vZGUuYmluZCh0aGlzKSxcbiAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICk7XG5cbiAgICAgIC8vIFRoZSBoYW5kbGVyIGNvbW1pdHRlZCBhbmQgcmVjb3JkZWQgdGhlIHN0b3AuIERvIG5vdCBjcmVhdGUgYSBuZXh0XG4gICAgICAvLyBmcmFtZSBvciByZXNvbHZlIGEgbG9vcCBlZGdlIGZvciBhIHNlbGVjdG9yIHRoYXQgc3RvcHBlZCBoZXJlLlxuICAgICAgaWYgKGJyZWFrRmxhZy5zaG91bGRCcmVhaykgcmV0dXJuIHNlbGVjdG9yUmVzdWx0O1xuXG4gICAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgICAvLyBBIHNlbGVjdG9yJ3Mgb3duIGBsb29wVG9gIGlzIGEgbG9vcCBlZGdlIGxpa2UgYW55IG90aGVyOiByZXNvbHZlZFxuICAgICAgICAvLyAoaXRlcmF0aW9uIGd1YXJkICsgYG9uTG9vcGApLCBuZXZlciBhIGhvcCBpbnRvIHRoZSBiYXJlIHN0dWIuXG4gICAgICAgIGlmIChub2RlLm5leHQhLmlzTG9vcFJlZiA9PT0gdHJ1ZSkgcmV0dXJuIHRoaXMubG9vcEhvcChub2RlLm5leHQhLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0IS5uYW1lLCBub2RlLm5leHQhLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5vZGUubmV4dCEsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGVjdG9yUmVzdWx0O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAyYjogREVDSURFUiDigJQgc2NvcGUtYmFzZWQgc2luZ2xlLWNob2ljZSBjb25kaXRpb25hbCBicmFuY2gg4pSA4pSA4pSAXG4gICAgaWYgKGlzRGVjaWRlck5vZGUpIHtcbiAgICAgIGNvbnN0IGRpc3BhdGNoID0gYXdhaXQgdGhpcy5kZWNpZGVySGFuZGxlci5wcmVwYXJlRGlzcGF0Y2goXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHN0YWdlRnVuYyEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgdGhpcy5leGVjdXRlU3RhZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICk7XG5cbiAgICAgIC8vIE5vIGRlY2lkZXItbGV2ZWwgY29udGludWF0aW9uIOKGkiB0aGUgYnJhbmNoIGRpc3BhdGNoIGlzIGEgdGFpbFxuICAgICAgLy8gY2FsbC4gSGFuZCBpdCB0byB0aGUgZHJpdmVyIGFzIGEgZmxhdCBob3Agc28gbG9vcC1oZWF2eSBkZWNpZGVyXG4gICAgICAvLyBjaGFydHMgKGUuZy4gYWdlbnQgUmVBY3QgbG9vcHMgd2l0aCBicmFuY2gtc291cmNlZCBgbG9vcFRvYCkgc3RheVxuICAgICAgLy8gZmxhdC1zdGFja2VkLiBUaGUgaW52b2tlciBzdGFtcCBwcmVzZXJ2ZXMgUGF1c2VTaWduYWwgc2VtYW50aWNzIOKAlFxuICAgICAgLy8gdGhlIGRlY2lkZXIgaXMgdGhlIGludm9rZXIgb2Ygd2hhdGV2ZXIgcGF1c2VzIGluIHRoZSBjaGFpbi5cbiAgICAgIGlmICghaGFzTmV4dCAmJiBkaXNwYXRjaC5raW5kID09PSAnZGlzcGF0Y2gnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChkaXNwYXRjaC5jaG9zZW4sIGRpc3BhdGNoLmJyYW5jaENvbnRleHQsIGJyYW5jaFBhdGgsIHsgaW52b2tlclN0YWdlSWQ6IG5vZGUuaWQhIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWNpZGVyIFdJVEggaXRzIG93biBuZXh0OiB0aGUgYnJhbmNoIGNoYWluIG11c3QgY29tcGxldGUgQkVGT1JFXG4gICAgICAvLyB0aGUgZGVjaWRlcidzIGNvbnRpbnVhdGlvbiBydW5zIOKAlCB0cnVlIHRyZWUgbmVzdGluZywga2VwdFxuICAgICAgLy8gcmVjdXJzaXZlIChhIG5lc3RlZCBkcml2ZXIsIHJ1biBhcyBhIEJSQU5DSCBGUkFNRSkuIE1pcnJvcnNcbiAgICAgIC8vIGhhbmRsZVNjb3BlQmFzZWQgZXhhY3RseSwgaW5jbHVkaW5nIHRoZSBQYXVzZVNpZ25hbCBpbnZva2VyIHN0YW1wXG4gICAgICAvLyBvbiBidWJibGUtdXAuXG4gICAgICBsZXQgZGVjaWRlclJlc3VsdDogYW55O1xuICAgICAgaWYgKGRpc3BhdGNoLmtpbmQgPT09ICdicmVhaycpIHtcbiAgICAgICAgZGVjaWRlclJlc3VsdCA9IGRpc3BhdGNoLmJyYW5jaElkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkZWNpZGVyUmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlTm9kZShcbiAgICAgICAgICAgIGRpc3BhdGNoLmNob3NlbixcbiAgICAgICAgICAgIGRpc3BhdGNoLmJyYW5jaENvbnRleHQsXG4gICAgICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICAgICAgdGhpcy5icmFuY2hGcmFtZUZvcihjb250ZXh0LCBvcmlnaW5hbE5leHQhKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAgICAgZXJyb3Iuc2V0SW52b2tlcihub2RlLmlkISk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBicmFuY2ggTE9PUEVEIE9VVCBvZiBpdHMgZnJhbWUgKGJhY2sgdGhyb3VnaCB0aGlzIGRlY2lkZXIgb3JcbiAgICAgICAgLy8gZnVydGhlciB1cCk6IHRoZSBicmFuY2ggbmV2ZXIgY29tcGxldGVkLCBzbyB0aGlzIGRlY2lkZXIncyBgbmV4dGBcbiAgICAgICAgLy8gaXMgbm90IGR1ZSDigJQgZm9sbG93IHRoZSBsb29wIGZsYXQgYXQgdGhpcyBsZXZlbC4gVGhlIGBuZXh0YCBydW5zXG4gICAgICAgIC8vIG9uY2UsIGFmdGVyIHRoZSBwYXNzIHdob3NlIGJyYW5jaCBjb21wbGV0ZXMgKENMQVVERS5tZCBcImxvb3BcIjogYVxuICAgICAgICAvLyBmbGF0IGhvcCB3aXRoIHplcm8gc3RhY2spLlxuICAgICAgICBpZiAoaXNDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPihkZWNpZGVyUmVzdWx0KSkgcmV0dXJuIGRlY2lkZXJSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIGJyYW5jaCBleGVjdXRpb24sIGZvbGxvdyBkZWNpZGVyJ3Mgb3duIG5leHQgKGUuZy4sIGxvb3BUbyB0YXJnZXQpXG4gICAgICBpZiAoaGFzTmV4dCAmJiAhYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIGNvbnN0IG5leHROb2RlID0gb3JpZ2luYWxOZXh0ITtcbiAgICAgICAgLy8gVXNlIHRoZSBpc0xvb3BSZWYgZmxhZyBzZXQgYnkgbG9vcFRvKCkg4oCUIGRvIG5vdCByZWx5IG9uIHN0YWdlTWFwIGFic2VuY2UsXG4gICAgICAgIC8vIHNpbmNlIGlkLWtleWVkIHN0YWdlTWFwcyB3b3VsZCBvdGhlcndpc2UgY2F1c2UgbG9vcCB0YXJnZXRzIHRvIGJlIGV4ZWN1dGVkIGRpcmVjdGx5LlxuICAgICAgICBpZiAodGhpcy5pc0xvb3BTdHViKG5leHROb2RlKSkgcmV0dXJuIHRoaXMubG9vcEhvcChuZXh0Tm9kZSwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCk7XG5cbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25OZXh0KG5vZGUubmFtZSwgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChuZXh0Tm9kZSwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWNpZGVyUmVzdWx0O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBBYm9ydCBjaGVjayDigJQgY29vcGVyYXRpdmUgY2FuY2VsbGF0aW9uIOKUgOKUgOKUgFxuICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgdGhpcy5zaWduYWwucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyB0aGlzLnNpZ25hbC5yZWFzb24gOiBuZXcgRXJyb3IodGhpcy5zaWduYWwucmVhc29uID8/ICdBYm9ydGVkJyk7XG4gICAgICB0aHJvdyByZWFzb247XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDM6IEVYRUNVVEUg4oCUIHJ1biBzdGFnZSBmdW5jdGlvbiDilIDilIDilIBcbiAgICBsZXQgc3RhZ2VPdXRwdXQ6IFRPdXQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGR5bmFtaWNOZXh0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmV0dXJuZWREeW5hbWljTm9kZSA9IGZhbHNlO1xuXG4gICAgaWYgKHN0YWdlRnVuYykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RhZ2VPdXRwdXQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdGFnZShub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICAvLyBUaGUgcnVuLXRpbWUgZG9vcjogYSByZXR1cm5lZCBTdGFnZU5vZGUgYWRvcHRzIGlkcyAoUjUpIGFuZCByZXRyeVxuICAgICAgICAvLyBwb2xpY2llcyB0aGUgYnVpbGRlciBuZXZlciBzYXcuIFJlZnVzZWQgaGVyZSwgaW5zaWRlIHRoZSB0cnksIHNvIGl0XG4gICAgICAgIC8vIHRha2VzIHRoZSBzdGFnZSdzIGVycm9yIHBhdGggKGNvbW1pdCwgb25FcnJvciwgcmV0aHJvdykuXG4gICAgICAgIHRoaXMuYWRtaXREeW5hbWljTm9kZXMoc3RhZ2VPdXRwdXQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3csIG5vdCBhbiBlcnJvciDigJQgZmlyZSBuYXJyYXRpdmUsIGNvbW1pdCwgcmUtdGhyb3cuXG4gICAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAgIGNvbW1pdFN0YWdlV3JpdGVzKGNvbnRleHQpO1xuICAgICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUGF1c2UoXG4gICAgICAgICAgICBub2RlLm5hbWUsXG4gICAgICAgICAgICBub2RlLmlkLFxuICAgICAgICAgICAgc2VydmVkUGF1c2UoY29udGV4dCwgZXJyb3IucGF1c2VEYXRhKSxcbiAgICAgICAgICAgIGVycm9yLnN1YmZsb3dQYXRoLFxuICAgICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNhcHR1cmVTdGFnZUZhaWx1cmUoY29udGV4dCwgZXJyb3IpO1xuICAgICAgICBjb21taXRTdGFnZVdyaXRlcyhjb250ZXh0KTtcbiAgICAgICAgY29uc3Qgc2VydmVkID0gcmVjb3JkU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvcik7XG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uRXJyb3Iobm9kZS5uYW1lLCBzZXJ2ZWQubWVzc2FnZSwgc2VydmVkLnN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwge1xuICAgICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb21taXRTdGFnZShjb250ZXh0LCB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciwgbm9kZS5uYW1lLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdsaW5lYXInKTtcblxuICAgICAgaWYgKGJyZWFrRmxhZy5zaG91bGRCcmVhaykge1xuICAgICAgICAvLyBGb3J3YXJkIHRoZSBvcHRpb25hbCByZWFzb24gY2FwdHVyZWQgb24gYnJlYWtGbGFnIOKAlCBzZXQgYnkgdGhlXG4gICAgICAgIC8vIHN0YWdlJ3MgJGJyZWFrKHJlYXNvbikgY2FsbCBPUiBieSBhIHN1YmZsb3cncyBwcm9wYWdhdGVCcmVhay5cbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25CcmVhayhub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQsIGJyZWFrRmxhZy5yZWFzb24pO1xuICAgICAgICByZXR1cm4gc3RhZ2VPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA0OiBEWU5BTUlDIOKAlCBTdGFnZU5vZGUgcmV0dXJuIGRldGVjdGlvbiDilIDilIDilIBcbiAgICAgIGlmIChzdGFnZU91dHB1dCAmJiB0eXBlb2Ygc3RhZ2VPdXRwdXQgPT09ICdvYmplY3QnICYmIGlzU3RhZ2VOb2RlUmV0dXJuKHN0YWdlT3V0cHV0KSkge1xuICAgICAgICBjb25zdCBkeW5hbWljTm9kZSA9IHN0YWdlT3V0cHV0IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgICAgICByZXR1cm5lZER5bmFtaWNOb2RlID0gdHJ1ZTtcbiAgICAgICAgY29udGV4dC5hZGRMb2coJ2lzRHluYW1pYycsIHRydWUpO1xuICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnU3RhZ2VOb2RlUmV0dXJuJyk7XG5cbiAgICAgICAgLy8gRHluYW1pYyBzdWJmbG93IGF1dG8tcmVnaXN0cmF0aW9uLiBUaGUgc3ViZmxvdyBtZXRhIGxhbmRzIGluIHRoZVxuICAgICAgICAvLyB0cmF2ZXJzZXItbG9jYWwgb3ZlcmxheSAoTk9UIG9uIHRoZSBzaGFyZWQgbm9kZSk7IHRoZSBpbW1lZGlhdGVcbiAgICAgICAgLy8gZXhlY3V0ZU5vZGUgcmUtZW50cnkgc2VlcyBpdCB0aHJvdWdoIHRoZSBlZmYqIGFjY2Vzc29ycyBhbmRcbiAgICAgICAgLy8gY2xhc3NpZmllcyB0aGUgbm9kZSBhcyBhIHN1YmZsb3cgbW91bnQgaW4gUGhhc2UgMC5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmlzU3ViZmxvd1Jvb3QgJiYgZHluYW1pY05vZGUuc3ViZmxvd0RlZiAmJiBkeW5hbWljTm9kZS5zdWJmbG93SWQpIHtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnZHluYW1pY1N1YmZsb3cnKTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1N1YmZsb3dJZCcsIGR5bmFtaWNOb2RlLnN1YmZsb3dJZCk7XG5cbiAgICAgICAgICB0aGlzLmF1dG9SZWdpc3RlclN1YmZsb3dEZWYoZHluYW1pY05vZGUuc3ViZmxvd0lkLCBkeW5hbWljTm9kZS5zdWJmbG93RGVmLCBub2RlLmlkKTtcblxuICAgICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVQYXRjaChub2RlKS5zdWJmbG93TWV0YSA9IHtcbiAgICAgICAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICAgICAgICBzdWJmbG93SWQ6IGR5bmFtaWNOb2RlLnN1YmZsb3dJZCxcbiAgICAgICAgICAgIHN1YmZsb3dOYW1lOiBkeW5hbWljTm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IGR5bmFtaWNOb2RlLnN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93SWQhLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93RGVmPy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlLWVudGVyIFRISVMgbm9kZSAoc2FtZSBjb250ZXh0KTogdGhlIG92ZXJsYXkgcGF0Y2ggbWFrZXMgdGhlXG4gICAgICAgICAgLy8gbmV4dCBzdGVwIGNsYXNzaWZ5IGl0IGFzIGEgc3ViZmxvdyBtb3VudCBpbiBQaGFzZSAwLlxuICAgICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGNoaWxkcmVuIGZvciBzdWJmbG93RGVmXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZHluYW1pY05vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZC5pc1N1YmZsb3dSb290ICYmIGNoaWxkLnN1YmZsb3dEZWYgJiYgY2hpbGQuc3ViZmxvd0lkKSB7XG4gICAgICAgICAgICAgIHRoaXMuYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihjaGlsZC5zdWJmbG93SWQsIGNoaWxkLnN1YmZsb3dEZWYsIGNoaWxkLmlkKTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgICAgICAgIGNoaWxkLmlkLFxuICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dJZCEsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd0RlZj8uYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIER5bmFtaWMgY2hpbGRyZW4gKGZvcmsgcGF0dGVybikg4oCUIHBhdGNoZWQgaW50byB0aGUgb3ZlcmxheTtcbiAgICAgICAgLy8gUGhhc2UgNSBiZWxvdyByZWFkcyB0aGVtIGJhY2sgdGhyb3VnaCBlZmZDaGlsZHJlbi9lZmZTZWxlY3Rvci5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmNoaWxkcmVuICYmIGR5bmFtaWNOb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkuY2hpbGRyZW4gPSBkeW5hbWljTm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY0NoaWxkQ291bnQnLCBkeW5hbWljTm9kZS5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKFxuICAgICAgICAgICAgJ2R5bmFtaWNDaGlsZElkcycsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5jaGlsZHJlbi5tYXAoKGMpID0+IGMuaWQpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY0NoaWxkcmVuKFxuICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLmNoaWxkcmVuLFxuICAgICAgICAgICAgQm9vbGVhbihkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yKSxcbiAgICAgICAgICAgIEJvb2xlYW4oZHluYW1pY05vZGUuZGVjaWRlckZuKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkubmV4dE5vZGVTZWxlY3RvciA9IGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3I7XG4gICAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzU2VsZWN0b3InLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEeW5hbWljIG5leHQgKGxpbmVhciBjb250aW51YXRpb24pIOKAlCBzdGF5cyBhIExPQ0FMOiBpdCBhcHBsaWVzXG4gICAgICAgIC8vIG9ubHkgdG8gdGhpcyB2aXNpdCAoUGhhc2UgNiByb3V0ZXMgaXQgdGhyb3VnaCB0aGVcbiAgICAgICAgLy8gQ29udGludWF0aW9uUmVzb2x2ZXIpLCBzbyB0aGUgc2hhcmVkIG5vZGUncyBuZXh0IGlzIG5ldmVyIHRvdWNoZWRcbiAgICAgICAgLy8gYW5kIGEgbG9vcCByZXZpc2l0IG5hdHVyYWxseSBzZWVzIHRoZSBidWlsdCBjb250aW51YXRpb24uXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5uZXh0KSB7XG4gICAgICAgICAgZHluYW1pY05leHQgPSBkeW5hbWljTm9kZS5uZXh0O1xuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljTmV4dChub2RlLmlkLCBkeW5hbWljTm9kZS5uZXh0KTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzRHluYW1pY05leHQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YWdlT3V0cHV0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA1OiBDSElMRFJFTiDigJQgZm9yayBkaXNwYXRjaCDilIDilIDilIBcbiAgICAvLyBSZS1yZWFkIHRocm91Z2ggdGhlIG92ZXJsYXk6IFBoYXNlIDQgbWF5IGhhdmUganVzdCBwYXRjaGVkIGR5bmFtaWNcbiAgICAvLyBjaGlsZHJlbi9zZWxlY3RvciBmb3IgVEhJUyB2aXNpdCAob3IgYW4gZWFybGllciB2aXNpdCBpbiB0aGlzIHJ1bikuXG4gICAgY29uc3QgY2hpbGRyZW5BZnRlclN0YWdlID0gdGhpcy5lZmZDaGlsZHJlbihub2RlKTtcbiAgICBjb25zdCBoYXNDaGlsZHJlbkFmdGVyU3RhZ2UgPSBCb29sZWFuKGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoKTtcblxuICAgIGlmIChoYXNDaGlsZHJlbkFmdGVyU3RhZ2UpIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCd0b3RhbENoaWxkcmVuJywgY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGgpO1xuICAgICAgY29udGV4dC5hZGRMb2coJ29yZGVyT2ZFeGVjdXRpb24nLCAnQ2hpbGRyZW5BZnRlclN0YWdlJyk7XG5cbiAgICAgIGxldCBub2RlQ2hpbGRyZW5SZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCBOb2RlUmVzdWx0VHlwZT47XG5cbiAgICAgIGNvbnN0IGVmZlNlbGVjdG9yRm4gPSB0aGlzLmVmZlNlbGVjdG9yKG5vZGUpO1xuICAgICAgaWYgKGVmZlNlbGVjdG9yRm4pIHtcbiAgICAgICAgbm9kZUNoaWxkcmVuUmVzdWx0cyA9IGF3YWl0IHRoaXMuY2hpbGRyZW5FeGVjdXRvci5leGVjdXRlU2VsZWN0ZWRDaGlsZHJlbihcbiAgICAgICAgICBlZmZTZWxlY3RvckZuLFxuICAgICAgICAgIGNoaWxkcmVuQWZ0ZXJTdGFnZSEsXG4gICAgICAgICAgc3RhZ2VPdXRwdXQsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBicmFuY2hQYXRoIGFzIHN0cmluZyxcbiAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgIG5vZGUuZmFpbEZhc3QsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjaGlsZENvdW50ID0gY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGggPz8gMDtcbiAgICAgICAgY29uc3QgY2hpbGROYW1lcyA9IGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubWFwKChjKSA9PiBjLm5hbWUpLmpvaW4oJywgJyk7XG4gICAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnY2hpbGRyZW4nLCBgRXhlY3V0aW5nIGFsbCAke2NoaWxkQ291bnR9IGNoaWxkcmVuIGluIHBhcmFsbGVsOiAke2NoaWxkTmFtZXN9YCwge1xuICAgICAgICAgIGNvdW50OiBjaGlsZENvdW50LFxuICAgICAgICAgIHRhcmdldFN0YWdlOiBjaGlsZHJlbkFmdGVyU3RhZ2U/Lm1hcCgoYykgPT4gYy5uYW1lKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZWZmTm9kZTogQ2hpbGRyZW5FeGVjdXRvciByZWFkcyBub2RlLmNoaWxkcmVuL25vZGUuZmFpbEZhc3QgaXRzZWxmLlxuICAgICAgICBub2RlQ2hpbGRyZW5SZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4oXG4gICAgICAgICAgdGhpcy5lZmZOb2RlKG5vZGUpLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yay1vbmx5OiByZXR1cm4gYnVuZGxlXG4gICAgICBpZiAoIWhhc05leHQgJiYgIWR5bmFtaWNOZXh0KSB7XG4gICAgICAgIHJldHVybiBub2RlQ2hpbGRyZW5SZXN1bHRzITtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FwdHVyZSBkeW5hbWljIGNoaWxkcmVuIGFzIHN5bnRoZXRpYyBzdWJmbG93IHJlc3VsdCBmb3IgVUlcbiAgICAgIC8vIFJ1bnRpbWUgc3RydWN0dXJlIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGg7IGRpYWdub3N0aWMgdGV4dCBtYXkgYmVcbiAgICAgIC8vIG1hc2tlZCAob3IgdXNlci13cml0dGVuKSBhbmQgbXVzdCBuZXZlciBkZWNpZGUgY2FwdHVyZSBiZWhhdmlvci5cbiAgICAgIGlmIChyZXR1cm5lZER5bmFtaWNOb2RlICYmIGNoaWxkcmVuQWZ0ZXJTdGFnZSAmJiBjaGlsZHJlbkFmdGVyU3RhZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNhcHR1cmVEeW5hbWljQ2hpbGRyZW5SZXN1bHQobm9kZSwgY2hpbGRyZW5BZnRlclN0YWdlLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNjogQ09OVElOVUUg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IOKUgOKUgOKUgFxuICAgIGlmIChkeW5hbWljTmV4dCkgcmV0dXJuIHRoaXMubG9vcEhvcChkeW5hbWljTmV4dCwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCk7XG5cbiAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuXG4gICAgICAvLyBEZXRlY3QgbG9vcCByZWZlcmVuY2Ugbm9kZXMgY3JlYXRlZCBieSBsb29wVG8oKSDigJQgbWFya2VkIHdpdGggaXNMb29wUmVmIGZsYWcuXG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIENvbnRpbnVhdGlvblJlc29sdmVyIGZvciBwcm9wZXIgSUQgcmVzb2x1dGlvbiwgaXRlcmF0aW9uXG4gICAgICAvLyB0cmFja2luZywgYW5kIG5hcnJhdGl2ZSBnZW5lcmF0aW9uLiBUaGUgcmVzb2x2ZWQgdGFyZ2V0IGNvbWVzIGJhY2tcbiAgICAgIC8vIGFzIGEgaG9wIOKAlCBsb29wIGVkZ2VzIGNvbnN1bWUgbm8gc3RhY2ssIHNvIHRoZSBpdGVyYXRpb24gbGltaXRcbiAgICAgIC8vIChub3QgY2FsbC1zdGFjayBkZXB0aCkgaXMgd2hhdCBib3VuZHMgYSBsb29wLlxuICAgICAgY29uc3QgaXNMb29wUmVmZXJlbmNlID0gbmV4dE5vZGUuaXNMb29wUmVmO1xuXG4gICAgICBpZiAoaXNMb29wUmVmZXJlbmNlKSByZXR1cm4gdGhpcy5sb29wSG9wKG5leHROb2RlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25OZXh0KG5vZGUubmFtZSwgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCduZXh0JywgYE1vdmluZyB0byAke25leHROb2RlLm5hbWV9IHN0YWdlYCwge1xuICAgICAgICB0YXJnZXRTdGFnZTogbmV4dE5vZGUubmFtZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuaWQpO1xuICAgICAgcmV0dXJuIHRoaXMuaG9wKG5leHROb2RlLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNzogTEVBRiDigJQgbm8gY29udGludWF0aW9uIOKUgOKUgOKUgFxuICAgIHJldHVybiBzdGFnZU91dHB1dDtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBQcml2YXRlIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBjYXB0dXJlRHluYW1pY0NoaWxkcmVuUmVzdWx0KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNoaWxkcmVuOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdLFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50U3RhZ2VJZCA9IGNvbnRleHQuZ2V0U3RhZ2VJZCgpO1xuXG4gICAgY29uc3QgY2hpbGRTdHJ1Y3R1cmU6IGFueSA9IHtcbiAgICAgIGlkOiBgJHtub2RlLmlkfS1jaGlsZHJlbmAsXG4gICAgICBuYW1lOiAnRHluYW1pYyBDaGlsZHJlbicsXG4gICAgICB0eXBlOiAnZm9yaycsXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW4ubWFwKChjKSA9PiAoe1xuICAgICAgICBpZDogYy5pZCxcbiAgICAgICAgbmFtZTogYy5uYW1lLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgfSkpLFxuICAgIH07XG5cbiAgICBjb25zdCBjaGlsZFN0YWdlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBpZiAoY29udGV4dC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZEN0eCBvZiBjb250ZXh0LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gY2hpbGRDdHguZ2V0U25hcHNob3QoKTtcbiAgICAgICAgY2hpbGRTdGFnZXNbc25hcHNob3QubmFtZSB8fCBzbmFwc2hvdC5pZF0gPSB7XG4gICAgICAgICAgbmFtZTogc25hcHNob3QubmFtZSxcbiAgICAgICAgICBvdXRwdXQ6IHNuYXBzaG90LmxvZ3MsXG4gICAgICAgICAgZXJyb3JzOiBzbmFwc2hvdC5lcnJvcnMsXG4gICAgICAgICAgbWV0cmljczogc25hcHNob3QubWV0cmljcyxcbiAgICAgICAgICBzdGF0dXM6IHNuYXBzaG90LmVycm9ycyAmJiBPYmplY3Qua2V5cyhzbmFwc2hvdC5lcnJvcnMpLmxlbmd0aCA+IDAgPyAnZXJyb3InIDogJ3N1Y2Nlc3MnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMuc2V0KG5vZGUuaWQsIHtcbiAgICAgIHN1YmZsb3dJZDogbm9kZS5pZCxcbiAgICAgIHN1YmZsb3dOYW1lOiBub2RlLm5hbWUsXG4gICAgICB0cmVlQ29udGV4dDoge1xuICAgICAgICBnbG9iYWxDb250ZXh0OiB7fSxcbiAgICAgICAgc3RhZ2VDb250ZXh0czogY2hpbGRTdGFnZXMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgaGlzdG9yeTogW10sXG4gICAgICAgIGluaXRpYWxTdGF0ZToge30sXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lU3RydWN0dXJlOiBjaGlsZFN0cnVjdHVyZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGdlbmVyYXRlZCBgcGFyYWxsZWxGb3JFYWNoYCBicmFuY2ggYXMgYSBzdWJmbG93IOKAlCBPVkVSV1JJVElOR1xuICAgKiBhbnkgcmVnaXN0cmF0aW9uIGZyb20gYSBwcmV2aW91cyB2aXNpdC5cbiAgICpcbiAgICogRGVsaWJlcmF0ZSBkaXZlcmdlbmNlIGZyb20gYGF1dG9SZWdpc3RlclN1YmZsb3dEZWZgJ3MgZmlyc3Qtd3JpdGUtd2lucy5cbiAgICogR2VuZXJhdGVkIHNlZ21lbnRzIGFyZSBzdGFibGUgYWNyb3NzIGxvb3AgaXRlcmF0aW9ucyAoYDxzdGFnZUlkPn48aW5kZXg+YFxuICAgKiBpcyBkZXJpdmVkIGZyb20gdGhlIHN0YWdlIGlkIGFuZCB0aGUgYnJhbmNoIGluZGV4LCBuZWl0aGVyIG9mIHdoaWNoXG4gICAqIGNoYW5nZXMpLCBzbyBmaXJzdC13cml0ZS13aW5zIHdvdWxkIG1lYW4gYSBMT09QSU5HIGZhbi1vdXQgc2lsZW50bHlcbiAgICogcmUtZXhlY3V0aW5nIGl0ZXJhdGlvbiAxJ3MgYnJhbmNoIGNoYXJ0cyBmb3JldmVyIOKAlCBldmVuIHdoZW4gdGhlIGJyYW5jaFxuICAgKiBmYWN0b3J5IHJldHVybnMgYSBkaWZmZXJlbnQgY2hhcnQgZWFjaCB0aW1lLiBUaGF0IGlzIHRoZSBcIndvdWxkIG5vdCBjcmFzaCxcbiAgICogd291bGQgc2lsZW50bHkgY29ycnVwdFwiIGZhaWx1cmUgY2xhc3MgdGhpcyB3aG9sZSBkZXNpZ24gaXMgYnVpbHQgdG8gYXZvaWQsXG4gICAqIHNvIGEgcmVnZW5lcmF0ZWQgYnJhbmNoIGFsd2F5cyByZXBsYWNlcyBpdHMgcHJlZGVjZXNzb3IuIFBlci1pdGVyYXRpb25cbiAgICogcmVzdWx0cyBzdGF5IGFkZHJlc3NhYmxlIHZpYSB0aGUgbW91bnQncyBgcnVudGltZVN0YWdlSWRgIGtleSwgZXhhY3RseSBhc1xuICAgKiBmb3IgYSBoYW5kLWF1dGhvcmVkIGxvb3Bpbmcgc3ViZmxvdy5cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJCcmFuY2hTdWJmbG93KFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNoYXJ0OiB7IHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+OyBzdWJmbG93cz86IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlIH0+IH0sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuc3ViZmxvd3Nbc3ViZmxvd0lkXSA9IHsgcm9vdCB9O1xuXG4gICAgLy8gU3RhZ2UgZnVuY3Rpb25zIGxhbmQgdW5kZXIgdGhlIGJyYW5jaCdzIHByZWZpeCwgbWF0Y2hpbmcgdGhlIHByZWZpeGVkIGlkcy5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiBjaGFydC5zdGFnZU1hcCkge1xuICAgICAgdGhpcy5zdGFnZU1hcC5zZXQoam9pblBhdGgoc3ViZmxvd0lkLCBrZXkpLCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgIH1cblxuICAgIC8vIE5lc3RlZCBzdWJmbG93cyBpbnNpZGUgdGhlIGJyYW5jaCBjaGFydCwgc2FtZSBwcmVmaXhpbmcuXG4gICAgaWYgKGNoYXJ0LnN1YmZsb3dzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoY2hhcnQuc3ViZmxvd3MpKSB7XG4gICAgICAgIC8vIFByZWZpeGVkIGxpa2UgdGhlIGJ1aWxkZXIncyBgX21vdW50U3ViZmxvd2AgKDkuMzcuMCBmaXgpOiB3aXRob3V0IGl0XG4gICAgICAgIC8vIGV2ZXJ5IGJyYW5jaCByYW4gaXRzIG5lc3RlZCBzdWJmbG93J3Mgc3RhZ2VzIHVuZGVyIE9ORSBpZC5cbiAgICAgICAgdGhpcy5zdWJmbG93c1tqb2luUGF0aChzdWJmbG93SWQsIGtleSldID0ge1xuICAgICAgICAgIHJvb3Q6IHByZWZpeE5vZGVUcmVlKChkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9KS5yb290LCBzdWJmbG93SWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmaXggYSBub2RlIHRyZWUgd2l0aCBhIHN1YmZsb3cgcGF0aCBzZWdtZW50IGF0IFJVTiB0aW1lIChsYXp5IHN1YmZsb3dzLFxuICAgKiB0aGUgZ2VuZXJhdGVkIGJyYW5jaGVzIG9mIGBhZGRQYXJhbGxlbEZvckVhY2hgKSDigJQgdGhlIG9uZSBwcmVmaXhlcixcbiAgICogYGVuZ2luZS9ncmFwaC9wcmVmaXhOb2RlVHJlZS50c2AsIHdoaWNoIHRoZSBidWlsZGVyIGNhbGxzIGF0IG1vdW50IHRpbWUuXG4gICAqL1xuICBwcml2YXRlIHByZWZpeE5vZGVUcmVlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBwcmVmaXg6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gcHJlZml4Tm9kZVRyZWUobm9kZSwgcHJlZml4KTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihcbiAgICBzdWJmbG93SWQ6IHN0cmluZyxcbiAgICBzdWJmbG93RGVmOiBOb25OdWxsYWJsZTxTdGFnZU5vZGVbJ3N1YmZsb3dEZWYnXT4sXG4gICAgbW91bnROb2RlSWQ/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIHRoaXMuc3ViZmxvd3MgaXMgYWx3YXlzIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3RvcjsgdGhlIG51bGwgZ3VhcmQgYmVsb3cgaXMgdW5yZWFjaGFibGUuXG4gICAgY29uc3Qgc3ViZmxvd3NEaWN0ID0gdGhpcy5zdWJmbG93cztcblxuICAgIC8vIEZpcnN0LXdyaXRlLXdpbnNcbiAgICBjb25zdCBpc05ld1JlZ2lzdHJhdGlvbiA9ICFzdWJmbG93c0RpY3Rbc3ViZmxvd0lkXTtcbiAgICBpZiAoaXNOZXdSZWdpc3RyYXRpb24gJiYgc3ViZmxvd0RlZi5yb290KSB7XG4gICAgICBzdWJmbG93c0RpY3Rbc3ViZmxvd0lkXSA9IHtcbiAgICAgICAgcm9vdDogc3ViZmxvd0RlZi5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgICAgICAuLi4oc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUgPyB7IGJ1aWxkVGltZVN0cnVjdHVyZTogc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUgfSA6IHt9KSxcbiAgICAgIH0gYXMgYW55O1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXMgKHBhcmVudCBlbnRyaWVzIHByZXNlcnZlZClcbiAgICBpZiAoc3ViZmxvd0RlZi5zdGFnZU1hcCkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBmbl0gb2YgQXJyYXkuZnJvbShzdWJmbG93RGVmLnN0YWdlTWFwLmVudHJpZXMoKSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YWdlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdGhpcy5zdGFnZU1hcC5zZXQoa2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgbmVzdGVkIHN1YmZsb3dzXG4gICAgaWYgKHN1YmZsb3dEZWYuc3ViZmxvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJmbG93RGVmLnN1YmZsb3dzKSkge1xuICAgICAgICBpZiAoIXN1YmZsb3dzRGljdFtrZXldKSB7XG4gICAgICAgICAgc3ViZmxvd3NEaWN0W2tleV0gPSBkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vdW50Tm9kZUlkKSB7XG4gICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgIG1vdW50Tm9kZUlkLFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIHN1YmZsb3dEZWYucm9vdD8uc3ViZmxvd05hbWUgfHwgc3ViZmxvd0RlZi5yb290Py5uYW1lLFxuICAgICAgICBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTm90aWZ5IEZsb3dSZWNvcmRlcnMgb25seSBvbiBmaXJzdCByZWdpc3RyYXRpb24gKG1hdGNoZXMgZmlyc3Qtd3JpdGUtd2lucylcbiAgICBpZiAoaXNOZXdSZWdpc3RyYXRpb24pIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gc3ViZmxvd0RlZi5yb290Py5zdWJmbG93TmFtZSB8fCBzdWJmbG93RGVmLnJvb3Q/Lm5hbWUgfHwgc3ViZmxvd0lkO1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93UmVnaXN0ZXJlZChcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBzdWJmbG93TmFtZSxcbiAgICAgICAgc3ViZmxvd0RlZi5yb290Py5kZXNjcmlwdGlvbixcbiAgICAgICAgc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQSB0b3VjaGluZyBub2RlJ3MgcmVmdXNhbCBhdCB0aGUgcnVuLXRpbWUgZG9vciwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgbGF3IGFkbWl0cyBpdC4gKi9cbmZ1bmN0aW9uIHRvdWNoZXNSZWZ1c2FsKG5vZGU6IFN0YWdlTm9kZTxhbnksIGFueT4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9ibGVtID0gdG91Y2hlc1Byb2JsZW0obm9kZS50b3VjaGVzLCBub2RlLnJldHJ5KTtcbiAgcmV0dXJuIHByb2JsZW0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGBzdGFnZSAnJHtub2RlLmlkfSc6ICR7cHJvYmxlbX1gO1xufVxuIl19