@decaf-ts/integrations 0.3.8 → 0.3.9

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 (413) hide show
  1. package/dist/integrations.cjs +3 -3
  2. package/dist/integrations.js +3 -3
  3. package/lib/cjs/graph/engine/constants.cjs +58 -0
  4. package/lib/cjs/graph/engine/decorators.cjs +4 -0
  5. package/lib/cjs/graph/engine/errors/GraphCycleError.cjs +20 -0
  6. package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs +27 -0
  7. package/lib/cjs/graph/engine/errors/GraphInputError.cjs +20 -0
  8. package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs +20 -0
  9. package/lib/cjs/graph/engine/errors/GraphPinningError.cjs +20 -0
  10. package/lib/cjs/graph/engine/errors/GraphPortError.cjs +20 -0
  11. package/lib/cjs/graph/engine/errors/GraphStoreError.cjs +20 -0
  12. package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs +20 -0
  13. package/lib/cjs/graph/{errors → engine/errors}/index.cjs +2 -2
  14. package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs +4 -0
  15. package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs +40 -0
  16. package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs +37 -0
  17. package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs +4 -0
  18. package/lib/cjs/graph/{events → engine/events}/index.cjs +2 -2
  19. package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs +4 -0
  20. package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs +79 -0
  21. package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs +408 -0
  22. package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs +32 -0
  23. package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs +30 -0
  24. package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs +4 -0
  25. package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs +103 -0
  26. package/lib/cjs/graph/{execution → engine/execution}/index.cjs +2 -2
  27. package/lib/cjs/graph/engine/index.cjs +84 -0
  28. package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs +87 -0
  29. package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs +85 -0
  30. package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs +85 -0
  31. package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs +16 -0
  32. package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs +77 -0
  33. package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs +78 -0
  34. package/lib/cjs/graph/{loops → engine/loops}/index.cjs +2 -2
  35. package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs +28 -0
  36. package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs +20 -0
  37. package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs +34 -0
  38. package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs +191 -0
  39. package/lib/cjs/graph/{pinning → engine/pinning}/index.cjs +2 -2
  40. package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs +4 -0
  41. package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs +4 -0
  42. package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs +4 -0
  43. package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs +4 -0
  44. package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs +197 -0
  45. package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs +172 -0
  46. package/lib/cjs/graph/engine/planning/GraphTopology.cjs +57 -0
  47. package/lib/cjs/graph/{planning → engine/planning}/index.cjs +2 -2
  48. package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs +44 -0
  49. package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs +27 -0
  50. package/lib/cjs/graph/{registry → engine/registry}/index.cjs +2 -2
  51. package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs +53 -0
  52. package/lib/cjs/graph/{snapshots → engine/snapshots}/index.cjs +2 -2
  53. package/lib/cjs/graph/engine/store/GraphCachedValue.cjs +4 -0
  54. package/lib/cjs/graph/engine/store/GraphValueKey.cjs +4 -0
  55. package/lib/cjs/graph/engine/store/GraphValueStore.cjs +76 -0
  56. package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs +4 -0
  57. package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs +69 -0
  58. package/lib/cjs/graph/{store → engine/store}/index.cjs +2 -2
  59. package/lib/cjs/graph/engine/types.cjs +4 -0
  60. package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs +33 -0
  61. package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs +58 -0
  62. package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs +52 -0
  63. package/lib/cjs/graph/{validation → engine/validation}/index.cjs +2 -2
  64. package/lib/cjs/graph/index.cjs +10 -60
  65. package/lib/cjs/graph/shared/constants.cjs +44 -0
  66. package/lib/cjs/graph/shared/index.cjs +38 -0
  67. package/lib/cjs/graph/{nodes → shared/nodes}/agent.cjs +2 -2
  68. package/lib/cjs/graph/shared/nodes/base.cjs +35 -0
  69. package/lib/cjs/graph/shared/nodes/category-styles.cjs +38 -0
  70. package/lib/cjs/graph/shared/nodes/flow-control.cjs +464 -0
  71. package/lib/cjs/graph/{nodes → shared/nodes}/index.cjs +2 -2
  72. package/lib/cjs/graph/shared/nodes/triggers.cjs +250 -0
  73. package/lib/cjs/graph/shared/types.cjs +4 -0
  74. package/lib/cjs/index.cjs +3 -3
  75. package/lib/esm/graph/engine/constants.js +62 -0
  76. package/lib/esm/graph/engine/decorators.js +2 -0
  77. package/lib/esm/graph/engine/errors/GraphCycleError.js +15 -0
  78. package/lib/esm/graph/engine/errors/GraphExecutionError.js +22 -0
  79. package/lib/esm/graph/engine/errors/GraphInputError.js +15 -0
  80. package/lib/esm/graph/engine/errors/GraphLoopLimitError.js +15 -0
  81. package/lib/esm/graph/engine/errors/GraphPinningError.js +15 -0
  82. package/lib/esm/graph/engine/errors/GraphPortError.js +15 -0
  83. package/lib/esm/graph/engine/errors/GraphStoreError.js +15 -0
  84. package/lib/esm/graph/engine/errors/GraphTopologyError.js +15 -0
  85. package/lib/esm/graph/engine/errors/index.js +14 -0
  86. package/lib/esm/graph/engine/events/GraphExecutionEvent.js +2 -0
  87. package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js +35 -0
  88. package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js +32 -0
  89. package/lib/esm/graph/engine/events/GraphExecutionObserver.js +2 -0
  90. package/lib/esm/graph/engine/events/index.js +10 -0
  91. package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js +18 -0
  92. package/lib/esm/graph/engine/execution/GraphExecutionContext.js +74 -0
  93. package/lib/esm/graph/engine/execution/GraphExecutionEngine.js +403 -0
  94. package/lib/esm/graph/engine/execution/GraphExecutionFrame.js +27 -0
  95. package/lib/esm/graph/engine/execution/GraphExecutionResult.js +26 -0
  96. package/lib/esm/graph/engine/execution/GraphNodeExecutor.js +2 -0
  97. package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +98 -0
  98. package/lib/esm/graph/engine/execution/index.js +13 -0
  99. package/lib/esm/graph/engine/index.js +67 -0
  100. package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js +82 -0
  101. package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js +80 -0
  102. package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js +80 -0
  103. package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js +11 -0
  104. package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js +72 -0
  105. package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js +73 -0
  106. package/lib/esm/graph/engine/loops/index.js +12 -0
  107. package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js +23 -0
  108. package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js +15 -0
  109. package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js +29 -0
  110. package/lib/esm/graph/engine/pinning/GraphPinningService.js +186 -0
  111. package/lib/esm/graph/engine/pinning/index.js +10 -0
  112. package/lib/esm/graph/engine/planning/GraphExecutionPlan.js +2 -0
  113. package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js +7 -0
  114. package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js +2 -0
  115. package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js +2 -0
  116. package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js +192 -0
  117. package/lib/esm/graph/engine/planning/GraphRelationResolver.js +167 -0
  118. package/lib/esm/graph/engine/planning/GraphTopology.js +52 -0
  119. package/lib/esm/graph/engine/planning/index.js +13 -0
  120. package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js +39 -0
  121. package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js +22 -0
  122. package/lib/esm/graph/engine/registry/index.js +8 -0
  123. package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js +48 -0
  124. package/lib/esm/graph/engine/snapshots/index.js +7 -0
  125. package/lib/esm/graph/engine/store/GraphCachedValue.js +2 -0
  126. package/lib/esm/graph/engine/store/GraphValueKey.js +7 -0
  127. package/lib/esm/graph/engine/store/GraphValueStore.js +71 -0
  128. package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js +2 -0
  129. package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js +64 -0
  130. package/lib/esm/graph/engine/store/index.js +11 -0
  131. package/lib/esm/graph/engine/types.js +2 -0
  132. package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js +28 -0
  133. package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js +53 -0
  134. package/lib/esm/graph/engine/validation/GraphValueValidator.js +47 -0
  135. package/lib/esm/graph/engine/validation/index.js +9 -0
  136. package/lib/esm/graph/index.js +9 -59
  137. package/lib/esm/graph/shared/constants.js +56 -0
  138. package/lib/esm/graph/shared/index.js +19 -0
  139. package/lib/esm/graph/shared/nodes/agent.js +101 -0
  140. package/lib/esm/graph/shared/nodes/base.js +30 -0
  141. package/lib/esm/graph/shared/nodes/category-styles.js +34 -0
  142. package/lib/esm/graph/shared/nodes/flow-control.js +455 -0
  143. package/lib/esm/graph/shared/nodes/index.js +18 -0
  144. package/lib/esm/graph/shared/nodes/triggers.js +241 -0
  145. package/lib/esm/graph/shared/types.js +2 -0
  146. package/lib/esm/index.js +3 -3
  147. package/lib/types/graph/engine/constants.d.cts +59 -0
  148. package/lib/types/graph/engine/constants.d.mts +59 -0
  149. package/lib/types/graph/{execution → engine/execution}/GraphExecutionResult.d.cts +1 -1
  150. package/lib/types/graph/{execution → engine/execution}/GraphExecutionResult.d.mts +1 -1
  151. package/lib/types/graph/engine/index.d.cts +61 -0
  152. package/lib/types/graph/engine/index.d.mts +61 -0
  153. package/lib/types/graph/{loops → engine/loops}/ConditionExpressionEvaluator.d.cts +1 -1
  154. package/lib/types/graph/{loops → engine/loops}/ConditionExpressionEvaluator.d.mts +1 -1
  155. package/lib/types/graph/{loops → engine/loops}/GraphConditionEvaluator.d.cts +2 -1
  156. package/lib/types/graph/{loops → engine/loops}/GraphConditionEvaluator.d.mts +2 -1
  157. package/lib/types/graph/{types.d.cts → engine/types.d.cts} +8 -116
  158. package/lib/types/graph/{types.d.mts → engine/types.d.mts} +8 -116
  159. package/lib/types/graph/index.d.cts +8 -53
  160. package/lib/types/graph/index.d.mts +8 -53
  161. package/lib/types/graph/shared/constants.d.cts +53 -0
  162. package/lib/types/graph/shared/constants.d.mts +53 -0
  163. package/lib/types/graph/shared/index.d.cts +18 -0
  164. package/lib/types/graph/shared/index.d.mts +18 -0
  165. package/lib/types/graph/shared/types.d.cts +121 -0
  166. package/lib/types/graph/shared/types.d.mts +121 -0
  167. package/lib/types/index.d.cts +2 -2
  168. package/lib/types/index.d.mts +2 -2
  169. package/package.json +14 -3
  170. package/lib/cjs/graph/constants.cjs +0 -94
  171. package/lib/cjs/graph/decorators.cjs +0 -4
  172. package/lib/cjs/graph/errors/GraphCycleError.cjs +0 -20
  173. package/lib/cjs/graph/errors/GraphExecutionError.cjs +0 -27
  174. package/lib/cjs/graph/errors/GraphInputError.cjs +0 -20
  175. package/lib/cjs/graph/errors/GraphLoopLimitError.cjs +0 -20
  176. package/lib/cjs/graph/errors/GraphPinningError.cjs +0 -20
  177. package/lib/cjs/graph/errors/GraphPortError.cjs +0 -20
  178. package/lib/cjs/graph/errors/GraphStoreError.cjs +0 -20
  179. package/lib/cjs/graph/errors/GraphTopologyError.cjs +0 -20
  180. package/lib/cjs/graph/events/GraphExecutionEvent.cjs +0 -4
  181. package/lib/cjs/graph/events/GraphExecutionEventEmitter.cjs +0 -40
  182. package/lib/cjs/graph/events/GraphExecutionEventFactory.cjs +0 -37
  183. package/lib/cjs/graph/events/GraphExecutionObserver.cjs +0 -4
  184. package/lib/cjs/graph/execution/CodeSandboxEvaluator.cjs +0 -4
  185. package/lib/cjs/graph/execution/GraphExecutionContext.cjs +0 -79
  186. package/lib/cjs/graph/execution/GraphExecutionEngine.cjs +0 -407
  187. package/lib/cjs/graph/execution/GraphExecutionFrame.cjs +0 -32
  188. package/lib/cjs/graph/execution/GraphExecutionResult.cjs +0 -30
  189. package/lib/cjs/graph/execution/GraphNodeExecutor.cjs +0 -4
  190. package/lib/cjs/graph/execution/SwitchGraphNodeExecutor.cjs +0 -103
  191. package/lib/cjs/graph/loops/ConditionExpressionEvaluator.cjs +0 -87
  192. package/lib/cjs/graph/loops/ForeachGraphNodeExecutor.cjs +0 -84
  193. package/lib/cjs/graph/loops/GraphConditionEvaluator.cjs +0 -85
  194. package/lib/cjs/graph/loops/GraphLoopExecutionContext.cjs +0 -16
  195. package/lib/cjs/graph/loops/UntilGraphNodeExecutor.cjs +0 -76
  196. package/lib/cjs/graph/loops/WhileGraphNodeExecutor.cjs +0 -77
  197. package/lib/cjs/graph/nodes/base.cjs +0 -35
  198. package/lib/cjs/graph/nodes/category-styles.cjs +0 -38
  199. package/lib/cjs/graph/nodes/flow-control.cjs +0 -464
  200. package/lib/cjs/graph/nodes/triggers.cjs +0 -250
  201. package/lib/cjs/graph/pinning/GraphPinningDependencyResolver.cjs +0 -28
  202. package/lib/cjs/graph/pinning/GraphPinningMetadata.cjs +0 -20
  203. package/lib/cjs/graph/pinning/GraphPinningPolicy.cjs +0 -34
  204. package/lib/cjs/graph/pinning/GraphPinningService.cjs +0 -191
  205. package/lib/cjs/graph/planning/GraphExecutionPlan.cjs +0 -4
  206. package/lib/cjs/graph/planning/GraphExecutionPlanEdge.cjs +0 -4
  207. package/lib/cjs/graph/planning/GraphExecutionPlanLayer.cjs +0 -4
  208. package/lib/cjs/graph/planning/GraphExecutionPlanNode.cjs +0 -4
  209. package/lib/cjs/graph/planning/GraphExecutionPlanner.cjs +0 -197
  210. package/lib/cjs/graph/planning/GraphRelationResolver.cjs +0 -172
  211. package/lib/cjs/graph/planning/GraphTopology.cjs +0 -57
  212. package/lib/cjs/graph/registry/GraphNodeExecutorRegistry.cjs +0 -44
  213. package/lib/cjs/graph/registry/GraphNodeExecutorResolver.cjs +0 -27
  214. package/lib/cjs/graph/snapshots/GraphExecutionSnapshotMapper.cjs +0 -53
  215. package/lib/cjs/graph/store/GraphCachedValue.cjs +0 -4
  216. package/lib/cjs/graph/store/GraphValueKey.cjs +0 -4
  217. package/lib/cjs/graph/store/GraphValueStore.cjs +0 -76
  218. package/lib/cjs/graph/store/GraphValueStoreAdapter.cjs +0 -4
  219. package/lib/cjs/graph/store/InMemoryGraphValueStoreAdapter.cjs +0 -69
  220. package/lib/cjs/graph/types.cjs +0 -4
  221. package/lib/cjs/graph/validation/GraphDefinitionValidator.cjs +0 -33
  222. package/lib/cjs/graph/validation/GraphPortSchemaResolver.cjs +0 -58
  223. package/lib/cjs/graph/validation/GraphValueValidator.cjs +0 -52
  224. package/lib/esm/graph/constants.js +0 -106
  225. package/lib/esm/graph/decorators.js +0 -2
  226. package/lib/esm/graph/errors/GraphCycleError.js +0 -15
  227. package/lib/esm/graph/errors/GraphExecutionError.js +0 -22
  228. package/lib/esm/graph/errors/GraphInputError.js +0 -15
  229. package/lib/esm/graph/errors/GraphLoopLimitError.js +0 -15
  230. package/lib/esm/graph/errors/GraphPinningError.js +0 -15
  231. package/lib/esm/graph/errors/GraphPortError.js +0 -15
  232. package/lib/esm/graph/errors/GraphStoreError.js +0 -15
  233. package/lib/esm/graph/errors/GraphTopologyError.js +0 -15
  234. package/lib/esm/graph/errors/index.js +0 -14
  235. package/lib/esm/graph/events/GraphExecutionEvent.js +0 -2
  236. package/lib/esm/graph/events/GraphExecutionEventEmitter.js +0 -35
  237. package/lib/esm/graph/events/GraphExecutionEventFactory.js +0 -32
  238. package/lib/esm/graph/events/GraphExecutionObserver.js +0 -2
  239. package/lib/esm/graph/events/index.js +0 -10
  240. package/lib/esm/graph/execution/CodeSandboxEvaluator.js +0 -18
  241. package/lib/esm/graph/execution/GraphExecutionContext.js +0 -74
  242. package/lib/esm/graph/execution/GraphExecutionEngine.js +0 -402
  243. package/lib/esm/graph/execution/GraphExecutionFrame.js +0 -27
  244. package/lib/esm/graph/execution/GraphExecutionResult.js +0 -26
  245. package/lib/esm/graph/execution/GraphNodeExecutor.js +0 -2
  246. package/lib/esm/graph/execution/SwitchGraphNodeExecutor.js +0 -98
  247. package/lib/esm/graph/execution/index.js +0 -13
  248. package/lib/esm/graph/loops/ConditionExpressionEvaluator.js +0 -82
  249. package/lib/esm/graph/loops/ForeachGraphNodeExecutor.js +0 -79
  250. package/lib/esm/graph/loops/GraphConditionEvaluator.js +0 -80
  251. package/lib/esm/graph/loops/GraphLoopExecutionContext.js +0 -11
  252. package/lib/esm/graph/loops/UntilGraphNodeExecutor.js +0 -71
  253. package/lib/esm/graph/loops/WhileGraphNodeExecutor.js +0 -72
  254. package/lib/esm/graph/loops/index.js +0 -12
  255. package/lib/esm/graph/nodes/agent.js +0 -101
  256. package/lib/esm/graph/nodes/base.js +0 -30
  257. package/lib/esm/graph/nodes/category-styles.js +0 -34
  258. package/lib/esm/graph/nodes/flow-control.js +0 -455
  259. package/lib/esm/graph/nodes/index.js +0 -18
  260. package/lib/esm/graph/nodes/triggers.js +0 -241
  261. package/lib/esm/graph/pinning/GraphPinningDependencyResolver.js +0 -23
  262. package/lib/esm/graph/pinning/GraphPinningMetadata.js +0 -15
  263. package/lib/esm/graph/pinning/GraphPinningPolicy.js +0 -29
  264. package/lib/esm/graph/pinning/GraphPinningService.js +0 -186
  265. package/lib/esm/graph/pinning/index.js +0 -10
  266. package/lib/esm/graph/planning/GraphExecutionPlan.js +0 -2
  267. package/lib/esm/graph/planning/GraphExecutionPlanEdge.js +0 -7
  268. package/lib/esm/graph/planning/GraphExecutionPlanLayer.js +0 -2
  269. package/lib/esm/graph/planning/GraphExecutionPlanNode.js +0 -2
  270. package/lib/esm/graph/planning/GraphExecutionPlanner.js +0 -192
  271. package/lib/esm/graph/planning/GraphRelationResolver.js +0 -167
  272. package/lib/esm/graph/planning/GraphTopology.js +0 -52
  273. package/lib/esm/graph/planning/index.js +0 -13
  274. package/lib/esm/graph/registry/GraphNodeExecutorRegistry.js +0 -39
  275. package/lib/esm/graph/registry/GraphNodeExecutorResolver.js +0 -22
  276. package/lib/esm/graph/registry/index.js +0 -8
  277. package/lib/esm/graph/snapshots/GraphExecutionSnapshotMapper.js +0 -48
  278. package/lib/esm/graph/snapshots/index.js +0 -7
  279. package/lib/esm/graph/store/GraphCachedValue.js +0 -2
  280. package/lib/esm/graph/store/GraphValueKey.js +0 -7
  281. package/lib/esm/graph/store/GraphValueStore.js +0 -71
  282. package/lib/esm/graph/store/GraphValueStoreAdapter.js +0 -2
  283. package/lib/esm/graph/store/InMemoryGraphValueStoreAdapter.js +0 -64
  284. package/lib/esm/graph/store/index.js +0 -11
  285. package/lib/esm/graph/types.js +0 -2
  286. package/lib/esm/graph/validation/GraphDefinitionValidator.js +0 -28
  287. package/lib/esm/graph/validation/GraphPortSchemaResolver.js +0 -53
  288. package/lib/esm/graph/validation/GraphValueValidator.js +0 -47
  289. package/lib/esm/graph/validation/index.js +0 -9
  290. package/lib/types/graph/constants.d.cts +0 -101
  291. package/lib/types/graph/constants.d.mts +0 -101
  292. /package/lib/types/graph/{decorators.d.cts → engine/decorators.d.cts} +0 -0
  293. /package/lib/types/graph/{decorators.d.mts → engine/decorators.d.mts} +0 -0
  294. /package/lib/types/graph/{errors → engine/errors}/GraphCycleError.d.cts +0 -0
  295. /package/lib/types/graph/{errors → engine/errors}/GraphCycleError.d.mts +0 -0
  296. /package/lib/types/graph/{errors → engine/errors}/GraphExecutionError.d.cts +0 -0
  297. /package/lib/types/graph/{errors → engine/errors}/GraphExecutionError.d.mts +0 -0
  298. /package/lib/types/graph/{errors → engine/errors}/GraphInputError.d.cts +0 -0
  299. /package/lib/types/graph/{errors → engine/errors}/GraphInputError.d.mts +0 -0
  300. /package/lib/types/graph/{errors → engine/errors}/GraphLoopLimitError.d.cts +0 -0
  301. /package/lib/types/graph/{errors → engine/errors}/GraphLoopLimitError.d.mts +0 -0
  302. /package/lib/types/graph/{errors → engine/errors}/GraphPinningError.d.cts +0 -0
  303. /package/lib/types/graph/{errors → engine/errors}/GraphPinningError.d.mts +0 -0
  304. /package/lib/types/graph/{errors → engine/errors}/GraphPortError.d.cts +0 -0
  305. /package/lib/types/graph/{errors → engine/errors}/GraphPortError.d.mts +0 -0
  306. /package/lib/types/graph/{errors → engine/errors}/GraphStoreError.d.cts +0 -0
  307. /package/lib/types/graph/{errors → engine/errors}/GraphStoreError.d.mts +0 -0
  308. /package/lib/types/graph/{errors → engine/errors}/GraphTopologyError.d.cts +0 -0
  309. /package/lib/types/graph/{errors → engine/errors}/GraphTopologyError.d.mts +0 -0
  310. /package/lib/types/graph/{errors → engine/errors}/index.d.cts +0 -0
  311. /package/lib/types/graph/{errors → engine/errors}/index.d.mts +0 -0
  312. /package/lib/types/graph/{events → engine/events}/GraphExecutionEvent.d.cts +0 -0
  313. /package/lib/types/graph/{events → engine/events}/GraphExecutionEvent.d.mts +0 -0
  314. /package/lib/types/graph/{events → engine/events}/GraphExecutionEventEmitter.d.cts +0 -0
  315. /package/lib/types/graph/{events → engine/events}/GraphExecutionEventEmitter.d.mts +0 -0
  316. /package/lib/types/graph/{events → engine/events}/GraphExecutionEventFactory.d.cts +0 -0
  317. /package/lib/types/graph/{events → engine/events}/GraphExecutionEventFactory.d.mts +0 -0
  318. /package/lib/types/graph/{events → engine/events}/GraphExecutionObserver.d.cts +0 -0
  319. /package/lib/types/graph/{events → engine/events}/GraphExecutionObserver.d.mts +0 -0
  320. /package/lib/types/graph/{events → engine/events}/index.d.cts +0 -0
  321. /package/lib/types/graph/{events → engine/events}/index.d.mts +0 -0
  322. /package/lib/types/graph/{execution → engine/execution}/CodeSandboxEvaluator.d.cts +0 -0
  323. /package/lib/types/graph/{execution → engine/execution}/CodeSandboxEvaluator.d.mts +0 -0
  324. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionContext.d.cts +0 -0
  325. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionContext.d.mts +0 -0
  326. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionEngine.d.cts +0 -0
  327. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionEngine.d.mts +0 -0
  328. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionFrame.d.cts +0 -0
  329. /package/lib/types/graph/{execution → engine/execution}/GraphExecutionFrame.d.mts +0 -0
  330. /package/lib/types/graph/{execution → engine/execution}/GraphNodeExecutor.d.cts +0 -0
  331. /package/lib/types/graph/{execution → engine/execution}/GraphNodeExecutor.d.mts +0 -0
  332. /package/lib/types/graph/{execution → engine/execution}/SwitchGraphNodeExecutor.d.cts +0 -0
  333. /package/lib/types/graph/{execution → engine/execution}/SwitchGraphNodeExecutor.d.mts +0 -0
  334. /package/lib/types/graph/{execution → engine/execution}/index.d.cts +0 -0
  335. /package/lib/types/graph/{execution → engine/execution}/index.d.mts +0 -0
  336. /package/lib/types/graph/{loops → engine/loops}/ForeachGraphNodeExecutor.d.cts +0 -0
  337. /package/lib/types/graph/{loops → engine/loops}/ForeachGraphNodeExecutor.d.mts +0 -0
  338. /package/lib/types/graph/{loops → engine/loops}/GraphLoopExecutionContext.d.cts +0 -0
  339. /package/lib/types/graph/{loops → engine/loops}/GraphLoopExecutionContext.d.mts +0 -0
  340. /package/lib/types/graph/{loops → engine/loops}/UntilGraphNodeExecutor.d.cts +0 -0
  341. /package/lib/types/graph/{loops → engine/loops}/UntilGraphNodeExecutor.d.mts +0 -0
  342. /package/lib/types/graph/{loops → engine/loops}/WhileGraphNodeExecutor.d.cts +0 -0
  343. /package/lib/types/graph/{loops → engine/loops}/WhileGraphNodeExecutor.d.mts +0 -0
  344. /package/lib/types/graph/{loops → engine/loops}/index.d.cts +0 -0
  345. /package/lib/types/graph/{loops → engine/loops}/index.d.mts +0 -0
  346. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningDependencyResolver.d.cts +0 -0
  347. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningDependencyResolver.d.mts +0 -0
  348. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningMetadata.d.cts +0 -0
  349. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningMetadata.d.mts +0 -0
  350. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningPolicy.d.cts +0 -0
  351. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningPolicy.d.mts +0 -0
  352. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningService.d.cts +0 -0
  353. /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningService.d.mts +0 -0
  354. /package/lib/types/graph/{pinning → engine/pinning}/index.d.cts +0 -0
  355. /package/lib/types/graph/{pinning → engine/pinning}/index.d.mts +0 -0
  356. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlan.d.cts +0 -0
  357. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlan.d.mts +0 -0
  358. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanEdge.d.cts +0 -0
  359. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanEdge.d.mts +0 -0
  360. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanLayer.d.cts +0 -0
  361. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanLayer.d.mts +0 -0
  362. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanNode.d.cts +0 -0
  363. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanNode.d.mts +0 -0
  364. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanner.d.cts +0 -0
  365. /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanner.d.mts +0 -0
  366. /package/lib/types/graph/{planning → engine/planning}/GraphRelationResolver.d.cts +0 -0
  367. /package/lib/types/graph/{planning → engine/planning}/GraphRelationResolver.d.mts +0 -0
  368. /package/lib/types/graph/{planning → engine/planning}/GraphTopology.d.cts +0 -0
  369. /package/lib/types/graph/{planning → engine/planning}/GraphTopology.d.mts +0 -0
  370. /package/lib/types/graph/{planning → engine/planning}/index.d.cts +0 -0
  371. /package/lib/types/graph/{planning → engine/planning}/index.d.mts +0 -0
  372. /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorRegistry.d.cts +0 -0
  373. /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorRegistry.d.mts +0 -0
  374. /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorResolver.d.cts +0 -0
  375. /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorResolver.d.mts +0 -0
  376. /package/lib/types/graph/{registry → engine/registry}/index.d.cts +0 -0
  377. /package/lib/types/graph/{registry → engine/registry}/index.d.mts +0 -0
  378. /package/lib/types/graph/{snapshots → engine/snapshots}/GraphExecutionSnapshotMapper.d.cts +0 -0
  379. /package/lib/types/graph/{snapshots → engine/snapshots}/GraphExecutionSnapshotMapper.d.mts +0 -0
  380. /package/lib/types/graph/{snapshots → engine/snapshots}/index.d.cts +0 -0
  381. /package/lib/types/graph/{snapshots → engine/snapshots}/index.d.mts +0 -0
  382. /package/lib/types/graph/{store → engine/store}/GraphCachedValue.d.cts +0 -0
  383. /package/lib/types/graph/{store → engine/store}/GraphCachedValue.d.mts +0 -0
  384. /package/lib/types/graph/{store → engine/store}/GraphValueKey.d.cts +0 -0
  385. /package/lib/types/graph/{store → engine/store}/GraphValueKey.d.mts +0 -0
  386. /package/lib/types/graph/{store → engine/store}/GraphValueStore.d.cts +0 -0
  387. /package/lib/types/graph/{store → engine/store}/GraphValueStore.d.mts +0 -0
  388. /package/lib/types/graph/{store → engine/store}/GraphValueStoreAdapter.d.cts +0 -0
  389. /package/lib/types/graph/{store → engine/store}/GraphValueStoreAdapter.d.mts +0 -0
  390. /package/lib/types/graph/{store → engine/store}/InMemoryGraphValueStoreAdapter.d.cts +0 -0
  391. /package/lib/types/graph/{store → engine/store}/InMemoryGraphValueStoreAdapter.d.mts +0 -0
  392. /package/lib/types/graph/{store → engine/store}/index.d.cts +0 -0
  393. /package/lib/types/graph/{store → engine/store}/index.d.mts +0 -0
  394. /package/lib/types/graph/{validation → engine/validation}/GraphDefinitionValidator.d.cts +0 -0
  395. /package/lib/types/graph/{validation → engine/validation}/GraphDefinitionValidator.d.mts +0 -0
  396. /package/lib/types/graph/{validation → engine/validation}/GraphPortSchemaResolver.d.cts +0 -0
  397. /package/lib/types/graph/{validation → engine/validation}/GraphPortSchemaResolver.d.mts +0 -0
  398. /package/lib/types/graph/{validation → engine/validation}/GraphValueValidator.d.cts +0 -0
  399. /package/lib/types/graph/{validation → engine/validation}/GraphValueValidator.d.mts +0 -0
  400. /package/lib/types/graph/{validation → engine/validation}/index.d.cts +0 -0
  401. /package/lib/types/graph/{validation → engine/validation}/index.d.mts +0 -0
  402. /package/lib/types/graph/{nodes → shared/nodes}/agent.d.cts +0 -0
  403. /package/lib/types/graph/{nodes → shared/nodes}/agent.d.mts +0 -0
  404. /package/lib/types/graph/{nodes → shared/nodes}/base.d.cts +0 -0
  405. /package/lib/types/graph/{nodes → shared/nodes}/base.d.mts +0 -0
  406. /package/lib/types/graph/{nodes → shared/nodes}/category-styles.d.cts +0 -0
  407. /package/lib/types/graph/{nodes → shared/nodes}/category-styles.d.mts +0 -0
  408. /package/lib/types/graph/{nodes → shared/nodes}/flow-control.d.cts +0 -0
  409. /package/lib/types/graph/{nodes → shared/nodes}/flow-control.d.mts +0 -0
  410. /package/lib/types/graph/{nodes → shared/nodes}/index.d.cts +0 -0
  411. /package/lib/types/graph/{nodes → shared/nodes}/index.d.mts +0 -0
  412. /package/lib/types/graph/{nodes → shared/nodes}/triggers.d.cts +0 -0
  413. /package/lib/types/graph/{nodes → shared/nodes}/triggers.d.mts +0 -0
@@ -0,0 +1,192 @@
1
+ import { graphDefinitionOf } from "@decaf-ts/ui-decorators/graph";
2
+ import { GRAPH_WORKFLOW_BOUNDARY } from "./../constants.js";
3
+ import { GraphCycleError } from "./../errors/GraphCycleError.js";
4
+ import { GraphTopologyError } from "./../errors/GraphTopologyError.js";
5
+ import { GraphRelationResolver } from "./GraphRelationResolver.js";
6
+ /**
7
+ * Planner that turns a {@link GraphWorkflowDefinition} into a
8
+ * {@link GraphExecutionPlan} with topological layers.
9
+ */
10
+ export class GraphExecutionPlanner {
11
+ constructor(resolver) {
12
+ this.resolver = resolver ?? new GraphRelationResolver();
13
+ }
14
+ /**
15
+ * Plans a workflow for execution.
16
+ *
17
+ * @param workflow - The workflow definition to plan.
18
+ * @returns The execution plan with nodes, edges, layers, and maps.
19
+ * @throws {GraphTopologyError} when node IDs are not unique.
20
+ * @throws {GraphCycleError} when the workflow contains an unsupported cycle.
21
+ */
22
+ plan(workflow) {
23
+ this.validateUniqueNodeIds(workflow);
24
+ const nodes = this.resolveNodes(workflow);
25
+ const edges = this.resolver.resolve(workflow);
26
+ const incomingByNode = this.buildIncomingMap(edges);
27
+ const outgoingByNode = this.buildOutgoingMap(edges);
28
+ const layers = this.topologicalLayers(nodes, edges);
29
+ return {
30
+ workflow,
31
+ workflowId: workflow.name,
32
+ nodes,
33
+ edges,
34
+ layers,
35
+ incomingByNode,
36
+ outgoingByNode,
37
+ };
38
+ }
39
+ /**
40
+ * Validates that all workflow node IDs are unique.
41
+ */
42
+ validateUniqueNodeIds(workflow) {
43
+ const seen = new Set();
44
+ for (const node of workflow.nodes ?? []) {
45
+ if (seen.has(node.id)) {
46
+ throw new GraphTopologyError(`Duplicate node id '${node.id}' in workflow '${workflow.name}'`, { nodeId: node.id, workflowId: workflow.name });
47
+ }
48
+ seen.add(node.id);
49
+ }
50
+ }
51
+ /**
52
+ * Resolves workflow node metadata into plan nodes with full definitions.
53
+ */
54
+ resolveNodes(workflow) {
55
+ const result = [];
56
+ for (const nodeMeta of workflow.nodes ?? []) {
57
+ const definition = this.resolveDefinition(nodeMeta);
58
+ const inputPorts = (definition.ports ?? [])
59
+ .filter((p) => p.direction === "input")
60
+ .map((p) => p.name);
61
+ const outputPorts = (definition.ports ?? [])
62
+ .filter((p) => p.direction === "output")
63
+ .map((p) => p.name);
64
+ result.push({
65
+ id: nodeMeta.id,
66
+ kind: nodeMeta.kind ?? definition.kind ?? nodeMeta.id,
67
+ label: nodeMeta.label,
68
+ source: nodeMeta,
69
+ definition,
70
+ inputPorts,
71
+ outputPorts,
72
+ metadata: nodeMeta.metadata,
73
+ });
74
+ }
75
+ return result;
76
+ }
77
+ /**
78
+ * Attempts to resolve the full graph node definition from metadata.
79
+ *
80
+ * Accepts either a decorated Model class/instance (resolved via
81
+ * `graphDefinitionOf`) or a plain `GraphNodeDefinition`-shaped object
82
+ * (useful for serialized workflows that inline node definitions).
83
+ */
84
+ resolveDefinition(nodeMeta) {
85
+ if (nodeMeta.node) {
86
+ if (this.isRawDefinition(nodeMeta.node)) {
87
+ return nodeMeta.node;
88
+ }
89
+ try {
90
+ return graphDefinitionOf(nodeMeta.node);
91
+ }
92
+ catch {
93
+ // fall through to stub
94
+ }
95
+ }
96
+ // Return a minimal stub definition so planning can proceed
97
+ return {
98
+ name: nodeMeta.id,
99
+ tag: nodeMeta.id,
100
+ kind: nodeMeta.kind ?? nodeMeta.id,
101
+ labels: [],
102
+ ports: [],
103
+ };
104
+ }
105
+ /**
106
+ * Returns `true` when a value looks like a raw {@link GraphNodeDefinition}
107
+ * (a plain object with a `ports` array and a `name` string).
108
+ */
109
+ isRawDefinition(value) {
110
+ return (typeof value === "object" &&
111
+ value !== null &&
112
+ !Array.isArray(value) &&
113
+ typeof value.name === "string" &&
114
+ Array.isArray(value.ports));
115
+ }
116
+ /**
117
+ * Builds a map of node id -> incoming edges.
118
+ */
119
+ buildIncomingMap(edges) {
120
+ const map = new Map();
121
+ for (const edge of edges) {
122
+ const list = map.get(edge.targetNodeId) ?? [];
123
+ list.push(edge);
124
+ map.set(edge.targetNodeId, list);
125
+ }
126
+ return map;
127
+ }
128
+ /**
129
+ * Builds a map of node id -> outgoing edges.
130
+ */
131
+ buildOutgoingMap(edges) {
132
+ const map = new Map();
133
+ for (const edge of edges) {
134
+ const list = map.get(edge.sourceNodeId) ?? [];
135
+ list.push(edge);
136
+ map.set(edge.sourceNodeId, list);
137
+ }
138
+ return map;
139
+ }
140
+ /**
141
+ * Produces topological layers using Kahn's algorithm.
142
+ *
143
+ * Workflow boundary edges do not count as executable-node dependencies.
144
+ */
145
+ topologicalLayers(nodes, edges) {
146
+ const executableNodes = nodes.filter((n) => n.id !== GRAPH_WORKFLOW_BOUNDARY);
147
+ const nodeIds = new Set(executableNodes.map((n) => n.id));
148
+ // Only edges between two executable nodes count as dependencies
149
+ const execEdges = edges.filter((e) => nodeIds.has(e.sourceNodeId) && nodeIds.has(e.targetNodeId));
150
+ // Compute in-degree
151
+ const indegree = new Map();
152
+ for (const node of executableNodes)
153
+ indegree.set(node.id, 0);
154
+ for (const edge of execEdges) {
155
+ indegree.set(edge.targetNodeId, (indegree.get(edge.targetNodeId) ?? 0) + 1);
156
+ }
157
+ const layers = [];
158
+ const planned = new Set();
159
+ let ready = executableNodes.filter((n) => (indegree.get(n.id) ?? 0) === 0);
160
+ let layerIndex = 0;
161
+ while (ready.length > 0) {
162
+ const layer = { index: layerIndex++, nodes: ready };
163
+ layers.push(layer);
164
+ const nextReady = [];
165
+ for (const node of ready) {
166
+ planned.add(node.id);
167
+ const outgoing = execEdges.filter((e) => e.sourceNodeId === node.id);
168
+ for (const edge of outgoing) {
169
+ const deg = (indegree.get(edge.targetNodeId) ?? 1) - 1;
170
+ indegree.set(edge.targetNodeId, deg);
171
+ if (deg === 0 && !planned.has(edge.targetNodeId)) {
172
+ const next = executableNodes.find((n) => n.id === edge.targetNodeId);
173
+ if (next)
174
+ nextReady.push(next);
175
+ }
176
+ }
177
+ }
178
+ ready = nextReady;
179
+ }
180
+ if (planned.size !== executableNodes.length) {
181
+ const unplanned = executableNodes
182
+ .filter((n) => !planned.has(n.id))
183
+ .map((n) => n.id);
184
+ throw new GraphCycleError({
185
+ unplannedNodes: unplanned,
186
+ workflowId: nodes[0]?.definition?.name,
187
+ });
188
+ }
189
+ return layers;
190
+ }
191
+ }
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFeGVjdXRpb25QbGFubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2dyYXBoL2VuZ2luZS9wbGFubmluZy9HcmFwaEV4ZWN1dGlvblBsYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDBCQUFxQjtBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLHVDQUFrQztBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMENBQXFDO0FBS2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxtQ0FBZ0M7QUFFaEU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQUdoQyxZQUFZLFFBQWdDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQUksQ0FBQyxRQUFpQztRQUNwQyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFckMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFcEQsT0FBTztZQUNMLFFBQVE7WUFDUixVQUFVLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDekIsS0FBSztZQUNMLEtBQUs7WUFDTCxNQUFNO1lBQ04sY0FBYztZQUNkLGNBQWM7U0FDZixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0sscUJBQXFCLENBQUMsUUFBaUM7UUFDN0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUMvQixLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLENBQUM7WUFDeEMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksa0JBQWtCLENBQzFCLHNCQUFzQixJQUFJLENBQUMsRUFBRSxrQkFBa0IsUUFBUSxDQUFDLElBQUksR0FBRyxFQUMvRCxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQy9DLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLFlBQVksQ0FDbEIsUUFBaUM7UUFFakMsTUFBTSxNQUFNLEdBQTZCLEVBQUUsQ0FBQztRQUM1QyxLQUFLLE1BQU0sUUFBUSxJQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLENBQUM7WUFDNUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sVUFBVSxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7aUJBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUM7aUJBQ3RDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sV0FBVyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7aUJBQ3pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUM7aUJBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFO2dCQUNmLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLEVBQUU7Z0JBQ3JELEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztnQkFDckIsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLFVBQVU7Z0JBQ1YsVUFBVTtnQkFDVixXQUFXO2dCQUNYLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTthQUM1QixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLGlCQUFpQixDQUFDLFFBSXpCO1FBQ0MsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxPQUFPLFFBQVEsQ0FBQyxJQUEyQixDQUFDO1lBQzlDLENBQUM7WUFDRCxJQUFJLENBQUM7Z0JBQ0gsT0FBTyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBVyxDQUFDLENBQUM7WUFDakQsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCx1QkFBdUI7WUFDekIsQ0FBQztRQUNILENBQUM7UUFDRCwyREFBMkQ7UUFDM0QsT0FBTztZQUNMLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRTtZQUNqQixHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUU7WUFDaEIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLEVBQUU7WUFDbEMsTUFBTSxFQUFFLEVBQUU7WUFDVixLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZUFBZSxDQUFDLEtBQWM7UUFDcEMsT0FBTyxDQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7WUFDekIsS0FBSyxLQUFLLElBQUk7WUFDZCxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ3JCLE9BQVEsS0FBNEIsQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUN0RCxLQUFLLENBQUMsT0FBTyxDQUFFLEtBQTZCLENBQUMsS0FBSyxDQUFDLENBQ3BELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FDdEIsS0FBK0I7UUFFL0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQW9DLENBQUM7UUFDeEQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQixHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCLENBQ3RCLEtBQStCO1FBRS9CLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFvQyxDQUFDO1FBQ3hELEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssaUJBQWlCLENBQ3ZCLEtBQStCLEVBQy9CLEtBQStCO1FBRS9CLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQ2xDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLHVCQUF1QixDQUN4QyxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFMUQsZ0VBQWdFO1FBQ2hFLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQzVCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FDbEUsQ0FBQztRQUVGLG9CQUFvQjtRQUNwQixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUMzQyxLQUFLLE1BQU0sSUFBSSxJQUFJLGVBQWU7WUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0QsS0FBSyxNQUFNLElBQUksSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM3QixRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQThCLEVBQUUsQ0FBQztRQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2xDLElBQUksS0FBSyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLEtBQUssR0FBNEIsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzdFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkIsTUFBTSxTQUFTLEdBQTZCLEVBQUUsQ0FBQztZQUMvQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDckIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3JFLEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7b0JBQzVCLE1BQU0sR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN2RCxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ3JDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7d0JBQ2pELE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO3dCQUNyRSxJQUFJLElBQUk7NEJBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDakMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELEtBQUssR0FBRyxTQUFTLENBQUM7UUFDcEIsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUMsTUFBTSxTQUFTLEdBQUcsZUFBZTtpQkFDOUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixNQUFNLElBQUksZUFBZSxDQUFDO2dCQUN4QixjQUFjLEVBQUUsU0FBUztnQkFDekIsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSTthQUN2QyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9wbGFubmluZy9HcmFwaEV4ZWN1dGlvblBsYW5uZXJcbiAqIEBzdW1tYXJ5IFRvcG9sb2dpY2FsIHBsYW5uZXIgZm9yIGdyYXBoIHdvcmtmbG93cy5cbiAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlcyB3b3JrZmxvdyBub2RlcyBhbmQgcmVsYXRpb25zLCB2YWxpZGF0ZXMgdG9wb2xvZ3ksIGRldGVjdHMgY3ljbGVzLCBhbmQgcHJvZHVjZXMgdG9wb2xvZ2ljYWwgZXhlY3V0aW9uIGxheWVycyB1c2luZyBLYWhuJ3MgYWxnb3JpdGhtLlxuICovXG5pbXBvcnQgdHlwZSB7XG4gIEdyYXBoTm9kZURlZmluaXRpb24sXG4gIEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uLFxufSBmcm9tIFwiQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMvZ3JhcGhcIjtcbmltcG9ydCB7IGdyYXBoRGVmaW5pdGlvbk9mIH0gZnJvbSBcIkBkZWNhZi10cy91aS1kZWNvcmF0b3JzL2dyYXBoXCI7XG5cbmltcG9ydCB7IEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgR3JhcGhDeWNsZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy9HcmFwaEN5Y2xlRXJyb3JcIjtcbmltcG9ydCB7IEdyYXBoVG9wb2xvZ3lFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhUb3BvbG9neUVycm9yXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uUGxhbiB9IGZyb20gXCIuL0dyYXBoRXhlY3V0aW9uUGxhblwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvblBsYW5Ob2RlIH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25QbGFuTm9kZVwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlIH0gZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25QbGFuRWRnZVwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaEV4ZWN1dGlvblBsYW5MYXllciB9IGZyb20gXCIuL0dyYXBoRXhlY3V0aW9uUGxhbkxheWVyXCI7XG5pbXBvcnQgeyBHcmFwaFJlbGF0aW9uUmVzb2x2ZXIgfSBmcm9tIFwiLi9HcmFwaFJlbGF0aW9uUmVzb2x2ZXJcIjtcblxuLyoqXG4gKiBQbGFubmVyIHRoYXQgdHVybnMgYSB7QGxpbmsgR3JhcGhXb3JrZmxvd0RlZmluaXRpb259IGludG8gYVxuICoge0BsaW5rIEdyYXBoRXhlY3V0aW9uUGxhbn0gd2l0aCB0b3BvbG9naWNhbCBsYXllcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBHcmFwaEV4ZWN1dGlvblBsYW5uZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVyOiBHcmFwaFJlbGF0aW9uUmVzb2x2ZXI7XG5cbiAgY29uc3RydWN0b3IocmVzb2x2ZXI/OiBHcmFwaFJlbGF0aW9uUmVzb2x2ZXIpIHtcbiAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXIgPz8gbmV3IEdyYXBoUmVsYXRpb25SZXNvbHZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYW5zIGEgd29ya2Zsb3cgZm9yIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHdvcmtmbG93IC0gVGhlIHdvcmtmbG93IGRlZmluaXRpb24gdG8gcGxhbi5cbiAgICogQHJldHVybnMgVGhlIGV4ZWN1dGlvbiBwbGFuIHdpdGggbm9kZXMsIGVkZ2VzLCBsYXllcnMsIGFuZCBtYXBzLlxuICAgKiBAdGhyb3dzIHtHcmFwaFRvcG9sb2d5RXJyb3J9IHdoZW4gbm9kZSBJRHMgYXJlIG5vdCB1bmlxdWUuXG4gICAqIEB0aHJvd3Mge0dyYXBoQ3ljbGVFcnJvcn0gd2hlbiB0aGUgd29ya2Zsb3cgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgY3ljbGUuXG4gICAqL1xuICBwbGFuKHdvcmtmbG93OiBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbik6IEdyYXBoRXhlY3V0aW9uUGxhbiB7XG4gICAgdGhpcy52YWxpZGF0ZVVuaXF1ZU5vZGVJZHMod29ya2Zsb3cpO1xuXG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLnJlc29sdmVOb2Rlcyh3b3JrZmxvdyk7XG4gICAgY29uc3QgZWRnZXMgPSB0aGlzLnJlc29sdmVyLnJlc29sdmUod29ya2Zsb3cpO1xuXG4gICAgY29uc3QgaW5jb21pbmdCeU5vZGUgPSB0aGlzLmJ1aWxkSW5jb21pbmdNYXAoZWRnZXMpO1xuICAgIGNvbnN0IG91dGdvaW5nQnlOb2RlID0gdGhpcy5idWlsZE91dGdvaW5nTWFwKGVkZ2VzKTtcblxuICAgIGNvbnN0IGxheWVycyA9IHRoaXMudG9wb2xvZ2ljYWxMYXllcnMobm9kZXMsIGVkZ2VzKTtcblxuICAgIHJldHVybiB7XG4gICAgICB3b3JrZmxvdyxcbiAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93Lm5hbWUsXG4gICAgICBub2RlcyxcbiAgICAgIGVkZ2VzLFxuICAgICAgbGF5ZXJzLFxuICAgICAgaW5jb21pbmdCeU5vZGUsXG4gICAgICBvdXRnb2luZ0J5Tm9kZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IGFsbCB3b3JrZmxvdyBub2RlIElEcyBhcmUgdW5pcXVlLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVVuaXF1ZU5vZGVJZHMod29ya2Zsb3c6IEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB3b3JrZmxvdy5ub2RlcyA/PyBbXSkge1xuICAgICAgaWYgKHNlZW4uaGFzKG5vZGUuaWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBHcmFwaFRvcG9sb2d5RXJyb3IoXG4gICAgICAgICAgYER1cGxpY2F0ZSBub2RlIGlkICcke25vZGUuaWR9JyBpbiB3b3JrZmxvdyAnJHt3b3JrZmxvdy5uYW1lfSdgLFxuICAgICAgICAgIHsgbm9kZUlkOiBub2RlLmlkLCB3b3JrZmxvd0lkOiB3b3JrZmxvdy5uYW1lIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKG5vZGUuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB3b3JrZmxvdyBub2RlIG1ldGFkYXRhIGludG8gcGxhbiBub2RlcyB3aXRoIGZ1bGwgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVOb2RlcyhcbiAgICB3b3JrZmxvdzogR3JhcGhXb3JrZmxvd0RlZmluaXRpb25cbiAgKTogR3JhcGhFeGVjdXRpb25QbGFuTm9kZVtdIHtcbiAgICBjb25zdCByZXN1bHQ6IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgbm9kZU1ldGEgb2Ygd29ya2Zsb3cubm9kZXMgPz8gW10pIHtcbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSB0aGlzLnJlc29sdmVEZWZpbml0aW9uKG5vZGVNZXRhKTtcbiAgICAgIGNvbnN0IGlucHV0UG9ydHMgPSAoZGVmaW5pdGlvbi5wb3J0cyA/PyBbXSlcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcC5kaXJlY3Rpb24gPT09IFwiaW5wdXRcIilcbiAgICAgICAgLm1hcCgocCkgPT4gcC5uYW1lKTtcbiAgICAgIGNvbnN0IG91dHB1dFBvcnRzID0gKGRlZmluaXRpb24ucG9ydHMgPz8gW10pXG4gICAgICAgIC5maWx0ZXIoKHApID0+IHAuZGlyZWN0aW9uID09PSBcIm91dHB1dFwiKVxuICAgICAgICAubWFwKChwKSA9PiBwLm5hbWUpO1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICBpZDogbm9kZU1ldGEuaWQsXG4gICAgICAgIGtpbmQ6IG5vZGVNZXRhLmtpbmQgPz8gZGVmaW5pdGlvbi5raW5kID8/IG5vZGVNZXRhLmlkLFxuICAgICAgICBsYWJlbDogbm9kZU1ldGEubGFiZWwsXG4gICAgICAgIHNvdXJjZTogbm9kZU1ldGEsXG4gICAgICAgIGRlZmluaXRpb24sXG4gICAgICAgIGlucHV0UG9ydHMsXG4gICAgICAgIG91dHB1dFBvcnRzLFxuICAgICAgICBtZXRhZGF0YTogbm9kZU1ldGEubWV0YWRhdGEsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byByZXNvbHZlIHRoZSBmdWxsIGdyYXBoIG5vZGUgZGVmaW5pdGlvbiBmcm9tIG1ldGFkYXRhLlxuICAgKlxuICAgKiBBY2NlcHRzIGVpdGhlciBhIGRlY29yYXRlZCBNb2RlbCBjbGFzcy9pbnN0YW5jZSAocmVzb2x2ZWQgdmlhXG4gICAqIGBncmFwaERlZmluaXRpb25PZmApIG9yIGEgcGxhaW4gYEdyYXBoTm9kZURlZmluaXRpb25gLXNoYXBlZCBvYmplY3RcbiAgICogKHVzZWZ1bCBmb3Igc2VyaWFsaXplZCB3b3JrZmxvd3MgdGhhdCBpbmxpbmUgbm9kZSBkZWZpbml0aW9ucykuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVEZWZpbml0aW9uKG5vZGVNZXRhOiB7XG4gICAgbm9kZT86IHVua25vd247XG4gICAga2luZD86IHN0cmluZztcbiAgICBpZDogc3RyaW5nO1xuICB9KTogR3JhcGhOb2RlRGVmaW5pdGlvbiB7XG4gICAgaWYgKG5vZGVNZXRhLm5vZGUpIHtcbiAgICAgIGlmICh0aGlzLmlzUmF3RGVmaW5pdGlvbihub2RlTWV0YS5ub2RlKSkge1xuICAgICAgICByZXR1cm4gbm9kZU1ldGEubm9kZSBhcyBHcmFwaE5vZGVEZWZpbml0aW9uO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGdyYXBoRGVmaW5pdGlvbk9mKG5vZGVNZXRhLm5vZGUgYXMgYW55KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gc3R1YlxuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXR1cm4gYSBtaW5pbWFsIHN0dWIgZGVmaW5pdGlvbiBzbyBwbGFubmluZyBjYW4gcHJvY2VlZFxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBub2RlTWV0YS5pZCxcbiAgICAgIHRhZzogbm9kZU1ldGEuaWQsXG4gICAgICBraW5kOiBub2RlTWV0YS5raW5kID8/IG5vZGVNZXRhLmlkLFxuICAgICAgbGFiZWxzOiBbXSxcbiAgICAgIHBvcnRzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIHdoZW4gYSB2YWx1ZSBsb29rcyBsaWtlIGEgcmF3IHtAbGluayBHcmFwaE5vZGVEZWZpbml0aW9ufVxuICAgKiAoYSBwbGFpbiBvYmplY3Qgd2l0aCBhIGBwb3J0c2AgYXJyYXkgYW5kIGEgYG5hbWVgIHN0cmluZykuXG4gICAqL1xuICBwcml2YXRlIGlzUmF3RGVmaW5pdGlvbih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgeyBuYW1lPzogdW5rbm93biB9KS5uYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICBBcnJheS5pc0FycmF5KCh2YWx1ZSBhcyB7IHBvcnRzPzogdW5rbm93biB9KS5wb3J0cylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG1hcCBvZiBub2RlIGlkIC0+IGluY29taW5nIGVkZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEluY29taW5nTWFwKFxuICAgIGVkZ2VzOiBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlW11cbiAgKTogTWFwPHN0cmluZywgR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdPiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2VbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgZWRnZXMpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBtYXAuZ2V0KGVkZ2UudGFyZ2V0Tm9kZUlkKSA/PyBbXTtcbiAgICAgIGxpc3QucHVzaChlZGdlKTtcbiAgICAgIG1hcC5zZXQoZWRnZS50YXJnZXROb2RlSWQsIGxpc3QpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG1hcCBvZiBub2RlIGlkIC0+IG91dGdvaW5nIGVkZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE91dGdvaW5nTWFwKFxuICAgIGVkZ2VzOiBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlW11cbiAgKTogTWFwPHN0cmluZywgR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdPiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2VbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgZWRnZXMpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBtYXAuZ2V0KGVkZ2Uuc291cmNlTm9kZUlkKSA/PyBbXTtcbiAgICAgIGxpc3QucHVzaChlZGdlKTtcbiAgICAgIG1hcC5zZXQoZWRnZS5zb3VyY2VOb2RlSWQsIGxpc3QpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2R1Y2VzIHRvcG9sb2dpY2FsIGxheWVycyB1c2luZyBLYWhuJ3MgYWxnb3JpdGhtLlxuICAgKlxuICAgKiBXb3JrZmxvdyBib3VuZGFyeSBlZGdlcyBkbyBub3QgY291bnQgYXMgZXhlY3V0YWJsZS1ub2RlIGRlcGVuZGVuY2llcy5cbiAgICovXG4gIHByaXZhdGUgdG9wb2xvZ2ljYWxMYXllcnMoXG4gICAgbm9kZXM6IEdyYXBoRXhlY3V0aW9uUGxhbk5vZGVbXSxcbiAgICBlZGdlczogR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdXG4gICk6IEdyYXBoRXhlY3V0aW9uUGxhbkxheWVyW10ge1xuICAgIGNvbnN0IGV4ZWN1dGFibGVOb2RlcyA9IG5vZGVzLmZpbHRlcihcbiAgICAgIChuKSA9PiBuLmlkICE9PSBHUkFQSF9XT1JLRkxPV19CT1VOREFSWVxuICAgICk7XG4gICAgY29uc3Qgbm9kZUlkcyA9IG5ldyBTZXQoZXhlY3V0YWJsZU5vZGVzLm1hcCgobikgPT4gbi5pZCkpO1xuXG4gICAgLy8gT25seSBlZGdlcyBiZXR3ZWVuIHR3byBleGVjdXRhYmxlIG5vZGVzIGNvdW50IGFzIGRlcGVuZGVuY2llc1xuICAgIGNvbnN0IGV4ZWNFZGdlcyA9IGVkZ2VzLmZpbHRlcihcbiAgICAgIChlKSA9PiBub2RlSWRzLmhhcyhlLnNvdXJjZU5vZGVJZCkgJiYgbm9kZUlkcy5oYXMoZS50YXJnZXROb2RlSWQpXG4gICAgKTtcblxuICAgIC8vIENvbXB1dGUgaW4tZGVncmVlXG4gICAgY29uc3QgaW5kZWdyZWUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBleGVjdXRhYmxlTm9kZXMpIGluZGVncmVlLnNldChub2RlLmlkLCAwKTtcbiAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgZXhlY0VkZ2VzKSB7XG4gICAgICBpbmRlZ3JlZS5zZXQoZWRnZS50YXJnZXROb2RlSWQsIChpbmRlZ3JlZS5nZXQoZWRnZS50YXJnZXROb2RlSWQpID8/IDApICsgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5ZXJzOiBHcmFwaEV4ZWN1dGlvblBsYW5MYXllcltdID0gW107XG4gICAgY29uc3QgcGxhbm5lZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCByZWFkeSA9IGV4ZWN1dGFibGVOb2Rlcy5maWx0ZXIoKG4pID0+IChpbmRlZ3JlZS5nZXQobi5pZCkgPz8gMCkgPT09IDApO1xuICAgIGxldCBsYXllckluZGV4ID0gMDtcblxuICAgIHdoaWxlIChyZWFkeS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXllcjogR3JhcGhFeGVjdXRpb25QbGFuTGF5ZXIgPSB7IGluZGV4OiBsYXllckluZGV4KyssIG5vZGVzOiByZWFkeSB9O1xuICAgICAgbGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgY29uc3QgbmV4dFJlYWR5OiBHcmFwaEV4ZWN1dGlvblBsYW5Ob2RlW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiByZWFkeSkge1xuICAgICAgICBwbGFubmVkLmFkZChub2RlLmlkKTtcbiAgICAgICAgY29uc3Qgb3V0Z29pbmcgPSBleGVjRWRnZXMuZmlsdGVyKChlKSA9PiBlLnNvdXJjZU5vZGVJZCA9PT0gbm9kZS5pZCk7XG4gICAgICAgIGZvciAoY29uc3QgZWRnZSBvZiBvdXRnb2luZykge1xuICAgICAgICAgIGNvbnN0IGRlZyA9IChpbmRlZ3JlZS5nZXQoZWRnZS50YXJnZXROb2RlSWQpID8/IDEpIC0gMTtcbiAgICAgICAgICBpbmRlZ3JlZS5zZXQoZWRnZS50YXJnZXROb2RlSWQsIGRlZyk7XG4gICAgICAgICAgaWYgKGRlZyA9PT0gMCAmJiAhcGxhbm5lZC5oYXMoZWRnZS50YXJnZXROb2RlSWQpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gZXhlY3V0YWJsZU5vZGVzLmZpbmQoKG4pID0+IG4uaWQgPT09IGVkZ2UudGFyZ2V0Tm9kZUlkKTtcbiAgICAgICAgICAgIGlmIChuZXh0KSBuZXh0UmVhZHkucHVzaChuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlYWR5ID0gbmV4dFJlYWR5O1xuICAgIH1cblxuICAgIGlmIChwbGFubmVkLnNpemUgIT09IGV4ZWN1dGFibGVOb2Rlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVucGxhbm5lZCA9IGV4ZWN1dGFibGVOb2Rlc1xuICAgICAgICAuZmlsdGVyKChuKSA9PiAhcGxhbm5lZC5oYXMobi5pZCkpXG4gICAgICAgIC5tYXAoKG4pID0+IG4uaWQpO1xuICAgICAgdGhyb3cgbmV3IEdyYXBoQ3ljbGVFcnJvcih7XG4gICAgICAgIHVucGxhbm5lZE5vZGVzOiB1bnBsYW5uZWQsXG4gICAgICAgIHdvcmtmbG93SWQ6IG5vZGVzWzBdPy5kZWZpbml0aW9uPy5uYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxheWVycztcbiAgfVxufVxuIl19
@@ -0,0 +1,167 @@
1
+ import { graphDefinitionOf } from "@decaf-ts/ui-decorators/graph";
2
+ import { GRAPH_WORKFLOW_BOUNDARY } from "./../constants.js";
3
+ import { GraphPortError } from "./../errors/GraphPortError.js";
4
+ import { GraphTopologyError } from "./../errors/GraphTopologyError.js";
5
+ /**
6
+ * Resolves raw workflow relation metadata into normalized execution edges.
7
+ */
8
+ export class GraphRelationResolver {
9
+ /**
10
+ * Resolves all relations of a workflow into execution edges.
11
+ *
12
+ * @param workflow - The workflow definition.
13
+ * @returns Array of normalized edges.
14
+ * @throws {GraphTopologyError} when an endpoint is unknown or ambiguous.
15
+ * @throws {GraphPortError} when a referenced port is missing or unknown.
16
+ */
17
+ resolve(workflow) {
18
+ const nodeIds = new Set(workflow.nodes.map((n) => n.id));
19
+ const boundaryAliases = this.boundaryAliases(workflow);
20
+ const inputPorts = this.portNames(workflow.inputs);
21
+ const outputPorts = this.portNames(workflow.outputs);
22
+ const nodePortMap = this.buildNodePortMap(workflow);
23
+ const edges = [];
24
+ for (const relation of workflow.relations ?? []) {
25
+ const edge = this.resolveRelation(relation, nodeIds, boundaryAliases, inputPorts, outputPorts, nodePortMap);
26
+ edges.push(edge);
27
+ }
28
+ return edges;
29
+ }
30
+ /**
31
+ * Resolves a single relation into an edge.
32
+ */
33
+ resolveRelation(relation, nodeIds, boundaryAliases, inputPorts, outputPorts, nodePortMap) {
34
+ const sourceNodeId = this.resolveEndpoint(relation.source, nodeIds, boundaryAliases);
35
+ const targetNodeId = this.resolveEndpoint(relation.target, nodeIds, boundaryAliases);
36
+ const sourcePort = relation.sourcePort;
37
+ const targetPort = relation.targetPort;
38
+ if (!sourcePort) {
39
+ throw new GraphPortError(`Relation is missing sourcePort (source: ${String(relation.source)}, target: ${String(relation.target)})`, { relation });
40
+ }
41
+ if (!targetPort) {
42
+ throw new GraphPortError(`Relation is missing targetPort (source: ${String(relation.source)}, target: ${String(relation.target)})`, { relation });
43
+ }
44
+ this.validatePort(sourceNodeId, sourcePort, true, boundaryAliases, inputPorts, outputPorts, nodePortMap);
45
+ this.validatePort(targetNodeId, targetPort, false, boundaryAliases, inputPorts, outputPorts, nodePortMap);
46
+ return {
47
+ id: this.createEdgeId(sourceNodeId, sourcePort, targetNodeId, targetPort),
48
+ sourceNodeId,
49
+ sourcePort,
50
+ targetNodeId,
51
+ targetPort,
52
+ label: relation.label,
53
+ metadata: relation.metadata,
54
+ };
55
+ }
56
+ /**
57
+ * Resolves an endpoint (source or target) to a node id or the workflow boundary.
58
+ */
59
+ resolveEndpoint(endpoint, nodeIds, boundaryAliases) {
60
+ const name = String(endpoint);
61
+ if (boundaryAliases.has(name))
62
+ return GRAPH_WORKFLOW_BOUNDARY;
63
+ if (nodeIds.has(name))
64
+ return name;
65
+ throw new GraphTopologyError(`Unknown endpoint '${name}'`, { endpoint: name, knownNodes: Array.from(nodeIds) });
66
+ }
67
+ /**
68
+ * Validates that a port exists on the given node or boundary.
69
+ */
70
+ validatePort(nodeId, port, isSource, boundaryAliases, inputPorts, outputPorts, nodePortMap) {
71
+ if (nodeId === GRAPH_WORKFLOW_BOUNDARY) {
72
+ const ports = isSource ? inputPorts : outputPorts;
73
+ if (!ports.has(port)) {
74
+ throw new GraphPortError(`Unknown ${isSource ? "input" : "output"} port '${port}' on workflow boundary`, { nodeId, port, isSource, available: Array.from(ports) });
75
+ }
76
+ return;
77
+ }
78
+ const nodePorts = nodePortMap.get(nodeId);
79
+ if (!nodePorts) {
80
+ throw new GraphTopologyError(`No port map for node '${nodeId}'`, {
81
+ nodeId,
82
+ });
83
+ }
84
+ const ports = isSource ? nodePorts.output : nodePorts.input;
85
+ if (!ports.has(port)) {
86
+ throw new GraphPortError(`Unknown ${isSource ? "output" : "input"} port '${port}' on node '${nodeId}'`, { nodeId, port, isSource, available: Array.from(ports) });
87
+ }
88
+ }
89
+ /**
90
+ * Builds the set of boundary aliases for a workflow.
91
+ */
92
+ boundaryAliases(workflow) {
93
+ return new Set([
94
+ GRAPH_WORKFLOW_BOUNDARY,
95
+ "workflow",
96
+ "graph",
97
+ workflow.name,
98
+ ]);
99
+ }
100
+ /**
101
+ * Extracts port names from a list of port definitions.
102
+ */
103
+ portNames(ports) {
104
+ return new Set((ports ?? []).map((p) => p.name));
105
+ }
106
+ /**
107
+ * Builds a map of node id -> { input ports, output ports }.
108
+ */
109
+ buildNodePortMap(workflow) {
110
+ const map = new Map();
111
+ for (const nodeMeta of workflow.nodes ?? []) {
112
+ const input = new Set();
113
+ const output = new Set();
114
+ const def = this.resolveNodeDefinition(nodeMeta);
115
+ if (def) {
116
+ for (const port of def.ports ?? []) {
117
+ if (port.direction === "input")
118
+ input.add(port.name);
119
+ else
120
+ output.add(port.name);
121
+ }
122
+ }
123
+ map.set(nodeMeta.id, { input, output });
124
+ }
125
+ return map;
126
+ }
127
+ /**
128
+ * Attempts to resolve a node's full definition from its metadata.
129
+ *
130
+ * Accepts either a decorated Model class/instance (resolved via
131
+ * `graphDefinitionOf`) or a plain `GraphNodeDefinition`-shaped object
132
+ * (useful for serialized workflows that inline node definitions).
133
+ */
134
+ resolveNodeDefinition(nodeMeta) {
135
+ if (nodeMeta.node) {
136
+ if (this.isRawDefinition(nodeMeta.node)) {
137
+ return nodeMeta.node;
138
+ }
139
+ try {
140
+ const def = graphDefinitionOf(nodeMeta.node);
141
+ return def;
142
+ }
143
+ catch {
144
+ return undefined;
145
+ }
146
+ }
147
+ return undefined;
148
+ }
149
+ /**
150
+ * Returns `true` when a value looks like a raw {@link GraphNodeDefinition}
151
+ * (a plain object with a `ports` array and a `name` string).
152
+ */
153
+ isRawDefinition(value) {
154
+ return (typeof value === "object" &&
155
+ value !== null &&
156
+ !Array.isArray(value) &&
157
+ typeof value.name === "string" &&
158
+ Array.isArray(value.ports));
159
+ }
160
+ /**
161
+ * Creates a stable edge id from its endpoints and ports.
162
+ */
163
+ createEdgeId(sourceNodeId, sourcePort, targetNodeId, targetPort) {
164
+ return `${sourceNodeId}:${sourcePort}->${targetNodeId}:${targetPort}`;
165
+ }
166
+ }
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhSZWxhdGlvblJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2dyYXBoL2VuZ2luZS9wbGFubmluZy9HcmFwaFJlbGF0aW9uUmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDBCQUFxQjtBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLHNDQUFpQztBQUMxRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMENBQXFDO0FBR2xFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQzs7Ozs7OztPQU9HO0lBQ0gsT0FBTyxDQUFDLFFBQWlDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVwRCxNQUFNLEtBQUssR0FBNkIsRUFBRSxDQUFDO1FBRTNDLEtBQUssTUFBTSxRQUFRLElBQUksUUFBUSxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNoRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUMvQixRQUFRLEVBQ1IsT0FB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SUFDSyxxQkFBcUIsQ0FDM0IsUUFBMkM7UUFFM0MsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxPQUFPLFFBQVEsQ0FBQyxJQUVmLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFXLENBQUMsQ0FBQztnQkFDcEQsT0FBTyxHQUFVLENBQUM7WUFDcEIsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDSyxlQUFlLENBQUMsS0FBYztRQUNwQyxPQUFPLENBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtZQUN6QixLQUFLLEtBQUssSUFBSTtZQUNkLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDckIsT0FBUSxLQUE0QixDQUFDLElBQUksS0FBSyxRQUFRO1lBQ3RELEtBQUssQ0FBQyxPQUFPLENBQUUsS0FBNkIsQ0FBQyxLQUFLLENBQUMsQ0FDcEQsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLFlBQVksQ0FDbEIsWUFBb0IsRUFDcEIsVUFBa0IsRUFDbEIsWUFBb0IsRUFDcEIsVUFBa0I7UUFFbEIsT0FBTyxHQUFHLFlBQVksSUFBSSxVQUFVLEtBQUssWUFBWSxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ3hFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnMvZ3JhcGgvcGxhbm5pbmcvR3JhcGhSZWxhdGlvblJlc29sdmVyXG4gKiBAc3VtbWFyeSBOb3JtYWxpemVzIHdvcmtmbG93IHJlbGF0aW9ucyBpbnRvIGV4ZWN1dGlvbiBlZGdlcy5cbiAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlcyB3b3JrZmxvdyBib3VuZGFyeSBhbGlhc2VzLCB2YWxpZGF0ZXMgZW5kcG9pbnRzIGFuZCBwb3J0cywgYW5kIHByb2R1Y2VzIHN0YWJsZSBlZGdlIElEcy5cbiAqL1xuaW1wb3J0IHR5cGUge1xuICBHcmFwaFBvcnREZWZpbml0aW9uLFxuICBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbixcbiAgR3JhcGhXb3JrZmxvd1JlbGF0aW9uTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvdWktZGVjb3JhdG9ycy9ncmFwaFwiO1xuaW1wb3J0IHsgZ3JhcGhEZWZpbml0aW9uT2YgfSBmcm9tIFwiQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMvZ3JhcGhcIjtcblxuaW1wb3J0IHsgR1JBUEhfV09SS0ZMT1dfQk9VTkRBUlkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBHcmFwaFBvcnRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhQb3J0RXJyb3JcIjtcbmltcG9ydCB7IEdyYXBoVG9wb2xvZ3lFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhUb3BvbG9neUVycm9yXCI7XG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2UgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvblBsYW5FZGdlXCI7XG5cbi8qKlxuICogUmVzb2x2ZXMgcmF3IHdvcmtmbG93IHJlbGF0aW9uIG1ldGFkYXRhIGludG8gbm9ybWFsaXplZCBleGVjdXRpb24gZWRnZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBHcmFwaFJlbGF0aW9uUmVzb2x2ZXIge1xuICAvKipcbiAgICogUmVzb2x2ZXMgYWxsIHJlbGF0aW9ucyBvZiBhIHdvcmtmbG93IGludG8gZXhlY3V0aW9uIGVkZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gd29ya2Zsb3cgLSBUaGUgd29ya2Zsb3cgZGVmaW5pdGlvbi5cbiAgICogQHJldHVybnMgQXJyYXkgb2Ygbm9ybWFsaXplZCBlZGdlcy5cbiAgICogQHRocm93cyB7R3JhcGhUb3BvbG9neUVycm9yfSB3aGVuIGFuIGVuZHBvaW50IGlzIHVua25vd24gb3IgYW1iaWd1b3VzLlxuICAgKiBAdGhyb3dzIHtHcmFwaFBvcnRFcnJvcn0gd2hlbiBhIHJlZmVyZW5jZWQgcG9ydCBpcyBtaXNzaW5nIG9yIHVua25vd24uXG4gICAqL1xuICByZXNvbHZlKHdvcmtmbG93OiBHcmFwaFdvcmtmbG93RGVmaW5pdGlvbik6IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2VbXSB7XG4gICAgY29uc3Qgbm9kZUlkcyA9IG5ldyBTZXQod29ya2Zsb3cubm9kZXMubWFwKChuKSA9PiBuLmlkKSk7XG4gICAgY29uc3QgYm91bmRhcnlBbGlhc2VzID0gdGhpcy5ib3VuZGFyeUFsaWFzZXMod29ya2Zsb3cpO1xuICAgIGNvbnN0IGlucHV0UG9ydHMgPSB0aGlzLnBvcnROYW1lcyh3b3JrZmxvdy5pbnB1dHMpO1xuICAgIGNvbnN0IG91dHB1dFBvcnRzID0gdGhpcy5wb3J0TmFtZXMod29ya2Zsb3cub3V0cHV0cyk7XG4gICAgY29uc3Qgbm9kZVBvcnRNYXAgPSB0aGlzLmJ1aWxkTm9kZVBvcnRNYXAod29ya2Zsb3cpO1xuXG4gICAgY29uc3QgZWRnZXM6IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2VbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbiBvZiB3b3JrZmxvdy5yZWxhdGlvbnMgPz8gW10pIHtcbiAgICAgIGNvbnN0IGVkZ2UgPSB0aGlzLnJlc29sdmVSZWxhdGlvbihcbiAgICAgICAgcmVsYXRpb24sXG4gICAgICAgIG5vZGVJZHMsXG4gICAgICAgIGJvdW5kYXJ5QWxpYXNlcyxcbiAgICAgICAgaW5wdXRQb3J0cyxcbiAgICAgICAgb3V0cHV0UG9ydHMsXG4gICAgICAgIG5vZGVQb3J0TWFwXG4gICAgICApO1xuICAgICAgZWRnZXMucHVzaChlZGdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWRnZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBzaW5nbGUgcmVsYXRpb24gaW50byBhbiBlZGdlLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlUmVsYXRpb24oXG4gICAgcmVsYXRpb246IEdyYXBoV29ya2Zsb3dSZWxhdGlvbk1ldGFkYXRhLFxuICAgIG5vZGVJZHM6IFNldDxzdHJpbmc+LFxuICAgIGJvdW5kYXJ5QWxpYXNlczogU2V0PHN0cmluZz4sXG4gICAgaW5wdXRQb3J0czogU2V0PHN0cmluZz4sXG4gICAgb3V0cHV0UG9ydHM6IFNldDxzdHJpbmc+LFxuICAgIG5vZGVQb3J0TWFwOiBNYXA8c3RyaW5nLCB7IGlucHV0OiBTZXQ8c3RyaW5nPjsgb3V0cHV0OiBTZXQ8c3RyaW5nPiB9PlxuICApOiBHcmFwaEV4ZWN1dGlvblBsYW5FZGdlIHtcbiAgICBjb25zdCBzb3VyY2VOb2RlSWQgPSB0aGlzLnJlc29sdmVFbmRwb2ludChcbiAgICAgIHJlbGF0aW9uLnNvdXJjZSxcbiAgICAgIG5vZGVJZHMsXG4gICAgICBib3VuZGFyeUFsaWFzZXNcbiAgICApO1xuICAgIGNvbnN0IHRhcmdldE5vZGVJZCA9IHRoaXMucmVzb2x2ZUVuZHBvaW50KFxuICAgICAgcmVsYXRpb24udGFyZ2V0LFxuICAgICAgbm9kZUlkcyxcbiAgICAgIGJvdW5kYXJ5QWxpYXNlc1xuICAgICk7XG5cbiAgICBjb25zdCBzb3VyY2VQb3J0ID0gcmVsYXRpb24uc291cmNlUG9ydDtcbiAgICBjb25zdCB0YXJnZXRQb3J0ID0gcmVsYXRpb24udGFyZ2V0UG9ydDtcblxuICAgIGlmICghc291cmNlUG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEdyYXBoUG9ydEVycm9yKFxuICAgICAgICBgUmVsYXRpb24gaXMgbWlzc2luZyBzb3VyY2VQb3J0IChzb3VyY2U6ICR7U3RyaW5nKHJlbGF0aW9uLnNvdXJjZSl9LCB0YXJnZXQ6ICR7U3RyaW5nKHJlbGF0aW9uLnRhcmdldCl9KWAsXG4gICAgICAgIHsgcmVsYXRpb24gfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0YXJnZXRQb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgR3JhcGhQb3J0RXJyb3IoXG4gICAgICAgIGBSZWxhdGlvbiBpcyBtaXNzaW5nIHRhcmdldFBvcnQgKHNvdXJjZTogJHtTdHJpbmcocmVsYXRpb24uc291cmNlKX0sIHRhcmdldDogJHtTdHJpbmcocmVsYXRpb24udGFyZ2V0KX0pYCxcbiAgICAgICAgeyByZWxhdGlvbiB9XG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMudmFsaWRhdGVQb3J0KFxuICAgICAgc291cmNlTm9kZUlkLFxuICAgICAgc291cmNlUG9ydCxcbiAgICAgIHRydWUsXG4gICAgICBib3VuZGFyeUFsaWFzZXMsXG4gICAgICBpbnB1dFBvcnRzLFxuICAgICAgb3V0cHV0UG9ydHMsXG4gICAgICBub2RlUG9ydE1hcFxuICAgICk7XG4gICAgdGhpcy52YWxpZGF0ZVBvcnQoXG4gICAgICB0YXJnZXROb2RlSWQsXG4gICAgICB0YXJnZXRQb3J0LFxuICAgICAgZmFsc2UsXG4gICAgICBib3VuZGFyeUFsaWFzZXMsXG4gICAgICBpbnB1dFBvcnRzLFxuICAgICAgb3V0cHV0UG9ydHMsXG4gICAgICBub2RlUG9ydE1hcFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuY3JlYXRlRWRnZUlkKHNvdXJjZU5vZGVJZCwgc291cmNlUG9ydCwgdGFyZ2V0Tm9kZUlkLCB0YXJnZXRQb3J0KSxcbiAgICAgIHNvdXJjZU5vZGVJZCxcbiAgICAgIHNvdXJjZVBvcnQsXG4gICAgICB0YXJnZXROb2RlSWQsXG4gICAgICB0YXJnZXRQb3J0LFxuICAgICAgbGFiZWw6IHJlbGF0aW9uLmxhYmVsLFxuICAgICAgbWV0YWRhdGE6IHJlbGF0aW9uLm1ldGFkYXRhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW4gZW5kcG9pbnQgKHNvdXJjZSBvciB0YXJnZXQpIHRvIGEgbm9kZSBpZCBvciB0aGUgd29ya2Zsb3cgYm91bmRhcnkuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVFbmRwb2ludChcbiAgICBlbmRwb2ludDogc3RyaW5nIHwgdW5rbm93bixcbiAgICBub2RlSWRzOiBTZXQ8c3RyaW5nPixcbiAgICBib3VuZGFyeUFsaWFzZXM6IFNldDxzdHJpbmc+XG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IFN0cmluZyhlbmRwb2ludCk7XG4gICAgaWYgKGJvdW5kYXJ5QWxpYXNlcy5oYXMobmFtZSkpIHJldHVybiBHUkFQSF9XT1JLRkxPV19CT1VOREFSWTtcbiAgICBpZiAobm9kZUlkcy5oYXMobmFtZSkpIHJldHVybiBuYW1lO1xuICAgIHRocm93IG5ldyBHcmFwaFRvcG9sb2d5RXJyb3IoXG4gICAgICBgVW5rbm93biBlbmRwb2ludCAnJHtuYW1lfSdgLFxuICAgICAgeyBlbmRwb2ludDogbmFtZSwga25vd25Ob2RlczogQXJyYXkuZnJvbShub2RlSWRzKSB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCBhIHBvcnQgZXhpc3RzIG9uIHRoZSBnaXZlbiBub2RlIG9yIGJvdW5kYXJ5LlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBvcnQoXG4gICAgbm9kZUlkOiBzdHJpbmcsXG4gICAgcG9ydDogc3RyaW5nLFxuICAgIGlzU291cmNlOiBib29sZWFuLFxuICAgIGJvdW5kYXJ5QWxpYXNlczogU2V0PHN0cmluZz4sXG4gICAgaW5wdXRQb3J0czogU2V0PHN0cmluZz4sXG4gICAgb3V0cHV0UG9ydHM6IFNldDxzdHJpbmc+LFxuICAgIG5vZGVQb3J0TWFwOiBNYXA8c3RyaW5nLCB7IGlucHV0OiBTZXQ8c3RyaW5nPjsgb3V0cHV0OiBTZXQ8c3RyaW5nPiB9PlxuICApOiB2b2lkIHtcbiAgICBpZiAobm9kZUlkID09PSBHUkFQSF9XT1JLRkxPV19CT1VOREFSWSkge1xuICAgICAgY29uc3QgcG9ydHMgPSBpc1NvdXJjZSA/IGlucHV0UG9ydHMgOiBvdXRwdXRQb3J0cztcbiAgICAgIGlmICghcG9ydHMuaGFzKHBvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBHcmFwaFBvcnRFcnJvcihcbiAgICAgICAgICBgVW5rbm93biAke2lzU291cmNlID8gXCJpbnB1dFwiIDogXCJvdXRwdXRcIn0gcG9ydCAnJHtwb3J0fScgb24gd29ya2Zsb3cgYm91bmRhcnlgLFxuICAgICAgICAgIHsgbm9kZUlkLCBwb3J0LCBpc1NvdXJjZSwgYXZhaWxhYmxlOiBBcnJheS5mcm9tKHBvcnRzKSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZVBvcnRzID0gbm9kZVBvcnRNYXAuZ2V0KG5vZGVJZCk7XG4gICAgaWYgKCFub2RlUG9ydHMpIHtcbiAgICAgIHRocm93IG5ldyBHcmFwaFRvcG9sb2d5RXJyb3IoYE5vIHBvcnQgbWFwIGZvciBub2RlICcke25vZGVJZH0nYCwge1xuICAgICAgICBub2RlSWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0cyA9IGlzU291cmNlID8gbm9kZVBvcnRzLm91dHB1dCA6IG5vZGVQb3J0cy5pbnB1dDtcbiAgICBpZiAoIXBvcnRzLmhhcyhwb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEdyYXBoUG9ydEVycm9yKFxuICAgICAgICBgVW5rbm93biAke2lzU291cmNlID8gXCJvdXRwdXRcIiA6IFwiaW5wdXRcIn0gcG9ydCAnJHtwb3J0fScgb24gbm9kZSAnJHtub2RlSWR9J2AsXG4gICAgICAgIHsgbm9kZUlkLCBwb3J0LCBpc1NvdXJjZSwgYXZhaWxhYmxlOiBBcnJheS5mcm9tKHBvcnRzKSB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHNldCBvZiBib3VuZGFyeSBhbGlhc2VzIGZvciBhIHdvcmtmbG93LlxuICAgKi9cbiAgcHJpdmF0ZSBib3VuZGFyeUFsaWFzZXMod29ya2Zsb3c6IEdyYXBoV29ya2Zsb3dEZWZpbml0aW9uKTogU2V0PHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgU2V0KFtcbiAgICAgIEdSQVBIX1dPUktGTE9XX0JPVU5EQVJZLFxuICAgICAgXCJ3b3JrZmxvd1wiLFxuICAgICAgXCJncmFwaFwiLFxuICAgICAgd29ya2Zsb3cubmFtZSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBwb3J0IG5hbWVzIGZyb20gYSBsaXN0IG9mIHBvcnQgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIHBvcnROYW1lcyhwb3J0czogR3JhcGhQb3J0RGVmaW5pdGlvbltdIHwgdW5kZWZpbmVkKTogU2V0PHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgU2V0KChwb3J0cyA/PyBbXSkubWFwKChwKSA9PiBwLm5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBtYXAgb2Ygbm9kZSBpZCAtPiB7IGlucHV0IHBvcnRzLCBvdXRwdXQgcG9ydHMgfS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROb2RlUG9ydE1hcChcbiAgICB3b3JrZmxvdzogR3JhcGhXb3JrZmxvd0RlZmluaXRpb25cbiAgKTogTWFwPHN0cmluZywgeyBpbnB1dDogU2V0PHN0cmluZz47IG91dHB1dDogU2V0PHN0cmluZz4gfT4ge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCB7IGlucHV0OiBTZXQ8c3RyaW5nPjsgb3V0cHV0OiBTZXQ8c3RyaW5nPiB9PigpO1xuICAgIGZvciAoY29uc3Qgbm9kZU1ldGEgb2Ygd29ya2Zsb3cubm9kZXMgPz8gW10pIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBjb25zdCBvdXRwdXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGNvbnN0IGRlZiA9IHRoaXMucmVzb2x2ZU5vZGVEZWZpbml0aW9uKG5vZGVNZXRhKTtcbiAgICAgIGlmIChkZWYpIHtcbiAgICAgICAgZm9yIChjb25zdCBwb3J0IG9mIGRlZi5wb3J0cyA/PyBbXSkge1xuICAgICAgICAgIGlmIChwb3J0LmRpcmVjdGlvbiA9PT0gXCJpbnB1dFwiKSBpbnB1dC5hZGQocG9ydC5uYW1lKTtcbiAgICAgICAgICBlbHNlIG91dHB1dC5hZGQocG9ydC5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWFwLnNldChub2RlTWV0YS5pZCwgeyBpbnB1dCwgb3V0cHV0IH0pO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIHJlc29sdmUgYSBub2RlJ3MgZnVsbCBkZWZpbml0aW9uIGZyb20gaXRzIG1ldGFkYXRhLlxuICAgKlxuICAgKiBBY2NlcHRzIGVpdGhlciBhIGRlY29yYXRlZCBNb2RlbCBjbGFzcy9pbnN0YW5jZSAocmVzb2x2ZWQgdmlhXG4gICAqIGBncmFwaERlZmluaXRpb25PZmApIG9yIGEgcGxhaW4gYEdyYXBoTm9kZURlZmluaXRpb25gLXNoYXBlZCBvYmplY3RcbiAgICogKHVzZWZ1bCBmb3Igc2VyaWFsaXplZCB3b3JrZmxvd3MgdGhhdCBpbmxpbmUgbm9kZSBkZWZpbml0aW9ucykuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVOb2RlRGVmaW5pdGlvbihcbiAgICBub2RlTWV0YTogeyBub2RlPzogdW5rbm93bjsga2luZD86IHN0cmluZyB9XG4gICk6IHsgcG9ydHM6IHsgZGlyZWN0aW9uOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10gfSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG5vZGVNZXRhLm5vZGUpIHtcbiAgICAgIGlmICh0aGlzLmlzUmF3RGVmaW5pdGlvbihub2RlTWV0YS5ub2RlKSkge1xuICAgICAgICByZXR1cm4gbm9kZU1ldGEubm9kZSBhcyB7XG4gICAgICAgICAgcG9ydHM6IHsgZGlyZWN0aW9uOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W107XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkZWYgPSBncmFwaERlZmluaXRpb25PZihub2RlTWV0YS5ub2RlIGFzIGFueSk7XG4gICAgICAgIHJldHVybiBkZWYgYXMgYW55O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgd2hlbiBhIHZhbHVlIGxvb2tzIGxpa2UgYSByYXcge0BsaW5rIEdyYXBoTm9kZURlZmluaXRpb259XG4gICAqIChhIHBsYWluIG9iamVjdCB3aXRoIGEgYHBvcnRzYCBhcnJheSBhbmQgYSBgbmFtZWAgc3RyaW5nKS5cbiAgICovXG4gIHByaXZhdGUgaXNSYXdEZWZpbml0aW9uKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgdHlwZW9mICh2YWx1ZSBhcyB7IG5hbWU/OiB1bmtub3duIH0pLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoKHZhbHVlIGFzIHsgcG9ydHM/OiB1bmtub3duIH0pLnBvcnRzKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHN0YWJsZSBlZGdlIGlkIGZyb20gaXRzIGVuZHBvaW50cyBhbmQgcG9ydHMuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUVkZ2VJZChcbiAgICBzb3VyY2VOb2RlSWQ6IHN0cmluZyxcbiAgICBzb3VyY2VQb3J0OiBzdHJpbmcsXG4gICAgdGFyZ2V0Tm9kZUlkOiBzdHJpbmcsXG4gICAgdGFyZ2V0UG9ydDogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3NvdXJjZU5vZGVJZH06JHtzb3VyY2VQb3J0fS0+JHt0YXJnZXROb2RlSWR9OiR7dGFyZ2V0UG9ydH1gO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Topology utility for traversing the execution plan's edges.
3
+ */
4
+ export class GraphTopology {
5
+ /**
6
+ * Returns the set of upstream node ids reachable from `nodeId` by following
7
+ * incoming edges. The workflow boundary node is excluded.
8
+ */
9
+ static upstreamNodes(nodeId, incomingByNode, includeBoundary = false) {
10
+ const visited = new Set();
11
+ const stack = [nodeId];
12
+ while (stack.length) {
13
+ const current = stack.pop();
14
+ const incoming = incomingByNode.get(current) ?? [];
15
+ for (const edge of incoming) {
16
+ if (!includeBoundary && this.isBoundary(edge.sourceNodeId))
17
+ continue;
18
+ if (!visited.has(edge.sourceNodeId)) {
19
+ visited.add(edge.sourceNodeId);
20
+ stack.push(edge.sourceNodeId);
21
+ }
22
+ }
23
+ }
24
+ return visited;
25
+ }
26
+ /**
27
+ * Returns the set of downstream node ids reachable from `nodeId` by following
28
+ * outgoing edges. The workflow boundary node is excluded.
29
+ */
30
+ static downstreamNodes(nodeId, outgoingByNode, includeBoundary = false) {
31
+ const visited = new Set();
32
+ const stack = [nodeId];
33
+ while (stack.length) {
34
+ const current = stack.pop();
35
+ const outgoing = outgoingByNode.get(current) ?? [];
36
+ for (const edge of outgoing) {
37
+ if (!includeBoundary && this.isBoundary(edge.targetNodeId))
38
+ continue;
39
+ if (!visited.has(edge.targetNodeId)) {
40
+ visited.add(edge.targetNodeId);
41
+ stack.push(edge.targetNodeId);
42
+ }
43
+ }
44
+ }
45
+ return visited;
46
+ }
47
+ /** Returns whether a node id is the workflow boundary. */
48
+ static isBoundary(nodeId) {
49
+ return nodeId === "$workflow";
50
+ }
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhUb3BvbG9neS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9ncmFwaC9lbmdpbmUvcGxhbm5pbmcvR3JhcGhUb3BvbG9neS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQTs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ3hCOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxhQUFhLENBQ2xCLE1BQWMsRUFDZCxjQUFxRCxFQUNyRCxlQUFlLEdBQUcsS0FBSztRQUV2QixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2xDLE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRyxDQUFDO1lBQzdCLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25ELEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO29CQUFFLFNBQVM7Z0JBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDL0IsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2hDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUNwQixNQUFjLEVBQ2QsY0FBcUQsRUFDckQsZUFBZSxHQUFHLEtBQUs7UUFFdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNsQyxNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUcsQ0FBQztZQUM3QixNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztvQkFBRSxTQUFTO2dCQUNyRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNoQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsMERBQTBEO0lBQzFELE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBYztRQUM5QixPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUM7SUFDaEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9wbGFubmluZy9HcmFwaFRvcG9sb2d5XG4gKiBAc3VtbWFyeSBVdGlsaXR5IGhlbHBlcnMgZm9yIGdyYXBoIHRvcG9sb2d5IGFuYWx5c2lzLlxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBieSB0aGUgcGxhbm5lciBhbmQgcGlubmluZyBkZXBlbmRlbmN5IHJlc29sdmVyLlxuICovXG5pbXBvcnQgdHlwZSB7IEdyYXBoRXhlY3V0aW9uUGxhbkVkZ2UgfSBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvblBsYW5FZGdlXCI7XG5cbi8qKlxuICogVG9wb2xvZ3kgdXRpbGl0eSBmb3IgdHJhdmVyc2luZyB0aGUgZXhlY3V0aW9uIHBsYW4ncyBlZGdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoVG9wb2xvZ3kge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2V0IG9mIHVwc3RyZWFtIG5vZGUgaWRzIHJlYWNoYWJsZSBmcm9tIGBub2RlSWRgIGJ5IGZvbGxvd2luZ1xuICAgKiBpbmNvbWluZyBlZGdlcy4gVGhlIHdvcmtmbG93IGJvdW5kYXJ5IG5vZGUgaXMgZXhjbHVkZWQuXG4gICAqL1xuICBzdGF0aWMgdXBzdHJlYW1Ob2RlcyhcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICBpbmNvbWluZ0J5Tm9kZTogTWFwPHN0cmluZywgR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdPixcbiAgICBpbmNsdWRlQm91bmRhcnkgPSBmYWxzZVxuICApOiBTZXQ8c3RyaW5nPiB7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHN0YWNrID0gW25vZGVJZF07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHN0YWNrLnBvcCgpITtcbiAgICAgIGNvbnN0IGluY29taW5nID0gaW5jb21pbmdCeU5vZGUuZ2V0KGN1cnJlbnQpID8/IFtdO1xuICAgICAgZm9yIChjb25zdCBlZGdlIG9mIGluY29taW5nKSB7XG4gICAgICAgIGlmICghaW5jbHVkZUJvdW5kYXJ5ICYmIHRoaXMuaXNCb3VuZGFyeShlZGdlLnNvdXJjZU5vZGVJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKGVkZ2Uuc291cmNlTm9kZUlkKSkge1xuICAgICAgICAgIHZpc2l0ZWQuYWRkKGVkZ2Uuc291cmNlTm9kZUlkKTtcbiAgICAgICAgICBzdGFjay5wdXNoKGVkZ2Uuc291cmNlTm9kZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmlzaXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgZG93bnN0cmVhbSBub2RlIGlkcyByZWFjaGFibGUgZnJvbSBgbm9kZUlkYCBieSBmb2xsb3dpbmdcbiAgICogb3V0Z29pbmcgZWRnZXMuIFRoZSB3b3JrZmxvdyBib3VuZGFyeSBub2RlIGlzIGV4Y2x1ZGVkLlxuICAgKi9cbiAgc3RhdGljIGRvd25zdHJlYW1Ob2RlcyhcbiAgICBub2RlSWQ6IHN0cmluZyxcbiAgICBvdXRnb2luZ0J5Tm9kZTogTWFwPHN0cmluZywgR3JhcGhFeGVjdXRpb25QbGFuRWRnZVtdPixcbiAgICBpbmNsdWRlQm91bmRhcnkgPSBmYWxzZVxuICApOiBTZXQ8c3RyaW5nPiB7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHN0YWNrID0gW25vZGVJZF07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHN0YWNrLnBvcCgpITtcbiAgICAgIGNvbnN0IG91dGdvaW5nID0gb3V0Z29pbmdCeU5vZGUuZ2V0KGN1cnJlbnQpID8/IFtdO1xuICAgICAgZm9yIChjb25zdCBlZGdlIG9mIG91dGdvaW5nKSB7XG4gICAgICAgIGlmICghaW5jbHVkZUJvdW5kYXJ5ICYmIHRoaXMuaXNCb3VuZGFyeShlZGdlLnRhcmdldE5vZGVJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKGVkZ2UudGFyZ2V0Tm9kZUlkKSkge1xuICAgICAgICAgIHZpc2l0ZWQuYWRkKGVkZ2UudGFyZ2V0Tm9kZUlkKTtcbiAgICAgICAgICBzdGFjay5wdXNoKGVkZ2UudGFyZ2V0Tm9kZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmlzaXRlZDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHdoZXRoZXIgYSBub2RlIGlkIGlzIHRoZSB3b3JrZmxvdyBib3VuZGFyeS4gKi9cbiAgc3RhdGljIGlzQm91bmRhcnkobm9kZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbm9kZUlkID09PSBcIiR3b3JrZmxvd1wiO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @module integrations/graph/planning
3
+ * @summary Graph execution planning.
4
+ * @description Re-exports the execution plan types, relation resolver, and topological planner.
5
+ */
6
+ export * from "./GraphExecutionPlanNode.js";
7
+ export * from "./GraphExecutionPlanEdge.js";
8
+ export * from "./GraphExecutionPlanLayer.js";
9
+ export * from "./GraphExecutionPlan.js";
10
+ export * from "./GraphRelationResolver.js";
11
+ export * from "./GraphExecutionPlanner.js";
12
+ export * from "./GraphTopology.js";
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZ3JhcGgvZW5naW5lL3BsYW5uaW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCw0Q0FBeUM7QUFDekMsNENBQXlDO0FBQ3pDLDZDQUEwQztBQUMxQyx3Q0FBcUM7QUFDckMsMkNBQXdDO0FBQ3hDLDJDQUF3QztBQUN4QyxtQ0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2dyYXBoL3BsYW5uaW5nXG4gKiBAc3VtbWFyeSBHcmFwaCBleGVjdXRpb24gcGxhbm5pbmcuXG4gKiBAZGVzY3JpcHRpb24gUmUtZXhwb3J0cyB0aGUgZXhlY3V0aW9uIHBsYW4gdHlwZXMsIHJlbGF0aW9uIHJlc29sdmVyLCBhbmQgdG9wb2xvZ2ljYWwgcGxhbm5lci5cbiAqL1xuZXhwb3J0ICogZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25QbGFuTm9kZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25QbGFuRWRnZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vR3JhcGhFeGVjdXRpb25QbGFuTGF5ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0dyYXBoRXhlY3V0aW9uUGxhblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vR3JhcGhSZWxhdGlvblJlc29sdmVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9HcmFwaEV4ZWN1dGlvblBsYW5uZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0dyYXBoVG9wb2xvZ3lcIjtcbiJdfQ==
@@ -0,0 +1,39 @@
1
+ import { GraphExecutionError } from "./../errors/GraphExecutionError.js";
2
+ /**
3
+ * Registry that maps node `kind` strings to {@link GraphNodeExecutor}
4
+ * instances.
5
+ */
6
+ export class GraphNodeExecutorRegistry {
7
+ constructor() {
8
+ this.executors = new Map();
9
+ }
10
+ /** Registers an executor for the given node kind. */
11
+ register(kind, executor) {
12
+ if (!kind)
13
+ throw new GraphExecutionError("Graph executor kind is required");
14
+ this.executors.set(kind, executor);
15
+ return this;
16
+ }
17
+ /** Removes the executor for the given node kind. */
18
+ unregister(kind) {
19
+ this.executors.delete(kind);
20
+ return this;
21
+ }
22
+ /** Returns whether an executor is registered for the given kind. */
23
+ has(kind) {
24
+ return this.executors.has(kind);
25
+ }
26
+ /**
27
+ * Resolves the executor for the given node kind.
28
+ *
29
+ * @throws {GraphExecutionError} when no executor is registered for `kind`.
30
+ */
31
+ resolve(kind) {
32
+ const executor = this.executors.get(kind);
33
+ if (!executor) {
34
+ throw new GraphExecutionError(`No graph executor registered for kind '${kind}'`, "GRAPH_EXECUTOR_NOT_FOUND", { kind });
35
+ }
36
+ return executor;
37
+ }
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhOb2RlRXhlY3V0b3JSZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9ncmFwaC9lbmdpbmUvcmVnaXN0cnkvR3JhcGhOb2RlRXhlY3V0b3JSZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsMkNBQXNDO0FBRXBFOzs7R0FHRztBQUNILE1BQU0sT0FBTyx5QkFBeUI7SUFBdEM7UUFDbUIsY0FBUyxHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0lBb0NwRSxDQUFDO0lBbENDLHFEQUFxRDtJQUNyRCxRQUFRLENBQUMsSUFBWSxFQUFFLFFBQTJCO1FBQ2hELElBQUksQ0FBQyxJQUFJO1lBQUUsTUFBTSxJQUFJLG1CQUFtQixDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxVQUFVLENBQUMsSUFBWTtRQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxvRUFBb0U7SUFDcEUsR0FBRyxDQUFDLElBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLElBQVk7UUFDbEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLG1CQUFtQixDQUMzQiwwQ0FBMEMsSUFBSSxHQUFHLEVBQ2pELDBCQUEwQixFQUMxQixFQUFFLElBQUksRUFBRSxDQUNULENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9yZWdpc3RyeS9HcmFwaE5vZGVFeGVjdXRvclJlZ2lzdHJ5XG4gKiBAc3VtbWFyeSBSZWdpc3RyeSBmb3IgZ3JhcGggbm9kZSBleGVjdXRvcnMuXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBub2RlIGtpbmRzIHRvIHRoZWlyIGV4ZWN1dG9yIGltcGxlbWVudGF0aW9ucy4gVGhlIGVuZ2luZSByZXNvbHZlcyBleGVjdXRvcnMgYnkgbm9kZSBraW5kIGF0IGV4ZWN1dGlvbiB0aW1lLlxuICovXG5pbXBvcnQgdHlwZSB7IEdyYXBoTm9kZUV4ZWN1dG9yIH0gZnJvbSBcIi4uL2V4ZWN1dGlvbi9HcmFwaE5vZGVFeGVjdXRvclwiO1xuaW1wb3J0IHsgR3JhcGhFeGVjdXRpb25FcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvR3JhcGhFeGVjdXRpb25FcnJvclwiO1xuXG4vKipcbiAqIFJlZ2lzdHJ5IHRoYXQgbWFwcyBub2RlIGBraW5kYCBzdHJpbmdzIHRvIHtAbGluayBHcmFwaE5vZGVFeGVjdXRvcn1cbiAqIGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoTm9kZUV4ZWN1dG9yUmVnaXN0cnkge1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dG9ycyA9IG5ldyBNYXA8c3RyaW5nLCBHcmFwaE5vZGVFeGVjdXRvcj4oKTtcblxuICAvKiogUmVnaXN0ZXJzIGFuIGV4ZWN1dG9yIGZvciB0aGUgZ2l2ZW4gbm9kZSBraW5kLiAqL1xuICByZWdpc3RlcihraW5kOiBzdHJpbmcsIGV4ZWN1dG9yOiBHcmFwaE5vZGVFeGVjdXRvcik6IHRoaXMge1xuICAgIGlmICgha2luZCkgdGhyb3cgbmV3IEdyYXBoRXhlY3V0aW9uRXJyb3IoXCJHcmFwaCBleGVjdXRvciBraW5kIGlzIHJlcXVpcmVkXCIpO1xuICAgIHRoaXMuZXhlY3V0b3JzLnNldChraW5kLCBleGVjdXRvcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogUmVtb3ZlcyB0aGUgZXhlY3V0b3IgZm9yIHRoZSBnaXZlbiBub2RlIGtpbmQuICovXG4gIHVucmVnaXN0ZXIoa2luZDogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5leGVjdXRvcnMuZGVsZXRlKGtpbmQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIFJldHVybnMgd2hldGhlciBhbiBleGVjdXRvciBpcyByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4ga2luZC4gKi9cbiAgaGFzKGtpbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dG9ycy5oYXMoa2luZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGV4ZWN1dG9yIGZvciB0aGUgZ2l2ZW4gbm9kZSBraW5kLlxuICAgKlxuICAgKiBAdGhyb3dzIHtHcmFwaEV4ZWN1dGlvbkVycm9yfSB3aGVuIG5vIGV4ZWN1dG9yIGlzIHJlZ2lzdGVyZWQgZm9yIGBraW5kYC5cbiAgICovXG4gIHJlc29sdmUoa2luZDogc3RyaW5nKTogR3JhcGhOb2RlRXhlY3V0b3Ige1xuICAgIGNvbnN0IGV4ZWN1dG9yID0gdGhpcy5leGVjdXRvcnMuZ2V0KGtpbmQpO1xuICAgIGlmICghZXhlY3V0b3IpIHtcbiAgICAgIHRocm93IG5ldyBHcmFwaEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBgTm8gZ3JhcGggZXhlY3V0b3IgcmVnaXN0ZXJlZCBmb3Iga2luZCAnJHtraW5kfSdgLFxuICAgICAgICBcIkdSQVBIX0VYRUNVVE9SX05PVF9GT1VORFwiLFxuICAgICAgICB7IGtpbmQgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4ZWN1dG9yO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Resolver that wraps a {@link GraphNodeExecutorRegistry} and optionally
3
+ * falls back to a default executor when a kind is not found.
4
+ */
5
+ export class GraphNodeExecutorResolver {
6
+ constructor(registry, defaultExecutor) {
7
+ this.registry = registry;
8
+ this.defaultExecutor = defaultExecutor;
9
+ }
10
+ /**
11
+ * Resolves the executor for `kind`, falling back to the default executor
12
+ * when provided.
13
+ */
14
+ resolve(kind) {
15
+ if (this.registry.has(kind))
16
+ return this.registry.resolve(kind);
17
+ if (this.defaultExecutor)
18
+ return this.defaultExecutor;
19
+ return this.registry.resolve(kind);
20
+ }
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhOb2RlRXhlY3V0b3JSZXNvbHZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9ncmFwaC9lbmdpbmUvcmVnaXN0cnkvR3JhcGhOb2RlRXhlY3V0b3JSZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8seUJBQXlCO0lBR3BDLFlBQ21CLFFBQW1DLEVBQ3BELGVBQW1DO1FBRGxCLGFBQVEsR0FBUixRQUFRLENBQTJCO1FBR3BELElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPLENBQUMsSUFBWTtRQUNsQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxJQUFJLENBQUMsZUFBZTtZQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnMvZ3JhcGgvcmVnaXN0cnkvR3JhcGhOb2RlRXhlY3V0b3JSZXNvbHZlclxuICogQHN1bW1hcnkgVXRpbGl0eSBmb3IgcmVzb2x2aW5nIGV4ZWN1dG9ycyBmcm9tIGEgcmVnaXN0cnkgd2l0aCBmYWxsYmFjay5cbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBhIGhlbHBlciB0aGF0IGF0dGVtcHRzIHRvIHJlc29sdmUgYW4gZXhlY3V0b3IgYnkga2luZCwgZmFsbGluZyBiYWNrIHRvIGEgZGVmYXVsdCBleGVjdXRvciB3aGVuIHRoZSBraW5kIGlzIG5vdCByZWdpc3RlcmVkLlxuICovXG5pbXBvcnQgdHlwZSB7IEdyYXBoTm9kZUV4ZWN1dG9yIH0gZnJvbSBcIi4uL2V4ZWN1dGlvbi9HcmFwaE5vZGVFeGVjdXRvclwiO1xuaW1wb3J0IHR5cGUgeyBHcmFwaE5vZGVFeGVjdXRvclJlZ2lzdHJ5IH0gZnJvbSBcIi4vR3JhcGhOb2RlRXhlY3V0b3JSZWdpc3RyeVwiO1xuXG4vKipcbiAqIFJlc29sdmVyIHRoYXQgd3JhcHMgYSB7QGxpbmsgR3JhcGhOb2RlRXhlY3V0b3JSZWdpc3RyeX0gYW5kIG9wdGlvbmFsbHlcbiAqIGZhbGxzIGJhY2sgdG8gYSBkZWZhdWx0IGV4ZWN1dG9yIHdoZW4gYSBraW5kIGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoTm9kZUV4ZWN1dG9yUmVzb2x2ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRFeGVjdXRvcj86IEdyYXBoTm9kZUV4ZWN1dG9yO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnk6IEdyYXBoTm9kZUV4ZWN1dG9yUmVnaXN0cnksXG4gICAgZGVmYXVsdEV4ZWN1dG9yPzogR3JhcGhOb2RlRXhlY3V0b3JcbiAgKSB7XG4gICAgdGhpcy5kZWZhdWx0RXhlY3V0b3IgPSBkZWZhdWx0RXhlY3V0b3I7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGV4ZWN1dG9yIGZvciBga2luZGAsIGZhbGxpbmcgYmFjayB0byB0aGUgZGVmYXVsdCBleGVjdXRvclxuICAgKiB3aGVuIHByb3ZpZGVkLlxuICAgKi9cbiAgcmVzb2x2ZShraW5kOiBzdHJpbmcpOiBHcmFwaE5vZGVFeGVjdXRvciB7XG4gICAgaWYgKHRoaXMucmVnaXN0cnkuaGFzKGtpbmQpKSByZXR1cm4gdGhpcy5yZWdpc3RyeS5yZXNvbHZlKGtpbmQpO1xuICAgIGlmICh0aGlzLmRlZmF1bHRFeGVjdXRvcikgcmV0dXJuIHRoaXMuZGVmYXVsdEV4ZWN1dG9yO1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUoa2luZCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @module integrations/graph/registry
3
+ * @summary Graph node executor registry and resolver.
4
+ * @description Re-exports the executor registry and resolver.
5
+ */
6
+ export * from "./GraphNodeExecutorRegistry.js";
7
+ export * from "./GraphNodeExecutorResolver.js";
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZ3JhcGgvZW5naW5lL3JlZ2lzdHJ5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCwrQ0FBNEM7QUFDNUMsK0NBQTRDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9ncmFwaC9yZWdpc3RyeVxuICogQHN1bW1hcnkgR3JhcGggbm9kZSBleGVjdXRvciByZWdpc3RyeSBhbmQgcmVzb2x2ZXIuXG4gKiBAZGVzY3JpcHRpb24gUmUtZXhwb3J0cyB0aGUgZXhlY3V0b3IgcmVnaXN0cnkgYW5kIHJlc29sdmVyLlxuICovXG5leHBvcnQgKiBmcm9tIFwiLi9HcmFwaE5vZGVFeGVjdXRvclJlZ2lzdHJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9HcmFwaE5vZGVFeGVjdXRvclJlc29sdmVyXCI7XG4iXX0=
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @module integrations/graph/snapshots/GraphExecutionSnapshotMapper
3
+ * @summary Maps execution results to snapshot patches.
4
+ * @description Produces a GraphExecutionSnapshotPatch consumable by `@decaf-ts/ui-decorators/graph` snapshots, rather than replacing the snapshot system.
5
+ */
6
+ import { GraphExecutionStatus } from "./../../shared/constants.js";
7
+ /**
8
+ * Maps a {@link GraphExecutionResult} to a {@link GraphExecutionSnapshotPatch}.
9
+ */
10
+ export class GraphExecutionSnapshotMapper {
11
+ /**
12
+ * Creates a snapshot patch from an execution result.
13
+ */
14
+ map(result) {
15
+ const nodes = {};
16
+ for (const [id, nodeResult] of Object.entries(result.nodeResults)) {
17
+ nodes[id] = {
18
+ status: nodeResult.status,
19
+ startedAt: nodeResult.startedAt?.toISOString(),
20
+ finishedAt: nodeResult.finishedAt?.toISOString(),
21
+ error: nodeResult.error,
22
+ outputs: nodeResult.outputs,
23
+ fromCache: nodeResult.fromCache,
24
+ pinned: nodeResult.pinned,
25
+ };
26
+ }
27
+ const edges = {};
28
+ for (const event of result.events) {
29
+ if (event.edgeId && event.type === "edge.valueRouted") {
30
+ edges[event.edgeId] = {
31
+ status: GraphExecutionStatus.SUCCEEDED,
32
+ lastValue: event.payload?.value,
33
+ updatedAt: event.timestamp.toISOString(),
34
+ };
35
+ }
36
+ }
37
+ const events = [...result.events];
38
+ return {
39
+ runId: result.runId,
40
+ status: result.status,
41
+ nodes,
42
+ edges,
43
+ outputs: result.outputs,
44
+ events,
45
+ };
46
+ }
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFeGVjdXRpb25TbmFwc2hvdE1hcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9ncmFwaC9lbmdpbmUvc25hcHNob3RzL0dyYXBoRXhlY3V0aW9uU25hcHNob3RNYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUNILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQ0FBK0I7QUFPOUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sNEJBQTRCO0lBQ3ZDOztPQUVHO0lBQ0gsR0FBRyxDQUFDLE1BQTRCO1FBQzlCLE1BQU0sS0FBSyxHQUF5QyxFQUFFLENBQUM7UUFDdkQsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDbEUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHO2dCQUNWLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtnQkFDekIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFO2dCQUM5QyxVQUFVLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUU7Z0JBQ2hELEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztnQkFDdkIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPO2dCQUMzQixTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7Z0JBQy9CLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTthQUMxQixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sS0FBSyxHQUF5QyxFQUFFLENBQUM7UUFDdkQsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEMsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztnQkFDdEQsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRztvQkFDcEIsTUFBTSxFQUFFLG9CQUFvQixDQUFDLFNBQVM7b0JBQ3RDLFNBQVMsRUFBRyxLQUFLLENBQUMsT0FBZSxFQUFFLEtBQUs7b0JBQ3hDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtpQkFDekMsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQTBCLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFekQsT0FBTztZQUNMLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDckIsS0FBSztZQUNMLEtBQUs7WUFDTCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsTUFBTTtTQUNQLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL2dyYXBoL3NuYXBzaG90cy9HcmFwaEV4ZWN1dGlvblNuYXBzaG90TWFwcGVyXG4gKiBAc3VtbWFyeSBNYXBzIGV4ZWN1dGlvbiByZXN1bHRzIHRvIHNuYXBzaG90IHBhdGNoZXMuXG4gKiBAZGVzY3JpcHRpb24gUHJvZHVjZXMgYSBHcmFwaEV4ZWN1dGlvblNuYXBzaG90UGF0Y2ggY29uc3VtYWJsZSBieSBgQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMvZ3JhcGhgIHNuYXBzaG90cywgcmF0aGVyIHRoYW4gcmVwbGFjaW5nIHRoZSBzbmFwc2hvdCBzeXN0ZW0uXG4gKi9cbmltcG9ydCB7IEdyYXBoRXhlY3V0aW9uU3RhdHVzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgR3JhcGhFeGVjdXRpb25FdmVudCxcbiAgR3JhcGhFeGVjdXRpb25SZXN1bHQsXG4gIEdyYXBoRXhlY3V0aW9uU25hcHNob3RQYXRjaCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogTWFwcyBhIHtAbGluayBHcmFwaEV4ZWN1dGlvblJlc3VsdH0gdG8gYSB7QGxpbmsgR3JhcGhFeGVjdXRpb25TbmFwc2hvdFBhdGNofS5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoRXhlY3V0aW9uU25hcHNob3RNYXBwZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHNuYXBzaG90IHBhdGNoIGZyb20gYW4gZXhlY3V0aW9uIHJlc3VsdC5cbiAgICovXG4gIG1hcChyZXN1bHQ6IEdyYXBoRXhlY3V0aW9uUmVzdWx0KTogR3JhcGhFeGVjdXRpb25TbmFwc2hvdFBhdGNoIHtcbiAgICBjb25zdCBub2RlczogR3JhcGhFeGVjdXRpb25TbmFwc2hvdFBhdGNoW1wibm9kZXNcIl0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtpZCwgbm9kZVJlc3VsdF0gb2YgT2JqZWN0LmVudHJpZXMocmVzdWx0Lm5vZGVSZXN1bHRzKSkge1xuICAgICAgbm9kZXNbaWRdID0ge1xuICAgICAgICBzdGF0dXM6IG5vZGVSZXN1bHQuc3RhdHVzLFxuICAgICAgICBzdGFydGVkQXQ6IG5vZGVSZXN1bHQuc3RhcnRlZEF0Py50b0lTT1N0cmluZygpLFxuICAgICAgICBmaW5pc2hlZEF0OiBub2RlUmVzdWx0LmZpbmlzaGVkQXQ/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGVycm9yOiBub2RlUmVzdWx0LmVycm9yLFxuICAgICAgICBvdXRwdXRzOiBub2RlUmVzdWx0Lm91dHB1dHMsXG4gICAgICAgIGZyb21DYWNoZTogbm9kZVJlc3VsdC5mcm9tQ2FjaGUsXG4gICAgICAgIHBpbm5lZDogbm9kZVJlc3VsdC5waW5uZWQsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGVkZ2VzOiBHcmFwaEV4ZWN1dGlvblNuYXBzaG90UGF0Y2hbXCJlZGdlc1wiXSA9IHt9O1xuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgcmVzdWx0LmV2ZW50cykge1xuICAgICAgaWYgKGV2ZW50LmVkZ2VJZCAmJiBldmVudC50eXBlID09PSBcImVkZ2UudmFsdWVSb3V0ZWRcIikge1xuICAgICAgICBlZGdlc1tldmVudC5lZGdlSWRdID0ge1xuICAgICAgICAgIHN0YXR1czogR3JhcGhFeGVjdXRpb25TdGF0dXMuU1VDQ0VFREVELFxuICAgICAgICAgIGxhc3RWYWx1ZTogKGV2ZW50LnBheWxvYWQgYXMgYW55KT8udmFsdWUsXG4gICAgICAgICAgdXBkYXRlZEF0OiBldmVudC50aW1lc3RhbXAudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBldmVudHM6IEdyYXBoRXhlY3V0aW9uRXZlbnRbXSA9IFsuLi5yZXN1bHQuZXZlbnRzXTtcblxuICAgIHJldHVybiB7XG4gICAgICBydW5JZDogcmVzdWx0LnJ1bklkLFxuICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgbm9kZXMsXG4gICAgICBlZGdlcyxcbiAgICAgIG91dHB1dHM6IHJlc3VsdC5vdXRwdXRzLFxuICAgICAgZXZlbnRzLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==