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
@@ -12,11 +12,16 @@
12
12
  * it belongs in the runner layer (Phase 5).
13
13
  */
14
14
  import { joinPath } from 'foottrace';
15
+ import { touchesProblem } from '../attempt/effect.js';
16
+ import { retryPolicyProblem } from '../attempt/policy.js';
17
+ import { declareRetryLoopBudget } from '../attempt/retryLoopContext.js';
18
+ import { budgetRefusal, budgetWarning, timeBudget } from '../budget/index.js';
15
19
  import { isDevMode } from '../devMode.js';
16
20
  import { prefixNodeTree } from '../engine/graph/prefixNodeTree.js';
17
21
  import { BRANCH_SEGMENT_MARKER, hasBranchSegmentMarker } from '../ids/branchSegment.js';
18
22
  import { refuseReservedId } from '../ids/reservedIds.js';
19
23
  import { makeRunnable } from '../runner/RunnableChart.js';
24
+ import { appendRetryLoop } from './retryLoop.js';
20
25
  import { StructureRecorderDispatcher } from './structure/StructureRecorderDispatcher.js';
21
26
  import { createTypedScopeFactory } from './typedFlowChart.js';
22
27
  // ─────────────────────────────────────────────────────────────────────────────
@@ -36,18 +41,53 @@ const fail = (msg) => {
36
41
  * typo'd `attempts: 0` should fail while you are writing the chart, not
37
42
  * silently turn a stage into a no-op run three months later. `attempts: 1` is
38
43
  * accepted on purpose — it means "policy declared, currently off", so a policy
39
- * can be dialled down without deleting the declaration.
44
+ * can be dialled down without deleting the declaration. The rule is
45
+ * `attempt/policy.ts · retryPolicyProblem`, which the traverser also applies to
46
+ * a StageNode a stage returns at run time.
40
47
  */
41
48
  function applyRetryPolicy(node, spec, retry, where) {
42
49
  if (!retry)
43
50
  return;
44
- if (typeof retry.attempts !== 'number' || !Number.isInteger(retry.attempts) || retry.attempts < 1) {
45
- fail(`${where}: retry.attempts must be a whole number >= 1 (got ${String(retry.attempts)}). ` +
46
- 'It counts TOTAL runs including the first, so `attempts: 3` means one run plus up to two retries; ' +
47
- '`attempts: 1` means the policy is declared but currently off.');
51
+ const problem = retryPolicyProblem(retry);
52
+ if (problem !== undefined)
53
+ fail(`${where}: ${problem}`);
54
+ // A touching stage declared first: the policy must not make it retry without a key (P3 — either order refuses).
55
+ if (node.touches) {
56
+ const touching = touchesProblem(node.touches, retry);
57
+ if (touching !== undefined)
58
+ fail(`${where}: stage '${node.name}' ${touching}`);
48
59
  }
49
60
  node.retry = retry;
50
61
  spec.retryAttempts = retry.attempts;
62
+ // The cap rides the spec beside the count (P5): a JSON-safe fact, so a reader of the spec sees what bounds the stage.
63
+ if (retry.timeoutMs !== undefined)
64
+ spec.timeoutMs = retry.timeoutMs;
65
+ }
66
+ /**
67
+ * Attach a side-effect declaration to a stage node + its spec node (10.1, design §3.3) — the twin of
68
+ * {@link applyRetryPolicy}: the ONE place `touches` lands, shared by the `.touches()` cursor modifier and every
69
+ * `options.touches` site.
70
+ *
71
+ * The law is `attempt/effect.ts · touchesProblem`, which the traverser also applies to a StageNode returned at run
72
+ * time and to every stage it runs: `system` a name, the key rule a function, and a stage that may retry must declare
73
+ * the key rule — a retry of an outside effect without one can apply it twice. Checked here against the policy
74
+ * already on the node; `applyRetryPolicy` checks a policy that lands after. The spec carries the system NAME only.
75
+ */
76
+ function applyTouches(node, spec, touches, where) {
77
+ if (touches === undefined)
78
+ return;
79
+ if (node.touches)
80
+ fail(`${where}: touches already declared at '${node.name}' (${node.touches.system})`);
81
+ // Each field read ONCE, then checked and frozen: what is checked is exactly what lands (a getter cannot differ).
82
+ const read = (touches !== null && typeof touches === 'object' ? touches : {});
83
+ const { system, idempotencyKey } = read;
84
+ const copy = { system, ...(idempotencyKey !== undefined && { idempotencyKey }) };
85
+ const problem = touchesProblem(touches === null || typeof touches !== 'object' ? touches : copy, node.retry);
86
+ if (problem !== undefined)
87
+ fail(`${where}: stage '${node.name}' ${problem}`);
88
+ // The node's copy is frozen and holds only the two named fields: nothing else on the caller's object rides along.
89
+ node.touches = Object.freeze(copy);
90
+ spec.touches = system;
51
91
  }
52
92
  /**
53
93
  * Attach declared tags to a stage node + its spec node.
@@ -223,6 +263,7 @@ class BranchCursor {
223
263
  if (description)
224
264
  spec.description = description;
225
265
  applyRetryPolicy(node, spec, options?.retry, `addFunctionBranch('${id}')`);
266
+ applyTouches(node, spec, options?.touches, `addFunctionBranch('${id}')`);
226
267
  applyTags(node, spec, options?.tags, `addFunctionBranch('${id}')`);
227
268
  this.attach(node, spec, id);
228
269
  this.branchDescInfo.push({ id, description });
@@ -245,6 +286,7 @@ class BranchCursor {
245
286
  if (description)
246
287
  spec.description = description;
247
288
  applyRetryPolicy(node, spec, options?.retry, `addPausableFunctionBranch('${id}')`);
289
+ applyTouches(node, spec, options?.touches, `addPausableFunctionBranch('${id}')`);
248
290
  applyTags(node, spec, options?.tags, `addPausableFunctionBranch('${id}')`);
249
291
  this.attach(node, spec, id);
250
292
  this.branchDescInfo.push({ id, description });
@@ -933,6 +975,7 @@ export class FlowChartBuilder {
933
975
  if (description)
934
976
  spec.description = description;
935
977
  applyRetryPolicy(node, spec, options?.retry, `start('${id}')`);
978
+ applyTouches(node, spec, options?.touches, `start('${id}')`);
936
979
  applyTags(node, spec, options?.tags, `start('${id}')`);
937
980
  this._root = node;
938
981
  this._rootSpec = spec;
@@ -974,6 +1017,7 @@ export class FlowChartBuilder {
974
1017
  if (description)
975
1018
  spec.description = description;
976
1019
  applyRetryPolicy(node, spec, options?.retry, `startSelector('${id}')`);
1020
+ applyTouches(node, spec, options?.touches, `startSelector('${id}')`);
977
1021
  applyTags(node, spec, options?.tags, `startSelector('${id}')`);
978
1022
  this._root = node;
979
1023
  this._rootSpec = spec;
@@ -1017,6 +1061,28 @@ export class FlowChartBuilder {
1017
1061
  this._appendDescriptionLine(name, description);
1018
1062
  return this;
1019
1063
  }
1064
+ /** Compose a keyed outside operation, reconciliation, shared retry decision and wait as ordinary chart nodes. */
1065
+ addRetryLoop(id, options) {
1066
+ this._needCursor();
1067
+ for (const stageId of [id, `${id}-reconcile`, `${id}-decide`, `${id}-retry`, `${id}-done`, `${id}-stop`]) {
1068
+ admitId('retry loop stage id', stageId, 'stage');
1069
+ if (this._idTaken(stageId))
1070
+ fail(`retry loop stage id '${stageId}' already exists`);
1071
+ }
1072
+ appendRetryLoop(this, id, options, (budget, branch) => {
1073
+ const cursor = this._needCursor();
1074
+ const node = branch === undefined ? cursor : cursor.children?.find((child) => child.id === branch);
1075
+ const spec = branch === undefined
1076
+ ? this._needCursorSpec()
1077
+ : this._needCursorSpec().children?.find((child) => child.id === branch);
1078
+ if (node === undefined || spec === undefined)
1079
+ fail('retry loop budget node missing');
1080
+ declareRetryLoopBudget(node, budget);
1081
+ if (budget.timeoutMs !== undefined)
1082
+ spec.timeoutMs = budget.timeoutMs;
1083
+ });
1084
+ return this;
1085
+ }
1020
1086
  addStreamingFunction(name, fn, id, streamId, description) {
1021
1087
  admitId('stage id', id, 'stage');
1022
1088
  const cur = this._needCursor();
@@ -1227,6 +1293,7 @@ export class FlowChartBuilder {
1227
1293
  if (description)
1228
1294
  spec.description = description;
1229
1295
  applyRetryPolicy(node, spec, options?.retry, `addDeciderFunction('${id}')`);
1296
+ applyTouches(node, spec, options?.touches, `addDeciderFunction('${id}')`);
1230
1297
  applyTags(node, spec, options?.tags, `addDeciderFunction('${id}')`);
1231
1298
  cur.next = node;
1232
1299
  curSpec.next = spec;
@@ -1268,6 +1335,7 @@ export class FlowChartBuilder {
1268
1335
  if (description)
1269
1336
  spec.description = description;
1270
1337
  applyRetryPolicy(node, spec, options?.retry, `addSelectorFunction('${id}')`);
1338
+ applyTouches(node, spec, options?.touches, `addSelectorFunction('${id}')`);
1271
1339
  applyTags(node, spec, options?.tags, `addSelectorFunction('${id}')`);
1272
1340
  cur.next = node;
1273
1341
  curSpec.next = spec;
@@ -1289,7 +1357,7 @@ export class FlowChartBuilder {
1289
1357
  curSpec.type = 'fork';
1290
1358
  if (options?.failFast)
1291
1359
  cur.failFast = true;
1292
- for (const { id, name, fn, retry, tags } of children) {
1360
+ for (const { id, name, fn, retry, touches, tags } of children) {
1293
1361
  if (!id)
1294
1362
  fail(`child id required under '${cur.name}'`);
1295
1363
  admitId('fork child id', id, 'stage');
@@ -1309,6 +1377,7 @@ export class FlowChartBuilder {
1309
1377
  parallelGroupId: forkId,
1310
1378
  };
1311
1379
  applyRetryPolicy(node, spec, retry, `addListOfFunction child '${id}'`);
1380
+ applyTouches(node, spec, touches, `addListOfFunction child '${id}'`);
1312
1381
  applyTags(node, spec, tags, `addListOfFunction child '${id}'`);
1313
1382
  cur.children = cur.children || [];
1314
1383
  cur.children.push(node);
@@ -1618,8 +1687,13 @@ export class FlowChartBuilder {
1618
1687
  * failed calls that came before the successful one left no mark anywhere —
1619
1688
  * an unexplained behaviour in a library whose whole point is that nothing
1620
1689
  * invisible happens. Declared here, every attempt is part of the record: each
1621
- * failed attempt fires `FlowRecorder.onStageRetry` and appears in the
1622
- * narrative, in order, between the attempts' own reads and writes.
1690
+ * attempt fires `FlowRecorder.onAttempt` with its `AttemptRecord` (outcome,
1691
+ * duration, failure category, the retry-or-stop decision), which is what
1692
+ * feeds the narrative — one line per attempt, in order, between the
1693
+ * attempts' own reads and writes. The stage's execution-tree node keeps the
1694
+ * records (`attempts`, `attemptSummary`). A failed attempt that is retried
1695
+ * also fires `FlowRecorder.onStageRetry`, which the narrative does not tell
1696
+ * twice.
1623
1697
  *
1624
1698
  * ## What an attempt is
1625
1699
  *
@@ -1672,6 +1746,64 @@ export class FlowChartBuilder {
1672
1746
  applyRetryPolicy(cur, curSpec, policy, `retry() at '${cur.name}'`);
1673
1747
  return this;
1674
1748
  }
1749
+ // ── Side effects ──
1750
+ /**
1751
+ * Declare that the stage you JUST added changes an outside system — a charge, an email, a write to another
1752
+ * service (10.1, design §3.3) — and give the rule for its idempotency key.
1753
+ *
1754
+ * ## Why declare it
1755
+ *
1756
+ * A retry is safe for a read. For a charge it is safe only when the outside system can tell a retry from a new
1757
+ * request — by an idempotency key. So the builder refuses a touching stage that may retry (`.retry({ attempts >
1758
+ * 1 })`, in either order) without a key rule: a double charge must be impossible to write by accident. A default
1759
+ * key made by the library was rejected — the run id changes across a resume and a caller's whole-run retry, the
1760
+ * two places a double charge actually happens. The key must name the OPERATION: derive it from the input the rule
1761
+ * is handed, never from model output (`({ getState }) => …` reads it from state). A
1762
+ * keyless touching stage may not `interrupt()`: a resume re-runs it from its top. In a chart that pauses, derive
1763
+ * keys from state (`({ getState }) => …`): the run's input does not cross a resume.
1764
+ *
1765
+ * ## What it changes at run time
1766
+ *
1767
+ * The stage always runs on the attempt runner. The key rule runs ONCE per execution, before attempt 1, and every
1768
+ * attempt gets the key as `scope.$attempt().idempotencyKey` — pass it to the system. Every attempt record says
1769
+ * what it did there (`effect`: `'applied'`, `'none'` when the error itself declares `effect: 'none'`, else
1770
+ * `'unknown'`). When ANY attempt left the effect unknown — it timed out, was cut, or failed without the adapter
1771
+ * saying nothing was sent — the stage fails with `UnknownEffectError`: reconcile with the system by the key, do
1772
+ * not retry blindly. The spec carries the system's name (`touches`).
1773
+ *
1774
+ * @example
1775
+ * ```ts
1776
+ * flowChart<Order>('Load order', loadFn, 'load')
1777
+ * .addFunction('Charge card', chargeFn, 'charge')
1778
+ * .touches('stripe', { idempotencyKey: ({ args }) => `order-${(args as { orderId: string }).orderId}` })
1779
+ * .retry({ attempts: 3, timeoutMs: 20_000 })
1780
+ * ```
1781
+ *
1782
+ * Applies to the CURRENT cursor, like `.retry()`; where the cursor would be ambiguous (a decider, selector,
1783
+ * branch, or fork child), declare it in that method's own `touches` option. Refused: on a subflow mount, a
1784
+ * parallel-for-each stage or a loop reference (no function of their own), after a mount or a fork (the cursor did
1785
+ * not move), twice, with a system that is not a name, and with a key that is not a function.
1786
+ */
1787
+ touches(system, options) {
1788
+ const cur = this._needCursor();
1789
+ const curSpec = this._needCursorSpec();
1790
+ if (this._cursorTail) {
1791
+ fail(`touches() cannot follow ${this._cursorTail} — that attaches to '${cur.name}' without moving the cursor. ` +
1792
+ 'Declare it at its own site: on the stages INSIDE a subflow chart, or via the `touches` field on an ' +
1793
+ 'addListOfFunction child.');
1794
+ }
1795
+ if (cur.isSubflowRoot) {
1796
+ fail(`touches() cannot be applied to the subflow mount '${cur.name}' — declare it on the stages INSIDE it.`);
1797
+ }
1798
+ if (cur.isDynamicParallel) {
1799
+ fail(`touches() cannot be applied to the parallel-for-each stage '${cur.name}' — declare it on the stages of ` +
1800
+ 'the branch chart.');
1801
+ }
1802
+ if (cur.isLoopRef)
1803
+ fail(`touches() cannot be applied to the loop reference '${cur.name}'`);
1804
+ applyTouches(cur, curSpec, { system, ...(options?.idempotencyKey !== undefined && { idempotencyKey: options.idempotencyKey }) }, `touches() at '${cur.name}'`);
1805
+ return this;
1806
+ }
1675
1807
  // ── Declared tags ──
1676
1808
  /**
1677
1809
  * Put NAMES on the stage you JUST added. The first commit bundle of each
@@ -1750,6 +1882,43 @@ export class FlowChartBuilder {
1750
1882
  this._fireStageTagged(curSpec);
1751
1883
  return this;
1752
1884
  }
1885
+ // ── Time budget ──
1886
+ /**
1887
+ * Declare the chart's time budget: the most milliseconds a caller gives one run (design §3.2).
1888
+ *
1889
+ * WHY: the incident behind it — a stage retried an SDK call four times, 40 s each, past a caller's 120 s, and the
1890
+ * record said "one stage, one error". Both numbers were declared: the policy on the stage, the budget of the
1891
+ * caller. So `build()` checks one against the other: it REFUSES the chart when its declared policies already allow
1892
+ * longer (`attempts × timeoutMs` plus the waits, summed along the slowest path — see `timeBudget`), and in dev mode
1893
+ * names every stage it cannot bound (no `timeoutMs`, a function backoff with no `maxBackoffMs`, a loop, a lazy
1894
+ * subflow, a `parallelForEach`). The spec root carries it (`budgetMs`); at run start, a deadline shorter than it is
1895
+ * a dev-mode warning.
1896
+ *
1897
+ * Chart-level, so it may be declared anywhere before `build()`, once.
1898
+ *
1899
+ * @example
1900
+ * ```ts
1901
+ * flowChart<State>('Read', readFn, 'read', { retry: { attempts: 1, timeoutMs: 5_000 } })
1902
+ * .addFunction('Charge', chargeFn, 'charge')
1903
+ * .retry({ attempts: 4, timeoutMs: 40_000, backoffMs: 1_000 })
1904
+ * .budget(120_000)
1905
+ * .build(); // throws: its declared policies allow 168000 ms, over its budget by 48000 ms
1906
+ * ```
1907
+ */
1908
+ budget(ms) {
1909
+ if (this._sealed)
1910
+ fail('budget() after build() — declare the budget before building the chart');
1911
+ const rootSpec = this._rootSpec ?? fail('budget() before start() — start the chart first');
1912
+ // At most Number.MAX_SAFE_INTEGER: the worst case saturates there, so a larger budget could never be exceeded.
1913
+ if (!(typeof ms === 'number' && ms > 0 && ms <= Number.MAX_SAFE_INTEGER)) {
1914
+ fail('budget(ms) must be a finite number of milliseconds > 0, at most Number.MAX_SAFE_INTEGER ' +
1915
+ `(got ${typeof ms === 'number' ? ms : typeof ms})`);
1916
+ }
1917
+ if (rootSpec.budgetMs !== undefined)
1918
+ fail(`budget already declared (${rootSpec.budgetMs} ms) — declare it once`);
1919
+ rootSpec.budgetMs = ms;
1920
+ return this;
1921
+ }
1753
1922
  // ── Loop ──
1754
1923
  loopTo(stageId) {
1755
1924
  const cur = this._needCursor();
@@ -1820,8 +1989,27 @@ export class FlowChartBuilder {
1820
1989
  // or any subclass) automatically gets TypedScope — no manual setScopeFactory needed.
1821
1990
  scopeFactory: this._scopeFactory ?? createTypedScopeFactory(),
1822
1991
  };
1992
+ if (rootSpec.budgetMs !== undefined)
1993
+ this._checkBudget(chart);
1823
1994
  return makeRunnable(chart);
1824
1995
  }
1996
+ /**
1997
+ * The declared budget, checked (owner ruling Q2): refused when the chart's bounded part alone allows longer — a
1998
+ * time its declared policies allow a run to take, so the budget cannot be promised; every stage it cannot bound is
1999
+ * a dev-mode warning.
2000
+ */
2001
+ _checkBudget(chart) {
2002
+ const report = timeBudget(chart);
2003
+ const refusal = budgetRefusal(report);
2004
+ if (refusal !== undefined)
2005
+ fail(refusal);
2006
+ if (!isDevMode())
2007
+ return;
2008
+ const warning = budgetWarning(report, chart.root.name);
2009
+ // eslint-disable-next-line no-console
2010
+ if (warning !== undefined)
2011
+ console.warn(warning);
2012
+ }
1825
2013
  /** Override the scope factory. Rarely needed — auto-embeds TypedScope by default. */
1826
2014
  setScopeFactory(factory) {
1827
2015
  this._scopeFactory = factory;
@@ -2075,6 +2263,7 @@ export function flowChart(name, fn, id, options) {
2075
2263
  }
2076
2264
  return builder.start(name, fn, id, options?.description, {
2077
2265
  ...(options?.retry && { retry: options.retry }),
2266
+ ...(options?.touches && { touches: options.touches }),
2078
2267
  ...(options?.tags && { tags: options.tags }),
2079
2268
  });
2080
2269
  }
@@ -2102,6 +2291,7 @@ export function flowChartSelector(name, fn, id, options) {
2102
2291
  return builder.startSelector(name, fn, id, options?.description, {
2103
2292
  ...(options?.failFast !== undefined && { failFast: options.failFast }),
2104
2293
  ...(options?.retry && { retry: options.retry }),
2294
+ ...(options?.touches && { touches: options.touches }),
2105
2295
  ...(options?.tags && { tags: options.tags }),
2106
2296
  });
2107
2297
  }
@@ -2117,4 +2307,4 @@ export function specToStageNode(spec) {
2117
2307
  });
2118
2308
  return inflate(spec);
2119
2309
  }
2120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYnVpbGRlci9GbG93Q2hhcnRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFbkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEYsT0FBTyxFQUFtQixnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRzFFLE9BQU8sRUFBMEIsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFbEYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekYsT0FBTyxFQUEyQix1QkFBdUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBZ0J2RixnRkFBZ0Y7QUFDaEYsbUJBQW1CO0FBQ25CLGdGQUFnRjtBQUVoRixNQUFNLElBQUksR0FBRyxDQUFDLEdBQVcsRUFBUyxFQUFFO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDdkIsSUFBeUIsRUFDekIsSUFBaUMsRUFDakMsS0FBOEIsRUFDOUIsS0FBYTtJQUViLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTztJQUNuQixJQUFJLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsUUFB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QThCO0FBQzlCLGdGQUFnRjtBQUVoRixNQUFNLFVBQVUsZUFBZSxDQUFDLElBQW1CO0lBQ2pELE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBZ0IsRUFBdUIsRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1FBQ1osRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQ1IsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNsRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztLQUMzQyxDQUFDLENBQUM7SUFDSCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93Q2hhcnRCdWlsZGVyIOKAlCBGbHVlbnQgQVBJIGZvciBjb25zdHJ1Y3RpbmcgZmxvd2NoYXJ0IGV4ZWN1dGlvbiBncmFwaHMuXG4gKlxuICogQnVpbGRzIFN0YWdlTm9kZSB0cmVlcyBhbmQgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIChKU09OKSBpbiB0YW5kZW0uXG4gKiBaZXJvIGRlcGVuZGVuY2llcyBvbiBvbGQgY29kZSDigJQgb25seSBpbXBvcnRzIGZyb20gbG9jYWwgdHlwZXMuXG4gKlxuICogVGhlIGJ1aWxkZXIgY3JlYXRlcyB0d28gcGFyYWxsZWwgc3RydWN0dXJlczpcbiAqIDEuIFN0YWdlTm9kZSB0cmVlIOKAlCBydW50aW1lIGdyYXBoIHdpdGggZW1iZWRkZWQgZnVuY3Rpb25zXG4gKiAyLiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUg4oCUIEpTT04tc2FmZSBzdHJ1Y3R1cmUgZm9yIHZpc3VhbGl6YXRpb25cbiAqXG4gKiBUaGUgZXhlY3V0ZSgpIGNvbnZlbmllbmNlIG1ldGhvZCBpcyBpbnRlbnRpb25hbGx5IG9taXR0ZWQg4oCUXG4gKiBpdCBiZWxvbmdzIGluIHRoZSBydW5uZXIgbGF5ZXIgKFBoYXNlIDUpLlxuICovXG5cbmltcG9ydCB7IGpvaW5QYXRoIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgeyBwcmVmaXhOb2RlVHJlZSB9IGZyb20gJy4uL2VuZ2luZS9ncmFwaC9wcmVmaXhOb2RlVHJlZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhcmFsbGVsRm9yRWFjaENvbmZpZywgUmV0cnlQb2xpY3ksIFNjb3BlRmFjdG9yeSB9IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBCUkFOQ0hfU0VHTUVOVF9NQVJLRVIsIGhhc0JyYW5jaFNlZ21lbnRNYXJrZXIgfSBmcm9tICcuLi9pZHMvYnJhbmNoU2VnbWVudC5qcyc7XG5pbXBvcnQgeyB0eXBlIElkUG9zaXRpb24sIHJlZnVzZVJlc2VydmVkSWQgfSBmcm9tICcuLi9pZHMvcmVzZXJ2ZWRJZHMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYXVzYWJsZUhhbmRsZXIgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFR5cGVkU2NvcGUgfSBmcm9tICcuLi9yZWFjdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyB0eXBlIFJ1bm5hYmxlRmxvd0NoYXJ0LCBtYWtlUnVubmFibGUgfSBmcm9tICcuLi9ydW5uZXIvUnVubmFibGVDaGFydC5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZUVkZ2VLaW5kLCBTdHJ1Y3R1cmVSZWNvcmRlciB9IGZyb20gJy4vc3RydWN0dXJlL1N0cnVjdHVyZVJlY29yZGVyLmpzJztcbmltcG9ydCB7IFN0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlciB9IGZyb20gJy4vc3RydWN0dXJlL1N0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyB0eXBlIFR5cGVkU3RhZ2VGdW5jdGlvbiwgY3JlYXRlVHlwZWRTY29wZUZhY3RvcnkgfSBmcm9tICcuL3R5cGVkRmxvd0NoYXJ0LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRmxvd0NoYXJ0LFxuICBGbG93Q2hhcnRPcHRpb25zLFxuICBGbG93Q2hhcnRTcGVjLFxuICBJTG9nZ2VyLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFNpbXBsaWZpZWRQYXJhbGxlbFNwZWMsXG4gIFN0YWdlRnVuY3Rpb24sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN0cmVhbUxpZmVjeWNsZUhhbmRsZXIsXG4gIFN0cmVhbVRva2VuSGFuZGxlcixcbiAgU3ViZmxvd01vdW50T3B0aW9ucyxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSW50ZXJuYWwgaGVscGVyc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IGZhaWwgPSAobXNnOiBzdHJpbmcpOiBuZXZlciA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihgW0Zsb3dDaGFydEJ1aWxkZXJdICR7bXNnfWApO1xufTtcblxuLyoqXG4gKiBBdHRhY2ggYSBkZWNsYXJhdGl2ZSByZXRyeSBwb2xpY3kgdG8gYSBzdGFnZSBub2RlICsgaXRzIHNwZWMgbm9kZS5cbiAqXG4gKiBUaGUgT05FIHBsYWNlIGEgcG9saWN5IGxhbmRzIG9uIGEgbm9kZSwgc2hhcmVkIGJ5IHRoZSBgLnJldHJ5KClgIGN1cnNvclxuICogbW9kaWZpZXIgYW5kIGJ5IGV2ZXJ5IGBvcHRpb25zLnJldHJ5YCBkZWNsYXJhdGlvbiBzaXRlLCBzbyB2YWxpZGF0aW9uIGFuZCB0aGVcbiAqIHNwZWMncyBgcmV0cnlBdHRlbXB0c2AgbWlycm9yIGNhbiBuZXZlciBkcmlmdCBiZXR3ZWVuIHRoZW0uXG4gKlxuICogYGF0dGVtcHRzYCBpcyB2YWxpZGF0ZWQgYXQgQlVJTEQgdGltZSByYXRoZXIgdGhhbiBkZWZlbmRlZCBhdCBydW50aW1lOiBhXG4gKiB0eXBvJ2QgYGF0dGVtcHRzOiAwYCBzaG91bGQgZmFpbCB3aGlsZSB5b3UgYXJlIHdyaXRpbmcgdGhlIGNoYXJ0LCBub3RcbiAqIHNpbGVudGx5IHR1cm4gYSBzdGFnZSBpbnRvIGEgbm8tb3AgcnVuIHRocmVlIG1vbnRocyBsYXRlci4gYGF0dGVtcHRzOiAxYCBpc1xuICogYWNjZXB0ZWQgb24gcHVycG9zZSDigJQgaXQgbWVhbnMgXCJwb2xpY3kgZGVjbGFyZWQsIGN1cnJlbnRseSBvZmZcIiwgc28gYSBwb2xpY3lcbiAqIGNhbiBiZSBkaWFsbGVkIGRvd24gd2l0aG91dCBkZWxldGluZyB0aGUgZGVjbGFyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGFwcGx5UmV0cnlQb2xpY3koXG4gIG5vZGU6IFN0YWdlTm9kZTxhbnksIGFueT4sXG4gIHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgcmV0cnk6IFJldHJ5UG9saWN5IHwgdW5kZWZpbmVkLFxuICB3aGVyZTogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGlmICghcmV0cnkpIHJldHVybjtcbiAgaWYgKHR5cGVvZiByZXRyeS5hdHRlbXB0cyAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIocmV0cnkuYXR0ZW1wdHMpIHx8IHJldHJ5LmF0dGVtcHRzIDwgMSkge1xuICAgIGZhaWwoXG4gICAgICBgJHt3aGVyZX06IHJldHJ5LmF0dGVtcHRzIG11c3QgYmUgYSB3aG9sZSBudW1iZXIgPj0gMSAoZ290ICR7U3RyaW5nKHJldHJ5LmF0dGVtcHRzKX0pLiBgICtcbiAgICAgICAgJ0l0IGNvdW50cyBUT1RBTCBydW5zIGluY2x1ZGluZyB0aGUgZmlyc3QsIHNvIGBhdHRlbXB0czogM2AgbWVhbnMgb25lIHJ1biBwbHVzIHVwIHRvIHR3byByZXRyaWVzOyAnICtcbiAgICAgICAgJ2BhdHRlbXB0czogMWAgbWVhbnMgdGhlIHBvbGljeSBpcyBkZWNsYXJlZCBidXQgY3VycmVudGx5IG9mZi4nLFxuICAgICk7XG4gIH1cbiAgbm9kZS5yZXRyeSA9IHJldHJ5O1xuICBzcGVjLnJldHJ5QXR0ZW1wdHMgPSByZXRyeS5hdHRlbXB0cztcbn1cblxuLyoqXG4gKiBBdHRhY2ggZGVjbGFyZWQgdGFncyB0byBhIHN0YWdlIG5vZGUgKyBpdHMgc3BlYyBub2RlLlxuICpcbiAqIFRoZSBPTkUgcGxhY2UgdGFncyBsYW5kIG9uIGEgbm9kZSDigJQgdGhlIHR3aW4gb2Yge0BsaW5rIGFwcGx5UmV0cnlQb2xpY3l9IOKAlFxuICogc2hhcmVkIGJ5IHRoZSBgLnRhZygpYCBjdXJzb3IgbW9kaWZpZXIgYW5kIGV2ZXJ5IGBvcHRpb25zLnRhZ3NgIGRlY2xhcmF0aW9uXG4gKiBzaXRlLCBzbyB0aGUgcmVmdXNhbHMgYW5kIHRoZSBzcGVjJ3MgbWlycm9yIGNhbiBuZXZlciBkcmlmdCBiZXR3ZWVuIHRoZW0uXG4gKlxuICogQSB0YWcgaXMgYSBOQU1FIGRlY2xhcmVkIGF0IGJ1aWxkIHRpbWUsIG5ldmVyIGEgdmFsdWUsIHNvIGV2ZXJ5IHJlZnVzYWwgaXNcbiAqIGFib3V0IHRoZSBuYW1lJ3Mgc2hhcGU6IGFuIGVtcHR5IHN0cmluZyBuYW1lcyBub3RoaW5nOyBhIG5vbi1zdHJpbmcgaXMgYVxuICogdmFsdWUsIGFuZCBhIHZhbHVlIG9uIGEgc3RhZ2Ugd291bGQgcmlkZSB0aGUgY29tbWl0IGxvZyBwYXN0IGV2ZXJ5XG4gKiByZWRhY3Rpb24gcG9pbnQ7IHRoZSBicmFuY2gtc2VnbWVudCBtYXJrZXIgaXMgdGhlIHJ1bnRpbWVTdGFnZUlkIGdyYW1tYXInc1xuICogb25lIHJlc2VydmVkIGJ5dGUsIGFuZCBhIGNvbnN1bWVyIHRoYXQgcHV0cyBhIHRhZyBpbnRvIGEgcGF0aCAoYSBVUkwsIGFcbiAqIHN0b3JlIGtleSkgd291bGQgaW5oZXJpdCBleGFjdGx5IHRoZSBhbWJpZ3VpdHkgdGhlIHJlc2VydmF0aW9uIGV4aXN0cyB0b1xuICogcHJldmVudDsgYSBuYW1lIGRlY2xhcmVkIHR3aWNlIGlzIHRoZSB0eXBvIGl0IHVzdWFsbHkgaXMuIFJlZnVzZWQgYXQgQlVJTERcbiAqIHRpbWUsIGxpa2UgYHJldHJ5LmF0dGVtcHRzYCwgc28gdGhlIG1pc3Rha2UgZmFpbHMgd2hpbGUgdGhlIGNoYXJ0IGlzIGJlaW5nXG4gKiB3cml0dGVuLiBBbiBFTVBUWSBsaXN0IGxhbmRzIG5vdGhpbmc6IFwiYWJzZW50IHdoZW4gZW1wdHlcIiBpcyB0aGUgbGF3IHRoZVxuICogY29tbWl0IGJ1bmRsZSBrZWVwcywgYW5kIHRoZSBzcGVjIGtlZXBzIGl0IHRvby5cbiAqL1xuZnVuY3Rpb24gYXBwbHlUYWdzKFxuICBub2RlOiBTdGFnZU5vZGU8YW55LCBhbnk+LFxuICBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHRhZ3M6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICB3aGVyZTogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGlmICh0YWdzID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHRhZ3MpKSBmYWlsKGAke3doZXJlfTogdGFncyBtdXN0IGJlIGFuIGFycmF5IG9mIG5hbWVzIChnb3QgJHt0eXBlb2YgdGFnc30pYCk7XG4gIGlmICh0YWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICBpZiAodHlwZW9mIHRhZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGAke3doZXJlfTogYSB0YWcgbXVzdCBiZSBhIHN0cmluZyBuYW1lIChnb3QgJHt0YWcgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdGFnfSkuIEEgdGFnIGlzIGEgTkFNRSBgICtcbiAgICAgICAgICAnZGVjbGFyZWQgYXQgYnVpbGQgdGltZSDigJQgYSB2YWx1ZSBiZWxvbmdzIGluIHN0YXRlIG9yIGluICRlbWl0LCBuZXZlciBvbiB0aGUgc3RhZ2UuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0YWcudHJpbSgpLmxlbmd0aCA9PT0gMCkgZmFpbChgJHt3aGVyZX06IGEgdGFnIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmdgKTtcbiAgICBpZiAoaGFzQnJhbmNoU2VnbWVudE1hcmtlcih0YWcpKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgJHt3aGVyZX06IHRhZyAnJHt0YWd9JyBjb250YWlucyB0aGUgcmVzZXJ2ZWQgY2hhcmFjdGVyICcke0JSQU5DSF9TRUdNRU5UX01BUktFUn0nLiBgICtcbiAgICAgICAgICBgJyR7QlJBTkNIX1NFR01FTlRfTUFSS0VSfScgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBzdWJmbG93IHBhdGggc2VnbWVudHMgYWRkUGFyYWxsZWxGb3JFYWNoKCkgZ2VuZXJhdGVzLCBgICtcbiAgICAgICAgICAnYW5kIGEgdGFnIHRoYXQgYSBjb25zdW1lciBwdXRzIGludG8gYSBwYXRoIG9yIGEga2V5IHdvdWxkIGluaGVyaXQgdGhhdCBhbWJpZ3VpdHkuIFJlbmFtZSB0aGUgdGFnICcgK1xuICAgICAgICAgICcoYSBkYXNoIG9yIGEgY29sb24gcmVhZHMgdGhlIHNhbWUpLiBTZWUgZG9jcy9kZXNpZ24vMjAyNi0wOS1kZWNsYXJlZC10YWdzLm1kLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoc2Vlbi5oYXModGFnKSkgZmFpbChgJHt3aGVyZX06IHRhZyAnJHt0YWd9JyBpcyBkZWNsYXJlZCB0d2ljZWApO1xuICAgIHNlZW4uYWRkKHRhZyk7XG4gIH1cbiAgaWYgKG5vZGUudGFncykge1xuICAgIGZhaWwoXG4gICAgICBgJHt3aGVyZX06IHRhZ3MgYWxyZWFkeSBkZWNsYXJlZCBhdCAnJHtub2RlLm5hbWV9JyAoJHtub2RlLnRhZ3Muam9pbignLCAnKX0pIOKAlCBkZWNsYXJlIGV2ZXJ5IHRhZyBmb3IgYSBgICtcbiAgICAgICAgJ3N0YWdlIGluIE9ORSBwbGFjZSwgc28gdGhlIE1hcCBhZHZlcnRpc2VzIHRoZSB3aG9sZSB2b2NhYnVsYXJ5IGZyb20gYSBzaW5nbGUgc2l0ZS4nLFxuICAgICk7XG4gIH1cbiAgLy8gVGhlIG5vZGUncyBjb3B5IGlzIGZyb3plbjogY29tbWl0IGJ1bmRsZXMgc2hhcmUgaXQgYnkgcmVmZXJlbmNlIGFuZCB0aGVcbiAgLy8gbGlicmFyeSdzIHJlYWRzIGFyZSBib3Jyb3dlZCwgbmV2ZXIgbXV0YXRlZC4gVGhlIHNwZWMncyBjb3B5IGlzIGl0cyBvd25cbiAgLy8gcGxhaW4gYXJyYXksIEpTT04tc2FmZSBsaWtlIHRoZSByZXN0IG9mIHRoZSBzcGVjLlxuICBub2RlLnRhZ3MgPSBPYmplY3QuZnJlZXplKFsuLi50YWdzXSk7XG4gIHNwZWMudGFncyA9IFsuLi50YWdzXTtcbn1cblxuLyoqXG4gKiBUaGUgYnVpbGRlcidzIE9ORSBpZCByZWZ1c2FsIChGNywgUjUpOiBldmVyeSBpZCBkb29yIGNhbGxzIGl0IG9uY2UsIGJlZm9yZVxuICogdGhlIGlkIGxhbmRzIGFueXdoZXJlLiBUaGUgcnVsZSBsaXZlcyBiZXNpZGUgdGhlIGdyYW1tYXIg4oCUXG4gKiBgaWRzL3Jlc2VydmVkSWRzLnRzIMK3IHJlZnVzZVJlc2VydmVkSWRgOiBgI2AgYW5kIGAvYCBhcmUgcmVmdXNlZCBpblxuICogZXZlcnkgaWQgKHRoZXkgYXJlIHRoZSBydW50aW1lU3RhZ2VJZCBncmFtbWFyJ3MgZGVsaW1pdGVycyksIGB+YCBpbiBhXG4gKiBgJ3NlZ21lbnQnYCBpZCAoYSBzdWJmbG93IGlkIG9yIGEgYHBhcmFsbGVsRm9yRWFjaGAgaWQg4oCUIHNlZSBiZWxvdykuXG4gKlxuICogRG9vcnMgKG9uZSBjYWxsIGVhY2gpOiBgc3RhcnRgLCBgc3RhcnRTZWxlY3RvcmAsIGBhZGRGdW5jdGlvbmAsXG4gKiBgYWRkU3RyZWFtaW5nRnVuY3Rpb25gLCBgYWRkUGF1c2FibGVGdW5jdGlvbmAsIGBhZGREZWNpZGVyRnVuY3Rpb25gLFxuICogYGFkZFNlbGVjdG9yRnVuY3Rpb25gLCBgYWRkTGlzdE9mRnVuY3Rpb25gIChlYWNoIGNoaWxkKSwgYGFkZFBhcmFsbGVsRm9yRWFjaGAsXG4gKiBldmVyeSBzdWJmbG93IG1vdW50IChgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZGApIGFuZCBldmVyeSBkZWNpZGVyL3NlbGVjdG9yXG4gKiBicmFuY2ggKGBCcmFuY2hDdXJzb3IgwrcgYWRtaXRgKS4gYGFkZERldGFjaEFuZEZvcmdldGAgL1xuICogYGFkZERldGFjaEFuZEpvaW5MYXRlcmAgYW5kIGBhZGRCcmFuY2hMaXN0YCBkZWxlZ2F0ZSB0byBvbmUgb2YgdGhlc2UuXG4gKiBOZXZlciBjYWxsZWQgYnkgdGhlIHByZWZpeGVyIG9yIGEgc3RvcmUg4oCUIHRob3NlIGhvbGQgaWRzIHRoYXQgY2FycnkgdGhlXG4gKiBkZWxpbWl0ZXJzIG9uIHB1cnBvc2UuXG4gKi9cbmNvbnN0IGFkbWl0SWQgPSAod2hhdDogc3RyaW5nLCBpZDogc3RyaW5nLCBwb3NpdGlvbjogSWRQb3NpdGlvbik6IHZvaWQgPT4ge1xuICBjb25zdCByZWZ1c2FsID0gcmVmdXNlUmVzZXJ2ZWRJZCh3aGF0LCBpZCwgcG9zaXRpb24pO1xuICBpZiAocmVmdXNhbCAhPT0gdW5kZWZpbmVkKSBmYWlsKHJlZnVzYWwpO1xufTtcblxuLyoqXG4gKiBSZWZ1c2UgdGhlIHJlc2VydmVkIGNoYXJhY3RlcnMgaW4gYSB1c2VyLWF1dGhvcmVkIFNVQkZMT1cgaWQuXG4gKlxuICogQSBzdWJmbG93IGlkIElTIGEgcGF0aCBzZWdtZW50IGluIGBydW50aW1lU3RhZ2VJZGAsIHdoaWNoIGlzIHRoZSBzYW1lXG4gKiBwb3NpdGlvbiBgYWRkUGFyYWxsZWxGb3JFYWNoYCBnZW5lcmF0ZXMgaXRzIGJyYW5jaCBzZWdtZW50cyBpbnRvLiBBXG4gKiBoYW5kLWF1dGhvcmVkIGlkIGNhcnJ5aW5nIHRoZSBtYXJrZXIgY291bGQgdGhlcmVmb3JlIGNvbGxpZGUgd2l0aCBhXG4gKiBnZW5lcmF0ZWQgYnJhbmNoIOKAlCBhbmQsIGJlY2F1c2UgdGhpcyBjb2RlYmFzZSBkZWxpYmVyYXRlbHkgdG9sZXJhdGVzXG4gKiBpZC1jb2xsaXNpb24gY2xhc3NlcyAobG9vcC1yZWYgc3R1YnMpLCBzdWNoIGEgY29sbGlzaW9uIHdvdWxkIG5vdCBjcmFzaC4gSXRcbiAqIHdvdWxkIHNpbGVudGx5IG1pcy1hdHRyaWJ1dGUgYSB0cmFjZSwgd2hpY2ggaXMgd29yc2UuIFNvIHRoZSBtYXJrZXIgaXNcbiAqIHJlZnVzZWQgYXQgQlVJTEQgdGltZSwgb24gTkVXIGNoYXJ0cyBvbmx5OiBhIGNoYXJ0IHRoYXQgd2FzIGxlZ2FsIGJlZm9yZVxuICogOS4xNC4wIGFuZCBkb2VzIG5vdCB1c2UgdGhlIG1hcmtlciBiZWhhdmVzIGJ5dGUtaWRlbnRpY2FsbHkuXG4gKlxuICogQ2FsbGVkIGF0IGV2ZXJ5IHVzZXItYXV0aG9yZWQgc3ViZmxvdy1pZCBlbnRyeSBwb2ludC4gU3RhZ2UgaWRzIGVsc2V3aGVyZVxuICoga2VlcCBgfmAgKHRoZXkgb2NjdXB5IHRoZSBgc3RhZ2VJZGAgcG9zaXRpb24sIG5ldmVyIHRoZSBgc3ViZmxvd1BhdGhgXG4gKiBwb3NpdGlvbiwgc28gdGhleSBjYW5ub3QgY29sbGlkZSB3aXRoIGEgc2VnbWVudCkgYnV0LCBzaW5jZSA5LjM3LjAsIG5vdCBgI2BcbiAqIG9yIGAvYCDigJQgc2VlIGBhZG1pdElkYC4gKGBhZGRQYXJhbGxlbEZvckVhY2hgJ3Mgb3duIGlkIGlzIHRoZSBvbmUgb3RoZXJcbiAqIGAnc2VnbWVudCdgIGlkLCByZWZ1c2VkIGF0IHRoYXQgbWV0aG9kLikgRGVzaWduOiBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZC5cbiAqL1xuY29uc3QgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZCA9IChpZDogc3RyaW5nKTogdm9pZCA9PiBhZG1pdElkKCdzdWJmbG93IGlkJywgaWQsICdzZWdtZW50Jyk7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQnJhbmNoQ3Vyc29yIOKAlCB3aGF0IERlY2lkZXJMaXN0IGFuZCBTZWxlY3RvckZuTGlzdCBzaGFyZSAoRjcpXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFdoaWNoIGRpc3BhdGNoZXIgYSB7QGxpbmsgQnJhbmNoQ3Vyc29yfSBhZGRzIGJyYW5jaGVzIHVuZGVyLiAqL1xudHlwZSBCcmFuY2hLaW5kID0gJ2RlY2lkZXInIHwgJ3NlbGVjdG9yJztcblxuLyoqXG4gKiBUaGUgYnJhbmNoLWFkZGluZyBtZWNoYW5pY3Mgb2YgYSBkZWNpZGVyIG9yIGEgc2VsZWN0b3Ig4oCUIE9ORSBpbXBsZW1lbnRhdGlvbixcbiAqIGNvbXBvc2VkIGJ5IHtAbGluayBEZWNpZGVyTGlzdH0gYW5kIHtAbGluayBTZWxlY3RvckZuTGlzdH0gKHVudGlsIDkuMzYuMCBlYWNoXG4gKiBsaXN0IGNhcnJpZWQgaXRzIG93biBjb3B5IG9mIGFsbCBmb3VyIGJyYW5jaCBraW5kcyBhbmQgYGVuZCgpYCkuXG4gKlxuICogT3duczogdGhlIGJyYW5jaC1pZCBsZWRnZXIgKGR1cGxpY2F0ZSArIHJlc2VydmVkLWNoYXJhY3RlciByZWZ1c2FsIGluIG9uZVxuICogYGFkbWl0YCksIHRoZSBub2RlL3NwZWMgcGFpciBlYWNoIGJyYW5jaCBraW5kIGJ1aWxkcywgdGhlIHN0cnVjdHVyZSBldmVudHMsXG4gKiBhbmQgdGhlIGNsb3NpbmcgYGZpbmlzaGAuIFRoZSBsaXN0cyBrZWVwIG9ubHkgd2hhdCBkaWZmZXJzOiBhIGRlY2lkZXInc1xuICogYHsgbG9vcFRvIH1gIC8gYGxvb3BUbygpYCAvIGBzZXREZWZhdWx0YCwgYW5kIHRoZSB0eXBlIGVhY2ggbWV0aG9kIHJldHVybnMuXG4gKi9cbmNsYXNzIEJyYW5jaEN1cnNvcjxUT3V0LCBUU2NvcGU+IHtcbiAgcmVhZG9ubHkgYnJhbmNoSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnJhbmNoRGVzY0luZm86IEFycmF5PHsgaWQ6IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmcgfT4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGtpbmQ6IEJyYW5jaEtpbmQsXG4gICAgcmVhZG9ubHkgYjogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+LFxuICAgIHJlYWRvbmx5IGN1ck5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHJlYWRvbmx5IGN1clNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgICByZWFkb25seSBwYXJlbnREZXNjcmlwdGlvblBhcnRzOiBzdHJpbmdbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudFN0YWdlRGVzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzZXJ2ZWRTdGVwTnVtYmVyOiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBBIGRpc3BhdGNoZXIgaXMgZGVmaW5lZCBPTkNFLiBgZmluaXNoYCBmbGFncyBpdHMgbm9kZSwgYW5kIGZyb20gdGhlbiBvblxuICAgKiB0aGUgbm9kZSdzIGJyYW5jaGVzLCBpdHMgYGJyYW5jaElkc2AgYW5kIGl0cyBgb25EZWNpZGVyQ29tcGxldGVgIGFyZVxuICAgKiBmaW5hbC4gQSBsaXN0IGhlbGQgcGFzdCBgLmVuZCgpYCBjb3VsZCByZS1vcGVuIGl0IOKAlCBhIHNlY29uZCBgZW5kKClgXG4gICAqIGFwcGVuZGVkIGFub3RoZXIgYCdkZWZhdWx0J2AgY2xvbmUsIGZpcmVkIGEgc2Vjb25kIGNvbXBsZXRpb24gYW5kIHdyb3RlIGFcbiAgICogc2Vjb25kIGRlc2NyaXB0aW9uIGxpbmU7IGEgbGF0ZSBicmFuY2ggb3IgYGxvb3BUb2AgY2hhbmdlZCBhIG5vZGUgd2hvc2VcbiAgICogYGJyYW5jaElkc2Agd2VyZSBhbHJlYWR5IHB1Ymxpc2hlZC4gVGhpcyBpcyB0aGUgb25lIHNhbWUtbm9kZSByZWZ1c2FsLlxuICAgKiBUaGUgZ3VhcmQgdGhhdCBgYWRkRGVjaWRlckZ1bmN0aW9uYCAvIGBhZGRTZWxlY3RvckZ1bmN0aW9uYCBjYXJyaWVkIHVudGlsXG4gICAqIDEwLjAuMSByZWFkIHRoZSBQUkVWSU9VUyBub2RlJ3MgZmxhZ3MgaW5zdGVhZCwgYW5kIHNvIHJlZnVzZWQgYSBkaXNwYXRjaGVyXG4gICAqIHRoYXQgZm9sbG93cyBhIGRpc3BhdGNoZXIg4oCUIGEgY2hhaW4sIHdoaWNoIGlzIGEgbmV3IG5vZGUgYXQgaXRzIGBuZXh0YC5cbiAgICovXG4gIGFzc2VydE9wZW4oYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJOb2RlLmRlY2lkZXJGbiB8fCB0aGlzLmN1ck5vZGUuc2VsZWN0b3JGbikge1xuICAgICAgZmFpbChgY2Fubm90ICR7YWN0aW9ufTogJHt0aGlzLmtpbmR9ICcke3RoaXMuY3VyTm9kZS5uYW1lfScgd2FzIGFscmVhZHkgY2xvc2VkIGJ5IGVuZCgpYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBvbmUgYnJhbmNoLWlkIGRvb3I6IGEgY2xvc2VkIGRpc3BhdGNoZXIsIGEgZHVwbGljYXRlLCB0aGVuIHRoZSByZXNlcnZlZCBjaGFyYWN0ZXJzIChSNSkuICovXG4gIHByaXZhdGUgYWRtaXQoaWQ6IHN0cmluZywgcG9zaXRpb246IElkUG9zaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLmFzc2VydE9wZW4oYGFkZCBicmFuY2ggJyR7aWR9J2ApO1xuICAgIGlmICh0aGlzLmJyYW5jaElkcy5oYXMoaWQpKSBmYWlsKGBkdXBsaWNhdGUgJHt0aGlzLmtpbmR9IGJyYW5jaCBpZCAnJHtpZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfSdgKTtcbiAgICBpZiAocG9zaXRpb24gPT09ICdzZWdtZW50JykgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZChpZCk7XG4gICAgZWxzZSBhZG1pdElkKCdicmFuY2ggaWQnLCBpZCwgJ3N0YWdlJyk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcbiAgfVxuXG4gIC8qKiBBcHBlbmQgdGhlIGJyYW5jaCdzIG5vZGUgKyBzcGVjIGFuZCBmaXJlIGl0cyBzdGFnZSBhbmQgZGVjaXNpb24tYnJhbmNoIGVkZ2UuICovXG4gIHByaXZhdGUgYXR0YWNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsIGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIC8vIEw3LjMg4oCUIGJyYW5jaDogc3RhZ2UgKyBkZWNpc2lvbi1icmFuY2ggZWRnZSBrZXllZCBieSBpZC5cbiAgICB0aGlzLmIuX2ZpcmVTdGFnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoc3BlYyk7XG4gICAgdGhpcy5iLl9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCBzcGVjLmlkLCAnZGVjaXNpb24tYnJhbmNoJywgaWQpO1xuICB9XG5cbiAgZnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IHsgcmVhZG9ubHkgcmV0cnk/OiBSZXRyeVBvbGljeTsgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQsXG4gICk6IHsgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB9IHtcbiAgICB0aGlzLmFkbWl0KGlkLCAnc3RhZ2UnKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgYnJhbmNoSWQ6IGlkIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgaWYgKGZuKSB7XG4gICAgICBub2RlLmZuID0gZm47XG4gICAgfVxuICAgIHRoaXMuYi5fcmVnaXN0ZXJTdGFnZShpZCwgZm4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgdHlwZTogJ3N0YWdlJyB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGFwcGx5UmV0cnlQb2xpY3kobm9kZSwgc3BlYywgb3B0aW9ucz8ucmV0cnksIGBhZGRGdW5jdGlvbkJyYW5jaCgnJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkRnVuY3Rpb25CcmFuY2goJyR7aWR9JylgKTtcblxuICAgIHRoaXMuYXR0YWNoKG5vZGUsIHNwZWMsIGlkKTtcbiAgICB0aGlzLmJyYW5jaERlc2NJbmZvLnB1c2goeyBpZCwgZGVzY3JpcHRpb24gfSk7XG4gICAgcmV0dXJuIHsgbm9kZSwgc3BlYyB9O1xuICB9XG5cbiAgcGF1c2FibGVCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiB7IHJlYWRvbmx5IHJldHJ5PzogUmV0cnlQb2xpY3k7IHJlYWRvbmx5IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkLFxuICApOiB7IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+OyBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfSB7XG4gICAgdGhpcy5hZG1pdChpZCwgJ3N0YWdlJyk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IG5hbWUgPz8gaWQsXG4gICAgICBpZCxcbiAgICAgIGJyYW5jaElkOiBpZCxcbiAgICAgIGZuOiBoYW5kbGVyLmV4ZWN1dGUgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgICAgaXNQYXVzYWJsZTogdHJ1ZSxcbiAgICAgIHJlc3VtZUZuOiBoYW5kbGVyLnJlc3VtZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuYi5fYWRkVG9NYXAoaWQsIGhhbmRsZXIuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lOiBuYW1lID8/IGlkLCBpZCwgdHlwZTogJ3N0YWdlJywgaXNQYXVzYWJsZTogdHJ1ZSB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGFwcGx5UmV0cnlQb2xpY3kobm9kZSwgc3BlYywgb3B0aW9ucz8ucmV0cnksIGBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKCcke2lkfScpYCk7XG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKCcke2lkfScpYCk7XG5cbiAgICB0aGlzLmF0dGFjaChub2RlLCBzcGVjLCBpZCk7XG4gICAgdGhpcy5icmFuY2hEZXNjSW5mby5wdXNoKHsgaWQsIGRlc2NyaXB0aW9uIH0pO1xuICAgIHJldHVybiB7IG5vZGUsIHNwZWMgfTtcbiAgfVxuXG4gIHN1YmZsb3dCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYWRtaXQoaWQsICdzZWdtZW50Jyk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICB0aGlzLmIuX21vdW50U3ViZmxvdyhpZCwgc3ViZmxvdywgKCkgPT4gdGhpcy5wbGFjZVN1YmZsb3dCcmFuY2goaWQsIHN1YmZsb3csIHN1YmZsb3dOYW1lLCBvcHRpb25zKSk7XG4gIH1cblxuICAvKiogVGhlIGJyYW5jaCBtb3VudCdzIG93biBub2RlICsgc3BlYywgcGxhY2VkIHVuZGVyIHRoZSBkZWNpZGVyL3NlbGVjdG9yIChzZWUgYF9tb3VudFN1YmZsb3dgKS4gKi9cbiAgcHJpdmF0ZSBwbGFjZVN1YmZsb3dCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIHN1YmZsb3dOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogU3ViZmxvd01vdW50T3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIGlkLFxuICAgICAgYnJhbmNoSWQ6IGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1N0cnVjdHVyZTogc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgfTtcbiAgICAvLyBTVFJVQ1RVUkUtT05MWSBjb252ZXJnZW5jZSBvdmVycmlkZSAoc2VlIGBfZmlyZU5leHRFZGdlRnJvbVBhcmVudGAgK1xuICAgIC8vIGBTdWJmbG93TW91bnRPcHRpb25zLmNvbnZlcmdlQXRgKTogdGhpcyBicmFuY2gncyBjb252ZXJnZW5jZSBlZGdlIHBvaW50cyBhdFxuICAgIC8vIGBjb252ZXJnZUF0YCAoYSBET1dOU1RSRUFNIHN0YWdlKSBpbnN0ZWFkIG9mIHRoZSBzaGFyZWQgbmV4dCBzdGFnZSDigJQgZS5nLiBhXG4gICAgLy8gYHRvb2xzYCBzbG90IHRoYXQgYnlwYXNzZXMgYG1lc3NhZ2VBUElgIHRvIHBhaXIgd2l0aCBpdHMgb3V0cHV0IGF0XG4gICAgLy8gYGNhbGwtbGxtYC4gVmlzdWFsaXphdGlvbi1vbmx5OiBOTyBydW50aW1lIGpvaW4gYmFycmllciAoZGF0YSByaWRlcyBzY29wZSkuXG4gICAgLy8gQ2FycmllZCBvbiB0aGUgc3BlYyBzbyB0aGUgZWRnZS1maXJpbmcgY2hva2Vwb2ludCBjYW4gcmVhZCBpdC5cbiAgICBpZiAob3B0aW9ucz8uY29udmVyZ2VBdCkgc3BlYy5jb252ZXJnZUF0ID0gb3B0aW9ucy5jb252ZXJnZUF0O1xuXG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRTdWJGbG93Q2hhcnRCcmFuY2goJyR7aWR9JylgKTtcblxuICAgIHRoaXMuYXR0YWNoKG5vZGUsIHNwZWMsIGlkKTtcbiAgICB0aGlzLmIuX2ZpcmVTdWJmbG93TW91bnRlZEZyb21TdWJCdWlsZGVyKGlkLCBzdWJmbG93TmFtZSwgaWQsIGZhbHNlLCBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSk7XG4gIH1cblxuICBsYXp5U3ViZmxvd0JyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYWRtaXQoaWQsICdzZWdtZW50Jyk7XG4gICAgdGhpcy5iLl9jbGFpbUZyZXNoSWQoaWQsIGBhZGRMYXp5U3ViRmxvd0NoYXJ0QnJhbmNoKCcke2lkfScpYCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcblxuICAgIC8vIFN0b3JlIHJlc29sdmVyIG9uIHRoZSBub2RlIOKAlCBOTyBlYWdlciB0cmVlIGNsb25pbmdcbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBicmFuY2hJZDogaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1Jlc29sdmVyOiByZXNvbHZlciBhcyBhbnksXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgIC8vIFNwZWMgc3R1YiDigJQgbm8gc3ViZmxvd1N0cnVjdHVyZSAobGF6eSkuIFRoZSBsYXp5IHN1YmZsb3cnc1xuICAgIC8vIGludGVybmFscyB3aWxsIGJlIHNoYXBlZCBhdCByZXNvbHV0aW9uIHRpbWUuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgaXNMYXp5OiB0cnVlLFxuICAgIH07XG5cbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZExhenlTdWJGbG93Q2hhcnRCcmFuY2goJyR7aWR9JylgKTtcblxuICAgIHRoaXMuYXR0YWNoKG5vZGUsIHNwZWMsIGlkKTtcbiAgICB0aGlzLmIuX2ZpcmVTdWJmbG93TW91bnRlZEZyb21TdWJCdWlsZGVyKGlkLCBzdWJmbG93TmFtZSwgaWQsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBkaXNwYXRjaGVyOiB2YWxpZGF0ZSB0aGUgYnJhbmNoZXMsIGZsYWcgdGhlIG5vZGUsIGRlc2NyaWJlIGl0LFxuICAgKiBhbmQgZmlyZSBgb25EZWNpZGVyQ29tcGxldGVgLiBBIGRlY2lkZXIgcGFzc2VzIGl0cyBgc2V0RGVmYXVsdGAgaWQgKHRoZVxuICAgKiBzeW50aGV0aWMgYCdkZWZhdWx0J2AgY2xvbmUgaXMgYXBwZW5kZWQgQUZURVIgYGJyYW5jaElkc2AgaXMgdGFrZW4sIHNvIG9ubHlcbiAgICogdXNlci1zcGVjaWZpZWQgYnJhbmNoZXMgYXJlIGxpc3RlZCk7IGEgc2VsZWN0b3IgaGFzIG5vIGRlZmF1bHQuXG4gICAqL1xuICBmaW5pc2goZGVmYXVsdElkPzogc3RyaW5nKTogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+IHtcbiAgICB0aGlzLmFzc2VydE9wZW4oJ2NhbGwgZW5kKCkgYWdhaW4nKTtcbiAgICBjb25zdCBraW5kID0gdGhpcy5raW5kO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuO1xuICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtGbG93Q2hhcnRCdWlsZGVyXSAke2tpbmR9IGF0ICcke3RoaXMuY3VyTm9kZS5uYW1lfScgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGJyYW5jaGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgZXZlcnkgYnJhbmNoIHdpdGggbm8gZW1iZWRkZWQgZm4gaXMgcmVzb2x2YWJsZSBmcm9tIHRoZSBzdGFnZU1hcFxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQuZm4gJiYgY2hpbGQuaWQgJiYgIWNoaWxkLmlzU3ViZmxvd1Jvb3QgJiYgIWNoaWxkLnN1YmZsb3dSZXNvbHZlcikge1xuICAgICAgICBjb25zdCBoYXNJbk1hcCA9IHRoaXMuYi5fc3RhZ2VNYXBIYXMoY2hpbGQuaWQpIHx8IHRoaXMuYi5fc3RhZ2VNYXBIYXMoY2hpbGQubmFtZSk7XG4gICAgICAgIGlmICghaGFzSW5NYXApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgW0Zsb3dDaGFydEJ1aWxkZXJdICR7a2luZH0gYnJhbmNoICcke2NoaWxkLmlkfScgdW5kZXIgJyR7dGhpcy5jdXJOb2RlLm5hbWV9JyBoYXMgbm8gZnVuY3Rpb24g4oCUIGAgK1xuICAgICAgICAgICAgICBgcHJvdmlkZSBhIGZuIGFyZ3VtZW50IHRvIGFkZEZ1bmN0aW9uQnJhbmNoKCcke2NoaWxkLmlkfScsIC4uLilgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2luZCA9PT0gJ2RlY2lkZXInKSB0aGlzLmN1ck5vZGUuZGVjaWRlckZuID0gdHJ1ZTtcbiAgICBlbHNlIHRoaXMuY3VyTm9kZS5zZWxlY3RvckZuID0gdHJ1ZTtcblxuICAgIHRoaXMuY3VyU3BlYy5icmFuY2hJZHMgPSBjaGlsZHJlblxuICAgICAgLm1hcCgoYykgPT4gYy5pZClcbiAgICAgIC5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCk7XG4gICAgdGhpcy5jdXJTcGVjLnR5cGUgPSBraW5kO1xuICAgIGlmIChraW5kID09PSAnc2VsZWN0b3InKSB0aGlzLmN1clNwZWMuaGFzU2VsZWN0b3IgPSB0cnVlO1xuXG4gICAgaWYgKGRlZmF1bHRJZCkge1xuICAgICAgY29uc3QgZGVmYXVsdENoaWxkID0gY2hpbGRyZW4uZmluZCgoYykgPT4gYy5pZCA9PT0gZGVmYXVsdElkKTtcbiAgICAgIGlmIChkZWZhdWx0Q2hpbGQpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaCh7IC4uLmRlZmF1bHRDaGlsZCwgaWQ6ICdkZWZhdWx0JywgYnJhbmNoSWQ6ICdkZWZhdWx0JyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXIgPiAwKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IHRoaXMuY3VyTm9kZS5uYW1lO1xuICAgICAgY29uc3QgYnJhbmNoSWRMaXN0ID0gdGhpcy5icmFuY2hEZXNjSW5mby5tYXAoKGIpID0+IGIuaWQpLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBtYWluTGluZSA9XG4gICAgICAgIGtpbmQgPT09ICdkZWNpZGVyJ1xuICAgICAgICAgID8gdGhpcy5kZXNjcmlwdGlvblxuICAgICAgICAgICAgPyBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7bGFiZWx9IOKAlCAke3RoaXMuZGVzY3JpcHRpb259IChicmFuY2hlczogJHticmFuY2hJZExpc3R9KWBcbiAgICAgICAgICAgIDogYCR7dGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXJ9LiAke2xhYmVsfSDigJQgRGVjaWRlcyBiZXR3ZWVuOiAke2JyYW5jaElkTGlzdH1gXG4gICAgICAgICAgOiB0aGlzLmRlc2NyaXB0aW9uXG4gICAgICAgICAgPyBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7bGFiZWx9IOKAlCAke3RoaXMuZGVzY3JpcHRpb259YFxuICAgICAgICAgIDogYCR7dGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXJ9LiAke2xhYmVsfSDigJQgU2VsZWN0cyBmcm9tOiAke2JyYW5jaElkTGlzdH1gO1xuICAgICAgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2gobWFpbkxpbmUpO1xuXG4gICAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnBhcmVudFN0YWdlRGVzY3JpcHRpb25zLnNldCh0aGlzLmN1ck5vZGUubmFtZSwgdGhpcy5kZXNjcmlwdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgYnJhbmNoIG9mIHRoaXMuYnJhbmNoRGVzY0luZm8pIHtcbiAgICAgICAgaWYgKGJyYW5jaC5kZXNjcmlwdGlvbikgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgIOKGkiAke2JyYW5jaC5pZH06ICR7YnJhbmNoLmRlc2NyaXB0aW9ufWApO1xuICAgICAgICBpZiAoYnJhbmNoLmRlc2NyaXB0aW9uKSB0aGlzLnBhcmVudFN0YWdlRGVzY3JpcHRpb25zLnNldChicmFuY2guaWQsIGJyYW5jaC5kZXNjcmlwdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTDcuMyDigJQgZmlyZSBgb25EZWNpZGVyQ29tcGxldGVgIHNvIGNvbnN1bWVycyBjYW4gdHJ1c3Qgbm8gbW9yZVxuICAgIC8vIGJyYW5jaGVzIHdpbGwgYXJyaXZlLiBCcmFuY2ggaXRlcmF0aW9uIG9yZGVyID0gYWRkaXRpb24gb3JkZXIgPSBTZXRcbiAgICAvLyBpbnNlcnRpb24gb3JkZXIuIFNlbGVjdG9ycyBoYXZlIG5vIGRlZmF1bHQgYnJhbmNoLlxuICAgIGlmIChraW5kID09PSAnZGVjaWRlcicpIHtcbiAgICAgIHRoaXMuYi5fZmlyZURlY2lkZXJDb21wbGV0ZUZyb21TdWJCdWlsZGVyKHRoaXMuY3VyU3BlYy5pZCwgJ2RlY2lkZXInLCBbLi4udGhpcy5icmFuY2hJZHNdLCBkZWZhdWx0SWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmIuX2ZpcmVEZWNpZGVyQ29tcGxldGVGcm9tU3ViQnVpbGRlcih0aGlzLmN1clNwZWMuaWQsICdzZWxlY3RvcicsIFsuLi50aGlzLmJyYW5jaElkc10pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRGVjaWRlckxpc3Rcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEZsdWVudCBoZWxwZXIgcmV0dXJuZWQgYnkgYWRkRGVjaWRlckZ1bmN0aW9uIHRvIGFkZCBicmFuY2hlcy5cbiAqIGBlbmQoKWAgc2V0cyBgZGVjaWRlckZuID0gdHJ1ZWAg4oCUIHRoZSBmbiBJUyB0aGUgZGVjaWRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIERlY2lkZXJMaXN0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnNvcjogQnJhbmNoQ3Vyc29yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgZGVmYXVsdElkPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1aWxkZXI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPixcbiAgICBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10gPSBbXSxcbiAgICBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKSxcbiAgICByZXNlcnZlZFN0ZXBOdW1iZXIgPSAwLFxuICAgIGRlY2lkZXJEZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5jdXJzb3IgPSBuZXcgQnJhbmNoQ3Vyc29yKFxuICAgICAgJ2RlY2lkZXInLFxuICAgICAgYnVpbGRlcixcbiAgICAgIGN1ck5vZGUsXG4gICAgICBjdXJTcGVjLFxuICAgICAgcGFyZW50RGVzY3JpcHRpb25QYXJ0cyxcbiAgICAgIHBhcmVudFN0YWdlRGVzY3JpcHRpb25zLFxuICAgICAgcmVzZXJ2ZWRTdGVwTnVtYmVyLFxuICAgICAgZGVjaWRlckRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICBhZGRGdW5jdGlvbkJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICAvKiogYHsgbG9vcFRvIH1gIGRlY2xhcmVzIHRoaXMgYnJhbmNoIGxvb3BzIGJhY2sgdG8gYW4gYWxyZWFkeS1kZWNsYXJlZFxuICAgICAqICBzdGFnZSDigJQgdGhlIGxvb3AgaXMgU09VUkNFRCBGUk9NIFRISVMgQlJBTkNIIChub3QgdGhlIGRlY2lkZXIpLlxuICAgICAqICBgeyByZXRyeSB9YCBnaXZlcyBUSElTIEJSQU5DSCdzIHN0YWdlIGEgZGVjbGFyYXRpdmUgcmV0cnkgcG9saWN5O1xuICAgICAqICBgeyB0YWdzIH1gIHB1dHMgZGVjbGFyZWQgdGFncyBvbiBpdCAoc2VlIGBGbG93Q2hhcnRCdWlsZGVyLnRhZ2ApLiAqL1xuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IGxvb3BUbz86IHN0cmluZzsgcmVhZG9ubHkgcmV0cnk/OiBSZXRyeVBvbGljeTsgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHsgbm9kZSwgc3BlYyB9ID0gdGhpcy5jdXJzb3IuZnVuY3Rpb25CcmFuY2goaWQsIG5hbWUsIGZuLCBkZXNjcmlwdGlvbiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnM/Lmxvb3BUbykgdGhpcy5fYXBwbHlCcmFuY2hMb29wKG5vZGUsIHNwZWMsIG9wdGlvbnMubG9vcFRvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXVzYWJsZSBzdGFnZSBhcyBhIGRlY2lkZXIgYnJhbmNoLlxuICAgKlxuICAgKiBXaGVuIHRoaXMgYnJhbmNoIGlzIGNob3NlbiwgdGhlIGhhbmRsZXIncyBgZXhlY3V0ZWAgcnVucy4gSWYgaXQgcmV0dXJuc1xuICAgKiBkYXRhLCB0aGUgcGlwZWxpbmUgcGF1c2VzLiBPbiByZXN1bWUsIGBoYW5kbGVyLnJlc3VtZWAgcnVucyB3aXRoIHRoZVxuICAgKiBodW1hbidzIGlucHV0LiBJZiBgZXhlY3V0ZWAgcmV0dXJucyB2b2lkLCB0aGUgc3RhZ2UgY29udGludWVzIG5vcm1hbGx5XG4gICAqIChjb25kaXRpb25hbCBwYXVzZSkuXG4gICAqL1xuICBhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyBsb29wVG8gfWAgZGVjbGFyZXMgdGhpcyBicmFuY2ggbG9vcHMgYmFjayB0byBhbiBhbHJlYWR5LWRlY2xhcmVkXG4gICAgICogIHN0YWdlIOKAlCB0aGUgbG9vcCBpcyBTT1VSQ0VEIEZST00gVEhJUyBCUkFOQ0ggKG5vdCB0aGUgZGVjaWRlcikuXG4gICAgICogIGB7IHJldHJ5IH1gIGdpdmVzIFRISVMgQlJBTkNIJ3MgYGV4ZWN1dGVgIGhhbGYgYSByZXRyeSBwb2xpY3kgKHRoZVxuICAgICAqICBgcmVzdW1lYCBoYWxmIHJ1bnMgd2l0aG91dCBpdCDigJQgYSBkaWZmZXJlbnQgZnVuY3Rpb24sIGEgZGlmZmVyZW50XG4gICAgICogIGNvbnRyYWN0KTsgYHsgdGFncyB9YCBwdXRzIGRlY2xhcmVkIHRhZ3Mgb24gaXQuICovXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbG9vcFRvPzogc3RyaW5nOyByZWFkb25seSByZXRyeT86IFJldHJ5UG9saWN5OyByZWFkb25seSB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgeyBub2RlLCBzcGVjIH0gPSB0aGlzLmN1cnNvci5wYXVzYWJsZUJyYW5jaChpZCwgbmFtZSwgaGFuZGxlciwgZGVzY3JpcHRpb24sIG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zPy5sb29wVG8pIHRoaXMuX2FwcGx5QnJhbmNoTG9vcChub2RlLCBzcGVjLCBvcHRpb25zLmxvb3BUbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3Iuc3ViZmxvd0JyYW5jaChpZCwgc3ViZmxvdywgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIHRoaXMuY3Vyc29yLmxhenlTdWJmbG93QnJhbmNoKGlkLCByZXNvbHZlciwgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEJyYW5jaExpc3QoXG4gICAgYnJhbmNoZXM6IEFycmF5PHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICB9PixcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiB9IG9mIGJyYW5jaGVzKSB7XG4gICAgICB0aGlzLmFkZEZ1bmN0aW9uQnJhbmNoKGlkLCBuYW1lLCBmbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGVmYXVsdChpZDogc3RyaW5nKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3IuYXNzZXJ0T3Blbihgc2V0RGVmYXVsdCgnJHtpZH0nKWApO1xuICAgIHRoaXMuZGVmYXVsdElkID0gaWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGEgbG9vcC1iYWNrIGVkZ2UgdG8gdGhlIExBU1QtYWRkZWQgYnJhbmNoLCBzbyB0aGUgbG9vcCBpcyBzb3VyY2VkXG4gICAqIGZyb20gVEhBVCBicmFuY2ggbm9kZSAoZS5nLiBgJ3Rvb2wtY2FsbHMnIOKGkiBsb29wVG8oJ2NvbnRleHQnKWApIHJhdGhlciB0aGFuXG4gICAqIGZyb20gdGhlIGRlY2lkZXIuIFRoZSBjaGFydCB0aGVuIHJlYWRzIGhvbmVzdGx5OiB0aGUgZGVjaWRlciBzcGxpdHMgaW50byBhXG4gICAqIGxvb3BpbmcgYnJhbmNoIGBbVG9vbENhbGxzIOKGkiBiYWNrIHRvIENvbnRleHRdYCBhbmQgYSB0ZXJtaW5hdGluZyBicmFuY2hcbiAgICogYFtGaW5hbCDihpIgZW5kXWAsIGluc3RlYWQgb2YgYSBzaW5nbGUgbG9vcCBoYW5naW5nIG9mZiB0aGUgZGVjaWRlci5cbiAgICpcbiAgICogTm8gZW5naW5lIGNoYW5nZSBpcyBuZWVkZWQ6IHRoZSBydW50aW1lIHJ1bnMgdGhlIGNob3NlbiBicmFuY2ggYW5kIHRoZW5cbiAgICogZm9sbG93cyB0aGF0IGJyYW5jaCBub2RlJ3MgT1dOIGBuZXh0YCDigJQgYW5kIGEgYG5leHRgIGZsYWdnZWQgYGlzTG9vcFJlZmBcbiAgICogcm91dGVzIGJhY2sgdG8gdGhlIHRhcmdldCBleGFjdGx5IGxpa2UgdGhlIGRlY2lkZXIncyBvd24gbG9vcCBkb2VzLiBUaGlzXG4gICAqIG1ldGhvZCBqdXN0IGxldHMgdGhlIGJ1aWxkZXIgZXhwcmVzcyB3aGF0IHRoZSBlbmdpbmUgYWxyZWFkeSBzdXBwb3J0cy5cbiAgICpcbiAgICogVGFyZ2V0cyB0aGUgYnJhbmNoIGFkZGVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGNhbGwgKGNoYWluIGl0IHJpZ2h0IGFmdGVyXG4gICAqIHRoZSBicmFuY2gncyBgYWRkRnVuY3Rpb25CcmFuY2hgL2BhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoYC9cbiAgICogYGFkZFN1YkZsb3dDaGFydEJyYW5jaGApLiBNaXJyb3JzIGBGbG93Q2hhcnRCdWlsZGVyLmxvb3BUb2AgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogV29ya3Mgb24gYSBTVUJGTE9XIGJyYW5jaCB0b286IHRoZSBicmFuY2ggbm9kZSBjYXJyaWVzIGJvdGggaXRzIHN1YmZsb3dcbiAgICogcmVzb2x2ZXIgQU5EIHRoZSBsb29wLWJhY2sgYG5leHRgIOKAlCB0aGV5IGNvZXhpc3Qgc2FmZWx5ICh0aGUgcnVudGltZSBydW5zXG4gICAqIHRoZSBzdWJmbG93LCB0aGVuIGZvbGxvd3MgdGhlIGxvb3AgcmVmKS4gVGhlIHRhcmdldCBtdXN0IGJlIGEgc3RhZ2UgYWxyZWFkeVxuICAgKiBkZWNsYXJlZCBCRUZPUkUgdGhlIGRlY2lkZXIgKGUuZy4gYW4gdXBzdHJlYW0gYGNvbnRleHRgKTsgYnJhbmNoIGlkcyBhbmQgdGhlXG4gICAqIHN5bnRoZXRpYyBgJ2RlZmF1bHQnYCBjbG9uZSBhcmUgTk9UIHZhbGlkIGxvb3AgdGFyZ2V0cy5cbiAgICovXG4gIGxvb3BUbyhzdGFnZUlkOiBzdHJpbmcpOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICB0aGlzLmN1cnNvci5hc3NlcnRPcGVuKGBsb29wVG8oJyR7c3RhZ2VJZH0nKWApO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jdXJzb3IuY3VyTm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBzcGVjQ2hpbGRyZW4gPSB0aGlzLmN1cnNvci5jdXJTcGVjLmNoaWxkcmVuO1xuICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8ICFzcGVjQ2hpbGRyZW4gfHwgc3BlY0NoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZmFpbChgbG9vcFRvKCcke3N0YWdlSWR9JykgY2FsbGVkIGJlZm9yZSBhbnkgYnJhbmNoIHdhcyBhZGRlZCB1bmRlciAnJHt0aGlzLmN1cnNvci5jdXJOb2RlLm5hbWV9J2ApO1xuICAgIH1cbiAgICAvLyBmYWlsKCkgdGhyb3dzLCBzbyBjaGlsZHJlbi9zcGVjQ2hpbGRyZW4gYXJlIG5vbi1lbXB0eSBoZXJlLlxuICAgIHRoaXMuX2FwcGx5QnJhbmNoTG9vcChjaGlsZHJlbiFbY2hpbGRyZW4hLmxlbmd0aCAtIDFdISwgc3BlY0NoaWxkcmVuIVtzcGVjQ2hpbGRyZW4hLmxlbmd0aCAtIDFdISwgc3RhZ2VJZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVjb3JhdGUgT05FIGJyYW5jaCBub2RlL3NwZWMgd2l0aCBhIGxvb3AtYmFjayBlZGdlIHRvIGBzdGFnZUlkYC4gU2hhcmVkIGJ5XG4gICAqIHRoZSBwb3NpdGlvbmFsIGBsb29wVG8oKWAgKHdoaWNoIHRhcmdldHMgdGhlIGxhc3QtYWRkZWQgYnJhbmNoKSBBTkQgdGhlXG4gICAqIHBlci1icmFuY2ggYHsgbG9vcFRvIH1gIG9wdGlvbiBvbiBgYWRkRnVuY3Rpb25CcmFuY2hgIC9cbiAgICogYGFkZFBhdXNhYmxlRnVuY3Rpb25CcmFuY2hgIC8gYGFkZFN1YkZsb3dDaGFydEJyYW5jaGAuIEVpdGhlciB3YXkgdGhlIGxvb3BcbiAgICogU09VUkNFIGlzIHRoZSBicmFuY2gg4oCUIHNvIHZpc3VhbGl6ZXJzIHJlYWQgYHRvb2wtY2FsbHMg4oaSIGNvbnRleHRgLCBuZXZlclxuICAgKiBgUm91dGUg4oaSIGNvbnRleHRgLiBWYWxpZGF0ZXMgdGhlIHRhcmdldCBpcyBhIHN0YWdlIGRlY2xhcmVkIEJFRk9SRSB0aGVcbiAgICogZGVjaWRlciAoYnJhbmNoIGlkcyAvIHRoZSBzeW50aGV0aWMgJ2RlZmF1bHQnIGNsb25lIGFyZSBub3QgdmFsaWQgdGFyZ2V0cykuXG4gICAqL1xuICBwcml2YXRlIF9hcHBseUJyYW5jaExvb3AoXG4gICAgYnJhbmNoTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgYnJhbmNoU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKGJyYW5jaFNwZWMubG9vcFRhcmdldCkgZmFpbChgbG9vcFRvIGFscmVhZHkgZGVmaW5lZCBvbiBicmFuY2ggJyR7YnJhbmNoU3BlYy5pZH0nYCk7XG4gICAgaWYgKGJyYW5jaE5vZGUubmV4dCkge1xuICAgICAgZmFpbChgY2Fubm90IHNldCBsb29wVG8gb24gYnJhbmNoICcke2JyYW5jaFNwZWMuaWR9JyDigJQgaXQgYWxyZWFkeSBoYXMgYSBjb250aW51YXRpb25gKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmN1cnNvci5iLl9rbm93blN0YWdlSWRzSGFzKHN0YWdlSWQpKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgbG9vcFRvKCcke3N0YWdlSWR9JykgdGFyZ2V0IG5vdCBmb3VuZCDigJQgYSBicmFuY2ggbG9vcCBtdXN0IHRhcmdldCBhIHN0YWdlIGAgK1xuICAgICAgICAgIFwiZGVjbGFyZWQgQkVGT1JFIHRoZSBkZWNpZGVyIChicmFuY2ggaWRzIGFuZCB0aGUgc3ludGhldGljICdkZWZhdWx0JyBicmFuY2ggXCIgK1xuICAgICAgICAgICdhcmUgbm90IHZhbGlkIGxvb3AgdGFyZ2V0czsgZGlkIHlvdSBwYXNzIGEgc3RhZ2UgbmFtZSBpbnN0ZWFkIG9mIGFuIGlkPyknLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBicmFuY2hOb2RlLm5leHQgPSB7IG5hbWU6IHN0YWdlSWQsIGlkOiBzdGFnZUlkLCBpc0xvb3BSZWY6IHRydWUgfTtcbiAgICBicmFuY2hTcGVjLmxvb3BUYXJnZXQgPSBzdGFnZUlkO1xuICAgIGJyYW5jaFNwZWMubmV4dCA9IHsgbmFtZTogc3RhZ2VJZCwgaWQ6IHN0YWdlSWQsIHR5cGU6ICdsb29wJywgaXNMb29wUmVmZXJlbmNlOiB0cnVlIH07XG5cbiAgICAvLyBCcmFuY2gtc2NvcGVkIGRlc2NyaXB0aW9uIOKAlCBhdHRyaWJ1dGUgdGhlIGxvb3AgdG8gdGhlIGJyYW5jaCwgbm90IHRoZVxuICAgIC8vIGRlY2lkZXIgKHBhcmVudERlc2NyaXB0aW9uUGFydHMgaXMgdGhlIGRlY2lkZXIncyBkZXNjcmlwdGlvbiBjb250ZXh0KS5cbiAgICB0aGlzLmN1cnNvci5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgIOKGkiBicmFuY2ggJyR7YnJhbmNoU3BlYy5pZH0nIGxvb3BzIGJhY2sgdG8gJHtzdGFnZUlkfWApO1xuXG4gICAgLy8gRmlyZSB0aGUgbG9vcCBiYWNrLWVkZ2UgU09VUkNFRCBGUk9NIFRIRSBCUkFOQ0ggc28gdmlzdWFsaXplcnMgcmVhZFxuICAgIC8vIGB0b29sLWNhbGxzIOKGkiBjb250ZXh0YCwgbm90IGBSb3V0ZSDihpIgY29udGV4dGAuXG4gICAgdGhpcy5jdXJzb3IuYi5fZmlyZUxvb3BFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcihicmFuY2hTcGVjLmlkLCBzdGFnZUlkKTtcbiAgfVxuXG4gIGVuZCgpOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB0aGlzLmN1cnNvci5maW5pc2godGhpcy5kZWZhdWx0SWQpO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU2VsZWN0b3JGbkxpc3QgKHNjb3BlLWJhc2VkIHNlbGVjdG9yIOKAlCBtaXJyb3JzIERlY2lkZXJMaXN0KVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RvckZuTGlzdDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJzb3I6IEJyYW5jaEN1cnNvcjxUT3V0LCBUU2NvcGU+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1aWxkZXI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPixcbiAgICBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10gPSBbXSxcbiAgICBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKSxcbiAgICByZXNlcnZlZFN0ZXBOdW1iZXIgPSAwLFxuICAgIHNlbGVjdG9yRGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge1xuICAgIHRoaXMuY3Vyc29yID0gbmV3IEJyYW5jaEN1cnNvcihcbiAgICAgICdzZWxlY3RvcicsXG4gICAgICBidWlsZGVyLFxuICAgICAgY3VyTm9kZSxcbiAgICAgIGN1clNwZWMsXG4gICAgICBwYXJlbnREZXNjcmlwdGlvblBhcnRzLFxuICAgICAgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICByZXNlcnZlZFN0ZXBOdW1iZXIsXG4gICAgICBzZWxlY3RvckRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICBhZGRGdW5jdGlvbkJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICAvKiogYHsgcmV0cnkgfWAgZ2l2ZXMgVEhJUyBCUkFOQ0gncyBzdGFnZSBhIGRlY2xhcmF0aXZlIHJldHJ5IHBvbGljeTtcbiAgICAgKiAgYHsgdGFncyB9YCBwdXRzIGRlY2xhcmVkIHRhZ3Mgb24gaXQgKHNlZSBgRmxvd0NoYXJ0QnVpbGRlci50YWdgKS4gKi9cbiAgICBvcHRpb25zPzogeyByZWFkb25seSByZXRyeT86IFJldHJ5UG9saWN5OyByZWFkb25seSB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3IuZnVuY3Rpb25CcmFuY2goaWQsIG5hbWUsIGZuLCBkZXNjcmlwdGlvbiwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcGF1c2FibGUgc3RhZ2UgYXMgYSBzZWxlY3RvciBicmFuY2guXG4gICAqXG4gICAqIFdoZW4gdGhpcyBicmFuY2ggaXMgc2VsZWN0ZWQsIHRoZSBoYW5kbGVyJ3MgYGV4ZWN1dGVgIHJ1bnMuIElmIGl0IHJldHVybnNcbiAgICogZGF0YSwgdGhlIHBpcGVsaW5lIHBhdXNlcy4gT24gcmVzdW1lLCBgaGFuZGxlci5yZXN1bWVgIHJ1bnMgd2l0aCB0aGVcbiAgICogaHVtYW4ncyBpbnB1dC4gSWYgYGV4ZWN1dGVgIHJldHVybnMgdm9pZCwgdGhlIHN0YWdlIGNvbnRpbnVlcyBub3JtYWxseS5cbiAgICovXG4gIGFkZFBhdXNhYmxlRnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgLyoqIGB7IHJldHJ5IH1gIGdpdmVzIFRISVMgQlJBTkNIJ3MgYGV4ZWN1dGVgIGhhbGYgYSByZXRyeSBwb2xpY3kgKHRoZVxuICAgICAqICBgcmVzdW1lYCBoYWxmIHJ1bnMgd2l0aG91dCBpdCDigJQgYSBkaWZmZXJlbnQgZnVuY3Rpb24sIGEgZGlmZmVyZW50XG4gICAgICogIGNvbnRyYWN0KTsgYHsgdGFncyB9YCBwdXRzIGRlY2xhcmVkIHRhZ3Mgb24gaXQuICovXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgcmV0cnk/OiBSZXRyeVBvbGljeTsgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIHRoaXMuY3Vyc29yLnBhdXNhYmxlQnJhbmNoKGlkLCBuYW1lLCBoYW5kbGVyLCBkZXNjcmlwdGlvbiwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3Iuc3ViZmxvd0JyYW5jaChpZCwgc3ViZmxvdywgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIHRoaXMuY3Vyc29yLmxhenlTdWJmbG93QnJhbmNoKGlkLCByZXNvbHZlciwgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEJyYW5jaExpc3QoXG4gICAgYnJhbmNoZXM6IEFycmF5PHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICB9PixcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiB9IG9mIGJyYW5jaGVzKSB7XG4gICAgICB0aGlzLmFkZEZ1bmN0aW9uQnJhbmNoKGlkLCBuYW1lLCBmbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZW5kKCk6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3Vyc29yLmZpbmlzaCgpO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRmxvd0NoYXJ0QnVpbGRlclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIF9yb290PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgX3Jvb3RTcGVjPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBwcml2YXRlIF9jdXJzb3I/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSBfY3Vyc29yU3BlYz86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgcHJpdmF0ZSBfc3RhZ2VNYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PigpO1xuICBfc3ViZmxvd0RlZnMgPSBuZXcgTWFwPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PigpO1xuICBwcml2YXRlIF9zdHJlYW1IYW5kbGVyczogU3RyZWFtSGFuZGxlcnMgPSB7fTtcbiAgLyoqXG4gICAqIEw3LjMg4oCUIEJ1aWxkLXRpbWUgb2JzZXJ2ZXIgZmFuLW91dC4gT3duZWQgYnkgdGhlIGJ1aWxkZXIgc28gZXZlcnlcbiAgICogYGFkZFgoKWAgbWV0aG9kIGNhbiBmaXJlIGBTdHJ1Y3R1cmVSZWNvcmRlcmAgZXZlbnRzIGF0IHRoZSBuYXR1cmFsXG4gICAqIG1vbWVudCBvZiB0aGUgY29ycmVzcG9uZGluZyBtdXRhdGlvbi4gRGlzcGF0Y2hlciBpcyBhbGxvY2F0ZWRcbiAgICogbGF6aWx5IG9uIGZpcnN0IGF0dGFjaCB0byBrZWVwIHRoZSB6ZXJvLXJlY29yZGVyIHBhdGggYWxsb2NhdGlvbi1cbiAgICogZnJlZS5cbiAgICovXG4gIHByaXZhdGUgX3N0cnVjdHVyZURpc3BhdGNoZXI/OiBTdHJ1Y3R1cmVSZWNvcmRlckRpc3BhdGNoZXI7XG4gIC8qKlxuICAgKiBMNy4zIOKAlCBTZWFsZWQtYWZ0ZXItYnVpbGQgZmxhZyAoUGFuZWwgMiBwaGFzZSBpbnZhcmlhbnQpLiBGbGlwc1xuICAgKiB0byBgdHJ1ZWAgd2hlbiBgLmJ1aWxkKClgIHJldHVybnM7IHN1YnNlcXVlbnQgYGF0dGFjaFN0cnVjdHVyZVJlY29yZGVyYFxuICAgKiB0aHJvd3MuIFByZXZlbnRzIHRoZSBmb290Z3VuIHdoZXJlIGEgY29uc3VtZXIgYXR0YWNoZXMgYSByZWNvcmRlclxuICAgKiBtaWQtZXhlY3V0aW9uIGFuZCBnZXRzIHBhcnRpYWwgc3RydWN0dXJlIGRhdGEgKG1pc3NlZCBldmVyeSBldmVudFxuICAgKiBhbHJlYWR5IGZpcmVkIGR1cmluZyBjb25zdHJ1Y3Rpb24pLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VhbGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2VuYWJsZU5hcnJhdGl2ZSA9IGZhbHNlO1xuICBwcml2YXRlIF9sb2dnZXI/OiBJTG9nZ2VyO1xuICBwcml2YXRlIF9kZXNjcmlwdGlvblBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIF9zdGVwQ291bnRlciA9IDA7XG4gIC8vIE5PVEU6IGtleWVkIGJ5IHN0YWdlIG5hbWUgKGZvciBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbnMpLCB3aGlsZSBzdGFnZU1hcFxuICAvLyBhbmQga25vd25TdGFnZUlkcyB1c2UgaWQgKHN0YWJsZSBpZGVudGlmaWVyKS4gVGhlc2UgYXJlIGludGVudGlvbmFsbHkgZGlmZmVyZW50XG4gIC8vIG5hbWVzcGFjZXMg4oCUIGRlc2NyaXB0aW9ucyBhcmUgcHJlc2VudGF0aW9uYWwsIGxvb2t1cHMgYXJlIHN0cnVjdHVyYWwuXG4gIHByaXZhdGUgX3N0YWdlRGVzY3JpcHRpb25zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfc3RhZ2VTdGVwTWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBfa25vd25TdGFnZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIF9pbnB1dFNjaGVtYT86IHVua25vd247XG4gIHByaXZhdGUgX291dHB1dFNjaGVtYT86IHVua25vd247XG4gIHByaXZhdGUgX291dHB1dE1hcHBlcj86IChmaW5hbFNjb3BlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdW5rbm93bjtcbiAgcHJpdmF0ZSBfc2NvcGVGYWN0b3J5PzogU2NvcGVGYWN0b3J5PFRTY29wZT47XG5cbiAgLy8g4pSA4pSAIEw3LjMg4oCUIFN0cnVjdHVyZVJlY29yZGVyIGF0dGFjaCArIGRpc3BhdGNoIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIGBTdHJ1Y3R1cmVSZWNvcmRlcmAgZm9yIGJ1aWxkLXBoYXNlIG9ic2VydmF0aW9uLiBNdWx0aXBsZVxuICAgKiByZWNvcmRlcnMgY29leGlzdCAoc2FtZSBpZCBhbGxvd2VkOyBpdGVyYXRpb24gb3JkZXIgPSBhdHRhY2hcbiAgICogb3JkZXIpLiBUaHJvd3MgaWYgY2FsbGVkIGFmdGVyIGAuYnVpbGQoKWAg4oCUIHRoZSBjaGFydCBpcyBzZWFsZWQgYXRcbiAgICogdGhhdCBwb2ludCBhbmQgYW55IHJlY29yZGVyIGF0dGFjaGVkIGxhdGUgd291bGQgbWlzcyBldmVyeSBldmVudFxuICAgKiBmaXJlZCBkdXJpbmcgY29uc3RydWN0aW9uLlxuICAgKlxuICAgKiAqKlNlZWQgcmVwbGF5Kio6IHdoZW4gdGhpcyBpcyBjYWxsZWQgQUZURVIgYHN0YXJ0KClgIGhhcyBhbHJlYWR5XG4gICAqIGZpcmVkIChpLmUuLCBhZnRlciB0aGUgYGZsb3dDaGFydCgpYCBmYWN0b3J5IHJldHVybnMpLCB0aGVcbiAgICoganVzdC1hdHRhY2hlZCByZWNvcmRlciByZWNlaXZlcyBhIG9uZS10aW1lIGBvblN0YWdlQWRkZWRgIGZvciB0aGVcbiAgICogcm9vdCBzdGFnZSBzbyBpdCBvYnNlcnZlcyB0aGUgc2VlZC4gT25seSB0aGUgbmV3IHJlY29yZGVyIHNlZXNcbiAgICogdGhlIHJlcGxheTsgYWxyZWFkeS1hdHRhY2hlZCByZWNvcmRlcnMgYXJlIG5vdCByZS1maXJlZC5cbiAgICpcbiAgICogKipNaWQtY2hhaW4gYXR0YWNoIGNhdmVhdCoqOiBhIHJlY29yZGVyIGF0dGFjaGVkIEFGVEVSIG9uZSBvciBtb3JlXG4gICAqIGBhZGRYKClgIGNhbGxzIHJlY2VpdmVzIHRoZSBzZWVkIHJlcGxheSBidXQgTUlTU0VTIGV2ZXJ5XG4gICAqIGludGVybWVkaWF0ZSBldmVudC4gQXR0YWNoIEJFRk9SRSB0aGUgZmlyc3QgYGFkZFgoKWAgZm9yIGNvbXBsZXRlXG4gICAqIGNhcHR1cmUuXG4gICAqXG4gICAqIFB1YmxpYyBmb3Igbm93IHRvIGVuYWJsZSBkaXJlY3QgYXR0YWNoIGluIHRlc3RzICsgZWFybHkgY29uc3VtZXJzLlxuICAgKiBMNy40IHdpbGwgd2lyZSBgZmxvd0NoYXJ0KC4uLiwgeyBzdHJ1Y3R1cmVSZWNvcmRlcnM6IFsuLi5dIH0pYCBhc1xuICAgKiBhbiBhZGRpdGlvbmFsIHJlZ2lzdHJhdGlvbiBzaXRlOyB0aGlzIG1ldGhvZCB3aWxsIHJlbWFpbi5cbiAgICovXG4gIGF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKHJlY29yZGVyOiBTdHJ1Y3R1cmVSZWNvcmRlcik6IHRoaXMge1xuICAgIGlmICh0aGlzLl9zZWFsZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtGbG93Q2hhcnRCdWlsZGVyXSBhdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcignJHtyZWNvcmRlci5pZH0nKSBjYWxsZWQgYWZ0ZXIgLmJ1aWxkKCkg4oCUIGNoYXJ0IGlzIHNlYWxlZDsgYCArXG4gICAgICAgICAgJ3RoZSByZWNvcmRlciB3b3VsZCBtaXNzIGV2ZXJ5IHN0cnVjdHVyZSBldmVudCBmcm9tIGNvbnN0cnVjdGlvbi4gQXR0YWNoIEJFRk9SRSAuYnVpbGQoKS4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSB7XG4gICAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyID0gbmV3IFN0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlcigpO1xuICAgIH1cbiAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLmF0dGFjaChyZWNvcmRlcik7XG4gICAgLy8gVGhlIHNlZWQgZmlyZXMgaW5zaWRlIGBzdGFydCgpYCDigJQgdGhhdCBydW5zIEJFRk9SRSB0aGUgY29uc3VtZXJcbiAgICAvLyBjYW4gcG9zdC1jb25zdHJ1Y3QgYXR0YWNoLiBSZXBsYXkgdGhlIHNlZWQgZXZlbnQgT05MWSBpbnRvIHRoZVxuICAgIC8vIGp1c3QtYXR0YWNoZWQgcmVjb3JkZXIgc28gb3RoZXIgYWxyZWFkeS1hdHRhY2hlZCByZWNvcmRlcnMgZG9uJ3RcbiAgICAvLyBzZWUgYSBkdXBsaWNhdGUuIEVycm9ycyBhcmUgcm91dGVkIHRocm91Z2ggdGhlIGRpc3BhdGNoZXInc1xuICAgIC8vIGFjY3VtdWxhdG9yIHNvIHRoZSBjb250cmFjdCBzdGF5cyB1bmlmb3JtLlxuICAgIGlmICh0aGlzLl9yb290U3BlYykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVjb3JkZXIub25TdGFnZUFkZGVkPy4oe1xuICAgICAgICAgIHN0YWdlSWQ6IHRoaXMuX3Jvb3RTcGVjLmlkLFxuICAgICAgICAgIG5hbWU6IHRoaXMuX3Jvb3RTcGVjLm5hbWUsXG4gICAgICAgICAgdHlwZTogdGhpcy5fcm9vdFNwZWMudHlwZSA/PyAnc3RhZ2UnLFxuICAgICAgICAgIC4uLih0aGlzLl9yb290U3BlYy5pc1BhdXNhYmxlID09PSB0cnVlICYmIHsgaXNQYXVzYWJsZTogdHJ1ZSB9KSxcbiAgICAgICAgICAuLi4odGhpcy5fcm9vdFNwZWMudGFncyAhPT0gdW5kZWZpbmVkICYmIHsgdGFnczogWy4uLnRoaXMuX3Jvb3RTcGVjLnRhZ3NdIH0pLFxuICAgICAgICAgIHNwZWM6IHRoaXMuX3Jvb3RTcGVjIGFzIHVua25vd24gYXMgRmxvd0NoYXJ0U3BlYyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5yZWNvcmRFcnJvckZvclJlcGxheShyZWNvcmRlci5pZCwgJ29uU3RhZ2VBZGRlZCcsIGVycik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3BlY3QgYWNjdW11bGF0ZWQgYFN0cnVjdHVyZUJ1aWxkRXJyb3Jgcy4gUmV0dXJucyBlbXB0eSBhcnJheVxuICAgKiB3aGVuIG5vIHJlY29yZGVycyBhdHRhY2hlZCBPUiBubyBlcnJvcnMgb2NjdXJyZWQuIFJldHVybnMgYVxuICAgKiBkZWZlbnNpdmUgY29weSDigJQgY2FsbGVyIG11dGF0aW9ucyBkbyBub3QgYWZmZWN0IHN1YnNlcXVlbnQgY2FsbHMuXG4gICAqXG4gICAqICoqQ2FsbCBvbiB0aGUgQlVJTERFUiwgbm90IHRoZSBjaGFydCByZXR1cm5lZCBieSBgLmJ1aWxkKClgLioqXG4gICAqIENhcHR1cmUgdGhlIGJ1aWxkZXIgcmVmZXJlbmNlIGJlZm9yZSBgLmJ1aWxkKClgIGlmIHlvdSBuZWVkXG4gICAqIHBvc3QtYnVpbGQgYWNjZXNzOlxuICAgKiBgYGB0c1xuICAgKiBjb25zdCBidWlsZGVyID0gZmxvd0NoYXJ0KC4uLikuYXR0YWNoU3RydWN0dXJlUmVjb3JkZXIocmVjKTtcbiAgICogY29uc3QgY2hhcnQgPSBidWlsZGVyLmJ1aWxkKCk7XG4gICAqIGNvbnN0IGVycm9ycyA9IGJ1aWxkZXIuZ2V0U3RydWN0dXJlQnVpbGRFcnJvcnMoKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRTdHJ1Y3R1cmVCdWlsZEVycm9ycygpOiBSZXR1cm5UeXBlPFN0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlclsnZ2V0RXJyb3JzJ10+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcj8uZ2V0RXJyb3JzKCkgPz8gW107XG4gIH1cblxuICAvLyBDb252ZW5pZW5jZSBmaXJlIGhlbHBlcnMg4oCUIG5vLW9wIHdoZW4gbm8gZGlzcGF0Y2hlciBhdHRhY2hlZC4gS2VlcHNcbiAgLy8gZXZlcnkgY2FsbCBzaXRlIGEgb25lLWxpbmVyIHdpdGhvdXQgdGhlIGBpZiAodGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcilgXG4gIC8vIGJvaWxlcnBsYXRlIGV2ZXJ5d2hlcmUuXG4gIHByaXZhdGUgX2ZpcmVTdGFnZUFkZGVkKHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIC8vIFJlYWQgYGlzUGF1c2FibGVgIGRpcmVjdGx5IGZyb20gdGhlIHNwZWMg4oCUIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGguXG4gICAgLy8gVGhlIHByZXZpb3VzIGBleHRyYXNgIGFyZ3VtZW50IHdhcyBhIHN1Yi1idWlsZGVyIGZvb3RndW46IGJyYW5jaFxuICAgIC8vIGhlbHBlcnMgaW4gRGVjaWRlckxpc3QvU2VsZWN0b3JGbkxpc3Qgd2VudCB0aHJvdWdoXG4gICAgLy8gYF9maXJlU3RhZ2VBZGRlZEZyb21TdWJCdWlsZGVyYCB3aGljaCBkcm9wcGVkIHRoZSBleHRyYXMsIHNpbGVudGx5XG4gICAgLy8gbG9zaW5nIGBpc1BhdXNhYmxlOiB0cnVlYCBvbiBwYXVzYWJsZSBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaGVzLlxuICAgIGNvbnN0IGlzUGF1c2FibGUgPSBzcGVjLmlzUGF1c2FibGUgPT09IHRydWU7XG4gICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5maXJlU3RhZ2VBZGRlZCh7XG4gICAgICBzdGFnZUlkOiBzcGVjLmlkLFxuICAgICAgbmFtZTogc3BlYy5uYW1lLFxuICAgICAgdHlwZTogc3BlYy50eXBlID8/ICdzdGFnZScsXG4gICAgICAuLi4oaXNQYXVzYWJsZSAmJiB7IGlzUGF1c2FibGU6IHRydWUgfSksXG4gICAgICAuLi4oc3BlYy50YWdzICE9PSB1bmRlZmluZWQgJiYgeyB0YWdzOiBbLi4uc3BlYy50YWdzXSB9KSxcbiAgICAgIHNwZWM6IHNwZWMgYXMgdW5rbm93biBhcyBGbG93Q2hhcnRTcGVjLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZVN0YWdlVGFnZ2VkKHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlciB8fCBzcGVjLnRhZ3MgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZVN0YWdlVGFnZ2VkKHtcbiAgICAgIHN0YWdlSWQ6IHNwZWMuaWQsXG4gICAgICBuYW1lOiBzcGVjLm5hbWUsXG4gICAgICB0YWdzOiBbLi4uc3BlYy50YWdzXSxcbiAgICAgIHNwZWM6IHNwZWMgYXMgdW5rbm93biBhcyBGbG93Q2hhcnRTcGVjLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZUVkZ2VBZGRlZChmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGtpbmQ6IFN0cnVjdHVyZUVkZ2VLaW5kLCBsYWJlbD86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZUVkZ2VBZGRlZCh7XG4gICAgICBmcm9tLFxuICAgICAgdG8sXG4gICAgICBraW5kLFxuICAgICAgLi4uKGxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBsYWJlbCB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpcmVMb29wRWRnZUFkZGVkKGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZUxvb3BFZGdlQWRkZWQoeyBmcm9tLCB0byB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlIHRoZSBgbmV4dGAgZWRnZShzKSBmcm9tIGEgcGFyZW50IHNwZWMgdG8gYSBmcmVzaGx5LWFkZGVkXG4gICAqIG5vZGUg4oCUIHdpdGggY29udmVyZ2VuY2UgZXhwYW5zaW9uIHdoZW4gdGhlIHBhcmVudCBpcyBhXG4gICAqIGZvcmsgLyBkZWNpZGVyIC8gc2VsZWN0b3Igd2l0aCBicmFuY2hlcy5cbiAgICpcbiAgICogQSBmb3JrIGF0IGBwYXJlbnRgIGlzIHNlbWFudGljYWxseSBgcGFyZW50IOKUgOKUgGZvcmstYnJhbmNo4pSA4pSA4pa6IGNoaWxkW2ldYFxuICAgKiBmb3IgZWFjaCBjaGlsZCwgYW5kIHRoZSBjaGFpbmVkIGAuYWRkRnVuY3Rpb24oWClgIGNvbnRpbnVlc1xuICAgKiBBRlRFUiB0aGUgZm9yayBjb252ZXJnZXMuIFRoZSBydW50aW1lIHNlbWFudGljcyBhcmUgdGhhdCBlYWNoXG4gICAqIGNoaWxkIElOREVQRU5ERU5UTFkgZmVlZHMgYFhgIChwYXJhbGxlbCBjb21wbGV0aW9uIOKGkiBqb2luKS4gVGhlXG4gICAqIGxpdGVyYWwgXCJlZGdlIGZyb20gcGFyZW50IHRvIFhcIiB3b3VsZCBtaXNyZXByZXNlbnQgdGhpcyDigJRcbiAgICogdmlzdWFsaXplcnMgYW5kIHRvcG9sb2dpY2FsIGFsZ29yaXRobXMgd291bGQgc2VlIG9uZSBlZGdlIHdoZXJlXG4gICAqIHRoZXJlIHNob3VsZCBiZSBOIGNvbnZlcmdlbmNlIGVkZ2VzLlxuICAgKlxuICAgKiBGaXg6IHdoZW4gYHBhcmVudFNwZWNgIGhhcyBicmFuY2ggY2hpbGRyZW4gKGZvcmsgb3IgYnJhbmNoZWRcbiAgICogZGVjaWRlci9zZWxlY3RvciksIGZpcmUgb25lIGBuZXh0YCBlZGdlIGZyb20gRUFDSCBjaGlsZCB0byB0aGVcbiAgICogdGFyZ2V0LiBPdGhlcndpc2UgZmlyZSB0aGUgc2luZ2xlIGVkZ2UgZnJvbSBgcGFyZW50U3BlY2AgaXRzZWxmLlxuICAgKlxuICAgKiBMb29wLXJlZmVyZW5jZSBjaGlsZHJlbiAoc3ludGhldGljIHNwZWMgbm9kZXMgY3JlYXRlZCBieVxuICAgKiBgLmxvb3BUbygpYCkgYXJlIGV4Y2x1ZGVkIOKAlCB0aGV5J3JlIGJhY2stZWRnZSBtYXJrZXJzLCBub3RcbiAgICogY29udmVyZ2VuY2Ugc291cmNlcy4gQSBicmFuY2ggdGhhdCBjYXJyaWVzIGFuIE9XTiBsb29wLWJhY2sgYG5leHRgXG4gICAqIChhIGJyYW5jaC1zb3VyY2VkIGBsb29wVG9gKSBpcyBsaWtld2lzZSBza2lwcGVkIOKAlCBpdCBsb29wcywgaXQgZG9lc1xuICAgKiBub3QgY29udmVyZ2UgYXQgdGhlIGxpbmVhciBuZXh0IHN0YWdlLlxuICAgKlxuICAgKiBBIGJyYW5jaCBjYXJyeWluZyBgY29udmVyZ2VBdGAgaXMgUkVESVJFQ1RFRDogaXRzIHNpbmdsZSBjb252ZXJnZW5jZVxuICAgKiBlZGdlIGZpcmVzIHRvIGl0cyBuYW1lZCB0YXJnZXQgaW5zdGVhZCBvZiBgdGFyZ2V0SWRgIOKAlCBleHByZXNzaW5nIGFuXG4gICAqIHVuZXF1YWwtZGVwdGggbWVyZ2UgKGUuZy4gYHRvb2xzIOKGkiBjYWxsLWxsbWAsIGJ5cGFzc2luZyBgbWVzc2FnZS1hcGlgKS5cbiAgICogVGhlIG5hbWVkIHRhcmdldCBpcyBhIGZvcndhcmQgc3RhZ2UsIHNvIGl0IGlzIE5PVCB2YWxpZGF0ZWQgaGVyZS5cbiAgICpcbiAgICogQ2FsbCBPUkRFUiBjb25zdHJhaW50OiBtdXN0IGJlIGNhbGxlZCBCRUZPUkUgdGhlIGN1cnNvciBhZHZhbmNlc1xuICAgKiB0byB0aGUgbmV3IHRhcmdldC4gVGhlIGNhbGxlciBwYXNzZXMgdGhlIFBSRS1BRFZBTkNFIHBhcmVudCBzcGVjLlxuICAgKi9cbiAgcHJpdmF0ZSBfZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsIHRhcmdldElkOiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgY29uc3QgY2hpbGRTcGVjcyA9IHBhcmVudFNwZWMuY2hpbGRyZW47XG4gICAgY29uc3QgaXNCcmFuY2hpbmdQYXJlbnQgPVxuICAgICAgKHBhcmVudFNwZWMudHlwZSA9PT0gJ2ZvcmsnIHx8IHBhcmVudFNwZWMudHlwZSA9PT0gJ2RlY2lkZXInIHx8IHBhcmVudFNwZWMudHlwZSA9PT0gJ3NlbGVjdG9yJykgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoY2hpbGRTcGVjcykgJiZcbiAgICAgIGNoaWxkU3BlY3MubGVuZ3RoID4gMDtcbiAgICBpZiAoIWlzQnJhbmNoaW5nUGFyZW50KSB7XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKHBhcmVudFNwZWMuaWQsIHRhcmdldElkLCAnbmV4dCcsIGxhYmVsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZFNwZWNzISkge1xuICAgICAgaWYgKGNoaWxkLmlzTG9vcFJlZmVyZW5jZSkgY29udGludWU7XG4gICAgICAvLyBBIGJyYW5jaCB3aXRoIGl0cyBvd24gbG9vcC1iYWNrIG5leHQgKGJyYW5jaC1zb3VyY2VkIGxvb3BUbykgbG9vcHMg4oCUXG4gICAgICAvLyBpdCBkb2VzIG5vdCBjb252ZXJnZSBhdCB0aGUgbGluZWFyIG5leHQgc3RhZ2UuXG4gICAgICBpZiAoY2hpbGQubmV4dD8uaXNMb29wUmVmZXJlbmNlKSBjb250aW51ZTtcbiAgICAgIGlmIChjaGlsZC5jb252ZXJnZUF0KSB7XG4gICAgICAgIC8vIFJlZGlyZWN0ZWQgY29udmVyZ2VuY2U6IHRoaXMgYnJhbmNoIHJlam9pbnMgYXQgaXRzIG5hbWVkIHRhcmdldC5cbiAgICAgICAgdGhpcy5fZmlyZUVkZ2VBZGRlZChjaGlsZC5pZCwgY2hpbGQuY29udmVyZ2VBdCwgJ25leHQnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGNoaWxkLmlkLCB0YXJnZXRJZCwgJ25leHQnLCBsYWJlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZURlY2lkZXJDb21wbGV0ZShcbiAgICBkZWNpZGVyOiBzdHJpbmcsXG4gICAgdHlwZTogJ2RlY2lkZXInIHwgJ3NlbGVjdG9yJyxcbiAgICBicmFuY2hJZHM6IHN0cmluZ1tdLFxuICAgIGRlZmF1bHRCcmFuY2g/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZURlY2lkZXJDb21wbGV0ZSh7XG4gICAgICBkZWNpZGVyLFxuICAgICAgdHlwZSxcbiAgICAgIGJyYW5jaElkcyxcbiAgICAgIC4uLihkZWZhdWx0QnJhbmNoICE9PSB1bmRlZmluZWQgJiYgeyBkZWZhdWx0QnJhbmNoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZVN1YmZsb3dNb3VudGVkKFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHN1YmZsb3dOYW1lOiBzdHJpbmcsXG4gICAgcm9vdFN0YWdlSWQ6IHN0cmluZyxcbiAgICBpc0xhenk/OiBib29sZWFuLFxuICAgIHN1YmZsb3dTcGVjPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHN1YmZsb3dQYXRoPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIpIHJldHVybjtcbiAgICAvLyBzdWJmbG93UGF0aCBkZWZhdWx0cyB0byBzdWJmbG93SWQgd2hlbiB0aGUgcmVjb3JkZXIgaXMgYXR0YWNoZWRcbiAgICAvLyB0byB0aGUgaW1tZWRpYXRlIHBhcmVudCAodG9wLWxldmVsIG1vdW50KTsgY29tcG9zZWQgcGF0aHMgYXBwbHlcbiAgICAvLyBvbmx5IHdoZW4gdGhpcyBidWlsZGVyIGlzIGl0c2VsZiBhIG5lc3RlZCBzdWJmbG93IGJlaW5nXG4gICAgLy8gb2JzZXJ2ZWQgYnkgdGhlIGdyYW5kcGFyZW50J3MgcmVjb3JkZXIuXG4gICAgY29uc3QgcGF0aCA9IHN1YmZsb3dQYXRoID8/IHN1YmZsb3dJZDtcbiAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLmZpcmVTdWJmbG93TW91bnRlZCh7XG4gICAgICBzdWJmbG93SWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHJvb3RTdGFnZUlkLFxuICAgICAgLi4uKGlzTGF6eSA9PT0gdHJ1ZSAmJiB7IGlzTGF6eSB9KSxcbiAgICAgIC4uLihzdWJmbG93U3BlYyAhPT0gdW5kZWZpbmVkICYmIHsgc3ViZmxvd1NwZWMgfSksXG4gICAgICBzdWJmbG93UGF0aDogcGF0aCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdWItYnVpbGRlciBhY2Nlc3MgKGAuYi5fZmlyZVh4eGApIGlzIG5lZWRlZCBieSBEZWNpZGVyTGlzdCAvXG4gICAqICBTZWxlY3RvckZuTGlzdDsgZXhwb3NlIHRoZSBkaXNwYXRjaGVyIHRocm91Z2ggaW50ZXJuYWwgaGVscGVyc1xuICAgKiAgdGhhdCBnbyB0aHJvdWdoIHRoZSBzYW1lIG5vLW9wLXdoZW4tYWJzZW50IGd1YXJkLlxuICAgKlxuICAgKiAgQGludGVybmFsIOKAlCB0aGVzZSBtZXRob2RzIGFyZSBleHBvc2VkIGJlY2F1c2UgVHlwZVNjcmlwdCBgcHJpdmF0ZWBcbiAgICogIGRvZXNuJ3QgdHJhdmVyc2UgY2xhc3MgYm91bmRhcmllcy4gQ29uc3VtZXIgY29kZSBNVVNUIE5PVCBjYWxsXG4gICAqICB0aGVtOyBjYWxsaW5nIHRoZW0gcG9zdC1jb25zdHJ1Y3Rpb24gbGV0cyBhIGhvc3RpbGUgY2FsbGVyXG4gICAqICBmYWJyaWNhdGUgc3RydWN0dXJlIGV2ZW50cyBhbmQgY29ycnVwdCBkb3duc3RyZWFtIHZpc3VhbGl6YXRpb25zXG4gICAqICBvciBhdWRpdCB0cmFpbHMuIFRoZSBgX2AgcHJlZml4IGlzIGludGVudGlvbmFsIGNvbnZlbnRpb24uICovXG4gIF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBraW5kOiBTdHJ1Y3R1cmVFZGdlS2luZCwgbGFiZWw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGZyb20sIHRvLCBraW5kLCBsYWJlbCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiAqL1xuICBfZmlyZVN0YWdlQWRkZWRGcm9tU3ViQnVpbGRlcihzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwg4oCUIHNlZSBgX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcmAuICovXG4gIF9maXJlRGVjaWRlckNvbXBsZXRlRnJvbVN1YkJ1aWxkZXIoXG4gICAgZGVjaWRlcjogc3RyaW5nLFxuICAgIHR5cGU6ICdkZWNpZGVyJyB8ICdzZWxlY3RvcicsXG4gICAgYnJhbmNoSWRzOiBzdHJpbmdbXSxcbiAgICBkZWZhdWx0QnJhbmNoPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlRGVjaWRlckNvbXBsZXRlKGRlY2lkZXIsIHR5cGUsIGJyYW5jaElkcywgZGVmYXVsdEJyYW5jaCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiAqL1xuICBfZmlyZVN1YmZsb3dNb3VudGVkRnJvbVN1YkJ1aWxkZXIoXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyxcbiAgICByb290U3RhZ2VJZDogc3RyaW5nLFxuICAgIGlzTGF6eT86IGJvb2xlYW4sXG4gICAgc3ViZmxvd1NwZWM/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgc3ViZmxvd1BhdGg/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChzdWJmbG93SWQsIHN1YmZsb3dOYW1lLCByb290U3RhZ2VJZCwgaXNMYXp5LCBzdWJmbG93U3BlYywgc3ViZmxvd1BhdGgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgc2VlIGBfZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyYC4gVXNlZCBieSBgRGVjaWRlckxpc3QubG9vcFRvYFxuICAgKiAgdG8gdmFsaWRhdGUgYSBicmFuY2gtc291cmNlZCBsb29wIHRhcmdldCBhZ2FpbnN0IHRoZSBrbm93biBzdGFnZSBpZHNcbiAgICogIChtaXJyb3JzIGBGbG93Q2hhcnRCdWlsZGVyLmxvb3BUb2AncyBgX2tub3duU3RhZ2VJZHMuaGFzYCBndWFyZCkuICovXG4gIF9rbm93blN0YWdlSWRzSGFzKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fa25vd25TdGFnZUlkcy5oYXMoaWQpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgc2VlIGBfZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyYC4gVXNlZCBieSBgRGVjaWRlckxpc3QubG9vcFRvYFxuICAgKiAgdG8gZmlyZSBhIGxvb3AgYmFjay1lZGdlIFNPVVJDRUQgRlJPTSBBIEJSQU5DSCBub2RlIChub3QgdGhlIGRlY2lkZXIpLiAqL1xuICBfZmlyZUxvb3BFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcihmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlTG9vcEVkZ2VBZGRlZChmcm9tLCB0byk7XG4gIH1cblxuICAvLyDilIDilIAgRGVzY3JpcHRpb24gaGVscGVycyDilIDilIBcblxuICBwcml2YXRlIF9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgY29uc3QgbGluZSA9IGRlc2NyaXB0aW9uID8gYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiAke25hbWV9IOKAlCAke2Rlc2NyaXB0aW9ufWAgOiBgJHt0aGlzLl9zdGVwQ291bnRlcn0uICR7bmFtZX1gO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChsaW5lKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zLnNldChuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55Pik6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChpZCwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIGlmIChzdWJmbG93LmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IHN1YmZsb3cuZGVzY3JpcHRpb24uc3BsaXQoJ1xcbicpO1xuICAgICAgY29uc3Qgc3RlcHNJZHggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3RhcnRzV2l0aCgnU3RlcHM6JykpO1xuICAgICAgaWYgKHN0ZXBzSWR4ID49IDApIHtcbiAgICAgICAgLy8gQnVpbGRlci1jb21wb3NlZCBkZXNjcmlwdGlvbiAoYEZsb3dDaGFydDogWFxcblN0ZXBzOlxcbi4uLmApLlxuICAgICAgICAvLyBJbmxpbmUgT05MWSB0aGUgc3VtbWFyeSBhYm92ZSBgU3RlcHM6YCBvbiB0aGUgbW91bnQgbGluZSwgdGhlblxuICAgICAgICAvLyByZS1saXN0IHRoZSBzdGVwIGxpbmVzIG9uY2UsIGluZGVudGVkLiBFbWJlZGRpbmcgdGhlIEZVTEwgaW5uZXJcbiAgICAgICAgLy8gZGVzY3JpcHRpb24gaGVyZSBBTkQgcmUtbGlzdGluZyBpdHMgc3RlcHMgZG91YmxlZCB0aGUgdGV4dCBwZXJcbiAgICAgICAgLy8gbmVzdGluZyBsZXZlbCDigJQgZXhwb25lbnRpYWwgZ3Jvd3RoLCBSYW5nZUVycm9yIChcIkludmFsaWQgc3RyaW5nXG4gICAgICAgIC8vIGxlbmd0aFwiKSBhdCB+MjIgbmVzdGluZyBsZXZlbHMgb2YgbmVzdGVkIGJ1aWxkKCkuXG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPSBsaW5lcy5zbGljZSgwLCBzdGVwc0lkeCkuam9pbignICcpLnRyaW0oKTtcbiAgICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKFxuICAgICAgICAgIHN1bW1hcnlcbiAgICAgICAgICAgID8gYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV0g4oCUICR7c3VtbWFyeX1gXG4gICAgICAgICAgICA6IGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW1N1Yi1FeGVjdXRpb246ICR7bmFtZX1dYCxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0ZXBzSWR4ICsgMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGxpbmVzW2ldLnRyaW0oKSkgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAgICAke2xpbmVzW2ldfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGcmVlLWZvcm0gKHNpbmdsZS1ibG9jaykgZGVzY3JpcHRpb24g4oCUIGlubGluZSBpdCB3aG9sZSwgdW5jaGFuZ2VkLlxuICAgICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV0g4oCUICR7c3ViZmxvdy5kZXNjcmlwdGlvbn1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW1N1Yi1FeGVjdXRpb246ICR7bmFtZX1dYCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIENvbmZpZ3VyYXRpb24g4pSA4pSAXG5cbiAgc2V0TG9nZ2VyKGxvZ2dlcjogSUxvZ2dlcik6IHRoaXMge1xuICAgIHRoaXMuX2xvZ2dlciA9IGxvZ2dlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsYXJlIHRoZSBBUEkgY29udHJhY3Qg4oCUIGlucHV0IHZhbGlkYXRpb24sIG91dHB1dCBzaGFwZSwgYW5kIG91dHB1dCBtYXBwZXIuXG4gICAqIFJlcGxhY2VzIHNldElucHV0U2NoZW1hKCkgKyBzZXRPdXRwdXRTY2hlbWEoKSArIHNldE91dHB1dE1hcHBlcigpIGluIGEgc2luZ2xlIGNhbGwuXG4gICAqXG4gICAqIElmIGEgY29udHJhY3Qgd2l0aCBpbnB1dCBzY2hlbWEgaXMgZGVjbGFyZWQsIGNoYXJ0LnJ1bigpIHZhbGlkYXRlcyBpbnB1dCBhdXRvbWF0aWNhbGx5LlxuICAgKiBDb250cmFjdCBkYXRhIGlzIHVzZWQgYnkgY2hhcnQudG9PcGVuQVBJKCkgYW5kIGNoYXJ0LnRvTUNQVG9vbCgpLlxuICAgKi9cbiAgY29udHJhY3Qob3B0czoge1xuICAgIGlucHV0PzogdW5rbm93bjtcbiAgICBvdXRwdXQ/OiB1bmtub3duO1xuICAgIG1hcHBlcj86IChmaW5hbFNjb3BlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdW5rbm93bjtcbiAgfSk6IHRoaXMge1xuICAgIGlmIChvcHRzLmlucHV0KSB0aGlzLl9pbnB1dFNjaGVtYSA9IG9wdHMuaW5wdXQ7XG4gICAgaWYgKG9wdHMub3V0cHV0KSB0aGlzLl9vdXRwdXRTY2hlbWEgPSBvcHRzLm91dHB1dDtcbiAgICBpZiAob3B0cy5tYXBwZXIpIHRoaXMuX291dHB1dE1hcHBlciA9IG9wdHMubWFwcGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIExpbmVhciBDaGFpbmluZyDilIDilIBcblxuICBzdGFydChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgcmV0cnk/OiBSZXRyeVBvbGljeTsgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IHRoaXMge1xuICAgIGFkbWl0SWQoJ3N0YWdlIGlkJywgaWQsICdzdGFnZScpO1xuICAgIGlmICh0aGlzLl9yb290KSBmYWlsKCdyb290IGFscmVhZHkgZGVmaW5lZDsgY3JlYXRlIGEgbmV3IGJ1aWxkZXInKTtcblxuICAgIC8vIERldGVjdCBQYXVzYWJsZUhhbmRsZXIgYnkgZHVjay10eXBpbmcgKGhhcyAuZXhlY3V0ZSBwcm9wZXJ0eSlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICBjb25zdCBpc1BhdXNhYmxlID0gdHlwZW9mIGZuID09PSAnb2JqZWN0JyAmJiBmbiAhPT0gbnVsbCAmJiAnZXhlY3V0ZScgaW4gZm47XG4gICAgY29uc3Qgc3RhZ2VGbiA9IGlzUGF1c2FibGVcbiAgICAgID8gKChmbiBhcyBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPikuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pXG4gICAgICA6IChmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbjogc3RhZ2VGbiB9O1xuICAgIGlmIChpc1BhdXNhYmxlKSB7XG4gICAgICBub2RlLmlzUGF1c2FibGUgPSB0cnVlO1xuICAgICAgbm9kZS5yZXN1bWVGbiA9IChmbiBhcyBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPikucmVzdW1lO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgc3RhZ2VGbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIGlkLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGlzUGF1c2FibGUpIHNwZWMuaXNQYXVzYWJsZSA9IHRydWU7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgYXBwbHlSZXRyeVBvbGljeShub2RlLCBzcGVjLCBvcHRpb25zPy5yZXRyeSwgYHN0YXJ0KCcke2lkfScpYCk7XG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBzdGFydCgnJHtpZH0nKWApO1xuXG4gICAgdGhpcy5fcm9vdCA9IG5vZGU7XG4gICAgdGhpcy5fcm9vdFNwZWMgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgU2VlZCBub2RlIGZpcmVzIGBvblN0YWdlQWRkZWRgIChubyBlZGdlIOKAlCBubyBwcmVkZWNlc3NvcikuXG4gICAgLy8gYGlzUGF1c2FibGVgIGlzIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgc3BlYyBieSBgX2ZpcmVTdGFnZUFkZGVkYC5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgYSBjaGFydCB3aG9zZSBST09UIHN0YWdlIElTIGEgc2VsZWN0b3Ig4oCUIGl0IHJ1bnMgZmlyc3QgKHJlYWRpbmdcbiAgICogYXJncywgc2VlZGluZyBzdGF0ZSwgcmV0dXJuaW5nIHRoZSBjaG9zZW4gYnJhbmNoIGlkcyB2aWEgYHNlbGVjdCgpYCksXG4gICAqIGFuZCBpdHMgYnJhbmNoZXMgYXR0YWNoIGRpcmVjdGx5IHRvIHRoZSByb290LiBNaXJyb3JzIGBzdGFydCgpYCBmb3IgdGhlXG4gICAqIHJvb3Qtbm9kZSBzZXR1cCwgdGhlbiByZXR1cm5zIGEgYFNlbGVjdG9yRm5MaXN0YCBib3VuZCB0byB0aGUgcm9vdCBzb1xuICAgKiBgLmFkZEZ1bmN0aW9uQnJhbmNoKClgIC8gYC5hZGRTdWJGbG93Q2hhcnRCcmFuY2goKWAgLyBgLmVuZCgpYCB3b3JrXG4gICAqIGV4YWN0bHkgYXMgdGhleSBkbyBhZnRlciBgYWRkU2VsZWN0b3JGdW5jdGlvbigpYC5cbiAgICpcbiAgICogVXNlIHdoZW4gdGhlIGZpcnN0IHRoaW5nIGEgY2hhcnQgZG9lcyBpcyBjaG9vc2UgYW1vbmcgYnJhbmNoZXMg4oCUIGUuZy4gYVxuICAgKiBgQ29udGV4dGAgc2VsZWN0b3IgdGhhdCBpbml0cyArIHBpY2tzIHdoaWNoIGNvbnRleHQgc2xvdHMgdG8gZW5naW5lZXIsXG4gICAqIHdpdGggbm8gc2VwYXJhdGUgc2VlZCBzdGFnZSBiZWZvcmUgaXQuXG4gICAqL1xuICBzdGFydFNlbGVjdG9yKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogU3RhZ2VGdW5jdGlvbjxhbnksIFRTY29wZT4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBmYWlsRmFzdD86IGJvb2xlYW47IHJldHJ5PzogUmV0cnlQb2xpY3k7IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9LFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBpZiAodGhpcy5fcm9vdCkgZmFpbCgncm9vdCBhbHJlYWR5IGRlZmluZWQ7IGNyZWF0ZSBhIG5ldyBidWlsZGVyJyk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuOiBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAvLyBTZWUgYGFkZFNlbGVjdG9yRnVuY3Rpb25gIOKAlCBgZmFpbEZhc3Q6IHRydWVgIG1ha2VzIGEgbXVsdGktYnJhbmNoXG4gICAgLy8gc2VsZWN0aW9uIGZhbiBvdXQgdmlhIGBQcm9taXNlLmFsbGAgKGZpcnN0IGVycm9yIGFib3J0cykgaW5zdGVhZCBvZiB0aGVcbiAgICAvLyBkZWZhdWx0IGBQcm9taXNlLmFsbFNldHRsZWRgIChiZXN0LWVmZm9ydCkuXG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBub2RlLmZhaWxGYXN0ID0gdHJ1ZTtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScsIGhhc1NlbGVjdG9yOiB0cnVlIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgYXBwbHlSZXRyeVBvbGljeShub2RlLCBzcGVjLCBvcHRpb25zPy5yZXRyeSwgYHN0YXJ0U2VsZWN0b3IoJyR7aWR9JylgKTtcbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYHN0YXJ0U2VsZWN0b3IoJyR7aWR9JylgKTtcblxuICAgIHRoaXMuX3Jvb3QgPSBub2RlO1xuICAgIHRoaXMuX3Jvb3RTcGVjID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIFJvb3Qgc2VsZWN0b3Igbm9kZSBmaXJlcyBvblN0YWdlQWRkZWQgd2l0aCBOTyBwcmVkZWNlc3NvciBlZGdlIChpdCdzXG4gICAgLy8gdGhlIHJvb3QpLiBCcmFuY2hlcyArIG9uRGVjaWRlckNvbXBsZXRlIGNvbWUgZnJvbSB0aGUgU2VsZWN0b3JGbkxpc3QuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG5cbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX3N0YWdlU3RlcE1hcC5zZXQobmFtZSwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG5cbiAgICByZXR1cm4gbmV3IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4oXG4gICAgICB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIHNwZWMsXG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLFxuICAgICAgdGhpcy5fc3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICB0aGlzLl9zdGVwQ291bnRlcixcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICBhZGRGdW5jdGlvbihuYW1lOiBzdHJpbmcsIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sIGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdGhpcyB7XG4gICAgYWRtaXRJZCgnc3RhZ2UgaWQnLCBpZCwgJ3N0YWdlJyk7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuICAgIC8vIENhcHR1cmUgdGhlIHBhcmVudCBTUEVDIHJlZmVyZW5jZSAobm90IGp1c3QgaWQpIEJFRk9SRSB0aGVcbiAgICAvLyBjdXJzb3IgYWR2YW5jZXMg4oCUIHdlIG5lZWQgaXRzIGBjaGlsZHJlbmAgKyBgdHlwZWAgdG8gZGVjaWRlXG4gICAgLy8gd2hldGhlciB0aGUgYG5leHRgIGVkZ2UgaXMgYSBmb3JrIGNvbnZlcmdlbmNlIChOIGVkZ2VzIGZyb21cbiAgICAvLyBlYWNoIGJyYW5jaCBjaGlsZCkgdnMgYSBwbGFpbiBsaW5lYXIgY2hhaW4gKDEgZWRnZSBmcm9tIHBhcmVudCkuXG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdzdGFnZScgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgTGluZWFyIG5vZGU6IGFubm91bmNlIHRoZSBub2RlIGZpcnN0LCB0aGVuIHRoZSBlZGdlXG4gICAgLy8gZnJvbSB0aGUgcHJpb3IgY3Vyc29yLiBPcmRlciBtYXR0ZXJzOiBlbmRwb2ludHMgYW5ub3VuY2VkXG4gICAgLy8gYmVmb3JlIGFueSBlZGdlIHJlZmVyZW5jaW5nIHRoZW0gKFN0cnVjdHVyZVJlY29yZGVyIGNvbnRyYWN0KS5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdHJlYW1pbmdGdW5jdGlvbihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIHN0cmVhbUlkPzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICApOiB0aGlzIHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIGZuLFxuICAgICAgaXNTdHJlYW1pbmc6IHRydWUsXG4gICAgICBzdHJlYW1JZDogc3RyZWFtSWQgPz8gbmFtZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBmbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lLFxuICAgICAgaWQsXG4gICAgICB0eXBlOiAnc3RyZWFtaW5nJyxcbiAgICAgIGlzU3RyZWFtaW5nOiB0cnVlLFxuICAgICAgc3RyZWFtSWQ6IHN0cmVhbUlkID8/IG5hbWUsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgU3RyZWFtaW5nIHN0YWdlOiBzYW1lIHNoYXBlIGFzIGxpbmVhciBhZGRGdW5jdGlvbi5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcGF1c2FibGUgc3RhZ2Ug4oCUIGNhbiBwYXVzZSBleGVjdXRpb24gYW5kIHJlc3VtZSBsYXRlciB3aXRoIGlucHV0LlxuICAgKlxuICAgKiBUaGUgaGFuZGxlciBoYXMgdHdvIHBoYXNlczpcbiAgICogLSBgZXhlY3V0ZWA6IHJ1bnMgZmlyc3QgdGltZS4gUmV0dXJuIGFueSBub24tdm9pZCB2YWx1ZSB0byBwYXVzZSAoaXQgYmVjb21lc1xuICAgKiAgIHRoZSBjaGVja3BvaW50J3MgYHBhdXNlRGF0YWApOyByZXR1cm4gdm9pZC91bmRlZmluZWQgdG8gY29udGludWUgbm9ybWFsbHkuXG4gICAqIC0gYHJlc3VtZWA6IHJ1bnMgd2hlbiB0aGUgZmxvd2NoYXJ0IGlzIHJlc3VtZWQgd2l0aCBpbnB1dC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAuYWRkUGF1c2FibGVGdW5jdGlvbignQXBwcm92ZU9yZGVyJywge1xuICAgKiAgIGV4ZWN1dGU6IGFzeW5jIChzY29wZSkgPT4ge1xuICAgKiAgICAgc2NvcGUub3JkZXJJZCA9ICcxMjMnO1xuICAgKiAgICAgcmV0dXJuIHsgcXVlc3Rpb246ICdBcHByb3ZlPycgfTtcbiAgICogICB9LFxuICAgKiAgIHJlc3VtZTogYXN5bmMgKHNjb3BlLCBpbnB1dCkgPT4ge1xuICAgKiAgICAgc2NvcGUuYXBwcm92ZWQgPSBpbnB1dC5hcHByb3ZlZDtcbiAgICogICB9LFxuICAgKiB9LCAnYXBwcm92ZS1vcmRlcicsICdNYW5hZ2VyIGFwcHJvdmFsIGdhdGUnKVxuICAgKiBgYGBcbiAgICovXG4gIGFkZFBhdXNhYmxlRnVuY3Rpb24obmFtZTogc3RyaW5nLCBoYW5kbGVyOiBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPiwgaWQ6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIGZuOiBoYW5kbGVyLmV4ZWN1dGUgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgICAgaXNQYXVzYWJsZTogdHJ1ZSxcbiAgICAgIHJlc3VtZUZuOiBoYW5kbGVyLnJlc3VtZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBoYW5kbGVyLmV4ZWN1dGUgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpc1BhdXNhYmxlOiB0cnVlLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIEw3LjMg4oCUIFBhdXNhYmxlIHN0YWdlOiBgX2ZpcmVTdGFnZUFkZGVkYCByZWFkcyBgaXNQYXVzYWJsZWBcbiAgICAvLyBkaXJlY3RseSBmcm9tIGBzcGVjLmlzUGF1c2FibGVgIChzZXQgYWJvdmUpLCBzbyB2aXN1YWxpc2Vyc1xuICAgIC8vIHNlZSBpdCBvbiB0aGUgZXZlbnQgcGF5bG9hZCB3aXRob3V0IGEgc2VwYXJhdGUgdGhyZWFkaW5nIGFyZy5cbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgRGV0YWNoIChidWlsZGVyLW5hdGl2ZSBjb21wb3NpdGlvbikg4pSA4pSAXG4gIC8vXG4gIC8vIFN1Z2FyIG92ZXIgYGFkZEZ1bmN0aW9uYCB0aGF0IGdlbmVyYXRlcyBhIHN0YWdlIHdoaWNoIGNhbGxzXG4gIC8vIGBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KC4uLilgIG9yIGBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKC4uLilgXG4gIC8vIGF0IHJ1bnRpbWUuIFpFUk8gZW5naW5lIGNoYW5nZXMg4oCUIHB1cmUgY29tcG9zaXRpb24gb3ZlciB0aGVcbiAgLy8gZXhpc3Rpbmcgc2NvcGUtbWV0aG9kIHByaW1pdGl2ZXMuXG4gIC8vXG4gIC8vIEZvciBgYWRkRGV0YWNoQW5kSm9pbkxhdGVyYCwgdGhlIHJldHVybmVkIGhhbmRsZSBpcyBzdG9yZWQgaW5cbiAgLy8gc2hhcmVkIHN0YXRlIHZpYSBgJHNldFZhbHVlYCAod2hpY2ggYnlwYXNzZXMgdGhlIHR5cGVkLXByb3h5XG4gIC8vIHVud3JhcCB0aGF0IHdvdWxkIG90aGVyd2lzZSBzdHJpcCB0aGUgaGFuZGxlJ3MgY2xhc3MgbWV0aG9kcykuXG4gIC8vIERvd25zdHJlYW0gc3RhZ2VzIHJlYWQgaXQgdmlhIGBzY29wZVtvcHRpb25zLmhhbmRsZUtleV1gIG9yXG4gIC8vIGBzY29wZS4kZ2V0VmFsdWUob3B0aW9ucy5oYW5kbGVLZXkpYCDigJQgYm90aCBwcmVzZXJ2ZSBtZXRob2RzXG4gIC8vIGJlY2F1c2UgdGhlIHZhbHVlIHdhcyBzdG9yZWQgcmF3LlxuXG4gIC8qKlxuICAgKiBBZGQgYSBzdGFnZSB0aGF0IGZpcmVzIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kXG4gICAqIERJU0NBUkRTIHRoZSBoYW5kbGUuIFB1cmUgZmlyZS1hbmQtZm9yZ2V0IOKAlCB1c2VmdWwgZm9yIHRlbGVtZXRyeVxuICAgKiBleHBvcnRzLCBhdWRpdCBsb2cgc2hpcHBpbmcsIGNhY2hlIHdhcm0tdXAuXG4gICAqXG4gICAqIEBwYXJhbSBpZCBTdGFibGUgaWQgZm9yIHRoaXMgc3RhZ2UgKGFsc28gdGhlIHN0YWdlTWFwIGtleSkuXG4gICAqIEBwYXJhbSBjaGlsZCBUaGUgY2hpbGQgZmxvd2NoYXJ0IHRvIGRldGFjaC5cbiAgICogQHBhcmFtIG9wdGlvbnMuZHJpdmVyIFRoZSBkcml2ZXIgdG8gc2NoZWR1bGUgb24gKGUuZy4gYG1pY3JvdGFza0JhdGNoRHJpdmVyYCkuXG4gICAqIEBwYXJhbSBvcHRpb25zLmlucHV0TWFwcGVyIE1hcHMgdGhlIHBhcmVudCdzIHNjb3BlIHRvIHRoZSBjaGlsZCdzIGlucHV0LlxuICAgKiAgIERlZmF1bHRzIHRvIHBhc3NpbmcgYHVuZGVmaW5lZGAuXG4gICAqIEBwYXJhbSBvcHRpb25zLm1vdW50TmFtZSBEaXNwbGF5IG5hbWU7IGRlZmF1bHRzIHRvIGBpZGAuXG4gICAqIEBwYXJhbSBvcHRpb25zLmRlc2NyaXB0aW9uIFN0YWdlIGRlc2NyaXB0aW9uIGZvciBuYXJyYXRpdmUgKyB0b29scy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogaW1wb3J0IHsgbWljcm90YXNrQmF0Y2hEcml2ZXIgfSBmcm9tICdmb290cHJpbnRqcy9kZXRhY2gnO1xuICAgKlxuICAgKiBmbG93Q2hhcnQoJ3Byb2Nlc3MnLCBwcm9jZXNzRm4sICdwcm9jZXNzJylcbiAgICogICAuYWRkRGV0YWNoQW5kRm9yZ2V0KCd0ZWxlbWV0cnknLCB0ZWxlbWV0cnlDaGFydCwge1xuICAgKiAgICAgZHJpdmVyOiBtaWNyb3Rhc2tCYXRjaERyaXZlcixcbiAgICogICAgIGlucHV0TWFwcGVyOiAoc2NvcGUpID0+ICh7IGV2ZW50OiAncHJvY2Vzc2VkJywgb3JkZXJJZDogc2NvcGUub3JkZXJJZCB9KSxcbiAgICogICB9KVxuICAgKiAgIC5hZGRGdW5jdGlvbignbmV4dCcsIG5leHRGbiwgJ25leHQnKVxuICAgKiAgIC5idWlsZCgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFkZERldGFjaEFuZEZvcmdldChcbiAgICBpZDogc3RyaW5nLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4vdHlwZXMuanMnKS5GbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXI7XG4gICAgICBpbnB1dE1hcHBlcj86IChzY29wZTogVFNjb3BlKSA9PiB1bmtub3duO1xuICAgICAgbW91bnROYW1lPzogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgfSxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgbmFtZSA9IG9wdGlvbnMubW91bnROYW1lID8/IGlkO1xuICAgIHJldHVybiB0aGlzLmFkZEZ1bmN0aW9uKFxuICAgICAgbmFtZSxcbiAgICAgICgoc2NvcGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IG9wdGlvbnMuaW5wdXRNYXBwZXIgPyBvcHRpb25zLmlucHV0TWFwcGVyKHNjb3BlIGFzIFRTY29wZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHNjb3BlLiRkZXRhY2hBbmRGb3JnZXQob3B0aW9ucy5kcml2ZXIsIGNoaWxkLCBpbnB1dCk7XG4gICAgICB9KSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgICBpZCxcbiAgICAgIG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBzdGFnZSB0aGF0IGZpcmVzIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kXG4gICAqIGRlbGl2ZXJzIHRoZSByZXN1bHRpbmcgYERldGFjaEhhbmRsZWAgdG8gYSBjb25zdW1lci1zdXBwbGllZFxuICAgKiBgb25IYW5kbGVgIGNhbGxiYWNrLiBUaGUgaGFuZGxlIENBTk5PVCBiZSBzdG9yZWQgaW4gc2hhcmVkIHN0YXRlXG4gICAqIOKAlCBgU3RhZ2VDb250ZXh0LnNldFZhbHVlYCBjYWxscyBgc3RydWN0dXJlZENsb25lYCB3aGljaCBkcm9wc1xuICAgKiBjbGFzcyBwcm90b3R5cGVzIChhbmQgdGhlcmVmb3JlIHRoZSBoYW5kbGUncyBgLndhaXQoKWAgbWV0aG9kKS5cbiAgICpcbiAgICogVGhlIGNhbGxiYWNrIHBhdHRlcm4gaXMgdGhlIGV4cGxpY2l0IGFsdGVybmF0aXZlOiBrZWVwIGhhbmRsZXMgaW5cbiAgICogYSBjbG9zdXJlLWxvY2FsIGFycmF5IChvciB3aGF0ZXZlciBzaGFwZSBzdWl0cykgYW5kIGhhdmUgYVxuICAgKiBkb3duc3RyZWFtIHN0YWdlIGBhd2FpdCBQcm9taXNlLmFsbCguLi4pYCBvdmVyIHRoZW0uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGltcG9ydCB7IG1pY3JvdGFza0JhdGNoRHJpdmVyIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAgICogaW1wb3J0IHR5cGUgeyBEZXRhY2hIYW5kbGUgfSBmcm9tICdmb290cHJpbnRqcy9kZXRhY2gnO1xuICAgKlxuICAgKiBjb25zdCBoYW5kbGVzOiBEZXRhY2hIYW5kbGVbXSA9IFtdO1xuICAgKlxuICAgKiBjb25zdCBjaGFydCA9IGZsb3dDaGFydCgnc2VlZCcsIHNlZWRGbiwgJ3NlZWQnKVxuICAgKiAgIC5hZGREZXRhY2hBbmRKb2luTGF0ZXIoJ2V2YWwtYScsIGV2YWxDaGFydCwge1xuICAgKiAgICAgZHJpdmVyOiBtaWNyb3Rhc2tCYXRjaERyaXZlcixcbiAgICogICAgIGlucHV0TWFwcGVyOiAoc2NvcGUpID0+IHNjb3BlLmNvbmZpZ0EsXG4gICAqICAgICBvbkhhbmRsZTogKGgpID0+IGhhbmRsZXMucHVzaChoKSxcbiAgICogICB9KVxuICAgKiAgIC5hZGREZXRhY2hBbmRKb2luTGF0ZXIoJ2V2YWwtYicsIGV2YWxDaGFydCwge1xuICAgKiAgICAgZHJpdmVyOiBtaWNyb3Rhc2tCYXRjaERyaXZlcixcbiAgICogICAgIGlucHV0TWFwcGVyOiAoc2NvcGUpID0+IHNjb3BlLmNvbmZpZ0IsXG4gICAqICAgICBvbkhhbmRsZTogKGgpID0+IGhhbmRsZXMucHVzaChoKSxcbiAgICogICB9KVxuICAgKiAgIC5hZGRGdW5jdGlvbignam9pbicsIGFzeW5jIChzY29wZSkgPT4ge1xuICAgKiAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsKGhhbmRsZXMubWFwKChoKSA9PiBoLndhaXQoKSkpO1xuICAgKiAgICAgc2NvcGUucmVzdWx0cyA9IHNldHRsZWQ7XG4gICAqICAgfSwgJ2pvaW4nKVxuICAgKiAgIC5idWlsZCgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogTm90ZTogcHV0dGluZyBgaGFuZGxlc2AgaW4gYSBtb2R1bGUtbGV2ZWwgY2xvc3VyZSBpcyBmaW5lIGZvclxuICAgKiBzaW5nbGUtcnVuIHNjcmlwdHMuIEZvciBzZXJ2ZXIgY29kZSB0aGF0IHJ1bnMgdGhlIHNhbWUgY2hhcnRcbiAgICogY29uY3VycmVudGx5IGFjcm9zcyByZXF1ZXN0cywgYWxsb2NhdGUgYSBuZXcgY2xvc3VyZSBwZXIgcnVuXG4gICAqIChlLmcuLCB3cmFwIGNoYXJ0IGNvbnN0cnVjdGlvbiBpbiBhIGZhY3RvcnkgZnVuY3Rpb24pIHNvIGhhbmRsZXNcbiAgICogZnJvbSBkaWZmZXJlbnQgcnVucyBkb24ndCBibGVlZCBpbnRvIGVhY2ggb3RoZXIuXG4gICAqL1xuICBhZGREZXRhY2hBbmRKb2luTGF0ZXIoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBjaGlsZDogaW1wb3J0KCcuL3R5cGVzLmpzJykuRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBvcHRpb25zOiB7XG4gICAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyO1xuICAgICAgb25IYW5kbGU6IChoYW5kbGU6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoSGFuZGxlKSA9PiB2b2lkO1xuICAgICAgaW5wdXRNYXBwZXI/OiAoc2NvcGU6IFRTY29wZSkgPT4gdW5rbm93bjtcbiAgICAgIG1vdW50TmFtZT86IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG5hbWUgPSBvcHRpb25zLm1vdW50TmFtZSA/PyBpZDtcbiAgICByZXR1cm4gdGhpcy5hZGRGdW5jdGlvbihcbiAgICAgIG5hbWUsXG4gICAgICAoKHNjb3BlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBvcHRpb25zLmlucHV0TWFwcGVyID8gb3B0aW9ucy5pbnB1dE1hcHBlcihzY29wZSBhcyBUU2NvcGUpIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBoYW5kbGUgPSBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKG9wdGlvbnMuZHJpdmVyLCBjaGlsZCwgaW5wdXQpO1xuICAgICAgICBvcHRpb25zLm9uSGFuZGxlKGhhbmRsZSk7XG4gICAgICB9KSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgICBpZCxcbiAgICAgIG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBCcmFuY2hpbmcg4pSA4pSAXG5cbiAgYWRkRGVjaWRlckZ1bmN0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogU3RhZ2VGdW5jdGlvbjxhbnksIFRTY29wZT4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICAvKiogYHsgcmV0cnkgfWAgZ2l2ZXMgdGhlIERFQ0lERVIgU1RBR0UgYSByZXRyeSBwb2xpY3kuIERlY2xhcmVkIGhlcmUgcmF0aGVyXG4gICAgICogIHRoYW4gdmlhIGAucmV0cnkoKWAgYmVjYXVzZSB0aGlzIG1ldGhvZCByZXR1cm5zIGEgYERlY2lkZXJMaXN0YCwgd2hlcmUgYVxuICAgICAqICBjaGFpbmVkIG1vZGlmaWVyIGNvdWxkIG1lYW4gdGhlIGRlY2lkZXIgT1IgdGhlIGJyYW5jaCBqdXN0IGFkZGVkO1xuICAgICAqICBgeyB0YWdzIH1gIGxpa2V3aXNlLiAqL1xuICAgIG9wdGlvbnM/OiB7IHJldHJ5PzogUmV0cnlQb2xpY3k7IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9LFxuICApOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICAvLyBObyBkaXNwYXRjaGVyIGd1YXJkIG9uIGBjdXJgOiBhZnRlciBgLmVuZCgpYCB0aGUgY3Vyc29yIElTIHRoZSBjbG9zZWRcbiAgICAvLyBkZWNpZGVyL3NlbGVjdG9yLCBhbmQgdGhpcyBkZWNpZGVyIGlzIGEgTkVXIG5vZGUgYXQgaXRzIGBuZXh0YCAoYSBjaGFpblxuICAgIC8vIG9mIGRpc3BhdGNoZXJzKS4gUmUtb3BlbmluZyB0aGUgU0FNRSBkaXNwYXRjaGVyIGlzIGBCcmFuY2hDdXJzb3IgwrcgYXNzZXJ0T3BlbmAncyByZWZ1c2FsLlxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lLCBpZCwgZm4gfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCBpZCwgdHlwZTogJ3N0YWdlJywgaGFzRGVjaWRlcjogdHJ1ZSB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGFwcGx5UmV0cnlQb2xpY3kobm9kZSwgc3BlYywgb3B0aW9ucz8ucmV0cnksIGBhZGREZWNpZGVyRnVuY3Rpb24oJyR7aWR9JylgKTtcbiAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZERlY2lkZXJGdW5jdGlvbignJHtpZH0nKWApO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBEZWNpZGVyIG5vZGUgaXMgcmVhY2hlZCB2aWEgYSBgbmV4dGAgZWRnZSBmcm9tIHRoZSBwcmlvclxuICAgIC8vIGN1cnNvci4gQnJhbmNoZXMgdGhlbXNlbHZlcyBmaXJlIHZpYSBgYWRkRnVuY3Rpb25CcmFuY2hgIGV0Yy5cbiAgICAvLyBgb25EZWNpZGVyQ29tcGxldGVgIGZpcmVzIGZyb20gc3ViLWJ1aWxkZXIgYC5lbmQoKWAuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG5cbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX3N0YWdlU3RlcE1hcC5zZXQobmFtZSwgdGhpcy5fc3RlcENvdW50ZXIpO1xuXG4gICAgcmV0dXJuIG5ldyBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+KFxuICAgICAgdGhpcyxcbiAgICAgIG5vZGUsXG4gICAgICBzcGVjLFxuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cyxcbiAgICAgIHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zLFxuICAgICAgdGhpcy5fc3RlcENvdW50ZXIsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICApO1xuICB9XG5cbiAgYWRkU2VsZWN0b3JGdW5jdGlvbihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248YW55LCBUU2NvcGU+LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgLyoqIGB7IHJldHJ5IH1gIGdpdmVzIHRoZSBTRUxFQ1RPUiBTVEFHRSBhIHJldHJ5IHBvbGljeSDigJQgc2FtZSByZWFzb25pbmcgYXNcbiAgICAgKiAgYGFkZERlY2lkZXJGdW5jdGlvbmA6IHRoaXMgbWV0aG9kIHJldHVybnMgYSBzdWItYnVpbGRlciwgc28gYSBjaGFpbmVkXG4gICAgICogIGAucmV0cnkoKWAgd291bGQgYmUgYW1iaWd1b3VzOyBgeyB0YWdzIH1gIGxpa2V3aXNlLiAqL1xuICAgIG9wdGlvbnM/OiB7IGZhaWxGYXN0PzogYm9vbGVhbjsgcmV0cnk/OiBSZXRyeVBvbGljeTsgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGFkbWl0SWQoJ3N0YWdlIGlkJywgaWQsICdzdGFnZScpO1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIC8vIE5vIGRpc3BhdGNoZXIgZ3VhcmQgb24gYGN1cmAg4oCUIHNlZSBgYWRkRGVjaWRlckZ1bmN0aW9uYC5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSwgaWQsIGZuIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgLy8gYGZhaWxGYXN0YDogd2hlbiB0aGUgc2VsZWN0b3IgcGlja3Mg4omlMiBicmFuY2hlcyB0aGV5IGZhbiBvdXQgaW4gcGFyYWxsZWxcbiAgICAvLyB2aWEgQ2hpbGRyZW5FeGVjdXRvci4gRGVmYXVsdCA9IGBQcm9taXNlLmFsbFNldHRsZWRgIChiZXN0LWVmZm9ydDogZXZlcnlcbiAgICAvLyBicmFuY2ggcnVucyB0byBjb21wbGV0aW9uIGV2ZW4gaWYgc29tZSBmYWlsKS4gYGZhaWxGYXN0OiB0cnVlYCA9IGBQcm9taXNlLmFsbGBcbiAgICAvLyAodGhlIGZpcnN0IGJyYW5jaCBlcnJvciByZWplY3RzICsgYWJvcnRzKSDigJQgdXNlIHdoZW4gQUxMIHNlbGVjdGVkIGJyYW5jaGVzXG4gICAgLy8gYXJlIFJFUVVJUkVEIChlLmcuIGFzc2VtYmxpbmcgYSByZXF1ZXN0IGZyb20gaW5kZXBlbmRlbnQtYnV0LXJlcXVpcmVkIHBhcnRzKSxcbiAgICAvLyBub3QgYmVzdC1lZmZvcnQgZmFuLW91dC4gU2FtZSBmbGFnIGBhZGRMaXN0T2ZGdW5jdGlvbmAgZXhwb3Nlcy5cbiAgICBpZiAob3B0aW9ucz8uZmFpbEZhc3QpIG5vZGUuZmFpbEZhc3QgPSB0cnVlO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBmbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIGlkLCB0eXBlOiAnc3RhZ2UnLCBoYXNTZWxlY3RvcjogdHJ1ZSB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGFwcGx5UmV0cnlQb2xpY3kobm9kZSwgc3BlYywgb3B0aW9ucz8ucmV0cnksIGBhZGRTZWxlY3RvckZ1bmN0aW9uKCcke2lkfScpYCk7XG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRTZWxlY3RvckZ1bmN0aW9uKCcke2lkfScpYCk7XG5cbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIEw3LjMg4oCUIFNlbGVjdG9yIG5vZGU6IHNhbWUgYXMgZGVjaWRlci4gQnJhbmNoZXMgKyBjb21wbGV0ZSBldmVudFxuICAgIC8vIGNvbWUgZnJvbSB0aGUgU2VsZWN0b3JGbkxpc3Qgc3ViLWJ1aWxkZXIuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG5cbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX3N0YWdlU3RlcE1hcC5zZXQobmFtZSwgdGhpcy5fc3RlcENvdW50ZXIpO1xuXG4gICAgcmV0dXJuIG5ldyBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+KFxuICAgICAgdGhpcyxcbiAgICAgIG5vZGUsXG4gICAgICBzcGVjLFxuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cyxcbiAgICAgIHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zLFxuICAgICAgdGhpcy5fc3RlcENvdW50ZXIsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICApO1xuICB9XG5cbiAgLy8g4pSA4pSAIFBhcmFsbGVsIChGb3JrKSDilIDilIBcblxuICBhZGRMaXN0T2ZGdW5jdGlvbihjaGlsZHJlbjogU2ltcGxpZmllZFBhcmFsbGVsU3BlYzxUT3V0LCBUU2NvcGU+W10sIG9wdGlvbnM/OiB7IGZhaWxGYXN0PzogYm9vbGVhbiB9KTogdGhpcyB7XG4gICAgY29uc3QgeyBjdXIsIGN1clNwZWMgfSA9IHRoaXMuX25lZWRGb3JrUGFyZW50KCk7XG4gICAgY29uc3QgZm9ya0lkID0gY3VyLmlkO1xuXG4gICAgY3VyU3BlYy50eXBlID0gJ2ZvcmsnO1xuICAgIGlmIChvcHRpb25zPy5mYWlsRmFzdCkgY3VyLmZhaWxGYXN0ID0gdHJ1ZTtcblxuICAgIGZvciAoY29uc3QgeyBpZCwgbmFtZSwgZm4sIHJldHJ5LCB0YWdzIH0gb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmICghaWQpIGZhaWwoYGNoaWxkIGlkIHJlcXVpcmVkIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICAgIGFkbWl0SWQoJ2ZvcmsgY2hpbGQgaWQnLCBpZCwgJ3N0YWdlJyk7XG4gICAgICBpZiAoY3VyLmNoaWxkcmVuPy5zb21lKChjKSA9PiBjLmlkID09PSBpZCkpIHtcbiAgICAgICAgZmFpbChgZHVwbGljYXRlIGNoaWxkIGlkICcke2lkfScgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZTogbmFtZSA/PyBpZCwgaWQgfTtcbiAgICAgIGlmIChmbikge1xuICAgICAgICBub2RlLmZuID0gZm47XG4gICAgICB9XG4gICAgICB0aGlzLl9yZWdpc3RlclN0YWdlKGlkLCBmbik7XG5cbiAgICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgICAgbmFtZTogbmFtZSA/PyBpZCxcbiAgICAgICAgaWQsXG4gICAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICAgIGlzUGFyYWxsZWxDaGlsZDogdHJ1ZSxcbiAgICAgICAgcGFyYWxsZWxHcm91cElkOiBmb3JrSWQsXG4gICAgICB9O1xuICAgICAgYXBwbHlSZXRyeVBvbGljeShub2RlLCBzcGVjLCByZXRyeSwgYGFkZExpc3RPZkZ1bmN0aW9uIGNoaWxkICcke2lkfSdgKTtcbiAgICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCB0YWdzLCBgYWRkTGlzdE9mRnVuY3Rpb24gY2hpbGQgJyR7aWR9J2ApO1xuXG4gICAgICBjdXIuY2hpbGRyZW4gPSBjdXIuY2hpbGRyZW4gfHwgW107XG4gICAgICBjdXIuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgIGN1clNwZWMuY2hpbGRyZW4gPSBjdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgICAgY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgICAgLy8gTDcuMyDigJQgZmlyZSBzdHJ1Y3R1cmUgZXZlbnRzIGZvciB0aGUgY2hpbGQgKyB0aGUgZm9yayBlZGdlLlxuICAgICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGN1clNwZWMuaWQsIHNwZWMuaWQsICdmb3JrLWJyYW5jaCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkTmFtZXMgPSBjaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSB8fCBjLmlkKS5qb2luKCcsICcpO1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gUnVucyBpbiBwYXJhbGxlbDogJHtjaGlsZE5hbWVzfWApO1xuXG4gICAgdGhpcy5fY3Vyc29yVGFpbCA9IGB0aGUgcGFyYWxsZWwgY2hpbGRyZW4gKCR7Y2hpbGROYW1lc30pYDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gT05FIEJSQU5DSCBQRVIgSVRFTSwgaW4gcGFyYWxsZWwg4oCUIHdpdGggdGhlIG51bWJlciBvZiBicmFuY2hlcyBkZWNpZGVkXG4gICAqIGF0IFJVTiB0aW1lIGZyb20gdGhlIHBheWxvYWQgcmF0aGVyIHRoYW4gYXQgYnVpbGQgdGltZS5cbiAgICpcbiAgICogYGFkZExpc3RPZkZ1bmN0aW9uYCBmYW5zIG91dCBhIGZpeGVkIHNldCBvZiBicmFuY2hlcyB5b3UgbmFtZSBpbiB0aGUgY2hhcnQuXG4gICAqIFRoaXMgZmFucyBvdXQgb3ZlciBkYXRhIHRoZSBjaGFydCBoYXMgbm90IHNlZW4geWV0OiB0aHJlZSBjaHVua3MgbWFrZSB0aHJlZVxuICAgKiBicmFuY2hlcywgdGVuIG1ha2UgdGVuLiBFYWNoIGJyYW5jaCBydW5zIGFzIGl0cyBvd24gaXNvbGF0ZWQgc3ViZmxvdyDigJQgaXRzXG4gICAqIG93biBtZW1vcnksIGl0cyBvd24gY29tbWl0IGxvZywgYWRkcmVzc2FibGUgaW4gZXZlcnkgdHJhY2UgcXVlcnkgYXRcbiAgICogYDxzdGFnZUlkPn48aW5kZXg+YCDigJQgc28gYnJhbmNoZXMgY2Fubm90IGNvcnJ1cHQgZWFjaCBvdGhlcidzIGluLWZsaWdodFxuICAgKiBzdGF0ZSwgYW5kIGEgYmFja3dhcmQgc2xpY2UgdGhyb3VnaCBhIGJyYW5jaCByZXN1bHQgd29ya3Mgd2l0aCBubyBzcGVjaWFsXG4gICAqIGhhbmRsaW5nLiBEZXNpZ246IGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAgIERpc3BsYXkgbGFiZWwgZm9yIHRoZSBmYW4tb3V0IHN0YWdlLlxuICAgKiBAcGFyYW0gaWQgICAgIFN0YWJsZSBzdGFnZSBpZC4gTWF5IG5vdCBjb250YWluIGB+YCAocmVzZXJ2ZWQg4oCUIHRoZSBicmFuY2hcbiAgICogICAgICAgICAgICAgICBzZWdtZW50cyBhcmUgYnVpbHQgZnJvbSB0aGlzIGlkKS5cbiAgICogQHBhcmFtIGNvbmZpZyBgeyBpdGVtcywgYnJhbmNoLCBtYXhCcmFuY2hlcywgaW50bywgZmFpbEZhc3Q/IH1gOlxuICAgKiAgIC0gYGl0ZW1zKHNjb3BlKWAgcGlja3Mgd2hhdCB0byBmYW4gb3V0IG92ZXIgKHJlYWRzIGFyZSB0cmFja2VkKTtcbiAgICogICAtIGBicmFuY2goaXRlbSwgaW5kZXgpYCBidWlsZHMgdGhlIGNoYXJ0IGZvciBPTkUgaXRlbSAoZWFjaCBicmFuY2gnc1xuICAgKiAgICAgc2NvcGUgaXMgYWxzbyBzZWVkZWQgd2l0aCBgaXRlbWAgYW5kIGBpbmRleGAsIHNvIHRoZSBpbnB1dCBpcyBpbiB0aGVcbiAgICogICAgIHRyYWNlIHJhdGhlciB0aGFuIGhpZGRlbiBpbiBhIGNsb3N1cmUpO1xuICAgKiAgIC0gYG1heEJyYW5jaGVzYCBpcyBSRVFVSVJFRCDigJQgYW4gdW5ib3VuZGVkIGZhbi1vdXQgZHJpdmVuIGJ5IG1vZGVsIG91dHB1dFxuICAgKiAgICAgaXMgYSByZXNvdXJjZSBhdHRhY2ssIHNvIHRoZXJlIGlzIG5vIGRlZmF1bHQgdG8gZm9yZ2V0LiBFeHRyYSBpdGVtcyBkb1xuICAgKiAgICAgbm90IHJ1biBhbmQgdGhlIHRydW5jYXRpb24gaXMgcmVjb3JkZWQ7XG4gICAqICAgLSBgaW50b2AgaXMgUkVRVUlSRUQg4oCUIHRoZSBzdGF0ZSBrZXkgdGhlIG9yZGVyZWQgcmVzdWx0cyBhcnJheSBpcyB3cml0dGVuXG4gICAqICAgICB0by4gYGludG9baV1gIGlzIGJyYW5jaCBgaWAncyByZXN1bHQsIGluIElURU1TIG9yZGVyLCB3aGF0ZXZlciBvcmRlclxuICAgKiAgICAgdGhlIGJyYW5jaGVzIGZpbmlzaGVkIGluO1xuICAgKiAgIC0gYGZhaWxGYXN0YCBpcyB0aGUgc2FtZSBwb2xpY3kgdGhlIHJlc3Qgb2YgdGhlIGxpYnJhcnkncyBwYXJhbGxlbGlzbVxuICAgKiAgICAgdXNlczogYHRydWVgIHJlamVjdHMgb24gdGhlIGZpcnN0IGZhaWxpbmcgYnJhbmNoLCBvbWl0dGVkIHJ1bnMgdGhlbSBhbGxcbiAgICogICAgIGJlc3QtZWZmb3J0IChhIGZhaWxlZCBicmFuY2gncyBzbG90IGlzIGB1bmRlZmluZWRgKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZmxvd0NoYXJ0PFN0YXRlPignU3BsaXQnLCBzcGxpdEZuLCAnc3BsaXQnKVxuICAgKiAgIC5hZGRQYXJhbGxlbEZvckVhY2goJ1JldmlldyBlYWNoIGNodW5rJywgJ3Jldmlldy1jaHVua3MnLCB7XG4gICAqICAgICBpdGVtczogKHNjb3BlKSA9PiBzY29wZS5jaHVua3MsXG4gICAqICAgICBicmFuY2g6IChjaHVuaywgaSkgPT4gYnVpbGRSZXZpZXdDaGFydChjaHVuaywgaSksXG4gICAqICAgICBtYXhCcmFuY2hlczogOCxcbiAgICogICAgIGludG86ICdyZXZpZXdzJyxcbiAgICogICB9KVxuICAgKiAgIC5hZGRGdW5jdGlvbignTWVyZ2UnLCBtZXJnZUZuLCAnbWVyZ2UnKSAgIC8vIHJlYWRzIHNjb3BlLnJldmlld3NcbiAgICogICAuYnVpbGQoKTtcbiAgICogYGBgXG4gICAqL1xuICBhZGRQYXJhbGxlbEZvckVhY2g8VEl0ZW0gPSBhbnk+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIGNvbmZpZzogUGFyYWxsZWxGb3JFYWNoQ29uZmlnPFRJdGVtLCBUU2NvcGU+LFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICAvLyBUaGUgZ2VuZXJhdGVkIGJyYW5jaCBzZWdtZW50cyBlbWJlZCB0aGlzIGlkIHZlcmJhdGltXG4gICAgLy8gKGA8aWQ+fjxpbmRleD5gKSwgc28gYSBtYXJrZXIgaW5zaWRlIGl0IHdvdWxkIG1ha2UgdGhlIHNlZ21lbnRcbiAgICAvLyBhbWJpZ3VvdXMgdG8gcGFyc2UuIFJlZnVzaW5nIGl0IGhlcmUg4oCUIG9uIGEgYnJhbmQtbmV3IG1ldGhvZCwgYXQgemVyb1xuICAgIC8vIGJhY2stY29tcGF0IGNvc3Qg4oCUIGtpbGxzIHRoZSBhbWJpZ3VpdHkgY2xhc3Mgb3V0cmlnaHQgYW5kIGtlZXBzXG4gICAgLy8gYHBhcnNlQnJhbmNoU2VnbWVudGAgYSBzcGxpdCBhdCB0aGUgbGFzdCBtYXJrZXIgaW5zdGVhZCBvZiBhIGhldXJpc3RpYy5cbiAgICBhZG1pdElkKCdwYXJhbGxlbEZvckVhY2ggc3RhZ2UgaWQnLCBpZCwgJ3NlZ21lbnQnKTtcbiAgICB0aGlzLl9jbGFpbUZyZXNoSWQoaWQsIGBhZGRQYXJhbGxlbEZvckVhY2goJyR7aWR9JylgKTtcbiAgICBpZiAoIWNvbmZpZyB8fCB0eXBlb2YgY29uZmlnLml0ZW1zICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBjb25maWcuYnJhbmNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmYWlsKGBhZGRQYXJhbGxlbEZvckVhY2goJyR7aWR9JykgcmVxdWlyZXMgaXRlbXMoc2NvcGUpIGFuZCBicmFuY2goaXRlbSwgaW5kZXgpIGZ1bmN0aW9ucy5gKTtcbiAgICB9XG4gICAgLy8gUkVRVUlSRUQsIGJvdGggb2YgdGhlbSDigJQgc2VlIGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kIChEMikuXG4gICAgaWYgKHR5cGVvZiBjb25maWcubWF4QnJhbmNoZXMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGNvbmZpZy5tYXhCcmFuY2hlcykgfHwgY29uZmlnLm1heEJyYW5jaGVzIDwgMSkge1xuICAgICAgZmFpbChcbiAgICAgICAgYGFkZFBhcmFsbGVsRm9yRWFjaCgnJHtpZH0nKSByZXF1aXJlcyBtYXhCcmFuY2hlcyDigJQgYSBwb3NpdGl2ZSBpbnRlZ2VyIGNlaWxpbmcgb24gaG93IG1hbnkgYCArXG4gICAgICAgICAgJ2JyYW5jaGVzIG9uZSBleGVjdXRpb24gbWF5IHN0YXJ0LiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gZGVmYXVsdDogYW4gdW5ib3VuZGVkIGZhbi1vdXQgJyArXG4gICAgICAgICAgJ2RyaXZlbiBieSBydW50aW1lIGRhdGEgKG1vZGVsIG91dHB1dCwgYW4gdXBzdHJlYW0gQVBJKSBpcyBhIHJlc291cmNlIGF0dGFjay4gUGljayB0aGUgJyArXG4gICAgICAgICAgJ2xhcmdlc3QgbnVtYmVyIHRoaXMgZmxvdyBjYW4gYWZmb3JkLiBTZWUgZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29uZmlnLmludG8gIT09ICdzdHJpbmcnIHx8IGNvbmZpZy5pbnRvID09PSAnJykge1xuICAgICAgZmFpbChcbiAgICAgICAgYGFkZFBhcmFsbGVsRm9yRWFjaCgnJHtpZH0nKSByZXF1aXJlcyBpbnRvIOKAlCB0aGUgc3RhdGUga2V5IGl0cyBvcmRlcmVkIHJlc3VsdHMgYXJyYXkgaXMgYCArXG4gICAgICAgICAgJ3dyaXR0ZW4gdG8uIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBkZWZhdWx0IGRlcml2ZWQgZnJvbSB0aGUgc3RhZ2UgaWQ6IGEgZGVyaXZlZCBrZXkgJyArXG4gICAgICAgICAgJ2NvdWxkIHNpbGVudGx5IG92ZXJ3cml0ZSBzdGF0ZSB0aGUgY2hhcnQgYWxyZWFkeSBvd25zLiBTZWUgZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lLFxuICAgICAgaWQsXG4gICAgICBpc0R5bmFtaWNQYXJhbGxlbDogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsRm9yRWFjaDogY29uZmlnIGFzIFBhcmFsbGVsRm9yRWFjaENvbmZpZzxhbnksIFRTY29wZT4sXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBpZiAoY29uZmlnLmZhaWxGYXN0ICE9PSB1bmRlZmluZWQpIG5vZGUuZmFpbEZhc3QgPSBjb25maWcuZmFpbEZhc3Q7XG5cbiAgICAvLyBgdHlwZTogJ2ZvcmsnYCDigJQgYSBmYW4tb3V0IGlzIHdoYXQgdGhpcyBpcywgYW5kIGV2ZXJ5IGV4aXN0aW5nIGNvbnN1bWVyXG4gICAgLy8gYWxyZWFkeSBrbm93cyBob3cgdG8gZHJhdyBvbmUuIFRoZSBcImJyYW5jaGVzIGFyZSBkZWNpZGVkIGF0IHJ1bnRpbWVcIlxuICAgIC8vIGRldGFpbCByaWRlcyBgaXNEeW5hbWljUGFyYWxsZWxgIHJhdGhlciB0aGFuIGEgbmV3IG5vZGUgdHlwZSwgc28gbm90aGluZ1xuICAgIC8vIGRvd25zdHJlYW0gaGFzIHRvIGxlYXJuIGEgbmV3IHdvcmQgdG8ga2VlcCB3b3JraW5nLlxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdmb3JrJywgaXNEeW5hbWljUGFyYWxsZWw6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG5cbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24gPz8gYFJ1bnMgb25lIGJyYW5jaCBwZXIgaXRlbSBpbnRvICcke2NvbmZpZy5pbnRvfSdgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdWJmbG93IE1vdW50aW5nIOKUgOKUgFxuXG4gIGFkZFN1YkZsb3dDaGFydChpZDogc3RyaW5nLCBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LCBtb3VudE5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zKTogdGhpcyB7XG4gICAgY29uc3QgeyBjdXIsIGN1clNwZWMgfSA9IHRoaXMuX25lZWRGb3JrUGFyZW50KCk7XG5cbiAgICBpZiAoY3VyLmNoaWxkcmVuPy5zb21lKChjKSA9PiBjLmlkID09PSBpZCkpIHtcbiAgICAgIGZhaWwoYGR1cGxpY2F0ZSBjaGlsZCBpZCAnJHtpZH0nIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICB9XG4gICAgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZChpZCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQ7XG4gICAgdGhpcy5fbW91bnRTdWJmbG93KGlkLCBzdWJmbG93LCAoKSA9PiB7XG4gICAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICAgIGlkLFxuICAgICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgICBzdWJmbG93TmFtZSxcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgICAgaWQsXG4gICAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgICBpc1BhcmFsbGVsQ2hpbGQ6IHRydWUsXG4gICAgICAgIHBhcmFsbGVsR3JvdXBJZDogZm9ya0lkLFxuICAgICAgICBzdWJmbG93U3RydWN0dXJlOiBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFRoZSBtb3VudCdzIE9OTFkgdGFnIHNpdGU6IHRoZSBjdXJzb3Igc3RheXMgb24gdGhlIHBhcmVudCAoc2VlXG4gICAgICAvLyBgX2N1cnNvclRhaWxgKSwgc28gYC50YWcoKWAgYWZ0ZXIgdGhpcyBjYWxsIHJlZnVzZXMuXG4gICAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZFN1YkZsb3dDaGFydCgnJHtpZH0nKWApO1xuXG4gICAgICBjdXJTcGVjLnR5cGUgPSAnZm9yayc7XG4gICAgICBjdXIuY2hpbGRyZW4gPSBjdXIuY2hpbGRyZW4gfHwgW107XG4gICAgICBjdXIuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgIGN1clNwZWMuY2hpbGRyZW4gPSBjdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgICAgY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuICAgICAgLy8gTDcuMyDigJQgU3ViZmxvdyBtb3VudDogc3RhZ2UgZXZlbnQgKyBmb3JrIGVkZ2UgKyBtb3VudCBsaWZlY3ljbGVcbiAgICAgIC8vIGV2ZW50LiBNb3VudC1vbmx5IHNlbWFudGljczogcGFyZW50IHJlY29yZGVycyBkbyBOT1QgcmVwbGF5IHRoZVxuICAgICAgLy8gc3ViZmxvdydzIG93biBpbnRlcm5hbCBzdHJ1Y3R1cmUgZXZlbnRzLlxuICAgICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGN1clNwZWMuaWQsIGlkLCAnZm9yay1icmFuY2gnKTtcbiAgICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCBmYWxzZSwgc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuICAgIH0pO1xuICAgIHRoaXMuX2FwcGVuZFN1YmZsb3dEZXNjcmlwdGlvbihpZCwgc3ViZmxvd05hbWUsIHN1YmZsb3cpO1xuXG4gICAgdGhpcy5fY3Vyc29yVGFpbCA9IGB0aGUgc3ViZmxvdyBtb3VudCAnJHtzdWJmbG93TmFtZX0nYDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCB7IGN1ciwgY3VyU3BlYyB9ID0gdGhpcy5fbmVlZEZvcmtQYXJlbnQoKTtcblxuICAgIGlmIChjdXIuY2hpbGRyZW4/LnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSkge1xuICAgICAgZmFpbChgZHVwbGljYXRlIGNoaWxkIGlkICcke2lkfScgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIH1cbiAgICBhc3NlcnRTdWJmbG93SWRBbGxvd2VkKGlkKTtcbiAgICB0aGlzLl9jbGFpbUZyZXNoSWQoaWQsIGBhZGRMYXp5U3ViRmxvd0NoYXJ0KCcke2lkfScpYCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQ7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1Jlc29sdmVyOiByZXNvbHZlciBhcyBhbnksXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgIC8vIExhenkgbW91bnQgc3R1Yi4gVGhlIGxhenkgc3ViZmxvdydzIGludGVybmFscyB3aWxsIGJlIHNoYXBlZCBhdFxuICAgIC8vIHJlc29sdXRpb24gdGltZS5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBpc1BhcmFsbGVsQ2hpbGQ6IHRydWUsXG4gICAgICBwYXJhbGxlbEdyb3VwSWQ6IGZvcmtJZCxcbiAgICAgIGlzTGF6eTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRMYXp5U3ViRmxvd0NoYXJ0KCcke2lkfScpYCk7XG5cbiAgICBjdXJTcGVjLnR5cGUgPSAnZm9yayc7XG4gICAgY3VyLmNoaWxkcmVuID0gY3VyLmNoaWxkcmVuIHx8IFtdO1xuICAgIGN1ci5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIGN1clNwZWMuY2hpbGRyZW4gPSBjdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIGN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcbiAgICAvLyBMNy4zIOKAlCBMYXp5IHN1YmZsb3cgcGFyYWxsZWwgbW91bnQuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZUVkZ2VBZGRlZChjdXJTcGVjLmlkLCBpZCwgJ2ZvcmstYnJhbmNoJyk7XG4gICAgdGhpcy5fZmlyZVN1YmZsb3dNb3VudGVkKGlkLCBzdWJmbG93TmFtZSwgaWQsIHRydWUpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KGlkLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW0xhenkgU3ViLUV4ZWN1dGlvbjogJHtzdWJmbG93TmFtZX1dYCk7XG5cbiAgICB0aGlzLl9jdXJzb3JUYWlsID0gYHRoZSBsYXp5IHN1YmZsb3cgbW91bnQgJyR7c3ViZmxvd05hbWV9J2A7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRMYXp5U3ViRmxvd0NoYXJ0TmV4dChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXIubmV4dCkge1xuICAgICAgZmFpbChgY2Fubm90IGFkZCBzdWJmbG93IGFzIG5leHQgd2hlbiBuZXh0IGlzIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgfVxuICAgIGFzc2VydFN1YmZsb3dJZEFsbG93ZWQoaWQpO1xuICAgIHRoaXMuX2NsYWltRnJlc2hJZChpZCwgYGFkZExhenlTdWJGbG93Q2hhcnROZXh0KCcke2lkfScpYCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93UmVzb2x2ZXI6IHJlc29sdmVyIGFzIGFueSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgLy8gTGF6eSBtb3VudCBzdHViLiBUaGUgbGF6eSBzdWJmbG93J3MgaW50ZXJuYWxzIHdpbGwgYmUgc2hhcGVkIGF0XG4gICAgLy8gcmVzb2x1dGlvbiB0aW1lLlxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIGlzTGF6eTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRMYXp5U3ViRmxvd0NoYXJ0TmV4dCgnJHtpZH0nKWApO1xuXG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICAvLyBMNy4zIOKAlCBMYXp5IGxpbmVhci1tb3VudCBzdWJmbG93LlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCB0cnVlKTtcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChpZCwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFtMYXp5IFN1Yi1FeGVjdXRpb246ICR7c3ViZmxvd05hbWV9XWApO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdWJGbG93Q2hhcnROZXh0KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXIubmV4dCkge1xuICAgICAgZmFpbChgY2Fubm90IGFkZCBzdWJmbG93IGFzIG5leHQgd2hlbiBuZXh0IGlzIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgfVxuICAgIGFzc2VydFN1YmZsb3dJZEFsbG93ZWQoaWQpO1xuXG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBtb3VudE5hbWUgfHwgaWQ7XG4gICAgdGhpcy5fbW91bnRTdWJmbG93KGlkLCBzdWJmbG93LCAoKSA9PiB7XG4gICAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICAgIGlkLFxuICAgICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgICBzdWJmbG93TmFtZSxcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgY29uc3QgYXR0YWNoZWRTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgICBpZCxcbiAgICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgICAgc3ViZmxvd05hbWUsXG4gICAgICAgIHN1YmZsb3dTdHJ1Y3R1cmU6IHN1YmZsb3cuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgfTtcblxuICAgICAgLy8gQSBsaW5lYXIgbW91bnQgbW92ZXMgdGhlIGN1cnNvciwgc28gYC50YWcoKWAgYWZ0ZXIgaXQgYWxzbyB3b3JrcyDigJRcbiAgICAgIC8vIGBhcHBseVRhZ3NgIHJlZnVzZXMgYSBzZWNvbmQgZGVjbGFyYXRpb24gaWYgYm90aCBzaXRlcyBhcmUgdXNlZC5cbiAgICAgIGFwcGx5VGFncyhub2RlLCBhdHRhY2hlZFNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRTdWJGbG93Q2hhcnROZXh0KCcke2lkfScpYCk7XG5cbiAgICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuICAgICAgY3VyLm5leHQgPSBub2RlO1xuICAgICAgY3VyU3BlYy5uZXh0ID0gYXR0YWNoZWRTcGVjO1xuICAgICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKGF0dGFjaGVkU3BlYyk7XG4gICAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG4gICAgICAvLyBMNy4zIOKAlCBMaW5lYXItbW91bnQgc3ViZmxvdy5cbiAgICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKGF0dGFjaGVkU3BlYyk7XG4gICAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcbiAgICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCBmYWxzZSwgc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuICAgIH0pO1xuICAgIHRoaXMuX2FwcGVuZFN1YmZsb3dEZXNjcmlwdGlvbihpZCwgc3ViZmxvd05hbWUsIHN1YmZsb3cpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgUmV0cnkg4pSA4pSAXG5cbiAgLyoqXG4gICAqIEdpdmUgdGhlIHN0YWdlIHlvdSBKVVNUIGFkZGVkIGEgZGVjbGFyYXRpdmUgcmV0cnkgcG9saWN5LlxuICAgKlxuICAgKiAjIyBXaHkgZGVjbGFyZSBpdCBpbnN0ZWFkIG9mIHdyaXRpbmcgYSBsb29wIGluc2lkZSB0aGUgc3RhZ2VcbiAgICpcbiAgICogQSByZXRyeSBoYW5kLXJvbGxlZCBpbnNpZGUgYSBzdGFnZSBmdW5jdGlvbiBpcyBpbnZpc2libGUgdG8gdGhlIHRyYWNlLiBUaGVcbiAgICogbmFycmF0aXZlIHNob3dzIG9uZSBzdGFnZSwgdGhlIGNvbW1pdCBsb2cgc2hvd3Mgb25lIGVudHJ5LCBhbmQgdGhlIHR3b1xuICAgKiBmYWlsZWQgY2FsbHMgdGhhdCBjYW1lIGJlZm9yZSB0aGUgc3VjY2Vzc2Z1bCBvbmUgbGVmdCBubyBtYXJrIGFueXdoZXJlIOKAlFxuICAgKiBhbiB1bmV4cGxhaW5lZCBiZWhhdmlvdXIgaW4gYSBsaWJyYXJ5IHdob3NlIHdob2xlIHBvaW50IGlzIHRoYXQgbm90aGluZ1xuICAgKiBpbnZpc2libGUgaGFwcGVucy4gRGVjbGFyZWQgaGVyZSwgZXZlcnkgYXR0ZW1wdCBpcyBwYXJ0IG9mIHRoZSByZWNvcmQ6IGVhY2hcbiAgICogZmFpbGVkIGF0dGVtcHQgZmlyZXMgYEZsb3dSZWNvcmRlci5vblN0YWdlUmV0cnlgIGFuZCBhcHBlYXJzIGluIHRoZVxuICAgKiBuYXJyYXRpdmUsIGluIG9yZGVyLCBiZXR3ZWVuIHRoZSBhdHRlbXB0cycgb3duIHJlYWRzIGFuZCB3cml0ZXMuXG4gICAqXG4gICAqICMjIFdoYXQgYW4gYXR0ZW1wdCBpc1xuICAgKlxuICAgKiBBIGZhaWxlZCBhdHRlbXB0J3Mgc3RhZ2VkIHdyaXRlcyBhcmUgRElTQ0FSREVEIOKAlCB0aGUgbmV4dCBhdHRlbXB0IHN0YXJ0c1xuICAgKiBmcm9tIGNvbW1pdHRlZCBzdGF0ZSwgbmV2ZXIgZnJvbSB0aGUgd3JlY2thZ2Ugb2YgdGhlIGxhc3QgdHJ5LiBUaGUgZmluYWxcbiAgICogYXR0ZW1wdCBiZWhhdmVzIGV4YWN0bHkgYXMgYSBzdGFnZSB3aXRoIG5vIHBvbGljeSBkb2VzOiBvbiBzdWNjZXNzIGl0XG4gICAqIGNvbW1pdHM7IG9uIGZhaWx1cmUgaXQgY29tbWl0cyB3aGF0IGl0IHdyb3RlIGFuZCByZXRocm93cyAoZm9vdHByaW50IGhhc1xuICAgKiBuZXZlciBoYWQgcm9sbGJhY2ssIGFuZCByZXRyeSBkb2VzIG5vdCBpbnRyb2R1Y2Ugb25lKS5cbiAgICpcbiAgICogQSBwYXVzZSBpcyBub3QgYSBmYWlsdXJlOiBuZWl0aGVyIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYCdzIHBhdXNlIG5vclxuICAgKiBgaW50ZXJydXB0KClgIGlzIGV2ZXIgcmV0cmllZC4gTm9yIGlzIGEgY2FuY2VsbGVkIHJ1bi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZmxvd0NoYXJ0PFN0YXRlPignRmV0Y2ggdXNlcicsIGZldGNoRm4sICdmZXRjaC11c2VyJylcbiAgICogICAuYWRkRnVuY3Rpb24oJ0NoYXJnZSBjYXJkJywgY2hhcmdlRm4sICdjaGFyZ2UnKVxuICAgKiAgIC5yZXRyeSh7IGF0dGVtcHRzOiAzLCBiYWNrb2ZmTXM6IChuKSA9PiAxMDAgKiAyICoqIChuIC0gMSkgfSlcbiAgICogICAuYWRkRnVuY3Rpb24oJ0NvbmZpcm0nLCBjb25maXJtRm4sICdjb25maXJtJylcbiAgICogYGBgXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gdGhlIENVUlJFTlQgY3Vyc29yIOKAlCB0aGUgc3RhZ2UgYWRkZWQgYnkgdGhlIGltbWVkaWF0ZWx5XG4gICAqIHByZWNlZGluZyBgc3RhcnQoKWAgLyBgYWRkRnVuY3Rpb24oKWAgLyBgYWRkU3RyZWFtaW5nRnVuY3Rpb24oKWAgL1xuICAgKiBgYWRkUGF1c2FibGVGdW5jdGlvbigpYC4gV2hlcmUgdGhlIGN1cnNvciB3b3VsZCBiZSBhbWJpZ3VvdXMgKGEgZGVjaWRlcixcbiAgICogc2VsZWN0b3IsIGJyYW5jaCwgb3IgZm9yayBjaGlsZCksIGRlY2xhcmUgdGhlIHBvbGljeSBpbiB0aGF0IG1ldGhvZCdzIG93blxuICAgKiBgcmV0cnlgIG9wdGlvbiBpbnN0ZWFkLlxuICAgKi9cbiAgcmV0cnkocG9saWN5OiBSZXRyeVBvbGljeSk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIC8vIEEgc3ViZmxvdyBtb3VudCAvIHBhcmFsbGVsIGZvcmsgaGFuZ3MgQ0hJTERSRU4gb2ZmIHRoZSBjdXJyZW50IHN0YWdlIGFuZFxuICAgIC8vIGxlYXZlcyB0aGUgY3Vyc29yIG9uIHRoYXQgc3RhZ2UuIEF0dGFjaGluZyB0aGUgcG9saWN5IHRvIHRoZSBjdXJzb3IgaGVyZVxuICAgIC8vIHdvdWxkIHNpbGVudGx5IHJldHJ5IHRoZSBzdGFnZSBCRUZPUkUgdGhlIHRoaW5nIHlvdSBqdXN0IHdyb3RlLlxuICAgIGlmICh0aGlzLl9jdXJzb3JUYWlsKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgcmV0cnkoKSBjYW5ub3QgZm9sbG93ICR7dGhpcy5fY3Vyc29yVGFpbH0g4oCUIHRoYXQgYXR0YWNoZXMgdG8gJyR7Y3VyLm5hbWV9JyB3aXRob3V0IG1vdmluZyB0aGUgY3Vyc29yLCBzbyBgICtcbiAgICAgICAgICBgdGhlIHBvbGljeSB3b3VsZCBsYW5kIG9uICcke2N1ci5uYW1lfScgcmF0aGVyIHRoYW4gb24gd2hhdCB5b3UganVzdCBhZGRlZC4gRGVjbGFyZSB0aGUgcG9saWN5IGF0IGl0cyBvd24gYCArXG4gICAgICAgICAgJ3NpdGUgaW5zdGVhZDogb24gdGhlIHN0YWdlcyBJTlNJREUgYSBzdWJmbG93IGNoYXJ0LCBvciB2aWEgdGhlIGByZXRyeWAgZmllbGQgb24gYW4gYWRkTGlzdE9mRnVuY3Rpb24gY2hpbGQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXIucmV0cnkpIGZhaWwoYHJldHJ5IGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgaWYgKGN1ci5pc1N1YmZsb3dSb290KSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgcmV0cnkoKSBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUgc3ViZmxvdyBtb3VudCAnJHtjdXIubmFtZX0nIOKAlCBhIG1vdW50IGhhcyBubyBzdGFnZSBmdW5jdGlvbiBvZiBpdHMgb3duLiBgICtcbiAgICAgICAgICAnRGVjbGFyZSB0aGUgcG9saWN5IG9uIHRoZSBzdGFnZXMgSU5TSURFIHRoZSBzdWJmbG93IGNoYXJ0IGluc3RlYWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXIuaXNEeW5hbWljUGFyYWxsZWwpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGByZXRyeSgpIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHRoZSBwYXJhbGxlbC1mb3ItZWFjaCBzdGFnZSAnJHtjdXIubmFtZX0nIOKAlCBpdCBoYXMgbm8gc3RhZ2UgZnVuY3Rpb24gb2YgaXRzIGAgK1xuICAgICAgICAgICdvd24uIERlY2xhcmUgdGhlIHBvbGljeSBvbiB0aGUgc3RhZ2VzIGluc2lkZSB0aGUgYnJhbmNoIGNoYXJ0IGl0cyBgYnJhbmNoYCBmYWN0b3J5IHJldHVybnMuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXIuaXNMb29wUmVmKSBmYWlsKGByZXRyeSgpIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHRoZSBsb29wIHJlZmVyZW5jZSAnJHtjdXIubmFtZX0nYCk7XG5cbiAgICBhcHBseVJldHJ5UG9saWN5KGN1ciwgY3VyU3BlYywgcG9saWN5LCBgcmV0cnkoKSBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgRGVjbGFyZWQgdGFncyDilIDilIBcblxuICAvKipcbiAgICogUHV0IE5BTUVTIG9uIHRoZSBzdGFnZSB5b3UgSlVTVCBhZGRlZC4gVGhlIGZpcnN0IGNvbW1pdCBidW5kbGUgb2YgZWFjaFxuICAgKiBleGVjdXRpb24gb2YgdGhhdCBzdGFnZSBjYXJyaWVzIHRoZW0gKGBDb21taXRCdW5kbGUudGFnc2Ag4oCUIHRoZSBidW5kbGVcbiAgICogYGNvbW1pdFN0b3BzYCBrZXlzIG9uKSwgYW5kIHRoZSBidWlsdCBzcGVjIGFkdmVydGlzZXMgdGhlbVxuICAgKiAoYFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZS50YWdzYCkuXG4gICAqXG4gICAqICMjIFdoeSBkZWNsYXJlIGl0IGluc3RlYWQgb2YgZGVyaXZpbmcgaXQgZnJvbSBpZHNcbiAgICpcbiAgICogQSByZWFkZXIgdGhhdCB3YW50cyBcInRoZSBMTE0gdHVybnNcIiBvZiBhIHN0b3JlZCByZWNvcmRpbmcgaGFkIHRvIGNsYXNzaWZ5XG4gICAqIHN0YWdlcyBmcm9tIHRoZWlyIGlkcyDigJQgYSBzd2l0Y2ggb3ZlciBgcnVudGltZVN0YWdlSWRgIHRoYXQgcGFyc2VzIGAjYCBhbmRcbiAgICogYC9gLCBsaXZlcyBpbiB0aGUgY29uc3VtZXIsIGFuZCBzaWxlbnRseSBnb2VzIHN0YWxlIHdoZW4gYSBzdGFnZSBpc1xuICAgKiByZW5hbWVkLiBEZWNsYXJlZCBoZXJlLCB0aGUgbmFtZSB0cmF2ZWxzIFdJVEggdGhlIGNvbW1pdDogYSByZWNvcmRpbmcgZnJvbVxuICAgKiBhbnkgY2hhcnQgY2FycmllcyBpdHMgb3duIG1pbGVzdG9uZXMsIGFuZCBgdGFnU3RvcHNgIChmb290dHJhY2UpXG4gICAqIHNjcnVicyB0aGVtIHdpdGggbm8gaWQgY29udmVudGlvbnMgYXQgYWxsLlxuICAgKlxuICAgKiAjIyBXaGF0IGEgdGFnIGlzLCBhbmQgaXMgbm90XG4gICAqXG4gICAqIEEgdGFnIGlzIGEgTkFNRSBkZWNsYXJlZCBhdCBidWlsZCB0aW1lIOKAlCBuZXZlciBhIHZhbHVlLiBUaGVyZSBpcyBub1xuICAgKiBydW4tdGltZSBgJHRhZygpYDogYSBydW50aW1lIHN0cmluZyBjb3VsZCBjYXJyeSBkYXRhIChgJ3VzZXI6JyArIGVtYWlsYClcbiAgICogcGFzdCBldmVyeSByZWRhY3Rpb24gcG9pbnQuIERhdGEtZGVwZW5kZW50IG1hcmtzIGFyZSBhIGtlZXAgcnVsZSBvdmVyXG4gICAqIHRoZSBmb2xkIGF0IHJlYWQgdGltZSwgb3IgdGVsZW1ldHJ5IHZpYSBgJGVtaXRgLiBGcmVlIHN0cmluZ3M6IGZvb3RwcmludGpzXG4gICAqIG93bnMgbm8gdm9jYWJ1bGFyeTsgYSBjb25zdW1lciBkZWNsYXJlcyBpdHMgb3duIChgJ21pbGVzdG9uZTo8a2luZD4nYCkuXG4gICAqXG4gICAqIFN0YW1wZWQgT05DRSBwZXIgZXhlY3V0aW9uIG9mIHRoZSBzdGFnZTogcmV0cnkgYXR0ZW1wdHMgc2hhcmUgb25lIHN0YW1wLFxuICAgKiBhIGZhaWxlZCBzdGFnZSBrZWVwcyBpdHMgdGFnICh0aGUgZXJyb3IgcGF0aCBjb21taXRzIGJlZm9yZSBpdCByZXRocm93cyksXG4gICAqIGEgc3RhZ2UgdGhhdCBgaW50ZXJydXB0KClgcyBhbmQgaXMgcmVzdW1lZCBpcyB0d28gdGFnZ2VkIHN0b3BzIG9uIGEgY2hhaW5cbiAgICogYmVjYXVzZSBpdCByYW4gdHdpY2UsIGFuZCBhbiBFTVBUWSBjb21taXQgaXMgYSB0YWdnZWQgc3RvcCB0b28uIEEgc3ViZmxvd1xuICAgKiBtb3VudCBvciBhIHBhcmFsbGVsLWZvci1lYWNoIHN0YWdlIGNhbiBiZSB0YWdnZWQ7IHRoZSB0YWcgbGFuZHMgb24gdGhlXG4gICAqIGJ1bmRsZSB0aGF0IHJlY29yZHMgaXRzIHJlc3VsdCDigJQgZm9yIGEgbW91bnQsIGl0cyBGSVJTVCBidW5kbGUgaW4gdGhlXG4gICAqIHBhcmVudCBsb2cgKHRoZSBleGl0IGJ1bmRsZSBjYXJyaWVzIG5vbmUpLCB3aGlsZSB0aGUgc3ViZmxvdydzIG93biBsb2dcbiAgICogaXMgdW50b3VjaGVkOiBpdHMgaW5uZXIgc3RhZ2VzIGRlY2xhcmUgdGhlaXIgb3duLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBmbG93Q2hhcnQ8U3RhdGU+KCdTZWVkJywgc2VlZEZuLCAnc2VlZCcpXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdDYWxsIG1vZGVsJywgY2FsbEZuLCAnY2FsbC1sbG0nKVxuICAgKiAgIC50YWcoJ21pbGVzdG9uZTpsbG0tdHVybicpXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdSb3V0ZScsIHJvdXRlRm4sICdyb3V0ZScpXG4gICAqICAgLnRhZygnbWlsZXN0b25lOmRlY2lzaW9uJywgJ2F1ZGl0JylcbiAgICogYGBgXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gdGhlIENVUlJFTlQgY3Vyc29yIOKAlCB0aGUgc3RhZ2UgYWRkZWQgYnkgdGhlIGltbWVkaWF0ZWx5XG4gICAqIHByZWNlZGluZyBgc3RhcnQoKWAgLyBgYWRkRnVuY3Rpb24oKWAgLyBgYWRkU3RyZWFtaW5nRnVuY3Rpb24oKWAgL1xuICAgKiBgYWRkUGF1c2FibGVGdW5jdGlvbigpYCAvIGBhZGRTdWJGbG93Q2hhcnROZXh0KClgIC8gYGFkZFBhcmFsbGVsRm9yRWFjaCgpYC5cbiAgICogV2hlcmUgdGhlIGN1cnNvciB3b3VsZCBiZSBhbWJpZ3VvdXMgKGEgZGVjaWRlciwgc2VsZWN0b3IsIGJyYW5jaCwgb3IgZm9ya1xuICAgKiBjaGlsZCksIGRlY2xhcmUgdGhlIHRhZ3MgaW4gdGhhdCBtZXRob2QncyBvd24gYHRhZ3NgIG9wdGlvbiBpbnN0ZWFkLiBBXG4gICAqIHN1YmZsb3cgTU9VTlQgaGFzIHRoYXQgb3B0aW9uIHRvbyAoYFN1YmZsb3dNb3VudE9wdGlvbnMudGFnc2AsIDkuMjEuMSlcbiAgICog4oCUIGFuZCBmb3IgYSBmb3JrLWNoaWxkIG1vdW50IChgYWRkU3ViRmxvd0NoYXJ0YCkgb3IgYSBicmFuY2ggbW91bnRcbiAgICogKGBhZGRTdWJGbG93Q2hhcnRCcmFuY2hgKSBpdCBpcyB0aGUgT05MWSBzaXRlOiB0aG9zZSBsZWF2ZSB0aGUgY3Vyc29yIG9uXG4gICAqIHRoZSBwYXJlbnQsIHNvIGAudGFnKClgIGFmdGVyIHRoZW0gcmVmdXNlcyByYXRoZXIgdGhhbiBtaXMtYXR0cmlidXRlLlxuICAgKlxuICAgKiBSZWZ1c2VkIGF0IGJ1aWxkIHRpbWU6IGFuIGVtcHR5IG5hbWUsIGEgbm9uLXN0cmluZywgdGhlIHJlc2VydmVkXG4gICAqIGJyYW5jaC1zZWdtZW50IG1hcmtlciBgfmAgaW5zaWRlIGEgbmFtZSwgYSBuYW1lIGRlY2xhcmVkIHR3aWNlLCBhbmQgYVxuICAgKiBzZWNvbmQgZGVjbGFyYXRpb24gb24gdGhlIHNhbWUgc3RhZ2UuXG4gICAqL1xuICB0YWcoLi4ubmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgLy8gU2FtZSBtaXMtYXR0cmlidXRpb24gZ3VhcmQgYXMgYC5yZXRyeSgpYDogYWZ0ZXIgYSBtb3VudCBvciBhIGZvcmsgdGhlXG4gICAgLy8gY3Vyc29yIHN0aWxsIHBvaW50cyBhdCB0aGUgc3RhZ2UgQkVGT1JFIHdoYXQgeW91IGp1c3Qgd3JvdGUuXG4gICAgaWYgKHRoaXMuX2N1cnNvclRhaWwpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGB0YWcoKSBjYW5ub3QgZm9sbG93ICR7dGhpcy5fY3Vyc29yVGFpbH0g4oCUIHRoYXQgYXR0YWNoZXMgdG8gJyR7Y3VyLm5hbWV9JyB3aXRob3V0IG1vdmluZyB0aGUgY3Vyc29yLCBzbyBgICtcbiAgICAgICAgICBgdGhlIG5hbWVzIHdvdWxkIGxhbmQgb24gJyR7Y3VyLm5hbWV9JyByYXRoZXIgdGhhbiBvbiB3aGF0IHlvdSBqdXN0IGFkZGVkLiBEZWNsYXJlIHRoZSB0YWdzIGF0IHRoZWlyIG93biBgICtcbiAgICAgICAgICBcInNpdGUgaW5zdGVhZDogdmlhIHRoZSBgdGFnc2AgZmllbGQgaW4gdGhlIG1vdW50J3Mgb3duIG9wdGlvbnMgKGBTdWJmbG93TW91bnRPcHRpb25zLnRhZ3NgLCA5LjIxLjEpLCBvciBcIiArXG4gICAgICAgICAgJ3ZpYSB0aGUgYHRhZ3NgIGZpZWxkIG9uIGFuIGFkZExpc3RPZkZ1bmN0aW9uIGNoaWxkLiBUaGUgc3RhZ2VzIElOU0lERSBhIHN1YmZsb3cgY2hhcnQgZGVjbGFyZSB0aGVpciBvd24uJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXIuaXNMb29wUmVmKSBmYWlsKGB0YWcoKSBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUgbG9vcCByZWZlcmVuY2UgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDApIGZhaWwoYHRhZygpIGF0ICcke2N1ci5uYW1lfSc6IGF0IGxlYXN0IG9uZSBuYW1lIGlzIHJlcXVpcmVkYCk7XG5cbiAgICBhcHBseVRhZ3MoY3VyLCBjdXJTcGVjLCBuYW1lcywgYHRhZygpIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICAvLyBUaGUgc3RhZ2UncyBgb25TdGFnZUFkZGVkYCBoYXMgYWxyZWFkeSBmaXJlZCAodGhlIGRvb3IgY29tZXMgYWZ0ZXJcbiAgICAvLyB0aGUgYWRkKSwgc28gdGhlIG5hbWVzIGdvIG91dCBhcyB0aGVpciBvd24gZXZlbnQg4oCUIGEgcmVjb3JkZXIgdGhhdFxuICAgIC8vIGNvcGllZCBmaWVsZHMgYXQgYWRkIHRpbWUgd291bGQgb3RoZXJ3aXNlIG5ldmVyIHNlZSB0aGVtICg5LjI0LjApLlxuICAgIHRoaXMuX2ZpcmVTdGFnZVRhZ2dlZChjdXJTcGVjKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBMb29wIOKUgOKUgFxuXG4gIGxvb3BUbyhzdGFnZUlkOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyU3BlYy5sb29wVGFyZ2V0KSBmYWlsKGBsb29wVG8gYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICBpZiAoY3VyLm5leHQpIGZhaWwoYGNhbm5vdCBzZXQgbG9vcFRvIHdoZW4gbmV4dCBpcyBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgaWYgKCF0aGlzLl9rbm93blN0YWdlSWRzLmhhcyhzdGFnZUlkKSkge1xuICAgICAgZmFpbChgbG9vcFRvKCcke3N0YWdlSWR9JykgdGFyZ2V0IG5vdCBmb3VuZCDigJQgZGlkIHlvdSBwYXNzIGEgc3RhZ2UgbmFtZSBpbnN0ZWFkIG9mIGlkP2ApO1xuICAgIH1cblxuICAgIGN1ci5uZXh0ID0geyBuYW1lOiBzdGFnZUlkLCBpZDogc3RhZ2VJZCwgaXNMb29wUmVmOiB0cnVlIH07XG4gICAgY3VyU3BlYy5sb29wVGFyZ2V0ID0gc3RhZ2VJZDtcbiAgICBjdXJTcGVjLm5leHQgPSB7IG5hbWU6IHN0YWdlSWQsIGlkOiBzdGFnZUlkLCB0eXBlOiAnbG9vcCcsIGlzTG9vcFJlZmVyZW5jZTogdHJ1ZSB9O1xuXG4gICAgY29uc3QgdGFyZ2V0U3RlcCA9IHRoaXMuX3N0YWdlU3RlcE1hcC5nZXQoc3RhZ2VJZCk7XG4gICAgaWYgKHRhcmdldFN0ZXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGDihpIgbG9vcHMgYmFjayB0byBzdGVwICR7dGFyZ2V0U3RlcH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGDihpIgbG9vcHMgYmFjayB0byAke3N0YWdlSWR9YCk7XG4gICAgfVxuXG4gICAgLy8gTDcuMyDigJQgRmlyZSB0aGUgbG9vcCBiYWNrLWVkZ2UgZXZlbnQuIERpc3RpbmN0IGZyb20gYG9uRWRnZUFkZGVkYFxuICAgIC8vIGJlY2F1c2UgcnVudGltZSBgb25Mb29wYCBjYXJyaWVzIGBpdGVyYXRpb246IG51bWJlcmAgd2hpY2ggaGFzIG5vXG4gICAgLy8gYnVpbGQgbWVhbmluZyDigJQgc2VwYXJhdGUgZXZlbnQga2VlcHMgcGF5bG9hZHMgaG9uZXN0LlxuICAgIHRoaXMuX2ZpcmVMb29wRWRnZUFkZGVkKGN1ci5pZCwgc3RhZ2VJZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgU3RyZWFtaW5nIOKUgOKUgFxuXG4gIG9uU3RyZWFtKGhhbmRsZXI6IFN0cmVhbVRva2VuSGFuZGxlcik6IHRoaXMge1xuICAgIHRoaXMuX3N0cmVhbUhhbmRsZXJzLm9uVG9rZW4gPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb25TdHJlYW1TdGFydChoYW5kbGVyOiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RyZWFtSGFuZGxlcnMub25TdGFydCA9IGhhbmRsZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvblN0cmVhbUVuZChoYW5kbGVyOiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RyZWFtSGFuZGxlcnMub25FbmQgPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIE91dHB1dCDilIDilIBcblxuICBidWlsZCgpOiBSdW5uYWJsZUZsb3dDaGFydDxUT3V0LCBUU2NvcGU+IHtcbiAgICAvLyBMNy4zIOKAlCBzZWFsIHRoZSBjaGFydCBzbyBwb3N0LWJ1aWxkIGF0dGFjaGVzIHRocm93LiBQcmV2ZW50c1xuICAgIC8vIHJlY29yZGVycyBhdHRhY2hlZCBtaWQtZXhlY3V0aW9uIGZyb20gZ2V0dGluZyBwYXJ0aWFsIGRhdGEuXG4gICAgdGhpcy5fc2VhbGVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290ID8/IGZhaWwoJ2VtcHR5IHRyZWU7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuICAgIGNvbnN0IHJvb3RTcGVjID0gdGhpcy5fcm9vdFNwZWMgPz8gZmFpbCgnZW1wdHkgc3BlYzsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG5cbiAgICBjb25zdCBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiB0aGlzLl9zdWJmbG93RGVmcykge1xuICAgICAgc3ViZmxvd3Nba2V5XSA9IGRlZjtcbiAgICB9XG5cbiAgICBjb25zdCByb290TmFtZSA9IHRoaXMuX3Jvb3Q/Lm5hbWUgPz8gJ0Zsb3dDaGFydCc7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPVxuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5sZW5ndGggPiAwID8gYEZsb3dDaGFydDogJHtyb290TmFtZX1cXG5TdGVwczpcXG4ke3RoaXMuX2Rlc2NyaXB0aW9uUGFydHMuam9pbignXFxuJyl9YCA6ICcnO1xuXG4gICAgY29uc3QgY2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgcm9vdCxcbiAgICAgIHN0YWdlTWFwOiB0aGlzLl9zdGFnZU1hcCxcbiAgICAgIGJ1aWxkVGltZVN0cnVjdHVyZTogcm9vdFNwZWMsXG4gICAgICAuLi4oT2JqZWN0LmtleXMoc3ViZmxvd3MpLmxlbmd0aCA+IDAgPyB7IHN1YmZsb3dzIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5fZW5hYmxlTmFycmF0aXZlID8geyBlbmFibGVOYXJyYXRpdmU6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLl9sb2dnZXIgPyB7IGxvZ2dlcjogdGhpcy5fbG9nZ2VyIH0gOiB7fSksXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHN0YWdlRGVzY3JpcHRpb25zOiBuZXcgTWFwKHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zKSxcbiAgICAgIC4uLih0aGlzLl9pbnB1dFNjaGVtYSA/IHsgaW5wdXRTY2hlbWE6IHRoaXMuX2lucHV0U2NoZW1hIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5fb3V0cHV0U2NoZW1hID8geyBvdXRwdXRTY2hlbWE6IHRoaXMuX291dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuX291dHB1dE1hcHBlciA/IHsgb3V0cHV0TWFwcGVyOiB0aGlzLl9vdXRwdXRNYXBwZXIgfSA6IHt9KSxcbiAgICAgIC8vIEF1dG8tZW1iZWQgVHlwZWRTY29wZSBmYWN0b3J5IGlmIG5vbmUgd2FzIGV4cGxpY2l0bHkgc2V0LlxuICAgICAgLy8gVGhpcyBtZWFucyBBTlkgd2F5IG9mIGNyZWF0aW5nIGEgRmxvd0NoYXJ0QnVpbGRlciAoZmxvd0NoYXJ0KCksIG5ldyBGbG93Q2hhcnRCdWlsZGVyKCksXG4gICAgICAvLyBvciBhbnkgc3ViY2xhc3MpIGF1dG9tYXRpY2FsbHkgZ2V0cyBUeXBlZFNjb3BlIOKAlCBubyBtYW51YWwgc2V0U2NvcGVGYWN0b3J5IG5lZWRlZC5cbiAgICAgIHNjb3BlRmFjdG9yeTogdGhpcy5fc2NvcGVGYWN0b3J5ID8/IChjcmVhdGVUeXBlZFNjb3BlRmFjdG9yeSgpIGFzIHVua25vd24gYXMgU2NvcGVGYWN0b3J5PFRTY29wZT4pLFxuICAgIH07XG5cbiAgICByZXR1cm4gbWFrZVJ1bm5hYmxlKGNoYXJ0KTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0aGUgc2NvcGUgZmFjdG9yeS4gUmFyZWx5IG5lZWRlZCDigJQgYXV0by1lbWJlZHMgVHlwZWRTY29wZSBieSBkZWZhdWx0LiAqL1xuICBzZXRTY29wZUZhY3RvcnkoZmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT4pOiB0aGlzIHtcbiAgICB0aGlzLl9zY29wZUZhY3RvcnkgPSBmYWN0b3J5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG9TcGVjPFRSZXN1bHQgPSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU+KCk6IFRSZXN1bHQge1xuICAgIGNvbnN0IHJvb3RTcGVjID0gdGhpcy5fcm9vdFNwZWMgPz8gZmFpbCgnZW1wdHkgdHJlZTsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gICAgcmV0dXJuIHJvb3RTcGVjIGFzIFRSZXN1bHQ7XG4gIH1cblxuICB0b01lcm1haWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbJ2Zsb3djaGFydCBURCddO1xuICAgIGNvbnN0IGlkT2YgPSAoazogc3RyaW5nKSA9PiAoayB8fCAnJykucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCAnXycpIHx8ICdfJztcbiAgICBjb25zdCByb290ID0gdGhpcy5fcm9vdCA/PyBmYWlsKCdlbXB0eSB0cmVlOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcblxuICAgIGNvbnN0IHdhbGsgPSAobjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pID0+IHtcbiAgICAgIGNvbnN0IG5pZCA9IGlkT2Yobi5pZCk7XG4gICAgICBsaW5lcy5wdXNoKGAke25pZH1bXCIke24ubmFtZX1cIl1gKTtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBuLmNoaWxkcmVuIHx8IFtdKSB7XG4gICAgICAgIGNvbnN0IGNpZCA9IGlkT2YoYy5pZCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7bmlkfSAtLT4gJHtjaWR9YCk7XG4gICAgICAgIHdhbGsoYyk7XG4gICAgICB9XG4gICAgICBpZiAobi5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IGlkT2Yobi5uZXh0LmlkKTtcbiAgICAgICAgbGluZXMucHVzaChgJHtuaWR9IC0tPiAke21pZH1gKTtcbiAgICAgICAgd2FsayhuLm5leHQpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2Fsayhyb290KTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWxzIChleHBvc2VkIGZvciBoZWxwZXIgY2xhc3Nlcykg4pSA4pSAXG5cbiAgcHJpdmF0ZSBfbmVlZEN1cnNvcigpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvciA/PyBmYWlsKCdjdXJzb3IgdW5kZWZpbmVkOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcbiAgfVxuXG4gIHByaXZhdGUgX25lZWRDdXJzb3JTcGVjKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvclNwZWMgPz8gZmFpbCgnY3Vyc29yIHVuZGVmaW5lZDsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5vZGUgYSBmYW4tb3V0IChgYWRkTGlzdE9mRnVuY3Rpb25gLCBgYWRkU3ViRmxvd0NoYXJ0YCxcbiAgICogYGFkZExhenlTdWJGbG93Q2hhcnRgKSBoYW5ncyBpdHMgY2hpbGRyZW4gb24g4oCUIHRoZSBjdXJzb3IsIHVubGVzcyB0aGVcbiAgICogY3Vyc29yJ3MgYGNoaWxkcmVuYCBhbHJlYWR5IE1FQU4gc29tZXRoaW5nIGVsc2U6XG4gICAqXG4gICAqIC0gYSBzdWJmbG93IE1PVU5UIOKAlCB0aGUgZW5naW5lIHJlYWRzIGEgbW91bnQgdGhhdCBjYXJyaWVzIGNoaWxkcmVuIGFzIHRoZVxuICAgKiAgIG1vdW50ZWQgY2hhcnQncyBPV04gY29udGVudCAoYE5vZGVSZXNvbHZlciDCtyByZXNvbHZlU3ViZmxvd1JlZmVyZW5jZWApLFxuICAgKiAgIHNvIGEgZm9yayBodW5nIHRoZXJlIHJhbiBJTlNJREUgdGhlIHN1YmZsb3c6IHRoZSBzdWJmbG93J3MgcmVhbCBjaGFydFxuICAgKiAgIG5ldmVyIHJhbiwgZXZlcnl0aGluZyBhZnRlciB0aGUgZm9yayByYW4gdHdpY2UsIGFuZCBhIHBhdXNlIGFmdGVyIGl0IHdhc1xuICAgKiAgIGNoZWNrcG9pbnRlZCB1bmRlciB0aGUgd3Jvbmcgc3ViZmxvdyBwYXRoIChhbmQgcmVmdXNlZCBvbiByZXN1bWUpO1xuICAgKiAtIGEgREVDSURFUiBvciBhIFNFTEVDVE9SICh0aGUgY3Vyc29yIGFmdGVyIGAuZW5kKClgKSDigJQgaXRzIGNoaWxkcmVuIGFyZVxuICAgKiAgIGl0cyBicmFuY2hlcywgc28gYSBmb3JrIGNoaWxkIGJlY2FtZSBhIGJyYW5jaCBub2JvZHkgcGlja3M7XG4gICAqIC0gYSBgcGFyYWxsZWxGb3JFYWNoYCDigJQgaXRzIGJyYW5jaGVzIGNvbWUgZnJvbSBgaXRlbXNgIGF0IHJ1biB0aW1lIGFuZFxuICAgKiAgIGJ1aWx0IGNoaWxkcmVuIGFyZSBuZXZlciBkaXNwYXRjaGVkLCBzbyB0aGUgZm9yayBuZXZlciByYW4uXG4gICAqXG4gICAqIFRocm91Z2ggOS4zNy4wIHRoZSBidWlsZGVyIGh1bmcgdGhlIGZvcmsgdGhlcmUgYW55d2F5LiBTbyBhZnRlciBzdWNoIGFcbiAgICogbm9kZSB0aGUgZm9yayBjb250aW51ZXMgQUZURVIgaXQ6IGEgZnVuY3Rpb24tbGVzcyBmb3JrIG5vZGVcbiAgICogYDxub2RlSWQ+LWZvcmtgIGJlY29tZXMgdGhlIG5vZGUncyBgbmV4dGAgYW5kIHRoZSBuZXcgY3Vyc29yIOKAlCB0aGUgc2hhcGVcbiAgICogYGFkZEZ1bmN0aW9uKC4uLikuYWRkTGlzdE9mRnVuY3Rpb24oLi4uKWAgYWxyZWFkeSBidWlsZHMsIHdoaWNoIGV2ZXJ5XG4gICAqIHJlYWRlciAoZW5naW5lLCByZXN1bWUsIHN0cnVjdHVyZSwgc3BlYykgaGFuZGxlcy4gQSBzZWNvbmQgZmFuLW91dCBjYWxsXG4gICAqIHJldXNlcyB0aGF0IG5vZGUsIGFzIGl0IHdvdWxkIGFueSBjdXJzb3IuIFRoZSBpZCBpcyByZXNlcnZlZCBib3RoIHdheXM6XG4gICAqIHJlZnVzZWQgaGVyZSB3aGVuIGEgc3RhZ2UgYWxyZWFkeSBoYXMgaXQsIGFuZCBieSBzdGFnZSBhZG1pc3Npb24gL1xuICAgKiBgX3JlZ2lzdGVyU3ViZmxvd0RlZmAgd2hlbiBhIGxhdGVyIHN0YWdlIG9yIG1vdW50IGFza3MgZm9yIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBfbmVlZEZvcmtQYXJlbnQoKTogeyBjdXI6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+OyBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfSB7XG4gICAgY29uc3Qgb3duZXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3Qgb3duZXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBjaGlsZHJlbk1lYW5Tb21ldGhpbmdFbHNlID1cbiAgICAgIG93bmVyLmlzU3ViZmxvd1Jvb3QgfHwgb3duZXIuaXNEeW5hbWljUGFyYWxsZWwgfHwgb3duZXIuZGVjaWRlckZuIHx8IG93bmVyLnNlbGVjdG9yRm47XG4gICAgaWYgKCFjaGlsZHJlbk1lYW5Tb21ldGhpbmdFbHNlKSByZXR1cm4geyBjdXI6IG93bmVyLCBjdXJTcGVjOiBvd25lclNwZWMgfTtcblxuICAgIGNvbnN0IGlkID0gYCR7b3duZXIuaWR9LWZvcmtgO1xuICAgIGlmICh0aGlzLl9pZFRha2VuKGlkKSkge1xuICAgICAgZmFpbChcbiAgICAgICAgYGNhbm5vdCBmYW4gb3V0IGFmdGVyICcke293bmVyLm5hbWV9JzogdGhlIGZvcmsgbm9kZSBpdCBuZWVkcywgJyR7aWR9JywgYCArXG4gICAgICAgICAgYGlzIGFscmVhZHkgYSBzdGFnZSBpZC4gQWRkIGEgc3RhZ2UgYWZ0ZXIgJyR7b3duZXIubmFtZX0nIGFuZCBmYW4gb3V0IGZyb20gaXQuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lOiBpZCwgaWQgfTtcbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWU6IGlkLCBpZCwgdHlwZTogJ2ZvcmsnIH07XG4gICAgb3duZXIubmV4dCA9IG5vZGU7XG4gICAgb3duZXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuICAgIHRoaXMuX2ZvcmtOb2RlSWRzLmFkZChpZCk7XG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChvd25lclNwZWMsIGlkKTtcbiAgICByZXR1cm4geyBjdXI6IG5vZGUsIGN1clNwZWM6IHNwZWMgfTtcbiAgfVxuXG4gIC8qKiBJZHMgYF9uZWVkRm9ya1BhcmVudGAgZ2VuZXJhdGVkIOKAlCBubyBsYXRlciBzdGFnZSBvciBtb3VudCBtYXkgdGFrZSBvbmUuICovXG4gIHByaXZhdGUgX2ZvcmtOb2RlSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqIFNoYXJlZCBieSBzdGFnZSBhZG1pc3Npb24gYW5kIHN1YmZsb3cgcmVnaXN0cmF0aW9uOiByZXNlcnZlZCBzdHJ1Y3R1cmFsIGlkcyBjYW5ub3QgYmUgcmV1c2VkLiAqL1xuICBwcml2YXRlIF9yZWZ1c2VGb3JrTm9kZUlkKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2xhaW1lZElkcy5oYXMoaWQpKSB7XG4gICAgICBmYWlsKGBpZCAnJHtpZH0nIGlzIGFscmVhZHkgdXNlZCBieSBhIGxhenkgc3ViZmxvdyBtb3VudCBvciBhIHBhcmFsbGVsRm9yRWFjaCBpbiB0aGlzIGNoYXJ0LiBSZW5hbWUgdGhlIHN0YWdlLmApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2ZvcmtOb2RlSWRzLmhhcyhpZCkpIHJldHVybjtcbiAgICBmYWlsKFxuICAgICAgYGlkICcke2lkfScgaXMgdGFrZW46IGl0IGlzIHRoZSBmb3JrIG5vZGUgdGhlIGJ1aWxkZXIgcGxhY2VkIGFmdGVyICcke2lkLnNsaWNlKDAsIC0nLWZvcmsnLmxlbmd0aCl9JyBgICtcbiAgICAgICAgJyhhIGZhbi1vdXQgcmlnaHQgYWZ0ZXIgYSBzdWJmbG93IG1vdW50LCBkZWNpZGVyLCBzZWxlY3RvciBvciBwYXJhbGxlbEZvckVhY2ggY29udGludWVzIG9uIGl0KS4gJyArXG4gICAgICAgICdSZW5hbWUgdGhlIHN0YWdlLicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBJZHMgdGhlIGxhenktbW91bnQgYW5kIHBhcmFsbGVsRm9yRWFjaCBkb29ycyBjbGFpbWVkICh0aGV5IHJlZ2lzdGVyIGluIG5vIG1hcCkuICovXG4gIHByaXZhdGUgX2NsYWltZWRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKiogU3RydWN0dXJhbCBkZWNsYXJhdGlvbnMgd2l0aG91dCBhbiBlbWJlZGRlZCBmdW5jdGlvbjsgbm90IGZ1bmN0aW9uIGVudHJpZXMgb3IgbG9vcCB0YXJnZXRzLiAqL1xuICBwcml2YXRlIF9mdW5jdGlvbmxlc3NTdGFnZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKiBUcnVlIHdoZW4gYW4gZWFybGllciBzdGFnZSwgYnJhbmNoLCBmb3JrIGNoaWxkLCBtb3VudCBvciBnZW5lcmF0ZWQgZm9yayBub2RlIGhvbGRzIGBpZGAuICovXG4gIHByaXZhdGUgX2lkVGFrZW4oaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9rbm93blN0YWdlSWRzLmhhcyhpZCkgfHxcbiAgICAgIHRoaXMuX3N0YWdlTWFwLmhhcyhpZCkgfHxcbiAgICAgIHRoaXMuX2Z1bmN0aW9ubGVzc1N0YWdlSWRzLmhhcyhpZCkgfHxcbiAgICAgIHRoaXMuX3N1YmZsb3dEZWZzLmhhcyhpZCkgfHxcbiAgICAgIHRoaXMuX2NsYWltZWRJZHMuaGFzKGlkKSB8fFxuICAgICAgdGhpcy5fZm9ya05vZGVJZHMuaGFzKGlkKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsIFRoZSBsYXp5LW1vdW50IGRvb3JzIGFuZCBgYWRkUGFyYWxsZWxGb3JFYWNoYCByZWdpc3RlciB0aGVpciBpZFxuICAgKiBpbiBubyBtYXAsIHNvIHRocm91Z2ggOS4zNy4wIHRoZXkgYWNjZXB0ZWQgYW4gaWQgYW5vdGhlciBzdGFnZSBvciBtb3VudFxuICAgKiBhbHJlYWR5IGhhZCAoYW5kIGEgbGF0ZXIgc3RhZ2UgY291bGQgdGFrZSB0aGVpcnMpLiBUaGV5IGNsYWltIGl0IGhlcmU6XG4gICAqIHJlZnVzZWQgd2hlbiB0YWtlbiwgcmVjb3JkZWQgd2hlbiBmcmVzaC4gTG9vcC1yZWYgc3R1YnMgcmVmZXJlbmNlIGFuXG4gICAqIGV4aXN0aW5nIHN0YWdlIHJhdGhlciB0aGFuIGNsYWltaW5nIGEgbmV3IGlkLiBSZXVzYWJsZSBmdW5jdGlvbiBzdGFnZXNcbiAgICogcmV0YWluIHRoZWlyIHNlcGFyYXRlIGBfYWRkVG9NYXBgIHJ1bGUuXG4gICAqL1xuICBfY2xhaW1GcmVzaElkKGlkOiBzdHJpbmcsIGRvb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pZFRha2VuKGlkKSkge1xuICAgICAgZmFpbChgJHtkb29yfTogaWQgJyR7aWR9JyBpcyBhbHJlYWR5IHVzZWQgYnkgYW5vdGhlciBzdGFnZSBvciBtb3VudCBpbiB0aGlzIGNoYXJ0LiBHaXZlIGl0IGl0cyBvd24gaWQuYCk7XG4gICAgfVxuICAgIHRoaXMuX2NsYWltZWRJZHMuYWRkKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZHZhbmNlIHRoZSBzcGVjIGN1cnNvci4gUmV0YWluZWQgYXMgYSBtZXRob2Qgc28gY2FsbCBzaXRlcyBzdGF5XG4gICAqIG9uZS1saW5lcnMgYW5kIGZ1dHVyZSBjdXJzb3ItcmVsYXRlZCBzaWRlIGVmZmVjdHMgaGF2ZSBhIGhvb2suXG4gICAqL1xuICAvKipcbiAgICogV2hhdCB3YXMgYXR0YWNoZWQgdG8gdGhlIENVUlNPUiB3aXRob3V0IGFkdmFuY2luZyBpdCDigJQgYSBzdWJmbG93IG1vdW50LCBhXG4gICAqIHBhcmFsbGVsIGZvcmsncyBjaGlsZHJlbi4gQ2xlYXJlZCBieSB7QGxpbmsgX2FkdmFuY2VDdXJzb3JTcGVjfSwgdGhlIHNpbmdsZVxuICAgKiBjaG9rZSBwb2ludCBldmVyeSBjdXJzb3ItYWR2YW5jaW5nIG1ldGhvZCBhbHJlYWR5IGdvZXMgdGhyb3VnaCwgc28gdGhpc1xuICAgKiBtYXJrZXIgY2Fubm90IGRyaWZ0IGFzIG5ldyBidWlsZGVyIG1ldGhvZHMgYXJlIGFkZGVkLlxuICAgKlxuICAgKiBFeGlzdHMgZm9yIGAucmV0cnkoKWAuIFRob3NlIG1ldGhvZHMgaGFuZyBjaGlsZHJlbiBvZmYgdGhlIGN1cnJlbnQgc3RhZ2VcbiAgICogYW5kIGxlYXZlIHRoZSBjdXJzb3IgcG9pbnRpbmcgYXQgdGhhdCBzdGFnZSwgc28gYSBjaGFpbmVkIGAucmV0cnkoKWAgd291bGRcbiAgICogc2lsZW50bHkgYXR0YWNoIHRoZSBwb2xpY3kgdG8gdGhlIHN0YWdlIEJFRk9SRSB0aGUgdGhpbmcgeW91IGp1c3Qgd3JvdGUg4oCUXG4gICAqIGV4YWN0bHkgdGhlIHNpbGVudCBtaXMtYXR0cmlidXRpb24gdGhpcyBjb2RlYmFzZSByZWZ1c2VzIGVsc2V3aGVyZSAoc2VlXG4gICAqIHRoZSBicmFuY2gtc2VnbWVudCBtYXJrZXIgcnVsZXMpLiBOYW1pbmcgd2hhdCB3YXMgbGFzdCBhZGRlZCBsZXRzIHRoZVxuICAgKiByZWZ1c2FsIHNheSBzb21ldGhpbmcgdXNlZnVsLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3Vyc29yVGFpbD86IHN0cmluZztcblxuICBwcml2YXRlIF9hZHZhbmNlQ3Vyc29yU3BlYyhuZXdTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJzb3JUYWlsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2N1cnNvclNwZWMgPSBuZXdTcGVjO1xuICB9XG5cbiAgX3N0YWdlTWFwSGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlTWFwLmhhcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBSZWdpc3RlciBhIG1vdW50ZWQgc3ViZmxvdydzIGRlZmluaXRpb24g4oCUIGZpcnN0IG1vdW50IHdpbnMsXG4gICAqIGF0IGV2ZXJ5IGVhZ2VyIG1vdW50IHNpdGUgKGxpbmVhciwgZm9yayBjaGlsZCwgZGVjaWRlciBhbmQgc2VsZWN0b3JcbiAgICogYnJhbmNoKS4gQSBTRUNPTkQgbW91bnQgdW5kZXIgdGhlIHNhbWUgaWQgaXMgYWxsb3dlZCAoZXhpc3RpbmcgY2hhcnRzIGRvXG4gICAqIGl0KSBhbmQgc2hhcmVzIHRoZSBmaXJzdCBvbmUncyBkZWZpbml0aW9uIOKAlCBidXQgYSBwYXVzZSBpbnNpZGUgZWl0aGVyXG4gICAqIGNhbm5vdCBiZSByZXN1bWVkOiBhIGNoZWNrcG9pbnQncyBgc3ViZmxvd1BhdGhgIG5hbWVzIHRoZSBzdWJmbG93IGlkLCBub3RcbiAgICogdGhlIG1vdW50LCBzbyBgcmVzdW1lKClgIHJlZnVzZXMgdGhlIGFtYmlndW91cyBwYXRoLiBEZXYgbW9kZSBzYXlzIHNvXG4gICAqIGhlcmUsIGF0IGJ1aWxkIHRpbWUsIHdoZXJlIHRoZSBpZCBjYW4gc3RpbGwgYmUgY2hhbmdlZC5cbiAgICovXG4gIF9yZWdpc3RlclN1YmZsb3dEZWYoaWQ6IHN0cmluZywgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiB2b2lkIHtcbiAgICB0aGlzLl9yZWZ1c2VGb3JrTm9kZUlkKGlkKTtcbiAgICBpZiAoIXRoaXMuX3N1YmZsb3dEZWZzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuX3N1YmZsb3dEZWZzLnNldChpZCwgeyByb290IH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50XSBzdWJmbG93IGlkICcke2lkfScgaXMgbW91bnRlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGlzIGNoYXJ0LiBUaGUgbW91bnRzIHNoYXJlIG9uZSBgICtcbiAgICAgICAgICAnZGVmaW5pdGlvbiwgYW5kIGEgcGF1c2UgaW5zaWRlIGVpdGhlciBjYW5ub3QgYmUgcmVzdW1lZCDigJQgdGhlIGNoZWNrcG9pbnQgY2Fubm90IHNheSB3aGljaCBtb3VudCAnICtcbiAgICAgICAgICAncGF1c2VkLiBHaXZlIGVhY2ggbW91bnQgaXRzIG93biBpZC4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsIE9uZSBhZG1pc3Npb24gcGF0aCBmb3Igb3B0aW9uYWwtZnVuY3Rpb24gY2hpbGRyZW4gYW5kIGJyYW5jaGVzLlxuICAgKiBBIG1pc3NpbmcgZnVuY3Rpb24gZG9lcyBub3QgZXJhc2UgdGhlIGdyYXBoIGlkZW50aXR5OiBjaGVjayByZXNlcnZhdGlvbnNcbiAgICogYW5kIHJlY29yZCBpdCBmb3IgZnV0dXJlIGZyZXNoLWlkIGNsYWltcywgd2l0aG91dCBhZGRpbmcgYSBmdW5jdGlvbiBvciBhXG4gICAqIGxvb3AgdGFyZ2V0LiBFeGlzdGluZyBmdW5jdGlvbiByZWZlcmVuY2VzIGJ5IGlkL25hbWUgcmVtYWluIGxlZ2FsLlxuICAgKi9cbiAgX3JlZ2lzdGVyU3RhZ2UoaWQ6IHN0cmluZywgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmIChmbikge1xuICAgICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcmVmdXNlRm9ya05vZGVJZChpZCk7XG4gICAgdGhpcy5fZnVuY3Rpb25sZXNzU3RhZ2VJZHMuYWRkKGlkKTtcbiAgfVxuXG4gIF9hZGRUb01hcChpZDogc3RyaW5nLCBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KSB7XG4gICAgdGhpcy5fcmVmdXNlRm9ya05vZGVJZChpZCk7XG4gICAgaWYgKHRoaXMuX3N0YWdlTWFwLmhhcyhpZCkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fc3RhZ2VNYXAuZ2V0KGlkKTtcbiAgICAgIGlmIChleGlzdGluZyAhPT0gZm4pIGZhaWwoYHN0YWdlTWFwIGNvbGxpc2lvbiBmb3IgaWQgJyR7aWR9J2ApO1xuICAgIH1cbiAgICB0aGlzLl9zdGFnZU1hcC5zZXQoaWQsIGZuKTtcbiAgfVxuXG4gIF9tZXJnZVN0YWdlTWFwKG90aGVyOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+LCBwcmVmaXg/OiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBvdGhlcikge1xuICAgICAgY29uc3Qga2V5ID0gcHJlZml4ID8gam9pblBhdGgocHJlZml4LCBrKSA6IGs7XG4gICAgICBpZiAodGhpcy5fc3RhZ2VNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9zdGFnZU1hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nICE9PSB2KSBmYWlsKGBzdGFnZU1hcCBjb2xsaXNpb24gd2hpbGUgbW91bnRpbmcgZmxvd2NoYXJ0IGF0ICcke2tleX0nYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zdGFnZU1hcC5zZXQoa2V5LCB2KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlZml4IGEgbm9kZSB0cmVlIHdpdGggYSBzdWJmbG93IHBhdGggc2VnbWVudCBhdCBNT1VOVCB0aW1lIOKAlCB0aGUgb25lXG4gICAqIHByZWZpeGVyLCBgZW5naW5lL2dyYXBoL3ByZWZpeE5vZGVUcmVlLnRzYCAodGhlIHRyYXZlcnNlciBjYWxscyB0aGUgc2FtZVxuICAgKiBmdW5jdGlvbiBhdCBSVU4gdGltZSkuIEtlcHQgYXMgdGhlIGJ1aWxkZXIncyBkb29yIGZvciBpdHMgbW91bnQgc2l0ZXMuXG4gICAqL1xuICBfcHJlZml4Tm9kZVRyZWUobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHByZWZpeDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiBwcmVmaXhOb2RlVHJlZShub2RlLCBwcmVmaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRIRSBtb3VudCBvZiBhIHN1YmZsb3cgY2hhcnQgdW5kZXIgYGlkYCAoRjEwKSDigJQgZXZlcnkgZWFnZXIgbW91bnQgc2l0ZVxuICAgKiAoYGFkZFN1YkZsb3dDaGFydGAsIGBhZGRTdWJGbG93Q2hhcnROZXh0YCwgYSBkZWNpZGVyL3NlbGVjdG9yXG4gICAqIGBhZGRTdWJGbG93Q2hhcnRCcmFuY2hgKSBnb2VzIHRocm91Z2ggaXQsIGFuZCBpdCBpcyB0aGUgb25lIGNhbGxlciBvZiB0aGVcbiAgICogcHJlZml4ZXIuIEluIG9yZGVyOiByZWdpc3RlciB0aGUgY2hhcnQncyBwcmVmaXhlZCByb290IHVuZGVyIGBpZGA7XG4gICAqIGBwbGFjZWAgdGhlIG1vdW50J3Mgb3duIG5vZGUgKyBzcGVjIGFuZCBmaXJlIGl0cyBzdHJ1Y3R1cmUgZXZlbnRzOyBtZXJnZVxuICAgKiB0aGUgY2hhcnQncyBzdGFnZSBtYXAgdW5kZXIgYGlkYDsgcmVnaXN0ZXIgaXRzIG5lc3RlZCBzdWJmbG93cyB1bmRlclxuICAgKiBgaWQvPGtleT5gIChhIGtleSBhbHJlYWR5IHJlZ2lzdGVyZWQgaXMga2VwdCkuXG4gICAqL1xuICBfbW91bnRTdWJmbG93KGlkOiBzdHJpbmcsIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sIHBsYWNlOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgcHJlZml4ZWQgPSAocm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pID0+IHRoaXMuX3ByZWZpeE5vZGVUcmVlKHJvb3QsIGlkKTtcbiAgICB0aGlzLl9yZWdpc3RlclN1YmZsb3dEZWYoaWQsIHByZWZpeGVkKHN1YmZsb3cucm9vdCkpO1xuICAgIHBsYWNlKCk7XG4gICAgdGhpcy5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgaWYgKCFzdWJmbG93LnN1YmZsb3dzKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YmZsb3cuc3ViZmxvd3MpKSB7XG4gICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGpvaW5QYXRoKGlkLCBrZXkpO1xuICAgICAgaWYgKCF0aGlzLl9zdWJmbG93RGVmcy5oYXMocHJlZml4ZWRLZXkpKSB7XG4gICAgICAgIHRoaXMuX3N1YmZsb3dEZWZzLnNldChwcmVmaXhlZEtleSwgeyByb290OiBwcmVmaXhlZChkZWYucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPikgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRmFjdG9yeSBGdW5jdGlvblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogU3RhcnQgYSBmbG93Y2hhcnQgd2l0aCBpdHMgZmlyc3Qgc3RhZ2U7IHJldHVybnMgYSBmbHVlbnQgYnVpbGRlci5cbiAqXG4gKiBDaGFpbiBgLmFkZEZ1bmN0aW9uKClgIC8gYC5hZGREZWNpZGVyRnVuY3Rpb24oKWAgLyBgLmFkZFNlbGVjdG9yRnVuY3Rpb24oKWAgL1xuICogYC5hZGRTdWJGbG93Q2hhcnQoKWAgZXRjLiB0byBhZGQgbW9yZSBzdGFnZXMsIHRoZW4gZmluaXNoIHdpdGggYC5idWlsZCgpYC5cbiAqXG4gKiBAcGFyYW0gbmFtZSAgICBIdW1hbi1yZWFkYWJsZSBkaXNwbGF5IGxhYmVsIGZvciB0aGUgc3RhZ2UgKHNob3duIGluIHRoZSBuYXJyYXRpdmUvdHJhY2UpLlxuICogQHBhcmFtIGZuICAgICAgVGhlIHN0YWdlJ3Mgd29yayDigJQgYSBgKHNjb3BlKSA9PiDigKZgIGZ1bmN0aW9uLCBvciBhIGBQYXVzYWJsZUhhbmRsZXJgIGZvciBodW1hbi1pbi10aGUtbG9vcCBwYXVzZXMuXG4gKiBAcGFyYW0gaWQgICAgICBTdGFibGUgc3RhZ2UgaWQgdXNlZCBpbiB0cmFjZXMsIHRoZSBjb21taXQgbG9nLCBhbmQgYHJ1bnRpbWVTdGFnZUlkYC4gS2VlcCBpdCB1bmlxdWUgd2l0aGluIHRoZSBjaGFydC5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGB7IGRlc2NyaXB0aW9uPywgc3RydWN0dXJlUmVjb3JkZXJzPyB9YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgY2hhcnQgPSBmbG93Q2hhcnQ8U3RhdGU+KCdGZXRjaFVzZXInLCBhc3luYyAoc2NvcGUpID0+IHtcbiAqICAgc2NvcGUudXNlciA9IGF3YWl0IGdldFVzZXIoKTtcbiAqIH0sICdmZXRjaC11c2VyJylcbiAqICAgLmFkZEZ1bmN0aW9uKCdQcm9jZXNzJywgcHJvY2Vzc0ZuLCAncHJvY2VzcycpXG4gKiAgIC5idWlsZCgpO1xuICpcbiAqIGNvbnN0IHRyYWNlID0gbmFycmF0aXZlKCk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGFydC5yZWNvcmRlcih0cmFjZSkucnVuKCk7XG4gKiBjb25zb2xlLmxvZyh0cmFjZS5nZXRFbnRyaWVzKCkubWFwKChlKSA9PiBlLnRleHQpLmpvaW4oJ1xcbicpKTtcbiAqL1xuLy8gT3ZlcmxvYWQgMTogdHlwZWQgc3RhdGUgd2l0aCBvcHRpb25zIG9iamVjdC5cbmV4cG9ydCBmdW5jdGlvbiBmbG93Q2hhcnQ8VFN0YXRlIGV4dGVuZHMgb2JqZWN0PihcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogVHlwZWRTdGFnZUZ1bmN0aW9uPFRTdGF0ZT4gfCBQYXVzYWJsZUhhbmRsZXI8VHlwZWRTY29wZTxUU3RhdGU+PixcbiAgaWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IEZsb3dDaGFydE9wdGlvbnMsXG4pOiBGbG93Q2hhcnRCdWlsZGVyPGFueSwgVHlwZWRTY29wZTxUU3RhdGU+PjtcblxuLy8gT3ZlcmxvYWQgMjogZXhwbGljaXQgZ2VuZXJpY3Mgd2l0aCBvcHRpb25zIG9iamVjdC5cbmV4cG9ydCBmdW5jdGlvbiBmbG93Q2hhcnQ8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PihcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHwgUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBGbG93Q2hhcnRPcHRpb25zLFxuKTogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+O1xuXG4vLyBTaW5nbGUgaW1wbGVtZW50YXRpb24g4oCUIGFjY2VwdHMgdGhlIG9wdGlvbnMgYmFnIChvciB1bmRlZmluZWQpLlxuZXhwb3J0IGZ1bmN0aW9uIGZsb3dDaGFydDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+KFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPixcbiAgaWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IEZsb3dDaGFydE9wdGlvbnMsXG4pOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4ge1xuICBjb25zdCBidWlsZGVyID0gbmV3IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPigpO1xuICAvLyBBdHRhY2ggU3RydWN0dXJlUmVjb3JkZXJzIEJFRk9SRSBzdGFydCgpIHNvIHRoZSBzZWVkIGV2ZW50IGZpcmVzIHRocm91Z2hcbiAgLy8gdGhlIG5vcm1hbCBkaXNwYXRjaGVyIHBhdGggKG5vIHJlcGxheSBuZWVkZWQpLiBJdGVyYXRpb24gb3JkZXIgbWF0Y2hlc1xuICAvLyBhcnJheSBvcmRlciwgbWF0Y2hpbmcgdGhlIGZsdWVudCBgLmF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKClgIGNoYWluXG4gIC8vIHNlbWFudGljcy5cbiAgaWYgKG9wdGlvbnM/LnN0cnVjdHVyZVJlY29yZGVycykge1xuICAgIGZvciAoY29uc3QgcmVjIG9mIG9wdGlvbnMuc3RydWN0dXJlUmVjb3JkZXJzKSB7XG4gICAgICBidWlsZGVyLmF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKHJlYyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBidWlsZGVyLnN0YXJ0KG5hbWUsIGZuIGFzIGFueSwgaWQsIG9wdGlvbnM/LmRlc2NyaXB0aW9uLCB7XG4gICAgLi4uKG9wdGlvbnM/LnJldHJ5ICYmIHsgcmV0cnk6IG9wdGlvbnMucmV0cnkgfSksXG4gICAgLi4uKG9wdGlvbnM/LnRhZ3MgJiYgeyB0YWdzOiBvcHRpb25zLnRhZ3MgfSksXG4gIH0pO1xufVxuXG4vKipcbiAqIExpa2UgYGZsb3dDaGFydCgpYCwgYnV0IHRoZSBST09UIHN0YWdlIGlzIGEgU0VMRUNUT1Ig4oCUIGl0IHJ1bnMgZmlyc3QgYW5kXG4gKiBpdHMgYnJhbmNoZXMgYXR0YWNoIGRpcmVjdGx5IHRvIGl0IChubyBzZXBhcmF0ZSBzZWVkIHN0YWdlKS4gUmV0dXJucyBhXG4gKiBgU2VsZWN0b3JGbkxpc3RgOyBkZWNsYXJlIGJyYW5jaGVzIHRoZW4gY2FsbCBgLmVuZCgpYCB0byBnZXQgdGhlIGJ1aWxkZXJcbiAqIGJhY2sgZm9yIGFueSBzdWJzZXF1ZW50IHN0YWdlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBmbG93Q2hhcnRTZWxlY3RvcjxNeVN0YXRlPignQ29udGV4dCcsIGNvbnRleHRTZWxlY3RvckZuLCAnY29udGV4dCcpXG4gKiAgICAgLmFkZFN1YkZsb3dDaGFydEJyYW5jaCgnc2Ytc3lzdGVtLXByb21wdCcsIHN5c1Nsb3QsICdTeXN0ZW0gUHJvbXB0Jywgey4uLn0pXG4gKiAgICAgLmFkZFN1YkZsb3dDaGFydEJyYW5jaCgnc2YtbWVzc2FnZXMnLCBtc2dTbG90LCAnTWVzc2FnZXMnLCB7Li4ufSlcbiAqICAgICAuZW5kKClcbiAqICAgICAuYWRkRnVuY3Rpb24oJ21lc3NhZ2VBUEknLCBhc3NlbWJsZUZuLCAnbWVzc2FnZS1hcGknKVxuICogICAgIC5idWlsZCgpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmxvd0NoYXJ0U2VsZWN0b3I8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PihcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogU3RhZ2VGdW5jdGlvbjxhbnksIFRTY29wZT4sXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBGbG93Q2hhcnRPcHRpb25zLFxuKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gIGNvbnN0IGJ1aWxkZXIgPSBuZXcgRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+KCk7XG4gIGlmIChvcHRpb25zPy5zdHJ1Y3R1cmVSZWNvcmRlcnMpIHtcbiAgICBmb3IgKGNvbnN0IHJlYyBvZiBvcHRpb25zLnN0cnVjdHVyZVJlY29yZGVycykge1xuICAgICAgYnVpbGRlci5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcihyZWMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYnVpbGRlci5zdGFydFNlbGVjdG9yKG5hbWUsIGZuLCBpZCwgb3B0aW9ucz8uZGVzY3JpcHRpb24sIHtcbiAgICAuLi4ob3B0aW9ucz8uZmFpbEZhc3QgIT09IHVuZGVmaW5lZCAmJiB7IGZhaWxGYXN0OiBvcHRpb25zLmZhaWxGYXN0IH0pLFxuICAgIC4uLihvcHRpb25zPy5yZXRyeSAmJiB7IHJldHJ5OiBvcHRpb25zLnJldHJ5IH0pLFxuICAgIC4uLihvcHRpb25zPy50YWdzICYmIHsgdGFnczogb3B0aW9ucy50YWdzIH0pLFxuICB9KTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTcGVjIHRvIFN0YWdlTm9kZSBDb252ZXJ0ZXJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgZnVuY3Rpb24gc3BlY1RvU3RhZ2VOb2RlKHNwZWM6IEZsb3dDaGFydFNwZWMpOiBTdGFnZU5vZGU8YW55LCBhbnk+IHtcbiAgY29uc3QgaW5mbGF0ZSA9IChzOiBGbG93Q2hhcnRTcGVjKTogU3RhZ2VOb2RlPGFueSwgYW55PiA9PiAoe1xuICAgIG5hbWU6IHMubmFtZSxcbiAgICBpZDogcy5pZCxcbiAgICBjaGlsZHJlbjogcy5jaGlsZHJlbj8ubGVuZ3RoID8gcy5jaGlsZHJlbi5tYXAoaW5mbGF0ZSkgOiB1bmRlZmluZWQsXG4gICAgbmV4dDogcy5uZXh0ID8gaW5mbGF0ZShzLm5leHQpIDogdW5kZWZpbmVkLFxuICB9KTtcbiAgcmV0dXJuIGluZmxhdGUoc3BlYyk7XG59XG4iXX0=
2310
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYnVpbGRlci9GbG93Q2hhcnRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hGLE9BQU8sRUFBbUIsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUcxRSxPQUFPLEVBQTBCLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWxGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN6RixPQUFPLEVBQTJCLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFnQnZGLGdGQUFnRjtBQUNoRixtQkFBbUI7QUFDbkIsZ0ZBQWdGO0FBRWhGLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBVyxFQUFTLEVBQUU7SUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUMsQ0FBQztB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QyxTQUFTO0tBQzNDLENBQUMsQ0FBQztJQUNILE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZsb3dDaGFydEJ1aWxkZXIg4oCUIEZsdWVudCBBUEkgZm9yIGNvbnN0cnVjdGluZyBmbG93Y2hhcnQgZXhlY3V0aW9uIGdyYXBocy5cbiAqXG4gKiBCdWlsZHMgU3RhZ2VOb2RlIHRyZWVzIGFuZCBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgKEpTT04pIGluIHRhbmRlbS5cbiAqIFplcm8gZGVwZW5kZW5jaWVzIG9uIG9sZCBjb2RlIOKAlCBvbmx5IGltcG9ydHMgZnJvbSBsb2NhbCB0eXBlcy5cbiAqXG4gKiBUaGUgYnVpbGRlciBjcmVhdGVzIHR3byBwYXJhbGxlbCBzdHJ1Y3R1cmVzOlxuICogMS4gU3RhZ2VOb2RlIHRyZWUg4oCUIHJ1bnRpbWUgZ3JhcGggd2l0aCBlbWJlZGRlZCBmdW5jdGlvbnNcbiAqIDIuIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSDigJQgSlNPTi1zYWZlIHN0cnVjdHVyZSBmb3IgdmlzdWFsaXphdGlvblxuICpcbiAqIFRoZSBleGVjdXRlKCkgY29udmVuaWVuY2UgbWV0aG9kIGlzIGludGVudGlvbmFsbHkgb21pdHRlZCDigJRcbiAqIGl0IGJlbG9uZ3MgaW4gdGhlIHJ1bm5lciBsYXllciAoUGhhc2UgNSkuXG4gKi9cblxuaW1wb3J0IHsgam9pblBhdGggfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgeyB0b3VjaGVzUHJvYmxlbSB9IGZyb20gJy4uL2F0dGVtcHQvZWZmZWN0LmpzJztcbmltcG9ydCB7IHJldHJ5UG9saWN5UHJvYmxlbSB9IGZyb20gJy4uL2F0dGVtcHQvcG9saWN5LmpzJztcbmltcG9ydCB7IGRlY2xhcmVSZXRyeUxvb3BCdWRnZXQgfSBmcm9tICcuLi9hdHRlbXB0L3JldHJ5TG9vcENvbnRleHQuanMnO1xuaW1wb3J0IHsgYnVkZ2V0UmVmdXNhbCwgYnVkZ2V0V2FybmluZywgdGltZUJ1ZGdldCB9IGZyb20gJy4uL2J1ZGdldC9pbmRleC5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB7IHByZWZpeE5vZGVUcmVlIH0gZnJvbSAnLi4vZW5naW5lL2dyYXBoL3ByZWZpeE5vZGVUcmVlLmpzJztcbmltcG9ydCB0eXBlIHsgUGFyYWxsZWxGb3JFYWNoQ29uZmlnLCBSZXRyeVBvbGljeSwgU2NvcGVGYWN0b3J5LCBTdGFnZVRvdWNoZXMgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgQlJBTkNIX1NFR01FTlRfTUFSS0VSLCBoYXNCcmFuY2hTZWdtZW50TWFya2VyIH0gZnJvbSAnLi4vaWRzL2JyYW5jaFNlZ21lbnQuanMnO1xuaW1wb3J0IHsgdHlwZSBJZFBvc2l0aW9uLCByZWZ1c2VSZXNlcnZlZElkIH0gZnJvbSAnLi4vaWRzL3Jlc2VydmVkSWRzLmpzJztcbmltcG9ydCB0eXBlIHsgUGF1c2FibGVIYW5kbGVyIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBUeXBlZFNjb3BlIH0gZnJvbSAnLi4vcmVhY3RpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBSdW5uYWJsZUZsb3dDaGFydCwgbWFrZVJ1bm5hYmxlIH0gZnJvbSAnLi4vcnVubmVyL1J1bm5hYmxlQ2hhcnQuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXRyeUxvb3BPcHRpb25zIH0gZnJvbSAnLi9yZXRyeUxvb3AuanMnO1xuaW1wb3J0IHsgYXBwZW5kUmV0cnlMb29wIH0gZnJvbSAnLi9yZXRyeUxvb3AuanMnO1xuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVFZGdlS2luZCwgU3RydWN0dXJlUmVjb3JkZXIgfSBmcm9tICcuL3N0cnVjdHVyZS9TdHJ1Y3R1cmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBTdHJ1Y3R1cmVSZWNvcmRlckRpc3BhdGNoZXIgfSBmcm9tICcuL3N0cnVjdHVyZS9TdHJ1Y3R1cmVSZWNvcmRlckRpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgdHlwZSBUeXBlZFN0YWdlRnVuY3Rpb24sIGNyZWF0ZVR5cGVkU2NvcGVGYWN0b3J5IH0gZnJvbSAnLi90eXBlZEZsb3dDaGFydC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dDaGFydCxcbiAgRmxvd0NoYXJ0T3B0aW9ucyxcbiAgRmxvd0NoYXJ0U3BlYyxcbiAgSUxvZ2dlcixcbiAgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICBTaW1wbGlmaWVkUGFyYWxsZWxTcGVjLFxuICBTdGFnZUZ1bmN0aW9uLFxuICBTdGFnZU5vZGUsXG4gIFN0cmVhbUhhbmRsZXJzLFxuICBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyLFxuICBTdHJlYW1Ub2tlbkhhbmRsZXIsXG4gIFN1YmZsb3dNb3VudE9wdGlvbnMsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEludGVybmFsIGhlbHBlcnNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5jb25zdCBmYWlsID0gKG1zZzogc3RyaW5nKTogbmV2ZXIgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYFtGbG93Q2hhcnRCdWlsZGVyXSAke21zZ31gKTtcbn07XG5cbi8qKlxuICogQXR0YWNoIGEgZGVjbGFyYXRpdmUgcmV0cnkgcG9saWN5IHRvIGEgc3RhZ2Ugbm9kZSArIGl0cyBzcGVjIG5vZGUuXG4gKlxuICogVGhlIE9ORSBwbGFjZSBhIHBvbGljeSBsYW5kcyBvbiBhIG5vZGUsIHNoYXJlZCBieSB0aGUgYC5yZXRyeSgpYCBjdXJzb3JcbiAqIG1vZGlmaWVyIGFuZCBieSBldmVyeSBgb3B0aW9ucy5yZXRyeWAgZGVjbGFyYXRpb24gc2l0ZSwgc28gdmFsaWRhdGlvbiBhbmQgdGhlXG4gKiBzcGVjJ3MgYHJldHJ5QXR0ZW1wdHNgIG1pcnJvciBjYW4gbmV2ZXIgZHJpZnQgYmV0d2VlbiB0aGVtLlxuICpcbiAqIGBhdHRlbXB0c2AgaXMgdmFsaWRhdGVkIGF0IEJVSUxEIHRpbWUgcmF0aGVyIHRoYW4gZGVmZW5kZWQgYXQgcnVudGltZTogYVxuICogdHlwbydkIGBhdHRlbXB0czogMGAgc2hvdWxkIGZhaWwgd2hpbGUgeW91IGFyZSB3cml0aW5nIHRoZSBjaGFydCwgbm90XG4gKiBzaWxlbnRseSB0dXJuIGEgc3RhZ2UgaW50byBhIG5vLW9wIHJ1biB0aHJlZSBtb250aHMgbGF0ZXIuIGBhdHRlbXB0czogMWAgaXNcbiAqIGFjY2VwdGVkIG9uIHB1cnBvc2Ug4oCUIGl0IG1lYW5zIFwicG9saWN5IGRlY2xhcmVkLCBjdXJyZW50bHkgb2ZmXCIsIHNvIGEgcG9saWN5XG4gKiBjYW4gYmUgZGlhbGxlZCBkb3duIHdpdGhvdXQgZGVsZXRpbmcgdGhlIGRlY2xhcmF0aW9uLiBUaGUgcnVsZSBpc1xuICogYGF0dGVtcHQvcG9saWN5LnRzIMK3IHJldHJ5UG9saWN5UHJvYmxlbWAsIHdoaWNoIHRoZSB0cmF2ZXJzZXIgYWxzbyBhcHBsaWVzIHRvXG4gKiBhIFN0YWdlTm9kZSBhIHN0YWdlIHJldHVybnMgYXQgcnVuIHRpbWUuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5UmV0cnlQb2xpY3koXG4gIG5vZGU6IFN0YWdlTm9kZTxhbnksIGFueT4sXG4gIHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgcmV0cnk6IFJldHJ5UG9saWN5IHwgdW5kZWZpbmVkLFxuICB3aGVyZTogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGlmICghcmV0cnkpIHJldHVybjtcbiAgY29uc3QgcHJvYmxlbSA9IHJldHJ5UG9saWN5UHJvYmxlbShyZXRyeSk7XG4gIGlmIChwcm9ibGVtICE9PSB1bmRlZmluZWQpIGZhaWwoYCR7d2hlcmV9OiAke3Byb2JsZW19YCk7XG4gIC8vIEEgdG91Y2hpbmcgc3RhZ2UgZGVjbGFyZWQgZmlyc3Q6IHRoZSBwb2xpY3kgbXVzdCBub3QgbWFrZSBpdCByZXRyeSB3aXRob3V0IGEga2V5IChQMyDigJQgZWl0aGVyIG9yZGVyIHJlZnVzZXMpLlxuICBpZiAobm9kZS50b3VjaGVzKSB7XG4gICAgY29uc3QgdG91Y2hpbmcgPSB0b3VjaGVzUHJvYmxlbShub2RlLnRvdWNoZXMsIHJldHJ5KTtcbiAgICBpZiAodG91Y2hpbmcgIT09IHVuZGVmaW5lZCkgZmFpbChgJHt3aGVyZX06IHN0YWdlICcke25vZGUubmFtZX0nICR7dG91Y2hpbmd9YCk7XG4gIH1cbiAgbm9kZS5yZXRyeSA9IHJldHJ5O1xuICBzcGVjLnJldHJ5QXR0ZW1wdHMgPSByZXRyeS5hdHRlbXB0cztcbiAgLy8gVGhlIGNhcCByaWRlcyB0aGUgc3BlYyBiZXNpZGUgdGhlIGNvdW50IChQNSk6IGEgSlNPTi1zYWZlIGZhY3QsIHNvIGEgcmVhZGVyIG9mIHRoZSBzcGVjIHNlZXMgd2hhdCBib3VuZHMgdGhlIHN0YWdlLlxuICBpZiAocmV0cnkudGltZW91dE1zICE9PSB1bmRlZmluZWQpIHNwZWMudGltZW91dE1zID0gcmV0cnkudGltZW91dE1zO1xufVxuXG4vKipcbiAqIEF0dGFjaCBhIHNpZGUtZWZmZWN0IGRlY2xhcmF0aW9uIHRvIGEgc3RhZ2Ugbm9kZSArIGl0cyBzcGVjIG5vZGUgKDEwLjEsIGRlc2lnbiDCpzMuMykg4oCUIHRoZSB0d2luIG9mXG4gKiB7QGxpbmsgYXBwbHlSZXRyeVBvbGljeX06IHRoZSBPTkUgcGxhY2UgYHRvdWNoZXNgIGxhbmRzLCBzaGFyZWQgYnkgdGhlIGAudG91Y2hlcygpYCBjdXJzb3IgbW9kaWZpZXIgYW5kIGV2ZXJ5XG4gKiBgb3B0aW9ucy50b3VjaGVzYCBzaXRlLlxuICpcbiAqIFRoZSBsYXcgaXMgYGF0dGVtcHQvZWZmZWN0LnRzIMK3IHRvdWNoZXNQcm9ibGVtYCwgd2hpY2ggdGhlIHRyYXZlcnNlciBhbHNvIGFwcGxpZXMgdG8gYSBTdGFnZU5vZGUgcmV0dXJuZWQgYXQgcnVuXG4gKiB0aW1lIGFuZCB0byBldmVyeSBzdGFnZSBpdCBydW5zOiBgc3lzdGVtYCBhIG5hbWUsIHRoZSBrZXkgcnVsZSBhIGZ1bmN0aW9uLCBhbmQgYSBzdGFnZSB0aGF0IG1heSByZXRyeSBtdXN0IGRlY2xhcmVcbiAqIHRoZSBrZXkgcnVsZSDigJQgYSByZXRyeSBvZiBhbiBvdXRzaWRlIGVmZmVjdCB3aXRob3V0IG9uZSBjYW4gYXBwbHkgaXQgdHdpY2UuIENoZWNrZWQgaGVyZSBhZ2FpbnN0IHRoZSBwb2xpY3lcbiAqIGFscmVhZHkgb24gdGhlIG5vZGU7IGBhcHBseVJldHJ5UG9saWN5YCBjaGVja3MgYSBwb2xpY3kgdGhhdCBsYW5kcyBhZnRlci4gVGhlIHNwZWMgY2FycmllcyB0aGUgc3lzdGVtIE5BTUUgb25seS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlUb3VjaGVzKFxuICBub2RlOiBTdGFnZU5vZGU8YW55LCBhbnk+LFxuICBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHRvdWNoZXM6IFN0YWdlVG91Y2hlcyB8IHVuZGVmaW5lZCxcbiAgd2hlcmU6IHN0cmluZyxcbik6IHZvaWQge1xuICBpZiAodG91Y2hlcyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGlmIChub2RlLnRvdWNoZXMpIGZhaWwoYCR7d2hlcmV9OiB0b3VjaGVzIGFscmVhZHkgZGVjbGFyZWQgYXQgJyR7bm9kZS5uYW1lfScgKCR7bm9kZS50b3VjaGVzLnN5c3RlbX0pYCk7XG4gIC8vIEVhY2ggZmllbGQgcmVhZCBPTkNFLCB0aGVuIGNoZWNrZWQgYW5kIGZyb3plbjogd2hhdCBpcyBjaGVja2VkIGlzIGV4YWN0bHkgd2hhdCBsYW5kcyAoYSBnZXR0ZXIgY2Fubm90IGRpZmZlcikuXG4gIGNvbnN0IHJlYWQgPSAodG91Y2hlcyAhPT0gbnVsbCAmJiB0eXBlb2YgdG91Y2hlcyA9PT0gJ29iamVjdCcgPyB0b3VjaGVzIDoge30pIGFzIFBhcnRpYWw8U3RhZ2VUb3VjaGVzPjtcbiAgY29uc3QgeyBzeXN0ZW0sIGlkZW1wb3RlbmN5S2V5IH0gPSByZWFkO1xuICBjb25zdCBjb3B5ID0geyBzeXN0ZW0sIC4uLihpZGVtcG90ZW5jeUtleSAhPT0gdW5kZWZpbmVkICYmIHsgaWRlbXBvdGVuY3lLZXkgfSkgfTtcbiAgY29uc3QgcHJvYmxlbSA9IHRvdWNoZXNQcm9ibGVtKHRvdWNoZXMgPT09IG51bGwgfHwgdHlwZW9mIHRvdWNoZXMgIT09ICdvYmplY3QnID8gdG91Y2hlcyA6IGNvcHksIG5vZGUucmV0cnkpO1xuICBpZiAocHJvYmxlbSAhPT0gdW5kZWZpbmVkKSBmYWlsKGAke3doZXJlfTogc3RhZ2UgJyR7bm9kZS5uYW1lfScgJHtwcm9ibGVtfWApO1xuICAvLyBUaGUgbm9kZSdzIGNvcHkgaXMgZnJvemVuIGFuZCBob2xkcyBvbmx5IHRoZSB0d28gbmFtZWQgZmllbGRzOiBub3RoaW5nIGVsc2Ugb24gdGhlIGNhbGxlcidzIG9iamVjdCByaWRlcyBhbG9uZy5cbiAgbm9kZS50b3VjaGVzID0gT2JqZWN0LmZyZWV6ZShjb3B5IGFzIFN0YWdlVG91Y2hlcyk7XG4gIHNwZWMudG91Y2hlcyA9IHN5c3RlbSBhcyBzdHJpbmc7XG59XG5cbi8qKlxuICogQXR0YWNoIGRlY2xhcmVkIHRhZ3MgdG8gYSBzdGFnZSBub2RlICsgaXRzIHNwZWMgbm9kZS5cbiAqXG4gKiBUaGUgT05FIHBsYWNlIHRhZ3MgbGFuZCBvbiBhIG5vZGUg4oCUIHRoZSB0d2luIG9mIHtAbGluayBhcHBseVJldHJ5UG9saWN5fSDigJRcbiAqIHNoYXJlZCBieSB0aGUgYC50YWcoKWAgY3Vyc29yIG1vZGlmaWVyIGFuZCBldmVyeSBgb3B0aW9ucy50YWdzYCBkZWNsYXJhdGlvblxuICogc2l0ZSwgc28gdGhlIHJlZnVzYWxzIGFuZCB0aGUgc3BlYydzIG1pcnJvciBjYW4gbmV2ZXIgZHJpZnQgYmV0d2VlbiB0aGVtLlxuICpcbiAqIEEgdGFnIGlzIGEgTkFNRSBkZWNsYXJlZCBhdCBidWlsZCB0aW1lLCBuZXZlciBhIHZhbHVlLCBzbyBldmVyeSByZWZ1c2FsIGlzXG4gKiBhYm91dCB0aGUgbmFtZSdzIHNoYXBlOiBhbiBlbXB0eSBzdHJpbmcgbmFtZXMgbm90aGluZzsgYSBub24tc3RyaW5nIGlzIGFcbiAqIHZhbHVlLCBhbmQgYSB2YWx1ZSBvbiBhIHN0YWdlIHdvdWxkIHJpZGUgdGhlIGNvbW1pdCBsb2cgcGFzdCBldmVyeVxuICogcmVkYWN0aW9uIHBvaW50OyB0aGUgYnJhbmNoLXNlZ21lbnQgbWFya2VyIGlzIHRoZSBydW50aW1lU3RhZ2VJZCBncmFtbWFyJ3NcbiAqIG9uZSByZXNlcnZlZCBieXRlLCBhbmQgYSBjb25zdW1lciB0aGF0IHB1dHMgYSB0YWcgaW50byBhIHBhdGggKGEgVVJMLCBhXG4gKiBzdG9yZSBrZXkpIHdvdWxkIGluaGVyaXQgZXhhY3RseSB0aGUgYW1iaWd1aXR5IHRoZSByZXNlcnZhdGlvbiBleGlzdHMgdG9cbiAqIHByZXZlbnQ7IGEgbmFtZSBkZWNsYXJlZCB0d2ljZSBpcyB0aGUgdHlwbyBpdCB1c3VhbGx5IGlzLiBSZWZ1c2VkIGF0IEJVSUxEXG4gKiB0aW1lLCBsaWtlIGByZXRyeS5hdHRlbXB0c2AsIHNvIHRoZSBtaXN0YWtlIGZhaWxzIHdoaWxlIHRoZSBjaGFydCBpcyBiZWluZ1xuICogd3JpdHRlbi4gQW4gRU1QVFkgbGlzdCBsYW5kcyBub3RoaW5nOiBcImFic2VudCB3aGVuIGVtcHR5XCIgaXMgdGhlIGxhdyB0aGVcbiAqIGNvbW1pdCBidW5kbGUga2VlcHMsIGFuZCB0aGUgc3BlYyBrZWVwcyBpdCB0b28uXG4gKi9cbmZ1bmN0aW9uIGFwcGx5VGFncyhcbiAgbm9kZTogU3RhZ2VOb2RlPGFueSwgYW55PixcbiAgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICB0YWdzOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgd2hlcmU6IHN0cmluZyxcbik6IHZvaWQge1xuICBpZiAodGFncyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGlmICghQXJyYXkuaXNBcnJheSh0YWdzKSkgZmFpbChgJHt3aGVyZX06IHRhZ3MgbXVzdCBiZSBhbiBhcnJheSBvZiBuYW1lcyAoZ290ICR7dHlwZW9mIHRhZ3N9KWApO1xuICBpZiAodGFncy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgaWYgKHR5cGVvZiB0YWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgJHt3aGVyZX06IGEgdGFnIG11c3QgYmUgYSBzdHJpbmcgbmFtZSAoZ290ICR7dGFnID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHRhZ30pLiBBIHRhZyBpcyBhIE5BTUUgYCArXG4gICAgICAgICAgJ2RlY2xhcmVkIGF0IGJ1aWxkIHRpbWUg4oCUIGEgdmFsdWUgYmVsb25ncyBpbiBzdGF0ZSBvciBpbiAkZW1pdCwgbmV2ZXIgb24gdGhlIHN0YWdlLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGFnLnRyaW0oKS5sZW5ndGggPT09IDApIGZhaWwoYCR7d2hlcmV9OiBhIHRhZyBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nYCk7XG4gICAgaWYgKGhhc0JyYW5jaFNlZ21lbnRNYXJrZXIodGFnKSkge1xuICAgICAgZmFpbChcbiAgICAgICAgYCR7d2hlcmV9OiB0YWcgJyR7dGFnfScgY29udGFpbnMgdGhlIHJlc2VydmVkIGNoYXJhY3RlciAnJHtCUkFOQ0hfU0VHTUVOVF9NQVJLRVJ9Jy4gYCArXG4gICAgICAgICAgYCcke0JSQU5DSF9TRUdNRU5UX01BUktFUn0nIGlzIHJlc2VydmVkIGZvciB0aGUgc3ViZmxvdyBwYXRoIHNlZ21lbnRzIGFkZFBhcmFsbGVsRm9yRWFjaCgpIGdlbmVyYXRlcywgYCArXG4gICAgICAgICAgJ2FuZCBhIHRhZyB0aGF0IGEgY29uc3VtZXIgcHV0cyBpbnRvIGEgcGF0aCBvciBhIGtleSB3b3VsZCBpbmhlcml0IHRoYXQgYW1iaWd1aXR5LiBSZW5hbWUgdGhlIHRhZyAnICtcbiAgICAgICAgICAnKGEgZGFzaCBvciBhIGNvbG9uIHJlYWRzIHRoZSBzYW1lKS4gU2VlIGRvY3MvZGVzaWduLzIwMjYtMDktZGVjbGFyZWQtdGFncy5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHNlZW4uaGFzKHRhZykpIGZhaWwoYCR7d2hlcmV9OiB0YWcgJyR7dGFnfScgaXMgZGVjbGFyZWQgdHdpY2VgKTtcbiAgICBzZWVuLmFkZCh0YWcpO1xuICB9XG4gIGlmIChub2RlLnRhZ3MpIHtcbiAgICBmYWlsKFxuICAgICAgYCR7d2hlcmV9OiB0YWdzIGFscmVhZHkgZGVjbGFyZWQgYXQgJyR7bm9kZS5uYW1lfScgKCR7bm9kZS50YWdzLmpvaW4oJywgJyl9KSDigJQgZGVjbGFyZSBldmVyeSB0YWcgZm9yIGEgYCArXG4gICAgICAgICdzdGFnZSBpbiBPTkUgcGxhY2UsIHNvIHRoZSBNYXAgYWR2ZXJ0aXNlcyB0aGUgd2hvbGUgdm9jYWJ1bGFyeSBmcm9tIGEgc2luZ2xlIHNpdGUuJyxcbiAgICApO1xuICB9XG4gIC8vIFRoZSBub2RlJ3MgY29weSBpcyBmcm96ZW46IGNvbW1pdCBidW5kbGVzIHNoYXJlIGl0IGJ5IHJlZmVyZW5jZSBhbmQgdGhlXG4gIC8vIGxpYnJhcnkncyByZWFkcyBhcmUgYm9ycm93ZWQsIG5ldmVyIG11dGF0ZWQuIFRoZSBzcGVjJ3MgY29weSBpcyBpdHMgb3duXG4gIC8vIHBsYWluIGFycmF5LCBKU09OLXNhZmUgbGlrZSB0aGUgcmVzdCBvZiB0aGUgc3BlYy5cbiAgbm9kZS50YWdzID0gT2JqZWN0LmZyZWV6ZShbLi4udGFnc10pO1xuICBzcGVjLnRhZ3MgPSBbLi4udGFnc107XG59XG5cbi8qKlxuICogVGhlIGJ1aWxkZXIncyBPTkUgaWQgcmVmdXNhbCAoRjcsIFI1KTogZXZlcnkgaWQgZG9vciBjYWxscyBpdCBvbmNlLCBiZWZvcmVcbiAqIHRoZSBpZCBsYW5kcyBhbnl3aGVyZS4gVGhlIHJ1bGUgbGl2ZXMgYmVzaWRlIHRoZSBncmFtbWFyIOKAlFxuICogYGlkcy9yZXNlcnZlZElkcy50cyDCtyByZWZ1c2VSZXNlcnZlZElkYDogYCNgIGFuZCBgL2AgYXJlIHJlZnVzZWQgaW5cbiAqIGV2ZXJ5IGlkICh0aGV5IGFyZSB0aGUgcnVudGltZVN0YWdlSWQgZ3JhbW1hcidzIGRlbGltaXRlcnMpLCBgfmAgaW4gYVxuICogYCdzZWdtZW50J2AgaWQgKGEgc3ViZmxvdyBpZCBvciBhIGBwYXJhbGxlbEZvckVhY2hgIGlkIOKAlCBzZWUgYmVsb3cpLlxuICpcbiAqIERvb3JzIChvbmUgY2FsbCBlYWNoKTogYHN0YXJ0YCwgYHN0YXJ0U2VsZWN0b3JgLCBgYWRkRnVuY3Rpb25gLFxuICogYGFkZFN0cmVhbWluZ0Z1bmN0aW9uYCwgYGFkZFBhdXNhYmxlRnVuY3Rpb25gLCBgYWRkRGVjaWRlckZ1bmN0aW9uYCxcbiAqIGBhZGRTZWxlY3RvckZ1bmN0aW9uYCwgYGFkZExpc3RPZkZ1bmN0aW9uYCAoZWFjaCBjaGlsZCksIGBhZGRQYXJhbGxlbEZvckVhY2hgLFxuICogZXZlcnkgc3ViZmxvdyBtb3VudCAoYGFzc2VydFN1YmZsb3dJZEFsbG93ZWRgKSBhbmQgZXZlcnkgZGVjaWRlci9zZWxlY3RvclxuICogYnJhbmNoIChgQnJhbmNoQ3Vyc29yIMK3IGFkbWl0YCkuIGBhZGREZXRhY2hBbmRGb3JnZXRgIC9cbiAqIGBhZGREZXRhY2hBbmRKb2luTGF0ZXJgIGFuZCBgYWRkQnJhbmNoTGlzdGAgZGVsZWdhdGUgdG8gb25lIG9mIHRoZXNlLlxuICogTmV2ZXIgY2FsbGVkIGJ5IHRoZSBwcmVmaXhlciBvciBhIHN0b3JlIOKAlCB0aG9zZSBob2xkIGlkcyB0aGF0IGNhcnJ5IHRoZVxuICogZGVsaW1pdGVycyBvbiBwdXJwb3NlLlxuICovXG5jb25zdCBhZG1pdElkID0gKHdoYXQ6IHN0cmluZywgaWQ6IHN0cmluZywgcG9zaXRpb246IElkUG9zaXRpb24pOiB2b2lkID0+IHtcbiAgY29uc3QgcmVmdXNhbCA9IHJlZnVzZVJlc2VydmVkSWQod2hhdCwgaWQsIHBvc2l0aW9uKTtcbiAgaWYgKHJlZnVzYWwgIT09IHVuZGVmaW5lZCkgZmFpbChyZWZ1c2FsKTtcbn07XG5cbi8qKlxuICogUmVmdXNlIHRoZSByZXNlcnZlZCBjaGFyYWN0ZXJzIGluIGEgdXNlci1hdXRob3JlZCBTVUJGTE9XIGlkLlxuICpcbiAqIEEgc3ViZmxvdyBpZCBJUyBhIHBhdGggc2VnbWVudCBpbiBgcnVudGltZVN0YWdlSWRgLCB3aGljaCBpcyB0aGUgc2FtZVxuICogcG9zaXRpb24gYGFkZFBhcmFsbGVsRm9yRWFjaGAgZ2VuZXJhdGVzIGl0cyBicmFuY2ggc2VnbWVudHMgaW50by4gQVxuICogaGFuZC1hdXRob3JlZCBpZCBjYXJyeWluZyB0aGUgbWFya2VyIGNvdWxkIHRoZXJlZm9yZSBjb2xsaWRlIHdpdGggYVxuICogZ2VuZXJhdGVkIGJyYW5jaCDigJQgYW5kLCBiZWNhdXNlIHRoaXMgY29kZWJhc2UgZGVsaWJlcmF0ZWx5IHRvbGVyYXRlc1xuICogaWQtY29sbGlzaW9uIGNsYXNzZXMgKGxvb3AtcmVmIHN0dWJzKSwgc3VjaCBhIGNvbGxpc2lvbiB3b3VsZCBub3QgY3Jhc2guIEl0XG4gKiB3b3VsZCBzaWxlbnRseSBtaXMtYXR0cmlidXRlIGEgdHJhY2UsIHdoaWNoIGlzIHdvcnNlLiBTbyB0aGUgbWFya2VyIGlzXG4gKiByZWZ1c2VkIGF0IEJVSUxEIHRpbWUsIG9uIE5FVyBjaGFydHMgb25seTogYSBjaGFydCB0aGF0IHdhcyBsZWdhbCBiZWZvcmVcbiAqIDkuMTQuMCBhbmQgZG9lcyBub3QgdXNlIHRoZSBtYXJrZXIgYmVoYXZlcyBieXRlLWlkZW50aWNhbGx5LlxuICpcbiAqIENhbGxlZCBhdCBldmVyeSB1c2VyLWF1dGhvcmVkIHN1YmZsb3ctaWQgZW50cnkgcG9pbnQuIFN0YWdlIGlkcyBlbHNld2hlcmVcbiAqIGtlZXAgYH5gICh0aGV5IG9jY3VweSB0aGUgYHN0YWdlSWRgIHBvc2l0aW9uLCBuZXZlciB0aGUgYHN1YmZsb3dQYXRoYFxuICogcG9zaXRpb24sIHNvIHRoZXkgY2Fubm90IGNvbGxpZGUgd2l0aCBhIHNlZ21lbnQpIGJ1dCwgc2luY2UgOS4zNy4wLCBub3QgYCNgXG4gKiBvciBgL2Ag4oCUIHNlZSBgYWRtaXRJZGAuIChgYWRkUGFyYWxsZWxGb3JFYWNoYCdzIG93biBpZCBpcyB0aGUgb25lIG90aGVyXG4gKiBgJ3NlZ21lbnQnYCBpZCwgcmVmdXNlZCBhdCB0aGF0IG1ldGhvZC4pIERlc2lnbjogZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQuXG4gKi9cbmNvbnN0IGFzc2VydFN1YmZsb3dJZEFsbG93ZWQgPSAoaWQ6IHN0cmluZyk6IHZvaWQgPT4gYWRtaXRJZCgnc3ViZmxvdyBpZCcsIGlkLCAnc2VnbWVudCcpO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEJyYW5jaEN1cnNvciDigJQgd2hhdCBEZWNpZGVyTGlzdCBhbmQgU2VsZWN0b3JGbkxpc3Qgc2hhcmUgKEY3KVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBXaGljaCBkaXNwYXRjaGVyIGEge0BsaW5rIEJyYW5jaEN1cnNvcn0gYWRkcyBicmFuY2hlcyB1bmRlci4gKi9cbnR5cGUgQnJhbmNoS2luZCA9ICdkZWNpZGVyJyB8ICdzZWxlY3Rvcic7XG5cbi8qKlxuICogVGhlIGJyYW5jaC1hZGRpbmcgbWVjaGFuaWNzIG9mIGEgZGVjaWRlciBvciBhIHNlbGVjdG9yIOKAlCBPTkUgaW1wbGVtZW50YXRpb24sXG4gKiBjb21wb3NlZCBieSB7QGxpbmsgRGVjaWRlckxpc3R9IGFuZCB7QGxpbmsgU2VsZWN0b3JGbkxpc3R9ICh1bnRpbCA5LjM2LjAgZWFjaFxuICogbGlzdCBjYXJyaWVkIGl0cyBvd24gY29weSBvZiBhbGwgZm91ciBicmFuY2gga2luZHMgYW5kIGBlbmQoKWApLlxuICpcbiAqIE93bnM6IHRoZSBicmFuY2gtaWQgbGVkZ2VyIChkdXBsaWNhdGUgKyByZXNlcnZlZC1jaGFyYWN0ZXIgcmVmdXNhbCBpbiBvbmVcbiAqIGBhZG1pdGApLCB0aGUgbm9kZS9zcGVjIHBhaXIgZWFjaCBicmFuY2gga2luZCBidWlsZHMsIHRoZSBzdHJ1Y3R1cmUgZXZlbnRzLFxuICogYW5kIHRoZSBjbG9zaW5nIGBmaW5pc2hgLiBUaGUgbGlzdHMga2VlcCBvbmx5IHdoYXQgZGlmZmVyczogYSBkZWNpZGVyJ3NcbiAqIGB7IGxvb3BUbyB9YCAvIGBsb29wVG8oKWAgLyBgc2V0RGVmYXVsdGAsIGFuZCB0aGUgdHlwZSBlYWNoIG1ldGhvZCByZXR1cm5zLlxuICovXG5jbGFzcyBCcmFuY2hDdXJzb3I8VE91dCwgVFNjb3BlPiB7XG4gIHJlYWRvbmx5IGJyYW5jaElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaERlc2NJbmZvOiBBcnJheTx7IGlkOiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH0+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBraW5kOiBCcmFuY2hLaW5kLFxuICAgIHJlYWRvbmx5IGI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPixcbiAgICByZWFkb25seSBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICByZWFkb25seSBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgcmVhZG9ubHkgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc2VydmVkU3RlcE51bWJlcjogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge31cblxuICAvKipcbiAgICogQSBkaXNwYXRjaGVyIGlzIGRlZmluZWQgT05DRS4gYGZpbmlzaGAgZmxhZ3MgaXRzIG5vZGUsIGFuZCBmcm9tIHRoZW4gb25cbiAgICogdGhlIG5vZGUncyBicmFuY2hlcywgaXRzIGBicmFuY2hJZHNgIGFuZCBpdHMgYG9uRGVjaWRlckNvbXBsZXRlYCBhcmVcbiAgICogZmluYWwuIEEgbGlzdCBoZWxkIHBhc3QgYC5lbmQoKWAgY291bGQgcmUtb3BlbiBpdCDigJQgYSBzZWNvbmQgYGVuZCgpYFxuICAgKiBhcHBlbmRlZCBhbm90aGVyIGAnZGVmYXVsdCdgIGNsb25lLCBmaXJlZCBhIHNlY29uZCBjb21wbGV0aW9uIGFuZCB3cm90ZSBhXG4gICAqIHNlY29uZCBkZXNjcmlwdGlvbiBsaW5lOyBhIGxhdGUgYnJhbmNoIG9yIGBsb29wVG9gIGNoYW5nZWQgYSBub2RlIHdob3NlXG4gICAqIGBicmFuY2hJZHNgIHdlcmUgYWxyZWFkeSBwdWJsaXNoZWQuIFRoaXMgaXMgdGhlIG9uZSBzYW1lLW5vZGUgcmVmdXNhbC5cbiAgICogVGhlIGd1YXJkIHRoYXQgYGFkZERlY2lkZXJGdW5jdGlvbmAgLyBgYWRkU2VsZWN0b3JGdW5jdGlvbmAgY2FycmllZCB1bnRpbFxuICAgKiAxMC4wLjEgcmVhZCB0aGUgUFJFVklPVVMgbm9kZSdzIGZsYWdzIGluc3RlYWQsIGFuZCBzbyByZWZ1c2VkIGEgZGlzcGF0Y2hlclxuICAgKiB0aGF0IGZvbGxvd3MgYSBkaXNwYXRjaGVyIOKAlCBhIGNoYWluLCB3aGljaCBpcyBhIG5ldyBub2RlIGF0IGl0cyBgbmV4dGAuXG4gICAqL1xuICBhc3NlcnRPcGVuKGFjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY3VyTm9kZS5kZWNpZGVyRm4gfHwgdGhpcy5jdXJOb2RlLnNlbGVjdG9yRm4pIHtcbiAgICAgIGZhaWwoYGNhbm5vdCAke2FjdGlvbn06ICR7dGhpcy5raW5kfSAnJHt0aGlzLmN1ck5vZGUubmFtZX0nIHdhcyBhbHJlYWR5IGNsb3NlZCBieSBlbmQoKWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgb25lIGJyYW5jaC1pZCBkb29yOiBhIGNsb3NlZCBkaXNwYXRjaGVyLCBhIGR1cGxpY2F0ZSwgdGhlbiB0aGUgcmVzZXJ2ZWQgY2hhcmFjdGVycyAoUjUpLiAqL1xuICBwcml2YXRlIGFkbWl0KGlkOiBzdHJpbmcsIHBvc2l0aW9uOiBJZFBvc2l0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5hc3NlcnRPcGVuKGBhZGQgYnJhbmNoICcke2lkfSdgKTtcbiAgICBpZiAodGhpcy5icmFuY2hJZHMuaGFzKGlkKSkgZmFpbChgZHVwbGljYXRlICR7dGhpcy5raW5kfSBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgaWYgKHBvc2l0aW9uID09PSAnc2VnbWVudCcpIGFzc2VydFN1YmZsb3dJZEFsbG93ZWQoaWQpO1xuICAgIGVsc2UgYWRtaXRJZCgnYnJhbmNoIGlkJywgaWQsICdzdGFnZScpO1xuICAgIHRoaXMuYnJhbmNoSWRzLmFkZChpZCk7XG4gIH1cblxuICAvKiogQXBwZW5kIHRoZSBicmFuY2gncyBub2RlICsgc3BlYyBhbmQgZmlyZSBpdHMgc3RhZ2UgYW5kIGRlY2lzaW9uLWJyYW5jaCBlZGdlLiAqL1xuICBwcml2YXRlIGF0dGFjaChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLCBpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbiA9IHRoaXMuY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcbiAgICAvLyBMNy4zIOKAlCBicmFuY2g6IHN0YWdlICsgZGVjaXNpb24tYnJhbmNoIGVkZ2Uga2V5ZWQgYnkgaWQuXG4gICAgdGhpcy5iLl9maXJlU3RhZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHNwZWMpO1xuICAgIHRoaXMuYi5fZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyKHRoaXMuY3VyU3BlYy5pZCwgc3BlYy5pZCwgJ2RlY2lzaW9uLWJyYW5jaCcsIGlkKTtcbiAgfVxuXG4gIGZ1bmN0aW9uQnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOlxuICAgICAgfCB7IHJlYWRvbmx5IHJldHJ5PzogUmV0cnlQb2xpY3k7IHJlYWRvbmx5IHRvdWNoZXM/OiBTdGFnZVRvdWNoZXM7IHJlYWRvbmx5IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9XG4gICAgICB8IHVuZGVmaW5lZCxcbiAgKTogeyBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjsgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIH0ge1xuICAgIHRoaXMuYWRtaXQoaWQsICdzdGFnZScpO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWU6IG5hbWUgPz8gaWQsIGlkLCBicmFuY2hJZDogaWQgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBpZiAoZm4pIHtcbiAgICAgIG5vZGUuZm4gPSBmbjtcbiAgICB9XG4gICAgdGhpcy5iLl9yZWdpc3RlclN0YWdlKGlkLCBmbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWU6IG5hbWUgPz8gaWQsIGlkLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgYXBwbHlSZXRyeVBvbGljeShub2RlLCBzcGVjLCBvcHRpb25zPy5yZXRyeSwgYGFkZEZ1bmN0aW9uQnJhbmNoKCcke2lkfScpYCk7XG4gICAgYXBwbHlUb3VjaGVzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRvdWNoZXMsIGBhZGRGdW5jdGlvbkJyYW5jaCgnJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkRnVuY3Rpb25CcmFuY2goJyR7aWR9JylgKTtcblxuICAgIHRoaXMuYXR0YWNoKG5vZGUsIHNwZWMsIGlkKTtcbiAgICB0aGlzLmJyYW5jaERlc2NJbmZvLnB1c2goeyBpZCwgZGVzY3JpcHRpb24gfSk7XG4gICAgcmV0dXJuIHsgbm9kZSwgc3BlYyB9O1xuICB9XG5cbiAgcGF1c2FibGVCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOlxuICAgICAgfCB7IHJlYWRvbmx5IHJldHJ5PzogUmV0cnlQb2xpY3k7IHJlYWRvbmx5IHRvdWNoZXM/OiBTdGFnZVRvdWNoZXM7IHJlYWRvbmx5IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9XG4gICAgICB8IHVuZGVmaW5lZCxcbiAgKTogeyBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjsgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIH0ge1xuICAgIHRoaXMuYWRtaXQoaWQsICdzdGFnZScpO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBuYW1lID8/IGlkLFxuICAgICAgaWQsXG4gICAgICBicmFuY2hJZDogaWQsXG4gICAgICBmbjogaGFuZGxlci5leGVjdXRlIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICAgIGlzUGF1c2FibGU6IHRydWUsXG4gICAgICByZXN1bWVGbjogaGFuZGxlci5yZXN1bWUsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLmIuX2FkZFRvTWFwKGlkLCBoYW5kbGVyLmV4ZWN1dGUgYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZTogbmFtZSA/PyBpZCwgaWQsIHR5cGU6ICdzdGFnZScsIGlzUGF1c2FibGU6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIG9wdGlvbnM/LnJldHJ5LCBgYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaCgnJHtpZH0nKWApO1xuICAgIGFwcGx5VG91Y2hlcyhub2RlLCBzcGVjLCBvcHRpb25zPy50b3VjaGVzLCBgYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaCgnJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkUGF1c2FibGVGdW5jdGlvbkJyYW5jaCgnJHtpZH0nKWApO1xuXG4gICAgdGhpcy5hdHRhY2gobm9kZSwgc3BlYywgaWQpO1xuICAgIHRoaXMuYnJhbmNoRGVzY0luZm8ucHVzaCh7IGlkLCBkZXNjcmlwdGlvbiB9KTtcbiAgICByZXR1cm4geyBub2RlLCBzcGVjIH07XG4gIH1cblxuICBzdWJmbG93QnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBTdWJmbG93TW91bnRPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmFkbWl0KGlkLCAnc2VnbWVudCcpO1xuXG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBtb3VudE5hbWUgfHwgaWQ7XG4gICAgdGhpcy5iLl9tb3VudFN1YmZsb3coaWQsIHN1YmZsb3csICgpID0+IHRoaXMucGxhY2VTdWJmbG93QnJhbmNoKGlkLCBzdWJmbG93LCBzdWJmbG93TmFtZSwgb3B0aW9ucykpO1xuICB9XG5cbiAgLyoqIFRoZSBicmFuY2ggbW91bnQncyBvd24gbm9kZSArIHNwZWMsIHBsYWNlZCB1bmRlciB0aGUgZGVjaWRlci9zZWxlY3RvciAoc2VlIGBfbW91bnRTdWJmbG93YCkuICovXG4gIHByaXZhdGUgcGxhY2VTdWJmbG93QnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGJyYW5jaElkOiBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dTdHJ1Y3R1cmU6IHN1YmZsb3cuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgIH07XG4gICAgLy8gU1RSVUNUVVJFLU9OTFkgY29udmVyZ2VuY2Ugb3ZlcnJpZGUgKHNlZSBgX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnRgICtcbiAgICAvLyBgU3ViZmxvd01vdW50T3B0aW9ucy5jb252ZXJnZUF0YCk6IHRoaXMgYnJhbmNoJ3MgY29udmVyZ2VuY2UgZWRnZSBwb2ludHMgYXRcbiAgICAvLyBgY29udmVyZ2VBdGAgKGEgRE9XTlNUUkVBTSBzdGFnZSkgaW5zdGVhZCBvZiB0aGUgc2hhcmVkIG5leHQgc3RhZ2Ug4oCUIGUuZy4gYVxuICAgIC8vIGB0b29sc2Agc2xvdCB0aGF0IGJ5cGFzc2VzIGBtZXNzYWdlQVBJYCB0byBwYWlyIHdpdGggaXRzIG91dHB1dCBhdFxuICAgIC8vIGBjYWxsLWxsbWAuIFZpc3VhbGl6YXRpb24tb25seTogTk8gcnVudGltZSBqb2luIGJhcnJpZXIgKGRhdGEgcmlkZXMgc2NvcGUpLlxuICAgIC8vIENhcnJpZWQgb24gdGhlIHNwZWMgc28gdGhlIGVkZ2UtZmlyaW5nIGNob2tlcG9pbnQgY2FuIHJlYWQgaXQuXG4gICAgaWYgKG9wdGlvbnM/LmNvbnZlcmdlQXQpIHNwZWMuY29udmVyZ2VBdCA9IG9wdGlvbnMuY29udmVyZ2VBdDtcblxuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKCcke2lkfScpYCk7XG5cbiAgICB0aGlzLmF0dGFjaChub2RlLCBzcGVjLCBpZCk7XG4gICAgdGhpcy5iLl9maXJlU3ViZmxvd01vdW50ZWRGcm9tU3ViQnVpbGRlcihpZCwgc3ViZmxvd05hbWUsIGlkLCBmYWxzZSwgc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuICB9XG5cbiAgbGF6eVN1YmZsb3dCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBTdWJmbG93TW91bnRPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmFkbWl0KGlkLCAnc2VnbWVudCcpO1xuICAgIHRoaXMuYi5fY2xhaW1GcmVzaElkKGlkLCBgYWRkTGF6eVN1YkZsb3dDaGFydEJyYW5jaCgnJHtpZH0nKWApO1xuXG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBtb3VudE5hbWUgfHwgaWQ7XG5cbiAgICAvLyBTdG9yZSByZXNvbHZlciBvbiB0aGUgbm9kZSDigJQgTk8gZWFnZXIgdHJlZSBjbG9uaW5nXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIGlkLFxuICAgICAgYnJhbmNoSWQ6IGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dSZXNvbHZlcjogcmVzb2x2ZXIgYXMgYW55LFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAvLyBTcGVjIHN0dWIg4oCUIG5vIHN1YmZsb3dTdHJ1Y3R1cmUgKGxhenkpLiBUaGUgbGF6eSBzdWJmbG93J3NcbiAgICAvLyBpbnRlcm5hbHMgd2lsbCBiZSBzaGFwZWQgYXQgcmVzb2x1dGlvbiB0aW1lLlxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIGlzTGF6eTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRMYXp5U3ViRmxvd0NoYXJ0QnJhbmNoKCcke2lkfScpYCk7XG5cbiAgICB0aGlzLmF0dGFjaChub2RlLCBzcGVjLCBpZCk7XG4gICAgdGhpcy5iLl9maXJlU3ViZmxvd01vdW50ZWRGcm9tU3ViQnVpbGRlcihpZCwgc3ViZmxvd05hbWUsIGlkLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgZGlzcGF0Y2hlcjogdmFsaWRhdGUgdGhlIGJyYW5jaGVzLCBmbGFnIHRoZSBub2RlLCBkZXNjcmliZSBpdCxcbiAgICogYW5kIGZpcmUgYG9uRGVjaWRlckNvbXBsZXRlYC4gQSBkZWNpZGVyIHBhc3NlcyBpdHMgYHNldERlZmF1bHRgIGlkICh0aGVcbiAgICogc3ludGhldGljIGAnZGVmYXVsdCdgIGNsb25lIGlzIGFwcGVuZGVkIEFGVEVSIGBicmFuY2hJZHNgIGlzIHRha2VuLCBzbyBvbmx5XG4gICAqIHVzZXItc3BlY2lmaWVkIGJyYW5jaGVzIGFyZSBsaXN0ZWQpOyBhIHNlbGVjdG9yIGhhcyBubyBkZWZhdWx0LlxuICAgKi9cbiAgZmluaXNoKGRlZmF1bHRJZD86IHN0cmluZyk6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5hc3NlcnRPcGVuKCdjYWxsIGVuZCgpIGFnYWluJyk7XG4gICAgY29uc3Qga2luZCA9IHRoaXMua2luZDtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuY3VyTm9kZS5jaGlsZHJlbjtcbiAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbRmxvd0NoYXJ0QnVpbGRlcl0gJHtraW5kfSBhdCAnJHt0aGlzLmN1ck5vZGUubmFtZX0nIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBicmFuY2hgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IGV2ZXJ5IGJyYW5jaCB3aXRoIG5vIGVtYmVkZGVkIGZuIGlzIHJlc29sdmFibGUgZnJvbSB0aGUgc3RhZ2VNYXBcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoIWNoaWxkLmZuICYmIGNoaWxkLmlkICYmICFjaGlsZC5pc1N1YmZsb3dSb290ICYmICFjaGlsZC5zdWJmbG93UmVzb2x2ZXIpIHtcbiAgICAgICAgY29uc3QgaGFzSW5NYXAgPSB0aGlzLmIuX3N0YWdlTWFwSGFzKGNoaWxkLmlkKSB8fCB0aGlzLmIuX3N0YWdlTWFwSGFzKGNoaWxkLm5hbWUpO1xuICAgICAgICBpZiAoIWhhc0luTWFwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFtGbG93Q2hhcnRCdWlsZGVyXSAke2tpbmR9IGJyYW5jaCAnJHtjaGlsZC5pZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfScgaGFzIG5vIGZ1bmN0aW9uIOKAlCBgICtcbiAgICAgICAgICAgICAgYHByb3ZpZGUgYSBmbiBhcmd1bWVudCB0byBhZGRGdW5jdGlvbkJyYW5jaCgnJHtjaGlsZC5pZH0nLCAuLi4pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGtpbmQgPT09ICdkZWNpZGVyJykgdGhpcy5jdXJOb2RlLmRlY2lkZXJGbiA9IHRydWU7XG4gICAgZWxzZSB0aGlzLmN1ck5vZGUuc2VsZWN0b3JGbiA9IHRydWU7XG5cbiAgICB0aGlzLmN1clNwZWMuYnJhbmNoSWRzID0gY2hpbGRyZW5cbiAgICAgIC5tYXAoKGMpID0+IGMuaWQpXG4gICAgICAuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmIGlkLmxlbmd0aCA+IDApO1xuICAgIHRoaXMuY3VyU3BlYy50eXBlID0ga2luZDtcbiAgICBpZiAoa2luZCA9PT0gJ3NlbGVjdG9yJykgdGhpcy5jdXJTcGVjLmhhc1NlbGVjdG9yID0gdHJ1ZTtcblxuICAgIGlmIChkZWZhdWx0SWQpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRDaGlsZCA9IGNoaWxkcmVuLmZpbmQoKGMpID0+IGMuaWQgPT09IGRlZmF1bHRJZCk7XG4gICAgICBpZiAoZGVmYXVsdENoaWxkKSB7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goeyAuLi5kZWZhdWx0Q2hpbGQsIGlkOiAnZGVmYXVsdCcsIGJyYW5jaElkOiAnZGVmYXVsdCcgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyID4gMCkge1xuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmN1ck5vZGUubmFtZTtcbiAgICAgIGNvbnN0IGJyYW5jaElkTGlzdCA9IHRoaXMuYnJhbmNoRGVzY0luZm8ubWFwKChiKSA9PiBiLmlkKS5qb2luKCcsICcpO1xuICAgICAgY29uc3QgbWFpbkxpbmUgPVxuICAgICAgICBraW5kID09PSAnZGVjaWRlcidcbiAgICAgICAgICA/IHRoaXMuZGVzY3JpcHRpb25cbiAgICAgICAgICAgID8gYCR7dGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXJ9LiAke2xhYmVsfSDigJQgJHt0aGlzLmRlc2NyaXB0aW9ufSAoYnJhbmNoZXM6ICR7YnJhbmNoSWRMaXN0fSlgXG4gICAgICAgICAgICA6IGAke3RoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyfS4gJHtsYWJlbH0g4oCUIERlY2lkZXMgYmV0d2VlbjogJHticmFuY2hJZExpc3R9YFxuICAgICAgICAgIDogdGhpcy5kZXNjcmlwdGlvblxuICAgICAgICAgID8gYCR7dGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXJ9LiAke2xhYmVsfSDigJQgJHt0aGlzLmRlc2NyaXB0aW9ufWBcbiAgICAgICAgICA6IGAke3RoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyfS4gJHtsYWJlbH0g4oCUIFNlbGVjdHMgZnJvbTogJHticmFuY2hJZExpc3R9YDtcbiAgICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cy5wdXNoKG1haW5MaW5lKTtcblxuICAgICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucy5zZXQodGhpcy5jdXJOb2RlLm5hbWUsIHRoaXMuZGVzY3JpcHRpb24pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiB0aGlzLmJyYW5jaERlc2NJbmZvKSB7XG4gICAgICAgIGlmIChicmFuY2guZGVzY3JpcHRpb24pIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAgICDihpIgJHticmFuY2guaWR9OiAke2JyYW5jaC5kZXNjcmlwdGlvbn1gKTtcbiAgICAgICAgaWYgKGJyYW5jaC5kZXNjcmlwdGlvbikgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucy5zZXQoYnJhbmNoLmlkLCBicmFuY2guZGVzY3JpcHRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEw3LjMg4oCUIGZpcmUgYG9uRGVjaWRlckNvbXBsZXRlYCBzbyBjb25zdW1lcnMgY2FuIHRydXN0IG5vIG1vcmVcbiAgICAvLyBicmFuY2hlcyB3aWxsIGFycml2ZS4gQnJhbmNoIGl0ZXJhdGlvbiBvcmRlciA9IGFkZGl0aW9uIG9yZGVyID0gU2V0XG4gICAgLy8gaW5zZXJ0aW9uIG9yZGVyLiBTZWxlY3RvcnMgaGF2ZSBubyBkZWZhdWx0IGJyYW5jaC5cbiAgICBpZiAoa2luZCA9PT0gJ2RlY2lkZXInKSB7XG4gICAgICB0aGlzLmIuX2ZpcmVEZWNpZGVyQ29tcGxldGVGcm9tU3ViQnVpbGRlcih0aGlzLmN1clNwZWMuaWQsICdkZWNpZGVyJywgWy4uLnRoaXMuYnJhbmNoSWRzXSwgZGVmYXVsdElkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iLl9maXJlRGVjaWRlckNvbXBsZXRlRnJvbVN1YkJ1aWxkZXIodGhpcy5jdXJTcGVjLmlkLCAnc2VsZWN0b3InLCBbLi4udGhpcy5icmFuY2hJZHNdKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYjtcbiAgfVxufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIERlY2lkZXJMaXN0XG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBGbHVlbnQgaGVscGVyIHJldHVybmVkIGJ5IGFkZERlY2lkZXJGdW5jdGlvbiB0byBhZGQgYnJhbmNoZXMuXG4gKiBgZW5kKClgIHNldHMgYGRlY2lkZXJGbiA9IHRydWVgIOKAlCB0aGUgZm4gSVMgdGhlIGRlY2lkZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNpZGVyTGlzdDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJzb3I6IEJyYW5jaEN1cnNvcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIGRlZmF1bHRJZD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBidWlsZGVyOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4sXG4gICAgY3VyTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY3VyU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHBhcmVudERlc2NyaXB0aW9uUGFydHM6IHN0cmluZ1tdID0gW10sXG4gICAgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCksXG4gICAgcmVzZXJ2ZWRTdGVwTnVtYmVyID0gMCxcbiAgICBkZWNpZGVyRGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge1xuICAgIHRoaXMuY3Vyc29yID0gbmV3IEJyYW5jaEN1cnNvcihcbiAgICAgICdkZWNpZGVyJyxcbiAgICAgIGJ1aWxkZXIsXG4gICAgICBjdXJOb2RlLFxuICAgICAgY3VyU3BlYyxcbiAgICAgIHBhcmVudERlc2NyaXB0aW9uUGFydHMsXG4gICAgICBwYXJlbnRTdGFnZURlc2NyaXB0aW9ucyxcbiAgICAgIHJlc2VydmVkU3RlcE51bWJlcixcbiAgICAgIGRlY2lkZXJEZXNjcmlwdGlvbixcbiAgICApO1xuICB9XG5cbiAgYWRkRnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm4/OiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgLyoqIGB7IGxvb3BUbyB9YCBkZWNsYXJlcyB0aGlzIGJyYW5jaCBsb29wcyBiYWNrIHRvIGFuIGFscmVhZHktZGVjbGFyZWRcbiAgICAgKiAgc3RhZ2Ug4oCUIHRoZSBsb29wIGlzIFNPVVJDRUQgRlJPTSBUSElTIEJSQU5DSCAobm90IHRoZSBkZWNpZGVyKS5cbiAgICAgKiAgYHsgcmV0cnkgfWAgZ2l2ZXMgVEhJUyBCUkFOQ0gncyBzdGFnZSBhIGRlY2xhcmF0aXZlIHJldHJ5IHBvbGljeTtcbiAgICAgKiAgYHsgdGFncyB9YCBwdXRzIGRlY2xhcmVkIHRhZ3Mgb24gaXQgKHNlZSBgRmxvd0NoYXJ0QnVpbGRlci50YWdgKS4gKi9cbiAgICBvcHRpb25zPzoge1xuICAgICAgcmVhZG9ubHkgbG9vcFRvPzogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgcmV0cnk/OiBSZXRyeVBvbGljeTtcbiAgICAgIHJlYWRvbmx5IHRvdWNoZXM/OiBTdGFnZVRvdWNoZXM7XG4gICAgICByZWFkb25seSB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgfSxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgeyBub2RlLCBzcGVjIH0gPSB0aGlzLmN1cnNvci5mdW5jdGlvbkJyYW5jaChpZCwgbmFtZSwgZm4sIGRlc2NyaXB0aW9uLCBvcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucz8ubG9vcFRvKSB0aGlzLl9hcHBseUJyYW5jaExvb3Aobm9kZSwgc3BlYywgb3B0aW9ucy5sb29wVG8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBhdXNhYmxlIHN0YWdlIGFzIGEgZGVjaWRlciBicmFuY2guXG4gICAqXG4gICAqIFdoZW4gdGhpcyBicmFuY2ggaXMgY2hvc2VuLCB0aGUgaGFuZGxlcidzIGBleGVjdXRlYCBydW5zLiBJZiBpdCByZXR1cm5zXG4gICAqIGRhdGEsIHRoZSBwaXBlbGluZSBwYXVzZXMuIE9uIHJlc3VtZSwgYGhhbmRsZXIucmVzdW1lYCBydW5zIHdpdGggdGhlXG4gICAqIGh1bWFuJ3MgaW5wdXQuIElmIGBleGVjdXRlYCByZXR1cm5zIHZvaWQsIHRoZSBzdGFnZSBjb250aW51ZXMgbm9ybWFsbHlcbiAgICogKGNvbmRpdGlvbmFsIHBhdXNlKS5cbiAgICovXG4gIGFkZFBhdXNhYmxlRnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgLyoqIGB7IGxvb3BUbyB9YCBkZWNsYXJlcyB0aGlzIGJyYW5jaCBsb29wcyBiYWNrIHRvIGFuIGFscmVhZHktZGVjbGFyZWRcbiAgICAgKiAgc3RhZ2Ug4oCUIHRoZSBsb29wIGlzIFNPVVJDRUQgRlJPTSBUSElTIEJSQU5DSCAobm90IHRoZSBkZWNpZGVyKS5cbiAgICAgKiAgYHsgcmV0cnkgfWAgZ2l2ZXMgVEhJUyBCUkFOQ0gncyBgZXhlY3V0ZWAgaGFsZiBhIHJldHJ5IHBvbGljeSAodGhlXG4gICAgICogIGByZXN1bWVgIGhhbGYgcnVucyB3aXRob3V0IGl0IOKAlCBhIGRpZmZlcmVudCBmdW5jdGlvbiwgYSBkaWZmZXJlbnRcbiAgICAgKiAgY29udHJhY3QpOyBgeyB0YWdzIH1gIHB1dHMgZGVjbGFyZWQgdGFncyBvbiBpdC4gKi9cbiAgICBvcHRpb25zPzoge1xuICAgICAgcmVhZG9ubHkgbG9vcFRvPzogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgcmV0cnk/OiBSZXRyeVBvbGljeTtcbiAgICAgIHJlYWRvbmx5IHRvdWNoZXM/OiBTdGFnZVRvdWNoZXM7XG4gICAgICByZWFkb25seSB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgfSxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgeyBub2RlLCBzcGVjIH0gPSB0aGlzLmN1cnNvci5wYXVzYWJsZUJyYW5jaChpZCwgbmFtZSwgaGFuZGxlciwgZGVzY3JpcHRpb24sIG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zPy5sb29wVG8pIHRoaXMuX2FwcGx5QnJhbmNoTG9vcChub2RlLCBzcGVjLCBvcHRpb25zLmxvb3BUbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3Iuc3ViZmxvd0JyYW5jaChpZCwgc3ViZmxvdywgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIHRoaXMuY3Vyc29yLmxhenlTdWJmbG93QnJhbmNoKGlkLCByZXNvbHZlciwgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEJyYW5jaExpc3QoXG4gICAgYnJhbmNoZXM6IEFycmF5PHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICB9PixcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiB9IG9mIGJyYW5jaGVzKSB7XG4gICAgICB0aGlzLmFkZEZ1bmN0aW9uQnJhbmNoKGlkLCBuYW1lLCBmbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGVmYXVsdChpZDogc3RyaW5nKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3IuYXNzZXJ0T3Blbihgc2V0RGVmYXVsdCgnJHtpZH0nKWApO1xuICAgIHRoaXMuZGVmYXVsdElkID0gaWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGEgbG9vcC1iYWNrIGVkZ2UgdG8gdGhlIExBU1QtYWRkZWQgYnJhbmNoLCBzbyB0aGUgbG9vcCBpcyBzb3VyY2VkXG4gICAqIGZyb20gVEhBVCBicmFuY2ggbm9kZSAoZS5nLiBgJ3Rvb2wtY2FsbHMnIOKGkiBsb29wVG8oJ2NvbnRleHQnKWApIHJhdGhlciB0aGFuXG4gICAqIGZyb20gdGhlIGRlY2lkZXIuIFRoZSBjaGFydCB0aGVuIHJlYWRzIGhvbmVzdGx5OiB0aGUgZGVjaWRlciBzcGxpdHMgaW50byBhXG4gICAqIGxvb3BpbmcgYnJhbmNoIGBbVG9vbENhbGxzIOKGkiBiYWNrIHRvIENvbnRleHRdYCBhbmQgYSB0ZXJtaW5hdGluZyBicmFuY2hcbiAgICogYFtGaW5hbCDihpIgZW5kXWAsIGluc3RlYWQgb2YgYSBzaW5nbGUgbG9vcCBoYW5naW5nIG9mZiB0aGUgZGVjaWRlci5cbiAgICpcbiAgICogTm8gZW5naW5lIGNoYW5nZSBpcyBuZWVkZWQ6IHRoZSBydW50aW1lIHJ1bnMgdGhlIGNob3NlbiBicmFuY2ggYW5kIHRoZW5cbiAgICogZm9sbG93cyB0aGF0IGJyYW5jaCBub2RlJ3MgT1dOIGBuZXh0YCDigJQgYW5kIGEgYG5leHRgIGZsYWdnZWQgYGlzTG9vcFJlZmBcbiAgICogcm91dGVzIGJhY2sgdG8gdGhlIHRhcmdldCBleGFjdGx5IGxpa2UgdGhlIGRlY2lkZXIncyBvd24gbG9vcCBkb2VzLiBUaGlzXG4gICAqIG1ldGhvZCBqdXN0IGxldHMgdGhlIGJ1aWxkZXIgZXhwcmVzcyB3aGF0IHRoZSBlbmdpbmUgYWxyZWFkeSBzdXBwb3J0cy5cbiAgICpcbiAgICogVGFyZ2V0cyB0aGUgYnJhbmNoIGFkZGVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGNhbGwgKGNoYWluIGl0IHJpZ2h0IGFmdGVyXG4gICAqIHRoZSBicmFuY2gncyBgYWRkRnVuY3Rpb25CcmFuY2hgL2BhZGRQYXVzYWJsZUZ1bmN0aW9uQnJhbmNoYC9cbiAgICogYGFkZFN1YkZsb3dDaGFydEJyYW5jaGApLiBNaXJyb3JzIGBGbG93Q2hhcnRCdWlsZGVyLmxvb3BUb2AgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogV29ya3Mgb24gYSBTVUJGTE9XIGJyYW5jaCB0b286IHRoZSBicmFuY2ggbm9kZSBjYXJyaWVzIGJvdGggaXRzIHN1YmZsb3dcbiAgICogcmVzb2x2ZXIgQU5EIHRoZSBsb29wLWJhY2sgYG5leHRgIOKAlCB0aGV5IGNvZXhpc3Qgc2FmZWx5ICh0aGUgcnVudGltZSBydW5zXG4gICAqIHRoZSBzdWJmbG93LCB0aGVuIGZvbGxvd3MgdGhlIGxvb3AgcmVmKS4gVGhlIHRhcmdldCBtdXN0IGJlIGEgc3RhZ2UgYWxyZWFkeVxuICAgKiBkZWNsYXJlZCBCRUZPUkUgdGhlIGRlY2lkZXIgKGUuZy4gYW4gdXBzdHJlYW0gYGNvbnRleHRgKTsgYnJhbmNoIGlkcyBhbmQgdGhlXG4gICAqIHN5bnRoZXRpYyBgJ2RlZmF1bHQnYCBjbG9uZSBhcmUgTk9UIHZhbGlkIGxvb3AgdGFyZ2V0cy5cbiAgICovXG4gIGxvb3BUbyhzdGFnZUlkOiBzdHJpbmcpOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICB0aGlzLmN1cnNvci5hc3NlcnRPcGVuKGBsb29wVG8oJyR7c3RhZ2VJZH0nKWApO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jdXJzb3IuY3VyTm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBzcGVjQ2hpbGRyZW4gPSB0aGlzLmN1cnNvci5jdXJTcGVjLmNoaWxkcmVuO1xuICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8ICFzcGVjQ2hpbGRyZW4gfHwgc3BlY0NoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZmFpbChgbG9vcFRvKCcke3N0YWdlSWR9JykgY2FsbGVkIGJlZm9yZSBhbnkgYnJhbmNoIHdhcyBhZGRlZCB1bmRlciAnJHt0aGlzLmN1cnNvci5jdXJOb2RlLm5hbWV9J2ApO1xuICAgIH1cbiAgICAvLyBmYWlsKCkgdGhyb3dzLCBzbyBjaGlsZHJlbi9zcGVjQ2hpbGRyZW4gYXJlIG5vbi1lbXB0eSBoZXJlLlxuICAgIHRoaXMuX2FwcGx5QnJhbmNoTG9vcChjaGlsZHJlbiFbY2hpbGRyZW4hLmxlbmd0aCAtIDFdISwgc3BlY0NoaWxkcmVuIVtzcGVjQ2hpbGRyZW4hLmxlbmd0aCAtIDFdISwgc3RhZ2VJZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVjb3JhdGUgT05FIGJyYW5jaCBub2RlL3NwZWMgd2l0aCBhIGxvb3AtYmFjayBlZGdlIHRvIGBzdGFnZUlkYC4gU2hhcmVkIGJ5XG4gICAqIHRoZSBwb3NpdGlvbmFsIGBsb29wVG8oKWAgKHdoaWNoIHRhcmdldHMgdGhlIGxhc3QtYWRkZWQgYnJhbmNoKSBBTkQgdGhlXG4gICAqIHBlci1icmFuY2ggYHsgbG9vcFRvIH1gIG9wdGlvbiBvbiBgYWRkRnVuY3Rpb25CcmFuY2hgIC9cbiAgICogYGFkZFBhdXNhYmxlRnVuY3Rpb25CcmFuY2hgIC8gYGFkZFN1YkZsb3dDaGFydEJyYW5jaGAuIEVpdGhlciB3YXkgdGhlIGxvb3BcbiAgICogU09VUkNFIGlzIHRoZSBicmFuY2gg4oCUIHNvIHZpc3VhbGl6ZXJzIHJlYWQgYHRvb2wtY2FsbHMg4oaSIGNvbnRleHRgLCBuZXZlclxuICAgKiBgUm91dGUg4oaSIGNvbnRleHRgLiBWYWxpZGF0ZXMgdGhlIHRhcmdldCBpcyBhIHN0YWdlIGRlY2xhcmVkIEJFRk9SRSB0aGVcbiAgICogZGVjaWRlciAoYnJhbmNoIGlkcyAvIHRoZSBzeW50aGV0aWMgJ2RlZmF1bHQnIGNsb25lIGFyZSBub3QgdmFsaWQgdGFyZ2V0cykuXG4gICAqL1xuICBwcml2YXRlIF9hcHBseUJyYW5jaExvb3AoXG4gICAgYnJhbmNoTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgYnJhbmNoU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKGJyYW5jaFNwZWMubG9vcFRhcmdldCkgZmFpbChgbG9vcFRvIGFscmVhZHkgZGVmaW5lZCBvbiBicmFuY2ggJyR7YnJhbmNoU3BlYy5pZH0nYCk7XG4gICAgaWYgKGJyYW5jaE5vZGUubmV4dCkge1xuICAgICAgZmFpbChgY2Fubm90IHNldCBsb29wVG8gb24gYnJhbmNoICcke2JyYW5jaFNwZWMuaWR9JyDigJQgaXQgYWxyZWFkeSBoYXMgYSBjb250aW51YXRpb25gKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmN1cnNvci5iLl9rbm93blN0YWdlSWRzSGFzKHN0YWdlSWQpKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgbG9vcFRvKCcke3N0YWdlSWR9JykgdGFyZ2V0IG5vdCBmb3VuZCDigJQgYSBicmFuY2ggbG9vcCBtdXN0IHRhcmdldCBhIHN0YWdlIGAgK1xuICAgICAgICAgIFwiZGVjbGFyZWQgQkVGT1JFIHRoZSBkZWNpZGVyIChicmFuY2ggaWRzIGFuZCB0aGUgc3ludGhldGljICdkZWZhdWx0JyBicmFuY2ggXCIgK1xuICAgICAgICAgICdhcmUgbm90IHZhbGlkIGxvb3AgdGFyZ2V0czsgZGlkIHlvdSBwYXNzIGEgc3RhZ2UgbmFtZSBpbnN0ZWFkIG9mIGFuIGlkPyknLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBicmFuY2hOb2RlLm5leHQgPSB7IG5hbWU6IHN0YWdlSWQsIGlkOiBzdGFnZUlkLCBpc0xvb3BSZWY6IHRydWUgfTtcbiAgICBicmFuY2hTcGVjLmxvb3BUYXJnZXQgPSBzdGFnZUlkO1xuICAgIGJyYW5jaFNwZWMubmV4dCA9IHsgbmFtZTogc3RhZ2VJZCwgaWQ6IHN0YWdlSWQsIHR5cGU6ICdsb29wJywgaXNMb29wUmVmZXJlbmNlOiB0cnVlIH07XG5cbiAgICAvLyBCcmFuY2gtc2NvcGVkIGRlc2NyaXB0aW9uIOKAlCBhdHRyaWJ1dGUgdGhlIGxvb3AgdG8gdGhlIGJyYW5jaCwgbm90IHRoZVxuICAgIC8vIGRlY2lkZXIgKHBhcmVudERlc2NyaXB0aW9uUGFydHMgaXMgdGhlIGRlY2lkZXIncyBkZXNjcmlwdGlvbiBjb250ZXh0KS5cbiAgICB0aGlzLmN1cnNvci5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgIOKGkiBicmFuY2ggJyR7YnJhbmNoU3BlYy5pZH0nIGxvb3BzIGJhY2sgdG8gJHtzdGFnZUlkfWApO1xuXG4gICAgLy8gRmlyZSB0aGUgbG9vcCBiYWNrLWVkZ2UgU09VUkNFRCBGUk9NIFRIRSBCUkFOQ0ggc28gdmlzdWFsaXplcnMgcmVhZFxuICAgIC8vIGB0b29sLWNhbGxzIOKGkiBjb250ZXh0YCwgbm90IGBSb3V0ZSDihpIgY29udGV4dGAuXG4gICAgdGhpcy5jdXJzb3IuYi5fZmlyZUxvb3BFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcihicmFuY2hTcGVjLmlkLCBzdGFnZUlkKTtcbiAgfVxuXG4gIGVuZCgpOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB0aGlzLmN1cnNvci5maW5pc2godGhpcy5kZWZhdWx0SWQpO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU2VsZWN0b3JGbkxpc3QgKHNjb3BlLWJhc2VkIHNlbGVjdG9yIOKAlCBtaXJyb3JzIERlY2lkZXJMaXN0KVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RvckZuTGlzdDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJzb3I6IEJyYW5jaEN1cnNvcjxUT3V0LCBUU2NvcGU+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1aWxkZXI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPixcbiAgICBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10gPSBbXSxcbiAgICBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKSxcbiAgICByZXNlcnZlZFN0ZXBOdW1iZXIgPSAwLFxuICAgIHNlbGVjdG9yRGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge1xuICAgIHRoaXMuY3Vyc29yID0gbmV3IEJyYW5jaEN1cnNvcihcbiAgICAgICdzZWxlY3RvcicsXG4gICAgICBidWlsZGVyLFxuICAgICAgY3VyTm9kZSxcbiAgICAgIGN1clNwZWMsXG4gICAgICBwYXJlbnREZXNjcmlwdGlvblBhcnRzLFxuICAgICAgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICByZXNlcnZlZFN0ZXBOdW1iZXIsXG4gICAgICBzZWxlY3RvckRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICBhZGRGdW5jdGlvbkJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICAvKiogYHsgcmV0cnkgfWAgZ2l2ZXMgVEhJUyBCUkFOQ0gncyBzdGFnZSBhIGRlY2xhcmF0aXZlIHJldHJ5IHBvbGljeTtcbiAgICAgKiAgYHsgdGFncyB9YCBwdXRzIGRlY2xhcmVkIHRhZ3Mgb24gaXQgKHNlZSBgRmxvd0NoYXJ0QnVpbGRlci50YWdgKS4gKi9cbiAgICBvcHRpb25zPzogeyByZWFkb25seSByZXRyeT86IFJldHJ5UG9saWN5OyByZWFkb25seSB0b3VjaGVzPzogU3RhZ2VUb3VjaGVzOyByZWFkb25seSB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3IuZnVuY3Rpb25CcmFuY2goaWQsIG5hbWUsIGZuLCBkZXNjcmlwdGlvbiwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcGF1c2FibGUgc3RhZ2UgYXMgYSBzZWxlY3RvciBicmFuY2guXG4gICAqXG4gICAqIFdoZW4gdGhpcyBicmFuY2ggaXMgc2VsZWN0ZWQsIHRoZSBoYW5kbGVyJ3MgYGV4ZWN1dGVgIHJ1bnMuIElmIGl0IHJldHVybnNcbiAgICogZGF0YSwgdGhlIHBpcGVsaW5lIHBhdXNlcy4gT24gcmVzdW1lLCBgaGFuZGxlci5yZXN1bWVgIHJ1bnMgd2l0aCB0aGVcbiAgICogaHVtYW4ncyBpbnB1dC4gSWYgYGV4ZWN1dGVgIHJldHVybnMgdm9pZCwgdGhlIHN0YWdlIGNvbnRpbnVlcyBub3JtYWxseS5cbiAgICovXG4gIGFkZFBhdXNhYmxlRnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgLyoqIGB7IHJldHJ5IH1gIGdpdmVzIFRISVMgQlJBTkNIJ3MgYGV4ZWN1dGVgIGhhbGYgYSByZXRyeSBwb2xpY3kgKHRoZVxuICAgICAqICBgcmVzdW1lYCBoYWxmIHJ1bnMgd2l0aG91dCBpdCDigJQgYSBkaWZmZXJlbnQgZnVuY3Rpb24sIGEgZGlmZmVyZW50XG4gICAgICogIGNvbnRyYWN0KTsgYHsgdGFncyB9YCBwdXRzIGRlY2xhcmVkIHRhZ3Mgb24gaXQuICovXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgcmV0cnk/OiBSZXRyeVBvbGljeTsgcmVhZG9ubHkgdG91Y2hlcz86IFN0YWdlVG91Y2hlczsgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIHRoaXMuY3Vyc29yLnBhdXNhYmxlQnJhbmNoKGlkLCBuYW1lLCBoYW5kbGVyLCBkZXNjcmlwdGlvbiwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5jdXJzb3Iuc3ViZmxvd0JyYW5jaChpZCwgc3ViZmxvdywgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnRCcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIHRoaXMuY3Vyc29yLmxhenlTdWJmbG93QnJhbmNoKGlkLCByZXNvbHZlciwgbW91bnROYW1lLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEJyYW5jaExpc3QoXG4gICAgYnJhbmNoZXM6IEFycmF5PHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmbj86IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICB9PixcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiB9IG9mIGJyYW5jaGVzKSB7XG4gICAgICB0aGlzLmFkZEZ1bmN0aW9uQnJhbmNoKGlkLCBuYW1lLCBmbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZW5kKCk6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3Vyc29yLmZpbmlzaCgpO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRmxvd0NoYXJ0QnVpbGRlclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIF9yb290PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgX3Jvb3RTcGVjPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBwcml2YXRlIF9jdXJzb3I/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSBfY3Vyc29yU3BlYz86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgcHJpdmF0ZSBfc3RhZ2VNYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PigpO1xuICBfc3ViZmxvd0RlZnMgPSBuZXcgTWFwPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PigpO1xuICBwcml2YXRlIF9zdHJlYW1IYW5kbGVyczogU3RyZWFtSGFuZGxlcnMgPSB7fTtcbiAgLyoqXG4gICAqIEw3LjMg4oCUIEJ1aWxkLXRpbWUgb2JzZXJ2ZXIgZmFuLW91dC4gT3duZWQgYnkgdGhlIGJ1aWxkZXIgc28gZXZlcnlcbiAgICogYGFkZFgoKWAgbWV0aG9kIGNhbiBmaXJlIGBTdHJ1Y3R1cmVSZWNvcmRlcmAgZXZlbnRzIGF0IHRoZSBuYXR1cmFsXG4gICAqIG1vbWVudCBvZiB0aGUgY29ycmVzcG9uZGluZyBtdXRhdGlvbi4gRGlzcGF0Y2hlciBpcyBhbGxvY2F0ZWRcbiAgICogbGF6aWx5IG9uIGZpcnN0IGF0dGFjaCB0byBrZWVwIHRoZSB6ZXJvLXJlY29yZGVyIHBhdGggYWxsb2NhdGlvbi1cbiAgICogZnJlZS5cbiAgICovXG4gIHByaXZhdGUgX3N0cnVjdHVyZURpc3BhdGNoZXI/OiBTdHJ1Y3R1cmVSZWNvcmRlckRpc3BhdGNoZXI7XG4gIC8qKlxuICAgKiBMNy4zIOKAlCBTZWFsZWQtYWZ0ZXItYnVpbGQgZmxhZyAoUGFuZWwgMiBwaGFzZSBpbnZhcmlhbnQpLiBGbGlwc1xuICAgKiB0byBgdHJ1ZWAgd2hlbiBgLmJ1aWxkKClgIHJldHVybnM7IHN1YnNlcXVlbnQgYGF0dGFjaFN0cnVjdHVyZVJlY29yZGVyYFxuICAgKiB0aHJvd3MuIFByZXZlbnRzIHRoZSBmb290Z3VuIHdoZXJlIGEgY29uc3VtZXIgYXR0YWNoZXMgYSByZWNvcmRlclxuICAgKiBtaWQtZXhlY3V0aW9uIGFuZCBnZXRzIHBhcnRpYWwgc3RydWN0dXJlIGRhdGEgKG1pc3NlZCBldmVyeSBldmVudFxuICAgKiBhbHJlYWR5IGZpcmVkIGR1cmluZyBjb25zdHJ1Y3Rpb24pLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VhbGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2VuYWJsZU5hcnJhdGl2ZSA9IGZhbHNlO1xuICBwcml2YXRlIF9sb2dnZXI/OiBJTG9nZ2VyO1xuICBwcml2YXRlIF9kZXNjcmlwdGlvblBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIF9zdGVwQ291bnRlciA9IDA7XG4gIC8vIE5PVEU6IGtleWVkIGJ5IHN0YWdlIG5hbWUgKGZvciBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbnMpLCB3aGlsZSBzdGFnZU1hcFxuICAvLyBhbmQga25vd25TdGFnZUlkcyB1c2UgaWQgKHN0YWJsZSBpZGVudGlmaWVyKS4gVGhlc2UgYXJlIGludGVudGlvbmFsbHkgZGlmZmVyZW50XG4gIC8vIG5hbWVzcGFjZXMg4oCUIGRlc2NyaXB0aW9ucyBhcmUgcHJlc2VudGF0aW9uYWwsIGxvb2t1cHMgYXJlIHN0cnVjdHVyYWwuXG4gIHByaXZhdGUgX3N0YWdlRGVzY3JpcHRpb25zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfc3RhZ2VTdGVwTWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBfa25vd25TdGFnZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIF9pbnB1dFNjaGVtYT86IHVua25vd247XG4gIHByaXZhdGUgX291dHB1dFNjaGVtYT86IHVua25vd247XG4gIHByaXZhdGUgX291dHB1dE1hcHBlcj86IChmaW5hbFNjb3BlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdW5rbm93bjtcbiAgcHJpdmF0ZSBfc2NvcGVGYWN0b3J5PzogU2NvcGVGYWN0b3J5PFRTY29wZT47XG5cbiAgLy8g4pSA4pSAIEw3LjMg4oCUIFN0cnVjdHVyZVJlY29yZGVyIGF0dGFjaCArIGRpc3BhdGNoIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIGBTdHJ1Y3R1cmVSZWNvcmRlcmAgZm9yIGJ1aWxkLXBoYXNlIG9ic2VydmF0aW9uLiBNdWx0aXBsZVxuICAgKiByZWNvcmRlcnMgY29leGlzdCAoc2FtZSBpZCBhbGxvd2VkOyBpdGVyYXRpb24gb3JkZXIgPSBhdHRhY2hcbiAgICogb3JkZXIpLiBUaHJvd3MgaWYgY2FsbGVkIGFmdGVyIGAuYnVpbGQoKWAg4oCUIHRoZSBjaGFydCBpcyBzZWFsZWQgYXRcbiAgICogdGhhdCBwb2ludCBhbmQgYW55IHJlY29yZGVyIGF0dGFjaGVkIGxhdGUgd291bGQgbWlzcyBldmVyeSBldmVudFxuICAgKiBmaXJlZCBkdXJpbmcgY29uc3RydWN0aW9uLlxuICAgKlxuICAgKiAqKlNlZWQgcmVwbGF5Kio6IHdoZW4gdGhpcyBpcyBjYWxsZWQgQUZURVIgYHN0YXJ0KClgIGhhcyBhbHJlYWR5XG4gICAqIGZpcmVkIChpLmUuLCBhZnRlciB0aGUgYGZsb3dDaGFydCgpYCBmYWN0b3J5IHJldHVybnMpLCB0aGVcbiAgICoganVzdC1hdHRhY2hlZCByZWNvcmRlciByZWNlaXZlcyBhIG9uZS10aW1lIGBvblN0YWdlQWRkZWRgIGZvciB0aGVcbiAgICogcm9vdCBzdGFnZSBzbyBpdCBvYnNlcnZlcyB0aGUgc2VlZC4gT25seSB0aGUgbmV3IHJlY29yZGVyIHNlZXNcbiAgICogdGhlIHJlcGxheTsgYWxyZWFkeS1hdHRhY2hlZCByZWNvcmRlcnMgYXJlIG5vdCByZS1maXJlZC5cbiAgICpcbiAgICogKipNaWQtY2hhaW4gYXR0YWNoIGNhdmVhdCoqOiBhIHJlY29yZGVyIGF0dGFjaGVkIEFGVEVSIG9uZSBvciBtb3JlXG4gICAqIGBhZGRYKClgIGNhbGxzIHJlY2VpdmVzIHRoZSBzZWVkIHJlcGxheSBidXQgTUlTU0VTIGV2ZXJ5XG4gICAqIGludGVybWVkaWF0ZSBldmVudC4gQXR0YWNoIEJFRk9SRSB0aGUgZmlyc3QgYGFkZFgoKWAgZm9yIGNvbXBsZXRlXG4gICAqIGNhcHR1cmUuXG4gICAqXG4gICAqIFB1YmxpYyBmb3Igbm93IHRvIGVuYWJsZSBkaXJlY3QgYXR0YWNoIGluIHRlc3RzICsgZWFybHkgY29uc3VtZXJzLlxuICAgKiBMNy40IHdpbGwgd2lyZSBgZmxvd0NoYXJ0KC4uLiwgeyBzdHJ1Y3R1cmVSZWNvcmRlcnM6IFsuLi5dIH0pYCBhc1xuICAgKiBhbiBhZGRpdGlvbmFsIHJlZ2lzdHJhdGlvbiBzaXRlOyB0aGlzIG1ldGhvZCB3aWxsIHJlbWFpbi5cbiAgICovXG4gIGF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKHJlY29yZGVyOiBTdHJ1Y3R1cmVSZWNvcmRlcik6IHRoaXMge1xuICAgIGlmICh0aGlzLl9zZWFsZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtGbG93Q2hhcnRCdWlsZGVyXSBhdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcignJHtyZWNvcmRlci5pZH0nKSBjYWxsZWQgYWZ0ZXIgLmJ1aWxkKCkg4oCUIGNoYXJ0IGlzIHNlYWxlZDsgYCArXG4gICAgICAgICAgJ3RoZSByZWNvcmRlciB3b3VsZCBtaXNzIGV2ZXJ5IHN0cnVjdHVyZSBldmVudCBmcm9tIGNvbnN0cnVjdGlvbi4gQXR0YWNoIEJFRk9SRSAuYnVpbGQoKS4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSB7XG4gICAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyID0gbmV3IFN0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlcigpO1xuICAgIH1cbiAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLmF0dGFjaChyZWNvcmRlcik7XG4gICAgLy8gVGhlIHNlZWQgZmlyZXMgaW5zaWRlIGBzdGFydCgpYCDigJQgdGhhdCBydW5zIEJFRk9SRSB0aGUgY29uc3VtZXJcbiAgICAvLyBjYW4gcG9zdC1jb25zdHJ1Y3QgYXR0YWNoLiBSZXBsYXkgdGhlIHNlZWQgZXZlbnQgT05MWSBpbnRvIHRoZVxuICAgIC8vIGp1c3QtYXR0YWNoZWQgcmVjb3JkZXIgc28gb3RoZXIgYWxyZWFkeS1hdHRhY2hlZCByZWNvcmRlcnMgZG9uJ3RcbiAgICAvLyBzZWUgYSBkdXBsaWNhdGUuIEVycm9ycyBhcmUgcm91dGVkIHRocm91Z2ggdGhlIGRpc3BhdGNoZXInc1xuICAgIC8vIGFjY3VtdWxhdG9yIHNvIHRoZSBjb250cmFjdCBzdGF5cyB1bmlmb3JtLlxuICAgIGlmICh0aGlzLl9yb290U3BlYykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVjb3JkZXIub25TdGFnZUFkZGVkPy4oe1xuICAgICAgICAgIHN0YWdlSWQ6IHRoaXMuX3Jvb3RTcGVjLmlkLFxuICAgICAgICAgIG5hbWU6IHRoaXMuX3Jvb3RTcGVjLm5hbWUsXG4gICAgICAgICAgdHlwZTogdGhpcy5fcm9vdFNwZWMudHlwZSA/PyAnc3RhZ2UnLFxuICAgICAgICAgIC4uLih0aGlzLl9yb290U3BlYy5pc1BhdXNhYmxlID09PSB0cnVlICYmIHsgaXNQYXVzYWJsZTogdHJ1ZSB9KSxcbiAgICAgICAgICAuLi4odGhpcy5fcm9vdFNwZWMudGFncyAhPT0gdW5kZWZpbmVkICYmIHsgdGFnczogWy4uLnRoaXMuX3Jvb3RTcGVjLnRhZ3NdIH0pLFxuICAgICAgICAgIHNwZWM6IHRoaXMuX3Jvb3RTcGVjIGFzIHVua25vd24gYXMgRmxvd0NoYXJ0U3BlYyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5yZWNvcmRFcnJvckZvclJlcGxheShyZWNvcmRlci5pZCwgJ29uU3RhZ2VBZGRlZCcsIGVycik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3BlY3QgYWNjdW11bGF0ZWQgYFN0cnVjdHVyZUJ1aWxkRXJyb3Jgcy4gUmV0dXJucyBlbXB0eSBhcnJheVxuICAgKiB3aGVuIG5vIHJlY29yZGVycyBhdHRhY2hlZCBPUiBubyBlcnJvcnMgb2NjdXJyZWQuIFJldHVybnMgYVxuICAgKiBkZWZlbnNpdmUgY29weSDigJQgY2FsbGVyIG11dGF0aW9ucyBkbyBub3QgYWZmZWN0IHN1YnNlcXVlbnQgY2FsbHMuXG4gICAqXG4gICAqICoqQ2FsbCBvbiB0aGUgQlVJTERFUiwgbm90IHRoZSBjaGFydCByZXR1cm5lZCBieSBgLmJ1aWxkKClgLioqXG4gICAqIENhcHR1cmUgdGhlIGJ1aWxkZXIgcmVmZXJlbmNlIGJlZm9yZSBgLmJ1aWxkKClgIGlmIHlvdSBuZWVkXG4gICAqIHBvc3QtYnVpbGQgYWNjZXNzOlxuICAgKiBgYGB0c1xuICAgKiBjb25zdCBidWlsZGVyID0gZmxvd0NoYXJ0KC4uLikuYXR0YWNoU3RydWN0dXJlUmVjb3JkZXIocmVjKTtcbiAgICogY29uc3QgY2hhcnQgPSBidWlsZGVyLmJ1aWxkKCk7XG4gICAqIGNvbnN0IGVycm9ycyA9IGJ1aWxkZXIuZ2V0U3RydWN0dXJlQnVpbGRFcnJvcnMoKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRTdHJ1Y3R1cmVCdWlsZEVycm9ycygpOiBSZXR1cm5UeXBlPFN0cnVjdHVyZVJlY29yZGVyRGlzcGF0Y2hlclsnZ2V0RXJyb3JzJ10+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcj8uZ2V0RXJyb3JzKCkgPz8gW107XG4gIH1cblxuICAvLyBDb252ZW5pZW5jZSBmaXJlIGhlbHBlcnMg4oCUIG5vLW9wIHdoZW4gbm8gZGlzcGF0Y2hlciBhdHRhY2hlZC4gS2VlcHNcbiAgLy8gZXZlcnkgY2FsbCBzaXRlIGEgb25lLWxpbmVyIHdpdGhvdXQgdGhlIGBpZiAodGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcilgXG4gIC8vIGJvaWxlcnBsYXRlIGV2ZXJ5d2hlcmUuXG4gIHByaXZhdGUgX2ZpcmVTdGFnZUFkZGVkKHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIC8vIFJlYWQgYGlzUGF1c2FibGVgIGRpcmVjdGx5IGZyb20gdGhlIHNwZWMg4oCUIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGguXG4gICAgLy8gVGhlIHByZXZpb3VzIGBleHRyYXNgIGFyZ3VtZW50IHdhcyBhIHN1Yi1idWlsZGVyIGZvb3RndW46IGJyYW5jaFxuICAgIC8vIGhlbHBlcnMgaW4gRGVjaWRlckxpc3QvU2VsZWN0b3JGbkxpc3Qgd2VudCB0aHJvdWdoXG4gICAgLy8gYF9maXJlU3RhZ2VBZGRlZEZyb21TdWJCdWlsZGVyYCB3aGljaCBkcm9wcGVkIHRoZSBleHRyYXMsIHNpbGVudGx5XG4gICAgLy8gbG9zaW5nIGBpc1BhdXNhYmxlOiB0cnVlYCBvbiBwYXVzYWJsZSBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaGVzLlxuICAgIGNvbnN0IGlzUGF1c2FibGUgPSBzcGVjLmlzUGF1c2FibGUgPT09IHRydWU7XG4gICAgdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlci5maXJlU3RhZ2VBZGRlZCh7XG4gICAgICBzdGFnZUlkOiBzcGVjLmlkLFxuICAgICAgbmFtZTogc3BlYy5uYW1lLFxuICAgICAgdHlwZTogc3BlYy50eXBlID8/ICdzdGFnZScsXG4gICAgICAuLi4oaXNQYXVzYWJsZSAmJiB7IGlzUGF1c2FibGU6IHRydWUgfSksXG4gICAgICAuLi4oc3BlYy50YWdzICE9PSB1bmRlZmluZWQgJiYgeyB0YWdzOiBbLi4uc3BlYy50YWdzXSB9KSxcbiAgICAgIHNwZWM6IHNwZWMgYXMgdW5rbm93biBhcyBGbG93Q2hhcnRTcGVjLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZVN0YWdlVGFnZ2VkKHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlciB8fCBzcGVjLnRhZ3MgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZVN0YWdlVGFnZ2VkKHtcbiAgICAgIHN0YWdlSWQ6IHNwZWMuaWQsXG4gICAgICBuYW1lOiBzcGVjLm5hbWUsXG4gICAgICB0YWdzOiBbLi4uc3BlYy50YWdzXSxcbiAgICAgIHNwZWM6IHNwZWMgYXMgdW5rbm93biBhcyBGbG93Q2hhcnRTcGVjLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZUVkZ2VBZGRlZChmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGtpbmQ6IFN0cnVjdHVyZUVkZ2VLaW5kLCBsYWJlbD86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZUVkZ2VBZGRlZCh7XG4gICAgICBmcm9tLFxuICAgICAgdG8sXG4gICAgICBraW5kLFxuICAgICAgLi4uKGxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBsYWJlbCB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpcmVMb29wRWRnZUFkZGVkKGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZUxvb3BFZGdlQWRkZWQoeyBmcm9tLCB0byB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlIHRoZSBgbmV4dGAgZWRnZShzKSBmcm9tIGEgcGFyZW50IHNwZWMgdG8gYSBmcmVzaGx5LWFkZGVkXG4gICAqIG5vZGUg4oCUIHdpdGggY29udmVyZ2VuY2UgZXhwYW5zaW9uIHdoZW4gdGhlIHBhcmVudCBpcyBhXG4gICAqIGZvcmsgLyBkZWNpZGVyIC8gc2VsZWN0b3Igd2l0aCBicmFuY2hlcy5cbiAgICpcbiAgICogQSBmb3JrIGF0IGBwYXJlbnRgIGlzIHNlbWFudGljYWxseSBgcGFyZW50IOKUgOKUgGZvcmstYnJhbmNo4pSA4pSA4pa6IGNoaWxkW2ldYFxuICAgKiBmb3IgZWFjaCBjaGlsZCwgYW5kIHRoZSBjaGFpbmVkIGAuYWRkRnVuY3Rpb24oWClgIGNvbnRpbnVlc1xuICAgKiBBRlRFUiB0aGUgZm9yayBjb252ZXJnZXMuIFRoZSBydW50aW1lIHNlbWFudGljcyBhcmUgdGhhdCBlYWNoXG4gICAqIGNoaWxkIElOREVQRU5ERU5UTFkgZmVlZHMgYFhgIChwYXJhbGxlbCBjb21wbGV0aW9uIOKGkiBqb2luKS4gVGhlXG4gICAqIGxpdGVyYWwgXCJlZGdlIGZyb20gcGFyZW50IHRvIFhcIiB3b3VsZCBtaXNyZXByZXNlbnQgdGhpcyDigJRcbiAgICogdmlzdWFsaXplcnMgYW5kIHRvcG9sb2dpY2FsIGFsZ29yaXRobXMgd291bGQgc2VlIG9uZSBlZGdlIHdoZXJlXG4gICAqIHRoZXJlIHNob3VsZCBiZSBOIGNvbnZlcmdlbmNlIGVkZ2VzLlxuICAgKlxuICAgKiBGaXg6IHdoZW4gYHBhcmVudFNwZWNgIGhhcyBicmFuY2ggY2hpbGRyZW4gKGZvcmsgb3IgYnJhbmNoZWRcbiAgICogZGVjaWRlci9zZWxlY3RvciksIGZpcmUgb25lIGBuZXh0YCBlZGdlIGZyb20gRUFDSCBjaGlsZCB0byB0aGVcbiAgICogdGFyZ2V0LiBPdGhlcndpc2UgZmlyZSB0aGUgc2luZ2xlIGVkZ2UgZnJvbSBgcGFyZW50U3BlY2AgaXRzZWxmLlxuICAgKlxuICAgKiBMb29wLXJlZmVyZW5jZSBjaGlsZHJlbiAoc3ludGhldGljIHNwZWMgbm9kZXMgY3JlYXRlZCBieVxuICAgKiBgLmxvb3BUbygpYCkgYXJlIGV4Y2x1ZGVkIOKAlCB0aGV5J3JlIGJhY2stZWRnZSBtYXJrZXJzLCBub3RcbiAgICogY29udmVyZ2VuY2Ugc291cmNlcy4gQSBicmFuY2ggdGhhdCBjYXJyaWVzIGFuIE9XTiBsb29wLWJhY2sgYG5leHRgXG4gICAqIChhIGJyYW5jaC1zb3VyY2VkIGBsb29wVG9gKSBpcyBsaWtld2lzZSBza2lwcGVkIOKAlCBpdCBsb29wcywgaXQgZG9lc1xuICAgKiBub3QgY29udmVyZ2UgYXQgdGhlIGxpbmVhciBuZXh0IHN0YWdlLlxuICAgKlxuICAgKiBBIGJyYW5jaCBjYXJyeWluZyBgY29udmVyZ2VBdGAgaXMgUkVESVJFQ1RFRDogaXRzIHNpbmdsZSBjb252ZXJnZW5jZVxuICAgKiBlZGdlIGZpcmVzIHRvIGl0cyBuYW1lZCB0YXJnZXQgaW5zdGVhZCBvZiBgdGFyZ2V0SWRgIOKAlCBleHByZXNzaW5nIGFuXG4gICAqIHVuZXF1YWwtZGVwdGggbWVyZ2UgKGUuZy4gYHRvb2xzIOKGkiBjYWxsLWxsbWAsIGJ5cGFzc2luZyBgbWVzc2FnZS1hcGlgKS5cbiAgICogVGhlIG5hbWVkIHRhcmdldCBpcyBhIGZvcndhcmQgc3RhZ2UsIHNvIGl0IGlzIE5PVCB2YWxpZGF0ZWQgaGVyZS5cbiAgICpcbiAgICogQ2FsbCBPUkRFUiBjb25zdHJhaW50OiBtdXN0IGJlIGNhbGxlZCBCRUZPUkUgdGhlIGN1cnNvciBhZHZhbmNlc1xuICAgKiB0byB0aGUgbmV3IHRhcmdldC4gVGhlIGNhbGxlciBwYXNzZXMgdGhlIFBSRS1BRFZBTkNFIHBhcmVudCBzcGVjLlxuICAgKi9cbiAgcHJpdmF0ZSBfZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsIHRhcmdldElkOiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyKSByZXR1cm47XG4gICAgY29uc3QgY2hpbGRTcGVjcyA9IHBhcmVudFNwZWMuY2hpbGRyZW47XG4gICAgY29uc3QgaXNCcmFuY2hpbmdQYXJlbnQgPVxuICAgICAgKHBhcmVudFNwZWMudHlwZSA9PT0gJ2ZvcmsnIHx8IHBhcmVudFNwZWMudHlwZSA9PT0gJ2RlY2lkZXInIHx8IHBhcmVudFNwZWMudHlwZSA9PT0gJ3NlbGVjdG9yJykgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoY2hpbGRTcGVjcykgJiZcbiAgICAgIGNoaWxkU3BlY3MubGVuZ3RoID4gMDtcbiAgICBpZiAoIWlzQnJhbmNoaW5nUGFyZW50KSB7XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKHBhcmVudFNwZWMuaWQsIHRhcmdldElkLCAnbmV4dCcsIGxhYmVsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZFNwZWNzISkge1xuICAgICAgaWYgKGNoaWxkLmlzTG9vcFJlZmVyZW5jZSkgY29udGludWU7XG4gICAgICAvLyBBIGJyYW5jaCB3aXRoIGl0cyBvd24gbG9vcC1iYWNrIG5leHQgKGJyYW5jaC1zb3VyY2VkIGxvb3BUbykgbG9vcHMg4oCUXG4gICAgICAvLyBpdCBkb2VzIG5vdCBjb252ZXJnZSBhdCB0aGUgbGluZWFyIG5leHQgc3RhZ2UuXG4gICAgICBpZiAoY2hpbGQubmV4dD8uaXNMb29wUmVmZXJlbmNlKSBjb250aW51ZTtcbiAgICAgIGlmIChjaGlsZC5jb252ZXJnZUF0KSB7XG4gICAgICAgIC8vIFJlZGlyZWN0ZWQgY29udmVyZ2VuY2U6IHRoaXMgYnJhbmNoIHJlam9pbnMgYXQgaXRzIG5hbWVkIHRhcmdldC5cbiAgICAgICAgdGhpcy5fZmlyZUVkZ2VBZGRlZChjaGlsZC5pZCwgY2hpbGQuY29udmVyZ2VBdCwgJ25leHQnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGNoaWxkLmlkLCB0YXJnZXRJZCwgJ25leHQnLCBsYWJlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZURlY2lkZXJDb21wbGV0ZShcbiAgICBkZWNpZGVyOiBzdHJpbmcsXG4gICAgdHlwZTogJ2RlY2lkZXInIHwgJ3NlbGVjdG9yJyxcbiAgICBicmFuY2hJZHM6IHN0cmluZ1tdLFxuICAgIGRlZmF1bHRCcmFuY2g/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RydWN0dXJlRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIHRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIuZmlyZURlY2lkZXJDb21wbGV0ZSh7XG4gICAgICBkZWNpZGVyLFxuICAgICAgdHlwZSxcbiAgICAgIGJyYW5jaElkcyxcbiAgICAgIC4uLihkZWZhdWx0QnJhbmNoICE9PSB1bmRlZmluZWQgJiYgeyBkZWZhdWx0QnJhbmNoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZVN1YmZsb3dNb3VudGVkKFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHN1YmZsb3dOYW1lOiBzdHJpbmcsXG4gICAgcm9vdFN0YWdlSWQ6IHN0cmluZyxcbiAgICBpc0xhenk/OiBib29sZWFuLFxuICAgIHN1YmZsb3dTcGVjPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHN1YmZsb3dQYXRoPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N0cnVjdHVyZURpc3BhdGNoZXIpIHJldHVybjtcbiAgICAvLyBzdWJmbG93UGF0aCBkZWZhdWx0cyB0byBzdWJmbG93SWQgd2hlbiB0aGUgcmVjb3JkZXIgaXMgYXR0YWNoZWRcbiAgICAvLyB0byB0aGUgaW1tZWRpYXRlIHBhcmVudCAodG9wLWxldmVsIG1vdW50KTsgY29tcG9zZWQgcGF0aHMgYXBwbHlcbiAgICAvLyBvbmx5IHdoZW4gdGhpcyBidWlsZGVyIGlzIGl0c2VsZiBhIG5lc3RlZCBzdWJmbG93IGJlaW5nXG4gICAgLy8gb2JzZXJ2ZWQgYnkgdGhlIGdyYW5kcGFyZW50J3MgcmVjb3JkZXIuXG4gICAgY29uc3QgcGF0aCA9IHN1YmZsb3dQYXRoID8/IHN1YmZsb3dJZDtcbiAgICB0aGlzLl9zdHJ1Y3R1cmVEaXNwYXRjaGVyLmZpcmVTdWJmbG93TW91bnRlZCh7XG4gICAgICBzdWJmbG93SWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHJvb3RTdGFnZUlkLFxuICAgICAgLi4uKGlzTGF6eSA9PT0gdHJ1ZSAmJiB7IGlzTGF6eSB9KSxcbiAgICAgIC4uLihzdWJmbG93U3BlYyAhPT0gdW5kZWZpbmVkICYmIHsgc3ViZmxvd1NwZWMgfSksXG4gICAgICBzdWJmbG93UGF0aDogcGF0aCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdWItYnVpbGRlciBhY2Nlc3MgKGAuYi5fZmlyZVh4eGApIGlzIG5lZWRlZCBieSBEZWNpZGVyTGlzdCAvXG4gICAqICBTZWxlY3RvckZuTGlzdDsgZXhwb3NlIHRoZSBkaXNwYXRjaGVyIHRocm91Z2ggaW50ZXJuYWwgaGVscGVyc1xuICAgKiAgdGhhdCBnbyB0aHJvdWdoIHRoZSBzYW1lIG5vLW9wLXdoZW4tYWJzZW50IGd1YXJkLlxuICAgKlxuICAgKiAgQGludGVybmFsIOKAlCB0aGVzZSBtZXRob2RzIGFyZSBleHBvc2VkIGJlY2F1c2UgVHlwZVNjcmlwdCBgcHJpdmF0ZWBcbiAgICogIGRvZXNuJ3QgdHJhdmVyc2UgY2xhc3MgYm91bmRhcmllcy4gQ29uc3VtZXIgY29kZSBNVVNUIE5PVCBjYWxsXG4gICAqICB0aGVtOyBjYWxsaW5nIHRoZW0gcG9zdC1jb25zdHJ1Y3Rpb24gbGV0cyBhIGhvc3RpbGUgY2FsbGVyXG4gICAqICBmYWJyaWNhdGUgc3RydWN0dXJlIGV2ZW50cyBhbmQgY29ycnVwdCBkb3duc3RyZWFtIHZpc3VhbGl6YXRpb25zXG4gICAqICBvciBhdWRpdCB0cmFpbHMuIFRoZSBgX2AgcHJlZml4IGlzIGludGVudGlvbmFsIGNvbnZlbnRpb24uICovXG4gIF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXIoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBraW5kOiBTdHJ1Y3R1cmVFZGdlS2luZCwgbGFiZWw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGZyb20sIHRvLCBraW5kLCBsYWJlbCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiAqL1xuICBfZmlyZVN0YWdlQWRkZWRGcm9tU3ViQnVpbGRlcihzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlU3RhZ2VBZGRlZChzcGVjKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwg4oCUIHNlZSBgX2ZpcmVFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcmAuICovXG4gIF9maXJlRGVjaWRlckNvbXBsZXRlRnJvbVN1YkJ1aWxkZXIoXG4gICAgZGVjaWRlcjogc3RyaW5nLFxuICAgIHR5cGU6ICdkZWNpZGVyJyB8ICdzZWxlY3RvcicsXG4gICAgYnJhbmNoSWRzOiBzdHJpbmdbXSxcbiAgICBkZWZhdWx0QnJhbmNoPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlRGVjaWRlckNvbXBsZXRlKGRlY2lkZXIsIHR5cGUsIGJyYW5jaElkcywgZGVmYXVsdEJyYW5jaCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIOKAlCBzZWUgYF9maXJlRWRnZUFkZGVkRnJvbVN1YkJ1aWxkZXJgLiAqL1xuICBfZmlyZVN1YmZsb3dNb3VudGVkRnJvbVN1YkJ1aWxkZXIoXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyxcbiAgICByb290U3RhZ2VJZDogc3RyaW5nLFxuICAgIGlzTGF6eT86IGJvb2xlYW4sXG4gICAgc3ViZmxvd1NwZWM/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gICAgc3ViZmxvd1BhdGg/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChzdWJmbG93SWQsIHN1YmZsb3dOYW1lLCByb290U3RhZ2VJZCwgaXNMYXp5LCBzdWJmbG93U3BlYywgc3ViZmxvd1BhdGgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgc2VlIGBfZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyYC4gVXNlZCBieSBgRGVjaWRlckxpc3QubG9vcFRvYFxuICAgKiAgdG8gdmFsaWRhdGUgYSBicmFuY2gtc291cmNlZCBsb29wIHRhcmdldCBhZ2FpbnN0IHRoZSBrbm93biBzdGFnZSBpZHNcbiAgICogIChtaXJyb3JzIGBGbG93Q2hhcnRCdWlsZGVyLmxvb3BUb2AncyBgX2tub3duU3RhZ2VJZHMuaGFzYCBndWFyZCkuICovXG4gIF9rbm93blN0YWdlSWRzSGFzKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fa25vd25TdGFnZUlkcy5oYXMoaWQpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCDigJQgc2VlIGBfZmlyZUVkZ2VBZGRlZEZyb21TdWJCdWlsZGVyYC4gVXNlZCBieSBgRGVjaWRlckxpc3QubG9vcFRvYFxuICAgKiAgdG8gZmlyZSBhIGxvb3AgYmFjay1lZGdlIFNPVVJDRUQgRlJPTSBBIEJSQU5DSCBub2RlIChub3QgdGhlIGRlY2lkZXIpLiAqL1xuICBfZmlyZUxvb3BFZGdlQWRkZWRGcm9tU3ViQnVpbGRlcihmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9maXJlTG9vcEVkZ2VBZGRlZChmcm9tLCB0byk7XG4gIH1cblxuICAvLyDilIDilIAgRGVzY3JpcHRpb24gaGVscGVycyDilIDilIBcblxuICBwcml2YXRlIF9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgY29uc3QgbGluZSA9IGRlc2NyaXB0aW9uID8gYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiAke25hbWV9IOKAlCAke2Rlc2NyaXB0aW9ufWAgOiBgJHt0aGlzLl9zdGVwQ291bnRlcn0uICR7bmFtZX1gO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChsaW5lKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zLnNldChuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55Pik6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChpZCwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIGlmIChzdWJmbG93LmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IHN1YmZsb3cuZGVzY3JpcHRpb24uc3BsaXQoJ1xcbicpO1xuICAgICAgY29uc3Qgc3RlcHNJZHggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3RhcnRzV2l0aCgnU3RlcHM6JykpO1xuICAgICAgaWYgKHN0ZXBzSWR4ID49IDApIHtcbiAgICAgICAgLy8gQnVpbGRlci1jb21wb3NlZCBkZXNjcmlwdGlvbiAoYEZsb3dDaGFydDogWFxcblN0ZXBzOlxcbi4uLmApLlxuICAgICAgICAvLyBJbmxpbmUgT05MWSB0aGUgc3VtbWFyeSBhYm92ZSBgU3RlcHM6YCBvbiB0aGUgbW91bnQgbGluZSwgdGhlblxuICAgICAgICAvLyByZS1saXN0IHRoZSBzdGVwIGxpbmVzIG9uY2UsIGluZGVudGVkLiBFbWJlZGRpbmcgdGhlIEZVTEwgaW5uZXJcbiAgICAgICAgLy8gZGVzY3JpcHRpb24gaGVyZSBBTkQgcmUtbGlzdGluZyBpdHMgc3RlcHMgZG91YmxlZCB0aGUgdGV4dCBwZXJcbiAgICAgICAgLy8gbmVzdGluZyBsZXZlbCDigJQgZXhwb25lbnRpYWwgZ3Jvd3RoLCBSYW5nZUVycm9yIChcIkludmFsaWQgc3RyaW5nXG4gICAgICAgIC8vIGxlbmd0aFwiKSBhdCB+MjIgbmVzdGluZyBsZXZlbHMgb2YgbmVzdGVkIGJ1aWxkKCkuXG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPSBsaW5lcy5zbGljZSgwLCBzdGVwc0lkeCkuam9pbignICcpLnRyaW0oKTtcbiAgICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKFxuICAgICAgICAgIHN1bW1hcnlcbiAgICAgICAgICAgID8gYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV0g4oCUICR7c3VtbWFyeX1gXG4gICAgICAgICAgICA6IGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW1N1Yi1FeGVjdXRpb246ICR7bmFtZX1dYCxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0ZXBzSWR4ICsgMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGxpbmVzW2ldLnRyaW0oKSkgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAgICAke2xpbmVzW2ldfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGcmVlLWZvcm0gKHNpbmdsZS1ibG9jaykgZGVzY3JpcHRpb24g4oCUIGlubGluZSBpdCB3aG9sZSwgdW5jaGFuZ2VkLlxuICAgICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtuYW1lfV0g4oCUICR7c3ViZmxvdy5kZXNjcmlwdGlvbn1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW1N1Yi1FeGVjdXRpb246ICR7bmFtZX1dYCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIENvbmZpZ3VyYXRpb24g4pSA4pSAXG5cbiAgc2V0TG9nZ2VyKGxvZ2dlcjogSUxvZ2dlcik6IHRoaXMge1xuICAgIHRoaXMuX2xvZ2dlciA9IGxvZ2dlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsYXJlIHRoZSBBUEkgY29udHJhY3Qg4oCUIGlucHV0IHZhbGlkYXRpb24sIG91dHB1dCBzaGFwZSwgYW5kIG91dHB1dCBtYXBwZXIuXG4gICAqIFJlcGxhY2VzIHNldElucHV0U2NoZW1hKCkgKyBzZXRPdXRwdXRTY2hlbWEoKSArIHNldE91dHB1dE1hcHBlcigpIGluIGEgc2luZ2xlIGNhbGwuXG4gICAqXG4gICAqIElmIGEgY29udHJhY3Qgd2l0aCBpbnB1dCBzY2hlbWEgaXMgZGVjbGFyZWQsIGNoYXJ0LnJ1bigpIHZhbGlkYXRlcyBpbnB1dCBhdXRvbWF0aWNhbGx5LlxuICAgKiBDb250cmFjdCBkYXRhIGlzIHVzZWQgYnkgY2hhcnQudG9PcGVuQVBJKCkgYW5kIGNoYXJ0LnRvTUNQVG9vbCgpLlxuICAgKi9cbiAgY29udHJhY3Qob3B0czoge1xuICAgIGlucHV0PzogdW5rbm93bjtcbiAgICBvdXRwdXQ/OiB1bmtub3duO1xuICAgIG1hcHBlcj86IChmaW5hbFNjb3BlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdW5rbm93bjtcbiAgfSk6IHRoaXMge1xuICAgIGlmIChvcHRzLmlucHV0KSB0aGlzLl9pbnB1dFNjaGVtYSA9IG9wdHMuaW5wdXQ7XG4gICAgaWYgKG9wdHMub3V0cHV0KSB0aGlzLl9vdXRwdXRTY2hlbWEgPSBvcHRzLm91dHB1dDtcbiAgICBpZiAob3B0cy5tYXBwZXIpIHRoaXMuX291dHB1dE1hcHBlciA9IG9wdHMubWFwcGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIExpbmVhciBDaGFpbmluZyDilIDilIBcblxuICBzdGFydChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgcmV0cnk/OiBSZXRyeVBvbGljeTsgdG91Y2hlcz86IFN0YWdlVG91Y2hlczsgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IHRoaXMge1xuICAgIGFkbWl0SWQoJ3N0YWdlIGlkJywgaWQsICdzdGFnZScpO1xuICAgIGlmICh0aGlzLl9yb290KSBmYWlsKCdyb290IGFscmVhZHkgZGVmaW5lZDsgY3JlYXRlIGEgbmV3IGJ1aWxkZXInKTtcblxuICAgIC8vIERldGVjdCBQYXVzYWJsZUhhbmRsZXIgYnkgZHVjay10eXBpbmcgKGhhcyAuZXhlY3V0ZSBwcm9wZXJ0eSlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICBjb25zdCBpc1BhdXNhYmxlID0gdHlwZW9mIGZuID09PSAnb2JqZWN0JyAmJiBmbiAhPT0gbnVsbCAmJiAnZXhlY3V0ZScgaW4gZm47XG4gICAgY29uc3Qgc3RhZ2VGbiA9IGlzUGF1c2FibGVcbiAgICAgID8gKChmbiBhcyBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPikuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pXG4gICAgICA6IChmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbjogc3RhZ2VGbiB9O1xuICAgIGlmIChpc1BhdXNhYmxlKSB7XG4gICAgICBub2RlLmlzUGF1c2FibGUgPSB0cnVlO1xuICAgICAgbm9kZS5yZXN1bWVGbiA9IChmbiBhcyBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPikucmVzdW1lO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgc3RhZ2VGbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIGlkLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGlzUGF1c2FibGUpIHNwZWMuaXNQYXVzYWJsZSA9IHRydWU7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgYXBwbHlSZXRyeVBvbGljeShub2RlLCBzcGVjLCBvcHRpb25zPy5yZXRyeSwgYHN0YXJ0KCcke2lkfScpYCk7XG4gICAgYXBwbHlUb3VjaGVzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRvdWNoZXMsIGBzdGFydCgnJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgc3RhcnQoJyR7aWR9JylgKTtcblxuICAgIHRoaXMuX3Jvb3QgPSBub2RlO1xuICAgIHRoaXMuX3Jvb3RTcGVjID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIEw3LjMg4oCUIFNlZWQgbm9kZSBmaXJlcyBgb25TdGFnZUFkZGVkYCAobm8gZWRnZSDigJQgbm8gcHJlZGVjZXNzb3IpLlxuICAgIC8vIGBpc1BhdXNhYmxlYCBpcyByZWFkIGRpcmVjdGx5IGZyb20gdGhlIHNwZWMgYnkgYF9maXJlU3RhZ2VBZGRlZGAuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG5cbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgY2hhcnQgd2hvc2UgUk9PVCBzdGFnZSBJUyBhIHNlbGVjdG9yIOKAlCBpdCBydW5zIGZpcnN0IChyZWFkaW5nXG4gICAqIGFyZ3MsIHNlZWRpbmcgc3RhdGUsIHJldHVybmluZyB0aGUgY2hvc2VuIGJyYW5jaCBpZHMgdmlhIGBzZWxlY3QoKWApLFxuICAgKiBhbmQgaXRzIGJyYW5jaGVzIGF0dGFjaCBkaXJlY3RseSB0byB0aGUgcm9vdC4gTWlycm9ycyBgc3RhcnQoKWAgZm9yIHRoZVxuICAgKiByb290LW5vZGUgc2V0dXAsIHRoZW4gcmV0dXJucyBhIGBTZWxlY3RvckZuTGlzdGAgYm91bmQgdG8gdGhlIHJvb3Qgc29cbiAgICogYC5hZGRGdW5jdGlvbkJyYW5jaCgpYCAvIGAuYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKClgIC8gYC5lbmQoKWAgd29ya1xuICAgKiBleGFjdGx5IGFzIHRoZXkgZG8gYWZ0ZXIgYGFkZFNlbGVjdG9yRnVuY3Rpb24oKWAuXG4gICAqXG4gICAqIFVzZSB3aGVuIHRoZSBmaXJzdCB0aGluZyBhIGNoYXJ0IGRvZXMgaXMgY2hvb3NlIGFtb25nIGJyYW5jaGVzIOKAlCBlLmcuIGFcbiAgICogYENvbnRleHRgIHNlbGVjdG9yIHRoYXQgaW5pdHMgKyBwaWNrcyB3aGljaCBjb250ZXh0IHNsb3RzIHRvIGVuZ2luZWVyLFxuICAgKiB3aXRoIG5vIHNlcGFyYXRlIHNlZWQgc3RhZ2UgYmVmb3JlIGl0LlxuICAgKi9cbiAgc3RhcnRTZWxlY3RvcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFN0YWdlRnVuY3Rpb248YW55LCBUU2NvcGU+LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZmFpbEZhc3Q/OiBib29sZWFuOyByZXRyeT86IFJldHJ5UG9saWN5OyB0b3VjaGVzPzogU3RhZ2VUb3VjaGVzOyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgYWRtaXRJZCgnc3RhZ2UgaWQnLCBpZCwgJ3N0YWdlJyk7XG4gICAgaWYgKHRoaXMuX3Jvb3QpIGZhaWwoJ3Jvb3QgYWxyZWFkeSBkZWZpbmVkOyBjcmVhdGUgYSBuZXcgYnVpbGRlcicpO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbjogZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgLy8gU2VlIGBhZGRTZWxlY3RvckZ1bmN0aW9uYCDigJQgYGZhaWxGYXN0OiB0cnVlYCBtYWtlcyBhIG11bHRpLWJyYW5jaFxuICAgIC8vIHNlbGVjdGlvbiBmYW4gb3V0IHZpYSBgUHJvbWlzZS5hbGxgIChmaXJzdCBlcnJvciBhYm9ydHMpIGluc3RlYWQgb2YgdGhlXG4gICAgLy8gZGVmYXVsdCBgUHJvbWlzZS5hbGxTZXR0bGVkYCAoYmVzdC1lZmZvcnQpLlxuICAgIGlmIChvcHRpb25zPy5mYWlsRmFzdCkgbm9kZS5mYWlsRmFzdCA9IHRydWU7XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIGlkLCB0eXBlOiAnc3RhZ2UnLCBoYXNTZWxlY3RvcjogdHJ1ZSB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGFwcGx5UmV0cnlQb2xpY3kobm9kZSwgc3BlYywgb3B0aW9ucz8ucmV0cnksIGBzdGFydFNlbGVjdG9yKCcke2lkfScpYCk7XG4gICAgYXBwbHlUb3VjaGVzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRvdWNoZXMsIGBzdGFydFNlbGVjdG9yKCcke2lkfScpYCk7XG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBzdGFydFNlbGVjdG9yKCcke2lkfScpYCk7XG5cbiAgICB0aGlzLl9yb290ID0gbm9kZTtcbiAgICB0aGlzLl9yb290U3BlYyA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBSb290IHNlbGVjdG9yIG5vZGUgZmlyZXMgb25TdGFnZUFkZGVkIHdpdGggTk8gcHJlZGVjZXNzb3IgZWRnZSAoaXQnc1xuICAgIC8vIHRoZSByb290KS4gQnJhbmNoZXMgKyBvbkRlY2lkZXJDb21wbGV0ZSBjb21lIGZyb20gdGhlIFNlbGVjdG9yRm5MaXN0LlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24pO1xuXG4gICAgcmV0dXJuIG5ldyBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+KFxuICAgICAgdGhpcyxcbiAgICAgIG5vZGUsXG4gICAgICBzcGVjLFxuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cyxcbiAgICAgIHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zLFxuICAgICAgdGhpcy5fc3RlcENvdW50ZXIsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICApO1xuICB9XG5cbiAgYWRkRnVuY3Rpb24obmFtZTogc3RyaW5nLCBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LCBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHRoaXMge1xuICAgIGFkbWl0SWQoJ3N0YWdlIGlkJywgaWQsICdzdGFnZScpO1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICAvLyBDYXB0dXJlIHRoZSBwYXJlbnQgU1BFQyByZWZlcmVuY2UgKG5vdCBqdXN0IGlkKSBCRUZPUkUgdGhlXG4gICAgLy8gY3Vyc29yIGFkdmFuY2VzIOKAlCB3ZSBuZWVkIGl0cyBgY2hpbGRyZW5gICsgYHR5cGVgIHRvIGRlY2lkZVxuICAgIC8vIHdoZXRoZXIgdGhlIGBuZXh0YCBlZGdlIGlzIGEgZm9yayBjb252ZXJnZW5jZSAoTiBlZGdlcyBmcm9tXG4gICAgLy8gZWFjaCBicmFuY2ggY2hpbGQpIHZzIGEgcGxhaW4gbGluZWFyIGNoYWluICgxIGVkZ2UgZnJvbSBwYXJlbnQpLlxuICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbiB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBmbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIGlkLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG5cbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKHNwZWMpO1xuICAgIHRoaXMuX2tub3duU3RhZ2VJZHMuYWRkKGlkKTtcblxuICAgIC8vIEw3LjMg4oCUIExpbmVhciBub2RlOiBhbm5vdW5jZSB0aGUgbm9kZSBmaXJzdCwgdGhlbiB0aGUgZWRnZVxuICAgIC8vIGZyb20gdGhlIHByaW9yIGN1cnNvci4gT3JkZXIgbWF0dGVyczogZW5kcG9pbnRzIGFubm91bmNlZFxuICAgIC8vIGJlZm9yZSBhbnkgZWRnZSByZWZlcmVuY2luZyB0aGVtIChTdHJ1Y3R1cmVSZWNvcmRlciBjb250cmFjdCkuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG5cbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIENvbXBvc2UgYSBrZXllZCBvdXRzaWRlIG9wZXJhdGlvbiwgcmVjb25jaWxpYXRpb24sIHNoYXJlZCByZXRyeSBkZWNpc2lvbiBhbmQgd2FpdCBhcyBvcmRpbmFyeSBjaGFydCBub2Rlcy4gKi9cbiAgYWRkUmV0cnlMb29wPFRWYWx1ZSA9IHVua25vd24+KGlkOiBzdHJpbmcsIG9wdGlvbnM6IFJldHJ5TG9vcE9wdGlvbnM8VFNjb3BlLCBUVmFsdWU+KTogdGhpcyB7XG4gICAgdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGZvciAoY29uc3Qgc3RhZ2VJZCBvZiBbaWQsIGAke2lkfS1yZWNvbmNpbGVgLCBgJHtpZH0tZGVjaWRlYCwgYCR7aWR9LXJldHJ5YCwgYCR7aWR9LWRvbmVgLCBgJHtpZH0tc3RvcGBdKSB7XG4gICAgICBhZG1pdElkKCdyZXRyeSBsb29wIHN0YWdlIGlkJywgc3RhZ2VJZCwgJ3N0YWdlJyk7XG4gICAgICBpZiAodGhpcy5faWRUYWtlbihzdGFnZUlkKSkgZmFpbChgcmV0cnkgbG9vcCBzdGFnZSBpZCAnJHtzdGFnZUlkfScgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgYXBwZW5kUmV0cnlMb29wKHRoaXMsIGlkLCBvcHRpb25zLCAoYnVkZ2V0LCBicmFuY2gpID0+IHtcbiAgICAgIGNvbnN0IGN1cnNvciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICAgIGNvbnN0IG5vZGUgPSBicmFuY2ggPT09IHVuZGVmaW5lZCA/IGN1cnNvciA6IGN1cnNvci5jaGlsZHJlbj8uZmluZCgoY2hpbGQpID0+IGNoaWxkLmlkID09PSBicmFuY2gpO1xuICAgICAgY29uc3Qgc3BlYyA9XG4gICAgICAgIGJyYW5jaCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpXG4gICAgICAgICAgOiB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpLmNoaWxkcmVuPy5maW5kKChjaGlsZCkgPT4gY2hpbGQuaWQgPT09IGJyYW5jaCk7XG4gICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkIHx8IHNwZWMgPT09IHVuZGVmaW5lZCkgZmFpbCgncmV0cnkgbG9vcCBidWRnZXQgbm9kZSBtaXNzaW5nJyk7XG4gICAgICBkZWNsYXJlUmV0cnlMb29wQnVkZ2V0KG5vZGUhLCBidWRnZXQpO1xuICAgICAgaWYgKGJ1ZGdldC50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCkgc3BlYyEudGltZW91dE1zID0gYnVkZ2V0LnRpbWVvdXRNcztcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFN0cmVhbWluZ0Z1bmN0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3RyZWFtSWQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICk6IHRoaXMge1xuICAgIGFkbWl0SWQoJ3N0YWdlIGlkJywgaWQsICdzdGFnZScpO1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGlkLFxuICAgICAgZm4sXG4gICAgICBpc1N0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHN0cmVhbUlkOiBzdHJlYW1JZCA/PyBuYW1lLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBpZCxcbiAgICAgIHR5cGU6ICdzdHJlYW1pbmcnLFxuICAgICAgaXNTdHJlYW1pbmc6IHRydWUsXG4gICAgICBzdHJlYW1JZDogc3RyZWFtSWQgPz8gbmFtZSxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBTdHJlYW1pbmcgc3RhZ2U6IHNhbWUgc2hhcGUgYXMgbGluZWFyIGFkZEZ1bmN0aW9uLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fYXBwZW5kRGVzY3JpcHRpb25MaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXVzYWJsZSBzdGFnZSDigJQgY2FuIHBhdXNlIGV4ZWN1dGlvbiBhbmQgcmVzdW1lIGxhdGVyIHdpdGggaW5wdXQuXG4gICAqXG4gICAqIFRoZSBoYW5kbGVyIGhhcyB0d28gcGhhc2VzOlxuICAgKiAtIGBleGVjdXRlYDogcnVucyBmaXJzdCB0aW1lLiBSZXR1cm4gYW55IG5vbi12b2lkIHZhbHVlIHRvIHBhdXNlIChpdCBiZWNvbWVzXG4gICAqICAgdGhlIGNoZWNrcG9pbnQncyBgcGF1c2VEYXRhYCk7IHJldHVybiB2b2lkL3VuZGVmaW5lZCB0byBjb250aW51ZSBub3JtYWxseS5cbiAgICogLSBgcmVzdW1lYDogcnVucyB3aGVuIHRoZSBmbG93Y2hhcnQgaXMgcmVzdW1lZCB3aXRoIGlucHV0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC5hZGRQYXVzYWJsZUZ1bmN0aW9uKCdBcHByb3ZlT3JkZXInLCB7XG4gICAqICAgZXhlY3V0ZTogYXN5bmMgKHNjb3BlKSA9PiB7XG4gICAqICAgICBzY29wZS5vcmRlcklkID0gJzEyMyc7XG4gICAqICAgICByZXR1cm4geyBxdWVzdGlvbjogJ0FwcHJvdmU/JyB9O1xuICAgKiAgIH0sXG4gICAqICAgcmVzdW1lOiBhc3luYyAoc2NvcGUsIGlucHV0KSA9PiB7XG4gICAqICAgICBzY29wZS5hcHByb3ZlZCA9IGlucHV0LmFwcHJvdmVkO1xuICAgKiAgIH0sXG4gICAqIH0sICdhcHByb3ZlLW9yZGVyJywgJ01hbmFnZXIgYXBwcm92YWwgZ2F0ZScpXG4gICAqIGBgYFxuICAgKi9cbiAgYWRkUGF1c2FibGVGdW5jdGlvbihuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IFBhdXNhYmxlSGFuZGxlcjxUU2NvcGU+LCBpZDogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHRoaXMge1xuICAgIGFkbWl0SWQoJ3N0YWdlIGlkJywgaWQsICdzdGFnZScpO1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGlkLFxuICAgICAgZm46IGhhbmRsZXIuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgICBpc1BhdXNhYmxlOiB0cnVlLFxuICAgICAgcmVzdW1lRm46IGhhbmRsZXIucmVzdW1lLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5fYWRkVG9NYXAoaWQsIGhhbmRsZXIuZXhlY3V0ZSBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGlkLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlzUGF1c2FibGU6IHRydWUsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgUGF1c2FibGUgc3RhZ2U6IGBfZmlyZVN0YWdlQWRkZWRgIHJlYWRzIGBpc1BhdXNhYmxlYFxuICAgIC8vIGRpcmVjdGx5IGZyb20gYHNwZWMuaXNQYXVzYWJsZWAgKHNldCBhYm92ZSksIHNvIHZpc3VhbGlzZXJzXG4gICAgLy8gc2VlIGl0IG9uIHRoZSBldmVudCBwYXlsb2FkIHdpdGhvdXQgYSBzZXBhcmF0ZSB0aHJlYWRpbmcgYXJnLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fYXBwZW5kRGVzY3JpcHRpb25MaW5lKG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZXRhY2ggKGJ1aWxkZXItbmF0aXZlIGNvbXBvc2l0aW9uKSDilIDilIBcbiAgLy9cbiAgLy8gU3VnYXIgb3ZlciBgYWRkRnVuY3Rpb25gIHRoYXQgZ2VuZXJhdGVzIGEgc3RhZ2Ugd2hpY2ggY2FsbHNcbiAgLy8gYHNjb3BlLiRkZXRhY2hBbmRGb3JnZXQoLi4uKWAgb3IgYHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWBcbiAgLy8gYXQgcnVudGltZS4gWkVSTyBlbmdpbmUgY2hhbmdlcyDigJQgcHVyZSBjb21wb3NpdGlvbiBvdmVyIHRoZVxuICAvLyBleGlzdGluZyBzY29wZS1tZXRob2QgcHJpbWl0aXZlcy5cbiAgLy9cbiAgLy8gRm9yIGBhZGREZXRhY2hBbmRKb2luTGF0ZXJgLCB0aGUgcmV0dXJuZWQgaGFuZGxlIGlzIHN0b3JlZCBpblxuICAvLyBzaGFyZWQgc3RhdGUgdmlhIGAkc2V0VmFsdWVgICh3aGljaCBieXBhc3NlcyB0aGUgdHlwZWQtcHJveHlcbiAgLy8gdW53cmFwIHRoYXQgd291bGQgb3RoZXJ3aXNlIHN0cmlwIHRoZSBoYW5kbGUncyBjbGFzcyBtZXRob2RzKS5cbiAgLy8gRG93bnN0cmVhbSBzdGFnZXMgcmVhZCBpdCB2aWEgYHNjb3BlW29wdGlvbnMuaGFuZGxlS2V5XWAgb3JcbiAgLy8gYHNjb3BlLiRnZXRWYWx1ZShvcHRpb25zLmhhbmRsZUtleSlgIOKAlCBib3RoIHByZXNlcnZlIG1ldGhvZHNcbiAgLy8gYmVjYXVzZSB0aGUgdmFsdWUgd2FzIHN0b3JlZCByYXcuXG5cbiAgLyoqXG4gICAqIEFkZCBhIHN0YWdlIHRoYXQgZmlyZXMgYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmRcbiAgICogRElTQ0FSRFMgdGhlIGhhbmRsZS4gUHVyZSBmaXJlLWFuZC1mb3JnZXQg4oCUIHVzZWZ1bCBmb3IgdGVsZW1ldHJ5XG4gICAqIGV4cG9ydHMsIGF1ZGl0IGxvZyBzaGlwcGluZywgY2FjaGUgd2FybS11cC5cbiAgICpcbiAgICogQHBhcmFtIGlkIFN0YWJsZSBpZCBmb3IgdGhpcyBzdGFnZSAoYWxzbyB0aGUgc3RhZ2VNYXAga2V5KS5cbiAgICogQHBhcmFtIGNoaWxkIFRoZSBjaGlsZCBmbG93Y2hhcnQgdG8gZGV0YWNoLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5kcml2ZXIgVGhlIGRyaXZlciB0byBzY2hlZHVsZSBvbiAoZS5nLiBgbWljcm90YXNrQmF0Y2hEcml2ZXJgKS5cbiAgICogQHBhcmFtIG9wdGlvbnMuaW5wdXRNYXBwZXIgTWFwcyB0aGUgcGFyZW50J3Mgc2NvcGUgdG8gdGhlIGNoaWxkJ3MgaW5wdXQuXG4gICAqICAgRGVmYXVsdHMgdG8gcGFzc2luZyBgdW5kZWZpbmVkYC5cbiAgICogQHBhcmFtIG9wdGlvbnMubW91bnROYW1lIERpc3BsYXkgbmFtZTsgZGVmYXVsdHMgdG8gYGlkYC5cbiAgICogQHBhcmFtIG9wdGlvbnMuZGVzY3JpcHRpb24gU3RhZ2UgZGVzY3JpcHRpb24gZm9yIG5hcnJhdGl2ZSArIHRvb2xzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBpbXBvcnQgeyBtaWNyb3Rhc2tCYXRjaERyaXZlciB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gICAqXG4gICAqIGZsb3dDaGFydCgncHJvY2VzcycsIHByb2Nlc3NGbiwgJ3Byb2Nlc3MnKVxuICAgKiAgIC5hZGREZXRhY2hBbmRGb3JnZXQoJ3RlbGVtZXRyeScsIHRlbGVtZXRyeUNoYXJ0LCB7XG4gICAqICAgICBkcml2ZXI6IG1pY3JvdGFza0JhdGNoRHJpdmVyLFxuICAgKiAgICAgaW5wdXRNYXBwZXI6IChzY29wZSkgPT4gKHsgZXZlbnQ6ICdwcm9jZXNzZWQnLCBvcmRlcklkOiBzY29wZS5vcmRlcklkIH0pLFxuICAgKiAgIH0pXG4gICAqICAgLmFkZEZ1bmN0aW9uKCduZXh0JywgbmV4dEZuLCAnbmV4dCcpXG4gICAqICAgLmJ1aWxkKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRGV0YWNoQW5kRm9yZ2V0KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi90eXBlcy5qcycpLkZsb3dDaGFydDxhbnksIGFueT4sXG4gICAgb3B0aW9uczoge1xuICAgICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcjtcbiAgICAgIGlucHV0TWFwcGVyPzogKHNjb3BlOiBUU2NvcGUpID0+IHVua25vd247XG4gICAgICBtb3VudE5hbWU/OiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICB9LFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBuYW1lID0gb3B0aW9ucy5tb3VudE5hbWUgPz8gaWQ7XG4gICAgcmV0dXJuIHRoaXMuYWRkRnVuY3Rpb24oXG4gICAgICBuYW1lLFxuICAgICAgKChzY29wZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gb3B0aW9ucy5pbnB1dE1hcHBlciA/IG9wdGlvbnMuaW5wdXRNYXBwZXIoc2NvcGUgYXMgVFNjb3BlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgc2NvcGUuJGRldGFjaEFuZEZvcmdldChvcHRpb25zLmRyaXZlciwgY2hpbGQsIGlucHV0KTtcbiAgICAgIH0pIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICAgIGlkLFxuICAgICAgb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHN0YWdlIHRoYXQgZmlyZXMgYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmRcbiAgICogZGVsaXZlcnMgdGhlIHJlc3VsdGluZyBgRGV0YWNoSGFuZGxlYCB0byBhIGNvbnN1bWVyLXN1cHBsaWVkXG4gICAqIGBvbkhhbmRsZWAgY2FsbGJhY2suIFRoZSBoYW5kbGUgQ0FOTk9UIGJlIHN0b3JlZCBpbiBzaGFyZWQgc3RhdGVcbiAgICog4oCUIGBTdGFnZUNvbnRleHQuc2V0VmFsdWVgIGNhbGxzIGBzdHJ1Y3R1cmVkQ2xvbmVgIHdoaWNoIGRyb3BzXG4gICAqIGNsYXNzIHByb3RvdHlwZXMgKGFuZCB0aGVyZWZvcmUgdGhlIGhhbmRsZSdzIGAud2FpdCgpYCBtZXRob2QpLlxuICAgKlxuICAgKiBUaGUgY2FsbGJhY2sgcGF0dGVybiBpcyB0aGUgZXhwbGljaXQgYWx0ZXJuYXRpdmU6IGtlZXAgaGFuZGxlcyBpblxuICAgKiBhIGNsb3N1cmUtbG9jYWwgYXJyYXkgKG9yIHdoYXRldmVyIHNoYXBlIHN1aXRzKSBhbmQgaGF2ZSBhXG4gICAqIGRvd25zdHJlYW0gc3RhZ2UgYGF3YWl0IFByb21pc2UuYWxsKC4uLilgIG92ZXIgdGhlbS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogaW1wb3J0IHsgbWljcm90YXNrQmF0Y2hEcml2ZXIgfSBmcm9tICdmb290cHJpbnRqcy9kZXRhY2gnO1xuICAgKiBpbXBvcnQgdHlwZSB7IERldGFjaEhhbmRsZSB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gICAqXG4gICAqIGNvbnN0IGhhbmRsZXM6IERldGFjaEhhbmRsZVtdID0gW107XG4gICAqXG4gICAqIGNvbnN0IGNoYXJ0ID0gZmxvd0NoYXJ0KCdzZWVkJywgc2VlZEZuLCAnc2VlZCcpXG4gICAqICAgLmFkZERldGFjaEFuZEpvaW5MYXRlcignZXZhbC1hJywgZXZhbENoYXJ0LCB7XG4gICAqICAgICBkcml2ZXI6IG1pY3JvdGFza0JhdGNoRHJpdmVyLFxuICAgKiAgICAgaW5wdXRNYXBwZXI6IChzY29wZSkgPT4gc2NvcGUuY29uZmlnQSxcbiAgICogICAgIG9uSGFuZGxlOiAoaCkgPT4gaGFuZGxlcy5wdXNoKGgpLFxuICAgKiAgIH0pXG4gICAqICAgLmFkZERldGFjaEFuZEpvaW5MYXRlcignZXZhbC1iJywgZXZhbENoYXJ0LCB7XG4gICAqICAgICBkcml2ZXI6IG1pY3JvdGFza0JhdGNoRHJpdmVyLFxuICAgKiAgICAgaW5wdXRNYXBwZXI6IChzY29wZSkgPT4gc2NvcGUuY29uZmlnQixcbiAgICogICAgIG9uSGFuZGxlOiAoaCkgPT4gaGFuZGxlcy5wdXNoKGgpLFxuICAgKiAgIH0pXG4gICAqICAgLmFkZEZ1bmN0aW9uKCdqb2luJywgYXN5bmMgKHNjb3BlKSA9PiB7XG4gICAqICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGwoaGFuZGxlcy5tYXAoKGgpID0+IGgud2FpdCgpKSk7XG4gICAqICAgICBzY29wZS5yZXN1bHRzID0gc2V0dGxlZDtcbiAgICogICB9LCAnam9pbicpXG4gICAqICAgLmJ1aWxkKCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBOb3RlOiBwdXR0aW5nIGBoYW5kbGVzYCBpbiBhIG1vZHVsZS1sZXZlbCBjbG9zdXJlIGlzIGZpbmUgZm9yXG4gICAqIHNpbmdsZS1ydW4gc2NyaXB0cy4gRm9yIHNlcnZlciBjb2RlIHRoYXQgcnVucyB0aGUgc2FtZSBjaGFydFxuICAgKiBjb25jdXJyZW50bHkgYWNyb3NzIHJlcXVlc3RzLCBhbGxvY2F0ZSBhIG5ldyBjbG9zdXJlIHBlciBydW5cbiAgICogKGUuZy4sIHdyYXAgY2hhcnQgY29uc3RydWN0aW9uIGluIGEgZmFjdG9yeSBmdW5jdGlvbikgc28gaGFuZGxlc1xuICAgKiBmcm9tIGRpZmZlcmVudCBydW5zIGRvbid0IGJsZWVkIGludG8gZWFjaCBvdGhlci5cbiAgICovXG4gIGFkZERldGFjaEFuZEpvaW5MYXRlcihcbiAgICBpZDogc3RyaW5nLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4vdHlwZXMuanMnKS5GbG93Q2hhcnQ8YW55LCBhbnk+LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXI7XG4gICAgICBvbkhhbmRsZTogKGhhbmRsZTogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hIYW5kbGUpID0+IHZvaWQ7XG4gICAgICBpbnB1dE1hcHBlcj86IChzY29wZTogVFNjb3BlKSA9PiB1bmtub3duO1xuICAgICAgbW91bnROYW1lPzogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgfSxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgbmFtZSA9IG9wdGlvbnMubW91bnROYW1lID8/IGlkO1xuICAgIHJldHVybiB0aGlzLmFkZEZ1bmN0aW9uKFxuICAgICAgbmFtZSxcbiAgICAgICgoc2NvcGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IG9wdGlvbnMuaW5wdXRNYXBwZXIgPyBvcHRpb25zLmlucHV0TWFwcGVyKHNjb3BlIGFzIFRTY29wZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIob3B0aW9ucy5kcml2ZXIsIGNoaWxkLCBpbnB1dCk7XG4gICAgICAgIG9wdGlvbnMub25IYW5kbGUoaGFuZGxlKTtcbiAgICAgIH0pIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICAgIGlkLFxuICAgICAgb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICApO1xuICB9XG5cbiAgLy8g4pSA4pSAIEJyYW5jaGluZyDilIDilIBcblxuICBhZGREZWNpZGVyRnVuY3Rpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyByZXRyeSB9YCBnaXZlcyB0aGUgREVDSURFUiBTVEFHRSBhIHJldHJ5IHBvbGljeS4gRGVjbGFyZWQgaGVyZSByYXRoZXJcbiAgICAgKiAgdGhhbiB2aWEgYC5yZXRyeSgpYCBiZWNhdXNlIHRoaXMgbWV0aG9kIHJldHVybnMgYSBgRGVjaWRlckxpc3RgLCB3aGVyZSBhXG4gICAgICogIGNoYWluZWQgbW9kaWZpZXIgY291bGQgbWVhbiB0aGUgZGVjaWRlciBPUiB0aGUgYnJhbmNoIGp1c3QgYWRkZWQ7XG4gICAgICogIGB7IHRhZ3MgfWAgbGlrZXdpc2UuICovXG4gICAgb3B0aW9ucz86IHsgcmV0cnk/OiBSZXRyeVBvbGljeTsgdG91Y2hlcz86IFN0YWdlVG91Y2hlczsgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdIH0sXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGFkbWl0SWQoJ3N0YWdlIGlkJywgaWQsICdzdGFnZScpO1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBwYXJlbnRTcGVjID0gY3VyU3BlYztcblxuICAgIC8vIE5vIGRpc3BhdGNoZXIgZ3VhcmQgb24gYGN1cmA6IGFmdGVyIGAuZW5kKClgIHRoZSBjdXJzb3IgSVMgdGhlIGNsb3NlZFxuICAgIC8vIGRlY2lkZXIvc2VsZWN0b3IsIGFuZCB0aGlzIGRlY2lkZXIgaXMgYSBORVcgbm9kZSBhdCBpdHMgYG5leHRgIChhIGNoYWluXG4gICAgLy8gb2YgZGlzcGF0Y2hlcnMpLiBSZS1vcGVuaW5nIHRoZSBTQU1FIGRpc3BhdGNoZXIgaXMgYEJyYW5jaEN1cnNvciDCtyBhc3NlcnRPcGVuYCdzIHJlZnVzYWwuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbiB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2FkZFRvTWFwKGlkLCBmbik7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIGlkLCB0eXBlOiAnc3RhZ2UnLCBoYXNEZWNpZGVyOiB0cnVlIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgYXBwbHlSZXRyeVBvbGljeShub2RlLCBzcGVjLCBvcHRpb25zPy5yZXRyeSwgYGFkZERlY2lkZXJGdW5jdGlvbignJHtpZH0nKWApO1xuICAgIGFwcGx5VG91Y2hlcyhub2RlLCBzcGVjLCBvcHRpb25zPy50b3VjaGVzLCBgYWRkRGVjaWRlckZ1bmN0aW9uKCcke2lkfScpYCk7XG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGREZWNpZGVyRnVuY3Rpb24oJyR7aWR9JylgKTtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgLy8gTDcuMyDigJQgRGVjaWRlciBub2RlIGlzIHJlYWNoZWQgdmlhIGEgYG5leHRgIGVkZ2UgZnJvbSB0aGUgcHJpb3JcbiAgICAvLyBjdXJzb3IuIEJyYW5jaGVzIHRoZW1zZWx2ZXMgZmlyZSB2aWEgYGFkZEZ1bmN0aW9uQnJhbmNoYCBldGMuXG4gICAgLy8gYG9uRGVjaWRlckNvbXBsZXRlYCBmaXJlcyBmcm9tIHN1Yi1idWlsZGVyIGAuZW5kKClgLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcblxuICAgIHJldHVybiBuZXcgRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPihcbiAgICAgIHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgc3BlYyxcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMsXG4gICAgICB0aGlzLl9zdGFnZURlc2NyaXB0aW9ucyxcbiAgICAgIHRoaXMuX3N0ZXBDb3VudGVyLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGFkZFNlbGVjdG9yRnVuY3Rpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBTdGFnZUZ1bmN0aW9uPGFueSwgVFNjb3BlPixcbiAgICBpZDogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIC8qKiBgeyByZXRyeSB9YCBnaXZlcyB0aGUgU0VMRUNUT1IgU1RBR0UgYSByZXRyeSBwb2xpY3kg4oCUIHNhbWUgcmVhc29uaW5nIGFzXG4gICAgICogIGBhZGREZWNpZGVyRnVuY3Rpb25gOiB0aGlzIG1ldGhvZCByZXR1cm5zIGEgc3ViLWJ1aWxkZXIsIHNvIGEgY2hhaW5lZFxuICAgICAqICBgLnJldHJ5KClgIHdvdWxkIGJlIGFtYmlndW91czsgYHsgdGFncyB9YCBsaWtld2lzZS4gKi9cbiAgICBvcHRpb25zPzogeyBmYWlsRmFzdD86IGJvb2xlYW47IHJldHJ5PzogUmV0cnlQb2xpY3k7IHRvdWNoZXM/OiBTdGFnZVRvdWNoZXM7IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9LFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBhZG1pdElkKCdzdGFnZSBpZCcsIGlkLCAnc3RhZ2UnKTtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICAvLyBObyBkaXNwYXRjaGVyIGd1YXJkIG9uIGBjdXJgIOKAlCBzZWUgYGFkZERlY2lkZXJGdW5jdGlvbmAuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUsIGlkLCBmbiB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIC8vIGBmYWlsRmFzdGA6IHdoZW4gdGhlIHNlbGVjdG9yIHBpY2tzIOKJpTIgYnJhbmNoZXMgdGhleSBmYW4gb3V0IGluIHBhcmFsbGVsXG4gICAgLy8gdmlhIENoaWxkcmVuRXhlY3V0b3IuIERlZmF1bHQgPSBgUHJvbWlzZS5hbGxTZXR0bGVkYCAoYmVzdC1lZmZvcnQ6IGV2ZXJ5XG4gICAgLy8gYnJhbmNoIHJ1bnMgdG8gY29tcGxldGlvbiBldmVuIGlmIHNvbWUgZmFpbCkuIGBmYWlsRmFzdDogdHJ1ZWAgPSBgUHJvbWlzZS5hbGxgXG4gICAgLy8gKHRoZSBmaXJzdCBicmFuY2ggZXJyb3IgcmVqZWN0cyArIGFib3J0cykg4oCUIHVzZSB3aGVuIEFMTCBzZWxlY3RlZCBicmFuY2hlc1xuICAgIC8vIGFyZSBSRVFVSVJFRCAoZS5nLiBhc3NlbWJsaW5nIGEgcmVxdWVzdCBmcm9tIGluZGVwZW5kZW50LWJ1dC1yZXF1aXJlZCBwYXJ0cyksXG4gICAgLy8gbm90IGJlc3QtZWZmb3J0IGZhbi1vdXQuIFNhbWUgZmxhZyBgYWRkTGlzdE9mRnVuY3Rpb25gIGV4cG9zZXMuXG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBub2RlLmZhaWxGYXN0ID0gdHJ1ZTtcbiAgICB0aGlzLl9hZGRUb01hcChpZCwgZm4pO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCBpZCwgdHlwZTogJ3N0YWdlJywgaGFzU2VsZWN0b3I6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBhcHBseVJldHJ5UG9saWN5KG5vZGUsIHNwZWMsIG9wdGlvbnM/LnJldHJ5LCBgYWRkU2VsZWN0b3JGdW5jdGlvbignJHtpZH0nKWApO1xuICAgIGFwcGx5VG91Y2hlcyhub2RlLCBzcGVjLCBvcHRpb25zPy50b3VjaGVzLCBgYWRkU2VsZWN0b3JGdW5jdGlvbignJHtpZH0nKWApO1xuICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCBvcHRpb25zPy50YWdzLCBgYWRkU2VsZWN0b3JGdW5jdGlvbignJHtpZH0nKWApO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG5cbiAgICAvLyBMNy4zIOKAlCBTZWxlY3RvciBub2RlOiBzYW1lIGFzIGRlY2lkZXIuIEJyYW5jaGVzICsgY29tcGxldGUgZXZlbnRcbiAgICAvLyBjb21lIGZyb20gdGhlIFNlbGVjdG9yRm5MaXN0IHN1Yi1idWlsZGVyLlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcblxuICAgIHJldHVybiBuZXcgU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPihcbiAgICAgIHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgc3BlYyxcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMsXG4gICAgICB0aGlzLl9zdGFnZURlc2NyaXB0aW9ucyxcbiAgICAgIHRoaXMuX3N0ZXBDb3VudGVyLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQYXJhbGxlbCAoRm9yaykg4pSA4pSAXG5cbiAgYWRkTGlzdE9mRnVuY3Rpb24oY2hpbGRyZW46IFNpbXBsaWZpZWRQYXJhbGxlbFNwZWM8VE91dCwgVFNjb3BlPltdLCBvcHRpb25zPzogeyBmYWlsRmFzdD86IGJvb2xlYW4gfSk6IHRoaXMge1xuICAgIGNvbnN0IHsgY3VyLCBjdXJTcGVjIH0gPSB0aGlzLl9uZWVkRm9ya1BhcmVudCgpO1xuICAgIGNvbnN0IGZvcmtJZCA9IGN1ci5pZDtcblxuICAgIGN1clNwZWMudHlwZSA9ICdmb3JrJztcbiAgICBpZiAob3B0aW9ucz8uZmFpbEZhc3QpIGN1ci5mYWlsRmFzdCA9IHRydWU7XG5cbiAgICBmb3IgKGNvbnN0IHsgaWQsIG5hbWUsIGZuLCByZXRyeSwgdG91Y2hlcywgdGFncyB9IG9mIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoIWlkKSBmYWlsKGBjaGlsZCBpZCByZXF1aXJlZCB1bmRlciAnJHtjdXIubmFtZX0nYCk7XG4gICAgICBhZG1pdElkKCdmb3JrIGNoaWxkIGlkJywgaWQsICdzdGFnZScpO1xuICAgICAgaWYgKGN1ci5jaGlsZHJlbj8uc29tZSgoYykgPT4gYy5pZCA9PT0gaWQpKSB7XG4gICAgICAgIGZhaWwoYGR1cGxpY2F0ZSBjaGlsZCBpZCAnJHtpZH0nIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWU6IG5hbWUgPz8gaWQsIGlkIH07XG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgbm9kZS5mbiA9IGZuO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVnaXN0ZXJTdGFnZShpZCwgZm4pO1xuXG4gICAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICAgIG5hbWU6IG5hbWUgPz8gaWQsXG4gICAgICAgIGlkLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgICBpc1BhcmFsbGVsQ2hpbGQ6IHRydWUsXG4gICAgICAgIHBhcmFsbGVsR3JvdXBJZDogZm9ya0lkLFxuICAgICAgfTtcbiAgICAgIGFwcGx5UmV0cnlQb2xpY3kobm9kZSwgc3BlYywgcmV0cnksIGBhZGRMaXN0T2ZGdW5jdGlvbiBjaGlsZCAnJHtpZH0nYCk7XG4gICAgICBhcHBseVRvdWNoZXMobm9kZSwgc3BlYywgdG91Y2hlcywgYGFkZExpc3RPZkZ1bmN0aW9uIGNoaWxkICcke2lkfSdgKTtcbiAgICAgIGFwcGx5VGFncyhub2RlLCBzcGVjLCB0YWdzLCBgYWRkTGlzdE9mRnVuY3Rpb24gY2hpbGQgJyR7aWR9J2ApO1xuXG4gICAgICBjdXIuY2hpbGRyZW4gPSBjdXIuY2hpbGRyZW4gfHwgW107XG4gICAgICBjdXIuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgIGN1clNwZWMuY2hpbGRyZW4gPSBjdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgICAgY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgICAgLy8gTDcuMyDigJQgZmlyZSBzdHJ1Y3R1cmUgZXZlbnRzIGZvciB0aGUgY2hpbGQgKyB0aGUgZm9yayBlZGdlLlxuICAgICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGN1clNwZWMuaWQsIHNwZWMuaWQsICdmb3JrLWJyYW5jaCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkTmFtZXMgPSBjaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSB8fCBjLmlkKS5qb2luKCcsICcpO1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gUnVucyBpbiBwYXJhbGxlbDogJHtjaGlsZE5hbWVzfWApO1xuXG4gICAgdGhpcy5fY3Vyc29yVGFpbCA9IGB0aGUgcGFyYWxsZWwgY2hpbGRyZW4gKCR7Y2hpbGROYW1lc30pYDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gT05FIEJSQU5DSCBQRVIgSVRFTSwgaW4gcGFyYWxsZWwg4oCUIHdpdGggdGhlIG51bWJlciBvZiBicmFuY2hlcyBkZWNpZGVkXG4gICAqIGF0IFJVTiB0aW1lIGZyb20gdGhlIHBheWxvYWQgcmF0aGVyIHRoYW4gYXQgYnVpbGQgdGltZS5cbiAgICpcbiAgICogYGFkZExpc3RPZkZ1bmN0aW9uYCBmYW5zIG91dCBhIGZpeGVkIHNldCBvZiBicmFuY2hlcyB5b3UgbmFtZSBpbiB0aGUgY2hhcnQuXG4gICAqIFRoaXMgZmFucyBvdXQgb3ZlciBkYXRhIHRoZSBjaGFydCBoYXMgbm90IHNlZW4geWV0OiB0aHJlZSBjaHVua3MgbWFrZSB0aHJlZVxuICAgKiBicmFuY2hlcywgdGVuIG1ha2UgdGVuLiBFYWNoIGJyYW5jaCBydW5zIGFzIGl0cyBvd24gaXNvbGF0ZWQgc3ViZmxvdyDigJQgaXRzXG4gICAqIG93biBtZW1vcnksIGl0cyBvd24gY29tbWl0IGxvZywgYWRkcmVzc2FibGUgaW4gZXZlcnkgdHJhY2UgcXVlcnkgYXRcbiAgICogYDxzdGFnZUlkPn48aW5kZXg+YCDigJQgc28gYnJhbmNoZXMgY2Fubm90IGNvcnJ1cHQgZWFjaCBvdGhlcidzIGluLWZsaWdodFxuICAgKiBzdGF0ZSwgYW5kIGEgYmFja3dhcmQgc2xpY2UgdGhyb3VnaCBhIGJyYW5jaCByZXN1bHQgd29ya3Mgd2l0aCBubyBzcGVjaWFsXG4gICAqIGhhbmRsaW5nLiBEZXNpZ246IGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAgIERpc3BsYXkgbGFiZWwgZm9yIHRoZSBmYW4tb3V0IHN0YWdlLlxuICAgKiBAcGFyYW0gaWQgICAgIFN0YWJsZSBzdGFnZSBpZC4gTWF5IG5vdCBjb250YWluIGB+YCAocmVzZXJ2ZWQg4oCUIHRoZSBicmFuY2hcbiAgICogICAgICAgICAgICAgICBzZWdtZW50cyBhcmUgYnVpbHQgZnJvbSB0aGlzIGlkKS5cbiAgICogQHBhcmFtIGNvbmZpZyBgeyBpdGVtcywgYnJhbmNoLCBtYXhCcmFuY2hlcywgaW50bywgZmFpbEZhc3Q/IH1gOlxuICAgKiAgIC0gYGl0ZW1zKHNjb3BlKWAgcGlja3Mgd2hhdCB0byBmYW4gb3V0IG92ZXIgKHJlYWRzIGFyZSB0cmFja2VkKTtcbiAgICogICAtIGBicmFuY2goaXRlbSwgaW5kZXgpYCBidWlsZHMgdGhlIGNoYXJ0IGZvciBPTkUgaXRlbSAoZWFjaCBicmFuY2gnc1xuICAgKiAgICAgc2NvcGUgaXMgYWxzbyBzZWVkZWQgd2l0aCBgaXRlbWAgYW5kIGBpbmRleGAsIHNvIHRoZSBpbnB1dCBpcyBpbiB0aGVcbiAgICogICAgIHRyYWNlIHJhdGhlciB0aGFuIGhpZGRlbiBpbiBhIGNsb3N1cmUpO1xuICAgKiAgIC0gYG1heEJyYW5jaGVzYCBpcyBSRVFVSVJFRCDigJQgYW4gdW5ib3VuZGVkIGZhbi1vdXQgZHJpdmVuIGJ5IG1vZGVsIG91dHB1dFxuICAgKiAgICAgaXMgYSByZXNvdXJjZSBhdHRhY2ssIHNvIHRoZXJlIGlzIG5vIGRlZmF1bHQgdG8gZm9yZ2V0LiBFeHRyYSBpdGVtcyBkb1xuICAgKiAgICAgbm90IHJ1biBhbmQgdGhlIHRydW5jYXRpb24gaXMgcmVjb3JkZWQ7XG4gICAqICAgLSBgaW50b2AgaXMgUkVRVUlSRUQg4oCUIHRoZSBzdGF0ZSBrZXkgdGhlIG9yZGVyZWQgcmVzdWx0cyBhcnJheSBpcyB3cml0dGVuXG4gICAqICAgICB0by4gYGludG9baV1gIGlzIGJyYW5jaCBgaWAncyByZXN1bHQsIGluIElURU1TIG9yZGVyLCB3aGF0ZXZlciBvcmRlclxuICAgKiAgICAgdGhlIGJyYW5jaGVzIGZpbmlzaGVkIGluO1xuICAgKiAgIC0gYGZhaWxGYXN0YCBpcyB0aGUgc2FtZSBwb2xpY3kgdGhlIHJlc3Qgb2YgdGhlIGxpYnJhcnkncyBwYXJhbGxlbGlzbVxuICAgKiAgICAgdXNlczogYHRydWVgIHJlamVjdHMgb24gdGhlIGZpcnN0IGZhaWxpbmcgYnJhbmNoLCBvbWl0dGVkIHJ1bnMgdGhlbSBhbGxcbiAgICogICAgIGJlc3QtZWZmb3J0IChhIGZhaWxlZCBicmFuY2gncyBzbG90IGlzIGB1bmRlZmluZWRgKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZmxvd0NoYXJ0PFN0YXRlPignU3BsaXQnLCBzcGxpdEZuLCAnc3BsaXQnKVxuICAgKiAgIC5hZGRQYXJhbGxlbEZvckVhY2goJ1JldmlldyBlYWNoIGNodW5rJywgJ3Jldmlldy1jaHVua3MnLCB7XG4gICAqICAgICBpdGVtczogKHNjb3BlKSA9PiBzY29wZS5jaHVua3MsXG4gICAqICAgICBicmFuY2g6IChjaHVuaywgaSkgPT4gYnVpbGRSZXZpZXdDaGFydChjaHVuaywgaSksXG4gICAqICAgICBtYXhCcmFuY2hlczogOCxcbiAgICogICAgIGludG86ICdyZXZpZXdzJyxcbiAgICogICB9KVxuICAgKiAgIC5hZGRGdW5jdGlvbignTWVyZ2UnLCBtZXJnZUZuLCAnbWVyZ2UnKSAgIC8vIHJlYWRzIHNjb3BlLnJldmlld3NcbiAgICogICAuYnVpbGQoKTtcbiAgICogYGBgXG4gICAqL1xuICBhZGRQYXJhbGxlbEZvckVhY2g8VEl0ZW0gPSBhbnk+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuICAgIGNvbmZpZzogUGFyYWxsZWxGb3JFYWNoQ29uZmlnPFRJdGVtLCBUU2NvcGU+LFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG5cbiAgICAvLyBUaGUgZ2VuZXJhdGVkIGJyYW5jaCBzZWdtZW50cyBlbWJlZCB0aGlzIGlkIHZlcmJhdGltXG4gICAgLy8gKGA8aWQ+fjxpbmRleD5gKSwgc28gYSBtYXJrZXIgaW5zaWRlIGl0IHdvdWxkIG1ha2UgdGhlIHNlZ21lbnRcbiAgICAvLyBhbWJpZ3VvdXMgdG8gcGFyc2UuIFJlZnVzaW5nIGl0IGhlcmUg4oCUIG9uIGEgYnJhbmQtbmV3IG1ldGhvZCwgYXQgemVyb1xuICAgIC8vIGJhY2stY29tcGF0IGNvc3Qg4oCUIGtpbGxzIHRoZSBhbWJpZ3VpdHkgY2xhc3Mgb3V0cmlnaHQgYW5kIGtlZXBzXG4gICAgLy8gYHBhcnNlQnJhbmNoU2VnbWVudGAgYSBzcGxpdCBhdCB0aGUgbGFzdCBtYXJrZXIgaW5zdGVhZCBvZiBhIGhldXJpc3RpYy5cbiAgICBhZG1pdElkKCdwYXJhbGxlbEZvckVhY2ggc3RhZ2UgaWQnLCBpZCwgJ3NlZ21lbnQnKTtcbiAgICB0aGlzLl9jbGFpbUZyZXNoSWQoaWQsIGBhZGRQYXJhbGxlbEZvckVhY2goJyR7aWR9JylgKTtcbiAgICBpZiAoIWNvbmZpZyB8fCB0eXBlb2YgY29uZmlnLml0ZW1zICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBjb25maWcuYnJhbmNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmYWlsKGBhZGRQYXJhbGxlbEZvckVhY2goJyR7aWR9JykgcmVxdWlyZXMgaXRlbXMoc2NvcGUpIGFuZCBicmFuY2goaXRlbSwgaW5kZXgpIGZ1bmN0aW9ucy5gKTtcbiAgICB9XG4gICAgLy8gUkVRVUlSRUQsIGJvdGggb2YgdGhlbSDigJQgc2VlIGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kIChEMikuXG4gICAgaWYgKHR5cGVvZiBjb25maWcubWF4QnJhbmNoZXMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGNvbmZpZy5tYXhCcmFuY2hlcykgfHwgY29uZmlnLm1heEJyYW5jaGVzIDwgMSkge1xuICAgICAgZmFpbChcbiAgICAgICAgYGFkZFBhcmFsbGVsRm9yRWFjaCgnJHtpZH0nKSByZXF1aXJlcyBtYXhCcmFuY2hlcyDigJQgYSBwb3NpdGl2ZSBpbnRlZ2VyIGNlaWxpbmcgb24gaG93IG1hbnkgYCArXG4gICAgICAgICAgJ2JyYW5jaGVzIG9uZSBleGVjdXRpb24gbWF5IHN0YXJ0LiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gZGVmYXVsdDogYW4gdW5ib3VuZGVkIGZhbi1vdXQgJyArXG4gICAgICAgICAgJ2RyaXZlbiBieSBydW50aW1lIGRhdGEgKG1vZGVsIG91dHB1dCwgYW4gdXBzdHJlYW0gQVBJKSBpcyBhIHJlc291cmNlIGF0dGFjay4gUGljayB0aGUgJyArXG4gICAgICAgICAgJ2xhcmdlc3QgbnVtYmVyIHRoaXMgZmxvdyBjYW4gYWZmb3JkLiBTZWUgZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29uZmlnLmludG8gIT09ICdzdHJpbmcnIHx8IGNvbmZpZy5pbnRvID09PSAnJykge1xuICAgICAgZmFpbChcbiAgICAgICAgYGFkZFBhcmFsbGVsRm9yRWFjaCgnJHtpZH0nKSByZXF1aXJlcyBpbnRvIOKAlCB0aGUgc3RhdGUga2V5IGl0cyBvcmRlcmVkIHJlc3VsdHMgYXJyYXkgaXMgYCArXG4gICAgICAgICAgJ3dyaXR0ZW4gdG8uIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBkZWZhdWx0IGRlcml2ZWQgZnJvbSB0aGUgc3RhZ2UgaWQ6IGEgZGVyaXZlZCBrZXkgJyArXG4gICAgICAgICAgJ2NvdWxkIHNpbGVudGx5IG92ZXJ3cml0ZSBzdGF0ZSB0aGUgY2hhcnQgYWxyZWFkeSBvd25zLiBTZWUgZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWQuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lLFxuICAgICAgaWQsXG4gICAgICBpc0R5bmFtaWNQYXJhbGxlbDogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsRm9yRWFjaDogY29uZmlnIGFzIFBhcmFsbGVsRm9yRWFjaENvbmZpZzxhbnksIFRTY29wZT4sXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBpZiAoY29uZmlnLmZhaWxGYXN0ICE9PSB1bmRlZmluZWQpIG5vZGUuZmFpbEZhc3QgPSBjb25maWcuZmFpbEZhc3Q7XG5cbiAgICAvLyBgdHlwZTogJ2ZvcmsnYCDigJQgYSBmYW4tb3V0IGlzIHdoYXQgdGhpcyBpcywgYW5kIGV2ZXJ5IGV4aXN0aW5nIGNvbnN1bWVyXG4gICAgLy8gYWxyZWFkeSBrbm93cyBob3cgdG8gZHJhdyBvbmUuIFRoZSBcImJyYW5jaGVzIGFyZSBkZWNpZGVkIGF0IHJ1bnRpbWVcIlxuICAgIC8vIGRldGFpbCByaWRlcyBgaXNEeW5hbWljUGFyYWxsZWxgIHJhdGhlciB0aGFuIGEgbmV3IG5vZGUgdHlwZSwgc28gbm90aGluZ1xuICAgIC8vIGRvd25zdHJlYW0gaGFzIHRvIGxlYXJuIGEgbmV3IHdvcmQgdG8ga2VlcCB3b3JraW5nLlxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgaWQsIHR5cGU6ICdmb3JrJywgaXNEeW5hbWljUGFyYWxsZWw6IHRydWUgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChwYXJlbnRTcGVjLCBpZCk7XG5cbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24gPz8gYFJ1bnMgb25lIGJyYW5jaCBwZXIgaXRlbSBpbnRvICcke2NvbmZpZy5pbnRvfSdgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdWJmbG93IE1vdW50aW5nIOKUgOKUgFxuXG4gIGFkZFN1YkZsb3dDaGFydChpZDogc3RyaW5nLCBzdWJmbG93OiBGbG93Q2hhcnQ8YW55LCBhbnk+LCBtb3VudE5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zKTogdGhpcyB7XG4gICAgY29uc3QgeyBjdXIsIGN1clNwZWMgfSA9IHRoaXMuX25lZWRGb3JrUGFyZW50KCk7XG5cbiAgICBpZiAoY3VyLmNoaWxkcmVuPy5zb21lKChjKSA9PiBjLmlkID09PSBpZCkpIHtcbiAgICAgIGZhaWwoYGR1cGxpY2F0ZSBjaGlsZCBpZCAnJHtpZH0nIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICB9XG4gICAgYXNzZXJ0U3ViZmxvd0lkQWxsb3dlZChpZCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQ7XG4gICAgdGhpcy5fbW91bnRTdWJmbG93KGlkLCBzdWJmbG93LCAoKSA9PiB7XG4gICAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICAgIGlkLFxuICAgICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgICBzdWJmbG93TmFtZSxcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgICAgaWQsXG4gICAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgICBpc1BhcmFsbGVsQ2hpbGQ6IHRydWUsXG4gICAgICAgIHBhcmFsbGVsR3JvdXBJZDogZm9ya0lkLFxuICAgICAgICBzdWJmbG93U3RydWN0dXJlOiBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFRoZSBtb3VudCdzIE9OTFkgdGFnIHNpdGU6IHRoZSBjdXJzb3Igc3RheXMgb24gdGhlIHBhcmVudCAoc2VlXG4gICAgICAvLyBgX2N1cnNvclRhaWxgKSwgc28gYC50YWcoKWAgYWZ0ZXIgdGhpcyBjYWxsIHJlZnVzZXMuXG4gICAgICBhcHBseVRhZ3Mobm9kZSwgc3BlYywgb3B0aW9ucz8udGFncywgYGFkZFN1YkZsb3dDaGFydCgnJHtpZH0nKWApO1xuXG4gICAgICBjdXJTcGVjLnR5cGUgPSAnZm9yayc7XG4gICAgICBjdXIuY2hpbGRyZW4gPSBjdXIuY2hpbGRyZW4gfHwgW107XG4gICAgICBjdXIuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgIGN1clNwZWMuY2hpbGRyZW4gPSBjdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgICAgY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuICAgICAgLy8gTDcuMyDigJQgU3ViZmxvdyBtb3VudDogc3RhZ2UgZXZlbnQgKyBmb3JrIGVkZ2UgKyBtb3VudCBsaWZlY3ljbGVcbiAgICAgIC8vIGV2ZW50LiBNb3VudC1vbmx5IHNlbWFudGljczogcGFyZW50IHJlY29yZGVycyBkbyBOT1QgcmVwbGF5IHRoZVxuICAgICAgLy8gc3ViZmxvdydzIG93biBpbnRlcm5hbCBzdHJ1Y3R1cmUgZXZlbnRzLlxuICAgICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgICB0aGlzLl9maXJlRWRnZUFkZGVkKGN1clNwZWMuaWQsIGlkLCAnZm9yay1icmFuY2gnKTtcbiAgICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCBmYWxzZSwgc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuICAgIH0pO1xuICAgIHRoaXMuX2FwcGVuZFN1YmZsb3dEZXNjcmlwdGlvbihpZCwgc3ViZmxvd05hbWUsIHN1YmZsb3cpO1xuXG4gICAgdGhpcy5fY3Vyc29yVGFpbCA9IGB0aGUgc3ViZmxvdyBtb3VudCAnJHtzdWJmbG93TmFtZX0nYDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZExhenlTdWJGbG93Q2hhcnQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICByZXNvbHZlcjogKCkgPT4gRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCB7IGN1ciwgY3VyU3BlYyB9ID0gdGhpcy5fbmVlZEZvcmtQYXJlbnQoKTtcblxuICAgIGlmIChjdXIuY2hpbGRyZW4/LnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSkge1xuICAgICAgZmFpbChgZHVwbGljYXRlIGNoaWxkIGlkICcke2lkfScgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIH1cbiAgICBhc3NlcnRTdWJmbG93SWRBbGxvd2VkKGlkKTtcbiAgICB0aGlzLl9jbGFpbUZyZXNoSWQoaWQsIGBhZGRMYXp5U3ViRmxvd0NoYXJ0KCcke2lkfScpYCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQ7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1Jlc29sdmVyOiByZXNvbHZlciBhcyBhbnksXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgIC8vIExhenkgbW91bnQgc3R1Yi4gVGhlIGxhenkgc3ViZmxvdydzIGludGVybmFscyB3aWxsIGJlIHNoYXBlZCBhdFxuICAgIC8vIHJlc29sdXRpb24gdGltZS5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBpc1BhcmFsbGVsQ2hpbGQ6IHRydWUsXG4gICAgICBwYXJhbGxlbEdyb3VwSWQ6IGZvcmtJZCxcbiAgICAgIGlzTGF6eTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRMYXp5U3ViRmxvd0NoYXJ0KCcke2lkfScpYCk7XG5cbiAgICBjdXJTcGVjLnR5cGUgPSAnZm9yayc7XG4gICAgY3VyLmNoaWxkcmVuID0gY3VyLmNoaWxkcmVuIHx8IFtdO1xuICAgIGN1ci5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIGN1clNwZWMuY2hpbGRyZW4gPSBjdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIGN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcbiAgICAvLyBMNy4zIOKAlCBMYXp5IHN1YmZsb3cgcGFyYWxsZWwgbW91bnQuXG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZUVkZ2VBZGRlZChjdXJTcGVjLmlkLCBpZCwgJ2ZvcmstYnJhbmNoJyk7XG4gICAgdGhpcy5fZmlyZVN1YmZsb3dNb3VudGVkKGlkLCBzdWJmbG93TmFtZSwgaWQsIHRydWUpO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KGlkLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW0xhenkgU3ViLUV4ZWN1dGlvbjogJHtzdWJmbG93TmFtZX1dYCk7XG5cbiAgICB0aGlzLl9jdXJzb3JUYWlsID0gYHRoZSBsYXp5IHN1YmZsb3cgbW91bnQgJyR7c3ViZmxvd05hbWV9J2A7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRMYXp5U3ViRmxvd0NoYXJ0TmV4dChcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc29sdmVyOiAoKSA9PiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXIubmV4dCkge1xuICAgICAgZmFpbChgY2Fubm90IGFkZCBzdWJmbG93IGFzIG5leHQgd2hlbiBuZXh0IGlzIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgfVxuICAgIGFzc2VydFN1YmZsb3dJZEFsbG93ZWQoaWQpO1xuICAgIHRoaXMuX2NsYWltRnJlc2hJZChpZCwgYGFkZExhenlTdWJGbG93Q2hhcnROZXh0KCcke2lkfScpYCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93UmVzb2x2ZXI6IHJlc29sdmVyIGFzIGFueSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgLy8gTGF6eSBtb3VudCBzdHViLiBUaGUgbGF6eSBzdWJmbG93J3MgaW50ZXJuYWxzIHdpbGwgYmUgc2hhcGVkIGF0XG4gICAgLy8gcmVzb2x1dGlvbiB0aW1lLlxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIGlzTGF6eTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgYXBwbHlUYWdzKG5vZGUsIHNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRMYXp5U3ViRmxvd0NoYXJ0TmV4dCgnJHtpZH0nKWApO1xuXG4gICAgY29uc3QgcGFyZW50U3BlYyA9IGN1clNwZWM7XG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9hZHZhbmNlQ3Vyc29yU3BlYyhzcGVjKTtcbiAgICAvLyBMNy4zIOKAlCBMYXp5IGxpbmVhci1tb3VudCBzdWJmbG93LlxuICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKHNwZWMpO1xuICAgIHRoaXMuX2ZpcmVOZXh0RWRnZUZyb21QYXJlbnQocGFyZW50U3BlYywgaWQpO1xuICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCB0cnVlKTtcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChpZCwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFtMYXp5IFN1Yi1FeGVjdXRpb246ICR7c3ViZmxvd05hbWV9XWApO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdWJGbG93Q2hhcnROZXh0KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3ViZmxvdzogRmxvd0NoYXJ0PGFueSwgYW55PixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXIubmV4dCkge1xuICAgICAgZmFpbChgY2Fubm90IGFkZCBzdWJmbG93IGFzIG5leHQgd2hlbiBuZXh0IGlzIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgfVxuICAgIGFzc2VydFN1YmZsb3dJZEFsbG93ZWQoaWQpO1xuXG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBtb3VudE5hbWUgfHwgaWQ7XG4gICAgdGhpcy5fbW91bnRTdWJmbG93KGlkLCBzdWJmbG93LCAoKSA9PiB7XG4gICAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICAgIGlkLFxuICAgICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgICBzdWJmbG93TmFtZSxcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgY29uc3QgYXR0YWNoZWRTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgICBpZCxcbiAgICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgICAgc3ViZmxvd05hbWUsXG4gICAgICAgIHN1YmZsb3dTdHJ1Y3R1cmU6IHN1YmZsb3cuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgfTtcblxuICAgICAgLy8gQSBsaW5lYXIgbW91bnQgbW92ZXMgdGhlIGN1cnNvciwgc28gYC50YWcoKWAgYWZ0ZXIgaXQgYWxzbyB3b3JrcyDigJRcbiAgICAgIC8vIGBhcHBseVRhZ3NgIHJlZnVzZXMgYSBzZWNvbmQgZGVjbGFyYXRpb24gaWYgYm90aCBzaXRlcyBhcmUgdXNlZC5cbiAgICAgIGFwcGx5VGFncyhub2RlLCBhdHRhY2hlZFNwZWMsIG9wdGlvbnM/LnRhZ3MsIGBhZGRTdWJGbG93Q2hhcnROZXh0KCcke2lkfScpYCk7XG5cbiAgICAgIGNvbnN0IHBhcmVudFNwZWMgPSBjdXJTcGVjO1xuICAgICAgY3VyLm5leHQgPSBub2RlO1xuICAgICAgY3VyU3BlYy5uZXh0ID0gYXR0YWNoZWRTcGVjO1xuICAgICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICAgIHRoaXMuX2FkdmFuY2VDdXJzb3JTcGVjKGF0dGFjaGVkU3BlYyk7XG4gICAgICB0aGlzLl9rbm93blN0YWdlSWRzLmFkZChpZCk7XG4gICAgICAvLyBMNy4zIOKAlCBMaW5lYXItbW91bnQgc3ViZmxvdy5cbiAgICAgIHRoaXMuX2ZpcmVTdGFnZUFkZGVkKGF0dGFjaGVkU3BlYyk7XG4gICAgICB0aGlzLl9maXJlTmV4dEVkZ2VGcm9tUGFyZW50KHBhcmVudFNwZWMsIGlkKTtcbiAgICAgIHRoaXMuX2ZpcmVTdWJmbG93TW91bnRlZChpZCwgc3ViZmxvd05hbWUsIGlkLCBmYWxzZSwgc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuICAgIH0pO1xuICAgIHRoaXMuX2FwcGVuZFN1YmZsb3dEZXNjcmlwdGlvbihpZCwgc3ViZmxvd05hbWUsIHN1YmZsb3cpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgUmV0cnkg4pSA4pSAXG5cbiAgLyoqXG4gICAqIEdpdmUgdGhlIHN0YWdlIHlvdSBKVVNUIGFkZGVkIGEgZGVjbGFyYXRpdmUgcmV0cnkgcG9saWN5LlxuICAgKlxuICAgKiAjIyBXaHkgZGVjbGFyZSBpdCBpbnN0ZWFkIG9mIHdyaXRpbmcgYSBsb29wIGluc2lkZSB0aGUgc3RhZ2VcbiAgICpcbiAgICogQSByZXRyeSBoYW5kLXJvbGxlZCBpbnNpZGUgYSBzdGFnZSBmdW5jdGlvbiBpcyBpbnZpc2libGUgdG8gdGhlIHRyYWNlLiBUaGVcbiAgICogbmFycmF0aXZlIHNob3dzIG9uZSBzdGFnZSwgdGhlIGNvbW1pdCBsb2cgc2hvd3Mgb25lIGVudHJ5LCBhbmQgdGhlIHR3b1xuICAgKiBmYWlsZWQgY2FsbHMgdGhhdCBjYW1lIGJlZm9yZSB0aGUgc3VjY2Vzc2Z1bCBvbmUgbGVmdCBubyBtYXJrIGFueXdoZXJlIOKAlFxuICAgKiBhbiB1bmV4cGxhaW5lZCBiZWhhdmlvdXIgaW4gYSBsaWJyYXJ5IHdob3NlIHdob2xlIHBvaW50IGlzIHRoYXQgbm90aGluZ1xuICAgKiBpbnZpc2libGUgaGFwcGVucy4gRGVjbGFyZWQgaGVyZSwgZXZlcnkgYXR0ZW1wdCBpcyBwYXJ0IG9mIHRoZSByZWNvcmQ6IGVhY2hcbiAgICogYXR0ZW1wdCBmaXJlcyBgRmxvd1JlY29yZGVyLm9uQXR0ZW1wdGAgd2l0aCBpdHMgYEF0dGVtcHRSZWNvcmRgIChvdXRjb21lLFxuICAgKiBkdXJhdGlvbiwgZmFpbHVyZSBjYXRlZ29yeSwgdGhlIHJldHJ5LW9yLXN0b3AgZGVjaXNpb24pLCB3aGljaCBpcyB3aGF0XG4gICAqIGZlZWRzIHRoZSBuYXJyYXRpdmUg4oCUIG9uZSBsaW5lIHBlciBhdHRlbXB0LCBpbiBvcmRlciwgYmV0d2VlbiB0aGVcbiAgICogYXR0ZW1wdHMnIG93biByZWFkcyBhbmQgd3JpdGVzLiBUaGUgc3RhZ2UncyBleGVjdXRpb24tdHJlZSBub2RlIGtlZXBzIHRoZVxuICAgKiByZWNvcmRzIChgYXR0ZW1wdHNgLCBgYXR0ZW1wdFN1bW1hcnlgKS4gQSBmYWlsZWQgYXR0ZW1wdCB0aGF0IGlzIHJldHJpZWRcbiAgICogYWxzbyBmaXJlcyBgRmxvd1JlY29yZGVyLm9uU3RhZ2VSZXRyeWAsIHdoaWNoIHRoZSBuYXJyYXRpdmUgZG9lcyBub3QgdGVsbFxuICAgKiB0d2ljZS5cbiAgICpcbiAgICogIyMgV2hhdCBhbiBhdHRlbXB0IGlzXG4gICAqXG4gICAqIEEgZmFpbGVkIGF0dGVtcHQncyBzdGFnZWQgd3JpdGVzIGFyZSBESVNDQVJERUQg4oCUIHRoZSBuZXh0IGF0dGVtcHQgc3RhcnRzXG4gICAqIGZyb20gY29tbWl0dGVkIHN0YXRlLCBuZXZlciBmcm9tIHRoZSB3cmVja2FnZSBvZiB0aGUgbGFzdCB0cnkuIFRoZSBmaW5hbFxuICAgKiBhdHRlbXB0IGJlaGF2ZXMgZXhhY3RseSBhcyBhIHN0YWdlIHdpdGggbm8gcG9saWN5IGRvZXM6IG9uIHN1Y2Nlc3MgaXRcbiAgICogY29tbWl0czsgb24gZmFpbHVyZSBpdCBjb21taXRzIHdoYXQgaXQgd3JvdGUgYW5kIHJldGhyb3dzIChmb290cHJpbnQgaGFzXG4gICAqIG5ldmVyIGhhZCByb2xsYmFjaywgYW5kIHJldHJ5IGRvZXMgbm90IGludHJvZHVjZSBvbmUpLlxuICAgKlxuICAgKiBBIHBhdXNlIGlzIG5vdCBhIGZhaWx1cmU6IG5laXRoZXIgYGFkZFBhdXNhYmxlRnVuY3Rpb25gJ3MgcGF1c2Ugbm9yXG4gICAqIGBpbnRlcnJ1cHQoKWAgaXMgZXZlciByZXRyaWVkLiBOb3IgaXMgYSBjYW5jZWxsZWQgcnVuLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBmbG93Q2hhcnQ8U3RhdGU+KCdGZXRjaCB1c2VyJywgZmV0Y2hGbiwgJ2ZldGNoLXVzZXInKVxuICAgKiAgIC5hZGRGdW5jdGlvbignQ2hhcmdlIGNhcmQnLCBjaGFyZ2VGbiwgJ2NoYXJnZScpXG4gICAqICAgLnJldHJ5KHsgYXR0ZW1wdHM6IDMsIGJhY2tvZmZNczogKG4pID0+IDEwMCAqIDIgKiogKG4gLSAxKSB9KVxuICAgKiAgIC5hZGRGdW5jdGlvbignQ29uZmlybScsIGNvbmZpcm1GbiwgJ2NvbmZpcm0nKVxuICAgKiBgYGBcbiAgICpcbiAgICogQXBwbGllcyB0byB0aGUgQ1VSUkVOVCBjdXJzb3Ig4oCUIHRoZSBzdGFnZSBhZGRlZCBieSB0aGUgaW1tZWRpYXRlbHlcbiAgICogcHJlY2VkaW5nIGBzdGFydCgpYCAvIGBhZGRGdW5jdGlvbigpYCAvIGBhZGRTdHJlYW1pbmdGdW5jdGlvbigpYCAvXG4gICAqIGBhZGRQYXVzYWJsZUZ1bmN0aW9uKClgLiBXaGVyZSB0aGUgY3Vyc29yIHdvdWxkIGJlIGFtYmlndW91cyAoYSBkZWNpZGVyLFxuICAgKiBzZWxlY3RvciwgYnJhbmNoLCBvciBmb3JrIGNoaWxkKSwgZGVjbGFyZSB0aGUgcG9saWN5IGluIHRoYXQgbWV0aG9kJ3Mgb3duXG4gICAqIGByZXRyeWAgb3B0aW9uIGluc3RlYWQuXG4gICAqL1xuICByZXRyeShwb2xpY3k6IFJldHJ5UG9saWN5KTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgLy8gQSBzdWJmbG93IG1vdW50IC8gcGFyYWxsZWwgZm9yayBoYW5ncyBDSElMRFJFTiBvZmYgdGhlIGN1cnJlbnQgc3RhZ2UgYW5kXG4gICAgLy8gbGVhdmVzIHRoZSBjdXJzb3Igb24gdGhhdCBzdGFnZS4gQXR0YWNoaW5nIHRoZSBwb2xpY3kgdG8gdGhlIGN1cnNvciBoZXJlXG4gICAgLy8gd291bGQgc2lsZW50bHkgcmV0cnkgdGhlIHN0YWdlIEJFRk9SRSB0aGUgdGhpbmcgeW91IGp1c3Qgd3JvdGUuXG4gICAgaWYgKHRoaXMuX2N1cnNvclRhaWwpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGByZXRyeSgpIGNhbm5vdCBmb2xsb3cgJHt0aGlzLl9jdXJzb3JUYWlsfSDigJQgdGhhdCBhdHRhY2hlcyB0byAnJHtjdXIubmFtZX0nIHdpdGhvdXQgbW92aW5nIHRoZSBjdXJzb3IsIHNvIGAgK1xuICAgICAgICAgIGB0aGUgcG9saWN5IHdvdWxkIGxhbmQgb24gJyR7Y3VyLm5hbWV9JyByYXRoZXIgdGhhbiBvbiB3aGF0IHlvdSBqdXN0IGFkZGVkLiBEZWNsYXJlIHRoZSBwb2xpY3kgYXQgaXRzIG93biBgICtcbiAgICAgICAgICAnc2l0ZSBpbnN0ZWFkOiBvbiB0aGUgc3RhZ2VzIElOU0lERSBhIHN1YmZsb3cgY2hhcnQsIG9yIHZpYSB0aGUgYHJldHJ5YCBmaWVsZCBvbiBhbiBhZGRMaXN0T2ZGdW5jdGlvbiBjaGlsZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGN1ci5yZXRyeSkgZmFpbChgcmV0cnkgYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICBpZiAoY3VyLmlzU3ViZmxvd1Jvb3QpIHtcbiAgICAgIGZhaWwoXG4gICAgICAgIGByZXRyeSgpIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHRoZSBzdWJmbG93IG1vdW50ICcke2N1ci5uYW1lfScg4oCUIGEgbW91bnQgaGFzIG5vIHN0YWdlIGZ1bmN0aW9uIG9mIGl0cyBvd24uIGAgK1xuICAgICAgICAgICdEZWNsYXJlIHRoZSBwb2xpY3kgb24gdGhlIHN0YWdlcyBJTlNJREUgdGhlIHN1YmZsb3cgY2hhcnQgaW5zdGVhZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGN1ci5pc0R5bmFtaWNQYXJhbGxlbCkge1xuICAgICAgZmFpbChcbiAgICAgICAgYHJldHJ5KCkgY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIHBhcmFsbGVsLWZvci1lYWNoIHN0YWdlICcke2N1ci5uYW1lfScg4oCUIGl0IGhhcyBubyBzdGFnZSBmdW5jdGlvbiBvZiBpdHMgYCArXG4gICAgICAgICAgJ293bi4gRGVjbGFyZSB0aGUgcG9saWN5IG9uIHRoZSBzdGFnZXMgaW5zaWRlIHRoZSBicmFuY2ggY2hhcnQgaXRzIGBicmFuY2hgIGZhY3RvcnkgcmV0dXJucy4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGN1ci5pc0xvb3BSZWYpIGZhaWwoYHJldHJ5KCkgY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIGxvb3AgcmVmZXJlbmNlICcke2N1ci5uYW1lfSdgKTtcblxuICAgIGFwcGx5UmV0cnlQb2xpY3koY3VyLCBjdXJTcGVjLCBwb2xpY3ksIGByZXRyeSgpIGF0ICcke2N1ci5uYW1lfSdgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBTaWRlIGVmZmVjdHMg4pSA4pSAXG5cbiAgLyoqXG4gICAqIERlY2xhcmUgdGhhdCB0aGUgc3RhZ2UgeW91IEpVU1QgYWRkZWQgY2hhbmdlcyBhbiBvdXRzaWRlIHN5c3RlbSDigJQgYSBjaGFyZ2UsIGFuIGVtYWlsLCBhIHdyaXRlIHRvIGFub3RoZXJcbiAgICogc2VydmljZSAoMTAuMSwgZGVzaWduIMKnMy4zKSDigJQgYW5kIGdpdmUgdGhlIHJ1bGUgZm9yIGl0cyBpZGVtcG90ZW5jeSBrZXkuXG4gICAqXG4gICAqICMjIFdoeSBkZWNsYXJlIGl0XG4gICAqXG4gICAqIEEgcmV0cnkgaXMgc2FmZSBmb3IgYSByZWFkLiBGb3IgYSBjaGFyZ2UgaXQgaXMgc2FmZSBvbmx5IHdoZW4gdGhlIG91dHNpZGUgc3lzdGVtIGNhbiB0ZWxsIGEgcmV0cnkgZnJvbSBhIG5ld1xuICAgKiByZXF1ZXN0IOKAlCBieSBhbiBpZGVtcG90ZW5jeSBrZXkuIFNvIHRoZSBidWlsZGVyIHJlZnVzZXMgYSB0b3VjaGluZyBzdGFnZSB0aGF0IG1heSByZXRyeSAoYC5yZXRyeSh7IGF0dGVtcHRzID5cbiAgICogMSB9KWAsIGluIGVpdGhlciBvcmRlcikgd2l0aG91dCBhIGtleSBydWxlOiBhIGRvdWJsZSBjaGFyZ2UgbXVzdCBiZSBpbXBvc3NpYmxlIHRvIHdyaXRlIGJ5IGFjY2lkZW50LiBBIGRlZmF1bHRcbiAgICoga2V5IG1hZGUgYnkgdGhlIGxpYnJhcnkgd2FzIHJlamVjdGVkIOKAlCB0aGUgcnVuIGlkIGNoYW5nZXMgYWNyb3NzIGEgcmVzdW1lIGFuZCBhIGNhbGxlcidzIHdob2xlLXJ1biByZXRyeSwgdGhlXG4gICAqIHR3byBwbGFjZXMgYSBkb3VibGUgY2hhcmdlIGFjdHVhbGx5IGhhcHBlbnMuIFRoZSBrZXkgbXVzdCBuYW1lIHRoZSBPUEVSQVRJT046IGRlcml2ZSBpdCBmcm9tIHRoZSBpbnB1dCB0aGUgcnVsZVxuICAgKiBpcyBoYW5kZWQsIG5ldmVyIGZyb20gbW9kZWwgb3V0cHV0IChgKHsgZ2V0U3RhdGUgfSkgPT4g4oCmYCByZWFkcyBpdCBmcm9tIHN0YXRlKS4gQVxuICAgKiBrZXlsZXNzIHRvdWNoaW5nIHN0YWdlIG1heSBub3QgYGludGVycnVwdCgpYDogYSByZXN1bWUgcmUtcnVucyBpdCBmcm9tIGl0cyB0b3AuIEluIGEgY2hhcnQgdGhhdCBwYXVzZXMsIGRlcml2ZVxuICAgKiBrZXlzIGZyb20gc3RhdGUgKGAoeyBnZXRTdGF0ZSB9KSA9PiDigKZgKTogdGhlIHJ1bidzIGlucHV0IGRvZXMgbm90IGNyb3NzIGEgcmVzdW1lLlxuICAgKlxuICAgKiAjIyBXaGF0IGl0IGNoYW5nZXMgYXQgcnVuIHRpbWVcbiAgICpcbiAgICogVGhlIHN0YWdlIGFsd2F5cyBydW5zIG9uIHRoZSBhdHRlbXB0IHJ1bm5lci4gVGhlIGtleSBydWxlIHJ1bnMgT05DRSBwZXIgZXhlY3V0aW9uLCBiZWZvcmUgYXR0ZW1wdCAxLCBhbmQgZXZlcnlcbiAgICogYXR0ZW1wdCBnZXRzIHRoZSBrZXkgYXMgYHNjb3BlLiRhdHRlbXB0KCkuaWRlbXBvdGVuY3lLZXlgIOKAlCBwYXNzIGl0IHRvIHRoZSBzeXN0ZW0uIEV2ZXJ5IGF0dGVtcHQgcmVjb3JkIHNheXNcbiAgICogd2hhdCBpdCBkaWQgdGhlcmUgKGBlZmZlY3RgOiBgJ2FwcGxpZWQnYCwgYCdub25lJ2Agd2hlbiB0aGUgZXJyb3IgaXRzZWxmIGRlY2xhcmVzIGBlZmZlY3Q6ICdub25lJ2AsIGVsc2VcbiAgICogYCd1bmtub3duJ2ApLiBXaGVuIEFOWSBhdHRlbXB0IGxlZnQgdGhlIGVmZmVjdCB1bmtub3duIOKAlCBpdCB0aW1lZCBvdXQsIHdhcyBjdXQsIG9yIGZhaWxlZCB3aXRob3V0IHRoZSBhZGFwdGVyXG4gICAqIHNheWluZyBub3RoaW5nIHdhcyBzZW50IOKAlCB0aGUgc3RhZ2UgZmFpbHMgd2l0aCBgVW5rbm93bkVmZmVjdEVycm9yYDogcmVjb25jaWxlIHdpdGggdGhlIHN5c3RlbSBieSB0aGUga2V5LCBkb1xuICAgKiBub3QgcmV0cnkgYmxpbmRseS4gVGhlIHNwZWMgY2FycmllcyB0aGUgc3lzdGVtJ3MgbmFtZSAoYHRvdWNoZXNgKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZmxvd0NoYXJ0PE9yZGVyPignTG9hZCBvcmRlcicsIGxvYWRGbiwgJ2xvYWQnKVxuICAgKiAgIC5hZGRGdW5jdGlvbignQ2hhcmdlIGNhcmQnLCBjaGFyZ2VGbiwgJ2NoYXJnZScpXG4gICAqICAgLnRvdWNoZXMoJ3N0cmlwZScsIHsgaWRlbXBvdGVuY3lLZXk6ICh7IGFyZ3MgfSkgPT4gYG9yZGVyLSR7KGFyZ3MgYXMgeyBvcmRlcklkOiBzdHJpbmcgfSkub3JkZXJJZH1gIH0pXG4gICAqICAgLnJldHJ5KHsgYXR0ZW1wdHM6IDMsIHRpbWVvdXRNczogMjBfMDAwIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHRoZSBDVVJSRU5UIGN1cnNvciwgbGlrZSBgLnJldHJ5KClgOyB3aGVyZSB0aGUgY3Vyc29yIHdvdWxkIGJlIGFtYmlndW91cyAoYSBkZWNpZGVyLCBzZWxlY3RvcixcbiAgICogYnJhbmNoLCBvciBmb3JrIGNoaWxkKSwgZGVjbGFyZSBpdCBpbiB0aGF0IG1ldGhvZCdzIG93biBgdG91Y2hlc2Agb3B0aW9uLiBSZWZ1c2VkOiBvbiBhIHN1YmZsb3cgbW91bnQsIGFcbiAgICogcGFyYWxsZWwtZm9yLWVhY2ggc3RhZ2Ugb3IgYSBsb29wIHJlZmVyZW5jZSAobm8gZnVuY3Rpb24gb2YgdGhlaXIgb3duKSwgYWZ0ZXIgYSBtb3VudCBvciBhIGZvcmsgKHRoZSBjdXJzb3IgZGlkXG4gICAqIG5vdCBtb3ZlKSwgdHdpY2UsIHdpdGggYSBzeXN0ZW0gdGhhdCBpcyBub3QgYSBuYW1lLCBhbmQgd2l0aCBhIGtleSB0aGF0IGlzIG5vdCBhIGZ1bmN0aW9uLlxuICAgKi9cbiAgdG91Y2hlcyhzeXN0ZW06IHN0cmluZywgb3B0aW9ucz86IHsgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk/OiBTdGFnZVRvdWNoZXNbJ2lkZW1wb3RlbmN5S2V5J10gfSk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBpZiAodGhpcy5fY3Vyc29yVGFpbCkge1xuICAgICAgZmFpbChcbiAgICAgICAgYHRvdWNoZXMoKSBjYW5ub3QgZm9sbG93ICR7dGhpcy5fY3Vyc29yVGFpbH0g4oCUIHRoYXQgYXR0YWNoZXMgdG8gJyR7Y3VyLm5hbWV9JyB3aXRob3V0IG1vdmluZyB0aGUgY3Vyc29yLiBgICtcbiAgICAgICAgICAnRGVjbGFyZSBpdCBhdCBpdHMgb3duIHNpdGU6IG9uIHRoZSBzdGFnZXMgSU5TSURFIGEgc3ViZmxvdyBjaGFydCwgb3IgdmlhIHRoZSBgdG91Y2hlc2AgZmllbGQgb24gYW4gJyArXG4gICAgICAgICAgJ2FkZExpc3RPZkZ1bmN0aW9uIGNoaWxkLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3VyLmlzU3ViZmxvd1Jvb3QpIHtcbiAgICAgIGZhaWwoYHRvdWNoZXMoKSBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUgc3ViZmxvdyBtb3VudCAnJHtjdXIubmFtZX0nIOKAlCBkZWNsYXJlIGl0IG9uIHRoZSBzdGFnZXMgSU5TSURFIGl0LmApO1xuICAgIH1cbiAgICBpZiAoY3VyLmlzRHluYW1pY1BhcmFsbGVsKSB7XG4gICAgICBmYWlsKFxuICAgICAgICBgdG91Y2hlcygpIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHRoZSBwYXJhbGxlbC1mb3ItZWFjaCBzdGFnZSAnJHtjdXIubmFtZX0nIOKAlCBkZWNsYXJlIGl0IG9uIHRoZSBzdGFnZXMgb2YgYCArXG4gICAgICAgICAgJ3RoZSBicmFuY2ggY2hhcnQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXIuaXNMb29wUmVmKSBmYWlsKGB0b3VjaGVzKCkgY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIGxvb3AgcmVmZXJlbmNlICcke2N1ci5uYW1lfSdgKTtcbiAgICBhcHBseVRvdWNoZXMoXG4gICAgICBjdXIsXG4gICAgICBjdXJTcGVjLFxuICAgICAgeyBzeXN0ZW0sIC4uLihvcHRpb25zPy5pZGVtcG90ZW5jeUtleSAhPT0gdW5kZWZpbmVkICYmIHsgaWRlbXBvdGVuY3lLZXk6IG9wdGlvbnMuaWRlbXBvdGVuY3lLZXkgfSkgfSxcbiAgICAgIGB0b3VjaGVzKCkgYXQgJyR7Y3VyLm5hbWV9J2AsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZWNsYXJlZCB0YWdzIOKUgOKUgFxuXG4gIC8qKlxuICAgKiBQdXQgTkFNRVMgb24gdGhlIHN0YWdlIHlvdSBKVVNUIGFkZGVkLiBUaGUgZmlyc3QgY29tbWl0IGJ1bmRsZSBvZiBlYWNoXG4gICAqIGV4ZWN1dGlvbiBvZiB0aGF0IHN0YWdlIGNhcnJpZXMgdGhlbSAoYENvbW1pdEJ1bmRsZS50YWdzYCDigJQgdGhlIGJ1bmRsZVxuICAgKiBgY29tbWl0U3RvcHNgIGtleXMgb24pLCBhbmQgdGhlIGJ1aWx0IHNwZWMgYWR2ZXJ0aXNlcyB0aGVtXG4gICAqIChgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLnRhZ3NgKS5cbiAgICpcbiAgICogIyMgV2h5IGRlY2xhcmUgaXQgaW5zdGVhZCBvZiBkZXJpdmluZyBpdCBmcm9tIGlkc1xuICAgKlxuICAgKiBBIHJlYWRlciB0aGF0IHdhbnRzIFwidGhlIExMTSB0dXJuc1wiIG9mIGEgc3RvcmVkIHJlY29yZGluZyBoYWQgdG8gY2xhc3NpZnlcbiAgICogc3RhZ2VzIGZyb20gdGhlaXIgaWRzIOKAlCBhIHN3aXRjaCBvdmVyIGBydW50aW1lU3RhZ2VJZGAgdGhhdCBwYXJzZXMgYCNgIGFuZFxuICAgKiBgL2AsIGxpdmVzIGluIHRoZSBjb25zdW1lciwgYW5kIHNpbGVudGx5IGdvZXMgc3RhbGUgd2hlbiBhIHN0YWdlIGlzXG4gICAqIHJlbmFtZWQuIERlY2xhcmVkIGhlcmUsIHRoZSBuYW1lIHRyYXZlbHMgV0lUSCB0aGUgY29tbWl0OiBhIHJlY29yZGluZyBmcm9tXG4gICAqIGFueSBjaGFydCBjYXJyaWVzIGl0cyBvd24gbWlsZXN0b25lcywgYW5kIGB0YWdTdG9wc2AgKGZvb3R0cmFjZSlcbiAgICogc2NydWJzIHRoZW0gd2l0aCBubyBpZCBjb252ZW50aW9ucyBhdCBhbGwuXG4gICAqXG4gICAqICMjIFdoYXQgYSB0YWcgaXMsIGFuZCBpcyBub3RcbiAgICpcbiAgICogQSB0YWcgaXMgYSBOQU1FIGRlY2xhcmVkIGF0IGJ1aWxkIHRpbWUg4oCUIG5ldmVyIGEgdmFsdWUuIFRoZXJlIGlzIG5vXG4gICAqIHJ1bi10aW1lIGAkdGFnKClgOiBhIHJ1bnRpbWUgc3RyaW5nIGNvdWxkIGNhcnJ5IGRhdGEgKGAndXNlcjonICsgZW1haWxgKVxuICAgKiBwYXN0IGV2ZXJ5IHJlZGFjdGlvbiBwb2ludC4gRGF0YS1kZXBlbmRlbnQgbWFya3MgYXJlIGEga2VlcCBydWxlIG92ZXJcbiAgICogdGhlIGZvbGQgYXQgcmVhZCB0aW1lLCBvciB0ZWxlbWV0cnkgdmlhIGAkZW1pdGAuIEZyZWUgc3RyaW5nczogZm9vdHByaW50anNcbiAgICogb3ducyBubyB2b2NhYnVsYXJ5OyBhIGNvbnN1bWVyIGRlY2xhcmVzIGl0cyBvd24gKGAnbWlsZXN0b25lOjxraW5kPidgKS5cbiAgICpcbiAgICogU3RhbXBlZCBPTkNFIHBlciBleGVjdXRpb24gb2YgdGhlIHN0YWdlOiByZXRyeSBhdHRlbXB0cyBzaGFyZSBvbmUgc3RhbXAsXG4gICAqIGEgZmFpbGVkIHN0YWdlIGtlZXBzIGl0cyB0YWcgKHRoZSBlcnJvciBwYXRoIGNvbW1pdHMgYmVmb3JlIGl0IHJldGhyb3dzKSxcbiAgICogYSBzdGFnZSB0aGF0IGBpbnRlcnJ1cHQoKWBzIGFuZCBpcyByZXN1bWVkIGlzIHR3byB0YWdnZWQgc3RvcHMgb24gYSBjaGFpblxuICAgKiBiZWNhdXNlIGl0IHJhbiB0d2ljZSwgYW5kIGFuIEVNUFRZIGNvbW1pdCBpcyBhIHRhZ2dlZCBzdG9wIHRvby4gQSBzdWJmbG93XG4gICAqIG1vdW50IG9yIGEgcGFyYWxsZWwtZm9yLWVhY2ggc3RhZ2UgY2FuIGJlIHRhZ2dlZDsgdGhlIHRhZyBsYW5kcyBvbiB0aGVcbiAgICogYnVuZGxlIHRoYXQgcmVjb3JkcyBpdHMgcmVzdWx0IOKAlCBmb3IgYSBtb3VudCwgaXRzIEZJUlNUIGJ1bmRsZSBpbiB0aGVcbiAgICogcGFyZW50IGxvZyAodGhlIGV4aXQgYnVuZGxlIGNhcnJpZXMgbm9uZSksIHdoaWxlIHRoZSBzdWJmbG93J3Mgb3duIGxvZ1xuICAgKiBpcyB1bnRvdWNoZWQ6IGl0cyBpbm5lciBzdGFnZXMgZGVjbGFyZSB0aGVpciBvd24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGZsb3dDaGFydDxTdGF0ZT4oJ1NlZWQnLCBzZWVkRm4sICdzZWVkJylcbiAgICogICAuYWRkRnVuY3Rpb24oJ0NhbGwgbW9kZWwnLCBjYWxsRm4sICdjYWxsLWxsbScpXG4gICAqICAgLnRhZygnbWlsZXN0b25lOmxsbS10dXJuJylcbiAgICogICAuYWRkRnVuY3Rpb24oJ1JvdXRlJywgcm91dGVGbiwgJ3JvdXRlJylcbiAgICogICAudGFnKCdtaWxlc3RvbmU6ZGVjaXNpb24nLCAnYXVkaXQnKVxuICAgKiBgYGBcbiAgICpcbiAgICogQXBwbGllcyB0byB0aGUgQ1VSUkVOVCBjdXJzb3Ig4oCUIHRoZSBzdGFnZSBhZGRlZCBieSB0aGUgaW1tZWRpYXRlbHlcbiAgICogcHJlY2VkaW5nIGBzdGFydCgpYCAvIGBhZGRGdW5jdGlvbigpYCAvIGBhZGRTdHJlYW1pbmdGdW5jdGlvbigpYCAvXG4gICAqIGBhZGRQYXVzYWJsZUZ1bmN0aW9uKClgIC8gYGFkZFN1YkZsb3dDaGFydE5leHQoKWAgLyBgYWRkUGFyYWxsZWxGb3JFYWNoKClgLlxuICAgKiBXaGVyZSB0aGUgY3Vyc29yIHdvdWxkIGJlIGFtYmlndW91cyAoYSBkZWNpZGVyLCBzZWxlY3RvciwgYnJhbmNoLCBvciBmb3JrXG4gICAqIGNoaWxkKSwgZGVjbGFyZSB0aGUgdGFncyBpbiB0aGF0IG1ldGhvZCdzIG93biBgdGFnc2Agb3B0aW9uIGluc3RlYWQuIEFcbiAgICogc3ViZmxvdyBNT1VOVCBoYXMgdGhhdCBvcHRpb24gdG9vIChgU3ViZmxvd01vdW50T3B0aW9ucy50YWdzYCwgOS4yMS4xKVxuICAgKiDigJQgYW5kIGZvciBhIGZvcmstY2hpbGQgbW91bnQgKGBhZGRTdWJGbG93Q2hhcnRgKSBvciBhIGJyYW5jaCBtb3VudFxuICAgKiAoYGFkZFN1YkZsb3dDaGFydEJyYW5jaGApIGl0IGlzIHRoZSBPTkxZIHNpdGU6IHRob3NlIGxlYXZlIHRoZSBjdXJzb3Igb25cbiAgICogdGhlIHBhcmVudCwgc28gYC50YWcoKWAgYWZ0ZXIgdGhlbSByZWZ1c2VzIHJhdGhlciB0aGFuIG1pcy1hdHRyaWJ1dGUuXG4gICAqXG4gICAqIFJlZnVzZWQgYXQgYnVpbGQgdGltZTogYW4gZW1wdHkgbmFtZSwgYSBub24tc3RyaW5nLCB0aGUgcmVzZXJ2ZWRcbiAgICogYnJhbmNoLXNlZ21lbnQgbWFya2VyIGB+YCBpbnNpZGUgYSBuYW1lLCBhIG5hbWUgZGVjbGFyZWQgdHdpY2UsIGFuZCBhXG4gICAqIHNlY29uZCBkZWNsYXJhdGlvbiBvbiB0aGUgc2FtZSBzdGFnZS5cbiAgICovXG4gIHRhZyguLi5uYW1lczogcmVhZG9ubHkgc3RyaW5nW10pOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICAvLyBTYW1lIG1pcy1hdHRyaWJ1dGlvbiBndWFyZCBhcyBgLnJldHJ5KClgOiBhZnRlciBhIG1vdW50IG9yIGEgZm9yayB0aGVcbiAgICAvLyBjdXJzb3Igc3RpbGwgcG9pbnRzIGF0IHRoZSBzdGFnZSBCRUZPUkUgd2hhdCB5b3UganVzdCB3cm90ZS5cbiAgICBpZiAodGhpcy5fY3Vyc29yVGFpbCkge1xuICAgICAgZmFpbChcbiAgICAgICAgYHRhZygpIGNhbm5vdCBmb2xsb3cgJHt0aGlzLl9jdXJzb3JUYWlsfSDigJQgdGhhdCBhdHRhY2hlcyB0byAnJHtjdXIubmFtZX0nIHdpdGhvdXQgbW92aW5nIHRoZSBjdXJzb3IsIHNvIGAgK1xuICAgICAgICAgIGB0aGUgbmFtZXMgd291bGQgbGFuZCBvbiAnJHtjdXIubmFtZX0nIHJhdGhlciB0aGFuIG9uIHdoYXQgeW91IGp1c3QgYWRkZWQuIERlY2xhcmUgdGhlIHRhZ3MgYXQgdGhlaXIgb3duIGAgK1xuICAgICAgICAgIFwic2l0ZSBpbnN0ZWFkOiB2aWEgdGhlIGB0YWdzYCBmaWVsZCBpbiB0aGUgbW91bnQncyBvd24gb3B0aW9ucyAoYFN1YmZsb3dNb3VudE9wdGlvbnMudGFnc2AsIDkuMjEuMSksIG9yIFwiICtcbiAgICAgICAgICAndmlhIHRoZSBgdGFnc2AgZmllbGQgb24gYW4gYWRkTGlzdE9mRnVuY3Rpb24gY2hpbGQuIFRoZSBzdGFnZXMgSU5TSURFIGEgc3ViZmxvdyBjaGFydCBkZWNsYXJlIHRoZWlyIG93bi4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGN1ci5pc0xvb3BSZWYpIGZhaWwoYHRhZygpIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHRoZSBsb29wIHJlZmVyZW5jZSAnJHtjdXIubmFtZX0nYCk7XG4gICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkgZmFpbChgdGFnKCkgYXQgJyR7Y3VyLm5hbWV9JzogYXQgbGVhc3Qgb25lIG5hbWUgaXMgcmVxdWlyZWRgKTtcblxuICAgIGFwcGx5VGFncyhjdXIsIGN1clNwZWMsIG5hbWVzLCBgdGFnKCkgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIC8vIFRoZSBzdGFnZSdzIGBvblN0YWdlQWRkZWRgIGhhcyBhbHJlYWR5IGZpcmVkICh0aGUgZG9vciBjb21lcyBhZnRlclxuICAgIC8vIHRoZSBhZGQpLCBzbyB0aGUgbmFtZXMgZ28gb3V0IGFzIHRoZWlyIG93biBldmVudCDigJQgYSByZWNvcmRlciB0aGF0XG4gICAgLy8gY29waWVkIGZpZWxkcyBhdCBhZGQgdGltZSB3b3VsZCBvdGhlcndpc2UgbmV2ZXIgc2VlIHRoZW0gKDkuMjQuMCkuXG4gICAgdGhpcy5fZmlyZVN0YWdlVGFnZ2VkKGN1clNwZWMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRpbWUgYnVkZ2V0IOKUgOKUgFxuXG4gIC8qKlxuICAgKiBEZWNsYXJlIHRoZSBjaGFydCdzIHRpbWUgYnVkZ2V0OiB0aGUgbW9zdCBtaWxsaXNlY29uZHMgYSBjYWxsZXIgZ2l2ZXMgb25lIHJ1biAoZGVzaWduIMKnMy4yKS5cbiAgICpcbiAgICogV0hZOiB0aGUgaW5jaWRlbnQgYmVoaW5kIGl0IOKAlCBhIHN0YWdlIHJldHJpZWQgYW4gU0RLIGNhbGwgZm91ciB0aW1lcywgNDAgcyBlYWNoLCBwYXN0IGEgY2FsbGVyJ3MgMTIwIHMsIGFuZCB0aGVcbiAgICogcmVjb3JkIHNhaWQgXCJvbmUgc3RhZ2UsIG9uZSBlcnJvclwiLiBCb3RoIG51bWJlcnMgd2VyZSBkZWNsYXJlZDogdGhlIHBvbGljeSBvbiB0aGUgc3RhZ2UsIHRoZSBidWRnZXQgb2YgdGhlXG4gICAqIGNhbGxlci4gU28gYGJ1aWxkKClgIGNoZWNrcyBvbmUgYWdhaW5zdCB0aGUgb3RoZXI6IGl0IFJFRlVTRVMgdGhlIGNoYXJ0IHdoZW4gaXRzIGRlY2xhcmVkIHBvbGljaWVzIGFscmVhZHkgYWxsb3dcbiAgICogbG9uZ2VyIChgYXR0ZW1wdHMgw5cgdGltZW91dE1zYCBwbHVzIHRoZSB3YWl0cywgc3VtbWVkIGFsb25nIHRoZSBzbG93ZXN0IHBhdGgg4oCUIHNlZSBgdGltZUJ1ZGdldGApLCBhbmQgaW4gZGV2IG1vZGVcbiAgICogbmFtZXMgZXZlcnkgc3RhZ2UgaXQgY2Fubm90IGJvdW5kIChubyBgdGltZW91dE1zYCwgYSBmdW5jdGlvbiBiYWNrb2ZmIHdpdGggbm8gYG1heEJhY2tvZmZNc2AsIGEgbG9vcCwgYSBsYXp5XG4gICAqIHN1YmZsb3csIGEgYHBhcmFsbGVsRm9yRWFjaGApLiBUaGUgc3BlYyByb290IGNhcnJpZXMgaXQgKGBidWRnZXRNc2ApOyBhdCBydW4gc3RhcnQsIGEgZGVhZGxpbmUgc2hvcnRlciB0aGFuIGl0IGlzXG4gICAqIGEgZGV2LW1vZGUgd2FybmluZy5cbiAgICpcbiAgICogQ2hhcnQtbGV2ZWwsIHNvIGl0IG1heSBiZSBkZWNsYXJlZCBhbnl3aGVyZSBiZWZvcmUgYGJ1aWxkKClgLCBvbmNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBmbG93Q2hhcnQ8U3RhdGU+KCdSZWFkJywgcmVhZEZuLCAncmVhZCcsIHsgcmV0cnk6IHsgYXR0ZW1wdHM6IDEsIHRpbWVvdXRNczogNV8wMDAgfSB9KVxuICAgKiAgIC5hZGRGdW5jdGlvbignQ2hhcmdlJywgY2hhcmdlRm4sICdjaGFyZ2UnKVxuICAgKiAgIC5yZXRyeSh7IGF0dGVtcHRzOiA0LCB0aW1lb3V0TXM6IDQwXzAwMCwgYmFja29mZk1zOiAxXzAwMCB9KVxuICAgKiAgIC5idWRnZXQoMTIwXzAwMClcbiAgICogICAuYnVpbGQoKTsgLy8gdGhyb3dzOiBpdHMgZGVjbGFyZWQgcG9saWNpZXMgYWxsb3cgMTY4MDAwIG1zLCBvdmVyIGl0cyBidWRnZXQgYnkgNDgwMDAgbXNcbiAgICogYGBgXG4gICAqL1xuICBidWRnZXQobXM6IG51bWJlcik6IHRoaXMge1xuICAgIGlmICh0aGlzLl9zZWFsZWQpIGZhaWwoJ2J1ZGdldCgpIGFmdGVyIGJ1aWxkKCkg4oCUIGRlY2xhcmUgdGhlIGJ1ZGdldCBiZWZvcmUgYnVpbGRpbmcgdGhlIGNoYXJ0Jyk7XG4gICAgY29uc3Qgcm9vdFNwZWMgPSB0aGlzLl9yb290U3BlYyA/PyBmYWlsKCdidWRnZXQoKSBiZWZvcmUgc3RhcnQoKSDigJQgc3RhcnQgdGhlIGNoYXJ0IGZpcnN0Jyk7XG4gICAgLy8gQXQgbW9zdCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjogdGhlIHdvcnN0IGNhc2Ugc2F0dXJhdGVzIHRoZXJlLCBzbyBhIGxhcmdlciBidWRnZXQgY291bGQgbmV2ZXIgYmUgZXhjZWVkZWQuXG4gICAgaWYgKCEodHlwZW9mIG1zID09PSAnbnVtYmVyJyAmJiBtcyA+IDAgJiYgbXMgPD0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpKSB7XG4gICAgICBmYWlsKFxuICAgICAgICAnYnVkZ2V0KG1zKSBtdXN0IGJlIGEgZmluaXRlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgPiAwLCBhdCBtb3N0IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSICcgK1xuICAgICAgICAgIGAoZ290ICR7dHlwZW9mIG1zID09PSAnbnVtYmVyJyA/IG1zIDogdHlwZW9mIG1zfSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHJvb3RTcGVjLmJ1ZGdldE1zICE9PSB1bmRlZmluZWQpIGZhaWwoYGJ1ZGdldCBhbHJlYWR5IGRlY2xhcmVkICgke3Jvb3RTcGVjLmJ1ZGdldE1zfSBtcykg4oCUIGRlY2xhcmUgaXQgb25jZWApO1xuICAgIHJvb3RTcGVjLmJ1ZGdldE1zID0gbXM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgTG9vcCDilIDilIBcblxuICBsb29wVG8oc3RhZ2VJZDogc3RyaW5nKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgaWYgKGN1clNwZWMubG9vcFRhcmdldCkgZmFpbChgbG9vcFRvIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgaWYgKGN1ci5uZXh0KSBmYWlsKGBjYW5ub3Qgc2V0IGxvb3BUbyB3aGVuIG5leHQgaXMgYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcblxuICAgIGlmICghdGhpcy5fa25vd25TdGFnZUlkcy5oYXMoc3RhZ2VJZCkpIHtcbiAgICAgIGZhaWwoYGxvb3BUbygnJHtzdGFnZUlkfScpIHRhcmdldCBub3QgZm91bmQg4oCUIGRpZCB5b3UgcGFzcyBhIHN0YWdlIG5hbWUgaW5zdGVhZCBvZiBpZD9gKTtcbiAgICB9XG5cbiAgICBjdXIubmV4dCA9IHsgbmFtZTogc3RhZ2VJZCwgaWQ6IHN0YWdlSWQsIGlzTG9vcFJlZjogdHJ1ZSB9O1xuICAgIGN1clNwZWMubG9vcFRhcmdldCA9IHN0YWdlSWQ7XG4gICAgY3VyU3BlYy5uZXh0ID0geyBuYW1lOiBzdGFnZUlkLCBpZDogc3RhZ2VJZCwgdHlwZTogJ2xvb3AnLCBpc0xvb3BSZWZlcmVuY2U6IHRydWUgfTtcblxuICAgIGNvbnN0IHRhcmdldFN0ZXAgPSB0aGlzLl9zdGFnZVN0ZXBNYXAuZ2V0KHN0YWdlSWQpO1xuICAgIGlmICh0YXJnZXRTdGVwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChg4oaSIGxvb3BzIGJhY2sgdG8gc3RlcCAke3RhcmdldFN0ZXB9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChg4oaSIGxvb3BzIGJhY2sgdG8gJHtzdGFnZUlkfWApO1xuICAgIH1cblxuICAgIC8vIEw3LjMg4oCUIEZpcmUgdGhlIGxvb3AgYmFjay1lZGdlIGV2ZW50LiBEaXN0aW5jdCBmcm9tIGBvbkVkZ2VBZGRlZGBcbiAgICAvLyBiZWNhdXNlIHJ1bnRpbWUgYG9uTG9vcGAgY2FycmllcyBgaXRlcmF0aW9uOiBudW1iZXJgIHdoaWNoIGhhcyBub1xuICAgIC8vIGJ1aWxkIG1lYW5pbmcg4oCUIHNlcGFyYXRlIGV2ZW50IGtlZXBzIHBheWxvYWRzIGhvbmVzdC5cbiAgICB0aGlzLl9maXJlTG9vcEVkZ2VBZGRlZChjdXIuaWQsIHN0YWdlSWQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFN0cmVhbWluZyDilIDilIBcblxuICBvblN0cmVhbShoYW5kbGVyOiBTdHJlYW1Ub2tlbkhhbmRsZXIpOiB0aGlzIHtcbiAgICB0aGlzLl9zdHJlYW1IYW5kbGVycy5vblRva2VuID0gaGFuZGxlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9uU3RyZWFtU3RhcnQoaGFuZGxlcjogU3RyZWFtTGlmZWN5Y2xlSGFuZGxlcik6IHRoaXMge1xuICAgIHRoaXMuX3N0cmVhbUhhbmRsZXJzLm9uU3RhcnQgPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb25TdHJlYW1FbmQoaGFuZGxlcjogU3RyZWFtTGlmZWN5Y2xlSGFuZGxlcik6IHRoaXMge1xuICAgIHRoaXMuX3N0cmVhbUhhbmRsZXJzLm9uRW5kID0gaGFuZGxlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBPdXRwdXQg4pSA4pSAXG5cbiAgYnVpbGQoKTogUnVubmFibGVGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPiB7XG4gICAgLy8gTDcuMyDigJQgc2VhbCB0aGUgY2hhcnQgc28gcG9zdC1idWlsZCBhdHRhY2hlcyB0aHJvdy4gUHJldmVudHNcbiAgICAvLyByZWNvcmRlcnMgYXR0YWNoZWQgbWlkLWV4ZWN1dGlvbiBmcm9tIGdldHRpbmcgcGFydGlhbCBkYXRhLlxuICAgIHRoaXMuX3NlYWxlZCA9IHRydWU7XG5cbiAgICBjb25zdCByb290ID0gdGhpcy5fcm9vdCA/PyBmYWlsKCdlbXB0eSB0cmVlOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcbiAgICBjb25zdCByb290U3BlYyA9IHRoaXMuX3Jvb3RTcGVjID8/IGZhaWwoJ2VtcHR5IHNwZWM7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuXG4gICAgY29uc3Qgc3ViZmxvd3M6IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgdGhpcy5fc3ViZmxvd0RlZnMpIHtcbiAgICAgIHN1YmZsb3dzW2tleV0gPSBkZWY7XG4gICAgfVxuXG4gICAgY29uc3Qgcm9vdE5hbWUgPSB0aGlzLl9yb290Py5uYW1lID8/ICdGbG93Q2hhcnQnO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID1cbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMubGVuZ3RoID4gMCA/IGBGbG93Q2hhcnQ6ICR7cm9vdE5hbWV9XFxuU3RlcHM6XFxuJHt0aGlzLl9kZXNjcmlwdGlvblBhcnRzLmpvaW4oJ1xcbicpfWAgOiAnJztcblxuICAgIGNvbnN0IGNoYXJ0OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIHJvb3QsXG4gICAgICBzdGFnZU1hcDogdGhpcy5fc3RhZ2VNYXAsXG4gICAgICBidWlsZFRpbWVTdHJ1Y3R1cmU6IHJvb3RTcGVjLFxuICAgICAgLi4uKE9iamVjdC5rZXlzKHN1YmZsb3dzKS5sZW5ndGggPiAwID8geyBzdWJmbG93cyB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuX2VuYWJsZU5hcnJhdGl2ZSA/IHsgZW5hYmxlTmFycmF0aXZlOiB0cnVlIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5fbG9nZ2VyID8geyBsb2dnZXI6IHRoaXMuX2xvZ2dlciB9IDoge30pLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBzdGFnZURlc2NyaXB0aW9uczogbmV3IE1hcCh0aGlzLl9zdGFnZURlc2NyaXB0aW9ucyksXG4gICAgICAuLi4odGhpcy5faW5wdXRTY2hlbWEgPyB7IGlucHV0U2NoZW1hOiB0aGlzLl9pbnB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuX291dHB1dFNjaGVtYSA/IHsgb3V0cHV0U2NoZW1hOiB0aGlzLl9vdXRwdXRTY2hlbWEgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLl9vdXRwdXRNYXBwZXIgPyB7IG91dHB1dE1hcHBlcjogdGhpcy5fb3V0cHV0TWFwcGVyIH0gOiB7fSksXG4gICAgICAvLyBBdXRvLWVtYmVkIFR5cGVkU2NvcGUgZmFjdG9yeSBpZiBub25lIHdhcyBleHBsaWNpdGx5IHNldC5cbiAgICAgIC8vIFRoaXMgbWVhbnMgQU5ZIHdheSBvZiBjcmVhdGluZyBhIEZsb3dDaGFydEJ1aWxkZXIgKGZsb3dDaGFydCgpLCBuZXcgRmxvd0NoYXJ0QnVpbGRlcigpLFxuICAgICAgLy8gb3IgYW55IHN1YmNsYXNzKSBhdXRvbWF0aWNhbGx5IGdldHMgVHlwZWRTY29wZSDigJQgbm8gbWFudWFsIHNldFNjb3BlRmFjdG9yeSBuZWVkZWQuXG4gICAgICBzY29wZUZhY3Rvcnk6IHRoaXMuX3Njb3BlRmFjdG9yeSA/PyAoY3JlYXRlVHlwZWRTY29wZUZhY3RvcnkoKSBhcyB1bmtub3duIGFzIFNjb3BlRmFjdG9yeTxUU2NvcGU+KSxcbiAgICB9O1xuXG4gICAgaWYgKHJvb3RTcGVjLmJ1ZGdldE1zICE9PSB1bmRlZmluZWQpIHRoaXMuX2NoZWNrQnVkZ2V0KGNoYXJ0KTtcbiAgICByZXR1cm4gbWFrZVJ1bm5hYmxlKGNoYXJ0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVjbGFyZWQgYnVkZ2V0LCBjaGVja2VkIChvd25lciBydWxpbmcgUTIpOiByZWZ1c2VkIHdoZW4gdGhlIGNoYXJ0J3MgYm91bmRlZCBwYXJ0IGFsb25lIGFsbG93cyBsb25nZXIg4oCUIGFcbiAgICogdGltZSBpdHMgZGVjbGFyZWQgcG9saWNpZXMgYWxsb3cgYSBydW4gdG8gdGFrZSwgc28gdGhlIGJ1ZGdldCBjYW5ub3QgYmUgcHJvbWlzZWQ7IGV2ZXJ5IHN0YWdlIGl0IGNhbm5vdCBib3VuZCBpc1xuICAgKiBhIGRldi1tb2RlIHdhcm5pbmcuXG4gICAqL1xuICBwcml2YXRlIF9jaGVja0J1ZGdldChjaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4pOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aW1lQnVkZ2V0KGNoYXJ0KTtcbiAgICBjb25zdCByZWZ1c2FsID0gYnVkZ2V0UmVmdXNhbChyZXBvcnQpO1xuICAgIGlmIChyZWZ1c2FsICE9PSB1bmRlZmluZWQpIGZhaWwocmVmdXNhbCk7XG4gICAgaWYgKCFpc0Rldk1vZGUoKSkgcmV0dXJuO1xuICAgIGNvbnN0IHdhcm5pbmcgPSBidWRnZXRXYXJuaW5nKHJlcG9ydCwgY2hhcnQucm9vdC5uYW1lKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGlmICh3YXJuaW5nICE9PSB1bmRlZmluZWQpIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSB0aGUgc2NvcGUgZmFjdG9yeS4gUmFyZWx5IG5lZWRlZCDigJQgYXV0by1lbWJlZHMgVHlwZWRTY29wZSBieSBkZWZhdWx0LiAqL1xuICBzZXRTY29wZUZhY3RvcnkoZmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT4pOiB0aGlzIHtcbiAgICB0aGlzLl9zY29wZUZhY3RvcnkgPSBmYWN0b3J5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG9TcGVjPFRSZXN1bHQgPSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU+KCk6IFRSZXN1bHQge1xuICAgIGNvbnN0IHJvb3RTcGVjID0gdGhpcy5fcm9vdFNwZWMgPz8gZmFpbCgnZW1wdHkgdHJlZTsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gICAgcmV0dXJuIHJvb3RTcGVjIGFzIFRSZXN1bHQ7XG4gIH1cblxuICB0b01lcm1haWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbJ2Zsb3djaGFydCBURCddO1xuICAgIGNvbnN0IGlkT2YgPSAoazogc3RyaW5nKSA9PiAoayB8fCAnJykucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCAnXycpIHx8ICdfJztcbiAgICBjb25zdCByb290ID0gdGhpcy5fcm9vdCA/PyBmYWlsKCdlbXB0eSB0cmVlOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcblxuICAgIGNvbnN0IHdhbGsgPSAobjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pID0+IHtcbiAgICAgIGNvbnN0IG5pZCA9IGlkT2Yobi5pZCk7XG4gICAgICBsaW5lcy5wdXNoKGAke25pZH1bXCIke24ubmFtZX1cIl1gKTtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBuLmNoaWxkcmVuIHx8IFtdKSB7XG4gICAgICAgIGNvbnN0IGNpZCA9IGlkT2YoYy5pZCk7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7bmlkfSAtLT4gJHtjaWR9YCk7XG4gICAgICAgIHdhbGsoYyk7XG4gICAgICB9XG4gICAgICBpZiAobi5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IGlkT2Yobi5uZXh0LmlkKTtcbiAgICAgICAgbGluZXMucHVzaChgJHtuaWR9IC0tPiAke21pZH1gKTtcbiAgICAgICAgd2FsayhuLm5leHQpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2Fsayhyb290KTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWxzIChleHBvc2VkIGZvciBoZWxwZXIgY2xhc3Nlcykg4pSA4pSAXG5cbiAgcHJpdmF0ZSBfbmVlZEN1cnNvcigpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvciA/PyBmYWlsKCdjdXJzb3IgdW5kZWZpbmVkOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcbiAgfVxuXG4gIHByaXZhdGUgX25lZWRDdXJzb3JTcGVjKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnNvclNwZWMgPz8gZmFpbCgnY3Vyc29yIHVuZGVmaW5lZDsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5vZGUgYSBmYW4tb3V0IChgYWRkTGlzdE9mRnVuY3Rpb25gLCBgYWRkU3ViRmxvd0NoYXJ0YCxcbiAgICogYGFkZExhenlTdWJGbG93Q2hhcnRgKSBoYW5ncyBpdHMgY2hpbGRyZW4gb24g4oCUIHRoZSBjdXJzb3IsIHVubGVzcyB0aGVcbiAgICogY3Vyc29yJ3MgYGNoaWxkcmVuYCBhbHJlYWR5IE1FQU4gc29tZXRoaW5nIGVsc2U6XG4gICAqXG4gICAqIC0gYSBzdWJmbG93IE1PVU5UIOKAlCB0aGUgZW5naW5lIHJlYWRzIGEgbW91bnQgdGhhdCBjYXJyaWVzIGNoaWxkcmVuIGFzIHRoZVxuICAgKiAgIG1vdW50ZWQgY2hhcnQncyBPV04gY29udGVudCAoYE5vZGVSZXNvbHZlciDCtyByZXNvbHZlU3ViZmxvd1JlZmVyZW5jZWApLFxuICAgKiAgIHNvIGEgZm9yayBodW5nIHRoZXJlIHJhbiBJTlNJREUgdGhlIHN1YmZsb3c6IHRoZSBzdWJmbG93J3MgcmVhbCBjaGFydFxuICAgKiAgIG5ldmVyIHJhbiwgZXZlcnl0aGluZyBhZnRlciB0aGUgZm9yayByYW4gdHdpY2UsIGFuZCBhIHBhdXNlIGFmdGVyIGl0IHdhc1xuICAgKiAgIGNoZWNrcG9pbnRlZCB1bmRlciB0aGUgd3Jvbmcgc3ViZmxvdyBwYXRoIChhbmQgcmVmdXNlZCBvbiByZXN1bWUpO1xuICAgKiAtIGEgREVDSURFUiBvciBhIFNFTEVDVE9SICh0aGUgY3Vyc29yIGFmdGVyIGAuZW5kKClgKSDigJQgaXRzIGNoaWxkcmVuIGFyZVxuICAgKiAgIGl0cyBicmFuY2hlcywgc28gYSBmb3JrIGNoaWxkIGJlY2FtZSBhIGJyYW5jaCBub2JvZHkgcGlja3M7XG4gICAqIC0gYSBgcGFyYWxsZWxGb3JFYWNoYCDigJQgaXRzIGJyYW5jaGVzIGNvbWUgZnJvbSBgaXRlbXNgIGF0IHJ1biB0aW1lIGFuZFxuICAgKiAgIGJ1aWx0IGNoaWxkcmVuIGFyZSBuZXZlciBkaXNwYXRjaGVkLCBzbyB0aGUgZm9yayBuZXZlciByYW4uXG4gICAqXG4gICAqIFRocm91Z2ggOS4zNy4wIHRoZSBidWlsZGVyIGh1bmcgdGhlIGZvcmsgdGhlcmUgYW55d2F5LiBTbyBhZnRlciBzdWNoIGFcbiAgICogbm9kZSB0aGUgZm9yayBjb250aW51ZXMgQUZURVIgaXQ6IGEgZnVuY3Rpb24tbGVzcyBmb3JrIG5vZGVcbiAgICogYDxub2RlSWQ+LWZvcmtgIGJlY29tZXMgdGhlIG5vZGUncyBgbmV4dGAgYW5kIHRoZSBuZXcgY3Vyc29yIOKAlCB0aGUgc2hhcGVcbiAgICogYGFkZEZ1bmN0aW9uKC4uLikuYWRkTGlzdE9mRnVuY3Rpb24oLi4uKWAgYWxyZWFkeSBidWlsZHMsIHdoaWNoIGV2ZXJ5XG4gICAqIHJlYWRlciAoZW5naW5lLCByZXN1bWUsIHN0cnVjdHVyZSwgc3BlYykgaGFuZGxlcy4gQSBzZWNvbmQgZmFuLW91dCBjYWxsXG4gICAqIHJldXNlcyB0aGF0IG5vZGUsIGFzIGl0IHdvdWxkIGFueSBjdXJzb3IuIFRoZSBpZCBpcyByZXNlcnZlZCBib3RoIHdheXM6XG4gICAqIHJlZnVzZWQgaGVyZSB3aGVuIGEgc3RhZ2UgYWxyZWFkeSBoYXMgaXQsIGFuZCBieSBzdGFnZSBhZG1pc3Npb24gL1xuICAgKiBgX3JlZ2lzdGVyU3ViZmxvd0RlZmAgd2hlbiBhIGxhdGVyIHN0YWdlIG9yIG1vdW50IGFza3MgZm9yIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBfbmVlZEZvcmtQYXJlbnQoKTogeyBjdXI6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+OyBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfSB7XG4gICAgY29uc3Qgb3duZXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3Qgb3duZXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBjaGlsZHJlbk1lYW5Tb21ldGhpbmdFbHNlID1cbiAgICAgIG93bmVyLmlzU3ViZmxvd1Jvb3QgfHwgb3duZXIuaXNEeW5hbWljUGFyYWxsZWwgfHwgb3duZXIuZGVjaWRlckZuIHx8IG93bmVyLnNlbGVjdG9yRm47XG4gICAgaWYgKCFjaGlsZHJlbk1lYW5Tb21ldGhpbmdFbHNlKSByZXR1cm4geyBjdXI6IG93bmVyLCBjdXJTcGVjOiBvd25lclNwZWMgfTtcblxuICAgIGNvbnN0IGlkID0gYCR7b3duZXIuaWR9LWZvcmtgO1xuICAgIGlmICh0aGlzLl9pZFRha2VuKGlkKSkge1xuICAgICAgZmFpbChcbiAgICAgICAgYGNhbm5vdCBmYW4gb3V0IGFmdGVyICcke293bmVyLm5hbWV9JzogdGhlIGZvcmsgbm9kZSBpdCBuZWVkcywgJyR7aWR9JywgYCArXG4gICAgICAgICAgYGlzIGFscmVhZHkgYSBzdGFnZSBpZC4gQWRkIGEgc3RhZ2UgYWZ0ZXIgJyR7b3duZXIubmFtZX0nIGFuZCBmYW4gb3V0IGZyb20gaXQuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lOiBpZCwgaWQgfTtcbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWU6IGlkLCBpZCwgdHlwZTogJ2ZvcmsnIH07XG4gICAgb3duZXIubmV4dCA9IG5vZGU7XG4gICAgb3duZXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fYWR2YW5jZUN1cnNvclNwZWMoc3BlYyk7XG4gICAgdGhpcy5fa25vd25TdGFnZUlkcy5hZGQoaWQpO1xuICAgIHRoaXMuX2ZvcmtOb2RlSWRzLmFkZChpZCk7XG4gICAgdGhpcy5fZmlyZVN0YWdlQWRkZWQoc3BlYyk7XG4gICAgdGhpcy5fZmlyZU5leHRFZGdlRnJvbVBhcmVudChvd25lclNwZWMsIGlkKTtcbiAgICByZXR1cm4geyBjdXI6IG5vZGUsIGN1clNwZWM6IHNwZWMgfTtcbiAgfVxuXG4gIC8qKiBJZHMgYF9uZWVkRm9ya1BhcmVudGAgZ2VuZXJhdGVkIOKAlCBubyBsYXRlciBzdGFnZSBvciBtb3VudCBtYXkgdGFrZSBvbmUuICovXG4gIHByaXZhdGUgX2ZvcmtOb2RlSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqIFNoYXJlZCBieSBzdGFnZSBhZG1pc3Npb24gYW5kIHN1YmZsb3cgcmVnaXN0cmF0aW9uOiByZXNlcnZlZCBzdHJ1Y3R1cmFsIGlkcyBjYW5ub3QgYmUgcmV1c2VkLiAqL1xuICBwcml2YXRlIF9yZWZ1c2VGb3JrTm9kZUlkKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2xhaW1lZElkcy5oYXMoaWQpKSB7XG4gICAgICBmYWlsKGBpZCAnJHtpZH0nIGlzIGFscmVhZHkgdXNlZCBieSBhIGxhenkgc3ViZmxvdyBtb3VudCBvciBhIHBhcmFsbGVsRm9yRWFjaCBpbiB0aGlzIGNoYXJ0LiBSZW5hbWUgdGhlIHN0YWdlLmApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2ZvcmtOb2RlSWRzLmhhcyhpZCkpIHJldHVybjtcbiAgICBmYWlsKFxuICAgICAgYGlkICcke2lkfScgaXMgdGFrZW46IGl0IGlzIHRoZSBmb3JrIG5vZGUgdGhlIGJ1aWxkZXIgcGxhY2VkIGFmdGVyICcke2lkLnNsaWNlKDAsIC0nLWZvcmsnLmxlbmd0aCl9JyBgICtcbiAgICAgICAgJyhhIGZhbi1vdXQgcmlnaHQgYWZ0ZXIgYSBzdWJmbG93IG1vdW50LCBkZWNpZGVyLCBzZWxlY3RvciBvciBwYXJhbGxlbEZvckVhY2ggY29udGludWVzIG9uIGl0KS4gJyArXG4gICAgICAgICdSZW5hbWUgdGhlIHN0YWdlLicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBJZHMgdGhlIGxhenktbW91bnQgYW5kIHBhcmFsbGVsRm9yRWFjaCBkb29ycyBjbGFpbWVkICh0aGV5IHJlZ2lzdGVyIGluIG5vIG1hcCkuICovXG4gIHByaXZhdGUgX2NsYWltZWRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKiogU3RydWN0dXJhbCBkZWNsYXJhdGlvbnMgd2l0aG91dCBhbiBlbWJlZGRlZCBmdW5jdGlvbjsgbm90IGZ1bmN0aW9uIGVudHJpZXMgb3IgbG9vcCB0YXJnZXRzLiAqL1xuICBwcml2YXRlIF9mdW5jdGlvbmxlc3NTdGFnZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKiBUcnVlIHdoZW4gYW4gZWFybGllciBzdGFnZSwgYnJhbmNoLCBmb3JrIGNoaWxkLCBtb3VudCBvciBnZW5lcmF0ZWQgZm9yayBub2RlIGhvbGRzIGBpZGAuICovXG4gIHByaXZhdGUgX2lkVGFrZW4oaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9rbm93blN0YWdlSWRzLmhhcyhpZCkgfHxcbiAgICAgIHRoaXMuX3N0YWdlTWFwLmhhcyhpZCkgfHxcbiAgICAgIHRoaXMuX2Z1bmN0aW9ubGVzc1N0YWdlSWRzLmhhcyhpZCkgfHxcbiAgICAgIHRoaXMuX3N1YmZsb3dEZWZzLmhhcyhpZCkgfHxcbiAgICAgIHRoaXMuX2NsYWltZWRJZHMuaGFzKGlkKSB8fFxuICAgICAgdGhpcy5fZm9ya05vZGVJZHMuaGFzKGlkKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsIFRoZSBsYXp5LW1vdW50IGRvb3JzIGFuZCBgYWRkUGFyYWxsZWxGb3JFYWNoYCByZWdpc3RlciB0aGVpciBpZFxuICAgKiBpbiBubyBtYXAsIHNvIHRocm91Z2ggOS4zNy4wIHRoZXkgYWNjZXB0ZWQgYW4gaWQgYW5vdGhlciBzdGFnZSBvciBtb3VudFxuICAgKiBhbHJlYWR5IGhhZCAoYW5kIGEgbGF0ZXIgc3RhZ2UgY291bGQgdGFrZSB0aGVpcnMpLiBUaGV5IGNsYWltIGl0IGhlcmU6XG4gICAqIHJlZnVzZWQgd2hlbiB0YWtlbiwgcmVjb3JkZWQgd2hlbiBmcmVzaC4gTG9vcC1yZWYgc3R1YnMgcmVmZXJlbmNlIGFuXG4gICAqIGV4aXN0aW5nIHN0YWdlIHJhdGhlciB0aGFuIGNsYWltaW5nIGEgbmV3IGlkLiBSZXVzYWJsZSBmdW5jdGlvbiBzdGFnZXNcbiAgICogcmV0YWluIHRoZWlyIHNlcGFyYXRlIGBfYWRkVG9NYXBgIHJ1bGUuXG4gICAqL1xuICBfY2xhaW1GcmVzaElkKGlkOiBzdHJpbmcsIGRvb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pZFRha2VuKGlkKSkge1xuICAgICAgZmFpbChgJHtkb29yfTogaWQgJyR7aWR9JyBpcyBhbHJlYWR5IHVzZWQgYnkgYW5vdGhlciBzdGFnZSBvciBtb3VudCBpbiB0aGlzIGNoYXJ0LiBHaXZlIGl0IGl0cyBvd24gaWQuYCk7XG4gICAgfVxuICAgIHRoaXMuX2NsYWltZWRJZHMuYWRkKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZHZhbmNlIHRoZSBzcGVjIGN1cnNvci4gUmV0YWluZWQgYXMgYSBtZXRob2Qgc28gY2FsbCBzaXRlcyBzdGF5XG4gICAqIG9uZS1saW5lcnMgYW5kIGZ1dHVyZSBjdXJzb3ItcmVsYXRlZCBzaWRlIGVmZmVjdHMgaGF2ZSBhIGhvb2suXG4gICAqL1xuICAvKipcbiAgICogV2hhdCB3YXMgYXR0YWNoZWQgdG8gdGhlIENVUlNPUiB3aXRob3V0IGFkdmFuY2luZyBpdCDigJQgYSBzdWJmbG93IG1vdW50LCBhXG4gICAqIHBhcmFsbGVsIGZvcmsncyBjaGlsZHJlbi4gQ2xlYXJlZCBieSB7QGxpbmsgX2FkdmFuY2VDdXJzb3JTcGVjfSwgdGhlIHNpbmdsZVxuICAgKiBjaG9rZSBwb2ludCBldmVyeSBjdXJzb3ItYWR2YW5jaW5nIG1ldGhvZCBhbHJlYWR5IGdvZXMgdGhyb3VnaCwgc28gdGhpc1xuICAgKiBtYXJrZXIgY2Fubm90IGRyaWZ0IGFzIG5ldyBidWlsZGVyIG1ldGhvZHMgYXJlIGFkZGVkLlxuICAgKlxuICAgKiBFeGlzdHMgZm9yIGAucmV0cnkoKWAuIFRob3NlIG1ldGhvZHMgaGFuZyBjaGlsZHJlbiBvZmYgdGhlIGN1cnJlbnQgc3RhZ2VcbiAgICogYW5kIGxlYXZlIHRoZSBjdXJzb3IgcG9pbnRpbmcgYXQgdGhhdCBzdGFnZSwgc28gYSBjaGFpbmVkIGAucmV0cnkoKWAgd291bGRcbiAgICogc2lsZW50bHkgYXR0YWNoIHRoZSBwb2xpY3kgdG8gdGhlIHN0YWdlIEJFRk9SRSB0aGUgdGhpbmcgeW91IGp1c3Qgd3JvdGUg4oCUXG4gICAqIGV4YWN0bHkgdGhlIHNpbGVudCBtaXMtYXR0cmlidXRpb24gdGhpcyBjb2RlYmFzZSByZWZ1c2VzIGVsc2V3aGVyZSAoc2VlXG4gICAqIHRoZSBicmFuY2gtc2VnbWVudCBtYXJrZXIgcnVsZXMpLiBOYW1pbmcgd2hhdCB3YXMgbGFzdCBhZGRlZCBsZXRzIHRoZVxuICAgKiByZWZ1c2FsIHNheSBzb21ldGhpbmcgdXNlZnVsLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3Vyc29yVGFpbD86IHN0cmluZztcblxuICBwcml2YXRlIF9hZHZhbmNlQ3Vyc29yU3BlYyhuZXdTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJzb3JUYWlsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2N1cnNvclNwZWMgPSBuZXdTcGVjO1xuICB9XG5cbiAgX3N0YWdlTWFwSGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlTWFwLmhhcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBSZWdpc3RlciBhIG1vdW50ZWQgc3ViZmxvdydzIGRlZmluaXRpb24g4oCUIGZpcnN0IG1vdW50IHdpbnMsXG4gICAqIGF0IGV2ZXJ5IGVhZ2VyIG1vdW50IHNpdGUgKGxpbmVhciwgZm9yayBjaGlsZCwgZGVjaWRlciBhbmQgc2VsZWN0b3JcbiAgICogYnJhbmNoKS4gQSBTRUNPTkQgbW91bnQgdW5kZXIgdGhlIHNhbWUgaWQgaXMgYWxsb3dlZCAoZXhpc3RpbmcgY2hhcnRzIGRvXG4gICAqIGl0KSBhbmQgc2hhcmVzIHRoZSBmaXJzdCBvbmUncyBkZWZpbml0aW9uIOKAlCBidXQgYSBwYXVzZSBpbnNpZGUgZWl0aGVyXG4gICAqIGNhbm5vdCBiZSByZXN1bWVkOiBhIGNoZWNrcG9pbnQncyBgc3ViZmxvd1BhdGhgIG5hbWVzIHRoZSBzdWJmbG93IGlkLCBub3RcbiAgICogdGhlIG1vdW50LCBzbyBgcmVzdW1lKClgIHJlZnVzZXMgdGhlIGFtYmlndW91cyBwYXRoLiBEZXYgbW9kZSBzYXlzIHNvXG4gICAqIGhlcmUsIGF0IGJ1aWxkIHRpbWUsIHdoZXJlIHRoZSBpZCBjYW4gc3RpbGwgYmUgY2hhbmdlZC5cbiAgICovXG4gIF9yZWdpc3RlclN1YmZsb3dEZWYoaWQ6IHN0cmluZywgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiB2b2lkIHtcbiAgICB0aGlzLl9yZWZ1c2VGb3JrTm9kZUlkKGlkKTtcbiAgICBpZiAoIXRoaXMuX3N1YmZsb3dEZWZzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuX3N1YmZsb3dEZWZzLnNldChpZCwgeyByb290IH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50XSBzdWJmbG93IGlkICcke2lkfScgaXMgbW91bnRlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGlzIGNoYXJ0LiBUaGUgbW91bnRzIHNoYXJlIG9uZSBgICtcbiAgICAgICAgICAnZGVmaW5pdGlvbiwgYW5kIGEgcGF1c2UgaW5zaWRlIGVpdGhlciBjYW5ub3QgYmUgcmVzdW1lZCDigJQgdGhlIGNoZWNrcG9pbnQgY2Fubm90IHNheSB3aGljaCBtb3VudCAnICtcbiAgICAgICAgICAncGF1c2VkLiBHaXZlIGVhY2ggbW91bnQgaXRzIG93biBpZC4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsIE9uZSBhZG1pc3Npb24gcGF0aCBmb3Igb3B0aW9uYWwtZnVuY3Rpb24gY2hpbGRyZW4gYW5kIGJyYW5jaGVzLlxuICAgKiBBIG1pc3NpbmcgZnVuY3Rpb24gZG9lcyBub3QgZXJhc2UgdGhlIGdyYXBoIGlkZW50aXR5OiBjaGVjayByZXNlcnZhdGlvbnNcbiAgICogYW5kIHJlY29yZCBpdCBmb3IgZnV0dXJlIGZyZXNoLWlkIGNsYWltcywgd2l0aG91dCBhZGRpbmcgYSBmdW5jdGlvbiBvciBhXG4gICAqIGxvb3AgdGFyZ2V0LiBFeGlzdGluZyBmdW5jdGlvbiByZWZlcmVuY2VzIGJ5IGlkL25hbWUgcmVtYWluIGxlZ2FsLlxuICAgKi9cbiAgX3JlZ2lzdGVyU3RhZ2UoaWQ6IHN0cmluZywgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmIChmbikge1xuICAgICAgdGhpcy5fYWRkVG9NYXAoaWQsIGZuKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcmVmdXNlRm9ya05vZGVJZChpZCk7XG4gICAgdGhpcy5fZnVuY3Rpb25sZXNzU3RhZ2VJZHMuYWRkKGlkKTtcbiAgfVxuXG4gIF9hZGRUb01hcChpZDogc3RyaW5nLCBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KSB7XG4gICAgdGhpcy5fcmVmdXNlRm9ya05vZGVJZChpZCk7XG4gICAgaWYgKHRoaXMuX3N0YWdlTWFwLmhhcyhpZCkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fc3RhZ2VNYXAuZ2V0KGlkKTtcbiAgICAgIGlmIChleGlzdGluZyAhPT0gZm4pIGZhaWwoYHN0YWdlTWFwIGNvbGxpc2lvbiBmb3IgaWQgJyR7aWR9J2ApO1xuICAgIH1cbiAgICB0aGlzLl9zdGFnZU1hcC5zZXQoaWQsIGZuKTtcbiAgfVxuXG4gIF9tZXJnZVN0YWdlTWFwKG90aGVyOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+LCBwcmVmaXg/OiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBvdGhlcikge1xuICAgICAgY29uc3Qga2V5ID0gcHJlZml4ID8gam9pblBhdGgocHJlZml4LCBrKSA6IGs7XG4gICAgICBpZiAodGhpcy5fc3RhZ2VNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9zdGFnZU1hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nICE9PSB2KSBmYWlsKGBzdGFnZU1hcCBjb2xsaXNpb24gd2hpbGUgbW91bnRpbmcgZmxvd2NoYXJ0IGF0ICcke2tleX0nYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zdGFnZU1hcC5zZXQoa2V5LCB2KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlZml4IGEgbm9kZSB0cmVlIHdpdGggYSBzdWJmbG93IHBhdGggc2VnbWVudCBhdCBNT1VOVCB0aW1lIOKAlCB0aGUgb25lXG4gICAqIHByZWZpeGVyLCBgZW5naW5lL2dyYXBoL3ByZWZpeE5vZGVUcmVlLnRzYCAodGhlIHRyYXZlcnNlciBjYWxscyB0aGUgc2FtZVxuICAgKiBmdW5jdGlvbiBhdCBSVU4gdGltZSkuIEtlcHQgYXMgdGhlIGJ1aWxkZXIncyBkb29yIGZvciBpdHMgbW91bnQgc2l0ZXMuXG4gICAqL1xuICBfcHJlZml4Tm9kZVRyZWUobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHByZWZpeDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiBwcmVmaXhOb2RlVHJlZShub2RlLCBwcmVmaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRIRSBtb3VudCBvZiBhIHN1YmZsb3cgY2hhcnQgdW5kZXIgYGlkYCAoRjEwKSDigJQgZXZlcnkgZWFnZXIgbW91bnQgc2l0ZVxuICAgKiAoYGFkZFN1YkZsb3dDaGFydGAsIGBhZGRTdWJGbG93Q2hhcnROZXh0YCwgYSBkZWNpZGVyL3NlbGVjdG9yXG4gICAqIGBhZGRTdWJGbG93Q2hhcnRCcmFuY2hgKSBnb2VzIHRocm91Z2ggaXQsIGFuZCBpdCBpcyB0aGUgb25lIGNhbGxlciBvZiB0aGVcbiAgICogcHJlZml4ZXIuIEluIG9yZGVyOiByZWdpc3RlciB0aGUgY2hhcnQncyBwcmVmaXhlZCByb290IHVuZGVyIGBpZGA7XG4gICAqIGBwbGFjZWAgdGhlIG1vdW50J3Mgb3duIG5vZGUgKyBzcGVjIGFuZCBmaXJlIGl0cyBzdHJ1Y3R1cmUgZXZlbnRzOyBtZXJnZVxuICAgKiB0aGUgY2hhcnQncyBzdGFnZSBtYXAgdW5kZXIgYGlkYDsgcmVnaXN0ZXIgaXRzIG5lc3RlZCBzdWJmbG93cyB1bmRlclxuICAgKiBgaWQvPGtleT5gIChhIGtleSBhbHJlYWR5IHJlZ2lzdGVyZWQgaXMga2VwdCkuXG4gICAqL1xuICBfbW91bnRTdWJmbG93KGlkOiBzdHJpbmcsIHN1YmZsb3c6IEZsb3dDaGFydDxhbnksIGFueT4sIHBsYWNlOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgcHJlZml4ZWQgPSAocm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pID0+IHRoaXMuX3ByZWZpeE5vZGVUcmVlKHJvb3QsIGlkKTtcbiAgICB0aGlzLl9yZWdpc3RlclN1YmZsb3dEZWYoaWQsIHByZWZpeGVkKHN1YmZsb3cucm9vdCkpO1xuICAgIHBsYWNlKCk7XG4gICAgdGhpcy5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgaWYgKCFzdWJmbG93LnN1YmZsb3dzKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YmZsb3cuc3ViZmxvd3MpKSB7XG4gICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGpvaW5QYXRoKGlkLCBrZXkpO1xuICAgICAgaWYgKCF0aGlzLl9zdWJmbG93RGVmcy5oYXMocHJlZml4ZWRLZXkpKSB7XG4gICAgICAgIHRoaXMuX3N1YmZsb3dEZWZzLnNldChwcmVmaXhlZEtleSwgeyByb290OiBwcmVmaXhlZChkZWYucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPikgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRmFjdG9yeSBGdW5jdGlvblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogU3RhcnQgYSBmbG93Y2hhcnQgd2l0aCBpdHMgZmlyc3Qgc3RhZ2U7IHJldHVybnMgYSBmbHVlbnQgYnVpbGRlci5cbiAqXG4gKiBDaGFpbiBgLmFkZEZ1bmN0aW9uKClgIC8gYC5hZGREZWNpZGVyRnVuY3Rpb24oKWAgLyBgLmFkZFNlbGVjdG9yRnVuY3Rpb24oKWAgL1xuICogYC5hZGRTdWJGbG93Q2hhcnQoKWAgZXRjLiB0byBhZGQgbW9yZSBzdGFnZXMsIHRoZW4gZmluaXNoIHdpdGggYC5idWlsZCgpYC5cbiAqXG4gKiBAcGFyYW0gbmFtZSAgICBIdW1hbi1yZWFkYWJsZSBkaXNwbGF5IGxhYmVsIGZvciB0aGUgc3RhZ2UgKHNob3duIGluIHRoZSBuYXJyYXRpdmUvdHJhY2UpLlxuICogQHBhcmFtIGZuICAgICAgVGhlIHN0YWdlJ3Mgd29yayDigJQgYSBgKHNjb3BlKSA9PiDigKZgIGZ1bmN0aW9uLCBvciBhIGBQYXVzYWJsZUhhbmRsZXJgIGZvciBodW1hbi1pbi10aGUtbG9vcCBwYXVzZXMuXG4gKiBAcGFyYW0gaWQgICAgICBTdGFibGUgc3RhZ2UgaWQgdXNlZCBpbiB0cmFjZXMsIHRoZSBjb21taXQgbG9nLCBhbmQgYHJ1bnRpbWVTdGFnZUlkYC4gS2VlcCBpdCB1bmlxdWUgd2l0aGluIHRoZSBjaGFydC5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGB7IGRlc2NyaXB0aW9uPywgc3RydWN0dXJlUmVjb3JkZXJzPyB9YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgY2hhcnQgPSBmbG93Q2hhcnQ8U3RhdGU+KCdGZXRjaFVzZXInLCBhc3luYyAoc2NvcGUpID0+IHtcbiAqICAgc2NvcGUudXNlciA9IGF3YWl0IGdldFVzZXIoKTtcbiAqIH0sICdmZXRjaC11c2VyJylcbiAqICAgLmFkZEZ1bmN0aW9uKCdQcm9jZXNzJywgcHJvY2Vzc0ZuLCAncHJvY2VzcycpXG4gKiAgIC5idWlsZCgpO1xuICpcbiAqIGNvbnN0IHRyYWNlID0gbmFycmF0aXZlKCk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGFydC5yZWNvcmRlcih0cmFjZSkucnVuKCk7XG4gKiBjb25zb2xlLmxvZyh0cmFjZS5nZXRFbnRyaWVzKCkubWFwKChlKSA9PiBlLnRleHQpLmpvaW4oJ1xcbicpKTtcbiAqL1xuLy8gT3ZlcmxvYWQgMTogdHlwZWQgc3RhdGUgd2l0aCBvcHRpb25zIG9iamVjdC5cbmV4cG9ydCBmdW5jdGlvbiBmbG93Q2hhcnQ8VFN0YXRlIGV4dGVuZHMgb2JqZWN0PihcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogVHlwZWRTdGFnZUZ1bmN0aW9uPFRTdGF0ZT4gfCBQYXVzYWJsZUhhbmRsZXI8VHlwZWRTY29wZTxUU3RhdGU+PixcbiAgaWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IEZsb3dDaGFydE9wdGlvbnMsXG4pOiBGbG93Q2hhcnRCdWlsZGVyPGFueSwgVHlwZWRTY29wZTxUU3RhdGU+PjtcblxuLy8gT3ZlcmxvYWQgMjogZXhwbGljaXQgZ2VuZXJpY3Mgd2l0aCBvcHRpb25zIG9iamVjdC5cbmV4cG9ydCBmdW5jdGlvbiBmbG93Q2hhcnQ8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PihcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHwgUGF1c2FibGVIYW5kbGVyPFRTY29wZT4sXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBGbG93Q2hhcnRPcHRpb25zLFxuKTogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+O1xuXG4vLyBTaW5nbGUgaW1wbGVtZW50YXRpb24g4oCUIGFjY2VwdHMgdGhlIG9wdGlvbnMgYmFnIChvciB1bmRlZmluZWQpLlxuZXhwb3J0IGZ1bmN0aW9uIGZsb3dDaGFydDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+KFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCBQYXVzYWJsZUhhbmRsZXI8VFNjb3BlPixcbiAgaWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IEZsb3dDaGFydE9wdGlvbnMsXG4pOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4ge1xuICBjb25zdCBidWlsZGVyID0gbmV3IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPigpO1xuICAvLyBBdHRhY2ggU3RydWN0dXJlUmVjb3JkZXJzIEJFRk9SRSBzdGFydCgpIHNvIHRoZSBzZWVkIGV2ZW50IGZpcmVzIHRocm91Z2hcbiAgLy8gdGhlIG5vcm1hbCBkaXNwYXRjaGVyIHBhdGggKG5vIHJlcGxheSBuZWVkZWQpLiBJdGVyYXRpb24gb3JkZXIgbWF0Y2hlc1xuICAvLyBhcnJheSBvcmRlciwgbWF0Y2hpbmcgdGhlIGZsdWVudCBgLmF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKClgIGNoYWluXG4gIC8vIHNlbWFudGljcy5cbiAgaWYgKG9wdGlvbnM/LnN0cnVjdHVyZVJlY29yZGVycykge1xuICAgIGZvciAoY29uc3QgcmVjIG9mIG9wdGlvbnMuc3RydWN0dXJlUmVjb3JkZXJzKSB7XG4gICAgICBidWlsZGVyLmF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKHJlYyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBidWlsZGVyLnN0YXJ0KG5hbWUsIGZuIGFzIGFueSwgaWQsIG9wdGlvbnM/LmRlc2NyaXB0aW9uLCB7XG4gICAgLi4uKG9wdGlvbnM/LnJldHJ5ICYmIHsgcmV0cnk6IG9wdGlvbnMucmV0cnkgfSksXG4gICAgLi4uKG9wdGlvbnM/LnRvdWNoZXMgJiYgeyB0b3VjaGVzOiBvcHRpb25zLnRvdWNoZXMgfSksXG4gICAgLi4uKG9wdGlvbnM/LnRhZ3MgJiYgeyB0YWdzOiBvcHRpb25zLnRhZ3MgfSksXG4gIH0pO1xufVxuXG4vKipcbiAqIExpa2UgYGZsb3dDaGFydCgpYCwgYnV0IHRoZSBST09UIHN0YWdlIGlzIGEgU0VMRUNUT1Ig4oCUIGl0IHJ1bnMgZmlyc3QgYW5kXG4gKiBpdHMgYnJhbmNoZXMgYXR0YWNoIGRpcmVjdGx5IHRvIGl0IChubyBzZXBhcmF0ZSBzZWVkIHN0YWdlKS4gUmV0dXJucyBhXG4gKiBgU2VsZWN0b3JGbkxpc3RgOyBkZWNsYXJlIGJyYW5jaGVzIHRoZW4gY2FsbCBgLmVuZCgpYCB0byBnZXQgdGhlIGJ1aWxkZXJcbiAqIGJhY2sgZm9yIGFueSBzdWJzZXF1ZW50IHN0YWdlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBmbG93Q2hhcnRTZWxlY3RvcjxNeVN0YXRlPignQ29udGV4dCcsIGNvbnRleHRTZWxlY3RvckZuLCAnY29udGV4dCcpXG4gKiAgICAgLmFkZFN1YkZsb3dDaGFydEJyYW5jaCgnc2Ytc3lzdGVtLXByb21wdCcsIHN5c1Nsb3QsICdTeXN0ZW0gUHJvbXB0Jywgey4uLn0pXG4gKiAgICAgLmFkZFN1YkZsb3dDaGFydEJyYW5jaCgnc2YtbWVzc2FnZXMnLCBtc2dTbG90LCAnTWVzc2FnZXMnLCB7Li4ufSlcbiAqICAgICAuZW5kKClcbiAqICAgICAuYWRkRnVuY3Rpb24oJ21lc3NhZ2VBUEknLCBhc3NlbWJsZUZuLCAnbWVzc2FnZS1hcGknKVxuICogICAgIC5idWlsZCgpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmxvd0NoYXJ0U2VsZWN0b3I8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PihcbiAgbmFtZTogc3RyaW5nLFxuICBmbjogU3RhZ2VGdW5jdGlvbjxhbnksIFRTY29wZT4sXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBGbG93Q2hhcnRPcHRpb25zLFxuKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gIGNvbnN0IGJ1aWxkZXIgPSBuZXcgRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+KCk7XG4gIGlmIChvcHRpb25zPy5zdHJ1Y3R1cmVSZWNvcmRlcnMpIHtcbiAgICBmb3IgKGNvbnN0IHJlYyBvZiBvcHRpb25zLnN0cnVjdHVyZVJlY29yZGVycykge1xuICAgICAgYnVpbGRlci5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcihyZWMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYnVpbGRlci5zdGFydFNlbGVjdG9yKG5hbWUsIGZuLCBpZCwgb3B0aW9ucz8uZGVzY3JpcHRpb24sIHtcbiAgICAuLi4ob3B0aW9ucz8uZmFpbEZhc3QgIT09IHVuZGVmaW5lZCAmJiB7IGZhaWxGYXN0OiBvcHRpb25zLmZhaWxGYXN0IH0pLFxuICAgIC4uLihvcHRpb25zPy5yZXRyeSAmJiB7IHJldHJ5OiBvcHRpb25zLnJldHJ5IH0pLFxuICAgIC4uLihvcHRpb25zPy50b3VjaGVzICYmIHsgdG91Y2hlczogb3B0aW9ucy50b3VjaGVzIH0pLFxuICAgIC4uLihvcHRpb25zPy50YWdzICYmIHsgdGFnczogb3B0aW9ucy50YWdzIH0pLFxuICB9KTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTcGVjIHRvIFN0YWdlTm9kZSBDb252ZXJ0ZXJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgZnVuY3Rpb24gc3BlY1RvU3RhZ2VOb2RlKHNwZWM6IEZsb3dDaGFydFNwZWMpOiBTdGFnZU5vZGU8YW55LCBhbnk+IHtcbiAgY29uc3QgaW5mbGF0ZSA9IChzOiBGbG93Q2hhcnRTcGVjKTogU3RhZ2VOb2RlPGFueSwgYW55PiA9PiAoe1xuICAgIG5hbWU6IHMubmFtZSxcbiAgICBpZDogcy5pZCxcbiAgICBjaGlsZHJlbjogcy5jaGlsZHJlbj8ubGVuZ3RoID8gcy5jaGlsZHJlbi5tYXAoaW5mbGF0ZSkgOiB1bmRlZmluZWQsXG4gICAgbmV4dDogcy5uZXh0ID8gaW5mbGF0ZShzLm5leHQpIDogdW5kZWZpbmVkLFxuICB9KTtcbiAgcmV0dXJuIGluZmxhdGUoc3BlYyk7XG59XG4iXX0=