footprintjs 10.0.1 → 10.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/AGENTS.md +2 -1
  2. package/CLAUDE.md +61 -7
  3. package/README.md +136 -312
  4. package/dist/esm/index.d.ts +62 -2
  5. package/dist/esm/index.js +13 -6
  6. package/dist/esm/lib/attempt/anySignal.d.ts +19 -0
  7. package/dist/esm/lib/attempt/anySignal.js +39 -0
  8. package/dist/esm/lib/attempt/call.d.ts +88 -0
  9. package/dist/esm/lib/attempt/call.js +129 -0
  10. package/dist/esm/lib/attempt/category.d.ts +37 -0
  11. package/dist/esm/lib/attempt/category.js +131 -0
  12. package/dist/esm/lib/attempt/correlation.d.ts +95 -0
  13. package/dist/esm/lib/attempt/correlation.js +178 -0
  14. package/dist/esm/lib/attempt/deadline.d.ts +44 -0
  15. package/dist/esm/lib/attempt/deadline.js +101 -0
  16. package/dist/esm/lib/attempt/decision.d.ts +52 -0
  17. package/dist/esm/lib/attempt/decision.js +134 -0
  18. package/dist/esm/lib/attempt/effect.d.ts +76 -0
  19. package/dist/esm/lib/attempt/effect.js +160 -0
  20. package/dist/esm/lib/attempt/errors.d.ts +41 -0
  21. package/dist/esm/lib/attempt/errors.js +44 -0
  22. package/dist/esm/lib/attempt/index.d.ts +18 -0
  23. package/dist/esm/lib/attempt/index.js +15 -0
  24. package/dist/esm/lib/attempt/name.d.ts +21 -0
  25. package/dist/esm/lib/attempt/name.js +43 -0
  26. package/dist/esm/lib/attempt/observed.d.ts +66 -0
  27. package/dist/esm/lib/attempt/observed.js +171 -0
  28. package/dist/esm/lib/attempt/policy.d.ts +45 -0
  29. package/dist/esm/lib/attempt/policy.js +83 -0
  30. package/dist/esm/lib/attempt/record.d.ts +11 -0
  31. package/dist/esm/lib/attempt/record.js +24 -0
  32. package/dist/esm/lib/attempt/retryLoopContext.d.ts +18 -0
  33. package/dist/esm/lib/attempt/retryLoopContext.js +24 -0
  34. package/dist/esm/lib/attempt/retryLoopTypes.d.ts +18 -0
  35. package/dist/esm/lib/attempt/retryLoopTypes.js +2 -0
  36. package/dist/esm/lib/attempt/runner.d.ts +157 -0
  37. package/dist/esm/lib/attempt/runner.js +523 -0
  38. package/dist/esm/lib/attempt/standalone.d.ts +47 -0
  39. package/dist/esm/lib/attempt/standalone.js +126 -0
  40. package/dist/esm/lib/attempt/types.d.ts +453 -0
  41. package/dist/esm/lib/attempt/types.js +16 -0
  42. package/dist/esm/lib/budget/index.d.ts +9 -0
  43. package/dist/esm/lib/budget/index.js +9 -0
  44. package/dist/esm/lib/budget/timeBudget.d.ts +136 -0
  45. package/dist/esm/lib/budget/timeBudget.js +666 -0
  46. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +88 -3
  47. package/dist/esm/lib/builder/FlowChartBuilder.js +199 -9
  48. package/dist/esm/lib/builder/retryLoop.d.ts +56 -0
  49. package/dist/esm/lib/builder/retryLoop.js +283 -0
  50. package/dist/esm/lib/builder/types.d.ts +35 -1
  51. package/dist/esm/lib/builder/types.js +1 -1
  52. package/dist/esm/lib/decide/decide.js +2 -2
  53. package/dist/esm/lib/decide/index.d.ts +1 -1
  54. package/dist/esm/lib/decide/index.js +2 -2
  55. package/dist/esm/lib/decide/types.d.ts +3 -0
  56. package/dist/esm/lib/decide/types.js +1 -8
  57. package/dist/esm/lib/engine/graph/StageNode.d.ts +11 -1
  58. package/dist/esm/lib/engine/graph/StageNode.js +1 -1
  59. package/dist/esm/lib/engine/graph/prefixNodeTree.js +5 -1
  60. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
  61. package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
  62. package/dist/esm/lib/engine/handlers/ResumeEntry.js +3 -1
  63. package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
  64. package/dist/esm/lib/engine/handlers/StageRunner.d.ts +8 -1
  65. package/dist/esm/lib/engine/handlers/StageRunner.js +36 -9
  66. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +24 -5
  67. package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
  68. package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
  69. package/dist/esm/lib/engine/handlers/stageError.d.ts +9 -0
  70. package/dist/esm/lib/engine/handlers/stageError.js +23 -1
  71. package/dist/esm/lib/engine/index.d.ts +2 -2
  72. package/dist/esm/lib/engine/index.js +1 -1
  73. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
  74. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +68 -40
  75. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
  76. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
  77. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
  78. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +61 -9
  79. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
  80. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
  81. package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +23 -0
  82. package/dist/esm/lib/engine/narrative/formatting/sentences.js +127 -1
  83. package/dist/esm/lib/engine/narrative/index.d.ts +2 -2
  84. package/dist/esm/lib/engine/narrative/index.js +1 -1
  85. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +27 -21
  86. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  87. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
  88. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
  89. package/dist/esm/lib/engine/narrative/recorders/index.d.ts +1 -1
  90. package/dist/esm/lib/engine/narrative/recorders/index.js +1 -1
  91. package/dist/esm/lib/engine/narrative/types.d.ts +74 -5
  92. package/dist/esm/lib/engine/narrative/types.js +1 -1
  93. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
  94. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +194 -118
  95. package/dist/esm/lib/engine/traversalContext.d.ts +7 -2
  96. package/dist/esm/lib/engine/traversalContext.js +6 -3
  97. package/dist/esm/lib/engine/types.d.ts +52 -57
  98. package/dist/esm/lib/engine/types.js +1 -1
  99. package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
  100. package/dist/esm/lib/errors/terminalFailure.js +60 -0
  101. package/dist/esm/lib/{decide → filter}/evaluator.d.ts +7 -2
  102. package/dist/esm/lib/filter/evaluator.js +135 -0
  103. package/dist/esm/lib/ids/idempotencyKey.d.ts +14 -0
  104. package/dist/esm/lib/ids/idempotencyKey.js +24 -0
  105. package/dist/esm/lib/memory/StageContext.d.ts +123 -3
  106. package/dist/esm/lib/memory/StageContext.js +245 -4
  107. package/dist/esm/lib/memory/attention.d.ts +26 -0
  108. package/dist/esm/lib/memory/attention.js +171 -0
  109. package/dist/esm/lib/memory/borrowedMutation.d.ts +8 -0
  110. package/dist/esm/lib/memory/borrowedMutation.js +14 -1
  111. package/dist/esm/lib/memory/frameTypes.d.ts +38 -0
  112. package/dist/esm/lib/memory/frameTypes.js +3 -1
  113. package/dist/esm/lib/memory/redaction.d.ts +12 -0
  114. package/dist/esm/lib/memory/redaction.js +54 -5
  115. package/dist/esm/lib/pause/record.js +10 -1
  116. package/dist/esm/lib/pause/types.d.ts +19 -0
  117. package/dist/esm/lib/pause/types.js +17 -1
  118. package/dist/esm/lib/reactive/createTypedScope.js +3 -1
  119. package/dist/esm/lib/reactive/types.d.ts +36 -4
  120. package/dist/esm/lib/reactive/types.js +3 -1
  121. package/dist/esm/lib/recorder/AttemptRecorder.d.ts +141 -0
  122. package/dist/esm/lib/recorder/AttemptRecorder.js +412 -0
  123. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +36 -2
  124. package/dist/esm/lib/recorder/ControlDepRecorder.js +50 -2
  125. package/dist/esm/lib/recorder/EmitRecorder.d.ts +3 -0
  126. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  127. package/dist/esm/lib/recorder/InOutRecorder.d.ts +37 -1
  128. package/dist/esm/lib/recorder/InOutRecorder.js +75 -6
  129. package/dist/esm/lib/recorder/QualityRecorder.d.ts +32 -5
  130. package/dist/esm/lib/recorder/QualityRecorder.js +87 -29
  131. package/dist/esm/lib/recorder/TopologyRecorder.d.ts +35 -5
  132. package/dist/esm/lib/recorder/TopologyRecorder.js +76 -2
  133. package/dist/esm/lib/recorder/attemptMetricRows.d.ts +11 -0
  134. package/dist/esm/lib/recorder/attemptMetricRows.js +202 -0
  135. package/dist/esm/lib/recorder/attemptMetrics.d.ts +7 -0
  136. package/dist/esm/lib/recorder/attemptMetrics.js +165 -0
  137. package/dist/esm/lib/recorder/attemptMetricsTypes.d.ts +114 -0
  138. package/dist/esm/lib/recorder/attemptMetricsTypes.js +2 -0
  139. package/dist/esm/lib/recorder/attemptOTel.d.ts +78 -0
  140. package/dist/esm/lib/recorder/attemptOTel.js +107 -0
  141. package/dist/esm/lib/recorder/attemptSeries.d.ts +81 -0
  142. package/dist/esm/lib/recorder/attemptSeries.js +103 -0
  143. package/dist/esm/lib/recorder/hooks.d.ts +9 -0
  144. package/dist/esm/lib/recorder/hooks.js +4 -1
  145. package/dist/esm/lib/runner/DeferredObserverTier.js +13 -1
  146. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +54 -6
  147. package/dist/esm/lib/runner/ExecutionRuntime.js +57 -5
  148. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +46 -2
  149. package/dist/esm/lib/runner/FlowChartExecutor.js +330 -101
  150. package/dist/esm/lib/runner/RunnableChart.d.ts +6 -0
  151. package/dist/esm/lib/runner/RunnableChart.js +5 -1
  152. package/dist/esm/lib/runner/attach.d.ts +2 -1
  153. package/dist/esm/lib/runner/attach.js +8 -2
  154. package/dist/esm/lib/runner/checkpoint.js +3 -1
  155. package/dist/esm/lib/runner/deadline.d.ts +42 -0
  156. package/dist/esm/lib/runner/deadline.js +90 -0
  157. package/dist/esm/lib/runner/index.d.ts +3 -1
  158. package/dist/esm/lib/runner/index.js +2 -1
  159. package/dist/esm/lib/runner/options.d.ts +17 -0
  160. package/dist/esm/lib/runner/options.js +3 -1
  161. package/dist/esm/lib/runner/recordSink.d.ts +128 -0
  162. package/dist/esm/lib/runner/recordSink.js +296 -0
  163. package/dist/esm/lib/runner/resume.d.ts +3 -0
  164. package/dist/esm/lib/runner/resume.js +22 -2
  165. package/dist/esm/lib/runner/snapshot.d.ts +2 -2
  166. package/dist/esm/lib/runner/snapshot.js +6 -2
  167. package/dist/esm/lib/scope/ScopeFacade.d.ts +118 -4
  168. package/dist/esm/lib/scope/ScopeFacade.js +304 -7
  169. package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +17 -3
  170. package/dist/esm/lib/scope/recorders/DebugRecorder.js +79 -13
  171. package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +10 -0
  172. package/dist/esm/lib/scope/recorders/MetricRecorder.js +15 -2
  173. package/dist/esm/lib/scope/runtime.d.ts +3 -0
  174. package/dist/esm/lib/scope/runtime.js +1 -1
  175. package/dist/esm/lib/scope/types.d.ts +6 -0
  176. package/dist/esm/lib/scope/types.js +1 -1
  177. package/dist/esm/lib/sinks/fileSink.d.ts +135 -0
  178. package/dist/esm/lib/sinks/fileSink.js +387 -0
  179. package/dist/esm/recorders.d.ts +8 -2
  180. package/dist/esm/recorders.js +7 -1
  181. package/dist/esm/sinks.d.ts +23 -0
  182. package/dist/esm/sinks.js +23 -0
  183. package/dist/esm/trace.d.ts +2 -2
  184. package/dist/esm/trace.js +1 -1
  185. package/dist/index.js +77 -60
  186. package/dist/lib/attempt/anySignal.js +43 -0
  187. package/dist/lib/attempt/call.js +134 -0
  188. package/dist/lib/attempt/category.js +136 -0
  189. package/dist/lib/attempt/correlation.js +186 -0
  190. package/dist/lib/attempt/deadline.js +112 -0
  191. package/dist/lib/attempt/decision.js +139 -0
  192. package/dist/lib/attempt/effect.js +174 -0
  193. package/dist/lib/attempt/errors.js +49 -0
  194. package/dist/lib/attempt/index.js +26 -0
  195. package/dist/lib/attempt/name.js +48 -0
  196. package/dist/lib/attempt/observed.js +177 -0
  197. package/dist/lib/attempt/policy.js +92 -0
  198. package/dist/lib/attempt/record.js +29 -0
  199. package/dist/lib/attempt/retryLoopContext.js +31 -0
  200. package/dist/lib/attempt/retryLoopTypes.js +3 -0
  201. package/dist/lib/attempt/runner.js +530 -0
  202. package/dist/lib/attempt/standalone.js +130 -0
  203. package/dist/lib/attempt/types.js +17 -0
  204. package/dist/lib/budget/index.js +17 -0
  205. package/dist/lib/budget/timeBudget.js +674 -0
  206. package/dist/lib/builder/FlowChartBuilder.js +199 -9
  207. package/dist/lib/builder/retryLoop.js +287 -0
  208. package/dist/lib/builder/types.js +1 -1
  209. package/dist/lib/decide/decide.js +2 -2
  210. package/dist/lib/decide/index.js +2 -2
  211. package/dist/lib/decide/types.js +1 -8
  212. package/dist/lib/engine/graph/StageNode.js +1 -1
  213. package/dist/lib/engine/graph/prefixNodeTree.js +5 -1
  214. package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
  215. package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
  216. package/dist/lib/engine/handlers/ResumeEntry.js +3 -1
  217. package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
  218. package/dist/lib/engine/handlers/StageRunner.js +36 -9
  219. package/dist/lib/engine/handlers/SubflowExecutor.js +24 -5
  220. package/dist/lib/engine/handlers/commitStage.js +24 -5
  221. package/dist/lib/engine/handlers/stageError.js +26 -2
  222. package/dist/lib/engine/index.js +1 -1
  223. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +67 -39
  224. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
  225. package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +60 -8
  226. package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
  227. package/dist/lib/engine/narrative/formatting/sentences.js +131 -2
  228. package/dist/lib/engine/narrative/index.js +1 -1
  229. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  230. package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
  231. package/dist/lib/engine/narrative/recorders/index.js +1 -1
  232. package/dist/lib/engine/narrative/types.js +1 -1
  233. package/dist/lib/engine/traversal/FlowchartTraverser.js +192 -116
  234. package/dist/lib/engine/traversalContext.js +6 -3
  235. package/dist/lib/engine/types.js +1 -1
  236. package/dist/lib/errors/terminalFailure.js +64 -0
  237. package/dist/lib/filter/evaluator.js +139 -0
  238. package/dist/lib/ids/idempotencyKey.js +28 -0
  239. package/dist/lib/memory/StageContext.js +246 -5
  240. package/dist/lib/memory/attention.js +175 -0
  241. package/dist/lib/memory/borrowedMutation.js +16 -2
  242. package/dist/lib/memory/frameTypes.js +3 -1
  243. package/dist/lib/memory/redaction.js +54 -5
  244. package/dist/lib/pause/record.js +10 -1
  245. package/dist/lib/pause/types.js +17 -1
  246. package/dist/lib/reactive/createTypedScope.js +3 -1
  247. package/dist/lib/reactive/types.js +3 -1
  248. package/dist/lib/recorder/AttemptRecorder.js +417 -0
  249. package/dist/lib/recorder/ControlDepRecorder.js +50 -2
  250. package/dist/lib/recorder/EmitRecorder.js +1 -1
  251. package/dist/lib/recorder/InOutRecorder.js +75 -6
  252. package/dist/lib/recorder/QualityRecorder.js +87 -29
  253. package/dist/lib/recorder/TopologyRecorder.js +76 -2
  254. package/dist/lib/recorder/attemptMetricRows.js +209 -0
  255. package/dist/lib/recorder/attemptMetrics.js +174 -0
  256. package/dist/lib/recorder/attemptMetricsTypes.js +3 -0
  257. package/dist/lib/recorder/attemptOTel.js +111 -0
  258. package/dist/lib/recorder/attemptSeries.js +113 -0
  259. package/dist/lib/recorder/hooks.js +4 -1
  260. package/dist/lib/runner/DeferredObserverTier.js +13 -1
  261. package/dist/lib/runner/ExecutionRuntime.js +57 -5
  262. package/dist/lib/runner/FlowChartExecutor.js +330 -101
  263. package/dist/lib/runner/RunnableChart.js +5 -1
  264. package/dist/lib/runner/attach.js +8 -2
  265. package/dist/lib/runner/checkpoint.js +3 -1
  266. package/dist/lib/runner/deadline.js +94 -0
  267. package/dist/lib/runner/index.js +4 -2
  268. package/dist/lib/runner/options.js +3 -1
  269. package/dist/lib/runner/recordSink.js +302 -0
  270. package/dist/lib/runner/resume.js +22 -2
  271. package/dist/lib/runner/snapshot.js +6 -2
  272. package/dist/lib/scope/ScopeFacade.js +303 -6
  273. package/dist/lib/scope/recorders/DebugRecorder.js +79 -13
  274. package/dist/lib/scope/recorders/MetricRecorder.js +15 -2
  275. package/dist/lib/scope/runtime.js +1 -1
  276. package/dist/lib/scope/types.js +1 -1
  277. package/dist/lib/sinks/fileSink.js +392 -0
  278. package/dist/recorders.js +10 -2
  279. package/dist/sinks.js +32 -0
  280. package/dist/trace.js +1 -1
  281. package/dist/types/index.d.ts +62 -2
  282. package/dist/types/lib/attempt/anySignal.d.ts +19 -0
  283. package/dist/types/lib/attempt/call.d.ts +88 -0
  284. package/dist/types/lib/attempt/category.d.ts +37 -0
  285. package/dist/types/lib/attempt/correlation.d.ts +95 -0
  286. package/dist/types/lib/attempt/deadline.d.ts +44 -0
  287. package/dist/types/lib/attempt/decision.d.ts +52 -0
  288. package/dist/types/lib/attempt/effect.d.ts +76 -0
  289. package/dist/types/lib/attempt/errors.d.ts +41 -0
  290. package/dist/types/lib/attempt/index.d.ts +18 -0
  291. package/dist/types/lib/attempt/name.d.ts +21 -0
  292. package/dist/types/lib/attempt/observed.d.ts +66 -0
  293. package/dist/types/lib/attempt/policy.d.ts +45 -0
  294. package/dist/types/lib/attempt/record.d.ts +11 -0
  295. package/dist/types/lib/attempt/retryLoopContext.d.ts +18 -0
  296. package/dist/types/lib/attempt/retryLoopTypes.d.ts +18 -0
  297. package/dist/types/lib/attempt/runner.d.ts +157 -0
  298. package/dist/types/lib/attempt/standalone.d.ts +47 -0
  299. package/dist/types/lib/attempt/types.d.ts +453 -0
  300. package/dist/types/lib/budget/index.d.ts +9 -0
  301. package/dist/types/lib/budget/timeBudget.d.ts +136 -0
  302. package/dist/types/lib/builder/FlowChartBuilder.d.ts +88 -3
  303. package/dist/types/lib/builder/retryLoop.d.ts +56 -0
  304. package/dist/types/lib/builder/types.d.ts +35 -1
  305. package/dist/types/lib/decide/index.d.ts +1 -1
  306. package/dist/types/lib/decide/types.d.ts +3 -0
  307. package/dist/types/lib/engine/graph/StageNode.d.ts +11 -1
  308. package/dist/types/lib/engine/handlers/StageRunner.d.ts +8 -1
  309. package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
  310. package/dist/types/lib/engine/handlers/stageError.d.ts +9 -0
  311. package/dist/types/lib/engine/index.d.ts +2 -2
  312. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
  313. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
  314. package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
  315. package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
  316. package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +23 -0
  317. package/dist/types/lib/engine/narrative/index.d.ts +2 -2
  318. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +27 -21
  319. package/dist/types/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
  320. package/dist/types/lib/engine/narrative/recorders/index.d.ts +1 -1
  321. package/dist/types/lib/engine/narrative/types.d.ts +74 -5
  322. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
  323. package/dist/types/lib/engine/traversalContext.d.ts +7 -2
  324. package/dist/types/lib/engine/types.d.ts +52 -57
  325. package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
  326. package/dist/types/lib/{decide → filter}/evaluator.d.ts +7 -2
  327. package/dist/types/lib/ids/idempotencyKey.d.ts +14 -0
  328. package/dist/types/lib/memory/StageContext.d.ts +123 -3
  329. package/dist/types/lib/memory/attention.d.ts +26 -0
  330. package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
  331. package/dist/types/lib/memory/frameTypes.d.ts +38 -0
  332. package/dist/types/lib/memory/redaction.d.ts +12 -0
  333. package/dist/types/lib/pause/types.d.ts +19 -0
  334. package/dist/types/lib/reactive/types.d.ts +36 -4
  335. package/dist/types/lib/recorder/AttemptRecorder.d.ts +141 -0
  336. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +36 -2
  337. package/dist/types/lib/recorder/EmitRecorder.d.ts +3 -0
  338. package/dist/types/lib/recorder/InOutRecorder.d.ts +37 -1
  339. package/dist/types/lib/recorder/QualityRecorder.d.ts +32 -5
  340. package/dist/types/lib/recorder/TopologyRecorder.d.ts +35 -5
  341. package/dist/types/lib/recorder/attemptMetricRows.d.ts +11 -0
  342. package/dist/types/lib/recorder/attemptMetrics.d.ts +7 -0
  343. package/dist/types/lib/recorder/attemptMetricsTypes.d.ts +114 -0
  344. package/dist/types/lib/recorder/attemptOTel.d.ts +78 -0
  345. package/dist/types/lib/recorder/attemptSeries.d.ts +81 -0
  346. package/dist/types/lib/recorder/hooks.d.ts +9 -0
  347. package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
  348. package/dist/types/lib/runner/FlowChartExecutor.d.ts +46 -2
  349. package/dist/types/lib/runner/RunnableChart.d.ts +6 -0
  350. package/dist/types/lib/runner/attach.d.ts +2 -1
  351. package/dist/types/lib/runner/deadline.d.ts +42 -0
  352. package/dist/types/lib/runner/index.d.ts +3 -1
  353. package/dist/types/lib/runner/options.d.ts +17 -0
  354. package/dist/types/lib/runner/recordSink.d.ts +128 -0
  355. package/dist/types/lib/runner/resume.d.ts +3 -0
  356. package/dist/types/lib/runner/snapshot.d.ts +2 -2
  357. package/dist/types/lib/scope/ScopeFacade.d.ts +118 -4
  358. package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +17 -3
  359. package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +10 -0
  360. package/dist/types/lib/scope/runtime.d.ts +3 -0
  361. package/dist/types/lib/scope/types.d.ts +6 -0
  362. package/dist/types/lib/sinks/fileSink.d.ts +135 -0
  363. package/dist/types/recorders.d.ts +8 -2
  364. package/dist/types/sinks.d.ts +23 -0
  365. package/dist/types/trace.d.ts +2 -2
  366. package/package.json +20 -6
  367. package/dist/esm/lib/decide/evaluator.js +0 -130
  368. package/dist/lib/decide/evaluator.js +0 -134
@@ -16,8 +16,8 @@
16
16
  */
17
17
  import { DECISION_RESULT } from '../../decide/types.js';
18
18
  import { isPauseSignal } from '../../pause/types.js';
19
- import { commitStage } from './commitStage.js';
20
- import { loggableStageError, recordStageError } from './stageError.js';
19
+ import { commitStage, commitStageWrites } from './commitStage.js';
20
+ import { captureStageFailure, loggableStageError, recordStageError } from './stageError.js';
21
21
  export class DeciderHandler {
22
22
  deps;
23
23
  constructor(deps) {
@@ -70,10 +70,11 @@ export class DeciderHandler {
70
70
  catch (error) {
71
71
  // PauseSignal is expected control flow — commit and re-throw without error logging.
72
72
  if (isPauseSignal(error)) {
73
- context.commit();
73
+ commitStageWrites(context);
74
74
  throw error;
75
75
  }
76
- context.commit();
76
+ captureStageFailure(context, error);
77
+ commitStageWrites(context);
77
78
  const served = recordStageError(context, error);
78
79
  this.deps.logger.error(`Error in pipeline (${branchPath}) stage [${node.name}]:`, {
79
80
  error: loggableStageError(context, error),
@@ -123,7 +124,10 @@ export class DeciderHandler {
123
124
  // so consumers tracking "did this stage run" work uniformly.
124
125
  this.deps.narrativeGenerator.onStageExecuted(node.name, node.description, traversalContext, 'decider');
125
126
  const branchContext = context.createChild(branchPath, chosen.id, chosen.name, chosen.id);
127
+ // An exclusive branch is the same escaping chain, including trampoline hops.
128
+ // Parallel fan-out children keep their own slots instead.
129
+ branchContext.failureState = context.failureState;
126
130
  return { kind: 'dispatch', chosen, branchContext };
127
131
  }
128
132
  }
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVjaWRlckhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9EZWNpZGVySGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXJELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQWN2RSxNQUFNLE9BQU8sY0FBYztJQUNJO0lBQTdCLFlBQTZCLElBQStCO1FBQS9CLFNBQUksR0FBSixJQUFJLENBQTJCO0lBQUcsQ0FBQztJQUVoRTs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUNwQixJQUE2QixFQUM3QixTQUFzQyxFQUN0QyxPQUFxQixFQUNyQixTQUFtQyxFQUNuQyxVQUE4QixFQUM5QixRQUFrQyxFQUNsQyxXQUF3QyxFQUN4QyxnQkFBbUM7UUFFbkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUN6QyxJQUFJLEVBQ0osU0FBUyxFQUNULE9BQU8sRUFDUCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFFBQVEsRUFDUixnQkFBZ0IsQ0FDakIsQ0FBQztRQUVGLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUM5QixPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMzRixDQUFD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TUFBTSxDQUFDLElBQUk7WUFDeEIsU0FBUyxFQUFFLFNBQVMsSUFBSSxzQkFBc0IsUUFBUSxFQUFFO1NBQ3pELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUNyQyxJQUFJLENBQUMsSUFBSSxFQUNULE1BQU0sQ0FBQyxJQUFJLEVBQ1gsU0FBUyxFQUNULElBQUksQ0FBQyxXQUFXLEVBQ2hCLGdCQUFnQixFQUNoQixnQkFBZ0IsQ0FDakIsQ0FBQztRQUNGLGtFQUFrRTtRQUNsRSw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXZHLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsVUFBb0IsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5HLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlY2lkZXJIYW5kbGVyIOKAlCBTaW5nbGUtY2hvaWNlIGNvbmRpdGlvbmFsIGJyYW5jaGluZy5cbiAqXG4gKiBIYW5kbGVzIHNjb3BlLWJhc2VkIGRlY2lkZXJzIChzdGFnZSBJUyB0aGUgZGVjaWRlciwgcmV0dXJucyBicmFuY2ggSUQpLlxuICogTG9ncyBmbG93IGNvbnRyb2wgZGVjaXNpb25zIGFuZCBuYXJyYXRpdmUgc2VudGVuY2VzLlxuICpcbiAqIFR3byBlbnRyeSBwb2ludHM6XG4gKiAtIGBwcmVwYXJlRGlzcGF0Y2hgIOKAlCBydW5zIHRoZSBkZWNpZGVyIHN0YWdlLCBjb21taXRzLCByZXNvbHZlcyB0aGUgY2hvc2VuXG4gKiAgIGJyYW5jaCwgZmlyZXMgbmFycmF0aXZlLCBhbmQgcmV0dXJucyB0aGUgY2hvc2VuIG5vZGUgKyBicmFuY2ggY29udGV4dFxuICogICBXSVRIT1VUIGV4ZWN1dGluZyBpdC4gVGhlIHRyYXZlcnNlcidzIHRyYW1wb2xpbmUgZHJpdmVyIHVzZXMgdGhpcyBzbyBhXG4gKiAgIGRlY2lkZXIgd2l0aCBubyBjb250aW51YXRpb24gb2YgaXRzIG93biBjYW4gaGFuZCB0aGUgYnJhbmNoIHRvIHRoZVxuICogICBkcml2ZXIgYXMgYSBmbGF0IGhvcCAobG9vcC1oZWF2eSBkZWNpZGVyIGNoYXJ0cyBzdGF5IGZsYXQtc3RhY2tlZCkuXG4gKiAtIGBoYW5kbGVTY29wZUJhc2VkYCDigJQgcHJlcGFyZURpc3BhdGNoICsgaW1tZWRpYXRlIGJyYW5jaCBleGVjdXRpb24gdmlhXG4gKiAgIHRoZSBwcm92aWRlZCBgZXhlY3V0ZU5vZGVgIGNhbGxiYWNrLiBLZXB0IGZvciBkaXJlY3QvYWR2YW5jZWQgY2FsbGVyc1xuICogICBhbmQgZm9yIGRlY2lkZXJzIHdob3NlIG93biBgLm5leHRgIG11c3QgcnVuIGFmdGVyIHRoZSBicmFuY2ggY29tcGxldGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGVjaXNpb25FdmlkZW5jZSB9IGZyb20gJy4uLy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBERUNJU0lPTl9SRVNVTFQgfSBmcm9tICcuLi8uLi9kZWNpZGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyRGVwcywgU3RhZ2VGdW5jdGlvbiB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGNvbW1pdFN0YWdlIH0gZnJvbSAnLi9jb21taXRTdGFnZS5qcyc7XG5pbXBvcnQgeyBsb2dnYWJsZVN0YWdlRXJyb3IsIHJlY29yZFN0YWdlRXJyb3IgfSBmcm9tICcuL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRlTm9kZUZuLCBSdW5TdGFnZUZuIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgRXhlY3V0ZU5vZGVGbiwgUnVuU3RhZ2VGbiB9O1xuXG4vKipcbiAqIFJlc3VsdCBvZiBgcHJlcGFyZURpc3BhdGNoYCDigJQgZWl0aGVyIHRoZSBkZWNpZGVyIHN0YWdlIGJyb2tlIChubyBicmFuY2hcbiAqIHJ1bnM7IGBicmFuY2hJZGAgaXMgdGhlIGRlY2lkZXIncyByZXR1cm4gdmFsdWUpLCBvciBhIGJyYW5jaCB3YXMgY2hvc2VuXG4gKiBhbmQgaXMgcmVhZHkgdG8gZXhlY3V0ZSBpbiBgYnJhbmNoQ29udGV4dGAuXG4gKi9cbmV4cG9ydCB0eXBlIERlY2lkZXJEaXNwYXRjaDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+ID1cbiAgfCB7IGtpbmQ6ICdicmVhayc7IGJyYW5jaElkOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2Rpc3BhdGNoJzsgY2hvc2VuOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjsgYnJhbmNoQ29udGV4dDogU3RhZ2VDb250ZXh0IH07XG5cbmV4cG9ydCBjbGFzcyBEZWNpZGVySGFuZGxlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+KSB7fVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBzY29wZS1iYXNlZCBkZWNpZGVyIChjcmVhdGVkIHZpYSBhZGREZWNpZGVyRnVuY3Rpb24pLlxuICAgKiBUaGUgc3RhZ2UgZnVuY3Rpb24gSVMgdGhlIGRlY2lkZXIg4oCUIGl0cyByZXR1cm4gdmFsdWUgaXMgdGhlIGJyYW5jaCBJRC5cbiAgICogRXhlY3V0aW9uIG9yZGVyOiBydW5TdGFnZShmbikg4oaSIGNvbW1pdCDihpIgcmVzb2x2ZSBjaGlsZCDihpIgbG9nIOKGkiBleGVjdXRlTm9kZShjaGlsZCkuXG4gICAqL1xuICBhc3luYyBoYW5kbGVTY29wZUJhc2VkKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0YWdlRnVuYzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW4gfSxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcnVuU3RhZ2U6IFJ1blN0YWdlRm48VE91dCwgVFNjb3BlPixcbiAgICBleGVjdXRlTm9kZTogRXhlY3V0ZU5vZGVGbjxUT3V0LCBUU2NvcGU+LFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGRpc3BhdGNoID0gYXdhaXQgdGhpcy5wcmVwYXJlRGlzcGF0Y2goXG4gICAgICBub2RlLFxuICAgICAgc3RhZ2VGdW5jLFxuICAgICAgY29udGV4dCxcbiAgICAgIGJyZWFrRmxhZyxcbiAgICAgIGJyYW5jaFBhdGgsXG4gICAgICBydW5TdGFnZSxcbiAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgKTtcblxuICAgIGlmIChkaXNwYXRjaC5raW5kID09PSAnYnJlYWsnKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2guYnJhbmNoSWQ7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlTm9kZShkaXNwYXRjaC5jaG9zZW4sIGRpc3BhdGNoLmJyYW5jaENvbnRleHQsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIFN0YW1wIGludm9rZXIgY29udGV4dCBvbiBQYXVzZVNpZ25hbCBkdXJpbmcgYnViYmxlLXVwLlxuICAgICAgLy8gVGhlIGRlY2lkZXIgKG5vZGUpIGlzIHRoZSBpbnZva2VyOyBpdHMgLm5leHQgaXMgdGhlIGNvbnRpbnVhdGlvbiB0YXJnZXQuXG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgZXJyb3Iuc2V0SW52b2tlcihub2RlLmlkISk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgZGVjaWRlciBzdGFnZSBhbmQgcmVzb2x2ZSB0aGUgY2hvc2VuIGJyYW5jaCBXSVRIT1VUIGV4ZWN1dGluZyBpdC5cbiAgICogRXZlcnl0aGluZyB1cCB0byAoYW5kIGluY2x1ZGluZykgdGhlIGBvbkRlY2lzaW9uYC9gb25TdGFnZUV4ZWN1dGVkYFxuICAgKiBuYXJyYXRpdmUgYW5kIHRoZSBicmFuY2ggY29udGV4dCBjcmVhdGlvbiBoYXBwZW5zIGhlcmUg4oCUIG9ubHkgdGhlXG4gICAqIGJyYW5jaCBleGVjdXRpb24gaXRzZWxmIGlzIGxlZnQgdG8gdGhlIGNhbGxlci5cbiAgICovXG4gIGFzeW5jIHByZXBhcmVEaXNwYXRjaChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiB7IHNob3VsZEJyZWFrOiBib29sZWFuIH0sXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHJ1blN0YWdlOiBSdW5TdGFnZUZuPFRPdXQsIFRTY29wZT4sXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8RGVjaWRlckRpc3BhdGNoPFRPdXQsIFRTY29wZT4+IHtcbiAgICBjb25zdCBicmVha0ZuID0gKCkgPT4gKGJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWUpO1xuXG4gICAgbGV0IGJyYW5jaElkOiBzdHJpbmc7XG4gICAgbGV0IGRlY2lzaW9uRXZpZGVuY2U6IERlY2lzaW9uRXZpZGVuY2UgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YWdlT3V0cHV0ID0gYXdhaXQgcnVuU3RhZ2Uobm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIC8vIERldGVjdCBEZWNpc2lvblJlc3VsdCBmcm9tIGRlY2lkZSgpIGhlbHBlciB2aWEgU3ltYm9sIGJyYW5kXG4gICAgICBpZiAoc3RhZ2VPdXRwdXQgJiYgdHlwZW9mIHN0YWdlT3V0cHV0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmhhcyhzdGFnZU91dHB1dCBhcyBvYmplY3QsIERFQ0lTSU9OX1JFU1VMVCkpIHtcbiAgICAgICAgYnJhbmNoSWQgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5icmFuY2g7XG4gICAgICAgIGRlY2lzaW9uRXZpZGVuY2UgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5ldmlkZW5jZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyYW5jaElkID0gU3RyaW5nKHN0YWdlT3V0cHV0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3cg4oCUIGNvbW1pdCBhbmQgcmUtdGhyb3cgd2l0aG91dCBlcnJvciBsb2dnaW5nLlxuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgIGNvbnN0IHNlcnZlZCA9IHJlY29yZFN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHtcbiAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25FcnJvcihub2RlLm5hbWUsIHNlcnZlZC5tZXNzYWdlLCBzZXJ2ZWQuc3RydWN0dXJlZEVycm9yLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGNvbW1pdFN0YWdlKGNvbnRleHQsIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3IsIG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICByZXR1cm4geyBraW5kOiAnYnJlYWsnLCBicmFuY2hJZCB9O1xuICAgIH1cblxuICAgIC8vIFJlc29sdmUgY2hpbGQgYnkgbWF0Y2hpbmcgYnJhbmNoIElEIGFnYWluc3Qgbm9kZS5jaGlsZHJlbi5cbiAgICAvLyBNYXRjaCBicmFuY2hJZCBmaXJzdCAob3JpZ2luYWwgdW5wcmVmaXhlZCBJRCksIGZhbGwgYmFjayB0byBpZCBmb3IgYmFja3dhcmQgY29tcGF0LlxuICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAgIGxldCBjaG9zZW4gPSBjaGlsZHJlbi5maW5kKChjaGlsZCkgPT4gKGNoaWxkLmJyYW5jaElkID8/IGNoaWxkLmlkKSA9PT0gYnJhbmNoSWQpO1xuXG4gICAgLy8gRmFsbCBiYWNrIHRvIGRlZmF1bHQgYnJhbmNoXG4gICAgaWYgKCFjaG9zZW4pIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRDaGlsZCA9IGNoaWxkcmVuLmZpbmQoKGNoaWxkKSA9PiAoY2hpbGQuYnJhbmNoSWQgPz8gY2hpbGQuaWQpID09PSAnZGVmYXVsdCcpO1xuICAgICAgaWYgKGRlZmF1bHRDaGlsZCkge1xuICAgICAgICBjaG9zZW4gPSBkZWZhdWx0Q2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU2NvcGUtYmFzZWQgZGVjaWRlciAnJHtub2RlLm5hbWV9JyByZXR1cm5lZCBicmFuY2ggSUQgJyR7YnJhbmNoSWR9JyB3aGljaCBkb2Vzbid0IG1hdGNoIGFueSBjaGlsZCBhbmQgbm8gZGVmYXVsdCBicmFuY2ggaXMgc2V0YDtcbiAgICAgICAgY29udGV4dC5hZGRFcnJvcignZGVjaWRlckVycm9yJywgZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2hvc2VuTmFtZSA9IGNob3Nlbi5uYW1lO1xuICAgIGNvbnN0IHdhc0RlZmF1bHQgPSAoY2hvc2VuLmJyYW5jaElkID8/IGNob3Nlbi5pZCkgIT09IGJyYW5jaElkO1xuICAgIGNvbnN0IHJhdGlvbmFsZSA9IGNvbnRleHQuZGVidWc/LmxvZ0NvbnRleHQ/LmRlY2lkZXJSYXRpb25hbGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBicmFuY2hSZWFzb246IHN0cmluZztcbiAgICBpZiAod2FzRGVmYXVsdCkge1xuICAgICAgYnJhbmNoUmVhc29uID0gYFJldHVybmVkICcke2JyYW5jaElkfScgKG5vIG1hdGNoKSwgZmVsbCBiYWNrIHRvIGRlZmF1bHQg4oaSICR7Y2hvc2VuTmFtZX0gcGF0aC5gO1xuICAgIH0gZWxzZSBpZiAocmF0aW9uYWxlKSB7XG4gICAgICBicmFuY2hSZWFzb24gPSBgQmFzZWQgb246ICR7cmF0aW9uYWxlfSDihpIgY2hvc2UgJHtjaG9zZW5OYW1lfSBwYXRoLmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyYW5jaFJlYXNvbiA9IGBFdmFsdWF0ZWQgc2NvcGUgYW5kIHJldHVybmVkICcke2JyYW5jaElkfScg4oaSIGNob3NlICR7Y2hvc2VuTmFtZX0gcGF0aC5gO1xuICAgIH1cbiAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ2JyYW5jaCcsIGJyYW5jaFJlYXNvbiwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IGNob3Nlbi5uYW1lLFxuICAgICAgcmF0aW9uYWxlOiByYXRpb25hbGUgfHwgYHJldHVybmVkIGJyYW5jaElkOiAke2JyYW5jaElkfWAsXG4gICAgfSk7XG5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uRGVjaXNpb24oXG4gICAgICBub2RlLm5hbWUsXG4gICAgICBjaG9zZW4ubmFtZSxcbiAgICAgIHJhdGlvbmFsZSxcbiAgICAgIG5vZGUuZGVzY3JpcHRpb24sXG4gICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgZGVjaXNpb25FdmlkZW5jZSxcbiAgICApO1xuICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIEFGVEVSIHRoZSBzcGVjaWFsaXplZCBldmVudFxuICAgIC8vIHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiIHdvcmsgdW5pZm9ybWx5LlxuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKG5vZGUubmFtZSwgbm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgJ2RlY2lkZXInKTtcblxuICAgIGNvbnN0IGJyYW5jaENvbnRleHQgPSBjb250ZXh0LmNyZWF0ZUNoaWxkKGJyYW5jaFBhdGggYXMgc3RyaW5nLCBjaG9zZW4uaWQsIGNob3Nlbi5uYW1lLCBjaG9zZW4uaWQpO1xuXG4gICAgcmV0dXJuIHsga2luZDogJ2Rpc3BhdGNoJywgY2hvc2VuLCBicmFuY2hDb250ZXh0IH07XG4gIH1cbn1cbiJdfQ==
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVjaWRlckhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9EZWNpZGVySGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXJELE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQWM1RixNQUFNLE9BQU8sY0FBYztJQUNJO0lBQTdCLFlBQTZCLElBQStCO1FBQS9CLFNBQUksR0FBSixJQUFJLENBQTJCO0lBQUcsQ0FBQztJQUVoRTs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUNwQixJQUE2QixFQUM3QixTQUFzQyxFQUN0QyxPQUFxQixFQUNyQixTQUFtQyxFQUNuQyxVQUE4QixFQUM5QixRQUFrQyxFQUNsQyxXQUF3QyxFQUN4QyxnQkFBbUM7UUFFbkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUN6QyxJQUFJLEVBQ0osU0FBUyxFQUNULE9BQU8sRUFDUCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFFBQVEsRUFDUixnQkFBZ0IsQ0FDakIsQ0FBQztRQUVGLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUM5QixPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxV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MUYsQ0FBQztRQUNELE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFO1lBQ2xELFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSTtZQUN4QixTQUFTLEVBQUUsU0FBUyxJQUFJLHNCQUFzQixRQUFRLEVBQUU7U0FDekQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQ3JDLElBQUksQ0FBQyxJQUFJLEVBQ1QsTUFBTSxDQUFDLElBQUksRUFDWCxTQUFTLEVBQ1QsSUFBSSxDQUFDLFdBQVcsRUFDaEIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixDQUNqQixDQUFDO1FBQ0Ysa0VBQWtFO1FBQ2xFLDZEQUE2RDtRQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFdkcsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFvQixFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkcsNkVBQTZFO1FBQzdFLDBEQUEwRDtRQUMxRCxhQUFhLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFFbEQsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ3JELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVjaWRlckhhbmRsZXIg4oCUIFNpbmdsZS1jaG9pY2UgY29uZGl0aW9uYWwgYnJhbmNoaW5nLlxuICpcbiAqIEhhbmRsZXMgc2NvcGUtYmFzZWQgZGVjaWRlcnMgKHN0YWdlIElTIHRoZSBkZWNpZGVyLCByZXR1cm5zIGJyYW5jaCBJRCkuXG4gKiBMb2dzIGZsb3cgY29udHJvbCBkZWNpc2lvbnMgYW5kIG5hcnJhdGl2ZSBzZW50ZW5jZXMuXG4gKlxuICogVHdvIGVudHJ5IHBvaW50czpcbiAqIC0gYHByZXBhcmVEaXNwYXRjaGAg4oCUIHJ1bnMgdGhlIGRlY2lkZXIgc3RhZ2UsIGNvbW1pdHMsIHJlc29sdmVzIHRoZSBjaG9zZW5cbiAqICAgYnJhbmNoLCBmaXJlcyBuYXJyYXRpdmUsIGFuZCByZXR1cm5zIHRoZSBjaG9zZW4gbm9kZSArIGJyYW5jaCBjb250ZXh0XG4gKiAgIFdJVEhPVVQgZXhlY3V0aW5nIGl0LiBUaGUgdHJhdmVyc2VyJ3MgdHJhbXBvbGluZSBkcml2ZXIgdXNlcyB0aGlzIHNvIGFcbiAqICAgZGVjaWRlciB3aXRoIG5vIGNvbnRpbnVhdGlvbiBvZiBpdHMgb3duIGNhbiBoYW5kIHRoZSBicmFuY2ggdG8gdGhlXG4gKiAgIGRyaXZlciBhcyBhIGZsYXQgaG9wIChsb29wLWhlYXZ5IGRlY2lkZXIgY2hhcnRzIHN0YXkgZmxhdC1zdGFja2VkKS5cbiAqIC0gYGhhbmRsZVNjb3BlQmFzZWRgIOKAlCBwcmVwYXJlRGlzcGF0Y2ggKyBpbW1lZGlhdGUgYnJhbmNoIGV4ZWN1dGlvbiB2aWFcbiAqICAgdGhlIHByb3ZpZGVkIGBleGVjdXRlTm9kZWAgY2FsbGJhY2suIEtlcHQgZm9yIGRpcmVjdC9hZHZhbmNlZCBjYWxsZXJzXG4gKiAgIGFuZCBmb3IgZGVjaWRlcnMgd2hvc2Ugb3duIGAubmV4dGAgbXVzdCBydW4gYWZ0ZXIgdGhlIGJyYW5jaCBjb21wbGV0ZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEZWNpc2lvbkV2aWRlbmNlIH0gZnJvbSAnLi4vLi4vZGVjaWRlL3R5cGVzLmpzJztcbmltcG9ydCB7IERFQ0lTSU9OX1JFU1VMVCB9IGZyb20gJy4uLy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXJEZXBzLCBTdGFnZUZ1bmN0aW9uIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgY29tbWl0U3RhZ2UsIGNvbW1pdFN0YWdlV3JpdGVzIH0gZnJvbSAnLi9jb21taXRTdGFnZS5qcyc7XG5pbXBvcnQgeyBjYXB0dXJlU3RhZ2VGYWlsdXJlLCBsb2dnYWJsZVN0YWdlRXJyb3IsIHJlY29yZFN0YWdlRXJyb3IgfSBmcm9tICcuL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRlTm9kZUZuLCBSdW5TdGFnZUZuIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgRXhlY3V0ZU5vZGVGbiwgUnVuU3RhZ2VGbiB9O1xuXG4vKipcbiAqIFJlc3VsdCBvZiBgcHJlcGFyZURpc3BhdGNoYCDigJQgZWl0aGVyIHRoZSBkZWNpZGVyIHN0YWdlIGJyb2tlIChubyBicmFuY2hcbiAqIHJ1bnM7IGBicmFuY2hJZGAgaXMgdGhlIGRlY2lkZXIncyByZXR1cm4gdmFsdWUpLCBvciBhIGJyYW5jaCB3YXMgY2hvc2VuXG4gKiBhbmQgaXMgcmVhZHkgdG8gZXhlY3V0ZSBpbiBgYnJhbmNoQ29udGV4dGAuXG4gKi9cbmV4cG9ydCB0eXBlIERlY2lkZXJEaXNwYXRjaDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+ID1cbiAgfCB7IGtpbmQ6ICdicmVhayc7IGJyYW5jaElkOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2Rpc3BhdGNoJzsgY2hvc2VuOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjsgYnJhbmNoQ29udGV4dDogU3RhZ2VDb250ZXh0IH07XG5cbmV4cG9ydCBjbGFzcyBEZWNpZGVySGFuZGxlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+KSB7fVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBzY29wZS1iYXNlZCBkZWNpZGVyIChjcmVhdGVkIHZpYSBhZGREZWNpZGVyRnVuY3Rpb24pLlxuICAgKiBUaGUgc3RhZ2UgZnVuY3Rpb24gSVMgdGhlIGRlY2lkZXIg4oCUIGl0cyByZXR1cm4gdmFsdWUgaXMgdGhlIGJyYW5jaCBJRC5cbiAgICogRXhlY3V0aW9uIG9yZGVyOiBydW5TdGFnZShmbikg4oaSIGNvbW1pdCDihpIgcmVzb2x2ZSBjaGlsZCDihpIgbG9nIOKGkiBleGVjdXRlTm9kZShjaGlsZCkuXG4gICAqL1xuICBhc3luYyBoYW5kbGVTY29wZUJhc2VkKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0YWdlRnVuYzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW4gfSxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcnVuU3RhZ2U6IFJ1blN0YWdlRm48VE91dCwgVFNjb3BlPixcbiAgICBleGVjdXRlTm9kZTogRXhlY3V0ZU5vZGVGbjxUT3V0LCBUU2NvcGU+LFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGRpc3BhdGNoID0gYXdhaXQgdGhpcy5wcmVwYXJlRGlzcGF0Y2goXG4gICAgICBub2RlLFxuICAgICAgc3RhZ2VGdW5jLFxuICAgICAgY29udGV4dCxcbiAgICAgIGJyZWFrRmxhZyxcbiAgICAgIGJyYW5jaFBhdGgsXG4gICAgICBydW5TdGFnZSxcbiAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgKTtcblxuICAgIGlmIChkaXNwYXRjaC5raW5kID09PSAnYnJlYWsnKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2guYnJhbmNoSWQ7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlTm9kZShkaXNwYXRjaC5jaG9zZW4sIGRpc3BhdGNoLmJyYW5jaENvbnRleHQsIGJyZWFrRmxhZywgYnJhbmNoUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIFN0YW1wIGludm9rZXIgY29udGV4dCBvbiBQYXVzZVNpZ25hbCBkdXJpbmcgYnViYmxlLXVwLlxuICAgICAgLy8gVGhlIGRlY2lkZXIgKG5vZGUpIGlzIHRoZSBpbnZva2VyOyBpdHMgLm5leHQgaXMgdGhlIGNvbnRpbnVhdGlvbiB0YXJnZXQuXG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgZXJyb3Iuc2V0SW52b2tlcihub2RlLmlkISk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgZGVjaWRlciBzdGFnZSBhbmQgcmVzb2x2ZSB0aGUgY2hvc2VuIGJyYW5jaCBXSVRIT1VUIGV4ZWN1dGluZyBpdC5cbiAgICogRXZlcnl0aGluZyB1cCB0byAoYW5kIGluY2x1ZGluZykgdGhlIGBvbkRlY2lzaW9uYC9gb25TdGFnZUV4ZWN1dGVkYFxuICAgKiBuYXJyYXRpdmUgYW5kIHRoZSBicmFuY2ggY29udGV4dCBjcmVhdGlvbiBoYXBwZW5zIGhlcmUg4oCUIG9ubHkgdGhlXG4gICAqIGJyYW5jaCBleGVjdXRpb24gaXRzZWxmIGlzIGxlZnQgdG8gdGhlIGNhbGxlci5cbiAgICovXG4gIGFzeW5jIHByZXBhcmVEaXNwYXRjaChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiB7IHNob3VsZEJyZWFrOiBib29sZWFuIH0sXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHJ1blN0YWdlOiBSdW5TdGFnZUZuPFRPdXQsIFRTY29wZT4sXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8RGVjaWRlckRpc3BhdGNoPFRPdXQsIFRTY29wZT4+IHtcbiAgICBjb25zdCBicmVha0ZuID0gKCkgPT4gKGJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWUpO1xuXG4gICAgbGV0IGJyYW5jaElkOiBzdHJpbmc7XG4gICAgbGV0IGRlY2lzaW9uRXZpZGVuY2U6IERlY2lzaW9uRXZpZGVuY2UgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YWdlT3V0cHV0ID0gYXdhaXQgcnVuU3RhZ2Uobm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIC8vIERldGVjdCBEZWNpc2lvblJlc3VsdCBmcm9tIGRlY2lkZSgpIGhlbHBlciB2aWEgU3ltYm9sIGJyYW5kXG4gICAgICBpZiAoc3RhZ2VPdXRwdXQgJiYgdHlwZW9mIHN0YWdlT3V0cHV0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmhhcyhzdGFnZU91dHB1dCBhcyBvYmplY3QsIERFQ0lTSU9OX1JFU1VMVCkpIHtcbiAgICAgICAgYnJhbmNoSWQgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5icmFuY2g7XG4gICAgICAgIGRlY2lzaW9uRXZpZGVuY2UgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5ldmlkZW5jZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyYW5jaElkID0gU3RyaW5nKHN0YWdlT3V0cHV0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3cg4oCUIGNvbW1pdCBhbmQgcmUtdGhyb3cgd2l0aG91dCBlcnJvciBsb2dnaW5nLlxuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGNvbW1pdFN0YWdlV3JpdGVzKGNvbnRleHQpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVTdGFnZUZhaWx1cmUoY29udGV4dCwgZXJyb3IpO1xuICAgICAgY29tbWl0U3RhZ2VXcml0ZXMoY29udGV4dCk7XG4gICAgICBjb25zdCBzZXJ2ZWQgPSByZWNvcmRTdGFnZUVycm9yKGNvbnRleHQsIGVycm9yKTtcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7XG4gICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uRXJyb3Iobm9kZS5uYW1lLCBzZXJ2ZWQubWVzc2FnZSwgc2VydmVkLnN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBjb21taXRTdGFnZShjb250ZXh0LCB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLCBub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQpO1xuXG4gICAgaWYgKGJyZWFrRmxhZy5zaG91bGRCcmVhaykge1xuICAgICAgcmV0dXJuIHsga2luZDogJ2JyZWFrJywgYnJhbmNoSWQgfTtcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGNoaWxkIGJ5IG1hdGNoaW5nIGJyYW5jaCBJRCBhZ2FpbnN0IG5vZGUuY2hpbGRyZW4uXG4gICAgLy8gTWF0Y2ggYnJhbmNoSWQgZmlyc3QgKG9yaWdpbmFsIHVucHJlZml4ZWQgSUQpLCBmYWxsIGJhY2sgdG8gaWQgZm9yIGJhY2t3YXJkIGNvbXBhdC5cbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4gYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXTtcbiAgICBsZXQgY2hvc2VuID0gY2hpbGRyZW4uZmluZCgoY2hpbGQpID0+IChjaGlsZC5icmFuY2hJZCA/PyBjaGlsZC5pZCkgPT09IGJyYW5jaElkKTtcblxuICAgIC8vIEZhbGwgYmFjayB0byBkZWZhdWx0IGJyYW5jaFxuICAgIGlmICghY2hvc2VuKSB7XG4gICAgICBjb25zdCBkZWZhdWx0Q2hpbGQgPSBjaGlsZHJlbi5maW5kKChjaGlsZCkgPT4gKGNoaWxkLmJyYW5jaElkID8/IGNoaWxkLmlkKSA9PT0gJ2RlZmF1bHQnKTtcbiAgICAgIGlmIChkZWZhdWx0Q2hpbGQpIHtcbiAgICAgICAgY2hvc2VuID0gZGVmYXVsdENoaWxkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFNjb3BlLWJhc2VkIGRlY2lkZXIgJyR7bm9kZS5uYW1lfScgcmV0dXJuZWQgYnJhbmNoIElEICcke2JyYW5jaElkfScgd2hpY2ggZG9lc24ndCBtYXRjaCBhbnkgY2hpbGQgYW5kIG5vIGRlZmF1bHQgYnJhbmNoIGlzIHNldGA7XG4gICAgICAgIGNvbnRleHQuYWRkRXJyb3IoJ2RlY2lkZXJFcnJvcicsIGVycm9yTWVzc2FnZSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNob3Nlbk5hbWUgPSBjaG9zZW4ubmFtZTtcbiAgICBjb25zdCB3YXNEZWZhdWx0ID0gKGNob3Nlbi5icmFuY2hJZCA/PyBjaG9zZW4uaWQpICE9PSBicmFuY2hJZDtcbiAgICBjb25zdCByYXRpb25hbGUgPSBjb250ZXh0LmRlYnVnPy5sb2dDb250ZXh0Py5kZWNpZGVyUmF0aW9uYWxlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYnJhbmNoUmVhc29uOiBzdHJpbmc7XG4gICAgaWYgKHdhc0RlZmF1bHQpIHtcbiAgICAgIGJyYW5jaFJlYXNvbiA9IGBSZXR1cm5lZCAnJHticmFuY2hJZH0nIChubyBtYXRjaCksIGZlbGwgYmFjayB0byBkZWZhdWx0IOKGkiAke2Nob3Nlbk5hbWV9IHBhdGguYDtcbiAgICB9IGVsc2UgaWYgKHJhdGlvbmFsZSkge1xuICAgICAgYnJhbmNoUmVhc29uID0gYEJhc2VkIG9uOiAke3JhdGlvbmFsZX0g4oaSIGNob3NlICR7Y2hvc2VuTmFtZX0gcGF0aC5gO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmFuY2hSZWFzb24gPSBgRXZhbHVhdGVkIHNjb3BlIGFuZCByZXR1cm5lZCAnJHticmFuY2hJZH0nIOKGkiBjaG9zZSAke2Nob3Nlbk5hbWV9IHBhdGguYDtcbiAgICB9XG4gICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdicmFuY2gnLCBicmFuY2hSZWFzb24sIHtcbiAgICAgIHRhcmdldFN0YWdlOiBjaG9zZW4ubmFtZSxcbiAgICAgIHJhdGlvbmFsZTogcmF0aW9uYWxlIHx8IGByZXR1cm5lZCBicmFuY2hJZDogJHticmFuY2hJZH1gLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkRlY2lzaW9uKFxuICAgICAgbm9kZS5uYW1lLFxuICAgICAgY2hvc2VuLm5hbWUsXG4gICAgICByYXRpb25hbGUsXG4gICAgICBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgIGRlY2lzaW9uRXZpZGVuY2UsXG4gICAgKTtcbiAgICAvLyBQcm9wb3NhbCAjMDAzOiBmaXJlIG9uU3RhZ2VFeGVjdXRlZCBBRlRFUiB0aGUgc3BlY2lhbGl6ZWQgZXZlbnRcbiAgICAvLyBzbyBjb25zdW1lcnMgdHJhY2tpbmcgXCJkaWQgdGhpcyBzdGFnZSBydW5cIiB3b3JrIHVuaWZvcm1seS5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdkZWNpZGVyJyk7XG5cbiAgICBjb25zdCBicmFuY2hDb250ZXh0ID0gY29udGV4dC5jcmVhdGVDaGlsZChicmFuY2hQYXRoIGFzIHN0cmluZywgY2hvc2VuLmlkLCBjaG9zZW4ubmFtZSwgY2hvc2VuLmlkKTtcbiAgICAvLyBBbiBleGNsdXNpdmUgYnJhbmNoIGlzIHRoZSBzYW1lIGVzY2FwaW5nIGNoYWluLCBpbmNsdWRpbmcgdHJhbXBvbGluZSBob3BzLlxuICAgIC8vIFBhcmFsbGVsIGZhbi1vdXQgY2hpbGRyZW4ga2VlcCB0aGVpciBvd24gc2xvdHMgaW5zdGVhZC5cbiAgICBicmFuY2hDb250ZXh0LmZhaWx1cmVTdGF0ZSA9IGNvbnRleHQuZmFpbHVyZVN0YXRlO1xuXG4gICAgcmV0dXJuIHsga2luZDogJ2Rpc3BhdGNoJywgY2hvc2VuLCBicmFuY2hDb250ZXh0IH07XG4gIH1cbn1cbiJdfQ==
@@ -222,6 +222,8 @@ export function raiseQueuedPause(queue) {
222
222
  if (isPausedExecution(pause.pausedExecution)) {
223
223
  signal.stampExecution(pause.pausedExecution.runtimeStageId, pause.pausedExecution.runId);
224
224
  }
225
+ // …and the key it ran under (P3), so its own resume re-runs under the same key.
226
+ signal.stampIdempotencyKey(pause.idempotencyKey);
225
227
  const below = pause.subflowPath.slice(level);
226
228
  for (let i = below.length - 1; i >= 0; i--) {
227
229
  const state = ownEntry(pause.subflowStates, below[i]);
@@ -446,4 +448,4 @@ function walksToItsStage(chart, subflows, fanOutGraph, pause, level) {
446
448
  function ownEntry(record, key) {
447
449
  return record && Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;
448
450
  }
449
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzdW1lRW50cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9SZXN1bWVFbnRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4REc7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUE4Q3RFLE1BQU0sT0FBTyxXQUFXO0lBQ3RCOzs7OztPQUtHO0lBQ00sS0FBSyxDQUFzQztJQUNwRCw2RkFBNkY7SUFDcEYsa0JBQWtCLENBQXFDO0lBQ2hFOzs7Ozs7T0FNRztJQUNNLGtCQUFrQixDQUFxQjtJQUNoRCxpRkFBaUY7SUFDaEUsT0FBTyxDQUF1QztJQUUvRCxZQUNFLEtBQTBDLEVBQzFDLElBQXdDLEVBQ3hDLGtCQUEyQyxFQUMzQyxrQkFBMkI7UUFFM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQWUsSUFPekI7UUFDQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8s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O1FBQ3RELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDM0UsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM5QixLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztJQUMxQixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQy9ELENBQUM7QUFFRCxtR0FBbUc7QUFDbkcsU0FBUyxRQUFRLENBQUksTUFBcUMsRUFBRSxHQUFXO0lBQ3JFLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQy9GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlc3VtZUVudHJ5IOKAlCB0aGUgcmVzdW1lJ3MgT05FLVNIT1QgcmUtZW50cnkgKE0yLCBwYXVzZS9yZXN1bWUpLlxuICpcbiAqIEEgcmVzdW1lIGhhcyB0byBnZXQgYmFjayB0byBhIHN0YWdlIGluIHRoZSBtaWRkbGUgb2YgYSBjaGFydC4gSXQgZG9lcyB0aGF0XG4gKiB3aXRoIGEgc21hbGwgc3ludGhldGljIHN0cnVjdHVyZTogYSBzdGFuZC1pbiBmb3IgdGhlIHBhdXNlZCBzdGFnZSAodGhlXG4gKiBzdGFnZSdzIG93biBub2RlIHdpdGggaXRzIGZ1bmN0aW9uIHN3YXBwZWQgZm9yIHRoZSByZXN1bWUgaGFsZiDigJQgb3IsIGZvciBhblxuICogYGludGVycnVwdCgpYCBwYXVzZSwgZm9yIGl0cyBvd24gZnVuY3Rpb24gd2l0aCB0aGUgYW5zd2VyIGRlcG9zaXRlZCksIGFuZCxcbiAqIGZvciBhIHBhdXNlIGluc2lkZSBzdWJmbG93cywgdGhlIGNoZWNrcG9pbnQncyBjYXB0dXJlIG9mIGVhY2ggc3ViZmxvdydzXG4gKiBzdGF0ZSBvbiB0aGUgd2F5IGRvd24uXG4gKlxuICogVEhFIExBVzogdGhhdCBzdHJ1Y3R1cmUgaXMgdXNlZCBFWEFDVExZIE9OQ0UsIGZvciB0aGUgcmUtZW50cnkuIFRoZSBzdGFuZC1pblxuICogaXMgd2hlcmUgdGhlIHJlc3VtZWQgdHJhdmVyc2FsIFNUQVJUUyAob3Igd2hlcmUgdGhlIGxlYWYgc3ViZmxvdydzIHRyYXZlcnNhbFxuICogc3RhcnRzKSDigJQgaXQgaXMgbmV2ZXIgYSBub2RlIGFueSBpZCBjYW4gcmVzb2x2ZSB0by4gRWFjaCBzdWJmbG93IG9uIHRoZSBwYXVzZVxuICogcGF0aCB0YWtlcyBpdHMgc2VlZCBhbmQgaXRzIGVudHJ5IHBvaW50IG9uIGl0cyBGSVJTVCBlbnRyeSBhbmQgbmV2ZXIgYWdhaW4uXG4gKiBBZnRlciB0aGF0IHRoZSBydW4gYmVsb25ncyB0byB0aGUgcmVhbCBjaGFydDogZXZlcnkgbG9vcCB0YXJnZXQsIGV2ZXJ5IGxhdGVyXG4gKiBzdWJmbG93IGVudHJ5IChyZWFsIHJvb3QsIGlucHV0TWFwcGVyIHJ1bnMpLCBldmVyeSByZS12aXNpdCBvZiB0aGUgcGF1c2VkXG4gKiBzdGFnZSAod2hpY2ggcGF1c2VzIGFnYWluKSByZXNvbHZlcyBhZ2FpbnN0IHRoZSBjaGFydCBhcyBidWlsdC5cbiAqXG4gKiBPTkUgUlVMRSBBVCBFVkVSWSBMRVZFTCDigJQgd2hhdCBydW5zIGFmdGVyIHRoZSBlbnRyeS4gT24gdGhlIG9yaWdpbmFsIHJ1bixcbiAqIHdoYXRldmVyIERJU1BBVENIRUQgdGhlIHBhdXNlZCBzdGFnZSAob3IgdGhlIG1vdW50IG9mIHRoZSBuZXh0IHN1YmZsb3cgb25cbiAqIHRoZSBwYXRoKSDigJQgYSBkZWNpZGVyLCBhIHNlbGVjdG9yLCBhIGZvcmsg4oCUIHJhbiBpdHMgb3duIGNvbnRpbnVhdGlvbiBvbmNlXG4gKiB0aGF0IGNoaWxkJ3MgY2hhaW4gZW5kZWQ6IHRoZSBkZWNpZGVyJ3MgYG5leHRgLCB0aGUgZm9yaydzIGpvaW4uIEEgcmVzdW1lXG4gKiBlbnRlcnMgQVQgdGhlIGNoaWxkLCBzbyB0aGF0IGNvbnRpbnVhdGlvbiBtdXN0IGJlIGNhcnJpZWQ6IHRoZSBlbnRyeSBpc1xuICogdGhlIGNoaWxkIHdpdGggdGhlIGVuY2xvc2luZyBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uIGF0dGFjaGVkIGF0IHRoZSBlbmRcbiAqIG9mIGl0cyBvd24gY2hhaW4gKGB7IC4uLmNoaWxkLCBuZXh0OiBkaXNwYXRjaGVyLm5leHQgfWAgZm9yIGEgY2hhcnQgdGhlXG4gKiBidWlsZGVyIG1hZGUpLiBJdCBpcyByZWFkIGZyb20gdGhlIENIQVJULCBsZXZlbCBieSBsZXZlbCDigJQgbmV2ZXIgZnJvbSB0aGVcbiAqIGNoZWNrcG9pbnQsIHNvIGFuIGVkaXRlZCBjaGVja3BvaW50IGNhbm5vdCByZWRpcmVjdCBhIHJ1biDigJQgYW5kIGl0IGxhbmRzXG4gKiBhdCB0aGUgbGV2ZWwgaXQgYmVsb25ncyB0bzogYSB0b3AtbGV2ZWwgZGVjaWRlcidzIGBuZXh0YCBydW5zIGF0IHRoZSB0b3BcbiAqIGxldmVsLCBhZnRlciB0aGUgc3ViZmxvdydzIG91dHB1dE1hcHBlciwgbm90IGluc2lkZSB0aGUgc3ViZmxvdy5cbiAqXG4gKiBQQVJBTExFTCBTSUJMSU5HUyBUSEFUIFBBVVNFRCBUT08gKDkuMjguMCkuIFdoZW4gdHdvIGNoaWxkcmVuIG9mIG9uZVxuICogZmFuLW91dCBwYXVzZWQsIHRoZSBjaGVja3BvaW50IGFza3MgdGhlIGZpcnN0IGFuZCBjYXJyaWVzIHRoZSBvdGhlcnNcbiAqIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5wZW5kaW5nUGF1c2VzYCkuIEF0IHRoYXQgZmFuLW91dCdzIGxldmVsIHRoZSBlbnRyeSBpc1xuICogdGhlIGNoaWxkJ3Mgb3duIGNoYWluIG9ubHkg4oCUIG5vIGpvaW4g4oCUIGFuZCBvbmNlIGl0IGVuZHMsIHRoZSBuZXh0IHNpYmxpbmcnc1xuICogcGF1c2UgaXMgcmFpc2VkIGFnYWluIGFzIGl0IHdhcyAoaXRzIHF1ZXN0aW9uLCBpdHMgY2FwdHVyZWQgc3RhdGUpLCB3aXRob3V0XG4gKiByZS1ydW5uaW5nIGFueXRoaW5nLiBUaGUgam9pbiBydW5zIG9ubHkgd2hlbiB0aGUgbGFzdCBzaWJsaW5nIGlzIHJlc3VtZWQuXG4gKlxuICogQmVmb3JlIDkuMjguMCB0aGUgc3RydWN0dXJlIHN0YXllZCBpbiBmb3JjZSBmb3IgdGhlIHdob2xlIHJlc3VtZWQgcnVuIOKAlCB0aGVcbiAqIHRyYXZlcnNhbCB3YXMgUk9PVEVEIGF0IHRoZSBzdGFuZC1pbiAoc28gYSBsb29wIGJhY2sgdG8gdGhlIHBhdXNlZCBpZCByZS1yYW5cbiAqIHRoZSByZXN1bWUgaGFsZiwgYW5kIGEgbG9vcCB0YXJnZXQgdXBzdHJlYW0gb2YgdGhlIHJlc3VtZSBwb2ludCB3YXNcbiAqIHVucmVhY2hhYmxlOiBvbmUgc3RhZ2UgcmFuLCB0aGVuIHRoZSBydW4gZW5kZWQgc2lsZW50bHkpLCBhbmQgdGhlIGxlYWZcbiAqIHN1YmZsb3cncyByb290IHdhcyBTV0FQUEVEIGZvciB0aGUgc3RhbmQtaW4gaW4gdGhlIHN1YmZsb3cgZGljdGlvbmFyeSAoc28gYVxuICogbGF0ZXIgZW50cnkgaW50byBpdCB3b3VsZCByZS1ydW4gdGhlIHJlc3VtZSBoYWxmIG9uIGEgc3RhbGUgc2VlZCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFdoYXQgRmxvd0NoYXJ0RXhlY3V0b3IucmVzdW1lKCkgYnVpbGRzIGZvciBhIHBhdXNlIGF0ICdzZi1hL3NmLWIvYXNrJ1xuICogLy8gKHN1YmZsb3dQYXRoIFsnc2YtYScsICdzZi1hL3NmLWInXSksICdzZi1hL3NmLWInIG1vdW50ZWQgYXMgYSBkZWNpZGVyXG4gKiAvLyBicmFuY2ggaW5zaWRlIHNmLWEgd2hvc2UgZGVjaWRlciBjb250aW51ZXMgdG8gJ3NmLWEvYWZ0ZXInOlxuICogY29uc3QgZW50cnkgPSBSZXN1bWVFbnRyeS5wbGFuKHsgcm9vdCwgc3ViZmxvd3MsIHBhdGgsIGNhcHR1cmVzLCBzdGFuZEluIH0pO1xuICogZW50cnkuc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRvcC1sZXZlbCBtb3VudCBvZiAnc2YtYSdcbiAqIGVudHJ5LmVudGVyU3ViZmxvdygnc2YtYScpOyAgICAgIC8vIHsgc2VlZDogc2YtYSdzIGNhcHR1cmUsIGVudHJ5OiB7IC4uLm1vdW50IG9mICdzZi1hL3NmLWInLCBuZXh0OiBzZi1hL2FmdGVyIH0gfVxuICogZW50cnkuZW50ZXJTdWJmbG93KCdzZi1hL3NmLWInKTsgLy8geyBzZWVkOiBzZi1iJ3MgY2FwdHVyZSwgZW50cnk6IHRoZSBzdGFuZC1pbiB9XG4gKiBlbnRyeS5lbnRlclN1YmZsb3coJ3NmLWEvc2YtYicpOyAvLyB1bmRlZmluZWQg4oCUIGEgbGF0ZXIgZW50cnkgaXMgYW4gb3JkaW5hcnkgb25lXG4gKiBgYGBcbiAqXG4gKiBBIHBhdXNlIHR3byAob3IgbW9yZSkgc3ViZmxvd3MgZGVlcCB0aGVyZWZvcmUgcmUtZW50ZXJzIGVhY2ggb3V0ZXIgc3ViZmxvd1xuICogQVQgdGhlIG1vdW50IG9mIHRoZSBuZXh0IG9uZSDigJQgdGhlIG91dGVyIHN1YmZsb3cncyBzdGFnZXMgYmVmb3JlIHRoYXQgbW91bnRcbiAqIGRvIG5vdCBydW4gYWdhaW4gKHRoZXkgZGlkIGJlZm9yZSA5LjI4LjApLiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBhIGRlZ3JhZGVkXG4gKiBjaGVja3BvaW50IG1pc3NpbmcgYW4gb3V0ZXIgc3ViZmxvdydzIGNhcHR1cmU6IHRoYXQgc3ViZmxvdyByZS1ydW5zIGZyb20gaXRzXG4gKiByb290IHdpdGggaXRzIGlucHV0TWFwcGVyIChpdHMgZWFybGllciBzdGFnZXMgcmVjb21wdXRlIHdoYXQgdGhlIGNhcHR1cmVcbiAqIHdvdWxkIGhhdmUgaGVsZCksIGV4YWN0bHkgYXMgOS4yNy4wIGRpZC5cbiAqL1xuXG5pbXBvcnQgeyBkZWNvZGVQZW5kaW5nUGF1c2VzIH0gZnJvbSAnLi4vLi4vcGF1c2UvcmVjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgUGVuZGluZ1BhdXNlIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZWRFeGVjdXRpb24sIFBhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuXG4vKipcbiAqIEEgcGFyYWxsZWwgc2libGluZydzIHBhdXNlLCBxdWV1ZWQgYXQgdGhlIGxldmVsIG9mIGl0cyBmYW4tb3V0OiByYWlzZWRcbiAqIGFnYWluIHRoZXJlIG9uY2UgdGhlIHJlc3VtZWQgY2hpbGQncyBjaGFpbiBlbmRzIChzZWUge0BsaW5rIHJhaXNlUXVldWVkUGF1c2V9KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZWRQYXVzZSB7XG4gIC8qKiBUaGUgc2libGluZydzIHBhdXNlIGFzIHRoZSBjaGVja3BvaW50IGNhcnJpZXMgaXQg4oCUIGl0cyBwYXRoIGZyb20gdGhlIHRvcC4gKi9cbiAgcmVhZG9ubHkgcGF1c2U6IFBlbmRpbmdQYXVzZTtcbiAgLyoqIEhvdyBtYW55IHN1YmZsb3dzIGRlZXAgdGhlIGZhbi1vdXQgc2l0cyAoMCA9IHRoZSB0b3AgbGV2ZWwpLiAqL1xuICByZWFkb25seSBsZXZlbDogbnVtYmVyO1xuICAvKiogVGhlIHNpYmxpbmcncyBwYXVzZWQgc3RhZ2UncyBuYW1lLCBmb3IgdGhlIGBvblBhdXNlYCBldmVudC4gKi9cbiAgcmVhZG9ubHkgc3RhZ2VOYW1lOiBzdHJpbmc7XG59XG5cbi8qKiBPbmUgc3ViZmxvdyBib3VuZGFyeSBvbiB0aGUgd2F5IGJhY2sgdG8gYSBwYXVzZWQgc3RhZ2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VtZUhvcDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqIFRoZSBwYXRoLXByZWZpeGVkIHN1YmZsb3cgaWQgKGEgYEZsb3djaGFydENoZWNrcG9pbnQuc3ViZmxvd1BhdGhgIGVudHJ5KS4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd0lkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc3ViZmxvdydzIHN0YXRlIGF0IHRoZSBwYXVzZSAoYGNoZWNrcG9pbnQuc3ViZmxvd1N0YXRlc1tzdWJmbG93SWRdYCkuXG4gICAqIFNlZWRzIHRoZSBuZXN0ZWQgcnVudGltZSBJTlNURUFEIG9mIHRoZSBpbnB1dE1hcHBlcidzIHZhbHVlcyDigJQgdGhlIGNhcHR1cmVcbiAgICogYWxyZWFkeSBob2xkcyB0aGUgcG9zdC1pbnB1dCwgcHJlLXBhdXNlIG1lbW9yeSAodGhlIGlucHV0TWFwcGVyIHN0aWxsXG4gICAqIHJ1bnMsIGZvciB0aGUgc3RhZ2VzJyByZWFkLW9ubHkgYXJncyBvbmx5KS4gQWJzZW50IHdoZW4gdGhlIGNoZWNrcG9pbnRcbiAgICogaG9sZHMgbm8gY2FwdHVyZSBmb3IgdGhpcyBzdWJmbG93OyB0aGUgaW5wdXRNYXBwZXIgdGhlbiBzZWVkcyBpdCwgYXMgb25cbiAgICogYW55IGVudHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgc2VlZD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogV2hlcmUgdGhpcyBzdWJmbG93J3MgdHJhdmVyc2FsIHN0YXJ0cyBvbiB0aGUgcmUtZW50cnk6IHRoZSBtb3VudCBvZiB0aGVcbiAgICogbmV4dCBzdWJmbG93IG9uIHRoZSBwYXRoLCBvciDigJQgb24gdGhlIGxhc3QgaG9wIOKAlCB0aGUgcGF1c2VkIHN0YWdlJ3NcbiAgICogc3RhbmQtaW4sIGVhY2ggd2l0aCBpdHMgZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvbiBhdHRhY2hlZCAoc2VlIHRoZVxuICAgKiBtb2R1bGUgZG9jKS4gQWJzZW50OiB0aGUgc3ViZmxvdydzIG93biByb290IOKAlCBhIHNlZWQtb25seSBob3AgKHNlZVxuICAgKiB7QGxpbmsgUmVzdW1lRW50cnkuZnJvbUNhcHR1cmVzfSksIG9yIGFuIG91dGVyIHN1YmZsb3cgd2hvc2UgY2FwdHVyZSB0aGVcbiAgICogY2hlY2twb2ludCBsYWNrcy5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBQYXVzZXMgb2YgcGFyYWxsZWwgc2libGluZ3Mgd2hvc2UgZmFuLW91dCBzaXRzIGluIFRISVMgc3ViZmxvdywgcmFpc2VkIGluXG4gICAqIG9yZGVyIG9uY2UgYGVudHJ5YCdzIGNoYWluIGVuZHMgKHRoZSBmaXJzdCBpcyByYWlzZWQsIHRoZSByZXN0IHdhaXRcbiAgICogYmVoaW5kIGl0KS4gQWJzZW50IHdoZW4gbm8gc2libGluZyBpcyB3YWl0aW5nIGhlcmUuXG4gICAqL1xuICByZWFkb25seSBwZW5kaW5nUGF1c2VzPzogcmVhZG9ubHkgUXVldWVkUGF1c2VbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlc3VtZUVudHJ5PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogV2hlcmUgdGhlIHJlc3VtZWQgVE9QLUxFVkVMIHRyYXZlcnNhbCBzdGFydHM6IHRoZSBzdGFuZC1pbiAoYSB0b3AtbGV2ZWxcbiAgICogcGF1c2UpIG9yIHRoZSBtb3VudCBvZiB0aGUgZmlyc3Qgc3ViZmxvdyBvbiB0aGUgcGF0aCDigJQgZWFjaCB3aXRoIGl0c1xuICAgKiBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uIGF0dGFjaGVkLiBgdW5kZWZpbmVkYCBmb3IgYSBzZWVkLW9ubHkgZW50cnkg4oCUXG4gICAqIHRoZSB0cmF2ZXJzYWwgc3RhcnRzIGF0IGl0cyByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAvKiogU2libGluZyBwYXVzZXMgd2hvc2UgZmFuLW91dCBzaXRzIGF0IHRoZSBUT1AgbGV2ZWwg4oCUIHJhaXNlZCBvbmNlIGBzdGFydGAncyBjaGFpbiBlbmRzLiAqL1xuICByZWFkb25seSBzdGFydFBlbmRpbmdQYXVzZXM6IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW10gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBIb3cgbWFueSBzdGFnZSBleGVjdXRpb25zIHRoZSByZXN1bWVkIHJ1biBtYWtlcyBiZWZvcmUgdGhlIHN0YW5kLWluIHJ1bnNcbiAgICog4oCUIG9uZSBwZXIgc3ViZmxvdyBvbiB0aGUgcGF0aCwgZWFjaCBlbnRlcmVkIGF0IGl0cyBtb3VudCDigJQgc28gdGhlXG4gICAqIGV4ZWN1dG9yJ3MgYG9uUmVzdW1lYCBuYW1lcyB0aGUgc3RhbmQtaW4ncyBvd24gYHJ1bnRpbWVTdGFnZUlkYC5cbiAgICogYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW5ub3QgYmUga25vd24gYmVmb3JlIHRoZSBydW46IGFuIG91dGVyIHN1YmZsb3dcbiAgICogbWlzc2luZyBpdHMgY2FwdHVyZSByZS1ydW5zIGZyb20gaXRzIHJvb3QuXG4gICAqL1xuICByZWFkb25seSBzdGVwc0JlZm9yZVN0YW5kSW46IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqIEhvcHMgbm90IHRha2VuIHlldCwgYnkgc3ViZmxvdyBpZC4gQSBob3AgbGVhdmVzIHRoaXMgbWFwIHdoZW4gaXQgaXMgdGFrZW4uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZzogTWFwPHN0cmluZywgUmVzdW1lSG9wPFRPdXQsIFRTY29wZT4+O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgc3RhcnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkLFxuICAgIGhvcHM6IHJlYWRvbmx5IFJlc3VtZUhvcDxUT3V0LCBUU2NvcGU+W10sXG4gICAgc3RhcnRQZW5kaW5nUGF1c2VzPzogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSxcbiAgICBzdGVwc0JlZm9yZVN0YW5kSW4/OiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLnN0YXJ0UGVuZGluZ1BhdXNlcyA9IHN0YXJ0UGVuZGluZ1BhdXNlcztcbiAgICB0aGlzLnN0ZXBzQmVmb3JlU3RhbmRJbiA9IHN0ZXBzQmVmb3JlU3RhbmRJbjtcbiAgICB0aGlzLnBlbmRpbmcgPSBuZXcgTWFwKGhvcHMubWFwKChob3ApID0+IFtob3Auc3ViZmxvd0lkLCBob3BdKSk7XG4gIH1cblxuICAvKipcbiAgICogUGxhbiB0aGUgcmUtZW50cnkgb2YgYSBwYXVzZWQgY2hhcnQuIEV2ZXJ5IG1vdW50IG9uIHRoZSBwYXRoLCBldmVyeVxuICAgKiBkaXNwYXRjaGVyIGNvbnRpbnVhdGlvbiBhbmQgZXZlcnkgd2FpdGluZyBzaWJsaW5nIGlzIHJlc29sdmVkIEhFUkUsXG4gICAqIGFnYWluc3QgdGhlIGNoYXJ0IGFzIGJ1aWx0LCBiZWZvcmUgYSBzaW5nbGUgc3RhZ2UgcnVucyDigJQgc28gYSBjaGVja3BvaW50XG4gICAqIHdob3NlIHBhdGggdGhlIGNoYXJ0IGNhbm5vdCB3YWxrIGlzIHJlZnVzZWQgdXAgZnJvbnQgaW5zdGVhZCBvZiByZXN1bWluZ1xuICAgKiBpbnRvIHRoZSB3cm9uZyBzaGFwZS5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgLSBgcm9vdGAgYW5kIGBzdWJmbG93c2A6IHRoZSBjaGFydCBhcyBidWlsdFxuICAgKiAgIChgRmxvd0NoYXJ0LnJvb3RgLCBgRmxvd0NoYXJ0LnN1YmZsb3dzYCk7IGBwYXRoYDpcbiAgICogICBgY2hlY2twb2ludC5zdWJmbG93UGF0aGAsIG91dGVybW9zdCBmaXJzdDsgYGNhcHR1cmVzYDpcbiAgICogICBgY2hlY2twb2ludC5zdWJmbG93U3RhdGVzYCAoYSBkZXRhY2hlZCBjb3B5KTsgYHN0YW5kSW5gOiB0aGUgbm9kZSB0aGF0XG4gICAqICAgcnVucyB0aGUgcmVzdW1lIGhhbGYg4oCUIHRoZSBwYXVzZWQgc3RhZ2UncyBvd24gbm9kZSwgZnVuY3Rpb24gc3dhcHBlZFxuICAgKiAgIChpdHMgY29udGludWF0aW9uIGlzIGF0dGFjaGVkIGhlcmUpOyBgcGVuZGluZ1BhdXNlc2A6XG4gICAqICAgYGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2AgKGEgZGV0YWNoZWQgY29weSkuXG4gICAqIEB0aHJvd3Mgd2hlbiBhIHN1YmZsb3cgb24gdGhlIHBhdGggaXMgbWlzc2luZywgbW91bnRlZCBtb3JlIHRoYW4gb25jZSwgb3JcbiAgICogICBpdHMgbW91bnQgY2Fubm90IGJlIHJlYWNoZWQgZnJvbSB0aGUgZW5jbG9zaW5nIGdyYXBoOyBvciB3aGVuIGEgcGVuZGluZ1xuICAgKiAgIHBhdXNlIGlzIG1hbGZvcm1lZCBvciBpcyBub3QgYSBwYXJhbGxlbCBzaWJsaW5nIG9mIHRoZSBwYXVzZWQgc3RhZ2VcbiAgICovXG4gIHN0YXRpYyBwbGFuPFRPdXQsIFRTY29wZT4oYXJnczoge1xuICAgIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgIHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+IHwgdW5kZWZpbmVkO1xuICAgIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIGNhcHR1cmVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWQ7XG4gICAgc3RhbmRJbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFBlbmRpbmdQYXVzZVtdO1xuICB9KTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgeyByb290LCBzdWJmbG93cywgcGF0aCwgY2FwdHVyZXMsIHN0YW5kSW4gfSA9IGFyZ3M7XG4gICAgY29uc3QgY2hhcnQgPSBuZXcgQ2hhcnRJbmRleDxUT3V0LCBUU2NvcGU+KCk7XG5cbiAgICAvLyAxLiBXYWxrIHRoZSBwYXRoOiB0aGUgZ3JhcGggb2YgZXZlcnkgbGV2ZWwsIHRoZSBtb3VudCBvZiBldmVyeSBzdWJmbG93LlxuICAgIGNvbnN0IGdyYXBoczogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSA9IFtyb290XTtcbiAgICBjb25zdCBtb3VudHM6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dJZCA9IHBhdGhbaV07XG4gICAgICBtb3VudHMucHVzaChjaGFydC5vbmx5TW91bnQoZ3JhcGhzW2ldLCBzdWJmbG93SWQsIGkgPT09IDAgPyAndGhlIGZsb3djaGFydCcgOiBgc3ViZmxvdyAnJHtwYXRoW2kgLSAxXX0nYCkpO1xuICAgICAgLy8gT3duIGVudHJpZXMgb25seTogYSBwYXRoIHNlZ21lbnQgaXMgZGF0YSBmcm9tIGEgc3RvcmVkIGNoZWNrcG9pbnQsXG4gICAgICAvLyBhbmQgYCdfX3Byb3RvX18nYCBtdXN0IG5vdCByZXNvbHZlIHRocm91Z2ggdGhlIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBvd25FbnRyeShzdWJmbG93cywgc3ViZmxvd0lkKTtcbiAgICAgIGlmICghZGVmaW5pdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCByZXN1bWU6IHN1YmZsb3cgJyR7c3ViZmxvd0lkfScgaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGZsb3djaGFydC4gYCArXG4gICAgICAgICAgICAnVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGdyYXBocy5wdXNoKGRlZmluaXRpb24ucm9vdCk7XG4gICAgfVxuICAgIGNvbnN0IGxlYWZMZXZlbCA9IHBhdGgubGVuZ3RoO1xuICAgIC8vIFRoZSBwYXVzZWQgc3RhZ2UncyBSRUFMIG5vZGUg4oCUIHdob3NlIGRpc3BhdGNoZXIgdGhlIHN0YW5kLWluJ3NcbiAgICAvLyBjb250aW51YXRpb24gY29tZXMgZnJvbS4gKFRoZSBleGVjdXRvciBhbHJlYWR5IGZvdW5kIGl0OyBhIGRpcmVjdFxuICAgIC8vIGNhbGxlcidzIHN0YW5kLWluIHRoYXQgaXMgbm90IGluIHRoZSBsZWFmIGdyYXBoIHNpbXBseSBoYXMgbm9uZS4pXG4gICAgY29uc3QgcGF1c2VkID0gY2hhcnQuc3RhZ2UoZ3JhcGhzW2xlYWZMZXZlbF0sIHN0YW5kSW4uaWQpO1xuXG4gICAgLy8gMi4gUXVldWUgZXZlcnkgd2FpdGluZyBzaWJsaW5nIHBhdXNlIGF0IHRoZSBsZXZlbCBvZiBpdHMgZmFuLW91dC5cbiAgICBjb25zdCBxdWV1ZXMgPSBxdWV1ZVNpYmxpbmdQYXVzZXMoYXJncy5wZW5kaW5nUGF1c2VzLCB7IGNoYXJ0LCBzdWJmbG93cywgcm9vdCwgcGF0aCwgZ3JhcGhzLCBtb3VudHMsIHBhdXNlZCB9KTtcblxuICAgIC8vIDMuIFRoZSBvbmUtc2hvdCBlbnRyeSBvZiBldmVyeSBsZXZlbDogdGhlIGNoaWxkLCB0aGVuIGl0cyBkaXNwYXRjaGVyJ3NcbiAgICAvLyAgICBjb250aW51YXRpb24g4oCUIHVwIHRvIHRoZSBmYW4tb3V0IHdoZW4gc2libGluZ3Mgd2FpdCB0aGVyZS5cbiAgICBjb25zdCBjaGlsZEF0ID0gKGxldmVsOiBudW1iZXIpID0+IChsZXZlbCA8IGxlYWZMZXZlbCA/IG1vdW50c1tsZXZlbF0gOiBwYXVzZWQpO1xuICAgIGNvbnN0IGVudHJ5QXQgPSAobGV2ZWw6IG51bWJlcik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRBdChsZXZlbCk7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IGxldmVsIDwgbGVhZkxldmVsID8gbW91bnRzW2xldmVsXSA6IHN0YW5kSW47XG4gICAgICBpZiAoIWNoaWxkKSByZXR1cm4gcmVwbGFjZW1lbnQ7XG4gICAgICByZXR1cm4gY2hhcnQuZW50cnkoZ3JhcGhzW2xldmVsXSwgY2hpbGQsIHJlcGxhY2VtZW50LCBxdWV1ZXNbbGV2ZWxdPy5mYW5PdXQpO1xuICAgIH07XG4gICAgLy8gNC4gVGhlIGhvcHMuIEEgc3ViZmxvdyB3aXRoIG5vIGNhcHR1cmUgaXMgZW50ZXJlZCBhdCBpdHMgUk9PVCB3aXRoIGl0c1xuICAgIC8vICAgIGlucHV0TWFwcGVyIChpdHMgZWFybGllciBzdGFnZXMgcmVjb21wdXRlIHdoYXQgdGhlIGNhcHR1cmUgaGVsZCkg4oCUXG4gICAgLy8gICAgZXhjZXB0IHRoZSBsZWFmLCB3aG9zZSBlbnRyeSBpcyBhbHdheXMgdGhlIHN0YW5kLWluOiByZS1ydW5uaW5nIGl0XG4gICAgLy8gICAgZnJvbSBpdHMgcm9vdCB3b3VsZCBhc2sgYWdhaW4gYW5kIGxvc2UgdGhlIGFuc3dlci5cbiAgICBjb25zdCBob3BzOiBSZXN1bWVIb3A8VE91dCwgVFNjb3BlPltdID0gW107XG4gICAgbGV0IGV2ZXJ5TGV2ZWxBdEl0c0VudHJ5ID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dJZCA9IHBhdGhbaV07XG4gICAgICBjb25zdCBzZWVkID0gb3duRW50cnkoY2FwdHVyZXMsIHN1YmZsb3dJZCk7XG4gICAgICBjb25zdCBpc0xlYWZIb3AgPSBpID09PSBwYXRoLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoc2VlZCA9PT0gdW5kZWZpbmVkICYmICFpc0xlYWZIb3ApIHtcbiAgICAgICAgZXZlcnlMZXZlbEF0SXRzRW50cnkgPSBmYWxzZTtcbiAgICAgICAgaG9wcy5wdXNoKHsgc3ViZmxvd0lkIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHdhaXRpbmcgPSBxdWV1ZXNbaSArIDFdPy5wYXVzZXM7XG4gICAgICBob3BzLnB1c2goe1xuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIC4uLihzZWVkICE9PSB1bmRlZmluZWQgJiYgeyBzZWVkIH0pLFxuICAgICAgICBlbnRyeTogZW50cnlBdChpICsgMSksXG4gICAgICAgIC4uLih3YWl0aW5nICYmIHsgcGVuZGluZ1BhdXNlczogd2FpdGluZyB9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBFdmVyeSBsZXZlbCBlbnRlcmVkIGF0IGl0cyBlbnRyeTogb25lIGV4ZWN1dGlvbiAodGhlIG1vdW50KSBwZXIgbGV2ZWxcbiAgICAvLyBydW5zIGJlZm9yZSB0aGUgc3RhbmQtaW4uXG4gICAgcmV0dXJuIG5ldyBSZXN1bWVFbnRyeShlbnRyeUF0KDApLCBob3BzLCBxdWV1ZXNbMF0/LnBhdXNlcywgZXZlcnlMZXZlbEF0SXRzRW50cnkgPyBwYXRoLmxlbmd0aCA6IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQSBzZWVkLW9ubHkgZW50cnk6IGVhY2ggY2FwdHVyZSBzZWVkcyB0aGUgRklSU1QgZW50cnkgaW50byBpdHMgc3ViZmxvdyxcbiAgICogd2hpY2ggdGhlbiBzdGFydHMgYXQgaXRzIG93biByb290LiBQYXNzIGl0IGV4cGxpY2l0bHkgYXMgYHJlc3VtZWAgdG9cbiAgICogVHJhdmVyc2VyT3B0aW9ucyBvciBIYW5kbGVyRGVwcyDigJQgdGhlIHNhbWUgb25lLXNob3QgbGF3LCB3aXRob3V0IGFcbiAgICogc3RhbmQtaW4gb3IgYSBwYXRoLiBQcmVmZXIgYHBsYW5gIHdoZW4gcmVzdW1pbmcgYSBjaGVja3BvaW50LlxuICAgKi9cbiAgc3RhdGljIGZyb21DYXB0dXJlczxUT3V0LCBUU2NvcGU+KGNhcHR1cmVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gbmV3IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT4oXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBPYmplY3QuZW50cmllcyhjYXB0dXJlcykubWFwKChbc3ViZmxvd0lkLCBzZWVkXSkgPT4gKHsgc3ViZmxvd0lkLCBzZWVkIH0pKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZS1lbnRyeSBpbnRvIGBzdWJmbG93SWRgLCB0YWtlbiDigJQgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGVudHJ5IGlzXG4gICAqIGFuIG9yZGluYXJ5IG9uZSAodGhlIHN1YmZsb3cgaXMgb2ZmIHRoZSBwYXVzZSBwYXRoLCBvciBpdHMgaG9wIHdhcyBhbHJlYWR5XG4gICAqIHRha2VuKS4gT05FLVNIT1Q6IGEgaG9wIGlzIHJldHVybmVkIGF0IG1vc3Qgb25jZSwgc28gYSBzZWNvbmQgZW50cnkgaW50b1xuICAgKiB0aGUgc2FtZSBzdWJmbG93IChhIGxvb3AgcGFzc2luZyBpdHMgbW91bnQgYWdhaW4pIHJ1bnMgdGhlIHJlYWwgc3ViZmxvd1xuICAgKiBmcm9tIGl0cyByZWFsIHJvb3Qgd2l0aCBpdHMgaW5wdXRNYXBwZXIuXG4gICAqL1xuICBlbnRlclN1YmZsb3coc3ViZmxvd0lkOiBzdHJpbmcpOiBSZXN1bWVIb3A8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaG9wID0gdGhpcy5wZW5kaW5nLmdldChzdWJmbG93SWQpO1xuICAgIGlmIChob3AgIT09IHVuZGVmaW5lZCkgdGhpcy5wZW5kaW5nLmRlbGV0ZShzdWJmbG93SWQpO1xuICAgIHJldHVybiBob3A7XG4gIH1cblxuICAvKiogYHRydWVgIG9uY2UgZXZlcnkgaG9wIGhhcyBiZWVuIHRha2VuIOKAlCB0aGUgcmVzdCBvZiB0aGUgcnVuIGlzIG9yZGluYXJ5LiAqL1xuICBnZXQgc3BlbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZy5zaXplID09PSAwO1xuICB9XG59XG5cbi8vIOKUgOKUgCBSYWlzaW5nIGEgd2FpdGluZyBzaWJsaW5nJ3MgcGF1c2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUXVldWUgYHF1ZXVlYCBiZWhpbmQgYSBwYXVzZSBwYXNzaW5nIHRocm91Z2ggaXRzIGxldmVsOiBhIHBhdXNlIHJhaXNlZFxuICogd2hpbGUgc2libGluZ3Mgc3RpbGwgd2FpdCBtdXN0IGNhcnJ5IHRoZW0gdG8gaXRzIGNoZWNrcG9pbnQuIEVhY2ggcGF0aCBpc1xuICogY3V0IHRvIHRoYXQgbGV2ZWwg4oCUIHRoZSBidWJibGUtdXAgcHJlcGVuZHMgdGhlIGxldmVscyBhYm92ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXVlQmVoaW5kKHNpZ25hbDogUGF1c2VTaWduYWwsIHF1ZXVlOiByZWFkb25seSBRdWV1ZWRQYXVzZVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgeyBwYXVzZSwgbGV2ZWwgfSBvZiBxdWV1ZSkge1xuICAgIHNpZ25hbC5hZGRQZW5kaW5nUGF1c2UoeyAuLi5wYXVzZSwgc3ViZmxvd1BhdGg6IHBhdXNlLnN1YmZsb3dQYXRoLnNsaWNlKGxldmVsKSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBmaXJzdCB3YWl0aW5nIHNpYmxpbmcncyBwYXVzZSwgcmFpc2VkIGFnYWluIGF0IGl0cyBmYW4tb3V0J3MgbGV2ZWwg4oCUXG4gKiBleGFjdGx5IGFzIGl0IGJ1YmJsZWQgdXAgdG8gdGhhdCBsZXZlbCB0aGUgZmlyc3QgdGltZSAoaXRzIHN0YWdlLCBpdHNcbiAqIHF1ZXN0aW9uLCBpdHMgb3duIHN1YmZsb3cgY2FwdHVyZXMpLCBub3RoaW5nIHJlLXJ1bjsgdGhlIHJlc3Qgb2YgdGhlIHF1ZXVlXG4gKiB3YWl0cyBiZWhpbmQgaXQuIFRoZSBzdWJmbG93cyBBQk9WRSB0aGUgZmFuLW91dCBjYXB0dXJlIHRoZW1zZWx2ZXMgYWZyZXNoXG4gKiBhcyBpdCBidWJibGVzIHVwLCBzbyB0aGV5IGNhcnJ5IHdoYXQgdGhlIHJlc3VtZWQgY2hpbGQgd3JvdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYWlzZVF1ZXVlZFBhdXNlKHF1ZXVlOiByZWFkb25seSBRdWV1ZWRQYXVzZVtdKTogUGF1c2VTaWduYWwge1xuICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gcXVldWU7XG4gIGNvbnN0IHsgcGF1c2UsIGxldmVsIH0gPSBmaXJzdDtcbiAgY29uc3Qgc2lnbmFsID0gbmV3IFBhdXNlU2lnbmFsKHBhdXNlLnBhdXNlRGF0YSwgcGF1c2UucGF1c2VkU3RhZ2VJZCwgcGF1c2UucGF1c2VkQnkpO1xuICAvLyBUaGUgc2libGluZyBwYXVzZWQgaW4gYW4gRUFSTElFUiBydW46IGl0cyBvd24gZXhlY3V0aW9uLCBub3QgdGhpcyBydW4ncy5cbiAgaWYgKGlzUGF1c2VkRXhlY3V0aW9uKHBhdXNlLnBhdXNlZEV4ZWN1dGlvbikpIHtcbiAgICBzaWduYWwuc3RhbXBFeGVjdXRpb24ocGF1c2UucGF1c2VkRXhlY3V0aW9uLnJ1bnRpbWVTdGFnZUlkLCBwYXVzZS5wYXVzZWRFeGVjdXRpb24ucnVuSWQpO1xuICB9XG4gIGNvbnN0IGJlbG93ID0gcGF1c2Uuc3ViZmxvd1BhdGguc2xpY2UobGV2ZWwpO1xuICBmb3IgKGxldCBpID0gYmVsb3cubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBzdGF0ZSA9IG93bkVudHJ5KHBhdXNlLnN1YmZsb3dTdGF0ZXMsIGJlbG93W2ldKTtcbiAgICBpZiAoc3RhdGUgIT09IHVuZGVmaW5lZCkgc2lnbmFsLmNhcHR1cmVTdWJmbG93U2NvcGUoYmVsb3dbaV0sIHN0YXRlKTtcbiAgICBzaWduYWwucHJlcGVuZFN1YmZsb3coYmVsb3dbaV0pO1xuICB9XG4gIHF1ZXVlQmVoaW5kKHNpZ25hbCwgcmVzdCk7XG4gIHJldHVybiBzaWduYWw7XG59XG5cbi8vIOKUgOKUgCBSZWFkaW5nIHRoZSBjaGFydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBUaGUgbm9kZSB0aGF0IG1vdW50cyBgc3ViZmxvd0lkYCwgZm91bmQgYnkgREZTIGZyb20gYHN0YXJ0YCBvdmVyIGBuZXh0YCBhbmRcbiAqIGBjaGlsZHJlbmAgKGxvb3AtcmVmIHN0dWJzIHNraXBwZWQg4oCUIHRoZXkgc2hhcmUgdGhlaXIgdGFyZ2V0J3MgaWQgYW5kIGNhcnJ5XG4gKiBub3RoaW5nKS4gQ3ljbGUtc2FmZSAodmlzaXRlZCBieSBpZGVudGl0eSwgc28gYW4gYWJzZW50IGlkIHRlcm1pbmF0ZXMgdG9vKTtcbiAqIGZpcnN0IG1hdGNoIGluIERGUyBwcmUtb3JkZXIgKGNoaWxkcmVuIGJlZm9yZSBgbmV4dGAsIGxpa2UgdGhlIGJ1aWxkZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vdW50PFRPdXQsIFRTY29wZT4oXG4gIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgc3ViZmxvd0lkOiBzdHJpbmcsXG4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBkaXNwYXRjaGVySW5kZXgoc3RhcnQpLmtleXMoKSkge1xuICAgIGlmIChub2RlLnN1YmZsb3dJZCA9PT0gc3ViZmxvd0lkKSByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHJlYWwgbm9kZSBvZiBvbmUgbGV2ZWwncyBncmFwaCwgaW4gREZTIHByZS1vcmRlciwgbWFwcGVkIHRvIHRoZVxuICogRElTUEFUQ0hFUiB3aG9zZSBjaGlsZC1jaGFpbiBob2xkcyBpdCDigJQgdGhlIG5vZGUgd2hvc2UgYGNoaWxkcmVuYCBpdFxuICogZGVzY2VuZHMgZnJvbSAoYSBkZWNpZGVyLCBhIHNlbGVjdG9yLCBhIGZvcmspIOKAlCBvciBgdW5kZWZpbmVkYCBmb3IgYSBub2RlXG4gKiBvbiB0aGUgbGV2ZWwncyBvd24gc3BpbmUuIExvb3Agc3R1YnMgYXJlIHNraXBwZWQ7IHZpc2l0ZWQgYnkgaWRlbnRpdHksIHNvXG4gKiB0d28gbW91bnRzIHNoYXJpbmcgYW4gaWQgYXJlIGJvdGggaW5kZXhlZCBhbmQgYSBjeWNsZSB0ZXJtaW5hdGVzLlxuICovXG5mdW5jdGlvbiBkaXNwYXRjaGVySW5kZXg8VE91dCwgVFNjb3BlPihcbiAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4pOiBNYXA8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGluZGV4ID0gbmV3IE1hcDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+KCk7XG4gIGNvbnN0IHN0YWNrOiBBcnJheTxbU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkXT4gPSBbW3Jvb3QsIHVuZGVmaW5lZF1dO1xuICBmb3IgKGxldCB0b3AgPSBzdGFjay5wb3AoKTsgdG9wICE9PSB1bmRlZmluZWQ7IHRvcCA9IHN0YWNrLnBvcCgpKSB7XG4gICAgY29uc3QgW25vZGUsIGRpc3BhdGNoZXJdID0gdG9wO1xuICAgIGlmIChub2RlLmlzTG9vcFJlZiB8fCBpbmRleC5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgIGluZGV4LnNldChub2RlLCBkaXNwYXRjaGVyKTtcbiAgICAvLyBMSUZPOiBwdXNoIGBuZXh0YCBmaXJzdCBhbmQgY2hpbGRyZW4gcmV2ZXJzZWQsIHNvIGNoaWxkcmVuIGFyZSB2aXNpdGVkXG4gICAgLy8gYmVmb3JlIGBuZXh0YCBhbmQgdGhlIGZpcnN0IGNoaWxkIGZpcnN0IOKAlCBwcmUtb3JkZXIsIGxpa2UgdGhlIGJ1aWxkZXIuXG4gICAgaWYgKG5vZGUubmV4dCkgc3RhY2sucHVzaChbbm9kZS5uZXh0LCBkaXNwYXRjaGVyXSk7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAobGV0IGkgPSBub2RlLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBzdGFjay5wdXNoKFtub2RlLmNoaWxkcmVuW2ldLCBub2RlXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuLyoqIE9uZSBwbGFuJ3MgdmlldyBvZiB0aGUgY2hhcnQ6IGVhY2ggbGV2ZWwncyBpbmRleCBidWlsdCBvbmNlLiAqL1xuY2xhc3MgQ2hhcnRJbmRleDxUT3V0LCBUU2NvcGU+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRleGVzID0gbmV3IE1hcDxcbiAgICBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBNYXA8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPlxuICA+KCk7XG5cbiAgcHJpdmF0ZSBvZihyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPikge1xuICAgIGxldCBpbmRleCA9IHRoaXMuaW5kZXhlcy5nZXQocm9vdCk7XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgaW5kZXggPSBkaXNwYXRjaGVySW5kZXgocm9vdCk7XG4gICAgICB0aGlzLmluZGV4ZXMuc2V0KHJvb3QsIGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqIEV2ZXJ5IG1vdW50IG9mIGBzdWJmbG93SWRgIGluIGByb290YCdzIGdyYXBoLCBpbiBERlMgcHJlLW9yZGVyLiAqL1xuICBtb3VudHNPZihyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgc3ViZmxvd0lkOiBzdHJpbmcpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMub2Yocm9vdCkua2V5cygpXS5maWx0ZXIoKG5vZGUpID0+IG5vZGUuc3ViZmxvd0lkID09PSBzdWJmbG93SWQpO1xuICB9XG5cbiAgLyoqIFRoZSBvbmUgbW91bnQgb2YgYHN1YmZsb3dJZGAgaW4gYHJvb3RgJ3MgZ3JhcGgg4oCUIHJlZnVzZWQgd2hlbiBhYnNlbnQgb3IgYW1iaWd1b3VzLiAqL1xuICBvbmx5TW91bnQocm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHN1YmZsb3dJZDogc3RyaW5nLCBncmFwaE5hbWU6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMubW91bnRzT2Yocm9vdCwgc3ViZmxvd0lkKTtcbiAgICBpZiAoZm91bmQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiB0aGUgbW91bnQgb2Ygc3ViZmxvdyAnJHtzdWJmbG93SWR9JyBpcyBub3QgcmVhY2hhYmxlIGZyb20gJHtncmFwaE5hbWV9LiBgICtcbiAgICAgICAgICBcIlRoZSBjaGVja3BvaW50J3Mgc3ViZmxvd1BhdGggZG9lcyBub3QgbWF0Y2ggdGhpcyBjaGFydCDigJQgaXQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgY2hlY2twb2ludCB3YXMgY3JlYXRlZC5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmb3VuZC5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdWJmbG93ICcke3N1YmZsb3dJZH0nIGlzIG1vdW50ZWQgbW9yZSB0aGFuIG9uY2UgaW4gJHtncmFwaE5hbWV9IGAgK1xuICAgICAgICAgIGAoJHtmb3VuZC5tYXAoKG5vZGUpID0+IGAnJHtub2RlLm5hbWV9J2ApLmpvaW4oJywgJyl9KSwgYW5kIGEgY2hlY2twb2ludCdzIHN1YmZsb3dQYXRoIGNhbm5vdCBzYXkgd2hpY2ggYCArXG4gICAgICAgICAgJ21vdW50IHBhdXNlZC4gR2l2ZSBlYWNoIG1vdW50IGl0cyBvd24gc3ViZmxvdyBpZCB0byBtYWtlIGEgcGF1c2UgaW5zaWRlIGl0IHJlc3VtYWJsZS4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kWzBdO1xuICB9XG5cbiAgLyoqIFRoZSByZWFsIHN0YWdlIGBpZGAgaW4gYHJvb3RgJ3MgZ3JhcGggKGZpcnN0IGluIERGUyBwcmUtb3JkZXIpLCBpZiBhbnkuICovXG4gIHN0YWdlKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBpZDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLm9mKHJvb3QpLmtleXMoKSkgaWYgKG5vZGUuaWQgPT09IGlkKSByZXR1cm4gbm9kZTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRoZSBkaXNwYXRjaGVyIHdob3NlIGNoaWxkLWNoYWluIGhvbGRzIGBub2RlYCBpbiBgcm9vdGAncyBncmFwaCAoYHVuZGVmaW5lZGAgb24gdGhlIHNwaW5lKS4gKi9cbiAgZGlzcGF0Y2hlck9mKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5vZihyb290KS5nZXQobm9kZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9uZS1zaG90IGVudHJ5IGZvciBgY2hpbGRgIChhIG1vdW50IG9uIHRoZSBwYXRoLCBvciB0aGUgcGF1c2VkIHN0YWdlKVxuICAgKiBpbiBgcm9vdGAncyBncmFwaDogYHJlcGxhY2VtZW50YCAodGhlIG5vZGUgdGhhdCBydW5zIOKAlCB0aGUgbW91bnQgaXRzZWxmLFxuICAgKiBvciB0aGUgc3RhbmQtaW4pIHdpdGggd2hhdCByYW4gYWZ0ZXIgYGNoaWxkYCdzIGNoYWluIG9uIHRoZSBvcmlnaW5hbCBydW5cbiAgICogYXR0YWNoZWQgd2hlcmUgdGhhdCBjaGFpbiBlbmRzIOKAlCBgeyAuLi5jaGlsZCwgbmV4dDogZGlzcGF0Y2hlci5uZXh0IH1gIGZvclxuICAgKiBhIGNoYXJ0IHRoZSBidWlsZGVyIG1hZGU6XG4gICAqXG4gICAqICAg4oCiIG9uIHRoZSBsZXZlbCdzIHNwaW5lOiBub3RoaW5nIHRvIGF0dGFjaCDigJQgdGhlIHNwaW5lIGdvZXMgb24gYnkgaXRzZWxmO1xuICAgKiAgIOKAoiBhIERFQ0lERVIncyBvciBTRUxFQ1RPUidzIGJyYW5jaDogdGhlIGRpc3BhdGNoZXIncyBgbmV4dGA7XG4gICAqICAg4oCiIGEgRk9SSyBjaGlsZDogdGhlIGZvcmsncyBgbmV4dGAg4oCUIGl0cyBqb2luLlxuICAgKlxuICAgKiBQYXN0IGEgZGlzcGF0Y2hlciB3aXRoIG5vIGBuZXh0YCwgdGhlIHdhbGsgZ29lcyBvbiBPVVRXQVJEIHRvIHRoZSBvbmVcbiAgICogZW5jbG9zaW5nIGl0LiBJdCBzdG9wcyBhdCBgc3RvcEF0YCDigJQgdGhlIGZhbi1vdXQgd2hlcmUgc2libGluZ3Mgc3RpbGxcbiAgICogd2FpdCwgd2hvc2Ugam9pbiBtdXN0IG5vdCBydW4geWV0LiBOb3RoaW5nIHRvIGF0dGFjaDogYHJlcGxhY2VtZW50YFxuICAgKiBpdHNlbGYuXG4gICAqL1xuICBlbnRyeShcbiAgICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjaGlsZDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgcmVwbGFjZW1lbnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0b3BBdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQsXG4gICk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gYXBwZW5kQXRDaGFpbkVuZChyZXBsYWNlbWVudCwgdGhpcy5hZnRlcihyb290LCBjaGlsZCwgc3RvcEF0KSk7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBydW5zIG9uY2UgYG5vZGVgJ3MgY2hhaW4gZW5kczogaXRzIGRpc3BhdGNoZXIncyBgbmV4dGAgY2hhaW4sIHRoZW4g4oCUXG4gICAqIHdoZXJlIFRIQVQgZW5kcyDigJQgdGhlIGNvbnRpbnVhdGlvbiBvZiB0aGUgZGlzcGF0Y2hlciBlbmNsb3NpbmcgaXQsIG91dHdhcmQsXG4gICAqIHVwIHRvIGBzdG9wQXRgIChleGNsdXNpdmUpLiBgdW5kZWZpbmVkYCBvbiB0aGUgc3BpbmUuXG4gICAqL1xuICBwcml2YXRlIGFmdGVyKFxuICAgIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0b3BBdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQsXG4gICk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkaXNwYXRjaGVyID0gdGhpcy5kaXNwYXRjaGVyT2Yocm9vdCwgbm9kZSk7XG4gICAgaWYgKGRpc3BhdGNoZXIgPT09IHVuZGVmaW5lZCB8fCBkaXNwYXRjaGVyID09PSBzdG9wQXQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3V0ZXIgPSB0aGlzLmFmdGVyKHJvb3QsIGRpc3BhdGNoZXIsIHN0b3BBdCk7XG4gICAgcmV0dXJuIGRpc3BhdGNoZXIubmV4dCA/IGFwcGVuZEF0Q2hhaW5FbmQoZGlzcGF0Y2hlci5uZXh0LCBvdXRlcikgOiBvdXRlcjtcbiAgfVxufVxuXG4vKipcbiAqIGBzdGFydGAncyBjaGFpbiB3aXRoIGBhZnRlcmAgYXR0YWNoZWQgd2hlcmUgaXQgZW5kcyDigJQgdGhlIGNoYWluJ3Mgbm9kZXNcbiAqIGNvcGllZCBvbiB0aGUgd2F5IChuZXZlciByZWdpc3RlcmVkIGFueXdoZXJlOiBpZHMgc3RpbGwgcmVzb2x2ZSB0byB0aGUgcmVhbFxuICogbm9kZXMpLiBBIGNoYWluIHRoYXQgZW5kcyBpbiBhIGxvb3Agc3R1YiAob3IgbG9vcHMgYmFjayBvbiBpdHNlbGYpIGlzXG4gKiByZXR1cm5lZCBhcyBpczogY29udHJvbCBsZWF2ZXMgaXQgdGhyb3VnaCB0aGUgbG9vcCwgbmV2ZXIgXCJhZnRlclwiIGl0LlxuICovXG5mdW5jdGlvbiBhcHBlbmRBdENoYWluRW5kPFRPdXQsIFRTY29wZT4oXG4gIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgYWZ0ZXI6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkLFxuKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICBpZiAoYWZ0ZXIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHN0YXJ0O1xuICBjb25zdCBjaGFpbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPj4oKTtcbiAgZm9yIChsZXQgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQgPSBzdGFydDsgbm9kZSAhPT0gdW5kZWZpbmVkOyBub2RlID0gbm9kZS5uZXh0KSB7XG4gICAgaWYgKG5vZGUuaXNMb29wUmVmIHx8IHNlZW4uaGFzKG5vZGUpKSByZXR1cm4gc3RhcnQ7XG4gICAgc2Vlbi5hZGQobm9kZSk7XG4gICAgY2hhaW4ucHVzaChub2RlKTtcbiAgfVxuICBsZXQgbmV4dCA9IGFmdGVyO1xuICBmb3IgKGxldCBpID0gY2hhaW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIG5leHQgPSB7IC4uLmNoYWluW2ldLCBuZXh0IH07XG4gIHJldHVybiBuZXh0O1xufVxuXG4vLyDilIDilIAgV2FpdGluZyBzaWJsaW5ncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFRoZSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGF0IG9uZSBsZXZlbCwgYW5kIHRoZSBmYW4tb3V0IHRoZXkgd2FpdCBpbi4gKi9cbmludGVyZmFjZSBMZXZlbFF1ZXVlPFRPdXQsIFRTY29wZT4ge1xuICByZWFkb25seSBmYW5PdXQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICByZWFkb25seSBwYXVzZXM6IFF1ZXVlZFBhdXNlW107XG59XG5cbi8qKlxuICogUGxhY2UgYGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2AgKGRlY29kZWQg4oCUIGBwYXVzZS9yZWNvcmQudHNgKSBhbmQgcXVldWUgZWFjaCBhdCB0aGVcbiAqIGxldmVsIG9mIGl0cyBmYW4tb3V0OiB0aGUgZGVwdGggd2hlcmUgaXRzIHBhdGggcGFydHMgZnJvbSB0aGUgcGF1c2VkXG4gKiBzdGFnZSdzLiBUaGVyZSwgdGhlIHBhdXNlZCBzdGFnZSdzIGNoaWxkIChhIG1vdW50IG9uIHRoZSBwYXRoLCBvciB0aGUgc3RhZ2VcbiAqIGl0c2VsZikgYW5kIHRoZSBzaWJsaW5nJ3MgbXVzdCBib3RoIGhhbmcgb2ZmIE9ORSBwYXJhbGxlbCBkaXNwYXRjaGVyIOKAlCBhXG4gKiBmb3JrIG9yIGEgc2VsZWN0b3Ig4oCUIG9yIHRoZSByZWNvcmQgaXMgbm90IGEgc2libGluZyBhbmQgdGhlIHJlc3VtZSBpc1xuICogcmVmdXNlZCByYXRoZXIgdGhhbiBhc2tlZCBhIHF1ZXN0aW9uIHRoZSBjaGFydCBjb3VsZCBub3QgaGF2ZSByYWlzZWQuXG4gKi9cbmZ1bmN0aW9uIHF1ZXVlU2libGluZ1BhdXNlczxUT3V0LCBUU2NvcGU+KFxuICBwZW5kaW5nOiByZWFkb25seSBQZW5kaW5nUGF1c2VbXSB8IHVuZGVmaW5lZCxcbiAgYXQ6IHtcbiAgICBjaGFydDogQ2hhcnRJbmRleDxUT3V0LCBUU2NvcGU+O1xuICAgIHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+IHwgdW5kZWZpbmVkO1xuICAgIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIGdyYXBoczogcmVhZG9ubHkgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXTtcbiAgICBtb3VudHM6IHJlYWRvbmx5IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W107XG4gICAgcGF1c2VkOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgfSxcbik6IEFycmF5PExldmVsUXVldWU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBxdWV1ZXM6IEFycmF5PExldmVsUXVldWU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZD4gPSBbXTtcbiAgaWYgKHBlbmRpbmcgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHF1ZXVlcztcbiAgLy8gVGhlIGNvZGVjJ3MgY2hlY2sgKGBwYXVzZS9yZWNvcmQudHNgKSDigJQgYHBsYW5gIGlzIGEgcHVibGljIGRvb3IgdG9vLCBzbyBpdFxuICAvLyBuZXZlciB0YWtlcyBhIHNpYmxpbmcgcmVjb3JkIHVuY2hlY2tlZCwgaG93ZXZlciBpdCB3YXMgaGFuZGVkIG9uZS5cbiAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVBlbmRpbmdQYXVzZXMocGVuZGluZyk7XG4gIGNvbnN0IHsgY2hhcnQsIHN1YmZsb3dzLCByb290LCBwYXRoLCBncmFwaHMsIG1vdW50cywgcGF1c2VkIH0gPSBhdDtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8vIEVhY2ggcmVjb3JkJ3MgRklFTERTIGFyZSBjaGVja2VkIGFib3ZlOyBoZXJlIGl0IGlzIGFza2VkIHdoZXRoZXIgdGhlXG4gIC8vIHJlY29yZCBmaXRzIFRISVMgY2hhcnQuXG4gIGRlY29kZWQuZm9yRWFjaCgocGF1c2UsIG4pID0+IHtcbiAgICAvLyBPbmUgcmVjb3JkIHBlciBwYXVzZWQgc2libGluZzogYSByZXBlYXQgd291bGQgYXNrIHRoZSBzYW1lIHF1ZXN0aW9uIHR3aWNlLlxuICAgIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtwYXVzZS5zdWJmbG93UGF0aCwgcGF1c2UucGF1c2VkU3RhZ2VJZF0pO1xuICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNbJHtufV0gKCcke3BhdXNlLnBhdXNlZFN0YWdlSWR9JykgcmVwZWF0cyBhbiBlYXJsaWVyIGVudHJ5LmAsXG4gICAgICApO1xuICAgIH1cbiAgICBzZWVuLmFkZChrZXkpO1xuICAgIGxldCBsZXZlbCA9IDA7XG4gICAgd2hpbGUgKGxldmVsIDwgcGF0aC5sZW5ndGggJiYgbGV2ZWwgPCBwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGggJiYgcGF0aFtsZXZlbF0gPT09IHBhdXNlLnN1YmZsb3dQYXRoW2xldmVsXSkgbGV2ZWwrKztcbiAgICBjb25zdCBncmFwaCA9IGdyYXBoc1tsZXZlbF07XG4gICAgY29uc3Qgb3VycyA9IGxldmVsIDwgcGF0aC5sZW5ndGggPyBtb3VudHNbbGV2ZWxdIDogcGF1c2VkO1xuICAgIGNvbnN0IHRoZWlyTW91bnRzID0gbGV2ZWwgPCBwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGggPyBjaGFydC5tb3VudHNPZihncmFwaCwgcGF1c2Uuc3ViZmxvd1BhdGhbbGV2ZWxdKSA6IFtdO1xuICAgIGNvbnN0IHRoZWlycyA9XG4gICAgICBsZXZlbCA8IHBhdXNlLnN1YmZsb3dQYXRoLmxlbmd0aFxuICAgICAgICA/IHRoZWlyTW91bnRzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgID8gdGhlaXJNb3VudHNbMF1cbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICA6IGNoYXJ0LnN0YWdlKGdyYXBoLCBwYXVzZS5wYXVzZWRTdGFnZUlkKTtcbiAgICBjb25zdCBmYW5PdXQgPSBvdXJzID8gY2hhcnQuZGlzcGF0Y2hlck9mKGdyYXBoLCBvdXJzKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpc1NpYmxpbmcgPVxuICAgICAgb3VycyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGVpcnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgb3VycyAhPT0gdGhlaXJzICYmXG4gICAgICBmYW5PdXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgY2hhcnQuZGlzcGF0Y2hlck9mKGdyYXBoLCB0aGVpcnMpID09PSBmYW5PdXQgJiZcbiAgICAgICFmYW5PdXQuZGVjaWRlckZuICYmXG4gICAgICAocXVldWVzW2xldmVsXSA9PT0gdW5kZWZpbmVkIHx8IHF1ZXVlc1tsZXZlbF0hLmZhbk91dCA9PT0gZmFuT3V0KTtcbiAgICBpZiAoIWlzU2libGluZyB8fCAhd2Fsa3NUb0l0c1N0YWdlKGNoYXJ0LCBzdWJmbG93cywgZ3JhcGgsIHBhdXNlLCBsZXZlbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlc1ske259XSAoJyR7cGF1c2UucGF1c2VkU3RhZ2VJZH0nKSBpcyBub3QgYSBwYXJhbGxlbCBzaWJsaW5nIG9mIGAgK1xuICAgICAgICAgIGB0aGUgcGF1c2VkIHN0YWdlICcke3BhdXNlZD8uaWQgPz8gJz8nfScgaW4gdGhpcyBjaGFydCDigJQgbm8gZm9yayBvciBzZWxlY3RvciBydW5zIHRoZW0gYm90aCwgb3IgaXRzIGAgK1xuICAgICAgICAgICdwYXRoIGRvZXMgbm90IGxlYWQgdG8gdGhhdCBzdGFnZS4gVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGxlYWZSb290ID1cbiAgICAgIHBhdXNlLnN1YmZsb3dQYXRoLmxlbmd0aCA9PT0gMCA/IHJvb3QgOiBvd25FbnRyeShzdWJmbG93cywgcGF1c2Uuc3ViZmxvd1BhdGhbcGF1c2Uuc3ViZmxvd1BhdGgubGVuZ3RoIC0gMV0pPy5yb290O1xuICAgIGNvbnN0IHN0YWdlTmFtZSA9IChsZWFmUm9vdCAmJiBjaGFydC5zdGFnZShsZWFmUm9vdCwgcGF1c2UucGF1c2VkU3RhZ2VJZCk/Lm5hbWUpID8/IHBhdXNlLnBhdXNlZFN0YWdlSWQ7XG4gICAgY29uc3QgcXVldWUgPSAocXVldWVzW2xldmVsXSA/Pz0geyBmYW5PdXQ6IGZhbk91dCEsIHBhdXNlczogW10gfSk7XG4gICAgcXVldWUucGF1c2VzLnB1c2goeyBwYXVzZSwgbGV2ZWwsIHN0YWdlTmFtZSB9KTtcbiAgfSk7XG4gIHJldHVybiBxdWV1ZXM7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHdhaXRpbmcgc2libGluZydzIFdIT0xFIHBhdGggYmVsb3cgaXRzIGZhbi1vdXQgd2Fsa3MgdGhpcyBjaGFydDpcbiAqIGV2ZXJ5IHNlZ21lbnQgdGhlIG9ubHkgbW91bnQgb2YgaXRzIHN1YmZsb3cgaW4gdGhlIGVuY2xvc2luZyBncmFwaCwgZXZlcnlcbiAqIHN1YmZsb3cgcmVnaXN0ZXJlZCwgYW5kIHRoZSBwYXVzZWQgc3RhZ2UgaW4gdGhlIGxhc3QgZ3JhcGgg4oCUIGNoZWNrZWQgYXRcbiAqIHRoZSBGSVJTVCByZXN1bWUsIHNvIGEgdGFtcGVyZWQgcmVjb3JkIGlzIHJlZnVzZWQgdXAgZnJvbnQsIG5vdCB3aGVuIGl0c1xuICogdHVybiBjb21lcy5cbiAqL1xuZnVuY3Rpb24gd2Fsa3NUb0l0c1N0YWdlPFRPdXQsIFRTY29wZT4oXG4gIGNoYXJ0OiBDaGFydEluZGV4PFRPdXQsIFRTY29wZT4sXG4gIHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+IHwgdW5kZWZpbmVkLFxuICBmYW5PdXRHcmFwaDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIHBhdXNlOiBQZW5kaW5nUGF1c2UsXG4gIGxldmVsOiBudW1iZXIsXG4pOiBib29sZWFuIHtcbiAgbGV0IGdyYXBoID0gZmFuT3V0R3JhcGg7XG4gIGZvciAobGV0IGkgPSBsZXZlbDsgaSA8IHBhdXNlLnN1YmZsb3dQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNoYXJ0Lm1vdW50c09mKGdyYXBoLCBwYXVzZS5zdWJmbG93UGF0aFtpXSkubGVuZ3RoICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IG93bkVudHJ5KHN1YmZsb3dzLCBwYXVzZS5zdWJmbG93UGF0aFtpXSk7XG4gICAgaWYgKCFkZWZpbml0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgZ3JhcGggPSBkZWZpbml0aW9uLnJvb3Q7XG4gIH1cbiAgcmV0dXJuIGNoYXJ0LnN0YWdlKGdyYXBoLCBwYXVzZS5wYXVzZWRTdGFnZUlkKSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKiogYHJlY29yZFtrZXldYCBvbmx5IHdoZW4gaXQgaXMgdGhlIHJlY29yZCdzIE9XTiBwcm9wZXJ0eSDigJQgbmV2ZXIgdGhyb3VnaCB0aGUgcHJvdG90eXBlIGNoYWluLiAqL1xuZnVuY3Rpb24gb3duRW50cnk8VD4ocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBUPiB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHJlY29yZCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVjb3JkLCBrZXkpID8gcmVjb3JkW2tleV0gOiB1bmRlZmluZWQ7XG59XG4iXX0=
451
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzdW1lRW50cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9SZXN1bWVFbnRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4REc7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUE4Q3RFLE1BQU0sT0FBTyxXQUFXO0lBQ3RCOzs7OztPQUtHO0lBQ00sS0FBSyxDQUFzQztJQUNwRCw2RkFBNkY7SUFDcEYsa0JBQWtCLENBQXFDO0lBQ2hFOzs7Ozs7T0FNRztJQUNNLGtCQUFrQixDQUFxQjtJQUNoRCxpRkFBaUY7SUFDaEUsT0FBTyxDQUF1QztJQUUvRCxZQUNFLEtBQTBDLEVBQzFDLElBQXdDLEVBQ3hDLGtCQUEyQyxFQUMzQyxrQkFBMkI7UUFFM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQWUsSUFPekI7UUFDQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8s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SyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDM0UsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM5QixLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztJQUMxQixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQy9ELENBQUM7QUFFRCxtR0FBbUc7QUFDbkcsU0FBUyxRQUFRLENBQUksTUFBcUMsRUFBRSxHQUFXO0lBQ3JFLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQy9GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlc3VtZUVudHJ5IOKAlCB0aGUgcmVzdW1lJ3MgT05FLVNIT1QgcmUtZW50cnkgKE0yLCBwYXVzZS9yZXN1bWUpLlxuICpcbiAqIEEgcmVzdW1lIGhhcyB0byBnZXQgYmFjayB0byBhIHN0YWdlIGluIHRoZSBtaWRkbGUgb2YgYSBjaGFydC4gSXQgZG9lcyB0aGF0XG4gKiB3aXRoIGEgc21hbGwgc3ludGhldGljIHN0cnVjdHVyZTogYSBzdGFuZC1pbiBmb3IgdGhlIHBhdXNlZCBzdGFnZSAodGhlXG4gKiBzdGFnZSdzIG93biBub2RlIHdpdGggaXRzIGZ1bmN0aW9uIHN3YXBwZWQgZm9yIHRoZSByZXN1bWUgaGFsZiDigJQgb3IsIGZvciBhblxuICogYGludGVycnVwdCgpYCBwYXVzZSwgZm9yIGl0cyBvd24gZnVuY3Rpb24gd2l0aCB0aGUgYW5zd2VyIGRlcG9zaXRlZCksIGFuZCxcbiAqIGZvciBhIHBhdXNlIGluc2lkZSBzdWJmbG93cywgdGhlIGNoZWNrcG9pbnQncyBjYXB0dXJlIG9mIGVhY2ggc3ViZmxvdydzXG4gKiBzdGF0ZSBvbiB0aGUgd2F5IGRvd24uXG4gKlxuICogVEhFIExBVzogdGhhdCBzdHJ1Y3R1cmUgaXMgdXNlZCBFWEFDVExZIE9OQ0UsIGZvciB0aGUgcmUtZW50cnkuIFRoZSBzdGFuZC1pblxuICogaXMgd2hlcmUgdGhlIHJlc3VtZWQgdHJhdmVyc2FsIFNUQVJUUyAob3Igd2hlcmUgdGhlIGxlYWYgc3ViZmxvdydzIHRyYXZlcnNhbFxuICogc3RhcnRzKSDigJQgaXQgaXMgbmV2ZXIgYSBub2RlIGFueSBpZCBjYW4gcmVzb2x2ZSB0by4gRWFjaCBzdWJmbG93IG9uIHRoZSBwYXVzZVxuICogcGF0aCB0YWtlcyBpdHMgc2VlZCBhbmQgaXRzIGVudHJ5IHBvaW50IG9uIGl0cyBGSVJTVCBlbnRyeSBhbmQgbmV2ZXIgYWdhaW4uXG4gKiBBZnRlciB0aGF0IHRoZSBydW4gYmVsb25ncyB0byB0aGUgcmVhbCBjaGFydDogZXZlcnkgbG9vcCB0YXJnZXQsIGV2ZXJ5IGxhdGVyXG4gKiBzdWJmbG93IGVudHJ5IChyZWFsIHJvb3QsIGlucHV0TWFwcGVyIHJ1bnMpLCBldmVyeSByZS12aXNpdCBvZiB0aGUgcGF1c2VkXG4gKiBzdGFnZSAod2hpY2ggcGF1c2VzIGFnYWluKSByZXNvbHZlcyBhZ2FpbnN0IHRoZSBjaGFydCBhcyBidWlsdC5cbiAqXG4gKiBPTkUgUlVMRSBBVCBFVkVSWSBMRVZFTCDigJQgd2hhdCBydW5zIGFmdGVyIHRoZSBlbnRyeS4gT24gdGhlIG9yaWdpbmFsIHJ1bixcbiAqIHdoYXRldmVyIERJU1BBVENIRUQgdGhlIHBhdXNlZCBzdGFnZSAob3IgdGhlIG1vdW50IG9mIHRoZSBuZXh0IHN1YmZsb3cgb25cbiAqIHRoZSBwYXRoKSDigJQgYSBkZWNpZGVyLCBhIHNlbGVjdG9yLCBhIGZvcmsg4oCUIHJhbiBpdHMgb3duIGNvbnRpbnVhdGlvbiBvbmNlXG4gKiB0aGF0IGNoaWxkJ3MgY2hhaW4gZW5kZWQ6IHRoZSBkZWNpZGVyJ3MgYG5leHRgLCB0aGUgZm9yaydzIGpvaW4uIEEgcmVzdW1lXG4gKiBlbnRlcnMgQVQgdGhlIGNoaWxkLCBzbyB0aGF0IGNvbnRpbnVhdGlvbiBtdXN0IGJlIGNhcnJpZWQ6IHRoZSBlbnRyeSBpc1xuICogdGhlIGNoaWxkIHdpdGggdGhlIGVuY2xvc2luZyBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uIGF0dGFjaGVkIGF0IHRoZSBlbmRcbiAqIG9mIGl0cyBvd24gY2hhaW4gKGB7IC4uLmNoaWxkLCBuZXh0OiBkaXNwYXRjaGVyLm5leHQgfWAgZm9yIGEgY2hhcnQgdGhlXG4gKiBidWlsZGVyIG1hZGUpLiBJdCBpcyByZWFkIGZyb20gdGhlIENIQVJULCBsZXZlbCBieSBsZXZlbCDigJQgbmV2ZXIgZnJvbSB0aGVcbiAqIGNoZWNrcG9pbnQsIHNvIGFuIGVkaXRlZCBjaGVja3BvaW50IGNhbm5vdCByZWRpcmVjdCBhIHJ1biDigJQgYW5kIGl0IGxhbmRzXG4gKiBhdCB0aGUgbGV2ZWwgaXQgYmVsb25ncyB0bzogYSB0b3AtbGV2ZWwgZGVjaWRlcidzIGBuZXh0YCBydW5zIGF0IHRoZSB0b3BcbiAqIGxldmVsLCBhZnRlciB0aGUgc3ViZmxvdydzIG91dHB1dE1hcHBlciwgbm90IGluc2lkZSB0aGUgc3ViZmxvdy5cbiAqXG4gKiBQQVJBTExFTCBTSUJMSU5HUyBUSEFUIFBBVVNFRCBUT08gKDkuMjguMCkuIFdoZW4gdHdvIGNoaWxkcmVuIG9mIG9uZVxuICogZmFuLW91dCBwYXVzZWQsIHRoZSBjaGVja3BvaW50IGFza3MgdGhlIGZpcnN0IGFuZCBjYXJyaWVzIHRoZSBvdGhlcnNcbiAqIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5wZW5kaW5nUGF1c2VzYCkuIEF0IHRoYXQgZmFuLW91dCdzIGxldmVsIHRoZSBlbnRyeSBpc1xuICogdGhlIGNoaWxkJ3Mgb3duIGNoYWluIG9ubHkg4oCUIG5vIGpvaW4g4oCUIGFuZCBvbmNlIGl0IGVuZHMsIHRoZSBuZXh0IHNpYmxpbmcnc1xuICogcGF1c2UgaXMgcmFpc2VkIGFnYWluIGFzIGl0IHdhcyAoaXRzIHF1ZXN0aW9uLCBpdHMgY2FwdHVyZWQgc3RhdGUpLCB3aXRob3V0XG4gKiByZS1ydW5uaW5nIGFueXRoaW5nLiBUaGUgam9pbiBydW5zIG9ubHkgd2hlbiB0aGUgbGFzdCBzaWJsaW5nIGlzIHJlc3VtZWQuXG4gKlxuICogQmVmb3JlIDkuMjguMCB0aGUgc3RydWN0dXJlIHN0YXllZCBpbiBmb3JjZSBmb3IgdGhlIHdob2xlIHJlc3VtZWQgcnVuIOKAlCB0aGVcbiAqIHRyYXZlcnNhbCB3YXMgUk9PVEVEIGF0IHRoZSBzdGFuZC1pbiAoc28gYSBsb29wIGJhY2sgdG8gdGhlIHBhdXNlZCBpZCByZS1yYW5cbiAqIHRoZSByZXN1bWUgaGFsZiwgYW5kIGEgbG9vcCB0YXJnZXQgdXBzdHJlYW0gb2YgdGhlIHJlc3VtZSBwb2ludCB3YXNcbiAqIHVucmVhY2hhYmxlOiBvbmUgc3RhZ2UgcmFuLCB0aGVuIHRoZSBydW4gZW5kZWQgc2lsZW50bHkpLCBhbmQgdGhlIGxlYWZcbiAqIHN1YmZsb3cncyByb290IHdhcyBTV0FQUEVEIGZvciB0aGUgc3RhbmQtaW4gaW4gdGhlIHN1YmZsb3cgZGljdGlvbmFyeSAoc28gYVxuICogbGF0ZXIgZW50cnkgaW50byBpdCB3b3VsZCByZS1ydW4gdGhlIHJlc3VtZSBoYWxmIG9uIGEgc3RhbGUgc2VlZCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFdoYXQgRmxvd0NoYXJ0RXhlY3V0b3IucmVzdW1lKCkgYnVpbGRzIGZvciBhIHBhdXNlIGF0ICdzZi1hL3NmLWIvYXNrJ1xuICogLy8gKHN1YmZsb3dQYXRoIFsnc2YtYScsICdzZi1hL3NmLWInXSksICdzZi1hL3NmLWInIG1vdW50ZWQgYXMgYSBkZWNpZGVyXG4gKiAvLyBicmFuY2ggaW5zaWRlIHNmLWEgd2hvc2UgZGVjaWRlciBjb250aW51ZXMgdG8gJ3NmLWEvYWZ0ZXInOlxuICogY29uc3QgZW50cnkgPSBSZXN1bWVFbnRyeS5wbGFuKHsgcm9vdCwgc3ViZmxvd3MsIHBhdGgsIGNhcHR1cmVzLCBzdGFuZEluIH0pO1xuICogZW50cnkuc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRvcC1sZXZlbCBtb3VudCBvZiAnc2YtYSdcbiAqIGVudHJ5LmVudGVyU3ViZmxvdygnc2YtYScpOyAgICAgIC8vIHsgc2VlZDogc2YtYSdzIGNhcHR1cmUsIGVudHJ5OiB7IC4uLm1vdW50IG9mICdzZi1hL3NmLWInLCBuZXh0OiBzZi1hL2FmdGVyIH0gfVxuICogZW50cnkuZW50ZXJTdWJmbG93KCdzZi1hL3NmLWInKTsgLy8geyBzZWVkOiBzZi1iJ3MgY2FwdHVyZSwgZW50cnk6IHRoZSBzdGFuZC1pbiB9XG4gKiBlbnRyeS5lbnRlclN1YmZsb3coJ3NmLWEvc2YtYicpOyAvLyB1bmRlZmluZWQg4oCUIGEgbGF0ZXIgZW50cnkgaXMgYW4gb3JkaW5hcnkgb25lXG4gKiBgYGBcbiAqXG4gKiBBIHBhdXNlIHR3byAob3IgbW9yZSkgc3ViZmxvd3MgZGVlcCB0aGVyZWZvcmUgcmUtZW50ZXJzIGVhY2ggb3V0ZXIgc3ViZmxvd1xuICogQVQgdGhlIG1vdW50IG9mIHRoZSBuZXh0IG9uZSDigJQgdGhlIG91dGVyIHN1YmZsb3cncyBzdGFnZXMgYmVmb3JlIHRoYXQgbW91bnRcbiAqIGRvIG5vdCBydW4gYWdhaW4gKHRoZXkgZGlkIGJlZm9yZSA5LjI4LjApLiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBhIGRlZ3JhZGVkXG4gKiBjaGVja3BvaW50IG1pc3NpbmcgYW4gb3V0ZXIgc3ViZmxvdydzIGNhcHR1cmU6IHRoYXQgc3ViZmxvdyByZS1ydW5zIGZyb20gaXRzXG4gKiByb290IHdpdGggaXRzIGlucHV0TWFwcGVyIChpdHMgZWFybGllciBzdGFnZXMgcmVjb21wdXRlIHdoYXQgdGhlIGNhcHR1cmVcbiAqIHdvdWxkIGhhdmUgaGVsZCksIGV4YWN0bHkgYXMgOS4yNy4wIGRpZC5cbiAqL1xuXG5pbXBvcnQgeyBkZWNvZGVQZW5kaW5nUGF1c2VzIH0gZnJvbSAnLi4vLi4vcGF1c2UvcmVjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgUGVuZGluZ1BhdXNlIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZWRFeGVjdXRpb24sIFBhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuXG4vKipcbiAqIEEgcGFyYWxsZWwgc2libGluZydzIHBhdXNlLCBxdWV1ZWQgYXQgdGhlIGxldmVsIG9mIGl0cyBmYW4tb3V0OiByYWlzZWRcbiAqIGFnYWluIHRoZXJlIG9uY2UgdGhlIHJlc3VtZWQgY2hpbGQncyBjaGFpbiBlbmRzIChzZWUge0BsaW5rIHJhaXNlUXVldWVkUGF1c2V9KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZWRQYXVzZSB7XG4gIC8qKiBUaGUgc2libGluZydzIHBhdXNlIGFzIHRoZSBjaGVja3BvaW50IGNhcnJpZXMgaXQg4oCUIGl0cyBwYXRoIGZyb20gdGhlIHRvcC4gKi9cbiAgcmVhZG9ubHkgcGF1c2U6IFBlbmRpbmdQYXVzZTtcbiAgLyoqIEhvdyBtYW55IHN1YmZsb3dzIGRlZXAgdGhlIGZhbi1vdXQgc2l0cyAoMCA9IHRoZSB0b3AgbGV2ZWwpLiAqL1xuICByZWFkb25seSBsZXZlbDogbnVtYmVyO1xuICAvKiogVGhlIHNpYmxpbmcncyBwYXVzZWQgc3RhZ2UncyBuYW1lLCBmb3IgdGhlIGBvblBhdXNlYCBldmVudC4gKi9cbiAgcmVhZG9ubHkgc3RhZ2VOYW1lOiBzdHJpbmc7XG59XG5cbi8qKiBPbmUgc3ViZmxvdyBib3VuZGFyeSBvbiB0aGUgd2F5IGJhY2sgdG8gYSBwYXVzZWQgc3RhZ2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VtZUhvcDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqIFRoZSBwYXRoLXByZWZpeGVkIHN1YmZsb3cgaWQgKGEgYEZsb3djaGFydENoZWNrcG9pbnQuc3ViZmxvd1BhdGhgIGVudHJ5KS4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd0lkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc3ViZmxvdydzIHN0YXRlIGF0IHRoZSBwYXVzZSAoYGNoZWNrcG9pbnQuc3ViZmxvd1N0YXRlc1tzdWJmbG93SWRdYCkuXG4gICAqIFNlZWRzIHRoZSBuZXN0ZWQgcnVudGltZSBJTlNURUFEIG9mIHRoZSBpbnB1dE1hcHBlcidzIHZhbHVlcyDigJQgdGhlIGNhcHR1cmVcbiAgICogYWxyZWFkeSBob2xkcyB0aGUgcG9zdC1pbnB1dCwgcHJlLXBhdXNlIG1lbW9yeSAodGhlIGlucHV0TWFwcGVyIHN0aWxsXG4gICAqIHJ1bnMsIGZvciB0aGUgc3RhZ2VzJyByZWFkLW9ubHkgYXJncyBvbmx5KS4gQWJzZW50IHdoZW4gdGhlIGNoZWNrcG9pbnRcbiAgICogaG9sZHMgbm8gY2FwdHVyZSBmb3IgdGhpcyBzdWJmbG93OyB0aGUgaW5wdXRNYXBwZXIgdGhlbiBzZWVkcyBpdCwgYXMgb25cbiAgICogYW55IGVudHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgc2VlZD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogV2hlcmUgdGhpcyBzdWJmbG93J3MgdHJhdmVyc2FsIHN0YXJ0cyBvbiB0aGUgcmUtZW50cnk6IHRoZSBtb3VudCBvZiB0aGVcbiAgICogbmV4dCBzdWJmbG93IG9uIHRoZSBwYXRoLCBvciDigJQgb24gdGhlIGxhc3QgaG9wIOKAlCB0aGUgcGF1c2VkIHN0YWdlJ3NcbiAgICogc3RhbmQtaW4sIGVhY2ggd2l0aCBpdHMgZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvbiBhdHRhY2hlZCAoc2VlIHRoZVxuICAgKiBtb2R1bGUgZG9jKS4gQWJzZW50OiB0aGUgc3ViZmxvdydzIG93biByb290IOKAlCBhIHNlZWQtb25seSBob3AgKHNlZVxuICAgKiB7QGxpbmsgUmVzdW1lRW50cnkuZnJvbUNhcHR1cmVzfSksIG9yIGFuIG91dGVyIHN1YmZsb3cgd2hvc2UgY2FwdHVyZSB0aGVcbiAgICogY2hlY2twb2ludCBsYWNrcy5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBQYXVzZXMgb2YgcGFyYWxsZWwgc2libGluZ3Mgd2hvc2UgZmFuLW91dCBzaXRzIGluIFRISVMgc3ViZmxvdywgcmFpc2VkIGluXG4gICAqIG9yZGVyIG9uY2UgYGVudHJ5YCdzIGNoYWluIGVuZHMgKHRoZSBmaXJzdCBpcyByYWlzZWQsIHRoZSByZXN0IHdhaXRcbiAgICogYmVoaW5kIGl0KS4gQWJzZW50IHdoZW4gbm8gc2libGluZyBpcyB3YWl0aW5nIGhlcmUuXG4gICAqL1xuICByZWFkb25seSBwZW5kaW5nUGF1c2VzPzogcmVhZG9ubHkgUXVldWVkUGF1c2VbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlc3VtZUVudHJ5PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogV2hlcmUgdGhlIHJlc3VtZWQgVE9QLUxFVkVMIHRyYXZlcnNhbCBzdGFydHM6IHRoZSBzdGFuZC1pbiAoYSB0b3AtbGV2ZWxcbiAgICogcGF1c2UpIG9yIHRoZSBtb3VudCBvZiB0aGUgZmlyc3Qgc3ViZmxvdyBvbiB0aGUgcGF0aCDigJQgZWFjaCB3aXRoIGl0c1xuICAgKiBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uIGF0dGFjaGVkLiBgdW5kZWZpbmVkYCBmb3IgYSBzZWVkLW9ubHkgZW50cnkg4oCUXG4gICAqIHRoZSB0cmF2ZXJzYWwgc3RhcnRzIGF0IGl0cyByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAvKiogU2libGluZyBwYXVzZXMgd2hvc2UgZmFuLW91dCBzaXRzIGF0IHRoZSBUT1AgbGV2ZWwg4oCUIHJhaXNlZCBvbmNlIGBzdGFydGAncyBjaGFpbiBlbmRzLiAqL1xuICByZWFkb25seSBzdGFydFBlbmRpbmdQYXVzZXM6IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW10gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBIb3cgbWFueSBzdGFnZSBleGVjdXRpb25zIHRoZSByZXN1bWVkIHJ1biBtYWtlcyBiZWZvcmUgdGhlIHN0YW5kLWluIHJ1bnNcbiAgICog4oCUIG9uZSBwZXIgc3ViZmxvdyBvbiB0aGUgcGF0aCwgZWFjaCBlbnRlcmVkIGF0IGl0cyBtb3VudCDigJQgc28gdGhlXG4gICAqIGV4ZWN1dG9yJ3MgYG9uUmVzdW1lYCBuYW1lcyB0aGUgc3RhbmQtaW4ncyBvd24gYHJ1bnRpbWVTdGFnZUlkYC5cbiAgICogYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW5ub3QgYmUga25vd24gYmVmb3JlIHRoZSBydW46IGFuIG91dGVyIHN1YmZsb3dcbiAgICogbWlzc2luZyBpdHMgY2FwdHVyZSByZS1ydW5zIGZyb20gaXRzIHJvb3QuXG4gICAqL1xuICByZWFkb25seSBzdGVwc0JlZm9yZVN0YW5kSW46IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqIEhvcHMgbm90IHRha2VuIHlldCwgYnkgc3ViZmxvdyBpZC4gQSBob3AgbGVhdmVzIHRoaXMgbWFwIHdoZW4gaXQgaXMgdGFrZW4uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZzogTWFwPHN0cmluZywgUmVzdW1lSG9wPFRPdXQsIFRTY29wZT4+O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgc3RhcnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkLFxuICAgIGhvcHM6IHJlYWRvbmx5IFJlc3VtZUhvcDxUT3V0LCBUU2NvcGU+W10sXG4gICAgc3RhcnRQZW5kaW5nUGF1c2VzPzogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSxcbiAgICBzdGVwc0JlZm9yZVN0YW5kSW4/OiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLnN0YXJ0UGVuZGluZ1BhdXNlcyA9IHN0YXJ0UGVuZGluZ1BhdXNlcztcbiAgICB0aGlzLnN0ZXBzQmVmb3JlU3RhbmRJbiA9IHN0ZXBzQmVmb3JlU3RhbmRJbjtcbiAgICB0aGlzLnBlbmRpbmcgPSBuZXcgTWFwKGhvcHMubWFwKChob3ApID0+IFtob3Auc3ViZmxvd0lkLCBob3BdKSk7XG4gIH1cblxuICAvKipcbiAgICogUGxhbiB0aGUgcmUtZW50cnkgb2YgYSBwYXVzZWQgY2hhcnQuIEV2ZXJ5IG1vdW50IG9uIHRoZSBwYXRoLCBldmVyeVxuICAgKiBkaXNwYXRjaGVyIGNvbnRpbnVhdGlvbiBhbmQgZXZlcnkgd2FpdGluZyBzaWJsaW5nIGlzIHJlc29sdmVkIEhFUkUsXG4gICAqIGFnYWluc3QgdGhlIGNoYXJ0IGFzIGJ1aWx0LCBiZWZvcmUgYSBzaW5nbGUgc3RhZ2UgcnVucyDigJQgc28gYSBjaGVja3BvaW50XG4gICAqIHdob3NlIHBhdGggdGhlIGNoYXJ0IGNhbm5vdCB3YWxrIGlzIHJlZnVzZWQgdXAgZnJvbnQgaW5zdGVhZCBvZiByZXN1bWluZ1xuICAgKiBpbnRvIHRoZSB3cm9uZyBzaGFwZS5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgLSBgcm9vdGAgYW5kIGBzdWJmbG93c2A6IHRoZSBjaGFydCBhcyBidWlsdFxuICAgKiAgIChgRmxvd0NoYXJ0LnJvb3RgLCBgRmxvd0NoYXJ0LnN1YmZsb3dzYCk7IGBwYXRoYDpcbiAgICogICBgY2hlY2twb2ludC5zdWJmbG93UGF0aGAsIG91dGVybW9zdCBmaXJzdDsgYGNhcHR1cmVzYDpcbiAgICogICBgY2hlY2twb2ludC5zdWJmbG93U3RhdGVzYCAoYSBkZXRhY2hlZCBjb3B5KTsgYHN0YW5kSW5gOiB0aGUgbm9kZSB0aGF0XG4gICAqICAgcnVucyB0aGUgcmVzdW1lIGhhbGYg4oCUIHRoZSBwYXVzZWQgc3RhZ2UncyBvd24gbm9kZSwgZnVuY3Rpb24gc3dhcHBlZFxuICAgKiAgIChpdHMgY29udGludWF0aW9uIGlzIGF0dGFjaGVkIGhlcmUpOyBgcGVuZGluZ1BhdXNlc2A6XG4gICAqICAgYGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2AgKGEgZGV0YWNoZWQgY29weSkuXG4gICAqIEB0aHJvd3Mgd2hlbiBhIHN1YmZsb3cgb24gdGhlIHBhdGggaXMgbWlzc2luZywgbW91bnRlZCBtb3JlIHRoYW4gb25jZSwgb3JcbiAgICogICBpdHMgbW91bnQgY2Fubm90IGJlIHJlYWNoZWQgZnJvbSB0aGUgZW5jbG9zaW5nIGdyYXBoOyBvciB3aGVuIGEgcGVuZGluZ1xuICAgKiAgIHBhdXNlIGlzIG1hbGZvcm1lZCBvciBpcyBub3QgYSBwYXJhbGxlbCBzaWJsaW5nIG9mIHRoZSBwYXVzZWQgc3RhZ2VcbiAgICovXG4gIHN0YXRpYyBwbGFuPFRPdXQsIFRTY29wZT4oYXJnczoge1xuICAgIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgIHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+IHwgdW5kZWZpbmVkO1xuICAgIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIGNhcHR1cmVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWQ7XG4gICAgc3RhbmRJbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFBlbmRpbmdQYXVzZVtdO1xuICB9KTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgeyByb290LCBzdWJmbG93cywgcGF0aCwgY2FwdHVyZXMsIHN0YW5kSW4gfSA9IGFyZ3M7XG4gICAgY29uc3QgY2hhcnQgPSBuZXcgQ2hhcnRJbmRleDxUT3V0LCBUU2NvcGU+KCk7XG5cbiAgICAvLyAxLiBXYWxrIHRoZSBwYXRoOiB0aGUgZ3JhcGggb2YgZXZlcnkgbGV2ZWwsIHRoZSBtb3VudCBvZiBldmVyeSBzdWJmbG93LlxuICAgIGNvbnN0IGdyYXBoczogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSA9IFtyb290XTtcbiAgICBjb25zdCBtb3VudHM6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dJZCA9IHBhdGhbaV07XG4gICAgICBtb3VudHMucHVzaChjaGFydC5vbmx5TW91bnQoZ3JhcGhzW2ldLCBzdWJmbG93SWQsIGkgPT09IDAgPyAndGhlIGZsb3djaGFydCcgOiBgc3ViZmxvdyAnJHtwYXRoW2kgLSAxXX0nYCkpO1xuICAgICAgLy8gT3duIGVudHJpZXMgb25seTogYSBwYXRoIHNlZ21lbnQgaXMgZGF0YSBmcm9tIGEgc3RvcmVkIGNoZWNrcG9pbnQsXG4gICAgICAvLyBhbmQgYCdfX3Byb3RvX18nYCBtdXN0IG5vdCByZXNvbHZlIHRocm91Z2ggdGhlIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBvd25FbnRyeShzdWJmbG93cywgc3ViZmxvd0lkKTtcbiAgICAgIGlmICghZGVmaW5pdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCByZXN1bWU6IHN1YmZsb3cgJyR7c3ViZmxvd0lkfScgaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGZsb3djaGFydC4gYCArXG4gICAgICAgICAgICAnVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGdyYXBocy5wdXNoKGRlZmluaXRpb24ucm9vdCk7XG4gICAgfVxuICAgIGNvbnN0IGxlYWZMZXZlbCA9IHBhdGgubGVuZ3RoO1xuICAgIC8vIFRoZSBwYXVzZWQgc3RhZ2UncyBSRUFMIG5vZGUg4oCUIHdob3NlIGRpc3BhdGNoZXIgdGhlIHN0YW5kLWluJ3NcbiAgICAvLyBjb250aW51YXRpb24gY29tZXMgZnJvbS4gKFRoZSBleGVjdXRvciBhbHJlYWR5IGZvdW5kIGl0OyBhIGRpcmVjdFxuICAgIC8vIGNhbGxlcidzIHN0YW5kLWluIHRoYXQgaXMgbm90IGluIHRoZSBsZWFmIGdyYXBoIHNpbXBseSBoYXMgbm9uZS4pXG4gICAgY29uc3QgcGF1c2VkID0gY2hhcnQuc3RhZ2UoZ3JhcGhzW2xlYWZMZXZlbF0sIHN0YW5kSW4uaWQpO1xuXG4gICAgLy8gMi4gUXVldWUgZXZlcnkgd2FpdGluZyBzaWJsaW5nIHBhdXNlIGF0IHRoZSBsZXZlbCBvZiBpdHMgZmFuLW91dC5cbiAgICBjb25zdCBxdWV1ZXMgPSBxdWV1ZVNpYmxpbmdQYXVzZXMoYXJncy5wZW5kaW5nUGF1c2VzLCB7IGNoYXJ0LCBzdWJmbG93cywgcm9vdCwgcGF0aCwgZ3JhcGhzLCBtb3VudHMsIHBhdXNlZCB9KTtcblxuICAgIC8vIDMuIFRoZSBvbmUtc2hvdCBlbnRyeSBvZiBldmVyeSBsZXZlbDogdGhlIGNoaWxkLCB0aGVuIGl0cyBkaXNwYXRjaGVyJ3NcbiAgICAvLyAgICBjb250aW51YXRpb24g4oCUIHVwIHRvIHRoZSBmYW4tb3V0IHdoZW4gc2libGluZ3Mgd2FpdCB0aGVyZS5cbiAgICBjb25zdCBjaGlsZEF0ID0gKGxldmVsOiBudW1iZXIpID0+IChsZXZlbCA8IGxlYWZMZXZlbCA/IG1vdW50c1tsZXZlbF0gOiBwYXVzZWQpO1xuICAgIGNvbnN0IGVudHJ5QXQgPSAobGV2ZWw6IG51bWJlcik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRBdChsZXZlbCk7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IGxldmVsIDwgbGVhZkxldmVsID8gbW91bnRzW2xldmVsXSA6IHN0YW5kSW47XG4gICAgICBpZiAoIWNoaWxkKSByZXR1cm4gcmVwbGFjZW1lbnQ7XG4gICAgICByZXR1cm4gY2hhcnQuZW50cnkoZ3JhcGhzW2xldmVsXSwgY2hpbGQsIHJlcGxhY2VtZW50LCBxdWV1ZXNbbGV2ZWxdPy5mYW5PdXQpO1xuICAgIH07XG4gICAgLy8gNC4gVGhlIGhvcHMuIEEgc3ViZmxvdyB3aXRoIG5vIGNhcHR1cmUgaXMgZW50ZXJlZCBhdCBpdHMgUk9PVCB3aXRoIGl0c1xuICAgIC8vICAgIGlucHV0TWFwcGVyIChpdHMgZWFybGllciBzdGFnZXMgcmVjb21wdXRlIHdoYXQgdGhlIGNhcHR1cmUgaGVsZCkg4oCUXG4gICAgLy8gICAgZXhjZXB0IHRoZSBsZWFmLCB3aG9zZSBlbnRyeSBpcyBhbHdheXMgdGhlIHN0YW5kLWluOiByZS1ydW5uaW5nIGl0XG4gICAgLy8gICAgZnJvbSBpdHMgcm9vdCB3b3VsZCBhc2sgYWdhaW4gYW5kIGxvc2UgdGhlIGFuc3dlci5cbiAgICBjb25zdCBob3BzOiBSZXN1bWVIb3A8VE91dCwgVFNjb3BlPltdID0gW107XG4gICAgbGV0IGV2ZXJ5TGV2ZWxBdEl0c0VudHJ5ID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dJZCA9IHBhdGhbaV07XG4gICAgICBjb25zdCBzZWVkID0gb3duRW50cnkoY2FwdHVyZXMsIHN1YmZsb3dJZCk7XG4gICAgICBjb25zdCBpc0xlYWZIb3AgPSBpID09PSBwYXRoLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoc2VlZCA9PT0gdW5kZWZpbmVkICYmICFpc0xlYWZIb3ApIHtcbiAgICAgICAgZXZlcnlMZXZlbEF0SXRzRW50cnkgPSBmYWxzZTtcbiAgICAgICAgaG9wcy5wdXNoKHsgc3ViZmxvd0lkIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHdhaXRpbmcgPSBxdWV1ZXNbaSArIDFdPy5wYXVzZXM7XG4gICAgICBob3BzLnB1c2goe1xuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIC4uLihzZWVkICE9PSB1bmRlZmluZWQgJiYgeyBzZWVkIH0pLFxuICAgICAgICBlbnRyeTogZW50cnlBdChpICsgMSksXG4gICAgICAgIC4uLih3YWl0aW5nICYmIHsgcGVuZGluZ1BhdXNlczogd2FpdGluZyB9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBFdmVyeSBsZXZlbCBlbnRlcmVkIGF0IGl0cyBlbnRyeTogb25lIGV4ZWN1dGlvbiAodGhlIG1vdW50KSBwZXIgbGV2ZWxcbiAgICAvLyBydW5zIGJlZm9yZSB0aGUgc3RhbmQtaW4uXG4gICAgcmV0dXJuIG5ldyBSZXN1bWVFbnRyeShlbnRyeUF0KDApLCBob3BzLCBxdWV1ZXNbMF0/LnBhdXNlcywgZXZlcnlMZXZlbEF0SXRzRW50cnkgPyBwYXRoLmxlbmd0aCA6IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQSBzZWVkLW9ubHkgZW50cnk6IGVhY2ggY2FwdHVyZSBzZWVkcyB0aGUgRklSU1QgZW50cnkgaW50byBpdHMgc3ViZmxvdyxcbiAgICogd2hpY2ggdGhlbiBzdGFydHMgYXQgaXRzIG93biByb290LiBQYXNzIGl0IGV4cGxpY2l0bHkgYXMgYHJlc3VtZWAgdG9cbiAgICogVHJhdmVyc2VyT3B0aW9ucyBvciBIYW5kbGVyRGVwcyDigJQgdGhlIHNhbWUgb25lLXNob3QgbGF3LCB3aXRob3V0IGFcbiAgICogc3RhbmQtaW4gb3IgYSBwYXRoLiBQcmVmZXIgYHBsYW5gIHdoZW4gcmVzdW1pbmcgYSBjaGVja3BvaW50LlxuICAgKi9cbiAgc3RhdGljIGZyb21DYXB0dXJlczxUT3V0LCBUU2NvcGU+KGNhcHR1cmVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gbmV3IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT4oXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBPYmplY3QuZW50cmllcyhjYXB0dXJlcykubWFwKChbc3ViZmxvd0lkLCBzZWVkXSkgPT4gKHsgc3ViZmxvd0lkLCBzZWVkIH0pKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZS1lbnRyeSBpbnRvIGBzdWJmbG93SWRgLCB0YWtlbiDigJQgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGVudHJ5IGlzXG4gICAqIGFuIG9yZGluYXJ5IG9uZSAodGhlIHN1YmZsb3cgaXMgb2ZmIHRoZSBwYXVzZSBwYXRoLCBvciBpdHMgaG9wIHdhcyBhbHJlYWR5XG4gICAqIHRha2VuKS4gT05FLVNIT1Q6IGEgaG9wIGlzIHJldHVybmVkIGF0IG1vc3Qgb25jZSwgc28gYSBzZWNvbmQgZW50cnkgaW50b1xuICAgKiB0aGUgc2FtZSBzdWJmbG93IChhIGxvb3AgcGFzc2luZyBpdHMgbW91bnQgYWdhaW4pIHJ1bnMgdGhlIHJlYWwgc3ViZmxvd1xuICAgKiBmcm9tIGl0cyByZWFsIHJvb3Qgd2l0aCBpdHMgaW5wdXRNYXBwZXIuXG4gICAqL1xuICBlbnRlclN1YmZsb3coc3ViZmxvd0lkOiBzdHJpbmcpOiBSZXN1bWVIb3A8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaG9wID0gdGhpcy5wZW5kaW5nLmdldChzdWJmbG93SWQpO1xuICAgIGlmIChob3AgIT09IHVuZGVmaW5lZCkgdGhpcy5wZW5kaW5nLmRlbGV0ZShzdWJmbG93SWQpO1xuICAgIHJldHVybiBob3A7XG4gIH1cblxuICAvKiogYHRydWVgIG9uY2UgZXZlcnkgaG9wIGhhcyBiZWVuIHRha2VuIOKAlCB0aGUgcmVzdCBvZiB0aGUgcnVuIGlzIG9yZGluYXJ5LiAqL1xuICBnZXQgc3BlbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZy5zaXplID09PSAwO1xuICB9XG59XG5cbi8vIOKUgOKUgCBSYWlzaW5nIGEgd2FpdGluZyBzaWJsaW5nJ3MgcGF1c2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUXVldWUgYHF1ZXVlYCBiZWhpbmQgYSBwYXVzZSBwYXNzaW5nIHRocm91Z2ggaXRzIGxldmVsOiBhIHBhdXNlIHJhaXNlZFxuICogd2hpbGUgc2libGluZ3Mgc3RpbGwgd2FpdCBtdXN0IGNhcnJ5IHRoZW0gdG8gaXRzIGNoZWNrcG9pbnQuIEVhY2ggcGF0aCBpc1xuICogY3V0IHRvIHRoYXQgbGV2ZWwg4oCUIHRoZSBidWJibGUtdXAgcHJlcGVuZHMgdGhlIGxldmVscyBhYm92ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXVlQmVoaW5kKHNpZ25hbDogUGF1c2VTaWduYWwsIHF1ZXVlOiByZWFkb25seSBRdWV1ZWRQYXVzZVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgeyBwYXVzZSwgbGV2ZWwgfSBvZiBxdWV1ZSkge1xuICAgIHNpZ25hbC5hZGRQZW5kaW5nUGF1c2UoeyAuLi5wYXVzZSwgc3ViZmxvd1BhdGg6IHBhdXNlLnN1YmZsb3dQYXRoLnNsaWNlKGxldmVsKSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBmaXJzdCB3YWl0aW5nIHNpYmxpbmcncyBwYXVzZSwgcmFpc2VkIGFnYWluIGF0IGl0cyBmYW4tb3V0J3MgbGV2ZWwg4oCUXG4gKiBleGFjdGx5IGFzIGl0IGJ1YmJsZWQgdXAgdG8gdGhhdCBsZXZlbCB0aGUgZmlyc3QgdGltZSAoaXRzIHN0YWdlLCBpdHNcbiAqIHF1ZXN0aW9uLCBpdHMgb3duIHN1YmZsb3cgY2FwdHVyZXMpLCBub3RoaW5nIHJlLXJ1bjsgdGhlIHJlc3Qgb2YgdGhlIHF1ZXVlXG4gKiB3YWl0cyBiZWhpbmQgaXQuIFRoZSBzdWJmbG93cyBBQk9WRSB0aGUgZmFuLW91dCBjYXB0dXJlIHRoZW1zZWx2ZXMgYWZyZXNoXG4gKiBhcyBpdCBidWJibGVzIHVwLCBzbyB0aGV5IGNhcnJ5IHdoYXQgdGhlIHJlc3VtZWQgY2hpbGQgd3JvdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYWlzZVF1ZXVlZFBhdXNlKHF1ZXVlOiByZWFkb25seSBRdWV1ZWRQYXVzZVtdKTogUGF1c2VTaWduYWwge1xuICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gcXVldWU7XG4gIGNvbnN0IHsgcGF1c2UsIGxldmVsIH0gPSBmaXJzdDtcbiAgY29uc3Qgc2lnbmFsID0gbmV3IFBhdXNlU2lnbmFsKHBhdXNlLnBhdXNlRGF0YSwgcGF1c2UucGF1c2VkU3RhZ2VJZCwgcGF1c2UucGF1c2VkQnkpO1xuICAvLyBUaGUgc2libGluZyBwYXVzZWQgaW4gYW4gRUFSTElFUiBydW46IGl0cyBvd24gZXhlY3V0aW9uLCBub3QgdGhpcyBydW4ncy5cbiAgaWYgKGlzUGF1c2VkRXhlY3V0aW9uKHBhdXNlLnBhdXNlZEV4ZWN1dGlvbikpIHtcbiAgICBzaWduYWwuc3RhbXBFeGVjdXRpb24ocGF1c2UucGF1c2VkRXhlY3V0aW9uLnJ1bnRpbWVTdGFnZUlkLCBwYXVzZS5wYXVzZWRFeGVjdXRpb24ucnVuSWQpO1xuICB9XG4gIC8vIOKApmFuZCB0aGUga2V5IGl0IHJhbiB1bmRlciAoUDMpLCBzbyBpdHMgb3duIHJlc3VtZSByZS1ydW5zIHVuZGVyIHRoZSBzYW1lIGtleS5cbiAgc2lnbmFsLnN0YW1wSWRlbXBvdGVuY3lLZXkocGF1c2UuaWRlbXBvdGVuY3lLZXkpO1xuICBjb25zdCBiZWxvdyA9IHBhdXNlLnN1YmZsb3dQYXRoLnNsaWNlKGxldmVsKTtcbiAgZm9yIChsZXQgaSA9IGJlbG93Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBvd25FbnRyeShwYXVzZS5zdWJmbG93U3RhdGVzLCBiZWxvd1tpXSk7XG4gICAgaWYgKHN0YXRlICE9PSB1bmRlZmluZWQpIHNpZ25hbC5jYXB0dXJlU3ViZmxvd1Njb3BlKGJlbG93W2ldLCBzdGF0ZSk7XG4gICAgc2lnbmFsLnByZXBlbmRTdWJmbG93KGJlbG93W2ldKTtcbiAgfVxuICBxdWV1ZUJlaGluZChzaWduYWwsIHJlc3QpO1xuICByZXR1cm4gc2lnbmFsO1xufVxuXG4vLyDilIDilIAgUmVhZGluZyB0aGUgY2hhcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhlIG5vZGUgdGhhdCBtb3VudHMgYHN1YmZsb3dJZGAsIGZvdW5kIGJ5IERGUyBmcm9tIGBzdGFydGAgb3ZlciBgbmV4dGAgYW5kXG4gKiBgY2hpbGRyZW5gIChsb29wLXJlZiBzdHVicyBza2lwcGVkIOKAlCB0aGV5IHNoYXJlIHRoZWlyIHRhcmdldCdzIGlkIGFuZCBjYXJyeVxuICogbm90aGluZykuIEN5Y2xlLXNhZmUgKHZpc2l0ZWQgYnkgaWRlbnRpdHksIHNvIGFuIGFic2VudCBpZCB0ZXJtaW5hdGVzIHRvbyk7XG4gKiBmaXJzdCBtYXRjaCBpbiBERlMgcHJlLW9yZGVyIChjaGlsZHJlbiBiZWZvcmUgYG5leHRgLCBsaWtlIHRoZSBidWlsZGVyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRNb3VudDxUT3V0LCBUU2NvcGU+KFxuICBzdGFydDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIHN1YmZsb3dJZDogc3RyaW5nLFxuKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgZGlzcGF0Y2hlckluZGV4KHN0YXJ0KS5rZXlzKCkpIHtcbiAgICBpZiAobm9kZS5zdWJmbG93SWQgPT09IHN1YmZsb3dJZCkgcmV0dXJuIG5vZGU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBFdmVyeSByZWFsIG5vZGUgb2Ygb25lIGxldmVsJ3MgZ3JhcGgsIGluIERGUyBwcmUtb3JkZXIsIG1hcHBlZCB0byB0aGVcbiAqIERJU1BBVENIRVIgd2hvc2UgY2hpbGQtY2hhaW4gaG9sZHMgaXQg4oCUIHRoZSBub2RlIHdob3NlIGBjaGlsZHJlbmAgaXRcbiAqIGRlc2NlbmRzIGZyb20gKGEgZGVjaWRlciwgYSBzZWxlY3RvciwgYSBmb3JrKSDigJQgb3IgYHVuZGVmaW5lZGAgZm9yIGEgbm9kZVxuICogb24gdGhlIGxldmVsJ3Mgb3duIHNwaW5lLiBMb29wIHN0dWJzIGFyZSBza2lwcGVkOyB2aXNpdGVkIGJ5IGlkZW50aXR5LCBzb1xuICogdHdvIG1vdW50cyBzaGFyaW5nIGFuIGlkIGFyZSBib3RoIGluZGV4ZWQgYW5kIGEgY3ljbGUgdGVybWluYXRlcy5cbiAqL1xuZnVuY3Rpb24gZGlzcGF0Y2hlckluZGV4PFRPdXQsIFRTY29wZT4oXG4gIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuKTogTWFwPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBpbmRleCA9IG5ldyBNYXA8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPigpO1xuICBjb25zdCBzdGFjazogQXJyYXk8W1N0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZF0+ID0gW1tyb290LCB1bmRlZmluZWRdXTtcbiAgZm9yIChsZXQgdG9wID0gc3RhY2sucG9wKCk7IHRvcCAhPT0gdW5kZWZpbmVkOyB0b3AgPSBzdGFjay5wb3AoKSkge1xuICAgIGNvbnN0IFtub2RlLCBkaXNwYXRjaGVyXSA9IHRvcDtcbiAgICBpZiAobm9kZS5pc0xvb3BSZWYgfHwgaW5kZXguaGFzKG5vZGUpKSBjb250aW51ZTtcbiAgICBpbmRleC5zZXQobm9kZSwgZGlzcGF0Y2hlcik7XG4gICAgLy8gTElGTzogcHVzaCBgbmV4dGAgZmlyc3QgYW5kIGNoaWxkcmVuIHJldmVyc2VkLCBzbyBjaGlsZHJlbiBhcmUgdmlzaXRlZFxuICAgIC8vIGJlZm9yZSBgbmV4dGAgYW5kIHRoZSBmaXJzdCBjaGlsZCBmaXJzdCDigJQgcHJlLW9yZGVyLCBsaWtlIHRoZSBidWlsZGVyLlxuICAgIGlmIChub2RlLm5leHQpIHN0YWNrLnB1c2goW25vZGUubmV4dCwgZGlzcGF0Y2hlcl0pO1xuICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGxldCBpID0gbm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgc3RhY2sucHVzaChbbm9kZS5jaGlsZHJlbltpXSwgbm9kZV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbi8qKiBPbmUgcGxhbidzIHZpZXcgb2YgdGhlIGNoYXJ0OiBlYWNoIGxldmVsJ3MgaW5kZXggYnVpbHQgb25jZS4gKi9cbmNsYXNzIENoYXJ0SW5kZXg8VE91dCwgVFNjb3BlPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kZXhlcyA9IG5ldyBNYXA8XG4gICAgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgTWFwPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZD5cbiAgPigpO1xuXG4gIHByaXZhdGUgb2Yocm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pIHtcbiAgICBsZXQgaW5kZXggPSB0aGlzLmluZGV4ZXMuZ2V0KHJvb3QpO1xuICAgIGlmICghaW5kZXgpIHtcbiAgICAgIGluZGV4ID0gZGlzcGF0Y2hlckluZGV4KHJvb3QpO1xuICAgICAgdGhpcy5pbmRleGVzLnNldChyb290LCBpbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKiBFdmVyeSBtb3VudCBvZiBgc3ViZmxvd0lkYCBpbiBgcm9vdGAncyBncmFwaCwgaW4gREZTIHByZS1vcmRlci4gKi9cbiAgbW91bnRzT2Yocm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHN1YmZsb3dJZDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLm9mKHJvb3QpLmtleXMoKV0uZmlsdGVyKChub2RlKSA9PiBub2RlLnN1YmZsb3dJZCA9PT0gc3ViZmxvd0lkKTtcbiAgfVxuXG4gIC8qKiBUaGUgb25lIG1vdW50IG9mIGBzdWJmbG93SWRgIGluIGByb290YCdzIGdyYXBoIOKAlCByZWZ1c2VkIHdoZW4gYWJzZW50IG9yIGFtYmlndW91cy4gKi9cbiAgb25seU1vdW50KHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBzdWJmbG93SWQ6IHN0cmluZywgZ3JhcGhOYW1lOiBzdHJpbmcpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgZm91bmQgPSB0aGlzLm1vdW50c09mKHJvb3QsIHN1YmZsb3dJZCk7XG4gICAgaWYgKGZvdW5kLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogdGhlIG1vdW50IG9mIHN1YmZsb3cgJyR7c3ViZmxvd0lkfScgaXMgbm90IHJlYWNoYWJsZSBmcm9tICR7Z3JhcGhOYW1lfS4gYCArXG4gICAgICAgICAgXCJUaGUgY2hlY2twb2ludCdzIHN1YmZsb3dQYXRoIGRvZXMgbm90IG1hdGNoIHRoaXMgY2hhcnQg4oCUIGl0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZm91bmQubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogc3ViZmxvdyAnJHtzdWJmbG93SWR9JyBpcyBtb3VudGVkIG1vcmUgdGhhbiBvbmNlIGluICR7Z3JhcGhOYW1lfSBgICtcbiAgICAgICAgICBgKCR7Zm91bmQubWFwKChub2RlKSA9PiBgJyR7bm9kZS5uYW1lfSdgKS5qb2luKCcsICcpfSksIGFuZCBhIGNoZWNrcG9pbnQncyBzdWJmbG93UGF0aCBjYW5ub3Qgc2F5IHdoaWNoIGAgK1xuICAgICAgICAgICdtb3VudCBwYXVzZWQuIEdpdmUgZWFjaCBtb3VudCBpdHMgb3duIHN1YmZsb3cgaWQgdG8gbWFrZSBhIHBhdXNlIGluc2lkZSBpdCByZXN1bWFibGUuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmb3VuZFswXTtcbiAgfVxuXG4gIC8qKiBUaGUgcmVhbCBzdGFnZSBgaWRgIGluIGByb290YCdzIGdyYXBoIChmaXJzdCBpbiBERlMgcHJlLW9yZGVyKSwgaWYgYW55LiAqL1xuICBzdGFnZShyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgaWQ6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy5vZihyb290KS5rZXlzKCkpIGlmIChub2RlLmlkID09PSBpZCkgcmV0dXJuIG5vZGU7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBUaGUgZGlzcGF0Y2hlciB3aG9zZSBjaGlsZC1jaGFpbiBob2xkcyBgbm9kZWAgaW4gYHJvb3RgJ3MgZ3JhcGggKGB1bmRlZmluZWRgIG9uIHRoZSBzcGluZSkuICovXG4gIGRpc3BhdGNoZXJPZihyb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub2Yocm9vdCkuZ2V0KG5vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvbmUtc2hvdCBlbnRyeSBmb3IgYGNoaWxkYCAoYSBtb3VudCBvbiB0aGUgcGF0aCwgb3IgdGhlIHBhdXNlZCBzdGFnZSlcbiAgICogaW4gYHJvb3RgJ3MgZ3JhcGg6IGByZXBsYWNlbWVudGAgKHRoZSBub2RlIHRoYXQgcnVucyDigJQgdGhlIG1vdW50IGl0c2VsZixcbiAgICogb3IgdGhlIHN0YW5kLWluKSB3aXRoIHdoYXQgcmFuIGFmdGVyIGBjaGlsZGAncyBjaGFpbiBvbiB0aGUgb3JpZ2luYWwgcnVuXG4gICAqIGF0dGFjaGVkIHdoZXJlIHRoYXQgY2hhaW4gZW5kcyDigJQgYHsgLi4uY2hpbGQsIG5leHQ6IGRpc3BhdGNoZXIubmV4dCB9YCBmb3JcbiAgICogYSBjaGFydCB0aGUgYnVpbGRlciBtYWRlOlxuICAgKlxuICAgKiAgIOKAoiBvbiB0aGUgbGV2ZWwncyBzcGluZTogbm90aGluZyB0byBhdHRhY2gg4oCUIHRoZSBzcGluZSBnb2VzIG9uIGJ5IGl0c2VsZjtcbiAgICogICDigKIgYSBERUNJREVSJ3Mgb3IgU0VMRUNUT1IncyBicmFuY2g6IHRoZSBkaXNwYXRjaGVyJ3MgYG5leHRgO1xuICAgKiAgIOKAoiBhIEZPUksgY2hpbGQ6IHRoZSBmb3JrJ3MgYG5leHRgIOKAlCBpdHMgam9pbi5cbiAgICpcbiAgICogUGFzdCBhIGRpc3BhdGNoZXIgd2l0aCBubyBgbmV4dGAsIHRoZSB3YWxrIGdvZXMgb24gT1VUV0FSRCB0byB0aGUgb25lXG4gICAqIGVuY2xvc2luZyBpdC4gSXQgc3RvcHMgYXQgYHN0b3BBdGAg4oCUIHRoZSBmYW4tb3V0IHdoZXJlIHNpYmxpbmdzIHN0aWxsXG4gICAqIHdhaXQsIHdob3NlIGpvaW4gbXVzdCBub3QgcnVuIHlldC4gTm90aGluZyB0byBhdHRhY2g6IGByZXBsYWNlbWVudGBcbiAgICogaXRzZWxmLlxuICAgKi9cbiAgZW50cnkoXG4gICAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY2hpbGQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHJlcGxhY2VtZW50OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdG9wQXQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkLFxuICApOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIGFwcGVuZEF0Q2hhaW5FbmQocmVwbGFjZW1lbnQsIHRoaXMuYWZ0ZXIocm9vdCwgY2hpbGQsIHN0b3BBdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgcnVucyBvbmNlIGBub2RlYCdzIGNoYWluIGVuZHM6IGl0cyBkaXNwYXRjaGVyJ3MgYG5leHRgIGNoYWluLCB0aGVuIOKAlFxuICAgKiB3aGVyZSBUSEFUIGVuZHMg4oCUIHRoZSBjb250aW51YXRpb24gb2YgdGhlIGRpc3BhdGNoZXIgZW5jbG9zaW5nIGl0LCBvdXR3YXJkLFxuICAgKiB1cCB0byBgc3RvcEF0YCAoZXhjbHVzaXZlKS4gYHVuZGVmaW5lZGAgb24gdGhlIHNwaW5lLlxuICAgKi9cbiAgcHJpdmF0ZSBhZnRlcihcbiAgICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdG9wQXQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkLFxuICApOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXMuZGlzcGF0Y2hlck9mKHJvb3QsIG5vZGUpO1xuICAgIGlmIChkaXNwYXRjaGVyID09PSB1bmRlZmluZWQgfHwgZGlzcGF0Y2hlciA9PT0gc3RvcEF0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG91dGVyID0gdGhpcy5hZnRlcihyb290LCBkaXNwYXRjaGVyLCBzdG9wQXQpO1xuICAgIHJldHVybiBkaXNwYXRjaGVyLm5leHQgPyBhcHBlbmRBdENoYWluRW5kKGRpc3BhdGNoZXIubmV4dCwgb3V0ZXIpIDogb3V0ZXI7XG4gIH1cbn1cblxuLyoqXG4gKiBgc3RhcnRgJ3MgY2hhaW4gd2l0aCBgYWZ0ZXJgIGF0dGFjaGVkIHdoZXJlIGl0IGVuZHMg4oCUIHRoZSBjaGFpbidzIG5vZGVzXG4gKiBjb3BpZWQgb24gdGhlIHdheSAobmV2ZXIgcmVnaXN0ZXJlZCBhbnl3aGVyZTogaWRzIHN0aWxsIHJlc29sdmUgdG8gdGhlIHJlYWxcbiAqIG5vZGVzKS4gQSBjaGFpbiB0aGF0IGVuZHMgaW4gYSBsb29wIHN0dWIgKG9yIGxvb3BzIGJhY2sgb24gaXRzZWxmKSBpc1xuICogcmV0dXJuZWQgYXMgaXM6IGNvbnRyb2wgbGVhdmVzIGl0IHRocm91Z2ggdGhlIGxvb3AsIG5ldmVyIFwiYWZ0ZXJcIiBpdC5cbiAqL1xuZnVuY3Rpb24gYXBwZW5kQXRDaGFpbkVuZDxUT3V0LCBUU2NvcGU+KFxuICBzdGFydDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIGFmdGVyOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCxcbik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgaWYgKGFmdGVyID09PSB1bmRlZmluZWQpIHJldHVybiBzdGFydDtcbiAgY29uc3QgY2hhaW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gIGZvciAobGV0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkID0gc3RhcnQ7IG5vZGUgIT09IHVuZGVmaW5lZDsgbm9kZSA9IG5vZGUubmV4dCkge1xuICAgIGlmIChub2RlLmlzTG9vcFJlZiB8fCBzZWVuLmhhcyhub2RlKSkgcmV0dXJuIHN0YXJ0O1xuICAgIHNlZW4uYWRkKG5vZGUpO1xuICAgIGNoYWluLnB1c2gobm9kZSk7XG4gIH1cbiAgbGV0IG5leHQgPSBhZnRlcjtcbiAgZm9yIChsZXQgaSA9IGNoYWluLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBuZXh0ID0geyAuLi5jaGFpbltpXSwgbmV4dCB9O1xuICByZXR1cm4gbmV4dDtcbn1cblxuLy8g4pSA4pSAIFdhaXRpbmcgc2libGluZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBUaGUgc2libGluZyBwYXVzZXMgd2FpdGluZyBhdCBvbmUgbGV2ZWwsIGFuZCB0aGUgZmFuLW91dCB0aGV5IHdhaXQgaW4uICovXG5pbnRlcmZhY2UgTGV2ZWxRdWV1ZTxUT3V0LCBUU2NvcGU+IHtcbiAgcmVhZG9ubHkgZmFuT3V0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcmVhZG9ubHkgcGF1c2VzOiBRdWV1ZWRQYXVzZVtdO1xufVxuXG4vKipcbiAqIFBsYWNlIGBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNgIChkZWNvZGVkIOKAlCBgcGF1c2UvcmVjb3JkLnRzYCkgYW5kIHF1ZXVlIGVhY2ggYXQgdGhlXG4gKiBsZXZlbCBvZiBpdHMgZmFuLW91dDogdGhlIGRlcHRoIHdoZXJlIGl0cyBwYXRoIHBhcnRzIGZyb20gdGhlIHBhdXNlZFxuICogc3RhZ2Uncy4gVGhlcmUsIHRoZSBwYXVzZWQgc3RhZ2UncyBjaGlsZCAoYSBtb3VudCBvbiB0aGUgcGF0aCwgb3IgdGhlIHN0YWdlXG4gKiBpdHNlbGYpIGFuZCB0aGUgc2libGluZydzIG11c3QgYm90aCBoYW5nIG9mZiBPTkUgcGFyYWxsZWwgZGlzcGF0Y2hlciDigJQgYVxuICogZm9yayBvciBhIHNlbGVjdG9yIOKAlCBvciB0aGUgcmVjb3JkIGlzIG5vdCBhIHNpYmxpbmcgYW5kIHRoZSByZXN1bWUgaXNcbiAqIHJlZnVzZWQgcmF0aGVyIHRoYW4gYXNrZWQgYSBxdWVzdGlvbiB0aGUgY2hhcnQgY291bGQgbm90IGhhdmUgcmFpc2VkLlxuICovXG5mdW5jdGlvbiBxdWV1ZVNpYmxpbmdQYXVzZXM8VE91dCwgVFNjb3BlPihcbiAgcGVuZGluZzogcmVhZG9ubHkgUGVuZGluZ1BhdXNlW10gfCB1bmRlZmluZWQsXG4gIGF0OiB7XG4gICAgY2hhcnQ6IENoYXJ0SW5kZXg8VE91dCwgVFNjb3BlPjtcbiAgICBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZDtcbiAgICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICBwYXRoOiByZWFkb25seSBzdHJpbmdbXTtcbiAgICBncmFwaHM6IHJlYWRvbmx5IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W107XG4gICAgbW91bnRzOiByZWFkb25seSBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAgIHBhdXNlZDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gIH0sXG4pOiBBcnJheTxMZXZlbFF1ZXVlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcXVldWVzOiBBcnJheTxMZXZlbFF1ZXVlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+ID0gW107XG4gIGlmIChwZW5kaW5nID09PSB1bmRlZmluZWQpIHJldHVybiBxdWV1ZXM7XG4gIC8vIFRoZSBjb2RlYydzIGNoZWNrIChgcGF1c2UvcmVjb3JkLnRzYCkg4oCUIGBwbGFuYCBpcyBhIHB1YmxpYyBkb29yIHRvbywgc28gaXRcbiAgLy8gbmV2ZXIgdGFrZXMgYSBzaWJsaW5nIHJlY29yZCB1bmNoZWNrZWQsIGhvd2V2ZXIgaXQgd2FzIGhhbmRlZCBvbmUuXG4gIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVQZW5kaW5nUGF1c2VzKHBlbmRpbmcpO1xuICBjb25zdCB7IGNoYXJ0LCBzdWJmbG93cywgcm9vdCwgcGF0aCwgZ3JhcGhzLCBtb3VudHMsIHBhdXNlZCB9ID0gYXQ7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBFYWNoIHJlY29yZCdzIEZJRUxEUyBhcmUgY2hlY2tlZCBhYm92ZTsgaGVyZSBpdCBpcyBhc2tlZCB3aGV0aGVyIHRoZVxuICAvLyByZWNvcmQgZml0cyBUSElTIGNoYXJ0LlxuICBkZWNvZGVkLmZvckVhY2goKHBhdXNlLCBuKSA9PiB7XG4gICAgLy8gT25lIHJlY29yZCBwZXIgcGF1c2VkIHNpYmxpbmc6IGEgcmVwZWF0IHdvdWxkIGFzayB0aGUgc2FtZSBxdWVzdGlvbiB0d2ljZS5cbiAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbcGF1c2Uuc3ViZmxvd1BhdGgsIHBhdXNlLnBhdXNlZFN0YWdlSWRdKTtcbiAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzWyR7bn1dICgnJHtwYXVzZS5wYXVzZWRTdGFnZUlkfScpIHJlcGVhdHMgYW4gZWFybGllciBlbnRyeS5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgc2Vlbi5hZGQoa2V5KTtcbiAgICBsZXQgbGV2ZWwgPSAwO1xuICAgIHdoaWxlIChsZXZlbCA8IHBhdGgubGVuZ3RoICYmIGxldmVsIDwgcGF1c2Uuc3ViZmxvd1BhdGgubGVuZ3RoICYmIHBhdGhbbGV2ZWxdID09PSBwYXVzZS5zdWJmbG93UGF0aFtsZXZlbF0pIGxldmVsKys7XG4gICAgY29uc3QgZ3JhcGggPSBncmFwaHNbbGV2ZWxdO1xuICAgIGNvbnN0IG91cnMgPSBsZXZlbCA8IHBhdGgubGVuZ3RoID8gbW91bnRzW2xldmVsXSA6IHBhdXNlZDtcbiAgICBjb25zdCB0aGVpck1vdW50cyA9IGxldmVsIDwgcGF1c2Uuc3ViZmxvd1BhdGgubGVuZ3RoID8gY2hhcnQubW91bnRzT2YoZ3JhcGgsIHBhdXNlLnN1YmZsb3dQYXRoW2xldmVsXSkgOiBbXTtcbiAgICBjb25zdCB0aGVpcnMgPVxuICAgICAgbGV2ZWwgPCBwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGhcbiAgICAgICAgPyB0aGVpck1vdW50cy5sZW5ndGggPT09IDFcbiAgICAgICAgICA/IHRoZWlyTW91bnRzWzBdXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgOiBjaGFydC5zdGFnZShncmFwaCwgcGF1c2UucGF1c2VkU3RhZ2VJZCk7XG4gICAgY29uc3QgZmFuT3V0ID0gb3VycyA/IGNoYXJ0LmRpc3BhdGNoZXJPZihncmFwaCwgb3VycykgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNTaWJsaW5nID1cbiAgICAgIG91cnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhlaXJzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG91cnMgIT09IHRoZWlycyAmJlxuICAgICAgZmFuT3V0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGNoYXJ0LmRpc3BhdGNoZXJPZihncmFwaCwgdGhlaXJzKSA9PT0gZmFuT3V0ICYmXG4gICAgICAhZmFuT3V0LmRlY2lkZXJGbiAmJlxuICAgICAgKHF1ZXVlc1tsZXZlbF0gPT09IHVuZGVmaW5lZCB8fCBxdWV1ZXNbbGV2ZWxdIS5mYW5PdXQgPT09IGZhbk91dCk7XG4gICAgaWYgKCFpc1NpYmxpbmcgfHwgIXdhbGtzVG9JdHNTdGFnZShjaGFydCwgc3ViZmxvd3MsIGdyYXBoLCBwYXVzZSwgbGV2ZWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNbJHtufV0gKCcke3BhdXNlLnBhdXNlZFN0YWdlSWR9JykgaXMgbm90IGEgcGFyYWxsZWwgc2libGluZyBvZiBgICtcbiAgICAgICAgICBgdGhlIHBhdXNlZCBzdGFnZSAnJHtwYXVzZWQ/LmlkID8/ICc/J30nIGluIHRoaXMgY2hhcnQg4oCUIG5vIGZvcmsgb3Igc2VsZWN0b3IgcnVucyB0aGVtIGJvdGgsIG9yIGl0cyBgICtcbiAgICAgICAgICAncGF0aCBkb2VzIG5vdCBsZWFkIHRvIHRoYXQgc3RhZ2UuIFRoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBsZWFmUm9vdCA9XG4gICAgICBwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGggPT09IDAgPyByb290IDogb3duRW50cnkoc3ViZmxvd3MsIHBhdXNlLnN1YmZsb3dQYXRoW3BhdXNlLnN1YmZsb3dQYXRoLmxlbmd0aCAtIDFdKT8ucm9vdDtcbiAgICBjb25zdCBzdGFnZU5hbWUgPSAobGVhZlJvb3QgJiYgY2hhcnQuc3RhZ2UobGVhZlJvb3QsIHBhdXNlLnBhdXNlZFN0YWdlSWQpPy5uYW1lKSA/PyBwYXVzZS5wYXVzZWRTdGFnZUlkO1xuICAgIGNvbnN0IHF1ZXVlID0gKHF1ZXVlc1tsZXZlbF0gPz89IHsgZmFuT3V0OiBmYW5PdXQhLCBwYXVzZXM6IFtdIH0pO1xuICAgIHF1ZXVlLnBhdXNlcy5wdXNoKHsgcGF1c2UsIGxldmVsLCBzdGFnZU5hbWUgfSk7XG4gIH0pO1xuICByZXR1cm4gcXVldWVzO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSB3YWl0aW5nIHNpYmxpbmcncyBXSE9MRSBwYXRoIGJlbG93IGl0cyBmYW4tb3V0IHdhbGtzIHRoaXMgY2hhcnQ6XG4gKiBldmVyeSBzZWdtZW50IHRoZSBvbmx5IG1vdW50IG9mIGl0cyBzdWJmbG93IGluIHRoZSBlbmNsb3NpbmcgZ3JhcGgsIGV2ZXJ5XG4gKiBzdWJmbG93IHJlZ2lzdGVyZWQsIGFuZCB0aGUgcGF1c2VkIHN0YWdlIGluIHRoZSBsYXN0IGdyYXBoIOKAlCBjaGVja2VkIGF0XG4gKiB0aGUgRklSU1QgcmVzdW1lLCBzbyBhIHRhbXBlcmVkIHJlY29yZCBpcyByZWZ1c2VkIHVwIGZyb250LCBub3Qgd2hlbiBpdHNcbiAqIHR1cm4gY29tZXMuXG4gKi9cbmZ1bmN0aW9uIHdhbGtzVG9JdHNTdGFnZTxUT3V0LCBUU2NvcGU+KFxuICBjaGFydDogQ2hhcnRJbmRleDxUT3V0LCBUU2NvcGU+LFxuICBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZCxcbiAgZmFuT3V0R3JhcGg6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICBwYXVzZTogUGVuZGluZ1BhdXNlLFxuICBsZXZlbDogbnVtYmVyLFxuKTogYm9vbGVhbiB7XG4gIGxldCBncmFwaCA9IGZhbk91dEdyYXBoO1xuICBmb3IgKGxldCBpID0gbGV2ZWw7IGkgPCBwYXVzZS5zdWJmbG93UGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjaGFydC5tb3VudHNPZihncmFwaCwgcGF1c2Uuc3ViZmxvd1BhdGhbaV0pLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSBvd25FbnRyeShzdWJmbG93cywgcGF1c2Uuc3ViZmxvd1BhdGhbaV0pO1xuICAgIGlmICghZGVmaW5pdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIGdyYXBoID0gZGVmaW5pdGlvbi5yb290O1xuICB9XG4gIHJldHVybiBjaGFydC5zdGFnZShncmFwaCwgcGF1c2UucGF1c2VkU3RhZ2VJZCkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqIGByZWNvcmRba2V5XWAgb25seSB3aGVuIGl0IGlzIHRoZSByZWNvcmQncyBPV04gcHJvcGVydHkg4oCUIG5ldmVyIHRocm91Z2ggdGhlIHByb3RvdHlwZSBjaGFpbi4gKi9cbmZ1bmN0aW9uIG93bkVudHJ5PFQ+KHJlY29yZDogUmVjb3JkPHN0cmluZywgVD4gfCB1bmRlZmluZWQsIGtleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiByZWNvcmQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlY29yZCwga2V5KSA/IHJlY29yZFtrZXldIDogdW5kZWZpbmVkO1xufVxuIl19
@@ -9,8 +9,8 @@
9
9
  import { DECISION_RESULT } from '../../decide/types.js';
10
10
  import { isPauseSignal } from '../../pause/types.js';
11
11
  import { createBreakHandler } from './breakFlag.js';
12
- import { commitStage } from './commitStage.js';
13
- import { loggableStageError, recordStageError } from './stageError.js';
12
+ import { commitStage, commitStageWrites } from './commitStage.js';
13
+ import { captureStageFailure, loggableStageError, recordStageError } from './stageError.js';
14
14
  export class SelectorHandler {
15
15
  deps;
16
16
  childrenExecutor;
@@ -44,10 +44,11 @@ export class SelectorHandler {
44
44
  catch (error) {
45
45
  // PauseSignal is expected control flow — commit and re-throw without error logging.
46
46
  if (isPauseSignal(error)) {
47
- context.commit();
47
+ commitStageWrites(context);
48
48
  throw error;
49
49
  }
50
- context.commit();
50
+ captureStageFailure(context, error);
51
+ commitStageWrites(context);
51
52
  const served = recordStageError(context, error);
52
53
  this.deps.logger.error(`Error in pipeline (${branchPath}) stage [${node.name}]:`, {
53
54
  error: loggableStageError(context, error),
@@ -127,4 +128,4 @@ export class SelectorHandler {
127
128
  }
128
129
  }
129
130
  }
130
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0b3JIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU2VsZWN0b3JIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXJELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd2RSxNQUFNLE9BQU8sZUFBZTtJQUVQO0lBQ0E7SUFGbkIsWUFDbUIsSUFBK0IsRUFDL0IsZ0JBQWdEO1FBRGhELFNBQUksR0FBSixJQUFJLENBQTJCO1FBQy9CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBZ0M7SUFDaEUsQ0FBQztJQUVKOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQ3BCLElBQTZCLEVBQzdCLFNBQXNDLEVBQ3RDLE9BQXFCLEVBQ3JCLFNBQW9CLEVBQ3BCLFVBQThCLEVBQzlCLFFBQWtDLEVBQ2xDLFdBQXdDLEVBQ3hDLGdCQUFtQztRQUVuQyxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU5QyxJQUFJLFdBQXFCLENBQUM7UUFDMUIsSUFBSSxpQkFBZ0QsQ0FBQztRQUNyRCxJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUN4RiwrREFBK0Q7WUFDL0QsSUFDRSxXQUFXO2dCQUNYLE9B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akUsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQ3JDLElBQUksQ0FBQyxJQUFJLEVBQ1Qsb0JBQW9CLEVBQ3BCLFFBQVEsQ0FBQyxNQUFNLEVBQ2YsZ0JBQWdCLEVBQ2hCLGlCQUFpQixDQUNsQixDQUFDO1FBQ0Ysa0VBQWtFO1FBQ2xFLDZEQUE2RDtRQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFeEcsTUFBTSxRQUFRLEdBQTRCO1lBQ3hDLElBQUksRUFBRSxlQUFlO1lBQ3JCLEVBQUUsRUFBRSxlQUFlO1lBQ25CLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsOEVBQThFO1lBQzlFLDZFQUE2RTtZQUM3RSxnRkFBZ0Y7WUFDaEYsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3hCLENBQUM7UUFDRixJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUNwRCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFNBQVMsRUFDVCxVQUFVLEVBQ1YsZ0JBQWdCLENBQ2pCLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4Qix5REFBeUQ7WUFDekQsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRyxDQUFDLENBQUM7Z0JBQzNCLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VsZWN0b3JIYW5kbGVyIOKAlCBNdWx0aS1jaG9pY2UgZmlsdGVyZWQgZmFuLW91dC5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBFeGVjdXRlIHNjb3BlLWJhc2VkIHNlbGVjdG9yIG5vZGVzIChzdGFnZSDihpIgY29tbWl0IOKGkiByZXNvbHZlIGNoaWxkcmVuIOKGkiBwYXJhbGxlbCBleGVjdXRpb24pXG4gKiAtIFRoZSBzZWxlY3RvciBmdW5jdGlvbiBJUyBhIHN0YWdlOiByZWFkcyBzY29wZSwgcmV0dXJucyBzdHJpbmdbXSBvZiBicmFuY2ggSURzXG4gKiAtIERlbGVnYXRlcyBwYXJhbGxlbCBleGVjdXRpb24gb2Ygc2VsZWN0ZWQgY2hpbGRyZW4gdG8gQ2hpbGRyZW5FeGVjdXRvclxuICovXG5cbmltcG9ydCB0eXBlIHsgU2VsZWN0aW9uRXZpZGVuY2UgfSBmcm9tICcuLi8uLi9kZWNpZGUvdHlwZXMuanMnO1xuaW1wb3J0IHsgREVDSVNJT05fUkVTVUxUIH0gZnJvbSAnLi4vLi4vZGVjaWRlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgSGFuZGxlckRlcHMsIE5vZGVSZXN1bHRUeXBlLCBTdGFnZUZ1bmN0aW9uIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlQnJlYWtIYW5kbGVyIH0gZnJvbSAnLi9icmVha0ZsYWcuanMnO1xuaW1wb3J0IHR5cGUgeyBDaGlsZHJlbkV4ZWN1dG9yIH0gZnJvbSAnLi9DaGlsZHJlbkV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGNvbW1pdFN0YWdlIH0gZnJvbSAnLi9jb21taXRTdGFnZS5qcyc7XG5pbXBvcnQgeyBsb2dnYWJsZVN0YWdlRXJyb3IsIHJlY29yZFN0YWdlRXJyb3IgfSBmcm9tICcuL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHR5cGUgeyBCcmVha0ZsYWcsIEV4ZWN1dGVOb2RlRm4sIFJ1blN0YWdlRm4gfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFNlbGVjdG9ySGFuZGxlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW5FeGVjdXRvcjogQ2hpbGRyZW5FeGVjdXRvcjxUT3V0LCBUU2NvcGU+LFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIHNjb3BlLWJhc2VkIHNlbGVjdG9yIG5vZGUgKGNyZWF0ZWQgdmlhIGFkZFNlbGVjdG9yRnVuY3Rpb24pLlxuICAgKiBUaGUgc3RhZ2UgZnVuY3Rpb24gSVMgdGhlIHNlbGVjdG9yIOKAlCBpdHMgcmV0dXJuIHZhbHVlIGNvbnRhaW5zIGJyYW5jaCBJRHMuXG4gICAqIEV4ZWN1dGlvbiBvcmRlcjogcnVuU3RhZ2UoZm4pIOKGkiBjb21taXQg4oaSIHJlc29sdmUgY2hpbGRyZW4g4oaSIHBhcmFsbGVsIGV4ZWN1dGUuXG4gICAqL1xuICBhc3luYyBoYW5kbGVTY29wZUJhc2VkKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0YWdlRnVuYzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcnVuU3RhZ2U6IFJ1blN0YWdlRm48VE91dCwgVFNjb3BlPixcbiAgICBleGVjdXRlTm9kZTogRXhlY3V0ZU5vZGVGbjxUT3V0LCBUU2NvcGU+LFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIE5vZGVSZXN1bHRUeXBlPiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGJyZWFrRm4gPSBjcmVhdGVCcmVha0hhbmRsZXIoYnJlYWtGbGFnKTtcblxuICAgIGxldCBzZWxlY3RlZElkczogc3RyaW5nW107XG4gICAgbGV0IHNlbGVjdGlvbkV2aWRlbmNlOiBTZWxlY3Rpb25FdmlkZW5jZSB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhZ2VPdXRwdXQgPSBhd2FpdCBydW5TdGFnZShub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgLy8gRGV0ZWN0IFNlbGVjdGlvblJlc3VsdCBmcm9tIHNlbGVjdCgpIGhlbHBlciB2aWEgU3ltYm9sIGJyYW5kXG4gICAgICBpZiAoXG4gICAgICAgIHN0YWdlT3V0cHV0ICYmXG4gICAgICAgIHR5cGVvZiBzdGFnZU91dHB1dCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgUmVmbGVjdC5oYXMoc3RhZ2VPdXRwdXQgYXMgb2JqZWN0LCBERUNJU0lPTl9SRVNVTFQpICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoKHN0YWdlT3V0cHV0IGFzIGFueSkuYnJhbmNoZXMpXG4gICAgICApIHtcbiAgICAgICAgc2VsZWN0ZWRJZHMgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5icmFuY2hlcztcbiAgICAgICAgc2VsZWN0aW9uRXZpZGVuY2UgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5ldmlkZW5jZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkSWRzID0gQXJyYXkuaXNBcnJheShzdGFnZU91dHB1dCkgPyBzdGFnZU91dHB1dC5tYXAoU3RyaW5nKSA6IFtTdHJpbmcoc3RhZ2VPdXRwdXQpXTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3cg4oCUIGNvbW1pdCBhbmQgcmUtdGhyb3cgd2l0aG91dCBlcnJvciBsb2dnaW5nLlxuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgIGNvbnN0IHNlcnZlZCA9IHJlY29yZFN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHtcbiAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25FcnJvcihub2RlLm5hbWUsIHNlcnZlZC5tZXNzYWdlLCBzZXJ2ZWQuc3RydWN0dXJlZEVycm9yLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGNvbW1pdFN0YWdlKGNvbnRleHQsIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3IsIG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAvLyBUaGUgc2VsZWN0b3IgY29tcGxldGVkLCBidXQgaXQgZGlkIG5vdCBzZWxlY3Qgb3IgZGlzcGF0Y2ggYnJhbmNoZXMuXG4gICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdzZWxlY3RvcicpO1xuICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCwgYnJlYWtGbGFnLnJlYXNvbik7XG4gICAgICAvLyBObyBicmFuY2hlcyByYW46IGRvIG5vdCBtYW51ZmFjdHVyZSBhIHJlc3VsdCBtYXAuIEluIGEgc3ViZmxvdyxcbiAgICAgIC8vIHVuZGVmaW5lZCBsZXRzIFN1YmZsb3dFeGVjdXRvciB1c2UgdGhlIHN0YWdlJ3MgY29tbWl0dGVkIHN0YXRlLlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb250ZXh0LmFkZExvZygnc2VsZWN0ZWRDaGlsZElkcycsIHNlbGVjdGVkSWRzKTtcbiAgICBjb250ZXh0LmFkZExvZygnc2VsZWN0b3JQYXR0ZXJuJywgJ3Njb3BlLWJhc2VkLW11bHRpLWNob2ljZScpO1xuXG4gICAgaWYgKHNlbGVjdGVkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGV4dC5hZGRMb2coJ3NraXBwZWRBbGxDaGlsZHJlbicsIHRydWUpO1xuICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzZWxlY3RlZCcsICdObyBjaGlsZHJlbiBzZWxlY3RlZCDigJQgc2tpcHBpbmcgYWxsIGJyYW5jaGVzLicsIHtcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHRhcmdldFN0YWdlOiBbXSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblNlbGVjdGVkKG5vZGUubmFtZSwgW10sIChub2RlLmNoaWxkcmVuID8/IFtdKS5sZW5ndGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgLy8gUHJvcG9zYWwgIzAwMzogZmlyZSBvblN0YWdlRXhlY3V0ZWQgZXZlbiBvbiB6ZXJvLXNlbGVjdCBwYXRoIOKAlFxuICAgICAgLy8gdGhlIHNlbGVjdG9yIERJRCBjb21wbGV0ZSAoaXQgcGlja2VkIG5vbmUpOyBjb25zdW1lcnMgdHJhY2tpbmdcbiAgICAgIC8vIHZpc2l0ZWQgbmVlZCB0aGUgc2lnbmFsLlxuICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQobm9kZS5uYW1lLCBub2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0LCAnc2VsZWN0b3InKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGNoaWxkcmVuIGJ5IG1hdGNoaW5nIHNlbGVjdGVkIElEcyBhZ2FpbnN0IG5vZGUuY2hpbGRyZW4uXG4gICAgLy8gTWF0Y2ggYnJhbmNoSWQgZmlyc3QgKG9yaWdpbmFsIHVucHJlZml4ZWQgSUQpLCBmYWxsIGJhY2sgdG8gaWQgZm9yIGJhY2t3YXJkIGNvbXBhdC5cbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4gYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXTtcbiAgICBjb25zdCBzZWxlY3RlZENoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKChjKSA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyhjLmJyYW5jaElkID8/IGMuaWQhKSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBhbGwgSURzIGV4aXN0IChmYWlsIGZhc3QpXG4gICAgaWYgKHNlbGVjdGVkQ2hpbGRyZW4ubGVuZ3RoICE9PSBzZWxlY3RlZElkcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNoaWxkSWRzID0gY2hpbGRyZW4ubWFwKChjKSA9PiBjLmJyYW5jaElkID8/IGMuaWQpO1xuICAgICAgY29uc3QgbWlzc2luZyA9IHNlbGVjdGVkSWRzLmZpbHRlcigoaWQpID0+ICFjaGlsZElkcy5pbmNsdWRlcyhpZCkpO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFNjb3BlLWJhc2VkIHNlbGVjdG9yICcke25vZGUubmFtZX0nIHJldHVybmVkIHVua25vd24gY2hpbGQgSURzOiAke21pc3Npbmcuam9pbihcbiAgICAgICAgJywgJyxcbiAgICAgICl9LiBBdmFpbGFibGU6ICR7Y2hpbGRJZHMuam9pbignLCAnKX1gO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIGNvbnRleHQuYWRkRXJyb3IoJ3NlbGVjdG9yRXJyb3InLCBlcnJvck1lc3NhZ2UpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2tpcHBlZElkcyA9IGNoaWxkcmVuXG4gICAgICAuZmlsdGVyKChjKSA9PiAhc2VsZWN0ZWRJZHMuaW5jbHVkZXMoYy5icmFuY2hJZCA/PyBjLmlkISkpXG4gICAgICAubWFwKChjKSA9PiBjLmJyYW5jaElkID8/IGMuaWQpO1xuICAgIGlmIChza2lwcGVkSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCdza2lwcGVkQ2hpbGRJZHMnLCBza2lwcGVkSWRzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZE5hbWVzID0gc2VsZWN0ZWRDaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSkuam9pbignLCAnKTtcbiAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgICAnc2VsZWN0ZWQnLFxuICAgICAgYFJ1bm5pbmcgJHtzZWxlY3RlZE5hbWVzfSAoJHtzZWxlY3RlZENoaWxkcmVuLmxlbmd0aH0gb2YgJHtjaGlsZHJlbi5sZW5ndGh9IG1hdGNoZWQpYCxcbiAgICAgIHsgY291bnQ6IHNlbGVjdGVkQ2hpbGRyZW4ubGVuZ3RoLCB0YXJnZXRTdGFnZTogc2VsZWN0ZWRDaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSkgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWREaXNwbGF5TmFtZXMgPSBzZWxlY3RlZENoaWxkcmVuLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU2VsZWN0ZWQoXG4gICAgICBub2RlLm5hbWUsXG4gICAgICBzZWxlY3RlZERpc3BsYXlOYW1lcyxcbiAgICAgIGNoaWxkcmVuLmxlbmd0aCxcbiAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICBzZWxlY3Rpb25FdmlkZW5jZSxcbiAgICApO1xuICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIEFGVEVSIHRoZSBzcGVjaWFsaXplZCBldmVudFxuICAgIC8vIHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiIHdvcmsgdW5pZm9ybWx5LlxuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKG5vZGUubmFtZSwgbm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgJ3NlbGVjdG9yJyk7XG5cbiAgICBjb25zdCB0ZW1wTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiAnc2VsZWN0b3ItdGVtcCcsXG4gICAgICBpZDogJ3NlbGVjdG9yLXRlbXAnLFxuICAgICAgY2hpbGRyZW46IHNlbGVjdGVkQ2hpbGRyZW4sXG4gICAgICAvLyBQcm9wYWdhdGUgdGhlIHNlbGVjdG9yJ3MgZmFuLW91dCBlcnJvciBtb2RlLiBXaXRob3V0IHRoaXMsIENoaWxkcmVuRXhlY3V0b3JcbiAgICAgIC8vIHJlYWRzIGB0ZW1wTm9kZS5mYWlsRmFzdGAgKHVuZGVmaW5lZCkgYW5kIGFsd2F5cyB1c2VzIFByb21pc2UuYWxsU2V0dGxlZCDigJRcbiAgICAgIC8vIHNpbGVudGx5IHN3YWxsb3dpbmcgYSByZXF1aXJlZCBicmFuY2gncyBlcnJvci4gU2VlIGJ1aWxkZXIgYGZhaWxGYXN0YCBvcHRpb24uXG4gICAgICBmYWlsRmFzdDogbm9kZS5mYWlsRmFzdCxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4oXG4gICAgICAgIHRlbXBOb2RlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBTdGFtcCBpbnZva2VyIGNvbnRleHQgb24gUGF1c2VTaWduYWwgZHVyaW5nIGJ1YmJsZS11cC5cbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICBlcnJvci5zZXRJbnZva2VyKG5vZGUuaWQhKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0b3JIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU2VsZWN0b3JIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXJELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBELE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUc1RixNQUFNLE9BQU8sZUFBZTtJQUVQO0lBQ0E7SUFGbkIsWUFDbUIsSUFBK0IsRUFDL0IsZ0JBQWdEO1FBRGhELFNBQUksR0FBSixJQUFJLENBQTJCO1FBQy9CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBZ0M7SUFDaEUsQ0FBQztJQUVKOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQ3BCLElBQTZCLEVBQzdCLFNBQXNDLEVBQ3RDLE9BQXFCLEVBQ3JCLFNBQW9CLEVBQ3BCLFVBQThCLEVBQzlCLFFBQWtDLEVBQ2xDLFdBQXdDLEVBQ3hDLGdCQUFtQztRQUVuQyxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU5QyxJQUFJLFdBQXFCLENBQUM7UUFDMUIsSUFBSSxpQkFBZ0QsQ0FBQztRQUNyRCxJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUN4RiwrREFBK0Q7WUFDL0QsSUFDRSxXQUFXO2dCQUNYLE9BQU8sV0FBVyxLQUFLLFFBQVE7Z0JBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBcUIsRUFBRSxlQUFlLENBQUM7Z0JBQ25ELEtBQUssQ0FBQyxPQUFPLENBQUUsV0FBbUIsQ0FBQyxRQUFRLENBQUMsRUFDNUMsQ0FBQztnQkFDRCxXQUFXLEdBQUksV0FBbUIsQ0FBQyxRQUFRLENBQUM7Z0JBQzVDLGlCQUFpQixHQUFJLFdBQW1CLENBQUMsUUFBUSxDQUFDO1lBQ3BELENBQUM7aUJBQU0sQ0FBQztnQkFDTixXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUM3RixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7WUFDcEIsb0ZBQW9GO1lBQ3BGLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQixNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7WUFDRCxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0IsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsVUFBVSxZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtnQkFDaEYsS0FBSyxFQUFFLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7YUFDMUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUMxRyxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7UUFFRCxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWhGLElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFCLHNFQUFzRTtZQUN0RSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDeEcsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEYsa0VBQWtFO1lBQ2xFLGtFQUFrRTtZQUNsRSxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLDBCQUEwQixDQUFDLENBQUM7UUFFOUQsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSwrQ0FBK0MsRUFBRTtnQkFDdkYsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsV0FBVyxFQUFFLEVBQUU7YUFDaEIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3ZHLGlFQUFpRTtZQUNqRSxpRUFBaUU7WUFDakUsMkJBQTJCO1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN4RyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxtRUFBbUU7UUFDbkUsc0ZBQXNGO1FBQ3RGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFxQyxDQUFDO1FBQzVELE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTNGLHFDQUFxQztRQUNyQyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkQsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDekQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkUsTUFBTSxZQUFZLEdBQUcseUJBQXlCLElBQUksQ0FBQyxJQUFJLGlDQUFpQyxPQUFPLENBQUMsSUFBSSxDQUNsRyxJQUFJLENBQ0wsZ0JBQWdCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLFVBQVUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDdEYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsUUFBUTthQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUFHLENBQUMsQ0FBQzthQUN6RCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixPQUFPLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckUsT0FBTyxDQUFDLG1CQUFtQixDQUN6QixVQUFVLEVBQ1YsV0FBVyxhQUFhLEtBQUssZ0JBQWdCLENBQUMsTUFBTSxPQUFPLFFBQVEsQ0FBQyxNQUFNLFdBQVcsRUFDckYsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNyRixDQUFDO1FBRUYsTUFBTSxvQkFBb0IsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FDckMsSUFBSSxDQUFDLElBQUksRUFDVCxvQkFBb0IsRUFDcEIsUUFBUSxDQUFDLE1BQU0sRUFDZixnQkFBZ0IsRUFDaEIsaUJBQWlCLENBQ2xCLENBQUM7UUFDRixrRUFBa0U7UUFDbEUsNkRBQTZEO1FBQzdELElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUV4RyxNQUFNLFFBQVEsR0FBNEI7WUFDeEMsSUFBSSxFQUFFLGVBQWU7WUFDckIsRUFBRSxFQUFFLGVBQWU7WUFDbkIsUUFBUSxFQUFFLGdCQUFnQjtZQUMxQiw4RUFBOEU7WUFDOUUsNkVBQTZFO1lBQzdFLGdGQUFnRjtZQUNoRixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDeEIsQ0FBQztRQUNGLElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQ3BELFFBQVEsRUFDUixPQUFPLEVBQ1AsU0FBUyxFQUNULFVBQVUsRUFDVixnQkFBZ0IsQ0FDakIsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3hCLHlEQUF5RDtZQUN6RCxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN6QixLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFHLENBQUMsQ0FBQztnQkFDM0IsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZWxlY3RvckhhbmRsZXIg4oCUIE11bHRpLWNob2ljZSBmaWx0ZXJlZCBmYW4tb3V0LlxuICpcbiAqIFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIEV4ZWN1dGUgc2NvcGUtYmFzZWQgc2VsZWN0b3Igbm9kZXMgKHN0YWdlIOKGkiBjb21taXQg4oaSIHJlc29sdmUgY2hpbGRyZW4g4oaSIHBhcmFsbGVsIGV4ZWN1dGlvbilcbiAqIC0gVGhlIHNlbGVjdG9yIGZ1bmN0aW9uIElTIGEgc3RhZ2U6IHJlYWRzIHNjb3BlLCByZXR1cm5zIHN0cmluZ1tdIG9mIGJyYW5jaCBJRHNcbiAqIC0gRGVsZWdhdGVzIHBhcmFsbGVsIGV4ZWN1dGlvbiBvZiBzZWxlY3RlZCBjaGlsZHJlbiB0byBDaGlsZHJlbkV4ZWN1dG9yXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTZWxlY3Rpb25FdmlkZW5jZSB9IGZyb20gJy4uLy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBERUNJU0lPTl9SRVNVTFQgfSBmcm9tICcuLi8uLi9kZWNpZGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyRGVwcywgTm9kZVJlc3VsdFR5cGUsIFN0YWdlRnVuY3Rpb24gfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVCcmVha0hhbmRsZXIgfSBmcm9tICcuL2JyZWFrRmxhZy5qcyc7XG5pbXBvcnQgdHlwZSB7IENoaWxkcmVuRXhlY3V0b3IgfSBmcm9tICcuL0NoaWxkcmVuRXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgY29tbWl0U3RhZ2UsIGNvbW1pdFN0YWdlV3JpdGVzIH0gZnJvbSAnLi9jb21taXRTdGFnZS5qcyc7XG5pbXBvcnQgeyBjYXB0dXJlU3RhZ2VGYWlsdXJlLCBsb2dnYWJsZVN0YWdlRXJyb3IsIHJlY29yZFN0YWdlRXJyb3IgfSBmcm9tICcuL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHR5cGUgeyBCcmVha0ZsYWcsIEV4ZWN1dGVOb2RlRm4sIFJ1blN0YWdlRm4gfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFNlbGVjdG9ySGFuZGxlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW5FeGVjdXRvcjogQ2hpbGRyZW5FeGVjdXRvcjxUT3V0LCBUU2NvcGU+LFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIHNjb3BlLWJhc2VkIHNlbGVjdG9yIG5vZGUgKGNyZWF0ZWQgdmlhIGFkZFNlbGVjdG9yRnVuY3Rpb24pLlxuICAgKiBUaGUgc3RhZ2UgZnVuY3Rpb24gSVMgdGhlIHNlbGVjdG9yIOKAlCBpdHMgcmV0dXJuIHZhbHVlIGNvbnRhaW5zIGJyYW5jaCBJRHMuXG4gICAqIEV4ZWN1dGlvbiBvcmRlcjogcnVuU3RhZ2UoZm4pIOKGkiBjb21taXQg4oaSIHJlc29sdmUgY2hpbGRyZW4g4oaSIHBhcmFsbGVsIGV4ZWN1dGUuXG4gICAqL1xuICBhc3luYyBoYW5kbGVTY29wZUJhc2VkKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN0YWdlRnVuYzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcnVuU3RhZ2U6IFJ1blN0YWdlRm48VE91dCwgVFNjb3BlPixcbiAgICBleGVjdXRlTm9kZTogRXhlY3V0ZU5vZGVGbjxUT3V0LCBUU2NvcGU+LFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIE5vZGVSZXN1bHRUeXBlPiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGJyZWFrRm4gPSBjcmVhdGVCcmVha0hhbmRsZXIoYnJlYWtGbGFnKTtcblxuICAgIGxldCBzZWxlY3RlZElkczogc3RyaW5nW107XG4gICAgbGV0IHNlbGVjdGlvbkV2aWRlbmNlOiBTZWxlY3Rpb25FdmlkZW5jZSB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhZ2VPdXRwdXQgPSBhd2FpdCBydW5TdGFnZShub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgLy8gRGV0ZWN0IFNlbGVjdGlvblJlc3VsdCBmcm9tIHNlbGVjdCgpIGhlbHBlciB2aWEgU3ltYm9sIGJyYW5kXG4gICAgICBpZiAoXG4gICAgICAgIHN0YWdlT3V0cHV0ICYmXG4gICAgICAgIHR5cGVvZiBzdGFnZU91dHB1dCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgUmVmbGVjdC5oYXMoc3RhZ2VPdXRwdXQgYXMgb2JqZWN0LCBERUNJU0lPTl9SRVNVTFQpICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoKHN0YWdlT3V0cHV0IGFzIGFueSkuYnJhbmNoZXMpXG4gICAgICApIHtcbiAgICAgICAgc2VsZWN0ZWRJZHMgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5icmFuY2hlcztcbiAgICAgICAgc2VsZWN0aW9uRXZpZGVuY2UgPSAoc3RhZ2VPdXRwdXQgYXMgYW55KS5ldmlkZW5jZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkSWRzID0gQXJyYXkuaXNBcnJheShzdGFnZU91dHB1dCkgPyBzdGFnZU91dHB1dC5tYXAoU3RyaW5nKSA6IFtTdHJpbmcoc3RhZ2VPdXRwdXQpXTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3cg4oCUIGNvbW1pdCBhbmQgcmUtdGhyb3cgd2l0aG91dCBlcnJvciBsb2dnaW5nLlxuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGNvbW1pdFN0YWdlV3JpdGVzKGNvbnRleHQpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVTdGFnZUZhaWx1cmUoY29udGV4dCwgZXJyb3IpO1xuICAgICAgY29tbWl0U3RhZ2VXcml0ZXMoY29udGV4dCk7XG4gICAgICBjb25zdCBzZXJ2ZWQgPSByZWNvcmRTdGFnZUVycm9yKGNvbnRleHQsIGVycm9yKTtcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7XG4gICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uRXJyb3Iobm9kZS5uYW1lLCBzZXJ2ZWQubWVzc2FnZSwgc2VydmVkLnN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBjb21taXRTdGFnZShjb250ZXh0LCB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLCBub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQpO1xuXG4gICAgaWYgKGJyZWFrRmxhZy5zaG91bGRCcmVhaykge1xuICAgICAgLy8gVGhlIHNlbGVjdG9yIGNvbXBsZXRlZCwgYnV0IGl0IGRpZCBub3Qgc2VsZWN0IG9yIGRpc3BhdGNoIGJyYW5jaGVzLlxuICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQobm9kZS5uYW1lLCBub2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0LCAnc2VsZWN0b3InKTtcbiAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25CcmVhayhub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQsIGJyZWFrRmxhZy5yZWFzb24pO1xuICAgICAgLy8gTm8gYnJhbmNoZXMgcmFuOiBkbyBub3QgbWFudWZhY3R1cmUgYSByZXN1bHQgbWFwLiBJbiBhIHN1YmZsb3csXG4gICAgICAvLyB1bmRlZmluZWQgbGV0cyBTdWJmbG93RXhlY3V0b3IgdXNlIHRoZSBzdGFnZSdzIGNvbW1pdHRlZCBzdGF0ZS5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29udGV4dC5hZGRMb2coJ3NlbGVjdGVkQ2hpbGRJZHMnLCBzZWxlY3RlZElkcyk7XG4gICAgY29udGV4dC5hZGRMb2coJ3NlbGVjdG9yUGF0dGVybicsICdzY29wZS1iYXNlZC1tdWx0aS1jaG9pY2UnKTtcblxuICAgIGlmIChzZWxlY3RlZElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCdza2lwcGVkQWxsQ2hpbGRyZW4nLCB0cnVlKTtcbiAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnc2VsZWN0ZWQnLCAnTm8gY2hpbGRyZW4gc2VsZWN0ZWQg4oCUIHNraXBwaW5nIGFsbCBicmFuY2hlcy4nLCB7XG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB0YXJnZXRTdGFnZTogW10sXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TZWxlY3RlZChub2RlLm5hbWUsIFtdLCAobm9kZS5jaGlsZHJlbiA/PyBbXSkubGVuZ3RoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIGV2ZW4gb24gemVyby1zZWxlY3QgcGF0aCDigJRcbiAgICAgIC8vIHRoZSBzZWxlY3RvciBESUQgY29tcGxldGUgKGl0IHBpY2tlZCBub25lKTsgY29uc3VtZXJzIHRyYWNraW5nXG4gICAgICAvLyB2aXNpdGVkIG5lZWQgdGhlIHNpZ25hbC5cbiAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKG5vZGUubmFtZSwgbm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgJ3NlbGVjdG9yJyk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLy8gUmVzb2x2ZSBjaGlsZHJlbiBieSBtYXRjaGluZyBzZWxlY3RlZCBJRHMgYWdhaW5zdCBub2RlLmNoaWxkcmVuLlxuICAgIC8vIE1hdGNoIGJyYW5jaElkIGZpcnN0IChvcmlnaW5hbCB1bnByZWZpeGVkIElEKSwgZmFsbCBiYWNrIHRvIGlkIGZvciBiYWNrd2FyZCBjb21wYXQuXG4gICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuIGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W107XG4gICAgY29uc3Qgc2VsZWN0ZWRDaGlsZHJlbiA9IGNoaWxkcmVuLmZpbHRlcigoYykgPT4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMoYy5icmFuY2hJZCA/PyBjLmlkISkpO1xuXG4gICAgLy8gVmFsaWRhdGUgYWxsIElEcyBleGlzdCAoZmFpbCBmYXN0KVxuICAgIGlmIChzZWxlY3RlZENoaWxkcmVuLmxlbmd0aCAhPT0gc2VsZWN0ZWRJZHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjaGlsZElkcyA9IGNoaWxkcmVuLm1hcCgoYykgPT4gYy5icmFuY2hJZCA/PyBjLmlkKTtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSBzZWxlY3RlZElkcy5maWx0ZXIoKGlkKSA9PiAhY2hpbGRJZHMuaW5jbHVkZXMoaWQpKTtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBTY29wZS1iYXNlZCBzZWxlY3RvciAnJHtub2RlLm5hbWV9JyByZXR1cm5lZCB1bmtub3duIGNoaWxkIElEczogJHttaXNzaW5nLmpvaW4oXG4gICAgICAgICcsICcsXG4gICAgICApfS4gQXZhaWxhYmxlOiAke2NoaWxkSWRzLmpvaW4oJywgJyl9YDtcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICBjb250ZXh0LmFkZEVycm9yKCdzZWxlY3RvckVycm9yJywgZXJyb3JNZXNzYWdlKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHNraXBwZWRJZHMgPSBjaGlsZHJlblxuICAgICAgLmZpbHRlcigoYykgPT4gIXNlbGVjdGVkSWRzLmluY2x1ZGVzKGMuYnJhbmNoSWQgPz8gYy5pZCEpKVxuICAgICAgLm1hcCgoYykgPT4gYy5icmFuY2hJZCA/PyBjLmlkKTtcbiAgICBpZiAoc2tpcHBlZElkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb250ZXh0LmFkZExvZygnc2tpcHBlZENoaWxkSWRzJywgc2tpcHBlZElkcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWROYW1lcyA9IHNlbGVjdGVkQ2hpbGRyZW4ubWFwKChjKSA9PiBjLm5hbWUpLmpvaW4oJywgJyk7XG4gICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKFxuICAgICAgJ3NlbGVjdGVkJyxcbiAgICAgIGBSdW5uaW5nICR7c2VsZWN0ZWROYW1lc30gKCR7c2VsZWN0ZWRDaGlsZHJlbi5sZW5ndGh9IG9mICR7Y2hpbGRyZW4ubGVuZ3RofSBtYXRjaGVkKWAsXG4gICAgICB7IGNvdW50OiBzZWxlY3RlZENoaWxkcmVuLmxlbmd0aCwgdGFyZ2V0U3RhZ2U6IHNlbGVjdGVkQ2hpbGRyZW4ubWFwKChjKSA9PiBjLm5hbWUpIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkRGlzcGxheU5hbWVzID0gc2VsZWN0ZWRDaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSk7XG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblNlbGVjdGVkKFxuICAgICAgbm9kZS5uYW1lLFxuICAgICAgc2VsZWN0ZWREaXNwbGF5TmFtZXMsXG4gICAgICBjaGlsZHJlbi5sZW5ndGgsXG4gICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgc2VsZWN0aW9uRXZpZGVuY2UsXG4gICAgKTtcbiAgICAvLyBQcm9wb3NhbCAjMDAzOiBmaXJlIG9uU3RhZ2VFeGVjdXRlZCBBRlRFUiB0aGUgc3BlY2lhbGl6ZWQgZXZlbnRcbiAgICAvLyBzbyBjb25zdW1lcnMgdHJhY2tpbmcgXCJkaWQgdGhpcyBzdGFnZSBydW5cIiB3b3JrIHVuaWZvcm1seS5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdzZWxlY3RvcicpO1xuXG4gICAgY29uc3QgdGVtcE5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogJ3NlbGVjdG9yLXRlbXAnLFxuICAgICAgaWQ6ICdzZWxlY3Rvci10ZW1wJyxcbiAgICAgIGNoaWxkcmVuOiBzZWxlY3RlZENoaWxkcmVuLFxuICAgICAgLy8gUHJvcGFnYXRlIHRoZSBzZWxlY3RvcidzIGZhbi1vdXQgZXJyb3IgbW9kZS4gV2l0aG91dCB0aGlzLCBDaGlsZHJlbkV4ZWN1dG9yXG4gICAgICAvLyByZWFkcyBgdGVtcE5vZGUuZmFpbEZhc3RgICh1bmRlZmluZWQpIGFuZCBhbHdheXMgdXNlcyBQcm9taXNlLmFsbFNldHRsZWQg4oCUXG4gICAgICAvLyBzaWxlbnRseSBzd2FsbG93aW5nIGEgcmVxdWlyZWQgYnJhbmNoJ3MgZXJyb3IuIFNlZSBidWlsZGVyIGBmYWlsRmFzdGAgb3B0aW9uLlxuICAgICAgZmFpbEZhc3Q6IG5vZGUuZmFpbEZhc3QsXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hpbGRyZW5FeGVjdXRvci5leGVjdXRlTm9kZUNoaWxkcmVuKFxuICAgICAgICB0ZW1wTm9kZSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gU3RhbXAgaW52b2tlciBjb250ZXh0IG9uIFBhdXNlU2lnbmFsIGR1cmluZyBidWJibGUtdXAuXG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgZXJyb3Iuc2V0SW52b2tlcihub2RlLmlkISk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -7,11 +7,18 @@
7
7
  * - Handle streaming stages (onStart, onToken, onEnd lifecycle)
8
8
  * - Sync+async safety: only await real Promises (instanceof check)
9
9
  */
10
+ import type { AttemptContext } from '../../attempt/types.js';
10
11
  import type { StageContext } from '../../memory/StageContext.js';
11
12
  import type { StageNode } from '../graph/StageNode.js';
12
13
  import type { HandlerDeps, StageFunction } from '../types.js';
13
14
  export declare class StageRunner<TOut = any, TScope = any> {
14
15
  private readonly deps;
15
16
  constructor(deps: HandlerDeps<TOut, TScope>);
16
- run(node: StageNode<TOut, TScope>, stageFunc: StageFunction<TOut, TScope>, context: StageContext, breakFn: () => void): Promise<TOut>;
17
+ /**
18
+ * Run one stage function. `attempt` is the attempt runner's (P1b) — present when the stage runs under a retry
19
+ * policy, a `timeoutMs` or a run deadline: the scope hands it out (`$attempt()`) and is fenced to it, and the
20
+ * race below is against ITS signal (the run's, composed with the attempt's cap). Without one, the race is
21
+ * against the run's signal, as it always was.
22
+ */
23
+ run(node: StageNode<TOut, TScope>, stageFunc: StageFunction<TOut, TScope>, context: StageContext, breakFn: () => void, attempt?: AttemptContext): Promise<TOut>;
17
24
  }