footprintjs 10.4.0 → 10.5.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 (80) hide show
  1. package/README.md +63 -25
  2. package/dist/esm/lib/capture/historyData.d.ts +6 -2
  3. package/dist/esm/lib/capture/historyData.js +18 -1
  4. package/dist/esm/lib/capture/historyNote.d.ts +2 -2
  5. package/dist/esm/lib/capture/historyNote.js +11 -6
  6. package/dist/esm/lib/capture/historyTypes.d.ts +1 -1
  7. package/dist/esm/lib/capture/historyTypes.js +1 -1
  8. package/dist/esm/lib/capture/nativeSourceAddress.d.ts +3 -0
  9. package/dist/esm/lib/capture/nativeSourceAddress.js +15 -0
  10. package/dist/esm/lib/capture/readSources.d.ts +7 -1
  11. package/dist/esm/lib/capture/readSources.js +32 -11
  12. package/dist/esm/lib/capture/sinkSettlement.d.ts +6 -0
  13. package/dist/esm/lib/capture/sinkSettlement.js +10 -0
  14. package/dist/esm/lib/capture/sourceReadCounts.d.ts +18 -0
  15. package/dist/esm/lib/capture/sourceReadCounts.js +27 -0
  16. package/dist/esm/lib/capture/sourceReferenceBudget.d.ts +10 -0
  17. package/dist/esm/lib/capture/sourceReferenceBudget.js +21 -0
  18. package/dist/esm/lib/capture/storedReadSourceCounts.d.ts +3 -0
  19. package/dist/esm/lib/capture/storedReadSourceCounts.js +78 -0
  20. package/dist/esm/lib/capture/storedReadSources.d.ts +4 -0
  21. package/dist/esm/lib/capture/storedReadSources.js +104 -0
  22. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +11 -2
  23. package/dist/esm/lib/engine/handlers/servedSubflowResults.js +13 -2
  24. package/dist/esm/lib/engine/types.d.ts +2 -1
  25. package/dist/esm/lib/engine/types.js +1 -1
  26. package/dist/esm/lib/memory/StageContext.d.ts +1 -0
  27. package/dist/esm/lib/memory/StageContext.js +14 -2
  28. package/dist/esm/lib/memory/frameTypes.d.ts +3 -0
  29. package/dist/esm/lib/memory/frameTypes.js +1 -1
  30. package/dist/esm/lib/memory/logAddress.d.ts +3 -0
  31. package/dist/esm/lib/memory/logAddress.js +7 -0
  32. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +2 -0
  33. package/dist/esm/lib/runner/ExecutionRuntime.js +65 -8
  34. package/dist/esm/lib/runner/FlowChartExecutor.js +4 -2
  35. package/dist/esm/lib/runner/captureHistory.js +16 -10
  36. package/dist/esm/lib/runner/readStoredCapture.d.ts +4 -2
  37. package/dist/esm/lib/runner/readStoredCapture.js +3 -3
  38. package/dist/esm/lib/runner/recordSink.js +2 -10
  39. package/dist/esm/lib/runner/storedCaptureAdmission.js +10 -8
  40. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  41. package/dist/lib/capture/historyData.js +21 -2
  42. package/dist/lib/capture/historyNote.js +9 -4
  43. package/dist/lib/capture/historyTypes.js +1 -1
  44. package/dist/lib/capture/nativeSourceAddress.js +19 -0
  45. package/dist/lib/capture/readSources.js +35 -12
  46. package/dist/lib/capture/sinkSettlement.js +14 -0
  47. package/dist/lib/capture/sourceReadCounts.js +31 -0
  48. package/dist/lib/capture/sourceReferenceBudget.js +25 -0
  49. package/dist/lib/capture/storedReadSourceCounts.js +82 -0
  50. package/dist/lib/capture/storedReadSources.js +108 -0
  51. package/dist/lib/engine/handlers/SubflowExecutor.js +11 -2
  52. package/dist/lib/engine/handlers/servedSubflowResults.js +13 -2
  53. package/dist/lib/engine/types.js +1 -1
  54. package/dist/lib/memory/StageContext.js +14 -2
  55. package/dist/lib/memory/frameTypes.js +1 -1
  56. package/dist/lib/memory/logAddress.js +11 -0
  57. package/dist/lib/runner/ExecutionRuntime.js +65 -8
  58. package/dist/lib/runner/FlowChartExecutor.js +4 -2
  59. package/dist/lib/runner/captureHistory.js +15 -9
  60. package/dist/lib/runner/readStoredCapture.js +2 -2
  61. package/dist/lib/runner/recordSink.js +6 -14
  62. package/dist/lib/runner/storedCaptureAdmission.js +9 -7
  63. package/dist/lib/scope/ScopeFacade.js +2 -2
  64. package/dist/types/lib/capture/historyData.d.ts +6 -2
  65. package/dist/types/lib/capture/historyNote.d.ts +2 -2
  66. package/dist/types/lib/capture/historyTypes.d.ts +1 -1
  67. package/dist/types/lib/capture/nativeSourceAddress.d.ts +3 -0
  68. package/dist/types/lib/capture/readSources.d.ts +7 -1
  69. package/dist/types/lib/capture/sinkSettlement.d.ts +6 -0
  70. package/dist/types/lib/capture/sourceReadCounts.d.ts +18 -0
  71. package/dist/types/lib/capture/sourceReferenceBudget.d.ts +10 -0
  72. package/dist/types/lib/capture/storedReadSourceCounts.d.ts +3 -0
  73. package/dist/types/lib/capture/storedReadSources.d.ts +4 -0
  74. package/dist/types/lib/engine/types.d.ts +2 -1
  75. package/dist/types/lib/memory/StageContext.d.ts +1 -0
  76. package/dist/types/lib/memory/frameTypes.d.ts +3 -0
  77. package/dist/types/lib/memory/logAddress.d.ts +3 -0
  78. package/dist/types/lib/runner/ExecutionRuntime.d.ts +2 -0
  79. package/dist/types/lib/runner/readStoredCapture.d.ts +4 -2
  80. package/package.json +1 -1
@@ -13,6 +13,7 @@
13
13
  */
14
14
  import { buildAttemptId } from 'foottrace';
15
15
  import { RecordFrame } from 'foottrace/write';
16
+ import { EMPTY_SOURCE_READ_COUNTS, SourceReadCounter } from '../capture/sourceReadCounts.js';
16
17
  import { summarizeReadValue, summarizeWriteValue } from '../capture/summarize.js';
17
18
  import { isDevMode } from '../devMode.js';
18
19
  import { NativeFailureState } from '../errors/terminalFailure.js';
@@ -73,6 +74,7 @@ export class StageContext {
73
74
  capture;
74
75
  /** Source coverage, shared only by frames of this runtime. */
75
76
  readSources;
77
+ sourceReadCounter;
76
78
  sourceAttempt;
77
79
  stageName = '';
78
80
  /** Unique stage identifier from the builder (matches spec node id). */
@@ -584,10 +586,15 @@ export class StageContext {
584
586
  }
585
587
  readWithNativeSource(path, key, privacy) {
586
588
  const identity = this.#failureIdentity;
589
+ const counts = this.readSources?.active && identity && key !== undefined
590
+ ? (this.sourceReadCounter ??= new SourceReadCounter())
591
+ : undefined;
587
592
  let judged = false;
588
593
  let hidden = false;
589
594
  const verdict = () => {
590
595
  judged = true;
596
+ if (counts && !counts.observe())
597
+ this.readSources?.limit('source-capture-failed');
591
598
  const result = privacy();
592
599
  hidden = result !== 'visible';
593
600
  return result;
@@ -600,7 +607,10 @@ export class StageContext {
600
607
  verdict();
601
608
  }
602
609
  else {
603
- value = this.record.readWithSource(path, key, { runtimeStageId: identity.runtimeStageId, ...(this.sourceAttempt && { attemptId: this.sourceAttempt }) }, verdict).value;
610
+ const read = this.record.readWithSource(path, key, { runtimeStageId: identity.runtimeStageId, ...(this.sourceAttempt && { attemptId: this.sourceAttempt }) }, verdict);
611
+ value = read.value;
612
+ if (read.occurrence && this.readSources?.active)
613
+ counts?.retain(read.occurrence.source.kind);
604
614
  }
605
615
  }
606
616
  catch (error) {
@@ -1162,6 +1172,8 @@ export class StageContext {
1162
1172
  metrics: this.debug.metricContext,
1163
1173
  evals: this.debug.evalContext,
1164
1174
  };
1175
+ if (this.readSources?.observing)
1176
+ snapshot.readSourceCounts = this.sourceReadCounter?.snapshot() ?? EMPTY_SOURCE_READ_COUNTS;
1165
1177
  const stageWrites = this.retainedWrites();
1166
1178
  if (Object.keys(stageWrites).length > 0) {
1167
1179
  // Extract values only for the snapshot (strip operation metadata)
@@ -1199,4 +1211,4 @@ export class StageContext {
1199
1211
  return snapshot;
1200
1212
  }
1201
1213
  }
1202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUdILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSzlDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUErQixrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RyxPQUFPLEVBQTBCLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHdkYsT0FBTyxFQUNMLEtBQUssRUFDTCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLG1IQUFtSDtBQUNuSCxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFFNUI7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUVyQyx1SEFBdUg7QUFDdkgsU0FBUyxnQkFBZ0I7SUFDdkIsT0FBTyxJ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R0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ2xELENBQUM7UUFDRCxzR0FBc0c7UUFDdEcsOERBQThEO1FBQzlELElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxRQUFRLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksSUFBSSxDQUFDLGVBQWU7WUFBRSxRQUFRLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDekUsSUFBSSxJQUFJLENBQUMsV0FBVztZQUFFLFFBQVEsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDakYsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQztZQUFFLFFBQVEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ2hGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDOUMsSUFBSSxTQUFTLEVBQUUsTUFBTTtZQUFFLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3RELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RhZ2VDb250ZXh0IOKAlCBFeGVjdXRpb24gY29udGV4dCBmb3IgYSBzaW5nbGUgc3RhZ2UgaW4gYSBmbG93Y2hhcnQgcnVuXG4gKlxuICogTGlrZSBhIHN0YWNrIGZyYW1lIGluIGEgY29tcGlsZXIvcnVudGltZTpcbiAqIC0gQSBSZWNvcmRGcmFtZSDigJQgdGhlIHJlY29yZCBoYWxmIChDMyk6IHRoZSBoZWFwLCB0aGUgYWRkcmVzcywgdGhlXG4gKiAgIGZpcnN0LXRvdWNoIGJhc2UsIHRoZSBsYXp5IHRyYW5zYWN0aW9uIGJ1ZmZlciBhbmQgZXZlcnkgd3JpdGUncyBzY3J1YlxuICogICAoQzQpLCB0aGUgcmVhZEtleXMgbGlzdFxuICogLSBMaW5rcyB0byBwYXJlbnQvY2hpbGQvbmV4dCBjb250ZXh0cyAoY2FsbCBzdGFjayBmcmFtZXMpXG4gKiAtIFdoYXQgYmVsb25ncyB0byBhIHN0YWdlIGluc2lkZSBhIHJ1bjogcmV0ZW50aW9uIG9mIHJlYWRzIGFuZCB3cml0ZXMsIHRoZVxuICogICByZWRhY3Rpb24gZGVjaXNpb24gcGVyIHdyaXRlIChgcmVkYWN0aW9uLnRzIMK3IGRlY2lkZVdyaXRlYCkgYW5kIHdoZXJlIHRoZVxuICogICBmcmFtZSB3cml0ZXMgKGBydW5BZGRyZXNzLnRzYCksIHRoZSBkZXYtbW9kZSB3YXJuaW5ncywgdGhlIGNvbW1pdCBvYnNlcnZlclxuICogLSBEaWFnbm9zdGljQ29sbGVjdG9yIGZvciBsb2dzLCBlcnJvcnMsIG1ldHJpY3NcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdFBoYXNlLCBFbWl0U291cmNlUG9zaXRpb24sIFVudHJhY2tlZFNvdXJjZSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgeyBidWlsZEF0dGVtcHRJZCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50TG9nLCBTaGFyZWRNZW1vcnksIFdyaXRlVmVyYiB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5pbXBvcnQgeyBSZWNvcmRGcmFtZSB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgQXR0ZW1wdENvbnRleHQsIEF0dGVtcHRSZWNvcmQsIEF0dGVtcHRTdW1tYXJ5LCBMYXRlV3JpdGUgfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTmF0aXZlQ2FwdHVyZSB9IGZyb20gJy4uL2NhcHR1cmUvbmF0aXZlQ292ZXJhZ2UuanMnO1xuaW1wb3J0IHR5cGUgeyBFbmdpbmVSZWFkU291cmNlQ2FwdHVyZSB9IGZyb20gJy4uL2NhcHR1cmUvcmVhZFNvdXJjZXMuanMnO1xuaW1wb3J0IHsgc3VtbWFyaXplUmVhZFZhbHVlLCBzdW1tYXJpemVXcml0ZVZhbHVlIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IHR5cGUgVGVybWluYWxGYWlsdXJlQ29udGV4dCwgTmF0aXZlRmFpbHVyZVN0YXRlIH0gZnJvbSAnLi4vZXJyb3JzL3Rlcm1pbmFsRmFpbHVyZS5qcyc7XG5pbXBvcnQgeyBTdGFnZUF0dGVudGlvbiB9IGZyb20gJy4vYXR0ZW50aW9uLmpzJztcbmltcG9ydCB7IGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlLCBjb21taXR0ZWRNdXRhdGlvbk1lc3NhZ2UsIGZpcnN0RGlmZmVyaW5nUGF0aCB9IGZyb20gJy4vYm9ycm93ZWRNdXRhdGlvbi5qcyc7XG5pbXBvcnQgeyB0eXBlIERpYWdub3N0aWNDaGFubmVsLCBEaWFnbm9zdGljQ29sbGVjdG9yIH0gZnJvbSAnLi9EaWFnbm9zdGljQ29sbGVjdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd0NvbnRyb2xUeXBlLCBGbG93TWVzc2FnZSwgUmVhZFRyYWNraW5nTW9kZSwgU3RhZ2VTbmFwc2hvdCwgV3JpdGVUcmFja2luZ01vZGUgfSBmcm9tICcuL2ZyYW1lVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25WZXJkaWN0IH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHtcbiAgQ0xFQVIsXG4gIGRlY2lkZVdyaXRlLFxuICBpbmhlcml0QnlJZGVudGl0eSxcbiAgbWFya1N0YWdlZFdyaXRlLFxuICBSZWRhY3Rpb25SdWxlLFxuICBTQ09QRV9QTEFDRUhPTERFUixcbiAgc2NydWJPZixcbiAgdXNlcktleU9mLFxufSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBydW5BZGRyZXNzIH0gZnJvbSAnLi9ydW5BZGRyZXNzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHsgREVGQVVMVF9SVU5fUE9MSUNZLCB3aXRoUmVkYWN0aW9uIH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuXG4vKiogSG93IG1hbnkgbGF0ZSB3cml0ZXMgYSBzdGFnZSBrZWVwcyDigJQgYW4gYWJhbmRvbmVkIGF0dGVtcHQgdGhhdCBsb29wcyBtdXN0IG5vdCBncm93IHRoZSByZWNvcmQgd2l0aG91dCBib3VuZC4gKi9cbmNvbnN0IE1BWF9MQVRFX1dSSVRFUyA9IDEwMDtcblxuLyoqXG4gKiBIb3cgbWFueSBjYWxsIGFuZCBvYnNlcnZlZCBhdHRlbXB0IHJlY29yZHMgb25lIHN0YWdlIGV4ZWN1dGlvbiBrZWVwcyAoUDIpIOKAlCBhIHN0YWdlIHRoYXQgY2FsbHMgaW4gYSBsb29wIG11c3RcbiAqIG5vdCBncm93IHRoZSBleGVjdXRpb24gdHJlZSB3aXRob3V0IGJvdW5kLiBUaGUgcmVzdCBhcmUgY291bnRlZCAoYFN0YWdlU25hcHNob3QuYXR0ZW1wdHNEcm9wcGVkYCkgYW5kIHN0aWxsXG4gKiBmaXJlZCBvbiBgb25BdHRlbXB0YC4gQSBzdGFnZSdzIE9XTiBhdHRlbXB0IHJlY29yZHMgYXJlIG5ldmVyIGRpc3BsYWNlZDogaXRzIHBvbGljeSdzIGNlaWxpbmcgYm91bmRzIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQ0FMTF9SRUNPUkRTID0gMTAwMDtcblxuLyoqIFdoeSBhIGNhbGwgc3RvcHBlZCB3aGVuIHRoZSBzdGFnZSBhdHRlbXB0IHRoYXQgbWFkZSBpdCBlbmRlZCB3aXRob3V0IGEgcmVhc29uIG9mIGl0cyBvd24gKGl0IHJldHVybmVkIG9yIHRocmV3KS4gKi9cbmZ1bmN0aW9uIGNhbGxzRW5kZWRSZWFzb24oKTogRXJyb3Ige1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgICdbZm9vdHByaW50XSAkY2FsbDogdGhlIHN0YWdlIGF0dGVtcHQgdGhhdCBtYWRlIHRoaXMgY2FsbCBoYXMgZW5kZWQg4oCUIHRoZSBjYWxsIHN0b3BzLCBhbmQgbm90aGluZyBpdCByZWNvcmRzICcgK1xuICAgICAgJ2xhbmRzIG9uIHRoZSBzdGFnZS4gQXdhaXQgZXZlcnkgY2FsbCB0aGUgc3RhZ2UgbWFrZXMuJyxcbiAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIFN0YWdlQ29udGV4dCB7XG4gIC8qKiBAaW50ZXJuYWwgT3duZXJzaGlwIG9mIGFuIGVzY2FwaW5nIGZhaWx1cmUuIFNoYXJlZCBvbmx5IGJ5IHNlcXVlbnRpYWwgZnJhbWVzLCBuZXZlciBzZXJpYWxpemVkLiAqL1xuICBmYWlsdXJlU3RhdGUgPSBuZXcgTmF0aXZlRmFpbHVyZVN0YXRlKCk7XG4gICNmYWlsdXJlSWRlbnRpdHk/OiBOb25OdWxsYWJsZTxUZXJtaW5hbEZhaWx1cmVDb250ZXh0WydzdGFnZSddPjtcblxuICAvKiogQGludGVybmFsIFRoZSBuYXRpdmUgZnJhbWUgc3RhbXAsIGluZGVwZW5kZW50IG9mIG11dGFibGUgcmVjb3JkZXIgZXZlbnQgY29udGV4dC4gKi9cbiAgZ2V0IGZhaWx1cmVJZGVudGl0eSgpOiBOb25OdWxsYWJsZTxUZXJtaW5hbEZhaWx1cmVDb250ZXh0WydzdGFnZSddPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2ZhaWx1cmVJZGVudGl0eTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgU3RhbXBlZCBiZWZvcmUgb2JzZXJ2ZXJzOyBuZXZlciBpbmhlcml0ZWQgYnkgYW5vdGhlciBmcmFtZSBvciBwZXJzaXN0ZWQuICovXG4gIGJpbmRGYWlsdXJlSWRlbnRpdHkocnVuSWQ6IHN0cmluZywgcnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuI2ZhaWx1cmVJZGVudGl0eSA9IE9iamVjdC5mcmVlemUoeyBydW5JZCwgcnVudGltZVN0YWdlSWQgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlY29yZCBoYWxmIG9mIHRoaXMgZnJhbWUgKGBSZWNvcmRGcmFtZS50c2AsIEwzLCBDMyk6IHRoZSBoZWFwIGFuZCxcbiAgICogd2hlbiB0aGUgcnVuIGtlZXBzIHRoZW0sIHRoZSByZWRhY3RlZCBtaXJyb3IgYW5kIHRoZSBsb2c7IHRoZSBhZGRyZXNzO1xuICAgKiB0aGUgZmlyc3QtdG91Y2ggYmFzZTsgdGhlIGxhenkgdHJhbnNhY3Rpb24gYnVmZmVyOyB0aGUgcmVhZEtleXMgbGlzdC5cbiAgICogRXZlcnkgc3RhdGUgcmVhZCBvZiB0aGlzIGZyYW1lIGdvZXMgdGhyb3VnaCBpdCwgYW5kIHNvIGRvZXMgZXZlcnlcbiAgICogY29tbWl0LiBUaGUgbWlycm9yIGlzIHByZXNlbnQgKipvbmx5Kiogd2hlbiB0aGUgcnVuJ3MgcG9saWN5IGtlZXBzIGFcbiAgICogcmVkYWN0ZWQgdmlldyAoYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkKSDigJQgcmVhZCB2aWFcbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yLmdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCwgdGhlIGZvdW5kYXRpb24gZm9yXG4gICAqIHNoYXJpbmcgYSB0cmFjZSB3aXRob3V0IGxlYWtpbmcgcmF3IFBJSSB0aHJvdWdoIGBzaGFyZWRTdGF0ZWAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlY29yZDogUmVjb3JkRnJhbWU7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgcG9saWN5IOKAlCB0aGUgZm91ciBkaWFscywgdGhlIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yIGZsYWdcbiAgICogKGBydW5Qb2xpY3kudHNgLCBGNSkuIEhlbGQgQlkgUkVGRVJFTkNFOiBvbmUgZnJvemVuIG9iamVjdCBwZXIgcnVuIChhbmRcbiAgICogcGVyIHJlc3VtZSksIHNoYXJlZCBieSBldmVyeSBmcmFtZSBvZiB0aGUgcnVuLCBhIHN1YmZsb3cncyBpbmNsdWRlZCDigJRcbiAgICoge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH0gcGFzcyB0aGUgcmVmZXJlbmNlXG4gICAqICh7QGxpbmsgaW5oZXJpdFJ1bn0pLCB0aGUgcnVudGltZSBpbnN0YWxscyBpdCBvbiBpdHMgcm9vdFxuICAgKiAoe0BsaW5rIHVzZVBvbGljeX0pLiBOZXZlciBlZGl0ZWQ7IGEgY2hhbmdlIGlzIGEgbmV3IG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgcG9saWN5OiBSdW5Qb2xpY3kgPSBERUZBVUxUX1JVTl9QT0xJQ1k7XG4gIC8qKiBUaGUgZW1pdHRpbmcgZnJhbWUncyBsb2dpY2FsIGxlZywgbmV2ZXIgdGhlIG11dGFibGUgZXhlY3V0b3IncyBjdXJyZW50IGxlZy4gKi9cbiAgcHJpdmF0ZSBlbWl0UnVuSWQ/OiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBuYXRpdmUgcm9vdC1sb2cgY29sbGVjdG9yOyBjb3BpZWQgdG8gc2FtZS1sb2cgZnJhbWVzLCBuZXZlciBjaGlsZCBydW50aW1lcy4gKi9cbiAgY2FwdHVyZT86IE5hdGl2ZUNhcHR1cmU7XG4gIC8qKiBTb3VyY2UgY292ZXJhZ2UsIHNoYXJlZCBvbmx5IGJ5IGZyYW1lcyBvZiB0aGlzIHJ1bnRpbWUuICovXG4gIHJlYWRTb3VyY2VzPzogRW5naW5lUmVhZFNvdXJjZUNhcHR1cmU7XG4gIHByaXZhdGUgc291cmNlQXR0ZW1wdD86IHN0cmluZztcblxuICBwdWJsaWMgc3RhZ2VOYW1lID0gJyc7XG4gIC8qKiBVbmlxdWUgc3RhZ2UgaWRlbnRpZmllciBmcm9tIHRoZSBidWlsZGVyIChtYXRjaGVzIHNwZWMgbm9kZSBpZCkuICovXG4gIHB1YmxpYyBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIFNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIHN0YWdlIGV4ZWN1dGlvbi4gKi9cbiAgcHVibGljIHJ1bnRpbWVTdGFnZUlkID0gJyc7XG4gIC8qKlxuICAgKiBEZWNsYXJlZCB0YWdzICg5LjIxLjApIGZvciB0aGUgc3RhZ2UgdGhpcyBjb250ZXh0IGlzIGV4ZWN1dGluZy4gU2V0IGJ5XG4gICAqIHRoZSB0cmF2ZXJzZXIgYmVzaWRlIGBydW50aW1lU3RhZ2VJZGAgKHBlci1ub2RlIGlkZW50aXR5IOKAlCBOT1QgaW5oZXJpdGVkXG4gICAqIGJ5IGBjcmVhdGVOZXh0YCAvIGBjcmVhdGVDaGlsZGApLCByZWNvcmRlZCBvbiB0aGUgZmlyc3QgYnVuZGxlXG4gICAqIGBjb21taXQoKWAgd3JpdGVzLCB0aGVuIHJlbGVhc2VkIHNvIGEgcm91dGluZSBzZWNvbmQgY29tbWl0IG9uIHRoZSBzYW1lXG4gICAqIGNvbnRleHQgKGEgZm9yayBjaGlsZCdzIGZhbi1vdXQgcmVwZWF0LCBhIG1vdW50J3MgZXhpdCBidW5kbGUpIGNhcnJpZXNcbiAgICogbm9uZSDigJQgdGhlIHNhbWUgb25jZS1wZXItZXhlY3V0aW9uIGxhdyBgX3VudHJhY2tlZFNvdXJjZXNgIGtlZXBzLlxuICAgKi9cbiAgcHVibGljIHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBydW4gdGhpcyBmcmFtZSBiZWxvbmdzIHRvIOKAlCBpdHMgaWRlbnRpdHkgb24gZXZlcnkgZXZlbnQsIGFuZCB0aGUgcnVuXG4gICAqIG5hbWVzcGFjZSBpdCByZWFkcyBhbmQgd3JpdGVzIGluICh7QGxpbmsgcnVuQWRkcmVzc30pLCByZWFkIG9uY2UsIHdoZW4gdGhlXG4gICAqIGZyYW1lIGlzIGJ1aWx0IChDMykuIE9ubHkge0BsaW5rIHVzZUFkZHJlc3NPZn0gbW92ZXMgdGhlIGFkZHJlc3MgYWZ0ZXJcbiAgICogdGhhdCwgYW5kIG9ubHkgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1biBuYW1lc3BhY2UgdGhpcyBmcmFtZSB3cml0ZXMgYW5kIHJlYWRzIGluIHdoZW4gdGhhdCBpcyBub3QgaXRzIG93blxuICAgKiBgcnVuSWRgIOKAlCBzZXQgb25jZSwgYmVmb3JlIHRoZSBmcmFtZSdzIGZpcnN0IHdyaXRlLCBieVxuICAgKiB7QGxpbmsgdXNlQWRkcmVzc09mfS4gSXRzIG9uZSB1c2VyIGlzIGEgc3ViZmxvdyBtb3VudCdzIG1lcmdlLWJhY2sgKFIxMyk6XG4gICAqIHRoZSByZWNvcmQgbmFtZXMgdGhlIG1vdW50LCB0aGUgdmFsdWVzIGxhbmQgd2hlcmUgdGhlIG1vdW50J3MgcGFyZW50XG4gICAqIHdyaXRlcy4gQWJzZW50IOKGkiBgcnVuSWRgLCBzbyBldmVyeSBvdGhlciBmcmFtZSBpcyB1bnRvdWNoZWQuXG4gICAqL1xuICBwcml2YXRlIGFkZHJlc3NSdW5JZD86IHN0cmluZztcbiAgcHVibGljIGJyYW5jaElkPzogc3RyaW5nO1xuICBwdWJsaWMgaXNEZWNpZGVyOiBib29sZWFuO1xuICBwdWJsaWMgaXNGb3JrOiBib29sZWFuO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZnJvbSBidWlsZGVyIChzZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBleGVjdXRpb24pLiAqL1xuICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIgKHNldCBieSB0cmF2ZXJzZXIgd2hlbiB0aGlzIGlzIGEgc3ViZmxvdyBlbnRyeSBwb2ludCkuICovXG4gIHB1YmxpYyBzdWJmbG93SWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHBhcmVudD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIG5leHQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBjaGlsZHJlbj86IFN0YWdlQ29udGV4dFtdO1xuXG4gIHB1YmxpYyBkZWJ1ZzogRGlhZ25vc3RpY0NvbGxlY3RvciA9IG5ldyBEaWFnbm9zdGljQ29sbGVjdG9yKCgpID0+IHRoaXMucG9saWN5LnJlZGFjdGlvbik7XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHdyaXRlcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldyBhbmQgb25Db21taXRcbiAgICogIOKAlCBpbiB0aGVpciBSRVRBSU5FRCBmb3JtIChjbG9uZWQgLyBzdW1tYXJpc2VkIC8gcmVkYWN0ZWQpLiBGaWxsZWQgZnJvbVxuICAgKiAge0BsaW5rIF9wZW5kaW5nV3JpdGVzfSBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9IGF0IGNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VXcml0ZXM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSB3cml0ZXMgb2YgdGhlIENVUlJFTlQgZXhlY3V0aW9uLCBoZWxkIGJ5IHJlZmVyZW5jZSB3aXRoIHRoZSB2ZXJkaWN0XG4gICAqIHRoZXkgd2VyZSBzdGFnZWQgdW5kZXIgKDkuMjMuMCkuIEEga2V5IHdyaXR0ZW4gayB0aW1lcyBob2xkcyBpdHMgTEFTVFxuICAgKiB2YWx1ZTsgdGhlIHJldGFpbmVkIGZvcm0gKHRoZSBgd3JpdGVUcmFja2luZ2AgY2xvbmUgb3Igc3VtbWFyeSwgdGhlXG4gICAqIHJlZGFjdGlvbiBwbGFjZWhvbGRlciBvciBmaWVsZCBzY3J1YikgaXMgdGFrZW4gT05DRSBwZXIga2V5IGF0IGNvbW1pdCDigJRcbiAgICogc2VlIHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30uIFNhbWUgbGF3IGFzIHRoZSB0cmFuc2FjdGlvbiBidWZmZXInc1xuICAgKiBwYXRjaCB0cmVlczogdGhlIGNvcHkgdGhlIHJlY29yZCBuZWVkcyBpcyBwYWlkIGF0IHRoZSBib3VuZGFyeSwgbm90IGF0XG4gICAqIGV2ZXJ5IHdyaXRlLiBMYXppbHkgYWxsb2NhdGVkOyBhIHN0YWdlIHRoYXQgbmV2ZXIgd3JpdGVzIHBheXMgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX3BlbmRpbmdXcml0ZXM/OiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHsgdmFsdWU6IHVua25vd247IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3Q7IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH1cbiAgPjtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgcmVhZHMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcuICovXG4gIHByaXZhdGUgX3N0YWdlUmVhZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBgX3N0YWdlUmVhZHNgIGtleXMgdGhhdCB3ZXJlIHJlYWQgYXQgYSBORVNURUQgcGF0aCAoYGdldFZhbHVlKHBhdGgsXG4gICAqIGtleSlgIHdpdGggYSBub24tZW1wdHkgYHBhdGhgKS4gT25seSB0aGUgZW5naW5lIHJlYWRzIHRoYXQgd2F5IOKAlCB0aGVcbiAgICogZmFjYWRlIHJlYWRzIHJvb3RzIOKAlCBzbyB0aGVzZSBhcmUgbm90IHVzZXIgcmVhZHMgYW5kIHRoZSBib3Jyb3dlZC1yZWFkXG4gICAqIGd1YXJkIHNraXBzIHRoZW0gYnkgdGhpcyBtYXJrZXIsIG5ldmVyIGJ5IGd1ZXNzaW5nIGZyb20gYSBkb3QgaW4gdGhlIGtleVxuICAgKiAoYSB1c2VyJ3MgdG9wLWxldmVsIGtleSBtYXkgaXRzZWxmIGNvbnRhaW4gb25lKS4gTGF6aWx5IGNyZWF0ZWQ7IHRoZVxuICAgKiBmYWNhZGUgcGF0aCBuZXZlciBhbGxvY2F0ZXMgaXQuXG4gICAqL1xuICBwcml2YXRlIF9uZXN0ZWRSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBEZXYgbW9kZSBvbmx5OiB0aGUgcm9vdCBrZXlzIHdob3NlIExBU1QgdHJhY2tlZCByZWFkIHdhcyBzZXJ2ZWQgZnJvbVxuICAgKiBjb21taXR0ZWQgc3RhdGUg4oCUIGJlZm9yZSB0aGlzIHN0YWdlJ3MgZmlyc3Qgd3JpdGUsIHdoZW4gbm8gdHJhbnNhY3Rpb25cbiAgICogYnVmZmVyIGV4aXN0cyB5ZXQuIFN1Y2ggYSByZWFkIGlzIHRoZSBjb21taXR0ZWQgb2JqZWN0IGl0c2VsZiwgc28gYW5cbiAgICogaW4tcGxhY2UgZWRpdCBvZiBpdCBtb3ZlcyB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIHRvbyAoY29weS1vbi13cml0ZSxcbiAgICogOS4yOS4wKTsge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259IGNoZWNrcyB0aGVzZSBrZXlzIGV2ZW4gd2hlbiB0aGVcbiAgICogc3RhZ2Ugd3JvdGUgdGhlbS4gTmV2ZXIgYWxsb2NhdGVkIG91dHNpZGUgYGVuYWJsZURldk1vZGUoKWAuXG4gICAqL1xuICBwcml2YXRlIF92aWV3UmVhZHM/OiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogSGFzIHRoaXMgZnJhbWUgY29tbWl0dGVkIGF0IGxlYXN0IG9uY2U/IFRoZSBib3Jyb3dlZC1yZWFkIGd1YXJkIHJ1bnMgb25cbiAgICogdGhlIEZJUlNUIGNvbW1pdCBvbmx5IOKAlCBzZWUge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259LiBUaGUgZnJhbWVcbiAgICogaXRzZWxmIHN0YXlzIHJlLXVzYWJsZSBhZnRlciBjb21taXQgKCMxM2IpOiB0aGUgZW5naW5lJ3MgZG91YmxlLWNvbW1pdFxuICAgKiBwYXRocyBhbmQgdGhlIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgYnJhbmNoIHBhcmVudCByZWx5IG9uIGl0LiBUaGVcbiAgICogdXNlci1sZXZlbCByZWZ1c2FsIG9mIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgbGl2ZXMgYXQgdGhlIHNjb3BlXG4gICAqIHRpZXIgKGBTY29wZUZhY2FkZWAsIG9uZSBwZXIgc3RhZ2UgZXhlY3V0aW9uKSwgbm90IGhlcmUuXG4gICAqL1xuICBwcml2YXRlIF9jb21taXR0ZWQgPSBmYWxzZTtcblxuICAvKiogVHJhY2tlZCByZWFkcyBvZiBhIHNlbGVjdGVkIHZhbHVlICh7QGxpbmsgc2VsZWN0ZWRSZWFkc30pLiAqL1xuICBwcml2YXRlIF9zZWxlY3RlZFJlYWRzID0gMDtcbiAgLyoqIEVhY2ggb2JqZWN0IHRoaXMgZnJhbWUgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUg4oaSIHRoYXQgcmVhZCdzIHZlcmRpY3QgKGBzdGFnZVdyaXRlYCBoYW5kcyBpdCBvbikuICovXG4gIHByaXZhdGUgX3NlbGVjdGVkT2JqZWN0cz86IFdlYWtNYXA8b2JqZWN0LCBSZWRhY3Rpb25WZXJkaWN0PjtcblxuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlcnMg4oCUIHVudHJhY2tlZCByZWFkIHBhdGhzIHVzZWQgZHVyaW5nIFRISVNcbiAgICogc3RhZ2UncyBleGVjdXRpb24gKGAnYXJncydgIC8gYCdlbnYnYCAvIGAnc2lsZW50J2ApLiBNYXJrZWQgYnlcbiAgICogYFNjb3BlRmFjYWRlYCwgc3VyZmFjZWQgb24gdGhlIHN0YWdlJ3MgQ29tbWl0QnVuZGxlIGFzXG4gICAqIGB1bnRyYWNrZWRTb3VyY2VzYCwgdGhlbiBSRUxFQVNFRCB3aXRoIHRoZSBzdGFnaW5nIHN0YXRlIGF0IGNvbW1pdCBlbmRcbiAgICogKHNvIHRoZSByb3V0aW5lIGRvdWJsZS1jb21taXQgcGF0aHMg4oCUIGZvcmsgY2hpbGRyZW4sIHN1YmZsb3cgbW91bnRzIOKAlFxuICAgKiByZWNvcmQgdGhlIGZpZWxkIGV4YWN0bHkgb25jZSwgb24gdGhlIGZpcnN0IGNvbW1pdCkuIExhemlseSBhbGxvY2F0ZWQ6XG4gICAqIHN0YWdlcyB0aGF0IG5ldmVyIHRvdWNoIGFuIHVudHJhY2tlZCBwYXRoIHBheSBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfdW50cmFja2VkU291cmNlcz86IFNldDxVbnRyYWNrZWRTb3VyY2U+O1xuXG4gIC8qKlxuICAgKiBUaGUgYXR0ZW1wdHMgb2YgdGhpcyBmcmFtZSdzIGV4ZWN1dGlvbiAoMTAuMSkg4oCUIGl0cyBvd24gdW5kZXIgdGhlIGF0dGVtcHQgcnVubmVyLCBhcHBlbmRlZCBhcyBlYWNoIGF0dGVtcHQgZW5kc1xuICAgKiAoYEZsb3djaGFydFRyYXZlcnNlciDCtyBleGVjdXRlU3RhZ2VgKSwgYW5kIHRob3NlIG9mIHRoZSBjYWxscyBpdCBtYWRlIChQMiwge0BsaW5rIHJlcG9ydENhbGxBdHRlbXB0fSkg4oCUIHJlYWRcbiAgICogYnkge0BsaW5rIHNuYXBzaG90U2VsZn0uIEFwcGVuZC1vbmx5XG4gICAqIGV2aWRlbmNlIGxpa2UgYGRlYnVnYDogTk9UIGNsZWFyZWQgYnkge0BsaW5rIGRpc2NhcmRTdGFnZWR9ICh0aGUgZWFybGllciBhdHRlbXB0cyBhcmUgdGhlIHBvaW50KSBhbmQgbmV2ZXJcbiAgICogcGFydCBvZiBhIGNvbW1pdCBidW5kbGUuIExhemlseSBhbGxvY2F0ZWQ6IGEgc3RhZ2Ugd2l0aG91dCBhIHBvbGljeSBwYXlzIG5vdGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF9hdHRlbXB0cz86IEF0dGVtcHRSZWNvcmRbXTtcbiAgLyoqIFRoZSBhdHRlbXB0IHNlcmllcyBhdCBhIGdsYW5jZSwgc3RhbXBlZCBvbmNlIHdoZW4gaXQgZW5kcy4gKi9cbiAgcHJpdmF0ZSBfYXR0ZW1wdFN1bW1hcnk/OiBBdHRlbXB0U3VtbWFyeTtcbiAgLyoqIEZhY3RzIGNvbGxlY3RlZCBmb3IgdGhpcyBleGVjdXRpb24gb25seTsgcmV0cnkgZGlzY2FyZHMgZGVsaWJlcmF0ZWx5IGtlZXAgdGhlbS4gKi9cbiAgcHJpdmF0ZSBfYXR0ZW50aW9uPzogU3RhZ2VBdHRlbnRpb247XG4gIC8qKlxuICAgKiBUaGUgYXR0ZW1wdCBub3cgcnVubmluZyAoUDFiKSDigJQgc2V0IGJ5IGBTdGFnZVJ1bm5lcmAgYmVmb3JlIHRoZSBzY29wZSBpcyBidWlsdCwgc28gdGhlIGZhY2FkZSBjYW4gaGFuZCBpdCBvdXRcbiAgICogKGBzY29wZS4kYXR0ZW1wdCgpYCkgYW5kIGZlbmNlIGl0cyBvd24gYXR0ZW1wdC4gQWJzZW50IGZvciBhIHN0YWdlIHRoZSBhdHRlbXB0IHJ1bm5lciBkb2VzIG5vdCBydW4uXG4gICAqL1xuICBwcml2YXRlIF9hdHRlbXB0PzogQXR0ZW1wdENvbnRleHQ7XG4gIC8qKiBUaGUgcnVuJ3Mgc2lnbmFsLCBmb3IgdGhlIGF0dGVtcHQgYSBzdGFnZSBvdXRzaWRlIHRoZSBydW5uZXIgcmVwb3J0cyAoYXR0ZW1wdCAxIG9mIDEpLiAqL1xuICBwcml2YXRlIF9ydW5TaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIEV2ZXJ5IGF0dGVtcHQgdXAgdG8gdGhpcyBudW1iZXIgaGFzIEVOREVEIHdpdGhvdXQgYW4gYW5zd2VyIOKAlCBpdHMgc2NvcGUgaXMgZmVuY2VkICgwID0gbm9uZSkuICovXG4gIHByaXZhdGUgX2VuZGVkVGhyb3VnaCA9IDA7XG4gIC8qKiBXcml0ZXMgYW4gYXR0ZW1wdCB0cmllZCBhZnRlciBpdCBlbmRlZCDigJQgZHJvcHBlZCBhdCB0aGUgc2NvcGUsIGtlcHQgaGVyZSBhcyBuYW1lcy4gTGF6aWx5IGFsbG9jYXRlZC4gKi9cbiAgcHJpdmF0ZSBfbGF0ZVdyaXRlcz86IExhdGVXcml0ZVtdO1xuICAvKipcbiAgICogV2hlcmUgYSBjYWxsJ3MgYXR0ZW1wdCByZWNvcmRzIGFyZSByZXBvcnRlZCAoUDIpIOKAlCB0aGUgZW5naW5lJ3MgYG9uQXR0ZW1wdGAgZm9yIHRoaXMgc3RhZ2UgZXhlY3V0aW9uLCBzZXQgYnlcbiAgICogYEZsb3djaGFydFRyYXZlcnNlciDCtyBleGVjdXRlU3RhZ2VgIHdpdGggdGhlIHN0YWdlJ3Mgb3duIHRyYXZlcnNhbCBjb250ZXh0IChhbmQgaXRzIGNvcnJlbGF0aW9uKS5cbiAgICovXG4gIHByaXZhdGUgX2F0dGVtcHRSZXBvcnRlcj86IChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQsIHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcblxuICAvKiogQ2FsbHMgbWFkZSBzbyBmYXIsIHBlciBzdGFnZSBhdHRlbXB0IOKAlCB0aGUgYGtgIG9mIGEgY2FsbCdzIHNlcmllcy4gTGF6aWx5IGFsbG9jYXRlZC4gKi9cbiAgcHJpdmF0ZSBfY2FsbE9yZGluYWxzPzogTWFwPG51bWJlciwgbnVtYmVyPjtcbiAgLyoqIFBlciBzdGFnZSBhdHRlbXB0LCB0aGUgc2lnbmFsIGl0cyBjYWxscyBzdG9wIGJ5IChgY2FsbHNFbmRlZFNpZ25hbGApLiBMYXppbHkgYWxsb2NhdGVkLiAqL1xuICBwcml2YXRlIF9jYWxsc0VuZGVkPzogTWFwPG51bWJlciwgQWJvcnRDb250cm9sbGVyPjtcbiAgLyoqIENhbGwgYW5kIG9ic2VydmVkIHJlY29yZHMga2VwdCBvbiB0aGUgZnJhbWUsIGFuZCB0aG9zZSBwYXN0IHtAbGluayBNQVhfQ0FMTF9SRUNPUkRTfS4gKi9cbiAgcHJpdmF0ZSBfY2FsbFJlY29yZHMgPSAwO1xuICBwcml2YXRlIF9hdHRlbXB0c0Ryb3BwZWQgPSAwO1xuXG4gIC8qKiBPYnNlcnZlciBjYWxsZWQgYWZ0ZXIgY29tbWl0KCkg4oCUIHVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZmlyZSBTY29wZVJlY29yZGVyLm9uQ29tbWl0LiAqL1xuICBwcml2YXRlIF9jb21taXRPYnNlcnZlcj86IChcbiAgICBtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+LFxuICApID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICAgIHNoYXJlZE1lbW9yeTogU2hhcmVkTWVtb3J5LFxuICAgIGJyYW5jaElkPzogc3RyaW5nLFxuICAgIGV2ZW50TG9nPzogRXZlbnRMb2csXG4gICAgaXNEZWNpZGVyPzogYm9vbGVhbixcbiAgKSB7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICAgIHRoaXMuc3RhZ2VOYW1lID0gbmFtZTtcbiAgICB0aGlzLnN0YWdlSWQgPSBzdGFnZUlkO1xuICAgIHRoaXMucmVjb3JkID0gbmV3IFJlY29yZEZyYW1lKHNoYXJlZE1lbW9yeSwgZXZlbnRMb2csIHJ1bkFkZHJlc3MocnVuSWQpKTtcbiAgICB0aGlzLnJlY29yZC51c2VFbmNvZGluZyh0aGlzLnBvbGljeSk7XG4gICAgdGhpcy5icmFuY2hJZCA9IGJyYW5jaElkO1xuICAgIHRoaXMuaXNEZWNpZGVyID0gISFpc0RlY2lkZXI7XG4gICAgdGhpcy5pc0ZvcmsgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBTaGFyZWRNZW1vcnkgaW5zdGFuY2UgKG5lZWRlZCBieSBzY29wZSBsYXllcikuICovXG4gIGdldFNoYXJlZE1lbW9yeSgpOiBTaGFyZWRNZW1vcnkge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5zdGF0ZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgU3RhbXBlZCBiZXNpZGUgcnVudGltZVN0YWdlSWQsIGJlZm9yZSBzY29wZSBjb25zdHJ1Y3Rpb24uICovXG4gIGJpbmRFbWl0T3JpZ2luKHJ1bklkOiBzdHJpbmcsIGRyaWxsUGF0aDogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXRSdW5JZCA9IGRyaWxsUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcnVuSWQ7XG4gICAgaWYgKGRyaWxsUGF0aCAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5sb2c/LmJpbmRBZGRyZXNzKHJ1bklkLCBkcmlsbFBhdGgpO1xuICB9XG5cbiAgLyoqIENhcHR1cmUgZnJvbSB0aGlzIGZyYW1lJ3MgT1dOIGxvZy4gQSBtYW51YWwvdW5hZGRyZXNzYWJsZSBmcmFtZSBzdGF5cyB1bmtub3duLiAqL1xuICBjYXB0dXJlRW1pdFBvc2l0aW9uKCk6IEVtaXRTb3VyY2VQb3NpdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdFJ1bklkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLnJlY29yZC5sb2c/LmNhcHR1cmVQb3NpdGlvbih0aGlzLmVtaXRSdW5JZCk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvci4gU3Vic2VxdWVudCBgY29tbWl0KClgIGNhbGxzIGFwcGx5XG4gICAqIHRoZSBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMg4oCUIHRoZSBvbmVzIHRoZSBsb2cgcmVjb3JkcyDigJQgdG9cbiAgICogdGhpcyBtaXJyb3IsIGJlc2lkZSB0aGUgcmF3IHBhdGNoZXMgb24gdGhlIGhlYXAgKGByZWNvcmRDb21taXRgKS5cbiAgICogQ2hpbGQgLyBuZXh0IGNvbnRleHRzIGluaGVyaXQgdGhlIG1pcnJvciB2aWEgYGNyZWF0ZU5leHRgIC8gYGNyZWF0ZUNoaWxkYC5cbiAgICpcbiAgICogQ2FsbGVkIG9uIGEgcnVudGltZSdzIHJvb3QgZnJhbWUgYnkgYEV4ZWN1dGlvblJ1bnRpbWVgIHdoZW4gdGhlIHJ1bidzIHBvbGljeSBrZWVwcyBhIG1pcnJvci5cbiAgICovXG4gIHVzZVJlZGFjdGVkTWlycm9yKG1pcnJvcjogU2hhcmVkTWVtb3J5KTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmQudXNlTWlycm9yKG1pcnJvcik7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgcmVkYWN0ZWQgbWlycm9yIGlmIGluc3RhbGxlZCwgZWxzZSB1bmRlZmluZWQuICovXG4gIGdldFJlZGFjdGVkU2hhcmVkTWVtb3J5KCk6IFNoYXJlZE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLm1pcnJvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyBwb2xpY3kgKGBydW5Qb2xpY3kudHNgKSBvbiB0aGlzIGZyYW1lIOKAlCBjYWxsZWQgb24gYVxuICAgKiBydW50aW1lJ3Mgcm9vdCBieSBgRXhlY3V0aW9uUnVudGltZWAgKGF0IGNvbnN0cnVjdGlvbiwgYW5kIGJ5XG4gICAqIGBFeGVjdXRpb25SdW50aW1lLnVzZVBvbGljeWAgb24gYSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSkuIERlc2NlbmRhbnRzIGdldFxuICAgKiB0aGUgc2FtZSByZWZlcmVuY2UgdGhyb3VnaCB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfTsgYVxuICAgKiBzdWJmbG93J3MgcnVudGltZSBpcyBjb25zdHJ1Y3RlZCB3aXRoIGl0LCBzbyBpdHMgc2VlZCBmcmFtZSBhbmQgZXZlcnlcbiAgICogZnJhbWUgYWZ0ZXIgY29tbWl0IHVuZGVyIHRoZSBydW4ncyBkaWFscyB0b28uXG4gICAqL1xuICB1c2VQb2xpY3kocG9saWN5OiBSdW5Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLmFkb3B0UG9saWN5KHBvbGljeSk7XG4gIH1cblxuICAvKiogVGhlIHJ1bidzIHBvbGljeSB0aGlzIGZyYW1lIHJldGFpbnMsIGVuY29kZXMgYW5kIHNjcnVicyB1bmRlci4gKi9cbiAgZ2V0UG9saWN5KCk6IFJ1blBvbGljeSB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYSByZWRhY3Rpb24gcnVsZSDigJQgdGhlIE9ORSBvd25lciBvZiBcIndoYXQgZG9lcyB0aGUgcG9saWN5IHNheVxuICAgKiBhYm91dCB0aGlzIHBhdGhcIiAoYG1lbW9yeS9yZWRhY3Rpb24udHNgKSDigJQgYXMgYSBORVcgcG9saWN5IGZvciB0aGlzIGZyYW1lXG4gICAqICh0aGUgc2hhcmVkIG9uZSBpcyBuZXZlciBlZGl0ZWQpLiBVbmRlciBhbiBleGVjdXRvciB0aGUgcnVsZSBhcnJpdmVzXG4gICAqIHdpdGggdGhlIHJ1bidzIHBvbGljeTsgdGhpcyBkb29yIGlzIGZvciBhIGBTY29wZUZhY2FkZWAgb24gYSBiYXJlIGZyYW1lXG4gICAqICh1bml0IHRlc3RzLCBoYW5kLWJ1aWx0IHNjb3BlcyksIHdoaWNoIGJyaW5ncyBpdHMgb3duIHJ1bGUuIEV2ZXJ5IHN0YWdlZFxuICAgKiB3cml0ZSBhbmQgZXZlcnkgdHJhY2tlZCByZWFkIGFza3MgaXQsIHNvIGEgd3JpdGUgdGhhdCBuZXZlciBwYXNzZXMgYVxuICAgKiBmYWNhZGUg4oCUIGEgc3ViZmxvdyBzZWVkLCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCBhIHJlc3VtZSByZS1zZWVkIOKAlFxuICAgKiBpcyByZXRhaW5lZCB1bmRlciB0aGUgc2FtZSB2ZXJkaWN0IGFzIGEgZmFjYWRlIHdyaXRlLiBBYnNlbnQ6IGV2ZXJ5XG4gICAqIHZlcmRpY3QgaXMgYCdjbGVhcidgIHVubGVzcyB0aGUgY2FsbGVyIHBhc3NlZCBhbiBleHBsaWNpdCBmbGFnLlxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUnVsZShydWxlOiBSZWRhY3Rpb25SdWxlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9saWN5LnJlZGFjdGlvbiAhPT0gcnVsZSkgdGhpcy5hZG9wdFBvbGljeSh3aXRoUmVkYWN0aW9uKHRoaXMucG9saWN5LCBydWxlKSk7XG4gIH1cblxuICAvKiogVGhlIGluc3RhbGxlZCByZWRhY3Rpb24gcnVsZSwgaWYgYW55ICh0aGUgZmFjYWRlJ3MgbG9va3VwKS4gKi9cbiAgZ2V0UmVkYWN0aW9uUnVsZSgpOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wb2xpY3kucmVkYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgdGhlIHJ1biBmcm9tIGBmcm9tYDogdGhlIHBvbGljeSAoYnkgcmVmZXJlbmNlKSBhbmQgdGhlIHJ1bidzIG1pcnJvclxuICAgKiBzdG9yZS4gVGhlIE9ORSBpbmhlcml0YW5jZSBzdGVwIOKAlCB7QGxpbmsgY3JlYXRlTmV4dH0gYW5kXG4gICAqIHtAbGluayBjcmVhdGVDaGlsZH0gYm90aCBjYWxsIGl0LCBhbmQgaXQgbmFtZXMgbm8gZGlhbC5cbiAgICovXG4gIHByaXZhdGUgaW5oZXJpdFJ1bihmcm9tOiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRTb3VyY2VzID0gZnJvbS5yZWFkU291cmNlcztcbiAgICB0aGlzLmFkb3B0UG9saWN5KGZyb20ucG9saWN5KTtcbiAgICB0aGlzLmNhcHR1cmUgPSBmcm9tLmNhcHR1cmU7XG4gICAgdGhpcy5yZWNvcmQudXNlTWlycm9yKGZyb20ucmVjb3JkLm1pcnJvcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIE9ORSBwbGFjZSB0aGlzIGZyYW1lJ3MgcG9saWN5IGNoYW5nZXM6IHRoZSBmcmFtZSBob2xkcyBpdCwgYW5kIGl0c1xuICAgKiByZWNvcmQgZnJhbWUgZW5jb2RlcyB1bmRlciB0aGUgc2FtZSByZWZlcmVuY2UgKGBjb21taXRWYWx1ZXNgLFxuICAgKiBgd3JpdGVQcm92ZW5hbmNlYCDigJQgYFJlY29yZEZyYW1lIMK3IHVzZUVuY29kaW5nYCksIHNvIHRoZSB0d28gbmV2ZXIgZGlmZmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhZG9wdFBvbGljeShwb2xpY3k6IFJ1blBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMucmVjb3JkLnVzZUVuY29kaW5nKHBvbGljeSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgdHJhY2tlZCB1c2VyLWxldmVsIHdyaXRlLCBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSkg4oCUIHRoZSBzaW5nbGVcbiAgICogYm9va2tlZXBpbmcgcGF0aCBmb3Ige0BsaW5rIHNldE9iamVjdH0gYW5kIHtAbGluayB1cGRhdGVPYmplY3R9LiBIb2xkc1xuICAgKiB0aGUgUkVGRVJFTkNFIGFuZCB0aGUgdmVyZGljdCAoOS4yMy4wKTsgdGhlIHJldGFpbmVkIGZvcm0gaXMgdGFrZW4gYXRcbiAgICogY29tbWl0IGJ5IHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30sIG9uY2UgcGVyIGtleS5cbiAgICpcbiAgICogUmVkYWN0aW9uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZGlhbCBpbiBFVkVSWSBtb2RlOiBhIHJlZGFjdGVkXG4gICAqIHdyaXRlIHN0b3JlcyB0aGUgYCdbUkVEQUNURURdJ2AgcGxhY2Vob2xkZXIgdW5kZXIgYCdmdWxsJ2AgQU5EXG4gICAqIGAnc3VtbWFyeSdgIChhIHN1bW1hcnkgbWFya2VyIHdvdWxkIGxlYWsgdGhlIHZhbHVlJ3MgcHJldmlldy9zaXplKSxcbiAgICogYW5kIHN0b3JlcyBub3RoaW5nIHVuZGVyIGAnb2ZmJ2AgKGVudHJ5IHNraXBwZWQgZW50aXJlbHkg4oCUIG5vdGhpbmcgdG9cbiAgICogbGVhaykuIEEgZmllbGQtbGV2ZWwgdmVyZGljdCBzY3J1YnMgYSBjbG9uZSBCRUZPUkUgdGhlIGRpYWwgc2VlcyBpdCwgc29cbiAgICogYSBzdW1tYXJ5IHByZXZpZXcgY2FuIG5ldmVyIHNob3cgdGhlIHNlY3JldCBlaXRoZXIuIFRoZSB2ZXJkaWN0IGlzIHRoZVxuICAgKiBvbmUgYHN0YWdlV3JpdGVgIGRlY2lkZWQgQkVGT1JFIHN0YWdpbmcsIGNhcnJpZWQgdG8gY29tbWl0IHdpdGggdGhlXG4gICAqIHZhbHVlLiBUaGUgc3RhZ2VkIHdyaXRlIGl0c2VsZiBpcyB1bmFmZmVjdGVkIOKAlCByZWRhY3Rpb24gb2YgdGhlXG4gICAqIGNvbW1pdHRlZCBwYXlsb2FkIGlzIHRoZSByZWNvcmQgZnJhbWUncyBzY3J1YiBvZiB0aGF0IHdyaXRlXG4gICAqIChgUmVjb3JkRnJhbWUgwrcgd3JpdGVgLCB0aGVuIGBzY3J1Yi50c2AgYXQgY29tbWl0KS5cbiAgICovXG4gIHByaXZhdGUgdHJhY2tXcml0ZShcbiAgICB1c2VyS2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgICBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyxcbiAgKSB7XG4gICAgaWYgKHRoaXMucG9saWN5LndyaXRlVHJhY2tpbmcgPT09ICdvZmYnKSByZXR1cm47XG4gICAgKHRoaXMuX3BlbmRpbmdXcml0ZXMgPz89IG5ldyBNYXAoKSkuc2V0KHVzZXJLZXksIHsgdmFsdWUsIHZlcmRpY3QsIG9wZXJhdGlvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgX3N0YWdlV3JpdGVzYCB3aXRoIGV2ZXJ5IHBlbmRpbmcgd3JpdGUgZm9sZGVkIGluIGFzIGl0cyByZXRhaW5lZCBmb3JtXG4gICAqIOKAlCB0aGUgcmVjb3JkIGEgcmVhZGVyIHNlZXMuIENvbnN1bWVzIG5vdGhpbmc6IGEgbWlkLXJ1biBzbmFwc2hvdCByZWFkc1xuICAgKiB0aGUgd3JpdGVzIHNvIGZhciwgYW5kIGNvbW1pdCBzdGlsbCBtYXRlcmlhbGlzZXMgdGhlIGZpbmFsIHZhbHVlcy5cbiAgICogUmV0dXJucyBgX3N0YWdlV3JpdGVzYCBpdHNlbGYgd2hlbiBub3RoaW5nIGlzIHBlbmRpbmcuXG4gICAqL1xuICBwcml2YXRlIHJldGFpbmVkV3JpdGVzKCk6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+IHtcbiAgICBpZiAoIXRoaXMuX3BlbmRpbmdXcml0ZXMpIHJldHVybiB0aGlzLl9zdGFnZVdyaXRlcztcbiAgICBjb25zdCBvdXQgPSB7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB3XSBvZiB0aGlzLl9wZW5kaW5nV3JpdGVzKSB7XG4gICAgICBvdXRba2V5XSA9IHtcbiAgICAgICAgdmFsdWU6IHRoaXMucmV0YWluZWRGb3JtKHcudmVyZGljdCwgdy52YWx1ZSwgdGhpcy5wb2xpY3kud3JpdGVUcmFja2luZywgc3VtbWFyaXplV3JpdGVWYWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogdy5vcGVyYXRpb24sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgdGhlIHJldGFpbmVkIGZvcm0gb2YgZXZlcnkgcGVuZGluZyB3cml0ZSDigJQgT05DRSBwZXIga2V5LCBmcm9tIHRoZVxuICAgKiB2YWx1ZSBhcyBpdCBzdGFuZHMgYXQgY29tbWl0ICg5LjIzLjApIOKAlCBhbmQgcmVsZWFzZSB0aGUgcmVmZXJlbmNlcy4gVGhlXG4gICAqIGZpcnN0IHRoaW5nIGBjb21taXQoKWAgZG9lcywgc28gdGhlIGJvcnJvd2VkLW11dGF0aW9uIGd1YXJkIGFuZCB0aGVcbiAgICogY29tbWl0IG9ic2VydmVyIHNlZSB0aGUgZmluaXNoZWQgcmVjb3JkLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXRlcmlhbGlzZVdyaXRlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3BlbmRpbmdXcml0ZXMpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fc3RhZ2VXcml0ZXMgPSB0aGlzLnJldGFpbmVkV3JpdGVzKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlbGVhc2VkIGV2ZW4gd2hlbiBhIHJldGFpbmVkIGZvcm0gY2Fubm90IGJlIHRha2VuIOKAlCBhbiB1bmNsb25lYWJsZVxuICAgICAgLy8gdmFsdWUgKGEgZnVuY3Rpb24sIGEgUHJveHkpIGlzIGEgY29udHJhY3QgdmlvbGF0aW9uIChcInN0YXRlIHZhbHVlc1xuICAgICAgLy8gbXVzdCBzdXJ2aXZlIHN0cnVjdHVyZWRDbG9uZVwiKSB0aGF0IG5vdyBzdXJmYWNlcyBIRVJFLCBhdCBjb21taXQsXG4gICAgICAvLyBhbmQgZmFpbHMgdGhlIHJ1biBsb3VkbHk7IGEgbGF0ZXIgc25hcHNob3Qgb2YgdGhlIGZhaWxlZCBydW4gbXVzdFxuICAgICAgLy8gbm90IHRocm93IHRoZSBzYW1lIGVycm9yIGFnYWluLlxuICAgICAgdGhpcy5fcGVuZGluZ1dyaXRlcyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZvcm0gb2YgYSB2YWx1ZSB0aGUgZW5naW5lIFJFVEFJTlMgKHJlYWRzIGFuZCB3cml0ZXMgcmV0ZW50aW9uKTpcbiAgICogdGhlIHBsYWNlaG9sZGVyIGJlYXRzIGV2ZXJ5IGRpYWw7IGEgZmllbGQtbGV2ZWwgc2NydWIgaGFwcGVucyBiZWZvcmUgdGhlXG4gICAqIGRpYWwgc2VlcyB0aGUgdmFsdWU7IGEgY2xlYXIgdmFsdWUgaXMgc3VtbWFyaXplZCBvciBjbG9uZWQgYXMgdGhlIGRpYWxcbiAgICogc2F5cy4gQ2FsbGVycyBoYW5kbGUgYHVuZGVmaW5lZGAgYmVmb3JlIGFza2luZy5cbiAgICovXG4gIHByaXZhdGUgcmV0YWluZWRGb3JtKFxuICAgIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgbW9kZTogUmVhZFRyYWNraW5nTW9kZSB8IFdyaXRlVHJhY2tpbmdNb2RlLFxuICAgIHN1bW1hcml6ZTogKHZhbHVlOiB1bmtub3duKSA9PiB1bmtub3duLFxuICApOiB1bmtub3duIHtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gU0NPUEVfUExBQ0VIT0xERVI7XG4gICAgY29uc3Qgc2NydWJiZWQgPSB2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnID8gUmVkYWN0aW9uUnVsZS5zY3J1YkZpZWxkcyh2YWx1ZSwgdmVyZGljdC5wYXRocykgOiB1bmRlZmluZWQ7XG4gICAgaWYgKG1vZGUgPT09ICdzdW1tYXJ5JykgcmV0dXJuIHN1bW1hcml6ZShzY3J1YmJlZCA/PyB2YWx1ZSk7XG4gICAgcmV0dXJuIHNjcnViYmVkID8/IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJ1bGUgd2l0aCBzb21ldGhpbmcgdG8gc2F5IOKAlCBgdW5kZWZpbmVkYCBvbiB0aGUgbm8tcG9saWN5IHBhdGggKG5vXG4gICAqIHJ1bGUgaW5zdGFsbGVkLCBvciBhIHJ1bGUgd2l0aCBubyBwb2xpY3kgZW50cmllcyBhbmQgbm8gbWFya2VkIGtleXMpLCBzb1xuICAgKiBhIHRyYWNrZWQgcmVhZCBvciBhIHN0YWdlZCB3cml0ZSB0aGVyZSBwYXlzIG5vIHZlcmRpY3QgY2FsbCBhbmQgbm8gcGF0aFxuICAgKiBhbGxvY2F0aW9uLiBUaGUgZGVmYXVsdCBydW4gaXMgYnl0ZS1pZGVudGljYWwgQU5EIGNvc3QtaWRlbnRpY2FsLlxuICAgKi9cbiAgcHJpdmF0ZSBhY3RpdmVSdWxlKCk6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLnBvbGljeS5yZWRhY3Rpb247XG4gICAgcmV0dXJuIHJ1bGUgIT09IHVuZGVmaW5lZCAmJiAhcnVsZS5pc0luZXJ0KCkgPyBydWxlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRIRSBPTkUgRlVOTkVMIGV2ZXJ5IHN0YWdlZCB3cml0ZSBwYXNzZXMgdGhyb3VnaCDigJQgZmFjYWRlIHdyaXRlcyBBTkRcbiAgICogdGhlIHBhdGhzIHRoYXQgYnlwYXNzIHRoZSBmYWNhZGUgKHN1YmZsb3cgc2VlZCwgYG91dHB1dE1hcHBlcmBcbiAgICogbWVyZ2UtYmFjaywgcmVzdW1lIHJlLXNlZWQpLiBUd28gb3duZXJzIChDNCk6IHRoZSBydW4ncyBydWxlIERFQ0lERVMsXG4gICAqIHRoZSByZWNvcmQgZnJhbWUgV1JJVEVTIHRoZSB2ZXJkaWN0J3MgYnl0ZXMsIGluIGZvdXIgc3RlcHNcbiAgICogKGByZWRhY3Rpb24udHNgLCBcIlRoZSB3cml0ZSBkZWNpc2lvblwiKTpcbiAgICogICAxLiB0aGUgdmVyZGljdCDigJQgYGRlY2lkZVdyaXRlYCwgdW5kZXIgdGhlIHJ1bGUgYWN0aXZlIGFzIHRoZSB3cml0ZSBiZWdpbnM7XG4gICAqICAgMi4gaWRlbnRpdHkgaW5oZXJpdGFuY2Ug4oCUIGBpbmhlcml0QnlJZGVudGl0eWAsIGFnYWluc3QgdGhpcyBmcmFtZSdzXG4gICAqICAgICAgc2VsZWN0ZWQgcmVhZHMgYXMgdGhleSBzdGFuZCBhZnRlciBzdGVwIDE7XG4gICAqICAgMy4gdGhlIGJ5dGVzIOKAlCBgUmVjb3JkRnJhbWUgwrcgd3JpdGVgLCB0aGUgb3AgYW5kIGl0cyBzY3J1YiAodGhlIHdob2xlXG4gICAqICAgICAgdmFsdWUsIG9yIHRoZSBmaWVsZHMgaW5zaWRlIGl0KTtcbiAgICogICA0LiB0aGUgbWFya3Mg4oCUIGBtYXJrU3RhZ2VkV3JpdGVgLCBvbmx5IG9uY2UgdGhlIHdyaXRlIHN0YWdlZCwgc28gYVxuICAgKiAgICAgIHdyaXRlIHRoYXQgZmFpbHMgdG8gc3RhZ2UgbWFya3Mgbm90aGluZy5cbiAgICogRWFjaCBzdGVwIHJlYWRzIHRoZSBydWxlIChhbmQgdGhlIHNlbGVjdGVkIHJlYWRzKSB3aGVuIGl0IGFjdHMsIGFzIHRoaXNcbiAgICogZnVubmVsIGFsd2F5cyBkaWQuIFJldHVybnMgdGhlIHZlcmRpY3Qgc28gdGhlIGNhbGxlciByZXRhaW5zIGFuZCByZXBvcnRzXG4gICAqIHVuZGVyIHRoZSBzYW1lIGRlY2lzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZVdyaXRlKFxuICAgIG5zUGF0aDogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZXhwbGljaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgdmVyYjogV3JpdGVWZXJiLFxuICApOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICBpZiAoYWN0aXZlID09PSB1bmRlZmluZWQgJiYgIWV4cGxpY2l0KSB7XG4gICAgICAvLyBUaGUgbm8tcG9saWN5IGZhc3QgcGF0aCwgdGhlIHNhbWUgZm91ciBzdGVwcyB3aXRoIG5vdGhpbmcgdG8gZG86IG5vIHJ1bGUgd2l0aCBhbnl0aGluZyB0byBzYXlcbiAgICAgIC8vIGFuZCBubyBmbGFnIGlzIGNsZWFyIChzdGVwIDEpLCBub3RoaW5nIHRvIGluaGVyaXQgd2l0aG91dCBhIHJ1bGUgKHN0ZXAgMiksIG5vIHNjcnViIChzdGVwIDMpLFxuICAgICAgLy8gYW5kIG5vdGhpbmcgdG8gbWFyayDigJQgYSBjbGVhciB2ZXJkaWN0IG1hcmtzIG5vdGhpbmcsIGFuZCBhIGRlbGV0ZSB1bm1hcmtzIG9ubHkgb24gdGhlIHJ1bGVcbiAgICAgIC8vIGFjdGl2ZSBhcyBpdCBiZWdhbiAoc3RlcCA0KS4gVGhlIGRlZmF1bHQgcnVuIHBheXMgdGhlIHJlY29yZCdzIHdyaXRlIGFuZCBub3RoaW5nIGVsc2UuXG4gICAgICB0aGlzLnJlY29yZC53cml0ZShuc1BhdGgsIHZhbHVlLCB2ZXJiKTtcbiAgICAgIHJldHVybiBDTEVBUjtcbiAgICB9XG4gICAgY29uc3QgYXNrZWQgPSBkZWNpZGVXcml0ZShhY3RpdmUsIHBhdGgsIGtleSwgZXhwbGljaXQpO1xuICAgIGNvbnN0IHZlcmRpY3QgPSBpbmhlcml0QnlJZGVudGl0eShhY3RpdmUsIGFza2VkLCB0aGlzLl9zZWxlY3RlZE9iamVjdHMsIHBhdGgsIGtleSwgdmFsdWUpO1xuICAgIHRoaXMucmVjb3JkLndyaXRlKG5zUGF0aCwgdmFsdWUsIHZlcmIsIHNjcnViT2YodmVyZGljdCkpO1xuICAgIG1hcmtTdGFnZWRXcml0ZShhY3RpdmUsIHRoaXMucG9saWN5LnJlZGFjdGlvbiwgdmVyZGljdCwgcGF0aCwga2V5LCB2ZXJiKTtcbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBhbmQgcmVhZCBhdCBBTk9USEVSIGZyYW1lJ3MgYWRkcmVzcyAoaXRzIHJ1biBuYW1lc3BhY2UpIHdoaWxlIHRoaXNcbiAgICogZnJhbWUga2VlcHMgaXRzIG93biBpZGVudGl0eSBvbiB0aGUgcmVjb3JkIOKAlCBgc3RhZ2VgLCBgc3RhZ2VJZGAsXG4gICAqIGBydW50aW1lU3RhZ2VJZGAsIHRhZ3MuIEEgc3ViZmxvdyBtb3VudCdzIG1lcmdlLWJhY2sgaXMgdGhlIG9uZSBjYWxsZXJcbiAgICogKGBTdWJmbG93RXhlY3V0b3IgwrcgZXhlY3V0ZVN1YmZsb3dgLCBSMTMpOiB0aGUgbW91bnQgZnJhbWUgb2YgYSBicmFuY2ggb3JcbiAgICogZm9yayBjaGlsZCBsYW5kcyBpdHMgdmFsdWVzIHdoZXJlIGl0cyBwYXJlbnQgd3JpdGVzLCBhcyBiZWZvcmUsIGFuZCBpdHNcbiAgICogYnVuZGxlIG5vdyBuYW1lcyB0aGUgbW91bnQgaW5zdGVhZCBvZiB0aGUgc3RhZ2UgYmVmb3JlIGl0LiBSZWZ1c2VkIG9uY2VcbiAgICogdGhlIGZyYW1lIGhhcyBzdGFnZWQgYW55dGhpbmcg4oCUIGl0cyBidWZmZXIncyBhZGRyZXNzIGlzIGZpeGVkIHRoZW4uIFRoZVxuICAgKiBkZWNpc2lvbiBpcyB0aGUgZW5naW5lJ3MgKG5hbWVzcGFjZSBpZHMsIGFzIHNpbmNlIFIxMyk7IHRoZSByZWNvcmQgZnJhbWVcbiAgICogdGFrZXMgdGhlIGFkZHJlc3MgaXQgY29tZXMgdG8gKGBSZWNvcmRGcmFtZSDCtyB1c2VBZGRyZXNzYCkuXG4gICAqL1xuICB1c2VBZGRyZXNzT2YoZnJhbWU6IFN0YWdlQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZC5oYXNTdGFnZWQgJiYgZnJhbWUubmFtZXNwYWNlSWQgIT09IHRoaXMubmFtZXNwYWNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtmb290cHJpbnRdIFN0YWdlQ29udGV4dC51c2VBZGRyZXNzT2Y6ICcke3RoaXMuc3RhZ2VJZH0nIGhhcyBhbHJlYWR5IHN0YWdlZCB3cml0ZXMgYXQgaXRzIG93biBhZGRyZXNzLmAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFkZHJlc3NSdW5JZCA9IGZyYW1lLm5hbWVzcGFjZUlkO1xuICAgIHRoaXMucmVjb3JkLnVzZUFkZHJlc3MocnVuQWRkcmVzcyh0aGlzLm5hbWVzcGFjZUlkKSk7XG4gIH1cblxuICAvKiogVGhlIHJ1biBuYW1lc3BhY2Ugd3JpdGVzIGFuZCByZWFkcyBnbyB0bzoge0BsaW5rIGFkZHJlc3NSdW5JZH0sIGVsc2UgYHJ1bklkYC4gKi9cbiAgcHJpdmF0ZSBnZXQgbmFtZXNwYWNlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hZGRyZXNzUnVuSWQgPz8gdGhpcy5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBXcml0ZSBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBhdGNoKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdzZXQnKTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIG1lcmdlKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gdGhpcy5zdGFnZVdyaXRlKHRoaXMucmVjb3JkLmF0KHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ21lcmdlJyk7XG4gIH1cblxuICBzZXRPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBvcGVyYXRpb25PdmVycmlkZT86ICdzZXQnIHwgJ2RlbGV0ZScsXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIC8vIEV4cGxpY2l0IGRlbGV0aW9uIChTY29wZUZhY2FkZS5kZWxldGVWYWx1ZSkgc3RhZ2VzIGEgZGlzdGluY3Qgb3Agc29cbiAgICAvLyBkZWx0YS1tb2RlIGNvbW1pdHMgKCMxM2MtQikgY2FuIGVtaXQgYSByZWFsIGBkZWxldGVgIHRyYWNlIGVudHJ5LlxuICAgIC8vIFVuZGVyIHRoZSBkZWZhdWx0ICdmdWxsJyBtb2RlIHRoZSBidWZmZXIgY29tbWl0cyBpdCBhcyBhXG4gICAgLy8gc2V0LW9mLXVuZGVmaW5lZCDigJQgYnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICBjb25zdCB2ZXJkaWN0ID1cbiAgICAgIG9wZXJhdGlvbk92ZXJyaWRlID09PSAnZGVsZXRlJ1xuICAgICAgICA/IHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHVuZGVmaW5lZCwgc2hvdWxkUmVkYWN0LCAnZGVsZXRlJylcbiAgICAgICAgOiB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCBvcGVyYXRpb25PdmVycmlkZSA/PyAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCB0YWdnZWQgPSBkZXNjcmlwdGlvbi5zdGFydHNXaXRoKCdbJykgPyBkZXNjcmlwdGlvbiA6IGBbV1JJVEVdICR7ZGVzY3JpcHRpb259YDtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgdGFnZ2VkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICB1cGRhdGVPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMubWVyZ2UocGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0KTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdCDigJRcbiAgICAvLyBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSksIHNlZSB0cmFja1dyaXRlLlxuICAgIHRoaXMudHJhY2tXcml0ZSh1c2VyS2V5T2YocGF0aCwga2V5KSwgdmFsdWUsIHZlcmRpY3QsICd1cGRhdGUnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIHNldFJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChbXSwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogUm9vdC1sZXZlbCAodW4tbmFtZXNwYWNlZCkgd3JpdGUg4oCUIHRoZSBzdWJmbG93IHNlZWQgYW5kIG1lcmdlLWJhY2sgcGF0aC4gKi9cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0YWdlV3JpdGUoW2tleV0sIFtdLCBrZXksIHZhbHVlLCB1bmRlZmluZWQsICdzZXQnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUdsb2JhbENvbnRleHQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gIH1cblxuICBhcHBlbmRUb0FycmF5KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgaXRlbXM6IHVua25vd25bXSwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPSBBcnJheS5pc0FycmF5KGV4aXN0aW5nKSA/IFsuLi5leGlzdGluZywgLi4uaXRlbXNdIDogWy4uLml0ZW1zXTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIG1lcmdlT2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPVxuICAgICAgZXhpc3RpbmcgJiYgdHlwZW9mIGV4aXN0aW5nID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShleGlzdGluZylcbiAgICAgICAgPyB7IC4uLihleGlzdGluZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksIC4uLm9iaiB9XG4gICAgICAgIDogeyAuLi5vYmogfTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIEJPUlJPV0VEIOKAlCBzZWUgdGhlIGNvbnRyYWN0IG9uXG4gICAqIGBTY29wZUZhY2FkZS5nZXRWYWx1ZWAuIFJlYWQtdHJhY2tpbmcgY29zdCBpcyBwb2xpY3ktZ2F0ZWQgKCMxNCk6XG4gICAqIGAnZnVsbCdgIGNsb25lcyB0aGUgdmFsdWUgaW50byBgX3N0YWdlUmVhZHNgIChoaXN0b3JpY2FsIGRlZmF1bHQpLFxuICAgKiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXAgbWFya2VyLCBgJ29mZidgIHJlY29yZHMgbm90aGluZy5cbiAgICovXG4gIGdldFZhbHVlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRSZXRhaW5lZFZhbHVlKHBhdGgsIGtleSwgZGVzY3JpcHRpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNhcHR1cmU/LmxpbWl0KCdyZWFkLXJldGVudGlvbi1mYWlsZWQnKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVhZFJldGFpbmVkVmFsdWUocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICAvLyBUaGUgcmVjb3JkIGZyYW1lIHNlcnZlcyB0aGUgdmFsdWUgKHR3byB0aWVycykgYW5kIGtlZXBzIHRoZSBwZXItd3JpdGVcbiAgICAvLyBwcm92ZW5hbmNlIHJlZ2lzdHJ5ICgjUDEpIOKAlCBrZXkgc3RyaW5ncyBvbmx5LCBpbmRlcGVuZGVudCBvZiB0aGVcbiAgICAvLyByZWFkVHJhY2tpbmcgcmV0ZW50aW9uIGRpYWwgKHdoaWNoIGdvdmVybnMgVkFMVUUgcmV0ZW50aW9uIGJlbG93KS5cbiAgICBsZXQgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCA9IENMRUFSO1xuICAgIGNvbnN0IHZhbHVlID1cbiAgICAgIHRoaXMucG9saWN5LnJlYWRTb3VyY2VzICYmIHRoaXMucmVhZFNvdXJjZXNcbiAgICAgICAgPyB0aGlzLnJlYWRXaXRoTmF0aXZlU291cmNlKHBhdGgsIGtleSwgKCkgPT4ge1xuICAgICAgICAgICAgdmVyZGljdCA9IHRoaXMuanVkZ2VSZWFkKHBhdGgsIGtleSk7XG4gICAgICAgICAgICByZXR1cm4gdmVyZGljdC5raW5kID09PSAnY2xlYXInID8gJ3Zpc2libGUnIDogJ3JlZGFjdGVkJztcbiAgICAgICAgICB9KVxuICAgICAgICA6IHRoaXMucmVjb3JkLnJlYWQocGF0aCwga2V5KTtcbiAgICAvLyBEZWZhdWx0LW9mZiByZXRhaW5zIGl0cyBvcmlnaW5hbCByZWFkIC0+IG5vdGVSZWFkIC0+IE9ORSB2ZXJkaWN0IG9yZGVyLlxuICAgIC8vIEVuYWJsZWQgY2FwdHVyZSB1c2VzIGEgcHVyZSBwb3N0LXJlYWQgdmVyZGljdDsgcHJlZml4IGJvb2trZWVwaW5nIGZvbGxvd3MgaXRcbiAgICAvLyBiZWZvcmUgcmV0dXJuaW5nIHRvIHN0YWdlIGNvZGUuIEEgcHVyZSwgbmFtZS1vbmx5IHZlcmRpY3QgY2Fubm90IG9ic2VydmUgdGhlIHByZWZpeC5cbiAgICBpZiAoIXRoaXMucG9saWN5LnJlYWRTb3VyY2VzIHx8ICF0aGlzLnJlYWRTb3VyY2VzKSB2ZXJkaWN0ID0gdGhpcy5ub3RlQW5kSnVkZ2VSZWFkKHBhdGgsIGtleSk7XG4gICAgaWYgKHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJlYWRzICs9IDE7XG4gICAgICAvLyBBbiBvYmplY3QgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUsIHdyaXR0ZW4gYmFjayB1bmRlciBhbm90aGVyLCBrZWVwcyBpdHMgcnVsZSAoc3RhZ2VXcml0ZSkuXG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgKHRoaXMuX3NlbGVjdGVkT2JqZWN0cyA/Pz0gbmV3IFdlYWtNYXAoKSkuc2V0KHZhbHVlLCB2ZXJkaWN0KTtcbiAgICB9XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCByZWFkIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcg4oCUIHJldGFpbmVkIHVuZGVyXG4gICAgLy8gdGhlIHJ1bGUncyB2ZXJkaWN0ICg5LjE5LjApOiBhIHJlZGFjdGVkIGtleSBpcyByZXRhaW5lZCBhcyB0aGVcbiAgICAvLyBwbGFjZWhvbGRlciwgYSBmaWVsZC1sZXZlbCBrZXkgYXMgYSBzY3J1YmJlZCBjbG9uZSwgbmV2ZXIgdGhlIHNlY3JldC5cbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nICE9PSAnb2ZmJykge1xuICAgICAgaWYgKHBhdGgubGVuZ3RoID4gMCkgKHRoaXMuX25lc3RlZFJlYWRzID8/PSBuZXcgU2V0KCkpLmFkZCh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gICAgICBlbHNlIGlmICh0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgPT09ICdmdWxsJyAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgICBpZiAodGhpcy5yZWNvcmQuaGFzU3RhZ2VkKSB0aGlzLl92aWV3UmVhZHM/LmRlbGV0ZShrZXkpO1xuICAgICAgICBlbHNlICh0aGlzLl92aWV3UmVhZHMgPz89IG5ldyBTZXQoKSkuYWRkKGtleSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFnZVJlYWRzW3VzZXJLZXlPZihwYXRoLCBrZXkpXSA9XG4gICAgICAgIHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogdGhpcy5yZXRhaW5lZEZvcm0odmVyZGljdCwgdmFsdWUsIHRoaXMucG9saWN5LnJlYWRUcmFja2luZywgc3VtbWFyaXplUmVhZFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGBbUkVBRF0gJHtkZXNjcmlwdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRyYWNrZWQgcmVhZHMgb2YgdGhpcyBmcmFtZSByZWFkIGEgdmFsdWUgdGhlIHJ1bidzIHJ1bGUgc2VsZWN0c1xuICAgKiAoYSBrZXkgaXQgbWFza3Mgd2hvbGUsIG9yIG9uZSB3aXRoIHNlY3JldCBmaWVsZHMpLiBBIGJvdW5kYXJ5IHRoYXQgbWFwc1xuICAgKiB3aGF0IGEgc3RhZ2UgZnVuY3Rpb24gUkVBRCBpbnRvIGEgbmV3IG5hbWUg4oCUIHRoZSBgcGFyYWxsZWxGb3JFYWNoYCBpdGVtc1xuICAgKiBzZWxlY3RvciDigJQgY29tcGFyZXMgaXQgYmVmb3JlIGFuZCBhZnRlciwgYXMgYSBzdWJmbG93IG1hcHBlcidzIHRhaW50IGRvZXNcbiAgICogKGBtZW1vcnkvcmVkYWN0aW9uLnRzIMK3IE1hcHBlclRhaW50YCkuIEFsd2F5cyAwIHdpdGhvdXQgYSBwb2xpY3kgb3IgYSBtYXJrLlxuICAgKi9cbiAgZ2V0IHNlbGVjdGVkUmVhZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRSZWFkcztcbiAgfVxuXG4gIHByaXZhdGUgbm90ZUFuZEp1ZGdlUmVhZChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5ub3RlUmVhZChwYXRoLCBrZXkpO1xuICAgIHJldHVybiB0aGlzLmp1ZGdlUmVhZChwYXRoLCBrZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBqdWRnZVJlYWQocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHJ1bGUgPSBrZXkgIT09IHVuZGVmaW5lZCA/IHRoaXMuYWN0aXZlUnVsZSgpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBydWxlICE9PSB1bmRlZmluZWQgPyBydWxlLnZlcmRpY3RBdChwYXRoLCBrZXkgYXMgc3RyaW5nKSA6IENMRUFSO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkV2l0aE5hdGl2ZVNvdXJjZShcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YWN5OiAoKSA9PiAndmlzaWJsZScgfCAncmVkYWN0ZWQnLFxuICApOiB1bmtub3duIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMuI2ZhaWx1cmVJZGVudGl0eTtcbiAgICBsZXQganVkZ2VkID0gZmFsc2U7XG4gICAgbGV0IGhpZGRlbiA9IGZhbHNlO1xuICAgIGNvbnN0IHZlcmRpY3QgPSAoKSA9PiB7XG4gICAgICBqdWRnZWQgPSB0cnVlO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcHJpdmFjeSgpO1xuICAgICAgaGlkZGVuID0gcmVzdWx0ICE9PSAndmlzaWJsZSc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgbGV0IHZhbHVlOiB1bmtub3duO1xuICAgIHRyeSB7XG4gICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwgIWlkZW50aXR5KSB7XG4gICAgICAgIHRoaXMucmVhZFNvdXJjZXM/LmxpbWl0KGtleSA9PT0gdW5kZWZpbmVkID8gJ3VudHJhY2tlZC1yZWFkJyA6ICdpZGVudGl0eS11bmF2YWlsYWJsZScpO1xuICAgICAgICB2YWx1ZSA9IHRoaXMucmVjb3JkLnJlYWQocGF0aCwga2V5KTtcbiAgICAgICAgdmVyZGljdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLnJlY29yZC5yZWFkV2l0aFNvdXJjZShcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICB7IHJ1bnRpbWVTdGFnZUlkOiBpZGVudGl0eS5ydW50aW1lU3RhZ2VJZCwgLi4uKHRoaXMuc291cmNlQXR0ZW1wdCAmJiB7IGF0dGVtcHRJZDogdGhpcy5zb3VyY2VBdHRlbXB0IH0pIH0sXG4gICAgICAgICAgdmVyZGljdCxcbiAgICAgICAgKS52YWx1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQSBzdWNjZXNzZnVsIG5hdGl2ZSByZWFkIGtlZXBzIGl0cyBwcmVmaXggZXZlbiB3aGVuIHRoZSB2ZXJkaWN0IHRocm93cy5cbiAgICAgIC8vIEEgbmF0aXZlIGZhaWx1cmUgbmV2ZXIgZW50ZXJzIHRoZSB2ZXJkaWN0IGFuZCBtdXN0IG5vdCBpbnZlbnQgYSByZWFkLlxuICAgICAgaWYgKGp1ZGdlZCkgdGhpcy5ub3RlU291cmNlUmVhZChwYXRoLCBrZXksIGhpZGRlbiwgZmFsc2UpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGlmIChqdWRnZWQpIHRoaXMubm90ZVNvdXJjZVJlYWQocGF0aCwga2V5LCBoaWRkZW4sIHRydWUpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbm90ZVNvdXJjZVJlYWQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLCBoaWRkZW46IGJvb2xlYW4sIHByb3BhZ2F0ZUZhaWx1cmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5ub3RlUmVhZChwYXRoLCBrZXkpO1xuICAgICAgaWYgKGhpZGRlbikgdGhpcy5yZWFkU291cmNlcz8ubGltaXQoJ3ByaXZhY3ktYWN0aXZlJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMucmVhZFNvdXJjZXM/LmxpbWl0KCdzb3VyY2UtY2FwdHVyZS1mYWlsZWQnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBDb2xsZWN0b3IgZmFpbHVyZXMgbXVzdCBub3QgcmVwbGFjZSB0aGUgb3JpZ2luYWwgcmVhZC92ZXJkaWN0IGVycm9yLlxuICAgICAgfVxuICAgICAgaWYgKHByb3BhZ2F0ZUZhaWx1cmUpIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgdHJhY2tpbmcgaW4gX3N0YWdlUmVhZHMgb3IgcGF5aW5nIHN0cnVjdHVyZWRDbG9uZSBjb3N0LlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZS5nZXRWYWx1ZVNpbGVudCgpIGZvciBhcnJheSBwcm94eSBpbnRlcm5hbCBvcGVyYXRpb25zLiAqL1xuICBnZXRWYWx1ZURpcmVjdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnJlYWQocGF0aCwga2V5KTtcbiAgfVxuXG4gIGdldFJvb3Qoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQucmVhZExpdmUoa2V5KTtcbiAgfVxuXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5yZWFkR2xvYmFsKGtleSk7XG4gIH1cblxuICBnZXRTY29wZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnN0YXRlLmdldFN0YXRlKCk7XG4gIH1cblxuICBnZXRSdW5JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIENvbW1pdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUkZDLTAwMyBEMjogcmVjb3JkIHRoYXQgdGhpcyBzdGFnZSBjb25zdW1lZCBhbiB1bnRyYWNrZWQgcmVhZCBwYXRoLlxuICAgKiBDYWxsZWQgYnkgYFNjb3BlRmFjYWRlYCAoYGdldEFyZ3NgL2BnZXRFbnZgL3Vuc2hhZG93ZWQgYGdldFZhbHVlU2lsZW50YCk7XG4gICAqIHN1cmZhY2VkIGFzIGBDb21taXRCdW5kbGUudW50cmFja2VkU291cmNlc2Agb24gdGhpcyBzdGFnZSdzIGNvbW1pdC5cbiAgICovXG4gIG1hcmtVbnRyYWNrZWRTb3VyY2Uoc291cmNlOiBVbnRyYWNrZWRTb3VyY2UpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRTb3VyY2VzPy5saW1pdCgndW50cmFja2VkLXJlYWQnKTtcbiAgICAodGhpcy5fdW50cmFja2VkU291cmNlcyA/Pz0gbmV3IFNldCgpKS5hZGQoc291cmNlKTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBhbiBvYnNlcnZlciB0aGF0IGZpcmVzIGFmdGVyIGNvbW1pdCgpIGFwcGxpZXMgcGF0Y2hlcy5cbiAgICogIFVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZGlzcGF0Y2ggU2NvcGVSZWNvcmRlci5vbkNvbW1pdCBldmVudHMuICovXG4gIHNldENvbW1pdE9ic2VydmVyKFxuICAgIG9ic2VydmVyOiAobXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PikgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXYtbW9kZSBvbmx5OiBkaWQgdGhpcyBzdGFnZSBjaGFuZ2UsIElOIFBMQUNFLCBhIHZhbHVlIGl0IG1lcmVseSBSRUFEP1xuICAgKlxuICAgKiBUaGUgdHlwZWQgc2NvcGUgaW50ZXJjZXB0cyBldmVyeSB3cml0ZSBpdCBjYW4gcmVhY2gg4oCUIGEgcHJvcGVydHkgYXQgYW55XG4gICAqIGRlcHRoLCBhbiBpbmRleGVkIGVsZW1lbnQsIGFuIGFycmF5IG1ldGhvZC4gV2hhdCBpdCBjYW5ub3QgcmVhY2ggaXMgYW5cbiAgICogZWxlbWVudCBoYW5kZWQgb3V0IGJ5IGEgcmVhZCBtZXRob2QgKGBmaW5kYCwgYGZpbHRlcmAsIGBmb3LigKZvZmAsXG4gICAqIGBmb3JFYWNoYCwgZGVzdHJ1Y3R1cmluZyk6IHdyYXBwaW5nIHRob3NlIHdvdWxkIG1lYW4gcmV0dXJuaW5nIHByb3hpZXMgb3V0XG4gICAqIG9mIGV2ZXJ5IHJlYWQsIHdoaWNoIGlzIGEgY29zdCB0aGUgbGlicmFyeSBzaG91bGQgbm90IHBheS4gU28gdGhhdCBmYW1pbHlcbiAgICogaXMgV0FSTkVEIEFCT1VUIHJhdGhlciB0aGFuIGludGVyY2VwdGVkIOKAlCBsb3VkbHksIGhlcmUsIGluc3RlYWQgb2YgZW5kaW5nXG4gICAqIHRoZSBydW4gd2l0aCBhIGNvbW1pdCBsb2cgdGhhdCBzaWxlbnRseSBkaXNhZ3JlZXMgd2l0aCBmaW5hbCBzdGF0ZS5cbiAgICpcbiAgICogVGhpcyBpcyBhIFJFUE9SVCBhZnRlciB0aGUgZmFjdCwgbm90IGEgcmVmdXNhbCBhdCB0aGUgd3JpdGU6IHRoZSB3cml0ZSBoYXNcbiAgICogYWxyZWFkeSBoYXBwZW5lZCBpbiBwbGFjZSBhbmQgdGhlcmUgaXMgbm90aGluZyB0byBpbnRlcmNlcHQuIEl0IHJ1bnMgdW5kZXJcbiAgICogVFdPIHByZWNvbmRpdGlvbnMsIGJvdGggbmFtZWQgaW4gdGhlIFJFQURNRSDigJQgYGVuYWJsZURldk1vZGUoKWAsIGFuZFxuICAgKiBgcmVhZFRyYWNraW5nOiAnZnVsbCdgICh0aGUgZGVmYXVsdCksIGJlY2F1c2UgdGhlIGNvbXBhcmlzb24gbmVlZHMgdGhlXG4gICAqIGNsb25lIG9mIHRoZSB2YWx1ZSB0aGF0IG1vZGUgcmV0YWlucyBhdCByZWFkIHRpbWUuIEEga2V5IHRoZSBzdGFnZSBuZXZlclxuICAgKiBzdGFnZWQgbXVzdCBzdGlsbCBob2xkIHRoYXQgY2xvbmUg4oCUIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcFxuICAgKiBhbmQgdGhlIGJ1ZmZlcidzIHdvcmtpbmcgY29weSBpcyBwcml2YXRlIHRvIHRoaXMgc3RhZ2UuIEtleXMgdGhlIHN0YWdlIERJRFxuICAgKiBzdGFnZSBhcmUgc2tpcHBlZCAodGhleSBhcmUgZXhwZWN0ZWQgdG8gZGlmZmVyLCBhbmQgdGhleSBhcmUgaW4gdGhlIHJlY29yZCksXG4gICAqIHNvIGFyZSBrZXlzIHVuZGVyIGEgcmVkYWN0aW9uIHZlcmRpY3QsIHdob3NlIHJldGFpbmVkIGZvcm0gaXMgZGVsaWJlcmF0ZWx5XG4gICAqIG5vdCB0aGUgdmFsdWUsIGFuZCBzbyBhcmUga2V5cyByZWFkIGF0IGEgbmVzdGVkIHBhdGggKGBfbmVzdGVkUmVhZHNgKSDigJRcbiAgICogdGhvc2UgYXJlIGVuZ2luZSByZWFkcyAodGhlIHN1YmZsb3cgbWVyZ2UtYmFjayksIG5vdCB1c2VyIHJlYWRzLlxuICAgKlxuICAgKiBJdCBhbHNvIG9ubHkgbG9va3MgYXQga2V5cyBzZXJ2ZWQgZnJvbSB0aGUgUElOTkVEIHNvdXJjZSDigJQgdGhlIGZpcnN0LXRvdWNoXG4gICAqIHZpZXcgb3IgdGhpcyBzdGFnZSdzIG93biBidWZmZXIuIEEga2V5IGFic2VudCBmcm9tIGJvdGggd2FzIHNlcnZlZCBieSB0aGVcbiAgICogcmVhZCdzIGxpdmUgZmFsbGJhY2sgKGBSZWNvcmRGcmFtZSDCtyByZWFkYCwgdGllciAyKSwgd2hpY2ggYSBwYXJhbGxlbCBzaWJsaW5nJ3Mgcm9vdC1rZXkgY29tbWl0IGNhblxuICAgKiBsZWdpdGltYXRlbHkgbW92ZTsgYWNjdXNpbmcgdGhlIHN0YWdlIHRoZXJlIHdvdWxkIGJlIGEgZmFsc2UgYWxhcm0uIEZvclxuICAgKiB0aGUgc2FtZSByZWFzb24gaXQgcnVucyBvbiB0aGUgZnJhbWUncyBGSVJTVCBjb21taXQgb25seTogdGhlIHJlYWRzIGJlbG9uZ1xuICAgKiB0byB0aGF0IHJvdW5kLCBhbmQgYnkgdGhlIGVuZ2luZSdzIHNlY29uZCByb3VuZCAoYSBmb3JrIGRvdWJsZS1jb21taXQsIGFcbiAgICogc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBjb21taXR0ZWQgYnJhbmNoIHBhcmVudCkgb3RoZXIgc3RhZ2VzIGhhdmVcbiAgICogbGVnaXRpbWF0ZWx5IG1vdmVkIHRoZSBzdGF0ZSB0aGV5IHdlcmUgY29tcGFyZWQgYWdhaW5zdC5cbiAgICpcbiAgICogQSBrZXkgdGhlIHN0YWdlIERJRCBzdGFnZSBpcyBzdGlsbCBjaGVja2VkIHdoZW4gaXRzIGxhc3QgcmVhZCBjYW1lIGZyb21cbiAgICogY29tbWl0dGVkIHN0YXRlICh7QGxpbmsgX3ZpZXdSZWFkc30g4oCUIHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSk6XG4gICAqIHRoYXQgcmVhZCB3YXMgdGhlIGNvbW1pdHRlZCBvYmplY3QgaXRzZWxmLCBhbmQgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSBJU1xuICAgKiB0aGF0IG9iamVjdCAoY29weS1vbi13cml0ZSwgOS4yOS4wKSwgc28gYW4gaW4tcGxhY2UgZWRpdCBmb2xsb3dlZCBieSBhXG4gICAqIHdyaXRlIG9mIHRoZSBrZXkgY29tbWl0cyBOTyBjaGFuZ2Ug4oCUIGxpdmUgc3RhdGUga2VlcHMgdGhlIGVkaXQsIHRoZSBsb2dcbiAgICogZG9lcyBub3QuIENvbXBhcmVkIGFnYWluc3QgY29tbWl0dGVkIHN0YXRlLCBub3QgdGhlIHdyaXR0ZW4gdmFsdWUsIHNvIGFcbiAgICogbGVnaXRpbWF0ZSB3cml0ZSBuZXZlciB0cmlwcyBpdC5cbiAgICpcbiAgICogQ29zdHMgbm90aGluZyBvdXRzaWRlIGBlbmFibGVEZXZNb2RlKClgLlxuICAgKi9cbiAgcHJpdmF0ZSB3YXJuT25Cb3Jyb3dlZE11dGF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghaXNEZXZNb2RlKCkgfHwgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nICE9PSAnZnVsbCcgfHwgdGhpcy5fY29tbWl0dGVkKSByZXR1cm47XG4gICAgY29uc3QgcnVsZSA9IHRoaXMuYWN0aXZlUnVsZSgpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpKSB7XG4gICAgICBjb25zdCByZXRhaW5lZCA9IHRoaXMuX3N0YWdlUmVhZHNba2V5XTtcbiAgICAgIC8vIE9ubHkgYSBjb250YWluZXIgY2FuIGJlIG11dGF0ZWQgaW4gcGxhY2U7IGEgcHJpbWl0aXZlIHJlYWQgY2Fubm90LlxuICAgICAgaWYgKHJldGFpbmVkID09PSBudWxsIHx8IHR5cGVvZiByZXRhaW5lZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMuX25lc3RlZFJlYWRzPy5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICBpZiAocnVsZSAhPT0gdW5kZWZpbmVkICYmIHJ1bGUudmVyZGljdEF0KFtdLCBrZXkpLmtpbmQgIT09ICdjbGVhcicpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmFtZXNwYWNlZCA9IHRoaXMucmVjb3JkLmF0KFtdLCBrZXkpO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9zdGFnZVdyaXRlcywga2V5KSB8fCB0aGlzLnJlY29yZC53YXNTdGFnZWQobmFtZXNwYWNlZCkpIHtcbiAgICAgICAgdGhpcy53YXJuT25Db21taXR0ZWRNdXRhdGlvbihrZXksIG5hbWVzcGFjZWQsIHJldGFpbmVkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBwaW5uZWQgc291cmNlIG9ubHkg4oCUIHNlZSB0aGUgbm90ZSBvbiB0aGUgbGl2ZSBmYWxsYmFjayBhYm92ZS5cbiAgICAgIC8vIGBwZWVrYCwgbm90IGBnZXRgOiBhIHJlcG9ydCBjb21wYXJlcywgYW5kIG11c3Qgbm90IHRha2UgdGhlIHByaXZhdGVcbiAgICAgIC8vIGNvcHkgYSBzdGFnZSdzIHJlYWQgd291bGQgKGNvcHktb24td3JpdGUsIDkuMjkuMCkuXG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5yZWNvcmQucGVlayhuYW1lc3BhY2VkKTtcbiAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYXRoID0gZmlyc3REaWZmZXJpbmdQYXRoKHJldGFpbmVkLCBjdXJyZW50KTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2Fybihib3Jyb3dlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBzdGFnZWQta2V5IGhhbGYgb2Yge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259OiBkaWQgY29tbWl0dGVkIHN0YXRlIGl0c2VsZiBtb3ZlIHVuZGVyIGEgcmVhZD8gKi9cbiAgcHJpdmF0ZSB3YXJuT25Db21taXR0ZWRNdXRhdGlvbihrZXk6IHN0cmluZywgbmFtZXNwYWNlZDogc3RyaW5nW10sIHJldGFpbmVkOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl92aWV3UmVhZHM/LmhhcyhrZXkpKSByZXR1cm47XG4gICAgY29uc3QgY29tbWl0dGVkID0gdGhpcy5yZWNvcmQuYmFzZUF0KG5hbWVzcGFjZWQpO1xuICAgIGlmIChjb21taXR0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhdGggPSBmaXJzdERpZmZlcmluZ1BhdGgocmV0YWluZWQsIGNvbW1pdHRlZCk7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKGNvbW1pdHRlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggc3RhZ2VkIHdyaXRlcyB0byBzaGFyZWQgbWVtb3J5IGFuZCBSRUxFQVNFIHRoZSBwZXItc3RhZ2Ugc3RhZ2luZ1xuICAgKiBzdGF0ZSAoIzEzYikuXG4gICAqXG4gICAqIGBwaGFzZWAgKDkuMzkuMCkgaXMgdGhlIGNhbGxlcidzIHN0YXRlbWVudCBvZiB3aGF0IGEgQ09OVElOVUFUSU9OIGNvbW1pdFxuICAgKiBpcyDigJQgYCdleGl0J2AgZnJvbSBhIHN1YmZsb3cgbW91bnQncyBleGl0LCBgJ3JlcGVhdCdgIGZyb20gYSBmb3JrXG4gICAqIGZhbi1vdXQncyBzZXR0bGUuIEl0IGlzIHN0YW1wZWQgb24gdGhlIGJ1bmRsZSAoYENvbW1pdEJ1bmRsZS5waGFzZWApIG9ubHlcbiAgICogd2hlbiB0aGlzIGZyYW1lIGhhcyBBTFJFQURZIGNvbW1pdHRlZDogdGhlIEZJUlNUIGJ1bmRsZSBvZiBhbiBleGVjdXRpb25cbiAgICogaXMgdGhlIHN0YWdlJ3Mgb3duIGFuZCBuZXZlciBjYXJyaWVzIGEgYHBoYXNlYCDigJQgc28gYSBtb3VudCB3aXRob3V0IGFuXG4gICAqIGBvdXRwdXRNYXBwZXJgIChhIGxhenkgbW91bnQsIGV2ZXJ5IGBwYXJhbGxlbEZvckVhY2hgIGJyYW5jaCksIHdob3NlIGV4aXRcbiAgICogaXMgaXRzIG9ubHkgYnVuZGxlLCByZWNvcmRzIHRoYXQgYnVuZGxlIGFzIGl0cyBvd24sIHRhZ3MgYW5kIGFsbC5cbiAgICpcbiAgICogQ29tbWl0IGlzIHRoZSBzdGFnZSdzIGxpZmVjeWNsZSBlbmQ6IHRoZSByZWNvcmQgZnJhbWUncyBidWZmZXIgYW5kXG4gICAqIGZpcnN0LXRvdWNoIGJhc2UgYXJlIG9ubHkgbmVlZGVkIERVUklORyBleGVjdXRpb24sIGFzIHRoZSByZWFkIHNuYXBzaG90ICtcbiAgICogbmV0LWNoYW5nZSBkaWZmIGJhc2UsIHNvIHRoZSByZWNvcmQgZnJhbWUgcmVsZWFzZXMgdGhlbSBvbmNlIHRoZSBjb21taXRcbiAgICogaGFzIGxhbmRlZCBhbmQgdGhlIG9ic2VydmVyIGhhcyBzZWVuIGl0IChgUmVjb3JkRnJhbWUgwrcgcmVsZWFzZWAg4oCUIHdoeSBhXG4gICAqIGZyYW1lIHRoYXQga2VwdCB0aGVtIHdvdWxkIHJldGFpbiBvbmUgc3RhdGUgZ2VuZXJhdGlvbiBwZXIgZXhlY3V0ZWRcbiAgICogc3RhZ2UsIGFuZCB3aHkgYSByZS11c2VkIGZyYW1lIHJlLWFuY2hvcnMgb24gY3VycmVudCBzdGF0ZSwgaXMgdGhlcmUpLlxuICAgKlxuICAgKiBSRS1VU0UgQUZURVIgQ09NTUlUIHN0YXlzIGNvcnJlY3QgYmVjYXVzZSBib3RoIHJlLWNyZWF0ZSBsYXppbHk6XG4gICAqIC0gYSBsYXRlciBSRUFEIHJlLWFuY2hvcnMgb24gdGhlIENVUlJFTlQgY29tbWl0dGVkIHN0YXRlICh3aGljaCBpbmNsdWRlc1xuICAgKiAgIHRoaXMgc3RhZ2UncyBvd24gZmx1c2hlZCB3cml0ZXMpO1xuICAgKiAtIGEgbGF0ZXIgV1JJVEUgY29uc3RydWN0cyBhIGZyZXNoIGJ1ZmZlciBvbiB0aGF0IHJlLWFuY2hvcmVkIHZpZXcsIHNvIGFcbiAgICogICBzZWNvbmQgY29tbWl0IGRpZmZzIGFnYWluc3QgcG9zdC1maXJzdC1jb21taXQgc3RhdGUuIFRoZSBwcmUtcmVsZWFzZVxuICAgKiAgIGJ1ZmZlciBiZWhhdmVkIHRoZSBzYW1lIGZvciBWQUxVRVMgKGl0cyBgd29ya2luZ0NvcHlgIHdhcyByZXNldCBvblxuICAgKiAgIGNvbW1pdCwgZmFsbGluZyByZWFkcyB0aHJvdWdoIHRvIGxpdmUgc3RhdGUpIGJ1dCBrZXB0IHRoZSBPUklHSU5BTFxuICAgKiAgIGBiYXNlU25hcHNob3RgIGFzIGRpZmYgYmFzZSDigJQgdW5yZWFjaGFibGUgaW4gcHJhY3RpY2U6IHRoZSBlbmdpbmUnc1xuICAgKiAgIG9ubHkgd3JpdGVzIGFmdGVyIGEgY29tbWl0IGFyZSB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBjb21taXR0ZWRcbiAgICogICBicmFuY2ggcGFyZW50IChhIGRlY2lkZXIgb3IgZm9yayBmcmFtZSBjb21taXRzIGJlZm9yZSBpdHMgYnJhbmNoIHJ1bnMpO1xuICAgKiAgIHRoZSBvdGhlciBcIndyaXRlIGFmdGVyIGNvbW1pdFwiXG4gICAqICAgc2l0ZXMgKFN1YmZsb3dFeGVjdXRvciBzZWVkIOKGkiByZXBsYWNlcyB0aGUgY29udGV4dDsgcmVzdW1lIOKGkiBmcmVzaFxuICAgKiAgIGNvbnRleHQgdmlhIGBsZWFmLmNyZWF0ZU5leHRgKSBuZXZlciByZS11c2UgYSBjb21taXR0ZWQgY29udGV4dC5cbiAgICogLSBBIFVTRVIgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgaXMgYSBkaWZmZXJlbnQgbWF0dGVyOiBpdHMgd3JpdGVzXG4gICAqICAgd291bGQgbGFuZCBpbiBhIGJ1ZmZlciBub3RoaW5nIGV2ZXIgY29tbWl0cy4gVGhhdCByZWZ1c2FsIGxpdmVzIG9uIHRoZVxuICAgKiAgIHNjb3BlIHRpZXIgKGBTY29wZUZhY2FkZWAsIHNlYWxlZCBieSB0aGUgY29tbWl0IG9ic2VydmVyIOKAlCA5LjIyLjApLFxuICAgKiAgIGJlY2F1c2UgdGhlIGZyYW1lJ3MgcmUtdXNhYmlsaXR5IGlzIGV4YWN0bHkgd2hhdCB0aGUgZW5naW5lIHBhdGhzXG4gICAqICAgYWJvdmUgbmVlZC5cbiAgICogLSBgX3N0YWdlV3JpdGVzYCAvIGBfc3RhZ2VSZWFkc2AgYXJlIE5PVCByZWxlYXNlZCDigJQgYHNuYXBzaG90U2VsZigpYFxuICAgKiAgIHJlYWRzIHRoZW0gcG9zdC1ydW4gZm9yIHRoZSBleGVjdXRpb24tdHJlZSBzbmFwc2hvdC5cbiAgICovXG4gIGNvbW1pdChwaGFzZT86IENvbW1pdFBoYXNlKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY29tbWl0UmV0YWluZWQocGhhc2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNhcHR1cmU/LmxpbWl0KCdjb21taXQtcmV0ZW50aW9uLWZhaWxlZCcpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21taXRSZXRhaW5lZChwaGFzZT86IENvbW1pdFBoYXNlKTogdm9pZCB7XG4gICAgLy8gQSBjb250aW51YXRpb24gb25seSBBRlRFUiB0aGUgZXhlY3V0aW9uJ3Mgb3duIGJ1bmRsZSAoc2VlIGFib3ZlKS5cbiAgICBjb25zdCBjb250aW51YXRpb24gPSB0aGlzLl9jb21taXR0ZWQgPyBwaGFzZSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hdGVyaWFsaXNlV3JpdGVzKCk7XG4gICAgdGhpcy53YXJuT25Cb3Jyb3dlZE11dGF0aW9uKCk7XG4gICAgLy8gVGhlIHJlY29yZCdzIGhhbGYgKGBSZWNvcmRGcmFtZSDCtyBjb21taXRgIOKGkiBgcmVjb3JkQ29tbWl0LnRzYCkuIE5vIGJ1ZmZlclxuICAgIC8vID0gbm8gd3JpdGUgZXZlciBidWlsdCBvbmUgKCMxMyk6IHRoZSBjb21taXQgaXMgZW1wdHkgYnkgY29uc3RydWN0aW9uLFxuICAgIC8vIHJlY29yZGVkIHdpdGggWkVSTyBjbG9uZXMuIFRoZSBuYW1lcyBhcmUgcmVhZCBvbmNlIHRoZSBwYXlsb2FkIGlzIGJ1aWx0LlxuICAgIHRoaXMucmVjb3JkLmNvbW1pdCgoKSA9PiAoe1xuICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgICB1bnRyYWNrZWRTb3VyY2VzOiB0aGlzLl91bnRyYWNrZWRTb3VyY2VzLFxuICAgICAgdGFnczogdGhpcy50YWdzLFxuICAgICAgcGhhc2U6IGNvbnRpbnVhdGlvbixcbiAgICB9KSk7XG4gICAgLy8gVGhlIG9ic2VydmVyIChTY29wZUZhY2FkZSkgc2VlcyB0aGUgdHJhY2tlZCBtdXRhdGlvbnMsIFRIRU4gdGhlIHN0YWdpbmdcbiAgICAvLyBzdGF0ZSBpcyByZWxlYXNlZCAoIzEzYiksIHNvIGl0IHNlZXMgdGhlIHdvcmxkIGFzIGl0IHdhcy4gRDIncyBtYXJrZXJzXG4gICAgLy8gYW5kIHRoZSBkZWNsYXJlZCB0YWdzIHJlbGVhc2Ugd2l0aCBpdCDigJQgb25lIHN0YW1wIHBlciBleGVjdXRpb24sIHNvIHRoZVxuICAgIC8vIGVuZ2luZSdzIGRvdWJsZS1jb21taXQgcGF0aHMgcmVjb3JkIHRoZW0gZXhhY3RseSBvbmNlLlxuICAgIGlmICh0aGlzLl9jb21taXRPYnNlcnZlcikge1xuICAgICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIoeyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9KTtcbiAgICB9XG4gICAgdGhpcy5yZWNvcmQucmVsZWFzZSgpO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50YWdzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NvbW1pdHRlZCA9IHRydWU7XG4gICAgLy8gVGhlIHN0YWdlIGlzIG92ZXI6IGV2ZXJ5IGNhbGwgaXQgbWFkZSB0aGF0IGlzIHN0aWxsIHJ1bm5pbmcgc3RvcHMgKFAyKSwgYW5kIG5vdGhpbmcgcmVwb3J0cyB0aHJvdWdoIHRoZVxuICAgIC8vIGVuZ2luZSBhbnkgbW9yZSDigJQgYSBsYXRlIHJlY29yZCBpcyByZWZ1c2VkIGJlZm9yZSBpdCB3b3VsZCByZWFjaCBpdC5cbiAgICB0aGlzLmVuZENhbGxzKHVuZGVmaW5lZCk7XG4gICAgdGhpcy5fYXR0ZW1wdFJlcG9ydGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBmcmFtZSBoYXMgY29tbWl0dGVkIOKAlCBhIGNhbGwncyByZWNvcmQgYXJyaXZpbmcgYWZ0ZXIgaXQgaXMgbGF0ZSAoUDIsIGBTY29wZUZhY2FkZSDCtyBjYWxsYCkuICovXG4gIGdldCBjb21taXR0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbW1pdHRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvdyBhd2F5IGV2ZXJ5dGhpbmcgdGhpcyBzdGFnZSBoYXMgU1RBR0VELCB3aXRob3V0IGNvbW1pdHRpbmcgYW55IG9mIGl0LlxuICAgKlxuICAgKiBUaGUgaXNvbGF0aW9uIHByaW1pdGl2ZSBiZWhpbmQgZGVjbGFyYXRpdmUgcmV0cnk6IHdoZW4gYSBub24tZmluYWwgYXR0ZW1wdFxuICAgKiBmYWlscywgdGhlIHdyaXRlcyBpdCBzdGFnZWQgbXVzdCBub3QgYmUgdmlzaWJsZSB0byB0aGUgbmV4dCBhdHRlbXB0LCBtdXN0XG4gICAqIG5vdCByZWFjaCBzaGFyZWQgc3RhdGUsIGFuZCBtdXN0IG5vdCBhcHBlYXIgaW4gdGhlIGNvbW1pdCBsb2cgb3IgaW4gdGhpc1xuICAgKiBzdGFnZSdzIHNuYXBzaG90LiBEcm9wcGluZyB0aGUgc3RhZ2luZyBzdGF0ZSBhY2hpZXZlcyBhbGwgZm91ciBhdCBvbmNlIOKAlFxuICAgKiB0aGVyZSBpcyBubyByb2xsYmFjayBtYWNoaW5lcnkgdG8gaW52b2tlIGJlY2F1c2Ugbm90aGluZyB3YXMgZXZlciBhcHBsaWVkXG4gICAqIChNMTogdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciBob2xkcyB3cml0ZXMgdW50aWwgYGNvbW1pdCgpYCBmbHVzaGVzIHRoZW0pLlxuICAgKlxuICAgKiBXaGF0IGlzIHJlbGVhc2VkLCBhbmQgd2h5IGVhY2ggb25lIG1hdHRlcnMgZm9yIHRoZSBuZXh0IGF0dGVtcHQ6XG4gICAqICAtIHRoZSByZWNvcmQgZnJhbWUncyBzdGFnZWQgc3RhdGUgKGBSZWNvcmRGcmFtZSDCtyBkaXNjYXJkYCkg4oCUIHRoZSBidWZmZXJcbiAgICogICAgICAgICAgICAgICAgICAgICh0aGUgbmV4dCBhdHRlbXB0IHN0YXJ0cyB3aXRoIG5vdGhpbmcgc3RhZ2VkKSwgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICBmaXJzdC10b3VjaCBiYXNlIChpdCByZS1hbmNob3JzIG9uIGNvbW1pdHRlZCBzdGF0ZSBhc1xuICAgKiAgICAgICAgICAgICAgICAgICAgaXQgc3RhbmRzIE5PVyDigJQgYSBzaWJsaW5nIGZvcmsgYnJhbmNoIG1heSBsZWdpdGltYXRlbHlcbiAgICogICAgICAgICAgICAgICAgICAgIGhhdmUgY29tbWl0dGVkIGluIGJldHdlZW4pIGFuZCB0aGUgcmVhZEtleXMgbGlzdCAoI1AxOlxuICAgKiAgICAgICAgICAgICAgICAgICAgYSBkaXNjYXJkZWQgYXR0ZW1wdCdzIHJlYWRzIG11c3QgbmV2ZXIgcmVhY2ggdGhlIG5leHRcbiAgICogICAgICAgICAgICAgICAgICAgIGF0dGVtcHQncyBgVHJhY2VFbnRyeS5yZWFkS2V5c2ApO1xuICAgKiAgLSBgX3N0YWdlV3JpdGVzYCAvIGBfcGVuZGluZ1dyaXRlc2AgLyBgX3N0YWdlUmVhZHNgIOKAlCB0aGUgc25hcHNob3RcbiAgICogICAgICAgICAgICAgICAgICAgIHBheWxvYWQ7IHdpdGhvdXQgdGhlIHJlc2V0IHRoZSBleGVjdXRpb24gdHJlZSB3b3VsZFxuICAgKiAgICAgICAgICAgICAgICAgICAgcmVwb3J0IHdyaXRlcyB0aGF0IHdlcmUgZGlzY2FyZGVkLCB3aGljaCBpcyB0aGUgZXhhY3RcbiAgICogICAgICAgICAgICAgICAgICAgIGxpZSB0aGlzIGZlYXR1cmUgZXhpc3RzIHRvIHByZXZlbnQgKHRoZSBwZW5kaW5nIG1hcFxuICAgKiAgICAgICAgICAgICAgICAgICAgaG9sZHMgYmFyZSByZWZlcmVuY2VzIOKAlCBkcm9wcGluZyBpdCB1bi1jbG9uZXMgbm90aGluZyk7XG4gICAqICAtIGBfdW50cmFja2VkU291cmNlc2Ag4oCUIHRoZSBEMiBob25lc3R5IG1hcmtlcnMsIHJlbGVhc2VkIHdpdGggdGhlIHJlc3QuXG4gICAqXG4gICAqIFdoYXQgaXMgZGVsaWJlcmF0ZWx5IEtFUFQ6IGBkZWJ1Z2AgKGxvZ3MsIG1ldHJpY3MsIGVycm9ycywgZmxvdyBtZXNzYWdlcylcbiAgICogYW5kIHRoZSBhdHRlbXB0IHJlY29yZHMgKDEwLjEpLiBCb3RoIGFyZSB0aGUgYXBwZW5kLW9ubHkgcmVjb3JkIG9mIHdoYXRcbiAgICogZXZlcnkgYXR0ZW1wdCBkaWQsIGFuZCB0aGUgcmV0cnkgZmVhdHVyZSdzIHdob2xlIHBvaW50IGlzIHRoYXQgdGhlIGVhcmxpZXJcbiAgICogYXR0ZW1wdHMgc3RheSB2aXNpYmxlLlxuICAgKlxuICAgKiBObyBjb21taXQgaXMgcmVjb3JkZWQgYW5kIG5vIG9ic2VydmVyIGZpcmVzIOKAlCBhIGRpc2NhcmRlZCBhdHRlbXB0IGlzIG5vdCBhXG4gICAqIGN1cnNvciBzdG9wLCBiZWNhdXNlIGZyb20gc2hhcmVkIHN0YXRlJ3MgcG9pbnQgb2YgdmlldyBpdCBuZXZlciBoYXBwZW5lZC5cbiAgICovXG4gIGRpc2NhcmRTdGFnZWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmQuZGlzY2FyZCgpO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGVuZGluZ1dyaXRlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zdGFnZVdyaXRlcyA9IHt9O1xuICAgIHRoaXMuX3N0YWdlUmVhZHMgPSB7fTtcbiAgICB0aGlzLl9uZXN0ZWRSZWFkcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl92aWV3UmVhZHMgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIAgQXR0ZW1wdHMgKDEwLjEpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBBcHBlbmQgb25lIGF0dGVtcHQncyByZWNvcmQg4oCUIHRoZSBhdHRlbXB0IHJ1bm5lciBjYWxscyB0aGlzIGFzIGVhY2ggYXR0ZW1wdCBlbmRzLiAqL1xuICByZWNvcmRBdHRlbXB0KHJlY29yZDogQXR0ZW1wdFJlY29yZCk6IHZvaWQge1xuICAgICh0aGlzLl9hdHRlbXB0cyA/Pz0gW10pLnB1c2gocmVjb3JkKTtcbiAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKCkgPT4gdGhpcy5jYXB0dXJlPy5saW1pdCgnYXR0ZW50aW9uLW9taXR0ZWQnKSkpLnJlY29yZEF0dGVtcHQoXG4gICAgICByZWNvcmQsXG4gICAgICB0aGlzLnJ1bnRpbWVTdGFnZUlkLFxuICAgICk7XG4gICAgdGhpcy5ub3RlQXR0ZW1wdChyZWNvcmQpO1xuICAgIC8vIFRoZSBzdGFnZSBhdHRlbXB0IGlzIG92ZXIsIGhvd2V2ZXIgaXQgZW5kZWQ6IHRoZSBjYWxscyBpdCBtYWRlIHN0b3AgKFAyKS5cbiAgICB0aGlzLmVuZENhbGxzKHJlY29yZC5hdHRlbXB0KTtcbiAgfVxuXG4gIC8qKiBTdGFtcCB0aGUgc2VyaWVzJyBzdW1tYXJ5IOKAlCBvbmNlLCB3aGVuIHRoZSBydW5uZXIgZW5kcyB0aGUgc2VyaWVzLiAqL1xuICBlbmRBdHRlbXB0cyhzdW1tYXJ5OiBBdHRlbXB0U3VtbWFyeSk6IHZvaWQge1xuICAgIHRoaXMuX2F0dGVtcHRTdW1tYXJ5ID0gc3VtbWFyeTtcbiAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKCkgPT4gdGhpcy5jYXB0dXJlPy5saW1pdCgnYXR0ZW50aW9uLW9taXR0ZWQnKSkpLnJlY29yZFN1bW1hcnkoc3VtbWFyeSk7XG4gIH1cblxuICAvKiogUmVzZXQgb25seSBhdCB0aGUgbm9kZSdzIGV4ZWN1dGlvbiBzdGFtcCwgbmV2ZXIgYmV0d2VlbiBhdHRlbXB0cy4gKi9cbiAgYmVnaW5BdHRlbnRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fYXR0ZW50aW9uPy5iZWdpbigpO1xuICB9XG5cbiAgLyoqIERlbGVnYXRlIHRoZSBleHBsaWNpdCByZXRhaW5lZC1lcnJvciBmYWN0OyBhdHRlbnRpb24gb3ducyB2YWxpZGF0aW9uIG9mIGl0cyBwcm9vZi4gKi9cbiAgbWFya1N0YWdlRmFpbHVyZSgpOiB2b2lkIHtcbiAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKCkgPT4gdGhpcy5jYXB0dXJlPy5saW1pdCgnYXR0ZW50aW9uLW9taXR0ZWQnKSkpLnN0YWdlRmFpbGVkKFxuICAgICAgdGhpcy5kZWJ1Zy5lcnJvckNvbnRleHQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3Jhc2gtc2FmZSByZWNvcmQgKDEwLjEsIFA2KTogYW4gYXR0ZW1wdCB0aGF0IGVuZGVkIGlzIG5vdGVkIGluIHRoZSBydW4ncyBzaW5rIEFUIE9OQ0UsIGJlc2lkZSB0aGlzIGZyYW1lJ3NcbiAgICogbG9nIOKAlCBzbyBhIHByb2Nlc3Mga2lsbGVkIGJlZm9yZSB0aGUgc3RhZ2UgY29tbWl0cyAobWlkLXJldHJ5KSBzdGlsbCBsZWF2ZXMgZXZlcnkgYXR0ZW1wdCB0aGF0IGVuZGVkLiBUaGVcbiAgICogcmVjb3JkIGlzIHRoZSBvbmUgdGhlIHRyZWUga2VlcHM6IGZyb3plbiwgYHN0cnVjdHVyZWRDbG9uZWAtc2FmZSwgaXRzIGVycm9yIHRoZSBTRVJWRUQgZm9ybSAobm8gYHJhd2ApLCBzbyB0aGVcbiAgICogbm90ZSBuZWVkcyBubyBzZWNvbmQgcmVkYWN0aW9uIHBhc3MuIFdpdGhvdXQgYSBzaW5rIHRoZSBsb2cgZG9lcyBub3RoaW5nIChgRXZlbnRMb2cgwrcgbm90ZWApLlxuICAgKi9cbiAgcHJpdmF0ZSBub3RlQXR0ZW1wdChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZC5sb2c/Lm5vdGUoJ2F0dGVtcHQnLCB7IHJlY29yZCB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgYXR0ZW1wdHMgb2YgdGhpcyBleGVjdXRpb24gc28gZmFyLCBpbiBvcmRlciDigJQgaXRzIG93biBhbmQgaXRzIGNhbGxzJzsgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZS4gKi9cbiAgZ2V0IGF0dGVtcHRzKCk6IHJlYWRvbmx5IEF0dGVtcHRSZWNvcmRbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dGVtcHRzO1xuICB9XG5cbiAgLyoqIFRoZSBlbmRlZCBzZXJpZXMnIHN1bW1hcnk7IGB1bmRlZmluZWRgIHdoaWxlIGl0IHJ1bnMgYW5kIHdpdGhvdXQgYSBwb2xpY3kuICovXG4gIGdldCBhdHRlbXB0U3VtbWFyeSgpOiBBdHRlbXB0U3VtbWFyeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dGVtcHRTdW1tYXJ5O1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0IGFib3V0IHRvIHJ1biAoYW5kIHRoZSBydW4ncyBzaWduYWwpIOKAlCBgU3RhZ2VSdW5uZXJgIHNldHMgYm90aCBiZWZvcmUgaXQgYnVpbGRzIHRoZSBzY29wZS4gKi9cbiAgdXNlQXR0ZW1wdChhdHRlbXB0OiBBdHRlbXB0Q29udGV4dCB8IHVuZGVmaW5lZCwgcnVuU2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuc291cmNlQXR0ZW1wdCA9XG4gICAgICBhdHRlbXB0ICYmIHRoaXMuI2ZhaWx1cmVJZGVudGl0eVxuICAgICAgICA/IGJ1aWxkQXR0ZW1wdElkKHRoaXMuI2ZhaWx1cmVJZGVudGl0eS5ydW50aW1lU3RhZ2VJZCwgYXR0ZW1wdC5hdHRlbXB0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9hdHRlbXB0ID0gYXR0ZW1wdDtcbiAgICB0aGlzLl9ydW5TaWduYWwgPSBydW5TaWduYWw7XG4gIH1cblxuICAvKiogVGhlIGF0dGVtcHQgbm93IHJ1bm5pbmc7IGB1bmRlZmluZWRgIGZvciBhIHN0YWdlIHRoZSBhdHRlbXB0IHJ1bm5lciBkb2VzIG5vdCBydW4uICovXG4gIGdldCBhdHRlbXB0KCk6IEF0dGVtcHRDb250ZXh0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYXR0ZW1wdDtcbiAgfVxuXG4gIC8qKiBUaGUgcnVuJ3Mgc2lnbmFsLCBhcyBgU3RhZ2VSdW5uZXJgIGxhc3Qgc2F3IGl0LiAqL1xuICBnZXQgcnVuU2lnbmFsKCk6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuU2lnbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgYGF0dGVtcHRgIGVuZGVkIHdpdGhvdXQgYW4gYW5zd2VyOiBmcm9tIG5vdyBvbiBpdHMgc2NvcGUgaXMgZmVuY2VkIOKAlCBhIHdyaXRlLCBhbiBlbWl0IG9yIGEgcmVhZFxuICAgKiB0aHJvdWdoIGl0IGlzIHJlZnVzZWQgKGBTY29wZUZhY2FkZWApLiBUaGUgcnVubmVyIGNhbGxzIHRoaXMgdGhlIG1vbWVudCB0aGUgYXR0ZW1wdCdzIHNpZ25hbCBhYm9ydHMuXG4gICAqL1xuICBlbmRBdHRlbXB0KGF0dGVtcHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hdHRlbXB0Py5hdHRlbXB0ID09PSBhdHRlbXB0KSB0aGlzLnNvdXJjZUF0dGVtcHQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGF0dGVtcHQgPiB0aGlzLl9lbmRlZFRocm91Z2gpIHRoaXMuX2VuZGVkVGhyb3VnaCA9IGF0dGVtcHQ7XG4gICAgLy8gSXRzIGNhbGxzIHN0b3AgYXQgdGhlIHNhbWUgbW9tZW50LCB3aXRoIHRoZSBhdHRlbXB0J3Mgb3duIHJlYXNvbiB3aGVuIGl0cyBzaWduYWwgYWJvcnRlZCAoYSBjYXAgb3IgdGhlXG4gICAgLy8gZGVhZGxpbmUgaXMgYSB0aW1lIGxpbWl0OiBhIGNhbGwgaXQgY3V0cyB0aW1lZCBvdXQpIOKAlCBzeW5jaHJvbm91cywgYWhlYWQgb2YgdGhlIGNhbGxzJyBvd24gbGlzdGVuZXJzLlxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9hdHRlbXB0O1xuICAgIGNvbnN0IHNpZ25hbCA9IGN1cnJlbnQgIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50LmF0dGVtcHQgPT09IGF0dGVtcHQgPyBjdXJyZW50LnNpZ25hbCA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVuZENhbGxzKGF0dGVtcHQsIHNpZ25hbD8uYWJvcnRlZCA/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYXR0ZW1wdCBgYXR0ZW1wdGAgaGFzIGVuZGVkIOKAlCBpdHMgc2NvcGUgbWF5IG5vIGxvbmdlciB0b3VjaCB0aGUgc3RhZ2UuICovXG4gIGhhc0F0dGVtcHRFbmRlZChhdHRlbXB0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXR0ZW1wdCA8PSB0aGlzLl9lbmRlZFRocm91Z2g7XG4gIH1cblxuICAvKiogUmVjb3JkIGEgd3JpdGUgYW4gZW5kZWQgYXR0ZW1wdCB0cmllZCDigJQgYSBuYW1lLCBuZXZlciB0aGUgdmFsdWUuIEFwcGVuZC1vbmx5IGV2aWRlbmNlIGxpa2UgdGhlIGF0dGVtcHRzLiAqL1xuICByZWNvcmRMYXRlV3JpdGUod3JpdGU6IExhdGVXcml0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHdyaXRlcyA9ICh0aGlzLl9sYXRlV3JpdGVzID8/PSBbXSk7XG4gICAgLy8gQm91bmRlZDogdGhlIGZpcnN0IG9uZXMgc2F5IHdoYXQgdGhlIGFiYW5kb25lZCBhdHRlbXB0IGtlcHQgZG9pbmc7IGEgbG9vcCBvZiB0aGVtIGFkZHMgbm90aGluZy5cbiAgICBpZiAod3JpdGVzLmxlbmd0aCA8IE1BWF9MQVRFX1dSSVRFUykgd3JpdGVzLnB1c2goT2JqZWN0LmZyZWV6ZSh7IC4uLndyaXRlIH0pKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTaWRlIGVmZmVjdHMgKFAzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogVGhpcyBleGVjdXRpb24ncyBvd24gaWRlbXBvdGVuY3kga2V5IG1heSBiZSBtYWRlIG9mIGEgc2VsZWN0ZWQgdmFsdWUgKG9yIHdhcyBjYXJyaWVkIGJ5IGEgY2hlY2twb2ludCkuICovXG4gIHByaXZhdGUgX2VmZmVjdEtleVRhaW50ZWQgPSBmYWxzZTtcbiAgLyoqIEEgdG91Y2hpbmcgYCRjYWxsYCB3aXRoIE5PIGtleSBzdGFydGVkIGluIHRoaXMgZXhlY3V0aW9uIOKAlCB0aGUgc3RhZ2UgbWF5IG5vdCBiZSByZS1ydW4gYnkgYSByZXN1bWUuICovXG4gIHByaXZhdGUgX2tleWxlc3NFZmZlY3QgPSBmYWxzZTtcblxuICAvKipcbiAgICogU3RhcnQgYW4gZXhlY3V0aW9uJ3Mgc2lkZS1lZmZlY3QgYm9va2tlZXBpbmcgKGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCwgYmVmb3JlIGF0dGVtcHQgMSkg4oCUIHJlc2V0LFxuICAgKiBiZWNhdXNlIGEgZnJhbWUgY2FuIGJlIHJlLXVzZWQgYnkgYSBsYXRlciBleGVjdXRpb24uIGBrZXlUYWludGVkYDogdGhlIHN0YWdlJ3Mgb3duIGtleSBtYXkgYmUgbWFkZSBvZiBhIHNlbGVjdGVkXG4gICAqIHZhbHVlLCBzbyBhIGtleSBhIGAkY2FsbGAgcGFzc2VzIG9uIChgJGF0dGVtcHQoKS5pZGVtcG90ZW5jeUtleWApIGlzIHNlcnZlZCB0aGUgc2FtZSB3YXkuXG4gICAqL1xuICBiZWdpbkVmZmVjdHMoa2V5VGFpbnRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2VmZmVjdEtleVRhaW50ZWQgPSBrZXlUYWludGVkO1xuICAgIHRoaXMuX2tleWxlc3NFZmZlY3QgPSBmYWxzZTtcbiAgfVxuXG4gIGdldCBlZmZlY3RLZXlUYWludGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lZmZlY3RLZXlUYWludGVkO1xuICB9XG5cbiAgLyoqIEEga2V5bGVzcyB0b3VjaGluZyBgJGNhbGxgIHN0YXJ0ZWQ6IGFuIGBpbnRlcnJ1cHQoKWAgYWZ0ZXIgaXQgd291bGQgcmUtc2VuZCBpdCBvbiByZXN1bWUgKGBTdGFnZVJ1bm5lcmApLiAqL1xuICBtYXJrS2V5bGVzc0VmZmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9rZXlsZXNzRWZmZWN0ID0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBoYXNLZXlsZXNzRWZmZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9rZXlsZXNzRWZmZWN0O1xuICB9XG5cbiAgLy8g4pSA4pSAIENhbGxzIG1hZGUgaW5zaWRlIHRoZSBzdGFnZSAoUDIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBXaGVyZSB0aGlzIGV4ZWN1dGlvbidzIGNhbGwgcmVjb3JkcyBhcmUgcmVwb3J0ZWQg4oCUIHRoZSBlbmdpbmUgc2V0cyBpdCBiZWZvcmUgdGhlIHN0YWdlIHJ1bnMuICovXG4gIHVzZUF0dGVtcHRSZXBvcnRlcihcbiAgICByZXBvcnQ6ICgocmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8gfCB1bmRlZmluZWQpID0+IHZvaWQpIHwgdW5kZWZpbmVkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9hdHRlbXB0UmVwb3J0ZXIgPSByZXBvcnQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpZ25hbCB0aGUgY2FsbHMgb2Ygc3RhZ2UgYXR0ZW1wdCBgc3RhZ2VBdHRlbXB0YCBydW4gdW5kZXIgYmVzaWRlcyBpdHMgb3duIChQMik6IGFib3J0ZWQgd2hlbiB0aGF0IGF0dGVtcHQgaXNcbiAgICogb3ZlciDigJQgaG93ZXZlciBpdCBlbmRlZCDigJQgYW5kIHdoZW4gdGhlIGZyYW1lIGNvbW1pdHMsIHNvIG5vIGNhbGwgb3V0bGl2ZXMgdGhlIGF0dGVtcHQgdGhhdCBtYWRlIGl0IChub1xuICAgKiBiYWNrZ3JvdW5kIHJldHJ5LCBubyB3YWl0LCBubyBsaXN0ZW5lciBsZWZ0IG9uIHRoZSBydW4ncyBzaWduYWwpLiBBbHJlYWR5IGFib3J0ZWQgYWZ0ZXIgdGhlIGNvbW1pdC5cbiAgICovXG4gIGNhbGxzRW5kZWRTaWduYWwoc3RhZ2VBdHRlbXB0OiBudW1iZXIpOiBBYm9ydFNpZ25hbCB7XG4gICAgY29uc3QgZW5kZWQgPSAodGhpcy5fY2FsbHNFbmRlZCA/Pz0gbmV3IE1hcCgpKTtcbiAgICBsZXQgY29udHJvbGxlciA9IGVuZGVkLmdldChzdGFnZUF0dGVtcHQpO1xuICAgIGlmIChjb250cm9sbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBlbmRlZC5zZXQoc3RhZ2VBdHRlbXB0LCBjb250cm9sbGVyKTtcbiAgICAgIGlmICh0aGlzLl9jb21taXR0ZWQpIGNvbnRyb2xsZXIuYWJvcnQoY2FsbHNFbmRlZFJlYXNvbigpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuc2lnbmFsO1xuICB9XG5cbiAgLyoqIEVuZCB0aGUgY2FsbHMgb2YgYHN0YWdlQXR0ZW1wdGAgKGV2ZXJ5IGF0dGVtcHQncyB3aGVuIGB1bmRlZmluZWRgKSDigJQgYHJlYXNvbmAgd2hlbiB0aGUgYXR0ZW1wdCdzIHNpZ25hbCBnYXZlIG9uZS4gKi9cbiAgcHJpdmF0ZSBlbmRDYWxscyhzdGFnZUF0dGVtcHQ6IG51bWJlciB8IHVuZGVmaW5lZCwgcmVhc29uPzogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jYWxsc0VuZGVkID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IFthdHRlbXB0LCBjb250cm9sbGVyXSBvZiB0aGlzLl9jYWxsc0VuZGVkKSB7XG4gICAgICBpZiAoc3RhZ2VBdHRlbXB0ICE9PSB1bmRlZmluZWQgJiYgYXR0ZW1wdCAhPT0gc3RhZ2VBdHRlbXB0KSBjb250aW51ZTtcbiAgICAgIGlmICghY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY29udHJvbGxlci5hYm9ydChyZWFzb24gPz8gY2FsbHNFbmRlZFJlYXNvbigpKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIG5leHQgY2FsbCdzIG9yZGluYWwgd2l0aGluIHN0YWdlIGF0dGVtcHQgYHN0YWdlQXR0ZW1wdGAsIDEtYmFzZWQgKGBhdHRlbXB0L2NhbGwudHMgwrcgY2FsbFNlcmllc2ApLiAqL1xuICBuZXh0Q2FsbE9yZGluYWwoc3RhZ2VBdHRlbXB0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG9yZGluYWxzID0gKHRoaXMuX2NhbGxPcmRpbmFscyA/Pz0gbmV3IE1hcCgpKTtcbiAgICBjb25zdCBuZXh0ID0gKG9yZGluYWxzLmdldChzdGFnZUF0dGVtcHQpID8/IDApICsgMTtcbiAgICBvcmRpbmFscy5zZXQoc3RhZ2VBdHRlbXB0LCBuZXh0KTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNhbGwncyAob3IgYW4gb2JzZXJ2ZWQpIGF0dGVtcHQgcmVjb3JkOiBrZXB0IGJlc2lkZSB0aGUgc3RhZ2UncyBvd24gYXR0ZW1wdHMg4oCUIHRoZSBmaXJzdFxuICAgKiB7QGxpbmsgTUFYX0NBTExfUkVDT1JEU30sIHRoZSByZXN0IGNvdW50ZWQg4oCUIGFuZCByZXBvcnRlZCB0byB0aGUgcnVuJ3MgYG9uQXR0ZW1wdGAgZWl0aGVyIHdheS4gTGlrZSB0aGUgc3RhZ2Unc1xuICAgKiByZWNvcmRzLCBOT1QgY2xlYXJlZCBieSB7QGxpbmsgZGlzY2FyZFN0YWdlZH06IGEgZmFpbGVkIGF0dGVtcHQncyBjYWxscyBhcmUgZXZpZGVuY2UgdG9vLlxuICAgKi9cbiAgcmVwb3J0Q2FsbEF0dGVtcHQocmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2FsbFJlY29yZHMgPCBNQVhfQ0FMTF9SRUNPUkRTKSB7XG4gICAgICB0aGlzLl9jYWxsUmVjb3JkcyArPSAxO1xuICAgICAgKHRoaXMuX2F0dGVtcHRzID8/PSBbXSkucHVzaChyZWNvcmQpO1xuICAgICAgKHRoaXMuX2F0dGVudGlvbiA/Pz0gbmV3IFN0YWdlQXR0ZW50aW9uKCgpID0+IHRoaXMuY2FwdHVyZT8ubGltaXQoJ2F0dGVudGlvbi1vbWl0dGVkJykpKS5yZWNvcmRBdHRlbXB0KFxuICAgICAgICByZWNvcmQsXG4gICAgICAgIHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgICApO1xuICAgICAgdGhpcy5ub3RlQXR0ZW1wdChyZWNvcmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hdHRlbXB0c0Ryb3BwZWQgKz0gMTtcbiAgICAgICh0aGlzLl9hdHRlbnRpb24gPz89IG5ldyBTdGFnZUF0dGVudGlvbigoKSA9PiB0aGlzLmNhcHR1cmU/LmxpbWl0KCdhdHRlbnRpb24tb21pdHRlZCcpKSkuYXR0ZW1wdERyb3BwZWQoKTtcbiAgICB9XG4gICAgdGhpcy5fYXR0ZW1wdFJlcG9ydGVyPy4ocmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3IpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRyZWUgbmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3JlYXRlIChvciByZXR1cm4pIHRoaXMgY29udGV4dCdzIGxpbmtlZCBzdWNjZXNzb3IuXG4gICAqXG4gICAqIE1FTU9JWkVEOiB0aGUgZmlyc3QgY2FsbCBjcmVhdGVzIGB0aGlzLm5leHRgOyBldmVyeSBsYXRlciBjYWxsIHJldHVybnNcbiAgICogdGhhdCBTQU1FIGNvbnRleHQgYW5kIElHTk9SRVMgaXRzIGFyZ3VtZW50cy4gSW4gbm9ybWFsIHRyYXZlcnNhbCBlYWNoXG4gICAqIGNvbnRleHQgYWR2YW5jZXMgZXhhY3RseSBvbmNlLCBzbyB0aGUgbWVtbyBuZXZlciBiaXRlcyDigJQgYnV0IGEgY2FsbGVyXG4gICAqIGV4cGVjdGluZyBhIGZyZXNoIGNvbnRleHQgZm9yIGRpZmZlcmVudCBgc3RhZ2VOYW1lYC9gc3RhZ2VJZGAgYXJncyBnZXRzXG4gICAqIHRoZSBvbGQgb25lIHNpbGVudGx5LiBEZXYgbW9kZSAoYGVuYWJsZURldk1vZGUoKWApIHdhcm5zIG9uIHRoYXRcbiAgICogbWlzbWF0Y2ggKGJhY2tsb2cgQjQpLlxuICAgKi9cbiAgY3JlYXRlTmV4dChwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMubmV4dCkge1xuICAgICAgdGhpcy5uZXh0ID0gbmV3IFN0YWdlQ29udGV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMucmVjb3JkLnN0YXRlLCAnJywgdGhpcy5yZWNvcmQubG9nLCBpc0RlY2lkZXIpO1xuICAgICAgdGhpcy5uZXh0LnBhcmVudCA9IHRoaXM7XG4gICAgICB0aGlzLm5leHQuaW5oZXJpdFJ1bih0aGlzKTtcbiAgICAgIHRoaXMubmV4dC5mYWlsdXJlU3RhdGUgPSB0aGlzLmZhaWx1cmVTdGF0ZTtcbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpICYmICh0aGlzLm5leHQuc3RhZ2VJZCAhPT0gc3RhZ2VJZCB8fCB0aGlzLm5leHQuc3RhZ2VOYW1lICE9PSBzdGFnZU5hbWUpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gU3RhZ2VDb250ZXh0LmNyZWF0ZU5leHQ6IG5leHQgY29udGV4dCBhbHJlYWR5IGV4aXN0cyBhcyBcIiR7dGhpcy5uZXh0LnN0YWdlTmFtZX1cIiBgICtcbiAgICAgICAgICBgKGlkOiBcIiR7dGhpcy5uZXh0LnN0YWdlSWR9XCIpIOKAlCBhcmd1bWVudHMgXCIke3N0YWdlTmFtZX1cIiAoaWQ6IFwiJHtzdGFnZUlkfVwiKSBhcmUgaWdub3JlZCBgICtcbiAgICAgICAgICAnYW5kIHRoZSBleGlzdGluZyBjb250ZXh0IGlzIHJldHVybmVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZXh0O1xuICB9XG5cbiAgY3JlYXRlQ2hpbGQocnVuSWQ6IHN0cmluZywgYnJhbmNoSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5jaGlsZHJlbikge1xuICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IG5ldyBTdGFnZUNvbnRleHQocnVuSWQsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5yZWNvcmQuc3RhdGUsIGJyYW5jaElkLCB0aGlzLnJlY29yZC5sb2csIGlzRGVjaWRlcik7XG4gICAgY2hpbGQucGFyZW50ID0gdGhpcztcbiAgICBjaGlsZC5pbmhlcml0UnVuKHRoaXMpO1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgY3JlYXRlRGVjaWRlcihwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcpOiBTdGFnZUNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5leHQocGF0aCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0cnVlKTtcbiAgfVxuXG4gIHNldEFzRGVjaWRlcigpOiBTdGFnZUNvbnRleHQge1xuICAgIHRoaXMuaXNEZWNpZGVyID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEFzRm9yaygpOiBTdGFnZUNvbnRleHQge1xuICAgIHRoaXMuaXNGb3JrID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBEaWFnbm9zdGljcyBkZWxlZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBAaW50ZXJuYWwgUmV0YWluZWQgaW5jb21pbmcgdmFsdWUgZm9yIHRoZSBmYWNhZGUncyBsZWdhY3kgZW1pdCBjaGFubmVsLiAqL1xuICBhZGREaWFnbm9zdGljKGNoYW5uZWw6IERpYWdub3N0aWNDaGFubmVsLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLmRlYnVnLmFkZChjaGFubmVsLCBrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZExvZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTG9nKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRNZXRyaWMoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZE1ldHJpYyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0TWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkRXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldEV2YWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldEV2YWwoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFcnJvcihrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkRXJyb3Ioa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRGbG93RGVidWdNZXNzYWdlKFxuICAgIHR5cGU6IEZsb3dDb250cm9sVHlwZSxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IHRhcmdldFN0YWdlPzogc3RyaW5nIHwgc3RyaW5nW107IHJhdGlvbmFsZT86IHN0cmluZzsgY291bnQ/OiBudW1iZXI7IGl0ZXJhdGlvbj86IG51bWJlciB9LFxuICApIHtcbiAgICBjb25zdCBmbG93TWVzc2FnZTogRmxvd01lc3NhZ2UgPSB7IHR5cGUsIGRlc2NyaXB0aW9uLCB0aW1lc3RhbXA6IERhdGUubm93KCksIC4uLm9wdGlvbnMgfTtcbiAgICB0aGlzLmRlYnVnLmFkZEZsb3dNZXNzYWdlKGZsb3dNZXNzYWdlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTbmFwc2hvdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXRTdGFnZUlkKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnJ1bklkIHx8IHRoaXMucnVuSWQgPT09ICcnKSByZXR1cm4gdGhpcy5zdGFnZU5hbWU7XG4gICAgcmV0dXJuIGAke3RoaXMucnVuSWR9LiR7dGhpcy5zdGFnZU5hbWV9YDtcbiAgfVxuXG4gIGdldFNuYXBzaG90KCk6IFN0YWdlU25hcHNob3Qge1xuICAgIC8vIEl0ZXJhdGl2ZSB3YWxrIChleHBsaWNpdCB3b3JrIHN0YWNrKSwgTk9UIHJlY3Vyc2lvbjogdGhlIGV4ZWN1dGlvblxuICAgIC8vIHRyZWUgZGVlcGVucyBieSBvbmUgbGV2ZWwgcGVyIGV4ZWN1dGVkIHN0YWdlIGFsb25nIGBuZXh0YCBjaGFpbnMsIGFuZFxuICAgIC8vIHRoZSB0cmFtcG9saW5lZCB0cmF2ZXJzZXIgYWxsb3dzIGNoYWlucy9sb29wcyBvZiB0ZW5zIG9mIHRob3VzYW5kcyBvZlxuICAgIC8vIHN0YWdlcyDigJQgZmFyIGRlZXBlciB0aGFuIGEgcmVjdXJzaXZlIHNlcmlhbGl6ZXIgY2FuIHdhbGsgYmVmb3JlXG4gICAgLy8gXCJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnNuYXBzaG90U2VsZigpO1xuICAgIGNvbnN0IHdvcms6IEFycmF5PHsgY3R4OiBTdGFnZUNvbnRleHQ7IHNuYXA6IFN0YWdlU25hcHNob3QgfT4gPSBbeyBjdHg6IHRoaXMsIHNuYXA6IHJvb3QgfV07XG4gICAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBjdHgsIHNuYXAgfSA9IHdvcmsucG9wKCkhO1xuICAgICAgaWYgKGN0eC5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG5leHRTbmFwID0gY3R4Lm5leHQuc25hcHNob3RTZWxmKCk7XG4gICAgICAgIHNuYXAubmV4dCA9IG5leHRTbmFwO1xuICAgICAgICB3b3JrLnB1c2goeyBjdHg6IGN0eC5uZXh0LCBzbmFwOiBuZXh0U25hcCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjdHguY2hpbGRyZW4pIHtcbiAgICAgICAgc25hcC5jaGlsZHJlbiA9IGN0eC5jaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGRTbmFwID0gY2hpbGQuc25hcHNob3RTZWxmKCk7XG4gICAgICAgICAgd29yay5wdXNoKHsgY3R4OiBjaGlsZCwgc25hcDogY2hpbGRTbmFwIH0pO1xuICAgICAgICAgIHJldHVybiBjaGlsZFNuYXA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKiBTbmFwc2hvdCBvZiBUSElTIGNvbnRleHQncyBvd24gZmllbGRzIOKAlCBgbmV4dGAvYGNoaWxkcmVuYCBhcmUgZmlsbGVkXG4gICAqICBpbiBieSB0aGUgaXRlcmF0aXZlIHdhbGsgaW4gYGdldFNuYXBzaG90YC4gKi9cbiAgcHJpdmF0ZSBzbmFwc2hvdFNlbGYoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3Q6IFN0YWdlU25hcHNob3QgPSB7XG4gICAgICBpZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQgfHwgdW5kZWZpbmVkLFxuICAgICAgbmFtZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBpc0RlY2lkZXI6IHRoaXMuaXNEZWNpZGVyLFxuICAgICAgaXNGb3JrOiB0aGlzLmlzRm9yayxcbiAgICAgIGxvZ3M6IHRoaXMuZGVidWcubG9nQ29udGV4dCxcbiAgICAgIGVycm9yczogdGhpcy5kZWJ1Zy5lcnJvckNvbnRleHQsXG4gICAgICBtZXRyaWNzOiB0aGlzLmRlYnVnLm1ldHJpY0NvbnRleHQsXG4gICAgICBldmFsczogdGhpcy5kZWJ1Zy5ldmFsQ29udGV4dCxcbiAgICB9O1xuICAgIGNvbnN0IHN0YWdlV3JpdGVzID0gdGhpcy5yZXRhaW5lZFdyaXRlcygpO1xuICAgIGlmIChPYmplY3Qua2V5cyhzdGFnZVdyaXRlcykubGVuZ3RoID4gMCkge1xuICAgICAgLy8gRXh0cmFjdCB2YWx1ZXMgb25seSBmb3IgdGhlIHNuYXBzaG90IChzdHJpcCBvcGVyYXRpb24gbWV0YWRhdGEpXG4gICAgICBjb25zdCB3cml0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtrLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoc3RhZ2VXcml0ZXMpKSB7XG4gICAgICAgIHdyaXRlc1trXSA9IGVudHJ5LnZhbHVlO1xuICAgICAgfVxuICAgICAgc25hcHNob3Quc3RhZ2VXcml0ZXMgPSB3cml0ZXM7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zdGFnZVJlYWRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5zdGFnZVJlYWRzID0gdGhpcy5fc3RhZ2VSZWFkcztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcbiAgICAgIHNuYXBzaG90LmRlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3ViZmxvd0lkKSB7XG4gICAgICBzbmFwc2hvdC5zdWJmbG93SWQgPSB0aGlzLnN1YmZsb3dJZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVidWcuZmxvd01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LmZsb3dNZXNzYWdlcyA9IHRoaXMuZGVidWcuZmxvd01lc3NhZ2VzO1xuICAgIH1cbiAgICAvLyBBIGNvcHkgb2YgdGhlIGxpc3QgKHRoZSByZWNvcmRzIHRoZW1zZWx2ZXMgYXJlIGZyb3plbik6IGEgcmVhZGVyIG9mIG9uZSBzbmFwc2hvdCBuZXZlciBzZWVzIGEgbGF0ZXJcbiAgICAvLyBhdHRlbXB0IGFycml2ZSBpbiBpdCwgYW5kIG5ldmVyIGVkaXRzIHRoZSBmcmFtZSdzIG93biBsaXN0LlxuICAgIGlmICh0aGlzLl9hdHRlbXB0cykgc25hcHNob3QuYXR0ZW1wdHMgPSBPYmplY3QuZnJlZXplKFsuLi50aGlzLl9hdHRlbXB0c10pO1xuICAgIGlmICh0aGlzLl9hdHRlbXB0U3VtbWFyeSkgc25hcHNob3QuYXR0ZW1wdFN1bW1hcnkgPSB0aGlzLl9hdHRlbXB0U3VtbWFyeTtcbiAgICBpZiAodGhpcy5fbGF0ZVdyaXRlcykgc25hcHNob3QubGF0ZVdyaXRlcyA9IE9iamVjdC5mcmVlemUoWy4uLnRoaXMuX2xhdGVXcml0ZXNdKTtcbiAgICBpZiAodGhpcy5fYXR0ZW1wdHNEcm9wcGVkID4gMCkgc25hcHNob3QuYXR0ZW1wdHNEcm9wcGVkID0gdGhpcy5fYXR0ZW1wdHNEcm9wcGVkO1xuICAgIGNvbnN0IGF0dGVudGlvbiA9IHRoaXMuX2F0dGVudGlvbj8uc25hcHNob3QoKTtcbiAgICBpZiAoYXR0ZW50aW9uPy5sZW5ndGgpIHNuYXBzaG90LmF0dGVudGlvbiA9IGF0dGVudGlvbjtcbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cbn1cbiJdfQ==
1214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUdILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSzlDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUErQixrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RyxPQUFPLEVBQTBCLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHdkYsT0FBTyxFQUNMLEtBQUssRUFDTCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLG1IQUFtSDtBQUNuSCxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFFNUI7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixH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QUFlLENBQUM7UUFDekUsSUFBSSxJQUFJLENBQUMsV0FBVztZQUFFLFFBQVEsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDakYsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQztZQUFFLFFBQVEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ2hGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDOUMsSUFBSSxTQUFTLEVBQUUsTUFBTTtZQUFFLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3RELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RhZ2VDb250ZXh0IOKAlCBFeGVjdXRpb24gY29udGV4dCBmb3IgYSBzaW5nbGUgc3RhZ2UgaW4gYSBmbG93Y2hhcnQgcnVuXG4gKlxuICogTGlrZSBhIHN0YWNrIGZyYW1lIGluIGEgY29tcGlsZXIvcnVudGltZTpcbiAqIC0gQSBSZWNvcmRGcmFtZSDigJQgdGhlIHJlY29yZCBoYWxmIChDMyk6IHRoZSBoZWFwLCB0aGUgYWRkcmVzcywgdGhlXG4gKiAgIGZpcnN0LXRvdWNoIGJhc2UsIHRoZSBsYXp5IHRyYW5zYWN0aW9uIGJ1ZmZlciBhbmQgZXZlcnkgd3JpdGUncyBzY3J1YlxuICogICAoQzQpLCB0aGUgcmVhZEtleXMgbGlzdFxuICogLSBMaW5rcyB0byBwYXJlbnQvY2hpbGQvbmV4dCBjb250ZXh0cyAoY2FsbCBzdGFjayBmcmFtZXMpXG4gKiAtIFdoYXQgYmVsb25ncyB0byBhIHN0YWdlIGluc2lkZSBhIHJ1bjogcmV0ZW50aW9uIG9mIHJlYWRzIGFuZCB3cml0ZXMsIHRoZVxuICogICByZWRhY3Rpb24gZGVjaXNpb24gcGVyIHdyaXRlIChgcmVkYWN0aW9uLnRzIMK3IGRlY2lkZVdyaXRlYCkgYW5kIHdoZXJlIHRoZVxuICogICBmcmFtZSB3cml0ZXMgKGBydW5BZGRyZXNzLnRzYCksIHRoZSBkZXYtbW9kZSB3YXJuaW5ncywgdGhlIGNvbW1pdCBvYnNlcnZlclxuICogLSBEaWFnbm9zdGljQ29sbGVjdG9yIGZvciBsb2dzLCBlcnJvcnMsIG1ldHJpY3NcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdFBoYXNlLCBFbWl0U291cmNlUG9zaXRpb24sIFVudHJhY2tlZFNvdXJjZSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgeyBidWlsZEF0dGVtcHRJZCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50TG9nLCBTaGFyZWRNZW1vcnksIFdyaXRlVmVyYiB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5pbXBvcnQgeyBSZWNvcmRGcmFtZSB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgQXR0ZW1wdENvbnRleHQsIEF0dGVtcHRSZWNvcmQsIEF0dGVtcHRTdW1tYXJ5LCBMYXRlV3JpdGUgfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTmF0aXZlQ2FwdHVyZSB9IGZyb20gJy4uL2NhcHR1cmUvbmF0aXZlQ292ZXJhZ2UuanMnO1xuaW1wb3J0IHR5cGUgeyBFbmdpbmVSZWFkU291cmNlQ2FwdHVyZSB9IGZyb20gJy4uL2NhcHR1cmUvcmVhZFNvdXJjZXMuanMnO1xuaW1wb3J0IHsgRU1QVFlfU09VUkNFX1JFQURfQ09VTlRTLCBTb3VyY2VSZWFkQ291bnRlciB9IGZyb20gJy4uL2NhcHR1cmUvc291cmNlUmVhZENvdW50cy5qcyc7XG5pbXBvcnQgeyBzdW1tYXJpemVSZWFkVmFsdWUsIHN1bW1hcml6ZVdyaXRlVmFsdWUgfSBmcm9tICcuLi9jYXB0dXJlL3N1bW1hcml6ZS5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgU3RydWN0dXJlZEVycm9ySW5mbyB9IGZyb20gJy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgdHlwZSBUZXJtaW5hbEZhaWx1cmVDb250ZXh0LCBOYXRpdmVGYWlsdXJlU3RhdGUgfSBmcm9tICcuLi9lcnJvcnMvdGVybWluYWxGYWlsdXJlLmpzJztcbmltcG9ydCB7IFN0YWdlQXR0ZW50aW9uIH0gZnJvbSAnLi9hdHRlbnRpb24uanMnO1xuaW1wb3J0IHsgYm9ycm93ZWRNdXRhdGlvbk1lc3NhZ2UsIGNvbW1pdHRlZE11dGF0aW9uTWVzc2FnZSwgZmlyc3REaWZmZXJpbmdQYXRoIH0gZnJvbSAnLi9ib3Jyb3dlZE11dGF0aW9uLmpzJztcbmltcG9ydCB7IHR5cGUgRGlhZ25vc3RpY0NoYW5uZWwsIERpYWdub3N0aWNDb2xsZWN0b3IgfSBmcm9tICcuL0RpYWdub3N0aWNDb2xsZWN0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Q29udHJvbFR5cGUsIEZsb3dNZXNzYWdlLCBSZWFkVHJhY2tpbmdNb2RlLCBTdGFnZVNuYXBzaG90LCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4vZnJhbWVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblZlcmRpY3QgfSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQge1xuICBDTEVBUixcbiAgZGVjaWRlV3JpdGUsXG4gIGluaGVyaXRCeUlkZW50aXR5LFxuICBtYXJrU3RhZ2VkV3JpdGUsXG4gIFJlZGFjdGlvblJ1bGUsXG4gIFNDT1BFX1BMQUNFSE9MREVSLFxuICBzY3J1Yk9mLFxuICB1c2VyS2V5T2YsXG59IGZyb20gJy4vcmVkYWN0aW9uLmpzJztcbmltcG9ydCB7IHJ1bkFkZHJlc3MgfSBmcm9tICcuL3J1bkFkZHJlc3MuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuL3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1JVTl9QT0xJQ1ksIHdpdGhSZWRhY3Rpb24gfSBmcm9tICcuL3J1blBvbGljeS5qcyc7XG5cbi8qKiBIb3cgbWFueSBsYXRlIHdyaXRlcyBhIHN0YWdlIGtlZXBzIOKAlCBhbiBhYmFuZG9uZWQgYXR0ZW1wdCB0aGF0IGxvb3BzIG11c3Qgbm90IGdyb3cgdGhlIHJlY29yZCB3aXRob3V0IGJvdW5kLiAqL1xuY29uc3QgTUFYX0xBVEVfV1JJVEVTID0gMTAwO1xuXG4vKipcbiAqIEhvdyBtYW55IGNhbGwgYW5kIG9ic2VydmVkIGF0dGVtcHQgcmVjb3JkcyBvbmUgc3RhZ2UgZXhlY3V0aW9uIGtlZXBzIChQMikg4oCUIGEgc3RhZ2UgdGhhdCBjYWxscyBpbiBhIGxvb3AgbXVzdFxuICogbm90IGdyb3cgdGhlIGV4ZWN1dGlvbiB0cmVlIHdpdGhvdXQgYm91bmQuIFRoZSByZXN0IGFyZSBjb3VudGVkIChgU3RhZ2VTbmFwc2hvdC5hdHRlbXB0c0Ryb3BwZWRgKSBhbmQgc3RpbGxcbiAqIGZpcmVkIG9uIGBvbkF0dGVtcHRgLiBBIHN0YWdlJ3MgT1dOIGF0dGVtcHQgcmVjb3JkcyBhcmUgbmV2ZXIgZGlzcGxhY2VkOiBpdHMgcG9saWN5J3MgY2VpbGluZyBib3VuZHMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9DQUxMX1JFQ09SRFMgPSAxMDAwO1xuXG4vKiogV2h5IGEgY2FsbCBzdG9wcGVkIHdoZW4gdGhlIHN0YWdlIGF0dGVtcHQgdGhhdCBtYWRlIGl0IGVuZGVkIHdpdGhvdXQgYSByZWFzb24gb2YgaXRzIG93biAoaXQgcmV0dXJuZWQgb3IgdGhyZXcpLiAqL1xuZnVuY3Rpb24gY2FsbHNFbmRlZFJlYXNvbigpOiBFcnJvciB7XG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgJ1tmb290cHJpbnRdICRjYWxsOiB0aGUgc3RhZ2UgYXR0ZW1wdCB0aGF0IG1hZGUgdGhpcyBjYWxsIGhhcyBlbmRlZCDigJQgdGhlIGNhbGwgc3RvcHMsIGFuZCBub3RoaW5nIGl0IHJlY29yZHMgJyArXG4gICAgICAnbGFuZHMgb24gdGhlIHN0YWdlLiBBd2FpdCBldmVyeSBjYWxsIHRoZSBzdGFnZSBtYWtlcy4nLFxuICApO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhZ2VDb250ZXh0IHtcbiAgLyoqIEBpbnRlcm5hbCBPd25lcnNoaXAgb2YgYW4gZXNjYXBpbmcgZmFpbHVyZS4gU2hhcmVkIG9ubHkgYnkgc2VxdWVudGlhbCBmcmFtZXMsIG5ldmVyIHNlcmlhbGl6ZWQuICovXG4gIGZhaWx1cmVTdGF0ZSA9IG5ldyBOYXRpdmVGYWlsdXJlU3RhdGUoKTtcbiAgI2ZhaWx1cmVJZGVudGl0eT86IE5vbk51bGxhYmxlPFRlcm1pbmFsRmFpbHVyZUNvbnRleHRbJ3N0YWdlJ10+O1xuXG4gIC8qKiBAaW50ZXJuYWwgVGhlIG5hdGl2ZSBmcmFtZSBzdGFtcCwgaW5kZXBlbmRlbnQgb2YgbXV0YWJsZSByZWNvcmRlciBldmVudCBjb250ZXh0LiAqL1xuICBnZXQgZmFpbHVyZUlkZW50aXR5KCk6IE5vbk51bGxhYmxlPFRlcm1pbmFsRmFpbHVyZUNvbnRleHRbJ3N0YWdlJ10+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jZmFpbHVyZUlkZW50aXR5O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBTdGFtcGVkIGJlZm9yZSBvYnNlcnZlcnM7IG5ldmVyIGluaGVyaXRlZCBieSBhbm90aGVyIGZyYW1lIG9yIHBlcnNpc3RlZC4gKi9cbiAgYmluZEZhaWx1cmVJZGVudGl0eShydW5JZDogc3RyaW5nLCBydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jZmFpbHVyZUlkZW50aXR5ID0gT2JqZWN0LmZyZWV6ZSh7IHJ1bklkLCBydW50aW1lU3RhZ2VJZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVjb3JkIGhhbGYgb2YgdGhpcyBmcmFtZSAoYFJlY29yZEZyYW1lLnRzYCwgTDMsIEMzKTogdGhlIGhlYXAgYW5kLFxuICAgKiB3aGVuIHRoZSBydW4ga2VlcHMgdGhlbSwgdGhlIHJlZGFjdGVkIG1pcnJvciBhbmQgdGhlIGxvZzsgdGhlIGFkZHJlc3M7XG4gICAqIHRoZSBmaXJzdC10b3VjaCBiYXNlOyB0aGUgbGF6eSB0cmFuc2FjdGlvbiBidWZmZXI7IHRoZSByZWFkS2V5cyBsaXN0LlxuICAgKiBFdmVyeSBzdGF0ZSByZWFkIG9mIHRoaXMgZnJhbWUgZ29lcyB0aHJvdWdoIGl0LCBhbmQgc28gZG9lcyBldmVyeVxuICAgKiBjb21taXQuIFRoZSBtaXJyb3IgaXMgcHJlc2VudCAqKm9ubHkqKiB3aGVuIHRoZSBydW4ncyBwb2xpY3kga2VlcHMgYVxuICAgKiByZWRhY3RlZCB2aWV3IChhIGBSZWRhY3Rpb25Qb2xpY3lgIGlzIGNvbmZpZ3VyZWQpIOKAlCByZWFkIHZpYVxuICAgKiBgRmxvd0NoYXJ0RXhlY3V0b3IuZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgLCB0aGUgZm91bmRhdGlvbiBmb3JcbiAgICogc2hhcmluZyBhIHRyYWNlIHdpdGhvdXQgbGVha2luZyByYXcgUElJIHRocm91Z2ggYHNoYXJlZFN0YXRlYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVjb3JkOiBSZWNvcmRGcmFtZTtcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBwb2xpY3kg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGUgcmVkYWN0aW9uIHJ1bGUsIHRoZSBtaXJyb3IgZmxhZ1xuICAgKiAoYHJ1blBvbGljeS50c2AsIEY1KS4gSGVsZCBCWSBSRUZFUkVOQ0U6IG9uZSBmcm96ZW4gb2JqZWN0IHBlciBydW4gKGFuZFxuICAgKiBwZXIgcmVzdW1lKSwgc2hhcmVkIGJ5IGV2ZXJ5IGZyYW1lIG9mIHRoZSBydW4sIGEgc3ViZmxvdydzIGluY2x1ZGVkIOKAlFxuICAgKiB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfSBwYXNzIHRoZSByZWZlcmVuY2VcbiAgICogKHtAbGluayBpbmhlcml0UnVufSksIHRoZSBydW50aW1lIGluc3RhbGxzIGl0IG9uIGl0cyByb290XG4gICAqICh7QGxpbmsgdXNlUG9saWN5fSkuIE5ldmVyIGVkaXRlZDsgYSBjaGFuZ2UgaXMgYSBuZXcgb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBwb2xpY3k6IFJ1blBvbGljeSA9IERFRkFVTFRfUlVOX1BPTElDWTtcbiAgLyoqIFRoZSBlbWl0dGluZyBmcmFtZSdzIGxvZ2ljYWwgbGVnLCBuZXZlciB0aGUgbXV0YWJsZSBleGVjdXRvcidzIGN1cnJlbnQgbGVnLiAqL1xuICBwcml2YXRlIGVtaXRSdW5JZD86IHN0cmluZztcblxuICAvKiogVGhlIG5hdGl2ZSByb290LWxvZyBjb2xsZWN0b3I7IGNvcGllZCB0byBzYW1lLWxvZyBmcmFtZXMsIG5ldmVyIGNoaWxkIHJ1bnRpbWVzLiAqL1xuICBjYXB0dXJlPzogTmF0aXZlQ2FwdHVyZTtcbiAgLyoqIFNvdXJjZSBjb3ZlcmFnZSwgc2hhcmVkIG9ubHkgYnkgZnJhbWVzIG9mIHRoaXMgcnVudGltZS4gKi9cbiAgcmVhZFNvdXJjZXM/OiBFbmdpbmVSZWFkU291cmNlQ2FwdHVyZTtcbiAgcHJpdmF0ZSBzb3VyY2VSZWFkQ291bnRlcj86IFNvdXJjZVJlYWRDb3VudGVyO1xuICBwcml2YXRlIHNvdXJjZUF0dGVtcHQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHN0YWdlTmFtZSA9ICcnO1xuICAvKiogVW5pcXVlIHN0YWdlIGlkZW50aWZpZXIgZnJvbSB0aGUgYnVpbGRlciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBwdWJsaWMgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBTZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBzdGFnZSBleGVjdXRpb24uICovXG4gIHB1YmxpYyBydW50aW1lU3RhZ2VJZCA9ICcnO1xuICAvKipcbiAgICogRGVjbGFyZWQgdGFncyAoOS4yMS4wKSBmb3IgdGhlIHN0YWdlIHRoaXMgY29udGV4dCBpcyBleGVjdXRpbmcuIFNldCBieVxuICAgKiB0aGUgdHJhdmVyc2VyIGJlc2lkZSBgcnVudGltZVN0YWdlSWRgIChwZXItbm9kZSBpZGVudGl0eSDigJQgTk9UIGluaGVyaXRlZFxuICAgKiBieSBgY3JlYXRlTmV4dGAgLyBgY3JlYXRlQ2hpbGRgKSwgcmVjb3JkZWQgb24gdGhlIGZpcnN0IGJ1bmRsZVxuICAgKiBgY29tbWl0KClgIHdyaXRlcywgdGhlbiByZWxlYXNlZCBzbyBhIHJvdXRpbmUgc2Vjb25kIGNvbW1pdCBvbiB0aGUgc2FtZVxuICAgKiBjb250ZXh0IChhIGZvcmsgY2hpbGQncyBmYW4tb3V0IHJlcGVhdCwgYSBtb3VudCdzIGV4aXQgYnVuZGxlKSBjYXJyaWVzXG4gICAqIG5vbmUg4oCUIHRoZSBzYW1lIG9uY2UtcGVyLWV4ZWN1dGlvbiBsYXcgYF91bnRyYWNrZWRTb3VyY2VzYCBrZWVwcy5cbiAgICovXG4gIHB1YmxpYyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgcnVuIHRoaXMgZnJhbWUgYmVsb25ncyB0byDigJQgaXRzIGlkZW50aXR5IG9uIGV2ZXJ5IGV2ZW50LCBhbmQgdGhlIHJ1blxuICAgKiBuYW1lc3BhY2UgaXQgcmVhZHMgYW5kIHdyaXRlcyBpbiAoe0BsaW5rIHJ1bkFkZHJlc3N9KSwgcmVhZCBvbmNlLCB3aGVuIHRoZVxuICAgKiBmcmFtZSBpcyBidWlsdCAoQzMpLiBPbmx5IHtAbGluayB1c2VBZGRyZXNzT2Z9IG1vdmVzIHRoZSBhZGRyZXNzIGFmdGVyXG4gICAqIHRoYXQsIGFuZCBvbmx5IGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4gbmFtZXNwYWNlIHRoaXMgZnJhbWUgd3JpdGVzIGFuZCByZWFkcyBpbiB3aGVuIHRoYXQgaXMgbm90IGl0cyBvd25cbiAgICogYHJ1bklkYCDigJQgc2V0IG9uY2UsIGJlZm9yZSB0aGUgZnJhbWUncyBmaXJzdCB3cml0ZSwgYnlcbiAgICoge0BsaW5rIHVzZUFkZHJlc3NPZn0uIEl0cyBvbmUgdXNlciBpcyBhIHN1YmZsb3cgbW91bnQncyBtZXJnZS1iYWNrIChSMTMpOlxuICAgKiB0aGUgcmVjb3JkIG5hbWVzIHRoZSBtb3VudCwgdGhlIHZhbHVlcyBsYW5kIHdoZXJlIHRoZSBtb3VudCdzIHBhcmVudFxuICAgKiB3cml0ZXMuIEFic2VudCDihpIgYHJ1bklkYCwgc28gZXZlcnkgb3RoZXIgZnJhbWUgaXMgdW50b3VjaGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRyZXNzUnVuSWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBicmFuY2hJZD86IHN0cmluZztcbiAgcHVibGljIGlzRGVjaWRlcjogYm9vbGVhbjtcbiAgcHVibGljIGlzRm9yazogYm9vbGVhbjtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZyb20gYnVpbGRlciAoc2V0IGJ5IHRyYXZlcnNlciBiZWZvcmUgZXhlY3V0aW9uKS4gKi9cbiAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogU3ViZmxvdyBpZGVudGlmaWVyIChzZXQgYnkgdHJhdmVyc2VyIHdoZW4gdGhpcyBpcyBhIHN1YmZsb3cgZW50cnkgcG9pbnQpLiAqL1xuICBwdWJsaWMgc3ViZmxvd0lkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBwYXJlbnQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBuZXh0PzogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgY2hpbGRyZW4/OiBTdGFnZUNvbnRleHRbXTtcblxuICBwdWJsaWMgZGVidWc6IERpYWdub3N0aWNDb2xsZWN0b3IgPSBuZXcgRGlhZ25vc3RpY0NvbGxlY3RvcigoKSA9PiB0aGlzLnBvbGljeS5yZWRhY3Rpb24pO1xuXG4gIC8qKiBUcmFja3MgdXNlci1sZXZlbCB3cml0ZXMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcgYW5kIG9uQ29tbWl0XG4gICAqICDigJQgaW4gdGhlaXIgUkVUQUlORUQgZm9ybSAoY2xvbmVkIC8gc3VtbWFyaXNlZCAvIHJlZGFjdGVkKS4gRmlsbGVkIGZyb21cbiAgICogIHtAbGluayBfcGVuZGluZ1dyaXRlc30gYnkge0BsaW5rIG1hdGVyaWFsaXNlV3JpdGVzfSBhdCBjb21taXQuICovXG4gIHByaXZhdGUgX3N0YWdlV3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PiA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgd3JpdGVzIG9mIHRoZSBDVVJSRU5UIGV4ZWN1dGlvbiwgaGVsZCBieSByZWZlcmVuY2Ugd2l0aCB0aGUgdmVyZGljdFxuICAgKiB0aGV5IHdlcmUgc3RhZ2VkIHVuZGVyICg5LjIzLjApLiBBIGtleSB3cml0dGVuIGsgdGltZXMgaG9sZHMgaXRzIExBU1RcbiAgICogdmFsdWU7IHRoZSByZXRhaW5lZCBmb3JtICh0aGUgYHdyaXRlVHJhY2tpbmdgIGNsb25lIG9yIHN1bW1hcnksIHRoZVxuICAgKiByZWRhY3Rpb24gcGxhY2Vob2xkZXIgb3IgZmllbGQgc2NydWIpIGlzIHRha2VuIE9OQ0UgcGVyIGtleSBhdCBjb21taXQg4oCUXG4gICAqIHNlZSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9LiBTYW1lIGxhdyBhcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3NcbiAgICogcGF0Y2ggdHJlZXM6IHRoZSBjb3B5IHRoZSByZWNvcmQgbmVlZHMgaXMgcGFpZCBhdCB0aGUgYm91bmRhcnksIG5vdCBhdFxuICAgKiBldmVyeSB3cml0ZS4gTGF6aWx5IGFsbG9jYXRlZDsgYSBzdGFnZSB0aGF0IG5ldmVyIHdyaXRlcyBwYXlzIG5vdGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF9wZW5kaW5nV3JpdGVzPzogTWFwPFxuICAgIHN0cmluZyxcbiAgICB7IHZhbHVlOiB1bmtub3duOyB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0OyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9XG4gID47XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHJlYWRzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3LiAqL1xuICBwcml2YXRlIF9zdGFnZVJlYWRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgYF9zdGFnZVJlYWRzYCBrZXlzIHRoYXQgd2VyZSByZWFkIGF0IGEgTkVTVEVEIHBhdGggKGBnZXRWYWx1ZShwYXRoLFxuICAgKiBrZXkpYCB3aXRoIGEgbm9uLWVtcHR5IGBwYXRoYCkuIE9ubHkgdGhlIGVuZ2luZSByZWFkcyB0aGF0IHdheSDigJQgdGhlXG4gICAqIGZhY2FkZSByZWFkcyByb290cyDigJQgc28gdGhlc2UgYXJlIG5vdCB1c2VyIHJlYWRzIGFuZCB0aGUgYm9ycm93ZWQtcmVhZFxuICAgKiBndWFyZCBza2lwcyB0aGVtIGJ5IHRoaXMgbWFya2VyLCBuZXZlciBieSBndWVzc2luZyBmcm9tIGEgZG90IGluIHRoZSBrZXlcbiAgICogKGEgdXNlcidzIHRvcC1sZXZlbCBrZXkgbWF5IGl0c2VsZiBjb250YWluIG9uZSkuIExhemlseSBjcmVhdGVkOyB0aGVcbiAgICogZmFjYWRlIHBhdGggbmV2ZXIgYWxsb2NhdGVzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBfbmVzdGVkUmVhZHM/OiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogRGV2IG1vZGUgb25seTogdGhlIHJvb3Qga2V5cyB3aG9zZSBMQVNUIHRyYWNrZWQgcmVhZCB3YXMgc2VydmVkIGZyb21cbiAgICogY29tbWl0dGVkIHN0YXRlIOKAlCBiZWZvcmUgdGhpcyBzdGFnZSdzIGZpcnN0IHdyaXRlLCB3aGVuIG5vIHRyYW5zYWN0aW9uXG4gICAqIGJ1ZmZlciBleGlzdHMgeWV0LiBTdWNoIGEgcmVhZCBpcyB0aGUgY29tbWl0dGVkIG9iamVjdCBpdHNlbGYsIHNvIGFuXG4gICAqIGluLXBsYWNlIGVkaXQgb2YgaXQgbW92ZXMgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSB0b28gKGNvcHktb24td3JpdGUsXG4gICAqIDkuMjkuMCk7IHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufSBjaGVja3MgdGhlc2Uga2V5cyBldmVuIHdoZW4gdGhlXG4gICAqIHN0YWdlIHdyb3RlIHRoZW0uIE5ldmVyIGFsbG9jYXRlZCBvdXRzaWRlIGBlbmFibGVEZXZNb2RlKClgLlxuICAgKi9cbiAgcHJpdmF0ZSBfdmlld1JlYWRzPzogU2V0PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEhhcyB0aGlzIGZyYW1lIGNvbW1pdHRlZCBhdCBsZWFzdCBvbmNlPyBUaGUgYm9ycm93ZWQtcmVhZCBndWFyZCBydW5zIG9uXG4gICAqIHRoZSBGSVJTVCBjb21taXQgb25seSDigJQgc2VlIHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufS4gVGhlIGZyYW1lXG4gICAqIGl0c2VsZiBzdGF5cyByZS11c2FibGUgYWZ0ZXIgY29tbWl0ICgjMTNiKTogdGhlIGVuZ2luZSdzIGRvdWJsZS1jb21taXRcbiAgICogcGF0aHMgYW5kIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGJyYW5jaCBwYXJlbnQgcmVseSBvbiBpdC4gVGhlXG4gICAqIHVzZXItbGV2ZWwgcmVmdXNhbCBvZiBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIGxpdmVzIGF0IHRoZSBzY29wZVxuICAgKiB0aWVyIChgU2NvcGVGYWNhZGVgLCBvbmUgcGVyIHN0YWdlIGV4ZWN1dGlvbiksIG5vdCBoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29tbWl0dGVkID0gZmFsc2U7XG5cbiAgLyoqIFRyYWNrZWQgcmVhZHMgb2YgYSBzZWxlY3RlZCB2YWx1ZSAoe0BsaW5rIHNlbGVjdGVkUmVhZHN9KS4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSZWFkcyA9IDA7XG4gIC8qKiBFYWNoIG9iamVjdCB0aGlzIGZyYW1lIHJlYWQgdW5kZXIgYSBzZWxlY3RlZCBuYW1lIOKGkiB0aGF0IHJlYWQncyB2ZXJkaWN0IChgc3RhZ2VXcml0ZWAgaGFuZHMgaXQgb24pLiAqL1xuICBwcml2YXRlIF9zZWxlY3RlZE9iamVjdHM/OiBXZWFrTWFwPG9iamVjdCwgUmVkYWN0aW9uVmVyZGljdD47XG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDIgaG9uZXN0eSBtYXJrZXJzIOKAlCB1bnRyYWNrZWQgcmVhZCBwYXRocyB1c2VkIGR1cmluZyBUSElTXG4gICAqIHN0YWdlJ3MgZXhlY3V0aW9uIChgJ2FyZ3MnYCAvIGAnZW52J2AgLyBgJ3NpbGVudCdgKS4gTWFya2VkIGJ5XG4gICAqIGBTY29wZUZhY2FkZWAsIHN1cmZhY2VkIG9uIHRoZSBzdGFnZSdzIENvbW1pdEJ1bmRsZSBhc1xuICAgKiBgdW50cmFja2VkU291cmNlc2AsIHRoZW4gUkVMRUFTRUQgd2l0aCB0aGUgc3RhZ2luZyBzdGF0ZSBhdCBjb21taXQgZW5kXG4gICAqIChzbyB0aGUgcm91dGluZSBkb3VibGUtY29tbWl0IHBhdGhzIOKAlCBmb3JrIGNoaWxkcmVuLCBzdWJmbG93IG1vdW50cyDigJRcbiAgICogcmVjb3JkIHRoZSBmaWVsZCBleGFjdGx5IG9uY2UsIG9uIHRoZSBmaXJzdCBjb21taXQpLiBMYXppbHkgYWxsb2NhdGVkOlxuICAgKiBzdGFnZXMgdGhhdCBuZXZlciB0b3VjaCBhbiB1bnRyYWNrZWQgcGF0aCBwYXkgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX3VudHJhY2tlZFNvdXJjZXM/OiBTZXQ8VW50cmFja2VkU291cmNlPjtcblxuICAvKipcbiAgICogVGhlIGF0dGVtcHRzIG9mIHRoaXMgZnJhbWUncyBleGVjdXRpb24gKDEwLjEpIOKAlCBpdHMgb3duIHVuZGVyIHRoZSBhdHRlbXB0IHJ1bm5lciwgYXBwZW5kZWQgYXMgZWFjaCBhdHRlbXB0IGVuZHNcbiAgICogKGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCksIGFuZCB0aG9zZSBvZiB0aGUgY2FsbHMgaXQgbWFkZSAoUDIsIHtAbGluayByZXBvcnRDYWxsQXR0ZW1wdH0pIOKAlCByZWFkXG4gICAqIGJ5IHtAbGluayBzbmFwc2hvdFNlbGZ9LiBBcHBlbmQtb25seVxuICAgKiBldmlkZW5jZSBsaWtlIGBkZWJ1Z2A6IE5PVCBjbGVhcmVkIGJ5IHtAbGluayBkaXNjYXJkU3RhZ2VkfSAodGhlIGVhcmxpZXIgYXR0ZW1wdHMgYXJlIHRoZSBwb2ludCkgYW5kIG5ldmVyXG4gICAqIHBhcnQgb2YgYSBjb21taXQgYnVuZGxlLiBMYXppbHkgYWxsb2NhdGVkOiBhIHN0YWdlIHdpdGhvdXQgYSBwb2xpY3kgcGF5cyBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfYXR0ZW1wdHM/OiBBdHRlbXB0UmVjb3JkW107XG4gIC8qKiBUaGUgYXR0ZW1wdCBzZXJpZXMgYXQgYSBnbGFuY2UsIHN0YW1wZWQgb25jZSB3aGVuIGl0IGVuZHMuICovXG4gIHByaXZhdGUgX2F0dGVtcHRTdW1tYXJ5PzogQXR0ZW1wdFN1bW1hcnk7XG4gIC8qKiBGYWN0cyBjb2xsZWN0ZWQgZm9yIHRoaXMgZXhlY3V0aW9uIG9ubHk7IHJldHJ5IGRpc2NhcmRzIGRlbGliZXJhdGVseSBrZWVwIHRoZW0uICovXG4gIHByaXZhdGUgX2F0dGVudGlvbj86IFN0YWdlQXR0ZW50aW9uO1xuICAvKipcbiAgICogVGhlIGF0dGVtcHQgbm93IHJ1bm5pbmcgKFAxYikg4oCUIHNldCBieSBgU3RhZ2VSdW5uZXJgIGJlZm9yZSB0aGUgc2NvcGUgaXMgYnVpbHQsIHNvIHRoZSBmYWNhZGUgY2FuIGhhbmQgaXQgb3V0XG4gICAqIChgc2NvcGUuJGF0dGVtcHQoKWApIGFuZCBmZW5jZSBpdHMgb3duIGF0dGVtcHQuIEFic2VudCBmb3IgYSBzdGFnZSB0aGUgYXR0ZW1wdCBydW5uZXIgZG9lcyBub3QgcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBfYXR0ZW1wdD86IEF0dGVtcHRDb250ZXh0O1xuICAvKiogVGhlIHJ1bidzIHNpZ25hbCwgZm9yIHRoZSBhdHRlbXB0IGEgc3RhZ2Ugb3V0c2lkZSB0aGUgcnVubmVyIHJlcG9ydHMgKGF0dGVtcHQgMSBvZiAxKS4gKi9cbiAgcHJpdmF0ZSBfcnVuU2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKiBFdmVyeSBhdHRlbXB0IHVwIHRvIHRoaXMgbnVtYmVyIGhhcyBFTkRFRCB3aXRob3V0IGFuIGFuc3dlciDigJQgaXRzIHNjb3BlIGlzIGZlbmNlZCAoMCA9IG5vbmUpLiAqL1xuICBwcml2YXRlIF9lbmRlZFRocm91Z2ggPSAwO1xuICAvKiogV3JpdGVzIGFuIGF0dGVtcHQgdHJpZWQgYWZ0ZXIgaXQgZW5kZWQg4oCUIGRyb3BwZWQgYXQgdGhlIHNjb3BlLCBrZXB0IGhlcmUgYXMgbmFtZXMuIExhemlseSBhbGxvY2F0ZWQuICovXG4gIHByaXZhdGUgX2xhdGVXcml0ZXM/OiBMYXRlV3JpdGVbXTtcbiAgLyoqXG4gICAqIFdoZXJlIGEgY2FsbCdzIGF0dGVtcHQgcmVjb3JkcyBhcmUgcmVwb3J0ZWQgKFAyKSDigJQgdGhlIGVuZ2luZSdzIGBvbkF0dGVtcHRgIGZvciB0aGlzIHN0YWdlIGV4ZWN1dGlvbiwgc2V0IGJ5XG4gICAqIGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCB3aXRoIHRoZSBzdGFnZSdzIG93biB0cmF2ZXJzYWwgY29udGV4dCAoYW5kIGl0cyBjb3JyZWxhdGlvbikuXG4gICAqL1xuICBwcml2YXRlIF9hdHRlbXB0UmVwb3J0ZXI/OiAocmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8gfCB1bmRlZmluZWQpID0+IHZvaWQ7XG5cbiAgLyoqIENhbGxzIG1hZGUgc28gZmFyLCBwZXIgc3RhZ2UgYXR0ZW1wdCDigJQgdGhlIGBrYCBvZiBhIGNhbGwncyBzZXJpZXMuIExhemlseSBhbGxvY2F0ZWQuICovXG4gIHByaXZhdGUgX2NhbGxPcmRpbmFscz86IE1hcDxudW1iZXIsIG51bWJlcj47XG4gIC8qKiBQZXIgc3RhZ2UgYXR0ZW1wdCwgdGhlIHNpZ25hbCBpdHMgY2FsbHMgc3RvcCBieSAoYGNhbGxzRW5kZWRTaWduYWxgKS4gTGF6aWx5IGFsbG9jYXRlZC4gKi9cbiAgcHJpdmF0ZSBfY2FsbHNFbmRlZD86IE1hcDxudW1iZXIsIEFib3J0Q29udHJvbGxlcj47XG4gIC8qKiBDYWxsIGFuZCBvYnNlcnZlZCByZWNvcmRzIGtlcHQgb24gdGhlIGZyYW1lLCBhbmQgdGhvc2UgcGFzdCB7QGxpbmsgTUFYX0NBTExfUkVDT1JEU30uICovXG4gIHByaXZhdGUgX2NhbGxSZWNvcmRzID0gMDtcbiAgcHJpdmF0ZSBfYXR0ZW1wdHNEcm9wcGVkID0gMDtcblxuICAvKiogT2JzZXJ2ZXIgY2FsbGVkIGFmdGVyIGNvbW1pdCgpIOKAlCB1c2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGZpcmUgU2NvcGVSZWNvcmRlci5vbkNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfY29tbWl0T2JzZXJ2ZXI/OiAoXG4gICAgbXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PixcbiAgKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgICBzaGFyZWRNZW1vcnk6IFNoYXJlZE1lbW9yeSxcbiAgICBicmFuY2hJZD86IHN0cmluZyxcbiAgICBldmVudExvZz86IEV2ZW50TG9nLFxuICAgIGlzRGVjaWRlcj86IGJvb2xlYW4sXG4gICkge1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgICB0aGlzLnN0YWdlTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdGFnZUlkID0gc3RhZ2VJZDtcbiAgICB0aGlzLnJlY29yZCA9IG5ldyBSZWNvcmRGcmFtZShzaGFyZWRNZW1vcnksIGV2ZW50TG9nLCBydW5BZGRyZXNzKHJ1bklkKSk7XG4gICAgdGhpcy5yZWNvcmQudXNlRW5jb2RpbmcodGhpcy5wb2xpY3kpO1xuICAgIHRoaXMuYnJhbmNoSWQgPSBicmFuY2hJZDtcbiAgICB0aGlzLmlzRGVjaWRlciA9ICEhaXNEZWNpZGVyO1xuICAgIHRoaXMuaXNGb3JrID0gZmFsc2U7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgU2hhcmVkTWVtb3J5IGluc3RhbmNlIChuZWVkZWQgYnkgc2NvcGUgbGF5ZXIpLiAqL1xuICBnZXRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQuc3RhdGU7XG4gIH1cblxuICAvKiogQGludGVybmFsIFN0YW1wZWQgYmVzaWRlIHJ1bnRpbWVTdGFnZUlkLCBiZWZvcmUgc2NvcGUgY29uc3RydWN0aW9uLiAqL1xuICBiaW5kRW1pdE9yaWdpbihydW5JZDogc3RyaW5nLCBkcmlsbFBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5lbWl0UnVuSWQgPSBkcmlsbFBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJ1bklkO1xuICAgIGlmIChkcmlsbFBhdGggIT09IHVuZGVmaW5lZCkgdGhpcy5yZWNvcmQubG9nPy5iaW5kQWRkcmVzcyhydW5JZCwgZHJpbGxQYXRoKTtcbiAgfVxuXG4gIC8qKiBDYXB0dXJlIGZyb20gdGhpcyBmcmFtZSdzIE9XTiBsb2cuIEEgbWFudWFsL3VuYWRkcmVzc2FibGUgZnJhbWUgc3RheXMgdW5rbm93bi4gKi9cbiAgY2FwdHVyZUVtaXRQb3NpdGlvbigpOiBFbWl0U291cmNlUG9zaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVtaXRSdW5JZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5yZWNvcmQubG9nPy5jYXB0dXJlUG9zaXRpb24odGhpcy5lbWl0UnVuSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYSBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IuIFN1YnNlcXVlbnQgYGNvbW1pdCgpYCBjYWxscyBhcHBseVxuICAgKiB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzIOKAlCB0aGUgb25lcyB0aGUgbG9nIHJlY29yZHMg4oCUIHRvXG4gICAqIHRoaXMgbWlycm9yLCBiZXNpZGUgdGhlIHJhdyBwYXRjaGVzIG9uIHRoZSBoZWFwIChgcmVjb3JkQ29tbWl0YCkuXG4gICAqIENoaWxkIC8gbmV4dCBjb250ZXh0cyBpbmhlcml0IHRoZSBtaXJyb3IgdmlhIGBjcmVhdGVOZXh0YCAvIGBjcmVhdGVDaGlsZGAuXG4gICAqXG4gICAqIENhbGxlZCBvbiBhIHJ1bnRpbWUncyByb290IGZyYW1lIGJ5IGBFeGVjdXRpb25SdW50aW1lYCB3aGVuIHRoZSBydW4ncyBwb2xpY3kga2VlcHMgYSBtaXJyb3IuXG4gICAqL1xuICB1c2VSZWRhY3RlZE1pcnJvcihtaXJyb3I6IFNoYXJlZE1lbW9yeSk6IHZvaWQge1xuICAgIHRoaXMucmVjb3JkLnVzZU1pcnJvcihtaXJyb3IpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHJlZGFjdGVkIG1pcnJvciBpZiBpbnN0YWxsZWQsIGVsc2UgdW5kZWZpbmVkLiAqL1xuICBnZXRSZWRhY3RlZFNoYXJlZE1lbW9yeSgpOiBTaGFyZWRNZW1vcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5taXJyb3I7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCB0aGUgcnVuJ3MgcG9saWN5IChgcnVuUG9saWN5LnRzYCkgb24gdGhpcyBmcmFtZSDigJQgY2FsbGVkIG9uIGFcbiAgICogcnVudGltZSdzIHJvb3QgYnkgYEV4ZWN1dGlvblJ1bnRpbWVgIChhdCBjb25zdHJ1Y3Rpb24sIGFuZCBieVxuICAgKiBgRXhlY3V0aW9uUnVudGltZS51c2VQb2xpY3lgIG9uIGEgc2FtZS1leGVjdXRvciByZXN1bWUpLiBEZXNjZW5kYW50cyBnZXRcbiAgICogdGhlIHNhbWUgcmVmZXJlbmNlIHRocm91Z2gge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH07IGFcbiAgICogc3ViZmxvdydzIHJ1bnRpbWUgaXMgY29uc3RydWN0ZWQgd2l0aCBpdCwgc28gaXRzIHNlZWQgZnJhbWUgYW5kIGV2ZXJ5XG4gICAqIGZyYW1lIGFmdGVyIGNvbW1pdCB1bmRlciB0aGUgcnVuJ3MgZGlhbHMgdG9vLlxuICAgKi9cbiAgdXNlUG9saWN5KHBvbGljeTogUnVuUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5hZG9wdFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgLyoqIFRoZSBydW4ncyBwb2xpY3kgdGhpcyBmcmFtZSByZXRhaW5zLCBlbmNvZGVzIGFuZCBzY3J1YnMgdW5kZXIuICovXG4gIGdldFBvbGljeSgpOiBSdW5Qb2xpY3kge1xuICAgIHJldHVybiB0aGlzLnBvbGljeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGEgcmVkYWN0aW9uIHJ1bGUg4oCUIHRoZSBPTkUgb3duZXIgb2YgXCJ3aGF0IGRvZXMgdGhlIHBvbGljeSBzYXlcbiAgICogYWJvdXQgdGhpcyBwYXRoXCIgKGBtZW1vcnkvcmVkYWN0aW9uLnRzYCkg4oCUIGFzIGEgTkVXIHBvbGljeSBmb3IgdGhpcyBmcmFtZVxuICAgKiAodGhlIHNoYXJlZCBvbmUgaXMgbmV2ZXIgZWRpdGVkKS4gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bGUgYXJyaXZlc1xuICAgKiB3aXRoIHRoZSBydW4ncyBwb2xpY3k7IHRoaXMgZG9vciBpcyBmb3IgYSBgU2NvcGVGYWNhZGVgIG9uIGEgYmFyZSBmcmFtZVxuICAgKiAodW5pdCB0ZXN0cywgaGFuZC1idWlsdCBzY29wZXMpLCB3aGljaCBicmluZ3MgaXRzIG93biBydWxlLiBFdmVyeSBzdGFnZWRcbiAgICogd3JpdGUgYW5kIGV2ZXJ5IHRyYWNrZWQgcmVhZCBhc2tzIGl0LCBzbyBhIHdyaXRlIHRoYXQgbmV2ZXIgcGFzc2VzIGFcbiAgICogZmFjYWRlIOKAlCBhIHN1YmZsb3cgc2VlZCwgYW4gYG91dHB1dE1hcHBlcmAgbWVyZ2UtYmFjaywgYSByZXN1bWUgcmUtc2VlZCDigJRcbiAgICogaXMgcmV0YWluZWQgdW5kZXIgdGhlIHNhbWUgdmVyZGljdCBhcyBhIGZhY2FkZSB3cml0ZS4gQWJzZW50OiBldmVyeVxuICAgKiB2ZXJkaWN0IGlzIGAnY2xlYXInYCB1bmxlc3MgdGhlIGNhbGxlciBwYXNzZWQgYW4gZXhwbGljaXQgZmxhZy5cbiAgICovXG4gIHVzZVJlZGFjdGlvblJ1bGUocnVsZTogUmVkYWN0aW9uUnVsZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvbGljeS5yZWRhY3Rpb24gIT09IHJ1bGUpIHRoaXMuYWRvcHRQb2xpY3kod2l0aFJlZGFjdGlvbih0aGlzLnBvbGljeSwgcnVsZSkpO1xuICB9XG5cbiAgLyoqIFRoZSBpbnN0YWxsZWQgcmVkYWN0aW9uIHJ1bGUsIGlmIGFueSAodGhlIGZhY2FkZSdzIGxvb2t1cCkuICovXG4gIGdldFJlZGFjdGlvblJ1bGUoKTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5LnJlZGFjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIHRoZSBydW4gZnJvbSBgZnJvbWA6IHRoZSBwb2xpY3kgKGJ5IHJlZmVyZW5jZSkgYW5kIHRoZSBydW4ncyBtaXJyb3JcbiAgICogc3RvcmUuIFRoZSBPTkUgaW5oZXJpdGFuY2Ugc3RlcCDigJQge0BsaW5rIGNyZWF0ZU5leHR9IGFuZFxuICAgKiB7QGxpbmsgY3JlYXRlQ2hpbGR9IGJvdGggY2FsbCBpdCwgYW5kIGl0IG5hbWVzIG5vIGRpYWwuXG4gICAqL1xuICBwcml2YXRlIGluaGVyaXRSdW4oZnJvbTogU3RhZ2VDb250ZXh0KTogdm9pZCB7XG4gICAgdGhpcy5yZWFkU291cmNlcyA9IGZyb20ucmVhZFNvdXJjZXM7XG4gICAgdGhpcy5hZG9wdFBvbGljeShmcm9tLnBvbGljeSk7XG4gICAgdGhpcy5jYXB0dXJlID0gZnJvbS5jYXB0dXJlO1xuICAgIHRoaXMucmVjb3JkLnVzZU1pcnJvcihmcm9tLnJlY29yZC5taXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBPTkUgcGxhY2UgdGhpcyBmcmFtZSdzIHBvbGljeSBjaGFuZ2VzOiB0aGUgZnJhbWUgaG9sZHMgaXQsIGFuZCBpdHNcbiAgICogcmVjb3JkIGZyYW1lIGVuY29kZXMgdW5kZXIgdGhlIHNhbWUgcmVmZXJlbmNlIChgY29tbWl0VmFsdWVzYCxcbiAgICogYHdyaXRlUHJvdmVuYW5jZWAg4oCUIGBSZWNvcmRGcmFtZSDCtyB1c2VFbmNvZGluZ2ApLCBzbyB0aGUgdHdvIG5ldmVyIGRpZmZlci5cbiAgICovXG4gIHByaXZhdGUgYWRvcHRQb2xpY3kocG9saWN5OiBSdW5Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLnJlY29yZC51c2VFbmNvZGluZyhwb2xpY3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIHRyYWNrZWQgdXNlci1sZXZlbCB3cml0ZSwgcG9saWN5LWdhdGVkICgjMTNjLUEpIOKAlCB0aGUgc2luZ2xlXG4gICAqIGJvb2trZWVwaW5nIHBhdGggZm9yIHtAbGluayBzZXRPYmplY3R9IGFuZCB7QGxpbmsgdXBkYXRlT2JqZWN0fS4gSG9sZHNcbiAgICogdGhlIFJFRkVSRU5DRSBhbmQgdGhlIHZlcmRpY3QgKDkuMjMuMCk7IHRoZSByZXRhaW5lZCBmb3JtIGlzIHRha2VuIGF0XG4gICAqIGNvbW1pdCBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9LCBvbmNlIHBlciBrZXkuXG4gICAqXG4gICAqIFJlZGFjdGlvbiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGRpYWwgaW4gRVZFUlkgbW9kZTogYSByZWRhY3RlZFxuICAgKiB3cml0ZSBzdG9yZXMgdGhlIGAnW1JFREFDVEVEXSdgIHBsYWNlaG9sZGVyIHVuZGVyIGAnZnVsbCdgIEFORFxuICAgKiBgJ3N1bW1hcnknYCAoYSBzdW1tYXJ5IG1hcmtlciB3b3VsZCBsZWFrIHRoZSB2YWx1ZSdzIHByZXZpZXcvc2l6ZSksXG4gICAqIGFuZCBzdG9yZXMgbm90aGluZyB1bmRlciBgJ29mZidgIChlbnRyeSBza2lwcGVkIGVudGlyZWx5IOKAlCBub3RoaW5nIHRvXG4gICAqIGxlYWspLiBBIGZpZWxkLWxldmVsIHZlcmRpY3Qgc2NydWJzIGEgY2xvbmUgQkVGT1JFIHRoZSBkaWFsIHNlZXMgaXQsIHNvXG4gICAqIGEgc3VtbWFyeSBwcmV2aWV3IGNhbiBuZXZlciBzaG93IHRoZSBzZWNyZXQgZWl0aGVyLiBUaGUgdmVyZGljdCBpcyB0aGVcbiAgICogb25lIGBzdGFnZVdyaXRlYCBkZWNpZGVkIEJFRk9SRSBzdGFnaW5nLCBjYXJyaWVkIHRvIGNvbW1pdCB3aXRoIHRoZVxuICAgKiB2YWx1ZS4gVGhlIHN0YWdlZCB3cml0ZSBpdHNlbGYgaXMgdW5hZmZlY3RlZCDigJQgcmVkYWN0aW9uIG9mIHRoZVxuICAgKiBjb21taXR0ZWQgcGF5bG9hZCBpcyB0aGUgcmVjb3JkIGZyYW1lJ3Mgc2NydWIgb2YgdGhhdCB3cml0ZVxuICAgKiAoYFJlY29yZEZyYW1lIMK3IHdyaXRlYCwgdGhlbiBgc2NydWIudHNgIGF0IGNvbW1pdCkuXG4gICAqL1xuICBwcml2YXRlIHRyYWNrV3JpdGUoXG4gICAgdXNlcktleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gICAgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScsXG4gICkge1xuICAgIGlmICh0aGlzLnBvbGljeS53cml0ZVRyYWNraW5nID09PSAnb2ZmJykgcmV0dXJuO1xuICAgICh0aGlzLl9wZW5kaW5nV3JpdGVzID8/PSBuZXcgTWFwKCkpLnNldCh1c2VyS2V5LCB7IHZhbHVlLCB2ZXJkaWN0LCBvcGVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogYF9zdGFnZVdyaXRlc2Agd2l0aCBldmVyeSBwZW5kaW5nIHdyaXRlIGZvbGRlZCBpbiBhcyBpdHMgcmV0YWluZWQgZm9ybVxuICAgKiDigJQgdGhlIHJlY29yZCBhIHJlYWRlciBzZWVzLiBDb25zdW1lcyBub3RoaW5nOiBhIG1pZC1ydW4gc25hcHNob3QgcmVhZHNcbiAgICogdGhlIHdyaXRlcyBzbyBmYXIsIGFuZCBjb21taXQgc3RpbGwgbWF0ZXJpYWxpc2VzIHRoZSBmaW5hbCB2YWx1ZXMuXG4gICAqIFJldHVybnMgYF9zdGFnZVdyaXRlc2AgaXRzZWxmIHdoZW4gbm90aGluZyBpcyBwZW5kaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZXRhaW5lZFdyaXRlcygpOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PiB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nV3JpdGVzKSByZXR1cm4gdGhpcy5fc3RhZ2VXcml0ZXM7XG4gICAgY29uc3Qgb3V0ID0geyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgd10gb2YgdGhpcy5fcGVuZGluZ1dyaXRlcykge1xuICAgICAgb3V0W2tleV0gPSB7XG4gICAgICAgIHZhbHVlOiB0aGlzLnJldGFpbmVkRm9ybSh3LnZlcmRpY3QsIHcudmFsdWUsIHRoaXMucG9saWN5LndyaXRlVHJhY2tpbmcsIHN1bW1hcml6ZVdyaXRlVmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246IHcub3BlcmF0aW9uLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIHRoZSByZXRhaW5lZCBmb3JtIG9mIGV2ZXJ5IHBlbmRpbmcgd3JpdGUg4oCUIE9OQ0UgcGVyIGtleSwgZnJvbSB0aGVcbiAgICogdmFsdWUgYXMgaXQgc3RhbmRzIGF0IGNvbW1pdCAoOS4yMy4wKSDigJQgYW5kIHJlbGVhc2UgdGhlIHJlZmVyZW5jZXMuIFRoZVxuICAgKiBmaXJzdCB0aGluZyBgY29tbWl0KClgIGRvZXMsIHNvIHRoZSBib3Jyb3dlZC1tdXRhdGlvbiBndWFyZCBhbmQgdGhlXG4gICAqIGNvbW1pdCBvYnNlcnZlciBzZWUgdGhlIGZpbmlzaGVkIHJlY29yZC5cbiAgICovXG4gIHByaXZhdGUgbWF0ZXJpYWxpc2VXcml0ZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nV3JpdGVzKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3N0YWdlV3JpdGVzID0gdGhpcy5yZXRhaW5lZFdyaXRlcygpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZWxlYXNlZCBldmVuIHdoZW4gYSByZXRhaW5lZCBmb3JtIGNhbm5vdCBiZSB0YWtlbiDigJQgYW4gdW5jbG9uZWFibGVcbiAgICAgIC8vIHZhbHVlIChhIGZ1bmN0aW9uLCBhIFByb3h5KSBpcyBhIGNvbnRyYWN0IHZpb2xhdGlvbiAoXCJzdGF0ZSB2YWx1ZXNcbiAgICAgIC8vIG11c3Qgc3Vydml2ZSBzdHJ1Y3R1cmVkQ2xvbmVcIikgdGhhdCBub3cgc3VyZmFjZXMgSEVSRSwgYXQgY29tbWl0LFxuICAgICAgLy8gYW5kIGZhaWxzIHRoZSBydW4gbG91ZGx5OyBhIGxhdGVyIHNuYXBzaG90IG9mIHRoZSBmYWlsZWQgcnVuIG11c3RcbiAgICAgIC8vIG5vdCB0aHJvdyB0aGUgc2FtZSBlcnJvciBhZ2Fpbi5cbiAgICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIG9mIGEgdmFsdWUgdGhlIGVuZ2luZSBSRVRBSU5TIChyZWFkcyBhbmQgd3JpdGVzIHJldGVudGlvbik6XG4gICAqIHRoZSBwbGFjZWhvbGRlciBiZWF0cyBldmVyeSBkaWFsOyBhIGZpZWxkLWxldmVsIHNjcnViIGhhcHBlbnMgYmVmb3JlIHRoZVxuICAgKiBkaWFsIHNlZXMgdGhlIHZhbHVlOyBhIGNsZWFyIHZhbHVlIGlzIHN1bW1hcml6ZWQgb3IgY2xvbmVkIGFzIHRoZSBkaWFsXG4gICAqIHNheXMuIENhbGxlcnMgaGFuZGxlIGB1bmRlZmluZWRgIGJlZm9yZSBhc2tpbmcuXG4gICAqL1xuICBwcml2YXRlIHJldGFpbmVkRm9ybShcbiAgICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIG1vZGU6IFJlYWRUcmFja2luZ01vZGUgfCBXcml0ZVRyYWNraW5nTW9kZSxcbiAgICBzdW1tYXJpemU6ICh2YWx1ZTogdW5rbm93bikgPT4gdW5rbm93bixcbiAgKTogdW5rbm93biB7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIFNDT1BFX1BMQUNFSE9MREVSO1xuICAgIGNvbnN0IHNjcnViYmVkID0gdmVyZGljdC5raW5kID09PSAnZmllbGRzJyA/IFJlZGFjdGlvblJ1bGUuc2NydWJGaWVsZHModmFsdWUsIHZlcmRpY3QucGF0aHMpIDogdW5kZWZpbmVkO1xuICAgIGlmIChtb2RlID09PSAnc3VtbWFyeScpIHJldHVybiBzdW1tYXJpemUoc2NydWJiZWQgPz8gdmFsdWUpO1xuICAgIHJldHVybiBzY3J1YmJlZCA/PyBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBydWxlIHdpdGggc29tZXRoaW5nIHRvIHNheSDigJQgYHVuZGVmaW5lZGAgb24gdGhlIG5vLXBvbGljeSBwYXRoIChub1xuICAgKiBydWxlIGluc3RhbGxlZCwgb3IgYSBydWxlIHdpdGggbm8gcG9saWN5IGVudHJpZXMgYW5kIG5vIG1hcmtlZCBrZXlzKSwgc29cbiAgICogYSB0cmFja2VkIHJlYWQgb3IgYSBzdGFnZWQgd3JpdGUgdGhlcmUgcGF5cyBubyB2ZXJkaWN0IGNhbGwgYW5kIG5vIHBhdGhcbiAgICogYWxsb2NhdGlvbi4gVGhlIGRlZmF1bHQgcnVuIGlzIGJ5dGUtaWRlbnRpY2FsIEFORCBjb3N0LWlkZW50aWNhbC5cbiAgICovXG4gIHByaXZhdGUgYWN0aXZlUnVsZSgpOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBydWxlID0gdGhpcy5wb2xpY3kucmVkYWN0aW9uO1xuICAgIHJldHVybiBydWxlICE9PSB1bmRlZmluZWQgJiYgIXJ1bGUuaXNJbmVydCgpID8gcnVsZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUSEUgT05FIEZVTk5FTCBldmVyeSBzdGFnZWQgd3JpdGUgcGFzc2VzIHRocm91Z2gg4oCUIGZhY2FkZSB3cml0ZXMgQU5EXG4gICAqIHRoZSBwYXRocyB0aGF0IGJ5cGFzcyB0aGUgZmFjYWRlIChzdWJmbG93IHNlZWQsIGBvdXRwdXRNYXBwZXJgXG4gICAqIG1lcmdlLWJhY2ssIHJlc3VtZSByZS1zZWVkKS4gVHdvIG93bmVycyAoQzQpOiB0aGUgcnVuJ3MgcnVsZSBERUNJREVTLFxuICAgKiB0aGUgcmVjb3JkIGZyYW1lIFdSSVRFUyB0aGUgdmVyZGljdCdzIGJ5dGVzLCBpbiBmb3VyIHN0ZXBzXG4gICAqIChgcmVkYWN0aW9uLnRzYCwgXCJUaGUgd3JpdGUgZGVjaXNpb25cIik6XG4gICAqICAgMS4gdGhlIHZlcmRpY3Qg4oCUIGBkZWNpZGVXcml0ZWAsIHVuZGVyIHRoZSBydWxlIGFjdGl2ZSBhcyB0aGUgd3JpdGUgYmVnaW5zO1xuICAgKiAgIDIuIGlkZW50aXR5IGluaGVyaXRhbmNlIOKAlCBgaW5oZXJpdEJ5SWRlbnRpdHlgLCBhZ2FpbnN0IHRoaXMgZnJhbWUnc1xuICAgKiAgICAgIHNlbGVjdGVkIHJlYWRzIGFzIHRoZXkgc3RhbmQgYWZ0ZXIgc3RlcCAxO1xuICAgKiAgIDMuIHRoZSBieXRlcyDigJQgYFJlY29yZEZyYW1lIMK3IHdyaXRlYCwgdGhlIG9wIGFuZCBpdHMgc2NydWIgKHRoZSB3aG9sZVxuICAgKiAgICAgIHZhbHVlLCBvciB0aGUgZmllbGRzIGluc2lkZSBpdCk7XG4gICAqICAgNC4gdGhlIG1hcmtzIOKAlCBgbWFya1N0YWdlZFdyaXRlYCwgb25seSBvbmNlIHRoZSB3cml0ZSBzdGFnZWQsIHNvIGFcbiAgICogICAgICB3cml0ZSB0aGF0IGZhaWxzIHRvIHN0YWdlIG1hcmtzIG5vdGhpbmcuXG4gICAqIEVhY2ggc3RlcCByZWFkcyB0aGUgcnVsZSAoYW5kIHRoZSBzZWxlY3RlZCByZWFkcykgd2hlbiBpdCBhY3RzLCBhcyB0aGlzXG4gICAqIGZ1bm5lbCBhbHdheXMgZGlkLiBSZXR1cm5zIHRoZSB2ZXJkaWN0IHNvIHRoZSBjYWxsZXIgcmV0YWlucyBhbmQgcmVwb3J0c1xuICAgKiB1bmRlciB0aGUgc2FtZSBkZWNpc2lvbi5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VXcml0ZShcbiAgICBuc1BhdGg6IHN0cmluZ1tdLFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIGV4cGxpY2l0OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgIHZlcmI6IFdyaXRlVmVyYixcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5hY3RpdmVSdWxlKCk7XG4gICAgaWYgKGFjdGl2ZSA9PT0gdW5kZWZpbmVkICYmICFleHBsaWNpdCkge1xuICAgICAgLy8gVGhlIG5vLXBvbGljeSBmYXN0IHBhdGgsIHRoZSBzYW1lIGZvdXIgc3RlcHMgd2l0aCBub3RoaW5nIHRvIGRvOiBubyBydWxlIHdpdGggYW55dGhpbmcgdG8gc2F5XG4gICAgICAvLyBhbmQgbm8gZmxhZyBpcyBjbGVhciAoc3RlcCAxKSwgbm90aGluZyB0byBpbmhlcml0IHdpdGhvdXQgYSBydWxlIChzdGVwIDIpLCBubyBzY3J1YiAoc3RlcCAzKSxcbiAgICAgIC8vIGFuZCBub3RoaW5nIHRvIG1hcmsg4oCUIGEgY2xlYXIgdmVyZGljdCBtYXJrcyBub3RoaW5nLCBhbmQgYSBkZWxldGUgdW5tYXJrcyBvbmx5IG9uIHRoZSBydWxlXG4gICAgICAvLyBhY3RpdmUgYXMgaXQgYmVnYW4gKHN0ZXAgNCkuIFRoZSBkZWZhdWx0IHJ1biBwYXlzIHRoZSByZWNvcmQncyB3cml0ZSBhbmQgbm90aGluZyBlbHNlLlxuICAgICAgdGhpcy5yZWNvcmQud3JpdGUobnNQYXRoLCB2YWx1ZSwgdmVyYik7XG4gICAgICByZXR1cm4gQ0xFQVI7XG4gICAgfVxuICAgIGNvbnN0IGFza2VkID0gZGVjaWRlV3JpdGUoYWN0aXZlLCBwYXRoLCBrZXksIGV4cGxpY2l0KTtcbiAgICBjb25zdCB2ZXJkaWN0ID0gaW5oZXJpdEJ5SWRlbnRpdHkoYWN0aXZlLCBhc2tlZCwgdGhpcy5fc2VsZWN0ZWRPYmplY3RzLCBwYXRoLCBrZXksIHZhbHVlKTtcbiAgICB0aGlzLnJlY29yZC53cml0ZShuc1BhdGgsIHZhbHVlLCB2ZXJiLCBzY3J1Yk9mKHZlcmRpY3QpKTtcbiAgICBtYXJrU3RhZ2VkV3JpdGUoYWN0aXZlLCB0aGlzLnBvbGljeS5yZWRhY3Rpb24sIHZlcmRpY3QsIHBhdGgsIGtleSwgdmVyYik7XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgYW5kIHJlYWQgYXQgQU5PVEhFUiBmcmFtZSdzIGFkZHJlc3MgKGl0cyBydW4gbmFtZXNwYWNlKSB3aGlsZSB0aGlzXG4gICAqIGZyYW1lIGtlZXBzIGl0cyBvd24gaWRlbnRpdHkgb24gdGhlIHJlY29yZCDigJQgYHN0YWdlYCwgYHN0YWdlSWRgLFxuICAgKiBgcnVudGltZVN0YWdlSWRgLCB0YWdzLiBBIHN1YmZsb3cgbW91bnQncyBtZXJnZS1iYWNrIGlzIHRoZSBvbmUgY2FsbGVyXG4gICAqIChgU3ViZmxvd0V4ZWN1dG9yIMK3IGV4ZWN1dGVTdWJmbG93YCwgUjEzKTogdGhlIG1vdW50IGZyYW1lIG9mIGEgYnJhbmNoIG9yXG4gICAqIGZvcmsgY2hpbGQgbGFuZHMgaXRzIHZhbHVlcyB3aGVyZSBpdHMgcGFyZW50IHdyaXRlcywgYXMgYmVmb3JlLCBhbmQgaXRzXG4gICAqIGJ1bmRsZSBub3cgbmFtZXMgdGhlIG1vdW50IGluc3RlYWQgb2YgdGhlIHN0YWdlIGJlZm9yZSBpdC4gUmVmdXNlZCBvbmNlXG4gICAqIHRoZSBmcmFtZSBoYXMgc3RhZ2VkIGFueXRoaW5nIOKAlCBpdHMgYnVmZmVyJ3MgYWRkcmVzcyBpcyBmaXhlZCB0aGVuLiBUaGVcbiAgICogZGVjaXNpb24gaXMgdGhlIGVuZ2luZSdzIChuYW1lc3BhY2UgaWRzLCBhcyBzaW5jZSBSMTMpOyB0aGUgcmVjb3JkIGZyYW1lXG4gICAqIHRha2VzIHRoZSBhZGRyZXNzIGl0IGNvbWVzIHRvIChgUmVjb3JkRnJhbWUgwrcgdXNlQWRkcmVzc2ApLlxuICAgKi9cbiAgdXNlQWRkcmVzc09mKGZyYW1lOiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmQuaGFzU3RhZ2VkICYmIGZyYW1lLm5hbWVzcGFjZUlkICE9PSB0aGlzLm5hbWVzcGFjZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbZm9vdHByaW50XSBTdGFnZUNvbnRleHQudXNlQWRkcmVzc09mOiAnJHt0aGlzLnN0YWdlSWR9JyBoYXMgYWxyZWFkeSBzdGFnZWQgd3JpdGVzIGF0IGl0cyBvd24gYWRkcmVzcy5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hZGRyZXNzUnVuSWQgPSBmcmFtZS5uYW1lc3BhY2VJZDtcbiAgICB0aGlzLnJlY29yZC51c2VBZGRyZXNzKHJ1bkFkZHJlc3ModGhpcy5uYW1lc3BhY2VJZCkpO1xuICB9XG5cbiAgLyoqIFRoZSBydW4gbmFtZXNwYWNlIHdyaXRlcyBhbmQgcmVhZHMgZ28gdG86IHtAbGluayBhZGRyZXNzUnVuSWR9LCBlbHNlIGBydW5JZGAuICovXG4gIHByaXZhdGUgZ2V0IG5hbWVzcGFjZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkcmVzc1J1bklkID8/IHRoaXMucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgV3JpdGUgb3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwYXRjaChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIHJldHVybiB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gIH1cblxuICBzZXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2gocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBtZXJnZShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdtZXJnZScpO1xuICB9XG5cbiAgc2V0T2JqZWN0KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uT3ZlcnJpZGU/OiAnc2V0JyB8ICdkZWxldGUnLFxuICApOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICAvLyBFeHBsaWNpdCBkZWxldGlvbiAoU2NvcGVGYWNhZGUuZGVsZXRlVmFsdWUpIHN0YWdlcyBhIGRpc3RpbmN0IG9wIHNvXG4gICAgLy8gZGVsdGEtbW9kZSBjb21taXRzICgjMTNjLUIpIGNhbiBlbWl0IGEgcmVhbCBgZGVsZXRlYCB0cmFjZSBlbnRyeS5cbiAgICAvLyBVbmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSB0aGUgYnVmZmVyIGNvbW1pdHMgaXQgYXMgYVxuICAgIC8vIHNldC1vZi11bmRlZmluZWQg4oCUIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBoaXN0b3JpY2FsIGZsYXR0ZW5pbmcuXG4gICAgY29uc3QgdmVyZGljdCA9XG4gICAgICBvcGVyYXRpb25PdmVycmlkZSA9PT0gJ2RlbGV0ZSdcbiAgICAgICAgPyB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB1bmRlZmluZWQsIHNob3VsZFJlZGFjdCwgJ2RlbGV0ZScpXG4gICAgICAgIDogdGhpcy5zdGFnZVdyaXRlKHRoaXMucmVjb3JkLmF0KHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ3NldCcpO1xuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgd3JpdGUgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyArIG9uQ29tbWl0IOKAlFxuICAgIC8vIHBvbGljeS1nYXRlZCAoIzEzYy1BKSwgc2VlIHRyYWNrV3JpdGUuXG4gICAgdGhpcy50cmFja1dyaXRlKHVzZXJLZXlPZihwYXRoLCBrZXkpLCB2YWx1ZSwgdmVyZGljdCwgb3BlcmF0aW9uT3ZlcnJpZGUgPz8gJ3NldCcpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdGFnZ2VkID0gZGVzY3JpcHRpb24uc3RhcnRzV2l0aCgnWycpID8gZGVzY3JpcHRpb24gOiBgW1dSSVRFXSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIHRhZ2dlZCk7XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgdXBkYXRlT2JqZWN0KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLm1lcmdlKHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCAndXBkYXRlJyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICBzZXRSb290KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2goW10sIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIFJvb3QtbGV2ZWwgKHVuLW5hbWVzcGFjZWQpIHdyaXRlIOKAlCB0aGUgc3ViZmxvdyBzZWVkIGFuZCBtZXJnZS1iYWNrIHBhdGguICovXG4gIHNldEdsb2JhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVHbG9iYWxDb250ZXh0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuc3RhZ2VXcml0ZShba2V5XSwgW10sIGtleSwgdmFsdWUsIHVuZGVmaW5lZCwgJ3NldCcpO1xuICB9XG5cbiAgYXBwZW5kVG9BcnJheShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIGl0ZW1zOiB1bmtub3duW10sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID0gQXJyYXkuaXNBcnJheShleGlzdGluZykgPyBbLi4uZXhpc3RpbmcsIC4uLml0ZW1zXSA6IFsuLi5pdGVtc107XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBtZXJnZU9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID1cbiAgICAgIGV4aXN0aW5nICYmIHR5cGVvZiBleGlzdGluZyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZXhpc3RpbmcpXG4gICAgICAgID8geyAuLi4oZXhpc3RpbmcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLCAuLi5vYmogfVxuICAgICAgICA6IHsgLi4ub2JqIH07XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZCBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUcmFja2VkIHJlYWQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBCT1JST1dFRCDigJQgc2VlIHRoZSBjb250cmFjdCBvblxuICAgKiBgU2NvcGVGYWNhZGUuZ2V0VmFsdWVgLiBSZWFkLXRyYWNraW5nIGNvc3QgaXMgcG9saWN5LWdhdGVkICgjMTQpOlxuICAgKiBgJ2Z1bGwnYCBjbG9uZXMgdGhlIHZhbHVlIGludG8gYF9zdGFnZVJlYWRzYCAoaGlzdG9yaWNhbCBkZWZhdWx0KSxcbiAgICogYCdzdW1tYXJ5J2AgcmVjb3JkcyBhIGNoZWFwIG1hcmtlciwgYCdvZmYnYCByZWNvcmRzIG5vdGhpbmcuXG4gICAqL1xuICBnZXRWYWx1ZShwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkUmV0YWluZWRWYWx1ZShwYXRoLCBrZXksIGRlc2NyaXB0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5jYXB0dXJlPy5saW1pdCgncmVhZC1yZXRlbnRpb24tZmFpbGVkJyk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRSZXRhaW5lZFZhbHVlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgLy8gVGhlIHJlY29yZCBmcmFtZSBzZXJ2ZXMgdGhlIHZhbHVlICh0d28gdGllcnMpIGFuZCBrZWVwcyB0aGUgcGVyLXdyaXRlXG4gICAgLy8gcHJvdmVuYW5jZSByZWdpc3RyeSAoI1AxKSDigJQga2V5IHN0cmluZ3Mgb25seSwgaW5kZXBlbmRlbnQgb2YgdGhlXG4gICAgLy8gcmVhZFRyYWNraW5nIHJldGVudGlvbiBkaWFsICh3aGljaCBnb3Zlcm5zIFZBTFVFIHJldGVudGlvbiBiZWxvdykuXG4gICAgbGV0IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgPSBDTEVBUjtcbiAgICBjb25zdCB2YWx1ZSA9XG4gICAgICB0aGlzLnBvbGljeS5yZWFkU291cmNlcyAmJiB0aGlzLnJlYWRTb3VyY2VzXG4gICAgICAgID8gdGhpcy5yZWFkV2l0aE5hdGl2ZVNvdXJjZShwYXRoLCBrZXksICgpID0+IHtcbiAgICAgICAgICAgIHZlcmRpY3QgPSB0aGlzLmp1ZGdlUmVhZChwYXRoLCBrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHZlcmRpY3Qua2luZCA9PT0gJ2NsZWFyJyA/ICd2aXNpYmxlJyA6ICdyZWRhY3RlZCc7XG4gICAgICAgICAgfSlcbiAgICAgICAgOiB0aGlzLnJlY29yZC5yZWFkKHBhdGgsIGtleSk7XG4gICAgLy8gRGVmYXVsdC1vZmYgcmV0YWlucyBpdHMgb3JpZ2luYWwgcmVhZCAtPiBub3RlUmVhZCAtPiBPTkUgdmVyZGljdCBvcmRlci5cbiAgICAvLyBFbmFibGVkIGNhcHR1cmUgdXNlcyBhIHB1cmUgcG9zdC1yZWFkIHZlcmRpY3Q7IHByZWZpeCBib29ra2VlcGluZyBmb2xsb3dzIGl0XG4gICAgLy8gYmVmb3JlIHJldHVybmluZyB0byBzdGFnZSBjb2RlLiBBIHB1cmUsIG5hbWUtb25seSB2ZXJkaWN0IGNhbm5vdCBvYnNlcnZlIHRoZSBwcmVmaXguXG4gICAgaWYgKCF0aGlzLnBvbGljeS5yZWFkU291cmNlcyB8fCAhdGhpcy5yZWFkU291cmNlcykgdmVyZGljdCA9IHRoaXMubm90ZUFuZEp1ZGdlUmVhZChwYXRoLCBrZXkpO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSZWFkcyArPSAxO1xuICAgICAgLy8gQW4gb2JqZWN0IHJlYWQgdW5kZXIgYSBzZWxlY3RlZCBuYW1lLCB3cml0dGVuIGJhY2sgdW5kZXIgYW5vdGhlciwga2VlcHMgaXRzIHJ1bGUgKHN0YWdlV3JpdGUpLlxuICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpICh0aGlzLl9zZWxlY3RlZE9iamVjdHMgPz89IG5ldyBXZWFrTWFwKCkpLnNldCh2YWx1ZSwgdmVyZGljdCk7XG4gICAgfVxuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgcmVhZCAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3IOKAlCByZXRhaW5lZCB1bmRlclxuICAgIC8vIHRoZSBydWxlJ3MgdmVyZGljdCAoOS4xOS4wKTogYSByZWRhY3RlZCBrZXkgaXMgcmV0YWluZWQgYXMgdGhlXG4gICAgLy8gcGxhY2Vob2xkZXIsIGEgZmllbGQtbGV2ZWwga2V5IGFzIGEgc2NydWJiZWQgY2xvbmUsIG5ldmVyIHRoZSBzZWNyZXQuXG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMucG9saWN5LnJlYWRUcmFja2luZyAhPT0gJ29mZicpIHtcbiAgICAgIGlmIChwYXRoLmxlbmd0aCA+IDApICh0aGlzLl9uZXN0ZWRSZWFkcyA/Pz0gbmV3IFNldCgpKS5hZGQodXNlcktleU9mKHBhdGgsIGtleSkpO1xuICAgICAgZWxzZSBpZiAodGhpcy5wb2xpY3kucmVhZFRyYWNraW5nID09PSAnZnVsbCcgJiYgaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgaWYgKHRoaXMucmVjb3JkLmhhc1N0YWdlZCkgdGhpcy5fdmlld1JlYWRzPy5kZWxldGUoa2V5KTtcbiAgICAgICAgZWxzZSAodGhpcy5fdmlld1JlYWRzID8/PSBuZXcgU2V0KCkpLmFkZChrZXkpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3RhZ2VSZWFkc1t1c2VyS2V5T2YocGF0aCwga2V5KV0gPVxuICAgICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IHRoaXMucmV0YWluZWRGb3JtKHZlcmRpY3QsIHZhbHVlLCB0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcsIHN1bW1hcml6ZVJlYWRWYWx1ZSk7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBgW1JFQURdICR7ZGVzY3JpcHRpb259YCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb3cgbWFueSB0cmFja2VkIHJlYWRzIG9mIHRoaXMgZnJhbWUgcmVhZCBhIHZhbHVlIHRoZSBydW4ncyBydWxlIHNlbGVjdHNcbiAgICogKGEga2V5IGl0IG1hc2tzIHdob2xlLCBvciBvbmUgd2l0aCBzZWNyZXQgZmllbGRzKS4gQSBib3VuZGFyeSB0aGF0IG1hcHNcbiAgICogd2hhdCBhIHN0YWdlIGZ1bmN0aW9uIFJFQUQgaW50byBhIG5ldyBuYW1lIOKAlCB0aGUgYHBhcmFsbGVsRm9yRWFjaGAgaXRlbXNcbiAgICogc2VsZWN0b3Ig4oCUIGNvbXBhcmVzIGl0IGJlZm9yZSBhbmQgYWZ0ZXIsIGFzIGEgc3ViZmxvdyBtYXBwZXIncyB0YWludCBkb2VzXG4gICAqIChgbWVtb3J5L3JlZGFjdGlvbi50cyDCtyBNYXBwZXJUYWludGApLiBBbHdheXMgMCB3aXRob3V0IGEgcG9saWN5IG9yIGEgbWFyay5cbiAgICovXG4gIGdldCBzZWxlY3RlZFJlYWRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkUmVhZHM7XG4gIH1cblxuICBwcml2YXRlIG5vdGVBbmRKdWRnZVJlYWQocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgdGhpcy5yZWNvcmQubm90ZVJlYWQocGF0aCwga2V5KTtcbiAgICByZXR1cm4gdGhpcy5qdWRnZVJlYWQocGF0aCwga2V5KTtcbiAgfVxuXG4gIHByaXZhdGUganVkZ2VSZWFkKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCBydWxlID0ga2V5ICE9PSB1bmRlZmluZWQgPyB0aGlzLmFjdGl2ZVJ1bGUoKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcnVsZSAhPT0gdW5kZWZpbmVkID8gcnVsZS52ZXJkaWN0QXQocGF0aCwga2V5IGFzIHN0cmluZykgOiBDTEVBUjtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZFdpdGhOYXRpdmVTb3VyY2UoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHJpdmFjeTogKCkgPT4gJ3Zpc2libGUnIHwgJ3JlZGFjdGVkJyxcbiAgKTogdW5rbm93biB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLiNmYWlsdXJlSWRlbnRpdHk7XG4gICAgY29uc3QgY291bnRzID1cbiAgICAgIHRoaXMucmVhZFNvdXJjZXM/LmFjdGl2ZSAmJiBpZGVudGl0eSAmJiBrZXkgIT09IHVuZGVmaW5lZFxuICAgICAgICA/ICh0aGlzLnNvdXJjZVJlYWRDb3VudGVyID8/PSBuZXcgU291cmNlUmVhZENvdW50ZXIoKSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgbGV0IGp1ZGdlZCA9IGZhbHNlO1xuICAgIGxldCBoaWRkZW4gPSBmYWxzZTtcbiAgICBjb25zdCB2ZXJkaWN0ID0gKCkgPT4ge1xuICAgICAganVkZ2VkID0gdHJ1ZTtcbiAgICAgIGlmIChjb3VudHMgJiYgIWNvdW50cy5vYnNlcnZlKCkpIHRoaXMucmVhZFNvdXJjZXM/LmxpbWl0KCdzb3VyY2UtY2FwdHVyZS1mYWlsZWQnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHByaXZhY3koKTtcbiAgICAgIGhpZGRlbiA9IHJlc3VsdCAhPT0gJ3Zpc2libGUnO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIGxldCB2YWx1ZTogdW5rbm93bjtcbiAgICB0cnkge1xuICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8ICFpZGVudGl0eSkge1xuICAgICAgICB0aGlzLnJlYWRTb3VyY2VzPy5saW1pdChrZXkgPT09IHVuZGVmaW5lZCA/ICd1bnRyYWNrZWQtcmVhZCcgOiAnaWRlbnRpdHktdW5hdmFpbGFibGUnKTtcbiAgICAgICAgdmFsdWUgPSB0aGlzLnJlY29yZC5yZWFkKHBhdGgsIGtleSk7XG4gICAgICAgIHZlcmRpY3QoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlYWQgPSB0aGlzLnJlY29yZC5yZWFkV2l0aFNvdXJjZShcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICB7IHJ1bnRpbWVTdGFnZUlkOiBpZGVudGl0eS5ydW50aW1lU3RhZ2VJZCwgLi4uKHRoaXMuc291cmNlQXR0ZW1wdCAmJiB7IGF0dGVtcHRJZDogdGhpcy5zb3VyY2VBdHRlbXB0IH0pIH0sXG4gICAgICAgICAgdmVyZGljdCxcbiAgICAgICAgKTtcbiAgICAgICAgdmFsdWUgPSByZWFkLnZhbHVlO1xuICAgICAgICBpZiAocmVhZC5vY2N1cnJlbmNlICYmIHRoaXMucmVhZFNvdXJjZXM/LmFjdGl2ZSkgY291bnRzPy5yZXRhaW4ocmVhZC5vY2N1cnJlbmNlLnNvdXJjZS5raW5kKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQSBzdWNjZXNzZnVsIG5hdGl2ZSByZWFkIGtlZXBzIGl0cyBwcmVmaXggZXZlbiB3aGVuIHRoZSB2ZXJkaWN0IHRocm93cy5cbiAgICAgIC8vIEEgbmF0aXZlIGZhaWx1cmUgbmV2ZXIgZW50ZXJzIHRoZSB2ZXJkaWN0IGFuZCBtdXN0IG5vdCBpbnZlbnQgYSByZWFkLlxuICAgICAgaWYgKGp1ZGdlZCkgdGhpcy5ub3RlU291cmNlUmVhZChwYXRoLCBrZXksIGhpZGRlbiwgZmFsc2UpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGlmIChqdWRnZWQpIHRoaXMubm90ZVNvdXJjZVJlYWQocGF0aCwga2V5LCBoaWRkZW4sIHRydWUpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbm90ZVNvdXJjZVJlYWQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLCBoaWRkZW46IGJvb2xlYW4sIHByb3BhZ2F0ZUZhaWx1cmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5ub3RlUmVhZChwYXRoLCBrZXkpO1xuICAgICAgaWYgKGhpZGRlbikgdGhpcy5yZWFkU291cmNlcz8ubGltaXQoJ3ByaXZhY3ktYWN0aXZlJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMucmVhZFNvdXJjZXM/LmxpbWl0KCdzb3VyY2UtY2FwdHVyZS1mYWlsZWQnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBDb2xsZWN0b3IgZmFpbHVyZXMgbXVzdCBub3QgcmVwbGFjZSB0aGUgb3JpZ2luYWwgcmVhZC92ZXJkaWN0IGVycm9yLlxuICAgICAgfVxuICAgICAgaWYgKHByb3BhZ2F0ZUZhaWx1cmUpIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgdHJhY2tpbmcgaW4gX3N0YWdlUmVhZHMgb3IgcGF5aW5nIHN0cnVjdHVyZWRDbG9uZSBjb3N0LlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZS5nZXRWYWx1ZVNpbGVudCgpIGZvciBhcnJheSBwcm94eSBpbnRlcm5hbCBvcGVyYXRpb25zLiAqL1xuICBnZXRWYWx1ZURpcmVjdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnJlYWQocGF0aCwga2V5KTtcbiAgfVxuXG4gIGdldFJvb3Qoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQucmVhZExpdmUoa2V5KTtcbiAgfVxuXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5yZWFkR2xvYmFsKGtleSk7XG4gIH1cblxuICBnZXRTY29wZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnN0YXRlLmdldFN0YXRlKCk7XG4gIH1cblxuICBnZXRSdW5JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIENvbW1pdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUkZDLTAwMyBEMjogcmVjb3JkIHRoYXQgdGhpcyBzdGFnZSBjb25zdW1lZCBhbiB1bnRyYWNrZWQgcmVhZCBwYXRoLlxuICAgKiBDYWxsZWQgYnkgYFNjb3BlRmFjYWRlYCAoYGdldEFyZ3NgL2BnZXRFbnZgL3Vuc2hhZG93ZWQgYGdldFZhbHVlU2lsZW50YCk7XG4gICAqIHN1cmZhY2VkIGFzIGBDb21taXRCdW5kbGUudW50cmFja2VkU291cmNlc2Agb24gdGhpcyBzdGFnZSdzIGNvbW1pdC5cbiAgICovXG4gIG1hcmtVbnRyYWNrZWRTb3VyY2Uoc291cmNlOiBVbnRyYWNrZWRTb3VyY2UpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRTb3VyY2VzPy5saW1pdCgndW50cmFja2VkLXJlYWQnKTtcbiAgICAodGhpcy5fdW50cmFja2VkU291cmNlcyA/Pz0gbmV3IFNldCgpKS5hZGQoc291cmNlKTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBhbiBvYnNlcnZlciB0aGF0IGZpcmVzIGFmdGVyIGNvbW1pdCgpIGFwcGxpZXMgcGF0Y2hlcy5cbiAgICogIFVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZGlzcGF0Y2ggU2NvcGVSZWNvcmRlci5vbkNvbW1pdCBldmVudHMuICovXG4gIHNldENvbW1pdE9ic2VydmVyKFxuICAgIG9ic2VydmVyOiAobXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PikgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXYtbW9kZSBvbmx5OiBkaWQgdGhpcyBzdGFnZSBjaGFuZ2UsIElOIFBMQUNFLCBhIHZhbHVlIGl0IG1lcmVseSBSRUFEP1xuICAgKlxuICAgKiBUaGUgdHlwZWQgc2NvcGUgaW50ZXJjZXB0cyBldmVyeSB3cml0ZSBpdCBjYW4gcmVhY2gg4oCUIGEgcHJvcGVydHkgYXQgYW55XG4gICAqIGRlcHRoLCBhbiBpbmRleGVkIGVsZW1lbnQsIGFuIGFycmF5IG1ldGhvZC4gV2hhdCBpdCBjYW5ub3QgcmVhY2ggaXMgYW5cbiAgICogZWxlbWVudCBoYW5kZWQgb3V0IGJ5IGEgcmVhZCBtZXRob2QgKGBmaW5kYCwgYGZpbHRlcmAsIGBmb3LigKZvZmAsXG4gICAqIGBmb3JFYWNoYCwgZGVzdHJ1Y3R1cmluZyk6IHdyYXBwaW5nIHRob3NlIHdvdWxkIG1lYW4gcmV0dXJuaW5nIHByb3hpZXMgb3V0XG4gICAqIG9mIGV2ZXJ5IHJlYWQsIHdoaWNoIGlzIGEgY29zdCB0aGUgbGlicmFyeSBzaG91bGQgbm90IHBheS4gU28gdGhhdCBmYW1pbHlcbiAgICogaXMgV0FSTkVEIEFCT1VUIHJhdGhlciB0aGFuIGludGVyY2VwdGVkIOKAlCBsb3VkbHksIGhlcmUsIGluc3RlYWQgb2YgZW5kaW5nXG4gICAqIHRoZSBydW4gd2l0aCBhIGNvbW1pdCBsb2cgdGhhdCBzaWxlbnRseSBkaXNhZ3JlZXMgd2l0aCBmaW5hbCBzdGF0ZS5cbiAgICpcbiAgICogVGhpcyBpcyBhIFJFUE9SVCBhZnRlciB0aGUgZmFjdCwgbm90IGEgcmVmdXNhbCBhdCB0aGUgd3JpdGU6IHRoZSB3cml0ZSBoYXNcbiAgICogYWxyZWFkeSBoYXBwZW5lZCBpbiBwbGFjZSBhbmQgdGhlcmUgaXMgbm90aGluZyB0byBpbnRlcmNlcHQuIEl0IHJ1bnMgdW5kZXJcbiAgICogVFdPIHByZWNvbmRpdGlvbnMsIGJvdGggbmFtZWQgaW4gdGhlIFJFQURNRSDigJQgYGVuYWJsZURldk1vZGUoKWAsIGFuZFxuICAgKiBgcmVhZFRyYWNraW5nOiAnZnVsbCdgICh0aGUgZGVmYXVsdCksIGJlY2F1c2UgdGhlIGNvbXBhcmlzb24gbmVlZHMgdGhlXG4gICAqIGNsb25lIG9mIHRoZSB2YWx1ZSB0aGF0IG1vZGUgcmV0YWlucyBhdCByZWFkIHRpbWUuIEEga2V5IHRoZSBzdGFnZSBuZXZlclxuICAgKiBzdGFnZWQgbXVzdCBzdGlsbCBob2xkIHRoYXQgY2xvbmUg4oCUIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcFxuICAgKiBhbmQgdGhlIGJ1ZmZlcidzIHdvcmtpbmcgY29weSBpcyBwcml2YXRlIHRvIHRoaXMgc3RhZ2UuIEtleXMgdGhlIHN0YWdlIERJRFxuICAgKiBzdGFnZSBhcmUgc2tpcHBlZCAodGhleSBhcmUgZXhwZWN0ZWQgdG8gZGlmZmVyLCBhbmQgdGhleSBhcmUgaW4gdGhlIHJlY29yZCksXG4gICAqIHNvIGFyZSBrZXlzIHVuZGVyIGEgcmVkYWN0aW9uIHZlcmRpY3QsIHdob3NlIHJldGFpbmVkIGZvcm0gaXMgZGVsaWJlcmF0ZWx5XG4gICAqIG5vdCB0aGUgdmFsdWUsIGFuZCBzbyBhcmUga2V5cyByZWFkIGF0IGEgbmVzdGVkIHBhdGggKGBfbmVzdGVkUmVhZHNgKSDigJRcbiAgICogdGhvc2UgYXJlIGVuZ2luZSByZWFkcyAodGhlIHN1YmZsb3cgbWVyZ2UtYmFjayksIG5vdCB1c2VyIHJlYWRzLlxuICAgKlxuICAgKiBJdCBhbHNvIG9ubHkgbG9va3MgYXQga2V5cyBzZXJ2ZWQgZnJvbSB0aGUgUElOTkVEIHNvdXJjZSDigJQgdGhlIGZpcnN0LXRvdWNoXG4gICAqIHZpZXcgb3IgdGhpcyBzdGFnZSdzIG93biBidWZmZXIuIEEga2V5IGFic2VudCBmcm9tIGJvdGggd2FzIHNlcnZlZCBieSB0aGVcbiAgICogcmVhZCdzIGxpdmUgZmFsbGJhY2sgKGBSZWNvcmRGcmFtZSDCtyByZWFkYCwgdGllciAyKSwgd2hpY2ggYSBwYXJhbGxlbCBzaWJsaW5nJ3Mgcm9vdC1rZXkgY29tbWl0IGNhblxuICAgKiBsZWdpdGltYXRlbHkgbW92ZTsgYWNjdXNpbmcgdGhlIHN0YWdlIHRoZXJlIHdvdWxkIGJlIGEgZmFsc2UgYWxhcm0uIEZvclxuICAgKiB0aGUgc2FtZSByZWFzb24gaXQgcnVucyBvbiB0aGUgZnJhbWUncyBGSVJTVCBjb21taXQgb25seTogdGhlIHJlYWRzIGJlbG9uZ1xuICAgKiB0byB0aGF0IHJvdW5kLCBhbmQgYnkgdGhlIGVuZ2luZSdzIHNlY29uZCByb3VuZCAoYSBmb3JrIGRvdWJsZS1jb21taXQsIGFcbiAgICogc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBjb21taXR0ZWQgYnJhbmNoIHBhcmVudCkgb3RoZXIgc3RhZ2VzIGhhdmVcbiAgICogbGVnaXRpbWF0ZWx5IG1vdmVkIHRoZSBzdGF0ZSB0aGV5IHdlcmUgY29tcGFyZWQgYWdhaW5zdC5cbiAgICpcbiAgICogQSBrZXkgdGhlIHN0YWdlIERJRCBzdGFnZSBpcyBzdGlsbCBjaGVja2VkIHdoZW4gaXRzIGxhc3QgcmVhZCBjYW1lIGZyb21cbiAgICogY29tbWl0dGVkIHN0YXRlICh7QGxpbmsgX3ZpZXdSZWFkc30g4oCUIHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSk6XG4gICAqIHRoYXQgcmVhZCB3YXMgdGhlIGNvbW1pdHRlZCBvYmplY3QgaXRzZWxmLCBhbmQgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSBJU1xuICAgKiB0aGF0IG9iamVjdCAoY29weS1vbi13cml0ZSwgOS4yOS4wKSwgc28gYW4gaW4tcGxhY2UgZWRpdCBmb2xsb3dlZCBieSBhXG4gICAqIHdyaXRlIG9mIHRoZSBrZXkgY29tbWl0cyBOTyBjaGFuZ2Ug4oCUIGxpdmUgc3RhdGUga2VlcHMgdGhlIGVkaXQsIHRoZSBsb2dcbiAgICogZG9lcyBub3QuIENvbXBhcmVkIGFnYWluc3QgY29tbWl0dGVkIHN0YXRlLCBub3QgdGhlIHdyaXR0ZW4gdmFsdWUsIHNvIGFcbiAgICogbGVnaXRpbWF0ZSB3cml0ZSBuZXZlciB0cmlwcyBpdC5cbiAgICpcbiAgICogQ29zdHMgbm90aGluZyBvdXRzaWRlIGBlbmFibGVEZXZNb2RlKClgLlxuICAgKi9cbiAgcHJpdmF0ZSB3YXJuT25Cb3Jyb3dlZE11dGF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghaXNEZXZNb2RlKCkgfHwgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nICE9PSAnZnVsbCcgfHwgdGhpcy5fY29tbWl0dGVkKSByZXR1cm47XG4gICAgY29uc3QgcnVsZSA9IHRoaXMuYWN0aXZlUnVsZSgpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpKSB7XG4gICAgICBjb25zdCByZXRhaW5lZCA9IHRoaXMuX3N0YWdlUmVhZHNba2V5XTtcbiAgICAgIC8vIE9ubHkgYSBjb250YWluZXIgY2FuIGJlIG11dGF0ZWQgaW4gcGxhY2U7IGEgcHJpbWl0aXZlIHJlYWQgY2Fubm90LlxuICAgICAgaWYgKHJldGFpbmVkID09PSBudWxsIHx8IHR5cGVvZiByZXRhaW5lZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMuX25lc3RlZFJlYWRzPy5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICBpZiAocnVsZSAhPT0gdW5kZWZpbmVkICYmIHJ1bGUudmVyZGljdEF0KFtdLCBrZXkpLmtpbmQgIT09ICdjbGVhcicpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmFtZXNwYWNlZCA9IHRoaXMucmVjb3JkLmF0KFtdLCBrZXkpO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9zdGFnZVdyaXRlcywga2V5KSB8fCB0aGlzLnJlY29yZC53YXNTdGFnZWQobmFtZXNwYWNlZCkpIHtcbiAgICAgICAgdGhpcy53YXJuT25Db21taXR0ZWRNdXRhdGlvbihrZXksIG5hbWVzcGFjZWQsIHJldGFpbmVkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBwaW5uZWQgc291cmNlIG9ubHkg4oCUIHNlZSB0aGUgbm90ZSBvbiB0aGUgbGl2ZSBmYWxsYmFjayBhYm92ZS5cbiAgICAgIC8vIGBwZWVrYCwgbm90IGBnZXRgOiBhIHJlcG9ydCBjb21wYXJlcywgYW5kIG11c3Qgbm90IHRha2UgdGhlIHByaXZhdGVcbiAgICAgIC8vIGNvcHkgYSBzdGFnZSdzIHJlYWQgd291bGQgKGNvcHktb24td3JpdGUsIDkuMjkuMCkuXG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5yZWNvcmQucGVlayhuYW1lc3BhY2VkKTtcbiAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYXRoID0gZmlyc3REaWZmZXJpbmdQYXRoKHJldGFpbmVkLCBjdXJyZW50KTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2Fybihib3Jyb3dlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBzdGFnZWQta2V5IGhhbGYgb2Yge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259OiBkaWQgY29tbWl0dGVkIHN0YXRlIGl0c2VsZiBtb3ZlIHVuZGVyIGEgcmVhZD8gKi9cbiAgcHJpdmF0ZSB3YXJuT25Db21taXR0ZWRNdXRhdGlvbihrZXk6IHN0cmluZywgbmFtZXNwYWNlZDogc3RyaW5nW10sIHJldGFpbmVkOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl92aWV3UmVhZHM/LmhhcyhrZXkpKSByZXR1cm47XG4gICAgY29uc3QgY29tbWl0dGVkID0gdGhpcy5yZWNvcmQuYmFzZUF0KG5hbWVzcGFjZWQpO1xuICAgIGlmIChjb21taXR0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhdGggPSBmaXJzdERpZmZlcmluZ1BhdGgocmV0YWluZWQsIGNvbW1pdHRlZCk7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKGNvbW1pdHRlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggc3RhZ2VkIHdyaXRlcyB0byBzaGFyZWQgbWVtb3J5IGFuZCBSRUxFQVNFIHRoZSBwZXItc3RhZ2Ugc3RhZ2luZ1xuICAgKiBzdGF0ZSAoIzEzYikuXG4gICAqXG4gICAqIGBwaGFzZWAgKDkuMzkuMCkgaXMgdGhlIGNhbGxlcidzIHN0YXRlbWVudCBvZiB3aGF0IGEgQ09OVElOVUFUSU9OIGNvbW1pdFxuICAgKiBpcyDigJQgYCdleGl0J2AgZnJvbSBhIHN1YmZsb3cgbW91bnQncyBleGl0LCBgJ3JlcGVhdCdgIGZyb20gYSBmb3JrXG4gICAqIGZhbi1vdXQncyBzZXR0bGUuIEl0IGlzIHN0YW1wZWQgb24gdGhlIGJ1bmRsZSAoYENvbW1pdEJ1bmRsZS5waGFzZWApIG9ubHlcbiAgICogd2hlbiB0aGlzIGZyYW1lIGhhcyBBTFJFQURZIGNvbW1pdHRlZDogdGhlIEZJUlNUIGJ1bmRsZSBvZiBhbiBleGVjdXRpb25cbiAgICogaXMgdGhlIHN0YWdlJ3Mgb3duIGFuZCBuZXZlciBjYXJyaWVzIGEgYHBoYXNlYCDigJQgc28gYSBtb3VudCB3aXRob3V0IGFuXG4gICAqIGBvdXRwdXRNYXBwZXJgIChhIGxhenkgbW91bnQsIGV2ZXJ5IGBwYXJhbGxlbEZvckVhY2hgIGJyYW5jaCksIHdob3NlIGV4aXRcbiAgICogaXMgaXRzIG9ubHkgYnVuZGxlLCByZWNvcmRzIHRoYXQgYnVuZGxlIGFzIGl0cyBvd24sIHRhZ3MgYW5kIGFsbC5cbiAgICpcbiAgICogQ29tbWl0IGlzIHRoZSBzdGFnZSdzIGxpZmVjeWNsZSBlbmQ6IHRoZSByZWNvcmQgZnJhbWUncyBidWZmZXIgYW5kXG4gICAqIGZpcnN0LXRvdWNoIGJhc2UgYXJlIG9ubHkgbmVlZGVkIERVUklORyBleGVjdXRpb24sIGFzIHRoZSByZWFkIHNuYXBzaG90ICtcbiAgICogbmV0LWNoYW5nZSBkaWZmIGJhc2UsIHNvIHRoZSByZWNvcmQgZnJhbWUgcmVsZWFzZXMgdGhlbSBvbmNlIHRoZSBjb21taXRcbiAgICogaGFzIGxhbmRlZCBhbmQgdGhlIG9ic2VydmVyIGhhcyBzZWVuIGl0IChgUmVjb3JkRnJhbWUgwrcgcmVsZWFzZWAg4oCUIHdoeSBhXG4gICAqIGZyYW1lIHRoYXQga2VwdCB0aGVtIHdvdWxkIHJldGFpbiBvbmUgc3RhdGUgZ2VuZXJhdGlvbiBwZXIgZXhlY3V0ZWRcbiAgICogc3RhZ2UsIGFuZCB3aHkgYSByZS11c2VkIGZyYW1lIHJlLWFuY2hvcnMgb24gY3VycmVudCBzdGF0ZSwgaXMgdGhlcmUpLlxuICAgKlxuICAgKiBSRS1VU0UgQUZURVIgQ09NTUlUIHN0YXlzIGNvcnJlY3QgYmVjYXVzZSBib3RoIHJlLWNyZWF0ZSBsYXppbHk6XG4gICAqIC0gYSBsYXRlciBSRUFEIHJlLWFuY2hvcnMgb24gdGhlIENVUlJFTlQgY29tbWl0dGVkIHN0YXRlICh3aGljaCBpbmNsdWRlc1xuICAgKiAgIHRoaXMgc3RhZ2UncyBvd24gZmx1c2hlZCB3cml0ZXMpO1xuICAgKiAtIGEgbGF0ZXIgV1JJVEUgY29uc3RydWN0cyBhIGZyZXNoIGJ1ZmZlciBvbiB0aGF0IHJlLWFuY2hvcmVkIHZpZXcsIHNvIGFcbiAgICogICBzZWNvbmQgY29tbWl0IGRpZmZzIGFnYWluc3QgcG9zdC1maXJzdC1jb21taXQgc3RhdGUuIFRoZSBwcmUtcmVsZWFzZVxuICAgKiAgIGJ1ZmZlciBiZWhhdmVkIHRoZSBzYW1lIGZvciBWQUxVRVMgKGl0cyBgd29ya2luZ0NvcHlgIHdhcyByZXNldCBvblxuICAgKiAgIGNvbW1pdCwgZmFsbGluZyByZWFkcyB0aHJvdWdoIHRvIGxpdmUgc3RhdGUpIGJ1dCBrZXB0IHRoZSBPUklHSU5BTFxuICAgKiAgIGBiYXNlU25hcHNob3RgIGFzIGRpZmYgYmFzZSDigJQgdW5yZWFjaGFibGUgaW4gcHJhY3RpY2U6IHRoZSBlbmdpbmUnc1xuICAgKiAgIG9ubHkgd3JpdGVzIGFmdGVyIGEgY29tbWl0IGFyZSB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBjb21taXR0ZWRcbiAgICogICBicmFuY2ggcGFyZW50IChhIGRlY2lkZXIgb3IgZm9yayBmcmFtZSBjb21taXRzIGJlZm9yZSBpdHMgYnJhbmNoIHJ1bnMpO1xuICAgKiAgIHRoZSBvdGhlciBcIndyaXRlIGFmdGVyIGNvbW1pdFwiXG4gICAqICAgc2l0ZXMgKFN1YmZsb3dFeGVjdXRvciBzZWVkIOKGkiByZXBsYWNlcyB0aGUgY29udGV4dDsgcmVzdW1lIOKGkiBmcmVzaFxuICAgKiAgIGNvbnRleHQgdmlhIGBsZWFmLmNyZWF0ZU5leHRgKSBuZXZlciByZS11c2UgYSBjb21taXR0ZWQgY29udGV4dC5cbiAgICogLSBBIFVTRVIgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgaXMgYSBkaWZmZXJlbnQgbWF0dGVyOiBpdHMgd3JpdGVzXG4gICAqICAgd291bGQgbGFuZCBpbiBhIGJ1ZmZlciBub3RoaW5nIGV2ZXIgY29tbWl0cy4gVGhhdCByZWZ1c2FsIGxpdmVzIG9uIHRoZVxuICAgKiAgIHNjb3BlIHRpZXIgKGBTY29wZUZhY2FkZWAsIHNlYWxlZCBieSB0aGUgY29tbWl0IG9ic2VydmVyIOKAlCA5LjIyLjApLFxuICAgKiAgIGJlY2F1c2UgdGhlIGZyYW1lJ3MgcmUtdXNhYmlsaXR5IGlzIGV4YWN0bHkgd2hhdCB0aGUgZW5naW5lIHBhdGhzXG4gICAqICAgYWJvdmUgbmVlZC5cbiAgICogLSBgX3N0YWdlV3JpdGVzYCAvIGBfc3RhZ2VSZWFkc2AgYXJlIE5PVCByZWxlYXNlZCDigJQgYHNuYXBzaG90U2VsZigpYFxuICAgKiAgIHJlYWRzIHRoZW0gcG9zdC1ydW4gZm9yIHRoZSBleGVjdXRpb24tdHJlZSBzbmFwc2hvdC5cbiAgICovXG4gIGNvbW1pdChwaGFzZT86IENvbW1pdFBoYXNlKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY29tbWl0UmV0YWluZWQocGhhc2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNhcHR1cmU/LmxpbWl0KCdjb21taXQtcmV0ZW50aW9uLWZhaWxlZCcpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21taXRSZXRhaW5lZChwaGFzZT86IENvbW1pdFBoYXNlKTogdm9pZCB7XG4gICAgLy8gQSBjb250aW51YXRpb24gb25seSBBRlRFUiB0aGUgZXhlY3V0aW9uJ3Mgb3duIGJ1bmRsZSAoc2VlIGFib3ZlKS5cbiAgICBjb25zdCBjb250aW51YXRpb24gPSB0aGlzLl9jb21taXR0ZWQgPyBwaGFzZSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hdGVyaWFsaXNlV3JpdGVzKCk7XG4gICAgdGhpcy53YXJuT25Cb3Jyb3dlZE11dGF0aW9uKCk7XG4gICAgLy8gVGhlIHJlY29yZCdzIGhhbGYgKGBSZWNvcmRGcmFtZSDCtyBjb21taXRgIOKGkiBgcmVjb3JkQ29tbWl0LnRzYCkuIE5vIGJ1ZmZlclxuICAgIC8vID0gbm8gd3JpdGUgZXZlciBidWlsdCBvbmUgKCMxMyk6IHRoZSBjb21taXQgaXMgZW1wdHkgYnkgY29uc3RydWN0aW9uLFxuICAgIC8vIHJlY29yZGVkIHdpdGggWkVSTyBjbG9uZXMuIFRoZSBuYW1lcyBhcmUgcmVhZCBvbmNlIHRoZSBwYXlsb2FkIGlzIGJ1aWx0LlxuICAgIHRoaXMucmVjb3JkLmNvbW1pdCgoKSA9PiAoe1xuICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgICB1bnRyYWNrZWRTb3VyY2VzOiB0aGlzLl91bnRyYWNrZWRTb3VyY2VzLFxuICAgICAgdGFnczogdGhpcy50YWdzLFxuICAgICAgcGhhc2U6IGNvbnRpbnVhdGlvbixcbiAgICB9KSk7XG4gICAgLy8gVGhlIG9ic2VydmVyIChTY29wZUZhY2FkZSkgc2VlcyB0aGUgdHJhY2tlZCBtdXRhdGlvbnMsIFRIRU4gdGhlIHN0YWdpbmdcbiAgICAvLyBzdGF0ZSBpcyByZWxlYXNlZCAoIzEzYiksIHNvIGl0IHNlZXMgdGhlIHdvcmxkIGFzIGl0IHdhcy4gRDIncyBtYXJrZXJzXG4gICAgLy8gYW5kIHRoZSBkZWNsYXJlZCB0YWdzIHJlbGVhc2Ugd2l0aCBpdCDigJQgb25lIHN0YW1wIHBlciBleGVjdXRpb24sIHNvIHRoZVxuICAgIC8vIGVuZ2luZSdzIGRvdWJsZS1jb21taXQgcGF0aHMgcmVjb3JkIHRoZW0gZXhhY3RseSBvbmNlLlxuICAgIGlmICh0aGlzLl9jb21taXRPYnNlcnZlcikge1xuICAgICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIoeyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9KTtcbiAgICB9XG4gICAgdGhpcy5yZWNvcmQucmVsZWFzZSgpO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50YWdzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NvbW1pdHRlZCA9IHRydWU7XG4gICAgLy8gVGhlIHN0YWdlIGlzIG92ZXI6IGV2ZXJ5IGNhbGwgaXQgbWFkZSB0aGF0IGlzIHN0aWxsIHJ1bm5pbmcgc3RvcHMgKFAyKSwgYW5kIG5vdGhpbmcgcmVwb3J0cyB0aHJvdWdoIHRoZVxuICAgIC8vIGVuZ2luZSBhbnkgbW9yZSDigJQgYSBsYXRlIHJlY29yZCBpcyByZWZ1c2VkIGJlZm9yZSBpdCB3b3VsZCByZWFjaCBpdC5cbiAgICB0aGlzLmVuZENhbGxzKHVuZGVmaW5lZCk7XG4gICAgdGhpcy5fYXR0ZW1wdFJlcG9ydGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBmcmFtZSBoYXMgY29tbWl0dGVkIOKAlCBhIGNhbGwncyByZWNvcmQgYXJyaXZpbmcgYWZ0ZXIgaXQgaXMgbGF0ZSAoUDIsIGBTY29wZUZhY2FkZSDCtyBjYWxsYCkuICovXG4gIGdldCBjb21taXR0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbW1pdHRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvdyBhd2F5IGV2ZXJ5dGhpbmcgdGhpcyBzdGFnZSBoYXMgU1RBR0VELCB3aXRob3V0IGNvbW1pdHRpbmcgYW55IG9mIGl0LlxuICAgKlxuICAgKiBUaGUgaXNvbGF0aW9uIHByaW1pdGl2ZSBiZWhpbmQgZGVjbGFyYXRpdmUgcmV0cnk6IHdoZW4gYSBub24tZmluYWwgYXR0ZW1wdFxuICAgKiBmYWlscywgdGhlIHdyaXRlcyBpdCBzdGFnZWQgbXVzdCBub3QgYmUgdmlzaWJsZSB0byB0aGUgbmV4dCBhdHRlbXB0LCBtdXN0XG4gICAqIG5vdCByZWFjaCBzaGFyZWQgc3RhdGUsIGFuZCBtdXN0IG5vdCBhcHBlYXIgaW4gdGhlIGNvbW1pdCBsb2cgb3IgaW4gdGhpc1xuICAgKiBzdGFnZSdzIHNuYXBzaG90LiBEcm9wcGluZyB0aGUgc3RhZ2luZyBzdGF0ZSBhY2hpZXZlcyBhbGwgZm91ciBhdCBvbmNlIOKAlFxuICAgKiB0aGVyZSBpcyBubyByb2xsYmFjayBtYWNoaW5lcnkgdG8gaW52b2tlIGJlY2F1c2Ugbm90aGluZyB3YXMgZXZlciBhcHBsaWVkXG4gICAqIChNMTogdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciBob2xkcyB3cml0ZXMgdW50aWwgYGNvbW1pdCgpYCBmbHVzaGVzIHRoZW0pLlxuICAgKlxuICAgKiBXaGF0IGlzIHJlbGVhc2VkLCBhbmQgd2h5IGVhY2ggb25lIG1hdHRlcnMgZm9yIHRoZSBuZXh0IGF0dGVtcHQ6XG4gICAqICAtIHRoZSByZWNvcmQgZnJhbWUncyBzdGFnZWQgc3RhdGUgKGBSZWNvcmRGcmFtZSDCtyBkaXNjYXJkYCkg4oCUIHRoZSBidWZmZXJcbiAgICogICAgICAgICAgICAgICAgICAgICh0aGUgbmV4dCBhdHRlbXB0IHN0YXJ0cyB3aXRoIG5vdGhpbmcgc3RhZ2VkKSwgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICBmaXJzdC10b3VjaCBiYXNlIChpdCByZS1hbmNob3JzIG9uIGNvbW1pdHRlZCBzdGF0ZSBhc1xuICAgKiAgICAgICAgICAgICAgICAgICAgaXQgc3RhbmRzIE5PVyDigJQgYSBzaWJsaW5nIGZvcmsgYnJhbmNoIG1heSBsZWdpdGltYXRlbHlcbiAgICogICAgICAgICAgICAgICAgICAgIGhhdmUgY29tbWl0dGVkIGluIGJldHdlZW4pIGFuZCB0aGUgcmVhZEtleXMgbGlzdCAoI1AxOlxuICAgKiAgICAgICAgICAgICAgICAgICAgYSBkaXNjYXJkZWQgYXR0ZW1wdCdzIHJlYWRzIG11c3QgbmV2ZXIgcmVhY2ggdGhlIG5leHRcbiAgICogICAgICAgICAgICAgICAgICAgIGF0dGVtcHQncyBgVHJhY2VFbnRyeS5yZWFkS2V5c2ApO1xuICAgKiAgLSBgX3N0YWdlV3JpdGVzYCAvIGBfcGVuZGluZ1dyaXRlc2AgLyBgX3N0YWdlUmVhZHNgIOKAlCB0aGUgc25hcHNob3RcbiAgICogICAgICAgICAgICAgICAgICAgIHBheWxvYWQ7IHdpdGhvdXQgdGhlIHJlc2V0IHRoZSBleGVjdXRpb24gdHJlZSB3b3VsZFxuICAgKiAgICAgICAgICAgICAgICAgICAgcmVwb3J0IHdyaXRlcyB0aGF0IHdlcmUgZGlzY2FyZGVkLCB3aGljaCBpcyB0aGUgZXhhY3RcbiAgICogICAgICAgICAgICAgICAgICAgIGxpZSB0aGlzIGZlYXR1cmUgZXhpc3RzIHRvIHByZXZlbnQgKHRoZSBwZW5kaW5nIG1hcFxuICAgKiAgICAgICAgICAgICAgICAgICAgaG9sZHMgYmFyZSByZWZlcmVuY2VzIOKAlCBkcm9wcGluZyBpdCB1bi1jbG9uZXMgbm90aGluZyk7XG4gICAqICAtIGBfdW50cmFja2VkU291cmNlc2Ag4oCUIHRoZSBEMiBob25lc3R5IG1hcmtlcnMsIHJlbGVhc2VkIHdpdGggdGhlIHJlc3QuXG4gICAqXG4gICAqIFdoYXQgaXMgZGVsaWJlcmF0ZWx5IEtFUFQ6IGBkZWJ1Z2AgKGxvZ3MsIG1ldHJpY3MsIGVycm9ycywgZmxvdyBtZXNzYWdlcylcbiAgICogYW5kIHRoZSBhdHRlbXB0IHJlY29yZHMgKDEwLjEpLiBCb3RoIGFyZSB0aGUgYXBwZW5kLW9ubHkgcmVjb3JkIG9mIHdoYXRcbiAgICogZXZlcnkgYXR0ZW1wdCBkaWQsIGFuZCB0aGUgcmV0cnkgZmVhdHVyZSdzIHdob2xlIHBvaW50IGlzIHRoYXQgdGhlIGVhcmxpZXJcbiAgICogYXR0ZW1wdHMgc3RheSB2aXNpYmxlLlxuICAgKlxuICAgKiBObyBjb21taXQgaXMgcmVjb3JkZWQgYW5kIG5vIG9ic2VydmVyIGZpcmVzIOKAlCBhIGRpc2NhcmRlZCBhdHRlbXB0IGlzIG5vdCBhXG4gICAqIGN1cnNvciBzdG9wLCBiZWNhdXNlIGZyb20gc2hhcmVkIHN0YXRlJ3MgcG9pbnQgb2YgdmlldyBpdCBuZXZlciBoYXBwZW5lZC5cbiAgICovXG4gIGRpc2NhcmRTdGFnZWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmQuZGlzY2FyZCgpO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGVuZGluZ1dyaXRlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zdGFnZVdyaXRlcyA9IHt9O1xuICAgIHRoaXMuX3N0YWdlUmVhZHMgPSB7fTtcbiAgICB0aGlzLl9uZXN0ZWRSZWFkcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl92aWV3UmVhZHMgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIAgQXR0ZW1wdHMgKDEwLjEpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBBcHBlbmQgb25lIGF0dGVtcHQncyByZWNvcmQg4oCUIHRoZSBhdHRlbXB0IHJ1bm5lciBjYWxscyB0aGlzIGFzIGVhY2ggYXR0ZW1wdCBlbmRzLiAqL1xuICByZWNvcmRBdHRlbXB0KHJlY29yZDogQXR0ZW1wdFJlY29yZCk6IHZvaWQge1xuICAgICh0aGlzLl9hdHRlbXB0cyA/Pz0gW10pLnB1c2gocmVjb3JkKTtcbiAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKCkgPT4gdGhpcy5jYXB0dXJlPy5saW1pdCgnYXR0ZW50aW9uLW9taXR0ZWQnKSkpLnJlY29yZEF0dGVtcHQoXG4gICAgICByZWNvcmQsXG4gICAgICB0aGlzLnJ1bnRpbWVTdGFnZUlkLFxuICAgICk7XG4gICAgdGhpcy5ub3RlQXR0ZW1wdChyZWNvcmQpO1xuICAgIC8vIFRoZSBzdGFnZSBhdHRlbXB0IGlzIG92ZXIsIGhvd2V2ZXIgaXQgZW5kZWQ6IHRoZSBjYWxscyBpdCBtYWRlIHN0b3AgKFAyKS5cbiAgICB0aGlzLmVuZENhbGxzKHJlY29yZC5hdHRlbXB0KTtcbiAgfVxuXG4gIC8qKiBTdGFtcCB0aGUgc2VyaWVzJyBzdW1tYXJ5IOKAlCBvbmNlLCB3aGVuIHRoZSBydW5uZXIgZW5kcyB0aGUgc2VyaWVzLiAqL1xuICBlbmRBdHRlbXB0cyhzdW1tYXJ5OiBBdHRlbXB0U3VtbWFyeSk6IHZvaWQge1xuICAgIHRoaXMuX2F0dGVtcHRTdW1tYXJ5ID0gc3VtbWFyeTtcbiAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKCkgPT4gdGhpcy5jYXB0dXJlPy5saW1pdCgnYXR0ZW50aW9uLW9taXR0ZWQnKSkpLnJlY29yZFN1bW1hcnkoc3VtbWFyeSk7XG4gIH1cblxuICAvKiogUmVzZXQgb25seSBhdCB0aGUgbm9kZSdzIGV4ZWN1dGlvbiBzdGFtcCwgbmV2ZXIgYmV0d2VlbiBhdHRlbXB0cy4gKi9cbiAgYmVnaW5BdHRlbnRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fYXR0ZW50aW9uPy5iZWdpbigpO1xuICB9XG5cbiAgLyoqIERlbGVnYXRlIHRoZSBleHBsaWNpdCByZXRhaW5lZC1lcnJvciBmYWN0OyBhdHRlbnRpb24gb3ducyB2YWxpZGF0aW9uIG9mIGl0cyBwcm9vZi4gKi9cbiAgbWFya1N0YWdlRmFpbHVyZSgpOiB2b2lkIHtcbiAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKCkgPT4gdGhpcy5jYXB0dXJlPy5saW1pdCgnYXR0ZW50aW9uLW9taXR0ZWQnKSkpLnN0YWdlRmFpbGVkKFxuICAgICAgdGhpcy5kZWJ1Zy5lcnJvckNvbnRleHQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3Jhc2gtc2FmZSByZWNvcmQgKDEwLjEsIFA2KTogYW4gYXR0ZW1wdCB0aGF0IGVuZGVkIGlzIG5vdGVkIGluIHRoZSBydW4ncyBzaW5rIEFUIE9OQ0UsIGJlc2lkZSB0aGlzIGZyYW1lJ3NcbiAgICogbG9nIOKAlCBzbyBhIHByb2Nlc3Mga2lsbGVkIGJlZm9yZSB0aGUgc3RhZ2UgY29tbWl0cyAobWlkLXJldHJ5KSBzdGlsbCBsZWF2ZXMgZXZlcnkgYXR0ZW1wdCB0aGF0IGVuZGVkLiBUaGVcbiAgICogcmVjb3JkIGlzIHRoZSBvbmUgdGhlIHRyZWUga2VlcHM6IGZyb3plbiwgYHN0cnVjdHVyZWRDbG9uZWAtc2FmZSwgaXRzIGVycm9yIHRoZSBTRVJWRUQgZm9ybSAobm8gYHJhd2ApLCBzbyB0aGVcbiAgICogbm90ZSBuZWVkcyBubyBzZWNvbmQgcmVkYWN0aW9uIHBhc3MuIFdpdGhvdXQgYSBzaW5rIHRoZSBsb2cgZG9lcyBub3RoaW5nIChgRXZlbnRMb2cgwrcgbm90ZWApLlxuICAgKi9cbiAgcHJpdmF0ZSBub3RlQXR0ZW1wdChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZC5sb2c/Lm5vdGUoJ2F0dGVtcHQnLCB7IHJlY29yZCB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgYXR0ZW1wdHMgb2YgdGhpcyBleGVjdXRpb24gc28gZmFyLCBpbiBvcmRlciDigJQgaXRzIG93biBhbmQgaXRzIGNhbGxzJzsgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZS4gKi9cbiAgZ2V0IGF0dGVtcHRzKCk6IHJlYWRvbmx5IEF0dGVtcHRSZWNvcmRbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dGVtcHRzO1xuICB9XG5cbiAgLyoqIFRoZSBlbmRlZCBzZXJpZXMnIHN1bW1hcnk7IGB1bmRlZmluZWRgIHdoaWxlIGl0IHJ1bnMgYW5kIHdpdGhvdXQgYSBwb2xpY3kuICovXG4gIGdldCBhdHRlbXB0U3VtbWFyeSgpOiBBdHRlbXB0U3VtbWFyeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dGVtcHRTdW1tYXJ5O1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0IGFib3V0IHRvIHJ1biAoYW5kIHRoZSBydW4ncyBzaWduYWwpIOKAlCBgU3RhZ2VSdW5uZXJgIHNldHMgYm90aCBiZWZvcmUgaXQgYnVpbGRzIHRoZSBzY29wZS4gKi9cbiAgdXNlQXR0ZW1wdChhdHRlbXB0OiBBdHRlbXB0Q29udGV4dCB8IHVuZGVmaW5lZCwgcnVuU2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuc291cmNlQXR0ZW1wdCA9XG4gICAgICBhdHRlbXB0ICYmIHRoaXMuI2ZhaWx1cmVJZGVudGl0eVxuICAgICAgICA/IGJ1aWxkQXR0ZW1wdElkKHRoaXMuI2ZhaWx1cmVJZGVudGl0eS5ydW50aW1lU3RhZ2VJZCwgYXR0ZW1wdC5hdHRlbXB0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9hdHRlbXB0ID0gYXR0ZW1wdDtcbiAgICB0aGlzLl9ydW5TaWduYWwgPSBydW5TaWduYWw7XG4gIH1cblxuICAvKiogVGhlIGF0dGVtcHQgbm93IHJ1bm5pbmc7IGB1bmRlZmluZWRgIGZvciBhIHN0YWdlIHRoZSBhdHRlbXB0IHJ1bm5lciBkb2VzIG5vdCBydW4uICovXG4gIGdldCBhdHRlbXB0KCk6IEF0dGVtcHRDb250ZXh0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYXR0ZW1wdDtcbiAgfVxuXG4gIC8qKiBUaGUgcnVuJ3Mgc2lnbmFsLCBhcyBgU3RhZ2VSdW5uZXJgIGxhc3Qgc2F3IGl0LiAqL1xuICBnZXQgcnVuU2lnbmFsKCk6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuU2lnbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgYGF0dGVtcHRgIGVuZGVkIHdpdGhvdXQgYW4gYW5zd2VyOiBmcm9tIG5vdyBvbiBpdHMgc2NvcGUgaXMgZmVuY2VkIOKAlCBhIHdyaXRlLCBhbiBlbWl0IG9yIGEgcmVhZFxuICAgKiB0aHJvdWdoIGl0IGlzIHJlZnVzZWQgKGBTY29wZUZhY2FkZWApLiBUaGUgcnVubmVyIGNhbGxzIHRoaXMgdGhlIG1vbWVudCB0aGUgYXR0ZW1wdCdzIHNpZ25hbCBhYm9ydHMuXG4gICAqL1xuICBlbmRBdHRlbXB0KGF0dGVtcHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hdHRlbXB0Py5hdHRlbXB0ID09PSBhdHRlbXB0KSB0aGlzLnNvdXJjZUF0dGVtcHQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGF0dGVtcHQgPiB0aGlzLl9lbmRlZFRocm91Z2gpIHRoaXMuX2VuZGVkVGhyb3VnaCA9IGF0dGVtcHQ7XG4gICAgLy8gSXRzIGNhbGxzIHN0b3AgYXQgdGhlIHNhbWUgbW9tZW50LCB3aXRoIHRoZSBhdHRlbXB0J3Mgb3duIHJlYXNvbiB3aGVuIGl0cyBzaWduYWwgYWJvcnRlZCAoYSBjYXAgb3IgdGhlXG4gICAgLy8gZGVhZGxpbmUgaXMgYSB0aW1lIGxpbWl0OiBhIGNhbGwgaXQgY3V0cyB0aW1lZCBvdXQpIOKAlCBzeW5jaHJvbm91cywgYWhlYWQgb2YgdGhlIGNhbGxzJyBvd24gbGlzdGVuZXJzLlxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9hdHRlbXB0O1xuICAgIGNvbnN0IHNpZ25hbCA9IGN1cnJlbnQgIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50LmF0dGVtcHQgPT09IGF0dGVtcHQgPyBjdXJyZW50LnNpZ25hbCA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVuZENhbGxzKGF0dGVtcHQsIHNpZ25hbD8uYWJvcnRlZCA/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYXR0ZW1wdCBgYXR0ZW1wdGAgaGFzIGVuZGVkIOKAlCBpdHMgc2NvcGUgbWF5IG5vIGxvbmdlciB0b3VjaCB0aGUgc3RhZ2UuICovXG4gIGhhc0F0dGVtcHRFbmRlZChhdHRlbXB0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXR0ZW1wdCA8PSB0aGlzLl9lbmRlZFRocm91Z2g7XG4gIH1cblxuICAvKiogUmVjb3JkIGEgd3JpdGUgYW4gZW5kZWQgYXR0ZW1wdCB0cmllZCDigJQgYSBuYW1lLCBuZXZlciB0aGUgdmFsdWUuIEFwcGVuZC1vbmx5IGV2aWRlbmNlIGxpa2UgdGhlIGF0dGVtcHRzLiAqL1xuICByZWNvcmRMYXRlV3JpdGUod3JpdGU6IExhdGVXcml0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHdyaXRlcyA9ICh0aGlzLl9sYXRlV3JpdGVzID8/PSBbXSk7XG4gICAgLy8gQm91bmRlZDogdGhlIGZpcnN0IG9uZXMgc2F5IHdoYXQgdGhlIGFiYW5kb25lZCBhdHRlbXB0IGtlcHQgZG9pbmc7IGEgbG9vcCBvZiB0aGVtIGFkZHMgbm90aGluZy5cbiAgICBpZiAod3JpdGVzLmxlbmd0aCA8IE1BWF9MQVRFX1dSSVRFUykgd3JpdGVzLnB1c2goT2JqZWN0LmZyZWV6ZSh7IC4uLndyaXRlIH0pKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTaWRlIGVmZmVjdHMgKFAzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogVGhpcyBleGVjdXRpb24ncyBvd24gaWRlbXBvdGVuY3kga2V5IG1heSBiZSBtYWRlIG9mIGEgc2VsZWN0ZWQgdmFsdWUgKG9yIHdhcyBjYXJyaWVkIGJ5IGEgY2hlY2twb2ludCkuICovXG4gIHByaXZhdGUgX2VmZmVjdEtleVRhaW50ZWQgPSBmYWxzZTtcbiAgLyoqIEEgdG91Y2hpbmcgYCRjYWxsYCB3aXRoIE5PIGtleSBzdGFydGVkIGluIHRoaXMgZXhlY3V0aW9uIOKAlCB0aGUgc3RhZ2UgbWF5IG5vdCBiZSByZS1ydW4gYnkgYSByZXN1bWUuICovXG4gIHByaXZhdGUgX2tleWxlc3NFZmZlY3QgPSBmYWxzZTtcblxuICAvKipcbiAgICogU3RhcnQgYW4gZXhlY3V0aW9uJ3Mgc2lkZS1lZmZlY3QgYm9va2tlZXBpbmcgKGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCwgYmVmb3JlIGF0dGVtcHQgMSkg4oCUIHJlc2V0LFxuICAgKiBiZWNhdXNlIGEgZnJhbWUgY2FuIGJlIHJlLXVzZWQgYnkgYSBsYXRlciBleGVjdXRpb24uIGBrZXlUYWludGVkYDogdGhlIHN0YWdlJ3Mgb3duIGtleSBtYXkgYmUgbWFkZSBvZiBhIHNlbGVjdGVkXG4gICAqIHZhbHVlLCBzbyBhIGtleSBhIGAkY2FsbGAgcGFzc2VzIG9uIChgJGF0dGVtcHQoKS5pZGVtcG90ZW5jeUtleWApIGlzIHNlcnZlZCB0aGUgc2FtZSB3YXkuXG4gICAqL1xuICBiZWdpbkVmZmVjdHMoa2V5VGFpbnRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2VmZmVjdEtleVRhaW50ZWQgPSBrZXlUYWludGVkO1xuICAgIHRoaXMuX2tleWxlc3NFZmZlY3QgPSBmYWxzZTtcbiAgfVxuXG4gIGdldCBlZmZlY3RLZXlUYWludGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lZmZlY3RLZXlUYWludGVkO1xuICB9XG5cbiAgLyoqIEEga2V5bGVzcyB0b3VjaGluZyBgJGNhbGxgIHN0YXJ0ZWQ6IGFuIGBpbnRlcnJ1cHQoKWAgYWZ0ZXIgaXQgd291bGQgcmUtc2VuZCBpdCBvbiByZXN1bWUgKGBTdGFnZVJ1bm5lcmApLiAqL1xuICBtYXJrS2V5bGVzc0VmZmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9rZXlsZXNzRWZmZWN0ID0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBoYXNLZXlsZXNzRWZmZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9rZXlsZXNzRWZmZWN0O1xuICB9XG5cbiAgLy8g4pSA4pSAIENhbGxzIG1hZGUgaW5zaWRlIHRoZSBzdGFnZSAoUDIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBXaGVyZSB0aGlzIGV4ZWN1dGlvbidzIGNhbGwgcmVjb3JkcyBhcmUgcmVwb3J0ZWQg4oCUIHRoZSBlbmdpbmUgc2V0cyBpdCBiZWZvcmUgdGhlIHN0YWdlIHJ1bnMuICovXG4gIHVzZUF0dGVtcHRSZXBvcnRlcihcbiAgICByZXBvcnQ6ICgocmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8gfCB1bmRlZmluZWQpID0+IHZvaWQpIHwgdW5kZWZpbmVkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9hdHRlbXB0UmVwb3J0ZXIgPSByZXBvcnQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpZ25hbCB0aGUgY2FsbHMgb2Ygc3RhZ2UgYXR0ZW1wdCBgc3RhZ2VBdHRlbXB0YCBydW4gdW5kZXIgYmVzaWRlcyBpdHMgb3duIChQMik6IGFib3J0ZWQgd2hlbiB0aGF0IGF0dGVtcHQgaXNcbiAgICogb3ZlciDigJQgaG93ZXZlciBpdCBlbmRlZCDigJQgYW5kIHdoZW4gdGhlIGZyYW1lIGNvbW1pdHMsIHNvIG5vIGNhbGwgb3V0bGl2ZXMgdGhlIGF0dGVtcHQgdGhhdCBtYWRlIGl0IChub1xuICAgKiBiYWNrZ3JvdW5kIHJldHJ5LCBubyB3YWl0LCBubyBsaXN0ZW5lciBsZWZ0IG9uIHRoZSBydW4ncyBzaWduYWwpLiBBbHJlYWR5IGFib3J0ZWQgYWZ0ZXIgdGhlIGNvbW1pdC5cbiAgICovXG4gIGNhbGxzRW5kZWRTaWduYWwoc3RhZ2VBdHRlbXB0OiBudW1iZXIpOiBBYm9ydFNpZ25hbCB7XG4gICAgY29uc3QgZW5kZWQgPSAodGhpcy5fY2FsbHNFbmRlZCA/Pz0gbmV3IE1hcCgpKTtcbiAgICBsZXQgY29udHJvbGxlciA9IGVuZGVkLmdldChzdGFnZUF0dGVtcHQpO1xuICAgIGlmIChjb250cm9sbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBlbmRlZC5zZXQoc3RhZ2VBdHRlbXB0LCBjb250cm9sbGVyKTtcbiAgICAgIGlmICh0aGlzLl9jb21taXR0ZWQpIGNvbnRyb2xsZXIuYWJvcnQoY2FsbHNFbmRlZFJlYXNvbigpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuc2lnbmFsO1xuICB9XG5cbiAgLyoqIEVuZCB0aGUgY2FsbHMgb2YgYHN0YWdlQXR0ZW1wdGAgKGV2ZXJ5IGF0dGVtcHQncyB3aGVuIGB1bmRlZmluZWRgKSDigJQgYHJlYXNvbmAgd2hlbiB0aGUgYXR0ZW1wdCdzIHNpZ25hbCBnYXZlIG9uZS4gKi9cbiAgcHJpdmF0ZSBlbmRDYWxscyhzdGFnZUF0dGVtcHQ6IG51bWJlciB8IHVuZGVmaW5lZCwgcmVhc29uPzogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jYWxsc0VuZGVkID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IFthdHRlbXB0LCBjb250cm9sbGVyXSBvZiB0aGlzLl9jYWxsc0VuZGVkKSB7XG4gICAgICBpZiAoc3RhZ2VBdHRlbXB0ICE9PSB1bmRlZmluZWQgJiYgYXR0ZW1wdCAhPT0gc3RhZ2VBdHRlbXB0KSBjb250aW51ZTtcbiAgICAgIGlmICghY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY29udHJvbGxlci5hYm9ydChyZWFzb24gPz8gY2FsbHNFbmRlZFJlYXNvbigpKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIG5leHQgY2FsbCdzIG9yZGluYWwgd2l0aGluIHN0YWdlIGF0dGVtcHQgYHN0YWdlQXR0ZW1wdGAsIDEtYmFzZWQgKGBhdHRlbXB0L2NhbGwudHMgwrcgY2FsbFNlcmllc2ApLiAqL1xuICBuZXh0Q2FsbE9yZGluYWwoc3RhZ2VBdHRlbXB0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG9yZGluYWxzID0gKHRoaXMuX2NhbGxPcmRpbmFscyA/Pz0gbmV3IE1hcCgpKTtcbiAgICBjb25zdCBuZXh0ID0gKG9yZGluYWxzLmdldChzdGFnZUF0dGVtcHQpID8/IDApICsgMTtcbiAgICBvcmRpbmFscy5zZXQoc3RhZ2VBdHRlbXB0LCBuZXh0KTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNhbGwncyAob3IgYW4gb2JzZXJ2ZWQpIGF0dGVtcHQgcmVjb3JkOiBrZXB0IGJlc2lkZSB0aGUgc3RhZ2UncyBvd24gYXR0ZW1wdHMg4oCUIHRoZSBmaXJzdFxuICAgKiB7QGxpbmsgTUFYX0NBTExfUkVDT1JEU30sIHRoZSByZXN0IGNvdW50ZWQg4oCUIGFuZCByZXBvcnRlZCB0byB0aGUgcnVuJ3MgYG9uQXR0ZW1wdGAgZWl0aGVyIHdheS4gTGlrZSB0aGUgc3RhZ2Unc1xuICAgKiByZWNvcmRzLCBOT1QgY2xlYXJlZCBieSB7QGxpbmsgZGlzY2FyZFN0YWdlZH06IGEgZmFpbGVkIGF0dGVtcHQncyBjYWxscyBhcmUgZXZpZGVuY2UgdG9vLlxuICAgKi9cbiAgcmVwb3J0Q2FsbEF0dGVtcHQocmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2FsbFJlY29yZHMgPCBNQVhfQ0FMTF9SRUNPUkRTKSB7XG4gICAgICB0aGlzLl9jYWxsUmVjb3JkcyArPSAxO1xuICAgICAgKHRoaXMuX2F0dGVtcHRzID8/PSBbXSkucHVzaChyZWNvcmQpO1xuICAgICAgKHRoaXMuX2F0dGVudGlvbiA/Pz0gbmV3IFN0YWdlQXR0ZW50aW9uKCgpID0+IHRoaXMuY2FwdHVyZT8ubGltaXQoJ2F0dGVudGlvbi1vbWl0dGVkJykpKS5yZWNvcmRBdHRlbXB0KFxuICAgICAgICByZWNvcmQsXG4gICAgICAgIHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgICApO1xuICAgICAgdGhpcy5ub3RlQXR0ZW1wdChyZWNvcmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hdHRlbXB0c0Ryb3BwZWQgKz0gMTtcbiAgICAgICh0aGlzLl9hdHRlbnRpb24gPz89IG5ldyBTdGFnZUF0dGVudGlvbigoKSA9PiB0aGlzLmNhcHR1cmU/LmxpbWl0KCdhdHRlbnRpb24tb21pdHRlZCcpKSkuYXR0ZW1wdERyb3BwZWQoKTtcbiAgICB9XG4gICAgdGhpcy5fYXR0ZW1wdFJlcG9ydGVyPy4ocmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3IpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRyZWUgbmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3JlYXRlIChvciByZXR1cm4pIHRoaXMgY29udGV4dCdzIGxpbmtlZCBzdWNjZXNzb3IuXG4gICAqXG4gICAqIE1FTU9JWkVEOiB0aGUgZmlyc3QgY2FsbCBjcmVhdGVzIGB0aGlzLm5leHRgOyBldmVyeSBsYXRlciBjYWxsIHJldHVybnNcbiAgICogdGhhdCBTQU1FIGNvbnRleHQgYW5kIElHTk9SRVMgaXRzIGFyZ3VtZW50cy4gSW4gbm9ybWFsIHRyYXZlcnNhbCBlYWNoXG4gICAqIGNvbnRleHQgYWR2YW5jZXMgZXhhY3RseSBvbmNlLCBzbyB0aGUgbWVtbyBuZXZlciBiaXRlcyDigJQgYnV0IGEgY2FsbGVyXG4gICAqIGV4cGVjdGluZyBhIGZyZXNoIGNvbnRleHQgZm9yIGRpZmZlcmVudCBgc3RhZ2VOYW1lYC9gc3RhZ2VJZGAgYXJncyBnZXRzXG4gICAqIHRoZSBvbGQgb25lIHNpbGVudGx5LiBEZXYgbW9kZSAoYGVuYWJsZURldk1vZGUoKWApIHdhcm5zIG9uIHRoYXRcbiAgICogbWlzbWF0Y2ggKGJhY2tsb2cgQjQpLlxuICAgKi9cbiAgY3JlYXRlTmV4dChwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMubmV4dCkge1xuICAgICAgdGhpcy5uZXh0ID0gbmV3IFN0YWdlQ29udGV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMucmVjb3JkLnN0YXRlLCAnJywgdGhpcy5yZWNvcmQubG9nLCBpc0RlY2lkZXIpO1xuICAgICAgdGhpcy5uZXh0LnBhcmVudCA9IHRoaXM7XG4gICAgICB0aGlzLm5leHQuaW5oZXJpdFJ1bih0aGlzKTtcbiAgICAgIHRoaXMubmV4dC5mYWlsdXJlU3RhdGUgPSB0aGlzLmZhaWx1cmVTdGF0ZTtcbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpICYmICh0aGlzLm5leHQuc3RhZ2VJZCAhPT0gc3RhZ2VJZCB8fCB0aGlzLm5leHQuc3RhZ2VOYW1lICE9PSBzdGFnZU5hbWUpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gU3RhZ2VDb250ZXh0LmNyZWF0ZU5leHQ6IG5leHQgY29udGV4dCBhbHJlYWR5IGV4aXN0cyBhcyBcIiR7dGhpcy5uZXh0LnN0YWdlTmFtZX1cIiBgICtcbiAgICAgICAgICBgKGlkOiBcIiR7dGhpcy5uZXh0LnN0YWdlSWR9XCIpIOKAlCBhcmd1bWVudHMgXCIke3N0YWdlTmFtZX1cIiAoaWQ6IFwiJHtzdGFnZUlkfVwiKSBhcmUgaWdub3JlZCBgICtcbiAgICAgICAgICAnYW5kIHRoZSBleGlzdGluZyBjb250ZXh0IGlzIHJldHVybmVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZXh0O1xuICB9XG5cbiAgY3JlYXRlQ2hpbGQocnVuSWQ6IHN0cmluZywgYnJhbmNoSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5jaGlsZHJlbikge1xuICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IG5ldyBTdGFnZUNvbnRleHQocnVuSWQsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5yZWNvcmQuc3RhdGUsIGJyYW5jaElkLCB0aGlzLnJlY29yZC5sb2csIGlzRGVjaWRlcik7XG4gICAgY2hpbGQucGFyZW50ID0gdGhpcztcbiAgICBjaGlsZC5pbmhlcml0UnVuKHRoaXMpO1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgY3JlYXRlRGVjaWRlcihwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcpOiBTdGFnZUNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5leHQocGF0aCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0cnVlKTtcbiAgfVxuXG4gIHNldEFzRGVjaWRlcigpOiBTdGFnZUNvbnRleHQge1xuICAgIHRoaXMuaXNEZWNpZGVyID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEFzRm9yaygpOiBTdGFnZUNvbnRleHQge1xuICAgIHRoaXMuaXNGb3JrID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBEaWFnbm9zdGljcyBkZWxlZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBAaW50ZXJuYWwgUmV0YWluZWQgaW5jb21pbmcgdmFsdWUgZm9yIHRoZSBmYWNhZGUncyBsZWdhY3kgZW1pdCBjaGFubmVsLiAqL1xuICBhZGREaWFnbm9zdGljKGNoYW5uZWw6IERpYWdub3N0aWNDaGFubmVsLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLmRlYnVnLmFkZChjaGFubmVsLCBrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZExvZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTG9nKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRNZXRyaWMoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZE1ldHJpYyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0TWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkRXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldEV2YWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldEV2YWwoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFcnJvcihrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkRXJyb3Ioa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRGbG93RGVidWdNZXNzYWdlKFxuICAgIHR5cGU6IEZsb3dDb250cm9sVHlwZSxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IHRhcmdldFN0YWdlPzogc3RyaW5nIHwgc3RyaW5nW107IHJhdGlvbmFsZT86IHN0cmluZzsgY291bnQ/OiBudW1iZXI7IGl0ZXJhdGlvbj86IG51bWJlciB9LFxuICApIHtcbiAgICBjb25zdCBmbG93TWVzc2FnZTogRmxvd01lc3NhZ2UgPSB7IHR5cGUsIGRlc2NyaXB0aW9uLCB0aW1lc3RhbXA6IERhdGUubm93KCksIC4uLm9wdGlvbnMgfTtcbiAgICB0aGlzLmRlYnVnLmFkZEZsb3dNZXNzYWdlKGZsb3dNZXNzYWdlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTbmFwc2hvdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXRTdGFnZUlkKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnJ1bklkIHx8IHRoaXMucnVuSWQgPT09ICcnKSByZXR1cm4gdGhpcy5zdGFnZU5hbWU7XG4gICAgcmV0dXJuIGAke3RoaXMucnVuSWR9LiR7dGhpcy5zdGFnZU5hbWV9YDtcbiAgfVxuXG4gIGdldFNuYXBzaG90KCk6IFN0YWdlU25hcHNob3Qge1xuICAgIC8vIEl0ZXJhdGl2ZSB3YWxrIChleHBsaWNpdCB3b3JrIHN0YWNrKSwgTk9UIHJlY3Vyc2lvbjogdGhlIGV4ZWN1dGlvblxuICAgIC8vIHRyZWUgZGVlcGVucyBieSBvbmUgbGV2ZWwgcGVyIGV4ZWN1dGVkIHN0YWdlIGFsb25nIGBuZXh0YCBjaGFpbnMsIGFuZFxuICAgIC8vIHRoZSB0cmFtcG9saW5lZCB0cmF2ZXJzZXIgYWxsb3dzIGNoYWlucy9sb29wcyBvZiB0ZW5zIG9mIHRob3VzYW5kcyBvZlxuICAgIC8vIHN0YWdlcyDigJQgZmFyIGRlZXBlciB0aGFuIGEgcmVjdXJzaXZlIHNlcmlhbGl6ZXIgY2FuIHdhbGsgYmVmb3JlXG4gICAgLy8gXCJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnNuYXBzaG90U2VsZigpO1xuICAgIGNvbnN0IHdvcms6IEFycmF5PHsgY3R4OiBTdGFnZUNvbnRleHQ7IHNuYXA6IFN0YWdlU25hcHNob3QgfT4gPSBbeyBjdHg6IHRoaXMsIHNuYXA6IHJvb3QgfV07XG4gICAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBjdHgsIHNuYXAgfSA9IHdvcmsucG9wKCkhO1xuICAgICAgaWYgKGN0eC5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG5leHRTbmFwID0gY3R4Lm5leHQuc25hcHNob3RTZWxmKCk7XG4gICAgICAgIHNuYXAubmV4dCA9IG5leHRTbmFwO1xuICAgICAgICB3b3JrLnB1c2goeyBjdHg6IGN0eC5uZXh0LCBzbmFwOiBuZXh0U25hcCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjdHguY2hpbGRyZW4pIHtcbiAgICAgICAgc25hcC5jaGlsZHJlbiA9IGN0eC5jaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGRTbmFwID0gY2hpbGQuc25hcHNob3RTZWxmKCk7XG4gICAgICAgICAgd29yay5wdXNoKHsgY3R4OiBjaGlsZCwgc25hcDogY2hpbGRTbmFwIH0pO1xuICAgICAgICAgIHJldHVybiBjaGlsZFNuYXA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKiBTbmFwc2hvdCBvZiBUSElTIGNvbnRleHQncyBvd24gZmllbGRzIOKAlCBgbmV4dGAvYGNoaWxkcmVuYCBhcmUgZmlsbGVkXG4gICAqICBpbiBieSB0aGUgaXRlcmF0aXZlIHdhbGsgaW4gYGdldFNuYXBzaG90YC4gKi9cbiAgcHJpdmF0ZSBzbmFwc2hvdFNlbGYoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3Q6IFN0YWdlU25hcHNob3QgPSB7XG4gICAgICBpZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQgfHwgdW5kZWZpbmVkLFxuICAgICAgbmFtZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBpc0RlY2lkZXI6IHRoaXMuaXNEZWNpZGVyLFxuICAgICAgaXNGb3JrOiB0aGlzLmlzRm9yayxcbiAgICAgIGxvZ3M6IHRoaXMuZGVidWcubG9nQ29udGV4dCxcbiAgICAgIGVycm9yczogdGhpcy5kZWJ1Zy5lcnJvckNvbnRleHQsXG4gICAgICBtZXRyaWNzOiB0aGlzLmRlYnVnLm1ldHJpY0NvbnRleHQsXG4gICAgICBldmFsczogdGhpcy5kZWJ1Zy5ldmFsQ29udGV4dCxcbiAgICB9O1xuICAgIGlmICh0aGlzLnJlYWRTb3VyY2VzPy5vYnNlcnZpbmcpXG4gICAgICBzbmFwc2hvdC5yZWFkU291cmNlQ291bnRzID0gdGhpcy5zb3VyY2VSZWFkQ291bnRlcj8uc25hcHNob3QoKSA/PyBFTVBUWV9TT1VSQ0VfUkVBRF9DT1VOVFM7XG4gICAgY29uc3Qgc3RhZ2VXcml0ZXMgPSB0aGlzLnJldGFpbmVkV3JpdGVzKCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHN0YWdlV3JpdGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBFeHRyYWN0IHZhbHVlcyBvbmx5IGZvciB0aGUgc25hcHNob3QgKHN0cmlwIG9wZXJhdGlvbiBtZXRhZGF0YSlcbiAgICAgIGNvbnN0IHdyaXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2ssIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhzdGFnZVdyaXRlcykpIHtcbiAgICAgICAgd3JpdGVzW2tdID0gZW50cnkudmFsdWU7XG4gICAgICB9XG4gICAgICBzbmFwc2hvdC5zdGFnZVdyaXRlcyA9IHdyaXRlcztcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN0YWdlUmVhZHMgPSB0aGlzLl9zdGFnZVJlYWRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgc25hcHNob3QuZGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdWJmbG93SWQpIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dJZCA9IHRoaXMuc3ViZmxvd0lkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QuZmxvd01lc3NhZ2VzID0gdGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXM7XG4gICAgfVxuICAgIC8vIEEgY29weSBvZiB0aGUgbGlzdCAodGhlIHJlY29yZHMgdGhlbXNlbHZlcyBhcmUgZnJvemVuKTogYSByZWFkZXIgb2Ygb25lIHNuYXBzaG90IG5ldmVyIHNlZXMgYSBsYXRlclxuICAgIC8vIGF0dGVtcHQgYXJyaXZlIGluIGl0LCBhbmQgbmV2ZXIgZWRpdHMgdGhlIGZyYW1lJ3Mgb3duIGxpc3QuXG4gICAgaWYgKHRoaXMuX2F0dGVtcHRzKSBzbmFwc2hvdC5hdHRlbXB0cyA9IE9iamVjdC5mcmVlemUoWy4uLnRoaXMuX2F0dGVtcHRzXSk7XG4gICAgaWYgKHRoaXMuX2F0dGVtcHRTdW1tYXJ5KSBzbmFwc2hvdC5hdHRlbXB0U3VtbWFyeSA9IHRoaXMuX2F0dGVtcHRTdW1tYXJ5O1xuICAgIGlmICh0aGlzLl9sYXRlV3JpdGVzKSBzbmFwc2hvdC5sYXRlV3JpdGVzID0gT2JqZWN0LmZyZWV6ZShbLi4udGhpcy5fbGF0ZVdyaXRlc10pO1xuICAgIGlmICh0aGlzLl9hdHRlbXB0c0Ryb3BwZWQgPiAwKSBzbmFwc2hvdC5hdHRlbXB0c0Ryb3BwZWQgPSB0aGlzLl9hdHRlbXB0c0Ryb3BwZWQ7XG4gICAgY29uc3QgYXR0ZW50aW9uID0gdGhpcy5fYXR0ZW50aW9uPy5zbmFwc2hvdCgpO1xuICAgIGlmIChhdHRlbnRpb24/Lmxlbmd0aCkgc25hcHNob3QuYXR0ZW50aW9uID0gYXR0ZW50aW9uO1xuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxufVxuIl19