footprintjs 10.2.1 → 10.4.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 (131) hide show
  1. package/dist/esm/index.d.ts +3 -0
  2. package/dist/esm/index.js +1 -1
  3. package/dist/esm/lib/capture/absentEntries.d.ts +7 -0
  4. package/dist/esm/lib/capture/absentEntries.js +81 -0
  5. package/dist/esm/lib/capture/checkpointCapture.d.ts +11 -0
  6. package/dist/esm/lib/capture/checkpointCapture.js +104 -0
  7. package/dist/esm/lib/capture/historyData.d.ts +9 -0
  8. package/dist/esm/lib/capture/historyData.js +79 -0
  9. package/dist/esm/lib/capture/historyNote.d.ts +4 -0
  10. package/dist/esm/lib/capture/historyNote.js +52 -0
  11. package/dist/esm/lib/capture/historyTarget.d.ts +5 -0
  12. package/dist/esm/lib/capture/historyTarget.js +35 -0
  13. package/dist/esm/lib/capture/historyTypes.d.ts +39 -0
  14. package/dist/esm/lib/capture/historyTypes.js +4 -0
  15. package/dist/esm/lib/capture/nativeCoverage.d.ts +69 -0
  16. package/dist/esm/lib/capture/nativeCoverage.js +140 -0
  17. package/dist/esm/lib/capture/noteShape.d.ts +10 -0
  18. package/dist/esm/lib/capture/noteShape.js +93 -0
  19. package/dist/esm/lib/capture/readSources.d.ts +43 -0
  20. package/dist/esm/lib/capture/readSources.js +78 -0
  21. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +5 -2
  22. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
  23. package/dist/esm/lib/engine/types.d.ts +3 -0
  24. package/dist/esm/lib/engine/types.js +1 -1
  25. package/dist/esm/lib/memory/StageContext.d.ts +13 -0
  26. package/dist/esm/lib/memory/StageContext.js +110 -14
  27. package/dist/esm/lib/memory/attention.d.ts +2 -0
  28. package/dist/esm/lib/memory/attention.js +12 -5
  29. package/dist/esm/lib/memory/runPolicy.d.ts +5 -1
  30. package/dist/esm/lib/memory/runPolicy.js +2 -1
  31. package/dist/esm/lib/pause/record.js +8 -2
  32. package/dist/esm/lib/pause/types.d.ts +2 -0
  33. package/dist/esm/lib/pause/types.js +1 -1
  34. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +12 -1
  35. package/dist/esm/lib/recorder/ControlDepRecorder.js +23 -1
  36. package/dist/esm/lib/recorder/snapshot.d.ts +1 -1
  37. package/dist/esm/lib/recorder/snapshot.js +7 -2
  38. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +24 -1
  39. package/dist/esm/lib/runner/ExecutionRuntime.js +45 -4
  40. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +5 -0
  41. package/dist/esm/lib/runner/FlowChartExecutor.js +74 -7
  42. package/dist/esm/lib/runner/attach.js +6 -2
  43. package/dist/esm/lib/runner/captureHistory.d.ts +8 -0
  44. package/dist/esm/lib/runner/captureHistory.js +106 -0
  45. package/dist/esm/lib/runner/checkpoint.d.ts +2 -0
  46. package/dist/esm/lib/runner/checkpoint.js +3 -1
  47. package/dist/esm/lib/runner/index.d.ts +1 -0
  48. package/dist/esm/lib/runner/index.js +1 -1
  49. package/dist/esm/lib/runner/options.d.ts +3 -0
  50. package/dist/esm/lib/runner/options.js +46 -3
  51. package/dist/esm/lib/runner/readStoredCapture.d.ts +39 -0
  52. package/dist/esm/lib/runner/readStoredCapture.js +36 -0
  53. package/dist/esm/lib/runner/recordSink.d.ts +11 -0
  54. package/dist/esm/lib/runner/recordSink.js +47 -4
  55. package/dist/esm/lib/runner/snapshot.d.ts +3 -1
  56. package/dist/esm/lib/runner/snapshot.js +35 -4
  57. package/dist/esm/lib/runner/storedCaptureAdmission.d.ts +4 -0
  58. package/dist/esm/lib/runner/storedCaptureAdmission.js +97 -0
  59. package/dist/esm/lib/scope/ScopeFacade.js +4 -2
  60. package/dist/esm/lib/scope/runtime.d.ts +2 -0
  61. package/dist/esm/lib/scope/runtime.js +9 -1
  62. package/dist/esm/lib/sinks/fileSink.d.ts +2 -1
  63. package/dist/esm/lib/sinks/fileSink.js +8 -2
  64. package/dist/esm/trace.d.ts +2 -0
  65. package/dist/esm/trace.js +2 -1
  66. package/dist/index.js +1 -1
  67. package/dist/lib/capture/absentEntries.js +86 -0
  68. package/dist/lib/capture/checkpointCapture.js +110 -0
  69. package/dist/lib/capture/historyData.js +85 -0
  70. package/dist/lib/capture/historyNote.js +56 -0
  71. package/dist/lib/capture/historyTarget.js +40 -0
  72. package/dist/lib/capture/historyTypes.js +7 -0
  73. package/dist/lib/capture/nativeCoverage.js +146 -0
  74. package/dist/lib/capture/noteShape.js +103 -0
  75. package/dist/lib/capture/readSources.js +83 -0
  76. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -2
  77. package/dist/lib/engine/types.js +1 -1
  78. package/dist/lib/memory/StageContext.js +110 -14
  79. package/dist/lib/memory/attention.js +12 -5
  80. package/dist/lib/memory/runPolicy.js +2 -1
  81. package/dist/lib/pause/record.js +8 -2
  82. package/dist/lib/pause/types.js +1 -1
  83. package/dist/lib/recorder/ControlDepRecorder.js +23 -1
  84. package/dist/lib/recorder/snapshot.js +7 -2
  85. package/dist/lib/runner/ExecutionRuntime.js +44 -3
  86. package/dist/lib/runner/FlowChartExecutor.js +77 -10
  87. package/dist/lib/runner/attach.js +5 -1
  88. package/dist/lib/runner/captureHistory.js +110 -0
  89. package/dist/lib/runner/checkpoint.js +3 -1
  90. package/dist/lib/runner/index.js +1 -1
  91. package/dist/lib/runner/options.js +46 -3
  92. package/dist/lib/runner/readStoredCapture.js +40 -0
  93. package/dist/lib/runner/recordSink.js +47 -4
  94. package/dist/lib/runner/snapshot.js +35 -4
  95. package/dist/lib/runner/storedCaptureAdmission.js +101 -0
  96. package/dist/lib/scope/ScopeFacade.js +3 -1
  97. package/dist/lib/scope/runtime.js +12 -2
  98. package/dist/lib/sinks/fileSink.js +8 -2
  99. package/dist/trace.js +4 -2
  100. package/dist/types/index.d.ts +3 -0
  101. package/dist/types/lib/capture/absentEntries.d.ts +7 -0
  102. package/dist/types/lib/capture/checkpointCapture.d.ts +11 -0
  103. package/dist/types/lib/capture/historyData.d.ts +9 -0
  104. package/dist/types/lib/capture/historyNote.d.ts +4 -0
  105. package/dist/types/lib/capture/historyTarget.d.ts +5 -0
  106. package/dist/types/lib/capture/historyTypes.d.ts +39 -0
  107. package/dist/types/lib/capture/nativeCoverage.d.ts +69 -0
  108. package/dist/types/lib/capture/noteShape.d.ts +10 -0
  109. package/dist/types/lib/capture/readSources.d.ts +43 -0
  110. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
  111. package/dist/types/lib/engine/types.d.ts +3 -0
  112. package/dist/types/lib/memory/StageContext.d.ts +13 -0
  113. package/dist/types/lib/memory/attention.d.ts +2 -0
  114. package/dist/types/lib/memory/runPolicy.d.ts +5 -1
  115. package/dist/types/lib/pause/types.d.ts +2 -0
  116. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +12 -1
  117. package/dist/types/lib/recorder/snapshot.d.ts +1 -1
  118. package/dist/types/lib/runner/ExecutionRuntime.d.ts +24 -1
  119. package/dist/types/lib/runner/FlowChartExecutor.d.ts +5 -0
  120. package/dist/types/lib/runner/captureHistory.d.ts +8 -0
  121. package/dist/types/lib/runner/checkpoint.d.ts +2 -0
  122. package/dist/types/lib/runner/index.d.ts +1 -0
  123. package/dist/types/lib/runner/options.d.ts +3 -0
  124. package/dist/types/lib/runner/readStoredCapture.d.ts +39 -0
  125. package/dist/types/lib/runner/recordSink.d.ts +11 -0
  126. package/dist/types/lib/runner/snapshot.d.ts +3 -1
  127. package/dist/types/lib/runner/storedCaptureAdmission.d.ts +4 -0
  128. package/dist/types/lib/scope/runtime.d.ts +2 -0
  129. package/dist/types/lib/sinks/fileSink.d.ts +2 -1
  130. package/dist/types/trace.d.ts +2 -0
  131. package/package.json +2 -2
@@ -3,11 +3,13 @@ import type { Attention } from 'foottrace';
3
3
  import type { AttemptRecord, AttemptSummary } from '../attempt/types.js';
4
4
  /** One execution's ownership, pending summary, marks and omission accounting stay in this helper. */
5
5
  export declare class StageAttention {
6
+ private readonly onOmitted?;
6
7
  private marks?;
7
8
  private omitted;
8
9
  private retryPossible;
9
10
  private summary?;
10
11
  private terminal?;
12
+ constructor(onOmitted?: (() => void) | undefined);
11
13
  /** A new execution starts fresh; an attempt discard never calls this. No collection is reconstructed. */
12
14
  begin(): void;
13
15
  /** Called only after the frame retained this attempt. Raw error, target and decision payloads are never read. */
@@ -38,11 +38,15 @@ function attemptReference(record, owner) {
38
38
  }
39
39
  /** One execution's ownership, pending summary, marks and omission accounting stay in this helper. */
40
40
  export class StageAttention {
41
+ onOmitted;
41
42
  marks;
42
43
  omitted = false;
43
44
  retryPossible = false;
44
45
  summary;
45
46
  terminal;
47
+ constructor(onOmitted) {
48
+ this.onOmitted = onOmitted;
49
+ }
46
50
  /** A new execution starts fresh; an attempt discard never calls this. No collection is reconstructed. */
47
51
  begin() {
48
52
  this.marks = undefined;
@@ -131,34 +135,37 @@ export class StageAttention {
131
135
  }
132
136
  /** Keep only bounded exact references; one slot is reserved to disclose omissions. */
133
137
  append(attention) {
138
+ if (attention.kind === 'not-collected')
139
+ this.onOmitted?.();
134
140
  const key = attention.kind + ':' + attention.reason;
135
141
  const previous = this.marks?.get(key);
136
142
  const references = [...(previous?.evidence ?? [])];
137
143
  for (const reference of attention.evidence) {
138
144
  if (!validReference(reference)) {
139
- this.omitted = true;
145
+ this.missing();
140
146
  continue;
141
147
  }
142
148
  if (references.includes(reference))
143
149
  continue;
144
150
  if (references.length >= MAX_REFERENCES) {
145
- this.omitted = true;
151
+ this.missing();
146
152
  continue;
147
153
  }
148
154
  references.push(reference);
149
155
  }
150
156
  if (attention.kind !== 'not-collected' && references.length === 0) {
151
- this.omitted = true;
157
+ this.missing();
152
158
  return;
153
159
  }
154
160
  if (!previous && (this.marks?.size ?? 0) >= MAX_MARKS - 1) {
155
- this.omitted = true;
161
+ this.missing();
156
162
  return;
157
163
  }
158
164
  (this.marks ??= new Map()).set(key, { kind: attention.kind, reason: attention.reason, evidence: references });
159
165
  }
160
166
  missing() {
161
167
  this.omitted = true;
168
+ this.onOmitted?.();
162
169
  }
163
170
  /** Copy already collected bounded marks, never an attempt array, diagnostic bag or execution tree. */
164
171
  snapshot() {
@@ -168,4 +175,4 @@ export class StageAttention {
168
175
  return Object.freeze(result);
169
176
  }
170
177
  }
171
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW50aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYXR0ZW50aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSTNELE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUNyQixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFDakMsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDM0UsTUFBTSxpQkFBaUIsR0FBYyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2pELElBQUksRUFBRSxlQUFlO0lBQ3JCLE1BQU0sRUFBRSx3QkFBd0I7SUFDaEMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0NBQzVCLENBQUMsQ0FBQztBQUVILFNBQVMsY0FBYyxDQUFDLFNBQWtCO0lBQ3hDLE9BQU8sQ0FDTCxPQUFPLFNBQVMsS0FBSyxRQUFRO1FBQzdCLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUNwQixTQUFTLENBQUMsTUFBTSxJQUFJLG9CQUFvQjtRQUN4Qyx1R0FBdUc7UUFDdkcsQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQ2hELENBQUM7QUFDSixDQUFDO0FBRUQsNEdBQTRHO0FBQzVHLFNBQVMsZ0JBQWdCLENBQUMsTUFBcUIsRUFBRSxLQUFhO0lBQzVELElBQ0UsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVE7UUFDakMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDckMsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxNQUFN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LFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztJQUVELHNHQUFzRztJQUN0RyxRQUFRO1FBQ04sTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQ2pFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUNsRixDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUM7WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDcEgsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBFbmdpbmUtb3duZWQgYXR0ZW50aW9uIGlzIGNvbGxlY3RlZCB3aXRoIHJldGFpbmVkIGZhY3RzOyBzbmFwc2hvdHMgb25seSBjb3B5IHRoaXMgYm91bmRlZCBwcm9qZWN0aW9uLiAqL1xuaW1wb3J0IHR5cGUgeyBBdHRlbnRpb24gfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgYnVpbGRBdHRlbXB0SWQsIHBhcnNlQXR0ZW1wdElkIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBBdHRlbXB0UmVjb3JkLCBBdHRlbXB0U3VtbWFyeSB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuXG5jb25zdCBNQVhfTUFSS1MgPSAzMjtcbmNvbnN0IE1BWF9SRUZFUkVOQ0VTID0gMTY7XG5jb25zdCBNQVhfUkVGRVJFTkNFX0xFTkdUSCA9IDUxMjtcbmNvbnN0IFNUT1BQRURfUkVBU09OUyA9IG5ldyBTZXQoWydleGhhdXN0ZWQnLCAnZGVjbGluZWQnLCAnbm8tdGltZS1sZWZ0J10pO1xuY29uc3QgTUlTU0lOR19BVFRFTlRJT046IEF0dGVudGlvbiA9IE9iamVjdC5mcmVlemUoe1xuICBraW5kOiAnbm90LWNvbGxlY3RlZCcsXG4gIHJlYXNvbjogJ0VWSURFTkNFX05PVF9DT0xMRUNURUQnLFxuICBldmlkZW5jZTogT2JqZWN0LmZyZWV6ZShbXSksXG59KTtcblxuZnVuY3Rpb24gdmFsaWRSZWZlcmVuY2UocmVmZXJlbmNlOiB1bmtub3duKTogcmVmZXJlbmNlIGlzIHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHJlZmVyZW5jZSA9PT0gJ3N0cmluZycgJiZcbiAgICByZWZlcmVuY2UubGVuZ3RoID4gMCAmJlxuICAgIHJlZmVyZW5jZS5sZW5ndGggPD0gTUFYX1JFRkVSRU5DRV9MRU5HVEggJiZcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBNYXRjaCB0aGUgc2hhcmVkIEZvb3R0cmFjZSBldmlkZW5jZS1yZWZlcmVuY2UgYm91bmRhcnkuXG4gICAgIS9bXFx1MDAwMC1cXHUwMDFmXFx1MDA3Zi1cXHUwMDlmXS8udGVzdChyZWZlcmVuY2UpXG4gICk7XG59XG5cbi8qKiBSZXVzZSB0aGUgb25lIGF0dGVtcHQgZ3JhbW1hciwgaW5jbHVkaW5nIG5lc3RlZCBjYWxsIGFkZHJlc3NlczsgbmV2ZXIgc2hvcnRlbiBhbiB1bmFkZHJlc3NhYmxlIHByb29mLiAqL1xuZnVuY3Rpb24gYXR0ZW1wdFJlZmVyZW5jZShyZWNvcmQ6IEF0dGVtcHRSZWNvcmQsIG93bmVyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoXG4gICAgdHlwZW9mIHJlY29yZC5zZXJpZXMgIT09ICdzdHJpbmcnIHx8XG4gICAgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHJlY29yZC5hdHRlbXB0KSB8fFxuICAgIHJlY29yZC5hdHRlbXB0IDwgMSB8fFxuICAgIHJlY29yZC5zZXJpZXMubGVuZ3RoICsgU3RyaW5nKHJlY29yZC5hdHRlbXB0KS5sZW5ndGggKyAxID4gTUFYX1JFRkVSRU5DRV9MRU5HVEhcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcmVjb3JkLnNlcmllcyArICdAJyArIHJlY29yZC5hdHRlbXB0O1xuICAgIGNvbnN0IHBhcnRzID0gcGFyc2VBdHRlbXB0SWQoY2FuZGlkYXRlKTtcbiAgICBpZiAoXG4gICAgICAhcGFydHMgfHxcbiAgICAgIHBhcnRzLnJ1bnRpbWVTdGFnZUlkICE9PSBvd25lciB8fFxuICAgICAgKHJlY29yZC5raW5kID09PSAnc3RhZ2UnID8gcGFydHMuY2FsbCAhPT0gdW5kZWZpbmVkIDogcGFydHMuY2FsbCA9PT0gdW5kZWZpbmVkKVxuICAgIClcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY2Fub25pY2FsID0gYnVpbGRBdHRlbXB0SWQocGFydHMucnVudGltZVN0YWdlSWQsIHBhcnRzLmF0dGVtcHQsIHBhcnRzLmNhbGwpO1xuICAgIHJldHVybiBjYW5vbmljYWwgPT09IGNhbmRpZGF0ZSAmJiB2YWxpZFJlZmVyZW5jZShjYW5vbmljYWwpID8gY2Fub25pY2FsIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbnR5cGUgVGVybWluYWxQcm9vZiA9IFBpY2s8QXR0ZW1wdFJlY29yZCwgJ25leHQnIHwgJ3JlYXNvbicgfCAnZWZmZWN0Jz4gJiB7IHJlYWRvbmx5IGV2aWRlbmNlOiBzdHJpbmcgfTtcblxuLyoqIE9uZSBleGVjdXRpb24ncyBvd25lcnNoaXAsIHBlbmRpbmcgc3VtbWFyeSwgbWFya3MgYW5kIG9taXNzaW9uIGFjY291bnRpbmcgc3RheSBpbiB0aGlzIGhlbHBlci4gKi9cbmV4cG9ydCBjbGFzcyBTdGFnZUF0dGVudGlvbiB7XG4gIHByaXZhdGUgbWFya3M/OiBNYXA8c3RyaW5nLCBBdHRlbnRpb24+O1xuICBwcml2YXRlIG9taXR0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXRyeVBvc3NpYmxlID0gZmFsc2U7XG4gIHByaXZhdGUgc3VtbWFyeT86IEF0dGVtcHRTdW1tYXJ5O1xuICBwcml2YXRlIHRlcm1pbmFsPzogVGVybWluYWxQcm9vZjtcblxuICAvKiogQSBuZXcgZXhlY3V0aW9uIHN0YXJ0cyBmcmVzaDsgYW4gYXR0ZW1wdCBkaXNjYXJkIG5ldmVyIGNhbGxzIHRoaXMuIE5vIGNvbGxlY3Rpb24gaXMgcmVjb25zdHJ1Y3RlZC4gKi9cbiAgYmVnaW4oKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9taXR0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnJldHJ5UG9zc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnN1bW1hcnkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50ZXJtaW5hbCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgb25seSBhZnRlciB0aGUgZnJhbWUgcmV0YWluZWQgdGhpcyBhdHRlbXB0LiBSYXcgZXJyb3IsIHRhcmdldCBhbmQgZGVjaXNpb24gcGF5bG9hZHMgYXJlIG5ldmVyIHJlYWQuICovXG4gIHJlY29yZEF0dGVtcHQocmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBvd25lcjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gYXR0ZW1wdFJlZmVyZW5jZShyZWNvcmQsIG93bmVyKTtcbiAgICBpZiAocmVjb3JkLmtpbmQgPT09ICdzdGFnZScgJiYgcmVjb3JkLnNlcmllcyA9PT0gb3duZXIpIHtcbiAgICAgIGlmIChyZWNvcmQucmV0cnlMb29wID09PSB1bmRlZmluZWQgJiYgKHJlY29yZC5vZiA/PyAxKSA+IDEpIHRoaXMucmV0cnlQb3NzaWJsZSA9IHRydWU7XG4gICAgICBpZiAocmVmZXJlbmNlICYmIHJlY29yZC5uZXh0ICE9PSAncmV0cnknKSB7XG4gICAgICAgIHRoaXMudGVybWluYWwgPSB7IG5leHQ6IHJlY29yZC5uZXh0LCByZWFzb246IHJlY29yZC5yZWFzb24sIGVmZmVjdDogcmVjb3JkLmVmZmVjdCwgZXZpZGVuY2U6IHJlZmVyZW5jZSB9O1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBUaGUgcnVubmVyIGNhbGxzIHJlY29yZFN1bW1hcnkgYmVmb3JlIGl0cyBmaW5hbCBhdHRlbXB0LiBGaW5pc2ggdGhhdCBwZW5kaW5nIHByb2plY3Rpb24gbm93IHRvby5cbiAgICB0aGlzLnByb2plY3RTdW1tYXJ5KCk7XG4gICAgY29uc3QgYWRkID0gKGtpbmQ6IEF0dGVudGlvblsna2luZCddLCByZWFzb246IEF0dGVudGlvblsncmVhc29uJ10pID0+IHtcbiAgICAgIGlmIChyZWZlcmVuY2UpIHRoaXMuYXBwZW5kKHsga2luZCwgcmVhc29uLCBldmlkZW5jZTogW3JlZmVyZW5jZV0gfSk7XG4gICAgICBlbHNlIHRoaXMubWlzc2luZygpO1xuICAgIH07XG4gICAgaWYgKHJlY29yZC5lZmZlY3QgPT09ICd1bmtub3duJykgYWRkKCd1bmtub3duLWVmZmVjdCcsICdVTktOT1dOX0VGRkVDVF9SRUNPUkRFRCcpO1xuICAgIGlmIChyZWNvcmQub3V0Y29tZSA9PT0gJ3RpbWVvdXQnKSBhZGQoJ3RpbWVvdXQnLCAnVElNRU9VVF9SRUNPUkRFRCcpO1xuICAgIC8vIEFuIFNESydzIHN1Z2dlc3RlZCBuZXh0L3JlYXNvbiBpcyBub3QgaXRzIGFjdHVhbCBwb2xpY3k7IG9ubHkgYSBsYXRlciBvcmRpbmFsIHByb3ZlcyBpdHMgcmV0cnkuXG4gICAgY29uc3Qgb2JzZXJ2ZWQgPSByZWNvcmQua2luZCA9PT0gJ29ic2VydmVkJztcbiAgICBpZiAoKCFvYnNlcnZlZCAmJiByZWNvcmQubmV4dCA9PT0gJ3JldHJ5JykgfHwgcmVjb3JkLmF0dGVtcHQgPiAxKSBhZGQoJ3JldHJpZWQnLCAnUkVUUllfUkVDT1JERUQnKTtcbiAgICBpZiAoXG4gICAgICAhb2JzZXJ2ZWQgJiZcbiAgICAgIHJlY29yZC5uZXh0ID09PSAnc3RvcCcgJiZcbiAgICAgIFNUT1BQRURfUkVBU09OUy5oYXMocmVjb3JkLnJlYXNvbikgJiZcbiAgICAgIChyZWNvcmQub2YgPz8gMSkgPiAxICYmXG4gICAgICByZWNvcmQucmV0cnlMb29wID09PSB1bmRlZmluZWRcbiAgICApXG4gICAgICBhZGQoJ2dhdmUtdXAnLCAnUkVUUllfU1RPUF9SRUNPUkRFRCcpO1xuICB9XG5cbiAgcmVjb3JkU3VtbWFyeShzdW1tYXJ5OiBBdHRlbXB0U3VtbWFyeSk6IHZvaWQge1xuICAgIHRoaXMuc3VtbWFyeSA9IHN1bW1hcnk7XG4gICAgdGhpcy5wcm9qZWN0U3VtbWFyeSgpO1xuICB9XG5cbiAgLyoqIEEgc3VtbWFyeS1vbmx5IGN1dCB3YWl0IGhhcyBubyBwaGFudG9tIGZpbmFsIGF0dGVtcHQ7IHVzZSBpdHMgYWN0dWFsIHJldGFpbmVkIHN1bW1hcnkuICovXG4gIHByaXZhdGUgcHJvamVjdFN1bW1hcnkoKTogdm9pZCB7XG4gICAgY29uc3QgbGFzdCA9IHRoaXMuc3VtbWFyeT8ubGFzdDtcbiAgICBpZiAoIWxhc3QpIHJldHVybjtcbiAgICBjb25zdCB0ZXJtaW5hbCA9IHRoaXMudGVybWluYWw7XG4gICAgY29uc3QgbWF0Y2hpbmcgPSB0ZXJtaW5hbD8ubmV4dCA9PT0gbGFzdC5uZXh0ICYmIHRlcm1pbmFsLnJlYXNvbiA9PT0gbGFzdC5yZWFzb247XG4gICAgY29uc3QgYWRkID0gKGtpbmQ6IEF0dGVudGlvblsna2luZCddLCByZWFzb246IEF0dGVudGlvblsncmVhc29uJ10sIHByb29mPzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCByZWZlcmVuY2UgPSBwcm9vZiA/PyAnYXR0ZW1wdFN1bW1hcnknO1xuICAgICAgY29uc3Qga2V5ID0ga2luZCArICc6JyArIHJlYXNvbjtcbiAgICAgIGNvbnN0IG1hcmtzID0gdGhpcy5tYXJrcztcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gbWFya3M/LmdldChrZXkpO1xuICAgICAgaWYgKHByb29mICYmIG1hcmtzICYmIHByZXZpb3VzPy5ldmlkZW5jZS5pbmNsdWRlcygnYXR0ZW1wdFN1bW1hcnknKSkge1xuICAgICAgICBtYXJrcy5zZXQoa2V5LCB7IC4uLnByZXZpb3VzLCBldmlkZW5jZTogcHJldmlvdXMuZXZpZGVuY2UuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSAnYXR0ZW1wdFN1bW1hcnknKSB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kKHsga2luZCwgcmVhc29uLCBldmlkZW5jZTogW3JlZmVyZW5jZV0gfSk7XG4gICAgfTtcbiAgICBpZiAobGFzdC5lZmZlY3QgPT09ICd1bmtub3duJylcbiAgICAgIGFkZChcbiAgICAgICAgJ3Vua25vd24tZWZmZWN0JyxcbiAgICAgICAgJ1VOS05PV05fRUZGRUNUX1JFQ09SREVEJyxcbiAgICAgICAgbWF0Y2hpbmcgJiYgdGVybWluYWwuZWZmZWN0ID09PSAndW5rbm93bicgPyB0ZXJtaW5hbC5ldmlkZW5jZSA6IHVuZGVmaW5lZCxcbiAgICAgICk7XG4gICAgaWYgKHRoaXMucmV0cnlQb3NzaWJsZSAmJiBsYXN0Lm5leHQgPT09ICdzdG9wJyAmJiBTVE9QUEVEX1JFQVNPTlMuaGFzKGxhc3QucmVhc29uKSlcbiAgICAgIGFkZCgnZ2F2ZS11cCcsICdSRVRSWV9TVE9QX1JFQ09SREVEJywgbWF0Y2hpbmcgPyB0ZXJtaW5hbC5ldmlkZW5jZSA6IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKiogT25seSB0aGUgZXhwbGljaXQgcmV0YWluZWQgc3RhZ2UtZXJyb3IgcGF0aCBjYWxscyB0aGlzOyBhIGRpYWdub3N0aWMgdmFsdWUgbmV2ZXIgY2xhc3NpZmllcyBpdHNlbGYuICovXG4gIHN0YWdlRmFpbGVkKGVycm9yczogdW5rbm93bik6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID1cbiAgICAgICAgZXJyb3JzICYmIHR5cGVvZiBlcnJvcnMgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGVycm9ycywgJ3N0YWdlRXhlY3V0aW9uRXJyb3InKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgJiYgT2JqZWN0Lmhhc093bihkZXNjcmlwdG9yLCAndmFsdWUnKSkge1xuICAgICAgICB0aGlzLmFwcGVuZCh7IGtpbmQ6ICdlcnJvcicsIHJlYXNvbjogJ0VSUk9SX1JFQ09SREVEJywgZXZpZGVuY2U6IFsnZXJyb3JzOnN0YWdlRXhlY3V0aW9uRXJyb3InXSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogQSBtYWxmb3JtZWQgZXZpZGVuY2UgYmFnIGlzIHVuYXZhaWxhYmxlLCBuZXZlciBhbm90aGVyIHN0YWdlIGZhaWx1cmUuICovXG4gICAgfVxuICAgIHRoaXMubWlzc2luZygpO1xuICB9XG5cbiAgYXR0ZW1wdERyb3BwZWQoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBlbmQoeyBraW5kOiAnbm90LWNvbGxlY3RlZCcsIHJlYXNvbjogJ0VWSURFTkNFX05PVF9DT0xMRUNURUQnLCBldmlkZW5jZTogWydhdHRlbXB0c0Ryb3BwZWQnXSB9KTtcbiAgfVxuXG4gIC8qKiBLZWVwIG9ubHkgYm91bmRlZCBleGFjdCByZWZlcmVuY2VzOyBvbmUgc2xvdCBpcyByZXNlcnZlZCB0byBkaXNjbG9zZSBvbWlzc2lvbnMuICovXG4gIGFwcGVuZChhdHRlbnRpb246IEF0dGVudGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGF0dGVudGlvbi5raW5kICsgJzonICsgYXR0ZW50aW9uLnJlYXNvbjtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMubWFya3M/LmdldChrZXkpO1xuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBbLi4uKHByZXZpb3VzPy5ldmlkZW5jZSA/PyBbXSldO1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGF0dGVudGlvbi5ldmlkZW5jZSkge1xuICAgICAgaWYgKCF2YWxpZFJlZmVyZW5jZShyZWZlcmVuY2UpKSB7XG4gICAgICAgIHRoaXMub21pdHRlZCA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHJlZmVyZW5jZXMuaW5jbHVkZXMocmVmZXJlbmNlKSkgY29udGludWU7XG4gICAgICBpZiAocmVmZXJlbmNlcy5sZW5ndGggPj0gTUFYX1JFRkVSRU5DRVMpIHtcbiAgICAgICAgdGhpcy5vbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZWZlcmVuY2VzLnB1c2gocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgaWYgKGF0dGVudGlvbi5raW5kICE9PSAnbm90LWNvbGxlY3RlZCcgJiYgcmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMub21pdHRlZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghcHJldmlvdXMgJiYgKHRoaXMubWFya3M/LnNpemUgPz8gMCkgPj0gTUFYX01BUktTIC0gMSkge1xuICAgICAgdGhpcy5vbWl0dGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKHRoaXMubWFya3MgPz89IG5ldyBNYXAoKSkuc2V0KGtleSwgeyBraW5kOiBhdHRlbnRpb24ua2luZCwgcmVhc29uOiBhdHRlbnRpb24ucmVhc29uLCBldmlkZW5jZTogcmVmZXJlbmNlcyB9KTtcbiAgfVxuXG4gIG1pc3NpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5vbWl0dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBDb3B5IGFscmVhZHkgY29sbGVjdGVkIGJvdW5kZWQgbWFya3MsIG5ldmVyIGFuIGF0dGVtcHQgYXJyYXksIGRpYWdub3N0aWMgYmFnIG9yIGV4ZWN1dGlvbiB0cmVlLiAqL1xuICBzbmFwc2hvdCgpOiByZWFkb25seSBBdHRlbnRpb25bXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gWy4uLih0aGlzLm1hcmtzPy52YWx1ZXMoKSA/PyBbXSldLm1hcCgoYXR0ZW50aW9uKSA9PlxuICAgICAgT2JqZWN0LmZyZWV6ZSh7IC4uLmF0dGVudGlvbiwgZXZpZGVuY2U6IE9iamVjdC5mcmVlemUoWy4uLmF0dGVudGlvbi5ldmlkZW5jZV0pIH0pLFxuICAgICk7XG4gICAgaWYgKHRoaXMub21pdHRlZCAmJiAhcmVzdWx0LnNvbWUoKGF0dGVudGlvbikgPT4gYXR0ZW50aW9uLmtpbmQgPT09ICdub3QtY29sbGVjdGVkJykpIHJlc3VsdC5wdXNoKE1JU1NJTkdfQVRURU5USU9OKTtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShyZXN1bHQpO1xuICB9XG59XG4iXX0=
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW50aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYXR0ZW50aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSTNELE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUNyQixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFDakMsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDM0UsTUFBTSxpQkFBaUIsR0FBYyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2pELElBQUksRUFBRSxlQUFlO0lBQ3JCLE1BQU0sRUFBRSx3QkFBd0I7SUFDaEMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0NBQzVCLENBQUMsQ0FBQztBQUVILFNBQVMsY0FBYyxDQUFDLFNBQWtCO0lBQ3hDLE9BQU8sQ0FDTCxPQUFPLFNBQVMsS0FBSyxRQUFRO1FBQzdCLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUNwQixTQUFTLENBQUMsTUFBTSxJQUFJLG9CQUFvQjtRQUN4Qyx1R0FBdUc7UUFDdkcsQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQ2hELENBQUM7QUFDSixDQUFDO0FBRUQsNEdBQTRHO0FBQzVHLFNBQVMsZ0JBQWdCLENBQUMsTUFBcUIsRUFBRSxLQUFhO0lBQzVELElBQ0UsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVE7UUFDakMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDckMsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxNQUFN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SSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNoSCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxzR0FBc0c7SUFDdEcsUUFBUTtRQUNOLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUNqRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDbEYsQ0FBQztRQUNGLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3BILE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogRW5naW5lLW93bmVkIGF0dGVudGlvbiBpcyBjb2xsZWN0ZWQgd2l0aCByZXRhaW5lZCBmYWN0czsgc25hcHNob3RzIG9ubHkgY29weSB0aGlzIGJvdW5kZWQgcHJvamVjdGlvbi4gKi9cbmltcG9ydCB0eXBlIHsgQXR0ZW50aW9uIH0gZnJvbSAnZm9vdHRyYWNlJztcbmltcG9ydCB7IGJ1aWxkQXR0ZW1wdElkLCBwYXJzZUF0dGVtcHRJZCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB0eXBlIHsgQXR0ZW1wdFJlY29yZCwgQXR0ZW1wdFN1bW1hcnkgfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcblxuY29uc3QgTUFYX01BUktTID0gMzI7XG5jb25zdCBNQVhfUkVGRVJFTkNFUyA9IDE2O1xuY29uc3QgTUFYX1JFRkVSRU5DRV9MRU5HVEggPSA1MTI7XG5jb25zdCBTVE9QUEVEX1JFQVNPTlMgPSBuZXcgU2V0KFsnZXhoYXVzdGVkJywgJ2RlY2xpbmVkJywgJ25vLXRpbWUtbGVmdCddKTtcbmNvbnN0IE1JU1NJTkdfQVRURU5USU9OOiBBdHRlbnRpb24gPSBPYmplY3QuZnJlZXplKHtcbiAga2luZDogJ25vdC1jb2xsZWN0ZWQnLFxuICByZWFzb246ICdFVklERU5DRV9OT1RfQ09MTEVDVEVEJyxcbiAgZXZpZGVuY2U6IE9iamVjdC5mcmVlemUoW10pLFxufSk7XG5cbmZ1bmN0aW9uIHZhbGlkUmVmZXJlbmNlKHJlZmVyZW5jZTogdW5rbm93bik6IHJlZmVyZW5jZSBpcyBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiByZWZlcmVuY2UgPT09ICdzdHJpbmcnICYmXG4gICAgcmVmZXJlbmNlLmxlbmd0aCA+IDAgJiZcbiAgICByZWZlcmVuY2UubGVuZ3RoIDw9IE1BWF9SRUZFUkVOQ0VfTEVOR1RIICYmXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggLS0gTWF0Y2ggdGhlIHNoYXJlZCBGb290dHJhY2UgZXZpZGVuY2UtcmVmZXJlbmNlIGJvdW5kYXJ5LlxuICAgICEvW1xcdTAwMDAtXFx1MDAxZlxcdTAwN2YtXFx1MDA5Zl0vLnRlc3QocmVmZXJlbmNlKVxuICApO1xufVxuXG4vKiogUmV1c2UgdGhlIG9uZSBhdHRlbXB0IGdyYW1tYXIsIGluY2x1ZGluZyBuZXN0ZWQgY2FsbCBhZGRyZXNzZXM7IG5ldmVyIHNob3J0ZW4gYW4gdW5hZGRyZXNzYWJsZSBwcm9vZi4gKi9cbmZ1bmN0aW9uIGF0dGVtcHRSZWZlcmVuY2UocmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBvd25lcjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKFxuICAgIHR5cGVvZiByZWNvcmQuc2VyaWVzICE9PSAnc3RyaW5nJyB8fFxuICAgICFOdW1iZXIuaXNTYWZlSW50ZWdlcihyZWNvcmQuYXR0ZW1wdCkgfHxcbiAgICByZWNvcmQuYXR0ZW1wdCA8IDEgfHxcbiAgICByZWNvcmQuc2VyaWVzLmxlbmd0aCArIFN0cmluZyhyZWNvcmQuYXR0ZW1wdCkubGVuZ3RoICsgMSA+IE1BWF9SRUZFUkVOQ0VfTEVOR1RIXG4gIClcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHJlY29yZC5zZXJpZXMgKyAnQCcgKyByZWNvcmQuYXR0ZW1wdDtcbiAgICBjb25zdCBwYXJ0cyA9IHBhcnNlQXR0ZW1wdElkKGNhbmRpZGF0ZSk7XG4gICAgaWYgKFxuICAgICAgIXBhcnRzIHx8XG4gICAgICBwYXJ0cy5ydW50aW1lU3RhZ2VJZCAhPT0gb3duZXIgfHxcbiAgICAgIChyZWNvcmQua2luZCA9PT0gJ3N0YWdlJyA/IHBhcnRzLmNhbGwgIT09IHVuZGVmaW5lZCA6IHBhcnRzLmNhbGwgPT09IHVuZGVmaW5lZClcbiAgICApXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNhbm9uaWNhbCA9IGJ1aWxkQXR0ZW1wdElkKHBhcnRzLnJ1bnRpbWVTdGFnZUlkLCBwYXJ0cy5hdHRlbXB0LCBwYXJ0cy5jYWxsKTtcbiAgICByZXR1cm4gY2Fub25pY2FsID09PSBjYW5kaWRhdGUgJiYgdmFsaWRSZWZlcmVuY2UoY2Fub25pY2FsKSA/IGNhbm9uaWNhbCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG50eXBlIFRlcm1pbmFsUHJvb2YgPSBQaWNrPEF0dGVtcHRSZWNvcmQsICduZXh0JyB8ICdyZWFzb24nIHwgJ2VmZmVjdCc+ICYgeyByZWFkb25seSBldmlkZW5jZTogc3RyaW5nIH07XG5cbi8qKiBPbmUgZXhlY3V0aW9uJ3Mgb3duZXJzaGlwLCBwZW5kaW5nIHN1bW1hcnksIG1hcmtzIGFuZCBvbWlzc2lvbiBhY2NvdW50aW5nIHN0YXkgaW4gdGhpcyBoZWxwZXIuICovXG5leHBvcnQgY2xhc3MgU3RhZ2VBdHRlbnRpb24ge1xuICBwcml2YXRlIG1hcmtzPzogTWFwPHN0cmluZywgQXR0ZW50aW9uPjtcbiAgcHJpdmF0ZSBvbWl0dGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmV0cnlQb3NzaWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIHN1bW1hcnk/OiBBdHRlbXB0U3VtbWFyeTtcbiAgcHJpdmF0ZSB0ZXJtaW5hbD86IFRlcm1pbmFsUHJvb2Y7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvbk9taXR0ZWQ/OiAoKSA9PiB2b2lkKSB7fVxuXG4gIC8qKiBBIG5ldyBleGVjdXRpb24gc3RhcnRzIGZyZXNoOyBhbiBhdHRlbXB0IGRpc2NhcmQgbmV2ZXIgY2FsbHMgdGhpcy4gTm8gY29sbGVjdGlvbiBpcyByZWNvbnN0cnVjdGVkLiAqL1xuICBiZWdpbigpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub21pdHRlZCA9IGZhbHNlO1xuICAgIHRoaXMucmV0cnlQb3NzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuc3VtbWFyeSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRlcm1pbmFsID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIENhbGxlZCBvbmx5IGFmdGVyIHRoZSBmcmFtZSByZXRhaW5lZCB0aGlzIGF0dGVtcHQuIFJhdyBlcnJvciwgdGFyZ2V0IGFuZCBkZWNpc2lvbiBwYXlsb2FkcyBhcmUgbmV2ZXIgcmVhZC4gKi9cbiAgcmVjb3JkQXR0ZW1wdChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQsIG93bmVyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSBhdHRlbXB0UmVmZXJlbmNlKHJlY29yZCwgb3duZXIpO1xuICAgIGlmIChyZWNvcmQua2luZCA9PT0gJ3N0YWdlJyAmJiByZWNvcmQuc2VyaWVzID09PSBvd25lcikge1xuICAgICAgaWYgKHJlY29yZC5yZXRyeUxvb3AgPT09IHVuZGVmaW5lZCAmJiAocmVjb3JkLm9mID8/IDEpID4gMSkgdGhpcy5yZXRyeVBvc3NpYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChyZWZlcmVuY2UgJiYgcmVjb3JkLm5leHQgIT09ICdyZXRyeScpIHtcbiAgICAgICAgdGhpcy50ZXJtaW5hbCA9IHsgbmV4dDogcmVjb3JkLm5leHQsIHJlYXNvbjogcmVjb3JkLnJlYXNvbiwgZWZmZWN0OiByZWNvcmQuZWZmZWN0LCBldmlkZW5jZTogcmVmZXJlbmNlIH07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFRoZSBydW5uZXIgY2FsbHMgcmVjb3JkU3VtbWFyeSBiZWZvcmUgaXRzIGZpbmFsIGF0dGVtcHQuIEZpbmlzaCB0aGF0IHBlbmRpbmcgcHJvamVjdGlvbiBub3cgdG9vLlxuICAgIHRoaXMucHJvamVjdFN1bW1hcnkoKTtcbiAgICBjb25zdCBhZGQgPSAoa2luZDogQXR0ZW50aW9uWydraW5kJ10sIHJlYXNvbjogQXR0ZW50aW9uWydyZWFzb24nXSkgPT4ge1xuICAgICAgaWYgKHJlZmVyZW5jZSkgdGhpcy5hcHBlbmQoeyBraW5kLCByZWFzb24sIGV2aWRlbmNlOiBbcmVmZXJlbmNlXSB9KTtcbiAgICAgIGVsc2UgdGhpcy5taXNzaW5nKCk7XG4gICAgfTtcbiAgICBpZiAocmVjb3JkLmVmZmVjdCA9PT0gJ3Vua25vd24nKSBhZGQoJ3Vua25vd24tZWZmZWN0JywgJ1VOS05PV05fRUZGRUNUX1JFQ09SREVEJyk7XG4gICAgaWYgKHJlY29yZC5vdXRjb21lID09PSAndGltZW91dCcpIGFkZCgndGltZW91dCcsICdUSU1FT1VUX1JFQ09SREVEJyk7XG4gICAgLy8gQW4gU0RLJ3Mgc3VnZ2VzdGVkIG5leHQvcmVhc29uIGlzIG5vdCBpdHMgYWN0dWFsIHBvbGljeTsgb25seSBhIGxhdGVyIG9yZGluYWwgcHJvdmVzIGl0cyByZXRyeS5cbiAgICBjb25zdCBvYnNlcnZlZCA9IHJlY29yZC5raW5kID09PSAnb2JzZXJ2ZWQnO1xuICAgIGlmICgoIW9ic2VydmVkICYmIHJlY29yZC5uZXh0ID09PSAncmV0cnknKSB8fCByZWNvcmQuYXR0ZW1wdCA+IDEpIGFkZCgncmV0cmllZCcsICdSRVRSWV9SRUNPUkRFRCcpO1xuICAgIGlmIChcbiAgICAgICFvYnNlcnZlZCAmJlxuICAgICAgcmVjb3JkLm5leHQgPT09ICdzdG9wJyAmJlxuICAgICAgU1RPUFBFRF9SRUFTT05TLmhhcyhyZWNvcmQucmVhc29uKSAmJlxuICAgICAgKHJlY29yZC5vZiA/PyAxKSA+IDEgJiZcbiAgICAgIHJlY29yZC5yZXRyeUxvb3AgPT09IHVuZGVmaW5lZFxuICAgIClcbiAgICAgIGFkZCgnZ2F2ZS11cCcsICdSRVRSWV9TVE9QX1JFQ09SREVEJyk7XG4gIH1cblxuICByZWNvcmRTdW1tYXJ5KHN1bW1hcnk6IEF0dGVtcHRTdW1tYXJ5KTogdm9pZCB7XG4gICAgdGhpcy5zdW1tYXJ5ID0gc3VtbWFyeTtcbiAgICB0aGlzLnByb2plY3RTdW1tYXJ5KCk7XG4gIH1cblxuICAvKiogQSBzdW1tYXJ5LW9ubHkgY3V0IHdhaXQgaGFzIG5vIHBoYW50b20gZmluYWwgYXR0ZW1wdDsgdXNlIGl0cyBhY3R1YWwgcmV0YWluZWQgc3VtbWFyeS4gKi9cbiAgcHJpdmF0ZSBwcm9qZWN0U3VtbWFyeSgpOiB2b2lkIHtcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5zdW1tYXJ5Py5sYXN0O1xuICAgIGlmICghbGFzdCkgcmV0dXJuO1xuICAgIGNvbnN0IHRlcm1pbmFsID0gdGhpcy50ZXJtaW5hbDtcbiAgICBjb25zdCBtYXRjaGluZyA9IHRlcm1pbmFsPy5uZXh0ID09PSBsYXN0Lm5leHQgJiYgdGVybWluYWwucmVhc29uID09PSBsYXN0LnJlYXNvbjtcbiAgICBjb25zdCBhZGQgPSAoa2luZDogQXR0ZW50aW9uWydraW5kJ10sIHJlYXNvbjogQXR0ZW50aW9uWydyZWFzb24nXSwgcHJvb2Y/OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHJlZmVyZW5jZSA9IHByb29mID8/ICdhdHRlbXB0U3VtbWFyeSc7XG4gICAgICBjb25zdCBrZXkgPSBraW5kICsgJzonICsgcmVhc29uO1xuICAgICAgY29uc3QgbWFya3MgPSB0aGlzLm1hcmtzO1xuICAgICAgY29uc3QgcHJldmlvdXMgPSBtYXJrcz8uZ2V0KGtleSk7XG4gICAgICBpZiAocHJvb2YgJiYgbWFya3MgJiYgcHJldmlvdXM/LmV2aWRlbmNlLmluY2x1ZGVzKCdhdHRlbXB0U3VtbWFyeScpKSB7XG4gICAgICAgIG1hcmtzLnNldChrZXksIHsgLi4ucHJldmlvdXMsIGV2aWRlbmNlOiBwcmV2aW91cy5ldmlkZW5jZS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09ICdhdHRlbXB0U3VtbWFyeScpIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5hcHBlbmQoeyBraW5kLCByZWFzb24sIGV2aWRlbmNlOiBbcmVmZXJlbmNlXSB9KTtcbiAgICB9O1xuICAgIGlmIChsYXN0LmVmZmVjdCA9PT0gJ3Vua25vd24nKVxuICAgICAgYWRkKFxuICAgICAgICAndW5rbm93bi1lZmZlY3QnLFxuICAgICAgICAnVU5LTk9XTl9FRkZFQ1RfUkVDT1JERUQnLFxuICAgICAgICBtYXRjaGluZyAmJiB0ZXJtaW5hbC5lZmZlY3QgPT09ICd1bmtub3duJyA/IHRlcm1pbmFsLmV2aWRlbmNlIDogdW5kZWZpbmVkLFxuICAgICAgKTtcbiAgICBpZiAodGhpcy5yZXRyeVBvc3NpYmxlICYmIGxhc3QubmV4dCA9PT0gJ3N0b3AnICYmIFNUT1BQRURfUkVBU09OUy5oYXMobGFzdC5yZWFzb24pKVxuICAgICAgYWRkKCdnYXZlLXVwJywgJ1JFVFJZX1NUT1BfUkVDT1JERUQnLCBtYXRjaGluZyA/IHRlcm1pbmFsLmV2aWRlbmNlIDogdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKiBPbmx5IHRoZSBleHBsaWNpdCByZXRhaW5lZCBzdGFnZS1lcnJvciBwYXRoIGNhbGxzIHRoaXM7IGEgZGlhZ25vc3RpYyB2YWx1ZSBuZXZlciBjbGFzc2lmaWVzIGl0c2VsZi4gKi9cbiAgc3RhZ2VGYWlsZWQoZXJyb3JzOiB1bmtub3duKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPVxuICAgICAgICBlcnJvcnMgJiYgdHlwZW9mIGVycm9ycyA9PT0gJ29iamVjdCdcbiAgICAgICAgICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZXJyb3JzLCAnc3RhZ2VFeGVjdXRpb25FcnJvcicpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoZGVzY3JpcHRvciAmJiBPYmplY3QuaGFzT3duKGRlc2NyaXB0b3IsICd2YWx1ZScpKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKHsga2luZDogJ2Vycm9yJywgcmVhc29uOiAnRVJST1JfUkVDT1JERUQnLCBldmlkZW5jZTogWydlcnJvcnM6c3RhZ2VFeGVjdXRpb25FcnJvciddIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBBIG1hbGZvcm1lZCBldmlkZW5jZSBiYWcgaXMgdW5hdmFpbGFibGUsIG5ldmVyIGFub3RoZXIgc3RhZ2UgZmFpbHVyZS4gKi9cbiAgICB9XG4gICAgdGhpcy5taXNzaW5nKCk7XG4gIH1cblxuICBhdHRlbXB0RHJvcHBlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFwcGVuZCh7IGtpbmQ6ICdub3QtY29sbGVjdGVkJywgcmVhc29uOiAnRVZJREVOQ0VfTk9UX0NPTExFQ1RFRCcsIGV2aWRlbmNlOiBbJ2F0dGVtcHRzRHJvcHBlZCddIH0pO1xuICB9XG5cbiAgLyoqIEtlZXAgb25seSBib3VuZGVkIGV4YWN0IHJlZmVyZW5jZXM7IG9uZSBzbG90IGlzIHJlc2VydmVkIHRvIGRpc2Nsb3NlIG9taXNzaW9ucy4gKi9cbiAgYXBwZW5kKGF0dGVudGlvbjogQXR0ZW50aW9uKTogdm9pZCB7XG4gICAgaWYgKGF0dGVudGlvbi5raW5kID09PSAnbm90LWNvbGxlY3RlZCcpIHRoaXMub25PbWl0dGVkPy4oKTtcbiAgICBjb25zdCBrZXkgPSBhdHRlbnRpb24ua2luZCArICc6JyArIGF0dGVudGlvbi5yZWFzb247XG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLm1hcmtzPy5nZXQoa2V5KTtcbiAgICBjb25zdCByZWZlcmVuY2VzID0gWy4uLihwcmV2aW91cz8uZXZpZGVuY2UgPz8gW10pXTtcbiAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiBhdHRlbnRpb24uZXZpZGVuY2UpIHtcbiAgICAgIGlmICghdmFsaWRSZWZlcmVuY2UocmVmZXJlbmNlKSkge1xuICAgICAgICB0aGlzLm1pc3NpbmcoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocmVmZXJlbmNlcy5pbmNsdWRlcyhyZWZlcmVuY2UpKSBjb250aW51ZTtcbiAgICAgIGlmIChyZWZlcmVuY2VzLmxlbmd0aCA+PSBNQVhfUkVGRVJFTkNFUykge1xuICAgICAgICB0aGlzLm1pc3NpbmcoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZWZlcmVuY2VzLnB1c2gocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgaWYgKGF0dGVudGlvbi5raW5kICE9PSAnbm90LWNvbGxlY3RlZCcgJiYgcmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubWlzc2luZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXByZXZpb3VzICYmICh0aGlzLm1hcmtzPy5zaXplID8/IDApID49IE1BWF9NQVJLUyAtIDEpIHtcbiAgICAgIHRoaXMubWlzc2luZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAodGhpcy5tYXJrcyA/Pz0gbmV3IE1hcCgpKS5zZXQoa2V5LCB7IGtpbmQ6IGF0dGVudGlvbi5raW5kLCByZWFzb246IGF0dGVudGlvbi5yZWFzb24sIGV2aWRlbmNlOiByZWZlcmVuY2VzIH0pO1xuICB9XG5cbiAgbWlzc2luZygpOiB2b2lkIHtcbiAgICB0aGlzLm9taXR0ZWQgPSB0cnVlO1xuICAgIHRoaXMub25PbWl0dGVkPy4oKTtcbiAgfVxuXG4gIC8qKiBDb3B5IGFscmVhZHkgY29sbGVjdGVkIGJvdW5kZWQgbWFya3MsIG5ldmVyIGFuIGF0dGVtcHQgYXJyYXksIGRpYWdub3N0aWMgYmFnIG9yIGV4ZWN1dGlvbiB0cmVlLiAqL1xuICBzbmFwc2hvdCgpOiByZWFkb25seSBBdHRlbnRpb25bXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gWy4uLih0aGlzLm1hcmtzPy52YWx1ZXMoKSA/PyBbXSldLm1hcCgoYXR0ZW50aW9uKSA9PlxuICAgICAgT2JqZWN0LmZyZWV6ZSh7IC4uLmF0dGVudGlvbiwgZXZpZGVuY2U6IE9iamVjdC5mcmVlemUoWy4uLmF0dGVudGlvbi5ldmlkZW5jZV0pIH0pLFxuICAgICk7XG4gICAgaWYgKHRoaXMub21pdHRlZCAmJiAhcmVzdWx0LnNvbWUoKGF0dGVudGlvbikgPT4gYXR0ZW50aW9uLmtpbmQgPT09ICdub3QtY29sbGVjdGVkJykpIHJlc3VsdC5wdXNoKE1JU1NJTkdfQVRURU5USU9OKTtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShyZXN1bHQpO1xuICB9XG59XG4iXX0=
@@ -30,7 +30,7 @@
30
30
  * its own store when `mirror` is set.
31
31
  */
32
32
  import type { CommitValuesMode } from 'foottrace';
33
- import type { WriteProvenanceMode } from 'foottrace/write';
33
+ import type { ReadSourceLimits, WriteProvenanceMode } from 'foottrace/write';
34
34
  import type { ReadTrackingMode, WriteTrackingMode } from './frameTypes.js';
35
35
  import type { RedactionRule } from './redaction.js';
36
36
  /**
@@ -38,6 +38,10 @@ import type { RedactionRule } from './redaction.js';
38
38
  * one is its default. `FlowChartExecutorOptions` extends this interface.
39
39
  */
40
40
  export interface RunDials {
41
+ /** Native, bounded scalar read-source occurrences (#113). Default false; memory-only in packet 3. */
42
+ readSources?: boolean | {
43
+ readonly limits: Partial<ReadSourceLimits>;
44
+ };
41
45
  /**
42
46
  * Policy for `StageSnapshot.stageReads` (#14). Default `'full'` — every
43
47
  * tracked read `structuredClone`s the value into the stage's read view
@@ -31,6 +31,7 @@
31
31
  */
32
32
  /** Each dial's default — the value a run gets when the option is absent. The dial list IS these keys. */
33
33
  export const DIAL_DEFAULTS = Object.freeze({
34
+ readSources: false,
34
35
  readTracking: 'full',
35
36
  writeTracking: 'full',
36
37
  commitValues: 'full',
@@ -66,4 +67,4 @@ export function withRedaction(policy, redaction) {
66
67
  export function derivePolicy(policy, patch) {
67
68
  return Object.freeze({ ...policy, ...patch });
68
69
  }
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuUG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcnVuUG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFrSEgseUdBQXlHO0FBQ3pHLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN2RSxZQUFZLEVBQUUsTUFBTTtJQUNwQixhQUFhLEVBQUUsTUFBTTtJQUNyQixZQUFZLEVBQUUsTUFBTTtJQUNwQixlQUFlLEVBQUUsS0FBSztDQUN2QixDQUFDLENBQUM7QUFFSCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBMEIsQ0FBQztBQUV2RSwyR0FBMkc7QUFDM0csTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsYUFBYSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBRWhHLG1GQUFtRjtBQUNuRixNQUFNLFVBQVUsU0FBUyxDQUFDLFFBQWtCLEVBQUUsRUFBRSxTQUF5QixFQUFFLE1BQU0sR0FBRyxLQUFLO0lBQ3ZGLE1BQU0sUUFBUSxHQUE0QixFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzVGLElBQUksU0FBUztRQUFFLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzlDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQXlCLENBQUM7QUFDekQsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixNQUFNLFVBQVUsU0FBUyxDQUFDLE1BQWdCO0lBQ3hDLE1BQU0sS0FBSyxHQUE0QixFQUFFLENBQUM7SUFDMUMsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVO1FBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUztZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUYsT0FBTyxLQUFpQixDQUFDO0FBQzNCLENBQUM7QUFFRCw2RkFBNkY7QUFDN0YsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUFpQixFQUFFLFNBQXdCO0lBQ3ZFLE9BQU8sWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLE1BQWlCLEVBQUUsS0FBeUI7SUFDdkUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJ1blBvbGljeSDigJQgd2hhdCBhIHJ1biByZXRhaW5zLCBlbmNvZGVzIGFuZCBzY3J1YnMsIGFzIE9ORSBpbW11dGFibGUgb2JqZWN0IChGNSkuXG4gKlxuICogV0hZLiBBIHJ1biBjYXJyaWVzIHNpeCBzZXR0aW5ncyB0aGF0IGV2ZXJ5IHN0YWdlIGZyYW1lIG11c3QgYWdyZWUgb246IHRoZSBmb3VyXG4gKiBvYnNlcnZhYmlsaXR5IGRpYWxzIChgcmVhZFRyYWNraW5nYCwgYHdyaXRlVHJhY2tpbmdgLCBgY29tbWl0VmFsdWVzYCwgYHdyaXRlUHJvdmVuYW5jZWApLFxuICogdGhlIHJlZGFjdGlvbiBydWxlLCBhbmQgd2hldGhlciBhIHJlZGFjdGVkIG1pcnJvciBpcyBrZXB0LiBVbnRpbCA5LjM0LjAgZWFjaCBvbmUgd2FzXG4gKiBjb3BpZWQgZmllbGQgYnkgZmllbGQgZG93biB0aHJlZSBzZXBhcmF0ZSBwYXRocyDigJQgYEV4ZWN1dGlvblJ1bnRpbWUudXNlKmAgb24gdGhlIHJvb3QsXG4gKiBgU3RhZ2VDb250ZXh0LmNyZWF0ZU5leHRgL2BjcmVhdGVDaGlsZGAgKHNpeCBhc3NpZ25tZW50cyBlYWNoKSwgYW5kIGEgZHVjay10eXBlZCBwdXNoIHBlclxuICogZGlhbCBpbiBgU3ViZmxvd0V4ZWN1dG9yYCDigJQgc28gYSBuZXcgZGlhbCBtZWFudCBzaXggZWRpdHMsIGFuZCBhIG1pc3NlZCBvbmUgcmFuIGEgc3ViZmxvd1xuICogb24gdGhlIGRlZmF1bHQgc2lsZW50bHkuIE5vdyB0aGUgZXhlY3V0b3IgYnVpbGRzIE9ORSBwb2xpY3kgcGVyIHJ1biAoYW5kIHBlciByZXN1bWUpLCB0aGVcbiAqIHJ1bnRpbWUgaW5zdGFsbHMgaXQgb24gaXRzIHJvb3QgZnJhbWUsIGFuZCBldmVyeSBmcmFtZSBob2xkcyBpdCBCWSBSRUZFUkVOQ0U6IGEgY2hpbGQsIGFcbiAqIGNvbnRpbnVhdGlvbiBhbmQgYSBzdWJmbG93J3Mgcm9vdCAoaXRzIHNlZWQgZnJhbWUgaW5jbHVkZWQpIGFsbCBwb2ludCBhdCB0aGUgc2FtZSBvYmplY3QuXG4gKiBUaGUgYm9ycm93ZWQgaWRlYSBpcyBHbydzIGBjb250ZXh0LkNvbnRleHRgIC8gT3BlblRlbGVtZXRyeSdzIGBDb250ZXh0YDogYW4gaW1tdXRhYmxlIHZhbHVlXG4gKiBoYW5kZWQgZG93biwgbmV2ZXIgY29waWVkIGFwYXJ0LlxuICpcbiAqIEFERElORyBBIERJQUwgaXMgdHdvIGZpbGVzOiBhIGZpZWxkICsgaXRzIGRlZmF1bHQgaGVyZSAoe0BsaW5rIFJ1bkRpYWxzfSxcbiAqIHtAbGluayBESUFMX0RFRkFVTFRTfSksIGFuZCB0aGUgZnJhbWUgY29kZSB0aGF0IHJlYWRzIGBwb2xpY3kuPGRpYWw+YCAoYFN0YWdlQ29udGV4dGApLiBUaGVcbiAqIGV4ZWN1dG9yJ3Mgb3B0aW9ucyBpbmhlcml0IHtAbGluayBSdW5EaWFsc30sIHBpY2tzIHRoZW0gd2l0aCB7QGxpbmsgcGlja0RpYWxzfSwgYW5kIGV2ZXJ5XG4gKiBwcm9wYWdhdGlvbiBwYXRoIGNhcnJpZXMgdGhlIHdob2xlIG9iamVjdCDigJQgbm9uZSBvZiB0aGVtIG5hbWVzIGEgZGlhbC5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcG9saWN5ID0gcnVuUG9saWN5KHsgY29tbWl0VmFsdWVzOiAnZGVsdGEnIH0sIHJ1bGUsIHRydWUpO1xuICogcG9saWN5LnJlYWRUcmFja2luZzsgLy8gJ2Z1bGwnIOKAlCBhbiBhYnNlbnQgZGlhbCBpcyBpdHMgZGVmYXVsdFxuICogT2JqZWN0LmlzRnJvemVuKHBvbGljeSk7IC8vIHRydWUg4oCUIGEgZnJhbWUgY2FuIG5ldmVyIGVkaXQgd2hhdCBpdHMgc2libGluZ3Mgc2hhcmVcbiAqIGBgYFxuICpcbiAqIFRoZSBSVUxFIGluc2lkZSBpcyBzaGFyZWQgdG9vLCBhbmQgaXMgaXRzZWxmIHN0YXRlZnVsIGJ5IGRlc2lnbiAocGVyLWNhbGwgYHNldFZhbHVlKGssIHYsXG4gKiB0cnVlKWAgbWFya3MgYSBrZXkgb24gaXQgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4pOyB0aGUgcG9saWN5IGZyZWV6ZXMgd2hpY2ggcnVsZSwgbm90IHRoZVxuICogcnVsZSdzIG1hcmtzLiBUaGUgbWlycm9yIFNUT1JFIGlzIG5vdCBwb2xpY3kg4oCUIGVhY2ggcnVudGltZSAoYSBzdWJmbG93IGhhcyBpdHMgb3duKSBrZWVwc1xuICogaXRzIG93biBzdG9yZSB3aGVuIGBtaXJyb3JgIGlzIHNldC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdFZhbHVlc01vZGUgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHR5cGUgeyBXcml0ZVByb3ZlbmFuY2VNb2RlIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHR5cGUgeyBSZWFkVHJhY2tpbmdNb2RlLCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4vZnJhbWVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblJ1bGUgfSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5cbi8qKlxuICogVGhlIGZvdXIgb2JzZXJ2YWJpbGl0eSBkaWFscyBhcyBhbiBleGVjdXRvciB0YWtlcyB0aGVtIOKAlCBldmVyeSBmaWVsZCBvcHRpb25hbCwgYW4gYWJzZW50XG4gKiBvbmUgaXMgaXRzIGRlZmF1bHQuIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnNgIGV4dGVuZHMgdGhpcyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuRGlhbHMge1xuICAvKipcbiAgICogUG9saWN5IGZvciBgU3RhZ2VTbmFwc2hvdC5zdGFnZVJlYWRzYCAoIzE0KS4gRGVmYXVsdCBgJ2Z1bGwnYCDigJQgZXZlcnlcbiAgICogdHJhY2tlZCByZWFkIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB0aGUgdmFsdWUgaW50byB0aGUgc3RhZ2UncyByZWFkIHZpZXdcbiAgICogKHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yOyB3aGF0IGxlbnMvYWdlbnRmb290cHJpbnQgc25hcHNob3RzIHNob3cpLlxuICAgKiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXAgdHlwZS9zaXplL3ByZXZpZXcgbWFya2VyIHBlciByZWFkOyBgJ29mZidgXG4gICAqIHJlY29yZHMgbm90aGluZyDigJQgemVybyBwZXItcmVhZCBjbG9uZSBjb3N0IChyZWFkcyBvZiBsYXJnZSB2YWx1ZXMgYmVjb21lXG4gICAqIH5mcmVlKS4gTmFycmF0aXZlIGFuZCBgU2NvcGVSZWNvcmRlci5vblJlYWRgIGFyZSBpZGVudGljYWwgaW4gZXZlcnkgbW9kZS5cbiAgICogQ2F2ZWF0OiB1bmRlciBgJ29mZidgIGEgc3RhZ2UncyBzbmFwc2hvdCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG9uZVxuICAgKiB0aGF0IHJlYWQgbm90aGluZyDigJQgYXVkaXRpbmcgY29uc3VtZXJzIHRoYXQgbmVlZCBcImRpZCBpdCByZWFkP1wiIHdpdGhvdXRcbiAgICogdGhlIHZhbHVlIGNvc3Qgc2hvdWxkIHByZWZlciBgJ3N1bW1hcnknYC5cbiAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIGBleGVjdXRvci5zZXRSZWFkVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICAgKi9cbiAgcmVhZFRyYWNraW5nPzogUmVhZFRyYWNraW5nTW9kZTtcblxuICAvKipcbiAgICogUG9saWN5IGZvciBgU3RhZ2VTbmFwc2hvdC5zdGFnZVdyaXRlc2AgKCMxM2MtQSkg4oCUIHRoZSBzaWJsaW5nIG9mXG4gICAqIHtAbGluayByZWFkVHJhY2tpbmd9OyB0aGUgdHdvIGRpYWxzIGFyZSBpbmRlcGVuZGVudC4gRGVmYXVsdCBgJ2Z1bGwnYCDigJRcbiAgICogZXZlcnkgdHJhY2tlZCB3cml0ZSBgc3RydWN0dXJlZENsb25lYHMgdGhlIHZhbHVlIGludG8gdGhlIHN0YWdlJ3Mgd3JpdGVcbiAgICogdmlldyAodGhlIGhpc3RvcmljYWwgYmVoYXZpb3IpLiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXBcbiAgICogYFdyaXRlU3VtbWFyeU1hcmtlcmAgKHR5cGUvc2l6ZS9wcmV2aWV3KSBwZXIgd3JpdGU7IGAnb2ZmJ2AgcmVjb3Jkc1xuICAgKiBub3RoaW5nIOKAlCBgc3RhZ2VXcml0ZXNgIGlzIGFic2VudCBmcm9tIHRoZSBzbmFwc2hvdC5cbiAgICpcbiAgICogT2JzZXJ2YWJsZSBjb25zZXF1ZW5jZXMg4oCUIHdoYXQgdGhlIHBvbGljeSBET0VTIGdvdmVybjpcbiAgICogLSBgU3RhZ2VTbmFwc2hvdC5zdGFnZVdyaXRlc2AgKG1hcmtlcnMgdW5kZXIgYCdzdW1tYXJ5J2AsIGFic2VudCB1bmRlclxuICAgKiAgIGAnb2ZmJ2ApLlxuICAgKiAtIFRoZSBjb21taXQgb2JzZXJ2ZXIgcGF5bG9hZDogYFNjb3BlUmVjb3JkZXIub25Db21taXQobXV0YXRpb25zKWBcbiAgICogICByZWNlaXZlcyB0aGUgcmV0YWluZWQgYF9zdGFnZVdyaXRlc2AgZW50cmllcywgc28gaXQgY2FycmllcyB0aGUgc2FtZVxuICAgKiAgIG1hcmtlcnMgdW5kZXIgYCdzdW1tYXJ5J2AgYW5kIGFuIGVtcHR5IG11dGF0aW9ucyBiYWcgdW5kZXIgYCdvZmYnYCDigJRcbiAgICogICBkZWZlcnJlZC9vYnNlcnZlciBjb25zdW1lcnMgc2VlIGV4YWN0bHkgd2hhdCByZXRlbnRpb24gc3RvcmVkLlxuICAgKlxuICAgKiBXaGF0IGl0IGRvZXMgTk9UIGdvdmVybjpcbiAgICogLSBUaGUgd3JpdGVzIHRoZW1zZWx2ZXM6IHNoYXJlZCBzdGF0ZSwgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciwgYW5kIHRoZVxuICAgKiAgIENPTU1JVCBMT0cgYXJlIGlkZW50aWNhbCBpbiBldmVyeSBtb2RlIChjb21taXRMb2cgdmFsdWVzIGtlZXAgdGhlaXJcbiAgICogICBmdWxsIHBheWxvYWRzIOKAlCB0aGUgbG9zc2xlc3MgbGluZWFyLWNvc3QgZml4IGZvciB0aG9zZSBpcyB0aGVcbiAgICogICB7QGxpbmsgY29tbWl0VmFsdWVzfSBkaWFsLCAjMTNjLUIpLlxuICAgKiAtIFBlci1vcCBgU2NvcGVSZWNvcmRlci5vbldyaXRlYCBldmVudHMg4oCUIHRoZXkgZmlyZSB3aXRoIGxpdmUgdmFsdWVzXG4gICAqICAgcmVnYXJkbGVzcyAoZGVsaXZlcnkgdGllciwgUkZDLTAwMSdzIGNvbmNlcm4pLCBzbyBuYXJyYXRpdmUgb3V0cHV0IGlzXG4gICAqICAgaWRlbnRpY2FsIGluIGV2ZXJ5IG1vZGUuXG4gICAqIC0gUmVkYWN0aW9uOiBhIHBvbGljeS9wZXItY2FsbC1yZWRhY3RlZCB3cml0ZSBzdG9yZXMgYCdbUkVEQUNURURdJ2BcbiAgICogICB1bmRlciBgJ2Z1bGwnYCBBTkQgYCdzdW1tYXJ5J2AgKHJlZGFjdGlvbiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlXG4gICAqICAgZGlhbDsgYSBtYXJrZXIgd291bGQgbGVhayBzaXplL3ByZXZpZXcpLCBhbmQgbm90aGluZyB1bmRlciBgJ29mZidgLlxuICAgKlxuICAgKiBDYXZlYXQ6IHVuZGVyIGAnb2ZmJ2AgYSBzdGFnZSdzIFNOQVBTSE9UIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gb25lXG4gICAqIHRoYXQgd3JvdGUgbm90aGluZyDigJQgYnV0IHVubGlrZSBgcmVhZFRyYWNraW5nOiAnb2ZmJ2AsIHRoZSBjb21taXQgbG9nXG4gICAqIHN0aWxsIHJlY29yZHMgZXZlcnkgbmV0IGNoYW5nZSwgc28gXCJkaWQgaXQgd3JpdGU/XCIgc3RheXMgYW5zd2VyYWJsZS5cbiAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIGBleGVjdXRvci5zZXRXcml0ZVRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAgICovXG4gIHdyaXRlVHJhY2tpbmc/OiBXcml0ZVRyYWNraW5nTW9kZTtcblxuICAvKipcbiAgICogRW5jb2RpbmcgcG9saWN5IGZvciBDT01NSVQgTE9HIHZhbHVlcyAoIzEzYy1CKSDigJQgdGhlIHRoaXJkIGRpYWwgb2YgdGhlXG4gICAqIGZhbWlseSwgYW5kIHVubGlrZSBpdHMgc2libGluZ3MgaXQgaXMgKipsb3NzbGVzcyBpbiBib3RoIG1vZGVzKiogKGl0XG4gICAqIGNoYW5nZXMgdGhlIGxvZydzIGVuY29kaW5nLCBuZXZlciBpdHMgaW5mb3JtYXRpb24pLlxuICAgKlxuICAgKiAtIGAnZnVsbCdgIChkZWZhdWx0KSDigJQgZXZlcnkgc3Vydml2aW5nIGBzZXRgIHBhdGggc3RvcmVzIHRoZSBmdWxsIGZpbmFsXG4gICAqICAgdmFsdWU7IGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yLlxuICAgKiAtIGAnZGVsdGEnYCDigJQgYXJyYXkgbmV0LWNoYW5nZXMgdGhhdCBhcmUgXCJiYXNlIHBsdXMgYSB0YWlsXCIgY29tbWl0IGFzIGFuXG4gICAqICAgYGFwcGVuZGAgdHJhY2UgdmVyYiBzdG9yaW5nIE9OTFkgdGhlIHRhaWwgKHRoZSBncm93aW5nLWhpc3RvcnkgY29tbWl0XG4gICAqICAgbG9nIGJlY29tZXMgbGluZWFyIGluc3RlYWQgb2YgTyhOwrIpIHJldGFpbmVkKTsgYGRlbGV0ZVZhbHVlKClgIGNvbW1pdHNcbiAgICogICBhcyBhIHJlYWwgYGRlbGV0ZWAgdmVyYiAocmVwbGF5IHJlbW92ZXMgdGhlIGtleSBpbnN0ZWFkIG9mIGxlYXZpbmdcbiAgICogICBga2V5OiB1bmRlZmluZWRgKTsgYnVuZGxlcyBjYXJyeSBleGFjdGx5IE9ORSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nXG4gICAqICAgcGF0aC4gUmVwbGF5ICh0aGUgb25lIHZlcmIgbGF3IOKAlCBsaXZlIHN0YXRlLCBgbWF0ZXJpYWxpc2UoKWAsIHRoZVxuICAgKiAgIHJlZGFjdGVkIG1pcnJvciwgYHN0YXRlQXRgKSByZWNvbnN0cnVjdHMgZXZlcnkgc3RlcCdzIGZ1bGwgc3RhdGVcbiAgICogICBleGFjdGx5LlxuICAgKlxuICAgKiBDb25zdW1lcnMgdGhhdCByZWFkIGBidW5kbGUub3ZlcndyaXRlW2tleV1gIGFzIFwidGhlIGZ1bGwgdmFsdWUgd3JpdHRlblwiXG4gICAqIG11c3Qgc3dpdGNoIHRvIGBjb21taXRWYWx1ZUF0KGNvbW1pdExvZywgaWR4LCBrZXkpYCBmcm9tXG4gICAqIGBmb290dHJhY2VgIOKAlCB1bmRlciBgJ2RlbHRhJ2AgdGhhdCB2YWx1ZSBpcyB2ZXJiLXF1YWxpZmllZCAoYW5cbiAgICogYGFwcGVuZGAgYnVuZGxlIGhvbGRzIG9ubHkgdGhlIHRhaWwpLiBQYXRoLXRpZXIgY29uc3VtZXJzXG4gICAqIChgZmluZExhc3RXcml0ZXJgLCBgY2F1c2FsQ2hhaW5gLCBuYXJyYXRpdmUsIGxlbnMgaGlnaGxpZ2h0cykgYXJlXG4gICAqIHVuYWZmZWN0ZWQuIFRoZSBhY3RpdmUgbW9kZSBpcyBzdXJmYWNlZCBhc1xuICAgKiBgZ2V0U25hcHNob3QoKS5jb21taXRWYWx1ZXNgLlxuICAgKlxuICAgKiBIb25lc3QgY29zdCBub3RlOiBhcHBlbmQgZGV0ZWN0aW9uIGlzIG5ldyB3YWxsIHdvcmsg4oCUIGFuIE8ofGJhc2UgYXJyYXl8KVxuICAgKiBzdHJ1Y3R1cmFsIHByZWZpeCBjb21wYXJlIHBlciBhcnJheS1zZXQgcGF0aCBwZXIgY29tbWl0LiBPbiBhIGhpdCB0aGVcbiAgICogY29tbWl0IGdldHMgY2hlYXBlciBpbiBib3RoIHdhbGwgYW5kIGhlYXA7IG9uIGEgbWlzcyAocHJlZml4IGRpdmVyZ2VzKVxuICAgKiBpdCBwYXlzIGNvbXBhcmUgKyBmdWxsIGNsb25lLiBgJ2Z1bGwnYCBwYXlzIHplcm8uXG4gICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBgZXhlY3V0b3Iuc2V0Q29tbWl0VmFsdWVzKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAgICovXG4gIGNvbW1pdFZhbHVlcz86IENvbW1pdFZhbHVlc01vZGU7XG5cbiAgLyoqXG4gICAqIFBlci13cml0ZSByZWFkIHByb3ZlbmFuY2UgKCNQMSkg4oCUIHRoZSBmb3VydGggZGlhbCBvZiB0aGUgZmFtaWx5LiBEZWZhdWx0XG4gICAqIGAnb2ZmJ2A6IHplcm8gY29zdCwgYnl0ZS1pZGVudGljYWwgY29tbWl0IGxvZ3MuIGAncmVhZHMtcHJlZml4J2A6IGV2ZXJ5XG4gICAqIGNvbW1pdHRlZCBgVHJhY2VFbnRyeWAgY2FycmllcyBgcmVhZEtleXNgIOKAlCB0aGUga2V5cyB0cmFja2VkLXJlYWQgQkVGT1JFXG4gICAqIHRoYXQgd3JpdGUg4oCUIGVuYWJsaW5nIHBlci13cml0ZSBjYXVzYWwgYXR0cmlidXRpb24gKGBjYXVzYWxDaGFpbmAnc1xuICAgKiBgZWRnZUF0dHJpYnV0aW9uOiAncGVyLXdyaXRlJ2AgYW5kIHZhcmlhYmxlIHNsaWNlcykuIENvc3Q6IG9uZSBzbWFsbFxuICAgKiBhcnJheSBjb3B5IHBlciB3cml0ZS4gU25hcHNob3QgZGlzY3JpbWluYW50OlxuICAgKiBgZ2V0U25hcHNob3QoKS53cml0ZVByb3ZlbmFuY2VgLlxuICAgKi9cbiAgd3JpdGVQcm92ZW5hbmNlPzogV3JpdGVQcm92ZW5hbmNlTW9kZTtcbn1cblxuLyoqIFRoZSBydW4ncyBwb2xpY3k6IGV2ZXJ5IGRpYWwgcmVzb2x2ZWQsIHBsdXMgdGhlIHJlZGFjdGlvbiBydWxlIGFuZCB0aGUgbWlycm9yIGZsYWcuIEZyb3plbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuUG9saWN5IGV4dGVuZHMgUmVhZG9ubHk8UmVxdWlyZWQ8UnVuRGlhbHM+PiB7XG4gIC8qKiBUaGUgcnVuJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIHRoZSBPTkUgb3duZXIgb2YgdGhlIHZlcmRpY3QgKGByZWRhY3Rpb24udHNgKS4gQWJzZW50IG9uIGJhcmUgZnJhbWVzLiAqL1xuICByZWFkb25seSByZWRhY3Rpb24/OiBSZWRhY3Rpb25SdWxlO1xuICAvKiogS2VlcCBhIHJlZGFjdGVkIG1pcnJvciBvZiB0aGUgaGVhcCAoYSBydW4gd2l0aCBhIHJlZGFjdGlvbiBwb2xpY3kpLiBFYWNoIHJ1bnRpbWUgb3ducyBpdHMgb3duIHN0b3JlLiAqL1xuICByZWFkb25seSBtaXJyb3I6IGJvb2xlYW47XG59XG5cbi8qKiBFYWNoIGRpYWwncyBkZWZhdWx0IOKAlCB0aGUgdmFsdWUgYSBydW4gZ2V0cyB3aGVuIHRoZSBvcHRpb24gaXMgYWJzZW50LiBUaGUgZGlhbCBsaXN0IElTIHRoZXNlIGtleXMuICovXG5leHBvcnQgY29uc3QgRElBTF9ERUZBVUxUUzogUmVhZG9ubHk8UmVxdWlyZWQ8UnVuRGlhbHM+PiA9IE9iamVjdC5mcmVlemUoe1xuICByZWFkVHJhY2tpbmc6ICdmdWxsJyxcbiAgd3JpdGVUcmFja2luZzogJ2Z1bGwnLFxuICBjb21taXRWYWx1ZXM6ICdmdWxsJyxcbiAgd3JpdGVQcm92ZW5hbmNlOiAnb2ZmJyxcbn0pO1xuXG5jb25zdCBESUFMX05BTUVTID0gT2JqZWN0LmtleXMoRElBTF9ERUZBVUxUUykgYXMgQXJyYXk8a2V5b2YgUnVuRGlhbHM+O1xuXG4vKiogRXZlcnkgZGVmYXVsdCwgbm8gcnVsZSwgbm8gbWlycm9yIOKAlCB3aGF0IGEgYmFyZSBmcmFtZSAoYSB1bml0IHRlc3QncyBgbmV3IFN0YWdlQ29udGV4dGApIHJ1bnMgdW5kZXIuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SVU5fUE9MSUNZOiBSdW5Qb2xpY3kgPSBPYmplY3QuZnJlZXplKHsgLi4uRElBTF9ERUZBVUxUUywgbWlycm9yOiBmYWxzZSB9KTtcblxuLyoqIEJ1aWxkIGEgcnVuJ3MgcG9saWN5OiBhYnNlbnQgZGlhbHMgdGFrZSB0aGVpciBkZWZhdWx0OyB0aGUgcmVzdWx0IGlzIGZyb3plbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Qb2xpY3koZGlhbHM6IFJ1bkRpYWxzID0ge30sIHJlZGFjdGlvbj86IFJlZGFjdGlvblJ1bGUsIG1pcnJvciA9IGZhbHNlKTogUnVuUG9saWN5IHtcbiAgY29uc3QgcmVzb2x2ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5ESUFMX0RFRkFVTFRTLCAuLi5waWNrRGlhbHMoZGlhbHMpLCBtaXJyb3IgfTtcbiAgaWYgKHJlZGFjdGlvbikgcmVzb2x2ZWQucmVkYWN0aW9uID0gcmVkYWN0aW9uO1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShyZXNvbHZlZCkgYXMgdW5rbm93biBhcyBSdW5Qb2xpY3k7XG59XG5cbi8qKiBUaGUgZGlhbHMgc2V0IG9uIGBzb3VyY2VgIChhbiBvcHRpb25zIG9iamVjdCwgc2F5KSDigJQgYW5kIG5vdGhpbmcgZWxzZSBmcm9tIGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2tEaWFscyhzb3VyY2U6IFJ1bkRpYWxzKTogUnVuRGlhbHMge1xuICBjb25zdCBkaWFsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIERJQUxfTkFNRVMpIGlmIChzb3VyY2VbbmFtZV0gIT09IHVuZGVmaW5lZCkgZGlhbHNbbmFtZV0gPSBzb3VyY2VbbmFtZV07XG4gIHJldHVybiBkaWFscyBhcyBSdW5EaWFscztcbn1cblxuLyoqIFRoZSBzYW1lIHBvbGljeSB1bmRlciBhbm90aGVyIHJ1bGUg4oCUIGEgTkVXIGZyb3plbiBvYmplY3Q7IHRoZSBvbGQgb25lIGlzIG5ldmVyIGVkaXRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUmVkYWN0aW9uKHBvbGljeTogUnVuUG9saWN5LCByZWRhY3Rpb246IFJlZGFjdGlvblJ1bGUpOiBSdW5Qb2xpY3kge1xuICByZXR1cm4gZGVyaXZlUG9saWN5KHBvbGljeSwgeyByZWRhY3Rpb24gfSk7XG59XG5cbi8qKlxuICogVGhlIHNhbWUgcG9saWN5IHdpdGggc29tZSBzZXR0aW5ncyBjaGFuZ2VkIOKAlCBhIE5FVyBmcm96ZW4gb2JqZWN0OyB0aGUgb2xkIG9uZSBpcyBuZXZlclxuICogZWRpdGVkLiBBIGZyYW1lIG9yIHJ1bnRpbWUgY2hhbmdlcyBhIHNldHRpbmcgYnkgc3dhcHBpbmcgaW4gYSBkZXJpdmVkIHBvbGljeSAoYHVzZVBvbGljeWApLCBzb1xuICogbm8gbXV0YWJsZSBkaWFsIGZpZWxkIGV4aXN0cyBhbnl3aGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZVBvbGljeShwb2xpY3k6IFJ1blBvbGljeSwgcGF0Y2g6IFBhcnRpYWw8UnVuUG9saWN5Pik6IFJ1blBvbGljeSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHsgLi4ucG9saWN5LCAuLi5wYXRjaCB9KTtcbn1cbiJdfQ==
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuUG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcnVuUG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFvSEgseUdBQXlHO0FBQ3pHLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN2RSxXQUFXLEVBQUUsS0FBSztJQUNsQixZQUFZLEVBQUUsTUFBTTtJQUNwQixhQUFhLEVBQUUsTUFBTTtJQUNyQixZQUFZLEVBQUUsTUFBTTtJQUNwQixlQUFlLEVBQUUsS0FBSztDQUN2QixDQUFDLENBQUM7QUFFSCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBMEIsQ0FBQztBQUV2RSwyR0FBMkc7QUFDM0csTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsYUFBYSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBRWhHLG1GQUFtRjtBQUNuRixNQUFNLFVBQVUsU0FBUyxDQUFDLFFBQWtCLEVBQUUsRUFBRSxTQUF5QixFQUFFLE1BQU0sR0FBRyxLQUFLO0lBQ3ZGLE1BQU0sUUFBUSxHQUE0QixFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzVGLElBQUksU0FBUztRQUFFLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzlDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQXlCLENBQUM7QUFDekQsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixNQUFNLFVBQVUsU0FBUyxDQUFDLE1BQWdCO0lBQ3hDLE1BQU0sS0FBSyxHQUE0QixFQUFFLENBQUM7SUFDMUMsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVO1FBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUztZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUYsT0FBTyxLQUFpQixDQUFDO0FBQzNCLENBQUM7QUFFRCw2RkFBNkY7QUFDN0YsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUFpQixFQUFFLFNBQXdCO0lBQ3ZFLE9BQU8sWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLE1BQWlCLEVBQUUsS0FBeUI7SUFDdkUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJ1blBvbGljeSDigJQgd2hhdCBhIHJ1biByZXRhaW5zLCBlbmNvZGVzIGFuZCBzY3J1YnMsIGFzIE9ORSBpbW11dGFibGUgb2JqZWN0IChGNSkuXG4gKlxuICogV0hZLiBBIHJ1biBjYXJyaWVzIHNpeCBzZXR0aW5ncyB0aGF0IGV2ZXJ5IHN0YWdlIGZyYW1lIG11c3QgYWdyZWUgb246IHRoZSBmb3VyXG4gKiBvYnNlcnZhYmlsaXR5IGRpYWxzIChgcmVhZFRyYWNraW5nYCwgYHdyaXRlVHJhY2tpbmdgLCBgY29tbWl0VmFsdWVzYCwgYHdyaXRlUHJvdmVuYW5jZWApLFxuICogdGhlIHJlZGFjdGlvbiBydWxlLCBhbmQgd2hldGhlciBhIHJlZGFjdGVkIG1pcnJvciBpcyBrZXB0LiBVbnRpbCA5LjM0LjAgZWFjaCBvbmUgd2FzXG4gKiBjb3BpZWQgZmllbGQgYnkgZmllbGQgZG93biB0aHJlZSBzZXBhcmF0ZSBwYXRocyDigJQgYEV4ZWN1dGlvblJ1bnRpbWUudXNlKmAgb24gdGhlIHJvb3QsXG4gKiBgU3RhZ2VDb250ZXh0LmNyZWF0ZU5leHRgL2BjcmVhdGVDaGlsZGAgKHNpeCBhc3NpZ25tZW50cyBlYWNoKSwgYW5kIGEgZHVjay10eXBlZCBwdXNoIHBlclxuICogZGlhbCBpbiBgU3ViZmxvd0V4ZWN1dG9yYCDigJQgc28gYSBuZXcgZGlhbCBtZWFudCBzaXggZWRpdHMsIGFuZCBhIG1pc3NlZCBvbmUgcmFuIGEgc3ViZmxvd1xuICogb24gdGhlIGRlZmF1bHQgc2lsZW50bHkuIE5vdyB0aGUgZXhlY3V0b3IgYnVpbGRzIE9ORSBwb2xpY3kgcGVyIHJ1biAoYW5kIHBlciByZXN1bWUpLCB0aGVcbiAqIHJ1bnRpbWUgaW5zdGFsbHMgaXQgb24gaXRzIHJvb3QgZnJhbWUsIGFuZCBldmVyeSBmcmFtZSBob2xkcyBpdCBCWSBSRUZFUkVOQ0U6IGEgY2hpbGQsIGFcbiAqIGNvbnRpbnVhdGlvbiBhbmQgYSBzdWJmbG93J3Mgcm9vdCAoaXRzIHNlZWQgZnJhbWUgaW5jbHVkZWQpIGFsbCBwb2ludCBhdCB0aGUgc2FtZSBvYmplY3QuXG4gKiBUaGUgYm9ycm93ZWQgaWRlYSBpcyBHbydzIGBjb250ZXh0LkNvbnRleHRgIC8gT3BlblRlbGVtZXRyeSdzIGBDb250ZXh0YDogYW4gaW1tdXRhYmxlIHZhbHVlXG4gKiBoYW5kZWQgZG93biwgbmV2ZXIgY29waWVkIGFwYXJ0LlxuICpcbiAqIEFERElORyBBIERJQUwgaXMgdHdvIGZpbGVzOiBhIGZpZWxkICsgaXRzIGRlZmF1bHQgaGVyZSAoe0BsaW5rIFJ1bkRpYWxzfSxcbiAqIHtAbGluayBESUFMX0RFRkFVTFRTfSksIGFuZCB0aGUgZnJhbWUgY29kZSB0aGF0IHJlYWRzIGBwb2xpY3kuPGRpYWw+YCAoYFN0YWdlQ29udGV4dGApLiBUaGVcbiAqIGV4ZWN1dG9yJ3Mgb3B0aW9ucyBpbmhlcml0IHtAbGluayBSdW5EaWFsc30sIHBpY2tzIHRoZW0gd2l0aCB7QGxpbmsgcGlja0RpYWxzfSwgYW5kIGV2ZXJ5XG4gKiBwcm9wYWdhdGlvbiBwYXRoIGNhcnJpZXMgdGhlIHdob2xlIG9iamVjdCDigJQgbm9uZSBvZiB0aGVtIG5hbWVzIGEgZGlhbC5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcG9saWN5ID0gcnVuUG9saWN5KHsgY29tbWl0VmFsdWVzOiAnZGVsdGEnIH0sIHJ1bGUsIHRydWUpO1xuICogcG9saWN5LnJlYWRUcmFja2luZzsgLy8gJ2Z1bGwnIOKAlCBhbiBhYnNlbnQgZGlhbCBpcyBpdHMgZGVmYXVsdFxuICogT2JqZWN0LmlzRnJvemVuKHBvbGljeSk7IC8vIHRydWUg4oCUIGEgZnJhbWUgY2FuIG5ldmVyIGVkaXQgd2hhdCBpdHMgc2libGluZ3Mgc2hhcmVcbiAqIGBgYFxuICpcbiAqIFRoZSBSVUxFIGluc2lkZSBpcyBzaGFyZWQgdG9vLCBhbmQgaXMgaXRzZWxmIHN0YXRlZnVsIGJ5IGRlc2lnbiAocGVyLWNhbGwgYHNldFZhbHVlKGssIHYsXG4gKiB0cnVlKWAgbWFya3MgYSBrZXkgb24gaXQgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4pOyB0aGUgcG9saWN5IGZyZWV6ZXMgd2hpY2ggcnVsZSwgbm90IHRoZVxuICogcnVsZSdzIG1hcmtzLiBUaGUgbWlycm9yIFNUT1JFIGlzIG5vdCBwb2xpY3kg4oCUIGVhY2ggcnVudGltZSAoYSBzdWJmbG93IGhhcyBpdHMgb3duKSBrZWVwc1xuICogaXRzIG93biBzdG9yZSB3aGVuIGBtaXJyb3JgIGlzIHNldC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdFZhbHVlc01vZGUgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWFkU291cmNlTGltaXRzLCBXcml0ZVByb3ZlbmFuY2VNb2RlIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHR5cGUgeyBSZWFkVHJhY2tpbmdNb2RlLCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4vZnJhbWVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblJ1bGUgfSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5cbi8qKlxuICogVGhlIGZvdXIgb2JzZXJ2YWJpbGl0eSBkaWFscyBhcyBhbiBleGVjdXRvciB0YWtlcyB0aGVtIOKAlCBldmVyeSBmaWVsZCBvcHRpb25hbCwgYW4gYWJzZW50XG4gKiBvbmUgaXMgaXRzIGRlZmF1bHQuIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnNgIGV4dGVuZHMgdGhpcyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuRGlhbHMge1xuICAvKiogTmF0aXZlLCBib3VuZGVkIHNjYWxhciByZWFkLXNvdXJjZSBvY2N1cnJlbmNlcyAoIzExMykuIERlZmF1bHQgZmFsc2U7IG1lbW9yeS1vbmx5IGluIHBhY2tldCAzLiAqL1xuICByZWFkU291cmNlcz86IGJvb2xlYW4gfCB7IHJlYWRvbmx5IGxpbWl0czogUGFydGlhbDxSZWFkU291cmNlTGltaXRzPiB9O1xuICAvKipcbiAgICogUG9saWN5IGZvciBgU3RhZ2VTbmFwc2hvdC5zdGFnZVJlYWRzYCAoIzE0KS4gRGVmYXVsdCBgJ2Z1bGwnYCDigJQgZXZlcnlcbiAgICogdHJhY2tlZCByZWFkIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB0aGUgdmFsdWUgaW50byB0aGUgc3RhZ2UncyByZWFkIHZpZXdcbiAgICogKHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yOyB3aGF0IGxlbnMvYWdlbnRmb290cHJpbnQgc25hcHNob3RzIHNob3cpLlxuICAgKiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXAgdHlwZS9zaXplL3ByZXZpZXcgbWFya2VyIHBlciByZWFkOyBgJ29mZidgXG4gICAqIHJlY29yZHMgbm90aGluZyDigJQgemVybyBwZXItcmVhZCBjbG9uZSBjb3N0IChyZWFkcyBvZiBsYXJnZSB2YWx1ZXMgYmVjb21lXG4gICAqIH5mcmVlKS4gTmFycmF0aXZlIGFuZCBgU2NvcGVSZWNvcmRlci5vblJlYWRgIGFyZSBpZGVudGljYWwgaW4gZXZlcnkgbW9kZS5cbiAgICogQ2F2ZWF0OiB1bmRlciBgJ29mZidgIGEgc3RhZ2UncyBzbmFwc2hvdCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG9uZVxuICAgKiB0aGF0IHJlYWQgbm90aGluZyDigJQgYXVkaXRpbmcgY29uc3VtZXJzIHRoYXQgbmVlZCBcImRpZCBpdCByZWFkP1wiIHdpdGhvdXRcbiAgICogdGhlIHZhbHVlIGNvc3Qgc2hvdWxkIHByZWZlciBgJ3N1bW1hcnknYC5cbiAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIGBleGVjdXRvci5zZXRSZWFkVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICAgKi9cbiAgcmVhZFRyYWNraW5nPzogUmVhZFRyYWNraW5nTW9kZTtcblxuICAvKipcbiAgICogUG9saWN5IGZvciBgU3RhZ2VTbmFwc2hvdC5zdGFnZVdyaXRlc2AgKCMxM2MtQSkg4oCUIHRoZSBzaWJsaW5nIG9mXG4gICAqIHtAbGluayByZWFkVHJhY2tpbmd9OyB0aGUgdHdvIGRpYWxzIGFyZSBpbmRlcGVuZGVudC4gRGVmYXVsdCBgJ2Z1bGwnYCDigJRcbiAgICogZXZlcnkgdHJhY2tlZCB3cml0ZSBgc3RydWN0dXJlZENsb25lYHMgdGhlIHZhbHVlIGludG8gdGhlIHN0YWdlJ3Mgd3JpdGVcbiAgICogdmlldyAodGhlIGhpc3RvcmljYWwgYmVoYXZpb3IpLiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXBcbiAgICogYFdyaXRlU3VtbWFyeU1hcmtlcmAgKHR5cGUvc2l6ZS9wcmV2aWV3KSBwZXIgd3JpdGU7IGAnb2ZmJ2AgcmVjb3Jkc1xuICAgKiBub3RoaW5nIOKAlCBgc3RhZ2VXcml0ZXNgIGlzIGFic2VudCBmcm9tIHRoZSBzbmFwc2hvdC5cbiAgICpcbiAgICogT2JzZXJ2YWJsZSBjb25zZXF1ZW5jZXMg4oCUIHdoYXQgdGhlIHBvbGljeSBET0VTIGdvdmVybjpcbiAgICogLSBgU3RhZ2VTbmFwc2hvdC5zdGFnZVdyaXRlc2AgKG1hcmtlcnMgdW5kZXIgYCdzdW1tYXJ5J2AsIGFic2VudCB1bmRlclxuICAgKiAgIGAnb2ZmJ2ApLlxuICAgKiAtIFRoZSBjb21taXQgb2JzZXJ2ZXIgcGF5bG9hZDogYFNjb3BlUmVjb3JkZXIub25Db21taXQobXV0YXRpb25zKWBcbiAgICogICByZWNlaXZlcyB0aGUgcmV0YWluZWQgYF9zdGFnZVdyaXRlc2AgZW50cmllcywgc28gaXQgY2FycmllcyB0aGUgc2FtZVxuICAgKiAgIG1hcmtlcnMgdW5kZXIgYCdzdW1tYXJ5J2AgYW5kIGFuIGVtcHR5IG11dGF0aW9ucyBiYWcgdW5kZXIgYCdvZmYnYCDigJRcbiAgICogICBkZWZlcnJlZC9vYnNlcnZlciBjb25zdW1lcnMgc2VlIGV4YWN0bHkgd2hhdCByZXRlbnRpb24gc3RvcmVkLlxuICAgKlxuICAgKiBXaGF0IGl0IGRvZXMgTk9UIGdvdmVybjpcbiAgICogLSBUaGUgd3JpdGVzIHRoZW1zZWx2ZXM6IHNoYXJlZCBzdGF0ZSwgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciwgYW5kIHRoZVxuICAgKiAgIENPTU1JVCBMT0cgYXJlIGlkZW50aWNhbCBpbiBldmVyeSBtb2RlIChjb21taXRMb2cgdmFsdWVzIGtlZXAgdGhlaXJcbiAgICogICBmdWxsIHBheWxvYWRzIOKAlCB0aGUgbG9zc2xlc3MgbGluZWFyLWNvc3QgZml4IGZvciB0aG9zZSBpcyB0aGVcbiAgICogICB7QGxpbmsgY29tbWl0VmFsdWVzfSBkaWFsLCAjMTNjLUIpLlxuICAgKiAtIFBlci1vcCBgU2NvcGVSZWNvcmRlci5vbldyaXRlYCBldmVudHMg4oCUIHRoZXkgZmlyZSB3aXRoIGxpdmUgdmFsdWVzXG4gICAqICAgcmVnYXJkbGVzcyAoZGVsaXZlcnkgdGllciwgUkZDLTAwMSdzIGNvbmNlcm4pLCBzbyBuYXJyYXRpdmUgb3V0cHV0IGlzXG4gICAqICAgaWRlbnRpY2FsIGluIGV2ZXJ5IG1vZGUuXG4gICAqIC0gUmVkYWN0aW9uOiBhIHBvbGljeS9wZXItY2FsbC1yZWRhY3RlZCB3cml0ZSBzdG9yZXMgYCdbUkVEQUNURURdJ2BcbiAgICogICB1bmRlciBgJ2Z1bGwnYCBBTkQgYCdzdW1tYXJ5J2AgKHJlZGFjdGlvbiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlXG4gICAqICAgZGlhbDsgYSBtYXJrZXIgd291bGQgbGVhayBzaXplL3ByZXZpZXcpLCBhbmQgbm90aGluZyB1bmRlciBgJ29mZidgLlxuICAgKlxuICAgKiBDYXZlYXQ6IHVuZGVyIGAnb2ZmJ2AgYSBzdGFnZSdzIFNOQVBTSE9UIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gb25lXG4gICAqIHRoYXQgd3JvdGUgbm90aGluZyDigJQgYnV0IHVubGlrZSBgcmVhZFRyYWNraW5nOiAnb2ZmJ2AsIHRoZSBjb21taXQgbG9nXG4gICAqIHN0aWxsIHJlY29yZHMgZXZlcnkgbmV0IGNoYW5nZSwgc28gXCJkaWQgaXQgd3JpdGU/XCIgc3RheXMgYW5zd2VyYWJsZS5cbiAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIGBleGVjdXRvci5zZXRXcml0ZVRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAgICovXG4gIHdyaXRlVHJhY2tpbmc/OiBXcml0ZVRyYWNraW5nTW9kZTtcblxuICAvKipcbiAgICogRW5jb2RpbmcgcG9saWN5IGZvciBDT01NSVQgTE9HIHZhbHVlcyAoIzEzYy1CKSDigJQgdGhlIHRoaXJkIGRpYWwgb2YgdGhlXG4gICAqIGZhbWlseSwgYW5kIHVubGlrZSBpdHMgc2libGluZ3MgaXQgaXMgKipsb3NzbGVzcyBpbiBib3RoIG1vZGVzKiogKGl0XG4gICAqIGNoYW5nZXMgdGhlIGxvZydzIGVuY29kaW5nLCBuZXZlciBpdHMgaW5mb3JtYXRpb24pLlxuICAgKlxuICAgKiAtIGAnZnVsbCdgIChkZWZhdWx0KSDigJQgZXZlcnkgc3Vydml2aW5nIGBzZXRgIHBhdGggc3RvcmVzIHRoZSBmdWxsIGZpbmFsXG4gICAqICAgdmFsdWU7IGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yLlxuICAgKiAtIGAnZGVsdGEnYCDigJQgYXJyYXkgbmV0LWNoYW5nZXMgdGhhdCBhcmUgXCJiYXNlIHBsdXMgYSB0YWlsXCIgY29tbWl0IGFzIGFuXG4gICAqICAgYGFwcGVuZGAgdHJhY2UgdmVyYiBzdG9yaW5nIE9OTFkgdGhlIHRhaWwgKHRoZSBncm93aW5nLWhpc3RvcnkgY29tbWl0XG4gICAqICAgbG9nIGJlY29tZXMgbGluZWFyIGluc3RlYWQgb2YgTyhOwrIpIHJldGFpbmVkKTsgYGRlbGV0ZVZhbHVlKClgIGNvbW1pdHNcbiAgICogICBhcyBhIHJlYWwgYGRlbGV0ZWAgdmVyYiAocmVwbGF5IHJlbW92ZXMgdGhlIGtleSBpbnN0ZWFkIG9mIGxlYXZpbmdcbiAgICogICBga2V5OiB1bmRlZmluZWRgKTsgYnVuZGxlcyBjYXJyeSBleGFjdGx5IE9ORSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nXG4gICAqICAgcGF0aC4gUmVwbGF5ICh0aGUgb25lIHZlcmIgbGF3IOKAlCBsaXZlIHN0YXRlLCBgbWF0ZXJpYWxpc2UoKWAsIHRoZVxuICAgKiAgIHJlZGFjdGVkIG1pcnJvciwgYHN0YXRlQXRgKSByZWNvbnN0cnVjdHMgZXZlcnkgc3RlcCdzIGZ1bGwgc3RhdGVcbiAgICogICBleGFjdGx5LlxuICAgKlxuICAgKiBDb25zdW1lcnMgdGhhdCByZWFkIGBidW5kbGUub3ZlcndyaXRlW2tleV1gIGFzIFwidGhlIGZ1bGwgdmFsdWUgd3JpdHRlblwiXG4gICAqIG11c3Qgc3dpdGNoIHRvIGBjb21taXRWYWx1ZUF0KGNvbW1pdExvZywgaWR4LCBrZXkpYCBmcm9tXG4gICAqIGBmb290dHJhY2VgIOKAlCB1bmRlciBgJ2RlbHRhJ2AgdGhhdCB2YWx1ZSBpcyB2ZXJiLXF1YWxpZmllZCAoYW5cbiAgICogYGFwcGVuZGAgYnVuZGxlIGhvbGRzIG9ubHkgdGhlIHRhaWwpLiBQYXRoLXRpZXIgY29uc3VtZXJzXG4gICAqIChgZmluZExhc3RXcml0ZXJgLCBgY2F1c2FsQ2hhaW5gLCBuYXJyYXRpdmUsIGxlbnMgaGlnaGxpZ2h0cykgYXJlXG4gICAqIHVuYWZmZWN0ZWQuIFRoZSBhY3RpdmUgbW9kZSBpcyBzdXJmYWNlZCBhc1xuICAgKiBgZ2V0U25hcHNob3QoKS5jb21taXRWYWx1ZXNgLlxuICAgKlxuICAgKiBIb25lc3QgY29zdCBub3RlOiBhcHBlbmQgZGV0ZWN0aW9uIGlzIG5ldyB3YWxsIHdvcmsg4oCUIGFuIE8ofGJhc2UgYXJyYXl8KVxuICAgKiBzdHJ1Y3R1cmFsIHByZWZpeCBjb21wYXJlIHBlciBhcnJheS1zZXQgcGF0aCBwZXIgY29tbWl0LiBPbiBhIGhpdCB0aGVcbiAgICogY29tbWl0IGdldHMgY2hlYXBlciBpbiBib3RoIHdhbGwgYW5kIGhlYXA7IG9uIGEgbWlzcyAocHJlZml4IGRpdmVyZ2VzKVxuICAgKiBpdCBwYXlzIGNvbXBhcmUgKyBmdWxsIGNsb25lLiBgJ2Z1bGwnYCBwYXlzIHplcm8uXG4gICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBgZXhlY3V0b3Iuc2V0Q29tbWl0VmFsdWVzKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAgICovXG4gIGNvbW1pdFZhbHVlcz86IENvbW1pdFZhbHVlc01vZGU7XG5cbiAgLyoqXG4gICAqIFBlci13cml0ZSByZWFkIHByb3ZlbmFuY2UgKCNQMSkg4oCUIHRoZSBmb3VydGggZGlhbCBvZiB0aGUgZmFtaWx5LiBEZWZhdWx0XG4gICAqIGAnb2ZmJ2A6IHplcm8gY29zdCwgYnl0ZS1pZGVudGljYWwgY29tbWl0IGxvZ3MuIGAncmVhZHMtcHJlZml4J2A6IGV2ZXJ5XG4gICAqIGNvbW1pdHRlZCBgVHJhY2VFbnRyeWAgY2FycmllcyBgcmVhZEtleXNgIOKAlCB0aGUga2V5cyB0cmFja2VkLXJlYWQgQkVGT1JFXG4gICAqIHRoYXQgd3JpdGUg4oCUIGVuYWJsaW5nIHBlci13cml0ZSBjYXVzYWwgYXR0cmlidXRpb24gKGBjYXVzYWxDaGFpbmAnc1xuICAgKiBgZWRnZUF0dHJpYnV0aW9uOiAncGVyLXdyaXRlJ2AgYW5kIHZhcmlhYmxlIHNsaWNlcykuIENvc3Q6IG9uZSBzbWFsbFxuICAgKiBhcnJheSBjb3B5IHBlciB3cml0ZS4gU25hcHNob3QgZGlzY3JpbWluYW50OlxuICAgKiBgZ2V0U25hcHNob3QoKS53cml0ZVByb3ZlbmFuY2VgLlxuICAgKi9cbiAgd3JpdGVQcm92ZW5hbmNlPzogV3JpdGVQcm92ZW5hbmNlTW9kZTtcbn1cblxuLyoqIFRoZSBydW4ncyBwb2xpY3k6IGV2ZXJ5IGRpYWwgcmVzb2x2ZWQsIHBsdXMgdGhlIHJlZGFjdGlvbiBydWxlIGFuZCB0aGUgbWlycm9yIGZsYWcuIEZyb3plbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuUG9saWN5IGV4dGVuZHMgUmVhZG9ubHk8UmVxdWlyZWQ8UnVuRGlhbHM+PiB7XG4gIC8qKiBUaGUgcnVuJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIHRoZSBPTkUgb3duZXIgb2YgdGhlIHZlcmRpY3QgKGByZWRhY3Rpb24udHNgKS4gQWJzZW50IG9uIGJhcmUgZnJhbWVzLiAqL1xuICByZWFkb25seSByZWRhY3Rpb24/OiBSZWRhY3Rpb25SdWxlO1xuICAvKiogS2VlcCBhIHJlZGFjdGVkIG1pcnJvciBvZiB0aGUgaGVhcCAoYSBydW4gd2l0aCBhIHJlZGFjdGlvbiBwb2xpY3kpLiBFYWNoIHJ1bnRpbWUgb3ducyBpdHMgb3duIHN0b3JlLiAqL1xuICByZWFkb25seSBtaXJyb3I6IGJvb2xlYW47XG59XG5cbi8qKiBFYWNoIGRpYWwncyBkZWZhdWx0IOKAlCB0aGUgdmFsdWUgYSBydW4gZ2V0cyB3aGVuIHRoZSBvcHRpb24gaXMgYWJzZW50LiBUaGUgZGlhbCBsaXN0IElTIHRoZXNlIGtleXMuICovXG5leHBvcnQgY29uc3QgRElBTF9ERUZBVUxUUzogUmVhZG9ubHk8UmVxdWlyZWQ8UnVuRGlhbHM+PiA9IE9iamVjdC5mcmVlemUoe1xuICByZWFkU291cmNlczogZmFsc2UsXG4gIHJlYWRUcmFja2luZzogJ2Z1bGwnLFxuICB3cml0ZVRyYWNraW5nOiAnZnVsbCcsXG4gIGNvbW1pdFZhbHVlczogJ2Z1bGwnLFxuICB3cml0ZVByb3ZlbmFuY2U6ICdvZmYnLFxufSk7XG5cbmNvbnN0IERJQUxfTkFNRVMgPSBPYmplY3Qua2V5cyhESUFMX0RFRkFVTFRTKSBhcyBBcnJheTxrZXlvZiBSdW5EaWFscz47XG5cbi8qKiBFdmVyeSBkZWZhdWx0LCBubyBydWxlLCBubyBtaXJyb3Ig4oCUIHdoYXQgYSBiYXJlIGZyYW1lIChhIHVuaXQgdGVzdCdzIGBuZXcgU3RhZ2VDb250ZXh0YCkgcnVucyB1bmRlci4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1JVTl9QT0xJQ1k6IFJ1blBvbGljeSA9IE9iamVjdC5mcmVlemUoeyAuLi5ESUFMX0RFRkFVTFRTLCBtaXJyb3I6IGZhbHNlIH0pO1xuXG4vKiogQnVpbGQgYSBydW4ncyBwb2xpY3k6IGFic2VudCBkaWFscyB0YWtlIHRoZWlyIGRlZmF1bHQ7IHRoZSByZXN1bHQgaXMgZnJvemVuLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blBvbGljeShkaWFsczogUnVuRGlhbHMgPSB7fSwgcmVkYWN0aW9uPzogUmVkYWN0aW9uUnVsZSwgbWlycm9yID0gZmFsc2UpOiBSdW5Qb2xpY3kge1xuICBjb25zdCByZXNvbHZlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLkRJQUxfREVGQVVMVFMsIC4uLnBpY2tEaWFscyhkaWFscyksIG1pcnJvciB9O1xuICBpZiAocmVkYWN0aW9uKSByZXNvbHZlZC5yZWRhY3Rpb24gPSByZWRhY3Rpb247XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHJlc29sdmVkKSBhcyB1bmtub3duIGFzIFJ1blBvbGljeTtcbn1cblxuLyoqIFRoZSBkaWFscyBzZXQgb24gYHNvdXJjZWAgKGFuIG9wdGlvbnMgb2JqZWN0LCBzYXkpIOKAlCBhbmQgbm90aGluZyBlbHNlIGZyb20gaXQuICovXG5leHBvcnQgZnVuY3Rpb24gcGlja0RpYWxzKHNvdXJjZTogUnVuRGlhbHMpOiBSdW5EaWFscyB7XG4gIGNvbnN0IGRpYWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgRElBTF9OQU1FUykgaWYgKHNvdXJjZVtuYW1lXSAhPT0gdW5kZWZpbmVkKSBkaWFsc1tuYW1lXSA9IHNvdXJjZVtuYW1lXTtcbiAgcmV0dXJuIGRpYWxzIGFzIFJ1bkRpYWxzO1xufVxuXG4vKiogVGhlIHNhbWUgcG9saWN5IHVuZGVyIGFub3RoZXIgcnVsZSDigJQgYSBORVcgZnJvemVuIG9iamVjdDsgdGhlIG9sZCBvbmUgaXMgbmV2ZXIgZWRpdGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZWRhY3Rpb24ocG9saWN5OiBSdW5Qb2xpY3ksIHJlZGFjdGlvbjogUmVkYWN0aW9uUnVsZSk6IFJ1blBvbGljeSB7XG4gIHJldHVybiBkZXJpdmVQb2xpY3kocG9saWN5LCB7IHJlZGFjdGlvbiB9KTtcbn1cblxuLyoqXG4gKiBUaGUgc2FtZSBwb2xpY3kgd2l0aCBzb21lIHNldHRpbmdzIGNoYW5nZWQg4oCUIGEgTkVXIGZyb3plbiBvYmplY3Q7IHRoZSBvbGQgb25lIGlzIG5ldmVyXG4gKiBlZGl0ZWQuIEEgZnJhbWUgb3IgcnVudGltZSBjaGFuZ2VzIGEgc2V0dGluZyBieSBzd2FwcGluZyBpbiBhIGRlcml2ZWQgcG9saWN5IChgdXNlUG9saWN5YCksIHNvXG4gKiBubyBtdXRhYmxlIGRpYWwgZmllbGQgZXhpc3RzIGFueXdoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlUG9saWN5KHBvbGljeTogUnVuUG9saWN5LCBwYXRjaDogUGFydGlhbDxSdW5Qb2xpY3k+KTogUnVuUG9saWN5IHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoeyAuLi5wb2xpY3ksIC4uLnBhdGNoIH0pO1xufVxuIl19
@@ -31,6 +31,7 @@
31
31
  * Borrowed: LangGraph's checkpoint `v` field; io-ts's decode-at-the-boundary
32
32
  * (one decoder turns `unknown` into the type, or refuses with a path).
33
33
  */
34
+ import { readCheckpointCapture, withoutCheckpointCapture } from '../capture/checkpointCapture.js';
34
35
  import { idempotencyKeyProblem } from '../ids/idempotencyKey.js';
35
36
  import { isPausedExecution } from './types.js';
36
37
  /** The checkpoint format this release writes (`FlowchartCheckpoint.checkpointVersion`). */
@@ -122,7 +123,12 @@ export function decodePauseRecord(raw, at = '') {
122
123
  export function decodeCheckpoint(stored) {
123
124
  if (!isPlainRecord(stored))
124
125
  refuse('the checkpoint must be an object');
125
- const checkpoint = upcastCheckpoint(stored);
126
+ const capture = readCheckpointCapture(stored);
127
+ const checkpoint = upcastCheckpoint(withoutCheckpointCapture(stored));
128
+ if (capture)
129
+ checkpoint.capture = capture;
130
+ else
131
+ delete checkpoint.capture;
126
132
  if (!isPlainRecord(checkpoint.sharedState))
127
133
  refuse('sharedState must be a plain object');
128
134
  decodePauseRecord(checkpoint);
@@ -175,4 +181,4 @@ export function decodePendingPauses(pending) {
175
181
  function isCount(value) {
176
182
  return typeof value === 'number' && Number.isInteger(value) && value >= 0;
177
183
  }
178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9wYXVzZS9yZWNvcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRS9DLDJGQUEyRjtBQUMzRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFVLENBQUM7QUFFN0MscUdBQXFHO0FBQ3JHLE1BQU0saUJBQWlCLEdBQXVCLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFldEUsbUVBQW1FO0FBQ25FLFNBQVMsTUFBTSxDQUFDLElBQVk7SUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUErQjtJQUM5RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDekMsSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbEUsTUFBTSxDQUNKLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsaUNBQWlDO1lBQzlGLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1B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SUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRyxNQUFNLENBQUMsMERBQTBELENBQUMsQ0FBQztJQUNyRSxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEtBQWM7SUFDL0IsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0FBQ2pGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE9BQWdCO0lBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ3RFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxLQUFjO0lBQzdCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwYXVzZS9yZWNvcmQudHMg4oCUIHRoZSBjaGVja3BvaW50IENPREVDIChGOCwgOS4zOS4wKTogb25lIHZlcnNpb24sIG9uZVxuICogdXBjYXN0ZXIsIG9uZSB2YWxpZGF0b3IsIG9uZSBtZXNzYWdlIHNldC5cbiAqXG4gKiBBIGNoZWNrcG9pbnQgaXMgc3RvcmVkIGRhdGEg4oCUIFJlZGlzLCBQb3N0Z3JlcywgYSBmaWxlIOKAlCBhbmQgY29tZXMgYmFjayB0b1xuICogYHJlc3VtZSgpYCBmcm9tIHdoaWNoZXZlciByZWxlYXNlIHdyb3RlIGl0LiBVbnRpbCA5LjM4LjAgaXQgd2FzIGNoZWNrZWQgaW5cbiAqIFRXTyBwbGFjZXMgd2l0aCB0d28gbWVzc2FnZSBzZXRzOiBgRmxvd0NoYXJ0RXhlY3V0b3IgwrcgcmVzdW1lYCBjaGVja2VkIHRoZVxuICogcGF1c2VkIHJlY29yZCdzIGZpZWxkcywgYFJlc3VtZUVudHJ5YCBjaGVja2VkIGVhY2ggd2FpdGluZyBzaWJsaW5nJ3NcbiAqIChgcGVuZGluZ1BhdXNlc1tuXWApIOKAlCB0aGUgU0FNRSByZWNvcmQgc2hhcGUsIGNoZWNrZWQgdHdpY2UsIGRpZmZlcmVudGx5XG4gKiAodGhlIHRvcC1sZXZlbCBgcGF1c2VkQnlgIGFuZCBgc3ViZmxvd1N0YXRlc2Agd2VyZSBuZXZlciBjaGVja2VkIGF0IGFsbCkuXG4gKiBCb3RoIG5vdyBjYWxsIHtAbGluayBkZWNvZGVDaGVja3BvaW50fTsgZXZlcnkgcmVjb3JkIGlzIGNoZWNrZWQgYnlcbiAqIHtAbGluayBkZWNvZGVQYXVzZVJlY29yZH0uXG4gKlxuICogVkVSU0lPTklORy4gQSBjaGVja3BvaW50IHdyaXR0ZW4gYnkgdGhpcyByZWxlYXNlIGNhcnJpZXNcbiAqIGBjaGVja3BvaW50VmVyc2lvbjogMmAuIEV2ZXJ5IG9sZGVyIG9uZSBpcyByZWFkIGJ5IHRoZSBPTkUgdXBjYXN0ZXIsXG4gKiB7QGxpbmsgdXBjYXN0Q2hlY2twb2ludH0sIGFuZCBldmVyeSBzdGVwIHNvIGZhciBvbmx5IERST1BTIGZpZWxkcyDigJQgd2hhdCBhXG4gKiBsYXRlciBmb3JtYXQgYWRkZWQgaXMgb3B0aW9uYWwgYW5kIHJlYWQgYXMgYWJzZW50OlxuICpcbiAqICAgLSB2ZXJzaW9uIDAgKG5vIGBjaGVja3BvaW50VmVyc2lvbmAsIGJlZm9yZSA5LjM5LjApIOKGkiAxOiBkcm9wXG4gKiAgICAgYGNvbnRpbnVhdGlvblN0YWdlSWRgLCBhIHJlY29yZCBubyByZXN1bWUgaGFzIHJlYWQgc2luY2UgOS4yOC4wICh3aGF0XG4gKiAgICAgcnVucyBhZnRlciBhIHJlc3VtZSBjb21lcyBmcm9tIHRoZSBjaGFydCk7XG4gKiAgIC0gdmVyc2lvbiAxICg5LjM5LjDigJM5LjQzLngpIOKGkiAyICh0aGUgTEVBTiBjaGVja3BvaW50KTogZHJvcFxuICogICAgIGBleGVjdXRpb25UcmVlYCBhbmQgYHN1YmZsb3dSZXN1bHRzYCDigJQgdGhlIHJ1bidzIHNlcnZlZCByZWNvcmQgKHRoZVxuICogICAgIHdob2xlIGV4ZWN1dGlvbiB0cmVlLCB0aGUgZmluaXNoZWQgc3ViZmxvd3MnIHJlc3VsdHMpLCB3aGljaCBubyByZXN1bWVcbiAqICAgICBldmVyIHJlYWQgYW5kIHdoaWNoIGdyZXcgd2l0aCBldmVyeSBmaW5pc2hlZCBpdGVyYXRpb25cbiAqICAgICAoYHJ1bm5lci9jaGVja3BvaW50LnRzYCkuXG4gKlxuICogQSBkcm9wcGVkIGZpZWxkIG5ldmVyIHN1cnZpdmVzLCB3aGF0ZXZlciB2ZXJzaW9uIGNsYWltcyB0byBjYXJyeSBpdC4gQVxuICogdmVyc2lvbiB0aGlzIHJlbGVhc2UgZG9lcyBub3Qga25vdyBpcyByZWZ1c2VkLCBuZXZlciBndWVzc2VkIGF0LlxuICpcbiAqIEJvcnJvd2VkOiBMYW5nR3JhcGgncyBjaGVja3BvaW50IGB2YCBmaWVsZDsgaW8tdHMncyBkZWNvZGUtYXQtdGhlLWJvdW5kYXJ5XG4gKiAob25lIGRlY29kZXIgdHVybnMgYHVua25vd25gIGludG8gdGhlIHR5cGUsIG9yIHJlZnVzZXMgd2l0aCBhIHBhdGgpLlxuICovXG5cbmltcG9ydCB7IGlkZW1wb3RlbmN5S2V5UHJvYmxlbSB9IGZyb20gJy4uL2lkcy9pZGVtcG90ZW5jeUtleS5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFBlbmRpbmdQYXVzZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZWRFeGVjdXRpb24gfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIFRoZSBjaGVja3BvaW50IGZvcm1hdCB0aGlzIHJlbGVhc2Ugd3JpdGVzIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5jaGVja3BvaW50VmVyc2lvbmApLiAqL1xuZXhwb3J0IGNvbnN0IENIRUNLUE9JTlRfVkVSU0lPTiA9IDIgYXMgY29uc3Q7XG5cbi8qKiBUaGUgZm9ybWF0cyB0aGlzIHJlbGVhc2UgcmVhZHM6IHRoZSBjdXJyZW50IG9uZSBhbmQgZXZlcnkgb25lIGl0IHVwY2FzdHMgKGFic2VudCA9IHZlcnNpb24gMCkuICovXG5jb25zdCBSRUFEQUJMRV9WRVJTSU9OUzogcmVhZG9ubHkgdW5rbm93bltdID0gWzEsIENIRUNLUE9JTlRfVkVSU0lPTl07XG5cbi8qKlxuICogRmllbGRzIG9ubHkgYW4gT0xERVIgY2hlY2twb2ludCBjYW4gY2FycnksIGVhY2ggZHJvcHBlZCBieSB0aGUgZm9ybWF0IG5hbWVkXG4gKiBiZXNpZGUgaXQuIFRoZSB1cGNhc3RlciByZW1vdmVzIHRoZW0gYW5kIHRoZSBjdXJyZW50IHNoYXBlIG5ldmVyIGhhcyB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExlZ2FjeUNoZWNrcG9pbnRGaWVsZHMge1xuICAvKiogVmVyc2lvbiAwIG9ubHk6IHRoZSBpbnZva2VyJ3MgYC5uZXh0YCBpZCDigJQgYSByZWNvcmQgc2luY2UgOS4yOC4wLCBuZXZlciByZWFkLiBEcm9wcGVkIGJ5IHZlcnNpb24gMS4gKi9cbiAgcmVhZG9ubHkgY29udGludWF0aW9uU3RhZ2VJZD86IHN0cmluZztcbiAgLyoqIFZlcnNpb25zIDDigJMxOiB0aGUgcnVuJ3MgZXhlY3V0aW9uIHRyZWUgYXQgdGhlIHBhdXNlIOKAlCBuZXZlciByZWFkIGJ5IGEgcmVzdW1lLiBEcm9wcGVkIGJ5IHZlcnNpb24gMi4gKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uVHJlZT86IHVua25vd247XG4gIC8qKiBWZXJzaW9ucyAw4oCTMTogdGhlIHN1YmZsb3dzIGZpbmlzaGVkIGJlZm9yZSB0aGUgcGF1c2Ug4oCUIG5ldmVyIHJlYWQgYnkgYSByZXN1bWUuIERyb3BwZWQgYnkgdmVyc2lvbiAyLiAqL1xuICByZWFkb25seSBzdWJmbG93UmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogVGhlIG9uZSBtZXNzYWdlIHNoYXBlOiBgSW52YWxpZCBjaGVja3BvaW50OiA8d2hlcmU+IDx3aGF0Pi5gICovXG5mdW5jdGlvbiByZWZ1c2Uod2hhdDogc3RyaW5nKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hlY2twb2ludDogJHt3aGF0fS5gKTtcbn1cblxuZnVuY3Rpb24gaXNQbGFpblJlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vKipcbiAqIEJyaW5nIGEgc3RvcmVkIGNoZWNrcG9pbnQgb2YgQU5ZIHJlbGVhc2UgdG8gdGhlIGN1cnJlbnQgc2hhcGUg4oCUIHRoZSBvbmVcbiAqIHVwY2FzdGVyLiBWZXJzaW9ucyAwIChubyBgY2hlY2twb2ludFZlcnNpb25gKSBhbmQgMTogZHJvcCB0aGUgZmllbGRzIHRoZWlyXG4gKiBzdWNjZXNzb3JzIGRyb3BwZWQgKHtAbGluayBMZWdhY3lDaGVja3BvaW50RmllbGRzfSksIHN0YW1wIHRoZSBjdXJyZW50XG4gKiB2ZXJzaW9uIGFzIHRoZSBmaXJzdCBrZXkuIFRoZSBjdXJyZW50IHZlcnNpb246IGFzIGlzLCBtaW51cyBhbnkgZHJvcHBlZFxuICogZmllbGQgaXQgY2xhaW1zIHRvIGNhcnJ5LiBBbnl0aGluZyBlbHNlOiByZWZ1c2VkLiBSZXR1cm5zIGEgbmV3IG9iamVjdDsgdGhlXG4gKiBjYWxsZXIncyBpcyBuZXZlciBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGNhc3RDaGVja3BvaW50KHN0b3JlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHZlcnNpb24gPSBzdG9yZWQuY2hlY2twb2ludFZlcnNpb247XG4gIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgIVJFQURBQkxFX1ZFUlNJT05TLmluY2x1ZGVzKHZlcnNpb24pKSB7XG4gICAgcmVmdXNlKFxuICAgICAgYGNoZWNrcG9pbnRWZXJzaW9uICR7SlNPTi5zdHJpbmdpZnkodmVyc2lvbikgPz8gU3RyaW5nKHZlcnNpb24pfSBpcyBub3Qgb25lIHRoaXMgcmVsZWFzZSByZWFkcyBgICtcbiAgICAgICAgYCgke1JFQURBQkxFX1ZFUlNJT05TLmpvaW4oJyBvciAnKX0sIG9yIG5vbmUgZm9yIGEgY2hlY2twb2ludCB3cml0dGVuIGJlZm9yZSA5LjM5LjApYCxcbiAgICApO1xuICB9XG4gIC8vIEEgZHJvcHBlZCBmaWVsZCBuZXZlciBzdXJ2aXZlcywgd2hhdGV2ZXIgdmVyc2lvbiBjbGFpbXMgdG8gY2FycnkgaXQuXG4gIGNvbnN0IHtcbiAgICBjaGVja3BvaW50VmVyc2lvbjogX3ZlcnNpb24sXG4gICAgY29udGludWF0aW9uU3RhZ2VJZDogX2ludm9rZXJOZXh0LFxuICAgIGV4ZWN1dGlvblRyZWU6IF90cmVlLFxuICAgIHN1YmZsb3dSZXN1bHRzOiBfZmluaXNoZWRTdWJmbG93cyxcbiAgICAuLi5jdXJyZW50XG4gIH0gPSBzdG9yZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiBMZWdhY3lDaGVja3BvaW50RmllbGRzO1xuICByZXR1cm4geyBjaGVja3BvaW50VmVyc2lvbjogQ0hFQ0tQT0lOVF9WRVJTSU9OLCAuLi5jdXJyZW50IH07XG59XG5cbi8qKlxuICogQ2hlY2sgT05FIHBhdXNlIHJlY29yZCDigJQgdGhlIHBhdXNlZCBzdGFnZSdzIG93biBmaWVsZHMgb24gdGhlIGNoZWNrcG9pbnQsXG4gKiBvciBhIHdhaXRpbmcgc2libGluZydzIGBwZW5kaW5nUGF1c2VzW25dYCDigJQgYW5kIHJldHVybiBpdCBhcyBhXG4gKiB7QGxpbmsgUGVuZGluZ1BhdXNlfS4gYGF0YCBuYW1lcyB3aGVyZSB0aGUgcmVjb3JkIHNpdHMgKGAnJ2AgZm9yIHRoZVxuICogY2hlY2twb2ludCBpdHNlbGYsIGAncGVuZGluZ1BhdXNlc1swXSdgIGZvciBhIHNpYmxpbmcpLCBzbyBib3RoIHNpdGVzIHNwZWFrXG4gKiB0aGUgc2FtZSBzZW50ZW5jZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQYXVzZVJlY29yZChyYXc6IHVua25vd24sIGF0ID0gJycpOiBQZW5kaW5nUGF1c2Uge1xuICBjb25zdCBmaWVsZCA9IChuYW1lOiBzdHJpbmcpID0+IChhdCA/IGAke2F0fS4ke25hbWV9YCA6IG5hbWUpO1xuICBpZiAoIWlzUGxhaW5SZWNvcmQocmF3KSkgcmVmdXNlKGAke2F0IHx8ICd0aGUgY2hlY2twb2ludCd9IG11c3QgYmUgYW4gb2JqZWN0YCk7XG4gIGlmICh0eXBlb2YgcmF3LnBhdXNlZFN0YWdlSWQgIT09ICdzdHJpbmcnIHx8IHJhdy5wYXVzZWRTdGFnZUlkID09PSAnJykge1xuICAgIHJlZnVzZShgJHtmaWVsZCgncGF1c2VkU3RhZ2VJZCcpfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ2ApO1xuICB9XG4gIGNvbnN0IHN1YmZsb3dQYXRoID0gcmF3LnN1YmZsb3dQYXRoO1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3ViZmxvd1BhdGgpIHx8ICFzdWJmbG93UGF0aC5ldmVyeSgocykgPT4gdHlwZW9mIHMgPT09ICdzdHJpbmcnKSkge1xuICAgIHJlZnVzZShgJHtmaWVsZCgnc3ViZmxvd1BhdGgnKX0gbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzYCk7XG4gIH1cbiAgY29uc3Qgc3RhdGVzID0gcmF3LnN1YmZsb3dTdGF0ZXM7XG4gIGlmIChzdGF0ZXMgIT09IHVuZGVmaW5lZCAmJiAhaXNQbGFpblJlY29yZChzdGF0ZXMpKSByZWZ1c2UoYCR7ZmllbGQoJ3N1YmZsb3dTdGF0ZXMnKX0gbXVzdCBiZSBhbiBvYmplY3RgKTtcbiAgLy8gRWFjaCBjYXB0dXJlIHNlZWRzIGEgc3ViZmxvdydzIHJ1bnRpbWUg4oCUIGEgcGxhaW4gb2JqZWN0LCBsaWtlIGBzaGFyZWRTdGF0ZWAuXG4gIGZvciAoY29uc3QgW3N1YmZsb3dJZCwgY2FwdHVyZV0gb2YgT2JqZWN0LmVudHJpZXMoc3RhdGVzID8/IHt9KSkge1xuICAgIGlmICghaXNQbGFpblJlY29yZChjYXB0dXJlKSkgcmVmdXNlKGAke2ZpZWxkKCdzdWJmbG93U3RhdGVzJyl9WyR7SlNPTi5zdHJpbmdpZnkoc3ViZmxvd0lkKX1dIG11c3QgYmUgYW4gb2JqZWN0YCk7XG4gIH1cbiAgaWYgKHJhdy5wYXVzZWRCeSAhPT0gdW5kZWZpbmVkICYmIHJhdy5wYXVzZWRCeSAhPT0gJ2ludGVycnVwdCcpIHtcbiAgICByZWZ1c2UoYCR7ZmllbGQoJ3BhdXNlZEJ5Jyl9IG11c3QgYmUgJ2ludGVycnVwdCcgd2hlbiBwcmVzZW50YCk7XG4gIH1cbiAgLy8gQSBrZXkgdGhlIHJlc3VtZSB3aWxsIFNFTkQgKFAzKTogaGVsZCB0byB0aGUgb25lIGtleSBydWxlLCByZWZ1c2VkIOKAlCBuZXZlciBkcm9wcGVkIChkcm9wcGluZyB3b3VsZCBsZXQgdGhlXG4gIC8vIHJlc3VtZSByZWNvbXB1dGUgYSBkaWZmZXJlbnQga2V5KS5cbiAgaWYgKHJhdy5pZGVtcG90ZW5jeUtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcHJvYmxlbSA9IGlkZW1wb3RlbmN5S2V5UHJvYmxlbShyYXcuaWRlbXBvdGVuY3lLZXkpO1xuICAgIGlmIChwcm9ibGVtICE9PSB1bmRlZmluZWQpIHJlZnVzZShgJHtmaWVsZCgnaWRlbXBvdGVuY3lLZXknKX0gJHtwcm9ibGVtfWApO1xuICB9XG4gIHJldHVybiB7XG4gICAgcGF1c2VkU3RhZ2VJZDogcmF3LnBhdXNlZFN0YWdlSWQgYXMgc3RyaW5nLFxuICAgIHN1YmZsb3dQYXRoOiBzdWJmbG93UGF0aCBhcyBzdHJpbmdbXSxcbiAgICBzdWJmbG93U3RhdGVzOiAoc3RhdGVzIGFzIFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB8IHVuZGVmaW5lZCkgPz8ge30sXG4gICAgLi4uKHJhdy5wYXVzZURhdGEgIT09IHVuZGVmaW5lZCAmJiB7IHBhdXNlRGF0YTogcmF3LnBhdXNlRGF0YSB9KSxcbiAgICAuLi4ocmF3LnBhdXNlZEJ5ID09PSAnaW50ZXJydXB0JyAmJiB7IHBhdXNlZEJ5OiAnaW50ZXJydXB0JyBhcyBjb25zdCB9KSxcbiAgICAvLyBBIHJlY29yZCwgbmV2ZXIgYSBwbGFuIGlucHV0OiBrZXB0IG9ubHkgd2hlbiB3ZWxsLWZvcm1lZCAoYW4gb2xkZXIgb3JcbiAgICAvLyBoYW5kLWVkaXRlZCBlbnRyeSBzaW1wbHkgcmVzdW1lcyB3aXRob3V0IGEgbGluaykuXG4gICAgLi4uKGlzUGF1c2VkRXhlY3V0aW9uKHJhdy5wYXVzZWRFeGVjdXRpb24pICYmIHtcbiAgICAgIHBhdXNlZEV4ZWN1dGlvbjogeyBydW5JZDogcmF3LnBhdXNlZEV4ZWN1dGlvbi5ydW5JZCwgcnVudGltZVN0YWdlSWQ6IHJhdy5wYXVzZWRFeGVjdXRpb24ucnVudGltZVN0YWdlSWQgfSxcbiAgICB9KSxcbiAgICAuLi4ocmF3LmlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQgJiYgeyBpZGVtcG90ZW5jeUtleTogcmF3LmlkZW1wb3RlbmN5S2V5IGFzIHN0cmluZyB9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUSEUgY2hlY2twb2ludCBkZWNvZGVyOiB1cGNhc3QsIHRoZW4gY2hlY2sg4oCUIHRoZSBjaGVja3BvaW50IGlzIGFuIG9iamVjdCxcbiAqIGl0cyBgc2hhcmVkU3RhdGVgIGEgcGxhaW4gb2JqZWN0LCBpdHMgb3duIHBhdXNlIHJlY29yZCB3ZWxsLWZvcm1lZCwgYW5kXG4gKiBldmVyeSBgcGVuZGluZ1BhdXNlc2AgZW50cnkgd2VsbC1mb3JtZWQgKGVhY2ggcmV0dXJuZWQgZGVjb2RlZCkuIFRocm93c1xuICogYEludmFsaWQgY2hlY2twb2ludDog4oCmYCBuYW1pbmcgdGhlIGZpcnN0IGZpZWxkIHRoYXQgaXMgbm90OyBuZXZlciBlZGl0c1xuICogdGhlIGNhbGxlcidzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUNoZWNrcG9pbnQoc3RvcmVkOiB1bmtub3duKTogRmxvd2NoYXJ0Q2hlY2twb2ludCB7XG4gIGlmICghaXNQbGFpblJlY29yZChzdG9yZWQpKSByZWZ1c2UoJ3RoZSBjaGVja3BvaW50IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIGNvbnN0IGNoZWNrcG9pbnQgPSB1cGNhc3RDaGVja3BvaW50KHN0b3JlZCk7XG4gIGlmICghaXNQbGFpblJlY29yZChjaGVja3BvaW50LnNoYXJlZFN0YXRlKSkgcmVmdXNlKCdzaGFyZWRTdGF0ZSBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0Jyk7XG4gIGRlY29kZVBhdXNlUmVjb3JkKGNoZWNrcG9pbnQpO1xuICAvLyBBIHJlY29yZCwgbmV2ZXIgYSBwbGFuIGlucHV0IOKAlCB0aGUgU0FNRSBydWxlIGFzIGEgc2libGluZydzOiBhIG1hbGZvcm1lZFxuICAvLyBsaW5rIGlzIGRyb3BwZWQgKHRoZSByZXN1bWUgcnVucyB3aXRob3V0IGl0KSwgbmV2ZXIgdHJ1c3RlZC5cbiAgaWYgKGNoZWNrcG9pbnQucGF1c2VkRXhlY3V0aW9uICE9PSB1bmRlZmluZWQgJiYgIWlzUGF1c2VkRXhlY3V0aW9uKGNoZWNrcG9pbnQucGF1c2VkRXhlY3V0aW9uKSkge1xuICAgIGRlbGV0ZSBjaGVja3BvaW50LnBhdXNlZEV4ZWN1dGlvbjtcbiAgfVxuICAvLyBUaGUgY291bnRlcnMgc2VlZCB0aGUgcmVzdW1lZCBydW4ncyBpZHMgYW5kIGxvb3AgYnVkZ2V0OiBhYnNlbnQgaXMgYW4gb2xkXG4gIC8vIGNoZWNrcG9pbnQgKHRoZSBjb3VudGVyIHJlc3RhcnRzKSwgcHJlc2VudCBtdXN0IGJlIHdlbGwtZm9ybWVkLlxuICBpZiAoY2hlY2twb2ludC5leGVjdXRpb25Db3VudCAhPT0gdW5kZWZpbmVkICYmICFpc0NvdW50KGNoZWNrcG9pbnQuZXhlY3V0aW9uQ291bnQpKSB7XG4gICAgcmVmdXNlKCdleGVjdXRpb25Db3VudCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgfVxuICBjb25zdCB2aXNpdHMgPSBjaGVja3BvaW50LnZpc2l0Q291bnRzO1xuICBpZiAodmlzaXRzICE9PSB1bmRlZmluZWQgJiYgKCFpc1BsYWluUmVjb3JkKHZpc2l0cykgfHwgIU9iamVjdC52YWx1ZXModmlzaXRzKS5ldmVyeShpc0NvdW50KSkpIHtcbiAgICByZWZ1c2UoJ3Zpc2l0Q291bnRzIG11c3QgbWFwIHN0YWdlIGlkcyB0byBub24tbmVnYXRpdmUgaW50ZWdlcnMnKTtcbiAgfVxuICBpZiAoY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzICE9PSB1bmRlZmluZWQpIGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlcyA9IGRlY29kZVBlbmRpbmdQYXVzZXMoY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzKTtcbiAgLy8gVGhlIHJlZGFjdGlvbiBhIHBhdXNlIGNhcnJpZXMgKG5hbWVzIG9ubHkpIHNlZWRzIHRoZSByZXN1bWVkIHJ1bidzIHJ1bGUg4oCUIGEgbWFsZm9ybWVkIG9uZVxuICAvLyBpcyByZWZ1c2VkLCBuZXZlciBkcm9wcGVkOiBkcm9wcGluZyBpdCB3b3VsZCBzZXJ2ZSBpbiBwbGFpbiB3aGF0IHRoZSBydW4gaGFkIG1hc2tlZC5cbiAgaWYgKGNoZWNrcG9pbnQucmVkYWN0aW9uTWFya3MgIT09IHVuZGVmaW5lZCkgZGVjb2RlUmVkYWN0aW9uTWFya3MoY2hlY2twb2ludC5yZWRhY3Rpb25NYXJrcyk7XG4gIHJldHVybiBjaGVja3BvaW50IGFzIHVua25vd24gYXMgRmxvd2NoYXJ0Q2hlY2twb2ludDtcbn1cblxuLyoqIGByZWRhY3Rpb25NYXJrc2A6IGBrZXlzYCBhbiBhcnJheSBvZiBzdHJpbmdzOyBgZmllbGRzYCwgd2hlbiBwcmVzZW50LCBrZXlzIOKGkiBhcnJheXMgb2Ygc3RyaW5ncy4gKi9cbmZ1bmN0aW9uIGRlY29kZVJlZGFjdGlvbk1hcmtzKG1hcmtzOiB1bmtub3duKTogdm9pZCB7XG4gIGlmICghaXNQbGFpblJlY29yZChtYXJrcykpIHJlZnVzZSgncmVkYWN0aW9uTWFya3MgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgaWYgKCFpc1N0cmluZ3MobWFya3Mua2V5cykpIHJlZnVzZSgncmVkYWN0aW9uTWFya3Mua2V5cyBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgY29uc3QgZmllbGRzID0gbWFya3MuZmllbGRzO1xuICBpZiAoZmllbGRzICE9PSB1bmRlZmluZWQgJiYgKCFpc1BsYWluUmVjb3JkKGZpZWxkcykgfHwgIU9iamVjdC52YWx1ZXMoZmllbGRzKS5ldmVyeShpc1N0cmluZ3MpKSkge1xuICAgIHJlZnVzZSgncmVkYWN0aW9uTWFya3MuZmllbGRzIG11c3QgbWFwIGtleXMgdG8gYXJyYXlzIG9mIHN0cmluZ3MnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1N0cmluZ3ModmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG4vKipcbiAqIGBwZW5kaW5nUGF1c2VzYCAoc3RvcmVkLCB1bnRydXN0ZWQpIGFzIGRlY29kZWQgcmVjb3JkcyDigJQgdGhlIG9uZSBjaGVja1xuICogYGRlY29kZUNoZWNrcG9pbnRgIHJ1bnMsIGFuZCB0aGUgb25lIGBSZXN1bWVFbnRyeS5wbGFuYCBydW5zIG9uIHdoYXQgaXQgaXNcbiAqIGhhbmRlZCBkaXJlY3RseSwgc28gbmVpdGhlciBkb29yIHRha2VzIGFuIHVuY2hlY2tlZCBzaWJsaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUGVuZGluZ1BhdXNlcyhwZW5kaW5nOiB1bmtub3duKTogUGVuZGluZ1BhdXNlW10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocGVuZGluZykpIHJlZnVzZSgncGVuZGluZ1BhdXNlcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gIHJldHVybiBwZW5kaW5nLm1hcCgocmF3OiB1bmtub3duLCBuKSA9PiBkZWNvZGVQYXVzZVJlY29yZChyYXcsIGBwZW5kaW5nUGF1c2VzWyR7bn1dYCkpO1xufVxuXG5mdW5jdGlvbiBpc0NvdW50KHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIHZhbHVlID49IDA7XG59XG4iXX0=
184
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9wYXVzZS9yZWNvcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRS9DLDJGQUEyRjtBQUMzRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFVLENBQUM7QUFFN0MscUdBQXFHO0FBQ3JHLE1BQU0saUJBQWlCLEdBQXVCLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFldEUsbUVBQW1FO0FBQ25FLFNBQVMsTUFBTSxDQUFDLElBQVk7SUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUErQjtJQUM5RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDekMsSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbEUsTUFBTSxDQUNKLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0s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KlxuICogcGF1c2UvcmVjb3JkLnRzIOKAlCB0aGUgY2hlY2twb2ludCBDT0RFQyAoRjgsIDkuMzkuMCk6IG9uZSB2ZXJzaW9uLCBvbmVcbiAqIHVwY2FzdGVyLCBvbmUgdmFsaWRhdG9yLCBvbmUgbWVzc2FnZSBzZXQuXG4gKlxuICogQSBjaGVja3BvaW50IGlzIHN0b3JlZCBkYXRhIOKAlCBSZWRpcywgUG9zdGdyZXMsIGEgZmlsZSDigJQgYW5kIGNvbWVzIGJhY2sgdG9cbiAqIGByZXN1bWUoKWAgZnJvbSB3aGljaGV2ZXIgcmVsZWFzZSB3cm90ZSBpdC4gVW50aWwgOS4zOC4wIGl0IHdhcyBjaGVja2VkIGluXG4gKiBUV08gcGxhY2VzIHdpdGggdHdvIG1lc3NhZ2Ugc2V0czogYEZsb3dDaGFydEV4ZWN1dG9yIMK3IHJlc3VtZWAgY2hlY2tlZCB0aGVcbiAqIHBhdXNlZCByZWNvcmQncyBmaWVsZHMsIGBSZXN1bWVFbnRyeWAgY2hlY2tlZCBlYWNoIHdhaXRpbmcgc2libGluZydzXG4gKiAoYHBlbmRpbmdQYXVzZXNbbl1gKSDigJQgdGhlIFNBTUUgcmVjb3JkIHNoYXBlLCBjaGVja2VkIHR3aWNlLCBkaWZmZXJlbnRseVxuICogKHRoZSB0b3AtbGV2ZWwgYHBhdXNlZEJ5YCBhbmQgYHN1YmZsb3dTdGF0ZXNgIHdlcmUgbmV2ZXIgY2hlY2tlZCBhdCBhbGwpLlxuICogQm90aCBub3cgY2FsbCB7QGxpbmsgZGVjb2RlQ2hlY2twb2ludH07IGV2ZXJ5IHJlY29yZCBpcyBjaGVja2VkIGJ5XG4gKiB7QGxpbmsgZGVjb2RlUGF1c2VSZWNvcmR9LlxuICpcbiAqIFZFUlNJT05JTkcuIEEgY2hlY2twb2ludCB3cml0dGVuIGJ5IHRoaXMgcmVsZWFzZSBjYXJyaWVzXG4gKiBgY2hlY2twb2ludFZlcnNpb246IDJgLiBFdmVyeSBvbGRlciBvbmUgaXMgcmVhZCBieSB0aGUgT05FIHVwY2FzdGVyLFxuICoge0BsaW5rIHVwY2FzdENoZWNrcG9pbnR9LCBhbmQgZXZlcnkgc3RlcCBzbyBmYXIgb25seSBEUk9QUyBmaWVsZHMg4oCUIHdoYXQgYVxuICogbGF0ZXIgZm9ybWF0IGFkZGVkIGlzIG9wdGlvbmFsIGFuZCByZWFkIGFzIGFic2VudDpcbiAqXG4gKiAgIC0gdmVyc2lvbiAwIChubyBgY2hlY2twb2ludFZlcnNpb25gLCBiZWZvcmUgOS4zOS4wKSDihpIgMTogZHJvcFxuICogICAgIGBjb250aW51YXRpb25TdGFnZUlkYCwgYSByZWNvcmQgbm8gcmVzdW1lIGhhcyByZWFkIHNpbmNlIDkuMjguMCAod2hhdFxuICogICAgIHJ1bnMgYWZ0ZXIgYSByZXN1bWUgY29tZXMgZnJvbSB0aGUgY2hhcnQpO1xuICogICAtIHZlcnNpb24gMSAoOS4zOS4w4oCTOS40My54KSDihpIgMiAodGhlIExFQU4gY2hlY2twb2ludCk6IGRyb3BcbiAqICAgICBgZXhlY3V0aW9uVHJlZWAgYW5kIGBzdWJmbG93UmVzdWx0c2Ag4oCUIHRoZSBydW4ncyBzZXJ2ZWQgcmVjb3JkICh0aGVcbiAqICAgICB3aG9sZSBleGVjdXRpb24gdHJlZSwgdGhlIGZpbmlzaGVkIHN1YmZsb3dzJyByZXN1bHRzKSwgd2hpY2ggbm8gcmVzdW1lXG4gKiAgICAgZXZlciByZWFkIGFuZCB3aGljaCBncmV3IHdpdGggZXZlcnkgZmluaXNoZWQgaXRlcmF0aW9uXG4gKiAgICAgKGBydW5uZXIvY2hlY2twb2ludC50c2ApLlxuICpcbiAqIEEgZHJvcHBlZCBmaWVsZCBuZXZlciBzdXJ2aXZlcywgd2hhdGV2ZXIgdmVyc2lvbiBjbGFpbXMgdG8gY2FycnkgaXQuIEFcbiAqIHZlcnNpb24gdGhpcyByZWxlYXNlIGRvZXMgbm90IGtub3cgaXMgcmVmdXNlZCwgbmV2ZXIgZ3Vlc3NlZCBhdC5cbiAqXG4gKiBCb3Jyb3dlZDogTGFuZ0dyYXBoJ3MgY2hlY2twb2ludCBgdmAgZmllbGQ7IGlvLXRzJ3MgZGVjb2RlLWF0LXRoZS1ib3VuZGFyeVxuICogKG9uZSBkZWNvZGVyIHR1cm5zIGB1bmtub3duYCBpbnRvIHRoZSB0eXBlLCBvciByZWZ1c2VzIHdpdGggYSBwYXRoKS5cbiAqL1xuXG5pbXBvcnQgeyByZWFkQ2hlY2twb2ludENhcHR1cmUsIHdpdGhvdXRDaGVja3BvaW50Q2FwdHVyZSB9IGZyb20gJy4uL2NhcHR1cmUvY2hlY2twb2ludENhcHR1cmUuanMnO1xuaW1wb3J0IHsgaWRlbXBvdGVuY3lLZXlQcm9ibGVtIH0gZnJvbSAnLi4vaWRzL2lkZW1wb3RlbmN5S2V5LmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd2NoYXJ0Q2hlY2twb2ludCwgUGVuZGluZ1BhdXNlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlZEV4ZWN1dGlvbiB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogVGhlIGNoZWNrcG9pbnQgZm9ybWF0IHRoaXMgcmVsZWFzZSB3cml0ZXMgKGBGbG93Y2hhcnRDaGVja3BvaW50LmNoZWNrcG9pbnRWZXJzaW9uYCkuICovXG5leHBvcnQgY29uc3QgQ0hFQ0tQT0lOVF9WRVJTSU9OID0gMiBhcyBjb25zdDtcblxuLyoqIFRoZSBmb3JtYXRzIHRoaXMgcmVsZWFzZSByZWFkczogdGhlIGN1cnJlbnQgb25lIGFuZCBldmVyeSBvbmUgaXQgdXBjYXN0cyAoYWJzZW50ID0gdmVyc2lvbiAwKS4gKi9cbmNvbnN0IFJFQURBQkxFX1ZFUlNJT05TOiByZWFkb25seSB1bmtub3duW10gPSBbMSwgQ0hFQ0tQT0lOVF9WRVJTSU9OXTtcblxuLyoqXG4gKiBGaWVsZHMgb25seSBhbiBPTERFUiBjaGVja3BvaW50IGNhbiBjYXJyeSwgZWFjaCBkcm9wcGVkIGJ5IHRoZSBmb3JtYXQgbmFtZWRcbiAqIGJlc2lkZSBpdC4gVGhlIHVwY2FzdGVyIHJlbW92ZXMgdGhlbSBhbmQgdGhlIGN1cnJlbnQgc2hhcGUgbmV2ZXIgaGFzIHRoZW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGVnYWN5Q2hlY2twb2ludEZpZWxkcyB7XG4gIC8qKiBWZXJzaW9uIDAgb25seTogdGhlIGludm9rZXIncyBgLm5leHRgIGlkIOKAlCBhIHJlY29yZCBzaW5jZSA5LjI4LjAsIG5ldmVyIHJlYWQuIERyb3BwZWQgYnkgdmVyc2lvbiAxLiAqL1xuICByZWFkb25seSBjb250aW51YXRpb25TdGFnZUlkPzogc3RyaW5nO1xuICAvKiogVmVyc2lvbnMgMOKAkzE6IHRoZSBydW4ncyBleGVjdXRpb24gdHJlZSBhdCB0aGUgcGF1c2Ug4oCUIG5ldmVyIHJlYWQgYnkgYSByZXN1bWUuIERyb3BwZWQgYnkgdmVyc2lvbiAyLiAqL1xuICByZWFkb25seSBleGVjdXRpb25UcmVlPzogdW5rbm93bjtcbiAgLyoqIFZlcnNpb25zIDDigJMxOiB0aGUgc3ViZmxvd3MgZmluaXNoZWQgYmVmb3JlIHRoZSBwYXVzZSDigJQgbmV2ZXIgcmVhZCBieSBhIHJlc3VtZS4gRHJvcHBlZCBieSB2ZXJzaW9uIDIuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dSZXN1bHRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKiBUaGUgb25lIG1lc3NhZ2Ugc2hhcGU6IGBJbnZhbGlkIGNoZWNrcG9pbnQ6IDx3aGVyZT4gPHdoYXQ+LmAgKi9cbmZ1bmN0aW9uIHJlZnVzZSh3aGF0OiBzdHJpbmcpOiBuZXZlciB7XG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGVja3BvaW50OiAke3doYXR9LmApO1xufVxuXG5mdW5jdGlvbiBpc1BsYWluUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbi8qKlxuICogQnJpbmcgYSBzdG9yZWQgY2hlY2twb2ludCBvZiBBTlkgcmVsZWFzZSB0byB0aGUgY3VycmVudCBzaGFwZSDigJQgdGhlIG9uZVxuICogdXBjYXN0ZXIuIFZlcnNpb25zIDAgKG5vIGBjaGVja3BvaW50VmVyc2lvbmApIGFuZCAxOiBkcm9wIHRoZSBmaWVsZHMgdGhlaXJcbiAqIHN1Y2Nlc3NvcnMgZHJvcHBlZCAoe0BsaW5rIExlZ2FjeUNoZWNrcG9pbnRGaWVsZHN9KSwgc3RhbXAgdGhlIGN1cnJlbnRcbiAqIHZlcnNpb24gYXMgdGhlIGZpcnN0IGtleS4gVGhlIGN1cnJlbnQgdmVyc2lvbjogYXMgaXMsIG1pbnVzIGFueSBkcm9wcGVkXG4gKiBmaWVsZCBpdCBjbGFpbXMgdG8gY2FycnkuIEFueXRoaW5nIGVsc2U6IHJlZnVzZWQuIFJldHVybnMgYSBuZXcgb2JqZWN0OyB0aGVcbiAqIGNhbGxlcidzIGlzIG5ldmVyIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwY2FzdENoZWNrcG9pbnQoc3RvcmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgdmVyc2lvbiA9IHN0b3JlZC5jaGVja3BvaW50VmVyc2lvbjtcbiAgaWYgKHZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAhUkVBREFCTEVfVkVSU0lPTlMuaW5jbHVkZXModmVyc2lvbikpIHtcbiAgICByZWZ1c2UoXG4gICAgICBgY2hlY2twb2ludFZlcnNpb24gJHtKU09OLnN0cmluZ2lmeSh2ZXJzaW9uKSA/PyBTdHJpbmcodmVyc2lvbil9IGlzIG5vdCBvbmUgdGhpcyByZWxlYXNlIHJlYWRzIGAgK1xuICAgICAgICBgKCR7UkVBREFCTEVfVkVSU0lPTlMuam9pbignIG9yICcpfSwgb3Igbm9uZSBmb3IgYSBjaGVja3BvaW50IHdyaXR0ZW4gYmVmb3JlIDkuMzkuMClgLFxuICAgICk7XG4gIH1cbiAgLy8gQSBkcm9wcGVkIGZpZWxkIG5ldmVyIHN1cnZpdmVzLCB3aGF0ZXZlciB2ZXJzaW9uIGNsYWltcyB0byBjYXJyeSBpdC5cbiAgY29uc3Qge1xuICAgIGNoZWNrcG9pbnRWZXJzaW9uOiBfdmVyc2lvbixcbiAgICBjb250aW51YXRpb25TdGFnZUlkOiBfaW52b2tlck5leHQsXG4gICAgZXhlY3V0aW9uVHJlZTogX3RyZWUsXG4gICAgc3ViZmxvd1Jlc3VsdHM6IF9maW5pc2hlZFN1YmZsb3dzLFxuICAgIC4uLmN1cnJlbnRcbiAgfSA9IHN0b3JlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIExlZ2FjeUNoZWNrcG9pbnRGaWVsZHM7XG4gIHJldHVybiB7IGNoZWNrcG9pbnRWZXJzaW9uOiBDSEVDS1BPSU5UX1ZFUlNJT04sIC4uLmN1cnJlbnQgfTtcbn1cblxuLyoqXG4gKiBDaGVjayBPTkUgcGF1c2UgcmVjb3JkIOKAlCB0aGUgcGF1c2VkIHN0YWdlJ3Mgb3duIGZpZWxkcyBvbiB0aGUgY2hlY2twb2ludCxcbiAqIG9yIGEgd2FpdGluZyBzaWJsaW5nJ3MgYHBlbmRpbmdQYXVzZXNbbl1gIOKAlCBhbmQgcmV0dXJuIGl0IGFzIGFcbiAqIHtAbGluayBQZW5kaW5nUGF1c2V9LiBgYXRgIG5hbWVzIHdoZXJlIHRoZSByZWNvcmQgc2l0cyAoYCcnYCBmb3IgdGhlXG4gKiBjaGVja3BvaW50IGl0c2VsZiwgYCdwZW5kaW5nUGF1c2VzWzBdJ2AgZm9yIGEgc2libGluZyksIHNvIGJvdGggc2l0ZXMgc3BlYWtcbiAqIHRoZSBzYW1lIHNlbnRlbmNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVBhdXNlUmVjb3JkKHJhdzogdW5rbm93biwgYXQgPSAnJyk6IFBlbmRpbmdQYXVzZSB7XG4gIGNvbnN0IGZpZWxkID0gKG5hbWU6IHN0cmluZykgPT4gKGF0ID8gYCR7YXR9LiR7bmFtZX1gIDogbmFtZSk7XG4gIGlmICghaXNQbGFpblJlY29yZChyYXcpKSByZWZ1c2UoYCR7YXQgfHwgJ3RoZSBjaGVja3BvaW50J30gbXVzdCBiZSBhbiBvYmplY3RgKTtcbiAgaWYgKHR5cGVvZiByYXcucGF1c2VkU3RhZ2VJZCAhPT0gJ3N0cmluZycgfHwgcmF3LnBhdXNlZFN0YWdlSWQgPT09ICcnKSB7XG4gICAgcmVmdXNlKGAke2ZpZWxkKCdwYXVzZWRTdGFnZUlkJyl9IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nYCk7XG4gIH1cbiAgY29uc3Qgc3ViZmxvd1BhdGggPSByYXcuc3ViZmxvd1BhdGg7XG4gIGlmICghQXJyYXkuaXNBcnJheShzdWJmbG93UGF0aCkgfHwgIXN1YmZsb3dQYXRoLmV2ZXJ5KChzKSA9PiB0eXBlb2YgcyA9PT0gJ3N0cmluZycpKSB7XG4gICAgcmVmdXNlKGAke2ZpZWxkKCdzdWJmbG93UGF0aCcpfSBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3NgKTtcbiAgfVxuICBjb25zdCBzdGF0ZXMgPSByYXcuc3ViZmxvd1N0YXRlcztcbiAgaWYgKHN0YXRlcyAhPT0gdW5kZWZpbmVkICYmICFpc1BsYWluUmVjb3JkKHN0YXRlcykpIHJlZnVzZShgJHtmaWVsZCgnc3ViZmxvd1N0YXRlcycpfSBtdXN0IGJlIGFuIG9iamVjdGApO1xuICAvLyBFYWNoIGNhcHR1cmUgc2VlZHMgYSBzdWJmbG93J3MgcnVudGltZSDigJQgYSBwbGFpbiBvYmplY3QsIGxpa2UgYHNoYXJlZFN0YXRlYC5cbiAgZm9yIChjb25zdCBbc3ViZmxvd0lkLCBjYXB0dXJlXSBvZiBPYmplY3QuZW50cmllcyhzdGF0ZXMgPz8ge30pKSB7XG4gICAgaWYgKCFpc1BsYWluUmVjb3JkKGNhcHR1cmUpKSByZWZ1c2UoYCR7ZmllbGQoJ3N1YmZsb3dTdGF0ZXMnKX1bJHtKU09OLnN0cmluZ2lmeShzdWJmbG93SWQpfV0gbXVzdCBiZSBhbiBvYmplY3RgKTtcbiAgfVxuICBpZiAocmF3LnBhdXNlZEJ5ICE9PSB1bmRlZmluZWQgJiYgcmF3LnBhdXNlZEJ5ICE9PSAnaW50ZXJydXB0Jykge1xuICAgIHJlZnVzZShgJHtmaWVsZCgncGF1c2VkQnknKX0gbXVzdCBiZSAnaW50ZXJydXB0JyB3aGVuIHByZXNlbnRgKTtcbiAgfVxuICAvLyBBIGtleSB0aGUgcmVzdW1lIHdpbGwgU0VORCAoUDMpOiBoZWxkIHRvIHRoZSBvbmUga2V5IHJ1bGUsIHJlZnVzZWQg4oCUIG5ldmVyIGRyb3BwZWQgKGRyb3BwaW5nIHdvdWxkIGxldCB0aGVcbiAgLy8gcmVzdW1lIHJlY29tcHV0ZSBhIGRpZmZlcmVudCBrZXkpLlxuICBpZiAocmF3LmlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBwcm9ibGVtID0gaWRlbXBvdGVuY3lLZXlQcm9ibGVtKHJhdy5pZGVtcG90ZW5jeUtleSk7XG4gICAgaWYgKHByb2JsZW0gIT09IHVuZGVmaW5lZCkgcmVmdXNlKGAke2ZpZWxkKCdpZGVtcG90ZW5jeUtleScpfSAke3Byb2JsZW19YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwYXVzZWRTdGFnZUlkOiByYXcucGF1c2VkU3RhZ2VJZCBhcyBzdHJpbmcsXG4gICAgc3ViZmxvd1BhdGg6IHN1YmZsb3dQYXRoIGFzIHN0cmluZ1tdLFxuICAgIHN1YmZsb3dTdGF0ZXM6IChzdGF0ZXMgYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkKSA/PyB7fSxcbiAgICAuLi4ocmF3LnBhdXNlRGF0YSAhPT0gdW5kZWZpbmVkICYmIHsgcGF1c2VEYXRhOiByYXcucGF1c2VEYXRhIH0pLFxuICAgIC4uLihyYXcucGF1c2VkQnkgPT09ICdpbnRlcnJ1cHQnICYmIHsgcGF1c2VkQnk6ICdpbnRlcnJ1cHQnIGFzIGNvbnN0IH0pLFxuICAgIC8vIEEgcmVjb3JkLCBuZXZlciBhIHBsYW4gaW5wdXQ6IGtlcHQgb25seSB3aGVuIHdlbGwtZm9ybWVkIChhbiBvbGRlciBvclxuICAgIC8vIGhhbmQtZWRpdGVkIGVudHJ5IHNpbXBseSByZXN1bWVzIHdpdGhvdXQgYSBsaW5rKS5cbiAgICAuLi4oaXNQYXVzZWRFeGVjdXRpb24ocmF3LnBhdXNlZEV4ZWN1dGlvbikgJiYge1xuICAgICAgcGF1c2VkRXhlY3V0aW9uOiB7IHJ1bklkOiByYXcucGF1c2VkRXhlY3V0aW9uLnJ1bklkLCBydW50aW1lU3RhZ2VJZDogcmF3LnBhdXNlZEV4ZWN1dGlvbi5ydW50aW1lU3RhZ2VJZCB9LFxuICAgIH0pLFxuICAgIC4uLihyYXcuaWRlbXBvdGVuY3lLZXkgIT09IHVuZGVmaW5lZCAmJiB7IGlkZW1wb3RlbmN5S2V5OiByYXcuaWRlbXBvdGVuY3lLZXkgYXMgc3RyaW5nIH0pLFxuICB9O1xufVxuXG4vKipcbiAqIFRIRSBjaGVja3BvaW50IGRlY29kZXI6IHVwY2FzdCwgdGhlbiBjaGVjayDigJQgdGhlIGNoZWNrcG9pbnQgaXMgYW4gb2JqZWN0LFxuICogaXRzIGBzaGFyZWRTdGF0ZWAgYSBwbGFpbiBvYmplY3QsIGl0cyBvd24gcGF1c2UgcmVjb3JkIHdlbGwtZm9ybWVkLCBhbmRcbiAqIGV2ZXJ5IGBwZW5kaW5nUGF1c2VzYCBlbnRyeSB3ZWxsLWZvcm1lZCAoZWFjaCByZXR1cm5lZCBkZWNvZGVkKS4gVGhyb3dzXG4gKiBgSW52YWxpZCBjaGVja3BvaW50OiDigKZgIG5hbWluZyB0aGUgZmlyc3QgZmllbGQgdGhhdCBpcyBub3Q7IG5ldmVyIGVkaXRzXG4gKiB0aGUgY2FsbGVyJ3Mgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQ2hlY2twb2ludChzdG9yZWQ6IHVua25vd24pOiBGbG93Y2hhcnRDaGVja3BvaW50IHtcbiAgaWYgKCFpc1BsYWluUmVjb3JkKHN0b3JlZCkpIHJlZnVzZSgndGhlIGNoZWNrcG9pbnQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgY29uc3QgY2FwdHVyZSA9IHJlYWRDaGVja3BvaW50Q2FwdHVyZShzdG9yZWQpO1xuICBjb25zdCBjaGVja3BvaW50ID0gdXBjYXN0Q2hlY2twb2ludCh3aXRob3V0Q2hlY2twb2ludENhcHR1cmUoc3RvcmVkKSk7XG4gIGlmIChjYXB0dXJlKSBjaGVja3BvaW50LmNhcHR1cmUgPSBjYXB0dXJlO1xuICBlbHNlIGRlbGV0ZSBjaGVja3BvaW50LmNhcHR1cmU7XG4gIGlmICghaXNQbGFpblJlY29yZChjaGVja3BvaW50LnNoYXJlZFN0YXRlKSkgcmVmdXNlKCdzaGFyZWRTdGF0ZSBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0Jyk7XG4gIGRlY29kZVBhdXNlUmVjb3JkKGNoZWNrcG9pbnQpO1xuICAvLyBBIHJlY29yZCwgbmV2ZXIgYSBwbGFuIGlucHV0IOKAlCB0aGUgU0FNRSBydWxlIGFzIGEgc2libGluZydzOiBhIG1hbGZvcm1lZFxuICAvLyBsaW5rIGlzIGRyb3BwZWQgKHRoZSByZXN1bWUgcnVucyB3aXRob3V0IGl0KSwgbmV2ZXIgdHJ1c3RlZC5cbiAgaWYgKGNoZWNrcG9pbnQucGF1c2VkRXhlY3V0aW9uICE9PSB1bmRlZmluZWQgJiYgIWlzUGF1c2VkRXhlY3V0aW9uKGNoZWNrcG9pbnQucGF1c2VkRXhlY3V0aW9uKSkge1xuICAgIGRlbGV0ZSBjaGVja3BvaW50LnBhdXNlZEV4ZWN1dGlvbjtcbiAgfVxuICAvLyBUaGUgY291bnRlcnMgc2VlZCB0aGUgcmVzdW1lZCBydW4ncyBpZHMgYW5kIGxvb3AgYnVkZ2V0OiBhYnNlbnQgaXMgYW4gb2xkXG4gIC8vIGNoZWNrcG9pbnQgKHRoZSBjb3VudGVyIHJlc3RhcnRzKSwgcHJlc2VudCBtdXN0IGJlIHdlbGwtZm9ybWVkLlxuICBpZiAoY2hlY2twb2ludC5leGVjdXRpb25Db3VudCAhPT0gdW5kZWZpbmVkICYmICFpc0NvdW50KGNoZWNrcG9pbnQuZXhlY3V0aW9uQ291bnQpKSB7XG4gICAgcmVmdXNlKCdleGVjdXRpb25Db3VudCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgfVxuICBjb25zdCB2aXNpdHMgPSBjaGVja3BvaW50LnZpc2l0Q291bnRzO1xuICBpZiAodmlzaXRzICE9PSB1bmRlZmluZWQgJiYgKCFpc1BsYWluUmVjb3JkKHZpc2l0cykgfHwgIU9iamVjdC52YWx1ZXModmlzaXRzKS5ldmVyeShpc0NvdW50KSkpIHtcbiAgICByZWZ1c2UoJ3Zpc2l0Q291bnRzIG11c3QgbWFwIHN0YWdlIGlkcyB0byBub24tbmVnYXRpdmUgaW50ZWdlcnMnKTtcbiAgfVxuICBpZiAoY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzICE9PSB1bmRlZmluZWQpIGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlcyA9IGRlY29kZVBlbmRpbmdQYXVzZXMoY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzKTtcbiAgLy8gVGhlIHJlZGFjdGlvbiBhIHBhdXNlIGNhcnJpZXMgKG5hbWVzIG9ubHkpIHNlZWRzIHRoZSByZXN1bWVkIHJ1bidzIHJ1bGUg4oCUIGEgbWFsZm9ybWVkIG9uZVxuICAvLyBpcyByZWZ1c2VkLCBuZXZlciBkcm9wcGVkOiBkcm9wcGluZyBpdCB3b3VsZCBzZXJ2ZSBpbiBwbGFpbiB3aGF0IHRoZSBydW4gaGFkIG1hc2tlZC5cbiAgaWYgKGNoZWNrcG9pbnQucmVkYWN0aW9uTWFya3MgIT09IHVuZGVmaW5lZCkgZGVjb2RlUmVkYWN0aW9uTWFya3MoY2hlY2twb2ludC5yZWRhY3Rpb25NYXJrcyk7XG4gIHJldHVybiBjaGVja3BvaW50IGFzIHVua25vd24gYXMgRmxvd2NoYXJ0Q2hlY2twb2ludDtcbn1cblxuLyoqIGByZWRhY3Rpb25NYXJrc2A6IGBrZXlzYCBhbiBhcnJheSBvZiBzdHJpbmdzOyBgZmllbGRzYCwgd2hlbiBwcmVzZW50LCBrZXlzIOKGkiBhcnJheXMgb2Ygc3RyaW5ncy4gKi9cbmZ1bmN0aW9uIGRlY29kZVJlZGFjdGlvbk1hcmtzKG1hcmtzOiB1bmtub3duKTogdm9pZCB7XG4gIGlmICghaXNQbGFpblJlY29yZChtYXJrcykpIHJlZnVzZSgncmVkYWN0aW9uTWFya3MgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgaWYgKCFpc1N0cmluZ3MobWFya3Mua2V5cykpIHJlZnVzZSgncmVkYWN0aW9uTWFya3Mua2V5cyBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MnKTtcbiAgY29uc3QgZmllbGRzID0gbWFya3MuZmllbGRzO1xuICBpZiAoZmllbGRzICE9PSB1bmRlZmluZWQgJiYgKCFpc1BsYWluUmVjb3JkKGZpZWxkcykgfHwgIU9iamVjdC52YWx1ZXMoZmllbGRzKS5ldmVyeShpc1N0cmluZ3MpKSkge1xuICAgIHJlZnVzZSgncmVkYWN0aW9uTWFya3MuZmllbGRzIG11c3QgbWFwIGtleXMgdG8gYXJyYXlzIG9mIHN0cmluZ3MnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1N0cmluZ3ModmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG4vKipcbiAqIGBwZW5kaW5nUGF1c2VzYCAoc3RvcmVkLCB1bnRydXN0ZWQpIGFzIGRlY29kZWQgcmVjb3JkcyDigJQgdGhlIG9uZSBjaGVja1xuICogYGRlY29kZUNoZWNrcG9pbnRgIHJ1bnMsIGFuZCB0aGUgb25lIGBSZXN1bWVFbnRyeS5wbGFuYCBydW5zIG9uIHdoYXQgaXQgaXNcbiAqIGhhbmRlZCBkaXJlY3RseSwgc28gbmVpdGhlciBkb29yIHRha2VzIGFuIHVuY2hlY2tlZCBzaWJsaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlUGVuZGluZ1BhdXNlcyhwZW5kaW5nOiB1bmtub3duKTogUGVuZGluZ1BhdXNlW10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocGVuZGluZykpIHJlZnVzZSgncGVuZGluZ1BhdXNlcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gIHJldHVybiBwZW5kaW5nLm1hcCgocmF3OiB1bmtub3duLCBuKSA9PiBkZWNvZGVQYXVzZVJlY29yZChyYXcsIGBwZW5kaW5nUGF1c2VzWyR7bn1dYCkpO1xufVxuXG5mdW5jdGlvbiBpc0NvdW50KHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIHZhbHVlID49IDA7XG59XG4iXX0=
@@ -267,6 +267,8 @@ export interface PauseResult {
267
267
  * ```
268
268
  */
269
269
  export interface FlowchartCheckpoint {
270
+ /** Paused root-leg observation only. No history/recorder data or storage acknowledgement is included. */
271
+ readonly capture?: import('../capture/readSources.js').NativeCaptureObservation;
270
272
  /**
271
273
  * The checkpoint FORMAT: `2`, the lean checkpoint (`1` from 9.39.0; absent
272
274
  * before). `resume()` reads every older one through the one upcaster
@@ -260,4 +260,4 @@ export function isPauseSignal(error) {
260
260
  return false;
261
261
  }
262
262
  }
263
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3BhdXNlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQTRCSCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWM7SUFDOUMsTUFBTSxDQUFDLEdBQUcsS0FBeUUsQ0FBQztJQUNwRixPQUFPLENBQ0wsT0FBTyxDQUFDLEVBQUUsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxPQUFPLENBQUMsQ0FBQyxjQUFjLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxjQUFjLEtBQUssRUFBRSxDQUNsSCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsS0FBSztJQUNwQyx1REFBdUQ7SUFDOUMsU0FBUyxDQUFVO0lBQzVCLDRDQUE0QztJQUNuQyxPQUFPLENBQVM7SUFDekI7Ozs7Ozs7T0FPRztJQUNNLFFBQVEsQ0FBZTtJQUNoQyx5RUFBeUU7SUFDakUsWUFBWSxDQUFXO0lBRS9COzs7Ozs7Ozs7T0FTRztJQUNLLGVBQWUsQ0FBVTtJQUVqQzs7Ozs7Ozs7Ozs7T0FXRztJQUNLLGNBQWMsR0FBNEMsRUFBRSxDQUFDO0lBRXJFOzs7Ozs7O09BT0c7SUFDSyxjQUFjLEdBQTBCLEVBQUUsQ0FBQztJQUVuRDs7OztPQUlHO0lBQ0ssZ0JBQWdCLENBQThDO0lBRXRFLDRHQUE0RztJQUNwRyxlQUFlLENBQVU7SUFFakMsWUFBWSxJQUFhLEVBQUUsT0FBZSxFQUFFLFFBQXNCO1FBQ2hFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUks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QyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQYXVzZS9SZXN1bWUg4oCUIHNlcmlhbGl6YWJsZSBjaGVja3BvaW50IGZvciBsb25nLXJ1bm5pbmcgb3IgaHVtYW4taW4tdGhlLWxvb3AgZmxvd3MuXG4gKlxuICogQSBzdGFnZSBzaWduYWxzIHBhdXNlIGJ5IGNhbGxpbmcgYHNjb3BlLiRwYXVzZShkYXRhKWAgd2hpY2ggdGhyb3dzIGEgUGF1c2VTaWduYWwuXG4gKiBUaGUgc2lnbmFsIGJ1YmJsZXMgdXAgdGhyb3VnaCBTdWJmbG93RXhlY3V0b3Ig4oaSIEZsb3djaGFydFRyYXZlcnNlciDihpIgRmxvd0NoYXJ0RXhlY3V0b3IsXG4gKiBlYWNoIGxldmVsIGFkZGluZyBpdHMgc3ViZmxvdyBJRCB0byB0aGUgcGF0aC5cbiAqXG4gKiBUaGUgY2hlY2twb2ludCBjYXB0dXJlcyB3aGF0IGEgcmVzdW1lIHJlYWRzLCBhbmQgdGhlIHBhdXNlJ3Mgb3duIHJlY29yZCDigJRcbiAqIG5ldmVyIHRoZSBydW4ncyBoaXN0b3J5ICh0aGF0IGlzIGBnZXRTbmFwc2hvdCgpYCdzKTpcbiAqICAgLSBwYXVzZWRTdGFnZUlkICsgc3ViZmxvd1BhdGggKCsgcGF1c2VkQnkpOiB0aGUgY3Vyc29yXG4gKiAgIC0gc2hhcmVkU3RhdGUgKyBzdWJmbG93U3RhdGVzOiB0aGUgc3RhdGUgYXQgdGhlIHBhdXNlIOKAlCB0aGUgcm9vdCdzLCBhbmRcbiAqICAgICBlYWNoIHN1YmZsb3cncyBvbiB0aGUgcGF1c2UgcGF0aFxuICogICAtIGV4ZWN1dGlvbkNvdW50ICsgdmlzaXRDb3VudHM6IHRoZSBjb3VudGVycyB0aGUgcmVzdW1lZCBydW4gY29udGludWVzXG4gKiAgIC0gcGVuZGluZ1BhdXNlcywgcmVkYWN0aW9uTWFya3M6IHdhaXRpbmcgc2libGluZ3MsIHJlZGFjdGlvbiBuYW1lc1xuICogICAtIHBhdXNlRGF0YSwgcGF1c2VkRXhlY3V0aW9uLCBpbnZva2VyU3RhZ2VJZCwgcGF1c2VkQXQ6IHRoZSByZWNvcmRcbiAqXG4gKiBSZXN1bWUgcmVidWlsZHMgdGhlIGZsb3djaGFydCwgcmVzdG9yZXMgc2NvcGUsIG5hdmlnYXRlcyB0byB0aGUgcGF1c2VkIHN0YWdlLFxuICogaW5qZWN0cyByZXN1bWVJbnB1dCwgYW5kIGNvbnRpbnVlcyB0cmF2ZXJzYWwuXG4gKlxuICogU3VwcG9ydGVkIHRvcG9sb2dpZXM6IGxpbmVhciwgc3ViZmxvdyAoYXQgYW55IGRlcHRoIOKAlCBtb3VudGVkIGxpbmVhcmx5LCBhcyBhXG4gKiBkZWNpZGVyIG9yIHNlbGVjdG9yIGJyYW5jaCwgb3IgYXMgYSBmb3JrIGNoaWxkKSwgbG9vcCwgbmVzdGVkIHN1YmZsb3cgaW5cbiAqIGxvb3AsIGFuZCBzZXZlcmFsIHBhcmFsbGVsIHNpYmxpbmdzIHBhdXNpbmcgaW4gb25lIGZhbi1vdXQgKGVhY2ggYXNrcyBpblxuICogdHVybiDigJQgYEZsb3djaGFydENoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2ApLlxuICpcbiAqIE5PVCByZXN1bWFibGUgeWV0OiBhIHBhdXNlIGluc2lkZSBhIExBWlkgc3ViZmxvdyAoYGFkZExhenlTdWJGbG93Q2hhcnQqYCkgb3JcbiAqIGluc2lkZSBhbiBgYWRkUGFyYWxsZWxGb3JFYWNoYCBicmFuY2guIFRoZWlyIGdyYXBocyBhcmUgcmVzb2x2ZWQgYXQgcnVuIHRpbWVcbiAqIGFuZCBhcmUgbm90IGluIHRoZSBjaGFydCBhIHJlc3VtZSB3YWxrcywgc28gYHJlc3VtZSgpYCByZWZ1c2VzIHRoZVxuICogY2hlY2twb2ludCAoXCJub3QgZm91bmRcIikgaW5zdGVhZCBvZiBndWVzc2luZy4gUGlubmVkIGluXG4gKiB0ZXN0L2xpYi9wYXVzZS9yZXN1bWUta25vd24tbGltaXRhdGlvbnMudGVzdC50cy5cbiAqL1xuXG4vLyDilIDilIAgUGF1c2VTaWduYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhlIHBhdXNlZCBFWEVDVVRJT04gKDkuMzcuMCk6IHRoZSBydW4gdGhhdCBwYXVzZWQgYW5kIHRoZSBwYXVzZWQgc3RhZ2Unc1xuICogcnVudGltZVN0YWdlSWQgaW4gaXQuIFJlY29yZGVkIG9uIHRoZSBjaGVja3BvaW50IChhbmQgb24gZWFjaCBxdWV1ZWRcbiAqIHNpYmxpbmcncyBwZW5kaW5nIHJlY29yZCkgc28gYSByZXN1bWUgY2FuIExJTksgdG8gaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF1c2VkRXhlY3V0aW9uIHtcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVkYWN0aW9uIGEgcGF1c2UgY2FycmllcyB0byB0aGUgcmVzdW1lZCBydW4g4oCUIE5BTUVTIG9ubHksIG5ldmVyIGEgdmFsdWVcbiAqICh0aGUgY2hlY2twb2ludCBzdGF5cyByZWFsKTogdGhlIGtleXMgbWFya2VkIHNlY3JldCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1blxuICogKGEgcGVyLWNhbGwgYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYCwgYSBrZXkgdGhlIHBvbGljeSByZWRhY3RlZCB3aG9sZSwgYVxuICogc3ViZmxvdyBtYXBwZXIncyB0YWludCkgYW5kIHRoZSBmaWVsZHMgYSBtYXBwZXIgaGFuZGVkIHRvIGEgbmV3IGtleS4gUmVzdW1lXG4gKiBzZWVkcyB0aGUgcmVzdW1lZCBydW4ncyBydWxlIHdpdGggdGhlbSwgc28gYSBjb3B5IG1hZGUgYmVmb3JlIHRoZSBwYXVzZSBpc1xuICogc3RpbGwgbWFza2VkIGFmdGVyIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvbk1hcmtzIHtcbiAgcmVhZG9ubHkga2V5czogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBLZXkg4oaSIHRoZSBmaWVsZCBwYXRocyBhIG1hcHBlciBoYW5kZWQgaXQuIEFic2VudCB3aGVuIG5vbmUuICovXG4gIHJlYWRvbmx5IGZpZWxkcz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG59XG5cbi8qKiBUcnVlIGZvciBhIHdlbGwtZm9ybWVkIHtAbGluayBQYXVzZWRFeGVjdXRpb259ICh0d28gbm9uLWVtcHR5IHN0cmluZ3MpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGF1c2VkRXhlY3V0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGF1c2VkRXhlY3V0aW9uIHtcbiAgY29uc3QgdiA9IHZhbHVlIGFzIHsgcnVuSWQ/OiB1bmtub3duOyBydW50aW1lU3RhZ2VJZD86IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHY/LnJ1bklkID09PSAnc3RyaW5nJyAmJiB2LnJ1bklkICE9PSAnJyAmJiB0eXBlb2Ygdi5ydW50aW1lU3RhZ2VJZCA9PT0gJ3N0cmluZycgJiYgdi5ydW50aW1lU3RhZ2VJZCAhPT0gJydcbiAgKTtcbn1cblxuLyoqXG4gKiBUaHJvd24gYnkgYHNjb3BlLiRwYXVzZSgpYCB0byBzaWduYWwgdGhhdCBleGVjdXRpb24gc2hvdWxkIHN0b3BcbiAqIGFuZCBjcmVhdGUgYSBzZXJpYWxpemFibGUgY2hlY2twb2ludC5cbiAqXG4gKiBCdWJibGVzIHVwIHRocm91Z2ggU3ViZmxvd0V4ZWN1dG9yICh3aGljaCBwcmVwZW5kcyBzdWJmbG93IElEIHRvIHBhdGgpXG4gKiBhbmQgaXMgY2F1Z2h0IGJ5IEZsb3djaGFydFRyYXZlcnNlci9GbG93Q2hhcnRFeGVjdXRvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhdXNlU2lnbmFsIGV4dGVuZHMgRXJyb3Ige1xuICAvKiogRGF0YSBmcm9tICRwYXVzZSgpIOKAlCBxdWVzdGlvbiwgcmVhc29uLCBtZXRhZGF0YS4gKi9cbiAgcmVhZG9ubHkgcGF1c2VEYXRhOiB1bmtub3duO1xuICAvKiogSUQgb2YgdGhlIHN0YWdlIHRoYXQgY2FsbGVkICRwYXVzZSgpLiAqL1xuICByZWFkb25seSBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIT1cgdGhlIHBhdXNlIHdhcyByYWlzZWQg4oCUIGAnaW50ZXJydXB0J2Agd2hlbiBhIHN0YWdlIGJvZHkgY2FsbGVkXG4gICAqIGBpbnRlcnJ1cHQoc2NvcGUsIHBheWxvYWQpYCwgYWJzZW50IGZvciB0aGUgYGFkZFBhdXNhYmxlRnVuY3Rpb25gXG4gICAqIGV4ZWN1dGUvcmVzdW1lIHBhdGguIFNldCBhdCB0aGUgc3RhZ2UgYm91bmRhcnkgKGBTdGFnZVJ1bm5lcmApLCBjYXJyaWVkXG4gICAqIG9udG8gdGhlIGNoZWNrcG9pbnQsIGFuZCByZWFkIGJ5IGByZXN1bWUoKWAgdG8gcGljayB0aGUgcmUtZW50cnk6IGFuXG4gICAqIGludGVycnVwdGVkIHN0YWdlIHJlLXJ1bnMgaXRzIE9XTiBmdW5jdGlvbiBmcm9tIHRoZSB0b3AgKHN0YWdlcyBhcmVcbiAgICogYXRvbWljKSwgYSBwYXVzYWJsZSBzdGFnZSBydW5zIGl0cyBgcmVzdW1lRm5gLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF1c2VkQnk/OiAnaW50ZXJydXB0JztcbiAgLyoqIFBhdGggdGhyb3VnaCBzdWJmbG93cyB0byB0aGUgcGF1c2VkIHN0YWdlLiBCdWlsdCBkdXJpbmcgYnViYmxlLXVwLiAqL1xuICBwcml2YXRlIF9zdWJmbG93UGF0aDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEludm9rZXIgY29udGV4dCDigJQgZW5yaWNoZWQgZHVyaW5nIGJ1YmJsZS11cCB3aGVuIGEgUGF1c2VTaWduYWwgcGFzc2VzXG4gICAqIHRocm91Z2ggYSBkZWNpZGVyLCBzZWxlY3Rvciwgb3IgZm9yayBoYW5kbGVyLlxuICAgKlxuICAgKiBUaGUgaW52b2tlciBpcyB0aGUgc3RhZ2UgdGhhdCBjYWxsZWQgZXhlY3V0ZU5vZGUoKSBvbiB0aGUgcGF1c2VkIGNoaWxkLlxuICAgKiBDYXB0dXJlZCBkdXJpbmcgdHJhdmVyc2FsIChub3QgcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSB0cmVlKS4gKFRoZVxuICAgKiBpbnZva2VyJ3MgYC5uZXh0YCBpZCByb2RlIGJlc2lkZSBpdCB1bnRpbCA5LjM5LjAgYXNcbiAgICogYGNvbnRpbnVhdGlvblN0YWdlSWRgOyB3aGF0IHJ1bnMgYWZ0ZXIgYSByZXN1bWUgY29tZXMgZnJvbSB0aGUgY2hhcnRcbiAgICogc2luY2UgOS4yOC4wLCBzbyBpdCBpcyBubyBsb25nZXIgY2FycmllZC4pXG4gICAqL1xuICBwcml2YXRlIF9pbnZva2VyU3RhZ2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogU3ViZmxvdyBzY29wZSBjYXB0dXJlIOKAlCBwb3B1bGF0ZWQgZHVyaW5nIGJ1YmJsZS11cCBieVxuICAgKiBgU3ViZmxvd0V4ZWN1dG9yYCByaWdodCBiZWZvcmUgcmUtdGhyb3cuIEVhY2ggZW50cnkgaXMgb25lXG4gICAqIHN1YmZsb3cncyBwcmUtcGF1c2Ugc2hhcmVkIHN0YXRlLCBrZXllZCBieSB0aGUgcGF0aC1wcmVmaXhlZFxuICAgKiBzdWJmbG93IGlkIChtYXRjaGVzIGBzdWJmbG93UGF0aGApLlxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMsIHRoZSBuZXN0ZWQgYFNoYXJlZE1lbW9yeWAgaXMgZ2FyYmFnZS1jb2xsZWN0ZWRcbiAgICogYmVmb3JlIHRoZSBjaGVja3BvaW50IGlzIGJ1aWx0LiBPbiByZXN1bWUsIHRoZSBpbm5lciBydW50aW1lIGlzXG4gICAqIHJlLWNyZWF0ZWQgZW1wdHkgYW5kIHJlc3VtZSBoYW5kbGVycyByZWFkaW5nIHByZS1wYXVzZSBzY29wZVxuICAgKiAoZS5nLiwgYW4gQWdlbnQncyBgc2NvcGUuaGlzdG9yeWAsIGBzY29wZS5wYXVzZWRUb29sQ2FsbElkYClcbiAgICogY3Jhc2ggd2l0aCBcIlggaXMgbm90IGl0ZXJhYmxlXCIgLyB1bmRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIF9zdWJmbG93U3RhdGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSB7fTtcblxuICAvKipcbiAgICogUGF1c2VzIHRoYXQgUEFSQUxMRUwgU0lCTElOR1MgcmFpc2VkIGluIHRoZSBzYW1lIGZhbi1vdXQgYXMgdGhpcyBvbmUsXG4gICAqIHdhaXRpbmcgdGhlaXIgdHVybiAoOS4yOC4wKS4gUmVjb3JkZWQgYnkgYENoaWxkcmVuRXhlY3V0b3JgIHdoZW4gbW9yZVxuICAgKiB0aGFuIG9uZSBjaGlsZCBvZiBhIGZvcmsgKG9yIG1vcmUgdGhhbiBvbmUgc2VsZWN0ZWQgYnJhbmNoKSBwYXVzZXM6IHRoZVxuICAgKiBmaXJzdCBwYXVzZSBpcyB0aGUgb25lIHRoYXQgaXMgYXNrZWQsIHRoZSBvdGhlcnMgcmlkZSBoZXJlIGluc3RlYWQgb2ZcbiAgICogYmVpbmcgZHJvcHBlZC4gRWFjaCBwYXRoIGlzIHJlbGF0aXZlIHRvIHdoZXJlIHRoZSBzaWduYWwgY3VycmVudGx5IGlzXG4gICAqIGFuZCBncm93cyB3aXRoIGl0IOKAlCBgcHJlcGVuZFN1YmZsb3dgIHByZXBlbmRzIHRvIGV2ZXJ5IGVudHJ5IHRvby5cbiAgICovXG4gIHByaXZhdGUgX3BlbmRpbmdQYXVzZXM6IE11dGFibGVQZW5kaW5nUGF1c2VbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBXSElDSCBleGVjdXRpb24gcGF1c2VkIOKAlCBpdHMgcnVudGltZVN0YWdlSWQgc3RhbXBlZCBvbmNlIGF0IHRoZSBzdGFnZVxuICAgKiBib3VuZGFyeSAoYFN0YWdlUnVubmVyYCksIGl0cyBydW4gYWRkZWQgd2hlbiB0aGUgY2hlY2twb2ludCBpcyBidWlsdFxuICAgKiAoYGNvbXBsZXRlRXhlY3V0aW9uYCksIG9yIGJvdGggY2FycmllZCBvdmVyIGZvciBhIHF1ZXVlZCBzaWJsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcGF1c2VkRXhlY3V0aW9uPzogeyBydW50aW1lU3RhZ2VJZDogc3RyaW5nOyBydW5JZD86IHN0cmluZyB9O1xuXG4gIC8qKiBUaGUgcGF1c2VkIGV4ZWN1dGlvbidzIGlkZW1wb3RlbmN5IGtleSAoUDMpIOKAlCBhIHRvdWNoaW5nIHN0YWdlJ3MsIHN0YW1wZWQgb25jZSBhdCB0aGUgc3RhZ2UgYm91bmRhcnkuICovXG4gIHByaXZhdGUgX2lkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IHVua25vd24sIHN0YWdlSWQ6IHN0cmluZywgcGF1c2VkQnk/OiAnaW50ZXJydXB0Jykge1xuICAgIHN1cGVyKCdFeGVjdXRpb24gcGF1c2VkJyk7XG4gICAgdGhpcy5uYW1lID0gJ1BhdXNlU2lnbmFsJztcbiAgICB0aGlzLnBhdXNlRGF0YSA9IGRhdGE7XG4gICAgdGhpcy5zdGFnZUlkID0gc3RhZ2VJZDtcbiAgICBpZiAocGF1c2VkQnkpIHRoaXMucGF1c2VkQnkgPSBwYXVzZWRCeTtcbiAgICB0aGlzLl9zdWJmbG93UGF0aCA9IFtdO1xuICAgIC8vIFBhdXNlU2lnbmFsIGlzIGNvbnRyb2wgZmxvdywgbm90IGEgcmVhbCBlcnJvciDigJQgc3RhY2sgdHJhY2UgaGFzIG5vIGRpYWdub3N0aWMgdmFsdWUuXG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG5cbiAgZ2V0IHN1YmZsb3dQYXRoKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc3ViZmxvd1BhdGg7XG4gIH1cblxuICAvKiogVGhlIHBhdXNlZCBleGVjdXRpb24gKGl0cyBydW4gYW5kIGBbcGF0aC9dc3RhZ2VJZCNOYCksIG9uY2UgYm90aCBhcmUga25vd24uICovXG4gIGdldCBwYXVzZWRFeGVjdXRpb24oKTogUGF1c2VkRXhlY3V0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBlID0gdGhpcy5fcGF1c2VkRXhlY3V0aW9uO1xuICAgIHJldHVybiBlPy5ydW5JZCAhPT0gdW5kZWZpbmVkID8geyBydW5JZDogZS5ydW5JZCwgcnVudGltZVN0YWdlSWQ6IGUucnVudGltZVN0YWdlSWQgfSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgd2hpY2ggRVhFQ1VUSU9OIHBhdXNlZC4gRmlyc3Qgc3RhbXAgd2luczogdGhlIHNpZ25hbCBidWJibGVzXG4gICAqIHRocm91Z2ggb3V0ZXIgYm91bmRhcmllcyB0aGF0IG11c3Qgbm90IG92ZXJ3cml0ZSBpdC4gVGhlIHN0YWdlIGJvdW5kYXJ5XG4gICAqIGtub3dzIG9ubHkgdGhlIHJ1bnRpbWVTdGFnZUlkOyBhIHF1ZXVlZCBzaWJsaW5nIHJhaXNlZCBhZ2FpbiBvbiByZXN1bWVcbiAgICogY2FycmllcyBib3RoIChpdCBwYXVzZWQgaW4gYW4gRUFSTElFUiBydW4pLlxuICAgKi9cbiAgc3RhbXBFeGVjdXRpb24ocnVudGltZVN0YWdlSWQ6IHN0cmluZywgcnVuSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcGF1c2VkRXhlY3V0aW9uICE9PSB1bmRlZmluZWQgfHwgIXJ1bnRpbWVTdGFnZUlkKSByZXR1cm47XG4gICAgdGhpcy5fcGF1c2VkRXhlY3V0aW9uID0geyBydW50aW1lU3RhZ2VJZCwgLi4uKHJ1bklkICE9PSB1bmRlZmluZWQgJiYgeyBydW5JZCB9KSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVtcG90ZW5jeSBrZXkgdGhlIHBhdXNlZCBleGVjdXRpb24gcmFuIHVuZGVyIChQMykg4oCUIGEgdG91Y2hpbmcgc3RhZ2Uncy4gSXQgcmlkZXMgdGhlIGNoZWNrcG9pbnQgc28gdGhlXG4gICAqIHJlc3VtZSByZS1ydW5zIHRoZSBzdGFnZSAob3IgaXRzIGByZXN1bWVGbmApIHVuZGVyIHRoZSBTQU1FIGtleTogdGhlIGlucHV0IGl0cyBydWxlIHJlYWQgZG9lcyBub3QgY3Jvc3MgYVxuICAgKiByZXN1bWUuIEZpcnN0IHN0YW1wIHdpbnMuXG4gICAqL1xuICBnZXQgaWRlbXBvdGVuY3lLZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faWRlbXBvdGVuY3lLZXk7XG4gIH1cblxuICBzdGFtcElkZW1wb3RlbmN5S2V5KGtleTogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lkZW1wb3RlbmN5S2V5ID09PSB1bmRlZmluZWQgJiYga2V5ICE9PSB1bmRlZmluZWQpIHRoaXMuX2lkZW1wb3RlbmN5S2V5ID0ga2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIE5hbWUgdGhlIHJ1biBmb3IgZXZlcnkgcGF1c2Ugb24gdGhpcyBzaWduYWwgdGhhdCBwYXVzZWQgaW4gaXQg4oCUIHRoaXMgb25lXG4gICAqIGFuZCBpdHMgcXVldWVkIHNpYmxpbmdzIHRoYXQgZG8gbm90IGFscmVhZHkgY2FycnkgYSBydW4gKGEgc2libGluZyByYWlzZWRcbiAgICogYWdhaW4gb24gcmVzdW1lIGtlZXBzIHRoZSBydW4gaXQgcGF1c2VkIGluKS4gQ2FsbGVkIG9uY2UsIHdoZW4gdGhlXG4gICAqIGNoZWNrcG9pbnQgaXMgYnVpbHQuXG4gICAqL1xuICBjb21wbGV0ZUV4ZWN1dGlvbihydW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3BhdXNlZEV4ZWN1dGlvbiAmJiB0aGlzLl9wYXVzZWRFeGVjdXRpb24ucnVuSWQgPT09IHVuZGVmaW5lZCkgdGhpcy5fcGF1c2VkRXhlY3V0aW9uLnJ1bklkID0gcnVuSWQ7XG4gICAgZm9yIChjb25zdCBwZW5kaW5nIG9mIHRoaXMuX3BlbmRpbmdQYXVzZXMpIHtcbiAgICAgIGlmIChwZW5kaW5nLnBhdXNlZEV4ZWN1dGlvbiAmJiBwZW5kaW5nLnBhdXNlZEV4ZWN1dGlvbi5ydW5JZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBlbmRpbmcucGF1c2VkRXhlY3V0aW9uID0geyBydW50aW1lU3RhZ2VJZDogcGVuZGluZy5wYXVzZWRFeGVjdXRpb24ucnVudGltZVN0YWdlSWQsIHJ1bklkIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBlbmQgYSBzdWJmbG93IElEIHRvIHRoZSBwYXRoIChjYWxsZWQgZHVyaW5nIGJ1YmJsZS11cCkuIFRoZSBwZW5kaW5nXG4gICAqIHNpYmxpbmcgcGF1c2VzIHJpZGUgdGhlIHNhbWUgYm91bmRhcnksIHNvIHRoZWlyIHBhdGhzIGdyb3cgd2l0aCBpdC5cbiAgICovXG4gIHByZXBlbmRTdWJmbG93KHN1YmZsb3dJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc3ViZmxvd1BhdGgudW5zaGlmdChzdWJmbG93SWQpO1xuICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiB0aGlzLl9wZW5kaW5nUGF1c2VzKSBwZW5kaW5nLnN1YmZsb3dQYXRoLnVuc2hpZnQoc3ViZmxvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWV1ZSBhIHBhcmFsbGVsIHNpYmxpbmcncyBwYXVzZSBiZWhpbmQgdGhpcyBvbmUgKGl0cyBwYXRoIHJlbGF0aXZlIHRvXG4gICAqIHRoaXMgc2lnbmFsJ3MgY3VycmVudCBsZXZlbCkuIENvcGllZCBpbjogdGhlIGVudHJ5IGlzIG93bmVkIGJ5IHRoZVxuICAgKiBzaWduYWwgZnJvbSBoZXJlIG9uLlxuICAgKi9cbiAgYWRkUGVuZGluZ1BhdXNlKHBhdXNlOiBQZW5kaW5nUGF1c2UpOiB2b2lkIHtcbiAgICB0aGlzLl9wZW5kaW5nUGF1c2VzLnB1c2goe1xuICAgICAgcGF1c2VkU3RhZ2VJZDogcGF1c2UucGF1c2VkU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiBbLi4ucGF1c2Uuc3ViZmxvd1BhdGhdLFxuICAgICAgc3ViZmxvd1N0YXRlczogeyAuLi5wYXVzZS5zdWJmbG93U3RhdGVzIH0sXG4gICAgICAuLi4ocGF1c2UucGF1c2VEYXRhICE9PSB1bmRlZmluZWQgJiYgeyBwYXVzZURhdGE6IHBhdXNlLnBhdXNlRGF0YSB9KSxcbiAgICAgIC4uLihwYXVzZS5wYXVzZWRCeSAmJiB7IHBhdXNlZEJ5OiBwYXVzZS5wYXVzZWRCeSB9KSxcbiAgICAgIC4uLihwYXVzZS5wYXVzZWRFeGVjdXRpb24gJiZcbiAgICAgICAgdHlwZW9mIHBhdXNlLnBhdXNlZEV4ZWN1dGlvbi5ydW50aW1lU3RhZ2VJZCA9PT0gJ3N0cmluZycgJiYgeyBwYXVzZWRFeGVjdXRpb246IHsgLi4ucGF1c2UucGF1c2VkRXhlY3V0aW9uIH0gfSksXG4gICAgICAuLi4ocGF1c2UuaWRlbXBvdGVuY3lLZXkgIT09IHVuZGVmaW5lZCAmJiB7IGlkZW1wb3RlbmN5S2V5OiBwYXVzZS5pZGVtcG90ZW5jeUtleSB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRpbmcgYmVoaW5kIHRoaXMgb25lLCBpbiB0aGUgb3JkZXIgdGhleSB3aWxsXG4gICAqIGJlIGFza2VkLiBJbiBmbGlnaHQsIGEgc2libGluZyB0aGF0IHBhdXNlZCBpbiBUSElTIHJ1biBjYXJyaWVzIG9ubHkgaXRzXG4gICAqIHJ1bnRpbWVTdGFnZUlkOyBgY29tcGxldGVFeGVjdXRpb25gIChhdCBjaGVja3BvaW50IGJ1aWxkKSBhZGRzIHRoZSBydW4uXG4gICAqL1xuICBnZXQgcGVuZGluZ1BhdXNlcygpOiByZWFkb25seSBQZW5kaW5nUGF1c2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdQYXVzZXMgYXMgcmVhZG9ubHkgUGVuZGluZ1BhdXNlW107XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBwYXVzZSBhcyBhIHtAbGluayBQZW5kaW5nUGF1c2V9IOKAlCB3aGF0IGBDaGlsZHJlbkV4ZWN1dG9yYCBxdWV1ZXNcbiAgICogYmVoaW5kIGEgc2libGluZydzIHBhdXNlIHdoZW4gYm90aCBwYXVzZWQgaW4gb25lIGZhbi1vdXQuXG4gICAqL1xuICB0b1BlbmRpbmdQYXVzZSgpOiBQZW5kaW5nUGF1c2Uge1xuICAgIC8vIEluIGZsaWdodCAoc2VlIGBwZW5kaW5nUGF1c2VzYCk6IHRoZSBydW4gaXMgYWRkZWQgYXQgY2hlY2twb2ludCBidWlsZC5cbiAgICByZXR1cm4gPFBlbmRpbmdQYXVzZT57XG4gICAgICBwYXVzZWRTdGFnZUlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBzdWJmbG93UGF0aDogWy4uLnRoaXMuX3N1YmZsb3dQYXRoXSxcbiAgICAgIHN1YmZsb3dTdGF0ZXM6IHsgLi4udGhpcy5fc3ViZmxvd1N0YXRlcyB9LFxuICAgICAgLi4uKHRoaXMucGF1c2VEYXRhICE9PSB1bmRlZmluZWQgJiYgeyBwYXVzZURhdGE6IHRoaXMucGF1c2VEYXRhIH0pLFxuICAgICAgLi4uKHRoaXMucGF1c2VkQnkgJiYgeyBwYXVzZWRCeTogdGhpcy5wYXVzZWRCeSB9KSxcbiAgICAgIC4uLih0aGlzLl9wYXVzZWRFeGVjdXRpb24gJiYgeyBwYXVzZWRFeGVjdXRpb246IHsgLi4udGhpcy5fcGF1c2VkRXhlY3V0aW9uIH0gfSksXG4gICAgICAuLi4odGhpcy5faWRlbXBvdGVuY3lLZXkgIT09IHVuZGVmaW5lZCAmJiB7IGlkZW1wb3RlbmN5S2V5OiB0aGlzLl9pZGVtcG90ZW5jeUtleSB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFRoZSBzdGFnZSB0aGF0IGludm9rZWQgdGhlIHBhdXNlZCBjaGlsZCAoZGVjaWRlciwgc2VsZWN0b3IsIGZvcmspLiAqL1xuICBnZXQgaW52b2tlclN0YWdlSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlclN0YWdlSWQ7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgdGhlIGludm9rZXIgY29udGV4dCBkdXJpbmcgYnViYmxlLXVwLlxuICAgKiBDYWxsZWQgYnkgZGVjaWRlci9zZWxlY3Rvci9mb3JrIGhhbmRsZXJzIHdoZW4gY2F0Y2hpbmcgYSBjaGlsZCdzIFBhdXNlU2lnbmFsLlxuICAgKiBGaXJzdCBpbnZva2VyIHdpbnMgKGlubmVybW9zdCkg4oCUIHN1YnNlcXVlbnQgY2FsbHMgYXJlIG5vLW9wcy5cbiAgICovXG4gIHNldEludm9rZXIoaW52b2tlclN0YWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faW52b2tlclN0YWdlSWQpIHRoaXMuX2ludm9rZXJTdGFnZUlkID0gaW52b2tlclN0YWdlSWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FwdHVyZSBhIHN1YmZsb3cncyBpc29sYXRlZCBTaGFyZWRNZW1vcnkgYXQgdGhlIG1vbWVudCBpdHNcbiAgICogdHJhdmVyc2FsIHRocmV3LiBDYWxsZWQgYnkgYFN1YmZsb3dFeGVjdXRvcmAgb25jZSBwZXIgc3ViZmxvd1xuICAgKiBib3VuZGFyeSBvbiB0aGUgYnViYmxlLXVwIHBhdGguIEVhY2ggY2FwdHVyZSBpcyBrZXllZCBieSB0aGVcbiAgICogcGF0aC1wcmVmaXhlZCBzdWJmbG93IGlkICh0aGUgc2FtZSBpZCB1c2VkIGluIGBzdWJmbG93UGF0aGApLlxuICAgKlxuICAgKiBJbm5lcm1vc3QtZmlyc3Q6IGEgZGVlcCBgU2VxdWVuY2UoQWdlbnQoLi4uKSlgIHBhdXNlIGNhcHR1cmVzIHRoZVxuICAgKiBhZ2VudCdzIHN1YmZsb3cgZmlyc3QsIHRoZW4gaXRzIHBhcmVudCdzLCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdFxuICAgKiBtb3VudC4gVGhlIGZ1bGwgbmVzdCBzdXJ2aXZlcyBpbnRvIGBjaGVja3BvaW50LnN1YmZsb3dTdGF0ZXNgLlxuICAgKi9cbiAgY2FwdHVyZVN1YmZsb3dTY29wZShzdWJmbG93SWQ6IHN0cmluZywgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgLy8gRGVmZW5zaXZlIHNoYWxsb3cgY2xvbmUgc28gbGF0ZXIgbXV0YXRpb25zIG9uIHRoZSBzb3VyY2UgZG9uJ3RcbiAgICAvLyBibGVlZCBpbnRvIHRoZSBjYXB0dXJlZCBzbmFwc2hvdC4gRGVlcCBjbG9uaW5nIGlzIHRoZSBjb25zdW1lcidzXG4gICAgLy8gcmVzcG9uc2liaWxpdHkgKHRoZSByZXN1bWUgdGFyZ2V0IG1heSBub3QgZXZlbiBiZSBvbiB0aGlzXG4gICAgLy8gcHJvY2Vzcyk7IFNoYXJlZE1lbW9yeSB2YWx1ZXMgYXJlIGNvbnZlbnRpb25hbGx5IEpTT04tZnJpZW5kbHkuXG4gICAgdGhpcy5fc3ViZmxvd1N0YXRlc1tzdWJmbG93SWRdID0geyAuLi5zdGF0ZSB9O1xuICB9XG5cbiAgLyoqIENhcHR1cmVkIHN1YmZsb3cgc2NvcGVzIChyZWFkLW9ubHkgdmlldykuICovXG4gIGdldCBzdWJmbG93U3RhdGVzKCk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ge1xuICAgIHJldHVybiB0aGlzLl9zdWJmbG93U3RhdGVzO1xuICB9XG59XG5cbi8vIOKUgOKUgCBQZW5kaW5nUGF1c2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQSBwYXVzZSBhIFBBUkFMTEVMIFNJQkxJTkcgb2YgdGhlIHBhdXNlZCBzdGFnZSByYWlzZWQgaW4gdGhlIHNhbWUgZmFuLW91dCDigJRcbiAqIHR3byBjaGlsZHJlbiBvZiBvbmUgZm9yayAob3IgdHdvIHNlbGVjdGVkIGJyYW5jaGVzIG9mIG9uZSBzZWxlY3RvcikgdGhhdFxuICogYm90aCBwYXVzZWQgKDkuMjguMCkuIE9ubHkgb25lIHBhdXNlIGlzIGFza2VkIGF0IGEgdGltZTogdGhlIGNoZWNrcG9pbnQnc1xuICogb3duIChgcGF1c2VkU3RhZ2VJZGApLCB0aGVuIGVhY2ggb2YgdGhlc2UgaW4gdHVybiwgd2l0aCB0aGUgZmFuLW91dCdzIGpvaW5cbiAqIHJ1bm5pbmcgb25seSBvbmNlIGV2ZXJ5IGNoaWxkIGlzIGRvbmUuXG4gKlxuICogRXZlcnl0aGluZyBuZWVkZWQgdG8gcmFpc2UgdGhlIHNpYmxpbmcncyBwYXVzZSBhZ2FpbiBsYXRlciBXSVRIT1VUIHJlLXJ1bm5pbmdcbiAqIHRoZSBzaWJsaW5nOiBpdHMgc3RhZ2UsIGl0cyBwYXRoLCBpdHMgY2FwdHVyZWQgc3ViZmxvdyBzdGF0ZSwgaXRzIHF1ZXN0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBBIGZvcmsgd2hvc2UgdHdvIGNoaWxkcmVuIGJvdGggYXNrOiB0aGUgZmlyc3QgY2hlY2twb2ludCBhc2tzIGMxIGFuZFxuICogLy8gY2FycmllcyBjMidzIHBhdXNlOyByZXN1bWluZyBpdCBmaW5pc2hlcyBjMSwgdGhlbiBwYXVzZXMgd2l0aCBjMidzXG4gKiAvLyBxdWVzdGlvbjsgcmVzdW1pbmcgVEhBVCBmaW5pc2hlcyBjMiBhbmQgcnVucyB0aGUgam9pbi5cbiAqIGNvbnN0IGNwID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAqIGNwLnBhdXNlZFN0YWdlSWQ7ICAgICAgICAgICAgICAgICAgLy8gJ2MxL2FzaydcbiAqIGNwLnBlbmRpbmdQYXVzZXM/LlswXS5wYXVzZWRTdGFnZUlkOyAvLyAnYzIvYXNrJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ1BhdXNlIHtcbiAgLyoqIFRoZSBzaWJsaW5nJ3MgcGF1c2VkIHN0YWdlIChwYXRoLXByZWZpeGVkIGlkLCBhcyBgcGF1c2VkU3RhZ2VJZGApLiAqL1xuICByZWFkb25seSBwYXVzZWRTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBQYXRoIHRocm91Z2ggc3ViZmxvd3MgdG8gdGhlIHNpYmxpbmcncyBwYXVzZWQgc3RhZ2UgKGFzIGBzdWJmbG93UGF0aGApLiAqL1xuICByZWFkb25seSBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgc2libGluZydzIG93biBzdWJmbG93IGNhcHR1cmVzIOKAlCB0aGUgc3ViZmxvd3Mgb24gSVRTIHBhdGggYmVsb3cgdGhlXG4gICAqIGZhbi1vdXQuIFRoZSBzdWJmbG93cyBhYm92ZSB0aGUgZmFuLW91dCBhcmUgc2hhcmVkIHdpdGggdGhlIGNoZWNrcG9pbnQnc1xuICAgKiBvd24gcGF1c2UgYW5kIGFyZSBjYXB0dXJlZCBhZ2FpbiB3aGVuIHRoaXMgcGF1c2UgaXMgcmFpc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1N0YXRlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAvKiogVGhlIHNpYmxpbmcncyBxdWVzdGlvbiAoYXMgYHBhdXNlRGF0YWApLiAqL1xuICByZWFkb25seSBwYXVzZURhdGE/OiB1bmtub3duO1xuICAvKiogSG93IHRoZSBzaWJsaW5nIHBhdXNlZCAoYXMgYHBhdXNlZEJ5YCkuICovXG4gIHJlYWRvbmx5IHBhdXNlZEJ5PzogJ2ludGVycnVwdCc7XG4gIC8qKiBXaGljaCBleGVjdXRpb24gdGhlIHNpYmxpbmcgcGF1c2VkIGluIChhcyBgcGF1c2VkRXhlY3V0aW9uYCwgOS4zNy4wKSDigJQga2VwdCBzbyBpdHMgb3duIHJlc3VtZSBsaW5rcyB0byBpdC4gKi9cbiAgcmVhZG9ubHkgcGF1c2VkRXhlY3V0aW9uPzogUGF1c2VkRXhlY3V0aW9uO1xuICAvKiogVGhlIGlkZW1wb3RlbmN5IGtleSB0aGUgc2libGluZydzIGV4ZWN1dGlvbiByYW4gdW5kZXIgKGFzIGBpZGVtcG90ZW5jeUtleWAsIDEwLjEpLiAqL1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcbn1cblxuLyoqIEEgcGVuZGluZyBwYXVzZSB3aG9zZSBwYXRoIHN0aWxsIGdyb3dzIGFzIGl0cyBzaWduYWwgYnViYmxlcyB1cCAoaW50ZXJuYWwpLiAqL1xuLyoqXG4gKiBUaGUgc2lnbmFsJ3Mgb3duIGNvcHkgb2YgYSBwZW5kaW5nIHBhdXNlLiBJdHMgYHBhdXNlZEV4ZWN1dGlvbmAgbWF5IHN0aWxsXG4gKiBsYWNrIHRoZSBydW4gKGEgc2libGluZyB0aGF0IHBhdXNlZCBpbiBUSElTIHJ1bikgdW50aWwgYGNvbXBsZXRlRXhlY3V0aW9uYC5cbiAqL1xudHlwZSBNdXRhYmxlUGVuZGluZ1BhdXNlID0gT21pdDxQZW5kaW5nUGF1c2UsICdzdWJmbG93UGF0aCcgfCAncGF1c2VkRXhlY3V0aW9uJz4gJiB7XG4gIHN1YmZsb3dQYXRoOiBzdHJpbmdbXTtcbiAgcGF1c2VkRXhlY3V0aW9uPzogeyBydW50aW1lU3RhZ2VJZDogc3RyaW5nOyBydW5JZD86IHN0cmluZyB9O1xufTtcblxuLy8g4pSA4pSAIFBhdXNlUmVzdWx0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJldHVybmVkIGJ5IGEgcGF1c2FibGUgc3RhZ2UncyBleGVjdXRlL3Jlc3VtZSBmdW5jdGlvbiB0byBzaWduYWwgcGF1c2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4ZWN1dGU6IGFzeW5jIChzY29wZSkgPT4ge1xuICogICBzY29wZS5vcmRlcklkID0gJzEyMyc7XG4gKiAgIHJldHVybiB7IHBhdXNlOiB0cnVlLCBkYXRhOiB7IHF1ZXN0aW9uOiAnQXBwcm92ZSBvcmRlciAxMjM/JyB9IH07XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXVzZVJlc3VsdCB7XG4gIHJlYWRvbmx5IHBhdXNlOiB0cnVlO1xuICAvKiogRGF0YSB0byBpbmNsdWRlIGluIHRoZSBjaGVja3BvaW50IOKAlCBxdWVzdGlvbiwgcmVhc29uLCBtZXRhZGF0YS4gKi9cbiAgcmVhZG9ubHkgZGF0YT86IHVua25vd247XG59XG5cbi8vIOKUgOKUgCBGbG93Y2hhcnRDaGVja3BvaW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFNlcmlhbGl6YWJsZSBjaGVja3BvaW50IOKAlCBldmVyeXRoaW5nIG5lZWRlZCB0byByZXN1bWUgYSBwYXVzZWQgZmxvd2NoYXJ0LFxuICogYW5kIG5vdGhpbmcgYSByZXN1bWUgbmV2ZXIgcmVhZHMuXG4gKlxuICogTEVBTiAoZm9ybWF0IDIpOiBpdHMgc2l6ZSBpcyB0aGUgU1RBVEUncywgbmV2ZXIgdGhlIHJ1bidzIGxlbmd0aC4gVGhlIGN1cnNvclxuICogaXMgYHBhdXNlZFN0YWdlSWRgICsgYHN1YmZsb3dQYXRoYDsgdGhlIHN0YXRlIGlzIGBzaGFyZWRTdGF0ZWAgcGx1cyB0aGVcbiAqIGNhcHR1cmVzIG9mIHRoZSBzdWJmbG93cyBvbiB0aGF0IHBhdGggKGBzdWJmbG93U3RhdGVzYCkuIFRoZSBydW4ncyBoaXN0b3J5IOKAlFxuICogdGhlIGV4ZWN1dGlvbiB0cmVlLCB0aGUgZmluaXNoZWQgc3ViZmxvd3MnIHJlc3VsdHMsIHRoZSBjb21taXQgbG9nIOKAlCBpcyBub3RcbiAqIGhlcmU6IHJlYWQgaXQgZnJvbSBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWAgYmVmb3JlIGByZXN1bWUoKWAgKGZvcm1hdCAxXG4gKiBjYXJyaWVkIGBleGVjdXRpb25UcmVlYCBhbmQgYHN1YmZsb3dSZXN1bHRzYDsgbm8gcmVzdW1lIHJlYWQgdGhlbSkuXG4gKlxuICogSlNPTi1zYWZlOiBubyBmdW5jdGlvbnMsIG5vIGNsYXNzIGluc3RhbmNlcywgbm8gU0RLIGNsaWVudHMuXG4gKiBTdG9yZSBhbnl3aGVyZTogUmVkaXMsIFBvc3RncmVzLCBsb2NhbFN0b3JhZ2UsIGEgZmlsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKTsgLy8gYWZ0ZXIgcGF1c2VcbiAqIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAqXG4gKiAvLyBSZXN1bWUgKGhvdXJzIGxhdGVyLCBwb3NzaWJseSBkaWZmZXJlbnQgc2VydmVyKVxuICogY29uc3QgY2hlY2twb2ludCA9IEpTT04ucGFyc2UoYXdhaXQgcmVkaXMuZ2V0KGBzZXNzaW9uOiR7aWR9YCkpO1xuICogY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICogYXdhaXQgZXhlY3V0b3IucmVzdW1lKGNoZWNrcG9pbnQsIHsgYXBwcm92ZWQ6IHRydWUgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93Y2hhcnRDaGVja3BvaW50IHtcbiAgLyoqXG4gICAqIFRoZSBjaGVja3BvaW50IEZPUk1BVDogYDJgLCB0aGUgbGVhbiBjaGVja3BvaW50IChgMWAgZnJvbSA5LjM5LjA7IGFic2VudFxuICAgKiBiZWZvcmUpLiBgcmVzdW1lKClgIHJlYWRzIGV2ZXJ5IG9sZGVyIG9uZSB0aHJvdWdoIHRoZSBvbmUgdXBjYXN0ZXJcbiAgICogKGBwYXVzZS9yZWNvcmQudHMgwrcgdXBjYXN0Q2hlY2twb2ludGApLCB3aGljaCBkcm9wcyB3aGF0IGxhdGVyIGZvcm1hdHNcbiAgICogZHJvcHBlZCDigJQgZm9ybWF0IDEncyBgZXhlY3V0aW9uVHJlZWAgYW5kIGBzdWJmbG93UmVzdWx0c2AsIHRoZSBsZWdhY3lcbiAgICogYGNvbnRpbnVhdGlvblN0YWdlSWRgIOKAlCBub25lIG9mIHdoaWNoIGEgcmVzdW1lIGV2ZXIgcmVhZC4gQSB2ZXJzaW9uIHRoaXNcbiAgICogcmVsZWFzZSBkb2VzIG5vdCBrbm93IGlzIHJlZnVzZWQuXG4gICAqL1xuICByZWFkb25seSBjaGVja3BvaW50VmVyc2lvbj86IDI7XG5cbiAgLyoqIFNjb3BlIHN0YXRlIGF0IHRoZSBwYXVzZSBwb2ludCDigJQgYWxsIHNoYXJlZCBtZW1vcnkga2V5L3ZhbHVlcy4gKi9cbiAgcmVhZG9ubHkgc2hhcmVkU3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKiBJRCBvZiB0aGUgc3RhZ2UgdGhhdCBwYXVzZWQuIFVzZWQgYnkgcmVzdW1lKCkgdG8gZmluZCB0aGUgbm9kZSBpbiB0aGUgZ3JhcGguICovXG4gIHJlYWRvbmx5IHBhdXNlZFN0YWdlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdXNlZCBFWEVDVVRJT04gKDkuMzcuMCk6IHRoZSBydW4gdGhhdCBwYXVzZWQgYW5kIHRoZSBwYXVzZWQgc3RhZ2Unc1xuICAgKiBydW50aW1lU3RhZ2VJZCBpbiBpdCAodGhlIGlkIGl0cyBgb25QYXVzZWAgZXZlbnQgYW5kIGl0cyBjb21taXQgY2FycnkpLlxuICAgKiBSZWFkIGJ5IGByZXN1bWUoKWAgaW50byB0aGUgYG9uUmVzdW1lYCBldmVudCdzIGB0cmF2ZXJzYWxDb250ZXh0LnJlc3VtZWRGcm9tYFxuICAgKiBsaW5rIOKAlCBuZXZlciB1c2VkIHRvIHBsYW4gdGhlIHJlLWVudHJ5LiBBYnNlbnQgb24gYW4gb2xkZXIgY2hlY2twb2ludCxcbiAgICogd2hpY2ggdGhlbiByZXN1bWVzIHdpdGhvdXQgYSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF1c2VkRXhlY3V0aW9uPzogUGF1c2VkRXhlY3V0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbXBvdGVuY3kga2V5IHRoZSBwYXVzZWQgZXhlY3V0aW9uIHJhbiB1bmRlciAoMTAuMSkg4oCUIHByZXNlbnQgb25seSB3aGVuIHRoZSBwYXVzZWQgc3RhZ2UgYHRvdWNoZXNgIGFuXG4gICAqIG91dHNpZGUgc3lzdGVtIHdpdGggYSBrZXkgcnVsZS4gYHJlc3VtZSgpYCByZS1ydW5zIHRoZSBzdGFnZSAob3IgcnVucyBpdHMgYHJlc3VtZUZuYCkgdW5kZXIgVEhJUyBrZXksIG5ldmVyIGFcbiAgICogcmVjb21wdXRlZCBvbmU6IHRoZSBpbnB1dCB0aGUgcnVsZSByZWFkIGRvZXMgbm90IGNyb3NzIGEgcmVzdW1lLCBhbmQgYSBkaWZmZXJlbnQga2V5IG9uIHRoZSByZS1ydW4gd291bGQgbWFrZVxuICAgKiB0aGUgb3V0c2lkZSBzeXN0ZW0gYXBwbHkgdGhlIGVmZmVjdCB0d2ljZS4gQSByZWFsIHZhbHVlLCBsaWtlIGBzaGFyZWRTdGF0ZWAg4oCUIG5vIHJlZGFjdGlvbiBwb2xpY3kgdG91Y2hlcyB0aGVcbiAgICogY2hlY2twb2ludC4gQSBtYWxmb3JtZWQgb25lIGlzIHJlZnVzZWQgYXQgYHJlc3VtZSgpYC5cbiAgICovXG4gIHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuXG4gIC8qKiBQYXRoIHRocm91Z2ggc3ViZmxvd3MgdG8gdGhlIHBhdXNlZCBzdGFnZSAoZS5nLiwgWydzZi1wYXltZW50JywgJ3NmLXZhbGlkYXRpb24nXSkuXG4gICAqICBFbXB0eSBhcnJheSB3aGVuIHBhdXNlZCBhdCB0aGUgdG9wIGxldmVsLiAqL1xuICByZWFkb25seSBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqIERhdGEgZnJvbSAkcGF1c2UoKSDigJQgcXVlc3Rpb24sIHJlYXNvbiwgbWV0YWRhdGEuICovXG4gIHJlYWRvbmx5IHBhdXNlRGF0YT86IHVua25vd247XG5cbiAgLyoqXG4gICAqIEhPVyB0aGUgcGF1c2Ugd2FzIHJhaXNlZC4gYCdpbnRlcnJ1cHQnYCBtZWFucyBhIHN0YWdlIGJvZHkgY2FsbGVkXG4gICAqIGBpbnRlcnJ1cHQoc2NvcGUsIHsgcmVhc29uLCBleHBlY3RzPyB9KWAgYW5kIGBwYXVzZURhdGFgIElTIHRoYXQgcGF5bG9hZDtcbiAgICogYWJzZW50IG1lYW5zIHRoZSBgYWRkUGF1c2FibGVGdW5jdGlvbmAgZXhlY3V0ZS9yZXN1bWUgcGF0aCAoZXZlcnlcbiAgICogY2hlY2twb2ludCB3cml0dGVuIGJlZm9yZSA5LjE0LjAgb21pdHMgaXQsIHdoaWNoIGlzIGV4YWN0bHkgcmlnaHQpLlxuICAgKlxuICAgKiBgcmVzdW1lKClgIHJlYWRzIHRoaXMgdG8gcGljayB0aGUgcmUtZW50cnksIGFuZCB0aGUgdHdvIGRpZmZlciBieSBsYXc6XG4gICAqIGFuIGludGVycnVwdGVkIHN0YWdlIFJFLVJVTlMgSVRTIE9XTiBGVU5DVElPTiBGUk9NIFRIRSBUT1AgKHN0YWdlcyBhcmVcbiAgICogYXRvbWljIOKAlCB0aGUgYW5zd2VyIGNvbWVzIGJhY2sgb3V0IG9mIHRoZSBgaW50ZXJydXB0KClgIGNhbGwpLCB3aGlsZSBhXG4gICAqIHBhdXNhYmxlIHN0YWdlIHJ1bnMgaXRzIHNlcGFyYXRlIGByZXN1bWVGbmAuXG4gICAqL1xuICByZWFkb25seSBwYXVzZWRCeT86ICdpbnRlcnJ1cHQnO1xuXG4gIC8qKlxuICAgKiBTdWJmbG93IHNjb3BlIGNhcHR1cmUg4oCUIG9uZSBlbnRyeSBwZXIgc3ViZmxvdyBib3VuZGFyeSBvbiB0aGUgcGF0aFxuICAgKiB0byB0aGUgcGF1c2VkIHN0YWdlLiBLZXllZCBieSBwYXRoLXByZWZpeGVkIHN1YmZsb3cgaWQgKG1hdGNoZXNcbiAgICogYHN1YmZsb3dQYXRoYCBlbnRyaWVzKS4gRWFjaCB2YWx1ZSBpcyB0aGUgc3ViZmxvdydzIHByZS1wYXVzZVxuICAgKiBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqIEFsd2F5cyBwcmVzZW50IChlbXB0eSBge31gIGZvciByb290LWxldmVsIHBhdXNlcyB3aGVyZSBubyBzdWJmbG93c1xuICAgKiB3ZXJlIGVudGVyZWQpLiBPbiByZXN1bWUsIGBTdWJmbG93RXhlY3V0b3JgIHNlZWRzIGVhY2ggbmVzdGVkIHJ1bnRpbWVcbiAgICogb24gdGhlIHBhdGggZnJvbSB0aGlzIG1hcCDigJQgT05DRSwgb24gaXRzIGZpcnN0IGVudHJ5LCBpbiBwbGFjZSBvZiB0aGVcbiAgICogaW5wdXRNYXBwZXIncyB2YWx1ZXMgKHRoZSBtYXBwZXIgc3RpbGwgcnVucywgZm9yIHRoZSBzdGFnZXMnIHJlYWQtb25seVxuICAgKiBhcmdzKSDigJQgc28gcmVzdW1lIGhhbmRsZXJzIHNlZSBwcmUtcGF1c2Ugc2NvcGUgYWNyb3NzIHNhbWUtZXhlY3V0b3IgQU5EXG4gICAqIGNyb3NzLWV4ZWN1dG9yIHJlc3RhcnRzLiBPbmx5IHRoZSBzdWJmbG93cyBPTiBgc3ViZmxvd1BhdGhgIHJlYWQgaXQuXG4gICAqL1xuICByZWFkb25seSBzdWJmbG93U3RhdGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cbiAgLyoqXG4gICAqIFRoZSBzaGFyZWQgZXhlY3V0aW9uIGNvdW50ZXIgYXQgdGhlIG1vbWVudCBvZiBwYXVzZSDigJQgdGhlIG51bWJlciBvZiBzdGFnZXNcbiAgICogZXhlY3V0ZWQgc28gZmFyIHRoaXMgcnVuLiBSZXN1bWUgc2VlZHMgaXQgc28gcG9zdC1yZXN1bWUgYHJ1bnRpbWVTdGFnZUlkYHNcbiAgICogKGBzdGFnZUlkI2V4ZWN1dGlvbkluZGV4YCkga2VlcCBjbGltYmluZyBhbmQgbmV2ZXIgY29sbGlkZSB3aXRoIHByZS1wYXVzZVxuICAgKiBvbmVzLCB3aGljaCBpcyB3aGF0IHRoZSB3aG9sZSBldmVudC1jb3JyZWxhdGlvbiBtb2RlbCByZXN0cyBvbi5cbiAgICpcbiAgICogT3B0aW9uYWwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IGEgY2hlY2twb2ludCBwZXJzaXN0ZWQgYmVmb3JlIHRoaXNcbiAgICogZmllbGQgZXhpc3RlZCAob2xkZXIgUmVkaXMvUG9zdGdyZXMgcm93cykgc3RpbGwgdmFsaWRhdGVzIGFuZCByZXN1bWVzIHdpdGhcbiAgICogdGhlIHByZXZpb3VzIChjb3VudGVyLXJlc3RhcnRpbmcpIGJlaGF2aW9yLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uQ291bnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFBlci1gc3RhZ2VJZGAgbG9vcCB2aXNpdCBjb3VudHMgYXQgdGhlIG1vbWVudCBvZiBwYXVzZS4gUmVzdW1lIHNlZWRzIHRoZW1cbiAgICogc28gYFRyYXZlcnNhbENvbnRleHQubG9vcEl0ZXJhdGlvbmAgc3RheXMgY29udGludW91cyBhY3Jvc3MgdGhlIHBhdXNlIChhXG4gICAqIG1pZC1sb29wIHJlc3VtZSBrZWVwcyBjb3VudGluZyB1cCwgbm90IHJlc3RhcnRpbmcgYXQgMCkgYW5kIHRoZVxuICAgKiBDb250aW51YXRpb25SZXNvbHZlciBpdGVyYXRpb24gYnVkZ2V0IGlzIG5vdCBzaWxlbnRseSByZWZpbGxlZC5cbiAgICpcbiAgICogT3B0aW9uYWwgZm9yIHRoZSBzYW1lIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkgcmVhc29uIGFzIGBleGVjdXRpb25Db3VudGAuXG4gICAqL1xuICByZWFkb25seSB2aXNpdENvdW50cz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIG51bWJlcj4+O1xuXG4gIC8qKiBTdGFnZSB0aGF0IGludm9rZWQgdGhlIHBhdXNlZCBjaGlsZCAoZGVjaWRlciwgc2VsZWN0b3IsIGZvcmspLiBBYnNlbnQgZm9yIGxpbmVhciBwYXVzZXMuICovXG4gIHJlYWRvbmx5IGludm9rZXJTdGFnZUlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXVzZXMgcmFpc2VkIGJ5IFBBUkFMTEVMIFNJQkxJTkdTIG9mIHRoZSBwYXVzZWQgc3RhZ2UgaW4gdGhlIHNhbWVcbiAgICogZmFuLW91dCwgd2FpdGluZyB0aGVpciB0dXJuICg5LjI4LjApIOKAlCBzZWUge0BsaW5rIFBlbmRpbmdQYXVzZX0uIEFic2VudFxuICAgKiB3aGVuIG9ubHkgb25lIGNoaWxkIHBhdXNlZCAoZXZlcnkgY2hlY2twb2ludCBiZWZvcmUgOS4yOC4wIG9taXRzIGl0LCBhbmRcbiAgICogcmVzdW1lcyBleGFjdGx5IGFzIGJlZm9yZSkuIFJlc3VtaW5nIHRoaXMgY2hlY2twb2ludCBmaW5pc2hlcyB0aGUgcGF1c2VkXG4gICAqIHN0YWdlJ3MgY2hpbGQsIHRoZW4gcGF1c2VzIGFnYWluIHdpdGggdGhlIGZpcnN0IG9mIHRoZXNlOyB0aGUgZmFuLW91dCdzXG4gICAqIGpvaW4gcnVucyBvbmNlIGV2ZXJ5IGNoaWxkIGlzIGRvbmUuXG4gICAqL1xuICByZWFkb25seSBwZW5kaW5nUGF1c2VzPzogcmVhZG9ubHkgUGVuZGluZ1BhdXNlW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWRhY3Rpb24gbWFya3Mgb2YgdGhlIHBhdXNlZCBydW4g4oCUIE5BTUVTIG9ubHkgKHNlZVxuICAgKiB7QGxpbmsgUmVkYWN0aW9uTWFya3N9KS4gQWJzZW50IHdoZW4gdGhlIHJ1biBtYXJrZWQgbm90aGluZyAobm8gcG9saWN5XG4gICAqIGFuZCBubyBwZXItY2FsbCBtYXJrLCBvciBhbiBvbGRlciBjaGVja3BvaW50KTogdGhlIHJlc3VtZWQgcnVuIHRoZW4gc3RhcnRzXG4gICAqIGZyb20gaXRzIHBvbGljeSBhbG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlZGFjdGlvbk1hcmtzPzogUmVkYWN0aW9uTWFya3M7XG5cbiAgLyoqIFRpbWVzdGFtcCBvZiB3aGVuIHRoZSBwYXVzZSBvY2N1cnJlZC4gKi9cbiAgcmVhZG9ubHkgcGF1c2VkQXQ6IG51bWJlcjtcbn1cblxuLy8g4pSA4pSAIFBhdXNhYmxlSGFuZGxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBIYW5kbGVyIGZvciBhIHBhdXNhYmxlIHN0YWdlIOKAlCBoYXMgdHdvIHBoYXNlczogZXhlY3V0ZSBhbmQgcmVzdW1lLlxuICpcbiAqIGBleGVjdXRlYCBydW5zIHRoZSBmaXJzdCB0aW1lLiBSZXR1cm4gYW55IG5vbi12b2lkIHZhbHVlIHRvIHBhdXNlICh0aGF0IHZhbHVlXG4gKiBiZWNvbWVzIHRoZSBjaGVja3BvaW50J3MgYHBhdXNlRGF0YWApOyByZXR1cm4gdm9pZC91bmRlZmluZWQgdG8gY29udGludWUgbm9ybWFsbHkuXG4gKiBgcmVzdW1lYCBydW5zIHdoZW4gdGhlIGZsb3djaGFydCBpcyByZXN1bWVkLiBJdCByZWNlaXZlcyB0aGUgcmVzdW1lIGlucHV0LlxuICpcbiAqIEJvdGggcGhhc2VzIHJlY2VpdmUgdGhlIHNhbWUgc2NvcGUuIEFmdGVyIGV4ZWN1dGUgcGF1c2VzLCB0aGUgc2NvcGUgc3RhdGVcbiAqIGlzIHByZXNlcnZlZCBpbiB0aGUgY2hlY2twb2ludC4gT24gcmVzdW1lLCB0aGUgc2NvcGUgaXMgcmVzdG9yZWQgYmVmb3JlXG4gKiBjYWxsaW5nIHJlc3VtZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLmFkZFBhdXNhYmxlRnVuY3Rpb24oJ0FwcHJvdmVPcmRlcicsIHtcbiAqICAgZXhlY3V0ZTogYXN5bmMgKHNjb3BlKSA9PiB7XG4gKiAgICAgc2NvcGUub3JkZXJJZCA9ICcxMjMnO1xuICogICAgIHNjb3BlLmFtb3VudCA9IDI5OTtcbiAqICAgICByZXR1cm4geyBxdWVzdGlvbjogYEFwcHJvdmUgJCR7c2NvcGUuYW1vdW50fSByZWZ1bmQ/YCB9O1xuICogICB9LFxuICogICByZXN1bWU6IGFzeW5jIChzY29wZSwgaW5wdXQpID0+IHtcbiAqICAgICBzY29wZS5hcHByb3ZlZCA9IGlucHV0LmFwcHJvdmVkO1xuICogICAgIHNjb3BlLmFwcHJvdmVyID0gaW5wdXQuYXBwcm92ZXI7XG4gKiAgIH0sXG4gKiB9LCAnYXBwcm92ZS1vcmRlcicsICdNYW5hZ2VyIGFwcHJvdmFsIGdhdGUnKVxuICpcbiAqIC8vIExhdGVyIOKAlCByZXN1bWUgd2l0aCBodW1hbidzIGFuc3dlclxuICogYXdhaXQgZXhlY3V0b3IucmVzdW1lKGNoZWNrcG9pbnQsIHsgYXBwcm92ZWQ6IHRydWUsIGFwcHJvdmVyOiAnSmFuZScgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlID0gYW55LCBUSW5wdXQgPSB1bmtub3duLCBUUGF1c2VEYXRhID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogRmlyc3QtcnVuIHBoYXNlLiBSZXR1cm4gZGF0YSB0byBwYXVzZSwgb3Igdm9pZC91bmRlZmluZWQgdG8gY29udGludWUgbm9ybWFsbHkuXG4gICAqXG4gICAqIEFueSBub24tdm9pZCByZXR1cm4gdmFsdWUgYmVjb21lcyB0aGUgYHBhdXNlRGF0YWAgaW4gdGhlIGNoZWNrcG9pbnQuXG4gICAqIFRoZSBjb25zdW1lciBkZWZpbmVzIHRoZSBgVFBhdXNlRGF0YWAgdHlwZSDigJQgdGhlIEZFIHVzZXMgaXQgdG8gcmVuZGVyXG4gICAqIHRoZSByaWdodCBVSSAoZm9ybSBmaWVsZHMsIGFwcHJvdmFsIGJ1dHRvbnMsIGV0Yy4pLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFRQYXVzZURhdGEgPSB7IHF1ZXN0aW9uOiBzdHJpbmc7IHJpc2tMZXZlbDogc3RyaW5nIH1cbiAgICogY29uc3QgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPE15U3RhdGUsIHsgYXBwcm92ZWQ6IGJvb2xlYW4gfSwgeyBxdWVzdGlvbjogc3RyaW5nOyByaXNrTGV2ZWw6IHN0cmluZyB9PiA9IHtcbiAgICogICBleGVjdXRlOiBhc3luYyAoc2NvcGUpID0+IHtcbiAgICogICAgIHJldHVybiB7IHF1ZXN0aW9uOiBgQXBwcm92ZSBvcmRlciAke3Njb3BlLm9yZGVySWR9P2AsIHJpc2tMZXZlbDogJ2hpZ2gnIH07XG4gICAqICAgfSxcbiAgICogICByZXN1bWU6IGFzeW5jIChzY29wZSwgaW5wdXQpID0+IHtcbiAgICogICAgIHNjb3BlLmFwcHJvdmVkID0gaW5wdXQuYXBwcm92ZWQ7XG4gICAqICAgfSxcbiAgICogfTtcbiAgICogYGBgXG4gICAqL1xuICBleGVjdXRlOiAoc2NvcGU6IFRTY29wZSkgPT4gUHJvbWlzZTxUUGF1c2VEYXRhIHwgdm9pZD4gfCBUUGF1c2VEYXRhIHwgdm9pZDtcbiAgLyoqXG4gICAqIFJlc3VtZSBwaGFzZS4gQ2FsbGVkIHdpdGggdGhlIHJlc3VtZSBpbnB1dCB3aGVuIGV4ZWN1dGlvbiBjb250aW51ZXMuXG4gICAqXG4gICAqIFRoZSBzY29wZSBpcyByZXN0b3JlZCBmcm9tIHRoZSBjaGVja3BvaW50J3MgYHNoYXJlZFN0YXRlYC4gV3JpdGVzIGR1cmluZ1xuICAgKiBgcmVzdW1lYCBhcmUgY29tbWl0dGVkIGFuZCB2aXNpYmxlIHRvIHN1YnNlcXVlbnQgc3RhZ2VzLlxuICAgKi9cbiAgcmVzdW1lOiAoc2NvcGU6IFRTY29wZSwgaW5wdXQ6IFRJbnB1dCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG59XG5cbi8vIOKUgOKUgCBUeXBlIGd1YXJkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIFBhdXNlUmVzdWx0IChzdGFnZSB3YW50cyB0byBwYXVzZSkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXVzZVJlc3VsdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFBhdXNlUmVzdWx0IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgKHZhbHVlIGFzIFBhdXNlUmVzdWx0KS5wYXVzZSA9PT0gdHJ1ZTtcbn1cblxuLyoqIENoZWNrIGlmIGFuIGVycm9yIGlzIGEgUGF1c2VTaWduYWwuIFVzZXMgaW5zdGFuY2VvZiArIG5hbWUgYnJhbmQgZmFsbGJhY2sgZm9yIGNyb3NzLXJlYWxtIHNhZmV0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BhdXNlU2lnbmFsKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgUGF1c2VTaWduYWwge1xuICAvLyBUb3RhbDogYSBQcm94eSB3aG9zZSBgZ2V0UHJvdG90eXBlT2ZgIHRyYXAgdGhyb3dzIChvciBhIHJldm9rZWQgUHJveHkpXG4gIC8vIGlzIG5vdCBhIHNpZ25hbCDigJQgdGhlIGVuZ2luZSdzIGNhdGNoIGJsb2NrcyBhc2sgdGhpcyBmaXJzdCwgYW5kIG11c3RcbiAgLy8gbm90IHRyYWRlIHRoZSBzdGFnZSdzIHRocm93biB2YWx1ZSBmb3IgdGhlIHRyYXAncyBlcnJvci5cbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBQYXVzZVNpZ25hbCB8fFxuICAgICAgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgICAgZXJyb3IubmFtZSA9PT0gJ1BhdXNlU2lnbmFsJyAmJlxuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyb3IsICdwYXVzZURhdGEnKSAmJlxuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyb3IsICdzdGFnZUlkJykpXG4gICAgKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3BhdXNlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQTRCSCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWM7SUFDOUMsTUFBTSxDQUFDLEdBQUcsS0FBeUUsQ0FBQztJQUNwRixPQUFPLENBQ0wsT0FBTyxDQUFDLEVBQUUsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxPQUFPLENBQUMsQ0FBQyxjQUFjLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxjQUFjLEtBQUssRUFBRSxDQUNsSCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsS0FBSztJQUNwQyx1REFBdUQ7SUFDOUMsU0FBUyxDQUFVO0lBQzVCLDRDQUE0QztJQUNuQyxPQUFPLENBQVM7SUFDekI7Ozs7Ozs7T0FPRztJQUNNLFFBQVEsQ0FBZTtJQUNoQyx5RUFBeUU7SUFDakUsWUFBWSxDQUFXO0lBRS9COzs7Ozs7Ozs7T0FTRztJQUNLLGVBQWUsQ0FBVTtJQUVqQzs7Ozs7Ozs7Ozs7T0FXRztJQUNLLGNBQWMsR0FBNEMsRUFBRSxDQUFDO0lBRXJFOzs7Ozs7O09BT0c7SUFDSyxjQUFjLEdBQTBCLEVBQUUsQ0FBQztJQUVuRDs7OztPQUlHO0lBQ0ssZ0JBQWdCLENBQThDO0lBRXRFLDRHQUE0RztJQUNwRyxlQUFlLENBQVU7SUFFakMsWUFBWSxJQUFhLEVBQUUsT0FBZSxFQUFFLFFBQXNCO1FBQ2hFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUks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QyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQYXVzZS9SZXN1bWUg4oCUIHNlcmlhbGl6YWJsZSBjaGVja3BvaW50IGZvciBsb25nLXJ1bm5pbmcgb3IgaHVtYW4taW4tdGhlLWxvb3AgZmxvd3MuXG4gKlxuICogQSBzdGFnZSBzaWduYWxzIHBhdXNlIGJ5IGNhbGxpbmcgYHNjb3BlLiRwYXVzZShkYXRhKWAgd2hpY2ggdGhyb3dzIGEgUGF1c2VTaWduYWwuXG4gKiBUaGUgc2lnbmFsIGJ1YmJsZXMgdXAgdGhyb3VnaCBTdWJmbG93RXhlY3V0b3Ig4oaSIEZsb3djaGFydFRyYXZlcnNlciDihpIgRmxvd0NoYXJ0RXhlY3V0b3IsXG4gKiBlYWNoIGxldmVsIGFkZGluZyBpdHMgc3ViZmxvdyBJRCB0byB0aGUgcGF0aC5cbiAqXG4gKiBUaGUgY2hlY2twb2ludCBjYXB0dXJlcyB3aGF0IGEgcmVzdW1lIHJlYWRzLCBhbmQgdGhlIHBhdXNlJ3Mgb3duIHJlY29yZCDigJRcbiAqIG5ldmVyIHRoZSBydW4ncyBoaXN0b3J5ICh0aGF0IGlzIGBnZXRTbmFwc2hvdCgpYCdzKTpcbiAqICAgLSBwYXVzZWRTdGFnZUlkICsgc3ViZmxvd1BhdGggKCsgcGF1c2VkQnkpOiB0aGUgY3Vyc29yXG4gKiAgIC0gc2hhcmVkU3RhdGUgKyBzdWJmbG93U3RhdGVzOiB0aGUgc3RhdGUgYXQgdGhlIHBhdXNlIOKAlCB0aGUgcm9vdCdzLCBhbmRcbiAqICAgICBlYWNoIHN1YmZsb3cncyBvbiB0aGUgcGF1c2UgcGF0aFxuICogICAtIGV4ZWN1dGlvbkNvdW50ICsgdmlzaXRDb3VudHM6IHRoZSBjb3VudGVycyB0aGUgcmVzdW1lZCBydW4gY29udGludWVzXG4gKiAgIC0gcGVuZGluZ1BhdXNlcywgcmVkYWN0aW9uTWFya3M6IHdhaXRpbmcgc2libGluZ3MsIHJlZGFjdGlvbiBuYW1lc1xuICogICAtIHBhdXNlRGF0YSwgcGF1c2VkRXhlY3V0aW9uLCBpbnZva2VyU3RhZ2VJZCwgcGF1c2VkQXQ6IHRoZSByZWNvcmRcbiAqXG4gKiBSZXN1bWUgcmVidWlsZHMgdGhlIGZsb3djaGFydCwgcmVzdG9yZXMgc2NvcGUsIG5hdmlnYXRlcyB0byB0aGUgcGF1c2VkIHN0YWdlLFxuICogaW5qZWN0cyByZXN1bWVJbnB1dCwgYW5kIGNvbnRpbnVlcyB0cmF2ZXJzYWwuXG4gKlxuICogU3VwcG9ydGVkIHRvcG9sb2dpZXM6IGxpbmVhciwgc3ViZmxvdyAoYXQgYW55IGRlcHRoIOKAlCBtb3VudGVkIGxpbmVhcmx5LCBhcyBhXG4gKiBkZWNpZGVyIG9yIHNlbGVjdG9yIGJyYW5jaCwgb3IgYXMgYSBmb3JrIGNoaWxkKSwgbG9vcCwgbmVzdGVkIHN1YmZsb3cgaW5cbiAqIGxvb3AsIGFuZCBzZXZlcmFsIHBhcmFsbGVsIHNpYmxpbmdzIHBhdXNpbmcgaW4gb25lIGZhbi1vdXQgKGVhY2ggYXNrcyBpblxuICogdHVybiDigJQgYEZsb3djaGFydENoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2ApLlxuICpcbiAqIE5PVCByZXN1bWFibGUgeWV0OiBhIHBhdXNlIGluc2lkZSBhIExBWlkgc3ViZmxvdyAoYGFkZExhenlTdWJGbG93Q2hhcnQqYCkgb3JcbiAqIGluc2lkZSBhbiBgYWRkUGFyYWxsZWxGb3JFYWNoYCBicmFuY2guIFRoZWlyIGdyYXBocyBhcmUgcmVzb2x2ZWQgYXQgcnVuIHRpbWVcbiAqIGFuZCBhcmUgbm90IGluIHRoZSBjaGFydCBhIHJlc3VtZSB3YWxrcywgc28gYHJlc3VtZSgpYCByZWZ1c2VzIHRoZVxuICogY2hlY2twb2ludCAoXCJub3QgZm91bmRcIikgaW5zdGVhZCBvZiBndWVzc2luZy4gUGlubmVkIGluXG4gKiB0ZXN0L2xpYi9wYXVzZS9yZXN1bWUta25vd24tbGltaXRhdGlvbnMudGVzdC50cy5cbiAqL1xuXG4vLyDilIDilIAgUGF1c2VTaWduYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhlIHBhdXNlZCBFWEVDVVRJT04gKDkuMzcuMCk6IHRoZSBydW4gdGhhdCBwYXVzZWQgYW5kIHRoZSBwYXVzZWQgc3RhZ2Unc1xuICogcnVudGltZVN0YWdlSWQgaW4gaXQuIFJlY29yZGVkIG9uIHRoZSBjaGVja3BvaW50IChhbmQgb24gZWFjaCBxdWV1ZWRcbiAqIHNpYmxpbmcncyBwZW5kaW5nIHJlY29yZCkgc28gYSByZXN1bWUgY2FuIExJTksgdG8gaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF1c2VkRXhlY3V0aW9uIHtcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVkYWN0aW9uIGEgcGF1c2UgY2FycmllcyB0byB0aGUgcmVzdW1lZCBydW4g4oCUIE5BTUVTIG9ubHksIG5ldmVyIGEgdmFsdWVcbiAqICh0aGUgY2hlY2twb2ludCBzdGF5cyByZWFsKTogdGhlIGtleXMgbWFya2VkIHNlY3JldCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1blxuICogKGEgcGVyLWNhbGwgYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYCwgYSBrZXkgdGhlIHBvbGljeSByZWRhY3RlZCB3aG9sZSwgYVxuICogc3ViZmxvdyBtYXBwZXIncyB0YWludCkgYW5kIHRoZSBmaWVsZHMgYSBtYXBwZXIgaGFuZGVkIHRvIGEgbmV3IGtleS4gUmVzdW1lXG4gKiBzZWVkcyB0aGUgcmVzdW1lZCBydW4ncyBydWxlIHdpdGggdGhlbSwgc28gYSBjb3B5IG1hZGUgYmVmb3JlIHRoZSBwYXVzZSBpc1xuICogc3RpbGwgbWFza2VkIGFmdGVyIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvbk1hcmtzIHtcbiAgcmVhZG9ubHkga2V5czogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBLZXkg4oaSIHRoZSBmaWVsZCBwYXRocyBhIG1hcHBlciBoYW5kZWQgaXQuIEFic2VudCB3aGVuIG5vbmUuICovXG4gIHJlYWRvbmx5IGZpZWxkcz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG59XG5cbi8qKiBUcnVlIGZvciBhIHdlbGwtZm9ybWVkIHtAbGluayBQYXVzZWRFeGVjdXRpb259ICh0d28gbm9uLWVtcHR5IHN0cmluZ3MpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGF1c2VkRXhlY3V0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGF1c2VkRXhlY3V0aW9uIHtcbiAgY29uc3QgdiA9IHZhbHVlIGFzIHsgcnVuSWQ/OiB1bmtub3duOyBydW50aW1lU3RhZ2VJZD86IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHY/LnJ1bklkID09PSAnc3RyaW5nJyAmJiB2LnJ1bklkICE9PSAnJyAmJiB0eXBlb2Ygdi5ydW50aW1lU3RhZ2VJZCA9PT0gJ3N0cmluZycgJiYgdi5ydW50aW1lU3RhZ2VJZCAhPT0gJydcbiAgKTtcbn1cblxuLyoqXG4gKiBUaHJvd24gYnkgYHNjb3BlLiRwYXVzZSgpYCB0byBzaWduYWwgdGhhdCBleGVjdXRpb24gc2hvdWxkIHN0b3BcbiAqIGFuZCBjcmVhdGUgYSBzZXJpYWxpemFibGUgY2hlY2twb2ludC5cbiAqXG4gKiBCdWJibGVzIHVwIHRocm91Z2ggU3ViZmxvd0V4ZWN1dG9yICh3aGljaCBwcmVwZW5kcyBzdWJmbG93IElEIHRvIHBhdGgpXG4gKiBhbmQgaXMgY2F1Z2h0IGJ5IEZsb3djaGFydFRyYXZlcnNlci9GbG93Q2hhcnRFeGVjdXRvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhdXNlU2lnbmFsIGV4dGVuZHMgRXJyb3Ige1xuICAvKiogRGF0YSBmcm9tICRwYXVzZSgpIOKAlCBxdWVzdGlvbiwgcmVhc29uLCBtZXRhZGF0YS4gKi9cbiAgcmVhZG9ubHkgcGF1c2VEYXRhOiB1bmtub3duO1xuICAvKiogSUQgb2YgdGhlIHN0YWdlIHRoYXQgY2FsbGVkICRwYXVzZSgpLiAqL1xuICByZWFkb25seSBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIT1cgdGhlIHBhdXNlIHdhcyByYWlzZWQg4oCUIGAnaW50ZXJydXB0J2Agd2hlbiBhIHN0YWdlIGJvZHkgY2FsbGVkXG4gICAqIGBpbnRlcnJ1cHQoc2NvcGUsIHBheWxvYWQpYCwgYWJzZW50IGZvciB0aGUgYGFkZFBhdXNhYmxlRnVuY3Rpb25gXG4gICAqIGV4ZWN1dGUvcmVzdW1lIHBhdGguIFNldCBhdCB0aGUgc3RhZ2UgYm91bmRhcnkgKGBTdGFnZVJ1bm5lcmApLCBjYXJyaWVkXG4gICAqIG9udG8gdGhlIGNoZWNrcG9pbnQsIGFuZCByZWFkIGJ5IGByZXN1bWUoKWAgdG8gcGljayB0aGUgcmUtZW50cnk6IGFuXG4gICAqIGludGVycnVwdGVkIHN0YWdlIHJlLXJ1bnMgaXRzIE9XTiBmdW5jdGlvbiBmcm9tIHRoZSB0b3AgKHN0YWdlcyBhcmVcbiAgICogYXRvbWljKSwgYSBwYXVzYWJsZSBzdGFnZSBydW5zIGl0cyBgcmVzdW1lRm5gLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF1c2VkQnk/OiAnaW50ZXJydXB0JztcbiAgLyoqIFBhdGggdGhyb3VnaCBzdWJmbG93cyB0byB0aGUgcGF1c2VkIHN0YWdlLiBCdWlsdCBkdXJpbmcgYnViYmxlLXVwLiAqL1xuICBwcml2YXRlIF9zdWJmbG93UGF0aDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEludm9rZXIgY29udGV4dCDigJQgZW5yaWNoZWQgZHVyaW5nIGJ1YmJsZS11cCB3aGVuIGEgUGF1c2VTaWduYWwgcGFzc2VzXG4gICAqIHRocm91Z2ggYSBkZWNpZGVyLCBzZWxlY3Rvciwgb3IgZm9yayBoYW5kbGVyLlxuICAgKlxuICAgKiBUaGUgaW52b2tlciBpcyB0aGUgc3RhZ2UgdGhhdCBjYWxsZWQgZXhlY3V0ZU5vZGUoKSBvbiB0aGUgcGF1c2VkIGNoaWxkLlxuICAgKiBDYXB0dXJlZCBkdXJpbmcgdHJhdmVyc2FsIChub3QgcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSB0cmVlKS4gKFRoZVxuICAgKiBpbnZva2VyJ3MgYC5uZXh0YCBpZCByb2RlIGJlc2lkZSBpdCB1bnRpbCA5LjM5LjAgYXNcbiAgICogYGNvbnRpbnVhdGlvblN0YWdlSWRgOyB3aGF0IHJ1bnMgYWZ0ZXIgYSByZXN1bWUgY29tZXMgZnJvbSB0aGUgY2hhcnRcbiAgICogc2luY2UgOS4yOC4wLCBzbyBpdCBpcyBubyBsb25nZXIgY2FycmllZC4pXG4gICAqL1xuICBwcml2YXRlIF9pbnZva2VyU3RhZ2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogU3ViZmxvdyBzY29wZSBjYXB0dXJlIOKAlCBwb3B1bGF0ZWQgZHVyaW5nIGJ1YmJsZS11cCBieVxuICAgKiBgU3ViZmxvd0V4ZWN1dG9yYCByaWdodCBiZWZvcmUgcmUtdGhyb3cuIEVhY2ggZW50cnkgaXMgb25lXG4gICAqIHN1YmZsb3cncyBwcmUtcGF1c2Ugc2hhcmVkIHN0YXRlLCBrZXllZCBieSB0aGUgcGF0aC1wcmVmaXhlZFxuICAgKiBzdWJmbG93IGlkIChtYXRjaGVzIGBzdWJmbG93UGF0aGApLlxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMsIHRoZSBuZXN0ZWQgYFNoYXJlZE1lbW9yeWAgaXMgZ2FyYmFnZS1jb2xsZWN0ZWRcbiAgICogYmVmb3JlIHRoZSBjaGVja3BvaW50IGlzIGJ1aWx0LiBPbiByZXN1bWUsIHRoZSBpbm5lciBydW50aW1lIGlzXG4gICAqIHJlLWNyZWF0ZWQgZW1wdHkgYW5kIHJlc3VtZSBoYW5kbGVycyByZWFkaW5nIHByZS1wYXVzZSBzY29wZVxuICAgKiAoZS5nLiwgYW4gQWdlbnQncyBgc2NvcGUuaGlzdG9yeWAsIGBzY29wZS5wYXVzZWRUb29sQ2FsbElkYClcbiAgICogY3Jhc2ggd2l0aCBcIlggaXMgbm90IGl0ZXJhYmxlXCIgLyB1bmRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIF9zdWJmbG93U3RhdGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSB7fTtcblxuICAvKipcbiAgICogUGF1c2VzIHRoYXQgUEFSQUxMRUwgU0lCTElOR1MgcmFpc2VkIGluIHRoZSBzYW1lIGZhbi1vdXQgYXMgdGhpcyBvbmUsXG4gICAqIHdhaXRpbmcgdGhlaXIgdHVybiAoOS4yOC4wKS4gUmVjb3JkZWQgYnkgYENoaWxkcmVuRXhlY3V0b3JgIHdoZW4gbW9yZVxuICAgKiB0aGFuIG9uZSBjaGlsZCBvZiBhIGZvcmsgKG9yIG1vcmUgdGhhbiBvbmUgc2VsZWN0ZWQgYnJhbmNoKSBwYXVzZXM6IHRoZVxuICAgKiBmaXJzdCBwYXVzZSBpcyB0aGUgb25lIHRoYXQgaXMgYXNrZWQsIHRoZSBvdGhlcnMgcmlkZSBoZXJlIGluc3RlYWQgb2ZcbiAgICogYmVpbmcgZHJvcHBlZC4gRWFjaCBwYXRoIGlzIHJlbGF0aXZlIHRvIHdoZXJlIHRoZSBzaWduYWwgY3VycmVudGx5IGlzXG4gICAqIGFuZCBncm93cyB3aXRoIGl0IOKAlCBgcHJlcGVuZFN1YmZsb3dgIHByZXBlbmRzIHRvIGV2ZXJ5IGVudHJ5IHRvby5cbiAgICovXG4gIHByaXZhdGUgX3BlbmRpbmdQYXVzZXM6IE11dGFibGVQZW5kaW5nUGF1c2VbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBXSElDSCBleGVjdXRpb24gcGF1c2VkIOKAlCBpdHMgcnVudGltZVN0YWdlSWQgc3RhbXBlZCBvbmNlIGF0IHRoZSBzdGFnZVxuICAgKiBib3VuZGFyeSAoYFN0YWdlUnVubmVyYCksIGl0cyBydW4gYWRkZWQgd2hlbiB0aGUgY2hlY2twb2ludCBpcyBidWlsdFxuICAgKiAoYGNvbXBsZXRlRXhlY3V0aW9uYCksIG9yIGJvdGggY2FycmllZCBvdmVyIGZvciBhIHF1ZXVlZCBzaWJsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcGF1c2VkRXhlY3V0aW9uPzogeyBydW50aW1lU3RhZ2VJZDogc3RyaW5nOyBydW5JZD86IHN0cmluZyB9O1xuXG4gIC8qKiBUaGUgcGF1c2VkIGV4ZWN1dGlvbidzIGlkZW1wb3RlbmN5IGtleSAoUDMpIOKAlCBhIHRvdWNoaW5nIHN0YWdlJ3MsIHN0YW1wZWQgb25jZSBhdCB0aGUgc3RhZ2UgYm91bmRhcnkuICovXG4gIHByaXZhdGUgX2lkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IHVua25vd24sIHN0YWdlSWQ6IHN0cmluZywgcGF1c2VkQnk/OiAnaW50ZXJydXB0Jykge1xuICAgIHN1cGVyKCdFeGVjdXRpb24gcGF1c2VkJyk7XG4gICAgdGhpcy5uYW1lID0gJ1BhdXNlU2lnbmFsJztcbiAgICB0aGlzLnBhdXNlRGF0YSA9IGRhdGE7XG4gICAgdGhpcy5zdGFnZUlkID0gc3RhZ2VJZDtcbiAgICBpZiAocGF1c2VkQnkpIHRoaXMucGF1c2VkQnkgPSBwYXVzZWRCeTtcbiAgICB0aGlzLl9zdWJmbG93UGF0aCA9IFtdO1xuICAgIC8vIFBhdXNlU2lnbmFsIGlzIGNvbnRyb2wgZmxvdywgbm90IGEgcmVhbCBlcnJvciDigJQgc3RhY2sgdHJhY2UgaGFzIG5vIGRpYWdub3N0aWMgdmFsdWUuXG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG5cbiAgZ2V0IHN1YmZsb3dQYXRoKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc3ViZmxvd1BhdGg7XG4gIH1cblxuICAvKiogVGhlIHBhdXNlZCBleGVjdXRpb24gKGl0cyBydW4gYW5kIGBbcGF0aC9dc3RhZ2VJZCNOYCksIG9uY2UgYm90aCBhcmUga25vd24uICovXG4gIGdldCBwYXVzZWRFeGVjdXRpb24oKTogUGF1c2VkRXhlY3V0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBlID0gdGhpcy5fcGF1c2VkRXhlY3V0aW9uO1xuICAgIHJldHVybiBlPy5ydW5JZCAhPT0gdW5kZWZpbmVkID8geyBydW5JZDogZS5ydW5JZCwgcnVudGltZVN0YWdlSWQ6IGUucnVudGltZVN0YWdlSWQgfSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgd2hpY2ggRVhFQ1VUSU9OIHBhdXNlZC4gRmlyc3Qgc3RhbXAgd2luczogdGhlIHNpZ25hbCBidWJibGVzXG4gICAqIHRocm91Z2ggb3V0ZXIgYm91bmRhcmllcyB0aGF0IG11c3Qgbm90IG92ZXJ3cml0ZSBpdC4gVGhlIHN0YWdlIGJvdW5kYXJ5XG4gICAqIGtub3dzIG9ubHkgdGhlIHJ1bnRpbWVTdGFnZUlkOyBhIHF1ZXVlZCBzaWJsaW5nIHJhaXNlZCBhZ2FpbiBvbiByZXN1bWVcbiAgICogY2FycmllcyBib3RoIChpdCBwYXVzZWQgaW4gYW4gRUFSTElFUiBydW4pLlxuICAgKi9cbiAgc3RhbXBFeGVjdXRpb24ocnVudGltZVN0YWdlSWQ6IHN0cmluZywgcnVuSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcGF1c2VkRXhlY3V0aW9uICE9PSB1bmRlZmluZWQgfHwgIXJ1bnRpbWVTdGFnZUlkKSByZXR1cm47XG4gICAgdGhpcy5fcGF1c2VkRXhlY3V0aW9uID0geyBydW50aW1lU3RhZ2VJZCwgLi4uKHJ1bklkICE9PSB1bmRlZmluZWQgJiYgeyBydW5JZCB9KSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVtcG90ZW5jeSBrZXkgdGhlIHBhdXNlZCBleGVjdXRpb24gcmFuIHVuZGVyIChQMykg4oCUIGEgdG91Y2hpbmcgc3RhZ2Uncy4gSXQgcmlkZXMgdGhlIGNoZWNrcG9pbnQgc28gdGhlXG4gICAqIHJlc3VtZSByZS1ydW5zIHRoZSBzdGFnZSAob3IgaXRzIGByZXN1bWVGbmApIHVuZGVyIHRoZSBTQU1FIGtleTogdGhlIGlucHV0IGl0cyBydWxlIHJlYWQgZG9lcyBub3QgY3Jvc3MgYVxuICAgKiByZXN1bWUuIEZpcnN0IHN0YW1wIHdpbnMuXG4gICAqL1xuICBnZXQgaWRlbXBvdGVuY3lLZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faWRlbXBvdGVuY3lLZXk7XG4gIH1cblxuICBzdGFtcElkZW1wb3RlbmN5S2V5KGtleTogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lkZW1wb3RlbmN5S2V5ID09PSB1bmRlZmluZWQgJiYga2V5ICE9PSB1bmRlZmluZWQpIHRoaXMuX2lkZW1wb3RlbmN5S2V5ID0ga2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIE5hbWUgdGhlIHJ1biBmb3IgZXZlcnkgcGF1c2Ugb24gdGhpcyBzaWduYWwgdGhhdCBwYXVzZWQgaW4gaXQg4oCUIHRoaXMgb25lXG4gICAqIGFuZCBpdHMgcXVldWVkIHNpYmxpbmdzIHRoYXQgZG8gbm90IGFscmVhZHkgY2FycnkgYSBydW4gKGEgc2libGluZyByYWlzZWRcbiAgICogYWdhaW4gb24gcmVzdW1lIGtlZXBzIHRoZSBydW4gaXQgcGF1c2VkIGluKS4gQ2FsbGVkIG9uY2UsIHdoZW4gdGhlXG4gICAqIGNoZWNrcG9pbnQgaXMgYnVpbHQuXG4gICAqL1xuICBjb21wbGV0ZUV4ZWN1dGlvbihydW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3BhdXNlZEV4ZWN1dGlvbiAmJiB0aGlzLl9wYXVzZWRFeGVjdXRpb24ucnVuSWQgPT09IHVuZGVmaW5lZCkgdGhpcy5fcGF1c2VkRXhlY3V0aW9uLnJ1bklkID0gcnVuSWQ7XG4gICAgZm9yIChjb25zdCBwZW5kaW5nIG9mIHRoaXMuX3BlbmRpbmdQYXVzZXMpIHtcbiAgICAgIGlmIChwZW5kaW5nLnBhdXNlZEV4ZWN1dGlvbiAmJiBwZW5kaW5nLnBhdXNlZEV4ZWN1dGlvbi5ydW5JZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBlbmRpbmcucGF1c2VkRXhlY3V0aW9uID0geyBydW50aW1lU3RhZ2VJZDogcGVuZGluZy5wYXVzZWRFeGVjdXRpb24ucnVudGltZVN0YWdlSWQsIHJ1bklkIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBlbmQgYSBzdWJmbG93IElEIHRvIHRoZSBwYXRoIChjYWxsZWQgZHVyaW5nIGJ1YmJsZS11cCkuIFRoZSBwZW5kaW5nXG4gICAqIHNpYmxpbmcgcGF1c2VzIHJpZGUgdGhlIHNhbWUgYm91bmRhcnksIHNvIHRoZWlyIHBhdGhzIGdyb3cgd2l0aCBpdC5cbiAgICovXG4gIHByZXBlbmRTdWJmbG93KHN1YmZsb3dJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc3ViZmxvd1BhdGgudW5zaGlmdChzdWJmbG93SWQpO1xuICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiB0aGlzLl9wZW5kaW5nUGF1c2VzKSBwZW5kaW5nLnN1YmZsb3dQYXRoLnVuc2hpZnQoc3ViZmxvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWV1ZSBhIHBhcmFsbGVsIHNpYmxpbmcncyBwYXVzZSBiZWhpbmQgdGhpcyBvbmUgKGl0cyBwYXRoIHJlbGF0aXZlIHRvXG4gICAqIHRoaXMgc2lnbmFsJ3MgY3VycmVudCBsZXZlbCkuIENvcGllZCBpbjogdGhlIGVudHJ5IGlzIG93bmVkIGJ5IHRoZVxuICAgKiBzaWduYWwgZnJvbSBoZXJlIG9uLlxuICAgKi9cbiAgYWRkUGVuZGluZ1BhdXNlKHBhdXNlOiBQZW5kaW5nUGF1c2UpOiB2b2lkIHtcbiAgICB0aGlzLl9wZW5kaW5nUGF1c2VzLnB1c2goe1xuICAgICAgcGF1c2VkU3RhZ2VJZDogcGF1c2UucGF1c2VkU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiBbLi4ucGF1c2Uuc3ViZmxvd1BhdGhdLFxuICAgICAgc3ViZmxvd1N0YXRlczogeyAuLi5wYXVzZS5zdWJmbG93U3RhdGVzIH0sXG4gICAgICAuLi4ocGF1c2UucGF1c2VEYXRhICE9PSB1bmRlZmluZWQgJiYgeyBwYXVzZURhdGE6IHBhdXNlLnBhdXNlRGF0YSB9KSxcbiAgICAgIC4uLihwYXVzZS5wYXVzZWRCeSAmJiB7IHBhdXNlZEJ5OiBwYXVzZS5wYXVzZWRCeSB9KSxcbiAgICAgIC4uLihwYXVzZS5wYXVzZWRFeGVjdXRpb24gJiZcbiAgICAgICAgdHlwZW9mIHBhdXNlLnBhdXNlZEV4ZWN1dGlvbi5ydW50aW1lU3RhZ2VJZCA9PT0gJ3N0cmluZycgJiYgeyBwYXVzZWRFeGVjdXRpb246IHsgLi4ucGF1c2UucGF1c2VkRXhlY3V0aW9uIH0gfSksXG4gICAgICAuLi4ocGF1c2UuaWRlbXBvdGVuY3lLZXkgIT09IHVuZGVmaW5lZCAmJiB7IGlkZW1wb3RlbmN5S2V5OiBwYXVzZS5pZGVtcG90ZW5jeUtleSB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRpbmcgYmVoaW5kIHRoaXMgb25lLCBpbiB0aGUgb3JkZXIgdGhleSB3aWxsXG4gICAqIGJlIGFza2VkLiBJbiBmbGlnaHQsIGEgc2libGluZyB0aGF0IHBhdXNlZCBpbiBUSElTIHJ1biBjYXJyaWVzIG9ubHkgaXRzXG4gICAqIHJ1bnRpbWVTdGFnZUlkOyBgY29tcGxldGVFeGVjdXRpb25gIChhdCBjaGVja3BvaW50IGJ1aWxkKSBhZGRzIHRoZSBydW4uXG4gICAqL1xuICBnZXQgcGVuZGluZ1BhdXNlcygpOiByZWFkb25seSBQZW5kaW5nUGF1c2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdQYXVzZXMgYXMgcmVhZG9ubHkgUGVuZGluZ1BhdXNlW107XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBwYXVzZSBhcyBhIHtAbGluayBQZW5kaW5nUGF1c2V9IOKAlCB3aGF0IGBDaGlsZHJlbkV4ZWN1dG9yYCBxdWV1ZXNcbiAgICogYmVoaW5kIGEgc2libGluZydzIHBhdXNlIHdoZW4gYm90aCBwYXVzZWQgaW4gb25lIGZhbi1vdXQuXG4gICAqL1xuICB0b1BlbmRpbmdQYXVzZSgpOiBQZW5kaW5nUGF1c2Uge1xuICAgIC8vIEluIGZsaWdodCAoc2VlIGBwZW5kaW5nUGF1c2VzYCk6IHRoZSBydW4gaXMgYWRkZWQgYXQgY2hlY2twb2ludCBidWlsZC5cbiAgICByZXR1cm4gPFBlbmRpbmdQYXVzZT57XG4gICAgICBwYXVzZWRTdGFnZUlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBzdWJmbG93UGF0aDogWy4uLnRoaXMuX3N1YmZsb3dQYXRoXSxcbiAgICAgIHN1YmZsb3dTdGF0ZXM6IHsgLi4udGhpcy5fc3ViZmxvd1N0YXRlcyB9LFxuICAgICAgLi4uKHRoaXMucGF1c2VEYXRhICE9PSB1bmRlZmluZWQgJiYgeyBwYXVzZURhdGE6IHRoaXMucGF1c2VEYXRhIH0pLFxuICAgICAgLi4uKHRoaXMucGF1c2VkQnkgJiYgeyBwYXVzZWRCeTogdGhpcy5wYXVzZWRCeSB9KSxcbiAgICAgIC4uLih0aGlzLl9wYXVzZWRFeGVjdXRpb24gJiYgeyBwYXVzZWRFeGVjdXRpb246IHsgLi4udGhpcy5fcGF1c2VkRXhlY3V0aW9uIH0gfSksXG4gICAgICAuLi4odGhpcy5faWRlbXBvdGVuY3lLZXkgIT09IHVuZGVmaW5lZCAmJiB7IGlkZW1wb3RlbmN5S2V5OiB0aGlzLl9pZGVtcG90ZW5jeUtleSB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFRoZSBzdGFnZSB0aGF0IGludm9rZWQgdGhlIHBhdXNlZCBjaGlsZCAoZGVjaWRlciwgc2VsZWN0b3IsIGZvcmspLiAqL1xuICBnZXQgaW52b2tlclN0YWdlSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlclN0YWdlSWQ7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgdGhlIGludm9rZXIgY29udGV4dCBkdXJpbmcgYnViYmxlLXVwLlxuICAgKiBDYWxsZWQgYnkgZGVjaWRlci9zZWxlY3Rvci9mb3JrIGhhbmRsZXJzIHdoZW4gY2F0Y2hpbmcgYSBjaGlsZCdzIFBhdXNlU2lnbmFsLlxuICAgKiBGaXJzdCBpbnZva2VyIHdpbnMgKGlubmVybW9zdCkg4oCUIHN1YnNlcXVlbnQgY2FsbHMgYXJlIG5vLW9wcy5cbiAgICovXG4gIHNldEludm9rZXIoaW52b2tlclN0YWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faW52b2tlclN0YWdlSWQpIHRoaXMuX2ludm9rZXJTdGFnZUlkID0gaW52b2tlclN0YWdlSWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FwdHVyZSBhIHN1YmZsb3cncyBpc29sYXRlZCBTaGFyZWRNZW1vcnkgYXQgdGhlIG1vbWVudCBpdHNcbiAgICogdHJhdmVyc2FsIHRocmV3LiBDYWxsZWQgYnkgYFN1YmZsb3dFeGVjdXRvcmAgb25jZSBwZXIgc3ViZmxvd1xuICAgKiBib3VuZGFyeSBvbiB0aGUgYnViYmxlLXVwIHBhdGguIEVhY2ggY2FwdHVyZSBpcyBrZXllZCBieSB0aGVcbiAgICogcGF0aC1wcmVmaXhlZCBzdWJmbG93IGlkICh0aGUgc2FtZSBpZCB1c2VkIGluIGBzdWJmbG93UGF0aGApLlxuICAgKlxuICAgKiBJbm5lcm1vc3QtZmlyc3Q6IGEgZGVlcCBgU2VxdWVuY2UoQWdlbnQoLi4uKSlgIHBhdXNlIGNhcHR1cmVzIHRoZVxuICAgKiBhZ2VudCdzIHN1YmZsb3cgZmlyc3QsIHRoZW4gaXRzIHBhcmVudCdzLCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdFxuICAgKiBtb3VudC4gVGhlIGZ1bGwgbmVzdCBzdXJ2aXZlcyBpbnRvIGBjaGVja3BvaW50LnN1YmZsb3dTdGF0ZXNgLlxuICAgKi9cbiAgY2FwdHVyZVN1YmZsb3dTY29wZShzdWJmbG93SWQ6IHN0cmluZywgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgLy8gRGVmZW5zaXZlIHNoYWxsb3cgY2xvbmUgc28gbGF0ZXIgbXV0YXRpb25zIG9uIHRoZSBzb3VyY2UgZG9uJ3RcbiAgICAvLyBibGVlZCBpbnRvIHRoZSBjYXB0dXJlZCBzbmFwc2hvdC4gRGVlcCBjbG9uaW5nIGlzIHRoZSBjb25zdW1lcidzXG4gICAgLy8gcmVzcG9uc2liaWxpdHkgKHRoZSByZXN1bWUgdGFyZ2V0IG1heSBub3QgZXZlbiBiZSBvbiB0aGlzXG4gICAgLy8gcHJvY2Vzcyk7IFNoYXJlZE1lbW9yeSB2YWx1ZXMgYXJlIGNvbnZlbnRpb25hbGx5IEpTT04tZnJpZW5kbHkuXG4gICAgdGhpcy5fc3ViZmxvd1N0YXRlc1tzdWJmbG93SWRdID0geyAuLi5zdGF0ZSB9O1xuICB9XG5cbiAgLyoqIENhcHR1cmVkIHN1YmZsb3cgc2NvcGVzIChyZWFkLW9ubHkgdmlldykuICovXG4gIGdldCBzdWJmbG93U3RhdGVzKCk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ge1xuICAgIHJldHVybiB0aGlzLl9zdWJmbG93U3RhdGVzO1xuICB9XG59XG5cbi8vIOKUgOKUgCBQZW5kaW5nUGF1c2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQSBwYXVzZSBhIFBBUkFMTEVMIFNJQkxJTkcgb2YgdGhlIHBhdXNlZCBzdGFnZSByYWlzZWQgaW4gdGhlIHNhbWUgZmFuLW91dCDigJRcbiAqIHR3byBjaGlsZHJlbiBvZiBvbmUgZm9yayAob3IgdHdvIHNlbGVjdGVkIGJyYW5jaGVzIG9mIG9uZSBzZWxlY3RvcikgdGhhdFxuICogYm90aCBwYXVzZWQgKDkuMjguMCkuIE9ubHkgb25lIHBhdXNlIGlzIGFza2VkIGF0IGEgdGltZTogdGhlIGNoZWNrcG9pbnQnc1xuICogb3duIChgcGF1c2VkU3RhZ2VJZGApLCB0aGVuIGVhY2ggb2YgdGhlc2UgaW4gdHVybiwgd2l0aCB0aGUgZmFuLW91dCdzIGpvaW5cbiAqIHJ1bm5pbmcgb25seSBvbmNlIGV2ZXJ5IGNoaWxkIGlzIGRvbmUuXG4gKlxuICogRXZlcnl0aGluZyBuZWVkZWQgdG8gcmFpc2UgdGhlIHNpYmxpbmcncyBwYXVzZSBhZ2FpbiBsYXRlciBXSVRIT1VUIHJlLXJ1bm5pbmdcbiAqIHRoZSBzaWJsaW5nOiBpdHMgc3RhZ2UsIGl0cyBwYXRoLCBpdHMgY2FwdHVyZWQgc3ViZmxvdyBzdGF0ZSwgaXRzIHF1ZXN0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBBIGZvcmsgd2hvc2UgdHdvIGNoaWxkcmVuIGJvdGggYXNrOiB0aGUgZmlyc3QgY2hlY2twb2ludCBhc2tzIGMxIGFuZFxuICogLy8gY2FycmllcyBjMidzIHBhdXNlOyByZXN1bWluZyBpdCBmaW5pc2hlcyBjMSwgdGhlbiBwYXVzZXMgd2l0aCBjMidzXG4gKiAvLyBxdWVzdGlvbjsgcmVzdW1pbmcgVEhBVCBmaW5pc2hlcyBjMiBhbmQgcnVucyB0aGUgam9pbi5cbiAqIGNvbnN0IGNwID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAqIGNwLnBhdXNlZFN0YWdlSWQ7ICAgICAgICAgICAgICAgICAgLy8gJ2MxL2FzaydcbiAqIGNwLnBlbmRpbmdQYXVzZXM/LlswXS5wYXVzZWRTdGFnZUlkOyAvLyAnYzIvYXNrJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ1BhdXNlIHtcbiAgLyoqIFRoZSBzaWJsaW5nJ3MgcGF1c2VkIHN0YWdlIChwYXRoLXByZWZpeGVkIGlkLCBhcyBgcGF1c2VkU3RhZ2VJZGApLiAqL1xuICByZWFkb25seSBwYXVzZWRTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBQYXRoIHRocm91Z2ggc3ViZmxvd3MgdG8gdGhlIHNpYmxpbmcncyBwYXVzZWQgc3RhZ2UgKGFzIGBzdWJmbG93UGF0aGApLiAqL1xuICByZWFkb25seSBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgc2libGluZydzIG93biBzdWJmbG93IGNhcHR1cmVzIOKAlCB0aGUgc3ViZmxvd3Mgb24gSVRTIHBhdGggYmVsb3cgdGhlXG4gICAqIGZhbi1vdXQuIFRoZSBzdWJmbG93cyBhYm92ZSB0aGUgZmFuLW91dCBhcmUgc2hhcmVkIHdpdGggdGhlIGNoZWNrcG9pbnQnc1xuICAgKiBvd24gcGF1c2UgYW5kIGFyZSBjYXB0dXJlZCBhZ2FpbiB3aGVuIHRoaXMgcGF1c2UgaXMgcmFpc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1N0YXRlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAvKiogVGhlIHNpYmxpbmcncyBxdWVzdGlvbiAoYXMgYHBhdXNlRGF0YWApLiAqL1xuICByZWFkb25seSBwYXVzZURhdGE/OiB1bmtub3duO1xuICAvKiogSG93IHRoZSBzaWJsaW5nIHBhdXNlZCAoYXMgYHBhdXNlZEJ5YCkuICovXG4gIHJlYWRvbmx5IHBhdXNlZEJ5PzogJ2ludGVycnVwdCc7XG4gIC8qKiBXaGljaCBleGVjdXRpb24gdGhlIHNpYmxpbmcgcGF1c2VkIGluIChhcyBgcGF1c2VkRXhlY3V0aW9uYCwgOS4zNy4wKSDigJQga2VwdCBzbyBpdHMgb3duIHJlc3VtZSBsaW5rcyB0byBpdC4gKi9cbiAgcmVhZG9ubHkgcGF1c2VkRXhlY3V0aW9uPzogUGF1c2VkRXhlY3V0aW9uO1xuICAvKiogVGhlIGlkZW1wb3RlbmN5IGtleSB0aGUgc2libGluZydzIGV4ZWN1dGlvbiByYW4gdW5kZXIgKGFzIGBpZGVtcG90ZW5jeUtleWAsIDEwLjEpLiAqL1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcbn1cblxuLyoqIEEgcGVuZGluZyBwYXVzZSB3aG9zZSBwYXRoIHN0aWxsIGdyb3dzIGFzIGl0cyBzaWduYWwgYnViYmxlcyB1cCAoaW50ZXJuYWwpLiAqL1xuLyoqXG4gKiBUaGUgc2lnbmFsJ3Mgb3duIGNvcHkgb2YgYSBwZW5kaW5nIHBhdXNlLiBJdHMgYHBhdXNlZEV4ZWN1dGlvbmAgbWF5IHN0aWxsXG4gKiBsYWNrIHRoZSBydW4gKGEgc2libGluZyB0aGF0IHBhdXNlZCBpbiBUSElTIHJ1bikgdW50aWwgYGNvbXBsZXRlRXhlY3V0aW9uYC5cbiAqL1xudHlwZSBNdXRhYmxlUGVuZGluZ1BhdXNlID0gT21pdDxQZW5kaW5nUGF1c2UsICdzdWJmbG93UGF0aCcgfCAncGF1c2VkRXhlY3V0aW9uJz4gJiB7XG4gIHN1YmZsb3dQYXRoOiBzdHJpbmdbXTtcbiAgcGF1c2VkRXhlY3V0aW9uPzogeyBydW50aW1lU3RhZ2VJZDogc3RyaW5nOyBydW5JZD86IHN0cmluZyB9O1xufTtcblxuLy8g4pSA4pSAIFBhdXNlUmVzdWx0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJldHVybmVkIGJ5IGEgcGF1c2FibGUgc3RhZ2UncyBleGVjdXRlL3Jlc3VtZSBmdW5jdGlvbiB0byBzaWduYWwgcGF1c2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4ZWN1dGU6IGFzeW5jIChzY29wZSkgPT4ge1xuICogICBzY29wZS5vcmRlcklkID0gJzEyMyc7XG4gKiAgIHJldHVybiB7IHBhdXNlOiB0cnVlLCBkYXRhOiB7IHF1ZXN0aW9uOiAnQXBwcm92ZSBvcmRlciAxMjM/JyB9IH07XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXVzZVJlc3VsdCB7XG4gIHJlYWRvbmx5IHBhdXNlOiB0cnVlO1xuICAvKiogRGF0YSB0byBpbmNsdWRlIGluIHRoZSBjaGVja3BvaW50IOKAlCBxdWVzdGlvbiwgcmVhc29uLCBtZXRhZGF0YS4gKi9cbiAgcmVhZG9ubHkgZGF0YT86IHVua25vd247XG59XG5cbi8vIOKUgOKUgCBGbG93Y2hhcnRDaGVja3BvaW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFNlcmlhbGl6YWJsZSBjaGVja3BvaW50IOKAlCBldmVyeXRoaW5nIG5lZWRlZCB0byByZXN1bWUgYSBwYXVzZWQgZmxvd2NoYXJ0LFxuICogYW5kIG5vdGhpbmcgYSByZXN1bWUgbmV2ZXIgcmVhZHMuXG4gKlxuICogTEVBTiAoZm9ybWF0IDIpOiBpdHMgc2l6ZSBpcyB0aGUgU1RBVEUncywgbmV2ZXIgdGhlIHJ1bidzIGxlbmd0aC4gVGhlIGN1cnNvclxuICogaXMgYHBhdXNlZFN0YWdlSWRgICsgYHN1YmZsb3dQYXRoYDsgdGhlIHN0YXRlIGlzIGBzaGFyZWRTdGF0ZWAgcGx1cyB0aGVcbiAqIGNhcHR1cmVzIG9mIHRoZSBzdWJmbG93cyBvbiB0aGF0IHBhdGggKGBzdWJmbG93U3RhdGVzYCkuIFRoZSBydW4ncyBoaXN0b3J5IOKAlFxuICogdGhlIGV4ZWN1dGlvbiB0cmVlLCB0aGUgZmluaXNoZWQgc3ViZmxvd3MnIHJlc3VsdHMsIHRoZSBjb21taXQgbG9nIOKAlCBpcyBub3RcbiAqIGhlcmU6IHJlYWQgaXQgZnJvbSBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWAgYmVmb3JlIGByZXN1bWUoKWAgKGZvcm1hdCAxXG4gKiBjYXJyaWVkIGBleGVjdXRpb25UcmVlYCBhbmQgYHN1YmZsb3dSZXN1bHRzYDsgbm8gcmVzdW1lIHJlYWQgdGhlbSkuXG4gKlxuICogSlNPTi1zYWZlOiBubyBmdW5jdGlvbnMsIG5vIGNsYXNzIGluc3RhbmNlcywgbm8gU0RLIGNsaWVudHMuXG4gKiBTdG9yZSBhbnl3aGVyZTogUmVkaXMsIFBvc3RncmVzLCBsb2NhbFN0b3JhZ2UsIGEgZmlsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKTsgLy8gYWZ0ZXIgcGF1c2VcbiAqIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAqXG4gKiAvLyBSZXN1bWUgKGhvdXJzIGxhdGVyLCBwb3NzaWJseSBkaWZmZXJlbnQgc2VydmVyKVxuICogY29uc3QgY2hlY2twb2ludCA9IEpTT04ucGFyc2UoYXdhaXQgcmVkaXMuZ2V0KGBzZXNzaW9uOiR7aWR9YCkpO1xuICogY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICogYXdhaXQgZXhlY3V0b3IucmVzdW1lKGNoZWNrcG9pbnQsIHsgYXBwcm92ZWQ6IHRydWUgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93Y2hhcnRDaGVja3BvaW50IHtcbiAgLyoqIFBhdXNlZCByb290LWxlZyBvYnNlcnZhdGlvbiBvbmx5LiBObyBoaXN0b3J5L3JlY29yZGVyIGRhdGEgb3Igc3RvcmFnZSBhY2tub3dsZWRnZW1lbnQgaXMgaW5jbHVkZWQuICovXG4gIHJlYWRvbmx5IGNhcHR1cmU/OiBpbXBvcnQoJy4uL2NhcHR1cmUvcmVhZFNvdXJjZXMuanMnKS5OYXRpdmVDYXB0dXJlT2JzZXJ2YXRpb247XG4gIC8qKlxuICAgKiBUaGUgY2hlY2twb2ludCBGT1JNQVQ6IGAyYCwgdGhlIGxlYW4gY2hlY2twb2ludCAoYDFgIGZyb20gOS4zOS4wOyBhYnNlbnRcbiAgICogYmVmb3JlKS4gYHJlc3VtZSgpYCByZWFkcyBldmVyeSBvbGRlciBvbmUgdGhyb3VnaCB0aGUgb25lIHVwY2FzdGVyXG4gICAqIChgcGF1c2UvcmVjb3JkLnRzIMK3IHVwY2FzdENoZWNrcG9pbnRgKSwgd2hpY2ggZHJvcHMgd2hhdCBsYXRlciBmb3JtYXRzXG4gICAqIGRyb3BwZWQg4oCUIGZvcm1hdCAxJ3MgYGV4ZWN1dGlvblRyZWVgIGFuZCBgc3ViZmxvd1Jlc3VsdHNgLCB0aGUgbGVnYWN5XG4gICAqIGBjb250aW51YXRpb25TdGFnZUlkYCDigJQgbm9uZSBvZiB3aGljaCBhIHJlc3VtZSBldmVyIHJlYWQuIEEgdmVyc2lvbiB0aGlzXG4gICAqIHJlbGVhc2UgZG9lcyBub3Qga25vdyBpcyByZWZ1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hlY2twb2ludFZlcnNpb24/OiAyO1xuXG4gIC8qKiBTY29wZSBzdGF0ZSBhdCB0aGUgcGF1c2UgcG9pbnQg4oCUIGFsbCBzaGFyZWQgbWVtb3J5IGtleS92YWx1ZXMuICovXG4gIHJlYWRvbmx5IHNoYXJlZFN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKiogSUQgb2YgdGhlIHN0YWdlIHRoYXQgcGF1c2VkLiBVc2VkIGJ5IHJlc3VtZSgpIHRvIGZpbmQgdGhlIG5vZGUgaW4gdGhlIGdyYXBoLiAqL1xuICByZWFkb25seSBwYXVzZWRTdGFnZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXVzZWQgRVhFQ1VUSU9OICg5LjM3LjApOiB0aGUgcnVuIHRoYXQgcGF1c2VkIGFuZCB0aGUgcGF1c2VkIHN0YWdlJ3NcbiAgICogcnVudGltZVN0YWdlSWQgaW4gaXQgKHRoZSBpZCBpdHMgYG9uUGF1c2VgIGV2ZW50IGFuZCBpdHMgY29tbWl0IGNhcnJ5KS5cbiAgICogUmVhZCBieSBgcmVzdW1lKClgIGludG8gdGhlIGBvblJlc3VtZWAgZXZlbnQncyBgdHJhdmVyc2FsQ29udGV4dC5yZXN1bWVkRnJvbWBcbiAgICogbGluayDigJQgbmV2ZXIgdXNlZCB0byBwbGFuIHRoZSByZS1lbnRyeS4gQWJzZW50IG9uIGFuIG9sZGVyIGNoZWNrcG9pbnQsXG4gICAqIHdoaWNoIHRoZW4gcmVzdW1lcyB3aXRob3V0IGEgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdXNlZEV4ZWN1dGlvbj86IFBhdXNlZEV4ZWN1dGlvbjtcblxuICAvKipcbiAgICogVGhlIGlkZW1wb3RlbmN5IGtleSB0aGUgcGF1c2VkIGV4ZWN1dGlvbiByYW4gdW5kZXIgKDEwLjEpIOKAlCBwcmVzZW50IG9ubHkgd2hlbiB0aGUgcGF1c2VkIHN0YWdlIGB0b3VjaGVzYCBhblxuICAgKiBvdXRzaWRlIHN5c3RlbSB3aXRoIGEga2V5IHJ1bGUuIGByZXN1bWUoKWAgcmUtcnVucyB0aGUgc3RhZ2UgKG9yIHJ1bnMgaXRzIGByZXN1bWVGbmApIHVuZGVyIFRISVMga2V5LCBuZXZlciBhXG4gICAqIHJlY29tcHV0ZWQgb25lOiB0aGUgaW5wdXQgdGhlIHJ1bGUgcmVhZCBkb2VzIG5vdCBjcm9zcyBhIHJlc3VtZSwgYW5kIGEgZGlmZmVyZW50IGtleSBvbiB0aGUgcmUtcnVuIHdvdWxkIG1ha2VcbiAgICogdGhlIG91dHNpZGUgc3lzdGVtIGFwcGx5IHRoZSBlZmZlY3QgdHdpY2UuIEEgcmVhbCB2YWx1ZSwgbGlrZSBgc2hhcmVkU3RhdGVgIOKAlCBubyByZWRhY3Rpb24gcG9saWN5IHRvdWNoZXMgdGhlXG4gICAqIGNoZWNrcG9pbnQuIEEgbWFsZm9ybWVkIG9uZSBpcyByZWZ1c2VkIGF0IGByZXN1bWUoKWAuXG4gICAqL1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcblxuICAvKiogUGF0aCB0aHJvdWdoIHN1YmZsb3dzIHRvIHRoZSBwYXVzZWQgc3RhZ2UgKGUuZy4sIFsnc2YtcGF5bWVudCcsICdzZi12YWxpZGF0aW9uJ10pLlxuICAgKiAgRW1wdHkgYXJyYXkgd2hlbiBwYXVzZWQgYXQgdGhlIHRvcCBsZXZlbC4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBEYXRhIGZyb20gJHBhdXNlKCkg4oCUIHF1ZXN0aW9uLCByZWFzb24sIG1ldGFkYXRhLiAqL1xuICByZWFkb25seSBwYXVzZURhdGE/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBIT1cgdGhlIHBhdXNlIHdhcyByYWlzZWQuIGAnaW50ZXJydXB0J2AgbWVhbnMgYSBzdGFnZSBib2R5IGNhbGxlZFxuICAgKiBgaW50ZXJydXB0KHNjb3BlLCB7IHJlYXNvbiwgZXhwZWN0cz8gfSlgIGFuZCBgcGF1c2VEYXRhYCBJUyB0aGF0IHBheWxvYWQ7XG4gICAqIGFic2VudCBtZWFucyB0aGUgYGFkZFBhdXNhYmxlRnVuY3Rpb25gIGV4ZWN1dGUvcmVzdW1lIHBhdGggKGV2ZXJ5XG4gICAqIGNoZWNrcG9pbnQgd3JpdHRlbiBiZWZvcmUgOS4xNC4wIG9taXRzIGl0LCB3aGljaCBpcyBleGFjdGx5IHJpZ2h0KS5cbiAgICpcbiAgICogYHJlc3VtZSgpYCByZWFkcyB0aGlzIHRvIHBpY2sgdGhlIHJlLWVudHJ5LCBhbmQgdGhlIHR3byBkaWZmZXIgYnkgbGF3OlxuICAgKiBhbiBpbnRlcnJ1cHRlZCBzdGFnZSBSRS1SVU5TIElUUyBPV04gRlVOQ1RJT04gRlJPTSBUSEUgVE9QIChzdGFnZXMgYXJlXG4gICAqIGF0b21pYyDigJQgdGhlIGFuc3dlciBjb21lcyBiYWNrIG91dCBvZiB0aGUgYGludGVycnVwdCgpYCBjYWxsKSwgd2hpbGUgYVxuICAgKiBwYXVzYWJsZSBzdGFnZSBydW5zIGl0cyBzZXBhcmF0ZSBgcmVzdW1lRm5gLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF1c2VkQnk/OiAnaW50ZXJydXB0JztcblxuICAvKipcbiAgICogU3ViZmxvdyBzY29wZSBjYXB0dXJlIOKAlCBvbmUgZW50cnkgcGVyIHN1YmZsb3cgYm91bmRhcnkgb24gdGhlIHBhdGhcbiAgICogdG8gdGhlIHBhdXNlZCBzdGFnZS4gS2V5ZWQgYnkgcGF0aC1wcmVmaXhlZCBzdWJmbG93IGlkIChtYXRjaGVzXG4gICAqIGBzdWJmbG93UGF0aGAgZW50cmllcykuIEVhY2ggdmFsdWUgaXMgdGhlIHN1YmZsb3cncyBwcmUtcGF1c2VcbiAgICogc2hhcmVkIHN0YXRlLlxuICAgKlxuICAgKiBBbHdheXMgcHJlc2VudCAoZW1wdHkgYHt9YCBmb3Igcm9vdC1sZXZlbCBwYXVzZXMgd2hlcmUgbm8gc3ViZmxvd3NcbiAgICogd2VyZSBlbnRlcmVkKS4gT24gcmVzdW1lLCBgU3ViZmxvd0V4ZWN1dG9yYCBzZWVkcyBlYWNoIG5lc3RlZCBydW50aW1lXG4gICAqIG9uIHRoZSBwYXRoIGZyb20gdGhpcyBtYXAg4oCUIE9OQ0UsIG9uIGl0cyBmaXJzdCBlbnRyeSwgaW4gcGxhY2Ugb2YgdGhlXG4gICAqIGlucHV0TWFwcGVyJ3MgdmFsdWVzICh0aGUgbWFwcGVyIHN0aWxsIHJ1bnMsIGZvciB0aGUgc3RhZ2VzJyByZWFkLW9ubHlcbiAgICogYXJncykg4oCUIHNvIHJlc3VtZSBoYW5kbGVycyBzZWUgcHJlLXBhdXNlIHNjb3BlIGFjcm9zcyBzYW1lLWV4ZWN1dG9yIEFORFxuICAgKiBjcm9zcy1leGVjdXRvciByZXN0YXJ0cy4gT25seSB0aGUgc3ViZmxvd3MgT04gYHN1YmZsb3dQYXRoYCByZWFkIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1N0YXRlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXG4gIC8qKlxuICAgKiBUaGUgc2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGF0IHRoZSBtb21lbnQgb2YgcGF1c2Ug4oCUIHRoZSBudW1iZXIgb2Ygc3RhZ2VzXG4gICAqIGV4ZWN1dGVkIHNvIGZhciB0aGlzIHJ1bi4gUmVzdW1lIHNlZWRzIGl0IHNvIHBvc3QtcmVzdW1lIGBydW50aW1lU3RhZ2VJZGBzXG4gICAqIChgc3RhZ2VJZCNleGVjdXRpb25JbmRleGApIGtlZXAgY2xpbWJpbmcgYW5kIG5ldmVyIGNvbGxpZGUgd2l0aCBwcmUtcGF1c2VcbiAgICogb25lcywgd2hpY2ggaXMgd2hhdCB0aGUgd2hvbGUgZXZlbnQtY29ycmVsYXRpb24gbW9kZWwgcmVzdHMgb24uXG4gICAqXG4gICAqIE9wdGlvbmFsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBhIGNoZWNrcG9pbnQgcGVyc2lzdGVkIGJlZm9yZSB0aGlzXG4gICAqIGZpZWxkIGV4aXN0ZWQgKG9sZGVyIFJlZGlzL1Bvc3RncmVzIHJvd3MpIHN0aWxsIHZhbGlkYXRlcyBhbmQgcmVzdW1lcyB3aXRoXG4gICAqIHRoZSBwcmV2aW91cyAoY291bnRlci1yZXN0YXJ0aW5nKSBiZWhhdmlvci5cbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvbkNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQZXItYHN0YWdlSWRgIGxvb3AgdmlzaXQgY291bnRzIGF0IHRoZSBtb21lbnQgb2YgcGF1c2UuIFJlc3VtZSBzZWVkcyB0aGVtXG4gICAqIHNvIGBUcmF2ZXJzYWxDb250ZXh0Lmxvb3BJdGVyYXRpb25gIHN0YXlzIGNvbnRpbnVvdXMgYWNyb3NzIHRoZSBwYXVzZSAoYVxuICAgKiBtaWQtbG9vcCByZXN1bWUga2VlcHMgY291bnRpbmcgdXAsIG5vdCByZXN0YXJ0aW5nIGF0IDApIGFuZCB0aGVcbiAgICogQ29udGludWF0aW9uUmVzb2x2ZXIgaXRlcmF0aW9uIGJ1ZGdldCBpcyBub3Qgc2lsZW50bHkgcmVmaWxsZWQuXG4gICAqXG4gICAqIE9wdGlvbmFsIGZvciB0aGUgc2FtZSBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IHJlYXNvbiBhcyBgZXhlY3V0aW9uQ291bnRgLlxuICAgKi9cbiAgcmVhZG9ubHkgdmlzaXRDb3VudHM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PjtcblxuICAvKiogU3RhZ2UgdGhhdCBpbnZva2VkIHRoZSBwYXVzZWQgY2hpbGQgKGRlY2lkZXIsIHNlbGVjdG9yLCBmb3JrKS4gQWJzZW50IGZvciBsaW5lYXIgcGF1c2VzLiAqL1xuICByZWFkb25seSBpbnZva2VyU3RhZ2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogUGF1c2VzIHJhaXNlZCBieSBQQVJBTExFTCBTSUJMSU5HUyBvZiB0aGUgcGF1c2VkIHN0YWdlIGluIHRoZSBzYW1lXG4gICAqIGZhbi1vdXQsIHdhaXRpbmcgdGhlaXIgdHVybiAoOS4yOC4wKSDigJQgc2VlIHtAbGluayBQZW5kaW5nUGF1c2V9LiBBYnNlbnRcbiAgICogd2hlbiBvbmx5IG9uZSBjaGlsZCBwYXVzZWQgKGV2ZXJ5IGNoZWNrcG9pbnQgYmVmb3JlIDkuMjguMCBvbWl0cyBpdCwgYW5kXG4gICAqIHJlc3VtZXMgZXhhY3RseSBhcyBiZWZvcmUpLiBSZXN1bWluZyB0aGlzIGNoZWNrcG9pbnQgZmluaXNoZXMgdGhlIHBhdXNlZFxuICAgKiBzdGFnZSdzIGNoaWxkLCB0aGVuIHBhdXNlcyBhZ2FpbiB3aXRoIHRoZSBmaXJzdCBvZiB0aGVzZTsgdGhlIGZhbi1vdXQnc1xuICAgKiBqb2luIHJ1bnMgb25jZSBldmVyeSBjaGlsZCBpcyBkb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFBlbmRpbmdQYXVzZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0aW9uIG1hcmtzIG9mIHRoZSBwYXVzZWQgcnVuIOKAlCBOQU1FUyBvbmx5IChzZWVcbiAgICoge0BsaW5rIFJlZGFjdGlvbk1hcmtzfSkuIEFic2VudCB3aGVuIHRoZSBydW4gbWFya2VkIG5vdGhpbmcgKG5vIHBvbGljeVxuICAgKiBhbmQgbm8gcGVyLWNhbGwgbWFyaywgb3IgYW4gb2xkZXIgY2hlY2twb2ludCk6IHRoZSByZXN1bWVkIHJ1biB0aGVuIHN0YXJ0c1xuICAgKiBmcm9tIGl0cyBwb2xpY3kgYWxvbmUuXG4gICAqL1xuICByZWFkb25seSByZWRhY3Rpb25NYXJrcz86IFJlZGFjdGlvbk1hcmtzO1xuXG4gIC8qKiBUaW1lc3RhbXAgb2Ygd2hlbiB0aGUgcGF1c2Ugb2NjdXJyZWQuICovXG4gIHJlYWRvbmx5IHBhdXNlZEF0OiBudW1iZXI7XG59XG5cbi8vIOKUgOKUgCBQYXVzYWJsZUhhbmRsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogSGFuZGxlciBmb3IgYSBwYXVzYWJsZSBzdGFnZSDigJQgaGFzIHR3byBwaGFzZXM6IGV4ZWN1dGUgYW5kIHJlc3VtZS5cbiAqXG4gKiBgZXhlY3V0ZWAgcnVucyB0aGUgZmlyc3QgdGltZS4gUmV0dXJuIGFueSBub24tdm9pZCB2YWx1ZSB0byBwYXVzZSAodGhhdCB2YWx1ZVxuICogYmVjb21lcyB0aGUgY2hlY2twb2ludCdzIGBwYXVzZURhdGFgKTsgcmV0dXJuIHZvaWQvdW5kZWZpbmVkIHRvIGNvbnRpbnVlIG5vcm1hbGx5LlxuICogYHJlc3VtZWAgcnVucyB3aGVuIHRoZSBmbG93Y2hhcnQgaXMgcmVzdW1lZC4gSXQgcmVjZWl2ZXMgdGhlIHJlc3VtZSBpbnB1dC5cbiAqXG4gKiBCb3RoIHBoYXNlcyByZWNlaXZlIHRoZSBzYW1lIHNjb3BlLiBBZnRlciBleGVjdXRlIHBhdXNlcywgdGhlIHNjb3BlIHN0YXRlXG4gKiBpcyBwcmVzZXJ2ZWQgaW4gdGhlIGNoZWNrcG9pbnQuIE9uIHJlc3VtZSwgdGhlIHNjb3BlIGlzIHJlc3RvcmVkIGJlZm9yZVxuICogY2FsbGluZyByZXN1bWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC5hZGRQYXVzYWJsZUZ1bmN0aW9uKCdBcHByb3ZlT3JkZXInLCB7XG4gKiAgIGV4ZWN1dGU6IGFzeW5jIChzY29wZSkgPT4ge1xuICogICAgIHNjb3BlLm9yZGVySWQgPSAnMTIzJztcbiAqICAgICBzY29wZS5hbW91bnQgPSAyOTk7XG4gKiAgICAgcmV0dXJuIHsgcXVlc3Rpb246IGBBcHByb3ZlICQke3Njb3BlLmFtb3VudH0gcmVmdW5kP2AgfTtcbiAqICAgfSxcbiAqICAgcmVzdW1lOiBhc3luYyAoc2NvcGUsIGlucHV0KSA9PiB7XG4gKiAgICAgc2NvcGUuYXBwcm92ZWQgPSBpbnB1dC5hcHByb3ZlZDtcbiAqICAgICBzY29wZS5hcHByb3ZlciA9IGlucHV0LmFwcHJvdmVyO1xuICogICB9LFxuICogfSwgJ2FwcHJvdmUtb3JkZXInLCAnTWFuYWdlciBhcHByb3ZhbCBnYXRlJylcbiAqXG4gKiAvLyBMYXRlciDigJQgcmVzdW1lIHdpdGggaHVtYW4ncyBhbnN3ZXJcbiAqIGF3YWl0IGV4ZWN1dG9yLnJlc3VtZShjaGVja3BvaW50LCB7IGFwcHJvdmVkOiB0cnVlLCBhcHByb3ZlcjogJ0phbmUnIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF1c2FibGVIYW5kbGVyPFRTY29wZSA9IGFueSwgVElucHV0ID0gdW5rbm93biwgVFBhdXNlRGF0YSA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIEZpcnN0LXJ1biBwaGFzZS4gUmV0dXJuIGRhdGEgdG8gcGF1c2UsIG9yIHZvaWQvdW5kZWZpbmVkIHRvIGNvbnRpbnVlIG5vcm1hbGx5LlxuICAgKlxuICAgKiBBbnkgbm9uLXZvaWQgcmV0dXJuIHZhbHVlIGJlY29tZXMgdGhlIGBwYXVzZURhdGFgIGluIHRoZSBjaGVja3BvaW50LlxuICAgKiBUaGUgY29uc3VtZXIgZGVmaW5lcyB0aGUgYFRQYXVzZURhdGFgIHR5cGUg4oCUIHRoZSBGRSB1c2VzIGl0IHRvIHJlbmRlclxuICAgKiB0aGUgcmlnaHQgVUkgKGZvcm0gZmllbGRzLCBhcHByb3ZhbCBidXR0b25zLCBldGMuKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBUUGF1c2VEYXRhID0geyBxdWVzdGlvbjogc3RyaW5nOyByaXNrTGV2ZWw6IHN0cmluZyB9XG4gICAqIGNvbnN0IGhhbmRsZXI6IFBhdXNhYmxlSGFuZGxlcjxNeVN0YXRlLCB7IGFwcHJvdmVkOiBib29sZWFuIH0sIHsgcXVlc3Rpb246IHN0cmluZzsgcmlza0xldmVsOiBzdHJpbmcgfT4gPSB7XG4gICAqICAgZXhlY3V0ZTogYXN5bmMgKHNjb3BlKSA9PiB7XG4gICAqICAgICByZXR1cm4geyBxdWVzdGlvbjogYEFwcHJvdmUgb3JkZXIgJHtzY29wZS5vcmRlcklkfT9gLCByaXNrTGV2ZWw6ICdoaWdoJyB9O1xuICAgKiAgIH0sXG4gICAqICAgcmVzdW1lOiBhc3luYyAoc2NvcGUsIGlucHV0KSA9PiB7XG4gICAqICAgICBzY29wZS5hcHByb3ZlZCA9IGlucHV0LmFwcHJvdmVkO1xuICAgKiAgIH0sXG4gICAqIH07XG4gICAqIGBgYFxuICAgKi9cbiAgZXhlY3V0ZTogKHNjb3BlOiBUU2NvcGUpID0+IFByb21pc2U8VFBhdXNlRGF0YSB8IHZvaWQ+IHwgVFBhdXNlRGF0YSB8IHZvaWQ7XG4gIC8qKlxuICAgKiBSZXN1bWUgcGhhc2UuIENhbGxlZCB3aXRoIHRoZSByZXN1bWUgaW5wdXQgd2hlbiBleGVjdXRpb24gY29udGludWVzLlxuICAgKlxuICAgKiBUaGUgc2NvcGUgaXMgcmVzdG9yZWQgZnJvbSB0aGUgY2hlY2twb2ludCdzIGBzaGFyZWRTdGF0ZWAuIFdyaXRlcyBkdXJpbmdcbiAgICogYHJlc3VtZWAgYXJlIGNvbW1pdHRlZCBhbmQgdmlzaWJsZSB0byBzdWJzZXF1ZW50IHN0YWdlcy5cbiAgICovXG4gIHJlc3VtZTogKHNjb3BlOiBUU2NvcGUsIGlucHV0OiBUSW5wdXQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xufVxuXG4vLyDilIDilIAgVHlwZSBndWFyZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBQYXVzZVJlc3VsdCAoc3RhZ2Ugd2FudHMgdG8gcGF1c2UpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGF1c2VSZXN1bHQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQYXVzZVJlc3VsdCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZSBhcyBQYXVzZVJlc3VsdCkucGF1c2UgPT09IHRydWU7XG59XG5cbi8qKiBDaGVjayBpZiBhbiBlcnJvciBpcyBhIFBhdXNlU2lnbmFsLiBVc2VzIGluc3RhbmNlb2YgKyBuYW1lIGJyYW5kIGZhbGxiYWNrIGZvciBjcm9zcy1yZWFsbSBzYWZldHkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXVzZVNpZ25hbChlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIFBhdXNlU2lnbmFsIHtcbiAgLy8gVG90YWw6IGEgUHJveHkgd2hvc2UgYGdldFByb3RvdHlwZU9mYCB0cmFwIHRocm93cyAob3IgYSByZXZva2VkIFByb3h5KVxuICAvLyBpcyBub3QgYSBzaWduYWwg4oCUIHRoZSBlbmdpbmUncyBjYXRjaCBibG9ja3MgYXNrIHRoaXMgZmlyc3QsIGFuZCBtdXN0XG4gIC8vIG5vdCB0cmFkZSB0aGUgc3RhZ2UncyB0aHJvd24gdmFsdWUgZm9yIHRoZSB0cmFwJ3MgZXJyb3IuXG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgUGF1c2VTaWduYWwgfHxcbiAgICAgIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgIGVycm9yLm5hbWUgPT09ICdQYXVzZVNpZ25hbCcgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCAncGF1c2VEYXRhJykgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCAnc3RhZ2VJZCcpKVxuICAgICk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19