footprintjs 4.16.0 → 4.17.2

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 (188) hide show
  1. package/AGENTS.md +567 -82
  2. package/CLAUDE.md +57 -0
  3. package/README.md +2 -0
  4. package/dist/advanced.js +4 -2
  5. package/dist/detach.js +78 -0
  6. package/dist/esm/advanced.js +2 -1
  7. package/dist/esm/detach.js +57 -0
  8. package/dist/esm/lib/builder/FlowChartBuilder.js +171 -61
  9. package/dist/esm/lib/contract/openapi.js +4 -5
  10. package/dist/esm/lib/contract/schema.js +115 -4
  11. package/dist/esm/lib/decide/decide.js +4 -5
  12. package/dist/esm/lib/decide/evidence.js +3 -2
  13. package/dist/esm/lib/detach/drivers/immediate.js +66 -0
  14. package/dist/esm/lib/detach/drivers/microtaskBatch.js +113 -0
  15. package/dist/esm/lib/detach/drivers/sendBeacon.js +78 -0
  16. package/dist/esm/lib/detach/drivers/setImmediate.js +81 -0
  17. package/dist/esm/lib/detach/drivers/setTimeout.js +69 -0
  18. package/dist/esm/lib/detach/drivers/workerThread.js +117 -0
  19. package/dist/esm/lib/detach/flush.js +91 -0
  20. package/dist/esm/lib/detach/handle.js +134 -0
  21. package/dist/esm/lib/detach/registry.js +97 -0
  22. package/dist/esm/lib/detach/runChild.js +40 -0
  23. package/dist/esm/lib/detach/spawn.js +86 -0
  24. package/dist/esm/lib/detach/types.js +37 -0
  25. package/dist/esm/lib/engine/errors/errorInfo.js +4 -4
  26. package/dist/esm/lib/engine/graph/StageNode.js +2 -2
  27. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +9 -8
  28. package/dist/esm/lib/engine/handlers/ContinuationResolver.js +12 -9
  29. package/dist/esm/lib/engine/handlers/DeciderHandler.js +7 -8
  30. package/dist/esm/lib/engine/handlers/ExtractorRunner.js +14 -8
  31. package/dist/esm/lib/engine/handlers/NodeResolver.js +5 -3
  32. package/dist/esm/lib/engine/handlers/RuntimeStructureManager.js +11 -14
  33. package/dist/esm/lib/engine/handlers/SelectorHandler.js +9 -9
  34. package/dist/esm/lib/engine/handlers/StageRunner.js +9 -11
  35. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +13 -12
  36. package/dist/esm/lib/engine/handlers/SubflowInputMapper.js +4 -4
  37. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +85 -96
  38. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +18 -36
  39. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +6 -5
  40. package/dist/esm/lib/engine/narrative/recorders/AdaptiveNarrativeFlowRecorder.js +7 -6
  41. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +10 -10
  42. package/dist/esm/lib/engine/narrative/recorders/MilestoneNarrativeFlowRecorder.js +5 -3
  43. package/dist/esm/lib/engine/narrative/recorders/ProgressiveNarrativeFlowRecorder.js +4 -3
  44. package/dist/esm/lib/engine/narrative/recorders/RLENarrativeFlowRecorder.js +4 -4
  45. package/dist/esm/lib/engine/narrative/recorders/SeparateNarrativeFlowRecorder.js +5 -6
  46. package/dist/esm/lib/engine/narrative/recorders/SilentNarrativeFlowRecorder.js +5 -6
  47. package/dist/esm/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.js +5 -3
  48. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +97 -71
  49. package/dist/esm/lib/memory/DiagnosticCollector.js +6 -8
  50. package/dist/esm/lib/memory/EventLog.js +5 -3
  51. package/dist/esm/lib/memory/SharedMemory.js +3 -2
  52. package/dist/esm/lib/memory/StageContext.js +44 -14
  53. package/dist/esm/lib/memory/TransactionBuffer.js +9 -8
  54. package/dist/esm/lib/memory/backtrack.js +3 -4
  55. package/dist/esm/lib/memory/commitLogUtils.js +2 -2
  56. package/dist/esm/lib/memory/utils.js +2 -3
  57. package/dist/esm/lib/pause/types.js +33 -14
  58. package/dist/esm/lib/reactive/createTypedScope.js +10 -8
  59. package/dist/esm/lib/reactive/types.js +3 -1
  60. package/dist/esm/lib/recorder/BoundaryStateTracker.js +263 -0
  61. package/dist/esm/lib/recorder/CompositeRecorder.js +3 -1
  62. package/dist/esm/lib/recorder/InOutRecorder.js +5 -6
  63. package/dist/esm/lib/recorder/KeyedRecorder.js +2 -4
  64. package/dist/esm/lib/recorder/QualityRecorder.js +15 -14
  65. package/dist/esm/lib/recorder/SequenceRecorder.js +11 -12
  66. package/dist/esm/lib/recorder/TopologyRecorder.js +36 -40
  67. package/dist/esm/lib/recorder/index.js +2 -1
  68. package/dist/esm/lib/recorder/qualityTrace.js +4 -5
  69. package/dist/esm/lib/runner/ExecutionRuntime.js +20 -4
  70. package/dist/esm/lib/runner/FlowChartExecutor.js +99 -55
  71. package/dist/esm/lib/runner/RunContext.js +5 -3
  72. package/dist/esm/lib/runner/RunnableChart.js +7 -9
  73. package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -5
  74. package/dist/esm/lib/schema/errors.js +4 -3
  75. package/dist/esm/lib/schema/validate.js +4 -5
  76. package/dist/esm/lib/scope/ScopeFacade.js +52 -35
  77. package/dist/esm/lib/scope/providers/baseStateCompatible.js +9 -9
  78. package/dist/esm/lib/scope/providers/guards.js +2 -2
  79. package/dist/esm/lib/scope/recorders/DebugRecorder.js +9 -7
  80. package/dist/esm/lib/scope/recorders/MetricRecorder.js +10 -8
  81. package/dist/esm/lib/scope/state/zod/defineScopeFromZod.js +2 -3
  82. package/dist/esm/lib/scope/state/zod/resolver.js +2 -3
  83. package/dist/esm/lib/scope/state/zod/scopeFactory.js +16 -20
  84. package/dist/esm/lib/scope/state/zod/utils/validateHelper.js +57 -14
  85. package/dist/esm/trace.js +4 -1
  86. package/dist/lib/builder/FlowChartBuilder.js +171 -61
  87. package/dist/lib/contract/openapi.js +4 -5
  88. package/dist/lib/contract/schema.js +115 -4
  89. package/dist/lib/decide/decide.js +4 -5
  90. package/dist/lib/decide/evidence.js +3 -2
  91. package/dist/lib/detach/drivers/immediate.js +70 -0
  92. package/dist/lib/detach/drivers/microtaskBatch.js +117 -0
  93. package/dist/lib/detach/drivers/sendBeacon.js +82 -0
  94. package/dist/lib/detach/drivers/setImmediate.js +85 -0
  95. package/dist/lib/detach/drivers/setTimeout.js +73 -0
  96. package/dist/lib/detach/drivers/workerThread.js +121 -0
  97. package/dist/lib/detach/flush.js +95 -0
  98. package/dist/lib/detach/handle.js +140 -0
  99. package/dist/lib/detach/registry.js +106 -0
  100. package/dist/lib/detach/runChild.js +67 -0
  101. package/dist/lib/detach/spawn.js +92 -0
  102. package/dist/lib/detach/types.js +38 -0
  103. package/dist/lib/engine/errors/errorInfo.js +4 -4
  104. package/dist/lib/engine/graph/StageNode.js +2 -2
  105. package/dist/lib/engine/handlers/ChildrenExecutor.js +9 -8
  106. package/dist/lib/engine/handlers/ContinuationResolver.js +12 -9
  107. package/dist/lib/engine/handlers/DeciderHandler.js +7 -8
  108. package/dist/lib/engine/handlers/ExtractorRunner.js +14 -8
  109. package/dist/lib/engine/handlers/NodeResolver.js +5 -3
  110. package/dist/lib/engine/handlers/RuntimeStructureManager.js +11 -14
  111. package/dist/lib/engine/handlers/SelectorHandler.js +9 -9
  112. package/dist/lib/engine/handlers/StageRunner.js +9 -11
  113. package/dist/lib/engine/handlers/SubflowExecutor.js +13 -12
  114. package/dist/lib/engine/handlers/SubflowInputMapper.js +4 -4
  115. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +85 -96
  116. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +18 -36
  117. package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +6 -5
  118. package/dist/lib/engine/narrative/recorders/AdaptiveNarrativeFlowRecorder.js +7 -6
  119. package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +10 -10
  120. package/dist/lib/engine/narrative/recorders/MilestoneNarrativeFlowRecorder.js +5 -3
  121. package/dist/lib/engine/narrative/recorders/ProgressiveNarrativeFlowRecorder.js +4 -3
  122. package/dist/lib/engine/narrative/recorders/RLENarrativeFlowRecorder.js +4 -4
  123. package/dist/lib/engine/narrative/recorders/SeparateNarrativeFlowRecorder.js +5 -6
  124. package/dist/lib/engine/narrative/recorders/SilentNarrativeFlowRecorder.js +5 -6
  125. package/dist/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.js +5 -3
  126. package/dist/lib/engine/traversal/FlowchartTraverser.js +97 -71
  127. package/dist/lib/memory/DiagnosticCollector.js +6 -8
  128. package/dist/lib/memory/EventLog.js +5 -3
  129. package/dist/lib/memory/SharedMemory.js +3 -2
  130. package/dist/lib/memory/StageContext.js +44 -14
  131. package/dist/lib/memory/TransactionBuffer.js +9 -8
  132. package/dist/lib/memory/backtrack.js +3 -4
  133. package/dist/lib/memory/commitLogUtils.js +2 -2
  134. package/dist/lib/memory/utils.js +2 -3
  135. package/dist/lib/pause/types.js +33 -14
  136. package/dist/lib/reactive/createTypedScope.js +10 -8
  137. package/dist/lib/reactive/types.js +3 -1
  138. package/dist/lib/recorder/BoundaryStateTracker.js +267 -0
  139. package/dist/lib/recorder/CompositeRecorder.js +3 -1
  140. package/dist/lib/recorder/InOutRecorder.js +5 -6
  141. package/dist/lib/recorder/KeyedRecorder.js +2 -4
  142. package/dist/lib/recorder/QualityRecorder.js +15 -14
  143. package/dist/lib/recorder/SequenceRecorder.js +11 -12
  144. package/dist/lib/recorder/TopologyRecorder.js +36 -40
  145. package/dist/lib/recorder/index.js +4 -2
  146. package/dist/lib/recorder/qualityTrace.js +4 -5
  147. package/dist/lib/runner/ExecutionRuntime.js +20 -4
  148. package/dist/lib/runner/FlowChartExecutor.js +99 -55
  149. package/dist/lib/runner/RunContext.js +5 -3
  150. package/dist/lib/runner/RunnableChart.js +7 -9
  151. package/dist/lib/runner/getSubtreeSnapshot.js +4 -5
  152. package/dist/lib/schema/errors.js +4 -3
  153. package/dist/lib/schema/validate.js +4 -5
  154. package/dist/lib/scope/ScopeFacade.js +52 -35
  155. package/dist/lib/scope/providers/baseStateCompatible.js +9 -9
  156. package/dist/lib/scope/providers/guards.js +2 -2
  157. package/dist/lib/scope/recorders/DebugRecorder.js +9 -7
  158. package/dist/lib/scope/recorders/MetricRecorder.js +10 -8
  159. package/dist/lib/scope/state/zod/defineScopeFromZod.js +2 -3
  160. package/dist/lib/scope/state/zod/resolver.js +2 -3
  161. package/dist/lib/scope/state/zod/scopeFactory.js +16 -20
  162. package/dist/lib/scope/state/zod/utils/validateHelper.js +57 -14
  163. package/dist/trace.js +6 -2
  164. package/dist/types/advanced.d.ts +1 -0
  165. package/dist/types/detach.d.ts +59 -0
  166. package/dist/types/lib/builder/FlowChartBuilder.d.ts +81 -0
  167. package/dist/types/lib/detach/drivers/immediate.d.ts +39 -0
  168. package/dist/types/lib/detach/drivers/microtaskBatch.d.ts +57 -0
  169. package/dist/types/lib/detach/drivers/sendBeacon.d.ts +38 -0
  170. package/dist/types/lib/detach/drivers/setImmediate.d.ts +32 -0
  171. package/dist/types/lib/detach/drivers/setTimeout.d.ts +34 -0
  172. package/dist/types/lib/detach/drivers/workerThread.d.ts +50 -0
  173. package/dist/types/lib/detach/flush.d.ts +62 -0
  174. package/dist/types/lib/detach/handle.d.ts +83 -0
  175. package/dist/types/lib/detach/registry.d.ts +82 -0
  176. package/dist/types/lib/detach/runChild.d.ts +41 -0
  177. package/dist/types/lib/detach/spawn.d.ts +64 -0
  178. package/dist/types/lib/detach/types.d.ts +200 -0
  179. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +0 -1
  180. package/dist/types/lib/engine/types.d.ts +0 -1
  181. package/dist/types/lib/reactive/types.d.ts +4 -0
  182. package/dist/types/lib/recorder/BoundaryStateTracker.d.ts +215 -0
  183. package/dist/types/lib/recorder/index.d.ts +1 -0
  184. package/dist/types/lib/runner/FlowChartExecutor.d.ts +28 -0
  185. package/dist/types/lib/scope/ScopeFacade.d.ts +4 -0
  186. package/dist/types/lib/scope/state/zod/utils/validateHelper.d.ts +13 -1
  187. package/dist/types/trace.d.ts +1 -0
  188. package/package.json +6 -1
@@ -33,28 +33,33 @@ const summarizeValue_js_1 = require("../../scope/recorders/summarizeValue.js");
33
33
  * narrative only surfaces control-flow lifecycle events.
34
34
  */
35
35
  class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
36
+ id;
37
+ /**
38
+ * Pending scope ops keyed by runtimeStageId. Flushed in onStageExecuted/onDecision.
39
+ *
40
+ * Keying by runtimeStageId (not stageName) ensures correctness when parallel fork
41
+ * branches contain stages with the same name — each execution step has a unique ID.
42
+ */
43
+ pendingOps = new Map();
44
+ /** Per-subflow stage counters. Key '' = root flow. */
45
+ stageCounters = new Map();
46
+ /** Per-subflow first-stage flags. Key '' = root flow. */
47
+ firstStageFlags = new Map();
48
+ /** Visit count per stageId — detects loop iterations (count > 1 = loop). */
49
+ stageVisitCounts = new Map();
50
+ includeStepNumbers;
51
+ includeValues;
52
+ maxValueLength;
53
+ formatValue;
54
+ renderer;
36
55
  constructor(options) {
37
- var _a, _b, _c, _d, _e;
38
56
  super();
39
- /**
40
- * Pending scope ops keyed by runtimeStageId. Flushed in onStageExecuted/onDecision.
41
- *
42
- * Keying by runtimeStageId (not stageName) ensures correctness when parallel fork
43
- * branches contain stages with the same name — each execution step has a unique ID.
44
- */
45
- this.pendingOps = new Map();
46
- /** Per-subflow stage counters. Key '' = root flow. */
47
- this.stageCounters = new Map();
48
- /** Per-subflow first-stage flags. Key '' = root flow. */
49
- this.firstStageFlags = new Map();
50
- /** Visit count per stageId — detects loop iterations (count > 1 = loop). */
51
- this.stageVisitCounts = new Map();
52
- this.id = (_a = options === null || options === void 0 ? void 0 : options.id) !== null && _a !== void 0 ? _a : 'combined-narrative';
53
- this.includeStepNumbers = (_b = options === null || options === void 0 ? void 0 : options.includeStepNumbers) !== null && _b !== void 0 ? _b : true;
54
- this.includeValues = (_c = options === null || options === void 0 ? void 0 : options.includeValues) !== null && _c !== void 0 ? _c : true;
55
- this.maxValueLength = (_d = options === null || options === void 0 ? void 0 : options.maxValueLength) !== null && _d !== void 0 ? _d : 80;
56
- this.formatValue = (_e = options === null || options === void 0 ? void 0 : options.formatValue) !== null && _e !== void 0 ? _e : summarizeValue_js_1.summarizeValue;
57
- this.renderer = options === null || options === void 0 ? void 0 : options.renderer;
57
+ this.id = options?.id ?? 'combined-narrative';
58
+ this.includeStepNumbers = options?.includeStepNumbers ?? true;
59
+ this.includeValues = options?.includeValues ?? true;
60
+ this.maxValueLength = options?.maxValueLength ?? 80;
61
+ this.formatValue = options?.formatValue ?? summarizeValue_js_1.summarizeValue;
62
+ this.renderer = options?.renderer;
58
63
  }
59
64
  // ── Scope channel (fires first, during stage execution) ───────────────
60
65
  onRead(event) {
@@ -76,15 +81,14 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
76
81
  }
77
82
  // ── Flow channel (fires after stage execution) ────────────────────────
78
83
  onStageExecuted(event) {
79
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
80
- const stageId = (_a = event.traversalContext) === null || _a === void 0 ? void 0 : _a.stageId;
81
- const runtimeStageId = (_b = event.traversalContext) === null || _b === void 0 ? void 0 : _b.runtimeStageId;
82
- const sfKey = (_d = (_c = event.traversalContext) === null || _c === void 0 ? void 0 : _c.subflowId) !== null && _d !== void 0 ? _d : '';
84
+ const stageId = event.traversalContext?.stageId;
85
+ const runtimeStageId = event.traversalContext?.runtimeStageId;
86
+ const sfKey = event.traversalContext?.subflowId ?? '';
83
87
  const stageNum = this.incrementStageCounter(sfKey);
84
88
  const isFirst = this.consumeFirstStageFlag(sfKey);
85
89
  // Track visit count per stageId to detect loop iterations
86
- const visitKey = stageId !== null && stageId !== void 0 ? stageId : event.stageName;
87
- const visitCount = ((_e = this.stageVisitCounts.get(visitKey)) !== null && _e !== void 0 ? _e : 0) + 1;
90
+ const visitKey = stageId ?? event.stageName;
91
+ const visitCount = (this.stageVisitCounts.get(visitKey) ?? 0) + 1;
88
92
  this.stageVisitCounts.set(visitKey, visitCount);
89
93
  const ctx = {
90
94
  stageName: event.stageName,
@@ -93,8 +97,8 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
93
97
  description: event.description,
94
98
  loopIteration: visitCount > 1 ? visitCount - 1 : undefined,
95
99
  };
96
- const text = (_h = (_g = (_f = this.renderer) === null || _f === void 0 ? void 0 : _f.renderStage) === null || _g === void 0 ? void 0 : _g.call(_f, ctx)) !== null && _h !== void 0 ? _h : this.defaultRenderStage(ctx);
97
- const sfId = (_j = event.traversalContext) === null || _j === void 0 ? void 0 : _j.subflowId;
100
+ const text = this.renderer?.renderStage?.(ctx) ?? this.defaultRenderStage(ctx);
101
+ const sfId = event.traversalContext?.subflowId;
98
102
  this.emit({
99
103
  type: 'stage',
100
104
  text,
@@ -107,11 +111,10 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
107
111
  this.flushOps(runtimeStageId, sfId, stageId, event.stageName);
108
112
  }
109
113
  onDecision(event) {
110
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
111
- const stageId = (_a = event.traversalContext) === null || _a === void 0 ? void 0 : _a.stageId;
112
- const runtimeStageId = (_b = event.traversalContext) === null || _b === void 0 ? void 0 : _b.runtimeStageId;
114
+ const stageId = event.traversalContext?.stageId;
115
+ const runtimeStageId = event.traversalContext?.runtimeStageId;
113
116
  // Emit the decider stage entry (deciders don't fire onStageExecuted)
114
- const sfKey = (_d = (_c = event.traversalContext) === null || _c === void 0 ? void 0 : _c.subflowId) !== null && _d !== void 0 ? _d : '';
117
+ const sfKey = event.traversalContext?.subflowId ?? '';
115
118
  const stageNum = this.incrementStageCounter(sfKey);
116
119
  const isFirst = this.consumeFirstStageFlag(sfKey);
117
120
  const stageCtx = {
@@ -120,7 +123,7 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
120
123
  isFirst,
121
124
  description: event.description,
122
125
  };
123
- const stageText = (_g = (_f = (_e = this.renderer) === null || _e === void 0 ? void 0 : _e.renderStage) === null || _f === void 0 ? void 0 : _f.call(_e, stageCtx)) !== null && _g !== void 0 ? _g : this.defaultRenderStage(stageCtx);
126
+ const stageText = this.renderer?.renderStage?.(stageCtx) ?? this.defaultRenderStage(stageCtx);
124
127
  this.emit({
125
128
  type: 'stage',
126
129
  text: stageText,
@@ -128,9 +131,9 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
128
131
  stageName: event.decider,
129
132
  stageId,
130
133
  runtimeStageId,
131
- subflowId: (_h = event.traversalContext) === null || _h === void 0 ? void 0 : _h.subflowId,
134
+ subflowId: event.traversalContext?.subflowId,
132
135
  });
133
- this.flushOps(runtimeStageId, (_j = event.traversalContext) === null || _j === void 0 ? void 0 : _j.subflowId, stageId, event.decider);
136
+ this.flushOps(runtimeStageId, event.traversalContext?.subflowId, stageId, event.decider);
134
137
  // Emit the condition entry as a nested sub-item (depth 1) of the stage above.
135
138
  const decisionCtx = {
136
139
  decider: event.decider,
@@ -139,7 +142,7 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
139
142
  rationale: event.rationale,
140
143
  evidence: event.evidence,
141
144
  };
142
- const conditionText = (_m = (_l = (_k = this.renderer) === null || _k === void 0 ? void 0 : _k.renderDecision) === null || _l === void 0 ? void 0 : _l.call(_k, decisionCtx)) !== null && _m !== void 0 ? _m : this.defaultRenderDecision(decisionCtx);
145
+ const conditionText = this.renderer?.renderDecision?.(decisionCtx) ?? this.defaultRenderDecision(decisionCtx);
143
146
  this.emit({
144
147
  type: 'condition',
145
148
  text: conditionText,
@@ -147,45 +150,42 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
147
150
  stageName: event.decider,
148
151
  stageId,
149
152
  runtimeStageId,
150
- subflowId: (_o = event.traversalContext) === null || _o === void 0 ? void 0 : _o.subflowId,
153
+ subflowId: event.traversalContext?.subflowId,
151
154
  });
152
155
  }
153
156
  onNext() {
154
157
  // No-op. onStageExecuted already has the description for the next stage.
155
158
  }
156
159
  onFork(event) {
157
- var _a, _b, _c, _d, _e, _f;
158
160
  const ctx = { children: event.children };
159
- const text = (_c = (_b = (_a = this.renderer) === null || _a === void 0 ? void 0 : _a.renderFork) === null || _b === void 0 ? void 0 : _b.call(_a, ctx)) !== null && _c !== void 0 ? _c : this.defaultRenderFork(ctx);
161
+ const text = this.renderer?.renderFork?.(ctx) ?? this.defaultRenderFork(ctx);
160
162
  this.emit({
161
163
  type: 'fork',
162
164
  text,
163
165
  depth: 0,
164
- stageId: (_d = event.traversalContext) === null || _d === void 0 ? void 0 : _d.stageId,
165
- runtimeStageId: (_e = event.traversalContext) === null || _e === void 0 ? void 0 : _e.runtimeStageId,
166
- subflowId: (_f = event.traversalContext) === null || _f === void 0 ? void 0 : _f.subflowId,
166
+ stageId: event.traversalContext?.stageId,
167
+ runtimeStageId: event.traversalContext?.runtimeStageId,
168
+ subflowId: event.traversalContext?.subflowId,
167
169
  });
168
170
  }
169
171
  onSelected(event) {
170
- var _a, _b, _c, _d, _e, _f;
171
172
  const ctx = {
172
173
  selected: event.selected,
173
174
  total: event.total,
174
175
  evidence: event.evidence,
175
176
  };
176
- const text = (_c = (_b = (_a = this.renderer) === null || _a === void 0 ? void 0 : _a.renderSelected) === null || _b === void 0 ? void 0 : _b.call(_a, ctx)) !== null && _c !== void 0 ? _c : this.defaultRenderSelected(ctx);
177
+ const text = this.renderer?.renderSelected?.(ctx) ?? this.defaultRenderSelected(ctx);
177
178
  this.emit({
178
179
  type: 'selector',
179
180
  text,
180
181
  depth: 0,
181
- stageId: (_d = event.traversalContext) === null || _d === void 0 ? void 0 : _d.stageId,
182
- runtimeStageId: (_e = event.traversalContext) === null || _e === void 0 ? void 0 : _e.runtimeStageId,
183
- subflowId: (_f = event.traversalContext) === null || _f === void 0 ? void 0 : _f.subflowId,
182
+ stageId: event.traversalContext?.stageId,
183
+ runtimeStageId: event.traversalContext?.runtimeStageId,
184
+ subflowId: event.traversalContext?.subflowId,
184
185
  });
185
186
  }
186
187
  onSubflowEntry(event) {
187
- var _a, _b, _c, _d, _e, _f, _g, _h;
188
- const sfKey = (_a = event.subflowId) !== null && _a !== void 0 ? _a : '';
188
+ const sfKey = event.subflowId ?? '';
189
189
  this.stageCounters.delete(sfKey);
190
190
  this.firstStageFlags.delete(sfKey);
191
191
  const ctx = {
@@ -194,10 +194,10 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
194
194
  description: event.description,
195
195
  mappedInput: event.mappedInput,
196
196
  };
197
- const text = (_d = (_c = (_b = this.renderer) === null || _b === void 0 ? void 0 : _b.renderSubflow) === null || _c === void 0 ? void 0 : _c.call(_b, ctx)) !== null && _d !== void 0 ? _d : this.defaultRenderSubflow(ctx);
198
- const rid = (_e = event.traversalContext) === null || _e === void 0 ? void 0 : _e.runtimeStageId;
199
- const sid = (_f = event.traversalContext) === null || _f === void 0 ? void 0 : _f.stageId;
200
- const sfId = (_g = event.traversalContext) === null || _g === void 0 ? void 0 : _g.subflowId;
197
+ const text = this.renderer?.renderSubflow?.(ctx) ?? this.defaultRenderSubflow(ctx);
198
+ const rid = event.traversalContext?.runtimeStageId;
199
+ const sid = event.traversalContext?.stageId;
200
+ const sfId = event.traversalContext?.subflowId;
201
201
  this.emit({
202
202
  type: 'subflow',
203
203
  text,
@@ -247,7 +247,7 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
247
247
  // to the hardcoded template
248
248
  // If no renderer at all, use the hardcoded template.
249
249
  let text;
250
- if ((_h = this.renderer) === null || _h === void 0 ? void 0 : _h.renderOp) {
250
+ if (this.renderer?.renderOp) {
251
251
  const customText = this.renderer.renderOp(opCtx);
252
252
  if (customText === null)
253
253
  continue; // excluded on purpose
@@ -276,10 +276,9 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
276
276
  }
277
277
  }
278
278
  onSubflowExit(event) {
279
- var _a, _b, _c, _d, _e, _f;
280
- const rid = (_a = event.traversalContext) === null || _a === void 0 ? void 0 : _a.runtimeStageId;
281
- const sid = (_b = event.traversalContext) === null || _b === void 0 ? void 0 : _b.stageId;
282
- const sfId = (_c = event.traversalContext) === null || _c === void 0 ? void 0 : _c.subflowId;
279
+ const rid = event.traversalContext?.runtimeStageId;
280
+ const sid = event.traversalContext?.stageId;
281
+ const sfId = event.traversalContext?.subflowId;
283
282
  // NOTE: output state is NOT emitted as step entries because it may contain
284
283
  // unredacted values from the subflow's internal scope. The subflow exit
285
284
  // header is sufficient — drill into the subflow for details.
@@ -288,7 +287,7 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
288
287
  direction: 'exit',
289
288
  outputState: event.outputState,
290
289
  };
291
- const text = (_f = (_e = (_d = this.renderer) === null || _d === void 0 ? void 0 : _d.renderSubflow) === null || _e === void 0 ? void 0 : _e.call(_d, ctx)) !== null && _f !== void 0 ? _f : this.defaultRenderSubflow(ctx);
290
+ const text = this.renderer?.renderSubflow?.(ctx) ?? this.defaultRenderSubflow(ctx);
292
291
  this.emit({
293
292
  type: 'subflow',
294
293
  text,
@@ -301,38 +300,35 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
301
300
  });
302
301
  }
303
302
  onLoop(event) {
304
- var _a, _b, _c, _d, _e, _f;
305
303
  const ctx = {
306
304
  target: event.target,
307
305
  iteration: event.iteration,
308
306
  description: event.description,
309
307
  };
310
- const text = (_c = (_b = (_a = this.renderer) === null || _a === void 0 ? void 0 : _a.renderLoop) === null || _b === void 0 ? void 0 : _b.call(_a, ctx)) !== null && _c !== void 0 ? _c : this.defaultRenderLoop(ctx);
308
+ const text = this.renderer?.renderLoop?.(ctx) ?? this.defaultRenderLoop(ctx);
311
309
  this.emit({
312
310
  type: 'loop',
313
311
  text,
314
312
  depth: 0,
315
- stageId: (_d = event.traversalContext) === null || _d === void 0 ? void 0 : _d.stageId,
316
- runtimeStageId: (_e = event.traversalContext) === null || _e === void 0 ? void 0 : _e.runtimeStageId,
317
- subflowId: (_f = event.traversalContext) === null || _f === void 0 ? void 0 : _f.subflowId,
313
+ stageId: event.traversalContext?.stageId,
314
+ runtimeStageId: event.traversalContext?.runtimeStageId,
315
+ subflowId: event.traversalContext?.subflowId,
318
316
  });
319
317
  }
320
318
  onBreak(event) {
321
- var _a, _b, _c, _d, _e, _f;
322
319
  const ctx = { stageName: event.stageName };
323
- const text = (_c = (_b = (_a = this.renderer) === null || _a === void 0 ? void 0 : _a.renderBreak) === null || _b === void 0 ? void 0 : _b.call(_a, ctx)) !== null && _c !== void 0 ? _c : this.defaultRenderBreak(ctx);
320
+ const text = this.renderer?.renderBreak?.(ctx) ?? this.defaultRenderBreak(ctx);
324
321
  this.emit({
325
322
  type: 'break',
326
323
  text,
327
324
  depth: 0,
328
325
  stageName: event.stageName,
329
- stageId: (_d = event.traversalContext) === null || _d === void 0 ? void 0 : _d.stageId,
330
- runtimeStageId: (_e = event.traversalContext) === null || _e === void 0 ? void 0 : _e.runtimeStageId,
331
- subflowId: (_f = event.traversalContext) === null || _f === void 0 ? void 0 : _f.subflowId,
326
+ stageId: event.traversalContext?.stageId,
327
+ runtimeStageId: event.traversalContext?.runtimeStageId,
328
+ subflowId: event.traversalContext?.subflowId,
332
329
  });
333
330
  }
334
331
  onPause(event) {
335
- var _a, _b, _c, _d;
336
332
  // Both channels fire onPause with different payload shapes. Narrative only
337
333
  // surfaces the control-flow variant (which has stageName/stageId). Data
338
334
  // channel's PauseEvent is ignored to avoid duplicate entries.
@@ -346,13 +342,12 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
346
342
  text,
347
343
  depth: 0,
348
344
  stageName: event.stageName,
349
- stageId: (_b = (_a = event.traversalContext) === null || _a === void 0 ? void 0 : _a.stageId) !== null && _b !== void 0 ? _b : event.stageId,
350
- runtimeStageId: (_c = event.traversalContext) === null || _c === void 0 ? void 0 : _c.runtimeStageId,
351
- subflowId: (_d = event.traversalContext) === null || _d === void 0 ? void 0 : _d.subflowId,
345
+ stageId: event.traversalContext?.stageId ?? event.stageId,
346
+ runtimeStageId: event.traversalContext?.runtimeStageId,
347
+ subflowId: event.traversalContext?.subflowId,
352
348
  });
353
349
  }
354
350
  onResume(event) {
355
- var _a, _b, _c, _d;
356
351
  // Same isFlowEvent discriminant as onPause — ignore scope ResumeEvent.
357
352
  if (!(0, CombinedRecorder_js_1.isFlowEvent)(event))
358
353
  return;
@@ -365,13 +360,12 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
365
360
  text,
366
361
  depth: 0,
367
362
  stageName: event.stageName,
368
- stageId: (_b = (_a = event.traversalContext) === null || _a === void 0 ? void 0 : _a.stageId) !== null && _b !== void 0 ? _b : event.stageId,
369
- runtimeStageId: (_c = event.traversalContext) === null || _c === void 0 ? void 0 : _c.runtimeStageId,
370
- subflowId: (_d = event.traversalContext) === null || _d === void 0 ? void 0 : _d.subflowId,
363
+ stageId: event.traversalContext?.stageId ?? event.stageId,
364
+ runtimeStageId: event.traversalContext?.runtimeStageId,
365
+ subflowId: event.traversalContext?.subflowId,
371
366
  });
372
367
  }
373
368
  onError(event) {
374
- var _a, _b, _c, _d, _e, _f, _g, _h;
375
369
  // Narrative only surfaces the control-flow variant of errors (has
376
370
  // stageName + message). Scope-level ErrorEvent is captured elsewhere.
377
371
  if (!(0, CombinedRecorder_js_1.isFlowEvent)(event))
@@ -379,7 +373,7 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
379
373
  if (typeof event.message !== 'string')
380
374
  return;
381
375
  let validationIssues;
382
- if ((_b = (_a = event.structuredError) === null || _a === void 0 ? void 0 : _a.issues) === null || _b === void 0 ? void 0 : _b.length) {
376
+ if (event.structuredError?.issues?.length) {
383
377
  validationIssues = event.structuredError.issues
384
378
  .map((issue) => {
385
379
  const path = issue.path.length > 0 ? issue.path.join('.') : '(root)';
@@ -392,15 +386,15 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
392
386
  message: event.message,
393
387
  validationIssues,
394
388
  };
395
- const text = (_e = (_d = (_c = this.renderer) === null || _c === void 0 ? void 0 : _c.renderError) === null || _d === void 0 ? void 0 : _d.call(_c, ctx)) !== null && _e !== void 0 ? _e : this.defaultRenderError(ctx);
389
+ const text = this.renderer?.renderError?.(ctx) ?? this.defaultRenderError(ctx);
396
390
  this.emit({
397
391
  type: 'error',
398
392
  text,
399
393
  depth: 0,
400
394
  stageName: event.stageName,
401
- stageId: (_f = event.traversalContext) === null || _f === void 0 ? void 0 : _f.stageId,
402
- runtimeStageId: (_g = event.traversalContext) === null || _g === void 0 ? void 0 : _g.runtimeStageId,
403
- subflowId: (_h = event.traversalContext) === null || _h === void 0 ? void 0 : _h.subflowId,
395
+ stageId: event.traversalContext?.stageId,
396
+ runtimeStageId: event.traversalContext?.runtimeStageId,
397
+ subflowId: event.traversalContext?.subflowId,
404
398
  });
405
399
  }
406
400
  // ── Emit channel (Phase 3) ────────────────────────────────────────────
@@ -437,8 +431,7 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
437
431
  getEntriesBySubflow() {
438
432
  const result = { '': [] };
439
433
  this.forEachEntry((entry) => {
440
- var _a;
441
- const key = (_a = entry.subflowId) !== null && _a !== void 0 ? _a : '';
434
+ const key = entry.subflowId ?? '';
442
435
  if (!result[key])
443
436
  result[key] = [];
444
437
  result[key].push(entry);
@@ -455,8 +448,7 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
455
448
  }
456
449
  // ── Private helpers ───────────────────────────────────────────────────
457
450
  incrementStageCounter(subflowKey) {
458
- var _a;
459
- const current = (_a = this.stageCounters.get(subflowKey)) !== null && _a !== void 0 ? _a : 0;
451
+ const current = this.stageCounters.get(subflowKey) ?? 0;
460
452
  const next = current + 1;
461
453
  this.stageCounters.set(subflowKey, next);
462
454
  return next;
@@ -477,7 +469,6 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
477
469
  ops.push({ ...op, stepNumber: ops.length + 1 });
478
470
  }
479
471
  flushOps(runtimeStageId, subflowId, stageId, stageName) {
480
- var _a, _b;
481
472
  if (runtimeStageId === undefined)
482
473
  return;
483
474
  const ops = this.pendingOps.get(runtimeStageId);
@@ -507,7 +498,7 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
507
498
  payloadSummary,
508
499
  };
509
500
  let emitText;
510
- if ((_a = this.renderer) === null || _a === void 0 ? void 0 : _a.renderEmit) {
501
+ if (this.renderer?.renderEmit) {
511
502
  const custom = this.renderer.renderEmit(emitCtx);
512
503
  if (custom === null)
513
504
  continue; // deliberately excluded
@@ -541,7 +532,7 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
541
532
  operation: op.operation,
542
533
  stepNumber: op.stepNumber,
543
534
  };
544
- const text = ((_b = this.renderer) === null || _b === void 0 ? void 0 : _b.renderOp) ? this.renderer.renderOp(opCtx) : this.defaultRenderOp(opCtx);
535
+ const text = this.renderer?.renderOp ? this.renderer.renderOp(opCtx) : this.defaultRenderOp(opCtx);
545
536
  if (text == null)
546
537
  continue;
547
538
  this.emit({
@@ -593,13 +584,12 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
593
584
  return this.includeValues ? `${stepPrefix}Write ${ctx.key} = ${ctx.valueSummary}` : `${stepPrefix}Write ${ctx.key}`;
594
585
  }
595
586
  defaultRenderDecision(ctx) {
596
- var _a, _b, _c;
597
587
  const branchName = ctx.chosen;
598
588
  let conditionText;
599
589
  if (ctx.evidence) {
600
590
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
601
591
  const evidence = ctx.evidence;
602
- const matchedRule = (_a = evidence.rules) === null || _a === void 0 ? void 0 : _a.find((r) => r.matched);
592
+ const matchedRule = evidence.rules?.find((r) => r.matched);
603
593
  if (matchedRule) {
604
594
  const label = matchedRule.label ? ` "${matchedRule.label}"` : '';
605
595
  if (matchedRule.type === 'filter') {
@@ -612,7 +602,7 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
612
602
  }
613
603
  }
614
604
  else {
615
- const erroredCount = (_c = (_b = evidence.rules) === null || _b === void 0 ? void 0 : _b.filter((r) => r.matchError !== undefined).length) !== null && _c !== void 0 ? _c : 0;
605
+ const erroredCount = evidence.rules?.filter((r) => r.matchError !== undefined).length ?? 0;
616
606
  const errorNote = erroredCount > 0 ? ` (${erroredCount} rule${erroredCount > 1 ? 's' : ''} threw errors)` : '';
617
607
  conditionText = `No rules matched${errorNote}, fell back to default: ${branchName}.`;
618
608
  }
@@ -636,11 +626,10 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
636
626
  return `[Parallel]: Forking into ${ctx.children.length} parallel paths: ${names}.`;
637
627
  }
638
628
  defaultRenderSelected(ctx) {
639
- var _a, _b;
640
629
  if (ctx.evidence) {
641
630
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
642
631
  const evidence = ctx.evidence;
643
- const matched = (_b = (_a = evidence.rules) === null || _a === void 0 ? void 0 : _a.filter((r) => r.matched)) !== null && _b !== void 0 ? _b : [];
632
+ const matched = evidence.rules?.filter((r) => r.matched) ?? [];
644
633
  const parts = matched.map((r) => {
645
634
  const label = r.label ? ` "${r.label}"` : '';
646
635
  if (r.type === 'filter') {
@@ -680,4 +669,4 @@ class CombinedNarrativeRecorder extends SequenceRecorder_js_1.SequenceRecorder {
680
669
  }
681
670
  }
682
671
  exports.CombinedNarrativeRecorder = CombinedNarrativeRecorder;
683
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBR0gsNEVBQWlFO0FBRWpFLDRFQUFzRTtBQUN0RSwrRUFBeUU7QUFzRHpFLDhFQUE4RTtBQUU5RTs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQWEseUJBQTBCLFNBQVEsc0NBQXdDO0lBdUJyRixZQUFZLE9BQTREOztRQUN0RSxLQUFLLEVBQUUsQ0FBQztRQXJCVjs7Ozs7V0FLRztRQUNLLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztRQUNyRCxzREFBc0Q7UUFDOUMsa0JBQWEsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUNsRCx5REFBeUQ7UUFDakQsb0JBQWUsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztRQUNyRCw0RUFBNEU7UUFDcEUscUJBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFVbkQsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxFQUFFLG1DQUFJLG9CQUFvQixDQUFDO1FBQzlDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxrQkFBa0IsbUNBQUksSUFBSSxDQUFDO1FBQzlELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsYUFBYSxtQ0FBSSxJQUFJLENBQUM7UUFDcEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxjQUFjLG1DQUFJLEVBQUUsQ0FBQztRQUNwRCxJQUFJLENBQUMsV0FB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QUFDLENBQUMsV0FBVyxHQUFHLENBQUMsU0FBUyxZQUFZLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztJQUN4RCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsR0FBdUI7UUFDaEQsT0FBTyx3QkFBd0IsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDO0lBQ2xELENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxHQUF1QjtRQUNoRCxJQUFJLElBQUksR0FBRyx3QkFBd0IsR0FBRyxDQUFDLFNBQVMsS0FBSyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUM7UUFDcEUsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6QixJQUFJLElBQUksdUJBQXVCLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDO1FBQ3pELENBQUM7UUFDRCxPQUFPLFlBQVksSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBdHFCRCw4REFzcUJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIOKAlCBJbmxpbmUgbmFycmF0aXZlIGJ1aWxkZXIgdGhhdCBtZXJnZXMgZmxvdyArIGRhdGEgZHVyaW5nIHRyYXZlcnNhbC5cbiAqXG4gKiBFeHRlbmRzIFNlcXVlbmNlUmVjb3JkZXI8Q29tYmluZWROYXJyYXRpdmVFbnRyeT4gZm9yIGR1YWwtaW5kZXhlZCBzdG9yYWdlIChvcmRlcmVkIHNlcXVlbmNlXG4gKiArIE8oMSkgcGVyLXN0ZXAgbG9va3VwIGJ5IHJ1bnRpbWVTdGFnZUlkKS4gSW1wbGVtZW50cyBgQ29tYmluZWRSZWNvcmRlcmAg4oCUIHRoZSBsaWJyYXJ5J3NcbiAqIGZpcnN0LWNsYXNzIGFic3RyYWN0aW9uIGZvciBvYnNlcnZlcnMgdGhhdCBzcGFuIGJvdGggZGF0YS1mbG93IGFuZCBjb250cm9sLWZsb3cgc3RyZWFtcy5cbiAqXG4gKiBFdmVudCBvcmRlcmluZyBndWFyYW50ZWVzIHRoaXMgd29ya3M6XG4gKiAgIDEuIFNjb3BlIGV2ZW50cyAob25SZWFkLCBvbldyaXRlKSBmaXJlIERVUklORyBzdGFnZSBleGVjdXRpb25cbiAqICAgMi4gRmxvdyBldmVudHMgKG9uU3RhZ2VFeGVjdXRlZCwgb25EZWNpc2lvbikgZmlyZSBBRlRFUiBzdGFnZSBleGVjdXRpb25cbiAqICAgMy4gQm90aCBjYXJyeSB0aGUgc2FtZSBgc3RhZ2VOYW1lYCDigJQgbm8gbWF0Y2hpbmcgYW1iaWd1aXR5XG4gKlxuICogU28gd2UgYnVmZmVyIHNjb3BlIG9wcyBwZXItc3RhZ2UsIHRoZW4gd2hlbiB0aGUgZmxvdyBldmVudCBhcnJpdmVzLFxuICogZW1pdCB0aGUgc3RhZ2UgZW50cnkgKyBmbHVzaCB0aGUgYnVmZmVyZWQgb3BzIGluIG9uZSBwYXNzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJy4uLy4uL3JlY29yZGVyL0NvbWJpbmVkUmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgaXNGbG93RXZlbnQgfSBmcm9tICcuLi8uLi9yZWNvcmRlci9Db21iaW5lZFJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdEV2ZW50IH0gZnJvbSAnLi4vLi4vcmVjb3JkZXIvRW1pdFJlY29yZGVyLmpzJztcbmltcG9ydCB7IFNlcXVlbmNlUmVjb3JkZXIgfSBmcm9tICcuLi8uLi9yZWNvcmRlci9TZXF1ZW5jZVJlY29yZGVyLmpzJztcbmltcG9ydCB7IHN1bW1hcml6ZVZhbHVlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcmVjb3JkZXJzL3N1bW1hcml6ZVZhbHVlLmpzJztcbmltcG9ydCB0eXBlIHsgRXJyb3JFdmVudCwgUGF1c2VFdmVudCwgUmVhZEV2ZW50LCBSZXN1bWVFdmVudCwgV3JpdGVFdmVudCB9IGZyb20gJy4uLy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQnJlYWtSZW5kZXJDb250ZXh0LFxuICBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5LFxuICBEZWNpc2lvblJlbmRlckNvbnRleHQsXG4gIEVtaXRSZW5kZXJDb250ZXh0LFxuICBFcnJvclJlbmRlckNvbnRleHQsXG4gIEZvcmtSZW5kZXJDb250ZXh0LFxuICBMb29wUmVuZGVyQ29udGV4dCxcbiAgTmFycmF0aXZlUmVuZGVyZXIsXG4gIE9wUmVuZGVyQ29udGV4dCxcbiAgU2VsZWN0ZWRSZW5kZXJDb250ZXh0LFxuICBTdGFnZVJlbmRlckNvbnRleHQsXG4gIFN1YmZsb3dSZW5kZXJDb250ZXh0LFxufSBmcm9tICcuL25hcnJhdGl2ZVR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRmxvd0JyZWFrRXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93RXJyb3JFdmVudCxcbiAgRmxvd0ZvcmtFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd1BhdXNlRXZlbnQsXG4gIEZsb3dSZXN1bWVFdmVudCxcbiAgRmxvd1NlbGVjdGVkRXZlbnQsXG4gIEZsb3dTdGFnZUV2ZW50LFxuICBGbG93U3ViZmxvd0V2ZW50LFxufSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgQnVmZmVyZWRPcCB7XG4gIHR5cGU6ICdyZWFkJyB8ICd3cml0ZScgfCAnZW1pdCc7XG4gIC8qKiBGb3IgcmVhZC93cml0ZTogc2NvcGUga2V5LiBGb3IgZW1pdDogdGhlIGV2ZW50IG5hbWUuICovXG4gIGtleTogc3RyaW5nO1xuICByYXdWYWx1ZTogdW5rbm93bjtcbiAgb3BlcmF0aW9uPzogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnO1xuICBzdGVwTnVtYmVyOiBudW1iZXI7XG4gIC8qKiBPbmx5IHNldCBmb3IgdHlwZT0nZW1pdCcg4oCUIGNhcnJpZXMgdGhlIGZ1bGwgRW1pdEV2ZW50IGZvciByZW5kZXJpbmcuICovXG4gIGVtaXRFdmVudD86IEVtaXRFdmVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyB7XG4gIGluY2x1ZGVTdGVwTnVtYmVycz86IGJvb2xlYW47XG4gIGluY2x1ZGVWYWx1ZXM/OiBib29sZWFuO1xuICBtYXhWYWx1ZUxlbmd0aD86IG51bWJlcjtcbiAgLyoqIEN1c3RvbSB2YWx1ZSBmb3JtYXR0ZXIuIENhbGxlZCBhdCByZW5kZXIgdGltZSAoZmx1c2hPcHMpLCBub3QgY2FwdHVyZSB0aW1lLlxuICAgKiAgUmVjZWl2ZXMgdGhlIHJhdyB2YWx1ZSBhbmQgbWF4VmFsdWVMZW5ndGguIERlZmF1bHRzIHRvIHN1bW1hcml6ZVZhbHVlKCkuICovXG4gIGZvcm1hdFZhbHVlPzogKHZhbHVlOiB1bmtub3duLCBtYXhMZW46IG51bWJlcikgPT4gc3RyaW5nO1xuICAvKiogUGx1Z2dhYmxlIHJlbmRlcmVyIGZvciBjdXN0b21pemluZyBuYXJyYXRpdmUgb3V0cHV0LiBVbmltcGxlbWVudGVkIG1ldGhvZHNcbiAgICogIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCBFbmdsaXNoIHJlbmRlcmVyLiBTZWUgTmFycmF0aXZlUmVuZGVyZXIgZG9jcy4gKi9cbiAgcmVuZGVyZXI/OiBOYXJyYXRpdmVSZW5kZXJlcjtcbn1cblxuLy8g4pSA4pSAIFJlY29yZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEltcGxlbWVudHMgYENvbWJpbmVkUmVjb3JkZXJgIOKAlCB0aGUgbGlicmFyeSdzIGZpcnN0LWNsYXNzIGFic3RyYWN0aW9uIGZvclxuICogb2JzZXJ2ZXJzIHRoYXQgc3BhbiBib3RoIGRhdGEtZmxvdyAoYFJlY29yZGVyYCkgYW5kIGNvbnRyb2wtZmxvd1xuICogKGBGbG93UmVjb3JkZXJgKSBzdHJlYW1zLiBPbmUgYGlkYCwgcm91dGVkIHRvIGJvdGggY2hhbm5lbHMgdmlhXG4gKiBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlciguLi4pYCAob3IgZXF1aXZhbGVudGx5IHZpYVxuICogYGV4ZWN1dG9yLmVuYWJsZU5hcnJhdGl2ZSguLi4pYCB3aGljaCBhdXRvLWNyZWF0ZXMgYW4gaW5zdGFuY2UpLlxuICpcbiAqIEZvciBzaGFyZWQtbWV0aG9kLW5hbWUgZXZlbnRzIChgb25FcnJvcmAsIGBvblBhdXNlYCwgYG9uUmVzdW1lYCkgdGhlXG4gKiBoYW5kbGVyIGFjY2VwdHMgdGhlIHVuaW9uIHBheWxvYWQgdHlwZTsgd2UgZGlzY3JpbWluYXRlIHZpYSBgaXNGbG93RXZlbnRgLlxuICogU2NvcGUgdmFyaWFudHMgb2YgdGhlc2UgZXZlbnRzIGFyZSBkZWxpYmVyYXRlbHkgaWdub3JlZCBoZXJlIOKAlCB0aGVcbiAqIG5hcnJhdGl2ZSBvbmx5IHN1cmZhY2VzIGNvbnRyb2wtZmxvdyBsaWZlY3ljbGUgZXZlbnRzLlxuICovXG5leHBvcnQgY2xhc3MgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciBleHRlbmRzIFNlcXVlbmNlUmVjb3JkZXI8Q29tYmluZWROYXJyYXRpdmVFbnRyeT4gaW1wbGVtZW50cyBDb21iaW5lZFJlY29yZGVyIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogUGVuZGluZyBzY29wZSBvcHMga2V5ZWQgYnkgcnVudGltZVN0YWdlSWQuIEZsdXNoZWQgaW4gb25TdGFnZUV4ZWN1dGVkL29uRGVjaXNpb24uXG4gICAqXG4gICAqIEtleWluZyBieSBydW50aW1lU3RhZ2VJZCAobm90IHN0YWdlTmFtZSkgZW5zdXJlcyBjb3JyZWN0bmVzcyB3aGVuIHBhcmFsbGVsIGZvcmtcbiAgICogYnJhbmNoZXMgY29udGFpbiBzdGFnZXMgd2l0aCB0aGUgc2FtZSBuYW1lIOKAlCBlYWNoIGV4ZWN1dGlvbiBzdGVwIGhhcyBhIHVuaXF1ZSBJRC5cbiAgICovXG4gIHByaXZhdGUgcGVuZGluZ09wcyA9IG5ldyBNYXA8c3RyaW5nLCBCdWZmZXJlZE9wW10+KCk7XG4gIC8qKiBQZXItc3ViZmxvdyBzdGFnZSBjb3VudGVycy4gS2V5ICcnID0gcm9vdCBmbG93LiAqL1xuICBwcml2YXRlIHN0YWdlQ291bnRlcnMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAvKiogUGVyLXN1YmZsb3cgZmlyc3Qtc3RhZ2UgZmxhZ3MuIEtleSAnJyA9IHJvb3QgZmxvdy4gKi9cbiAgcHJpdmF0ZSBmaXJzdFN0YWdlRmxhZ3MgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcbiAgLyoqIFZpc2l0IGNvdW50IHBlciBzdGFnZUlkIOKAlCBkZXRlY3RzIGxvb3AgaXRlcmF0aW9ucyAoY291bnQgPiAxID0gbG9vcCkuICovXG4gIHByaXZhdGUgc3RhZ2VWaXNpdENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgcHJpdmF0ZSBpbmNsdWRlU3RlcE51bWJlcnM6IGJvb2xlYW47XG4gIHByaXZhdGUgaW5jbHVkZVZhbHVlczogYm9vbGVhbjtcbiAgcHJpdmF0ZSBtYXhWYWx1ZUxlbmd0aDogbnVtYmVyO1xuICBwcml2YXRlIGZvcm1hdFZhbHVlOiAodmFsdWU6IHVua25vd24sIG1heExlbjogbnVtYmVyKSA9PiBzdHJpbmc7XG4gIHByaXZhdGUgcmVuZGVyZXI/OiBOYXJyYXRpdmVSZW5kZXJlcjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMgJiB7IGlkPzogc3RyaW5nIH0pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaWQgPSBvcHRpb25zPy5pZCA/PyAnY29tYmluZWQtbmFycmF0aXZlJztcbiAgICB0aGlzLmluY2x1ZGVTdGVwTnVtYmVycyA9IG9wdGlvbnM/LmluY2x1ZGVTdGVwTnVtYmVycyA/PyB0cnVlO1xuICAgIHRoaXMuaW5jbHVkZVZhbHVlcyA9IG9wdGlvbnM/LmluY2x1ZGVWYWx1ZXMgPz8gdHJ1ZTtcbiAgICB0aGlzLm1heFZhbHVlTGVuZ3RoID0gb3B0aW9ucz8ubWF4VmFsdWVMZW5ndGggPz8gODA7XG4gICAgdGhpcy5mb3JtYXRWYWx1ZSA9IG9wdGlvbnM/LmZvcm1hdFZhbHVlID8/IHN1bW1hcml6ZVZhbHVlO1xuICAgIHRoaXMucmVuZGVyZXIgPSBvcHRpb25zPy5yZW5kZXJlcjtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTY29wZSBjaGFubmVsIChmaXJlcyBmaXJzdCwgZHVyaW5nIHN0YWdlIGV4ZWN1dGlvbikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgb25SZWFkKGV2ZW50OiBSZWFkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIWV2ZW50LmtleSkgcmV0dXJuO1xuICAgIHRoaXMuYnVmZmVyT3AoZXZlbnQucnVudGltZVN0YWdlSWQsIHtcbiAgICAgIHR5cGU6ICdyZWFkJyxcbiAgICAgIGtleTogZXZlbnQua2V5LFxuICAgICAgcmF3VmFsdWU6IGV2ZW50LnZhbHVlLFxuICAgIH0pO1xuICB9XG5cbiAgb25Xcml0ZShldmVudDogV3JpdGVFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyT3AoZXZlbnQucnVudGltZVN0YWdlSWQsIHtcbiAgICAgIHR5cGU6ICd3cml0ZScsXG4gICAgICBrZXk6IGV2ZW50LmtleSxcbiAgICAgIHJhd1ZhbHVlOiBldmVudC52YWx1ZSxcbiAgICAgIG9wZXJhdGlvbjogZXZlbnQub3BlcmF0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIEZsb3cgY2hhbm5lbCAoZmlyZXMgYWZ0ZXIgc3RhZ2UgZXhlY3V0aW9uKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvblN0YWdlRXhlY3V0ZWQoZXZlbnQ6IEZsb3dTdGFnZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc3RhZ2VJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQ7XG4gICAgY29uc3QgcnVudGltZVN0YWdlSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBzZktleSA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCA/PyAnJztcbiAgICBjb25zdCBzdGFnZU51bSA9IHRoaXMuaW5jcmVtZW50U3RhZ2VDb3VudGVyKHNmS2V5KTtcbiAgICBjb25zdCBpc0ZpcnN0ID0gdGhpcy5jb25zdW1lRmlyc3RTdGFnZUZsYWcoc2ZLZXkpO1xuXG4gICAgLy8gVHJhY2sgdmlzaXQgY291bnQgcGVyIHN0YWdlSWQgdG8gZGV0ZWN0IGxvb3AgaXRlcmF0aW9uc1xuICAgIGNvbnN0IHZpc2l0S2V5ID0gc3RhZ2VJZCA/PyBldmVudC5zdGFnZU5hbWU7XG4gICAgY29uc3QgdmlzaXRDb3VudCA9ICh0aGlzLnN0YWdlVmlzaXRDb3VudHMuZ2V0KHZpc2l0S2V5KSA/PyAwKSArIDE7XG4gICAgdGhpcy5zdGFnZVZpc2l0Q291bnRzLnNldCh2aXNpdEtleSwgdmlzaXRDb3VudCk7XG5cbiAgICBjb25zdCBjdHg6IFN0YWdlUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VOdW1iZXI6IHN0YWdlTnVtLFxuICAgICAgaXNGaXJzdCxcbiAgICAgIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbixcbiAgICAgIGxvb3BJdGVyYXRpb246IHZpc2l0Q291bnQgPiAxID8gdmlzaXRDb3VudCAtIDEgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyU3RhZ2U/LihjdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlclN0YWdlKGN0eCk7XG5cbiAgICBjb25zdCBzZklkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkO1xuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IHNmSWQsXG4gICAgfSk7XG4gICAgdGhpcy5mbHVzaE9wcyhydW50aW1lU3RhZ2VJZCwgc2ZJZCwgc3RhZ2VJZCwgZXZlbnQuc3RhZ2VOYW1lKTtcbiAgfVxuXG4gIG9uRGVjaXNpb24oZXZlbnQ6IEZsb3dEZWNpc2lvbkV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc3RhZ2VJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQ7XG4gICAgY29uc3QgcnVudGltZVN0YWdlSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcblxuICAgIC8vIEVtaXQgdGhlIGRlY2lkZXIgc3RhZ2UgZW50cnkgKGRlY2lkZXJzIGRvbid0IGZpcmUgb25TdGFnZUV4ZWN1dGVkKVxuICAgIGNvbnN0IHNmS2V5ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkID8/ICcnO1xuICAgIGNvbnN0IHN0YWdlTnVtID0gdGhpcy5pbmNyZW1lbnRTdGFnZUNvdW50ZXIoc2ZLZXkpO1xuICAgIGNvbnN0IGlzRmlyc3QgPSB0aGlzLmNvbnN1bWVGaXJzdFN0YWdlRmxhZyhzZktleSk7XG5cbiAgICBjb25zdCBzdGFnZUN0eDogU3RhZ2VSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgc3RhZ2VOYW1lOiBldmVudC5kZWNpZGVyLFxuICAgICAgc3RhZ2VOdW1iZXI6IHN0YWdlTnVtLFxuICAgICAgaXNGaXJzdCxcbiAgICAgIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbixcbiAgICB9O1xuICAgIGNvbnN0IHN0YWdlVGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlclN0YWdlPy4oc3RhZ2VDdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlclN0YWdlKHN0YWdlQ3R4KTtcblxuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgdGV4dDogc3RhZ2VUZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LmRlY2lkZXIsXG4gICAgICBzdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgICB0aGlzLmZsdXNoT3BzKHJ1bnRpbWVTdGFnZUlkLCBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsIHN0YWdlSWQsIGV2ZW50LmRlY2lkZXIpO1xuXG4gICAgLy8gRW1pdCB0aGUgY29uZGl0aW9uIGVudHJ5IGFzIGEgbmVzdGVkIHN1Yi1pdGVtIChkZXB0aCAxKSBvZiB0aGUgc3RhZ2UgYWJvdmUuXG4gICAgY29uc3QgZGVjaXNpb25DdHg6IERlY2lzaW9uUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIGRlY2lkZXI6IGV2ZW50LmRlY2lkZXIsXG4gICAgICBjaG9zZW46IGV2ZW50LmNob3NlbixcbiAgICAgIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbixcbiAgICAgIHJhdGlvbmFsZTogZXZlbnQucmF0aW9uYWxlLFxuICAgICAgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlLFxuICAgIH07XG4gICAgY29uc3QgY29uZGl0aW9uVGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlckRlY2lzaW9uPy4oZGVjaXNpb25DdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlckRlY2lzaW9uKGRlY2lzaW9uQ3R4KTtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ2NvbmRpdGlvbicsXG4gICAgICB0ZXh0OiBjb25kaXRpb25UZXh0LFxuICAgICAgZGVwdGg6IDEsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LmRlY2lkZXIsXG4gICAgICBzdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uTmV4dCgpOiB2b2lkIHtcbiAgICAvLyBOby1vcC4gb25TdGFnZUV4ZWN1dGVkIGFscmVhZHkgaGFzIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIG5leHQgc3RhZ2UuXG4gIH1cblxuICBvbkZvcmsoZXZlbnQ6IEZsb3dGb3JrRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHg6IEZvcmtSZW5kZXJDb250ZXh0ID0geyBjaGlsZHJlbjogZXZlbnQuY2hpbGRyZW4gfTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyRm9yaz8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyRm9yayhjdHgpO1xuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAnZm9yaycsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICBvblNlbGVjdGVkKGV2ZW50OiBGbG93U2VsZWN0ZWRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eDogU2VsZWN0ZWRSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgc2VsZWN0ZWQ6IGV2ZW50LnNlbGVjdGVkLFxuICAgICAgdG90YWw6IGV2ZW50LnRvdGFsLFxuICAgICAgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlLFxuICAgIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlclNlbGVjdGVkPy4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJTZWxlY3RlZChjdHgpO1xuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAnc2VsZWN0b3InLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgb25TdWJmbG93RW50cnkoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzZktleSA9IGV2ZW50LnN1YmZsb3dJZCA/PyAnJztcbiAgICB0aGlzLnN0YWdlQ291bnRlcnMuZGVsZXRlKHNmS2V5KTtcbiAgICB0aGlzLmZpcnN0U3RhZ2VGbGFncy5kZWxldGUoc2ZLZXkpO1xuXG4gICAgY29uc3QgY3R4OiBTdWJmbG93UmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIG5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICBkaXJlY3Rpb246ICdlbnRyeScsXG4gICAgICBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24sXG4gICAgICBtYXBwZWRJbnB1dDogZXZlbnQubWFwcGVkSW5wdXQsXG4gICAgfTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyU3ViZmxvdz8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyU3ViZmxvdyhjdHgpO1xuICAgIGNvbnN0IHJpZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkO1xuICAgIGNvbnN0IHNpZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQ7XG4gICAgY29uc3Qgc2ZJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZDtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ3N1YmZsb3cnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5uYW1lLFxuICAgICAgc3RhZ2VJZDogc2lkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHJpZCxcbiAgICAgIHN1YmZsb3dJZDogc2ZJZCxcbiAgICAgIGRpcmVjdGlvbjogJ2VudHJ5JyxcbiAgICB9KTtcbiAgICAvLyBFbWl0IHBlci1rZXkgc3RlcCBlbnRyaWVzIGZvciBtYXBwZWQgaW5wdXRzLlxuICAgIC8vXG4gICAgLy8gUm91dGUgRUFDSCBrZXkgdGhyb3VnaCB0aGUgY29uc3VtZXIncyBgcmVuZGVyZXIucmVuZGVyT3BgIGhvb2sgYmVmb3JlXG4gICAgLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBoYXJkY29kZWQgYElucHV0OiAke2tleX0gPSAke3ZhbHVlU3VtbWFyeX1gXG4gICAgLy8gdGVtcGxhdGUuIFdpdGhvdXQgdGhpcyByb3V0aW5nLCBhIGNvbnN1bWVyIHRoYXQgcHJvdmlkZWQgYVxuICAgIC8vIGRvbWFpbi1hd2FyZSBgcmVuZGVyZXIucmVuZGVyT3BgICh0byByZW5kZXIgZS5nLiBgcGFyc2VkUmVzcG9uc2VgXG4gICAgLy8gb2JqZWN0cyBzZW1hbnRpY2FsbHkpIHdvdWxkIHNlZSBiZWF1dGlmdWwgb3V0cHV0IGZvciBzY29wZSB3cml0ZXNcbiAgICAvLyBidXQgZ2V0IHRoZSBnZW5lcmljIGtleS1saXN0IGZhbGxiYWNrIGZvciBzdWJmbG93IGlucHV0cyDigJQgdGhlXG4gICAgLy8gbGlicmFyeSdzIFwiY29tYmluZWQgbmFycmF0aXZlXCIgcHJvbWlzZSAob25lIHJlbmRlcmVyIGNvbnRyb2xzIHRoZVxuICAgIC8vIHdob2xlIG5hcnJhdGl2ZSkgd291bGQgc2lsZW50bHkgYnJlYWsuIFdlIGhvbm91ciBpdCBoZXJlLlxuICAgIC8vXG4gICAgLy8gVGhlIE9wUmVuZGVyQ29udGV4dCBpcyBidWlsdCB3aXRoIGB0eXBlOiAnd3JpdGUnYCBiZWNhdXNlIHNlbWFudGljYWxseVxuICAgIC8vIHRoZSBzdWJmbG93J3MgaW5pdGlhbCBzY29wZSBJUyBiZWluZyB3cml0dGVuIHZpYSB0aGUgcGFyZW50J3NcbiAgICAvLyBpbnB1dE1hcHBlci4gYG9wZXJhdGlvbjogJ3NldCdgIGxpa2V3aXNlIOKAlCB0aGlzIGlzIHRoZSBzdWJmbG93J3NcbiAgICAvLyBmaXJzdCBzaWdodCBvZiB0aGUga2V5LlxuICAgIC8vXG4gICAgLy8gVmFsdWVzIHNob3duIHdoZW4gaW5jbHVkZVZhbHVlcz10cnVlIOKAlCBjb25zdW1lciByZXNwb25zaWJsZSBmb3JcbiAgICAvLyByZWRhY3Rpb24gcG9saWN5IG9uIHRoZSBwYXJlbnQgc2NvcGUgKHJlZGFjdGVkIGtleXMgcHJvZHVjZVxuICAgIC8vICdbUkVEQUNURURdJyB2aWEgU2NvcGVGYWNhZGUpLlxuICAgIGlmIChldmVudC5tYXBwZWRJbnB1dCAmJiBPYmplY3Qua2V5cyhldmVudC5tYXBwZWRJbnB1dCkubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IHN0ZXBOdW1iZXIgPSAwO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXZlbnQubWFwcGVkSW5wdXQpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlU3VtbWFyeSA9IHRoaXMuZm9ybWF0VmFsdWUodmFsdWUsIHRoaXMubWF4VmFsdWVMZW5ndGgpO1xuICAgICAgICBjb25zdCBvcEN0eDogT3BSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgICAgIHR5cGU6ICd3cml0ZScsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHJhd1ZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICB2YWx1ZVN1bW1hcnksXG4gICAgICAgICAgb3BlcmF0aW9uOiAnc2V0JyxcbiAgICAgICAgICBzdGVwTnVtYmVyOiArK3N0ZXBOdW1iZXIsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSWYgdGhlIGNvbnN1bWVyIHN1cHBsaWVkIGByZW5kZXJlci5yZW5kZXJPcGAsIHVzZSBpdHMgcmV0dXJuIHZhbHVlOlxuICAgICAgICAvLyAgIC0gc3RyaW5nIOKGkiB1c2UgYXMgdGhlIG5hcnJhdGl2ZSBsaW5lXG4gICAgICAgIC8vICAgLSBudWxsICAg4oaSIGRlbGliZXJhdGVseSBleGNsdWRlIHRoaXMgZW50cnkgKHNhbWUgc2VtYW50aWNzIGFzXG4gICAgICAgIC8vICAgICAgICAgICAgICBgZmx1c2hPcHNgIGFib3ZlIGF0IGxpbmUgfjU0MClcbiAgICAgICAgLy8gICAtIHVuZGVmaW5lZCDihpIgcmVuZGVyZXIgZG9lcyBub3QgaGFuZGxlIHRoaXMgb3Ag4oaSIGZhbGwgdGhyb3VnaFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdG8gdGhlIGhhcmRjb2RlZCB0ZW1wbGF0ZVxuICAgICAgICAvLyBJZiBubyByZW5kZXJlciBhdCBhbGwsIHVzZSB0aGUgaGFyZGNvZGVkIHRlbXBsYXRlLlxuICAgICAgICBsZXQgdGV4dDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZXI/LnJlbmRlck9wKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tVGV4dCA9IHRoaXMucmVuZGVyZXIucmVuZGVyT3Aob3BDdHgpO1xuICAgICAgICAgIGlmIChjdXN0b21UZXh0ID09PSBudWxsKSBjb250aW51ZTsgLy8gZXhjbHVkZWQgb24gcHVycG9zZVxuICAgICAgICAgIHRleHQgPVxuICAgICAgICAgICAgY3VzdG9tVGV4dCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gY3VzdG9tVGV4dFxuICAgICAgICAgICAgICA6IHRoaXMuaW5jbHVkZVZhbHVlc1xuICAgICAgICAgICAgICA/IGBJbnB1dDogJHtrZXl9ID0gJHt2YWx1ZVN1bW1hcnl9YFxuICAgICAgICAgICAgICA6IGBJbnB1dDogJHtrZXl9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXh0ID0gdGhpcy5pbmNsdWRlVmFsdWVzID8gYElucHV0OiAke2tleX0gPSAke3ZhbHVlU3VtbWFyeX1gIDogYElucHV0OiAke2tleX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbWl0KHtcbiAgICAgICAgICB0eXBlOiAnc3RlcCcsXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICBzdGFnZU5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICAgICAgc3RhZ2VJZDogc2lkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiByaWQsXG4gICAgICAgICAgc3ViZmxvd0lkOiBzZklkLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICByYXdWYWx1ZTogdmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uU3ViZmxvd0V4aXQoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCByaWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBzaWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkO1xuICAgIGNvbnN0IHNmSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQ7XG4gICAgLy8gTk9URTogb3V0cHV0IHN0YXRlIGlzIE5PVCBlbWl0dGVkIGFzIHN0ZXAgZW50cmllcyBiZWNhdXNlIGl0IG1heSBjb250YWluXG4gICAgLy8gdW5yZWRhY3RlZCB2YWx1ZXMgZnJvbSB0aGUgc3ViZmxvdydzIGludGVybmFsIHNjb3BlLiBUaGUgc3ViZmxvdyBleGl0XG4gICAgLy8gaGVhZGVyIGlzIHN1ZmZpY2llbnQg4oCUIGRyaWxsIGludG8gdGhlIHN1YmZsb3cgZm9yIGRldGFpbHMuXG4gICAgY29uc3QgY3R4OiBTdWJmbG93UmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIG5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICBkaXJlY3Rpb246ICdleGl0JyxcbiAgICAgIG91dHB1dFN0YXRlOiBldmVudC5vdXRwdXRTdGF0ZSxcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJTdWJmbG93Py4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJTdWJmbG93KGN0eCk7XG4gICAgdGhpcy5lbWl0KHtcbiAgICAgIHR5cGU6ICdzdWJmbG93JyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQubmFtZSxcbiAgICAgIHN0YWdlSWQ6IHNpZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiByaWQsXG4gICAgICBzdWJmbG93SWQ6IHNmSWQsXG4gICAgICBkaXJlY3Rpb246ICdleGl0JyxcbiAgICB9KTtcbiAgfVxuXG4gIG9uTG9vcChldmVudDogRmxvd0xvb3BFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eDogTG9vcFJlbmRlckNvbnRleHQgPSB7XG4gICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgIGl0ZXJhdGlvbjogZXZlbnQuaXRlcmF0aW9uLFxuICAgICAgZGVzY3JpcHRpb246IGV2ZW50LmRlc2NyaXB0aW9uLFxuICAgIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlckxvb3A/LihjdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlckxvb3AoY3R4KTtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ2xvb3AnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgb25CcmVhayhldmVudDogRmxvd0JyZWFrRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHg6IEJyZWFrUmVuZGVyQ29udGV4dCA9IHsgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUgfTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyQnJlYWs/LihjdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlckJyZWFrKGN0eCk7XG4gICAgdGhpcy5lbWl0KHtcbiAgICAgIHR5cGU6ICdicmVhaycsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uUGF1c2UoZXZlbnQ6IFBhdXNlRXZlbnQgfCBGbG93UGF1c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIEJvdGggY2hhbm5lbHMgZmlyZSBvblBhdXNlIHdpdGggZGlmZmVyZW50IHBheWxvYWQgc2hhcGVzLiBOYXJyYXRpdmUgb25seVxuICAgIC8vIHN1cmZhY2VzIHRoZSBjb250cm9sLWZsb3cgdmFyaWFudCAod2hpY2ggaGFzIHN0YWdlTmFtZS9zdGFnZUlkKS4gRGF0YVxuICAgIC8vIGNoYW5uZWwncyBQYXVzZUV2ZW50IGlzIGlnbm9yZWQgdG8gYXZvaWQgZHVwbGljYXRlIGVudHJpZXMuXG4gICAgaWYgKCFpc0Zsb3dFdmVudChldmVudCkpIHJldHVybjtcbiAgICBpZiAoIWV2ZW50LnN0YWdlTmFtZSB8fCAhZXZlbnQuc3RhZ2VJZCkgcmV0dXJuO1xuICAgIGNvbnN0IHRleHQgPSBgRXhlY3V0aW9uIHBhdXNlZCBhdCAke2V2ZW50LnN0YWdlTmFtZX0uYDtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ3BhdXNlJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCA/PyBldmVudC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICBvblJlc3VtZShldmVudDogUmVzdW1lRXZlbnQgfCBGbG93UmVzdW1lRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBTYW1lIGlzRmxvd0V2ZW50IGRpc2NyaW1pbmFudCBhcyBvblBhdXNlIOKAlCBpZ25vcmUgc2NvcGUgUmVzdW1lRXZlbnQuXG4gICAgaWYgKCFpc0Zsb3dFdmVudChldmVudCkpIHJldHVybjtcbiAgICBpZiAoIWV2ZW50LnN0YWdlTmFtZSB8fCAhZXZlbnQuc3RhZ2VJZCkgcmV0dXJuO1xuICAgIGNvbnN0IHN1ZmZpeCA9IGV2ZW50Lmhhc0lucHV0ID8gJyB3aXRoIGlucHV0LicgOiAnLic7XG4gICAgY29uc3QgdGV4dCA9IGBFeGVjdXRpb24gcmVzdW1lZCBhdCAke2V2ZW50LnN0YWdlTmFtZX0ke3N1ZmZpeH1gO1xuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAncmVzdW1lJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCA/PyBldmVudC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICBvbkVycm9yKGV2ZW50OiBFcnJvckV2ZW50IHwgRmxvd0Vycm9yRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBOYXJyYXRpdmUgb25seSBzdXJmYWNlcyB0aGUgY29udHJvbC1mbG93IHZhcmlhbnQgb2YgZXJyb3JzIChoYXNcbiAgICAvLyBzdGFnZU5hbWUgKyBtZXNzYWdlKS4gU2NvcGUtbGV2ZWwgRXJyb3JFdmVudCBpcyBjYXB0dXJlZCBlbHNld2hlcmUuXG4gICAgaWYgKCFpc0Zsb3dFdmVudChldmVudCkpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGV2ZW50Lm1lc3NhZ2UgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBsZXQgdmFsaWRhdGlvbklzc3Vlczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChldmVudC5zdHJ1Y3R1cmVkRXJyb3I/Lmlzc3Vlcz8ubGVuZ3RoKSB7XG4gICAgICB2YWxpZGF0aW9uSXNzdWVzID0gZXZlbnQuc3RydWN0dXJlZEVycm9yLmlzc3Vlc1xuICAgICAgICAubWFwKChpc3N1ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSBpc3N1ZS5wYXRoLmxlbmd0aCA+IDAgPyBpc3N1ZS5wYXRoLmpvaW4oJy4nKSA6ICcocm9vdCknO1xuICAgICAgICAgIHJldHVybiBgJHtwYXRofTogJHtpc3N1ZS5tZXNzYWdlfWA7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCc7ICcpO1xuICAgIH1cblxuICAgIGNvbnN0IGN0eDogRXJyb3JSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBtZXNzYWdlOiBldmVudC5tZXNzYWdlLFxuICAgICAgdmFsaWRhdGlvbklzc3VlcyxcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJFcnJvcj8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyRXJyb3IoY3R4KTtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIEVtaXQgY2hhbm5lbCAoUGhhc2UgMykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlY2VpdmUgYSBjb25zdW1lci1lbWl0dGVkIGV2ZW50IGZyb20gYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYC5cbiAgICpcbiAgICogQnVmZmVyZWQgYWxvbmdzaWRlIGBvblJlYWRgL2BvbldyaXRlYCBwZXItc3RhZ2Ugc28gdGhhdCB0aGUgZmluYWxcbiAgICogbmFycmF0aXZlIHByZXNlcnZlcyBvcmRlcmluZzpcbiAgICpcbiAgICogICAxLiBzdGFnZSBoZWFkZXIgKGVtaXR0ZWQgYnkgYG9uU3RhZ2VFeGVjdXRlZGAgLyBgb25EZWNpc2lvbmApXG4gICAqICAgMi4gYnVmZmVyZWQgb3BzIGZvciB0aGF0IHN0YWdlIOKAlCBpbiBjYWxsIG9yZGVyIOKAlCBmbHVzaGVkIHJpZ2h0IGFmdGVyXG4gICAqXG4gICAqIFdpdGhvdXQgYnVmZmVyaW5nLCBlbWl0IGV2ZW50cyB3b3VsZCBmaXJlIEJFRk9SRSB0aGUgc3RhZ2UgaGVhZGVyXG4gICAqICh3aGljaCBvbmx5IGxhbmRzIGF0IGBvblN0YWdlRXhlY3V0ZWRgKSwgcHJvZHVjaW5nIG91dC1vZi1vcmRlclxuICAgKiBuYXJyYXRpdmUgZW50cmllcy4gRmx1c2ggaGFwcGVucyBpbiBgZmx1c2hPcHNgIHdoaWNoIHJvdXRlcyBgZW1pdGAtXG4gICAqIHR5cGVkIGJ1ZmZlcmVkIG9wcyB0aHJvdWdoIGByZW5kZXJFbWl0YCBpbnN0ZWFkIG9mIGByZW5kZXJPcGAuXG4gICAqL1xuICBvbkVtaXQoZXZlbnQ6IEVtaXRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyT3AoZXZlbnQucnVudGltZVN0YWdlSWQsIHtcbiAgICAgIHR5cGU6ICdlbWl0JyxcbiAgICAgIGtleTogZXZlbnQubmFtZSxcbiAgICAgIHJhd1ZhbHVlOiBldmVudC5wYXlsb2FkLFxuICAgICAgZW1pdEV2ZW50OiBldmVudCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlckVtaXQoY3R4OiBFbWl0UmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbZW1pdF0gJHtjdHgubmFtZX06ICR7Y3R4LnBheWxvYWRTdW1tYXJ5fWA7XG4gIH1cblxuICAvLyDilIDilIAgT3V0cHV0IChuYXJyYXRpdmUtc3BlY2lmaWMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGVudHJpZXMgZ3JvdXBlZCBieSBzdWJmbG93SWQgZm9yIHN0cnVjdHVyZWQgYWNjZXNzLlxuICAgKiBSb290LWxldmVsIGVudHJpZXMgaGF2ZSBzdWJmbG93SWQgPSB1bmRlZmluZWQuXG4gICAqL1xuICBnZXRFbnRyaWVzQnlTdWJmbG93KCk6IFJlY29yZDxzdHJpbmcsIENvbWJpbmVkTmFycmF0aXZlRW50cnlbXT4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdPiA9IHsgJyc6IFtdIH07XG4gICAgdGhpcy5mb3JFYWNoRW50cnkoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBlbnRyeS5zdWJmbG93SWQgPz8gJyc7XG4gICAgICBpZiAoIXJlc3VsdFtrZXldKSByZXN1bHRba2V5XSA9IFtdO1xuICAgICAgcmVzdWx0W2tleV0ucHVzaChlbnRyeSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBDbGVhcnMgYWxsIHN0YXRlLiBDYWxsZWQgYXV0b21hdGljYWxseSBiZWZvcmUgZWFjaCBydW4uICovXG4gIG92ZXJyaWRlIGNsZWFyKCk6IHZvaWQge1xuICAgIHN1cGVyLmNsZWFyKCk7XG4gICAgdGhpcy5wZW5kaW5nT3BzLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFnZUNvdW50ZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5maXJzdFN0YWdlRmxhZ3MuY2xlYXIoKTtcbiAgICB0aGlzLnN0YWdlVmlzaXRDb3VudHMuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcml2YXRlIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBpbmNyZW1lbnRTdGFnZUNvdW50ZXIoc3ViZmxvd0tleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zdGFnZUNvdW50ZXJzLmdldChzdWJmbG93S2V5KSA/PyAwO1xuICAgIGNvbnN0IG5leHQgPSBjdXJyZW50ICsgMTtcbiAgICB0aGlzLnN0YWdlQ291bnRlcnMuc2V0KHN1YmZsb3dLZXksIG5leHQpO1xuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lRmlyc3RTdGFnZUZsYWcoc3ViZmxvd0tleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmZpcnN0U3RhZ2VGbGFncy5oYXMoc3ViZmxvd0tleSkpIHtcbiAgICAgIHRoaXMuZmlyc3RTdGFnZUZsYWdzLnNldChzdWJmbG93S2V5LCBmYWxzZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBidWZmZXJPcChydW50aW1lU3RhZ2VJZDogc3RyaW5nLCBvcDogT21pdDxCdWZmZXJlZE9wLCAnc3RlcE51bWJlcic+KTogdm9pZCB7XG4gICAgbGV0IG9wcyA9IHRoaXMucGVuZGluZ09wcy5nZXQocnVudGltZVN0YWdlSWQpO1xuICAgIGlmICghb3BzKSB7XG4gICAgICBvcHMgPSBbXTtcbiAgICAgIHRoaXMucGVuZGluZ09wcy5zZXQocnVudGltZVN0YWdlSWQsIG9wcyk7XG4gICAgfVxuICAgIG9wcy5wdXNoKHsgLi4ub3AsIHN0ZXBOdW1iZXI6IG9wcy5sZW5ndGggKyAxIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaE9wcyhydW50aW1lU3RhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdWJmbG93SWQ/OiBzdHJpbmcsIHN0YWdlSWQ/OiBzdHJpbmcsIHN0YWdlTmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChydW50aW1lU3RhZ2VJZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3Qgb3BzID0gdGhpcy5wZW5kaW5nT3BzLmdldChydW50aW1lU3RhZ2VJZCk7XG4gICAgaWYgKCFvcHMgfHwgb3BzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBvcCBvZiBvcHMpIHtcbiAgICAgIC8vIOKUgOKUgCBFbWl0IGV2ZW50cyB0YWtlIGEgZGlmZmVyZW50IHJlbmRlciBwYXRoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgICAgLy9cbiAgICAgIC8vIEVtaXQgZXZlbnRzIGFyZSBidWZmZXJlZCBhbG9uZ3NpZGUgcmVhZHMvd3JpdGVzIChzbyB0aGV5IGFwcGVhclxuICAgICAgLy8gdW5kZXIgdGhlaXIgb3duaW5nIHN0YWdlJ3MgaGVhZGVyIGluIG5hcnJhdGl2ZSBvcmRlciwgbm90IGlubGluZVxuICAgICAgLy8gYXQgY2FsbCB0aW1lKS4gQXQgZmx1c2gsIHRoZXkgcm91dGUgdGhyb3VnaCBgcmVuZGVyRW1pdGAgaW5zdGVhZFxuICAgICAgLy8gb2YgYHJlbmRlck9wYCDigJQgY29uc3VtZXJzIHdhbnRpbmcgY3VzdG9tIGVtaXQgcmVuZGVyaW5nIGltcGxlbWVudFxuICAgICAgLy8gdGhlIGRlZGljYXRlZCBob29rLiBVbmhhbmRsZWQgLyBtaXNzaW5nIHJlbmRlcmVyIGZhbGxzIGJhY2sgdG9cbiAgICAgIC8vIHRoZSBzYW1lIGNvbXBhY3QgYFtlbWl0XSBuYW1lOiBwYXlsb2FkU3VtbWFyeWAgZGVmYXVsdCB1c2VkIGJ5XG4gICAgICAvLyB0aGUgcHJlLWJ1ZmZlcmluZyBvbkVtaXQgcGF0aC5cbiAgICAgIGlmIChvcC50eXBlID09PSAnZW1pdCcgJiYgb3AuZW1pdEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGUgPSBvcC5lbWl0RXZlbnQ7XG4gICAgICAgIGNvbnN0IHBheWxvYWRTdW1tYXJ5ID0gdGhpcy5mb3JtYXRWYWx1ZShlLnBheWxvYWQsIHRoaXMubWF4VmFsdWVMZW5ndGgpO1xuICAgICAgICBjb25zdCBlbWl0Q3R4OiBFbWl0UmVuZGVyQ29udGV4dCA9IHtcbiAgICAgICAgICBuYW1lOiBlLm5hbWUsXG4gICAgICAgICAgcGF5bG9hZDogZS5wYXlsb2FkLFxuICAgICAgICAgIHN0YWdlTmFtZTogZS5zdGFnZU5hbWUsXG4gICAgICAgICAgcnVudGltZVN0YWdlSWQ6IGUucnVudGltZVN0YWdlSWQsXG4gICAgICAgICAgc3ViZmxvd1BhdGg6IGUuc3ViZmxvd1BhdGgsXG4gICAgICAgICAgcGlwZWxpbmVJZDogZS5waXBlbGluZUlkLFxuICAgICAgICAgIHRpbWVzdGFtcDogZS50aW1lc3RhbXAsXG4gICAgICAgICAgcGF5bG9hZFN1bW1hcnksXG4gICAgICAgIH07XG4gICAgICAgIGxldCBlbWl0VGV4dDogc3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJlcj8ucmVuZGVyRW1pdCkge1xuICAgICAgICAgIGNvbnN0IGN1c3RvbSA9IHRoaXMucmVuZGVyZXIucmVuZGVyRW1pdChlbWl0Q3R4KTtcbiAgICAgICAgICBpZiAoY3VzdG9tID09PSBudWxsKSBjb250aW51ZTsgLy8gZGVsaWJlcmF0ZWx5IGV4Y2x1ZGVkXG4gICAgICAgICAgZW1pdFRleHQgPSBjdXN0b20gIT09IHVuZGVmaW5lZCA/IGN1c3RvbSA6IHRoaXMuZGVmYXVsdFJlbmRlckVtaXQoZW1pdEN0eCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW1pdFRleHQgPSB0aGlzLmRlZmF1bHRSZW5kZXJFbWl0KGVtaXRDdHgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdCh7XG4gICAgICAgICAgdHlwZTogJ2VtaXQnLFxuICAgICAgICAgIHRleHQ6IGVtaXRUZXh0LFxuICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgIHN0YWdlTmFtZSxcbiAgICAgICAgICBzdGFnZUlkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICAgIHN0ZXBOdW1iZXI6IG9wLnN0ZXBOdW1iZXIsXG4gICAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQgb3AudHlwZSBpcyBuYXJyb3dlZCB0byAncmVhZCcgfCAnd3JpdGUnIChlbWl0IGJyYW5jaFxuICAgICAgLy8gYWJvdmUgdXNlcyBgY29udGludWVgKS4gVHlwZVNjcmlwdCBjYW4ndCBmb2xsb3cgdGhhdCBuYXJyb3dpbmdcbiAgICAgIC8vIHRocm91Z2ggdGhlIGNvbnRpbnVlLCBzbyB3ZSBhc3NlcnQgYXQgcmVuZGVyIHRpbWUuXG4gICAgICBjb25zdCBvcFR5cGUgPSBvcC50eXBlIGFzICdyZWFkJyB8ICd3cml0ZSc7XG4gICAgICBjb25zdCB2YWx1ZVN1bW1hcnkgPSB0aGlzLmZvcm1hdFZhbHVlKG9wLnJhd1ZhbHVlLCB0aGlzLm1heFZhbHVlTGVuZ3RoKTtcbiAgICAgIGNvbnN0IG9wQ3R4OiBPcFJlbmRlckNvbnRleHQgPSB7XG4gICAgICAgIHR5cGU6IG9wVHlwZSxcbiAgICAgICAga2V5OiBvcC5rZXksXG4gICAgICAgIHJhd1ZhbHVlOiBvcC5yYXdWYWx1ZSxcbiAgICAgICAgdmFsdWVTdW1tYXJ5LFxuICAgICAgICBvcGVyYXRpb246IG9wLm9wZXJhdGlvbixcbiAgICAgICAgc3RlcE51bWJlcjogb3Auc3RlcE51bWJlcixcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJPcCA/IHRoaXMucmVuZGVyZXIucmVuZGVyT3Aob3BDdHgpIDogdGhpcy5kZWZhdWx0UmVuZGVyT3Aob3BDdHgpO1xuXG4gICAgICBpZiAodGV4dCA9PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgdGhpcy5lbWl0KHtcbiAgICAgICAgdHlwZTogJ3N0ZXAnLFxuICAgICAgICB0ZXh0LFxuICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgc3RlcE51bWJlcjogb3Auc3RlcE51bWJlcixcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBrZXk6IG9wLmtleSxcbiAgICAgICAgcmF3VmFsdWU6IG9wLnJhd1ZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nT3BzLmRlbGV0ZShydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvLyDilIDilIAgRGVmYXVsdCByZW5kZXJlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyU3RhZ2UoY3R4OiBTdGFnZVJlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIGxldCBpbm5lcjogc3RyaW5nO1xuICAgIGlmIChjdHguaXNGaXJzdCkge1xuICAgICAgaW5uZXIgPSBjdHguZGVzY3JpcHRpb24gPyBgVGhlIHByb2Nlc3MgYmVnYW46ICR7Y3R4LmRlc2NyaXB0aW9ufS5gIDogYFRoZSBwcm9jZXNzIGJlZ2FuIHdpdGggJHtjdHguc3RhZ2VOYW1lfS5gO1xuICAgIH0gZWxzZSBpZiAoY3R4Lmxvb3BJdGVyYXRpb24gJiYgY3R4Lmxvb3BJdGVyYXRpb24gPiAwKSB7XG4gICAgICBpbm5lciA9IGN0eC5kZXNjcmlwdGlvblxuICAgICAgICA/IGBMb29wZWQgYmFjazogJHtjdHguZGVzY3JpcHRpb259IChwYXNzICR7Y3R4Lmxvb3BJdGVyYXRpb259KS5gXG4gICAgICAgIDogYExvb3BlZCBiYWNrIHRvICR7Y3R4LnN0YWdlTmFtZX0gKHBhc3MgJHtjdHgubG9vcEl0ZXJhdGlvbn0pLmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlubmVyID0gY3R4LmRlc2NyaXB0aW9uID8gYE5leHQgc3RlcDogJHtjdHguZGVzY3JpcHRpb259LmAgOiBgTmV4dCwgaXQgbW92ZWQgb24gdG8gJHtjdHguc3RhZ2VOYW1lfS5gO1xuICAgIH1cbiAgICByZXR1cm4gYFN0YWdlICR7Y3R4LnN0YWdlTnVtYmVyfTogJHtpbm5lcn1gO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyT3AoY3R4OiBPcFJlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0ZXBQcmVmaXggPSB0aGlzLmluY2x1ZGVTdGVwTnVtYmVycyA/IGBTdGVwICR7Y3R4LnN0ZXBOdW1iZXJ9OiBgIDogJyc7XG4gICAgaWYgKGN0eC50eXBlID09PSAncmVhZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmluY2x1ZGVWYWx1ZXMgJiYgY3R4LnZhbHVlU3VtbWFyeVxuICAgICAgICA/IGAke3N0ZXBQcmVmaXh9UmVhZCAke2N0eC5rZXl9ID0gJHtjdHgudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgOiBgJHtzdGVwUHJlZml4fVJlYWQgJHtjdHgua2V5fWA7XG4gICAgfVxuICAgIGlmIChjdHgub3BlcmF0aW9uID09PSAnZGVsZXRlJykge1xuICAgICAgcmV0dXJuIGAke3N0ZXBQcmVmaXh9RGVsZXRlICR7Y3R4LmtleX1gO1xuICAgIH1cbiAgICBpZiAoY3R4Lm9wZXJhdGlvbiA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmluY2x1ZGVWYWx1ZXNcbiAgICAgICAgPyBgJHtzdGVwUHJlZml4fVVwZGF0ZSAke2N0eC5rZXl9ID0gJHtjdHgudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgOiBgJHtzdGVwUHJlZml4fVVwZGF0ZSAke2N0eC5rZXl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW5jbHVkZVZhbHVlcyA/IGAke3N0ZXBQcmVmaXh9V3JpdGUgJHtjdHgua2V5fSA9ICR7Y3R4LnZhbHVlU3VtbWFyeX1gIDogYCR7c3RlcFByZWZpeH1Xcml0ZSAke2N0eC5rZXl9YDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlckRlY2lzaW9uKGN0eDogRGVjaXNpb25SZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBjb25zdCBicmFuY2hOYW1lID0gY3R4LmNob3NlbjtcbiAgICBsZXQgY29uZGl0aW9uVGV4dDogc3RyaW5nO1xuICAgIGlmIChjdHguZXZpZGVuY2UpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBldmlkZW5jZSA9IGN0eC5ldmlkZW5jZSBhcyBhbnk7XG4gICAgICBjb25zdCBtYXRjaGVkUnVsZSA9IGV2aWRlbmNlLnJ1bGVzPy5maW5kKChyOiBhbnkpID0+IHIubWF0Y2hlZCk7XG4gICAgICBpZiAobWF0Y2hlZFJ1bGUpIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBtYXRjaGVkUnVsZS5sYWJlbCA/IGAgXCIke21hdGNoZWRSdWxlLmxhYmVsfVwiYCA6ICcnO1xuICAgICAgICBpZiAobWF0Y2hlZFJ1bGUudHlwZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgICBjb25zdCBwYXJ0cyA9IG1hdGNoZWRSdWxlLmNvbmRpdGlvbnMubWFwKFxuICAgICAgICAgICAgKGM6IGFueSkgPT5cbiAgICAgICAgICAgICAgYCR7Yy5rZXl9ICR7Yy5hY3R1YWxTdW1tYXJ5fSAke2Mub3B9ICR7SlNPTi5zdHJpbmdpZnkoYy50aHJlc2hvbGQpfSAke2MucmVzdWx0ID8gJ1xcdTI3MTMnIDogJ1xcdTI3MTcnfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25kaXRpb25UZXh0ID0gYEl0IGV2YWx1YXRlZCBSdWxlICR7bWF0Y2hlZFJ1bGUucnVsZUluZGV4fSR7bGFiZWx9OiAke3BhcnRzLmpvaW4oXG4gICAgICAgICAgICAnLCAnLFxuICAgICAgICAgICl9LCBhbmQgY2hvc2UgJHticmFuY2hOYW1lfS5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gbWF0Y2hlZFJ1bGUuaW5wdXRzLm1hcCgoaTogYW55KSA9PiBgJHtpLmtleX09JHtpLnZhbHVlU3VtbWFyeX1gKTtcbiAgICAgICAgICBjb25kaXRpb25UZXh0ID0gYEl0IGV4YW1pbmVkJHtsYWJlbH06ICR7cGFydHMuam9pbignLCAnKX0sIGFuZCBjaG9zZSAke2JyYW5jaE5hbWV9LmA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVycm9yZWRDb3VudCA9IGV2aWRlbmNlLnJ1bGVzPy5maWx0ZXIoKHI6IGFueSkgPT4gci5tYXRjaEVycm9yICE9PSB1bmRlZmluZWQpLmxlbmd0aCA/PyAwO1xuICAgICAgICBjb25zdCBlcnJvck5vdGUgPSBlcnJvcmVkQ291bnQgPiAwID8gYCAoJHtlcnJvcmVkQ291bnR9IHJ1bGUke2Vycm9yZWRDb3VudCA+IDEgPyAncycgOiAnJ30gdGhyZXcgZXJyb3JzKWAgOiAnJztcbiAgICAgICAgY29uZGl0aW9uVGV4dCA9IGBObyBydWxlcyBtYXRjaGVkJHtlcnJvck5vdGV9LCBmZWxsIGJhY2sgdG8gZGVmYXVsdDogJHticmFuY2hOYW1lfS5gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY3R4LmRlc2NyaXB0aW9uICYmIGN0eC5yYXRpb25hbGUpIHtcbiAgICAgIGNvbmRpdGlvblRleHQgPSBgSXQgJHtjdHguZGVzY3JpcHRpb259OiAke2N0eC5yYXRpb25hbGV9LCBzbyBpdCBjaG9zZSAke2JyYW5jaE5hbWV9LmA7XG4gICAgfSBlbHNlIGlmIChjdHguZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbmRpdGlvblRleHQgPSBgSXQgJHtjdHguZGVzY3JpcHRpb259IGFuZCBjaG9zZSAke2JyYW5jaE5hbWV9LmA7XG4gICAgfSBlbHNlIGlmIChjdHgucmF0aW9uYWxlKSB7XG4gICAgICBjb25kaXRpb25UZXh0ID0gYEEgZGVjaXNpb24gd2FzIG1hZGU6ICR7Y3R4LnJhdGlvbmFsZX0sIHNvIHRoZSBwYXRoIHRha2VuIHdhcyAke2JyYW5jaE5hbWV9LmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvblRleHQgPSBgQSBkZWNpc2lvbiB3YXMgbWFkZSwgYW5kIHRoZSBwYXRoIHRha2VuIHdhcyAke2JyYW5jaE5hbWV9LmA7XG4gICAgfVxuICAgIHJldHVybiBgW0NvbmRpdGlvbl06ICR7Y29uZGl0aW9uVGV4dH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyRm9yayhjdHg6IEZvcmtSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lcyA9IGN0eC5jaGlsZHJlbi5qb2luKCcsICcpO1xuICAgIHJldHVybiBgW1BhcmFsbGVsXTogRm9ya2luZyBpbnRvICR7Y3R4LmNoaWxkcmVuLmxlbmd0aH0gcGFyYWxsZWwgcGF0aHM6ICR7bmFtZXN9LmA7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJTZWxlY3RlZChjdHg6IFNlbGVjdGVkUmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgaWYgKGN0eC5ldmlkZW5jZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGV2aWRlbmNlID0gY3R4LmV2aWRlbmNlIGFzIGFueTtcbiAgICAgIGNvbnN0IG1hdGNoZWQgPSBldmlkZW5jZS5ydWxlcz8uZmlsdGVyKChyOiBhbnkpID0+IHIubWF0Y2hlZCkgPz8gW107XG4gICAgICBjb25zdCBwYXJ0cyA9IG1hdGNoZWQubWFwKChyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSByLmxhYmVsID8gYCBcIiR7ci5sYWJlbH1cImAgOiAnJztcbiAgICAgICAgaWYgKHIudHlwZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgICBjb25zdCBjb25kcyA9IHIuY29uZGl0aW9uc1xuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgKGM6IGFueSkgPT5cbiAgICAgICAgICAgICAgICBgJHtjLmtleX0gJHtjLmFjdHVhbFN1bW1hcnl9ICR7Yy5vcH0gJHtKU09OLnN0cmluZ2lmeShjLnRocmVzaG9sZCl9ICR7Yy5yZXN1bHQgPyAnXFx1MjcxMycgOiAnXFx1MjcxNyd9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICAgIHJldHVybiBgJHtyLmJyYW5jaH0ke2xhYmVsfSAoJHtjb25kc30pYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnB1dHMgPSByLmlucHV0cy5tYXAoKGk6IGFueSkgPT4gYCR7aS5rZXl9PSR7aS52YWx1ZVN1bW1hcnl9YCkuam9pbignLCAnKTtcbiAgICAgICAgcmV0dXJuIGAke3IuYnJhbmNofSR7bGFiZWx9ICgke2lucHV0c30pYDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGBbU2VsZWN0ZWRdOiAke2N0eC5zZWxlY3RlZC5sZW5ndGh9IG9mICR7Y3R4LnRvdGFsfSBwYXRocyBzZWxlY3RlZDogJHtwYXJ0cy5qb2luKCc7ICcpfS5gO1xuICAgIH1cbiAgICBjb25zdCBuYW1lcyA9IGN0eC5zZWxlY3RlZC5qb2luKCcsICcpO1xuICAgIHJldHVybiBgW1NlbGVjdGVkXTogJHtjdHguc2VsZWN0ZWQubGVuZ3RofSBvZiAke2N0eC50b3RhbH0gcGF0aHMgc2VsZWN0ZWQgZm9yIGV4ZWN1dGlvbjogJHtuYW1lc30uYDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlclN1YmZsb3coY3R4OiBTdWJmbG93UmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgaWYgKGN0eC5kaXJlY3Rpb24gPT09ICdleGl0Jykge1xuICAgICAgcmV0dXJuIGBFeGl0aW5nIHRoZSAke2N0eC5uYW1lfSBzdWJmbG93LmA7XG4gICAgfVxuICAgIHJldHVybiBjdHguZGVzY3JpcHRpb24gPyBgRW50ZXJpbmcgJHtjdHgubmFtZX06ICR7Y3R4LmRlc2NyaXB0aW9ufS5gIDogYEVudGVyaW5nIHRoZSAke2N0eC5uYW1lfSBzdWJmbG93LmA7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJMb29wKGN0eDogTG9vcFJlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIHJldHVybiBjdHguZGVzY3JpcHRpb25cbiAgICAgID8gYE9uIHBhc3MgJHtjdHguaXRlcmF0aW9ufTogJHtjdHguZGVzY3JpcHRpb259IGFnYWluLmBcbiAgICAgIDogYE9uIHBhc3MgJHtjdHguaXRlcmF0aW9ufSB0aHJvdWdoICR7Y3R4LnRhcmdldH0uYDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlckJyZWFrKGN0eDogQnJlYWtSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEV4ZWN1dGlvbiBzdG9wcGVkIGF0ICR7Y3R4LnN0YWdlTmFtZX0uYDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlckVycm9yKGN0eDogRXJyb3JSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBsZXQgdGV4dCA9IGBBbiBlcnJvciBvY2N1cnJlZCBhdCAke2N0eC5zdGFnZU5hbWV9OiAke2N0eC5tZXNzYWdlfS5gO1xuICAgIGlmIChjdHgudmFsaWRhdGlvbklzc3Vlcykge1xuICAgICAgdGV4dCArPSBgIFZhbGlkYXRpb24gaXNzdWVzOiAke2N0eC52YWxpZGF0aW9uSXNzdWVzfS5gO1xuICAgIH1cbiAgICByZXR1cm4gYFtFcnJvcl06ICR7dGV4dH1gO1xuICB9XG59XG4iXX0=
672
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBR0gsNEVBQWlFO0FBRWpFLDRFQUFzRTtBQUN0RSwrRUFBeUU7QUFzRHpFLDhFQUE4RTtBQUU5RTs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQWEseUJBQTBCLFNBQVEsc0NBQXdDO0lBQzVFLEVBQUUsQ0FBUztJQUVwQjs7Ozs7T0FLRztJQUNLLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUNyRCxzREFBc0Q7SUFDOUMsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ2xELHlEQUF5RDtJQUNqRCxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFDckQsNEVBQTRFO0lBQ3BFLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBRTdDLGtCQUFrQixDQUFVO0lBQzVCLGFBQWEsQ0FBVTtJQUN2QixjQUFjLENBQVM7SUFDdkIsV0FBVyxDQUE2QztJQUN4RCxRQUFRLENBQXFCO0lBRXJDLFlBQVksT0FBNEQ7UUFDdEUsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLElBQUksb0JBQW9CLENBQUM7UUFDOUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sRUFBRSxrQkFBa0IsSUFBSSxJQUFJLENBQUM7UUFDOUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQztRQUNwRCxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxF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LENBQUMsU0FBUyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE9BQU8sZUFBZSxHQUFHLENBQUMsSUFBSSxXQUFXLENBQUM7UUFDNUMsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLFdBQVcsQ0FBQztJQUM3RyxDQUFDO0lBRU8saUJBQWlCLENBQUMsR0FBc0I7UUFDOUMsT0FBTyxHQUFHLENBQUMsV0FBVztZQUNwQixDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQyxXQUFXLFNBQVM7WUFDdkQsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLFNBQVMsWUFBWSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUM7SUFDeEQsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEdBQXVCO1FBQ2hELE9BQU8sd0JBQXdCLEdBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQztJQUNsRCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsR0FBdUI7UUFDaEQsSUFBSSxJQUFJLEdBQUcsd0JBQXdCLEdBQUcsQ0FBQyxTQUFTLEtBQUssR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDO1FBQ3BFLElBQUksR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLHVCQUF1QixHQUFHLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsT0FBTyxZQUFZLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7Q0FDRjtBQXRxQkQsOERBc3FCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciDigJQgSW5saW5lIG5hcnJhdGl2ZSBidWlsZGVyIHRoYXQgbWVyZ2VzIGZsb3cgKyBkYXRhIGR1cmluZyB0cmF2ZXJzYWwuXG4gKlxuICogRXh0ZW5kcyBTZXF1ZW5jZVJlY29yZGVyPENvbWJpbmVkTmFycmF0aXZlRW50cnk+IGZvciBkdWFsLWluZGV4ZWQgc3RvcmFnZSAob3JkZXJlZCBzZXF1ZW5jZVxuICogKyBPKDEpIHBlci1zdGVwIGxvb2t1cCBieSBydW50aW1lU3RhZ2VJZCkuIEltcGxlbWVudHMgYENvbWJpbmVkUmVjb3JkZXJgIOKAlCB0aGUgbGlicmFyeSdzXG4gKiBmaXJzdC1jbGFzcyBhYnN0cmFjdGlvbiBmb3Igb2JzZXJ2ZXJzIHRoYXQgc3BhbiBib3RoIGRhdGEtZmxvdyBhbmQgY29udHJvbC1mbG93IHN0cmVhbXMuXG4gKlxuICogRXZlbnQgb3JkZXJpbmcgZ3VhcmFudGVlcyB0aGlzIHdvcmtzOlxuICogICAxLiBTY29wZSBldmVudHMgKG9uUmVhZCwgb25Xcml0ZSkgZmlyZSBEVVJJTkcgc3RhZ2UgZXhlY3V0aW9uXG4gKiAgIDIuIEZsb3cgZXZlbnRzIChvblN0YWdlRXhlY3V0ZWQsIG9uRGVjaXNpb24pIGZpcmUgQUZURVIgc3RhZ2UgZXhlY3V0aW9uXG4gKiAgIDMuIEJvdGggY2FycnkgdGhlIHNhbWUgYHN0YWdlTmFtZWAg4oCUIG5vIG1hdGNoaW5nIGFtYmlndWl0eVxuICpcbiAqIFNvIHdlIGJ1ZmZlciBzY29wZSBvcHMgcGVyLXN0YWdlLCB0aGVuIHdoZW4gdGhlIGZsb3cgZXZlbnQgYXJyaXZlcyxcbiAqIGVtaXQgdGhlIHN0YWdlIGVudHJ5ICsgZmx1c2ggdGhlIGJ1ZmZlcmVkIG9wcyBpbiBvbmUgcGFzcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkUmVjb3JkZXIgfSBmcm9tICcuLi8uLi9yZWNvcmRlci9Db21iaW5lZFJlY29yZGVyLmpzJztcbmltcG9ydCB7IGlzRmxvd0V2ZW50IH0gZnJvbSAnLi4vLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRFdmVudCB9IGZyb20gJy4uLy4uL3JlY29yZGVyL0VtaXRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBTZXF1ZW5jZVJlY29yZGVyIH0gZnJvbSAnLi4vLi4vcmVjb3JkZXIvU2VxdWVuY2VSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBzdW1tYXJpemVWYWx1ZSB9IGZyb20gJy4uLy4uL3Njb3BlL3JlY29yZGVycy9zdW1tYXJpemVWYWx1ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEVycm9yRXZlbnQsIFBhdXNlRXZlbnQsIFJlYWRFdmVudCwgUmVzdW1lRXZlbnQsIFdyaXRlRXZlbnQgfSBmcm9tICcuLi8uLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJyZWFrUmVuZGVyQ29udGV4dCxcbiAgQ29tYmluZWROYXJyYXRpdmVFbnRyeSxcbiAgRGVjaXNpb25SZW5kZXJDb250ZXh0LFxuICBFbWl0UmVuZGVyQ29udGV4dCxcbiAgRXJyb3JSZW5kZXJDb250ZXh0LFxuICBGb3JrUmVuZGVyQ29udGV4dCxcbiAgTG9vcFJlbmRlckNvbnRleHQsXG4gIE5hcnJhdGl2ZVJlbmRlcmVyLFxuICBPcFJlbmRlckNvbnRleHQsXG4gIFNlbGVjdGVkUmVuZGVyQ29udGV4dCxcbiAgU3RhZ2VSZW5kZXJDb250ZXh0LFxuICBTdWJmbG93UmVuZGVyQ29udGV4dCxcbn0gZnJvbSAnLi9uYXJyYXRpdmVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dCcmVha0V2ZW50LFxuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0Vycm9yRXZlbnQsXG4gIEZsb3dGb3JrRXZlbnQsXG4gIEZsb3dMb29wRXZlbnQsXG4gIEZsb3dQYXVzZUV2ZW50LFxuICBGbG93UmVzdW1lRXZlbnQsXG4gIEZsb3dTZWxlY3RlZEV2ZW50LFxuICBGbG93U3RhZ2VFdmVudCxcbiAgRmxvd1N1YmZsb3dFdmVudCxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIEJ1ZmZlcmVkT3Age1xuICB0eXBlOiAncmVhZCcgfCAnd3JpdGUnIHwgJ2VtaXQnO1xuICAvKiogRm9yIHJlYWQvd3JpdGU6IHNjb3BlIGtleS4gRm9yIGVtaXQ6IHRoZSBldmVudCBuYW1lLiAqL1xuICBrZXk6IHN0cmluZztcbiAgcmF3VmFsdWU6IHVua25vd247XG4gIG9wZXJhdGlvbj86ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJztcbiAgc3RlcE51bWJlcjogbnVtYmVyO1xuICAvKiogT25seSBzZXQgZm9yIHR5cGU9J2VtaXQnIOKAlCBjYXJyaWVzIHRoZSBmdWxsIEVtaXRFdmVudCBmb3IgcmVuZGVyaW5nLiAqL1xuICBlbWl0RXZlbnQ/OiBFbWl0RXZlbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMge1xuICBpbmNsdWRlU3RlcE51bWJlcnM/OiBib29sZWFuO1xuICBpbmNsdWRlVmFsdWVzPzogYm9vbGVhbjtcbiAgbWF4VmFsdWVMZW5ndGg/OiBudW1iZXI7XG4gIC8qKiBDdXN0b20gdmFsdWUgZm9ybWF0dGVyLiBDYWxsZWQgYXQgcmVuZGVyIHRpbWUgKGZsdXNoT3BzKSwgbm90IGNhcHR1cmUgdGltZS5cbiAgICogIFJlY2VpdmVzIHRoZSByYXcgdmFsdWUgYW5kIG1heFZhbHVlTGVuZ3RoLiBEZWZhdWx0cyB0byBzdW1tYXJpemVWYWx1ZSgpLiAqL1xuICBmb3JtYXRWYWx1ZT86ICh2YWx1ZTogdW5rbm93biwgbWF4TGVuOiBudW1iZXIpID0+IHN0cmluZztcbiAgLyoqIFBsdWdnYWJsZSByZW5kZXJlciBmb3IgY3VzdG9taXppbmcgbmFycmF0aXZlIG91dHB1dC4gVW5pbXBsZW1lbnRlZCBtZXRob2RzXG4gICAqICBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgRW5nbGlzaCByZW5kZXJlci4gU2VlIE5hcnJhdGl2ZVJlbmRlcmVyIGRvY3MuICovXG4gIHJlbmRlcmVyPzogTmFycmF0aXZlUmVuZGVyZXI7XG59XG5cbi8vIOKUgOKUgCBSZWNvcmRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBJbXBsZW1lbnRzIGBDb21iaW5lZFJlY29yZGVyYCDigJQgdGhlIGxpYnJhcnkncyBmaXJzdC1jbGFzcyBhYnN0cmFjdGlvbiBmb3JcbiAqIG9ic2VydmVycyB0aGF0IHNwYW4gYm90aCBkYXRhLWZsb3cgKGBSZWNvcmRlcmApIGFuZCBjb250cm9sLWZsb3dcbiAqIChgRmxvd1JlY29yZGVyYCkgc3RyZWFtcy4gT25lIGBpZGAsIHJvdXRlZCB0byBib3RoIGNoYW5uZWxzIHZpYVxuICogYGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIoLi4uKWAgKG9yIGVxdWl2YWxlbnRseSB2aWFcbiAqIGBleGVjdXRvci5lbmFibGVOYXJyYXRpdmUoLi4uKWAgd2hpY2ggYXV0by1jcmVhdGVzIGFuIGluc3RhbmNlKS5cbiAqXG4gKiBGb3Igc2hhcmVkLW1ldGhvZC1uYW1lIGV2ZW50cyAoYG9uRXJyb3JgLCBgb25QYXVzZWAsIGBvblJlc3VtZWApIHRoZVxuICogaGFuZGxlciBhY2NlcHRzIHRoZSB1bmlvbiBwYXlsb2FkIHR5cGU7IHdlIGRpc2NyaW1pbmF0ZSB2aWEgYGlzRmxvd0V2ZW50YC5cbiAqIFNjb3BlIHZhcmlhbnRzIG9mIHRoZXNlIGV2ZW50cyBhcmUgZGVsaWJlcmF0ZWx5IGlnbm9yZWQgaGVyZSDigJQgdGhlXG4gKiBuYXJyYXRpdmUgb25seSBzdXJmYWNlcyBjb250cm9sLWZsb3cgbGlmZWN5Y2xlIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgZXh0ZW5kcyBTZXF1ZW5jZVJlY29yZGVyPENvbWJpbmVkTmFycmF0aXZlRW50cnk+IGltcGxlbWVudHMgQ29tYmluZWRSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBlbmRpbmcgc2NvcGUgb3BzIGtleWVkIGJ5IHJ1bnRpbWVTdGFnZUlkLiBGbHVzaGVkIGluIG9uU3RhZ2VFeGVjdXRlZC9vbkRlY2lzaW9uLlxuICAgKlxuICAgKiBLZXlpbmcgYnkgcnVudGltZVN0YWdlSWQgKG5vdCBzdGFnZU5hbWUpIGVuc3VyZXMgY29ycmVjdG5lc3Mgd2hlbiBwYXJhbGxlbCBmb3JrXG4gICAqIGJyYW5jaGVzIGNvbnRhaW4gc3RhZ2VzIHdpdGggdGhlIHNhbWUgbmFtZSDigJQgZWFjaCBleGVjdXRpb24gc3RlcCBoYXMgYSB1bmlxdWUgSUQuXG4gICAqL1xuICBwcml2YXRlIHBlbmRpbmdPcHMgPSBuZXcgTWFwPHN0cmluZywgQnVmZmVyZWRPcFtdPigpO1xuICAvKiogUGVyLXN1YmZsb3cgc3RhZ2UgY291bnRlcnMuIEtleSAnJyA9IHJvb3QgZmxvdy4gKi9cbiAgcHJpdmF0ZSBzdGFnZUNvdW50ZXJzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgLyoqIFBlci1zdWJmbG93IGZpcnN0LXN0YWdlIGZsYWdzLiBLZXkgJycgPSByb290IGZsb3cuICovXG4gIHByaXZhdGUgZmlyc3RTdGFnZUZsYWdzID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gIC8qKiBWaXNpdCBjb3VudCBwZXIgc3RhZ2VJZCDigJQgZGV0ZWN0cyBsb29wIGl0ZXJhdGlvbnMgKGNvdW50ID4gMSA9IGxvb3ApLiAqL1xuICBwcml2YXRlIHN0YWdlVmlzaXRDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIHByaXZhdGUgaW5jbHVkZVN0ZXBOdW1iZXJzOiBib29sZWFuO1xuICBwcml2YXRlIGluY2x1ZGVWYWx1ZXM6IGJvb2xlYW47XG4gIHByaXZhdGUgbWF4VmFsdWVMZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBmb3JtYXRWYWx1ZTogKHZhbHVlOiB1bmtub3duLCBtYXhMZW46IG51bWJlcikgPT4gc3RyaW5nO1xuICBwcml2YXRlIHJlbmRlcmVyPzogTmFycmF0aXZlUmVuZGVyZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zICYgeyBpZD86IHN0cmluZyB9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgPz8gJ2NvbWJpbmVkLW5hcnJhdGl2ZSc7XG4gICAgdGhpcy5pbmNsdWRlU3RlcE51bWJlcnMgPSBvcHRpb25zPy5pbmNsdWRlU3RlcE51bWJlcnMgPz8gdHJ1ZTtcbiAgICB0aGlzLmluY2x1ZGVWYWx1ZXMgPSBvcHRpb25zPy5pbmNsdWRlVmFsdWVzID8/IHRydWU7XG4gICAgdGhpcy5tYXhWYWx1ZUxlbmd0aCA9IG9wdGlvbnM/Lm1heFZhbHVlTGVuZ3RoID8/IDgwO1xuICAgIHRoaXMuZm9ybWF0VmFsdWUgPSBvcHRpb25zPy5mb3JtYXRWYWx1ZSA/PyBzdW1tYXJpemVWYWx1ZTtcbiAgICB0aGlzLnJlbmRlcmVyID0gb3B0aW9ucz8ucmVuZGVyZXI7XG4gIH1cblxuICAvLyDilIDilIAgU2NvcGUgY2hhbm5lbCAoZmlyZXMgZmlyc3QsIGR1cmluZyBzdGFnZSBleGVjdXRpb24pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIG9uUmVhZChldmVudDogUmVhZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCFldmVudC5rZXkpIHJldHVybjtcbiAgICB0aGlzLmJ1ZmZlck9wKGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCB7XG4gICAgICB0eXBlOiAncmVhZCcsXG4gICAgICBrZXk6IGV2ZW50LmtleSxcbiAgICAgIHJhd1ZhbHVlOiBldmVudC52YWx1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uV3JpdGUoZXZlbnQ6IFdyaXRlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlck9wKGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCB7XG4gICAgICB0eXBlOiAnd3JpdGUnLFxuICAgICAga2V5OiBldmVudC5rZXksXG4gICAgICByYXdWYWx1ZTogZXZlbnQudmFsdWUsXG4gICAgICBvcGVyYXRpb246IGV2ZW50Lm9wZXJhdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBGbG93IGNoYW5uZWwgKGZpcmVzIGFmdGVyIHN0YWdlIGV4ZWN1dGlvbikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgb25TdGFnZUV4ZWN1dGVkKGV2ZW50OiBGbG93U3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YWdlSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkO1xuICAgIGNvbnN0IHJ1bnRpbWVTdGFnZUlkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQ7XG4gICAgY29uc3Qgc2ZLZXkgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQgPz8gJyc7XG4gICAgY29uc3Qgc3RhZ2VOdW0gPSB0aGlzLmluY3JlbWVudFN0YWdlQ291bnRlcihzZktleSk7XG4gICAgY29uc3QgaXNGaXJzdCA9IHRoaXMuY29uc3VtZUZpcnN0U3RhZ2VGbGFnKHNmS2V5KTtcblxuICAgIC8vIFRyYWNrIHZpc2l0IGNvdW50IHBlciBzdGFnZUlkIHRvIGRldGVjdCBsb29wIGl0ZXJhdGlvbnNcbiAgICBjb25zdCB2aXNpdEtleSA9IHN0YWdlSWQgPz8gZXZlbnQuc3RhZ2VOYW1lO1xuICAgIGNvbnN0IHZpc2l0Q291bnQgPSAodGhpcy5zdGFnZVZpc2l0Q291bnRzLmdldCh2aXNpdEtleSkgPz8gMCkgKyAxO1xuICAgIHRoaXMuc3RhZ2VWaXNpdENvdW50cy5zZXQodmlzaXRLZXksIHZpc2l0Q291bnQpO1xuXG4gICAgY29uc3QgY3R4OiBTdGFnZVJlbmRlckNvbnRleHQgPSB7XG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlTnVtYmVyOiBzdGFnZU51bSxcbiAgICAgIGlzRmlyc3QsXG4gICAgICBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24sXG4gICAgICBsb29wSXRlcmF0aW9uOiB2aXNpdENvdW50ID4gMSA/IHZpc2l0Q291bnQgLSAxIDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlclN0YWdlPy4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJTdGFnZShjdHgpO1xuXG4gICAgY29uc3Qgc2ZJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZDtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBzZklkLFxuICAgIH0pO1xuICAgIHRoaXMuZmx1c2hPcHMocnVudGltZVN0YWdlSWQsIHNmSWQsIHN0YWdlSWQsIGV2ZW50LnN0YWdlTmFtZSk7XG4gIH1cblxuICBvbkRlY2lzaW9uKGV2ZW50OiBGbG93RGVjaXNpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YWdlSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkO1xuICAgIGNvbnN0IHJ1bnRpbWVTdGFnZUlkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQ7XG5cbiAgICAvLyBFbWl0IHRoZSBkZWNpZGVyIHN0YWdlIGVudHJ5IChkZWNpZGVycyBkb24ndCBmaXJlIG9uU3RhZ2VFeGVjdXRlZClcbiAgICBjb25zdCBzZktleSA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCA/PyAnJztcbiAgICBjb25zdCBzdGFnZU51bSA9IHRoaXMuaW5jcmVtZW50U3RhZ2VDb3VudGVyKHNmS2V5KTtcbiAgICBjb25zdCBpc0ZpcnN0ID0gdGhpcy5jb25zdW1lRmlyc3RTdGFnZUZsYWcoc2ZLZXkpO1xuXG4gICAgY29uc3Qgc3RhZ2VDdHg6IFN0YWdlUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuZGVjaWRlcixcbiAgICAgIHN0YWdlTnVtYmVyOiBzdGFnZU51bSxcbiAgICAgIGlzRmlyc3QsXG4gICAgICBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24sXG4gICAgfTtcbiAgICBjb25zdCBzdGFnZVRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJTdGFnZT8uKHN0YWdlQ3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJTdGFnZShzdGFnZUN0eCk7XG5cbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIHRleHQ6IHN0YWdlVGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5kZWNpZGVyLFxuICAgICAgc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gICAgdGhpcy5mbHVzaE9wcyhydW50aW1lU3RhZ2VJZCwgZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLCBzdGFnZUlkLCBldmVudC5kZWNpZGVyKTtcblxuICAgIC8vIEVtaXQgdGhlIGNvbmRpdGlvbiBlbnRyeSBhcyBhIG5lc3RlZCBzdWItaXRlbSAoZGVwdGggMSkgb2YgdGhlIHN0YWdlIGFib3ZlLlxuICAgIGNvbnN0IGRlY2lzaW9uQ3R4OiBEZWNpc2lvblJlbmRlckNvbnRleHQgPSB7XG4gICAgICBkZWNpZGVyOiBldmVudC5kZWNpZGVyLFxuICAgICAgY2hvc2VuOiBldmVudC5jaG9zZW4sXG4gICAgICBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24sXG4gICAgICByYXRpb25hbGU6IGV2ZW50LnJhdGlvbmFsZSxcbiAgICAgIGV2aWRlbmNlOiBldmVudC5ldmlkZW5jZSxcbiAgICB9O1xuICAgIGNvbnN0IGNvbmRpdGlvblRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJEZWNpc2lvbj8uKGRlY2lzaW9uQ3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJEZWNpc2lvbihkZWNpc2lvbkN0eCk7XG4gICAgdGhpcy5lbWl0KHtcbiAgICAgIHR5cGU6ICdjb25kaXRpb24nLFxuICAgICAgdGV4dDogY29uZGl0aW9uVGV4dCxcbiAgICAgIGRlcHRoOiAxLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5kZWNpZGVyLFxuICAgICAgc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICBvbk5leHQoKTogdm9pZCB7XG4gICAgLy8gTm8tb3AuIG9uU3RhZ2VFeGVjdXRlZCBhbHJlYWR5IGhhcyB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBuZXh0IHN0YWdlLlxuICB9XG5cbiAgb25Gb3JrKGV2ZW50OiBGbG93Rm9ya0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4OiBGb3JrUmVuZGVyQ29udGV4dCA9IHsgY2hpbGRyZW46IGV2ZW50LmNoaWxkcmVuIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlckZvcms/LihjdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlckZvcmsoY3R4KTtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ2ZvcmsnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgb25TZWxlY3RlZChldmVudDogRmxvd1NlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHg6IFNlbGVjdGVkUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIHNlbGVjdGVkOiBldmVudC5zZWxlY3RlZCxcbiAgICAgIHRvdGFsOiBldmVudC50b3RhbCxcbiAgICAgIGV2aWRlbmNlOiBldmVudC5ldmlkZW5jZSxcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJTZWxlY3RlZD8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyU2VsZWN0ZWQoY3R4KTtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ3NlbGVjdG9yJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uU3ViZmxvd0VudHJ5KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc2ZLZXkgPSBldmVudC5zdWJmbG93SWQgPz8gJyc7XG4gICAgdGhpcy5zdGFnZUNvdW50ZXJzLmRlbGV0ZShzZktleSk7XG4gICAgdGhpcy5maXJzdFN0YWdlRmxhZ3MuZGVsZXRlKHNmS2V5KTtcblxuICAgIGNvbnN0IGN0eDogU3ViZmxvd1JlbmRlckNvbnRleHQgPSB7XG4gICAgICBuYW1lOiBldmVudC5uYW1lLFxuICAgICAgZGlyZWN0aW9uOiAnZW50cnknLFxuICAgICAgZGVzY3JpcHRpb246IGV2ZW50LmRlc2NyaXB0aW9uLFxuICAgICAgbWFwcGVkSW5wdXQ6IGV2ZW50Lm1hcHBlZElucHV0LFxuICAgIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlclN1YmZsb3c/LihjdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlclN1YmZsb3coY3R4KTtcbiAgICBjb25zdCByaWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBzaWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkO1xuICAgIGNvbnN0IHNmSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQ7XG4gICAgdGhpcy5lbWl0KHtcbiAgICAgIHR5cGU6ICdzdWJmbG93JyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQubmFtZSxcbiAgICAgIHN0YWdlSWQ6IHNpZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiByaWQsXG4gICAgICBzdWJmbG93SWQ6IHNmSWQsXG4gICAgICBkaXJlY3Rpb246ICdlbnRyeScsXG4gICAgfSk7XG4gICAgLy8gRW1pdCBwZXIta2V5IHN0ZXAgZW50cmllcyBmb3IgbWFwcGVkIGlucHV0cy5cbiAgICAvL1xuICAgIC8vIFJvdXRlIEVBQ0gga2V5IHRocm91Z2ggdGhlIGNvbnN1bWVyJ3MgYHJlbmRlcmVyLnJlbmRlck9wYCBob29rIGJlZm9yZVxuICAgIC8vIGZhbGxpbmcgYmFjayB0byB0aGUgaGFyZGNvZGVkIGBJbnB1dDogJHtrZXl9ID0gJHt2YWx1ZVN1bW1hcnl9YFxuICAgIC8vIHRlbXBsYXRlLiBXaXRob3V0IHRoaXMgcm91dGluZywgYSBjb25zdW1lciB0aGF0IHByb3ZpZGVkIGFcbiAgICAvLyBkb21haW4tYXdhcmUgYHJlbmRlcmVyLnJlbmRlck9wYCAodG8gcmVuZGVyIGUuZy4gYHBhcnNlZFJlc3BvbnNlYFxuICAgIC8vIG9iamVjdHMgc2VtYW50aWNhbGx5KSB3b3VsZCBzZWUgYmVhdXRpZnVsIG91dHB1dCBmb3Igc2NvcGUgd3JpdGVzXG4gICAgLy8gYnV0IGdldCB0aGUgZ2VuZXJpYyBrZXktbGlzdCBmYWxsYmFjayBmb3Igc3ViZmxvdyBpbnB1dHMg4oCUIHRoZVxuICAgIC8vIGxpYnJhcnkncyBcImNvbWJpbmVkIG5hcnJhdGl2ZVwiIHByb21pc2UgKG9uZSByZW5kZXJlciBjb250cm9scyB0aGVcbiAgICAvLyB3aG9sZSBuYXJyYXRpdmUpIHdvdWxkIHNpbGVudGx5IGJyZWFrLiBXZSBob25vdXIgaXQgaGVyZS5cbiAgICAvL1xuICAgIC8vIFRoZSBPcFJlbmRlckNvbnRleHQgaXMgYnVpbHQgd2l0aCBgdHlwZTogJ3dyaXRlJ2AgYmVjYXVzZSBzZW1hbnRpY2FsbHlcbiAgICAvLyB0aGUgc3ViZmxvdydzIGluaXRpYWwgc2NvcGUgSVMgYmVpbmcgd3JpdHRlbiB2aWEgdGhlIHBhcmVudCdzXG4gICAgLy8gaW5wdXRNYXBwZXIuIGBvcGVyYXRpb246ICdzZXQnYCBsaWtld2lzZSDigJQgdGhpcyBpcyB0aGUgc3ViZmxvdydzXG4gICAgLy8gZmlyc3Qgc2lnaHQgb2YgdGhlIGtleS5cbiAgICAvL1xuICAgIC8vIFZhbHVlcyBzaG93biB3aGVuIGluY2x1ZGVWYWx1ZXM9dHJ1ZSDigJQgY29uc3VtZXIgcmVzcG9uc2libGUgZm9yXG4gICAgLy8gcmVkYWN0aW9uIHBvbGljeSBvbiB0aGUgcGFyZW50IHNjb3BlIChyZWRhY3RlZCBrZXlzIHByb2R1Y2VcbiAgICAvLyAnW1JFREFDVEVEXScgdmlhIFNjb3BlRmFjYWRlKS5cbiAgICBpZiAoZXZlbnQubWFwcGVkSW5wdXQgJiYgT2JqZWN0LmtleXMoZXZlbnQubWFwcGVkSW5wdXQpLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBzdGVwTnVtYmVyID0gMDtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV2ZW50Lm1hcHBlZElucHV0KSkge1xuICAgICAgICBjb25zdCB2YWx1ZVN1bW1hcnkgPSB0aGlzLmZvcm1hdFZhbHVlKHZhbHVlLCB0aGlzLm1heFZhbHVlTGVuZ3RoKTtcbiAgICAgICAgY29uc3Qgb3BDdHg6IE9wUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgICAgICB0eXBlOiAnd3JpdGUnLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICByYXdWYWx1ZTogdmFsdWUsXG4gICAgICAgICAgdmFsdWVTdW1tYXJ5LFxuICAgICAgICAgIG9wZXJhdGlvbjogJ3NldCcsXG4gICAgICAgICAgc3RlcE51bWJlcjogKytzdGVwTnVtYmVyLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIElmIHRoZSBjb25zdW1lciBzdXBwbGllZCBgcmVuZGVyZXIucmVuZGVyT3BgLCB1c2UgaXRzIHJldHVybiB2YWx1ZTpcbiAgICAgICAgLy8gICAtIHN0cmluZyDihpIgdXNlIGFzIHRoZSBuYXJyYXRpdmUgbGluZVxuICAgICAgICAvLyAgIC0gbnVsbCAgIOKGkiBkZWxpYmVyYXRlbHkgZXhjbHVkZSB0aGlzIGVudHJ5IChzYW1lIHNlbWFudGljcyBhc1xuICAgICAgICAvLyAgICAgICAgICAgICAgYGZsdXNoT3BzYCBhYm92ZSBhdCBsaW5lIH41NDApXG4gICAgICAgIC8vICAgLSB1bmRlZmluZWQg4oaSIHJlbmRlcmVyIGRvZXMgbm90IGhhbmRsZSB0aGlzIG9wIOKGkiBmYWxsIHRocm91Z2hcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHRvIHRoZSBoYXJkY29kZWQgdGVtcGxhdGVcbiAgICAgICAgLy8gSWYgbm8gcmVuZGVyZXIgYXQgYWxsLCB1c2UgdGhlIGhhcmRjb2RlZCB0ZW1wbGF0ZS5cbiAgICAgICAgbGV0IHRleHQ6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnJlbmRlcmVyPy5yZW5kZXJPcCkge1xuICAgICAgICAgIGNvbnN0IGN1c3RvbVRleHQgPSB0aGlzLnJlbmRlcmVyLnJlbmRlck9wKG9wQ3R4KTtcbiAgICAgICAgICBpZiAoY3VzdG9tVGV4dCA9PT0gbnVsbCkgY29udGludWU7IC8vIGV4Y2x1ZGVkIG9uIHB1cnBvc2VcbiAgICAgICAgICB0ZXh0ID1cbiAgICAgICAgICAgIGN1c3RvbVRleHQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IGN1c3RvbVRleHRcbiAgICAgICAgICAgICAgOiB0aGlzLmluY2x1ZGVWYWx1ZXNcbiAgICAgICAgICAgICAgPyBgSW5wdXQ6ICR7a2V5fSA9ICR7dmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgICAgICAgOiBgSW5wdXQ6ICR7a2V5fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dCA9IHRoaXMuaW5jbHVkZVZhbHVlcyA/IGBJbnB1dDogJHtrZXl9ID0gJHt2YWx1ZVN1bW1hcnl9YCA6IGBJbnB1dDogJHtrZXl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCh7XG4gICAgICAgICAgdHlwZTogJ3N0ZXAnLFxuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgc3RhZ2VOYW1lOiBldmVudC5uYW1lLFxuICAgICAgICAgIHN0YWdlSWQ6IHNpZCxcbiAgICAgICAgICBydW50aW1lU3RhZ2VJZDogcmlkLFxuICAgICAgICAgIHN1YmZsb3dJZDogc2ZJZCxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgcmF3VmFsdWU6IHZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblN1YmZsb3dFeGl0KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcmlkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQ7XG4gICAgY29uc3Qgc2lkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3RhZ2VJZDtcbiAgICBjb25zdCBzZklkID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkO1xuICAgIC8vIE5PVEU6IG91dHB1dCBzdGF0ZSBpcyBOT1QgZW1pdHRlZCBhcyBzdGVwIGVudHJpZXMgYmVjYXVzZSBpdCBtYXkgY29udGFpblxuICAgIC8vIHVucmVkYWN0ZWQgdmFsdWVzIGZyb20gdGhlIHN1YmZsb3cncyBpbnRlcm5hbCBzY29wZS4gVGhlIHN1YmZsb3cgZXhpdFxuICAgIC8vIGhlYWRlciBpcyBzdWZmaWNpZW50IOKAlCBkcmlsbCBpbnRvIHRoZSBzdWJmbG93IGZvciBkZXRhaWxzLlxuICAgIGNvbnN0IGN0eDogU3ViZmxvd1JlbmRlckNvbnRleHQgPSB7XG4gICAgICBuYW1lOiBldmVudC5uYW1lLFxuICAgICAgZGlyZWN0aW9uOiAnZXhpdCcsXG4gICAgICBvdXRwdXRTdGF0ZTogZXZlbnQub3V0cHV0U3RhdGUsXG4gICAgfTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyU3ViZmxvdz8uKGN0eCkgPz8gdGhpcy5kZWZhdWx0UmVuZGVyU3ViZmxvdyhjdHgpO1xuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAnc3ViZmxvdycsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICBzdGFnZUlkOiBzaWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogcmlkLFxuICAgICAgc3ViZmxvd0lkOiBzZklkLFxuICAgICAgZGlyZWN0aW9uOiAnZXhpdCcsXG4gICAgfSk7XG4gIH1cblxuICBvbkxvb3AoZXZlbnQ6IEZsb3dMb29wRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHg6IExvb3BSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgdGFyZ2V0OiBldmVudC50YXJnZXQsXG4gICAgICBpdGVyYXRpb246IGV2ZW50Lml0ZXJhdGlvbixcbiAgICAgIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbixcbiAgICB9O1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyPy5yZW5kZXJMb29wPy4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJMb29wKGN0eCk7XG4gICAgdGhpcy5lbWl0KHtcbiAgICAgIHR5cGU6ICdsb29wJyxcbiAgICAgIHRleHQsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uQnJlYWsoZXZlbnQ6IEZsb3dCcmVha0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4OiBCcmVha1JlbmRlckNvbnRleHQgPSB7IHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lIH07XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXI/LnJlbmRlckJyZWFrPy4oY3R4KSA/PyB0aGlzLmRlZmF1bHRSZW5kZXJCcmVhayhjdHgpO1xuICAgIHRoaXMuZW1pdCh7XG4gICAgICB0eXBlOiAnYnJlYWsnLFxuICAgICAgdGV4dCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd0lkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5zdWJmbG93SWQsXG4gICAgfSk7XG4gIH1cblxuICBvblBhdXNlKGV2ZW50OiBQYXVzZUV2ZW50IHwgRmxvd1BhdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBCb3RoIGNoYW5uZWxzIGZpcmUgb25QYXVzZSB3aXRoIGRpZmZlcmVudCBwYXlsb2FkIHNoYXBlcy4gTmFycmF0aXZlIG9ubHlcbiAgICAvLyBzdXJmYWNlcyB0aGUgY29udHJvbC1mbG93IHZhcmlhbnQgKHdoaWNoIGhhcyBzdGFnZU5hbWUvc3RhZ2VJZCkuIERhdGFcbiAgICAvLyBjaGFubmVsJ3MgUGF1c2VFdmVudCBpcyBpZ25vcmVkIHRvIGF2b2lkIGR1cGxpY2F0ZSBlbnRyaWVzLlxuICAgIGlmICghaXNGbG93RXZlbnQoZXZlbnQpKSByZXR1cm47XG4gICAgaWYgKCFldmVudC5zdGFnZU5hbWUgfHwgIWV2ZW50LnN0YWdlSWQpIHJldHVybjtcbiAgICBjb25zdCB0ZXh0ID0gYEV4ZWN1dGlvbiBwYXVzZWQgYXQgJHtldmVudC5zdGFnZU5hbWV9LmA7XG4gICAgdGhpcy5lbWl0KHtcbiAgICAgIHR5cGU6ICdwYXVzZScsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQgPz8gZXZlbnQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgb25SZXN1bWUoZXZlbnQ6IFJlc3VtZUV2ZW50IHwgRmxvd1Jlc3VtZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gU2FtZSBpc0Zsb3dFdmVudCBkaXNjcmltaW5hbnQgYXMgb25QYXVzZSDigJQgaWdub3JlIHNjb3BlIFJlc3VtZUV2ZW50LlxuICAgIGlmICghaXNGbG93RXZlbnQoZXZlbnQpKSByZXR1cm47XG4gICAgaWYgKCFldmVudC5zdGFnZU5hbWUgfHwgIWV2ZW50LnN0YWdlSWQpIHJldHVybjtcbiAgICBjb25zdCBzdWZmaXggPSBldmVudC5oYXNJbnB1dCA/ICcgd2l0aCBpbnB1dC4nIDogJy4nO1xuICAgIGNvbnN0IHRleHQgPSBgRXhlY3V0aW9uIHJlc3VtZWQgYXQgJHtldmVudC5zdGFnZU5hbWV9JHtzdWZmaXh9YDtcbiAgICB0aGlzLmVtaXQoe1xuICAgICAgdHlwZTogJ3Jlc3VtZScsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQgPz8gZXZlbnQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8uc3ViZmxvd0lkLFxuICAgIH0pO1xuICB9XG5cbiAgb25FcnJvcihldmVudDogRXJyb3JFdmVudCB8IEZsb3dFcnJvckV2ZW50KTogdm9pZCB7XG4gICAgLy8gTmFycmF0aXZlIG9ubHkgc3VyZmFjZXMgdGhlIGNvbnRyb2wtZmxvdyB2YXJpYW50IG9mIGVycm9ycyAoaGFzXG4gICAgLy8gc3RhZ2VOYW1lICsgbWVzc2FnZSkuIFNjb3BlLWxldmVsIEVycm9yRXZlbnQgaXMgY2FwdHVyZWQgZWxzZXdoZXJlLlxuICAgIGlmICghaXNGbG93RXZlbnQoZXZlbnQpKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBldmVudC5tZXNzYWdlICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbGV0IHZhbGlkYXRpb25Jc3N1ZXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZXZlbnQuc3RydWN0dXJlZEVycm9yPy5pc3N1ZXM/Lmxlbmd0aCkge1xuICAgICAgdmFsaWRhdGlvbklzc3VlcyA9IGV2ZW50LnN0cnVjdHVyZWRFcnJvci5pc3N1ZXNcbiAgICAgICAgLm1hcCgoaXNzdWUpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gaXNzdWUucGF0aC5sZW5ndGggPiAwID8gaXNzdWUucGF0aC5qb2luKCcuJykgOiAnKHJvb3QpJztcbiAgICAgICAgICByZXR1cm4gYCR7cGF0aH06ICR7aXNzdWUubWVzc2FnZX1gO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbignOyAnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdHg6IEVycm9yUmVuZGVyQ29udGV4dCA9IHtcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgbWVzc2FnZTogZXZlbnQubWVzc2FnZSxcbiAgICAgIHZhbGlkYXRpb25Jc3N1ZXMsXG4gICAgfTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyRXJyb3I/LihjdHgpID8/IHRoaXMuZGVmYXVsdFJlbmRlckVycm9yKGN0eCk7XG4gICAgdGhpcy5lbWl0KHtcbiAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICB0ZXh0LFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93SWQ6IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnN1YmZsb3dJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBFbWl0IGNoYW5uZWwgKFBoYXNlIDMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZWNlaXZlIGEgY29uc3VtZXItZW1pdHRlZCBldmVudCBmcm9tIGBzY29wZS4kZW1pdChuYW1lLCBwYXlsb2FkKWAuXG4gICAqXG4gICAqIEJ1ZmZlcmVkIGFsb25nc2lkZSBgb25SZWFkYC9gb25Xcml0ZWAgcGVyLXN0YWdlIHNvIHRoYXQgdGhlIGZpbmFsXG4gICAqIG5hcnJhdGl2ZSBwcmVzZXJ2ZXMgb3JkZXJpbmc6XG4gICAqXG4gICAqICAgMS4gc3RhZ2UgaGVhZGVyIChlbWl0dGVkIGJ5IGBvblN0YWdlRXhlY3V0ZWRgIC8gYG9uRGVjaXNpb25gKVxuICAgKiAgIDIuIGJ1ZmZlcmVkIG9wcyBmb3IgdGhhdCBzdGFnZSDigJQgaW4gY2FsbCBvcmRlciDigJQgZmx1c2hlZCByaWdodCBhZnRlclxuICAgKlxuICAgKiBXaXRob3V0IGJ1ZmZlcmluZywgZW1pdCBldmVudHMgd291bGQgZmlyZSBCRUZPUkUgdGhlIHN0YWdlIGhlYWRlclxuICAgKiAod2hpY2ggb25seSBsYW5kcyBhdCBgb25TdGFnZUV4ZWN1dGVkYCksIHByb2R1Y2luZyBvdXQtb2Ytb3JkZXJcbiAgICogbmFycmF0aXZlIGVudHJpZXMuIEZsdXNoIGhhcHBlbnMgaW4gYGZsdXNoT3BzYCB3aGljaCByb3V0ZXMgYGVtaXRgLVxuICAgKiB0eXBlZCBidWZmZXJlZCBvcHMgdGhyb3VnaCBgcmVuZGVyRW1pdGAgaW5zdGVhZCBvZiBgcmVuZGVyT3BgLlxuICAgKi9cbiAgb25FbWl0KGV2ZW50OiBFbWl0RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlck9wKGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCB7XG4gICAgICB0eXBlOiAnZW1pdCcsXG4gICAgICBrZXk6IGV2ZW50Lm5hbWUsXG4gICAgICByYXdWYWx1ZTogZXZlbnQucGF5bG9hZCxcbiAgICAgIGVtaXRFdmVudDogZXZlbnQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJFbWl0KGN0eDogRW1pdFJlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgW2VtaXRdICR7Y3R4Lm5hbWV9OiAke2N0eC5wYXlsb2FkU3VtbWFyeX1gO1xuICB9XG5cbiAgLy8g4pSA4pSAIE91dHB1dCAobmFycmF0aXZlLXNwZWNpZmljKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyBlbnRyaWVzIGdyb3VwZWQgYnkgc3ViZmxvd0lkIGZvciBzdHJ1Y3R1cmVkIGFjY2Vzcy5cbiAgICogUm9vdC1sZXZlbCBlbnRyaWVzIGhhdmUgc3ViZmxvd0lkID0gdW5kZWZpbmVkLlxuICAgKi9cbiAgZ2V0RW50cmllc0J5U3ViZmxvdygpOiBSZWNvcmQ8c3RyaW5nLCBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIENvbWJpbmVkTmFycmF0aXZlRW50cnlbXT4gPSB7ICcnOiBbXSB9O1xuICAgIHRoaXMuZm9yRWFjaEVudHJ5KChlbnRyeSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZW50cnkuc3ViZmxvd0lkID8/ICcnO1xuICAgICAgaWYgKCFyZXN1bHRba2V5XSkgcmVzdWx0W2tleV0gPSBbXTtcbiAgICAgIHJlc3VsdFtrZXldLnB1c2goZW50cnkpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogQ2xlYXJzIGFsbCBzdGF0ZS4gQ2FsbGVkIGF1dG9tYXRpY2FsbHkgYmVmb3JlIGVhY2ggcnVuLiAqL1xuICBvdmVycmlkZSBjbGVhcigpOiB2b2lkIHtcbiAgICBzdXBlci5jbGVhcigpO1xuICAgIHRoaXMucGVuZGluZ09wcy5jbGVhcigpO1xuICAgIHRoaXMuc3RhZ2VDb3VudGVycy5jbGVhcigpO1xuICAgIHRoaXMuZmlyc3RTdGFnZUZsYWdzLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFnZVZpc2l0Q291bnRzLmNsZWFyKCk7XG4gIH1cblxuICAvLyDilIDilIAgUHJpdmF0ZSBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgaW5jcmVtZW50U3RhZ2VDb3VudGVyKHN1YmZsb3dLZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc3RhZ2VDb3VudGVycy5nZXQoc3ViZmxvd0tleSkgPz8gMDtcbiAgICBjb25zdCBuZXh0ID0gY3VycmVudCArIDE7XG4gICAgdGhpcy5zdGFnZUNvdW50ZXJzLnNldChzdWJmbG93S2V5LCBuZXh0KTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZUZpcnN0U3RhZ2VGbGFnKHN1YmZsb3dLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5maXJzdFN0YWdlRmxhZ3MuaGFzKHN1YmZsb3dLZXkpKSB7XG4gICAgICB0aGlzLmZpcnN0U3RhZ2VGbGFncy5zZXQoc3ViZmxvd0tleSwgZmFsc2UpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVmZmVyT3AocnVudGltZVN0YWdlSWQ6IHN0cmluZywgb3A6IE9taXQ8QnVmZmVyZWRPcCwgJ3N0ZXBOdW1iZXInPik6IHZvaWQge1xuICAgIGxldCBvcHMgPSB0aGlzLnBlbmRpbmdPcHMuZ2V0KHJ1bnRpbWVTdGFnZUlkKTtcbiAgICBpZiAoIW9wcykge1xuICAgICAgb3BzID0gW107XG4gICAgICB0aGlzLnBlbmRpbmdPcHMuc2V0KHJ1bnRpbWVTdGFnZUlkLCBvcHMpO1xuICAgIH1cbiAgICBvcHMucHVzaCh7IC4uLm9wLCBzdGVwTnVtYmVyOiBvcHMubGVuZ3RoICsgMSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmx1c2hPcHMocnVudGltZVN0YWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3ViZmxvd0lkPzogc3RyaW5nLCBzdGFnZUlkPzogc3RyaW5nLCBzdGFnZU5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAocnVudGltZVN0YWdlSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IG9wcyA9IHRoaXMucGVuZGluZ09wcy5nZXQocnVudGltZVN0YWdlSWQpO1xuICAgIGlmICghb3BzIHx8IG9wcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGZvciAoY29uc3Qgb3Agb2Ygb3BzKSB7XG4gICAgICAvLyDilIDilIAgRW1pdCBldmVudHMgdGFrZSBhIGRpZmZlcmVudCByZW5kZXIgcGF0aCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAgIC8vXG4gICAgICAvLyBFbWl0IGV2ZW50cyBhcmUgYnVmZmVyZWQgYWxvbmdzaWRlIHJlYWRzL3dyaXRlcyAoc28gdGhleSBhcHBlYXJcbiAgICAgIC8vIHVuZGVyIHRoZWlyIG93bmluZyBzdGFnZSdzIGhlYWRlciBpbiBuYXJyYXRpdmUgb3JkZXIsIG5vdCBpbmxpbmVcbiAgICAgIC8vIGF0IGNhbGwgdGltZSkuIEF0IGZsdXNoLCB0aGV5IHJvdXRlIHRocm91Z2ggYHJlbmRlckVtaXRgIGluc3RlYWRcbiAgICAgIC8vIG9mIGByZW5kZXJPcGAg4oCUIGNvbnN1bWVycyB3YW50aW5nIGN1c3RvbSBlbWl0IHJlbmRlcmluZyBpbXBsZW1lbnRcbiAgICAgIC8vIHRoZSBkZWRpY2F0ZWQgaG9vay4gVW5oYW5kbGVkIC8gbWlzc2luZyByZW5kZXJlciBmYWxscyBiYWNrIHRvXG4gICAgICAvLyB0aGUgc2FtZSBjb21wYWN0IGBbZW1pdF0gbmFtZTogcGF5bG9hZFN1bW1hcnlgIGRlZmF1bHQgdXNlZCBieVxuICAgICAgLy8gdGhlIHByZS1idWZmZXJpbmcgb25FbWl0IHBhdGguXG4gICAgICBpZiAob3AudHlwZSA9PT0gJ2VtaXQnICYmIG9wLmVtaXRFdmVudCkge1xuICAgICAgICBjb25zdCBlID0gb3AuZW1pdEV2ZW50O1xuICAgICAgICBjb25zdCBwYXlsb2FkU3VtbWFyeSA9IHRoaXMuZm9ybWF0VmFsdWUoZS5wYXlsb2FkLCB0aGlzLm1heFZhbHVlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZW1pdEN0eDogRW1pdFJlbmRlckNvbnRleHQgPSB7XG4gICAgICAgICAgbmFtZTogZS5uYW1lLFxuICAgICAgICAgIHBheWxvYWQ6IGUucGF5bG9hZCxcbiAgICAgICAgICBzdGFnZU5hbWU6IGUuc3RhZ2VOYW1lLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiBlLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICAgIHN1YmZsb3dQYXRoOiBlLnN1YmZsb3dQYXRoLFxuICAgICAgICAgIHBpcGVsaW5lSWQ6IGUucGlwZWxpbmVJZCxcbiAgICAgICAgICB0aW1lc3RhbXA6IGUudGltZXN0YW1wLFxuICAgICAgICAgIHBheWxvYWRTdW1tYXJ5LFxuICAgICAgICB9O1xuICAgICAgICBsZXQgZW1pdFRleHQ6IHN0cmluZztcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZXI/LnJlbmRlckVtaXQpIHtcbiAgICAgICAgICBjb25zdCBjdXN0b20gPSB0aGlzLnJlbmRlcmVyLnJlbmRlckVtaXQoZW1pdEN0eCk7XG4gICAgICAgICAgaWYgKGN1c3RvbSA9PT0gbnVsbCkgY29udGludWU7IC8vIGRlbGliZXJhdGVseSBleGNsdWRlZFxuICAgICAgICAgIGVtaXRUZXh0ID0gY3VzdG9tICE9PSB1bmRlZmluZWQgPyBjdXN0b20gOiB0aGlzLmRlZmF1bHRSZW5kZXJFbWl0KGVtaXRDdHgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVtaXRUZXh0ID0gdGhpcy5kZWZhdWx0UmVuZGVyRW1pdChlbWl0Q3R4KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoe1xuICAgICAgICAgIHR5cGU6ICdlbWl0JyxcbiAgICAgICAgICB0ZXh0OiBlbWl0VGV4dCxcbiAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICBzdGFnZU5hbWUsXG4gICAgICAgICAgc3RhZ2VJZCxcbiAgICAgICAgICBydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgICBzdGVwTnVtYmVyOiBvcC5zdGVwTnVtYmVyLFxuICAgICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBdCB0aGlzIHBvaW50IG9wLnR5cGUgaXMgbmFycm93ZWQgdG8gJ3JlYWQnIHwgJ3dyaXRlJyAoZW1pdCBicmFuY2hcbiAgICAgIC8vIGFib3ZlIHVzZXMgYGNvbnRpbnVlYCkuIFR5cGVTY3JpcHQgY2FuJ3QgZm9sbG93IHRoYXQgbmFycm93aW5nXG4gICAgICAvLyB0aHJvdWdoIHRoZSBjb250aW51ZSwgc28gd2UgYXNzZXJ0IGF0IHJlbmRlciB0aW1lLlxuICAgICAgY29uc3Qgb3BUeXBlID0gb3AudHlwZSBhcyAncmVhZCcgfCAnd3JpdGUnO1xuICAgICAgY29uc3QgdmFsdWVTdW1tYXJ5ID0gdGhpcy5mb3JtYXRWYWx1ZShvcC5yYXdWYWx1ZSwgdGhpcy5tYXhWYWx1ZUxlbmd0aCk7XG4gICAgICBjb25zdCBvcEN0eDogT3BSZW5kZXJDb250ZXh0ID0ge1xuICAgICAgICB0eXBlOiBvcFR5cGUsXG4gICAgICAgIGtleTogb3Aua2V5LFxuICAgICAgICByYXdWYWx1ZTogb3AucmF3VmFsdWUsXG4gICAgICAgIHZhbHVlU3VtbWFyeSxcbiAgICAgICAgb3BlcmF0aW9uOiBvcC5vcGVyYXRpb24sXG4gICAgICAgIHN0ZXBOdW1iZXI6IG9wLnN0ZXBOdW1iZXIsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlcj8ucmVuZGVyT3AgPyB0aGlzLnJlbmRlcmVyLnJlbmRlck9wKG9wQ3R4KSA6IHRoaXMuZGVmYXVsdFJlbmRlck9wKG9wQ3R4KTtcblxuICAgICAgaWYgKHRleHQgPT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgIHRoaXMuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdzdGVwJyxcbiAgICAgICAgdGV4dCxcbiAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgIHN0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQsXG4gICAgICAgIHN0ZXBOdW1iZXI6IG9wLnN0ZXBOdW1iZXIsXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAga2V5OiBvcC5rZXksXG4gICAgICAgIHJhd1ZhbHVlOiBvcC5yYXdWYWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ09wcy5kZWxldGUocnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLy8g4pSA4pSAIERlZmF1bHQgcmVuZGVyZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlclN0YWdlKGN0eDogU3RhZ2VSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBsZXQgaW5uZXI6IHN0cmluZztcbiAgICBpZiAoY3R4LmlzRmlyc3QpIHtcbiAgICAgIGlubmVyID0gY3R4LmRlc2NyaXB0aW9uID8gYFRoZSBwcm9jZXNzIGJlZ2FuOiAke2N0eC5kZXNjcmlwdGlvbn0uYCA6IGBUaGUgcHJvY2VzcyBiZWdhbiB3aXRoICR7Y3R4LnN0YWdlTmFtZX0uYDtcbiAgICB9IGVsc2UgaWYgKGN0eC5sb29wSXRlcmF0aW9uICYmIGN0eC5sb29wSXRlcmF0aW9uID4gMCkge1xuICAgICAgaW5uZXIgPSBjdHguZGVzY3JpcHRpb25cbiAgICAgICAgPyBgTG9vcGVkIGJhY2s6ICR7Y3R4LmRlc2NyaXB0aW9ufSAocGFzcyAke2N0eC5sb29wSXRlcmF0aW9ufSkuYFxuICAgICAgICA6IGBMb29wZWQgYmFjayB0byAke2N0eC5zdGFnZU5hbWV9IChwYXNzICR7Y3R4Lmxvb3BJdGVyYXRpb259KS5gO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbm5lciA9IGN0eC5kZXNjcmlwdGlvbiA/IGBOZXh0IHN0ZXA6ICR7Y3R4LmRlc2NyaXB0aW9ufS5gIDogYE5leHQsIGl0IG1vdmVkIG9uIHRvICR7Y3R4LnN0YWdlTmFtZX0uYDtcbiAgICB9XG4gICAgcmV0dXJuIGBTdGFnZSAke2N0eC5zdGFnZU51bWJlcn06ICR7aW5uZXJ9YDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlck9wKGN0eDogT3BSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGVwUHJlZml4ID0gdGhpcy5pbmNsdWRlU3RlcE51bWJlcnMgPyBgU3RlcCAke2N0eC5zdGVwTnVtYmVyfTogYCA6ICcnO1xuICAgIGlmIChjdHgudHlwZSA9PT0gJ3JlYWQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbmNsdWRlVmFsdWVzICYmIGN0eC52YWx1ZVN1bW1hcnlcbiAgICAgICAgPyBgJHtzdGVwUHJlZml4fVJlYWQgJHtjdHgua2V5fSA9ICR7Y3R4LnZhbHVlU3VtbWFyeX1gXG4gICAgICAgIDogYCR7c3RlcFByZWZpeH1SZWFkICR7Y3R4LmtleX1gO1xuICAgIH1cbiAgICBpZiAoY3R4Lm9wZXJhdGlvbiA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgIHJldHVybiBgJHtzdGVwUHJlZml4fURlbGV0ZSAke2N0eC5rZXl9YDtcbiAgICB9XG4gICAgaWYgKGN0eC5vcGVyYXRpb24gPT09ICd1cGRhdGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbmNsdWRlVmFsdWVzXG4gICAgICAgID8gYCR7c3RlcFByZWZpeH1VcGRhdGUgJHtjdHgua2V5fSA9ICR7Y3R4LnZhbHVlU3VtbWFyeX1gXG4gICAgICAgIDogYCR7c3RlcFByZWZpeH1VcGRhdGUgJHtjdHgua2V5fWA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmluY2x1ZGVWYWx1ZXMgPyBgJHtzdGVwUHJlZml4fVdyaXRlICR7Y3R4LmtleX0gPSAke2N0eC52YWx1ZVN1bW1hcnl9YCA6IGAke3N0ZXBQcmVmaXh9V3JpdGUgJHtjdHgua2V5fWA7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJEZWNpc2lvbihjdHg6IERlY2lzaW9uUmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgY29uc3QgYnJhbmNoTmFtZSA9IGN0eC5jaG9zZW47XG4gICAgbGV0IGNvbmRpdGlvblRleHQ6IHN0cmluZztcbiAgICBpZiAoY3R4LmV2aWRlbmNlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3QgZXZpZGVuY2UgPSBjdHguZXZpZGVuY2UgYXMgYW55O1xuICAgICAgY29uc3QgbWF0Y2hlZFJ1bGUgPSBldmlkZW5jZS5ydWxlcz8uZmluZCgocjogYW55KSA9PiByLm1hdGNoZWQpO1xuICAgICAgaWYgKG1hdGNoZWRSdWxlKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gbWF0Y2hlZFJ1bGUubGFiZWwgPyBgIFwiJHttYXRjaGVkUnVsZS5sYWJlbH1cImAgOiAnJztcbiAgICAgICAgaWYgKG1hdGNoZWRSdWxlLnR5cGUgPT09ICdmaWx0ZXInKSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBtYXRjaGVkUnVsZS5jb25kaXRpb25zLm1hcChcbiAgICAgICAgICAgIChjOiBhbnkpID0+XG4gICAgICAgICAgICAgIGAke2Mua2V5fSAke2MuYWN0dWFsU3VtbWFyeX0gJHtjLm9wfSAke0pTT04uc3RyaW5naWZ5KGMudGhyZXNob2xkKX0gJHtjLnJlc3VsdCA/ICdcXHUyNzEzJyA6ICdcXHUyNzE3J31gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uZGl0aW9uVGV4dCA9IGBJdCBldmFsdWF0ZWQgUnVsZSAke21hdGNoZWRSdWxlLnJ1bGVJbmRleH0ke2xhYmVsfTogJHtwYXJ0cy5qb2luKFxuICAgICAgICAgICAgJywgJyxcbiAgICAgICAgICApfSwgYW5kIGNob3NlICR7YnJhbmNoTmFtZX0uYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBwYXJ0cyA9IG1hdGNoZWRSdWxlLmlucHV0cy5tYXAoKGk6IGFueSkgPT4gYCR7aS5rZXl9PSR7aS52YWx1ZVN1bW1hcnl9YCk7XG4gICAgICAgICAgY29uZGl0aW9uVGV4dCA9IGBJdCBleGFtaW5lZCR7bGFiZWx9OiAke3BhcnRzLmpvaW4oJywgJyl9LCBhbmQgY2hvc2UgJHticmFuY2hOYW1lfS5gO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnJvcmVkQ291bnQgPSBldmlkZW5jZS5ydWxlcz8uZmlsdGVyKChyOiBhbnkpID0+IHIubWF0Y2hFcnJvciAhPT0gdW5kZWZpbmVkKS5sZW5ndGggPz8gMDtcbiAgICAgICAgY29uc3QgZXJyb3JOb3RlID0gZXJyb3JlZENvdW50ID4gMCA/IGAgKCR7ZXJyb3JlZENvdW50fSBydWxlJHtlcnJvcmVkQ291bnQgPiAxID8gJ3MnIDogJyd9IHRocmV3IGVycm9ycylgIDogJyc7XG4gICAgICAgIGNvbmRpdGlvblRleHQgPSBgTm8gcnVsZXMgbWF0Y2hlZCR7ZXJyb3JOb3RlfSwgZmVsbCBiYWNrIHRvIGRlZmF1bHQ6ICR7YnJhbmNoTmFtZX0uYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGN0eC5kZXNjcmlwdGlvbiAmJiBjdHgucmF0aW9uYWxlKSB7XG4gICAgICBjb25kaXRpb25UZXh0ID0gYEl0ICR7Y3R4LmRlc2NyaXB0aW9ufTogJHtjdHgucmF0aW9uYWxlfSwgc28gaXQgY2hvc2UgJHticmFuY2hOYW1lfS5gO1xuICAgIH0gZWxzZSBpZiAoY3R4LmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25kaXRpb25UZXh0ID0gYEl0ICR7Y3R4LmRlc2NyaXB0aW9ufSBhbmQgY2hvc2UgJHticmFuY2hOYW1lfS5gO1xuICAgIH0gZWxzZSBpZiAoY3R4LnJhdGlvbmFsZSkge1xuICAgICAgY29uZGl0aW9uVGV4dCA9IGBBIGRlY2lzaW9uIHdhcyBtYWRlOiAke2N0eC5yYXRpb25hbGV9LCBzbyB0aGUgcGF0aCB0YWtlbiB3YXMgJHticmFuY2hOYW1lfS5gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25kaXRpb25UZXh0ID0gYEEgZGVjaXNpb24gd2FzIG1hZGUsIGFuZCB0aGUgcGF0aCB0YWtlbiB3YXMgJHticmFuY2hOYW1lfS5gO1xuICAgIH1cbiAgICByZXR1cm4gYFtDb25kaXRpb25dOiAke2NvbmRpdGlvblRleHR9YDtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdFJlbmRlckZvcmsoY3R4OiBGb3JrUmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZXMgPSBjdHguY2hpbGRyZW4uam9pbignLCAnKTtcbiAgICByZXR1cm4gYFtQYXJhbGxlbF06IEZvcmtpbmcgaW50byAke2N0eC5jaGlsZHJlbi5sZW5ndGh9IHBhcmFsbGVsIHBhdGhzOiAke25hbWVzfS5gO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyU2VsZWN0ZWQoY3R4OiBTZWxlY3RlZFJlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIGlmIChjdHguZXZpZGVuY2UpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBldmlkZW5jZSA9IGN0eC5ldmlkZW5jZSBhcyBhbnk7XG4gICAgICBjb25zdCBtYXRjaGVkID0gZXZpZGVuY2UucnVsZXM/LmZpbHRlcigocjogYW55KSA9PiByLm1hdGNoZWQpID8/IFtdO1xuICAgICAgY29uc3QgcGFydHMgPSBtYXRjaGVkLm1hcCgocjogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gci5sYWJlbCA/IGAgXCIke3IubGFiZWx9XCJgIDogJyc7XG4gICAgICAgIGlmIChyLnR5cGUgPT09ICdmaWx0ZXInKSB7XG4gICAgICAgICAgY29uc3QgY29uZHMgPSByLmNvbmRpdGlvbnNcbiAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgIChjOiBhbnkpID0+XG4gICAgICAgICAgICAgICAgYCR7Yy5rZXl9ICR7Yy5hY3R1YWxTdW1tYXJ5fSAke2Mub3B9ICR7SlNPTi5zdHJpbmdpZnkoYy50aHJlc2hvbGQpfSAke2MucmVzdWx0ID8gJ1xcdTI3MTMnIDogJ1xcdTI3MTcnfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgICByZXR1cm4gYCR7ci5icmFuY2h9JHtsYWJlbH0gKCR7Y29uZHN9KWA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5wdXRzID0gci5pbnB1dHMubWFwKChpOiBhbnkpID0+IGAke2kua2V5fT0ke2kudmFsdWVTdW1tYXJ5fWApLmpvaW4oJywgJyk7XG4gICAgICAgIHJldHVybiBgJHtyLmJyYW5jaH0ke2xhYmVsfSAoJHtpbnB1dHN9KWA7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBgW1NlbGVjdGVkXTogJHtjdHguc2VsZWN0ZWQubGVuZ3RofSBvZiAke2N0eC50b3RhbH0gcGF0aHMgc2VsZWN0ZWQ6ICR7cGFydHMuam9pbignOyAnKX0uYDtcbiAgICB9XG4gICAgY29uc3QgbmFtZXMgPSBjdHguc2VsZWN0ZWQuam9pbignLCAnKTtcbiAgICByZXR1cm4gYFtTZWxlY3RlZF06ICR7Y3R4LnNlbGVjdGVkLmxlbmd0aH0gb2YgJHtjdHgudG90YWx9IHBhdGhzIHNlbGVjdGVkIGZvciBleGVjdXRpb246ICR7bmFtZXN9LmA7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJTdWJmbG93KGN0eDogU3ViZmxvd1JlbmRlckNvbnRleHQpOiBzdHJpbmcge1xuICAgIGlmIChjdHguZGlyZWN0aW9uID09PSAnZXhpdCcpIHtcbiAgICAgIHJldHVybiBgRXhpdGluZyB0aGUgJHtjdHgubmFtZX0gc3ViZmxvdy5gO1xuICAgIH1cbiAgICByZXR1cm4gY3R4LmRlc2NyaXB0aW9uID8gYEVudGVyaW5nICR7Y3R4Lm5hbWV9OiAke2N0eC5kZXNjcmlwdGlvbn0uYCA6IGBFbnRlcmluZyB0aGUgJHtjdHgubmFtZX0gc3ViZmxvdy5gO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0UmVuZGVyTG9vcChjdHg6IExvb3BSZW5kZXJDb250ZXh0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gY3R4LmRlc2NyaXB0aW9uXG4gICAgICA/IGBPbiBwYXNzICR7Y3R4Lml0ZXJhdGlvbn06ICR7Y3R4LmRlc2NyaXB0aW9ufSBhZ2Fpbi5gXG4gICAgICA6IGBPbiBwYXNzICR7Y3R4Lml0ZXJhdGlvbn0gdGhyb3VnaCAke2N0eC50YXJnZXR9LmA7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJCcmVhayhjdHg6IEJyZWFrUmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBFeGVjdXRpb24gc3RvcHBlZCBhdCAke2N0eC5zdGFnZU5hbWV9LmA7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRSZW5kZXJFcnJvcihjdHg6IEVycm9yUmVuZGVyQ29udGV4dCk6IHN0cmluZyB7XG4gICAgbGV0IHRleHQgPSBgQW4gZXJyb3Igb2NjdXJyZWQgYXQgJHtjdHguc3RhZ2VOYW1lfTogJHtjdHgubWVzc2FnZX0uYDtcbiAgICBpZiAoY3R4LnZhbGlkYXRpb25Jc3N1ZXMpIHtcbiAgICAgIHRleHQgKz0gYCBWYWxpZGF0aW9uIGlzc3VlczogJHtjdHgudmFsaWRhdGlvbklzc3Vlc30uYDtcbiAgICB9XG4gICAgcmV0dXJuIGBbRXJyb3JdOiAke3RleHR9YDtcbiAgfVxufVxuIl19