footprintjs 4.17.2 → 6.0.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 (167) hide show
  1. package/CLAUDE.md +71 -9
  2. package/dist/advanced.js +2 -3
  3. package/dist/esm/advanced.js +2 -2
  4. package/dist/esm/index.js +3 -3
  5. package/dist/esm/lib/builder/FlowChartBuilder.js +359 -70
  6. package/dist/esm/lib/builder/index.js +1 -1
  7. package/dist/esm/lib/builder/structure/StructureRecorder.js +158 -0
  8. package/dist/esm/lib/builder/structure/StructureRecorderDispatcher.js +171 -0
  9. package/dist/esm/lib/builder/types.js +1 -1
  10. package/dist/esm/lib/decide/decide.js +9 -9
  11. package/dist/esm/lib/decide/evidence.js +2 -2
  12. package/dist/esm/lib/engine/errors/errorInfo.js +4 -3
  13. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +11 -2
  14. package/dist/esm/lib/engine/handlers/DeciderHandler.js +5 -7
  15. package/dist/esm/lib/engine/handlers/RuntimeStructureManager.js +2 -2
  16. package/dist/esm/lib/engine/handlers/SelectorHandler.js +9 -7
  17. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +7 -1
  18. package/dist/esm/lib/engine/handlers/index.js +1 -3
  19. package/dist/esm/lib/engine/handlers/types.js +2 -2
  20. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +14 -4
  21. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +5 -5
  22. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +8 -1
  23. package/dist/esm/lib/engine/narrative/types.js +1 -1
  24. package/dist/esm/lib/engine/runtimeStageId.js +64 -2
  25. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +30 -56
  26. package/dist/esm/lib/engine/types.js +1 -1
  27. package/dist/esm/lib/engine/walkSubflowSpec.js +144 -0
  28. package/dist/esm/lib/memory/StageContext.js +3 -3
  29. package/dist/esm/lib/memory/backtrack.js +1 -1
  30. package/dist/esm/lib/reactive/createTypedScope.js +5 -5
  31. package/dist/esm/lib/reactive/types.js +7 -7
  32. package/dist/esm/lib/recorder/BoundaryStateStore.js +167 -0
  33. package/dist/esm/lib/recorder/BoundaryStateTracker.js +4 -4
  34. package/dist/esm/lib/recorder/CombinedRecorder.js +9 -9
  35. package/dist/esm/lib/recorder/CommitRangeIndex.js +207 -0
  36. package/dist/esm/lib/recorder/CompositeRecorder.js +6 -6
  37. package/dist/esm/lib/recorder/EmitRecorder.js +3 -3
  38. package/dist/esm/lib/recorder/InOutRecorder.js +1 -1
  39. package/dist/esm/lib/recorder/KeyedStore.js +113 -0
  40. package/dist/esm/lib/recorder/QualityRecorder.js +2 -2
  41. package/dist/esm/lib/recorder/SequenceRecorder.js +2 -2
  42. package/dist/esm/lib/recorder/SequenceStore.js +195 -0
  43. package/dist/esm/lib/recorder/TopologyRecorder.js +1 -1
  44. package/dist/esm/lib/recorder/index.js +13 -3
  45. package/dist/esm/lib/runner/ExecutionRuntime.js +1 -1
  46. package/dist/esm/lib/runner/FlowChartExecutor.js +75 -44
  47. package/dist/esm/lib/runner/RunContext.js +2 -2
  48. package/dist/esm/lib/runner/RunnableChart.js +1 -1
  49. package/dist/esm/lib/runner/getSubtreeSnapshot.js +3 -2
  50. package/dist/esm/lib/runner/runId.js +65 -0
  51. package/dist/esm/lib/scope/ScopeFacade.js +6 -6
  52. package/dist/esm/lib/scope/index.js +1 -1
  53. package/dist/esm/lib/scope/recorders/DebugRecorder.js +4 -4
  54. package/dist/esm/lib/scope/recorders/MetricRecorder.js +2 -2
  55. package/dist/esm/lib/scope/recorders/index.js +1 -1
  56. package/dist/esm/lib/scope/types.js +1 -1
  57. package/dist/esm/recorders.js +1 -1
  58. package/dist/esm/trace.js +15 -2
  59. package/dist/index.js +3 -3
  60. package/dist/lib/builder/FlowChartBuilder.js +359 -70
  61. package/dist/lib/builder/index.js +1 -1
  62. package/dist/lib/builder/structure/StructureRecorder.js +159 -0
  63. package/dist/lib/builder/structure/StructureRecorderDispatcher.js +175 -0
  64. package/dist/lib/builder/types.js +1 -1
  65. package/dist/lib/decide/decide.js +9 -9
  66. package/dist/lib/decide/evidence.js +2 -2
  67. package/dist/lib/engine/errors/errorInfo.js +4 -3
  68. package/dist/lib/engine/handlers/ChildrenExecutor.js +11 -2
  69. package/dist/lib/engine/handlers/DeciderHandler.js +5 -7
  70. package/dist/lib/engine/handlers/RuntimeStructureManager.js +2 -2
  71. package/dist/lib/engine/handlers/SelectorHandler.js +9 -7
  72. package/dist/lib/engine/handlers/SubflowExecutor.js +7 -1
  73. package/dist/lib/engine/handlers/index.js +2 -5
  74. package/dist/lib/engine/handlers/types.js +2 -2
  75. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +14 -4
  76. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +5 -5
  77. package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +8 -1
  78. package/dist/lib/engine/narrative/types.js +1 -1
  79. package/dist/lib/engine/runtimeStageId.js +66 -3
  80. package/dist/lib/engine/traversal/FlowchartTraverser.js +30 -56
  81. package/dist/lib/engine/types.js +1 -1
  82. package/dist/lib/engine/walkSubflowSpec.js +148 -0
  83. package/dist/lib/memory/StageContext.js +3 -3
  84. package/dist/lib/memory/backtrack.js +1 -1
  85. package/dist/lib/reactive/createTypedScope.js +5 -5
  86. package/dist/lib/reactive/types.js +7 -7
  87. package/dist/lib/recorder/BoundaryStateStore.js +171 -0
  88. package/dist/lib/recorder/BoundaryStateTracker.js +4 -4
  89. package/dist/lib/recorder/CombinedRecorder.js +9 -9
  90. package/dist/lib/recorder/CommitRangeIndex.js +211 -0
  91. package/dist/lib/recorder/CompositeRecorder.js +6 -6
  92. package/dist/lib/recorder/EmitRecorder.js +3 -3
  93. package/dist/lib/recorder/InOutRecorder.js +1 -1
  94. package/dist/lib/recorder/KeyedStore.js +117 -0
  95. package/dist/lib/recorder/QualityRecorder.js +2 -2
  96. package/dist/lib/recorder/SequenceRecorder.js +2 -2
  97. package/dist/lib/recorder/SequenceStore.js +199 -0
  98. package/dist/lib/recorder/TopologyRecorder.js +1 -1
  99. package/dist/lib/recorder/index.js +19 -6
  100. package/dist/lib/runner/ExecutionRuntime.js +1 -1
  101. package/dist/lib/runner/FlowChartExecutor.js +75 -44
  102. package/dist/lib/runner/RunContext.js +2 -2
  103. package/dist/lib/runner/RunnableChart.js +1 -1
  104. package/dist/lib/runner/getSubtreeSnapshot.js +3 -2
  105. package/dist/lib/runner/runId.js +70 -0
  106. package/dist/lib/scope/ScopeFacade.js +6 -6
  107. package/dist/lib/scope/index.js +1 -1
  108. package/dist/lib/scope/recorders/DebugRecorder.js +4 -4
  109. package/dist/lib/scope/recorders/MetricRecorder.js +2 -2
  110. package/dist/lib/scope/recorders/index.js +1 -1
  111. package/dist/lib/scope/types.js +1 -1
  112. package/dist/recorders.js +1 -1
  113. package/dist/trace.js +21 -2
  114. package/dist/types/advanced.d.ts +4 -4
  115. package/dist/types/index.d.ts +6 -4
  116. package/dist/types/lib/builder/FlowChartBuilder.d.ts +110 -14
  117. package/dist/types/lib/builder/index.d.ts +2 -1
  118. package/dist/types/lib/builder/structure/StructureRecorder.d.ts +349 -0
  119. package/dist/types/lib/builder/structure/StructureRecorderDispatcher.d.ts +77 -0
  120. package/dist/types/lib/builder/types.d.ts +20 -6
  121. package/dist/types/lib/decide/evidence.d.ts +3 -3
  122. package/dist/types/lib/engine/errors/errorInfo.d.ts +3 -2
  123. package/dist/types/lib/engine/handlers/DeciderHandler.d.ts +3 -3
  124. package/dist/types/lib/engine/handlers/RuntimeStructureManager.d.ts +1 -1
  125. package/dist/types/lib/engine/handlers/SelectorHandler.d.ts +2 -2
  126. package/dist/types/lib/engine/handlers/index.d.ts +1 -2
  127. package/dist/types/lib/engine/handlers/types.d.ts +2 -9
  128. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
  129. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -4
  130. package/dist/types/lib/engine/narrative/types.d.ts +43 -4
  131. package/dist/types/lib/engine/runtimeStageId.d.ts +57 -1
  132. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +12 -6
  133. package/dist/types/lib/engine/types.d.ts +0 -26
  134. package/dist/types/lib/engine/walkSubflowSpec.d.ts +95 -0
  135. package/dist/types/lib/memory/StageContext.d.ts +2 -2
  136. package/dist/types/lib/memory/backtrack.d.ts +1 -1
  137. package/dist/types/lib/reactive/types.d.ts +7 -7
  138. package/dist/types/lib/recorder/BoundaryStateStore.d.ts +115 -0
  139. package/dist/types/lib/recorder/BoundaryStateTracker.d.ts +3 -3
  140. package/dist/types/lib/recorder/CombinedRecorder.d.ts +11 -11
  141. package/dist/types/lib/recorder/CommitRangeIndex.d.ts +147 -0
  142. package/dist/types/lib/recorder/CompositeRecorder.d.ts +8 -8
  143. package/dist/types/lib/recorder/EmitRecorder.d.ts +2 -2
  144. package/dist/types/lib/recorder/InOutRecorder.d.ts +1 -1
  145. package/dist/types/lib/recorder/KeyedStore.d.ts +70 -0
  146. package/dist/types/lib/recorder/QualityRecorder.d.ts +4 -4
  147. package/dist/types/lib/recorder/SequenceRecorder.d.ts +1 -1
  148. package/dist/types/lib/recorder/SequenceStore.d.ts +120 -0
  149. package/dist/types/lib/recorder/TopologyRecorder.d.ts +1 -1
  150. package/dist/types/lib/recorder/index.d.ts +5 -2
  151. package/dist/types/lib/runner/ExecutionRuntime.d.ts +1 -1
  152. package/dist/types/lib/runner/FlowChartExecutor.d.ts +40 -30
  153. package/dist/types/lib/runner/RunContext.d.ts +2 -2
  154. package/dist/types/lib/runner/RunnableChart.d.ts +2 -2
  155. package/dist/types/lib/runner/runId.d.ts +45 -0
  156. package/dist/types/lib/scope/ScopeFacade.d.ts +4 -4
  157. package/dist/types/lib/scope/index.d.ts +1 -1
  158. package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +4 -4
  159. package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +4 -4
  160. package/dist/types/lib/scope/recorders/index.d.ts +1 -1
  161. package/dist/types/lib/scope/types.d.ts +1 -1
  162. package/dist/types/recorders.d.ts +1 -1
  163. package/dist/types/trace.d.ts +8 -1
  164. package/package.json +1 -1
  165. package/dist/esm/lib/engine/handlers/ExtractorRunner.js +0 -122
  166. package/dist/lib/engine/handlers/ExtractorRunner.js +0 -126
  167. package/dist/types/lib/engine/handlers/ExtractorRunner.d.ts +0 -41
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * **Mental model — observers vs. bookkeepers:**
6
6
  *
7
- * `Recorder` / `FlowRecorder` / `EmitRecorder` / `CombinedRecorder`
7
+ * `ScopeRecorder` / `FlowRecorder` / `EmitRecorder` / `CombinedRecorder`
8
8
  * are OBSERVER interfaces — they describe how a recorder hears
9
9
  * events from the executor.
10
10
  *
@@ -57,8 +57,8 @@
57
57
  * - Aggregations across the whole run (totals, counts) — those are
58
58
  * `SequenceRecorder.aggregate()` / `KeyedRecorder.aggregate()`.
59
59
  *
60
- * - Stage-level concerns — those use `Recorder.onStageStart` /
61
- * `Recorder.onStageEnd`. This primitive operates at finer
60
+ * - Stage-level concerns — those use `ScopeRecorder.onStageStart` /
61
+ * `ScopeRecorder.onStageEnd`. This primitive operates at finer
62
62
  * granularity (events emitted DURING a stage execution).
63
63
  *
64
64
  * **Lifecycle contract — STRICT:**
@@ -260,4 +260,4 @@ export class BoundaryStateTracker {
260
260
  this.missedUpdates.clear();
261
261
  }
262
262
  }
263
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm91bmRhcnlTdGF0ZVRyYWNrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL0JvdW5kYXJ5U3RhdGVUcmFja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnSkc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFdkQsTUFBTSxPQUFnQixvQkFBb0I7SUFJeEMsMERBQTBEO0lBQ3pDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUVwRDs7b0RBRWdEO0lBQy9CLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUUzRCx1RUFBdUU7SUFFdkU7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNPLGFBQWEsQ0FBQyxHQUFXLEVBQUUsT0FBZTtRQUNsRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDeEMsT0FBTyxDQUFDLElBQUksQ0FDVixJQUFJLElBQUksQ0FBQyxFQUFFLG9CQUFvQixHQUFHLHFEQUFxRDtnQkFDckYsa0VBQWtFLENBQ3JFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLGNBQWMsQ0FBQyxHQUFXLEVBQUUsT0FBaUM7UUFDckUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7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Y2VzQ29udGVudCI6WyIvKipcbiAqIEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT4g4oCUIHRoaXJkIHN0b3JhZ2UgcHJpbWl0aXZlIG9uIHRoZSByZWNvcmRlclxuICogc2hlbGYsIGFsb25nc2lkZSBgU2VxdWVuY2VSZWNvcmRlcjxUPmAgYW5kIGBLZXllZFJlY29yZGVyPFQ+YC5cbiAqXG4gKiAqKk1lbnRhbCBtb2RlbCDigJQgb2JzZXJ2ZXJzIHZzLiBib29ra2VlcGVyczoqKlxuICpcbiAqICAgYFJlY29yZGVyYCAvIGBGbG93UmVjb3JkZXJgIC8gYEVtaXRSZWNvcmRlcmAgLyBgQ29tYmluZWRSZWNvcmRlcmBcbiAqICAgICBhcmUgT0JTRVJWRVIgaW50ZXJmYWNlcyDigJQgdGhleSBkZXNjcmliZSBob3cgYSByZWNvcmRlciBoZWFyc1xuICogICAgIGV2ZW50cyBmcm9tIHRoZSBleGVjdXRvci5cbiAqXG4gKiAgIGBTZXF1ZW5jZVJlY29yZGVyPFQ+YCAvIGBLZXllZFJlY29yZGVyPFQ+YCAvIGBCb3VuZGFyeVN0YXRlVHJhY2tlcjxUU3RhdGU+YFxuICogICAgIGFyZSBTVE9SQUdFIHByaW1pdGl2ZXMg4oCUIHRocmVlIGRpZmZlcmVudCBib29ra2VlcGluZyBzaGVsdmVzIHdpdGhcbiAqICAgICBkaWZmZXJlbnQgZHVyYWJpbGl0eSBhbmQgaW5kZXhpbmcgcHJvcGVydGllcy4gQSByZWFsIHJlY29yZGVyXG4gKiAgICAgY2xhc3MgdHlwaWNhbGx5IHBpY2tzIE9ORSBvYnNlcnZlciBpbnRlcmZhY2UgQU5EIE9ORSBzdG9yYWdlXG4gKiAgICAgc2hlbGYsIGNvbWJpbmluZyB0aGVtIHZpYSBgZXh0ZW5kcyArIGltcGxlbWVudHNgLlxuICpcbiAqICoqV2hhdCB0aGlzIHByaW1pdGl2ZSBhbnN3ZXJzOioqIFwiQXQgYW55IG1vbWVudCBkdXJpbmcgdGhlIHJ1biwgd2hhdFxuICogaXMgdGhlIExJVkUgdHJhbnNpZW50IHN0YXRlIG9mIGV2ZXJ5IGN1cnJlbnRseS1hY3RpdmUgYm91bmRhcnk/XCJcbiAqXG4gKiBBIFwiYm91bmRhcnlcIiBpcyBhIG1hdGNoZWQgZXZlbnQgcGFpciBgW3N0YXJ0LCBzdG9wXWAgYnJhY2tldGluZyBhblxuICogaW50ZXJ2YWwg4oCUIGZvciBleGFtcGxlLCBgKGxsbV9zdGFydCwgbGxtX2VuZClgIGZvciBhbiBMTE0gY2FsbCxcbiAqIGAodG9vbF9zdGFydCwgdG9vbF9lbmQpYCBmb3IgdG9vbCBleGVjdXRpb24sIGAodHVybl9zdGFydCwgdHVybl9lbmQpYFxuICogZm9yIGFuIGFnZW50IHR1cm4uIEJldHdlZW4gdGhlIGJyYWNrZXRzLCBpbnRlcm1lZGlhdGUgZXZlbnRzIGV2b2x2ZVxuICogdGhlIGJvdW5kYXJ5J3Mgc3RhdGUgKHRva2VuIGNodW5rcyBhY2N1bXVsYXRpbmcgaW50byBhIHBhcnRpYWxcbiAqIGFuc3dlciwgYXJncyBzdHJlYW1pbmcgaW4sIGV0Yy4pLiBPbiBgc3RvcGAsIHRoZSBzdGF0ZSBjbGVhcnMuXG4gKlxuICogQWxnb3JpdGhtaWNhbGx5IHRoaXMgaXMgdGhlICoqREZTIGJyYWNrZXQtc2VxdWVuY2UgcGF0dGVybioqIOKAlFxuICogc3RhY2stZnJhbWUgc3RhdGUgZHVyaW5nIGEgZ3JhcGgtdHJhdmVyc2FsIGludGVydmFsLiBTYW1lIHNoYXBlIHVzZWRcbiAqIGJ5IFRhcmphbidzIFNDQyBhbGdvcml0aG0sIHRyZWUgZGVjb21wb3NpdGlvbiwgYW5kIHB1c2gtZG93blxuICogYXV0b21hdGEuIFRoZSBgYWN0aXZlYCBtYXAgaXMgdGhlIG9wZW4tYnJhY2tldHMgc3RhY2sgYXQgYW55IG1vbWVudC5cbiAqXG4gKiAqKkNvbXBhcmlzb24gd2l0aCB0aGUgb3RoZXIgc3RvcmFnZSBwcmltaXRpdmVzOioqXG4gKlxuICogfCBQcmltaXRpdmUgICAgICAgICAgICAgICAgICAgICAgIHwgU3RvcmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGltZSBzY29wZSAgICAgICAgICB8IE1lbW9yeSAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18XG4gKiB8IGBTZXF1ZW5jZVJlY29yZGVyPFQ+YCAgICAgICAgICAgfCBhcHBlbmQtb25seSBvcmRlcmVkICsga2V5ZWQgZW50cmllcyAgfCBkdXJhYmxlIGFjcm9zcyBydW4gIHwgTyhOIGV2ZW50cykgfFxuICogfCBgS2V5ZWRSZWNvcmRlcjxUPmAgICAgICAgICAgICAgIHwgMToxIGVudHJ5IHBlciBgcnVudGltZVN0YWdlSWRgICAgICAgIHwgZHVyYWJsZSBhY3Jvc3MgcnVuICB8IE8oTiBzdGVwcykgIHxcbiAqIHwgYEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT5gICB8IHRyYW5zaWVudCBicmFja2V0LXNjb3BlZCBzdGF0ZSAgICAgICB8IGxpdmU7IGNsZWFycyBvbiBzdG9wIHwgTyhLIGFjdGl2ZSkgfFxuICpcbiAqICoqV2hlbiB0byBwaWNrIHdoaWNoOioqXG4gKlxuICogICAtIFwiSSBuZWVkIHRvIGtlZXAgYSBwZXJtYW5lbnQgbG9nIG9mIGV2ZXJ5IGV2ZW50IGZvciB0aW1lLXRyYXZlbFwiXG4gKiAgICAgIOKGkiBgU2VxdWVuY2VSZWNvcmRlcjxUPmBcbiAqICAgLSBcIkkgd2FudCBvbmUgZHVyYWJsZSByZWNvcmQgcGVyIHN0YWdlIGV4ZWN1dGlvbiAoZS5nLiwgbWV0cmljcylcIlxuICogICAgICDihpIgYEtleWVkUmVjb3JkZXI8VD5gXG4gKiAgIC0gXCJJIG5lZWQgdG8ga25vdyB3aGF0J3MgaGFwcGVuaW5nIFJJR0hUIE5PVyBpbnNpZGUgYW4gaW4tZmxpZ2h0XG4gKiAgICAgYm91bmRhcnkgKGUuZy4sIHBhcnRpYWwgTExNIHN0cmVhbSwgcGFydGlhbCB0b29sIGFyZ3MpXCJcbiAqICAgICAg4oaSIGBCb3VuZGFyeVN0YXRlVHJhY2tlcjxUU3RhdGU+YCAodGhpcyBjbGFzcylcbiAqXG4gKiAqKldoYXQgdGhpcyBpcyBOT1QgZm9yOioqXG4gKlxuICogICAtIFRpbWUtdHJhdmVsIHF1ZXJpZXMgKFwid2hhdCB3YXMgdGhlIHN0YXRlIGF0IHBhc3Qgc2xpZGVyIHN0ZXAgTj9cIilcbiAqICAgICDigJQgdHJhbnNpZW50IHN0YXRlIGNsZWFycyBvbiBzdG9wLiBGb3IgdGltZS10cmF2ZWwsIHNuYXBzaG90IHRoZVxuICogICAgIHN0YXRlIGF0IGVhY2ggZW1pdCBpbnRvIGEgc2VwYXJhdGUgYFNlcXVlbmNlUmVjb3JkZXI8VFN0YXRlPmAsXG4gKiAgICAgb3Igd2FpdCBmb3IgYSBmdXR1cmUgYEJvdW5kYXJ5U25hcHNob3RSZWNvcmRlcjxUU3RhdGU+YCBwcmltaXRpdmUuXG4gKlxuICogICAtIEFnZ3JlZ2F0aW9ucyBhY3Jvc3MgdGhlIHdob2xlIHJ1biAodG90YWxzLCBjb3VudHMpIOKAlCB0aG9zZSBhcmVcbiAqICAgICBgU2VxdWVuY2VSZWNvcmRlci5hZ2dyZWdhdGUoKWAgLyBgS2V5ZWRSZWNvcmRlci5hZ2dyZWdhdGUoKWAuXG4gKlxuICogICAtIFN0YWdlLWxldmVsIGNvbmNlcm5zIOKAlCB0aG9zZSB1c2UgYFJlY29yZGVyLm9uU3RhZ2VTdGFydGAgL1xuICogICAgIGBSZWNvcmRlci5vblN0YWdlRW5kYC4gVGhpcyBwcmltaXRpdmUgb3BlcmF0ZXMgYXQgZmluZXJcbiAqICAgICBncmFudWxhcml0eSAoZXZlbnRzIGVtaXR0ZWQgRFVSSU5HIGEgc3RhZ2UgZXhlY3V0aW9uKS5cbiAqXG4gKiAqKkxpZmVjeWNsZSBjb250cmFjdCDigJQgU1RSSUNUOioqXG4gKlxuICogICBFdmVyeSBgc3RhcnRCb3VuZGFyeShrZXksIC4uLilgIGNhbGwgTVVTVCBiZSBwYWlyZWQgd2l0aCBhXG4gKiAgIGBzdG9wQm91bmRhcnkoa2V5KWAgY2FsbC4gRmFpbHVyZSB0byB3aXJlIHRoZSBzdG9wIHNpZGUgcHJvZHVjZXMgYVxuICogICBtZW1vcnkgbGVhazogdGhlIGFjdGl2ZSBtYXAgZ3Jvd3Mgd2l0aG91dCBib3VuZCwgYW5kIGBnZXRBbGxBY3RpdmUoKWBcbiAqICAgcmV0dXJucyBzdGFsZSBlbnRyaWVzIHRoYXQgbG9vayBpbi1mbGlnaHQgYnV0IGFyZW4ndC4gQ29tbW9uIGNhdXNlOlxuICogICBzdWJjbGFzcyB3aXJlcyBgc3RhcnRgIHRvIG9uZSBldmVudCBoYW5kbGVyIGFuZCBmb3JnZXRzIHRvIHdpcmVcbiAqICAgYHN0b3BgLiAqKkFsd2F5cyB3aXJlIGJvdGggYXQgdGhlIHNhbWUgdGltZS4qKlxuICpcbiAqICAgRGV2IG1vZGUgKGBlbmFibGVEZXZNb2RlKClgKSBkZXRlY3RzIGxlYWtzIGF0IGBjbGVhcigpYCB0aW1lIOKAlFxuICogICB3YXJuaW5nIGluY2x1ZGVzIHRoZSBsZWFrZWQga2V5cyBzbyB5b3UgY2FuIGZpbmQgdGhlIG1pc3Npbmcgd2lyaW5nLlxuICpcbiAqICoqQ29uY3VycmVuY3kgLyBuZXN0aW5nOioqXG4gKlxuICogICAtIENvbmN1cnJlbnQgYm91bmRhcmllcyAocGFyYWxsZWwgYnJhbmNoZXMgd2l0aCB0d28gTExNIGNhbGxzXG4gKiAgICAgYWN0aXZlIGF0IG9uY2UpIHdvcmsgY29ycmVjdGx5OiBlYWNoIGlzIGtleWVkIGluZGVwZW5kZW50bHkgaW5cbiAqICAgICB0aGUgYWN0aXZlIG1hcC5cbiAqICAgLSBOZXN0ZWQgYm91bmRhcmllcyBvZiBESUZGRVJFTlQgS0lORFMgKEFnZW50IGJvdW5kYXJ5IGNvbnRhaW5zXG4gKiAgICAgTExNIGJvdW5kYXJ5KSByZXF1aXJlIFNFUEFSQVRFIHRyYWNrZXIgaW5zdGFuY2VzIOKAlCBvbmUgcGVyIGtpbmQuXG4gKiAgICAgVGhlIGJhc2UgY2xhc3MgdHJhY2tzIG9uZSBib3VuZGFyeSBraW5kIHBlciBpbnN0YW5jZS5cbiAqXG4gKiAqKktleSBjb252ZW50aW9uOioqXG4gKlxuICogICBUaGUgYGtleTogc3RyaW5nYCBpcyB3aGF0ZXZlciB5b3VyIHN1YmNsYXNzIHBpY2tzLiBDb252ZW50aW9uOlxuICogICB1c2UgYHJ1bnRpbWVTdGFnZUlkYCB3aGVuIHRoZSBib3VuZGFyeSBtYXBzIDE6MSB0byBhIHN0YWdlXG4gKiAgIGV4ZWN1dGlvbiDigJQgdGhpcyBnaXZlcyBmcmVlIGludGVyb3Agd2l0aCBgU2VxdWVuY2VSZWNvcmRlclxuICogICAuZ2V0RW50cmllc0ZvclN0ZXBgLCBgS2V5ZWRSZWNvcmRlci5nZXRCeUtleWAsIGBmaW5kQ29tbWl0YCAvXG4gKiAgIGBmaW5kTGFzdFdyaXRlcmAsIGFuZCB0aGUgcmVzdCBvZiB0aGUgdHJhY2UgZWNvc3lzdGVtLiBVc2UgYSBtb3JlXG4gKiAgIGdyYW51bGFyIGtleSAoZS5nLiwgYHRvb2xDYWxsSWRgKSBvbmx5IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlXG4gKiAgIGNvbmN1cnJlbnQgYm91bmRhcmllcyBXSVRISU4gb25lIHN0YWdlIGV4ZWN1dGlvbi5cbiAqXG4gKiBAZXhhbXBsZSBCdWlsZCBhIGxpdmUgTExNIHRyYWNrZXIgKGNvbWJpbmluZyBzdG9yYWdlICsgb2JzZXJ2ZXIpOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7XG4gKiAgIEJvdW5kYXJ5U3RhdGVUcmFja2VyLFxuICogICB0eXBlIENvbWJpbmVkUmVjb3JkZXIsXG4gKiAgIHR5cGUgRW1pdEV2ZW50LFxuICogfSBmcm9tICdmb290cHJpbnRqcyc7XG4gKlxuICogaW50ZXJmYWNlIExMTUxpdmVTdGF0ZSB7XG4gKiAgIHJlYWRvbmx5IHBhcnRpYWw6IHN0cmluZztcbiAqICAgcmVhZG9ubHkgdG9rZW5zOiBudW1iZXI7XG4gKiB9XG4gKlxuICogY2xhc3MgTGl2ZUxMTVRyYWNrZXJcbiAqICAgZXh0ZW5kcyBCb3VuZGFyeVN0YXRlVHJhY2tlcjxMTE1MaXZlU3RhdGU+ICAgLy8gU1RPUkFHRSBzaGVsZlxuICogICBpbXBsZW1lbnRzIENvbWJpbmVkUmVjb3JkZXIgICAgICAgICAgICAgICAgICAgLy8gT0JTRVJWRVIgaW50ZXJmYWNlXG4gKiB7XG4gKiAgIHJlYWRvbmx5IGlkID0gJ2xpdmUtbGxtJztcbiAqXG4gKiAgIC8vIE9ic2VydmVyIGhhbGYg4oCUIHRyYW5zbGF0ZSBldmVudHMgaW50byBicmFja2V0IG11dGF0aW9ucy5cbiAqICAgb25FbWl0KGV2ZW50OiBFbWl0RXZlbnQpOiB2b2lkIHtcbiAqICAgICBpZiAoZXZlbnQubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LnN0cmVhbS5sbG1fc3RhcnQnKSB7XG4gKiAgICAgICB0aGlzLnN0YXJ0Qm91bmRhcnkoZXZlbnQucnVudGltZVN0YWdlSWQsIHsgcGFydGlhbDogJycsIHRva2VuczogMCB9KTtcbiAqICAgICB9IGVsc2UgaWYgKGV2ZW50Lm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5zdHJlYW0ubGxtX2VuZCcpIHtcbiAqICAgICAgIHRoaXMuc3RvcEJvdW5kYXJ5KGV2ZW50LnJ1bnRpbWVTdGFnZUlkKTtcbiAqICAgICB9IGVsc2UgaWYgKGV2ZW50Lm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5zdHJlYW0udG9rZW4nKSB7XG4gKiAgICAgICB0aGlzLnVwZGF0ZUJvdW5kYXJ5KGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCAocykgPT4gKHtcbiAqICAgICAgICAgcGFydGlhbDogcy5wYXJ0aWFsICsgKGV2ZW50LnBheWxvYWQgYXMgeyBjb250ZW50OiBzdHJpbmcgfSkuY29udGVudCxcbiAqICAgICAgICAgdG9rZW5zOiBzLnRva2VucyArIDEsXG4gKiAgICAgICB9KSk7XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICAvLyBQdWJsaWMgcmVhZCBBUEkg4oCUIE8oMSkgYXQgYW55IG1vbWVudC5cbiAqICAgaXNJbkZsaWdodCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuaGFzQWN0aXZlOyB9XG4gKiAgIGdldFBhcnRpYWwoc3RhZ2VJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAqICAgICByZXR1cm4gdGhpcy5nZXRBY3RpdmUoc3RhZ2VJZCk/LnBhcnRpYWwgPz8gJyc7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBBdHRhY2hlZCB0aGUgc2FtZSB3YXkgYXMgYW55IG90aGVyIENvbWJpbmVkUmVjb3JkZXIuXG4gKiBjb25zdCB0cmFja2VyID0gbmV3IExpdmVMTE1UcmFja2VyKCk7XG4gKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKHRyYWNrZXIpO1xuICogYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gKlxuICogLy8gUmVhZCBsaXZlIHN0YXRlIGF0IGFueSB0aW1lIGR1cmluZyBvciBhZnRlciB0aGUgcnVuLlxuICogdHJhY2tlci5pc0luRmxpZ2h0KCk7XG4gKiB0cmFja2VyLmdldFBhcnRpYWwocmlkKTtcbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT4ge1xuICAvKiogU3RhYmxlIGlkIOKAlCBzYW1lIGlkZW1wb3RlbmN5IGNvbnRyYWN0IGFzIG90aGVyIHJlY29yZGVycy4gKi9cbiAgYWJzdHJhY3QgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKiogT3Blbi1icmFja2V0cyBzdGFjazoga2V5IOKGkiBjdXJyZW50IHRyYW5zaWVudCBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmUgPSBuZXcgTWFwPHN0cmluZywgVFN0YXRlPigpO1xuXG4gIC8qKiBQZXIta2V5IGNvdW50IG9mIGB1cGRhdGVCb3VuZGFyeWAgY2FsbHMgdGhhdCBsYW5kZWQgd2l0aG91dCBhXG4gICAqICBtYXRjaGluZyBhY3RpdmUgYm91bmRhcnkuIERyaXZlcyByYXRlLWxpbWl0ZWQgZGV2LW1vZGUgd2FybmluZ3NcbiAgICogIHNvIGEgc3R1Y2sgbG9vcCBkb2Vzbid0IHNwYW0gdGhlIGNvbnNvbGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbWlzc2VkVXBkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgLy8g4pSA4pSAIE11dGF0b3IgQVBJIChzdWJjbGFzcyBjYWxscyB0aGVzZSBmcm9tIG9ic2VydmVyIGhvb2tzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogT3BlbiBhIG5ldyBib3VuZGFyeSB3aXRoIGluaXRpYWwgdHJhbnNpZW50IHN0YXRlLlxuICAgKlxuICAgKiBJZiBhIGJvdW5kYXJ5IHdpdGggdGhlIHNhbWUgYGtleWAgaXMgYWxyZWFkeSBhY3RpdmUsIHRoZSBwcmlvclxuICAgKiBzdGF0ZSBpcyBvdmVyd3JpdHRlbiAobGFzdC13cml0ZXItd2lucykuIEluIGRldiBtb2RlLCBhIHdhcm5pbmdcbiAgICogaXMgbG9nZ2VkIGJlY2F1c2UgcmUtc3RhcnRpbmcgYW4gYWN0aXZlIGtleSB1c3VhbGx5IGluZGljYXRlcyBhXG4gICAqIG1pc3NlZCBgc3RvcEJvdW5kYXJ5YCBjYWxsIHVwc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IEJvdW5kYXJ5IGlkZW50aWZpZXIg4oCUIGJ5IGNvbnZlbnRpb24sIGBydW50aW1lU3RhZ2VJZGBcbiAgICogICAgICAgICAgICBmb3IgMToxLXdpdGgtc3RhZ2UgYm91bmRhcmllcywgb3IgYSBtb3JlIGdyYW51bGFyIGlkXG4gICAqICAgICAgICAgICAgKGUuZy4sIGB0b29sQ2FsbElkYCkgd2hlbiBtdWx0aXBsZSBjb25jdXJyZW50IGJvdW5kYXJpZXNcbiAgICogICAgICAgICAgICBydW4gd2l0aGluIG9uZSBzdGFnZSBleGVjdXRpb24uXG4gICAqIEBwYXJhbSBpbml0aWFsIEluaXRpYWwgc3RhdGUg4oCUIHR5cGVkIGJ5IGBUU3RhdGVgLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXJ0Qm91bmRhcnkoa2V5OiBzdHJpbmcsIGluaXRpYWw6IFRTdGF0ZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZS5oYXMoa2V5KSAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgWyR7dGhpcy5pZH1dIHN0YXJ0Qm91bmRhcnkoJyR7a2V5fScpIGNhbGxlZCB3aGlsZSBhbiBhY3RpdmUgYm91bmRhcnkgYWxyZWFkeSBleGlzdHMuIGAgK1xuICAgICAgICAgICdPdmVyd3JpdGluZyBwcmlvciBzdGF0ZSDigJQgbGlrZWx5IGEgbWlzc2VkIHN0b3BCb3VuZGFyeSB1cHN0cmVhbS4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmUuc2V0KGtleSwgaW5pdGlhbCk7XG4gIH1cblxuICAvKipcbiAgICogRXZvbHZlIHRoZSB0cmFuc2llbnQgc3RhdGUgb2YgYW4gYWN0aXZlIGJvdW5kYXJ5IHVzaW5nIGFuIHVwZGF0ZXJcbiAgICogZnVuY3Rpb24uIFNpbGVudCBuby1vcCBpZiBubyBib3VuZGFyeSBpcyBhY3RpdmUgZm9yIGBrZXlgXG4gICAqIChkZWZlbnNpdmUgYWdhaW5zdCBvdXQtb2Ytb3JkZXIgZXZlbnRzKS4gSW4gZGV2IG1vZGUsIGEgcmF0ZS1saW1pdGVkXG4gICAqIHdhcm5pbmcgaXMgbG9nZ2VkIG9uIHRoZSAxc3QsIDEwdGgsIGFuZCAxMDB0aCBtaXNzZWQgdXBkYXRlIHBlciBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgICAgICBCb3VuZGFyeSBpZGVudGlmaWVyIChtdXN0IG1hdGNoIGEgcHJpb3IgYHN0YXJ0Qm91bmRhcnlgKS5cbiAgICogQHBhcmFtIHVwZGF0ZXIgIFB1cmUgZnVuY3Rpb246IHByZXZpb3VzIHN0YXRlIOKGkiBuZXh0IHN0YXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUJvdW5kYXJ5KGtleTogc3RyaW5nLCB1cGRhdGVyOiAocHJldjogVFN0YXRlKSA9PiBUU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLmFjdGl2ZS5nZXQoa2V5KTtcbiAgICBpZiAoY3VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zdCBuID0gKHRoaXMubWlzc2VkVXBkYXRlcy5nZXQoa2V5KSA/PyAwKSArIDE7XG4gICAgICAgIHRoaXMubWlzc2VkVXBkYXRlcy5zZXQoa2V5LCBuKTtcbiAgICAgICAgaWYgKG4gPT09IDEpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFske3RoaXMuaWR9XSB1cGRhdGVCb3VuZGFyeSgnJHtrZXl9Jykg4oCUIG5vIGFjdGl2ZSBib3VuZGFyeS4gVXBkYXRlIGRyb3BwZWQuYCk7XG4gICAgICAgIH0gZWxzZSBpZiAobiA9PT0gMTAgfHwgbiA9PT0gMTAwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbJHt0aGlzLmlkfV0gdXBkYXRlQm91bmRhcnkoJyR7a2V5fScpIOKAlCAke259IGRyb3BwZWQgdXBkYXRlcy4gV2lyaW5nIGJ1Zz9gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZS5zZXQoa2V5LCB1cGRhdGVyKGN1cikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBib3VuZGFyeSBpZGVudGlmaWVkIGJ5IGBrZXlgIGFuZCByZXR1cm4gaXRzIEZJTkFMXG4gICAqIHRyYW5zaWVudCBzdGF0ZSAoZm9yIGFueSBjbGVhbnVwIHRoZSBzdWJjbGFzcyB3YW50cyDigJQgZS5nLiwgZW1pdCBhXG4gICAqIHNuYXBzaG90IHRvIGEgU2VxdWVuY2VSZWNvcmRlciBmb3IgZHVyYWJsZSBzdG9yYWdlKS5cbiAgICpcbiAgICogQHBhcmFtIGtleSBCb3VuZGFyeSBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyBUaGUgZmluYWwgc3RhdGUsIG9yIGB1bmRlZmluZWRgIGlmIG5vIGJvdW5kYXJ5IHdhcyBhY3RpdmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RvcEJvdW5kYXJ5KGtleTogc3RyaW5nKTogVFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmaW5hbCA9IHRoaXMuYWN0aXZlLmdldChrZXkpO1xuICAgIHRoaXMuYWN0aXZlLmRlbGV0ZShrZXkpO1xuICAgIHJldHVybiBmaW5hbDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkIEFQSSAoY29uc3VtZXJzIGNhbGwgdGhlc2Ug4oCUIE8oMSkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDdXJyZW50IHRyYW5zaWVudCBzdGF0ZSBvZiBPTkUgYWN0aXZlIGJvdW5kYXJ5LiBgdW5kZWZpbmVkYCBpZiBub1xuICAgKiAgYm91bmRhcnkgaXMgYWN0aXZlIGZvciBga2V5YC4gKi9cbiAgZ2V0QWN0aXZlKGtleTogc3RyaW5nKTogVFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmUuZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsIGN1cnJlbnRseS1hY3RpdmUgYm91bmRhcmllcy5cbiAgICpcbiAgICogKipUeXBlLW9ubHkgcmVhZG9ubHk6KiogdGhlIHJldHVybmVkIHJlZmVyZW5jZSBJUyB0aGUgaW50ZXJuYWwgTWFwLlxuICAgKiBUeXBlU2NyaXB0IHByZXZlbnRzIG11dGF0aW9uIHRocm91Z2ggdGhlIGBSZWFkb25seU1hcGAgdHlwZSwgYnV0IGFcbiAgICogcnVudGltZSBjYXN0IG9yIG5vbi1UUyBjb25zdW1lciBjYW4gbXV0YXRlIGl0IGFuZCBjb3JydXB0IGludGVybmFsXG4gICAqIHN0YXRlLiAqKkRvIG5vdCBtdXRhdGUuKipcbiAgICovXG4gIGdldEFsbEFjdGl2ZSgpOiBSZWFkb25seU1hcDxzdHJpbmcsIFRTdGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgfVxuXG4gIC8qKiBUcnVlIGlmIGFueSBib3VuZGFyeSBpcyBjdXJyZW50bHkgYWN0aXZlLiBPKDEpLiAqL1xuICBnZXQgaGFzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZS5zaXplID4gMDtcbiAgfVxuXG4gIC8qKiBOdW1iZXIgb2YgY3VycmVudGx5LWFjdGl2ZSBib3VuZGFyaWVzLiBPKDEpLiAqL1xuICBnZXQgYWN0aXZlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmUuc2l6ZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc2V0IGFsbCB0cmFuc2llbnQgc3RhdGUuIENhbGxlZCBieSBleGVjdXRvcnMgYmVmb3JlIGVhY2ggYHJ1bigpYFxuICAgKiBzbyBjb25zdW1lcnMgZ2V0IGEgY2xlYW4gc2xhdGUgcGVyIHJ1biDigJQgc2FtZSBsaWZlY3ljbGUgY29udHJhY3RcbiAgICogYXMgYFNlcXVlbmNlUmVjb3JkZXIuY2xlYXIoKWAuXG4gICAqXG4gICAqIEluIGRldiBtb2RlLCB3YXJucyBpZiBhbnkgYm91bmRhcmllcyBhcmUgc3RpbGwgYWN0aXZlIHdoZW4gY2FsbGVkXG4gICAqIOKAlCBsaWtlbHkgaW5kaWNhdGVzIGEgbWlzc2VkIGBzdG9wQm91bmRhcnlgIHVwc3RyZWFtLiBUaGUgbGVha2VkXG4gICAqIGtleXMgYXJlIGxpc3RlZCAodHJ1bmNhdGVkIHRvIDEwKSBzbyB0aGUgd2lyaW5nIGJ1ZyBpcyBmaW5kYWJsZS5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZS5zaXplID4gMCAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc3Qga2V5cyA9IFsuLi50aGlzLmFjdGl2ZS5rZXlzKCldO1xuICAgICAgY29uc3QgaGVhZCA9IGtleXMuc2xpY2UoMCwgMTApLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBtb3JlID0ga2V5cy5sZW5ndGggPiAxMCA/IGAgLi4uKCske2tleXMubGVuZ3RoIC0gMTB9IG1vcmUpYCA6ICcnO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgWyR7dGhpcy5pZH1dIGNsZWFyKCkgY2FsbGVkIHdpdGggJHt0aGlzLmFjdGl2ZS5zaXplfSBgICtcbiAgICAgICAgICAnc3RpbGwtYWN0aXZlIGJvdW5kYXJpZXMuIE1pc3NlZCBzdG9wQm91bmRhcnk/ICcgK1xuICAgICAgICAgIGBMZWFrZWQga2V5czogJHtoZWFkfSR7bW9yZX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmUuY2xlYXIoKTtcbiAgICB0aGlzLm1pc3NlZFVwZGF0ZXMuY2xlYXIoKTtcbiAgfVxufVxuIl19
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm91bmRhcnlTdGF0ZVRyYWNrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL0JvdW5kYXJ5U3RhdGVUcmFja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnSkc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFdkQsTUFBTSxPQUFnQixvQkFBb0I7SUFJeEMsMERBQTBEO0lBQ3pDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUVwRDs7b0RBRWdEO0lBQy9CLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUUzRCx1RUFBdUU7SUFFdkU7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNPLGFBQWEsQ0FBQyxHQUFXLEVBQUUsT0FBZTtRQUNsRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDeEMsT0FBTyxDQUFDLElBQUksQ0FDVixJQUFJLElBQUksQ0FBQyxFQUFFLG9CQUFvQixHQUFHLHFEQUFxRDtnQkFDckYsa0VBQWtFLENBQ3JFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLGNBQWMsQ0FBQyxHQUFXLEVBQUUsT0FBaUM7UUFDckUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7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Y2VzQ29udGVudCI6WyIvKipcbiAqIEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT4g4oCUIHRoaXJkIHN0b3JhZ2UgcHJpbWl0aXZlIG9uIHRoZSByZWNvcmRlclxuICogc2hlbGYsIGFsb25nc2lkZSBgU2VxdWVuY2VSZWNvcmRlcjxUPmAgYW5kIGBLZXllZFJlY29yZGVyPFQ+YC5cbiAqXG4gKiAqKk1lbnRhbCBtb2RlbCDigJQgb2JzZXJ2ZXJzIHZzLiBib29ra2VlcGVyczoqKlxuICpcbiAqICAgYFNjb3BlUmVjb3JkZXJgIC8gYEZsb3dSZWNvcmRlcmAgLyBgRW1pdFJlY29yZGVyYCAvIGBDb21iaW5lZFJlY29yZGVyYFxuICogICAgIGFyZSBPQlNFUlZFUiBpbnRlcmZhY2VzIOKAlCB0aGV5IGRlc2NyaWJlIGhvdyBhIHJlY29yZGVyIGhlYXJzXG4gKiAgICAgZXZlbnRzIGZyb20gdGhlIGV4ZWN1dG9yLlxuICpcbiAqICAgYFNlcXVlbmNlUmVjb3JkZXI8VD5gIC8gYEtleWVkUmVjb3JkZXI8VD5gIC8gYEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT5gXG4gKiAgICAgYXJlIFNUT1JBR0UgcHJpbWl0aXZlcyDigJQgdGhyZWUgZGlmZmVyZW50IGJvb2trZWVwaW5nIHNoZWx2ZXMgd2l0aFxuICogICAgIGRpZmZlcmVudCBkdXJhYmlsaXR5IGFuZCBpbmRleGluZyBwcm9wZXJ0aWVzLiBBIHJlYWwgcmVjb3JkZXJcbiAqICAgICBjbGFzcyB0eXBpY2FsbHkgcGlja3MgT05FIG9ic2VydmVyIGludGVyZmFjZSBBTkQgT05FIHN0b3JhZ2VcbiAqICAgICBzaGVsZiwgY29tYmluaW5nIHRoZW0gdmlhIGBleHRlbmRzICsgaW1wbGVtZW50c2AuXG4gKlxuICogKipXaGF0IHRoaXMgcHJpbWl0aXZlIGFuc3dlcnM6KiogXCJBdCBhbnkgbW9tZW50IGR1cmluZyB0aGUgcnVuLCB3aGF0XG4gKiBpcyB0aGUgTElWRSB0cmFuc2llbnQgc3RhdGUgb2YgZXZlcnkgY3VycmVudGx5LWFjdGl2ZSBib3VuZGFyeT9cIlxuICpcbiAqIEEgXCJib3VuZGFyeVwiIGlzIGEgbWF0Y2hlZCBldmVudCBwYWlyIGBbc3RhcnQsIHN0b3BdYCBicmFja2V0aW5nIGFuXG4gKiBpbnRlcnZhbCDigJQgZm9yIGV4YW1wbGUsIGAobGxtX3N0YXJ0LCBsbG1fZW5kKWAgZm9yIGFuIExMTSBjYWxsLFxuICogYCh0b29sX3N0YXJ0LCB0b29sX2VuZClgIGZvciB0b29sIGV4ZWN1dGlvbiwgYCh0dXJuX3N0YXJ0LCB0dXJuX2VuZClgXG4gKiBmb3IgYW4gYWdlbnQgdHVybi4gQmV0d2VlbiB0aGUgYnJhY2tldHMsIGludGVybWVkaWF0ZSBldmVudHMgZXZvbHZlXG4gKiB0aGUgYm91bmRhcnkncyBzdGF0ZSAodG9rZW4gY2h1bmtzIGFjY3VtdWxhdGluZyBpbnRvIGEgcGFydGlhbFxuICogYW5zd2VyLCBhcmdzIHN0cmVhbWluZyBpbiwgZXRjLikuIE9uIGBzdG9wYCwgdGhlIHN0YXRlIGNsZWFycy5cbiAqXG4gKiBBbGdvcml0aG1pY2FsbHkgdGhpcyBpcyB0aGUgKipERlMgYnJhY2tldC1zZXF1ZW5jZSBwYXR0ZXJuKiog4oCUXG4gKiBzdGFjay1mcmFtZSBzdGF0ZSBkdXJpbmcgYSBncmFwaC10cmF2ZXJzYWwgaW50ZXJ2YWwuIFNhbWUgc2hhcGUgdXNlZFxuICogYnkgVGFyamFuJ3MgU0NDIGFsZ29yaXRobSwgdHJlZSBkZWNvbXBvc2l0aW9uLCBhbmQgcHVzaC1kb3duXG4gKiBhdXRvbWF0YS4gVGhlIGBhY3RpdmVgIG1hcCBpcyB0aGUgb3Blbi1icmFja2V0cyBzdGFjayBhdCBhbnkgbW9tZW50LlxuICpcbiAqICoqQ29tcGFyaXNvbiB3aXRoIHRoZSBvdGhlciBzdG9yYWdlIHByaW1pdGl2ZXM6KipcbiAqXG4gKiB8IFByaW1pdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgfCBTdG9yZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaW1lIHNjb3BlICAgICAgICAgIHwgTWVtb3J5ICAgICAgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXxcbiAqIHwgYFNlcXVlbmNlUmVjb3JkZXI8VD5gICAgICAgICAgICB8IGFwcGVuZC1vbmx5IG9yZGVyZWQgKyBrZXllZCBlbnRyaWVzICB8IGR1cmFibGUgYWNyb3NzIHJ1biAgfCBPKE4gZXZlbnRzKSB8XG4gKiB8IGBLZXllZFJlY29yZGVyPFQ+YCAgICAgICAgICAgICAgfCAxOjEgZW50cnkgcGVyIGBydW50aW1lU3RhZ2VJZGAgICAgICAgfCBkdXJhYmxlIGFjcm9zcyBydW4gIHwgTyhOIHN0ZXBzKSAgfFxuICogfCBgQm91bmRhcnlTdGF0ZVRyYWNrZXI8VFN0YXRlPmAgIHwgdHJhbnNpZW50IGJyYWNrZXQtc2NvcGVkIHN0YXRlICAgICAgIHwgbGl2ZTsgY2xlYXJzIG9uIHN0b3AgfCBPKEsgYWN0aXZlKSB8XG4gKlxuICogKipXaGVuIHRvIHBpY2sgd2hpY2g6KipcbiAqXG4gKiAgIC0gXCJJIG5lZWQgdG8ga2VlcCBhIHBlcm1hbmVudCBsb2cgb2YgZXZlcnkgZXZlbnQgZm9yIHRpbWUtdHJhdmVsXCJcbiAqICAgICAg4oaSIGBTZXF1ZW5jZVJlY29yZGVyPFQ+YFxuICogICAtIFwiSSB3YW50IG9uZSBkdXJhYmxlIHJlY29yZCBwZXIgc3RhZ2UgZXhlY3V0aW9uIChlLmcuLCBtZXRyaWNzKVwiXG4gKiAgICAgIOKGkiBgS2V5ZWRSZWNvcmRlcjxUPmBcbiAqICAgLSBcIkkgbmVlZCB0byBrbm93IHdoYXQncyBoYXBwZW5pbmcgUklHSFQgTk9XIGluc2lkZSBhbiBpbi1mbGlnaHRcbiAqICAgICBib3VuZGFyeSAoZS5nLiwgcGFydGlhbCBMTE0gc3RyZWFtLCBwYXJ0aWFsIHRvb2wgYXJncylcIlxuICogICAgICDihpIgYEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT5gICh0aGlzIGNsYXNzKVxuICpcbiAqICoqV2hhdCB0aGlzIGlzIE5PVCBmb3I6KipcbiAqXG4gKiAgIC0gVGltZS10cmF2ZWwgcXVlcmllcyAoXCJ3aGF0IHdhcyB0aGUgc3RhdGUgYXQgcGFzdCBzbGlkZXIgc3RlcCBOP1wiKVxuICogICAgIOKAlCB0cmFuc2llbnQgc3RhdGUgY2xlYXJzIG9uIHN0b3AuIEZvciB0aW1lLXRyYXZlbCwgc25hcHNob3QgdGhlXG4gKiAgICAgc3RhdGUgYXQgZWFjaCBlbWl0IGludG8gYSBzZXBhcmF0ZSBgU2VxdWVuY2VSZWNvcmRlcjxUU3RhdGU+YCxcbiAqICAgICBvciB3YWl0IGZvciBhIGZ1dHVyZSBgQm91bmRhcnlTbmFwc2hvdFJlY29yZGVyPFRTdGF0ZT5gIHByaW1pdGl2ZS5cbiAqXG4gKiAgIC0gQWdncmVnYXRpb25zIGFjcm9zcyB0aGUgd2hvbGUgcnVuICh0b3RhbHMsIGNvdW50cykg4oCUIHRob3NlIGFyZVxuICogICAgIGBTZXF1ZW5jZVJlY29yZGVyLmFnZ3JlZ2F0ZSgpYCAvIGBLZXllZFJlY29yZGVyLmFnZ3JlZ2F0ZSgpYC5cbiAqXG4gKiAgIC0gU3RhZ2UtbGV2ZWwgY29uY2VybnMg4oCUIHRob3NlIHVzZSBgU2NvcGVSZWNvcmRlci5vblN0YWdlU3RhcnRgIC9cbiAqICAgICBgU2NvcGVSZWNvcmRlci5vblN0YWdlRW5kYC4gVGhpcyBwcmltaXRpdmUgb3BlcmF0ZXMgYXQgZmluZXJcbiAqICAgICBncmFudWxhcml0eSAoZXZlbnRzIGVtaXR0ZWQgRFVSSU5HIGEgc3RhZ2UgZXhlY3V0aW9uKS5cbiAqXG4gKiAqKkxpZmVjeWNsZSBjb250cmFjdCDigJQgU1RSSUNUOioqXG4gKlxuICogICBFdmVyeSBgc3RhcnRCb3VuZGFyeShrZXksIC4uLilgIGNhbGwgTVVTVCBiZSBwYWlyZWQgd2l0aCBhXG4gKiAgIGBzdG9wQm91bmRhcnkoa2V5KWAgY2FsbC4gRmFpbHVyZSB0byB3aXJlIHRoZSBzdG9wIHNpZGUgcHJvZHVjZXMgYVxuICogICBtZW1vcnkgbGVhazogdGhlIGFjdGl2ZSBtYXAgZ3Jvd3Mgd2l0aG91dCBib3VuZCwgYW5kIGBnZXRBbGxBY3RpdmUoKWBcbiAqICAgcmV0dXJucyBzdGFsZSBlbnRyaWVzIHRoYXQgbG9vayBpbi1mbGlnaHQgYnV0IGFyZW4ndC4gQ29tbW9uIGNhdXNlOlxuICogICBzdWJjbGFzcyB3aXJlcyBgc3RhcnRgIHRvIG9uZSBldmVudCBoYW5kbGVyIGFuZCBmb3JnZXRzIHRvIHdpcmVcbiAqICAgYHN0b3BgLiAqKkFsd2F5cyB3aXJlIGJvdGggYXQgdGhlIHNhbWUgdGltZS4qKlxuICpcbiAqICAgRGV2IG1vZGUgKGBlbmFibGVEZXZNb2RlKClgKSBkZXRlY3RzIGxlYWtzIGF0IGBjbGVhcigpYCB0aW1lIOKAlFxuICogICB3YXJuaW5nIGluY2x1ZGVzIHRoZSBsZWFrZWQga2V5cyBzbyB5b3UgY2FuIGZpbmQgdGhlIG1pc3Npbmcgd2lyaW5nLlxuICpcbiAqICoqQ29uY3VycmVuY3kgLyBuZXN0aW5nOioqXG4gKlxuICogICAtIENvbmN1cnJlbnQgYm91bmRhcmllcyAocGFyYWxsZWwgYnJhbmNoZXMgd2l0aCB0d28gTExNIGNhbGxzXG4gKiAgICAgYWN0aXZlIGF0IG9uY2UpIHdvcmsgY29ycmVjdGx5OiBlYWNoIGlzIGtleWVkIGluZGVwZW5kZW50bHkgaW5cbiAqICAgICB0aGUgYWN0aXZlIG1hcC5cbiAqICAgLSBOZXN0ZWQgYm91bmRhcmllcyBvZiBESUZGRVJFTlQgS0lORFMgKEFnZW50IGJvdW5kYXJ5IGNvbnRhaW5zXG4gKiAgICAgTExNIGJvdW5kYXJ5KSByZXF1aXJlIFNFUEFSQVRFIHRyYWNrZXIgaW5zdGFuY2VzIOKAlCBvbmUgcGVyIGtpbmQuXG4gKiAgICAgVGhlIGJhc2UgY2xhc3MgdHJhY2tzIG9uZSBib3VuZGFyeSBraW5kIHBlciBpbnN0YW5jZS5cbiAqXG4gKiAqKktleSBjb252ZW50aW9uOioqXG4gKlxuICogICBUaGUgYGtleTogc3RyaW5nYCBpcyB3aGF0ZXZlciB5b3VyIHN1YmNsYXNzIHBpY2tzLiBDb252ZW50aW9uOlxuICogICB1c2UgYHJ1bnRpbWVTdGFnZUlkYCB3aGVuIHRoZSBib3VuZGFyeSBtYXBzIDE6MSB0byBhIHN0YWdlXG4gKiAgIGV4ZWN1dGlvbiDigJQgdGhpcyBnaXZlcyBmcmVlIGludGVyb3Agd2l0aCBgU2VxdWVuY2VSZWNvcmRlclxuICogICAuZ2V0RW50cmllc0ZvclN0ZXBgLCBgS2V5ZWRSZWNvcmRlci5nZXRCeUtleWAsIGBmaW5kQ29tbWl0YCAvXG4gKiAgIGBmaW5kTGFzdFdyaXRlcmAsIGFuZCB0aGUgcmVzdCBvZiB0aGUgdHJhY2UgZWNvc3lzdGVtLiBVc2UgYSBtb3JlXG4gKiAgIGdyYW51bGFyIGtleSAoZS5nLiwgYHRvb2xDYWxsSWRgKSBvbmx5IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlXG4gKiAgIGNvbmN1cnJlbnQgYm91bmRhcmllcyBXSVRISU4gb25lIHN0YWdlIGV4ZWN1dGlvbi5cbiAqXG4gKiBAZXhhbXBsZSBCdWlsZCBhIGxpdmUgTExNIHRyYWNrZXIgKGNvbWJpbmluZyBzdG9yYWdlICsgb2JzZXJ2ZXIpOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7XG4gKiAgIEJvdW5kYXJ5U3RhdGVUcmFja2VyLFxuICogICB0eXBlIENvbWJpbmVkUmVjb3JkZXIsXG4gKiAgIHR5cGUgRW1pdEV2ZW50LFxuICogfSBmcm9tICdmb290cHJpbnRqcyc7XG4gKlxuICogaW50ZXJmYWNlIExMTUxpdmVTdGF0ZSB7XG4gKiAgIHJlYWRvbmx5IHBhcnRpYWw6IHN0cmluZztcbiAqICAgcmVhZG9ubHkgdG9rZW5zOiBudW1iZXI7XG4gKiB9XG4gKlxuICogY2xhc3MgTGl2ZUxMTVRyYWNrZXJcbiAqICAgZXh0ZW5kcyBCb3VuZGFyeVN0YXRlVHJhY2tlcjxMTE1MaXZlU3RhdGU+ICAgLy8gU1RPUkFHRSBzaGVsZlxuICogICBpbXBsZW1lbnRzIENvbWJpbmVkUmVjb3JkZXIgICAgICAgICAgICAgICAgICAgLy8gT0JTRVJWRVIgaW50ZXJmYWNlXG4gKiB7XG4gKiAgIHJlYWRvbmx5IGlkID0gJ2xpdmUtbGxtJztcbiAqXG4gKiAgIC8vIE9ic2VydmVyIGhhbGYg4oCUIHRyYW5zbGF0ZSBldmVudHMgaW50byBicmFja2V0IG11dGF0aW9ucy5cbiAqICAgb25FbWl0KGV2ZW50OiBFbWl0RXZlbnQpOiB2b2lkIHtcbiAqICAgICBpZiAoZXZlbnQubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LnN0cmVhbS5sbG1fc3RhcnQnKSB7XG4gKiAgICAgICB0aGlzLnN0YXJ0Qm91bmRhcnkoZXZlbnQucnVudGltZVN0YWdlSWQsIHsgcGFydGlhbDogJycsIHRva2VuczogMCB9KTtcbiAqICAgICB9IGVsc2UgaWYgKGV2ZW50Lm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5zdHJlYW0ubGxtX2VuZCcpIHtcbiAqICAgICAgIHRoaXMuc3RvcEJvdW5kYXJ5KGV2ZW50LnJ1bnRpbWVTdGFnZUlkKTtcbiAqICAgICB9IGVsc2UgaWYgKGV2ZW50Lm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5zdHJlYW0udG9rZW4nKSB7XG4gKiAgICAgICB0aGlzLnVwZGF0ZUJvdW5kYXJ5KGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCAocykgPT4gKHtcbiAqICAgICAgICAgcGFydGlhbDogcy5wYXJ0aWFsICsgKGV2ZW50LnBheWxvYWQgYXMgeyBjb250ZW50OiBzdHJpbmcgfSkuY29udGVudCxcbiAqICAgICAgICAgdG9rZW5zOiBzLnRva2VucyArIDEsXG4gKiAgICAgICB9KSk7XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICAvLyBQdWJsaWMgcmVhZCBBUEkg4oCUIE8oMSkgYXQgYW55IG1vbWVudC5cbiAqICAgaXNJbkZsaWdodCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuaGFzQWN0aXZlOyB9XG4gKiAgIGdldFBhcnRpYWwoc3RhZ2VJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAqICAgICByZXR1cm4gdGhpcy5nZXRBY3RpdmUoc3RhZ2VJZCk/LnBhcnRpYWwgPz8gJyc7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBBdHRhY2hlZCB0aGUgc2FtZSB3YXkgYXMgYW55IG90aGVyIENvbWJpbmVkUmVjb3JkZXIuXG4gKiBjb25zdCB0cmFja2VyID0gbmV3IExpdmVMTE1UcmFja2VyKCk7XG4gKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKHRyYWNrZXIpO1xuICogYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gKlxuICogLy8gUmVhZCBsaXZlIHN0YXRlIGF0IGFueSB0aW1lIGR1cmluZyBvciBhZnRlciB0aGUgcnVuLlxuICogdHJhY2tlci5pc0luRmxpZ2h0KCk7XG4gKiB0cmFja2VyLmdldFBhcnRpYWwocmlkKTtcbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT4ge1xuICAvKiogU3RhYmxlIGlkIOKAlCBzYW1lIGlkZW1wb3RlbmN5IGNvbnRyYWN0IGFzIG90aGVyIHJlY29yZGVycy4gKi9cbiAgYWJzdHJhY3QgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKiogT3Blbi1icmFja2V0cyBzdGFjazoga2V5IOKGkiBjdXJyZW50IHRyYW5zaWVudCBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmUgPSBuZXcgTWFwPHN0cmluZywgVFN0YXRlPigpO1xuXG4gIC8qKiBQZXIta2V5IGNvdW50IG9mIGB1cGRhdGVCb3VuZGFyeWAgY2FsbHMgdGhhdCBsYW5kZWQgd2l0aG91dCBhXG4gICAqICBtYXRjaGluZyBhY3RpdmUgYm91bmRhcnkuIERyaXZlcyByYXRlLWxpbWl0ZWQgZGV2LW1vZGUgd2FybmluZ3NcbiAgICogIHNvIGEgc3R1Y2sgbG9vcCBkb2Vzbid0IHNwYW0gdGhlIGNvbnNvbGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbWlzc2VkVXBkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgLy8g4pSA4pSAIE11dGF0b3IgQVBJIChzdWJjbGFzcyBjYWxscyB0aGVzZSBmcm9tIG9ic2VydmVyIGhvb2tzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogT3BlbiBhIG5ldyBib3VuZGFyeSB3aXRoIGluaXRpYWwgdHJhbnNpZW50IHN0YXRlLlxuICAgKlxuICAgKiBJZiBhIGJvdW5kYXJ5IHdpdGggdGhlIHNhbWUgYGtleWAgaXMgYWxyZWFkeSBhY3RpdmUsIHRoZSBwcmlvclxuICAgKiBzdGF0ZSBpcyBvdmVyd3JpdHRlbiAobGFzdC13cml0ZXItd2lucykuIEluIGRldiBtb2RlLCBhIHdhcm5pbmdcbiAgICogaXMgbG9nZ2VkIGJlY2F1c2UgcmUtc3RhcnRpbmcgYW4gYWN0aXZlIGtleSB1c3VhbGx5IGluZGljYXRlcyBhXG4gICAqIG1pc3NlZCBgc3RvcEJvdW5kYXJ5YCBjYWxsIHVwc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IEJvdW5kYXJ5IGlkZW50aWZpZXIg4oCUIGJ5IGNvbnZlbnRpb24sIGBydW50aW1lU3RhZ2VJZGBcbiAgICogICAgICAgICAgICBmb3IgMToxLXdpdGgtc3RhZ2UgYm91bmRhcmllcywgb3IgYSBtb3JlIGdyYW51bGFyIGlkXG4gICAqICAgICAgICAgICAgKGUuZy4sIGB0b29sQ2FsbElkYCkgd2hlbiBtdWx0aXBsZSBjb25jdXJyZW50IGJvdW5kYXJpZXNcbiAgICogICAgICAgICAgICBydW4gd2l0aGluIG9uZSBzdGFnZSBleGVjdXRpb24uXG4gICAqIEBwYXJhbSBpbml0aWFsIEluaXRpYWwgc3RhdGUg4oCUIHR5cGVkIGJ5IGBUU3RhdGVgLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXJ0Qm91bmRhcnkoa2V5OiBzdHJpbmcsIGluaXRpYWw6IFRTdGF0ZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZS5oYXMoa2V5KSAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgWyR7dGhpcy5pZH1dIHN0YXJ0Qm91bmRhcnkoJyR7a2V5fScpIGNhbGxlZCB3aGlsZSBhbiBhY3RpdmUgYm91bmRhcnkgYWxyZWFkeSBleGlzdHMuIGAgK1xuICAgICAgICAgICdPdmVyd3JpdGluZyBwcmlvciBzdGF0ZSDigJQgbGlrZWx5IGEgbWlzc2VkIHN0b3BCb3VuZGFyeSB1cHN0cmVhbS4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmUuc2V0KGtleSwgaW5pdGlhbCk7XG4gIH1cblxuICAvKipcbiAgICogRXZvbHZlIHRoZSB0cmFuc2llbnQgc3RhdGUgb2YgYW4gYWN0aXZlIGJvdW5kYXJ5IHVzaW5nIGFuIHVwZGF0ZXJcbiAgICogZnVuY3Rpb24uIFNpbGVudCBuby1vcCBpZiBubyBib3VuZGFyeSBpcyBhY3RpdmUgZm9yIGBrZXlgXG4gICAqIChkZWZlbnNpdmUgYWdhaW5zdCBvdXQtb2Ytb3JkZXIgZXZlbnRzKS4gSW4gZGV2IG1vZGUsIGEgcmF0ZS1saW1pdGVkXG4gICAqIHdhcm5pbmcgaXMgbG9nZ2VkIG9uIHRoZSAxc3QsIDEwdGgsIGFuZCAxMDB0aCBtaXNzZWQgdXBkYXRlIHBlciBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgICAgICBCb3VuZGFyeSBpZGVudGlmaWVyIChtdXN0IG1hdGNoIGEgcHJpb3IgYHN0YXJ0Qm91bmRhcnlgKS5cbiAgICogQHBhcmFtIHVwZGF0ZXIgIFB1cmUgZnVuY3Rpb246IHByZXZpb3VzIHN0YXRlIOKGkiBuZXh0IHN0YXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUJvdW5kYXJ5KGtleTogc3RyaW5nLCB1cGRhdGVyOiAocHJldjogVFN0YXRlKSA9PiBUU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLmFjdGl2ZS5nZXQoa2V5KTtcbiAgICBpZiAoY3VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zdCBuID0gKHRoaXMubWlzc2VkVXBkYXRlcy5nZXQoa2V5KSA/PyAwKSArIDE7XG4gICAgICAgIHRoaXMubWlzc2VkVXBkYXRlcy5zZXQoa2V5LCBuKTtcbiAgICAgICAgaWYgKG4gPT09IDEpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFske3RoaXMuaWR9XSB1cGRhdGVCb3VuZGFyeSgnJHtrZXl9Jykg4oCUIG5vIGFjdGl2ZSBib3VuZGFyeS4gVXBkYXRlIGRyb3BwZWQuYCk7XG4gICAgICAgIH0gZWxzZSBpZiAobiA9PT0gMTAgfHwgbiA9PT0gMTAwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbJHt0aGlzLmlkfV0gdXBkYXRlQm91bmRhcnkoJyR7a2V5fScpIOKAlCAke259IGRyb3BwZWQgdXBkYXRlcy4gV2lyaW5nIGJ1Zz9gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZS5zZXQoa2V5LCB1cGRhdGVyKGN1cikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBib3VuZGFyeSBpZGVudGlmaWVkIGJ5IGBrZXlgIGFuZCByZXR1cm4gaXRzIEZJTkFMXG4gICAqIHRyYW5zaWVudCBzdGF0ZSAoZm9yIGFueSBjbGVhbnVwIHRoZSBzdWJjbGFzcyB3YW50cyDigJQgZS5nLiwgZW1pdCBhXG4gICAqIHNuYXBzaG90IHRvIGEgU2VxdWVuY2VSZWNvcmRlciBmb3IgZHVyYWJsZSBzdG9yYWdlKS5cbiAgICpcbiAgICogQHBhcmFtIGtleSBCb3VuZGFyeSBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyBUaGUgZmluYWwgc3RhdGUsIG9yIGB1bmRlZmluZWRgIGlmIG5vIGJvdW5kYXJ5IHdhcyBhY3RpdmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RvcEJvdW5kYXJ5KGtleTogc3RyaW5nKTogVFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmaW5hbCA9IHRoaXMuYWN0aXZlLmdldChrZXkpO1xuICAgIHRoaXMuYWN0aXZlLmRlbGV0ZShrZXkpO1xuICAgIHJldHVybiBmaW5hbDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkIEFQSSAoY29uc3VtZXJzIGNhbGwgdGhlc2Ug4oCUIE8oMSkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDdXJyZW50IHRyYW5zaWVudCBzdGF0ZSBvZiBPTkUgYWN0aXZlIGJvdW5kYXJ5LiBgdW5kZWZpbmVkYCBpZiBub1xuICAgKiAgYm91bmRhcnkgaXMgYWN0aXZlIGZvciBga2V5YC4gKi9cbiAgZ2V0QWN0aXZlKGtleTogc3RyaW5nKTogVFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmUuZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsIGN1cnJlbnRseS1hY3RpdmUgYm91bmRhcmllcy5cbiAgICpcbiAgICogKipUeXBlLW9ubHkgcmVhZG9ubHk6KiogdGhlIHJldHVybmVkIHJlZmVyZW5jZSBJUyB0aGUgaW50ZXJuYWwgTWFwLlxuICAgKiBUeXBlU2NyaXB0IHByZXZlbnRzIG11dGF0aW9uIHRocm91Z2ggdGhlIGBSZWFkb25seU1hcGAgdHlwZSwgYnV0IGFcbiAgICogcnVudGltZSBjYXN0IG9yIG5vbi1UUyBjb25zdW1lciBjYW4gbXV0YXRlIGl0IGFuZCBjb3JydXB0IGludGVybmFsXG4gICAqIHN0YXRlLiAqKkRvIG5vdCBtdXRhdGUuKipcbiAgICovXG4gIGdldEFsbEFjdGl2ZSgpOiBSZWFkb25seU1hcDxzdHJpbmcsIFRTdGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgfVxuXG4gIC8qKiBUcnVlIGlmIGFueSBib3VuZGFyeSBpcyBjdXJyZW50bHkgYWN0aXZlLiBPKDEpLiAqL1xuICBnZXQgaGFzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZS5zaXplID4gMDtcbiAgfVxuXG4gIC8qKiBOdW1iZXIgb2YgY3VycmVudGx5LWFjdGl2ZSBib3VuZGFyaWVzLiBPKDEpLiAqL1xuICBnZXQgYWN0aXZlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmUuc2l6ZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc2V0IGFsbCB0cmFuc2llbnQgc3RhdGUuIENhbGxlZCBieSBleGVjdXRvcnMgYmVmb3JlIGVhY2ggYHJ1bigpYFxuICAgKiBzbyBjb25zdW1lcnMgZ2V0IGEgY2xlYW4gc2xhdGUgcGVyIHJ1biDigJQgc2FtZSBsaWZlY3ljbGUgY29udHJhY3RcbiAgICogYXMgYFNlcXVlbmNlUmVjb3JkZXIuY2xlYXIoKWAuXG4gICAqXG4gICAqIEluIGRldiBtb2RlLCB3YXJucyBpZiBhbnkgYm91bmRhcmllcyBhcmUgc3RpbGwgYWN0aXZlIHdoZW4gY2FsbGVkXG4gICAqIOKAlCBsaWtlbHkgaW5kaWNhdGVzIGEgbWlzc2VkIGBzdG9wQm91bmRhcnlgIHVwc3RyZWFtLiBUaGUgbGVha2VkXG4gICAqIGtleXMgYXJlIGxpc3RlZCAodHJ1bmNhdGVkIHRvIDEwKSBzbyB0aGUgd2lyaW5nIGJ1ZyBpcyBmaW5kYWJsZS5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZS5zaXplID4gMCAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc3Qga2V5cyA9IFsuLi50aGlzLmFjdGl2ZS5rZXlzKCldO1xuICAgICAgY29uc3QgaGVhZCA9IGtleXMuc2xpY2UoMCwgMTApLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBtb3JlID0ga2V5cy5sZW5ndGggPiAxMCA/IGAgLi4uKCske2tleXMubGVuZ3RoIC0gMTB9IG1vcmUpYCA6ICcnO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgWyR7dGhpcy5pZH1dIGNsZWFyKCkgY2FsbGVkIHdpdGggJHt0aGlzLmFjdGl2ZS5zaXplfSBgICtcbiAgICAgICAgICAnc3RpbGwtYWN0aXZlIGJvdW5kYXJpZXMuIE1pc3NlZCBzdG9wQm91bmRhcnk/ICcgK1xuICAgICAgICAgIGBMZWFrZWQga2V5czogJHtoZWFkfSR7bW9yZX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmUuY2xlYXIoKTtcbiAgICB0aGlzLm1pc3NlZFVwZGF0ZXMuY2xlYXIoKTtcbiAgfVxufVxuIl19
@@ -7,9 +7,9 @@
7
7
  *
8
8
  * Before `CombinedRecorder`, a consumer who wanted to observe both streams
9
9
  * had to:
10
- * 1. Implement both `Recorder` (8 methods) and `FlowRecorder` (12 methods)
10
+ * 1. Implement both `ScopeRecorder` (8 methods) and `FlowRecorder` (12 methods)
11
11
  * fully — stubbing every event they didn't care about.
12
- * 2. Remember to call BOTH `attachRecorder(r)` AND `attachFlowRecorder(r)`.
12
+ * 2. Remember to call BOTH `attachScopeRecorder(r)` AND `attachFlowRecorder(r)`.
13
13
  * Forgetting the second call silently dropped half their events — no
14
14
  * warning, no runtime error.
15
15
  * 3. Re-implement coordination logic (buffering, ordering) themselves.
@@ -36,7 +36,7 @@
36
36
  *
37
37
  * const audit: CombinedRecorder = {
38
38
  * id: 'audit',
39
- * onWrite: (e) => logWrite(e.key, e.value), // Recorder method
39
+ * onWrite: (e) => logWrite(e.key, e.value), // ScopeRecorder method
40
40
  * onDecision: (e) => logDecision(e.chosen), // FlowRecorder method
41
41
  * };
42
42
  *
@@ -46,7 +46,7 @@
46
46
  *
47
47
  * ## Contract with existing APIs
48
48
  *
49
- * - `attachRecorder(r)` and `attachFlowRecorder(r)` remain unchanged.
49
+ * - `attachScopeRecorder(r)` and `attachFlowRecorder(r)` remain unchanged.
50
50
  * Consumers who want only ONE channel keep using them — explicit is good.
51
51
  * - `attachCombinedRecorder(r)` is the ONLY way to guarantee an object is
52
52
  * hooked into every stream it has methods for, without maintaining two
@@ -85,9 +85,9 @@ export function isFlowEvent(event) {
85
85
  return event.pipelineId === undefined;
86
86
  }
87
87
  /**
88
- * Method names belonging to the `Recorder` (data-flow) interface.
88
+ * Method names belonging to the `ScopeRecorder` (data-flow) interface.
89
89
  * Kept as a single source of truth so the runtime duck-type detector stays
90
- * in sync with the interface. If a method is added to `Recorder`, adding it
90
+ * in sync with the interface. If a method is added to `ScopeRecorder`, adding it
91
91
  * here is the ONLY change required to route combined-recorders correctly.
92
92
  */
93
93
  const RECORDER_EVENT_METHODS = [
@@ -183,10 +183,10 @@ function hasOwnOrClassMethod(r, m) {
183
183
  *
184
184
  * ## Return type
185
185
  *
186
- * Returns plain `boolean` (not a type predicate). The full `Recorder`
186
+ * Returns plain `boolean` (not a type predicate). The full `ScopeRecorder`
187
187
  * interface has payload types that diverge from `CombinedRecorder`'s union
188
188
  * variants for shared methods, so a narrowing predicate would be unsound.
189
- * Callers that need to treat the recorder as a `Recorder` do so explicitly
189
+ * Callers that need to treat the recorder as a `ScopeRecorder` do so explicitly
190
190
  * at the attach site — the cast is the contract that each channel passes
191
191
  * its own payload variant.
192
192
  */
@@ -208,4 +208,4 @@ export function hasFlowRecorderMethods(r) {
208
208
  export function hasEmitRecorderMethods(r) {
209
209
  return EMIT_RECORDER_EVENT_METHODS.some((m) => hasOwnOrClassMethod(r, m));
210
210
  }
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVERztBQW1GSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBSSxLQUFRO0lBQ3JDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUQsT0FBUSxLQUFpQyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRztJQUM3QixRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsY0FBYztJQUNkLFlBQVk7SUFDWixTQUFTO0lBQ1QsVUFBVTtDQUNGLENBQUM7QUFFWDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLDJCQUEyQixHQUFHO0lBQ2xDLGlCQUFpQjtJQUNqQixRQUFRO0lBQ1IsWUFBWTtJQUNaLFFBQVE7SUFDUixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixxQkFBcUI7SUFDckIsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7Q0FDRixDQUFDO0FBRVg7Ozs7R0FJRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxRQUFRLENBQVUsQ0FBQztBQUV4RDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQVMsbUJBQW1CLENBQUMsQ0FBVSxFQUFFLENBQVM7SUFDaEQsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0RCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxPQUFPLE9BQVEsQ0FBNkIsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUM7SUFDakUsQ0FBQztJQUNELElBQUksS0FBSyxHQUFZLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEQsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxPQUFRLEtBQWlDLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxDQUFDO1FBQ3JFLENBQUM7UUFDRCxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLENBQW1CO0lBQ3BELE9BQU8sc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLENBQW1CO0lBQ3hELE9BQU8sMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxDQUFtQjtJQUN4RCxPQUFPLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tYmluZWRSZWNvcmRlciDigJQgYSBzaW5nbGUgb2JzZXJ2ZXIgdGhhdCBjYW4gaG9vayBpbnRvIE1VTFRJUExFIGV2ZW50XG4gKiBzdHJlYW1zIChjdXJyZW50bHk6IHNjb3BlIGRhdGEtZmxvdyArIGNvbnRyb2wtZmxvdykuIE9uZSBvYmplY3QsIG9uZSBgaWRgLFxuICogb25lIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgZXhlY3V0aW9uLlxuICpcbiAqICMjIFdoeSB0aGlzIGV4aXN0c1xuICpcbiAqIEJlZm9yZSBgQ29tYmluZWRSZWNvcmRlcmAsIGEgY29uc3VtZXIgd2hvIHdhbnRlZCB0byBvYnNlcnZlIGJvdGggc3RyZWFtc1xuICogaGFkIHRvOlxuICogICAxLiBJbXBsZW1lbnQgYm90aCBgUmVjb3JkZXJgICg4IG1ldGhvZHMpIGFuZCBgRmxvd1JlY29yZGVyYCAoMTIgbWV0aG9kcylcbiAqICAgICAgZnVsbHkg4oCUIHN0dWJiaW5nIGV2ZXJ5IGV2ZW50IHRoZXkgZGlkbid0IGNhcmUgYWJvdXQuXG4gKiAgIDIuIFJlbWVtYmVyIHRvIGNhbGwgQk9USCBgYXR0YWNoUmVjb3JkZXIocilgIEFORCBgYXR0YWNoRmxvd1JlY29yZGVyKHIpYC5cbiAqICAgICAgRm9yZ2V0dGluZyB0aGUgc2Vjb25kIGNhbGwgc2lsZW50bHkgZHJvcHBlZCBoYWxmIHRoZWlyIGV2ZW50cyDigJQgbm9cbiAqICAgICAgd2FybmluZywgbm8gcnVudGltZSBlcnJvci5cbiAqICAgMy4gUmUtaW1wbGVtZW50IGNvb3JkaW5hdGlvbiBsb2dpYyAoYnVmZmVyaW5nLCBvcmRlcmluZykgdGhlbXNlbHZlcy5cbiAqXG4gKiBgQ29tYmluZWRSZWNvcmRlcmAgY29sbGFwc2VzIHRoYXQgaW50byBhIHNpbmdsZSB0eXBlIGFuZCBhIHNpbmdsZSBhdHRhY2hcbiAqIGNhbGwgKGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKHIpYCksIHdpdGggdGhlIGxpYnJhcnkgaGFuZGxpbmcgdGhlXG4gKiByb3V0aW5nIGludGVybmFsbHkuIENvbnN1bWVycyBpbXBsZW1lbnQgb25seSB0aGUgZXZlbnRzIHRoZXkgY2FyZSBhYm91dFxuICogKGBQYXJ0aWFsPC4uLj5gKSBhbmQgdGhlIGF0dGFjaCBtZXRob2QgZHVjay10eXBlcyBhdCBydW50aW1lIHRvIGRpc3BhdGNoXG4gKiB0byB0aGUgcmVsZXZhbnQgY2hhbm5lbHMuXG4gKlxuICogIyMgRm9yd2FyZCBjb21wYXRpYmlsaXR5XG4gKlxuICogV2hlbiBhIHRoaXJkIG9ic2VydmVyIHR5cGUgaXMgYWRkZWQgKGUuZy4gYW4gYE9wZXJhdGlvblJlY29yZGVyYCksIHRoZVxuICogYENvbWJpbmVkUmVjb3JkZXJgIHR5cGUgZ2FpbnMgYW4gYCYgUGFydGlhbDxPcGVyYXRpb25SZWNvcmRlcj5gIGNsYXVzZSBhbmRcbiAqIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyYCBnYWlucyBvbmUgbW9yZSBydW50aW1lIGJyYW5jaCBpbiBpdHMgZGlzcGF0Y2guXG4gKiBDb25zdW1lcnMgd3JpdGluZyBhIGBDb21iaW5lZFJlY29yZGVyYCB0b2RheSBhcmUgTk9UIGFmZmVjdGVkIOKAlCB0aGVpclxuICogY29kZSBrZWVwcyBjb21waWxpbmcgYW5kIGF0dGFjaGluZyBjb3JyZWN0bHksIGJlY2F1c2UgZXZlcnkgbmV3IGxheWVyIGlzXG4gKiBvcHRpb25hbC5cbiAqXG4gKiAjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnZm9vdHByaW50anMnO1xuICpcbiAqIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICogICBpZDogJ2F1ZGl0JyxcbiAqICAgb25Xcml0ZTogKGUpID0+IGxvZ1dyaXRlKGUua2V5LCBlLnZhbHVlKSwgICAgICAgIC8vIFJlY29yZGVyIG1ldGhvZFxuICogICBvbkRlY2lzaW9uOiAoZSkgPT4gbG9nRGVjaXNpb24oZS5jaG9zZW4pLCAgICAgICAgLy8gRmxvd1JlY29yZGVyIG1ldGhvZFxuICogfTtcbiAqXG4gKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKGF1ZGl0KTtcbiAqIC8vIF4gaW50ZXJuYWxseTogZGV0ZWN0cyBib3RoIHNldHMgb2YgbWV0aG9kcywgcm91dGVzIHRvIGJvdGggY2hhbm5lbHMuXG4gKiBgYGBcbiAqXG4gKiAjIyBDb250cmFjdCB3aXRoIGV4aXN0aW5nIEFQSXNcbiAqXG4gKiAtIGBhdHRhY2hSZWNvcmRlcihyKWAgYW5kIGBhdHRhY2hGbG93UmVjb3JkZXIocilgIHJlbWFpbiB1bmNoYW5nZWQuXG4gKiAgIENvbnN1bWVycyB3aG8gd2FudCBvbmx5IE9ORSBjaGFubmVsIGtlZXAgdXNpbmcgdGhlbSDigJQgZXhwbGljaXQgaXMgZ29vZC5cbiAqIC0gYGF0dGFjaENvbWJpbmVkUmVjb3JkZXIocilgIGlzIHRoZSBPTkxZIHdheSB0byBndWFyYW50ZWUgYW4gb2JqZWN0IGlzXG4gKiAgIGhvb2tlZCBpbnRvIGV2ZXJ5IHN0cmVhbSBpdCBoYXMgbWV0aG9kcyBmb3IsIHdpdGhvdXQgbWFpbnRhaW5pbmcgdHdvXG4gKiAgIGF0dGFjaCBjYWxscyBhdCB0aGUgY2FsbCBzaXRlLlxuICogLSBJZGVtcG90ZW5jeSBieSBgaWRgIGlzIHByZXNlcnZlZCBhY3Jvc3MgY2hhbm5lbHM6IHJlLWF0dGFjaGluZyB3aXRoIHRoZVxuICogICBzYW1lIGBpZGAgcmVwbGFjZXMgdGhlIHByZXZpb3VzIGluc3RhbmNlIG9uIEJPVEggY2hhbm5lbHMsIG5vdCBqdXN0IG9uZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dFcnJvckV2ZW50LCBGbG93UGF1c2VFdmVudCwgRmxvd1JlY29yZGVyLCBGbG93UmVzdW1lRXZlbnQgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRXJyb3JFdmVudCwgUGF1c2VFdmVudCwgUmVjb3JkZXIsIFJlc3VtZUV2ZW50IH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBFbWl0UmVjb3JkZXIgfSBmcm9tICcuL0VtaXRSZWNvcmRlci5qcyc7XG5cbi8qKlxuICogTWV0aG9kIG5hbWVzIHRoYXQgYXBwZWFyIG9uIEJPVEggYFJlY29yZGVyYCBhbmQgYEZsb3dSZWNvcmRlcmAgYnV0IHdpdGhcbiAqIGRpZmZlcmVudCBldmVudCBwYXlsb2FkIHR5cGVzLiBGb3IgdGhlc2UsIGEgYENvbWJpbmVkUmVjb3JkZXJgIGRlY2xhcmVzXG4gKiBPTkUgaGFuZGxlciB0aGF0IHJlY2VpdmVzIHRoZSB1bmlvbiBvZiBib3RoIHBheWxvYWRzIOKAlCBjb25zdW1lcnNcbiAqIGRpc2NyaW1pbmF0ZSBvbiBgdHJhdmVyc2FsQ29udGV4dGAsIHdoaWNoIG9ubHkgY29udHJvbC1mbG93IGV2ZW50cyBjYXJyeS5cbiAqL1xudHlwZSBTaGFyZWRMaWZlY3ljbGVPdmVybGFwID0gJ29uRXJyb3InIHwgJ29uUGF1c2UnIHwgJ29uUmVzdW1lJztcblxuLyoqIExpZmVjeWNsZSBob29rcyAobm90IGV2ZW50LXNwZWNpZmljKSB0aGF0IGJvdGggaW50ZXJmYWNlcyBzaGFyZSBpZGVudGljYWxseS4gKi9cbnR5cGUgU2hhcmVkTGlmZWN5Y2xlID0gJ2lkJyB8ICdjbGVhcicgfCAndG9TbmFwc2hvdCc7XG5cbi8qKlxuICogQSByZWNvcmRlciB0aGF0IE1BWSBvYnNlcnZlIGFueSBjb21iaW5hdGlvbiBvZiBzdXBwb3J0ZWQgZXZlbnQgc3RyZWFtcy5cbiAqXG4gKiBUb2RheSdzIHN0cmVhbXM6XG4gKiAgIC0gU2NvcGUgZGF0YS1mbG93IChgUmVjb3JkZXJgOiBvblJlYWQvb25Xcml0ZS9vbkNvbW1pdC9vblN0YWdlU3RhcnQv4oCmKVxuICogICAtIENvbnRyb2wtZmxvdyAoYEZsb3dSZWNvcmRlcmA6IG9uRGVjaXNpb24vb25TdWJmbG93RW50cnkvb25Mb29wL+KApilcbiAqXG4gKiBBbGwgZXZlbnQgaGFuZGxlcnMgYXJlIG9wdGlvbmFsIOKAlCBpbXBsZW1lbnQgb25seSB3aGF0IHlvdSBjYXJlIGFib3V0LlxuICogYGlkYCBpcyByZXF1aXJlZCBzbyB0aGUgbGlicmFyeSBjYW4gZGVkdXBsaWNhdGUgcmUtYXR0YWNoZXMuXG4gKlxuICogIyMgU2hhcmVkIG1ldGhvZCBuYW1lcyAob25FcnJvciAvIG9uUGF1c2UgLyBvblJlc3VtZSlcbiAqXG4gKiBCb3RoIGBSZWNvcmRlcmAgYW5kIGBGbG93UmVjb3JkZXJgIGRlY2xhcmUgdGhlc2Ugd2l0aCBESUZGRVJFTlQgcGF5bG9hZFxuICogc2hhcGVzLiBJbiBhIGNvbWJpbmVkIHJlY29yZGVyLCBlYWNoIHN1Y2ggaGFuZGxlciBpcyBjYWxsZWQgYnkgQk9USFxuICogY2hhbm5lbHMgd2l0aCBpdHMgb3duIHZhcmlhbnQuIFRoZSBwYXJhbWV0ZXIgdHlwZSBpcyBhIHVuaW9uIOKAlCBjb25zdW1lcnNcbiAqIGNhbiBlaXRoZXIgaGFuZGxlIGJvdGggdmFyaWFudHMgdW5pZm9ybWx5LCBvciBkaXNjcmltaW5hdGUgKGNvbnRyb2wtZmxvd1xuICogdmFyaWFudHMgY2FycnkgYSBgdHJhdmVyc2FsQ29udGV4dGAgZmllbGQgdGhhdCBkYXRhLWZsb3cgdmFyaWFudHMgbGFjaykuXG4gKlxuICogIyMgRm9yd2FyZCBjb21wYXRpYmlsaXR5XG4gKlxuICogV2hlbiBhIHRoaXJkIG9ic2VydmVyIHR5cGUgc2hpcHMgKGUuZy4gYE9wZXJhdGlvblJlY29yZGVyYCksIHRoZSB0eXBlXG4gKiBnYWlucyBhbm90aGVyIGAmIFBhcnRpYWw84oCmPmAgY2xhdXNlLiBCZWNhdXNlIGV2ZXJ5IGNsYXVzZSBpcyBgUGFydGlhbGAsXG4gKiBleGlzdGluZyBgQ29tYmluZWRSZWNvcmRlcmAgaW1wbGVtZW50YXRpb25zIHJlbWFpbiB0eXBlLXZhbGlkLlxuICovXG5leHBvcnQgdHlwZSBDb21iaW5lZFJlY29yZGVyID0gUGFydGlhbDxPbWl0PFJlY29yZGVyLCBTaGFyZWRMaWZlY3ljbGVPdmVybGFwIHwgU2hhcmVkTGlmZWN5Y2xlPj4gJlxuICBQYXJ0aWFsPE9taXQ8Rmxvd1JlY29yZGVyLCBTaGFyZWRMaWZlY3ljbGVPdmVybGFwIHwgU2hhcmVkTGlmZWN5Y2xlPj4gJlxuICAvLyBFbWl0IGNoYW5uZWwg4oCUIG5ldyB0aGlyZCBzdHJlYW0gKFBoYXNlIDMpLiBObyBtZXRob2QtbmFtZSBvdmVybGFwIHdpdGhcbiAgLy8gdGhlIG90aGVyIHR3byBpbnRlcmZhY2VzLCBzbyBhIHBsYWluIGludGVyc2VjdGlvbiBpcyBzb3VuZCDigJQgbm9cbiAgLy8gdW5pb24tcGF5bG9hZCBkaXNjcmltaW5hdG9yIG5lZWRlZC5cbiAgUGFydGlhbDxPbWl0PEVtaXRSZWNvcmRlciwgU2hhcmVkTGlmZWN5Y2xlPj4gJiB7XG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAgIC8vIFNoYXJlZCBsaWZlY3ljbGUgaG9va3Mg4oCUIHNhbWUgb24gYm90aCBpbnRlcmZhY2VzLCBzaGFwZSBjb21wYXRpYmxlLlxuICAgIGNsZWFyPygpOiB2b2lkO1xuICAgIHRvU25hcHNob3Q/KCk6IHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgICAgcHJlZmVycmVkT3BlcmF0aW9uPzogJ3RyYW5zbGF0ZScgfCAnYWNjdW11bGF0ZScgfCAnYWdncmVnYXRlJztcbiAgICAgIGRhdGE6IHVua25vd247XG4gICAgfTtcblxuICAgIC8vIFNoYXJlZCBldmVudCBtZXRob2QgbmFtZXMgd2l0aCBESVZFUkdFTlQgcGF5bG9hZHMg4oCUIGRlY2xhcmVkIGFzIHVuaW9ucy5cbiAgICAvLyBDb25zdW1lcnMgZWl0aGVyIGhhbmRsZSBib3RoIHZhcmlhbnRzLCBvciBkaXNjcmltaW5hdGUgdXNpbmcgdGhlXG4gICAgLy8gZXhwb3J0ZWQgaGVscGVyIGBpc0Zsb3dFdmVudCgpYCAod2hpY2ggY2hlY2tzIGZvciB0aGVcbiAgICAvLyBgdHJhdmVyc2FsQ29udGV4dGAgZmllbGQg4oCUIHByZXNlbnQgb25seSBvbiBjb250cm9sLWZsb3cgdmFyaWFudHMpLlxuICAgIC8vXG4gICAgLy8gQGV4YW1wbGVcbiAgICAvLyBgYGB0c1xuICAgIC8vIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICAgIC8vICAgaWQ6ICdhdWRpdCcsXG4gICAgLy8gICBvbkVycm9yOiAoZSkgPT4ge1xuICAgIC8vICAgICBpZiAoaXNGbG93RXZlbnQoZSkpIHtcbiAgICAvLyAgICAgICAvLyBlIGlzIEZsb3dFcnJvckV2ZW50IOKAlCBoYXMgc3RhZ2VOYW1lLCBtZXNzYWdlLCBzdHJ1Y3R1cmVkRXJyb3JcbiAgICAvLyAgICAgICBsb2coJ2Zsb3cgZXJyb3IgaW4gc3RhZ2UnLCBlLnN0YWdlTmFtZSk7XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgLy8gZSBpcyBFcnJvckV2ZW50IOKAlCBoYXMgZXJyb3IsIG9wZXJhdGlvbiwga2V5P1xuICAgIC8vICAgICAgIGxvZygnc2NvcGUgZXJyb3IgZHVyaW5nJywgZS5vcGVyYXRpb24sIGUuZXJyb3IubWVzc2FnZSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH0sXG4gICAgLy8gfTtcbiAgICAvLyBgYGBcbiAgICBvbkVycm9yPyhldmVudDogRXJyb3JFdmVudCB8IEZsb3dFcnJvckV2ZW50KTogdm9pZDtcbiAgICBvblBhdXNlPyhldmVudDogUGF1c2VFdmVudCB8IEZsb3dQYXVzZUV2ZW50KTogdm9pZDtcbiAgICBvblJlc3VtZT8oZXZlbnQ6IFJlc3VtZUV2ZW50IHwgRmxvd1Jlc3VtZUV2ZW50KTogdm9pZDtcbiAgfTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdG9yIGZvciB0aGUgdW5pb24gcGF5bG9hZCB0eXBlcyBvbiBgQ29tYmluZWRSZWNvcmRlcmAncyBzaGFyZWRcbiAqIG1ldGhvZHMgKGBvbkVycm9yYCwgYG9uUGF1c2VgLCBgb25SZXN1bWVgKS4gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGV2ZW50XG4gKiB3YXMgZW1pdHRlZCBmcm9tIHRoZSBjb250cm9sLWZsb3cgY2hhbm5lbCAoRmxvd1JlY29yZGVyKS5cbiAqXG4gKiAjIyBIb3cgaXQgZGlzY3JpbWluYXRlc1xuICpcbiAqIFNjb3BlLWNoYW5uZWwgZXZlbnRzIGV4dGVuZCBgUmVjb3JkZXJDb250ZXh0YCwgd2hpY2ggY2FycmllcyBgcGlwZWxpbmVJZGAuXG4gKiBGbG93LWNoYW5uZWwgZXZlbnRzIGRvIG5vdCBjYXJyeSBgcGlwZWxpbmVJZGAgKHRoZXkgY2FycnkgYW4gb3B0aW9uYWxcbiAqIGB0cmF2ZXJzYWxDb250ZXh0YCBpbnN0ZWFkLCBidXQgdGhhdCBmaWVsZCBpcyBvcHRpb25hbCBhbmQgY2Fubm90IGJlXG4gKiByZWxpZWQgb24gYXMgYSBwb3NpdGl2ZSBzaWduYWwpLiBXZSBkZXRlY3QgdGhlIGZsb3cgdmFyaWFudCBieSB0aGVcbiAqIEFCU0VOQ0Ugb2YgYHBpcGVsaW5lSWRgIOKAlCB0aGlzIGlzIHNjaGVtYS1zdGFibGUgYXMgbG9uZyBhcyBzY29wZSBldmVudHNcbiAqIGNvbnRpbnVlIHRvIGV4dGVuZCBgUmVjb3JkZXJDb250ZXh0YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIG9uRXJyb3I6IChlKSA9PiB7XG4gKiAgIGlmIChpc0Zsb3dFdmVudChlKSkge1xuICogICAgIC8vIE5hcnJvd2VkIHRvIEZsb3dFcnJvckV2ZW50OiBoYXMgc3RhZ2VOYW1lLCBtZXNzYWdlLCBzdHJ1Y3R1cmVkRXJyb3JcbiAqICAgfSBlbHNlIHtcbiAqICAgICAvLyBOYXJyb3dlZCB0byBFcnJvckV2ZW50OiBoYXMgZXJyb3IsIG9wZXJhdGlvbiwga2V5P1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRmxvd0V2ZW50PFQ+KGV2ZW50OiBUKTogZXZlbnQgaXMgRXhjbHVkZTxULCB7IHBpcGVsaW5lSWQ6IHN0cmluZyB9PiB7XG4gIGlmICh0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnIHx8IGV2ZW50ID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAoZXZlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnBpcGVsaW5lSWQgPT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBNZXRob2QgbmFtZXMgYmVsb25naW5nIHRvIHRoZSBgUmVjb3JkZXJgIChkYXRhLWZsb3cpIGludGVyZmFjZS5cbiAqIEtlcHQgYXMgYSBzaW5nbGUgc291cmNlIG9mIHRydXRoIHNvIHRoZSBydW50aW1lIGR1Y2stdHlwZSBkZXRlY3RvciBzdGF5c1xuICogaW4gc3luYyB3aXRoIHRoZSBpbnRlcmZhY2UuIElmIGEgbWV0aG9kIGlzIGFkZGVkIHRvIGBSZWNvcmRlcmAsIGFkZGluZyBpdFxuICogaGVyZSBpcyB0aGUgT05MWSBjaGFuZ2UgcmVxdWlyZWQgdG8gcm91dGUgY29tYmluZWQtcmVjb3JkZXJzIGNvcnJlY3RseS5cbiAqL1xuY29uc3QgUkVDT1JERVJfRVZFTlRfTUVUSE9EUyA9IFtcbiAgJ29uUmVhZCcsXG4gICdvbldyaXRlJyxcbiAgJ29uQ29tbWl0JyxcbiAgJ29uRXJyb3InLFxuICAnb25TdGFnZVN0YXJ0JyxcbiAgJ29uU3RhZ2VFbmQnLFxuICAnb25QYXVzZScsXG4gICdvblJlc3VtZScsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyBiZWxvbmdpbmcgdG8gdGhlIGBGbG93UmVjb3JkZXJgIChjb250cm9sLWZsb3cpIGludGVyZmFjZS5cbiAqIFNlZSB0aGUgbm90ZSBvbiBgUkVDT1JERVJfRVZFTlRfTUVUSE9EU2AuXG4gKlxuICogTk9URTogdGhlIGBvbkVycm9yYCwgYG9uUGF1c2VgLCBgb25SZXN1bWVgIG1ldGhvZHMgZXhpc3Qgb24gQk9USCBpbnRlcmZhY2VzXG4gKiB3aXRoIERJRkZFUkVOVCBldmVudCBwYXlsb2FkIHNoYXBlcy4gQSBgQ29tYmluZWRSZWNvcmRlcmAgdGhhdCBpbXBsZW1lbnRzXG4gKiBhbnkgb2YgdGhlc2UgcmVjZWl2ZXMgYm90aCB2YXJpYW50cyAob25lIGZyb20gZWFjaCBjaGFubmVsKS4gQ29uc3VtZXJzIHdob1xuICogY2FyZSBhYm91dCB0aGUgZGlzdGluY3Rpb24gY2FuIGRpc2NyaW1pbmF0ZSBvbiB0aGUgcHJlc2VuY2Ugb2ZcbiAqIGB0cmF2ZXJzYWxDb250ZXh0YCAod2hpY2ggb25seSBjb250cm9sLWZsb3cgZXZlbnRzIGNhcnJ5KS5cbiAqL1xuY29uc3QgRkxPV19SRUNPUkRFUl9FVkVOVF9NRVRIT0RTID0gW1xuICAnb25TdGFnZUV4ZWN1dGVkJyxcbiAgJ29uTmV4dCcsXG4gICdvbkRlY2lzaW9uJyxcbiAgJ29uRm9yaycsXG4gICdvblNlbGVjdGVkJyxcbiAgJ29uU3ViZmxvd0VudHJ5JyxcbiAgJ29uU3ViZmxvd0V4aXQnLFxuICAnb25TdWJmbG93UmVnaXN0ZXJlZCcsXG4gICdvbkxvb3AnLFxuICAnb25CcmVhaycsXG4gICdvbkVycm9yJyxcbiAgJ29uUGF1c2UnLFxuICAnb25SZXN1bWUnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBNZXRob2QgbmFtZXMgYmVsb25naW5nIHRvIHRoZSBgRW1pdFJlY29yZGVyYCAodXNlci1lbWl0dGVkIGV2ZW50cylcbiAqIGludGVyZmFjZS4gU2FtZSBjb252ZW50aW9uIGFzIHRoZSBvdGhlciB0d28gYXJyYXlzIGFib3ZlIOKAlCBrZXB0IGFzXG4gKiB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgZHVjay10eXBlIGRldGVjdGlvbi5cbiAqL1xuY29uc3QgRU1JVF9SRUNPUkRFUl9FVkVOVF9NRVRIT0RTID0gWydvbkVtaXQnXSBhcyBjb25zdDtcblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgZGVjbGFyZXMgYSBtZXRob2QgbmFtZWQgYG1gIGVpdGhlciBhcyBhbiBvd25cbiAqIHByb3BlcnR5IE9SIG9uIGl0cyBjbGFzcy1wcm90b3R5cGUgY2hhaW4g4oCUIGJ1dCBOT1QgaW5oZXJpdGVkIGZyb21cbiAqIGBPYmplY3QucHJvdG90eXBlYC5cbiAqXG4gKiAjIyBXaHkgdGhpcyBsYXllcmVkIGNoZWNrXG4gKlxuICogQSBgQ29tYmluZWRSZWNvcmRlcmAgY2FuIGJlIGVpdGhlciBhIHBsYWluIG9iamVjdCBsaXRlcmFsIChoYW5kbGVycyBhc1xuICogb3duIHByb3BlcnRpZXMpIE9SIGEgY2xhc3MgaW5zdGFuY2UgKGhhbmRsZXJzIGFzIGNsYXNzLXByb3RvdHlwZVxuICogbWV0aG9kcykuIEJvdGggYXJlIGxlZ2l0aW1hdGUgY29uc3VtZXIgcGF0dGVybnMgYW5kIGJvdGggTVVTVCBhdHRhY2guXG4gKlxuICogQnV0IGhhbmRsZXJzIGluaGVyaXRlZCBmcm9tIGBPYmplY3QucHJvdG90eXBlYCBhcmUgQUxXQVlTIGFjY2lkZW50YWwgb3JcbiAqIG1hbGljaW91cyAobm9ib2R5IGxlZ2l0aW1hdGVseSBhdHRhY2hlcyByZWNvcmRlciBtZXRob2RzIHRoZXJlKS4gU28gd2VcbiAqIHdhbGsgdGhlIHByb3RvdHlwZSBjaGFpbiwgU1RPUFBJTkcgYmVmb3JlIGBPYmplY3QucHJvdG90eXBlYC4gVGhpc1xuICogYWNjZXB0cyBjbGFzcyBtZXRob2RzIHdoaWxlIHN0aWxsIGJsb2NraW5nIGBPYmplY3QucHJvdG90eXBlYFxuICogcG9sbHV0aW9uIGF0dGFja3MuXG4gKi9cbmZ1bmN0aW9uIGhhc093bk9yQ2xhc3NNZXRob2QocjogdW5rbm93biwgbTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChyID09PSBudWxsIHx8IHR5cGVvZiByICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG0pKSB7XG4gICAgcmV0dXJuIHR5cGVvZiAociBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbV0gPT09ICdmdW5jdGlvbic7XG4gIH1cbiAgbGV0IHByb3RvOiB1bmtub3duID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHIpO1xuICB3aGlsZSAocHJvdG8gIT09IG51bGwgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCBtKSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiAocHJvdG8gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW21dID09PSAnZnVuY3Rpb24nO1xuICAgIH1cbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIGF0IGxlYXN0IG9uZSBkYXRhLWZsb3cgZXZlbnQgbWV0aG9kLlxuICogVXNlZCBieSBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAgdG8gZGVjaWRlIHdoZXRoZXIgdG8gaG9vayBpbnRvXG4gKiB0aGUgc2NvcGUgZGF0YS1mbG93IGNoYW5uZWwuXG4gKlxuICogIyMgRGV0ZWN0aW9uIHJ1bGVcbiAqXG4gKiBBY2NlcHRzIGJvdGggb2JqZWN0LWxpdGVyYWwgcmVjb3JkZXJzIChvd24tcHJvcGVydHkgaGFuZGxlcnMpIEFORCBjbGFzc1xuICogaW5zdGFuY2VzIChoYW5kbGVycyBkZWNsYXJlZCBvbiB0aGUgY2xhc3MgcHJvdG90eXBlKS4gUmVqZWN0cyBoYW5kbGVyc1xuICogaW5oZXJpdGVkIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIOKAlCB0aGF0J3MgYWx3YXlzIGFjY2lkZW50YWwgb3JcbiAqIG1hbGljaW91cyBwb2xsdXRpb24sIG5ldmVyIGEgbGVnaXRpbWF0ZSByZWNvcmRlci5cbiAqXG4gKiAjIyBMaWZlY3ljbGUgZXhjbHVzaW9uc1xuICpcbiAqIGBjbGVhcmAgYW5kIGB0b1NuYXBzaG90YCBhcmUgTk9UIGNvdW50ZWQgYXMgZXZlbnQgbWV0aG9kcyDigJQgYSByZWNvcmRlclxuICogdGhhdCBvbmx5IGltcGxlbWVudHMgdGhvc2UgaGFzIG5vdGhpbmcgdG8gb2JzZXJ2ZSBhbmQgd291bGQgYmUgYSBuby1vcFxuICogb24gZWl0aGVyIGNoYW5uZWwuXG4gKlxuICogIyMgUmV0dXJuIHR5cGVcbiAqXG4gKiBSZXR1cm5zIHBsYWluIGBib29sZWFuYCAobm90IGEgdHlwZSBwcmVkaWNhdGUpLiBUaGUgZnVsbCBgUmVjb3JkZXJgXG4gKiBpbnRlcmZhY2UgaGFzIHBheWxvYWQgdHlwZXMgdGhhdCBkaXZlcmdlIGZyb20gYENvbWJpbmVkUmVjb3JkZXJgJ3MgdW5pb25cbiAqIHZhcmlhbnRzIGZvciBzaGFyZWQgbWV0aG9kcywgc28gYSBuYXJyb3dpbmcgcHJlZGljYXRlIHdvdWxkIGJlIHVuc291bmQuXG4gKiBDYWxsZXJzIHRoYXQgbmVlZCB0byB0cmVhdCB0aGUgcmVjb3JkZXIgYXMgYSBgUmVjb3JkZXJgIGRvIHNvIGV4cGxpY2l0bHlcbiAqIGF0IHRoZSBhdHRhY2ggc2l0ZSDigJQgdGhlIGNhc3QgaXMgdGhlIGNvbnRyYWN0IHRoYXQgZWFjaCBjaGFubmVsIHBhc3Nlc1xuICogaXRzIG93biBwYXlsb2FkIHZhcmlhbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNSZWNvcmRlck1ldGhvZHMocjogQ29tYmluZWRSZWNvcmRlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gUkVDT1JERVJfRVZFTlRfTUVUSE9EUy5zb21lKChtKSA9PiBoYXNPd25PckNsYXNzTWV0aG9kKHIsIG0pKTtcbn1cblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgaW1wbGVtZW50cyBhdCBsZWFzdCBvbmUgY29udHJvbC1mbG93IGV2ZW50IG1ldGhvZC5cbiAqIFNlZSBgaGFzUmVjb3JkZXJNZXRob2RzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0Zsb3dSZWNvcmRlck1ldGhvZHMocjogQ29tYmluZWRSZWNvcmRlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gRkxPV19SRUNPUkRFUl9FVkVOVF9NRVRIT0RTLnNvbWUoKG0pID0+IGhhc093bk9yQ2xhc3NNZXRob2QociwgbSkpO1xufVxuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIGF0IGxlYXN0IG9uZSBlbWl0LWNoYW5uZWwgZXZlbnQgbWV0aG9kLlxuICogU2VlIGBoYXNSZWNvcmRlck1ldGhvZHNgIGZvciB0aGUgb3duZXJzaGlwLWRldGVjdGlvbiBydWxlcyAob3duIG9yXG4gKiBjbGFzcy1wcm90b3R5cGUgbWV0aG9kcyBjb3VudDsgYE9iamVjdC5wcm90b3R5cGVgIHBvbGx1dGlvbiBkb2VzIG5vdCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbWl0UmVjb3JkZXJNZXRob2RzKHI6IENvbWJpbmVkUmVjb3JkZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIEVNSVRfUkVDT1JERVJfRVZFTlRfTUVUSE9EUy5zb21lKChtKSA9PiBoYXNPd25PckNsYXNzTWV0aG9kKHIsIG0pKTtcbn1cbiJdfQ==
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVERztBQW1GSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBSSxLQUFRO0lBQ3JDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUQsT0FBUSxLQUFpQyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRztJQUM3QixRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsY0FBYztJQUNkLFlBQVk7SUFDWixTQUFTO0lBQ1QsVUFBVTtDQUNGLENBQUM7QUFFWDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLDJCQUEyQixHQUFHO0lBQ2xDLGlCQUFpQjtJQUNqQixRQUFRO0lBQ1IsWUFBWTtJQUNaLFFBQVE7SUFDUixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixxQkFBcUI7SUFDckIsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7Q0FDRixDQUFDO0FBRVg7Ozs7R0FJRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxRQUFRLENBQVUsQ0FBQztBQUV4RDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQVMsbUJBQW1CLENBQUMsQ0FBVSxFQUFFLENBQVM7SUFDaEQsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0RCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxPQUFPLE9BQVEsQ0FBNkIsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUM7SUFDakUsQ0FBQztJQUNELElBQUksS0FBSyxHQUFZLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEQsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxPQUFRLEtBQWlDLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxDQUFDO1FBQ3JFLENBQUM7UUFDRCxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLENBQW1CO0lBQ3BELE9BQU8sc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLENBQW1CO0lBQ3hELE9BQU8sMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxDQUFtQjtJQUN4RCxPQUFPLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tYmluZWRSZWNvcmRlciDigJQgYSBzaW5nbGUgb2JzZXJ2ZXIgdGhhdCBjYW4gaG9vayBpbnRvIE1VTFRJUExFIGV2ZW50XG4gKiBzdHJlYW1zIChjdXJyZW50bHk6IHNjb3BlIGRhdGEtZmxvdyArIGNvbnRyb2wtZmxvdykuIE9uZSBvYmplY3QsIG9uZSBgaWRgLFxuICogb25lIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgZXhlY3V0aW9uLlxuICpcbiAqICMjIFdoeSB0aGlzIGV4aXN0c1xuICpcbiAqIEJlZm9yZSBgQ29tYmluZWRSZWNvcmRlcmAsIGEgY29uc3VtZXIgd2hvIHdhbnRlZCB0byBvYnNlcnZlIGJvdGggc3RyZWFtc1xuICogaGFkIHRvOlxuICogICAxLiBJbXBsZW1lbnQgYm90aCBgU2NvcGVSZWNvcmRlcmAgKDggbWV0aG9kcykgYW5kIGBGbG93UmVjb3JkZXJgICgxMiBtZXRob2RzKVxuICogICAgICBmdWxseSDigJQgc3R1YmJpbmcgZXZlcnkgZXZlbnQgdGhleSBkaWRuJ3QgY2FyZSBhYm91dC5cbiAqICAgMi4gUmVtZW1iZXIgdG8gY2FsbCBCT1RIIGBhdHRhY2hTY29wZVJlY29yZGVyKHIpYCBBTkQgYGF0dGFjaEZsb3dSZWNvcmRlcihyKWAuXG4gKiAgICAgIEZvcmdldHRpbmcgdGhlIHNlY29uZCBjYWxsIHNpbGVudGx5IGRyb3BwZWQgaGFsZiB0aGVpciBldmVudHMg4oCUIG5vXG4gKiAgICAgIHdhcm5pbmcsIG5vIHJ1bnRpbWUgZXJyb3IuXG4gKiAgIDMuIFJlLWltcGxlbWVudCBjb29yZGluYXRpb24gbG9naWMgKGJ1ZmZlcmluZywgb3JkZXJpbmcpIHRoZW1zZWx2ZXMuXG4gKlxuICogYENvbWJpbmVkUmVjb3JkZXJgIGNvbGxhcHNlcyB0aGF0IGludG8gYSBzaW5nbGUgdHlwZSBhbmQgYSBzaW5nbGUgYXR0YWNoXG4gKiBjYWxsIChgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyKWApLCB3aXRoIHRoZSBsaWJyYXJ5IGhhbmRsaW5nIHRoZVxuICogcm91dGluZyBpbnRlcm5hbGx5LiBDb25zdW1lcnMgaW1wbGVtZW50IG9ubHkgdGhlIGV2ZW50cyB0aGV5IGNhcmUgYWJvdXRcbiAqIChgUGFydGlhbDwuLi4+YCkgYW5kIHRoZSBhdHRhY2ggbWV0aG9kIGR1Y2stdHlwZXMgYXQgcnVudGltZSB0byBkaXNwYXRjaFxuICogdG8gdGhlIHJlbGV2YW50IGNoYW5uZWxzLlxuICpcbiAqICMjIEZvcndhcmQgY29tcGF0aWJpbGl0eVxuICpcbiAqIFdoZW4gYSB0aGlyZCBvYnNlcnZlciB0eXBlIGlzIGFkZGVkIChlLmcuIGFuIGBPcGVyYXRpb25SZWNvcmRlcmApLCB0aGVcbiAqIGBDb21iaW5lZFJlY29yZGVyYCB0eXBlIGdhaW5zIGFuIGAmIFBhcnRpYWw8T3BlcmF0aW9uUmVjb3JkZXI+YCBjbGF1c2UgYW5kXG4gKiBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAgZ2FpbnMgb25lIG1vcmUgcnVudGltZSBicmFuY2ggaW4gaXRzIGRpc3BhdGNoLlxuICogQ29uc3VtZXJzIHdyaXRpbmcgYSBgQ29tYmluZWRSZWNvcmRlcmAgdG9kYXkgYXJlIE5PVCBhZmZlY3RlZCDigJQgdGhlaXJcbiAqIGNvZGUga2VlcHMgY29tcGlsaW5nIGFuZCBhdHRhY2hpbmcgY29ycmVjdGx5LCBiZWNhdXNlIGV2ZXJ5IG5ldyBsYXllciBpc1xuICogb3B0aW9uYWwuXG4gKlxuICogIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJ2Zvb3RwcmludGpzJztcbiAqXG4gKiBjb25zdCBhdWRpdDogQ29tYmluZWRSZWNvcmRlciA9IHtcbiAqICAgaWQ6ICdhdWRpdCcsXG4gKiAgIG9uV3JpdGU6IChlKSA9PiBsb2dXcml0ZShlLmtleSwgZS52YWx1ZSksICAgICAgICAvLyBTY29wZVJlY29yZGVyIG1ldGhvZFxuICogICBvbkRlY2lzaW9uOiAoZSkgPT4gbG9nRGVjaXNpb24oZS5jaG9zZW4pLCAgICAgICAgLy8gRmxvd1JlY29yZGVyIG1ldGhvZFxuICogfTtcbiAqXG4gKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKGF1ZGl0KTtcbiAqIC8vIF4gaW50ZXJuYWxseTogZGV0ZWN0cyBib3RoIHNldHMgb2YgbWV0aG9kcywgcm91dGVzIHRvIGJvdGggY2hhbm5lbHMuXG4gKiBgYGBcbiAqXG4gKiAjIyBDb250cmFjdCB3aXRoIGV4aXN0aW5nIEFQSXNcbiAqXG4gKiAtIGBhdHRhY2hTY29wZVJlY29yZGVyKHIpYCBhbmQgYGF0dGFjaEZsb3dSZWNvcmRlcihyKWAgcmVtYWluIHVuY2hhbmdlZC5cbiAqICAgQ29uc3VtZXJzIHdobyB3YW50IG9ubHkgT05FIGNoYW5uZWwga2VlcCB1c2luZyB0aGVtIOKAlCBleHBsaWNpdCBpcyBnb29kLlxuICogLSBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyKWAgaXMgdGhlIE9OTFkgd2F5IHRvIGd1YXJhbnRlZSBhbiBvYmplY3QgaXNcbiAqICAgaG9va2VkIGludG8gZXZlcnkgc3RyZWFtIGl0IGhhcyBtZXRob2RzIGZvciwgd2l0aG91dCBtYWludGFpbmluZyB0d29cbiAqICAgYXR0YWNoIGNhbGxzIGF0IHRoZSBjYWxsIHNpdGUuXG4gKiAtIElkZW1wb3RlbmN5IGJ5IGBpZGAgaXMgcHJlc2VydmVkIGFjcm9zcyBjaGFubmVsczogcmUtYXR0YWNoaW5nIHdpdGggdGhlXG4gKiAgIHNhbWUgYGlkYCByZXBsYWNlcyB0aGUgcHJldmlvdXMgaW5zdGFuY2Ugb24gQk9USCBjaGFubmVscywgbm90IGp1c3Qgb25lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd0Vycm9yRXZlbnQsIEZsb3dQYXVzZUV2ZW50LCBGbG93UmVjb3JkZXIsIEZsb3dSZXN1bWVFdmVudCB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBFcnJvckV2ZW50LCBQYXVzZUV2ZW50LCBSZXN1bWVFdmVudCwgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi9FbWl0UmVjb3JkZXIuanMnO1xuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyB0aGF0IGFwcGVhciBvbiBCT1RIIGBTY29wZVJlY29yZGVyYCBhbmQgYEZsb3dSZWNvcmRlcmAgYnV0IHdpdGhcbiAqIGRpZmZlcmVudCBldmVudCBwYXlsb2FkIHR5cGVzLiBGb3IgdGhlc2UsIGEgYENvbWJpbmVkUmVjb3JkZXJgIGRlY2xhcmVzXG4gKiBPTkUgaGFuZGxlciB0aGF0IHJlY2VpdmVzIHRoZSB1bmlvbiBvZiBib3RoIHBheWxvYWRzIOKAlCBjb25zdW1lcnNcbiAqIGRpc2NyaW1pbmF0ZSBvbiBgdHJhdmVyc2FsQ29udGV4dGAsIHdoaWNoIG9ubHkgY29udHJvbC1mbG93IGV2ZW50cyBjYXJyeS5cbiAqL1xudHlwZSBTaGFyZWRMaWZlY3ljbGVPdmVybGFwID0gJ29uRXJyb3InIHwgJ29uUGF1c2UnIHwgJ29uUmVzdW1lJztcblxuLyoqIExpZmVjeWNsZSBob29rcyAobm90IGV2ZW50LXNwZWNpZmljKSB0aGF0IGJvdGggaW50ZXJmYWNlcyBzaGFyZSBpZGVudGljYWxseS4gKi9cbnR5cGUgU2hhcmVkTGlmZWN5Y2xlID0gJ2lkJyB8ICdjbGVhcicgfCAndG9TbmFwc2hvdCc7XG5cbi8qKlxuICogQSByZWNvcmRlciB0aGF0IE1BWSBvYnNlcnZlIGFueSBjb21iaW5hdGlvbiBvZiBzdXBwb3J0ZWQgZXZlbnQgc3RyZWFtcy5cbiAqXG4gKiBUb2RheSdzIHN0cmVhbXM6XG4gKiAgIC0gU2NvcGUgZGF0YS1mbG93IChgU2NvcGVSZWNvcmRlcmA6IG9uUmVhZC9vbldyaXRlL29uQ29tbWl0L29uU3RhZ2VTdGFydC/igKYpXG4gKiAgIC0gQ29udHJvbC1mbG93IChgRmxvd1JlY29yZGVyYDogb25EZWNpc2lvbi9vblN1YmZsb3dFbnRyeS9vbkxvb3Av4oCmKVxuICpcbiAqIEFsbCBldmVudCBoYW5kbGVycyBhcmUgb3B0aW9uYWwg4oCUIGltcGxlbWVudCBvbmx5IHdoYXQgeW91IGNhcmUgYWJvdXQuXG4gKiBgaWRgIGlzIHJlcXVpcmVkIHNvIHRoZSBsaWJyYXJ5IGNhbiBkZWR1cGxpY2F0ZSByZS1hdHRhY2hlcy5cbiAqXG4gKiAjIyBTaGFyZWQgbWV0aG9kIG5hbWVzIChvbkVycm9yIC8gb25QYXVzZSAvIG9uUmVzdW1lKVxuICpcbiAqIEJvdGggYFNjb3BlUmVjb3JkZXJgIGFuZCBgRmxvd1JlY29yZGVyYCBkZWNsYXJlIHRoZXNlIHdpdGggRElGRkVSRU5UIHBheWxvYWRcbiAqIHNoYXBlcy4gSW4gYSBjb21iaW5lZCByZWNvcmRlciwgZWFjaCBzdWNoIGhhbmRsZXIgaXMgY2FsbGVkIGJ5IEJPVEhcbiAqIGNoYW5uZWxzIHdpdGggaXRzIG93biB2YXJpYW50LiBUaGUgcGFyYW1ldGVyIHR5cGUgaXMgYSB1bmlvbiDigJQgY29uc3VtZXJzXG4gKiBjYW4gZWl0aGVyIGhhbmRsZSBib3RoIHZhcmlhbnRzIHVuaWZvcm1seSwgb3IgZGlzY3JpbWluYXRlIChjb250cm9sLWZsb3dcbiAqIHZhcmlhbnRzIGNhcnJ5IGEgYHRyYXZlcnNhbENvbnRleHRgIGZpZWxkIHRoYXQgZGF0YS1mbG93IHZhcmlhbnRzIGxhY2spLlxuICpcbiAqICMjIEZvcndhcmQgY29tcGF0aWJpbGl0eVxuICpcbiAqIFdoZW4gYSB0aGlyZCBvYnNlcnZlciB0eXBlIHNoaXBzIChlLmcuIGBPcGVyYXRpb25SZWNvcmRlcmApLCB0aGUgdHlwZVxuICogZ2FpbnMgYW5vdGhlciBgJiBQYXJ0aWFsPOKApj5gIGNsYXVzZS4gQmVjYXVzZSBldmVyeSBjbGF1c2UgaXMgYFBhcnRpYWxgLFxuICogZXhpc3RpbmcgYENvbWJpbmVkUmVjb3JkZXJgIGltcGxlbWVudGF0aW9ucyByZW1haW4gdHlwZS12YWxpZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ29tYmluZWRSZWNvcmRlciA9IFBhcnRpYWw8T21pdDxTY29wZVJlY29yZGVyLCBTaGFyZWRMaWZlY3ljbGVPdmVybGFwIHwgU2hhcmVkTGlmZWN5Y2xlPj4gJlxuICBQYXJ0aWFsPE9taXQ8Rmxvd1JlY29yZGVyLCBTaGFyZWRMaWZlY3ljbGVPdmVybGFwIHwgU2hhcmVkTGlmZWN5Y2xlPj4gJlxuICAvLyBFbWl0IGNoYW5uZWwg4oCUIG5ldyB0aGlyZCBzdHJlYW0gKFBoYXNlIDMpLiBObyBtZXRob2QtbmFtZSBvdmVybGFwIHdpdGhcbiAgLy8gdGhlIG90aGVyIHR3byBpbnRlcmZhY2VzLCBzbyBhIHBsYWluIGludGVyc2VjdGlvbiBpcyBzb3VuZCDigJQgbm9cbiAgLy8gdW5pb24tcGF5bG9hZCBkaXNjcmltaW5hdG9yIG5lZWRlZC5cbiAgUGFydGlhbDxPbWl0PEVtaXRSZWNvcmRlciwgU2hhcmVkTGlmZWN5Y2xlPj4gJiB7XG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAgIC8vIFNoYXJlZCBsaWZlY3ljbGUgaG9va3Mg4oCUIHNhbWUgb24gYm90aCBpbnRlcmZhY2VzLCBzaGFwZSBjb21wYXRpYmxlLlxuICAgIGNsZWFyPygpOiB2b2lkO1xuICAgIHRvU25hcHNob3Q/KCk6IHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgICAgcHJlZmVycmVkT3BlcmF0aW9uPzogJ3RyYW5zbGF0ZScgfCAnYWNjdW11bGF0ZScgfCAnYWdncmVnYXRlJztcbiAgICAgIGRhdGE6IHVua25vd247XG4gICAgfTtcblxuICAgIC8vIFNoYXJlZCBldmVudCBtZXRob2QgbmFtZXMgd2l0aCBESVZFUkdFTlQgcGF5bG9hZHMg4oCUIGRlY2xhcmVkIGFzIHVuaW9ucy5cbiAgICAvLyBDb25zdW1lcnMgZWl0aGVyIGhhbmRsZSBib3RoIHZhcmlhbnRzLCBvciBkaXNjcmltaW5hdGUgdXNpbmcgdGhlXG4gICAgLy8gZXhwb3J0ZWQgaGVscGVyIGBpc0Zsb3dFdmVudCgpYCAod2hpY2ggY2hlY2tzIGZvciB0aGVcbiAgICAvLyBgdHJhdmVyc2FsQ29udGV4dGAgZmllbGQg4oCUIHByZXNlbnQgb25seSBvbiBjb250cm9sLWZsb3cgdmFyaWFudHMpLlxuICAgIC8vXG4gICAgLy8gQGV4YW1wbGVcbiAgICAvLyBgYGB0c1xuICAgIC8vIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICAgIC8vICAgaWQ6ICdhdWRpdCcsXG4gICAgLy8gICBvbkVycm9yOiAoZSkgPT4ge1xuICAgIC8vICAgICBpZiAoaXNGbG93RXZlbnQoZSkpIHtcbiAgICAvLyAgICAgICAvLyBlIGlzIEZsb3dFcnJvckV2ZW50IOKAlCBoYXMgc3RhZ2VOYW1lLCBtZXNzYWdlLCBzdHJ1Y3R1cmVkRXJyb3JcbiAgICAvLyAgICAgICBsb2coJ2Zsb3cgZXJyb3IgaW4gc3RhZ2UnLCBlLnN0YWdlTmFtZSk7XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgLy8gZSBpcyBFcnJvckV2ZW50IOKAlCBoYXMgZXJyb3IsIG9wZXJhdGlvbiwga2V5P1xuICAgIC8vICAgICAgIGxvZygnc2NvcGUgZXJyb3IgZHVyaW5nJywgZS5vcGVyYXRpb24sIGUuZXJyb3IubWVzc2FnZSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH0sXG4gICAgLy8gfTtcbiAgICAvLyBgYGBcbiAgICBvbkVycm9yPyhldmVudDogRXJyb3JFdmVudCB8IEZsb3dFcnJvckV2ZW50KTogdm9pZDtcbiAgICBvblBhdXNlPyhldmVudDogUGF1c2VFdmVudCB8IEZsb3dQYXVzZUV2ZW50KTogdm9pZDtcbiAgICBvblJlc3VtZT8oZXZlbnQ6IFJlc3VtZUV2ZW50IHwgRmxvd1Jlc3VtZUV2ZW50KTogdm9pZDtcbiAgfTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdG9yIGZvciB0aGUgdW5pb24gcGF5bG9hZCB0eXBlcyBvbiBgQ29tYmluZWRSZWNvcmRlcmAncyBzaGFyZWRcbiAqIG1ldGhvZHMgKGBvbkVycm9yYCwgYG9uUGF1c2VgLCBgb25SZXN1bWVgKS4gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGV2ZW50XG4gKiB3YXMgZW1pdHRlZCBmcm9tIHRoZSBjb250cm9sLWZsb3cgY2hhbm5lbCAoRmxvd1JlY29yZGVyKS5cbiAqXG4gKiAjIyBIb3cgaXQgZGlzY3JpbWluYXRlc1xuICpcbiAqIFNjb3BlLWNoYW5uZWwgZXZlbnRzIGV4dGVuZCBgUmVjb3JkZXJDb250ZXh0YCwgd2hpY2ggY2FycmllcyBgcGlwZWxpbmVJZGAuXG4gKiBGbG93LWNoYW5uZWwgZXZlbnRzIGRvIG5vdCBjYXJyeSBgcGlwZWxpbmVJZGAgKHRoZXkgY2FycnkgYW4gb3B0aW9uYWxcbiAqIGB0cmF2ZXJzYWxDb250ZXh0YCBpbnN0ZWFkLCBidXQgdGhhdCBmaWVsZCBpcyBvcHRpb25hbCBhbmQgY2Fubm90IGJlXG4gKiByZWxpZWQgb24gYXMgYSBwb3NpdGl2ZSBzaWduYWwpLiBXZSBkZXRlY3QgdGhlIGZsb3cgdmFyaWFudCBieSB0aGVcbiAqIEFCU0VOQ0Ugb2YgYHBpcGVsaW5lSWRgIOKAlCB0aGlzIGlzIHNjaGVtYS1zdGFibGUgYXMgbG9uZyBhcyBzY29wZSBldmVudHNcbiAqIGNvbnRpbnVlIHRvIGV4dGVuZCBgUmVjb3JkZXJDb250ZXh0YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIG9uRXJyb3I6IChlKSA9PiB7XG4gKiAgIGlmIChpc0Zsb3dFdmVudChlKSkge1xuICogICAgIC8vIE5hcnJvd2VkIHRvIEZsb3dFcnJvckV2ZW50OiBoYXMgc3RhZ2VOYW1lLCBtZXNzYWdlLCBzdHJ1Y3R1cmVkRXJyb3JcbiAqICAgfSBlbHNlIHtcbiAqICAgICAvLyBOYXJyb3dlZCB0byBFcnJvckV2ZW50OiBoYXMgZXJyb3IsIG9wZXJhdGlvbiwga2V5P1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRmxvd0V2ZW50PFQ+KGV2ZW50OiBUKTogZXZlbnQgaXMgRXhjbHVkZTxULCB7IHBpcGVsaW5lSWQ6IHN0cmluZyB9PiB7XG4gIGlmICh0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnIHx8IGV2ZW50ID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAoZXZlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnBpcGVsaW5lSWQgPT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBNZXRob2QgbmFtZXMgYmVsb25naW5nIHRvIHRoZSBgU2NvcGVSZWNvcmRlcmAgKGRhdGEtZmxvdykgaW50ZXJmYWNlLlxuICogS2VwdCBhcyBhIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggc28gdGhlIHJ1bnRpbWUgZHVjay10eXBlIGRldGVjdG9yIHN0YXlzXG4gKiBpbiBzeW5jIHdpdGggdGhlIGludGVyZmFjZS4gSWYgYSBtZXRob2QgaXMgYWRkZWQgdG8gYFNjb3BlUmVjb3JkZXJgLCBhZGRpbmcgaXRcbiAqIGhlcmUgaXMgdGhlIE9OTFkgY2hhbmdlIHJlcXVpcmVkIHRvIHJvdXRlIGNvbWJpbmVkLXJlY29yZGVycyBjb3JyZWN0bHkuXG4gKi9cbmNvbnN0IFJFQ09SREVSX0VWRU5UX01FVEhPRFMgPSBbXG4gICdvblJlYWQnLFxuICAnb25Xcml0ZScsXG4gICdvbkNvbW1pdCcsXG4gICdvbkVycm9yJyxcbiAgJ29uU3RhZ2VTdGFydCcsXG4gICdvblN0YWdlRW5kJyxcbiAgJ29uUGF1c2UnLFxuICAnb25SZXN1bWUnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBNZXRob2QgbmFtZXMgYmVsb25naW5nIHRvIHRoZSBgRmxvd1JlY29yZGVyYCAoY29udHJvbC1mbG93KSBpbnRlcmZhY2UuXG4gKiBTZWUgdGhlIG5vdGUgb24gYFJFQ09SREVSX0VWRU5UX01FVEhPRFNgLlxuICpcbiAqIE5PVEU6IHRoZSBgb25FcnJvcmAsIGBvblBhdXNlYCwgYG9uUmVzdW1lYCBtZXRob2RzIGV4aXN0IG9uIEJPVEggaW50ZXJmYWNlc1xuICogd2l0aCBESUZGRVJFTlQgZXZlbnQgcGF5bG9hZCBzaGFwZXMuIEEgYENvbWJpbmVkUmVjb3JkZXJgIHRoYXQgaW1wbGVtZW50c1xuICogYW55IG9mIHRoZXNlIHJlY2VpdmVzIGJvdGggdmFyaWFudHMgKG9uZSBmcm9tIGVhY2ggY2hhbm5lbCkuIENvbnN1bWVycyB3aG9cbiAqIGNhcmUgYWJvdXQgdGhlIGRpc3RpbmN0aW9uIGNhbiBkaXNjcmltaW5hdGUgb24gdGhlIHByZXNlbmNlIG9mXG4gKiBgdHJhdmVyc2FsQ29udGV4dGAgKHdoaWNoIG9ubHkgY29udHJvbC1mbG93IGV2ZW50cyBjYXJyeSkuXG4gKi9cbmNvbnN0IEZMT1dfUkVDT1JERVJfRVZFTlRfTUVUSE9EUyA9IFtcbiAgJ29uU3RhZ2VFeGVjdXRlZCcsXG4gICdvbk5leHQnLFxuICAnb25EZWNpc2lvbicsXG4gICdvbkZvcmsnLFxuICAnb25TZWxlY3RlZCcsXG4gICdvblN1YmZsb3dFbnRyeScsXG4gICdvblN1YmZsb3dFeGl0JyxcbiAgJ29uU3ViZmxvd1JlZ2lzdGVyZWQnLFxuICAnb25Mb29wJyxcbiAgJ29uQnJlYWsnLFxuICAnb25FcnJvcicsXG4gICdvblBhdXNlJyxcbiAgJ29uUmVzdW1lJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogTWV0aG9kIG5hbWVzIGJlbG9uZ2luZyB0byB0aGUgYEVtaXRSZWNvcmRlcmAgKHVzZXItZW1pdHRlZCBldmVudHMpXG4gKiBpbnRlcmZhY2UuIFNhbWUgY29udmVudGlvbiBhcyB0aGUgb3RoZXIgdHdvIGFycmF5cyBhYm92ZSDigJQga2VwdCBhc1xuICogdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGR1Y2stdHlwZSBkZXRlY3Rpb24uXG4gKi9cbmNvbnN0IEVNSVRfUkVDT1JERVJfRVZFTlRfTUVUSE9EUyA9IFsnb25FbWl0J10gYXMgY29uc3Q7XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJlY29yZGVyIGRlY2xhcmVzIGEgbWV0aG9kIG5hbWVkIGBtYCBlaXRoZXIgYXMgYW4gb3duXG4gKiBwcm9wZXJ0eSBPUiBvbiBpdHMgY2xhc3MtcHJvdG90eXBlIGNoYWluIOKAlCBidXQgTk9UIGluaGVyaXRlZCBmcm9tXG4gKiBgT2JqZWN0LnByb3RvdHlwZWAuXG4gKlxuICogIyMgV2h5IHRoaXMgbGF5ZXJlZCBjaGVja1xuICpcbiAqIEEgYENvbWJpbmVkUmVjb3JkZXJgIGNhbiBiZSBlaXRoZXIgYSBwbGFpbiBvYmplY3QgbGl0ZXJhbCAoaGFuZGxlcnMgYXNcbiAqIG93biBwcm9wZXJ0aWVzKSBPUiBhIGNsYXNzIGluc3RhbmNlIChoYW5kbGVycyBhcyBjbGFzcy1wcm90b3R5cGVcbiAqIG1ldGhvZHMpLiBCb3RoIGFyZSBsZWdpdGltYXRlIGNvbnN1bWVyIHBhdHRlcm5zIGFuZCBib3RoIE1VU1QgYXR0YWNoLlxuICpcbiAqIEJ1dCBoYW5kbGVycyBpbmhlcml0ZWQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYXJlIEFMV0FZUyBhY2NpZGVudGFsIG9yXG4gKiBtYWxpY2lvdXMgKG5vYm9keSBsZWdpdGltYXRlbHkgYXR0YWNoZXMgcmVjb3JkZXIgbWV0aG9kcyB0aGVyZSkuIFNvIHdlXG4gKiB3YWxrIHRoZSBwcm90b3R5cGUgY2hhaW4sIFNUT1BQSU5HIGJlZm9yZSBgT2JqZWN0LnByb3RvdHlwZWAuIFRoaXNcbiAqIGFjY2VwdHMgY2xhc3MgbWV0aG9kcyB3aGlsZSBzdGlsbCBibG9ja2luZyBgT2JqZWN0LnByb3RvdHlwZWBcbiAqIHBvbGx1dGlvbiBhdHRhY2tzLlxuICovXG5mdW5jdGlvbiBoYXNPd25PckNsYXNzTWV0aG9kKHI6IHVua25vd24sIG06IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAociA9PT0gbnVsbCB8fCB0eXBlb2YgciAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLCBtKSkge1xuICAgIHJldHVybiB0eXBlb2YgKHIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW21dID09PSAnZnVuY3Rpb24nO1xuICB9XG4gIGxldCBwcm90bzogdW5rbm93biA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtcbiAgd2hpbGUgKHByb3RvICE9PSBudWxsICYmIHByb3RvICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgbSkpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgKHByb3RvIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVttXSA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgaW1wbGVtZW50cyBhdCBsZWFzdCBvbmUgZGF0YS1mbG93IGV2ZW50IG1ldGhvZC5cbiAqIFVzZWQgYnkgYGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXJgIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGhvb2sgaW50b1xuICogdGhlIHNjb3BlIGRhdGEtZmxvdyBjaGFubmVsLlxuICpcbiAqICMjIERldGVjdGlvbiBydWxlXG4gKlxuICogQWNjZXB0cyBib3RoIG9iamVjdC1saXRlcmFsIHJlY29yZGVycyAob3duLXByb3BlcnR5IGhhbmRsZXJzKSBBTkQgY2xhc3NcbiAqIGluc3RhbmNlcyAoaGFuZGxlcnMgZGVjbGFyZWQgb24gdGhlIGNsYXNzIHByb3RvdHlwZSkuIFJlamVjdHMgaGFuZGxlcnNcbiAqIGluaGVyaXRlZCBmcm9tIGBPYmplY3QucHJvdG90eXBlYCDigJQgdGhhdCdzIGFsd2F5cyBhY2NpZGVudGFsIG9yXG4gKiBtYWxpY2lvdXMgcG9sbHV0aW9uLCBuZXZlciBhIGxlZ2l0aW1hdGUgcmVjb3JkZXIuXG4gKlxuICogIyMgTGlmZWN5Y2xlIGV4Y2x1c2lvbnNcbiAqXG4gKiBgY2xlYXJgIGFuZCBgdG9TbmFwc2hvdGAgYXJlIE5PVCBjb3VudGVkIGFzIGV2ZW50IG1ldGhvZHMg4oCUIGEgcmVjb3JkZXJcbiAqIHRoYXQgb25seSBpbXBsZW1lbnRzIHRob3NlIGhhcyBub3RoaW5nIHRvIG9ic2VydmUgYW5kIHdvdWxkIGJlIGEgbm8tb3BcbiAqIG9uIGVpdGhlciBjaGFubmVsLlxuICpcbiAqICMjIFJldHVybiB0eXBlXG4gKlxuICogUmV0dXJucyBwbGFpbiBgYm9vbGVhbmAgKG5vdCBhIHR5cGUgcHJlZGljYXRlKS4gVGhlIGZ1bGwgYFNjb3BlUmVjb3JkZXJgXG4gKiBpbnRlcmZhY2UgaGFzIHBheWxvYWQgdHlwZXMgdGhhdCBkaXZlcmdlIGZyb20gYENvbWJpbmVkUmVjb3JkZXJgJ3MgdW5pb25cbiAqIHZhcmlhbnRzIGZvciBzaGFyZWQgbWV0aG9kcywgc28gYSBuYXJyb3dpbmcgcHJlZGljYXRlIHdvdWxkIGJlIHVuc291bmQuXG4gKiBDYWxsZXJzIHRoYXQgbmVlZCB0byB0cmVhdCB0aGUgcmVjb3JkZXIgYXMgYSBgU2NvcGVSZWNvcmRlcmAgZG8gc28gZXhwbGljaXRseVxuICogYXQgdGhlIGF0dGFjaCBzaXRlIOKAlCB0aGUgY2FzdCBpcyB0aGUgY29udHJhY3QgdGhhdCBlYWNoIGNoYW5uZWwgcGFzc2VzXG4gKiBpdHMgb3duIHBheWxvYWQgdmFyaWFudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1JlY29yZGVyTWV0aG9kcyhyOiBDb21iaW5lZFJlY29yZGVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBSRUNPUkRFUl9FVkVOVF9NRVRIT0RTLnNvbWUoKG0pID0+IGhhc093bk9yQ2xhc3NNZXRob2QociwgbSkpO1xufVxuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIGF0IGxlYXN0IG9uZSBjb250cm9sLWZsb3cgZXZlbnQgbWV0aG9kLlxuICogU2VlIGBoYXNSZWNvcmRlck1ldGhvZHNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRmxvd1JlY29yZGVyTWV0aG9kcyhyOiBDb21iaW5lZFJlY29yZGVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBGTE9XX1JFQ09SREVSX0VWRU5UX01FVEhPRFMuc29tZSgobSkgPT4gaGFzT3duT3JDbGFzc01ldGhvZChyLCBtKSk7XG59XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJlY29yZGVyIGltcGxlbWVudHMgYXQgbGVhc3Qgb25lIGVtaXQtY2hhbm5lbCBldmVudCBtZXRob2QuXG4gKiBTZWUgYGhhc1JlY29yZGVyTWV0aG9kc2AgZm9yIHRoZSBvd25lcnNoaXAtZGV0ZWN0aW9uIHJ1bGVzIChvd24gb3JcbiAqIGNsYXNzLXByb3RvdHlwZSBtZXRob2RzIGNvdW50OyBgT2JqZWN0LnByb3RvdHlwZWAgcG9sbHV0aW9uIGRvZXMgbm90KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0VtaXRSZWNvcmRlck1ldGhvZHMocjogQ29tYmluZWRSZWNvcmRlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gRU1JVF9SRUNPUkRFUl9FVkVOVF9NRVRIT0RTLnNvbWUoKG0pID0+IGhhc093bk9yQ2xhc3NNZXRob2QociwgbSkpO1xufVxuIl19
@@ -0,0 +1,207 @@
1
+ /**
2
+ * CommitRangeIndex<TLabel> — interval index over commit indices.
3
+ *
4
+ * Built incrementally during traversal: `open(label, startIdx)` when a
5
+ * boundary begins, `close(token, endIdx)` when it ends. Query at any
6
+ * commit position with `enclosing(idx)` (returns ranges containing
7
+ * that index, ordered outer→inner) or `overlapping(start, end)`
8
+ * (returns ranges intersecting a slice).
9
+ *
10
+ * See `docs/design/commit-range-index.md` for the full contract. In
11
+ * one paragraph: this is a generic interval data structure for
12
+ * commit-range queries. footprintjs owns ZERO knowledge of what
13
+ * labels mean — consumers (agentfootprint, lens, OTel exporters)
14
+ * pick their own `TLabel` type. Open ranges (mid-run, no end yet)
15
+ * are first-class — query results carry `endIdx: undefined` for them.
16
+ *
17
+ * Pattern: incremental builder + interval query. Same "collect during
18
+ * traversal, never post-process" rule footprintjs's CLAUDE.md
19
+ * requires of every observer.
20
+ * Role: structural primitive for time-travel UIs and per-boundary
21
+ * aggregation.
22
+ * Channel: consumer-driven (no engine subscription).
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * import { CommitRangeIndex } from 'footprintjs/trace';
27
+ *
28
+ * const idx = new CommitRangeIndex<string>();
29
+ * const t = idx.open('LLMCall', executor.getCommitCount());
30
+ * // ... LLM call runs, scope writes happen ...
31
+ * idx.close(t, executor.getCommitCount());
32
+ *
33
+ * idx.enclosing(50); // → ranges containing commit 50, outer→inner
34
+ * idx.overlapping(40, 60); // → ranges sharing the slice [40,60]
35
+ * idx.clear(); // wipe (e.g., on new run)
36
+ * ```
37
+ *
38
+ * REDACTION NOTE: labels are stored verbatim and returned verbatim in
39
+ * query results — the index does NOT redact `TLabel` content. If a
40
+ * consumer attaches a label containing PII (user email, scope reads
41
+ * with sensitive keys, etc.) and then serializes the index for
42
+ * logging or telemetry, that data leaves the trust boundary. Use
43
+ * `RedactionPolicy` (or your own scrubbing) on the consumer side
44
+ * BEFORE attaching labels. The index follows the same contract as
45
+ * other footprintjs storage primitives (SequenceStore, KeyedStore):
46
+ * storage is verbatim; redaction is the caller's responsibility.
47
+ */
48
+ export class CommitRangeIndex {
49
+ entries = [];
50
+ byId = new Map();
51
+ nextId = 0;
52
+ /** Identity for token scoping — each index gets a fresh symbol so
53
+ * tokens from one index can't accidentally close ranges in another.
54
+ * ROTATED on `clear()` to invalidate stale tokens that survived a
55
+ * run reset (would otherwise hit a recycled id and silently mutate
56
+ * a different range — see DS+logic panel review RED #1). */
57
+ owner = Symbol('CommitRangeIndex');
58
+ /**
59
+ * Open a new range. Returns a token the caller MUST hold and pass
60
+ * to `close()` later. Each `open()` gets a fresh token; tokens
61
+ * cannot be reused or shared across indices (silent no-op if
62
+ * misused — see Law 2 in the design doc). Tokens from BEFORE
63
+ * the most recent `clear()` are also invalid (owner symbol
64
+ * rotates on clear).
65
+ */
66
+ open(label, startIdx) {
67
+ const id = this.nextId++;
68
+ const entry = {
69
+ label,
70
+ startIdx,
71
+ endIdx: undefined,
72
+ id,
73
+ closed: false,
74
+ };
75
+ this.entries.push(entry);
76
+ this.byId.set(id, entry);
77
+ return { _id: id, _owner: this.owner };
78
+ }
79
+ /**
80
+ * Close an open range at `endIdx` (inclusive). After close, the
81
+ * range is queryable with both bounds. Closing an already-closed
82
+ * token is a no-op. Closing an unknown token (from another index,
83
+ * or fabricated) is a no-op.
84
+ */
85
+ close(token, endIdx) {
86
+ if (token._owner !== this.owner)
87
+ return; // cross-index misuse — silent no-op
88
+ const entry = this.findById(token._id);
89
+ if (!entry || entry.closed)
90
+ return;
91
+ entry.endIdx = endIdx;
92
+ entry.closed = true;
93
+ }
94
+ /**
95
+ * Returns ALL ranges enclosing `commitIdx`, ordered outer→inner.
96
+ * Includes both closed and open ranges. For a closed range to
97
+ * enclose: `startIdx <= commitIdx <= endIdx`. For an open range:
98
+ * `startIdx <= commitIdx` (no upper bound check).
99
+ *
100
+ * Ordering rule: ascending by `startIdx`, with TIES BROKEN BY
101
+ * descending `endIdx` (wider range = outer). Open ranges (endIdx
102
+ * undefined) are treated as `+Infinity` for tie-break — they
103
+ * always sort outer of any closed range starting at the same idx.
104
+ * This is the only deterministic outer→inner ordering when two
105
+ * boundaries open at the same commit (e.g., Parallel root +
106
+ * its first branch).
107
+ *
108
+ * Returns a SHALLOW IMMUTABLE COPY — caller mutations don't affect
109
+ * internal state.
110
+ */
111
+ enclosing(commitIdx) {
112
+ const matches = [];
113
+ for (const e of this.entries) {
114
+ if (e.startIdx > commitIdx)
115
+ continue;
116
+ if (e.endIdx === undefined || e.endIdx >= commitIdx) {
117
+ matches.push(toEntry(e));
118
+ }
119
+ }
120
+ matches.sort(outerToInnerComparator);
121
+ return matches;
122
+ }
123
+ /**
124
+ * Returns all ranges OVERLAPPING the slice `[startIdx, endIdx]`. A
125
+ * range overlaps if it shares at least one commit position with the
126
+ * slice. Use for parallel-branch detection, time-window queries,
127
+ * or "what boundaries fired during this slice."
128
+ *
129
+ * Sorted by the SAME outer→inner comparator as `enclosing()`:
130
+ * ascending by `startIdx`, ties broken by descending `endIdx`
131
+ * (wider = outer; open ranges treated as +Infinity).
132
+ *
133
+ * Returns a SHALLOW IMMUTABLE COPY.
134
+ */
135
+ overlapping(startIdx, endIdx) {
136
+ const matches = [];
137
+ for (const e of this.entries) {
138
+ // Overlap test:
139
+ // range starts after slice ends → no overlap
140
+ // range ends (closed) before slice starts → no overlap
141
+ // otherwise → overlap (open ranges always overlap if they start <= endIdx)
142
+ if (e.startIdx > endIdx)
143
+ continue;
144
+ if (e.endIdx !== undefined && e.endIdx < startIdx)
145
+ continue;
146
+ matches.push(toEntry(e));
147
+ }
148
+ matches.sort(outerToInnerComparator);
149
+ return matches;
150
+ }
151
+ /** Total range count (open + closed). */
152
+ get size() {
153
+ return this.entries.length;
154
+ }
155
+ /**
156
+ * Wipe all ranges + reset the token counter AND rotate the owner
157
+ * symbol so any token from before this clear becomes invalid.
158
+ * Critical: without rotating the owner, a stale token whose `_id`
159
+ * happens to match a recycled id after clear would silently mutate
160
+ * the wrong entry. Owner rotation makes stale-token close a no-op
161
+ * via the `_owner !== this.owner` guard.
162
+ *
163
+ * Call from a consumer's runId guard when a new run starts (e.g.,
164
+ * agentfootprint's `observeRunId(onNewRun)` from Phase 2).
165
+ */
166
+ clear() {
167
+ this.entries.length = 0;
168
+ this.byId.clear();
169
+ this.nextId = 0;
170
+ this.owner = Symbol('CommitRangeIndex');
171
+ }
172
+ // ─── Internals ────────────────────────────────────────────────────
173
+ /** O(1) lookup by token id. Always returns the entry that the token
174
+ * references (or undefined if the id was never opened in this index). */
175
+ findById(id) {
176
+ return this.byId.get(id);
177
+ }
178
+ }
179
+ /** Project the internal mutable shape into the public readonly entry.
180
+ * The OUTER object is a fresh allocation per query (so caller array
181
+ * mutations don't leak). The `label` field is a REFERENCE COPY —
182
+ * if `TLabel` is an object, mutating its fields will affect the
183
+ * internal entry too. Consumers MUST treat labels as immutable
184
+ * (or pass primitives). Documented in the class JSDoc as the
185
+ * "labels are stored verbatim" contract. */
186
+ function toEntry(e) {
187
+ return e.endIdx === undefined
188
+ ? { label: e.label, startIdx: e.startIdx }
189
+ : { label: e.label, startIdx: e.startIdx, endIdx: e.endIdx };
190
+ }
191
+ /**
192
+ * Shared outer→inner comparator for both `enclosing()` and
193
+ * `overlapping()`. Primary key: `startIdx` ascending. Tie-break:
194
+ * `endIdx` descending (wider range is outer). Open ranges (undefined
195
+ * `endIdx`) sort as +Infinity → outermost when tied. Deterministic
196
+ * ordering required so consumers (Lens breadcrumb, time-travel UIs)
197
+ * never see flicker on equal-start boundaries (e.g., a Parallel
198
+ * root and its first branch opening at the same commit).
199
+ */
200
+ function outerToInnerComparator(a, b) {
201
+ if (a.startIdx !== b.startIdx)
202
+ return a.startIdx - b.startIdx;
203
+ const ae = a.endIdx ?? Number.POSITIVE_INFINITY;
204
+ const be = b.endIdx ?? Number.POSITIVE_INFINITY;
205
+ return be - ae;
206
+ }
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tbWl0UmFuZ2VJbmRleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvQ29tbWl0UmFuZ2VJbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThDRztBQTRDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ25CLE9BQU8sR0FBNEIsRUFBRSxDQUFDO0lBQ3RDLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztJQUNoRCxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ25COzs7O2lFQUk2RDtJQUNyRCxLQUFLLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFFM0M7Ozs7Ozs7T0FPRztJQUNILElBQUksQ0FBQyxLQUFhLEVBQUUsUUFBZ0I7UUFDbEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLE1BQU0sS0FBSyxHQUEwQjtZQUNuQyxLQUFLO1lBQ0wsUUFBUTtZQUNSLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLEVBQUU7WUFDRixNQUFNLEVBQUUsS0FBSztTQUNkLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekIsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsS0FBaUIsRUFBRSxNQUFjO1FBQ3JDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sQ0FBQyxvQ0FBb0M7UUFDN0UsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDbkMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDdEIsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsU0FBUyxDQUFDLFNBQWlCO1FBQ3pCLE1BQU0sT0FBTyxHQUF5QixFQUFFLENBQUM7UUFDekMsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLENBQUMsUUFBUSxHQUFHLFNBQVM7Z0JBQUUsU0FBUztZQUNyQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ3BELE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDckMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsV0FBVyxDQUFDLFFBQWdCLEVBQUUsTUFBYztRQUMxQyxNQUFNLE9BQU8sR0FBeUIsRUFBRSxDQUFDO1FBQ3pDLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdCLGdCQUFnQjtZQUNoQiwrQ0FBK0M7WUFDL0MseURBQXlEO1lBQ3pELDZFQUE2RTtZQUM3RSxJQUFJLENBQUMsQ0FBQyxRQUFRLEdBQUcsTUFBTTtnQkFBRSxTQUFTO1lBQ2xDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxRQUFRO2dCQUFFLFNBQVM7WUFDNUQsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxxRUFBcUU7SUFFckU7OEVBQzBFO0lBQ2xFLFFBQVEsQ0FBQyxFQUFVO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs2Q0FNNkM7QUFDN0MsU0FBUyxPQUFPLENBQVMsQ0FBd0I7SUFDL0MsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVM7UUFDM0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7UUFDMUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNqRSxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLHNCQUFzQixDQUFTLENBQXFCLEVBQUUsQ0FBcUI7SUFDbEYsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxRQUFRO1FBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDOUQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDaEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDaEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbW1pdFJhbmdlSW5kZXg8VExhYmVsPiDigJQgaW50ZXJ2YWwgaW5kZXggb3ZlciBjb21taXQgaW5kaWNlcy5cbiAqXG4gKiBCdWlsdCBpbmNyZW1lbnRhbGx5IGR1cmluZyB0cmF2ZXJzYWw6IGBvcGVuKGxhYmVsLCBzdGFydElkeClgIHdoZW4gYVxuICogYm91bmRhcnkgYmVnaW5zLCBgY2xvc2UodG9rZW4sIGVuZElkeClgIHdoZW4gaXQgZW5kcy4gUXVlcnkgYXQgYW55XG4gKiBjb21taXQgcG9zaXRpb24gd2l0aCBgZW5jbG9zaW5nKGlkeClgIChyZXR1cm5zIHJhbmdlcyBjb250YWluaW5nXG4gKiB0aGF0IGluZGV4LCBvcmRlcmVkIG91dGVy4oaSaW5uZXIpIG9yIGBvdmVybGFwcGluZyhzdGFydCwgZW5kKWBcbiAqIChyZXR1cm5zIHJhbmdlcyBpbnRlcnNlY3RpbmcgYSBzbGljZSkuXG4gKlxuICogU2VlIGBkb2NzL2Rlc2lnbi9jb21taXQtcmFuZ2UtaW5kZXgubWRgIGZvciB0aGUgZnVsbCBjb250cmFjdC4gSW5cbiAqIG9uZSBwYXJhZ3JhcGg6IHRoaXMgaXMgYSBnZW5lcmljIGludGVydmFsIGRhdGEgc3RydWN0dXJlIGZvclxuICogY29tbWl0LXJhbmdlIHF1ZXJpZXMuIGZvb3RwcmludGpzIG93bnMgWkVSTyBrbm93bGVkZ2Ugb2Ygd2hhdFxuICogbGFiZWxzIG1lYW4g4oCUIGNvbnN1bWVycyAoYWdlbnRmb290cHJpbnQsIGxlbnMsIE9UZWwgZXhwb3J0ZXJzKVxuICogcGljayB0aGVpciBvd24gYFRMYWJlbGAgdHlwZS4gT3BlbiByYW5nZXMgKG1pZC1ydW4sIG5vIGVuZCB5ZXQpXG4gKiBhcmUgZmlyc3QtY2xhc3Mg4oCUIHF1ZXJ5IHJlc3VsdHMgY2FycnkgYGVuZElkeDogdW5kZWZpbmVkYCBmb3IgdGhlbS5cbiAqXG4gKiBQYXR0ZXJuOiBpbmNyZW1lbnRhbCBidWlsZGVyICsgaW50ZXJ2YWwgcXVlcnkuIFNhbWUgXCJjb2xsZWN0IGR1cmluZ1xuICogICAgICAgICAgdHJhdmVyc2FsLCBuZXZlciBwb3N0LXByb2Nlc3NcIiBydWxlIGZvb3RwcmludGpzJ3MgQ0xBVURFLm1kXG4gKiAgICAgICAgICByZXF1aXJlcyBvZiBldmVyeSBvYnNlcnZlci5cbiAqIFJvbGU6ICAgIHN0cnVjdHVyYWwgcHJpbWl0aXZlIGZvciB0aW1lLXRyYXZlbCBVSXMgYW5kIHBlci1ib3VuZGFyeVxuICogICAgICAgICAgYWdncmVnYXRpb24uXG4gKiBDaGFubmVsOiBjb25zdW1lci1kcml2ZW4gKG5vIGVuZ2luZSBzdWJzY3JpcHRpb24pLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBDb21taXRSYW5nZUluZGV4IH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICpcbiAqIGNvbnN0IGlkeCA9IG5ldyBDb21taXRSYW5nZUluZGV4PHN0cmluZz4oKTtcbiAqIGNvbnN0IHQgPSBpZHgub3BlbignTExNQ2FsbCcsIGV4ZWN1dG9yLmdldENvbW1pdENvdW50KCkpO1xuICogLy8gLi4uIExMTSBjYWxsIHJ1bnMsIHNjb3BlIHdyaXRlcyBoYXBwZW4gLi4uXG4gKiBpZHguY2xvc2UodCwgZXhlY3V0b3IuZ2V0Q29tbWl0Q291bnQoKSk7XG4gKlxuICogaWR4LmVuY2xvc2luZyg1MCk7ICAvLyDihpIgcmFuZ2VzIGNvbnRhaW5pbmcgY29tbWl0IDUwLCBvdXRlcuKGkmlubmVyXG4gKiBpZHgub3ZlcmxhcHBpbmcoNDAsIDYwKTsgIC8vIOKGkiByYW5nZXMgc2hhcmluZyB0aGUgc2xpY2UgWzQwLDYwXVxuICogaWR4LmNsZWFyKCk7ICAgICAgICAvLyB3aXBlIChlLmcuLCBvbiBuZXcgcnVuKVxuICogYGBgXG4gKlxuICogUkVEQUNUSU9OIE5PVEU6IGxhYmVscyBhcmUgc3RvcmVkIHZlcmJhdGltIGFuZCByZXR1cm5lZCB2ZXJiYXRpbSBpblxuICogcXVlcnkgcmVzdWx0cyDigJQgdGhlIGluZGV4IGRvZXMgTk9UIHJlZGFjdCBgVExhYmVsYCBjb250ZW50LiBJZiBhXG4gKiBjb25zdW1lciBhdHRhY2hlcyBhIGxhYmVsIGNvbnRhaW5pbmcgUElJICh1c2VyIGVtYWlsLCBzY29wZSByZWFkc1xuICogd2l0aCBzZW5zaXRpdmUga2V5cywgZXRjLikgYW5kIHRoZW4gc2VyaWFsaXplcyB0aGUgaW5kZXggZm9yXG4gKiBsb2dnaW5nIG9yIHRlbGVtZXRyeSwgdGhhdCBkYXRhIGxlYXZlcyB0aGUgdHJ1c3QgYm91bmRhcnkuIFVzZVxuICogYFJlZGFjdGlvblBvbGljeWAgKG9yIHlvdXIgb3duIHNjcnViYmluZykgb24gdGhlIGNvbnN1bWVyIHNpZGVcbiAqIEJFRk9SRSBhdHRhY2hpbmcgbGFiZWxzLiBUaGUgaW5kZXggZm9sbG93cyB0aGUgc2FtZSBjb250cmFjdCBhc1xuICogb3RoZXIgZm9vdHByaW50anMgc3RvcmFnZSBwcmltaXRpdmVzIChTZXF1ZW5jZVN0b3JlLCBLZXllZFN0b3JlKTpcbiAqIHN0b3JhZ2UgaXMgdmVyYmF0aW07IHJlZGFjdGlvbiBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuXG4gKi9cblxuLyoqIE9wYXF1ZSB0b2tlbiBpZGVudGlmeWluZyBhbiBvcGVuIHJhbmdlLiBIb2xkIG9udG8gaXQ7IHBhc3MgdG8gYGNsb3NlKClgLlxuICogIEluZGV4LXNjb3BlZCDigJQgdXNpbmcgYSB0b2tlbiBmcm9tIG9uZSBDb21taXRSYW5nZUluZGV4IG9uIGFub3RoZXIgaXNcbiAqICBhIHNpbGVudCBuby1vcCAodmVyaWZpZWQgYnkgdGhlIHBlci1pbmRleCBgX293bmVyYCBzeW1ib2wpLlxuICpcbiAqICBTRUNVUklUWSBOT1RFOiB0aGUgYF9vd25lcmAgc3ltYm9sIGlzIGVudW1lcmFibGUgb24gdGhlIHRva2VuIG9iamVjdFxuICogIHZpYSBgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0b2tlbilgLiBUaGlzIG1lYW5zIHRva2VucyBhcmUgTk9UXG4gKiAgYWR2ZXJzYXJ5LXNhZmUg4oCUIGEgbWFsaWNpb3VzIGNhbGxlciB3aXRoIGFjY2VzcyB0byBBTlkgdG9rZW4gZnJvbVxuICogIHRoaXMgaW5kZXggY2FuIHJlY292ZXIgdGhlIG93bmVyIHN5bWJvbCBhbmQgZm9yZ2UgbmV3IHRva2Vucy4gVGhlXG4gKiAgaW5kZXggaXMgZGVzaWduZWQgZm9yIGluLXByb2Nlc3MgdHJ1c3QgYm91bmRhcmllcyAoY29vcGVyYXRpdmVcbiAqICByZWNvcmRlcnMgc2hhcmluZyBvbmUgcnVubmVyKSwgbm90IGZvciBob3N0aWxlLWlucHV0IHNjZW5hcmlvcy5cbiAqICBJZiBhZHZlcnNhcnktc2FmZXR5IGJlY29tZXMgYSByZXF1aXJlbWVudCwgc3dpdGNoIHRvIGEgV2Vha01hcC1cbiAqICBzY29wZWQgdG9rZW4gbW9kZWwgKHNlZSBzZWN1cml0eSBwYW5lbCByZXZpZXcgWTIpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZVRva2VuIHtcbiAgLyoqIFBlci1pbmRleCBzZXF1ZW50aWFsIGlkLiBPcGFxdWUgdG8gY29uc3VtZXJzIOKAlCB0aGV5IHNob3VsZG4ndCByZWFkIGl0LiAqL1xuICByZWFkb25seSBfaWQ6IG51bWJlcjtcbiAgLyoqIFBlci1pbmRleCBpZGVudGl0eSDigJQgcHJldmVudHMgYWNjaWRlbnRhbCBjcm9zcy1pbmRleCB0b2tlbiBtaXN1c2UuICovXG4gIHJlYWRvbmx5IF9vd25lcjogc3ltYm9sO1xufVxuXG4vKiogQSBzaW5nbGUgcmFuZ2UgYXMgcmV0dXJuZWQgYnkgcXVlcnkgbWV0aG9kcy4gRnJvemVuLXNoYXBlIOKAlCByZWFkb25seSBmaWVsZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlRW50cnk8VExhYmVsPiB7XG4gIHJlYWRvbmx5IGxhYmVsOiBUTGFiZWw7XG4gIHJlYWRvbmx5IHN0YXJ0SWR4OiBudW1iZXI7XG4gIC8qKiBVbmRlZmluZWQgd2hpbGUgdGhlIHJhbmdlIGlzIHN0aWxsIG9wZW4gKG1pZC1ydW4gYm91bmRhcnkpLiAqL1xuICByZWFkb25seSBlbmRJZHg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgc3RvcmFnZSBzaGFwZS4gTXV0YWJsZSB3aGlsZSB0aGUgcmFuZ2UgaXMgb3Blbjsgb25jZVxuICogY2xvc2VkLCBgZW5kSWR4YCBpcyBzZXQgYW5kIG5ldmVyIGNoYW5nZXMuIFRva2VucyByZWZlcmVuY2UgdGhlc2VcbiAqIGJ5IHRoZWlyIHBvc2l0aW9uIGluIHRoZSBgZW50cmllc2AgYXJyYXkgKHRoZSBgX2lkYCkuXG4gKi9cbmludGVyZmFjZSBJbnRlcm5hbEVudHJ5PFRMYWJlbD4ge1xuICBsYWJlbDogVExhYmVsO1xuICBzdGFydElkeDogbnVtYmVyO1xuICBlbmRJZHg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqIEludGVybmFsIGN1cnNvciDigJQgYXNzaWduZWQgb24gYG9wZW4oKWAsIHVzZWQgdG8gaWRlbnRpZnkgYnkgdG9rZW4uICovXG4gIGlkOiBudW1iZXI7XG4gIC8qKiBUcnVlIGFmdGVyIGBjbG9zZSgpYCBydW5zLiBQcmV2ZW50cyBkb3VibGUtY2xvc2UgbXV0YXRpb24uICovXG4gIGNsb3NlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbW1pdFJhbmdlSW5kZXg8VExhYmVsPiB7XG4gIHByaXZhdGUgZW50cmllczogSW50ZXJuYWxFbnRyeTxUTGFiZWw+W10gPSBbXTtcbiAgcHJpdmF0ZSBieUlkID0gbmV3IE1hcDxudW1iZXIsIEludGVybmFsRW50cnk8VExhYmVsPj4oKTtcbiAgcHJpdmF0ZSBuZXh0SWQgPSAwO1xuICAvKiogSWRlbnRpdHkgZm9yIHRva2VuIHNjb3Bpbmcg4oCUIGVhY2ggaW5kZXggZ2V0cyBhIGZyZXNoIHN5bWJvbCBzb1xuICAgKiAgdG9rZW5zIGZyb20gb25lIGluZGV4IGNhbid0IGFjY2lkZW50YWxseSBjbG9zZSByYW5nZXMgaW4gYW5vdGhlci5cbiAgICogIFJPVEFURUQgb24gYGNsZWFyKClgIHRvIGludmFsaWRhdGUgc3RhbGUgdG9rZW5zIHRoYXQgc3Vydml2ZWQgYVxuICAgKiAgcnVuIHJlc2V0ICh3b3VsZCBvdGhlcndpc2UgaGl0IGEgcmVjeWNsZWQgaWQgYW5kIHNpbGVudGx5IG11dGF0ZVxuICAgKiAgYSBkaWZmZXJlbnQgcmFuZ2Ug4oCUIHNlZSBEUytsb2dpYyBwYW5lbCByZXZpZXcgUkVEICMxKS4gKi9cbiAgcHJpdmF0ZSBvd25lciA9IFN5bWJvbCgnQ29tbWl0UmFuZ2VJbmRleCcpO1xuXG4gIC8qKlxuICAgKiBPcGVuIGEgbmV3IHJhbmdlLiBSZXR1cm5zIGEgdG9rZW4gdGhlIGNhbGxlciBNVVNUIGhvbGQgYW5kIHBhc3NcbiAgICogdG8gYGNsb3NlKClgIGxhdGVyLiBFYWNoIGBvcGVuKClgIGdldHMgYSBmcmVzaCB0b2tlbjsgdG9rZW5zXG4gICAqIGNhbm5vdCBiZSByZXVzZWQgb3Igc2hhcmVkIGFjcm9zcyBpbmRpY2VzIChzaWxlbnQgbm8tb3AgaWZcbiAgICogbWlzdXNlZCDigJQgc2VlIExhdyAyIGluIHRoZSBkZXNpZ24gZG9jKS4gVG9rZW5zIGZyb20gQkVGT1JFXG4gICAqIHRoZSBtb3N0IHJlY2VudCBgY2xlYXIoKWAgYXJlIGFsc28gaW52YWxpZCAob3duZXIgc3ltYm9sXG4gICAqIHJvdGF0ZXMgb24gY2xlYXIpLlxuICAgKi9cbiAgb3BlbihsYWJlbDogVExhYmVsLCBzdGFydElkeDogbnVtYmVyKTogUmFuZ2VUb2tlbiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLm5leHRJZCsrO1xuICAgIGNvbnN0IGVudHJ5OiBJbnRlcm5hbEVudHJ5PFRMYWJlbD4gPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIHN0YXJ0SWR4LFxuICAgICAgZW5kSWR4OiB1bmRlZmluZWQsXG4gICAgICBpZCxcbiAgICAgIGNsb3NlZDogZmFsc2UsXG4gICAgfTtcbiAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgdGhpcy5ieUlkLnNldChpZCwgZW50cnkpO1xuICAgIHJldHVybiB7IF9pZDogaWQsIF9vd25lcjogdGhpcy5vd25lciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGFuIG9wZW4gcmFuZ2UgYXQgYGVuZElkeGAgKGluY2x1c2l2ZSkuIEFmdGVyIGNsb3NlLCB0aGVcbiAgICogcmFuZ2UgaXMgcXVlcnlhYmxlIHdpdGggYm90aCBib3VuZHMuIENsb3NpbmcgYW4gYWxyZWFkeS1jbG9zZWRcbiAgICogdG9rZW4gaXMgYSBuby1vcC4gQ2xvc2luZyBhbiB1bmtub3duIHRva2VuIChmcm9tIGFub3RoZXIgaW5kZXgsXG4gICAqIG9yIGZhYnJpY2F0ZWQpIGlzIGEgbm8tb3AuXG4gICAqL1xuICBjbG9zZSh0b2tlbjogUmFuZ2VUb2tlbiwgZW5kSWR4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodG9rZW4uX293bmVyICE9PSB0aGlzLm93bmVyKSByZXR1cm47IC8vIGNyb3NzLWluZGV4IG1pc3VzZSDigJQgc2lsZW50IG5vLW9wXG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmZpbmRCeUlkKHRva2VuLl9pZCk7XG4gICAgaWYgKCFlbnRyeSB8fCBlbnRyeS5jbG9zZWQpIHJldHVybjtcbiAgICBlbnRyeS5lbmRJZHggPSBlbmRJZHg7XG4gICAgZW50cnkuY2xvc2VkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIEFMTCByYW5nZXMgZW5jbG9zaW5nIGBjb21taXRJZHhgLCBvcmRlcmVkIG91dGVy4oaSaW5uZXIuXG4gICAqIEluY2x1ZGVzIGJvdGggY2xvc2VkIGFuZCBvcGVuIHJhbmdlcy4gRm9yIGEgY2xvc2VkIHJhbmdlIHRvXG4gICAqIGVuY2xvc2U6IGBzdGFydElkeCA8PSBjb21taXRJZHggPD0gZW5kSWR4YC4gRm9yIGFuIG9wZW4gcmFuZ2U6XG4gICAqIGBzdGFydElkeCA8PSBjb21taXRJZHhgIChubyB1cHBlciBib3VuZCBjaGVjaykuXG4gICAqXG4gICAqIE9yZGVyaW5nIHJ1bGU6IGFzY2VuZGluZyBieSBgc3RhcnRJZHhgLCB3aXRoIFRJRVMgQlJPS0VOIEJZXG4gICAqIGRlc2NlbmRpbmcgYGVuZElkeGAgKHdpZGVyIHJhbmdlID0gb3V0ZXIpLiBPcGVuIHJhbmdlcyAoZW5kSWR4XG4gICAqIHVuZGVmaW5lZCkgYXJlIHRyZWF0ZWQgYXMgYCtJbmZpbml0eWAgZm9yIHRpZS1icmVhayDigJQgdGhleVxuICAgKiBhbHdheXMgc29ydCBvdXRlciBvZiBhbnkgY2xvc2VkIHJhbmdlIHN0YXJ0aW5nIGF0IHRoZSBzYW1lIGlkeC5cbiAgICogVGhpcyBpcyB0aGUgb25seSBkZXRlcm1pbmlzdGljIG91dGVy4oaSaW5uZXIgb3JkZXJpbmcgd2hlbiB0d29cbiAgICogYm91bmRhcmllcyBvcGVuIGF0IHRoZSBzYW1lIGNvbW1pdCAoZS5nLiwgUGFyYWxsZWwgcm9vdCArXG4gICAqIGl0cyBmaXJzdCBicmFuY2gpLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgU0hBTExPVyBJTU1VVEFCTEUgQ09QWSDigJQgY2FsbGVyIG11dGF0aW9ucyBkb24ndCBhZmZlY3RcbiAgICogaW50ZXJuYWwgc3RhdGUuXG4gICAqL1xuICBlbmNsb3NpbmcoY29tbWl0SWR4OiBudW1iZXIpOiByZWFkb25seSBSYW5nZUVudHJ5PFRMYWJlbD5bXSB7XG4gICAgY29uc3QgbWF0Y2hlczogUmFuZ2VFbnRyeTxUTGFiZWw+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5lbnRyaWVzKSB7XG4gICAgICBpZiAoZS5zdGFydElkeCA+IGNvbW1pdElkeCkgY29udGludWU7XG4gICAgICBpZiAoZS5lbmRJZHggPT09IHVuZGVmaW5lZCB8fCBlLmVuZElkeCA+PSBjb21taXRJZHgpIHtcbiAgICAgICAgbWF0Y2hlcy5wdXNoKHRvRW50cnkoZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBtYXRjaGVzLnNvcnQob3V0ZXJUb0lubmVyQ29tcGFyYXRvcik7XG4gICAgcmV0dXJuIG1hdGNoZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgcmFuZ2VzIE9WRVJMQVBQSU5HIHRoZSBzbGljZSBgW3N0YXJ0SWR4LCBlbmRJZHhdYC4gQVxuICAgKiByYW5nZSBvdmVybGFwcyBpZiBpdCBzaGFyZXMgYXQgbGVhc3Qgb25lIGNvbW1pdCBwb3NpdGlvbiB3aXRoIHRoZVxuICAgKiBzbGljZS4gVXNlIGZvciBwYXJhbGxlbC1icmFuY2ggZGV0ZWN0aW9uLCB0aW1lLXdpbmRvdyBxdWVyaWVzLFxuICAgKiBvciBcIndoYXQgYm91bmRhcmllcyBmaXJlZCBkdXJpbmcgdGhpcyBzbGljZS5cIlxuICAgKlxuICAgKiBTb3J0ZWQgYnkgdGhlIFNBTUUgb3V0ZXLihpJpbm5lciBjb21wYXJhdG9yIGFzIGBlbmNsb3NpbmcoKWA6XG4gICAqIGFzY2VuZGluZyBieSBgc3RhcnRJZHhgLCB0aWVzIGJyb2tlbiBieSBkZXNjZW5kaW5nIGBlbmRJZHhgXG4gICAqICh3aWRlciA9IG91dGVyOyBvcGVuIHJhbmdlcyB0cmVhdGVkIGFzICtJbmZpbml0eSkuXG4gICAqXG4gICAqIFJldHVybnMgYSBTSEFMTE9XIElNTVVUQUJMRSBDT1BZLlxuICAgKi9cbiAgb3ZlcmxhcHBpbmcoc3RhcnRJZHg6IG51bWJlciwgZW5kSWR4OiBudW1iZXIpOiByZWFkb25seSBSYW5nZUVudHJ5PFRMYWJlbD5bXSB7XG4gICAgY29uc3QgbWF0Y2hlczogUmFuZ2VFbnRyeTxUTGFiZWw+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5lbnRyaWVzKSB7XG4gICAgICAvLyBPdmVybGFwIHRlc3Q6XG4gICAgICAvLyAgIHJhbmdlIHN0YXJ0cyBhZnRlciBzbGljZSBlbmRzIOKGkiBubyBvdmVybGFwXG4gICAgICAvLyAgIHJhbmdlIGVuZHMgKGNsb3NlZCkgYmVmb3JlIHNsaWNlIHN0YXJ0cyDihpIgbm8gb3ZlcmxhcFxuICAgICAgLy8gICBvdGhlcndpc2Ug4oaSIG92ZXJsYXAgKG9wZW4gcmFuZ2VzIGFsd2F5cyBvdmVybGFwIGlmIHRoZXkgc3RhcnQgPD0gZW5kSWR4KVxuICAgICAgaWYgKGUuc3RhcnRJZHggPiBlbmRJZHgpIGNvbnRpbnVlO1xuICAgICAgaWYgKGUuZW5kSWR4ICE9PSB1bmRlZmluZWQgJiYgZS5lbmRJZHggPCBzdGFydElkeCkgY29udGludWU7XG4gICAgICBtYXRjaGVzLnB1c2godG9FbnRyeShlKSk7XG4gICAgfVxuICAgIG1hdGNoZXMuc29ydChvdXRlclRvSW5uZXJDb21wYXJhdG9yKTtcbiAgICByZXR1cm4gbWF0Y2hlcztcbiAgfVxuXG4gIC8qKiBUb3RhbCByYW5nZSBjb3VudCAob3BlbiArIGNsb3NlZCkuICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogV2lwZSBhbGwgcmFuZ2VzICsgcmVzZXQgdGhlIHRva2VuIGNvdW50ZXIgQU5EIHJvdGF0ZSB0aGUgb3duZXJcbiAgICogc3ltYm9sIHNvIGFueSB0b2tlbiBmcm9tIGJlZm9yZSB0aGlzIGNsZWFyIGJlY29tZXMgaW52YWxpZC5cbiAgICogQ3JpdGljYWw6IHdpdGhvdXQgcm90YXRpbmcgdGhlIG93bmVyLCBhIHN0YWxlIHRva2VuIHdob3NlIGBfaWRgXG4gICAqIGhhcHBlbnMgdG8gbWF0Y2ggYSByZWN5Y2xlZCBpZCBhZnRlciBjbGVhciB3b3VsZCBzaWxlbnRseSBtdXRhdGVcbiAgICogdGhlIHdyb25nIGVudHJ5LiBPd25lciByb3RhdGlvbiBtYWtlcyBzdGFsZS10b2tlbiBjbG9zZSBhIG5vLW9wXG4gICAqIHZpYSB0aGUgYF9vd25lciAhPT0gdGhpcy5vd25lcmAgZ3VhcmQuXG4gICAqXG4gICAqIENhbGwgZnJvbSBhIGNvbnN1bWVyJ3MgcnVuSWQgZ3VhcmQgd2hlbiBhIG5ldyBydW4gc3RhcnRzIChlLmcuLFxuICAgKiBhZ2VudGZvb3RwcmludCdzIGBvYnNlcnZlUnVuSWQob25OZXdSdW4pYCBmcm9tIFBoYXNlIDIpLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5lbnRyaWVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5ieUlkLmNsZWFyKCk7XG4gICAgdGhpcy5uZXh0SWQgPSAwO1xuICAgIHRoaXMub3duZXIgPSBTeW1ib2woJ0NvbW1pdFJhbmdlSW5kZXgnKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbnRlcm5hbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIE8oMSkgbG9va3VwIGJ5IHRva2VuIGlkLiBBbHdheXMgcmV0dXJucyB0aGUgZW50cnkgdGhhdCB0aGUgdG9rZW5cbiAgICogIHJlZmVyZW5jZXMgKG9yIHVuZGVmaW5lZCBpZiB0aGUgaWQgd2FzIG5ldmVyIG9wZW5lZCBpbiB0aGlzIGluZGV4KS4gKi9cbiAgcHJpdmF0ZSBmaW5kQnlJZChpZDogbnVtYmVyKTogSW50ZXJuYWxFbnRyeTxUTGFiZWw+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5ieUlkLmdldChpZCk7XG4gIH1cbn1cblxuLyoqIFByb2plY3QgdGhlIGludGVybmFsIG11dGFibGUgc2hhcGUgaW50byB0aGUgcHVibGljIHJlYWRvbmx5IGVudHJ5LlxuICogIFRoZSBPVVRFUiBvYmplY3QgaXMgYSBmcmVzaCBhbGxvY2F0aW9uIHBlciBxdWVyeSAoc28gY2FsbGVyIGFycmF5XG4gKiAgbXV0YXRpb25zIGRvbid0IGxlYWspLiBUaGUgYGxhYmVsYCBmaWVsZCBpcyBhIFJFRkVSRU5DRSBDT1BZIOKAlFxuICogIGlmIGBUTGFiZWxgIGlzIGFuIG9iamVjdCwgbXV0YXRpbmcgaXRzIGZpZWxkcyB3aWxsIGFmZmVjdCB0aGVcbiAqICBpbnRlcm5hbCBlbnRyeSB0b28uIENvbnN1bWVycyBNVVNUIHRyZWF0IGxhYmVscyBhcyBpbW11dGFibGVcbiAqICAob3IgcGFzcyBwcmltaXRpdmVzKS4gRG9jdW1lbnRlZCBpbiB0aGUgY2xhc3MgSlNEb2MgYXMgdGhlXG4gKiAgXCJsYWJlbHMgYXJlIHN0b3JlZCB2ZXJiYXRpbVwiIGNvbnRyYWN0LiAqL1xuZnVuY3Rpb24gdG9FbnRyeTxUTGFiZWw+KGU6IEludGVybmFsRW50cnk8VExhYmVsPik6IFJhbmdlRW50cnk8VExhYmVsPiB7XG4gIHJldHVybiBlLmVuZElkeCA9PT0gdW5kZWZpbmVkXG4gICAgPyB7IGxhYmVsOiBlLmxhYmVsLCBzdGFydElkeDogZS5zdGFydElkeCB9XG4gICAgOiB7IGxhYmVsOiBlLmxhYmVsLCBzdGFydElkeDogZS5zdGFydElkeCwgZW5kSWR4OiBlLmVuZElkeCB9O1xufVxuXG4vKipcbiAqIFNoYXJlZCBvdXRlcuKGkmlubmVyIGNvbXBhcmF0b3IgZm9yIGJvdGggYGVuY2xvc2luZygpYCBhbmRcbiAqIGBvdmVybGFwcGluZygpYC4gUHJpbWFyeSBrZXk6IGBzdGFydElkeGAgYXNjZW5kaW5nLiBUaWUtYnJlYWs6XG4gKiBgZW5kSWR4YCBkZXNjZW5kaW5nICh3aWRlciByYW5nZSBpcyBvdXRlcikuIE9wZW4gcmFuZ2VzICh1bmRlZmluZWRcbiAqIGBlbmRJZHhgKSBzb3J0IGFzICtJbmZpbml0eSDihpIgb3V0ZXJtb3N0IHdoZW4gdGllZC4gRGV0ZXJtaW5pc3RpY1xuICogb3JkZXJpbmcgcmVxdWlyZWQgc28gY29uc3VtZXJzIChMZW5zIGJyZWFkY3J1bWIsIHRpbWUtdHJhdmVsIFVJcylcbiAqIG5ldmVyIHNlZSBmbGlja2VyIG9uIGVxdWFsLXN0YXJ0IGJvdW5kYXJpZXMgKGUuZy4sIGEgUGFyYWxsZWxcbiAqIHJvb3QgYW5kIGl0cyBmaXJzdCBicmFuY2ggb3BlbmluZyBhdCB0aGUgc2FtZSBjb21taXQpLlxuICovXG5mdW5jdGlvbiBvdXRlclRvSW5uZXJDb21wYXJhdG9yPFRMYWJlbD4oYTogUmFuZ2VFbnRyeTxUTGFiZWw+LCBiOiBSYW5nZUVudHJ5PFRMYWJlbD4pOiBudW1iZXIge1xuICBpZiAoYS5zdGFydElkeCAhPT0gYi5zdGFydElkeCkgcmV0dXJuIGEuc3RhcnRJZHggLSBiLnN0YXJ0SWR4O1xuICBjb25zdCBhZSA9IGEuZW5kSWR4ID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgY29uc3QgYmUgPSBiLmVuZElkeCA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIHJldHVybiBiZSAtIGFlO1xufVxuIl19
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * CompositeRecorder — fan-out a single recorder attachment to multiple child recorders.
3
3
  *
4
- * Implements both Recorder (scope data ops) and FlowRecorder (control flow events)
5
- * so it works with both `executor.attachRecorder()` and `executor.attachFlowRecorder()`.
4
+ * Implements both ScopeRecorder (scope data ops) and FlowRecorder (control flow events)
5
+ * so it works with both `executor.attachScopeRecorder()` and `executor.attachFlowRecorder()`.
6
6
  *
7
7
  * The composite has a single ID for idempotent attach/detach. Child recorders
8
8
  * keep their own IDs internally but are not individually visible to the executor.
@@ -20,7 +20,7 @@
20
20
  * new DebugRecorder({ verbosity: 'minimal' }),
21
21
  * ]);
22
22
  *
23
- * executor.attachRecorder(observability);
23
+ * executor.attachScopeRecorder(observability);
24
24
  *
25
25
  * // Access child recorders by type
26
26
  * const metrics = observability.get(MetricRecorder);
@@ -39,7 +39,7 @@
39
39
  * }
40
40
  *
41
41
  * // Consumer
42
- * executor.attachRecorder(agentObservability());
42
+ * executor.attachScopeRecorder(agentObservability());
43
43
  * ```
44
44
  */
45
45
  export class CompositeRecorder {
@@ -65,7 +65,7 @@ export class CompositeRecorder {
65
65
  getChildren() {
66
66
  return this.children;
67
67
  }
68
- // ── Scope Recorder hooks (fan-out to children that implement Recorder) ─
68
+ // ── Scope ScopeRecorder hooks (fan-out to children that implement ScopeRecorder) ─
69
69
  onRead(event) {
70
70
  for (const c of this.children)
71
71
  if (c.onRead)
@@ -171,4 +171,4 @@ export class CompositeRecorder {
171
171
  };
172
172
  }
173
173
  }
174
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9zaXRlUmVjb3JkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL0NvbXBvc2l0ZVJlY29yZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkNHO0FBeUJILE1BQU0sT0FBTyxpQkFBaUI7SUFDbkIsRUFBRSxDQUFTO0lBQ0gsUUFBUSxDQUFpQztJQUUxRCxZQUFZLEVBQVUsRUFBRSxRQUF3QztRQUM5RCxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCx5RUFBeUU7SUFFekU7Ozs7Ozs7T0FPRztJQUNILEdBQUcsQ0FBSSxJQUErQjtRQUNwQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFrQixDQUFDO0lBQ3ZFLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsMEVBQTBFO0lBRTFFLE1BQU0sQ0FBQyxLQUFnQjtRQUNyQixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsSUFBSyxDQUFjLENBQUMsTUFBTTtnQkFBRyxDQUFjLENBQUMsTUFBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBaUI7UUFDdkIsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUssQ0FBYyxDQUFDLE9BQU87Z0JBQUcsQ0FBYyxDQUFDLE9BQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsUUFBUSxDQUFD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LENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFxQjtRQUMzQixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsSUFBSyxDQUFrQixDQUFDLE9BQU87Z0JBQUcsQ0FBa0IsQ0FBQyxPQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVELHlFQUF5RTtJQUV6RSxLQUFLO1FBQ0gsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxDQUFDLEtBQUs7Z0JBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVO1FBQ1IsTUFBTSxjQUFjLEdBQXVELEVBQUUsQ0FBQztRQUM5RSxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3RDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU87WUFDTCxJQUFJLEVBQUUsV0FBVztZQUNqQixJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFO1NBQ25DLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbXBvc2l0ZVJlY29yZGVyIOKAlCBmYW4tb3V0IGEgc2luZ2xlIHJlY29yZGVyIGF0dGFjaG1lbnQgdG8gbXVsdGlwbGUgY2hpbGQgcmVjb3JkZXJzLlxuICpcbiAqIEltcGxlbWVudHMgYm90aCBSZWNvcmRlciAoc2NvcGUgZGF0YSBvcHMpIGFuZCBGbG93UmVjb3JkZXIgKGNvbnRyb2wgZmxvdyBldmVudHMpXG4gKiBzbyBpdCB3b3JrcyB3aXRoIGJvdGggYGV4ZWN1dG9yLmF0dGFjaFJlY29yZGVyKClgIGFuZCBgZXhlY3V0b3IuYXR0YWNoRmxvd1JlY29yZGVyKClgLlxuICpcbiAqIFRoZSBjb21wb3NpdGUgaGFzIGEgc2luZ2xlIElEIGZvciBpZGVtcG90ZW50IGF0dGFjaC9kZXRhY2guIENoaWxkIHJlY29yZGVyc1xuICoga2VlcCB0aGVpciBvd24gSURzIGludGVybmFsbHkgYnV0IGFyZSBub3QgaW5kaXZpZHVhbGx5IHZpc2libGUgdG8gdGhlIGV4ZWN1dG9yLlxuICpcbiAqIERvbWFpbiBsaWJyYXJpZXMgKGUuZy4sIGFnZW50Zm9vdHByaW50KSB1c2UgdGhpcyB0byBidW5kbGUgbXVsdGlwbGUgcmVjb3JkZXJzXG4gKiBpbnRvIGEgc2luZ2xlIHByZXNldCDigJQgdGhlIGNvbnN1bWVyIGNhbGxzIG9uZSBmdW5jdGlvbiwgZ2V0cyBmdWxsIG9ic2VydmFiaWxpdHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IENvbXBvc2l0ZVJlY29yZGVyLCBNZXRyaWNSZWNvcmRlciwgRGVidWdSZWNvcmRlciB9IGZyb20gJ2Zvb3RwcmludGpzJztcbiAqXG4gKiAvLyBCdW5kbGUgbWV0cmljcyArIGRlYnVnIGludG8gYSBzaW5nbGUgcmVjb3JkZXJcbiAqIGNvbnN0IG9ic2VydmFiaWxpdHkgPSBuZXcgQ29tcG9zaXRlUmVjb3JkZXIoJ29ic2VydmFiaWxpdHknLCBbXG4gKiAgIG5ldyBNZXRyaWNSZWNvcmRlcih7IHN0YWdlRmlsdGVyOiAobmFtZSkgPT4gbmFtZSA9PT0gJ0NhbGxMTE0nIH0pLFxuICogICBuZXcgRGVidWdSZWNvcmRlcih7IHZlcmJvc2l0eTogJ21pbmltYWwnIH0pLFxuICogXSk7XG4gKlxuICogZXhlY3V0b3IuYXR0YWNoUmVjb3JkZXIob2JzZXJ2YWJpbGl0eSk7XG4gKlxuICogLy8gQWNjZXNzIGNoaWxkIHJlY29yZGVycyBieSB0eXBlXG4gKiBjb25zdCBtZXRyaWNzID0gb2JzZXJ2YWJpbGl0eS5nZXQoTWV0cmljUmVjb3JkZXIpO1xuICogbWV0cmljcz8uZ2V0TWV0cmljcygpOyAvLyB0aW1pbmcgZGF0YVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIERvbWFpbiBsaWJyYXJ5IHByZXNldCAoZS5nLiwgYWdlbnRmb290cHJpbnQpXG4gKiBleHBvcnQgZnVuY3Rpb24gYWdlbnRPYnNlcnZhYmlsaXR5KG9wdGlvbnM/OiBBZ2VudE9ic2VydmFiaWxpdHlPcHRpb25zKSB7XG4gKiAgIHJldHVybiBuZXcgQ29tcG9zaXRlUmVjb3JkZXIoJ2FnZW50LW9ic2VydmFiaWxpdHknLCBbXG4gKiAgICAgbmV3IE1ldHJpY1JlY29yZGVyKG9wdGlvbnM/LnN0YWdlRmlsdGVyID8geyBzdGFnZUZpbHRlcjogb3B0aW9ucy5zdGFnZUZpbHRlciB9IDogdW5kZWZpbmVkKSxcbiAqICAgICBuZXcgVG9rZW5SZWNvcmRlcigpLFxuICogICAgIG5ldyBUb29sVXNhZ2VSZWNvcmRlcigpLFxuICogICBdKTtcbiAqIH1cbiAqXG4gKiAvLyBDb25zdW1lclxuICogZXhlY3V0b3IuYXR0YWNoUmVjb3JkZXIoYWdlbnRPYnNlcnZhYmlsaXR5KCkpO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGbG93QnJlYWtFdmVudCxcbiAgRmxvd0RlY2lzaW9uRXZlbnQsXG4gIEZsb3dFcnJvckV2ZW50LFxuICBGbG93Rm9ya0V2ZW50LFxuICBGbG93TG9vcEV2ZW50LFxuICBGbG93TmV4dEV2ZW50LFxuICBGbG93UmVjb3JkZXIsXG4gIEZsb3dTZWxlY3RlZEV2ZW50LFxuICBGbG93U3RhZ2VFdmVudCxcbiAgRmxvd1N1YmZsb3dFdmVudCxcbiAgRmxvd1N1YmZsb3dSZWdpc3RlcmVkRXZlbnQsXG59IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRFdmVudCwgRXJyb3JFdmVudCwgUmVhZEV2ZW50LCBSZWNvcmRlciwgU3RhZ2VFdmVudCwgV3JpdGVFdmVudCB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcblxuLyoqIFNuYXBzaG90IGZvcm1hdCBmb3IgY29tcG9zaXRlIHJlY29yZGVycyDigJQgd3JhcHMgY2hpbGQgc25hcHNob3RzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wb3NpdGVTbmFwc2hvdCB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGF0YToge1xuICAgIGNoaWxkcmVuOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZGF0YTogdW5rbm93biB9PjtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvc2l0ZVJlY29yZGVyIGltcGxlbWVudHMgUmVjb3JkZXIsIEZsb3dSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW46IEFycmF5PFJlY29yZGVyIHwgRmxvd1JlY29yZGVyPjtcblxuICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBjaGlsZHJlbjogQXJyYXk8UmVjb3JkZXIgfCBGbG93UmVjb3JkZXI+KSB7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW5dO1xuICB9XG5cbiAgLy8g4pSA4pSAIENoaWxkIGFjY2VzcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogR2V0IGEgY2hpbGQgcmVjb3JkZXIgYnkgY2xhc3MgdHlwZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBtZXRyaWNzID0gY29tcG9zaXRlLmdldChNZXRyaWNSZWNvcmRlcik7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0PFQ+KHR5cGU6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5maW5kKChjKSA9PiBjIGluc3RhbmNlb2YgdHlwZSkgYXMgVCB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBHZXQgYWxsIGNoaWxkIHJlY29yZGVycy4gKi9cbiAgZ2V0Q2hpbGRyZW4oKTogUmVhZG9ubHlBcnJheTxSZWNvcmRlciB8IEZsb3dSZWNvcmRlcj4ge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNjb3BlIFJlY29yZGVyIGhvb2tzIChmYW4tb3V0IHRvIGNoaWxkcmVuIHRoYXQgaW1wbGVtZW50IFJlY29yZGVyKSDilIBcblxuICBvblJlYWQoZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgUmVjb3JkZXIpLm9uUmVhZCkgKGMgYXMgUmVjb3JkZXIpLm9uUmVhZCEoZXZlbnQpO1xuICB9XG5cbiAgb25Xcml0ZShldmVudDogV3JpdGVFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgUmVjb3JkZXIpLm9uV3JpdGUpIChjIGFzIFJlY29yZGVyKS5vbldyaXRlIShldmVudCk7XG4gIH1cblxuICBvbkNvbW1pdChldmVudDogQ29tbWl0RXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIFJlY29yZGVyKS5vbkNvbW1pdCkgKGMgYXMgUmVjb3JkZXIpLm9uQ29tbWl0IShldmVudCk7XG4gIH1cblxuICBvbkVycm9yKGV2ZW50OiBFcnJvckV2ZW50IHwgRmxvd0Vycm9yRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIFJlY29yZGVyKS5vbkVycm9yKSAoYyBhcyBSZWNvcmRlcikub25FcnJvciEoZXZlbnQgYXMgYW55KTtcbiAgfVxuXG4gIG9uU3RhZ2VTdGFydChldmVudDogU3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgUmVjb3JkZXIpLm9uU3RhZ2VTdGFydCkgKGMgYXMgUmVjb3JkZXIpLm9uU3RhZ2VTdGFydCEoZXZlbnQpO1xuICB9XG5cbiAgb25TdGFnZUVuZChldmVudDogU3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgUmVjb3JkZXIpLm9uU3RhZ2VFbmQpIChjIGFzIFJlY29yZGVyKS5vblN0YWdlRW5kIShldmVudCk7XG4gIH1cblxuICAvLyDilIDilIAgRmxvd1JlY29yZGVyIGhvb2tzIChmYW4tb3V0IHRvIGNoaWxkcmVuIHRoYXQgaW1wbGVtZW50IEZsb3dSZWNvcmRlcikg4pSAXG5cbiAgb25TdGFnZUV4ZWN1dGVkKGV2ZW50OiBGbG93U3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgRmxvd1JlY29yZGVyKS5vblN0YWdlRXhlY3V0ZWQpIChjIGFzIEZsb3dSZWNvcmRlcikub25TdGFnZUV4ZWN1dGVkIShldmVudCk7XG4gIH1cblxuICBvbk5leHQoZXZlbnQ6IEZsb3dOZXh0RXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIEZsb3dSZWNvcmRlcikub25OZXh0KSAoYyBhcyBGbG93UmVjb3JkZXIpLm9uTmV4dCEoZXZlbnQpO1xuICB9XG5cbiAgb25EZWNpc2lvbihldmVudDogRmxvd0RlY2lzaW9uRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIEZsb3dSZWNvcmRlcikub25EZWNpc2lvbikgKGMgYXMgRmxvd1JlY29yZGVyKS5vbkRlY2lzaW9uIShldmVudCk7XG4gIH1cblxuICBvbkZvcmsoZXZlbnQ6IEZsb3dGb3JrRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIEZsb3dSZWNvcmRlcikub25Gb3JrKSAoYyBhcyBGbG93UmVjb3JkZXIpLm9uRm9yayEoZXZlbnQpO1xuICB9XG5cbiAgb25TZWxlY3RlZChldmVudDogRmxvd1NlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIEZsb3dSZWNvcmRlcikub25TZWxlY3RlZCkgKGMgYXMgRmxvd1JlY29yZGVyKS5vblNlbGVjdGVkIShldmVudCk7XG4gIH1cblxuICBvblN1YmZsb3dFbnRyeShldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgRmxvd1JlY29yZGVyKS5vblN1YmZsb3dFbnRyeSkgKGMgYXMgRmxvd1JlY29yZGVyKS5vblN1YmZsb3dFbnRyeSEoZXZlbnQpO1xuICB9XG5cbiAgb25TdWJmbG93RXhpdChldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgRmxvd1JlY29yZGVyKS5vblN1YmZsb3dFeGl0KSAoYyBhcyBGbG93UmVjb3JkZXIpLm9uU3ViZmxvd0V4aXQhKGV2ZW50KTtcbiAgfVxuXG4gIG9uU3ViZmxvd1JlZ2lzdGVyZWQoZXZlbnQ6IEZsb3dTdWJmbG93UmVnaXN0ZXJlZEV2ZW50KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2hpbGRyZW4pXG4gICAgICBpZiAoKGMgYXMgRmxvd1JlY29yZGVyKS5vblN1YmZsb3dSZWdpc3RlcmVkKSAoYyBhcyBGbG93UmVjb3JkZXIpLm9uU3ViZmxvd1JlZ2lzdGVyZWQhKGV2ZW50KTtcbiAgfVxuXG4gIG9uTG9vcChldmVudDogRmxvd0xvb3BFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgRmxvd1JlY29yZGVyKS5vbkxvb3ApIChjIGFzIEZsb3dSZWNvcmRlcikub25Mb29wIShldmVudCk7XG4gIH1cblxuICBvbkJyZWFrKGV2ZW50OiBGbG93QnJlYWtFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgRmxvd1JlY29yZGVyKS5vbkJyZWFrKSAoYyBhcyBGbG93UmVjb3JkZXIpLm9uQnJlYWshKGV2ZW50KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2hpbGRyZW4pIGlmIChjLmNsZWFyKSBjLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogU25hcHNob3QgbWVyZ2VzIGFsbCBjaGlsZCBzbmFwc2hvdHMgaW50byBhIHNpbmdsZSBjb21wb3NpdGUgZW50cnkuXG4gICAqIEVhY2ggY2hpbGQncyBzbmFwc2hvdCBpcyBwcmVzZXJ2ZWQgd2l0aCBpdHMgb3duIGlkL25hbWUvZGF0YS5cbiAgICovXG4gIHRvU25hcHNob3QoKTogQ29tcG9zaXRlU25hcHNob3Qge1xuICAgIGNvbnN0IGNoaWxkU25hcHNob3RzOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZGF0YTogdW5rbm93biB9PiA9IFtdO1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBpZiAoYy50b1NuYXBzaG90KSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgZGF0YSB9ID0gYy50b1NuYXBzaG90KCk7XG4gICAgICAgIGNoaWxkU25hcHNob3RzLnB1c2goeyBpZDogYy5pZCwgbmFtZSwgZGF0YSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdDb21wb3NpdGUnLFxuICAgICAgZGF0YTogeyBjaGlsZHJlbjogY2hpbGRTbmFwc2hvdHMgfSxcbiAgICB9O1xuICB9XG59XG4iXX0=
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9zaXRlUmVjb3JkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL0NvbXBvc2l0ZVJlY29yZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkNHO0FBeUJILE1BQU0sT0FBTyxpQkFBaUI7SUFDbkIsRUFBRSxDQUFTO0lBQ0gsUUFBUSxDQUFzQztJQUUvRCxZQUFZLEVBQVUsRUFBRSxRQUE2QztRQUNuRSxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCx5RUFBeUU7SUFFekU7Ozs7Ozs7T0FPRztJQUNILEdBQUcsQ0FBSSxJQUErQjtRQUNwQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFrQixDQUFDO0lBQ3ZFLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsb0ZBQW9GO0lBRXBGLE1BQU0sQ0FBQyxLQUFnQjtRQUNyQixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsSUFBSyxDQUFtQixDQUFDLE1BQU07Z0JBQUcsQ0FBbUIsQ0FBQyxNQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFpQjtRQUN2QixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsSUFBSyxDQUFtQixDQUFDLE9BQU87Z0JBQUcsQ0FBbUIsQ0FBQyxPQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEcsQ0FBQztJQUVELFFBQVEs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a0IsQ0FBQyxNQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFxQjtRQUMzQixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsSUFBSyxDQUFrQixDQUFDLE9BQU87Z0JBQUcsQ0FBa0IsQ0FBQyxPQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVELHlFQUF5RTtJQUV6RSxLQUFLO1FBQ0gsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxDQUFDLEtBQUs7Z0JBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVO1FBQ1IsTUFBTSxjQUFjLEdBQXVELEVBQUUsQ0FBQztRQUM5RSxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3RDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU87WUFDTCxJQUFJLEVBQUUsV0FBVztZQUNqQixJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFO1NBQ25DLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbXBvc2l0ZVJlY29yZGVyIOKAlCBmYW4tb3V0IGEgc2luZ2xlIHJlY29yZGVyIGF0dGFjaG1lbnQgdG8gbXVsdGlwbGUgY2hpbGQgcmVjb3JkZXJzLlxuICpcbiAqIEltcGxlbWVudHMgYm90aCBTY29wZVJlY29yZGVyIChzY29wZSBkYXRhIG9wcykgYW5kIEZsb3dSZWNvcmRlciAoY29udHJvbCBmbG93IGV2ZW50cylcbiAqIHNvIGl0IHdvcmtzIHdpdGggYm90aCBgZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcigpYCBhbmQgYGV4ZWN1dG9yLmF0dGFjaEZsb3dSZWNvcmRlcigpYC5cbiAqXG4gKiBUaGUgY29tcG9zaXRlIGhhcyBhIHNpbmdsZSBJRCBmb3IgaWRlbXBvdGVudCBhdHRhY2gvZGV0YWNoLiBDaGlsZCByZWNvcmRlcnNcbiAqIGtlZXAgdGhlaXIgb3duIElEcyBpbnRlcm5hbGx5IGJ1dCBhcmUgbm90IGluZGl2aWR1YWxseSB2aXNpYmxlIHRvIHRoZSBleGVjdXRvci5cbiAqXG4gKiBEb21haW4gbGlicmFyaWVzIChlLmcuLCBhZ2VudGZvb3RwcmludCkgdXNlIHRoaXMgdG8gYnVuZGxlIG11bHRpcGxlIHJlY29yZGVyc1xuICogaW50byBhIHNpbmdsZSBwcmVzZXQg4oCUIHRoZSBjb25zdW1lciBjYWxscyBvbmUgZnVuY3Rpb24sIGdldHMgZnVsbCBvYnNlcnZhYmlsaXR5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBDb21wb3NpdGVSZWNvcmRlciwgTWV0cmljUmVjb3JkZXIsIERlYnVnUmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcyc7XG4gKlxuICogLy8gQnVuZGxlIG1ldHJpY3MgKyBkZWJ1ZyBpbnRvIGEgc2luZ2xlIHJlY29yZGVyXG4gKiBjb25zdCBvYnNlcnZhYmlsaXR5ID0gbmV3IENvbXBvc2l0ZVJlY29yZGVyKCdvYnNlcnZhYmlsaXR5JywgW1xuICogICBuZXcgTWV0cmljUmVjb3JkZXIoeyBzdGFnZUZpbHRlcjogKG5hbWUpID0+IG5hbWUgPT09ICdDYWxsTExNJyB9KSxcbiAqICAgbmV3IERlYnVnUmVjb3JkZXIoeyB2ZXJib3NpdHk6ICdtaW5pbWFsJyB9KSxcbiAqIF0pO1xuICpcbiAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIob2JzZXJ2YWJpbGl0eSk7XG4gKlxuICogLy8gQWNjZXNzIGNoaWxkIHJlY29yZGVycyBieSB0eXBlXG4gKiBjb25zdCBtZXRyaWNzID0gb2JzZXJ2YWJpbGl0eS5nZXQoTWV0cmljUmVjb3JkZXIpO1xuICogbWV0cmljcz8uZ2V0TWV0cmljcygpOyAvLyB0aW1pbmcgZGF0YVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIERvbWFpbiBsaWJyYXJ5IHByZXNldCAoZS5nLiwgYWdlbnRmb290cHJpbnQpXG4gKiBleHBvcnQgZnVuY3Rpb24gYWdlbnRPYnNlcnZhYmlsaXR5KG9wdGlvbnM/OiBBZ2VudE9ic2VydmFiaWxpdHlPcHRpb25zKSB7XG4gKiAgIHJldHVybiBuZXcgQ29tcG9zaXRlUmVjb3JkZXIoJ2FnZW50LW9ic2VydmFiaWxpdHknLCBbXG4gKiAgICAgbmV3IE1ldHJpY1JlY29yZGVyKG9wdGlvbnM/LnN0YWdlRmlsdGVyID8geyBzdGFnZUZpbHRlcjogb3B0aW9ucy5zdGFnZUZpbHRlciB9IDogdW5kZWZpbmVkKSxcbiAqICAgICBuZXcgVG9rZW5SZWNvcmRlcigpLFxuICogICAgIG5ldyBUb29sVXNhZ2VSZWNvcmRlcigpLFxuICogICBdKTtcbiAqIH1cbiAqXG4gKiAvLyBDb25zdW1lclxuICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihhZ2VudE9ic2VydmFiaWxpdHkoKSk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dCcmVha0V2ZW50LFxuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0Vycm9yRXZlbnQsXG4gIEZsb3dGb3JrRXZlbnQsXG4gIEZsb3dMb29wRXZlbnQsXG4gIEZsb3dOZXh0RXZlbnQsXG4gIEZsb3dSZWNvcmRlcixcbiAgRmxvd1NlbGVjdGVkRXZlbnQsXG4gIEZsb3dTdGFnZUV2ZW50LFxuICBGbG93U3ViZmxvd0V2ZW50LFxuICBGbG93U3ViZmxvd1JlZ2lzdGVyZWRFdmVudCxcbn0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEV2ZW50LCBFcnJvckV2ZW50LCBSZWFkRXZlbnQsIFNjb3BlUmVjb3JkZXIsIFN0YWdlRXZlbnQsIFdyaXRlRXZlbnQgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5cbi8qKiBTbmFwc2hvdCBmb3JtYXQgZm9yIGNvbXBvc2l0ZSByZWNvcmRlcnMg4oCUIHdyYXBzIGNoaWxkIHNuYXBzaG90cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9zaXRlU25hcHNob3Qge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRhdGE6IHtcbiAgICBjaGlsZHJlbjogQXJyYXk8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IGRhdGE6IHVua25vd24gfT47XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVSZWNvcmRlciBpbXBsZW1lbnRzIFNjb3BlUmVjb3JkZXIsIEZsb3dSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW46IEFycmF5PFNjb3BlUmVjb3JkZXIgfCBGbG93UmVjb3JkZXI+O1xuXG4gIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIGNoaWxkcmVuOiBBcnJheTxTY29wZVJlY29yZGVyIHwgRmxvd1JlY29yZGVyPikge1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLmNoaWxkcmVuID0gWy4uLmNoaWxkcmVuXTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDaGlsZCBhY2Nlc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEdldCBhIGNoaWxkIHJlY29yZGVyIGJ5IGNsYXNzIHR5cGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgbWV0cmljcyA9IGNvbXBvc2l0ZS5nZXQoTWV0cmljUmVjb3JkZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldDxUPih0eXBlOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uZmluZCgoYykgPT4gYyBpbnN0YW5jZW9mIHR5cGUpIGFzIFQgfCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogR2V0IGFsbCBjaGlsZCByZWNvcmRlcnMuICovXG4gIGdldENoaWxkcmVuKCk6IFJlYWRvbmx5QXJyYXk8U2NvcGVSZWNvcmRlciB8IEZsb3dSZWNvcmRlcj4ge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNjb3BlIFNjb3BlUmVjb3JkZXIgaG9va3MgKGZhbi1vdXQgdG8gY2hpbGRyZW4gdGhhdCBpbXBsZW1lbnQgU2NvcGVSZWNvcmRlcikg4pSAXG5cbiAgb25SZWFkKGV2ZW50OiBSZWFkRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIFNjb3BlUmVjb3JkZXIpLm9uUmVhZCkgKGMgYXMgU2NvcGVSZWNvcmRlcikub25SZWFkIShldmVudCk7XG4gIH1cblxuICBvbldyaXRlKGV2ZW50OiBXcml0ZUV2ZW50KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2hpbGRyZW4pIGlmICgoYyBhcyBTY29wZVJlY29yZGVyKS5vbldyaXRlKSAoYyBhcyBTY29wZVJlY29yZGVyKS5vbldyaXRlIShldmVudCk7XG4gIH1cblxuICBvbkNvbW1pdChldmVudDogQ29tbWl0RXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIFNjb3BlUmVjb3JkZXIpLm9uQ29tbWl0KSAoYyBhcyBTY29wZVJlY29yZGVyKS5vbkNvbW1pdCEoZXZlbnQpO1xuICB9XG5cbiAgb25FcnJvcihldmVudDogRXJyb3JFdmVudCB8IEZsb3dFcnJvckV2ZW50KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2hpbGRyZW4pIGlmICgoYyBhcyBTY29wZVJlY29yZGVyKS5vbkVycm9yKSAoYyBhcyBTY29wZVJlY29yZGVyKS5vbkVycm9yIShldmVudCBhcyBhbnkpO1xuICB9XG5cbiAgb25TdGFnZVN0YXJ0KGV2ZW50OiBTdGFnZUV2ZW50KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2hpbGRyZW4pIGlmICgoYyBhcyBTY29wZVJlY29yZGVyKS5vblN0YWdlU3RhcnQpIChjIGFzIFNjb3BlUmVjb3JkZXIpLm9uU3RhZ2VTdGFydCEoZXZlbnQpO1xuICB9XG5cbiAgb25TdGFnZUVuZChldmVudDogU3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgU2NvcGVSZWNvcmRlcikub25TdGFnZUVuZCkgKGMgYXMgU2NvcGVSZWNvcmRlcikub25TdGFnZUVuZCEoZXZlbnQpO1xuICB9XG5cbiAgLy8g4pSA4pSAIEZsb3dSZWNvcmRlciBob29rcyAoZmFuLW91dCB0byBjaGlsZHJlbiB0aGF0IGltcGxlbWVudCBGbG93UmVjb3JkZXIpIOKUgFxuXG4gIG9uU3RhZ2VFeGVjdXRlZChldmVudDogRmxvd1N0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIEZsb3dSZWNvcmRlcikub25TdGFnZUV4ZWN1dGVkKSAoYyBhcyBGbG93UmVjb3JkZXIpLm9uU3RhZ2VFeGVjdXRlZCEoZXZlbnQpO1xuICB9XG5cbiAgb25OZXh0KGV2ZW50OiBGbG93TmV4dEV2ZW50KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2hpbGRyZW4pIGlmICgoYyBhcyBGbG93UmVjb3JkZXIpLm9uTmV4dCkgKGMgYXMgRmxvd1JlY29yZGVyKS5vbk5leHQhKGV2ZW50KTtcbiAgfVxuXG4gIG9uRGVjaXNpb24oZXZlbnQ6IEZsb3dEZWNpc2lvbkV2ZW50KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2hpbGRyZW4pIGlmICgoYyBhcyBGbG93UmVjb3JkZXIpLm9uRGVjaXNpb24pIChjIGFzIEZsb3dSZWNvcmRlcikub25EZWNpc2lvbiEoZXZlbnQpO1xuICB9XG5cbiAgb25Gb3JrKGV2ZW50OiBGbG93Rm9ya0V2ZW50KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2hpbGRyZW4pIGlmICgoYyBhcyBGbG93UmVjb3JkZXIpLm9uRm9yaykgKGMgYXMgRmxvd1JlY29yZGVyKS5vbkZvcmshKGV2ZW50KTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWQoZXZlbnQ6IEZsb3dTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2hpbGRyZW4pIGlmICgoYyBhcyBGbG93UmVjb3JkZXIpLm9uU2VsZWN0ZWQpIChjIGFzIEZsb3dSZWNvcmRlcikub25TZWxlY3RlZCEoZXZlbnQpO1xuICB9XG5cbiAgb25TdWJmbG93RW50cnkoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIEZsb3dSZWNvcmRlcikub25TdWJmbG93RW50cnkpIChjIGFzIEZsb3dSZWNvcmRlcikub25TdWJmbG93RW50cnkhKGV2ZW50KTtcbiAgfVxuXG4gIG9uU3ViZmxvd0V4aXQoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIEZsb3dSZWNvcmRlcikub25TdWJmbG93RXhpdCkgKGMgYXMgRmxvd1JlY29yZGVyKS5vblN1YmZsb3dFeGl0IShldmVudCk7XG4gIH1cblxuICBvblN1YmZsb3dSZWdpc3RlcmVkKGV2ZW50OiBGbG93U3ViZmxvd1JlZ2lzdGVyZWRFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKVxuICAgICAgaWYgKChjIGFzIEZsb3dSZWNvcmRlcikub25TdWJmbG93UmVnaXN0ZXJlZCkgKGMgYXMgRmxvd1JlY29yZGVyKS5vblN1YmZsb3dSZWdpc3RlcmVkIShldmVudCk7XG4gIH1cblxuICBvbkxvb3AoZXZlbnQ6IEZsb3dMb29wRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIEZsb3dSZWNvcmRlcikub25Mb29wKSAoYyBhcyBGbG93UmVjb3JkZXIpLm9uTG9vcCEoZXZlbnQpO1xuICB9XG5cbiAgb25CcmVhayhldmVudDogRmxvd0JyZWFrRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIEZsb3dSZWNvcmRlcikub25CcmVhaykgKGMgYXMgRmxvd1JlY29yZGVyKS5vbkJyZWFrIShldmVudCk7XG4gIH1cblxuICAvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoYy5jbGVhcikgYy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNuYXBzaG90IG1lcmdlcyBhbGwgY2hpbGQgc25hcHNob3RzIGludG8gYSBzaW5nbGUgY29tcG9zaXRlIGVudHJ5LlxuICAgKiBFYWNoIGNoaWxkJ3Mgc25hcHNob3QgaXMgcHJlc2VydmVkIHdpdGggaXRzIG93biBpZC9uYW1lL2RhdGEuXG4gICAqL1xuICB0b1NuYXBzaG90KCk6IENvbXBvc2l0ZVNuYXBzaG90IHtcbiAgICBjb25zdCBjaGlsZFNuYXBzaG90czogQXJyYXk8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IGRhdGE6IHVua25vd24gfT4gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgaWYgKGMudG9TbmFwc2hvdCkge1xuICAgICAgICBjb25zdCB7IG5hbWUsIGRhdGEgfSA9IGMudG9TbmFwc2hvdCgpO1xuICAgICAgICBjaGlsZFNuYXBzaG90cy5wdXNoKHsgaWQ6IGMuaWQsIG5hbWUsIGRhdGEgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnQ29tcG9zaXRlJyxcbiAgICAgIGRhdGE6IHsgY2hpbGRyZW46IGNoaWxkU25hcHNob3RzIH0sXG4gICAgfTtcbiAgfVxufVxuIl19