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
@@ -56,9 +56,9 @@ const METHOD_ROUTES = {
56
56
  $error: (t) => t.addErrorInfo.bind(t),
57
57
  $metric: (t) => t.addMetric.bind(t),
58
58
  $eval: (t) => t.addEval.bind(t),
59
- $attachRecorder: (t) => t.attachRecorder.bind(t),
60
- $detachRecorder: (t) => t.detachRecorder.bind(t),
61
- $getRecorders: (t) => t.getRecorders.bind(t),
59
+ $attachScopeRecorder: (t) => t.attachScopeRecorder.bind(t),
60
+ $detachScopeRecorder: (t) => t.detachScopeRecorder.bind(t),
61
+ $getScopeRecorders: (t) => t.getScopeRecorders.bind(t),
62
62
  $batchArray: (t) => (key, fn) => {
63
63
  // One getValue — fires onRead once
64
64
  const current = t.getValue(key);
@@ -248,7 +248,7 @@ export function createTypedScope(target, options) {
248
248
  return undefined;
249
249
  }
250
250
  // 5. Executor-internal method pass-through (explicit allowlist)
251
- // FlowChartExecutor wrapping calls attachRecorder, notifyStageStart, etc.
251
+ // FlowChartExecutor wrapping calls attachScopeRecorder, notifyStageStart, etc.
252
252
  // directly on the scope. Forward only allowlisted methods.
253
253
  if (EXECUTOR_INTERNAL_METHODS.has(prop) && typeof target[prop] === 'function') {
254
254
  return target[prop].bind(target);
@@ -343,4 +343,4 @@ export function createTypedScope(target, options) {
343
343
  });
344
344
  return proxy;
345
345
  }
346
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVHlwZWRTY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvY3JlYXRlVHlwZWRTY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxTQUFTLElBQUksU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFcEQsT0FBTyxFQUFFLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekcsK0VBQStFO0FBQy9FLG1FQUFtRTtBQUNuRSwwRUFBMEU7QUFDMUUsMkNBQTJDO0FBRTNDLFNBQVMsV0FBVyxDQUFDLEtBQWM7SUFDakMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDNUMsNERBQTREO0lBQzVELElBQUksQ0FBQztRQUNILHVGQUF1RjtRQUN2RixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCw2REFBNkQ7UUFDN0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQU1ELE1BQU0sYUFBYSxHQUFpQztJQUNsRCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFB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QVMsQ0FBQyxDQUFDLGdCQUFnQjtZQUN6RCxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUM5Qix5RUFBeUU7WUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbEUsQ0FBQztLQUNGLENBQUMsQ0FBQztJQUVILE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVhY3RpdmUvY3JlYXRlVHlwZWRTY29wZSAtLSBDb3JlIFByb3h5IGZhY3RvcnkgZm9yIFR5cGVkU2NvcGU8VD4uXG4gKlxuICogV3JhcHMgYSBSZWFjdGl2ZVRhcmdldCAoU2NvcGVGYWNhZGUpIGluIGEgUHJveHkgdGhhdCBwcm92aWRlczpcbiAqIC0gVHlwZWQgcHJvcGVydHkgYWNjZXNzOiBzY29wZS5jcmVkaXRUaWVyIChyZWFkKSwgc2NvcGUuY3JlZGl0VGllciA9ICdBJyAod3JpdGUpXG4gKiAtIERlZXAgd3JpdGUgaW50ZXJjZXB0aW9uOiBzY29wZS5jdXN0b21lci5hZGRyZXNzLnppcCA9ICc5MDIxMCdcbiAqIC0gQXJyYXkgbXV0YXRpb24gaW50ZXJjZXB0aW9uOiBzY29wZS5pdGVtcy5wdXNoKCduZXcnKVxuICogLSAkLXByZWZpeGVkIGVzY2FwZSBoYXRjaGVzOiAkZ2V0VmFsdWUsICRzZXRWYWx1ZSwgJHJlYWQsICRnZXRBcmdzLCBldGMuXG4gKlxuICogUmVhZCBzZW1hbnRpY3M6IHRvcC1sZXZlbCBnZXQgY2FsbHMgZ2V0VmFsdWUoKSAoZmlyZXMgb25SZWFkIE9OQ0UpLlxuICogICBOZXN0ZWQgZ2V0IHRyYXBzIG5hdmlnYXRlIGluLW1lbW9yeSAtLSBubyBhZGRpdGlvbmFsIG9uUmVhZC5cbiAqXG4gKiBXcml0ZSBzZW1hbnRpY3M6IHRvcC1sZXZlbCBzZXQgY2FsbHMgc2V0VmFsdWUoKS4gTmVzdGVkIHNldCBjYWxsc1xuICogICB1cGRhdGVWYWx1ZSgpIHdpdGggYSBwYXJ0aWFsIG9iamVjdCBidWlsdCBmcm9tIHRoZSBhY2N1bXVsYXRlZCBwYXRoLlxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUdldCBhcyBsb2Rhc2hHZXQgfSBmcm9tICcuLi9tZW1vcnkvcGF0aE9wcy5qcyc7XG5pbXBvcnQgeyBzaG91bGRXcmFwV2l0aFByb3h5IH0gZnJvbSAnLi9hbGxvd2xpc3QuanMnO1xuaW1wb3J0IHsgY3JlYXRlQXJyYXlQcm94eSB9IGZyb20gJy4vYXJyYXlUcmFwcy5qcyc7XG5pbXBvcnQgeyBidWlsZE5lc3RlZFBhdGNoIH0gZnJvbSAnLi9wYXRoQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0aXZlT3B0aW9ucywgUmVhY3RpdmVUYXJnZXQsIFR5cGVkU2NvcGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IEJSRUFLX1NFVFRFUiwgRVhFQ1VUT1JfSU5URVJOQUxfTUVUSE9EUywgSVNfVFlQRURfU0NPUEUsIFNDT1BFX01FVEhPRF9OQU1FUyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyAtLSBQcm94eSB1bndyYXBwaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBzdHJ1Y3R1cmVkQ2xvbmUgaW4gVHJhbnNhY3Rpb25CdWZmZXIgY2Fubm90IGNsb25lIFByb3h5IG9iamVjdHMuXG4vLyBXaGVuIGEgdXNlciBkb2VzIGBzY29wZS5iYWNrdXAgPSBzY29wZS5jdXN0b21lcmAsIHRoZSB2YWx1ZSBpcyBhIFByb3h5LlxuLy8gVW53cmFwIHRvIGEgcGxhaW4gb2JqZWN0IGJlZm9yZSBzdG9yaW5nLlxuXG5mdW5jdGlvbiB1bndyYXBQcm94eSh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbHVlO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICAvLyBGYXN0IHBhdGg6IHBsYWluIG9iamVjdHMgYW5kIGFycmF5cyBkb24ndCBuZWVkIHVud3JhcHBpbmdcbiAgdHJ5IHtcbiAgICAvLyBKU09OIHJvdW5kLXRyaXAgc3RyaXBzIFByb3hpZXMuIFNhZmUgYmVjYXVzZSBzdGF0ZSB2YWx1ZXMgbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZS5cbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBOb24tc2VyaWFsaXphYmxlIChmdW5jdGlvbnMsIHN5bWJvbHMsIGV0Yy4pIOKAlCByZXR1cm4gYXMtaXNcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLy8gLS0gJC1tZXRob2Qgcm91dGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50eXBlIE1ldGhvZFJvdXRlciA9ICh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBvcHRzOiBSZWFjdGl2ZVN0YXRlKSA9PiB1bmtub3duO1xuXG5jb25zdCBNRVRIT0RfUk9VVEVTOiBSZWNvcmQ8c3RyaW5nLCBNZXRob2RSb3V0ZXI+ID0ge1xuICAkZ2V0VmFsdWU6ICh0KSA9PiB0LmdldFZhbHVlLmJpbmQodCksXG4gICRzZXRWYWx1ZTogKHQpID0+IHQuc2V0VmFsdWUuYmluZCh0KSxcbiAgJHVwZGF0ZTogKHQpID0+IHQudXBkYXRlVmFsdWUuYmluZCh0KSxcbiAgJGRlbGV0ZTogKHQpID0+IHQuZGVsZXRlVmFsdWUuYmluZCh0KSxcbiAgJHJlYWQ6ICh0KSA9PiAoZG90UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgcm9vdEtleSA9IGRvdFBhdGguc3BsaXQoJy4nKVswXTtcbiAgICBjb25zdCB2YWx1ZSA9IHQuZ2V0VmFsdWUocm9vdEtleSk7XG4gICAgaWYgKCFkb3RQYXRoLmluY2x1ZGVzKCcuJykpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gbG9kYXNoR2V0KHZhbHVlLCBkb3RQYXRoLnNsaWNlKHJvb3RLZXkubGVuZ3RoICsgMSkpO1xuICB9LFxuICAkZ2V0QXJnczogKHQpID0+IHQuZ2V0QXJncy5iaW5kKHQpLFxuICAkZ2V0RW52OiAodCkgPT4gdC5nZXRFbnYuYmluZCh0KSxcbiAgJGRlYnVnOiAodCkgPT4gdC5hZGREZWJ1Z0luZm8uYmluZCh0KSxcbiAgJGxvZzogKHQpID0+IHQuYWRkRGVidWdNZXNzYWdlLmJpbmQodCksXG4gICRlcnJvcjogKHQpID0+IHQuYWRkRXJyb3JJbmZvLmJpbmQodCksXG4gICRtZXRyaWM6ICh0KSA9PiB0LmFkZE1ldHJpYy5iaW5kKHQpLFxuICAkZXZhbDogKHQpID0+IHQuYWRkRXZhbC5iaW5kKHQpLFxuICAkYXR0YWNoUmVjb3JkZXI6ICh0KSA9PiB0LmF0dGFjaFJlY29yZGVyLmJpbmQodCksXG4gICRkZXRhY2hSZWNvcmRlcjogKHQpID0+IHQuZGV0YWNoUmVjb3JkZXIuYmluZCh0KSxcbiAgJGdldFJlY29yZGVyczogKHQpID0+IHQuZ2V0UmVjb3JkZXJzLmJpbmQodCksXG4gICRiYXRjaEFycmF5OiAodCkgPT4gKGtleTogc3RyaW5nLCBmbjogKGFycjogdW5rbm93bltdKSA9PiB2b2lkKSA9PiB7XG4gICAgLy8gT25lIGdldFZhbHVlIOKAlCBmaXJlcyBvblJlYWQgb25jZVxuICAgIGNvbnN0IGN1cnJlbnQgPSB0LmdldFZhbHVlKGtleSk7XG4gICAgLy8gQ2xvbmUgb25jZSAob3Igc3RhcnQgZW1wdHkgaWYgbWlzc2luZy9ub24tYXJyYXkpXG4gICAgY29uc3QgY2xvbmU6IHVua25vd25bXSA9IEFycmF5LmlzQXJyYXkoY3VycmVudCkgPyBbLi4uY3VycmVudF0gOiBbXTtcbiAgICAvLyBVc2VyIGFwcGxpZXMgYWxsIG11dGF0aW9ucyB0byB0aGUgcGxhaW4gY2xvbmUg4oCUIG5vIFByb3h5LCBubyBwZXItbXV0YXRpb24gY29tbWl0XG4gICAgZm4oY2xvbmUpO1xuICAgIC8vIE9uZSBzZXRWYWx1ZSDigJQgZmlyZXMgb25Xcml0ZSBvbmNlIHdpdGggdGhlIGZpbmFsIGFycmF5XG4gICAgdC5zZXRWYWx1ZShrZXksIGNsb25lKTtcbiAgfSxcbiAgJGJyZWFrOiAoX3QsIG9wdHMpID0+IChyZWFzb24/OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIW9wdHMuYnJlYWtGbikgdGhyb3cgbmV3IEVycm9yKCckYnJlYWsoKSBpcyBub3QgYXZhaWxhYmxlIG91dHNpZGUgc3RhZ2UgZXhlY3V0aW9uJyk7XG4gICAgb3B0cy5icmVha0ZuKHJlYXNvbik7XG4gIH0sXG4gIC8vIE9ic2VydmFiaWxpdHkg4oCUIEVtaXQgY2hhbm5lbCAoUGhhc2UgMykuIFJvdXRlcyB0byBTY29wZUZhY2FkZS5lbWl0RXZlbnRcbiAgLy8gd2hpY2ggaGFuZGxlcyBmYXN0LXBhdGgsIGVucmljaG1lbnQsIHJlZGFjdGlvbiwgYW5kIGVycm9yIGlzb2xhdGlvbi5cbiAgJGVtaXQ6ICh0KSA9PiB0LmVtaXRFdmVudC5iaW5kKHQpLFxuICAvLyBEZXRhY2ggKFQ0KSDigJQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydHMuIERlbGVnYXRlcyB0byBTY29wZUZhY2FkZVxuICAvLyB3aGljaCBtaW50ZWQgcmVmSWRzIGZyb20gcnVudGltZVN0YWdlSWQuXG4gICRkZXRhY2hBbmRKb2luTGF0ZXI6ICh0KSA9PiB0LmRldGFjaEFuZEpvaW5MYXRlci5iaW5kKHQpLFxuICAkZGV0YWNoQW5kRm9yZ2V0OiAodCkgPT4gdC5kZXRhY2hBbmRGb3JnZXQuYmluZCh0KSxcbiAgJHRvUmF3OiAodCkgPT4gKCkgPT4gdCxcbn07XG5cbi8vIC0tIEd1YXJkIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoZXNlIG11c3QgYmUgaGFuZGxlZCB0byBwcmV2ZW50IFByb3h5IGZyb20gYmVpbmcgdHJlYXRlZCBhcyBhIFByb21pc2UsXG4vLyBicmVha2luZyBpbnN0YW5jZW9mIGNoZWNrcywgb3IgY29uZnVzaW5nIHRlc3QgbWF0Y2hlcnMuXG5cbmNvbnN0IEdVQVJEX1BST1BTOiBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPiA9IHtcbiAgdGhlbjogdW5kZWZpbmVkLCAvLyBwcmV2ZW50IFByb21pc2UgZGV0ZWN0aW9uXG4gIGFzeW1tZXRyaWNNYXRjaDogdW5kZWZpbmVkLCAvLyBwcmV2ZW50IHZpdGVzdC9qZXN0IG1hdGNoZXIgY29uZnVzaW9uXG4gIGNvbnN0cnVjdG9yOiBPYmplY3QsIC8vIHNhZmUgcHJvdG90eXBlXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiAnVHlwZWRTY29wZScsXG59O1xuXG4vLyAtLSBNdXRhYmxlIHN0YXRlIHBlciBwcm94eSBpbnN0YW5jZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmludGVyZmFjZSBSZWFjdGl2ZVN0YXRlIHtcbiAgYnJlYWtGbj86IChyZWFzb24/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDYWNoZTogdG9wLWxldmVsIGtleSAtPiB7IHJhdyBvYmplY3QgcmVmLCBjaGlsZCBwcm94eSB9ICovXG4gIGNoaWxkQ2FjaGU6IE1hcDxzdHJpbmcsIHsgcmVmOiBvYmplY3Q7IHByb3h5OiBvYmplY3QgfT47XG59XG5cbi8vIC0tIE5lc3RlZCBjaGlsZCBwcm94eSAoZm9yIGRlZXAgd3JpdGUgaW50ZXJjZXB0aW9uKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4vLyBDeWNsZSBzYWZldHk6IGFuIGltbXV0YWJsZSBTZXQ8b2JqZWN0PiBvZiBhbmNlc3RvciBvYmplY3RzIGlzIHBhc3NlZCBkb3duXG4vLyBlYWNoIGFjY2VzcyBjaGFpbi4gRWFjaCBicmFuY2ggZ2V0cyBpdHMgb3duIGNvcHkgKG5ldyBTZXQocGFyZW50KSkgc29cbi8vIHNjb3BlLnguZnJpZW5kIGFuZCBzY29wZS54LmNvd29ya2VyIGRvbid0IHBvbGx1dGUgZWFjaCBvdGhlcidzIHRyYWNraW5nLlxuLy8gV2hlbiBhIGNoaWxkIHZhbHVlIGlzIGFscmVhZHkgaW4gdGhlIGFuY2VzdG9yIHNldCwgd2UndmUgaGl0IGEgY3ljbGUuXG4vLyBBdCB0aGUgY3ljbGUgYnJlYWs6IHJldHVybiBhIHRlcm1pbmFsIHByb3h5IHRoYXQgdHJhY2tzIHdyaXRlcyAoc2V0IHRyYXBcbi8vIHN0aWxsIGJ1aWxkcyBwYXRoICsgY2FsbHMgdXBkYXRlVmFsdWUpIGJ1dCBkb2Vzbid0IHJlY3Vyc2UgcmVhZHMgZnVydGhlci5cblxuZnVuY3Rpb24gY3JlYXRlVGVybWluYWxQcm94eShcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcm9vdEtleTogc3RyaW5nLFxuICBzZWdtZW50czogc3RyaW5nW10sXG4gIHRhcmdldDogUmVhY3RpdmVUYXJnZXQsXG4gIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLFxuICB2aXNpdGVkOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICB2aXNpdGVkLmFkZChvYmopO1xuXG4gIHJldHVybiBuZXcgUHJveHkob2JqLCB7XG4gICAgZ2V0KHJhdywgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykgcmV0dXJuIChyYXcgYXMgYW55KVtwcm9wXTtcbiAgICAgIGlmIChwcm9wID09PSAndGhlbicpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAocHJvcCA9PT0gJ2FzeW1tZXRyaWNNYXRjaCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAocHJvcCA9PT0gJ2NvbnN0cnVjdG9yJykgcmV0dXJuIE9iamVjdDtcbiAgICAgIGlmIChwcm9wID09PSAndG9KU09OJylcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAvLyBTdHJpcCBvYmplY3QtdHlwZWQgdmFsdWVzIHRvIHByZXZlbnQgY2lyY3VsYXIgSlNPTiBlcnJvcnNcbiAgICAgICAgICBjb25zdCBzYWZlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhyYXcpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gKHJhdyBhcyBhbnkpW2tdO1xuICAgICAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdHlwZW9mIHYgIT09ICdvYmplY3QnKSBzYWZlW2tdID0gdjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNhZmU7XG4gICAgICAgIH07XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gKHJhdyBhcyBhbnkpW3Byb3BdO1xuXG4gICAgICAvLyBDb250aW51ZSB0cmFja2luZyB3cml0ZXMgYXQgZGVlcGVyIGxldmVscyB2aWEgY2hhaW5lZCB0ZXJtaW5hbCBwcm94aWVzLlxuICAgICAgLy8gVXNlIHZpc2l0ZWQgc2V0IHRvIHByZXZlbnQgcmUtZW50ZXJpbmcgdGhlIHNhbWUgb2JqZWN0IChjeWNsZSBpbiB0ZXJtaW5hbCBjaGFpbikuXG4gICAgICBpZiAoc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2aXNpdGVkLmhhcyh2YWx1ZSBhcyBvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVUZXJtaW5hbFByb3h5KFxuICAgICAgICAgIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgIHJvb3RLZXksXG4gICAgICAgICAgWy4uLnNlZ21lbnRzLCBwcm9wIGFzIHN0cmluZ10sXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIHZpc2l0ZWQsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIHNldChyYXcsIHByb3AsIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGNvbnN0IGNoaWxkU2VnbWVudHMgPSBbLi4uc2VnbWVudHMsIHByb3BdO1xuICAgICAgY29uc3QgcGF0Y2ggPSBidWlsZE5lc3RlZFBhdGNoKGNoaWxkU2VnbWVudHMsIHVud3JhcFByb3h5KHZhbHVlKSk7XG4gICAgICB0YXJnZXQudXBkYXRlVmFsdWUocm9vdEtleSwgcGF0Y2gpO1xuICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocm9vdEtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTmVzdGVkUHJveHkoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHJvb3RLZXk6IHN0cmluZyxcbiAgc2VnbWVudHM6IHN0cmluZ1tdLFxuICB0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LFxuICByZWFkU2lsZW50OiAoa2V5Pzogc3RyaW5nKSA9PiB1bmtub3duLFxuICBzdGF0ZTogUmVhY3RpdmVTdGF0ZSxcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICByZXR1cm4gbmV3IFByb3h5KG9iaiwge1xuICAgIGdldChyYXcsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHJldHVybiAocmF3IGFzIGFueSlbcHJvcF07XG5cbiAgICAgIC8vIEd1YXJkIHByb3BlcnRpZXNcbiAgICAgIGlmIChwcm9wID09PSAndGhlbicpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAocHJvcCA9PT0gJ2FzeW1tZXRyaWNNYXRjaCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAocHJvcCA9PT0gJ2NvbnN0cnVjdG9yJykgcmV0dXJuIE9iamVjdDtcbiAgICAgIGlmIChwcm9wID09PSAndG9KU09OJylcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAvLyBTdHJpcCBvYmplY3QtdHlwZWQgdmFsdWVzIHRvIHByZXZlbnQgY2lyY3VsYXIgSlNPTiBlcnJvcnNcbiAgICAgICAgICBjb25zdCBzYWZlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhyYXcpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gKHJhdyBhcyBhbnkpW2tdO1xuICAgICAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdHlwZW9mIHYgIT09ICdvYmplY3QnKSBzYWZlW2tdID0gdjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNhZmU7XG4gICAgICAgIH07XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gKHJhdyBhcyBhbnkpW3Byb3BdO1xuXG4gICAgICAvLyBQcmltaXRpdmUgb3Igbm9uLXdyYXBwYWJsZSAtLSByZXR1cm4gYXMtaXMgKG5vIGRlZXBlciBwcm94eSlcbiAgICAgIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcblxuICAgICAgY29uc3QgY2hpbGRTZWdtZW50cyA9IFsuLi5zZWdtZW50cywgcHJvcCBhcyBzdHJpbmddO1xuXG4gICAgICAvLyBBcnJheSAtLSByZXR1cm4gYXJyYXkgcHJveHlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQXJyYXlQcm94eShcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gcmVhZFNpbGVudChyb290S2V5KSBhcyBhbnk7XG4gICAgICAgICAgICByZXR1cm4gbG9kYXNoR2V0KGN1cnJlbnQsIGNoaWxkU2VnbWVudHMuam9pbignLicpKSA/PyBbXTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChuZXdBcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGNoID0gYnVpbGROZXN0ZWRQYXRjaChjaGlsZFNlZ21lbnRzLCB1bndyYXBQcm94eShuZXdBcnIpKTtcbiAgICAgICAgICAgIHRhcmdldC51cGRhdGVWYWx1ZShyb290S2V5LCBwYXRjaCk7XG4gICAgICAgICAgICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShyb290S2V5KTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDeWNsZSBkZXRlY3Rpb246IGlmIHRoaXMgdmFsdWUgaXMgYW4gYW5jZXN0b3IgaW4gdGhlIGN1cnJlbnQgYWNjZXNzXG4gICAgICAvLyBjaGFpbiwgcmV0dXJuIGEgdGVybWluYWwgcHJveHkgKHRyYWNrcyB3cml0ZXMsIHN0b3BzIHJlY3Vyc2luZyByZWFkcykuXG4gICAgICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSBhcyBvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVUZXJtaW5hbFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByb290S2V5LCBjaGlsZFNlZ21lbnRzLCB0YXJnZXQsIHN0YXRlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQnVpbGQgbmV3IGFuY2VzdG9yIHNldCBmb3IgdGhpcyBicmFuY2ggKGltbXV0YWJsZSAtLSBubyBjcm9zcy1icmFuY2ggcG9sbHV0aW9uKVxuICAgICAgY29uc3QgY2hpbGRBbmNlc3RvcnMgPSBuZXcgU2V0KGFuY2VzdG9ycyk7XG4gICAgICBjaGlsZEFuY2VzdG9ycy5hZGQodmFsdWUgYXMgb2JqZWN0KTtcblxuICAgICAgcmV0dXJuIGNyZWF0ZU5lc3RlZFByb3h5KFxuICAgICAgICB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgcm9vdEtleSxcbiAgICAgICAgY2hpbGRTZWdtZW50cyxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICByZWFkU2lsZW50LFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgY2hpbGRBbmNlc3RvcnMsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBzZXQocmF3LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykgcmV0dXJuIHRydWU7XG5cbiAgICAgIGNvbnN0IGNoaWxkU2VnbWVudHMgPSBbLi4uc2VnbWVudHMsIHByb3BdO1xuICAgICAgY29uc3QgcGF0Y2ggPSBidWlsZE5lc3RlZFBhdGNoKGNoaWxkU2VnbWVudHMsIHVud3JhcFByb3h5KHZhbHVlKSk7XG4gICAgICB0YXJnZXQudXBkYXRlVmFsdWUocm9vdEtleSwgcGF0Y2gpO1xuICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocm9vdEtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcbn1cblxuLy8gLS0gVG9wLWxldmVsIHByb3h5ICh0aGUgbWFpbiBUeXBlZFNjb3BlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENyZWF0ZXMgYSBUeXBlZFNjb3BlPFQ+IHByb3h5IHdyYXBwaW5nIGEgUmVhY3RpdmVUYXJnZXQuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB1bmRlcmx5aW5nIHNjb3BlIChTY29wZUZhY2FkZSBvciBhbnkgUmVhY3RpdmVUYXJnZXQpXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gKGJyZWFrUGlwZWxpbmUgaW5qZWN0aW9uKVxuICogQHJldHVybnMgQSBQcm94eSB3aXRoIHR5cGVkIHByb3BlcnR5IGFjY2VzcyBhbmQgJC1wcmVmaXhlZCBtZXRob2RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUeXBlZFNjb3BlPFQgZXh0ZW5kcyBvYmplY3Q+KHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIG9wdGlvbnM/OiBSZWFjdGl2ZU9wdGlvbnMpOiBUeXBlZFNjb3BlPFQ+IHtcbiAgY29uc3Qgc3RhdGU6IFJlYWN0aXZlU3RhdGUgPSB7XG4gICAgYnJlYWtGbjogb3B0aW9ucz8uYnJlYWtQaXBlbGluZSxcbiAgICBjaGlsZENhY2hlOiBuZXcgTWFwKCksXG4gIH07XG5cbiAgLy8gQmluZCBzaWxlbnQtcmVhZCBtZXRob2Qgb25jZSDigJQgYXZvaWRzIHBlci1jYWxsID8/ICsgLmNhbGwoKSBpbiBhcnJheSBwcm94eSBnZXRDdXJyZW50IGNsb3N1cmVzXG4gIGNvbnN0IHJlYWRTaWxlbnQgPSAodGFyZ2V0LmdldFZhbHVlU2lsZW50ID8/IHRhcmdldC5nZXRWYWx1ZSkuYmluZCh0YXJnZXQpO1xuXG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCBhcyB1bmtub3duIGFzIFR5cGVkU2NvcGU8VD4sIHtcbiAgICBnZXQoX3Byb3h5VGFyZ2V0LCBwcm9wLCBfcmVjZWl2ZXIpIHtcbiAgICAgIC8vIDEuIEludGVybmFsIHN5bWJvbHMgKGNoZWNrIGJlZm9yZSBvdGhlciBzeW1ib2xzKVxuICAgICAgaWYgKHByb3AgPT09IElTX1RZUEVEX1NDT1BFKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChwcm9wID09PSBCUkVBS19TRVRURVIpIHtcbiAgICAgICAgcmV0dXJuIChmbjogKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICAgIHN0YXRlLmJyZWFrRm4gPSBmbjtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gU3ltYm9sIHByb3BlcnRpZXMgKGd1YXJkICsgaW5zcGVjdGlvbilcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHVUFSRF9QUk9QUywgcHJvcCkpIHJldHVybiBHVUFSRF9QUk9QU1twcm9wXTtcbiAgICAgICAgLy8gTm9kZS5qcyB1dGlsLmluc3BlY3Qg4oCUIHNob3cgc3RhdGUgc25hcHNob3QsIG5vdCBwcm94eSBpbnRlcm5hbHNcbiAgICAgICAgaWYgKHByb3AgPT09IFN5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJykpIHtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LmdldFZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gMy4gU3RyaW5nIGd1YXJkIHByb3BlcnRpZXNcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoR1VBUkRfUFJPUFMsIHByb3ApKSByZXR1cm4gR1VBUkRfUFJPUFNbcHJvcF07XG5cbiAgICAgIC8vIDQuICQtcHJlZml4ZWQgbWV0aG9kcyAtLSByb3V0ZSB0byBmYWNhZGVcbiAgICAgIGlmIChTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKHByb3ApKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlciA9IE1FVEhPRF9ST1VURVNbcHJvcF07XG4gICAgICAgIGlmIChyb3V0ZXIpIHJldHVybiByb3V0ZXIodGFyZ2V0LCBzdGF0ZSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIDUuIEV4ZWN1dG9yLWludGVybmFsIG1ldGhvZCBwYXNzLXRocm91Z2ggKGV4cGxpY2l0IGFsbG93bGlzdClcbiAgICAgIC8vICAgIEZsb3dDaGFydEV4ZWN1dG9yIHdyYXBwaW5nIGNhbGxzIGF0dGFjaFJlY29yZGVyLCBub3RpZnlTdGFnZVN0YXJ0LCBldGMuXG4gICAgICAvLyAgICBkaXJlY3RseSBvbiB0aGUgc2NvcGUuIEZvcndhcmQgb25seSBhbGxvd2xpc3RlZCBtZXRob2RzLlxuICAgICAgaWYgKEVYRUNVVE9SX0lOVEVSTkFMX01FVEhPRFMuaGFzKHByb3ApICYmIHR5cGVvZiAodGFyZ2V0IGFzIGFueSlbcHJvcF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh0YXJnZXQgYXMgYW55KVtwcm9wXS5iaW5kKHRhcmdldCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIFN0YXRlIGtleSAtLSBjYWxsIGdldFZhbHVlIChmaXJlcyBvblJlYWQgT05DRSlcbiAgICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0LmdldFZhbHVlKHByb3ApO1xuXG4gICAgICAvLyBQcmltaXRpdmUgb3IgbnVsbC91bmRlZmluZWQgLS0gcmV0dXJuIGFzLWlzXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9uLXdyYXBwYWJsZSAoRGF0ZSwgTWFwLCBjbGFzcyBpbnN0YW5jZSwgZXRjLikgLS0gcmV0dXJuIHVud3JhcHBlZFxuICAgICAgaWYgKCFzaG91bGRXcmFwV2l0aFByb3h5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAvLyBBcnJheSAtLSByZXR1cm4gYXJyYXkgcHJveHkgKGNhY2hlZCBmb3IgaWRlbnRpdHkgZXF1YWxpdHkpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgY2FjaGVkID0gc3RhdGUuY2hpbGRDYWNoZS5nZXQocHJvcCk7XG4gICAgICAgIGlmIChjYWNoZWQgJiYgY2FjaGVkLnJlZiA9PT0gdmFsdWUpIHJldHVybiBjYWNoZWQucHJveHk7XG5cbiAgICAgICAgY29uc3QgYXJyUHJveHkgPSBjcmVhdGVBcnJheVByb3h5KFxuICAgICAgICAgICgpID0+IChyZWFkU2lsZW50KHByb3ApIGFzIHVua25vd25bXSkgPz8gW10sXG4gICAgICAgICAgKG5ld0FycikgPT4ge1xuICAgICAgICAgICAgdGFyZ2V0LnNldFZhbHVlKHByb3AsIHVud3JhcFByb3h5KG5ld0FycikpO1xuICAgICAgICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocHJvcCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgc3RhdGUuY2hpbGRDYWNoZS5zZXQocHJvcCwgeyByZWY6IHZhbHVlIGFzIG9iamVjdCwgcHJveHk6IGFyclByb3h5IGFzIHVua25vd24gYXMgb2JqZWN0IH0pO1xuICAgICAgICByZXR1cm4gYXJyUHJveHk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBsYWluIG9iamVjdCAtLSByZXR1cm4gbmVzdGVkIHByb3h5IChjYWNoZWQgZm9yIGlkZW50aXR5IGVxdWFsaXR5KVxuICAgICAgY29uc3QgY2FjaGVkID0gc3RhdGUuY2hpbGRDYWNoZS5nZXQocHJvcCk7XG4gICAgICBpZiAoY2FjaGVkICYmIGNhY2hlZC5yZWYgPT09IHZhbHVlKSByZXR1cm4gY2FjaGVkLnByb3h5O1xuXG4gICAgICBjb25zdCBuZXN0ZWQgPSBjcmVhdGVOZXN0ZWRQcm94eShcbiAgICAgICAgdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIHByb3AsXG4gICAgICAgIFtdLFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHJlYWRTaWxlbnQsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBuZXcgU2V0PG9iamVjdD4oW3ZhbHVlIGFzIG9iamVjdF0pLCAvLyBzZWVkIGFuY2VzdG9yIHNldCB3aXRoIHJvb3Qgb2JqZWN0XG4gICAgICApO1xuICAgICAgc3RhdGUuY2hpbGRDYWNoZS5zZXQocHJvcCwgeyByZWY6IHZhbHVlIGFzIG9iamVjdCwgcHJveHk6IG5lc3RlZCBhcyBvYmplY3QgfSk7XG4gICAgICByZXR1cm4gbmVzdGVkO1xuICAgIH0sXG5cbiAgICBzZXQoX3Byb3h5VGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBzZXQgc3RhdGUga2V5IFwiJHtwcm9wfVwiIC0tIGl0IGNvbmZsaWN0cyB3aXRoIGEgcmVzZXJ2ZWQgVHlwZWRTY29wZSBtZXRob2QuIFJlbmFtZSB0aGUgc3RhdGUga2V5IHRvIGF2b2lkICQtcHJlZml4ZWQgbmFtZXMuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIFVud3JhcCBQcm94eSB2YWx1ZXMgYmVmb3JlIHN0b3Jpbmcg4oCUIHN0cnVjdHVyZWRDbG9uZSBpbiBUcmFuc2FjdGlvbkJ1ZmZlclxuICAgICAgLy8gY2Fubm90IGNsb25lIFByb3h5IG9iamVjdHMuIFRoaXMgaGFuZGxlczogc2NvcGUuYmFja3VwID0gc2NvcGUuY3VzdG9tZXJcbiAgICAgIGNvbnN0IHVud3JhcHBlZCA9IHVud3JhcFByb3h5KHZhbHVlKTtcbiAgICAgIHRhcmdldC5zZXRWYWx1ZShwcm9wLCB1bndyYXBwZWQpO1xuICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocHJvcCk7IC8vIGludmFsaWRhdGUgY2FjaGVcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBkZWxldGVQcm9wZXJ0eShfcHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHJldHVybiB0cnVlO1xuICAgICAgdGFyZ2V0LmRlbGV0ZVZhbHVlKHByb3ApO1xuICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgaGFzKF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHVUFSRF9QUk9QUywgcHJvcCk7XG4gICAgICBpZiAoU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSkgcmV0dXJuIHRydWU7XG4gICAgICAvLyBVc2Ugbm9uLXRyYWNraW5nIGhhc0tleSBpZiBhdmFpbGFibGUsIGVsc2UgZmFsbGJhY2sgdG8gZ2V0U3RhdGVLZXlzXG4gICAgICBpZiAodGFyZ2V0Lmhhc0tleSkgcmV0dXJuIHRhcmdldC5oYXNLZXkocHJvcCk7XG4gICAgICBpZiAodGFyZ2V0LmdldFN0YXRlS2V5cykgcmV0dXJuIHRhcmdldC5nZXRTdGF0ZUtleXMoKS5pbmNsdWRlcyhwcm9wKTtcbiAgICAgIC8vIEZhbGxiYWNrOiBnZXRWYWx1ZSBmaXJlcyBvblJlYWQgKGFjY2VwdGFibGUgZGVncmFkYXRpb24pXG4gICAgICByZXR1cm4gdGFyZ2V0LmdldFZhbHVlKHByb3ApICE9PSB1bmRlZmluZWQ7XG4gICAgfSxcblxuICAgIG93bktleXMoKSB7XG4gICAgICAvLyBVc2Ugbm9uLXRyYWNraW5nIGdldFN0YXRlS2V5cyBpZiBhdmFpbGFibGUsIGVsc2UgZmFsbGJhY2tcbiAgICAgIGlmICh0YXJnZXQuZ2V0U3RhdGVLZXlzKSByZXR1cm4gdGFyZ2V0LmdldFN0YXRlS2V5cygpO1xuICAgICAgY29uc3Qgc25hcHNob3QgPSB0YXJnZXQuZ2V0VmFsdWUoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghc25hcHNob3QgfHwgdHlwZW9mIHNuYXBzaG90ICE9PSAnb2JqZWN0JykgcmV0dXJuIFtdO1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNuYXBzaG90KTtcbiAgICB9LFxuXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGlmIChTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKHByb3ApKSByZXR1cm4gdW5kZWZpbmVkOyAvLyAkLW1ldGhvZHMgYXJlIG5vbi1lbnVtZXJhYmxlXG4gICAgICAvLyBDaGVjayBleGlzdGVuY2Ugd2l0aG91dCBmaXJpbmcgb25SZWFkIOKAlCBubyBnZXRWYWx1ZSBjYWxsIGhlcmVcbiAgICAgIGNvbnN0IGV4aXN0cyA9IHRhcmdldC5oYXNLZXlcbiAgICAgICAgPyB0YXJnZXQuaGFzS2V5KHByb3ApXG4gICAgICAgIDogdGFyZ2V0LmdldFN0YXRlS2V5c1xuICAgICAgICA/IHRhcmdldC5nZXRTdGF0ZUtleXMoKS5pbmNsdWRlcyhwcm9wKVxuICAgICAgICA6IHRhcmdldC5nZXRWYWx1ZShwcm9wKSAhPT0gdW5kZWZpbmVkOyAvLyBmYWxsYmFjayBvbmx5XG4gICAgICBpZiAoIWV4aXN0cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIC8vIFJldHVybiBhIG1pbmltYWwgZGVzY3JpcHRvciDigJQgYWN0dWFsIHZhbHVlIGlzIGZldGNoZWQgdmlhIHRoZSBnZXQgdHJhcFxuICAgICAgcmV0dXJuIHsgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9O1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBwcm94eTtcbn1cbiJdfQ==
346
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVHlwZWRTY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvY3JlYXRlVHlwZWRTY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxTQUFTLElBQUksU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFcEQsT0FBTyxFQUFFLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekcsK0VBQStFO0FBQy9FLG1FQUFtRTtBQUNuRSwwRUFBMEU7QUFDMUUsMkNBQTJDO0FBRTNDLFNBQVMsV0FBVyxDQUFDLEtBQWM7SUFDakMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDNUMsNERBQTREO0lBQzVELElBQUksQ0FBQztRQUNILHVGQUF1RjtRQUN2RixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCw2REFBNkQ7UUFDN0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQU1ELE1BQU0sYUFBYSxHQUFpQztJQUNsRCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFB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Q0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLGdCQUFnQjtZQUN6RCxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUM5Qix5RUFBeUU7WUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbEUsQ0FBQztLQUNGLENBQUMsQ0FBQztJQUVILE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVhY3RpdmUvY3JlYXRlVHlwZWRTY29wZSAtLSBDb3JlIFByb3h5IGZhY3RvcnkgZm9yIFR5cGVkU2NvcGU8VD4uXG4gKlxuICogV3JhcHMgYSBSZWFjdGl2ZVRhcmdldCAoU2NvcGVGYWNhZGUpIGluIGEgUHJveHkgdGhhdCBwcm92aWRlczpcbiAqIC0gVHlwZWQgcHJvcGVydHkgYWNjZXNzOiBzY29wZS5jcmVkaXRUaWVyIChyZWFkKSwgc2NvcGUuY3JlZGl0VGllciA9ICdBJyAod3JpdGUpXG4gKiAtIERlZXAgd3JpdGUgaW50ZXJjZXB0aW9uOiBzY29wZS5jdXN0b21lci5hZGRyZXNzLnppcCA9ICc5MDIxMCdcbiAqIC0gQXJyYXkgbXV0YXRpb24gaW50ZXJjZXB0aW9uOiBzY29wZS5pdGVtcy5wdXNoKCduZXcnKVxuICogLSAkLXByZWZpeGVkIGVzY2FwZSBoYXRjaGVzOiAkZ2V0VmFsdWUsICRzZXRWYWx1ZSwgJHJlYWQsICRnZXRBcmdzLCBldGMuXG4gKlxuICogUmVhZCBzZW1hbnRpY3M6IHRvcC1sZXZlbCBnZXQgY2FsbHMgZ2V0VmFsdWUoKSAoZmlyZXMgb25SZWFkIE9OQ0UpLlxuICogICBOZXN0ZWQgZ2V0IHRyYXBzIG5hdmlnYXRlIGluLW1lbW9yeSAtLSBubyBhZGRpdGlvbmFsIG9uUmVhZC5cbiAqXG4gKiBXcml0ZSBzZW1hbnRpY3M6IHRvcC1sZXZlbCBzZXQgY2FsbHMgc2V0VmFsdWUoKS4gTmVzdGVkIHNldCBjYWxsc1xuICogICB1cGRhdGVWYWx1ZSgpIHdpdGggYSBwYXJ0aWFsIG9iamVjdCBidWlsdCBmcm9tIHRoZSBhY2N1bXVsYXRlZCBwYXRoLlxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUdldCBhcyBsb2Rhc2hHZXQgfSBmcm9tICcuLi9tZW1vcnkvcGF0aE9wcy5qcyc7XG5pbXBvcnQgeyBzaG91bGRXcmFwV2l0aFByb3h5IH0gZnJvbSAnLi9hbGxvd2xpc3QuanMnO1xuaW1wb3J0IHsgY3JlYXRlQXJyYXlQcm94eSB9IGZyb20gJy4vYXJyYXlUcmFwcy5qcyc7XG5pbXBvcnQgeyBidWlsZE5lc3RlZFBhdGNoIH0gZnJvbSAnLi9wYXRoQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0aXZlT3B0aW9ucywgUmVhY3RpdmVUYXJnZXQsIFR5cGVkU2NvcGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IEJSRUFLX1NFVFRFUiwgRVhFQ1VUT1JfSU5URVJOQUxfTUVUSE9EUywgSVNfVFlQRURfU0NPUEUsIFNDT1BFX01FVEhPRF9OQU1FUyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyAtLSBQcm94eSB1bndyYXBwaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBzdHJ1Y3R1cmVkQ2xvbmUgaW4gVHJhbnNhY3Rpb25CdWZmZXIgY2Fubm90IGNsb25lIFByb3h5IG9iamVjdHMuXG4vLyBXaGVuIGEgdXNlciBkb2VzIGBzY29wZS5iYWNrdXAgPSBzY29wZS5jdXN0b21lcmAsIHRoZSB2YWx1ZSBpcyBhIFByb3h5LlxuLy8gVW53cmFwIHRvIGEgcGxhaW4gb2JqZWN0IGJlZm9yZSBzdG9yaW5nLlxuXG5mdW5jdGlvbiB1bndyYXBQcm94eSh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbHVlO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICAvLyBGYXN0IHBhdGg6IHBsYWluIG9iamVjdHMgYW5kIGFycmF5cyBkb24ndCBuZWVkIHVud3JhcHBpbmdcbiAgdHJ5IHtcbiAgICAvLyBKU09OIHJvdW5kLXRyaXAgc3RyaXBzIFByb3hpZXMuIFNhZmUgYmVjYXVzZSBzdGF0ZSB2YWx1ZXMgbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZS5cbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBOb24tc2VyaWFsaXphYmxlIChmdW5jdGlvbnMsIHN5bWJvbHMsIGV0Yy4pIOKAlCByZXR1cm4gYXMtaXNcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLy8gLS0gJC1tZXRob2Qgcm91dGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50eXBlIE1ldGhvZFJvdXRlciA9ICh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBvcHRzOiBSZWFjdGl2ZVN0YXRlKSA9PiB1bmtub3duO1xuXG5jb25zdCBNRVRIT0RfUk9VVEVTOiBSZWNvcmQ8c3RyaW5nLCBNZXRob2RSb3V0ZXI+ID0ge1xuICAkZ2V0VmFsdWU6ICh0KSA9PiB0LmdldFZhbHVlLmJpbmQodCksXG4gICRzZXRWYWx1ZTogKHQpID0+IHQuc2V0VmFsdWUuYmluZCh0KSxcbiAgJHVwZGF0ZTogKHQpID0+IHQudXBkYXRlVmFsdWUuYmluZCh0KSxcbiAgJGRlbGV0ZTogKHQpID0+IHQuZGVsZXRlVmFsdWUuYmluZCh0KSxcbiAgJHJlYWQ6ICh0KSA9PiAoZG90UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgcm9vdEtleSA9IGRvdFBhdGguc3BsaXQoJy4nKVswXTtcbiAgICBjb25zdCB2YWx1ZSA9IHQuZ2V0VmFsdWUocm9vdEtleSk7XG4gICAgaWYgKCFkb3RQYXRoLmluY2x1ZGVzKCcuJykpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gbG9kYXNoR2V0KHZhbHVlLCBkb3RQYXRoLnNsaWNlKHJvb3RLZXkubGVuZ3RoICsgMSkpO1xuICB9LFxuICAkZ2V0QXJnczogKHQpID0+IHQuZ2V0QXJncy5iaW5kKHQpLFxuICAkZ2V0RW52OiAodCkgPT4gdC5nZXRFbnYuYmluZCh0KSxcbiAgJGRlYnVnOiAodCkgPT4gdC5hZGREZWJ1Z0luZm8uYmluZCh0KSxcbiAgJGxvZzogKHQpID0+IHQuYWRkRGVidWdNZXNzYWdlLmJpbmQodCksXG4gICRlcnJvcjogKHQpID0+IHQuYWRkRXJyb3JJbmZvLmJpbmQodCksXG4gICRtZXRyaWM6ICh0KSA9PiB0LmFkZE1ldHJpYy5iaW5kKHQpLFxuICAkZXZhbDogKHQpID0+IHQuYWRkRXZhbC5iaW5kKHQpLFxuICAkYXR0YWNoU2NvcGVSZWNvcmRlcjogKHQpID0+IHQuYXR0YWNoU2NvcGVSZWNvcmRlci5iaW5kKHQpLFxuICAkZGV0YWNoU2NvcGVSZWNvcmRlcjogKHQpID0+IHQuZGV0YWNoU2NvcGVSZWNvcmRlci5iaW5kKHQpLFxuICAkZ2V0U2NvcGVSZWNvcmRlcnM6ICh0KSA9PiB0LmdldFNjb3BlUmVjb3JkZXJzLmJpbmQodCksXG4gICRiYXRjaEFycmF5OiAodCkgPT4gKGtleTogc3RyaW5nLCBmbjogKGFycjogdW5rbm93bltdKSA9PiB2b2lkKSA9PiB7XG4gICAgLy8gT25lIGdldFZhbHVlIOKAlCBmaXJlcyBvblJlYWQgb25jZVxuICAgIGNvbnN0IGN1cnJlbnQgPSB0LmdldFZhbHVlKGtleSk7XG4gICAgLy8gQ2xvbmUgb25jZSAob3Igc3RhcnQgZW1wdHkgaWYgbWlzc2luZy9ub24tYXJyYXkpXG4gICAgY29uc3QgY2xvbmU6IHVua25vd25bXSA9IEFycmF5LmlzQXJyYXkoY3VycmVudCkgPyBbLi4uY3VycmVudF0gOiBbXTtcbiAgICAvLyBVc2VyIGFwcGxpZXMgYWxsIG11dGF0aW9ucyB0byB0aGUgcGxhaW4gY2xvbmUg4oCUIG5vIFByb3h5LCBubyBwZXItbXV0YXRpb24gY29tbWl0XG4gICAgZm4oY2xvbmUpO1xuICAgIC8vIE9uZSBzZXRWYWx1ZSDigJQgZmlyZXMgb25Xcml0ZSBvbmNlIHdpdGggdGhlIGZpbmFsIGFycmF5XG4gICAgdC5zZXRWYWx1ZShrZXksIGNsb25lKTtcbiAgfSxcbiAgJGJyZWFrOiAoX3QsIG9wdHMpID0+IChyZWFzb24/OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIW9wdHMuYnJlYWtGbikgdGhyb3cgbmV3IEVycm9yKCckYnJlYWsoKSBpcyBub3QgYXZhaWxhYmxlIG91dHNpZGUgc3RhZ2UgZXhlY3V0aW9uJyk7XG4gICAgb3B0cy5icmVha0ZuKHJlYXNvbik7XG4gIH0sXG4gIC8vIE9ic2VydmFiaWxpdHkg4oCUIEVtaXQgY2hhbm5lbCAoUGhhc2UgMykuIFJvdXRlcyB0byBTY29wZUZhY2FkZS5lbWl0RXZlbnRcbiAgLy8gd2hpY2ggaGFuZGxlcyBmYXN0LXBhdGgsIGVucmljaG1lbnQsIHJlZGFjdGlvbiwgYW5kIGVycm9yIGlzb2xhdGlvbi5cbiAgJGVtaXQ6ICh0KSA9PiB0LmVtaXRFdmVudC5iaW5kKHQpLFxuICAvLyBEZXRhY2ggKFQ0KSDigJQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydHMuIERlbGVnYXRlcyB0byBTY29wZUZhY2FkZVxuICAvLyB3aGljaCBtaW50ZWQgcmVmSWRzIGZyb20gcnVudGltZVN0YWdlSWQuXG4gICRkZXRhY2hBbmRKb2luTGF0ZXI6ICh0KSA9PiB0LmRldGFjaEFuZEpvaW5MYXRlci5iaW5kKHQpLFxuICAkZGV0YWNoQW5kRm9yZ2V0OiAodCkgPT4gdC5kZXRhY2hBbmRGb3JnZXQuYmluZCh0KSxcbiAgJHRvUmF3OiAodCkgPT4gKCkgPT4gdCxcbn07XG5cbi8vIC0tIEd1YXJkIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoZXNlIG11c3QgYmUgaGFuZGxlZCB0byBwcmV2ZW50IFByb3h5IGZyb20gYmVpbmcgdHJlYXRlZCBhcyBhIFByb21pc2UsXG4vLyBicmVha2luZyBpbnN0YW5jZW9mIGNoZWNrcywgb3IgY29uZnVzaW5nIHRlc3QgbWF0Y2hlcnMuXG5cbmNvbnN0IEdVQVJEX1BST1BTOiBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPiA9IHtcbiAgdGhlbjogdW5kZWZpbmVkLCAvLyBwcmV2ZW50IFByb21pc2UgZGV0ZWN0aW9uXG4gIGFzeW1tZXRyaWNNYXRjaDogdW5kZWZpbmVkLCAvLyBwcmV2ZW50IHZpdGVzdC9qZXN0IG1hdGNoZXIgY29uZnVzaW9uXG4gIGNvbnN0cnVjdG9yOiBPYmplY3QsIC8vIHNhZmUgcHJvdG90eXBlXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiAnVHlwZWRTY29wZScsXG59O1xuXG4vLyAtLSBNdXRhYmxlIHN0YXRlIHBlciBwcm94eSBpbnN0YW5jZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmludGVyZmFjZSBSZWFjdGl2ZVN0YXRlIHtcbiAgYnJlYWtGbj86IChyZWFzb24/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDYWNoZTogdG9wLWxldmVsIGtleSAtPiB7IHJhdyBvYmplY3QgcmVmLCBjaGlsZCBwcm94eSB9ICovXG4gIGNoaWxkQ2FjaGU6IE1hcDxzdHJpbmcsIHsgcmVmOiBvYmplY3Q7IHByb3h5OiBvYmplY3QgfT47XG59XG5cbi8vIC0tIE5lc3RlZCBjaGlsZCBwcm94eSAoZm9yIGRlZXAgd3JpdGUgaW50ZXJjZXB0aW9uKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4vLyBDeWNsZSBzYWZldHk6IGFuIGltbXV0YWJsZSBTZXQ8b2JqZWN0PiBvZiBhbmNlc3RvciBvYmplY3RzIGlzIHBhc3NlZCBkb3duXG4vLyBlYWNoIGFjY2VzcyBjaGFpbi4gRWFjaCBicmFuY2ggZ2V0cyBpdHMgb3duIGNvcHkgKG5ldyBTZXQocGFyZW50KSkgc29cbi8vIHNjb3BlLnguZnJpZW5kIGFuZCBzY29wZS54LmNvd29ya2VyIGRvbid0IHBvbGx1dGUgZWFjaCBvdGhlcidzIHRyYWNraW5nLlxuLy8gV2hlbiBhIGNoaWxkIHZhbHVlIGlzIGFscmVhZHkgaW4gdGhlIGFuY2VzdG9yIHNldCwgd2UndmUgaGl0IGEgY3ljbGUuXG4vLyBBdCB0aGUgY3ljbGUgYnJlYWs6IHJldHVybiBhIHRlcm1pbmFsIHByb3h5IHRoYXQgdHJhY2tzIHdyaXRlcyAoc2V0IHRyYXBcbi8vIHN0aWxsIGJ1aWxkcyBwYXRoICsgY2FsbHMgdXBkYXRlVmFsdWUpIGJ1dCBkb2Vzbid0IHJlY3Vyc2UgcmVhZHMgZnVydGhlci5cblxuZnVuY3Rpb24gY3JlYXRlVGVybWluYWxQcm94eShcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcm9vdEtleTogc3RyaW5nLFxuICBzZWdtZW50czogc3RyaW5nW10sXG4gIHRhcmdldDogUmVhY3RpdmVUYXJnZXQsXG4gIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLFxuICB2aXNpdGVkOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICB2aXNpdGVkLmFkZChvYmopO1xuXG4gIHJldHVybiBuZXcgUHJveHkob2JqLCB7XG4gICAgZ2V0KHJhdywgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykgcmV0dXJuIChyYXcgYXMgYW55KVtwcm9wXTtcbiAgICAgIGlmIChwcm9wID09PSAndGhlbicpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAocHJvcCA9PT0gJ2FzeW1tZXRyaWNNYXRjaCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAocHJvcCA9PT0gJ2NvbnN0cnVjdG9yJykgcmV0dXJuIE9iamVjdDtcbiAgICAgIGlmIChwcm9wID09PSAndG9KU09OJylcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAvLyBTdHJpcCBvYmplY3QtdHlwZWQgdmFsdWVzIHRvIHByZXZlbnQgY2lyY3VsYXIgSlNPTiBlcnJvcnNcbiAgICAgICAgICBjb25zdCBzYWZlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhyYXcpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gKHJhdyBhcyBhbnkpW2tdO1xuICAgICAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdHlwZW9mIHYgIT09ICdvYmplY3QnKSBzYWZlW2tdID0gdjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNhZmU7XG4gICAgICAgIH07XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gKHJhdyBhcyBhbnkpW3Byb3BdO1xuXG4gICAgICAvLyBDb250aW51ZSB0cmFja2luZyB3cml0ZXMgYXQgZGVlcGVyIGxldmVscyB2aWEgY2hhaW5lZCB0ZXJtaW5hbCBwcm94aWVzLlxuICAgICAgLy8gVXNlIHZpc2l0ZWQgc2V0IHRvIHByZXZlbnQgcmUtZW50ZXJpbmcgdGhlIHNhbWUgb2JqZWN0IChjeWNsZSBpbiB0ZXJtaW5hbCBjaGFpbikuXG4gICAgICBpZiAoc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2aXNpdGVkLmhhcyh2YWx1ZSBhcyBvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVUZXJtaW5hbFByb3h5KFxuICAgICAgICAgIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgIHJvb3RLZXksXG4gICAgICAgICAgWy4uLnNlZ21lbnRzLCBwcm9wIGFzIHN0cmluZ10sXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIHZpc2l0ZWQsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIHNldChyYXcsIHByb3AsIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGNvbnN0IGNoaWxkU2VnbWVudHMgPSBbLi4uc2VnbWVudHMsIHByb3BdO1xuICAgICAgY29uc3QgcGF0Y2ggPSBidWlsZE5lc3RlZFBhdGNoKGNoaWxkU2VnbWVudHMsIHVud3JhcFByb3h5KHZhbHVlKSk7XG4gICAgICB0YXJnZXQudXBkYXRlVmFsdWUocm9vdEtleSwgcGF0Y2gpO1xuICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocm9vdEtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTmVzdGVkUHJveHkoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHJvb3RLZXk6IHN0cmluZyxcbiAgc2VnbWVudHM6IHN0cmluZ1tdLFxuICB0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LFxuICByZWFkU2lsZW50OiAoa2V5Pzogc3RyaW5nKSA9PiB1bmtub3duLFxuICBzdGF0ZTogUmVhY3RpdmVTdGF0ZSxcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICByZXR1cm4gbmV3IFByb3h5KG9iaiwge1xuICAgIGdldChyYXcsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHJldHVybiAocmF3IGFzIGFueSlbcHJvcF07XG5cbiAgICAgIC8vIEd1YXJkIHByb3BlcnRpZXNcbiAgICAgIGlmIChwcm9wID09PSAndGhlbicpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAocHJvcCA9PT0gJ2FzeW1tZXRyaWNNYXRjaCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAocHJvcCA9PT0gJ2NvbnN0cnVjdG9yJykgcmV0dXJuIE9iamVjdDtcbiAgICAgIGlmIChwcm9wID09PSAndG9KU09OJylcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAvLyBTdHJpcCBvYmplY3QtdHlwZWQgdmFsdWVzIHRvIHByZXZlbnQgY2lyY3VsYXIgSlNPTiBlcnJvcnNcbiAgICAgICAgICBjb25zdCBzYWZlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhyYXcpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gKHJhdyBhcyBhbnkpW2tdO1xuICAgICAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdHlwZW9mIHYgIT09ICdvYmplY3QnKSBzYWZlW2tdID0gdjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNhZmU7XG4gICAgICAgIH07XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gKHJhdyBhcyBhbnkpW3Byb3BdO1xuXG4gICAgICAvLyBQcmltaXRpdmUgb3Igbm9uLXdyYXBwYWJsZSAtLSByZXR1cm4gYXMtaXMgKG5vIGRlZXBlciBwcm94eSlcbiAgICAgIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcblxuICAgICAgY29uc3QgY2hpbGRTZWdtZW50cyA9IFsuLi5zZWdtZW50cywgcHJvcCBhcyBzdHJpbmddO1xuXG4gICAgICAvLyBBcnJheSAtLSByZXR1cm4gYXJyYXkgcHJveHlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQXJyYXlQcm94eShcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gcmVhZFNpbGVudChyb290S2V5KSBhcyBhbnk7XG4gICAgICAgICAgICByZXR1cm4gbG9kYXNoR2V0KGN1cnJlbnQsIGNoaWxkU2VnbWVudHMuam9pbignLicpKSA/PyBbXTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChuZXdBcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGNoID0gYnVpbGROZXN0ZWRQYXRjaChjaGlsZFNlZ21lbnRzLCB1bndyYXBQcm94eShuZXdBcnIpKTtcbiAgICAgICAgICAgIHRhcmdldC51cGRhdGVWYWx1ZShyb290S2V5LCBwYXRjaCk7XG4gICAgICAgICAgICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShyb290S2V5KTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDeWNsZSBkZXRlY3Rpb246IGlmIHRoaXMgdmFsdWUgaXMgYW4gYW5jZXN0b3IgaW4gdGhlIGN1cnJlbnQgYWNjZXNzXG4gICAgICAvLyBjaGFpbiwgcmV0dXJuIGEgdGVybWluYWwgcHJveHkgKHRyYWNrcyB3cml0ZXMsIHN0b3BzIHJlY3Vyc2luZyByZWFkcykuXG4gICAgICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSBhcyBvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVUZXJtaW5hbFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByb290S2V5LCBjaGlsZFNlZ21lbnRzLCB0YXJnZXQsIHN0YXRlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQnVpbGQgbmV3IGFuY2VzdG9yIHNldCBmb3IgdGhpcyBicmFuY2ggKGltbXV0YWJsZSAtLSBubyBjcm9zcy1icmFuY2ggcG9sbHV0aW9uKVxuICAgICAgY29uc3QgY2hpbGRBbmNlc3RvcnMgPSBuZXcgU2V0KGFuY2VzdG9ycyk7XG4gICAgICBjaGlsZEFuY2VzdG9ycy5hZGQodmFsdWUgYXMgb2JqZWN0KTtcblxuICAgICAgcmV0dXJuIGNyZWF0ZU5lc3RlZFByb3h5KFxuICAgICAgICB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgcm9vdEtleSxcbiAgICAgICAgY2hpbGRTZWdtZW50cyxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICByZWFkU2lsZW50LFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgY2hpbGRBbmNlc3RvcnMsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBzZXQocmF3LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykgcmV0dXJuIHRydWU7XG5cbiAgICAgIGNvbnN0IGNoaWxkU2VnbWVudHMgPSBbLi4uc2VnbWVudHMsIHByb3BdO1xuICAgICAgY29uc3QgcGF0Y2ggPSBidWlsZE5lc3RlZFBhdGNoKGNoaWxkU2VnbWVudHMsIHVud3JhcFByb3h5KHZhbHVlKSk7XG4gICAgICB0YXJnZXQudXBkYXRlVmFsdWUocm9vdEtleSwgcGF0Y2gpO1xuICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocm9vdEtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcbn1cblxuLy8gLS0gVG9wLWxldmVsIHByb3h5ICh0aGUgbWFpbiBUeXBlZFNjb3BlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENyZWF0ZXMgYSBUeXBlZFNjb3BlPFQ+IHByb3h5IHdyYXBwaW5nIGEgUmVhY3RpdmVUYXJnZXQuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB1bmRlcmx5aW5nIHNjb3BlIChTY29wZUZhY2FkZSBvciBhbnkgUmVhY3RpdmVUYXJnZXQpXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gKGJyZWFrUGlwZWxpbmUgaW5qZWN0aW9uKVxuICogQHJldHVybnMgQSBQcm94eSB3aXRoIHR5cGVkIHByb3BlcnR5IGFjY2VzcyBhbmQgJC1wcmVmaXhlZCBtZXRob2RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUeXBlZFNjb3BlPFQgZXh0ZW5kcyBvYmplY3Q+KHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIG9wdGlvbnM/OiBSZWFjdGl2ZU9wdGlvbnMpOiBUeXBlZFNjb3BlPFQ+IHtcbiAgY29uc3Qgc3RhdGU6IFJlYWN0aXZlU3RhdGUgPSB7XG4gICAgYnJlYWtGbjogb3B0aW9ucz8uYnJlYWtQaXBlbGluZSxcbiAgICBjaGlsZENhY2hlOiBuZXcgTWFwKCksXG4gIH07XG5cbiAgLy8gQmluZCBzaWxlbnQtcmVhZCBtZXRob2Qgb25jZSDigJQgYXZvaWRzIHBlci1jYWxsID8/ICsgLmNhbGwoKSBpbiBhcnJheSBwcm94eSBnZXRDdXJyZW50IGNsb3N1cmVzXG4gIGNvbnN0IHJlYWRTaWxlbnQgPSAodGFyZ2V0LmdldFZhbHVlU2lsZW50ID8/IHRhcmdldC5nZXRWYWx1ZSkuYmluZCh0YXJnZXQpO1xuXG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCBhcyB1bmtub3duIGFzIFR5cGVkU2NvcGU8VD4sIHtcbiAgICBnZXQoX3Byb3h5VGFyZ2V0LCBwcm9wLCBfcmVjZWl2ZXIpIHtcbiAgICAgIC8vIDEuIEludGVybmFsIHN5bWJvbHMgKGNoZWNrIGJlZm9yZSBvdGhlciBzeW1ib2xzKVxuICAgICAgaWYgKHByb3AgPT09IElTX1RZUEVEX1NDT1BFKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChwcm9wID09PSBCUkVBS19TRVRURVIpIHtcbiAgICAgICAgcmV0dXJuIChmbjogKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICAgIHN0YXRlLmJyZWFrRm4gPSBmbjtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gU3ltYm9sIHByb3BlcnRpZXMgKGd1YXJkICsgaW5zcGVjdGlvbilcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHVUFSRF9QUk9QUywgcHJvcCkpIHJldHVybiBHVUFSRF9QUk9QU1twcm9wXTtcbiAgICAgICAgLy8gTm9kZS5qcyB1dGlsLmluc3BlY3Qg4oCUIHNob3cgc3RhdGUgc25hcHNob3QsIG5vdCBwcm94eSBpbnRlcm5hbHNcbiAgICAgICAgaWYgKHByb3AgPT09IFN5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJykpIHtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LmdldFZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gMy4gU3RyaW5nIGd1YXJkIHByb3BlcnRpZXNcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoR1VBUkRfUFJPUFMsIHByb3ApKSByZXR1cm4gR1VBUkRfUFJPUFNbcHJvcF07XG5cbiAgICAgIC8vIDQuICQtcHJlZml4ZWQgbWV0aG9kcyAtLSByb3V0ZSB0byBmYWNhZGVcbiAgICAgIGlmIChTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKHByb3ApKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlciA9IE1FVEhPRF9ST1VURVNbcHJvcF07XG4gICAgICAgIGlmIChyb3V0ZXIpIHJldHVybiByb3V0ZXIodGFyZ2V0LCBzdGF0ZSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIDUuIEV4ZWN1dG9yLWludGVybmFsIG1ldGhvZCBwYXNzLXRocm91Z2ggKGV4cGxpY2l0IGFsbG93bGlzdClcbiAgICAgIC8vICAgIEZsb3dDaGFydEV4ZWN1dG9yIHdyYXBwaW5nIGNhbGxzIGF0dGFjaFNjb3BlUmVjb3JkZXIsIG5vdGlmeVN0YWdlU3RhcnQsIGV0Yy5cbiAgICAgIC8vICAgIGRpcmVjdGx5IG9uIHRoZSBzY29wZS4gRm9yd2FyZCBvbmx5IGFsbG93bGlzdGVkIG1ldGhvZHMuXG4gICAgICBpZiAoRVhFQ1VUT1JfSU5URVJOQUxfTUVUSE9EUy5oYXMocHJvcCkgJiYgdHlwZW9mICh0YXJnZXQgYXMgYW55KVtwcm9wXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBhbnkpW3Byb3BdLmJpbmQodGFyZ2V0KTtcbiAgICAgIH1cblxuICAgICAgLy8gNi4gU3RhdGUga2V5IC0tIGNhbGwgZ2V0VmFsdWUgKGZpcmVzIG9uUmVhZCBPTkNFKVxuICAgICAgY29uc3QgdmFsdWUgPSB0YXJnZXQuZ2V0VmFsdWUocHJvcCk7XG5cbiAgICAgIC8vIFByaW1pdGl2ZSBvciBudWxsL3VuZGVmaW5lZCAtLSByZXR1cm4gYXMtaXNcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyBOb24td3JhcHBhYmxlIChEYXRlLCBNYXAsIGNsYXNzIGluc3RhbmNlLCBldGMuKSAtLSByZXR1cm4gdW53cmFwcGVkXG4gICAgICBpZiAoIXNob3VsZFdyYXBXaXRoUHJveHkodmFsdWUpKSByZXR1cm4gdmFsdWU7XG5cbiAgICAgIC8vIEFycmF5IC0tIHJldHVybiBhcnJheSBwcm94eSAoY2FjaGVkIGZvciBpZGVudGl0eSBlcXVhbGl0eSlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBjb25zdCBjYWNoZWQgPSBzdGF0ZS5jaGlsZENhY2hlLmdldChwcm9wKTtcbiAgICAgICAgaWYgKGNhY2hlZCAmJiBjYWNoZWQucmVmID09PSB2YWx1ZSkgcmV0dXJuIGNhY2hlZC5wcm94eTtcblxuICAgICAgICBjb25zdCBhcnJQcm94eSA9IGNyZWF0ZUFycmF5UHJveHkoXG4gICAgICAgICAgKCkgPT4gKHJlYWRTaWxlbnQocHJvcCkgYXMgdW5rbm93bltdKSA/PyBbXSxcbiAgICAgICAgICAobmV3QXJyKSA9PiB7XG4gICAgICAgICAgICB0YXJnZXQuc2V0VmFsdWUocHJvcCwgdW53cmFwUHJveHkobmV3QXJyKSk7XG4gICAgICAgICAgICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShwcm9wKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICBzdGF0ZS5jaGlsZENhY2hlLnNldChwcm9wLCB7IHJlZjogdmFsdWUgYXMgb2JqZWN0LCBwcm94eTogYXJyUHJveHkgYXMgdW5rbm93biBhcyBvYmplY3QgfSk7XG4gICAgICAgIHJldHVybiBhcnJQcm94eTtcbiAgICAgIH1cblxuICAgICAgLy8gUGxhaW4gb2JqZWN0IC0tIHJldHVybiBuZXN0ZWQgcHJveHkgKGNhY2hlZCBmb3IgaWRlbnRpdHkgZXF1YWxpdHkpXG4gICAgICBjb25zdCBjYWNoZWQgPSBzdGF0ZS5jaGlsZENhY2hlLmdldChwcm9wKTtcbiAgICAgIGlmIChjYWNoZWQgJiYgY2FjaGVkLnJlZiA9PT0gdmFsdWUpIHJldHVybiBjYWNoZWQucHJveHk7XG5cbiAgICAgIGNvbnN0IG5lc3RlZCA9IGNyZWF0ZU5lc3RlZFByb3h5KFxuICAgICAgICB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgcHJvcCxcbiAgICAgICAgW10sXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgcmVhZFNpbGVudCxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIG5ldyBTZXQ8b2JqZWN0PihbdmFsdWUgYXMgb2JqZWN0XSksIC8vIHNlZWQgYW5jZXN0b3Igc2V0IHdpdGggcm9vdCBvYmplY3RcbiAgICAgICk7XG4gICAgICBzdGF0ZS5jaGlsZENhY2hlLnNldChwcm9wLCB7IHJlZjogdmFsdWUgYXMgb2JqZWN0LCBwcm94eTogbmVzdGVkIGFzIG9iamVjdCB9KTtcbiAgICAgIHJldHVybiBuZXN0ZWQ7XG4gICAgfSxcblxuICAgIHNldChfcHJveHlUYXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKHByb3ApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHNldCBzdGF0ZSBrZXkgXCIke3Byb3B9XCIgLS0gaXQgY29uZmxpY3RzIHdpdGggYSByZXNlcnZlZCBUeXBlZFNjb3BlIG1ldGhvZC4gUmVuYW1lIHRoZSBzdGF0ZSBrZXkgdG8gYXZvaWQgJC1wcmVmaXhlZCBuYW1lcy5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gVW53cmFwIFByb3h5IHZhbHVlcyBiZWZvcmUgc3RvcmluZyDigJQgc3RydWN0dXJlZENsb25lIGluIFRyYW5zYWN0aW9uQnVmZmVyXG4gICAgICAvLyBjYW5ub3QgY2xvbmUgUHJveHkgb2JqZWN0cy4gVGhpcyBoYW5kbGVzOiBzY29wZS5iYWNrdXAgPSBzY29wZS5jdXN0b21lclxuICAgICAgY29uc3QgdW53cmFwcGVkID0gdW53cmFwUHJveHkodmFsdWUpO1xuICAgICAgdGFyZ2V0LnNldFZhbHVlKHByb3AsIHVud3JhcHBlZCk7XG4gICAgICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShwcm9wKTsgLy8gaW52YWxpZGF0ZSBjYWNoZVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIGRlbGV0ZVByb3BlcnR5KF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykgcmV0dXJuIHRydWU7XG4gICAgICB0YXJnZXQuZGVsZXRlVmFsdWUocHJvcCk7XG4gICAgICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShwcm9wKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBoYXMoX3Byb3h5VGFyZ2V0LCBwcm9wKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdVQVJEX1BST1BTLCBwcm9wKTtcbiAgICAgIGlmIChTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKHByb3ApKSByZXR1cm4gdHJ1ZTtcbiAgICAgIC8vIFVzZSBub24tdHJhY2tpbmcgaGFzS2V5IGlmIGF2YWlsYWJsZSwgZWxzZSBmYWxsYmFjayB0byBnZXRTdGF0ZUtleXNcbiAgICAgIGlmICh0YXJnZXQuaGFzS2V5KSByZXR1cm4gdGFyZ2V0Lmhhc0tleShwcm9wKTtcbiAgICAgIGlmICh0YXJnZXQuZ2V0U3RhdGVLZXlzKSByZXR1cm4gdGFyZ2V0LmdldFN0YXRlS2V5cygpLmluY2x1ZGVzKHByb3ApO1xuICAgICAgLy8gRmFsbGJhY2s6IGdldFZhbHVlIGZpcmVzIG9uUmVhZCAoYWNjZXB0YWJsZSBkZWdyYWRhdGlvbilcbiAgICAgIHJldHVybiB0YXJnZXQuZ2V0VmFsdWUocHJvcCkgIT09IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgb3duS2V5cygpIHtcbiAgICAgIC8vIFVzZSBub24tdHJhY2tpbmcgZ2V0U3RhdGVLZXlzIGlmIGF2YWlsYWJsZSwgZWxzZSBmYWxsYmFja1xuICAgICAgaWYgKHRhcmdldC5nZXRTdGF0ZUtleXMpIHJldHVybiB0YXJnZXQuZ2V0U3RhdGVLZXlzKCk7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IHRhcmdldC5nZXRWYWx1ZSgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFzbmFwc2hvdCB8fCB0eXBlb2Ygc25hcHNob3QgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoc25hcHNob3QpO1xuICAgIH0sXG5cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX3Byb3h5VGFyZ2V0LCBwcm9wKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgaWYgKFNDT1BFX01FVEhPRF9OQU1FUy5oYXMocHJvcCkpIHJldHVybiB1bmRlZmluZWQ7IC8vICQtbWV0aG9kcyBhcmUgbm9uLWVudW1lcmFibGVcbiAgICAgIC8vIENoZWNrIGV4aXN0ZW5jZSB3aXRob3V0IGZpcmluZyBvblJlYWQg4oCUIG5vIGdldFZhbHVlIGNhbGwgaGVyZVxuICAgICAgY29uc3QgZXhpc3RzID0gdGFyZ2V0Lmhhc0tleVxuICAgICAgICA/IHRhcmdldC5oYXNLZXkocHJvcClcbiAgICAgICAgOiB0YXJnZXQuZ2V0U3RhdGVLZXlzXG4gICAgICAgID8gdGFyZ2V0LmdldFN0YXRlS2V5cygpLmluY2x1ZGVzKHByb3ApXG4gICAgICAgIDogdGFyZ2V0LmdldFZhbHVlKHByb3ApICE9PSB1bmRlZmluZWQ7IC8vIGZhbGxiYWNrIG9ubHlcbiAgICAgIGlmICghZXhpc3RzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgLy8gUmV0dXJuIGEgbWluaW1hbCBkZXNjcmlwdG9yIOKAlCBhY3R1YWwgdmFsdWUgaXMgZmV0Y2hlZCB2aWEgdGhlIGdldCB0cmFwXG4gICAgICByZXR1cm4geyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH07XG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIHByb3h5O1xufVxuIl19
@@ -22,9 +22,9 @@ export const SCOPE_METHOD_NAMES = new Set([
22
22
  '$error',
23
23
  '$metric',
24
24
  '$eval',
25
- '$attachRecorder',
26
- '$detachRecorder',
27
- '$getRecorders',
25
+ '$attachScopeRecorder',
26
+ '$detachScopeRecorder',
27
+ '$getScopeRecorders',
28
28
  '$batchArray',
29
29
  '$break',
30
30
  '$emit',
@@ -48,10 +48,10 @@ export const EXECUTOR_INTERNAL_METHODS = new Set([
48
48
  'notifyStageStart', // StageRunner.run() line 59
49
49
  'notifyStageEnd', // StageRunner.run() line 79
50
50
  'notifyPause', // StageRunner.run() — pause detection
51
- 'attachRecorder', // FlowChartExecutor.createTraverser() — narrative + user recorders
52
- 'detachRecorder', // FlowChartExecutor.detachRecorder()
53
- 'getRecorders', // FlowChartExecutor.getRecorders()
51
+ 'attachScopeRecorder', // FlowChartExecutor.createTraverser() — narrative + user recorders
52
+ 'detachScopeRecorder', // FlowChartExecutor.detachScopeRecorder()
53
+ 'getScopeRecorders', // FlowChartExecutor.getScopeRecorders()
54
54
  'useSharedRedactedKeys', // FlowChartExecutor.createTraverser() — redaction wrapping
55
55
  'useRedactionPolicy', // FlowChartExecutor.createTraverser() — redaction wrapping
56
56
  ]);
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlYWN0aXZlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBMFBILCtFQUErRTtBQUMvRSx1RUFBdUU7QUFFdkUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQVM7SUFDaEQsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2YsYUFBYTtJQUNiLFFBQVE7SUFDUixPQUFPO0lBQ1AscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixRQUFRO0NBQ1QsQ0FBQyxDQUFDO0FBRUgsK0VBQStFO0FBQy9FLGdFQUFnRTtBQUNoRSxxRUFBcUU7QUFFckUsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBRWxFLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UsK0NBQStDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUV4RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFFMUUsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDL0Msa0JBQWtCLEVBQUUsNEJBQTRCO0lBQ2hELGdCQUFnQixFQUFFLDRCQUE0QjtJQUM5QyxhQUFhLEVBQUUsc0NBQXNDO0lBQ3JELGdCQUFnQixFQUFFLG1FQUFtRTtJQUNyRixnQkFBZ0IsRUFBRSxxQ0FBcUM7SUFDdkQsY0FBYyxFQUFFLG1DQUFtQztJQUNuRCx1QkFBdUIsRUFBRSwyREFBMkQ7SUFDcEYsb0JBQW9CLEVBQUUsMkRBQTJEO0NBQ2xGLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVhY3RpdmUvdHlwZXMgLS0gVHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIFR5cGVkU2NvcGU8VD4gcmVhY3RpdmUgcHJveHkgc3lzdGVtLlxuICpcbiAqIFR5cGVkU2NvcGU8VD4gd3JhcHMgYSBSZWFjdGl2ZVRhcmdldCAoU2NvcGVGYWNhZGUpIGluIGEgUHJveHkgdGhhdCBwcm92aWRlc1xuICogdHlwZWQgcHJvcGVydHkgYWNjZXNzLiBBbGwgc2NvcGUgaW5mcmFzdHJ1Y3R1cmUgbWV0aG9kcyBhcmUgJC1wcmVmaXhlZCB0b1xuICogYXZvaWQgY29sbGlzaW9ucyB3aXRoIHVzZXIgc3RhdGUga2V5cy5cbiAqXG4gKiBEZXBlbmRlbmN5OiB0eXBlLW9ubHkgaW1wb3J0cyBmcm9tIGVuZ2luZS8gYW5kIHNjb3BlLyAoemVybyBydW50aW1lIGNvc3QpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uRW52IH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkZXIgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5cbi8vIC0tIFJlYWN0aXZlVGFyZ2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1pbmltdW0gcHJvdG9jb2wgcmVxdWlyZWQgYnkgVHlwZWRTY29wZSAtLSBhIGN1cmF0ZWQgc3Vic2V0IG9mIFNjb3BlRmFjYWRlJ3Ncbi8vIHB1YmxpYyBBUEkuIE5vdCBhIGZ1bGwgbWlycm9yOiBleGNsdWRlcyBpbnRlcm5hbC9yZWRhY3Rpb24gbWV0aG9kcyB0aGF0IGFyZVxuLy8gaGFuZGxlZCBhdCB0aGUgZXhlY3V0b3IgbGV2ZWwgKHVzZVJlZGFjdGlvblBvbGljeSwgdXNlU2hhcmVkUmVkYWN0ZWRLZXlzLCBldGMuKVxuLy8gYW5kIGluZnJhc3RydWN0dXJlIG1ldGhvZHMgKGdldFBpcGVsaW5lSWQsIHNldEdsb2JhbCwgZ2V0R2xvYmFsLCBldGMuKS5cblxuZXhwb3J0IGludGVyZmFjZSBSZWFjdGl2ZVRhcmdldCB7XG4gIC8vIFN0YXRlIGFjY2VzcyAodHJhY2tlZCBieSByZWNvcmRlcnMpXG4gIGdldFZhbHVlKGtleT86IHN0cmluZyk6IHVua25vd247XG4gIHNldFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICB1cGRhdGVWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbiAgZGVsZXRlVmFsdWUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcblxuICAvLyBOb24tdHJhY2tpbmcgc3RhdGUgaW5zcGVjdGlvbiAoZm9yIHByb3h5IGludGVybmFscyDigJQgbm8gcmVjb3JkZXIgZGlzcGF0Y2gpXG4gIC8qKiBSZXR1cm5zIGFsbCBzdGF0ZSBrZXlzIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBvd25LZXlzL2hhcyB0cmFwcy4gKi9cbiAgZ2V0U3RhdGVLZXlzPygpOiBzdHJpbmdbXTtcbiAgLyoqIENoZWNrIGtleSBleGlzdGVuY2Ugd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGhhcyB0cmFwLiAqL1xuICBoYXNLZXk/KGtleTogc3RyaW5nKTogYm9vbGVhbjtcbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGFycmF5IHByb3h5IGdldEN1cnJlbnQoKS4gKi9cbiAgZ2V0VmFsdWVTaWxlbnQ/KGtleT86IHN0cmluZyk6IHVua25vd247XG5cbiAgLy8gSW5wdXQgJiBlbnZpcm9ubWVudCAocmVhZG9ubHksIE5PVCB0cmFja2VkKVxuICBnZXRBcmdzPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTogVDtcbiAgZ2V0RW52KCk6IFJlYWRvbmx5PEV4ZWN1dGlvbkVudj47XG5cbiAgLy8gUmVjb3JkZXIgbWFuYWdlbWVudFxuICBhdHRhY2hSZWNvcmRlcihyZWNvcmRlcjogUmVjb3JkZXIpOiB2b2lkO1xuICBkZXRhY2hSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkO1xuICBnZXRSZWNvcmRlcnMoKTogUmVjb3JkZXJbXTtcblxuICAvLyBEaWFnbm9zdGljc1xuICBhZGREZWJ1Z0luZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgYWRkRGVidWdNZXNzYWdlKHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgYWRkRXJyb3JJbmZvKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gIGFkZE1ldHJpYyhuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgYWRkRXZhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcblxuICAvLyBFbWl0IGNoYW5uZWwgKFBoYXNlIDMpIOKAlCBzdHJ1Y3R1cmVkIHVzZXItYXV0aG9yZWQgZXZlbnRzIHRvIEVtaXRSZWNvcmRlcnMuXG4gIGVtaXRFdmVudChuYW1lOiBzdHJpbmcsIHBheWxvYWQ/OiB1bmtub3duKTogdm9pZDtcblxuICAvLyBEZXRhY2ggKFQ0KSDigJQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydHMuIFNjb3BlRmFjYWRlXG4gIC8vIGRlbGVnYXRlcyB0byBgZGV0YWNoL3NwYXduYCwgbWludGluZyByZWZJZHMgZnJvbSB0aGlzIHN0YWdlJ3NcbiAgLy8gcnVudGltZVN0YWdlSWQgZm9yIGRpYWdub3N0aWMgY29ycmVsYXRpb24uXG4gIGRldGFjaEFuZEpvaW5MYXRlcihcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaEhhbmRsZTtcblxuICBkZXRhY2hBbmRGb3JnZXQoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogdm9pZDtcbn1cblxuLy8gLS0gU2NvcGVNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gJC1wcmVmaXhlZCBlc2NhcGUgaGF0Y2hlcy4gTm9uLWVudW1lcmFibGUgb24gdGhlIHByb3h5IC0tIGRvbid0IGFwcGVhciBpblxuLy8gT2JqZWN0LmtleXMoKSwgZGVzdHJ1Y3R1cmluZywgb3IgZm9yLi4uaW4uIE9ubHkgc3RhdGUga2V5cyBhcmUgdmlzaWJsZS5cblxuZXhwb3J0IGludGVyZmFjZSBTY29wZU1ldGhvZHMge1xuICAvLyBTdGF0ZSAodW50eXBlZCBlc2NhcGUgaGF0Y2ggLS0gZm9yIGR5bmFtaWMga2V5cywgcmVkYWN0aW9uLCBkZXNjcmlwdGlvbilcbiAgJGdldFZhbHVlKGtleTogc3RyaW5nKTogdW5rbm93bjtcbiAgJHNldFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICAkdXBkYXRlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICAkZGVsZXRlKGtleTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQ7XG4gIC8qKiBQcm94eS1zeW50aGVzaXplZDogY2FsbHMgZ2V0VmFsdWUocm9vdEtleSkgdGhlbiBsb2Rhc2guZ2V0IGZvciBuZXN0ZWQgcGF0aC4gTm90IGEgZGlyZWN0IGRlbGVnYXRpb24uICovXG4gICRyZWFkKGRvdFBhdGg6IHN0cmluZyk6IHVua25vd247XG5cbiAgLy8gSW5wdXQgJiBlbnZpcm9ubWVudCAocmVhZG9ubHkpXG4gICRnZXRBcmdzPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTogVDtcbiAgJGdldEVudigpOiBSZWFkb25seTxFeGVjdXRpb25FbnY+O1xuXG4gIC8vIE9ic2VydmFiaWxpdHkg4oCUIGxlZ2FjeSBkaWFnbm9zdGljIHByaW1pdGl2ZXMuXG4gIC8vXG4gIC8vIEFzIG9mIFBoYXNlIDMgdGhlc2UgQUxTTyBkaXNwYXRjaCBvbiB0aGUgZW1pdCBjaGFubmVsIChpbiBhZGRpdGlvbiB0b1xuICAvLyB0aGVpciBleGlzdGluZyBgRGlhZ25vc3RpY0NvbGxlY3RvcmAgc2lkZS1iYWcgd3JpdGVzIGZvciBzbmFwc2hvdFxuICAvLyBpbmNsdXNpb24pLiBBbnkgYXR0YWNoZWQgYEVtaXRSZWNvcmRlcmAgd2lsbCBzZWUgdGhlc2UgZXZlbnRzIHdpdGhcbiAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXNwYWNlZCBuYW1lczpcbiAgLy9cbiAgLy8gICAkZGVidWcoa2V5LCB2YWx1ZSkgICAgLT4gZW1pdHMgYGxvZy5kZWJ1Zy4ke2tleX1gXG4gIC8vICAgJGVycm9yKGtleSwgdmFsdWUpICAgIC0+IGVtaXRzIGBsb2cuZXJyb3IuJHtrZXl9YFxuICAvLyAgICRtZXRyaWMobmFtZSwgdmFsdWUpICAtPiBlbWl0cyBgbWV0cmljLiR7bmFtZX1gXG4gIC8vICAgJGV2YWwgKG5hbWUsIHZhbHVlKSAgIC0+IGVtaXRzIGBldmFsLiR7bmFtZX1gXG4gIC8vICAgJGxvZyh2YWx1ZSkgICAgICAgICAgIC0+IGVtaXRzIGBsb2cuZGVidWcubWVzc2FnZXNgXG4gIC8vXG4gIC8vIFRoaXMgbWFrZXMgdGhlIGNhbGxzIG9ic2VydmFibGUgaW4gcmVhbCB0aW1lIOKAlCBubyBsb3NzIG9mIGJhY2t3YXJkXG4gIC8vIGNvbXBhdDsgdGhlIHNpZGUgYmFnIGNvbnRpbnVlcyB0byBwb3B1bGF0ZSBmb3IgY29uc3VtZXJzIHRoYXQgaW5zcGVjdFxuICAvLyB0aGUgc25hcHNob3QgZGlyZWN0bHkuXG4gICRkZWJ1ZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICAkbG9nKHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgJGVycm9yKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gICRtZXRyaWMobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gICRldmFsKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuXG4gIC8vIFJlY29yZGVyIG1hbmFnZW1lbnRcbiAgJGF0dGFjaFJlY29yZGVyKHJlY29yZGVyOiBSZWNvcmRlcik6IHZvaWQ7XG4gICRkZXRhY2hSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkO1xuICAkZ2V0UmVjb3JkZXJzKCk6IFJlY29yZGVyW107XG5cbiAgLyoqXG4gICAqIEJhdGNoLW11dGF0ZSBhbiBhcnJheSBrZXkgaW4gYSBzaW5nbGUgY2xvbmUrd3JpdGUgY3ljbGUuXG4gICAqXG4gICAqIEV2ZXJ5IGBzY29wZS5pdGVtcy5wdXNoKHgpYCBjbG9uZXMgdGhlIGVudGlyZSBhcnJheSBhbmQgY29tbWl0cyBpdCDigJQgTyhOKSBwZXIgY2FsbC5cbiAgICogRm9yIE4gbXV0YXRpb25zIG9uIGFuIE0tbGVuZ3RoIGFycmF5IHRoYXQgaXMgTyhOw5dNKS4gVXNlIGAkYmF0Y2hBcnJheWAgdG8gY2xvbmUgb25jZSxcbiAgICogYXBwbHkgYWxsIG11dGF0aW9ucyBpbnNpZGUgYGZuYCwgdGhlbiBjb21taXQgb25jZSDigJQgTyhNKSB0b3RhbC5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBCZWZvcmU6IDEwMDAgY2xvbmVzIMOXIGdyb3dpbmcgYXJyYXkgPSBPKE7CsilcbiAgICogZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHNjb3BlLml0ZW1zLnB1c2goaSk7XG4gICAqXG4gICAqIC8vIEFmdGVyOiAxIGNsb25lICsgMSBjb21taXQgPSBPKE4pXG4gICAqIHNjb3BlLiRiYXRjaEFycmF5KCdpdGVtcycsIChhcnIpID0+IHtcbiAgICogICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykgYXJyLnB1c2goaSk7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogYGZuYCByZWNlaXZlcyBhIHBsYWluIChub24tcHJveHkpIG11dGFibGUgKipzaGFsbG93IGNvcHkqKiBvZiB0aGUgY3VycmVudCBhcnJheS5cbiAgICogVGhlIGFycmF5IGl0c2VsZiBpcyBhIG5ldyBpbnN0YW5jZSwgYnV0IG9iamVjdCByZWZlcmVuY2VzIGluc2lkZSBpdCBhcmUgc2hhcmVkIHdpdGhcbiAgICogdGhlIG9yaWdpbmFsIHN0YXRlIOKAlCBtdXRhdGlvbnMgdG8gbmVzdGVkIG9iamVjdHMgaW5zaWRlIGBmbmAgYWZmZWN0IHRob3NlIG9yaWdpbmFscy5cbiAgICogT25seSBwdXNoL3BvcC9zb3J0L3NwbGljZSBhbmQgb3RoZXIgb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYXJyYXkncyBvd24gc2xvdHMgYXJlXG4gICAqIHNhZmVseSBpc29sYXRlZC5cbiAgICpcbiAgICogTXV0YXRpb25zIGluc2lkZSBgZm5gIGFyZSBOT1QgdHJhY2tlZCBpbmRpdmlkdWFsbHkg4oCUIG9ubHkgdGhlIGZpbmFsIGNvbW1pdHRlZCBhcnJheVxuICAgKiBhcHBlYXJzIGluIHRoZSBuYXJyYXRpdmUgYXMgYSBzaW5nbGUgd3JpdGUuIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFuXG4gICAqIGFycmF5LCBgZm5gIHJlY2VpdmVzIGFuIGVtcHR5IGFycmF5IGFuZCB0aGUgcmVzdWx0IGlzIGNvbW1pdHRlZCBhcyB0aGUgbmV3IHZhbHVlLlxuICAgKlxuICAgKiBJZiBgZm5gIHRocm93cywgYHNldFZhbHVlYCBpcyBuZXZlciBjYWxsZWQgYW5kIHN0YXRlIHJlbWFpbnMgdW5jaGFuZ2VkIChhdG9taWMgb25cbiAgICogZXJyb3IpLiBUaGUgZXhjZXB0aW9uIHByb3BhZ2F0ZXMgdG8gdGhlIGNhbGxlci5cbiAgICpcbiAgICogYGtleWAgaXMgdW50eXBlZCAoYHN0cmluZ2ApIOKAlCBUeXBlU2NyaXB0IHdpbGwgbm90IGNhdGNoIHR5cG9zLiBgYXJyYCBpcyB0eXBlZCBhc1xuICAgKiBgdW5rbm93bltdYCBiZWNhdXNlIGBTY29wZU1ldGhvZHNgIGlzIG5vdCBwYXJhbWV0ZXJpemVkIGJ5IGBUYDsgY2FzdCBpbnNpZGUgYGZuYFxuICAgKiB3aGVuIGVsZW1lbnQgdHlwZXMgYXJlIGtub3duOiBgKGFyciBhcyBzdHJpbmdbXSkucHVzaCh4KWAuXG4gICAqL1xuICAkYmF0Y2hBcnJheShrZXk6IHN0cmluZywgZm46IChhcnI6IHVua25vd25bXSkgPT4gdm9pZCk6IHZvaWQ7XG5cbiAgLy8gT2JzZXJ2YWJpbGl0eSDigJQgRW1pdCBjaGFubmVsIChQaGFzZSAzKVxuICAvKipcbiAgICogRmlyZSBhIHN0cnVjdHVyZWQgZXZlbnQgdG8gZXZlcnkgYXR0YWNoZWQgcmVjb3JkZXIgaW1wbGVtZW50aW5nXG4gICAqIGBvbkVtaXRgLiBUaGUgcHJpbWFyeSBwcmltaXRpdmUgZm9yIGNvbnN1bWVyLWF1dGhvcmVkIG9ic2VydmFiaWxpdHlcbiAgICogZXZlbnRzIChMTE0gdG9rZW5zLCBiaWxsaW5nIG1ldHJpY3MsIGRvbWFpbiBtaWxlc3RvbmVzLCBldGMuKSB0aGF0XG4gICAqIHNob3VsZG4ndCBsaXZlIGluIHNjb3BlIHN0YXRlLlxuICAgKlxuICAgKiBTeW5jaHJvbm91cywgcGFzcy10aHJvdWdoIOKAlCBkZWxpdmVyZWQgdG8gcmVjb3JkZXJzIGltbWVkaWF0ZWx5LCBpblxuICAgKiBjYWxsIG9yZGVyLiBaZXJvLWFsbG9jYXRpb24gd2hlbiBubyByZWNvcmRlcnMgYXJlIGF0dGFjaGVkLlxuICAgKlxuICAgKiAjIyBOYW1pbmcgY29udmVudGlvblxuICAgKlxuICAgKiBVc2UgaGllcmFyY2hpY2FsIGRvdHRlZCBuYW1lczogYCc8bmFtZXNwYWNlPi48Y2F0ZWdvcnk+LjxldmVudD4nYC5cbiAgICogRXhhbXBsZXM6XG4gICAqICAgLSBgJ2FnZW50Zm9vdHByaW50LmxsbS50b2tlbnMnYFxuICAgKiAgIC0gYCdteWFwcC5iaWxsaW5nLnNwZW5kJ2BcbiAgICogICAtIGAnYXV0aC5jaGVjay5kZW5pZWQnYFxuICAgKlxuICAgKiBUaGUgbGlicmFyeSBzdGF5cyB2b2NhYnVsYXJ5LWFnbm9zdGljIOKAlCBubyBjZW50cmFsIHJlZ2lzdHJ5LCBub1xuICAgKiByZXNlcnZlZCBwcmVmaXhlcy4gTmFtZXNwYWNlIHByZWZpeGVzIHByZXZlbnQgY29sbGlzaW9ucyBhY3Jvc3NcbiAgICogbGlicmFyaWVzIGFuZCBhcHBzIG5hdHVyYWxseS5cbiAgICpcbiAgICogIyMgUmVkYWN0aW9uXG4gICAqXG4gICAqIElmIGBSZWRhY3Rpb25Qb2xpY3kuZW1pdFBhdHRlcm5zYCBtYXRjaGVzIHRoZSBuYW1lLCB0aGUgcGF5bG9hZCBpc1xuICAgKiByZXBsYWNlZCB3aXRoIGAnW1JFREFDVEVEXSdgIGJlZm9yZSBkaXNwYXRjaC4gTm8gcmVjb3JkZXIgZXZlciBzZWVzXG4gICAqIHRoZSByYXcgdmFsdWUgZm9yIHJlZGFjdGVkIGV2ZW50IG5hbWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIENvbnN1bWVyLWNob3NlbiBldmVudCBpZGVudGlmaWVyIChzZWUgbmFtaW5nIGNvbnZlbnRpb24pLlxuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFN0cnVjdHVyZWQgZGF0YSB0byBhdHRhY2guIFNoYXBlIGlzIHVwIHRvIHRoZVxuICAgKiAgIGNvbnN1bWVyOyBsaWJyYXJ5IHRyZWF0cyBpdCBhcyBvcGFxdWUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogc2NvcGUuJGVtaXQoJ2FnZW50Zm9vdHByaW50LmxsbS50b2tlbnMnLCB7IGlucHV0OiAxMDAsIG91dHB1dDogNTAgfSk7XG4gICAqIHNjb3BlLiRlbWl0KCdteWFwcC5kZWNpc2lvbicsIHsgYnJhbmNoOiAnYXBwcm92ZWQnLCBjb25maWRlbmNlOiAwLjkyIH0pO1xuICAgKiBgYGBcbiAgICovXG4gICRlbWl0KG5hbWU6IHN0cmluZywgcGF5bG9hZD86IHVua25vd24pOiB2b2lkO1xuXG4gIC8vIERldGFjaCDigJQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydCBleGVjdXRpb24uXG4gIC8vXG4gIC8vIGAkZGV0YWNoQW5kSm9pbkxhdGVyKGRyaXZlciwgY2hpbGQsIGlucHV0PylgIHNjaGVkdWxlcyB0aGUgY2hpbGQgdmlhXG4gIC8vIHRoZSBnaXZlbiBkcml2ZXIgYW5kIHJldHVybnMgYSBgRGV0YWNoSGFuZGxlYCB0aGUgY29uc3VtZXIgY2FuIHJlYWRcbiAgLy8gc3luY2hyb25vdXNseSAoYC5zdGF0dXNgKSBvciBhd2FpdCAoYC53YWl0KClgKS4gVGhlIHBhcmVudCBzdGFnZVxuICAvLyBkb2VzIE5PVCBibG9jayBvbiB0aGUgY2hpbGQg4oCUIGl0IHJldHVybnMgdG8gdGhlIGFnZW50IGxvb3AgdGhlXG4gIC8vIG1vbWVudCB0aGUgZHJpdmVyJ3MgYHNjaGVkdWxlKClgIHJldHVybnMgKHBhc3NpdmUgcmVjb3JkZXIgcnVsZSkuXG4gIC8vXG4gIC8vIGAkZGV0YWNoQW5kRm9yZ2V0KGRyaXZlciwgY2hpbGQsIGlucHV0PylgIGRpc2NhcmRzIHRoZSBoYW5kbGUg4oCUXG4gIC8vIHVzZWZ1bCBmb3IgZmlyZS1hbmQtZm9yZ2V0IHRlbGVtZXRyeSB3aGVyZSB0aGUgY2FsbGVyIG5ldmVyIG5lZWRzXG4gIC8vIHRvIGtub3cgaG93IHRoZSBjaGlsZCBmaW5pc2hlZC4gRXJyb3JzIHN0aWxsIGxhbmQgb24gdGhlIChub3ctXG4gIC8vIGRyb3BwZWQpIGhhbmRsZSBhbmQgZ28gc2lsZW50IHVubGVzcyBhbiBvYnNlcnZlciBzdXJmYWNlcyB0aGVtLlxuICAvL1xuICAvLyBEcml2ZXIgaXMgUkVRVUlSRUQg4oCUIHRoZXJlJ3Mgbm8gbGlicmFyeS1kZWZhdWx0LiBQYXNzIGUuZy5cbiAgLy8gYG1pY3JvdGFza0JhdGNoRHJpdmVyYCAoZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJykgb3IgeW91ciBvd25cbiAgLy8gY3VzdG9tIGRyaXZlci4gRXhwbGljaXQgcGFzc2luZyBhdm9pZHMgZ2xvYmFsIHN0YXRlIGFuZCBrZWVwcyB0aGVcbiAgLy8gZW5naW5lIGZyZWUgb2YgZHJpdmVyIGltcG9ydHMuXG4gICRkZXRhY2hBbmRKb2luTGF0ZXIoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hIYW5kbGU7XG5cbiAgJGRldGFjaEFuZEZvcmdldChcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiB2b2lkO1xuXG4gIC8vIFBpcGVsaW5lIGNvbnRyb2xcbiAgLyoqXG4gICAqIFN0b3AgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGNvbnRleHQuXG4gICAqXG4gICAqIC0gKipJbiBhIHRvcC1sZXZlbCBjaGFydDoqKiB0aGUgdHJhdmVyc2VyIGV4aXRzIGNsZWFubHkgYWZ0ZXIgdGhpcyBzdGFnZVxuICAgKiAgIGNvbXBsZXRlcy5cbiAgICogLSAqKkluc2lkZSBhIHN1YmZsb3c6KiogYnkgZGVmYXVsdCwgb25seSB0aGUgc3ViZmxvdydzIG93biBleGVjdXRpb25cbiAgICogICBzdG9wczsgY29udHJvbCByZXR1cm5zIHRvIHRoZSBwYXJlbnQgYXMgbm9ybWFsLiBJZiB0aGUgc3ViZmxvdyBpc1xuICAgKiAgIG1vdW50ZWQgd2l0aCBgcHJvcGFnYXRlQnJlYWs6IHRydWVgLCB0aGUgYnJlYWsgc2lnbmFsIChhbmQgaXRzXG4gICAqICAgb3B0aW9uYWwgcmVhc29uKSBwcm9wYWdhdGVzIHVwIHRvIHRoZSBwYXJlbnQgc2NvcGUsIHRlcm1pbmF0aW5nIHRoZVxuICAgKiAgIG91dGVyIGxvb3AgdG9vLiBTZWUgYFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWtgLlxuICAgKlxuICAgKiBAcGFyYW0gcmVhc29uIC0gT3B0aW9uYWwgZnJlZS1mb3JtIHN0cmluZyBkZXNjcmliaW5nIHdoeSB0aGUgYnJlYWtcbiAgICogICBoYXBwZW5lZC4gUHJvcGFnYXRlcyB0byBgRmxvd0JyZWFrRXZlbnQucmVhc29uYCBzbyByZWNvcmRlcnMgYW5kXG4gICAqICAgY3VzdG9tIG5hcnJhdGl2ZXMgY2FuIHN1cmZhY2UgaXQuIERlZmF1bHRzIHRvIHVuZGVmaW5lZC5cbiAgICovXG4gICRicmVhayhyZWFzb24/OiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8vIEVzY2FwZSBoYXRjaCAtLSB1bndyYXAgdG8gdW5kZXJseWluZyBSZWFjdGl2ZVRhcmdldFxuICAkdG9SYXcoKTogUmVhY3RpdmVUYXJnZXQ7XG59XG5cbi8vIC0tIFR5cGVkU2NvcGU8VD4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoZSBjb25zdW1lci1mYWNpbmcgdHlwZS4gVCBpcyB0aGUgdXNlcidzIHN0YXRlIGludGVyZmFjZS5cbi8vIFByb3BlcnR5IGFjY2VzcyBpcyB0eXBlZDsgJC1tZXRob2RzIHByb3ZpZGUgZXNjYXBlIGhhdGNoZXMuXG5cbmV4cG9ydCB0eXBlIFR5cGVkU2NvcGU8VCBleHRlbmRzIG9iamVjdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IFQgJiBTY29wZU1ldGhvZHM7XG5cbi8vIC0tIFJlYWN0aXZlT3B0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIGNyZWF0ZVR5cGVkU2NvcGUuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3RpdmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBpcGVsaW5lIGJyZWFrIGZ1bmN0aW9uIOKAlCBpbmplY3RlZCBieSBTdGFnZVJ1bm5lciBhZnRlciBzY29wZSBjcmVhdGlvbi5cbiAgICogQWNjZXB0cyBhbiBvcHRpb25hbCByZWFzb24gc3RyaW5nIHRoYXQgcHJvcGFnYXRlcyB0byBgRmxvd0JyZWFrRXZlbnRgXG4gICAqIGFuZCAod2hlbiBgcHJvcGFnYXRlQnJlYWtgIGlzIHNldCBvbiBhIG1vdW50KSB1cCB0byB0aGUgcGFyZW50IHNjb3BlLlxuICAgKi9cbiAgYnJlYWtQaXBlbGluZT86IChyZWFzb24/OiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbi8vIC0tIEludGVybmFsOiAkLW1ldGhvZCBuYW1lIHNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFVzZWQgYnkgdGhlIFByb3h5IGdldCB0cmFwIHRvIGRpc3Rpbmd1aXNoICQtbWV0aG9kcyBmcm9tIHN0YXRlIGtleXMuXG5cbmV4cG9ydCBjb25zdCBTQ09QRV9NRVRIT0RfTkFNRVMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnJGdldFZhbHVlJyxcbiAgJyRzZXRWYWx1ZScsXG4gICckdXBkYXRlJyxcbiAgJyRkZWxldGUnLFxuICAnJHJlYWQnLFxuICAnJGdldEFyZ3MnLFxuICAnJGdldEVudicsXG4gICckZGVidWcnLFxuICAnJGxvZycsXG4gICckZXJyb3InLFxuICAnJG1ldHJpYycsXG4gICckZXZhbCcsXG4gICckYXR0YWNoUmVjb3JkZXInLFxuICAnJGRldGFjaFJlY29yZGVyJyxcbiAgJyRnZXRSZWNvcmRlcnMnLFxuICAnJGJhdGNoQXJyYXknLFxuICAnJGJyZWFrJyxcbiAgJyRlbWl0JyxcbiAgJyRkZXRhY2hBbmRKb2luTGF0ZXInLFxuICAnJGRldGFjaEFuZEZvcmdldCcsXG4gICckdG9SYXcnLFxuXSk7XG5cbi8vIC0tIEludGVybmFsOiBTeW1ib2wgZm9yIGRlZmVycmVkIGJyZWFrIGluamVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFN0YWdlUnVubmVyIHNldHMgdGhpcyBhZnRlciBzY29wZSBjcmVhdGlvbiBzbyAkYnJlYWsoKSB3b3Jrcy5cbi8vIFByaXZhdGUgU3ltYm9sIChub3QgU3ltYm9sLmZvcikgdG8gcHJldmVudCBjcm9zcy1tb2R1bGUgdGFtcGVyaW5nLlxuXG5leHBvcnQgY29uc3QgQlJFQUtfU0VUVEVSID0gU3ltYm9sKCdmb290cHJpbnQ6cmVhY3RpdmU6c2V0QnJlYWsnKTtcblxuLy8gLS0gSW50ZXJuYWw6IFN5bWJvbCBmb3IgVHlwZWRTY29wZSBkZXRlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVXNlZCBieSBTdGFnZVJ1bm5lciB0byBza2lwIGNyZWF0ZVByb3RlY3RlZFNjb3BlIGZvciBUeXBlZFNjb3BlIGluc3RhbmNlcy5cbi8vIFByaXZhdGUgU3ltYm9sIHByZXZlbnRzIHN0cmluZy10YWcgc3Bvb2ZpbmcuXG5cbmV4cG9ydCBjb25zdCBJU19UWVBFRF9TQ09QRSA9IFN5bWJvbCgnZm9vdHByaW50OnJlYWN0aXZlOmlzVHlwZWRTY29wZScpO1xuXG4vLyAtLSBJbnRlcm5hbDogZXhlY3V0b3IgbWV0aG9kIGFsbG93bGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTY29wZUZhY2FkZSBtZXRob2RzIGNhbGxlZCBieSBGbG93Q2hhcnRFeGVjdXRvciB3cmFwcGluZyBjb2RlIGFuZCBTdGFnZVJ1bm5lclxuLy8gVEhST1VHSCBhIFR5cGVkU2NvcGUgcHJveHkuIE9ubHkgYWRkIG1ldGhvZHMgd2l0aCBjb25maXJtZWQgY2FsbCBzaXRlcy5cbi8vIFNoYXJlZCBiZXR3ZWVuIGNyZWF0ZVR5cGVkU2NvcGUudHMgYW5kIFN0YWdlUnVubmVyLnRzIHRvIHByZXZlbnQgZHJpZnQuXG5cbmV4cG9ydCBjb25zdCBFWEVDVVRPUl9JTlRFUk5BTF9NRVRIT0RTID0gbmV3IFNldChbXG4gICdub3RpZnlTdGFnZVN0YXJ0JywgLy8gU3RhZ2VSdW5uZXIucnVuKCkgbGluZSA1OVxuICAnbm90aWZ5U3RhZ2VFbmQnLCAvLyBTdGFnZVJ1bm5lci5ydW4oKSBsaW5lIDc5XG4gICdub3RpZnlQYXVzZScsIC8vIFN0YWdlUnVubmVyLnJ1bigpIOKAlCBwYXVzZSBkZXRlY3Rpb25cbiAgJ2F0dGFjaFJlY29yZGVyJywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuY3JlYXRlVHJhdmVyc2VyKCkg4oCUIG5hcnJhdGl2ZSArIHVzZXIgcmVjb3JkZXJzXG4gICdkZXRhY2hSZWNvcmRlcicsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmRldGFjaFJlY29yZGVyKClcbiAgJ2dldFJlY29yZGVycycsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmdldFJlY29yZGVycygpXG4gICd1c2VTaGFyZWRSZWRhY3RlZEtleXMnLCAvLyBGbG93Q2hhcnRFeGVjdXRvci5jcmVhdGVUcmF2ZXJzZXIoKSDigJQgcmVkYWN0aW9uIHdyYXBwaW5nXG4gICd1c2VSZWRhY3Rpb25Qb2xpY3knLCAvLyBGbG93Q2hhcnRFeGVjdXRvci5jcmVhdGVUcmF2ZXJzZXIoKSDigJQgcmVkYWN0aW9uIHdyYXBwaW5nXG5dKTtcbiJdfQ==
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlYWN0aXZlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBMFBILCtFQUErRTtBQUMvRSx1RUFBdUU7QUFFdkUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQVM7SUFDaEQsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1Asc0JBQXNCO0lBQ3RCLHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIsYUFBYTtJQUNiLFFBQVE7SUFDUixPQUFPO0lBQ1AscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixRQUFRO0NBQ1QsQ0FBQyxDQUFDO0FBRUgsK0VBQStFO0FBQy9FLGdFQUFnRTtBQUNoRSxxRUFBcUU7QUFFckUsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBRWxFLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UsK0NBQStDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUV4RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFFMUUsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDL0Msa0JBQWtCLEVBQUUsNEJBQTRCO0lBQ2hELGdCQUFnQixFQUFFLDRCQUE0QjtJQUM5QyxhQUFhLEVBQUUsc0NBQXNDO0lBQ3JELHFCQUFxQixFQUFFLG1FQUFtRTtJQUMxRixxQkFBcUIsRUFBRSwwQ0FBMEM7SUFDakUsbUJBQW1CLEVBQUUsd0NBQXdDO0lBQzdELHVCQUF1QixFQUFFLDJEQUEyRDtJQUNwRixvQkFBb0IsRUFBRSwyREFBMkQ7Q0FDbEYsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWFjdGl2ZS90eXBlcyAtLSBUeXBlIGRlZmluaXRpb25zIGZvciB0aGUgVHlwZWRTY29wZTxUPiByZWFjdGl2ZSBwcm94eSBzeXN0ZW0uXG4gKlxuICogVHlwZWRTY29wZTxUPiB3cmFwcyBhIFJlYWN0aXZlVGFyZ2V0IChTY29wZUZhY2FkZSkgaW4gYSBQcm94eSB0aGF0IHByb3ZpZGVzXG4gKiB0eXBlZCBwcm9wZXJ0eSBhY2Nlc3MuIEFsbCBzY29wZSBpbmZyYXN0cnVjdHVyZSBtZXRob2RzIGFyZSAkLXByZWZpeGVkIHRvXG4gKiBhdm9pZCBjb2xsaXNpb25zIHdpdGggdXNlciBzdGF0ZSBrZXlzLlxuICpcbiAqIERlcGVuZGVuY3k6IHR5cGUtb25seSBpbXBvcnRzIGZyb20gZW5naW5lLyBhbmQgc2NvcGUvICh6ZXJvIHJ1bnRpbWUgY29zdCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25FbnYgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuXG4vLyAtLSBSZWFjdGl2ZVRhcmdldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNaW5pbXVtIHByb3RvY29sIHJlcXVpcmVkIGJ5IFR5cGVkU2NvcGUgLS0gYSBjdXJhdGVkIHN1YnNldCBvZiBTY29wZUZhY2FkZSdzXG4vLyBwdWJsaWMgQVBJLiBOb3QgYSBmdWxsIG1pcnJvcjogZXhjbHVkZXMgaW50ZXJuYWwvcmVkYWN0aW9uIG1ldGhvZHMgdGhhdCBhcmVcbi8vIGhhbmRsZWQgYXQgdGhlIGV4ZWN1dG9yIGxldmVsICh1c2VSZWRhY3Rpb25Qb2xpY3ksIHVzZVNoYXJlZFJlZGFjdGVkS2V5cywgZXRjLilcbi8vIGFuZCBpbmZyYXN0cnVjdHVyZSBtZXRob2RzIChnZXRQaXBlbGluZUlkLCBzZXRHbG9iYWwsIGdldEdsb2JhbCwgZXRjLikuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3RpdmVUYXJnZXQge1xuICAvLyBTdGF0ZSBhY2Nlc3MgKHRyYWNrZWQgYnkgcmVjb3JkZXJzKVxuICBnZXRWYWx1ZShrZXk/OiBzdHJpbmcpOiB1bmtub3duO1xuICBzZXRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbiAgdXBkYXRlVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQ7XG4gIGRlbGV0ZVZhbHVlKGtleTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQ7XG5cbiAgLy8gTm9uLXRyYWNraW5nIHN0YXRlIGluc3BlY3Rpb24gKGZvciBwcm94eSBpbnRlcm5hbHMg4oCUIG5vIHJlY29yZGVyIGRpc3BhdGNoKVxuICAvKiogUmV0dXJucyBhbGwgc3RhdGUga2V5cyB3aXRob3V0IGZpcmluZyBvblJlYWQuIFVzZWQgYnkgb3duS2V5cy9oYXMgdHJhcHMuICovXG4gIGdldFN0YXRlS2V5cz8oKTogc3RyaW5nW107XG4gIC8qKiBDaGVjayBrZXkgZXhpc3RlbmNlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBoYXMgdHJhcC4gKi9cbiAgaGFzS2V5PyhrZXk6IHN0cmluZyk6IGJvb2xlYW47XG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBhcnJheSBwcm94eSBnZXRDdXJyZW50KCkuICovXG4gIGdldFZhbHVlU2lsZW50PyhrZXk/OiBzdHJpbmcpOiB1bmtub3duO1xuXG4gIC8vIElucHV0ICYgZW52aXJvbm1lbnQgKHJlYWRvbmx5LCBOT1QgdHJhY2tlZClcbiAgZ2V0QXJnczxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk6IFQ7XG4gIGdldEVudigpOiBSZWFkb25seTxFeGVjdXRpb25FbnY+O1xuXG4gIC8vIFNjb3BlUmVjb3JkZXIgbWFuYWdlbWVudFxuICBhdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyOiBTY29wZVJlY29yZGVyKTogdm9pZDtcbiAgZGV0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkO1xuICBnZXRTY29wZVJlY29yZGVycygpOiBTY29wZVJlY29yZGVyW107XG5cbiAgLy8gRGlhZ25vc3RpY3NcbiAgYWRkRGVidWdJbmZvKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gIGFkZERlYnVnTWVzc2FnZSh2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gIGFkZEVycm9ySW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBhZGRNZXRyaWMobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gIGFkZEV2YWwobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG5cbiAgLy8gRW1pdCBjaGFubmVsIChQaGFzZSAzKSDigJQgc3RydWN0dXJlZCB1c2VyLWF1dGhvcmVkIGV2ZW50cyB0byBFbWl0UmVjb3JkZXJzLlxuICBlbWl0RXZlbnQobmFtZTogc3RyaW5nLCBwYXlsb2FkPzogdW5rbm93bik6IHZvaWQ7XG5cbiAgLy8gRGV0YWNoIChUNCkg4oCUIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnRzLiBTY29wZUZhY2FkZVxuICAvLyBkZWxlZ2F0ZXMgdG8gYGRldGFjaC9zcGF3bmAsIG1pbnRpbmcgcmVmSWRzIGZyb20gdGhpcyBzdGFnZSdzXG4gIC8vIHJ1bnRpbWVTdGFnZUlkIGZvciBkaWFnbm9zdGljIGNvcnJlbGF0aW9uLlxuICBkZXRhY2hBbmRKb2luTGF0ZXIoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hIYW5kbGU7XG5cbiAgZGV0YWNoQW5kRm9yZ2V0KFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IHZvaWQ7XG59XG5cbi8vIC0tIFNjb3BlTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vICQtcHJlZml4ZWQgZXNjYXBlIGhhdGNoZXMuIE5vbi1lbnVtZXJhYmxlIG9uIHRoZSBwcm94eSAtLSBkb24ndCBhcHBlYXIgaW5cbi8vIE9iamVjdC5rZXlzKCksIGRlc3RydWN0dXJpbmcsIG9yIGZvci4uLmluLiBPbmx5IHN0YXRlIGtleXMgYXJlIHZpc2libGUuXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NvcGVNZXRob2RzIHtcbiAgLy8gU3RhdGUgKHVudHlwZWQgZXNjYXBlIGhhdGNoIC0tIGZvciBkeW5hbWljIGtleXMsIHJlZGFjdGlvbiwgZGVzY3JpcHRpb24pXG4gICRnZXRWYWx1ZShrZXk6IHN0cmluZyk6IHVua25vd247XG4gICRzZXRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbiAgJHVwZGF0ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbiAgJGRlbGV0ZShrZXk6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICAvKiogUHJveHktc3ludGhlc2l6ZWQ6IGNhbGxzIGdldFZhbHVlKHJvb3RLZXkpIHRoZW4gbG9kYXNoLmdldCBmb3IgbmVzdGVkIHBhdGguIE5vdCBhIGRpcmVjdCBkZWxlZ2F0aW9uLiAqL1xuICAkcmVhZChkb3RQYXRoOiBzdHJpbmcpOiB1bmtub3duO1xuXG4gIC8vIElucHV0ICYgZW52aXJvbm1lbnQgKHJlYWRvbmx5KVxuICAkZ2V0QXJnczxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk6IFQ7XG4gICRnZXRFbnYoKTogUmVhZG9ubHk8RXhlY3V0aW9uRW52PjtcblxuICAvLyBPYnNlcnZhYmlsaXR5IOKAlCBsZWdhY3kgZGlhZ25vc3RpYyBwcmltaXRpdmVzLlxuICAvL1xuICAvLyBBcyBvZiBQaGFzZSAzIHRoZXNlIEFMU08gZGlzcGF0Y2ggb24gdGhlIGVtaXQgY2hhbm5lbCAoaW4gYWRkaXRpb24gdG9cbiAgLy8gdGhlaXIgZXhpc3RpbmcgYERpYWdub3N0aWNDb2xsZWN0b3JgIHNpZGUtYmFnIHdyaXRlcyBmb3Igc25hcHNob3RcbiAgLy8gaW5jbHVzaW9uKS4gQW55IGF0dGFjaGVkIGBFbWl0UmVjb3JkZXJgIHdpbGwgc2VlIHRoZXNlIGV2ZW50cyB3aXRoXG4gIC8vIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzcGFjZWQgbmFtZXM6XG4gIC8vXG4gIC8vICAgJGRlYnVnKGtleSwgdmFsdWUpICAgIC0+IGVtaXRzIGBsb2cuZGVidWcuJHtrZXl9YFxuICAvLyAgICRlcnJvcihrZXksIHZhbHVlKSAgICAtPiBlbWl0cyBgbG9nLmVycm9yLiR7a2V5fWBcbiAgLy8gICAkbWV0cmljKG5hbWUsIHZhbHVlKSAgLT4gZW1pdHMgYG1ldHJpYy4ke25hbWV9YFxuICAvLyAgICRldmFsIChuYW1lLCB2YWx1ZSkgICAtPiBlbWl0cyBgZXZhbC4ke25hbWV9YFxuICAvLyAgICRsb2codmFsdWUpICAgICAgICAgICAtPiBlbWl0cyBgbG9nLmRlYnVnLm1lc3NhZ2VzYFxuICAvL1xuICAvLyBUaGlzIG1ha2VzIHRoZSBjYWxscyBvYnNlcnZhYmxlIGluIHJlYWwgdGltZSDigJQgbm8gbG9zcyBvZiBiYWNrd2FyZFxuICAvLyBjb21wYXQ7IHRoZSBzaWRlIGJhZyBjb250aW51ZXMgdG8gcG9wdWxhdGUgZm9yIGNvbnN1bWVycyB0aGF0IGluc3BlY3RcbiAgLy8gdGhlIHNuYXBzaG90IGRpcmVjdGx5LlxuICAkZGVidWcoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgJGxvZyh2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gICRlcnJvcihrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICAkbWV0cmljKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICAkZXZhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcblxuICAvLyBTY29wZVJlY29yZGVyIG1hbmFnZW1lbnRcbiAgJGF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXI6IFNjb3BlUmVjb3JkZXIpOiB2b2lkO1xuICAkZGV0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkO1xuICAkZ2V0U2NvcGVSZWNvcmRlcnMoKTogU2NvcGVSZWNvcmRlcltdO1xuXG4gIC8qKlxuICAgKiBCYXRjaC1tdXRhdGUgYW4gYXJyYXkga2V5IGluIGEgc2luZ2xlIGNsb25lK3dyaXRlIGN5Y2xlLlxuICAgKlxuICAgKiBFdmVyeSBgc2NvcGUuaXRlbXMucHVzaCh4KWAgY2xvbmVzIHRoZSBlbnRpcmUgYXJyYXkgYW5kIGNvbW1pdHMgaXQg4oCUIE8oTikgcGVyIGNhbGwuXG4gICAqIEZvciBOIG11dGF0aW9ucyBvbiBhbiBNLWxlbmd0aCBhcnJheSB0aGF0IGlzIE8oTsOXTSkuIFVzZSBgJGJhdGNoQXJyYXlgIHRvIGNsb25lIG9uY2UsXG4gICAqIGFwcGx5IGFsbCBtdXRhdGlvbnMgaW5zaWRlIGBmbmAsIHRoZW4gY29tbWl0IG9uY2Ug4oCUIE8oTSkgdG90YWwuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQmVmb3JlOiAxMDAwIGNsb25lcyDDlyBncm93aW5nIGFycmF5ID0gTyhOwrIpXG4gICAqIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSBzY29wZS5pdGVtcy5wdXNoKGkpO1xuICAgKlxuICAgKiAvLyBBZnRlcjogMSBjbG9uZSArIDEgY29tbWl0ID0gTyhOKVxuICAgKiBzY29wZS4kYmF0Y2hBcnJheSgnaXRlbXMnLCAoYXJyKSA9PiB7XG4gICAqICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIGFyci5wdXNoKGkpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIGBmbmAgcmVjZWl2ZXMgYSBwbGFpbiAobm9uLXByb3h5KSBtdXRhYmxlICoqc2hhbGxvdyBjb3B5Kiogb2YgdGhlIGN1cnJlbnQgYXJyYXkuXG4gICAqIFRoZSBhcnJheSBpdHNlbGYgaXMgYSBuZXcgaW5zdGFuY2UsIGJ1dCBvYmplY3QgcmVmZXJlbmNlcyBpbnNpZGUgaXQgYXJlIHNoYXJlZCB3aXRoXG4gICAqIHRoZSBvcmlnaW5hbCBzdGF0ZSDigJQgbXV0YXRpb25zIHRvIG5lc3RlZCBvYmplY3RzIGluc2lkZSBgZm5gIGFmZmVjdCB0aG9zZSBvcmlnaW5hbHMuXG4gICAqIE9ubHkgcHVzaC9wb3Avc29ydC9zcGxpY2UgYW5kIG90aGVyIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGFycmF5J3Mgb3duIHNsb3RzIGFyZVxuICAgKiBzYWZlbHkgaXNvbGF0ZWQuXG4gICAqXG4gICAqIE11dGF0aW9ucyBpbnNpZGUgYGZuYCBhcmUgTk9UIHRyYWNrZWQgaW5kaXZpZHVhbGx5IOKAlCBvbmx5IHRoZSBmaW5hbCBjb21taXR0ZWQgYXJyYXlcbiAgICogYXBwZWFycyBpbiB0aGUgbmFycmF0aXZlIGFzIGEgc2luZ2xlIHdyaXRlLiBJZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhblxuICAgKiBhcnJheSwgYGZuYCByZWNlaXZlcyBhbiBlbXB0eSBhcnJheSBhbmQgdGhlIHJlc3VsdCBpcyBjb21taXR0ZWQgYXMgdGhlIG5ldyB2YWx1ZS5cbiAgICpcbiAgICogSWYgYGZuYCB0aHJvd3MsIGBzZXRWYWx1ZWAgaXMgbmV2ZXIgY2FsbGVkIGFuZCBzdGF0ZSByZW1haW5zIHVuY2hhbmdlZCAoYXRvbWljIG9uXG4gICAqIGVycm9yKS4gVGhlIGV4Y2VwdGlvbiBwcm9wYWdhdGVzIHRvIHRoZSBjYWxsZXIuXG4gICAqXG4gICAqIGBrZXlgIGlzIHVudHlwZWQgKGBzdHJpbmdgKSDigJQgVHlwZVNjcmlwdCB3aWxsIG5vdCBjYXRjaCB0eXBvcy4gYGFycmAgaXMgdHlwZWQgYXNcbiAgICogYHVua25vd25bXWAgYmVjYXVzZSBgU2NvcGVNZXRob2RzYCBpcyBub3QgcGFyYW1ldGVyaXplZCBieSBgVGA7IGNhc3QgaW5zaWRlIGBmbmBcbiAgICogd2hlbiBlbGVtZW50IHR5cGVzIGFyZSBrbm93bjogYChhcnIgYXMgc3RyaW5nW10pLnB1c2goeClgLlxuICAgKi9cbiAgJGJhdGNoQXJyYXkoa2V5OiBzdHJpbmcsIGZuOiAoYXJyOiB1bmtub3duW10pID0+IHZvaWQpOiB2b2lkO1xuXG4gIC8vIE9ic2VydmFiaWxpdHkg4oCUIEVtaXQgY2hhbm5lbCAoUGhhc2UgMylcbiAgLyoqXG4gICAqIEZpcmUgYSBzdHJ1Y3R1cmVkIGV2ZW50IHRvIGV2ZXJ5IGF0dGFjaGVkIHJlY29yZGVyIGltcGxlbWVudGluZ1xuICAgKiBgb25FbWl0YC4gVGhlIHByaW1hcnkgcHJpbWl0aXZlIGZvciBjb25zdW1lci1hdXRob3JlZCBvYnNlcnZhYmlsaXR5XG4gICAqIGV2ZW50cyAoTExNIHRva2VucywgYmlsbGluZyBtZXRyaWNzLCBkb21haW4gbWlsZXN0b25lcywgZXRjLikgdGhhdFxuICAgKiBzaG91bGRuJ3QgbGl2ZSBpbiBzY29wZSBzdGF0ZS5cbiAgICpcbiAgICogU3luY2hyb25vdXMsIHBhc3MtdGhyb3VnaCDigJQgZGVsaXZlcmVkIHRvIHJlY29yZGVycyBpbW1lZGlhdGVseSwgaW5cbiAgICogY2FsbCBvcmRlci4gWmVyby1hbGxvY2F0aW9uIHdoZW4gbm8gcmVjb3JkZXJzIGFyZSBhdHRhY2hlZC5cbiAgICpcbiAgICogIyMgTmFtaW5nIGNvbnZlbnRpb25cbiAgICpcbiAgICogVXNlIGhpZXJhcmNoaWNhbCBkb3R0ZWQgbmFtZXM6IGAnPG5hbWVzcGFjZT4uPGNhdGVnb3J5Pi48ZXZlbnQ+J2AuXG4gICAqIEV4YW1wbGVzOlxuICAgKiAgIC0gYCdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJ2BcbiAgICogICAtIGAnbXlhcHAuYmlsbGluZy5zcGVuZCdgXG4gICAqICAgLSBgJ2F1dGguY2hlY2suZGVuaWVkJ2BcbiAgICpcbiAgICogVGhlIGxpYnJhcnkgc3RheXMgdm9jYWJ1bGFyeS1hZ25vc3RpYyDigJQgbm8gY2VudHJhbCByZWdpc3RyeSwgbm9cbiAgICogcmVzZXJ2ZWQgcHJlZml4ZXMuIE5hbWVzcGFjZSBwcmVmaXhlcyBwcmV2ZW50IGNvbGxpc2lvbnMgYWNyb3NzXG4gICAqIGxpYnJhcmllcyBhbmQgYXBwcyBuYXR1cmFsbHkuXG4gICAqXG4gICAqICMjIFJlZGFjdGlvblxuICAgKlxuICAgKiBJZiBgUmVkYWN0aW9uUG9saWN5LmVtaXRQYXR0ZXJuc2AgbWF0Y2hlcyB0aGUgbmFtZSwgdGhlIHBheWxvYWQgaXNcbiAgICogcmVwbGFjZWQgd2l0aCBgJ1tSRURBQ1RFRF0nYCBiZWZvcmUgZGlzcGF0Y2guIE5vIHJlY29yZGVyIGV2ZXIgc2Vlc1xuICAgKiB0aGUgcmF3IHZhbHVlIGZvciByZWRhY3RlZCBldmVudCBuYW1lcy5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBDb25zdW1lci1jaG9zZW4gZXZlbnQgaWRlbnRpZmllciAoc2VlIG5hbWluZyBjb252ZW50aW9uKS5cbiAgICogQHBhcmFtIHBheWxvYWQgLSBTdHJ1Y3R1cmVkIGRhdGEgdG8gYXR0YWNoLiBTaGFwZSBpcyB1cCB0byB0aGVcbiAgICogICBjb25zdW1lcjsgbGlicmFyeSB0cmVhdHMgaXQgYXMgb3BhcXVlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHNjb3BlLiRlbWl0KCdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJywgeyBpbnB1dDogMTAwLCBvdXRwdXQ6IDUwIH0pO1xuICAgKiBzY29wZS4kZW1pdCgnbXlhcHAuZGVjaXNpb24nLCB7IGJyYW5jaDogJ2FwcHJvdmVkJywgY29uZmlkZW5jZTogMC45MiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAkZW1pdChuYW1lOiBzdHJpbmcsIHBheWxvYWQ/OiB1bmtub3duKTogdm9pZDtcblxuICAvLyBEZXRhY2gg4oCUIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnQgZXhlY3V0aW9uLlxuICAvL1xuICAvLyBgJGRldGFjaEFuZEpvaW5MYXRlcihkcml2ZXIsIGNoaWxkLCBpbnB1dD8pYCBzY2hlZHVsZXMgdGhlIGNoaWxkIHZpYVxuICAvLyB0aGUgZ2l2ZW4gZHJpdmVyIGFuZCByZXR1cm5zIGEgYERldGFjaEhhbmRsZWAgdGhlIGNvbnN1bWVyIGNhbiByZWFkXG4gIC8vIHN5bmNocm9ub3VzbHkgKGAuc3RhdHVzYCkgb3IgYXdhaXQgKGAud2FpdCgpYCkuIFRoZSBwYXJlbnQgc3RhZ2VcbiAgLy8gZG9lcyBOT1QgYmxvY2sgb24gdGhlIGNoaWxkIOKAlCBpdCByZXR1cm5zIHRvIHRoZSBhZ2VudCBsb29wIHRoZVxuICAvLyBtb21lbnQgdGhlIGRyaXZlcidzIGBzY2hlZHVsZSgpYCByZXR1cm5zIChwYXNzaXZlIHJlY29yZGVyIHJ1bGUpLlxuICAvL1xuICAvLyBgJGRldGFjaEFuZEZvcmdldChkcml2ZXIsIGNoaWxkLCBpbnB1dD8pYCBkaXNjYXJkcyB0aGUgaGFuZGxlIOKAlFxuICAvLyB1c2VmdWwgZm9yIGZpcmUtYW5kLWZvcmdldCB0ZWxlbWV0cnkgd2hlcmUgdGhlIGNhbGxlciBuZXZlciBuZWVkc1xuICAvLyB0byBrbm93IGhvdyB0aGUgY2hpbGQgZmluaXNoZWQuIEVycm9ycyBzdGlsbCBsYW5kIG9uIHRoZSAobm93LVxuICAvLyBkcm9wcGVkKSBoYW5kbGUgYW5kIGdvIHNpbGVudCB1bmxlc3MgYW4gb2JzZXJ2ZXIgc3VyZmFjZXMgdGhlbS5cbiAgLy9cbiAgLy8gRHJpdmVyIGlzIFJFUVVJUkVEIOKAlCB0aGVyZSdzIG5vIGxpYnJhcnktZGVmYXVsdC4gUGFzcyBlLmcuXG4gIC8vIGBtaWNyb3Rhc2tCYXRjaERyaXZlcmAgKGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCcpIG9yIHlvdXIgb3duXG4gIC8vIGN1c3RvbSBkcml2ZXIuIEV4cGxpY2l0IHBhc3NpbmcgYXZvaWRzIGdsb2JhbCBzdGF0ZSBhbmQga2VlcHMgdGhlXG4gIC8vIGVuZ2luZSBmcmVlIG9mIGRyaXZlciBpbXBvcnRzLlxuICAkZGV0YWNoQW5kSm9pbkxhdGVyKFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoSGFuZGxlO1xuXG4gICRkZXRhY2hBbmRGb3JnZXQoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogdm9pZDtcblxuICAvLyBQaXBlbGluZSBjb250cm9sXG4gIC8qKlxuICAgKiBTdG9wIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0LlxuICAgKlxuICAgKiAtICoqSW4gYSB0b3AtbGV2ZWwgY2hhcnQ6KiogdGhlIHRyYXZlcnNlciBleGl0cyBjbGVhbmx5IGFmdGVyIHRoaXMgc3RhZ2VcbiAgICogICBjb21wbGV0ZXMuXG4gICAqIC0gKipJbnNpZGUgYSBzdWJmbG93OioqIGJ5IGRlZmF1bHQsIG9ubHkgdGhlIHN1YmZsb3cncyBvd24gZXhlY3V0aW9uXG4gICAqICAgc3RvcHM7IGNvbnRyb2wgcmV0dXJucyB0byB0aGUgcGFyZW50IGFzIG5vcm1hbC4gSWYgdGhlIHN1YmZsb3cgaXNcbiAgICogICBtb3VudGVkIHdpdGggYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCwgdGhlIGJyZWFrIHNpZ25hbCAoYW5kIGl0c1xuICAgKiAgIG9wdGlvbmFsIHJlYXNvbikgcHJvcGFnYXRlcyB1cCB0byB0aGUgcGFyZW50IHNjb3BlLCB0ZXJtaW5hdGluZyB0aGVcbiAgICogICBvdXRlciBsb29wIHRvby4gU2VlIGBTdWJmbG93TW91bnRPcHRpb25zLnByb3BhZ2F0ZUJyZWFrYC5cbiAgICpcbiAgICogQHBhcmFtIHJlYXNvbiAtIE9wdGlvbmFsIGZyZWUtZm9ybSBzdHJpbmcgZGVzY3JpYmluZyB3aHkgdGhlIGJyZWFrXG4gICAqICAgaGFwcGVuZWQuIFByb3BhZ2F0ZXMgdG8gYEZsb3dCcmVha0V2ZW50LnJlYXNvbmAgc28gcmVjb3JkZXJzIGFuZFxuICAgKiAgIGN1c3RvbSBuYXJyYXRpdmVzIGNhbiBzdXJmYWNlIGl0LiBEZWZhdWx0cyB0byB1bmRlZmluZWQuXG4gICAqL1xuICAkYnJlYWsocmVhc29uPzogc3RyaW5nKTogdm9pZDtcblxuICAvLyBFc2NhcGUgaGF0Y2ggLS0gdW53cmFwIHRvIHVuZGVybHlpbmcgUmVhY3RpdmVUYXJnZXRcbiAgJHRvUmF3KCk6IFJlYWN0aXZlVGFyZ2V0O1xufVxuXG4vLyAtLSBUeXBlZFNjb3BlPFQ+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaGUgY29uc3VtZXItZmFjaW5nIHR5cGUuIFQgaXMgdGhlIHVzZXIncyBzdGF0ZSBpbnRlcmZhY2UuXG4vLyBQcm9wZXJ0eSBhY2Nlc3MgaXMgdHlwZWQ7ICQtbWV0aG9kcyBwcm92aWRlIGVzY2FwZSBoYXRjaGVzLlxuXG5leHBvcnQgdHlwZSBUeXBlZFNjb3BlPFQgZXh0ZW5kcyBvYmplY3QgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSBUICYgU2NvcGVNZXRob2RzO1xuXG4vLyAtLSBSZWFjdGl2ZU9wdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25maWd1cmF0aW9uIHBhc3NlZCB0byBjcmVhdGVUeXBlZFNjb3BlLlxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWN0aXZlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQaXBlbGluZSBicmVhayBmdW5jdGlvbiDigJQgaW5qZWN0ZWQgYnkgU3RhZ2VSdW5uZXIgYWZ0ZXIgc2NvcGUgY3JlYXRpb24uXG4gICAqIEFjY2VwdHMgYW4gb3B0aW9uYWwgcmVhc29uIHN0cmluZyB0aGF0IHByb3BhZ2F0ZXMgdG8gYEZsb3dCcmVha0V2ZW50YFxuICAgKiBhbmQgKHdoZW4gYHByb3BhZ2F0ZUJyZWFrYCBpcyBzZXQgb24gYSBtb3VudCkgdXAgdG8gdGhlIHBhcmVudCBzY29wZS5cbiAgICovXG4gIGJyZWFrUGlwZWxpbmU/OiAocmVhc29uPzogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vLyAtLSBJbnRlcm5hbDogJC1tZXRob2QgbmFtZSBzZXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBVc2VkIGJ5IHRoZSBQcm94eSBnZXQgdHJhcCB0byBkaXN0aW5ndWlzaCAkLW1ldGhvZHMgZnJvbSBzdGF0ZSBrZXlzLlxuXG5leHBvcnQgY29uc3QgU0NPUEVfTUVUSE9EX05BTUVTID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJyRnZXRWYWx1ZScsXG4gICckc2V0VmFsdWUnLFxuICAnJHVwZGF0ZScsXG4gICckZGVsZXRlJyxcbiAgJyRyZWFkJyxcbiAgJyRnZXRBcmdzJyxcbiAgJyRnZXRFbnYnLFxuICAnJGRlYnVnJyxcbiAgJyRsb2cnLFxuICAnJGVycm9yJyxcbiAgJyRtZXRyaWMnLFxuICAnJGV2YWwnLFxuICAnJGF0dGFjaFNjb3BlUmVjb3JkZXInLFxuICAnJGRldGFjaFNjb3BlUmVjb3JkZXInLFxuICAnJGdldFNjb3BlUmVjb3JkZXJzJyxcbiAgJyRiYXRjaEFycmF5JyxcbiAgJyRicmVhaycsXG4gICckZW1pdCcsXG4gICckZGV0YWNoQW5kSm9pbkxhdGVyJyxcbiAgJyRkZXRhY2hBbmRGb3JnZXQnLFxuICAnJHRvUmF3Jyxcbl0pO1xuXG4vLyAtLSBJbnRlcm5hbDogU3ltYm9sIGZvciBkZWZlcnJlZCBicmVhayBpbmplY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdGFnZVJ1bm5lciBzZXRzIHRoaXMgYWZ0ZXIgc2NvcGUgY3JlYXRpb24gc28gJGJyZWFrKCkgd29ya3MuXG4vLyBQcml2YXRlIFN5bWJvbCAobm90IFN5bWJvbC5mb3IpIHRvIHByZXZlbnQgY3Jvc3MtbW9kdWxlIHRhbXBlcmluZy5cblxuZXhwb3J0IGNvbnN0IEJSRUFLX1NFVFRFUiA9IFN5bWJvbCgnZm9vdHByaW50OnJlYWN0aXZlOnNldEJyZWFrJyk7XG5cbi8vIC0tIEludGVybmFsOiBTeW1ib2wgZm9yIFR5cGVkU2NvcGUgZGV0ZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFVzZWQgYnkgU3RhZ2VSdW5uZXIgdG8gc2tpcCBjcmVhdGVQcm90ZWN0ZWRTY29wZSBmb3IgVHlwZWRTY29wZSBpbnN0YW5jZXMuXG4vLyBQcml2YXRlIFN5bWJvbCBwcmV2ZW50cyBzdHJpbmctdGFnIHNwb29maW5nLlxuXG5leHBvcnQgY29uc3QgSVNfVFlQRURfU0NPUEUgPSBTeW1ib2woJ2Zvb3RwcmludDpyZWFjdGl2ZTppc1R5cGVkU2NvcGUnKTtcblxuLy8gLS0gSW50ZXJuYWw6IGV4ZWN1dG9yIG1ldGhvZCBhbGxvd2xpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2NvcGVGYWNhZGUgbWV0aG9kcyBjYWxsZWQgYnkgRmxvd0NoYXJ0RXhlY3V0b3Igd3JhcHBpbmcgY29kZSBhbmQgU3RhZ2VSdW5uZXJcbi8vIFRIUk9VR0ggYSBUeXBlZFNjb3BlIHByb3h5LiBPbmx5IGFkZCBtZXRob2RzIHdpdGggY29uZmlybWVkIGNhbGwgc2l0ZXMuXG4vLyBTaGFyZWQgYmV0d2VlbiBjcmVhdGVUeXBlZFNjb3BlLnRzIGFuZCBTdGFnZVJ1bm5lci50cyB0byBwcmV2ZW50IGRyaWZ0LlxuXG5leHBvcnQgY29uc3QgRVhFQ1VUT1JfSU5URVJOQUxfTUVUSE9EUyA9IG5ldyBTZXQoW1xuICAnbm90aWZ5U3RhZ2VTdGFydCcsIC8vIFN0YWdlUnVubmVyLnJ1bigpIGxpbmUgNTlcbiAgJ25vdGlmeVN0YWdlRW5kJywgLy8gU3RhZ2VSdW5uZXIucnVuKCkgbGluZSA3OVxuICAnbm90aWZ5UGF1c2UnLCAvLyBTdGFnZVJ1bm5lci5ydW4oKSDigJQgcGF1c2UgZGV0ZWN0aW9uXG4gICdhdHRhY2hTY29wZVJlY29yZGVyJywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuY3JlYXRlVHJhdmVyc2VyKCkg4oCUIG5hcnJhdGl2ZSArIHVzZXIgcmVjb3JkZXJzXG4gICdkZXRhY2hTY29wZVJlY29yZGVyJywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuZGV0YWNoU2NvcGVSZWNvcmRlcigpXG4gICdnZXRTY29wZVJlY29yZGVycycsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmdldFNjb3BlUmVjb3JkZXJzKClcbiAgJ3VzZVNoYXJlZFJlZGFjdGVkS2V5cycsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmNyZWF0ZVRyYXZlcnNlcigpIOKAlCByZWRhY3Rpb24gd3JhcHBpbmdcbiAgJ3VzZVJlZGFjdGlvblBvbGljeScsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmNyZWF0ZVRyYXZlcnNlcigpIOKAlCByZWRhY3Rpb24gd3JhcHBpbmdcbl0pO1xuIl19
@@ -0,0 +1,167 @@
1
+ /**
2
+ * BoundaryStateStore<TState> — concrete, composable per-boundary
3
+ * transient state storage.
4
+ *
5
+ * Pattern: COMPOSITION primitive. Concrete class — instantiate with
6
+ * `new BoundaryStateStore<TState>()` and own it as a field
7
+ * on your recorder. Replaces the abstract
8
+ * `BoundaryStateTracker<TState>` base class for the v5
9
+ * "one purpose per recorder" rule.
10
+ * Role: "What's the LIVE transient state of every currently-active
11
+ * boundary?" A boundary is a matched event pair `[start, stop]`
12
+ * bracketing an interval (e.g., `(llm_start, llm_end)`).
13
+ * Between the brackets, intermediate events evolve the
14
+ * boundary's state. On `stop`, the state clears.
15
+ *
16
+ * Algorithmically this is the **DFS bracket-sequence pattern** — the
17
+ * `active` map is the open-brackets stack at any moment.
18
+ *
19
+ * **Lifecycle contract — STRICT:** every `start(key, ...)` call MUST
20
+ * be paired with a `stop(key)` call. Failure to wire stop produces a
21
+ * memory leak: the active map grows without bound.
22
+ *
23
+ * **Concurrency / nesting:** concurrent boundaries (parallel branches
24
+ * with two LLM calls active at once) work correctly — each is keyed
25
+ * independently. Nested boundaries of DIFFERENT KINDS require
26
+ * SEPARATE store instances — one per kind.
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * import { BoundaryStateStore } from 'footprintjs/trace';
31
+ * import type { CombinedRecorder, EmitEvent } from 'footprintjs';
32
+ *
33
+ * interface LLMLiveState { partial: string; tokens: number; }
34
+ *
35
+ * class LiveLLMTracker implements CombinedRecorder {
36
+ * readonly id = 'live-llm';
37
+ * private readonly store = new BoundaryStateStore<LLMLiveState>();
38
+ *
39
+ * onEmit(event: EmitEvent): void {
40
+ * if (event.name === 'agentfootprint.stream.llm_start') {
41
+ * this.store.start(event.runtimeStageId, { partial: '', tokens: 0 });
42
+ * } else if (event.name === 'agentfootprint.stream.llm_end') {
43
+ * this.store.stop(event.runtimeStageId);
44
+ * } else if (event.name === 'agentfootprint.stream.token') {
45
+ * this.store.update(event.runtimeStageId, (s) => ({
46
+ * partial: s.partial + (event.payload as { content: string }).content,
47
+ * tokens: s.tokens + 1,
48
+ * }));
49
+ * }
50
+ * }
51
+ *
52
+ * isInFlight(): boolean { return this.store.hasActive; }
53
+ * getPartial(rid: string): string {
54
+ * return this.store.get(rid)?.partial ?? '';
55
+ * }
56
+ *
57
+ * clear() { this.store.clear(); }
58
+ * }
59
+ * ```
60
+ */
61
+ import { isDevMode } from '../scope/detectCircular.js';
62
+ export class BoundaryStateStore {
63
+ /** Open-brackets stack: key → current transient state. */
64
+ active = new Map();
65
+ /** Per-key count of `update` calls that landed without a matching
66
+ * active boundary. Drives rate-limited dev-mode warnings so a
67
+ * stuck loop doesn't spam the console. */
68
+ missedUpdates = new Map();
69
+ /** Optional id for diagnostics — passed to dev-mode warnings so the
70
+ * source of the leak is easy to find when multiple stores coexist. */
71
+ diagnosticId;
72
+ constructor(diagnosticId = 'boundary-state-store') {
73
+ this.diagnosticId = diagnosticId;
74
+ }
75
+ // ── Mutators ─────────────────────────────────────────────────────────
76
+ /**
77
+ * Open a new boundary with initial transient state. If a boundary
78
+ * with the same `key` is already active, the prior state is
79
+ * overwritten (last-writer-wins). Dev mode warns — usually
80
+ * indicates a missed `stop` upstream.
81
+ */
82
+ start(key, initial) {
83
+ if (this.active.has(key) && isDevMode()) {
84
+ console.warn(`[${this.diagnosticId}] start('${key}') called while an active boundary ` +
85
+ 'already exists. Overwriting prior state — likely a missed stop upstream.');
86
+ }
87
+ this.active.set(key, initial);
88
+ }
89
+ /**
90
+ * Evolve the transient state of an active boundary using a pure
91
+ * updater function. Silent no-op if no boundary is active for `key`
92
+ * (defensive against out-of-order events). Dev mode logs a rate-
93
+ * limited warning.
94
+ */
95
+ update(key, updater) {
96
+ const cur = this.active.get(key);
97
+ if (cur === undefined) {
98
+ if (isDevMode()) {
99
+ const n = (this.missedUpdates.get(key) ?? 0) + 1;
100
+ this.missedUpdates.set(key, n);
101
+ if (n === 1) {
102
+ console.warn(`[${this.diagnosticId}] update('${key}') — no active boundary. Update dropped.`);
103
+ }
104
+ else if (n === 10 || n === 100) {
105
+ console.warn(`[${this.diagnosticId}] update('${key}') — ${n} dropped updates. Wiring bug?`);
106
+ }
107
+ }
108
+ return;
109
+ }
110
+ this.active.set(key, updater(cur));
111
+ }
112
+ /**
113
+ * Close the boundary identified by `key` and return its FINAL
114
+ * transient state (so the consumer can do any cleanup — e.g., emit
115
+ * a snapshot to a SequenceStore for durable storage).
116
+ */
117
+ stop(key) {
118
+ const final = this.active.get(key);
119
+ this.active.delete(key);
120
+ return final;
121
+ }
122
+ // ── Read (O(1)) ──────────────────────────────────────────────────────
123
+ /** Current transient state of ONE active boundary. `undefined` if no
124
+ * boundary is active for `key`. */
125
+ get(key) {
126
+ return this.active.get(key);
127
+ }
128
+ /** All currently-active boundaries.
129
+ *
130
+ * **Type-only readonly:** TypeScript prevents mutation through
131
+ * `ReadonlyMap`, but a runtime cast or non-TS consumer can mutate
132
+ * the underlying Map and corrupt state. Don't. */
133
+ getAll() {
134
+ return this.active;
135
+ }
136
+ /** True if any boundary is currently active. O(1). */
137
+ get hasActive() {
138
+ return this.active.size > 0;
139
+ }
140
+ /** Number of currently-active boundaries. O(1). */
141
+ get activeCount() {
142
+ return this.active.size;
143
+ }
144
+ // ── Lifecycle ────────────────────────────────────────────────────────
145
+ /**
146
+ * Reset all transient state. Called by recorder composers from
147
+ * their own `clear()` method, which the executor invokes before
148
+ * each run.
149
+ *
150
+ * Dev mode warns if any boundaries are still active when called —
151
+ * likely indicates a missed `stop` upstream. Leaked keys are listed
152
+ * (truncated to 10) so the wiring bug is findable.
153
+ */
154
+ clear() {
155
+ if (this.active.size > 0 && isDevMode()) {
156
+ const keys = [...this.active.keys()];
157
+ const head = keys.slice(0, 10).join(', ');
158
+ const more = keys.length > 10 ? ` ...(+${keys.length - 10} more)` : '';
159
+ console.warn(`[${this.diagnosticId}] clear() called with ${this.active.size} ` +
160
+ 'still-active boundaries. Missed stop? ' +
161
+ `Leaked keys: ${head}${more}`);
162
+ }
163
+ this.active.clear();
164
+ this.missedUpdates.clear();
165
+ }
166
+ }
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm91bmRhcnlTdGF0ZVN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9Cb3VuZGFyeVN0YXRlU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkRHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXZELE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsMERBQTBEO0lBQ3pDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUVwRDs7K0NBRTJDO0lBQzFCLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUUzRDsyRUFDdUU7SUFDdEQsWUFBWSxDQUFTO0lBRXRDLFlBQVksWUFBWSxHQUFHLHNCQUFzQjtRQUMvQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBRUQsd0VBQXdFO0lBRXhFOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLEdBQVcsRUFBRSxPQUFlO1FBQ2hDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUN4QyxPQUFPLENBQUMsSUFBSSxDQUNWLElBQUksSUFBSSxDQUFDLFlBQVksWUFBWSxHQUFHLHFDQUFxQztnQkFDdkUsMEVBQTBFLENBQzdFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxHQUFXLEVBQUUsT0FBaUM7UUFDbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7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dCI6WyIvKipcbiAqIEJvdW5kYXJ5U3RhdGVTdG9yZTxUU3RhdGU+IOKAlCBjb25jcmV0ZSwgY29tcG9zYWJsZSBwZXItYm91bmRhcnlcbiAqIHRyYW5zaWVudCBzdGF0ZSBzdG9yYWdlLlxuICpcbiAqIFBhdHRlcm46IENPTVBPU0lUSU9OIHByaW1pdGl2ZS4gQ29uY3JldGUgY2xhc3Mg4oCUIGluc3RhbnRpYXRlIHdpdGhcbiAqICAgICAgICAgIGBuZXcgQm91bmRhcnlTdGF0ZVN0b3JlPFRTdGF0ZT4oKWAgYW5kIG93biBpdCBhcyBhIGZpZWxkXG4gKiAgICAgICAgICBvbiB5b3VyIHJlY29yZGVyLiBSZXBsYWNlcyB0aGUgYWJzdHJhY3RcbiAqICAgICAgICAgIGBCb3VuZGFyeVN0YXRlVHJhY2tlcjxUU3RhdGU+YCBiYXNlIGNsYXNzIGZvciB0aGUgdjVcbiAqICAgICAgICAgIFwib25lIHB1cnBvc2UgcGVyIHJlY29yZGVyXCIgcnVsZS5cbiAqIFJvbGU6ICAgIFwiV2hhdCdzIHRoZSBMSVZFIHRyYW5zaWVudCBzdGF0ZSBvZiBldmVyeSBjdXJyZW50bHktYWN0aXZlXG4gKiAgICAgICAgICBib3VuZGFyeT9cIiBBIGJvdW5kYXJ5IGlzIGEgbWF0Y2hlZCBldmVudCBwYWlyIGBbc3RhcnQsIHN0b3BdYFxuICogICAgICAgICAgYnJhY2tldGluZyBhbiBpbnRlcnZhbCAoZS5nLiwgYChsbG1fc3RhcnQsIGxsbV9lbmQpYCkuXG4gKiAgICAgICAgICBCZXR3ZWVuIHRoZSBicmFja2V0cywgaW50ZXJtZWRpYXRlIGV2ZW50cyBldm9sdmUgdGhlXG4gKiAgICAgICAgICBib3VuZGFyeSdzIHN0YXRlLiBPbiBgc3RvcGAsIHRoZSBzdGF0ZSBjbGVhcnMuXG4gKlxuICogQWxnb3JpdGhtaWNhbGx5IHRoaXMgaXMgdGhlICoqREZTIGJyYWNrZXQtc2VxdWVuY2UgcGF0dGVybioqIOKAlCB0aGVcbiAqIGBhY3RpdmVgIG1hcCBpcyB0aGUgb3Blbi1icmFja2V0cyBzdGFjayBhdCBhbnkgbW9tZW50LlxuICpcbiAqICoqTGlmZWN5Y2xlIGNvbnRyYWN0IOKAlCBTVFJJQ1Q6KiogZXZlcnkgYHN0YXJ0KGtleSwgLi4uKWAgY2FsbCBNVVNUXG4gKiBiZSBwYWlyZWQgd2l0aCBhIGBzdG9wKGtleSlgIGNhbGwuIEZhaWx1cmUgdG8gd2lyZSBzdG9wIHByb2R1Y2VzIGFcbiAqIG1lbW9yeSBsZWFrOiB0aGUgYWN0aXZlIG1hcCBncm93cyB3aXRob3V0IGJvdW5kLlxuICpcbiAqICoqQ29uY3VycmVuY3kgLyBuZXN0aW5nOioqIGNvbmN1cnJlbnQgYm91bmRhcmllcyAocGFyYWxsZWwgYnJhbmNoZXNcbiAqIHdpdGggdHdvIExMTSBjYWxscyBhY3RpdmUgYXQgb25jZSkgd29yayBjb3JyZWN0bHkg4oCUIGVhY2ggaXMga2V5ZWRcbiAqIGluZGVwZW5kZW50bHkuIE5lc3RlZCBib3VuZGFyaWVzIG9mIERJRkZFUkVOVCBLSU5EUyByZXF1aXJlXG4gKiBTRVBBUkFURSBzdG9yZSBpbnN0YW5jZXMg4oCUIG9uZSBwZXIga2luZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQm91bmRhcnlTdGF0ZVN0b3JlIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICogaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyLCBFbWl0RXZlbnQgfSBmcm9tICdmb290cHJpbnRqcyc7XG4gKlxuICogaW50ZXJmYWNlIExMTUxpdmVTdGF0ZSB7IHBhcnRpYWw6IHN0cmluZzsgdG9rZW5zOiBudW1iZXI7IH1cbiAqXG4gKiBjbGFzcyBMaXZlTExNVHJhY2tlciBpbXBsZW1lbnRzIENvbWJpbmVkUmVjb3JkZXIge1xuICogICByZWFkb25seSBpZCA9ICdsaXZlLWxsbSc7XG4gKiAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUgPSBuZXcgQm91bmRhcnlTdGF0ZVN0b3JlPExMTUxpdmVTdGF0ZT4oKTtcbiAqXG4gKiAgIG9uRW1pdChldmVudDogRW1pdEV2ZW50KTogdm9pZCB7XG4gKiAgICAgaWYgKGV2ZW50Lm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5zdHJlYW0ubGxtX3N0YXJ0Jykge1xuICogICAgICAgdGhpcy5zdG9yZS5zdGFydChldmVudC5ydW50aW1lU3RhZ2VJZCwgeyBwYXJ0aWFsOiAnJywgdG9rZW5zOiAwIH0pO1xuICogICAgIH0gZWxzZSBpZiAoZXZlbnQubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LnN0cmVhbS5sbG1fZW5kJykge1xuICogICAgICAgdGhpcy5zdG9yZS5zdG9wKGV2ZW50LnJ1bnRpbWVTdGFnZUlkKTtcbiAqICAgICB9IGVsc2UgaWYgKGV2ZW50Lm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5zdHJlYW0udG9rZW4nKSB7XG4gKiAgICAgICB0aGlzLnN0b3JlLnVwZGF0ZShldmVudC5ydW50aW1lU3RhZ2VJZCwgKHMpID0+ICh7XG4gKiAgICAgICAgIHBhcnRpYWw6IHMucGFydGlhbCArIChldmVudC5wYXlsb2FkIGFzIHsgY29udGVudDogc3RyaW5nIH0pLmNvbnRlbnQsXG4gKiAgICAgICAgIHRva2Vuczogcy50b2tlbnMgKyAxLFxuICogICAgICAgfSkpO1xuICogICAgIH1cbiAqICAgfVxuICpcbiAqICAgaXNJbkZsaWdodCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc3RvcmUuaGFzQWN0aXZlOyB9XG4gKiAgIGdldFBhcnRpYWwocmlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICogICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChyaWQpPy5wYXJ0aWFsID8/ICcnO1xuICogICB9XG4gKlxuICogICBjbGVhcigpIHsgdGhpcy5zdG9yZS5jbGVhcigpOyB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9zY29wZS9kZXRlY3RDaXJjdWxhci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBCb3VuZGFyeVN0YXRlU3RvcmU8VFN0YXRlPiB7XG4gIC8qKiBPcGVuLWJyYWNrZXRzIHN0YWNrOiBrZXkg4oaSIGN1cnJlbnQgdHJhbnNpZW50IHN0YXRlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZSA9IG5ldyBNYXA8c3RyaW5nLCBUU3RhdGU+KCk7XG5cbiAgLyoqIFBlci1rZXkgY291bnQgb2YgYHVwZGF0ZWAgY2FsbHMgdGhhdCBsYW5kZWQgd2l0aG91dCBhIG1hdGNoaW5nXG4gICAqICBhY3RpdmUgYm91bmRhcnkuIERyaXZlcyByYXRlLWxpbWl0ZWQgZGV2LW1vZGUgd2FybmluZ3Mgc28gYVxuICAgKiAgc3R1Y2sgbG9vcCBkb2Vzbid0IHNwYW0gdGhlIGNvbnNvbGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbWlzc2VkVXBkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgLyoqIE9wdGlvbmFsIGlkIGZvciBkaWFnbm9zdGljcyDigJQgcGFzc2VkIHRvIGRldi1tb2RlIHdhcm5pbmdzIHNvIHRoZVxuICAgKiAgc291cmNlIG9mIHRoZSBsZWFrIGlzIGVhc3kgdG8gZmluZCB3aGVuIG11bHRpcGxlIHN0b3JlcyBjb2V4aXN0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRpYWdub3N0aWNJZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpYWdub3N0aWNJZCA9ICdib3VuZGFyeS1zdGF0ZS1zdG9yZScpIHtcbiAgICB0aGlzLmRpYWdub3N0aWNJZCA9IGRpYWdub3N0aWNJZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBNdXRhdG9ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogT3BlbiBhIG5ldyBib3VuZGFyeSB3aXRoIGluaXRpYWwgdHJhbnNpZW50IHN0YXRlLiBJZiBhIGJvdW5kYXJ5XG4gICAqIHdpdGggdGhlIHNhbWUgYGtleWAgaXMgYWxyZWFkeSBhY3RpdmUsIHRoZSBwcmlvciBzdGF0ZSBpc1xuICAgKiBvdmVyd3JpdHRlbiAobGFzdC13cml0ZXItd2lucykuIERldiBtb2RlIHdhcm5zIOKAlCB1c3VhbGx5XG4gICAqIGluZGljYXRlcyBhIG1pc3NlZCBgc3RvcGAgdXBzdHJlYW0uXG4gICAqL1xuICBzdGFydChrZXk6IHN0cmluZywgaW5pdGlhbDogVFN0YXRlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlLmhhcyhrZXkpICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbJHt0aGlzLmRpYWdub3N0aWNJZH1dIHN0YXJ0KCcke2tleX0nKSBjYWxsZWQgd2hpbGUgYW4gYWN0aXZlIGJvdW5kYXJ5IGAgK1xuICAgICAgICAgICdhbHJlYWR5IGV4aXN0cy4gT3ZlcndyaXRpbmcgcHJpb3Igc3RhdGUg4oCUIGxpa2VseSBhIG1pc3NlZCBzdG9wIHVwc3RyZWFtLicsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZS5zZXQoa2V5LCBpbml0aWFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdm9sdmUgdGhlIHRyYW5zaWVudCBzdGF0ZSBvZiBhbiBhY3RpdmUgYm91bmRhcnkgdXNpbmcgYSBwdXJlXG4gICAqIHVwZGF0ZXIgZnVuY3Rpb24uIFNpbGVudCBuby1vcCBpZiBubyBib3VuZGFyeSBpcyBhY3RpdmUgZm9yIGBrZXlgXG4gICAqIChkZWZlbnNpdmUgYWdhaW5zdCBvdXQtb2Ytb3JkZXIgZXZlbnRzKS4gRGV2IG1vZGUgbG9ncyBhIHJhdGUtXG4gICAqIGxpbWl0ZWQgd2FybmluZy5cbiAgICovXG4gIHVwZGF0ZShrZXk6IHN0cmluZywgdXBkYXRlcjogKHByZXY6IFRTdGF0ZSkgPT4gVFN0YXRlKTogdm9pZCB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5hY3RpdmUuZ2V0KGtleSk7XG4gICAgaWYgKGN1ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc3QgbiA9ICh0aGlzLm1pc3NlZFVwZGF0ZXMuZ2V0KGtleSkgPz8gMCkgKyAxO1xuICAgICAgICB0aGlzLm1pc3NlZFVwZGF0ZXMuc2V0KGtleSwgbik7XG4gICAgICAgIGlmIChuID09PSAxKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbJHt0aGlzLmRpYWdub3N0aWNJZH1dIHVwZGF0ZSgnJHtrZXl9Jykg4oCUIG5vIGFjdGl2ZSBib3VuZGFyeS4gVXBkYXRlIGRyb3BwZWQuYCk7XG4gICAgICAgIH0gZWxzZSBpZiAobiA9PT0gMTAgfHwgbiA9PT0gMTAwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbJHt0aGlzLmRpYWdub3N0aWNJZH1dIHVwZGF0ZSgnJHtrZXl9Jykg4oCUICR7bn0gZHJvcHBlZCB1cGRhdGVzLiBXaXJpbmcgYnVnP2ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlLnNldChrZXksIHVwZGF0ZXIoY3VyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGJvdW5kYXJ5IGlkZW50aWZpZWQgYnkgYGtleWAgYW5kIHJldHVybiBpdHMgRklOQUxcbiAgICogdHJhbnNpZW50IHN0YXRlIChzbyB0aGUgY29uc3VtZXIgY2FuIGRvIGFueSBjbGVhbnVwIOKAlCBlLmcuLCBlbWl0XG4gICAqIGEgc25hcHNob3QgdG8gYSBTZXF1ZW5jZVN0b3JlIGZvciBkdXJhYmxlIHN0b3JhZ2UpLlxuICAgKi9cbiAgc3RvcChrZXk6IHN0cmluZyk6IFRTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmluYWwgPSB0aGlzLmFjdGl2ZS5nZXQoa2V5KTtcbiAgICB0aGlzLmFjdGl2ZS5kZWxldGUoa2V5KTtcbiAgICByZXR1cm4gZmluYWw7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZCAoTygxKSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEN1cnJlbnQgdHJhbnNpZW50IHN0YXRlIG9mIE9ORSBhY3RpdmUgYm91bmRhcnkuIGB1bmRlZmluZWRgIGlmIG5vXG4gICAqICBib3VuZGFyeSBpcyBhY3RpdmUgZm9yIGBrZXlgLiAqL1xuICBnZXQoa2V5OiBzdHJpbmcpOiBUU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZS5nZXQoa2V5KTtcbiAgfVxuXG4gIC8qKiBBbGwgY3VycmVudGx5LWFjdGl2ZSBib3VuZGFyaWVzLlxuICAgKlxuICAgKiAgKipUeXBlLW9ubHkgcmVhZG9ubHk6KiogVHlwZVNjcmlwdCBwcmV2ZW50cyBtdXRhdGlvbiB0aHJvdWdoXG4gICAqICBgUmVhZG9ubHlNYXBgLCBidXQgYSBydW50aW1lIGNhc3Qgb3Igbm9uLVRTIGNvbnN1bWVyIGNhbiBtdXRhdGVcbiAgICogIHRoZSB1bmRlcmx5aW5nIE1hcCBhbmQgY29ycnVwdCBzdGF0ZS4gRG9uJ3QuICovXG4gIGdldEFsbCgpOiBSZWFkb25seU1hcDxzdHJpbmcsIFRTdGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgfVxuXG4gIC8qKiBUcnVlIGlmIGFueSBib3VuZGFyeSBpcyBjdXJyZW50bHkgYWN0aXZlLiBPKDEpLiAqL1xuICBnZXQgaGFzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZS5zaXplID4gMDtcbiAgfVxuXG4gIC8qKiBOdW1iZXIgb2YgY3VycmVudGx5LWFjdGl2ZSBib3VuZGFyaWVzLiBPKDEpLiAqL1xuICBnZXQgYWN0aXZlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmUuc2l6ZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc2V0IGFsbCB0cmFuc2llbnQgc3RhdGUuIENhbGxlZCBieSByZWNvcmRlciBjb21wb3NlcnMgZnJvbVxuICAgKiB0aGVpciBvd24gYGNsZWFyKClgIG1ldGhvZCwgd2hpY2ggdGhlIGV4ZWN1dG9yIGludm9rZXMgYmVmb3JlXG4gICAqIGVhY2ggcnVuLlxuICAgKlxuICAgKiBEZXYgbW9kZSB3YXJucyBpZiBhbnkgYm91bmRhcmllcyBhcmUgc3RpbGwgYWN0aXZlIHdoZW4gY2FsbGVkIOKAlFxuICAgKiBsaWtlbHkgaW5kaWNhdGVzIGEgbWlzc2VkIGBzdG9wYCB1cHN0cmVhbS4gTGVha2VkIGtleXMgYXJlIGxpc3RlZFxuICAgKiAodHJ1bmNhdGVkIHRvIDEwKSBzbyB0aGUgd2lyaW5nIGJ1ZyBpcyBmaW5kYWJsZS5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZS5zaXplID4gMCAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc3Qga2V5cyA9IFsuLi50aGlzLmFjdGl2ZS5rZXlzKCldO1xuICAgICAgY29uc3QgaGVhZCA9IGtleXMuc2xpY2UoMCwgMTApLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBtb3JlID0ga2V5cy5sZW5ndGggPiAxMCA/IGAgLi4uKCske2tleXMubGVuZ3RoIC0gMTB9IG1vcmUpYCA6ICcnO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgWyR7dGhpcy5kaWFnbm9zdGljSWR9XSBjbGVhcigpIGNhbGxlZCB3aXRoICR7dGhpcy5hY3RpdmUuc2l6ZX0gYCArXG4gICAgICAgICAgJ3N0aWxsLWFjdGl2ZSBib3VuZGFyaWVzLiBNaXNzZWQgc3RvcD8gJyArXG4gICAgICAgICAgYExlYWtlZCBrZXlzOiAke2hlYWR9JHttb3JlfWAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZS5jbGVhcigpO1xuICAgIHRoaXMubWlzc2VkVXBkYXRlcy5jbGVhcigpO1xuICB9XG59XG4iXX0=